aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanos Guljas <janos@resenje.org>2018-02-09 19:23:30 +0800
committerJanos Guljas <janos@resenje.org>2018-02-22 21:23:17 +0800
commita3a07350dcef0ba39829a20d8ddba4bd3463d293 (patch)
tree100f2515cadd92105537a12e6981fab2193435ee
parent820cf09c98706f71d4b02b6c25e62db15830f3fb (diff)
parent1a4e68721a901e86322631fed1191025a6d14c52 (diff)
downloaddexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar
dexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.gz
dexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.bz2
dexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.lz
dexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.xz
dexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.zst
dexon-a3a07350dcef0ba39829a20d8ddba4bd3463d293.zip
swarm, cmd/swarm: Merge branch 'master' into multiple-ens-endpoints
-rw-r--r--.github/CONTRIBUTING.md2
-rw-r--r--.gitignore3
-rw-r--r--.travis.yml9
-rw-r--r--Makefile6
-rw-r--r--accounts/abi/abi.go59
-rw-r--r--accounts/abi/abi_test.go286
-rw-r--r--accounts/abi/argument.go207
-rw-r--r--accounts/abi/bind/backend.go29
-rw-r--r--accounts/abi/bind/backends/simulated.go169
-rw-r--r--accounts/abi/bind/base.go125
-rw-r--r--accounts/abi/bind/bind.go96
-rw-r--r--accounts/abi/bind/bind_test.go294
-rw-r--r--accounts/abi/bind/template.go169
-rw-r--r--accounts/abi/bind/topics.go189
-rw-r--r--accounts/abi/bind/util_test.go6
-rw-r--r--accounts/abi/event.go104
-rw-r--r--accounts/abi/event_test.go260
-rw-r--r--accounts/abi/method.go150
-rw-r--r--accounts/abi/pack.go3
-rw-r--r--accounts/abi/reflect.go25
-rw-r--r--accounts/abi/type.go114
-rw-r--r--accounts/abi/unpack.go24
-rw-r--r--accounts/abi/unpack_test.go199
-rw-r--r--accounts/errors.go2
-rw-r--r--accounts/keystore/presale.go3
-rw-r--r--accounts/usbwallet/internal/trezor/messages.proto2
-rw-r--r--accounts/usbwallet/internal/trezor/trezor.go2
-rw-r--r--accounts/usbwallet/internal/trezor/types.proto2
-rw-r--r--accounts/usbwallet/trezor.go2
-rw-r--r--appveyor.yml4
-rw-r--r--build/ci.go35
-rw-r--r--cmd/bootnode/main.go25
-rw-r--r--cmd/ethkey/README.md41
-rw-r--r--cmd/ethkey/generate.go118
-rw-r--r--cmd/ethkey/inspect.go75
-rw-r--r--cmd/ethkey/main.go67
-rw-r--r--cmd/ethkey/message.go159
-rw-r--r--cmd/ethkey/message_test.go70
-rw-r--r--cmd/ethkey/run_test.go54
-rw-r--r--cmd/ethkey/utils.go83
-rw-r--r--cmd/evm/json_logger.go10
-rw-r--r--cmd/evm/runner.go4
-rw-r--r--cmd/faucet/faucet.go11
-rw-r--r--cmd/faucet/website.go25
-rw-r--r--cmd/geth/chaincmd.go4
-rw-r--r--cmd/geth/config.go19
-rw-r--r--cmd/geth/consolecmd.go8
-rw-r--r--cmd/geth/main.go8
-rw-r--r--cmd/geth/misccmd.go3
-rw-r--r--cmd/geth/usage.go6
-rw-r--r--cmd/puppeth/genesis.go38
-rw-r--r--cmd/puppeth/module_faucet.go2
-rw-r--r--cmd/swarm/config.go2
-rw-r--r--cmd/utils/cmd.go26
-rw-r--r--cmd/utils/flags.go106
-rw-r--r--cmd/wnode/main.go4
-rw-r--r--common/bitutil/bitutil.go8
-rw-r--r--common/fdlimit/fdlimit_freebsd.go (renamed from cmd/utils/fdlimit_freebsd.go)20
-rw-r--r--common/fdlimit/fdlimit_test.go (renamed from cmd/utils/fdlimit_test.go)20
-rw-r--r--common/fdlimit/fdlimit_unix.go (renamed from cmd/utils/fdlimit_unix.go)20
-rw-r--r--common/fdlimit/fdlimit_windows.go (renamed from cmd/utils/fdlimit_windows.go)18
-rw-r--r--common/size.go27
-rw-r--r--consensus/clique/clique.go28
-rw-r--r--consensus/consensus.go5
-rw-r--r--consensus/errors.go4
-rw-r--r--consensus/ethash/algorithm.go6
-rw-r--r--consensus/ethash/algorithm_go1.7.go4
-rw-r--r--consensus/ethash/algorithm_go1.8.go34
-rw-r--r--consensus/ethash/algorithm_go1.8_test.go23
-rw-r--r--consensus/ethash/algorithm_test.go4
-rw-r--r--consensus/ethash/consensus.go66
-rw-r--r--consensus/ethash/consensus_test.go1
-rw-r--r--consensus/ethash/ethash.go288
-rw-r--r--consensus/ethash/ethash_test.go39
-rw-r--r--consensus/ethash/sealer.go17
-rw-r--r--console/console.go5
-rw-r--r--console/prompter.go3
-rw-r--r--containers/docker/develop-alpine/Dockerfile2
-rw-r--r--containers/docker/develop-ubuntu/Dockerfile6
-rw-r--r--containers/docker/master-alpine/Dockerfile2
-rw-r--r--containers/docker/master-ubuntu/Dockerfile6
-rw-r--r--contracts/chequebook/cheque.go6
-rw-r--r--contracts/chequebook/contract/chequebook.go418
-rw-r--r--contracts/chequebook/contract/chequebook.sol10
-rw-r--r--contracts/chequebook/contract/code.go2
-rw-r--r--contracts/chequebook/contract/mortal.sol10
-rw-r--r--contracts/chequebook/contract/owned.sol15
-rw-r--r--contracts/chequebook/gencode.go9
-rw-r--r--contracts/ens/contract/AbstractENS.sol23
-rw-r--r--contracts/ens/contract/ENS.sol94
-rw-r--r--contracts/ens/contract/FIFSRegistrar.sol39
-rw-r--r--contracts/ens/contract/PublicResolver.sol212
-rw-r--r--contracts/ens/contract/ens.go1086
-rw-r--r--contracts/ens/contract/ens.sol226
-rw-r--r--contracts/ens/contract/fifsregistrar.go195
-rw-r--r--contracts/ens/contract/publicresolver.go1321
-rw-r--r--contracts/ens/ens.go37
-rw-r--r--contracts/ens/ens_test.go28
-rw-r--r--contracts/release/contract.go432
-rw-r--r--contracts/release/contract.sol249
-rw-r--r--contracts/release/contract_test.go374
-rw-r--r--contracts/release/release.go164
-rw-r--r--core/bench_test.go15
-rw-r--r--core/block_validator.go45
-rw-r--r--core/block_validator_test.go14
-rw-r--r--core/blockchain.go379
-rw-r--r--core/blockchain_test.go279
-rw-r--r--core/chain_indexer.go3
-rw-r--r--core/chain_makers.go82
-rw-r--r--core/chain_makers_test.go10
-rw-r--r--core/dao_test.go38
-rw-r--r--core/database_util_test.go14
-rw-r--r--core/evm.go2
-rw-r--r--core/gaspool.go34
-rw-r--r--core/gen_genesis.go6
-rw-r--r--core/gen_genesis_account.go8
-rw-r--r--core/genesis.go28
-rw-r--r--core/genesis_test.go6
-rw-r--r--core/state/database.go51
-rw-r--r--core/state/iterator_test.go17
-rw-r--r--core/state/journal.go2
-rw-r--r--core/state/state_object.go5
-rw-r--r--core/state/state_test.go6
-rw-r--r--core/state/statedb.go55
-rw-r--r--core/state/statedb_test.go18
-rw-r--r--core/state/sync_test.go44
-rw-r--r--core/state_processor.go34
-rw-r--r--core/state_transition.go131
-rw-r--r--core/tx_list.go13
-rw-r--r--core/tx_list_test.go3
-rw-r--r--core/tx_pool.go21
-rw-r--r--core/tx_pool_test.go285
-rw-r--r--core/types.go6
-rw-r--r--core/types/block.go27
-rw-r--r--core/types/block_test.go6
-rw-r--r--core/types/gen_header_json.go22
-rw-r--r--core/types/gen_log_json.go6
-rw-r--r--core/types/gen_receipt_json.go23
-rw-r--r--core/types/gen_tx_json.go14
-rw-r--r--core/types/receipt.go40
-rw-r--r--core/types/transaction.go69
-rw-r--r--core/types/transaction_signing_test.go8
-rw-r--r--core/types/transaction_test.go10
-rw-r--r--core/vm/evm.go45
-rw-r--r--core/vm/gas_table.go6
-rw-r--r--core/vm/gen_structlog.go34
-rw-r--r--core/vm/instructions.go2
-rw-r--r--core/vm/interface.go4
-rw-r--r--core/vm/interpreter.go23
-rw-r--r--core/vm/logger.go50
-rw-r--r--core/vm/noop.go4
-rw-r--r--core/vm/runtime/env.go4
-rw-r--r--crypto/crypto.go12
-rw-r--r--crypto/ecies/ecies.go2
-rw-r--r--crypto/secp256k1/curve.go46
-rw-r--r--crypto/secp256k1/ext.h40
-rw-r--r--crypto/secp256k1/secp256.go36
-rw-r--r--crypto/signature_cgo.go5
-rw-r--r--crypto/signature_nocgo.go9
-rw-r--r--crypto/signature_test.go48
-rw-r--r--dashboard/README.md21
-rw-r--r--dashboard/assets.go38475
-rw-r--r--dashboard/assets/.eslintrc100
-rw-r--r--dashboard/assets/.flowconfig9
-rw-r--r--dashboard/assets/common.jsx71
-rw-r--r--dashboard/assets/components/Body.jsx61
-rw-r--r--dashboard/assets/components/ChartRow.jsx57
-rw-r--r--dashboard/assets/components/Common.jsx52
-rw-r--r--dashboard/assets/components/CustomTooltip.jsx95
-rw-r--r--dashboard/assets/components/Dashboard.jsx360
-rw-r--r--dashboard/assets/components/Footer.jsx173
-rw-r--r--dashboard/assets/components/Header.jsx134
-rw-r--r--dashboard/assets/components/Home.jsx89
-rw-r--r--dashboard/assets/components/Main.jsx142
-rw-r--r--dashboard/assets/components/SideBar.jsx170
-rw-r--r--dashboard/assets/dashboard.html (renamed from dashboard/assets/public/dashboard.html)12
-rw-r--r--dashboard/assets/fa-only-woff-loader.js25
-rw-r--r--dashboard/assets/index.jsx37
-rw-r--r--dashboard/assets/package-lock.json7678
-rw-r--r--dashboard/assets/package.json58
-rw-r--r--dashboard/assets/types/content.jsx70
-rw-r--r--dashboard/assets/webpack.config.js70
-rw-r--r--dashboard/config.go2
-rw-r--r--dashboard/cpu.go35
-rw-r--r--dashboard/cpu_windows.go23
-rw-r--r--dashboard/dashboard.go225
-rw-r--r--dashboard/message.go72
-rw-r--r--eth/api.go255
-rw-r--r--eth/api_tracer.go646
-rw-r--r--eth/backend.go14
-rw-r--r--eth/bind.go138
-rw-r--r--eth/config.go14
-rw-r--r--eth/downloader/downloader.go350
-rw-r--r--eth/downloader/downloader_test.go201
-rw-r--r--eth/downloader/queue.go169
-rw-r--r--eth/downloader/statesync.go36
-rw-r--r--eth/fetcher/fetcher_test.go5
-rw-r--r--eth/filters/api.go7
-rw-r--r--eth/filters/filter_system.go11
-rw-r--r--eth/filters/filter_system_test.go32
-rw-r--r--eth/filters/filter_test.go15
-rw-r--r--eth/gasprice/gasprice.go49
-rw-r--r--eth/gen_config.go58
-rw-r--r--eth/handler.go40
-rw-r--r--eth/handler_test.go32
-rw-r--r--eth/helper_test.go26
-rw-r--r--eth/protocol_test.go20
-rw-r--r--eth/sync_test.go4
-rw-r--r--eth/tracers/internal/tracers/4byte_tracer.js86
-rw-r--r--eth/tracers/internal/tracers/assets.go350
-rw-r--r--eth/tracers/internal/tracers/call_tracer.js246
-rw-r--r--eth/tracers/internal/tracers/evmdis_tracer.js93
-rw-r--r--eth/tracers/internal/tracers/noop_tracer.js29
-rw-r--r--eth/tracers/internal/tracers/opcount_tracer.js32
-rw-r--r--eth/tracers/internal/tracers/prestate_tracer.js103
-rw-r--r--eth/tracers/internal/tracers/tracers.go21
-rw-r--r--eth/tracers/testdata/call_tracer_create.json58
-rw-r--r--eth/tracers/testdata/call_tracer_deep_calls.json415
-rw-r--r--eth/tracers/testdata/call_tracer_delegatecall.json97
-rw-r--r--eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json77
-rw-r--r--eth/tracers/testdata/call_tracer_inner_throw_outer_revert.json81
-rw-r--r--eth/tracers/testdata/call_tracer_oog.json60
-rw-r--r--eth/tracers/testdata/call_tracer_revert.json58
-rw-r--r--eth/tracers/testdata/call_tracer_simple.json78
-rw-r--r--eth/tracers/testdata/call_tracer_throw.json62
-rw-r--r--eth/tracers/tracer.go618
-rw-r--r--eth/tracers/tracer_test.go (renamed from internal/ethapi/tracer_test.go)49
-rw-r--r--eth/tracers/tracers.go53
-rw-r--r--eth/tracers/tracers_test.go194
-rw-r--r--ethclient/ethclient.go12
-rw-r--r--ethdb/database.go9
-rw-r--r--ethdb/interface.go2
-rw-r--r--ethdb/memory_database.go21
-rw-r--r--ethstats/ethstats.go13
-rw-r--r--interfaces.go4
-rw-r--r--internal/cmdtest/test_cmd.go8
-rw-r--r--internal/ethapi/api.go159
-rw-r--r--internal/ethapi/backend.go3
-rw-r--r--internal/ethapi/tracer.go364
-rw-r--r--internal/jsre/deps/bindata.go28
-rw-r--r--internal/web3ext/web3ext.go50
-rw-r--r--les/backend.go10
-rw-r--r--les/handler.go253
-rw-r--r--les/handler_test.go17
-rw-r--r--les/helper_test.go29
-rw-r--r--les/odr_test.go9
-rw-r--r--les/peer.go2
-rw-r--r--les/protocol.go9
-rw-r--r--les/server.go8
-rw-r--r--les/serverpool.go2
-rw-r--r--light/lightchain.go35
-rw-r--r--light/lightchain_test.go2
-rw-r--r--light/nodeset.go8
-rw-r--r--light/odr_test.go24
-rw-r--r--light/postprocess.go80
-rw-r--r--light/trie.go20
-rw-r--r--light/trie_test.go4
-rw-r--r--light/txpool.go9
-rw-r--r--light/txpool_test.go6
-rw-r--r--miner/worker.go10
-rw-r--r--mobile/android_test.go15
-rw-r--r--mobile/bind.go6
-rw-r--r--mobile/ethclient.go4
-rw-r--r--mobile/ethereum.go5
-rw-r--r--mobile/geth.go1
-rw-r--r--mobile/types.go28
-rw-r--r--node/defaults.go7
-rw-r--r--p2p/discover/database.go6
-rw-r--r--p2p/discover/udp.go44
-rw-r--r--p2p/discover/udp_test.go3
-rw-r--r--p2p/discv5/database.go6
-rw-r--r--p2p/discv5/net.go59
-rw-r--r--p2p/discv5/net_test.go2
-rw-r--r--p2p/discv5/node.go5
-rw-r--r--p2p/discv5/nodeevent_string.go6
-rw-r--r--p2p/discv5/sim_test.go2
-rw-r--r--p2p/discv5/ticket.go227
-rw-r--r--p2p/discv5/topic.go3
-rw-r--r--p2p/discv5/udp.go47
-rw-r--r--p2p/enr/enr.go290
-rw-r--r--p2p/enr/enr_test.go318
-rw-r--r--p2p/enr/entries.go160
-rw-r--r--p2p/server.go75
-rw-r--r--params/bootnodes.go23
-rw-r--r--params/protocol_params.go20
-rw-r--r--rpc/http.go14
-rw-r--r--swarm/api/api.go2
-rw-r--r--swarm/api/api_test.go2
-rw-r--r--swarm/api/client/client.go6
-rw-r--r--swarm/api/http/roundtripper.go4
-rw-r--r--swarm/api/http/server.go67
-rw-r--r--swarm/api/http/server_test.go134
-rw-r--r--swarm/api/http/templates.go2
-rw-r--r--swarm/api/uri.go33
-rw-r--r--swarm/api/uri_test.go86
-rwxr-xr-xswarm/dev/scripts/random-uploads.sh2
-rw-r--r--swarm/storage/chunker_test.go8
-rw-r--r--swarm/storage/pyramid.go2
-rw-r--r--tests/block_test_util.go24
-rw-r--r--tests/gen_btheader.go20
-rw-r--r--tests/gen_stenv.go8
-rw-r--r--tests/gen_sttransaction.go4
-rw-r--r--tests/gen_tttransaction.go12
-rw-r--r--tests/gen_vmexec.go8
-rw-r--r--tests/state_test.go13
-rw-r--r--tests/state_test_util.go18
m---------tests/testdata0
-rw-r--r--tests/transaction_test_util.go8
-rw-r--r--tests/vm_test_util.go2
-rw-r--r--trie/database.go355
-rw-r--r--trie/hasher.go156
-rw-r--r--trie/iterator_test.go125
-rw-r--r--trie/proof.go47
-rw-r--r--trie/secure_trie.go70
-rw-r--r--trie/secure_trie_test.go20
-rw-r--r--trie/sync.go14
-rw-r--r--trie/sync_test.go103
-rw-r--r--trie/trie.go93
-rw-r--r--trie/trie_test.go104
-rw-r--r--vendor/github.com/StackExchange/wmi/LICENSE20
-rw-r--r--vendor/github.com/StackExchange/wmi/README.md6
-rw-r--r--vendor/github.com/StackExchange/wmi/swbemservices.go260
-rw-r--r--vendor/github.com/StackExchange/wmi/wmi.go486
-rw-r--r--vendor/github.com/elastic/gosigar/CHANGELOG.md102
-rw-r--r--vendor/github.com/elastic/gosigar/LICENSE201
-rw-r--r--vendor/github.com/elastic/gosigar/NOTICE9
-rw-r--r--vendor/github.com/elastic/gosigar/README.md57
-rw-r--r--vendor/github.com/elastic/gosigar/Vagrantfile25
-rw-r--r--vendor/github.com/elastic/gosigar/codecov.yml21
-rw-r--r--vendor/github.com/elastic/gosigar/concrete_sigar.go83
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_darwin.go494
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_format.go126
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_freebsd.go108
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_interface.go197
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_linux.go84
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_linux_common.go468
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_openbsd.go418
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_stub.go71
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_unix.go69
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_util.go22
-rw-r--r--vendor/github.com/elastic/gosigar/sigar_windows.go437
-rw-r--r--vendor/github.com/elastic/gosigar/sys/windows/doc.go2
-rw-r--r--vendor/github.com/elastic/gosigar/sys/windows/ntquery.go132
-rw-r--r--vendor/github.com/elastic/gosigar/sys/windows/privileges.go272
-rw-r--r--vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go385
-rw-r--r--vendor/github.com/elastic/gosigar/sys/windows/version.go43
-rw-r--r--vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go260
-rw-r--r--vendor/github.com/go-ole/go-ole/ChangeLog.md49
-rw-r--r--vendor/github.com/go-ole/go-ole/LICENSE21
-rw-r--r--vendor/github.com/go-ole/go-ole/README.md46
-rw-r--r--vendor/github.com/go-ole/go-ole/appveyor.yml54
-rw-r--r--vendor/github.com/go-ole/go-ole/com.go329
-rw-r--r--vendor/github.com/go-ole/go-ole/com_func.go174
-rw-r--r--vendor/github.com/go-ole/go-ole/connect.go192
-rw-r--r--vendor/github.com/go-ole/go-ole/constants.go153
-rw-r--r--vendor/github.com/go-ole/go-ole/error.go51
-rw-r--r--vendor/github.com/go-ole/go-ole/error_func.go8
-rw-r--r--vendor/github.com/go-ole/go-ole/error_windows.go24
-rw-r--r--vendor/github.com/go-ole/go-ole/guid.go284
-rw-r--r--vendor/github.com/go-ole/go-ole/iconnectionpoint.go20
-rw-r--r--vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go21
-rw-r--r--vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go43
-rw-r--r--vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go17
-rw-r--r--vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go11
-rw-r--r--vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go25
-rw-r--r--vendor/github.com/go-ole/go-ole/idispatch.go94
-rw-r--r--vendor/github.com/go-ole/go-ole/idispatch_func.go19
-rw-r--r--vendor/github.com/go-ole/go-ole/idispatch_windows.go197
-rw-r--r--vendor/github.com/go-ole/go-ole/ienumvariant.go19
-rw-r--r--vendor/github.com/go-ole/go-ole/ienumvariant_func.go19
-rw-r--r--vendor/github.com/go-ole/go-ole/ienumvariant_windows.go63
-rw-r--r--vendor/github.com/go-ole/go-ole/iinspectable.go18
-rw-r--r--vendor/github.com/go-ole/go-ole/iinspectable_func.go15
-rw-r--r--vendor/github.com/go-ole/go-ole/iinspectable_windows.go72
-rw-r--r--vendor/github.com/go-ole/go-ole/iprovideclassinfo.go21
-rw-r--r--vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go7
-rw-r--r--vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go21
-rw-r--r--vendor/github.com/go-ole/go-ole/itypeinfo.go34
-rw-r--r--vendor/github.com/go-ole/go-ole/itypeinfo_func.go7
-rw-r--r--vendor/github.com/go-ole/go-ole/itypeinfo_windows.go21
-rw-r--r--vendor/github.com/go-ole/go-ole/iunknown.go57
-rw-r--r--vendor/github.com/go-ole/go-ole/iunknown_func.go19
-rw-r--r--vendor/github.com/go-ole/go-ole/iunknown_windows.go58
-rw-r--r--vendor/github.com/go-ole/go-ole/ole.go157
-rw-r--r--vendor/github.com/go-ole/go-ole/oleutil/connection.go100
-rw-r--r--vendor/github.com/go-ole/go-ole/oleutil/connection_func.go10
-rw-r--r--vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go58
-rw-r--r--vendor/github.com/go-ole/go-ole/oleutil/go-get.go6
-rw-r--r--vendor/github.com/go-ole/go-ole/oleutil/oleutil.go127
-rw-r--r--vendor/github.com/go-ole/go-ole/safearray.go27
-rw-r--r--vendor/github.com/go-ole/go-ole/safearray_func.go211
-rw-r--r--vendor/github.com/go-ole/go-ole/safearray_windows.go337
-rw-r--r--vendor/github.com/go-ole/go-ole/safearrayconversion.go140
-rw-r--r--vendor/github.com/go-ole/go-ole/safearrayslices.go33
-rw-r--r--vendor/github.com/go-ole/go-ole/utility.go101
-rw-r--r--vendor/github.com/go-ole/go-ole/variables.go16
-rw-r--r--vendor/github.com/go-ole/go-ole/variant.go105
-rw-r--r--vendor/github.com/go-ole/go-ole/variant_386.go11
-rw-r--r--vendor/github.com/go-ole/go-ole/variant_amd64.go12
-rw-r--r--vendor/github.com/go-ole/go-ole/variant_s390x.go12
-rw-r--r--vendor/github.com/go-ole/go-ole/vt_string.go58
-rw-r--r--vendor/github.com/go-ole/go-ole/winrt.go99
-rw-r--r--vendor/github.com/go-ole/go-ole/winrt_doc.go36
-rw-r--r--vendor/github.com/pkg/errors/LICENSE23
-rw-r--r--vendor/github.com/pkg/errors/README.md52
-rw-r--r--vendor/github.com/pkg/errors/appveyor.yml32
-rw-r--r--vendor/github.com/pkg/errors/errors.go269
-rw-r--r--vendor/github.com/pkg/errors/stack.go187
-rw-r--r--vendor/github.com/rjeczalik/notify/README.md2
-rw-r--r--vendor/github.com/rjeczalik/notify/appveyor.yml2
-rw-r--r--vendor/github.com/rjeczalik/notify/debug.go50
-rw-r--r--vendor/github.com/rjeczalik/notify/debug_debug.go36
-rw-r--r--vendor/github.com/rjeczalik/notify/debug_nodebug.go9
-rw-r--r--vendor/github.com/rjeczalik/notify/doc.go7
-rw-r--r--vendor/github.com/rjeczalik/notify/event.go2
-rw-r--r--vendor/github.com/rjeczalik/notify/event_inotify.go40
-rw-r--r--vendor/github.com/rjeczalik/notify/event_readdcw.go14
-rw-r--r--vendor/github.com/rjeczalik/notify/node.go7
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_fen.go11
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_fsevents.go8
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go13
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.10.go9
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.9.go14
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_inotify.go79
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_kqueue.go14
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_readdcw.go50
-rw-r--r--vendor/github.com/rjeczalik/notify/watcher_trigger.go21
-rw-r--r--vendor/github.com/syndtr/goleveldb/.travis.yml12
-rw-r--r--vendor/github.com/syndtr/goleveldb/README.md4
-rw-r--r--vendor/github.com/syndtr/goleveldb/leveldb/db.go17
-rw-r--r--vendor/github.com/syndtr/goleveldb/leveldb/db_write.go10
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.lock21
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.toml3
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/LICENSE.md21
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/README.md124
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/api.go1616
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/appveyor.yml34
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/conts.go121
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.c612
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.h223
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_config.h3672
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_console.c163
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_console.h14
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.c380
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.h20
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.c312
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.h12
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.c471
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.h14
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.c333
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.h9
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.c127
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.h10
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c131
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.h28
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duktape.c95118
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/duktape.go356
-rwxr-xr-xvendor/gopkg.in/olebedev/go-duktape.v3/duktape.h1349
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/timers.go136
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/utils.go10
-rw-r--r--vendor/gopkg.in/olebedev/go-duktape.v3/wercker.yml14
-rw-r--r--vendor/vendor.json54
-rw-r--r--whisper/whisperv2/whisper.go4
-rw-r--r--whisper/whisperv5/api.go2
-rw-r--r--whisper/whisperv5/filter.go8
-rw-r--r--whisper/whisperv5/filter_test.go48
-rw-r--r--whisper/whisperv5/gen_criteria_json.go14
-rw-r--r--whisper/whisperv5/gen_message_json.go28
-rw-r--r--whisper/whisperv5/gen_newmessage_json.go26
-rw-r--r--whisper/whisperv6/api.go22
-rw-r--r--whisper/whisperv6/benchmarks_test.go14
-rw-r--r--whisper/whisperv6/config.go2
-rw-r--r--whisper/whisperv6/doc.go48
-rw-r--r--whisper/whisperv6/envelope.go42
-rw-r--r--whisper/whisperv6/envelope_test.go2
-rw-r--r--whisper/whisperv6/filter.go29
-rw-r--r--whisper/whisperv6/filter_test.go66
-rw-r--r--whisper/whisperv6/gen_criteria_json.go16
-rw-r--r--whisper/whisperv6/gen_message_json.go30
-rw-r--r--whisper/whisperv6/gen_newmessage_json.go28
-rw-r--r--whisper/whisperv6/message.go216
-rw-r--r--whisper/whisperv6/message_test.go77
-rw-r--r--whisper/whisperv6/peer.go151
-rw-r--r--whisper/whisperv6/peer_test.go223
-rw-r--r--whisper/whisperv6/topic.go4
-rw-r--r--whisper/whisperv6/whisper.go680
-rw-r--r--whisper/whisperv6/whisper_test.go105
487 files changed, 177991 insertions, 8032 deletions
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index a332b815d..9f2dbfcb8 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -2,7 +2,7 @@
Before you do a feature request please check and make sure that it isn't possible
through some other means. The JavaScript enabled console is a powerful feature
-in the right hands. Please check our [Bitchin' tricks](https://github.com/ethereum/go-ethereum/wiki/bitchin-tricks) wiki page for more info
+in the right hands. Please check our [Wiki page](https://github.com/ethereum/go-ethereum/wiki) for more info
and help.
## Contributing
diff --git a/.gitignore b/.gitignore
index 3a5acef9f..0763d8492 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,6 +35,7 @@ profile.cov
.idea
# dashboard
+/dashboard/assets/flow-typed
/dashboard/assets/node_modules
/dashboard/assets/stats.json
-/dashboard/assets/public/bundle.js
+/dashboard/assets/bundle.js
diff --git a/.travis.yml b/.travis.yml
index cc1b185fc..ba62b87bf 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -40,6 +40,7 @@ matrix:
- os: osx
go: 1.9.x
script:
+ - unset -f cd # workaround for https://github.com/travis-ci/travis-ci/issues/8703
- brew update
- brew install caskroom/cask/brew-cask
- brew cask install osxfuse
@@ -87,13 +88,13 @@ matrix:
- sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install gcc-arm-linux-gnueabi libc6-dev-armel-cross gcc-arm-linux-gnueabihf libc6-dev-armhf-cross gcc-aarch64-linux-gnu libc6-dev-arm64-cross
- sudo ln -s /usr/include/asm-generic /usr/include/asm
- - GOARM=5 CC=arm-linux-gnueabi-gcc go run build/ci.go install -arch arm
+ - GOARM=5 go run build/ci.go install -arch arm -cc arm-linux-gnueabi-gcc
- GOARM=5 go run build/ci.go archive -arch arm -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds
- - GOARM=6 CC=arm-linux-gnueabi-gcc go run build/ci.go install -arch arm
+ - GOARM=6 go run build/ci.go install -arch arm -cc arm-linux-gnueabi-gcc
- GOARM=6 go run build/ci.go archive -arch arm -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds
- - GOARM=7 CC=arm-linux-gnueabihf-gcc go run build/ci.go install -arch arm
+ - GOARM=7 go run build/ci.go install -arch arm -cc arm-linux-gnueabihf-gcc
- GOARM=7 go run build/ci.go archive -arch arm -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds
- - CC=aarch64-linux-gnu-gcc go run build/ci.go install -arch arm64
+ - go run build/ci.go install -arch arm64 -cc aarch64-linux-gnu-gcc
- go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds
# This builder does the Linux Azure MIPS xgo uploads
diff --git a/Makefile b/Makefile
index 2cfd1110e..3922d6015 100644
--- a/Makefile
+++ b/Makefile
@@ -45,9 +45,13 @@ clean:
devtools:
env GOBIN= go get -u golang.org/x/tools/cmd/stringer
- env GOBIN= go get -u github.com/jteeuwen/go-bindata/go-bindata
+ env GOBIN= go get -u github.com/kevinburke/go-bindata/go-bindata
env GOBIN= go get -u github.com/fjl/gencodec
+ env GOBIN= go get -u github.com/golang/protobuf/protoc-gen-go
env GOBIN= go install ./cmd/abigen
+ @type "npm" 2> /dev/null || echo 'Please install node.js and npm'
+ @type "solc" 2> /dev/null || echo 'Please install solc'
+ @type "protoc" 2> /dev/null || echo 'Please install protoc'
# Cross Compilation Targets (xgo)
diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go
index 205dc300b..abcb403db 100644
--- a/accounts/abi/abi.go
+++ b/accounts/abi/abi.go
@@ -17,6 +17,7 @@
package abi
import (
+ "bytes"
"encoding/json"
"fmt"
"io"
@@ -50,57 +51,52 @@ func JSON(reader io.Reader) (ABI, error) {
// methods string signature. (signature = baz(uint32,string32))
func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) {
// Fetch the ABI of the requested method
- var method Method
-
if name == "" {
- method = abi.Constructor
- } else {
- m, exist := abi.Methods[name]
- if !exist {
- return nil, fmt.Errorf("method '%s' not found", name)
+ // constructor
+ arguments, err := abi.Constructor.Inputs.Pack(args...)
+ if err != nil {
+ return nil, err
}
- method = m
+ return arguments, nil
+
}
- arguments, err := method.pack(args...)
+ method, exist := abi.Methods[name]
+ if !exist {
+ return nil, fmt.Errorf("method '%s' not found", name)
+ }
+
+ arguments, err := method.Inputs.Pack(args...)
if err != nil {
return nil, err
}
// Pack up the method ID too if not a constructor and return
- if name == "" {
- return arguments, nil
- }
return append(method.Id(), arguments...), nil
}
// Unpack output in v according to the abi specification
func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error) {
- if err = bytesAreProper(output); err != nil {
- return err
+ if len(output) == 0 {
+ return fmt.Errorf("abi: unmarshalling empty output")
}
// since there can't be naming collisions with contracts and events,
// we need to decide whether we're calling a method or an event
- var unpack unpacker
if method, ok := abi.Methods[name]; ok {
- unpack = method
+ if len(output)%32 != 0 {
+ return fmt.Errorf("abi: improperly formatted output")
+ }
+ return method.Outputs.Unpack(v, output)
} else if event, ok := abi.Events[name]; ok {
- unpack = event
- } else {
- return fmt.Errorf("abi: could not locate named method or event.")
- }
-
- // requires a struct to unpack into for a tuple return...
- if unpack.isTupleReturn() {
- return unpack.tupleUnpack(v, output)
+ return event.Inputs.Unpack(v, output)
}
- return unpack.singleUnpack(v, output)
+ return fmt.Errorf("abi: could not locate named method or event")
}
+// UnmarshalJSON implements json.Unmarshaler interface
func (abi *ABI) UnmarshalJSON(data []byte) error {
var fields []struct {
Type string
Name string
Constant bool
- Indexed bool
Anonymous bool
Inputs []Argument
Outputs []Argument
@@ -137,3 +133,14 @@ func (abi *ABI) UnmarshalJSON(data []byte) error {
return nil
}
+
+// MethodById looks up a method by the 4-byte id
+// returns nil if none found
+func (abi *ABI) MethodById(sigdata []byte) *Method {
+ for _, method := range abi.Methods {
+ if bytes.Equal(method.Id(), sigdata[:4]) {
+ return &method
+ }
+ }
+ return nil
+}
diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go
index 79c4d4a16..2d43b631c 100644
--- a/accounts/abi/abi_test.go
+++ b/accounts/abi/abi_test.go
@@ -18,13 +18,15 @@ package abi
import (
"bytes"
+ "encoding/hex"
"fmt"
"log"
"math/big"
- "reflect"
"strings"
"testing"
+ "reflect"
+
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
)
@@ -74,9 +76,24 @@ func TestReader(t *testing.T) {
}
// deep equal fails for some reason
- t.Skip()
- if !reflect.DeepEqual(abi, exp) {
- t.Errorf("\nabi: %v\ndoes not match exp: %v", abi, exp)
+ for name, expM := range exp.Methods {
+ gotM, exist := abi.Methods[name]
+ if !exist {
+ t.Errorf("Missing expected method %v", name)
+ }
+ if !reflect.DeepEqual(gotM, expM) {
+ t.Errorf("\nGot abi method: \n%v\ndoes not match expected method\n%v", gotM, expM)
+ }
+ }
+
+ for name, gotM := range abi.Methods {
+ expM, exist := exp.Methods[name]
+ if !exist {
+ t.Errorf("Found extra method %v", name)
+ }
+ if !reflect.DeepEqual(gotM, expM) {
+ t.Errorf("\nGot abi method: \n%v\ndoes not match expected method\n%v", gotM, expM)
+ }
}
}
@@ -348,6 +365,188 @@ func TestInputVariableInputLength(t *testing.T) {
}
}
+func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
+ const definition = `[
+ { "type" : "function", "name" : "fixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr", "type" : "uint256[2]" } ] },
+ { "type" : "function", "name" : "fixedArrBytes", "constant" : true, "inputs" : [ { "name" : "str", "type" : "bytes" }, { "name" : "fixedArr", "type" : "uint256[2]" } ] },
+ { "type" : "function", "name" : "mixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr", "type": "uint256[2]" }, { "name" : "dynArr", "type": "uint256[]" } ] },
+ { "type" : "function", "name" : "doubleFixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr1", "type": "uint256[2]" }, { "name" : "fixedArr2", "type": "uint256[3]" } ] },
+ { "type" : "function", "name" : "multipleMixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr1", "type": "uint256[2]" }, { "name" : "dynArr", "type" : "uint256[]" }, { "name" : "fixedArr2", "type" : "uint256[3]" } ] }
+ ]`
+
+ abi, err := JSON(strings.NewReader(definition))
+ if err != nil {
+ t.Error(err)
+ }
+
+ // test string, fixed array uint256[2]
+ strin := "hello world"
+ arrin := [2]*big.Int{big.NewInt(1), big.NewInt(2)}
+ fixedArrStrPack, err := abi.Pack("fixedArrStr", strin, arrin)
+ if err != nil {
+ t.Error(err)
+ }
+
+ // generate expected output
+ offset := make([]byte, 32)
+ offset[31] = 96
+ length := make([]byte, 32)
+ length[31] = byte(len(strin))
+ strvalue := common.RightPadBytes([]byte(strin), 32)
+ arrinvalue1 := common.LeftPadBytes(arrin[0].Bytes(), 32)
+ arrinvalue2 := common.LeftPadBytes(arrin[1].Bytes(), 32)
+ exp := append(offset, arrinvalue1...)
+ exp = append(exp, arrinvalue2...)
+ exp = append(exp, append(length, strvalue...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ fixedArrStrPack = fixedArrStrPack[4:]
+ if !bytes.Equal(fixedArrStrPack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, fixedArrStrPack)
+ }
+
+ // test byte array, fixed array uint256[2]
+ bytesin := []byte(strin)
+ arrin = [2]*big.Int{big.NewInt(1), big.NewInt(2)}
+ fixedArrBytesPack, err := abi.Pack("fixedArrBytes", bytesin, arrin)
+ if err != nil {
+ t.Error(err)
+ }
+
+ // generate expected output
+ offset = make([]byte, 32)
+ offset[31] = 96
+ length = make([]byte, 32)
+ length[31] = byte(len(strin))
+ strvalue = common.RightPadBytes([]byte(strin), 32)
+ arrinvalue1 = common.LeftPadBytes(arrin[0].Bytes(), 32)
+ arrinvalue2 = common.LeftPadBytes(arrin[1].Bytes(), 32)
+ exp = append(offset, arrinvalue1...)
+ exp = append(exp, arrinvalue2...)
+ exp = append(exp, append(length, strvalue...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ fixedArrBytesPack = fixedArrBytesPack[4:]
+ if !bytes.Equal(fixedArrBytesPack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, fixedArrBytesPack)
+ }
+
+ // test string, fixed array uint256[2], dynamic array uint256[]
+ strin = "hello world"
+ fixedarrin := [2]*big.Int{big.NewInt(1), big.NewInt(2)}
+ dynarrin := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}
+ mixedArrStrPack, err := abi.Pack("mixedArrStr", strin, fixedarrin, dynarrin)
+ if err != nil {
+ t.Error(err)
+ }
+
+ // generate expected output
+ stroffset := make([]byte, 32)
+ stroffset[31] = 128
+ strlength := make([]byte, 32)
+ strlength[31] = byte(len(strin))
+ strvalue = common.RightPadBytes([]byte(strin), 32)
+ fixedarrinvalue1 := common.LeftPadBytes(fixedarrin[0].Bytes(), 32)
+ fixedarrinvalue2 := common.LeftPadBytes(fixedarrin[1].Bytes(), 32)
+ dynarroffset := make([]byte, 32)
+ dynarroffset[31] = byte(160 + ((len(strin)/32)+1)*32)
+ dynarrlength := make([]byte, 32)
+ dynarrlength[31] = byte(len(dynarrin))
+ dynarrinvalue1 := common.LeftPadBytes(dynarrin[0].Bytes(), 32)
+ dynarrinvalue2 := common.LeftPadBytes(dynarrin[1].Bytes(), 32)
+ dynarrinvalue3 := common.LeftPadBytes(dynarrin[2].Bytes(), 32)
+ exp = append(stroffset, fixedarrinvalue1...)
+ exp = append(exp, fixedarrinvalue2...)
+ exp = append(exp, dynarroffset...)
+ exp = append(exp, append(strlength, strvalue...)...)
+ dynarrarg := append(dynarrlength, dynarrinvalue1...)
+ dynarrarg = append(dynarrarg, dynarrinvalue2...)
+ dynarrarg = append(dynarrarg, dynarrinvalue3...)
+ exp = append(exp, dynarrarg...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ mixedArrStrPack = mixedArrStrPack[4:]
+ if !bytes.Equal(mixedArrStrPack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, mixedArrStrPack)
+ }
+
+ // test string, fixed array uint256[2], fixed array uint256[3]
+ strin = "hello world"
+ fixedarrin1 := [2]*big.Int{big.NewInt(1), big.NewInt(2)}
+ fixedarrin2 := [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}
+ doubleFixedArrStrPack, err := abi.Pack("doubleFixedArrStr", strin, fixedarrin1, fixedarrin2)
+ if err != nil {
+ t.Error(err)
+ }
+
+ // generate expected output
+ stroffset = make([]byte, 32)
+ stroffset[31] = 192
+ strlength = make([]byte, 32)
+ strlength[31] = byte(len(strin))
+ strvalue = common.RightPadBytes([]byte(strin), 32)
+ fixedarrin1value1 := common.LeftPadBytes(fixedarrin1[0].Bytes(), 32)
+ fixedarrin1value2 := common.LeftPadBytes(fixedarrin1[1].Bytes(), 32)
+ fixedarrin2value1 := common.LeftPadBytes(fixedarrin2[0].Bytes(), 32)
+ fixedarrin2value2 := common.LeftPadBytes(fixedarrin2[1].Bytes(), 32)
+ fixedarrin2value3 := common.LeftPadBytes(fixedarrin2[2].Bytes(), 32)
+ exp = append(stroffset, fixedarrin1value1...)
+ exp = append(exp, fixedarrin1value2...)
+ exp = append(exp, fixedarrin2value1...)
+ exp = append(exp, fixedarrin2value2...)
+ exp = append(exp, fixedarrin2value3...)
+ exp = append(exp, append(strlength, strvalue...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ doubleFixedArrStrPack = doubleFixedArrStrPack[4:]
+ if !bytes.Equal(doubleFixedArrStrPack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, doubleFixedArrStrPack)
+ }
+
+ // test string, fixed array uint256[2], dynamic array uint256[], fixed array uint256[3]
+ strin = "hello world"
+ fixedarrin1 = [2]*big.Int{big.NewInt(1), big.NewInt(2)}
+ dynarrin = []*big.Int{big.NewInt(1), big.NewInt(2)}
+ fixedarrin2 = [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}
+ multipleMixedArrStrPack, err := abi.Pack("multipleMixedArrStr", strin, fixedarrin1, dynarrin, fixedarrin2)
+ if err != nil {
+ t.Error(err)
+ }
+
+ // generate expected output
+ stroffset = make([]byte, 32)
+ stroffset[31] = 224
+ strlength = make([]byte, 32)
+ strlength[31] = byte(len(strin))
+ strvalue = common.RightPadBytes([]byte(strin), 32)
+ fixedarrin1value1 = common.LeftPadBytes(fixedarrin1[0].Bytes(), 32)
+ fixedarrin1value2 = common.LeftPadBytes(fixedarrin1[1].Bytes(), 32)
+ dynarroffset = U256(big.NewInt(int64(256 + ((len(strin)/32)+1)*32)))
+ dynarrlength = make([]byte, 32)
+ dynarrlength[31] = byte(len(dynarrin))
+ dynarrinvalue1 = common.LeftPadBytes(dynarrin[0].Bytes(), 32)
+ dynarrinvalue2 = common.LeftPadBytes(dynarrin[1].Bytes(), 32)
+ fixedarrin2value1 = common.LeftPadBytes(fixedarrin2[0].Bytes(), 32)
+ fixedarrin2value2 = common.LeftPadBytes(fixedarrin2[1].Bytes(), 32)
+ fixedarrin2value3 = common.LeftPadBytes(fixedarrin2[2].Bytes(), 32)
+ exp = append(stroffset, fixedarrin1value1...)
+ exp = append(exp, fixedarrin1value2...)
+ exp = append(exp, dynarroffset...)
+ exp = append(exp, fixedarrin2value1...)
+ exp = append(exp, fixedarrin2value2...)
+ exp = append(exp, fixedarrin2value3...)
+ exp = append(exp, append(strlength, strvalue...)...)
+ dynarrarg = append(dynarrlength, dynarrinvalue1...)
+ dynarrarg = append(dynarrarg, dynarrinvalue2...)
+ exp = append(exp, dynarrarg...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ multipleMixedArrStrPack = multipleMixedArrStrPack[4:]
+ if !bytes.Equal(multipleMixedArrStrPack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, multipleMixedArrStrPack)
+ }
+}
+
func TestDefaultFunctionParsing(t *testing.T) {
const definition = `[{ "name" : "balance" }]`
@@ -418,3 +617,82 @@ func TestBareEvents(t *testing.T) {
}
}
}
+
+// TestUnpackEvent is based on this contract:
+// contract T {
+// event received(address sender, uint amount, bytes memo);
+// function receive(bytes memo) external payable {
+// received(msg.sender, msg.value, memo);
+// }
+// }
+// When receive("X") is called with sender 0x00... and value 1, it produces this tx receipt:
+// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}
+func TestUnpackEvent(t *testing.T) {
+ const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]`
+ abi, err := JSON(strings.NewReader(abiJSON))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158`
+ data, err := hex.DecodeString(hexdata)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(data)%32 == 0 {
+ t.Errorf("len(data) is %d, want a non-multiple of 32", len(data))
+ }
+
+ type ReceivedEvent struct {
+ Address common.Address
+ Amount *big.Int
+ Memo []byte
+ }
+ var ev ReceivedEvent
+
+ err = abi.Unpack(&ev, "received", data)
+ if err != nil {
+ t.Error(err)
+ } else {
+ t.Logf("len(data): %d; received event: %+v", len(data), ev)
+ }
+}
+
+func TestABI_MethodById(t *testing.T) {
+ const abiJSON = `[
+ {"type":"function","name":"receive","constant":false,"inputs":[{"name":"memo","type":"bytes"}],"outputs":[],"payable":true,"stateMutability":"payable"},
+ {"type":"event","name":"received","anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}]},
+ {"type":"function","name":"fixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr","type":"uint256[2]"}]},
+ {"type":"function","name":"fixedArrBytes","constant":true,"inputs":[{"name":"str","type":"bytes"},{"name":"fixedArr","type":"uint256[2]"}]},
+ {"type":"function","name":"mixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr","type":"uint256[2]"},{"name":"dynArr","type":"uint256[]"}]},
+ {"type":"function","name":"doubleFixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr1","type":"uint256[2]"},{"name":"fixedArr2","type":"uint256[3]"}]},
+ {"type":"function","name":"multipleMixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr1","type":"uint256[2]"},{"name":"dynArr","type":"uint256[]"},{"name":"fixedArr2","type":"uint256[3]"}]},
+ {"type":"function","name":"balance","constant":true},
+ {"type":"function","name":"send","constant":false,"inputs":[{"name":"amount","type":"uint256"}]},
+ {"type":"function","name":"test","constant":false,"inputs":[{"name":"number","type":"uint32"}]},
+ {"type":"function","name":"string","constant":false,"inputs":[{"name":"inputs","type":"string"}]},
+ {"type":"function","name":"bool","constant":false,"inputs":[{"name":"inputs","type":"bool"}]},
+ {"type":"function","name":"address","constant":false,"inputs":[{"name":"inputs","type":"address"}]},
+ {"type":"function","name":"uint64[2]","constant":false,"inputs":[{"name":"inputs","type":"uint64[2]"}]},
+ {"type":"function","name":"uint64[]","constant":false,"inputs":[{"name":"inputs","type":"uint64[]"}]},
+ {"type":"function","name":"foo","constant":false,"inputs":[{"name":"inputs","type":"uint32"}]},
+ {"type":"function","name":"bar","constant":false,"inputs":[{"name":"inputs","type":"uint32"},{"name":"string","type":"uint16"}]},
+ {"type":"function","name":"_slice","constant":false,"inputs":[{"name":"inputs","type":"uint32[2]"}]},
+ {"type":"function","name":"__slice256","constant":false,"inputs":[{"name":"inputs","type":"uint256[2]"}]},
+ {"type":"function","name":"sliceAddress","constant":false,"inputs":[{"name":"inputs","type":"address[]"}]},
+ {"type":"function","name":"sliceMultiAddress","constant":false,"inputs":[{"name":"a","type":"address[]"},{"name":"b","type":"address[]"}]}
+ ]
+`
+ abi, err := JSON(strings.NewReader(abiJSON))
+ if err != nil {
+ t.Fatal(err)
+ }
+ for name, m := range abi.Methods {
+ a := fmt.Sprintf("%v", m)
+ b := fmt.Sprintf("%v", abi.MethodById(m.Id()))
+ if a != b {
+ t.Errorf("Method %v (id %v) not 'findable' by id in ABI", name, common.ToHex(m.Id()))
+ }
+ }
+
+}
diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go
index 4691318ce..04ca6150a 100644
--- a/accounts/abi/argument.go
+++ b/accounts/abi/argument.go
@@ -19,6 +19,8 @@ package abi
import (
"encoding/json"
"fmt"
+ "reflect"
+ "strings"
)
// Argument holds the name of the argument and the corresponding type.
@@ -29,7 +31,10 @@ type Argument struct {
Indexed bool // indexed is only used by events
}
-func (a *Argument) UnmarshalJSON(data []byte) error {
+type Arguments []Argument
+
+// UnmarshalJSON implements json.Unmarshaler interface
+func (argument *Argument) UnmarshalJSON(data []byte) error {
var extarg struct {
Name string
Type string
@@ -40,12 +45,206 @@ func (a *Argument) UnmarshalJSON(data []byte) error {
return fmt.Errorf("argument json err: %v", err)
}
- a.Type, err = NewType(extarg.Type)
+ argument.Type, err = NewType(extarg.Type)
if err != nil {
return err
}
- a.Name = extarg.Name
- a.Indexed = extarg.Indexed
+ argument.Name = extarg.Name
+ argument.Indexed = extarg.Indexed
+
+ return nil
+}
+
+// LengthNonIndexed returns the number of arguments when not counting 'indexed' ones. Only events
+// can ever have 'indexed' arguments, it should always be false on arguments for method input/output
+func (arguments Arguments) LengthNonIndexed() int {
+ out := 0
+ for _, arg := range arguments {
+ if !arg.Indexed {
+ out++
+ }
+ }
+ return out
+}
+
+// isTuple returns true for non-atomic constructs, like (uint,uint) or uint[]
+func (arguments Arguments) isTuple() bool {
+ return len(arguments) > 1
+}
+
+// Unpack performs the operation hexdata -> Go format
+func (arguments Arguments) Unpack(v interface{}, data []byte) error {
+ if arguments.isTuple() {
+ return arguments.unpackTuple(v, data)
+ }
+ return arguments.unpackAtomic(v, data)
+}
+
+func (arguments Arguments) unpackTuple(v interface{}, output []byte) error {
+ // make sure the passed value is arguments pointer
+ valueOf := reflect.ValueOf(v)
+ if reflect.Ptr != valueOf.Kind() {
+ return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
+ }
+
+ var (
+ value = valueOf.Elem()
+ typ = value.Type()
+ kind = value.Kind()
+ )
+
+ if err := requireUnpackKind(value, typ, kind, arguments); err != nil {
+ return err
+ }
+ // If the output interface is a struct, make sure names don't collide
+ if kind == reflect.Struct {
+ exists := make(map[string]bool)
+ for _, arg := range arguments {
+ field := capitalise(arg.Name)
+ if field == "" {
+ return fmt.Errorf("abi: purely underscored output cannot unpack to struct")
+ }
+ if exists[field] {
+ return fmt.Errorf("abi: multiple outputs mapping to the same struct field '%s'", field)
+ }
+ exists[field] = true
+ }
+ }
+ // `i` counts the nonindexed arguments.
+ // `j` counts the number of complex types.
+ // both `i` and `j` are used to to correctly compute `data` offset.
+
+ i, j := -1, 0
+ for _, arg := range arguments {
+
+ if arg.Indexed {
+ // can't read, continue
+ continue
+ }
+ i++
+ marshalledValue, err := toGoType((i+j)*32, arg.Type, output)
+ if err != nil {
+ return err
+ }
+
+ if arg.Type.T == ArrayTy {
+ // combined index ('i' + 'j') need to be adjusted only by size of array, thus
+ // we need to decrement 'j' because 'i' was incremented
+ j += arg.Type.Size - 1
+ }
+
+ reflectValue := reflect.ValueOf(marshalledValue)
+
+ switch kind {
+ case reflect.Struct:
+ name := capitalise(arg.Name)
+ for j := 0; j < typ.NumField(); j++ {
+ // TODO read tags: `abi:"fieldName"`
+ if typ.Field(j).Name == name {
+ if err := set(value.Field(j), reflectValue, arg); err != nil {
+ return err
+ }
+ }
+ }
+ case reflect.Slice, reflect.Array:
+ if value.Len() < i {
+ return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(arguments), value.Len())
+ }
+ v := value.Index(i)
+ if err := requireAssignable(v, reflectValue); err != nil {
+ return err
+ }
+ if err := set(v.Elem(), reflectValue, arg); err != nil {
+ return err
+ }
+ default:
+ return fmt.Errorf("abi:[2] cannot unmarshal tuple in to %v", typ)
+ }
+ }
return nil
}
+
+// unpackAtomic unpacks ( hexdata -> go ) a single value
+func (arguments Arguments) unpackAtomic(v interface{}, output []byte) error {
+ // make sure the passed value is arguments pointer
+ valueOf := reflect.ValueOf(v)
+ if reflect.Ptr != valueOf.Kind() {
+ return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
+ }
+ arg := arguments[0]
+ if arg.Indexed {
+ return fmt.Errorf("abi: attempting to unpack indexed variable into element.")
+ }
+
+ value := valueOf.Elem()
+
+ marshalledValue, err := toGoType(0, arg.Type, output)
+ if err != nil {
+ return err
+ }
+ return set(value, reflect.ValueOf(marshalledValue), arg)
+}
+
+// Unpack performs the operation Go format -> Hexdata
+func (arguments Arguments) Pack(args ...interface{}) ([]byte, error) {
+ // Make sure arguments match up and pack them
+ abiArgs := arguments
+ if len(args) != len(abiArgs) {
+ return nil, fmt.Errorf("argument count mismatch: %d for %d", len(args), len(abiArgs))
+ }
+
+ // variable input is the output appended at the end of packed
+ // output. This is used for strings and bytes types input.
+ var variableInput []byte
+
+ // input offset is the bytes offset for packed output
+ inputOffset := 0
+ for _, abiArg := range abiArgs {
+ if abiArg.Type.T == ArrayTy {
+ inputOffset += 32 * abiArg.Type.Size
+ } else {
+ inputOffset += 32
+ }
+ }
+
+ var ret []byte
+ for i, a := range args {
+ input := abiArgs[i]
+ // pack the input
+ packed, err := input.Type.pack(reflect.ValueOf(a))
+ if err != nil {
+ return nil, err
+ }
+
+ // check for a slice type (string, bytes, slice)
+ if input.Type.requiresLengthPrefix() {
+ // calculate the offset
+ offset := inputOffset + len(variableInput)
+ // set the offset
+ ret = append(ret, packNum(reflect.ValueOf(offset))...)
+ // Append the packed output to the variable input. The variable input
+ // will be appended at the end of the input.
+ variableInput = append(variableInput, packed...)
+ } else {
+ // append the packed value to the input
+ ret = append(ret, packed...)
+ }
+ }
+ // append the variable input at the end of the packed input
+ ret = append(ret, variableInput...)
+
+ return ret, nil
+}
+
+// capitalise makes the first character of a string upper case, also removing any
+// prefixing underscores from the variable names.
+func capitalise(input string) string {
+ for len(input) > 0 && input[0] == '_' {
+ input = input[1:]
+ }
+ if len(input) == 0 {
+ return ""
+ }
+ return strings.ToUpper(input[:1]) + input[1:]
+}
diff --git a/accounts/abi/bind/backend.go b/accounts/abi/bind/backend.go
index 25b61928e..ca60cc1b4 100644
--- a/accounts/abi/bind/backend.go
+++ b/accounts/abi/bind/backend.go
@@ -52,12 +52,6 @@ type ContractCaller interface {
CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)
}
-// DeployBackend wraps the operations needed by WaitMined and WaitDeployed.
-type DeployBackend interface {
- TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)
- CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)
-}
-
// PendingContractCaller defines methods to perform contract calls on the pending state.
// Call will try to discover this interface when access to the pending state is requested.
// If the backend does not support the pending state, Call returns ErrNoPendingState.
@@ -85,13 +79,34 @@ type ContractTransactor interface {
// There is no guarantee that this is the true gas limit requirement as other
// transactions may be added or removed by miners, but it should provide a basis
// for setting a reasonable default.
- EstimateGas(ctx context.Context, call ethereum.CallMsg) (usedGas *big.Int, err error)
+ EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error)
// SendTransaction injects the transaction into the pending pool for execution.
SendTransaction(ctx context.Context, tx *types.Transaction) error
}
+// ContractFilterer defines the methods needed to access log events using one-off
+// queries or continuous event subscriptions.
+type ContractFilterer interface {
+ // FilterLogs executes a log filter operation, blocking during execution and
+ // returning all the results in one batch.
+ //
+ // TODO(karalabe): Deprecate when the subscription one can return past data too.
+ FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error)
+
+ // SubscribeFilterLogs creates a background log filtering operation, returning
+ // a subscription immediately, which can be used to stream the found events.
+ SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error)
+}
+
+// DeployBackend wraps the operations needed by WaitMined and WaitDeployed.
+type DeployBackend interface {
+ TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)
+ CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)
+}
+
// ContractBackend defines the methods needed to work with contracts on a read-write basis.
type ContractBackend interface {
ContractCaller
ContractTransactor
+ ContractFilterer
}
diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go
index 09288d401..bd342a8cb 100644
--- a/accounts/abi/bind/backends/simulated.go
+++ b/accounts/abi/bind/backends/simulated.go
@@ -30,11 +30,15 @@ import (
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/bloombits"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/eth/filters"
"github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/params"
+ "github.com/ethereum/go-ethereum/rpc"
)
// This nil assignment ensures compile time that SimulatedBackend implements bind.ContractBackend.
@@ -53,6 +57,8 @@ type SimulatedBackend struct {
pendingBlock *types.Block // Currently pending block that will be imported on request
pendingState *state.StateDB // Currently pending state that will be the active on on request
+ events *filters.EventSystem // Event system for filtering log events live
+
config *params.ChainConfig
}
@@ -62,8 +68,14 @@ func NewSimulatedBackend(alloc core.GenesisAlloc) *SimulatedBackend {
database, _ := ethdb.NewMemDatabase()
genesis := core.Genesis{Config: params.AllEthashProtocolChanges, Alloc: alloc}
genesis.MustCommit(database)
- blockchain, _ := core.NewBlockChain(database, genesis.Config, ethash.NewFaker(), vm.Config{})
- backend := &SimulatedBackend{database: database, blockchain: blockchain, config: genesis.Config}
+ blockchain, _ := core.NewBlockChain(database, nil, genesis.Config, ethash.NewFaker(), vm.Config{})
+
+ backend := &SimulatedBackend{
+ database: database,
+ blockchain: blockchain,
+ config: genesis.Config,
+ events: filters.NewEventSystem(new(event.TypeMux), &filterBackend{database, blockchain}, false),
+ }
backend.rollback()
return backend
}
@@ -89,9 +101,11 @@ func (b *SimulatedBackend) Rollback() {
}
func (b *SimulatedBackend) rollback() {
- blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), b.database, 1, func(int, *core.BlockGen) {})
+ blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), ethash.NewFaker(), b.database, 1, func(int, *core.BlockGen) {})
+ statedb, _ := b.blockchain.State()
+
b.pendingBlock = blocks[0]
- b.pendingState, _ = state.New(b.pendingBlock.Root(), state.NewDatabase(b.database))
+ b.pendingState, _ = state.New(b.pendingBlock.Root(), statedb.Database())
}
// CodeAt returns the code associated with a certain account in the blockchain.
@@ -200,7 +214,7 @@ func (b *SimulatedBackend) SuggestGasPrice(ctx context.Context) (*big.Int, error
// EstimateGas executes the requested code against the currently pending block/state and
// returns the used amount of gas.
-func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMsg) (*big.Int, error) {
+func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) {
b.mu.Lock()
defer b.mu.Unlock()
@@ -210,16 +224,16 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs
hi uint64
cap uint64
)
- if call.Gas != nil && call.Gas.Uint64() >= params.TxGas {
- hi = call.Gas.Uint64()
+ if call.Gas >= params.TxGas {
+ hi = call.Gas
} else {
- hi = b.pendingBlock.GasLimit().Uint64()
+ hi = b.pendingBlock.GasLimit()
}
cap = hi
// Create a helper to check if a gas allowance results in an executable transaction
executable := func(gas uint64) bool {
- call.Gas = new(big.Int).SetUint64(gas)
+ call.Gas = gas
snapshot := b.pendingState.Snapshot()
_, _, failed, err := b.callContract(ctx, call, b.pendingBlock, b.pendingState)
@@ -242,21 +256,21 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs
// Reject the transaction as invalid if it still fails at the highest allowance
if hi == cap {
if !executable(hi) {
- return nil, errGasEstimationFailed
+ return 0, errGasEstimationFailed
}
}
- return new(big.Int).SetUint64(hi), nil
+ return hi, nil
}
-// callContract implemens common code between normal and pending contract calls.
+// callContract implements common code between normal and pending contract calls.
// state is modified during execution, make sure to copy it if necessary.
-func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallMsg, block *types.Block, statedb *state.StateDB) ([]byte, *big.Int, bool, error) {
+func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallMsg, block *types.Block, statedb *state.StateDB) ([]byte, uint64, bool, error) {
// Ensure message is initialized properly.
if call.GasPrice == nil {
call.GasPrice = big.NewInt(1)
}
- if call.Gas == nil || call.Gas.Sign() == 0 {
- call.Gas = big.NewInt(50000000)
+ if call.Gas == 0 {
+ call.Gas = 50000000
}
if call.Value == nil {
call.Value = new(big.Int)
@@ -271,9 +285,9 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM
// Create a new environment which holds all relevant information
// about the transaction and calling mechanisms.
vmenv := vm.NewEVM(evmContext, statedb, b.config, vm.Config{})
- gaspool := new(core.GasPool).AddGas(math.MaxBig256)
- ret, gasUsed, _, failed, err := core.NewStateTransition(vmenv, msg, gaspool).TransitionDb()
- return ret, gasUsed, failed, err
+ gaspool := new(core.GasPool).AddGas(math.MaxUint64)
+
+ return core.NewStateTransition(vmenv, msg, gaspool).TransitionDb()
}
// SendTransaction updates the pending block to include the given transaction.
@@ -291,29 +305,95 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa
panic(fmt.Errorf("invalid transaction nonce: got %d, want %d", tx.Nonce(), nonce))
}
- blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), b.database, 1, func(number int, block *core.BlockGen) {
+ blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), ethash.NewFaker(), b.database, 1, func(number int, block *core.BlockGen) {
for _, tx := range b.pendingBlock.Transactions() {
block.AddTx(tx)
}
block.AddTx(tx)
})
+ statedb, _ := b.blockchain.State()
+
b.pendingBlock = blocks[0]
- b.pendingState, _ = state.New(b.pendingBlock.Root(), state.NewDatabase(b.database))
+ b.pendingState, _ = state.New(b.pendingBlock.Root(), statedb.Database())
return nil
}
-// JumpTimeInSeconds adds skip seconds to the clock
+// FilterLogs executes a log filter operation, blocking during execution and
+// returning all the results in one batch.
+//
+// TODO(karalabe): Deprecate when the subscription one can return past data too.
+func (b *SimulatedBackend) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) {
+ // Initialize unset filter boundaried to run from genesis to chain head
+ from := int64(0)
+ if query.FromBlock != nil {
+ from = query.FromBlock.Int64()
+ }
+ to := int64(-1)
+ if query.ToBlock != nil {
+ to = query.ToBlock.Int64()
+ }
+ // Construct and execute the filter
+ filter := filters.New(&filterBackend{b.database, b.blockchain}, from, to, query.Addresses, query.Topics)
+
+ logs, err := filter.Logs(ctx)
+ if err != nil {
+ return nil, err
+ }
+ res := make([]types.Log, len(logs))
+ for i, log := range logs {
+ res[i] = *log
+ }
+ return res, nil
+}
+
+// SubscribeFilterLogs creates a background log filtering operation, returning a
+// subscription immediately, which can be used to stream the found events.
+func (b *SimulatedBackend) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) {
+ // Subscribe to contract events
+ sink := make(chan []*types.Log)
+
+ sub, err := b.events.SubscribeLogs(query, sink)
+ if err != nil {
+ return nil, err
+ }
+ // Since we're getting logs in batches, we need to flatten them into a plain stream
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case logs := <-sink:
+ for _, log := range logs {
+ select {
+ case ch <- *log:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// AdjustTime adds a time shift to the simulated clock.
func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error {
b.mu.Lock()
defer b.mu.Unlock()
- blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), b.database, 1, func(number int, block *core.BlockGen) {
+ blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), ethash.NewFaker(), b.database, 1, func(number int, block *core.BlockGen) {
for _, tx := range b.pendingBlock.Transactions() {
block.AddTx(tx)
}
block.OffsetTime(int64(adjustment.Seconds()))
})
+ statedb, _ := b.blockchain.State()
+
b.pendingBlock = blocks[0]
- b.pendingState, _ = state.New(b.pendingBlock.Root(), state.NewDatabase(b.database))
+ b.pendingState, _ = state.New(b.pendingBlock.Root(), statedb.Database())
return nil
}
@@ -328,6 +408,47 @@ func (m callmsg) Nonce() uint64 { return 0 }
func (m callmsg) CheckNonce() bool { return false }
func (m callmsg) To() *common.Address { return m.CallMsg.To }
func (m callmsg) GasPrice() *big.Int { return m.CallMsg.GasPrice }
-func (m callmsg) Gas() *big.Int { return m.CallMsg.Gas }
+func (m callmsg) Gas() uint64 { return m.CallMsg.Gas }
func (m callmsg) Value() *big.Int { return m.CallMsg.Value }
func (m callmsg) Data() []byte { return m.CallMsg.Data }
+
+// filterBackend implements filters.Backend to support filtering for logs without
+// taking bloom-bits acceleration structures into account.
+type filterBackend struct {
+ db ethdb.Database
+ bc *core.BlockChain
+}
+
+func (fb *filterBackend) ChainDb() ethdb.Database { return fb.db }
+func (fb *filterBackend) EventMux() *event.TypeMux { panic("not supported") }
+
+func (fb *filterBackend) HeaderByNumber(ctx context.Context, block rpc.BlockNumber) (*types.Header, error) {
+ if block == rpc.LatestBlockNumber {
+ return fb.bc.CurrentHeader(), nil
+ }
+ return fb.bc.GetHeaderByNumber(uint64(block.Int64())), nil
+}
+func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) {
+ return core.GetBlockReceipts(fb.db, hash, core.GetBlockNumber(fb.db, hash)), nil
+}
+
+func (fb *filterBackend) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscription {
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ <-quit
+ return nil
+ })
+}
+func (fb *filterBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {
+ return fb.bc.SubscribeChainEvent(ch)
+}
+func (fb *filterBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
+ return fb.bc.SubscribeRemovedLogsEvent(ch)
+}
+func (fb *filterBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {
+ return fb.bc.SubscribeLogsEvent(ch)
+}
+
+func (fb *filterBackend) BloomStatus() (uint64, uint64) { return 4096, 0 }
+func (fb *filterBackend) ServiceFilter(ctx context.Context, ms *bloombits.MatcherSession) {
+ panic("not supported")
+}
diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go
index b40bd65e8..83ad1c8ae 100644
--- a/accounts/abi/bind/base.go
+++ b/accounts/abi/bind/base.go
@@ -27,6 +27,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/event"
)
// SignerFn is a signer function callback when a contract requires a method to
@@ -50,11 +51,27 @@ type TransactOpts struct {
Value *big.Int // Funds to transfer along along the transaction (nil = 0 = no funds)
GasPrice *big.Int // Gas price to use for the transaction execution (nil = gas price oracle)
- GasLimit *big.Int // Gas limit to set for the transaction execution (nil = estimate + 10%)
+ GasLimit uint64 // Gas limit to set for the transaction execution (0 = estimate)
Context context.Context // Network context to support cancellation and timeouts (nil = no timeout)
}
+// FilterOpts is the collection of options to fine tune filtering for events
+// within a bound contract.
+type FilterOpts struct {
+ Start uint64 // Start of the queried range
+ End *uint64 // End of the range (nil = latest)
+
+ Context context.Context // Network context to support cancellation and timeouts (nil = no timeout)
+}
+
+// WatchOpts is the collection of options to fine tune subscribing for events
+// within a bound contract.
+type WatchOpts struct {
+ Start *uint64 // Start of the queried range (nil = latest)
+ Context context.Context // Network context to support cancellation and timeouts (nil = no timeout)
+}
+
// BoundContract is the base wrapper object that reflects a contract on the
// Ethereum network. It contains a collection of methods that are used by the
// higher level contract bindings to operate.
@@ -63,16 +80,18 @@ type BoundContract struct {
abi abi.ABI // Reflect based ABI to access the correct Ethereum methods
caller ContractCaller // Read interface to interact with the blockchain
transactor ContractTransactor // Write interface to interact with the blockchain
+ filterer ContractFilterer // Event filtering to interact with the blockchain
}
// NewBoundContract creates a low level contract interface through which calls
// and transactions may be made through.
-func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller, transactor ContractTransactor) *BoundContract {
+func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller, transactor ContractTransactor, filterer ContractFilterer) *BoundContract {
return &BoundContract{
address: address,
abi: abi,
caller: caller,
transactor: transactor,
+ filterer: filterer,
}
}
@@ -80,7 +99,7 @@ func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller
// deployment address with a Go wrapper.
func DeployContract(opts *TransactOpts, abi abi.ABI, bytecode []byte, backend ContractBackend, params ...interface{}) (common.Address, *types.Transaction, *BoundContract, error) {
// Otherwise try to deploy the contract
- c := NewBoundContract(common.Address{}, abi, backend, backend)
+ c := NewBoundContract(common.Address{}, abi, backend, backend, backend)
input, err := c.abi.Pack("", params...)
if err != nil {
@@ -189,7 +208,7 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i
}
}
gasLimit := opts.GasLimit
- if gasLimit == nil {
+ if gasLimit == 0 {
// Gas estimation cannot succeed without code for method invocations
if contract != nil {
if code, err := c.transactor.PendingCodeAt(ensureContext(opts.Context), c.address); err != nil {
@@ -225,6 +244,104 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i
return signedTx, nil
}
+// FilterLogs filters contract logs for past blocks, returning the necessary
+// channels to construct a strongly typed bound iterator on top of them.
+func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {
+ // Don't crash on a lazy user
+ if opts == nil {
+ opts = new(FilterOpts)
+ }
+ // Append the event selector to the query parameters and construct the topic set
+ query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...)
+
+ topics, err := makeTopics(query...)
+ if err != nil {
+ return nil, nil, err
+ }
+ // Start the background filtering
+ logs := make(chan types.Log, 128)
+
+ config := ethereum.FilterQuery{
+ Addresses: []common.Address{c.address},
+ Topics: topics,
+ FromBlock: new(big.Int).SetUint64(opts.Start),
+ }
+ if opts.End != nil {
+ config.ToBlock = new(big.Int).SetUint64(*opts.End)
+ }
+ /* TODO(karalabe): Replace the rest of the method below with this when supported
+ sub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs)
+ */
+ buff, err := c.filterer.FilterLogs(ensureContext(opts.Context), config)
+ if err != nil {
+ return nil, nil, err
+ }
+ sub, err := event.NewSubscription(func(quit <-chan struct{}) error {
+ for _, log := range buff {
+ select {
+ case logs <- log:
+ case <-quit:
+ return nil
+ }
+ }
+ return nil
+ }), nil
+
+ if err != nil {
+ return nil, nil, err
+ }
+ return logs, sub, nil
+}
+
+// WatchLogs filters subscribes to contract logs for future blocks, returning a
+// subscription object that can be used to tear down the watcher.
+func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {
+ // Don't crash on a lazy user
+ if opts == nil {
+ opts = new(WatchOpts)
+ }
+ // Append the event selector to the query parameters and construct the topic set
+ query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...)
+
+ topics, err := makeTopics(query...)
+ if err != nil {
+ return nil, nil, err
+ }
+ // Start the background filtering
+ logs := make(chan types.Log, 128)
+
+ config := ethereum.FilterQuery{
+ Addresses: []common.Address{c.address},
+ Topics: topics,
+ }
+ if opts.Start != nil {
+ config.FromBlock = new(big.Int).SetUint64(*opts.Start)
+ }
+ sub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs)
+ if err != nil {
+ return nil, nil, err
+ }
+ return logs, sub, nil
+}
+
+// UnpackLog unpacks a retrieved log into the provided output structure.
+func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) error {
+ if len(log.Data) > 0 {
+ if err := c.abi.Unpack(out, event, log.Data); err != nil {
+ return err
+ }
+ }
+ var indexed abi.Arguments
+ for _, arg := range c.abi.Events[event].Inputs {
+ if arg.Indexed {
+ indexed = append(indexed, arg)
+ }
+ }
+ return parseTopics(out, indexed, log.Topics[1:])
+}
+
+// ensureContext is a helper method to ensure a context is not nil, even if the
+// user specified it as such.
func ensureContext(ctx context.Context) context.Context {
if ctx == nil {
return context.TODO()
diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go
index 4dce79b77..e31b45481 100644
--- a/accounts/abi/bind/bind.go
+++ b/accounts/abi/bind/bind.go
@@ -63,10 +63,11 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
return r
}, abis[i])
- // Extract the call and transact methods, and sort them alphabetically
+ // Extract the call and transact methods; events; and sort them alphabetically
var (
calls = make(map[string]*tmplMethod)
transacts = make(map[string]*tmplMethod)
+ events = make(map[string]*tmplEvent)
)
for _, original := range evmABI.Methods {
// Normalize the method for capital cases and non-anonymous inputs/outputs
@@ -89,11 +90,33 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
}
// Append the methods to the call or transact lists
if original.Const {
- calls[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original)}
+ calls[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original.Outputs)}
} else {
- transacts[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original)}
+ transacts[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original.Outputs)}
}
}
+ for _, original := range evmABI.Events {
+ // Skip anonymous events as they don't support explicit filtering
+ if original.Anonymous {
+ continue
+ }
+ // Normalize the event for capital cases and non-anonymous outputs
+ normalized := original
+ normalized.Name = methodNormalizer[lang](original.Name)
+
+ normalized.Inputs = make([]abi.Argument, len(original.Inputs))
+ copy(normalized.Inputs, original.Inputs)
+ for j, input := range normalized.Inputs {
+ // Indexed fields are input, non-indexed ones are outputs
+ if input.Indexed {
+ if input.Name == "" {
+ normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j)
+ }
+ }
+ }
+ // Append the event to the accumulator list
+ events[original.Name] = &tmplEvent{Original: original, Normalized: normalized}
+ }
contracts[types[i]] = &tmplContract{
Type: capitalise(types[i]),
InputABI: strings.Replace(strippedABI, "\"", "\\\"", -1),
@@ -101,6 +124,7 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
Constructor: evmABI.Constructor,
Calls: calls,
Transacts: transacts,
+ Events: events,
}
}
// Generate the contract template data content and render it
@@ -111,10 +135,11 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
buffer := new(bytes.Buffer)
funcs := map[string]interface{}{
- "bindtype": bindType[lang],
- "namedtype": namedType[lang],
- "capitalise": capitalise,
- "decapitalise": decapitalise,
+ "bindtype": bindType[lang],
+ "bindtopictype": bindTopicType[lang],
+ "namedtype": namedType[lang],
+ "capitalise": capitalise,
+ "decapitalise": decapitalise,
}
tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSource[lang]))
if err := tmpl.Execute(buffer, data); err != nil {
@@ -133,7 +158,7 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
}
// bindType is a set of type binders that convert Solidity types to some supported
-// programming language.
+// programming language types.
var bindType = map[Lang]func(kind abi.Type) string{
LangGo: bindTypeGo,
LangJava: bindTypeJava,
@@ -254,6 +279,33 @@ func bindTypeJava(kind abi.Type) string {
}
}
+// bindTopicType is a set of type binders that convert Solidity types to some
+// supported programming language topic types.
+var bindTopicType = map[Lang]func(kind abi.Type) string{
+ LangGo: bindTopicTypeGo,
+ LangJava: bindTopicTypeJava,
+}
+
+// bindTypeGo converts a Solidity topic type to a Go one. It is almost the same
+// funcionality as for simple types, but dynamic types get converted to hashes.
+func bindTopicTypeGo(kind abi.Type) string {
+ bound := bindTypeGo(kind)
+ if bound == "string" || bound == "[]byte" {
+ bound = "common.Hash"
+ }
+ return bound
+}
+
+// bindTypeGo converts a Solidity topic type to a Java one. It is almost the same
+// funcionality as for simple types, but dynamic types get converted to hashes.
+func bindTopicTypeJava(kind abi.Type) string {
+ bound := bindTypeJava(kind)
+ if bound == "String" || bound == "Bytes" {
+ bound = "Hash"
+ }
+ return bound
+}
+
// namedType is a set of functions that transform language specific types to
// named versions that my be used inside method names.
var namedType = map[Lang]func(string, abi.Type) string{
@@ -304,8 +356,15 @@ var methodNormalizer = map[Lang]func(string) string{
LangJava: decapitalise,
}
-// capitalise makes the first character of a string upper case.
+// capitalise makes the first character of a string upper case, also removing any
+// prefixing underscores from the variable names.
func capitalise(input string) string {
+ for len(input) > 0 && input[0] == '_' {
+ input = input[1:]
+ }
+ if len(input) == 0 {
+ return ""
+ }
return strings.ToUpper(input[:1]) + input[1:]
}
@@ -314,16 +373,25 @@ func decapitalise(input string) string {
return strings.ToLower(input[:1]) + input[1:]
}
-// structured checks whether a method has enough information to return a proper
-// Go struct ot if flat returns are needed.
-func structured(method abi.Method) bool {
- if len(method.Outputs) < 2 {
+// structured checks whether a list of ABI data types has enough information to
+// operate through a proper Go struct or if flat returns are needed.
+func structured(args abi.Arguments) bool {
+ if len(args) < 2 {
return false
}
- for _, out := range method.Outputs {
+ exists := make(map[string]bool)
+ for _, out := range args {
+ // If the name is anonymous, we can't organize into a struct
if out.Name == "" {
return false
}
+ // If the field name is empty when normalized or collides (var, Var, _var, _Var),
+ // we can't organize into a struct
+ field := capitalise(out.Name)
+ if field == "" || exists[field] {
+ return false
+ }
+ exists[field] = true
}
return true
}
diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go
index 43ed53b92..c4838e647 100644
--- a/accounts/abi/bind/bind_test.go
+++ b/accounts/abi/bind/bind_test.go
@@ -126,6 +126,7 @@ var bindTests = []struct {
{"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]},
{"type":"function","name":"anonOutput","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"}]},
{"type":"function","name":"namedOutputs","constant":true,"inputs":[],"outputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}]},
+ {"type":"function","name":"collidingOutputs","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"},{"name":"Str","type":"string"}]},
{"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]},
{"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]}
]
@@ -140,12 +141,71 @@ var bindTests = []struct {
str1, err = b.NamedOutput(nil)
str1, err = b.AnonOutput(nil)
res, _ := b.NamedOutputs(nil)
+ str1, str2, err = b.CollidingOutputs(nil)
str1, str2, err = b.AnonOutputs(nil)
str1, str2, err = b.MixedOutputs(nil)
fmt.Println(str1, str2, res.Str1, res.Str2, err)
}`,
},
+ // Tests that named, anonymous and indexed events are handled correctly
+ {
+ `EventChecker`, ``, ``,
+ `
+ [
+ {"type":"event","name":"empty","inputs":[]},
+ {"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]},
+ {"type":"event","name":"mixed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256"}]},
+ {"type":"event","name":"anonymous","anonymous":true,"inputs":[]},
+ {"type":"event","name":"dynamic","inputs":[{"name":"idxStr","type":"string","indexed":true},{"name":"idxDat","type":"bytes","indexed":true},{"name":"str","type":"string"},{"name":"dat","type":"bytes"}]}
+ ]
+ `,
+ `if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil {
+ t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil)
+ } else if false { // Don't run, just compile and test types
+ var (
+ err error
+ res bool
+ str string
+ dat []byte
+ hash common.Hash
+ )
+ _, err = e.FilterEmpty(nil)
+ _, err = e.FilterIndexed(nil, []common.Address{}, []*big.Int{})
+
+ mit, err := e.FilterMixed(nil, []common.Address{})
+
+ res = mit.Next() // Make sure the iterator has a Next method
+ err = mit.Error() // Make sure the iterator has an Error method
+ err = mit.Close() // Make sure the iterator has a Close method
+
+ fmt.Println(mit.Event.Raw.BlockHash) // Make sure the raw log is contained within the results
+ fmt.Println(mit.Event.Num) // Make sure the unpacked non-indexed fields are present
+ fmt.Println(mit.Event.Addr) // Make sure the reconstructed indexed fields are present
+
+ dit, err := e.FilterDynamic(nil, []string{}, [][]byte{})
+
+ str = dit.Event.Str // Make sure non-indexed strings retain their type
+ dat = dit.Event.Dat // Make sure non-indexed bytes retain their type
+ hash = dit.Event.IdxStr // Make sure indexed strings turn into hashes
+ hash = dit.Event.IdxDat // Make sure indexed bytes turn into hashes
+
+ sink := make(chan *EventCheckerMixed)
+ sub, err := e.WatchMixed(nil, sink, []common.Address{})
+ defer sub.Unsubscribe()
+
+ event := <-sink
+ fmt.Println(event.Raw.BlockHash) // Make sure the raw log is contained within the results
+ fmt.Println(event.Num) // Make sure the unpacked non-indexed fields are present
+ fmt.Println(event.Addr) // Make sure the reconstructed indexed fields are present
+
+ fmt.Println(res, str, dat, hash, err)
+ }
+ // Run a tiny reflection test to ensure disallowed methods don't appear
+ if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok {
+ t.Errorf("binding has disallowed method (FilterAnonymous)")
+ }`,
+ },
// Test that contract interactions (deploy, transact and call) generate working code
{
`Interactor`,
@@ -397,7 +457,6 @@ var bindTests = []struct {
sim.Commit()
// Set the field with automatic estimation and check that it succeeds
- auth.GasLimit = nil
if _, err := limiter.SetField(auth, "automatic"); err != nil {
t.Fatalf("Failed to call automatically gased transaction: %v", err)
}
@@ -447,6 +506,237 @@ var bindTests = []struct {
}
`,
},
+ {
+ `Underscorer`,
+ `
+ contract Underscorer {
+ function UnderscoredOutput() constant returns (int _int, string _string) {
+ return (314, "pi");
+ }
+ function LowerLowerCollision() constant returns (int _res, int res) {
+ return (1, 2);
+ }
+ function LowerUpperCollision() constant returns (int _res, int Res) {
+ return (1, 2);
+ }
+ function UpperLowerCollision() constant returns (int _Res, int res) {
+ return (1, 2);
+ }
+ function UpperUpperCollision() constant returns (int _Res, int Res) {
+ return (1, 2);
+ }
+ function PurelyUnderscoredOutput() constant returns (int _, int res) {
+ return (1, 2);
+ }
+ function AllPurelyUnderscoredOutput() constant returns (int _, int __) {
+ return (1, 2);
+ }
+ }
+ `, `6060604052341561000f57600080fd5b6103498061001e6000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461008857806367e6633d146100b85780639df484851461014d578063af7486ab1461017d578063b564b34d146101ad578063e02ab24d146101dd578063e409ca451461020d575b600080fd5b341561009357600080fd5b61009b61023d565b604051808381526020018281526020019250505060405180910390f35b34156100c357600080fd5b6100cb610252565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156101115780820151818401526020810190506100f6565b50505050905090810190601f16801561013e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561015857600080fd5b6101606102a0565b604051808381526020018281526020019250505060405180910390f35b341561018857600080fd5b6101906102b5565b604051808381526020018281526020019250505060405180910390f35b34156101b857600080fd5b6101c06102ca565b604051808381526020018281526020019250505060405180910390f35b34156101e857600080fd5b6101f06102df565b604051808381526020018281526020019250505060405180910390f35b341561021857600080fd5b6102206102f4565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600061025c610309565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820c11dcfa136fc7d182ee4d34f0b12d988496228f7e2d02d2b5376d996ca1743d00029`,
+ `[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
+ `
+ // Generate a new random account and a funded simulator
+ key, _ := crypto.GenerateKey()
+ auth := bind.NewKeyedTransactor(key)
+ sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}})
+
+ // Deploy a underscorer tester contract and execute a structured call on it
+ _, _, underscorer, err := DeployUnderscorer(auth, sim)
+ if err != nil {
+ t.Fatalf("Failed to deploy underscorer contract: %v", err)
+ }
+ sim.Commit()
+
+ // Verify that underscored return values correctly parse into structs
+ if res, err := underscorer.UnderscoredOutput(nil); err != nil {
+ t.Errorf("Failed to call constant function: %v", err)
+ } else if res.Int.Cmp(big.NewInt(314)) != 0 || res.String != "pi" {
+ t.Errorf("Invalid result, want: {314, \"pi\"}, got: %+v", res)
+ }
+ // Verify that underscored and non-underscored name collisions force tuple outputs
+ var a, b *big.Int
+
+ a, b, _ = underscorer.LowerLowerCollision(nil)
+ a, b, _ = underscorer.LowerUpperCollision(nil)
+ a, b, _ = underscorer.UpperLowerCollision(nil)
+ a, b, _ = underscorer.UpperUpperCollision(nil)
+ a, b, _ = underscorer.PurelyUnderscoredOutput(nil)
+ a, b, _ = underscorer.AllPurelyUnderscoredOutput(nil)
+
+ fmt.Println(a, b, err)
+ `,
+ },
+ // Tests that logs can be successfully filtered and decoded.
+ {
+ `Eventer`,
+ `
+ contract Eventer {
+ event SimpleEvent (
+ address indexed Addr,
+ bytes32 indexed Id,
+ bool indexed Flag,
+ uint Value
+ );
+ function raiseSimpleEvent(address addr, bytes32 id, bool flag, uint value) {
+ SimpleEvent(addr, id, flag, value);
+ }
+
+ event NodataEvent (
+ uint indexed Number,
+ int16 indexed Short,
+ uint32 indexed Long
+ );
+ function raiseNodataEvent(uint number, int16 short, uint32 long) {
+ NodataEvent(number, short, long);
+ }
+
+ event DynamicEvent (
+ string indexed IndexedString,
+ bytes indexed IndexedBytes,
+ string NonIndexedString,
+ bytes NonIndexedBytes
+ );
+ function raiseDynamicEvent(string str, bytes blob) {
+ DynamicEvent(str, blob, str, blob);
+ }
+ }
+ `,
+ `6060604052341561000f57600080fd5b61042c8061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063528300ff1461005c578063630c31e2146100fc578063c7d116dd14610156575b600080fd5b341561006757600080fd5b6100fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610194565b005b341561010757600080fd5b610154600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080351515906020019091908035906020019091905050610367565b005b341561016157600080fd5b610192600480803590602001909190803560010b90602001909190803563ffffffff169060200190919050506103c3565b005b806040518082805190602001908083835b6020831015156101ca57805182526020820191506020810190506020830392506101a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020826040518082805190602001908083835b60208310151561022d5780518252602082019150602081019050602083039250610208565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156102c15780820151818401526020810190506102a6565b50505050905090810190601f1680156102ee5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561032757808201518184015260208101905061030c565b50505050905090810190601f1680156103545780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b81151583600019168573ffffffffffffffffffffffffffffffffffffffff167f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8846040518082815260200191505060405180910390a450505050565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820d1f8a8bbddbc5bb29f285891d6ae1eef8420c52afdc05e1573f6114d8e1714710029`,
+ `[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"}]`,
+ `
+ // Generate a new random account and a funded simulator
+ key, _ := crypto.GenerateKey()
+ auth := bind.NewKeyedTransactor(key)
+ sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}})
+
+ // Deploy an eventer contract
+ _, _, eventer, err := DeployEventer(auth, sim)
+ if err != nil {
+ t.Fatalf("Failed to deploy eventer contract: %v", err)
+ }
+ sim.Commit()
+
+ // Inject a few events into the contract, gradually more in each block
+ for i := 1; i <= 3; i++ {
+ for j := 1; j <= i; j++ {
+ if _, err := eventer.RaiseSimpleEvent(auth, common.Address{byte(j)}, [32]byte{byte(j)}, true, big.NewInt(int64(10*i+j))); err != nil {
+ t.Fatalf("block %d, event %d: raise failed: %v", i, j, err)
+ }
+ }
+ sim.Commit()
+ }
+ // Test filtering for certain events and ensure they can be found
+ sit, err := eventer.FilterSimpleEvent(nil, []common.Address{common.Address{1}, common.Address{3}}, [][32]byte{{byte(1)}, {byte(2)}, {byte(3)}}, []bool{true})
+ if err != nil {
+ t.Fatalf("failed to filter for simple events: %v", err)
+ }
+ defer sit.Close()
+
+ sit.Next()
+ if sit.Event.Value.Uint64() != 11 || !sit.Event.Flag {
+ t.Errorf("simple log content mismatch: have %v, want {11, true}", sit.Event)
+ }
+ sit.Next()
+ if sit.Event.Value.Uint64() != 21 || !sit.Event.Flag {
+ t.Errorf("simple log content mismatch: have %v, want {21, true}", sit.Event)
+ }
+ sit.Next()
+ if sit.Event.Value.Uint64() != 31 || !sit.Event.Flag {
+ t.Errorf("simple log content mismatch: have %v, want {31, true}", sit.Event)
+ }
+ sit.Next()
+ if sit.Event.Value.Uint64() != 33 || !sit.Event.Flag {
+ t.Errorf("simple log content mismatch: have %v, want {33, true}", sit.Event)
+ }
+
+ if sit.Next() {
+ t.Errorf("unexpected simple event found: %+v", sit.Event)
+ }
+ if err = sit.Error(); err != nil {
+ t.Fatalf("simple event iteration failed: %v", err)
+ }
+ // Test raising and filtering for an event with no data component
+ if _, err := eventer.RaiseNodataEvent(auth, big.NewInt(314), 141, 271); err != nil {
+ t.Fatalf("failed to raise nodata event: %v", err)
+ }
+ sim.Commit()
+
+ nit, err := eventer.FilterNodataEvent(nil, []*big.Int{big.NewInt(314)}, []int16{140, 141, 142}, []uint32{271})
+ if err != nil {
+ t.Fatalf("failed to filter for nodata events: %v", err)
+ }
+ defer nit.Close()
+
+ if !nit.Next() {
+ t.Fatalf("nodata log not found: %v", nit.Error())
+ }
+ if nit.Event.Number.Uint64() != 314 {
+ t.Errorf("nodata log content mismatch: have %v, want 314", nit.Event.Number)
+ }
+ if nit.Next() {
+ t.Errorf("unexpected nodata event found: %+v", nit.Event)
+ }
+ if err = nit.Error(); err != nil {
+ t.Fatalf("nodata event iteration failed: %v", err)
+ }
+ // Test raising and filtering for events with dynamic indexed components
+ if _, err := eventer.RaiseDynamicEvent(auth, "Hello", []byte("World")); err != nil {
+ t.Fatalf("failed to raise dynamic event: %v", err)
+ }
+ sim.Commit()
+
+ dit, err := eventer.FilterDynamicEvent(nil, []string{"Hi", "Hello", "Bye"}, [][]byte{[]byte("World")})
+ if err != nil {
+ t.Fatalf("failed to filter for dynamic events: %v", err)
+ }
+ defer dit.Close()
+
+ if !dit.Next() {
+ t.Fatalf("dynamic log not found: %v", dit.Error())
+ }
+ if dit.Event.NonIndexedString != "Hello" || string(dit.Event.NonIndexedBytes) != "World" || dit.Event.IndexedString != common.HexToHash("0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2") || dit.Event.IndexedBytes != common.HexToHash("0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18") {
+ t.Errorf("dynamic log content mismatch: have %v, want {'0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2, '0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18', 'Hello', 'World'}", dit.Event)
+ }
+ if dit.Next() {
+ t.Errorf("unexpected dynamic event found: %+v", dit.Event)
+ }
+ if err = dit.Error(); err != nil {
+ t.Fatalf("dynamic event iteration failed: %v", err)
+ }
+ // Test subscribing to an event and raising it afterwards
+ ch := make(chan *EventerSimpleEvent, 16)
+ sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil)
+ if err != nil {
+ t.Fatalf("failed to subscribe to simple events: %v", err)
+ }
+ if _, err := eventer.RaiseSimpleEvent(auth, common.Address{255}, [32]byte{255}, true, big.NewInt(255)); err != nil {
+ t.Fatalf("failed to raise subscribed simple event: %v", err)
+ }
+ sim.Commit()
+
+ select {
+ case event := <-ch:
+ if event.Value.Uint64() != 255 {
+ t.Errorf("simple log content mismatch: have %v, want 255", event)
+ }
+ case <-time.After(250 * time.Millisecond):
+ t.Fatalf("subscribed simple event didn't arrive")
+ }
+ // Unsubscribe from the event and make sure we're not delivered more
+ sub.Unsubscribe()
+
+ if _, err := eventer.RaiseSimpleEvent(auth, common.Address{254}, [32]byte{254}, true, big.NewInt(254)); err != nil {
+ t.Fatalf("failed to raise subscribed simple event: %v", err)
+ }
+ sim.Commit()
+
+ select {
+ case event := <-ch:
+ t.Fatalf("unsubscribed simple event arrived: %v", event)
+ case <-time.After(250 * time.Millisecond):
+ }
+ `,
+ },
}
// Tests that packages generated by the binder can be successfully compiled and
@@ -498,7 +788,7 @@ func TestBindings(t *testing.T) {
}
}
// Test the entire package and report any failures
- cmd := exec.Command(gocmd, "test", "-v")
+ cmd := exec.Command(gocmd, "test", "-v", "-count", "1")
cmd.Dir = pkg
if out, err := cmd.CombinedOutput(); err != nil {
t.Fatalf("failed to run binding test: %v\n%s", err, out)
diff --git a/accounts/abi/bind/template.go b/accounts/abi/bind/template.go
index d07610e7c..7202ee67a 100644
--- a/accounts/abi/bind/template.go
+++ b/accounts/abi/bind/template.go
@@ -32,6 +32,7 @@ type tmplContract struct {
Constructor abi.Method // Contract constructor for deploy parametrization
Calls map[string]*tmplMethod // Contract calls that only read state data
Transacts map[string]*tmplMethod // Contract calls that write state data
+ Events map[string]*tmplEvent // Contract events accessors
}
// tmplMethod is a wrapper around an abi.Method that contains a few preprocessed
@@ -39,7 +40,13 @@ type tmplContract struct {
type tmplMethod struct {
Original abi.Method // Original method as parsed by the abi package
Normalized abi.Method // Normalized version of the parsed method (capitalized names, non-anonymous args/returns)
- Structured bool // Whether the returns should be accumulated into a contract
+ Structured bool // Whether the returns should be accumulated into a struct
+}
+
+// tmplEvent is a wrapper around an a
+type tmplEvent struct {
+ Original abi.Event // Original event as parsed by the abi package
+ Normalized abi.Event // Normalized version of the parsed fields
}
// tmplSource is language to template mapping containing all the supported
@@ -75,7 +82,7 @@ package {{.Package}}
if err != nil {
return common.Address{}, nil, nil, err
}
- return address, tx, &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract} }, nil
+ return address, tx, &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract}, {{.Type}}Filterer: {{.Type}}Filterer{contract: contract} }, nil
}
{{end}}
@@ -83,6 +90,7 @@ package {{.Package}}
type {{.Type}} struct {
{{.Type}}Caller // Read-only binding to the contract
{{.Type}}Transactor // Write-only binding to the contract
+ {{.Type}}Filterer // Log filterer for contract events
}
// {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract.
@@ -95,6 +103,11 @@ package {{.Package}}
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
+ // {{.Type}}Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+ type {{.Type}}Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+ }
+
// {{.Type}}Session is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type {{.Type}}Session struct {
@@ -134,16 +147,16 @@ package {{.Package}}
// New{{.Type}} creates a new instance of {{.Type}}, bound to a specific deployed contract.
func New{{.Type}}(address common.Address, backend bind.ContractBackend) (*{{.Type}}, error) {
- contract, err := bind{{.Type}}(address, backend, backend)
+ contract, err := bind{{.Type}}(address, backend, backend, backend)
if err != nil {
return nil, err
}
- return &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract} }, nil
+ return &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract}, {{.Type}}Filterer: {{.Type}}Filterer{contract: contract} }, nil
}
// New{{.Type}}Caller creates a new read-only instance of {{.Type}}, bound to a specific deployed contract.
func New{{.Type}}Caller(address common.Address, caller bind.ContractCaller) (*{{.Type}}Caller, error) {
- contract, err := bind{{.Type}}(address, caller, nil)
+ contract, err := bind{{.Type}}(address, caller, nil, nil)
if err != nil {
return nil, err
}
@@ -152,20 +165,29 @@ package {{.Package}}
// New{{.Type}}Transactor creates a new write-only instance of {{.Type}}, bound to a specific deployed contract.
func New{{.Type}}Transactor(address common.Address, transactor bind.ContractTransactor) (*{{.Type}}Transactor, error) {
- contract, err := bind{{.Type}}(address, nil, transactor)
+ contract, err := bind{{.Type}}(address, nil, transactor, nil)
if err != nil {
return nil, err
}
return &{{.Type}}Transactor{contract: contract}, nil
}
+ // New{{.Type}}Filterer creates a new log filterer instance of {{.Type}}, bound to a specific deployed contract.
+ func New{{.Type}}Filterer(address common.Address, filterer bind.ContractFilterer) (*{{.Type}}Filterer, error) {
+ contract, err := bind{{.Type}}(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &{{.Type}}Filterer{contract: contract}, nil
+ }
+
// bind{{.Type}} binds a generic wrapper to an already deployed contract.
- func bind{{.Type}}(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
+ func bind{{.Type}}(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI))
if err != nil {
return nil, err
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
+ return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}
// Call invokes the (constant) contract method with params as input values and
@@ -263,6 +285,137 @@ package {{.Package}}
return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}})
}
{{end}}
+
+ {{range .Events}}
+ // {{$contract.Type}}{{.Normalized.Name}}Iterator is returned from Filter{{.Normalized.Name}} and is used to iterate over the raw logs and unpacked data for {{.Normalized.Name}} events raised by the {{$contract.Type}} contract.
+ type {{$contract.Type}}{{.Normalized.Name}}Iterator struct {
+ Event *{{$contract.Type}}{{.Normalized.Name}} // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+ }
+ // Next advances the iterator to the subsequent event, returning whether there
+ // are any more events found. In case of a retrieval or parsing error, false is
+ // returned and Error() can be queried for the exact failure.
+ func (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if (it.fail != nil) {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if (it.done) {
+ select {
+ case log := <-it.logs:
+ it.Event = new({{$contract.Type}}{{.Normalized.Name}})
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new({{$contract.Type}}{{.Normalized.Name}})
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+ }
+ // Error returns any retrieval or parsing error occurred during filtering.
+ func (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Error() error {
+ return it.fail
+ }
+ // Close terminates the iteration process, releasing any pending underlying
+ // resources.
+ func (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+ }
+
+ // {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract.
+ type {{$contract.Type}}{{.Normalized.Name}} struct { {{range .Normalized.Inputs}}
+ {{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type}}{{else}}{{bindtype .Type}}{{end}}; {{end}}
+ Raw types.Log // Blockchain specific contextual infos
+ }
+
+ // Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.Id}}.
+ //
+ // Solidity: {{.Original.String}}
+ func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) {
+ {{range .Normalized.Inputs}}
+ {{if .Indexed}}var {{.Name}}Rule []interface{}
+ for _, {{.Name}}Item := range {{.Name}} {
+ {{.Name}}Rule = append({{.Name}}Rule, {{.Name}}Item)
+ }{{end}}{{end}}
+
+ logs, sub, err := _{{$contract.Type}}.contract.FilterLogs(opts, "{{.Original.Name}}"{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}}Rule{{end}}{{end}})
+ if err != nil {
+ return nil, err
+ }
+ return &{{$contract.Type}}{{.Normalized.Name}}Iterator{contract: _{{$contract.Type}}.contract, event: "{{.Original.Name}}", logs: logs, sub: sub}, nil
+ }
+
+ // Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.Id}}.
+ //
+ // Solidity: {{.Original.String}}
+ func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type}}{{end}}{{end}}) (event.Subscription, error) {
+ {{range .Normalized.Inputs}}
+ {{if .Indexed}}var {{.Name}}Rule []interface{}
+ for _, {{.Name}}Item := range {{.Name}} {
+ {{.Name}}Rule = append({{.Name}}Rule, {{.Name}}Item)
+ }{{end}}{{end}}
+
+ logs, sub, err := _{{$contract.Type}}.contract.WatchLogs(opts, "{{.Original.Name}}"{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}}Rule{{end}}{{end}})
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new({{$contract.Type}}{{.Normalized.Name}})
+ if err := _{{$contract.Type}}.contract.UnpackLog(event, "{{.Original.Name}}", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+ }
+ {{end}}
{{end}}
`
diff --git a/accounts/abi/bind/topics.go b/accounts/abi/bind/topics.go
new file mode 100644
index 000000000..600dfcda9
--- /dev/null
+++ b/accounts/abi/bind/topics.go
@@ -0,0 +1,189 @@
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package bind
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "reflect"
+
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
+)
+
+// makeTopics converts a filter query argument list into a filter topic set.
+func makeTopics(query ...[]interface{}) ([][]common.Hash, error) {
+ topics := make([][]common.Hash, len(query))
+ for i, filter := range query {
+ for _, rule := range filter {
+ var topic common.Hash
+
+ // Try to generate the topic based on simple types
+ switch rule := rule.(type) {
+ case common.Hash:
+ copy(topic[:], rule[:])
+ case common.Address:
+ copy(topic[common.HashLength-common.AddressLength:], rule[:])
+ case *big.Int:
+ blob := rule.Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case bool:
+ if rule {
+ topic[common.HashLength-1] = 1
+ }
+ case int8:
+ blob := big.NewInt(int64(rule)).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case int16:
+ blob := big.NewInt(int64(rule)).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case int32:
+ blob := big.NewInt(int64(rule)).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case int64:
+ blob := big.NewInt(rule).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case uint8:
+ blob := new(big.Int).SetUint64(uint64(rule)).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case uint16:
+ blob := new(big.Int).SetUint64(uint64(rule)).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case uint32:
+ blob := new(big.Int).SetUint64(uint64(rule)).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case uint64:
+ blob := new(big.Int).SetUint64(rule).Bytes()
+ copy(topic[common.HashLength-len(blob):], blob)
+ case string:
+ hash := crypto.Keccak256Hash([]byte(rule))
+ copy(topic[:], hash[:])
+ case []byte:
+ hash := crypto.Keccak256Hash(rule)
+ copy(topic[:], hash[:])
+
+ default:
+ // Attempt to generate the topic from funky types
+ val := reflect.ValueOf(rule)
+
+ switch {
+ case val.Kind() == reflect.Array && reflect.TypeOf(rule).Elem().Kind() == reflect.Uint8:
+ reflect.Copy(reflect.ValueOf(topic[common.HashLength-val.Len():]), val)
+
+ default:
+ return nil, fmt.Errorf("unsupported indexed type: %T", rule)
+ }
+ }
+ topics[i] = append(topics[i], topic)
+ }
+ }
+ return topics, nil
+}
+
+// Big batch of reflect types for topic reconstruction.
+var (
+ reflectHash = reflect.TypeOf(common.Hash{})
+ reflectAddress = reflect.TypeOf(common.Address{})
+ reflectBigInt = reflect.TypeOf(new(big.Int))
+)
+
+// parseTopics converts the indexed topic fields into actual log field values.
+//
+// Note, dynamic types cannot be reconstructed since they get mapped to Keccak256
+// hashes as the topic value!
+func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) error {
+ // Sanity check that the fields and topics match up
+ if len(fields) != len(topics) {
+ return errors.New("topic/field count mismatch")
+ }
+ // Iterate over all the fields and reconstruct them from topics
+ for _, arg := range fields {
+ if !arg.Indexed {
+ return errors.New("non-indexed field in topic reconstruction")
+ }
+ field := reflect.ValueOf(out).Elem().FieldByName(capitalise(arg.Name))
+
+ // Try to parse the topic back into the fields based on primitive types
+ switch field.Kind() {
+ case reflect.Bool:
+ if topics[0][common.HashLength-1] == 1 {
+ field.Set(reflect.ValueOf(true))
+ }
+ case reflect.Int8:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(int8(num.Int64())))
+
+ case reflect.Int16:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(int16(num.Int64())))
+
+ case reflect.Int32:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(int32(num.Int64())))
+
+ case reflect.Int64:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(num.Int64()))
+
+ case reflect.Uint8:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(uint8(num.Uint64())))
+
+ case reflect.Uint16:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(uint16(num.Uint64())))
+
+ case reflect.Uint32:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(uint32(num.Uint64())))
+
+ case reflect.Uint64:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(num.Uint64()))
+
+ default:
+ // Ran out of plain primitive types, try custom types
+ switch field.Type() {
+ case reflectHash: // Also covers all dynamic types
+ field.Set(reflect.ValueOf(topics[0]))
+
+ case reflectAddress:
+ var addr common.Address
+ copy(addr[:], topics[0][common.HashLength-common.AddressLength:])
+ field.Set(reflect.ValueOf(addr))
+
+ case reflectBigInt:
+ num := new(big.Int).SetBytes(topics[0][:])
+ field.Set(reflect.ValueOf(num))
+
+ default:
+ // Ran out of custom types, try the crazies
+ switch {
+ case arg.Type.T == abi.FixedBytesTy:
+ reflect.Copy(field, reflect.ValueOf(topics[0][common.HashLength-arg.Type.Size:]))
+
+ default:
+ return fmt.Errorf("unsupported indexed type: %v", arg.Type)
+ }
+ }
+ }
+ topics = topics[1:]
+ }
+ return nil
+}
diff --git a/accounts/abi/bind/util_test.go b/accounts/abi/bind/util_test.go
index d24aa721e..49e6dc813 100644
--- a/accounts/abi/bind/util_test.go
+++ b/accounts/abi/bind/util_test.go
@@ -34,18 +34,18 @@ var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d
var waitDeployedTests = map[string]struct {
code string
- gas *big.Int
+ gas uint64
wantAddress common.Address
wantErr error
}{
"successful deploy": {
code: `6060604052600a8060106000396000f360606040526008565b00`,
- gas: big.NewInt(3000000),
+ gas: 3000000,
wantAddress: common.HexToAddress("0x3a220f351252089d385b29beca14e27f204c296a"),
},
"empty code": {
code: ``,
- gas: big.NewInt(300000),
+ gas: 300000,
wantErr: bind.ErrNoCodeAfterDeploy,
wantAddress: common.HexToAddress("0x3a220f351252089d385b29beca14e27f204c296a"),
},
diff --git a/accounts/abi/event.go b/accounts/abi/event.go
index 44ed7b8df..595f169f3 100644
--- a/accounts/abi/event.go
+++ b/accounts/abi/event.go
@@ -18,7 +18,6 @@ package abi
import (
"fmt"
- "reflect"
"strings"
"github.com/ethereum/go-ethereum/common"
@@ -31,7 +30,18 @@ import (
type Event struct {
Name string
Anonymous bool
- Inputs []Argument
+ Inputs Arguments
+}
+
+func (event Event) String() string {
+ inputs := make([]string, len(event.Inputs))
+ for i, input := range event.Inputs {
+ inputs[i] = fmt.Sprintf("%v %v", input.Name, input.Type)
+ if input.Indexed {
+ inputs[i] = fmt.Sprintf("%v indexed %v", input.Name, input.Type)
+ }
+ }
+ return fmt.Sprintf("event %v(%v)", event.Name, strings.Join(inputs, ", "))
}
// Id returns the canonical representation of the event's signature used by the
@@ -45,93 +55,3 @@ func (e Event) Id() common.Hash {
}
return common.BytesToHash(crypto.Keccak256([]byte(fmt.Sprintf("%v(%v)", e.Name, strings.Join(types, ",")))))
}
-
-// unpacks an event return tuple into a struct of corresponding go types
-//
-// Unpacking can be done into a struct or a slice/array.
-func (e Event) tupleUnpack(v interface{}, output []byte) error {
- // make sure the passed value is a pointer
- valueOf := reflect.ValueOf(v)
- if reflect.Ptr != valueOf.Kind() {
- return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
- }
-
- var (
- value = valueOf.Elem()
- typ = value.Type()
- )
-
- if value.Kind() != reflect.Struct {
- return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ)
- }
-
- j := 0
- for i := 0; i < len(e.Inputs); i++ {
- input := e.Inputs[i]
- if input.Indexed {
- // can't read, continue
- continue
- } else if input.Type.T == ArrayTy {
- // need to move this up because they read sequentially
- j += input.Type.Size
- }
- marshalledValue, err := toGoType((i+j)*32, input.Type, output)
- if err != nil {
- return err
- }
- reflectValue := reflect.ValueOf(marshalledValue)
-
- switch value.Kind() {
- case reflect.Struct:
- for j := 0; j < typ.NumField(); j++ {
- field := typ.Field(j)
- // TODO read tags: `abi:"fieldName"`
- if field.Name == strings.ToUpper(e.Inputs[i].Name[:1])+e.Inputs[i].Name[1:] {
- if err := set(value.Field(j), reflectValue, e.Inputs[i]); err != nil {
- return err
- }
- }
- }
- case reflect.Slice, reflect.Array:
- if value.Len() < i {
- return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(e.Inputs), value.Len())
- }
- v := value.Index(i)
- if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface {
- return fmt.Errorf("abi: cannot unmarshal %v in to %v", v.Type(), reflectValue.Type())
- }
- reflectValue := reflect.ValueOf(marshalledValue)
- if err := set(v.Elem(), reflectValue, e.Inputs[i]); err != nil {
- return err
- }
- default:
- return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ)
- }
- }
- return nil
-}
-
-func (e Event) isTupleReturn() bool { return len(e.Inputs) > 1 }
-
-func (e Event) singleUnpack(v interface{}, output []byte) error {
- // make sure the passed value is a pointer
- valueOf := reflect.ValueOf(v)
- if reflect.Ptr != valueOf.Kind() {
- return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
- }
-
- if e.Inputs[0].Indexed {
- return fmt.Errorf("abi: attempting to unpack indexed variable into element.")
- }
-
- value := valueOf.Elem()
-
- marshalledValue, err := toGoType(0, e.Inputs[0].Type, output)
- if err != nil {
- return err
- }
- if err := set(value, reflect.ValueOf(marshalledValue), e.Inputs[0]); err != nil {
- return err
- }
- return nil
-}
diff --git a/accounts/abi/event_test.go b/accounts/abi/event_test.go
index 7e2f13f76..cca61e433 100644
--- a/accounts/abi/event_test.go
+++ b/accounts/abi/event_test.go
@@ -17,13 +17,53 @@
package abi
import (
+ "bytes"
+ "encoding/hex"
+ "encoding/json"
+ "math/big"
+ "reflect"
"strings"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
+var jsonEventTransfer = []byte(`{
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true, "name": "from", "type": "address"
+ }, {
+ "indexed": true, "name": "to", "type": "address"
+ }, {
+ "indexed": false, "name": "value", "type": "uint256"
+ }],
+ "name": "Transfer",
+ "type": "event"
+}`)
+
+var jsonEventPledge = []byte(`{
+ "anonymous": false,
+ "inputs": [{
+ "indexed": false, "name": "who", "type": "address"
+ }, {
+ "indexed": false, "name": "wad", "type": "uint128"
+ }, {
+ "indexed": false, "name": "currency", "type": "bytes3"
+ }],
+ "name": "Pledge",
+ "type": "event"
+}`)
+
+// 1000000
+var transferData1 = "00000000000000000000000000000000000000000000000000000000000f4240"
+
+// "0x00Ce0d46d924CC8437c806721496599FC3FFA268", 2218516807680, "usd"
+var pledgeData1 = "00000000000000000000000000ce0d46d924cc8437c806721496599fc3ffa2680000000000000000000000000000000000000000000000000000020489e800007573640000000000000000000000000000000000000000000000000000000000"
+
func TestEventId(t *testing.T) {
var table = []struct {
definition string
@@ -54,3 +94,223 @@ func TestEventId(t *testing.T) {
}
}
}
+
+// TestEventMultiValueWithArrayUnpack verifies that array fields will be counted after parsing array.
+func TestEventMultiValueWithArrayUnpack(t *testing.T) {
+ definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": false, "name":"value1", "type":"uint8[2]"},{"indexed": false, "name":"value2", "type":"uint8"}]}]`
+ type testStruct struct {
+ Value1 [2]uint8
+ Value2 uint8
+ }
+ abi, err := JSON(strings.NewReader(definition))
+ require.NoError(t, err)
+ var b bytes.Buffer
+ var i uint8 = 1
+ for ; i <= 3; i++ {
+ b.Write(packNum(reflect.ValueOf(i)))
+ }
+ var rst testStruct
+ require.NoError(t, abi.Unpack(&rst, "test", b.Bytes()))
+ require.Equal(t, [2]uint8{1, 2}, rst.Value1)
+ require.Equal(t, uint8(3), rst.Value2)
+}
+
+func TestEventTupleUnpack(t *testing.T) {
+
+ type EventTransfer struct {
+ Value *big.Int
+ }
+
+ type EventPledge struct {
+ Who common.Address
+ Wad *big.Int
+ Currency [3]byte
+ }
+
+ type BadEventPledge struct {
+ Who string
+ Wad int
+ Currency [3]byte
+ }
+
+ bigint := new(big.Int)
+ bigintExpected := big.NewInt(1000000)
+ bigintExpected2 := big.NewInt(2218516807680)
+ addr := common.HexToAddress("0x00Ce0d46d924CC8437c806721496599FC3FFA268")
+ var testCases = []struct {
+ data string
+ dest interface{}
+ expected interface{}
+ jsonLog []byte
+ error string
+ name string
+ }{{
+ transferData1,
+ &EventTransfer{},
+ &EventTransfer{Value: bigintExpected},
+ jsonEventTransfer,
+ "",
+ "Can unpack ERC20 Transfer event into structure",
+ }, {
+ transferData1,
+ &[]interface{}{&bigint},
+ &[]interface{}{&bigintExpected},
+ jsonEventTransfer,
+ "",
+ "Can unpack ERC20 Transfer event into slice",
+ }, {
+ pledgeData1,
+ &EventPledge{},
+ &EventPledge{
+ addr,
+ bigintExpected2,
+ [3]byte{'u', 's', 'd'}},
+ jsonEventPledge,
+ "",
+ "Can unpack Pledge event into structure",
+ }, {
+ pledgeData1,
+ &[]interface{}{&common.Address{}, &bigint, &[3]byte{}},
+ &[]interface{}{
+ &addr,
+ &bigintExpected2,
+ &[3]byte{'u', 's', 'd'}},
+ jsonEventPledge,
+ "",
+ "Can unpack Pledge event into slice",
+ }, {
+ pledgeData1,
+ &[3]interface{}{&common.Address{}, &bigint, &[3]byte{}},
+ &[3]interface{}{
+ &addr,
+ &bigintExpected2,
+ &[3]byte{'u', 's', 'd'}},
+ jsonEventPledge,
+ "",
+ "Can unpack Pledge event into an array",
+ }, {
+ pledgeData1,
+ &[]interface{}{new(int), 0, 0},
+ &[]interface{}{},
+ jsonEventPledge,
+ "abi: cannot unmarshal common.Address in to int",
+ "Can not unpack Pledge event into slice with wrong types",
+ }, {
+ pledgeData1,
+ &BadEventPledge{},
+ &BadEventPledge{},
+ jsonEventPledge,
+ "abi: cannot unmarshal common.Address in to string",
+ "Can not unpack Pledge event into struct with wrong filed types",
+ }, {
+ pledgeData1,
+ &[]interface{}{common.Address{}, new(big.Int)},
+ &[]interface{}{},
+ jsonEventPledge,
+ "abi: insufficient number of elements in the list/array for unpack, want 3, got 2",
+ "Can not unpack Pledge event into too short slice",
+ }, {
+ pledgeData1,
+ new(map[string]interface{}),
+ &[]interface{}{},
+ jsonEventPledge,
+ "abi: cannot unmarshal tuple into map[string]interface {}",
+ "Can not unpack Pledge event into map",
+ }}
+
+ for _, tc := range testCases {
+ assert := assert.New(t)
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ err := unpackTestEventData(tc.dest, tc.data, tc.jsonLog, assert)
+ if tc.error == "" {
+ assert.Nil(err, "Should be able to unpack event data.")
+ assert.Equal(tc.expected, tc.dest, tc.name)
+ } else {
+ assert.EqualError(err, tc.error)
+ }
+ })
+ }
+}
+
+func unpackTestEventData(dest interface{}, hexData string, jsonEvent []byte, assert *assert.Assertions) error {
+ data, err := hex.DecodeString(hexData)
+ assert.NoError(err, "Hex data should be a correct hex-string")
+ var e Event
+ assert.NoError(json.Unmarshal(jsonEvent, &e), "Should be able to unmarshal event ABI")
+ a := ABI{Events: map[string]Event{"e": e}}
+ return a.Unpack(dest, "e", data)
+}
+
+/*
+Taken from
+https://github.com/ethereum/go-ethereum/pull/15568
+*/
+
+type testResult struct {
+ Values [2]*big.Int
+ Value1 *big.Int
+ Value2 *big.Int
+}
+
+type testCase struct {
+ definition string
+ want testResult
+}
+
+func (tc testCase) encoded(intType, arrayType Type) []byte {
+ var b bytes.Buffer
+ if tc.want.Value1 != nil {
+ val, _ := intType.pack(reflect.ValueOf(tc.want.Value1))
+ b.Write(val)
+ }
+
+ if !reflect.DeepEqual(tc.want.Values, [2]*big.Int{nil, nil}) {
+ val, _ := arrayType.pack(reflect.ValueOf(tc.want.Values))
+ b.Write(val)
+ }
+ if tc.want.Value2 != nil {
+ val, _ := intType.pack(reflect.ValueOf(tc.want.Value2))
+ b.Write(val)
+ }
+ return b.Bytes()
+}
+
+// TestEventUnpackIndexed verifies that indexed field will be skipped by event decoder.
+func TestEventUnpackIndexed(t *testing.T) {
+ definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": true, "name":"value1", "type":"uint8"},{"indexed": false, "name":"value2", "type":"uint8"}]}]`
+ type testStruct struct {
+ Value1 uint8
+ Value2 uint8
+ }
+ abi, err := JSON(strings.NewReader(definition))
+ require.NoError(t, err)
+ var b bytes.Buffer
+ b.Write(packNum(reflect.ValueOf(uint8(8))))
+ var rst testStruct
+ require.NoError(t, abi.Unpack(&rst, "test", b.Bytes()))
+ require.Equal(t, uint8(0), rst.Value1)
+ require.Equal(t, uint8(8), rst.Value2)
+}
+
+// TestEventIndexedWithArrayUnpack verifies that decoder will not overlow when static array is indexed input.
+func TestEventIndexedWithArrayUnpack(t *testing.T) {
+ definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": true, "name":"value1", "type":"uint8[2]"},{"indexed": false, "name":"value2", "type":"string"}]}]`
+ type testStruct struct {
+ Value1 [2]uint8
+ Value2 string
+ }
+ abi, err := JSON(strings.NewReader(definition))
+ require.NoError(t, err)
+ var b bytes.Buffer
+ stringOut := "abc"
+ // number of fields that will be encoded * 32
+ b.Write(packNum(reflect.ValueOf(32)))
+ b.Write(packNum(reflect.ValueOf(len(stringOut))))
+ b.Write(common.RightPadBytes([]byte(stringOut), 32))
+
+ var rst testStruct
+ require.NoError(t, abi.Unpack(&rst, "test", b.Bytes()))
+ require.Equal(t, [2]uint8{0, 0}, rst.Value1)
+ require.Equal(t, stringOut, rst.Value2)
+}
diff --git a/accounts/abi/method.go b/accounts/abi/method.go
index d8838e9ed..f434ffdbe 100644
--- a/accounts/abi/method.go
+++ b/accounts/abi/method.go
@@ -18,13 +18,12 @@ package abi
import (
"fmt"
- "reflect"
"strings"
"github.com/ethereum/go-ethereum/crypto"
)
-// Callable method given a `Name` and whether the method is a constant.
+// Method represents a callable given a `Name` and whether the method is a constant.
// If the method is `Const` no transaction needs to be created for this
// particular Method call. It can easily be simulated using a local VM.
// For example a `Balance()` method only needs to retrieve something
@@ -35,125 +34,8 @@ import (
type Method struct {
Name string
Const bool
- Inputs []Argument
- Outputs []Argument
-}
-
-func (method Method) pack(args ...interface{}) ([]byte, error) {
- // Make sure arguments match up and pack them
- if len(args) != len(method.Inputs) {
- return nil, fmt.Errorf("argument count mismatch: %d for %d", len(args), len(method.Inputs))
- }
- // variable input is the output appended at the end of packed
- // output. This is used for strings and bytes types input.
- var variableInput []byte
-
- var ret []byte
- for i, a := range args {
- input := method.Inputs[i]
- // pack the input
- packed, err := input.Type.pack(reflect.ValueOf(a))
- if err != nil {
- return nil, fmt.Errorf("`%s` %v", method.Name, err)
- }
-
- // check for a slice type (string, bytes, slice)
- if input.Type.requiresLengthPrefix() {
- // calculate the offset
- offset := len(method.Inputs)*32 + len(variableInput)
- // set the offset
- ret = append(ret, packNum(reflect.ValueOf(offset))...)
- // Append the packed output to the variable input. The variable input
- // will be appended at the end of the input.
- variableInput = append(variableInput, packed...)
- } else {
- // append the packed value to the input
- ret = append(ret, packed...)
- }
- }
- // append the variable input at the end of the packed input
- ret = append(ret, variableInput...)
-
- return ret, nil
-}
-
-// unpacks a method return tuple into a struct of corresponding go types
-//
-// Unpacking can be done into a struct or a slice/array.
-func (method Method) tupleUnpack(v interface{}, output []byte) error {
- // make sure the passed value is a pointer
- valueOf := reflect.ValueOf(v)
- if reflect.Ptr != valueOf.Kind() {
- return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
- }
-
- var (
- value = valueOf.Elem()
- typ = value.Type()
- )
-
- j := 0
- for i := 0; i < len(method.Outputs); i++ {
- toUnpack := method.Outputs[i]
- if toUnpack.Type.T == ArrayTy {
- // need to move this up because they read sequentially
- j += toUnpack.Type.Size
- }
- marshalledValue, err := toGoType((i+j)*32, toUnpack.Type, output)
- if err != nil {
- return err
- }
- reflectValue := reflect.ValueOf(marshalledValue)
-
- switch value.Kind() {
- case reflect.Struct:
- for j := 0; j < typ.NumField(); j++ {
- field := typ.Field(j)
- // TODO read tags: `abi:"fieldName"`
- if field.Name == strings.ToUpper(method.Outputs[i].Name[:1])+method.Outputs[i].Name[1:] {
- if err := set(value.Field(j), reflectValue, method.Outputs[i]); err != nil {
- return err
- }
- }
- }
- case reflect.Slice, reflect.Array:
- if value.Len() < i {
- return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(method.Outputs), value.Len())
- }
- v := value.Index(i)
- if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface {
- return fmt.Errorf("abi: cannot unmarshal %v in to %v", v.Type(), reflectValue.Type())
- }
- reflectValue := reflect.ValueOf(marshalledValue)
- if err := set(v.Elem(), reflectValue, method.Outputs[i]); err != nil {
- return err
- }
- default:
- return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ)
- }
- }
- return nil
-}
-
-func (method Method) isTupleReturn() bool { return len(method.Outputs) > 1 }
-
-func (method Method) singleUnpack(v interface{}, output []byte) error {
- // make sure the passed value is a pointer
- valueOf := reflect.ValueOf(v)
- if reflect.Ptr != valueOf.Kind() {
- return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
- }
-
- value := valueOf.Elem()
-
- marshalledValue, err := toGoType(0, method.Outputs[0].Type, output)
- if err != nil {
- return err
- }
- if err := set(value, reflect.ValueOf(marshalledValue), method.Outputs[0]); err != nil {
- return err
- }
- return nil
+ Inputs Arguments
+ Outputs Arguments
}
// Sig returns the methods string signature according to the ABI spec.
@@ -163,35 +45,35 @@ func (method Method) singleUnpack(v interface{}, output []byte) error {
// function foo(uint32 a, int b) = "foo(uint32,int256)"
//
// Please note that "int" is substitute for its canonical representation "int256"
-func (m Method) Sig() string {
- types := make([]string, len(m.Inputs))
+func (method Method) Sig() string {
+ types := make([]string, len(method.Inputs))
i := 0
- for _, input := range m.Inputs {
+ for _, input := range method.Inputs {
types[i] = input.Type.String()
i++
}
- return fmt.Sprintf("%v(%v)", m.Name, strings.Join(types, ","))
+ return fmt.Sprintf("%v(%v)", method.Name, strings.Join(types, ","))
}
-func (m Method) String() string {
- inputs := make([]string, len(m.Inputs))
- for i, input := range m.Inputs {
+func (method Method) String() string {
+ inputs := make([]string, len(method.Inputs))
+ for i, input := range method.Inputs {
inputs[i] = fmt.Sprintf("%v %v", input.Name, input.Type)
}
- outputs := make([]string, len(m.Outputs))
- for i, output := range m.Outputs {
+ outputs := make([]string, len(method.Outputs))
+ for i, output := range method.Outputs {
if len(output.Name) > 0 {
outputs[i] = fmt.Sprintf("%v ", output.Name)
}
outputs[i] += output.Type.String()
}
constant := ""
- if m.Const {
+ if method.Const {
constant = "constant "
}
- return fmt.Sprintf("function %v(%v) %sreturns(%v)", m.Name, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", "))
+ return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.Name, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", "))
}
-func (m Method) Id() []byte {
- return crypto.Keccak256([]byte(m.Sig()))[:4]
+func (method Method) Id() []byte {
+ return crypto.Keccak256([]byte(method.Sig()))[:4]
}
diff --git a/accounts/abi/pack.go b/accounts/abi/pack.go
index 072e80536..36c58265b 100644
--- a/accounts/abi/pack.go
+++ b/accounts/abi/pack.go
@@ -48,9 +48,8 @@ func packElement(t Type, reflectValue reflect.Value) []byte {
case BoolTy:
if reflectValue.Bool() {
return math.PaddedBigBytes(common.Big1, 32)
- } else {
- return math.PaddedBigBytes(common.Big0, 32)
}
+ return math.PaddedBigBytes(common.Big0, 32)
case BytesTy:
if reflectValue.Kind() == reflect.Array {
reflectValue = mustArrayToByteSlice(reflectValue)
diff --git a/accounts/abi/reflect.go b/accounts/abi/reflect.go
index e953b77c1..7a9cdacd5 100644
--- a/accounts/abi/reflect.go
+++ b/accounts/abi/reflect.go
@@ -85,3 +85,28 @@ func set(dst, src reflect.Value, output Argument) error {
}
return nil
}
+
+// requireAssignable assures that `dest` is a pointer and it's not an interface.
+func requireAssignable(dst, src reflect.Value) error {
+ if dst.Kind() != reflect.Ptr && dst.Kind() != reflect.Interface {
+ return fmt.Errorf("abi: cannot unmarshal %v into %v", src.Type(), dst.Type())
+ }
+ return nil
+}
+
+// requireUnpackKind verifies preconditions for unpacking `args` into `kind`
+func requireUnpackKind(v reflect.Value, t reflect.Type, k reflect.Kind,
+ args Arguments) error {
+
+ switch k {
+ case reflect.Struct:
+ case reflect.Slice, reflect.Array:
+ if minLen := args.LengthNonIndexed(); v.Len() < minLen {
+ return fmt.Errorf("abi: insufficient number of elements in the list/array for unpack, want %d, got %d",
+ minLen, v.Len())
+ }
+ default:
+ return fmt.Errorf("abi: cannot unmarshal tuple into %v", t)
+ }
+ return nil
+}
diff --git a/accounts/abi/type.go b/accounts/abi/type.go
index fba10b96d..a1f13ffa2 100644
--- a/accounts/abi/type.go
+++ b/accounts/abi/type.go
@@ -24,6 +24,7 @@ import (
"strings"
)
+// Type enumerator
const (
IntTy byte = iota
UintTy
@@ -100,68 +101,65 @@ func NewType(t string) (typ Type, err error) {
return Type{}, fmt.Errorf("invalid formatting of array type")
}
return typ, err
+ }
+ // parse the type and size of the abi-type.
+ parsedType := typeRegex.FindAllStringSubmatch(t, -1)[0]
+ // varSize is the size of the variable
+ var varSize int
+ if len(parsedType[3]) > 0 {
+ var err error
+ varSize, err = strconv.Atoi(parsedType[2])
+ if err != nil {
+ return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err)
+ }
} else {
- // parse the type and size of the abi-type.
- parsedType := typeRegex.FindAllStringSubmatch(t, -1)[0]
- // varSize is the size of the variable
- var varSize int
- if len(parsedType[3]) > 0 {
- var err error
- varSize, err = strconv.Atoi(parsedType[2])
- if err != nil {
- return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err)
- }
- } else {
- if parsedType[0] == "uint" || parsedType[0] == "int" {
- // this should fail because it means that there's something wrong with
- // the abi type (the compiler should always format it to the size...always)
- return Type{}, fmt.Errorf("unsupported arg type: %s", t)
- }
+ if parsedType[0] == "uint" || parsedType[0] == "int" {
+ // this should fail because it means that there's something wrong with
+ // the abi type (the compiler should always format it to the size...always)
+ return Type{}, fmt.Errorf("unsupported arg type: %s", t)
}
- // varType is the parsed abi type
- varType := parsedType[1]
-
- switch varType {
- case "int":
- typ.Kind, typ.Type = reflectIntKindAndType(false, varSize)
- typ.Size = varSize
- typ.T = IntTy
- case "uint":
- typ.Kind, typ.Type = reflectIntKindAndType(true, varSize)
- typ.Size = varSize
- typ.T = UintTy
- case "bool":
- typ.Kind = reflect.Bool
- typ.T = BoolTy
- typ.Type = reflect.TypeOf(bool(false))
- case "address":
- typ.Kind = reflect.Array
- typ.Type = address_t
- typ.Size = 20
- typ.T = AddressTy
- case "string":
- typ.Kind = reflect.String
- typ.Type = reflect.TypeOf("")
- typ.T = StringTy
- case "bytes":
- if varSize == 0 {
- typ.T = BytesTy
- typ.Kind = reflect.Slice
- typ.Type = reflect.SliceOf(reflect.TypeOf(byte(0)))
- } else {
- typ.T = FixedBytesTy
- typ.Kind = reflect.Array
- typ.Size = varSize
- typ.Type = reflect.ArrayOf(varSize, reflect.TypeOf(byte(0)))
- }
- case "function":
+ }
+ // varType is the parsed abi type
+ switch varType := parsedType[1]; varType {
+ case "int":
+ typ.Kind, typ.Type = reflectIntKindAndType(false, varSize)
+ typ.Size = varSize
+ typ.T = IntTy
+ case "uint":
+ typ.Kind, typ.Type = reflectIntKindAndType(true, varSize)
+ typ.Size = varSize
+ typ.T = UintTy
+ case "bool":
+ typ.Kind = reflect.Bool
+ typ.T = BoolTy
+ typ.Type = reflect.TypeOf(bool(false))
+ case "address":
+ typ.Kind = reflect.Array
+ typ.Type = address_t
+ typ.Size = 20
+ typ.T = AddressTy
+ case "string":
+ typ.Kind = reflect.String
+ typ.Type = reflect.TypeOf("")
+ typ.T = StringTy
+ case "bytes":
+ if varSize == 0 {
+ typ.T = BytesTy
+ typ.Kind = reflect.Slice
+ typ.Type = reflect.SliceOf(reflect.TypeOf(byte(0)))
+ } else {
+ typ.T = FixedBytesTy
typ.Kind = reflect.Array
- typ.T = FunctionTy
- typ.Size = 24
- typ.Type = reflect.ArrayOf(24, reflect.TypeOf(byte(0)))
- default:
- return Type{}, fmt.Errorf("unsupported arg type: %s", t)
+ typ.Size = varSize
+ typ.Type = reflect.ArrayOf(varSize, reflect.TypeOf(byte(0)))
}
+ case "function":
+ typ.Kind = reflect.Array
+ typ.T = FunctionTy
+ typ.Size = 24
+ typ.Type = reflect.ArrayOf(24, reflect.TypeOf(byte(0)))
+ default:
+ return Type{}, fmt.Errorf("unsupported arg type: %s", t)
}
return
diff --git a/accounts/abi/unpack.go b/accounts/abi/unpack.go
index 57732797b..80efb3f7e 100644
--- a/accounts/abi/unpack.go
+++ b/accounts/abi/unpack.go
@@ -25,15 +25,6 @@ import (
"github.com/ethereum/go-ethereum/common"
)
-// unpacker is a utility interface that enables us to have
-// abstraction between events and methods and also to properly
-// "unpack" them; e.g. events use Inputs, methods use Outputs.
-type unpacker interface {
- tupleUnpack(v interface{}, output []byte) error
- singleUnpack(v interface{}, output []byte) error
- isTupleReturn() bool
-}
-
// reads the integer based on its kind
func readInteger(kind reflect.Kind, b []byte) interface{} {
switch kind {
@@ -79,7 +70,7 @@ func readBool(word []byte) (bool, error) {
// This enforces that standard by always presenting it as a 24-array (address + sig = 24 bytes)
func readFunctionType(t Type, word []byte) (funcTy [24]byte, err error) {
if t.T != FunctionTy {
- return [24]byte{}, fmt.Errorf("abi: invalid type in call to make function type byte array.")
+ return [24]byte{}, fmt.Errorf("abi: invalid type in call to make function type byte array")
}
if garbage := binary.BigEndian.Uint64(word[24:32]); garbage != 0 {
err = fmt.Errorf("abi: got improperly encoded function type, got %v", word)
@@ -92,7 +83,7 @@ func readFunctionType(t Type, word []byte) (funcTy [24]byte, err error) {
// through reflection, creates a fixed array to be read from
func readFixedBytes(t Type, word []byte) (interface{}, error) {
if t.T != FixedBytesTy {
- return nil, fmt.Errorf("abi: invalid type in call to make fixed byte array.")
+ return nil, fmt.Errorf("abi: invalid type in call to make fixed byte array")
}
// convert
array := reflect.New(t.Type).Elem()
@@ -203,14 +194,3 @@ func lengthPrefixPointsTo(index int, output []byte) (start int, length int, err
//fmt.Printf("LENGTH PREFIX INFO: \nsize: %v\noffset: %v\nstart: %v\n", length, offset, start)
return
}
-
-// checks for proper formatting of byte output
-func bytesAreProper(output []byte) error {
- if len(output) == 0 {
- return fmt.Errorf("abi: unmarshalling empty output")
- } else if len(output)%32 != 0 {
- return fmt.Errorf("abi: improperly formatted output")
- } else {
- return nil
- }
-}
diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go
index 1e21aafc0..4d7fe638c 100644
--- a/accounts/abi/unpack_test.go
+++ b/accounts/abi/unpack_test.go
@@ -22,10 +22,12 @@ import (
"fmt"
"math/big"
"reflect"
+ "strconv"
"strings"
"testing"
"github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
)
type unpackTest struct {
@@ -257,82 +259,179 @@ var unpackTests = []unpackTest{
enc: "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003",
want: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)},
},
+ // struct outputs
+ {
+ def: `[{"name":"int1","type":"int256"},{"name":"int2","type":"int256"}]`,
+ enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
+ want: struct {
+ Int1 *big.Int
+ Int2 *big.Int
+ }{big.NewInt(1), big.NewInt(2)},
+ },
+ {
+ def: `[{"name":"int","type":"int256"},{"name":"Int","type":"int256"}]`,
+ enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
+ want: struct {
+ Int1 *big.Int
+ Int2 *big.Int
+ }{},
+ err: "abi: multiple outputs mapping to the same struct field 'Int'",
+ },
+ {
+ def: `[{"name":"int","type":"int256"},{"name":"_int","type":"int256"}]`,
+ enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
+ want: struct {
+ Int1 *big.Int
+ Int2 *big.Int
+ }{},
+ err: "abi: multiple outputs mapping to the same struct field 'Int'",
+ },
+ {
+ def: `[{"name":"Int","type":"int256"},{"name":"_int","type":"int256"}]`,
+ enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
+ want: struct {
+ Int1 *big.Int
+ Int2 *big.Int
+ }{},
+ err: "abi: multiple outputs mapping to the same struct field 'Int'",
+ },
+ {
+ def: `[{"name":"Int","type":"int256"},{"name":"_","type":"int256"}]`,
+ enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
+ want: struct {
+ Int1 *big.Int
+ Int2 *big.Int
+ }{},
+ err: "abi: purely underscored output cannot unpack to struct",
+ },
}
func TestUnpack(t *testing.T) {
for i, test := range unpackTests {
- def := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def)
- abi, err := JSON(strings.NewReader(def))
- if err != nil {
- t.Fatalf("invalid ABI definition %s: %v", def, err)
- }
- encb, err := hex.DecodeString(test.enc)
- if err != nil {
- t.Fatalf("invalid hex: %s" + test.enc)
- }
- outptr := reflect.New(reflect.TypeOf(test.want))
- err = abi.Unpack(outptr.Interface(), "method", encb)
- if err := test.checkError(err); err != nil {
- t.Errorf("test %d (%v) failed: %v", i, test.def, err)
- continue
- }
- out := outptr.Elem().Interface()
- if !reflect.DeepEqual(test.want, out) {
- t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.want, out)
- }
+ t.Run(strconv.Itoa(i), func(t *testing.T) {
+ def := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def)
+ abi, err := JSON(strings.NewReader(def))
+ if err != nil {
+ t.Fatalf("invalid ABI definition %s: %v", def, err)
+ }
+ encb, err := hex.DecodeString(test.enc)
+ if err != nil {
+ t.Fatalf("invalid hex: %s" + test.enc)
+ }
+ outptr := reflect.New(reflect.TypeOf(test.want))
+ err = abi.Unpack(outptr.Interface(), "method", encb)
+ if err := test.checkError(err); err != nil {
+ t.Errorf("test %d (%v) failed: %v", i, test.def, err)
+ return
+ }
+ out := outptr.Elem().Interface()
+ if !reflect.DeepEqual(test.want, out) {
+ t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.want, out)
+ }
+ })
}
}
-func TestMultiReturnWithStruct(t *testing.T) {
+type methodMultiOutput struct {
+ Int *big.Int
+ String string
+}
+
+func methodMultiReturn(require *require.Assertions) (ABI, []byte, methodMultiOutput) {
const definition = `[
{ "name" : "multi", "constant" : false, "outputs": [ { "name": "Int", "type": "uint256" }, { "name": "String", "type": "string" } ] }]`
+ var expected = methodMultiOutput{big.NewInt(1), "hello"}
abi, err := JSON(strings.NewReader(definition))
- if err != nil {
- t.Fatal(err)
- }
-
+ require.NoError(err)
// using buff to make the code readable
buff := new(bytes.Buffer)
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040"))
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005"))
- stringOut := "hello"
- buff.Write(common.RightPadBytes([]byte(stringOut), 32))
+ buff.Write(common.RightPadBytes([]byte(expected.String), 32))
+ return abi, buff.Bytes(), expected
+}
- var inter struct {
- Int *big.Int
+func TestMethodMultiReturn(t *testing.T) {
+ type reversed struct {
String string
- }
- err = abi.Unpack(&inter, "multi", buff.Bytes())
- if err != nil {
- t.Error(err)
- }
-
- if inter.Int == nil || inter.Int.Cmp(big.NewInt(1)) != 0 {
- t.Error("expected Int to be 1 got", inter.Int)
- }
-
- if inter.String != stringOut {
- t.Error("expected String to be", stringOut, "got", inter.String)
+ Int *big.Int
}
- var reversed struct {
- String string
- Int *big.Int
+ abi, data, expected := methodMultiReturn(require.New(t))
+ bigint := new(big.Int)
+ var testCases = []struct {
+ dest interface{}
+ expected interface{}
+ error string
+ name string
+ }{{
+ &methodMultiOutput{},
+ &expected,
+ "",
+ "Can unpack into structure",
+ }, {
+ &reversed{},
+ &reversed{expected.String, expected.Int},
+ "",
+ "Can unpack into reversed structure",
+ }, {
+ &[]interface{}{&bigint, new(string)},
+ &[]interface{}{&expected.Int, &expected.String},
+ "",
+ "Can unpack into a slice",
+ }, {
+ &[2]interface{}{&bigint, new(string)},
+ &[2]interface{}{&expected.Int, &expected.String},
+ "",
+ "Can unpack into an array",
+ }, {
+ &[]interface{}{new(int), new(int)},
+ &[]interface{}{&expected.Int, &expected.String},
+ "abi: cannot unmarshal *big.Int in to int",
+ "Can not unpack into a slice with wrong types",
+ }, {
+ &[]interface{}{new(int)},
+ &[]interface{}{},
+ "abi: insufficient number of elements in the list/array for unpack, want 2, got 1",
+ "Can not unpack into a slice with wrong types",
+ }}
+ for _, tc := range testCases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ require := require.New(t)
+ err := abi.Unpack(tc.dest, "multi", data)
+ if tc.error == "" {
+ require.Nil(err, "Should be able to unpack method outputs.")
+ require.Equal(tc.expected, tc.dest)
+ } else {
+ require.EqualError(err, tc.error)
+ }
+ })
}
+}
- err = abi.Unpack(&reversed, "multi", buff.Bytes())
+func TestMultiReturnWithArray(t *testing.T) {
+ const definition = `[{"name" : "multi", "outputs": [{"type": "uint64[3]"}, {"type": "uint64"}]}]`
+ abi, err := JSON(strings.NewReader(definition))
if err != nil {
- t.Error(err)
+ t.Fatal(err)
}
+ buff := new(bytes.Buffer)
+ buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009"))
+ buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000008"))
- if reversed.Int == nil || reversed.Int.Cmp(big.NewInt(1)) != 0 {
- t.Error("expected Int to be 1 got", reversed.Int)
+ ret1, ret1Exp := new([3]uint64), [3]uint64{9, 9, 9}
+ ret2, ret2Exp := new(uint64), uint64(8)
+ if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil {
+ t.Fatal(err)
}
-
- if reversed.String != stringOut {
- t.Error("expected String to be", stringOut, "got", reversed.String)
+ if !reflect.DeepEqual(*ret1, ret1Exp) {
+ t.Error("array result", *ret1, "!= Expected", ret1Exp)
+ }
+ if *ret2 != ret2Exp {
+ t.Error("int result", *ret2, "!= Expected", ret2Exp)
}
}
diff --git a/accounts/errors.go b/accounts/errors.go
index 64da8821c..40b21ed17 100644
--- a/accounts/errors.go
+++ b/accounts/errors.go
@@ -62,7 +62,7 @@ func NewAuthNeededError(needed string) error {
}
}
-// Error implements the standard error interfacel.
+// Error implements the standard error interface.
func (err *AuthNeededError) Error() string {
return fmt.Sprintf("authentication needed: %s", err.Needed)
}
diff --git a/accounts/keystore/presale.go b/accounts/keystore/presale.go
index ed900ad08..1554294e1 100644
--- a/accounts/keystore/presale.go
+++ b/accounts/keystore/presale.go
@@ -58,6 +58,9 @@ func decryptPreSaleKey(fileContent []byte, password string) (key *Key, err error
if err != nil {
return nil, errors.New("invalid hex in encSeed")
}
+ if len(encSeedBytes) < 16 {
+ return nil, errors.New("invalid encSeed, too short")
+ }
iv := encSeedBytes[:16]
cipherText := encSeedBytes[16:]
/*
diff --git a/accounts/usbwallet/internal/trezor/messages.proto b/accounts/usbwallet/internal/trezor/messages.proto
index 178956457..8cb9c8cc2 100644
--- a/accounts/usbwallet/internal/trezor/messages.proto
+++ b/accounts/usbwallet/internal/trezor/messages.proto
@@ -2,6 +2,8 @@
// https://github.com/trezor/trezor-common/blob/master/protob/messages.proto
// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b.
+syntax = "proto2";
+
/**
* Messages for TREZOR communication
*/
diff --git a/accounts/usbwallet/internal/trezor/trezor.go b/accounts/usbwallet/internal/trezor/trezor.go
index 487aeb5f8..8ae9e726e 100644
--- a/accounts/usbwallet/internal/trezor/trezor.go
+++ b/accounts/usbwallet/internal/trezor/trezor.go
@@ -18,7 +18,7 @@
// wallets. The wire protocol spec can be found on the SatoshiLabs website:
// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html
-//go:generate protoc --go_out=Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor,import_path=trezor:. types.proto messages.proto
+//go:generate protoc --go_out=import_path=trezor:. types.proto messages.proto
// Package trezor contains the wire protocol wrapper in Go.
package trezor
diff --git a/accounts/usbwallet/internal/trezor/types.proto b/accounts/usbwallet/internal/trezor/types.proto
index 3a358a584..acbe79e3f 100644
--- a/accounts/usbwallet/internal/trezor/types.proto
+++ b/accounts/usbwallet/internal/trezor/types.proto
@@ -2,6 +2,8 @@
// https://github.com/trezor/trezor-common/blob/master/protob/types.proto
// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b.
+syntax = "proto2";
+
/**
* Types for TREZOR communication
*
diff --git a/accounts/usbwallet/trezor.go b/accounts/usbwallet/trezor.go
index 159cb2ea9..b84a95599 100644
--- a/accounts/usbwallet/trezor.go
+++ b/accounts/usbwallet/trezor.go
@@ -180,7 +180,7 @@ func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction
AddressN: derivationPath,
Nonce: new(big.Int).SetUint64(tx.Nonce()).Bytes(),
GasPrice: tx.GasPrice().Bytes(),
- GasLimit: tx.Gas().Bytes(),
+ GasLimit: new(big.Int).SetUint64(tx.Gas()).Bytes(),
Value: tx.Value().Bytes(),
DataLength: &length,
}
diff --git a/appveyor.yml b/appveyor.yml
index 78b11fa9d..99029f553 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -23,8 +23,8 @@ environment:
install:
- git submodule update --init
- rmdir C:\go /s /q
- - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.windows-%GETH_ARCH%.zip
- - 7z x go1.9.windows-%GETH_ARCH%.zip -y -oC:\ > NUL
+ - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.2.windows-%GETH_ARCH%.zip
+ - 7z x go1.9.2.windows-%GETH_ARCH%.zip -y -oC:\ > NUL
- go version
- gcc --version
diff --git a/build/ci.go b/build/ci.go
index 987f0bb18..1f98bb843 100644
--- a/build/ci.go
+++ b/build/ci.go
@@ -23,7 +23,7 @@ Usage: go run build/ci.go <command> <command flags/arguments>
Available commands are:
- install [ -arch architecture ] [ packages... ] -- builds packages and executables
+ install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables
test [ -coverage ] [ packages... ] -- runs the tests
lint -- runs certain pre-selected linters
archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -upload dest ] -- archives build artefacts
@@ -173,17 +173,24 @@ func main() {
func doInstall(cmdline []string) {
var (
arch = flag.String("arch", "", "Architecture to cross build for")
+ cc = flag.String("cc", "", "C compiler to cross build with")
)
flag.CommandLine.Parse(cmdline)
env := build.Env()
// Check Go version. People regularly open issues about compilation
// failure with outdated Go. This should save them the trouble.
- if runtime.Version() < "go1.7" && !strings.Contains(runtime.Version(), "devel") {
- log.Println("You have Go version", runtime.Version())
- log.Println("go-ethereum requires at least Go version 1.7 and cannot")
- log.Println("be compiled with an earlier version. Please upgrade your Go installation.")
- os.Exit(1)
+ if !strings.Contains(runtime.Version(), "devel") {
+ // Figure out the minor version number since we can't textually compare (1.10 < 1.7)
+ var minor int
+ fmt.Sscanf(strings.TrimPrefix(runtime.Version(), "go1."), "%d", &minor)
+
+ if minor < 7 {
+ log.Println("You have Go version", runtime.Version())
+ log.Println("go-ethereum requires at least Go version 1.7 and cannot")
+ log.Println("be compiled with an earlier version. Please upgrade your Go installation.")
+ os.Exit(1)
+ }
}
// Compile packages given as arguments, or everything if there are no arguments.
packages := []string{"./..."}
@@ -207,7 +214,7 @@ func doInstall(cmdline []string) {
}
}
// Seems we are cross compiling, work around forbidden GOBIN
- goinstall := goToolArch(*arch, "install", buildFlags(env)...)
+ goinstall := goToolArch(*arch, *cc, "install", buildFlags(env)...)
goinstall.Args = append(goinstall.Args, "-v")
goinstall.Args = append(goinstall.Args, []string{"-buildmode", "archive"}...)
goinstall.Args = append(goinstall.Args, packages...)
@@ -221,7 +228,7 @@ func doInstall(cmdline []string) {
}
for name := range pkgs {
if name == "main" {
- gobuild := goToolArch(*arch, "build", buildFlags(env)...)
+ gobuild := goToolArch(*arch, *cc, "build", buildFlags(env)...)
gobuild.Args = append(gobuild.Args, "-v")
gobuild.Args = append(gobuild.Args, []string{"-o", executablePath(cmd.Name())}...)
gobuild.Args = append(gobuild.Args, "."+string(filepath.Separator)+filepath.Join("cmd", cmd.Name()))
@@ -249,15 +256,18 @@ func buildFlags(env build.Environment) (flags []string) {
}
func goTool(subcmd string, args ...string) *exec.Cmd {
- return goToolArch(runtime.GOARCH, subcmd, args...)
+ return goToolArch(runtime.GOARCH, os.Getenv("CC"), subcmd, args...)
}
-func goToolArch(arch string, subcmd string, args ...string) *exec.Cmd {
+func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd {
cmd := build.GoTool(subcmd, args...)
if subcmd == "build" || subcmd == "install" || subcmd == "test" {
// Go CGO has a Windows linker error prior to 1.8 (https://github.com/golang/go/issues/8756).
// Work around issue by allowing multiple definitions for <1.8 builds.
- if runtime.GOOS == "windows" && runtime.Version() < "go1.8" {
+ var minor int
+ fmt.Sscanf(strings.TrimPrefix(runtime.Version(), "go1."), "%d", &minor)
+
+ if runtime.GOOS == "windows" && minor < 8 {
cmd.Args = append(cmd.Args, []string{"-ldflags", "-extldflags -Wl,--allow-multiple-definition"}...)
}
}
@@ -268,6 +278,9 @@ func goToolArch(arch string, subcmd string, args ...string) *exec.Cmd {
cmd.Env = append(cmd.Env, "CGO_ENABLED=1")
cmd.Env = append(cmd.Env, "GOARCH="+arch)
}
+ if cc != "" {
+ cmd.Env = append(cmd.Env, "CC="+cc)
+ }
for _, e := range os.Environ() {
if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") {
continue
diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go
index e1734d89a..ecfc6fc24 100644
--- a/cmd/bootnode/main.go
+++ b/cmd/bootnode/main.go
@@ -21,6 +21,7 @@ import (
"crypto/ecdsa"
"flag"
"fmt"
+ "net"
"os"
"github.com/ethereum/go-ethereum/cmd/utils"
@@ -96,12 +97,32 @@ func main() {
}
}
+ addr, err := net.ResolveUDPAddr("udp", *listenAddr)
+ if err != nil {
+ utils.Fatalf("-ResolveUDPAddr: %v", err)
+ }
+ conn, err := net.ListenUDP("udp", addr)
+ if err != nil {
+ utils.Fatalf("-ListenUDP: %v", err)
+ }
+
+ realaddr := conn.LocalAddr().(*net.UDPAddr)
+ if natm != nil {
+ if !realaddr.IP.IsLoopback() {
+ go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery")
+ }
+ // TODO: react to external IP changes over time.
+ if ext, err := natm.ExternalIP(); err == nil {
+ realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}
+ }
+ }
+
if *runv5 {
- if _, err := discv5.ListenUDP(nodeKey, *listenAddr, natm, "", restrictList); err != nil {
+ if _, err := discv5.ListenUDP(nodeKey, conn, realaddr, "", restrictList); err != nil {
utils.Fatalf("%v", err)
}
} else {
- if _, err := discover.ListenUDP(nodeKey, *listenAddr, natm, "", restrictList); err != nil {
+ if _, err := discover.ListenUDP(nodeKey, conn, realaddr, nil, "", restrictList); err != nil {
utils.Fatalf("%v", err)
}
}
diff --git a/cmd/ethkey/README.md b/cmd/ethkey/README.md
new file mode 100644
index 000000000..cf72ba43d
--- /dev/null
+++ b/cmd/ethkey/README.md
@@ -0,0 +1,41 @@
+ethkey
+======
+
+ethkey is a simple command-line tool for working with Ethereum keyfiles.
+
+
+# Usage
+
+### `ethkey generate`
+
+Generate a new keyfile.
+If you want to use an existing private key to use in the keyfile, it can be
+specified by setting `--privatekey` with the location of the file containing the
+private key.
+
+
+### `ethkey inspect <keyfile>`
+
+Print various information about the keyfile.
+Private key information can be printed by using the `--private` flag;
+make sure to use this feature with great caution!
+
+
+### `ethkey sign <keyfile> <message/file>`
+
+Sign the message with a keyfile.
+It is possible to refer to a file containing the message.
+
+
+### `ethkey verify <address> <signature> <message/file>`
+
+Verify the signature of the message.
+It is possible to refer to a file containing the message.
+
+
+## Passphrases
+
+For every command that uses a keyfile, you will be prompted to provide the
+passphrase for decrypting the keyfile. To avoid this message, it is possible
+to pass the passphrase by using the `--passphrase` flag pointing to a file that
+contains the passphrase.
diff --git a/cmd/ethkey/generate.go b/cmd/ethkey/generate.go
new file mode 100644
index 000000000..6d57d17fb
--- /dev/null
+++ b/cmd/ethkey/generate.go
@@ -0,0 +1,118 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "crypto/ecdsa"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+
+ "github.com/ethereum/go-ethereum/accounts/keystore"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/pborman/uuid"
+ "gopkg.in/urfave/cli.v1"
+)
+
+type outputGenerate struct {
+ Address string
+ AddressEIP55 string
+}
+
+var commandGenerate = cli.Command{
+ Name: "generate",
+ Usage: "generate new keyfile",
+ ArgsUsage: "[ <keyfile> ]",
+ Description: `
+Generate a new keyfile.
+
+If you want to encrypt an existing private key, it can be specified by setting
+--privatekey with the location of the file containing the private key.
+`,
+ Flags: []cli.Flag{
+ passphraseFlag,
+ jsonFlag,
+ cli.StringFlag{
+ Name: "privatekey",
+ Usage: "file containing a raw private key to encrypt",
+ },
+ },
+ Action: func(ctx *cli.Context) error {
+ // Check if keyfile path given and make sure it doesn't already exist.
+ keyfilepath := ctx.Args().First()
+ if keyfilepath == "" {
+ keyfilepath = defaultKeyfileName
+ }
+ if _, err := os.Stat(keyfilepath); err == nil {
+ utils.Fatalf("Keyfile already exists at %s.", keyfilepath)
+ } else if !os.IsNotExist(err) {
+ utils.Fatalf("Error checking if keyfile exists: %v", err)
+ }
+
+ var privateKey *ecdsa.PrivateKey
+ var err error
+ if file := ctx.String("privatekey"); file != "" {
+ // Load private key from file.
+ privateKey, err = crypto.LoadECDSA(file)
+ if err != nil {
+ utils.Fatalf("Can't load private key: %v", err)
+ }
+ } else {
+ // If not loaded, generate random.
+ privateKey, err = crypto.GenerateKey()
+ if err != nil {
+ utils.Fatalf("Failed to generate random private key: %v", err)
+ }
+ }
+
+ // Create the keyfile object with a random UUID.
+ id := uuid.NewRandom()
+ key := &keystore.Key{
+ Id: id,
+ Address: crypto.PubkeyToAddress(privateKey.PublicKey),
+ PrivateKey: privateKey,
+ }
+
+ // Encrypt key with passphrase.
+ passphrase := getPassPhrase(ctx, true)
+ keyjson, err := keystore.EncryptKey(key, passphrase, keystore.StandardScryptN, keystore.StandardScryptP)
+ if err != nil {
+ utils.Fatalf("Error encrypting key: %v", err)
+ }
+
+ // Store the file to disk.
+ if err := os.MkdirAll(filepath.Dir(keyfilepath), 0700); err != nil {
+ utils.Fatalf("Could not create directory %s", filepath.Dir(keyfilepath))
+ }
+ if err := ioutil.WriteFile(keyfilepath, keyjson, 0600); err != nil {
+ utils.Fatalf("Failed to write keyfile to %s: %v", keyfilepath, err)
+ }
+
+ // Output some information.
+ out := outputGenerate{
+ Address: key.Address.Hex(),
+ }
+ if ctx.Bool(jsonFlag.Name) {
+ mustPrintJSON(out)
+ } else {
+ fmt.Println("Address:", out.Address)
+ }
+ return nil
+ },
+}
diff --git a/cmd/ethkey/inspect.go b/cmd/ethkey/inspect.go
new file mode 100644
index 000000000..219a5460b
--- /dev/null
+++ b/cmd/ethkey/inspect.go
@@ -0,0 +1,75 @@
+package main
+
+import (
+ "encoding/hex"
+ "fmt"
+ "io/ioutil"
+
+ "github.com/ethereum/go-ethereum/accounts/keystore"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/crypto"
+ "gopkg.in/urfave/cli.v1"
+)
+
+type outputInspect struct {
+ Address string
+ PublicKey string
+ PrivateKey string
+}
+
+var commandInspect = cli.Command{
+ Name: "inspect",
+ Usage: "inspect a keyfile",
+ ArgsUsage: "<keyfile>",
+ Description: `
+Print various information about the keyfile.
+
+Private key information can be printed by using the --private flag;
+make sure to use this feature with great caution!`,
+ Flags: []cli.Flag{
+ passphraseFlag,
+ jsonFlag,
+ cli.BoolFlag{
+ Name: "private",
+ Usage: "include the private key in the output",
+ },
+ },
+ Action: func(ctx *cli.Context) error {
+ keyfilepath := ctx.Args().First()
+
+ // Read key from file.
+ keyjson, err := ioutil.ReadFile(keyfilepath)
+ if err != nil {
+ utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err)
+ }
+
+ // Decrypt key with passphrase.
+ passphrase := getPassPhrase(ctx, false)
+ key, err := keystore.DecryptKey(keyjson, passphrase)
+ if err != nil {
+ utils.Fatalf("Error decrypting key: %v", err)
+ }
+
+ // Output all relevant information we can retrieve.
+ showPrivate := ctx.Bool("private")
+ out := outputInspect{
+ Address: key.Address.Hex(),
+ PublicKey: hex.EncodeToString(
+ crypto.FromECDSAPub(&key.PrivateKey.PublicKey)),
+ }
+ if showPrivate {
+ out.PrivateKey = hex.EncodeToString(crypto.FromECDSA(key.PrivateKey))
+ }
+
+ if ctx.Bool(jsonFlag.Name) {
+ mustPrintJSON(out)
+ } else {
+ fmt.Println("Address: ", out.Address)
+ fmt.Println("Public key: ", out.PublicKey)
+ if showPrivate {
+ fmt.Println("Private key: ", out.PrivateKey)
+ }
+ }
+ return nil
+ },
+}
diff --git a/cmd/ethkey/main.go b/cmd/ethkey/main.go
new file mode 100644
index 000000000..2a9e5ee48
--- /dev/null
+++ b/cmd/ethkey/main.go
@@ -0,0 +1,67 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "gopkg.in/urfave/cli.v1"
+)
+
+const (
+ defaultKeyfileName = "keyfile.json"
+)
+
+// Git SHA1 commit hash of the release (set via linker flags)
+var gitCommit = ""
+
+var app *cli.App
+
+func init() {
+ app = utils.NewApp(gitCommit, "an Ethereum key manager")
+ app.Commands = []cli.Command{
+ commandGenerate,
+ commandInspect,
+ commandSignMessage,
+ commandVerifyMessage,
+ }
+}
+
+// Commonly used command line flags.
+var (
+ passphraseFlag = cli.StringFlag{
+ Name: "passwordfile",
+ Usage: "the file that contains the passphrase for the keyfile",
+ }
+ jsonFlag = cli.BoolFlag{
+ Name: "json",
+ Usage: "output JSON instead of human-readable format",
+ }
+ messageFlag = cli.StringFlag{
+ Name: "message",
+ Usage: "the file that contains the message to sign/verify",
+ }
+)
+
+func main() {
+ if err := app.Run(os.Args); err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+}
diff --git a/cmd/ethkey/message.go b/cmd/ethkey/message.go
new file mode 100644
index 000000000..531a931c8
--- /dev/null
+++ b/cmd/ethkey/message.go
@@ -0,0 +1,159 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "encoding/hex"
+ "fmt"
+ "io/ioutil"
+
+ "github.com/ethereum/go-ethereum/accounts/keystore"
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
+ "gopkg.in/urfave/cli.v1"
+)
+
+type outputSign struct {
+ Signature string
+}
+
+var msgfileFlag = cli.StringFlag{
+ Name: "msgfile",
+ Usage: "file containing the message to sign/verify",
+}
+
+var commandSignMessage = cli.Command{
+ Name: "signmessage",
+ Usage: "sign a message",
+ ArgsUsage: "<keyfile> <message>",
+ Description: `
+Sign the message with a keyfile.
+
+To sign a message contained in a file, use the --msgfile flag.
+`,
+ Flags: []cli.Flag{
+ passphraseFlag,
+ jsonFlag,
+ msgfileFlag,
+ },
+ Action: func(ctx *cli.Context) error {
+ message := getMessage(ctx, 1)
+
+ // Load the keyfile.
+ keyfilepath := ctx.Args().First()
+ keyjson, err := ioutil.ReadFile(keyfilepath)
+ if err != nil {
+ utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err)
+ }
+
+ // Decrypt key with passphrase.
+ passphrase := getPassPhrase(ctx, false)
+ key, err := keystore.DecryptKey(keyjson, passphrase)
+ if err != nil {
+ utils.Fatalf("Error decrypting key: %v", err)
+ }
+
+ signature, err := crypto.Sign(signHash(message), key.PrivateKey)
+ if err != nil {
+ utils.Fatalf("Failed to sign message: %v", err)
+ }
+ out := outputSign{Signature: hex.EncodeToString(signature)}
+ if ctx.Bool(jsonFlag.Name) {
+ mustPrintJSON(out)
+ } else {
+ fmt.Println("Signature:", out.Signature)
+ }
+ return nil
+ },
+}
+
+type outputVerify struct {
+ Success bool
+ RecoveredAddress string
+ RecoveredPublicKey string
+}
+
+var commandVerifyMessage = cli.Command{
+ Name: "verifymessage",
+ Usage: "verify the signature of a signed message",
+ ArgsUsage: "<address> <signature> <message>",
+ Description: `
+Verify the signature of the message.
+It is possible to refer to a file containing the message.`,
+ Flags: []cli.Flag{
+ jsonFlag,
+ msgfileFlag,
+ },
+ Action: func(ctx *cli.Context) error {
+ addressStr := ctx.Args().First()
+ signatureHex := ctx.Args().Get(1)
+ message := getMessage(ctx, 2)
+
+ if !common.IsHexAddress(addressStr) {
+ utils.Fatalf("Invalid address: %s", addressStr)
+ }
+ address := common.HexToAddress(addressStr)
+ signature, err := hex.DecodeString(signatureHex)
+ if err != nil {
+ utils.Fatalf("Signature encoding is not hexadecimal: %v", err)
+ }
+
+ recoveredPubkey, err := crypto.SigToPub(signHash(message), signature)
+ if err != nil || recoveredPubkey == nil {
+ utils.Fatalf("Signature verification failed: %v", err)
+ }
+ recoveredPubkeyBytes := crypto.FromECDSAPub(recoveredPubkey)
+ recoveredAddress := crypto.PubkeyToAddress(*recoveredPubkey)
+ success := address == recoveredAddress
+
+ out := outputVerify{
+ Success: success,
+ RecoveredPublicKey: hex.EncodeToString(recoveredPubkeyBytes),
+ RecoveredAddress: recoveredAddress.Hex(),
+ }
+ if ctx.Bool(jsonFlag.Name) {
+ mustPrintJSON(out)
+ } else {
+ if out.Success {
+ fmt.Println("Signature verification successful!")
+ } else {
+ fmt.Println("Signature verification failed!")
+ }
+ fmt.Println("Recovered public key:", out.RecoveredPublicKey)
+ fmt.Println("Recovered address:", out.RecoveredAddress)
+ }
+ return nil
+ },
+}
+
+func getMessage(ctx *cli.Context, msgarg int) []byte {
+ if file := ctx.String("msgfile"); file != "" {
+ if len(ctx.Args()) > msgarg {
+ utils.Fatalf("Can't use --msgfile and message argument at the same time.")
+ }
+ msg, err := ioutil.ReadFile(file)
+ if err != nil {
+ utils.Fatalf("Can't read message file: %v", err)
+ }
+ return msg
+ } else if len(ctx.Args()) == msgarg+1 {
+ return []byte(ctx.Args().Get(msgarg))
+ }
+ utils.Fatalf("Invalid number of arguments: want %d, got %d", msgarg+1, len(ctx.Args()))
+ return nil
+}
diff --git a/cmd/ethkey/message_test.go b/cmd/ethkey/message_test.go
new file mode 100644
index 000000000..fb16f03d0
--- /dev/null
+++ b/cmd/ethkey/message_test.go
@@ -0,0 +1,70 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+func TestMessageSignVerify(t *testing.T) {
+ tmpdir, err := ioutil.TempDir("", "ethkey-test")
+ if err != nil {
+ t.Fatal("Can't create temporary directory:", err)
+ }
+ defer os.RemoveAll(tmpdir)
+
+ keyfile := filepath.Join(tmpdir, "the-keyfile")
+ message := "test message"
+
+ // Create the key.
+ generate := runEthkey(t, "generate", keyfile)
+ generate.Expect(`
+!! Unsupported terminal, password will be echoed.
+Passphrase: {{.InputLine "foobar"}}
+Repeat passphrase: {{.InputLine "foobar"}}
+`)
+ _, matches := generate.ExpectRegexp(`Address: (0x[0-9a-fA-F]{40})\n`)
+ address := matches[1]
+ generate.ExpectExit()
+
+ // Sign a message.
+ sign := runEthkey(t, "signmessage", keyfile, message)
+ sign.Expect(`
+!! Unsupported terminal, password will be echoed.
+Passphrase: {{.InputLine "foobar"}}
+`)
+ _, matches = sign.ExpectRegexp(`Signature: ([0-9a-f]+)\n`)
+ signature := matches[1]
+ sign.ExpectExit()
+
+ // Verify the message.
+ verify := runEthkey(t, "verifymessage", address, signature, message)
+ _, matches = verify.ExpectRegexp(`
+Signature verification successful!
+Recovered public key: [0-9a-f]+
+Recovered address: (0x[0-9a-fA-F]{40})
+`)
+ recovered := matches[1]
+ verify.ExpectExit()
+
+ if recovered != address {
+ t.Error("recovered address doesn't match generated key")
+ }
+}
diff --git a/cmd/ethkey/run_test.go b/cmd/ethkey/run_test.go
new file mode 100644
index 000000000..8ce4fe5cd
--- /dev/null
+++ b/cmd/ethkey/run_test.go
@@ -0,0 +1,54 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "testing"
+
+ "github.com/docker/docker/pkg/reexec"
+ "github.com/ethereum/go-ethereum/internal/cmdtest"
+)
+
+type testEthkey struct {
+ *cmdtest.TestCmd
+}
+
+// spawns ethkey with the given command line args.
+func runEthkey(t *testing.T, args ...string) *testEthkey {
+ tt := new(testEthkey)
+ tt.TestCmd = cmdtest.NewTestCmd(t, tt)
+ tt.Run("ethkey-test", args...)
+ return tt
+}
+
+func TestMain(m *testing.M) {
+ // Run the app if we've been exec'd as "ethkey-test" in runEthkey.
+ reexec.Register("ethkey-test", func() {
+ if err := app.Run(os.Args); err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+ os.Exit(0)
+ })
+ // check if we have been reexec'd
+ if reexec.Init() {
+ return
+ }
+ os.Exit(m.Run())
+}
diff --git a/cmd/ethkey/utils.go b/cmd/ethkey/utils.go
new file mode 100644
index 000000000..0e563bf92
--- /dev/null
+++ b/cmd/ethkey/utils.go
@@ -0,0 +1,83 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "strings"
+
+ "github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/console"
+ "github.com/ethereum/go-ethereum/crypto"
+ "gopkg.in/urfave/cli.v1"
+)
+
+// getPassPhrase obtains a passphrase given by the user. It first checks the
+// --passphrase command line flag and ultimately prompts the user for a
+// passphrase.
+func getPassPhrase(ctx *cli.Context, confirmation bool) string {
+ // Look for the --passphrase flag.
+ passphraseFile := ctx.String(passphraseFlag.Name)
+ if passphraseFile != "" {
+ content, err := ioutil.ReadFile(passphraseFile)
+ if err != nil {
+ utils.Fatalf("Failed to read passphrase file '%s': %v",
+ passphraseFile, err)
+ }
+ return strings.TrimRight(string(content), "\r\n")
+ }
+
+ // Otherwise prompt the user for the passphrase.
+ passphrase, err := console.Stdin.PromptPassword("Passphrase: ")
+ if err != nil {
+ utils.Fatalf("Failed to read passphrase: %v", err)
+ }
+ if confirmation {
+ confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ")
+ if err != nil {
+ utils.Fatalf("Failed to read passphrase confirmation: %v", err)
+ }
+ if passphrase != confirm {
+ utils.Fatalf("Passphrases do not match")
+ }
+ }
+ return passphrase
+}
+
+// signHash is a helper function that calculates a hash for the given message
+// that can be safely used to calculate a signature from.
+//
+// The hash is calulcated as
+// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}).
+//
+// This gives context to the signed message and prevents signing of transactions.
+func signHash(data []byte) []byte {
+ msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
+ return crypto.Keccak256([]byte(msg))
+}
+
+// mustPrintJSON prints the JSON encoding of the given object and
+// exits the program with an error message when the marshaling fails.
+func mustPrintJSON(jsonObject interface{}) {
+ str, err := json.MarshalIndent(jsonObject, "", " ")
+ if err != nil {
+ utils.Fatalf("Failed to marshal JSON object: %v", err)
+ }
+ fmt.Println(string(str))
+}
diff --git a/cmd/evm/json_logger.go b/cmd/evm/json_logger.go
index eb7b0c466..47daf7dbb 100644
--- a/cmd/evm/json_logger.go
+++ b/cmd/evm/json_logger.go
@@ -19,6 +19,7 @@ package main
import (
"encoding/json"
"io"
+ "math/big"
"time"
"github.com/ethereum/go-ethereum/common"
@@ -35,6 +36,10 @@ func NewJSONLogger(cfg *vm.LogConfig, writer io.Writer) *JSONLogger {
return &JSONLogger{json.NewEncoder(writer), cfg}
}
+func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error {
+ return nil
+}
+
// CaptureState outputs state information on the logger.
func (l *JSONLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {
log := vm.StructLog{
@@ -56,6 +61,11 @@ func (l *JSONLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cos
return l.encoder.Encode(log)
}
+// CaptureFault outputs state information on the logger.
+func (l *JSONLogger) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {
+ return nil
+}
+
// CaptureEnd is triggered at end of execution.
func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {
type endLog struct {
diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go
index 96de0c76a..a9a2e5420 100644
--- a/cmd/evm/runner.go
+++ b/cmd/evm/runner.go
@@ -96,7 +96,9 @@ func runCmd(ctx *cli.Context) error {
}
if ctx.GlobalString(GenesisFlag.Name) != "" {
gen := readGenesis(ctx.GlobalString(GenesisFlag.Name))
- _, statedb = gen.ToBlock()
+ db, _ := ethdb.NewMemDatabase()
+ genesis := gen.ToBlock(db)
+ statedb, _ = state.New(genesis.Root(), state.NewDatabase(db))
chainConfig = gen.Config
} else {
db, _ := ethdb.NewMemDatabase()
diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go
index 5f16f2978..99527f9d1 100644
--- a/cmd/faucet/faucet.go
+++ b/cmd/faucet/faucet.go
@@ -18,10 +18,10 @@
package main
//go:generate go-bindata -nometadata -o website.go faucet.html
+//go:generate gofmt -w -s website.go
import (
"bytes"
- "compress/zlib"
"context"
"encoding/json"
"errors"
@@ -223,7 +223,6 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u
NoDiscovery: true,
DiscoveryV5: true,
ListenAddr: fmt.Sprintf(":%d", port),
- DiscoveryV5Addr: fmt.Sprintf(":%d", port+1),
MaxPeers: 25,
BootstrapNodesV5: enodes,
},
@@ -474,7 +473,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) {
amount = new(big.Int).Mul(amount, new(big.Int).Exp(big.NewInt(5), big.NewInt(int64(msg.Tier)), nil))
amount = new(big.Int).Div(amount, new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(msg.Tier)), nil))
- tx := types.NewTransaction(f.nonce+uint64(len(f.reqs)), address, amount, big.NewInt(21000), f.price, nil)
+ tx := types.NewTransaction(f.nonce+uint64(len(f.reqs)), address, amount, 21000, f.price, nil)
signed, err := f.keystore.SignTx(f.account, tx, f.config.ChainId)
if err != nil {
f.lock.Unlock()
@@ -698,11 +697,7 @@ func authTwitter(url string) (string, string, common.Address, error) {
}
defer res.Body.Close()
- reader, err := zlib.NewReader(res.Body)
- if err != nil {
- return "", "", common.Address{}, err
- }
- body, err := ioutil.ReadAll(reader)
+ body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", "", common.Address{}, err
}
diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go
index 7936b158e..fab1d4346 100644
--- a/cmd/faucet/website.go
+++ b/cmd/faucet/website.go
@@ -1,7 +1,6 @@
-// Code generated by go-bindata.
+// Code generated by go-bindata. DO NOT EDIT.
// sources:
// faucet.html
-// DO NOT EDIT!
package main
@@ -92,8 +91,8 @@ func faucetHtml() (*asset, error) {
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
@@ -118,8 +117,8 @@ func MustAsset(name string) []byte {
// It returns an error if the asset could not be found or
// could not be loaded.
func AssetInfo(name string) (os.FileInfo, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
@@ -159,8 +158,8 @@ var _bindata = map[string]func() (*asset, error){
func AssetDir(name string) ([]string, error) {
node := _bintree
if len(name) != 0 {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- pathList := strings.Split(cannonicalName, "/")
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(canonicalName, "/")
for _, p := range pathList {
node = node.Children[p]
if node == nil {
@@ -205,11 +204,7 @@ func RestoreAsset(dir, name string) error {
if err != nil {
return err
}
- err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
- if err != nil {
- return err
- }
- return nil
+ return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
}
// RestoreAssets restores an asset under the given directory recursively
@@ -230,6 +225,6 @@ func RestoreAssets(dir, name string) error {
}
func _filePath(dir, name string) string {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
}
diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go
index 4a9a7b11b..35bf576e1 100644
--- a/cmd/geth/chaincmd.go
+++ b/cmd/geth/chaincmd.go
@@ -202,7 +202,7 @@ func importChain(ctx *cli.Context) error {
if len(ctx.Args()) == 1 {
if err := utils.ImportChain(chain, ctx.Args().First()); err != nil {
- utils.Fatalf("Import error: %v", err)
+ log.Error("Import error", "err", err)
}
} else {
for _, arg := range ctx.Args() {
@@ -211,7 +211,7 @@ func importChain(ctx *cli.Context) error {
}
}
}
-
+ chain.Stop()
fmt.Printf("Import done in %v.\n\n", time.Since(start))
// Output pre-compaction stats mostly to see the import trashing
diff --git a/cmd/geth/config.go b/cmd/geth/config.go
index 27490c404..50e4de2e7 100644
--- a/cmd/geth/config.go
+++ b/cmd/geth/config.go
@@ -18,7 +18,6 @@ package main
import (
"bufio"
- "encoding/hex"
"errors"
"fmt"
"io"
@@ -29,7 +28,6 @@ import (
cli "gopkg.in/urfave/cli.v1"
"github.com/ethereum/go-ethereum/cmd/utils"
- "github.com/ethereum/go-ethereum/contracts/release"
"github.com/ethereum/go-ethereum/dashboard"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/node"
@@ -158,7 +156,7 @@ func makeFullNode(ctx *cli.Context) *node.Node {
utils.RegisterEthService(stack, &cfg.Eth)
if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) {
- utils.RegisterDashboardService(stack, &cfg.Dashboard)
+ utils.RegisterDashboardService(stack, &cfg.Dashboard, gitCommit)
}
// Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode
shhEnabled := enableWhisper(ctx)
@@ -177,21 +175,6 @@ func makeFullNode(ctx *cli.Context) *node.Node {
if cfg.Ethstats.URL != "" {
utils.RegisterEthStatsService(stack, cfg.Ethstats.URL)
}
-
- // Add the release oracle service so it boots along with node.
- if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
- config := release.Config{
- Oracle: relOracle,
- Major: uint32(params.VersionMajor),
- Minor: uint32(params.VersionMinor),
- Patch: uint32(params.VersionPatch),
- }
- commit, _ := hex.DecodeString(gitCommit)
- copy(config.Commit[:], commit)
- return release.NewReleaseService(ctx, config)
- }); err != nil {
- utils.Fatalf("Failed to register the Geth release oracle service: %v", err)
- }
return stack
}
diff --git a/cmd/geth/consolecmd.go b/cmd/geth/consolecmd.go
index 2c6b16687..9d5cc38a1 100644
--- a/cmd/geth/consolecmd.go
+++ b/cmd/geth/consolecmd.go
@@ -120,8 +120,12 @@ func remoteConsole(ctx *cli.Context) error {
if ctx.GlobalIsSet(utils.DataDirFlag.Name) {
path = ctx.GlobalString(utils.DataDirFlag.Name)
}
- if path != "" && ctx.GlobalBool(utils.TestnetFlag.Name) {
- path = filepath.Join(path, "testnet")
+ if path != "" {
+ if ctx.GlobalBool(utils.TestnetFlag.Name) {
+ path = filepath.Join(path, "testnet")
+ } else if ctx.GlobalBool(utils.RinkebyFlag.Name) {
+ path = filepath.Join(path, "rinkeby")
+ }
}
endpoint = fmt.Sprintf("%s/geth.ipc", path)
}
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index bdb7fad62..cb8d63bf7 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -85,10 +85,13 @@ var (
utils.FastSyncFlag,
utils.LightModeFlag,
utils.SyncModeFlag,
+ utils.GCModeFlag,
utils.LightServFlag,
utils.LightPeersFlag,
utils.LightKDFFlag,
utils.CacheFlag,
+ utils.CacheDatabaseFlag,
+ utils.CacheGCFlag,
utils.TrieCacheGenFlag,
utils.ListenPortFlag,
utils.MaxPeersFlag,
@@ -278,9 +281,12 @@ func startNode(ctx *cli.Context, stack *node.Node) {
// Start auxiliary services if enabled
if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) {
// Mining only makes sense if a full Ethereum node is running
+ if ctx.GlobalBool(utils.LightModeFlag.Name) || ctx.GlobalString(utils.SyncModeFlag.Name) == "light" {
+ utils.Fatalf("Light clients do not support mining")
+ }
var ethereum *eth.Ethereum
if err := stack.Service(&ethereum); err != nil {
- utils.Fatalf("ethereum service not running: %v", err)
+ utils.Fatalf("Ethereum service not running: %v", err)
}
// Use a reduced number of threads if requested
if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 {
diff --git a/cmd/geth/misccmd.go b/cmd/geth/misccmd.go
index 2e68dcda3..aa9b1ee56 100644
--- a/cmd/geth/misccmd.go
+++ b/cmd/geth/misccmd.go
@@ -134,7 +134,6 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with geth. If not, see <http://www.gnu.org/licenses/>.
-`)
+along with geth. If not, see <http://www.gnu.org/licenses/>.`)
return nil
}
diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go
index a834d5b7a..a2bcaff02 100644
--- a/cmd/geth/usage.go
+++ b/cmd/geth/usage.go
@@ -22,10 +22,11 @@ import (
"io"
"sort"
+ "strings"
+
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/internal/debug"
"gopkg.in/urfave/cli.v1"
- "strings"
)
// AppHelpTemplate is the test template for the default, global app help topic.
@@ -74,6 +75,7 @@ var AppHelpFlagGroups = []flagGroup{
utils.TestnetFlag,
utils.RinkebyFlag,
utils.SyncModeFlag,
+ utils.GCModeFlag,
utils.EthStatsURLFlag,
utils.IdentityFlag,
utils.LightServFlag,
@@ -127,6 +129,8 @@ var AppHelpFlagGroups = []flagGroup{
Name: "PERFORMANCE TUNING",
Flags: []cli.Flag{
utils.CacheFlag,
+ utils.CacheDatabaseFlag,
+ utils.CacheGCFlag,
utils.TrieCacheGenFlag,
},
},
diff --git a/cmd/puppeth/genesis.go b/cmd/puppeth/genesis.go
index 5e36f7fce..f747f4739 100644
--- a/cmd/puppeth/genesis.go
+++ b/cmd/puppeth/genesis.go
@@ -44,7 +44,7 @@ type cppEthereumGenesisSpec struct {
MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"`
MinGasLimit hexutil.Uint64 `json:"minGasLimit"`
MaxGasLimit hexutil.Uint64 `json:"maxGasLimit"`
- GasLimitBoundDivisor *hexutil.Big `json:"gasLimitBoundDivisor"`
+ GasLimitBoundDivisor hexutil.Uint64 `json:"gasLimitBoundDivisor"`
MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"`
DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"`
DurationLimit *hexutil.Big `json:"durationLimit"`
@@ -107,11 +107,11 @@ func newCppEthereumGenesisSpec(network string, genesis *core.Genesis) (*cppEther
spec.Params.ChainID = (hexutil.Uint64)(genesis.Config.ChainId.Uint64())
spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize)
- spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit.Uint64())
+ spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit)
spec.Params.MaxGasLimit = (hexutil.Uint64)(math.MaxUint64)
spec.Params.MinimumDifficulty = (*hexutil.Big)(params.MinimumDifficulty)
spec.Params.DifficultyBoundDivisor = (*hexutil.Big)(params.DifficultyBoundDivisor)
- spec.Params.GasLimitBoundDivisor = (*hexutil.Big)(params.GasLimitBoundDivisor)
+ spec.Params.GasLimitBoundDivisor = (hexutil.Uint64)(params.GasLimitBoundDivisor)
spec.Params.DurationLimit = (*hexutil.Big)(params.DurationLimit)
spec.Params.BlockReward = (*hexutil.Big)(ethash.FrontierBlockReward)
@@ -168,26 +168,26 @@ type parityChainSpec struct {
Engine struct {
Ethash struct {
Params struct {
- MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"`
- DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"`
- GasLimitBoundDivisor *hexutil.Big `json:"gasLimitBoundDivisor"`
- DurationLimit *hexutil.Big `json:"durationLimit"`
- BlockReward *hexutil.Big `json:"blockReward"`
- HomesteadTransition uint64 `json:"homesteadTransition"`
- EIP150Transition uint64 `json:"eip150Transition"`
- EIP160Transition uint64 `json:"eip160Transition"`
- EIP161abcTransition uint64 `json:"eip161abcTransition"`
- EIP161dTransition uint64 `json:"eip161dTransition"`
- EIP649Reward *hexutil.Big `json:"eip649Reward"`
- EIP100bTransition uint64 `json:"eip100bTransition"`
- EIP649Transition uint64 `json:"eip649Transition"`
+ MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"`
+ DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"`
+ GasLimitBoundDivisor hexutil.Uint64 `json:"gasLimitBoundDivisor"`
+ DurationLimit *hexutil.Big `json:"durationLimit"`
+ BlockReward *hexutil.Big `json:"blockReward"`
+ HomesteadTransition uint64 `json:"homesteadTransition"`
+ EIP150Transition uint64 `json:"eip150Transition"`
+ EIP160Transition uint64 `json:"eip160Transition"`
+ EIP161abcTransition uint64 `json:"eip161abcTransition"`
+ EIP161dTransition uint64 `json:"eip161dTransition"`
+ EIP649Reward *hexutil.Big `json:"eip649Reward"`
+ EIP100bTransition uint64 `json:"eip100bTransition"`
+ EIP649Transition uint64 `json:"eip649Transition"`
} `json:"params"`
} `json:"Ethash"`
} `json:"engine"`
Params struct {
MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"`
- MinGasLimit *hexutil.Big `json:"minGasLimit"`
+ MinGasLimit hexutil.Uint64 `json:"minGasLimit"`
NetworkID hexutil.Uint64 `json:"networkID"`
MaxCodeSize uint64 `json:"maxCodeSize"`
EIP155Transition uint64 `json:"eip155Transition"`
@@ -270,7 +270,7 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin
}
spec.Engine.Ethash.Params.MinimumDifficulty = (*hexutil.Big)(params.MinimumDifficulty)
spec.Engine.Ethash.Params.DifficultyBoundDivisor = (*hexutil.Big)(params.DifficultyBoundDivisor)
- spec.Engine.Ethash.Params.GasLimitBoundDivisor = (*hexutil.Big)(params.GasLimitBoundDivisor)
+ spec.Engine.Ethash.Params.GasLimitBoundDivisor = (hexutil.Uint64)(params.GasLimitBoundDivisor)
spec.Engine.Ethash.Params.DurationLimit = (*hexutil.Big)(params.DurationLimit)
spec.Engine.Ethash.Params.BlockReward = (*hexutil.Big)(ethash.FrontierBlockReward)
spec.Engine.Ethash.Params.HomesteadTransition = genesis.Config.HomesteadBlock.Uint64()
@@ -283,7 +283,7 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin
spec.Engine.Ethash.Params.EIP649Transition = genesis.Config.ByzantiumBlock.Uint64()
spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize)
- spec.Params.MinGasLimit = (*hexutil.Big)(params.MinGasLimit)
+ spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit)
spec.Params.NetworkID = (hexutil.Uint64)(genesis.Config.ChainId.Uint64())
spec.Params.MaxCodeSize = params.MaxCodeSize
spec.Params.EIP155Transition = genesis.Config.EIP155Block.Uint64()
diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go
index 57b7a2dc0..92b4cb286 100644
--- a/cmd/puppeth/module_faucet.go
+++ b/cmd/puppeth/module_faucet.go
@@ -39,6 +39,8 @@ ADD genesis.json /genesis.json
ADD account.json /account.json
ADD account.pass /account.pass
+EXPOSE 8080 30303 30303/udp
+
ENTRYPOINT [ \
"faucet", "--genesis", "/genesis.json", "--network", "{{.NetworkID}}", "--bootnodes", "{{.Bootnodes}}", "--ethstats", "{{.Ethstats}}", "--ethport", "{{.EthPort}}", \
"--faucet.name", "{{.FaucetName}}", "--faucet.amount", "{{.FaucetAmount}}", "--faucet.minutes", "{{.FaucetMinutes}}", "--faucet.tiers", "{{.FaucetTiers}}", \
diff --git a/cmd/swarm/config.go b/cmd/swarm/config.go
index a3c03c00d..adac772ba 100644
--- a/cmd/swarm/config.go
+++ b/cmd/swarm/config.go
@@ -361,7 +361,7 @@ func validateEnsAPIs(s string) (err error) {
func printConfig(config *bzzapi.Config) string {
out, err := tomlSettings.Marshal(&config)
if err != nil {
- return (fmt.Sprintf("Something is not right with the configuration: %v", err))
+ return fmt.Sprintf("Something is not right with the configuration: %v", err)
}
return string(out)
}
diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go
index 23b10c2d7..53cdf7861 100644
--- a/cmd/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -116,7 +116,6 @@ func ImportChain(chain *core.BlockChain, fn string) error {
return err
}
}
-
stream := rlp.NewStream(reader, 0)
// Run actual the import.
@@ -150,25 +149,34 @@ func ImportChain(chain *core.BlockChain, fn string) error {
if checkInterrupt() {
return fmt.Errorf("interrupted")
}
- if hasAllBlocks(chain, blocks[:i]) {
+ missing := missingBlocks(chain, blocks[:i])
+ if len(missing) == 0 {
log.Info("Skipping batch as all blocks present", "batch", batch, "first", blocks[0].Hash(), "last", blocks[i-1].Hash())
continue
}
-
- if _, err := chain.InsertChain(blocks[:i]); err != nil {
+ if _, err := chain.InsertChain(missing); err != nil {
return fmt.Errorf("invalid block %d: %v", n, err)
}
}
return nil
}
-func hasAllBlocks(chain *core.BlockChain, bs []*types.Block) bool {
- for _, b := range bs {
- if !chain.HasBlock(b.Hash(), b.NumberU64()) {
- return false
+func missingBlocks(chain *core.BlockChain, blocks []*types.Block) []*types.Block {
+ head := chain.CurrentBlock()
+ for i, block := range blocks {
+ // If we're behind the chain head, only check block, state is available at head
+ if head.NumberU64() > block.NumberU64() {
+ if !chain.HasBlock(block.Hash(), block.NumberU64()) {
+ return blocks[i:]
+ }
+ continue
+ }
+ // If we're above the chain head, state availability is a must
+ if !chain.HasBlockAndState(block.Hash(), block.NumberU64()) {
+ return blocks[i:]
}
}
- return true
+ return nil
}
func ExportChain(blockchain *core.BlockChain, fn string) error {
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 30edf199c..2a2909ff2 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -31,6 +31,7 @@ import (
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/fdlimit"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/consensus/clique"
"github.com/ethereum/go-ethereum/consensus/ethash"
@@ -96,7 +97,7 @@ func NewApp(gitCommit, usage string) *cli.App {
//app.Authors = nil
app.Email = ""
app.Version = params.Version
- if gitCommit != "" {
+ if len(gitCommit) >= 8 {
app.Version += "-" + gitCommit[:8]
}
app.Usage = usage
@@ -169,7 +170,11 @@ var (
Usage: `Blockchain sync mode ("fast", "full", or "light")`,
Value: &defaultSyncMode,
}
-
+ GCModeFlag = cli.StringFlag{
+ Name: "gcmode",
+ Usage: `Blockchain garbage collection mode ("full", "archive")`,
+ Value: "full",
+ }
LightServFlag = cli.IntFlag{
Name: "lightserv",
Usage: "Maximum percentage of time allowed for serving LES requests (0-90)",
@@ -178,7 +183,7 @@ var (
LightPeersFlag = cli.IntFlag{
Name: "lightpeers",
Usage: "Maximum number of LES client peers",
- Value: 20,
+ Value: eth.DefaultConfig.LightPeers,
}
LightKDFFlag = cli.BoolFlag{
Name: "lightkdf",
@@ -292,8 +297,18 @@ var (
// Performance tuning settings
CacheFlag = cli.IntFlag{
Name: "cache",
- Usage: "Megabytes of memory allocated to internal caching (min 16MB / database forced)",
- Value: 128,
+ Usage: "Megabytes of memory allocated to internal caching",
+ Value: 1024,
+ }
+ CacheDatabaseFlag = cli.IntFlag{
+ Name: "cache.database",
+ Usage: "Percentage of cache memory allowance to use for database io",
+ Value: 75,
+ }
+ CacheGCFlag = cli.IntFlag{
+ Name: "cache.gc",
+ Usage: "Percentage of cache memory allowance to use for trie pruning",
+ Value: 25,
}
TrieCacheGenFlag = cli.IntFlag{
Name: "trie-cache-gens",
@@ -313,7 +328,7 @@ var (
TargetGasLimitFlag = cli.Uint64Flag{
Name: "targetgaslimit",
Usage: "Target gas limit sets the artificial target gas floor for the blocks to mine",
- Value: params.GenesisGasLimit.Uint64(),
+ Value: params.GenesisGasLimit,
}
EtherbaseFlag = cli.StringFlag{
Name: "etherbase",
@@ -611,7 +626,7 @@ func setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) {
urls = strings.Split(ctx.GlobalString(BootnodesFlag.Name), ",")
}
case ctx.GlobalBool(RinkebyFlag.Name):
- urls = params.RinkebyV5Bootnodes
+ urls = params.RinkebyBootnodes
case cfg.BootstrapNodesV5 != nil:
return // already set, don't apply defaults.
}
@@ -635,14 +650,6 @@ func setListenAddress(ctx *cli.Context, cfg *p2p.Config) {
}
}
-// setDiscoveryV5Address creates a UDP listening address string from set command
-// line flags for the V5 discovery protocol.
-func setDiscoveryV5Address(ctx *cli.Context, cfg *p2p.Config) {
- if ctx.GlobalIsSet(ListenPortFlag.Name) {
- cfg.DiscoveryV5Addr = fmt.Sprintf(":%d", ctx.GlobalInt(ListenPortFlag.Name)+1)
- }
-}
-
// setNAT creates a port mapper from command line flags.
func setNAT(ctx *cli.Context, cfg *p2p.Config) {
if ctx.GlobalIsSet(NATFlag.Name) {
@@ -721,13 +728,15 @@ func setIPC(ctx *cli.Context, cfg *node.Config) {
// makeDatabaseHandles raises out the number of allowed file handles per process
// for Geth and returns half of the allowance to assign to the database.
func makeDatabaseHandles() int {
- if err := raiseFdLimit(2048); err != nil {
- Fatalf("Failed to raise file descriptor allowance: %v", err)
- }
- limit, err := getFdLimit()
+ limit, err := fdlimit.Current()
if err != nil {
Fatalf("Failed to retrieve file descriptor allowance: %v", err)
}
+ if limit < 2048 {
+ if err := fdlimit.Raise(2048); err != nil {
+ Fatalf("Failed to raise file descriptor allowance: %v", err)
+ }
+ }
if limit > 2048 { // cap database file descriptors even if more is available
limit = 2048
}
@@ -793,24 +802,43 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) {
setNodeKey(ctx, cfg)
setNAT(ctx, cfg)
setListenAddress(ctx, cfg)
- setDiscoveryV5Address(ctx, cfg)
setBootstrapNodes(ctx, cfg)
setBootstrapNodesV5(ctx, cfg)
+ lightClient := ctx.GlobalBool(LightModeFlag.Name) || ctx.GlobalString(SyncModeFlag.Name) == "light"
+ lightServer := ctx.GlobalInt(LightServFlag.Name) != 0
+ lightPeers := ctx.GlobalInt(LightPeersFlag.Name)
+
if ctx.GlobalIsSet(MaxPeersFlag.Name) {
cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name)
+ } else {
+ if lightServer {
+ cfg.MaxPeers += lightPeers
+ }
+ if lightClient && ctx.GlobalIsSet(LightPeersFlag.Name) && cfg.MaxPeers < lightPeers {
+ cfg.MaxPeers = lightPeers
+ }
}
+ if !(lightClient || lightServer) {
+ lightPeers = 0
+ }
+ ethPeers := cfg.MaxPeers - lightPeers
+ if lightClient {
+ ethPeers = 0
+ }
+ log.Info("Maximum peer count", "ETH", ethPeers, "LES", lightPeers, "total", cfg.MaxPeers)
+
if ctx.GlobalIsSet(MaxPendingPeersFlag.Name) {
cfg.MaxPendingPeers = ctx.GlobalInt(MaxPendingPeersFlag.Name)
}
- if ctx.GlobalIsSet(NoDiscoverFlag.Name) || ctx.GlobalBool(LightModeFlag.Name) {
+ if ctx.GlobalIsSet(NoDiscoverFlag.Name) || lightClient {
cfg.NoDiscovery = true
}
// if we're running a light client or server, force enable the v5 peer discovery
// unless it is explicitly disabled with --nodiscover note that explicitly specifying
// --v5disc overrides --nodiscover, in which case the later only disables v4 discovery
- forceV5Discovery := (ctx.GlobalBool(LightModeFlag.Name) || ctx.GlobalInt(LightServFlag.Name) > 0) && !ctx.GlobalBool(NoDiscoverFlag.Name)
+ forceV5Discovery := (lightClient || lightServer) && !ctx.GlobalBool(NoDiscoverFlag.Name)
if ctx.GlobalIsSet(DiscoveryV5Flag.Name) {
cfg.DiscoveryV5 = ctx.GlobalBool(DiscoveryV5Flag.Name)
} else if forceV5Discovery {
@@ -829,7 +857,6 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) {
// --dev mode can't use p2p networking.
cfg.MaxPeers = 0
cfg.ListenAddr = ":0"
- cfg.DiscoveryV5Addr = ":0"
cfg.NoDiscovery = true
cfg.DiscoveryV5 = false
}
@@ -1008,11 +1035,19 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name)
}
- if ctx.GlobalIsSet(CacheFlag.Name) {
- cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name)
+ if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) {
+ cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100
}
cfg.DatabaseHandles = makeDatabaseHandles()
+ if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" {
+ Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name)
+ }
+ cfg.NoPruning = ctx.GlobalString(GCModeFlag.Name) == "archive"
+
+ if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) {
+ cfg.TrieCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100
+ }
if ctx.GlobalIsSet(MinerThreadsFlag.Name) {
cfg.MinerThreads = ctx.GlobalInt(MinerThreadsFlag.Name)
}
@@ -1103,9 +1138,9 @@ func RegisterEthService(stack *node.Node, cfg *eth.Config) {
}
// RegisterDashboardService adds a dashboard to the stack.
-func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config) {
+func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config, commit string) {
stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
- return dashboard.New(cfg)
+ return dashboard.New(cfg, commit)
})
}
@@ -1138,13 +1173,13 @@ func RegisterEthStatsService(stack *node.Node, url string) {
// SetupNetwork configures the system for either the main net or some test network.
func SetupNetwork(ctx *cli.Context) {
// TODO(fjl): move target gas limit into config
- params.TargetGasLimit = new(big.Int).SetUint64(ctx.GlobalUint64(TargetGasLimitFlag.Name))
+ params.TargetGasLimit = ctx.GlobalUint64(TargetGasLimitFlag.Name)
}
// MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails.
func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database {
var (
- cache = ctx.GlobalInt(CacheFlag.Name)
+ cache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100
handles = makeDatabaseHandles()
)
name := "chaindata"
@@ -1196,8 +1231,19 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai
})
}
}
+ if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" {
+ Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name)
+ }
+ cache := &core.CacheConfig{
+ Disabled: ctx.GlobalString(GCModeFlag.Name) == "archive",
+ TrieNodeLimit: eth.DefaultConfig.TrieCache,
+ TrieTimeLimit: eth.DefaultConfig.TrieTimeout,
+ }
+ if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) {
+ cache.TrieNodeLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100
+ }
vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)}
- chain, err = core.NewBlockChain(chainDb, config, engine, vmcfg)
+ chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg)
if err != nil {
Fatalf("Can't create BlockChain: %v", err)
}
diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go
index 05e6b2908..e69b57d69 100644
--- a/cmd/wnode/main.go
+++ b/cmd/wnode/main.go
@@ -601,7 +601,7 @@ func requestExpiredMessagesLoop() {
if err != nil {
utils.Fatalf("Failed to save symmetric key for mail request: %s", err)
}
- peerID = extractIdFromEnode(*argEnode)
+ peerID = extractIDFromEnode(*argEnode)
shh.AllowP2PMessagesFromPeer(peerID)
for {
@@ -652,7 +652,7 @@ func requestExpiredMessagesLoop() {
}
}
-func extractIdFromEnode(s string) []byte {
+func extractIDFromEnode(s string) []byte {
n, err := discover.ParseNode(s)
if err != nil {
utils.Fatalf("Failed to parse enode: %s", err)
diff --git a/common/bitutil/bitutil.go b/common/bitutil/bitutil.go
index 117616543..cd3e72169 100644
--- a/common/bitutil/bitutil.go
+++ b/common/bitutil/bitutil.go
@@ -40,7 +40,7 @@ func fastXORBytes(dst, a, b []byte) int {
dw[i] = aw[i] ^ bw[i]
}
}
- for i := (n - n%wordSize); i < n; i++ {
+ for i := n - n%wordSize; i < n; i++ {
dst[i] = a[i] ^ b[i]
}
return n
@@ -84,7 +84,7 @@ func fastANDBytes(dst, a, b []byte) int {
dw[i] = aw[i] & bw[i]
}
}
- for i := (n - n%wordSize); i < n; i++ {
+ for i := n - n%wordSize; i < n; i++ {
dst[i] = a[i] & b[i]
}
return n
@@ -128,7 +128,7 @@ func fastORBytes(dst, a, b []byte) int {
dw[i] = aw[i] | bw[i]
}
}
- for i := (n - n%wordSize); i < n; i++ {
+ for i := n - n%wordSize; i < n; i++ {
dst[i] = a[i] | b[i]
}
return n
@@ -168,7 +168,7 @@ func fastTestBytes(p []byte) bool {
}
}
}
- for i := (n - n%wordSize); i < n; i++ {
+ for i := n - n%wordSize; i < n; i++ {
if p[i] != 0 {
return true
}
diff --git a/cmd/utils/fdlimit_freebsd.go b/common/fdlimit/fdlimit_freebsd.go
index 4cb5013c8..25caaafe2 100644
--- a/cmd/utils/fdlimit_freebsd.go
+++ b/common/fdlimit/fdlimit_freebsd.go
@@ -16,7 +16,7 @@
// +build freebsd
-package utils
+package fdlimit
import "syscall"
@@ -24,9 +24,9 @@ import "syscall"
// but Rlimit fields have type int64 on FreeBSD so it needs
// an extra conversion.
-// raiseFdLimit tries to maximize the file descriptor allowance of this process
+// Raise tries to maximize the file descriptor allowance of this process
// to the maximum hard-limit allowed by the OS.
-func raiseFdLimit(max uint64) error {
+func Raise(max uint64) error {
// Get the current limit
var limit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
@@ -43,12 +43,22 @@ func raiseFdLimit(max uint64) error {
return nil
}
-// getFdLimit retrieves the number of file descriptors allowed to be opened by this
+// Current retrieves the number of file descriptors allowed to be opened by this
// process.
-func getFdLimit() (int, error) {
+func Current() (int, error) {
var limit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
return 0, err
}
return int(limit.Cur), nil
}
+
+// Maximum retrieves the maximum number of file descriptors this process is
+// allowed to request for itself.
+func Maximum() (int, error) {
+ var limit syscall.Rlimit
+ if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
+ return 0, err
+ }
+ return int(limit.Max), nil
+}
diff --git a/cmd/utils/fdlimit_test.go b/common/fdlimit/fdlimit_test.go
index 0a950a6c9..05e9f0b65 100644
--- a/cmd/utils/fdlimit_test.go
+++ b/common/fdlimit/fdlimit_test.go
@@ -14,22 +14,32 @@
// You should have received a copy of the GNU General Public License
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
-package utils
+package fdlimit
-import "testing"
+import (
+ "fmt"
+ "testing"
+)
// TestFileDescriptorLimits simply tests whether the file descriptor allowance
// per this process can be retrieved.
func TestFileDescriptorLimits(t *testing.T) {
target := 4096
+ hardlimit, err := Maximum()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if hardlimit < target {
+ t.Skip(fmt.Sprintf("system limit is less than desired test target: %d < %d", hardlimit, target))
+ }
- if limit, err := getFdLimit(); err != nil || limit <= 0 {
+ if limit, err := Current(); err != nil || limit <= 0 {
t.Fatalf("failed to retrieve file descriptor limit (%d): %v", limit, err)
}
- if err := raiseFdLimit(uint64(target)); err != nil {
+ if err := Raise(uint64(target)); err != nil {
t.Fatalf("failed to raise file allowance")
}
- if limit, err := getFdLimit(); err != nil || limit < target {
+ if limit, err := Current(); err != nil || limit < target {
t.Fatalf("failed to retrieve raised descriptor limit (have %v, want %v): %v", limit, target, err)
}
}
diff --git a/cmd/utils/fdlimit_unix.go b/common/fdlimit/fdlimit_unix.go
index 08e153bbd..27c7e783f 100644
--- a/cmd/utils/fdlimit_unix.go
+++ b/common/fdlimit/fdlimit_unix.go
@@ -16,13 +16,13 @@
// +build linux darwin netbsd openbsd solaris
-package utils
+package fdlimit
import "syscall"
-// raiseFdLimit tries to maximize the file descriptor allowance of this process
+// Raise tries to maximize the file descriptor allowance of this process
// to the maximum hard-limit allowed by the OS.
-func raiseFdLimit(max uint64) error {
+func Raise(max uint64) error {
// Get the current limit
var limit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
@@ -39,12 +39,22 @@ func raiseFdLimit(max uint64) error {
return nil
}
-// getFdLimit retrieves the number of file descriptors allowed to be opened by this
+// Current retrieves the number of file descriptors allowed to be opened by this
// process.
-func getFdLimit() (int, error) {
+func Current() (int, error) {
var limit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
return 0, err
}
return int(limit.Cur), nil
}
+
+// Maximum retrieves the maximum number of file descriptors this process is
+// allowed to request for itself.
+func Maximum() (int, error) {
+ var limit syscall.Rlimit
+ if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
+ return 0, err
+ }
+ return int(limit.Max), nil
+}
diff --git a/cmd/utils/fdlimit_windows.go b/common/fdlimit/fdlimit_windows.go
index 53aad3d7a..efcd3220e 100644
--- a/cmd/utils/fdlimit_windows.go
+++ b/common/fdlimit/fdlimit_windows.go
@@ -14,13 +14,13 @@
// You should have received a copy of the GNU General Public License
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
-package utils
+package fdlimit
import "errors"
-// raiseFdLimit tries to maximize the file descriptor allowance of this process
+// Raise tries to maximize the file descriptor allowance of this process
// to the maximum hard-limit allowed by the OS.
-func raiseFdLimit(max uint64) error {
+func Raise(max uint64) error {
// This method is NOP by design:
// * Linux/Darwin counterparts need to manually increase per process limits
// * On Windows Go uses the CreateFile API, which is limited to 16K files, non
@@ -33,9 +33,15 @@ func raiseFdLimit(max uint64) error {
return nil
}
-// getFdLimit retrieves the number of file descriptors allowed to be opened by this
+// Current retrieves the number of file descriptors allowed to be opened by this
// process.
-func getFdLimit() (int, error) {
- // Please see raiseFdLimit for the reason why we use hard coded 16K as the limit
+func Current() (int, error) {
+ // Please see Raise for the reason why we use hard coded 16K as the limit
return 16384, nil
}
+
+// Maximum retrieves the maximum number of file descriptors this process is
+// allowed to request for itself.
+func Maximum() (int, error) {
+ return Current()
+}
diff --git a/common/size.go b/common/size.go
index c5a0cb0f2..bd0fc85c7 100644
--- a/common/size.go
+++ b/common/size.go
@@ -20,18 +20,29 @@ import (
"fmt"
)
+// StorageSize is a wrapper around a float value that supports user friendly
+// formatting.
type StorageSize float64
-func (self StorageSize) String() string {
- if self > 1000000 {
- return fmt.Sprintf("%.2f mB", self/1000000)
- } else if self > 1000 {
- return fmt.Sprintf("%.2f kB", self/1000)
+// String implements the stringer interface.
+func (s StorageSize) String() string {
+ if s > 1000000 {
+ return fmt.Sprintf("%.2f mB", s/1000000)
+ } else if s > 1000 {
+ return fmt.Sprintf("%.2f kB", s/1000)
} else {
- return fmt.Sprintf("%.2f B", self)
+ return fmt.Sprintf("%.2f B", s)
}
}
-func (self StorageSize) Int64() int64 {
- return int64(self)
+// TerminalString implements log.TerminalStringer, formatting a string for console
+// output during logging.
+func (s StorageSize) TerminalString() string {
+ if s > 1000000 {
+ return fmt.Sprintf("%.2fmB", s/1000000)
+ } else if s > 1000 {
+ return fmt.Sprintf("%.2fkB", s/1000)
+ } else {
+ return fmt.Sprintf("%.2fB", s)
+ }
}
diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go
index a98058141..2bdad9092 100644
--- a/consensus/clique/clique.go
+++ b/consensus/clique/clique.go
@@ -510,7 +510,6 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro
header.Nonce = types.BlockNonce{}
number := header.Number.Uint64()
-
// Assemble the voting snapshot to check which votes make sense
snap, err := c.snapshot(chain, number-1, header.ParentHash, nil)
if err != nil {
@@ -538,10 +537,8 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro
c.lock.RUnlock()
}
// Set the correct difficulty
- header.Difficulty = diffNoTurn
- if snap.inturn(header.Number.Uint64(), c.signer) {
- header.Difficulty = diffInTurn
- }
+ header.Difficulty = CalcDifficulty(snap, c.signer)
+
// Ensure the extra data has all it's components
if len(header.Extra) < extraVanity {
header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...)
@@ -655,6 +652,27 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, stop <-ch
return block.WithSeal(header), nil
}
+// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty
+// that a new block should have based on the previous blocks in the chain and the
+// current signer.
+func (c *Clique) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int {
+ snap, err := c.snapshot(chain, parent.Number.Uint64(), parent.Hash(), nil)
+ if err != nil {
+ return nil
+ }
+ return CalcDifficulty(snap, c.signer)
+}
+
+// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty
+// that a new block should have based on the previous blocks in the chain and the
+// current signer.
+func CalcDifficulty(snap *Snapshot, signer common.Address) *big.Int {
+ if snap.inturn(snap.Number+1, signer) {
+ return new(big.Int).Set(diffInTurn)
+ }
+ return new(big.Int).Set(diffNoTurn)
+}
+
// APIs implements consensus.Engine, returning the user facing RPC API to allow
// controlling the signer voting.
func (c *Clique) APIs(chain consensus.ChainReader) []rpc.API {
diff --git a/consensus/consensus.go b/consensus/consensus.go
index 865238cee..be5e661c1 100644
--- a/consensus/consensus.go
+++ b/consensus/consensus.go
@@ -23,6 +23,7 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
+ "math/big"
)
// ChainReader defines a small collection of methods needed to access the local
@@ -88,6 +89,10 @@ type Engine interface {
// seal place on top.
Seal(chain ChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error)
+ // CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty
+ // that a new block should have.
+ CalcDifficulty(chain ChainReader, time uint64, parent *types.Header) *big.Int
+
// APIs returns the RPC APIs this consensus engine provides.
APIs(chain ChainReader) []rpc.API
}
diff --git a/consensus/errors.go b/consensus/errors.go
index 3b136dbdd..a005c5f63 100644
--- a/consensus/errors.go
+++ b/consensus/errors.go
@@ -23,6 +23,10 @@ var (
// that is unknown.
ErrUnknownAncestor = errors.New("unknown ancestor")
+ // ErrPrunedAncestor is returned when validating a block requires an ancestor
+ // that is known, but the state of which is not available.
+ ErrPrunedAncestor = errors.New("pruned ancestor")
+
// ErrFutureBlock is returned when a block's timestamp is in the future according
// to the current node.
ErrFutureBlock = errors.New("block in the future")
diff --git a/consensus/ethash/algorithm.go b/consensus/ethash/algorithm.go
index 76f19252f..10767bb31 100644
--- a/consensus/ethash/algorithm.go
+++ b/consensus/ethash/algorithm.go
@@ -355,9 +355,11 @@ func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte)
return hashimoto(hash, nonce, uint64(len(dataset))*4, lookup)
}
+const maxEpoch = 2048
+
// datasetSizes is a lookup table for the ethash dataset size for the first 2048
// epochs (i.e. 61440000 blocks).
-var datasetSizes = []uint64{
+var datasetSizes = [maxEpoch]uint64{
1073739904, 1082130304, 1090514816, 1098906752, 1107293056,
1115684224, 1124070016, 1132461952, 1140849536, 1149232768,
1157627776, 1166013824, 1174404736, 1182786944, 1191180416,
@@ -771,7 +773,7 @@ var datasetSizes = []uint64{
// cacheSizes is a lookup table for the ethash verification cache size for the
// first 2048 epochs (i.e. 61440000 blocks).
-var cacheSizes = []uint64{
+var cacheSizes = [maxEpoch]uint64{
16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072,
17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088,
18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208,
diff --git a/consensus/ethash/algorithm_go1.7.go b/consensus/ethash/algorithm_go1.7.go
index c34d041c3..c7f7f48e4 100644
--- a/consensus/ethash/algorithm_go1.7.go
+++ b/consensus/ethash/algorithm_go1.7.go
@@ -25,7 +25,7 @@ package ethash
func cacheSize(block uint64) uint64 {
// If we have a pre-generated value, use that
epoch := int(block / epochLength)
- if epoch < len(cacheSizes) {
+ if epoch < maxEpoch {
return cacheSizes[epoch]
}
// We don't have a way to verify primes fast before Go 1.8
@@ -39,7 +39,7 @@ func cacheSize(block uint64) uint64 {
func datasetSize(block uint64) uint64 {
// If we have a pre-generated value, use that
epoch := int(block / epochLength)
- if epoch < len(datasetSizes) {
+ if epoch < maxEpoch {
return datasetSizes[epoch]
}
// We don't have a way to verify primes fast before Go 1.8
diff --git a/consensus/ethash/algorithm_go1.8.go b/consensus/ethash/algorithm_go1.8.go
index d691b758f..975fdffe5 100644
--- a/consensus/ethash/algorithm_go1.8.go
+++ b/consensus/ethash/algorithm_go1.8.go
@@ -20,17 +20,20 @@ package ethash
import "math/big"
-// cacheSize calculates and returns the size of the ethash verification cache that
-// belongs to a certain block number. The cache size grows linearly, however, we
-// always take the highest prime below the linearly growing threshold in order to
-// reduce the risk of accidental regularities leading to cyclic behavior.
+// cacheSize returns the size of the ethash verification cache that belongs to a certain
+// block number.
func cacheSize(block uint64) uint64 {
- // If we have a pre-generated value, use that
epoch := int(block / epochLength)
- if epoch < len(cacheSizes) {
+ if epoch < maxEpoch {
return cacheSizes[epoch]
}
- // No known cache size, calculate manually (sanity branch only)
+ return calcCacheSize(epoch)
+}
+
+// calcCacheSize calculates the cache size for epoch. The cache size grows linearly,
+// however, we always take the highest prime below the linearly growing threshold in order
+// to reduce the risk of accidental regularities leading to cyclic behavior.
+func calcCacheSize(epoch int) uint64 {
size := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes
for !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64
size -= 2 * hashBytes
@@ -38,17 +41,20 @@ func cacheSize(block uint64) uint64 {
return size
}
-// datasetSize calculates and returns the size of the ethash mining dataset that
-// belongs to a certain block number. The dataset size grows linearly, however, we
-// always take the highest prime below the linearly growing threshold in order to
-// reduce the risk of accidental regularities leading to cyclic behavior.
+// datasetSize returns the size of the ethash mining dataset that belongs to a certain
+// block number.
func datasetSize(block uint64) uint64 {
- // If we have a pre-generated value, use that
epoch := int(block / epochLength)
- if epoch < len(datasetSizes) {
+ if epoch < maxEpoch {
return datasetSizes[epoch]
}
- // No known dataset size, calculate manually (sanity branch only)
+ return calcDatasetSize(epoch)
+}
+
+// calcDatasetSize calculates the dataset size for epoch. The dataset size grows linearly,
+// however, we always take the highest prime below the linearly growing threshold in order
+// to reduce the risk of accidental regularities leading to cyclic behavior.
+func calcDatasetSize(epoch int) uint64 {
size := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes
for !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64
size -= 2 * mixBytes
diff --git a/consensus/ethash/algorithm_go1.8_test.go b/consensus/ethash/algorithm_go1.8_test.go
index a822944a6..6648bd6a9 100644
--- a/consensus/ethash/algorithm_go1.8_test.go
+++ b/consensus/ethash/algorithm_go1.8_test.go
@@ -23,24 +23,15 @@ import "testing"
// Tests whether the dataset size calculator works correctly by cross checking the
// hard coded lookup table with the value generated by it.
func TestSizeCalculations(t *testing.T) {
- var tests []uint64
-
- // Verify all the cache sizes from the lookup table
- defer func(sizes []uint64) { cacheSizes = sizes }(cacheSizes)
- tests, cacheSizes = cacheSizes, []uint64{}
-
- for i, test := range tests {
- if size := cacheSize(uint64(i*epochLength) + 1); size != test {
- t.Errorf("cache %d: cache size mismatch: have %d, want %d", i, size, test)
+ // Verify all the cache and dataset sizes from the lookup table.
+ for epoch, want := range cacheSizes {
+ if size := calcCacheSize(epoch); size != want {
+ t.Errorf("cache %d: cache size mismatch: have %d, want %d", epoch, size, want)
}
}
- // Verify all the dataset sizes from the lookup table
- defer func(sizes []uint64) { datasetSizes = sizes }(datasetSizes)
- tests, datasetSizes = datasetSizes, []uint64{}
-
- for i, test := range tests {
- if size := datasetSize(uint64(i*epochLength) + 1); size != test {
- t.Errorf("dataset %d: dataset size mismatch: have %d, want %d", i, size, test)
+ for epoch, want := range datasetSizes {
+ if size := calcDatasetSize(epoch); size != want {
+ t.Errorf("dataset %d: dataset size mismatch: have %d, want %d", epoch, size, want)
}
}
}
diff --git a/consensus/ethash/algorithm_test.go b/consensus/ethash/algorithm_test.go
index 7765ff9fe..a54f3b582 100644
--- a/consensus/ethash/algorithm_test.go
+++ b/consensus/ethash/algorithm_test.go
@@ -688,8 +688,8 @@ func TestConcurrentDiskCacheGeneration(t *testing.T) {
TxHash: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
ReceiptHash: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
Difficulty: big.NewInt(167925187834220),
- GasLimit: big.NewInt(4015682),
- GasUsed: big.NewInt(0),
+ GasLimit: 4015682,
+ GasUsed: 0,
Time: big.NewInt(1488928920),
Extra: []byte("www.bw.com"),
MixDigest: common.HexToHash("0x3e140b0784516af5e5ec6730f2fb20cca22f32be399b9e4ad77d32541f798cd0"),
diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go
index 775419e06..92a23d4a4 100644
--- a/consensus/ethash/consensus.go
+++ b/consensus/ethash/consensus.go
@@ -36,9 +36,10 @@ import (
// Ethash proof-of-work protocol constants.
var (
- FrontierBlockReward *big.Int = big.NewInt(5e+18) // Block reward in wei for successfully mining a block
- ByzantiumBlockReward *big.Int = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Byzantium
- maxUncles = 2 // Maximum number of uncles allowed in a single block
+ FrontierBlockReward *big.Int = big.NewInt(5e+18) // Block reward in wei for successfully mining a block
+ ByzantiumBlockReward *big.Int = big.NewInt(3e+18) // Block reward in wei for successfully mining a block upward from Byzantium
+ maxUncles = 2 // Maximum number of uncles allowed in a single block
+ allowedFutureBlockTime = 15 * time.Second // Max time from current time allowed for blocks, before they're considered future blocks
)
// Various error messages to mark blocks invalid. These should be private to
@@ -231,7 +232,7 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent *
return errLargeBlockTime
}
} else {
- if header.Time.Cmp(big.NewInt(time.Now().Unix())) > 0 {
+ if header.Time.Cmp(big.NewInt(time.Now().Add(allowedFutureBlockTime).Unix())) > 0 {
return consensus.ErrFutureBlock
}
}
@@ -239,29 +240,30 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent *
return errZeroBlockTime
}
// Verify the block's difficulty based in it's timestamp and parent's difficulty
- expected := CalcDifficulty(chain.Config(), header.Time.Uint64(), parent)
+ expected := ethash.CalcDifficulty(chain, header.Time.Uint64(), parent)
+
if expected.Cmp(header.Difficulty) != 0 {
return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, expected)
}
// Verify that the gas limit is <= 2^63-1
- if header.GasLimit.Cmp(math.MaxBig63) > 0 {
- return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, math.MaxBig63)
+ cap := uint64(0x7fffffffffffffff)
+ if header.GasLimit > cap {
+ return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, cap)
}
// Verify that the gasUsed is <= gasLimit
- if header.GasUsed.Cmp(header.GasLimit) > 0 {
- return fmt.Errorf("invalid gasUsed: have %v, gasLimit %v", header.GasUsed, header.GasLimit)
+ if header.GasUsed > header.GasLimit {
+ return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit)
}
// Verify that the gas limit remains within allowed bounds
- diff := new(big.Int).Set(parent.GasLimit)
- diff = diff.Sub(diff, header.GasLimit)
- diff.Abs(diff)
-
- limit := new(big.Int).Set(parent.GasLimit)
- limit = limit.Div(limit, params.GasLimitBoundDivisor)
+ diff := int64(parent.GasLimit) - int64(header.GasLimit)
+ if diff < 0 {
+ diff *= -1
+ }
+ limit := parent.GasLimit / params.GasLimitBoundDivisor
- if diff.Cmp(limit) >= 0 || header.GasLimit.Cmp(params.MinGasLimit) < 0 {
- return fmt.Errorf("invalid gas limit: have %v, want %v += %v", header.GasLimit, parent.GasLimit, limit)
+ if uint64(diff) >= limit || header.GasLimit < params.MinGasLimit {
+ return fmt.Errorf("invalid gas limit: have %d, want %d += %d", header.GasLimit, parent.GasLimit, limit)
}
// Verify that the block number is parent's +1
if diff := new(big.Int).Sub(header.Number, parent.Number); diff.Cmp(big.NewInt(1)) != 0 {
@@ -286,7 +288,13 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent *
// CalcDifficulty is the difficulty adjustment algorithm. It returns
// the difficulty that a new block should have when created at time
// given the parent block's time and difficulty.
-// TODO (karalabe): Move the chain maker into this package and make this private!
+func (ethash *Ethash) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int {
+ return CalcDifficulty(chain.Config(), time, parent)
+}
+
+// CalcDifficulty is the difficulty adjustment algorithm. It returns
+// the difficulty that a new block should have when created at time
+// given the parent block's time and difficulty.
func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int {
next := new(big.Int).Add(parent.Number, big1)
switch {
@@ -339,7 +347,7 @@ func calcDifficultyByzantium(time uint64, parent *types.Header) *big.Int {
if x.Cmp(bigMinus99) < 0 {
x.Set(bigMinus99)
}
- // (parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99))
+ // parent_diff + (parent_diff / 2048 * max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99))
y.Div(parent.Difficulty, params.DifficultyBoundDivisor)
x.Mul(y, x)
x.Add(parent.Difficulty, x)
@@ -373,7 +381,7 @@ func calcDifficultyByzantium(time uint64, parent *types.Header) *big.Int {
// the difficulty that a new block should have when created at time given the
// parent block's time and difficulty. The calculation uses the Homestead rules.
func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int {
- // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2.mediawiki
+ // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2.md
// algorithm:
// diff = (parent_diff +
// (parent_diff / 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99))
@@ -468,7 +476,7 @@ func (ethash *Ethash) VerifySeal(chain consensus.ChainReader, header *types.Head
}
// Sanity check that the block number is below the lookup table size (60M blocks)
number := header.Number.Uint64()
- if number/epochLength >= uint64(len(cacheSizes)) {
+ if number/epochLength >= maxEpoch {
// Go < 1.7 cannot calculate new cache/dataset sizes (no fast prime check)
return errNonceOutOfRange
}
@@ -476,14 +484,18 @@ func (ethash *Ethash) VerifySeal(chain consensus.ChainReader, header *types.Head
if header.Difficulty.Sign() <= 0 {
return errInvalidDifficulty
}
+
// Recompute the digest and PoW value and verify against the header
cache := ethash.cache(number)
-
size := datasetSize(number)
if ethash.config.PowMode == ModeTest {
size = 32 * 1024
}
- digest, result := hashimotoLight(size, cache, header.HashNoNonce().Bytes(), header.Nonce.Uint64())
+ digest, result := hashimotoLight(size, cache.cache, header.HashNoNonce().Bytes(), header.Nonce.Uint64())
+ // Caches are unmapped in a finalizer. Ensure that the cache stays live
+ // until after the call to hashimotoLight so it's not unmapped while being used.
+ runtime.KeepAlive(cache)
+
if !bytes.Equal(header.MixDigest[:], digest) {
return errInvalidMixDigest
}
@@ -501,8 +513,7 @@ func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header)
if parent == nil {
return consensus.ErrUnknownAncestor
}
- header.Difficulty = CalcDifficulty(chain.Config(), header.Time.Uint64(), parent)
-
+ header.Difficulty = ethash.CalcDifficulty(chain, header.Time.Uint64(), parent)
return nil
}
@@ -510,7 +521,7 @@ func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header)
// setting the final state and assembling the block.
func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) {
// Accumulate any block and uncle rewards and commit the final state root
- AccumulateRewards(chain.Config(), state, header, uncles)
+ accumulateRewards(chain.Config(), state, header, uncles)
header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number))
// Header seems complete, assemble into a block and return
@@ -526,8 +537,7 @@ var (
// AccumulateRewards credits the coinbase of the given block with the mining
// reward. The total reward consists of the static block reward and rewards for
// included uncles. The coinbase of each uncle block is also rewarded.
-// TODO (karalabe): Move the chain maker into this package and make this private!
-func AccumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) {
+func accumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) {
// Select the correct block reward based on chain progression
blockReward := FrontierBlockReward
if config.IsByzantium(header.Number) {
diff --git a/consensus/ethash/consensus_test.go b/consensus/ethash/consensus_test.go
index a58d220ef..438a99dd6 100644
--- a/consensus/ethash/consensus_test.go
+++ b/consensus/ethash/consensus_test.go
@@ -71,6 +71,7 @@ func TestCalcDifficulty(t *testing.T) {
}
config := &params.ChainConfig{HomesteadBlock: big.NewInt(1150000)}
+
for name, test := range tests {
number := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1))
diff := CalcDifficulty(config, test.CurrentTimestamp, &types.Header{
diff --git a/consensus/ethash/ethash.go b/consensus/ethash/ethash.go
index a78b3a895..91e20112a 100644
--- a/consensus/ethash/ethash.go
+++ b/consensus/ethash/ethash.go
@@ -26,6 +26,7 @@ import (
"os"
"path/filepath"
"reflect"
+ "runtime"
"strconv"
"sync"
"time"
@@ -35,6 +36,7 @@ import (
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rpc"
+ "github.com/hashicorp/golang-lru/simplelru"
metrics "github.com/rcrowley/go-metrics"
)
@@ -142,32 +144,82 @@ func memoryMapAndGenerate(path string, size uint64, generator func(buffer []uint
return memoryMap(path)
}
+// lru tracks caches or datasets by their last use time, keeping at most N of them.
+type lru struct {
+ what string
+ new func(epoch uint64) interface{}
+ mu sync.Mutex
+ // Items are kept in a LRU cache, but there is a special case:
+ // We always keep an item for (highest seen epoch) + 1 as the 'future item'.
+ cache *simplelru.LRU
+ future uint64
+ futureItem interface{}
+}
+
+// newlru create a new least-recently-used cache for ither the verification caches
+// or the mining datasets.
+func newlru(what string, maxItems int, new func(epoch uint64) interface{}) *lru {
+ if maxItems <= 0 {
+ maxItems = 1
+ }
+ cache, _ := simplelru.NewLRU(maxItems, func(key, value interface{}) {
+ log.Trace("Evicted ethash "+what, "epoch", key)
+ })
+ return &lru{what: what, new: new, cache: cache}
+}
+
+// get retrieves or creates an item for the given epoch. The first return value is always
+// non-nil. The second return value is non-nil if lru thinks that an item will be useful in
+// the near future.
+func (lru *lru) get(epoch uint64) (item, future interface{}) {
+ lru.mu.Lock()
+ defer lru.mu.Unlock()
+
+ // Get or create the item for the requested epoch.
+ item, ok := lru.cache.Get(epoch)
+ if !ok {
+ if lru.future > 0 && lru.future == epoch {
+ item = lru.futureItem
+ } else {
+ log.Trace("Requiring new ethash "+lru.what, "epoch", epoch)
+ item = lru.new(epoch)
+ }
+ lru.cache.Add(epoch, item)
+ }
+ // Update the 'future item' if epoch is larger than previously seen.
+ if epoch < maxEpoch-1 && lru.future < epoch+1 {
+ log.Trace("Requiring new future ethash "+lru.what, "epoch", epoch+1)
+ future = lru.new(epoch + 1)
+ lru.future = epoch + 1
+ lru.futureItem = future
+ }
+ return item, future
+}
+
// cache wraps an ethash cache with some metadata to allow easier concurrent use.
type cache struct {
- epoch uint64 // Epoch for which this cache is relevant
-
- dump *os.File // File descriptor of the memory mapped cache
- mmap mmap.MMap // Memory map itself to unmap before releasing
+ epoch uint64 // Epoch for which this cache is relevant
+ dump *os.File // File descriptor of the memory mapped cache
+ mmap mmap.MMap // Memory map itself to unmap before releasing
+ cache []uint32 // The actual cache data content (may be memory mapped)
+ once sync.Once // Ensures the cache is generated only once
+}
- cache []uint32 // The actual cache data content (may be memory mapped)
- used time.Time // Timestamp of the last use for smarter eviction
- once sync.Once // Ensures the cache is generated only once
- lock sync.Mutex // Ensures thread safety for updating the usage time
+// newCache creates a new ethash verification cache and returns it as a plain Go
+// interface to be usable in an LRU cache.
+func newCache(epoch uint64) interface{} {
+ return &cache{epoch: epoch}
}
// generate ensures that the cache content is generated before use.
func (c *cache) generate(dir string, limit int, test bool) {
c.once.Do(func() {
- // If we have a testing cache, generate and return
- if test {
- c.cache = make([]uint32, 1024/4)
- generateCache(c.cache, c.epoch, seedHash(c.epoch*epochLength+1))
- return
- }
- // If we don't store anything on disk, generate and return
size := cacheSize(c.epoch*epochLength + 1)
seed := seedHash(c.epoch*epochLength + 1)
-
+ if test {
+ size = 1024
+ }
+ // If we don't store anything on disk, generate and return.
if dir == "" {
c.cache = make([]uint32, size/4)
generateCache(c.cache, c.epoch, seed)
@@ -181,6 +233,10 @@ func (c *cache) generate(dir string, limit int, test bool) {
path := filepath.Join(dir, fmt.Sprintf("cache-R%d-%x%s", algorithmRevision, seed[:8], endian))
logger := log.New("epoch", c.epoch)
+ // We're about to mmap the file, ensure that the mapping is cleaned up when the
+ // cache becomes unused.
+ runtime.SetFinalizer(c, (*cache).finalizer)
+
// Try to load the file from disk and memory map it
var err error
c.dump, c.mmap, c.cache, err = memoryMap(path)
@@ -207,49 +263,41 @@ func (c *cache) generate(dir string, limit int, test bool) {
})
}
-// release closes any file handlers and memory maps open.
-func (c *cache) release() {
+// finalizer unmaps the memory and closes the file.
+func (c *cache) finalizer() {
if c.mmap != nil {
c.mmap.Unmap()
- c.mmap = nil
- }
- if c.dump != nil {
c.dump.Close()
- c.dump = nil
+ c.mmap, c.dump = nil, nil
}
}
// dataset wraps an ethash dataset with some metadata to allow easier concurrent use.
type dataset struct {
- epoch uint64 // Epoch for which this cache is relevant
-
- dump *os.File // File descriptor of the memory mapped cache
- mmap mmap.MMap // Memory map itself to unmap before releasing
+ epoch uint64 // Epoch for which this cache is relevant
+ dump *os.File // File descriptor of the memory mapped cache
+ mmap mmap.MMap // Memory map itself to unmap before releasing
+ dataset []uint32 // The actual cache data content
+ once sync.Once // Ensures the cache is generated only once
+}
- dataset []uint32 // The actual cache data content
- used time.Time // Timestamp of the last use for smarter eviction
- once sync.Once // Ensures the cache is generated only once
- lock sync.Mutex // Ensures thread safety for updating the usage time
+// newDataset creates a new ethash mining dataset and returns it as a plain Go
+// interface to be usable in an LRU cache.
+func newDataset(epoch uint64) interface{} {
+ return &dataset{epoch: epoch}
}
// generate ensures that the dataset content is generated before use.
func (d *dataset) generate(dir string, limit int, test bool) {
d.once.Do(func() {
- // If we have a testing dataset, generate and return
- if test {
- cache := make([]uint32, 1024/4)
- generateCache(cache, d.epoch, seedHash(d.epoch*epochLength+1))
-
- d.dataset = make([]uint32, 32*1024/4)
- generateDataset(d.dataset, d.epoch, cache)
-
- return
- }
- // If we don't store anything on disk, generate and return
csize := cacheSize(d.epoch*epochLength + 1)
dsize := datasetSize(d.epoch*epochLength + 1)
seed := seedHash(d.epoch*epochLength + 1)
-
+ if test {
+ csize = 1024
+ dsize = 32 * 1024
+ }
+ // If we don't store anything on disk, generate and return
if dir == "" {
cache := make([]uint32, csize/4)
generateCache(cache, d.epoch, seed)
@@ -265,6 +313,10 @@ func (d *dataset) generate(dir string, limit int, test bool) {
path := filepath.Join(dir, fmt.Sprintf("full-R%d-%x%s", algorithmRevision, seed[:8], endian))
logger := log.New("epoch", d.epoch)
+ // We're about to mmap the file, ensure that the mapping is cleaned up when the
+ // cache becomes unused.
+ runtime.SetFinalizer(d, (*dataset).finalizer)
+
// Try to load the file from disk and memory map it
var err error
d.dump, d.mmap, d.dataset, err = memoryMap(path)
@@ -294,15 +346,12 @@ func (d *dataset) generate(dir string, limit int, test bool) {
})
}
-// release closes any file handlers and memory maps open.
-func (d *dataset) release() {
+// finalizer closes any file handlers and memory maps open.
+func (d *dataset) finalizer() {
if d.mmap != nil {
d.mmap.Unmap()
- d.mmap = nil
- }
- if d.dump != nil {
d.dump.Close()
- d.dump = nil
+ d.mmap, d.dump = nil, nil
}
}
@@ -310,14 +359,12 @@ func (d *dataset) release() {
func MakeCache(block uint64, dir string) {
c := cache{epoch: block / epochLength}
c.generate(dir, math.MaxInt32, false)
- c.release()
}
// MakeDataset generates a new ethash dataset and optionally stores it to disk.
func MakeDataset(block uint64, dir string) {
d := dataset{epoch: block / epochLength}
d.generate(dir, math.MaxInt32, false)
- d.release()
}
// Mode defines the type and amount of PoW verification an ethash engine makes.
@@ -347,10 +394,8 @@ type Config struct {
type Ethash struct {
config Config
- caches map[uint64]*cache // In memory caches to avoid regenerating too often
- fcache *cache // Pre-generated cache for the estimated future epoch
- datasets map[uint64]*dataset // In memory datasets to avoid regenerating too often
- fdataset *dataset // Pre-generated dataset for the estimated future epoch
+ caches *lru // In memory caches to avoid regenerating too often
+ datasets *lru // In memory datasets to avoid regenerating too often
// Mining related fields
rand *rand.Rand // Properly seeded random source for nonces
@@ -380,8 +425,8 @@ func New(config Config) *Ethash {
}
return &Ethash{
config: config,
- caches: make(map[uint64]*cache),
- datasets: make(map[uint64]*dataset),
+ caches: newlru("cache", config.CachesInMem, newCache),
+ datasets: newlru("dataset", config.DatasetsInMem, newDataset),
update: make(chan struct{}),
hashrate: metrics.NewMeter(),
}
@@ -390,16 +435,7 @@ func New(config Config) *Ethash {
// NewTester creates a small sized ethash PoW scheme useful only for testing
// purposes.
func NewTester() *Ethash {
- return &Ethash{
- config: Config{
- CachesInMem: 1,
- PowMode: ModeTest,
- },
- caches: make(map[uint64]*cache),
- datasets: make(map[uint64]*dataset),
- update: make(chan struct{}),
- hashrate: metrics.NewMeter(),
- }
+ return New(Config{CachesInMem: 1, PowMode: ModeTest})
}
// NewFaker creates a ethash consensus engine with a fake PoW scheme that accepts
@@ -456,126 +492,40 @@ func NewShared() *Ethash {
// cache tries to retrieve a verification cache for the specified block number
// by first checking against a list of in-memory caches, then against caches
// stored on disk, and finally generating one if none can be found.
-func (ethash *Ethash) cache(block uint64) []uint32 {
+func (ethash *Ethash) cache(block uint64) *cache {
epoch := block / epochLength
+ currentI, futureI := ethash.caches.get(epoch)
+ current := currentI.(*cache)
- // If we have a PoW for that epoch, use that
- ethash.lock.Lock()
-
- current, future := ethash.caches[epoch], (*cache)(nil)
- if current == nil {
- // No in-memory cache, evict the oldest if the cache limit was reached
- for len(ethash.caches) > 0 && len(ethash.caches) >= ethash.config.CachesInMem {
- var evict *cache
- for _, cache := range ethash.caches {
- if evict == nil || evict.used.After(cache.used) {
- evict = cache
- }
- }
- delete(ethash.caches, evict.epoch)
- evict.release()
-
- log.Trace("Evicted ethash cache", "epoch", evict.epoch, "used", evict.used)
- }
- // If we have the new cache pre-generated, use that, otherwise create a new one
- if ethash.fcache != nil && ethash.fcache.epoch == epoch {
- log.Trace("Using pre-generated cache", "epoch", epoch)
- current, ethash.fcache = ethash.fcache, nil
- } else {
- log.Trace("Requiring new ethash cache", "epoch", epoch)
- current = &cache{epoch: epoch}
- }
- ethash.caches[epoch] = current
-
- // If we just used up the future cache, or need a refresh, regenerate
- if ethash.fcache == nil || ethash.fcache.epoch <= epoch {
- if ethash.fcache != nil {
- ethash.fcache.release()
- }
- log.Trace("Requiring new future ethash cache", "epoch", epoch+1)
- future = &cache{epoch: epoch + 1}
- ethash.fcache = future
- }
- // New current cache, set its initial timestamp
- current.used = time.Now()
- }
- ethash.lock.Unlock()
-
- // Wait for generation finish, bump the timestamp and finalize the cache
+ // Wait for generation finish.
current.generate(ethash.config.CacheDir, ethash.config.CachesOnDisk, ethash.config.PowMode == ModeTest)
- current.lock.Lock()
- current.used = time.Now()
- current.lock.Unlock()
-
- // If we exhausted the future cache, now's a good time to regenerate it
- if future != nil {
+ // If we need a new future cache, now's a good time to regenerate it.
+ if futureI != nil {
+ future := futureI.(*cache)
go future.generate(ethash.config.CacheDir, ethash.config.CachesOnDisk, ethash.config.PowMode == ModeTest)
}
- return current.cache
+ return current
}
// dataset tries to retrieve a mining dataset for the specified block number
// by first checking against a list of in-memory datasets, then against DAGs
// stored on disk, and finally generating one if none can be found.
-func (ethash *Ethash) dataset(block uint64) []uint32 {
+func (ethash *Ethash) dataset(block uint64) *dataset {
epoch := block / epochLength
+ currentI, futureI := ethash.datasets.get(epoch)
+ current := currentI.(*dataset)
- // If we have a PoW for that epoch, use that
- ethash.lock.Lock()
-
- current, future := ethash.datasets[epoch], (*dataset)(nil)
- if current == nil {
- // No in-memory dataset, evict the oldest if the dataset limit was reached
- for len(ethash.datasets) > 0 && len(ethash.datasets) >= ethash.config.DatasetsInMem {
- var evict *dataset
- for _, dataset := range ethash.datasets {
- if evict == nil || evict.used.After(dataset.used) {
- evict = dataset
- }
- }
- delete(ethash.datasets, evict.epoch)
- evict.release()
-
- log.Trace("Evicted ethash dataset", "epoch", evict.epoch, "used", evict.used)
- }
- // If we have the new cache pre-generated, use that, otherwise create a new one
- if ethash.fdataset != nil && ethash.fdataset.epoch == epoch {
- log.Trace("Using pre-generated dataset", "epoch", epoch)
- current = &dataset{epoch: ethash.fdataset.epoch} // Reload from disk
- ethash.fdataset = nil
- } else {
- log.Trace("Requiring new ethash dataset", "epoch", epoch)
- current = &dataset{epoch: epoch}
- }
- ethash.datasets[epoch] = current
-
- // If we just used up the future dataset, or need a refresh, regenerate
- if ethash.fdataset == nil || ethash.fdataset.epoch <= epoch {
- if ethash.fdataset != nil {
- ethash.fdataset.release()
- }
- log.Trace("Requiring new future ethash dataset", "epoch", epoch+1)
- future = &dataset{epoch: epoch + 1}
- ethash.fdataset = future
- }
- // New current dataset, set its initial timestamp
- current.used = time.Now()
- }
- ethash.lock.Unlock()
-
- // Wait for generation finish, bump the timestamp and finalize the cache
+ // Wait for generation finish.
current.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest)
- current.lock.Lock()
- current.used = time.Now()
- current.lock.Unlock()
-
- // If we exhausted the future dataset, now's a good time to regenerate it
- if future != nil {
+ // If we need a new future dataset, now's a good time to regenerate it.
+ if futureI != nil {
+ future := futureI.(*dataset)
go future.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest)
}
- return current.dataset
+
+ return current
}
// Threads returns the number of mining threads currently enabled. This doesn't
diff --git a/consensus/ethash/ethash_test.go b/consensus/ethash/ethash_test.go
index b3a2f32f7..31116da43 100644
--- a/consensus/ethash/ethash_test.go
+++ b/consensus/ethash/ethash_test.go
@@ -17,7 +17,11 @@
package ethash
import (
+ "io/ioutil"
"math/big"
+ "math/rand"
+ "os"
+ "sync"
"testing"
"github.com/ethereum/go-ethereum/core/types"
@@ -38,3 +42,38 @@ func TestTestMode(t *testing.T) {
t.Fatalf("unexpected verification error: %v", err)
}
}
+
+// This test checks that cache lru logic doesn't crash under load.
+// It reproduces https://github.com/ethereum/go-ethereum/issues/14943
+func TestCacheFileEvict(t *testing.T) {
+ tmpdir, err := ioutil.TempDir("", "ethash-test")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmpdir)
+ e := New(Config{CachesInMem: 3, CachesOnDisk: 10, CacheDir: tmpdir, PowMode: ModeTest})
+
+ workers := 8
+ epochs := 100
+ var wg sync.WaitGroup
+ wg.Add(workers)
+ for i := 0; i < workers; i++ {
+ go verifyTest(&wg, e, i, epochs)
+ }
+ wg.Wait()
+}
+
+func verifyTest(wg *sync.WaitGroup, e *Ethash, workerIndex, epochs int) {
+ defer wg.Done()
+
+ const wiggle = 4 * epochLength
+ r := rand.New(rand.NewSource(int64(workerIndex)))
+ for epoch := 0; epoch < epochs; epoch++ {
+ block := int64(epoch)*epochLength - wiggle/2 + r.Int63n(wiggle)
+ if block < 0 {
+ block = 0
+ }
+ head := &types.Header{Number: big.NewInt(block), Difficulty: big.NewInt(100)}
+ e.VerifySeal(nil, head)
+ }
+}
diff --git a/consensus/ethash/sealer.go b/consensus/ethash/sealer.go
index c2447e473..b5e742d8b 100644
--- a/consensus/ethash/sealer.go
+++ b/consensus/ethash/sealer.go
@@ -97,10 +97,9 @@ func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, stop
func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan struct{}, found chan *types.Block) {
// Extract some data from the header
var (
- header = block.Header()
- hash = header.HashNoNonce().Bytes()
- target = new(big.Int).Div(maxUint256, header.Difficulty)
-
+ header = block.Header()
+ hash = header.HashNoNonce().Bytes()
+ target = new(big.Int).Div(maxUint256, header.Difficulty)
number = header.Number.Uint64()
dataset = ethash.dataset(number)
)
@@ -111,13 +110,14 @@ func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan s
)
logger := log.New("miner", id)
logger.Trace("Started ethash search for new nonces", "seed", seed)
+search:
for {
select {
case <-abort:
// Mining terminated, update stats and abort
logger.Trace("Ethash nonce search aborted", "attempts", nonce-seed)
ethash.hashrate.Mark(attempts)
- return
+ break search
default:
// We don't have to update hash rate on every nonce, so update after after 2^X nonces
@@ -127,7 +127,7 @@ func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan s
attempts = 0
}
// Compute the PoW value of this nonce
- digest, result := hashimotoFull(dataset, hash, nonce)
+ digest, result := hashimotoFull(dataset.dataset, hash, nonce)
if new(big.Int).SetBytes(result).Cmp(target) <= 0 {
// Correct nonce found, create a new header with it
header = types.CopyHeader(header)
@@ -141,9 +141,12 @@ func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan s
case <-abort:
logger.Trace("Ethash nonce found but discarded", "attempts", nonce-seed, "nonce", nonce)
}
- return
+ break search
}
nonce++
}
}
+ // Datasets are unmapped in a finalizer. Ensure that the dataset stays live
+ // during sealing so it's not unmapped while being read.
+ runtime.KeepAlive(dataset)
}
diff --git a/console/console.go b/console/console.go
index 1ecbfd0b0..52fe1f542 100644
--- a/console/console.go
+++ b/console/console.go
@@ -92,6 +92,9 @@ func New(config Config) (*Console, error) {
printer: config.Printer,
histPath: filepath.Join(config.DataDir, HistoryFile),
}
+ if err := os.MkdirAll(config.DataDir, 0700); err != nil {
+ return nil, err
+ }
if err := console.init(config.Preload); err != nil {
return nil, err
}
@@ -423,7 +426,7 @@ func (c *Console) Execute(path string) error {
return c.jsre.Exec(path)
}
-// Stop cleans up the console and terminates the runtime envorinment.
+// Stop cleans up the console and terminates the runtime environment.
func (c *Console) Stop(graceful bool) error {
if err := ioutil.WriteFile(c.histPath, []byte(strings.Join(c.history, "\n")), 0600); err != nil {
return err
diff --git a/console/prompter.go b/console/prompter.go
index ea03694d4..c477b4817 100644
--- a/console/prompter.go
+++ b/console/prompter.go
@@ -155,8 +155,7 @@ func (p *terminalPrompter) SetHistory(history []string) {
p.State.ReadHistory(strings.NewReader(strings.Join(history, "\n")))
}
-// AppendHistory appends an entry to the scrollback history. It should be called
-// if and only if the prompt to append was a valid command.
+// AppendHistory appends an entry to the scrollback history.
func (p *terminalPrompter) AppendHistory(command string) {
p.State.AppendHistory(command)
}
diff --git a/containers/docker/develop-alpine/Dockerfile b/containers/docker/develop-alpine/Dockerfile
index d239129d5..1f3e1112e 100644
--- a/containers/docker/develop-alpine/Dockerfile
+++ b/containers/docker/develop-alpine/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.5
+FROM alpine:3.7
RUN \
apk add --update go git make gcc musl-dev linux-headers ca-certificates && \
diff --git a/containers/docker/develop-ubuntu/Dockerfile b/containers/docker/develop-ubuntu/Dockerfile
index c79becb55..8c4fe9f59 100644
--- a/containers/docker/develop-ubuntu/Dockerfile
+++ b/containers/docker/develop-ubuntu/Dockerfile
@@ -1,12 +1,14 @@
FROM ubuntu:xenial
+ENV PATH=/usr/lib/go-1.9/bin:$PATH
+
RUN \
apt-get update && apt-get upgrade -q -y && \
- apt-get install -y --no-install-recommends golang git make gcc libc-dev ca-certificates && \
+ apt-get install -y --no-install-recommends golang-1.9 git make gcc libc-dev ca-certificates && \
git clone --depth 1 https://github.com/ethereum/go-ethereum && \
(cd go-ethereum && make geth) && \
cp go-ethereum/build/bin/geth /geth && \
- apt-get remove -y golang git make gcc libc-dev && apt autoremove -y && apt-get clean && \
+ apt-get remove -y golang-1.9 git make gcc libc-dev && apt autoremove -y && apt-get clean && \
rm -rf /go-ethereum
EXPOSE 8545
diff --git a/containers/docker/master-alpine/Dockerfile b/containers/docker/master-alpine/Dockerfile
index 44402361d..c7b71c726 100644
--- a/containers/docker/master-alpine/Dockerfile
+++ b/containers/docker/master-alpine/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.5
+FROM alpine:3.7
RUN \
apk add --update go git make gcc musl-dev linux-headers ca-certificates && \
diff --git a/containers/docker/master-ubuntu/Dockerfile b/containers/docker/master-ubuntu/Dockerfile
index cc4fad10c..bba70abfd 100644
--- a/containers/docker/master-ubuntu/Dockerfile
+++ b/containers/docker/master-ubuntu/Dockerfile
@@ -1,12 +1,14 @@
FROM ubuntu:xenial
+ENV PATH=/usr/lib/go-1.9/bin:$PATH
+
RUN \
apt-get update && apt-get upgrade -q -y && \
- apt-get install -y --no-install-recommends golang git make gcc libc-dev ca-certificates && \
+ apt-get install -y --no-install-recommends golang-1.9 git make gcc libc-dev ca-certificates && \
git clone --depth 1 --branch release/1.7 https://github.com/ethereum/go-ethereum && \
(cd go-ethereum && make geth) && \
cp go-ethereum/build/bin/geth /geth && \
- apt-get remove -y golang git make gcc libc-dev && apt autoremove -y && apt-get clean && \
+ apt-get remove -y golang-1.9 git make gcc libc-dev && apt autoremove -y && apt-get clean && \
rm -rf /go-ethereum
EXPOSE 8545
diff --git a/contracts/chequebook/cheque.go b/contracts/chequebook/cheque.go
index 09daa9248..92bd896e0 100644
--- a/contracts/chequebook/cheque.go
+++ b/contracts/chequebook/cheque.go
@@ -21,7 +21,7 @@
// as well as (auto)depositing ether to the chequebook contract.
package chequebook
-//go:generate abigen --sol contract/chequebook.sol --pkg contract --out contract/chequebook.go
+//go:generate abigen --sol contract/chequebook.sol --exc contract/mortal.sol:mortal,contract/owned.sol:owned --pkg contract --out contract/chequebook.go
//go:generate go run ./gencode.go
import (
@@ -56,8 +56,8 @@ import (
// * watching incoming ether
var (
- gasToCash = big.NewInt(2000000) // gas cost of a cash transaction using chequebook
- // gasToDeploy = big.NewInt(3000000)
+ gasToCash = uint64(2000000) // gas cost of a cash transaction using chequebook
+ // gasToDeploy = uint64(3000000)
)
// Backend wraps all methods required for chequebook operation.
diff --git a/contracts/chequebook/contract/chequebook.go b/contracts/chequebook/contract/chequebook.go
index 47090152c..e275ac9b8 100644
--- a/contracts/chequebook/contract/chequebook.go
+++ b/contracts/chequebook/contract/chequebook.go
@@ -1,5 +1,5 @@
-// This file is an automatically generated Go binding. Do not modify as any
-// change will likely be lost upon the next re-generation!
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
package contract
@@ -7,17 +7,19 @@ import (
"math/big"
"strings"
+ ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
)
// ChequebookABI is the input ABI used to generate the binding from.
-const ChequebookABI = `[{"constant":false,"inputs":[],"name":"kill","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"sent","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"amount","type":"uint256"},{"name":"sig_v","type":"uint8"},{"name":"sig_r","type":"bytes32"},{"name":"sig_s","type":"bytes32"}],"name":"cash","outputs":[],"type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"deadbeat","type":"address"}],"name":"Overdraft","type":"event"}]`
+const ChequebookABI = "[{\"constant\":false,\"inputs\":[],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"sent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"beneficiary\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sig_v\",\"type\":\"uint8\"},{\"name\":\"sig_r\",\"type\":\"bytes32\"},{\"name\":\"sig_s\",\"type\":\"bytes32\"}],\"name\":\"cash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deadbeat\",\"type\":\"address\"}],\"name\":\"Overdraft\",\"type\":\"event\"}]"
// ChequebookBin is the compiled bytecode used for deploying new contracts.
-const ChequebookBin = `0x606060405260008054600160a060020a031916331790556101ff806100246000396000f3606060405260e060020a600035046341c0e1b581146100315780637bf786f814610059578063fbf788d614610071575b005b61002f60005433600160a060020a03908116911614156100bd57600054600160a060020a0316ff5b6100ab60043560016020526000908152604090205481565b61002f600435602435604435606435608435600160a060020a03851660009081526001602052604081205485116100bf575b505050505050565b60408051918252519081900360200190f35b565b50604080516c0100000000000000000000000030600160a060020a0390811682028352881602601482015260288101869052815190819003604801812080825260ff861660208381019190915282840186905260608301859052925190926001926080818101939182900301816000866161da5a03f11561000257505060405151600054600160a060020a0390811691161461015a576100a3565b600160a060020a038681166000908152600160205260409020543090911631908603106101b357604060008181208790559051600160a060020a0388169190819081818181818881f1935050505015156100a357610002565b60005460408051600160a060020a03929092168252517f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f9789181900360200190a185600160a060020a0316ff`
+const ChequebookBin = `0x606060405260008054600160a060020a033316600160a060020a03199091161790556102ec806100306000396000f3006060604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100585780637bf786f81461006b578063fbf788d61461009c575b005b341561006357600080fd5b6100566100ca565b341561007657600080fd5b61008a600160a060020a03600435166100f1565b60405190815260200160405180910390f35b34156100a757600080fd5b610056600160a060020a036004351660243560ff60443516606435608435610103565b60005433600160a060020a03908116911614156100ef57600054600160a060020a0316ff5b565b60016020526000908152604090205481565b600160a060020a0385166000908152600160205260408120548190861161012957600080fd5b3087876040516c01000000000000000000000000600160a060020a03948516810282529290931690910260148301526028820152604801604051809103902091506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156101cf57600080fd5b505060206040510351600054600160a060020a039081169116146101f257600080fd5b50600160a060020a03808716600090815260016020526040902054860390301631811161026257600160a060020a0387166000818152600160205260409081902088905582156108fc0290839051600060405180830381858888f19350505050151561025d57600080fd5b6102b7565b6000547f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f97890600160a060020a0316604051600160a060020a03909116815260200160405180910390a186600160a060020a0316ff5b505050505050505600a165627a7a72305820533e856fc37e3d64d1706bcc7dfb6b1d490c8d566ea498d9d01ec08965a896ca0029`
// DeployChequebook deploys a new Ethereum contract, binding an instance of Chequebook to it.
func DeployChequebook(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Chequebook, error) {
@@ -29,13 +31,14 @@ func DeployChequebook(auth *bind.TransactOpts, backend bind.ContractBackend) (co
if err != nil {
return common.Address{}, nil, nil, err
}
- return address, tx, &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}}, nil
+ return address, tx, &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}, ChequebookFilterer: ChequebookFilterer{contract: contract}}, nil
}
// Chequebook is an auto generated Go binding around an Ethereum contract.
type Chequebook struct {
ChequebookCaller // Read-only binding to the contract
ChequebookTransactor // Write-only binding to the contract
+ ChequebookFilterer // Log filterer for contract events
}
// ChequebookCaller is an auto generated read-only Go binding around an Ethereum contract.
@@ -48,6 +51,11 @@ type ChequebookTransactor struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
+// ChequebookFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ChequebookFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
// ChequebookSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ChequebookSession struct {
@@ -87,16 +95,16 @@ type ChequebookTransactorRaw struct {
// NewChequebook creates a new instance of Chequebook, bound to a specific deployed contract.
func NewChequebook(address common.Address, backend bind.ContractBackend) (*Chequebook, error) {
- contract, err := bindChequebook(address, backend, backend)
+ contract, err := bindChequebook(address, backend, backend, backend)
if err != nil {
return nil, err
}
- return &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}}, nil
+ return &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}, ChequebookFilterer: ChequebookFilterer{contract: contract}}, nil
}
// NewChequebookCaller creates a new read-only instance of Chequebook, bound to a specific deployed contract.
func NewChequebookCaller(address common.Address, caller bind.ContractCaller) (*ChequebookCaller, error) {
- contract, err := bindChequebook(address, caller, nil)
+ contract, err := bindChequebook(address, caller, nil, nil)
if err != nil {
return nil, err
}
@@ -105,20 +113,29 @@ func NewChequebookCaller(address common.Address, caller bind.ContractCaller) (*C
// NewChequebookTransactor creates a new write-only instance of Chequebook, bound to a specific deployed contract.
func NewChequebookTransactor(address common.Address, transactor bind.ContractTransactor) (*ChequebookTransactor, error) {
- contract, err := bindChequebook(address, nil, transactor)
+ contract, err := bindChequebook(address, nil, transactor, nil)
if err != nil {
return nil, err
}
return &ChequebookTransactor{contract: contract}, nil
}
+// NewChequebookFilterer creates a new log filterer instance of Chequebook, bound to a specific deployed contract.
+func NewChequebookFilterer(address common.Address, filterer bind.ContractFilterer) (*ChequebookFilterer, error) {
+ contract, err := bindChequebook(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ChequebookFilterer{contract: contract}, nil
+}
+
// bindChequebook binds a generic wrapper to an already deployed contract.
-func bindChequebook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
+func bindChequebook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
parsed, err := abi.JSON(strings.NewReader(ChequebookABI))
if err != nil {
return nil, err
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
+ return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}
// Call invokes the (constant) contract method with params as input values and
@@ -227,315 +244,124 @@ func (_Chequebook *ChequebookTransactorSession) Kill() (*types.Transaction, erro
return _Chequebook.Contract.Kill(&_Chequebook.TransactOpts)
}
-// MortalABI is the input ABI used to generate the binding from.
-const MortalABI = `[{"constant":false,"inputs":[],"name":"kill","outputs":[],"type":"function"}]`
-
-// MortalBin is the compiled bytecode used for deploying new contracts.
-const MortalBin = `0x606060405260008054600160a060020a03191633179055605c8060226000396000f3606060405260e060020a600035046341c0e1b58114601a575b005b60186000543373ffffffffffffffffffffffffffffffffffffffff90811691161415605a5760005473ffffffffffffffffffffffffffffffffffffffff16ff5b56`
-
-// DeployMortal deploys a new Ethereum contract, binding an instance of Mortal to it.
-func DeployMortal(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Mortal, error) {
- parsed, err := abi.JSON(strings.NewReader(MortalABI))
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(MortalBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &Mortal{MortalCaller: MortalCaller{contract: contract}, MortalTransactor: MortalTransactor{contract: contract}}, nil
-}
-
-// Mortal is an auto generated Go binding around an Ethereum contract.
-type Mortal struct {
- MortalCaller // Read-only binding to the contract
- MortalTransactor // Write-only binding to the contract
-}
-
-// MortalCaller is an auto generated read-only Go binding around an Ethereum contract.
-type MortalCaller struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// MortalTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type MortalTransactor struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// MortalSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type MortalSession struct {
- Contract *Mortal // Generic contract binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// MortalCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type MortalCallerSession struct {
- Contract *MortalCaller // Generic contract caller binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
-}
-
-// MortalTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type MortalTransactorSession struct {
- Contract *MortalTransactor // Generic contract transactor binding to set the session for
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// MortalRaw is an auto generated low-level Go binding around an Ethereum contract.
-type MortalRaw struct {
- Contract *Mortal // Generic contract binding to access the raw methods on
-}
-
-// MortalCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type MortalCallerRaw struct {
- Contract *MortalCaller // Generic read-only contract binding to access the raw methods on
-}
+// ChequebookOverdraftIterator is returned from FilterOverdraft and is used to iterate over the raw logs and unpacked data for Overdraft events raised by the Chequebook contract.
+type ChequebookOverdraftIterator struct {
+ Event *ChequebookOverdraft // Event containing the contract specifics and raw log
-// MortalTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type MortalTransactorRaw struct {
- Contract *MortalTransactor // Generic write-only contract binding to access the raw methods on
-}
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
-// NewMortal creates a new instance of Mortal, bound to a specific deployed contract.
-func NewMortal(address common.Address, backend bind.ContractBackend) (*Mortal, error) {
- contract, err := bindMortal(address, backend, backend)
- if err != nil {
- return nil, err
- }
- return &Mortal{MortalCaller: MortalCaller{contract: contract}, MortalTransactor: MortalTransactor{contract: contract}}, nil
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
}
-// NewMortalCaller creates a new read-only instance of Mortal, bound to a specific deployed contract.
-func NewMortalCaller(address common.Address, caller bind.ContractCaller) (*MortalCaller, error) {
- contract, err := bindMortal(address, caller, nil)
- if err != nil {
- return nil, err
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ChequebookOverdraftIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
}
- return &MortalCaller{contract: contract}, nil
-}
-
-// NewMortalTransactor creates a new write-only instance of Mortal, bound to a specific deployed contract.
-func NewMortalTransactor(address common.Address, transactor bind.ContractTransactor) (*MortalTransactor, error) {
- contract, err := bindMortal(address, nil, transactor)
- if err != nil {
- return nil, err
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChequebookOverdraft)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
}
- return &MortalTransactor{contract: contract}, nil
-}
-
-// bindMortal binds a generic wrapper to an already deployed contract.
-func bindMortal(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
- parsed, err := abi.JSON(strings.NewReader(MortalABI))
- if err != nil {
- return nil, err
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChequebookOverdraft)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Mortal *MortalRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _Mortal.Contract.MortalCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Mortal *MortalRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Mortal.Contract.MortalTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_Mortal *MortalRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Mortal.Contract.MortalTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Mortal *MortalCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _Mortal.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Mortal *MortalTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Mortal.Contract.contract.Transfer(opts)
}
-// Transact invokes the (paid) contract method with params as input values.
-func (_Mortal *MortalTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Mortal.Contract.contract.Transact(opts, method, params...)
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *ChequebookOverdraftIterator) Error() error {
+ return it.fail
}
-// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5.
-//
-// Solidity: function kill() returns()
-func (_Mortal *MortalTransactor) Kill(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Mortal.contract.Transact(opts, "kill")
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ChequebookOverdraftIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
}
-// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5.
-//
-// Solidity: function kill() returns()
-func (_Mortal *MortalSession) Kill() (*types.Transaction, error) {
- return _Mortal.Contract.Kill(&_Mortal.TransactOpts)
+// ChequebookOverdraft represents a Overdraft event raised by the Chequebook contract.
+type ChequebookOverdraft struct {
+ Deadbeat common.Address
+ Raw types.Log // Blockchain specific contextual infos
}
-// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5.
+// FilterOverdraft is a free log retrieval operation binding the contract event 0x2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f978.
//
-// Solidity: function kill() returns()
-func (_Mortal *MortalTransactorSession) Kill() (*types.Transaction, error) {
- return _Mortal.Contract.Kill(&_Mortal.TransactOpts)
-}
-
-// OwnedABI is the input ABI used to generate the binding from.
-const OwnedABI = `[{"inputs":[],"type":"constructor"}]`
-
-// OwnedBin is the compiled bytecode used for deploying new contracts.
-const OwnedBin = `0x606060405260008054600160a060020a0319163317905560068060226000396000f3606060405200`
-
-// DeployOwned deploys a new Ethereum contract, binding an instance of Owned to it.
-func DeployOwned(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Owned, error) {
- parsed, err := abi.JSON(strings.NewReader(OwnedABI))
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(OwnedBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &Owned{OwnedCaller: OwnedCaller{contract: contract}, OwnedTransactor: OwnedTransactor{contract: contract}}, nil
-}
-
-// Owned is an auto generated Go binding around an Ethereum contract.
-type Owned struct {
- OwnedCaller // Read-only binding to the contract
- OwnedTransactor // Write-only binding to the contract
-}
-
-// OwnedCaller is an auto generated read-only Go binding around an Ethereum contract.
-type OwnedCaller struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// OwnedTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type OwnedTransactor struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// OwnedSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type OwnedSession struct {
- Contract *Owned // Generic contract binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// OwnedCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type OwnedCallerSession struct {
- Contract *OwnedCaller // Generic contract caller binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
-}
-
-// OwnedTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type OwnedTransactorSession struct {
- Contract *OwnedTransactor // Generic contract transactor binding to set the session for
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// OwnedRaw is an auto generated low-level Go binding around an Ethereum contract.
-type OwnedRaw struct {
- Contract *Owned // Generic contract binding to access the raw methods on
-}
+// Solidity: event Overdraft(deadbeat address)
+func (_Chequebook *ChequebookFilterer) FilterOverdraft(opts *bind.FilterOpts) (*ChequebookOverdraftIterator, error) {
-// OwnedCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type OwnedCallerRaw struct {
- Contract *OwnedCaller // Generic read-only contract binding to access the raw methods on
-}
-
-// OwnedTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type OwnedTransactorRaw struct {
- Contract *OwnedTransactor // Generic write-only contract binding to access the raw methods on
-}
-
-// NewOwned creates a new instance of Owned, bound to a specific deployed contract.
-func NewOwned(address common.Address, backend bind.ContractBackend) (*Owned, error) {
- contract, err := bindOwned(address, backend, backend)
- if err != nil {
- return nil, err
- }
- return &Owned{OwnedCaller: OwnedCaller{contract: contract}, OwnedTransactor: OwnedTransactor{contract: contract}}, nil
-}
-
-// NewOwnedCaller creates a new read-only instance of Owned, bound to a specific deployed contract.
-func NewOwnedCaller(address common.Address, caller bind.ContractCaller) (*OwnedCaller, error) {
- contract, err := bindOwned(address, caller, nil)
+ logs, sub, err := _Chequebook.contract.FilterLogs(opts, "Overdraft")
if err != nil {
return nil, err
}
- return &OwnedCaller{contract: contract}, nil
+ return &ChequebookOverdraftIterator{contract: _Chequebook.contract, event: "Overdraft", logs: logs, sub: sub}, nil
}
-// NewOwnedTransactor creates a new write-only instance of Owned, bound to a specific deployed contract.
-func NewOwnedTransactor(address common.Address, transactor bind.ContractTransactor) (*OwnedTransactor, error) {
- contract, err := bindOwned(address, nil, transactor)
- if err != nil {
- return nil, err
- }
- return &OwnedTransactor{contract: contract}, nil
-}
+// WatchOverdraft is a free log subscription operation binding the contract event 0x2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f978.
+//
+// Solidity: event Overdraft(deadbeat address)
+func (_Chequebook *ChequebookFilterer) WatchOverdraft(opts *bind.WatchOpts, sink chan<- *ChequebookOverdraft) (event.Subscription, error) {
-// bindOwned binds a generic wrapper to an already deployed contract.
-func bindOwned(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
- parsed, err := abi.JSON(strings.NewReader(OwnedABI))
+ logs, sub, err := _Chequebook.contract.WatchLogs(opts, "Overdraft")
if err != nil {
return nil, err
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Owned *OwnedRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _Owned.Contract.OwnedCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Owned *OwnedRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Owned.Contract.OwnedTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_Owned *OwnedRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Owned.Contract.OwnedTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Owned *OwnedCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _Owned.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Owned *OwnedTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Owned.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_Owned *OwnedTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Owned.Contract.contract.Transact(opts, method, params...)
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(ChequebookOverdraft)
+ if err := _Chequebook.contract.UnpackLog(event, "Overdraft", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
}
diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol
index 8d6e85d11..c386cceed 100644
--- a/contracts/chequebook/contract/chequebook.sol
+++ b/contracts/chequebook/contract/chequebook.sol
@@ -1,6 +1,6 @@
pragma solidity ^0.4.18;
-import "https://github.com/ethereum/solidity/std/mortal.sol";
+import "./mortal.sol";
/// @title Chequebook for Ethereum micropayments
/// @author Daniel A. Nagy <daniel@ethereum.org>
@@ -11,6 +11,9 @@ contract chequebook is mortal {
/// @notice Overdraft event
event Overdraft(address deadbeat);
+ // Allow sending ether to the chequebook.
+ function() public payable { }
+
/// @notice Cash cheque
///
/// @param beneficiary beneficiary address
@@ -19,8 +22,7 @@ contract chequebook is mortal {
/// @param sig_r signature parameter r
/// @param sig_s signature parameter s
/// The digital signature is calculated on the concatenated triplet of contract address, beneficiary address and cumulative amount
- function cash(address beneficiary, uint256 amount,
- uint8 sig_v, bytes32 sig_r, bytes32 sig_s) {
+ function cash(address beneficiary, uint256 amount, uint8 sig_v, bytes32 sig_r, bytes32 sig_s) public {
// Check if the cheque is old.
// Only cheques that are more recent than the last cashed one are considered.
require(amount > sent[beneficiary]);
@@ -31,7 +33,7 @@ contract chequebook is mortal {
// and the cumulative amount on the last cashed cheque to beneficiary.
uint256 diff = amount - sent[beneficiary];
if (diff <= this.balance) {
- // update the cumulative amount before sending
+ // update the cumulative amount before sending
sent[beneficiary] = amount;
beneficiary.transfer(diff);
} else {
diff --git a/contracts/chequebook/contract/code.go b/contracts/chequebook/contract/code.go
index b08e04e71..d837a9d60 100644
--- a/contracts/chequebook/contract/code.go
+++ b/contracts/chequebook/contract/code.go
@@ -2,4 +2,4 @@ package contract
// ContractDeployedCode is used to detect suicides. This constant needs to be
// updated when the contract code is changed.
-const ContractDeployedCode = "0x606060405260e060020a600035046341c0e1b581146100315780637bf786f814610059578063fbf788d614610071575b005b61002f60005433600160a060020a03908116911614156100bd57600054600160a060020a0316ff5b6100ab60043560016020526000908152604090205481565b61002f600435602435604435606435608435600160a060020a03851660009081526001602052604081205485116100bf575b505050505050565b60408051918252519081900360200190f35b565b50604080516c0100000000000000000000000030600160a060020a0390811682028352881602601482015260288101869052815190819003604801812080825260ff861660208381019190915282840186905260608301859052925190926001926080818101939182900301816000866161da5a03f11561000257505060405151600054600160a060020a0390811691161461015a576100a3565b600160a060020a038681166000908152600160205260409020543090911631908603106101b357604060008181208790559051600160a060020a0388169190819081818181818881f1935050505015156100a357610002565b60005460408051600160a060020a03929092168252517f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f9789181900360200190a185600160a060020a0316ff"
+const ContractDeployedCode = "0x6060604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100585780637bf786f81461006b578063fbf788d61461009c575b005b341561006357600080fd5b6100566100ca565b341561007657600080fd5b61008a600160a060020a03600435166100f1565b60405190815260200160405180910390f35b34156100a757600080fd5b610056600160a060020a036004351660243560ff60443516606435608435610103565b60005433600160a060020a03908116911614156100ef57600054600160a060020a0316ff5b565b60016020526000908152604090205481565b600160a060020a0385166000908152600160205260408120548190861161012957600080fd5b3087876040516c01000000000000000000000000600160a060020a03948516810282529290931690910260148301526028820152604801604051809103902091506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156101cf57600080fd5b505060206040510351600054600160a060020a039081169116146101f257600080fd5b50600160a060020a03808716600090815260016020526040902054860390301631811161026257600160a060020a0387166000818152600160205260409081902088905582156108fc0290839051600060405180830381858888f19350505050151561025d57600080fd5b6102b7565b6000547f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f97890600160a060020a0316604051600160a060020a03909116815260200160405180910390a186600160a060020a0316ff5b505050505050505600a165627a7a72305820533e856fc37e3d64d1706bcc7dfb6b1d490c8d566ea498d9d01ec08965a896ca0029"
diff --git a/contracts/chequebook/contract/mortal.sol b/contracts/chequebook/contract/mortal.sol
new file mode 100644
index 000000000..c43f1e4f7
--- /dev/null
+++ b/contracts/chequebook/contract/mortal.sol
@@ -0,0 +1,10 @@
+pragma solidity ^0.4.0;
+
+import "./owned.sol";
+
+contract mortal is owned {
+ function kill() public {
+ if (msg.sender == owner)
+ selfdestruct(owner);
+ }
+}
diff --git a/contracts/chequebook/contract/owned.sol b/contracts/chequebook/contract/owned.sol
new file mode 100644
index 000000000..ee9860d34
--- /dev/null
+++ b/contracts/chequebook/contract/owned.sol
@@ -0,0 +1,15 @@
+pragma solidity ^0.4.0;
+
+contract owned {
+ address owner;
+
+ modifier onlyowner() {
+ if (msg.sender == owner) {
+ _;
+ }
+ }
+
+ function owned() public {
+ owner = msg.sender;
+ }
+}
diff --git a/contracts/chequebook/gencode.go b/contracts/chequebook/gencode.go
index faa927279..45f6d68f3 100644
--- a/contracts/chequebook/gencode.go
+++ b/contracts/chequebook/gencode.go
@@ -33,15 +33,14 @@ import (
)
var (
- testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
- testAccount = core.GenesisAccount{
- Address: crypto.PubkeyToAddress(testKey.PublicKey),
- Balance: big.NewInt(500000000000),
+ testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+ testAlloc = core.GenesisAlloc{
+ crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(500000000000)},
}
)
func main() {
- backend := backends.NewSimulatedBackend(testAccount)
+ backend := backends.NewSimulatedBackend(testAlloc)
auth := bind.NewKeyedTransactor(testKey)
// Deploy the contract, get the code.
diff --git a/contracts/ens/contract/AbstractENS.sol b/contracts/ens/contract/AbstractENS.sol
new file mode 100644
index 000000000..b80a1b0e6
--- /dev/null
+++ b/contracts/ens/contract/AbstractENS.sol
@@ -0,0 +1,23 @@
+pragma solidity ^0.4.0;
+
+contract AbstractENS {
+ function owner(bytes32 node) constant returns(address);
+ function resolver(bytes32 node) constant returns(address);
+ function ttl(bytes32 node) constant returns(uint64);
+ function setOwner(bytes32 node, address owner);
+ function setSubnodeOwner(bytes32 node, bytes32 label, address owner);
+ function setResolver(bytes32 node, address resolver);
+ function setTTL(bytes32 node, uint64 ttl);
+
+ // Logged when the owner of a node assigns a new owner to a subnode.
+ event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
+
+ // Logged when the owner of a node transfers ownership to a new account.
+ event Transfer(bytes32 indexed node, address owner);
+
+ // Logged when the resolver for a node changes.
+ event NewResolver(bytes32 indexed node, address resolver);
+
+ // Logged when the TTL of a node changes
+ event NewTTL(bytes32 indexed node, uint64 ttl);
+}
diff --git a/contracts/ens/contract/ENS.sol b/contracts/ens/contract/ENS.sol
new file mode 100644
index 000000000..47050c19d
--- /dev/null
+++ b/contracts/ens/contract/ENS.sol
@@ -0,0 +1,94 @@
+pragma solidity ^0.4.0;
+
+import './AbstractENS.sol';
+
+/**
+ * The ENS registry contract.
+ */
+contract ENS is AbstractENS {
+ struct Record {
+ address owner;
+ address resolver;
+ uint64 ttl;
+ }
+
+ mapping(bytes32=>Record) records;
+
+ // Permits modifications only by the owner of the specified node.
+ modifier only_owner(bytes32 node) {
+ if (records[node].owner != msg.sender) throw;
+ _;
+ }
+
+ /**
+ * Constructs a new ENS registrar.
+ */
+ function ENS() {
+ records[0].owner = msg.sender;
+ }
+
+ /**
+ * Returns the address that owns the specified node.
+ */
+ function owner(bytes32 node) constant returns (address) {
+ return records[node].owner;
+ }
+
+ /**
+ * Returns the address of the resolver for the specified node.
+ */
+ function resolver(bytes32 node) constant returns (address) {
+ return records[node].resolver;
+ }
+
+ /**
+ * Returns the TTL of a node, and any records associated with it.
+ */
+ function ttl(bytes32 node) constant returns (uint64) {
+ return records[node].ttl;
+ }
+
+ /**
+ * Transfers ownership of a node to a new address. May only be called by the current
+ * owner of the node.
+ * @param node The node to transfer ownership of.
+ * @param owner The address of the new owner.
+ */
+ function setOwner(bytes32 node, address owner) only_owner(node) {
+ Transfer(node, owner);
+ records[node].owner = owner;
+ }
+
+ /**
+ * Transfers ownership of a subnode sha3(node, label) to a new address. May only be
+ * called by the owner of the parent node.
+ * @param node The parent node.
+ * @param label The hash of the label specifying the subnode.
+ * @param owner The address of the new owner.
+ */
+ function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) {
+ var subnode = sha3(node, label);
+ NewOwner(node, label, owner);
+ records[subnode].owner = owner;
+ }
+
+ /**
+ * Sets the resolver address for the specified node.
+ * @param node The node to update.
+ * @param resolver The address of the resolver.
+ */
+ function setResolver(bytes32 node, address resolver) only_owner(node) {
+ NewResolver(node, resolver);
+ records[node].resolver = resolver;
+ }
+
+ /**
+ * Sets the TTL for the specified node.
+ * @param node The node to update.
+ * @param ttl The TTL in seconds.
+ */
+ function setTTL(bytes32 node, uint64 ttl) only_owner(node) {
+ NewTTL(node, ttl);
+ records[node].ttl = ttl;
+ }
+}
diff --git a/contracts/ens/contract/FIFSRegistrar.sol b/contracts/ens/contract/FIFSRegistrar.sol
new file mode 100644
index 000000000..51629c2b6
--- /dev/null
+++ b/contracts/ens/contract/FIFSRegistrar.sol
@@ -0,0 +1,39 @@
+pragma solidity ^0.4.0;
+
+import './AbstractENS.sol';
+
+/**
+ * A registrar that allocates subdomains to the first person to claim them.
+ */
+contract FIFSRegistrar {
+ AbstractENS ens;
+ bytes32 rootNode;
+
+ modifier only_owner(bytes32 subnode) {
+ var node = sha3(rootNode, subnode);
+ var currentOwner = ens.owner(node);
+
+ if (currentOwner != 0 && currentOwner != msg.sender) throw;
+
+ _;
+ }
+
+ /**
+ * Constructor.
+ * @param ensAddr The address of the ENS registry.
+ * @param node The node that this registrar administers.
+ */
+ function FIFSRegistrar(AbstractENS ensAddr, bytes32 node) {
+ ens = ensAddr;
+ rootNode = node;
+ }
+
+ /**
+ * Register a name, or change the owner of an existing registration.
+ * @param subnode The hash of the label to register.
+ * @param owner The address of the new owner.
+ */
+ function register(bytes32 subnode, address owner) only_owner(subnode) {
+ ens.setSubnodeOwner(rootNode, subnode, owner);
+ }
+}
diff --git a/contracts/ens/contract/PublicResolver.sol b/contracts/ens/contract/PublicResolver.sol
new file mode 100644
index 000000000..9dcc95689
--- /dev/null
+++ b/contracts/ens/contract/PublicResolver.sol
@@ -0,0 +1,212 @@
+pragma solidity ^0.4.0;
+
+import './AbstractENS.sol';
+
+/**
+ * A simple resolver anyone can use; only allows the owner of a node to set its
+ * address.
+ */
+contract PublicResolver {
+ bytes4 constant INTERFACE_META_ID = 0x01ffc9a7;
+ bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de;
+ bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5;
+ bytes4 constant NAME_INTERFACE_ID = 0x691f3431;
+ bytes4 constant ABI_INTERFACE_ID = 0x2203ab56;
+ bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233;
+ bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c;
+
+ event AddrChanged(bytes32 indexed node, address a);
+ event ContentChanged(bytes32 indexed node, bytes32 hash);
+ event NameChanged(bytes32 indexed node, string name);
+ event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
+ event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);
+ event TextChanged(bytes32 indexed node, string indexed indexedKey, string key);
+
+ struct PublicKey {
+ bytes32 x;
+ bytes32 y;
+ }
+
+ struct Record {
+ address addr;
+ bytes32 content;
+ string name;
+ PublicKey pubkey;
+ mapping(string=>string) text;
+ mapping(uint256=>bytes) abis;
+ }
+
+ AbstractENS ens;
+ mapping(bytes32=>Record) records;
+
+ modifier only_owner(bytes32 node) {
+ if (ens.owner(node) != msg.sender) throw;
+ _;
+ }
+
+ /**
+ * Constructor.
+ * @param ensAddr The ENS registrar contract.
+ */
+ function PublicResolver(AbstractENS ensAddr) {
+ ens = ensAddr;
+ }
+
+ /**
+ * Returns true if the resolver implements the interface specified by the provided hash.
+ * @param interfaceID The ID of the interface to check for.
+ * @return True if the contract implements the requested interface.
+ */
+ function supportsInterface(bytes4 interfaceID) constant returns (bool) {
+ return interfaceID == ADDR_INTERFACE_ID ||
+ interfaceID == CONTENT_INTERFACE_ID ||
+ interfaceID == NAME_INTERFACE_ID ||
+ interfaceID == ABI_INTERFACE_ID ||
+ interfaceID == PUBKEY_INTERFACE_ID ||
+ interfaceID == TEXT_INTERFACE_ID ||
+ interfaceID == INTERFACE_META_ID;
+ }
+
+ /**
+ * Returns the address associated with an ENS node.
+ * @param node The ENS node to query.
+ * @return The associated address.
+ */
+ function addr(bytes32 node) constant returns (address ret) {
+ ret = records[node].addr;
+ }
+
+ /**
+ * Sets the address associated with an ENS node.
+ * May only be called by the owner of that node in the ENS registry.
+ * @param node The node to update.
+ * @param addr The address to set.
+ */
+ function setAddr(bytes32 node, address addr) only_owner(node) {
+ records[node].addr = addr;
+ AddrChanged(node, addr);
+ }
+
+ /**
+ * Returns the content hash associated with an ENS node.
+ * Note that this resource type is not standardized, and will likely change
+ * in future to a resource type based on multihash.
+ * @param node The ENS node to query.
+ * @return The associated content hash.
+ */
+ function content(bytes32 node) constant returns (bytes32 ret) {
+ ret = records[node].content;
+ }
+
+ /**
+ * Sets the content hash associated with an ENS node.
+ * May only be called by the owner of that node in the ENS registry.
+ * Note that this resource type is not standardized, and will likely change
+ * in future to a resource type based on multihash.
+ * @param node The node to update.
+ * @param hash The content hash to set
+ */
+ function setContent(bytes32 node, bytes32 hash) only_owner(node) {
+ records[node].content = hash;
+ ContentChanged(node, hash);
+ }
+
+ /**
+ * Returns the name associated with an ENS node, for reverse records.
+ * Defined in EIP181.
+ * @param node The ENS node to query.
+ * @return The associated name.
+ */
+ function name(bytes32 node) constant returns (string ret) {
+ ret = records[node].name;
+ }
+
+ /**
+ * Sets the name associated with an ENS node, for reverse records.
+ * May only be called by the owner of that node in the ENS registry.
+ * @param node The node to update.
+ * @param name The name to set.
+ */
+ function setName(bytes32 node, string name) only_owner(node) {
+ records[node].name = name;
+ NameChanged(node, name);
+ }
+
+ /**
+ * Returns the ABI associated with an ENS node.
+ * Defined in EIP205.
+ * @param node The ENS node to query
+ * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.
+ * @return contentType The content type of the return value
+ * @return data The ABI data
+ */
+ function ABI(bytes32 node, uint256 contentTypes) constant returns (uint256 contentType, bytes data) {
+ var record = records[node];
+ for(contentType = 1; contentType <= contentTypes; contentType <<= 1) {
+ if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) {
+ data = record.abis[contentType];
+ return;
+ }
+ }
+ contentType = 0;
+ }
+
+ /**
+ * Sets the ABI associated with an ENS node.
+ * Nodes may have one ABI of each content type. To remove an ABI, set it to
+ * the empty string.
+ * @param node The node to update.
+ * @param contentType The content type of the ABI
+ * @param data The ABI data.
+ */
+ function setABI(bytes32 node, uint256 contentType, bytes data) only_owner(node) {
+ // Content types must be powers of 2
+ if (((contentType - 1) & contentType) != 0) throw;
+
+ records[node].abis[contentType] = data;
+ ABIChanged(node, contentType);
+ }
+
+ /**
+ * Returns the SECP256k1 public key associated with an ENS node.
+ * Defined in EIP 619.
+ * @param node The ENS node to query
+ * @return x, y the X and Y coordinates of the curve point for the public key.
+ */
+ function pubkey(bytes32 node) constant returns (bytes32 x, bytes32 y) {
+ return (records[node].pubkey.x, records[node].pubkey.y);
+ }
+
+ /**
+ * Sets the SECP256k1 public key associated with an ENS node.
+ * @param node The ENS node to query
+ * @param x the X coordinate of the curve point for the public key.
+ * @param y the Y coordinate of the curve point for the public key.
+ */
+ function setPubkey(bytes32 node, bytes32 x, bytes32 y) only_owner(node) {
+ records[node].pubkey = PublicKey(x, y);
+ PubkeyChanged(node, x, y);
+ }
+
+ /**
+ * Returns the text data associated with an ENS node and key.
+ * @param node The ENS node to query.
+ * @param key The text data key to query.
+ * @return The associated text data.
+ */
+ function text(bytes32 node, string key) constant returns (string ret) {
+ ret = records[node].text[key];
+ }
+
+ /**
+ * Sets the text data associated with an ENS node and key.
+ * May only be called by the owner of that node in the ENS registry.
+ * @param node The node to update.
+ * @param key The key to set.
+ * @param value The text data value to set.
+ */
+ function setText(bytes32 node, string key, string value) only_owner(node) {
+ records[node].text[key] = value;
+ TextChanged(node, key, key);
+ }
+}
diff --git a/contracts/ens/contract/ens.go b/contracts/ens/contract/ens.go
index aca16de50..cbf6cb05b 100644
--- a/contracts/ens/contract/ens.go
+++ b/contracts/ens/contract/ens.go
@@ -1,40 +1,43 @@
-// This file is an automatically generated Go binding. Do not modify as any
-// change will likely be lost upon the next re-generation!
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
package contract
import (
"strings"
+ ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
)
// ENSABI is the input ABI used to generate the binding from.
-const ENSABI = `[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"label","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"inputs":[{"name":"owner","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"label","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"resolver","type":"address"}],"name":"NewResolver","type":"event"}]`
+const ENSABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"resolver\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"label\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setSubnodeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"setTTL\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"ttl\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"setResolver\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"label\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"NewResolver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"NewTTL\",\"type\":\"event\"}]"
// ENSBin is the compiled bytecode used for deploying new contracts.
-const ENSBin = `0x606060405260405160208061032683395060806040525160008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a03191682179055506102c88061005e6000396000f3606060405260e060020a60003504630178b8bf811461004757806302571be31461006e57806306ab5923146100915780631896f70a146100c85780635b0fc9c3146100fc575b005b610130600435600081815260208190526040902060010154600160a060020a03165b919050565b610130600435600081815260208190526040902054600160a060020a0316610069565b6100456004356024356044356000838152602081905260408120548490600160a060020a0390811633919091161461014d57610002565b6100456004356024356000828152602081905260409020548290600160a060020a039081163391909116146101e757610002565b6100456004356024356000828152602081905260409020548290600160a060020a0390811633919091161461025957610002565b60408051600160a060020a03929092168252519081900360200190f35b60408051868152602081810187905282519182900383018220600160a060020a03871683529251929450869288927fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8292908290030190a382600060005060008460001916815260200190815260200160002060005060000160006101000a815481600160a060020a03021916908302179055505050505050565b60408051600160a060020a0384168152905184917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0919081900360200190a2506000828152602081905260409020600101805473ffffffffffffffffffffffffffffffffffffffff1916821790555050565b60408051600160a060020a0384168152905184917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266919081900360200190a2506000828152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff191682179055505056`
+const ENSBin = `0x6060604052341561000f57600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a033316600160a060020a0319909116179055610503806100626000396000f3006060604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100b957806306ab5923146100cf57806314ab9038146100f657806316a25cbd146101195780631896f70a1461014c5780635b0fc9c31461016e575b600080fd5b341561009257600080fd5b61009d600435610190565b604051600160a060020a03909116815260200160405180910390f35b34156100c457600080fd5b61009d6004356101ae565b34156100da57600080fd5b6100f4600435602435600160a060020a03604435166101c9565b005b341561010157600080fd5b6100f460043567ffffffffffffffff6024351661028b565b341561012457600080fd5b61012f600435610357565b60405167ffffffffffffffff909116815260200160405180910390f35b341561015757600080fd5b6100f4600435600160a060020a036024351661038e565b341561017957600080fd5b6100f4600435600160a060020a0360243516610434565b600090815260208190526040902060010154600160a060020a031690565b600090815260208190526040902054600160a060020a031690565b600083815260208190526040812054849033600160a060020a039081169116146101f257600080fd5b8484604051918252602082015260409081019051908190039020915083857fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8285604051600160a060020a03909116815260200160405180910390a3506000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b600082815260208190526040902054829033600160a060020a039081169116146102b457600080fd5b827f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa688360405167ffffffffffffffff909116815260200160405180910390a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829033600160a060020a039081169116146103b757600080fd5b827f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a083604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120600101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600082815260208190526040902054829033600160a060020a0390811691161461045d57600080fd5b827fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26683604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555600a165627a7a72305820f4c798d4c84c9912f389f64631e85e8d16c3e6644f8c2e1579936015c7d5f6660029`
// DeployENS deploys a new Ethereum contract, binding an instance of ENS to it.
-func DeployENS(auth *bind.TransactOpts, backend bind.ContractBackend, owner common.Address) (common.Address, *types.Transaction, *ENS, error) {
+func DeployENS(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ENS, error) {
parsed, err := abi.JSON(strings.NewReader(ENSABI))
if err != nil {
return common.Address{}, nil, nil, err
}
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSBin), backend, owner)
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSBin), backend)
if err != nil {
return common.Address{}, nil, nil, err
}
- return address, tx, &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}}, nil
+ return address, tx, &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}, ENSFilterer: ENSFilterer{contract: contract}}, nil
}
// ENS is an auto generated Go binding around an Ethereum contract.
type ENS struct {
ENSCaller // Read-only binding to the contract
ENSTransactor // Write-only binding to the contract
+ ENSFilterer // Log filterer for contract events
}
// ENSCaller is an auto generated read-only Go binding around an Ethereum contract.
@@ -47,6 +50,11 @@ type ENSTransactor struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
+// ENSFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ENSFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
// ENSSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ENSSession struct {
@@ -86,16 +94,16 @@ type ENSTransactorRaw struct {
// NewENS creates a new instance of ENS, bound to a specific deployed contract.
func NewENS(address common.Address, backend bind.ContractBackend) (*ENS, error) {
- contract, err := bindENS(address, backend, backend)
+ contract, err := bindENS(address, backend, backend, backend)
if err != nil {
return nil, err
}
- return &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}}, nil
+ return &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}, ENSFilterer: ENSFilterer{contract: contract}}, nil
}
// NewENSCaller creates a new read-only instance of ENS, bound to a specific deployed contract.
func NewENSCaller(address common.Address, caller bind.ContractCaller) (*ENSCaller, error) {
- contract, err := bindENS(address, caller, nil)
+ contract, err := bindENS(address, caller, nil, nil)
if err != nil {
return nil, err
}
@@ -104,20 +112,29 @@ func NewENSCaller(address common.Address, caller bind.ContractCaller) (*ENSCalle
// NewENSTransactor creates a new write-only instance of ENS, bound to a specific deployed contract.
func NewENSTransactor(address common.Address, transactor bind.ContractTransactor) (*ENSTransactor, error) {
- contract, err := bindENS(address, nil, transactor)
+ contract, err := bindENS(address, nil, transactor, nil)
if err != nil {
return nil, err
}
return &ENSTransactor{contract: contract}, nil
}
+// NewENSFilterer creates a new log filterer instance of ENS, bound to a specific deployed contract.
+func NewENSFilterer(address common.Address, filterer bind.ContractFilterer) (*ENSFilterer, error) {
+ contract, err := bindENS(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ENSFilterer{contract: contract}, nil
+}
+
// bindENS binds a generic wrapper to an already deployed contract.
-func bindENS(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
+func bindENS(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
parsed, err := abi.JSON(strings.NewReader(ENSABI))
if err != nil {
return nil, err
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
+ return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}
// Call invokes the (constant) contract method with params as input values and
@@ -210,6 +227,32 @@ func (_ENS *ENSCallerSession) Resolver(node [32]byte) (common.Address, error) {
return _ENS.Contract.Resolver(&_ENS.CallOpts, node)
}
+// Ttl is a free data retrieval call binding the contract method 0x16a25cbd.
+//
+// Solidity: function ttl(node bytes32) constant returns(uint64)
+func (_ENS *ENSCaller) Ttl(opts *bind.CallOpts, node [32]byte) (uint64, error) {
+ var (
+ ret0 = new(uint64)
+ )
+ out := ret0
+ err := _ENS.contract.Call(opts, out, "ttl", node)
+ return *ret0, err
+}
+
+// Ttl is a free data retrieval call binding the contract method 0x16a25cbd.
+//
+// Solidity: function ttl(node bytes32) constant returns(uint64)
+func (_ENS *ENSSession) Ttl(node [32]byte) (uint64, error) {
+ return _ENS.Contract.Ttl(&_ENS.CallOpts, node)
+}
+
+// Ttl is a free data retrieval call binding the contract method 0x16a25cbd.
+//
+// Solidity: function ttl(node bytes32) constant returns(uint64)
+func (_ENS *ENSCallerSession) Ttl(node [32]byte) (uint64, error) {
+ return _ENS.Contract.Ttl(&_ENS.CallOpts, node)
+}
+
// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3.
//
// Solidity: function setOwner(node bytes32, owner address) returns()
@@ -273,649 +316,564 @@ func (_ENS *ENSTransactorSession) SetSubnodeOwner(node [32]byte, label [32]byte,
return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner)
}
-// FIFSRegistrarABI is the input ABI used to generate the binding from.
-const FIFSRegistrarABI = `[{"constant":false,"inputs":[{"name":"subnode","type":"bytes32"},{"name":"owner","type":"address"}],"name":"register","outputs":[],"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"},{"name":"node","type":"bytes32"}],"type":"constructor"}]`
-
-// FIFSRegistrarBin is the compiled bytecode used for deploying new contracts.
-const FIFSRegistrarBin = `0x6060604081815280610620833960a090525160805160008054600160a060020a031916831790558160a0610367806100878339018082600160a060020a03168152602001915050604051809103906000f0600160006101000a815481600160a060020a0302191690830217905550806002600050819055505050610232806103ee6000396000f3606060405260405160208061036783395060806040525160008054600160a060020a0319168217905550610330806100376000396000f36060604052361561004b5760e060020a60003504632dff694181146100535780633b3b57de1461007557806341b9dc2b146100a0578063c3d014d614610139578063d5fa2b00146101b2575b61022b610002565b61022d6004356000818152600260205260408120549081141561027057610002565b61023f600435600081815260016020526040812054600160a060020a03169081141561027057610002565b61025c60043560243560007f6164647200000000000000000000000000000000000000000000000000000000821480156100f05750600083815260016020526040812054600160a060020a031614155b8061013257507f636f6e74656e740000000000000000000000000000000000000000000000000082148015610132575060008381526002602052604081205414155b9392505050565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a031691909114905061027557610002565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a03169190911490506102c157610002565b005b60408051918252519081900360200190f35b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b919050565b6000838152600260209081526040918290208490558151848152915185927f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc92908290030190a2505050565b600083815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916851790558151600160a060020a0385168152915185927f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd292908290030190a250505056606060405260e060020a6000350463d22057a9811461001b575b005b61001960043560243560025460408051918252602082810185905260008054835194859003840185207f02571be300000000000000000000000000000000000000000000000000000000865260048601819052935193949193600160a060020a03909116926302571be39260248181019391829003018187876161da5a03f11561000257505060405151915050600160a060020a0381166000148015906100d4575033600160a060020a031681600160a060020a031614155b156100de57610002565b60408051600080546002547f06ab592300000000000000000000000000000000000000000000000000000000845260048401526024830188905230600160a060020a03908116604485015293519316926306ab5923926064818101939291829003018183876161da5a03f11561000257505060008054600154604080517f1896f70a00000000000000000000000000000000000000000000000000000000815260048101889052600160a060020a0392831660248201529051929091169350631896f70a926044828101939192829003018183876161da5a03f11561000257505060008054604080517f5b0fc9c300000000000000000000000000000000000000000000000000000000815260048101879052600160a060020a0388811660248301529151929091169350635b0fc9c3926044828101939192829003018183876161da5a03f115610002575050505050505056`
-
-// DeployFIFSRegistrar deploys a new Ethereum contract, binding an instance of FIFSRegistrar to it.
-func DeployFIFSRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address, node [32]byte) (common.Address, *types.Transaction, *FIFSRegistrar, error) {
- parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(FIFSRegistrarBin), backend, ensAddr, node)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}}, nil
+// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038.
+//
+// Solidity: function setTTL(node bytes32, ttl uint64) returns()
+func (_ENS *ENSTransactor) SetTTL(opts *bind.TransactOpts, node [32]byte, ttl uint64) (*types.Transaction, error) {
+ return _ENS.contract.Transact(opts, "setTTL", node, ttl)
}
-// FIFSRegistrar is an auto generated Go binding around an Ethereum contract.
-type FIFSRegistrar struct {
- FIFSRegistrarCaller // Read-only binding to the contract
- FIFSRegistrarTransactor // Write-only binding to the contract
+// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038.
+//
+// Solidity: function setTTL(node bytes32, ttl uint64) returns()
+func (_ENS *ENSSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) {
+ return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl)
}
-// FIFSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
-type FIFSRegistrarCaller struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
+// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038.
+//
+// Solidity: function setTTL(node bytes32, ttl uint64) returns()
+func (_ENS *ENSTransactorSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) {
+ return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl)
}
-// FIFSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type FIFSRegistrarTransactor struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
+// ENSNewOwnerIterator is returned from FilterNewOwner and is used to iterate over the raw logs and unpacked data for NewOwner events raised by the ENS contract.
+type ENSNewOwnerIterator struct {
+ Event *ENSNewOwner // Event containing the contract specifics and raw log
-// FIFSRegistrarSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type FIFSRegistrarSession struct {
- Contract *FIFSRegistrar // Generic contract binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
-// FIFSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type FIFSRegistrarCallerSession struct {
- Contract *FIFSRegistrarCaller // Generic contract caller binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
}
-// FIFSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type FIFSRegistrarTransactorSession struct {
- Contract *FIFSRegistrarTransactor // Generic contract transactor binding to set the session for
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ENSNewOwnerIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSNewOwner)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSNewOwner)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
}
-// FIFSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
-type FIFSRegistrarRaw struct {
- Contract *FIFSRegistrar // Generic contract binding to access the raw methods on
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *ENSNewOwnerIterator) Error() error {
+ return it.fail
}
-// FIFSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type FIFSRegistrarCallerRaw struct {
- Contract *FIFSRegistrarCaller // Generic read-only contract binding to access the raw methods on
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ENSNewOwnerIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
}
-// FIFSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type FIFSRegistrarTransactorRaw struct {
- Contract *FIFSRegistrarTransactor // Generic write-only contract binding to access the raw methods on
+// ENSNewOwner represents a NewOwner event raised by the ENS contract.
+type ENSNewOwner struct {
+ Node [32]byte
+ Label [32]byte
+ Owner common.Address
+ Raw types.Log // Blockchain specific contextual infos
}
-// NewFIFSRegistrar creates a new instance of FIFSRegistrar, bound to a specific deployed contract.
-func NewFIFSRegistrar(address common.Address, backend bind.ContractBackend) (*FIFSRegistrar, error) {
- contract, err := bindFIFSRegistrar(address, backend, backend)
- if err != nil {
- return nil, err
- }
- return &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}}, nil
-}
+// FilterNewOwner is a free log retrieval operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82.
+//
+// Solidity: event NewOwner(node indexed bytes32, label indexed bytes32, owner address)
+func (_ENS *ENSFilterer) FilterNewOwner(opts *bind.FilterOpts, node [][32]byte, label [][32]byte) (*ENSNewOwnerIterator, error) {
-// NewFIFSRegistrarCaller creates a new read-only instance of FIFSRegistrar, bound to a specific deployed contract.
-func NewFIFSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*FIFSRegistrarCaller, error) {
- contract, err := bindFIFSRegistrar(address, caller, nil)
- if err != nil {
- return nil, err
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
}
- return &FIFSRegistrarCaller{contract: contract}, nil
-}
-
-// NewFIFSRegistrarTransactor creates a new write-only instance of FIFSRegistrar, bound to a specific deployed contract.
-func NewFIFSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*FIFSRegistrarTransactor, error) {
- contract, err := bindFIFSRegistrar(address, nil, transactor)
- if err != nil {
- return nil, err
+ var labelRule []interface{}
+ for _, labelItem := range label {
+ labelRule = append(labelRule, labelItem)
}
- return &FIFSRegistrarTransactor{contract: contract}, nil
-}
-// bindFIFSRegistrar binds a generic wrapper to an already deployed contract.
-func bindFIFSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
- parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
+ logs, sub, err := _ENS.contract.FilterLogs(opts, "NewOwner", nodeRule, labelRule)
if err != nil {
return nil, err
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_FIFSRegistrar *FIFSRegistrarRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _FIFSRegistrar.Contract.FIFSRegistrarCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_FIFSRegistrar *FIFSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_FIFSRegistrar *FIFSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_FIFSRegistrar *FIFSRegistrarCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _FIFSRegistrar.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _FIFSRegistrar.Contract.contract.Transfer(opts)
+ return &ENSNewOwnerIterator{contract: _ENS.contract, event: "NewOwner", logs: logs, sub: sub}, nil
}
-// Transact invokes the (paid) contract method with params as input values.
-func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _FIFSRegistrar.Contract.contract.Transact(opts, method, params...)
-}
-
-// Register is a paid mutator transaction binding the contract method 0xd22057a9.
+// WatchNewOwner is a free log subscription operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82.
//
-// Solidity: function register(subnode bytes32, owner address) returns()
-func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, subnode [32]byte, owner common.Address) (*types.Transaction, error) {
- return _FIFSRegistrar.contract.Transact(opts, "register", subnode, owner)
-}
+// Solidity: event NewOwner(node indexed bytes32, label indexed bytes32, owner address)
+func (_ENS *ENSFilterer) WatchNewOwner(opts *bind.WatchOpts, sink chan<- *ENSNewOwner, node [][32]byte, label [][32]byte) (event.Subscription, error) {
-// Register is a paid mutator transaction binding the contract method 0xd22057a9.
-//
-// Solidity: function register(subnode bytes32, owner address) returns()
-func (_FIFSRegistrar *FIFSRegistrarSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
- return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
-}
-
-// Register is a paid mutator transaction binding the contract method 0xd22057a9.
-//
-// Solidity: function register(subnode bytes32, owner address) returns()
-func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
- return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
-}
-
-// PublicResolverABI is the input ABI used to generate the binding from.
-const PublicResolverABI = `[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"kind","type":"bytes32"}],"name":"has","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"hash","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"addr","type":"address"}],"name":"setAddr","outputs":[],"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"}]`
-
-// PublicResolverBin is the compiled bytecode used for deploying new contracts.
-const PublicResolverBin = `0x606060405260405160208061036783395060806040525160008054600160a060020a0319168217905550610330806100376000396000f36060604052361561004b5760e060020a60003504632dff694181146100535780633b3b57de1461007557806341b9dc2b146100a0578063c3d014d614610139578063d5fa2b00146101b2575b61022b610002565b61022d6004356000818152600260205260408120549081141561027057610002565b61023f600435600081815260016020526040812054600160a060020a03169081141561027057610002565b61025c60043560243560007f6164647200000000000000000000000000000000000000000000000000000000821480156100f05750600083815260016020526040812054600160a060020a031614155b8061013257507f636f6e74656e740000000000000000000000000000000000000000000000000082148015610132575060008381526002602052604081205414155b9392505050565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a031691909114905061027557610002565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a03169190911490506102c157610002565b005b60408051918252519081900360200190f35b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b919050565b6000838152600260209081526040918290208490558151848152915185927f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc92908290030190a2505050565b600083815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916851790558151600160a060020a0385168152915185927f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd292908290030190a250505056`
-
-// DeployPublicResolver deploys a new Ethereum contract, binding an instance of PublicResolver to it.
-func DeployPublicResolver(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address) (common.Address, *types.Transaction, *PublicResolver, error) {
- parsed, err := abi.JSON(strings.NewReader(PublicResolverABI))
- if err != nil {
- return common.Address{}, nil, nil, err
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
}
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PublicResolverBin), backend, ensAddr)
- if err != nil {
- return common.Address{}, nil, nil, err
+ var labelRule []interface{}
+ for _, labelItem := range label {
+ labelRule = append(labelRule, labelItem)
}
- return address, tx, &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}}, nil
-}
-
-// PublicResolver is an auto generated Go binding around an Ethereum contract.
-type PublicResolver struct {
- PublicResolverCaller // Read-only binding to the contract
- PublicResolverTransactor // Write-only binding to the contract
-}
-
-// PublicResolverCaller is an auto generated read-only Go binding around an Ethereum contract.
-type PublicResolverCaller struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// PublicResolverTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type PublicResolverTransactor struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// PublicResolverSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type PublicResolverSession struct {
- Contract *PublicResolver // Generic contract binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// PublicResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type PublicResolverCallerSession struct {
- Contract *PublicResolverCaller // Generic contract caller binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
-}
-
-// PublicResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type PublicResolverTransactorSession struct {
- Contract *PublicResolverTransactor // Generic contract transactor binding to set the session for
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// PublicResolverRaw is an auto generated low-level Go binding around an Ethereum contract.
-type PublicResolverRaw struct {
- Contract *PublicResolver // Generic contract binding to access the raw methods on
-}
-
-// PublicResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type PublicResolverCallerRaw struct {
- Contract *PublicResolverCaller // Generic read-only contract binding to access the raw methods on
-}
-
-// PublicResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type PublicResolverTransactorRaw struct {
- Contract *PublicResolverTransactor // Generic write-only contract binding to access the raw methods on
-}
-// NewPublicResolver creates a new instance of PublicResolver, bound to a specific deployed contract.
-func NewPublicResolver(address common.Address, backend bind.ContractBackend) (*PublicResolver, error) {
- contract, err := bindPublicResolver(address, backend, backend)
+ logs, sub, err := _ENS.contract.WatchLogs(opts, "NewOwner", nodeRule, labelRule)
if err != nil {
return nil, err
}
- return &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}}, nil
-}
-
-// NewPublicResolverCaller creates a new read-only instance of PublicResolver, bound to a specific deployed contract.
-func NewPublicResolverCaller(address common.Address, caller bind.ContractCaller) (*PublicResolverCaller, error) {
- contract, err := bindPublicResolver(address, caller, nil)
- if err != nil {
- return nil, err
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(ENSNewOwner)
+ if err := _ENS.contract.UnpackLog(event, "NewOwner", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ENSNewResolverIterator is returned from FilterNewResolver and is used to iterate over the raw logs and unpacked data for NewResolver events raised by the ENS contract.
+type ENSNewResolverIterator struct {
+ Event *ENSNewResolver // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ENSNewResolverIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
}
- return &PublicResolverCaller{contract: contract}, nil
-}
-
-// NewPublicResolverTransactor creates a new write-only instance of PublicResolver, bound to a specific deployed contract.
-func NewPublicResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*PublicResolverTransactor, error) {
- contract, err := bindPublicResolver(address, nil, transactor)
- if err != nil {
- return nil, err
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSNewResolver)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
}
- return &PublicResolverTransactor{contract: contract}, nil
-}
-
-// bindPublicResolver binds a generic wrapper to an already deployed contract.
-func bindPublicResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
- parsed, err := abi.JSON(strings.NewReader(PublicResolverABI))
- if err != nil {
- return nil, err
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSNewResolver)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_PublicResolver *PublicResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _PublicResolver.Contract.PublicResolverCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_PublicResolver *PublicResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _PublicResolver.Contract.PublicResolverTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_PublicResolver *PublicResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _PublicResolver.Contract.PublicResolverTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_PublicResolver *PublicResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _PublicResolver.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_PublicResolver *PublicResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _PublicResolver.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_PublicResolver *PublicResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _PublicResolver.Contract.contract.Transact(opts, method, params...)
-}
-
-// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
-//
-// Solidity: function addr(node bytes32) constant returns(ret address)
-func (_PublicResolver *PublicResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) {
- var (
- ret0 = new(common.Address)
- )
- out := ret0
- err := _PublicResolver.contract.Call(opts, out, "addr", node)
- return *ret0, err
-}
-
-// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
-//
-// Solidity: function addr(node bytes32) constant returns(ret address)
-func (_PublicResolver *PublicResolverSession) Addr(node [32]byte) (common.Address, error) {
- return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node)
-}
-
-// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
-//
-// Solidity: function addr(node bytes32) constant returns(ret address)
-func (_PublicResolver *PublicResolverCallerSession) Addr(node [32]byte) (common.Address, error) {
- return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node)
-}
-
-// Content is a free data retrieval call binding the contract method 0x2dff6941.
-//
-// Solidity: function content(node bytes32) constant returns(ret bytes32)
-func (_PublicResolver *PublicResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) {
- var (
- ret0 = new([32]byte)
- )
- out := ret0
- err := _PublicResolver.contract.Call(opts, out, "content", node)
- return *ret0, err
-}
-
-// Content is a free data retrieval call binding the contract method 0x2dff6941.
-//
-// Solidity: function content(node bytes32) constant returns(ret bytes32)
-func (_PublicResolver *PublicResolverSession) Content(node [32]byte) ([32]byte, error) {
- return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node)
-}
-
-// Content is a free data retrieval call binding the contract method 0x2dff6941.
-//
-// Solidity: function content(node bytes32) constant returns(ret bytes32)
-func (_PublicResolver *PublicResolverCallerSession) Content(node [32]byte) ([32]byte, error) {
- return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node)
}
-// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
-//
-// Solidity: function has(node bytes32, kind bytes32) returns(bool)
-func (_PublicResolver *PublicResolverTransactor) Has(opts *bind.TransactOpts, node [32]byte, kind [32]byte) (*types.Transaction, error) {
- return _PublicResolver.contract.Transact(opts, "has", node, kind)
-}
-
-// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
-//
-// Solidity: function has(node bytes32, kind bytes32) returns(bool)
-func (_PublicResolver *PublicResolverSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
- return _PublicResolver.Contract.Has(&_PublicResolver.TransactOpts, node, kind)
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *ENSNewResolverIterator) Error() error {
+ return it.fail
}
-// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
-//
-// Solidity: function has(node bytes32, kind bytes32) returns(bool)
-func (_PublicResolver *PublicResolverTransactorSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
- return _PublicResolver.Contract.Has(&_PublicResolver.TransactOpts, node, kind)
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ENSNewResolverIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
}
-// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
-//
-// Solidity: function setAddr(node bytes32, addr address) returns()
-func (_PublicResolver *PublicResolverTransactor) SetAddr(opts *bind.TransactOpts, node [32]byte, addr common.Address) (*types.Transaction, error) {
- return _PublicResolver.contract.Transact(opts, "setAddr", node, addr)
+// ENSNewResolver represents a NewResolver event raised by the ENS contract.
+type ENSNewResolver struct {
+ Node [32]byte
+ Resolver common.Address
+ Raw types.Log // Blockchain specific contextual infos
}
-// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
+// FilterNewResolver is a free log retrieval operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0.
//
-// Solidity: function setAddr(node bytes32, addr address) returns()
-func (_PublicResolver *PublicResolverSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) {
- return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr)
-}
+// Solidity: event NewResolver(node indexed bytes32, resolver address)
+func (_ENS *ENSFilterer) FilterNewResolver(opts *bind.FilterOpts, node [][32]byte) (*ENSNewResolverIterator, error) {
-// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
-//
-// Solidity: function setAddr(node bytes32, addr address) returns()
-func (_PublicResolver *PublicResolverTransactorSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) {
- return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr)
-}
-
-// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
-//
-// Solidity: function setContent(node bytes32, hash bytes32) returns()
-func (_PublicResolver *PublicResolverTransactor) SetContent(opts *bind.TransactOpts, node [32]byte, hash [32]byte) (*types.Transaction, error) {
- return _PublicResolver.contract.Transact(opts, "setContent", node, hash)
-}
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
-// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
-//
-// Solidity: function setContent(node bytes32, hash bytes32) returns()
-func (_PublicResolver *PublicResolverSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) {
- return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash)
+ logs, sub, err := _ENS.contract.FilterLogs(opts, "NewResolver", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ENSNewResolverIterator{contract: _ENS.contract, event: "NewResolver", logs: logs, sub: sub}, nil
}
-// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
+// WatchNewResolver is a free log subscription operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0.
//
-// Solidity: function setContent(node bytes32, hash bytes32) returns()
-func (_PublicResolver *PublicResolverTransactorSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) {
- return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash)
-}
+// Solidity: event NewResolver(node indexed bytes32, resolver address)
+func (_ENS *ENSFilterer) WatchNewResolver(opts *bind.WatchOpts, sink chan<- *ENSNewResolver, node [][32]byte) (event.Subscription, error) {
-// ResolverABI is the input ABI used to generate the binding from.
-const ResolverABI = `[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"kind","type":"bytes32"}],"name":"has","outputs":[{"name":"","type":"bool"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"}]`
-
-// ResolverBin is the compiled bytecode used for deploying new contracts.
-const ResolverBin = `0x`
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
-// DeployResolver deploys a new Ethereum contract, binding an instance of Resolver to it.
-func DeployResolver(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Resolver, error) {
- parsed, err := abi.JSON(strings.NewReader(ResolverABI))
+ logs, sub, err := _ENS.contract.WatchLogs(opts, "NewResolver", nodeRule)
if err != nil {
- return common.Address{}, nil, nil, err
+ return nil, err
}
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ResolverBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(ENSNewResolver)
+ if err := _ENS.contract.UnpackLog(event, "NewResolver", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ENSNewTTLIterator is returned from FilterNewTTL and is used to iterate over the raw logs and unpacked data for NewTTL events raised by the ENS contract.
+type ENSNewTTLIterator struct {
+ Event *ENSNewTTL // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ENSNewTTLIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSNewTTL)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSNewTTL)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
}
- return address, tx, &Resolver{ResolverCaller: ResolverCaller{contract: contract}, ResolverTransactor: ResolverTransactor{contract: contract}}, nil
-}
-
-// Resolver is an auto generated Go binding around an Ethereum contract.
-type Resolver struct {
- ResolverCaller // Read-only binding to the contract
- ResolverTransactor // Write-only binding to the contract
-}
-
-// ResolverCaller is an auto generated read-only Go binding around an Ethereum contract.
-type ResolverCaller struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// ResolverTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type ResolverTransactor struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// ResolverSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type ResolverSession struct {
- Contract *Resolver // Generic contract binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// ResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type ResolverCallerSession struct {
- Contract *ResolverCaller // Generic contract caller binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
}
-// ResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type ResolverTransactorSession struct {
- Contract *ResolverTransactor // Generic contract transactor binding to set the session for
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *ENSNewTTLIterator) Error() error {
+ return it.fail
}
-// ResolverRaw is an auto generated low-level Go binding around an Ethereum contract.
-type ResolverRaw struct {
- Contract *Resolver // Generic contract binding to access the raw methods on
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ENSNewTTLIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
}
-// ResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type ResolverCallerRaw struct {
- Contract *ResolverCaller // Generic read-only contract binding to access the raw methods on
+// ENSNewTTL represents a NewTTL event raised by the ENS contract.
+type ENSNewTTL struct {
+ Node [32]byte
+ Ttl uint64
+ Raw types.Log // Blockchain specific contextual infos
}
-// ResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type ResolverTransactorRaw struct {
- Contract *ResolverTransactor // Generic write-only contract binding to access the raw methods on
-}
+// FilterNewTTL is a free log retrieval operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68.
+//
+// Solidity: event NewTTL(node indexed bytes32, ttl uint64)
+func (_ENS *ENSFilterer) FilterNewTTL(opts *bind.FilterOpts, node [][32]byte) (*ENSNewTTLIterator, error) {
-// NewResolver creates a new instance of Resolver, bound to a specific deployed contract.
-func NewResolver(address common.Address, backend bind.ContractBackend) (*Resolver, error) {
- contract, err := bindResolver(address, backend, backend)
- if err != nil {
- return nil, err
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
}
- return &Resolver{ResolverCaller: ResolverCaller{contract: contract}, ResolverTransactor: ResolverTransactor{contract: contract}}, nil
-}
-// NewResolverCaller creates a new read-only instance of Resolver, bound to a specific deployed contract.
-func NewResolverCaller(address common.Address, caller bind.ContractCaller) (*ResolverCaller, error) {
- contract, err := bindResolver(address, caller, nil)
+ logs, sub, err := _ENS.contract.FilterLogs(opts, "NewTTL", nodeRule)
if err != nil {
return nil, err
}
- return &ResolverCaller{contract: contract}, nil
+ return &ENSNewTTLIterator{contract: _ENS.contract, event: "NewTTL", logs: logs, sub: sub}, nil
}
-// NewResolverTransactor creates a new write-only instance of Resolver, bound to a specific deployed contract.
-func NewResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*ResolverTransactor, error) {
- contract, err := bindResolver(address, nil, transactor)
- if err != nil {
- return nil, err
+// WatchNewTTL is a free log subscription operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68.
+//
+// Solidity: event NewTTL(node indexed bytes32, ttl uint64)
+func (_ENS *ENSFilterer) WatchNewTTL(opts *bind.WatchOpts, sink chan<- *ENSNewTTL, node [][32]byte) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
}
- return &ResolverTransactor{contract: contract}, nil
-}
-// bindResolver binds a generic wrapper to an already deployed contract.
-func bindResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
- parsed, err := abi.JSON(strings.NewReader(ResolverABI))
+ logs, sub, err := _ENS.contract.WatchLogs(opts, "NewTTL", nodeRule)
if err != nil {
return nil, err
}
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Resolver *ResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _Resolver.Contract.ResolverCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Resolver *ResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Resolver.Contract.ResolverTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_Resolver *ResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Resolver.Contract.ResolverTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Resolver *ResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _Resolver.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Resolver *ResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Resolver.Contract.contract.Transfer(opts)
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(ENSNewTTL)
+ if err := _ENS.contract.UnpackLog(event, "NewTTL", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ENSTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ENS contract.
+type ENSTransferIterator struct {
+ Event *ENSTransfer // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ENSTransferIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSTransfer)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(ENSTransfer)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
}
-// Transact invokes the (paid) contract method with params as input values.
-func (_Resolver *ResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Resolver.Contract.contract.Transact(opts, method, params...)
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *ENSTransferIterator) Error() error {
+ return it.fail
}
-// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
-//
-// Solidity: function addr(node bytes32) constant returns(ret address)
-func (_Resolver *ResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) {
- var (
- ret0 = new(common.Address)
- )
- out := ret0
- err := _Resolver.contract.Call(opts, out, "addr", node)
- return *ret0, err
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ENSTransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
}
-// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
-//
-// Solidity: function addr(node bytes32) constant returns(ret address)
-func (_Resolver *ResolverSession) Addr(node [32]byte) (common.Address, error) {
- return _Resolver.Contract.Addr(&_Resolver.CallOpts, node)
+// ENSTransfer represents a Transfer event raised by the ENS contract.
+type ENSTransfer struct {
+ Node [32]byte
+ Owner common.Address
+ Raw types.Log // Blockchain specific contextual infos
}
-// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
+// FilterTransfer is a free log retrieval operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266.
//
-// Solidity: function addr(node bytes32) constant returns(ret address)
-func (_Resolver *ResolverCallerSession) Addr(node [32]byte) (common.Address, error) {
- return _Resolver.Contract.Addr(&_Resolver.CallOpts, node)
-}
+// Solidity: event Transfer(node indexed bytes32, owner address)
+func (_ENS *ENSFilterer) FilterTransfer(opts *bind.FilterOpts, node [][32]byte) (*ENSTransferIterator, error) {
-// Content is a free data retrieval call binding the contract method 0x2dff6941.
-//
-// Solidity: function content(node bytes32) constant returns(ret bytes32)
-func (_Resolver *ResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) {
- var (
- ret0 = new([32]byte)
- )
- out := ret0
- err := _Resolver.contract.Call(opts, out, "content", node)
- return *ret0, err
-}
-
-// Content is a free data retrieval call binding the contract method 0x2dff6941.
-//
-// Solidity: function content(node bytes32) constant returns(ret bytes32)
-func (_Resolver *ResolverSession) Content(node [32]byte) ([32]byte, error) {
- return _Resolver.Contract.Content(&_Resolver.CallOpts, node)
-}
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
-// Content is a free data retrieval call binding the contract method 0x2dff6941.
-//
-// Solidity: function content(node bytes32) constant returns(ret bytes32)
-func (_Resolver *ResolverCallerSession) Content(node [32]byte) ([32]byte, error) {
- return _Resolver.Contract.Content(&_Resolver.CallOpts, node)
+ logs, sub, err := _ENS.contract.FilterLogs(opts, "Transfer", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ENSTransferIterator{contract: _ENS.contract, event: "Transfer", logs: logs, sub: sub}, nil
}
-// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
+// WatchTransfer is a free log subscription operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266.
//
-// Solidity: function has(node bytes32, kind bytes32) returns(bool)
-func (_Resolver *ResolverTransactor) Has(opts *bind.TransactOpts, node [32]byte, kind [32]byte) (*types.Transaction, error) {
- return _Resolver.contract.Transact(opts, "has", node, kind)
-}
+// Solidity: event Transfer(node indexed bytes32, owner address)
+func (_ENS *ENSFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ENSTransfer, node [][32]byte) (event.Subscription, error) {
-// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
-//
-// Solidity: function has(node bytes32, kind bytes32) returns(bool)
-func (_Resolver *ResolverSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
- return _Resolver.Contract.Has(&_Resolver.TransactOpts, node, kind)
-}
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
-// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
-//
-// Solidity: function has(node bytes32, kind bytes32) returns(bool)
-func (_Resolver *ResolverTransactorSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
- return _Resolver.Contract.Has(&_Resolver.TransactOpts, node, kind)
+ logs, sub, err := _ENS.contract.WatchLogs(opts, "Transfer", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(ENSTransfer)
+ if err := _ENS.contract.UnpackLog(event, "Transfer", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
}
diff --git a/contracts/ens/contract/ens.sol b/contracts/ens/contract/ens.sol
deleted file mode 100644
index 114cd7319..000000000
--- a/contracts/ens/contract/ens.sol
+++ /dev/null
@@ -1,226 +0,0 @@
-// Ethereum Name Service contracts by Nick Johnson <nick@ethereum.org>
-//
-// To the extent possible under law, the person who associated CC0 with
-// ENS contracts has waived all copyright and related or neighboring rights
-// to ENS.
-//
-// You should have received a copy of the CC0 legalcode along with this
-// work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
-
-/**
- * The ENS registry contract.
- */
-contract ENS {
- struct Record {
- address owner;
- address resolver;
- }
-
- mapping(bytes32=>Record) records;
-
- // Logged when the owner of a node assigns a new owner to a subnode.
- event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
-
- // Logged when the owner of a node transfers ownership to a new account.
- event Transfer(bytes32 indexed node, address owner);
-
- // Logged when the owner of a node changes the resolver for that node.
- event NewResolver(bytes32 indexed node, address resolver);
-
- // Permits modifications only by the owner of the specified node.
- modifier only_owner(bytes32 node) {
- if(records[node].owner != msg.sender) throw;
- _
- }
-
- /**
- * Constructs a new ENS registrar, with the provided address as the owner of the root node.
- */
- function ENS(address owner) {
- records[0].owner = owner;
- }
-
- /**
- * Returns the address that owns the specified node.
- */
- function owner(bytes32 node) constant returns (address) {
- return records[node].owner;
- }
-
- /**
- * Returns the address of the resolver for the specified node.
- */
- function resolver(bytes32 node) constant returns (address) {
- return records[node].resolver;
- }
-
- /**
- * Transfers ownership of a node to a new address. May only be called by the current
- * owner of the node.
- * @param node The node to transfer ownership of.
- * @param owner The address of the new owner.
- */
- function setOwner(bytes32 node, address owner) only_owner(node) {
- Transfer(node, owner);
- records[node].owner = owner;
- }
-
- /**
- * Transfers ownership of a subnode sha3(node, label) to a new address. May only be
- * called by the owner of the parent node.
- * @param node The parent node.
- * @param label The hash of the label specifying the subnode.
- * @param owner The address of the new owner.
- */
- function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) {
- var subnode = sha3(node, label);
- NewOwner(node, label, owner);
- records[subnode].owner = owner;
- }
-
- /**
- * Sets the resolver address for the specified node.
- * @param node The node to update.
- * @param resolver The address of the resolver.
- */
- function setResolver(bytes32 node, address resolver) only_owner(node) {
- NewResolver(node, resolver);
- records[node].resolver = resolver;
- }
-}
-
-/**
- * A registrar that allocates subdomains to the first person to claim them. It also deploys
- * a simple resolver contract and sets that as the default resolver on new names for
- * convenience.
- */
-contract FIFSRegistrar {
- ENS ens;
- PublicResolver defaultResolver;
- bytes32 rootNode;
-
- /**
- * Constructor.
- * @param ensAddr The address of the ENS registry.
- * @param node The node that this registrar administers.
- */
- function FIFSRegistrar(address ensAddr, bytes32 node) {
- ens = ENS(ensAddr);
- defaultResolver = new PublicResolver(ensAddr);
- rootNode = node;
- }
-
- /**
- * Register a name, or change the owner of an existing registration.
- * @param subnode The hash of the label to register.
- * @param owner The address of the new owner.
- */
- function register(bytes32 subnode, address owner) {
- var node = sha3(rootNode, subnode);
- var currentOwner = ens.owner(node);
- if(currentOwner != 0 && currentOwner != msg.sender)
- throw;
-
- // Temporarily set ourselves as the owner
- ens.setSubnodeOwner(rootNode, subnode, this);
- // Set up the default resolver
- ens.setResolver(node, defaultResolver);
- // Set the owner to the real owner
- ens.setOwner(node, owner);
- }
-}
-
-contract Resolver {
- event AddrChanged(bytes32 indexed node, address a);
- event ContentChanged(bytes32 indexed node, bytes32 hash);
-
- function has(bytes32 node, bytes32 kind) returns (bool);
- function addr(bytes32 node) constant returns (address ret);
- function content(bytes32 node) constant returns (bytes32 ret);
-}
-
-/**
- * A simple resolver anyone can use; only allows the owner of a node to set its
- * address.
- */
-contract PublicResolver is Resolver {
- ENS ens;
- mapping(bytes32=>address) addresses;
- mapping(bytes32=>bytes32) contents;
-
- modifier only_owner(bytes32 node) {
- if(ens.owner(node) != msg.sender) throw;
- _
- }
-
- /**
- * Constructor.
- * @param ensAddr The ENS registrar contract.
- */
- function PublicResolver(address ensAddr) {
- ens = ENS(ensAddr);
- }
-
- /**
- * Fallback function.
- */
- function() {
- throw;
- }
-
- /**
- * Returns true if the specified node has the specified record type.
- * @param node The ENS node to query.
- * @param kind The record type name, as specified in EIP137.
- * @return True if this resolver has a record of the provided type on the
- * provided node.
- */
- function has(bytes32 node, bytes32 kind) returns (bool) {
- return (kind == "addr" && addresses[node] != 0) ||
- (kind == "content" && contents[node] != 0);
- }
-
- /**
- * Returns the address associated with an ENS node.
- * @param node The ENS node to query.
- * @return The associated address.
- */
- function addr(bytes32 node) constant returns (address ret) {
- ret = addresses[node];
- if(ret == 0)
- throw;
- }
-
- /**
- * Returns the content hash associated with an ENS node.
- * @param node The ENS node to query.
- * @return The associated content hash.
- */
- function content(bytes32 node) constant returns (bytes32 ret) {
- ret = contents[node];
- if(ret == 0)
- throw;
- }
-
- /**
- * Sets the address associated with an ENS node.
- * May only be called by the owner of that node in the ENS registry.
- * @param node The node to update.
- * @param addr The address to set.
- */
- function setAddr(bytes32 node, address addr) only_owner(node) {
- addresses[node] = addr;
- AddrChanged(node, addr);
- }
-
- /**
- * Sets the content hash associated with an ENS node.
- * May only be called by the owner of that node in the ENS registry.
- * @param node The node to update.
- * @param hash The content hash to set.
- */
- function setContent(bytes32 node, bytes32 hash) only_owner(node) {
- contents[node] = hash;
- ContentChanged(node, hash);
- }
-}
diff --git a/contracts/ens/contract/fifsregistrar.go b/contracts/ens/contract/fifsregistrar.go
new file mode 100644
index 000000000..a08380adf
--- /dev/null
+++ b/contracts/ens/contract/fifsregistrar.go
@@ -0,0 +1,195 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+import (
+ "strings"
+
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+)
+
+// FIFSRegistrarABI is the input ABI used to generate the binding from.
+const FIFSRegistrarABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"subnode\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"},{\"name\":\"node\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]"
+
+// FIFSRegistrarBin is the compiled bytecode used for deploying new contracts.
+const FIFSRegistrarBin = `0x6060604052341561000f57600080fd5b604051604080610224833981016040528080519190602001805160008054600160a060020a03909516600160a060020a03199095169490941790935550506001556101c58061005f6000396000f3006060604052600436106100275763ffffffff60e060020a600035041663d22057a9811461002c575b600080fd5b341561003757600080fd5b61004e600435600160a060020a0360243516610050565b005b816000806001548360405191825260208201526040908101905190819003902060008054919350600160a060020a03909116906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156100c857600080fd5b6102c65a03f115156100d957600080fd5b5050506040518051915050600160a060020a0381161580159061010e575033600160a060020a031681600160a060020a031614155b1561011857600080fd5b600054600154600160a060020a03909116906306ab592390878760405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561017e57600080fd5b6102c65a03f1151561018f57600080fd5b50505050505050505600a165627a7a723058206fb963cb168d5e3a51af12cd6bb23e324dbd32dd4954f43653ba27e66b68ea650029`
+
+// DeployFIFSRegistrar deploys a new Ethereum contract, binding an instance of FIFSRegistrar to it.
+func DeployFIFSRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address, node [32]byte) (common.Address, *types.Transaction, *FIFSRegistrar, error) {
+ parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(FIFSRegistrarBin), backend, ensAddr, node)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}, FIFSRegistrarFilterer: FIFSRegistrarFilterer{contract: contract}}, nil
+}
+
+// FIFSRegistrar is an auto generated Go binding around an Ethereum contract.
+type FIFSRegistrar struct {
+ FIFSRegistrarCaller // Read-only binding to the contract
+ FIFSRegistrarTransactor // Write-only binding to the contract
+ FIFSRegistrarFilterer // Log filterer for contract events
+}
+
+// FIFSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
+type FIFSRegistrarCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FIFSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type FIFSRegistrarTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FIFSRegistrarFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type FIFSRegistrarFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FIFSRegistrarSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type FIFSRegistrarSession struct {
+ Contract *FIFSRegistrar // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// FIFSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type FIFSRegistrarCallerSession struct {
+ Contract *FIFSRegistrarCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// FIFSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type FIFSRegistrarTransactorSession struct {
+ Contract *FIFSRegistrarTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// FIFSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
+type FIFSRegistrarRaw struct {
+ Contract *FIFSRegistrar // Generic contract binding to access the raw methods on
+}
+
+// FIFSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type FIFSRegistrarCallerRaw struct {
+ Contract *FIFSRegistrarCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// FIFSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type FIFSRegistrarTransactorRaw struct {
+ Contract *FIFSRegistrarTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewFIFSRegistrar creates a new instance of FIFSRegistrar, bound to a specific deployed contract.
+func NewFIFSRegistrar(address common.Address, backend bind.ContractBackend) (*FIFSRegistrar, error) {
+ contract, err := bindFIFSRegistrar(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}, FIFSRegistrarFilterer: FIFSRegistrarFilterer{contract: contract}}, nil
+}
+
+// NewFIFSRegistrarCaller creates a new read-only instance of FIFSRegistrar, bound to a specific deployed contract.
+func NewFIFSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*FIFSRegistrarCaller, error) {
+ contract, err := bindFIFSRegistrar(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &FIFSRegistrarCaller{contract: contract}, nil
+}
+
+// NewFIFSRegistrarTransactor creates a new write-only instance of FIFSRegistrar, bound to a specific deployed contract.
+func NewFIFSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*FIFSRegistrarTransactor, error) {
+ contract, err := bindFIFSRegistrar(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &FIFSRegistrarTransactor{contract: contract}, nil
+}
+
+// NewFIFSRegistrarFilterer creates a new log filterer instance of FIFSRegistrar, bound to a specific deployed contract.
+func NewFIFSRegistrarFilterer(address common.Address, filterer bind.ContractFilterer) (*FIFSRegistrarFilterer, error) {
+ contract, err := bindFIFSRegistrar(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &FIFSRegistrarFilterer{contract: contract}, nil
+}
+
+// bindFIFSRegistrar binds a generic wrapper to an already deployed contract.
+func bindFIFSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_FIFSRegistrar *FIFSRegistrarRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
+ return _FIFSRegistrar.Contract.FIFSRegistrarCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_FIFSRegistrar *FIFSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_FIFSRegistrar *FIFSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_FIFSRegistrar *FIFSRegistrarCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
+ return _FIFSRegistrar.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _FIFSRegistrar.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _FIFSRegistrar.Contract.contract.Transact(opts, method, params...)
+}
+
+// Register is a paid mutator transaction binding the contract method 0xd22057a9.
+//
+// Solidity: function register(subnode bytes32, owner address) returns()
+func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, subnode [32]byte, owner common.Address) (*types.Transaction, error) {
+ return _FIFSRegistrar.contract.Transact(opts, "register", subnode, owner)
+}
+
+// Register is a paid mutator transaction binding the contract method 0xd22057a9.
+//
+// Solidity: function register(subnode bytes32, owner address) returns()
+func (_FIFSRegistrar *FIFSRegistrarSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
+ return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
+}
+
+// Register is a paid mutator transaction binding the contract method 0xd22057a9.
+//
+// Solidity: function register(subnode bytes32, owner address) returns()
+func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
+ return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
+}
diff --git a/contracts/ens/contract/publicresolver.go b/contracts/ens/contract/publicresolver.go
new file mode 100644
index 000000000..c567d5884
--- /dev/null
+++ b/contracts/ens/contract/publicresolver.go
@@ -0,0 +1,1321 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+import (
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// PublicResolverABI is the input ABI used to generate the binding from.
+const PublicResolverABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"setText\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"contentTypes\",\"type\":\"uint256\"}],\"name\":\"ABI\",\"outputs\":[{\"name\":\"contentType\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"x\",\"type\":\"bytes32\"},{\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"setPubkey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"content\",\"outputs\":[{\"name\":\"ret\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"addr\",\"outputs\":[{\"name\":\"ret\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"text\",\"outputs\":[{\"name\":\"ret\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"contentType\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"setABI\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"name\",\"outputs\":[{\"name\":\"ret\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"setContent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"pubkey\",\"outputs\":[{\"name\":\"x\",\"type\":\"bytes32\"},{\"name\":\"y\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setAddr\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"address\"}],\"name\":\"AddrChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"ContentChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NameChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"contentType\",\"type\":\"uint256\"}],\"name\":\"ABIChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"x\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"PubkeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"key\",\"type\":\"string\"}],\"name\":\"TextChanged\",\"type\":\"event\"}]"
+
+// PublicResolverBin is the compiled bytecode used for deploying new contracts.
+const PublicResolverBin = `0x6060604052341561000f57600080fd5b6040516020806111b28339810160405280805160008054600160a060020a03909216600160a060020a0319909216919091179055505061115e806100546000396000f3006060604052600436106100ab5763ffffffff60e060020a60003504166301ffc9a781146100b057806310f13a8c146100e45780632203ab561461017e57806329cd62ea146102155780632dff6941146102315780633b3b57de1461025957806359d1d43c1461028b578063623195b014610358578063691f3431146103b457806377372213146103ca578063c3d014d614610420578063c869023314610439578063d5fa2b0014610467575b600080fd5b34156100bb57600080fd5b6100d0600160e060020a031960043516610489565b604051901515815260200160405180910390f35b34156100ef57600080fd5b61017c600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506105f695505050505050565b005b341561018957600080fd5b610197600435602435610807565b60405182815260406020820181815290820183818151815260200191508051906020019080838360005b838110156101d95780820151838201526020016101c1565b50505050905090810190601f1680156102065780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561022057600080fd5b61017c600435602435604435610931565b341561023c57600080fd5b610247600435610a30565b60405190815260200160405180910390f35b341561026457600080fd5b61026f600435610a46565b604051600160a060020a03909116815260200160405180910390f35b341561029657600080fd5b6102e1600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610a6195505050505050565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561031d578082015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036357600080fd5b61017c600480359060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610b8095505050505050565b34156103bf57600080fd5b6102e1600435610c7c565b34156103d557600080fd5b61017c600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610d4295505050505050565b341561042b57600080fd5b61017c600435602435610e8c565b341561044457600080fd5b61044f600435610f65565b60405191825260208201526040908101905180910390f35b341561047257600080fd5b61017c600435600160a060020a0360243516610f82565b6000600160e060020a031982167f3b3b57de0000000000000000000000000000000000000000000000000000000014806104ec5750600160e060020a031982167fd8389dc500000000000000000000000000000000000000000000000000000000145b806105205750600160e060020a031982167f691f343100000000000000000000000000000000000000000000000000000000145b806105545750600160e060020a031982167f2203ab5600000000000000000000000000000000000000000000000000000000145b806105885750600160e060020a031982167fc869023300000000000000000000000000000000000000000000000000000000145b806105bc5750600160e060020a031982167f59d1d43c00000000000000000000000000000000000000000000000000000000145b806105f05750600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561064f57600080fd5b6102c65a03f1151561066057600080fd5b50505060405180519050600160a060020a031614151561067f57600080fd5b6000848152600160205260409081902083916005909101908590518082805190602001908083835b602083106106c65780518252601f1990920191602091820191016106a7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090805161070a929160200190611085565b50826040518082805190602001908083835b6020831061073b5780518252601f19909201916020918201910161071c565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051908190039020847fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508560405160208082528190810183818151815260200191508051906020019080838360005b838110156107c75780820151838201526020016107af565b50505050905090810190601f1680156107f45780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b6000610811611103565b60008481526001602081905260409091209092505b838311610924578284161580159061085f5750600083815260068201602052604081205460026000196101006001841615020190911604115b15610919578060060160008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561090d5780601f106108e25761010080835404028352916020019161090d565b820191906000526020600020905b8154815290600101906020018083116108f057829003601f168201915b50505050509150610929565b600290920291610826565b600092505b509250929050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561098a57600080fd5b6102c65a03f1151561099b57600080fd5b50505060405180519050600160a060020a03161415156109ba57600080fd5b6040805190810160409081528482526020808301859052600087815260019091522060030181518155602082015160019091015550837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46848460405191825260208201526040908101905180910390a250505050565b6000908152600160208190526040909120015490565b600090815260016020526040902054600160a060020a031690565b610a69611103565b60008381526001602052604090819020600501908390518082805190602001908083835b60208310610aac5780518252601f199092019160209182019101610a8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b735780601f10610b4857610100808354040283529160200191610b73565b820191906000526020600020905b815481529060010190602001808311610b5657829003601f168201915b5050505050905092915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610bd957600080fd5b6102c65a03f11515610bea57600080fd5b50505060405180519050600160a060020a0316141515610c0957600080fd5b6000198301831615610c1a57600080fd5b60008481526001602090815260408083208684526006019091529020828051610c47929160200190611085565b5082847faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a350505050565b610c84611103565b6001600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b50505050509050919050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610d9b57600080fd5b6102c65a03f11515610dac57600080fd5b50505060405180519050600160a060020a0316141515610dcb57600080fd5b6000838152600160205260409020600201828051610ded929160200190611085565b50827fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78360405160208082528190810183818151815260200191508051906020019080838360005b83811015610e4d578082015183820152602001610e35565b50505050905090810190601f168015610e7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610ee557600080fd5b6102c65a03f11515610ef657600080fd5b50505060405180519050600160a060020a0316141515610f1557600080fd5b6000838152600160208190526040918290200183905583907f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc9084905190815260200160405180910390a2505050565b600090815260016020526040902060038101546004909101549091565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610fdb57600080fd5b6102c65a03f11515610fec57600080fd5b50505060405180519050600160a060020a031614151561100b57600080fd5b60008381526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851617905583907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd290849051600160a060020a03909116815260200160405180910390a2505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110c657805160ff19168380011785556110f3565b828001600101855582156110f3579182015b828111156110f35782518255916020019190600101906110d8565b506110ff929150611115565b5090565b60206040519081016040526000815290565b61112f91905b808211156110ff576000815560010161111b565b905600a165627a7a723058201ecacbc445b9fbcd91b0ab164389f69d7283b856883bc7437eeed1008345a4920029`
+
+// DeployPublicResolver deploys a new Ethereum contract, binding an instance of PublicResolver to it.
+func DeployPublicResolver(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address) (common.Address, *types.Transaction, *PublicResolver, error) {
+ parsed, err := abi.JSON(strings.NewReader(PublicResolverABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PublicResolverBin), backend, ensAddr)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}, PublicResolverFilterer: PublicResolverFilterer{contract: contract}}, nil
+}
+
+// PublicResolver is an auto generated Go binding around an Ethereum contract.
+type PublicResolver struct {
+ PublicResolverCaller // Read-only binding to the contract
+ PublicResolverTransactor // Write-only binding to the contract
+ PublicResolverFilterer // Log filterer for contract events
+}
+
+// PublicResolverCaller is an auto generated read-only Go binding around an Ethereum contract.
+type PublicResolverCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// PublicResolverTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type PublicResolverTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// PublicResolverFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type PublicResolverFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// PublicResolverSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type PublicResolverSession struct {
+ Contract *PublicResolver // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// PublicResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type PublicResolverCallerSession struct {
+ Contract *PublicResolverCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// PublicResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type PublicResolverTransactorSession struct {
+ Contract *PublicResolverTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// PublicResolverRaw is an auto generated low-level Go binding around an Ethereum contract.
+type PublicResolverRaw struct {
+ Contract *PublicResolver // Generic contract binding to access the raw methods on
+}
+
+// PublicResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type PublicResolverCallerRaw struct {
+ Contract *PublicResolverCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// PublicResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type PublicResolverTransactorRaw struct {
+ Contract *PublicResolverTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewPublicResolver creates a new instance of PublicResolver, bound to a specific deployed contract.
+func NewPublicResolver(address common.Address, backend bind.ContractBackend) (*PublicResolver, error) {
+ contract, err := bindPublicResolver(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}, PublicResolverFilterer: PublicResolverFilterer{contract: contract}}, nil
+}
+
+// NewPublicResolverCaller creates a new read-only instance of PublicResolver, bound to a specific deployed contract.
+func NewPublicResolverCaller(address common.Address, caller bind.ContractCaller) (*PublicResolverCaller, error) {
+ contract, err := bindPublicResolver(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverCaller{contract: contract}, nil
+}
+
+// NewPublicResolverTransactor creates a new write-only instance of PublicResolver, bound to a specific deployed contract.
+func NewPublicResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*PublicResolverTransactor, error) {
+ contract, err := bindPublicResolver(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverTransactor{contract: contract}, nil
+}
+
+// NewPublicResolverFilterer creates a new log filterer instance of PublicResolver, bound to a specific deployed contract.
+func NewPublicResolverFilterer(address common.Address, filterer bind.ContractFilterer) (*PublicResolverFilterer, error) {
+ contract, err := bindPublicResolver(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverFilterer{contract: contract}, nil
+}
+
+// bindPublicResolver binds a generic wrapper to an already deployed contract.
+func bindPublicResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(PublicResolverABI))
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_PublicResolver *PublicResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
+ return _PublicResolver.Contract.PublicResolverCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_PublicResolver *PublicResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _PublicResolver.Contract.PublicResolverTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_PublicResolver *PublicResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _PublicResolver.Contract.PublicResolverTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_PublicResolver *PublicResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
+ return _PublicResolver.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_PublicResolver *PublicResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _PublicResolver.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_PublicResolver *PublicResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _PublicResolver.Contract.contract.Transact(opts, method, params...)
+}
+
+// ABI is a free data retrieval call binding the contract method 0x2203ab56.
+//
+// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes)
+func (_PublicResolver *PublicResolverCaller) ABI(opts *bind.CallOpts, node [32]byte, contentTypes *big.Int) (struct {
+ ContentType *big.Int
+ Data []byte
+}, error) {
+ ret := new(struct {
+ ContentType *big.Int
+ Data []byte
+ })
+ out := ret
+ err := _PublicResolver.contract.Call(opts, out, "ABI", node, contentTypes)
+ return *ret, err
+}
+
+// ABI is a free data retrieval call binding the contract method 0x2203ab56.
+//
+// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes)
+func (_PublicResolver *PublicResolverSession) ABI(node [32]byte, contentTypes *big.Int) (struct {
+ ContentType *big.Int
+ Data []byte
+}, error) {
+ return _PublicResolver.Contract.ABI(&_PublicResolver.CallOpts, node, contentTypes)
+}
+
+// ABI is a free data retrieval call binding the contract method 0x2203ab56.
+//
+// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes)
+func (_PublicResolver *PublicResolverCallerSession) ABI(node [32]byte, contentTypes *big.Int) (struct {
+ ContentType *big.Int
+ Data []byte
+}, error) {
+ return _PublicResolver.Contract.ABI(&_PublicResolver.CallOpts, node, contentTypes)
+}
+
+// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
+//
+// Solidity: function addr(node bytes32) constant returns(ret address)
+func (_PublicResolver *PublicResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := ret0
+ err := _PublicResolver.contract.Call(opts, out, "addr", node)
+ return *ret0, err
+}
+
+// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
+//
+// Solidity: function addr(node bytes32) constant returns(ret address)
+func (_PublicResolver *PublicResolverSession) Addr(node [32]byte) (common.Address, error) {
+ return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node)
+}
+
+// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
+//
+// Solidity: function addr(node bytes32) constant returns(ret address)
+func (_PublicResolver *PublicResolverCallerSession) Addr(node [32]byte) (common.Address, error) {
+ return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node)
+}
+
+// Content is a free data retrieval call binding the contract method 0x2dff6941.
+//
+// Solidity: function content(node bytes32) constant returns(ret bytes32)
+func (_PublicResolver *PublicResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) {
+ var (
+ ret0 = new([32]byte)
+ )
+ out := ret0
+ err := _PublicResolver.contract.Call(opts, out, "content", node)
+ return *ret0, err
+}
+
+// Content is a free data retrieval call binding the contract method 0x2dff6941.
+//
+// Solidity: function content(node bytes32) constant returns(ret bytes32)
+func (_PublicResolver *PublicResolverSession) Content(node [32]byte) ([32]byte, error) {
+ return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node)
+}
+
+// Content is a free data retrieval call binding the contract method 0x2dff6941.
+//
+// Solidity: function content(node bytes32) constant returns(ret bytes32)
+func (_PublicResolver *PublicResolverCallerSession) Content(node [32]byte) ([32]byte, error) {
+ return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node)
+}
+
+// Name is a free data retrieval call binding the contract method 0x691f3431.
+//
+// Solidity: function name(node bytes32) constant returns(ret string)
+func (_PublicResolver *PublicResolverCaller) Name(opts *bind.CallOpts, node [32]byte) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := ret0
+ err := _PublicResolver.contract.Call(opts, out, "name", node)
+ return *ret0, err
+}
+
+// Name is a free data retrieval call binding the contract method 0x691f3431.
+//
+// Solidity: function name(node bytes32) constant returns(ret string)
+func (_PublicResolver *PublicResolverSession) Name(node [32]byte) (string, error) {
+ return _PublicResolver.Contract.Name(&_PublicResolver.CallOpts, node)
+}
+
+// Name is a free data retrieval call binding the contract method 0x691f3431.
+//
+// Solidity: function name(node bytes32) constant returns(ret string)
+func (_PublicResolver *PublicResolverCallerSession) Name(node [32]byte) (string, error) {
+ return _PublicResolver.Contract.Name(&_PublicResolver.CallOpts, node)
+}
+
+// Pubkey is a free data retrieval call binding the contract method 0xc8690233.
+//
+// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32)
+func (_PublicResolver *PublicResolverCaller) Pubkey(opts *bind.CallOpts, node [32]byte) (struct {
+ X [32]byte
+ Y [32]byte
+}, error) {
+ ret := new(struct {
+ X [32]byte
+ Y [32]byte
+ })
+ out := ret
+ err := _PublicResolver.contract.Call(opts, out, "pubkey", node)
+ return *ret, err
+}
+
+// Pubkey is a free data retrieval call binding the contract method 0xc8690233.
+//
+// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32)
+func (_PublicResolver *PublicResolverSession) Pubkey(node [32]byte) (struct {
+ X [32]byte
+ Y [32]byte
+}, error) {
+ return _PublicResolver.Contract.Pubkey(&_PublicResolver.CallOpts, node)
+}
+
+// Pubkey is a free data retrieval call binding the contract method 0xc8690233.
+//
+// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32)
+func (_PublicResolver *PublicResolverCallerSession) Pubkey(node [32]byte) (struct {
+ X [32]byte
+ Y [32]byte
+}, error) {
+ return _PublicResolver.Contract.Pubkey(&_PublicResolver.CallOpts, node)
+}
+
+// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
+//
+// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool)
+func (_PublicResolver *PublicResolverCaller) SupportsInterface(opts *bind.CallOpts, interfaceID [4]byte) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := ret0
+ err := _PublicResolver.contract.Call(opts, out, "supportsInterface", interfaceID)
+ return *ret0, err
+}
+
+// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
+//
+// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool)
+func (_PublicResolver *PublicResolverSession) SupportsInterface(interfaceID [4]byte) (bool, error) {
+ return _PublicResolver.Contract.SupportsInterface(&_PublicResolver.CallOpts, interfaceID)
+}
+
+// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
+//
+// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool)
+func (_PublicResolver *PublicResolverCallerSession) SupportsInterface(interfaceID [4]byte) (bool, error) {
+ return _PublicResolver.Contract.SupportsInterface(&_PublicResolver.CallOpts, interfaceID)
+}
+
+// Text is a free data retrieval call binding the contract method 0x59d1d43c.
+//
+// Solidity: function text(node bytes32, key string) constant returns(ret string)
+func (_PublicResolver *PublicResolverCaller) Text(opts *bind.CallOpts, node [32]byte, key string) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := ret0
+ err := _PublicResolver.contract.Call(opts, out, "text", node, key)
+ return *ret0, err
+}
+
+// Text is a free data retrieval call binding the contract method 0x59d1d43c.
+//
+// Solidity: function text(node bytes32, key string) constant returns(ret string)
+func (_PublicResolver *PublicResolverSession) Text(node [32]byte, key string) (string, error) {
+ return _PublicResolver.Contract.Text(&_PublicResolver.CallOpts, node, key)
+}
+
+// Text is a free data retrieval call binding the contract method 0x59d1d43c.
+//
+// Solidity: function text(node bytes32, key string) constant returns(ret string)
+func (_PublicResolver *PublicResolverCallerSession) Text(node [32]byte, key string) (string, error) {
+ return _PublicResolver.Contract.Text(&_PublicResolver.CallOpts, node, key)
+}
+
+// SetABI is a paid mutator transaction binding the contract method 0x623195b0.
+//
+// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns()
+func (_PublicResolver *PublicResolverTransactor) SetABI(opts *bind.TransactOpts, node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) {
+ return _PublicResolver.contract.Transact(opts, "setABI", node, contentType, data)
+}
+
+// SetABI is a paid mutator transaction binding the contract method 0x623195b0.
+//
+// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns()
+func (_PublicResolver *PublicResolverSession) SetABI(node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetABI(&_PublicResolver.TransactOpts, node, contentType, data)
+}
+
+// SetABI is a paid mutator transaction binding the contract method 0x623195b0.
+//
+// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns()
+func (_PublicResolver *PublicResolverTransactorSession) SetABI(node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetABI(&_PublicResolver.TransactOpts, node, contentType, data)
+}
+
+// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
+//
+// Solidity: function setAddr(node bytes32, addr address) returns()
+func (_PublicResolver *PublicResolverTransactor) SetAddr(opts *bind.TransactOpts, node [32]byte, addr common.Address) (*types.Transaction, error) {
+ return _PublicResolver.contract.Transact(opts, "setAddr", node, addr)
+}
+
+// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
+//
+// Solidity: function setAddr(node bytes32, addr address) returns()
+func (_PublicResolver *PublicResolverSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr)
+}
+
+// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
+//
+// Solidity: function setAddr(node bytes32, addr address) returns()
+func (_PublicResolver *PublicResolverTransactorSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr)
+}
+
+// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
+//
+// Solidity: function setContent(node bytes32, hash bytes32) returns()
+func (_PublicResolver *PublicResolverTransactor) SetContent(opts *bind.TransactOpts, node [32]byte, hash [32]byte) (*types.Transaction, error) {
+ return _PublicResolver.contract.Transact(opts, "setContent", node, hash)
+}
+
+// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
+//
+// Solidity: function setContent(node bytes32, hash bytes32) returns()
+func (_PublicResolver *PublicResolverSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash)
+}
+
+// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
+//
+// Solidity: function setContent(node bytes32, hash bytes32) returns()
+func (_PublicResolver *PublicResolverTransactorSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash)
+}
+
+// SetName is a paid mutator transaction binding the contract method 0x77372213.
+//
+// Solidity: function setName(node bytes32, name string) returns()
+func (_PublicResolver *PublicResolverTransactor) SetName(opts *bind.TransactOpts, node [32]byte, name string) (*types.Transaction, error) {
+ return _PublicResolver.contract.Transact(opts, "setName", node, name)
+}
+
+// SetName is a paid mutator transaction binding the contract method 0x77372213.
+//
+// Solidity: function setName(node bytes32, name string) returns()
+func (_PublicResolver *PublicResolverSession) SetName(node [32]byte, name string) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetName(&_PublicResolver.TransactOpts, node, name)
+}
+
+// SetName is a paid mutator transaction binding the contract method 0x77372213.
+//
+// Solidity: function setName(node bytes32, name string) returns()
+func (_PublicResolver *PublicResolverTransactorSession) SetName(node [32]byte, name string) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetName(&_PublicResolver.TransactOpts, node, name)
+}
+
+// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea.
+//
+// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns()
+func (_PublicResolver *PublicResolverTransactor) SetPubkey(opts *bind.TransactOpts, node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) {
+ return _PublicResolver.contract.Transact(opts, "setPubkey", node, x, y)
+}
+
+// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea.
+//
+// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns()
+func (_PublicResolver *PublicResolverSession) SetPubkey(node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetPubkey(&_PublicResolver.TransactOpts, node, x, y)
+}
+
+// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea.
+//
+// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns()
+func (_PublicResolver *PublicResolverTransactorSession) SetPubkey(node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetPubkey(&_PublicResolver.TransactOpts, node, x, y)
+}
+
+// SetText is a paid mutator transaction binding the contract method 0x10f13a8c.
+//
+// Solidity: function setText(node bytes32, key string, value string) returns()
+func (_PublicResolver *PublicResolverTransactor) SetText(opts *bind.TransactOpts, node [32]byte, key string, value string) (*types.Transaction, error) {
+ return _PublicResolver.contract.Transact(opts, "setText", node, key, value)
+}
+
+// SetText is a paid mutator transaction binding the contract method 0x10f13a8c.
+//
+// Solidity: function setText(node bytes32, key string, value string) returns()
+func (_PublicResolver *PublicResolverSession) SetText(node [32]byte, key string, value string) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetText(&_PublicResolver.TransactOpts, node, key, value)
+}
+
+// SetText is a paid mutator transaction binding the contract method 0x10f13a8c.
+//
+// Solidity: function setText(node bytes32, key string, value string) returns()
+func (_PublicResolver *PublicResolverTransactorSession) SetText(node [32]byte, key string, value string) (*types.Transaction, error) {
+ return _PublicResolver.Contract.SetText(&_PublicResolver.TransactOpts, node, key, value)
+}
+
+// PublicResolverABIChangedIterator is returned from FilterABIChanged and is used to iterate over the raw logs and unpacked data for ABIChanged events raised by the PublicResolver contract.
+type PublicResolverABIChangedIterator struct {
+ Event *PublicResolverABIChanged // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *PublicResolverABIChangedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverABIChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverABIChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *PublicResolverABIChangedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *PublicResolverABIChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// PublicResolverABIChanged represents a ABIChanged event raised by the PublicResolver contract.
+type PublicResolverABIChanged struct {
+ Node [32]byte
+ ContentType *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterABIChanged is a free log retrieval operation binding the contract event 0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3.
+//
+// Solidity: event ABIChanged(node indexed bytes32, contentType indexed uint256)
+func (_PublicResolver *PublicResolverFilterer) FilterABIChanged(opts *bind.FilterOpts, node [][32]byte, contentType []*big.Int) (*PublicResolverABIChangedIterator, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+ var contentTypeRule []interface{}
+ for _, contentTypeItem := range contentType {
+ contentTypeRule = append(contentTypeRule, contentTypeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ABIChanged", nodeRule, contentTypeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverABIChangedIterator{contract: _PublicResolver.contract, event: "ABIChanged", logs: logs, sub: sub}, nil
+}
+
+// WatchABIChanged is a free log subscription operation binding the contract event 0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3.
+//
+// Solidity: event ABIChanged(node indexed bytes32, contentType indexed uint256)
+func (_PublicResolver *PublicResolverFilterer) WatchABIChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverABIChanged, node [][32]byte, contentType []*big.Int) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+ var contentTypeRule []interface{}
+ for _, contentTypeItem := range contentType {
+ contentTypeRule = append(contentTypeRule, contentTypeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ABIChanged", nodeRule, contentTypeRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(PublicResolverABIChanged)
+ if err := _PublicResolver.contract.UnpackLog(event, "ABIChanged", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// PublicResolverAddrChangedIterator is returned from FilterAddrChanged and is used to iterate over the raw logs and unpacked data for AddrChanged events raised by the PublicResolver contract.
+type PublicResolverAddrChangedIterator struct {
+ Event *PublicResolverAddrChanged // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *PublicResolverAddrChangedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverAddrChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverAddrChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *PublicResolverAddrChangedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *PublicResolverAddrChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// PublicResolverAddrChanged represents a AddrChanged event raised by the PublicResolver contract.
+type PublicResolverAddrChanged struct {
+ Node [32]byte
+ A common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterAddrChanged is a free log retrieval operation binding the contract event 0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2.
+//
+// Solidity: event AddrChanged(node indexed bytes32, a address)
+func (_PublicResolver *PublicResolverFilterer) FilterAddrChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverAddrChangedIterator, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "AddrChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverAddrChangedIterator{contract: _PublicResolver.contract, event: "AddrChanged", logs: logs, sub: sub}, nil
+}
+
+// WatchAddrChanged is a free log subscription operation binding the contract event 0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2.
+//
+// Solidity: event AddrChanged(node indexed bytes32, a address)
+func (_PublicResolver *PublicResolverFilterer) WatchAddrChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverAddrChanged, node [][32]byte) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "AddrChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(PublicResolverAddrChanged)
+ if err := _PublicResolver.contract.UnpackLog(event, "AddrChanged", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// PublicResolverContentChangedIterator is returned from FilterContentChanged and is used to iterate over the raw logs and unpacked data for ContentChanged events raised by the PublicResolver contract.
+type PublicResolverContentChangedIterator struct {
+ Event *PublicResolverContentChanged // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *PublicResolverContentChangedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverContentChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverContentChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *PublicResolverContentChangedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *PublicResolverContentChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// PublicResolverContentChanged represents a ContentChanged event raised by the PublicResolver contract.
+type PublicResolverContentChanged struct {
+ Node [32]byte
+ Hash [32]byte
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterContentChanged is a free log retrieval operation binding the contract event 0x0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc.
+//
+// Solidity: event ContentChanged(node indexed bytes32, hash bytes32)
+func (_PublicResolver *PublicResolverFilterer) FilterContentChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverContentChangedIterator, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ContentChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverContentChangedIterator{contract: _PublicResolver.contract, event: "ContentChanged", logs: logs, sub: sub}, nil
+}
+
+// WatchContentChanged is a free log subscription operation binding the contract event 0x0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc.
+//
+// Solidity: event ContentChanged(node indexed bytes32, hash bytes32)
+func (_PublicResolver *PublicResolverFilterer) WatchContentChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverContentChanged, node [][32]byte) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ContentChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(PublicResolverContentChanged)
+ if err := _PublicResolver.contract.UnpackLog(event, "ContentChanged", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// PublicResolverNameChangedIterator is returned from FilterNameChanged and is used to iterate over the raw logs and unpacked data for NameChanged events raised by the PublicResolver contract.
+type PublicResolverNameChangedIterator struct {
+ Event *PublicResolverNameChanged // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *PublicResolverNameChangedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverNameChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverNameChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *PublicResolverNameChangedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *PublicResolverNameChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// PublicResolverNameChanged represents a NameChanged event raised by the PublicResolver contract.
+type PublicResolverNameChanged struct {
+ Node [32]byte
+ Name string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterNameChanged is a free log retrieval operation binding the contract event 0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7.
+//
+// Solidity: event NameChanged(node indexed bytes32, name string)
+func (_PublicResolver *PublicResolverFilterer) FilterNameChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverNameChangedIterator, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "NameChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverNameChangedIterator{contract: _PublicResolver.contract, event: "NameChanged", logs: logs, sub: sub}, nil
+}
+
+// WatchNameChanged is a free log subscription operation binding the contract event 0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7.
+//
+// Solidity: event NameChanged(node indexed bytes32, name string)
+func (_PublicResolver *PublicResolverFilterer) WatchNameChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverNameChanged, node [][32]byte) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "NameChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(PublicResolverNameChanged)
+ if err := _PublicResolver.contract.UnpackLog(event, "NameChanged", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// PublicResolverPubkeyChangedIterator is returned from FilterPubkeyChanged and is used to iterate over the raw logs and unpacked data for PubkeyChanged events raised by the PublicResolver contract.
+type PublicResolverPubkeyChangedIterator struct {
+ Event *PublicResolverPubkeyChanged // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *PublicResolverPubkeyChangedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverPubkeyChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverPubkeyChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *PublicResolverPubkeyChangedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *PublicResolverPubkeyChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// PublicResolverPubkeyChanged represents a PubkeyChanged event raised by the PublicResolver contract.
+type PublicResolverPubkeyChanged struct {
+ Node [32]byte
+ X [32]byte
+ Y [32]byte
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterPubkeyChanged is a free log retrieval operation binding the contract event 0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46.
+//
+// Solidity: event PubkeyChanged(node indexed bytes32, x bytes32, y bytes32)
+func (_PublicResolver *PublicResolverFilterer) FilterPubkeyChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverPubkeyChangedIterator, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "PubkeyChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverPubkeyChangedIterator{contract: _PublicResolver.contract, event: "PubkeyChanged", logs: logs, sub: sub}, nil
+}
+
+// WatchPubkeyChanged is a free log subscription operation binding the contract event 0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46.
+//
+// Solidity: event PubkeyChanged(node indexed bytes32, x bytes32, y bytes32)
+func (_PublicResolver *PublicResolverFilterer) WatchPubkeyChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverPubkeyChanged, node [][32]byte) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "PubkeyChanged", nodeRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(PublicResolverPubkeyChanged)
+ if err := _PublicResolver.contract.UnpackLog(event, "PubkeyChanged", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// PublicResolverTextChangedIterator is returned from FilterTextChanged and is used to iterate over the raw logs and unpacked data for TextChanged events raised by the PublicResolver contract.
+type PublicResolverTextChangedIterator struct {
+ Event *PublicResolverTextChanged // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *PublicResolverTextChangedIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverTextChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(PublicResolverTextChanged)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error retruned any retrieval or parsing error occurred during filtering.
+func (it *PublicResolverTextChangedIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *PublicResolverTextChangedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// PublicResolverTextChanged represents a TextChanged event raised by the PublicResolver contract.
+type PublicResolverTextChanged struct {
+ Node [32]byte
+ IndexedKey common.Hash
+ Key string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTextChanged is a free log retrieval operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550.
+//
+// Solidity: event TextChanged(node indexed bytes32, indexedKey indexed string, key string)
+func (_PublicResolver *PublicResolverFilterer) FilterTextChanged(opts *bind.FilterOpts, node [][32]byte, indexedKey []string) (*PublicResolverTextChangedIterator, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+ var indexedKeyRule []interface{}
+ for _, indexedKeyItem := range indexedKey {
+ indexedKeyRule = append(indexedKeyRule, indexedKeyItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "TextChanged", nodeRule, indexedKeyRule)
+ if err != nil {
+ return nil, err
+ }
+ return &PublicResolverTextChangedIterator{contract: _PublicResolver.contract, event: "TextChanged", logs: logs, sub: sub}, nil
+}
+
+// WatchTextChanged is a free log subscription operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550.
+//
+// Solidity: event TextChanged(node indexed bytes32, indexedKey indexed string, key string)
+func (_PublicResolver *PublicResolverFilterer) WatchTextChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverTextChanged, node [][32]byte, indexedKey []string) (event.Subscription, error) {
+
+ var nodeRule []interface{}
+ for _, nodeItem := range node {
+ nodeRule = append(nodeRule, nodeItem)
+ }
+ var indexedKeyRule []interface{}
+ for _, indexedKeyItem := range indexedKey {
+ indexedKeyRule = append(indexedKeyRule, indexedKeyItem)
+ }
+
+ logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "TextChanged", nodeRule, indexedKeyRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(PublicResolverTextChanged)
+ if err := _PublicResolver.contract.UnpackLog(event, "TextChanged", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
diff --git a/contracts/ens/ens.go b/contracts/ens/ens.go
index c292a1714..06045a5cd 100644
--- a/contracts/ens/ens.go
+++ b/contracts/ens/ens.go
@@ -16,10 +16,11 @@
package ens
-//go:generate abigen --sol contract/ens.sol --pkg contract --out contract/ens.go
+//go:generate abigen --sol contract/ENS.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/ens.go
+//go:generate abigen --sol contract/FIFSRegistrar.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/fifsregistrar.go
+//go:generate abigen --sol contract/PublicResolver.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/publicresolver.go
import (
- "math/big"
"strings"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -58,31 +59,29 @@ func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contra
}
// DeployENS deploys an instance of the ENS nameservice, with a 'first-in, first-served' root registrar.
-func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (*ENS, error) {
- // Deploy the ENS registry
- ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend, transactOpts.From)
+func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) {
+ // Deploy the ENS registry.
+ ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend)
if err != nil {
- return nil, err
+ return ensAddr, nil, err
}
ens, err := NewENS(transactOpts, ensAddr, contractBackend)
if err != nil {
- return nil, err
+ return ensAddr, nil, err
}
- // Deploy the registrar
+ // Deploy the registrar.
regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{})
if err != nil {
- return nil, err
+ return ensAddr, nil, err
}
-
- // Set the registrar as owner of the ENS root
- _, err = ens.SetOwner([32]byte{}, regAddr)
- if err != nil {
- return nil, err
+ // Set the registrar as owner of the ENS root.
+ if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil {
+ return ensAddr, nil, err
}
- return ens, nil
+ return ensAddr, ens, nil
}
func ensParentNode(name string) (common.Hash, common.Hash) {
@@ -156,15 +155,11 @@ func (self *ENS) Resolve(name string) (common.Hash, error) {
// Only works if the registrar for the parent domain implements the FIFS registrar protocol.
func (self *ENS) Register(name string) (*types.Transaction, error) {
parentNode, label := ensParentNode(name)
-
registrar, err := self.getRegistrar(parentNode)
if err != nil {
return nil, err
}
-
- opts := self.TransactOpts
- opts.GasLimit = big.NewInt(200000)
- return registrar.Contract.Register(&opts, label, self.TransactOpts.From)
+ return registrar.Contract.Register(&self.TransactOpts, label, self.TransactOpts.From)
}
// SetContentHash sets the content hash associated with a name. Only works if the caller
@@ -178,6 +173,6 @@ func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transacti
}
opts := self.TransactOpts
- opts.GasLimit = big.NewInt(200000)
+ opts.GasLimit = 200000
return resolver.Contract.SetContent(&opts, node, hash)
}
diff --git a/contracts/ens/ens_test.go b/contracts/ens/ens_test.go
index 5faa9b1ad..0016f47db 100644
--- a/contracts/ens/ens_test.go
+++ b/contracts/ens/ens_test.go
@@ -22,6 +22,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
+ "github.com/ethereum/go-ethereum/contracts/ens/contract"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto"
)
@@ -36,27 +37,36 @@ var (
func TestENS(t *testing.T) {
contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}})
transactOpts := bind.NewKeyedTransactor(key)
- // Workaround for bug estimating gas in the call to Register
- transactOpts.GasLimit = big.NewInt(1000000)
- ens, err := DeployENS(transactOpts, contractBackend)
+ ensAddr, ens, err := DeployENS(transactOpts, contractBackend)
if err != nil {
- t.Fatalf("expected no error, got %v", err)
+ t.Fatalf("can't deploy root registry: %v", err)
}
contractBackend.Commit()
- _, err = ens.Register(name)
- if err != nil {
- t.Fatalf("expected no error, got %v", err)
+ // Set ourself as the owner of the name.
+ if _, err := ens.Register(name); err != nil {
+ t.Fatalf("can't register: %v", err)
}
contractBackend.Commit()
- _, err = ens.SetContentHash(name, hash)
+ // Deploy a resolver and make it responsible for the name.
+ resolverAddr, _, _, err := contract.DeployPublicResolver(transactOpts, contractBackend, ensAddr)
if err != nil {
- t.Fatalf("expected no error, got %v", err)
+ t.Fatalf("can't deploy resolver: %v", err)
+ }
+ if _, err := ens.SetResolver(ensNode(name), resolverAddr); err != nil {
+ t.Fatalf("can't set resolver: %v", err)
+ }
+ contractBackend.Commit()
+
+ // Set the content hash for the name.
+ if _, err = ens.SetContentHash(name, hash); err != nil {
+ t.Fatalf("can't set content hash: %v", err)
}
contractBackend.Commit()
+ // Try to resolve the name.
vhost, err := ens.Resolve(name)
if err != nil {
t.Fatalf("expected no error, got %v", err)
diff --git a/contracts/release/contract.go b/contracts/release/contract.go
deleted file mode 100644
index 6a0b09931..000000000
--- a/contracts/release/contract.go
+++ /dev/null
@@ -1,432 +0,0 @@
-// This file is an automatically generated Go binding. Do not modify as any
-// change will likely be lost upon the next re-generation!
-
-package release
-
-import (
- "math/big"
- "strings"
-
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
-)
-
-// ReleaseOracleABI is the input ABI used to generate the binding from.
-const ReleaseOracleABI = `[{"constant":true,"inputs":[],"name":"proposedVersion","outputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"pass","type":"address[]"},{"name":"fail","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[],"name":"signers","outputs":[{"name":"","type":"address[]"}],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"demote","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"authVotes","outputs":[{"name":"promote","type":"address[]"},{"name":"demote","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[],"name":"currentVersion","outputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"},{"name":"time","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[],"name":"nuke","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"authProposals","outputs":[{"name":"","type":"address[]"}],"type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"promote","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"major","type":"uint32"},{"name":"minor","type":"uint32"},{"name":"patch","type":"uint32"},{"name":"commit","type":"bytes20"}],"name":"release","outputs":[],"type":"function"},{"inputs":[{"name":"signers","type":"address[]"}],"type":"constructor"}]`
-
-// ReleaseOracleBin is the compiled bytecode used for deploying new contracts.
-const ReleaseOracleBin = `0x606060405260405161135338038061135383398101604052805101600081516000141561008457600160a060020a0333168152602081905260408120805460ff19166001908117909155805480820180835582818380158290116100ff576000838152602090206100ff9181019083015b8082111561012f5760008155600101610070565b5060005b815181101561011f5760016000600050600084848151811015610002576020908102909101810151600160a060020a03168252810191909152604001600020805460ff1916909117905560018054808201808355828183801582901161013357600083815260209020610133918101908301610070565b5050506000928352506020909120018054600160a060020a031916331790555b50506111df806101746000396000f35b5090565b50505091909060005260206000209001600084848151811015610002575050506020838102850101518154600160a060020a0319161790555060010161008856606060405236156100775760e060020a600035046326db7648811461007957806346f0975a1461019e5780635c3d005d1461020a57806364ed31fe146102935780639d888e861461038d578063bc8fbbf8146103b2578063bf8ecf9c146103fc578063d0e0813a14610468578063d67cbec914610479575b005b610496604080516020818101835260008083528351808301855281815260045460068054875181870281018701909852808852939687968796879691959463ffffffff818116956401000000008304821695604060020a840490921694606060020a938490049093029390926007929184919083018282801561012657602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610107575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561018357602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610164575b50505050509050955095509550955095509550909192939495565b6040805160208181018352600082526001805484518184028101840190955280855261055894928301828280156101ff57602002820191906000526020600020905b8154600160a060020a03168152600191909101906020018083116101e0575b505050505090505b90565b61007760043561066d8160005b600160a060020a033316600090815260208190526040812054819060ff161561070057600160a060020a038416815260026020526040812091505b8154811015610706578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a0316141561075157610700565b6105a26004356040805160208181018352600080835283518083018552818152600160a060020a038616825260028352908490208054855181850281018501909652808652939491939092600184019291849183018282801561032057602002820191906000526020600020905b8154600160a060020a0316815260019190910190602001808311610301575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561037d57602002820191906000526020600020905b8154600160a060020a031681526001919091019060200180831161035e575b5050505050905091509150915091565b61062760006000600060006000600060086000508054905060001415610670576106f1565b6100776106f96000808080805b600160a060020a033316600090815260208190526040812054819060ff16156111b657821580156103f257506006546000145b15610c2e576111b6565b6040805160208181018352600082526003805484518184028101840190955280855261055894928301828280156101ff57602002820191906000526020600020908154600160a060020a03168152600191909101906020018083116101e0575b50505050509050610207565b61007760043561066d816001610217565b6100776004356024356044356064356107008484848460016103bf565b604051808763ffffffff1681526020018663ffffffff1681526020018563ffffffff168152602001846bffffffffffffffffffffffff1916815260200180602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600302600f01f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600302600f01f1509050019850505050505050505060405180910390f35b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600302600f01f1509050019250505060405180910390f35b6040518080602001806020018381038352858181518152602001915080519060200190602002808383829060006004602084601f0104600302600f01f1509050018381038252848181518152602001915080519060200190602002808383829060006004602084601f0104600302600f01f15090500194505050505060405180910390f35b6040805163ffffffff9687168152948616602086015292909416838301526bffffffffffffffffffffffff19166060830152608082019290925290519081900360a00190f35b50565b600880546000198101908110156100025760009182526004027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190508054600182015463ffffffff8281169950640100000000830481169850604060020a8304169650606060020a91829004909102945067ffffffffffffffff16925090505b509091929394565b565b505050505b50505050565b5060005b60018201548110156107595733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a031614156107a357610700565b600101610252565b8154600014801561076e575060018201546000145b156107cb57600380546001810180835582818380158290116107ab578183600052602060002091820191016107ab9190610851565b60010161070a565b5050506000928352506020909120018054600160a060020a031916851790555b821561086957815460018101808455839190828183801582901161089e5760008381526020902061089e918101908301610851565b5050506000928352506020909120018054600160a060020a031916851790555b600160a060020a038416600090815260026020908152604082208054838255818452918320909291610b2f91908101905b808211156108655760008155600101610851565b5090565b816001016000508054806001018281815481835581811511610950578183600052602060002091820191016109509190610851565b5050506000928352506020909120018054600160a060020a031916331790556001548254600290910490116108d257610700565b8280156108f85750600160a060020a03841660009081526020819052604090205460ff16155b1561098757600160a060020a0384166000908152602081905260409020805460ff1916600190811790915580548082018083558281838015829011610800578183600052602060002091820191016108009190610851565b5050506000928352506020909120018054600160a060020a031916331790556001805490830154600290910490116108d257610700565b821580156109ad5750600160a060020a03841660009081526020819052604090205460ff165b156108205750600160a060020a0383166000908152602081905260408120805460ff191690555b6001548110156108205783600160a060020a0316600160005082815481101561000257600091825260209091200154600160a060020a03161415610aa357600180546000198101908110156100025760206000908120929052600180549290910154600160a060020a031691839081101561000257906000526020600020900160006101000a815481600160a060020a030219169083021790555060016000508054809190600190039090815481835581811511610aab57600083815260209020610aab918101908301610851565b6001016109d4565b5050600060048181556005805467ffffffffffffffff19169055600680548382558184529194509192508290610b05907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610851565b5060018201805460008083559182526020909120610b2591810190610851565b5050505050610820565b5060018201805460008083559182526020909120610b4f91810190610851565b506000925050505b6003548110156107005783600160a060020a0316600360005082815481101561000257600091825260209091200154600160a060020a03161415610c2657600380546000198101908110156100025760206000908120929052600380549290910154600160a060020a031691839081101561000257906000526020600020900160006101000a815481600160a060020a0302191690830217905550600360005080548091906001900390908154818355818115116106fb576000838152602090206106fb918101908301610851565b600101610b57565b60065460001415610c8c576004805463ffffffff1916881767ffffffff0000000019166401000000008802176bffffffff00000000000000001916604060020a8702176bffffffffffffffffffffffff16606060020a808704021790555b828015610d08575060045463ffffffff8881169116141580610cc1575060045463ffffffff8781166401000000009092041614155b80610cde575060045463ffffffff868116604060020a9092041614155b80610d085750600454606060020a90819004026bffffffffffffffffffffffff1990811690851614155b15610d12576111b6565b506006905060005b8154811015610d5b578154600160a060020a033316908390839081101561000257600091825260209091200154600160a060020a03161415610da6576111b6565b5060005b6001820154811015610dae5733600160a060020a03168260010160005082815481101561000257600091825260209091200154600160a060020a03161415610de3576111b6565b600101610d1a565b8215610deb578154600181018084558391908281838015829011610e2057600083815260209020610e20918101908301610851565b600101610d5f565b816001016000508054806001018281815481835581811511610ea357818360005260206000209182019101610ea39190610851565b5050506000928352506020909120018054600160a060020a03191633179055600154825460029091049011610e54576111b6565b8215610eda576005805467ffffffffffffffff19164217905560088054600181018083558281838015829011610f2f57600402816004028360005260206000209182019101610f2f9190611048565b5050506000928352506020909120018054600160a060020a03191633179055600180549083015460029091049011610e54576111b6565b600060048181556005805467ffffffffffffffff191690556006805483825581845291929182906111bf907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610851565b5050509190906000526020600020906004020160005060048054825463ffffffff191663ffffffff9182161780845582546401000000009081900483160267ffffffff000000001991909116178084558254604060020a908190049092169091026bffffffff00000000000000001991909116178083558154606060020a908190048102819004026bffffffffffffffffffffffff9190911617825560055460018301805467ffffffffffffffff191667ffffffffffffffff9092169190911790556006805460028401805482825560008281526020902094959491928392918201918582156110a75760005260206000209182015b828111156110a7578254825591600101919060010190611025565b505050506004015b8082111561086557600080825560018201805467ffffffffffffffff191690556002820180548282558183526020832083916110879190810190610851565b506001820180546000808355918252602090912061104091810190610851565b506110cd9291505b80821115610865578054600160a060020a03191681556001016110af565b505060018181018054918401805480835560008381526020902092938301929091821561111b5760005260206000209182015b8281111561111b578254825591600101919060010190611100565b506111279291506110af565b5050600060048181556005805467ffffffffffffffff191690556006805483825581845291975091955090935084925061118691507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90810190610851565b50600182018054600080835591825260209091206111a691810190610851565b50505050506111b6565b50505050505b50505050505050565b50600182018054600080835591825260209091206111b09181019061085156`
-
-// DeployReleaseOracle deploys a new Ethereum contract, binding an instance of ReleaseOracle to it.
-func DeployReleaseOracle(auth *bind.TransactOpts, backend bind.ContractBackend, signers []common.Address) (common.Address, *types.Transaction, *ReleaseOracle, error) {
- parsed, err := abi.JSON(strings.NewReader(ReleaseOracleABI))
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ReleaseOracleBin), backend, signers)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &ReleaseOracle{ReleaseOracleCaller: ReleaseOracleCaller{contract: contract}, ReleaseOracleTransactor: ReleaseOracleTransactor{contract: contract}}, nil
-}
-
-// ReleaseOracle is an auto generated Go binding around an Ethereum contract.
-type ReleaseOracle struct {
- ReleaseOracleCaller // Read-only binding to the contract
- ReleaseOracleTransactor // Write-only binding to the contract
-}
-
-// ReleaseOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
-type ReleaseOracleCaller struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// ReleaseOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type ReleaseOracleTransactor struct {
- contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// ReleaseOracleSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type ReleaseOracleSession struct {
- Contract *ReleaseOracle // Generic contract binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// ReleaseOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type ReleaseOracleCallerSession struct {
- Contract *ReleaseOracleCaller // Generic contract caller binding to set the session for
- CallOpts bind.CallOpts // Call options to use throughout this session
-}
-
-// ReleaseOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type ReleaseOracleTransactorSession struct {
- Contract *ReleaseOracleTransactor // Generic contract transactor binding to set the session for
- TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// ReleaseOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
-type ReleaseOracleRaw struct {
- Contract *ReleaseOracle // Generic contract binding to access the raw methods on
-}
-
-// ReleaseOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type ReleaseOracleCallerRaw struct {
- Contract *ReleaseOracleCaller // Generic read-only contract binding to access the raw methods on
-}
-
-// ReleaseOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type ReleaseOracleTransactorRaw struct {
- Contract *ReleaseOracleTransactor // Generic write-only contract binding to access the raw methods on
-}
-
-// NewReleaseOracle creates a new instance of ReleaseOracle, bound to a specific deployed contract.
-func NewReleaseOracle(address common.Address, backend bind.ContractBackend) (*ReleaseOracle, error) {
- contract, err := bindReleaseOracle(address, backend, backend)
- if err != nil {
- return nil, err
- }
- return &ReleaseOracle{ReleaseOracleCaller: ReleaseOracleCaller{contract: contract}, ReleaseOracleTransactor: ReleaseOracleTransactor{contract: contract}}, nil
-}
-
-// NewReleaseOracleCaller creates a new read-only instance of ReleaseOracle, bound to a specific deployed contract.
-func NewReleaseOracleCaller(address common.Address, caller bind.ContractCaller) (*ReleaseOracleCaller, error) {
- contract, err := bindReleaseOracle(address, caller, nil)
- if err != nil {
- return nil, err
- }
- return &ReleaseOracleCaller{contract: contract}, nil
-}
-
-// NewReleaseOracleTransactor creates a new write-only instance of ReleaseOracle, bound to a specific deployed contract.
-func NewReleaseOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*ReleaseOracleTransactor, error) {
- contract, err := bindReleaseOracle(address, nil, transactor)
- if err != nil {
- return nil, err
- }
- return &ReleaseOracleTransactor{contract: contract}, nil
-}
-
-// bindReleaseOracle binds a generic wrapper to an already deployed contract.
-func bindReleaseOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
- parsed, err := abi.JSON(strings.NewReader(ReleaseOracleABI))
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, parsed, caller, transactor), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_ReleaseOracle *ReleaseOracleRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _ReleaseOracle.Contract.ReleaseOracleCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_ReleaseOracle *ReleaseOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.ReleaseOracleTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_ReleaseOracle *ReleaseOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.ReleaseOracleTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_ReleaseOracle *ReleaseOracleCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
- return _ReleaseOracle.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_ReleaseOracle *ReleaseOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_ReleaseOracle *ReleaseOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.contract.Transact(opts, method, params...)
-}
-
-// AuthProposals is a free data retrieval call binding the contract method 0xbf8ecf9c.
-//
-// Solidity: function authProposals() constant returns(address[])
-func (_ReleaseOracle *ReleaseOracleCaller) AuthProposals(opts *bind.CallOpts) ([]common.Address, error) {
- var (
- ret0 = new([]common.Address)
- )
- out := ret0
- err := _ReleaseOracle.contract.Call(opts, out, "authProposals")
- return *ret0, err
-}
-
-// AuthProposals is a free data retrieval call binding the contract method 0xbf8ecf9c.
-//
-// Solidity: function authProposals() constant returns(address[])
-func (_ReleaseOracle *ReleaseOracleSession) AuthProposals() ([]common.Address, error) {
- return _ReleaseOracle.Contract.AuthProposals(&_ReleaseOracle.CallOpts)
-}
-
-// AuthProposals is a free data retrieval call binding the contract method 0xbf8ecf9c.
-//
-// Solidity: function authProposals() constant returns(address[])
-func (_ReleaseOracle *ReleaseOracleCallerSession) AuthProposals() ([]common.Address, error) {
- return _ReleaseOracle.Contract.AuthProposals(&_ReleaseOracle.CallOpts)
-}
-
-// AuthVotes is a free data retrieval call binding the contract method 0x64ed31fe.
-//
-// Solidity: function authVotes(user address) constant returns(promote address[], demote address[])
-func (_ReleaseOracle *ReleaseOracleCaller) AuthVotes(opts *bind.CallOpts, user common.Address) (struct {
- Promote []common.Address
- Demote []common.Address
-}, error) {
- ret := new(struct {
- Promote []common.Address
- Demote []common.Address
- })
- out := ret
- err := _ReleaseOracle.contract.Call(opts, out, "authVotes", user)
- return *ret, err
-}
-
-// AuthVotes is a free data retrieval call binding the contract method 0x64ed31fe.
-//
-// Solidity: function authVotes(user address) constant returns(promote address[], demote address[])
-func (_ReleaseOracle *ReleaseOracleSession) AuthVotes(user common.Address) (struct {
- Promote []common.Address
- Demote []common.Address
-}, error) {
- return _ReleaseOracle.Contract.AuthVotes(&_ReleaseOracle.CallOpts, user)
-}
-
-// AuthVotes is a free data retrieval call binding the contract method 0x64ed31fe.
-//
-// Solidity: function authVotes(user address) constant returns(promote address[], demote address[])
-func (_ReleaseOracle *ReleaseOracleCallerSession) AuthVotes(user common.Address) (struct {
- Promote []common.Address
- Demote []common.Address
-}, error) {
- return _ReleaseOracle.Contract.AuthVotes(&_ReleaseOracle.CallOpts, user)
-}
-
-// CurrentVersion is a free data retrieval call binding the contract method 0x9d888e86.
-//
-// Solidity: function currentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
-func (_ReleaseOracle *ReleaseOracleCaller) CurrentVersion(opts *bind.CallOpts) (struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Time *big.Int
-}, error) {
- ret := new(struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Time *big.Int
- })
- out := ret
- err := _ReleaseOracle.contract.Call(opts, out, "currentVersion")
- return *ret, err
-}
-
-// CurrentVersion is a free data retrieval call binding the contract method 0x9d888e86.
-//
-// Solidity: function currentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
-func (_ReleaseOracle *ReleaseOracleSession) CurrentVersion() (struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Time *big.Int
-}, error) {
- return _ReleaseOracle.Contract.CurrentVersion(&_ReleaseOracle.CallOpts)
-}
-
-// CurrentVersion is a free data retrieval call binding the contract method 0x9d888e86.
-//
-// Solidity: function currentVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, time uint256)
-func (_ReleaseOracle *ReleaseOracleCallerSession) CurrentVersion() (struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Time *big.Int
-}, error) {
- return _ReleaseOracle.Contract.CurrentVersion(&_ReleaseOracle.CallOpts)
-}
-
-// ProposedVersion is a free data retrieval call binding the contract method 0x26db7648.
-//
-// Solidity: function proposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
-func (_ReleaseOracle *ReleaseOracleCaller) ProposedVersion(opts *bind.CallOpts) (struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Pass []common.Address
- Fail []common.Address
-}, error) {
- ret := new(struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Pass []common.Address
- Fail []common.Address
- })
- out := ret
- err := _ReleaseOracle.contract.Call(opts, out, "proposedVersion")
- return *ret, err
-}
-
-// ProposedVersion is a free data retrieval call binding the contract method 0x26db7648.
-//
-// Solidity: function proposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
-func (_ReleaseOracle *ReleaseOracleSession) ProposedVersion() (struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Pass []common.Address
- Fail []common.Address
-}, error) {
- return _ReleaseOracle.Contract.ProposedVersion(&_ReleaseOracle.CallOpts)
-}
-
-// ProposedVersion is a free data retrieval call binding the contract method 0x26db7648.
-//
-// Solidity: function proposedVersion() constant returns(major uint32, minor uint32, patch uint32, commit bytes20, pass address[], fail address[])
-func (_ReleaseOracle *ReleaseOracleCallerSession) ProposedVersion() (struct {
- Major uint32
- Minor uint32
- Patch uint32
- Commit [20]byte
- Pass []common.Address
- Fail []common.Address
-}, error) {
- return _ReleaseOracle.Contract.ProposedVersion(&_ReleaseOracle.CallOpts)
-}
-
-// Signers is a free data retrieval call binding the contract method 0x46f0975a.
-//
-// Solidity: function signers() constant returns(address[])
-func (_ReleaseOracle *ReleaseOracleCaller) Signers(opts *bind.CallOpts) ([]common.Address, error) {
- var (
- ret0 = new([]common.Address)
- )
- out := ret0
- err := _ReleaseOracle.contract.Call(opts, out, "signers")
- return *ret0, err
-}
-
-// Signers is a free data retrieval call binding the contract method 0x46f0975a.
-//
-// Solidity: function signers() constant returns(address[])
-func (_ReleaseOracle *ReleaseOracleSession) Signers() ([]common.Address, error) {
- return _ReleaseOracle.Contract.Signers(&_ReleaseOracle.CallOpts)
-}
-
-// Signers is a free data retrieval call binding the contract method 0x46f0975a.
-//
-// Solidity: function signers() constant returns(address[])
-func (_ReleaseOracle *ReleaseOracleCallerSession) Signers() ([]common.Address, error) {
- return _ReleaseOracle.Contract.Signers(&_ReleaseOracle.CallOpts)
-}
-
-// Demote is a paid mutator transaction binding the contract method 0x5c3d005d.
-//
-// Solidity: function demote(user address) returns()
-func (_ReleaseOracle *ReleaseOracleTransactor) Demote(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error) {
- return _ReleaseOracle.contract.Transact(opts, "demote", user)
-}
-
-// Demote is a paid mutator transaction binding the contract method 0x5c3d005d.
-//
-// Solidity: function demote(user address) returns()
-func (_ReleaseOracle *ReleaseOracleSession) Demote(user common.Address) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Demote(&_ReleaseOracle.TransactOpts, user)
-}
-
-// Demote is a paid mutator transaction binding the contract method 0x5c3d005d.
-//
-// Solidity: function demote(user address) returns()
-func (_ReleaseOracle *ReleaseOracleTransactorSession) Demote(user common.Address) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Demote(&_ReleaseOracle.TransactOpts, user)
-}
-
-// Nuke is a paid mutator transaction binding the contract method 0xbc8fbbf8.
-//
-// Solidity: function nuke() returns()
-func (_ReleaseOracle *ReleaseOracleTransactor) Nuke(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _ReleaseOracle.contract.Transact(opts, "nuke")
-}
-
-// Nuke is a paid mutator transaction binding the contract method 0xbc8fbbf8.
-//
-// Solidity: function nuke() returns()
-func (_ReleaseOracle *ReleaseOracleSession) Nuke() (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Nuke(&_ReleaseOracle.TransactOpts)
-}
-
-// Nuke is a paid mutator transaction binding the contract method 0xbc8fbbf8.
-//
-// Solidity: function nuke() returns()
-func (_ReleaseOracle *ReleaseOracleTransactorSession) Nuke() (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Nuke(&_ReleaseOracle.TransactOpts)
-}
-
-// Promote is a paid mutator transaction binding the contract method 0xd0e0813a.
-//
-// Solidity: function promote(user address) returns()
-func (_ReleaseOracle *ReleaseOracleTransactor) Promote(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error) {
- return _ReleaseOracle.contract.Transact(opts, "promote", user)
-}
-
-// Promote is a paid mutator transaction binding the contract method 0xd0e0813a.
-//
-// Solidity: function promote(user address) returns()
-func (_ReleaseOracle *ReleaseOracleSession) Promote(user common.Address) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Promote(&_ReleaseOracle.TransactOpts, user)
-}
-
-// Promote is a paid mutator transaction binding the contract method 0xd0e0813a.
-//
-// Solidity: function promote(user address) returns()
-func (_ReleaseOracle *ReleaseOracleTransactorSession) Promote(user common.Address) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Promote(&_ReleaseOracle.TransactOpts, user)
-}
-
-// Release is a paid mutator transaction binding the contract method 0xd67cbec9.
-//
-// Solidity: function release(major uint32, minor uint32, patch uint32, commit bytes20) returns()
-func (_ReleaseOracle *ReleaseOracleTransactor) Release(opts *bind.TransactOpts, major uint32, minor uint32, patch uint32, commit [20]byte) (*types.Transaction, error) {
- return _ReleaseOracle.contract.Transact(opts, "release", major, minor, patch, commit)
-}
-
-// Release is a paid mutator transaction binding the contract method 0xd67cbec9.
-//
-// Solidity: function release(major uint32, minor uint32, patch uint32, commit bytes20) returns()
-func (_ReleaseOracle *ReleaseOracleSession) Release(major uint32, minor uint32, patch uint32, commit [20]byte) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Release(&_ReleaseOracle.TransactOpts, major, minor, patch, commit)
-}
-
-// Release is a paid mutator transaction binding the contract method 0xd67cbec9.
-//
-// Solidity: function release(major uint32, minor uint32, patch uint32, commit bytes20) returns()
-func (_ReleaseOracle *ReleaseOracleTransactorSession) Release(major uint32, minor uint32, patch uint32, commit [20]byte) (*types.Transaction, error) {
- return _ReleaseOracle.Contract.Release(&_ReleaseOracle.TransactOpts, major, minor, patch, commit)
-}
diff --git a/contracts/release/contract.sol b/contracts/release/contract.sol
deleted file mode 100644
index b9d94c756..000000000
--- a/contracts/release/contract.sol
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2016 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// ReleaseOracle is an Ethereum contract to store the current and previous
-// versions of the go-ethereum implementation. Its goal is to allow Geth to
-// check for new releases automatically without the need to consult a central
-// repository.
-//
-// The contract takes a vote based approach on both assigning authorised signers
-// as well as signing off on new Geth releases.
-//
-// Note, when a signer is demoted, the currently pending release is auto-nuked.
-// The reason is to prevent suprises where a demotion actually tilts the votes
-// in favor of one voter party and pushing out a new release as a consequence of
-// a simple demotion.
-contract ReleaseOracle {
- // Votes is an internal data structure to count votes on a specific proposal
- struct Votes {
- address[] pass; // List of signers voting to pass a proposal
- address[] fail; // List of signers voting to fail a proposal
- }
-
- // Version is the version details of a particular Geth release
- struct Version {
- uint32 major; // Major version component of the release
- uint32 minor; // Minor version component of the release
- uint32 patch; // Patch version component of the release
- bytes20 commit; // Git SHA1 commit hash of the release
-
- uint64 time; // Timestamp of the release approval
- Votes votes; // Votes that passed this release
- }
-
- // Oracle authorization details
- mapping(address => bool) authorised; // Set of accounts allowed to vote on updating the contract
- address[] voters; // List of addresses currently accepted as signers
-
- // Various proposals being voted on
- mapping(address => Votes) authProps; // Currently running user authorization proposals
- address[] authPend; // List of addresses being voted on (map indexes)
-
- Version verProp; // Currently proposed release being voted on
- Version[] releases; // All the positively voted releases
-
- // isSigner is a modifier to authorize contract transactions.
- modifier isSigner() {
- if (authorised[msg.sender]) {
- _
- }
- }
-
- // Constructor to assign the initial set of signers.
- function ReleaseOracle(address[] signers) {
- // If no signers were specified, assign the creator as the sole signer
- if (signers.length == 0) {
- authorised[msg.sender] = true;
- voters.push(msg.sender);
- return;
- }
- // Otherwise assign the individual signers one by one
- for (uint i = 0; i < signers.length; i++) {
- authorised[signers[i]] = true;
- voters.push(signers[i]);
- }
- }
-
- // signers is an accessor method to retrieve all the signers (public accessor
- // generates an indexed one, not a retrieve-all version).
- function signers() constant returns(address[]) {
- return voters;
- }
-
- // authProposals retrieves the list of addresses that authorization proposals
- // are currently being voted on.
- function authProposals() constant returns(address[]) {
- return authPend;
- }
-
- // authVotes retrieves the current authorization votes for a particular user
- // to promote him into the list of signers, or demote him from there.
- function authVotes(address user) constant returns(address[] promote, address[] demote) {
- return (authProps[user].pass, authProps[user].fail);
- }
-
- // currentVersion retrieves the semantic version, commit hash and release time
- // of the currently votec active release.
- function currentVersion() constant returns (uint32 major, uint32 minor, uint32 patch, bytes20 commit, uint time) {
- if (releases.length == 0) {
- return (0, 0, 0, 0, 0);
- }
- var release = releases[releases.length - 1];
-
- return (release.major, release.minor, release.patch, release.commit, release.time);
- }
-
- // proposedVersion retrieves the semantic version, commit hash and the current
- // votes for the next proposed release.
- function proposedVersion() constant returns (uint32 major, uint32 minor, uint32 patch, bytes20 commit, address[] pass, address[] fail) {
- return (verProp.major, verProp.minor, verProp.patch, verProp.commit, verProp.votes.pass, verProp.votes.fail);
- }
-
- // promote pitches in on a voting campaign to promote a new user to a signer
- // position.
- function promote(address user) {
- updateSigner(user, true);
- }
-
- // demote pitches in on a voting campaign to demote an authorised user from
- // its signer position.
- function demote(address user) {
- updateSigner(user, false);
- }
-
- // release votes for a particular version to be included as the next release.
- function release(uint32 major, uint32 minor, uint32 patch, bytes20 commit) {
- updateRelease(major, minor, patch, commit, true);
- }
-
- // nuke votes for the currently proposed version to not be included as the next
- // release. Nuking doesn't require a specific version number for simplicity.
- function nuke() {
- updateRelease(0, 0, 0, 0, false);
- }
-
- // updateSigner marks a vote for changing the status of an Ethereum user, either
- // for or against the user being an authorised signer.
- function updateSigner(address user, bool authorize) internal isSigner {
- // Gather the current votes and ensure we don't double vote
- Votes votes = authProps[user];
- for (uint i = 0; i < votes.pass.length; i++) {
- if (votes.pass[i] == msg.sender) {
- return;
- }
- }
- for (i = 0; i < votes.fail.length; i++) {
- if (votes.fail[i] == msg.sender) {
- return;
- }
- }
- // If no authorization proposal is open, add the user to the index for later lookups
- if (votes.pass.length == 0 && votes.fail.length == 0) {
- authPend.push(user);
- }
- // Cast the vote and return if the proposal cannot be resolved yet
- if (authorize) {
- votes.pass.push(msg.sender);
- if (votes.pass.length <= voters.length / 2) {
- return;
- }
- } else {
- votes.fail.push(msg.sender);
- if (votes.fail.length <= voters.length / 2) {
- return;
- }
- }
- // Proposal resolved in our favor, execute whatever we voted on
- if (authorize && !authorised[user]) {
- authorised[user] = true;
- voters.push(user);
- } else if (!authorize && authorised[user]) {
- authorised[user] = false;
-
- for (i = 0; i < voters.length; i++) {
- if (voters[i] == user) {
- voters[i] = voters[voters.length - 1];
- voters.length--;
-
- delete verProp; // Nuke any version proposal (no surprise releases!)
- break;
- }
- }
- }
- // Finally delete the resolved proposal, index and garbage collect
- delete authProps[user];
-
- for (i = 0; i < authPend.length; i++) {
- if (authPend[i] == user) {
- authPend[i] = authPend[authPend.length - 1];
- authPend.length--;
- break;
- }
- }
- }
-
- // updateRelease votes for a particular version to be included as the next release,
- // or for the currently proposed release to be nuked out.
- function updateRelease(uint32 major, uint32 minor, uint32 patch, bytes20 commit, bool release) internal isSigner {
- // Skip nuke votes if no proposal is pending
- if (!release && verProp.votes.pass.length == 0) {
- return;
- }
- // Mark a new release if no proposal is pending
- if (verProp.votes.pass.length == 0) {
- verProp.major = major;
- verProp.minor = minor;
- verProp.patch = patch;
- verProp.commit = commit;
- }
- // Make sure positive votes match the current proposal
- if (release && (verProp.major != major || verProp.minor != minor || verProp.patch != patch || verProp.commit != commit)) {
- return;
- }
- // Gather the current votes and ensure we don't double vote
- Votes votes = verProp.votes;
- for (uint i = 0; i < votes.pass.length; i++) {
- if (votes.pass[i] == msg.sender) {
- return;
- }
- }
- for (i = 0; i < votes.fail.length; i++) {
- if (votes.fail[i] == msg.sender) {
- return;
- }
- }
- // Cast the vote and return if the proposal cannot be resolved yet
- if (release) {
- votes.pass.push(msg.sender);
- if (votes.pass.length <= voters.length / 2) {
- return;
- }
- } else {
- votes.fail.push(msg.sender);
- if (votes.fail.length <= voters.length / 2) {
- return;
- }
- }
- // Proposal resolved in our favor, execute whatever we voted on
- if (release) {
- verProp.time = uint64(now);
- releases.push(verProp);
- delete verProp;
- } else {
- delete verProp;
- }
- }
-}
diff --git a/contracts/release/contract_test.go b/contracts/release/contract_test.go
deleted file mode 100644
index 0b2b2f048..000000000
--- a/contracts/release/contract_test.go
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright 2016 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-package release
-
-import (
- "crypto/ecdsa"
- "math/big"
- "testing"
-
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core"
- "github.com/ethereum/go-ethereum/crypto"
-)
-
-// setupReleaseTest creates a blockchain simulator and deploys a version oracle
-// contract for testing.
-func setupReleaseTest(t *testing.T, prefund ...*ecdsa.PrivateKey) (*ecdsa.PrivateKey, *ReleaseOracle, *backends.SimulatedBackend) {
- // Generate a new random account and a funded simulator
- key, _ := crypto.GenerateKey()
- auth := bind.NewKeyedTransactor(key)
-
- alloc := core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}
- for _, key := range prefund {
- alloc[crypto.PubkeyToAddress(key.PublicKey)] = core.GenesisAccount{Balance: big.NewInt(10000000000)}
- }
- sim := backends.NewSimulatedBackend(alloc)
-
- // Deploy a version oracle contract, commit and return
- _, _, oracle, err := DeployReleaseOracle(auth, sim, []common.Address{auth.From})
- if err != nil {
- t.Fatalf("Failed to deploy version contract: %v", err)
- }
- sim.Commit()
-
- return key, oracle, sim
-}
-
-// Tests that the version contract can be deployed and the creator is assigned
-// the sole authorized signer.
-func TestContractCreation(t *testing.T) {
- key, oracle, _ := setupReleaseTest(t)
-
- owner := crypto.PubkeyToAddress(key.PublicKey)
- signers, err := oracle.Signers(nil)
- if err != nil {
- t.Fatalf("Failed to retrieve list of signers: %v", err)
- }
- if len(signers) != 1 || signers[0] != owner {
- t.Fatalf("Initial signer mismatch: have %v, want %v", signers, owner)
- }
-}
-
-// Tests that subsequent signers can be promoted, each requiring half plus one
-// votes for it to pass through.
-func TestSignerPromotion(t *testing.T) {
- // Prefund a few accounts to authorize with and create the oracle
- keys := make([]*ecdsa.PrivateKey, 5)
- for i := 0; i < len(keys); i++ {
- keys[i], _ = crypto.GenerateKey()
- }
- key, oracle, sim := setupReleaseTest(t, keys...)
-
- // Gradually promote the keys, until all are authorized
- keys = append([]*ecdsa.PrivateKey{key}, keys...)
- for i := 1; i < len(keys); i++ {
- // Check that no votes are accepted from the not yet authorized user
- if _, err := oracle.Promote(bind.NewKeyedTransactor(keys[i]), common.Address{}); err != nil {
- t.Fatalf("Iter #%d: failed invalid promotion attempt: %v", i, err)
- }
- sim.Commit()
-
- pend, err := oracle.AuthProposals(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve active proposals: %v", i, err)
- }
- if len(pend) != 0 {
- t.Fatalf("Iter #%d: proposal count mismatch: have %d, want 0", i, len(pend))
- }
- // Promote with half - 1 voters and check that the user's not yet authorized
- for j := 0; j < i/2; j++ {
- if _, err = oracle.Promote(bind.NewKeyedTransactor(keys[j]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid promotion attempt: %v", i, err)
- }
- }
- sim.Commit()
-
- signers, err := oracle.Signers(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve list of signers: %v", i, err)
- }
- if len(signers) != i {
- t.Fatalf("Iter #%d: signer count mismatch: have %v, want %v", i, len(signers), i)
- }
- // Promote with the last one needed to pass the promotion
- if _, err = oracle.Promote(bind.NewKeyedTransactor(keys[i/2]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid promotion completion attempt: %v", i, err)
- }
- sim.Commit()
-
- signers, err = oracle.Signers(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve list of signers: %v", i, err)
- }
- if len(signers) != i+1 {
- t.Fatalf("Iter #%d: signer count mismatch: have %v, want %v", i, len(signers), i+1)
- }
- }
-}
-
-// Tests that subsequent signers can be demoted, each requiring half plus one
-// votes for it to pass through.
-func TestSignerDemotion(t *testing.T) {
- // Prefund a few accounts to authorize with and create the oracle
- keys := make([]*ecdsa.PrivateKey, 5)
- for i := 0; i < len(keys); i++ {
- keys[i], _ = crypto.GenerateKey()
- }
- key, oracle, sim := setupReleaseTest(t, keys...)
-
- // Authorize all the keys as valid signers and verify cardinality
- keys = append([]*ecdsa.PrivateKey{key}, keys...)
- for i := 1; i < len(keys); i++ {
- for j := 0; j <= i/2; j++ {
- if _, err := oracle.Promote(bind.NewKeyedTransactor(keys[j]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid promotion attempt: %v", i, err)
- }
- }
- sim.Commit()
- }
- signers, err := oracle.Signers(nil)
- if err != nil {
- t.Fatalf("Failed to retrieve list of signers: %v", err)
- }
- if len(signers) != len(keys) {
- t.Fatalf("Signer count mismatch: have %v, want %v", len(signers), len(keys))
- }
- // Gradually demote users until we run out of signers
- for i := len(keys) - 1; i >= 0; i-- {
- // Demote with half - 1 voters and check that the user's not yet dropped
- for j := 0; j < (i+1)/2; j++ {
- if _, err = oracle.Demote(bind.NewKeyedTransactor(keys[j]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid demotion attempt: %v", len(keys)-i, err)
- }
- }
- sim.Commit()
-
- signers, err := oracle.Signers(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve list of signers: %v", len(keys)-i, err)
- }
- if len(signers) != i+1 {
- t.Fatalf("Iter #%d: signer count mismatch: have %v, want %v", len(keys)-i, len(signers), i+1)
- }
- // Demote with the last one needed to pass the demotion
- if _, err = oracle.Demote(bind.NewKeyedTransactor(keys[(i+1)/2]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid demotion completion attempt: %v", i, err)
- }
- sim.Commit()
-
- signers, err = oracle.Signers(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve list of signers: %v", len(keys)-i, err)
- }
- if len(signers) != i {
- t.Fatalf("Iter #%d: signer count mismatch: have %v, want %v", len(keys)-i, len(signers), i)
- }
- // Check that no votes are accepted from the already demoted users
- if _, err = oracle.Promote(bind.NewKeyedTransactor(keys[i]), common.Address{}); err != nil {
- t.Fatalf("Iter #%d: failed invalid promotion attempt: %v", i, err)
- }
- sim.Commit()
-
- pend, err := oracle.AuthProposals(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve active proposals: %v", i, err)
- }
- if len(pend) != 0 {
- t.Fatalf("Iter #%d: proposal count mismatch: have %d, want 0", i, len(pend))
- }
- }
-}
-
-// Tests that new versions can be released, honouring both voting rights as well
-// as the minimum required vote count.
-func TestVersionRelease(t *testing.T) {
- // Prefund a few accounts to authorize with and create the oracle
- keys := make([]*ecdsa.PrivateKey, 5)
- for i := 0; i < len(keys); i++ {
- keys[i], _ = crypto.GenerateKey()
- }
- key, oracle, sim := setupReleaseTest(t, keys...)
-
- // Track the "current release"
- var (
- verMajor = uint32(0)
- verMinor = uint32(0)
- verPatch = uint32(0)
- verCommit = [20]byte{}
- )
- // Gradually push releases, always requiring more signers than previously
- keys = append([]*ecdsa.PrivateKey{key}, keys...)
- for i := 1; i < len(keys); i++ {
- // Check that no votes are accepted from the not yet authorized user
- if _, err := oracle.Release(bind.NewKeyedTransactor(keys[i]), 0, 0, 0, [20]byte{0}); err != nil {
- t.Fatalf("Iter #%d: failed invalid release attempt: %v", i, err)
- }
- sim.Commit()
-
- prop, err := oracle.ProposedVersion(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve active proposal: %v", i, err)
- }
- if len(prop.Pass) != 0 {
- t.Fatalf("Iter #%d: proposal vote count mismatch: have %d, want 0", i, len(prop.Pass))
- }
- // Authorize the user to make releases
- for j := 0; j <= i/2; j++ {
- if _, err = oracle.Promote(bind.NewKeyedTransactor(keys[j]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid promotion attempt: %v", i, err)
- }
- }
- sim.Commit()
-
- // Propose release with half voters and check that the release does not yet go through
- for j := 0; j < (i+1)/2; j++ {
- if _, err = oracle.Release(bind.NewKeyedTransactor(keys[j]), uint32(i), uint32(i+1), uint32(i+2), [20]byte{byte(i + 3)}); err != nil {
- t.Fatalf("Iter #%d: failed valid release attempt: %v", i, err)
- }
- }
- sim.Commit()
-
- ver, err := oracle.CurrentVersion(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve current version: %v", i, err)
- }
- if ver.Major != verMajor || ver.Minor != verMinor || ver.Patch != verPatch || ver.Commit != verCommit {
- t.Fatalf("Iter #%d: version mismatch: have %d.%d.%d-%x, want %d.%d.%d-%x", i, ver.Major, ver.Minor, ver.Patch, ver.Commit, verMajor, verMinor, verPatch, verCommit)
- }
-
- // Pass the release and check that it became the next version
- verMajor, verMinor, verPatch, verCommit = uint32(i), uint32(i+1), uint32(i+2), [20]byte{byte(i + 3)}
- if _, err = oracle.Release(bind.NewKeyedTransactor(keys[(i+1)/2]), uint32(i), uint32(i+1), uint32(i+2), [20]byte{byte(i + 3)}); err != nil {
- t.Fatalf("Iter #%d: failed valid release completion attempt: %v", i, err)
- }
- sim.Commit()
-
- ver, err = oracle.CurrentVersion(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve current version: %v", i, err)
- }
- if ver.Major != verMajor || ver.Minor != verMinor || ver.Patch != verPatch || ver.Commit != verCommit {
- t.Fatalf("Iter #%d: version mismatch: have %d.%d.%d-%x, want %d.%d.%d-%x", i, ver.Major, ver.Minor, ver.Patch, ver.Commit, verMajor, verMinor, verPatch, verCommit)
- }
- }
-}
-
-// Tests that proposed versions can be nuked out of existence.
-func TestVersionNuking(t *testing.T) {
- // Prefund a few accounts to authorize with and create the oracle
- keys := make([]*ecdsa.PrivateKey, 9)
- for i := 0; i < len(keys); i++ {
- keys[i], _ = crypto.GenerateKey()
- }
- key, oracle, sim := setupReleaseTest(t, keys...)
-
- // Authorize all the keys as valid signers
- keys = append([]*ecdsa.PrivateKey{key}, keys...)
- for i := 1; i < len(keys); i++ {
- for j := 0; j <= i/2; j++ {
- if _, err := oracle.Promote(bind.NewKeyedTransactor(keys[j]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid promotion attempt: %v", i, err)
- }
- }
- sim.Commit()
- }
- // Propose releases with more and more keys, always retaining enough users to nuke the proposals
- for i := 1; i < (len(keys)+1)/2; i++ {
- // Propose release with an initial set of signers
- for j := 0; j < i; j++ {
- if _, err := oracle.Release(bind.NewKeyedTransactor(keys[j]), uint32(i), uint32(i+1), uint32(i+2), [20]byte{byte(i + 3)}); err != nil {
- t.Fatalf("Iter #%d: failed valid proposal attempt: %v", i, err)
- }
- }
- sim.Commit()
-
- prop, err := oracle.ProposedVersion(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve active proposal: %v", i, err)
- }
- if len(prop.Pass) != i {
- t.Fatalf("Iter #%d: proposal vote count mismatch: have %d, want %d", i, len(prop.Pass), i)
- }
- // Nuke the release with half+1 voters
- for j := i; j <= i+(len(keys)+1)/2; j++ {
- if _, err := oracle.Nuke(bind.NewKeyedTransactor(keys[j])); err != nil {
- t.Fatalf("Iter #%d: failed valid nuke attempt: %v", i, err)
- }
- }
- sim.Commit()
-
- prop, err = oracle.ProposedVersion(nil)
- if err != nil {
- t.Fatalf("Iter #%d: failed to retrieve active proposal: %v", i, err)
- }
- if len(prop.Pass) != 0 || len(prop.Fail) != 0 {
- t.Fatalf("Iter #%d: proposal vote count mismatch: have %d/%d pass/fail, want 0/0", i, len(prop.Pass), len(prop.Fail))
- }
- }
-}
-
-// Tests that demoting a signer will auto-nuke the currently pending release.
-func TestVersionAutoNuke(t *testing.T) {
- // Prefund a few accounts to authorize with and create the oracle
- keys := make([]*ecdsa.PrivateKey, 5)
- for i := 0; i < len(keys); i++ {
- keys[i], _ = crypto.GenerateKey()
- }
- key, oracle, sim := setupReleaseTest(t, keys...)
-
- // Authorize all the keys as valid signers
- keys = append([]*ecdsa.PrivateKey{key}, keys...)
- for i := 1; i < len(keys); i++ {
- for j := 0; j <= i/2; j++ {
- if _, err := oracle.Promote(bind.NewKeyedTransactor(keys[j]), crypto.PubkeyToAddress(keys[i].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid promotion attempt: %v", i, err)
- }
- }
- sim.Commit()
- }
- // Make a release proposal and check it's existence
- if _, err := oracle.Release(bind.NewKeyedTransactor(keys[0]), 1, 2, 3, [20]byte{4}); err != nil {
- t.Fatalf("Failed valid proposal attempt: %v", err)
- }
- sim.Commit()
-
- prop, err := oracle.ProposedVersion(nil)
- if err != nil {
- t.Fatalf("Failed to retrieve active proposal: %v", err)
- }
- if len(prop.Pass) != 1 {
- t.Fatalf("Proposal vote count mismatch: have %d, want 1", len(prop.Pass))
- }
- // Demote a signer and check release proposal deletion
- for i := 0; i <= len(keys)/2; i++ {
- if _, err := oracle.Demote(bind.NewKeyedTransactor(keys[i]), crypto.PubkeyToAddress(keys[len(keys)-1].PublicKey)); err != nil {
- t.Fatalf("Iter #%d: failed valid demotion attempt: %v", i, err)
- }
- }
- sim.Commit()
-
- prop, err = oracle.ProposedVersion(nil)
- if err != nil {
- t.Fatalf("Failed to retrieve active proposal: %v", err)
- }
- if len(prop.Pass) != 0 {
- t.Fatalf("Proposal vote count mismatch: have %d, want 0", len(prop.Pass))
- }
-}
diff --git a/contracts/release/release.go b/contracts/release/release.go
deleted file mode 100644
index 28a35381d..000000000
--- a/contracts/release/release.go
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// Package release contains the node service that tracks client releases.
-package release
-
-//go:generate abigen --sol ./contract.sol --pkg release --out ./contract.go
-
-import (
- "context"
- "fmt"
- "strings"
- "time"
-
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/eth"
- "github.com/ethereum/go-ethereum/internal/ethapi"
- "github.com/ethereum/go-ethereum/les"
- "github.com/ethereum/go-ethereum/log"
- "github.com/ethereum/go-ethereum/node"
- "github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/rpc"
-)
-
-// Interval to check for new releases
-const releaseRecheckInterval = time.Hour
-
-// Config contains the configurations of the release service.
-type Config struct {
- Oracle common.Address // Ethereum address of the release oracle
- Major uint32 // Major version component of the release
- Minor uint32 // Minor version component of the release
- Patch uint32 // Patch version component of the release
- Commit [20]byte // Git SHA1 commit hash of the release
-}
-
-// ReleaseService is a node service that periodically checks the blockchain for
-// newly released versions of the client being run and issues a warning to the
-// user about it.
-type ReleaseService struct {
- config Config // Current version to check releases against
- oracle *ReleaseOracle // Native binding to the release oracle contract
- quit chan chan error // Quit channel to terminate the version checker
-}
-
-// NewReleaseService creates a new service to periodically check for new client
-// releases and notify the user of such.
-func NewReleaseService(ctx *node.ServiceContext, config Config) (node.Service, error) {
- // Retrieve the Ethereum service dependency to access the blockchain
- var apiBackend ethapi.Backend
- var ethereum *eth.Ethereum
- if err := ctx.Service(&ethereum); err == nil {
- apiBackend = ethereum.ApiBackend
- } else {
- var ethereum *les.LightEthereum
- if err := ctx.Service(&ethereum); err == nil {
- apiBackend = ethereum.ApiBackend
- } else {
- return nil, err
- }
- }
- // Construct the release service
- contract, err := NewReleaseOracle(config.Oracle, eth.NewContractBackend(apiBackend))
- if err != nil {
- return nil, err
- }
- return &ReleaseService{
- config: config,
- oracle: contract,
- quit: make(chan chan error),
- }, nil
-}
-
-// Protocols returns an empty list of P2P protocols as the release service does
-// not have a networking component.
-func (r *ReleaseService) Protocols() []p2p.Protocol { return nil }
-
-// APIs returns an empty list of RPC descriptors as the release service does not
-// expose any functioanlity to the outside world.
-func (r *ReleaseService) APIs() []rpc.API { return nil }
-
-// Start spawns the periodic version checker goroutine
-func (r *ReleaseService) Start(server *p2p.Server) error {
- go r.checker()
- return nil
-}
-
-// Stop terminates all goroutines belonging to the service, blocking until they
-// are all terminated.
-func (r *ReleaseService) Stop() error {
- errc := make(chan error)
- r.quit <- errc
- return <-errc
-}
-
-// checker runs indefinitely in the background, periodically checking for new
-// client releases.
-func (r *ReleaseService) checker() {
- // Set up the timers to periodically check for releases
- timer := time.NewTimer(0) // Immediately fire a version check
- defer timer.Stop()
-
- for {
- select {
- case <-timer.C:
- // Rechedule the timer before continuing
- timer.Reset(releaseRecheckInterval)
- r.checkVersion()
- case errc := <-r.quit:
- errc <- nil
- return
- }
- }
-}
-
-func (r *ReleaseService) checkVersion() {
- // Retrieve the current version, and handle missing contracts gracefully
- ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
- opts := &bind.CallOpts{Context: ctx}
- defer cancel()
-
- version, err := r.oracle.CurrentVersion(opts)
- if err != nil {
- if err == bind.ErrNoCode {
- log.Debug("Release oracle not found", "contract", r.config.Oracle)
- } else {
- log.Error("Failed to retrieve current release", "err", err)
- }
- return
- }
- // Version was successfully retrieved, notify if newer than ours
- if version.Major > r.config.Major ||
- (version.Major == r.config.Major && version.Minor > r.config.Minor) ||
- (version.Major == r.config.Major && version.Minor == r.config.Minor && version.Patch > r.config.Patch) {
-
- warning := fmt.Sprintf("Client v%d.%d.%d-%x seems older than the latest upstream release v%d.%d.%d-%x",
- r.config.Major, r.config.Minor, r.config.Patch, r.config.Commit[:4], version.Major, version.Minor, version.Patch, version.Commit[:4])
- howtofix := fmt.Sprintf("Please check https://github.com/ethereum/go-ethereum/releases for new releases")
- separator := strings.Repeat("-", len(warning))
-
- log.Warn(separator)
- log.Warn(warning)
- log.Warn(howtofix)
- log.Warn(separator)
- } else {
- log.Debug("Client seems up to date with upstream",
- "local", fmt.Sprintf("v%d.%d.%d-%x", r.config.Major, r.config.Minor, r.config.Patch, r.config.Commit[:4]),
- "upstream", fmt.Sprintf("v%d.%d.%d-%x", version.Major, version.Minor, version.Patch, version.Commit[:4]))
- }
-}
diff --git a/core/bench_test.go b/core/bench_test.go
index ab25c27d3..e23f0d19d 100644
--- a/core/bench_test.go
+++ b/core/bench_test.go
@@ -84,7 +84,7 @@ func genValueTx(nbytes int) func(int, *BlockGen) {
return func(i int, gen *BlockGen) {
toaddr := common.Address{}
data := make([]byte, nbytes)
- gas := IntrinsicGas(data, false, false)
+ gas, _ := IntrinsicGas(data, false, false)
tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(benchRootAddr), toaddr, big.NewInt(1), gas, nil, data), types.HomesteadSigner{}, benchRootKey)
gen.AddTx(tx)
}
@@ -93,7 +93,6 @@ func genValueTx(nbytes int) func(int, *BlockGen) {
var (
ringKeys = make([]*ecdsa.PrivateKey, 1000)
ringAddrs = make([]common.Address, len(ringKeys))
- bigTxGas = new(big.Int).SetUint64(params.TxGas)
)
func init() {
@@ -113,8 +112,8 @@ func genTxRing(naccounts int) func(int, *BlockGen) {
return func(i int, gen *BlockGen) {
gas := CalcGasLimit(gen.PrevBlock(i - 1))
for {
- gas.Sub(gas, bigTxGas)
- if gas.Cmp(bigTxGas) < 0 {
+ gas -= params.TxGas
+ if gas < params.TxGas {
break
}
to := (from + 1) % naccounts
@@ -122,7 +121,7 @@ func genTxRing(naccounts int) func(int, *BlockGen) {
gen.TxNonce(ringAddrs[from]),
ringAddrs[to],
benchRootFunds,
- bigTxGas,
+ params.TxGas,
nil,
nil,
)
@@ -170,11 +169,11 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) {
Alloc: GenesisAlloc{benchRootAddr: {Balance: benchRootFunds}},
}
genesis := gspec.MustCommit(db)
- chain, _ := GenerateChain(gspec.Config, genesis, db, b.N, gen)
+ chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, b.N, gen)
// Time the insertion of the new chain.
// State and blocks are stored in the same DB.
- chainman, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ chainman, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer chainman.Stop()
b.ReportAllocs()
b.ResetTimer()
@@ -284,7 +283,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) {
if err != nil {
b.Fatalf("error opening database at %v: %v", dir, err)
}
- chain, err := NewBlockChain(db, params.TestChainConfig, ethash.NewFaker(), vm.Config{})
+ chain, err := NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{})
if err != nil {
b.Fatalf("error creating chain: %v", err)
}
diff --git a/core/block_validator.go b/core/block_validator.go
index e9cfd0482..98958809b 100644
--- a/core/block_validator.go
+++ b/core/block_validator.go
@@ -18,9 +18,7 @@ package core
import (
"fmt"
- "math/big"
- "github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
@@ -52,11 +50,14 @@ func NewBlockValidator(config *params.ChainConfig, blockchain *BlockChain, engin
// validated at this point.
func (v *BlockValidator) ValidateBody(block *types.Block) error {
// Check whether the block's known, and if not, that it's linkable
- if v.bc.HasBlockAndState(block.Hash()) {
+ if v.bc.HasBlockAndState(block.Hash(), block.NumberU64()) {
return ErrKnownBlock
}
- if !v.bc.HasBlockAndState(block.ParentHash()) {
- return consensus.ErrUnknownAncestor
+ if !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) {
+ if !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) {
+ return consensus.ErrUnknownAncestor
+ }
+ return consensus.ErrPrunedAncestor
}
// Header validity is known at this point, check the uncles and transactions
header := block.Header()
@@ -76,10 +77,10 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error {
// transition, such as amount of used gas, the receipt roots and the state root
// itself. ValidateState returns a database batch if the validation was a success
// otherwise nil and an error is returned.
-func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas *big.Int) error {
+func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error {
header := block.Header()
- if block.GasUsed().Cmp(usedGas) != 0 {
- return fmt.Errorf("invalid gas used (remote: %v local: %v)", block.GasUsed(), usedGas)
+ if block.GasUsed() != usedGas {
+ return fmt.Errorf("invalid gas used (remote: %d local: %d)", block.GasUsed(), usedGas)
}
// Validate the received block's bloom with the one derived from the generated receipts.
// For valid blocks this should always validate to true.
@@ -101,17 +102,13 @@ func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *stat
}
// CalcGasLimit computes the gas limit of the next block after parent.
-// The result may be modified by the caller.
// This is miner strategy, not consensus protocol.
-func CalcGasLimit(parent *types.Block) *big.Int {
+func CalcGasLimit(parent *types.Block) uint64 {
// contrib = (parentGasUsed * 3 / 2) / 1024
- contrib := new(big.Int).Mul(parent.GasUsed(), big.NewInt(3))
- contrib = contrib.Div(contrib, big.NewInt(2))
- contrib = contrib.Div(contrib, params.GasLimitBoundDivisor)
+ contrib := (parent.GasUsed() + parent.GasUsed()/2) / params.GasLimitBoundDivisor
// decay = parentGasLimit / 1024 -1
- decay := new(big.Int).Div(parent.GasLimit(), params.GasLimitBoundDivisor)
- decay.Sub(decay, big.NewInt(1))
+ decay := parent.GasLimit()/params.GasLimitBoundDivisor - 1
/*
strategy: gasLimit of block-to-mine is set based on parent's
@@ -120,15 +117,17 @@ func CalcGasLimit(parent *types.Block) *big.Int {
at that usage) the amount increased/decreased depends on how far away
from parentGasLimit * (2/3) parentGasUsed is.
*/
- gl := new(big.Int).Sub(parent.GasLimit(), decay)
- gl = gl.Add(gl, contrib)
- gl.Set(math.BigMax(gl, params.MinGasLimit))
-
+ limit := parent.GasLimit() - decay + contrib
+ if limit < params.MinGasLimit {
+ limit = params.MinGasLimit
+ }
// however, if we're now below the target (TargetGasLimit) we increase the
// limit as much as we can (parentGasLimit / 1024 -1)
- if gl.Cmp(params.TargetGasLimit) < 0 {
- gl.Add(parent.GasLimit(), decay)
- gl.Set(math.BigMin(gl, params.TargetGasLimit))
+ if limit < params.TargetGasLimit {
+ limit = parent.GasLimit() + decay
+ if limit > params.TargetGasLimit {
+ limit = params.TargetGasLimit
+ }
}
- return gl
+ return limit
}
diff --git a/core/block_validator_test.go b/core/block_validator_test.go
index 6d54c2b93..e334b3c3c 100644
--- a/core/block_validator_test.go
+++ b/core/block_validator_test.go
@@ -35,14 +35,14 @@ func TestHeaderVerification(t *testing.T) {
testdb, _ = ethdb.NewMemDatabase()
gspec = &Genesis{Config: params.TestChainConfig}
genesis = gspec.MustCommit(testdb)
- blocks, _ = GenerateChain(params.TestChainConfig, genesis, testdb, 8, nil)
+ blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil)
)
headers := make([]*types.Header, len(blocks))
for i, block := range blocks {
headers[i] = block.Header()
}
// Run the header checker for blocks one-by-one, checking for both valid and invalid nonces
- chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), vm.Config{})
+ chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{})
defer chain.Stop()
for i := 0; i < len(blocks); i++ {
@@ -87,7 +87,7 @@ func testHeaderConcurrentVerification(t *testing.T, threads int) {
testdb, _ = ethdb.NewMemDatabase()
gspec = &Genesis{Config: params.TestChainConfig}
genesis = gspec.MustCommit(testdb)
- blocks, _ = GenerateChain(params.TestChainConfig, genesis, testdb, 8, nil)
+ blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil)
)
headers := make([]*types.Header, len(blocks))
seals := make([]bool, len(blocks))
@@ -106,11 +106,11 @@ func testHeaderConcurrentVerification(t *testing.T, threads int) {
var results <-chan error
if valid {
- chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFaker(), vm.Config{})
+ chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{})
_, results = chain.engine.VerifyHeaders(chain, headers, seals)
chain.Stop()
} else {
- chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), vm.Config{})
+ chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), vm.Config{})
_, results = chain.engine.VerifyHeaders(chain, headers, seals)
chain.Stop()
}
@@ -159,7 +159,7 @@ func testHeaderConcurrentAbortion(t *testing.T, threads int) {
testdb, _ = ethdb.NewMemDatabase()
gspec = &Genesis{Config: params.TestChainConfig}
genesis = gspec.MustCommit(testdb)
- blocks, _ = GenerateChain(params.TestChainConfig, genesis, testdb, 1024, nil)
+ blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 1024, nil)
)
headers := make([]*types.Header, len(blocks))
seals := make([]bool, len(blocks))
@@ -173,7 +173,7 @@ func testHeaderConcurrentAbortion(t *testing.T, threads int) {
defer runtime.GOMAXPROCS(old)
// Start the verifications and immediately abort
- chain, _ := NewBlockChain(testdb, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), vm.Config{})
+ chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), vm.Config{})
defer chain.Stop()
abort, results := chain.engine.VerifyHeaders(chain, headers, seals)
diff --git a/core/blockchain.go b/core/blockchain.go
index 325753c7a..8d141fddb 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -42,6 +42,7 @@ import (
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/trie"
"github.com/hashicorp/golang-lru"
+ "gopkg.in/karalabe/cookiejar.v2/collections/prque"
)
var (
@@ -56,11 +57,20 @@ const (
maxFutureBlocks = 256
maxTimeFutureBlocks = 30
badBlockLimit = 10
+ triesInMemory = 128
// BlockChainVersion ensures that an incompatible database forces a resync from scratch.
BlockChainVersion = 3
)
+// CacheConfig contains the configuration values for the trie caching/pruning
+// that's resident in a blockchain.
+type CacheConfig struct {
+ Disabled bool // Whether to disable trie write caching (archive node)
+ TrieNodeLimit int // Memory limit (MB) at which to flush the current in-memory trie to disk
+ TrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk
+}
+
// BlockChain represents the canonical chain given a database with a genesis
// block. The Blockchain manages chain imports, reverts, chain reorganisations.
//
@@ -76,10 +86,14 @@ const (
// included in the canonical one where as GetBlockByNumber always represents the
// canonical chain.
type BlockChain struct {
- config *params.ChainConfig // chain & network configuration
+ chainConfig *params.ChainConfig // Chain & network configuration
+ cacheConfig *CacheConfig // Cache configuration for pruning
+
+ db ethdb.Database // Low level persistent database to store final content in
+ triegc *prque.Prque // Priority queue mapping block numbers to tries to gc
+ gcproc time.Duration // Accumulates canonical block processing for trie dumping
hc *HeaderChain
- chainDb ethdb.Database
rmLogsFeed event.Feed
chainFeed event.Feed
chainSideFeed event.Feed
@@ -119,7 +133,13 @@ type BlockChain struct {
// NewBlockChain returns a fully initialised block chain using information
// available in the database. It initialises the default Ethereum Validator and
// Processor.
-func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config) (*BlockChain, error) {
+func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config) (*BlockChain, error) {
+ if cacheConfig == nil {
+ cacheConfig = &CacheConfig{
+ TrieNodeLimit: 256 * 1024 * 1024,
+ TrieTimeLimit: 5 * time.Minute,
+ }
+ }
bodyCache, _ := lru.New(bodyCacheLimit)
bodyRLPCache, _ := lru.New(bodyCacheLimit)
blockCache, _ := lru.New(blockCacheLimit)
@@ -127,9 +147,11 @@ func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, engine co
badBlocks, _ := lru.New(badBlockLimit)
bc := &BlockChain{
- config: config,
- chainDb: chainDb,
- stateCache: state.NewDatabase(chainDb),
+ chainConfig: chainConfig,
+ cacheConfig: cacheConfig,
+ db: db,
+ triegc: prque.New(),
+ stateCache: state.NewDatabase(db),
quit: make(chan struct{}),
bodyCache: bodyCache,
bodyRLPCache: bodyRLPCache,
@@ -139,11 +161,11 @@ func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, engine co
vmConfig: vmConfig,
badBlocks: badBlocks,
}
- bc.SetValidator(NewBlockValidator(config, bc, engine))
- bc.SetProcessor(NewStateProcessor(config, bc, engine))
+ bc.SetValidator(NewBlockValidator(chainConfig, bc, engine))
+ bc.SetProcessor(NewStateProcessor(chainConfig, bc, engine))
var err error
- bc.hc, err = NewHeaderChain(chainDb, config, engine, bc.getProcInterrupt)
+ bc.hc, err = NewHeaderChain(db, chainConfig, engine, bc.getProcInterrupt)
if err != nil {
return nil, err
}
@@ -180,7 +202,7 @@ func (bc *BlockChain) getProcInterrupt() bool {
// assumes that the chain manager mutex is held.
func (bc *BlockChain) loadLastState() error {
// Restore the last known head block
- head := GetHeadBlockHash(bc.chainDb)
+ head := GetHeadBlockHash(bc.db)
if head == (common.Hash{}) {
// Corrupt or empty database, init from scratch
log.Warn("Empty database, resetting chain")
@@ -196,15 +218,17 @@ func (bc *BlockChain) loadLastState() error {
// Make sure the state associated with the block is available
if _, err := state.New(currentBlock.Root(), bc.stateCache); err != nil {
// Dangling block without a state associated, init from scratch
- log.Warn("Head state missing, resetting chain", "number", currentBlock.Number(), "hash", currentBlock.Hash())
- return bc.Reset()
+ log.Warn("Head state missing, repairing chain", "number", currentBlock.Number(), "hash", currentBlock.Hash())
+ if err := bc.repair(&currentBlock); err != nil {
+ return err
+ }
}
// Everything seems to be fine, set as the head block
bc.currentBlock = currentBlock
// Restore the last known head header
currentHeader := bc.currentBlock.Header()
- if head := GetHeadHeaderHash(bc.chainDb); head != (common.Hash{}) {
+ if head := GetHeadHeaderHash(bc.db); head != (common.Hash{}) {
if header := bc.GetHeaderByHash(head); header != nil {
currentHeader = header
}
@@ -213,7 +237,7 @@ func (bc *BlockChain) loadLastState() error {
// Restore the last known head fast block
bc.currentFastBlock = bc.currentBlock
- if head := GetHeadFastBlockHash(bc.chainDb); head != (common.Hash{}) {
+ if head := GetHeadFastBlockHash(bc.db); head != (common.Hash{}) {
if block := bc.GetBlockByHash(head); block != nil {
bc.currentFastBlock = block
}
@@ -243,7 +267,7 @@ func (bc *BlockChain) SetHead(head uint64) error {
// Rewind the header chain, deleting all block bodies until then
delFn := func(hash common.Hash, num uint64) {
- DeleteBody(bc.chainDb, hash, num)
+ DeleteBody(bc.db, hash, num)
}
bc.hc.SetHead(head, delFn)
currentHeader := bc.hc.CurrentHeader()
@@ -275,10 +299,10 @@ func (bc *BlockChain) SetHead(head uint64) error {
if bc.currentFastBlock == nil {
bc.currentFastBlock = bc.genesisBlock
}
- if err := WriteHeadBlockHash(bc.chainDb, bc.currentBlock.Hash()); err != nil {
+ if err := WriteHeadBlockHash(bc.db, bc.currentBlock.Hash()); err != nil {
log.Crit("Failed to reset head full block", "err", err)
}
- if err := WriteHeadFastBlockHash(bc.chainDb, bc.currentFastBlock.Hash()); err != nil {
+ if err := WriteHeadFastBlockHash(bc.db, bc.currentFastBlock.Hash()); err != nil {
log.Crit("Failed to reset head fast block", "err", err)
}
return bc.loadLastState()
@@ -292,7 +316,7 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error {
if block == nil {
return fmt.Errorf("non existent block [%x…]", hash[:4])
}
- if _, err := trie.NewSecure(block.Root(), bc.chainDb, 0); err != nil {
+ if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB(), 0); err != nil {
return err
}
// If all checks out, manually set the head block
@@ -305,21 +329,13 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error {
}
// GasLimit returns the gas limit of the current HEAD block.
-func (bc *BlockChain) GasLimit() *big.Int {
+func (bc *BlockChain) GasLimit() uint64 {
bc.mu.RLock()
defer bc.mu.RUnlock()
return bc.currentBlock.GasLimit()
}
-// LastBlockHash return the hash of the HEAD block.
-func (bc *BlockChain) LastBlockHash() common.Hash {
- bc.mu.RLock()
- defer bc.mu.RUnlock()
-
- return bc.currentBlock.Hash()
-}
-
// CurrentBlock retrieves the current head block of the canonical chain. The
// block is retrieved from the blockchain's internal cache.
func (bc *BlockChain) CurrentBlock() *types.Block {
@@ -338,15 +354,6 @@ func (bc *BlockChain) CurrentFastBlock() *types.Block {
return bc.currentFastBlock
}
-// Status returns status information about the current chain such as the HEAD Td,
-// the HEAD hash and the hash of the genesis block.
-func (bc *BlockChain) Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash) {
- bc.mu.RLock()
- defer bc.mu.RUnlock()
-
- return bc.GetTd(bc.currentBlock.Hash(), bc.currentBlock.NumberU64()), bc.currentBlock.Hash(), bc.genesisBlock.Hash()
-}
-
// SetProcessor sets the processor required for making state modifications.
func (bc *BlockChain) SetProcessor(processor Processor) {
bc.procmu.Lock()
@@ -404,7 +411,7 @@ func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error {
if err := bc.hc.WriteTd(genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()); err != nil {
log.Crit("Failed to write genesis block TD", "err", err)
}
- if err := WriteBlock(bc.chainDb, genesis); err != nil {
+ if err := WriteBlock(bc.db, genesis); err != nil {
log.Crit("Failed to write genesis block", "err", err)
}
bc.genesisBlock = genesis
@@ -417,6 +424,24 @@ func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error {
return nil
}
+// repair tries to repair the current blockchain by rolling back the current block
+// until one with associated state is found. This is needed to fix incomplete db
+// writes caused either by crashes/power outages, or simply non-committed tries.
+//
+// This method only rolls back the current block. The current header and current
+// fast block are left intact.
+func (bc *BlockChain) repair(head **types.Block) error {
+ for {
+ // Abort if we've rewound to a head block that does have associated state
+ if _, err := state.New((*head).Root(), bc.stateCache); err == nil {
+ log.Info("Rewound blockchain to past state", "number", (*head).Number(), "hash", (*head).Hash())
+ return nil
+ }
+ // Otherwise rewind one block and recheck state availability there
+ (*head) = bc.GetBlock((*head).ParentHash(), (*head).NumberU64()-1)
+ }
+}
+
// Export writes the active chain to the given writer.
func (bc *BlockChain) Export(w io.Writer) error {
return bc.ExportN(w, uint64(0), bc.currentBlock.NumberU64())
@@ -454,22 +479,22 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error {
// Note, this function assumes that the `mu` mutex is held!
func (bc *BlockChain) insert(block *types.Block) {
// If the block is on a side chain or an unknown one, force other heads onto it too
- updateHeads := GetCanonicalHash(bc.chainDb, block.NumberU64()) != block.Hash()
+ updateHeads := GetCanonicalHash(bc.db, block.NumberU64()) != block.Hash()
// Add the block to the canonical chain number scheme and mark as the head
- if err := WriteCanonicalHash(bc.chainDb, block.Hash(), block.NumberU64()); err != nil {
+ if err := WriteCanonicalHash(bc.db, block.Hash(), block.NumberU64()); err != nil {
log.Crit("Failed to insert block number", "err", err)
}
- if err := WriteHeadBlockHash(bc.chainDb, block.Hash()); err != nil {
+ if err := WriteHeadBlockHash(bc.db, block.Hash()); err != nil {
log.Crit("Failed to insert head block hash", "err", err)
}
bc.currentBlock = block
- // If the block is better than out head or is on a different chain, force update heads
+ // If the block is better than our head or is on a different chain, force update heads
if updateHeads {
bc.hc.SetCurrentHeader(block.Header())
- if err := WriteHeadFastBlockHash(bc.chainDb, block.Hash()); err != nil {
+ if err := WriteHeadFastBlockHash(bc.db, block.Hash()); err != nil {
log.Crit("Failed to insert head fast block hash", "err", err)
}
bc.currentFastBlock = block
@@ -489,7 +514,7 @@ func (bc *BlockChain) GetBody(hash common.Hash) *types.Body {
body := cached.(*types.Body)
return body
}
- body := GetBody(bc.chainDb, hash, bc.hc.GetBlockNumber(hash))
+ body := GetBody(bc.db, hash, bc.hc.GetBlockNumber(hash))
if body == nil {
return nil
}
@@ -505,7 +530,7 @@ func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue {
if cached, ok := bc.bodyRLPCache.Get(hash); ok {
return cached.(rlp.RawValue)
}
- body := GetBodyRLP(bc.chainDb, hash, bc.hc.GetBlockNumber(hash))
+ body := GetBodyRLP(bc.db, hash, bc.hc.GetBlockNumber(hash))
if len(body) == 0 {
return nil
}
@@ -519,21 +544,25 @@ func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool {
if bc.blockCache.Contains(hash) {
return true
}
- ok, _ := bc.chainDb.Has(blockBodyKey(hash, number))
+ ok, _ := bc.db.Has(blockBodyKey(hash, number))
return ok
}
+// HasState checks if state trie is fully present in the database or not.
+func (bc *BlockChain) HasState(hash common.Hash) bool {
+ _, err := bc.stateCache.OpenTrie(hash)
+ return err == nil
+}
+
// HasBlockAndState checks if a block and associated state trie is fully present
// in the database or not, caching it if present.
-func (bc *BlockChain) HasBlockAndState(hash common.Hash) bool {
+func (bc *BlockChain) HasBlockAndState(hash common.Hash, number uint64) bool {
// Check first that the block itself is known
- block := bc.GetBlockByHash(hash)
+ block := bc.GetBlock(hash, number)
if block == nil {
return false
}
- // Ensure the associated state is also present
- _, err := bc.stateCache.OpenTrie(block.Root())
- return err == nil
+ return bc.HasState(block.Root())
}
// GetBlock retrieves a block from the database by hash and number,
@@ -543,7 +572,7 @@ func (bc *BlockChain) GetBlock(hash common.Hash, number uint64) *types.Block {
if block, ok := bc.blockCache.Get(hash); ok {
return block.(*types.Block)
}
- block := GetBlock(bc.chainDb, hash, number)
+ block := GetBlock(bc.db, hash, number)
if block == nil {
return nil
}
@@ -560,13 +589,18 @@ func (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block {
// GetBlockByNumber retrieves a block from the database by number, caching it
// (associated with its hash) if found.
func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block {
- hash := GetCanonicalHash(bc.chainDb, number)
+ hash := GetCanonicalHash(bc.db, number)
if hash == (common.Hash{}) {
return nil
}
return bc.GetBlock(hash, number)
}
+// GetReceiptsByHash retrieves the receipts for all transactions in a given block.
+func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts {
+ return GetBlockReceipts(bc.db, hash, GetBlockNumber(bc.db, hash))
+}
+
// GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors.
// [deprecated by eth/62]
func (bc *BlockChain) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block) {
@@ -594,6 +628,12 @@ func (bc *BlockChain) GetUnclesInChain(block *types.Block, length int) []*types.
return uncles
}
+// TrieNode retrieves a blob of data associated with a trie node (or code hash)
+// either from ephemeral in-memory cache, or from persistent storage.
+func (bc *BlockChain) TrieNode(hash common.Hash) ([]byte, error) {
+ return bc.stateCache.TrieDB().Node(hash)
+}
+
// Stop stops the blockchain service. If any imports are currently in progress
// it will abort them using the procInterrupt.
func (bc *BlockChain) Stop() {
@@ -606,6 +646,33 @@ func (bc *BlockChain) Stop() {
atomic.StoreInt32(&bc.procInterrupt, 1)
bc.wg.Wait()
+
+ // Ensure the state of a recent block is also stored to disk before exiting.
+ // It is fine if this state does not exist (fast start/stop cycle), but it is
+ // advisable to leave an N block gap from the head so 1) a restart loads up
+ // the last N blocks as sync assistance to remote nodes; 2) a restart during
+ // a (small) reorg doesn't require deep reprocesses; 3) chain "repair" from
+ // missing states are constantly tested.
+ //
+ // This may be tuned a bit on mainnet if its too annoying to reprocess the last
+ // N blocks.
+ if !bc.cacheConfig.Disabled {
+ triedb := bc.stateCache.TrieDB()
+ if number := bc.CurrentBlock().NumberU64(); number >= triesInMemory {
+ recent := bc.GetBlockByNumber(bc.CurrentBlock().NumberU64() - triesInMemory + 1)
+
+ log.Info("Writing cached state to disk", "block", recent.Number(), "hash", recent.Hash(), "root", recent.Root())
+ if err := triedb.Commit(recent.Root(), true); err != nil {
+ log.Error("Failed to commit recent state trie", "err", err)
+ }
+ }
+ for !bc.triegc.Empty() {
+ triedb.Dereference(bc.triegc.PopItem().(common.Hash), common.Hash{})
+ }
+ if size := triedb.Size(); size != 0 {
+ log.Error("Dangling trie nodes after full cleanup")
+ }
+ }
log.Info("Blockchain manager stopped")
}
@@ -650,11 +717,11 @@ func (bc *BlockChain) Rollback(chain []common.Hash) {
}
if bc.currentFastBlock.Hash() == hash {
bc.currentFastBlock = bc.GetBlock(bc.currentFastBlock.ParentHash(), bc.currentFastBlock.NumberU64()-1)
- WriteHeadFastBlockHash(bc.chainDb, bc.currentFastBlock.Hash())
+ WriteHeadFastBlockHash(bc.db, bc.currentFastBlock.Hash())
}
if bc.currentBlock.Hash() == hash {
bc.currentBlock = bc.GetBlock(bc.currentBlock.ParentHash(), bc.currentBlock.NumberU64()-1)
- WriteHeadBlockHash(bc.chainDb, bc.currentBlock.Hash())
+ WriteHeadBlockHash(bc.db, bc.currentBlock.Hash())
}
}
}
@@ -677,9 +744,9 @@ func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts ty
}
// The used gas can be calculated based on previous receipts
if j == 0 {
- receipts[j].GasUsed = new(big.Int).Set(receipts[j].CumulativeGasUsed)
+ receipts[j].GasUsed = receipts[j].CumulativeGasUsed
} else {
- receipts[j].GasUsed = new(big.Int).Sub(receipts[j].CumulativeGasUsed, receipts[j-1].CumulativeGasUsed)
+ receipts[j].GasUsed = receipts[j].CumulativeGasUsed - receipts[j-1].CumulativeGasUsed
}
// The derived log fields can simply be set from the block and transaction
for k := 0; k < len(receipts[j].Logs); k++ {
@@ -713,7 +780,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
stats = struct{ processed, ignored int32 }{}
start = time.Now()
bytes = 0
- batch = bc.chainDb.NewBatch()
+ batch = bc.db.NewBatch()
)
for i, block := range blockChain {
receipts := receiptChain[i]
@@ -731,7 +798,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
continue
}
// Compute all the non-consensus fields of the receipts
- SetReceiptsData(bc.config, block, receipts)
+ SetReceiptsData(bc.chainConfig, block, receipts)
// Write all the data out into the database
if err := WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()); err != nil {
return i, fmt.Errorf("failed to write block body: %v", err)
@@ -749,7 +816,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
return 0, err
}
bytes += batch.ValueSize()
- batch = bc.chainDb.NewBatch()
+ batch.Reset()
}
}
if batch.ValueSize() > 0 {
@@ -764,7 +831,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
head := blockChain[len(blockChain)-1]
if td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case
if bc.GetTd(bc.currentFastBlock.Hash(), bc.currentFastBlock.NumberU64()).Cmp(td) < 0 {
- if err := WriteHeadFastBlockHash(bc.chainDb, head.Hash()); err != nil {
+ if err := WriteHeadFastBlockHash(bc.db, head.Hash()); err != nil {
log.Crit("Failed to update head fast block hash", "err", err)
}
bc.currentFastBlock = head
@@ -775,15 +842,33 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
log.Info("Imported new block receipts",
"count", stats.processed,
"elapsed", common.PrettyDuration(time.Since(start)),
- "bytes", bytes,
"number", head.Number(),
"hash", head.Hash(),
+ "size", common.StorageSize(bytes),
"ignored", stats.ignored)
return 0, nil
}
-// WriteBlock writes the block to the chain.
-func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) {
+var lastWrite uint64
+
+// WriteBlockWithoutState writes only the block and its metadata to the database,
+// but does not write any state. This is used to construct competing side forks
+// up to the point where they exceed the canonical total difficulty.
+func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (err error) {
+ bc.wg.Add(1)
+ defer bc.wg.Done()
+
+ if err := bc.hc.WriteTd(block.Hash(), block.NumberU64(), td); err != nil {
+ return err
+ }
+ if err := WriteBlock(bc.db, block); err != nil {
+ return err
+ }
+ return nil
+}
+
+// WriteBlockWithState writes the block and all associated state to the database.
+func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) {
bc.wg.Add(1)
defer bc.wg.Done()
@@ -804,17 +889,73 @@ func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.R
return NonStatTy, err
}
// Write other block data using a batch.
- batch := bc.chainDb.NewBatch()
+ batch := bc.db.NewBatch()
if err := WriteBlock(batch, block); err != nil {
return NonStatTy, err
}
- if _, err := state.CommitTo(batch, bc.config.IsEIP158(block.Number())); err != nil {
+ root, err := state.Commit(bc.chainConfig.IsEIP158(block.Number()))
+ if err != nil {
return NonStatTy, err
}
+ triedb := bc.stateCache.TrieDB()
+
+ // If we're running an archive node, always flush
+ if bc.cacheConfig.Disabled {
+ if err := triedb.Commit(root, false); err != nil {
+ return NonStatTy, err
+ }
+ } else {
+ // Full but not archive node, do proper garbage collection
+ triedb.Reference(root, common.Hash{}) // metadata reference to keep trie alive
+ bc.triegc.Push(root, -float32(block.NumberU64()))
+
+ if current := block.NumberU64(); current > triesInMemory {
+ // Find the next state trie we need to commit
+ header := bc.GetHeaderByNumber(current - triesInMemory)
+ chosen := header.Number.Uint64()
+
+ // Only write to disk if we exceeded our memory allowance *and* also have at
+ // least a given number of tries gapped.
+ var (
+ size = triedb.Size()
+ limit = common.StorageSize(bc.cacheConfig.TrieNodeLimit) * 1024 * 1024
+ )
+ if size > limit || bc.gcproc > bc.cacheConfig.TrieTimeLimit {
+ // If we're exceeding limits but haven't reached a large enough memory gap,
+ // warn the user that the system is becoming unstable.
+ if chosen < lastWrite+triesInMemory {
+ switch {
+ case size >= 2*limit:
+ log.Error("Trie memory critical, forcing to disk", "size", size, "limit", limit, "optimum", float64(chosen-lastWrite)/triesInMemory)
+ case bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit:
+ log.Error("Trie timing critical, forcing to disk", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/triesInMemory)
+ case size > limit:
+ log.Warn("Trie memory at dangerous levels", "size", size, "limit", limit, "optimum", float64(chosen-lastWrite)/triesInMemory)
+ case bc.gcproc > bc.cacheConfig.TrieTimeLimit:
+ log.Warn("Trie timing at dangerous levels", "time", bc.gcproc, "limit", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/triesInMemory)
+ }
+ }
+ // If optimum or critical limits reached, write to disk
+ if chosen >= lastWrite+triesInMemory || size >= 2*limit || bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit {
+ triedb.Commit(header.Root, true)
+ lastWrite = chosen
+ bc.gcproc = 0
+ }
+ }
+ // Garbage collect anything below our required write retention
+ for !bc.triegc.Empty() {
+ root, number := bc.triegc.Pop()
+ if uint64(-number) > chosen {
+ bc.triegc.Push(root, number)
+ break
+ }
+ triedb.Dereference(root.(common.Hash), common.Hash{})
+ }
+ }
+ }
if err := WriteBlockReceipts(batch, block.Hash(), block.NumberU64(), receipts); err != nil {
return NonStatTy, err
}
-
// If the total difficulty is higher than our known, add it to the canonical chain
// Second clause in the if statement reduces the vulnerability to selfish mining.
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
@@ -835,7 +976,7 @@ func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.R
return NonStatTy, err
}
// Write hash preimages
- if err := WritePreimages(bc.chainDb, block.NumberU64(), state.Preimages()); err != nil {
+ if err := WritePreimages(bc.db, block.NumberU64(), state.Preimages()); err != nil {
return NonStatTy, err
}
status = CanonStatTy
@@ -927,31 +1068,60 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
if err == nil {
err = bc.Validator().ValidateBody(block)
}
- if err != nil {
- if err == ErrKnownBlock {
- stats.ignored++
- continue
+ switch {
+ case err == ErrKnownBlock:
+ stats.ignored++
+ continue
+
+ case err == consensus.ErrFutureBlock:
+ // Allow up to MaxFuture second in the future blocks. If this limit is exceeded
+ // the chain is discarded and processed at a later time if given.
+ max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks)
+ if block.Time().Cmp(max) > 0 {
+ return i, events, coalescedLogs, fmt.Errorf("future block: %v > %v", block.Time(), max)
}
+ bc.futureBlocks.Add(block.Hash(), block)
+ stats.queued++
+ continue
- if err == consensus.ErrFutureBlock {
- // Allow up to MaxFuture second in the future blocks. If this limit
- // is exceeded the chain is discarded and processed at a later time
- // if given.
- max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks)
- if block.Time().Cmp(max) > 0 {
- return i, events, coalescedLogs, fmt.Errorf("future block: %v > %v", block.Time(), max)
+ case err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(block.ParentHash()):
+ bc.futureBlocks.Add(block.Hash(), block)
+ stats.queued++
+ continue
+
+ case err == consensus.ErrPrunedAncestor:
+ // Block competing with the canonical chain, store in the db, but don't process
+ // until the competitor TD goes above the canonical TD
+ localTd := bc.GetTd(bc.currentBlock.Hash(), bc.currentBlock.NumberU64())
+ externTd := new(big.Int).Add(bc.GetTd(block.ParentHash(), block.NumberU64()-1), block.Difficulty())
+ if localTd.Cmp(externTd) > 0 {
+ if err = bc.WriteBlockWithoutState(block, externTd); err != nil {
+ return i, events, coalescedLogs, err
}
- bc.futureBlocks.Add(block.Hash(), block)
- stats.queued++
continue
}
+ // Competitor chain beat canonical, gather all blocks from the common ancestor
+ var winner []*types.Block
- if err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(block.ParentHash()) {
- bc.futureBlocks.Add(block.Hash(), block)
- stats.queued++
- continue
+ parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1)
+ for !bc.HasState(parent.Root()) {
+ winner = append(winner, parent)
+ parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1)
+ }
+ for j := 0; j < len(winner)/2; j++ {
+ winner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j]
+ }
+ // Import all the pruned blocks to make the state available
+ bc.chainmu.Unlock()
+ _, evs, logs, err := bc.insertChain(winner)
+ bc.chainmu.Lock()
+ events, coalescedLogs = evs, logs
+
+ if err != nil {
+ return i, events, coalescedLogs, err
}
+ case err != nil:
bc.reportBlock(block, nil, err)
return i, events, coalescedLogs, err
}
@@ -979,8 +1149,10 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
bc.reportBlock(block, receipts, err)
return i, events, coalescedLogs, err
}
+ proctime := time.Since(bstart)
+
// Write the block to the chain and get the status.
- status, err := bc.WriteBlockAndState(block, receipts, state)
+ status, err := bc.WriteBlockWithState(block, receipts, state)
if err != nil {
return i, events, coalescedLogs, err
}
@@ -994,6 +1166,9 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
events = append(events, ChainEvent{block, block.Hash(), logs})
lastCanon = block
+ // Only count canonical blocks for GC processing time
+ bc.gcproc += proctime
+
case SideStatTy:
log.Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), "diff", block.Difficulty(), "elapsed",
common.PrettyDuration(time.Since(bstart)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()))
@@ -1002,11 +1177,11 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
events = append(events, ChainSideEvent{block})
}
stats.processed++
- stats.usedGas += usedGas.Uint64()
- stats.report(chain, i)
+ stats.usedGas += usedGas
+ stats.report(chain, i, bc.stateCache.TrieDB().Size())
}
// Append a single chain head event if we've progressed the chain
- if lastCanon != nil && bc.LastBlockHash() == lastCanon.Hash() {
+ if lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() {
events = append(events, ChainHeadEvent{lastCanon})
}
return 0, events, coalescedLogs, nil
@@ -1026,7 +1201,7 @@ const statsReportLimit = 8 * time.Second
// report prints statistics if some number of blocks have been processed
// or more than a few seconds have passed since the last message.
-func (st *insertStats) report(chain []*types.Block, index int) {
+func (st *insertStats) report(chain []*types.Block, index int, cache common.StorageSize) {
// Fetch the timings for the batch
var (
now = mclock.Now()
@@ -1041,7 +1216,7 @@ func (st *insertStats) report(chain []*types.Block, index int) {
context := []interface{}{
"blocks", st.processed, "txs", txs, "mgas", float64(st.usedGas) / 1000000,
"elapsed", common.PrettyDuration(elapsed), "mgasps", float64(st.usedGas) * 1000 / float64(elapsed),
- "number", end.Number(), "hash", end.Hash(),
+ "number", end.Number(), "hash", end.Hash(), "cache", cache,
}
if st.queued > 0 {
context = append(context, []interface{}{"queued", st.queued}...)
@@ -1077,7 +1252,7 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error {
// These logs are later announced as deleted.
collectLogs = func(h common.Hash) {
// Coalesce logs and set 'Removed'.
- receipts := GetBlockReceipts(bc.chainDb, h, bc.hc.GetBlockNumber(h))
+ receipts := GetBlockReceipts(bc.db, h, bc.hc.GetBlockNumber(h))
for _, receipt := range receipts {
for _, log := range receipt.Logs {
del := *log
@@ -1140,24 +1315,23 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error {
} else {
log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "newnum", newBlock.Number(), "newhash", newBlock.Hash())
}
+ // Insert the new chain, taking care of the proper incremental order
var addedTxs types.Transactions
- // insert blocks. Order does not matter. Last block will be written in ImportChain itself which creates the new head properly
- for _, block := range newChain {
+ for i := len(newChain) - 1; i >= 0; i-- {
// insert the block in the canonical way, re-writing history
- bc.insert(block)
+ bc.insert(newChain[i])
// write lookup entries for hash based transaction/receipt searches
- if err := WriteTxLookupEntries(bc.chainDb, block); err != nil {
+ if err := WriteTxLookupEntries(bc.db, newChain[i]); err != nil {
return err
}
- addedTxs = append(addedTxs, block.Transactions()...)
+ addedTxs = append(addedTxs, newChain[i].Transactions()...)
}
-
// calculate the difference between deleted and added transactions
diff := types.TxDifference(deletedTxs, addedTxs)
// When transactions get deleted from the database that means the
// receipts that were created in the fork must also be deleted
for _, tx := range diff {
- DeleteTxLookupEntry(bc.chainDb, tx.Hash())
+ DeleteTxLookupEntry(bc.db, tx.Hash())
}
if len(deletedLogs) > 0 {
go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs})
@@ -1196,10 +1370,11 @@ func (bc *BlockChain) PostChainEvents(events []interface{}, logs []*types.Log) {
}
func (bc *BlockChain) update() {
- futureTimer := time.Tick(5 * time.Second)
+ futureTimer := time.NewTicker(5 * time.Second)
+ defer futureTimer.Stop()
for {
select {
- case <-futureTimer:
+ case <-futureTimer.C:
bc.procFutureBlocks()
case <-bc.quit:
return
@@ -1248,7 +1423,7 @@ Hash: 0x%x
Error: %v
##############################
-`, bc.config, block.Number(), block.Hash(), receiptString, err))
+`, bc.chainConfig, block.Number(), block.Hash(), receiptString, err))
}
// InsertHeaderChain attempts to insert the given header chain in to the local
@@ -1355,7 +1530,7 @@ func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header {
}
// Config retrieves the blockchain's chain configuration.
-func (bc *BlockChain) Config() *params.ChainConfig { return bc.config }
+func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig }
// Engine retrieves the blockchain's consensus engine.
func (bc *BlockChain) Engine() consensus.Engine { return bc.engine }
diff --git a/core/blockchain_test.go b/core/blockchain_test.go
index cb1df8d4b..635379161 100644
--- a/core/blockchain_test.go
+++ b/core/blockchain_test.go
@@ -46,7 +46,7 @@ func newTestBlockChain(fake bool) *BlockChain {
if !fake {
engine = ethash.NewTester()
}
- blockchain, err := NewBlockChain(db, gspec.Config, engine, vm.Config{})
+ blockchain, err := NewBlockChain(db, nil, gspec.Config, engine, vm.Config{})
if err != nil {
panic(err)
}
@@ -57,7 +57,7 @@ func newTestBlockChain(fake bool) *BlockChain {
// Test fork of length N starting from block i
func testFork(t *testing.T, blockchain *BlockChain, i, n int, full bool, comparator func(td1, td2 *big.Int)) {
// Copy old chain up to #i into a new db
- db, blockchain2, err := newCanonical(i, full)
+ db, blockchain2, err := newCanonical(ethash.NewFaker(), i, full)
if err != nil {
t.Fatal("could not make new canonical in testFork", err)
}
@@ -81,12 +81,12 @@ func testFork(t *testing.T, blockchain *BlockChain, i, n int, full bool, compara
headerChainB []*types.Header
)
if full {
- blockChainB = makeBlockChain(blockchain2.CurrentBlock(), n, db, forkSeed)
+ blockChainB = makeBlockChain(blockchain2.CurrentBlock(), n, ethash.NewFaker(), db, forkSeed)
if _, err := blockchain2.InsertChain(blockChainB); err != nil {
t.Fatalf("failed to insert forking chain: %v", err)
}
} else {
- headerChainB = makeHeaderChain(blockchain2.CurrentHeader(), n, db, forkSeed)
+ headerChainB = makeHeaderChain(blockchain2.CurrentHeader(), n, ethash.NewFaker(), db, forkSeed)
if _, err := blockchain2.InsertHeaderChain(headerChainB, 1); err != nil {
t.Fatalf("failed to insert forking chain: %v", err)
}
@@ -148,9 +148,9 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error {
return err
}
blockchain.mu.Lock()
- WriteTd(blockchain.chainDb, block.Hash(), block.NumberU64(), new(big.Int).Add(block.Difficulty(), blockchain.GetTdByHash(block.ParentHash())))
- WriteBlock(blockchain.chainDb, block)
- statedb.CommitTo(blockchain.chainDb, false)
+ WriteTd(blockchain.db, block.Hash(), block.NumberU64(), new(big.Int).Add(block.Difficulty(), blockchain.GetTdByHash(block.ParentHash())))
+ WriteBlock(blockchain.db, block)
+ statedb.Commit(false)
blockchain.mu.Unlock()
}
return nil
@@ -166,8 +166,8 @@ func testHeaderChainImport(chain []*types.Header, blockchain *BlockChain) error
}
// Manually insert the header into the database, but don't reorganise (allows subsequent testing)
blockchain.mu.Lock()
- WriteTd(blockchain.chainDb, header.Hash(), header.Number.Uint64(), new(big.Int).Add(header.Difficulty, blockchain.GetTdByHash(header.ParentHash)))
- WriteHeader(blockchain.chainDb, header)
+ WriteTd(blockchain.db, header.Hash(), header.Number.Uint64(), new(big.Int).Add(header.Difficulty, blockchain.GetTdByHash(header.ParentHash)))
+ WriteHeader(blockchain.db, header)
blockchain.mu.Unlock()
}
return nil
@@ -186,9 +186,9 @@ func TestLastBlock(t *testing.T) {
bchain := newTestBlockChain(false)
defer bchain.Stop()
- block := makeBlockChain(bchain.CurrentBlock(), 1, bchain.chainDb, 0)[0]
+ block := makeBlockChain(bchain.CurrentBlock(), 1, ethash.NewFaker(), bchain.db, 0)[0]
bchain.insert(block)
- if block.Hash() != GetHeadBlockHash(bchain.chainDb) {
+ if block.Hash() != GetHeadBlockHash(bchain.db) {
t.Errorf("Write/Get HeadBlockHash failed")
}
}
@@ -202,7 +202,7 @@ func testExtendCanonical(t *testing.T, full bool) {
length := 5
// Make first chain starting from genesis
- _, processor, err := newCanonical(length, full)
+ _, processor, err := newCanonical(ethash.NewFaker(), length, full)
if err != nil {
t.Fatalf("failed to make new canonical chain: %v", err)
}
@@ -230,7 +230,7 @@ func testShorterFork(t *testing.T, full bool) {
length := 10
// Make first chain starting from genesis
- _, processor, err := newCanonical(length, full)
+ _, processor, err := newCanonical(ethash.NewFaker(), length, full)
if err != nil {
t.Fatalf("failed to make new canonical chain: %v", err)
}
@@ -260,7 +260,7 @@ func testLongerFork(t *testing.T, full bool) {
length := 10
// Make first chain starting from genesis
- _, processor, err := newCanonical(length, full)
+ _, processor, err := newCanonical(ethash.NewFaker(), length, full)
if err != nil {
t.Fatalf("failed to make new canonical chain: %v", err)
}
@@ -290,7 +290,7 @@ func testEqualFork(t *testing.T, full bool) {
length := 10
// Make first chain starting from genesis
- _, processor, err := newCanonical(length, full)
+ _, processor, err := newCanonical(ethash.NewFaker(), length, full)
if err != nil {
t.Fatalf("failed to make new canonical chain: %v", err)
}
@@ -317,7 +317,7 @@ func TestBrokenBlockChain(t *testing.T) { testBrokenChain(t, true) }
func testBrokenChain(t *testing.T, full bool) {
// Make chain starting from genesis
- db, blockchain, err := newCanonical(10, full)
+ db, blockchain, err := newCanonical(ethash.NewFaker(), 10, full)
if err != nil {
t.Fatalf("failed to make new canonical chain: %v", err)
}
@@ -325,12 +325,12 @@ func testBrokenChain(t *testing.T, full bool) {
// Create a forked chain, and try to insert with a missing link
if full {
- chain := makeBlockChain(blockchain.CurrentBlock(), 5, db, forkSeed)[1:]
+ chain := makeBlockChain(blockchain.CurrentBlock(), 5, ethash.NewFaker(), db, forkSeed)[1:]
if err := testBlockChainImport(chain, blockchain); err == nil {
t.Errorf("broken block chain not reported")
}
} else {
- chain := makeHeaderChain(blockchain.CurrentHeader(), 5, db, forkSeed)[1:]
+ chain := makeHeaderChain(blockchain.CurrentHeader(), 5, ethash.NewFaker(), db, forkSeed)[1:]
if err := testHeaderChainImport(chain, blockchain); err == nil {
t.Errorf("broken header chain not reported")
}
@@ -340,11 +340,11 @@ func testBrokenChain(t *testing.T, full bool) {
type bproc struct{}
func (bproc) ValidateBody(*types.Block) error { return nil }
-func (bproc) ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas *big.Int) error {
+func (bproc) ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error {
return nil
}
-func (bproc) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, *big.Int, error) {
- return nil, nil, new(big.Int), nil
+func (bproc) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) {
+ return nil, nil, 0, nil
}
func makeHeaderChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Header {
@@ -496,7 +496,7 @@ func testReorgBadHashes(t *testing.T, full bool) {
}
// Create a new BlockChain and check that it rolled back the state.
- ncm, err := NewBlockChain(bc.chainDb, bc.config, ethash.NewFaker(), vm.Config{})
+ ncm, err := NewBlockChain(bc.db, nil, bc.chainConfig, ethash.NewFaker(), vm.Config{})
if err != nil {
t.Fatalf("failed to create new chain manager: %v", err)
}
@@ -506,8 +506,8 @@ func testReorgBadHashes(t *testing.T, full bool) {
if ncm.CurrentBlock().Hash() != blocks[2].Header().Hash() {
t.Errorf("last block hash mismatch: have: %x, want %x", ncm.CurrentBlock().Hash(), blocks[2].Header().Hash())
}
- if blocks[2].Header().GasLimit.Cmp(ncm.GasLimit()) != 0 {
- t.Errorf("last block gasLimit mismatch: have: %x, want %x", ncm.GasLimit(), blocks[2].Header().GasLimit)
+ if blocks[2].Header().GasLimit != ncm.GasLimit() {
+ t.Errorf("last block gasLimit mismatch: have: %d, want %d", ncm.GasLimit(), blocks[2].Header().GasLimit)
}
} else {
if ncm.CurrentHeader().Hash() != headers[2].Hash() {
@@ -523,7 +523,7 @@ func TestBlocksInsertNonceError(t *testing.T) { testInsertNonceError(t, true) }
func testInsertNonceError(t *testing.T, full bool) {
for i := 1; i < 25 && !t.Failed(); i++ {
// Create a pristine chain and database
- db, blockchain, err := newCanonical(0, full)
+ db, blockchain, err := newCanonical(ethash.NewFaker(), 0, full)
if err != nil {
t.Fatalf("failed to create pristine chain: %v", err)
}
@@ -536,7 +536,7 @@ func testInsertNonceError(t *testing.T, full bool) {
failNum uint64
)
if full {
- blocks := makeBlockChain(blockchain.CurrentBlock(), i, db, 0)
+ blocks := makeBlockChain(blockchain.CurrentBlock(), i, ethash.NewFaker(), db, 0)
failAt = rand.Int() % len(blocks)
failNum = blocks[failAt].NumberU64()
@@ -544,7 +544,7 @@ func testInsertNonceError(t *testing.T, full bool) {
blockchain.engine = ethash.NewFakeFailer(failNum)
failRes, err = blockchain.InsertChain(blocks)
} else {
- headers := makeHeaderChain(blockchain.CurrentHeader(), i, db, 0)
+ headers := makeHeaderChain(blockchain.CurrentHeader(), i, ethash.NewFaker(), db, 0)
failAt = rand.Int() % len(headers)
failNum = headers[failAt].Number.Uint64()
@@ -588,13 +588,13 @@ func TestFastVsFullChains(t *testing.T) {
genesis = gspec.MustCommit(gendb)
signer = types.NewEIP155Signer(gspec.Config.ChainId)
)
- blocks, receipts := GenerateChain(gspec.Config, genesis, gendb, 1024, func(i int, block *BlockGen) {
+ blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, 1024, func(i int, block *BlockGen) {
block.SetCoinbase(common.Address{0x00})
// If the block number is multiple of 3, send a few bonus transactions to the miner
if i%3 == 2 {
for j := 0; j < i%4+1; j++ {
- tx, err := types.SignTx(types.NewTransaction(block.TxNonce(address), common.Address{0x00}, big.NewInt(1000), bigTxGas, nil, nil), signer, key)
+ tx, err := types.SignTx(types.NewTransaction(block.TxNonce(address), common.Address{0x00}, big.NewInt(1000), params.TxGas, nil, nil), signer, key)
if err != nil {
panic(err)
}
@@ -609,7 +609,7 @@ func TestFastVsFullChains(t *testing.T) {
// Import the chain as an archive node for the comparison baseline
archiveDb, _ := ethdb.NewMemDatabase()
gspec.MustCommit(archiveDb)
- archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), vm.Config{})
+ archive, _ := NewBlockChain(archiveDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer archive.Stop()
if n, err := archive.InsertChain(blocks); err != nil {
@@ -618,7 +618,7 @@ func TestFastVsFullChains(t *testing.T) {
// Fast import the chain as a non-archive node to test
fastDb, _ := ethdb.NewMemDatabase()
gspec.MustCommit(fastDb)
- fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), vm.Config{})
+ fast, _ := NewBlockChain(fastDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer fast.Stop()
headers := make([]*types.Header, len(blocks))
@@ -673,7 +673,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) {
genesis = gspec.MustCommit(gendb)
)
height := uint64(1024)
- blocks, receipts := GenerateChain(gspec.Config, genesis, gendb, int(height), nil)
+ blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil)
// Configure a subchain to roll back
remove := []common.Hash{}
@@ -696,7 +696,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) {
archiveDb, _ := ethdb.NewMemDatabase()
gspec.MustCommit(archiveDb)
- archive, _ := NewBlockChain(archiveDb, gspec.Config, ethash.NewFaker(), vm.Config{})
+ archive, _ := NewBlockChain(archiveDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
if n, err := archive.InsertChain(blocks); err != nil {
t.Fatalf("failed to process block %d: %v", n, err)
}
@@ -709,7 +709,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) {
// Import the chain as a non-archive node and ensure all pointers are updated
fastDb, _ := ethdb.NewMemDatabase()
gspec.MustCommit(fastDb)
- fast, _ := NewBlockChain(fastDb, gspec.Config, ethash.NewFaker(), vm.Config{})
+ fast, _ := NewBlockChain(fastDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer fast.Stop()
headers := make([]*types.Header, len(blocks))
@@ -730,7 +730,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) {
lightDb, _ := ethdb.NewMemDatabase()
gspec.MustCommit(lightDb)
- light, _ := NewBlockChain(lightDb, gspec.Config, ethash.NewFaker(), vm.Config{})
+ light, _ := NewBlockChain(lightDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
if n, err := light.InsertHeaderChain(headers, 1); err != nil {
t.Fatalf("failed to insert header %d: %v", n, err)
}
@@ -767,8 +767,8 @@ func TestChainTxReorgs(t *testing.T) {
// Create two transactions shared between the chains:
// - postponed: transaction included at a later block in the forked chain
// - swapped: transaction included at the same block number in the forked chain
- postponed, _ := types.SignTx(types.NewTransaction(0, addr1, big.NewInt(1000), bigTxGas, nil, nil), signer, key1)
- swapped, _ := types.SignTx(types.NewTransaction(1, addr1, big.NewInt(1000), bigTxGas, nil, nil), signer, key1)
+ postponed, _ := types.SignTx(types.NewTransaction(0, addr1, big.NewInt(1000), params.TxGas, nil, nil), signer, key1)
+ swapped, _ := types.SignTx(types.NewTransaction(1, addr1, big.NewInt(1000), params.TxGas, nil, nil), signer, key1)
// Create two transactions that will be dropped by the forked chain:
// - pastDrop: transaction dropped retroactively from a past block
@@ -781,16 +781,16 @@ func TestChainTxReorgs(t *testing.T) {
// - futureAdd: transaction added after the reorg has already finished
var pastAdd, freshAdd, futureAdd *types.Transaction
- chain, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, gen *BlockGen) {
+ chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 3, func(i int, gen *BlockGen) {
switch i {
case 0:
- pastDrop, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr2, big.NewInt(1000), bigTxGas, nil, nil), signer, key2)
+ pastDrop, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr2, big.NewInt(1000), params.TxGas, nil, nil), signer, key2)
gen.AddTx(pastDrop) // This transaction will be dropped in the fork from below the split point
gen.AddTx(postponed) // This transaction will be postponed till block #3 in the fork
case 2:
- freshDrop, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr2, big.NewInt(1000), bigTxGas, nil, nil), signer, key2)
+ freshDrop, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr2, big.NewInt(1000), params.TxGas, nil, nil), signer, key2)
gen.AddTx(freshDrop) // This transaction will be dropped in the fork from exactly at the split point
gen.AddTx(swapped) // This transaction will be swapped out at the exact height
@@ -799,28 +799,28 @@ func TestChainTxReorgs(t *testing.T) {
}
})
// Import the chain. This runs all block validation rules.
- blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
if i, err := blockchain.InsertChain(chain); err != nil {
t.Fatalf("failed to insert original chain[%d]: %v", i, err)
}
defer blockchain.Stop()
// overwrite the old chain
- chain, _ = GenerateChain(gspec.Config, genesis, db, 5, func(i int, gen *BlockGen) {
+ chain, _ = GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 5, func(i int, gen *BlockGen) {
switch i {
case 0:
- pastAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), bigTxGas, nil, nil), signer, key3)
+ pastAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key3)
gen.AddTx(pastAdd) // This transaction needs to be injected during reorg
case 2:
gen.AddTx(postponed) // This transaction was postponed from block #1 in the original chain
gen.AddTx(swapped) // This transaction was swapped from the exact current spot in the original chain
- freshAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), bigTxGas, nil, nil), signer, key3)
+ freshAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key3)
gen.AddTx(freshAdd) // This transaction will be added exactly at reorg time
case 3:
- futureAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), bigTxGas, nil, nil), signer, key3)
+ futureAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key3)
gen.AddTx(futureAdd) // This transaction will be added after a full reorg
}
})
@@ -870,14 +870,14 @@ func TestLogReorgs(t *testing.T) {
signer = types.NewEIP155Signer(gspec.Config.ChainId)
)
- blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer blockchain.Stop()
rmLogsCh := make(chan RemovedLogsEvent)
blockchain.SubscribeRemovedLogsEvent(rmLogsCh)
- chain, _ := GenerateChain(params.TestChainConfig, genesis, db, 2, func(i int, gen *BlockGen) {
+ chain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) {
if i == 1 {
- tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), big.NewInt(1000000), new(big.Int), code), signer, key1)
+ tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1)
if err != nil {
t.Fatalf("failed to create tx: %v", err)
}
@@ -888,7 +888,7 @@ func TestLogReorgs(t *testing.T) {
t.Fatalf("failed to insert chain: %v", err)
}
- chain, _ = GenerateChain(params.TestChainConfig, genesis, db, 3, func(i int, gen *BlockGen) {})
+ chain, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 3, func(i int, gen *BlockGen) {})
if _, err := blockchain.InsertChain(chain); err != nil {
t.Fatalf("failed to insert forked chain: %v", err)
}
@@ -917,16 +917,16 @@ func TestReorgSideEvent(t *testing.T) {
signer = types.NewEIP155Signer(gspec.Config.ChainId)
)
- blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer blockchain.Stop()
- chain, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, gen *BlockGen) {})
+ chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 3, func(i int, gen *BlockGen) {})
if _, err := blockchain.InsertChain(chain); err != nil {
t.Fatalf("failed to insert chain: %v", err)
}
- replacementBlocks, _ := GenerateChain(gspec.Config, genesis, db, 4, func(i int, gen *BlockGen) {
- tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), big.NewInt(1000000), new(big.Int), nil), signer, key1)
+ replacementBlocks, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 4, func(i int, gen *BlockGen) {
+ tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), nil), signer, key1)
if i == 2 {
gen.OffsetTime(-9)
}
@@ -992,7 +992,7 @@ func TestCanonicalBlockRetrieval(t *testing.T) {
bc := newTestBlockChain(true)
defer bc.Stop()
- chain, _ := GenerateChain(bc.config, bc.genesisBlock, bc.chainDb, 10, func(i int, gen *BlockGen) {})
+ chain, _ := GenerateChain(bc.chainConfig, bc.genesisBlock, ethash.NewFaker(), bc.db, 10, func(i int, gen *BlockGen) {})
var pend sync.WaitGroup
pend.Add(len(chain))
@@ -1003,14 +1003,14 @@ func TestCanonicalBlockRetrieval(t *testing.T) {
// try to retrieve a block by its canonical hash and see if the block data can be retrieved.
for {
- ch := GetCanonicalHash(bc.chainDb, block.NumberU64())
+ ch := GetCanonicalHash(bc.db, block.NumberU64())
if ch == (common.Hash{}) {
continue // busy wait for canonical hash to be written
}
if ch != block.Hash() {
t.Fatalf("unknown canonical hash, want %s, got %s", block.Hash().Hex(), ch.Hex())
}
- fb := GetBlock(bc.chainDb, ch, block.NumberU64())
+ fb := GetBlock(bc.db, ch, block.NumberU64())
if fb == nil {
t.Fatalf("unable to retrieve block %d for canonical hash: %s", block.NumberU64(), ch.Hex())
}
@@ -1043,15 +1043,15 @@ func TestEIP155Transition(t *testing.T) {
genesis = gspec.MustCommit(db)
)
- blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer blockchain.Stop()
- blocks, _ := GenerateChain(gspec.Config, genesis, db, 4, func(i int, block *BlockGen) {
+ blocks, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 4, func(i int, block *BlockGen) {
var (
tx *types.Transaction
err error
basicTx = func(signer types.Signer) (*types.Transaction, error) {
- return types.SignTx(types.NewTransaction(block.TxNonce(address), common.Address{}, new(big.Int), big.NewInt(21000), new(big.Int), nil), signer, key)
+ return types.SignTx(types.NewTransaction(block.TxNonce(address), common.Address{}, new(big.Int), 21000, new(big.Int), nil), signer, key)
}
)
switch i {
@@ -1109,12 +1109,12 @@ func TestEIP155Transition(t *testing.T) {
// generate an invalid chain id transaction
config := &params.ChainConfig{ChainId: big.NewInt(2), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)}
- blocks, _ = GenerateChain(config, blocks[len(blocks)-1], db, 4, func(i int, block *BlockGen) {
+ blocks, _ = GenerateChain(config, blocks[len(blocks)-1], ethash.NewFaker(), db, 4, func(i int, block *BlockGen) {
var (
tx *types.Transaction
err error
basicTx = func(signer types.Signer) (*types.Transaction, error) {
- return types.SignTx(types.NewTransaction(block.TxNonce(address), common.Address{}, new(big.Int), big.NewInt(21000), new(big.Int), nil), signer, key)
+ return types.SignTx(types.NewTransaction(block.TxNonce(address), common.Address{}, new(big.Int), 21000, new(big.Int), nil), signer, key)
}
)
switch i {
@@ -1151,10 +1151,10 @@ func TestEIP161AccountRemoval(t *testing.T) {
}
genesis = gspec.MustCommit(db)
)
- blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer blockchain.Stop()
- blocks, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, block *BlockGen) {
+ blocks, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 3, func(i int, block *BlockGen) {
var (
tx *types.Transaction
err error
@@ -1162,11 +1162,11 @@ func TestEIP161AccountRemoval(t *testing.T) {
)
switch i {
case 0:
- tx, err = types.SignTx(types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), big.NewInt(21000), new(big.Int), nil), signer, key)
+ tx, err = types.SignTx(types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), 21000, new(big.Int), nil), signer, key)
case 1:
- tx, err = types.SignTx(types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), big.NewInt(21000), new(big.Int), nil), signer, key)
+ tx, err = types.SignTx(types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), 21000, new(big.Int), nil), signer, key)
case 2:
- tx, err = types.SignTx(types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), big.NewInt(21000), new(big.Int), nil), signer, key)
+ tx, err = types.SignTx(types.NewTransaction(block.TxNonce(address), theAddr, new(big.Int), 21000, new(big.Int), nil), signer, key)
}
if err != nil {
t.Fatal(err)
@@ -1197,3 +1197,150 @@ func TestEIP161AccountRemoval(t *testing.T) {
t.Error("account should not exist")
}
}
+
+// This is a regression test (i.e. as weird as it is, don't delete it ever), which
+// tests that under weird reorg conditions the blockchain and its internal header-
+// chain return the same latest block/header.
+//
+// https://github.com/ethereum/go-ethereum/pull/15941
+func TestBlockchainHeaderchainReorgConsistency(t *testing.T) {
+ // Generate a canonical chain to act as the main dataset
+ engine := ethash.NewFaker()
+
+ db, _ := ethdb.NewMemDatabase()
+ genesis := new(Genesis).MustCommit(db)
+ blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 64, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) })
+
+ // Generate a bunch of fork blocks, each side forking from the canonical chain
+ forks := make([]*types.Block, len(blocks))
+ for i := 0; i < len(forks); i++ {
+ parent := genesis
+ if i > 0 {
+ parent = blocks[i-1]
+ }
+ fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) })
+ forks[i] = fork[0]
+ }
+ // Import the canonical and fork chain side by side, verifying the current block
+ // and current header consistency
+ diskdb, _ := ethdb.NewMemDatabase()
+ new(Genesis).MustCommit(diskdb)
+
+ chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{})
+ if err != nil {
+ t.Fatalf("failed to create tester chain: %v", err)
+ }
+ for i := 0; i < len(blocks); i++ {
+ if _, err := chain.InsertChain(blocks[i : i+1]); err != nil {
+ t.Fatalf("block %d: failed to insert into chain: %v", i, err)
+ }
+ if chain.CurrentBlock().Hash() != chain.CurrentHeader().Hash() {
+ t.Errorf("block %d: current block/header mismatch: block #%d [%x…], header #%d [%x…]", i, chain.CurrentBlock().Number(), chain.CurrentBlock().Hash().Bytes()[:4], chain.CurrentHeader().Number, chain.CurrentHeader().Hash().Bytes()[:4])
+ }
+ if _, err := chain.InsertChain(forks[i : i+1]); err != nil {
+ t.Fatalf(" fork %d: failed to insert into chain: %v", i, err)
+ }
+ if chain.CurrentBlock().Hash() != chain.CurrentHeader().Hash() {
+ t.Errorf(" fork %d: current block/header mismatch: block #%d [%x…], header #%d [%x…]", i, chain.CurrentBlock().Number(), chain.CurrentBlock().Hash().Bytes()[:4], chain.CurrentHeader().Number, chain.CurrentHeader().Hash().Bytes()[:4])
+ }
+ }
+}
+
+// Tests that importing small side forks doesn't leave junk in the trie database
+// cache (which would eventually cause memory issues).
+func TestTrieForkGC(t *testing.T) {
+ // Generate a canonical chain to act as the main dataset
+ engine := ethash.NewFaker()
+
+ db, _ := ethdb.NewMemDatabase()
+ genesis := new(Genesis).MustCommit(db)
+ blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) })
+
+ // Generate a bunch of fork blocks, each side forking from the canonical chain
+ forks := make([]*types.Block, len(blocks))
+ for i := 0; i < len(forks); i++ {
+ parent := genesis
+ if i > 0 {
+ parent = blocks[i-1]
+ }
+ fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) })
+ forks[i] = fork[0]
+ }
+ // Import the canonical and fork chain side by side, forcing the trie cache to cache both
+ diskdb, _ := ethdb.NewMemDatabase()
+ new(Genesis).MustCommit(diskdb)
+
+ chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{})
+ if err != nil {
+ t.Fatalf("failed to create tester chain: %v", err)
+ }
+ for i := 0; i < len(blocks); i++ {
+ if _, err := chain.InsertChain(blocks[i : i+1]); err != nil {
+ t.Fatalf("block %d: failed to insert into chain: %v", i, err)
+ }
+ if _, err := chain.InsertChain(forks[i : i+1]); err != nil {
+ t.Fatalf("fork %d: failed to insert into chain: %v", i, err)
+ }
+ }
+ // Dereference all the recent tries and ensure no past trie is left in
+ for i := 0; i < triesInMemory; i++ {
+ chain.stateCache.TrieDB().Dereference(blocks[len(blocks)-1-i].Root(), common.Hash{})
+ chain.stateCache.TrieDB().Dereference(forks[len(blocks)-1-i].Root(), common.Hash{})
+ }
+ if len(chain.stateCache.TrieDB().Nodes()) > 0 {
+ t.Fatalf("stale tries still alive after garbase collection")
+ }
+}
+
+// Tests that doing large reorgs works even if the state associated with the
+// forking point is not available any more.
+func TestLargeReorgTrieGC(t *testing.T) {
+ // Generate the original common chain segment and the two competing forks
+ engine := ethash.NewFaker()
+
+ db, _ := ethdb.NewMemDatabase()
+ genesis := new(Genesis).MustCommit(db)
+
+ shared, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 64, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) })
+ original, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) })
+ competitor, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*triesInMemory+1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{3}) })
+
+ // Import the shared chain and the original canonical one
+ diskdb, _ := ethdb.NewMemDatabase()
+ new(Genesis).MustCommit(diskdb)
+
+ chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{})
+ if err != nil {
+ t.Fatalf("failed to create tester chain: %v", err)
+ }
+ if _, err := chain.InsertChain(shared); err != nil {
+ t.Fatalf("failed to insert shared chain: %v", err)
+ }
+ if _, err := chain.InsertChain(original); err != nil {
+ t.Fatalf("failed to insert shared chain: %v", err)
+ }
+ // Ensure that the state associated with the forking point is pruned away
+ if node, _ := chain.stateCache.TrieDB().Node(shared[len(shared)-1].Root()); node != nil {
+ t.Fatalf("common-but-old ancestor still cache")
+ }
+ // Import the competitor chain without exceeding the canonical's TD and ensure
+ // we have not processed any of the blocks (protection against malicious blocks)
+ if _, err := chain.InsertChain(competitor[:len(competitor)-2]); err != nil {
+ t.Fatalf("failed to insert competitor chain: %v", err)
+ }
+ for i, block := range competitor[:len(competitor)-2] {
+ if node, _ := chain.stateCache.TrieDB().Node(block.Root()); node != nil {
+ t.Fatalf("competitor %d: low TD chain became processed", i)
+ }
+ }
+ // Import the head of the competitor chain, triggering the reorg and ensure we
+ // successfully reprocess all the stashed away blocks.
+ if _, err := chain.InsertChain(competitor[len(competitor)-2:]); err != nil {
+ t.Fatalf("failed to finalize competitor chain: %v", err)
+ }
+ for i, block := range competitor[:len(competitor)-triesInMemory] {
+ if node, _ := chain.stateCache.TrieDB().Node(block.Root()); node != nil {
+ t.Fatalf("competitor %d: competing chain state missing", i)
+ }
+ }
+}
diff --git a/core/chain_indexer.go b/core/chain_indexer.go
index 7fb184aaa..158ed8324 100644
--- a/core/chain_indexer.go
+++ b/core/chain_indexer.go
@@ -203,6 +203,9 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainE
if header.ParentHash != prevHash {
// Reorg to the common ancestor (might not exist in light sync mode, skip reorg then)
// TODO(karalabe, zsfelfoldi): This seems a bit brittle, can we detect this case explicitly?
+
+ // TODO(karalabe): This operation is expensive and might block, causing the event system to
+ // potentially also lock up. We need to do with on a different thread somehow.
if h := FindCommonAncestor(c.chainDb, prevHeader, header); h != nil {
c.newHead(h.Number.Uint64(), true)
}
diff --git a/core/chain_makers.go b/core/chain_makers.go
index 59af633df..6744428ff 100644
--- a/core/chain_makers.go
+++ b/core/chain_makers.go
@@ -21,7 +21,7 @@ import (
"math/big"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/consensus/ethash"
+ "github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/consensus/misc"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
@@ -39,11 +39,12 @@ var (
// BlockGen creates blocks for testing.
// See GenerateChain for a detailed explanation.
type BlockGen struct {
- i int
- parent *types.Block
- chain []*types.Block
- header *types.Header
- statedb *state.StateDB
+ i int
+ parent *types.Block
+ chain []*types.Block
+ chainReader consensus.ChainReader
+ header *types.Header
+ statedb *state.StateDB
gasPool *GasPool
txs []*types.Transaction
@@ -51,6 +52,7 @@ type BlockGen struct {
uncles []*types.Header
config *params.ChainConfig
+ engine consensus.Engine
}
// SetCoinbase sets the coinbase of the generated block.
@@ -84,7 +86,7 @@ func (b *BlockGen) AddTx(tx *types.Transaction) {
b.SetCoinbase(common.Address{})
}
b.statedb.Prepare(tx.Hash(), common.Hash{}, len(b.txs))
- receipt, _, err := ApplyTransaction(b.config, nil, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, b.header.GasUsed, vm.Config{})
+ receipt, _, err := ApplyTransaction(b.config, nil, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, &b.header.GasUsed, vm.Config{})
if err != nil {
panic(err)
}
@@ -141,7 +143,7 @@ func (b *BlockGen) OffsetTime(seconds int64) {
if b.header.Time.Cmp(b.parent.Header().Time) <= 0 {
panic("block time out of range")
}
- b.header.Difficulty = ethash.CalcDifficulty(b.config, b.header.Time.Uint64(), b.parent.Header())
+ b.header.Difficulty = b.engine.CalcDifficulty(b.chainReader, b.header.Time.Uint64(), b.parent.Header())
}
// GenerateChain creates a chain of n blocks. The first block's
@@ -156,44 +158,57 @@ func (b *BlockGen) OffsetTime(seconds int64) {
// Blocks created by GenerateChain do not contain valid proof of work
// values. Inserting them into BlockChain requires use of FakePow or
// a similar non-validating proof of work implementation.
-func GenerateChain(config *params.ChainConfig, parent *types.Block, db ethdb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts) {
+func GenerateChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db ethdb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts) {
if config == nil {
config = params.TestChainConfig
}
blocks, receipts := make(types.Blocks, n), make([]types.Receipts, n)
- genblock := func(i int, h *types.Header, statedb *state.StateDB) (*types.Block, types.Receipts) {
- b := &BlockGen{parent: parent, i: i, chain: blocks, header: h, statedb: statedb, config: config}
+ genblock := func(i int, parent *types.Block, statedb *state.StateDB) (*types.Block, types.Receipts) {
+ // TODO(karalabe): This is needed for clique, which depends on multiple blocks.
+ // It's nonetheless ugly to spin up a blockchain here. Get rid of this somehow.
+ blockchain, _ := NewBlockChain(db, nil, config, engine, vm.Config{})
+ defer blockchain.Stop()
+
+ b := &BlockGen{i: i, parent: parent, chain: blocks, chainReader: blockchain, statedb: statedb, config: config, engine: engine}
+ b.header = makeHeader(b.chainReader, parent, statedb, b.engine)
+
// Mutate the state and block according to any hard-fork specs
if daoBlock := config.DAOForkBlock; daoBlock != nil {
limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange)
- if h.Number.Cmp(daoBlock) >= 0 && h.Number.Cmp(limit) < 0 {
+ if b.header.Number.Cmp(daoBlock) >= 0 && b.header.Number.Cmp(limit) < 0 {
if config.DAOForkSupport {
- h.Extra = common.CopyBytes(params.DAOForkBlockExtra)
+ b.header.Extra = common.CopyBytes(params.DAOForkBlockExtra)
}
}
}
- if config.DAOForkSupport && config.DAOForkBlock != nil && config.DAOForkBlock.Cmp(h.Number) == 0 {
+ if config.DAOForkSupport && config.DAOForkBlock != nil && config.DAOForkBlock.Cmp(b.header.Number) == 0 {
misc.ApplyDAOHardFork(statedb)
}
// Execute any user modifications to the block and finalize it
if gen != nil {
gen(i, b)
}
- ethash.AccumulateRewards(config, statedb, h, b.uncles)
- root, err := statedb.CommitTo(db, config.IsEIP158(h.Number))
- if err != nil {
- panic(fmt.Sprintf("state write error: %v", err))
+
+ if b.engine != nil {
+ block, _ := b.engine.Finalize(b.chainReader, b.header, statedb, b.txs, b.uncles, b.receipts)
+ // Write state changes to db
+ root, err := statedb.Commit(config.IsEIP158(b.header.Number))
+ if err != nil {
+ panic(fmt.Sprintf("state write error: %v", err))
+ }
+ if err := statedb.Database().TrieDB().Commit(root, false); err != nil {
+ panic(fmt.Sprintf("trie write error: %v", err))
+ }
+ return block, b.receipts
}
- h.Root = root
- return types.NewBlock(h, b.txs, b.uncles, b.receipts), b.receipts
+ return nil, nil
}
for i := 0; i < n; i++ {
statedb, err := state.New(parent.Root(), state.NewDatabase(db))
if err != nil {
panic(err)
}
- header := makeHeader(config, parent, statedb)
- block, receipt := genblock(i, header, statedb)
+ block, receipt := genblock(i, parent, statedb)
blocks[i] = block
receipts[i] = receipt
parent = block
@@ -201,7 +216,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, db ethdb.Dat
return blocks, receipts
}
-func makeHeader(config *params.ChainConfig, parent *types.Block, state *state.StateDB) *types.Header {
+func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.StateDB, engine consensus.Engine) *types.Header {
var time *big.Int
if parent.Time() == nil {
time = big.NewInt(10)
@@ -210,17 +225,16 @@ func makeHeader(config *params.ChainConfig, parent *types.Block, state *state.St
}
return &types.Header{
- Root: state.IntermediateRoot(config.IsEIP158(parent.Number())),
+ Root: state.IntermediateRoot(chain.Config().IsEIP158(parent.Number())),
ParentHash: parent.Hash(),
Coinbase: parent.Coinbase(),
- Difficulty: ethash.CalcDifficulty(config, time.Uint64(), &types.Header{
+ Difficulty: engine.CalcDifficulty(chain, time.Uint64(), &types.Header{
Number: parent.Number(),
Time: new(big.Int).Sub(time, big.NewInt(10)),
Difficulty: parent.Difficulty(),
UncleHash: parent.UncleHash(),
}),
GasLimit: CalcGasLimit(parent),
- GasUsed: new(big.Int),
Number: new(big.Int).Add(parent.Number(), common.Big1),
Time: time,
}
@@ -229,32 +243,32 @@ func makeHeader(config *params.ChainConfig, parent *types.Block, state *state.St
// newCanonical creates a chain database, and injects a deterministic canonical
// chain. Depending on the full flag, if creates either a full block chain or a
// header only chain.
-func newCanonical(n int, full bool) (ethdb.Database, *BlockChain, error) {
+func newCanonical(engine consensus.Engine, n int, full bool) (ethdb.Database, *BlockChain, error) {
// Initialize a fresh chain with only a genesis block
gspec := new(Genesis)
db, _ := ethdb.NewMemDatabase()
genesis := gspec.MustCommit(db)
- blockchain, _ := NewBlockChain(db, params.AllEthashProtocolChanges, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{})
// Create and inject the requested chain
if n == 0 {
return db, blockchain, nil
}
if full {
// Full block-chain requested
- blocks := makeBlockChain(genesis, n, db, canonicalSeed)
+ blocks := makeBlockChain(genesis, n, engine, db, canonicalSeed)
_, err := blockchain.InsertChain(blocks)
return db, blockchain, err
}
// Header-only chain requested
- headers := makeHeaderChain(genesis.Header(), n, db, canonicalSeed)
+ headers := makeHeaderChain(genesis.Header(), n, engine, db, canonicalSeed)
_, err := blockchain.InsertHeaderChain(headers, 1)
return db, blockchain, err
}
// makeHeaderChain creates a deterministic chain of headers rooted at parent.
-func makeHeaderChain(parent *types.Header, n int, db ethdb.Database, seed int) []*types.Header {
- blocks := makeBlockChain(types.NewBlockWithHeader(parent), n, db, seed)
+func makeHeaderChain(parent *types.Header, n int, engine consensus.Engine, db ethdb.Database, seed int) []*types.Header {
+ blocks := makeBlockChain(types.NewBlockWithHeader(parent), n, engine, db, seed)
headers := make([]*types.Header, len(blocks))
for i, block := range blocks {
headers[i] = block.Header()
@@ -263,8 +277,8 @@ func makeHeaderChain(parent *types.Header, n int, db ethdb.Database, seed int) [
}
// makeBlockChain creates a deterministic chain of blocks rooted at parent.
-func makeBlockChain(parent *types.Block, n int, db ethdb.Database, seed int) []*types.Block {
- blocks, _ := GenerateChain(params.TestChainConfig, parent, db, n, func(i int, b *BlockGen) {
+func makeBlockChain(parent *types.Block, n int, engine consensus.Engine, db ethdb.Database, seed int) []*types.Block {
+ blocks, _ := GenerateChain(params.TestChainConfig, parent, engine, db, n, func(i int, b *BlockGen) {
b.SetCoinbase(common.Address{0: byte(seed), 19: byte(i)})
})
return blocks
diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go
index 2260c62fb..93be43ddc 100644
--- a/core/chain_makers_test.go
+++ b/core/chain_makers_test.go
@@ -50,17 +50,17 @@ func ExampleGenerateChain() {
// each block and adds different features to gen based on the
// block index.
signer := types.HomesteadSigner{}
- chain, _ := GenerateChain(gspec.Config, genesis, db, 5, func(i int, gen *BlockGen) {
+ chain, _ := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 5, func(i int, gen *BlockGen) {
switch i {
case 0:
// In block 1, addr1 sends addr2 some ether.
- tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(10000), bigTxGas, nil, nil), signer, key1)
+ tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(10000), params.TxGas, nil, nil), signer, key1)
gen.AddTx(tx)
case 1:
// In block 2, addr1 sends some more ether to addr2.
// addr2 passes it on to addr3.
- tx1, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(1000), bigTxGas, nil, nil), signer, key1)
- tx2, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr3, big.NewInt(1000), bigTxGas, nil, nil), signer, key2)
+ tx1, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr1), addr2, big.NewInt(1000), params.TxGas, nil, nil), signer, key1)
+ tx2, _ := types.SignTx(types.NewTransaction(gen.TxNonce(addr2), addr3, big.NewInt(1000), params.TxGas, nil, nil), signer, key2)
gen.AddTx(tx1)
gen.AddTx(tx2)
case 2:
@@ -79,7 +79,7 @@ func ExampleGenerateChain() {
})
// Import the chain. This runs all block validation rules.
- blockchain, _ := NewBlockChain(db, gspec.Config, ethash.NewFaker(), vm.Config{})
+ blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{})
defer blockchain.Stop()
if i, err := blockchain.InsertChain(chain); err != nil {
diff --git a/core/dao_test.go b/core/dao_test.go
index b9898ff7c..e0a3e3ff3 100644
--- a/core/dao_test.go
+++ b/core/dao_test.go
@@ -35,7 +35,7 @@ func TestDAOForkRangeExtradata(t *testing.T) {
db, _ := ethdb.NewMemDatabase()
gspec := new(Genesis)
genesis := gspec.MustCommit(db)
- prefix, _ := GenerateChain(params.TestChainConfig, genesis, db, int(forkBlock.Int64()-1), func(i int, gen *BlockGen) {})
+ prefix, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, int(forkBlock.Int64()-1), func(i int, gen *BlockGen) {})
// Create the concurrent, conflicting two nodes
proDb, _ := ethdb.NewMemDatabase()
@@ -45,7 +45,7 @@ func TestDAOForkRangeExtradata(t *testing.T) {
proConf.DAOForkBlock = forkBlock
proConf.DAOForkSupport = true
- proBc, _ := NewBlockChain(proDb, &proConf, ethash.NewFaker(), vm.Config{})
+ proBc, _ := NewBlockChain(proDb, nil, &proConf, ethash.NewFaker(), vm.Config{})
defer proBc.Stop()
conDb, _ := ethdb.NewMemDatabase()
@@ -55,7 +55,7 @@ func TestDAOForkRangeExtradata(t *testing.T) {
conConf.DAOForkBlock = forkBlock
conConf.DAOForkSupport = false
- conBc, _ := NewBlockChain(conDb, &conConf, ethash.NewFaker(), vm.Config{})
+ conBc, _ := NewBlockChain(conDb, nil, &conConf, ethash.NewFaker(), vm.Config{})
defer conBc.Stop()
if _, err := proBc.InsertChain(prefix); err != nil {
@@ -69,7 +69,7 @@ func TestDAOForkRangeExtradata(t *testing.T) {
// Create a pro-fork block, and try to feed into the no-fork chain
db, _ = ethdb.NewMemDatabase()
gspec.MustCommit(db)
- bc, _ := NewBlockChain(db, &conConf, ethash.NewFaker(), vm.Config{})
+ bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{})
defer bc.Stop()
blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64()))
@@ -79,19 +79,22 @@ func TestDAOForkRangeExtradata(t *testing.T) {
if _, err := bc.InsertChain(blocks); err != nil {
t.Fatalf("failed to import contra-fork chain for expansion: %v", err)
}
- blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {})
+ if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil {
+ t.Fatalf("failed to commit contra-fork head for expansion: %v", err)
+ }
+ blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {})
if _, err := conBc.InsertChain(blocks); err == nil {
t.Fatalf("contra-fork chain accepted pro-fork block: %v", blocks[0])
}
// Create a proper no-fork block for the contra-forker
- blocks, _ = GenerateChain(&conConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {})
+ blocks, _ = GenerateChain(&conConf, conBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {})
if _, err := conBc.InsertChain(blocks); err != nil {
t.Fatalf("contra-fork chain didn't accepted no-fork block: %v", err)
}
// Create a no-fork block, and try to feed into the pro-fork chain
db, _ = ethdb.NewMemDatabase()
gspec.MustCommit(db)
- bc, _ = NewBlockChain(db, &proConf, ethash.NewFaker(), vm.Config{})
+ bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{})
defer bc.Stop()
blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64()))
@@ -101,12 +104,15 @@ func TestDAOForkRangeExtradata(t *testing.T) {
if _, err := bc.InsertChain(blocks); err != nil {
t.Fatalf("failed to import pro-fork chain for expansion: %v", err)
}
- blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {})
+ if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil {
+ t.Fatalf("failed to commit pro-fork head for expansion: %v", err)
+ }
+ blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {})
if _, err := proBc.InsertChain(blocks); err == nil {
t.Fatalf("pro-fork chain accepted contra-fork block: %v", blocks[0])
}
// Create a proper pro-fork block for the pro-forker
- blocks, _ = GenerateChain(&proConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {})
+ blocks, _ = GenerateChain(&proConf, proBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {})
if _, err := proBc.InsertChain(blocks); err != nil {
t.Fatalf("pro-fork chain didn't accepted pro-fork block: %v", err)
}
@@ -114,7 +120,7 @@ func TestDAOForkRangeExtradata(t *testing.T) {
// Verify that contra-forkers accept pro-fork extra-datas after forking finishes
db, _ = ethdb.NewMemDatabase()
gspec.MustCommit(db)
- bc, _ := NewBlockChain(db, &conConf, ethash.NewFaker(), vm.Config{})
+ bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{})
defer bc.Stop()
blocks := conBc.GetBlocksFromHash(conBc.CurrentBlock().Hash(), int(conBc.CurrentBlock().NumberU64()))
@@ -124,14 +130,17 @@ func TestDAOForkRangeExtradata(t *testing.T) {
if _, err := bc.InsertChain(blocks); err != nil {
t.Fatalf("failed to import contra-fork chain for expansion: %v", err)
}
- blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {})
+ if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil {
+ t.Fatalf("failed to commit contra-fork head for expansion: %v", err)
+ }
+ blocks, _ = GenerateChain(&proConf, conBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {})
if _, err := conBc.InsertChain(blocks); err != nil {
t.Fatalf("contra-fork chain didn't accept pro-fork block post-fork: %v", err)
}
// Verify that pro-forkers accept contra-fork extra-datas after forking finishes
db, _ = ethdb.NewMemDatabase()
gspec.MustCommit(db)
- bc, _ = NewBlockChain(db, &proConf, ethash.NewFaker(), vm.Config{})
+ bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{})
defer bc.Stop()
blocks = proBc.GetBlocksFromHash(proBc.CurrentBlock().Hash(), int(proBc.CurrentBlock().NumberU64()))
@@ -141,7 +150,10 @@ func TestDAOForkRangeExtradata(t *testing.T) {
if _, err := bc.InsertChain(blocks); err != nil {
t.Fatalf("failed to import pro-fork chain for expansion: %v", err)
}
- blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), db, 1, func(i int, gen *BlockGen) {})
+ if err := bc.stateCache.TrieDB().Commit(bc.CurrentHeader().Root, true); err != nil {
+ t.Fatalf("failed to commit pro-fork head for expansion: %v", err)
+ }
+ blocks, _ = GenerateChain(&conConf, proBc.CurrentBlock(), ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {})
if _, err := proBc.InsertChain(blocks); err != nil {
t.Fatalf("pro-fork chain didn't accept contra-fork block post-fork: %v", err)
}
diff --git a/core/database_util_test.go b/core/database_util_test.go
index 36f43cf50..ab4e45a47 100644
--- a/core/database_util_test.go
+++ b/core/database_util_test.go
@@ -290,9 +290,9 @@ func TestHeadStorage(t *testing.T) {
func TestLookupStorage(t *testing.T) {
db, _ := ethdb.NewMemDatabase()
- tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), big.NewInt(1111), big.NewInt(11111), []byte{0x11, 0x11, 0x11})
- tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), big.NewInt(2222), big.NewInt(22222), []byte{0x22, 0x22, 0x22})
- tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), big.NewInt(3333), big.NewInt(33333), []byte{0x33, 0x33, 0x33})
+ tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11})
+ tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22})
+ tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33})
txs := []*types.Transaction{tx1, tx2, tx3}
block := types.NewBlock(&types.Header{Number: big.NewInt(314)}, txs, nil, nil)
@@ -337,25 +337,25 @@ func TestBlockReceiptStorage(t *testing.T) {
receipt1 := &types.Receipt{
Status: types.ReceiptStatusFailed,
- CumulativeGasUsed: big.NewInt(1),
+ CumulativeGasUsed: 1,
Logs: []*types.Log{
{Address: common.BytesToAddress([]byte{0x11})},
{Address: common.BytesToAddress([]byte{0x01, 0x11})},
},
TxHash: common.BytesToHash([]byte{0x11, 0x11}),
ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}),
- GasUsed: big.NewInt(111111),
+ GasUsed: 111111,
}
receipt2 := &types.Receipt{
PostState: common.Hash{2}.Bytes(),
- CumulativeGasUsed: big.NewInt(2),
+ CumulativeGasUsed: 2,
Logs: []*types.Log{
{Address: common.BytesToAddress([]byte{0x22})},
{Address: common.BytesToAddress([]byte{0x02, 0x22})},
},
TxHash: common.BytesToHash([]byte{0x22, 0x22}),
ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}),
- GasUsed: big.NewInt(222222),
+ GasUsed: 222222,
}
receipts := []*types.Receipt{receipt1, receipt2}
diff --git a/core/evm.go b/core/evm.go
index 4912aa650..55db53927 100644
--- a/core/evm.go
+++ b/core/evm.go
@@ -53,7 +53,7 @@ func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author
BlockNumber: new(big.Int).Set(header.Number),
Time: new(big.Int).Set(header.Time),
Difficulty: new(big.Int).Set(header.Difficulty),
- GasLimit: new(big.Int).Set(header.GasLimit),
+ GasLimit: header.GasLimit,
GasPrice: new(big.Int).Set(msg.GasPrice()),
}
}
diff --git a/core/gaspool.go b/core/gaspool.go
index ef99908cf..e3795c1ee 100644
--- a/core/gaspool.go
+++ b/core/gaspool.go
@@ -16,31 +16,39 @@
package core
-import "math/big"
+import (
+ "fmt"
+ "math"
+)
-// GasPool tracks the amount of gas available during
-// execution of the transactions in a block.
-// The zero value is a pool with zero gas available.
-type GasPool big.Int
+// GasPool tracks the amount of gas available during execution of the transactions
+// in a block. The zero value is a pool with zero gas available.
+type GasPool uint64
// AddGas makes gas available for execution.
-func (gp *GasPool) AddGas(amount *big.Int) *GasPool {
- i := (*big.Int)(gp)
- i.Add(i, amount)
+func (gp *GasPool) AddGas(amount uint64) *GasPool {
+ if uint64(*gp) > math.MaxUint64-amount {
+ panic("gas pool pushed above uint64")
+ }
+ *(*uint64)(gp) += amount
return gp
}
// SubGas deducts the given amount from the pool if enough gas is
// available and returns an error otherwise.
-func (gp *GasPool) SubGas(amount *big.Int) error {
- i := (*big.Int)(gp)
- if i.Cmp(amount) < 0 {
+func (gp *GasPool) SubGas(amount uint64) error {
+ if uint64(*gp) < amount {
return ErrGasLimitReached
}
- i.Sub(i, amount)
+ *(*uint64)(gp) -= amount
return nil
}
+// Gas returns the amount of gas remaining in the pool.
+func (gp *GasPool) Gas() uint64 {
+ return uint64(*gp)
+}
+
func (gp *GasPool) String() string {
- return (*big.Int)(gp).String()
+ return fmt.Sprintf("%d", *gp)
}
diff --git a/core/gen_genesis.go b/core/gen_genesis.go
index 4d75704a6..bb8ea1d6a 100644
--- a/core/gen_genesis.go
+++ b/core/gen_genesis.go
@@ -13,6 +13,8 @@ import (
"github.com/ethereum/go-ethereum/params"
)
+var _ = (*genesisSpecMarshaling)(nil)
+
func (g Genesis) MarshalJSON() ([]byte, error) {
type Genesis struct {
Config *params.ChainConfig `json:"config"`
@@ -54,7 +56,7 @@ func (g *Genesis) UnmarshalJSON(input []byte) error {
Config *params.ChainConfig `json:"config"`
Nonce *math.HexOrDecimal64 `json:"nonce"`
Timestamp *math.HexOrDecimal64 `json:"timestamp"`
- ExtraData hexutil.Bytes `json:"extraData"`
+ ExtraData *hexutil.Bytes `json:"extraData"`
GasLimit *math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"`
Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"`
Mixhash *common.Hash `json:"mixHash"`
@@ -78,7 +80,7 @@ func (g *Genesis) UnmarshalJSON(input []byte) error {
g.Timestamp = uint64(*dec.Timestamp)
}
if dec.ExtraData != nil {
- g.ExtraData = dec.ExtraData
+ g.ExtraData = *dec.ExtraData
}
if dec.GasLimit == nil {
return errors.New("missing required field 'gasLimit' for Genesis")
diff --git a/core/gen_genesis_account.go b/core/gen_genesis_account.go
index 15c9565a2..64fb9b924 100644
--- a/core/gen_genesis_account.go
+++ b/core/gen_genesis_account.go
@@ -38,18 +38,18 @@ func (g GenesisAccount) MarshalJSON() ([]byte, error) {
func (g *GenesisAccount) UnmarshalJSON(input []byte) error {
type GenesisAccount struct {
- Code hexutil.Bytes `json:"code,omitempty"`
+ Code *hexutil.Bytes `json:"code,omitempty"`
Storage map[storageJSON]storageJSON `json:"storage,omitempty"`
Balance *math.HexOrDecimal256 `json:"balance" gencodec:"required"`
Nonce *math.HexOrDecimal64 `json:"nonce,omitempty"`
- PrivateKey hexutil.Bytes `json:"secretKey,omitempty"`
+ PrivateKey *hexutil.Bytes `json:"secretKey,omitempty"`
}
var dec GenesisAccount
if err := json.Unmarshal(input, &dec); err != nil {
return err
}
if dec.Code != nil {
- g.Code = dec.Code
+ g.Code = *dec.Code
}
if dec.Storage != nil {
g.Storage = make(map[common.Hash]common.Hash, len(dec.Storage))
@@ -65,7 +65,7 @@ func (g *GenesisAccount) UnmarshalJSON(input []byte) error {
g.Nonce = uint64(*dec.Nonce)
}
if dec.PrivateKey != nil {
- g.PrivateKey = dec.PrivateKey
+ g.PrivateKey = *dec.PrivateKey
}
return nil
}
diff --git a/core/genesis.go b/core/genesis.go
index df491ce0f..b6ead2250 100644
--- a/core/genesis.go
+++ b/core/genesis.go
@@ -169,10 +169,9 @@ func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig
// Check whether the genesis block is already written.
if genesis != nil {
- block, _ := genesis.ToBlock()
- hash := block.Hash()
+ hash := genesis.ToBlock(nil).Hash()
if hash != stored {
- return genesis.Config, block.Hash(), &GenesisMismatchError{stored, hash}
+ return genesis.Config, hash, &GenesisMismatchError{stored, hash}
}
}
@@ -220,9 +219,12 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
}
}
-// ToBlock creates the block and state of a genesis specification.
-func (g *Genesis) ToBlock() (*types.Block, *state.StateDB) {
- db, _ := ethdb.NewMemDatabase()
+// ToBlock creates the genesis block and writes state of a genesis specification
+// to the given database (or discards it if nil).
+func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
+ if db == nil {
+ db, _ = ethdb.NewMemDatabase()
+ }
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
for addr, account := range g.Alloc {
statedb.AddBalance(addr, account.Balance)
@@ -239,8 +241,8 @@ func (g *Genesis) ToBlock() (*types.Block, *state.StateDB) {
Time: new(big.Int).SetUint64(g.Timestamp),
ParentHash: g.ParentHash,
Extra: g.ExtraData,
- GasLimit: new(big.Int).SetUint64(g.GasLimit),
- GasUsed: new(big.Int).SetUint64(g.GasUsed),
+ GasLimit: g.GasLimit,
+ GasUsed: g.GasUsed,
Difficulty: g.Difficulty,
MixDigest: g.Mixhash,
Coinbase: g.Coinbase,
@@ -252,19 +254,19 @@ func (g *Genesis) ToBlock() (*types.Block, *state.StateDB) {
if g.Difficulty == nil {
head.Difficulty = params.GenesisDifficulty
}
- return types.NewBlock(head, nil, nil, nil), statedb
+ statedb.Commit(false)
+ statedb.Database().TrieDB().Commit(root, true)
+
+ return types.NewBlock(head, nil, nil, nil)
}
// Commit writes the block and state of a genesis specification to the database.
// The block is committed as the canonical head block.
func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
- block, statedb := g.ToBlock()
+ block := g.ToBlock(db)
if block.Number().Sign() != 0 {
return nil, fmt.Errorf("can't commit genesis block with number > 0")
}
- if _, err := statedb.CommitTo(db, false); err != nil {
- return nil, fmt.Errorf("cannot write state: %v", err)
- }
if err := WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty); err != nil {
return nil, err
}
diff --git a/core/genesis_test.go b/core/genesis_test.go
index 2fe931b24..cd548d4b1 100644
--- a/core/genesis_test.go
+++ b/core/genesis_test.go
@@ -30,11 +30,11 @@ import (
)
func TestDefaultGenesisBlock(t *testing.T) {
- block, _ := DefaultGenesisBlock().ToBlock()
+ block := DefaultGenesisBlock().ToBlock(nil)
if block.Hash() != params.MainnetGenesisHash {
t.Errorf("wrong mainnet genesis hash, got %v, want %v", block.Hash(), params.MainnetGenesisHash)
}
- block, _ = DefaultTestnetGenesisBlock().ToBlock()
+ block = DefaultTestnetGenesisBlock().ToBlock(nil)
if block.Hash() != params.TestnetGenesisHash {
t.Errorf("wrong testnet genesis hash, got %v, want %v", block.Hash(), params.TestnetGenesisHash)
}
@@ -118,7 +118,7 @@ func TestSetupGenesis(t *testing.T) {
// Commit the 'old' genesis block with Homestead transition at #2.
// Advance to block #4, past the homestead transition block of customg.
genesis := oldcustomg.MustCommit(db)
- bc, _ := NewBlockChain(db, oldcustomg.Config, ethash.NewFullFaker(), vm.Config{})
+ bc, _ := NewBlockChain(db, nil, oldcustomg.Config, ethash.NewFullFaker(), vm.Config{})
defer bc.Stop()
bc.SetValidator(bproc{})
bc.InsertChain(makeBlockChainWithDiff(genesis, []int{2, 3, 4, 5}, 0))
diff --git a/core/state/database.go b/core/state/database.go
index 946625e76..36926ec69 100644
--- a/core/state/database.go
+++ b/core/state/database.go
@@ -40,16 +40,23 @@ const (
// Database wraps access to tries and contract code.
type Database interface {
- // Accessing tries:
// OpenTrie opens the main account trie.
- // OpenStorageTrie opens the storage trie of an account.
OpenTrie(root common.Hash) (Trie, error)
+
+ // OpenStorageTrie opens the storage trie of an account.
OpenStorageTrie(addrHash, root common.Hash) (Trie, error)
- // Accessing contract code:
- ContractCode(addrHash, codeHash common.Hash) ([]byte, error)
- ContractCodeSize(addrHash, codeHash common.Hash) (int, error)
+
// CopyTrie returns an independent copy of the given trie.
CopyTrie(Trie) Trie
+
+ // ContractCode retrieves a particular contract's code.
+ ContractCode(addrHash, codeHash common.Hash) ([]byte, error)
+
+ // ContractCodeSize retrieves a particular contracts code's size.
+ ContractCodeSize(addrHash, codeHash common.Hash) (int, error)
+
+ // TrieDB retrieves the low level trie database used for data storage.
+ TrieDB() *trie.Database
}
// Trie is a Ethereum Merkle Trie.
@@ -57,26 +64,33 @@ type Trie interface {
TryGet(key []byte) ([]byte, error)
TryUpdate(key, value []byte) error
TryDelete(key []byte) error
- CommitTo(trie.DatabaseWriter) (common.Hash, error)
+ Commit(onleaf trie.LeafCallback) (common.Hash, error)
Hash() common.Hash
NodeIterator(startKey []byte) trie.NodeIterator
GetKey([]byte) []byte // TODO(fjl): remove this when SecureTrie is removed
+ Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error
}
// NewDatabase creates a backing store for state. The returned database is safe for
-// concurrent use and retains cached trie nodes in memory.
+// concurrent use and retains cached trie nodes in memory. The pool is an optional
+// intermediate trie-node memory pool between the low level storage layer and the
+// high level trie abstraction.
func NewDatabase(db ethdb.Database) Database {
csc, _ := lru.New(codeSizeCacheSize)
- return &cachingDB{db: db, codeSizeCache: csc}
+ return &cachingDB{
+ db: trie.NewDatabase(db),
+ codeSizeCache: csc,
+ }
}
type cachingDB struct {
- db ethdb.Database
+ db *trie.Database
mu sync.Mutex
pastTries []*trie.SecureTrie
codeSizeCache *lru.Cache
}
+// OpenTrie opens the main account trie.
func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) {
db.mu.Lock()
defer db.mu.Unlock()
@@ -105,10 +119,12 @@ func (db *cachingDB) pushTrie(t *trie.SecureTrie) {
}
}
+// OpenStorageTrie opens the storage trie of an account.
func (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) {
return trie.NewSecure(root, db.db, 0)
}
+// CopyTrie returns an independent copy of the given trie.
func (db *cachingDB) CopyTrie(t Trie) Trie {
switch t := t.(type) {
case cachedTrie:
@@ -120,14 +136,16 @@ func (db *cachingDB) CopyTrie(t Trie) Trie {
}
}
+// ContractCode retrieves a particular contract's code.
func (db *cachingDB) ContractCode(addrHash, codeHash common.Hash) ([]byte, error) {
- code, err := db.db.Get(codeHash[:])
+ code, err := db.db.Node(codeHash)
if err == nil {
db.codeSizeCache.Add(codeHash, len(code))
}
return code, err
}
+// ContractCodeSize retrieves a particular contracts code's size.
func (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, error) {
if cached, ok := db.codeSizeCache.Get(codeHash); ok {
return cached.(int), nil
@@ -139,16 +157,25 @@ func (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, erro
return len(code), err
}
+// TrieDB retrieves any intermediate trie-node caching layer.
+func (db *cachingDB) TrieDB() *trie.Database {
+ return db.db
+}
+
// cachedTrie inserts its trie into a cachingDB on commit.
type cachedTrie struct {
*trie.SecureTrie
db *cachingDB
}
-func (m cachedTrie) CommitTo(dbw trie.DatabaseWriter) (common.Hash, error) {
- root, err := m.SecureTrie.CommitTo(dbw)
+func (m cachedTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) {
+ root, err := m.SecureTrie.Commit(onleaf)
if err == nil {
m.db.pushTrie(m.SecureTrie)
}
return root, err
}
+
+func (m cachedTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error {
+ return m.SecureTrie.Prove(key, fromLevel, proofDb)
+}
diff --git a/core/state/iterator_test.go b/core/state/iterator_test.go
index ff66ba7a9..9e46c851c 100644
--- a/core/state/iterator_test.go
+++ b/core/state/iterator_test.go
@@ -21,12 +21,13 @@ import (
"testing"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/ethdb"
)
// Tests that the node iterator indeed walks over the entire database contents.
func TestNodeIteratorCoverage(t *testing.T) {
// Create some arbitrary test state to iterate
- db, mem, root, _ := makeTestState()
+ db, root, _ := makeTestState()
state, err := New(root, db)
if err != nil {
@@ -39,14 +40,18 @@ func TestNodeIteratorCoverage(t *testing.T) {
hashes[it.Hash] = struct{}{}
}
}
-
- // Cross check the hashes and the database itself
+ // Cross check the iterated hashes and the database/nodepool content
for hash := range hashes {
- if _, err := mem.Get(hash.Bytes()); err != nil {
- t.Errorf("failed to retrieve reported node %x: %v", hash, err)
+ if _, err := db.TrieDB().Node(hash); err != nil {
+ t.Errorf("failed to retrieve reported node %x", hash)
+ }
+ }
+ for _, hash := range db.TrieDB().Nodes() {
+ if _, ok := hashes[hash]; !ok {
+ t.Errorf("state entry not reported %x", hash)
}
}
- for _, key := range mem.Keys() {
+ for _, key := range db.TrieDB().DiskDB().(*ethdb.MemDatabase).Keys() {
if bytes.HasPrefix(key, []byte("secure-key-")) {
continue
}
diff --git a/core/state/journal.go b/core/state/journal.go
index ddc819fe5..a89bb3d13 100644
--- a/core/state/journal.go
+++ b/core/state/journal.go
@@ -62,7 +62,7 @@ type (
// Changes to other state values.
refundChange struct {
- prev *big.Int
+ prev uint64
}
addLogChange struct {
txhash common.Hash
diff --git a/core/state/state_object.go b/core/state/state_object.go
index b2378c69c..b2112bfae 100644
--- a/core/state/state_object.go
+++ b/core/state/state_object.go
@@ -25,7 +25,6 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/rlp"
- "github.com/ethereum/go-ethereum/trie"
)
var emptyCodeHash = crypto.Keccak256(nil)
@@ -238,12 +237,12 @@ func (self *stateObject) updateRoot(db Database) {
// CommitTrie the storage trie of the object to dwb.
// This updates the trie root.
-func (self *stateObject) CommitTrie(db Database, dbw trie.DatabaseWriter) error {
+func (self *stateObject) CommitTrie(db Database) error {
self.updateTrie(db)
if self.dbErr != nil {
return self.dbErr
}
- root, err := self.trie.CommitTo(dbw)
+ root, err := self.trie.Commit(nil)
if err == nil {
self.data.Root = root
}
diff --git a/core/state/state_test.go b/core/state/state_test.go
index bbae3685b..6d42d63d8 100644
--- a/core/state/state_test.go
+++ b/core/state/state_test.go
@@ -48,7 +48,7 @@ func (s *StateSuite) TestDump(c *checker.C) {
// write some of them to the trie
s.state.updateStateObject(obj1)
s.state.updateStateObject(obj2)
- s.state.CommitTo(s.db, false)
+ s.state.Commit(false)
// check that dump contains the state objects that are in trie
got := string(s.state.Dump())
@@ -97,7 +97,7 @@ func (s *StateSuite) TestNull(c *checker.C) {
//value := common.FromHex("0x823140710bf13990e4500136726d8b55")
var value common.Hash
s.state.SetState(address, common.Hash{}, value)
- s.state.CommitTo(s.db, false)
+ s.state.Commit(false)
value = s.state.GetState(address, common.Hash{})
if !common.EmptyHash(value) {
c.Errorf("expected empty hash. got %x", value)
@@ -155,7 +155,7 @@ func TestSnapshot2(t *testing.T) {
so0.deleted = false
state.setStateObject(so0)
- root, _ := state.CommitTo(db, false)
+ root, _ := state.Commit(false)
state.Reset(root)
// and one with deleted == true
diff --git a/core/state/statedb.go b/core/state/statedb.go
index de9fb367d..776693e24 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -36,6 +36,14 @@ type revision struct {
journalIndex int
}
+var (
+ // emptyState is the known hash of an empty state trie entry.
+ emptyState = crypto.Keccak256Hash(nil)
+
+ // emptyCode is the known hash of the empty EVM bytecode.
+ emptyCode = crypto.Keccak256Hash(nil)
+)
+
// StateDBs within the ethereum protocol are used to store anything
// within the merkle trie. StateDBs take care of caching and storing
// nested states. It's the general query interface to retrieve:
@@ -57,7 +65,7 @@ type StateDB struct {
dbErr error
// The refund counter, also used by state transitioning.
- refund *big.Int
+ refund uint64
thash, bhash common.Hash
txIndex int
@@ -86,7 +94,6 @@ func New(root common.Hash, db Database) (*StateDB, error) {
trie: tr,
stateObjects: make(map[common.Address]*stateObject),
stateObjectsDirty: make(map[common.Address]struct{}),
- refund: new(big.Int),
logs: make(map[common.Hash][]*types.Log),
preimages: make(map[common.Hash][]byte),
}, nil
@@ -161,9 +168,9 @@ func (self *StateDB) Preimages() map[common.Hash][]byte {
return self.preimages
}
-func (self *StateDB) AddRefund(gas *big.Int) {
- self.journal = append(self.journal, refundChange{prev: new(big.Int).Set(self.refund)})
- self.refund.Add(self.refund, gas)
+func (self *StateDB) AddRefund(gas uint64) {
+ self.journal = append(self.journal, refundChange{prev: self.refund})
+ self.refund += gas
}
// Exist reports whether the given account address exists in the state.
@@ -236,6 +243,11 @@ func (self *StateDB) GetState(a common.Address, b common.Hash) common.Hash {
return common.Hash{}
}
+// Database retrieves the low level database supporting the lower level trie ops.
+func (self *StateDB) Database() Database {
+ return self.db
+}
+
// StorageTrie returns the storage trie of an account.
// The return value is a copy and is nil for non-existent accounts.
func (self *StateDB) StorageTrie(a common.Address) Trie {
@@ -456,7 +468,7 @@ func (self *StateDB) Copy() *StateDB {
trie: self.db.CopyTrie(self.trie),
stateObjects: make(map[common.Address]*stateObject, len(self.stateObjectsDirty)),
stateObjectsDirty: make(map[common.Address]struct{}, len(self.stateObjectsDirty)),
- refund: new(big.Int).Set(self.refund),
+ refund: self.refund,
logs: make(map[common.Hash][]*types.Log, len(self.logs)),
logSize: self.logSize,
preimages: make(map[common.Hash][]byte),
@@ -506,9 +518,7 @@ func (self *StateDB) RevertToSnapshot(revid int) {
}
// GetRefund returns the current value of the refund counter.
-// The return value must not be modified by the caller and will become
-// invalid at the next call to AddRefund.
-func (self *StateDB) GetRefund() *big.Int {
+func (self *StateDB) GetRefund() uint64 {
return self.refund
}
@@ -568,11 +578,11 @@ func (s *StateDB) DeleteSuicides() {
func (s *StateDB) clearJournalAndRefund() {
s.journal = nil
s.validRevisions = s.validRevisions[:0]
- s.refund = new(big.Int)
+ s.refund = 0
}
-// CommitTo writes the state to the given database.
-func (s *StateDB) CommitTo(dbw trie.DatabaseWriter, deleteEmptyObjects bool) (root common.Hash, err error) {
+// Commit writes the state to the underlying in-memory trie database.
+func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) {
defer s.clearJournalAndRefund()
// Commit objects to the trie.
@@ -586,13 +596,11 @@ func (s *StateDB) CommitTo(dbw trie.DatabaseWriter, deleteEmptyObjects bool) (ro
case isDirty:
// Write any contract code associated with the state object
if stateObject.code != nil && stateObject.dirtyCode {
- if err := dbw.Put(stateObject.CodeHash(), stateObject.code); err != nil {
- return common.Hash{}, err
- }
+ s.db.TrieDB().Insert(common.BytesToHash(stateObject.CodeHash()), stateObject.code)
stateObject.dirtyCode = false
}
// Write any storage changes in the state object to its storage trie.
- if err := stateObject.CommitTrie(s.db, dbw); err != nil {
+ if err := stateObject.CommitTrie(s.db); err != nil {
return common.Hash{}, err
}
// Update the object in the main account trie.
@@ -601,7 +609,20 @@ func (s *StateDB) CommitTo(dbw trie.DatabaseWriter, deleteEmptyObjects bool) (ro
delete(s.stateObjectsDirty, addr)
}
// Write trie changes.
- root, err = s.trie.CommitTo(dbw)
+ root, err = s.trie.Commit(func(leaf []byte, parent common.Hash) error {
+ var account Account
+ if err := rlp.DecodeBytes(leaf, &account); err != nil {
+ return nil
+ }
+ if account.Root != emptyState {
+ s.db.TrieDB().Reference(account.Root, parent)
+ }
+ code := common.BytesToHash(account.CodeHash)
+ if code != emptyCode {
+ s.db.TrieDB().Reference(code, parent)
+ }
+ return nil
+ })
log.Debug("Trie cache stats after commit", "misses", trie.CacheMisses(), "unloads", trie.CacheUnloads())
return root, err
}
diff --git a/core/state/statedb_test.go b/core/state/statedb_test.go
index e9944cd74..d9e3d9b79 100644
--- a/core/state/statedb_test.go
+++ b/core/state/statedb_test.go
@@ -97,10 +97,10 @@ func TestIntermediateLeaks(t *testing.T) {
}
// Commit and cross check the databases.
- if _, err := transState.CommitTo(transDb, false); err != nil {
+ if _, err := transState.Commit(false); err != nil {
t.Fatalf("failed to commit transition state: %v", err)
}
- if _, err := finalState.CommitTo(finalDb, false); err != nil {
+ if _, err := finalState.Commit(false); err != nil {
t.Fatalf("failed to commit final state: %v", err)
}
for _, key := range finalDb.Keys() {
@@ -122,8 +122,8 @@ func TestIntermediateLeaks(t *testing.T) {
// https://github.com/ethereum/go-ethereum/pull/15549.
func TestCopy(t *testing.T) {
// Create a random state test to copy and modify "independently"
- mem, _ := ethdb.NewMemDatabase()
- orig, _ := New(common.Hash{}, NewDatabase(mem))
+ db, _ := ethdb.NewMemDatabase()
+ orig, _ := New(common.Hash{}, NewDatabase(db))
for i := byte(0); i < 255; i++ {
obj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
@@ -263,7 +263,7 @@ func newTestAction(addr common.Address, r *rand.Rand) testAction {
{
name: "AddRefund",
fn: func(a testAction, s *StateDB) {
- s.AddRefund(big.NewInt(a.args[0]))
+ s.AddRefund(uint64(a.args[0]))
},
args: make([]int64, 1),
noAddr: true,
@@ -346,11 +346,10 @@ func (test *snapshotTest) run() bool {
}
action.fn(action, state)
}
-
// Revert all snapshots in reverse order. Each revert must yield a state
// that is equivalent to fresh state with all actions up the snapshot applied.
for sindex--; sindex >= 0; sindex-- {
- checkstate, _ := New(common.Hash{}, NewDatabase(db))
+ checkstate, _ := New(common.Hash{}, state.Database())
for _, action := range test.actions[:test.snapshots[sindex]] {
action.fn(action, checkstate)
}
@@ -396,7 +395,7 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {
}
}
- if state.GetRefund().Cmp(checkstate.GetRefund()) != 0 {
+ if state.GetRefund() != checkstate.GetRefund() {
return fmt.Errorf("got GetRefund() == %d, want GetRefund() == %d",
state.GetRefund(), checkstate.GetRefund())
}
@@ -409,7 +408,7 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {
func (s *StateSuite) TestTouchDelete(c *check.C) {
s.state.GetOrNewStateObject(common.Address{})
- root, _ := s.state.CommitTo(s.db, false)
+ root, _ := s.state.Commit(false)
s.state.Reset(root)
snapshot := s.state.Snapshot()
@@ -417,7 +416,6 @@ func (s *StateSuite) TestTouchDelete(c *check.C) {
if len(s.state.stateObjectsDirty) != 1 {
c.Fatal("expected one dirty state object")
}
-
s.state.RevertToSnapshot(snapshot)
if len(s.state.stateObjectsDirty) != 0 {
c.Fatal("expected no dirty state object")
diff --git a/core/state/sync_test.go b/core/state/sync_test.go
index 06c572ea6..8f14a44e7 100644
--- a/core/state/sync_test.go
+++ b/core/state/sync_test.go
@@ -36,10 +36,10 @@ type testAccount struct {
}
// makeTestState create a sample test state to test node-wise reconstruction.
-func makeTestState() (Database, *ethdb.MemDatabase, common.Hash, []*testAccount) {
+func makeTestState() (Database, common.Hash, []*testAccount) {
// Create an empty state
- mem, _ := ethdb.NewMemDatabase()
- db := NewDatabase(mem)
+ diskdb, _ := ethdb.NewMemDatabase()
+ db := NewDatabase(diskdb)
state, _ := New(common.Hash{}, db)
// Fill it with some arbitrary data
@@ -61,10 +61,10 @@ func makeTestState() (Database, *ethdb.MemDatabase, common.Hash, []*testAccount)
state.updateStateObject(obj)
accounts = append(accounts, acc)
}
- root, _ := state.CommitTo(mem, false)
+ root, _ := state.Commit(false)
// Return the generated state
- return db, mem, root, accounts
+ return db, root, accounts
}
// checkStateAccounts cross references a reconstructed state with an expected
@@ -96,7 +96,7 @@ func checkTrieConsistency(db ethdb.Database, root common.Hash) error {
if v, _ := db.Get(root[:]); v == nil {
return nil // Consider a non existent state consistent.
}
- trie, err := trie.New(root, db)
+ trie, err := trie.New(root, trie.NewDatabase(db))
if err != nil {
return err
}
@@ -138,7 +138,7 @@ func TestIterativeStateSyncBatched(t *testing.T) { testIterativeStateSync(t,
func testIterativeStateSync(t *testing.T, batch int) {
// Create a random state to copy
- _, srcMem, srcRoot, srcAccounts := makeTestState()
+ srcDb, srcRoot, srcAccounts := makeTestState()
// Create a destination state and sync with the scheduler
dstDb, _ := ethdb.NewMemDatabase()
@@ -148,9 +148,9 @@ func testIterativeStateSync(t *testing.T, batch int) {
for len(queue) > 0 {
results := make([]trie.SyncResult, len(queue))
for i, hash := range queue {
- data, err := srcMem.Get(hash.Bytes())
+ data, err := srcDb.TrieDB().Node(hash)
if err != nil {
- t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
+ t.Fatalf("failed to retrieve node data for %x", hash)
}
results[i] = trie.SyncResult{Hash: hash, Data: data}
}
@@ -170,7 +170,7 @@ func testIterativeStateSync(t *testing.T, batch int) {
// partial results are returned, and the others sent only later.
func TestIterativeDelayedStateSync(t *testing.T) {
// Create a random state to copy
- _, srcMem, srcRoot, srcAccounts := makeTestState()
+ srcDb, srcRoot, srcAccounts := makeTestState()
// Create a destination state and sync with the scheduler
dstDb, _ := ethdb.NewMemDatabase()
@@ -181,9 +181,9 @@ func TestIterativeDelayedStateSync(t *testing.T) {
// Sync only half of the scheduled nodes
results := make([]trie.SyncResult, len(queue)/2+1)
for i, hash := range queue[:len(results)] {
- data, err := srcMem.Get(hash.Bytes())
+ data, err := srcDb.TrieDB().Node(hash)
if err != nil {
- t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
+ t.Fatalf("failed to retrieve node data for %x", hash)
}
results[i] = trie.SyncResult{Hash: hash, Data: data}
}
@@ -207,7 +207,7 @@ func TestIterativeRandomStateSyncBatched(t *testing.T) { testIterativeRandomS
func testIterativeRandomStateSync(t *testing.T, batch int) {
// Create a random state to copy
- _, srcMem, srcRoot, srcAccounts := makeTestState()
+ srcDb, srcRoot, srcAccounts := makeTestState()
// Create a destination state and sync with the scheduler
dstDb, _ := ethdb.NewMemDatabase()
@@ -221,9 +221,9 @@ func testIterativeRandomStateSync(t *testing.T, batch int) {
// Fetch all the queued nodes in a random order
results := make([]trie.SyncResult, 0, len(queue))
for hash := range queue {
- data, err := srcMem.Get(hash.Bytes())
+ data, err := srcDb.TrieDB().Node(hash)
if err != nil {
- t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
+ t.Fatalf("failed to retrieve node data for %x", hash)
}
results = append(results, trie.SyncResult{Hash: hash, Data: data})
}
@@ -247,7 +247,7 @@ func testIterativeRandomStateSync(t *testing.T, batch int) {
// partial results are returned (Even those randomly), others sent only later.
func TestIterativeRandomDelayedStateSync(t *testing.T) {
// Create a random state to copy
- _, srcMem, srcRoot, srcAccounts := makeTestState()
+ srcDb, srcRoot, srcAccounts := makeTestState()
// Create a destination state and sync with the scheduler
dstDb, _ := ethdb.NewMemDatabase()
@@ -263,9 +263,9 @@ func TestIterativeRandomDelayedStateSync(t *testing.T) {
for hash := range queue {
delete(queue, hash)
- data, err := srcMem.Get(hash.Bytes())
+ data, err := srcDb.TrieDB().Node(hash)
if err != nil {
- t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
+ t.Fatalf("failed to retrieve node data for %x", hash)
}
results = append(results, trie.SyncResult{Hash: hash, Data: data})
@@ -292,9 +292,9 @@ func TestIterativeRandomDelayedStateSync(t *testing.T) {
// the database.
func TestIncompleteStateSync(t *testing.T) {
// Create a random state to copy
- _, srcMem, srcRoot, srcAccounts := makeTestState()
+ srcDb, srcRoot, srcAccounts := makeTestState()
- checkTrieConsistency(srcMem, srcRoot)
+ checkTrieConsistency(srcDb.TrieDB().DiskDB().(ethdb.Database), srcRoot)
// Create a destination state and sync with the scheduler
dstDb, _ := ethdb.NewMemDatabase()
@@ -306,9 +306,9 @@ func TestIncompleteStateSync(t *testing.T) {
// Fetch a batch of state nodes
results := make([]trie.SyncResult, len(queue))
for i, hash := range queue {
- data, err := srcMem.Get(hash.Bytes())
+ data, err := srcDb.TrieDB().Node(hash)
if err != nil {
- t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
+ t.Fatalf("failed to retrieve node data for %x", hash)
}
results[i] = trie.SyncResult{Hash: hash, Data: data}
}
diff --git a/core/state_processor.go b/core/state_processor.go
index 689c83785..4dc58b9de 100644
--- a/core/state_processor.go
+++ b/core/state_processor.go
@@ -17,8 +17,6 @@
package core
import (
- "math/big"
-
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/consensus/misc"
@@ -55,13 +53,13 @@ func NewStateProcessor(config *params.ChainConfig, bc *BlockChain, engine consen
// Process returns the receipts and logs accumulated during the process and
// returns the amount of gas that was used in the process. If any of the
// transactions failed to execute due to insufficient gas it will return an error.
-func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, *big.Int, error) {
+func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) {
var (
- receipts types.Receipts
- totalUsedGas = big.NewInt(0)
- header = block.Header()
- allLogs []*types.Log
- gp = new(GasPool).AddGas(block.GasLimit())
+ receipts types.Receipts
+ usedGas = new(uint64)
+ header = block.Header()
+ allLogs []*types.Log
+ gp = new(GasPool).AddGas(block.GasLimit())
)
// Mutate the the block and state according to any hard-fork specs
if p.config.DAOForkSupport && p.config.DAOForkBlock != nil && p.config.DAOForkBlock.Cmp(block.Number()) == 0 {
@@ -70,9 +68,9 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
// Iterate over and process the individual transactions
for i, tx := range block.Transactions() {
statedb.Prepare(tx.Hash(), block.Hash(), i)
- receipt, _, err := ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, totalUsedGas, cfg)
+ receipt, _, err := ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, usedGas, cfg)
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, 0, err
}
receipts = append(receipts, receipt)
allLogs = append(allLogs, receipt.Logs...)
@@ -80,17 +78,17 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
p.engine.Finalize(p.bc, header, statedb, block.Transactions(), block.Uncles(), receipts)
- return receipts, allLogs, totalUsedGas, nil
+ return receipts, allLogs, *usedGas, nil
}
// ApplyTransaction attempts to apply a transaction to the given state database
// and uses the input parameters for its environment. It returns the receipt
// for the transaction, gas used and an error if the transaction failed,
// indicating the block was invalid.
-func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *big.Int, cfg vm.Config) (*types.Receipt, *big.Int, error) {
+func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, uint64, error) {
msg, err := tx.AsMessage(types.MakeSigner(config, header.Number))
if err != nil {
- return nil, nil, err
+ return nil, 0, err
}
// Create a new context to be used in the EVM environment
context := NewEVMContext(msg, header, bc, author)
@@ -100,9 +98,8 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common
// Apply the transaction to the current state (included in the env)
_, gas, failed, err := ApplyMessage(vmenv, msg, gp)
if err != nil {
- return nil, nil, err
+ return nil, 0, err
}
-
// Update the state with pending changes
var root []byte
if config.IsByzantium(header.Number) {
@@ -110,18 +107,17 @@ func ApplyTransaction(config *params.ChainConfig, bc *BlockChain, author *common
} else {
root = statedb.IntermediateRoot(config.IsEIP158(header.Number)).Bytes()
}
- usedGas.Add(usedGas, gas)
+ *usedGas += gas
// Create a new receipt for the transaction, storing the intermediate root and gas used by the tx
// based on the eip phase, we're passing wether the root touch-delete accounts.
- receipt := types.NewReceipt(root, failed, usedGas)
+ receipt := types.NewReceipt(root, failed, *usedGas)
receipt.TxHash = tx.Hash()
- receipt.GasUsed = new(big.Int).Set(gas)
+ receipt.GasUsed = gas
// if the transaction created a contract, store the creation address in the receipt.
if msg.To() == nil {
receipt.ContractAddress = crypto.CreateAddress(vmenv.Context.Origin, tx.Nonce())
}
-
// Set the receipt logs and create a bloom for filtering
receipt.Logs = statedb.GetLogs(tx.Hash())
receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
diff --git a/core/state_transition.go b/core/state_transition.go
index e7a068589..390473fff 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -18,17 +18,16 @@ package core
import (
"errors"
+ "math"
"math/big"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
)
var (
- Big0 = big.NewInt(0)
errInsufficientBalanceForGas = errors.New("insufficient balance to pay for gas")
)
@@ -54,7 +53,7 @@ type StateTransition struct {
msg Message
gas uint64
gasPrice *big.Int
- initialGas *big.Int
+ initialGas uint64
value *big.Int
data []byte
state vm.StateDB
@@ -68,7 +67,7 @@ type Message interface {
To() *common.Address
GasPrice() *big.Int
- Gas() *big.Int
+ Gas() uint64
Value() *big.Int
Nonce() uint64
@@ -76,45 +75,49 @@ type Message interface {
Data() []byte
}
-// IntrinsicGas computes the 'intrinsic gas' for a message
-// with the given data.
-//
-// TODO convert to uint64
-func IntrinsicGas(data []byte, contractCreation, homestead bool) *big.Int {
- igas := new(big.Int)
+// IntrinsicGas computes the 'intrinsic gas' for a message with the given data.
+func IntrinsicGas(data []byte, contractCreation, homestead bool) (uint64, error) {
+ // Set the starting gas for the raw transaction
+ var gas uint64
if contractCreation && homestead {
- igas.SetUint64(params.TxGasContractCreation)
+ gas = params.TxGasContractCreation
} else {
- igas.SetUint64(params.TxGas)
+ gas = params.TxGas
}
+ // Bump the required gas by the amount of transactional data
if len(data) > 0 {
- var nz int64
+ // Zero and non-zero bytes are priced differently
+ var nz uint64
for _, byt := range data {
if byt != 0 {
nz++
}
}
- m := big.NewInt(nz)
- m.Mul(m, new(big.Int).SetUint64(params.TxDataNonZeroGas))
- igas.Add(igas, m)
- m.SetInt64(int64(len(data)) - nz)
- m.Mul(m, new(big.Int).SetUint64(params.TxDataZeroGas))
- igas.Add(igas, m)
+ // Make sure we don't exceed uint64 for all data combinations
+ if (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz {
+ return 0, vm.ErrOutOfGas
+ }
+ gas += nz * params.TxDataNonZeroGas
+
+ z := uint64(len(data)) - nz
+ if (math.MaxUint64-gas)/params.TxDataZeroGas < z {
+ return 0, vm.ErrOutOfGas
+ }
+ gas += z * params.TxDataZeroGas
}
- return igas
+ return gas, nil
}
// NewStateTransition initialises and returns a new state transition object.
func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition {
return &StateTransition{
- gp: gp,
- evm: evm,
- msg: msg,
- gasPrice: msg.GasPrice(),
- initialGas: new(big.Int),
- value: msg.Value(),
- data: msg.Data(),
- state: evm.StateDB,
+ gp: gp,
+ evm: evm,
+ msg: msg,
+ gasPrice: msg.GasPrice(),
+ value: msg.Value(),
+ data: msg.Data(),
+ state: evm.StateDB,
}
}
@@ -125,11 +128,8 @@ func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition
// the gas used (which includes gas refunds) and an error if it failed. An error always
// indicates a core error meaning that the message would always fail for that particular
// state and would never be accepted within a block.
-func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, *big.Int, bool, error) {
- st := NewStateTransition(evm, msg, gp)
-
- ret, _, gasUsed, failed, err := st.TransitionDb()
- return ret, gasUsed, failed, err
+func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, uint64, bool, error) {
+ return NewStateTransition(evm, msg, gp).TransitionDb()
}
func (st *StateTransition) from() vm.AccountRef {
@@ -166,26 +166,20 @@ func (st *StateTransition) useGas(amount uint64) error {
}
func (st *StateTransition) buyGas() error {
- mgas := st.msg.Gas()
- if mgas.BitLen() > 64 {
- return vm.ErrOutOfGas
- }
-
- mgval := new(big.Int).Mul(mgas, st.gasPrice)
-
var (
state = st.state
sender = st.from()
)
+ mgval := new(big.Int).Mul(new(big.Int).SetUint64(st.msg.Gas()), st.gasPrice)
if state.GetBalance(sender.Address()).Cmp(mgval) < 0 {
return errInsufficientBalanceForGas
}
- if err := st.gp.SubGas(mgas); err != nil {
+ if err := st.gp.SubGas(st.msg.Gas()); err != nil {
return err
}
- st.gas += mgas.Uint64()
+ st.gas += st.msg.Gas()
- st.initialGas.Set(mgas)
+ st.initialGas = st.msg.Gas()
state.SubBalance(sender.Address(), mgval)
return nil
}
@@ -206,10 +200,10 @@ func (st *StateTransition) preCheck() error {
return st.buyGas()
}
-// TransitionDb will transition the state by applying the current message and returning the result
-// including the required gas for the operation as well as the used gas. It returns an error if it
+// TransitionDb will transition the state by applying the current message and
+// returning the result including the the used gas. It returns an error if it
// failed. An error indicates a consensus issue.
-func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big.Int, failed bool, err error) {
+func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bool, err error) {
if err = st.preCheck(); err != nil {
return
}
@@ -220,13 +214,9 @@ func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big
contractCreation := msg.To() == nil
// Pay intrinsic gas
- // TODO convert to uint64
- intrinsicGas := IntrinsicGas(st.data, contractCreation, homestead)
- if intrinsicGas.BitLen() > 64 {
- return nil, nil, nil, false, vm.ErrOutOfGas
- }
- if err = st.useGas(intrinsicGas.Uint64()); err != nil {
- return nil, nil, nil, false, err
+ gas, err := IntrinsicGas(st.data, contractCreation, homestead)
+ if err = st.useGas(gas); err != nil {
+ return nil, 0, false, err
}
var (
@@ -249,36 +239,35 @@ func (st *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *big
// sufficient balance to make the transfer happen. The first
// balance transfer may never fail.
if vmerr == vm.ErrInsufficientBalance {
- return nil, nil, nil, false, vmerr
+ return nil, 0, false, vmerr
}
}
- requiredGas = new(big.Int).Set(st.gasUsed())
-
st.refundGas()
- st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(st.gasUsed(), st.gasPrice))
+ st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice))
- return ret, requiredGas, st.gasUsed(), vmerr != nil, err
+ return ret, st.gasUsed(), vmerr != nil, err
}
func (st *StateTransition) refundGas() {
- // Return eth for remaining gas to the sender account,
- // exchanged at the original rate.
- sender := st.from() // err already checked
- remaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gas), st.gasPrice)
- st.state.AddBalance(sender.Address(), remaining)
-
// Apply refund counter, capped to half of the used gas.
- uhalf := remaining.Div(st.gasUsed(), common.Big2)
- refund := math.BigMin(uhalf, st.state.GetRefund())
- st.gas += refund.Uint64()
+ refund := st.gasUsed() / 2
+ if refund > st.state.GetRefund() {
+ refund = st.state.GetRefund()
+ }
+ st.gas += refund
- st.state.AddBalance(sender.Address(), refund.Mul(refund, st.gasPrice))
+ // Return ETH for remaining gas, exchanged at the original rate.
+ sender := st.from()
+
+ remaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gas), st.gasPrice)
+ st.state.AddBalance(sender.Address(), remaining)
// Also return remaining gas to the block gas counter so it is
// available for the next transaction.
- st.gp.AddGas(new(big.Int).SetUint64(st.gas))
+ st.gp.AddGas(st.gas)
}
-func (st *StateTransition) gasUsed() *big.Int {
- return new(big.Int).Sub(st.initialGas, new(big.Int).SetUint64(st.gas))
+// gasUsed returns the amount of gas used up by the state transition.
+func (st *StateTransition) gasUsed() uint64 {
+ return st.initialGas - st.gas
}
diff --git a/core/tx_list.go b/core/tx_list.go
index 838433b89..55fc42617 100644
--- a/core/tx_list.go
+++ b/core/tx_list.go
@@ -224,7 +224,7 @@ type txList struct {
txs *txSortedMap // Heap indexed sorted hash map of the transactions
costcap *big.Int // Price of the highest costing transaction (reset only if exceeds balance)
- gascap *big.Int // Gas limit of the highest spending transaction (reset only if exceeds block limit)
+ gascap uint64 // Gas limit of the highest spending transaction (reset only if exceeds block limit)
}
// newTxList create a new transaction list for maintaining nonce-indexable fast,
@@ -234,7 +234,6 @@ func newTxList(strict bool) *txList {
strict: strict,
txs: newTxSortedMap(),
costcap: new(big.Int),
- gascap: new(big.Int),
}
}
@@ -266,7 +265,7 @@ func (l *txList) Add(tx *types.Transaction, priceBump uint64) (bool, *types.Tran
if cost := tx.Cost(); l.costcap.Cmp(cost) < 0 {
l.costcap = cost
}
- if gas := tx.Gas(); l.gascap.Cmp(gas) < 0 {
+ if gas := tx.Gas(); l.gascap < gas {
l.gascap = gas
}
return true, old
@@ -288,16 +287,16 @@ func (l *txList) Forward(threshold uint64) types.Transactions {
// a point in calculating all the costs or if the balance covers all. If the threshold
// is lower than the costgas cap, the caps will be reset to a new high after removing
// the newly invalidated transactions.
-func (l *txList) Filter(costLimit, gasLimit *big.Int) (types.Transactions, types.Transactions) {
+func (l *txList) Filter(costLimit *big.Int, gasLimit uint64) (types.Transactions, types.Transactions) {
// If all transactions are below the threshold, short circuit
- if l.costcap.Cmp(costLimit) <= 0 && l.gascap.Cmp(gasLimit) <= 0 {
+ if l.costcap.Cmp(costLimit) <= 0 && l.gascap <= gasLimit {
return nil, nil
}
l.costcap = new(big.Int).Set(costLimit) // Lower the caps to the thresholds
- l.gascap = new(big.Int).Set(gasLimit)
+ l.gascap = gasLimit
// Filter out all the transactions above the account's funds
- removed := l.txs.Filter(func(tx *types.Transaction) bool { return tx.Cost().Cmp(costLimit) > 0 || tx.Gas().Cmp(gasLimit) > 0 })
+ removed := l.txs.Filter(func(tx *types.Transaction) bool { return tx.Cost().Cmp(costLimit) > 0 || tx.Gas() > gasLimit })
// If the list was strict, filter anything above the lowest nonce
var invalids types.Transactions
diff --git a/core/tx_list_test.go b/core/tx_list_test.go
index b4f0b5228..d579f501a 100644
--- a/core/tx_list_test.go
+++ b/core/tx_list_test.go
@@ -17,7 +17,6 @@
package core
import (
- "math/big"
"math/rand"
"testing"
@@ -33,7 +32,7 @@ func TestStrictTxListAdd(t *testing.T) {
txs := make(types.Transactions, 1024)
for i := 0; i < len(txs); i++ {
- txs[i] = transaction(uint64(i), new(big.Int), key)
+ txs[i] = transaction(uint64(i), 0, key)
}
// Insert the transactions in a random order
list := newTxList(true)
diff --git a/core/tx_pool.go b/core/tx_pool.go
index c3915575b..dc3ddc423 100644
--- a/core/tx_pool.go
+++ b/core/tx_pool.go
@@ -103,7 +103,7 @@ var (
underpricedTxCounter = metrics.NewCounter("txpool/underpriced")
)
-// TxStatus is the current status of a transaction as seen py the pool.
+// TxStatus is the current status of a transaction as seen by the pool.
type TxStatus uint
const (
@@ -197,9 +197,9 @@ type TxPool struct {
currentState *state.StateDB // Current state in the blockchain head
pendingState *state.ManagedState // Pending state tracking virtual nonces
- currentMaxGas *big.Int // Current gas limit for transaction caps
+ currentMaxGas uint64 // Current gas limit for transaction caps
- locals *accountSet // Set of local transaction to exepmt from evicion rules
+ locals *accountSet // Set of local transaction to exempt from eviction rules
journal *txJournal // Journal of local transaction to back up to disk
pending map[common.Address]*txList // All currently processable transactions
@@ -214,7 +214,7 @@ type TxPool struct {
}
// NewTxPool creates a new transaction pool to gather, sort and filter inbound
-// trnsactions from the network.
+// transactions from the network.
func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain blockChain) *TxPool {
// Sanitize the input to ensure no vulnerable gas prices are set
config = (&config).sanitize()
@@ -360,7 +360,7 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) {
newNum := newHead.Number.Uint64()
if depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 {
- log.Warn("Skipping deep transaction reorg", "depth", depth)
+ log.Debug("Skipping deep transaction reorg", "depth", depth)
} else {
// Reorg seems shallow enough to pull in all transactions into memory
var discarded, included types.Transactions
@@ -564,7 +564,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error {
return ErrNegativeValue
}
// Ensure the transaction doesn't exceed the current block limit gas.
- if pool.currentMaxGas.Cmp(tx.Gas()) < 0 {
+ if pool.currentMaxGas < tx.Gas() {
return ErrGasLimit
}
// Make sure the transaction is signed properly
@@ -586,8 +586,11 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error {
if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 {
return ErrInsufficientFunds
}
- intrGas := IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead)
- if tx.Gas().Cmp(intrGas) < 0 {
+ intrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead)
+ if err != nil {
+ return err
+ }
+ if tx.Gas() < intrGas {
return ErrIntrinsicGas
}
return nil
@@ -838,7 +841,7 @@ func (pool *TxPool) Status(hashes []common.Hash) []TxStatus {
for i, hash := range hashes {
if tx := pool.all[hash]; tx != nil {
from, _ := types.Sender(pool.signer, tx) // already validated
- if pool.pending[from].txs.items[tx.Nonce()] != nil {
+ if pool.pending[from] != nil && pool.pending[from].txs.items[tx.Nonce()] != nil {
status[i] = TxStatusPending
} else {
status[i] = TxStatusQueued
diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go
index 21171a737..158b9776b 100644
--- a/core/tx_pool_test.go
+++ b/core/tx_pool_test.go
@@ -46,7 +46,7 @@ func init() {
type testBlockChain struct {
statedb *state.StateDB
- gasLimit *big.Int
+ gasLimit uint64
chainHeadFeed *event.Feed
}
@@ -68,19 +68,19 @@ func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) even
return bc.chainHeadFeed.Subscribe(ch)
}
-func transaction(nonce uint64, gaslimit *big.Int, key *ecdsa.PrivateKey) *types.Transaction {
+func transaction(nonce uint64, gaslimit uint64, key *ecdsa.PrivateKey) *types.Transaction {
return pricedTransaction(nonce, gaslimit, big.NewInt(1), key)
}
-func pricedTransaction(nonce uint64, gaslimit, gasprice *big.Int, key *ecdsa.PrivateKey) *types.Transaction {
+func pricedTransaction(nonce uint64, gaslimit uint64, gasprice *big.Int, key *ecdsa.PrivateKey) *types.Transaction {
tx, _ := types.SignTx(types.NewTransaction(nonce, common.Address{}, big.NewInt(100), gaslimit, gasprice, nil), types.HomesteadSigner{}, key)
return tx
}
func setupTxPool() (*TxPool, *ecdsa.PrivateKey) {
- db, _ := ethdb.NewMemDatabase()
- statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ diskdb, _ := ethdb.NewMemDatabase()
+ statedb, _ := state.New(common.Hash{}, state.NewDatabase(diskdb))
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
key, _ := crypto.GenerateKey()
pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain)
@@ -184,10 +184,10 @@ func TestStateChangeDuringTransactionPoolReset(t *testing.T) {
// setup pool with 2 transaction in it
statedb.SetBalance(address, new(big.Int).SetUint64(params.Ether))
- blockchain := &testChain{&testBlockChain{statedb, big.NewInt(1000000000), new(event.Feed)}, address, &trigger}
+ blockchain := &testChain{&testBlockChain{statedb, 1000000000, new(event.Feed)}, address, &trigger}
- tx0 := transaction(0, big.NewInt(100000), key)
- tx1 := transaction(1, big.NewInt(100000), key)
+ tx0 := transaction(0, 100000, key)
+ tx1 := transaction(1, 100000, key)
pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain)
defer pool.Stop()
@@ -230,7 +230,7 @@ func TestInvalidTransactions(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- tx := transaction(0, big.NewInt(100), key)
+ tx := transaction(0, 100, key)
from, _ := deriveSender(tx)
pool.currentState.AddBalance(from, big.NewInt(1))
@@ -238,7 +238,7 @@ func TestInvalidTransactions(t *testing.T) {
t.Error("expected", ErrInsufficientFunds)
}
- balance := new(big.Int).Add(tx.Value(), new(big.Int).Mul(tx.Gas(), tx.GasPrice()))
+ balance := new(big.Int).Add(tx.Value(), new(big.Int).Mul(new(big.Int).SetUint64(tx.Gas()), tx.GasPrice()))
pool.currentState.AddBalance(from, balance)
if err := pool.AddRemote(tx); err != ErrIntrinsicGas {
t.Error("expected", ErrIntrinsicGas, "got", err)
@@ -246,12 +246,12 @@ func TestInvalidTransactions(t *testing.T) {
pool.currentState.SetNonce(from, 1)
pool.currentState.AddBalance(from, big.NewInt(0xffffffffffffff))
- tx = transaction(0, big.NewInt(100000), key)
+ tx = transaction(0, 100000, key)
if err := pool.AddRemote(tx); err != ErrNonceTooLow {
t.Error("expected", ErrNonceTooLow)
}
- tx = transaction(1, big.NewInt(100000), key)
+ tx = transaction(1, 100000, key)
pool.gasPrice = big.NewInt(1000)
if err := pool.AddRemote(tx); err != ErrUnderpriced {
t.Error("expected", ErrUnderpriced, "got", err)
@@ -267,7 +267,7 @@ func TestTransactionQueue(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- tx := transaction(0, big.NewInt(100), key)
+ tx := transaction(0, 100, key)
from, _ := deriveSender(tx)
pool.currentState.AddBalance(from, big.NewInt(1000))
pool.lockedReset(nil, nil)
@@ -278,7 +278,7 @@ func TestTransactionQueue(t *testing.T) {
t.Error("expected valid txs to be 1 is", len(pool.pending))
}
- tx = transaction(1, big.NewInt(100), key)
+ tx = transaction(1, 100, key)
from, _ = deriveSender(tx)
pool.currentState.SetNonce(from, 2)
pool.enqueueTx(tx.Hash(), tx)
@@ -294,9 +294,9 @@ func TestTransactionQueue(t *testing.T) {
pool, key = setupTxPool()
defer pool.Stop()
- tx1 := transaction(0, big.NewInt(100), key)
- tx2 := transaction(10, big.NewInt(100), key)
- tx3 := transaction(11, big.NewInt(100), key)
+ tx1 := transaction(0, 100, key)
+ tx2 := transaction(10, 100, key)
+ tx3 := transaction(11, 100, key)
from, _ = deriveSender(tx1)
pool.currentState.AddBalance(from, big.NewInt(1000))
pool.lockedReset(nil, nil)
@@ -321,7 +321,7 @@ func TestTransactionNegativeValue(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- tx, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(-1), big.NewInt(100), big.NewInt(1), nil), types.HomesteadSigner{}, key)
+ tx, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(-1), 100, big.NewInt(1), nil), types.HomesteadSigner{}, key)
from, _ := deriveSender(tx)
pool.currentState.AddBalance(from, big.NewInt(1))
if err := pool.AddRemote(tx); err != ErrNegativeValue {
@@ -341,12 +341,12 @@ func TestTransactionChainFork(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
statedb.AddBalance(addr, big.NewInt(100000000000000))
- pool.chain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ pool.chain = &testBlockChain{statedb, 1000000, new(event.Feed)}
pool.lockedReset(nil, nil)
}
resetState()
- tx := transaction(0, big.NewInt(100000), key)
+ tx := transaction(0, 100000, key)
if _, err := pool.add(tx, false); err != nil {
t.Error("didn't expect error", err)
}
@@ -371,15 +371,15 @@ func TestTransactionDoubleNonce(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
statedb.AddBalance(addr, big.NewInt(100000000000000))
- pool.chain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ pool.chain = &testBlockChain{statedb, 1000000, new(event.Feed)}
pool.lockedReset(nil, nil)
}
resetState()
signer := types.HomesteadSigner{}
- tx1, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), big.NewInt(100000), big.NewInt(1), nil), signer, key)
- tx2, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), big.NewInt(1000000), big.NewInt(2), nil), signer, key)
- tx3, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), big.NewInt(1000000), big.NewInt(1), nil), signer, key)
+ tx1, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), 100000, big.NewInt(1), nil), signer, key)
+ tx2, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), 1000000, big.NewInt(2), nil), signer, key)
+ tx3, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), 1000000, big.NewInt(1), nil), signer, key)
// Add the first two transaction, ensure higher priced stays only
if replace, err := pool.add(tx1, false); err != nil || replace {
@@ -418,7 +418,7 @@ func TestTransactionMissingNonce(t *testing.T) {
addr := crypto.PubkeyToAddress(key.PublicKey)
pool.currentState.AddBalance(addr, big.NewInt(100000000000000))
- tx := transaction(1, big.NewInt(100000), key)
+ tx := transaction(1, 100000, key)
if _, err := pool.add(tx, false); err != nil {
t.Error("didn't expect error", err)
}
@@ -445,7 +445,7 @@ func TestTransactionNonceRecovery(t *testing.T) {
pool.currentState.AddBalance(addr, big.NewInt(100000000000000))
pool.lockedReset(nil, nil)
- tx := transaction(n, big.NewInt(100000), key)
+ tx := transaction(n, 100000, key)
if err := pool.AddRemote(tx); err != nil {
t.Error(err)
}
@@ -466,17 +466,17 @@ func TestTransactionDropping(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000))
// Add some pending and some queued transactions
var (
- tx0 = transaction(0, big.NewInt(100), key)
- tx1 = transaction(1, big.NewInt(200), key)
- tx2 = transaction(2, big.NewInt(300), key)
- tx10 = transaction(10, big.NewInt(100), key)
- tx11 = transaction(11, big.NewInt(200), key)
- tx12 = transaction(12, big.NewInt(300), key)
+ tx0 = transaction(0, 100, key)
+ tx1 = transaction(1, 200, key)
+ tx2 = transaction(2, 300, key)
+ tx10 = transaction(10, 100, key)
+ tx11 = transaction(11, 200, key)
+ tx12 = transaction(12, 300, key)
)
pool.promoteTx(account, tx0.Hash(), tx0)
pool.promoteTx(account, tx1.Hash(), tx1)
@@ -531,7 +531,7 @@ func TestTransactionDropping(t *testing.T) {
t.Errorf("total transaction mismatch: have %d, want %d", len(pool.all), 4)
}
// Reduce the block gas limit, check that invalidated transactions are dropped
- pool.chain.(*testBlockChain).gasLimit = big.NewInt(100)
+ pool.chain.(*testBlockChain).gasLimit = 100
pool.lockedReset(nil, nil)
if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok {
@@ -561,7 +561,7 @@ func TestTransactionPostponing(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000))
// Add a batch consecutive pending transactions for validation
@@ -569,9 +569,9 @@ func TestTransactionPostponing(t *testing.T) {
for i := 0; i < 100; i++ {
var tx *types.Transaction
if i%2 == 0 {
- tx = transaction(uint64(i), big.NewInt(100), key)
+ tx = transaction(uint64(i), 100, key)
} else {
- tx = transaction(uint64(i), big.NewInt(500), key)
+ tx = transaction(uint64(i), 500, key)
}
pool.promoteTx(account, tx.Hash(), tx)
txns = append(txns, tx)
@@ -638,7 +638,7 @@ func TestTransactionGapFilling(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
// Keep track of transaction events to ensure all executables get announced
@@ -647,10 +647,10 @@ func TestTransactionGapFilling(t *testing.T) {
defer sub.Unsubscribe()
// Create a pending and a queued transaction with a nonce-gap in between
- if err := pool.AddRemote(transaction(0, big.NewInt(100000), key)); err != nil {
+ if err := pool.AddRemote(transaction(0, 100000, key)); err != nil {
t.Fatalf("failed to add pending transaction: %v", err)
}
- if err := pool.AddRemote(transaction(2, big.NewInt(100000), key)); err != nil {
+ if err := pool.AddRemote(transaction(2, 100000, key)); err != nil {
t.Fatalf("failed to add queued transaction: %v", err)
}
pending, queued := pool.Stats()
@@ -667,7 +667,7 @@ func TestTransactionGapFilling(t *testing.T) {
t.Fatalf("pool internal state corrupted: %v", err)
}
// Fill the nonce gap and ensure all transactions become pending
- if err := pool.AddRemote(transaction(1, big.NewInt(100000), key)); err != nil {
+ if err := pool.AddRemote(transaction(1, 100000, key)); err != nil {
t.Fatalf("failed to add gapped transaction: %v", err)
}
pending, queued = pool.Stats()
@@ -694,12 +694,12 @@ func TestTransactionQueueAccountLimiting(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
// Keep queuing up transactions and make sure all above a limit are dropped
for i := uint64(1); i <= testTxPoolConfig.AccountQueue+5; i++ {
- if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil {
+ if err := pool.AddRemote(transaction(i, 100000, key)); err != nil {
t.Fatalf("tx %d: failed to add transaction: %v", i, err)
}
if len(pool.pending) != 0 {
@@ -738,7 +738,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) {
// Create the pool to test the limit enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.NoLocals = nolocals
@@ -763,7 +763,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) {
key := keys[rand.Intn(len(keys)-1)] // skip adding transactions with the local account
addr := crypto.PubkeyToAddress(key.PublicKey)
- txs = append(txs, transaction(nonces[addr]+1, big.NewInt(100000), key))
+ txs = append(txs, transaction(nonces[addr]+1, 100000, key))
nonces[addr]++
}
// Import the batch and verify that limits have been enforced
@@ -782,7 +782,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) {
// Generate a batch of transactions from the local account and import them
txs = txs[:0]
for i := uint64(0); i < 3*config.GlobalQueue; i++ {
- txs = append(txs, transaction(i+1, big.NewInt(100000), local))
+ txs = append(txs, transaction(i+1, 100000, local))
}
pool.AddLocals(txs)
@@ -827,7 +827,7 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) {
// Create the pool to test the non-expiration enforcement
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.Lifetime = time.Second
@@ -844,10 +844,10 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) {
pool.currentState.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000))
// Add the two transactions and ensure they both are queued up
- if err := pool.AddLocal(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), local)); err != nil {
+ if err := pool.AddLocal(pricedTransaction(1, 100000, big.NewInt(1), local)); err != nil {
t.Fatalf("failed to add local transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), remote)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(1, 100000, big.NewInt(1), remote)); err != nil {
t.Fatalf("failed to add remote transaction: %v", err)
}
pending, queued := pool.Stats()
@@ -891,7 +891,7 @@ func TestTransactionPendingLimiting(t *testing.T) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
// Keep track of transaction events to ensure all executables get announced
@@ -901,7 +901,7 @@ func TestTransactionPendingLimiting(t *testing.T) {
// Keep queuing up transactions and make sure all above a limit are dropped
for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ {
- if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil {
+ if err := pool.AddRemote(transaction(i, 100000, key)); err != nil {
t.Fatalf("tx %d: failed to add transaction: %v", i, err)
}
if pool.pending[account].Len() != int(i)+1 {
@@ -934,11 +934,11 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) {
pool1, key1 := setupTxPool()
defer pool1.Stop()
- account1, _ := deriveSender(transaction(0, big.NewInt(0), key1))
+ account1, _ := deriveSender(transaction(0, 0, key1))
pool1.currentState.AddBalance(account1, big.NewInt(1000000))
for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ {
- if err := pool1.AddRemote(transaction(origin+i, big.NewInt(100000), key1)); err != nil {
+ if err := pool1.AddRemote(transaction(origin+i, 100000, key1)); err != nil {
t.Fatalf("tx %d: failed to add transaction: %v", i, err)
}
}
@@ -946,12 +946,12 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) {
pool2, key2 := setupTxPool()
defer pool2.Stop()
- account2, _ := deriveSender(transaction(0, big.NewInt(0), key2))
+ account2, _ := deriveSender(transaction(0, 0, key2))
pool2.currentState.AddBalance(account2, big.NewInt(1000000))
txns := []*types.Transaction{}
for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ {
- txns = append(txns, transaction(origin+i, big.NewInt(100000), key2))
+ txns = append(txns, transaction(origin+i, 100000, key2))
}
pool2.AddRemotes(txns)
@@ -982,7 +982,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) {
// Create the pool to test the limit enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.GlobalSlots = config.AccountSlots * 10
@@ -1003,7 +1003,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) {
for _, key := range keys {
addr := crypto.PubkeyToAddress(key.PublicKey)
for j := 0; j < int(config.GlobalSlots)/len(keys)*2; j++ {
- txs = append(txs, transaction(nonces[addr], big.NewInt(100000), key))
+ txs = append(txs, transaction(nonces[addr], 100000, key))
nonces[addr]++
}
}
@@ -1029,7 +1029,7 @@ func TestTransactionCapClearsFromAll(t *testing.T) {
// Create the pool to test the limit enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.AccountSlots = 2
@@ -1046,7 +1046,7 @@ func TestTransactionCapClearsFromAll(t *testing.T) {
txs := types.Transactions{}
for j := 0; j < int(config.GlobalSlots)*2; j++ {
- txs = append(txs, transaction(uint64(j), big.NewInt(100000), key))
+ txs = append(txs, transaction(uint64(j), 100000, key))
}
// Import the batch and verify that limits have been enforced
pool.AddRemotes(txs)
@@ -1064,7 +1064,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) {
// Create the pool to test the limit enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.GlobalSlots = 0
@@ -1085,7 +1085,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) {
for _, key := range keys {
addr := crypto.PubkeyToAddress(key.PublicKey)
for j := 0; j < int(config.AccountSlots)*2; j++ {
- txs = append(txs, transaction(nonces[addr], big.NewInt(100000), key))
+ txs = append(txs, transaction(nonces[addr], 100000, key))
nonces[addr]++
}
}
@@ -1113,7 +1113,7 @@ func TestTransactionPoolRepricing(t *testing.T) {
// Create the pool to test the pricing enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain)
defer pool.Stop()
@@ -1132,15 +1132,15 @@ func TestTransactionPoolRepricing(t *testing.T) {
// Generate and queue a batch of transactions, both pending and queued
txs := types.Transactions{}
- txs = append(txs, pricedTransaction(0, big.NewInt(100000), big.NewInt(2), keys[0]))
- txs = append(txs, pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[0]))
- txs = append(txs, pricedTransaction(2, big.NewInt(100000), big.NewInt(2), keys[0]))
+ txs = append(txs, pricedTransaction(0, 100000, big.NewInt(2), keys[0]))
+ txs = append(txs, pricedTransaction(1, 100000, big.NewInt(1), keys[0]))
+ txs = append(txs, pricedTransaction(2, 100000, big.NewInt(2), keys[0]))
- txs = append(txs, pricedTransaction(1, big.NewInt(100000), big.NewInt(2), keys[1]))
- txs = append(txs, pricedTransaction(2, big.NewInt(100000), big.NewInt(1), keys[1]))
- txs = append(txs, pricedTransaction(3, big.NewInt(100000), big.NewInt(2), keys[1]))
+ txs = append(txs, pricedTransaction(1, 100000, big.NewInt(2), keys[1]))
+ txs = append(txs, pricedTransaction(2, 100000, big.NewInt(1), keys[1]))
+ txs = append(txs, pricedTransaction(3, 100000, big.NewInt(2), keys[1]))
- ltx := pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[2])
+ ltx := pricedTransaction(0, 100000, big.NewInt(1), keys[2])
// Import the batch and that both pending and queued transactions match up
pool.AddRemotes(txs)
@@ -1176,10 +1176,10 @@ func TestTransactionPoolRepricing(t *testing.T) {
t.Fatalf("pool internal state corrupted: %v", err)
}
// Check that we can't add the old transactions back
- if err := pool.AddRemote(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[0])); err != ErrUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(1, 100000, big.NewInt(1), keys[0])); err != ErrUnderpriced {
t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(1), keys[1])); err != ErrUnderpriced {
t.Fatalf("adding underpriced queued transaction error mismatch: have %v, want %v", err, ErrUnderpriced)
}
if err := validateEvents(events, 0); err != nil {
@@ -1189,7 +1189,7 @@ func TestTransactionPoolRepricing(t *testing.T) {
t.Fatalf("pool internal state corrupted: %v", err)
}
// However we can add local underpriced transactions
- tx := pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[2])
+ tx := pricedTransaction(1, 100000, big.NewInt(1), keys[2])
if err := pool.AddLocal(tx); err != nil {
t.Fatalf("failed to add underpriced local transaction: %v", err)
}
@@ -1212,7 +1212,7 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) {
// Create the pool to test the pricing enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain)
defer pool.Stop()
@@ -1226,12 +1226,12 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) {
// Create transaction (both pending and queued) with a linearly growing gasprice
for i := uint64(0); i < 500; i++ {
// Add pending
- p_tx := pricedTransaction(i, big.NewInt(100000), big.NewInt(int64(i)), keys[2])
+ p_tx := pricedTransaction(i, 100000, big.NewInt(int64(i)), keys[2])
if err := pool.AddLocal(p_tx); err != nil {
t.Fatal(err)
}
// Add queued
- q_tx := pricedTransaction(i+501, big.NewInt(100000), big.NewInt(int64(i)), keys[2])
+ q_tx := pricedTransaction(i+501, 100000, big.NewInt(int64(i)), keys[2])
if err := pool.AddLocal(q_tx); err != nil {
t.Fatal(err)
}
@@ -1275,7 +1275,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) {
// Create the pool to test the pricing enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.GlobalSlots = 2
@@ -1298,12 +1298,12 @@ func TestTransactionPoolUnderpricing(t *testing.T) {
// Generate and queue a batch of transactions, both pending and queued
txs := types.Transactions{}
- txs = append(txs, pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[0]))
- txs = append(txs, pricedTransaction(1, big.NewInt(100000), big.NewInt(2), keys[0]))
+ txs = append(txs, pricedTransaction(0, 100000, big.NewInt(1), keys[0]))
+ txs = append(txs, pricedTransaction(1, 100000, big.NewInt(2), keys[0]))
- txs = append(txs, pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[1]))
+ txs = append(txs, pricedTransaction(1, 100000, big.NewInt(1), keys[1]))
- ltx := pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[2])
+ ltx := pricedTransaction(0, 100000, big.NewInt(1), keys[2])
// Import the batch and that both pending and queued transactions match up
pool.AddRemotes(txs)
@@ -1323,17 +1323,17 @@ func TestTransactionPoolUnderpricing(t *testing.T) {
t.Fatalf("pool internal state corrupted: %v", err)
}
// Ensure that adding an underpriced transaction on block limit fails
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), keys[1])); err != ErrUnderpriced {
t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced)
}
// Ensure that adding high priced transactions drops cheap ones, but not own
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(3), keys[1])); err != nil {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(3), keys[1])); err != nil {
t.Fatalf("failed to add well priced transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(4), keys[1])); err != nil {
+ if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(4), keys[1])); err != nil {
t.Fatalf("failed to add well priced transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(3, big.NewInt(100000), big.NewInt(5), keys[1])); err != nil {
+ if err := pool.AddRemote(pricedTransaction(3, 100000, big.NewInt(5), keys[1])); err != nil {
t.Fatalf("failed to add well priced transaction: %v", err)
}
pending, queued = pool.Stats()
@@ -1350,7 +1350,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) {
t.Fatalf("pool internal state corrupted: %v", err)
}
// Ensure that adding local transactions can push out even higher priced ones
- tx := pricedTransaction(1, big.NewInt(100000), big.NewInt(0), keys[2])
+ tx := pricedTransaction(1, 100000, big.NewInt(0), keys[2])
if err := pool.AddLocal(tx); err != nil {
t.Fatalf("failed to add underpriced local transaction: %v", err)
}
@@ -1377,7 +1377,7 @@ func TestTransactionReplacement(t *testing.T) {
// Create the pool to test the pricing enforcement with
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain)
defer pool.Stop()
@@ -1395,49 +1395,49 @@ func TestTransactionReplacement(t *testing.T) {
price := int64(100)
threshold := (price * (100 + int64(testTxPoolConfig.PriceBump))) / 100
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), key)); err != nil {
t.Fatalf("failed to add original cheap pending transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(0, 100001, big.NewInt(1), key)); err != ErrReplaceUnderpriced {
t.Fatalf("original cheap pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced)
}
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(2), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(2), key)); err != nil {
t.Fatalf("failed to replace original cheap pending transaction: %v", err)
}
if err := validateEvents(events, 2); err != nil {
t.Fatalf("cheap replacement event firing failed: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(price), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(price), key)); err != nil {
t.Fatalf("failed to add original proper pending transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100001), big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(0, 100001, big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced {
t.Fatalf("original proper pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced)
}
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(threshold), key)); err != nil {
t.Fatalf("failed to replace original proper pending transaction: %v", err)
}
if err := validateEvents(events, 2); err != nil {
t.Fatalf("proper replacement event firing failed: %v", err)
}
// Add queued transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too)
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(1), key)); err != nil {
t.Fatalf("failed to add original cheap queued transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(2, 100001, big.NewInt(1), key)); err != ErrReplaceUnderpriced {
t.Fatalf("original cheap queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(2), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(2), key)); err != nil {
t.Fatalf("failed to replace original cheap queued transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(price), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(price), key)); err != nil {
t.Fatalf("failed to add original proper queued transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced {
+ if err := pool.AddRemote(pricedTransaction(2, 100001, big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced {
t.Fatalf("original proper queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced)
}
- if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(threshold), key)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(threshold), key)); err != nil {
t.Fatalf("failed to replace original proper queued transaction: %v", err)
}
@@ -1472,7 +1472,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) {
// Create the original pool to inject transaction into the journal
db, _ := ethdb.NewMemDatabase()
statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
- blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
config := testTxPoolConfig
config.NoLocals = nolocals
@@ -1489,16 +1489,16 @@ func testTransactionJournaling(t *testing.T, nolocals bool) {
pool.currentState.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), big.NewInt(1000000000))
// Add three local and a remote transactions and ensure they are queued up
- if err := pool.AddLocal(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), local)); err != nil {
+ if err := pool.AddLocal(pricedTransaction(0, 100000, big.NewInt(1), local)); err != nil {
t.Fatalf("failed to add local transaction: %v", err)
}
- if err := pool.AddLocal(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), local)); err != nil {
+ if err := pool.AddLocal(pricedTransaction(1, 100000, big.NewInt(1), local)); err != nil {
t.Fatalf("failed to add local transaction: %v", err)
}
- if err := pool.AddLocal(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), local)); err != nil {
+ if err := pool.AddLocal(pricedTransaction(2, 100000, big.NewInt(1), local)); err != nil {
t.Fatalf("failed to add local transaction: %v", err)
}
- if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), remote)); err != nil {
+ if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), remote)); err != nil {
t.Fatalf("failed to add remote transaction: %v", err)
}
pending, queued := pool.Stats()
@@ -1514,7 +1514,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) {
// Terminate the old pool, bump the local nonce, create a new pool and ensure relevant transaction survive
pool.Stop()
statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1)
- blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain = &testBlockChain{statedb, 1000000, new(event.Feed)}
pool = NewTxPool(config, params.TestChainConfig, blockchain)
@@ -1541,7 +1541,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) {
pool.Stop()
statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1)
- blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)}
+ blockchain = &testBlockChain{statedb, 1000000, new(event.Feed)}
pool = NewTxPool(config, params.TestChainConfig, blockchain)
pending, queued = pool.Stats()
@@ -1563,6 +1563,63 @@ func testTransactionJournaling(t *testing.T, nolocals bool) {
pool.Stop()
}
+// TestTransactionStatusCheck tests that the pool can correctly retrieve the
+// pending status of individual transactions.
+func TestTransactionStatusCheck(t *testing.T) {
+ t.Parallel()
+
+ // Create the pool to test the status retrievals with
+ db, _ := ethdb.NewMemDatabase()
+ statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
+ blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)}
+
+ pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain)
+ defer pool.Stop()
+
+ // Create the test accounts to check various transaction statuses with
+ keys := make([]*ecdsa.PrivateKey, 3)
+ for i := 0; i < len(keys); i++ {
+ keys[i], _ = crypto.GenerateKey()
+ pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), big.NewInt(1000000))
+ }
+ // Generate and queue a batch of transactions, both pending and queued
+ txs := types.Transactions{}
+
+ txs = append(txs, pricedTransaction(0, 100000, big.NewInt(1), keys[0])) // Pending only
+ txs = append(txs, pricedTransaction(0, 100000, big.NewInt(1), keys[1])) // Pending and queued
+ txs = append(txs, pricedTransaction(2, 100000, big.NewInt(1), keys[1]))
+ txs = append(txs, pricedTransaction(2, 100000, big.NewInt(1), keys[2])) // Queued only
+
+ // Import the transaction and ensure they are correctly added
+ pool.AddRemotes(txs)
+
+ pending, queued := pool.Stats()
+ if pending != 2 {
+ t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2)
+ }
+ if queued != 2 {
+ t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2)
+ }
+ if err := validateTxPoolInternals(pool); err != nil {
+ t.Fatalf("pool internal state corrupted: %v", err)
+ }
+ // Retrieve the status of each transaction and validate them
+ hashes := make([]common.Hash, len(txs))
+ for i, tx := range txs {
+ hashes[i] = tx.Hash()
+ }
+ hashes = append(hashes, common.Hash{})
+
+ statuses := pool.Status(hashes)
+ expect := []TxStatus{TxStatusPending, TxStatusPending, TxStatusQueued, TxStatusQueued, TxStatusUnknown}
+
+ for i := 0; i < len(statuses); i++ {
+ if statuses[i] != expect[i] {
+ t.Errorf("transaction %d: status mismatch: have %v, want %v", i, statuses[i], expect[i])
+ }
+ }
+}
+
// Benchmarks the speed of validating the contents of the pending queue of the
// transaction pool.
func BenchmarkPendingDemotion100(b *testing.B) { benchmarkPendingDemotion(b, 100) }
@@ -1574,11 +1631,11 @@ func benchmarkPendingDemotion(b *testing.B, size int) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
for i := 0; i < size; i++ {
- tx := transaction(uint64(i), big.NewInt(100000), key)
+ tx := transaction(uint64(i), 100000, key)
pool.promoteTx(account, tx.Hash(), tx)
}
// Benchmark the speed of pool validation
@@ -1599,11 +1656,11 @@ func benchmarkFuturePromotion(b *testing.B, size int) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
for i := 0; i < size; i++ {
- tx := transaction(uint64(1+i), big.NewInt(100000), key)
+ tx := transaction(uint64(1+i), 100000, key)
pool.enqueueTx(tx.Hash(), tx)
}
// Benchmark the speed of pool validation
@@ -1619,12 +1676,12 @@ func BenchmarkPoolInsert(b *testing.B) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
txs := make(types.Transactions, b.N)
for i := 0; i < b.N; i++ {
- txs[i] = transaction(uint64(i), big.NewInt(100000), key)
+ txs[i] = transaction(uint64(i), 100000, key)
}
// Benchmark importing the transactions into the queue
b.ResetTimer()
@@ -1643,14 +1700,14 @@ func benchmarkPoolBatchInsert(b *testing.B, size int) {
pool, key := setupTxPool()
defer pool.Stop()
- account, _ := deriveSender(transaction(0, big.NewInt(0), key))
+ account, _ := deriveSender(transaction(0, 0, key))
pool.currentState.AddBalance(account, big.NewInt(1000000))
batches := make([]types.Transactions, b.N)
for i := 0; i < b.N; i++ {
batches[i] = make(types.Transactions, size)
for j := 0; j < size; j++ {
- batches[i][j] = transaction(uint64(size*i+j), big.NewInt(100000), key)
+ batches[i][j] = transaction(uint64(size*i+j), 100000, key)
}
}
// Benchmark importing the transactions into the queue
diff --git a/core/types.go b/core/types.go
index 1cfbbab29..d0bbaf0aa 100644
--- a/core/types.go
+++ b/core/types.go
@@ -17,8 +17,6 @@
package core
import (
- "math/big"
-
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
@@ -34,7 +32,7 @@ type Validator interface {
// ValidateState validates the given statedb and optionally the receipts and
// gas used.
- ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas *big.Int) error
+ ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error
}
// Processor is an interface for processing blocks using a given initial state.
@@ -44,5 +42,5 @@ type Validator interface {
// of gas used in the process and return an error if any of the internal rules
// failed.
type Processor interface {
- Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, *big.Int, error)
+ Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error)
}
diff --git a/core/types/block.go b/core/types/block.go
index 1d00d9f93..92b868d9d 100644
--- a/core/types/block.go
+++ b/core/types/block.go
@@ -25,6 +25,7 @@ import (
"sort"
"sync/atomic"
"time"
+ "unsafe"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
@@ -77,8 +78,8 @@ type Header struct {
Bloom Bloom `json:"logsBloom" gencodec:"required"`
Difficulty *big.Int `json:"difficulty" gencodec:"required"`
Number *big.Int `json:"number" gencodec:"required"`
- GasLimit *big.Int `json:"gasLimit" gencodec:"required"`
- GasUsed *big.Int `json:"gasUsed" gencodec:"required"`
+ GasLimit uint64 `json:"gasLimit" gencodec:"required"`
+ GasUsed uint64 `json:"gasUsed" gencodec:"required"`
Time *big.Int `json:"timestamp" gencodec:"required"`
Extra []byte `json:"extraData" gencodec:"required"`
MixDigest common.Hash `json:"mixHash" gencodec:"required"`
@@ -89,8 +90,8 @@ type Header struct {
type headerMarshaling struct {
Difficulty *hexutil.Big
Number *hexutil.Big
- GasLimit *hexutil.Big
- GasUsed *hexutil.Big
+ GasLimit hexutil.Uint64
+ GasUsed hexutil.Uint64
Time *hexutil.Big
Extra hexutil.Bytes
Hash common.Hash `json:"hash"` // adds call to Hash() in MarshalJSON
@@ -121,6 +122,12 @@ func (h *Header) HashNoNonce() common.Hash {
})
}
+// Size returns the approximate memory used by all internal contents. It is used
+// to approximate and limit the memory consumption of various caches.
+func (h *Header) Size() common.StorageSize {
+ return common.StorageSize(unsafe.Sizeof(*h)) + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen()+h.Time.BitLen())/8)
+}
+
func rlpHash(x interface{}) (h common.Hash) {
hw := sha3.NewKeccak256()
rlp.Encode(hw, x)
@@ -243,12 +250,6 @@ func CopyHeader(h *Header) *Header {
if cpy.Number = new(big.Int); h.Number != nil {
cpy.Number.Set(h.Number)
}
- if cpy.GasLimit = new(big.Int); h.GasLimit != nil {
- cpy.GasLimit.Set(h.GasLimit)
- }
- if cpy.GasUsed = new(big.Int); h.GasUsed != nil {
- cpy.GasUsed.Set(h.GasUsed)
- }
if len(h.Extra) > 0 {
cpy.Extra = make([]byte, len(h.Extra))
copy(cpy.Extra, h.Extra)
@@ -302,8 +303,8 @@ func (b *Block) Transaction(hash common.Hash) *Transaction {
}
func (b *Block) Number() *big.Int { return new(big.Int).Set(b.header.Number) }
-func (b *Block) GasLimit() *big.Int { return new(big.Int).Set(b.header.GasLimit) }
-func (b *Block) GasUsed() *big.Int { return new(big.Int).Set(b.header.GasUsed) }
+func (b *Block) GasLimit() uint64 { return b.header.GasLimit }
+func (b *Block) GasUsed() uint64 { return b.header.GasUsed }
func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) }
func (b *Block) Time() *big.Int { return new(big.Int).Set(b.header.Time) }
@@ -328,6 +329,8 @@ func (b *Block) HashNoNonce() common.Hash {
return b.header.HashNoNonce()
}
+// Size returns the true RLP encoded storage size of the block, either by encoding
+// and returning it, or returning a previsouly cached value.
func (b *Block) Size() common.StorageSize {
if size := b.size.Load(); size != nil {
return size.(common.StorageSize)
diff --git a/core/types/block_test.go b/core/types/block_test.go
index 93435ca00..a35fbc25b 100644
--- a/core/types/block_test.go
+++ b/core/types/block_test.go
@@ -41,8 +41,8 @@ func TestBlockEncoding(t *testing.T) {
}
}
check("Difficulty", block.Difficulty(), big.NewInt(131072))
- check("GasLimit", block.GasLimit(), big.NewInt(3141592))
- check("GasUsed", block.GasUsed(), big.NewInt(21000))
+ check("GasLimit", block.GasLimit(), uint64(3141592))
+ check("GasUsed", block.GasUsed(), uint64(21000))
check("Coinbase", block.Coinbase(), common.HexToAddress("8888f1f195afa192cfee860698584c030f4c9db1"))
check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498"))
check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017"))
@@ -51,7 +51,7 @@ func TestBlockEncoding(t *testing.T) {
check("Time", block.Time(), big.NewInt(1426516743))
check("Size", block.Size(), common.StorageSize(len(blockEnc)))
- tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), big.NewInt(50000), big.NewInt(10), nil)
+ tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil)
tx1, _ = tx1.WithSignature(HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100"))
fmt.Println(block.Transactions()[0].Hash())
diff --git a/core/types/gen_header_json.go b/core/types/gen_header_json.go
index bcff7a940..1b92cd9cf 100644
--- a/core/types/gen_header_json.go
+++ b/core/types/gen_header_json.go
@@ -11,6 +11,8 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
)
+var _ = (*headerMarshaling)(nil)
+
func (h Header) MarshalJSON() ([]byte, error) {
type Header struct {
ParentHash common.Hash `json:"parentHash" gencodec:"required"`
@@ -22,8 +24,8 @@ func (h Header) MarshalJSON() ([]byte, error) {
Bloom Bloom `json:"logsBloom" gencodec:"required"`
Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"`
Number *hexutil.Big `json:"number" gencodec:"required"`
- GasLimit *hexutil.Big `json:"gasLimit" gencodec:"required"`
- GasUsed *hexutil.Big `json:"gasUsed" gencodec:"required"`
+ GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"`
+ GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
Time *hexutil.Big `json:"timestamp" gencodec:"required"`
Extra hexutil.Bytes `json:"extraData" gencodec:"required"`
MixDigest common.Hash `json:"mixHash" gencodec:"required"`
@@ -40,8 +42,8 @@ func (h Header) MarshalJSON() ([]byte, error) {
enc.Bloom = h.Bloom
enc.Difficulty = (*hexutil.Big)(h.Difficulty)
enc.Number = (*hexutil.Big)(h.Number)
- enc.GasLimit = (*hexutil.Big)(h.GasLimit)
- enc.GasUsed = (*hexutil.Big)(h.GasUsed)
+ enc.GasLimit = hexutil.Uint64(h.GasLimit)
+ enc.GasUsed = hexutil.Uint64(h.GasUsed)
enc.Time = (*hexutil.Big)(h.Time)
enc.Extra = h.Extra
enc.MixDigest = h.MixDigest
@@ -61,10 +63,10 @@ func (h *Header) UnmarshalJSON(input []byte) error {
Bloom *Bloom `json:"logsBloom" gencodec:"required"`
Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"`
Number *hexutil.Big `json:"number" gencodec:"required"`
- GasLimit *hexutil.Big `json:"gasLimit" gencodec:"required"`
- GasUsed *hexutil.Big `json:"gasUsed" gencodec:"required"`
+ GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"`
+ GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
Time *hexutil.Big `json:"timestamp" gencodec:"required"`
- Extra hexutil.Bytes `json:"extraData" gencodec:"required"`
+ Extra *hexutil.Bytes `json:"extraData" gencodec:"required"`
MixDigest *common.Hash `json:"mixHash" gencodec:"required"`
Nonce *BlockNonce `json:"nonce" gencodec:"required"`
}
@@ -111,11 +113,11 @@ func (h *Header) UnmarshalJSON(input []byte) error {
if dec.GasLimit == nil {
return errors.New("missing required field 'gasLimit' for Header")
}
- h.GasLimit = (*big.Int)(dec.GasLimit)
+ h.GasLimit = uint64(*dec.GasLimit)
if dec.GasUsed == nil {
return errors.New("missing required field 'gasUsed' for Header")
}
- h.GasUsed = (*big.Int)(dec.GasUsed)
+ h.GasUsed = uint64(*dec.GasUsed)
if dec.Time == nil {
return errors.New("missing required field 'timestamp' for Header")
}
@@ -123,7 +125,7 @@ func (h *Header) UnmarshalJSON(input []byte) error {
if dec.Extra == nil {
return errors.New("missing required field 'extraData' for Header")
}
- h.Extra = dec.Extra
+ h.Extra = *dec.Extra
if dec.MixDigest == nil {
return errors.New("missing required field 'mixHash' for Header")
}
diff --git a/core/types/gen_log_json.go b/core/types/gen_log_json.go
index 92c699c2a..1b5ae3c65 100644
--- a/core/types/gen_log_json.go
+++ b/core/types/gen_log_json.go
@@ -10,6 +10,8 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
)
+var _ = (*logMarshaling)(nil)
+
func (l Log) MarshalJSON() ([]byte, error) {
type Log struct {
Address common.Address `json:"address" gencodec:"required"`
@@ -39,7 +41,7 @@ func (l *Log) UnmarshalJSON(input []byte) error {
type Log struct {
Address *common.Address `json:"address" gencodec:"required"`
Topics []common.Hash `json:"topics" gencodec:"required"`
- Data hexutil.Bytes `json:"data" gencodec:"required"`
+ Data *hexutil.Bytes `json:"data" gencodec:"required"`
BlockNumber *hexutil.Uint64 `json:"blockNumber"`
TxHash *common.Hash `json:"transactionHash" gencodec:"required"`
TxIndex *hexutil.Uint `json:"transactionIndex" gencodec:"required"`
@@ -62,7 +64,7 @@ func (l *Log) UnmarshalJSON(input []byte) error {
if dec.Data == nil {
return errors.New("missing required field 'data' for Log")
}
- l.Data = dec.Data
+ l.Data = *dec.Data
if dec.BlockNumber != nil {
l.BlockNumber = uint64(*dec.BlockNumber)
}
diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go
index b95d99c95..c297adebb 100644
--- a/core/types/gen_receipt_json.go
+++ b/core/types/gen_receipt_json.go
@@ -5,52 +5,53 @@ package types
import (
"encoding/json"
"errors"
- "math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
)
+var _ = (*receiptMarshaling)(nil)
+
func (r Receipt) MarshalJSON() ([]byte, error) {
type Receipt struct {
PostState hexutil.Bytes `json:"root"`
Status hexutil.Uint `json:"status"`
- CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"`
+ CumulativeGasUsed hexutil.Uint64 `json:"cumulativeGasUsed" gencodec:"required"`
Bloom Bloom `json:"logsBloom" gencodec:"required"`
Logs []*Log `json:"logs" gencodec:"required"`
TxHash common.Hash `json:"transactionHash" gencodec:"required"`
ContractAddress common.Address `json:"contractAddress"`
- GasUsed *hexutil.Big `json:"gasUsed" gencodec:"required"`
+ GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
}
var enc Receipt
enc.PostState = r.PostState
enc.Status = hexutil.Uint(r.Status)
- enc.CumulativeGasUsed = (*hexutil.Big)(r.CumulativeGasUsed)
+ enc.CumulativeGasUsed = hexutil.Uint64(r.CumulativeGasUsed)
enc.Bloom = r.Bloom
enc.Logs = r.Logs
enc.TxHash = r.TxHash
enc.ContractAddress = r.ContractAddress
- enc.GasUsed = (*hexutil.Big)(r.GasUsed)
+ enc.GasUsed = hexutil.Uint64(r.GasUsed)
return json.Marshal(&enc)
}
func (r *Receipt) UnmarshalJSON(input []byte) error {
type Receipt struct {
- PostState hexutil.Bytes `json:"root"`
+ PostState *hexutil.Bytes `json:"root"`
Status *hexutil.Uint `json:"status"`
- CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"`
+ CumulativeGasUsed *hexutil.Uint64 `json:"cumulativeGasUsed" gencodec:"required"`
Bloom *Bloom `json:"logsBloom" gencodec:"required"`
Logs []*Log `json:"logs" gencodec:"required"`
TxHash *common.Hash `json:"transactionHash" gencodec:"required"`
ContractAddress *common.Address `json:"contractAddress"`
- GasUsed *hexutil.Big `json:"gasUsed" gencodec:"required"`
+ GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
}
var dec Receipt
if err := json.Unmarshal(input, &dec); err != nil {
return err
}
if dec.PostState != nil {
- r.PostState = dec.PostState
+ r.PostState = *dec.PostState
}
if dec.Status != nil {
r.Status = uint(*dec.Status)
@@ -58,7 +59,7 @@ func (r *Receipt) UnmarshalJSON(input []byte) error {
if dec.CumulativeGasUsed == nil {
return errors.New("missing required field 'cumulativeGasUsed' for Receipt")
}
- r.CumulativeGasUsed = (*big.Int)(dec.CumulativeGasUsed)
+ r.CumulativeGasUsed = uint64(*dec.CumulativeGasUsed)
if dec.Bloom == nil {
return errors.New("missing required field 'logsBloom' for Receipt")
}
@@ -77,6 +78,6 @@ func (r *Receipt) UnmarshalJSON(input []byte) error {
if dec.GasUsed == nil {
return errors.New("missing required field 'gasUsed' for Receipt")
}
- r.GasUsed = (*big.Int)(dec.GasUsed)
+ r.GasUsed = uint64(*dec.GasUsed)
return nil
}
diff --git a/core/types/gen_tx_json.go b/core/types/gen_tx_json.go
index 4fb658e0d..c27da6709 100644
--- a/core/types/gen_tx_json.go
+++ b/core/types/gen_tx_json.go
@@ -11,11 +11,13 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
)
+var _ = (*txdataMarshaling)(nil)
+
func (t txdata) MarshalJSON() ([]byte, error) {
type txdata struct {
AccountNonce hexutil.Uint64 `json:"nonce" gencodec:"required"`
Price *hexutil.Big `json:"gasPrice" gencodec:"required"`
- GasLimit *hexutil.Big `json:"gas" gencodec:"required"`
+ GasLimit hexutil.Uint64 `json:"gas" gencodec:"required"`
Recipient *common.Address `json:"to" rlp:"nil"`
Amount *hexutil.Big `json:"value" gencodec:"required"`
Payload hexutil.Bytes `json:"input" gencodec:"required"`
@@ -27,7 +29,7 @@ func (t txdata) MarshalJSON() ([]byte, error) {
var enc txdata
enc.AccountNonce = hexutil.Uint64(t.AccountNonce)
enc.Price = (*hexutil.Big)(t.Price)
- enc.GasLimit = (*hexutil.Big)(t.GasLimit)
+ enc.GasLimit = hexutil.Uint64(t.GasLimit)
enc.Recipient = t.Recipient
enc.Amount = (*hexutil.Big)(t.Amount)
enc.Payload = t.Payload
@@ -42,10 +44,10 @@ func (t *txdata) UnmarshalJSON(input []byte) error {
type txdata struct {
AccountNonce *hexutil.Uint64 `json:"nonce" gencodec:"required"`
Price *hexutil.Big `json:"gasPrice" gencodec:"required"`
- GasLimit *hexutil.Big `json:"gas" gencodec:"required"`
+ GasLimit *hexutil.Uint64 `json:"gas" gencodec:"required"`
Recipient *common.Address `json:"to" rlp:"nil"`
Amount *hexutil.Big `json:"value" gencodec:"required"`
- Payload hexutil.Bytes `json:"input" gencodec:"required"`
+ Payload *hexutil.Bytes `json:"input" gencodec:"required"`
V *hexutil.Big `json:"v" gencodec:"required"`
R *hexutil.Big `json:"r" gencodec:"required"`
S *hexutil.Big `json:"s" gencodec:"required"`
@@ -66,7 +68,7 @@ func (t *txdata) UnmarshalJSON(input []byte) error {
if dec.GasLimit == nil {
return errors.New("missing required field 'gas' for txdata")
}
- t.GasLimit = (*big.Int)(dec.GasLimit)
+ t.GasLimit = uint64(*dec.GasLimit)
if dec.Recipient != nil {
t.Recipient = dec.Recipient
}
@@ -77,7 +79,7 @@ func (t *txdata) UnmarshalJSON(input []byte) error {
if dec.Payload == nil {
return errors.New("missing required field 'input' for txdata")
}
- t.Payload = dec.Payload
+ t.Payload = *dec.Payload
if dec.V == nil {
return errors.New("missing required field 'v' for txdata")
}
diff --git a/core/types/receipt.go b/core/types/receipt.go
index bc3c996b4..f945f6f6a 100644
--- a/core/types/receipt.go
+++ b/core/types/receipt.go
@@ -20,7 +20,7 @@ import (
"bytes"
"fmt"
"io"
- "math/big"
+ "unsafe"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
@@ -45,46 +45,46 @@ const (
// Receipt represents the results of a transaction.
type Receipt struct {
// Consensus fields
- PostState []byte `json:"root"`
- Status uint `json:"status"`
- CumulativeGasUsed *big.Int `json:"cumulativeGasUsed" gencodec:"required"`
- Bloom Bloom `json:"logsBloom" gencodec:"required"`
- Logs []*Log `json:"logs" gencodec:"required"`
+ PostState []byte `json:"root"`
+ Status uint `json:"status"`
+ CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required"`
+ Bloom Bloom `json:"logsBloom" gencodec:"required"`
+ Logs []*Log `json:"logs" gencodec:"required"`
// Implementation fields (don't reorder!)
TxHash common.Hash `json:"transactionHash" gencodec:"required"`
ContractAddress common.Address `json:"contractAddress"`
- GasUsed *big.Int `json:"gasUsed" gencodec:"required"`
+ GasUsed uint64 `json:"gasUsed" gencodec:"required"`
}
type receiptMarshaling struct {
PostState hexutil.Bytes
Status hexutil.Uint
- CumulativeGasUsed *hexutil.Big
- GasUsed *hexutil.Big
+ CumulativeGasUsed hexutil.Uint64
+ GasUsed hexutil.Uint64
}
// receiptRLP is the consensus encoding of a receipt.
type receiptRLP struct {
PostStateOrStatus []byte
- CumulativeGasUsed *big.Int
+ CumulativeGasUsed uint64
Bloom Bloom
Logs []*Log
}
type receiptStorageRLP struct {
PostStateOrStatus []byte
- CumulativeGasUsed *big.Int
+ CumulativeGasUsed uint64
Bloom Bloom
TxHash common.Hash
ContractAddress common.Address
Logs []*LogForStorage
- GasUsed *big.Int
+ GasUsed uint64
}
// NewReceipt creates a barebone transaction receipt, copying the init fields.
-func NewReceipt(root []byte, failed bool, cumulativeGasUsed *big.Int) *Receipt {
- r := &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: new(big.Int).Set(cumulativeGasUsed)}
+func NewReceipt(root []byte, failed bool, cumulativeGasUsed uint64) *Receipt {
+ r := &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: cumulativeGasUsed}
if failed {
r.Status = ReceiptStatusFailed
} else {
@@ -137,6 +137,18 @@ func (r *Receipt) statusEncoding() []byte {
return r.PostState
}
+// Size returns the approximate memory used by all internal contents. It is used
+// to approximate and limit the memory consumption of various caches.
+func (r *Receipt) Size() common.StorageSize {
+ size := common.StorageSize(unsafe.Sizeof(*r)) + common.StorageSize(len(r.PostState))
+
+ size += common.StorageSize(len(r.Logs)) * common.StorageSize(unsafe.Sizeof(Log{}))
+ for _, log := range r.Logs {
+ size += common.StorageSize(len(log.Topics)*common.HashLength + len(log.Data))
+ }
+ return size
+}
+
// String implements the Stringer interface.
func (r *Receipt) String() string {
if len(r.PostState) == 0 {
diff --git a/core/types/transaction.go b/core/types/transaction.go
index 7e2933bb1..5660582ba 100644
--- a/core/types/transaction.go
+++ b/core/types/transaction.go
@@ -57,7 +57,7 @@ type Transaction struct {
type txdata struct {
AccountNonce uint64 `json:"nonce" gencodec:"required"`
Price *big.Int `json:"gasPrice" gencodec:"required"`
- GasLimit *big.Int `json:"gas" gencodec:"required"`
+ GasLimit uint64 `json:"gas" gencodec:"required"`
Recipient *common.Address `json:"to" rlp:"nil"` // nil means contract creation
Amount *big.Int `json:"value" gencodec:"required"`
Payload []byte `json:"input" gencodec:"required"`
@@ -74,7 +74,7 @@ type txdata struct {
type txdataMarshaling struct {
AccountNonce hexutil.Uint64
Price *hexutil.Big
- GasLimit *hexutil.Big
+ GasLimit hexutil.Uint64
Amount *hexutil.Big
Payload hexutil.Bytes
V *hexutil.Big
@@ -82,15 +82,15 @@ type txdataMarshaling struct {
S *hexutil.Big
}
-func NewTransaction(nonce uint64, to common.Address, amount, gasLimit, gasPrice *big.Int, data []byte) *Transaction {
+func NewTransaction(nonce uint64, to common.Address, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *Transaction {
return newTransaction(nonce, &to, amount, gasLimit, gasPrice, data)
}
-func NewContractCreation(nonce uint64, amount, gasLimit, gasPrice *big.Int, data []byte) *Transaction {
+func NewContractCreation(nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *Transaction {
return newTransaction(nonce, nil, amount, gasLimit, gasPrice, data)
}
-func newTransaction(nonce uint64, to *common.Address, amount, gasLimit, gasPrice *big.Int, data []byte) *Transaction {
+func newTransaction(nonce uint64, to *common.Address, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *Transaction {
if len(data) > 0 {
data = common.CopyBytes(data)
}
@@ -99,7 +99,7 @@ func newTransaction(nonce uint64, to *common.Address, amount, gasLimit, gasPrice
Recipient: to,
Payload: data,
Amount: new(big.Int),
- GasLimit: new(big.Int),
+ GasLimit: gasLimit,
Price: new(big.Int),
V: new(big.Int),
R: new(big.Int),
@@ -108,9 +108,6 @@ func newTransaction(nonce uint64, to *common.Address, amount, gasLimit, gasPrice
if amount != nil {
d.Amount.Set(amount)
}
- if gasLimit != nil {
- d.GasLimit.Set(gasLimit)
- }
if gasPrice != nil {
d.Price.Set(gasPrice)
}
@@ -153,6 +150,7 @@ func (tx *Transaction) DecodeRLP(s *rlp.Stream) error {
return err
}
+// MarshalJSON encodes the web3 RPC transaction format.
func (tx *Transaction) MarshalJSON() ([]byte, error) {
hash := tx.Hash()
data := tx.data
@@ -168,8 +166,8 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error {
}
var V byte
if isProtectedV(dec.V) {
- chainId := deriveChainId(dec.V).Uint64()
- V = byte(dec.V.Uint64() - 35 - 2*chainId)
+ chainID := deriveChainId(dec.V).Uint64()
+ V = byte(dec.V.Uint64() - 35 - 2*chainID)
} else {
V = byte(dec.V.Uint64() - 27)
}
@@ -181,7 +179,7 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error {
}
func (tx *Transaction) Data() []byte { return common.CopyBytes(tx.data.Payload) }
-func (tx *Transaction) Gas() *big.Int { return new(big.Int).Set(tx.data.GasLimit) }
+func (tx *Transaction) Gas() uint64 { return tx.data.GasLimit }
func (tx *Transaction) GasPrice() *big.Int { return new(big.Int).Set(tx.data.Price) }
func (tx *Transaction) Value() *big.Int { return new(big.Int).Set(tx.data.Amount) }
func (tx *Transaction) Nonce() uint64 { return tx.data.AccountNonce }
@@ -192,10 +190,9 @@ func (tx *Transaction) CheckNonce() bool { return true }
func (tx *Transaction) To() *common.Address {
if tx.data.Recipient == nil {
return nil
- } else {
- to := *tx.data.Recipient
- return &to
}
+ to := *tx.data.Recipient
+ return &to
}
// Hash hashes the RLP encoding of tx.
@@ -209,6 +206,8 @@ func (tx *Transaction) Hash() common.Hash {
return v
}
+// Size returns the true RLP encoded storage size of the transaction, either by
+// encoding and returning it, or returning a previsouly cached value.
func (tx *Transaction) Size() common.StorageSize {
if size := tx.size.Load(); size != nil {
return size.(common.StorageSize)
@@ -227,8 +226,8 @@ func (tx *Transaction) Size() common.StorageSize {
func (tx *Transaction) AsMessage(s Signer) (Message, error) {
msg := Message{
nonce: tx.data.AccountNonce,
- price: new(big.Int).Set(tx.data.Price),
- gasLimit: new(big.Int).Set(tx.data.GasLimit),
+ gasLimit: tx.data.GasLimit,
+ gasPrice: new(big.Int).Set(tx.data.Price),
to: tx.data.Recipient,
amount: tx.data.Amount,
data: tx.data.Payload,
@@ -254,7 +253,7 @@ func (tx *Transaction) WithSignature(signer Signer, sig []byte) (*Transaction, e
// Cost returns amount + gasprice * gaslimit.
func (tx *Transaction) Cost() *big.Int {
- total := new(big.Int).Mul(tx.data.Price, tx.data.GasLimit)
+ total := new(big.Int).Mul(tx.data.Price, new(big.Int).SetUint64(tx.data.GasLimit))
total.Add(total, tx.data.Amount)
return total
}
@@ -315,22 +314,22 @@ func (tx *Transaction) String() string {
)
}
-// Transaction slice type for basic sorting.
+// Transactions is a Transaction slice type for basic sorting.
type Transactions []*Transaction
-// Len returns the length of s
+// Len returns the length of s.
func (s Transactions) Len() int { return len(s) }
-// Swap swaps the i'th and the j'th element in s
+// Swap swaps the i'th and the j'th element in s.
func (s Transactions) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-// GetRlp implements Rlpable and returns the i'th element of s in rlp
+// GetRlp implements Rlpable and returns the i'th element of s in rlp.
func (s Transactions) GetRlp(i int) []byte {
enc, _ := rlp.EncodeToBytes(s[i])
return enc
}
-// Returns a new set t which is the difference between a to b
+// TxDifference returns a new set t which is the difference between a to b.
func TxDifference(a, b Transactions) (keep Transactions) {
keep = make(Transactions, 0, len(a))
@@ -378,7 +377,7 @@ func (s *TxByPrice) Pop() interface{} {
}
// TransactionsByPriceAndNonce represents a set of transactions that can return
-// transactions in a profit-maximising sorted order, while supporting removing
+// transactions in a profit-maximizing sorted order, while supporting removing
// entire batches of transactions for non-executable accounts.
type TransactionsByPriceAndNonce struct {
txs map[common.Address]Transactions // Per account nonce-sorted list of transactions
@@ -440,22 +439,24 @@ func (t *TransactionsByPriceAndNonce) Pop() {
//
// NOTE: In a future PR this will be removed.
type Message struct {
- to *common.Address
- from common.Address
- nonce uint64
- amount, price, gasLimit *big.Int
- data []byte
- checkNonce bool
+ to *common.Address
+ from common.Address
+ nonce uint64
+ amount *big.Int
+ gasLimit uint64
+ gasPrice *big.Int
+ data []byte
+ checkNonce bool
}
-func NewMessage(from common.Address, to *common.Address, nonce uint64, amount, gasLimit, price *big.Int, data []byte, checkNonce bool) Message {
+func NewMessage(from common.Address, to *common.Address, nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte, checkNonce bool) Message {
return Message{
from: from,
to: to,
nonce: nonce,
amount: amount,
- price: price,
gasLimit: gasLimit,
+ gasPrice: gasPrice,
data: data,
checkNonce: checkNonce,
}
@@ -463,9 +464,9 @@ func NewMessage(from common.Address, to *common.Address, nonce uint64, amount, g
func (m Message) From() common.Address { return m.from }
func (m Message) To() *common.Address { return m.to }
-func (m Message) GasPrice() *big.Int { return m.price }
+func (m Message) GasPrice() *big.Int { return m.gasPrice }
func (m Message) Value() *big.Int { return m.amount }
-func (m Message) Gas() *big.Int { return m.gasLimit }
+func (m Message) Gas() uint64 { return m.gasLimit }
func (m Message) Nonce() uint64 { return m.nonce }
func (m Message) Data() []byte { return m.data }
func (m Message) CheckNonce() bool { return m.checkNonce }
diff --git a/core/types/transaction_signing_test.go b/core/types/transaction_signing_test.go
index 7f799fb10..689fc38a9 100644
--- a/core/types/transaction_signing_test.go
+++ b/core/types/transaction_signing_test.go
@@ -30,7 +30,7 @@ func TestEIP155Signing(t *testing.T) {
addr := crypto.PubkeyToAddress(key.PublicKey)
signer := NewEIP155Signer(big.NewInt(18))
- tx, err := SignTx(NewTransaction(0, addr, new(big.Int), new(big.Int), new(big.Int), nil), signer, key)
+ tx, err := SignTx(NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil), signer, key)
if err != nil {
t.Fatal(err)
}
@@ -49,7 +49,7 @@ func TestEIP155ChainId(t *testing.T) {
addr := crypto.PubkeyToAddress(key.PublicKey)
signer := NewEIP155Signer(big.NewInt(18))
- tx, err := SignTx(NewTransaction(0, addr, new(big.Int), new(big.Int), new(big.Int), nil), signer, key)
+ tx, err := SignTx(NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil), signer, key)
if err != nil {
t.Fatal(err)
}
@@ -61,7 +61,7 @@ func TestEIP155ChainId(t *testing.T) {
t.Error("expected chainId to be", signer.chainId, "got", tx.ChainId())
}
- tx = NewTransaction(0, addr, new(big.Int), new(big.Int), new(big.Int), nil)
+ tx = NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil)
tx, err = SignTx(tx, HomesteadSigner{}, key)
if err != nil {
t.Fatal(err)
@@ -118,7 +118,7 @@ func TestEIP155SigningVitalik(t *testing.T) {
func TestChainId(t *testing.T) {
key, _ := defaultTestKey()
- tx := NewTransaction(0, common.Address{}, new(big.Int), new(big.Int), new(big.Int), nil)
+ tx := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil)
var err error
tx, err = SignTx(tx, NewEIP155Signer(big.NewInt(1)), key)
diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go
index 82d74e3b3..d1861b14c 100644
--- a/core/types/transaction_test.go
+++ b/core/types/transaction_test.go
@@ -34,7 +34,7 @@ var (
emptyTx = NewTransaction(
0,
common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"),
- big.NewInt(0), big.NewInt(0), big.NewInt(0),
+ big.NewInt(0), 0, big.NewInt(0),
nil,
)
@@ -42,7 +42,7 @@ var (
3,
common.HexToAddress("b94f5374fce5edbc8e2a8697c15331677e6ebf0b"),
big.NewInt(10),
- big.NewInt(2000),
+ 2000,
big.NewInt(1),
common.FromHex("5544"),
).WithSignature(
@@ -139,7 +139,7 @@ func TestTransactionPriceNonceSort(t *testing.T) {
for start, key := range keys {
addr := crypto.PubkeyToAddress(key.PublicKey)
for i := 0; i < 25; i++ {
- tx, _ := SignTx(NewTransaction(uint64(start+i), common.Address{}, big.NewInt(100), big.NewInt(100), big.NewInt(int64(start+i)), nil), signer, key)
+ tx, _ := SignTx(NewTransaction(uint64(start+i), common.Address{}, big.NewInt(100), 100, big.NewInt(int64(start+i)), nil), signer, key)
groups[addr] = append(groups[addr], tx)
}
}
@@ -204,9 +204,9 @@ func TestTransactionJSON(t *testing.T) {
var tx *Transaction
switch i % 2 {
case 0:
- tx = NewTransaction(i, common.Address{1}, common.Big0, common.Big1, common.Big2, []byte("abcdef"))
+ tx = NewTransaction(i, common.Address{1}, common.Big0, 1, common.Big2, []byte("abcdef"))
case 1:
- tx = NewContractCreation(i, common.Big0, common.Big1, common.Big2, []byte("abcdef"))
+ tx = NewContractCreation(i, common.Big0, 1, common.Big2, []byte("abcdef"))
}
tx, err := SignTx(tx, signer, key)
diff --git a/core/vm/evm.go b/core/vm/evm.go
index 344435f73..46e7baff4 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -19,6 +19,7 @@ package vm
import (
"math/big"
"sync/atomic"
+ "time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
@@ -38,7 +39,7 @@ type (
)
// run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter.
-func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, error) {
+func run(evm *EVM, contract *Contract, input []byte) ([]byte, error) {
if contract.CodeAddr != nil {
precompiles := PrecompiledContractsHomestead
if evm.ChainConfig().IsByzantium(evm.BlockNumber) {
@@ -48,7 +49,7 @@ func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, erro
return RunPrecompiledContract(p, input, contract)
}
}
- return evm.interpreter.Run(snapshot, contract, input)
+ return evm.interpreter.Run(contract, input)
}
// Context provides the EVM with auxiliary information. Once provided
@@ -68,7 +69,7 @@ type Context struct {
// Block information
Coinbase common.Address // Provides information for COINBASE
- GasLimit *big.Int // Provides information for GASLIMIT
+ GasLimit uint64 // Provides information for GASLIMIT
BlockNumber *big.Int // Provides information for NUMBER
Time *big.Int // Provides information for TIME
Difficulty *big.Int // Provides information for DIFFICULTY
@@ -165,13 +166,23 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
}
evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value)
- // initialise a new contract and set the code that is to be used by the
- // E The contract is a scoped environment for this execution context
- // only.
+ // Initialise a new contract and set the code that is to be used by the EVM.
+ // The contract is a scoped environment for this execution context only.
contract := NewContract(caller, to, value, gas)
contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))
- ret, err = run(evm, snapshot, contract, input)
+ start := time.Now()
+
+ // Capture the tracer start/end events in debug mode
+ if evm.vmConfig.Debug && evm.depth == 0 {
+ evm.vmConfig.Tracer.CaptureStart(caller.Address(), addr, false, input, gas, value)
+
+ defer func() { // Lazy evaluation of the parameters
+ evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)
+ }()
+ }
+ ret, err = run(evm, contract, input)
+
// When an error was returned by the EVM or when setting the creation code
// above we revert to the snapshot and consume any gas remaining. Additionally
// when we're in homestead this also counts for code storage gas errors.
@@ -215,7 +226,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte,
contract := NewContract(caller, to, value, gas)
contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))
- ret, err = run(evm, snapshot, contract, input)
+ ret, err = run(evm, contract, input)
if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
@@ -248,7 +259,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by
contract := NewContract(caller, to, nil, gas).AsDelegate()
contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))
- ret, err = run(evm, snapshot, contract, input)
+ ret, err = run(evm, contract, input)
if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
@@ -291,7 +302,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte
// When an error was returned by the EVM or when setting the creation code
// above we revert to the snapshot and consume any gas remaining. Additionally
// when we're in Homestead this also counts for code storage gas errors.
- ret, err = run(evm, snapshot, contract, input)
+ ret, err = run(evm, contract, input)
if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
@@ -338,7 +349,14 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I
if evm.vmConfig.NoRecursion && evm.depth > 0 {
return nil, contractAddr, gas, nil
}
- ret, err = run(evm, snapshot, contract, nil)
+
+ if evm.vmConfig.Debug && evm.depth == 0 {
+ evm.vmConfig.Tracer.CaptureStart(caller.Address(), contractAddr, true, code, gas, value)
+ }
+ start := time.Now()
+
+ ret, err = run(evm, contract, nil)
+
// check whether the max code size has been exceeded
maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize
// if the contract creation ran successfully and no errors were returned
@@ -367,10 +385,13 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I
if maxCodeSizeExceeded && err == nil {
err = errMaxCodeSizeExceeded
}
+ if evm.vmConfig.Debug && evm.depth == 0 {
+ evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)
+ }
return ret, contractAddr, contract.Gas, err
}
-// ChainConfig returns the evmironment's chain configuration
+// ChainConfig returns the environment's chain configuration
func (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig }
// Interpreter returns the EVM interpreter
diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go
index ff109af57..83adba428 100644
--- a/core/vm/gas_table.go
+++ b/core/vm/gas_table.go
@@ -17,8 +17,6 @@
package vm
import (
- "math/big"
-
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/params"
@@ -130,7 +128,7 @@ func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, m
// 0 => non 0
return params.SstoreSetGas, nil
} else if !common.EmptyHash(val) && common.EmptyHash(common.BigToHash(y)) {
- evm.StateDB.AddRefund(new(big.Int).SetUint64(params.SstoreRefundGas))
+ evm.StateDB.AddRefund(params.SstoreRefundGas)
return params.SstoreClearGas, nil
} else {
@@ -405,7 +403,7 @@ func gasSuicide(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack,
}
if !evm.StateDB.HasSuicided(contract.Address()) {
- evm.StateDB.AddRefund(new(big.Int).SetUint64(params.SuicideRefundGas))
+ evm.StateDB.AddRefund(params.SuicideRefundGas)
}
return gas, nil
}
diff --git a/core/vm/gen_structlog.go b/core/vm/gen_structlog.go
index 88df942dc..ade3ca631 100644
--- a/core/vm/gen_structlog.go
+++ b/core/vm/gen_structlog.go
@@ -11,19 +11,22 @@ import (
"github.com/ethereum/go-ethereum/common/math"
)
+var _ = (*structLogMarshaling)(nil)
+
func (s StructLog) MarshalJSON() ([]byte, error) {
type StructLog struct {
- Pc uint64 `json:"pc"`
- Op OpCode `json:"op"`
- Gas math.HexOrDecimal64 `json:"gas"`
- GasCost math.HexOrDecimal64 `json:"gasCost"`
- Memory hexutil.Bytes `json:"memory"`
- MemorySize int `json:"memSize"`
- Stack []*math.HexOrDecimal256 `json:"stack"`
- Storage map[common.Hash]common.Hash `json:"-"`
- Depth int `json:"depth"`
- Err error `json:"error"`
- OpName string `json:"opName"`
+ Pc uint64 `json:"pc"`
+ Op OpCode `json:"op"`
+ Gas math.HexOrDecimal64 `json:"gas"`
+ GasCost math.HexOrDecimal64 `json:"gasCost"`
+ Memory hexutil.Bytes `json:"memory"`
+ MemorySize int `json:"memSize"`
+ Stack []*math.HexOrDecimal256 `json:"stack"`
+ Storage map[common.Hash]common.Hash `json:"-"`
+ Depth int `json:"depth"`
+ Err error `json:"-"`
+ OpName string `json:"opName"`
+ ErrorString string `json:"error"`
}
var enc StructLog
enc.Pc = s.Pc
@@ -42,6 +45,7 @@ func (s StructLog) MarshalJSON() ([]byte, error) {
enc.Depth = s.Depth
enc.Err = s.Err
enc.OpName = s.OpName()
+ enc.ErrorString = s.ErrorString()
return json.Marshal(&enc)
}
@@ -51,12 +55,12 @@ func (s *StructLog) UnmarshalJSON(input []byte) error {
Op *OpCode `json:"op"`
Gas *math.HexOrDecimal64 `json:"gas"`
GasCost *math.HexOrDecimal64 `json:"gasCost"`
- Memory hexutil.Bytes `json:"memory"`
+ Memory *hexutil.Bytes `json:"memory"`
MemorySize *int `json:"memSize"`
Stack []*math.HexOrDecimal256 `json:"stack"`
Storage map[common.Hash]common.Hash `json:"-"`
Depth *int `json:"depth"`
- Err *error `json:"error"`
+ Err error `json:"-"`
}
var dec StructLog
if err := json.Unmarshal(input, &dec); err != nil {
@@ -75,7 +79,7 @@ func (s *StructLog) UnmarshalJSON(input []byte) error {
s.GasCost = uint64(*dec.GasCost)
}
if dec.Memory != nil {
- s.Memory = dec.Memory
+ s.Memory = *dec.Memory
}
if dec.MemorySize != nil {
s.MemorySize = *dec.MemorySize
@@ -93,7 +97,7 @@ func (s *StructLog) UnmarshalJSON(input []byte) error {
s.Depth = *dec.Depth
}
if dec.Err != nil {
- s.Err = *dec.Err
+ s.Err = dec.Err
}
return nil
}
diff --git a/core/vm/instructions.go b/core/vm/instructions.go
index 1d1585fca..766172501 100644
--- a/core/vm/instructions.go
+++ b/core/vm/instructions.go
@@ -472,7 +472,7 @@ func opDifficulty(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stac
}
func opGasLimit(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
- stack.push(math.U256(new(big.Int).Set(evm.GasLimit)))
+ stack.push(math.U256(new(big.Int).SetUint64(evm.GasLimit)))
return nil, nil
}
diff --git a/core/vm/interface.go b/core/vm/interface.go
index c0c52732b..1ef91cf1d 100644
--- a/core/vm/interface.go
+++ b/core/vm/interface.go
@@ -39,8 +39,8 @@ type StateDB interface {
SetCode(common.Address, []byte)
GetCodeSize(common.Address) int
- AddRefund(*big.Int)
- GetRefund() *big.Int
+ AddRefund(uint64)
+ GetRefund() uint64
GetState(common.Address, common.Hash) common.Hash
SetState(common.Address, common.Hash, common.Hash)
diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go
index ac6000f97..482e67a3a 100644
--- a/core/vm/interpreter.go
+++ b/core/vm/interpreter.go
@@ -107,9 +107,9 @@ func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack
// the return byte-slice and an error if one occurred.
//
// It's important to note that any errors returned by the interpreter should be
-// considered a revert-and-consume-all-gas operation. No error specific checks
-// should be handled to reduce complexity and errors further down the in.
-func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret []byte, err error) {
+// considered a revert-and-consume-all-gas operation except for
+// errExecutionReverted which means revert-and-keep-gas-left.
+func (in *Interpreter) Run(contract *Contract, input []byte) (ret []byte, err error) {
// Increment the call depth which is restricted to 1024
in.evm.depth++
defer func() { in.evm.depth-- }()
@@ -144,12 +144,17 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret
)
contract.Input = input
- defer func() {
- if err != nil && !logged && in.cfg.Debug {
- in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err)
- }
- }()
-
+ if in.cfg.Debug {
+ defer func() {
+ if err != nil {
+ if !logged {
+ in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err)
+ } else {
+ in.cfg.Tracer.CaptureFault(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err)
+ }
+ }
+ }()
+ }
// The Interpreter main run loop (contextual). This loop runs until either an
// explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during
// the execution of one of the operations or until the done flag is set by the
diff --git a/core/vm/logger.go b/core/vm/logger.go
index 75309da92..4c820d8b5 100644
--- a/core/vm/logger.go
+++ b/core/vm/logger.go
@@ -62,29 +62,39 @@ type StructLog struct {
Stack []*big.Int `json:"stack"`
Storage map[common.Hash]common.Hash `json:"-"`
Depth int `json:"depth"`
- Err error `json:"error"`
+ Err error `json:"-"`
}
// overrides for gencodec
type structLogMarshaling struct {
- Stack []*math.HexOrDecimal256
- Gas math.HexOrDecimal64
- GasCost math.HexOrDecimal64
- Memory hexutil.Bytes
- OpName string `json:"opName"`
+ Stack []*math.HexOrDecimal256
+ Gas math.HexOrDecimal64
+ GasCost math.HexOrDecimal64
+ Memory hexutil.Bytes
+ OpName string `json:"opName"` // adds call to OpName() in MarshalJSON
+ ErrorString string `json:"error"` // adds call to ErrorString() in MarshalJSON
}
func (s *StructLog) OpName() string {
return s.Op.String()
}
+func (s *StructLog) ErrorString() string {
+ if s.Err != nil {
+ return s.Err.Error()
+ }
+ return ""
+}
+
// Tracer is used to collect execution traces from an EVM transaction
// execution. CaptureState is called for each step of the VM with the
// current VM state.
// Note that reference types are actual VM data structures; make copies
// if you need to retain them beyond the current call.
type Tracer interface {
+ CaptureStart(from common.Address, to common.Address, call bool, input []byte, gas uint64, value *big.Int) error
CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error
+ CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error
CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error
}
@@ -98,6 +108,8 @@ type StructLogger struct {
logs []StructLog
changedValues map[common.Address]Storage
+ output []byte
+ err error
}
// NewStructLogger returns a new logger
@@ -111,6 +123,10 @@ func NewStructLogger(cfg *LogConfig) *StructLogger {
return logger
}
+func (l *StructLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error {
+ return nil
+}
+
// CaptureState logs a new structured log message and pushes it out to the environment
//
// CaptureState also tracks SSTORE ops to track dirty values.
@@ -161,19 +177,25 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui
return nil
}
-func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {
- fmt.Printf("0x%x", output)
- if err != nil {
- fmt.Printf(" error: %v\n", err)
- }
+func (l *StructLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error {
return nil
}
-// StructLogs returns a list of captured log entries
-func (l *StructLogger) StructLogs() []StructLog {
- return l.logs
+func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {
+ l.output = output
+ l.err = err
+ return nil
}
+// StructLogs returns the captured log entries.
+func (l *StructLogger) StructLogs() []StructLog { return l.logs }
+
+// Error returns the VM error captured by the trace.
+func (l *StructLogger) Error() error { return l.err }
+
+// Output returns the VM return value captured by the trace.
+func (l *StructLogger) Output() []byte { return l.output }
+
// WriteTrace writes a formatted trace to the given writer
func WriteTrace(writer io.Writer, logs []StructLog) {
for _, log := range logs {
diff --git a/core/vm/noop.go b/core/vm/noop.go
index 2a04a9565..b71ead0d7 100644
--- a/core/vm/noop.go
+++ b/core/vm/noop.go
@@ -55,8 +55,8 @@ func (NoopStateDB) GetCodeHash(common.Address) common.Hash
func (NoopStateDB) GetCode(common.Address) []byte { return nil }
func (NoopStateDB) SetCode(common.Address, []byte) {}
func (NoopStateDB) GetCodeSize(common.Address) int { return 0 }
-func (NoopStateDB) AddRefund(*big.Int) {}
-func (NoopStateDB) GetRefund() *big.Int { return nil }
+func (NoopStateDB) AddRefund(uint64) {}
+func (NoopStateDB) GetRefund() uint64 { return 0 }
func (NoopStateDB) GetState(common.Address, common.Hash) common.Hash { return common.Hash{} }
func (NoopStateDB) SetState(common.Address, common.Hash, common.Hash) {}
func (NoopStateDB) Suicide(common.Address) bool { return false }
diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go
index 818da1be2..31c9b9cf9 100644
--- a/core/vm/runtime/env.go
+++ b/core/vm/runtime/env.go
@@ -17,8 +17,6 @@
package runtime
import (
- "math/big"
-
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/vm"
@@ -35,7 +33,7 @@ func NewEnv(cfg *Config) *vm.EVM {
BlockNumber: cfg.BlockNumber,
Time: cfg.Time,
Difficulty: cfg.Difficulty,
- GasLimit: new(big.Int).SetUint64(cfg.GasLimit),
+ GasLimit: cfg.GasLimit,
GasPrice: cfg.GasPrice,
}
diff --git a/crypto/crypto.go b/crypto/crypto.go
index 3a98bfb50..1c4d5a2e0 100644
--- a/crypto/crypto.go
+++ b/crypto/crypto.go
@@ -79,7 +79,7 @@ func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {
return toECDSA(d, true)
}
-// ToECDSAUnsafe blidly converts a binary blob to a private key. It should almost
+// ToECDSAUnsafe blindly converts a binary blob to a private key. It should almost
// never be used unless you are sure the input is valid and want to avoid hitting
// errors due to bad origin encoding (0 prefixes cut off).
func ToECDSAUnsafe(d []byte) *ecdsa.PrivateKey {
@@ -97,6 +97,16 @@ func toECDSA(d []byte, strict bool) (*ecdsa.PrivateKey, error) {
return nil, fmt.Errorf("invalid length, need %d bits", priv.Params().BitSize)
}
priv.D = new(big.Int).SetBytes(d)
+
+ // The priv.D must < N
+ if priv.D.Cmp(secp256k1_N) >= 0 {
+ return nil, fmt.Errorf("invalid private key, >=N")
+ }
+ // The priv.D must not be zero or negative.
+ if priv.D.Sign() <= 0 {
+ return nil, fmt.Errorf("invalid private key, zero or negative")
+ }
+
priv.PublicKey.X, priv.PublicKey.Y = priv.PublicKey.Curve.ScalarBaseMult(d)
if priv.PublicKey.X == nil {
return nil, errors.New("invalid private key")
diff --git a/crypto/ecies/ecies.go b/crypto/ecies/ecies.go
index 1d5f96ed2..2ed91c895 100644
--- a/crypto/ecies/ecies.go
+++ b/crypto/ecies/ecies.go
@@ -314,7 +314,7 @@ func (prv *PrivateKey) Decrypt(rand io.Reader, c, s1, s2 []byte) (m []byte, err
switch c[0] {
case 2, 3, 4:
- rLen = ((prv.PublicKey.Curve.Params().BitSize + 7) / 4)
+ rLen = (prv.PublicKey.Curve.Params().BitSize + 7) / 4
if len(c) < (rLen + hLen + 1) {
err = ErrInvalidMessage
return
diff --git a/crypto/secp256k1/curve.go b/crypto/secp256k1/curve.go
index ec6d266ce..df8048185 100644
--- a/crypto/secp256k1/curve.go
+++ b/crypto/secp256k1/curve.go
@@ -34,7 +34,6 @@ package secp256k1
import (
"crypto/elliptic"
"math/big"
- "sync"
"unsafe"
"github.com/ethereum/go-ethereum/common/math"
@@ -42,7 +41,7 @@ import (
/*
#include "libsecp256k1/include/secp256k1.h"
-extern int secp256k1_pubkey_scalar_mul(const secp256k1_context* ctx, const unsigned char *point, const unsigned char *scalar);
+extern int secp256k1_ext_scalar_mul(const secp256k1_context* ctx, const unsigned char *point, const unsigned char *scalar);
*/
import "C"
@@ -236,7 +235,7 @@ func (BitCurve *BitCurve) ScalarMult(Bx, By *big.Int, scalar []byte) (*big.Int,
math.ReadBits(By, point[32:])
pointPtr := (*C.uchar)(unsafe.Pointer(&point[0]))
scalarPtr := (*C.uchar)(unsafe.Pointer(&scalar[0]))
- res := C.secp256k1_pubkey_scalar_mul(context, pointPtr, scalarPtr)
+ res := C.secp256k1_ext_scalar_mul(context, pointPtr, scalarPtr)
// Unpack the result and clear temporaries.
x := new(big.Int).SetBytes(point[:32])
@@ -263,14 +262,10 @@ func (BitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) {
// X9.62.
func (BitCurve *BitCurve) Marshal(x, y *big.Int) []byte {
byteLen := (BitCurve.BitSize + 7) >> 3
-
ret := make([]byte, 1+2*byteLen)
- ret[0] = 4 // uncompressed point
-
- xBytes := x.Bytes()
- copy(ret[1+byteLen-len(xBytes):], xBytes)
- yBytes := y.Bytes()
- copy(ret[1+2*byteLen-len(yBytes):], yBytes)
+ ret[0] = 4 // uncompressed point flag
+ math.ReadBits(x, ret[1:1+byteLen])
+ math.ReadBits(y, ret[1+byteLen:])
return ret
}
@@ -289,24 +284,21 @@ func (BitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) {
return
}
-var (
- initonce sync.Once
- theCurve *BitCurve
-)
+var theCurve = new(BitCurve)
+
+func init() {
+ // See SEC 2 section 2.7.1
+ // curve parameters taken from:
+ // http://www.secg.org/collateral/sec2_final.pdf
+ theCurve.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16)
+ theCurve.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16)
+ theCurve.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000000000000000000000000000007", 16)
+ theCurve.Gx, _ = new(big.Int).SetString("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16)
+ theCurve.Gy, _ = new(big.Int).SetString("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16)
+ theCurve.BitSize = 256
+}
-// S256 returns a BitCurve which implements secp256k1 (see SEC 2 section 2.7.1)
+// S256 returns a BitCurve which implements secp256k1.
func S256() *BitCurve {
- initonce.Do(func() {
- // See SEC 2 section 2.7.1
- // curve parameters taken from:
- // http://www.secg.org/collateral/sec2_final.pdf
- theCurve = new(BitCurve)
- theCurve.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16)
- theCurve.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16)
- theCurve.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000000000000000000000000000007", 16)
- theCurve.Gx, _ = new(big.Int).SetString("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16)
- theCurve.Gy, _ = new(big.Int).SetString("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16)
- theCurve.BitSize = 256
- })
return theCurve
}
diff --git a/crypto/secp256k1/ext.h b/crypto/secp256k1/ext.h
index b0f30b73c..9b043c724 100644
--- a/crypto/secp256k1/ext.h
+++ b/crypto/secp256k1/ext.h
@@ -19,7 +19,7 @@ static secp256k1_context* secp256k1_context_create_sign_verify() {
return secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
}
-// secp256k1_ecdsa_recover_pubkey recovers the public key of an encoded compact signature.
+// secp256k1_ext_ecdsa_recover recovers the public key of an encoded compact signature.
//
// Returns: 1: recovery was successful
// 0: recovery was not successful
@@ -27,7 +27,7 @@ static secp256k1_context* secp256k1_context_create_sign_verify() {
// Out: pubkey_out: the serialized 65-byte public key of the signer (cannot be NULL)
// In: sigdata: pointer to a 65-byte signature with the recovery id at the end (cannot be NULL)
// msgdata: pointer to a 32-byte message (cannot be NULL)
-static int secp256k1_ecdsa_recover_pubkey(
+static int secp256k1_ext_ecdsa_recover(
const secp256k1_context* ctx,
unsigned char *pubkey_out,
const unsigned char *sigdata,
@@ -46,7 +46,7 @@ static int secp256k1_ecdsa_recover_pubkey(
return secp256k1_ec_pubkey_serialize(ctx, pubkey_out, &outputlen, &pubkey, SECP256K1_EC_UNCOMPRESSED);
}
-// secp256k1_ecdsa_verify_enc verifies an encoded compact signature.
+// secp256k1_ext_ecdsa_verify verifies an encoded compact signature.
//
// Returns: 1: signature is valid
// 0: signature is invalid
@@ -55,7 +55,7 @@ static int secp256k1_ecdsa_recover_pubkey(
// msgdata: pointer to a 32-byte message (cannot be NULL)
// pubkeydata: pointer to public key data (cannot be NULL)
// pubkeylen: length of pubkeydata
-static int secp256k1_ecdsa_verify_enc(
+static int secp256k1_ext_ecdsa_verify(
const secp256k1_context* ctx,
const unsigned char *sigdata,
const unsigned char *msgdata,
@@ -74,28 +74,34 @@ static int secp256k1_ecdsa_verify_enc(
return secp256k1_ecdsa_verify(ctx, &sig, msgdata, &pubkey);
}
-// secp256k1_decompress_pubkey decompresses a public key.
+// secp256k1_ext_reencode_pubkey decodes then encodes a public key. It can be used to
+// convert between public key formats. The input/output formats are chosen depending on the
+// length of the input/output buffers.
//
-// Returns: 1: public key is valid
-// 0: public key is invalid
+// Returns: 1: conversion successful
+// 0: conversion unsuccessful
// Args: ctx: pointer to a context object (cannot be NULL)
-// Out: pubkey_out: the serialized 65-byte public key (cannot be NULL)
-// In: pubkeydata: pointer to 33 bytes of compressed public key data (cannot be NULL)
-static int secp256k1_decompress_pubkey(
+// Out: out: output buffer that will contain the reencoded key (cannot be NULL)
+// In: outlen: length of out (33 for compressed keys, 65 for uncompressed keys)
+// pubkeydata: the input public key (cannot be NULL)
+// pubkeylen: length of pubkeydata
+static int secp256k1_ext_reencode_pubkey(
const secp256k1_context* ctx,
- unsigned char *pubkey_out,
- const unsigned char *pubkeydata
+ unsigned char *out,
+ size_t outlen,
+ const unsigned char *pubkeydata,
+ size_t pubkeylen
) {
secp256k1_pubkey pubkey;
- if (!secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeydata, 33)) {
+ if (!secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeydata, pubkeylen)) {
return 0;
}
- size_t outputlen = 65;
- return secp256k1_ec_pubkey_serialize(ctx, pubkey_out, &outputlen, &pubkey, SECP256K1_EC_UNCOMPRESSED);
+ unsigned int flag = (outlen == 33) ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED;
+ return secp256k1_ec_pubkey_serialize(ctx, out, &outlen, &pubkey, flag);
}
-// secp256k1_pubkey_scalar_mul multiplies a point by a scalar in constant time.
+// secp256k1_ext_scalar_mul multiplies a point by a scalar in constant time.
//
// Returns: 1: multiplication was successful
// 0: scalar was invalid (zero or overflow)
@@ -104,7 +110,7 @@ static int secp256k1_decompress_pubkey(
// In: point: pointer to a 64-byte public point,
// encoded as two 256bit big-endian numbers.
// scalar: a 32-byte scalar with which to multiply the point
-int secp256k1_pubkey_scalar_mul(const secp256k1_context* ctx, unsigned char *point, const unsigned char *scalar) {
+int secp256k1_ext_scalar_mul(const secp256k1_context* ctx, unsigned char *point, const unsigned char *scalar) {
int ret = 0;
int overflow = 0;
secp256k1_fe feX, feY;
diff --git a/crypto/secp256k1/secp256.go b/crypto/secp256k1/secp256.go
index 00a1f8aaa..eefbb99ee 100644
--- a/crypto/secp256k1/secp256.go
+++ b/crypto/secp256k1/secp256.go
@@ -115,7 +115,7 @@ func RecoverPubkey(msg []byte, sig []byte) ([]byte, error) {
sigdata = (*C.uchar)(unsafe.Pointer(&sig[0]))
msgdata = (*C.uchar)(unsafe.Pointer(&msg[0]))
)
- if C.secp256k1_ecdsa_recover_pubkey(context, (*C.uchar)(unsafe.Pointer(&pubkey[0])), sigdata, msgdata) == 0 {
+ if C.secp256k1_ext_ecdsa_recover(context, (*C.uchar)(unsafe.Pointer(&pubkey[0])), sigdata, msgdata) == 0 {
return nil, ErrRecoverFailed
}
return pubkey, nil
@@ -130,22 +130,42 @@ func VerifySignature(pubkey, msg, signature []byte) bool {
sigdata := (*C.uchar)(unsafe.Pointer(&signature[0]))
msgdata := (*C.uchar)(unsafe.Pointer(&msg[0]))
keydata := (*C.uchar)(unsafe.Pointer(&pubkey[0]))
- return C.secp256k1_ecdsa_verify_enc(context, sigdata, msgdata, keydata, C.size_t(len(pubkey))) != 0
+ return C.secp256k1_ext_ecdsa_verify(context, sigdata, msgdata, keydata, C.size_t(len(pubkey))) != 0
}
// DecompressPubkey parses a public key in the 33-byte compressed format.
// It returns non-nil coordinates if the public key is valid.
-func DecompressPubkey(pubkey []byte) (X, Y *big.Int) {
+func DecompressPubkey(pubkey []byte) (x, y *big.Int) {
if len(pubkey) != 33 {
return nil, nil
}
- buf := make([]byte, 65)
- bufdata := (*C.uchar)(unsafe.Pointer(&buf[0]))
- pubkeydata := (*C.uchar)(unsafe.Pointer(&pubkey[0]))
- if C.secp256k1_decompress_pubkey(context, bufdata, pubkeydata) == 0 {
+ var (
+ pubkeydata = (*C.uchar)(unsafe.Pointer(&pubkey[0]))
+ pubkeylen = C.size_t(len(pubkey))
+ out = make([]byte, 65)
+ outdata = (*C.uchar)(unsafe.Pointer(&out[0]))
+ outlen = C.size_t(len(out))
+ )
+ if C.secp256k1_ext_reencode_pubkey(context, outdata, outlen, pubkeydata, pubkeylen) == 0 {
return nil, nil
}
- return new(big.Int).SetBytes(buf[1:33]), new(big.Int).SetBytes(buf[33:])
+ return new(big.Int).SetBytes(out[1:33]), new(big.Int).SetBytes(out[33:])
+}
+
+// CompressPubkey encodes a public key to 33-byte compressed format.
+func CompressPubkey(x, y *big.Int) []byte {
+ var (
+ pubkey = S256().Marshal(x, y)
+ pubkeydata = (*C.uchar)(unsafe.Pointer(&pubkey[0]))
+ pubkeylen = C.size_t(len(pubkey))
+ out = make([]byte, 33)
+ outdata = (*C.uchar)(unsafe.Pointer(&out[0]))
+ outlen = C.size_t(len(out))
+ )
+ if C.secp256k1_ext_reencode_pubkey(context, outdata, outlen, pubkeydata, pubkeylen) == 0 {
+ panic("libsecp256k1 error")
+ }
+ return out
}
func checkSignature(sig []byte) error {
diff --git a/crypto/signature_cgo.go b/crypto/signature_cgo.go
index 381d8a1bb..340bfc221 100644
--- a/crypto/signature_cgo.go
+++ b/crypto/signature_cgo.go
@@ -76,6 +76,11 @@ func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {
return &ecdsa.PublicKey{X: x, Y: y, Curve: S256()}, nil
}
+// CompressPubkey encodes a public key to the 33-byte compressed format.
+func CompressPubkey(pubkey *ecdsa.PublicKey) []byte {
+ return secp256k1.CompressPubkey(pubkey.X, pubkey.Y)
+}
+
// S256 returns an instance of the secp256k1 curve.
func S256() elliptic.Curve {
return secp256k1.S256()
diff --git a/crypto/signature_nocgo.go b/crypto/signature_nocgo.go
index 17fd613b2..f636b2377 100644
--- a/crypto/signature_nocgo.go
+++ b/crypto/signature_nocgo.go
@@ -87,6 +87,10 @@ func VerifySignature(pubkey, hash, signature []byte) bool {
if err != nil {
return false
}
+ // Reject malleable signatures. libsecp256k1 does this check but btcec doesn't.
+ if sig.S.Cmp(secp256k1_halfN) > 0 {
+ return false
+ }
return sig.Verify(hash, key)
}
@@ -102,6 +106,11 @@ func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {
return key.ToECDSA(), nil
}
+// CompressPubkey encodes a public key to the 33-byte compressed format.
+func CompressPubkey(pubkey *ecdsa.PublicKey) []byte {
+ return (*btcec.PublicKey)(pubkey).SerializeCompressed()
+}
+
// S256 returns an instance of the secp256k1 curve.
func S256() elliptic.Curve {
return btcec.S256()
diff --git a/crypto/signature_test.go b/crypto/signature_test.go
index abcab425b..aecff76bf 100644
--- a/crypto/signature_test.go
+++ b/crypto/signature_test.go
@@ -18,10 +18,13 @@ package crypto
import (
"bytes"
+ "crypto/ecdsa"
+ "reflect"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/ethereum/go-ethereum/common/math"
)
var (
@@ -65,6 +68,21 @@ func TestVerifySignature(t *testing.T) {
if VerifySignature(testpubkey, testmsg, sig[:len(sig)-2]) {
t.Errorf("signature valid even though it's incomplete")
}
+ wrongkey := common.CopyBytes(testpubkey)
+ wrongkey[10]++
+ if VerifySignature(wrongkey, testmsg, sig) {
+ t.Errorf("signature valid with with wrong public key")
+ }
+}
+
+// This test checks that VerifySignature rejects malleable signatures with s > N/2.
+func TestVerifySignatureMalleable(t *testing.T) {
+ sig := hexutil.MustDecode("0x638a54215d80a6713c8d523a6adc4e6e73652d859103a36b700851cb0e61b66b8ebfc1a610c57d732ec6e0a8f06a9a7a28df5051ece514702ff9cdff0b11f454")
+ key := hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138")
+ msg := hexutil.MustDecode("0xd301ce462d3e639518f482c7f03821fec1e602018630ce621e1e7851c12343a6")
+ if VerifySignature(key, msg, sig) {
+ t.Error("VerifySignature returned true for malleable signature")
+ }
}
func TestDecompressPubkey(t *testing.T) {
@@ -86,6 +104,36 @@ func TestDecompressPubkey(t *testing.T) {
}
}
+func TestCompressPubkey(t *testing.T) {
+ key := &ecdsa.PublicKey{
+ Curve: S256(),
+ X: math.MustParseBig256("0xe32df42865e97135acfb65f3bae71bdc86f4d49150ad6a440b6f15878109880a"),
+ Y: math.MustParseBig256("0x0a2b2667f7e725ceea70c673093bf67663e0312623c8e091b13cf2c0f11ef652"),
+ }
+ compressed := CompressPubkey(key)
+ if !bytes.Equal(compressed, testpubkeyc) {
+ t.Errorf("wrong public key result: got %x, want %x", compressed, testpubkeyc)
+ }
+}
+
+func TestPubkeyRandom(t *testing.T) {
+ const runs = 200
+
+ for i := 0; i < runs; i++ {
+ key, err := GenerateKey()
+ if err != nil {
+ t.Fatalf("iteration %d: %v", i, err)
+ }
+ pubkey2, err := DecompressPubkey(CompressPubkey(&key.PublicKey))
+ if err != nil {
+ t.Fatalf("iteration %d: %v", i, err)
+ }
+ if !reflect.DeepEqual(key.PublicKey, *pubkey2) {
+ t.Fatalf("iteration %d: keys not equal", i)
+ }
+ }
+}
+
func BenchmarkEcrecoverSignature(b *testing.B) {
for i := 0; i < b.N; i++ {
if _, err := Ecrecover(testmsg, testsig); err != nil {
diff --git a/dashboard/README.md b/dashboard/README.md
index 84810f717..e010095ab 100644
--- a/dashboard/README.md
+++ b/dashboard/README.md
@@ -9,26 +9,34 @@ The client's UI uses [React][React] with JSX syntax, which is validated by the [
### Development and bundling
-As the dashboard depends on certain NPM packages (which are not included in the go-ethereum repo), these need to be installed first:
+As the dashboard depends on certain NPM packages (which are not included in the `go-ethereum` repo), these need to be installed first:
```
$ (cd dashboard/assets && npm install)
+$ (cd dashboard/assets && ./node_modules/.bin/flow-typed install)
```
Normally the dashboard assets are bundled into Geth via `go-bindata` to avoid external dependencies. Rebuilding Geth after each UI modification however is not feasible from a developer perspective. Instead, we can run `webpack` in watch mode to automatically rebundle the UI, and ask `geth` to use external assets to not rely on compiled resources:
```
$ (cd dashboard/assets && ./node_modules/.bin/webpack --watch)
-$ geth --dashboard --dashboard.assets=dashboard/assets/public --vmodule=dashboard=5
+$ geth --dashboard --dashboard.assets=dashboard/assets --vmodule=dashboard=5
```
-To bundle up the final UI into Geth, run `webpack` and `go generate`:
+To bundle up the final UI into Geth, run `go generate`:
```
-$ (cd dashboard/assets && ./node_modules/.bin/webpack)
$ go generate ./dashboard
```
+### Static type checking
+
+Since JavaScript doesn't provide type safety, [Flow][Flow] is used to check types. These are only useful during development, so at the end of the process Babel will strip them.
+
+To take advantage of static type checking, your IDE needs to be prepared for it. In case of [Atom][Atom] a configuration guide can be found [here][Atom config]: Install the [Nuclide][Nuclide] package for Flow support, making sure it installs all of its support packages by enabling `Install Recommended Packages on Startup`, and set the path of the `flow-bin` which were installed previously by `npm`.
+
+For more IDE support install the `linter-eslint` package too, which finds the `.eslintrc` file, and provides real-time linting. Atom warns, that these two packages are incompatible, but they seem to work well together. For third-party library errors and auto-completion [flow-typed][flow-typed] is used.
+
### Have fun
[Webpack][Webpack] offers handy tools for visualizing the bundle's dependency tree and space usage.
@@ -44,3 +52,8 @@ $ go generate ./dashboard
[WA]: http://webpack.github.io/analyse/
[WV]: http://chrisbateman.github.io/webpack-visualizer/
[Node.js]: https://nodejs.org/en/
+[Flow]: https://flow.org/
+[Atom]: https://atom.io/
+[Atom config]: https://medium.com/@fastphrase/integrating-flow-into-a-react-project-fbbc2f130eed
+[Nuclide]: https://nuclide.io/docs/quick-start/getting-started/
+[flow-typed]: https://github.com/flowtype/flow-typed
diff --git a/dashboard/assets.go b/dashboard/assets.go
index ef2cf6ac9..8337cf080 100644
--- a/dashboard/assets.go
+++ b/dashboard/assets.go
@@ -1,16 +1,13 @@
-// Code generated by go-bindata.
+// Code generated by go-bindata. DO NOT EDIT.
// sources:
-// assets/public/bundle.js
-// assets/public/dashboard.html
-// DO NOT EDIT!
+// assets/dashboard.html
+// assets/bundle.js
package dashboard
import (
- "bytes"
- "compress/gzip"
+ "crypto/sha256"
"fmt"
- "io"
"io/ioutil"
"os"
"path/filepath"
@@ -18,29 +15,10 @@ import (
"time"
)
-func bindataRead(data []byte, name string) ([]byte, error) {
- gz, err := gzip.NewReader(bytes.NewBuffer(data))
- if err != nil {
- return nil, fmt.Errorf("Read %q: %v", name, err)
- }
-
- var buf bytes.Buffer
- _, err = io.Copy(&buf, gz)
- clErr := gz.Close()
-
- if err != nil {
- return nil, fmt.Errorf("Read %q: %v", name, err)
- }
- if clErr != nil {
- return nil, err
- }
-
- return buf.Bytes(), nil
-}
-
type asset struct {
- bytes []byte
- info os.FileInfo
+ bytes []byte
+ info os.FileInfo
+ digest [sha256.Size]byte
}
type bindataFileInfo struct {
@@ -69,43 +47,38360 @@ func (fi bindataFileInfo) Sys() interface{} {
return nil
}
-var _publicBundleJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7d\x57\x1b\xb9\x93\x28\xfc\xf7\xf0\x29\x94\xdc\x59\x6c\x27\xc6\x60\x92\xcc\x0b\x0c\x93\x25\x84\x64\xd9\x9b\x84\xdc\xc0\xcc\xdc\x3d\x2c\xd7\x91\xbb\x65\x5b\xa1\xdd\xf2\x74\xb7\x01\xff\x02\xdf\xfd\x39\xaa\xd2\x7b\x77\x1b\x63\x9c\xf9\xed\xec\xb3\xe4\x9c\xd8\x96\x4a\xa5\x52\xa9\x54\x7a\x2b\x55\x6d\x3e\x81\xbf\x4d\xd2\x1c\x4c\xd3\xa8\xe0\x22\x6d\x8e\x45\x3c\x4d\x58\xde\x22\x5f\xc9\xe6\x26\xb9\x62\xfd\x09\x8d\x2e\x5e\x09\x51\xe4\x45\x46\x27\x6b\xa6\xc4\x77\x9b\x9b\xe4\x74\xc4\x08\xc2\x93\x88\x46\x23\xe6\xe4\x5e\xd2\x8c\xf0\x34\x2f\x68\x92\xb0\xf8\x3d\xe2\x24\x7b\xe4\xeb\xed\xae\x01\x2a\xe3\xca\xd8\x9f\x53\x9e\x31\xa2\x89\x71\x20\x74\x12\xe9\xf5\x14\x4d\x3d\x05\xdd\xeb\x29\x9a\x8f\xe2\x16\xf9\x5a\x85\x5d\xa2\x3f\x18\xb1\xe8\x82\xf0\x81\xa6\x97\xe7\x84\xa7\x25\xaa\xbf\xe3\x83\x66\x48\xf5\x99\xc6\x7e\xee\xa2\x27\xdf\x7d\xf7\x5d\xc6\x8a\x69\x96\x96\x9a\x69\x0b\x74\xd8\xf5\x44\x64\x45\xbe\xeb\x16\xbb\x0d\x29\xcb\x18\x2d\x18\xa1\x24\x65\x57\x9a\xba\x26\x4d\x63\x32\x99\x16\x84\x17\x84\xa7\x85\x20\xc5\x48\xb1\xb8\xe5\x96\x96\x4c\x56\x25\xf6\xe6\x90\x21\xf9\xee\x11\xce\x77\x88\xce\x6c\x7b\x19\xc9\x0e\x19\xd0\x24\x67\x7e\xaa\x6a\xc5\x0e\xf9\xea\xd1\x5e\xdd\x95\xb2\x49\x87\xd7\x2c\x9a\x16\x0c\xa8\x56\xf4\x55\x74\xe9\x77\xe3\x12\xbf\x22\x9a\x24\xaa\x37\x35\xef\xda\x0a\x83\xfe\xb4\xe9\x15\x92\xd0\xaa\x25\xe9\x4d\x42\x87\x2e\x3d\x34\x27\x89\xa0\x31\x8b\xcb\x04\x75\x12\xb2\x47\x8a\x6c\xca\x6a\x91\x7d\xc2\x8e\x97\xe8\x14\x35\x44\x0c\x1c\xec\x2e\xb8\x12\x12\x9f\x78\x57\x20\x6e\xcb\xb5\xf8\x23\x43\x96\xc9\x5d\x66\xe6\x44\xf4\xbf\xb0\xa8\x20\x4d\xcb\x02\x95\xd3\xeb\xb9\x02\x52\xc1\xa1\xce\x98\xec\x69\x34\x75\x43\xb1\x54\x61\x69\x9c\x54\x21\x8e\x2a\x64\xb0\xae\x86\x98\x0d\x78\xca\xc8\x90\x15\x05\xcb\x8c\x6c\x90\x81\xc8\xc8\x88\x66\x63\x91\xce\x34\x63\xef\xa8\x34\x26\x7b\xa6\x78\xd3\x48\x46\x4a\xc7\xac\xad\xb0\x07\x83\x96\x0f\x9a\x8f\xaa\x10\x09\xbf\x74\x2b\x1c\xeb\xc7\xc0\xf1\x0e\x12\xfe\x31\x13\x13\x96\x15\xb3\xb0\x46\xbf\xc8\x77\x91\x48\x07\x7c\x38\xcd\x68\x3f\x61\x95\x03\xeb\x3b\x96\x4e\xc7\x4c\xe5\x4b\x89\x0b\xb2\x87\xac\xd8\x51\xcd\xf0\x32\x6e\x5b\xb5\x1a\xa5\x56\xbf\x0e\x59\xf1\x9a\x0d\xe8\x34\x29\x0e\x81\x68\x9f\xeb\x91\x18\x4f\x68\xc1\xfb\x3c\xe1\xc5\x8c\x5c\xf1\x62\x44\x52\x91\x6e\xe8\xce\x50\x02\x73\x47\x67\xa4\x6e\x67\x60\x91\x80\x8d\x52\x61\xa9\x4e\xd7\x52\x48\xd6\xd7\xf5\xe0\xe8\xf5\x58\x8e\x82\x43\x5e\x7a\xed\x35\xa4\xda\x46\x34\xe5\x04\xe5\x8d\xad\xb3\x46\x8c\x59\x8d\xf3\x5d\x72\x4b\x76\x6a\x31\x60\x15\xc8\x85\xbc\x8c\x67\x97\xdc\x7a\xdc\xad\x14\xbb\x26\xb6\xa2\x4d\x1a\xb4\x61\x24\x6d\xb7\x62\xdc\x63\xd6\xee\x22\x3d\xa4\x44\x6c\x92\x89\x42\x14\xb3\x09\xeb\x8c\x68\x7e\x7c\x95\x6a\x61\x03\xe5\x78\x47\x0f\x08\xb7\x07\x50\x49\xb4\xc9\x44\x21\x70\x5a\xba\x48\x55\xe5\xf2\x1e\x67\x7c\xda\x2d\x31\x93\x69\x3f\xe1\x51\x6f\x42\x8b\x51\xaf\x77\x07\xb9\x13\xb2\x47\x1e\x3f\xae\xc3\xf9\x4e\xd0\x98\xb0\xb4\xc8\x66\x46\x69\xa7\xb1\x6e\x41\x59\x3d\xa8\x8c\xaa\xf5\x41\x55\xdd\x72\x35\xf2\x7c\x6b\xdb\xed\xb4\x5b\xa3\x3b\x1f\xfe\xe7\xb4\xa5\x79\xb6\xb6\xf9\x84\x6c\x11\x95\x56\x5e\x6c\xb5\xc9\xdc\x39\x8d\x7c\x5d\x93\x08\xfe\x38\x7c\xf5\x71\xff\xe0\x7f\x93\xdf\xf7\x3f\x91\xa3\x0f\xff\x7e\x78\x70\x7a\x74\xfc\x81\x3c\xd9\xb4\xd8\x26\x99\x88\x58\x2e\x97\x6e\x9b\x4f\x9e\xac\x91\x27\xe4\x40\x4c\x66\x19\x1f\x8e\x0a\xd2\x8c\x5a\x64\x7b\xab\xfb\x6c\x63\x92\xb1\x9c\xa5\x45\x9b\xbc\xa1\x11\xeb\x0b\x71\xd1\x26\x47\x69\xd4\x59\x23\x50\xe0\x74\xc4\x73\x92\x8b\x69\x16\x31\x12\x89\x18\x96\x49\x09\x8f\x58\x9a\xb3\x98\x4c\xd3\x98\x65\x30\x2b\xbc\x3f\x3a\xd5\xc9\x64\x20\xa6\x69\x2c\xd7\x52\xc5\x88\x49\x14\xef\x8e\x0e\x0e\x3f\x9c\x1c\x92\x01\x97\xab\x2c\x9c\x24\x33\x21\x0a\x12\xf3\x8c\x45\x85\xc8\x66\x38\x57\xda\x8a\x8a\x8c\x31\x49\xc0\xe6\xda\x1a\x1f\x10\xdd\x8a\x0e\x4b\x2f\x3b\x1f\x8e\x5f\x1f\xf6\x0e\x3f\xfc\x4e\x1e\xed\xed\x91\xc6\x24\x13\xf1\x14\x9a\xda\x90\x4c\x21\x44\xaa\x93\x4f\x87\xfb\x07\xa7\xbd\xc3\x77\x87\xef\x0f\x3f\x9c\xf6\x4e\xff\xe3\xe3\x21\xd9\x23\x4d\x29\xd4\x62\x40\x4e\x66\xe3\xbe\x48\xc8\x9e\x2c\xad\xd9\xd4\x20\xeb\xeb\x6b\x84\x10\x95\xd9\x91\xea\xaf\x94\xd2\x6c\x64\x8c\x46\x45\x87\x25\x6c\xcc\xd2\xa2\xd1\x6a\x91\x9b\x1b\x80\xd9\xba\x66\x34\xfa\x71\x77\x4d\x55\xcf\xf3\xdf\x69\xc2\xe3\x43\x84\x2b\x0f\x3f\x24\x94\x68\xb1\x55\x74\xa9\xf9\x1b\xe8\xc2\xef\x86\x2a\xa2\x33\x65\x93\xd3\x69\x92\x84\x19\x9d\xef\xbf\x57\x58\x64\xf1\x72\xf3\x77\xd7\x88\x1c\xa7\x6b\x44\xae\xdf\x5f\xc1\x44\x9a\xf0\x88\x17\xc9\x8c\x4c\x73\x9e\x0e\xc9\x67\x39\xa0\x37\x24\x8e\xfc\x33\x99\x89\x29\xa1\x19\x23\x62\x52\xc8\x3c\x58\x6c\xca\x85\x68\xcc\x2e\x59\x22\x26\xd0\xa8\x3e\x1b\xd1\x4b\x2e\xb2\x0e\xe2\x1c\x15\xc5\x64\x67\x73\x73\xd0\xef\x8c\xd9\xa6\xc5\xb5\xc1\xd3\x0d\xd9\x43\x8a\x31\xc5\x28\x13\x57\xc7\xe9\x6b\xe8\xf5\xfd\x48\x76\xa9\x59\x56\x91\x60\x39\x44\xf6\x2a\x87\xed\xf3\xe7\x2f\x5a\x4d\x9f\xc1\xed\x2a\xbc\xad\xdd\xb5\x5b\xc2\x92\x9c\x01\xaf\x1f\xd2\x6a\x2b\x61\xf7\x6f\xf4\x82\x4d\xfa\xa1\xd5\x94\xf4\xce\x1d\xd2\xb7\xa8\x80\xe7\x69\x85\xe6\xb3\x56\xab\xb5\xa6\x14\xca\x6d\x4b\x2e\x1c\x48\xf7\x41\x2a\xe6\xf1\x34\x67\x24\x2f\x32\x1e\x15\xa0\x92\xef\xa5\x70\xe6\x0c\xdd\xbd\xca\xa1\xbb\x18\xb7\xb6\x9e\xf9\x7d\xbb\x60\xa9\xe7\xdf\x8a\xc3\xdb\x0f\xe2\xb0\x1c\x16\xbd\x9e\x22\xa9\xb7\xff\xfe\x75\xef\xf5\xe1\x9b\xa3\x0f\x87\xbd\xfd\x4f\x9f\xf6\xff\xa3\xd7\x6b\x57\xe7\x7e\x3a\x3c\xf9\xed\xdd\x69\xaf\xb7\xbb\xf9\xe4\xd1\x1a\x29\x2b\xf5\x1f\xc8\xbf\xb3\x98\xfc\x41\x8b\x5c\xa4\x52\x5a\xdf\x55\x2b\x6c\x95\x4c\x9a\xef\x8f\x4e\x5b\x6d\x92\x33\xb6\x46\xb4\x58\x7f\x61\xf1\x15\x96\x1f\xf2\x62\x34\xed\x77\xb8\xd8\x8c\x12\x9a\xe7\x72\x5d\x9b\xaf\x41\xa3\xc9\x30\x11\x7d\x9a\xe8\xb5\xbb\x54\xd7\x86\x07\x44\x2e\xa3\xd6\xbe\x6b\x58\x11\x6a\xec\xae\xad\xc1\x72\x0f\x57\x16\xb0\xf5\x0f\x56\x19\x12\xc2\x20\x80\xda\x3e\xc8\xda\x14\x2e\x28\x0c\xa9\x70\x70\x70\x76\x2e\xc1\xbf\x93\xca\xba\x09\x7a\x97\xec\x91\xad\x5d\xc2\xc9\x2f\x84\x66\xc3\xa9\xd4\x0d\x79\x27\x61\xe9\xb0\x18\xed\x12\xfe\xf4\x29\xe2\x00\x24\x34\x1b\x92\x3d\x0b\x75\xc6\xcf\x77\x65\x96\x14\xd8\x47\x34\x1b\xb6\x48\x24\xd2\x82\xa7\x52\x31\x39\x45\x4e\x67\x13\xb9\xab\x56\xaa\x96\x66\x43\xcc\x95\xa5\x4c\xae\x94\x6c\xd9\xdc\x74\xd8\x20\x37\x37\xc4\x4b\x4f\xa7\xe3\x3e\xcb\x1a\x8a\x8e\xef\x54\x4b\x3a\x93\x69\x3e\x92\x08\x5a\x40\x83\x12\x6d\x89\x74\x3f\xcb\xe8\xac\xc3\x73\xf8\x04\x88\xca\xa2\x96\x4f\x1d\x3a\x99\x24\xb3\xa6\x9c\x22\xda\x04\xe0\x43\x94\x1e\x3d\x6a\x9a\xd1\x48\x0d\x23\x2f\xd8\x4c\x4e\xd3\xc0\x08\xcc\x82\x36\x62\x57\xe1\x28\xa1\xd9\xb0\x2d\xe1\x5a\x72\xad\x4e\xb3\xe1\xd9\x05\x9b\x9d\x1b\x68\x9f\x3e\x09\xb6\x8b\x19\xb7\x6b\xe6\x7f\xf9\xdf\xad\xe4\x9f\x9a\x06\x75\x91\x2f\x82\xa7\xcd\x06\x69\xc8\x22\x32\x5f\xd6\xac\x38\xae\x96\x7c\x30\xf1\x4b\x41\x96\x42\x17\x37\x9c\xdd\x82\x1a\x6e\x48\x47\x49\x31\x58\x3e\x49\xd4\x96\x27\x72\x02\xc2\x22\x9b\x9b\x24\x63\x43\x9e\xcb\xcd\x08\xcd\x49\xc3\xca\x7b\xa3\x2d\x45\x22\x97\x59\x69\xa1\x36\x43\x93\x31\x91\x23\x9a\x0e\x19\xec\xf5\xd6\xbe\xfb\xee\x51\x73\xde\x58\x06\x91\xbd\x63\x40\x3b\xab\x05\x2d\xf4\x1e\x83\x34\xf9\xdf\xdd\xaa\xbe\x76\x34\x4c\x7d\xcd\xad\x36\xf0\x7d\x7e\xcd\x92\xad\x86\xab\x92\xa9\xcd\x0a\xd5\x3a\x07\x01\x08\x9b\x51\xcc\xdf\x7d\x77\xc5\xd3\x58\x5c\x75\x9c\x51\x1c\x76\xc1\xda\x6d\x53\x16\x0a\x14\xea\xb3\x05\x14\x2a\x2e\x80\x37\x49\x3e\xe2\x63\xd8\xac\xe2\x84\xae\x26\x1b\x29\xbc\xfd\x4c\x5c\xe5\x2c\x03\x05\xab\x93\xf7\xca\x93\xc5\x57\xb9\x2c\xda\xdc\xc4\xd3\x8c\x98\x0c\x32\x31\x26\x57\x23\x5a\xb0\x4b\x96\x69\xed\xc6\x73\xa2\x96\xc8\x24\x17\xa4\x18\xd1\x82\x14\x2c\x2f\x48\x36\x4d\x53\x96\xe5\x98\x92\x17\xd3\x3e\xe1\x85\xc4\x15\x8b\xb4\x51\x90\x7e\xc6\xe8\x85\x5c\xd4\xa6\xc3\xbc\x43\xc8\xab\x69\x41\xae\x18\x49\x19\x8b\x49\x21\xc8\x55\x46\x27\x78\x92\x47\x28\x91\xdb\x99\x88\x16\xd1\x08\xcf\x1f\xa5\x58\x16\x84\xe7\x12\x97\x84\x9b\x30\x58\x4c\xa3\x12\x95\x4d\x50\x0b\xf1\xab\x11\x8f\x46\x24\x16\x2c\x97\xf5\x29\x1d\x4c\xd3\x99\xa2\x5b\xd6\x7a\x54\x34\x24\x37\x72\x1e\x33\x42\x25\x3e\x23\x5c\x7d\x16\x51\xa9\x9a\x8b\x6c\xb6\x09\x75\xb3\x9c\xc4\x4c\x2e\x7e\xc6\xfc\x1f\xb0\x4a\x8f\x58\x56\x50\x9e\x12\x96\x0e\x79\xca\xf2\x0e\x4e\x56\xc8\xa8\x13\x56\x9c\xf2\x31\x13\xd3\x62\xd7\x49\x3d\x48\x18\xcd\x4c\xfa\x9a\xa9\x4b\x6d\xc2\xb1\x90\x98\xc2\x46\x1d\xd6\xaf\xb0\x70\x83\x55\xd6\x61\x96\xc9\x15\x76\x6e\xf0\xca\x49\x82\xa4\x42\xae\x34\x59\x4a\xf4\x58\x87\x49\x3c\xc4\xeb\x56\x4b\xea\x71\x47\x2e\x58\x3d\xf6\x60\x02\x03\x54\xd9\x4c\x7d\x93\x7f\x8e\x42\x72\xc8\xf5\xf7\x13\x2d\x07\x5e\xfe\x85\x5c\x23\x7b\x4e\xd9\x5d\x03\xea\x2c\x6b\xe6\x96\x0d\x19\xea\x60\x58\x43\x3c\x28\x4e\x4d\xe6\x12\xb2\x30\xa2\xdb\xf9\xad\xf6\x18\xb9\x48\xbb\xbd\x0e\xda\xf3\xca\x2f\xd4\xf6\xa0\x7c\x45\xb7\xdf\x87\x01\x8b\x62\xbb\x5d\xbb\x25\xcd\x56\xcb\x8a\x5b\x36\x4d\x15\x80\x94\x11\x8d\x58\x32\xa6\xcc\xd9\x3d\xb7\x83\x5d\x1a\x36\x37\x53\x91\x8d\x69\x42\x58\x7a\xc9\x33\x01\xcb\x0f\x18\xdd\x34\x65\x24\xe7\xc5\x94\xca\xba\x72\x03\xaf\x94\xbf\x45\x26\xeb\x6e\x93\xad\x96\xdb\x55\x9b\x9b\x92\x0c\x47\x1a\xaf\x28\xe8\x04\x7a\x49\x79\x42\xfb\x09\x23\x7d\x4c\x24\x09\x85\x93\x36\x25\xf1\xa6\x01\xd5\x2d\x08\xa5\x43\x2e\x68\x1e\x85\x90\xb0\x02\xa8\x6e\xeb\x82\x52\xbf\x50\x13\x7d\x69\x94\x9a\x71\xc4\x52\xfc\x2f\x17\x63\xd6\x17\xf1\x0c\x06\x75\x1e\x65\xec\x8a\xc5\x38\x45\x3b\x1c\x91\x0c\x48\x05\x39\xea\x1c\x76\xc8\x98\xc6\x71\xca\xf2\x12\x93\x43\x7a\x03\x3a\x50\xa6\x9a\xac\x65\xe9\xf0\xa9\x52\x94\xfd\x01\x94\x31\xd8\x4d\xf2\x14\xab\x94\xd5\xcb\x55\x77\x1e\x65\x7c\x82\xea\x07\x54\x0f\xbb\xa4\x09\x8b\xe5\xbc\x02\x60\x5a\x99\x17\xd9\x34\xc7\x02\x6a\x0e\x52\x07\x00\xd0\xde\x08\x8e\xd3\x09\xca\x51\x32\xf3\xaa\xaf\x69\x09\x2e\xda\x70\x5d\xe8\x35\xaa\xae\x61\xaa\x29\x39\x1d\xc3\xbd\x08\xed\x8b\x4b\x25\x44\x92\x02\x2e\xa7\x15\x4a\x2e\x59\x96\xcb\x81\x21\x06\x48\x3d\x4c\x84\x63\x49\xf9\x88\x5e\xb2\x0a\xf2\xe5\x4c\xdd\x28\x46\x5c\x2e\xa7\x46\x62\x32\x98\x26\xc9\x8c\x88\x69\x06\xcb\x6d\x76\x5d\x90\x48\x64\x72\x0f\x4f\x44\x31\x62\xd9\x15\xc7\x99\xf0\x8a\x27\x89\x52\xe7\x54\x23\x64\x52\xa7\x2f\xde\x72\x59\x67\x55\xcb\x95\x80\xad\xb9\xb3\x4a\x36\x4d\x5d\x65\xd0\x1c\xd3\xec\x02\xef\x0c\xfc\xe1\x7e\x10\xaa\x41\x57\xaf\xad\x60\xc8\x47\x15\x44\x94\x07\xbd\xa7\x8c\x97\x1c\xf6\xa5\x96\x54\x4d\xac\x76\xec\x1f\x78\xed\x5c\x5f\xaf\x6d\xf8\x3d\xb4\xff\x82\x6d\xfe\xeb\xb4\x40\x95\x08\xec\x86\x73\xcb\xb7\x57\x04\x2b\xd2\x04\x6e\x6b\x5c\x5d\xe0\x35\xac\xb6\x71\x7f\x0b\x65\xd0\x09\xc9\x3d\x11\x63\xa6\xa9\xca\x0d\x59\x40\x4c\xcc\x07\x03\x96\xc9\x05\x7d\x06\x77\xa7\x70\xdd\xe5\x8a\xe9\x65\xee\x48\xcd\x7d\xd8\x8a\x8a\xa6\xcc\x56\xa3\x68\xd6\x6e\x61\xc1\xfc\xe7\x94\x4d\x99\x3a\xc3\x90\xbf\xe3\x8c\xf2\x54\x6e\x61\xf6\xf0\x52\x50\x2d\xab\xa7\x99\xa4\xf2\xff\x48\xe0\x5d\x5b\xee\x28\x8d\xd9\x35\xd9\x23\x1b\x5d\x77\x95\x2d\x1b\x90\xfe\x36\xf9\xc0\xae\x8b\x53\x1e\x5d\x34\x5d\x8d\xf5\xc8\xe0\x87\x61\xec\xa0\x75\xc7\x2b\xb6\xcd\x1d\x6f\x65\xb2\x8c\x0e\x74\x70\xa8\x43\x16\x17\x95\x6e\x9f\x07\x16\x89\x34\xa2\x45\x13\xf2\xcc\x60\x0a\x56\x7d\xa5\x06\x5a\x62\x64\xb5\x7f\xd6\xd4\x07\x84\x42\x2d\x4d\xa3\x30\x6e\xdd\x2d\x88\x93\xef\xf0\x45\xb7\x6f\x3e\x17\xe0\xec\xda\x28\x30\x67\x19\x18\xb0\x5c\xd5\xec\x30\x0d\xcf\xb6\x0d\x92\x84\xa5\x64\x8f\xb8\x6d\xc0\x12\x57\x23\x9e\xb0\x66\xc2\x52\x4f\x7b\x3a\xac\xd3\xa5\x76\x4b\x0c\x96\x02\xa4\xd3\x00\x0d\x69\x3e\x7d\xea\x30\xf1\x17\x12\xa0\xad\xea\xc0\x30\x3f\xac\xfe\xcc\x22\x3c\xef\x64\xd3\xb4\xe9\x88\xb6\x65\x93\xff\xad\xb2\x23\xe5\x5f\x1d\x13\xb0\x68\xd0\x6a\xa9\xa6\x4a\x5c\x75\x44\x31\x9c\xac\x55\x37\xe1\x61\xaf\x3e\x7b\x4e\x55\xff\x78\x87\x2b\xce\x12\x5e\x1d\xef\xe5\xb2\x3e\x76\x45\xcc\x71\x9b\x77\x84\x48\x36\x48\xb7\x65\xe5\xbf\x94\xfd\x2b\xe9\xba\x6c\xf4\x4e\x25\xbb\x77\x9c\x4a\xba\xbc\x94\x84\x9c\x71\x59\xdb\x79\xe9\x88\x32\x54\x27\x86\xcf\x78\xd0\x26\x89\x3f\x2a\xd8\x18\xd7\xad\x12\x51\xcb\xa1\xd8\xe5\x38\xcc\xf2\x5d\x39\x77\x3f\xaa\x1c\x02\x56\xc4\xed\xc0\xb1\xe3\x0a\x8f\x4c\x2e\x7f\x22\x09\xbf\x60\x70\x38\x12\xf3\xa8\xe0\x72\xc1\x81\xba\x3d\xb7\x03\xcf\xa5\x27\xa3\x33\xbb\x3b\xe7\x79\x67\x30\x55\xe6\x01\xbb\x36\x0d\xa0\xa0\xe1\x19\x9d\xc9\x5e\x94\x08\x9c\x5b\xe9\x6c\x9a\x96\xce\xc8\x5c\x84\xde\x11\xa8\xc5\x28\x05\x62\xd7\x08\x44\xc1\x0b\xb0\x8f\x6a\xa8\x53\xa2\x86\xcd\x52\x29\x66\xec\x3a\xf7\x17\xea\xb8\x48\xa7\xd0\x6c\x78\xa9\x06\xa0\x4e\xd2\x73\xe0\x1e\x69\x34\x76\xe5\x1c\xc4\xc6\x93\x62\x46\xf0\x3c\x98\x14\x82\xd0\x4b\xc1\x63\x92\xb1\x21\xbb\x9e\x10\x9e\xe7\x53\x96\x87\x85\xcd\xa9\x94\x69\x63\x2a\xc4\x44\xb6\xd3\x91\x68\xa8\x43\xa6\x3b\xe4\xc4\xf1\x3b\x38\x9e\x04\xe2\xfd\x3c\x91\x46\xac\x9c\x38\x18\x94\xd2\x32\x36\x16\x97\xac\x16\x0f\x66\xef\x27\x89\x86\xc8\x4b\x20\x6c\xcc\x8b\x52\xe2\x24\x63\x13\x96\xd6\xd3\xa7\xf2\x8f\xd3\xa8\x5c\xb7\x01\x4a\x9c\x3a\x6d\xff\x83\x65\x8e\xb5\x62\x38\x3b\x27\x0e\x9b\xfa\x3c\x8d\x95\xca\x08\x0b\x54\x9f\x11\x85\x05\x39\x9e\x12\xe5\xd3\xc9\x44\x64\x85\x3a\x22\x72\x68\x8a\xae\xe2\x50\x1a\x35\x25\x8d\xcd\x06\x71\xa4\x25\x1a\xc5\x3c\xf3\x60\x63\x9e\xdd\x49\x07\x96\xaa\xa1\x42\x03\x4d\xc7\x34\x77\x75\x9b\x4b\xc5\x16\x18\x68\x04\x27\xac\xcf\x57\x78\x29\xb8\xb6\xa6\x0a\xb8\xa6\x3a\x66\xe2\x83\xeb\x2d\x9a\xe7\x7c\x98\xd6\xdc\xcc\x6d\x3f\x7b\xd1\xf2\x01\xb7\x25\x24\x4f\x0b\x96\x89\xc9\x27\x84\xd3\x06\x3e\x0a\xa2\xe5\x8e\x8e\x1a\x50\xd1\xff\xe2\xb0\x41\xf4\xbf\x48\x65\x27\xfa\x5f\x3c\x8b\x22\x48\xdf\x21\x5f\xf5\x86\x67\x07\x12\x6e\x77\xa5\x0c\xe9\x66\xa9\x2c\x49\x94\xa2\xcf\x24\xdd\xdc\x38\xdd\x59\xd0\x6c\xc8\xd4\xf6\xe7\xde\xca\x5f\xc2\x2a\xd3\x87\x50\xe7\xaf\x79\xb3\x89\xba\x9a\x41\x58\xab\xb2\xa5\x7e\x5f\xc8\x80\x07\x0b\xe2\xd5\x8d\xab\xf1\x91\x7a\xb8\xc5\x21\x7b\x0a\x3d\xfc\xd2\x93\x8e\x9d\x72\x6e\x25\x49\xda\x76\x01\x8a\xe1\x98\xf0\x44\xec\xc5\x5f\x26\x62\xe5\x7e\xb2\x7d\x22\xfa\x5f\xa0\xa9\xb9\xb5\x0d\x41\x8a\xb5\x8e\xf5\xba\x8a\x83\x9c\xb8\xcb\x43\x59\xb4\xc3\xe5\x1a\xe6\x78\xd0\xe4\x2d\xf2\xeb\x1e\xd9\x72\xef\x06\x35\xdc\xa3\x45\x8d\xa7\xda\x84\xb7\x42\x04\x8a\xf5\x5c\x32\x5e\xf4\xbf\xa8\x89\x7e\x21\x2e\xff\xf0\xcf\xbc\xdd\xbf\xc3\xfc\xf1\xb1\xed\xac\xc7\x6d\xc5\xfe\x64\xaa\x8c\x1a\xd7\x6e\x5b\xbb\xa6\xe7\xf2\x11\x63\x45\xfe\x9e\xa6\x74\x08\x7a\xdf\x5c\x42\x69\xbd\x20\xbb\xa1\x46\x7d\x3c\x7b\xd6\x72\xa1\xe6\xe9\x0e\x90\x03\x0d\xcc\xae\x0b\x96\xc6\x08\x5f\x65\x2f\x10\x02\x3e\x9b\x83\x58\xe3\x32\x65\x86\xac\xf8\xa8\x25\xe1\x78\x50\x53\xc5\x4f\x35\xe0\xf3\x9a\xe0\x43\x1a\x04\x70\xab\x76\x40\x93\x04\x2c\xda\xeb\xda\xf4\x73\x0d\xfc\xbc\xa6\x05\x98\x2d\x06\x30\x50\x3f\x90\xb9\x75\xd5\x75\xb7\xaa\xa0\xe7\x56\xe6\x20\x35\x65\x27\x22\xcf\xe5\xca\xf2\x40\xa4\x79\x91\x4d\xa3\x42\x64\x68\x6a\x5d\x5b\x6f\xf7\xee\xb2\xf3\xa8\xa8\xaf\xd0\xe0\xe5\xe9\x88\x65\xbc\xa8\x6f\x7a\x19\x74\x5e\x8d\x06\x9d\x29\x85\xab\xe8\x3f\x78\x31\x12\xd3\x42\x0d\x2d\xce\x6a\xeb\x7b\x71\x57\xc1\x79\xb5\xd7\xd5\x65\x70\x8e\xe9\xa4\x6e\x94\xbc\xe8\xba\x50\xf3\x24\x77\x4c\x27\x16\x94\xa7\x27\x74\xc0\x8e\xd2\x82\xe1\x80\xaf\xc4\xfd\xc3\x8f\x35\x05\xe6\x56\xe3\x41\x1a\x04\x60\xb8\x57\xd7\x59\x3e\xd4\x3c\xec\x00\x60\xa5\x2b\x13\x93\xd3\xd9\x84\xd5\xa9\xa6\xad\x32\xe4\x3c\xe4\x06\xc8\x14\xbb\xa2\x99\xda\xf0\x56\xd2\xfd\x3c\x04\x9c\x87\x5d\x81\x98\x22\x23\xc1\xf3\xe2\x83\x48\x3f\xc9\x26\x9d\x14\xb4\xe0\x51\xad\xed\xd4\x8f\x5b\x73\x8b\xcd\xab\xb6\x0a\xde\x92\x9d\xd1\xc9\x6b\x9e\x4f\x12\x3a\xfb\x40\xc7\xac\xa6\xfa\x1f\x9f\xd7\x15\x98\xdb\x5e\x1f\xd4\xd5\xb5\x77\x57\xb9\xfd\xe2\x87\x9a\x02\x77\x28\xe7\xaa\x1a\xd5\x69\xe6\x3c\x49\x79\xfe\x63\xb7\x12\x7c\x5e\x6d\x2e\x9c\x29\xfc\x25\xaf\xab\x62\xfb\xc5\x4f\x2e\xd4\xc7\x8c\xe5\xc6\x6e\xbe\x8e\xaa\x9f\x7e\xac\x2d\x32\x8f\xb2\x10\xd6\x20\x49\xeb\x89\x33\x35\x21\x8c\x8f\xf9\x0f\x9e\xc4\x11\xcd\xe2\x66\x2f\xcd\x83\x39\xe5\xfd\x94\x9f\x8e\x58\x6d\x47\x76\x7f\xfc\xb9\xa6\xc0\x5c\xd6\x7a\x90\x06\x41\x21\x7f\x39\xdb\xd3\xea\x0a\xb7\xab\xe1\xe7\xd5\xe7\x01\x06\xf4\xbe\x95\x69\x7a\x56\x9c\x23\xb2\x2f\xba\x2f\xee\x2a\x79\x77\x93\x4b\x45\xdc\x51\x70\x52\xcc\x12\x96\xc3\xcb\x34\x51\xd7\xfc\x17\xdd\x1f\x6a\x8b\xdc\x31\x74\x3c\xd8\x79\x1b\x3c\x23\x0d\x6a\x87\x27\xd7\xdf\x95\xdb\x3b\x7f\xfb\xb7\x6b\x8e\x9a\x61\x1b\x90\xb2\xab\xe3\xfe\x17\xdc\x06\x18\x14\x8f\xf0\xbc\x51\x16\x0c\x37\x5c\x4e\x65\x8b\xaf\xf5\x71\x93\x85\x55\xe9\xad\x95\x50\x5f\x25\x3d\xb7\x2a\xcf\xd9\xbb\x00\xa5\x8a\x6a\xcc\x04\xc0\xbf\x60\xbf\x2b\x1b\xdb\xa7\x7d\x96\x7c\x4c\xa6\x43\x9e\xbe\x49\xc4\x15\x68\xed\x8f\x7a\x5e\x82\x19\x4a\x36\xb8\xf7\x6f\x7c\x38\x62\xd9\x71\x16\xb3\xec\x40\x8c\x27\x22\x45\x33\xf7\xea\xa5\xd0\x0f\xad\xce\x43\xd0\xde\xdc\xd4\x4c\xae\x1d\x9a\xce\xe0\x8c\x8d\x5c\x31\x7a\x01\x27\x92\x1f\xd8\x15\xf9\xf7\x93\x13\x7c\x72\x96\x46\xac\x03\x8d\x42\xa5\xd8\xdc\x6a\x83\x1a\xeb\xa0\xa8\xb7\x9a\x3a\xc1\xd7\x6b\xba\x2b\x5a\x68\x99\xb6\xb9\x49\x7e\xcb\x19\xa1\x24\xe7\xe9\x30\x61\x85\x48\x89\x40\xf3\xd9\x49\x26\x2e\x79\xcc\x62\x22\x52\x46\xfa\x33\x7c\x8d\x89\x3a\x19\xab\x1d\x56\x8c\x5c\xa8\xb3\x6e\x78\x3a\x55\x63\xcd\x6f\x95\xf9\x19\x9c\xa1\x47\x62\x2a\xfb\x9d\x14\x02\x8d\xd1\xb2\x4b\xa6\x4f\x0c\x84\xe4\x58\x47\x96\xd8\xcf\xc9\x15\x23\x58\x01\xde\x32\xca\x51\x45\x60\x83\x45\xe2\x29\x9c\x42\x46\x9a\xb5\x7f\xf0\x24\x79\x2f\xb1\x92\x84\x0f\x58\x34\x8b\x12\xd6\x06\x53\xb8\x11\x4f\xe2\x8c\xa5\x70\x6d\x39\xa2\x69\x9c\xb0\x98\xd0\x41\xa1\xec\x86\x27\x34\x63\xa9\xdc\xe0\xe5\xf8\x04\x15\x6a\x27\x62\xa0\xea\x52\xaf\x23\x72\x72\x25\xa6\x49\x2c\xf1\xf5\x75\x99\x8d\x5f\x01\x75\x87\x1c\x15\x84\xe7\x84\x4a\x1e\xf6\x13\x36\x26\x72\xe9\x39\x1c\xe1\x6d\x22\x55\xc0\x64\x82\x66\xbe\xd4\xda\x0c\x82\x3d\x1c\xd8\xbc\xa5\x8c\xc5\xb9\x64\x85\xb8\x64\x59\x06\xc6\x6d\xe9\x0c\x09\xcf\x91\x8e\xbc\x43\x40\xa3\x9c\x40\xd3\xd5\x4b\x4c\x00\x80\x2b\x57\x4a\x46\x20\x6c\x60\x43\x38\x61\x11\x1f\xf0\x88\x17\xb3\xb6\x31\x8b\x53\x25\x4a\x1c\x3e\x11\x70\x45\x99\x8b\x64\x0a\xa3\x91\x03\x19\x19\x03\xb3\x6a\xdc\xc8\xca\x82\x63\xf3\xcc\x85\x5d\xb2\x2c\xd7\x5c\x02\x02\x36\x7e\x05\x38\xc9\x40\x89\x11\xee\x49\x55\x9b\x5d\xd2\x5c\xba\x50\xa2\x40\x10\x0e\x94\x1c\xec\x95\x96\xc5\x5a\x7e\x94\x02\x0e\x77\xd5\x75\xbb\xed\x94\x5d\xe1\xea\x5d\x97\xd7\xe2\xf7\x07\x23\x53\xf5\xe4\x13\x6e\x7e\xf1\x2c\x5b\x5d\xde\x42\xa3\x07\x28\x95\x56\xd2\x94\x2d\x24\x1a\x40\x82\xa9\x23\x05\x6e\xe8\x7b\x01\x6c\x47\x2a\xc4\x44\xcf\xda\xda\xfe\xf2\x28\x55\x2c\x2a\x04\x5e\xd1\xe6\x2c\x19\x6c\xa8\x13\x4f\x4f\x6c\xf3\xb6\x94\xf1\x8c\x25\x33\x62\x4d\x00\x55\x2d\x20\x41\xa9\x28\xcc\xe8\xc4\x0a\x15\x90\xae\x13\xce\xe0\xb7\xdc\x29\xc6\xbe\x21\x04\x18\x75\xa9\x00\x17\x84\x4e\x72\xf0\x6e\xc7\xcd\x32\x27\x36\x41\x55\xce\x80\x37\x2b\x0f\x6f\x9c\xd7\x60\xbb\x9f\x3e\x56\x53\x41\x2c\xb3\xe0\xfa\x60\x8d\x10\x78\xee\x45\xc8\x13\xa9\xbf\x06\xd3\x44\xf2\x15\xcf\x29\x1c\xbd\x40\x27\x93\x84\xa3\x3d\xaa\x65\x2f\xdc\xa3\x3f\xd9\x5c\x23\xda\x22\x7b\xa7\x4e\x01\xab\xc7\x80\x6b\x41\x6d\x4a\xa2\xd5\x74\x08\x0a\x8b\xe6\x52\xae\x41\x60\x68\x92\xf4\x69\x74\x41\xd4\x03\xf6\x98\x45\x42\xaa\xc1\xd8\x52\x60\x09\xe0\x69\xca\xb2\x4f\x6c\x50\x4b\x81\xec\xc0\xb5\xdb\xdd\xfb\xf0\xea\x28\x95\x44\xfb\xbc\x5a\xac\xa1\x1d\x9e\x6b\x46\xb7\xd7\x08\x4a\xdc\xe2\x45\xf4\xad\xd9\x07\x51\xb0\xb6\x12\x57\x9e\xcb\x29\x23\xe6\x52\x06\x69\x92\xc8\x85\x06\x12\xd7\x06\xeb\x8a\x41\x22\xae\x24\x4c\x0e\xfb\x26\x42\x53\x9a\xcc\x72\x78\x23\xe7\x5a\x12\xf3\x34\x4a\xa6\x31\x23\xbc\xe8\x40\x05\xef\x78\x7a\x21\x27\x2c\x47\xf3\x83\x15\x0c\x75\x39\x2c\x47\x5c\x01\x46\x26\x30\x5c\xc6\x22\xe6\x03\x3d\x87\xe9\x99\x17\x14\x30\x56\x51\xec\xca\x12\x72\x5a\x65\x34\x6e\x13\x5e\x28\xa9\xcd\x95\x8b\x02\x53\xa8\xad\xeb\xfa\xac\x78\xfa\xd9\x08\x02\x0e\x45\x99\x8d\x4b\x3d\xf7\xa0\xd6\xa6\x36\x51\x8f\x1c\x67\x7a\x25\x68\x0e\x6e\xc5\xa4\x50\xb7\x63\x55\x57\xaf\xea\x19\x82\x3a\x37\xef\x9e\x07\xd6\xec\x2f\xfd\xcc\x1d\xd0\x3b\x66\xec\xd9\x03\x63\xb3\xee\x70\x0f\xe6\x7b\xaa\xea\xef\x25\x99\x7a\x64\xab\xb4\x8e\x49\x6b\xdb\x6b\x78\x07\xac\xaa\x6c\x40\x19\xdc\x66\x93\x9d\x0a\x50\x8b\x72\x90\xf0\x89\x53\xa9\xfc\x69\x33\x53\xea\x51\x04\xef\xce\x4d\x66\x6e\x66\xc1\x63\xc3\x40\xd0\x4a\x75\x47\x45\x56\x3d\x29\x84\x6d\x72\xd6\x30\x24\x35\xda\xa4\x21\x6b\x97\x9f\xb2\xa2\xc6\x79\xcb\xb1\x6f\xc8\x83\x3d\x02\x54\x54\xda\x08\xd8\x1a\xc2\xce\xde\xb5\x96\x12\xb0\x1d\x3a\x15\x9a\x8f\x1e\xe6\x8e\x1c\x3e\x3c\x1d\x1e\xa6\xb4\x2f\x17\x27\x37\x37\x0e\xcf\x6f\x6e\xf4\x03\x1d\xe4\x8b\xf3\x20\x47\x51\x2a\xf5\xba\x8f\x4f\xb3\x0e\x97\x5a\x5e\x07\x39\x77\x2c\xee\xf4\xfb\x74\x8f\x18\x93\x86\xb9\xb8\xbc\x62\xfa\x06\x1d\x3e\x6a\x1f\xb5\x3e\xb6\x2f\xe3\x1e\x93\x97\xc8\x44\x7d\xc4\x63\x79\xe7\x91\xf3\x0b\xd9\x92\xdd\xf4\x9e\x16\x2c\xe3\x34\xd9\xf8\xed\x68\x07\x1e\x34\x8e\xe1\x51\x18\x4c\xa8\x94\x8c\xd9\x58\x64\x33\x92\x30\x7a\xd1\x91\xfd\x77\x3a\x62\x7e\xa3\xdc\x7b\x46\x35\xf4\x87\x99\xb8\xd2\xa6\x5c\xd1\xa8\xd3\x38\xb7\xef\x73\x5a\x64\xc7\x4e\xa5\xba\xdf\xa0\xa7\xbd\x3b\x98\x1e\x68\xe2\xef\x4b\x23\x8b\x60\xc3\xcc\x01\xa9\x6d\x19\xe0\x68\x93\x52\x41\x55\x0d\xb1\xc8\x01\xb2\x29\x35\x4c\xde\xd6\xab\x6f\xf7\x56\x0b\xa7\x5f\xff\xb4\xdb\xd6\x83\xb6\x5a\x80\xc3\xe2\x56\x43\x1e\x1e\x23\x2b\x01\xae\x3f\x46\x0e\x71\x21\xe9\x9d\x5e\x0f\x36\x87\xbd\x9e\x14\x46\x3d\x06\xdc\x23\xfe\xa0\xad\xad\x96\x6b\x3c\x16\x34\xc7\x25\x0d\xc8\xea\xc8\xf9\x40\xaf\x9d\xfc\x9c\x69\x9a\x4f\xfb\x79\x94\xf1\x3e\x3b\x8a\x3d\xeb\x19\x0b\x83\xdb\xa1\xaa\x9c\x70\x65\xe8\xfd\x0e\x81\x63\x9e\xcb\xc1\x87\x23\x5b\x6d\x66\xd0\xf4\xc1\xb1\xce\x71\x69\x76\xc6\xc8\x09\xbd\x64\x75\xe4\x15\x6a\xc0\xd7\x12\x68\xd5\xd8\xe2\xc5\xc1\x29\x8e\x5a\x7f\x7d\xc4\xa5\x61\x66\xf1\x60\x49\xbd\x79\xab\x81\xdb\x5d\x0b\xbb\x41\x1d\xb6\xb9\x85\xcf\x52\x48\x3e\x97\xfd\xfe\x25\xcf\x9d\x9e\x93\x3a\xa7\x06\xb3\x6f\x00\x34\x07\xd0\xef\xa0\xd0\x6e\xa8\xba\x0f\x17\x42\xe5\x1a\x73\xdd\xae\xad\x85\x38\xeb\xbb\xba\x0e\x7b\x4d\x09\xd7\x80\xc9\x35\xe2\xdd\x2f\x0a\x1a\x8d\x9c\x6d\x84\x9e\x41\xd4\x22\x51\xef\xe7\xcd\x3e\xce\xac\x51\x68\xae\x37\x5a\xaa\x07\x5c\xb4\x62\x40\xe0\xc4\x7e\x63\x24\x8a\x0d\xf0\xec\x83\x3b\xd8\x91\x10\x17\x39\x89\x68\x2a\xb7\xa6\x0c\xfd\x12\xc5\xf8\x12\xcb\x1a\x86\x46\x89\xc8\xa7\x99\xc1\xbb\xe3\x22\x1e\x15\xc5\x24\xdf\xd9\xdc\x54\x0f\x63\x23\x31\xde\x1c\x52\x46\x33\x91\x6e\x86\x15\x6e\xf6\x13\xd1\xdf\x1c\xd3\xbc\x60\xd9\x66\x9e\x45\x9b\x13\x5a\x44\xa3\x4e\xcc\x2e\x3b\x5f\xf2\xff\xf5\xae\xbb\xf5\xe3\x22\x03\xc5\x4b\xbc\x63\x54\x80\xbe\xd1\xb7\x96\x56\xd1\xb8\xc2\x52\x3a\x9a\xd8\x29\x27\xd9\xae\x6a\x97\x65\xdc\xad\xf2\xdc\xb1\x05\xb4\xbb\xc6\x9b\x1b\xe8\x9b\xa2\x91\x93\x84\xfe\x63\x06\xe6\xcd\x53\xb9\xce\xef\xd4\x0c\x58\x7f\xc2\x7f\x19\x1e\x9f\xea\x86\x74\x78\xca\x0b\x4e\x93\xa6\xd1\xf6\x37\x37\x15\xdb\xb7\x1d\xbb\xc9\x2c\xd9\x98\x43\xbd\xd6\xac\x61\xcd\x90\x7e\x78\x8d\xd3\xde\x40\x4a\x1e\xcb\x0b\x32\x99\x66\x32\x25\xef\xac\xcd\x81\xca\x0d\x98\x81\x72\x76\x7d\x78\xe9\x59\x9a\xdb\xce\x6c\x77\x5c\xb0\xd9\x0e\x69\x94\x4f\x65\x1a\x6d\x47\x7d\xc1\xc5\xb9\xb5\xf4\x2d\x01\x37\x7d\x6d\x80\x76\x6f\x30\xaa\x9a\x96\xcb\x25\x7b\x64\xe8\xdc\x5a\x4a\x5e\xf3\x78\x61\x42\x34\x6c\x40\x87\x99\x4a\xb7\xc9\x1e\x41\xb6\x07\xaa\xee\x91\xd7\xef\xa1\x4e\x73\x4d\x71\x83\xfe\x32\xcd\x0c\xe7\xbc\x3a\xc1\x31\x50\x4d\x57\x9a\xdb\xae\x05\x4f\x15\x09\xb0\xf5\x48\x62\xb3\x9e\x87\xd6\x20\x3f\x77\xcb\xfa\x77\xdb\xc8\x73\x3d\x84\xea\x17\x17\xbe\xe5\xf1\x05\xc4\xec\x13\x53\x87\x4a\xbe\xc2\x53\x87\x6e\xf0\x8c\x3f\x99\x79\x07\x23\x72\x18\xc0\xe1\x93\xda\x5d\x4e\x27\x31\x2d\x58\xc9\x2c\xfe\xd5\xcc\xcb\x97\x5b\xc9\x31\xa3\x29\xc9\x58\xc4\xf8\xa5\xc4\x48\xd3\x18\x8e\x06\x00\xbd\xc4\x07\x5b\x3c\x29\xc8\xb0\xa4\xce\x3b\x55\xad\xca\x19\xdc\xef\xb1\xe6\xd7\xdb\x76\x85\x79\x66\x09\x3e\x66\xc0\x05\xcd\xda\xd0\xa0\xd8\xfb\x7d\x7b\x4f\xc9\x95\xc3\xe2\x13\x34\x07\xec\x52\xf2\x45\x87\x92\x5b\x26\xa0\x1c\x5e\x86\x07\x73\x89\x3e\xa0\x23\x89\x18\xf2\x28\x10\xec\x5a\x65\xbe\x17\xa8\x73\xa9\xc0\xee\xe1\x24\xc3\xfe\x2d\x32\x38\x14\x97\x2b\x75\x80\x02\xb9\xcf\x84\xb3\x22\xcd\x22\x79\xfd\x5b\x3a\xbe\x8f\x96\x53\xe0\x55\x7a\xae\xaa\x8d\x55\x9d\xe1\x2b\x0a\xed\x4a\xa7\x62\x19\x55\xa9\x3e\x9c\xd2\x81\x02\x29\x23\xf7\x85\x77\x11\xd6\x20\x47\xe7\x30\xc3\xb0\xbc\xa4\xa2\x4c\xfb\x6a\x16\x5d\xf7\x14\x9b\xd2\x36\x5e\x8b\x44\x8d\xb0\xec\x86\x65\xe5\xd2\xc0\xae\x3f\xcb\x8b\xd2\xce\x90\x15\xcd\x32\x9e\x72\xa7\x3d\x72\x51\x85\xad\x08\xaa\xa9\x3c\xc4\x76\xe1\x2b\xe8\xc8\x2b\xe9\x68\x7b\xa8\x5b\xf3\xf9\xe4\x40\x9a\x83\x0a\x27\x0d\x9a\x5a\x23\x92\x8f\x4a\x85\xe7\x35\xd1\x1c\x97\x07\xca\x34\x63\x83\x7c\x87\x6c\xb5\x83\x64\x28\xba\x03\xf2\xed\xab\xd5\xdd\xda\x1a\x80\x1d\x40\x6b\xbb\x5c\x73\x3d\x1b\xe0\x2c\x25\x04\xef\x48\xb2\x40\x7f\x6d\x55\x4d\xa7\xb9\x3e\xff\x2b\x73\x5f\xdd\xce\x69\x42\x52\x5a\x9a\x19\xd0\x20\x88\x15\xd4\x3d\xc8\x77\x01\xee\xe9\x2f\xcc\xfd\xd3\x78\xe1\xe0\xc8\xd9\xba\xbb\x06\x20\x76\x29\xe7\x1e\x4c\x78\x4c\x5e\x2b\xb7\x18\x8e\x61\xd5\x68\xb0\x97\x90\xf6\x86\x4a\x09\x62\x7b\x91\xd5\xbb\xfc\x93\x84\xee\x20\xbd\x61\xdf\x0f\x12\x3e\xd9\xd1\x47\x60\x78\x6e\x28\x1b\xde\x17\x22\x61\x34\x6d\x90\x97\x98\xb8\x83\xab\x80\x0e\xba\x60\x83\xed\x9c\x04\xcb\x8a\xa4\x11\x62\x4c\x78\x7a\xa1\x7c\x55\xfa\x0d\x6d\x93\xd2\x06\xa4\x5d\xd5\xa9\xe6\x20\x31\x6c\x46\x0a\x7b\x8f\xd4\xdd\x6e\x28\xc4\xa5\x63\xcb\x56\xb8\x46\x2a\x4b\x9d\xe6\x32\x7c\x56\x48\xba\x9e\xb7\x42\x4c\xf6\xb6\xec\x13\x38\x7f\xc9\x66\xba\xab\xc2\x2d\x8f\x01\x38\xdf\x2d\xc9\x9c\x0f\x50\x16\x2e\x3f\xbf\x43\xe3\x18\x8b\xd4\x3e\xa5\x0a\x24\xa9\x66\x94\xb9\x07\x91\x73\xa7\x18\x9c\x26\xe7\x4c\x31\x66\x1e\xfd\x6f\x3c\xc5\xd4\x23\xba\x8f\xfe\xae\xe9\x8a\x0d\xe8\x8a\x07\x28\x47\xaf\xee\x98\x25\x4c\x6b\xc2\xaa\xc9\xec\x8b\x79\x8f\xe3\xaa\x91\xea\x41\x51\xa1\x43\xff\x72\x81\x47\x5a\x17\xa4\xf0\xf6\xbe\x0b\x28\xdc\x2c\xcd\x91\x6e\x04\xa8\xdb\x9f\x3e\xab\xda\x9f\x1a\xdb\xcd\x5c\xb3\x07\x8f\x66\x83\x76\xaa\x9b\x2e\xb9\x6b\x90\x1b\x44\x80\xe9\xa8\xc4\x10\x56\xdf\x68\x5a\x40\x9d\x12\x42\xc2\xa3\xe7\xc5\xef\x6a\x7a\xea\xd4\xf8\xac\xa1\x6a\x6e\xb4\x49\x43\xe3\xc6\x4b\x9a\xa0\x65\xd6\x8f\x9a\x9e\x46\xfd\x7c\x64\x18\x8b\x0f\x0c\x9c\x7a\x31\xe1\xca\xc0\xa3\xfb\xa8\x85\xc5\xc7\x6e\x8d\x22\xa8\x15\xe3\xbb\xc7\x70\xe5\xfe\x87\x54\x34\xb2\x8c\x10\xe9\xd3\x3d\x3a\x77\x25\xe4\x88\x42\xc9\x13\x8e\xa9\xa1\x6e\x8a\xbf\x6d\x87\xe4\xa8\xe5\x00\x3c\x6c\xb0\x80\x6e\x25\x9d\x8c\xc5\xd3\x88\x39\x3e\x8b\x68\x14\x4d\xc7\xd3\x44\xf2\x4c\x39\x68\x0b\xc7\xe5\x03\xef\x9d\x02\x1a\xd1\xae\xed\xe6\x46\x8d\xa3\x3a\x59\x28\xdd\x4e\x15\x23\x06\xb6\x75\x9f\x1b\xe4\x29\x7c\x79\x4a\x1a\x9f\x89\xfc\x01\xaf\xdf\xd0\xb6\x4a\x7b\xb9\x57\xbc\x33\x36\x05\xea\xa2\x8a\x8f\x27\x68\x6d\x84\xc7\xb7\x50\x78\xc1\x25\x9b\xac\xae\xd3\x68\xb5\x49\xe3\x3f\xc4\x14\xce\x82\x45\x9a\xcc\xac\x3d\x91\x48\xcd\x69\xf3\x40\x24\x89\xb8\xe2\xe9\x70\xc7\xd6\x10\x74\x49\xc0\x93\x96\xba\x24\x6b\x37\x5a\xfa\xbe\xec\x3f\xd3\x8a\x0b\xb3\x95\xf5\xc9\x23\x47\x26\x4c\x87\x18\x6f\x4d\x41\x96\x7b\x23\xfa\x4d\xba\xe5\x92\x26\x1c\xcf\x47\x97\xef\x11\x6d\xdd\xa0\xea\x24\x94\xa4\x22\xf5\x9f\xd3\x2a\x73\x04\x22\x06\xd8\x31\xa5\x86\x02\xc2\x05\x3b\x20\x18\xbd\xc6\x9d\x21\x09\xfe\x9c\xe1\xa5\x2d\x3a\x2b\x07\xc4\x53\xd2\xa8\x24\x6a\x37\xc0\x78\x1b\x12\xa2\x0e\xa9\x9d\x7a\x76\xc3\xb5\xf1\xd7\xdb\x96\xbf\x21\xab\xf4\x9c\x65\xf4\x4d\x40\xdf\xdc\x65\xd9\x58\x64\xac\xac\xe9\x37\x37\x89\xba\xe1\x71\x8e\x17\x95\x10\x68\x07\x75\xbe\xf9\x8e\x2d\x78\x02\xc6\x2a\x68\x11\x86\x8e\x40\x84\x31\x2b\xfb\x6c\x6e\xed\x9b\xad\xcf\x04\xcd\x3f\x37\xd0\x0c\xec\xa0\x0a\x9d\xec\x24\x53\x24\xec\x1d\x49\xba\x73\xfa\xaa\x15\x7e\x6d\x73\xf5\x6d\x00\xbe\xfa\x30\xe7\x3c\xb8\x33\x53\xae\x85\xad\x78\xd6\xef\xcc\xac\xf5\x90\x66\xf9\x6d\x1b\x88\x69\xe3\x1c\xde\x06\xab\xdc\xc1\x8e\x9d\xfb\xbd\xee\x33\x6b\x1a\x7b\x8f\xa2\x28\x03\x15\xaa\x2c\x06\x9a\x21\x99\xa5\x5b\x71\xbc\x79\x0e\x1e\x1b\xdc\xb1\x9b\xac\xb9\xbe\xdb\x71\x5f\xac\x98\x1a\x71\x0d\xb2\xa6\x64\xd0\x7f\xa7\xa0\x81\xda\x0b\x5f\xe3\x78\x84\xee\x48\x91\xde\x75\x9a\xf1\x81\x5e\xc0\x86\xc0\xb4\xd2\xcd\x74\xdf\xdd\x2c\xaa\x37\x75\x8b\x17\x35\x69\x53\xf2\xb6\x90\xfd\x19\x0e\x41\x34\x29\xc2\xbe\x00\xb6\x57\x3e\x95\x29\x5d\x04\x95\xfa\x71\x73\x53\x0d\x04\xd7\xfe\xd3\x69\xbd\x35\x83\x12\xe6\x62\x9a\x2c\x77\xec\x81\x08\x63\xef\x39\x0c\x4e\x30\xc1\x3b\x9b\x0a\x75\xdd\x26\x0d\x6b\xb4\xd5\x68\x79\x86\x2d\xa1\xfc\xde\xe2\xcb\xd5\xf2\x43\x5d\x8b\x61\xee\xf3\xd3\x25\x1d\x33\xff\xf8\xd7\xbe\x72\xf7\xdf\xc1\xd6\x99\xc3\xff\x60\x9f\x69\xf8\x05\xe6\x3d\x8f\xf0\x21\xff\x49\xaf\xdf\xcb\xaf\xaa\xdb\xb8\xc9\xb2\xc6\xb2\xde\x5b\x09\x3b\x12\x82\x86\x3a\x06\x66\x06\x91\x16\x49\xb5\x6b\x83\x0f\x3d\x0a\xcb\x01\x51\xd4\x58\xf6\x42\xa9\xb8\x39\x57\x19\x2f\x6c\x2a\x8a\x26\x88\xa8\x37\x53\x0a\xfb\x28\x03\xea\x0b\x5f\x5d\x8b\xfe\x97\x8a\x27\xd7\x3f\x3d\x48\xaa\xca\xfe\x67\xc9\x63\xc5\x8e\xc7\xd5\x5a\xe6\xf9\x76\xb7\x25\xf1\xe9\x6e\xc3\x36\x91\x12\x5d\x3f\xff\x97\x78\x70\xaf\x2d\x35\xa4\x62\x33\xc6\x52\x56\x40\x1e\x19\x00\x63\xd3\x21\x06\x1e\x68\xd9\x23\x86\x54\xf5\xe8\x15\xe3\xf1\x01\x4d\xe5\xfa\x52\x6a\x03\xfd\x2e\x00\xfc\x91\x19\x02\x1e\x63\x2f\x97\x7b\xad\xfb\xb0\x50\x1b\xff\xa3\x0c\x6a\x7b\x5c\x39\xbc\x70\x5c\xf2\x5a\xea\x38\xcb\x95\x5b\x0c\x65\xd5\xa6\x7b\xb7\xca\x65\x3b\x1e\x87\x54\x3a\x46\x42\x1b\x7e\xf4\x98\x07\x76\xa5\x00\xeb\x78\x44\xb2\x99\x1d\xab\x2d\xc0\xb7\x6b\x55\xfa\xcd\x8d\x6f\xa3\xe6\x40\xb9\x3a\xc5\x09\x4d\xa1\x27\xd8\xc7\xa0\x28\x1e\x4b\x25\x67\x0b\xb5\x5c\x04\x5a\xf5\x04\x85\xe7\xeb\x41\xcd\x23\x07\x0f\x68\x45\xa7\x0e\xeb\x22\xcb\x55\x51\xae\xe1\xb2\x19\x43\xc0\xeb\x42\x7c\xc4\x03\x21\x34\x1e\xff\xe8\x72\x5f\x2d\x15\x14\x48\xab\xdc\x67\x0e\x32\xfb\xcc\xcd\x45\xeb\x78\x95\xf2\xf0\xcf\xc3\xe4\x93\xb2\xeb\xae\x14\x1c\x28\xbd\x5e\xc0\x47\x28\xde\x10\x5e\x65\x28\x8b\x05\x86\x30\x6e\x9f\xeb\xbd\x0c\xd8\xc7\xb1\x08\x39\xef\x8d\xbd\xc2\xf5\x4f\x1f\xac\x39\x4b\x06\x6d\xd0\x9f\x8e\x4e\x96\x89\x65\xb5\xfb\x89\x81\x21\x5c\xa4\x75\x2f\x18\xc4\x8e\xd0\xbf\x28\x38\xac\x54\x86\x58\x3c\x67\x31\xd9\x20\xf9\x74\x02\xa7\xab\x2e\x04\x7a\xa7\xd4\x3a\x79\xcd\xf1\x9d\x08\x11\x6c\x48\xd3\x38\x94\x96\x09\x7b\x72\xd5\x6e\xcc\xae\xe5\xa2\xdd\xfd\xb5\x83\x43\x48\xb1\xda\x39\x0c\x93\x6d\x69\x61\x61\x5c\xbc\x3f\x76\xcf\x3e\x0c\x62\x3b\x43\x90\x97\x98\xbc\x03\x4f\x8c\x2a\x66\xf8\xee\xc3\x22\x7a\xdc\x5b\xd0\xf2\x45\xbc\x85\x3c\x7f\x66\xdf\x6f\xe7\x0b\xfb\x0b\xc9\x6b\xfc\x85\xe0\x03\xc1\xba\x70\x34\xa1\x9b\x8f\xbb\x1f\x0e\xb7\xfe\x5b\x0f\x9a\x69\x1f\x8e\x4e\xda\x28\xe4\xf0\xdd\x0e\x1f\xed\x09\xde\x64\xe1\xf6\xd3\xc8\x1b\x78\xc7\xf6\x33\x5d\xb3\x93\xca\x75\xce\x89\x84\x97\x92\x96\xb1\x1c\xfc\xc9\x81\x1b\x55\xc6\xe1\x4a\xa0\xcf\x30\x04\x94\xc8\x9c\x85\x4f\x1b\x0e\xde\x1e\x93\xa7\x55\x04\x2d\x37\xb2\x9c\xc6\xb6\xec\x10\xd6\xcc\xb0\xf3\x82\xff\xca\x6d\xbb\x0a\x81\xcf\x03\x77\x4a\x41\x26\x44\x56\xff\xef\x84\x5b\x01\xc3\xfd\x8a\xdd\x80\x0a\x9f\x58\xb5\xe8\xaf\xdf\x24\xd8\x89\x14\x5a\x05\x73\x98\xd3\xaf\xe1\xe8\x32\x22\xa1\x0e\x5f\x6b\xb2\x5b\x35\x62\x62\x1b\xe0\xbc\x0a\xd8\x73\x40\xaa\x14\xd0\xdc\x08\x18\x76\x60\x29\xa1\xc5\x20\x41\x0b\xba\x78\xf2\x43\x69\x92\xa6\x72\x74\xd7\x22\x4f\x36\xab\x90\x74\xe2\x66\x65\x7d\x8f\xa3\xc7\xed\x4a\x7f\x73\x1f\x3f\x1d\x9e\x1c\x7e\x38\xdd\x97\x5b\xf7\xde\xfe\xe9\xe9\xa7\xa3\x57\xbf\x9d\x1e\x9e\xec\x12\x8c\x4f\xb9\xb2\xfa\x69\x4d\xfd\x87\xbf\x1f\x7e\x38\xfd\x96\x15\xc7\x35\x15\x9f\x1c\xec\xbf\x3b\x84\x60\x6b\xab\xaf\xb3\x5f\x53\xe7\xbb\xc3\xb7\x87\x1f\x5e\x7f\xa3\x4a\xbf\xd4\x54\xea\x1f\xe5\xaf\xbc\xda\x51\x4d\xb5\x03\x9e\xc6\xfb\x49\xf2\x6a\x26\xf5\xe4\xca\x6b\xe5\x73\x6a\x3d\x18\xf1\x24\x0e\xea\x9d\xa6\x53\xb9\xee\x09\xaa\xbf\xc2\x0b\x5a\x08\xb0\x84\xf1\xb1\x56\x45\xdf\x45\x7d\x67\x7c\xc4\xd0\x34\x70\xcb\xb6\x5f\x14\x19\xef\x4f\x0b\x96\xaf\x9c\x43\xac\x96\x43\x49\xc1\xb2\xc3\x4b\x96\x16\xdf\xb0\xf6\xc1\xdd\xb5\xe7\xc7\x03\xe8\xa9\x95\xd7\xfd\x67\x4d\xdd\x70\xcd\x45\x0b\xf6\x07\x8f\x8b\xd1\xbf\x31\x3e\x1c\x15\x2b\xaf\x3b\xad\xa9\x9b\xe7\x27\x79\xb6\xf2\xda\x86\x73\xb9\x7c\x72\x39\x54\xd7\x22\xf9\x1d\xe3\x80\xe7\x27\xe0\x2e\x03\xfa\xe3\xf0\xcf\x29\x4d\x56\x3c\x1c\xc6\xb5\x6c\x39\x50\xce\x2b\xa0\xd6\x95\x33\x68\x52\x53\x2f\x5e\xb1\xbd\x9a\x81\xef\x92\x95\xd7\x9a\xd4\x0f\x7e\xb8\x5c\x00\xf1\xff\x46\x8a\x51\xd4\xd4\x3d\xa1\x59\x8e\xfd\x0b\x2e\xbe\x4b\xf5\xf2\x31\xd4\xfb\x64\x13\xad\x68\x4c\xdc\xb0\xa3\xf7\x1f\x8f\x3f\x9d\x1e\xbe\xee\xbd\x3f\x7e\xfd\xdb\xbb\xc3\xde\x56\x2f\x11\x31\xcd\x47\x3d\x9e\x7f\xe0\x09\xac\x8d\x2a\x8f\xf7\xbb\xab\x41\xdf\x8b\xe7\xb9\xbc\xea\xa4\xcd\xc5\x51\x2d\x47\x50\xd7\x62\x39\x81\x6b\xec\xda\x26\x77\x7f\x7e\xb1\xb2\x2a\x1e\xd0\xec\x0a\x6c\xcb\x91\xb5\x6d\x11\xa1\x07\xa5\xfa\xce\xfe\x69\x65\x35\x3c\xa0\xe1\x15\xd8\x96\x23\xeb\x99\x45\xf4\x46\x8d\xa4\xfa\x4e\xff\x61\x85\x75\x3c\xa0\xf1\x95\xf8\x96\x23\xed\xb9\x45\x05\x8e\xf5\xeb\xdb\xbe\x64\xb7\x97\x2b\x78\x40\xc3\xcb\xc8\x96\x23\xea\x05\x5e\xd8\xd7\x37\xf6\x81\x68\x1f\xd0\x44\x83\x63\x39\x12\x7e\x00\xe3\x00\x38\x2f\xc8\x6b\x9b\xb7\xb5\x0a\xdc\x0f\x68\xa3\x8f\x68\x39\x62\x7e\xec\xf5\x5e\xd3\x82\xfe\x56\xf0\xa4\xbe\xa1\x70\xa2\xb5\x04\xf2\x9f\x7a\xbd\x8f\xd3\x8c\x7d\x82\x85\x43\x3d\x76\xb8\x20\x82\x3f\x7b\x04\x56\x88\x03\x91\xe6\xd3\x31\xed\x27\x4c\x87\xaa\xc8\xb4\x73\xba\x30\x64\x2c\xdc\xa8\x05\xf7\x2d\x10\x8a\x61\x9b\xec\x99\x40\x17\x99\x0e\xa8\xa2\x3d\x95\x67\xc1\x3d\x0c\x14\x40\x0f\xd5\x34\xcb\xce\x38\x78\xaf\xd3\x96\x4a\x59\xb6\xed\x38\xd7\x53\xa9\x48\xc7\x20\x13\x63\x20\x42\x39\xb1\xc3\x3f\x49\x48\xcd\x39\x81\x7a\xe2\x42\x13\x3e\x4c\xe5\x4a\xf3\x15\xcd\x59\xc2\x53\xf0\xb3\x73\x3f\xa1\xe9\xd0\x0e\xda\x89\xb5\x25\x3e\xb9\x1a\x5d\x0a\x07\x86\xec\x95\x38\xfa\x8a\x94\x93\x11\x1f\x14\x0f\xa4\x27\x82\x37\x1a\x0f\x46\xf1\x91\x16\xa3\x15\xa0\xf9\x34\x5d\x92\x39\x0e\x1a\x91\x88\x6c\x15\x38\x8e\xd2\x82\x65\x13\x91\xc0\x76\x76\xe5\x08\xdf\xc0\x46\x26\x5f\x05\xde\x8f\x99\x18\xf0\xd5\xf0\x0d\x95\x00\x18\x98\x3e\x0c\xd9\x34\xcb\x1f\xdc\x0b\xe6\x3d\xd0\x52\x78\x44\xca\x8e\x07\xcd\xb3\x46\x52\x64\x8d\xb6\x7a\x4d\x44\x1a\xca\xc7\x4b\xe3\xbc\x85\x35\xc0\xe9\xd1\x43\xe9\x14\x63\x9e\xd2\x95\x69\x08\x06\xae\x84\x5e\xd1\xe8\x62\x98\x89\x69\x1a\x3f\x10\xdd\x80\x27\xc9\x0a\x50\x1c\x4f\x68\xc4\x8b\xe5\x58\x05\x5d\x21\xf7\x84\xcd\xb3\xe5\xe9\x58\x5e\x65\x62\x5f\xcb\x46\x2c\xad\x5e\xb4\x30\xa5\x22\xfd\x07\xcb\x84\x94\x24\x76\xc9\x52\x11\xc7\x65\xa1\xc2\x23\x8a\x87\xb2\x3c\x11\x22\x3e\x58\x81\x2a\x03\x44\x7f\xff\xce\x13\xe9\x43\x27\x3a\x89\xe2\x0d\x1d\xf3\xe4\xa1\xc3\x5d\x22\x3a\xe1\xff\x78\x80\x20\x2d\xcd\x4d\xb5\x04\x58\x9e\x7e\xcb\x4d\xd9\x82\xfd\xf8\xcb\x34\x5f\x8e\xaf\xff\x75\xda\x51\x64\xac\x88\x96\x5b\x7b\xd8\x51\x9d\x8d\x29\x4c\x0f\x57\x1c\x9e\x6e\x91\x46\x4a\xb3\x4c\x5c\xe1\xf7\x69\x52\x64\x74\x23\x12\x69\xcc\xd2\x9c\xc1\x88\x67\xd7\xa5\x24\xef\x47\xce\xc6\x7c\xa3\x9c\xc2\xae\x27\x34\x8d\x35\x0a\xf7\xbb\x44\xe7\xa6\x60\x9d\x6e\x4a\xa0\x64\xa0\xe9\xb3\x07\xab\x33\xdd\x70\x5e\xd0\x84\x47\xf2\x9b\xe8\x27\xfc\xcf\x29\xab\xae\xf2\x77\x9a\x71\xba\xe4\x50\x2c\x57\x9a\x8f\x69\x92\x6c\x44\x74\x92\x57\xd7\xf6\x07\x9c\x64\xaf\xa8\xb2\xbe\x48\x62\xfd\x89\xfd\x9a\x48\xec\xf0\xb5\xbb\xb5\xd5\x26\xdb\xf2\xbf\x67\xf2\xbf\xe7\xf2\xbf\x17\xf2\xbf\x1f\xe4\x7f\x3f\xca\xff\x7e\x92\xff\xfd\x2c\xff\x0b\x08\x1d\x26\xb3\xc9\xe8\x38\xe3\xfa\xe2\xe3\xdf\x44\xc6\xff\x21\xd2\x82\x3e\x74\xd6\x0d\x11\xff\xce\xb2\x82\x47\x0f\x46\xcb\xc7\x74\xc8\x1e\xb6\xce\xd3\xcc\xa5\xd3\x02\xa6\x42\x1d\xaa\xff\x64\xc2\x50\x56\x75\xc2\xff\x99\xd2\x84\x17\xb3\x72\xef\x5e\x30\x78\x37\xf4\xf7\x55\x3d\x09\x2b\x0a\x96\x9d\xc8\x79\xf5\x6f\xdd\x0c\x39\x04\x78\x3a\x5c\xc5\x4a\x03\x23\xcd\x1e\x3e\x78\xc1\x8a\x78\xde\xf3\xd5\xe0\x39\x29\x68\xf6\xd0\xa5\xc3\x98\xe6\x17\x0f\x44\x21\xfe\x69\x2b\xb0\x15\x49\x8a\xb8\x64\xd9\x20\x11\x57\x0f\x52\x18\x97\x1c\xbc\x57\x4a\x7d\x30\xe2\x71\xcc\x52\x98\x05\xa2\x4c\x24\xa0\xa2\xb5\x3e\xf1\x75\xc5\x44\x80\xa5\x15\xde\xac\xae\xa2\xfa\x8f\x54\x22\x04\x45\xa5\x52\xde\x70\x24\x40\xfd\x3c\x29\x32\x71\xc1\x9c\x04\xf9\x75\x62\x4b\x0d\x14\x78\x6e\xe0\x28\x26\xa4\x22\xad\x98\x38\xf3\x11\x9d\x7c\x6b\x8d\x1b\x65\x3c\x9f\x1c\xc6\x43\x7c\x6d\x3d\x64\x62\xcc\x8a\x8c\x47\x1f\x33\x16\xf1\x9c\x8b\xb4\x82\xaa\x42\x4c\x56\x31\xec\x25\x9e\x7f\xde\xfe\x62\x45\xd2\x8d\x3d\xf9\x77\xa7\xff\x35\xcd\x47\x10\x62\xf6\xc1\x5d\xaa\xb1\x89\xc1\x20\x67\x7f\xe3\x1d\x02\xb6\xe4\x1d\x4f\x59\x44\x97\x3b\xe6\xd4\x23\xaf\x3f\x2d\x0a\x38\x47\x12\xd3\x14\x17\xf4\x7f\x4e\x69\x56\x35\xda\x4d\x95\x5f\x04\x7f\xd8\xd1\xd5\x98\xe3\xf2\xd4\x56\xda\x67\x97\xac\xe2\x1c\x0b\xeb\x7c\x2f\xc1\x13\x3e\xe6\x7f\xfb\x0e\xfb\x6f\xa2\x4f\xc0\x1c\xe7\xef\xdb\x88\x82\x5d\x17\xfb\x69\x34\x5a\x72\x8a\xd0\x52\x9c\xcb\x15\x98\x94\xd9\x31\x8f\x63\x9c\x4b\x59\x5a\xb1\xa5\x95\xd5\xbd\xc6\x18\x0c\x0f\x3d\xf3\xd5\xf3\x30\xfa\xa6\xe4\xf8\x43\xae\x60\xf4\x77\xf9\xb9\x51\x8c\x32\x31\x1d\x8e\x60\x5c\x25\x3c\xbd\xa8\x26\xe9\x2f\xda\x2a\xbd\x63\x43\xde\xe7\x7a\xb7\xb4\xc8\x04\x3e\x4d\x79\x24\x62\xf6\x8a\xc7\x7c\x45\x5b\x64\x36\xee\x23\x51\x7d\x1e\xf3\x0d\xed\x80\xa2\x5c\x33\xac\x8a\x80\xd6\xd5\xaf\x06\x23\x91\x24\x74\x92\x57\xd4\x7a\x25\xb2\xf8\x6f\xbf\xe1\xba\xca\xb8\xdc\x6f\xbd\x17\xf1\xc3\x4e\x6e\x92\x6c\xa3\xe8\xc3\xd4\x90\xa8\x2f\x45\x7f\x23\x83\x5e\x4c\x70\xca\x48\x30\xb1\x42\xa8\x33\x9a\xe6\x03\x91\x8d\x1f\xbc\x4a\x58\xfa\xf8\xc9\x46\x6b\xb9\x5a\x5a\x45\xda\xeb\xd0\xd1\xf2\xc7\x44\x16\x49\x7c\xfd\x50\x04\xcb\x0d\x06\x8b\xe0\xa1\x04\x3c\xb4\xfe\xe5\xb4\x3c\x96\x87\x97\x03\x97\x34\x2b\x19\xbd\xab\x5b\x74\x91\x1e\x24\x3c\x5a\x6e\x13\x3d\x98\xa6\x11\xec\x40\xd3\xf7\x62\x9a\xb3\xd7\xe2\x6a\xb9\xc9\x21\xc0\xf3\xdb\x72\xeb\xc1\x00\xcb\xf1\xe5\x92\x57\x3d\x01\x9e\xf7\xe2\x72\xb9\xb1\x14\xd2\x33\x5d\x6e\x20\x04\x68\x0e\xd3\x65\xaf\xb0\x02\x44\xef\x18\x7d\x70\xc3\x4e\xc5\x34\x1a\x2d\x7b\xae\x14\xa0\x59\x01\x9f\x01\xcf\xf2\xc7\x4a\x01\xa2\x03\x9a\x46\x6c\xb9\x33\x5d\x1d\x72\x0a\x06\xde\xa7\xc3\xfd\x83\xd3\xde\xab\x4f\xc7\x7f\x9c\x1c\x7e\xea\xe1\x30\x7c\xbf\xff\xd1\x84\x95\x82\xd1\xd7\x50\xe3\x10\x9c\xd3\x8d\x65\xff\xc4\x30\x9a\x1a\xce\xd8\xb2\x79\xd3\x89\xcd\xf9\x6d\x62\xd3\x05\xc8\x7c\xc3\x19\x01\x36\x6f\x0c\xfc\x6d\x38\x52\xed\x94\x93\xb2\xd9\xb0\x82\x6a\x73\x18\x8a\x5b\xc3\x95\x3e\x9b\x9b\xa0\x0c\x35\x5c\x91\x82\xdc\x42\x32\x30\x52\x0c\x6c\x78\x0c\xb5\xf9\x4c\x0a\x4e\xc3\x4a\x91\xcd\x31\xb4\x1a\xc9\xb0\x79\x39\xf6\x6f\xc3\xed\xee\x86\x61\xb6\xf3\xc2\x86\xec\x11\xbb\xba\x93\xcb\x4a\x0a\xd3\xef\x44\x5c\xe1\x26\x11\x97\xbe\x89\x18\xc2\x44\x1c\xb3\xb4\x50\x4b\xbc\x82\x63\x08\xa3\x3e\xc5\xc5\x30\x1c\x73\xc1\x8a\x30\x8b\x79\x8a\x0b\xb2\x3f\xa7\x34\x2d\x38\x2e\x91\xf0\xfb\x3f\x70\x5d\x5b\x44\xa7\xaa\x78\xce\xfe\x9c\x4a\xa4\x58\xa0\x18\x65\x2c\x1f\x89\x24\x6e\x9c\x2b\x52\xdd\x87\x39\x40\xab\x5e\x02\xdb\xfd\x6b\xc6\x22\xa8\x38\xe2\x59\x84\x75\x45\x99\xc8\xe1\x20\x29\xe6\x74\x2c\xd4\x7e\xb7\xc0\x96\x15\x19\x07\x1b\x26\xb8\x2e\x9b\x31\x73\xec\x75\x8e\x6f\xc7\xd6\xc8\x13\xf2\x96\x61\x20\x3e\x65\x5e\x81\x4e\x6c\xc5\xc0\x8d\xfb\x25\xc1\xfe\x75\x42\x33\x3a\x26\xe4\x2b\x1a\xb5\xde\x82\x07\x1a\x72\x82\xbe\x66\x58\x6c\x1d\xd2\x00\xb0\xb2\xe6\xfa\x8a\xa6\xbf\xb7\xf8\xa6\xee\x75\x50\x83\x5b\x64\x53\xc5\xbe\x0c\xa2\x2c\x7b\x91\xf6\x6c\x0e\xf8\x93\x71\x9e\x22\xdb\x9f\xe6\xb1\x70\xa3\x81\x6f\x0f\xbd\xd7\x96\x40\xb3\xeb\xc7\x2c\x28\x24\xf3\x75\x31\x27\xc9\xf3\x75\x73\x73\x83\x69\xda\xd9\x6f\xc3\x34\xa3\xa1\xdf\xe4\x49\x16\xbc\xe1\x69\x0c\x1e\xf1\xb5\xb9\x5b\x92\x90\x31\x2d\xa2\x11\x8b\x6d\xa4\xcc\xfe\x0c\x5e\x1c\x77\xc8\x67\xf9\xf1\x59\xc7\x16\xa1\x04\xec\xf3\x75\x4c\x4c\xe5\xb1\x42\x64\x12\x2f\x12\x6e\x38\xe6\x3d\x6f\x72\x19\xe6\x65\x34\x75\x8d\x6d\xa8\xcf\x06\x47\xcb\x58\x8e\x86\x92\x67\xe0\x13\x41\x26\x15\xca\x45\x92\x4c\x51\xdc\x5b\xc6\x86\xb6\xd9\x02\xa6\x5b\xc7\x1c\x0a\x2d\xb4\x77\x4c\x27\x8e\xeb\x41\x27\xf4\x52\xe5\x5b\xb1\xa6\xf6\xf2\x59\xe1\x8c\xc5\x50\x1b\x16\x91\x75\x9f\x9b\xe7\xa7\xf7\xb0\x8c\xed\xd0\x8e\x7e\x0c\xd2\x19\x88\xec\x90\x46\x23\x87\x7d\x96\x6a\x48\x73\xc3\xbd\x41\x82\xea\x06\x8c\x18\xba\xbe\x8e\x5f\x3a\xf0\xde\x75\x7d\x5d\x15\x82\x9f\xa1\x4c\x39\x39\x8e\xf7\x6a\x2d\xbb\x2a\x2c\xd8\xf1\xa0\x69\x6a\x69\xc1\x9b\xe0\x8d\xae\xcb\x3c\xd9\x99\x9d\xc9\x34\x57\x14\xbb\xde\x1f\xd0\x4f\x94\x79\x77\x92\x43\xc0\xcf\xdb\x5d\x25\xad\x18\x97\x0a\xdd\x16\xf2\x2c\x2f\x7c\x51\xd5\x72\xda\x36\x11\x86\xe1\x21\x71\x31\x62\xd9\x15\xcf\x59\x47\x62\x58\x4c\x82\x95\xf8\x76\x3c\xf9\x75\x1e\xca\x85\x12\xec\x64\xdd\x2d\xc3\x73\x45\xbe\xdc\x7c\xd9\x21\xf8\xed\x6c\xeb\xdc\x1d\xba\x07\xf8\xcc\x1d\x43\x14\xc2\x11\xad\xd4\x56\x66\xd0\xb2\xeb\x28\x99\xc6\x3a\xc6\x85\x48\x59\x6e\xb8\x05\x5e\xee\x66\x13\x66\x9a\xe7\xbe\xec\x0b\xe2\x16\xaa\xe4\xda\x66\xa5\xec\x4a\xcb\x61\xe5\xf8\x74\x1c\x12\xfe\xcf\x18\x5d\x64\x8c\x82\xab\xc6\xea\x71\x59\x33\x2c\xd7\xd7\x49\xc5\xe0\x2b\xc1\x55\x8d\x44\xeb\xc8\x1a\x1d\xf5\x39\xbd\x19\x0e\x50\x7f\x68\x3a\x80\xe6\x89\xb7\x14\xca\x21\x2b\x60\x0e\xc1\x18\xd2\xf6\xe9\x26\xa1\xfa\xf5\x24\xc4\x52\xbe\x1c\xea\x31\x57\x39\x69\xb3\x84\xec\x63\x40\x12\x33\x34\x6d\x5c\xea\x49\x8e\xf3\xbe\x97\xef\x4d\xe7\x1a\x0d\x21\xb6\x5a\x18\xd6\x18\x31\xc0\xce\xe2\xd5\x8f\x4b\x83\x09\xbd\x1a\xa8\xc9\x5c\x27\x23\x2c\xc1\x48\xde\x4b\x3d\x60\x69\xb6\x24\xb2\x60\x8e\xd7\x11\xde\x40\xe6\x24\xb9\xda\x53\xf3\xfd\xe4\x8f\xe7\xbf\xd3\x84\xc7\xda\xe1\xa3\x24\xfa\x25\x61\x09\xba\x7a\x26\x3b\x84\x25\x66\x68\x3e\xaa\xc7\x3c\xe7\xe9\x51\xb3\x85\x01\x0a\xef\xa4\x5f\x4c\x0b\x27\x70\xdd\xe6\x26\x61\x79\xc2\xd3\x62\x43\x79\xd4\xdd\x48\xd9\x75\xb1\x21\x17\x92\x24\x15\x1b\x19\xc3\x57\xfd\x2c\xde\xc8\x67\x69\x41\xaf\xd7\x3c\xaf\x4a\x3c\xf5\x1d\x2e\x49\xf2\xbf\xde\x56\x46\xaa\x57\x8e\xa3\x79\x4b\x0e\x93\x1a\xb3\xfc\x33\xee\x38\x43\x05\x56\x88\x69\xd1\x52\x14\xdb\x30\x84\x62\x5a\xe0\x23\x01\xdf\x3f\xd3\xad\xbf\x12\x13\xd3\xa2\x76\x44\xb0\x4b\x88\xea\x76\x9f\xa1\x40\xe4\x60\xd0\x7f\xcb\x0c\x0a\x8d\x50\xcb\x1d\x44\xe5\xff\x37\x88\x7b\x9e\x41\x48\xf9\x91\xfa\x2e\x06\x48\x5f\xdd\x50\xb2\x7f\x73\x06\x55\xe5\x7b\x69\x7f\xba\xac\x00\x68\xb2\xa4\xed\x90\xf5\x3f\x03\xeb\xef\x36\xb0\xc2\x23\xba\xfb\x8e\x28\x47\x24\x31\x5e\xd4\x02\xe3\x4b\xe9\x70\x10\x25\x5d\xd8\xd7\xdc\x6e\x56\x53\x64\x7c\x28\xf7\xc0\xea\x77\x9b\xc4\xb4\xa0\x6d\x8c\x10\x8b\xb4\x96\xbc\x8e\x19\x27\xbc\x41\xd9\xa6\x53\xb4\x4d\x4c\xf4\x84\xb0\x83\x2c\x99\x15\xef\xf8\x6b\xc6\x84\xce\xd6\xec\x2d\x11\xf9\xff\x5f\x81\x92\xc9\xcb\x2b\x02\x2d\x53\xad\x7b\xc9\x65\x28\x44\x1a\x8b\xdf\x31\x0b\xcd\x03\xda\x9f\x02\xba\x95\xe6\x71\x31\x82\x7d\x37\x5e\x34\xb8\x2a\x3c\x1a\xd1\xac\x5a\x85\x7b\xcb\xa3\x32\x98\xd6\xd9\xaf\x30\x16\x8e\x54\xda\xe0\x4c\xf3\x68\xe0\xcc\x12\xa5\x9a\x69\xc6\x88\xbe\x88\x92\xc9\x43\xd8\x56\xc8\x89\x85\xa6\x64\xcb\x28\xf6\x0a\x77\x10\xae\x08\x57\x64\x57\xad\x90\x1e\x69\x0d\x19\xc8\xa0\x71\x58\x78\xab\x64\xb0\xc7\x92\xef\xb5\x62\xd6\x65\x8c\x2b\x24\x68\xc2\x9e\x85\xe9\x40\x8a\xce\x1e\x69\xe2\x6c\x3e\x26\xa1\xff\x62\xa0\x06\x39\x39\x67\x37\xe2\xbf\x8e\x3c\x7b\x3c\x78\x4c\x36\x9f\x10\x9e\x7f\x00\x4e\x91\x27\x9b\xe7\xad\x26\xd4\xda\xc2\xf0\xdc\x92\xa2\x5f\xf6\xc8\x16\x34\x72\x25\xd8\x91\x66\x40\xaf\x5a\xf4\x8b\x13\x53\xa5\xcc\x37\x2b\x79\xe8\x7d\x4d\xeb\x1e\xf0\xa5\xe1\x76\x15\x24\x34\x3d\x95\xf7\x48\x9f\x3c\x5d\xf1\x34\x16\x57\xe8\x54\xd9\x38\xd1\x6a\xc8\x91\x87\x39\x9d\x58\x44\x10\x67\xbe\x22\xc9\xf7\x2d\xee\x00\xe4\xac\x38\xe5\x63\x26\x47\x9a\x25\xeb\xe4\xf7\xb7\xbd\xd3\xfd\xb7\xea\xac\x13\xed\xdd\x8a\xb7\xc9\x6c\x32\x72\xbf\xbf\x66\x03\xf7\xe7\x51\xc1\xc6\xf0\x3b\xe5\x63\x5a\x30\xe7\x2b\x58\x9d\x39\xbf\xdf\x8b\x42\x5d\x70\xab\x84\x53\x7d\x43\x19\x9c\x4a\xaa\x77\x86\xea\x9a\x58\x64\x1b\x13\x7c\xf9\x06\x09\xf0\xe2\x0c\xce\x2c\xd9\x00\xcf\x2e\x59\x0e\x06\xed\x2c\x49\xb8\xba\x50\x1e\xb0\x57\x89\xb2\x3d\x18\x20\x19\x63\x5a\x64\xfc\x5a\x27\xa8\x53\x37\xac\x1f\x4d\x6f\x54\x72\xce\x0b\xa6\x7f\xa6\x97\x22\xb9\x64\xef\x9d\x92\xaf\xf9\x60\x30\xcd\xd9\x3b\x65\x4d\xab\x13\xe5\x76\x2e\x02\x0e\xbf\xa7\x13\x93\x58\xd0\xb4\x00\x48\x4c\x79\x93\x08\xa1\x28\x92\xca\x70\xdf\x7e\x7d\x65\xbf\xbe\xb5\x5f\x3f\xe1\xd7\xb7\x74\x9a\xe7\x9c\xa6\xaf\x92\xa9\xa2\xf3\x68\x4c\x87\x8a\xc6\xf7\x2c\xf3\xbe\x7e\x10\xb1\xfe\x29\xb2\xc9\x48\x24\x62\x38\xc3\xdf\xc7\x60\xe0\x85\xdf\x3f\x0a\xee\x51\x76\x32\x61\xd1\x34\xa1\x99\xdf\xac\x93\x89\x70\x81\x4e\x15\xff\x07\xec\x74\x9a\xf5\xa7\x09\x4b\x23\xa6\x6c\x24\x95\xf1\xd2\x40\xe0\xb9\xb6\xfc\xdc\x18\x50\x95\xad\x7f\x6c\x0c\xa0\x13\xfc\x34\x08\xe7\xef\xa5\x4c\xf1\x3e\x7b\x20\x32\xc6\x87\x29\x0e\x5a\x30\x94\x80\xff\xb4\x28\xc2\x97\x4f\x28\x87\xa3\x0b\x96\xa1\xd5\x84\xe6\x8b\x6b\xfc\xf1\x36\xa3\x31\x67\x48\x18\x1a\x0a\xe3\xb7\x1c\xac\x40\xc6\xac\xa0\x72\xd2\x40\xab\x95\x3c\xe7\xe9\x70\xc3\x54\x32\x9e\x28\x19\x74\x3e\x0b\x55\xd7\x44\x24\xb3\xa1\x30\x5f\x75\x8d\xb2\x32\x9a\xb8\x75\xea\x33\x77\xf4\xaa\x8a\x07\xf9\xf8\x51\x88\x09\x7e\xce\x90\xb1\xf9\x25\xb4\x31\xbf\xe2\x45\x04\xd5\xe5\xb3\x71\x5f\xe0\x69\x3f\xbb\x2e\xf4\xa7\x1e\x18\x05\x2f\xb0\x5c\x91\x21\x1f\x8a\x7c\x42\x81\xa0\x69\xae\x4c\x5a\x19\x5c\x4d\x5c\x02\x7f\xce\xad\xe6\x31\x3e\x75\x02\x05\x64\xd2\xdd\xb3\x0f\xed\x3f\xb3\xfa\xf0\xa3\x5e\x9b\xce\xf1\x08\xd2\x6c\x39\x87\x21\xb0\xb0\xd0\x7a\xa7\xe2\xb0\xa4\x45\x7e\xdd\x23\x5b\xde\xa4\x8d\x2f\x6a\xcd\xfe\xcd\xd9\xac\xe5\xee\x61\x9b\x37\x4b\xc3\xe9\xd5\xad\x3d\x88\x3b\x1d\x31\xfb\xe3\x8e\x93\x0b\x55\xd6\x6e\xf8\x2a\x2a\x0e\xf6\x5a\x8e\xdf\xa2\xf2\x9a\xd2\xc9\x34\x27\x4f\xf6\xec\x2e\xf7\x8a\xaa\x93\xf4\x6f\x70\xbe\xc5\x52\x27\x82\x96\x9c\x7f\x21\x41\xf6\x06\x7c\x79\x70\x17\x5b\x2c\xd5\x5d\xec\xe6\xff\xea\x05\x26\x73\x38\x80\xe7\x5d\x48\x6a\xdd\x81\xb4\x03\xee\x4d\xb0\xa1\x3b\x28\x5f\xd8\x83\xdc\xa6\x5c\x3f\xc3\xcf\x36\x99\x64\xec\xf2\xc0\x8e\x80\xf9\x27\xa4\x75\xde\x7e\x9a\x2d\x8b\xb2\x35\x9f\x8f\x73\x50\x58\x52\x82\x35\x86\x76\xf4\xac\x0e\x4b\xef\xd8\x80\x2c\x4c\xe4\x72\x38\x6a\xa9\xbc\x73\xcd\x15\xb8\xa4\x38\x7b\xdc\x87\x45\x57\x3e\xa2\x49\x22\xae\xb4\x1b\xaf\x73\x87\x4c\xb5\xea\xb4\x9d\xa4\x96\xae\xe1\x7a\x4b\x2d\xc2\xe0\x96\x02\xb4\xc6\x1f\x0c\x5c\x99\x9a\x35\xbd\x19\xfd\xd1\x88\xa6\x43\x16\x57\x2e\xea\x4d\xb5\x5a\x67\x24\x14\xa2\xb4\x57\xea\x18\x5d\xc8\x90\xa6\x0b\xc9\x04\xbf\x48\xc5\xae\xc0\xfe\x31\x68\xb6\xc8\x48\x2a\xec\xf5\x66\xe0\x66\xcc\x97\x66\x2f\xab\xe9\x12\xdd\xf6\xa8\xb1\x02\xed\x35\x6c\x6f\x6f\xaf\x02\xac\x2c\x6b\x77\xdf\x17\x18\x6d\x74\xf6\x58\x23\x7b\x7c\xde\x89\x20\x8c\xb2\x5b\x25\x1e\x7b\x2f\x87\xc7\xa3\xf4\xae\x2d\x0b\x14\x59\xec\x1c\xe9\x2e\x92\xcd\xd1\x91\xc2\xb9\x57\x5e\xf9\x5b\x4e\x85\x90\xdd\x00\xb2\x42\x03\xdd\x97\x44\x91\x26\x33\x9f\xc2\x79\x46\x8b\x73\x70\xf8\x0c\x35\x3d\x5d\xe5\x30\x1f\x1a\xe4\x79\xca\xc7\xeb\x26\x45\x04\x1c\x1a\x59\x82\xcc\x69\x11\x9e\xe8\xa9\x5a\x88\x2f\x6c\x00\x64\x26\xa1\x25\xaf\xa2\x1c\x2d\x36\xf7\x64\x72\x2e\x92\xb2\x1a\x53\x1b\xd3\xda\x01\xe6\xce\x15\x6e\x6c\xa8\x50\x1a\xed\x5d\x8e\xab\xaf\x17\x9d\x85\x4a\xd7\x67\x0e\xde\xd0\x3b\xbf\xbf\xcd\xf4\x7c\x04\xba\x2a\xc3\xcb\x70\x96\x07\x98\xfe\x9e\x4e\xec\x7a\x84\xf9\x8b\x11\x7d\x6f\x1a\x89\x2c\xb6\x51\xbb\xee\x2b\x77\x77\x5e\xbc\x79\xc7\x6b\xc1\xfd\x5b\xc5\x52\xd5\xb2\x88\x79\x2b\x07\xef\x2a\xdb\xb2\xde\xa0\x32\xed\x0d\xef\x17\x9d\x05\xe8\x79\x10\x14\xc2\x33\x32\xa9\x2f\xb6\xeb\x94\xe9\x99\x7a\xbe\xb7\xc5\x4d\x98\x34\x59\xbd\x83\xf5\xdc\x0d\xcb\x39\x32\x67\xa8\x95\x38\x3a\x2a\xdf\x2d\x22\xd2\x88\xd5\xc2\xcb\x4c\x1b\x97\x53\xf2\x02\xc0\xe5\xd4\x8f\x7d\xea\x51\x02\x07\x27\x12\xc0\x15\x6e\x7b\x6f\x2e\x65\x42\x11\xa0\x7b\xcd\x29\x6d\x0f\xe2\x4c\xd1\x07\x8c\x70\x55\x63\xcb\x0f\xc1\xe6\x0a\xa7\xfe\x2e\x95\x77\x1a\xd1\xa2\x59\xe1\xb5\xca\x60\x71\x82\xa1\x95\x23\xd9\xf9\x32\xa4\xcb\xb8\xf1\xd3\x9c\x91\x5e\x66\x9a\x1f\x86\xe3\xb6\x66\xd9\xca\x4a\x6b\xd6\x0a\xdf\x9a\xc1\xd9\x79\x98\xdd\x74\xee\xfc\x0b\x04\x87\xbe\x64\x20\x82\x66\xc2\xd2\x4b\xf9\x1a\xd3\xc1\x33\x99\x7f\x1e\x4c\x50\x73\x61\xc3\xc5\x16\x1e\x4b\xeb\x76\x04\x7e\x3a\xdd\x36\x04\x59\x5a\x6a\xca\xbb\x20\x63\x98\xb1\x01\x91\xa6\x57\xa9\x5f\x60\x37\x51\xa1\x5f\x70\xff\x23\x27\x6b\xef\xea\x9f\x58\x5a\xa0\xc8\x02\x76\x31\x81\x6b\xf5\xe7\x2b\x8c\xed\x30\x27\x64\x99\xc5\xad\x62\xb2\xb5\xc8\x57\xb5\xf6\x3d\x10\x93\x59\x06\xc7\x95\xdb\x5b\xdd\xe7\x1b\xdb\x5b\xdd\x17\x6d\xf2\x86\x46\xac\x2f\xc4\x45\x9b\x1c\xa5\x11\xd8\xe1\xc8\x8d\x2d\x80\xe5\xb2\x35\x2c\xbb\x64\xb1\x4c\x97\x59\xa7\x23\x9e\x93\x5c\x4c\xb3\x88\x91\x48\xc4\x8c\xf0\x9c\x24\x3c\x02\xaf\x17\x04\x5e\xdf\xc0\x96\xf8\xd5\xc9\xeb\x0d\x38\xd0\xd0\x99\x64\x20\xa6\x29\x44\x4a\x2d\x46\x4c\x22\x7a\x77\x74\x70\xf8\xe1\xe4\x50\x6e\x85\x99\x4a\x26\x99\x10\x85\x72\x02\x25\xb2\x19\xc6\x40\xb5\xd5\x15\x19\x63\x1d\xb2\x9f\x12\x1a\xc7\x5c\xb6\x8f\x26\x64\x98\x51\xdc\xa4\x8b\x01\x99\xd0\x82\xa5\x85\x26\x5c\x19\x11\xb9\xd5\x92\x8f\xfb\xa7\x87\x1f\x4e\x4f\xbc\x3a\x73\xa9\xbf\x4d\x9d\x68\x54\xb4\x66\x8e\x18\x4e\xf8\x98\x27\x72\x50\x09\xc2\xd3\x4b\xf4\x85\x41\xfa\xd3\x02\x23\xb6\x26\x62\x98\x13\x4a\x54\x4c\x54\x29\x3c\x10\x9a\x54\xa4\x48\x9f\x8e\x49\x3a\x66\x45\xc7\xf0\x4e\xd1\x05\xae\x8b\x0b\x21\x51\x10\x9e\xe7\x53\x96\x63\x60\x9f\x4b\x96\x88\x09\x9c\xc9\xb0\xf4\x92\x67\x22\x45\xb5\xc6\x53\x12\x65\x1c\xbc\x41\x48\x4c\x13\x5a\x8c\xf2\x0e\xf9\xc4\xc6\xe2\x52\x1b\x11\x25\x62\x38\x94\xdf\xa1\x57\xe4\x9a\xcd\xc6\xdd\xf3\x71\x5d\xf1\x24\x21\x17\x8c\x4d\x74\x57\x00\x0b\x12\x31\xe4\x11\xdc\x31\x60\xcc\x59\xcb\x1c\x40\x88\x35\x22\x77\xc0\x28\x49\xb5\x79\xcf\xf3\xd0\x2b\x65\xfe\x9e\xc1\x00\x2b\x10\x19\x06\xb6\x09\x9e\x15\xb6\x09\xcd\x86\xb9\xbb\xd2\x4c\xc0\xa0\x89\x66\xc3\x29\x2a\x68\xe5\x32\x10\xf2\x25\x2c\xde\x5a\x2a\x27\x83\x12\xf8\x57\xb2\x4d\x5e\x42\xb1\x0d\xb2\x4d\x76\xc8\x96\x52\xe3\x66\x71\x7b\xc1\x66\x64\x8f\x6c\xef\xc2\x97\x5f\x24\x24\x7c\x75\x43\x41\x49\xc4\x67\x32\x7b\x83\x6c\x9f\xbb\xd5\x3b\xd1\x55\x6f\x8d\x1a\x41\xd2\x41\x8f\x98\xc3\x7a\x8b\xcb\xc6\xde\xc0\xb8\x1b\x66\x22\x69\x7c\x56\x1c\xa9\x62\x43\xa7\xd3\x01\x4e\x7c\x26\x4a\x37\xb8\xe2\xd7\x20\x4f\x2d\x96\x31\xcb\x73\x3a\x64\x86\xc6\x86\xca\xf2\xa3\x25\x5a\x3a\x15\x07\xc9\x2f\xa4\x0b\xd7\x24\xcd\xcd\xff\x77\x96\xff\xe7\x1f\xe7\x4f\xbe\xdf\x6c\x75\xe4\x56\x57\xc1\xb5\x16\x69\x82\xdc\xeb\x6a\xaa\x14\x1b\xf2\x91\x98\x26\x31\x98\xf5\xf5\x13\x0c\xc4\x9a\xf2\x3f\xa7\x2c\x99\x11\xb4\x91\x1e\xcc\x70\xb0\x7b\xad\x50\x48\x3a\xe4\x63\xc2\x68\xce\xda\x10\xbd\x95\x62\xa4\x58\x1d\xa0\x8a\x5f\x32\x5d\x49\x31\xa2\x29\xc6\xe3\xc5\x84\xda\x36\x3f\x32\xbc\xf5\xd7\x74\x34\x1b\xea\xa9\x6a\xcb\x5d\xb7\x69\x6e\xee\x91\xc6\x1f\x54\x39\x32\x71\x09\x55\x3c\xcc\x18\x9c\xff\x37\x37\xff\x25\xdf\x1c\xfa\xbe\xab\x9d\x55\x85\xf1\x5d\x39\xcc\xcf\x74\x85\x4f\x9f\x3a\xd1\x79\x6f\x5b\x6e\xdc\x2f\x75\xf9\x13\x89\x34\x17\x09\x0b\x6f\x7f\x5c\xd4\x0a\xa4\xc3\xa0\x3b\x14\xcd\x2d\x7f\xfd\x41\x88\x9c\xdc\x6c\x99\xcd\x4d\x54\x4b\x50\x86\x5c\xd1\x1c\xbb\x35\xc5\xd8\x76\x91\x48\x2f\x59\xca\x99\x5c\x1a\xe6\x42\xf2\xb7\x20\x33\x15\xb3\x1a\x03\xe9\x4a\xf5\x5c\xd0\xe8\xc2\x45\x58\x08\x30\xa3\x44\x65\x48\x93\x24\xe7\x70\xb1\x4a\x0b\x12\x51\xd4\x7b\xb2\x98\x16\x10\x80\xce\x98\x8d\xb5\x1b\xca\x55\xa9\x21\x24\xa2\x45\x34\x6a\xca\x49\xdb\x59\x54\xed\xae\xdd\x56\xc4\x38\x54\xb5\xc0\x5c\xbc\xea\x20\x9f\xdd\x17\x7f\x5d\xac\x14\x3e\x1e\x4f\x21\xc4\x4c\xe0\x45\xdd\xe0\x3e\x7b\xdc\x7f\x7c\x0e\x31\xe4\xed\x91\xd9\xb2\x98\x28\x60\x9a\x98\x03\x39\xf5\x48\x57\x64\xbb\xd6\x15\xac\x5b\x4f\x93\xb6\x49\x1f\x25\x71\xf3\x49\x60\x90\x50\x69\x86\x20\xf9\x16\xe8\x5e\x9e\x12\xba\x80\x1d\x02\x55\x81\xe5\xd7\xd7\x49\xf3\x51\x0d\x4c\x5f\xc1\xdc\xdc\x10\x8a\x51\x36\xe5\xa0\xe9\x63\x5c\xed\xbb\x37\xd1\x0e\x61\x3d\x45\x59\x7f\x01\xca\xfa\x18\x9a\x1d\x8f\x4f\xeb\xa9\x07\x98\x45\x88\xf0\x37\xf2\x6b\x2e\xe7\xa5\x2a\x35\x77\x97\xbf\x4d\x62\x5a\x30\x6d\xa0\x91\x17\xb4\x60\xfe\xf5\xb1\xd7\x53\x0a\x0c\x62\x54\xab\xbb\x7e\xb9\xb7\xf3\x60\x00\x87\x82\x41\x7c\x3e\x01\x15\x82\xd1\x8c\x6c\x2c\xf5\xaf\x77\xdb\xa5\xc0\x49\xe9\x46\xc6\x68\x9e\xf3\x61\x0a\xbe\x48\x75\xc8\x6d\x13\xa0\xa9\x53\xd9\x4e\x90\xf0\x8a\x74\xa0\xd0\x1f\x9d\x3f\x3c\x68\xb9\x2d\xbb\xbf\x4f\x73\xf6\x96\x15\xa7\x74\x58\xe3\x23\xf9\xc5\xb3\x16\xee\xb8\xb5\x41\xcf\x3c\xaf\xf2\x92\x16\xf2\x19\xe1\xfe\x57\x21\xf0\xaa\xe4\xb3\xde\x55\x64\x3a\xe6\x5d\xde\xd1\x47\xbd\x34\x9f\xa5\x11\x56\xde\x38\xc3\x27\xb4\x64\x5f\xa6\x69\x1b\x9a\xf3\x06\xd6\x2e\x5b\x17\xc0\x85\x20\x43\x96\x06\x10\x6f\x59\xca\xa0\xef\x42\xd0\x49\x26\xae\x67\x01\xf0\x47\x99\x76\xde\xb0\x77\x6f\x07\x23\x16\x5d\xe4\x72\x3c\x7c\x86\x60\x59\x9f\xe5\x62\x17\x2c\xf4\xf1\x29\x0f\x4c\x1f\x9f\x35\xea\xcf\x04\xf1\xe8\x5d\xc4\xbf\x62\x38\x46\xf8\x3a\x66\xe3\x3e\xcb\x8e\x07\xa4\x87\x39\x5c\x4e\x36\x5b\x9d\x6e\x67\x0b\x7e\x47\xb4\x60\x43\xb9\x1b\x78\x47\xe1\xc9\x8a\x3e\x66\xff\xfa\xe4\x16\xc3\x74\xc1\xc9\x3a\x7e\x2b\x04\x89\x24\x5d\x1d\xe7\x6c\x3d\x27\x5f\xfb\xfa\x70\xfd\x93\x4a\xf9\x2c\x07\xd5\xe7\x80\x78\x37\xa0\x19\x9c\x04\x7c\x86\x41\xf9\x19\x91\xb1\x6b\x3a\x9e\x24\x4c\xd1\xdf\xeb\x58\x43\xa6\x66\x4f\xce\x4c\x4f\xa4\xc8\xef\xfd\xaa\xa2\x7c\x95\x81\x36\x69\x3f\xda\x74\x01\x01\x39\xac\xa7\x9d\xf3\x7b\x03\x1e\x04\x37\x7e\xa4\xe5\x4b\x65\xcc\x3b\xed\x86\x19\x1d\x36\x18\x72\x53\x54\x96\x37\x7a\x29\x78\x9c\xeb\x4d\xc7\x15\x2f\x46\x18\x0f\x1f\xd7\x19\x9f\x89\xd4\x57\x52\x2c\x10\x15\x4f\xc9\x09\x1d\xd0\x8c\x93\x9f\xc9\xd5\x88\x47\x23\xa2\xd9\xda\xc0\x2e\x6d\x80\xb6\x94\x85\x63\x7c\xe7\x90\xc3\x26\x02\x1e\x76\xb8\xc1\xd5\xe4\xe6\x01\xcf\x27\x40\xb2\xec\xd0\x52\x4d\xda\x75\x54\x9e\x84\xd8\x33\x52\x7d\x73\xa3\x53\x94\x10\xdb\x04\x33\x42\x6c\x92\x96\xde\xea\xe5\x80\x65\xf1\xee\x5a\xa8\x2f\xe6\xc6\xec\xfe\xaf\x11\xf9\xac\x2e\x40\xd5\x98\x16\xa3\x13\x3e\x4c\xff\xb2\xa8\x3c\x3c\xff\xc8\xb2\x88\xa5\xab\x8f\x3a\x54\x17\x6d\x49\xdb\x5f\xfd\x65\xc1\xa5\xa0\xc2\xe3\xec\xa4\x58\x7d\x95\x75\x11\xbf\x70\x4b\x74\xb4\xfa\x30\x52\x75\x41\xdc\x86\xac\x50\xfd\xf8\x3b\x44\x21\xff\xab\x22\xe5\x0d\x59\xb1\x9f\xce\xd4\xd1\xfd\xf1\x00\x75\xd4\xca\x6b\xaf\x8b\x13\x38\xa2\xf9\xeb\xe9\x24\xe1\x72\x6a\xf9\xcb\x62\xf4\x71\xe3\x0b\x9e\xd5\x08\xf2\x12\x71\x85\xbe\x4d\x50\x93\x72\x05\xfa\xfc\xfd\x61\xa1\x8b\x1e\x14\xd4\xc4\x31\x32\xf9\x40\x3f\xd4\xb6\xf9\xc7\xee\x92\xe1\x3f\x42\xfc\x0f\x68\x72\x88\xea\xc1\x11\x85\x50\x60\xe6\x44\x6b\x5a\x32\x72\x4f\x45\x15\x0f\x68\x76\x05\xb6\x07\x07\x14\xfa\x56\x71\xaa\x2a\xaa\x78\x40\xcb\x2b\xb0\x99\xd8\x29\x70\x7c\xa4\xa6\x67\xf7\x06\x44\xa7\x85\x4b\x3d\x5c\xc9\x56\x19\x15\x6c\xb9\x16\x05\x08\xf6\x6b\x09\xa8\x1b\x5e\xc9\x6c\x74\x5d\x63\x28\xa5\xed\x7d\xab\x11\x95\xe8\x52\xa2\x0a\x2f\xc5\xc0\x66\x4b\x63\x5a\x5f\xc7\x85\xb9\xb1\xf5\x6a\xfc\x4b\x03\xe3\x65\x63\xb2\x3a\x73\xdc\x20\x1e\x8d\xca\xce\xda\x23\x11\xd3\xee\x45\xe1\x1c\xe1\xf6\x28\x9c\x63\xea\x54\xa7\x13\x4c\xf9\x80\x6c\x58\x2d\x94\x08\x87\xd4\x0a\xd2\xc3\x56\x2d\xfa\x94\xaa\x96\xdf\x0e\x35\xf1\x81\x98\xca\x09\x07\x0f\x32\x65\x92\x5e\x5b\xb8\xe4\xe9\xb4\xe6\x24\x63\x03\x7e\x6d\x6f\xdd\xb8\x04\x7b\xfa\xd4\xa0\x71\xef\xb7\x1a\x0d\xf2\x94\xa8\x12\xe0\xbb\xa0\xd1\x22\x4f\x09\x8f\x5d\x1b\xab\xb7\xac\x20\x13\x25\x6a\x28\xa9\x60\x5a\x59\x88\x82\x26\x98\xe0\xee\xe4\x90\x0d\x37\xda\xcf\x83\x2e\xb8\xaf\xbf\x95\x61\x6f\x11\x15\x2c\x5a\xe0\x18\xe5\xb4\x06\xf3\x6f\x08\xad\x38\xa5\xe1\xed\x8e\x11\xdb\xc4\x62\x72\x35\x62\xa9\xa9\x99\xe7\xf6\xc8\x9e\x88\x0c\xae\x7e\x12\xee\x5a\x86\x59\x83\x2d\xf3\x72\x04\xfe\x8e\x06\x24\x67\x85\xdc\x88\xf6\x19\xc6\x82\xc6\x8b\x2d\xdc\xe3\xc3\xcd\x4b\x9f\x99\x32\xb1\x67\x03\xa6\x9b\xa6\x5b\x61\x1f\xc2\x3a\x4b\xb4\xf0\xf9\xab\x93\xd5\x54\xe4\xb7\x1d\xe6\xd8\x2e\xf5\x58\x50\xbe\x3a\x81\x0b\x92\xf5\x75\xe7\x4e\x63\x1b\x8f\xcd\x2c\x23\x5e\xfa\x99\x3b\xa8\x90\xdc\xe7\x27\xd5\x78\x9f\xf9\x78\x9f\xcd\xc3\xfb\x4c\xe2\x55\xdb\x59\xbb\xf7\x55\xe3\x44\xb5\xef\xae\x51\x3b\x7f\xa8\x68\x24\x81\xde\x74\xd9\xe3\xbd\xb7\x52\xfa\x38\x7c\x2a\x6f\xb5\x66\x88\x10\xc6\x8f\xba\x44\x50\x79\x9e\xfe\xd3\x96\x50\x88\xd6\x91\xe3\x27\x78\x2b\xfe\x26\x11\xd4\x60\xed\xe4\x09\x8f\x58\x73\x4b\x5f\x53\xb7\xc8\x26\xe9\x6e\x6d\x95\x9e\xc7\x6b\x74\x4f\x55\x39\xcf\x4c\x0f\xb4\x57\x70\x72\xa0\x0b\x54\xb6\x5b\x4d\x30\xd8\xa7\x5a\x89\x93\x5f\x4b\x72\x55\xd5\x8c\x70\xfe\xb9\xc4\x44\xc7\xb6\xa1\xbc\xf2\x0f\x84\xba\x0c\xa0\x82\xec\x6b\x89\x30\xbf\xea\x9f\xc9\x5d\xb0\x99\xdc\xef\x63\xf1\x8e\xfc\x05\x38\x4c\xff\x41\xfe\xfa\x3a\xc0\xe9\x08\x64\x3e\x4a\xd1\xff\x72\x26\x73\xcf\xb6\xce\xef\xb0\x73\x70\xf7\x13\x6e\x53\xdc\xf4\x26\xd5\x46\xd6\x8b\x9b\xe8\x96\x8d\x5f\x24\x92\xb9\x8f\x8c\xdc\xbb\xd1\x99\x73\x2b\x0a\x26\x90\x34\x1a\x31\x6b\xaa\x55\x65\xd6\x07\xb7\x9e\x8e\x51\x1f\xde\x95\xc9\x72\x67\x34\x9b\x9d\xf1\x73\xc7\x06\xca\x4b\xf6\x6c\x5d\x02\x4b\x9a\xc0\x26\xb2\x6c\xab\x66\x4d\x74\x71\xf2\x0a\x77\x4a\xde\x8c\x1a\x66\x36\xf1\x79\xdc\x7e\x5b\xbd\x93\x7b\x65\xb9\x6c\x14\x87\x02\x69\xa1\xd1\x98\x97\xf8\xaa\xc4\xcf\x39\xee\x2a\x14\x1e\xf2\x94\x14\xe4\x09\xd1\x18\xc8\x86\xce\xd0\x17\x8d\x25\x1b\x64\x83\xb3\x24\xb6\x80\xc1\x79\x90\xea\x1f\x49\xfd\xb4\xc0\x11\x36\x9c\x38\xdd\xe3\x54\x36\x25\x9f\x41\xb0\xfe\x16\x67\xb2\x29\x9e\x29\x2e\x76\x22\x8b\xb7\xfd\x67\xdd\x36\xd9\x6e\x93\x67\xe7\x73\x8e\x65\x11\xd2\xbc\x8d\xeb\x8b\x78\xd6\x89\xac\x7d\x6f\xe9\x90\xd6\x2f\xd7\xa0\xfd\xa8\x71\x37\x58\xaf\x93\x0a\x31\xa9\x3e\xf3\xc5\x25\x23\xc0\xe9\x58\x88\xba\xdc\x6e\xe5\xb1\xa5\xce\x0a\x04\xe4\xe7\x6f\x7f\x66\xb9\xf8\xa9\xc1\x37\x89\x3a\xba\xb5\x82\xa8\xa3\x5b\x0f\x8b\x3a\xda\xfd\x86\x51\x47\xbb\xab\x8a\x3a\xda\x5d\x41\xd4\xd1\xed\x1e\xe8\x8a\x94\x8e\xe7\x34\x74\x7b\x15\xb8\x1f\x74\xcc\xe0\x22\x6a\xe1\xee\xa6\xc7\xae\x0b\x96\xc6\xce\x94\x8f\x57\x8b\x72\x83\xe2\x68\x74\x9a\x0d\x59\x51\x0a\x4a\xda\xd5\xa1\x47\x03\x6b\x22\x1d\x80\x14\x5e\x63\xa1\x0d\x9a\x6b\xf4\xc3\xcf\x77\x4b\x57\xd8\x08\xa6\x03\xa2\x2a\x52\xec\x95\x66\xd5\x9d\x30\x16\xc1\x2b\x6b\x59\x10\x89\xc4\x7b\xeb\x3d\x85\x10\x0d\x8c\xc8\x2d\xfc\x33\xb7\x24\x12\x6e\x57\x4e\x1c\x4e\x80\x56\xd4\xe9\x7f\xa0\x6f\x28\x55\x11\x67\xb0\xf8\x81\x2a\x72\xdd\x20\x2c\x8e\xcb\x81\xc0\x27\x00\x2e\xaf\xcc\x32\xc9\xac\x5e\xb9\x7e\xa0\x15\x89\xb4\xe0\xe9\x94\xed\xba\xef\xb5\xef\x68\x26\x10\xc0\x5b\x6e\x61\xd5\x52\x78\xcb\x2f\x57\x5b\x5e\x68\x57\xd3\x3c\x33\xb9\xfd\xeb\x80\x27\xe0\x7c\xf2\x92\xb3\x2b\xf2\x8e\xce\x58\xa6\xad\xf5\xd6\xb4\xab\x90\x53\xe5\x26\x0a\x5d\x60\xd2\x3c\xff\x40\xc7\x73\xdd\x7f\x56\x8f\x3f\x3f\xb4\xa5\x9a\x18\x96\x42\xb3\x90\x0f\xea\xda\xd2\x30\xf9\x1d\x0f\x16\x1e\xf6\xae\x9b\x5e\x11\xb3\xb9\x0f\x41\xe6\x96\x3c\x6f\xad\x79\x72\x05\xdc\x6e\x3a\xce\x01\x8c\xb3\x3a\x74\x2d\x86\x2f\xf9\x8d\x95\xad\x5e\x22\xea\x1e\xb0\x10\x3a\x45\x83\xc0\x3d\x21\x38\x78\xa9\x93\x5c\x65\xb1\x70\xd6\xd0\xd8\xf1\x65\xb8\xc2\xd3\x38\xc7\x35\x3d\x2c\x7c\x25\x91\x07\xe0\x25\x6e\xde\x43\x9f\x6a\x4d\xd4\x6c\x35\x1b\x19\x03\xbf\x0d\xf9\x06\x60\x6a\xb4\x6d\x03\x3c\x0b\xdf\x7b\x4c\x56\x1d\xea\x3f\xbc\x47\x23\xb9\xc6\x50\x5d\xb5\x6b\xb5\xd5\xfc\xea\x4a\xab\xd3\x8e\xdb\xb6\xe2\x90\xb2\x33\xb0\x8f\xc7\x08\x1a\x65\x40\xc7\x74\x5c\xd1\x37\xdf\xd1\xe6\x49\xeb\x69\xad\x70\xd5\xfd\xc6\x7c\xd3\x9f\x26\xa0\x6d\x85\xeb\xd1\xed\xad\x15\x5a\x30\x6b\x13\x8b\x3e\x4b\x3e\x26\xd3\x21\x4f\xdf\x24\xe2\x0a\x0c\xdb\x3f\xea\x16\x80\x84\x4a\x01\xed\xc1\x03\x7d\x30\xd8\x7b\x3d\xc5\x70\x01\xb5\xd3\xb0\x3f\xe4\x2a\x21\xac\x6b\xf7\xca\x6c\x08\xdf\xd3\xfc\x0a\x91\x59\x95\x57\xe4\x39\x68\x3a\x3c\xff\x84\xa9\x31\x04\x73\xbd\xc6\x68\x1c\x8b\x95\x58\xbb\x6d\x81\x00\x2f\xc5\x8a\x03\x9a\x24\x7d\x1a\x5d\xd4\xb3\x42\xf6\xd1\xd2\xd8\xa5\x00\x1a\x65\x4a\x27\x13\x46\xeb\x59\xe1\x84\xbb\x06\xc0\xfd\xa8\xe0\xe8\x77\xf9\x0e\xf0\xf9\x1c\x0e\xe0\x16\xc7\x3a\xaf\x13\x7c\xb0\x85\x70\x96\xb7\x66\xdb\xdd\x07\x5b\x17\x0d\x13\xd1\x87\x07\x9c\xd5\x77\x77\x3f\xab\xa5\x4d\x24\x32\x56\x7b\xfd\xb1\xa5\x80\x46\x3c\xae\x03\x7a\xd6\x7d\xae\x80\x32\x86\x47\x6e\x35\x80\x3f\xfc\xf4\x93\xae\xb2\xb8\xae\x83\xf9\xb9\xab\x60\x3e\x7e\x3a\x3e\x3d\x3e\xfd\x8f\x8f\x87\x04\xad\xba\x71\xea\x6f\x28\x69\xfb\x5e\xa9\x99\x3d\x77\xf5\x05\xde\x3f\x53\x78\x11\x64\xd6\x49\x4a\x75\x1f\x9d\xf4\xde\x1c\x7f\x3a\x38\x7c\xad\x3c\x47\x92\x75\x8d\xa2\xf3\x66\xd7\xc2\xbc\x7d\x77\xfc\x6a\xff\x5d\x19\xe6\xad\x03\x73\x72\xba\x7f\x7a\x74\x50\x86\x39\x71\x60\x80\xf8\x32\xc8\x47\x07\xe4\xd5\xd1\x87\x0a\x62\x5e\x19\x0f\x9a\x7a\xf9\x64\xa9\x7a\xa9\x7b\x74\xc7\x21\x43\x27\x9e\xa5\xfa\x1d\x55\xd3\x4b\x90\xeb\xaf\x16\xd9\x09\x52\x6f\x6e\x64\xf2\x99\xe1\xb1\x79\x6f\x67\xb7\x84\x6e\xbd\x20\x22\x3b\xf0\xe1\xd4\xe3\xfc\x84\x5a\x1c\x1c\x1f\x65\x7f\x91\x3d\x8d\xce\xa9\x08\x4a\x56\x24\x7b\x18\x2e\xd8\xac\x4d\xc4\x55\xda\x26\x62\x5a\x80\xb4\xef\xaa\x23\x17\x43\x55\xcb\xae\x98\x25\x09\xbb\xfa\xc0\x29\x5c\x27\xaf\x29\x9b\x61\xb9\x2a\xa4\x3c\x85\x97\x0e\x29\x95\x43\x12\x7d\x7b\x5d\x49\x45\xff\xc8\x8a\xc7\xfa\xba\x66\xbd\xf9\x66\x4d\x3c\xcd\x99\xf2\xae\x46\xab\xc4\x10\x31\x12\x91\x91\x89\x54\x6a\x31\xe2\x06\xbf\x52\x4d\x59\xc5\x4b\x8d\x74\x47\x53\xe6\x98\xf4\x6f\x6e\x92\x3e\x98\x33\xf3\xb1\x5c\xaa\x14\x42\xf7\xb3\x6c\x90\x5c\xdb\x92\x41\x26\xc6\xba\x2a\xd9\x10\x76\x8d\xa6\xe7\xec\x7a\x82\x3d\x05\xc2\xb4\xbe\x4e\xb0\xae\xa8\xb8\x6e\x02\xe3\x10\x4f\x0b\x05\x06\x65\x52\xb9\x0b\x15\x03\x24\x6f\x8f\x34\xf4\x00\x6a\xa8\x92\xda\x80\x09\x96\xd5\xd0\x03\x12\x01\x38\xb4\x32\x8d\x96\x8b\x0a\x85\xdd\x9c\xe3\xe9\xcd\x8f\xd6\x02\x2a\xa1\xad\x7a\x53\xd2\x13\x08\xfb\x6f\xad\x80\x8f\xf6\x89\x94\x12\x10\xc5\x79\x24\x42\xea\x20\x6b\x43\x0d\x58\xd9\xf5\xc4\x71\x42\xec\x36\x52\x0b\xa1\x8f\xc2\x4f\xdd\xd3\xad\xba\x95\xfa\x17\x9b\xd3\x51\xea\x50\x7e\xec\xae\x6d\x6e\x22\xcd\x7d\x5e\x8c\xe9\x64\xcd\xa8\x0c\xdc\xd4\x01\xe5\x03\x91\x45\x2c\x36\x59\x6f\xf1\x91\x07\x64\x29\x06\x19\x05\x41\xf6\xc8\x73\x95\xa5\xce\xc2\x8c\x62\x20\x7b\xe4\x27\x95\x05\xba\xce\xe4\xbc\x92\x55\xfd\xb0\x6b\xa4\xc4\x64\xfc\x41\xf6\xc8\xb3\x6d\xcc\xb8\xca\x1c\xe2\x7e\x23\x7b\xe4\x87\xe7\x98\x91\xd3\x01\x33\x19\x9f\x24\xaa\xed\x9f\x76\x65\x46\xc6\x68\x82\x35\x91\x31\x2b\x46\x22\x06\x61\xfb\x9c\xf0\x7e\x46\xb3\xd9\xe7\xf2\x09\x91\x42\x52\x3a\x21\xda\xde\xfe\xaf\x6f\xd5\x76\x55\x6f\x25\x04\x57\x0a\xaf\x66\xaf\x69\x41\xff\x37\x9b\xad\xdc\x58\x27\xad\xaf\xf9\xb5\x18\x53\x9e\x1e\x0f\x64\xd5\xaf\x66\xdf\xa2\xf2\x3a\xa3\xac\x88\x26\xd1\x34\xa1\x05\xc3\xa5\xc9\x29\x8f\x2e\xe0\x8d\xc8\xca\x09\xc8\xea\x5b\xff\x9e\xf2\x14\xdc\x65\x1d\x0f\xde\x66\x74\x32\xe2\xd1\x51\xc1\xc6\x2b\xa7\xe0\xcf\x7a\x0a\xde\xb1\x21\x4b\x63\xb9\x42\xcd\xff\x32\xfb\xbb\x21\x2b\x5e\xd1\xec\x84\xff\x83\xbd\xe3\xf9\xea\xed\xd1\xea\xac\x37\xb1\xda\x8f\x02\xd7\xdd\x7f\x99\x11\x9e\x5c\xa9\xa7\x31\xfa\x03\x3b\x1e\x20\xbf\x4d\xe5\xd3\x14\x5e\xea\x04\x34\x38\xe3\x02\xde\xe6\xbc\xa2\x59\x8e\xfa\x65\x65\xd4\xce\x6a\xa8\x85\xbb\x51\x53\xe9\xf1\x60\xff\x9a\xaf\x5e\x30\xc4\xdd\xfa\x40\x8e\x83\xfc\x0f\x5e\x8c\x4e\xe8\x98\x7d\x13\x22\xae\x6b\x0d\x52\x0f\xf0\xde\x85\xd3\xe4\x9b\x54\x3c\xae\x6f\xfd\x81\xc0\x20\x25\x05\xcb\xa5\x46\xe0\xab\x37\x51\x9d\xd6\x57\x2e\x35\xe0\xb7\xea\xf1\x3a\x73\xcd\x48\x8c\xfb\x3c\x65\xae\x7f\xd1\xd5\x57\xfe\x8f\x79\xb2\x7e\x12\xd1\x64\xf5\xe6\xa9\x75\x36\xb1\x70\x47\xa7\x65\xfc\xdb\x54\x5d\x67\xd9\x3d\xe0\x69\xac\x95\xdf\xf1\xe0\x15\x5d\xbd\xbd\xf5\xab\x9a\x9a\x8b\x6c\x9a\x46\xb4\x90\x0b\x0c\x68\xf9\x1d\xda\x0f\x63\xe3\x82\x21\x1f\xea\xbc\x5a\x25\x79\x52\xd0\xe8\x82\xc5\x72\xed\xb0\x62\xf5\x98\xd7\x0f\x13\xa8\xf4\x6d\x26\xa6\x93\xfc\xd5\x4c\x0e\x96\xa3\xbb\xd4\xb9\x59\x69\xe8\x8e\x87\x91\xb6\x62\x8a\x2f\xef\x1c\xd8\xdf\x46\xdc\x92\x39\xda\x0c\x7c\x92\x6a\x8d\x76\x3c\x78\xc7\xd3\xd5\xd7\x7f\xb1\x78\xfd\xdf\x42\xe6\xbf\xcc\x5b\x6c\xe4\x0c\x16\xd6\xdf\xa6\xe6\xba\x07\x15\x31\x2b\x58\x54\x7c\xd2\xef\xdc\xb4\xaf\xbe\x60\xe8\xad\x8a\x8a\xe2\x8e\x81\x82\xa3\x13\xe7\xf3\x95\x57\x3e\xb9\x7b\x1d\xe1\x8c\xd6\x3b\x46\xe9\xfb\xa3\x0f\xbd\xdf\xf7\xdf\xfd\x76\xd8\xfb\x74\xf8\x76\xae\xe6\x79\xbf\xff\x7f\x4b\x90\xab\x6a\xd2\xfe\xdc\xb9\x4a\x87\xf0\xfa\x46\x9d\x79\x50\x53\xb9\x36\x52\xb3\x83\xe9\x28\xfd\x44\xd3\xe1\xea\x47\x73\xdd\x43\x28\x18\x4e\x69\x2c\xf7\x0c\x35\x2b\x94\x7b\xbf\xba\xc8\x45\x56\xbc\xaa\x7f\xd5\xf1\xec\xc5\x92\x37\xf0\xa5\x0a\x56\xf1\xaa\x43\xe3\x7a\xf0\xa3\x8b\x6f\x65\xe9\x3f\xc7\x39\xe9\xc3\x9e\x76\x38\x96\xfe\x0f\x79\x7a\x31\xa6\xd7\xb5\x8d\xfe\xe9\xc5\x8f\xab\xc0\xbe\x8a\x37\x1d\x80\xe8\x81\x6f\x2d\xc6\x3c\x9d\x23\xd5\x0f\x7d\xc9\x01\xd8\x57\xf1\x88\x03\x10\x2d\x47\x4c\xd9\x73\xd9\x8a\x9f\x66\xd5\xbb\x46\x5b\xa2\xc5\x65\x64\xcb\x11\xf5\xa2\x2a\xba\x43\x5d\xc3\x97\x7c\xaa\x54\x59\xc7\x03\xda\x5e\x89\x6f\x39\xd2\x7e\xd0\xa8\x86\xac\xde\xfa\xed\xd9\xf3\x25\x7b\xdc\xc7\xfe\x80\x16\xfb\x88\x96\x23\xe6\xc7\xc0\xf7\x6f\xed\x95\xe3\x6a\xd0\x3f\xa0\xb5\x21\xaa\xe5\x08\xfa\xa9\xa7\x4d\x42\x7a\xb9\xdc\xa4\xcc\xd1\xd4\x4b\x76\x6f\xb9\x86\x07\x34\xba\x8c\x6c\x39\xa2\x7e\xee\xc5\xcf\xee\x68\xf0\xb3\x65\x1b\xdc\xdd\x02\xe4\x23\x3a\xa9\x47\xde\xfd\xf9\xe7\x25\x91\x77\xbd\xd8\x1d\x75\xe8\x97\x9c\x55\xbb\xdb\xbd\x5e\x44\xb3\x82\xe5\x9c\xa6\x3d\xb3\x91\x79\x2d\xe6\x0c\xfb\x9f\x97\x1c\x0a\xdd\x67\x95\x75\xc9\x9d\xea\x9c\xca\x96\x5c\x19\x76\x9f\x57\x56\xb6\x9f\x31\x3a\xa7\xb2\x67\x4b\x56\xf6\xc2\xad\x4c\x9f\xe8\xd6\x77\xd6\xd6\xb2\xb2\xf0\x43\xaf\x67\xdc\xca\xf4\xf0\x78\x7b\x8e\xc4\x2d\x2b\x13\x3f\xf6\x7a\x60\x4b\x73\x87\xc8\x3d\x33\x0f\x42\x95\xe1\xd3\xff\x58\xac\x2a\x8b\x55\xbc\x8d\xd6\x35\x18\x43\xd5\x36\xd1\x2f\x26\xb5\x21\xaa\x63\x9a\xaa\xc8\xac\x2d\xfa\x15\x0b\xef\xe0\x47\x9b\xb0\x74\x3a\x66\x19\xed\x27\x6c\x47\xbd\xca\x8b\x44\x3a\xe0\xc3\xa9\x97\x76\x95\xf1\xc2\xfe\x96\xfb\x38\xf3\x94\x45\xbf\x06\x92\x0d\xbc\x54\xae\x12\x9c\x87\x42\x60\xa6\x6a\x9b\x54\xf6\x37\x4b\xb3\x4c\xb7\xc4\x33\xf6\x87\x8c\x52\xf7\x6e\xb5\x09\xcd\xb2\x6d\xfd\x32\x40\x02\xe9\x37\x4a\xba\xe3\xb3\xb0\xcb\x65\x01\x34\xa5\xa5\x59\xe6\x9b\xd2\xca\x2c\xa7\x29\x2a\x15\xe9\x18\x64\x62\x0c\x44\x40\x5f\xad\xb9\x7f\xea\xb9\x96\x7f\x05\x1b\x3c\xd5\xf2\x33\xb1\x07\x62\xfc\xd1\xf6\xde\x96\x2d\x12\x42\xa1\x6e\xfa\x6f\xb6\xf0\xfd\xd7\xdc\x07\xb2\x73\x0a\x2b\x82\x16\x7a\xf2\x67\x07\xc1\xbc\x5d\x60\x37\x08\x11\xc5\x6c\x88\x28\x7c\x03\x0c\xb1\x0a\x6a\xea\xbd\xef\x5a\x0f\x9b\x5f\xc7\xd7\x85\x1d\xf2\xcf\x8f\xc0\x56\xc7\x23\xdb\xb1\xa5\xc8\x0a\x3e\xff\xfc\xc7\xbf\x31\x9c\x03\x11\x31\x00\x0c\xa4\x3f\x93\xe3\xb2\x2a\x10\x0b\x41\x00\x7c\xc4\x3b\x62\xf8\x4b\x79\x51\x66\xc6\x71\x2b\x2c\x6a\xbc\xe2\x26\x28\xbc\x54\x0c\xb6\x38\xbe\x68\x86\x44\x78\x71\x3c\xcc\xc4\x74\xa2\xc9\xa8\x46\x00\x06\x24\x06\x01\xfc\x92\x45\xaf\x79\xee\xc1\x9b\x07\xbf\x18\xbb\xe5\x03\x4f\xc8\x1f\x23\x0c\x25\x81\x11\x1a\x54\x06\x49\xb9\x7a\x88\x9c\x57\x05\x8f\x79\xed\x31\xc6\x0b\x5a\x1f\x1a\x1c\x84\xa1\xeb\xc3\x7c\x15\xe8\x10\x14\x1e\xda\xd6\x19\xd2\xac\x61\xdd\x20\xa1\x45\xc1\x52\xb8\x89\xd8\x83\x3a\x3b\x19\x8b\xa7\x11\x73\xe2\x32\xe3\xeb\xe4\x36\xf1\x22\xc1\xb8\x6f\x5f\xcb\x03\x5d\xf9\x4e\x96\x33\xc0\xc3\x9d\xf6\xfb\x2f\x53\x8d\x7c\x9d\xdd\xed\xc0\xbb\xd5\xae\x52\xb6\x0a\x9f\xe7\xf5\xf3\x5e\x38\xcf\x00\xc3\x39\x4a\x7c\x9b\x9c\x9d\xb7\x7c\x17\xda\x10\xfd\x1f\x6d\x79\x1b\x2e\xbf\x94\xd4\xef\xb9\x5c\xef\x60\xa7\xdc\x47\x9b\x54\x04\x9c\xf3\x83\x58\x9e\xbd\xa7\xc5\xa8\x33\xe6\x69\x87\x4e\x26\xc9\xac\x99\x4e\x93\xa4\xad\x6a\x6f\xb5\x09\xe6\xd2\xeb\xaa\xdc\xf3\xf0\x71\x33\x9c\x9f\x2a\xf1\xb0\xa2\xfd\xb2\xaa\x09\x35\x31\x83\xb4\x9f\xc1\xa5\x74\xb3\x0d\xe9\x03\x66\x90\x4e\xad\xbb\xfe\x23\x62\x43\x67\x10\x54\xbc\x8a\x94\x55\x29\x70\x85\xfb\x25\x8e\x0c\xb2\x43\x1a\x0d\x1d\x6c\x5b\x3f\x56\xad\x33\xd6\x71\x07\x6f\x1d\x4c\x33\x32\xc7\xd6\x6d\x52\xf0\xe8\xc2\x79\x5b\xa1\x5f\x90\xa3\xdb\x73\xfb\xac\x17\xc0\xcc\xc3\x5e\x25\x94\xe8\xe0\xd8\x84\x16\x59\xe4\x65\xaf\x7a\x21\x8b\x8e\x46\x20\x9e\x97\xa1\x85\xfc\xb2\x47\x9a\x50\xcf\x19\x97\xc3\xc5\xa4\x3f\x25\x2a\x95\x3c\x25\x5d\x37\xa7\x45\x36\xc9\xb6\x9c\x9e\x39\xf9\x15\xb1\xa9\x2a\xc9\x06\xe9\x06\xc8\x7f\xbd\x0b\xf7\x46\x15\xee\xd5\x11\x28\x1b\xbc\x42\xca\x5c\xff\xbb\xba\xcf\x0c\x16\xc7\x4f\xbc\xfc\xeb\x67\x8c\x5e\x54\x84\x03\x70\x9f\x4b\x73\xd7\xfd\xb0\x3b\xdb\x2a\x5c\x4e\xf8\x33\x39\xcf\xca\xc9\x11\x74\x0e\x84\x47\x84\x28\xd1\x34\x1a\x91\x21\xda\x6c\x11\x5e\xb0\xb1\x37\x8b\x61\xe0\x00\xbc\x79\xbb\x85\x6c\xb2\x5f\x86\xd6\x73\x96\x99\x23\xed\x1f\x18\x85\xb9\xd3\x56\xb5\xa5\x58\x30\x77\x55\x03\x35\x65\x85\x8e\x87\x0a\x2f\xa0\x86\xcc\x2b\x45\xc9\xdf\x0d\xa3\x02\x38\x5e\x19\x30\x5e\x1e\x69\x7a\x41\xf5\x91\xa9\x11\xcd\x19\x69\xc8\xbd\x73\x63\xc7\x49\x90\xfb\x5b\x2f\xe1\x13\x8d\x69\xa6\x52\x5c\x77\xff\x92\x14\x7c\xbf\x94\x17\x99\xb8\x30\x21\x1d\x9c\x0e\x55\x1a\x6d\x5e\xd9\x01\x47\x1f\x05\x5e\xc9\xdb\x9a\xc8\x01\x8a\xbb\x8e\x15\x5c\xc0\x52\x27\xa7\xd9\xcb\xd8\xa0\xf2\x59\x96\xcc\x28\xbd\xca\x42\x67\xd5\x2c\x56\x3d\x41\x13\x30\x69\xd2\xd0\xd5\xb9\xba\x6c\x02\xb5\xfe\xa1\x63\xbc\xca\x02\x4e\x92\x0f\x65\xe2\xd0\x3a\x60\x98\xe6\xc3\x1d\x88\xb4\x40\x9f\x44\x0e\xa0\x4a\xb4\x6f\xbb\x20\x55\x89\xd6\xdd\xfa\x3d\xd8\x95\x9f\x3d\xe6\xa0\xe0\x07\x3c\x8d\x21\x3a\x84\x8a\xaa\x01\x5a\xde\xc6\x86\xb8\xef\x61\xc2\xd9\x63\x0a\x68\xf5\x89\x1d\xce\xd4\xca\x6d\x82\xa5\xf8\x2e\x5f\x15\x08\xa9\xe6\x60\x2d\xd1\x5a\xb3\x6b\x24\x2a\x76\xf9\xfa\x3a\x09\xd3\x3a\x13\x3a\x4b\x04\x35\xce\xe5\x3d\x74\xf7\x41\x10\xc4\x91\x0b\x7a\x47\xae\x79\xcc\x13\xbc\xca\xba\x9a\x35\x92\x75\x73\x23\x97\x50\xf5\xeb\x4e\xd9\xed\xdb\x10\x5b\xda\xf5\xc5\xce\xb1\xaf\x21\xb3\x23\x7f\xb8\xb1\x6d\x4c\x58\x78\xc8\x85\x5f\xae\xbf\xf6\x94\x8e\x19\xae\xa0\x9d\xf1\xa7\x12\x4d\x18\x1a\xd0\x39\x48\xb9\x1a\xdc\x10\x03\x22\x37\x41\xce\x3b\x90\x0b\xd4\x9b\x42\xde\x50\xd5\x6b\xc9\xf8\x8e\x65\x89\x53\xd0\x75\x04\x2f\xb5\xdb\x4e\xb9\x37\x78\x24\x52\x90\x4e\x39\x5f\xd9\x64\x84\x93\x19\x2e\x23\xd4\x39\x07\x06\x51\x4c\x9d\x87\x95\xa0\xd5\xa4\xca\xd5\x99\x52\xfd\x78\x2c\xc4\x4e\x57\xd9\xd6\xf9\xbc\x99\xa0\xcc\x0a\x5a\xad\x80\x83\x99\xea\x3e\x5d\xef\xf3\x46\x76\xda\xb3\xda\xce\x7e\x36\xb7\xb3\x9f\x95\x3b\xbb\x27\xe1\x4d\x3c\x6a\xcb\x31\x17\x45\x6c\x4e\x2f\x1c\xe8\x8e\xde\x51\x3b\x80\x29\xce\x3e\x2e\x54\xc8\x55\xdb\x11\x01\x60\x75\x0f\xe9\xa7\x59\x0e\xa0\x4c\xb2\xc1\x97\x4a\x92\xc1\x53\xaa\x1e\xa5\x49\x40\x8b\x4b\x91\xbb\x43\x4a\x74\x2f\x20\x49\x0e\xd5\x37\x37\xa4\x91\xff\x39\xa5\x19\x6b\xb4\xd7\x02\x59\xb9\x63\xb2\xb6\xf0\x4a\xf0\x80\x5f\x37\x37\x65\x92\x8c\x78\xd9\x0e\x59\xf3\x24\xec\xb6\x74\xa0\x60\x5f\xc3\xde\xb6\x4b\x8d\x59\x89\x76\xee\x0c\x19\xbc\x30\x56\x31\xd0\x6d\x1d\x6d\x77\x66\x6b\xb5\x55\x67\x98\x36\x58\x59\xb7\xcb\x7f\xed\x72\x45\x2f\xee\x31\x60\x0a\xff\x07\x1e\x1f\x24\x09\x9e\x3d\xe4\xb0\x1a\xcf\xd1\xe2\x88\xf4\xe5\xac\x2e\x79\x5a\x19\x2f\x32\xb7\x26\x41\x70\x16\xc1\x61\x08\x01\x1a\x59\x76\x06\x87\x12\x47\x31\xf8\x57\x06\xd8\x23\xdf\x81\x98\xc6\x73\x5a\x49\x88\xbb\x68\x73\xac\xdc\x83\x65\x85\x93\x03\xe3\xf4\xb9\x5d\x57\xe0\x73\x19\x99\xab\xc6\xe2\xf3\x4e\x1f\xa1\x75\xaf\x43\xe2\xf7\x6e\x33\x34\xa0\x93\xa6\x81\x2b\xc0\xfc\xa2\x81\x93\xb0\xaf\xb7\x64\xa7\x0c\x66\xdd\x84\x39\x89\xc1\x84\xfb\xf5\xd6\x9b\x6e\xcd\xda\x0c\xd3\x61\xbe\x98\x8e\x59\xc6\x23\x34\x9a\x0c\xfd\x46\xb9\x88\x2b\x3c\x27\xb5\xd5\xce\xcc\xc7\x61\x8f\x67\x2b\x36\x5f\x70\x3c\x0f\x41\x6a\x1c\xdc\x67\x3e\x82\x33\x7e\x7e\xde\xf1\x1a\x6a\x4a\x62\xd7\x97\xc8\x1c\xe6\xfa\x98\xc0\x10\xf8\x05\x09\xcc\xdf\x01\x85\xba\xa0\xa1\xed\x0b\xf9\x05\xf2\x76\xc9\x17\x77\x67\x08\x4a\x35\x1f\xe6\xdf\xeb\x02\xdf\x4b\x3c\xf9\x30\x3f\xd3\x09\x67\x5f\xce\xbd\xe8\x74\x5c\xaf\x20\xfd\x52\xa0\xc9\x3d\x3d\x1c\xc9\x5d\x30\x4a\x71\x19\xda\x66\x5a\xe5\x88\x4f\x97\x33\xbd\x44\x05\x84\xe5\xf3\x08\xee\xac\xb2\xc8\x7d\xce\x01\x4a\xeb\xc4\x2f\xa0\x32\xfc\x68\x7e\xb8\x4c\x34\x1b\x92\x96\x75\xe7\xf6\x8a\x66\x0d\x1d\x98\x5a\xcf\x9a\xbb\x6e\x50\x3d\x43\xfa\xfa\xba\x69\x46\xe0\x6e\xcc\x74\x2b\x4b\x06\x6a\x70\x69\xc8\xb3\xad\x73\xa5\xc9\xd5\x40\x73\x42\xe8\xe1\xe1\x43\x81\x1e\x1d\x4b\x05\xce\x2c\x2f\xcf\x83\xb8\x7b\x8f\x50\xfe\xcf\xb0\xf0\x79\x18\x9b\xc6\xcd\x33\xa1\x1e\x55\xdb\xdc\x70\x77\x2e\x1c\xc6\xc7\xfb\x1a\x08\xc4\x8e\x4b\x96\x2b\x04\xd0\xe5\x52\xc3\x58\x08\xe5\xe7\xae\xdb\x72\xe1\x54\xa3\xe7\xf9\xdd\x98\x73\xb2\xa4\xf9\xd9\x32\x6f\x70\x81\xbb\x3b\x86\xd1\xb6\x5d\xad\x8a\x4d\x79\x7d\x44\x37\x09\x53\xa7\xf7\x61\xf7\x2d\xb5\x3c\x55\xf1\x6f\x86\x74\x42\xfa\xac\xb8\x62\x2c\x25\xc5\x95\x90\x79\x39\x22\x30\xea\x5f\xfb\x7d\xec\x2b\x3b\x42\xe2\x29\x70\xc0\xa8\x1d\x6e\x05\x25\x73\xa5\xa9\x6f\x89\xfe\x46\x6a\x95\xbf\x57\x70\x4c\xaf\x95\xa2\xbf\x25\xf6\x3b\x94\x1d\xd3\x6b\x3e\x9e\x8e\x0d\x8e\x3e\xcd\x54\xe1\xd0\x4f\x65\x89\xca\x85\xda\xed\xce\x41\xda\xea\xbf\x3c\x07\xe9\x1c\x98\x83\x5e\xd8\x39\xa8\x4f\xb3\xb7\x74\xa2\xe6\x8b\x17\x1d\xfc\xa9\x65\xa6\x4f\x33\xf5\x42\x66\x16\x00\x39\xc9\x16\x58\x71\xdb\x82\x61\x82\x3b\x99\xbd\xf8\x3e\xb7\xd3\x24\x82\xe9\x04\x33\x8d\x05\x00\x4e\x89\x60\x02\x3b\x3b\x57\x13\x98\x85\xd1\x48\x9c\x3e\xd0\xf5\xd8\xa4\x5d\xdf\xb1\x9f\x2e\xeb\x78\xf7\xd3\x67\x80\xbf\x90\x6e\xcb\xdf\x65\x9a\x29\x8f\x26\xaf\x34\xeb\xee\x7f\x3a\xda\xd7\x4a\xd1\xf3\x44\x0a\x5a\x51\xf5\x80\x61\x67\x5b\xce\x37\x45\xa6\x2e\xa6\xea\xce\x6a\x36\x37\xc9\x95\x7f\x79\xc2\x73\x3d\xdc\x49\xce\x8a\x02\xd7\x3b\xd3\x9c\x65\xaa\x79\xba\xd5\x52\xc3\x69\x40\xc9\xe0\xa7\x15\x19\xee\x34\x3b\xcd\xd9\x9b\x69\x02\x61\xb2\x6d\x88\x1d\xb8\x18\x99\x26\x89\xe5\xb9\x91\x86\x4d\x98\xac\xed\x5c\x3b\x1d\xbb\x2c\xaf\xda\xc2\x06\xf7\x26\xae\xd6\x20\x4f\xd5\xde\x4b\x53\x7c\x73\xa3\x67\x8a\xdb\xb6\x09\x41\x27\xeb\x78\xba\x87\x3d\xb8\x21\x7b\xf0\x89\xd3\x5f\xce\xed\x8a\x84\xfb\xd5\x92\xea\xc4\xc9\x9f\x8e\xc9\x46\x3d\x02\x4d\x95\x23\x02\x5b\x61\xb0\xba\x00\xb7\x9c\xae\x5c\x06\xfd\xea\x86\xe5\xb7\x2c\x75\xc3\x9b\xba\xe0\x4f\xf6\xc8\x56\xe7\xe7\x5d\x87\x3c\x3c\x73\x7d\xe2\x42\x79\xd7\x33\x92\xd7\xf8\xbc\x46\x6e\x26\x0d\x19\x1b\xb2\x30\x1e\xde\xfe\xfa\xab\xa6\xfa\x52\x05\x91\x96\x2b\x38\x55\x68\x47\x17\xde\x70\xda\xd9\x86\x7e\xdb\x21\x5b\xe4\xd6\x5c\x9f\x28\x51\xbc\x5f\x87\xc2\x0a\x91\x5d\x7d\x62\x18\xfb\x78\xfe\x0d\x52\xab\x4d\xce\x9c\xad\x1c\xcc\x83\x28\x04\xfe\xb6\x76\xa2\x34\xdc\x8e\x37\xff\xea\xe6\xc8\xf6\x75\x54\x9b\x9e\xe2\x2f\x50\xb5\x4f\xdd\xf6\xb9\x53\x2a\xb4\x54\xf7\xcc\x4b\xaf\x37\x76\x7c\x21\x74\xa6\x73\xf5\x79\x6e\xd7\x2c\x8a\xaf\xd8\xda\x33\xfc\x70\xdc\x74\x9f\x77\x34\xd9\xde\x2a\x07\xf1\x9b\x69\x1d\xde\xf7\xfb\x49\x15\x6b\x9e\x10\x42\x87\x6a\xad\x5f\xd5\x11\x45\x97\x5a\x6e\x28\xe6\x02\x5b\x1d\x76\x42\x13\x6e\x5b\x55\xe1\xf4\x6e\xfd\x11\x8a\xd8\xe6\x1e\x72\xc0\x52\xd8\x08\xe6\xaa\x35\xa7\x3b\x2d\x55\x6a\x50\x33\x3e\x9d\x11\xb1\x4d\x9e\x18\x92\x36\x6a\x06\x3d\xf9\x65\xcf\x1d\xb1\xd5\x63\xdf\x0e\xbc\x8c\x0f\x79\x6a\xb6\x76\xf7\xad\xac\xe5\x2a\x4d\x88\x24\xed\xe2\x73\xee\xa5\x88\x5f\xd3\xaf\xbf\x06\x8a\x08\x14\x2e\xd2\xe0\x4e\x88\x52\xcb\x3b\xbf\x5f\x12\x7d\xfb\xe9\x55\xd4\x76\xca\x80\x43\x0c\x27\x6f\x99\xe1\x5f\x3a\x8f\xfc\x8b\x35\x40\xcf\x8c\x7e\x9f\x9f\x4f\x3d\xce\x3f\x21\xbc\x04\xb1\x01\xed\x03\xad\x59\x56\x11\xf9\x5d\x1a\xe0\xbf\xdc\x78\xbe\x5b\x17\x3d\x68\xb4\xcf\xb9\x7f\xa9\x7a\x20\xef\x2e\x55\xab\xf2\x9b\xd8\x6d\x6d\xdc\xa9\xb6\x89\x3a\xbb\xc2\x03\xa4\x57\xe2\xfa\x1e\xde\xf3\xae\xd4\x2d\x0b\xe6\x5e\xb9\x17\x2c\x23\x7d\xb5\xa2\xce\x13\xbd\x5b\x95\x31\xcd\x86\xdc\xa2\xc5\x9f\xc1\x45\x8a\xbe\xc1\xc1\x3a\x36\x48\x13\xa1\x3a\x09\x1b\x14\xb0\x4a\x69\x39\x89\x18\x31\x1a\x52\x77\x3d\x2c\xe6\x86\x47\xd1\x63\x8b\x14\x62\x52\x42\xd3\x17\x45\x21\xc6\x55\x78\xf4\xfd\x56\x70\xad\xf5\xd5\x71\xbd\x68\x2f\x69\x80\xb1\x3b\x9a\xbf\x4e\x73\x76\xdc\x1f\x6d\x8f\xc4\x1d\x9f\x60\xeb\xc9\x28\x65\x57\xc7\x5a\xbb\x63\xcf\x39\x97\xea\x86\x12\x77\x41\xd9\x17\xd7\xe6\x5a\xe5\x95\xb8\x46\x57\x4d\x76\x61\x42\x13\x8c\xf3\xe1\x94\xee\x40\x9a\x73\x72\xca\x32\x08\xe4\xbc\x5f\x01\xea\xe5\xd9\x22\x09\x9d\xa1\xb7\x22\x17\x16\x13\xf5\x51\x89\x24\xb9\xa9\xe1\xf6\xf6\x48\x43\xa3\x6a\xc0\xe9\xaf\x93\x31\x12\x19\xff\x87\x48\x0b\x99\xb5\xbe\x1e\x92\x03\xd7\x3c\xe0\x6d\xad\x01\xfe\xb2\xef\x3f\xe7\x55\x98\xaf\xa8\x51\x71\x06\x9c\x70\x63\x70\xba\xfc\xf7\x8e\x7f\xf5\x30\x0a\xcd\x43\x65\x1e\xf2\xd3\x96\x55\x68\xa5\x22\xec\x8b\x6b\x1c\x29\x28\x66\xad\x72\xe8\xdf\x66\x1d\x2b\x02\x2e\x59\xf6\xad\xaf\xeb\x5e\xfd\xa6\xbc\xf1\xfa\xe1\xc1\x3c\xf2\x05\xc9\xe1\x95\x5f\x8d\xe6\x99\x1a\xc0\x01\xd3\x02\xa7\xf7\x1a\x87\x77\x43\x5d\xf6\x07\x52\x6d\xb6\x66\xf2\x95\xd9\x1a\xaa\x79\x63\xd3\x48\xaf\x79\x7e\x3a\x9b\xb0\x4a\xfd\xe8\xdc\x82\xe9\x54\xa3\xcf\x98\x53\xef\x12\xe7\x7d\x23\x73\x2f\xbc\x9f\x24\xf7\xbe\x15\xae\x31\x65\xaf\xba\x17\xae\x30\xa2\x52\xf0\x70\x21\xed\x99\x91\x41\x34\x7a\x3c\x17\xf1\x80\x14\x0f\x4c\xbe\x1e\xfb\x77\x1a\x96\xce\x33\x8e\xd5\xc8\x96\xb7\xaf\xb5\x7d\xf7\x12\x2d\xa7\x77\x4c\x77\x9a\xa3\x52\xa7\x1a\xbd\xec\xbb\xb5\x56\x75\xb6\x13\xe5\x52\x43\xff\x08\x16\x19\x97\x36\xac\x83\x05\x09\x6e\x5d\xab\x58\x6a\xf8\x53\xc9\x4b\xe5\x59\xca\x5c\x49\xb9\x0c\xbd\x87\xb9\xa4\x12\x46\x99\xf4\xfb\x5d\x56\x93\x46\xe8\xb7\x5a\x5e\x90\x71\xca\x53\x5d\x76\x49\x4b\x4a\x5b\xbf\xec\x8b\x39\x1e\x87\xab\x5f\x4d\xfa\x18\xe6\x49\x7e\xf5\x03\x53\xbf\xfc\x39\xd9\x21\x67\xf6\x77\xdb\xe1\xce\xb9\xdb\x6e\xe8\x96\xd7\xda\x74\x12\x3c\x4e\x97\x78\x2e\x37\x75\x30\xbe\xf6\xb3\xac\x4d\x2e\xc2\xb3\x73\x40\x71\x27\xdf\x2f\x5c\x8e\xab\xf5\x87\xb8\x62\xa6\xa0\xe9\x80\xb3\xad\x73\xb2\x81\xdb\x0c\xda\xcf\x97\x35\x6b\xb5\x44\x81\x09\xa1\xf9\x25\xb1\xef\x38\xbf\x03\x92\xa6\x93\x49\x15\x49\x5d\xa9\xab\xbf\x19\x49\xdd\x12\x49\xe1\x5d\x8a\xb1\x39\x6d\x5a\x9e\xb5\x89\xdb\x2f\x67\x5b\xe7\x8e\xf1\x69\xd3\xb6\x23\x00\xeb\x9e\xb7\x4c\xff\xcb\x85\xf8\x51\x3a\xe0\x29\x2f\x66\x6d\xb2\xa1\xbf\x3a\xfb\x91\x52\xf5\x8e\xb8\x9c\x6d\x9d\xb7\xf5\x55\x84\x5f\xb9\x0b\xd4\xb5\x40\xb6\xea\x39\x15\xd7\x84\x7a\x81\x63\xa7\x0a\x27\x54\xee\x7c\x57\x95\xef\xcc\x77\xf9\xdc\x09\x0f\x2d\x74\xed\x2d\x97\xaf\xda\x78\xd9\x90\x68\x89\xd9\x15\xf5\xee\x5f\x65\xd0\x6b\xf4\xbb\x6e\xda\xfa\xba\x6e\x65\x75\xcc\x1d\x9d\xb9\xa8\xce\x2d\x09\x87\x11\x06\x05\x1a\x88\x85\x11\x03\x9d\xfd\x10\x81\x98\xfb\xdc\x01\x5e\x2d\xe8\x37\x46\xd0\x06\x31\x40\x2b\x17\x86\xd6\x97\xab\x7c\x0c\x61\x8a\xe3\x3d\xac\x2e\xce\xd3\xbc\xa0\x69\xc4\x72\x5d\xf7\x7d\x1f\x40\xe8\x98\x3a\x64\x83\xa8\x05\xeb\x3e\xa4\x9a\xf8\x2f\x1b\x44\x1f\x61\x41\xce\xb7\x78\x30\xa1\xfe\x50\xd0\xab\xde\x4b\x94\x1c\xb2\xd5\x2c\x40\x4b\x70\xfe\xc0\xac\x7d\x41\xb1\xf8\xb0\x0c\x8c\x91\xb6\x6b\xac\x91\x5c\xfb\x4c\x07\xba\xb4\xff\xaf\xb1\x5a\xda\xb6\x6b\x16\xbb\xab\x29\x3d\x4b\x80\xa1\xa6\xde\xf4\x84\xc3\x65\x51\xbd\x01\x2b\xc2\x39\x2f\x4f\x8c\x7a\x09\x79\xe7\x1e\xea\xcd\xf1\xa8\xb9\x08\x9a\xdb\x05\x9e\x5e\x6c\x6e\x06\xb7\xb1\x76\x38\x2a\xf9\xc5\xd7\x3c\x7f\x13\x3d\x73\x69\x82\xa4\xe3\xc1\xc2\xe6\xa6\x31\xf5\x9e\xa6\x92\x4a\xb9\x15\x14\x03\x3b\x0a\x55\xeb\x96\x6a\x5b\xb5\x2d\x0b\x9e\xe5\xcd\x33\x61\x51\xb6\x04\x05\x1d\xe2\x12\xcf\x8f\x0d\x46\x88\x97\x61\xae\x8a\x02\xfb\x01\x3c\xf8\xd3\x60\x15\xb7\xf0\xa5\xa3\x39\x7b\x74\x67\x03\x6f\xfa\x5e\x11\xfd\xf0\x9b\x7e\x9e\xda\xfb\x87\x93\xaf\xaa\x63\xce\x19\x89\x86\xc7\xcc\x6b\x89\xeb\x8e\x03\x03\xaf\xc0\xac\xb2\x40\x24\x1b\xce\xa3\x0a\x78\x9a\x0e\x13\x56\x59\x26\xa3\x31\xaf\xac\x42\x66\x4c\x73\x28\x63\x26\xa7\xd0\x48\xc1\x71\xe2\x28\xe5\x67\x98\xf1\x78\xad\x3c\x8b\xc0\xeb\x05\x9c\x0a\xe0\x1b\x4f\x51\xc0\xca\x31\x38\xc7\x3c\x55\x93\xc6\x98\xa7\x7c\x3c\x4d\x9d\x58\x9f\x35\x25\xe8\xb5\x2e\x01\x66\x06\x15\x25\x2a\xd5\xbf\x43\xf9\x9a\x9d\x01\x4a\x4e\x29\x03\xcd\x5f\xca\xc7\xf7\x1d\x6d\x49\x2e\x5c\x17\x58\x25\x3f\xa2\xf9\x7b\xd8\x7e\xe0\x25\xb5\x39\x67\xa5\xf9\x7b\x7a\xed\xdf\x5d\x9b\x87\x71\xb9\x79\x8e\x33\xc7\xf4\xd7\x1e\xa7\x3b\x4f\x4a\x64\x8f\x8d\x79\x6a\xc7\x8b\xa9\xde\x0f\x92\x37\xaf\xb8\xa6\xde\x23\xd3\x2d\xee\x0e\x9f\x10\x45\xa0\x59\x1f\x61\xfd\x5e\x50\x47\x75\x2a\x2f\xc9\x74\xe3\x0e\x3f\xc2\xba\x2a\x41\xe9\x75\x69\xb1\x84\xf9\x95\xcf\x56\x50\xba\x64\xcf\xa7\xe5\xd7\x96\xda\x94\x11\x72\x40\x60\x4a\x8b\xa9\x72\x31\xbb\xe4\xe0\x39\x88\x43\xb0\xde\xa0\x19\x73\x6a\xe6\x29\x8e\x80\xea\xf2\xfb\x49\xa2\x42\xd3\x05\xc4\x26\x09\x24\x4c\x04\x4f\x8b\x5c\x61\xae\x5c\xb7\x80\x73\x43\x77\xc1\xe2\xb8\x31\x0d\x04\xd5\xc9\x69\xe2\xba\x0b\x1b\xd0\x46\x42\x9c\xb8\x91\x32\xb7\x15\x3e\x24\x80\x7b\xb3\x88\x26\xf0\xd8\xff\x9a\xe7\x1d\xf8\xa1\x73\x62\x1d\x82\xd2\x6c\xb1\x01\x26\x48\xd6\x12\x8f\x93\x2c\x82\xc8\xef\x46\xe4\xed\xed\xbc\x62\xee\xcd\x8d\xa6\x4e\xf9\xac\x57\x5a\x4d\xcd\x4a\xa0\xa3\x80\x10\xb0\xac\xc1\x43\x59\xa5\xb6\x3a\x46\x77\x3d\x0a\xd4\xdd\xcb\xb0\x48\x13\x6f\xff\x77\xac\xe1\x88\xd5\x4c\xbe\xa1\x08\xc9\x47\x62\x9a\xc4\x44\xa4\xc9\x8c\xd0\xc1\x80\x45\xae\x9c\xd1\xf8\x0b\x85\xd8\xbe\x85\x40\x99\x4a\x78\xca\x4c\x9c\x48\x68\xd0\xfa\x3a\x69\x62\xbb\xa1\xc4\xcd\x0d\xd2\x9a\xf2\x08\x9e\xec\xe5\xe1\xdb\xe8\xf9\xc0\xf3\xdf\x03\x98\x2e\xb3\x8f\x5f\xc2\x7e\x7a\x19\xa6\x98\xb3\x34\x85\x4b\xdd\x2a\x86\x3b\x65\x3b\x07\xdb\xf1\xbe\x83\x95\x35\xdd\x2a\x5b\xe4\xa9\x3e\x41\x76\xce\x1f\xec\x6b\x02\x9b\xea\xdb\x58\xe8\x49\xba\x64\xc5\x2d\x59\x09\x4c\x70\xa7\x5d\xd3\xe5\x4a\x2e\xe4\x0c\x89\xcd\x09\xb8\x59\x0d\x54\xc5\x45\x1d\x0b\x37\x5c\x9d\xcd\x6b\x38\xb2\xec\xae\x86\x02\xde\x1d\xfc\x58\xaa\xf9\x28\xbc\x28\x12\xeb\xeb\xe4\x91\x33\x7c\x0d\x99\x0e\x8c\x95\x20\x88\xb3\x7d\x87\xcc\xe8\x66\xd6\x36\xcf\x76\xa8\xdf\xbe\xd0\x48\xa6\x4c\xfb\xe6\xa6\xd4\x95\xd8\x09\x72\x36\xb1\xa2\x17\x93\x82\x5d\x17\x6d\x92\x33\xe8\x4d\x5c\x4f\xe7\xa0\x4a\xc1\x03\x65\x21\xc8\x90\xa5\x2c\x93\xf3\x12\xd0\xb2\x16\x34\x14\x97\xa3\xcd\xca\xb6\x05\x3d\x19\xf4\xe3\xdd\xcd\x5c\xf3\x3a\xf3\xce\x01\x84\x0b\xd2\x73\x12\xf4\x7b\x55\xaf\x57\xf4\xf9\xad\xfb\xf4\x57\xcd\x65\xca\x4b\x34\xe8\x99\x91\xf2\x12\xed\xcd\x63\xda\xd7\x82\x09\x41\xae\x7c\x49\x93\xa3\xb4\x60\x59\x0a\x41\x1e\xf8\xa5\x64\x9e\x2a\x5e\x53\x7a\x42\x33\xeb\x88\x9a\x10\xfd\xc5\xf0\x33\xd7\x0e\x38\xe5\xb4\x86\xc0\xc4\xbc\x88\xa8\xc1\x09\xfb\x4d\x83\xf2\x0e\x9c\x00\x1c\xa0\xd4\xfd\x65\x51\x06\x7f\x38\x6f\x03\x8b\x62\xa7\x81\x9b\x2a\xae\x51\xd9\xc3\xb6\xf7\x6a\xba\x22\xbf\xe9\x73\xb1\xed\xf3\xa5\xed\x35\xc9\xb9\x49\x9a\xe6\x85\x18\xf3\x7f\x30\xd3\xda\x52\x38\xef\xe5\x1d\x67\x78\x55\x9a\x07\xa7\x15\x35\xba\x80\xc1\x4b\xbb\xe5\x6b\xf7\xda\x3f\xb7\x7a\x0f\x72\x55\x4e\x43\xbc\xde\x80\xe3\x82\x52\xd5\xb5\xe1\x95\x69\x36\xec\xb6\x09\xcd\x86\xdb\xf0\xff\x33\xf8\xff\xb9\xbf\xbf\x5c\x19\x69\xee\xd6\xd4\xcf\xaa\xa3\xc3\x6e\x46\x57\x42\x4f\x99\x2f\x2e\x49\xa5\xdc\xbb\xa9\x22\x55\x81\xa6\xc3\xb3\xc9\x8f\x34\xcb\x95\x81\x3a\xac\x0f\x0d\xf7\xab\x3c\x9c\x98\x35\x37\x4e\x03\xde\x28\x16\x93\xda\x62\xf6\x91\x38\x1c\x4c\x9e\xea\xd3\x44\x38\xc0\x74\x1e\x51\x88\x81\x73\x72\x79\x97\xea\x38\xf5\x48\xe6\xc2\x9e\xfc\x59\xdf\xf8\xa5\x83\x77\x48\x55\x0b\x68\x43\x8b\x55\x03\xe5\x25\x72\xdd\xa2\xd7\xbc\x4f\xd6\x66\x17\x90\xa3\x0e\x0f\x54\x9e\xdd\x7e\xfb\x4b\xda\x5d\x6f\x2d\xa0\xf6\xf3\xd3\x42\x34\xdc\x1d\xe1\x7d\xb7\xf4\x15\x8b\x00\x40\x3f\xef\x69\x84\xeb\xc4\xef\xec\x31\x7c\x79\x45\xd3\xf8\xf1\x79\xb3\xd5\x06\x1b\x32\x60\xd7\x29\xbc\x1c\x6c\xc8\xf5\x76\xc3\x2c\x0c\x9c\x37\xc0\x8b\x10\x6a\xd7\xef\x2b\xa2\xf3\x1d\x4f\x19\xcd\xaa\x29\x4d\x20\xcf\xd2\x5a\x75\x06\xea\xed\x41\xac\x54\xca\x05\xbe\xf9\x65\x1f\xf1\xc8\xda\x0e\x64\xb2\x7a\xca\x03\x6a\xac\x0c\xb6\x9f\x31\xea\x82\x95\x1d\xd6\x2c\xd7\xd8\x8f\x72\x27\x59\xdd\x56\xd8\x64\x56\x75\x4b\x45\x53\xff\x62\x11\xf1\x8e\x17\xbe\x71\x2f\x2f\x34\x53\xce\xf1\xf3\xdc\x6c\xe1\x60\x6c\xb9\x07\xf5\xea\xa1\x6f\x03\x72\x1a\xe4\xa9\x5a\xae\xe2\x3b\xa4\xad\x36\xe9\xb6\x3a\x85\xf8\x6d\x32\x61\xd9\x01\xcd\x59\xb3\x15\x40\x74\x03\x53\x01\x63\x8b\x8f\x8c\x98\x43\xa8\xc7\x09\x13\xad\x6f\x19\x91\x69\x35\xcd\x8e\x26\xe0\xdf\xbd\x6a\x7f\x89\xbc\x30\xf2\x56\x3d\xb5\x2c\x3f\xf5\x21\xef\xc9\x4b\x2b\x26\xa8\x1a\x6f\xc9\xce\xb7\x1c\x32\xea\xca\xf6\xf0\xe3\x09\xd9\x23\x5d\xb6\xf1\x5c\xc5\xb6\x2c\x05\x3a\xf1\x16\x9d\xa5\x5c\x4d\xbe\x7f\x1d\x44\xf6\x82\xed\x8d\x3d\x4b\x53\x00\x37\x37\x0a\x54\x9b\xac\xfe\xb2\x67\xbd\xc5\x20\x4f\x03\x27\x10\x12\xa9\x57\xc4\xbc\xa0\xa1\xe9\x90\x99\x1a\xe1\x57\xd3\x58\x30\x8e\x81\x18\x7b\x31\x21\x73\xf1\x5e\x1c\xbe\x75\xcf\x5b\x64\x43\x32\xc1\xc0\xc3\x41\xa1\xbd\xa9\xa8\x80\x7f\xea\xc2\x0f\x78\x06\x8f\x9b\x70\x07\x16\xeb\x7b\x77\x6b\xc1\x49\xcb\xd9\xca\x4c\xdc\x71\x9b\x85\x58\x7e\x01\x6a\x6f\x6e\x14\xd2\x5f\x81\x18\x38\xe1\x76\x33\xe1\xd7\xaf\xee\x09\xa7\xc7\xea\xb3\xd8\xde\xfd\x07\xf5\xe9\x4b\x14\x7d\x37\x50\x8a\x2c\xe3\x76\x75\x29\xb3\xd9\xb7\xef\xce\xd4\x56\xc2\x39\x79\x73\x32\xe7\xf9\xf3\xa8\xbe\x4f\x71\x0a\xcf\xbd\x55\x51\x4f\x46\x35\x2c\xf8\x10\x02\xcf\x08\x7b\x7b\x2e\x41\x4e\xe5\x01\xb4\x7d\x9e\x41\xaa\x2c\xf8\xf4\xf2\x10\xb8\x13\x46\xbf\x71\x99\x13\xe6\x35\x95\x23\xcd\xd8\x39\xba\x99\x2b\xed\x8f\xf6\xf6\xd0\xe3\xd2\xa3\xd5\x18\x49\x5a\xc1\x5b\x3d\xd2\xee\x79\x78\xb4\x77\xe9\xf9\x84\xac\x18\x66\x65\x19\xec\xda\x21\x11\x0c\xb1\x1a\xd8\xf0\x79\x1c\x3a\x9d\x03\xb0\x4b\x65\x93\x73\x6e\x9c\xc9\xac\xa6\xbd\xba\x06\xe0\xa1\xfe\x81\x03\xcf\x32\x40\x5d\x6c\x12\xb8\xa2\xf0\x36\x8a\x2b\xa5\xa2\xeb\x52\xd1\x3d\xf7\x07\xbc\xb9\x3f\xc5\xa7\x20\x1e\x15\x96\xc2\xaa\x22\x5b\x73\x8a\x74\xab\xdb\xda\x0d\xdb\x5a\xf9\xec\x97\xb0\x3c\xe1\x69\x41\x52\xb1\x01\x3b\x9f\x8d\x8c\xa1\xc3\xde\x1d\xb2\xa5\xf7\x26\x4e\x80\xa8\x3d\x77\xaf\xa5\x53\x9b\x39\xcb\x38\x73\xbc\xbc\xc1\x3c\x02\x69\xc1\x6b\xce\xd4\x7b\xc1\x13\x4c\x17\xe1\xf3\xfe\xb1\xc1\x72\xb6\x75\xee\x3d\xee\x1f\xef\x92\xa7\x4f\xbf\xb8\xcb\x1e\x54\x10\x97\xcc\x3e\x04\x42\x33\xf8\x21\xb5\xa9\x15\x17\xc3\xa8\xae\x52\x89\x2e\x78\x16\xa3\x7d\x44\xf2\xfc\x03\xfd\xa0\x1a\x78\xc6\xcf\xcf\xbe\x9c\x43\x17\xbf\x24\x5e\x12\x98\xbe\x05\x40\xde\xd3\x13\x44\xf7\xab\xf7\x7c\x89\x94\x70\xec\x99\x76\xec\x56\xc3\x74\x5d\x18\xf2\xd4\x0e\x68\xfc\x73\xb8\x50\x22\x46\x6d\xb0\xdd\x57\x60\xd5\x24\x68\xa6\xcd\x23\xc1\x30\xb6\x44\x82\xc3\xf2\x3a\x12\x1c\x1d\xae\x75\xf6\xc9\xa9\x1c\x76\xc7\x6f\xde\x9c\x1c\x9e\xf6\xde\xef\x7f\x54\xd1\xd9\x51\x0e\xad\xa0\x61\x70\xf3\x09\x4d\xe3\x79\x2b\x2b\xcf\x15\xfb\xd9\x63\x01\x63\x15\x1e\xf0\xa0\x9d\xf7\x21\x60\x90\x83\x56\xe2\x4b\x45\x3a\x77\x9d\x16\x60\x9b\x84\xd8\x3e\x88\x94\x69\x5c\x39\x4f\x46\x62\xca\x8a\xe2\x3e\x18\xff\x0c\x31\x9e\x18\x2c\x1a\xef\x15\x1f\x0e\xe7\xaf\x26\x03\x9c\x59\x88\xf3\x0f\xc0\x20\xf1\xb9\x46\xee\x6e\x3c\x37\xff\xea\xce\xc9\x51\xe6\x2c\xe8\xd0\x02\x8d\x8a\xb0\x47\x02\x33\x3f\x34\x77\x31\xde\x3f\x8e\x16\x33\xf6\x73\x6c\xe0\x1d\x9b\x65\xfb\x92\x05\x70\x2d\x64\x03\xef\x73\x20\xb5\x1c\x40\xf5\xdc\x42\x77\x22\x9a\xcc\x56\x07\x04\xd7\x21\x2e\x46\xbf\xaf\x3e\x79\x4f\xcb\x56\xb7\xb1\xf2\x4d\xbb\xa5\xad\x0e\x45\x16\xcf\x77\x84\xea\x53\x96\x3b\x7d\x23\x4b\x6a\x01\x6a\xa9\x87\xb1\xcd\x70\x30\x9c\x59\x76\xab\x09\x56\xdf\x44\x48\x1c\xd0\xa2\xd6\x6e\xa9\x5b\xfd\x88\x79\x55\xdd\xeb\x43\xa8\x6e\xee\x29\xbb\x31\xcf\x6b\x4b\xdb\x71\x70\xe2\xf6\xbe\xdc\xa7\x5c\xb2\x2c\x67\x27\xa6\x35\xee\x1a\x4a\x12\x36\x67\x4d\x09\xf1\xa0\x65\x71\x9e\x0e\x95\x89\x5f\x21\xf4\x15\x67\xc6\xd2\x18\xae\xb8\xe5\xff\x4d\xa9\xb5\x13\x3a\x63\x72\x03\xdc\x5a\xb3\xbe\xb5\xa4\xb4\x95\x48\x20\x2f\x55\x2b\x3a\x2a\xab\xd9\x22\x3b\x2a\xc9\xac\x4f\x7c\x37\x3d\x1a\xbc\xc6\xb4\x68\x8e\x35\xdc\xb3\x1a\x6b\x38\xe5\xff\xc5\xb7\x71\x7b\xd6\x51\xc9\x16\xae\xec\x46\xeb\x99\xe7\x47\x4b\x72\x52\xfe\xae\x7a\x87\xaf\x4c\x87\xbc\x47\xaf\x54\x77\xb7\x25\xca\xf7\xc0\x73\xee\xbc\x36\x87\xb3\x73\x60\x02\xf0\x11\x96\x0d\x88\x00\x63\xf5\x93\x11\xcd\x81\xaf\x3b\xe8\x66\xa0\xed\xb2\x6d\x87\x7c\xbd\x35\x4f\xd0\x57\xe9\x5f\x5c\xf1\xa8\xe5\x4f\xc8\xb0\x4f\xd0\xb4\x3a\x94\xbb\xce\x84\xb4\x23\x1f\xa4\xde\xce\x49\x6e\xfb\x77\xea\x45\x7b\xc7\x13\x73\xf5\x20\xef\xec\xdc\x5e\x8d\xea\x1b\x3c\x43\x0a\x7a\x02\x42\x3b\x11\x10\x12\xfb\xe2\xdc\xa1\x50\x73\x31\xb4\x17\xbb\xb3\x15\x7b\x4e\x55\xde\x61\xd9\xd7\x3b\x30\xdc\xbf\x2b\xd0\x91\x24\xfa\x19\x3f\x8a\xb1\x23\x1a\x3d\x45\x49\xaf\xd1\x3a\x57\x53\xf2\x2a\x38\x2a\x3f\xcf\x83\x0b\x67\xff\xc5\x8f\xfb\x1c\xcc\xb8\x53\xac\x7a\x32\xa7\x30\x3b\x7c\x68\x69\xf7\xd6\x5f\x6f\x3d\x65\x59\xe7\xfa\xaa\x7e\xd4\x23\x72\x77\xdc\x0f\x95\xf8\xb9\xac\xa6\x9e\x37\x22\x39\x0e\x86\x5e\xa7\x5b\x29\x1e\x86\xdd\x14\x78\xba\x2a\xe5\x57\xd3\xa6\xa7\xe2\x38\x7c\x2d\x32\x24\x7b\xe5\x3a\x8c\x30\x95\x9f\x3e\x84\x5c\xae\x66\xb1\xd6\x58\xfe\x03\xe7\x79\xfd\xef\xc0\xd5\x48\x82\x03\xa1\x64\x62\x58\xf6\xa9\x95\xdb\x25\xc8\x4e\xf5\x92\x44\x17\x72\xd7\x23\x06\x81\xf1\xf3\x68\x85\x61\x05\x82\x36\x2c\x8b\x98\x73\x6f\x3e\xf4\x6c\xe6\x0b\x65\x29\x55\x67\x8a\x68\x6c\xaf\xea\xae\x9e\xd0\x82\xbd\xd2\x7d\x7f\x60\x95\x15\xfb\x66\xe4\x35\x01\x70\xab\x7c\x77\x7b\x10\xda\x90\xb0\x30\x2b\xbb\xb9\x06\xca\x73\xdd\xb6\xa3\xe3\xef\x1a\xaf\xed\x98\x79\x1e\x6e\x4d\x21\xd9\xe3\xe8\x81\x32\x8f\x5b\xf0\xb6\xcf\xfa\x1c\x04\xc8\xd3\x52\x99\x2a\x58\x31\x29\x72\x52\x63\x8c\x17\xf2\xdb\x5e\x26\xc2\x28\x48\x92\x0a\x4b\xb8\xd2\xe9\x6b\x90\x85\x47\xaf\x6d\xa8\xd7\xae\x9f\xbd\x13\x5f\xb2\x07\xb9\x1d\x2f\x31\xb8\xd6\x03\x00\xf7\x5a\xcf\x18\xdc\x98\x4c\x9d\x60\xcc\x3f\x94\x3f\x05\x73\x30\x06\x60\x7e\xaa\xb9\x08\x4c\x12\x71\xf5\x9a\x45\x7c\x4c\x93\x5c\x83\x7a\x89\x76\x2d\xe5\x90\xed\x37\xe3\xe6\x06\xcb\x29\xcb\x3d\xf7\x0a\xd1\xb1\x93\x9b\x16\xc2\x9a\xd5\xd9\x74\x75\x59\x32\x6f\x09\x09\xe2\x69\x9a\xed\x19\xec\x39\x0f\x06\x82\x66\xaf\xaf\x5b\xcf\x12\xe6\xc1\x95\x73\xa3\x09\x54\xfb\xf9\x5d\x37\xbf\x55\x6b\xa0\x8f\x03\x5b\x3d\x93\x51\x36\xfa\xca\x22\x99\x5c\x8d\x18\xda\x5c\xc2\x2d\x34\xcf\x09\x2d\x59\xf1\xcf\x3d\x87\xd7\x00\xb2\x8e\xdf\xb5\x9d\xee\x9d\xf3\x7c\x39\x74\xda\xd9\xe3\x21\x2b\x3e\x28\x7b\x3e\x44\xf4\xd8\x9c\x19\xb6\xad\x10\xb5\x7d\x09\xd0\x2b\x1b\x8f\xac\x39\x5a\x04\x31\x2b\x55\x12\x5e\x2a\x11\x63\x4f\xb8\xe3\xb6\x27\xbc\x15\x9b\xdf\xb3\xde\x82\xfc\x4e\xb6\xf5\x56\xc2\x37\xcb\xb3\x37\xfc\x5a\x87\x05\x96\xec\xeb\x2d\xca\xbf\x2a\x16\xf4\x4a\x3c\xa8\x3d\xdc\xae\x89\xf2\x1d\x5a\x88\x57\x80\x80\xcb\xb9\x1f\xac\xbe\xa1\x68\xaf\x0b\xa9\x70\xcb\xef\xaa\x11\x9b\x83\x33\x82\xca\x0a\x9c\xcb\xfd\x50\x72\x2e\x87\x01\x25\x74\x6e\xd9\x1c\xcd\x64\x29\xb7\xff\xae\x79\xe5\x9c\xcb\x5f\x77\x7a\x38\x83\xa2\xe7\xe4\xa5\xf7\xd3\x8f\x6c\xe0\xb8\x3d\xdb\x26\x3b\x65\xcf\xe4\x77\x06\x80\x41\x53\x62\xf5\x5c\xc8\x5d\x45\x2e\xf7\x78\xf0\x52\x3f\x4d\xb5\x36\x1a\x3a\x6d\xe7\xee\x0e\x0e\x2e\x78\xaa\x21\xa0\x7b\x7f\xac\xec\xde\x1f\x6b\xbb\xf7\x47\xbf\x7b\x8d\x2d\x34\xe6\xf9\xd6\x88\x41\xdf\xff\x38\xb7\xef\x7f\xac\xef\xfb\x1f\xbf\x71\xdf\xab\x46\xb8\xbd\xbe\x44\xa7\xeb\x5f\xa8\xfe\xb1\x9e\x6f\x2b\x08\x1b\xbe\xd4\x96\x1a\xe2\x08\x88\x1f\xe8\xbe\xe4\x65\xd2\xcd\x04\xb1\xf8\xc9\x39\x99\xb7\x2b\x75\xd5\x1f\x3f\x75\x9c\x34\x33\xa5\x1b\x7d\xea\x64\x76\x6a\xae\x86\x5d\x90\xb9\x5a\x7a\xd1\xcb\xa6\x7b\x5e\x37\x21\x15\x12\xf9\x2f\x2a\xe8\x8b\x2c\xfa\x6b\xe0\x2a\x0c\x7a\xad\xe4\x20\x50\x42\xfe\x52\x01\xa8\xae\x5a\xc2\xfd\x42\xc5\x75\x8a\xa1\xcb\x76\x51\xcc\x0a\x16\x15\x26\xde\xa4\x8a\x4b\x92\x97\xaf\x23\xe7\x02\x3a\xae\x3a\xf4\xe4\xa2\x77\x21\xe5\x47\xd6\x72\xad\xf4\x4f\x71\x15\x32\x2f\x9e\x67\x5d\x1c\x09\x14\xb0\xe2\x9f\x42\xef\x9c\x58\xa7\xf3\xc8\x55\xaf\x9b\x25\xc9\xc0\x6a\x13\x22\x41\x14\xb9\x01\xa2\x19\xa3\xff\x94\x46\xcd\x8b\x73\x3a\xaf\x55\x3c\xc6\x67\xb8\xc6\xee\xed\x29\x69\x1c\xc5\x8d\x5d\x57\x63\xfa\x10\x20\xe7\xda\x82\xc2\xdd\x49\xa0\x88\x5a\xcf\x27\x8a\x5f\xc1\x7b\x78\xbf\x8c\x01\xaa\x7f\xd3\x99\xf8\x86\xb3\x2c\x51\x47\x9a\x40\x39\x2e\xca\xd5\x89\xe7\xfa\x3a\xd1\xb9\x1d\x9a\x5c\xd1\x59\x7e\x32\x12\x57\xab\x73\x67\x64\xaa\xd6\x5c\x39\x6f\x85\x07\x30\x7a\x86\x29\x83\xce\xf3\x3b\xe1\xbc\xb9\xbd\x54\x0e\x4a\xaa\x1e\xdc\x62\xde\x79\x8d\x17\x38\xef\x34\xb8\xed\xf2\x39\x78\xc8\x22\x45\xb4\xda\x01\x4d\x57\xc7\x00\x95\x3d\xfe\x94\x34\xba\x8d\x5d\x37\x7b\x3b\xc8\xde\x6e\xe8\x1b\x55\xaf\x4f\xb1\x82\xbf\x55\x87\xca\xb6\x9f\xaf\xd0\xf1\x95\x8b\x78\xbb\x46\x4a\xba\xae\x98\x00\x01\xbb\x65\xa0\xed\x00\x68\xfb\x5e\x72\xd4\x55\x9f\xdb\xf3\x04\xca\x02\x3d\x44\xb2\xb4\x11\xbc\xcd\x2b\xdf\x47\xe1\xc9\x1d\xfa\x2b\xa8\xbf\x6c\xc4\xfc\x26\xbe\xd7\x2f\x85\x3e\xb8\xb4\x61\x02\xc2\xf8\x55\x90\x88\x97\x26\xdf\xf2\x2e\xa2\xee\x14\x38\x38\x65\x35\xc7\xc0\x52\xaa\x86\xce\x4d\x41\xe8\x5f\x52\x5f\x64\x1d\x39\x71\xf1\x54\x56\xb5\xc9\x55\x19\x59\xdd\x43\x76\xf7\x30\x1a\xe0\x21\x8c\xee\xde\x1e\x29\xfb\xab\x74\x29\xe0\xbb\x4e\x86\x17\xda\xcd\x71\xac\xe9\x8b\x88\x2d\x0e\x76\xc6\x2f\xdd\x53\x68\xec\xd6\x33\x03\x72\xee\xac\xcc\xef\xb2\xe4\x72\x9c\x2b\x9c\xf0\x74\x58\x3a\x54\xf3\x33\x9b\xf6\xbe\xf1\xfe\x7e\xae\xe6\x1e\x65\xea\x67\xc6\x30\xe3\x9f\x99\x71\x66\x9d\x9f\x3d\x4c\x61\xd4\x1d\x92\x56\x56\xdb\x5d\x5d\xb5\xe7\xda\xef\x40\x8d\xdf\x86\xaa\x6e\xf0\x2e\x2f\x2a\xfb\xc2\x42\xb8\xd7\x2c\x30\x98\xb3\x02\x44\x40\xb6\x2c\x3e\xb2\x2f\xe4\x96\xbe\xa0\x09\xee\x41\xee\x1e\x9b\xc4\x0d\x35\x62\xec\x1e\x4a\xd2\xba\xbb\x56\x71\x1c\x67\xb3\x17\xf7\xae\xad\x9c\x7f\x06\x72\xaa\x3c\xca\x82\xbd\x75\x15\x57\xc8\x53\xd2\x6d\xcd\xf1\x14\x95\x81\x41\x54\x9b\xe4\x65\xef\x1c\xa0\xd8\xf3\xc5\xdc\x72\x54\xca\xbd\xbb\xcd\xaa\xf4\x40\x15\xd7\x3a\x9f\xaa\xad\x2a\x30\x02\x51\xe1\x68\xfd\x81\xa7\xcd\x05\xf7\xf6\x88\x2e\x48\x6e\x6e\xdc\x64\x83\x90\xbc\x24\x5b\x64\xc7\x75\x9d\xe1\xc8\xea\xfb\xa3\x0f\xbd\xdf\xf7\xdf\xfd\x76\xd8\xfb\x74\xf8\x96\xec\x91\xcd\xff\x27\x95\xc0\x7b\x9e\x9e\xfd\x67\x7e\xfe\x64\x03\xfe\x6f\x9e\x6d\x6d\xfc\x7c\xfe\xb4\x79\xd6\x39\xff\xda\xbd\xc5\x1f\xad\xaf\x5b\xed\xee\x6d\xeb\xfb\x4d\xb4\xa6\x7e\xbf\xff\x7f\xab\xd0\xd0\x6b\x40\xf0\x9f\x4f\x17\xc1\xe3\x3c\xeb\xd1\x2f\x0e\xcb\x3b\xc0\xaa\xfc\x66\xee\xff\x46\x57\x32\xfa\x3b\x9e\x2a\xca\xa9\xf2\x92\x65\x83\x44\x5c\x39\x16\x17\x4b\xba\x4f\x0b\xea\xab\x0a\x96\xad\x67\x75\xe7\x10\xcd\x0c\x0d\x15\x46\x6e\xb9\x69\xb7\x6a\x01\x15\xd0\x23\x25\x50\x93\x14\xdb\xf3\xfa\x32\x27\xc8\x4b\x52\x2e\x4a\x76\xec\x89\x43\x39\xd7\xe5\xad\x36\xff\x76\x4e\xa0\x3d\x71\xea\x14\x2c\x2f\xe6\x11\xe7\xee\x01\x9e\xfa\x45\xd9\x35\x8b\xaa\x8a\x5a\x3b\x41\xb7\x65\x1e\x4d\x64\xc3\xb1\xdb\x5d\xc5\xe3\xca\x05\xd9\x5b\x06\x6b\xd6\xf2\xaa\x5c\xda\x03\xdd\x7d\x58\x18\xfa\x45\x64\xa4\x5b\x6a\x44\x77\x51\x19\xe9\x5a\x19\xa1\xd7\x15\x88\x3d\x19\xe9\x96\x65\xc4\xd5\x15\xd5\x32\xd2\xf5\x65\xa4\x67\x85\xc4\x2b\x5b\x29\x24\xdd\x0a\x21\xe9\x06\x1c\x06\x27\x8a\xbd\x6f\x2b\x25\x35\x0c\x2e\x83\x35\x6b\xb9\x55\x2e\xed\x81\x56\x9f\xac\x59\xdd\xae\xa3\x65\xdb\x93\xef\xa3\xf4\x93\x7a\x43\x62\x14\x6a\x2d\x90\x17\x95\xda\x79\xfc\x82\x41\xd6\xec\x6f\xbb\x9b\xd1\x81\x55\x6c\x84\xb5\x79\x0f\x56\xf4\x83\x12\xfd\xf2\x24\x78\x48\x82\xc9\xf0\xbf\xeb\xec\xdd\x9c\xc4\xe4\xbf\x2b\xc2\x21\x5e\x39\xbc\x2a\xd9\xc3\xb2\x2f\xbd\x60\xce\x3a\xb7\x14\x39\x1a\x60\x77\x02\x58\x48\x2c\x81\x02\x06\xf7\x30\xdb\xd6\xee\x5f\xbe\x97\x63\x41\xb9\xb1\x8f\x6c\xf4\xa6\x8a\xd7\xb6\xf8\xd6\xd6\xbe\xb1\xad\xb6\x74\xd0\x4e\x65\x42\xe7\x4c\x55\x57\xef\xda\xd9\x12\x06\xfb\x70\x03\x2e\xe1\xb1\x79\xa5\x0b\x1a\x3f\x53\x3d\xa2\x75\x62\x92\xeb\x1b\x08\xe3\xcf\x03\xcd\x05\xbc\x5f\xd6\x6b\x4b\x95\x6f\x8f\x92\x63\x97\x92\xe3\x10\xb8\xbd\xd4\xbe\x33\xdc\x40\xe7\xb2\x87\xb6\x5d\xc5\x00\xd6\x8e\x2c\xd6\xd6\x1a\xf5\x83\x77\x4b\x0f\xde\x5c\x64\xc5\x2b\x7f\x36\x57\x36\x1c\x76\xc1\x25\x4a\xa7\xdb\x22\xf0\x99\x64\xc3\x0b\x80\x2b\x78\x7b\xd3\xa3\xd7\x5c\x55\xc6\xf3\x5d\xbd\x25\x75\xa9\xbe\x63\x4f\x8a\x6e\x0b\xb2\xa0\xd0\x19\xf7\x1c\xe7\xaa\x60\x2d\x3e\x84\x1a\x2d\xe5\xcb\x28\x33\xb9\x37\xa3\x69\xe6\x5e\x05\x19\x3f\xfd\x10\x66\x26\xcc\xb0\x81\x49\x2a\x0d\x83\x6c\x05\xee\x8a\x14\x57\x9e\x3a\x2f\xd4\x57\x5b\x66\xf0\x3c\xd9\x24\xb7\xad\xf6\xda\xe6\x13\xb2\xfd\x4c\x4a\x2a\x26\x99\x35\x70\x73\x2c\xe2\x69\xc2\xda\x84\x5d\x4f\x44\x86\x46\x20\xca\x77\x44\x06\xde\x71\x21\xbb\xa3\x72\x21\x1e\x10\x98\xc9\x8a\x74\x87\x34\xb6\x3b\x2f\x3a\x5d\x78\x09\xa8\x6d\x73\xc4\x80\xf4\x7a\x92\x52\xe7\xd2\x05\x12\x00\xdf\x2e\xd9\xdc\x54\x8f\x3c\x36\x62\x9e\xd3\x7e\xc2\x36\x12\x9e\x32\x92\x8a\x0d\x08\xe3\xb5\x16\x92\xfc\x7c\x01\x92\xdb\xa4\xd7\xbb\x62\xfd\x09\x8d\x2e\x7a\x19\xfb\x73\xca\x33\xd6\xeb\x41\x3b\x1e\x4f\x73\x46\xf2\x22\xe3\x51\xf1\x78\x57\xe2\x53\x32\x4c\x7e\xdf\xff\x44\x8e\x3e\xfc\xfb\xe1\xc1\xe9\xd1\xf1\x07\xf2\x64\xd3\xe2\x9e\x64\x22\x62\x39\xb2\x41\xed\x02\x03\x13\x2c\x53\xeb\xe3\x5e\x8f\xe5\xef\x81\x96\xc7\x6d\x75\x26\x04\x5e\x52\x8a\x6c\xca\xd6\xc0\xe2\x0f\x6f\xfb\x81\x2f\xdb\x30\x88\x4a\x74\x36\xbb\xdd\x1f\x03\xc8\x67\x60\x83\x9b\x16\x2c\x13\x93\x4f\x08\xf7\x5a\x8d\x28\x8d\xcb\x94\x50\xce\xba\xab\x10\x3f\x7b\xe6\x41\x6d\xcf\xc1\x2a\xf3\x25\xb0\x6a\x5a\x27\xa2\x13\x5e\xd0\x84\xff\x83\xbd\x91\xea\xf9\x1d\x2b\x0a\xf4\xaf\x51\x95\xbe\x6b\x8b\x89\xb4\x50\x7e\x3c\xf5\x57\x9b\x39\xe0\x7a\x4b\xb9\x47\xcc\x77\x3f\x5b\xe5\x38\x08\x33\x26\xa7\xcf\x11\xe5\x29\x8b\xf5\xca\x40\x62\xaf\x4a\xd7\x8d\xbd\xa2\x59\xca\xd3\x61\x1d\xbb\x9f\xb7\x02\xc0\x79\x8c\x51\x20\xb2\x88\xd1\x61\x35\xb0\xa2\xff\xa5\x45\xbe\x1a\xad\xd6\xff\x02\xd6\x3e\xfd\x2f\x1d\x2b\x25\xe4\x25\xa4\xef\x90\xaf\x26\x96\x3d\x24\xdc\xee\xca\xb1\xeb\xd8\xc3\x55\x70\xb9\x99\x83\x21\x1e\xaa\x2f\x25\xa4\x1d\x96\x5e\x76\x3e\x1c\xbf\x3e\xec\x1d\x7e\xf8\x1d\xec\x94\x1e\x4f\x32\x11\x4f\x01\xcd\x63\xf2\x92\x34\xb7\xda\xb6\x99\x1d\x55\x67\x4b\x0f\x54\xc4\x88\x37\xa4\xf8\xbd\xd1\x26\x8d\xf7\xb4\x00\x3f\x44\x1b\xbf\x1d\xed\xdc\x41\x0a\xbb\x9e\xb0\xa8\xc8\x09\xd5\xa8\x68\x36\x9c\x8e\x59\x5a\x74\x1a\x2d\xb2\xe3\xfa\x7f\x31\x8f\x04\x24\x58\x27\x1a\xd1\x6c\xbf\x68\x6e\x55\x3c\xff\x46\x00\xfb\xfe\xfb\x56\x6a\x0c\x72\xc5\xe8\x85\xcb\x20\x25\x5c\x92\xe7\xe0\xf8\x3a\xf6\x0e\x6f\xa0\xd5\x20\xf2\xb6\xc9\x00\xd4\x61\x97\x2c\x9b\x39\xdb\xff\xf2\x1b\x0b\xd9\x61\x23\x9a\x1f\x5f\xa5\x66\xbc\x03\x10\xf6\xe5\xd9\x85\xbe\x17\x90\xf8\xe0\x97\xd9\xf4\x3b\xf4\x19\xf1\x6e\xd2\x2c\x73\x09\x54\x33\x8a\x0e\x6c\xad\xfa\x41\xa6\x60\x2f\x98\x50\x86\x0d\xf2\xd2\xfb\xb5\x83\x8d\x52\xfa\x21\x68\xd6\x6e\xe9\x4d\x2c\x4e\x79\x34\xcb\x9c\x29\xf0\xe9\x9e\x8d\x12\x25\xb5\xb5\xa5\x43\xd6\xac\x69\x07\x1b\xb5\x47\x8f\x64\xa6\x24\xfe\x8c\x9f\xb7\x09\x6f\x4b\x54\x2d\x00\x84\xa0\x59\xe1\x14\xce\xc3\x9b\x6c\x1f\xb7\x00\x35\x8a\x8e\x22\x74\xcf\x69\xdc\xd0\x80\xbb\x11\x9e\x39\x02\xaa\xe6\x95\x36\x69\xf4\xd1\x97\x60\xe3\xdc\x78\x90\xd0\x15\xb7\x60\x34\x6c\x74\x4b\x98\x25\x4f\x5c\x60\x2f\x0e\x87\x81\xda\xe8\x96\x3b\xb4\xaa\x2f\x79\xa8\xcf\x1c\xa0\x5d\x67\x49\x8b\xe7\xd1\x64\xa3\x4b\x5e\x12\x68\xb9\x3e\x7d\x36\x5d\x0c\xf5\xa9\xa5\xee\x09\x1d\x80\x07\x6a\x70\xe9\xe4\x18\x8b\xca\xbc\x3f\x78\x92\xa0\xfb\x3d\xd4\x81\x84\x92\x94\x5d\x39\xee\x58\x07\x24\x65\x2c\x66\x71\x5b\x42\x8b\x62\xc4\xb2\x2b\x9e\x33\x72\x25\xcb\x4d\x68\x9e\x93\x3e\x8d\x2e\x08\xbb\xe6\x79\x21\x47\xac\x2e\x88\x6e\x16\xa7\x49\xd2\x51\x15\x69\xc3\xd4\x81\xf1\x1e\x63\x41\x0b\x81\xe4\x39\x4b\xe2\xdc\x42\xde\x48\x34\xb7\xb0\x2a\xb6\x23\xb6\x4a\x61\x37\x91\x91\x46\x74\x7b\xb8\x84\xd3\x4a\x44\xaf\xdf\x70\xf9\x28\x27\x15\x0c\xff\x25\xc1\x5a\x38\xc2\x51\xd6\xe1\xdb\x2f\x50\x1c\x7f\xd8\x55\x1e\x94\x3c\xeb\xe1\xb0\xb5\x98\x31\xa5\x74\x65\x24\x81\xcb\x7e\xdb\xe5\xb7\x0a\x0f\x4b\xe4\xd1\x9e\x35\xeb\xa9\x38\x18\xa6\x51\x84\x94\xeb\xb2\xab\x51\xda\x50\xb5\x3f\x64\x43\xa5\xcd\x53\xd8\x78\x92\x7d\xd5\x5c\x82\xcf\xa3\xc6\xd3\xbc\x40\xd1\x99\x64\xe2\x92\xc7\xd6\x10\x39\x6f\x5b\x41\x6c\x1b\x41\x08\x75\x78\xd9\xbf\x54\x54\xd9\x9f\xde\xe2\x5c\x76\xca\x76\x65\xa7\xd2\x6c\xe8\xf7\xe9\xb6\xea\xd4\x6d\xdb\xab\xdb\xaa\x5b\xb7\xd5\x4f\xff\x4a\x49\x62\x80\x9e\xdc\x2e\x77\xee\xf6\x79\xc9\xb9\x14\x8d\x22\x75\xa5\x51\x8c\xe4\xce\x4b\x16\x37\x66\xf9\xb2\x4d\x75\xb9\xb7\xea\x44\xd9\xf6\x6d\x4b\x59\xdb\xcf\x5b\x52\xde\x76\x22\x9a\x24\xcd\x79\x6b\xd4\xe6\xb3\x56\xab\x15\xae\x78\x5f\xac\x70\xc5\xbb\xb2\x25\xec\xc9\xe5\xf0\x28\x82\xa5\x57\x55\x33\x5e\xfc\x00\x8b\xaa\x3b\xea\x6a\x28\x51\x6e\x60\x45\x0c\x4c\xb5\xe4\x16\x00\x6b\x6b\xaf\x11\xb9\x49\xde\xf1\xb6\xcc\xcd\x60\xe0\xd5\xad\xd3\x14\x7d\x2d\x3d\x5c\x94\x8f\x8a\xbf\x64\xdd\xe6\x77\xdf\x0f\xf3\xba\xcf\x32\x4f\x71\xa5\xd7\xbb\xc7\xe6\x65\x44\xb3\xb1\x48\x67\x4a\x08\x48\x93\x8f\xc7\xd3\x42\x32\xb0\x45\x9e\x6c\x56\xe1\x3e\x7b\x4c\x1f\xe3\x0b\xe9\x2b\xf0\x85\x78\x49\x13\xbc\x52\x28\xb6\x30\x95\xbc\xa6\x85\xb2\x99\x2c\xba\x4e\x92\xcb\x36\xa7\x70\x73\x90\x08\x91\x71\xfd\xc6\x85\xb7\x49\x84\xd6\xc5\x03\xce\xd0\x6f\xc6\x1a\x71\xa6\x22\x5d\x2a\xa6\x45\xe9\x3c\x0b\x10\x35\xd5\x19\x93\xae\xb6\xf9\x14\x40\x5b\x70\xc8\x69\xb7\xb4\x1a\x51\x07\x4a\x91\x3d\x93\xb0\xeb\xe5\x46\x8c\x27\xce\x89\xcb\x3d\xaa\x85\xdf\x1b\xa4\x2b\x6b\x56\x4d\x83\xb4\x36\xe9\xb6\xda\x6e\x21\x97\x32\xbf\xf2\x4c\x4c\xbd\xc0\x85\x5e\xed\x70\x43\xb1\xe5\x10\xae\x90\x19\x4d\x16\x77\x9d\x4c\x68\x08\x42\xec\x06\x57\x1f\x92\xca\x78\x8b\xfc\x22\x0b\x6c\x60\xc2\x4b\x99\xb0\x43\xe2\x6e\x05\x51\xc6\x86\xd6\xa3\xaa\x4d\xf2\x82\x4d\xc2\x75\xaf\xd3\xec\x72\x8f\x60\x11\xb9\xab\x4f\x31\xf6\x6d\x57\x9f\x52\x03\x73\x9a\x80\x70\x0e\x73\x82\x83\x51\xbc\x69\x94\x48\xc5\xc4\xa7\xc6\x3d\xd9\xd4\x61\xf1\x01\xb8\xc4\x1f\x48\xd5\xd1\x9d\x81\xb8\x45\x68\xdc\x35\x2b\xca\x47\x88\x81\xfc\x02\x54\xa0\xc7\x13\x80\x81\x40\xcc\xc6\xff\x33\x10\x03\xc7\x16\x34\xc9\x85\x72\xb0\x99\x93\x23\x35\xc5\x4a\x1e\xa9\x83\x64\x04\xc5\xe7\x97\x96\x7d\x48\x66\x6b\x97\x5c\x8d\x78\xc2\x48\x53\xf3\xd9\x70\x80\x4d\xac\x88\x21\xb0\xba\x9e\xd6\x94\x79\x37\x93\x40\x4d\x99\xc1\x2a\xca\x87\xc3\xe1\x82\xe5\xe1\xb5\xa6\x37\x90\xab\xc4\x54\xc5\x91\x51\xc7\xb5\x98\xa3\xc8\xf6\xc7\xc0\x23\xb8\x58\xc0\xb1\x0a\x70\x9d\x9c\x15\xa7\x7c\xec\x8c\x24\x6b\xa3\x53\x2f\x7a\x55\xf5\xf9\x06\x23\xd0\x1f\x60\x12\xab\xe8\x78\xfa\x14\x93\x02\xdf\x15\x24\x64\x2f\x56\xb6\xd1\x0d\x89\xfd\x7a\x3b\xe7\x04\x8a\x8d\x27\xc5\xcc\xda\x97\xe0\x3d\x81\x42\xbc\xb1\x81\xb2\xb1\x58\xc5\x4f\x1f\x54\xb1\x67\xd8\xa2\x3c\x08\x9b\x5b\x4d\xd0\xb8\x66\x1f\x67\x86\x84\x7a\x6a\x15\x8e\x30\x96\x3a\x2f\x33\x8b\x2d\xd3\x4f\x4f\xb5\xa8\x15\x5d\x9b\x26\x81\xcd\x7a\x08\x3b\xbc\xd8\xb2\xd2\x59\x74\x4d\xae\x92\x28\x67\x74\x01\x01\xcd\x62\x4b\x62\x6c\xd9\x75\x93\x4f\x25\x6c\xbf\x7d\x2a\x5d\x69\x50\xc3\xb8\x7a\xcc\x5a\x63\x77\x9e\xbf\xe1\x29\x2f\x98\x2a\xed\x0f\x5c\xf2\x52\xbd\x84\x33\x7f\x3b\x36\xbb\x2b\xb3\x35\x35\x1e\x48\x30\x92\x9a\x30\xa1\x39\x10\xf2\xef\xa5\x23\xcb\xce\x8a\x01\x40\x65\xca\xbf\x68\x05\x04\xcb\xd7\xdb\xa0\xf4\x4e\x75\x69\xbf\x07\xe5\xd2\xbf\x8c\xc9\x5b\x86\xba\x37\x25\x66\x1a\xbc\x2d\x9d\x9b\xfe\xf8\xa0\x55\x24\xdc\x66\x24\xa2\x4f\x93\xba\xb3\xc5\x1f\x5a\xbb\xee\x29\x71\x15\xcc\xf6\x33\x0d\x53\x5c\xd7\x2d\x1c\x7f\x56\x20\xda\xf3\x40\x15\xcc\x96\x82\xf9\xf8\xe9\xf8\xf4\xf8\xf4\x3f\x3e\x1e\x92\x3d\xd2\x98\x64\xa2\x10\x72\x4b\xd4\x50\x4b\xd4\xef\xd5\xaa\xc8\xb9\x72\x69\x62\xb0\x9b\x94\x8e\xa5\xe2\x11\xd3\x2c\x72\x8c\xd4\x8f\x4e\x7a\x6f\x8e\x3f\x1d\x1c\xbe\x56\xe7\x30\x64\x5d\xa3\xe8\xbc\xd9\xb5\x30\x6f\xdf\x1d\xbf\xda\x7f\x57\x86\x79\xeb\xc0\x9c\x9c\xee\x9f\x1e\x1d\x94\x61\x4e\x1c\x18\x20\xbe\x0c\xf2\xd1\x01\x79\x75\xf4\xa1\x82\x98\x57\x0e\xc4\x1f\x9f\xc0\x1b\x4d\x00\xf1\x87\xb1\x0b\x37\x67\xf4\x96\xf0\x97\xd8\x43\x3b\xf0\x61\x5d\x21\x36\x9d\x9f\x7b\xfa\x41\xb2\xc2\xf1\x51\xb2\x96\xec\x69\x74\x67\x86\xef\xe6\x82\xb0\xa0\xd9\x10\xd6\x15\x6e\x3d\x4a\x5e\x76\x1c\x8e\xe8\x44\x55\xd1\x0e\x69\x7a\xbf\x21\xac\x6f\xab\x02\x3f\xb8\x34\x11\x57\x69\x9b\x40\xf0\x5d\x54\x7c\xa6\xae\x96\xea\x4b\xb9\x4c\xa1\x63\x66\x4e\xbf\x2e\xd8\x8c\xf0\xd4\xeb\x68\x78\x16\x69\x4e\xa5\x79\x4a\x52\xf0\x07\x04\x39\xe2\x4a\x6e\x67\x1e\x59\x39\x58\x5f\xd7\x0d\x33\xdf\xf0\xbc\x4f\xee\xd1\x9d\x83\x1a\x3d\x39\x49\x04\xeb\xeb\x44\x55\x6b\xae\x4f\x64\x75\x3c\xd5\x6e\x88\xa4\xd2\x47\xc1\xc4\xaa\xe5\xee\x7a\x42\xf3\x9c\xa1\x76\x41\xd7\xb7\x12\xd3\x4b\xaf\xca\x1d\xd5\x0c\x73\xc4\x08\x98\x26\x19\xbb\x94\xfb\x79\xc5\xea\x89\x48\x92\x29\x9e\x4f\x09\x74\xb6\x99\x4f\x68\xc4\xf0\xfd\xa6\xee\x3d\x75\xf4\x61\x7b\x4a\x3d\x5f\x14\x83\xa0\x8d\xee\x19\xe0\x4b\xb7\x7a\x5d\x7b\x9f\xa7\x31\x29\xf8\x98\x65\x70\x02\xa4\x88\x90\x55\xcb\x8d\x2e\x19\x64\x62\xac\xdb\x2a\x79\xc0\xae\xd1\xa7\xfb\x8e\x91\x6d\xb9\xaf\x82\x96\x46\xc5\x75\x13\x62\x04\x21\x8e\x96\xae\xe1\x2a\xa3\x13\x8d\x37\x12\x69\x5e\x64\xd3\xe8\xff\x63\xef\xed\xbb\xdb\xb6\x91\xc5\xe1\xbf\x6f\x3e\x05\x9a\x7b\xd7\x92\x12\x59\x7e\x89\x9d\xa4\xf2\xba\x39\x89\x93\x76\xf3\xdc\xa4\xce\x13\xbb\xdb\xdb\xe3\xc7\x3f\x85\x26\x21\x8b\x0d\x45\x6a\x49\x2a\x96\x36\xf6\x77\x7f\x0e\x66\xf0\x32\x00\x41\x4a\x96\xec\xb4\x7b\x7f\xeb\x9e\xd3\x88\x78\x1d\x0c\x06\x83\xc1\x60\x30\x53\x66\x79\x01\x9d\xa8\xc1\x87\x23\x90\x0f\xcb\x11\x1f\x0b\xbc\x27\xf1\x45\x1e\xe4\x73\xd3\x15\x2c\x12\x67\x06\x0f\x0f\x01\xd3\x2f\x18\xd1\xcf\x1c\xd9\x37\x81\x3f\x5a\x9c\x23\xe8\xb2\x8b\x2e\x0b\x5d\x79\xa4\x1c\xc5\x85\x0e\xf9\x96\x0d\xd9\x91\x2d\x0b\x14\x57\x71\x19\x8e\xc0\xed\xf6\xd4\xf7\xe2\x40\xfd\x85\x41\xc1\xd9\x76\x9f\x08\x66\xec\xa8\xdd\x39\xa8\x96\xd9\x71\xca\x04\xbe\x42\xbb\x6e\xa1\x2e\xbb\xb0\xca\xdd\x54\xf3\xc5\xd8\x88\x29\xad\x2a\x70\xe4\xaa\x40\x70\x18\xc6\x79\x81\xfa\xf1\x23\x59\xb5\xec\x90\x1d\x39\x8b\x98\x6c\xd7\x3f\x6a\xea\x1d\x07\x9f\xc5\x79\x36\x28\xe3\x50\x5d\x21\xaa\x99\x95\xbc\x9c\x8d\x79\x39\xca\xa2\x42\x0a\x3e\x82\x46\x3a\x38\xa9\xc8\x3e\x0d\xe9\xa2\xc3\x64\x9b\x64\x05\x55\x29\x55\x14\xe8\x5e\x80\x7d\x88\x06\x24\x17\xa1\xab\x11\xfa\x54\xfd\x81\x42\x33\xcb\x79\xef\x2f\x47\xc7\x3f\x9f\x9c\x7e\xfc\xe5\xe8\xf4\xf8\xe3\x5f\x7a\x32\xb7\xf7\x97\x9f\x5f\xbe\x7f\xf3\x17\xbd\xee\x15\x38\x66\x56\x95\x8e\xa3\xf7\x25\xce\xcb\x69\x90\x00\x87\x75\xd3\x80\xcd\x76\xd4\x7a\xd4\x20\xdd\x16\x28\x8d\x2c\x0a\x16\xf1\x8d\x60\xf6\x85\x8f\xf0\x6a\x41\xf1\xf3\x8d\x0d\xf6\x9d\xfa\x00\x20\x3a\xb0\xe9\xb6\x55\x9a\x74\x24\x25\x30\x46\x55\xe2\x37\x07\x0f\xb6\xb6\x70\xc7\xb9\x88\xcb\x71\x30\x79\xa0\x77\x49\x76\xc8\x76\x0e\x10\xfe\x61\x96\x87\x3c\xd2\x59\x3f\xb1\x43\xb6\x2b\xb3\x70\x39\xeb\xac\x13\x76\xc8\xf6\x64\x16\xd2\x82\xce\x12\x5b\xdb\xf3\x03\xc5\xe9\xb2\x32\xd3\x39\xaf\x44\x57\x4f\x0f\x34\x17\xd2\x19\xbf\xb2\x43\xf6\x64\xf7\x40\x33\x0f\x9d\xf1\x0b\x3b\x64\x4f\xf7\x30\xa3\x08\x86\xfc\x81\x41\xca\x21\xdb\xd9\x7d\x7e\x80\x0e\x9f\x20\x36\x84\xc1\x39\x50\xe3\x27\xc9\x51\x3e\x3d\xa8\x5c\x7d\xcb\x46\x0e\x2a\xd2\xd6\xf3\x3f\xf2\x96\x5a\x11\x1a\xd1\x57\x69\xdf\x3e\xa0\xbc\xc3\xa0\x3d\xbf\x4c\xe4\xd9\xde\xaf\xc1\x7b\xda\xf1\x15\x6f\xba\x1b\xa5\xe5\x48\x65\xb0\x72\x7b\xf3\x8f\x69\xad\xec\xb8\xff\xf4\xb9\xb7\x78\x73\x5f\xa6\x9c\xa9\xcc\xcb\xd7\xc4\xf9\x7d\x8d\x14\xfa\xfc\xfb\x9a\x0a\x8d\xfd\x59\x25\xcd\x8d\x71\x1e\x4c\x16\x77\xf9\x6c\xaf\xae\x42\xe3\x55\xb3\x5d\xf4\x9b\xa8\x2e\xe1\x3e\x72\x9a\xdb\x6e\xfe\xa7\x39\x6f\xbf\x0a\x0a\x7e\xa4\x02\x91\x18\xa1\x79\x94\x85\xec\x10\x2f\x28\x2c\x2a\x31\xb7\x14\x34\x9c\x74\x36\x29\xba\x2c\xe5\xb3\xf2\x83\xf8\xe9\x68\x23\xbe\x93\xad\x90\xf9\xa7\xd7\x9a\x4e\xdd\x03\x3b\x98\x5a\xed\x55\x4a\xcb\x5c\xa5\xb8\x8f\xb6\xb1\x3f\x9b\x02\x4c\x8f\x78\xe9\xe2\xcc\x96\xc9\xb6\xf0\xd1\x65\x2d\x81\xa4\x56\xa7\xd3\x1e\x65\xa1\x83\xab\xca\x43\xa4\x6a\x11\x34\xcd\x51\xcb\x56\xbd\x85\x3c\x04\xcc\x37\xae\xff\x55\xaf\x14\xbe\xff\x23\xd9\x93\xe3\xf7\xfb\xe8\x8d\xd4\xe9\x6f\x3d\x52\xa2\xde\x60\xf0\xf1\xcd\xcb\xa3\xd3\xc1\xeb\x37\x7f\x3f\x3d\x3e\x7e\xa7\x24\xd5\xc1\xdf\x8e\x8f\xff\x7b\x30\x10\xb0\xe3\xac\xa3\x9e\x5a\x19\x19\x35\xd6\x71\x6f\xd3\xaf\xaf\x97\xaf\xdc\x53\x80\x22\x45\x69\x11\xe3\x01\x63\x3e\x67\xb1\x2b\x50\x24\x44\x58\x8b\x0b\x76\x91\x07\x69\x38\x62\x71\xc1\xa6\x69\xce\x83\x70\x14\x5c\x24\x9c\x5d\xf0\x30\x98\x42\x48\x91\xb8\xa0\x71\x36\xe5\xb5\x6f\x90\x24\xf2\xf0\xb0\xb5\x05\x91\x88\x74\xfb\x5d\x76\x31\x2d\x55\x54\xe4\x28\x56\xd5\xc4\x56\x80\x75\xe3\x94\x45\xfc\x0b\x4f\xb2\x09\x18\x69\x18\x58\x78\xce\x87\xe2\x98\x18\x0f\xa1\xba\x81\xab\x28\xe3\x24\x61\x22\xbf\xcb\x22\x1e\x44\x2c\xcc\x22\xce\x78\x12\x8f\xe3\x14\x1d\x13\x5d\x05\x45\xda\x2a\xcd\x09\x25\x9b\xf0\x3c\x99\x33\x21\x47\xc6\x3c\xd2\x7d\xbc\xce\xd2\x16\x95\xdd\xd9\x98\x17\x45\x70\xc9\x7b\x0c\xde\x1e\xb3\xd7\xfc\xcb\x69\x96\x25\x05\xcb\x79\x12\x73\x31\x56\x16\x97\x3d\xf6\x32\x29\x32\x29\x38\x4e\x73\xae\x1a\x03\xcc\xc8\x06\x58\x94\x71\x01\x01\xcb\xc2\x70\x9a\x83\xce\xee\x4a\xc0\x8b\x91\x9c\x09\x06\xe1\x62\x33\x2e\xf1\x26\x1c\x30\xac\x9a\x0b\xd0\xbc\x56\x7b\xac\x45\xa0\xcb\x51\x9e\x5d\x81\xc8\x0c\x01\x7c\xdb\xad\xff\x33\xf8\x3f\x2d\x1d\xa7\xb1\xcc\xe7\x66\x32\xff\xce\xf3\x78\x38\x67\xe5\x28\x50\xe8\x8f\x38\x0b\x2e\xb2\x2f\x1c\x02\x7d\x5d\x70\x9e\x7a\xb0\xc7\x23\xd6\x7e\x7d\xf4\xa6\x15\x75\xb0\xc3\x25\xa9\xb2\xad\x7e\x48\x6b\xe6\x30\x80\x33\x07\xcf\x73\x42\x5e\x1a\x9d\xc8\xa6\x01\xf7\x79\x50\x8c\x10\xdb\x5d\x96\x0a\xac\x82\x51\xd7\xd5\x28\x30\x94\xf0\x2b\x57\x11\xfe\x70\xe2\x73\x0e\x72\x69\x9c\xe2\x49\xe3\x8a\xe3\x23\x3c\x44\xac\x18\x0c\xd6\x14\x67\xb5\x4c\x48\x4a\x80\x28\x01\x89\xbc\x7f\x7b\xf0\xa0\x76\x6d\x1c\x7a\xd7\x86\x00\xfd\xe8\x0d\xb2\x0a\x05\xca\x28\x98\x4c\x78\xca\x2e\x90\x44\x61\x00\xaf\x8f\xdf\xb3\x8b\x69\x1a\x25\x9c\xf1\x19\x0f\xa7\x25\x2f\x58\x91\xc1\x04\x3c\xb0\xc7\x1f\x06\xa9\x1a\xc5\x45\x10\x41\x10\xd5\x61\x1c\x22\xe9\x46\x53\x30\x5a\x8a\xd3\xdf\x39\x1e\x1a\x1e\x30\xc2\xa4\xc4\x10\x2a\x12\xa0\x8f\xe3\xee\x6d\xef\x83\xa1\x92\x36\x2b\x5f\xb2\xd6\xf3\x8e\x34\xfa\xb8\x6b\x7e\xff\x64\x7b\x6d\xe5\x5f\x51\xd6\xeb\xf5\x76\x9e\xee\x76\xda\xad\xab\xcf\x45\x4b\x2a\xe6\xa6\x10\x15\xd6\x6f\xdb\xb8\x2f\xcb\x9c\xcc\xc7\x17\x59\x83\x36\xb1\x87\x05\xb0\xf0\x2f\x27\x6f\x06\x27\xbf\xbd\x7f\x75\xfc\xce\x18\x49\xa9\x06\x28\x47\xb6\x55\x7f\x85\xcf\x5a\xd5\xc8\x23\xa9\x10\xaa\xa8\x99\x18\x8c\x91\xa8\xc4\xe8\xf7\x21\xd0\x35\x81\x63\x63\x43\x42\x40\x2a\x90\xec\x17\x0a\xbe\xbe\xc0\x46\xa7\xdd\xc2\xcf\x5e\x8b\x3d\x06\xc5\x4c\x47\x6e\xfa\x0a\xd4\x9e\x42\x30\xfc\x5b\x39\x50\x3c\xd9\x59\xd6\x52\x57\x59\xc7\x0b\xb2\x2d\x04\xff\xfe\x04\x17\xf8\x9f\x04\xf3\xfe\x94\x4e\x93\xe4\x93\x60\x7b\x9f\xf4\x56\xf8\x49\xdb\xf7\xc8\xd3\x97\xf8\x39\xe6\xe3\x0b\x9e\x1f\x0f\xd9\x00\x73\xe2\x34\xe4\x6c\xaf\xb7\xdd\xdb\x86\x6f\x1d\x04\xfb\x5d\x90\x5e\x52\xdb\xa0\x47\x37\xf2\x89\xd1\xe9\x88\xcb\x5f\x60\x1a\xc4\xc3\xcf\x3d\xdb\x36\xe8\x42\x45\x7d\xfd\x28\x53\x3e\x89\x5d\xe9\x93\x03\xb0\x80\x37\x2e\x46\x5d\x5c\x4a\x9f\x80\x2b\x7f\xc2\x96\xf8\x2c\x18\x4f\x12\x2e\x81\x1f\xf4\xc0\x9d\x0d\xbc\x4d\x15\x0b\xf5\x91\x58\xf3\x87\x3f\xa0\xd5\x82\x5d\x04\x0d\x58\x16\x14\xfa\x39\xf8\x99\x96\x80\x8e\x6d\x03\x26\xd9\x18\xba\xc7\xf9\xea\x04\xdf\x55\x97\x8e\xb0\x9e\x2b\x24\x08\x55\xab\x53\xbc\xbb\xf6\x22\x0d\x52\xb4\xb8\xa8\x59\x55\x4f\x95\xe2\xfc\xed\x9b\xe7\x83\xd7\xc7\xef\x07\xaf\xdf\xfc\xf8\xf6\xe7\x37\xb5\xda\xfa\x67\xb2\x78\x99\x7d\xc8\xe3\xb1\xf2\xdd\xee\x5d\xd6\xfb\x4a\xfd\x1f\x7d\x30\x7e\x43\x6d\xbb\x0f\x22\xe1\x0e\xeb\x96\xfd\xb3\x0e\x7b\xe1\xaf\x4d\xae\x4b\x98\x63\x4f\x72\xdc\x65\x1f\xba\xec\x65\x59\xe6\xf1\x85\x60\xfc\x38\x1d\x0a\x17\xed\x63\x60\xdc\xa0\x26\x37\xe3\x68\x7f\xe8\xa2\xe5\xe2\x01\x2d\x4a\xda\xd0\x4a\x66\x0b\x55\x1d\xb2\xcd\xab\x4b\xf8\x0f\x55\x00\xec\x7d\x58\x9c\xc8\xb6\x1e\x31\xb8\xd3\x63\x62\xbe\x65\xd3\xad\x4b\x5e\xb6\xc4\x56\x6a\x6a\x0a\x2e\xd2\x2a\x2a\xc9\x1d\x29\x7b\x9c\xce\x27\x5c\xca\x1e\x2f\x43\xb1\x83\x66\x79\x01\x41\x96\x8b\xe9\x44\x60\x96\x47\xdf\xb5\x34\xe4\x2d\xa0\xc4\x4a\x4b\xc7\x67\x1f\xce\xd9\x21\x49\xea\xe9\x97\x59\xea\xa9\x33\x72\x26\x87\x3a\x97\x79\x2a\x50\x4f\x9d\x9e\x47\x03\x0f\xe5\x39\xe7\x61\xdf\xbf\x1d\xee\x7d\xdf\x11\xed\xa9\x73\x2b\xda\x04\xb1\xca\x1b\x86\x27\x77\xf9\x20\xe0\x0e\xcc\xa3\x14\x8d\x97\x79\x90\x16\x49\x50\xf2\x93\x72\x0e\x0a\x18\x95\xf1\x32\x8d\xc7\x41\xc9\x95\xb3\x68\x62\x2a\x3f\x8c\x2f\x5f\xf1\x7f\xc6\x70\x6f\x6f\x27\x9f\x4c\xd0\x30\x9b\xde\x3a\xa0\x3e\x41\xb6\x56\x6b\xf1\xbf\xdd\x71\x4a\x36\x69\x1c\x64\x11\x5d\x85\x07\x45\xbd\xdd\xfc\x93\x3d\xf3\x9c\x60\x5a\xc6\x75\x5b\xf9\x0e\x29\xe6\x0c\xdd\x57\xfc\xf9\x93\x3d\x6f\xf1\x25\xc0\x46\x07\xcb\xdf\x42\x4b\x52\x33\x39\x12\x5f\x56\xf2\xc1\x83\x9a\x09\xb6\x0b\x63\xb2\x29\xec\x62\xca\x42\x85\xb1\x69\xab\x25\x36\x98\x11\x27\xf9\xc0\xa3\x61\xd0\x54\x61\xda\x74\x96\x57\xa3\xf5\xe1\xdd\x9a\xaf\x5d\xc4\x69\x04\xcf\x08\x2c\xe3\x35\xdd\x48\x2f\x6a\x7b\xfb\x7b\x18\x3c\x24\x56\x25\x64\x66\x3f\xbe\x7c\xfd\xf6\xe5\xcf\x78\x5f\x0e\xee\xc3\x21\x78\xb2\xd3\x6b\xc4\x2f\x73\xce\x4f\xb3\x8f\x41\x14\x07\x29\x0e\xb6\xa6\x28\xc4\x62\x4c\x4f\xb3\xd7\x50\x45\x16\xbd\xab\x41\xf0\x9a\x41\x4c\xb2\x24\xc8\x4f\xb3\x23\xe5\x41\x4b\x0f\xe7\xae\x3a\x0e\x6b\x3a\xbe\xe4\xe5\xfb\x60\xf6\x11\xe2\x61\xde\x79\xa7\x17\x35\x9d\x0e\xb3\x7c\x1c\x94\x2f\x67\x71\xf1\x3e\x98\x2c\x9a\xb9\x18\xaf\xdd\x5e\xe1\xab\x4f\x88\x4f\x57\x34\x4e\xe0\x25\x2f\x5f\xa6\x97\x09\x3f\x1e\x42\xe1\xc6\xb2\x12\x12\x2c\x7e\xc2\xc3\x32\xcb\xef\x78\xc6\xa3\x1a\x1c\xc4\xf8\x24\x58\xf5\x5a\xc1\x7d\x3c\x86\x7e\x1f\x6d\xe1\x73\xed\xc5\xcf\x30\xa5\xa7\xc7\x3a\x3e\xbe\x73\x37\xcd\x0f\x08\x57\xf1\x60\x21\x6d\x78\xed\xed\x36\xb5\x1a\x40\xf6\xc3\xfc\xba\xed\xe8\xd9\x6a\x8d\xef\x0e\x06\x10\x87\xb4\xb9\xf5\x5d\x78\x87\x27\x37\x4f\x74\xde\x6e\xc4\x61\x8c\x5c\x05\x91\xf8\x8c\x41\x0a\xdc\x49\x8b\xc9\xb7\x5f\xaf\xaa\xf7\x3a\xf6\xb5\xb1\x7a\xaf\x8a\xee\x5b\x94\xcd\x83\xb1\x73\x8f\xcf\x0f\x4c\x3b\xae\xf5\x03\x71\x6f\x40\xee\x0c\xed\xa7\x4d\xa8\x5e\xc0\x2a\x18\x70\x46\x54\xb4\x2e\xce\x2d\x3b\x04\x76\x03\xff\x29\x2f\xa8\x50\xee\x00\x64\x34\xb3\x07\x3b\xa2\x14\xbc\xd0\x82\x9b\x45\x75\x76\x02\xc0\x24\xb4\x72\x6b\xf6\x4b\x61\xa6\xea\x57\x25\x76\xc9\x08\x79\x15\xd3\x71\xe3\x2c\x9d\xa4\x5d\xe5\x71\x69\xbe\xc5\xb2\xd2\x6f\xff\xc9\x5b\x2e\xe9\xcf\xc2\x0c\x2b\xbb\xf8\x1d\x76\x7d\x39\xb1\xb8\xab\x28\xb3\xb4\x0f\x6f\xd9\x16\xdb\x79\xbe\xad\x9d\x6b\x5a\xbb\x89\xe5\x4d\x93\xe6\xb4\x21\x7c\xaf\x75\x70\x84\x14\xf6\xc8\x6d\x56\xf9\x17\x70\x36\x1f\xd2\xb2\x9d\x83\x2d\xbf\x4d\xb1\x9f\x6a\x0f\x2a\x87\x3d\x12\xed\xb3\x2d\xd5\x9f\xe9\xc9\xdd\x71\xac\xbb\x20\x27\xaf\x1d\xce\xba\x2c\x9c\x77\x19\xc6\x4d\xee\xb2\xea\xb8\xf0\xb4\x34\xeb\xb3\x70\xc6\x1e\x63\x6f\x61\x56\xb4\x37\x25\x1e\x1f\xa9\x2a\x8f\x54\x1b\x50\x7e\xde\x67\xe1\x5c\x95\x2f\xe2\xb4\xbe\x3c\x1a\x43\x12\x77\x50\x7a\xd7\x72\x5e\xdb\xeb\xf4\x36\xbc\x85\xef\xb2\x11\x8f\x2f\x47\xe4\x32\x4b\x5b\x47\xbb\xeb\x8e\xfd\xc0\x76\xe1\xd5\xbd\x5e\x69\xbb\x8e\x11\x10\x3c\xe3\x22\x99\x7d\x39\xec\x32\x9b\xf4\xd9\x76\x97\xe5\xa2\x27\xf8\x75\x91\x95\x65\x36\xee\xa3\xcf\xb4\xa1\x48\x7b\x20\xcd\x28\xa8\x0d\xe5\x38\x4e\xdb\xf0\x23\xb8\x90\xe0\xb2\x4d\x65\x53\xda\x13\xf5\xcc\x03\x72\x99\x08\x3d\x60\xaa\xf2\x88\x24\xea\xe2\x18\x49\xb9\x32\x9b\x54\xea\x22\x4c\xb2\x72\x87\x6d\xb1\xdd\x26\x4f\x0b\x56\xc8\x82\x2e\x9b\xe8\xe8\x9d\x16\x5a\xd1\x4b\x02\xf7\x47\x3b\x87\xeb\x3c\x30\x53\x78\x17\x94\xbc\x28\x31\xa1\xd6\x55\xc3\xfb\x60\xc2\x6a\x63\x20\xd4\x74\x21\x27\x53\x85\x52\xc7\xaf\x6c\xc8\xc0\x2d\xd0\x24\x40\x25\x36\x8c\xe7\xcb\xa5\xf2\xf5\x59\x0b\xc0\xa9\x27\xd6\x05\x2f\x14\xd5\x6f\x82\x1f\x85\x2c\x47\xca\xdc\xac\x8d\x98\x01\x2e\xdb\xe1\x9a\x58\xb4\x94\xd6\xc6\x67\x57\x3d\x1f\xd1\xc1\x6a\xa7\x12\x96\x88\x64\xc5\x56\xa5\x19\xea\xc6\x54\xa2\x4f\x3d\x63\x30\xde\x79\xbb\x06\x1c\xb3\x02\x90\xd2\x0e\x71\x3a\x7a\x38\x9f\xd2\x9e\x44\xce\xaa\xca\xc3\xcf\xae\x36\xd4\x0d\x72\x94\x95\x74\x01\x93\x64\x5c\x70\x47\x76\x11\x95\xa0\xfd\x3a\x87\xb3\xa5\xfc\xd3\x3a\x0e\x78\x2e\xc0\x01\xcf\x25\x2f\x3f\xf0\x3c\xe4\x29\xfa\xcf\x46\x3f\x3c\xd8\x8f\xe0\x51\x92\x36\x71\x80\x5b\x6c\x57\xdb\x37\x86\xf3\xfb\xe9\x73\xae\x16\x82\x5e\x10\xb4\xd7\x31\xe1\x51\xf5\xac\x49\xcd\x9a\x71\x89\x9b\xa6\x3c\xd7\x15\xef\x1e\x6a\xd2\x7e\xd7\xc0\xa8\xa2\xc9\x01\x8f\x9c\x96\xf7\x0a\x01\x69\xdf\x82\xc0\x20\xec\x11\xdb\xee\x3d\x27\x4e\x82\xdd\x40\x45\x92\xe2\x2d\x7f\xe8\x71\xd4\x14\x3f\xcd\xf2\xd1\x27\x5d\xd3\xcb\x56\xce\x62\xea\x99\x4f\x3b\x15\x23\xee\xd7\xcd\x9b\x1d\x19\xcf\x2d\x52\xf9\xea\x9b\x38\xec\x53\x2f\x59\xac\x47\x94\xcd\x9e\x90\xea\xc4\xec\x76\x07\xc3\x48\x4b\x5f\xf0\xf0\xbb\x63\x3f\xa4\xd0\x9c\x0b\xa3\x83\x88\xa5\x26\xb8\x43\x8b\x5a\x1f\xea\xb7\x35\x64\xbd\xea\x95\xea\x06\xe6\xac\x36\x8a\x0c\xb0\xbe\x55\x8b\xa0\xc8\xdc\x56\x1f\x63\x62\xc8\x58\xc4\x98\xb7\x29\x15\x2a\xbb\xab\x9d\x18\xb9\x41\x3b\xed\xe8\x63\xaa\xa2\x41\x8f\xe5\x4a\x05\x64\x74\x74\x70\x27\x23\xe2\x2c\x24\x66\xe7\x0c\x70\xf6\xf0\x9f\x40\xcd\xa4\x11\x20\x64\x74\xe3\x63\xb8\x2b\xa5\x10\x3b\x8a\x0e\xe9\xdf\x1f\x4c\x47\x46\x34\x71\x8a\x9a\x78\x35\x4e\xc4\x13\x19\x28\x5a\x3a\x7f\x42\x92\xc0\x41\xdf\x7e\x6c\x21\x8c\xcd\x13\xb8\x1d\x1d\x9c\x81\x4b\x2a\xb3\x32\x54\xdc\x86\xdb\xf7\xf3\x45\x71\x04\x2b\x3e\x91\xe9\xa4\x6b\x87\xc1\x42\xe4\x7e\x75\x43\xd0\xdb\x98\xbd\xd1\x0e\x2a\xb5\x2b\x70\x15\x53\xa0\xda\x96\xf4\x48\x64\xc8\x46\xd0\x67\x9f\x12\x6b\x4d\xbc\x7f\x7b\xc6\xac\x30\xfb\x5d\x16\x82\xc0\x2b\x64\xe3\x3e\xc8\xc7\x64\x21\xf4\x59\xdd\xaa\xb0\x7b\x25\xbb\x6a\x9f\xf9\x96\x67\x5f\xff\xd2\x0f\x83\xac\xa7\xb1\xcb\x86\x0f\x8b\xa3\xae\x41\x52\x35\x7c\x18\x70\x3e\xaf\xae\x85\x1e\x6f\x7c\x05\xda\x13\xf1\x8f\x38\x14\x80\xdf\x01\x48\x34\xc2\xc6\x6c\x07\xc2\x05\xc7\x69\xd9\x9b\x29\x14\xcf\x4d\xda\x5c\xb1\xf8\x19\x3c\x17\x27\x4d\x90\xe2\x95\xac\x39\x7a\x59\xa6\xb2\x74\xf1\x8f\xbc\x44\x61\x7a\x92\x5d\xb5\x67\x3b\x6c\x93\xcd\x76\xbb\x6c\xb7\xa3\x8e\x17\x22\x79\x2e\x92\xe7\x90\x6c\x3b\x97\xb5\x14\x46\xf6\x81\x82\x66\x41\x28\x8b\x2e\xc4\xac\xd8\x25\x43\x94\x61\x2c\x08\xc4\x2a\x45\x0f\x2f\x54\x85\x76\x85\xa0\x22\x8b\x85\x73\x93\x38\x37\x61\xcb\xd5\xbe\xeb\xc7\xf6\x57\x71\xca\x9a\x75\xc5\xd9\x69\x0e\x33\xc8\x24\x11\xe2\x61\x8a\x98\xcb\xc9\x86\xaa\xe1\xae\xc5\xca\x92\xa4\x28\xcb\xdc\x58\x4e\xe6\xc2\x4c\x74\xdf\x9e\xb1\x4d\x16\xce\xc4\x49\x01\x4b\xe9\x18\x03\xd6\x09\x53\x1e\x91\x03\x71\xdc\x0b\xb3\xc2\x74\x3f\x67\x3f\xb0\x50\x3b\x5a\x71\x2b\xed\x92\x43\xf0\xa6\x9d\xeb\x9a\xd2\xb9\xd0\xca\xf3\x67\xbf\xf9\x4c\xdc\xb5\x1b\xed\x3b\x10\x90\xd3\xa4\x4f\x09\x58\x95\xb8\x69\x36\xd0\xc1\x13\xcb\x21\xb8\x91\x8c\x21\xaf\x59\x32\xc6\x22\x15\xc9\x18\xea\x1c\x01\x05\x5a\xaf\xe1\x74\xe3\x5b\xec\xc9\x53\x23\xa5\xf1\x34\xaa\x14\xd6\x9d\xd8\x45\x9d\xb0\x27\xaa\xa3\xae\x6c\xc3\x12\xa3\xbe\x3e\xb0\x85\x7d\xca\x96\xd8\x26\x34\xf5\x48\x34\x8e\xe3\xaa\xb2\x29\x5a\xc6\x3e\xb6\x3b\x3a\x4f\x8a\x64\x27\x0b\x10\xbc\xd7\x65\x05\x7c\x55\x97\xda\x5e\x75\xad\xed\xf5\xcc\x12\x1a\x54\x97\xb4\xbb\x92\xdd\x65\x24\x7b\xea\x5a\x1b\x84\x68\xda\xa9\xd8\xcb\xad\xdd\x22\x50\x33\xea\x16\x0b\xac\x99\xb5\x45\x7a\xec\xcb\x92\xc3\x65\x73\xb6\xe0\x2d\xcb\x91\x44\xe3\x5d\x5e\x2d\x6e\xab\xe9\xeb\x6b\x05\xf8\x0f\xb4\xa9\x46\xaf\x92\xa4\x31\x78\x79\xe8\x06\x3d\xca\xa7\xb6\x07\xca\x41\xcd\x72\xf1\xac\x12\x07\xa7\xf6\x2a\xf1\x54\x58\xb0\x68\x7c\x35\x2a\x6b\x88\x14\x82\x5d\x43\xe5\xa9\x17\xcd\x24\xfb\x07\xdd\xba\xf6\x1b\x43\x72\x37\x0f\x05\x01\xeb\xa1\x7b\xea\xff\x95\x8c\xc8\xd7\xc2\x63\xbb\x05\xb2\x02\x6c\x7c\xb1\x1f\x0e\x29\x6e\x36\x36\xac\xcc\xbf\x1e\x32\x6b\x90\x62\xbe\x64\x33\xae\x97\x0c\x2a\x0a\x20\xee\xbb\xf5\xcc\x93\xf6\x71\x53\x31\x5f\x36\x5e\xf0\xed\x8b\xc2\x46\x3f\x17\x96\x85\xd2\x16\x1b\x95\xe5\xa4\xe8\x6f\x6d\x5d\xc6\xe5\x68\x7a\xd1\x0b\xb3\xf1\xd6\x3f\x93\x2c\xce\xb3\xf0\xf3\x56\x98\xe5\x7c\xf3\xf7\x62\x2b\x2e\x8a\x29\x2f\xb6\x9e\x3f\xfd\x4f\xf8\x15\x66\xe3\x31\x4f\xcb\xcd\x9d\x9d\xfd\x67\xfb\xdf\x6f\xef\x3e\xb7\xdf\xa4\x56\x0c\x0c\xa4\x95\xd8\x55\x9c\x46\xd9\x15\xbc\x66\x23\xd6\xbf\x1b\x1b\x32\xa3\x27\x18\x1f\x3b\x44\x06\xf8\x80\xb1\x17\xaa\x42\x5f\x35\x50\xf0\x64\xe8\xa9\x2e\x92\xad\xca\xec\x05\xa4\xa1\xb5\xa1\xf3\xac\x3b\xe5\xb3\x52\xbf\xed\x4e\xf9\xd5\xa6\xc0\xcf\x03\xc6\xfa\x4c\x7b\xca\x69\xa9\x45\x35\x12\x47\xa9\x76\xc7\x71\xa0\x78\xe9\x3a\x50\x84\x70\xba\x30\xf8\x5b\xbb\x50\x7c\xb2\xde\x53\x60\xb0\x0f\x0e\xd2\xcf\xad\x82\xbd\x7d\xf3\x1c\xee\x1b\xa4\x55\x6d\x3a\x77\x4c\x73\xaa\x66\x1f\xdf\x79\xed\x92\x76\xe8\x33\x01\x9f\xdb\x7d\x8f\xd0\xda\x0a\x5a\x82\x84\x6d\x07\x31\xf4\x1a\xed\x19\xdc\x4e\x74\x7a\x81\x98\xbd\x67\x07\xe8\xfb\xc5\xc1\xc4\x32\xcf\x74\x16\x5a\xd5\x95\x23\x2e\xf2\xce\x92\x20\xbd\x9c\x06\x97\xa8\x23\x3c\x6f\x0b\x1a\xef\x6f\x6d\x5d\x5d\x5d\xf5\x78\x38\x0e\x36\xc1\x16\x01\x6d\xa4\x83\xa4\x97\xe5\x97\x5b\x90\xbc\xfb\x74\x77\xeb\x59\x6f\x7b\xeb\x3f\x0b\x1e\x6e\x8a\x94\x22\xcc\xe3\x49\xb9\xa9\x5a\xdb\x14\xad\x15\x1d\x70\xde\x35\x64\x9f\x10\x21\x9f\x7a\xac\xcd\x7b\x97\x3d\x16\xe4\x79\x30\x27\xfe\x54\xc5\x79\x02\x4a\x14\x42\xe4\xbf\xe4\xa0\xa5\xfc\x94\xf2\x2b\x86\x0e\x6a\xdb\xdb\x9d\x4f\x62\x9d\x47\x98\x88\x9a\xc9\x76\xab\xd5\xf9\xd4\x59\xd6\x0c\x70\xbb\xb7\xf3\xad\xcd\x00\x83\x54\x8e\x6a\x39\x43\x40\x79\x08\xc5\x47\xcc\x35\x46\x7e\xb2\xcc\xd9\x4e\x97\xed\x76\xd9\x93\xf3\xc5\x45\x07\xbd\x34\xcb\x26\x8b\xcb\xb9\x26\x88\x5e\xdb\x41\x59\x96\x98\x0f\xc2\x29\xda\xf2\x02\xe8\xda\x65\x21\x22\xa5\x93\x31\x88\x13\x2b\xe3\xd9\x19\x87\x7a\xd7\xd7\x4c\xa7\x69\xa3\xd8\x4e\x9d\x15\x22\x02\x51\x5d\x15\xeb\xbd\x0e\x81\xad\x36\xe7\xfc\xa7\x26\x77\x01\xbb\xcf\xe1\xa6\x74\xeb\xd1\x23\xf6\x1a\xc2\xcc\x41\x15\x81\x84\x18\x9e\x3c\x7c\x12\xbc\xf4\x53\x4f\xeb\xbc\x73\xce\x4f\x04\x23\x3e\xb4\xd8\xb2\xe3\x4b\x10\xd2\x14\x6f\x56\x96\x90\x87\x4a\x29\xa1\x72\x64\xb7\xbf\x14\x3c\x62\x41\xc1\x02\x96\xab\x90\x64\x82\x48\xcb\x11\x57\x9b\x0a\xb6\xac\x61\xc8\xb3\x0c\x0e\x80\x66\x68\xd7\xd7\x06\xb0\xeb\xeb\x26\x5e\x5e\xc5\xbe\x68\xad\x82\xf9\xbd\xf5\xec\xb4\xef\xc9\xd5\xd7\xe9\x7c\x92\x5d\xe6\xc1\x64\x34\xaf\x7d\xbf\xb7\xfd\x07\x7b\xfb\x32\x20\xfe\xf1\x0e\xbf\xf6\x96\x36\xd5\x06\x01\xe6\x40\xee\xa8\x71\xc1\xae\xb2\xfc\x33\x3a\x25\xc8\xd2\x4d\x9c\x47\x21\xd7\xf0\x07\x62\xb3\x6f\x53\x53\x91\x07\xff\x41\x48\x4c\x6c\x6d\x40\x64\x68\x9b\xfa\x1f\x4e\x73\x43\xc6\xbf\x04\x09\xb0\xd1\x24\xc9\xae\x78\xc4\xda\x05\xe7\xec\xe8\xe4\x43\xe7\xc1\x7f\x80\x18\x61\x11\xef\x43\xd2\xf2\xc3\x4e\x1b\xdc\xa9\xb4\x77\xba\xa2\x8d\x4e\xfb\x21\xa6\x1e\x3c\x90\xd6\xad\x60\xdc\xea\xe9\x51\xac\x22\x29\x48\x99\xd5\x25\x20\xf8\x12\xc4\x89\x98\xf3\x07\xff\x11\x0f\xdb\xb6\x88\x26\x56\xea\x43\x5c\x73\x0f\x3b\x0f\xfe\x03\x40\xc3\x2c\x7c\x15\xb1\xc5\x2e\xe1\xf1\x06\x3e\x44\xb9\xe0\xd4\x43\xe1\xc5\xb4\x64\x69\x56\x8e\xe2\xf4\x52\x2c\xe2\x28\x63\xc1\x45\x36\x2d\x59\x5c\xf6\x7a\xbd\x07\xf8\x8e\x45\x8e\x8b\xd4\x8a\xd3\xa2\xe4\x41\x24\xf6\x55\x55\x19\x1f\x36\x15\x19\x8b\xcb\x56\x21\x2a\xf2\xa0\x88\x79\x2e\x1a\x45\x4f\x4f\xf2\xa5\x4b\x50\xf0\x1e\x8b\x87\xed\xef\xa4\xc3\x02\xf6\x95\xf5\x7a\x3d\x1f\x9b\xbd\xac\xae\xf2\xf5\x0c\xbd\xef\xcd\x62\x55\x7a\x8e\xae\x98\x98\xca\xb3\x43\x9d\xbb\x6a\x63\xaf\x29\x0b\x36\x79\xab\x56\x6d\xe9\x3a\x38\xe1\xbf\xc6\xe5\x28\x9b\x96\x12\xfa\x98\xd7\x76\xb6\xbf\xa8\x62\x53\xe7\x75\x7d\x75\xbc\x8f\x2f\xd1\x43\xe9\xab\x9c\x07\x9f\x41\x21\x59\x7c\xab\xf7\xb7\x17\xc1\x05\x4f\x3e\x24\xd3\xcb\x38\xfd\x31\xc9\xae\xe0\x7d\x93\x80\xf6\x54\x08\x82\x83\x49\x9e\x4d\xc4\xc2\x19\x18\xc8\x6a\x70\xb5\xdd\xe9\x65\x29\x3f\x1e\xb6\xcf\x5a\xb3\xa2\xd5\x65\xad\x62\x2c\xfe\x3f\x8e\xc4\xff\x13\xf0\x9c\x3b\x4b\x5a\x10\x6c\x69\x6b\x8b\x9d\x80\xfd\x38\x7b\x79\x72\xc4\x2e\xe6\x10\x4e\xa1\x27\xe4\xfc\xb2\x55\x48\x1b\xa9\x20\x2d\x61\x29\xbd\x2d\xc5\x32\x6c\x95\x62\x09\xaa\xeb\x78\xdc\x4a\xc5\x9a\x61\x60\x4b\x87\x32\x64\x90\x24\x73\xe5\xcf\x01\xa1\xef\x3d\x90\x96\x49\x05\x31\x71\x96\x9f\xcd\x50\x22\x90\xff\xcd\xf9\x44\x30\xc8\x31\x78\x1e\x19\x05\xa5\x90\x51\xa3\x38\x60\xe0\x85\x23\x4c\xa6\x45\xfc\x85\xab\x10\xf7\x47\x27\x27\x2a\x00\x08\xbe\xef\xea\xb9\xee\x67\xc9\xe4\xb6\x2f\xcc\x6f\x23\x90\x0d\x48\xea\x7f\x7d\x51\xf1\xd9\x49\x22\x1a\xcf\x6b\x25\x8d\x2e\xe2\xad\xe8\x18\x8c\x48\xc3\x98\xa2\xcf\x76\xb0\x7e\x31\xee\xb3\xa7\xdb\x52\x7b\x36\x8e\xfa\xec\x7b\xa5\x4a\x4b\x2e\xfb\x6c\x67\xf7\xb9\xfc\x9a\x25\x7d\xb6\xf3\xfd\x2e\xa8\xd0\x58\xdf\xd7\x97\x82\xc7\xca\x9a\xa6\x71\xe9\x40\x2f\x92\x54\x59\x99\xed\xa9\xe2\xc0\xdd\x9a\xcc\x5a\x6e\xb7\xb4\x21\x2b\x43\xba\xf0\xa2\x9d\x8a\xa4\xae\xed\xe1\xcb\x53\xc5\xe9\x74\xdf\xed\x91\xb6\x02\xfa\x7f\xf5\x0e\xbd\x8e\x31\x98\xb7\xdb\xa4\x99\x2e\x3b\xc3\x77\x12\x40\x7a\x62\x14\x40\x82\x25\x9f\xe0\xc2\xa0\xee\x2b\xa7\x13\xea\x1e\xfc\x0b\x09\xa7\x84\x2d\xa0\xfd\xd8\xf5\xb5\xa0\x6f\xcb\x4f\x63\x4b\x12\x69\x7b\x1c\xa7\x9b\x70\xc1\xdf\x6f\xb1\xc7\xb2\xf6\x63\x44\xfc\x63\xd6\xea\xb4\xb4\xaa\xc5\x5c\xab\x64\x57\xe9\xda\xbd\x06\x33\xd2\x2b\x9e\x39\xd8\x26\xa2\x7e\x8b\xed\x6c\x6f\x77\x16\x00\x21\xc3\xaa\x78\x5c\xc8\x69\xd5\xb4\xf2\xe3\x2f\xd6\xb2\x76\xa7\x4d\x3d\x32\x4a\xad\xb4\xb7\x9c\x71\x33\xb7\x04\xc2\x60\xc0\xc5\x99\xe9\xf5\xfc\x9c\x82\x0f\x67\x5b\x18\x67\xcb\x3b\x70\x59\x9d\x46\xb3\x3b\x3f\x6f\xc0\x46\xa7\x8a\x8e\x2c\x4d\xe6\xee\x9c\x7c\xe6\x73\xef\xd0\x3e\x43\x84\x7e\x75\xbf\x6d\x4a\x1d\xca\x72\x26\xd8\x4e\xc5\x31\xb9\x24\x37\xea\xf8\x5c\x85\xff\x90\xf3\x01\xa6\x90\xaa\x8c\x0d\x23\x46\x7b\xa9\x7a\xb3\x27\x34\xe3\xea\xf5\x60\xf1\xa8\x2d\xdc\x2c\x16\xac\x2e\x80\xed\xc3\xff\xbb\x0f\x0c\xa3\x93\xf6\x97\x32\x6d\x3a\xe9\xb3\xa9\x5c\x93\x82\x6e\xfb\xf0\x7f\xfc\x96\x20\xf7\xd5\x0f\x4c\x15\x98\xec\xc3\xff\xf1\x1b\x27\x0b\xff\xc1\x4b\x48\x58\xd9\xea\x59\x2c\x95\xa1\xd6\x7b\x8e\xf4\xe7\x08\x03\x72\xc9\xcb\x0f\xca\x10\xf7\xb8\xee\x4d\xdc\xf3\x9a\xe2\x4d\x0f\x62\xec\x92\xba\x81\x30\x09\x8a\xe2\x28\x48\x12\x50\x63\xd5\x89\x58\xdf\xd7\x94\x6f\x92\xac\x9c\x96\x4d\x0b\xe8\xe5\x5d\xe4\xd6\x46\x3b\xd9\xf6\x95\x6e\xec\x8c\x34\xaa\xeb\x4e\xb2\xa2\x88\x2f\x12\x7e\x64\xbc\x84\xa1\x4a\xa9\x3e\xca\xca\xe2\xba\x4d\x50\xd4\x77\xa8\xdb\x8d\xd3\x11\xcf\xe3\xb2\x7e\xe8\xd5\xa2\x4d\x3d\xea\xe6\xfe\x05\xe3\xc8\xfc\xa9\x64\x7d\x68\x53\x5a\xe3\xd7\xbd\x7d\xdd\x77\x0a\x36\x0d\x12\x4b\xd0\x53\xc4\x55\x5c\x8e\x8e\x65\x64\x31\x71\x8a\xd5\x5f\xaa\xd1\x1c\x7c\x5c\xd4\xcc\x9b\x21\x4c\x25\x37\xd7\x4a\xf8\x95\x92\x4d\x70\xea\x42\xb7\x71\xce\xb4\xb3\xf3\xe4\x6e\x9c\x33\xdd\x53\x14\x1e\x04\x0c\xdf\xbf\xd6\xe1\x69\x7f\x57\x73\x51\x5a\xd2\x6e\xfc\xd7\x38\x89\xc2\x20\x8f\xda\xba\xb5\x26\xdd\x91\x2e\x2d\x8f\x7c\xe0\xff\xd1\x77\xde\xb3\xcf\x83\xe4\xc5\x81\x80\x26\xe5\x57\xc7\x17\xbf\x83\x27\xb8\x03\xdd\x84\xd4\xf0\x5a\x8f\x42\xec\xe7\x11\x4b\xbf\xe4\x50\x2f\x26\x3a\x1d\xd9\x95\xf6\x36\x27\x7f\xe2\x0b\x0e\xcc\x23\x67\x5f\x80\xd4\xf8\x08\x3c\x46\xc0\x6f\xbe\xd1\x01\x58\x26\xbf\xf9\xc2\xd3\xd2\xac\x22\xb1\x8f\x86\xc1\xa4\x9c\xe6\xbc\x8f\x4a\x75\x21\x34\x4c\xc4\xe2\xfb\xa2\x52\xc0\x3b\xdd\x23\xe7\x36\x8c\x4d\x40\x07\xb5\x59\x4c\x72\x1e\x44\x42\x6e\x30\xc3\x18\xf3\xfc\x52\x01\x4f\xfb\x6b\xcb\xb8\x80\xd5\x30\x42\x92\x1d\x10\x01\xe9\xa6\xeb\x83\xb8\xab\x42\x0b\x3a\xa1\x80\x2e\x39\x16\x7b\x17\x17\x25\x4f\x79\xfe\x32\xbf\x2c\xda\xe0\xc8\xf2\x67\x70\x4b\x2b\xe6\xed\x22\x08\x3f\x9b\xfa\xfa\x34\x2a\x03\x64\x9c\x79\x4a\x83\x34\x27\xf2\xd1\xdd\xb8\xa2\xe0\x9e\x44\x0f\xc2\x24\x30\x2f\xd1\xd9\x57\xbf\x7a\x12\xa5\x34\x3a\x8d\x68\xc7\x06\x3a\x4b\xe5\x4b\xa5\x2e\x5b\x0c\x2a\xf8\xe9\x56\x00\x04\x51\x64\x0d\x57\xc9\xa3\xd8\x5c\x25\x5b\xb9\x9b\x94\x9d\xdd\x1e\x59\x6e\xfc\x53\x03\x48\x59\x06\xe1\x08\x5a\x23\x6e\x71\xde\xbe\x79\xfe\x98\x9d\x60\x19\x0b\x2e\x53\xba\xdd\xca\x52\x71\x7e\x20\xdd\xba\x97\x95\x60\xb1\x25\x41\xc1\x85\x27\xdf\x75\xd1\xf0\x85\x37\x36\x46\x87\xc3\x55\x51\x9a\xf3\x71\xf6\x85\x37\x61\xd5\x53\xe2\xfe\x10\x1b\xf1\xdb\x20\x96\x94\xf6\x20\x56\x75\xeb\x41\xd8\x30\xcb\xdf\x04\xe1\x48\x01\xac\xde\x37\xc4\x25\xcf\x83\x92\x93\x4b\xb4\x70\x14\x27\x51\x0e\x81\x83\xa4\x29\xbe\x4c\x50\xda\x02\xed\xac\x18\xb3\x25\x4a\x94\x55\x89\x00\x06\x5c\xcc\x2d\xaf\x4f\x90\xa0\x9c\xb5\x54\x4f\xad\x2e\x6b\x61\xb3\x5a\x8b\xe0\x0b\x41\x66\xfa\xea\xf4\xe4\xf0\xda\x3e\xf7\x34\x38\xff\xe2\xbb\x57\x4c\x2f\x30\xee\x95\x68\x6f\x17\x83\x5a\xb5\x88\x23\x31\xea\x89\xcc\x32\x75\x16\x30\xb2\x43\x32\x3c\x74\x5b\x43\x2c\x78\x9d\x08\x64\xd9\x64\xe5\x08\x64\xd9\x84\x1c\xfa\xd5\x35\xa3\x72\x53\x4d\x03\x80\xd1\x52\x24\x98\x5f\x59\x0d\x42\x46\x4c\xe5\xbf\xd3\x2d\x6e\x6c\x80\xef\x77\x59\x66\x21\x0a\x24\xa7\x93\x5e\xa2\x25\x2a\xdb\x9b\xcf\x3a\xbd\x32\x7b\x97\x5d\xe9\xa0\x73\xd0\xb3\x2c\x4c\x40\xd4\x64\x6a\x37\x20\xe6\x62\xd7\x69\x02\x2b\xd1\x0a\xaa\xef\x17\x26\xd5\x9e\x4b\x93\xac\x55\x02\xcf\x3a\xac\x6f\xd2\x09\x06\x14\x02\x88\xb5\xbf\x5c\x05\x74\x09\x8b\x79\xe8\xe1\xa5\x45\x2e\xbf\xcc\x8e\xc4\xaa\xf6\xf2\x75\x6d\x74\xeb\x37\xc9\xaf\x66\x43\x56\x03\xbc\xe9\x50\x6f\xb1\xce\xde\x47\x04\xe1\xb6\x86\xcc\x62\x74\x6b\x86\xc4\xca\xd4\xde\xdb\x02\x01\x7b\x13\x86\xb2\x99\x48\x9e\xd1\x67\x27\xe8\x40\xec\x82\x9b\xc8\xd0\x7a\x4b\x8c\x2d\xf8\xea\x02\x16\x22\xb6\x24\xf0\x7d\xf5\x43\xaa\x33\xb0\x6a\x7f\xb1\x54\x21\x8d\x1f\x51\xdc\xb1\x18\xb1\xe5\xa1\x6a\xe0\x78\xdc\x84\x51\xeb\xa3\xa2\x19\xb6\xd5\x42\x97\x0d\xa8\x67\x49\xaa\x15\xb2\xca\xe9\xbd\x0b\x5a\x75\xce\xfa\x24\xca\x18\x78\x7e\xb6\x77\x1b\x4b\x59\x07\xd5\xeb\x8f\xd0\x6e\x4b\x36\xb0\xbd\xc1\x00\x24\xd8\xc1\x00\xee\x19\x45\x53\x8e\x9a\xa3\x66\x94\x9d\x4e\x8d\x67\x6a\xa3\x0c\xc3\x71\x11\x9d\x42\x2d\xc2\xce\xb4\x92\xab\xcf\x5a\xa1\x42\xde\xeb\x38\x7a\x9f\x4d\xd3\xb2\x45\x54\x5e\xe4\x7a\xba\x52\x8e\x08\x03\x02\x28\x21\xdb\xa8\x2e\x8a\x36\x5d\x15\xea\xb1\x01\xf6\x87\x4e\xed\xf4\x94\xa1\x03\xd5\x9a\x3e\xbd\x65\xdb\x15\x8f\xaa\xcb\xf9\x54\x05\x20\xbd\x8e\x55\xbd\x70\xea\xf1\xfe\x1a\x27\x49\x23\x94\x9e\x92\x2e\x6e\x50\x42\x59\x06\x3d\x14\xcd\xcb\xf5\xaa\x0b\xae\x38\x21\x36\xf8\xe9\x78\x19\x1a\x20\x45\x57\x1f\x2a\x85\xaf\xa6\x43\x7b\x08\xce\xf0\xc4\x7a\x30\xb9\x59\x5a\xdf\x93\x03\x53\x4d\x67\x15\xc8\x9b\xfb\x1b\x0e\x1b\x86\x66\x95\xad\x1b\x9c\x3b\x80\xe3\xfc\x78\x38\xb4\xbd\xf2\x6b\xe1\xcd\x50\xaf\x94\xe0\x50\xce\x52\x7b\xa4\x76\xac\xa0\x5f\x52\xc1\x1e\x8e\xef\x7c\x45\x75\x55\x47\x65\x13\x73\x4b\xd5\x07\x09\x83\x6b\x3b\xec\x37\xcd\xa0\x81\xc2\x19\xd6\x38\x27\x0e\xf4\x4d\xc3\xae\xe0\x4a\x97\x9d\x1c\x62\xef\x22\x4e\x23\x30\x1c\xeb\xaa\xb6\x3b\x1d\xe7\x71\x9b\x6f\x12\xd3\x88\xe7\xb5\x73\x27\x32\xdb\x15\x8e\x40\xd0\xa6\x05\xe5\xeb\x6b\x1d\xb7\x52\x76\x74\x4e\x8f\x83\x16\xb3\x3c\x78\x70\xd3\x46\xed\x55\xcf\xda\x65\x6c\xae\x4e\x15\x57\xcb\x6e\xe9\xe8\x02\xf8\x91\x00\xe2\x11\xfb\x2d\x9b\x82\xb1\x87\x0a\x4c\x19\xb0\x22\x06\x7b\x64\x00\x9a\x95\x59\x06\x8e\x46\xc1\x13\xb0\x1a\x47\x9f\xaa\xc1\x14\x9b\xeb\x49\x7c\x76\x69\xeb\xa7\x23\xce\x5e\x1f\xbf\x57\x13\x5d\x66\x0c\x45\x04\x56\x92\x66\x31\xd3\xdf\x28\xdc\xab\x8b\xb4\xf6\x99\x37\x5b\x1a\x2b\xfa\xf2\x90\xa0\xce\x3b\xbd\xb8\x90\xba\x93\xe8\xc1\x0d\xeb\xb3\xaf\x37\x3e\xff\x4c\x0e\xee\xef\xde\x35\xe8\xde\x32\xee\xd3\x16\x9a\xc0\xe2\x80\x37\x93\xf8\x33\xef\xb1\x97\xf2\x86\xd2\x4e\x17\x35\xc0\x40\x20\xcd\x4a\xe9\x88\xf2\x01\x38\x73\x88\xc0\x25\x6e\xc0\x3e\xe1\xea\xfb\x24\x9f\xaa\xb1\x6c\xa8\xcd\x81\xfe\xcc\x2e\x2a\xc9\x10\x6f\x63\x9d\xfa\x2e\xfe\xcc\x97\xb1\x50\x85\x72\xcb\x5b\xa9\x42\xf1\xaa\xa5\xaa\xb2\x41\xf5\x14\xbe\x85\xb9\x2a\x94\xaf\xf3\x78\x49\xec\x52\xa9\xfd\x2a\xb3\x8e\x7b\x4d\x76\xa8\xa2\xf5\xaa\xad\xd4\x9f\x32\xf8\xe9\xab\x69\x59\x66\xe9\xab\xa0\xa8\x8d\x9e\xb0\xb7\xfb\x07\x5b\x44\x1a\x10\xff\x04\x16\x91\xcb\x3c\x0d\x69\x36\x28\xbe\x08\x0a\xfe\xb6\x68\xba\xa7\xd8\xdd\xde\xeb\x18\x97\x25\x1f\x78\x3e\xcc\xf2\xb1\xe0\x2b\x11\xe7\x13\x10\xd4\x82\x3c\x2e\x8c\x35\x03\x2b\xaf\x32\x65\xaf\x53\x66\x2c\xe2\x25\xcf\xc7\x71\xaa\x5c\x9e\xcf\x59\x90\x83\x59\xbf\xe8\xe0\x4b\x90\xa0\x7b\x74\x68\xfb\xd1\xa3\x9f\xb3\x92\xf7\x1f\x3d\x42\xa3\x47\x19\x29\x44\x5f\x2c\xc8\xae\x20\xf8\x3d\x1a\xe7\xc3\xbf\xec\x62\x3a\x1c\xf2\xbc\xe8\x32\xc9\x57\x0a\x08\xc8\x0d\x21\x38\xb4\xc9\x3e\xf8\xcb\x36\x9f\xe3\x00\x64\x73\xb0\xdc\x2f\xba\xda\xf8\xbf\x6a\xe2\x2f\x5a\x2a\x78\x09\x6f\x86\x45\xd7\xe2\x07\xf8\x1b\x2e\xd0\xd8\x5f\xac\xc8\x48\xc2\xd3\xab\xb4\x23\x86\x2a\xc1\xe6\x91\x68\x0a\x0d\xa8\xe2\x1c\x43\x6e\x09\x86\x2d\x0f\x9d\x3c\xa2\xbe\x96\xa4\x73\xf7\x32\xe6\x45\x4f\x1b\x90\x16\xd0\xe1\xeb\xe3\xf7\xa2\xa1\x34\x8b\xb8\xdd\x3c\x18\x97\xa1\x69\x2b\x17\xb3\x19\x97\xf3\x2e\x8b\x7b\xbc\xc7\x3e\x1d\x1e\x1e\x2e\xef\x8c\x78\xf5\x57\x08\x08\x48\xcf\x29\x89\x26\x44\xe0\x2a\x06\x7e\xf9\xcb\x2f\xb3\x37\x94\xaa\x37\x1c\xb8\xa1\x9f\xc5\xdb\x03\x38\xd8\x50\xda\xb2\xaf\xac\x15\xb4\xfa\x6c\x07\x5e\xe0\xca\x3c\x69\xe7\x64\x67\x29\xa6\x0e\xab\xa3\xad\x64\x0f\x65\x39\xe1\xdb\x2f\x32\x63\x1b\x0f\xc5\x16\xb1\x7f\x6c\x59\xfa\xda\xc2\x86\xe9\x06\x40\x16\xa7\x5d\xa8\x8e\xe1\x43\xd1\x2a\xaf\x6f\x7c\x97\x74\x37\xae\x26\x97\x77\x6e\x37\x28\xf2\x70\x70\x11\x17\x3c\x2c\xeb\x5d\xe7\x41\xb8\x42\xd2\x7c\xce\xef\xcb\x31\xe2\xd2\xa0\x42\x88\xe7\x3a\xcf\x89\x1a\x3e\x2c\xfd\x11\xfc\xd2\x78\xbd\x20\x3a\x25\xdf\xf1\x61\xe9\xb8\x3f\xbc\x85\x5b\x3e\x01\x5f\x50\x84\x1c\x50\x52\x8b\xcd\xe7\x3b\x77\x8d\xcc\x3a\xc7\xa0\xb7\x01\xd6\xc6\xe7\x0a\x6e\x03\xcd\xe4\x64\x79\x3d\x25\xc1\x13\x8a\x3b\x1d\x7c\x9d\x5f\xcf\x5b\x00\xbb\xde\xd8\x9f\x60\x73\x61\x9e\x15\xf5\x1e\x13\x9f\x3f\xdd\x6d\xa6\x54\xa8\xbe\x22\xe9\xed\x21\x04\x11\x5f\x4c\x7b\x4f\x9f\x34\x83\x61\xda\x58\x11\x96\x7d\x05\xcb\x97\x18\x8c\x91\x1b\x48\x61\x01\x46\x74\x13\x2b\x42\xf2\x14\x21\x01\x53\xbf\x06\xde\x06\x21\xfc\x1b\xc0\xc0\xfa\x2b\xc2\xf0\x0c\x61\x18\xc5\x45\x99\x5d\xe6\xc1\xb8\x61\x62\x16\x80\xa1\x9b\x58\x11\x92\xe7\x08\x49\x39\xca\x79\x31\xca\x92\x68\x30\xcc\x39\x8f\xc6\x41\xfa\x3a\x0e\xc2\x2c\x8d\x9b\x48\xf7\x59\x33\x68\xba\xcd\x1f\x9d\x26\x57\x04\xf5\x7b\x17\xd4\x22\xcc\xca\xfa\x19\x7c\x0e\x61\xd5\x96\x81\xef\x44\xb4\xb3\x2a\x7b\xdf\xae\x40\x55\x4e\xf3\x4b\x5e\x8f\xb7\x27\xcb\xc3\x85\x2d\xad\x0a\x99\x64\xe6\xe3\x60\xd6\x80\xa3\xef\x9b\x61\x19\x07\xb3\x55\xbb\x97\xec\x74\xcc\x83\xfa\xc5\xfe\xfc\xd9\xf6\x82\xfe\x79\xb0\xea\x3a\xdf\x79\xa2\x00\x88\xe2\x46\x10\x76\x16\x81\x40\x3c\x63\xdf\x1a\x88\x3d\x05\x44\x7e\xc9\x1b\x60\x58\xc0\xf3\xa0\xfa\xaa\x20\x48\xd6\x3b\x8e\x9b\x98\xee\x22\x3a\x88\x57\xc6\x80\xe4\xb7\x93\x20\xce\x9b\x16\xc5\x82\x59\x80\xea\xab\x82\x20\xd9\xed\x84\xe7\xe3\x69\xd9\x34\x0d\x0b\x76\x41\xd9\xc0\xaa\x60\x48\x5e\xfb\x8f\x69\x90\x96\x71\x52\x0f\xc7\x2e\x44\x09\xba\x53\x69\xa8\xce\xd9\xf6\x6d\xa0\x5d\x4f\x1c\xda\x91\xec\x1b\xdc\xb2\x35\xd0\xc1\xd3\xbb\x1e\x7a\x9d\x67\xf9\xa5\x41\x5d\x53\x04\x96\x1b\x44\x11\x36\x32\xa1\x05\xdb\xbc\xa8\xbd\x22\xd9\xed\xca\x7d\xa0\x18\x4d\x87\xc3\x06\xaa\x7b\xfe\x6c\x7f\x01\x0c\xd8\xc0\xaa\x60\xc8\xfd\xa0\x98\x36\x48\x3b\xcf\x9e\x2e\x00\x61\xba\xaa\x9c\xb3\x2b\x77\x03\x70\x77\xd7\x40\x7e\xcf\xee\x9a\xfc\x46\xb7\x3f\x87\xd8\xa0\xfa\xc9\x6f\x7d\xc0\x86\xeb\x03\x76\x71\x2f\x80\x5d\xae\x0f\x58\xb8\xce\x82\x95\x5b\x36\x44\x0f\x99\x64\x45\x03\xb3\x5a\x24\xbd\xe8\x26\x56\x25\x5a\xb9\x75\x83\x5f\x88\x34\x6c\x62\x9b\x0b\x76\x2e\xd5\xc2\xaa\x80\xc8\x4d\xfc\x9f\xf1\xa4\x61\xf1\x2e\x38\x0f\xfc\x33\x9e\x80\xf5\x71\xd3\x9f\xad\x11\x6b\xf4\x4f\xf3\xe7\x08\xbe\x52\xb7\xb1\x46\xd2\x6f\xf5\x09\x0f\xb3\x34\xfa\x66\x51\x4b\x54\xb7\xef\xe3\x74\x5a\xf2\x6f\x16\xb7\x44\x75\xfb\xb7\x6c\x5a\x0d\xd8\x71\x5f\x6a\x2c\xd5\xe9\xeb\x60\x7e\xe7\x7d\xd6\x09\x0d\xaa\xcf\x5f\x39\xff\x8c\x9d\x82\xc5\xbe\x35\xd9\xec\x90\xed\xf0\x27\x76\x0e\xce\x07\x3b\x64\x4f\xf9\x9e\x9d\x23\x50\xc6\x0e\xd9\x93\xa7\x7c\xdf\xce\x78\x1d\xcc\xd9\x21\x7b\xfe\x74\xcf\xcd\x10\x7d\x8b\x96\xb6\xf7\x9e\x8b\x2c\x77\xd1\xdc\x65\x70\x63\x73\xed\x9d\x4d\xe6\xe8\x62\xbf\x1d\x76\xd8\xee\xf6\xce\x93\xcd\x49\xce\x0b\x50\xeb\xff\x18\x84\xfc\x22\xcb\x3e\x77\xd9\xdb\x34\x54\x37\x18\x70\x37\x24\x63\x74\x40\x94\xd7\xb8\x60\x49\x1c\xf2\x54\xb0\x86\x69\x1a\xf1\x1c\x6e\x0a\xde\xbf\x3d\x55\xc9\x6c\x98\x4d\xd3\x48\xba\xa5\x17\x4d\xbc\x7b\x7b\xf4\xe6\xe7\x93\x37\x6c\x18\x27\x5c\x79\xab\x07\x2f\x34\x51\x9c\x83\x86\x6e\xce\xb2\x21\x3a\xa4\x90\x1d\x95\x39\xe7\x0a\x80\x07\xce\x4b\x87\xe0\x33\x7f\x33\x9e\x94\x73\xed\xe9\x23\xc8\x2f\x2d\x35\x7e\xd5\xaa\xdd\xbc\x07\x38\xd0\x16\x8b\x12\x1f\xa7\x56\x2c\xe2\x20\x0c\xf9\xa4\xc4\xab\x9f\x28\x2e\xc2\x20\x8f\x0a\x16\xa7\x93\x69\x59\x1c\xb0\xb8\x84\x1b\xfe\x34\x63\x45\x1c\x71\xc6\x87\x43\x1e\x96\x45\x0f\x9b\x40\x57\xf9\x93\x3c\x1e\x07\x79\x9c\xcc\xd9\xb4\xe0\xc3\x69\xc2\xe2\x28\xce\xc6\x96\x0f\x81\xec\x0b\xcf\xf3\x38\x82\x7b\x27\xdd\x2f\x4f\x23\x7c\xc7\xcd\xae\x46\x71\x38\x02\x83\x82\xe4\x2a\x98\x17\x2c\xe5\x3c\x62\x65\x06\x4e\x0a\x82\x04\x7c\x8e\x74\x19\x5e\x1d\xfd\x3f\x27\x2c\x09\xc2\xcf\x05\x0b\xe0\xc6\x7a\x53\xe4\x63\x87\x2c\x48\x02\x76\x94\x85\x59\xd0\xd3\xee\xf6\x39\xc5\x19\xb5\xce\xb4\x32\x04\xca\x20\x86\x37\x4d\xec\x95\xa3\xa0\x54\x17\x44\x87\xd5\x19\x38\xa8\x2f\xfe\x23\xc4\x1f\xf6\xd4\x69\xc3\x05\x4d\xa7\xa1\xea\x69\x3e\xf5\xd7\x94\xf1\x0e\x6b\x2b\xfe\x3c\x4d\x12\x6f\x45\x69\x22\x50\xdf\xe3\x28\xb6\x23\xab\x5a\x64\x25\x5d\xd4\x34\xd4\x7f\x29\x8d\x37\xad\x36\x5c\xea\x04\x22\xbc\xf1\xb9\x52\xe2\x36\x4e\x6d\x6e\xb0\xbf\x7e\xe8\x5b\x08\x69\xe9\x15\x3a\x76\x25\xfb\x43\x23\xd3\xd7\xbc\x08\xeb\x44\x83\xe7\x9d\x83\x2a\xe0\xf5\x21\x30\x0d\x1a\xd4\x75\x9e\x15\x31\xe7\x01\x89\x3e\xd9\x1b\xda\x65\x0c\x2c\xed\x1d\x55\x03\x1c\xf6\xf4\x97\x68\x15\xd3\xed\x40\x38\xa6\xb3\x4c\xfa\x0b\xab\x46\x87\xdc\x5f\xda\xe7\x51\x43\x3c\xde\xb8\xb4\xe9\x06\xad\x48\xa4\x03\x0a\xed\xe7\xeb\x85\x48\xf9\x4e\xc6\x57\x35\x6e\x1a\x55\x31\xf2\x62\xc0\x03\xe6\xfa\x21\x56\xc9\x73\x06\xef\xf4\x3d\x97\x3e\x4d\xd3\xec\xaa\xce\x36\xe4\xc9\xb6\x2c\x53\x66\xe8\x94\xaf\xd6\x47\xda\x13\xe5\x23\x0d\x82\x7e\xea\x00\xe7\x61\x96\x16\x65\x90\x0a\x1e\x2a\x99\xd4\x8f\xbf\xfc\x7c\x34\x78\xf3\xf1\xe3\xf1\xc7\xc1\xe9\x9b\xff\x39\x65\x87\xac\xf5\x66\x36\xe1\x61\xc9\x23\x16\x30\xfa\x8a\x62\xeb\x11\x7b\x35\x8d\x93\x72\x33\x4e\x95\xe5\x82\xf6\xd0\x54\x00\xa3\x2d\x47\x42\x5e\xbf\x8a\xcb\x11\x86\x47\x09\xc6\x32\x56\x49\x50\xc8\x0b\xe8\x4f\x18\x91\xe0\x93\x6c\xc0\x80\x91\x06\x65\xfc\x85\xbf\x0f\x66\xda\xa3\x70\x20\x9d\xf1\xca\x1c\xcb\xd7\x30\x09\x30\x03\x34\x8b\xc6\x1a\x17\xd9\x34\x0d\x79\x64\xe8\x02\xdc\xbc\x44\x3c\x11\x5c\x3d\x4e\xbf\x64\x9f\xe3\xf4\x92\x7d\x12\xd9\x9f\xd8\x34\x2d\xe3\x84\x05\xc3\x52\x40\x75\x15\xc4\x25\xd8\x94\x8d\xe3\x24\x89\x0b\x10\x45\x0a\x36\x0a\xbe\x70\xc6\x93\x60\x02\x7e\x69\x60\x03\x10\xc3\x4a\x82\xa2\x64\x65\x3c\xc6\x2f\x4f\xb7\x57\x01\xec\x4c\xd0\x23\x8f\x7a\x60\x1a\xe0\x29\x16\x66\x63\x5e\x20\xb6\x02\xf6\x29\x14\x47\x8c\x44\x21\x06\xcc\x07\x20\x05\x2c\x3d\xc4\x10\x78\xa4\x40\x17\x0d\xa3\x5b\x1a\xdc\x36\x03\xf6\x69\x98\x4c\x0d\x56\x45\xe5\x78\x0c\xba\xd7\x92\x43\xa8\x7e\x01\x88\x80\x76\x0c\xa6\x03\x1f\xa4\x65\xe4\x27\xf9\xa6\xe0\x13\x54\x48\xa3\x38\x0c\x4a\xce\xae\x46\x1c\xa7\x0a\x3b\x2b\xf4\xbb\x07\x39\x1e\x96\x69\x29\x23\xe1\x01\x5c\x6b\x05\x69\xb4\x25\xa6\x3f\x0f\xe2\x44\x7c\xf3\xe8\x92\xa3\x7c\xc1\x25\x6e\x01\x5f\xd9\xb4\x44\x64\xa8\x71\x14\xaa\x4d\xd1\x98\x26\x1b\xc0\xaf\xb6\xca\x57\x76\x9c\x91\x72\xb1\x57\xc5\x64\x8f\x9d\x4c\x2f\x0a\xfe\x8f\xa9\x8c\xc3\x23\x76\xe5\xa2\xbe\xb8\xd9\x5d\x38\x31\x18\xd4\x3d\x23\x70\x6a\x02\x95\xfb\x1f\xd7\x7e\xe7\xed\x90\x7d\x92\xc3\xff\x84\x4e\x31\xd5\xe8\x3f\xe9\x67\x21\x41\xce\xa5\x71\x47\xd7\x0c\x99\x50\x86\xc4\xa4\x1f\x6f\x12\x61\xe0\xe2\x42\xd9\x86\x54\xc7\x02\xad\x69\x34\xb2\x71\x96\x8b\x79\x0e\x52\x96\x09\x6a\x95\x41\xe9\x3d\xd3\x20\xc7\x23\x46\x81\x19\x71\xc1\x3e\x6d\xcb\x91\xe8\x71\x89\x44\x34\x39\xe9\x56\x69\x4f\xe4\x46\x62\xfd\x4b\xcb\x1f\x5c\x50\x12\xeb\x29\x9f\x95\x10\x1e\x41\x48\x4e\xe3\x38\x81\x50\xd0\xec\x53\xc1\xcb\x53\x84\xe0\x93\x22\x7c\x3d\xce\xa1\x00\x40\x01\x76\xc2\x39\x3b\x7b\x1d\x7c\x89\x23\x76\x94\xe5\x17\x41\x38\xca\x5a\x02\xa1\x65\x1c\x26\xd2\x41\x6a\xd1\xdf\xda\x0a\x8b\x62\x53\xc8\xdb\x9f\x0b\x70\x04\x2c\xf1\x13\xa7\x97\x9b\xe5\x28\xcf\xca\x52\x60\x75\x93\xcf\x26\x49\x10\xa7\x3c\xda\x94\x26\x33\xc5\x16\xf8\x44\x15\x1c\x2b\xe2\x65\x10\x27\x05\x88\x88\x88\xe2\x78\xa8\x59\x9a\x32\xf7\xfa\x34\xe8\x29\xcc\x4b\x0c\x0d\x7a\xb2\x7d\xbe\x96\xd9\xd1\x8f\x64\x16\x95\x41\x91\x4a\xbb\x81\x39\x86\xe5\x62\xf8\x59\xa6\x49\xc0\x32\x42\x42\x33\xaf\x1b\x76\x26\xe6\xf2\x70\xfb\x1c\x83\x44\xe1\x06\x91\x0d\x6d\xa6\x06\x6d\x24\xc1\xdc\x6a\x40\x85\x8d\x3a\x93\xa4\x7b\xf8\xf5\x06\x1b\x51\xa4\x2c\x1d\x5a\xd2\x3a\xda\x8e\x49\x55\xea\x49\xba\x39\x04\x92\x39\x17\x65\xd9\x09\xbc\x95\x9a\x1b\xee\x2b\x49\x5e\x71\x0e\x0f\xc5\xfb\x47\xa6\xfa\x18\x07\xb3\x5f\x83\xb8\xc4\xd6\x05\x84\xe3\x60\x16\x8f\xa7\x63\x64\xc8\x86\xb1\x28\x87\x85\x28\xc7\x2b\x06\x7a\xc1\x87\x62\x85\x80\x31\xb1\x62\xcf\xcd\x63\x52\x6b\xf3\x50\xac\xe3\xe6\x31\x35\x2d\x63\xc7\x06\xcc\x4c\xb2\x92\xf1\x71\xd1\x5c\xf9\xb8\x9b\xc7\xda\x6b\x6b\x8b\xbd\x84\x07\x66\x61\x56\x94\xc9\x5c\x70\x3c\x08\xb3\x06\x73\x85\x4e\xc5\x89\x1f\xc5\x22\xfe\x27\x47\x2e\xc1\x86\xc9\x74\x06\x0d\xfe\xfe\xff\x4e\x79\x3e\x6f\x63\x89\x4e\x0f\x5d\x8f\x8a\x82\xad\x2e\x33\xe4\xde\x56\x0d\xf3\x77\xc1\x3c\x9b\x96\x5d\xb6\xb3\xbf\x0d\xef\x0b\x14\x18\x6f\x71\x6f\xf9\x54\xf0\x34\x7a\x1f\xc4\xc9\x27\xb1\x7f\xa4\x2c\x4c\xe2\xf0\x33\x8f\xba\xcc\x2c\x49\x56\x68\x26\x8d\x1c\x9a\xc2\xa1\x9e\x2e\x00\x20\x50\xd9\x86\x43\x35\xdf\x65\x4f\xb6\xb7\xc1\xe6\xf5\x11\x63\xac\x25\xc9\xa8\xa5\xad\x5e\x21\x55\x4d\x44\xab\xaf\x6d\xd2\xe4\xe3\x42\x05\xf5\x9b\xb4\x98\x0a\xe6\x7c\x11\x94\xe1\xe8\x5d\x76\x49\xf7\x22\x64\x9d\x28\x18\xec\x30\x5c\x36\x62\x36\xcd\xcc\x18\xe8\xd1\xe5\x80\x4a\x3f\xa4\x10\xab\xa6\xbb\x6c\x77\x5f\x40\xcc\x5a\x92\x74\x5b\x7d\xb6\xb3\xbd\xbd\xcd\xa4\x01\xf7\x17\x1a\x8f\x53\x50\x00\xd8\xed\x9f\x40\x4a\xbb\xb5\x55\x94\x39\x0f\xc6\x2d\x2c\x2b\x91\x25\xe3\x72\x02\xae\xa4\x60\xd7\xea\x1a\x38\xe8\x40\x8f\x40\x86\xb0\xc9\xd3\x00\x6c\x6f\x70\x3e\x9a\x98\x64\x13\xc1\xd7\xac\xf6\x7b\x28\x98\x40\x37\xc4\xd6\x4f\x8f\x5c\xa4\x74\x99\x60\x45\x1e\x47\x04\x62\x8b\x7d\x99\x5f\x6a\x37\x73\xe2\x5b\x1c\x02\xd5\xb7\x44\x92\x89\x9b\x03\xb1\x67\xd4\xdb\xa1\x78\xcc\xf3\xb7\x11\xad\x7b\x14\x24\x89\xd8\x52\x68\x1a\xd2\xa4\x48\x65\x87\x6c\x5b\xe7\x48\x96\x73\x68\x3c\x40\xc8\x0e\x3d\xa9\x1a\x59\x87\x32\x56\xc1\x03\xeb\x99\x0f\xb0\xe6\xef\x2c\x4f\xc9\xea\x19\x3d\x44\xdb\x17\xf3\x68\x22\xee\x3b\x22\xb6\x7c\x66\xc8\x00\x45\xa2\x03\x29\xcb\xb7\xc5\x37\x38\x4d\xdd\x56\x81\xf8\xb5\xb7\x67\xfd\x94\x5e\x76\x63\x06\xf3\xdd\x77\x0e\xfb\xc5\xb7\x38\x7a\x58\x9a\xec\xc0\x09\x88\x72\x25\x43\x50\x0d\xe7\x76\x28\xfc\xc2\x48\xe1\x6d\x0d\x94\xc3\x78\x11\x3e\x9c\xde\x0e\xeb\xab\x46\xb0\x45\x82\x35\xb3\x08\x49\xbf\xec\x05\x01\x57\x17\xee\xeb\x7a\x55\x67\x64\xb8\x26\x05\xbb\x6c\x8b\xc9\xb7\xa2\xad\xa1\x4b\x0b\x97\xa0\xf0\x85\xd9\xcb\xfc\x52\xe6\x9d\x82\x0e\xe1\x81\xa2\x8d\x97\xa6\x96\xd4\x3d\x10\xa7\xa5\x5e\x02\x12\xfd\xaa\x57\xab\x05\x3e\xad\x11\xe0\x91\x37\xa4\x2f\xf3\x4b\x78\x46\x5a\xd8\xaf\x5b\xb1\x78\x75\x4c\x72\x9e\xde\x44\x97\xdc\x1a\xd4\xd6\x16\xfb\xc8\x0b\x5e\xb2\x20\x9d\xb3\x4f\x12\xb1\x28\xb2\xe5\xbd\x45\xb0\x6d\x6d\xb1\x93\x32\x00\x0b\x18\xdc\x74\x72\x79\x22\x73\xf6\x25\x6c\x48\x2e\x24\x88\x06\xa2\x24\x32\x80\x25\x7f\x33\x9b\xc4\xb9\x60\xdc\x30\xc1\xba\xed\xb7\xfa\x08\x61\x6d\xdd\x3d\x3a\x5e\x95\xf1\xa2\x3a\x6b\xfd\x5a\x64\xe4\x7c\x1c\xc4\x69\x9c\x5e\x8a\xc1\x56\xe6\x58\x7c\x9f\x08\xe9\xe9\x9d\x5c\xea\x72\xcc\x6c\xd3\xbb\xf8\x99\x5d\x41\x02\x6d\x55\x31\xe8\xa3\xb1\xd5\xe4\xbc\xc2\x82\xdc\xac\xf6\x6a\x07\xc7\x72\x57\x4b\x9c\xea\x78\x80\x6a\x49\x6d\xfa\x00\x69\x42\x03\x9e\xb2\xb0\xdc\x37\xc5\x82\x1c\x9a\xd8\x13\x63\x38\xf6\x95\xa8\x5a\x85\xa9\x1e\xc6\x79\x81\x9b\x75\x97\x05\x61\x19\x7f\x89\xcb\x39\x28\x64\x8b\x32\x9b\xc0\xb3\x80\x34\x62\x57\xbc\x95\x73\x16\x94\x78\x28\xc4\xb6\x2c\x92\xeb\xa2\x32\x60\x5e\x94\x5c\x8a\x69\xa2\x89\xcb\x2c\xe5\xec\x22\x08\x3f\x5f\x81\xc6\xd7\xb4\x24\x36\xbc\x32\x4e\x2f\x55\x5b\x71\xc9\x82\xa2\x4a\xc8\x5d\x96\xe5\xa2\xc6\x17\xce\x46\x31\x92\xbd\x59\x33\x49\x3c\x8e\x4b\x8b\x38\xdb\x14\x53\x8e\x8b\xd0\xeb\x6b\xd6\xae\xe2\xf8\x87\x43\xa6\x18\xb2\x44\xac\xa7\xd0\x5f\xd9\x36\xba\xb9\x96\x44\xb1\xb1\xe1\x45\xfe\x0f\x87\x8a\x34\x3a\x1e\x8f\x8b\x74\xe1\xb5\xdd\x89\x17\x52\x41\x76\xd5\x26\xae\x20\xab\xb4\x52\x7d\xaa\x29\x31\x65\x78\x0c\xf5\x05\x89\x8c\xc6\xe6\x16\x4b\xf3\x05\xcf\x82\xf5\x0d\xa9\x02\x80\xda\x1f\x75\x0f\xd4\x59\xb4\x84\xea\x38\x35\xda\x8a\x78\xc8\xae\x38\xaa\x60\x3e\x29\xc6\xfd\x09\x75\xf5\x60\xd9\x56\x28\x61\x5f\x10\xd3\x05\xe7\xa9\x6a\xc4\x88\x37\x41\x29\x78\x52\x51\x82\x44\xd7\xd3\xf8\xd3\x64\xb4\xb1\xa1\xb7\x84\x0a\x06\x5d\x16\x46\xf1\xb7\xd4\x3e\xb2\x60\x13\x40\x19\xaa\x4d\xbd\xb4\x28\xd4\x58\xd1\xa1\x89\x97\xa0\x84\x07\xb9\x35\x27\x6f\xa3\x0a\x58\xb6\xe8\x73\xe0\x03\xd7\x2c\x02\x0a\xbd\x77\x5e\x5c\xa0\x41\xcb\xe4\x5e\xf1\xe8\x9a\x8e\xdb\x5d\xc9\x55\xfb\x36\x2d\x00\x2d\x7b\x08\x46\xcf\x5a\xed\x02\x30\xec\x2d\x2e\xde\xaa\xa3\xd7\xa1\x87\x73\x56\x77\x7b\xad\x4c\x32\x08\x51\xc3\x06\xe9\xc0\x15\x26\xf5\xce\x4a\xfc\xa6\xa8\x2e\xed\x38\xa9\xde\xc1\x5b\x31\x48\xad\xbd\x11\x50\x40\x7b\x72\x9e\x6a\x63\xa3\xc8\x4b\x68\x2b\x5b\x5b\xec\x6f\xe8\x43\x9e\xea\xfe\xe2\x14\xf4\x27\x97\xa3\x92\x25\x59\x36\xe9\x59\xfc\x7f\xf9\xed\xdd\x4f\xf5\x0d\x50\xde\x54\x48\xb6\x66\xf8\xb7\x83\xe3\xa6\x6e\xdd\xb0\xca\xd9\x03\xdc\xe2\x88\x1f\x07\x56\x26\xd0\xa7\x90\xcf\xc4\xbf\xe4\xf6\x41\x97\xf0\xbf\x2a\x52\xd9\x55\xa5\xff\x7a\xae\x62\x05\x05\x9f\xc0\x5b\xba\x3a\x7f\xa9\x4f\x24\x55\x5f\xf2\xf2\x63\x70\x75\x1a\xd4\xb9\x38\xdc\x7f\xb2\x23\x4b\xa2\x22\xe6\x34\xc3\xf0\x3b\xb5\xc5\x75\x88\x14\xf9\x60\xef\x3f\x4b\x59\x43\xbf\x91\x36\xaa\x7b\xa3\x83\x9f\x26\x09\xc2\xd0\x3a\x93\xef\xbc\x7e\x9e\x26\xc9\xb9\xf4\x13\xa0\x27\xd8\x29\xf3\x8b\x4a\x3f\x6f\xc9\x4e\xf5\x35\x01\x3e\x85\xf3\x74\x55\xcc\xc7\x6a\x0c\xd8\x9a\xc4\xd3\x0b\xf9\xa3\x57\x92\xdc\xbe\xb5\x57\xe8\x5b\x64\x0e\xaf\xc7\x58\x3c\x9e\xa0\xf2\x40\x07\x76\xff\x74\xc9\xcb\xd3\xe0\x12\x55\x8c\xd9\xb4\x14\x47\x3b\xf0\x0d\x86\xb7\x14\x17\xd3\xcb\xcb\x39\xe3\xe9\x97\x38\xcf\x52\x8c\xd5\xaf\x74\x78\x93\x3c\xfe\x12\x94\x7c\xf1\x53\xc0\x7f\x88\x93\xb2\xa3\xd4\x29\x64\xac\x76\xaa\xd2\xf9\x44\xc6\xf1\xa9\x67\x1f\x98\x05\xf4\x3f\x01\xa4\xf4\x65\xb4\x58\x56\xfa\xf9\xb3\x74\xe6\x48\x17\x86\xca\xb3\x99\xad\x35\x37\x7d\x35\x93\x6a\xf9\x28\x19\xc8\xc1\xfa\xc6\x86\x3b\x0f\xb1\x0a\x9b\x25\x21\xea\x40\xcf\x2f\x0c\x7d\xca\x74\x48\xee\x3b\xc4\x28\xf3\xfc\x6b\xcc\x0c\xb6\xba\xca\x96\xf1\x23\xf0\xcd\x1f\x6a\x7f\x08\x26\xb5\xd7\x6b\xfb\xe8\xc6\xf6\x0f\x7c\xa3\x0d\xd0\xfd\xf1\xcf\xb3\xf7\x1b\xdf\xd8\x7f\xeb\x77\x97\x3a\xda\x39\x4e\x4c\xbd\xc5\xdf\xf3\xd5\xac\x1b\x3d\x3d\x0c\x8c\xbf\x0d\x9f\x89\x54\xba\x5c\x74\x76\xd5\xda\x8a\xd6\xe1\xa6\x21\xa5\x57\xae\x1d\xfa\xce\xd3\x3b\xec\x63\x8d\xc1\x7b\xdb\x5b\xf5\x9d\xa4\x1d\xe5\xbe\x6e\xd2\x77\xee\xa6\xf9\x35\x06\xed\x36\xb5\xea\xdb\x48\xf0\xa1\x53\x3f\xc5\x6b\x36\xbb\xc6\x00\x75\x1b\xab\x81\xb0\x07\x4e\x6f\xc0\x2d\x64\xbd\x99\xf9\xf6\x5d\xb4\xbd\xc6\x18\xed\x86\x56\x03\x66\x1f\x7d\xe6\xa5\xc1\xb8\x61\xa0\xbb\x77\xd1\xf6\x1a\x03\xb5\x1b\x5a\x0d\x98\xa7\x83\xc1\x29\x9f\xd5\xd3\xea\xd3\x15\x39\xf1\xb3\xc1\x60\x5a\xc6\xc9\x00\x02\x1c\xfd\x52\xc6\x49\x3d\x1a\x77\x9e\xac\xd6\xc5\x73\xd9\xc5\xeb\xa0\x0c\x16\xf4\xf0\x6c\xb5\x1e\xbe\x97\x3d\x7c\xc8\x92\x20\x6f\xee\x02\x7d\xca\x3f\xb0\x83\x65\x31\x15\x9e\xb0\x27\x1d\xd2\x5f\x5f\x13\x93\x28\xed\xc5\xcc\x78\x02\x8f\xd9\x21\xdb\x39\x60\x31\xfb\xab\x39\x11\x4b\x9f\xa1\x07\x2c\x7e\xfc\xb8\x23\x5d\x8b\xeb\xeb\x28\x5d\xea\x2c\x3e\x3f\xa8\x78\x14\x97\xd7\x50\xb7\x71\x2a\x8e\x55\x94\x5f\xf1\xaf\xd2\x51\x96\x32\x1a\xc3\x5c\xe2\x5c\xfc\x46\xeb\x18\xd0\xe5\x1a\xbb\xb1\x24\x9c\x32\x3b\xca\xd2\x62\x3a\x16\x32\xd5\xcb\x3c\x0f\xe6\xed\x20\xcf\x15\x3c\x90\xd0\x8b\x0b\x93\x51\xc1\xc5\x36\xf8\x57\xd9\x65\x87\x4c\x17\x92\xe8\xe8\x28\x2c\xe5\x2e\x7e\x44\x85\xb3\xf8\x1c\x90\x93\x03\x5a\x6e\x8c\x99\x61\xbe\x4b\x9c\xb4\xcb\x54\x84\x63\x98\x67\x63\x00\x42\x3a\x43\xd7\x7f\xe8\x5d\x36\x2f\x79\x11\x07\xe9\xdf\x63\x7e\xf5\x2a\x9b\x9d\x8c\x82\x09\xba\x07\xba\x1d\x37\xeb\x05\xbd\x42\x54\x85\xc0\x2b\xb3\xfe\x2a\xf5\xf1\xbe\x5d\x88\xa6\xf3\x35\xeb\xcb\x80\x2c\x6b\xb5\x31\xe2\xf1\xe5\xa8\x5c\xa3\x91\x07\xca\xca\x7c\x22\xd6\xd8\x5d\xa2\x37\x5c\x17\xbf\xe1\xba\x08\x26\x21\xda\xd7\x6c\x89\x04\x75\x5f\xb3\x25\x1a\xdf\x7f\xad\x86\x54\x70\xf2\x75\xe7\xfe\x81\x72\x60\xad\x5c\x0a\xc2\x81\x0f\xe9\x60\xa5\xb6\x89\xfb\x3e\xef\xb2\xed\x56\x49\xed\x1c\x54\x37\x18\x19\xbd\xe4\xf9\x4a\xdd\xc2\x9d\xba\x39\xab\xae\x07\xf8\xea\x33\xb3\xd2\x9a\x91\x5e\x0b\x81\xd2\x86\xc3\x82\xaf\xb3\xa0\x21\x6e\x43\x56\xc4\x62\x03\x58\x1d\x0d\xed\xb3\x56\x99\x4d\x20\x4a\x20\x1f\x42\xd8\x36\x78\x9f\x21\x7e\x5c\x64\x65\x99\x41\x18\xc1\x38\x2d\xe2\x88\x8b\x5f\xd9\xb4\x54\x3f\x31\xf1\x9d\xac\x85\x5f\x1f\x55\x5d\xfc\x3c\xc5\x96\xf1\xe3\x95\xd3\xdc\x69\x36\xb1\x2b\x63\x01\x3b\xed\x34\x9b\x38\x6d\x62\x29\x27\x11\xee\x7b\xcd\xe7\x9b\x14\xe2\x1e\x72\xfc\x27\xe4\xe2\xf8\xdf\x42\xb4\x13\x37\x97\xdf\x9a\x70\xc0\x71\xd8\xf1\x70\x69\x81\x9a\xce\x78\x16\xf1\xce\x4a\x24\x27\x6a\xca\x91\x0b\x11\xf6\xe7\x60\xbc\xda\x9a\x41\xd2\x85\x76\xb2\xb4\xe4\xe9\x6a\x94\xbb\x1e\x02\x95\x13\xd2\x55\xb9\xc6\x79\x07\xac\xd9\x49\x70\x14\x15\xa2\xe0\x2b\x59\x90\xfb\xba\xd0\x25\x2f\xdf\x05\x17\xa0\x62\xa7\x8a\x29\x48\xc3\x70\x05\xc6\x98\x47\x85\x13\x44\xa7\xb0\xe8\xbf\x4b\xaa\xfe\x35\xbb\xd3\xd9\x3a\x05\xae\x55\xd0\x16\x08\xfb\xb9\xfd\xe1\xbb\x2d\x23\x27\x68\x47\xb4\x1d\xf6\x42\x42\xd3\x77\x42\x37\x68\xd3\x9d\x15\x95\x1b\xed\x4e\x5b\x43\xde\x71\xb4\x73\x3a\xa3\x0d\x43\xe9\xb8\x71\xf1\x20\xf5\x80\xa2\xf6\x35\x4f\xca\x00\x76\x36\x07\xbf\x26\xa3\x6d\x36\xd1\xae\xde\x07\x0d\xce\x65\xe8\x29\x15\x59\xfe\x36\xe7\x97\xb3\x87\xa3\x87\x6c\xeb\x11\x1b\x07\xe5\xe8\x44\x34\xf3\x68\xeb\xbc\xd3\x56\x5d\x40\x24\x43\xd5\x33\x0c\x05\x69\x86\x00\xac\xcc\xef\xdb\xf0\x23\xb8\x28\x6a\x2a\x77\x19\x3a\xa5\x32\x98\x00\xa8\x1f\x91\xd6\x0c\x56\xd0\xdd\xb0\x10\x3f\x82\xa4\x42\x79\x95\x4c\xc4\xf4\x07\xf4\x81\x0c\xbf\xbb\x2c\x28\xcb\x9c\x50\xa5\xda\x1f\xe0\x82\x53\x15\xee\xa9\x54\x1d\x6f\x15\x77\x68\xbb\x90\x4c\xd4\xc1\x41\x61\x75\xd8\x45\x30\xad\xab\x2f\x65\x25\x7f\xb1\x0b\xe9\x64\x85\xc6\x50\x74\x24\x5b\xef\x85\xba\x83\x70\x4e\x93\xe7\x2a\x99\x88\x76\x24\x9f\xa4\x6a\x00\x8d\xe4\x46\x0a\x92\x54\x13\x2c\x55\x4d\x0e\x29\x47\x08\x4d\x16\xd3\xd3\x69\x0a\xa9\x24\x33\xe2\x2c\xfc\xfc\x6b\x5c\xd0\x32\x3a\x4d\x2f\xed\x5c\xc1\xd4\xa6\x63\x79\x4c\x01\xee\xb0\x2d\xb6\xeb\x25\xb3\x25\x96\xc3\x81\xbd\x1a\x48\xf5\x1f\x0e\xd9\x36\x7b\xc1\x76\x58\x9f\x6d\xee\x1c\x50\x4e\xa3\x47\x06\x91\x19\xd4\x78\xf0\x41\x24\x92\x0b\x89\xd9\x20\x38\x86\x21\xa4\xc3\x43\x7b\xd3\xd5\x66\x78\xb4\x5d\x82\xe3\xc7\x8a\xe0\x91\x5a\xf0\x7e\x93\xf6\x44\x30\x66\x85\xc6\xf1\x75\x29\x36\x76\x6f\x87\x74\xf1\x35\x77\xf7\xdd\x72\xfd\xf1\x85\x3d\xdd\x72\x60\x02\x93\x34\x97\xcc\xd3\x5f\x71\x9e\x4c\x6e\x9f\x7d\xa7\x3f\x34\x1d\x01\x4e\x3f\xc8\x48\xd5\x0b\x79\x9e\x4f\xa3\x72\xf6\x90\x03\xd3\x03\xb1\xfc\x34\x3b\x52\x42\x3b\x32\xbf\x70\xd6\x65\xe1\xbc\x2b\xe9\xb5\x4b\x46\xad\x49\x8c\xa7\xd1\x1f\x02\x00\x7b\xcc\xda\x06\x3b\x8a\xa2\x3b\xec\x11\x43\xdf\x91\x92\xd9\x05\xe5\x88\x1d\xb2\xd6\xfb\x96\x98\x1b\x8d\xad\xde\x8c\x3d\x66\xad\xae\x93\x38\x17\x89\xff\x5f\x2a\xe6\xec\xa5\xc8\xca\xd5\xb2\xc4\x92\xe4\x73\xbb\xbb\x03\x49\x16\x04\xdb\xac\xcf\x76\x3a\x90\x8f\x8d\x40\x08\x26\x89\x1e\xd2\xa3\x4e\x9a\x2b\x28\xe3\x68\xe5\x2d\x2b\x06\xe4\x4d\xd3\xf8\x1f\x53\xfe\x36\x42\xa4\xb5\x72\x1e\x8e\x82\xbc\x2c\x36\x73\xd8\x19\x36\x93\x38\xe5\x9b\x2d\x6b\xc7\xb9\x85\xa6\xbb\x17\xf4\xf0\xe9\xe3\x1b\x94\xb5\xda\x40\xd5\xad\x92\xcf\x54\xf0\x06\xa5\x72\x83\x88\x6d\xb0\xdd\x74\xb5\x91\x43\x94\x8d\xe3\x34\x48\xcb\x57\x41\xc1\x05\x1c\x7d\x14\xbe\xf3\x20\x69\x55\x76\x89\x26\xf9\xd1\xaf\xb8\x6d\x7b\x46\x7b\x11\xe4\x9b\x40\x27\xad\xae\x69\x1a\xef\x64\x6f\xa4\x99\xc0\xda\xa3\x67\x70\x7d\x59\xe8\x21\x40\x84\x01\xf9\x7b\x9d\xc6\x5b\x82\x60\x5b\x5d\xf6\x95\xc5\x51\x9f\xc5\x51\x97\x45\x7d\x24\xe2\x1b\x1c\xc1\x1d\x0e\x40\x4c\xe0\x07\xe8\x4e\xa6\x7c\x65\xb3\x24\x4e\x3f\xff\x2d\xe7\xc3\x3e\x6b\xfd\xa7\xa0\xd5\x38\x62\x37\xc6\x76\xfc\x82\x27\x08\xc4\x03\xc6\x3a\x96\xe0\xf6\x52\x4c\xfa\xf1\x10\x16\xb6\x4f\x3e\xae\xe4\x57\x64\x65\x2d\x6f\x4c\x1a\x45\x8d\x89\x47\xca\x20\x12\xcd\xc4\x12\x66\xfe\xf7\x88\x17\x9a\xe3\x8f\x63\x5d\xa6\x6d\xed\xa8\x46\x14\x06\xb9\xc1\xbb\x47\xab\x93\x3a\xb5\x21\x1b\x54\x18\xef\xbd\x32\x72\x8a\xb3\xc7\x72\x5a\xbb\x7a\x54\xc4\x8a\x6d\x20\xe6\xac\x02\x5c\x6f\x46\x4a\xcc\xbd\x25\xe6\xb6\x39\xb2\xe2\x43\xb3\x3e\x1b\xe8\xca\xf3\x3e\x1b\xe8\xf9\x16\xeb\xe0\x65\x1a\x8e\xb2\x5c\x14\x11\x12\x52\x38\x63\x2f\x58\x0b\xd0\xdb\x62\x7d\xa9\x34\x50\x82\x31\xcf\xc1\x79\x82\xaa\xd1\x1a\xc7\x51\x94\xf0\x16\xf2\x17\xbd\xad\x57\x91\x2f\x55\x0e\xce\x19\x89\x80\x17\x52\xf0\x42\x2f\x78\xaa\xb3\x5b\x02\x03\x22\xe7\x32\xd2\xe6\x83\x1a\x9a\xd8\xbd\xe7\xdd\xdd\x43\x01\xde\xe9\xdf\x35\xf3\xef\x9d\xfc\x5d\x39\xfb\x16\x72\x67\x7d\x26\x6b\xcd\xfb\x4c\xa2\xb5\x1e\xa9\x0d\x28\xbd\xf1\xb1\x3c\xdd\x77\x03\xdb\xb3\xcb\x7c\x53\xd6\x47\x39\x9f\x85\x3b\x95\xa8\xe9\x0c\x6e\x24\x48\x06\x7c\xab\x4c\xbc\x6a\x20\xb9\x98\x60\x04\x51\x3c\x68\xc8\x62\xce\x21\xc3\xbb\x1c\xca\x6c\xd2\xb0\x16\x84\xb4\x84\x00\x6d\xb1\x5d\xb2\x2c\xe6\xae\x30\xbf\xd2\x2a\x11\xeb\x79\xe1\x7a\x95\xaa\xce\x55\x60\x7c\xac\x10\xf1\xf8\x0e\x80\x45\x36\xb4\x10\x5c\x50\xd5\x36\x01\xbb\xe9\x00\x61\x43\x4a\x86\x60\x41\x77\x27\xac\x0f\xd5\xc7\xcb\x60\xf2\xf1\x4a\x40\x22\x8a\xd6\x06\x93\x68\xaf\x9b\x61\xfd\xc3\x61\xfc\xb8\x34\x42\xff\xc0\x59\x37\xfa\xfe\xd5\xd6\xd0\x37\x5b\x3a\xd6\x5d\xc4\x5a\xeb\xfd\x9b\x31\x27\xfb\xba\x64\x05\x6a\x5d\x0c\xe7\x02\x82\xbd\x15\x6e\xf5\x95\xcd\x1a\x24\xbb\x18\xe2\x46\xaa\x5d\x81\x16\xd6\xe4\x04\xcb\x10\xc3\x02\x24\xdf\x82\x16\xe8\x1d\xd8\xfa\x8c\x61\x19\xd8\x1b\xd1\x5d\x03\xf9\x4a\xd6\xa3\xed\x8e\x1e\x71\x87\x6d\x6c\x28\x63\x9a\xdb\xaa\x4a\x86\x20\x89\xc6\x85\x74\x0d\x04\x12\xa8\x6a\xb7\x37\x83\x77\x6a\xab\x35\x7c\x29\x1b\xfe\xc0\xf3\x10\x1d\xf7\xdb\x2d\xdf\x1b\xd0\xf3\x7b\x03\x7a\xde\x71\x2f\x73\x1c\x22\x5a\xad\xd3\x0b\xe8\xf4\x92\x97\xb2\xd7\xbf\xc3\x9d\x94\x83\xaf\x2e\x52\x68\xc7\xa1\xcc\xfb\xeb\x71\xde\x95\x64\xdf\xb9\x13\x3a\xaf\x1c\x3e\xaa\xfb\x46\xcd\x2e\xbc\xee\xa9\x24\x2e\xe0\xec\x45\x0f\x21\x32\xa9\x2d\xe5\x76\xcb\x0f\xd8\xdd\x51\xa4\xd1\xad\x48\xb5\x90\xee\x7f\x95\x13\x4f\xed\xa1\x46\xcf\x42\xfd\xc5\xea\xc2\x18\xf5\xf2\xaa\xda\xe4\xe3\xb7\x56\xde\x41\xea\x7f\xd1\x8b\xab\x89\x7d\x67\xe5\xbb\xdb\xaa\xd6\x72\x1e\xa0\xb4\x5a\xac\x5f\x29\x85\x71\x55\x21\xf2\xba\xc2\xc8\xf5\xf5\x6a\xd7\xbd\xf2\x85\xcc\xc6\xc6\x6a\xd5\xcd\x3d\xf1\xc6\x06\xfb\x6e\x21\x5d\x68\x1d\xe3\xd9\xc3\xb8\xf8\x7b\x90\xc4\x91\xd4\x2d\x3e\x14\x87\x7a\x44\x28\x36\xb5\xfa\xad\xb2\x6a\xc6\x61\x43\x2a\x9c\xaa\xde\x51\xee\x06\x58\xa7\x97\xdb\x34\x1a\x26\x59\xca\xab\x4d\x62\x88\xf7\x42\x7b\xb3\x58\xef\x8e\xbd\x06\x4e\x99\xdc\xa6\x5d\xa9\x3b\x85\xc2\x52\xc6\xba\x7c\xe0\xc0\x31\x32\x70\x6c\x18\x54\x36\x28\xf3\x97\x51\xfe\xf8\x4c\x8e\xcf\x1e\x7e\xd6\xdc\x17\x3d\xba\xc2\x1b\xb4\x97\x65\x99\xc7\x17\xd3\x12\xc2\x8f\x9c\x77\x74\x8f\xda\xa9\x07\x01\x5c\x6c\x9c\xf5\xf7\x8c\x62\xb9\xd4\x5d\x09\x56\xf3\xe0\xfa\xce\x41\x60\xf5\x02\x7d\xe2\xb9\x3b\xb7\x10\xab\x1a\x7d\x29\x51\x63\xc1\xfb\xa2\x51\xd9\xdd\x5f\xa4\x13\xba\xd3\x1b\x9a\x25\xec\xce\xcf\x1e\x06\x30\x43\xca\x0c\xfe\xd1\xd6\xb9\x7b\xa3\xe3\x72\xbb\x35\xef\x68\xea\x2e\x66\xf4\xbd\x91\x85\x5e\xb9\x21\xab\x9b\x07\x7c\x3c\x07\x08\xeb\x45\x71\x31\x49\x82\xb9\x64\xc0\x2d\x48\x6c\x1d\xa8\x4c\xdb\x94\x87\x7e\xaa\x22\x4e\x20\x65\xfc\xad\x2c\x22\x83\xbc\xe0\x7f\xd7\x9b\x94\xde\xcc\x68\xba\xbb\xa7\x85\x66\x3b\x73\x6e\x18\x64\xa2\x56\xb4\x05\x52\x7f\x8f\xe9\x01\xbd\x01\xb0\x2e\x0a\x30\xbf\xf1\x9a\x00\x8b\xb8\x36\x08\xc6\xa8\x28\xd7\x49\xea\x96\x42\xa6\x5b\xd7\x13\xf6\x85\x07\x96\x58\x78\xdd\x21\xb5\x91\xd5\xcb\x0e\x83\x07\x4b\xdf\x88\x49\x46\xab\x9d\x4d\x74\x62\x99\x4d\xf4\x1d\x13\x1f\x9a\xad\x59\x7c\xb8\xda\x49\xcc\xf1\xeb\x26\x31\x0f\x3f\x7d\xf6\x18\x6a\x23\x37\xd6\x18\xcb\xee\x21\x4b\x0b\x42\x28\xb9\x0a\xb6\x75\x77\x6d\x4a\xd9\x94\xfa\x42\xb8\xbb\xc6\x67\x77\x0c\xec\xbc\xea\x6d\xe3\x2b\x6a\xe0\x51\xfb\xae\x0c\xdf\x71\x06\xb5\x09\xbb\x9c\xc3\x1b\xf9\xd4\xdd\x58\x60\xdc\x1d\x64\x65\x36\xb9\xe3\xb1\x0a\xfa\xac\x19\xae\x20\x69\x31\x60\x20\xe1\xe5\xc6\x7c\x2b\xa1\xe6\x4f\x30\xbf\x4d\xb3\xbb\x6d\x46\xb9\xed\x68\x00\xee\x0e\x94\xf0\xae\xc7\x16\x56\x07\xa7\xb8\x08\x5e\xcf\xc1\xab\x04\xc3\xc8\xa9\x39\x3f\xe1\xdc\xd7\xd7\x92\xc5\x83\x2b\x30\x87\x69\xf7\x0d\xfb\xf6\x96\xb3\x9e\x2d\x50\xc6\x4c\x0b\x59\x2f\x12\x28\x5b\xbe\xbe\x56\x9c\x5e\xfc\xb2\xea\x68\xb6\xd7\x37\x3f\x7d\xaa\x25\x7a\x20\x73\xb0\x61\xe5\x55\x8e\xbb\xe4\x1c\x0a\xfb\x64\xe5\x3e\xcc\xa4\xb6\xa5\x74\x65\x75\x03\xe7\x20\x34\x14\x5d\x20\xf2\x4b\x99\xf5\x10\x9d\xcf\xb9\x4f\xc2\xd7\x10\x9b\xde\x21\x58\x5f\xd9\x67\x3e\xef\xb3\x16\xf4\xb3\x19\x8f\x27\x49\x1c\xc6\x65\xab\x6b\x5e\x46\xa8\xe3\xda\x4d\xe7\x0e\x68\x9b\x1b\x52\x3c\xce\x4f\x4a\xc5\x5c\x00\x13\x7f\xe0\xe0\xba\xea\x35\x05\xa2\xfb\xb6\x43\x6d\x3c\x76\xc9\x69\x6e\x3c\xed\x2e\x3a\x12\x7d\x73\x04\x69\x23\x77\x9b\x7a\x6b\xa9\x61\x55\x5d\xe7\x7d\x0d\xcc\xc8\xf4\x1e\xd0\xf5\x89\xa7\x66\xf8\xd2\x43\xa8\xb5\xe4\x71\x61\xda\x86\xca\x47\x41\x92\xbc\x9a\x7f\x08\x72\x27\xea\x40\x35\xb7\x3d\x81\x7f\xa4\xad\xb2\xc5\x0a\x40\x9e\xfe\xcc\xc3\xcf\x90\xa9\x18\x89\xfb\x28\x93\xfd\xc0\x76\xc5\x06\x60\x9e\x61\xee\x9e\xdb\xde\xa1\xd8\x0b\x3b\xb3\x6f\x7b\xab\xfc\x8e\x40\x20\x68\x91\x7e\x6b\xbd\x91\xe8\xc1\x85\x65\x63\xc3\x2e\xdb\xcc\xb5\xe4\x78\x88\x62\xca\xd3\x8d\xbe\x49\xc7\x4c\x73\xf8\xb0\xcf\x1c\xa6\x66\x47\xd7\xe0\x33\x9c\xa3\xa3\x51\x9c\x60\x07\x2b\x9e\xd6\xd1\xfc\x7d\x18\xa7\xd1\x4b\x31\x4d\xe2\x44\x24\x37\x46\xa5\x43\x43\x75\x5e\xa7\x37\x0e\x26\x6d\xf3\x96\x16\xb2\xbb\x2c\x4e\x23\xee\x6e\x19\x6b\x29\x52\xb0\x59\xb5\x07\x57\x68\x56\x1c\xf0\x29\xb2\xd4\x4e\x47\xe9\x17\x6c\xd8\x04\x5c\xb8\xd5\x21\x09\x1b\x5d\xc3\x77\xce\xcc\x3a\xd0\x3b\x98\xa5\xd3\xa9\x16\x86\x22\x4e\xb2\xb9\x55\x28\xa3\x5b\x0b\xb2\x75\xe0\x3f\xb3\xda\x3c\xef\x85\x59\x1a\x06\x65\xdb\xf3\x8e\xd7\x81\xab\x23\x95\xae\xf2\x60\x6b\x1f\x5e\xe9\xa7\x3a\xfb\x7a\x97\x6a\x35\x11\x83\x1a\xa8\x77\xdb\x4a\x47\x20\xe3\x1f\x59\x51\x8f\xb4\x03\x13\x88\x28\xc7\x0e\x19\xf2\x9c\x4e\x25\x66\xc8\xd3\x3f\x93\x43\x14\x0c\xa2\x9d\x25\x0d\xd1\xc3\x77\x77\x9e\xff\xf1\xa1\xd3\x6d\x48\x85\xc0\xf0\xe7\x08\xda\xe7\xc2\x75\x79\x2f\x70\xdd\x3e\xbe\xa8\x0b\xd7\x70\x9d\xd8\xa2\xd8\x56\x12\x5c\xd4\x47\xa7\x7b\x7e\xe7\x31\x55\x57\x08\x2c\x4a\xe0\xbc\xaf\xb0\x8e\xb7\x8f\x7b\x6f\x43\xe5\x8b\xe9\x78\xcb\x70\xff\xe1\xf4\x82\x8f\x78\x12\x37\xc4\x9d\x7e\x7e\xe7\x61\x5e\xeb\x42\xd3\xdd\x06\x5a\x32\x27\xd5\x68\x84\xfb\xcf\xfe\x4c\x6c\x51\xca\xa6\x45\x96\x97\xaf\xe6\x0d\x3e\x37\x56\xf4\xc0\x52\xe9\xe0\x2e\x9c\x44\xa9\xb6\xfe\xed\x22\x6a\x1d\x1f\x4e\xcd\x01\x94\xf7\xb6\x57\x74\x2e\xe4\xb6\x7f\x17\x3e\xa2\x64\x53\xab\x3a\x73\xba\x57\x9f\x58\x6e\xf3\x6b\xb9\x8c\xba\x0b\x9f\x58\x7b\xaa\x15\x15\x96\xa5\x61\xc8\x2b\xae\x6a\x4f\x17\x6b\x79\x91\xaa\xb4\xb6\xaa\xbb\xa7\x7b\xf1\x06\xb6\x7f\x07\xde\xc0\xf6\xd7\xf3\x06\xf6\xf4\x1e\xbd\x81\x3d\xbd\x2b\x6f\x60\x4f\xef\xc0\x1b\xd8\xb3\x7b\xf4\x06\xf6\xec\xae\xbc\x81\x3d\xbb\x03\x6f\x60\xcf\x25\x41\x14\xe3\x2c\x2b\x47\xf5\x4b\x74\xef\x6e\x9a\x5f\x63\xb4\x6e\x53\x2b\x3b\xf8\x0a\xb3\xb4\x0c\xe2\x94\xe7\x83\x93\x69\x3e\x0c\x1a\xc2\x50\x7f\xbf\xea\xb6\xbb\x4d\x7b\x79\x17\xcc\x79\xfd\x61\x6f\xe7\xfb\x15\xfb\xd8\x11\x7d\x8c\x27\x59\xca\xd3\x72\x70\x9a\x65\x49\xd9\x10\xcc\x7a\x67\x55\xff\x9a\x3b\xbb\xb4\x9b\x77\xfc\x92\xa7\x51\xc3\x58\x56\x74\xbb\xb6\xf3\x64\x30\x00\x3f\x4e\x83\xa3\x69\xfe\xa5\x21\xa6\xff\x8a\x8e\xe3\x76\xf6\x74\xfb\x79\x56\x34\xf8\x74\xfb\x7e\x45\x3a\xdf\xd9\x57\x1d\x9c\x40\x28\xdf\x7a\x14\xed\xaf\xc8\x1e\x77\x9e\xaa\x1e\x5e\x67\xf5\x5b\xcb\xb3\x55\x5b\x7f\xa6\x5a\xff\xc8\xc3\x12\x6e\x88\xea\x27\x61\x45\xbe\xb7\xf3\xfc\xfe\x3d\x04\xee\x88\xf5\xad\x8c\x5c\x06\xda\xdc\xe5\xe5\x2c\xae\xef\x6b\x6f\x7b\x55\x37\xa4\xdb\xb4\xb3\x57\xf9\xb4\x68\x60\xa0\xdf\xaf\xb8\xce\x77\x77\xd4\xf5\xcd\xf1\xfb\x66\x9c\xed\xee\xac\x48\xbc\xbb\xbb\xf7\xee\x57\x71\xf7\x89\xec\xe2\x68\x14\xe4\x0b\xe6\x7e\x77\x45\xfa\xda\xdd\xbb\xa5\xf3\xc6\x55\xfa\xd8\x57\x7d\x4c\x73\xfe\x11\x94\x97\x0d\x4b\x7d\xc5\x3e\x9e\xca\x3e\x20\xea\x58\xfd\x18\xbe\xdf\xdb\x53\x07\xfb\x7f\xfb\xa0\x94\x28\xc0\x3b\xa8\x23\x21\x16\xb9\x21\xac\x69\x5c\x0b\xe2\x1c\x3c\xe6\x85\xc4\x89\x32\x9e\xac\xb8\xa4\x44\xd4\x28\xf3\xa0\x0a\x5a\x22\x5e\x84\x79\x3c\x29\x33\x6d\x02\x05\x68\x31\xc9\x3d\xe3\x66\x1c\xec\xc2\x7c\xe9\x62\x8e\x82\xa4\xe0\x56\xbd\x30\x4b\x87\xf1\xe5\x54\xd5\x84\x7b\x24\x40\xea\x43\xb8\x25\x7d\x28\xb0\x6d\x8a\x77\x68\xd5\xab\x3c\x2e\xad\x6a\x7e\xc7\xe8\x6a\xe4\xa4\x26\x04\x91\x26\xad\x1e\x50\x84\x1b\x8c\x1e\x65\x69\x51\xe6\x53\xb1\xd9\x01\xe2\xca\x4c\x5e\xaa\x61\xcc\xcd\x0f\x0a\x95\xf2\x7e\x5f\x66\x77\xaa\xc8\x27\x0d\x19\x2a\xa1\x4d\x76\x70\xcc\x56\xbb\x4d\xad\xd8\x20\x1c\x28\xd0\x49\x89\x03\xf0\x9b\xde\xb6\x7d\xb3\xa3\xe3\xfc\x5f\x31\x3c\x01\x69\x39\xbb\xf8\x1d\x08\xb3\x50\xf3\x8d\x38\x63\x87\xec\xeb\xcd\x01\xa5\x94\x18\x7c\xb7\xab\x31\x8b\x1a\x3d\xb8\x05\x3a\x1e\xb6\xe3\x0e\x3c\x4f\xed\xc0\x75\x6e\x9c\xaa\x69\xfc\x6e\xa9\xc5\x01\x00\xc4\x1d\x5a\x59\xae\x0f\xf0\x79\x9a\x5d\xfc\x6e\xfb\x3c\xd5\x8b\xe2\x7f\x89\x5f\x56\x33\x08\x87\x78\xd5\xcc\x98\x98\xe7\x0a\xf3\x64\x2e\xfc\x74\x6f\xaa\x7e\x55\x16\x07\x68\xd1\x5f\x0d\x09\xc0\xe8\x2a\x54\x69\x6a\x79\xe1\x37\xbb\xe9\x90\xc1\x88\x09\xb1\x42\xae\x9b\x61\x67\x17\xbf\x3b\xf3\x02\x27\xb8\xa3\x20\x49\x8e\x46\x3c\xfc\xdc\x8e\x21\x14\xb8\x60\x85\x84\x5c\xd5\xc0\xbe\xd3\xd9\x4c\xfd\xc8\x86\x56\x41\xe0\x9d\x9e\x68\x87\x0f\x8f\x82\x34\xcd\x30\x6c\x18\x0b\xd0\x0e\x96\x05\x05\x09\x26\xfe\xb0\x8a\xed\x49\x56\x14\xf1\x45\xc2\x49\x07\x18\x46\xa3\x5d\xf0\x64\xd8\x85\xc6\x34\x68\x22\xc9\xee\xfd\xa3\x8a\x30\x22\x41\x80\x20\x66\xa3\xa0\x48\x5b\x25\xc4\x86\x62\x71\x1a\x97\x71\x90\xc4\x05\x8f\xd8\x26\x2b\xa6\x13\x9e\xb7\x3b\x56\x09\xd1\x03\x8f\x10\x34\x65\x7c\x2e\x46\xb0\xb1\xa1\xa3\x3e\xc2\xf7\xe1\xe1\x21\x7b\x88\xeb\xf7\xa1\xe0\xa4\x95\x3c\x33\x4a\xf6\x02\x93\xfb\x4c\x40\xec\x4c\x46\x9c\x8e\x78\x1e\x97\x45\xbb\x98\x5e\xc0\x1e\xd2\x45\xb0\xe0\xb7\x1a\xaa\x6c\xdc\x64\xc0\xf5\xbf\xe9\x02\x42\x78\xd8\x99\x32\x64\x88\x7f\x6a\x4e\x44\x59\xc6\x67\x93\x9c\x17\x85\x00\x63\x3c\x2d\x4a\xc6\x31\xf2\xdb\x05\xc7\xc0\xf8\x59\x4e\xe6\xaa\xcb\xc4\x5c\x3e\x64\x8f\x59\x05\x16\x40\x95\x82\xde\xf0\x15\x23\x12\xe0\x06\xd9\x26\x00\x5a\xe0\x52\x0e\xfc\x15\x23\xd3\xe3\xcc\xf7\xcd\x42\x31\xc8\xa1\x6b\x05\x43\x75\x3a\x0b\xc3\xb7\x78\x04\x99\x29\x96\x4e\x90\x2b\xe1\x2b\xb8\xe0\xbd\x08\xc2\xf1\x90\xbd\xf0\xa7\xd7\x4c\x90\x81\xad\x37\x18\xc0\x48\x40\x78\x32\x45\x0e\x2c\x3f\xcf\x95\x3f\xc1\xec\x8e\x3f\xbe\x7d\xf3\xf3\xe9\xe0\xfd\xcb\x0f\xd2\x1d\xe3\x4c\x1c\x1e\xfa\xec\x8c\xb8\x21\x2d\xb3\x49\x0b\x6c\xd6\xe7\x2a\xcf\xf6\x59\x7a\xae\xed\x53\xb2\x3c\xbe\x8c\xd3\xa3\x2c\xcb\xa3\x38\x0d\x4a\x31\x11\x60\xbb\xb8\x0d\xb6\x8b\xdb\xcc\xb8\x76\x48\x79\x2e\x24\x17\x0c\x43\x1d\x87\x41\x02\x92\xb2\xed\xda\xc1\x5f\xa6\x3d\xc8\xf9\xd0\xd8\xb0\x20\x4b\xe9\xb2\x41\xc9\xc7\x93\xae\x20\x6a\xb5\xcc\xa4\x29\xba\xb6\x0d\x09\xf2\x52\x3d\x25\xca\xf9\xb0\xa7\x13\x94\x4d\xc3\x4f\x79\x30\x19\x61\x37\x71\x12\xa9\x62\x76\xaa\x7e\xc2\x94\xf3\xe1\x7f\x71\x21\xb0\x9e\x22\xbd\x41\x59\x9d\xa0\x2d\x12\x9d\x12\xb4\x8a\xfb\x7a\x29\x98\xc5\x05\xbc\x60\xb2\xca\x69\x83\xf6\x59\x5c\x1c\x29\xc5\x44\xa1\x3a\xb4\x53\x8d\x81\xf7\x25\x4f\xa3\x23\xfd\x08\x0b\x8a\x5a\x89\xb6\x8b\x4c\x31\xab\xef\x83\x89\x2a\x69\x25\x6a\x1f\x75\xb6\xb5\x3f\x14\xa4\x69\xfa\x5d\x19\x31\xf9\x87\x42\xc4\xee\x1f\x27\xc2\x9d\xcf\x5f\xf3\x60\x82\x71\x6e\xda\x30\x87\xa2\x62\x58\x91\x68\x07\x7a\x98\xca\x7e\xc4\xb0\xaf\x9a\x16\xbb\x8c\x54\x92\x0e\x6b\x74\x83\x35\x75\xe8\x8b\x03\xe8\xc4\xd9\xb0\x04\x57\xef\xd6\x55\x56\x9d\x48\xc2\x2c\x31\xbe\x5b\xc3\xc6\x82\xad\xd5\xc1\x4f\x16\xb5\x7e\x81\xda\xbb\xb4\x19\x43\x1d\x24\x1d\x94\xa5\xb0\x03\x1c\x93\x81\xce\x5d\x23\x58\x16\xe0\xb5\x87\x20\x27\xf8\xa4\xc4\xa5\x0c\x25\x7a\x84\x4b\x4a\xf6\xfa\x9a\x14\x23\x6f\x9b\x54\x2b\xd3\x49\x14\x94\x1c\x62\xb0\x6d\xab\x74\x6c\xaa\x50\x0d\x53\xdf\x66\xb4\x53\xc1\x95\x55\xf5\x3e\xdb\x96\x95\x6f\xba\xb2\x3e\x66\x41\xc9\xe3\xa1\x24\xd8\xe2\x18\x5e\x53\xbf\x4c\xa3\x93\x32\x08\x3f\xff\x94\x67\xd3\x49\xd1\x26\x76\x79\x00\xa0\x74\xd1\xca\x1a\xfb\xd3\x80\xdf\x74\x28\xf6\xb0\x6b\xf0\x06\x07\x38\x7f\xbb\x94\x67\x39\x9f\xd6\x61\x81\x6b\xb9\x96\xe9\xd4\x98\x0d\xab\xdb\x9a\xd7\x3c\x09\xe6\x34\x40\x1f\xc2\x55\xe6\xf1\xe5\x25\xcf\x79\xf4\x72\x58\xf2\xfc\x7d\x36\x2d\xf8\xfb\xec\xcb\x22\x5f\xf3\xb5\xf7\x4a\xed\x4e\xbb\xb1\xdd\x2e\xf3\x41\xe5\x46\x14\x54\x77\xf9\x26\xd4\xe1\x8d\x0c\xb8\xf9\x88\xf1\x22\x89\xd3\x72\x33\x8a\x0b\x38\xbf\x31\xd0\x7a\x6f\xa5\xd9\x66\x14\x47\x9b\xe3\x6c\x9a\x96\x9b\x05\x2f\x37\x91\x54\x1e\x6d\x3d\x50\x15\x1f\xc1\xbf\x8f\x74\xa8\x33\x09\x70\x97\xe5\x10\xc0\x18\xcb\xab\xf8\xc3\xa1\x59\x26\xb8\x11\xf4\x64\x6d\x15\x62\x0d\xa7\xef\x46\x52\x05\x72\x39\x19\x5b\xae\xcc\xd8\xb4\xe0\x32\xa6\xbc\x0c\x0c\x0b\x8d\x2a\xdd\x3e\x74\xa5\xda\x53\x96\xda\xaa\xc1\x5f\x47\x59\x82\x61\xf5\x49\x31\x35\x0a\x7a\x7e\xaf\xe7\x62\x67\x5f\x2d\xa3\x3b\xad\x9e\x7e\x1d\x47\xef\x05\x7e\x5a\xd6\x93\x5d\x12\xcc\xab\x52\xb2\x4d\xe9\x05\xe4\xd8\xdb\x5f\xb0\xb6\x3b\xc0\x55\x7a\xf2\xe5\xd4\x3c\x0d\xdf\x46\x1d\xda\x2e\x46\xbf\xee\x05\x51\xf4\x2e\x2e\x4a\xb1\x89\xb7\x49\x94\xc7\x1b\x8b\x34\x6e\x8c\xe9\xa1\x33\xb8\x5f\xe3\x24\xf9\xc8\x43\x1e\x7f\x41\x1e\xb5\x78\x90\x6e\x8d\x76\xca\x67\xe5\x07\x9b\x9d\x2b\xd7\x5b\x72\x17\x33\x03\xe9\x12\xf0\x19\x8b\x82\x32\xd0\x2f\x8e\x7b\xe2\xcb\xce\x27\x76\xa6\x03\xff\x0b\x68\xfc\x53\x0f\xaa\x06\x9e\x17\x55\xf8\xa7\xdf\x55\x0d\x7c\x0f\xab\xf0\x2f\x09\xe6\xd9\x94\x94\xc1\x6f\xbb\x4c\x21\x78\xdd\xb1\xf2\x62\x35\xd0\xcf\xda\x54\xa2\x5d\x7a\x1c\xe4\x97\x31\x81\x1e\xbf\x0f\x2c\x24\x11\xae\x6d\x78\x75\x4f\xa5\x1e\x3c\x78\x60\x11\x92\xc6\x35\x60\x0b\x4e\x01\xf0\xe3\xfa\x9a\x99\x2c\x44\x87\xc8\xc3\x5f\x56\xa6\xc4\x84\xc8\x95\x3f\xad\x6c\x89\x04\x91\x2d\x7f\x5a\xd9\x74\xfc\xa2\x0c\xfd\xbe\xbe\x5e\xe2\xb9\xb5\x57\xd3\xa9\x5c\x1b\x14\xa3\x20\x49\xb2\xab\x37\xff\x98\x06\x09\xf2\x68\xd3\x33\xe2\xae\x2b\x71\xea\xac\x04\xcf\x26\xba\xcc\x1e\x6a\x28\xf7\xc0\x5d\x56\x05\x97\x65\x96\xdc\x33\xf5\x34\x3e\x66\x3b\xa4\xad\x9b\x2e\x5b\x7b\x07\xd5\x50\x2e\xb9\x8b\x3e\x66\x3b\xb0\x93\x52\x6e\x60\x1e\xa1\x2d\x9e\x22\xef\x85\xca\xd9\xc3\xb1\x7c\xda\x71\x24\x97\xa0\x77\x96\x8c\x75\xb5\x7e\x86\x5f\x9d\xa9\x51\x50\xfc\x94\x64\x17\x41\xf2\x1a\xd7\xff\x6a\xdc\xd1\x5e\x0a\xd6\x0c\x8a\x4e\x52\x7e\xf5\x8b\x59\x5a\x76\x97\x2f\x0c\xb2\x6c\xbc\xb9\x8d\x0c\x0a\x4a\x4d\xf0\x61\xaf\x70\xe4\x61\xf0\x82\xfb\x6d\x1a\x71\x70\xf4\x87\x2b\xd8\x4e\xf7\xd5\x7a\x93\x46\x9e\x3a\x2a\x95\x82\xb2\xb5\xc5\x5e\x67\x69\xab\x94\xb0\xb2\x8b\x7c\x5a\x8c\x1e\xb8\xb0\xba\x52\x24\x25\xdc\xdb\xad\x06\x41\x58\x14\x96\xbe\xf5\xd5\x75\xc6\xdc\x77\xbe\x29\xf9\x2f\xbb\xb0\x06\x0e\x5d\x5b\xe8\x32\x34\x4e\x26\xf5\x8e\x16\x99\xd5\x91\xbb\xe0\xec\x3e\xd6\x83\xd1\x59\x90\x0f\xc8\xdc\x06\x51\xc4\x70\x83\xb7\x78\xfd\x1d\xc9\x0c\x0b\x7c\x57\x2c\xb5\xc2\x56\x16\x3f\x60\x7c\x39\x1f\x0b\xd1\xd8\x33\xc4\xbb\x92\x8b\x9a\x9d\x85\xac\x39\x44\x04\x7f\x5d\x21\xeb\x97\x74\xbc\x9c\x10\x49\x0a\x7f\x4b\x39\x72\xf1\x28\x19\xd5\x53\x36\x1d\x56\x74\xe4\xee\xc3\x43\xd6\x52\x03\x6c\x79\xfa\x6c\xae\x5f\x8f\x69\x73\x2e\x11\x67\x81\x9f\x78\x89\x87\x0f\xa5\x13\x54\xc1\xa1\x83\x24\x61\xb3\xcd\x60\x16\x17\x2c\xcb\xd9\x1c\x7e\xe9\x5a\xf2\x44\xe2\x1e\x49\xf4\xdf\xbb\xa0\xe4\x45\x89\xa9\xd5\x4a\x27\x32\x00\xb4\x68\x12\xd4\x4c\xf8\x77\x3a\xe2\xa0\x3c\x85\xde\xbd\xbd\xc1\x5d\xc4\x0d\x63\x97\x4a\xdd\xf5\xb6\xe4\xe3\x02\x2a\x2a\xe5\x7b\x21\x6a\xc7\x25\x1f\xd7\xc3\x5a\x18\x5e\xa6\xba\x8d\xa1\x9d\x4b\x91\xc6\x23\x76\x31\x87\xfe\xdf\x46\x2c\x48\x23\x2c\xae\x97\x9e\x39\x8d\xe1\x83\xe1\x1b\x77\x0f\x83\xf6\xe0\x11\x30\xbe\x37\x62\x30\xdf\x1c\x25\xcd\x82\xe7\x31\x2f\xf0\x98\x16\xe0\x4e\xc4\xe2\x82\x05\x93\x49\x12\xf3\xe6\x2e\xf4\x86\x27\x41\xe6\x69\xb4\x46\x07\xee\x09\x50\xff\x1d\x51\x3a\x50\xe5\xb7\x1e\xf8\xd7\xe8\x25\x57\x1a\xb8\xda\x95\x69\x8a\x28\x87\x2a\x83\x9c\x0f\x77\x2b\xa7\x1d\x91\xf8\x5f\x9a\x20\x50\x2d\xb7\xdb\x53\x09\xb6\x04\xe0\x16\x23\xf5\x5c\x7d\x25\x28\x8a\x95\xc2\xd2\x14\xb4\xdb\x7b\x29\x15\x94\xba\x5b\x95\x60\x17\x73\xa8\x4e\x15\xb6\x93\x3d\x27\x1e\x49\x6a\xaa\x3c\x49\xab\x1e\xe8\x6c\x61\x08\xca\x37\xc9\x42\xae\x24\xa4\x2b\x54\x05\x21\xf7\xe9\x61\xf5\xd1\xa1\x29\x87\xd4\xff\xdf\x7c\xce\x0e\x0d\xb2\x1f\xb3\xd6\xdb\xa8\x75\x40\xf7\x26\xc1\x3c\x04\x9f\x28\xc9\x02\x14\xe4\xf8\xd2\xac\x5e\xd5\x20\x5f\xca\x79\x50\x8d\xf4\xbc\xc4\x7b\x44\x35\x65\x1d\xcf\x50\x50\x6d\xfc\xf5\xe6\xc0\x3e\x0e\x02\x50\x1b\x1b\x00\x9c\xba\x37\xb5\xd8\xac\xa9\x0b\x0c\xd7\x90\xf2\xab\xf9\xcb\x19\x2f\x14\x41\x7f\x85\x16\xfa\xf0\xff\xae\x43\x25\x7d\xe7\xbb\xab\xf1\xd9\xd7\xbf\xba\x06\xdf\x7d\xf3\xb3\x96\x90\xfa\xf4\x63\x91\x38\xd9\x6d\x10\x45\x2d\x01\x93\x1c\x72\x1c\x3a\xdf\xd8\x70\xc6\x70\x5b\x5c\x41\x25\x8d\xac\xca\xca\xeb\xb3\x65\x96\xdb\x1a\x88\xfc\x06\xc8\x33\x84\xa5\xee\xd2\x71\xf0\xae\x8e\xd1\xec\xbc\x8d\x5b\xaf\xd8\x74\x2f\xe6\x90\x99\x4d\x44\x6a\xa1\x93\xd5\x32\x33\xcd\x2c\xd8\x8b\x3d\x5b\x31\xd9\x61\xd4\x8e\x0a\x6b\xc1\xfc\x9d\x3a\x0b\x5a\x64\x7b\x7a\x94\xb5\x6f\xb1\x1d\x2f\x16\x03\x5c\x29\xa0\x8b\x97\x7d\x6c\x53\x4a\x23\x5d\xbc\xe0\x63\x9b\xb6\x4c\x52\xd7\x30\xb2\x31\xd5\x30\xea\xb0\x59\x1c\x41\xeb\x29\xab\x69\xc0\x2f\x29\xdc\x4e\x50\x58\x2c\x29\xac\x2d\x28\x2c\x96\x14\xd6\x14\x14\x6a\x25\x05\x9f\x94\xb0\x8c\x98\x80\x8c\x73\x09\x61\xc1\xe6\xb0\x62\x5f\x7b\x52\x11\x19\x04\xa3\xd9\x95\x0c\xa7\xc2\xf5\xf5\xdd\xde\x93\x1e\xf0\xe5\xc5\x3b\xf9\x93\xc6\x9d\xdc\x91\x39\x9e\x34\x88\x26\x6a\xe7\x34\xe5\x9a\x19\xba\x2e\x7a\x3b\xc9\xe0\xc9\x6d\x25\x83\x27\x0d\x92\x81\x56\xdf\xd6\x6b\x6f\x17\x3a\xd4\x24\x03\x3b\xb6\x43\x15\x90\x34\x67\xa2\xe2\x42\xdd\x28\x04\xc9\x52\x17\x54\x3e\x9b\xd5\xb3\x87\x33\xa5\x5e\xd3\x8d\x01\x8f\x90\xfe\x53\x60\x2c\x7a\x06\xa9\x84\xb0\xb5\xc5\xde\x24\xf1\x18\xcd\x00\xa2\xe9\x24\x89\xc3\xa0\xe4\x91\xc5\xef\x1c\x31\x02\xa4\x85\x9c\x47\xd3\x90\x13\xcf\x07\x39\x2f\xe0\x5e\x07\x70\x52\x55\xda\x0d\x20\xfd\xbf\x94\x4a\x1f\xbe\x7c\x3a\x7d\xc6\xa4\x65\x08\xad\xd0\x2b\x2b\x64\x86\xf3\x2b\xc9\x8c\x16\x95\xc9\x6e\x69\xd0\x0c\xbf\x0e\xca\xe0\xf8\x0b\xcf\x87\x49\x76\xe5\xd6\xab\x14\x70\x5b\x28\xc2\x20\xa9\x00\x06\x89\x07\xae\x2e\x4d\xb2\x44\x6b\x98\x67\x7a\x19\x9c\xbb\x6a\x42\xe9\xbf\x8f\x47\x52\xa1\x89\xeb\xda\xd2\xb7\x5d\xf2\xf2\x35\x2d\xe5\x17\x26\x9a\x05\x86\xde\x30\x4e\x4a\x9e\x93\x39\x13\xbc\xbc\xe3\xb4\xa1\x37\x70\x91\x59\x01\x1d\xce\x17\xf8\x79\x60\x55\xbb\xe9\x34\x2d\xd8\x8a\x5c\x51\xbb\x52\x6d\x19\xa3\x56\x17\x08\x2b\x16\x56\xa2\x85\x3c\x65\xeb\x47\x27\x04\x14\x1f\x48\x9d\x72\x20\xe7\xee\x98\x61\x12\xb2\x71\x10\xa7\x95\xa0\x7f\x04\x4a\xb5\x38\x5e\x2f\x2a\x49\xae\x31\x9d\xb2\x16\x60\x08\x9a\xa4\xd7\xea\x34\x68\x80\x56\x65\x09\xa9\xf2\x38\x8a\x40\x1c\x0f\x05\x86\x5e\xcd\xc5\x9a\x01\xb6\x60\x61\xae\xab\xd6\x53\x17\x16\x60\xc7\x81\xd4\x28\x6f\x64\x04\x1f\x1c\xe2\xbc\x25\x84\x63\xca\x75\xaa\xe3\x90\xe8\x55\xd8\x5b\xfd\x12\x3e\x84\xf1\x8c\x82\xe2\xb5\x6e\x0b\xc7\x01\xc3\xeb\x1c\x2c\x31\x63\x06\x8a\x17\x0a\xbf\x7d\xe9\x9e\xa6\x52\x7b\x6b\x8b\xfd\x0a\x97\xc9\x72\xa8\x28\x7d\x8e\x82\x82\xb2\xc9\x92\xcf\xca\x2e\x88\x12\x41\xc2\x30\xf0\x74\xc1\x82\x9c\xb3\x69\x21\x72\x33\x6d\x1e\x85\xec\xa3\x0a\xa2\x0f\xb2\xdb\x3f\x1f\x6e\x77\xda\xdb\x5d\xb1\x20\x3a\xac\x2f\xdb\x74\xd1\x41\x8e\x37\x9e\x69\xf4\x4d\xdb\xd6\x16\xe3\x7a\x6b\x30\x3a\x85\x2c\xd7\xc6\x7f\x7c\x3c\x29\xe7\x0c\x63\x1f\x37\x0c\x0d\x7e\x54\xb9\x0f\x4f\xcb\xdc\x43\xf7\x8c\x38\x9d\x11\x25\xe0\xa2\xb0\xd5\x5a\x5d\x0f\x8d\xfd\x54\xc9\xe3\xa6\x92\xe6\xc5\x11\xce\xaa\x17\x43\xe0\x72\x28\xcf\xb3\xfc\x55\x90\x17\xaf\xd7\x5d\xaf\x73\x0c\x0f\x15\xe4\x05\x1a\x61\x8a\x46\xf1\x22\xc2\xbb\x5e\x57\x63\xee\x6c\x79\x06\x0f\x18\x37\x85\x7a\xa3\x38\xe2\x3e\x2c\x12\xd6\xe1\x93\x30\xd4\x9f\xc0\xaa\x83\x2c\x3f\x78\x9a\x70\x9c\xd2\x9e\xbe\xdd\xf9\xf3\x31\x2d\x4b\xc0\x52\x36\xba\xd6\xd4\xb2\xeb\x6b\xb9\xbb\x03\xa9\x05\xd3\x32\x6b\x75\x7c\xb0\xf9\x18\xfb\xb7\xe6\xce\x64\xcd\x56\xc8\xd7\xde\x91\x0d\x31\x37\x33\x68\x8d\xef\x75\xf8\xce\x41\x5d\xdf\x54\xcc\xdf\xd8\xa0\x52\xbf\xda\x8d\x6b\x92\x7b\xa3\xa0\x80\x4b\x37\x91\xbf\xc4\x72\xdc\xda\xc2\xb3\x1c\x15\xbf\xe3\x82\xb5\xf8\x6c\x12\x40\xa4\x7b\x38\xf9\xe1\x58\xc7\xc1\x9c\x5d\x70\x16\x06\x49\x38\x4d\x50\xde\x2d\xd8\xd9\x76\x97\xed\xf4\xb6\xcd\xdf\xee\x79\x1d\xa6\x2c\x11\x1f\x1c\x6a\x63\x27\xec\x05\xb6\x72\xce\xfa\x2b\x13\xc6\xc4\x25\x0c\x72\xf3\x88\xa4\xe1\x43\x56\x83\x52\xc7\x56\xe2\xf8\x67\xea\xce\x85\x8f\xcc\x1d\x05\x70\xa9\x5f\xe3\x72\x74\x12\x8c\xf9\x9d\x33\xb5\x3b\x64\x69\x82\xa1\xa1\xa9\x39\xb8\xd4\x74\xd0\x55\x91\xdf\x96\xa3\xcc\xd3\x8c\x45\xbc\xe4\x61\xc9\xae\x38\x98\xd0\x8b\xff\x71\xd0\x37\x80\x5f\x1e\xf9\x28\x81\x25\x71\x0a\x3a\x89\xac\xe0\x52\x8b\x15\x24\x57\xc1\xbc\x38\x19\x65\x57\xa2\xb4\x00\xe9\xae\xa7\x8a\x4b\xbf\xe7\x02\x3c\xf3\x3c\x02\x9d\xcf\xa9\x5d\xcd\xd1\x35\x63\x9f\x4a\xdb\xd8\xc4\xf7\x05\x8a\xc8\x29\xa8\x17\xd5\x32\xfe\xb5\xc7\xf1\xd2\xec\x9f\x27\x13\x1e\xc6\xc3\x98\x47\x15\xf0\x2d\x30\xc8\x40\xdc\xd3\xdf\x22\xe6\x6a\x8f\x53\x59\x4e\x52\x9b\x04\x75\x20\x76\xdf\x07\x41\x60\x60\x89\x37\xab\x02\x3d\x13\x57\xf0\xe3\xd1\xf5\x7a\xe9\x40\x89\x7f\x6e\x6e\x65\xeb\xea\x57\x93\x2a\x2d\xda\xf2\x73\xdf\x4d\x70\xcb\xe3\xb3\x02\xd2\x41\x15\xe1\x2e\x75\x90\x8d\xa9\x6f\x7d\xb9\x25\x51\x87\xd1\x97\xff\x3a\x47\xcf\x8e\x35\x5b\xd6\xdc\xe8\xe0\x06\x62\x32\x88\xbe\xba\xcb\xbe\x52\xf9\xef\x1e\x95\xd6\x82\xdd\x74\x4d\x75\x30\x37\xff\x1c\xa7\x91\xae\x12\x65\xbc\x80\xb7\x33\x92\x17\xb2\x38\x45\xeb\xd7\xbb\xd1\x70\xaf\xab\xa4\x86\x8b\x28\xc9\x0e\x6e\xe0\xa6\x82\xc9\x7b\x0b\xa6\xed\xf6\xff\xad\xdb\xfe\xdf\xa4\xdb\xd6\x7f\xab\x2b\xb9\x81\xc4\x96\xd2\x72\x5b\x77\x63\x83\x9c\x0f\xf7\x5c\x35\xb7\x57\x57\xbd\xd7\xa8\xab\x06\x1a\x52\x05\xc5\x47\xa3\x2a\x7b\x6f\x49\x55\xf6\xde\xf2\xaa\xec\xbd\x5b\xaa\xb2\xf7\x6e\xab\xca\xde\xbb\x27\x55\xb6\xa3\x9d\x76\x55\x93\x15\x43\xc0\x65\x14\x93\x8b\xee\x31\x57\xbf\x83\x34\xfc\xbc\xe3\xa0\xa0\x41\x37\x48\xcb\xfd\x31\xda\x77\x0b\x02\x39\xa9\x32\x3a\x30\xfe\x09\x89\x91\x3c\x5d\x50\x1c\x53\x5a\x23\xc5\x85\xad\x94\xea\xd6\xd5\x93\x6e\xba\x0b\xbb\xae\xe0\x12\x8e\xc6\x2a\x1b\x02\x5a\x17\xf5\x3f\xd7\x6d\x60\x45\x8b\xc3\x36\x75\x3e\xb7\x3a\x97\x92\x9e\xdb\xa9\x7d\xcb\xe0\x9c\x04\x6e\x7b\xdf\xb0\x50\x05\x7f\x3b\x0d\x31\xcc\xd2\xe3\xc7\x07\x8b\xd4\xc6\x1e\x05\xef\xbf\xf6\xe1\xfb\x1e\xf4\xd2\xdf\xf6\x80\xfb\xa7\x3b\x20\x79\xa6\xea\xce\x51\xbc\xe8\x28\x24\xb8\x93\xf5\x2e\x54\x1f\x88\xfe\xef\x3c\xef\xeb\xb3\x3b\x9a\x51\xd9\xa8\x59\x7c\x36\xfc\x33\x53\xd8\x5d\x1f\x54\x17\x9e\x4b\xed\xee\x3d\x08\xad\x1e\x6e\xc5\xb4\xc8\xa7\xf9\xd5\x23\xa5\x8a\x95\xd7\x27\x8f\xe0\xcf\x54\x67\xc0\xbf\x7c\xe9\x67\xb8\xaf\xfe\x85\xed\x9e\xdf\xee\xa0\xec\x1e\x62\x6b\x97\xca\x7d\x1c\x65\x61\x13\x2d\x60\xc5\xce\xa5\x4a\x1a\x64\xf8\x34\xb3\x2d\x0a\x4d\x59\x51\xc6\xee\x8e\xbd\x60\xad\x0b\x50\x46\xf6\x59\x2b\x89\x53\x1e\xe4\xad\xee\x9d\x1d\x98\x97\x3a\x31\x7b\x8f\x06\x61\x19\x7f\xe1\xc6\xe7\x40\xe3\xe1\xc0\x29\xdb\x2e\xd1\x91\xe0\x69\x1c\x7e\x2e\xba\x2c\x80\x6c\xc9\xfa\x61\x53\x3c\x06\xaf\x2a\x7e\x21\x98\x98\xaf\x63\x9a\x23\xe2\xe2\x25\xd3\x21\xa3\x7d\x9c\x91\x2e\xce\x1d\xa3\x49\xcf\xb5\x15\x46\xe2\xc1\xfe\x0e\x0f\x59\x6b\x94\xe5\xf1\x3f\xb3\xb4\x0c\x92\x8a\x36\x90\x86\x8a\x82\x96\x7a\xa1\x1e\x26\x78\x5f\x50\xe3\xe9\xcd\x55\x38\x2c\x89\x59\xb3\xab\xd3\xae\x54\x34\xdc\xc6\x8e\x74\x9b\x18\x9c\xca\xed\x77\xa9\x8e\x42\x51\x2b\x0e\x2b\xfd\x80\x71\x87\x8a\xe3\xe7\xb6\x5c\x95\x97\x06\x3a\xfc\x9e\x06\x0a\x53\x0e\x96\x60\x54\xb2\xc6\x32\xbb\x94\xcf\xeb\x9a\xe2\xb3\x13\x91\x76\x9a\x69\x3f\x7c\xc8\x5a\x35\x3c\x21\xa1\xaa\x5e\x38\xef\x2a\x98\xbb\x72\x9c\x1d\x8f\x76\x0e\xe3\x59\x61\x7e\x57\x06\x9e\xea\xab\x8a\xce\xe2\xab\x5d\x7a\x10\x3a\x46\xa1\xa7\x09\x95\x20\xe0\x4a\x94\x6b\x48\x21\xe1\xc0\xb3\x94\xff\x14\x38\x54\x28\xf4\x63\x50\xe2\xcf\x41\x5f\x05\x7b\xcd\x16\xa7\xae\x57\x93\xa5\xb4\x78\x71\x8a\x7e\x34\xa4\x0e\x6f\x9c\x4d\x05\xed\x4b\x05\x5c\x97\x46\xb0\x41\x4e\x2c\xea\xc8\x42\xa8\xb4\x8b\x31\x6d\x91\xc2\x0e\x3c\x85\x30\xa5\xb4\x81\x0f\x7c\xb8\xbe\x8c\x32\x06\x9e\xb6\x58\x87\xa5\x26\x25\x0c\x94\x7e\x9b\x0e\xb3\x26\x16\xab\x0b\xb5\x01\x98\xca\x4b\x21\x75\xd0\x47\x6f\xb1\xf6\xa2\x77\xc2\xfa\x54\xe6\x03\x0c\xed\x55\x55\x6d\x08\xb7\x98\xde\xaa\x3e\x25\x49\xd0\x72\xd9\x0e\xc6\x2f\xb4\x81\xb3\x0f\xd4\xcb\x59\x98\xf8\xfa\xc2\x00\xb0\xfa\x52\x10\x44\x34\xe2\x24\x07\xba\x06\x6c\x75\xdd\xe1\x39\x20\x28\xca\x57\xbb\x4f\x9c\x7e\x14\x29\x6d\x8e\xde\x6c\xfe\xa7\xcb\xe4\xaf\xdf\x48\x45\x3c\x85\x7a\x76\xb3\xe5\x10\x8e\x6f\x40\x77\x1b\x1e\x9b\xce\x88\x03\x19\x2c\xdc\x9b\x39\xee\x63\xf0\x6f\x5e\x2d\xa8\x92\xdc\x07\xe5\xc6\x51\x0e\x5e\x9d\xc3\x5b\x93\x8d\x0d\xd3\xd7\xc6\x86\x6e\xae\x7a\x48\x9f\x9d\x48\x9b\xba\x15\x2d\x82\x02\x45\x1c\x2f\xd3\xb9\x94\x96\x8f\x87\xd8\x96\x0c\xf9\xa8\xba\x56\x86\x7a\x76\xff\xf3\xfb\xee\x7f\xde\xdc\xff\xec\xef\x32\x7a\xbb\x44\x84\x40\x1c\xfc\xea\xc5\xa9\xd8\xd8\xd9\x0b\xfb\x5b\x13\x50\x47\x9b\x2d\x39\x03\x52\x0d\xce\x75\x83\x73\xa7\xc1\xb9\xaf\xc1\xdf\x3a\x3e\x3b\x28\xdf\xfe\x01\xaf\xc6\x11\xee\xbe\xfc\xb7\x2b\xbb\xed\xab\xee\x6b\xd8\xb4\xa1\xd2\x27\x0d\x54\x5a\x0a\xf9\x4b\x53\xde\x93\x5e\x96\x47\x3c\xe7\xd1\x29\x95\x00\x2b\x5a\x5a\x52\x5e\x8a\x71\x55\xa5\x2f\x95\xef\xaa\xe5\x21\xd9\x91\x0c\x27\x99\xf6\x3e\xa1\x99\x82\x84\xe3\x43\x56\xe8\xcd\xce\x59\xfc\x44\x74\x5c\xe3\x44\x78\x61\xf3\x22\x94\x88\x05\x90\xd8\x30\x46\x0b\xcf\x8a\x2e\xe2\x0b\x0f\x6a\x1d\xf7\x79\x0f\x81\xe4\x87\x43\xb6\x0d\x86\x14\x64\xb8\x1e\xad\x19\xd4\x50\x81\xbc\x6a\x25\x62\xb7\x21\x2b\xb3\x87\xee\x05\xbd\x2d\x7f\x08\xe6\x49\x16\x44\xe4\x8d\x8c\xc4\xa7\x74\x78\x45\x41\xae\xd8\x7b\x06\xce\xa9\x80\xbe\xb4\xa9\x1c\x18\x9a\x4e\x0a\x4b\x11\xb9\x4d\x63\x88\x7e\x84\x55\xea\xa1\x69\xdb\x9e\xc2\x80\xc4\x3e\xfd\xe8\xda\x48\xe8\xdb\x9f\xdd\xca\xf8\xfa\x95\x94\xa5\x45\x21\xca\x1b\x16\x5d\x62\x82\xf7\xb1\x32\x63\x17\xdc\xe8\xcb\x95\x54\x23\x27\xd9\x23\xd7\xa8\x2b\x29\x4a\x63\x8c\x31\x9c\x08\x73\x23\x65\xc9\x2c\x46\xc2\x51\x8f\x6e\x9c\xbf\x53\x02\x51\x36\xac\xf4\xde\x20\xf3\xd8\x64\xd4\x24\xf8\x34\x10\xdc\xa2\x7b\x27\xe2\x60\xc5\xce\x5b\xfb\xd2\x84\x78\xb8\x21\xbd\x34\xad\xe7\xbf\xb2\x6d\xf0\x98\xe2\x00\x59\x4d\x52\x11\x22\xaf\xaf\x99\xc3\x0f\x7c\xb7\x23\xb7\x93\x3b\x64\xfe\x9a\xaa\xfa\x51\x1c\x71\x5b\x51\x2f\xf5\x74\xce\x09\x5b\x24\xd6\x9c\x72\x5d\x6d\x85\xe7\x60\x45\xcd\xf6\x77\x9b\x5f\x20\xf8\x5f\x16\xec\xd6\x3d\x2d\x48\xa5\xb7\x42\xab\x6c\x4a\x3c\x16\xaa\xbf\x69\x1a\x97\x95\x82\x22\xd1\x2d\x88\x47\x92\x12\xbc\xed\xd9\xa5\x75\x0e\x15\xc4\x4c\xd8\xc4\xa6\x48\x89\x88\xa3\x4e\x97\x9d\x59\xbc\x6e\xd5\x17\xa9\x9f\x95\xec\xf3\x21\xe7\x85\xd2\xd1\xbd\x2c\xcb\x3c\xbe\x98\x96\xbc\x20\xea\xca\xca\x69\x4f\xe2\xb1\x6f\x8c\x1a\x05\x12\xfa\xf0\xff\xae\x19\x7c\xdf\xfc\xb4\x11\x24\x70\xdb\x47\xb4\x5f\x5f\x33\xef\xac\x40\xc0\xbb\xd5\x6d\xf0\x72\x35\xb8\xf7\x81\x38\x51\x26\x59\x7e\x3c\x94\x1e\x26\x05\x8d\x5b\x83\x73\x54\x1c\xc0\x70\x56\xed\xf7\x4a\xf5\x0b\x82\xd4\xab\xf9\x6b\x49\x89\x55\xd5\xb9\xb5\xe5\x6a\xf3\x50\x07\x9a\x89\xda\x69\xea\xab\x5a\x5b\xca\x79\xc7\x52\xf8\x9d\x9d\x77\x16\xeb\xf5\x7e\x84\x39\x5a\x78\xdf\x4f\x8a\xa9\x2b\xe2\x70\x9a\xe7\x3c\x45\x7f\x28\xde\xa7\x6d\x4f\xfc\x4f\xdb\x2a\x7c\x99\x36\x74\x8b\xc7\xe8\x56\xb5\xda\xeb\xfa\x4c\x9d\x5f\xad\xe2\x99\xc7\x5d\x17\x71\xc5\x65\x95\x55\xe9\x0b\xcc\x00\xac\x3a\xb7\xb0\x06\xa8\xd4\xf3\x1b\x05\x5c\x04\xf9\x49\xfc\x4f\xae\x2f\xfc\xe5\x77\x8d\x0f\xb3\x7a\xcb\x81\x8b\x20\xff\x09\x8e\x86\xba\x99\x9f\xdc\xf3\xe3\x45\x90\x4b\x75\xf4\xdc\x29\x4a\x92\x9d\xf7\x88\xe0\x5d\xe9\x7d\x30\x7b\xe5\x80\x39\xd6\x49\x0e\x15\x0c\xa4\x11\xc9\xcf\xc1\x98\xbf\x9a\xbf\xb3\xb4\xbd\x9e\x2c\xa9\xcb\x74\x16\x08\x78\x0a\x8e\x43\x55\x58\xb0\x5b\x4f\xdd\x9e\x53\xcc\x61\x35\x42\x3c\x5f\xd0\x00\x2d\xe3\x8c\x63\x14\x14\xaf\x82\xdc\x27\x25\x60\x8e\xf3\x18\xdd\x39\x6c\x14\xf1\x3f\xc1\xe9\x0a\xfa\xa8\x12\x0d\x6d\x6c\xac\xcc\x7d\x62\xc5\x7d\x24\xc6\xa1\x61\x60\x3d\x5f\x15\xf9\xf4\xd5\x8f\xfa\x37\xe5\x15\x5b\x0c\xe4\xe2\x3c\x52\xcb\xf5\x8c\x6a\xd4\xdd\x0b\xc0\x2c\x7f\x13\x84\x23\xe7\x06\xd0\x09\xa8\x6c\x9a\xf6\xbe\x9c\x7b\xb2\x9c\x81\xca\x5a\x4f\xdf\xbb\x70\xf5\x58\x39\xa2\x0c\x44\xaa\x7e\xe4\x68\x2e\x1e\x1b\x24\x0c\x53\xa3\x4e\xbe\x80\x7d\xc6\x5a\x1a\xb4\x92\x77\x81\x48\x1f\x66\x86\x6c\x81\x2b\x91\xdb\x52\x97\xf0\xd1\xb5\x45\xe5\x65\xa2\xa2\x5b\xb7\xba\x45\xf3\x35\x75\xc5\x89\x14\x75\x60\xb6\xfb\xe3\x7a\xf9\xd0\xfb\x20\x88\xc6\x10\xd9\x73\x2e\x09\x6c\x8b\x11\xca\x08\xcf\x50\x7d\x4e\x5d\x77\xbc\x0f\x26\x36\x90\xd2\xfe\xc6\x19\x5a\xb5\xa2\x3b\x38\xd3\xaf\x1c\x9b\xd4\x73\xc9\x9f\x67\x71\x74\xbe\xcc\x65\x86\x1c\xb4\x76\x26\xb6\x07\x1e\x3a\xaa\xd7\xb0\x3a\x5f\x22\xa8\x67\x3b\x7b\xe8\xdc\xa2\x86\x18\x0d\x1c\xd8\x5b\xab\x5f\xf4\x4f\x15\x93\x80\x86\xe8\xfb\x24\x80\xa6\x63\xee\x8a\xf7\x9c\x5b\x46\xc7\xe4\xd6\xa6\x30\x89\xca\xe3\x8b\xdf\x2d\xe2\xf2\x52\xa4\x52\xe1\xf8\x2a\x98\x21\x56\xaa\x02\x8f\xd2\xac\xa2\xc1\x34\xc6\x5a\x37\x15\x0b\x19\x3b\xd7\x7a\xa5\xb2\x2a\x4e\x4b\x85\xd3\x13\x03\x22\x5a\x50\x20\x66\x91\x07\x36\x00\x41\xb2\x2a\x18\xbe\x08\xd2\x48\xf2\x8d\x55\xe1\xbb\x34\x1b\x03\xb6\x45\xa7\x5d\x61\xbf\x6b\xe6\xa6\x02\xc3\xd8\xe2\x5e\xab\x3c\xe2\x73\x98\x60\x87\xbd\xa8\xca\x0c\x7d\x97\x55\x56\x51\x91\x7f\xc8\x8a\x18\xb8\xce\x5d\x6c\x98\x23\xb2\x61\xea\x86\x71\xc3\xf4\xc8\x4c\x7d\xf9\x6f\xd7\x11\x90\xfa\xce\x77\x57\x4f\x59\x5f\xff\xea\xea\x9d\xbe\xaf\x7f\x9d\x19\xee\x7c\xde\x25\x28\xee\x93\xdf\x35\x1a\x23\x75\x47\x23\x78\x72\xc1\xa3\x1f\x53\xc9\x03\xe1\x35\xaf\xe0\x85\x60\xf1\x47\x3f\xc4\x3e\x0a\x3c\xbc\x40\xf2\xac\x9c\xce\x49\x63\x4d\x2c\x7c\xdf\x61\x8d\x96\x70\xd0\x9b\x4c\x8b\x51\xc5\xc4\x44\xba\x55\xb4\xdf\x4a\x98\xde\x6c\x4f\x90\x92\x27\xc0\xfe\x4e\xb7\x7d\xe7\x0c\xd4\xb5\xfc\x8b\x77\x3d\x47\x52\x31\xf2\x3e\x1a\xef\xfb\xe6\xc3\x81\x91\x51\xda\xea\xd3\x8f\xae\x3c\x41\xf4\xe5\xbf\x5d\xca\x87\xfa\xf4\xa3\xeb\x58\x86\xac\x63\x18\x5b\x85\x2f\x4b\x05\x8a\xe1\xda\xef\x1d\x0f\xbe\xac\x71\x48\x8d\x50\x35\x9d\x8d\x2f\xe2\x94\x43\x34\xb0\xbf\x05\x69\x94\xf0\x5c\x32\x04\x29\x84\x8d\x20\xd1\xee\xb4\x0b\xba\xa4\x2e\xd9\x6f\x7b\x59\x6a\xb2\x3b\x8d\x60\xbf\x49\x41\x29\xf0\x6d\xc1\x86\x4e\xeb\xc1\x86\xec\x8e\x03\xf5\x8d\xd8\x05\x35\x59\xee\xcb\x88\x1d\xf6\x1f\x9c\x9f\xa1\xbd\xcf\x7c\xce\xae\xaf\x59\x4b\x7c\x6c\xb6\xd8\x63\x94\x75\xdd\x26\xeb\x77\xf9\xfd\xae\x7b\x8c\xd1\xab\xc0\x15\xf3\xce\x1b\x84\x85\xfd\xae\x75\x92\xe9\xfa\xb7\xe3\xe6\x06\x5a\x41\x1a\xe3\x5d\xfa\xdb\xa8\xd5\xd5\x07\x62\x22\x13\xec\x77\x2a\x73\x0c\x3c\x5b\x92\xf0\xaa\xca\xa8\xcc\xd8\x3b\x1e\xe9\xe6\xe8\xde\x69\x1b\xb9\x57\x60\x30\x8b\xfd\x81\x3d\x91\xb6\x4a\x91\xa6\xbb\x4a\x50\x8b\x91\x2d\x56\x9b\x1c\x4d\xf3\x22\xcb\x75\x58\xcb\x26\xd5\x89\x53\xb4\x7d\x1b\x4b\x27\x5a\x0e\x6f\xbc\xf6\x1a\xee\xde\x3c\x37\x2c\xb2\x52\xcf\xcd\xaa\x51\x92\xa8\xe2\x3e\xfd\x08\xb9\x99\x7b\x65\x64\x12\x55\xc3\x93\x5b\x39\x29\x27\x43\x59\xc9\xd7\xd4\x16\xdb\xad\xce\x0a\x5d\x78\x45\x99\x67\x9f\x79\x9f\xb5\xd2\x2c\xe5\x96\x49\xdc\x30\x4e\x92\x3e\x6b\xfd\x67\x18\x86\x56\xfa\xac\xcf\x6a\xcc\xba\xd8\x8b\x0a\xb2\x7a\x33\xb6\x69\x60\x54\xec\xbe\x97\xf0\x61\xc9\x1e\xb3\xed\xde\x3e\x6d\x79\xde\xd4\xb2\xac\x59\x66\x13\xac\xc8\xaa\x37\x41\xbd\x39\xe9\x8c\x36\x0c\x2e\xdb\x9b\x1a\xf7\xa1\x4e\x03\x8b\x0e\xdf\x37\xd9\x0e\x6d\x12\xfd\xbc\x2f\x01\xb0\x74\x08\xbf\xc9\x76\x58\xdf\xd7\x8f\x59\x3f\xcb\xae\x8f\x0f\x59\x9c\x96\x8d\x7a\x45\x5a\x6e\xcd\x95\xb1\xbf\xca\xca\xd8\xbf\xdd\xca\xd8\x97\x2b\xc3\x21\xed\xd9\x4e\x8d\x3b\x99\x79\x5d\xc6\x6c\xb7\xae\xc6\xae\xef\x31\xc2\xd2\x16\x8a\x00\x49\x95\xb4\x29\x1f\x84\xae\x67\x96\xb3\x73\x00\xd3\x90\xad\x95\xb5\x6b\x65\xb1\xc7\x36\xb5\x78\xfd\x2f\x2e\x61\xe0\x38\xf7\xc2\x39\xaf\xf4\x3c\xb7\xe0\x9c\x11\x38\xc5\xc2\xac\x0c\xcb\x5e\xb4\x74\x55\xf8\xbd\xe1\xaf\x74\x96\xa9\x80\x1d\xce\x3a\x70\x73\x77\x47\xad\xcd\x3b\xcd\xe6\xa9\x4d\xa6\x9c\xe1\xcc\x87\xd7\xd0\x23\x50\x86\x73\x6f\xc9\x8a\xfa\x8a\xb1\x38\x4d\x79\xfe\x51\x19\x36\x56\xaa\x90\x6c\x8f\xfc\x37\x2d\x9b\xea\x92\xec\x6a\x5d\x65\x22\x59\xa9\x55\x35\x95\x54\x6f\xb1\x52\x8e\xbc\x64\xa9\xc3\xf2\xed\xed\x23\xc3\x59\x97\x85\xe2\x70\x41\x86\x2c\x4d\x22\xab\x1a\x26\x18\xdb\xb7\x80\x86\x22\xd1\x0b\x0d\x2c\x1b\x83\x1c\x9b\x1d\xc8\xb5\x48\xb2\xe7\x07\x55\x56\x65\x06\x53\xa9\xed\x64\xcf\x3d\xc6\xc8\x9e\xf3\xe4\xf2\x84\x3a\x58\x9e\x52\xf3\x5a\x42\xcb\x6b\x68\x0c\x9e\xf8\xbe\xac\x23\x34\x93\x5b\xad\xc9\xd3\xa8\xb6\x9e\xca\xf3\xd0\x28\x34\x79\x9f\x54\x31\x10\x64\x31\xa0\x36\xbb\x66\x14\x1e\x2a\xe5\x69\xf4\x6d\xa1\x51\xb8\x71\x7d\x4d\x78\x24\x3e\xf1\x37\x01\xd1\xa0\xcf\xce\x0c\xe2\xba\x1a\xe8\xca\xdb\x90\x70\xd6\x67\x03\x5c\x17\x7d\xda\x6d\xdf\x83\x8c\x3e\xf9\x6d\xc0\xea\xeb\x5f\xf6\x51\xa2\xe6\x24\x51\x91\x58\xcf\xc0\x62\x7f\xb6\x03\x96\xfa\xf3\x1d\x10\x8e\x20\x65\x17\x53\x76\xd9\xcd\xf9\x12\xaf\x2d\x9c\x1b\xa8\x45\x4f\xb1\x7d\x57\x65\x8e\x49\xf0\x52\xe2\x83\x7e\x75\xe0\x9c\x3c\xfb\xac\x05\xb6\x90\x2d\xfb\x94\xd9\xd7\xfe\xc9\x6f\x56\x15\x04\x1a\x7a\x9c\xf9\x7b\x9c\x2f\xdb\xa3\x7f\x9f\x6c\xe8\x10\x69\xc4\xdf\x2b\xf0\xd5\x6a\xcf\xd5\x13\x8b\xa7\x5d\x53\xb7\xd2\x2c\xe9\x72\xa1\x58\xed\x31\x62\xac\x8f\x27\xd1\x64\xf0\x78\x9b\xa7\x36\x2b\xd3\x90\x79\xb4\x52\x17\x4b\x62\x79\xea\x30\x8f\x6a\x96\x69\xab\x71\xde\xdd\xf7\x16\xf5\x33\x59\x79\xe0\xd2\x38\x39\xd2\x46\xbc\x76\x42\x94\x0d\xf9\xac\xcb\xe6\x77\x3e\x01\x42\xfa\x5c\x02\x9b\x20\x95\xa8\x03\x0d\xb1\x86\xab\x9c\x69\xd4\xe3\xfa\xb7\x08\xb4\x38\x2f\xb0\x1f\x6c\xe9\x7a\x63\x83\xcd\xd8\x5f\x9b\x24\x6e\xb0\x5e\x26\xd5\xc4\xe9\x01\x92\xfe\xda\x7c\xa0\xa8\xce\x99\x01\xe4\x85\x64\xa6\xc8\x4b\xd9\x4d\xc5\x8e\xda\x6b\xaf\xfc\xb4\xe9\x64\xa8\xd6\x26\x35\x98\x7f\xda\xa3\xc9\x76\x05\xb3\x62\xed\x1a\x56\xba\x3b\x6f\x56\x2f\x1b\x1b\x76\x23\x1e\x3b\x5e\x55\xfc\x1e\x6d\xdb\x29\x48\x5e\x93\xda\x55\xc5\x01\x54\xd4\x4a\x7a\x3f\x1e\x9e\xf0\xb0\xcc\x72\x65\x87\x40\x27\xaf\x6b\xc6\x79\x4b\x6b\xd8\xca\xea\x43\xaf\x8b\x5f\x78\x5a\x16\xc7\x43\x19\xd2\xb1\x76\x29\xfa\x0a\x57\x74\x0f\xc4\xc3\x06\x59\x95\x35\x6e\x36\xa4\xb2\x04\x6e\xfc\x56\x0f\x12\x11\xeb\x20\x11\xa0\x04\xf5\x87\x89\x68\x68\x75\x67\x30\xd0\x61\x84\x06\x92\xef\x1b\x52\x50\x7e\x1d\x44\x7b\x07\x3e\xe8\x11\x23\x46\x3b\xf7\x56\x5e\x28\xd9\xc1\x94\xe5\x1b\x91\x17\x16\xcd\x52\x6d\x7a\x1f\xf1\x85\x7a\x78\xa2\x83\xaf\x16\x7f\x9f\x7d\xe1\xd5\xd2\x10\xef\xb4\x5a\x58\x5e\x7a\xb8\xa5\xf1\x5a\xc2\x2a\x7e\x9a\x4d\xc3\x51\xa5\x6d\x9d\x4a\xa4\x86\x3e\x84\xd4\xa0\xa8\x80\x73\x8c\x46\xc4\xaa\x13\xc9\xe5\x44\x26\xaa\x31\xd7\xae\xb2\x62\x2f\x8c\x30\x1e\xeb\xde\x3d\x0a\x6a\xeb\x9a\x8c\xc0\xd9\xb5\xe7\xaf\x12\x15\xd6\xb2\x1b\x3f\x1d\x71\xa6\x42\xa3\x81\x9f\x5b\x3e\x9b\xf0\xb4\x88\xbf\x70\x56\x66\x2c\x87\x80\x8c\x2c\x4b\x59\x12\xe4\x97\xda\x17\x51\x49\xbc\x30\x15\x19\x9b\xe4\xd9\x97\x38\xe2\x60\x60\x1e\x5c\xc4\x49\x5c\xce\x45\xe5\xa2\xcc\x72\x48\x1c\xb3\x38\x95\x81\x61\x83\x34\x62\x59\x9a\xcc\x55\xe4\x3a\xc8\xc5\x17\xd1\x3c\xe4\x45\x11\xe4\x73\xd3\x74\x39\xe2\x73\x80\x29\xe2\x13\x01\x48\x5a\xb2\xe9\x24\x43\x43\x76\xf4\xc4\x24\x9a\xa3\x0e\x93\xac\xba\xd2\x4d\x52\x91\xb1\xb8\x6c\x15\x2c\x1e\x4f\xb2\xbc\x0c\xd2\x92\x95\xa3\xa0\x44\xb7\x5d\x63\x5e\x8e\xb2\x08\xfd\xaf\x24\x09\x8f\xd8\x20\x18\x96\x3c\x1f\xd8\xed\x20\xe8\x71\x21\x81\x8e\xd8\x55\x5c\x8e\xc0\xcf\x9f\x8c\x2f\x9b\x97\x5b\x12\x8a\x38\x24\x51\x25\x4c\x2b\xfe\x70\xb7\xfa\x4f\x4c\xc2\xc4\x89\x7d\x7b\x21\x5d\x0e\x0f\x33\x19\x13\x54\x85\xbf\x15\xcb\x6d\x1c\xf8\x22\x5f\xfc\x4b\x3b\xae\x72\x3a\xd0\xb6\x97\x06\x43\x92\x64\xe2\x26\x77\x57\x38\x55\x3f\xab\xb0\xbf\x40\x86\xdc\x3c\xc9\xac\x7b\x70\xb0\x74\xa4\xc0\xda\x2d\xe4\x16\xb1\x06\x73\x3e\xdc\xf7\x9a\xc7\xee\xf9\xcd\x63\x27\x24\xf6\xfb\x7e\x5d\xd8\xdc\x8a\x03\xaa\xfd\xdb\x3a\xa0\xda\xef\xd5\xdf\x37\x13\x4b\x58\x2c\x4a\xe2\xd1\xaa\x32\x6b\x05\x13\xfd\x07\x30\xc8\x2f\x41\x12\x8b\x76\x7f\x15\xd2\xe2\xdf\xf0\xf2\x41\x8a\x09\x76\xf4\xf0\xce\x0a\xef\x57\x97\x8b\xf5\xb0\x84\xc1\xec\x82\x70\x10\x55\x44\xeb\x52\xd5\x88\xc6\x39\xff\xc2\xf3\x82\x03\x7d\x1c\xe7\x11\x3c\x10\xc0\xb2\x95\x9c\x25\xcc\x65\x77\xef\xc9\x5e\x76\x77\x6d\x83\xd9\xdd\x26\x8b\xd9\x8a\xfd\xf7\x3d\x06\xd5\xfa\x49\xf5\x05\x12\x95\x6b\x7c\x6b\x99\x93\xaf\x6a\x97\x50\x58\xc6\x5f\xd8\xdc\xab\xb9\xb4\xba\x44\xc3\x7f\x8f\xab\x9c\xca\xa5\xbf\xb4\x54\xb4\x15\x04\x3a\x91\x12\x5c\x95\x8a\xdc\x17\x8c\x77\x61\xb9\x09\x06\xa8\x38\xc3\x7e\x5b\xcc\xc5\xae\x0a\x1a\xfc\xd2\xc0\xf3\x1a\xc9\x06\x7b\x9e\x08\x7b\xd6\x6b\x3e\xd1\xfd\xed\x42\x65\x34\x84\x1e\x73\x06\x23\x44\x5a\x77\x26\x6c\x83\xc1\x7b\x8f\x8b\x61\x47\x86\x75\xfd\xb4\x54\xcf\xec\x5a\xb5\x83\xf4\x50\x6b\x3f\x65\x5b\x48\x35\x23\x4c\x80\x41\x3a\xc5\xb5\xd0\xfb\xcc\xe7\x45\x5b\xb6\xd8\xf1\xd8\x76\x7f\x76\xe3\x5e\x28\x9b\x93\xcf\xe0\xc6\x49\xda\x54\x38\x73\x4b\xcb\x74\xb5\x51\xd5\x67\x3e\xef\xe5\x7c\x92\x04\x21\x6f\x03\x79\x75\x59\xab\xd5\xe9\xa2\x5f\x06\x31\x2b\x14\x47\x0e\xbd\xab\x15\xa3\xc2\xdb\xf8\xad\x4a\x1d\xfb\x61\x38\xf8\x80\x09\xac\x79\xe7\x4f\xdf\xc4\xfe\x84\x81\x1f\xb2\xbc\x4d\x9a\x77\x27\x46\x19\x8d\xfc\xe4\x7d\x6a\xe8\x7f\x36\x53\x6b\xee\xb6\xba\xb1\x98\x27\x0c\x38\xa5\xc4\x45\xfe\x1b\xeb\xa3\xcb\xd9\xa6\x6f\x64\x02\x1a\xcf\x27\xa4\x6b\x3f\x82\xfa\x35\xe9\x8b\x63\x0f\x7a\x6d\xf1\x3c\xa0\xd3\xf5\xa4\x66\x59\x63\x9b\x1c\x91\xf4\x19\x89\xf1\x22\x89\xd3\x72\x33\x8a\x8b\xe0\x22\xe1\x8c\xa5\xd9\xe6\x54\x9c\x86\x8a\x30\xcb\xf9\x66\x84\x77\x91\xb5\x12\x25\x89\x83\x5c\x2b\x33\x5a\xb1\x92\xc9\xb2\x69\xd8\x71\x9e\xca\x1d\x07\x8f\x76\xe6\x5d\x39\x1c\xc9\x8f\xb8\x38\x57\x8b\x2d\xa6\x97\xa5\x4d\xfb\x56\xb5\x15\xd4\x08\x9c\xfc\xf6\xf3\xd1\xe0\xcd\xdf\xdf\xfc\x7c\x2a\x1a\xb1\x4e\xa2\x1f\x79\xc8\xe3\x2f\xfc\x64\x9e\x86\x95\xf3\x68\x73\x70\xea\xa5\x61\x2e\x78\xf9\x3e\x98\x29\x8c\x14\xcd\x31\x9c\x97\x6e\x75\x30\x26\x6d\xda\xcc\xe9\xee\x61\xbe\x0b\x34\x58\x00\xb3\xc7\x6c\x67\xf9\x00\xd3\x76\xcc\xe6\x5a\xba\x73\x43\x3b\xdf\x2d\xe9\x39\xad\xff\x9b\x0c\xff\x37\x90\xe1\x66\x03\x19\x3a\x1a\xa5\x23\x25\x8d\xa0\xdf\x74\x94\x54\xb2\x21\x03\x9f\x87\x13\x54\x43\xa0\x5a\xe5\xcb\x25\xe3\xa8\x88\xae\xe8\x01\x6e\x13\x86\x7b\xcd\x70\xda\xbe\x4e\xb5\xb7\x1b\xfc\x3b\xf5\x79\x87\x9f\xd5\xf9\x33\x57\x8d\xcc\x97\x68\xa4\xe2\x14\xdd\x55\x68\x9c\xde\x1e\x87\x75\x5b\x92\x23\x26\x2e\xbe\x29\x54\xe2\x64\xce\x87\x4f\x5d\x85\x05\x55\x4a\x3c\xf5\x29\x25\xbc\x4e\xbe\x9f\x36\xbe\xe6\x85\x12\xff\x45\xbd\x1a\x41\x15\xbf\x4f\x23\xb7\x18\xa9\xe7\x44\xcc\xfe\x7a\x23\x83\x65\x9b\x32\xbe\x7e\xe7\x6e\xbf\xf3\x85\xbe\x94\x9c\x7a\xf5\xfd\x1a\x6f\x4b\x14\x87\x78\x29\xa6\x0e\xfc\xf0\x65\xf7\x25\xed\x2f\x55\x09\xfc\x5c\xcd\xef\xf7\x38\xc8\x2f\xe3\x94\xbc\xc2\x85\xcf\xeb\xeb\x8a\xc2\x1b\x54\x74\x7f\xec\xbd\xc5\xee\xf6\x60\x10\x2a\xab\x91\xc1\x2b\x01\xd0\x32\xb7\x16\x09\xbf\xe4\x69\xf4\x07\x5f\xb9\xec\xd2\x2b\x97\x77\x00\x51\x1d\xec\x9e\x13\xdd\xdf\x34\xe4\x78\xd4\x32\xee\xa6\x6a\x4f\xea\xb1\xc7\x01\x87\xf2\x80\xa9\xaa\xe3\x0b\x46\xbb\x0c\x71\xc4\xaa\x4f\xf4\x24\xad\xea\x4f\x1b\x8b\x8c\xe3\x3c\xcf\xe0\x8d\x95\x4c\x68\x70\xe2\xb1\xf4\xe1\x9f\xf4\xab\x0a\x9e\x91\xb4\x73\xf6\x58\x02\x08\x6b\x64\x35\x5f\xa7\x2c\xe1\xc3\xb2\x2f\xd7\x01\xde\x4e\x5f\x5f\xb3\xed\x2e\xcb\xd1\x18\x5a\x66\xc0\x17\xe4\xb0\x9a\x53\xf7\xdf\x9d\x39\x9a\xad\x37\x47\xb3\xff\x6d\x73\x84\x5c\x6a\xc5\x49\x2a\xb3\x89\x9e\x8a\x32\x9b\xc8\x29\xba\xc8\xca\x32\x1b\xeb\x0c\xfc\x6c\x9c\x24\xc1\x9d\xad\xeb\x31\x9c\x3a\xf5\xe3\x6f\x6e\x2d\xe0\x7a\xaf\xb0\x5d\x6d\x8c\x80\xfd\x38\x12\xa6\xe6\x8f\x36\x42\xad\x2a\xec\xf1\xa1\xe1\xa3\x3d\xca\xbc\x05\xd0\xeb\x33\x3e\xdb\x7d\x71\xc5\xee\xda\xb1\x10\x31\x6c\x71\x63\x03\x65\x69\x99\x24\x05\xa2\x2a\x6d\x62\xfe\xab\x6c\xa6\x14\x17\x76\x85\xde\x25\x2f\x5f\xbd\xca\x66\x6d\xdb\x4a\x20\x5b\xde\x31\xa4\x5f\x71\x8a\xe3\x0c\x26\x13\x9e\x46\x28\x7b\x1c\x0f\x91\x85\x22\x03\x56\x67\x7c\x57\x07\x20\xf5\x28\x1a\xea\x46\xdb\x01\xaf\x56\x82\x4c\x7f\x9f\x7e\x50\xe2\x54\xbd\xd3\x7a\xf2\x71\x86\x7a\x65\x41\x4d\x5f\xf4\x57\xee\x6e\xda\xea\xf9\x85\x7e\x5d\x41\x6c\x5f\x36\x6d\x42\xf2\x68\xb8\x6a\x6f\x71\xf1\x80\x94\x1b\xa7\xa7\x20\xcb\xc7\xe9\xe5\x62\x57\xa6\xcc\xfa\x7b\xd3\xec\xcc\xf4\xe7\x69\x92\x54\x3d\x7d\xc1\xe5\x8b\x2b\x82\xde\x0a\xca\x80\x15\x21\xf8\x06\xaa\xbf\x36\xe5\x09\x64\x88\x76\xd0\xc2\xd6\x53\xc5\x15\xa0\xd3\x4c\xce\xfc\x2a\xc0\x25\x3c\xf8\x52\x07\xdb\x9d\x76\x34\xce\xa0\x9f\x25\x02\x45\xf1\x5b\x4d\xd3\x2a\x40\xc5\xee\xe8\xfd\x20\x11\x88\xd6\x03\xa5\x72\x50\x29\xf3\xf8\xf2\x92\xe7\xfa\x90\x5f\x7b\x52\x71\x0b\xc2\xc5\x8a\x7b\x52\x29\xe6\x69\xf8\x36\xb2\xad\x76\x30\xcd\xb5\xc9\x5a\xed\xb9\x06\xb6\xd5\xb9\xf3\x33\x3d\x1f\xc7\x8d\x3c\x74\x59\xed\x09\xc2\x27\xb5\x28\x18\x51\x0b\xd8\xae\x48\x03\x7c\x2d\xad\x5e\x42\xfb\x15\xa3\xc1\xae\x9d\x17\xb7\xa0\x7c\xb3\x29\x1f\x6c\xe3\x6b\x54\xf3\x4a\xd4\x9d\xb0\x66\x1d\x3a\x1a\x28\xfa\xcb\xd0\x09\x1d\x66\x39\x6b\x83\xd1\x22\x3b\x64\x18\x56\x45\x5f\x40\xb8\xf5\x54\x24\x21\x16\xb3\xbf\x8a\x82\x07\x2c\x7e\xfc\xb8\x5e\x64\xf3\x37\x72\x16\x57\x83\xd0\xa0\x44\x04\x0f\xf1\xc5\xe9\x10\x7e\x5c\x5f\x4b\x41\x09\x49\xf1\x33\x9f\xeb\x3c\xf5\x74\x98\x20\x0a\xf2\x56\x3d\xcc\xfc\xae\x63\x78\x90\x06\xd1\xeb\xb1\x06\x0c\x9c\x01\x74\x84\x68\x60\x66\x04\x3a\x95\xfe\xca\xbd\xd3\xc4\x9c\x90\xce\xcb\xda\xc2\x2f\x61\xb8\x87\x26\x47\x68\x1b\xed\x65\x55\xaf\xf3\xe0\xca\x1f\x09\x4e\x73\x24\x50\xeb\xcb\x80\x7d\xa7\x76\xf0\xbe\xe6\x8a\x52\x95\x82\xd9\xa7\xd2\xd8\xa6\x56\x49\xa5\x23\xd7\xd1\xf9\xc2\x90\x49\x32\xf0\x1f\xdc\x97\xd6\xf6\xaa\x6c\x5d\x62\xe5\x6c\x53\xf5\xaa\xcd\x68\xaa\x3d\x2b\x9e\x6a\x07\xf1\xa3\x55\x51\x46\x53\x1a\x2a\x62\x8e\xb4\x55\xab\x0e\x56\x18\x6f\x13\xc4\x75\x55\xe7\xce\xba\xad\x38\x6e\x02\x63\x04\xed\x85\x91\x18\xb2\x59\xd4\xa2\x74\x1d\xb2\x64\xa3\xb6\x43\x95\xd1\xf6\xbf\x15\x19\xae\x76\x21\xec\x0f\x72\x81\x18\xc3\xa0\x7b\x41\x2f\xcc\x79\x50\xaa\xe0\x2b\x4d\x8b\xe8\x7b\x2a\x7d\xeb\x67\x2b\x02\x31\x5e\x29\xdc\x77\x73\xa7\x70\x47\x97\x4a\x98\x04\x85\xb6\xee\xe7\xb0\x99\x16\xe0\x17\x80\xd4\xb0\x2e\xd3\x59\x5d\x26\xc5\x17\xac\x16\x39\x45\x3e\xbe\xf1\x98\xb5\x8c\xf3\x01\x5a\xf1\x4b\xcc\xaf\x5e\x65\xb3\x3e\x1a\x4e\x6f\x83\xed\xed\x76\xd7\x12\x65\xbb\xae\x8c\x7a\x43\x1b\x28\xad\xdb\x50\x69\x53\x29\x28\xcd\xbe\x26\x25\xb2\x6b\xb3\xf0\x0a\x0b\xfa\x32\x8f\xab\xd6\x60\x2e\x99\xab\xe5\x59\x8e\x38\x54\x70\xd5\xb8\xfe\xc5\xe1\x2e\x0b\xab\xab\x3a\x19\x04\x17\x05\x9e\x3e\x9a\x18\x11\x1e\x3a\x96\x5c\xa0\xde\x55\xfa\xce\x6e\xa1\x79\x95\x62\xe1\x8a\x6d\x32\xd8\x4d\xec\xfb\xcd\xc7\xd6\xd9\x4e\xab\x6b\xfc\x49\xc3\x1a\x27\xba\x48\x59\xb8\xc6\xc8\xca\x66\x06\x4f\x96\x60\x06\x4f\xaa\x8f\x01\x2c\xad\x26\x91\xed\xea\x55\x9b\x38\x57\xbf\xca\xce\xd5\xa1\xad\xed\xaa\x84\x3a\x24\xd1\xa8\x83\xbc\xca\xc6\xbf\x29\x28\xf5\x59\xae\xed\x28\x2f\x68\x63\x44\x6f\xe1\xb4\xa6\xb4\xe9\xab\x9e\x9c\xff\xa1\x36\x7a\xa4\x0f\xd0\x0b\x54\xfd\x16\xa9\xc9\xe8\x33\xa3\xca\xbc\xed\x7d\x3c\xc1\x61\x9f\x7e\x74\x2d\x8c\xf4\xad\x2f\x95\x27\x5d\x34\xf7\xed\x4f\xeb\x8c\x6b\xcb\xe3\x80\x96\x95\x3c\x18\x2f\x44\xa4\xde\x28\xce\x1e\x5a\xfb\xc3\xc3\xf3\x4e\xd3\x16\xb1\xac\x7a\xd7\xd9\x1b\x3c\x31\x34\x61\x1f\xf8\x95\x32\x5d\x37\xf3\x6f\x16\x0f\xa6\xd9\x48\x4f\x4a\x1f\xd6\xb5\xd0\x33\xb4\x78\xc6\x50\xaa\x7f\x5c\xe1\x0d\x19\x86\xa3\xd7\x61\x87\x72\x66\x6c\x2f\x6f\x54\xc5\x93\xbe\x7a\x95\xcd\x7e\x01\x93\x12\xcb\x98\x1e\x51\x61\x32\x6f\xc7\xfc\x4f\x2b\x5e\xc9\x6b\xb8\xa8\xcb\x3b\xdd\x8a\xcd\xdc\x5c\x96\x6e\xb8\x17\x27\xa5\xfe\x6f\x7b\xff\x61\xaf\x3c\x02\xff\xaa\x91\x4b\x9e\x35\xbc\xb1\x8a\x0b\x09\x8d\x74\x2f\xaf\x1e\x4d\x3d\xeb\x39\x39\x4b\x3a\xed\x78\xb6\xc0\x69\x87\x1b\xac\xc0\xae\xa5\x1c\xf6\x7b\xaa\xa8\xc8\x09\x76\x05\xf4\xfe\x6f\x15\x77\xdc\x82\x3c\x33\x4f\xe8\xd6\x62\x4d\x49\x96\x52\xce\x44\xa6\xc5\xe6\x26\x5a\xa8\xf3\x68\xbd\xe5\x7b\x63\xa2\x9c\x04\x99\x8f\x68\x1d\x6f\x2c\xab\x60\x1c\x63\xdf\x9d\x24\x5a\x24\xa9\xc6\x42\x20\xb9\xda\x4b\xb5\x3b\xcd\x2f\x9c\x89\xe8\xb3\x33\xeb\xc1\x76\xb8\x4c\xa8\x04\x57\x15\x5a\x77\x82\x84\xfa\xaf\xb3\x7a\xed\x91\x53\xae\x8d\xa7\x44\xc9\xac\xdd\xd5\x1f\x65\x65\x9d\x1b\x96\xdb\x4c\x68\x5c\xfc\x3d\x48\xe2\x88\x4c\x29\xf6\xea\xa8\x8f\xb0\xb7\x75\x28\xc5\x1e\x8c\xf7\x65\x74\x03\xe3\x30\xda\xae\x1f\x25\xb6\x2c\x95\x57\x03\xcc\x98\xd5\xae\xe9\xb6\x5a\xfe\x9e\x8e\x72\x4f\x07\x83\x62\x14\x4c\xf8\xe0\x75\x56\xd6\x6c\xd0\x15\x10\xef\xf4\x98\xb9\x94\x2e\x70\x67\x5b\x30\x68\x19\x78\x6a\xf0\x2e\x98\xf3\xdc\x0f\x2c\x69\xed\xab\xff\x3c\x89\xcb\x65\x33\x12\xf4\x8e\xeb\xc0\xa8\x97\xac\x2d\x3c\xca\x8c\xc4\x75\x9b\x95\xb4\xc0\x73\x53\xb5\x28\xd8\x8d\x3c\x73\xd7\x11\xea\xc2\xc0\x2c\xe2\x19\xe8\x9f\xbc\x8c\x5a\xfa\x9f\xc0\x52\x24\xcd\x75\x4b\x5e\x38\x45\x75\x8a\xe7\x60\x42\xdf\xba\x3c\x23\x7a\x2d\x77\x67\x52\x0f\x9c\x25\x88\xf8\xed\x6c\xef\x78\x77\x29\x5d\x5f\xd3\x0c\xd0\xe6\x51\xb7\x82\x9f\xf9\xdc\x39\x46\x81\xab\xe7\xaa\x5b\xe9\x3a\xdf\xd2\x81\xe2\x4f\xda\x4d\x34\xf1\x15\xad\x33\xab\x76\xe6\xd4\x1b\x75\xd5\x25\xb5\x1b\xe0\x24\xc3\xbb\x44\xeb\xda\x94\xea\x32\xd1\xc6\xd8\x8f\xb4\x8a\xab\x4d\xca\xd1\x75\x5c\x1d\xe9\x2a\xc6\xca\x9c\xdb\x99\x56\xcd\xbc\xcf\xf6\xaa\x2e\xdd\xee\x35\xfe\x83\x9e\x07\x6b\x3b\x44\x2f\x73\x52\x52\xdf\xad\xe6\xf4\x59\xeb\x3f\x87\xc3\x61\xcb\xbb\x03\xd2\xe1\x4d\xaa\x62\x86\x5c\x45\xb4\x14\x24\x55\x14\x3d\x82\xae\x1e\xb3\xd6\x26\x29\x09\xda\x1d\x33\x23\x86\x8f\xdd\x73\x08\x10\x4d\x73\x8e\xcd\xb7\x58\x11\xe8\xef\x15\xa4\x3e\x77\x77\x35\xa4\xaa\xa9\xcd\xba\x04\x70\x45\x50\xbd\x94\x5d\xf9\x73\xf9\x7e\x2c\x59\xc8\x74\x6a\x9f\x84\x04\x85\xea\xbe\x7a\x0e\x37\x10\x14\x6a\x32\x1d\xff\x42\xd6\xc4\xe8\x52\x75\xd3\x82\x71\xa9\xed\x01\xeb\x1c\xb3\x29\x4b\x7e\x53\x3f\x68\x21\x79\x37\xee\x5a\xb6\x5d\x45\x23\x67\x5f\xc0\xcd\xfd\x6a\xa6\xa7\x55\x35\xd3\x7d\x3e\xfd\x13\x5d\xad\xf0\xdc\x0f\xd5\x46\x7b\xb7\xd1\x56\xed\xd5\x68\xab\xf4\x7e\x4b\x4b\xaa\xb4\x26\xc5\xd6\xde\x12\x8a\xad\x3d\xaf\x55\x5f\x51\xce\x13\xda\x1d\x7c\x3b\x50\x65\xe3\x49\x10\xd2\x86\x64\x8a\x73\x2e\x29\x47\x3c\x07\xbe\x8e\xd7\xb3\xbf\xc6\xe5\x28\x9b\x96\xd2\xb4\x27\xe6\x45\x5b\x56\xef\xb2\xb3\x96\x1a\x7f\xab\xcb\x5a\x7a\x84\xe2\x03\xc6\x21\x7e\x20\xb0\xe2\x17\x80\x04\x05\xb1\xdb\x56\xc5\xa4\x2d\x28\xcb\x7c\x9d\xd7\x7c\x4b\x71\x23\x1c\x9f\xa3\x4e\x1b\x83\x79\x26\x25\x19\xad\xcd\xff\x29\x8f\xa3\x3e\xfb\xaa\x2e\xbb\xa5\x12\x03\xe9\x5d\xe4\x75\x59\x96\x86\x32\x76\xb9\x2d\x38\xe9\x30\xee\x2f\x73\x1e\xd4\x35\xe1\xc6\x7a\xaf\x69\xe2\x5d\x9c\xf2\x35\x9b\x78\x9d\x95\xab\xb5\xf0\x3f\x2f\x67\x71\x51\x57\x15\x32\xed\xf2\xbf\x35\x95\xff\xad\x5a\x1e\xcc\x96\xea\xca\x43\x66\x3d\x8e\x5f\x05\x79\xfd\xe4\xc0\x6e\x0d\x8a\x10\xbb\x52\x13\x32\xeb\x6b\x35\xcd\x62\x7d\xad\x8f\x41\xb4\x0a\x88\x1f\x83\x28\x0e\x92\x95\x46\x77\x12\xca\xd8\x59\xb7\xad\xf8\x21\x5e\x01\x2b\xf2\xbc\x5e\x57\x11\x9d\xb3\xd6\xcf\x1f\xf8\x7d\x69\x5a\x62\xba\xc0\x82\x36\x5e\x2a\x3f\x30\x8d\x0d\x55\x89\x0f\x92\x3f\x6a\x5f\x3a\x4b\xd4\x36\x1b\x08\x61\x5f\x5b\x5b\xa0\x6a\x7c\x28\x79\xdb\x43\x36\xce\x22\xf0\x00\x31\x0e\x62\xf0\x5e\x51\xf0\x88\x05\x05\x5c\x44\x4d\x82\x34\xcb\x83\x71\x00\x5e\x21\xe2\x14\xe9\xdf\xda\x1a\x65\x2b\xde\x4d\xec\x8e\xce\x98\x4d\xa7\xcc\xef\xe9\x21\xf3\x64\x9a\x0f\x83\x90\x2f\x3c\x66\x32\xe7\x72\x53\xf0\xf2\x2e\xfb\xba\xe0\x9a\xd0\x79\x5d\xbe\x2a\xe7\x9f\x00\x64\x92\x63\xcc\xf1\x5d\xbc\xa3\xf5\x1c\x07\x13\xea\xa5\xbd\x3e\x40\x2d\xd7\x4e\x6c\x40\x0e\xf0\x7a\xfa\x39\xb8\xa7\x93\x7f\x2b\x8a\xbf\x58\xe7\x02\xef\xe1\xca\xba\x21\xae\xef\xf9\xd9\x00\x8a\xa5\xc1\x98\x17\x96\x36\xc6\x28\x01\xae\x94\x9f\x23\xd3\x62\xc7\x23\x58\x38\x5a\x42\x14\x2e\xd8\x57\x36\xd1\xe1\x0e\x5a\x39\x4f\x02\x21\x47\xb7\x20\xaa\x5b\x91\xe5\x7d\xd6\x92\x3d\xb6\x16\xdd\x15\xd3\x79\xb9\xe9\xca\x09\x70\xc5\xee\xea\x45\x45\x9a\x55\x8d\x94\xe5\x45\xc5\x53\x13\x1b\x9c\x1d\x32\x51\xd0\x76\x5b\x79\x63\x4b\xd9\x4b\xe9\x5e\xfe\xbd\xbc\x6e\xb3\xbc\xac\xfb\x7f\xc3\x47\xd5\x75\x74\x4d\xb6\xbe\x4a\xa9\xd5\x38\x69\xa1\x51\x2e\x3c\x19\x35\x05\x1d\x34\x04\x79\x29\x97\xa8\xa8\x75\xb3\x9c\x22\x54\x7b\x37\x78\x08\xb1\x0d\x60\x21\xf4\x2c\x83\x2a\xf3\x84\x5c\xe7\x0b\x11\xf8\x74\x3e\xe1\x1e\x05\x08\x9a\xcf\x35\x2d\xcc\xa7\x20\x41\x0f\x4a\x51\xdf\x22\xa7\x2c\xe5\xc7\x43\xd1\x6c\xfb\x6c\x85\xda\x05\x18\x17\x35\xdd\xef\xd4\x56\x4d\xc1\xb0\xe8\x5c\x4e\x8b\xdc\x7e\x56\x1a\xc2\x45\x96\x49\xd5\xbe\xa4\xcc\x95\xa1\xc1\x56\x14\x45\xaf\xd9\x4c\x04\xa1\x56\x56\x68\x24\xc8\xf3\x60\x7e\x3c\x6c\x20\xa5\xfa\xd9\x84\xd5\x26\x71\xaa\x02\xbb\xac\x4a\x15\xed\x33\xea\xad\xb1\x4b\x1c\x34\xaa\x59\x23\x0e\x3e\xd6\xea\xa6\x88\x2f\xe1\x3c\xc7\x67\x93\x20\x8d\xc4\x2f\x8c\x96\x20\x0e\x75\x97\x97\x78\x84\x2b\xe2\x64\x94\x4d\x79\x59\x72\xdd\x7d\x39\xca\xb3\xb2\x4c\xf8\x6b\x9e\x04\xf3\xb5\xe7\x4b\x5d\x58\xaf\xb2\x0c\x46\xc1\x84\xeb\xfd\x12\xde\x87\xac\x09\x0c\x53\x4f\x7e\xd6\x6e\x47\xbd\x4b\x59\xbb\x21\x7c\x9b\xb4\x72\x33\x0f\xe8\xc6\xe7\xc6\xa2\xfa\xe6\x8c\x4b\x0e\x6d\xa5\xc9\x06\x9e\x77\x6e\x46\xf2\xaf\x3f\x02\x0c\x33\xf5\xaf\x3b\x04\x1a\x86\x6c\x4d\x3a\x57\xc2\xe7\xaa\xbc\x57\x6e\x67\xcb\x08\xcb\x8b\x76\x55\x6c\x49\xdb\x43\x7d\xf3\xe9\x59\x63\x1f\x02\x39\x79\x35\xb1\x20\x8b\xb8\x9a\xd6\x2c\x3d\x4a\xe2\xf0\xf3\x4a\x43\x17\x62\xbb\x6a\x85\xba\xe2\xbc\x8b\xa6\xa4\xc7\xd0\xbb\x68\x0a\x3d\x7e\xde\x45\x4b\xaf\xb3\xab\xd5\x88\xa4\xd2\xd2\x2f\xab\xb1\x33\xd3\x4e\xc5\xd5\xd7\xca\x62\xdd\x03\x38\x9d\x69\xc9\x97\x08\xcb\xe4\x71\x61\x55\x1e\x56\x92\x8f\x25\xbf\x54\x25\x16\x1a\x93\xc9\xdd\x91\x5a\x3b\xdb\x7f\x69\xd9\x2c\x7e\xcf\x96\x13\xe4\x43\xd0\x7d\xfd\x3a\x77\xdf\x3c\x02\xdd\xef\xca\xed\x72\x5f\xa9\x7e\x3c\x38\x19\x06\x49\xc1\x71\x84\x74\x38\x66\x90\x78\xd4\x7b\x8d\x79\xe0\xb6\x91\x1d\x9a\xf3\x68\xdb\xb2\x01\x69\x74\x1f\x28\xcf\x2f\xff\x9a\x4f\xe7\x75\xfc\x09\x75\x39\x6e\x86\xb0\xb1\xe1\x3e\x61\xf5\x24\xf5\x48\xe5\xeb\x6b\xb6\x6d\x5a\xe5\xc6\xb9\xe4\x6d\xdb\xd4\x55\xaf\xaf\x89\xdf\x44\x51\xd2\x7c\xc9\x17\x3b\x10\x9a\xca\x74\xec\x44\x8c\x80\x73\xde\xff\xf4\x4d\x40\x25\x48\xf8\x8d\x24\xb8\x2e\xb6\x8a\x8a\xe3\x36\xdb\xc9\x16\x77\xbc\x63\xe2\x65\xa3\x3c\xe6\xca\x32\x9b\x3a\xd6\x96\x63\xfe\x64\xa8\x52\x46\x8f\xb8\xd1\xd4\xa8\x63\x86\x1b\x0a\x74\xa2\x84\xcb\x41\xc1\x4d\x9b\xe3\x5a\xe3\xfa\x9a\x39\x49\x12\x3b\x46\x9b\xa2\x42\xda\x89\xfe\x11\x55\x37\xd6\xb1\xdb\xa9\x5e\x64\x63\xee\x44\xec\x36\x6d\x11\x3f\x80\x77\xff\x2e\xa9\x12\xb3\xd4\x5c\x2a\xa9\x5b\x3f\xe9\x90\x4f\xfc\xdb\x03\xbb\x84\xe3\x61\xbb\xf5\x2a\xc8\x5b\x1d\xf6\xc3\xa1\xa2\x04\x34\x12\x33\x08\x76\x83\x86\x57\x17\x7b\x17\x0c\x3e\x9e\xcb\x38\xe0\x64\xe5\x7b\x1d\x99\x3c\xaf\x75\x64\xe2\x75\xc6\xfa\xbc\xd6\x19\xab\xc7\x11\xeb\x73\x27\xe8\xbf\x86\x44\x40\x56\x48\xe8\xdb\x55\x22\x38\x3b\x6f\x70\x41\x00\xcc\xc3\x9e\x44\xd1\x9c\x6c\x0d\x72\x7b\x66\x79\x69\xa4\xc3\x95\xb4\x2a\x27\xe7\xe5\xb5\x59\x7f\x54\x5f\xa7\xc2\x9d\x9c\xf7\xc2\x2c\x0d\x83\xb2\x3d\x28\xb3\xa3\x2c\x2d\xa6\xe3\xe0\x22\xe1\xe0\x98\x47\x42\x23\xb8\x70\x35\x4f\x35\xdd\xa9\x7a\x63\xf3\xdc\x6c\xdf\x74\xc5\x78\x0f\x1e\x50\x20\x0b\x0a\x65\x41\xc0\x64\x3f\xb0\xed\xca\x62\xd0\x85\xac\x05\xa1\xda\xd2\x44\xa8\xd9\x14\x31\xea\x89\x48\x3f\xbd\x2a\x53\xaa\xeb\xcd\x42\x30\xe9\x13\x2c\x70\x5c\x3f\xb1\xca\x72\x54\x00\xa4\xfa\xa3\x9d\x2c\x15\xe5\xd8\x1b\x08\x60\x88\xee\xf8\x0b\x7c\x7e\x66\x3c\x92\x1a\xf2\xec\xdc\x43\xeb\x8a\x9e\x3b\x15\xd4\xc0\xa8\x8a\x24\x0e\x79\xbb\xc9\xc5\x21\x71\x85\x66\x33\x2f\xb4\xc1\x12\x6b\x3d\x4e\xe3\x32\x0e\x92\xb8\xe0\x4a\x78\xd1\x0b\xc1\xcd\x6b\xd3\x25\x0e\x4a\xe6\x67\xb6\x5d\x43\x83\x71\xbb\xc5\x3c\x2e\x32\xf2\x1a\x0e\x0c\x57\xb2\x19\xf8\x0c\x83\x36\x1b\x5c\x2d\x18\x4b\xe9\xe7\x62\xe1\x63\x71\x8f\xad\x74\x95\xa1\x60\xa5\x5b\xf9\x77\x26\x55\x16\x7b\x78\x96\x85\x89\x8f\x67\x5d\x54\x81\xc9\x51\x66\x6a\xcb\xef\xe5\xbd\x5f\x53\xfd\xbe\xf4\x47\x2a\xdb\x20\x81\x9b\xef\xce\xeb\xa5\xb9\x15\x72\xdf\x21\xdc\x54\xe7\xd9\x75\x2e\x67\xcd\x33\xbc\xa1\x0e\xad\x87\xd3\x16\x37\x45\x33\x8a\x7d\x33\x95\x15\x93\x13\xfd\x10\x5d\x16\x95\xaf\xd0\x6d\xbb\x6a\xe9\x7d\x5a\x15\xb1\x83\x5b\x8a\x7e\xe8\x44\x11\x9a\xf1\xcc\x96\x20\x46\xd5\xe7\xe1\x21\x13\xff\xc2\x2b\x5f\x18\x02\xfb\xee\x50\x37\x60\x3d\x0a\xaf\x18\x3e\xbb\xe4\x07\xcb\xf5\x16\xb4\xa7\xcb\x93\x1d\xcd\xba\x1e\x5d\xed\xd9\xbd\x07\x8c\x35\x62\x2e\x56\x80\x74\xdf\xf3\xbb\x74\xef\xbf\xc8\xbb\x7b\x67\xc0\x5d\x76\xfb\x25\xf6\x2d\x16\x16\xb8\x29\xbe\xc3\x10\x9a\x30\x01\x55\x71\xba\x53\x7d\x85\x8f\x52\xbd\x22\x2c\xfc\xea\x3a\xb7\x86\x28\xe8\x5b\x65\x7e\x73\xcb\x54\x3b\x53\xe5\xab\x39\xae\x63\x26\x64\x91\xdf\x37\xf2\xed\xca\x9b\x90\xef\xbd\x41\x94\x75\x18\x65\x78\x3d\x4b\x0a\xd3\xe4\xaa\xa7\x27\x6c\xca\xff\x26\xdf\xff\x1a\x1f\x21\x97\x0f\x45\xfc\xfe\x91\x96\x79\x29\x42\x1b\xdf\xda\x62\xbf\x62\x60\x87\x10\xce\xf7\x70\x83\x81\xc8\x87\x98\x1a\x18\x9a\x5d\xc7\xcb\x00\x5b\x2d\xcc\xee\x82\xe9\x04\x98\x1d\xb2\x6c\x28\xe7\xd4\x6e\x39\x48\x23\x35\x8f\xe3\x60\xce\x2e\xf8\x3c\x4b\x23\x8c\xeb\x91\x4d\xd3\x28\xc8\x63\x5e\xf4\xdc\xd1\x49\x2b\xc2\x23\x45\x23\xef\x83\x72\xd4\x1b\xc7\x69\x5b\xd2\x89\x1a\x7f\x4f\x88\x13\xea\x37\x7a\x15\x73\xe7\xd8\x6a\xeb\xb7\x4a\x5b\xbf\x99\xb6\xe6\xa4\x2d\xe9\xfd\xca\x6d\xcc\x7e\x4d\x44\xa7\xf6\xac\x4a\x6d\xe7\xe0\xa8\x69\x41\x19\x34\x14\xf6\xf7\x43\x1e\x3a\x21\x79\x5e\xf2\x52\x56\x96\x8f\x2e\xdb\x9e\xa5\xe6\x6f\xcb\x7a\x6d\xb5\x10\xf0\x17\x0e\x41\x36\x06\xdc\x5e\x38\x44\xf3\x1e\x88\xf5\x9d\xb9\xb5\x17\x51\x63\xf4\x6d\x67\x22\xfb\xb7\xe9\x97\xae\x24\xd6\x67\x59\x1e\x5f\xc6\xa9\x41\x89\xb5\x2e\xeb\xf7\x88\x1b\xe4\xae\x62\x79\x11\x42\xb0\xdf\x4f\x55\xd0\x5d\x7d\x02\xd5\xb5\xa7\xb7\xef\xcc\xf6\x8d\x87\x21\x37\xed\x61\xcd\xce\x5f\xaa\xe2\x11\x68\x93\x8e\x46\xf2\x79\x84\x91\x8c\xc4\x99\xf5\x7b\x5b\x18\x2a\xdc\x03\xf0\xf7\xbd\xaa\x6a\x85\x61\xcc\x54\xbb\x18\xb7\x8f\xbd\xc0\x09\x8e\xd3\x64\xae\x7c\xfd\x08\x96\x90\x5e\xf2\x42\x70\x41\xc1\x0b\x00\xc7\x65\xa1\x62\xce\x60\x80\x99\x51\xf0\x05\x3c\x44\x4d\x83\x24\x99\xcb\x1a\x11\x95\x8a\x0c\x78\x44\x0c\x42\x39\xca\x91\x77\xc0\x5b\x4b\xd4\x50\x56\x0b\x0c\x8e\xdc\xb4\xbc\x9c\xb6\xa4\x74\xb1\x58\x57\xc5\x6a\xf5\x55\x66\x92\xef\x4f\x9e\x28\x6a\x65\x09\xbe\x58\x8e\x70\x51\x51\xf1\xec\x74\xf7\x98\x58\x7c\x1e\x30\x17\x12\x16\xbd\x73\x9b\xd6\xe9\xc5\x85\x23\xfd\xf7\x68\x9e\x1e\x24\x58\x28\x83\x83\x2d\xca\x9f\xa1\xe0\xdb\x74\x98\xb5\x89\xce\x4b\x10\x2b\x14\x75\xa9\x2b\xe5\x33\xad\xb5\xb6\xf8\x0c\x94\x16\x8c\xa6\xa2\x7c\x44\x4b\x4b\xb2\xe0\x5d\xaa\xd3\x6d\x56\xcb\x54\xa6\x83\x96\xb5\x84\xf9\x35\x1e\x15\x12\x5c\x39\x62\x1f\xcd\x32\x5d\x77\x19\x5f\x8e\x7d\x49\xe8\x79\xf4\x72\x58\xf2\x5c\xdf\x0d\x2d\x31\xa9\xb2\x98\x6f\x4e\x45\xd6\xad\xa6\xd4\x3f\x79\x58\xeb\xc5\x2d\x27\x91\xf5\x7d\x99\xa0\xde\x25\x76\xac\x8b\x27\xf8\x16\xd3\x7b\x27\x93\x2b\x90\x66\xcd\x2d\x49\xf7\x4f\x6c\xed\xe2\x7c\x5b\xf2\x71\xdd\x02\x4d\x4c\x17\x2e\x0e\x48\x08\x64\x1f\x6e\x0d\x03\xc1\xbd\x55\xf4\xd2\x67\xf4\x79\xb3\xb3\x05\xf3\x44\x09\xea\x95\x57\xe4\xd5\x0d\x9d\x14\x96\xa6\x96\xe0\xa6\x44\x48\x49\x3c\xe9\x85\x18\x07\x53\xfc\x9a\x1b\x72\x56\x2a\xaf\x06\x0c\xc0\xf5\xab\x85\x81\x95\xc6\x6f\x6e\x27\x1a\xbb\x5d\xb8\x7e\xc0\xf1\x59\xb3\xdb\xfc\x45\xe4\xc2\x7b\x13\x9e\x17\x71\x51\x5a\xc4\xa2\x53\xdb\x15\x9f\x12\x36\x21\xbb\x2b\x5d\xaf\xbf\xba\xe1\x54\x31\xe8\xe7\x07\xaa\x9c\x8f\x21\x40\x9e\xc5\x11\xe8\x3a\xff\x97\x5c\xae\x30\x24\xdf\x7a\x85\x8c\x5b\x2e\x58\x13\xcb\xb2\x09\xd1\x60\x2d\xfc\xf3\x7a\xd7\x4b\x89\xba\x5e\x42\xef\x21\xa2\x45\x7a\x8f\xea\x60\xc9\xf4\xb8\x16\xc9\x52\x92\x38\xd3\x6d\x9e\x77\xdc\x9d\x7b\xb9\x6d\x02\xcb\x2a\x8f\x9c\x36\xc1\x91\xd6\xc9\xe6\x2b\xcb\xb6\xe5\xde\xb1\xc4\x84\x80\x01\x48\x33\xd1\xab\x22\x0e\xbd\x43\xb2\xad\x68\x5c\x87\xd6\xa0\xb9\x5b\x23\x8a\xd0\x24\x34\x70\x8b\x91\x6b\xa3\x8e\x25\x96\xbc\x2c\xe6\x5b\xf1\x22\xeb\xee\xb0\xa0\x9b\x5c\x07\x13\xba\x91\xdb\x62\xe3\x97\xc9\x12\xb8\x80\x42\x3e\x4c\xfc\x32\xb9\x63\x3c\xfc\x32\x59\x1b\x0b\xbf\x4c\x6e\x81\x03\x1d\x0c\xb8\x71\x53\xeb\xc9\xa3\x24\x94\xe6\x05\xfb\xee\x10\x1e\xa1\x42\x4c\x64\x27\xcf\x7b\x17\xa8\x39\xb8\xb3\x93\x56\x5a\x3e\xdb\x3e\x6f\x82\x59\x19\x0b\x1b\xd9\xc2\xb8\xdd\xab\x1c\xcd\x77\xb6\xed\xb9\x9c\xc9\x30\xe2\x98\x87\xd1\x35\xe8\xb9\x49\xbf\x61\xc5\xfc\xca\x13\x56\xf3\x80\x15\x0b\x54\xdf\xaf\x1a\xbd\x27\x96\x50\xae\x70\x30\x77\xe9\x60\xe2\xfe\x97\xfc\x63\xc5\xdc\xc9\xe0\x8f\x87\x3f\xe5\xb1\x74\x12\x7e\x77\xfe\x1d\x41\x6b\x16\x87\x9f\x0b\x5b\x93\x73\x87\x1d\x50\xd3\xa4\x2e\x4e\x0c\x7d\x27\x03\x8e\x16\x57\xf7\x79\x30\x55\x98\x82\x41\xe0\x21\x1f\x71\x24\x7b\x12\x02\x2f\x79\xba\xb1\x92\x63\x48\x2d\x2f\x76\xba\xb6\xde\x98\xfa\x42\xd7\x11\xfd\xa9\xa6\xd5\x5e\x85\x5a\x63\xb7\x1c\x4d\xef\xd8\x34\x3d\xa7\x34\xbd\x83\x91\x5b\x6a\x69\x7a\x67\x11\x4d\xef\x2c\xa4\xe9\x9d\x7f\xd3\xf4\x72\x34\x3d\xff\x66\x34\x3d\xbf\x57\x9a\x2e\xb3\x09\xfd\x6d\x28\xda\xd2\xf7\x5b\x24\x5d\xf5\x88\x6a\x91\x71\x30\x8b\x8b\x8a\x29\xc4\xdd\xa3\x25\x30\x58\xf1\xc0\xe8\x8d\x6f\x59\x01\xf3\x7d\x30\xb1\x97\x5b\x80\xab\x6d\x45\x0b\x91\x40\x01\xfb\x32\x9d\xcb\xb7\x76\xc7\x43\x6c\xcb\xc0\x8c\xb1\x35\x4d\x97\xce\x25\xd9\x7d\x21\x0a\xce\x64\x1a\x5f\xf6\xe4\x10\x22\x26\xc0\xd8\xd7\x09\x86\xf2\xb2\x3c\x12\x07\xd1\x53\xab\x68\x3d\xbc\xdb\x4a\x2e\x2a\xb2\xbc\x7c\x35\xb7\x64\x22\xab\x03\x32\x37\x99\xf7\x45\x71\x46\xae\x2f\x68\x88\xd4\xae\x0b\x3e\x3e\x90\x0e\x2c\x56\x49\xb2\x5e\x05\x69\x84\x66\xff\xab\x22\xfb\x52\x21\x5b\x35\xe5\xe2\x5b\xbd\x0b\xbc\xf1\x90\x26\x7d\x70\xee\x68\x77\x80\x64\x1c\xeb\x0b\x50\xae\xef\x6c\x37\xdc\xc8\xd6\xf9\x1c\xdc\xd9\x6e\x72\x3a\x58\xeb\x72\x70\x67\xbb\xd1\xe7\xa0\xdf\xe3\xa0\xae\xe4\x71\x39\xe8\xdc\x16\x13\xb9\x89\x4a\xd6\xdf\x29\x1f\xc8\xd7\xd7\x4c\xfd\x56\xae\x28\x11\x57\x22\xc3\x1d\xab\x48\x73\xa1\xf5\xd8\xee\x55\xdd\xb3\x4b\x67\xb7\xda\x2c\x85\xca\xfe\xca\x36\x85\x14\xcc\x79\xa1\xed\xc6\x95\xaf\x3c\x93\x8b\x00\x1e\x65\xe3\x49\xa3\xe3\xb7\x9d\x27\xca\x79\xdb\xd1\x34\xff\xe2\x7f\x4b\x6b\x9d\xe0\xf5\x7b\x4e\xbc\xfd\x93\x1e\x13\x80\x16\x5b\xf6\x28\x0d\x74\x2e\x36\xcc\x4a\x59\x16\xca\x3d\x0d\x65\x9e\x15\xfe\xcd\x50\xe3\xd2\x58\x47\x38\xb0\xbe\x0a\x16\xc0\x69\x4e\x3b\xb8\x14\x3e\xf2\xb0\x84\xd0\xb3\xf4\xd5\xfa\xb2\x20\x3f\x53\x20\xeb\x56\x96\x05\x9b\xde\xae\xe6\xe0\xcc\xa2\x55\xb1\x65\xd3\x30\xa2\xff\x37\x0f\xf0\xd2\x31\x9c\xf3\x8c\x39\x9c\xc9\xa0\xf1\xb4\x50\x2f\xac\xb8\x62\xf2\x96\x72\x7c\x32\xe5\xe0\xfa\xc1\x57\x12\x73\xdc\xd7\xf0\x41\x5e\x82\xab\x09\x5f\x0d\x93\x6b\xd7\xe2\x69\x54\x5b\x47\xe5\xd9\x35\x26\x1a\x21\x6e\x79\xcc\x71\xbd\xb1\xf1\x04\x8c\x41\x75\x47\x9b\x04\xd2\x03\x2f\x99\x58\x9e\x85\x67\x7d\x16\xce\xba\xe0\xbc\x2a\x9c\x77\x49\xdd\x3e\xf9\xdd\xd5\xcd\xf7\xf5\xaf\x2e\x8b\xd3\x94\x4b\xff\x19\x7d\x89\xcc\x2e\xcb\xa6\xa5\x9b\x68\xf6\x95\xdb\x53\xe1\xbe\xa2\xc2\x13\x1e\x96\x99\xdf\xe3\xa1\x43\x82\xfe\xb5\xf1\x55\x22\xb6\x5f\x4b\x68\xab\x80\xb7\x14\xf7\x91\xd0\x11\xe6\x86\x9e\xff\x1c\x87\xfc\xad\x81\xf6\xcd\x80\xdd\xb7\xaa\xfc\xb0\xc1\xf1\x9e\x71\x30\x17\x86\x61\x4b\x75\x6a\xac\x75\x34\x32\xee\xd9\xe5\x9b\x6f\x9f\xe9\x50\xa9\xde\xf5\x77\xe7\xee\x6e\xca\x55\x9a\x49\xf1\x3a\xb1\x94\xd2\x87\xc2\x15\xb9\x8b\xb8\xa5\x98\xdc\xe8\x71\xd5\x3b\x1a\xf6\x62\x2d\x77\xab\xbe\x36\xbb\x74\x82\x3b\x6c\x09\x39\xaa\xc9\x29\xb9\x21\x5f\xbb\xdd\x5a\xd1\xc9\xf8\xb8\xf1\x48\x4f\xcd\x41\x3d\x94\x8c\x0f\x3a\x73\x43\xd4\xe5\x7c\xc2\x75\x2c\x8a\x03\xa7\xac\x0c\x89\x4a\x84\xaf\x33\x1a\xd3\xc2\x0a\xb6\xaf\xea\x60\x7c\x0b\x19\xa2\xff\x7d\x30\x39\xb3\xd0\x68\xd5\x7f\x1b\xb5\xce\xcf\xd7\xa1\x83\x9a\x19\xab\x0d\xe2\x41\xc9\x9b\x10\x6b\x35\x14\xc7\x8a\x81\x38\xee\xed\x20\x4c\x87\x00\xe7\x98\xde\x38\x98\x90\x17\x21\x10\xb0\xc7\xef\x8b\x88\x62\x02\x8a\x55\x9c\x25\xd2\xcb\x4c\x8c\x0f\x64\x24\xe3\x4d\x15\xa1\x12\xb8\x13\xa9\x47\x8d\x0e\xb4\x77\x18\x6d\xad\xe4\x21\xdd\xff\x59\x9d\x6c\x69\x58\x60\x6a\x76\x33\xd3\x11\x78\x5d\x1a\xbc\xf8\x9d\x46\xe1\xb4\x17\x32\x24\xbf\x8d\x2a\x84\x27\x9b\x76\x23\xe7\x5c\xfc\xde\x1c\x35\xa7\x76\xc0\xbf\xad\x3e\xe0\x79\xcd\x80\xe7\xcd\x03\x9e\xfb\x07\x3c\xff\x46\x03\x06\xdd\xd6\xb2\xa7\xba\x9d\x86\x53\x1d\x9d\x6f\x59\xda\x1b\x30\x7a\xee\x29\xe7\x0b\xf0\xec\x9e\xc2\x5c\x4d\x9f\x31\xf5\x7f\xda\x60\xea\x6f\xfb\x81\x7c\xda\xa4\x70\x94\x25\x9c\xf0\x26\x54\x51\x7f\x5f\x6a\x16\x1d\xb8\xf6\xc0\xa3\x49\xbd\xaf\x4e\xe7\xa6\xd3\x7b\xe0\xe5\x5f\x1b\xb9\x72\xeb\x32\x8f\x23\xe2\x8f\xcb\x31\x75\xd6\xe9\x96\xc9\xb3\x49\x96\x4a\x43\xaa\xca\x36\x99\x4a\x87\x68\xa9\x05\x49\x57\xa8\x6c\x71\x2e\x5b\xe6\x98\xea\xa8\xab\x33\xf9\x84\xda\xb5\x16\x6f\x88\x18\xd2\x18\x2f\xa4\xe9\xb6\x48\x8b\xce\x4d\x85\xc8\x28\x1b\xd5\xf4\xba\xb1\xe6\x62\x44\xac\xab\xe1\x0e\xda\x4b\xe0\xd2\x2c\x62\xb7\x81\x45\xe4\xda\x1d\xa0\xb5\xfe\x77\x7b\x56\x86\xa5\xbc\x51\xde\x07\x9d\x0a\x34\xdd\xd6\x7b\xe8\x96\xee\x71\xe9\x58\xe0\x5a\x8b\x56\xc3\x75\x9f\x4a\x59\x32\x76\xab\x73\x38\xbe\xeb\x5c\xe7\xdc\x0e\xa7\x76\x92\x69\x1d\xd7\xc9\x61\xd3\x2a\x45\xd2\x2d\xd6\x6c\x8e\xa1\x56\x71\x92\x6e\x74\x65\xf7\xc3\x55\x26\xda\x37\xe5\xfd\x88\x6e\x6a\x4c\xb7\x95\xdc\x5c\x59\xcc\xaf\xf7\x9d\x18\xe7\x98\xf7\x01\xbd\xa1\xcf\xfb\x01\xdf\xd5\x6b\x58\xba\x0a\x4a\x33\xb6\xc2\x82\x7c\x34\x0b\xed\x2d\xc0\xcf\x26\x6c\x12\x8b\x79\x14\x58\xc3\x2f\xc1\x9f\x60\x7f\x7f\xd6\x20\x2b\xe8\x18\x66\xb2\x68\xaf\x1a\xd5\x49\x3e\x0e\x56\x05\xcc\x03\x62\x8b\x07\x3e\x69\xe0\x81\xae\x58\xf3\xc4\xf3\x16\xa9\xe6\xa1\xe9\xce\x93\x86\xd7\x7e\xde\x77\xa6\xb2\x86\xef\xa1\x69\xe5\x99\xe9\xce\x13\x6a\x11\x8f\x85\xb6\xb6\xd8\xe9\xf1\xeb\x63\x65\x24\x2e\x8d\xfa\xaf\x46\x3c\x35\x6e\x38\x30\xeb\x0f\x90\x21\x8c\x46\x07\xc0\x22\xe2\x44\x96\xe2\xe3\x88\xd5\xd7\x56\x04\x6b\x4b\x3e\x9b\x02\xbb\xb5\xbf\xa1\x55\x97\x5c\x61\x96\xf5\x08\x79\x8e\xd1\x05\xcd\xbd\x16\xc5\x8d\x9d\x16\xe4\x76\x6c\x6f\x03\xf8\xb6\xef\x96\x52\x90\x7b\xe1\x69\xbe\x69\xe4\x7c\x7f\xa8\xbb\x8a\x04\x75\x87\x2f\xcb\xed\x11\xa3\x79\x01\x98\xe3\x54\xd3\xd9\x0b\x6f\x6a\x9d\x40\x57\x2c\xf1\x8c\x93\xfb\x9f\x4b\x3e\x70\xa9\xbd\xcf\x5a\x80\x26\xd0\x03\x38\x4f\x93\x1b\x58\x4c\xc5\x8f\xf7\xad\x0f\x88\xf4\xc6\xe8\x16\xf7\x3d\x72\x69\xee\xdd\xea\xdc\xb5\xb7\xe4\xb9\x6b\x6f\xa9\x73\xd7\x9e\xef\xdc\x25\x47\xa2\x03\xa7\x58\xf3\x59\x81\x0e\xb9\x8c\x55\x47\x1d\xe8\x2b\x10\xfa\xca\xca\x8c\xfb\x96\x29\x56\xd4\x1f\xd1\x13\x85\x38\xc7\x2b\x55\x85\xff\x74\x21\x4a\xcc\x2b\x25\x8c\x75\x04\xc5\x5d\x0d\x3f\xa8\x3d\x17\x2d\x38\x19\xd5\x9c\x8d\xcc\x16\xbf\x78\x21\x58\xfe\xca\x57\xd2\x92\xa8\xb0\x43\x48\xcd\x95\xf8\xe4\x8b\x75\x18\x72\x2d\xc5\x4e\x40\x3c\xef\x42\x22\xfd\x5a\x5e\x5a\xd6\x0c\xe9\xa5\x81\x34\xbe\x44\x3a\x1e\x31\x60\x7f\x95\x3b\xf0\xfd\xc5\x77\xe0\xce\x4b\x69\x5d\xb1\xfe\xb5\xb4\xe3\x37\xcb\xba\x3c\xae\xc4\x4d\xfc\xd7\x8c\x9a\x48\xb0\x6f\x82\x2c\xed\x5a\x21\xa0\x28\x26\xcd\x45\x20\x29\x2d\x2f\x01\xed\x79\xd2\x51\xa8\x68\x41\x99\x4c\x4b\x5e\x04\x05\x44\x93\x70\x8b\xaa\xf4\x2a\x88\x1e\x38\xfd\xc0\x36\x45\x9e\xda\xf5\x87\x9e\x1a\xc5\x11\xf7\x96\x16\x19\xd6\x54\x8f\x82\x42\xd3\xe0\x77\x50\x6d\x63\xa3\x42\x9e\xe6\x19\xb4\x72\x1f\x66\x60\xd2\x1f\x16\x5d\xfe\x70\xc8\xb6\xc1\x53\x18\xa0\xd4\xf7\xb8\xd7\xb2\x1c\xd0\x50\xb8\x97\xd9\x76\x1c\xb2\xa6\xd6\x68\x2d\x1a\x90\x4c\x4d\xe1\xc6\x86\x99\x23\xf2\xbb\x11\x34\xe3\xda\xc6\xe2\x1f\x4d\x9e\x95\x6c\x05\x2d\x0d\xc3\x66\xc5\xf1\x82\xe7\x4c\x10\x76\x8d\x0e\xd1\x8a\x40\xd5\x35\xc3\x20\xc1\x8f\x68\xe8\xa2\xbe\x07\xf3\x1e\xea\xed\xab\x1f\xe4\x34\xe7\x71\xee\x54\x13\xf5\xc8\x8b\x01\x25\xe8\x8a\xff\x9f\xd7\xb9\x89\xf2\x55\x39\xd7\x7b\x8b\x7c\x03\xcb\xc7\xa0\x82\x7c\xb0\xd8\xf3\xb8\xd8\x8f\xb6\x1e\xb1\x51\x90\x8f\xb3\x74\xae\xd7\x3f\x9f\x4d\xb2\x5c\xb0\x01\x36\x18\x5c\xf1\x8b\x49\x10\x7e\xfe\xff\xd9\x7b\xd7\xb5\x36\x72\xa5\x61\xf4\xf7\xe2\x2a\x14\xbe\xf5\xc6\x36\x18\x1f\x38\xe4\x60\x86\xc9\x72\x80\x24\x24\x01\x92\x40\x26\x93\x61\xf1\x40\xd3\x2d\xdb\x1d\xda\xdd\x9e\x56\x1b\xe3\x21\xfc\xda\x3f\xf6\x9f\xef\x02\xf6\x0d\xec\x67\xdf\xd7\x7b\x25\xfb\x51\x95\x8e\x7d\x30\xc6\x90\x99\x79\xd7\x47\xe6\x79\x06\xb7\x0e\x25\xa9\x54\x2a\x95\x4a\xa5\xaa\x13\x4c\x13\xfa\x94\x63\xf0\xd2\x85\x4a\x2f\x9a\x86\x5e\x01\xa0\x0b\x0b\x75\x38\xe1\xd6\x17\xc8\xda\x33\xb2\x50\x17\x49\xea\xcc\x5c\xee\x47\xde\x10\xae\xea\x11\x70\xd5\x68\x2b\xa6\xbf\x0f\xfd\x98\x9e\x9c\x70\xa4\xcd\xcd\x0f\x19\x25\x2c\x89\x7d\x37\x99\xe7\xc3\x42\xde\x59\xf3\x68\xc7\x0f\xa9\x08\xf6\x33\x2e\x2b\x30\xf3\x27\x27\x94\xed\x02\xf0\x79\x94\x45\x44\x04\x28\x7e\x6e\x9f\x83\x0b\x57\x60\x18\xbb\x43\xff\xb0\x47\xfb\x1c\xc2\x85\xef\xe1\x4b\x94\x6c\x0f\xca\xab\xcd\x15\x5e\xe5\x86\x46\x4b\x69\x68\x25\x6c\x9a\x86\xc3\x3e\x8d\x39\x29\xeb\x37\x78\x5d\x9a\x18\xe1\x01\xba\x34\x51\x4f\xda\xe4\x85\x84\x1f\x26\x34\x8e\x06\x9f\xb0\x13\xc2\x91\x63\x39\xd3\xe3\x8a\x34\x48\x85\x99\x37\x86\x36\xf2\x93\xde\x41\x32\x0e\xd0\xe7\x7b\xce\xa0\x9e\x4c\x33\x24\x0d\xe5\x47\x0c\x46\x43\x9f\x38\x0c\x18\x70\xc1\x28\x9e\x2f\x4f\x3b\x0c\x80\xf2\xa3\x46\x01\xc0\x0b\x07\x81\x97\xdd\x72\xea\x0a\x46\xd2\x7c\xfa\x7c\x9a\xa1\xd8\xb0\x7e\xc4\x78\xec\x16\xf2\x06\x65\x7a\x1d\xcb\x03\x11\x9d\x7d\xab\x90\x2b\x65\xb0\x79\xf6\x8d\xef\x0c\xd1\xd9\xb7\x9a\x5e\x96\xe4\x05\xa4\xb7\xc8\x95\xe4\x38\x2d\x48\xb8\x5e\xe7\xfc\xce\x66\x1d\xcf\xef\xc4\x3a\xea\x75\x11\xb4\xd5\x09\x48\x9d\x30\xbf\x3f\x08\x28\x71\xa3\x30\xa1\x97\x09\x39\xf3\x43\xcf\x0f\xbb\x30\x4d\x8e\x7c\xb0\x53\x30\x41\xcb\x2b\x7c\xc9\x60\xbb\x35\xd1\xac\x25\xad\x77\xc2\x2a\x49\x7a\x0e\xc4\x83\xd7\xde\x03\x15\xd8\x72\x27\x84\xdd\x81\x6f\x08\xbc\x18\x58\x9b\x0d\x43\x9c\x69\xaf\xa2\x9c\x58\x82\x7f\x1b\x36\xf2\x13\xb7\x47\xca\xb6\x1f\x42\xd7\x61\x94\x34\x5b\xaa\xa8\x36\x63\xce\xfa\xc2\x0c\x6b\xae\x13\x04\x65\xec\x90\x53\x31\x36\x08\x01\x67\x39\x0f\x4e\x95\x9c\xdd\x04\x8a\x17\xc9\x42\x5b\x29\x80\x56\x25\xee\x14\x00\x79\x29\x73\x0b\xd3\xfb\x96\x86\x56\x5f\x20\xb5\x5a\xcd\x89\xbb\x8c\x2c\xd4\x53\xb4\xdc\x09\x6b\xce\x60\x10\x8c\x25\xc8\xb8\x3b\xe4\x67\x09\x3c\x40\x5c\xe3\x26\x67\x53\xd5\x93\xc6\x9d\xa8\x0a\x0e\x5d\x4c\x5c\x20\xe4\xd3\xcb\x5a\x73\x32\xb9\xf8\x42\x65\x81\x07\x2f\x01\x8b\xa7\x56\x20\x3a\xc1\x88\x70\xb9\x7e\x3b\x8e\xa3\xb8\xec\x27\xfc\x98\x4c\x7c\x46\xc2\x28\x21\x0e\xac\x29\xea\x26\x8f\x4a\x30\x3e\xe5\x82\x31\x77\x9c\xcd\x29\xc6\x09\x43\x9a\xd0\x55\x7a\x49\xc5\x2c\x26\xf1\xd8\xc6\xfc\xa3\x47\x3c\x13\xad\x35\xaf\x89\xeb\x00\xd5\xd2\xd4\xf4\x70\x9e\x24\xf8\x47\xb6\x83\xcb\xd3\x76\x50\xc8\xd5\xfb\xa3\x50\xf2\x45\xb2\x41\xae\xae\x6b\x76\xda\x0d\x38\x87\xe8\xc1\xd8\x3d\xd1\x39\xbb\x3a\x52\xa6\x2c\x97\x8b\xd1\x95\xbf\xa3\x28\x23\x6c\x5b\xd4\xb9\xb2\xe6\x30\xe6\x77\xe1\x01\xbe\x1e\x7e\xe2\xc4\x5d\xf0\xaa\x45\x3a\x51\x4c\xca\x40\xc4\x64\x83\x34\xd7\x89\x4f\x7e\xd2\xab\x46\x3c\xee\x5b\x27\xfe\xe2\x22\x2f\x0c\x2e\x6f\xa2\x61\xec\xf2\xbd\x4b\x95\x3a\xf2\x8f\xd7\x35\x9c\x73\x3a\x26\x7e\x28\x8a\xf1\x4a\x3a\x74\x38\x3f\x7a\x25\x11\x58\x57\xe5\xe1\x1a\xab\x20\xbe\x79\x45\xec\xe4\xd1\x39\x1d\x73\x11\x13\x73\xe1\x6b\x9d\x5c\xc3\x7f\x92\xa8\xa0\xdc\x3a\x28\x54\xd0\xcb\xe5\x78\x40\xa3\x0e\xd9\x20\xe2\xc7\xc1\xb8\x7f\x16\x05\xc0\x66\xe7\x25\x0e\xe6\xe1\xd0\x65\xe6\xf3\xd3\xa1\x78\x17\xc2\x0b\x32\x48\x9c\x27\x2f\xcc\x87\x08\xd6\x7e\x26\x6a\x47\x67\xdf\xd6\xc1\x69\x52\x51\x39\xb1\xef\xdd\xd4\x19\xbe\x2f\xba\x51\xc8\x92\x78\xe8\xca\x5e\x88\xc2\x98\x0b\x7e\x79\x44\x5f\x15\x26\xc9\x0b\xdd\xd5\x96\xdd\x25\x5b\xea\xd8\x0c\x1c\xc6\xd2\xce\x13\xf4\x97\x45\x76\x3e\x65\x82\x44\x74\x94\x78\x9b\x52\x1a\x48\x29\xc2\x40\x3e\x4b\x25\x1e\x65\x6e\xec\x0f\xf0\x95\x0d\x5a\xb9\x71\x2a\xd1\xc9\x35\x2d\xaa\x90\x8d\x82\x74\x4e\xb2\xe0\xc9\xd9\xcc\x77\xa3\xb0\xe3\x77\x87\xb2\x26\x70\x14\xa0\xb1\x79\x58\x0f\xf3\x9c\xf8\x74\xf1\x8a\x59\x75\x14\xfb\x89\x55\x2d\x7f\xc9\xc9\x91\x1b\x35\xcf\xe9\xd8\xfc\xae\xac\x9b\xf4\xa7\x31\xba\xa9\xa7\x0f\x10\x97\x44\xc2\x6a\x95\x25\x4e\xe2\xbb\x1f\x24\x2a\x79\x77\x75\x76\x25\x8b\x7c\x03\x90\x9e\x6a\x13\x64\x65\x5d\x3a\x78\xd2\x70\x27\x41\xb1\xbb\xb0\xae\x0e\x83\xba\xc4\x3a\x88\x5c\x65\x2d\x70\x3b\x71\xe8\x87\xdd\x22\x21\x75\x35\x5d\x10\x2c\x13\x8a\x24\x63\x2c\xa2\xaa\x24\xd1\x26\x2b\x3a\x8e\x34\x9f\xae\xd8\xe5\x26\x01\x86\x02\x76\xf1\x5f\xc0\xd7\x5e\x81\xe4\xf6\xa4\x91\x53\xf8\xc6\x06\xa0\xd4\xfd\xcb\xbb\x2a\xd0\x9c\x29\xf1\xea\x26\xc0\x18\x73\xd3\x09\x82\xcd\x1e\x75\xcf\xcb\xbe\x70\xad\x5b\x35\x27\x4d\x12\xd3\x23\x95\x4d\xe4\x8f\xa8\x63\x15\x04\x86\x0a\xd2\x44\x48\x4d\x89\x62\x7e\xd3\x09\xb9\x2c\xc1\x39\x30\x71\xd0\x02\x94\x38\x8c\x38\x8a\xac\xe7\x91\xda\x11\x6d\x70\x4a\xfb\x34\x0c\xf2\xdc\xb0\xa8\x6f\x55\xa8\x0c\xeb\x46\xc4\xdd\x43\xe1\x5b\xbd\x05\x4c\x8f\x2f\xe9\xf9\xac\xaa\xab\x56\xac\xe7\x7b\x68\x9f\x2b\x62\xf1\xae\xeb\x0c\x9f\x7d\x88\x23\x97\x32\x46\x41\x5f\xae\xdd\xbe\xc3\x4e\xd5\xa3\x70\xd3\x22\x1a\xae\xc1\xb7\xd6\xdf\x7c\x02\x15\x12\x9c\xf5\x65\x09\x99\x64\xdc\x8e\xd1\x80\x22\x37\xd6\x60\x44\x92\xd9\x41\x34\x8a\x57\x31\xf0\x21\x4d\x94\xd7\x35\x8d\x3c\x19\xf7\x18\xfe\x6a\xe7\xde\x12\x74\x45\x94\x12\x9f\x87\xfc\x84\xb2\x41\x74\xc3\xc4\xbe\x36\x80\x31\xe0\x68\x5f\xe0\x5f\x9d\xd1\x82\xf9\x96\x03\x13\xe2\x19\xef\x79\x7d\x61\x81\xc3\x59\x20\x07\x34\xd1\xc3\xc4\xb0\x31\x35\xcc\x69\x27\x09\x0d\x31\x50\x22\x97\x55\x78\x8b\xe8\xe2\xd2\x75\x86\x3c\xb9\x46\x76\x23\x96\x90\xb3\x38\x1a\x31\x1a\x33\xe2\xf9\x5e\x58\x4a\x08\x9c\xac\xb8\x64\x80\x50\xac\x51\x30\x9a\x24\x94\x73\xa3\x08\xc1\xf5\x9d\xb1\x70\x77\xce\xf9\x76\x4c\xb1\xdf\x9c\xef\x44\x1d\xc2\x1b\x8f\x29\xd2\x04\x39\x80\x71\x01\xc8\x3a\xe8\xb3\xcc\x7d\xad\xac\xe8\xa6\x4a\x8e\x90\xbe\x30\xfe\x37\xdf\x7a\x4a\x55\x71\xb3\x25\x86\xcc\x3b\xf5\x9a\x26\x84\x0f\x97\x26\xc4\x11\x51\xa8\x07\x52\x18\x11\x65\xea\x82\x90\xec\x88\xe1\xbc\x54\x39\x84\x6b\x93\x90\x5e\x26\xc8\x1a\xd4\xb9\xa6\x5e\x27\x3b\x49\x89\xaf\x1e\x1c\x68\xcd\xd0\xfd\xa9\xe2\xd2\x9d\x82\xa9\x05\xac\xd7\xc9\x56\xc4\x91\xe7\x45\xc4\x09\xc7\x49\x8f\xa3\x40\xb8\xfe\x43\xef\xa1\x3d\x07\x85\x7e\xe1\x40\x41\x7b\x04\xc5\x63\xa4\x24\xaa\x23\xde\xb7\x63\x10\x15\x72\xfa\xc7\xff\xe9\x7e\x6c\x58\x84\x5a\xfb\xc6\x58\x6d\x10\x0c\xbb\x7e\xa8\xef\xd4\xa1\xa0\xee\x7a\x95\xe0\xd0\x79\x3d\xcb\x8f\x66\xa6\x03\x46\xf3\x96\xf3\xc8\x7a\x5d\x10\x23\x6c\xc4\x3e\x13\xbb\x96\xc7\x87\x01\x93\x08\xf3\x2c\x96\x0c\x39\x0d\xfc\xf0\xfc\x94\x17\xe3\x1b\xb6\xe9\x05\x55\x8d\x3a\x56\xd0\x2a\xf6\x9a\x40\x07\x43\xe3\x80\xa6\xcb\xc9\x41\x68\xfc\xac\x67\x7c\x48\xda\x1c\xc4\x42\x13\x24\x5a\x63\x12\x8b\x17\x0a\x3f\x7e\x2c\x56\xa0\x93\x24\x8e\xdb\xa3\x5e\x36\xd4\x67\xb9\x51\xd5\xbb\xe6\x91\xda\x05\x8e\x2b\x65\xf1\x2a\xb7\x04\x0c\x56\x1c\xf2\x38\x06\xa8\x57\x23\xbb\x3e\x63\x9c\x28\x98\x89\x9f\x79\x9e\x8b\x47\x80\xf9\x5a\xa9\x32\x21\x5a\x68\xe6\x1a\x52\x9f\xc9\xc0\x17\xbc\xcc\x9c\xcb\xe4\x99\xd3\x6a\xb9\xa5\x37\x96\x53\x9b\x9f\xb9\x49\xcc\xbb\x9d\x70\x02\x96\xf7\xbc\xc4\x0f\x03\x3f\xa4\x7a\x49\xcd\x19\x31\xfa\x71\x85\xc2\x71\xfd\x30\x12\xf6\x25\xe9\xe5\x26\x72\xcb\xe6\x2c\x9b\xf7\x9d\xdf\x18\xa8\x69\xc4\x23\xef\xb7\x07\xfb\x7b\xfa\xbd\xa0\x12\x58\xf9\x9a\xe5\xec\x85\x17\x36\xa7\xa3\x80\x5c\x4c\x4a\xe1\x55\xab\x50\xf1\x88\xff\x34\xbc\x95\x64\xb0\x97\xc5\xca\x27\x28\xc2\x08\xef\x16\x89\xe9\xc0\x78\x79\x24\xfd\x78\x72\x94\x49\xec\x90\x57\x4e\x10\x9c\x39\xee\x39\x23\x4e\x4c\x61\xf2\xd9\x70\xc0\x8f\x7f\x6a\xb9\x2f\x90\xcf\x8c\x76\x86\x01\x8c\x0d\x71\x8b\xdc\x8b\x4d\x42\x31\x22\xa6\x00\xc3\x12\x6b\x79\x68\xbd\xba\x2e\xc4\xa5\xa6\x8c\xf4\x95\xd2\x85\xc9\x5b\x90\x76\x00\x75\xeb\x16\xc7\x2a\x8b\xa3\x8a\x28\xbd\xb1\x41\x4a\x4a\x05\x56\x22\x2f\xac\xaf\x96\x3c\xd2\x95\xa1\x74\xa5\x02\xec\xad\x84\xba\x8f\x52\xc5\x98\x1e\xb2\x81\x00\xd7\xd5\x83\x4e\xb8\x35\xaa\xf9\x0c\x6f\x8f\x64\x7d\xab\x06\xac\x47\x43\x1c\xb4\x96\xe4\x85\x90\xfd\xec\xc5\x23\x26\x9f\x83\x29\x9a\x7c\x61\x06\x4c\xf9\x66\xb0\x79\x70\x60\xee\xac\x85\xd3\x74\x00\x65\x0a\x27\x0a\xb3\xcb\x29\x41\x6a\x6a\x56\x05\x2f\x9c\xfd\xf0\x3c\x23\x2c\xc8\xe2\x90\xd9\x32\xc5\x28\xe1\x15\x69\x00\xda\x13\xc8\x4e\x79\x70\x14\x55\xc1\xe3\x6f\x10\x44\xa3\xed\xfe\x20\x19\x9b\xee\x1b\x2d\xd9\x47\x21\x4e\xa3\xdc\xc6\xb6\x25\xf6\x54\x0d\x12\x82\x96\xd4\x23\xb0\x2c\xee\x64\x1d\x19\xa2\xcb\xd2\x79\x33\x9a\x18\xa2\x95\x69\x33\xa4\xc5\xbb\x8d\x8d\xac\xcc\x55\x51\x7e\xc6\xe7\x0c\x86\x51\x28\x95\x19\x70\x33\x3b\x93\xbd\x44\x7a\x0e\xc3\xed\xd5\x93\x33\x66\x71\x21\x01\x31\xbb\x6f\xa9\x41\xd8\x21\xdc\x77\x3a\x86\x00\x07\x72\x87\xdc\x3c\x94\x28\x46\xbd\xaa\x92\xae\xd2\x8c\x47\xda\x7c\x18\xbd\x7a\xfc\x98\x4c\x18\x82\x7c\x03\xaf\xb6\xf1\xf4\x20\x62\x3a\x08\x1c\x17\x8f\x00\x99\x41\x64\x64\x07\xde\x78\xc1\x2e\x2e\xa0\xeb\x8f\x42\x3f\xa8\xb9\x12\x5e\x9e\x58\xab\x24\x3b\xa4\x94\xe2\xdb\x91\xd4\x26\x68\xcc\xba\x41\x85\x22\xae\xb3\x28\xa9\xa4\xd0\xf5\x39\x3c\x49\x0b\xed\x9d\x41\xe3\x64\xc3\x2c\x95\x52\x28\xae\xde\xa3\x42\xb1\xbe\x40\x84\xe5\x07\xf9\xa5\xfd\x89\xec\xec\xbd\xdd\xde\x3c\xdc\xd9\xdf\x23\x0b\x75\x0d\x7b\x80\xa7\x27\xa8\x7e\x67\xfd\xa3\x28\x5a\x53\x96\x8b\x1b\x44\x27\x21\xef\x32\x92\x3a\x60\x95\xb4\xcb\x8c\x24\x6f\x18\x3b\xe2\xde\x45\x26\x51\x87\x61\x35\xb5\x1d\xc8\xf3\xfb\x39\x1d\x17\xa9\x10\x56\xb4\x06\x81\x97\x9a\x74\xbe\xe7\xf9\xaa\x30\x6e\x28\x5f\xfc\xa4\x17\x0d\x13\xad\x47\x59\x2e\xd2\xeb\xdf\x54\x71\x65\x42\xc3\x45\x6d\x29\x98\x3e\xdb\x73\x0a\x6f\xa0\x0c\x1d\x09\x94\x9b\x34\x44\x28\xf0\xa3\xd5\x3a\x3f\xfe\x26\xb0\x4e\x5e\x45\x7c\x87\x21\xbd\x24\x19\xb0\x56\xbd\xde\x77\x12\x1a\xfb\x4e\x50\xeb\x46\x51\x37\xa0\x35\x37\xea\xd7\xfb\x11\xef\x44\x5d\x12\xd2\x12\x92\x4f\xad\x97\xf4\x83\xff\x95\x4a\x5c\x0a\x9d\x64\x18\x3b\x81\xfc\x74\x87\xf1\x05\x65\xbc\x9d\x24\x22\x01\x75\x60\xe1\xeb\x0b\x42\x3f\x24\xa3\x9e\xef\xf6\x08\x75\xe0\x7f\x42\x16\x8f\x86\x81\x47\xce\x28\x3f\x1f\x7b\x35\x40\x9c\xa2\xd8\x0c\x09\xf3\x35\x53\xaf\x93\x43\x7e\xee\xe5\x27\x9a\x1e\x25\x7d\x7e\x7e\x76\xa3\x7e\x3f\x0a\x65\x45\xe8\x07\xe7\x54\xd4\x61\x74\x27\xdc\x87\x18\x94\xee\xf0\xcc\x77\x97\xce\xe8\x1f\x3e\x8d\xcb\x8d\xda\x6a\x95\x34\xaa\xa4\x51\x5b\xae\x92\x66\x05\xb6\xbc\x7a\x5d\x28\x33\x19\x3f\x35\x0b\x1e\xcf\xdc\x98\xd2\x90\x38\x09\xe9\x0c\x83\x80\x5c\xd0\x20\x72\xfd\x64\x4c\x3a\x71\xd4\x27\x51\xa7\xb3\x24\x0b\x84\x1e\x82\x60\x41\x34\x0a\xc6\xc4\xa3\x2e\x0d\x40\x78\x01\x69\x1e\x9e\xdf\xf3\xae\x81\x79\x90\xec\x5a\x6e\xc7\x1a\x93\x3a\x16\x80\x53\xd9\x09\x1d\xab\x91\xc3\x1e\x1d\xf3\x23\x30\xdf\xbb\x8c\x5e\x80\x49\xbc\xee\xb0\xc6\x4e\x11\x6a\x9a\x66\xfb\x87\xbc\xc5\x9e\x13\x0f\x10\xb7\x1c\xf7\x7c\xba\xc8\xd9\x58\x5c\x9f\x31\xb8\xad\x15\xba\x08\x64\xf9\x51\xaa\x9f\x4e\x38\x26\x89\xdf\x87\x89\x01\x58\xc5\x93\xf2\x04\xda\x46\x73\x9a\x62\xa2\xf5\xa3\x7a\x77\xe8\x7b\x94\x8b\xf0\xec\x56\x74\x8b\xe4\xb2\x24\x93\x6d\x92\x05\x4c\xf1\x7d\x60\xc4\x47\x94\xf8\x7d\x3f\xec\x82\x59\x0f\x65\x81\x1f\x26\x4b\x9e\xcf\x60\x4f\x0d\xa3\xa5\x81\x13\x3b\xfd\xa5\x98\x8a\xfb\x21\x2e\x92\x82\xe6\x3e\xcb\x84\x8d\xa4\x2b\x18\x3f\x3f\x92\xb0\xa4\x45\x9a\x6b\x10\x61\x12\x13\xe2\x16\x59\x6e\xe8\xef\x16\x59\xc6\xdc\x7a\x1d\xc9\xfc\xcc\x61\xbe\x4b\x62\xca\xfb\xcf\xf7\x73\x4f\x76\x0f\x6c\xd0\x43\xcf\x89\xbd\x16\x59\x69\xc8\x3a\x89\x5c\x26\x91\x5c\x5f\x7c\x0d\xba\x11\x97\x68\x2e\x89\x13\xfa\x7d\x31\x7c\x22\x13\x5b\x64\xe5\xe9\x9a\xa8\x6d\x36\x03\x38\x61\x51\x9f\x0a\xad\x8a\x58\x22\xb0\x80\x61\x82\xc1\x70\x02\x53\x0e\x20\xa1\x45\x96\x97\xa7\x83\xc4\x69\xda\x02\x24\x12\x24\x9c\xe6\xf3\xb5\x39\x79\x11\x93\xb3\xe3\x19\x49\x8a\x83\xca\xb4\x72\xdf\x0f\x02\x9f\x51\x37\x0a\x3d\x66\x5d\x54\x42\x80\x96\x38\x1a\x86\x5e\xaa\xcc\x22\x29\xf5\x59\x09\xee\x2a\xf1\x5e\x3a\xb3\xeb\x1a\x49\xaa\x41\x99\x26\xce\x3a\x66\x4b\xd9\x43\x1a\x4a\x52\x66\x1b\x39\x9b\xbd\x4a\x32\xda\xc0\xb4\x9c\x36\x1e\xc1\x61\x00\xb7\x31\x69\x63\x52\x29\x0f\x9c\x98\xd1\x57\x41\xe4\x24\xf2\xd0\x26\x2d\xd4\x16\xe6\xc8\x02\xf9\x17\x50\x2f\xb9\xc2\xee\x7c\x87\xd3\xdd\x35\x5e\x34\x99\xd9\xb8\xbe\xaf\x09\x7c\x66\xeb\x89\x0c\x30\x09\x35\x73\x31\x98\xb7\xcc\x95\xe4\x5f\x5c\x1f\x57\xe6\x04\x08\x34\x70\xc6\x73\x7c\x89\xa9\x25\x25\xac\xeb\x70\x45\x61\xfd\x96\xf8\xcb\x09\x4f\xb6\xd9\x52\xbf\x78\x2a\x6a\x3c\x0d\x79\x15\x13\xac\x18\x7f\xf2\xcd\x40\xfa\x12\x97\xfc\x8c\x16\xa3\xfa\xda\xb6\x81\x6a\x42\x25\x59\x91\x17\x76\x66\x8b\x1c\x95\x9c\x20\x90\xee\x2c\xc4\x49\x50\xe8\xb4\x73\xc0\x37\x6d\xf0\xcd\x49\xe0\x9b\x1c\xbc\x54\x2f\xa0\x0c\x85\xa0\xff\x69\x30\x1b\x79\x2e\x35\x51\x80\xff\x64\x8a\x72\xac\x91\x53\x3d\xd5\xb6\xcc\xa8\x49\x66\x43\x5a\xd9\x5a\xba\x05\x95\xa5\xb6\x6f\xd9\x1b\x3d\x49\xf8\x0f\xbf\xb3\x3d\x91\x15\x53\xfd\x10\xac\x5d\xed\xee\x66\x37\xd2\xa0\x75\xff\x38\x01\x99\x18\xe1\xdf\x06\x3a\x44\x76\xba\x7c\xaa\xe9\x86\x35\x64\x1b\x04\xc6\xac\x12\xca\x90\x22\x79\x56\x2f\x4f\x75\xee\x3f\x2a\x49\xdc\x95\xaa\xa4\x84\x03\xe0\xbf\x00\x7c\xe9\xb8\x22\x5f\x95\x88\x93\x46\x8d\x86\x17\xb5\xbd\xfd\xad\xed\x93\xed\xbd\x5f\x80\x3e\xe6\x07\x71\xe4\x0d\xc5\x35\xf8\x0b\x5b\x39\xaa\xdb\x53\x3c\x4a\x5c\x47\x7f\xff\x4e\x6c\xcd\xce\x40\x84\xbd\x2e\xed\x8a\x1d\x76\xe9\xf3\x4e\x4b\x11\x1c\xb4\x32\x60\xf3\xa4\x3f\xe4\x3b\x11\x05\xa5\x3f\x5e\x33\xc4\x08\xa8\x54\x21\x2d\xcb\x95\xdb\x9d\x3b\x2c\x18\x9e\x4d\xaa\x13\x7a\x28\x0b\x9a\x9d\x44\x36\x42\xce\x86\x09\xe9\x70\x7e\x4f\x4a\x64\x31\x45\xfc\xf7\xde\x6f\x81\x68\x93\xac\x27\xf4\x1a\x8b\x65\x11\xfb\xe3\xf0\xc9\x09\x6b\x12\x1a\x79\xfe\x8f\xef\x0f\x24\xc3\xe9\xd2\x58\x14\x7c\x0d\x55\x24\x43\xe4\xab\xaf\x91\xee\xe7\x30\xe4\xf2\x44\x37\xf4\xff\xa0\x9e\xea\x74\x99\x55\xc8\x11\x9f\xd9\x09\x40\xbf\x45\x7e\x58\x2e\x55\x4b\xb0\xc9\x1f\x5b\xa3\x31\x0d\xac\xca\x79\xab\x82\xbc\x10\xbb\x42\x8b\x80\xd2\x93\x1d\xa7\x9f\x2c\xa3\x38\x45\x3d\xbe\xd6\x33\xfa\x0f\x33\x13\xcc\xcf\x78\x57\x95\x94\x92\xa6\x46\x59\xc0\x62\x8b\xd9\x5a\x30\x8b\x42\x91\x62\x8c\x0e\xed\xd6\xd1\x6a\xb5\x3d\x4c\x22\xf4\xf5\xb0\xa5\x76\x43\x53\x53\x93\xcd\x2f\x0b\x2f\xb5\x62\x04\xa8\xd5\xb2\x92\xd4\xa0\x1a\x96\xde\x16\x5e\xf0\x44\x70\x73\xce\xf7\x64\xf1\xf6\xb3\x4e\x56\x9e\x08\xf4\xd6\xeb\x4a\x84\x1f\x8d\x46\xb5\x51\x14\x74\x62\xa7\xef\x04\x83\x9e\x03\x07\x4f\x3f\x1c\x0c\x93\xfa\x0b\x7f\xa3\xbc\xba\xf8\x5f\xcb\x2f\x17\x9b\x6b\x8b\x0b\x8b\xe5\xcb\xc5\xff\x5a\x7e\xb5\xb8\xf2\x64\xb1\xb2\xb8\xb0\xb0\xd8\xa8\x2d\xaf\x41\xa6\x4a\xaf\xc0\xdf\xb5\xca\xe2\xc2\x62\xb3\x61\x4e\xa3\x21\xe1\x95\x57\xc9\x22\x69\xae\x91\x05\x4c\x1c\x44\xa3\xb2\xec\x29\x9c\xb4\xd6\x38\xca\x55\xdf\xeb\x64\xad\x42\x16\x48\xb3\x51\x51\x66\x76\x13\x14\x41\xd7\x68\x78\x35\x49\xb3\x54\x5e\xa9\x54\x2a\x69\x3d\xd5\xda\xdf\xcb\xf0\x2d\x2b\x54\x3d\x7a\x24\xef\x17\x46\x7e\xe8\x45\x23\xbc\x30\x30\xae\x14\x1e\x3f\x16\x39\x35\x2f\x72\x91\x73\x64\x93\x6a\x96\x73\xb2\x3c\x23\xce\xac\x7e\x2f\xa3\xd3\x7b\x32\x09\x57\x39\x4f\x2a\x6e\xa1\xdf\x9b\xed\xa9\x86\xea\xc4\xa5\x25\x86\x6b\x99\x52\xd0\x52\xda\x4c\xfc\x52\x9a\xd0\x56\xb2\x96\x90\x4f\xef\x6c\x43\x7b\xc6\xe5\x21\xb6\xe7\xc8\xe7\x7a\x39\x94\xf8\x74\xf5\x59\x45\x29\x6d\x27\x99\xf9\x3c\x05\x8b\x5b\x79\x54\x78\x4d\x13\x54\xb6\x84\x08\x5c\xdf\x2d\x26\xe4\xf4\x9c\x8e\x4f\x49\xd4\x21\xa7\x28\xf2\x9c\xd6\xe6\x88\x38\x5f\xc4\xfe\x05\xc4\x45\xd4\x32\xfd\xbe\x38\x4c\x60\x51\x50\x2b\x88\x9f\x49\x44\x7e\x1f\xd2\x78\x5c\xcb\x3b\x22\x9c\xd3\x31\x94\xe5\x7f\xc5\xad\x1f\x3f\x40\x46\x1e\xaf\xd6\x05\x9b\x86\x05\xf2\xaf\x58\xdc\x15\x5e\x2d\x5c\xab\x7b\x43\x5e\x54\x9f\xa0\x3a\xc4\x4f\x4a\x4c\x8c\xa2\x8a\xfe\x22\x4f\x15\x49\x43\xcf\xeb\x73\x26\x7f\x44\x64\x96\xb1\x8f\x86\xb9\xab\x79\x49\x27\x31\x69\x95\x32\x6c\x89\xcd\x69\x91\x67\xb7\x17\xa2\x76\xcb\x54\xca\x5e\xe7\xd8\x0d\xab\x3e\x64\x09\x66\xe2\x2b\xa0\xfb\x59\x15\x7e\x5f\xae\x06\x38\x5f\xdc\xec\x91\x5a\x04\xeb\x2d\x52\x2a\x73\x9a\xba\x07\xf0\x27\x9a\x4b\xe5\x34\x53\x0b\x27\xbc\x03\x4d\x83\x9a\xad\x43\x4d\xf9\xf2\xb6\x48\x07\x7c\x47\xb0\x77\x18\xa0\x82\x31\x5b\x17\x96\xc1\x71\x08\xdc\x15\xb3\xc2\xe1\x35\xee\x03\xf6\x1d\xc6\x68\x03\x9a\xad\x33\x2b\x27\x31\xf5\x86\x2e\x3d\x71\x19\x3b\x71\x9d\xc0\x2d\x1c\xed\xb3\xd5\x19\xa7\x33\xa7\x89\x3b\x0c\x3a\x07\xda\x6c\xdd\x5a\x45\xb3\xc1\xd0\xe9\x4f\x98\xe2\xe5\xfb\x80\x7d\x87\xd1\xda\x80\x66\xeb\xcc\x5a\xd6\x33\x48\xa1\xc1\xec\x6c\x2d\x3c\xc9\x79\x54\x5e\xd4\xc4\xca\x6c\x4d\x3c\x95\x83\xd8\xdf\x9d\xdc\xc0\x32\x5e\x3c\x3d\xbc\x60\x78\x30\xd9\x7f\x30\xd9\x9f\xd9\x64\x1f\xb8\x8e\x78\xf4\xbd\x6c\x5d\xca\x16\x28\xf4\xb8\xd4\x07\xd4\xca\x24\x11\x20\x22\xd1\xf4\xcb\x24\x1f\x1f\x2e\x6d\x25\x22\x78\x8d\x1a\x78\x0d\xd9\xef\x94\xfd\x0a\x78\x23\xa8\xc0\x55\xa9\x1f\xca\xb9\x7d\x34\xd5\x8a\x81\x0e\xf8\x15\xb3\xb2\x58\x34\x3e\x5f\x32\xd1\xd9\x37\x20\xc2\xec\x4a\xf9\x5b\x5b\xca\xeb\xae\x0d\x22\xc6\xfc\xb3\x80\x1a\x0d\xa0\x74\x5f\x66\x34\xe8\x54\x01\x98\xea\x1a\x4f\xb2\x5b\xd7\x9e\x91\xb0\x0b\x70\x29\xd6\x73\x58\x58\x4a\xc8\x19\xa5\x21\xf1\x43\x3f\xf1\x9d\xc0\x67\xd4\x23\x4b\x84\x0d\x07\x34\x2e\x57\xac\x12\xbc\x05\xea\x61\xd7\x04\x12\x61\x04\x8f\x1f\x13\x79\x46\x86\x6f\x78\x90\x84\x74\x32\xcf\x97\x71\x26\x4f\x8f\x92\xbc\xc0\xe4\x16\xe1\x3d\x4e\x4d\x86\x1f\xf6\x68\xec\x27\xac\xcc\x86\x67\x9b\x48\x90\xd0\x2d\xf8\x2d\x87\x2a\x80\xeb\x0c\xd4\xbc\x59\xef\xa1\x52\x99\xc2\x62\x3a\x7f\x6a\x0e\x78\x59\x7e\xd0\x8c\x29\x63\xbc\x1b\xa0\xfe\xa3\x3e\x28\xb5\xcf\x28\x46\xaf\x8b\x62\x63\xae\xaa\x70\xc7\x3c\x4f\x16\x49\xa6\x2f\x80\x2a\xd9\x7b\xe3\xa5\x95\xda\x8f\xc4\xad\x8b\xd1\x41\xab\xbb\xe6\xf2\xbf\x22\xc6\x93\xae\x16\x2c\x32\xd0\x5d\x68\xe4\x98\x4f\xb6\x85\xfd\xaf\x64\x7a\xe2\x0d\x37\x31\xf9\xa7\xb4\xad\x23\xd7\x92\x9f\x18\xc8\x15\xfd\x63\x94\xaf\x71\xec\xc2\x7e\x47\x79\x7c\x4f\xa5\x17\x4c\x90\xee\x5b\xed\xe4\x04\x46\x02\xbb\xb6\x2e\x02\xf3\xad\xfe\x81\xe6\xcc\x09\xdc\x61\xe0\x24\xf4\x4b\x14\x7b\xe0\xb8\xd5\xda\xb5\x72\xb2\xa5\x62\xd2\x7e\x49\xca\x61\x8d\xa2\x18\xb6\xfe\x47\xb7\x3f\x51\x95\x2b\x65\xdb\xe7\x8e\x52\x7c\xaa\x94\x9a\x32\xa2\xac\xd4\xd8\x20\xf0\x93\x72\xfd\xdf\x6c\xb1\xce\x47\x7d\x64\x5c\x73\x41\x27\x38\xb7\xdc\x8c\xfa\x83\x61\x42\xb1\xd7\x64\x03\x33\x52\xba\x53\x9e\x96\x51\x2f\x5e\x41\xd1\x16\xfc\xbf\x3a\xb5\x3f\xb8\xac\xbc\x74\x34\xef\x4a\x3f\x94\xd8\xf1\x03\xff\x0f\xe1\xe3\x07\x41\xe3\xf8\xd0\x10\x57\x78\x7a\x93\x51\x86\xa4\x95\x20\xc8\x3c\x03\xc7\xa5\x72\x14\xf7\xdb\x8f\xd2\xbf\x2f\xdb\x8d\x52\x5e\x4f\x6c\xd5\xf4\x55\x01\x5a\x5b\x05\xe9\x55\xa3\xd3\x2d\x73\x00\xd7\x13\x9f\x18\x4b\x17\x55\xd7\xea\xde\x5d\x18\x6a\x96\x71\x5f\xe4\x12\xa8\x9b\x11\xac\x4e\x36\xa5\x27\x24\x04\xa7\xd9\x18\xaf\x5d\x25\x46\x3e\x8c\x4a\xd5\xe4\xd9\xd6\xfd\xeb\x49\x4c\x3b\x06\xe2\xa1\xd1\x2a\xfa\x84\xaa\xf2\x4c\x69\x8f\x9b\xff\xfe\x09\xcc\x4e\x45\x09\xb5\xfd\x9e\x04\xe0\x57\x2a\x2d\xd4\xc2\xf3\x76\x3e\x0c\xe1\x19\x27\xa0\x61\x05\xef\x0f\x50\xda\x83\x5f\x3f\x41\x6d\xfc\x00\x59\x4f\xd0\x29\xaf\x7a\x74\x22\x24\x53\x2d\x08\x43\x8a\xa5\x1a\x97\x4e\x22\x62\xaa\x91\x88\x3f\x7a\x18\x8a\xb0\x78\x8b\xc3\x21\x41\x20\x43\xb2\x01\x43\x33\x58\xca\xf7\xef\x92\x2d\x75\x6d\xb6\x04\x28\xa8\x80\x78\x20\xde\xf2\x73\x00\x55\x72\xc4\xc1\x29\xd7\x40\xbc\xff\x95\x4a\x45\x60\x56\xfe\x45\x4f\x60\x46\x9c\x18\x20\xad\x97\xe3\xf7\x7e\x48\x19\x5f\xe3\x38\x32\xe9\x18\xa7\x3a\xa9\xf7\xc6\x94\xe9\x57\x53\xd6\xa3\x23\x24\x0d\xeb\xbd\x91\x72\xa8\xf5\xc5\x0f\x82\xdd\x68\x18\x26\x05\xd6\xdc\xd9\x82\x86\xe1\x29\x0c\x05\xfd\x27\x7e\x31\x06\x80\xb6\xb4\xe8\xbf\xca\x0a\x75\x97\xb5\x87\xb6\xc0\x7f\xa2\x2e\xf5\x2f\x40\xcc\x64\xd3\x74\xc7\x2c\x0f\x6f\x7f\x3e\x68\x6e\x4d\x54\xcc\x6f\xea\x6d\x4a\xc6\x2e\x0d\x80\x6d\x66\xab\x1e\x21\x7d\xb0\x93\xb9\x70\xa1\x4b\xe3\xe3\x2b\xbb\xa8\xf1\x2c\xae\x18\x19\xaa\x78\xd5\xee\x4c\x31\x52\xb2\x40\x0a\xb0\x91\xd3\xda\x20\xaf\x25\xf3\xdd\xd7\x7e\x18\x8c\xc9\x80\xc6\x9d\x28\xee\xab\x2d\x0f\x8c\x25\xfc\x0e\x19\x82\x29\x40\x87\x3a\xc9\x30\xa6\xc2\xdc\x4c\x9c\x7e\x49\xd2\xa3\x7d\x52\xee\x0f\x83\xc4\x0f\xfc\x90\x56\x09\x73\x9d\x80\x1e\x46\xaf\xfc\xa4\x62\x98\x94\x97\x4d\x67\x9e\xdf\xbf\x4b\x76\xab\xcb\x72\x21\xe4\xd1\x8d\xac\x3d\xef\xd4\x7f\x34\x1f\x0a\x97\xa3\x07\x4c\xf8\x1b\xb5\xa2\x12\xe3\xeb\xb5\xdc\x81\x9b\x3b\xa6\xda\xf9\x8b\x37\x7c\xeb\xd9\x14\x07\xab\xeb\xa5\xdf\x49\xdd\xb8\x0f\x63\xb5\x5a\xc1\xe6\x91\x7a\x73\x45\xec\x1d\xd0\xa8\xaf\xd3\xb5\x03\x4c\x83\xf0\x26\x8b\x02\x99\x8c\xf5\x2c\x04\xab\x61\xb3\x35\x5d\x2e\x13\xfd\x29\x8f\xee\xc5\xe9\x4d\x4d\x42\x1e\x4a\x89\x7a\xb1\x60\x00\x37\x4c\xe6\xe7\x32\xd8\x15\xf4\x2d\x57\xb0\x35\x75\x36\xdf\x29\xda\xa5\x53\x83\x94\x82\x80\x19\x02\x57\xe3\x42\xc6\xfc\xbf\x4a\x71\x66\xab\x2f\x3a\x8e\x4a\x06\x31\x53\x23\xc5\x1c\xfb\x64\x56\x90\x06\x71\x33\x4f\x28\x68\xd4\xe2\x8f\x7f\xb9\x1c\x7b\x13\xc6\x8f\x44\x82\xc0\x3d\xb9\x3e\xd6\x9e\x49\x73\xf6\x93\x3c\xba\x28\xda\x4b\x72\x69\xe8\x66\x21\xaf\x4a\x38\xff\xfb\x82\xbe\x8d\xad\xb7\x4d\x8a\xc9\xd9\x1b\x8d\x4e\x4f\x07\xd9\xc8\x6f\xac\x86\x4a\x68\x43\x76\xc7\xa7\xc7\xb0\xc9\x77\x96\xd3\xaf\x74\x38\x10\x11\x08\x79\x19\xa8\xdf\x66\x2a\x66\xac\xe5\x65\x4b\xe0\x25\x3a\xee\x59\x4c\xc3\x44\xb8\xad\xc4\xb6\x8e\xf0\x8f\x34\x12\x59\x22\x4d\xd3\x1d\x22\x44\x4e\x34\x6a\xf1\x43\xba\x42\x0a\x11\xa7\x60\xce\xfd\x0d\x94\x7c\xff\x6e\x36\x24\x36\x88\x45\x22\xff\x1a\xec\xe7\x27\x03\xc1\x36\xbb\xad\xd7\x09\x9f\x2c\xe2\x3a\x21\x18\xcd\x78\x60\x9e\x8b\x2f\x39\x2f\x7d\xb4\xfe\xe6\x75\x8d\x2a\x56\x9b\x70\x2c\x1a\x0c\x59\x0f\x4f\x43\xeb\x45\xe5\xb0\x4f\x1b\x39\x9d\x33\x1e\xf6\x64\x99\x61\xbd\x4e\xda\x9e\x47\x3a\x7e\xcc\x12\x9c\x96\x24\x82\xfe\xf0\x33\x3d\x7c\x83\xa1\x70\x44\x82\x28\xec\xf2\x3c\x03\x3d\x51\xf1\x10\x50\x8e\x19\x89\xf9\x51\xeb\xe1\x88\xff\x3d\xb6\x83\x27\x9b\x01\xf6\x88\x98\x4a\x1c\xb0\x00\x60\x86\x7e\xca\xb8\xb7\xc4\xf2\x8a\x29\x55\xc9\xd1\x71\xf1\x52\xc3\xc7\x4e\x05\x6b\x0b\x33\xcb\x79\xbe\xf7\xad\xb5\x61\xf9\xae\xbf\x54\x3e\xf5\x6b\x9e\xed\xd5\x7e\x6c\xe4\x58\x21\x2b\x12\x7a\x99\xb4\x43\xb7\x07\xca\x60\x51\x42\xa7\x99\x25\x65\x40\x95\x74\x69\x3b\xdd\xac\x61\x2d\xe7\x93\xf4\x52\xce\xc4\x27\xd1\x85\x9c\x74\xc4\x49\x3e\x9f\x6f\xec\x08\x43\x35\x9d\x66\xc5\xe7\x70\x06\xe9\x82\x2a\xc9\x2a\x27\x23\xa0\x19\xe5\x64\x52\x1a\x3f\x2a\xa0\x61\x91\x76\xf5\x44\x08\x8d\x47\x25\xef\x12\x6c\x22\xc7\xfc\xff\x1a\x8d\xfc\xcb\x46\x13\x4f\xd1\xa8\xe0\x5f\x30\x66\xfe\x43\x8f\x8b\x7f\xa9\xce\xc3\x87\xec\x61\xe9\xb8\x62\xbd\xf6\xcc\xdb\xe1\x31\x6a\x96\x99\x93\x0a\xbc\x3b\x85\xeb\xe6\x1c\xa7\xf5\x54\x3b\xad\xdf\x8f\x0f\x12\x21\x46\x2a\x34\xd5\x2e\xc1\x66\xf3\x07\x01\x1f\x57\x6e\xe1\xf4\x9d\xaf\x06\xa3\x5f\x64\x51\x5e\xee\xdc\xb6\x57\x79\x7e\xfa\xbd\x4b\xbe\x59\x7b\x97\xa4\x45\x1a\x76\xbc\x29\xab\xd5\xf1\x3d\xb7\x3a\x86\x56\xc7\xa2\x55\x73\xeb\x4c\x9c\x38\xd9\x1a\x67\xc2\x14\x4b\xb7\x82\x36\xf9\x99\x58\x04\x67\x7e\x25\xa8\x5f\x6a\x99\xab\x57\x41\x9c\xe9\xf2\xb8\x5c\x29\x83\x30\x51\x2e\x91\x45\x63\x55\x2e\x92\x52\xc5\xf6\x5f\x70\x16\x53\xe7\x7c\x3d\xd5\x9d\xbe\xef\x79\x01\xfd\x61\xfd\x29\x9b\xcb\xc2\xd8\xa2\x2b\xa4\x4e\x96\xc1\x88\x71\x81\x80\x8f\x7a\x83\xf1\x2c\x82\x61\x63\x76\x38\xbc\x4a\x65\xf2\x98\xe4\x33\xb7\x3f\x7d\x34\x85\x23\x99\xd4\x5f\xcb\xdf\x7b\x12\x3b\x21\xe3\x47\x5d\xce\x57\xb4\xc8\x09\x0a\x69\xe3\x48\x6a\x0b\x54\x86\x24\x63\xb1\xa6\xa3\xc6\xb1\x94\x9f\x14\x7f\x55\xf0\x71\x97\x45\xae\x08\xc3\x32\x04\x40\xdc\x9a\xeb\x06\x60\x7b\x0c\xd7\x46\xb7\x80\x91\x5a\xde\x1f\xd2\x4d\xc4\x11\x08\xca\xbc\x0d\xdc\x78\x16\x09\xe7\xae\x64\x91\x5c\xea\x9f\xe3\x09\x4d\x18\x10\x6d\x77\x9d\xd6\x8e\x51\x53\xc5\xe0\x52\x53\x55\x41\x1b\x58\x52\xca\x7a\x8e\x96\x2a\xb8\xe9\x6d\x6f\x6a\x8e\x6d\xbb\x58\x56\xdd\x80\xed\xc7\x08\xe6\x62\xbd\xe6\x9f\x51\x7b\x30\x55\x6c\x5d\x35\xfe\x4a\x35\x1d\x86\xe1\x32\x15\x7c\x61\x9c\xbb\x23\xb7\x6e\x6d\xba\xc1\x57\x83\x8e\xb9\x0b\xe3\xd6\xe0\x2a\xf9\xe2\x4e\xcb\xf8\xad\x25\x3a\x33\xb6\x8b\xb9\xa8\xec\x9b\x00\x54\xdf\xa4\xa2\x32\xdc\xf7\x04\xe2\x24\xb2\x81\x13\x96\xec\xf3\xc8\x15\xa2\x92\x78\xe3\x16\xf6\x01\x2d\xd0\xc9\x0b\xc5\x54\x5a\xc6\x6a\xaf\xa2\xb4\x89\x05\xaf\x6d\x48\x81\x96\xe9\x15\x51\x1a\x05\xf2\xa2\x9c\x56\x0a\xdf\xc4\xe3\x83\xf9\xeb\x69\xac\xbe\x8e\xe6\x95\x96\x7d\xfe\xb8\x52\x15\x2a\x72\x58\xeb\x87\xe3\x01\xb5\x83\x47\x5f\x4f\x8a\x6d\x90\x4f\xa7\x78\x85\xf1\xe1\xd3\xf6\xc1\xf6\xde\x61\xfb\x70\x67\x7f\xef\xa4\x7d\x78\xf8\x69\xe7\xe5\xe7\xc3\xed\x03\x4e\xa5\x48\x99\x9a\x81\x4d\x22\xb9\x7c\x83\xb0\x9a\x53\x3b\x8b\xa2\x80\xe3\xd3\xc1\x98\xe3\x33\x40\xc0\x57\x1f\x1c\x86\x49\x97\x33\x00\x8a\x42\xba\xdf\x29\x1f\x89\x5d\xbc\xaa\xf6\xcf\x2a\x29\xd1\xd0\xe3\x7f\xc4\x35\x47\xe9\x18\x28\xdc\x96\x06\x7e\x44\x93\xd8\x0e\xe8\x77\x67\x03\x0f\x1c\x6a\xee\x5a\x53\x87\xc8\x33\x03\xc4\x5f\xb6\x08\xbc\x22\x1d\x8b\xbf\x9a\xea\x5b\xa4\xd4\xa4\x7d\x58\x38\x6a\xb3\x6e\x91\x52\xa3\xf6\x14\x92\xf9\x41\x73\xd7\xe9\xfa\xae\x7c\x78\x03\x2f\xa5\xbd\x95\x14\x51\xe0\x35\x6d\x6a\x7a\xe4\x88\x73\xd0\x08\x23\x47\xd8\x7e\x98\x38\xe2\x19\xab\x93\xa0\x33\x35\x75\x3a\x45\x46\x45\xea\xca\x9e\xfb\xe0\x97\xd7\xe4\x8c\xf6\x9c\x0b\x3f\x8a\xe7\xe4\xa5\xc5\xb2\x30\xbf\x9e\xd1\xfa\x5b\x5e\x30\xd9\xe6\xb8\x13\x3d\x6b\xdf\x8f\x39\xae\xe8\x5e\x59\x78\xda\xae\xd8\x1d\xd5\x86\x75\x5e\x39\xb7\xbd\x79\x67\xbe\xaa\x8e\xc1\x65\xc3\x97\x40\xdf\x19\xac\x83\xe6\xea\x1e\xdb\x3a\x2b\x68\x8b\x05\xbe\x4b\xb1\x35\x70\x14\x1e\xc7\xf0\xec\x0e\xdf\xdc\xa8\x5b\x7f\x71\xed\xd8\x87\x60\x50\x50\x86\xef\x13\x58\x05\x20\xa8\x64\x84\x97\x36\x8e\x7e\x3a\xd1\x23\xf5\x9f\x6d\x1c\xfd\x43\x8c\x85\x1b\xf7\x60\x2c\xdc\xb8\x9b\xb1\x70\xf3\x07\x1a\x0b\x37\xef\xcb\x58\xb8\x79\x0f\xc6\xc2\xcb\x3f\xd0\x64\x76\xf9\xbe\x4c\x66\x97\xef\xc1\x64\x56\xc6\x1a\xfc\x30\x8c\x29\xfa\x18\x2c\x26\xdb\xb5\x59\x4d\x84\x6f\x67\x33\xfb\x60\xcf\xfa\x60\xcf\xfa\x60\xcf\x7a\x57\x7b\x56\xf8\xbb\x2c\xe4\x9f\xf5\x07\xcb\xcf\x07\xcb\xcf\x07\xcb\xcf\xbf\xcc\xf2\x53\x3a\x60\xe9\xf8\x01\xdd\xbf\xa0\xf1\x85\x4f\x47\x64\x2b\x4a\xe6\xd0\x2f\xb3\xb4\x09\xc5\x70\x7a\x37\x2a\x94\xf2\xf6\xec\xbc\x08\x84\x65\x65\xb3\xa7\x2c\xd0\x04\x5b\x98\xd2\x8c\x6f\x2b\x9a\x64\xc5\xb7\x15\x69\xf3\xab\x7c\xc3\xbc\xad\x48\xd9\xe5\x49\x6d\xce\x8d\x86\x6f\x5b\xd1\x54\x06\x6f\x1c\x74\x45\x85\xad\xe1\x35\x75\xd8\x9a\x02\xcb\x33\x18\xcd\xd1\x0f\xbd\x35\x74\x8d\x5b\xc3\x9c\x58\xf7\x32\xc7\xd2\xd5\x19\xd7\x7f\xf1\xb4\xb7\x6a\xb6\x7b\x52\x67\x2c\x17\xd6\x24\x0d\x78\xbe\xd8\x69\xa9\xfb\xbc\xc8\xd6\xf6\x59\xee\x39\x5d\xd4\x8d\x2d\xba\x97\x7c\xfd\xba\x63\xf1\x35\xe6\x5f\xe8\x0b\x74\x31\xce\xb9\x51\xba\xc5\x79\x26\xa3\xbf\x2b\xb9\x7e\xec\x82\x1e\xe4\x76\x1a\xd7\x3c\x89\x73\x5a\x8d\xab\x9a\xd7\xca\xcc\x0d\x51\x11\x63\x34\x48\x68\x0c\x81\xba\x27\x36\x72\x95\xaf\xb7\xd5\xb3\x6a\x13\x18\x84\xb9\xb7\x08\x0b\x02\xde\x9b\x04\xd5\x22\xa6\x16\xb6\x50\x35\xae\xef\xfa\x72\x34\x90\x5b\xd1\x0d\x0a\xc8\xc6\x64\x05\xe4\x72\xcd\x0c\x53\xbc\x41\x4a\x5b\x40\x5b\x32\xd3\x54\x4f\x72\x04\x4c\xa5\xb0\xce\x3f\x21\xd6\x9c\x1a\xbe\x1a\x07\x05\xd5\xe5\x4c\x00\xb4\xf2\x90\xa3\xf3\x4e\x00\x26\x6a\x00\x6f\xa8\xaf\xf4\x55\x15\xb8\xf8\x45\x64\xdd\x25\xc2\xa4\x60\xc0\xb6\xa6\x64\x62\x4c\xab\xbf\xec\x19\x39\xae\xb5\xe2\x97\xe4\xcf\xee\xfc\x92\x5c\xb6\x70\x3f\x8f\xc9\x25\xb4\x59\x95\x1d\x0a\x90\x8c\x70\x57\x7c\x28\x7e\x72\x8f\x6d\xdc\x49\xaf\x92\x03\x6f\x56\x15\xc8\x0f\x75\x1f\x90\x06\x7f\x27\x1d\xcb\x7d\xb8\x0f\x58\x91\x50\x02\x87\x15\xd3\xf8\xf3\x95\x19\x67\x3a\x05\xfe\x4e\x6f\xce\x2d\x48\xb3\x2a\x7c\x14\xce\x40\xcb\x5b\x4c\xd9\x33\x2e\xea\x6c\x03\x77\x7a\x78\x9e\x06\x36\xeb\xe3\xf3\x1f\xa2\xf5\x5d\xbb\x07\xad\xef\xda\xdd\xb4\xbe\x4f\x7e\xa0\xd6\xf7\xc9\x7d\x69\x7d\x9f\xdc\x83\xd6\xf7\xe9\xc9\xc9\x7b\xe7\x8c\x16\x33\xa4\xb5\x19\x55\xa0\xcf\x4e\x4e\xdc\x08\x6e\xb1\x68\x7c\xf2\x9e\x4b\x76\xc5\x64\xf2\x7c\xb6\x26\x9e\xff\x78\xcf\x04\xcd\x86\x68\x03\xa2\x54\xdf\xe0\x9c\x00\xaf\xdc\xe6\x1e\xfc\x13\x5c\x5b\xca\xb7\x6c\x70\x76\x27\x56\xda\x36\xdb\x0f\x1d\xcf\xc8\x2a\x70\xf9\x41\x37\x5e\x56\x0f\xd8\x9c\x38\x96\x76\x33\x12\x4b\x71\x1a\x3f\xbc\x02\x3e\x0d\x77\xe2\xd8\x7e\x1a\xce\xb3\xd6\x95\xf5\xb0\x4c\xc5\x7e\x74\xe2\xa8\x0f\x9d\xc8\xa8\xe9\xfe\x13\x5f\xc6\x9b\x6f\x73\xd3\xa7\x13\xcf\x49\x9c\x49\x62\x7d\x3e\x13\xab\x39\x35\xb8\xb1\xdc\xef\x4c\xcd\xb6\x32\x97\xf6\x68\x61\xe0\x04\x43\xda\x76\x5d\xca\xd8\x64\x03\x83\x42\x60\x7c\xea\xe0\x74\x13\x44\xee\xf9\x17\x9f\x4d\x3c\x66\x15\x42\x91\x46\x1a\x1c\x1d\xef\xe8\xc4\x83\x52\xf1\xb0\x42\xba\xdf\xe1\xb8\x2d\x1f\xcd\x50\x5b\x1c\xf4\x66\x69\x58\x9c\xd0\x66\xc5\xde\x71\x45\x3d\x8d\xcd\x31\x9e\x48\xcd\x90\x5a\x29\x56\x7a\x99\x86\x49\x3c\x4e\xc7\x11\x9f\x41\xc8\x29\x57\x10\x54\x4d\xf9\x16\xbb\xb5\x68\x98\x06\xd1\x22\xc6\xa7\x7e\x09\xac\x06\x02\xdb\xe2\x7b\x9f\x25\xe6\xb3\x1d\x40\x86\x93\x38\xf2\xaa\xa8\xc6\x3f\xaa\x4a\x33\x65\x0c\x5d\x95\xb0\x52\x65\x51\x41\x4f\x16\x98\x77\x54\xe9\x34\x14\xd1\xaa\x02\x2a\x45\x16\x01\x7f\x9f\x13\xcd\xca\xb5\x55\xb9\x93\x38\x60\x43\x6e\xf6\x04\x0c\xcd\xb1\x55\xb4\x0d\x17\xf0\xa5\x6d\x38\x70\x20\x18\xea\xf7\xef\x04\x7e\xa4\x8c\x15\x33\xef\xa8\xe7\xa6\x98\xe1\x8c\x68\x97\x6f\xc0\x76\x3b\xb1\x22\x47\x11\x8c\x58\xba\x32\x95\x2c\x5a\xe7\x17\xf0\x99\x5d\x0a\x7c\x96\x94\xa4\x49\x1b\x8c\xcf\xb6\xd2\x03\xea\xc8\x98\xe9\x99\x4e\xf1\x6e\x7f\x1a\x2b\x57\xca\x02\xe7\xca\x3d\x9e\xbd\x54\x54\x7b\x53\x78\x01\xc8\x95\x4d\x8e\xe6\x47\x52\xe7\x07\x0e\xfb\x5e\x8e\xb7\x04\xa9\x81\x1a\x0e\x1a\x21\x8f\x1f\x0b\xda\x1f\x38\xe3\x20\x72\xbc\xaa\xa4\xc7\x4a\xfa\x81\xd4\x5d\x66\x72\x1a\xa1\x33\x6f\xea\x6e\xa9\xf9\xcc\x93\x02\xa7\xd4\x7c\x22\x77\xaa\x8a\xb5\x64\xea\x25\x61\x16\x84\xd9\x63\xd5\x30\x4e\x06\x7d\x39\xfc\x31\x52\x7d\x3a\x7a\x19\x4d\xd4\xc2\x4d\x1c\x70\x0d\x7c\xd8\xff\x82\x50\x6e\x71\x2e\x37\x88\x4a\xad\x5e\x4e\x56\x38\xc7\x2d\x1b\x8d\x82\xba\xae\xcc\xfd\x50\x73\x99\xeb\x8a\x61\xb9\x8a\x17\x05\xb8\x48\x4a\x64\x11\x91\x30\x97\xd2\xad\x82\x45\x67\x05\xfc\x39\x2a\x46\x69\xa9\x38\xd5\xef\x75\xa3\x40\x4a\x41\xaa\x32\x4a\x62\x9f\x01\x4c\xa8\x54\xf3\xca\xc6\xce\x29\x43\xef\x90\x6c\x8d\xa0\xf8\x90\x3a\x89\x3f\xf1\x52\x50\x08\x03\x79\xc5\xc3\xb4\x57\x88\xbb\xd0\xbb\xea\x1d\x47\xb3\x81\x44\x9e\xb4\xe4\xf7\x07\x81\xef\xc2\x5b\x1d\x14\xad\x80\xb5\x5e\x57\xac\xae\xdd\xae\x75\x9f\xfd\xe2\x04\xbe\x27\x9b\x17\x83\xff\xfe\x7d\x56\xfd\x58\xb9\x22\x60\xfc\xa5\x38\xa9\x62\x28\x9d\x30\x69\x11\x9c\xa9\xa9\x71\x34\x41\xef\xf9\x83\x87\xa6\x57\x9a\x35\xb9\x55\x22\xc8\x74\xc2\xd0\xe5\x8a\x32\xb7\x4f\x24\x59\x29\x7b\xe1\xa5\xdc\xa6\x13\x04\x2f\xc7\x1f\x9c\x98\x86\xd6\xba\xc8\xe6\x96\x07\xf0\x47\x98\x73\xe8\x15\x02\x2f\x4d\xcf\xa9\x7b\x0e\x39\xef\x71\x15\xe4\xc5\x67\x58\xb6\xe3\x33\x2c\x4f\x8a\xcf\xb0\x7c\x4c\xf0\xbe\x59\xcb\x0c\x46\xf3\x20\x3a\x18\xdf\xda\xb7\xc3\xe3\xc7\x99\xbe\x3c\x7e\x6c\x97\x9d\xbc\x98\xc5\x78\x24\xbc\x0d\x92\xd7\x0c\xbe\x58\x83\x68\x4b\x97\x88\xef\xcd\x9e\x1f\x60\xf9\x19\xf7\x95\x9e\xb8\xe8\x0a\xbd\x36\x47\x39\xe7\x70\xb8\x97\xc8\x36\xab\x5a\x70\x4c\x7b\x4f\x87\x22\x29\x89\x42\x0c\x6c\x8a\x37\x5e\xea\xee\xc9\x0d\xa2\x50\x52\xe1\xbc\x6c\x59\x6f\x5e\xc6\x52\x9a\xcb\x30\x74\x20\x3e\x9b\xa9\x8b\xf5\x05\xff\x87\x09\x4c\x4d\x4c\xaa\xa7\x29\x4c\x2a\xda\x85\x53\xae\xa0\x6a\x93\x83\xa7\x18\x77\x66\x86\x05\x89\x9a\x17\x71\x47\x19\x38\xca\x9d\x4b\x8e\x32\x21\xd5\x21\x19\x00\x46\x6f\x3a\xb9\x0b\x28\x9b\x68\xed\x53\xf6\x79\xc7\xfc\xbc\xcb\xdd\x94\xa6\x8c\xcc\x0d\xd5\xf2\x9d\x3c\x63\x63\x68\x27\x98\x53\xea\x11\xe9\xa3\x39\x89\x90\xac\xd0\x7e\xbc\x23\xa2\xc6\x82\x52\x22\x8c\xc2\x25\x38\xa9\x2f\x05\xfe\x39\x25\xdb\x07\x2b\x22\xfe\x01\x03\x9e\xb3\x23\x2a\x16\x59\x45\x3e\x15\x36\x8b\x92\x25\x14\x95\x7b\x9e\xe7\x0c\x5d\x2f\x08\xf9\xf4\x4b\xcc\xbb\x68\xb5\x2c\xa0\xf2\x6c\x31\x99\x29\x64\xad\xdc\x15\x59\x4f\x6b\xcd\x5a\x73\x85\x1c\x0a\x04\x95\x25\x43\xab\xfc\x80\x51\x4d\x3b\xa8\xfb\x0c\xea\xa8\x22\x4a\x9a\x71\xf3\x36\x24\xa3\x06\xed\x64\x97\x26\x5b\x96\x34\x96\xab\xd2\x5c\x7b\x52\xc9\xaf\x30\x29\xde\x9f\x5d\xf2\x4f\x09\xfb\x07\xaf\x98\x63\x67\x60\x0f\x49\x35\x9b\xca\x2a\xbf\x74\x18\x55\x57\xf8\x55\xd2\x8b\x5c\xe8\xa9\x39\x6d\x22\x8d\x2c\x92\x52\x59\xc5\xdc\x48\xe1\x40\x47\xdf\xb0\x00\x56\xf0\xed\x1f\xce\x72\x36\xe8\x40\xaa\x33\x19\x56\x30\x4d\xd4\x04\x49\xc8\x07\xa0\x8b\x6d\x41\xd0\x89\x56\xbd\xfe\x8d\x75\xe0\x19\x4d\x2d\xa4\x49\xfd\xe2\xcb\xe5\xb3\x5f\xea\x73\x22\x24\x45\xab\x5e\x67\x89\xe3\x9e\x47\x17\x34\xee\x04\xd1\x08\xc2\x51\xfc\x3e\xa4\x0c\x9c\x0f\xd5\xd7\x9e\x34\x56\x9a\xcf\xd7\xea\x9d\x61\x80\x47\xe3\xa5\xa8\xb3\xf4\xcd\xb9\x70\xd0\x90\x74\xe9\x9c\x8e\xdd\xc8\xa3\x4c\x19\x76\x6d\xf2\xa1\xfa\x34\x74\x95\x9b\x7a\xe9\x9a\xde\x8d\xe2\x98\xb2\x41\x04\x6f\x2a\xc4\x61\x99\xf3\x9c\xae\x7f\x41\x43\xbe\x19\x01\x5e\x23\x50\x50\x6f\x46\x1e\xd5\xbe\xf4\xd1\x21\xfe\xae\x7f\x49\xbd\x6b\x99\x4b\xae\xf6\x44\x8c\x2c\xac\x01\x95\xaf\xd0\xab\xc9\xb5\xe1\x12\x5f\xd6\x83\x24\x67\xe0\x93\xc1\xf0\x2c\xf0\x5d\x34\x37\xd3\xcb\xb4\x70\xdd\x96\x19\x75\x62\xb7\xb7\x13\x0e\x86\x62\xfd\xd6\xeb\xe4\x1d\x1d\x9f\x45\x4e\xec\x11\xb0\x69\x61\x73\x32\x1a\xb0\x2a\xc9\xe9\x54\x06\x98\xc6\x33\x85\xb0\x15\x4c\x03\x53\x01\x7d\xdf\x89\x61\x6d\x98\x65\x6a\x18\x33\xf2\xfb\x77\x2b\x51\x62\x20\x95\xec\xf6\x9c\x98\xa7\xcf\x49\x33\x25\x0d\xb5\x62\x16\x24\x1b\x46\x7b\x72\x9b\xae\xd7\x09\xe2\x53\x0e\xa6\x84\x5a\xc2\xe2\xde\x4b\xd1\xcb\xe9\x53\x76\x64\xe4\x1c\x0b\x70\xdb\x17\x34\x1e\x63\xa0\x3b\x50\xa9\x97\x5d\x87\x41\xa8\x03\xdc\x50\x2a\x42\x36\xc0\x9a\x10\xd6\x16\x1c\xd2\x98\x6d\x08\x48\x6e\x8f\xba\xe7\x04\xc9\x0c\x2b\x41\x30\x23\x3e\xe3\x1e\x2a\xcb\x20\x4f\x74\xa2\x96\x44\xef\xa3\x11\xdf\xc3\x19\x2d\x57\x8e\xc5\x70\xac\x1a\xaa\xf3\x56\xaa\xd5\x9a\x13\xf8\x0e\x2b\x6c\x4f\xe4\xde\x53\x8b\x23\xea\xc7\x1e\x3c\xdf\x72\xdc\x84\xc6\x2f\x2c\x72\x32\xc3\x01\x35\x15\x18\x91\x27\xa7\xbc\x9d\x94\x1b\x15\x43\x52\x52\x42\xf9\xdc\xb5\x19\xc7\x82\x9c\x8d\x61\xbe\xc4\xc2\x22\x2a\xe4\x1e\xc7\xdf\x51\x09\x82\x18\x96\x8e\x79\x97\x36\x7e\x26\xcd\x95\x39\x15\xd4\x11\xf0\x6b\x84\xe8\x73\x91\x52\xcd\x4f\xa9\xff\x2d\x41\x04\xfa\x81\xe3\xd2\x52\x8b\x3c\xe3\xa2\x66\x29\x71\xce\x4a\x2d\xf2\x1c\x7e\x63\x1b\x2d\xd2\x5c\x81\x4f\xd6\xf3\x3b\x09\xff\x7c\x02\x9f\x6e\x12\x07\xfc\xeb\x29\x7c\x39\x01\x64\x21\x90\x81\x33\x64\xb4\x0e\x2f\xca\x79\x22\x42\x73\x9d\x01\x23\x41\xe4\xf2\xa4\xe5\x06\x36\xc0\x5c\xfe\x81\x10\x64\x3f\x56\x96\x05\x8c\x2e\x25\xc3\x01\x4f\x58\xd1\x09\x5e\x34\x0a\x79\xd2\xaa\xe8\xa0\xc7\x3f\x20\x7c\x63\xa9\x17\xf5\xa1\x3a\xf6\x2e\xa0\xd0\xd7\x15\x84\x8d\x70\xb0\x73\x31\xb8\xd2\x68\x91\x15\xec\x96\x80\xb8\x8a\x3d\xf2\x43\x46\x63\x9e\xbb\x8a\x40\x3d\x1a\xd0\x84\x83\x5d\x15\x83\x8e\xfa\x7d\x07\x5a\x7d\xde\x54\xed\x90\x4c\x2a\xb4\x61\x26\xe3\x10\xc2\x61\x7f\xe0\x78\x64\x81\x23\xa5\xf1\xc4\x4c\x5a\x84\xa4\xa7\x66\xd2\x12\x24\x3d\x37\x93\x6a\x3c\xa9\xd9\x30\x93\xea\x90\xd4\x94\x49\x12\xc1\xcd\x55\xc4\x10\x73\xe3\x28\x08\x74\x2a\x8e\xaa\x3f\x86\x57\x89\x43\x31\xbd\xcf\x96\x55\xaa\x70\xe7\x14\x61\x3a\xf6\x7a\x1d\x7e\x63\x77\x37\xe0\x37\xf6\xb3\x0a\xbf\x11\xa9\xd0\xd9\x67\xd8\x59\xe8\xe5\x73\xec\x25\x74\x4f\x20\xe5\x14\x7e\x63\x5b\x47\x7c\xde\x05\x61\xfc\xfb\xdf\xfc\x43\x90\xc4\x31\xfc\x86\x0a\xf3\xa5\x79\xfe\x7b\x79\x0e\x43\x02\xbf\xa1\xc1\x80\xc6\x6a\xb1\xe3\xab\x3c\xfc\x30\xc8\x5b\xa7\x00\x81\x63\x94\x1f\xa6\x67\xe6\xbf\xff\xef\xff\x4f\x93\xf0\x7f\xff\xef\xff\x57\x13\xed\x7f\xff\xef\xff\x4b\x93\xf3\x7f\xff\xef\xff\x47\xd7\x71\x13\x83\xd0\xdd\x28\x4c\xe2\xc8\x48\xc0\xf0\x78\x29\xe2\xd7\x64\x9f\xb3\x0a\xf4\x02\x40\x16\xa0\x97\x18\x65\xae\x33\xa0\xe6\x9a\x70\x8d\x15\xd1\xb5\x96\x43\xd7\x33\x56\x82\x1f\x32\x8b\x68\x0d\x8a\xed\x23\x5d\x72\x2c\xce\xd5\x17\x1e\x71\x66\xf2\x21\x8e\xba\xb1\xd3\x77\xe0\xe5\x6a\x30\x26\x8e\xe7\x61\x00\x1a\x08\x60\x8b\xe1\x2d\xeb\x80\xf4\x80\xf3\x4a\x74\xc8\xc1\xf9\x17\x9b\x83\xdb\x50\x9f\x6c\x90\xe7\x4f\xf1\xe2\xb6\xb9\xbc\x22\x6e\x6c\x91\xb1\xe3\xd6\x00\xb7\xb0\x9b\x82\xe3\x95\xfd\x0a\x3f\x3a\xf9\x64\x89\xac\x2c\x03\xd8\x50\x6c\x5f\xd6\x1d\xf1\xea\x33\x84\xb8\xf6\xcc\x02\xc8\xab\xad\x3e\x03\x00\x50\x57\x09\x84\xe7\x74\x6c\xf4\x47\xdc\xb6\x37\xed\xde\x94\x3a\xa5\x45\x1f\x1b\x5f\xe4\xeb\x44\xb6\xce\x97\x8e\x5d\x5f\x3c\x31\x6a\x36\xec\xfa\xa2\xac\x01\xe5\xf9\x93\x34\x9b\x76\x61\x6f\x4e\xb1\x69\xce\xbb\x8f\x9a\x2b\x92\x43\x97\xb6\x81\x99\x6a\x36\x0d\x7b\xb1\x41\xb8\xe9\xef\xc4\x4f\x40\xde\xbf\xba\x86\x08\xb9\xf0\xc5\x3b\xcb\x59\xf6\x88\x8b\x33\xf8\xae\x18\x06\xb4\x09\x4a\x2d\x12\xd3\x0b\x1a\x33\x4a\xfa\xce\x60\xc0\x27\x51\x8c\x0d\xde\x20\x7b\x94\x55\xc4\xfe\x2f\xd0\x7a\xac\x51\xda\xf6\x3c\xb5\xae\xd4\x94\x40\x02\xaf\x2c\x72\x50\x06\xc2\xca\x90\x74\x6c\x6c\xae\x98\x20\x68\xcc\x14\x84\x27\x86\xc4\xfa\xd1\x61\xee\x27\x1c\xa0\x64\xd6\xf6\xaf\x3b\x87\x3b\x7b\xaf\x0d\xc4\x6f\xef\x1d\x6e\x7f\xda\xde\x4a\xa7\xa4\x0a\xfd\xba\x73\x68\x95\xf9\xbc\xb7\xbb\xff\x79\x0f\xd3\x32\xf1\xeb\x2d\xaf\x06\x05\x46\x48\x50\xf2\x83\x59\xd0\x3e\x66\x7d\xf1\x03\xcf\x75\x62\xaf\xac\xa1\xa9\x63\x1d\xa8\x95\x26\xd8\x6f\x19\xa5\x26\x9d\xf9\xa0\x80\x5d\x7c\x2b\xea\x17\x1d\x2b\x9f\x67\x4a\xde\x08\x7b\x2b\xea\xab\x4a\x1f\x6e\xc0\xc9\xf2\xd3\xe7\x7f\xca\xa9\xb3\xa8\x01\x85\x6f\xc3\xe2\x23\x17\xbc\xdd\xbc\x61\x95\x22\x5c\xce\xed\x9f\x7d\x13\x96\x24\x12\xc4\x23\xfd\xce\x29\x6d\xe8\x63\x34\x36\xbd\xe5\x08\x9a\xf8\x60\x53\xd2\xc0\x27\x12\x3f\xd1\xba\x07\xf3\x8c\xf3\x2b\xf4\x54\x9e\x0a\x20\xf3\xff\x08\x6b\x99\x87\xd7\x84\x0f\xaf\x09\x1f\x5e\x13\xfe\x45\xaf\x09\x39\x57\x30\xb7\xc9\xbc\xad\xb3\x34\x0c\xfb\xd1\x30\x4c\xa8\x57\x42\xed\x74\x66\xa3\x55\x09\x25\x7a\xe9\x1b\xe5\x72\xf6\x68\x9d\x54\x92\x31\xff\xcd\xd2\xd9\x3d\x5e\xc0\xe5\x65\xad\x0e\x64\xf7\x7e\x09\xf6\xd2\x4f\x10\xaa\x14\x09\x0f\x7b\x94\x1c\xc6\x4e\xc8\x7c\xdb\xd7\x3a\x09\x68\xc2\xc8\x38\x1a\x8a\x77\xdd\x10\xae\x38\xd1\x05\xc1\xfb\x4c\x14\x52\x5d\x83\x43\x43\x17\xf7\xe0\x9c\x15\x83\x76\x9f\x44\x17\x34\x26\x89\xdf\xa7\x27\x78\x23\xe0\x10\xe6\xf7\x07\x01\x25\x1e\x75\x03\x27\xc6\xb0\x97\xed\x0f\x3b\x35\xb2\x1b\x31\x3c\x82\x46\x61\x30\xe6\xc0\x20\xa4\xe4\x90\x49\x6f\xaf\x10\xe8\x17\x43\x54\x72\x8c\xfb\x61\x97\x38\xa1\x47\xc4\x04\x40\xbc\xec\x0e\xe7\x59\x5a\xc5\x7a\x36\x4c\xc0\x6b\xac\x13\xb0\x88\x03\x3c\xa3\x0a\x9c\x1a\x94\x1f\x2e\x0d\x02\xc7\xa5\xe6\xd8\x60\x14\xc0\xf7\x46\x34\x08\xa4\xaa\xf0\xa5\xbe\x79\xe1\x9d\x38\xd5\x58\x3b\x35\xd0\xe6\x45\x94\xc1\xb2\x73\x82\x84\x8f\xbc\x47\x95\x9b\x1c\x11\x61\x93\xc3\xd2\xe5\xfd\x44\x5c\x0b\xb1\x2a\x01\x8f\xb0\xc1\x98\x77\xc5\x3d\x67\x64\x1e\x26\x76\x1e\x46\x39\xcf\x67\x6e\x5e\xf6\x8c\x6f\x5a\x1c\xb2\x02\xc3\x20\x50\xe7\x0e\x20\x6c\xc0\xc7\xc7\x27\x2e\x89\x40\xfd\x49\xfa\xd4\x09\x25\xb6\x68\xa7\x23\x82\x82\x26\xbd\x08\x64\x55\x0e\xb0\x46\x5e\x45\x9c\xb5\x38\x30\x33\x23\xca\xb1\xc6\x01\xf2\x73\x16\xf8\x43\x62\x30\x05\x46\xb7\x47\x3d\xce\x98\x13\x02\x5d\x64\x04\x6a\xfb\x09\x6b\x09\x5c\x9d\x9e\x9e\x7e\x63\x97\x30\x89\x68\xf4\x7c\x98\xa2\x9c\x12\xc8\x57\x4b\x1a\xe9\x4b\xdd\x38\x1a\x0e\xea\xba\x5c\x69\x5d\xc0\x02\xe6\x42\x8c\xd0\xfb\x2b\x8d\x46\x2a\x0f\xa7\xe5\x00\xbc\xf5\xc3\x41\x7a\x41\xfa\xd0\xf3\x31\x34\xf3\x69\x34\x70\x5c\x3f\x19\x93\x7f\x5e\x49\x40\xd7\x7d\x46\xa8\xc3\xe8\x92\x1f\x2e\x45\xc3\xe4\xb4\x8a\xb5\x44\x41\xf4\xce\xb4\x40\xae\xad\x86\x34\xc8\x03\xc4\x8a\x6a\x4c\xae\x57\xce\xfe\x34\x08\xb0\xf4\x52\xd9\xd4\x6b\x11\x33\xbb\x29\xb2\xaf\xed\xd1\xbc\x72\x40\xff\x55\xbe\x22\x7e\xd8\x22\x3e\x08\x13\xe4\xba\xc2\x0f\x65\x65\x84\xf6\x93\x81\x4d\x3f\xdc\xb8\xc2\x32\xd7\xb0\xcc\xa2\x61\xb2\xa1\xc7\xf8\x33\x56\x20\xe4\x0a\x7c\x21\x50\x13\x0a\xff\xf7\x93\xe7\x5f\xe0\x0c\x6f\x5c\x5d\xe9\x64\x42\x6a\xb5\x9a\x89\xd5\x6a\x2a\x2f\x8d\x88\x23\x80\x7e\xac\x4b\x5d\xeb\xa6\xf9\xbf\x9d\x52\x9f\xb4\x49\x87\x8f\x4c\xf7\xfd\x91\xd1\x8f\xba\xe7\x5f\xa8\x1a\x95\x6b\x31\x4e\x83\x1c\x20\xb3\xb2\x2e\x88\x4b\x20\xac\x0d\x4b\x8d\x7a\x37\x2d\x48\x2e\x28\x9c\x78\xd1\x09\x71\x42\xa1\x35\x3e\x1b\x13\x3f\xe1\x3b\x3b\xdc\x61\x26\x0c\x6f\xf5\x75\x35\x58\x4f\x5f\x7a\x0e\x2c\x50\x58\xd3\x5e\x04\x8e\x9c\xf9\xd2\xcc\xe1\x15\x8a\xcd\x11\x86\x8b\x8f\xf3\x1d\x74\xcb\x9e\x5d\xf3\x65\x36\x74\x7b\x9c\xbd\x9c\x81\x2a\x83\xf7\x47\xac\xb2\x28\x46\x99\x8b\x9f\x5e\xe5\x12\x73\x7b\x4e\xd8\xa5\x4c\x2e\x55\x31\xf4\xc3\x1e\x8d\x29\x71\x62\x4a\x56\x49\xdf\xf1\x35\xd3\xb2\xb8\x39\xba\xcc\xf6\xc3\x16\x20\x74\x89\x9c\xca\x3d\xe6\xd4\x4a\xd8\xde\xd2\xdf\xb8\x59\x58\xdf\x98\x0d\xad\xa6\x06\x8e\xbe\xad\xbb\xdd\x80\x7a\xe4\xc2\x77\x70\x1e\xfc\xf0\x14\x2c\xb1\x6a\xe4\x0b\x1f\xc2\x29\xdf\xcc\x4f\x6d\x7e\x45\xce\x68\xd7\xc7\x28\xc2\x1c\xec\xfc\x36\x72\x3a\x96\x38\x5d\x5a\x23\x5b\x43\xbe\x94\xe0\xed\x37\x26\x55\x53\xb5\x47\x7e\x10\x10\x50\xef\x22\x37\x81\x09\x44\x5f\xde\x99\xb9\x01\xd2\x4d\x22\x72\xaa\xf7\xd4\x53\xc5\x40\x15\x57\x11\xc1\x8f\x8d\xca\x9c\x5b\x26\xbc\xff\xc0\x2b\xa9\xac\x4f\xbd\xd2\x29\x76\x8a\x44\xa1\x4b\xd5\x3e\xc5\x3b\x17\xd0\x84\xd6\xc8\x7b\xca\xbf\x13\xe7\x9c\xda\x3a\x2a\xc9\x5f\xb3\x3c\x12\xfa\xb9\x41\x70\xc1\x83\x7c\xa4\x79\x02\x62\x17\xf0\x73\x20\xe2\xc7\x94\x61\x15\x4b\x2e\x97\x72\xa4\xcf\x41\xa0\xf4\x84\x8b\x45\x32\x30\xf3\x99\xfd\x82\x11\x93\x5f\xae\xb9\x9f\xcc\x05\x98\x65\x31\x86\x7b\x66\x3f\x34\x38\xcd\x5a\xa3\x71\x4d\xea\x66\xc5\xb3\x61\x92\x70\x84\x86\x9b\x81\xef\x9e\x8b\x9a\xe9\x51\x5c\xff\x0c\xb9\x1c\xb7\x90\xf8\x53\x1d\xab\x29\x40\x26\x43\xd0\x03\x31\x96\x3e\x90\x16\xec\xae\xd8\x9e\xcf\x88\xcb\x41\x0a\x66\x90\x4b\x2b\xf6\x4c\x22\x25\x20\x19\x3b\xa1\x27\x26\x62\xcc\x8b\xc4\xa8\xba\x5a\x6b\x34\xfa\x8c\x94\x79\x1d\xbc\x51\x8c\x3a\xe4\x54\x0c\xfd\x54\x2c\xd0\x8e\x1f\x82\x4a\x12\x9d\x16\xe3\x46\x69\x90\x4a\xcd\xec\x2e\xac\x0c\x9f\x91\x53\x98\x63\x5c\x12\xcc\xe9\x73\x3a\xe1\xf4\xd1\x73\x06\x03\x1a\x32\x42\x2f\x5d\x3a\x40\x21\x03\x7b\xd7\x8f\x2e\xf8\xa6\xcf\x29\xfd\x54\x89\x70\xa7\xa2\x25\x14\x2a\x45\x88\x6d\x8c\x29\xa5\xa7\xce\xf2\x3f\x01\x46\x45\xff\x2c\x0e\x26\xa5\xaa\x55\x49\xa6\x6c\x2a\xb0\x94\x2a\x2a\x0d\xbe\xc1\x7e\xee\x32\x99\xec\xa7\x42\x57\xab\x58\x51\xa8\xa6\x0c\xd6\x94\xee\x14\x9e\xae\x31\x2f\xd5\x0d\x13\x3e\x5a\xff\xbc\xe6\xe2\x05\xdc\xe6\x41\x09\x63\x07\x83\x1c\x34\x30\xad\xd7\xc9\x4e\x28\xe8\x07\x8a\xa1\x48\x79\x68\x97\x25\xfc\x5c\x28\x04\x1f\xce\x80\x63\x8a\x4a\xe9\xc1\x80\x3a\x70\xc5\x89\xed\xe2\xb7\xb2\x12\xc3\xaa\xda\xe0\x0c\xbe\x6b\x3e\xdb\x95\xd2\xab\x8c\xa3\x01\x90\x49\x4b\x7c\x21\x14\x63\x38\xe2\x34\xcc\x97\xd1\x90\xa5\x7c\x67\x63\x9c\xa9\x90\x5e\x26\x2a\x1b\xad\xd7\xd4\xb5\x2d\x02\xf5\x43\x6d\x5c\x0e\xfe\x87\xa1\x11\x2b\xac\x4e\xaa\x15\xdc\x06\xb4\x73\xd5\x9c\x96\xe4\xd6\x52\x18\x1f\x25\x03\x13\xb7\x9e\x54\x3c\x14\xbb\x96\xee\xb3\x90\xf3\xf7\xc3\xed\x4b\x0c\x2c\x81\xc9\x32\x91\x23\x6d\xd2\x00\xd4\xa1\x6d\xfa\xee\x59\x43\x96\xd1\x5a\x0c\x3c\xab\x78\x5e\xb0\x4c\x87\xac\x95\x02\x71\xbd\x3e\x97\x9a\x95\x4d\x69\x0e\xb5\x61\x78\x85\x90\x66\xa1\xbc\x94\xb2\x6c\xd3\x24\x67\x28\x97\xba\x14\x0c\xce\xbc\x4d\x41\x9c\xc6\xea\x4e\x65\x95\x53\x06\x74\x57\x24\x45\xef\x2d\x54\x17\x5c\xaf\x73\x9a\x77\xf8\x0e\x85\xa7\x8a\x90\x32\x2e\x4f\xe9\xe6\x39\x3d\xe3\x40\x72\xbb\xa4\xf8\xec\x96\xef\x01\x25\x5b\xc1\x15\xd3\x99\xaa\x5b\x46\xa8\x1c\x44\x56\x59\x85\x0c\x9b\xa6\xb1\x74\x20\xb0\xdc\x46\x6f\x8e\x16\x26\x43\xe2\x29\x3f\x33\x14\xcc\x47\x70\x9f\x95\x91\xc0\xa4\x10\x21\xfe\x31\x49\x1e\xbc\x62\x0d\xbf\x8c\xf5\xa5\xe3\x84\xa5\xd7\x98\xac\xb8\x61\xd0\x62\x25\x1d\x3d\xc8\xd8\xc8\x25\x4d\x09\xfd\xc1\x75\xae\x57\x6f\x01\xf4\xd1\x86\x5e\x7e\xa0\xa7\x49\x25\xe7\xb4\x34\x79\xe9\x16\x2d\x45\x63\x10\xaa\xbd\xef\xdf\x49\x3a\xf9\xc6\xf6\x50\xc8\xcc\x89\x84\x34\x1d\xa5\x7d\x46\xc1\xba\x80\xd4\x30\x77\x02\xad\xdd\x8a\xce\x3e\x23\xdf\x29\x24\x31\x91\x6f\x37\xe7\x3a\xa1\x4b\x83\x3d\x63\xc9\xdf\xd8\x68\x97\x26\x87\x28\x5a\xb0\xd4\xc2\x96\xc9\x56\x28\x47\x21\x86\xd8\x41\x87\x44\xa2\xb1\x5b\x70\xf1\x40\x6d\x12\x9a\x8a\x71\x8f\xc9\xa6\xab\x3d\x4b\xee\x2a\x90\x23\x80\xc8\x4a\xaa\x90\xdd\x1c\xe8\x3c\x45\xaf\xc4\x8d\x01\xa7\x45\xa1\x7a\xd4\x39\x1b\x44\x9a\xff\x68\x22\x11\x2d\x88\x42\x35\xfe\x29\x89\x43\xb6\xaa\xf2\xf8\xb7\xcc\x4c\x77\x45\x6d\x97\x9a\xac\x14\x07\xe4\x40\x5b\xf0\xff\x2a\x02\x6d\xe1\x9f\xaa\x80\xd2\x92\xd0\xae\x6f\x98\x29\x93\x96\xcc\xa9\xb2\x69\xcc\x98\x2b\xa5\xa0\xca\x35\x7d\x6f\xd8\xa6\xef\x8d\x49\xa6\xef\x8d\x63\x22\x4e\x08\xc6\x1c\x5b\x4b\x2b\xb5\xd8\x52\xac\xe9\x40\x33\x06\xa1\x6b\x9e\x2b\x5a\xa3\x66\x88\x92\x7a\xdd\x6c\x04\x24\x6a\x27\x18\x39\x63\xc6\x4f\x97\x8a\x11\x44\x4a\xf9\x58\x33\xa1\x16\xad\x05\xd5\x7d\xb4\xf7\xd1\xb7\x72\x52\xf3\x50\xeb\xf8\xa1\xb7\xb5\xbf\xbb\x17\x79\x14\xc4\x3c\xdb\x51\x96\xd9\x5b\x83\x1f\x65\x38\x8f\x88\x7b\x08\x12\x42\x99\x37\x56\x55\x13\x72\x43\x2c\x37\x59\xf3\xd2\x4f\xa0\x62\x3a\x74\x1b\x56\x02\xba\xd7\x6b\xd0\x96\x53\xf8\x02\xd0\x47\x27\x93\x4f\x02\x5b\x4f\x4d\x40\x0e\xfb\xd7\xca\x66\x2b\x02\x5a\x31\x75\x9a\xc3\xb5\x1e\x33\x4d\x40\x83\xb9\x1f\xf2\x8e\x2c\x0b\x42\x32\x19\x89\x5c\x86\x7a\xa4\x62\x25\xa6\x04\x5e\xa4\x73\x9c\xf9\x7c\x59\x9b\xbc\x98\x98\x6d\xca\xc4\x2d\xd5\x47\xa3\x9d\x44\xb3\x49\x80\x63\xb1\x48\x51\x8e\x53\x6c\x24\x3a\x8d\xaa\x63\x50\x08\x9c\xfb\x03\x82\xb6\x4e\xfc\xe4\x89\x5b\x95\x2c\xef\x77\xc8\x08\x35\x2a\x96\x7e\x39\x1e\x86\xa1\xd2\x46\xf8\x09\x68\x53\x99\x64\x15\x27\xfd\x21\x4b\x4e\xf8\x2a\x60\x34\x51\x2b\xed\x91\x02\xc0\xc5\x7d\x6a\x8b\xa6\x38\xd1\x4e\x87\x1e\xe4\xec\xf5\x42\xa9\x7f\x5d\xb5\xfd\xd0\xda\x62\xf7\xb2\xc0\x7f\x84\x52\x2f\xf5\x52\xc4\xa9\x7e\x99\xf1\x16\x85\xe4\x6a\x4c\x9f\xa8\x2e\x68\x41\x4d\x9e\xc4\xe0\x8d\xfd\xe4\x4b\xbe\xa0\xa3\x79\xdd\xf4\xc3\x6e\x51\x53\x80\xfe\x57\x3b\xbf\xee\x6e\x2b\x1e\x2c\xe6\xf8\x85\x0d\x30\x0a\x35\xc9\x6f\x87\x9e\x80\x27\xe9\xa1\x26\xd8\xf9\x44\xd4\xcd\x8a\xf9\x89\xb8\xb7\xc7\x24\x2b\x5c\x67\xa6\xe4\xfa\x26\x21\xc0\xe0\x38\x79\x6b\x57\x31\xa2\xf4\x82\x5d\xc9\x59\xb0\x97\xe9\x90\x84\xb8\xab\xce\xb2\x8c\x38\xa8\xc2\x55\x04\x8c\x4c\xd3\x3e\x2f\x3c\x25\xb5\x0b\xc9\x76\xe2\x8c\xad\x68\x84\x83\xa6\x63\x3a\x5a\xcf\x92\xba\xc1\xc3\x6f\x26\x6f\x71\x61\x36\x89\xba\xed\x7e\x49\xe2\xd6\x14\x2d\x0a\xdd\x44\xb1\x20\x8d\x4c\x1c\xfe\x8c\xc8\x9b\x0a\x7d\x33\xd1\x68\x76\x3f\xb7\x03\xea\x67\x77\x7b\xd1\x2d\xb5\x51\x5a\x47\xe1\x09\xb2\x88\x2c\x23\x9a\xd4\x62\xc3\xe4\x03\xf5\x0d\x1b\xa4\x89\x50\xb3\xe7\x16\xa2\xa5\x70\x41\xd1\x7c\x81\xb7\x91\x59\x74\xab\xf6\xa2\xab\xd7\xc9\x17\x0a\x41\x98\x41\xd1\x08\x17\x05\xe2\x44\x29\x44\x43\x3c\x62\x4b\x93\x0c\x46\x46\xa8\xc3\x27\xee\x97\x4f\x1f\x48\xc7\x8f\x29\x23\xbf\x0f\x7d\xf7\x3c\x18\x4b\x80\x4e\x87\x6f\x60\xee\xd6\x2e\x6c\x45\x67\xb4\x13\x61\x50\x66\xa1\x18\xec\x04\x43\xd6\xa3\xac\x4a\xd0\x94\x7f\x14\x0d\x03\x8f\x78\xd1\xf0\x2c\xa0\x24\x89\xfd\x6e\x97\xef\x7e\x12\x96\xde\x66\x8d\xe5\x61\x9e\x78\x37\x94\x90\x47\xf5\x90\x0e\x41\x09\xdf\xe3\x90\xd1\xdc\x82\x84\xd4\xa5\x8c\x39\xf1\x18\x2f\x58\x13\x75\x11\x81\xa6\xe6\xb1\xe3\x82\xfa\xcc\x43\xf5\x01\xdc\xfa\x4a\x60\x52\xbe\x51\x38\x65\xe9\x2b\x5c\x3f\x24\x09\x85\x90\x23\x55\xc2\x22\x29\x65\xf6\x9d\x73\x4a\xd8\x10\xc6\xee\x24\x12\x1a\xde\x53\x0a\x8a\x23\x4e\x38\x56\xe8\xce\x6b\x07\x30\x39\xa2\xb2\x31\x14\x51\x5d\x4d\x3f\x52\x00\xb3\x48\x57\xcd\xfd\xfa\x5c\x56\x48\x33\x68\xa4\x90\x4d\xac\x66\x50\x6c\x88\xd5\x6e\x4a\x1e\xbe\x71\xe9\xa5\xba\x67\x51\x6f\x51\xcf\xd3\x54\xbb\x96\xdd\x2a\x1c\x17\x6e\xe1\x37\xf4\xa3\xda\xfc\x25\x66\xf8\xa9\xb8\x50\x0a\x64\xb9\xb2\x11\x88\xc9\x82\x14\x58\x71\x60\xb1\x18\xd3\x5a\xfe\xfa\x55\x85\x14\x6e\xb0\xa9\x94\xe4\x5d\xd4\x49\xc1\x29\xd2\x7e\xfc\xe7\x8a\x3b\x74\x6d\x3b\x4e\xce\x40\xbc\x61\x46\x52\xfc\xdd\x6c\x78\x22\xeb\xaf\x92\x9e\x13\x7a\x81\x16\x0c\x73\xc9\x4f\x96\x31\x4f\x71\xc6\xf6\x4f\xd2\x67\x0f\xc7\xf3\xb6\x43\xef\xbd\xcf\x12\x1a\xda\xea\xd0\xc2\x42\xb2\x5b\xe9\x71\xe7\x07\x91\xb3\x8f\xf7\x66\x03\x4c\x49\x0f\x59\x1e\xaf\x46\x9d\x7f\x80\x92\x40\x26\x83\x68\x4c\x77\xfc\xc1\x7b\xae\xec\x6b\x75\xeb\x40\xce\xac\xd3\xb2\x79\x36\x5b\x57\x88\x9e\xac\xaf\xcb\xf1\xed\xab\x97\xd9\x24\xe7\xd5\xc6\xeb\xf1\x13\x3b\x6e\x76\xaa\xcc\x2d\x22\xb8\x4a\x08\x25\x19\xb9\xb7\x5e\x17\x6e\x91\x51\x49\x0e\xdb\x0e\x60\x2b\x41\xfe\x8f\x7d\xc5\xb7\x22\x46\x6b\x35\x5f\x08\x50\xd9\x1c\x53\xcd\x5e\x54\xc6\x3a\xf9\x16\x15\x32\x15\x34\xd9\x5c\x3a\x09\x3e\x9d\x00\x56\xa9\xa2\x0a\x5a\xb5\x68\xbe\xa8\x54\x34\x79\x7c\xfa\x20\x73\x43\x09\xea\x4d\x28\x30\x61\x10\x4a\x96\x9c\x5c\x00\xec\xb4\xd5\x92\x14\x26\x8c\x8a\xac\x36\x36\x48\x49\xd2\x7e\x29\x43\xb0\xb2\x9c\x20\xef\xaa\x01\xbd\x92\x21\x64\xb4\x89\x90\xaa\x19\xad\x97\xd9\x94\x91\xde\xa3\x30\x18\x2b\x27\x04\x15\xfb\x3a\x23\x55\xc7\x74\x20\x20\xbd\x07\xa4\xda\xbe\xb6\x42\xf3\xa9\xc5\x0d\xfe\xb1\xd3\x3d\x30\x2f\x26\x0d\x3e\x20\x54\x0a\xa6\x53\xb9\xcc\xc5\x87\x32\xe4\x56\x01\xdb\xd6\x2d\x10\xc6\x35\xca\x44\x38\x8a\xc1\xa4\x72\x38\xa7\x41\xb7\x5e\x73\x36\x87\x32\xdd\xd4\x70\x11\xaa\x46\xc3\x8b\xda\xde\xfe\xd6\xf6\xc9\xf6\xde\x2f\x68\x1c\x3a\x88\x23\x6f\x28\xcc\x43\x5f\xe0\x83\xd0\x85\x05\x8e\xd6\x05\xd2\x26\xa7\xb2\xc5\x53\x69\xad\x82\xe6\x1d\x60\xd3\xc6\xa5\x4a\xea\x78\x78\x61\x09\x17\xa5\x84\x22\xb6\x6b\x58\x1f\x04\x39\xd5\x67\x9f\x09\xa3\x59\xb4\xca\x83\x2b\xcf\x7c\x03\x8a\x21\xc3\xfa\x65\x7d\x6b\x5e\xd5\x36\x87\x55\x6d\x53\x58\x55\x16\x8e\x55\xd3\x2c\xb2\x22\xa5\x53\xb0\x88\x61\xd4\x43\x70\x49\x44\x20\xaa\x80\xba\x69\x65\x03\xea\xfa\x1d\xdf\x15\x2c\xcb\xb6\x37\xc3\x31\x60\x4d\x69\x37\xc1\x7f\x9b\x66\x0a\xca\x26\xa1\xb9\xd6\xb8\xfe\x19\xf3\xa5\xe1\xd3\x90\x49\xcb\x27\x22\x0d\x0c\x76\xc7\x8a\x88\xb4\xc7\xae\x8d\xab\x53\x30\x52\xe2\xff\x5b\xfa\xe7\x15\x56\xbd\x3e\x45\x13\x07\xac\x5a\xb9\x16\x4d\xdb\xc6\x49\x44\x5a\x27\x10\xb2\x50\x9f\xd3\x7c\xde\xa2\x37\xed\x94\x4f\x27\xf2\x29\xa9\xf9\x4c\x58\xf1\x7b\x55\xa3\xbc\x9c\x40\x9d\x7b\x5c\x31\x8b\xce\x99\xf4\x71\xd0\x8b\x46\xb6\xe9\xc3\xba\x3c\x03\x80\x9d\x8d\x50\x86\x09\x4b\x3d\x61\x2e\xa4\xba\xeb\x5b\x1d\x45\x0f\x84\x26\xf4\x94\xf1\x63\xca\x5a\x8a\x93\x93\x98\x6f\xe2\xf7\xfb\xd4\xf3\x9d\x84\x06\x63\xe2\x40\xcc\x7b\x79\x02\x58\x80\xaa\x78\xfb\x5d\x60\xad\x55\x23\x3b\x1d\x30\x9f\x1a\x39\x21\x68\x17\xe6\x03\xe7\x8f\x31\xc2\x9e\x4f\x19\x76\x44\x21\x9a\x0f\x71\xc0\x18\x7d\xff\x14\x2c\x55\xe2\x21\xbd\x3e\x55\x36\x58\x8c\x26\xe4\xd4\xdc\xbd\x4e\x6b\xa4\xdd\x91\xa6\x99\x58\x0f\x31\x63\xd0\x7d\x9e\x05\x49\xe2\x8c\xb1\x2d\x31\xd0\x2a\xe1\x92\x29\xef\xc5\x3c\x92\xfd\x7c\x95\x0c\xc3\x80\x32\xb4\x9a\x75\x02\x16\x09\x9a\x1e\x93\x53\x6b\x6b\x3c\xad\x29\xb4\x9b\x1d\xbb\xd3\x04\xf0\xee\xe9\x39\xc0\xc3\x0e\x98\x96\x3a\x68\x94\x82\x66\x2f\xc2\x56\x04\x27\x5f\xf0\x85\x03\x8e\x20\xbb\x7f\x7c\x63\x19\x47\xc3\x92\x47\x06\x31\xed\x70\xd4\x44\xf2\xd8\x94\x42\x8d\x6a\xa8\xe3\x87\x3e\x3f\x8a\x12\xc1\x0d\xf4\x10\x2d\xd0\x93\xc7\xb8\x17\xc5\x7d\x34\xa5\xb0\x49\x2b\x8c\x4c\xae\xc4\x69\xac\xc3\xdb\xc4\x83\xe9\x28\x44\x43\x1c\x18\xa2\xc1\x0f\x7e\x36\x8d\x00\xa1\x0b\x4c\x8c\x38\x45\x62\xc6\xbc\x8b\xa9\x47\xaa\xc0\xf1\x02\xfd\xa0\xd0\x82\x16\x37\x60\xcd\x56\x95\xe6\x61\x08\x31\x45\x2b\x89\x69\x3b\x45\x1c\x46\x58\x14\xc1\xdf\x9c\x3e\x9a\x3d\x43\x60\x3f\x93\xbd\x28\xa1\x2d\xe3\x60\x1d\x46\x9a\x3b\xce\x63\x5f\xe6\x95\xe5\xae\xea\x1c\x98\x0e\x3b\x9e\xc7\xcf\xd4\x60\x56\xc8\x5b\x70\x02\x72\x0a\xe4\x7d\x6a\xf4\x4a\x4f\x8e\xbc\xf9\x9a\x34\x2b\xdb\x21\x04\x05\x8b\x62\xe2\xf9\x0c\x7e\xa6\xd7\x0b\xd3\x00\xe9\xcd\x94\x9c\x03\x8f\x33\xa4\x7c\x70\x37\xd2\xcc\xe1\x44\x2b\xbe\x2a\x9f\x80\xbe\x1f\x04\x3e\xa3\x6e\x14\x7a\x92\x04\x24\x0b\x95\x2b\xf6\x94\x0b\x88\xfc\xa0\x29\x45\x44\xb0\xd3\x1a\xc4\xd1\x85\xef\x89\x1d\x0b\x2b\x7e\x8d\x86\xa4\xef\x8c\xd5\xca\x76\x08\xf3\x21\x1e\xb7\x3c\x1a\x71\x51\xdb\xb1\x68\x80\x91\xc0\x3f\xa7\x2d\x65\x39\x86\x46\x73\xa7\x55\x04\x08\x0a\x21\xcf\xbf\xf0\xbd\x21\x90\x3e\x94\x2d\xd8\xed\x14\x80\x2b\xb1\x19\x09\x6c\xaf\x34\x1a\x55\x99\x02\x08\x5b\x53\x09\xd7\xd7\xf6\xd6\x84\x5f\xff\x82\xb7\x1e\x57\x22\x90\xec\x77\x72\x85\x90\x5e\xb4\x88\x74\xdf\xca\xe1\xa8\x4f\x09\x85\xcf\x88\xe8\x83\x29\xfe\x88\x33\xdb\xc0\x34\xad\x50\xcf\xaa\x4e\x02\x38\xeb\xa4\xef\x3d\x21\x8e\x10\x53\xee\x95\xa1\xd4\xcf\xa4\x49\x5e\x60\x85\x25\xd2\x24\x2d\xd2\xa8\x54\xc9\xc9\x39\x38\x45\x68\xae\xe3\xaf\x9f\x20\x1f\x3f\xc0\xeb\xb2\x3c\xda\xc7\x5d\x76\x04\x25\x96\x48\xf3\xd8\xf2\x4f\x7d\x02\xcf\xca\xd2\xb2\xed\x00\xde\x1f\x6a\xca\x92\x2a\xd9\x83\x9e\x33\xa0\xfa\x14\xf8\x28\xff\x60\x0d\xb5\x07\xe6\xce\x6c\x09\xbf\x83\x44\x84\x4c\x52\xb7\xb8\x55\x72\x04\x90\x94\x53\x29\xde\x61\xe1\x85\xcd\x26\x68\x78\xdb\x4a\xdc\x21\x4b\xa2\xbe\xc9\x49\x28\x67\x38\xb8\x9f\xd7\xc8\x66\x4a\x76\xd3\xe5\xe0\x31\x34\x87\xb3\xb5\xbf\x8b\x57\xab\x9c\x53\x39\xe4\xd4\x8b\x42\x7a\xaa\xd4\x2a\x35\xd2\xd6\x46\x3f\xfd\x28\xe6\x4c\x2f\xa4\xa4\x1b\x3b\x70\xe7\x6c\xb7\x8b\x00\x83\xa8\xeb\xbb\x35\xb2\xb0\x00\xec\x69\x61\x81\x28\x73\x05\xce\xa3\x58\xc2\x39\x1f\x88\xa2\xf8\x5e\x4c\x6a\x76\xfc\x8e\x5a\x47\x45\x52\x9c\x8d\xdd\x8d\x2b\xa1\x93\xe0\x3d\x96\xa6\xae\x28\x7b\xd5\xeb\xbc\x05\xdc\x83\x18\x33\xf7\x84\xd0\x83\xed\x18\x18\x7a\xdf\x89\xcf\x05\x1f\xe7\x9b\x12\x8a\xc4\xb6\xf6\x93\x03\xe3\x8d\xd4\xd2\xeb\xbe\x5c\xb2\x80\x96\xb0\x17\x55\xd4\x18\xe1\x09\x27\xbb\xa8\x80\x93\x5a\x63\x30\x79\x16\x3a\x85\x36\xa7\x58\x69\xbd\x3a\xc0\x83\x0c\xb5\xee\xbc\x94\xb1\xe7\xa5\x8e\xc2\x87\xbb\xc6\xc0\xa7\x5e\x8d\xb4\x43\x42\x2f\x93\xd8\x21\xe0\xb4\x86\x26\x34\x16\xfd\xf0\x59\x5b\xde\x3f\x01\xe3\x62\x43\xac\x22\x1c\x74\xf9\x2e\x98\x6a\x77\x0c\x31\x10\x2d\x98\x7d\x46\x22\x97\xcb\xfd\xf0\x7a\x06\x37\x3f\x61\xc3\x86\x1b\x53\x86\x67\x48\x0f\x8e\x30\x45\x2d\xf2\x26\xe9\x07\xe2\x50\x57\x25\x46\x2f\x5a\x84\x73\xea\x0a\x59\xfa\x19\x2c\x49\x14\x96\xa2\xac\xa8\x73\x23\x7a\x1c\x25\xad\xfd\x87\x61\x27\x8d\x15\xc8\xb9\x03\x62\xa8\xf7\x9f\x81\x97\x22\xaa\xa1\xde\xec\xcb\x0a\xa5\xd2\x3c\xfc\xdc\xa2\xb3\xb9\x3d\x4b\x49\x28\xb7\x9a\xb5\x1f\xda\xab\xbb\x90\x13\x1e\x68\x7e\x4c\xbf\xb2\xd3\x38\x77\x4d\x5a\xe4\xea\x7a\x1d\x7c\x3b\xec\xa1\x41\x3c\x35\xae\x36\x22\x21\xed\xbb\x01\x75\x62\x7e\xde\x40\x9a\xf3\x22\x17\xb6\x78\x90\xfd\xf4\xeb\xdc\x30\x8a\x84\x0e\xc6\xd4\xbf\xe4\x78\x93\x57\xaf\x2d\xaa\x99\x93\x98\x4a\x4e\x9d\x5e\x54\xba\x14\x9c\x55\x82\x10\xc5\xe0\x31\xab\x12\x5c\xf1\xcb\xe4\x7b\xbc\x73\xd5\xd4\x92\x4f\xa5\x71\xfc\x60\x92\x41\x60\x46\x19\x39\xb5\x76\x92\xac\x05\x8a\x27\x63\xdc\xe6\x63\xd5\x86\xa5\xe8\x52\x0f\x53\x9b\x76\xb2\x7e\x85\xba\x9c\xcd\x80\x0a\x2b\x19\x38\x58\x7e\x35\xd7\xf5\x9c\xa9\xc9\x9b\xe0\x11\xe3\x1a\xcd\xf9\x27\xb9\xd8\x28\xaf\x54\x2a\x95\xb4\xc3\x8e\xa7\x77\x72\xd8\xc1\x45\xc1\x33\x87\xd1\xd7\x34\x39\x74\xba\x45\xe1\x68\x56\x84\xa7\x6a\xe9\xe4\xf7\xbd\x7f\x5e\xe4\xbd\x70\x75\x55\xf8\xd9\x24\xa7\x58\xf6\x7f\x25\x11\xba\x98\x39\x25\x31\x65\x1c\x25\xb1\x7c\xf0\xce\x6a\xbc\xef\x70\x21\x31\xee\x9f\x45\x01\xf6\xa0\x74\x84\x7a\x49\x72\x00\x89\xc7\xc6\x63\x5d\x78\x4c\xc1\x38\x4f\x3e\x85\x07\x29\xa7\xb8\x2a\x1c\xc6\xfc\x8e\x2f\x25\xaf\x53\xac\x77\x4a\x06\xb1\xdf\xf7\xe1\xc6\x2b\x8a\x85\x7f\x4e\xe5\xf6\x0e\xc3\x1d\xc3\xcf\x3e\xe5\x32\xfe\x7e\x87\x9c\x60\x8e\x1f\xba\x94\xac\xd6\x1a\xb5\x06\x7c\xf3\x5d\xa0\x1b\xc5\x63\xf2\xde\x01\x3f\x3b\xca\x65\xde\xc2\xb5\x78\x15\x73\xa8\xde\xc7\x24\x11\x7a\x38\xab\x19\x3e\xf2\x18\xb9\xe2\x5c\x9d\x3a\xe1\x35\xf9\x24\x52\xc4\x93\x30\x7b\x1c\x8e\xc0\x42\x15\x6f\x85\xc4\x23\x19\x04\x25\x9e\x4e\x89\xde\x9f\xd4\x7c\x86\x83\x2c\xe3\x9f\x9a\x9f\xd0\xd8\x81\xc8\xd3\x3c\x1f\x3d\xd8\xf0\x36\xb2\x15\x4a\xce\x99\x5b\x32\x8b\x41\x33\xf0\x78\xc6\x50\x8e\x8a\xc2\x22\x6a\x83\xe1\xa1\x51\xa8\xdb\x85\x37\xfe\x0d\x52\xc2\x3e\x97\xc8\xf7\xef\x40\x21\x65\x93\x44\x64\xfd\xc7\x8f\x0d\x1a\x93\x89\x1b\x1b\x7a\xd6\xd1\xa7\x79\xc6\x4d\xa0\xec\x47\xd6\x6f\xe7\xb3\x7b\xf5\xdb\x99\x1f\xe7\x5b\x81\x99\xd7\xbe\x43\xe6\xab\x3a\x0e\x07\xb2\xb7\xb9\xeb\x8a\x76\x4e\x03\x4a\x7e\x79\x3b\xf0\xc5\x4f\x7a\x9b\x46\x70\xd5\xe2\x4c\x0d\xc0\x67\xbb\x43\x5f\xec\x1f\x80\x00\xfd\x99\x2a\xa4\x95\xb7\xa2\x98\x4a\xb8\x95\x93\x99\x33\xe7\x8c\x06\x1f\x82\x61\xd7\x0f\x5f\x05\xd1\x08\x14\xe7\x6a\x73\x82\x1b\x36\x3e\xe3\x27\x7b\xc2\x46\x35\x17\x54\xed\x36\x40\xc0\x55\x7a\x9e\x47\x9d\x9a\x13\x8e\x81\x41\x52\x16\xf8\x61\xb2\x24\x95\x23\xf8\x80\xba\x8e\x9a\xb8\x25\xc1\x56\x97\x94\xef\x5f\xc3\x2d\x45\x31\x82\x0d\x47\xd1\x3a\xea\xac\x49\xd6\x88\x2c\x7d\xb1\xd3\x77\x06\x46\x9d\x94\x37\xe9\xd4\xdb\x12\x70\x52\x8a\xf5\x6d\xef\xf0\x15\x59\xfc\xf1\x63\xb3\x90\x79\x13\x94\x71\x24\x6d\xc4\xce\x80\x1c\x71\x67\x6d\xbb\x55\x29\x97\x54\xb1\x12\x38\xea\x30\x4a\xea\x70\xbe\x8b\xa4\x44\x4a\x64\xd1\x08\xf0\xdb\xd2\xbf\xe7\x88\xe5\x85\xda\xf4\xee\x61\x12\x5d\x99\x4a\x31\xb5\x3f\xf4\x79\x3d\x66\xa1\x6d\xc2\xd0\xa9\x14\x82\x1e\x3f\x56\x75\x95\x3b\x19\xa9\xd8\x87\x1b\x6b\x91\x5b\x81\x1b\xa0\xa5\x66\x4e\x67\x14\x69\xdf\xd0\x9d\xc2\x76\xf2\x9a\xb0\x19\xca\xf3\xbf\xd2\xed\xd5\xbd\xf1\x1f\x26\x5f\xe5\x67\x3c\x5a\xd9\xb0\x97\x0b\xd6\xf2\xd3\x4a\x7e\xf9\x95\x09\x8e\xa2\x52\x90\x15\x04\xe1\x9e\xbf\xa8\xa9\xd5\x74\xc1\x49\x6d\x48\x58\xaa\x4e\x81\x4d\x40\x51\x63\x6b\x37\x55\x9c\xd4\x78\x51\x5b\x86\x3b\xad\xce\x3a\x97\xdc\xff\x25\x9e\x92\x52\x4f\x33\xe7\x0f\xce\x80\xc6\x3f\xd2\xeb\x97\x0e\xb6\x5d\xe4\x97\x2b\xa7\xe8\x24\xf0\xba\x94\xaa\x38\xf2\x93\x9e\x72\xf8\x90\xd7\xc6\x93\x9c\xa2\x93\xda\xd0\xa5\xb4\x7b\x31\x8e\xa8\xa2\xe9\x5b\xb5\x8b\x4d\x02\x0d\x05\x54\xf1\x83\x84\x0e\x36\xa3\x30\xa4\x6e\x12\x15\x41\x7f\xb2\xdc\xc8\x2f\x3f\xa9\x19\xab\xa0\x55\xbd\x28\xc6\x6c\xe3\x89\x55\xec\x26\xe0\x7f\x9a\x07\xef\x29\x37\x6f\xb9\x35\x82\xbe\xfa\xce\xa2\x80\x0d\xed\x06\x99\xe0\x6f\x29\xa8\xdc\xa6\x53\x5a\xa0\xbb\x5b\xbf\x24\x9c\x69\xba\xa6\xb6\x82\xcc\xde\xa0\xf5\x0a\x90\x52\x4e\x7a\x34\x25\x0d\x09\xf1\x26\x8a\x92\x96\x8e\x70\x81\xce\xd3\x5b\xa4\xd4\x09\xe8\x65\x49\x1a\x6b\x0d\xd0\x7f\x07\xdc\xd6\xf5\x69\x8d\x0d\x1c\xd7\x0f\xbb\xb5\x61\xe8\x27\x64\x81\xac\xa0\x98\x81\x85\x7b\x51\xec\xff\x11\x85\x89\x13\x68\xa8\x1c\xd6\x96\x1f\x53\xe8\x50\x8b\x94\xe2\x68\xa4\x40\x3b\x81\xdf\x0d\x77\x12\xda\x67\x2d\x52\x72\xa9\x70\xc7\xa9\xe1\x5d\x70\x3e\xec\x4e\x82\xe6\x46\xc1\xb0\x1f\x8a\x4a\x68\x60\x73\x7d\xbb\x99\xdb\x8f\x7d\xa9\x60\x29\x74\x05\x89\x66\x0d\xe5\xa3\x92\x1e\x20\x04\x7e\x13\xdd\xc3\xd8\x6e\xb7\x68\xd3\x54\xd1\x68\xeb\x06\x8a\x57\xcf\xc2\x84\x93\x71\x46\x53\xfe\x83\xc6\x11\x9c\xac\x3c\x11\xdf\xc4\xb8\xd8\x84\x72\x9c\x91\xb4\x8a\xba\x2d\x63\xc9\x9b\xcd\xec\x74\xe0\xc2\x37\x89\x48\x89\x0b\x17\x25\xb8\x3c\x89\x0c\x24\xf8\xcc\x98\xc7\xaa\xb2\x6a\x08\x85\x51\x36\x1d\x88\x00\x42\x70\x0f\x7c\x46\xc9\x20\x52\x97\xd6\x43\x30\x4c\x04\x65\xa9\x6b\xdd\xc1\x06\x09\x8d\x43\x70\x84\x05\xb1\x3a\x0a\x3b\x9c\x73\xf9\x39\x8a\x88\xbc\xbf\x39\xfd\x09\xb8\x6f\xdd\xbc\xf7\x36\x6e\x52\xb5\x3d\x8a\x38\xc2\xce\xc6\xf7\x2c\xeb\x32\xf2\x62\x26\x28\xc6\xad\xd9\x3d\x40\x68\xcd\x36\x92\x42\x2c\xb3\x9e\x33\xa0\xe5\x59\x60\x16\xdb\xe6\x7c\x66\xb4\x33\x0c\x38\x59\xa1\x24\x27\xa8\x65\x1c\x50\xa9\x58\x05\xd5\x49\xde\xb4\xa1\x37\xa0\xc2\xde\x8a\xb0\x2b\x56\x6b\xff\xf2\xbb\x61\x14\x53\x1b\x06\x9e\xa9\x8a\xc6\x8c\xf1\x3e\xed\x7b\x48\xc3\xaa\x21\x89\x80\x96\x03\xc7\x05\xbd\x7a\x32\xa2\x34\x24\xd4\x71\x7b\x40\xf2\x46\x6f\xa5\x44\x50\xdc\x5f\x6d\x02\x75\x3b\x3a\x54\x7b\xc8\x8c\x14\x28\xeb\xdf\xcf\xbc\xcb\x63\x5e\xf5\x96\xab\x09\xb7\xe7\x19\x87\x00\x95\xef\xa7\xff\x1c\x54\xe5\xb8\x92\xcf\xfc\x7a\x94\x9c\x72\x5e\x32\xa0\xf1\x29\x32\x32\xf0\x67\xc7\x98\xcf\x12\x74\xce\x0c\x1e\xc5\x03\xf4\x5b\x45\x85\x7d\x71\xe0\x87\xd4\x89\x09\x84\xf9\x50\x04\x11\x46\xe1\x7b\x48\xbf\x0d\x53\x13\x9c\x74\x00\xd6\x6a\x9a\xf5\x96\x03\x67\x0c\x16\x16\x41\x34\x22\x9e\xdc\xe6\x0c\x9e\x6f\x14\x9e\x4c\x7f\x93\xf6\x2a\x34\xdc\x54\x32\x82\xc0\x43\x3a\x1c\xab\xde\x5e\x54\xb0\x54\x9d\xa4\x37\x70\x9b\xb1\xeb\xa2\xa9\x8c\xaa\xa9\xfc\x50\x81\x0c\x85\x2e\x83\xb2\x6a\x5a\x37\x02\x1e\xe1\xac\x42\x3c\x55\x15\x33\xe2\x93\xe5\x1a\x98\xab\x55\x6a\xc3\x91\xa9\xb2\x98\x9a\x3b\x55\x44\xa5\xa8\x78\xb0\x96\x78\x20\x5e\x9a\xe9\x34\x2b\x6c\x2c\xd9\x40\x75\x49\xd1\x09\x54\xc7\xb5\x51\x76\xed\x1a\xa5\x7c\x92\xd2\x58\xc3\x08\xb2\x80\x21\xf5\x13\x54\x42\xfc\x43\x5a\xc4\x57\xc1\x01\x3e\x0e\x8c\x7f\xa8\x21\xf0\x0f\xa3\xab\x28\xa5\xc8\x08\x6f\x86\xd6\x12\xfa\x6c\x9c\x1c\x75\x37\x45\xdb\x35\x2e\x27\x56\xed\xc9\xa9\x66\xe7\xfe\x05\x3a\x44\x68\xc9\x49\x3e\x32\x1a\x17\xd1\x6f\x31\x18\x86\x3e\xac\xd9\xf3\xf4\xe2\x06\x93\x6a\xb3\x70\x95\x5c\xd9\xab\xc1\x9c\xa8\xeb\x0a\x69\xa9\x87\x0b\x66\x40\x3b\x75\xb4\x49\x29\x03\x93\x08\x8d\x74\x2c\x43\x6f\x94\xb1\x29\x48\x6a\x16\x80\x54\xfc\x39\x5e\x26\x15\x7e\x4e\x8c\x93\xf3\x10\x53\xd6\x23\x05\x21\x50\x8b\x06\xa2\x96\x19\x50\x89\x71\x15\x87\x34\x8e\xee\xd8\xbc\x54\xba\xd0\xaa\xa6\x93\x03\x87\x25\xa2\x59\xb2\x48\x9a\xc0\xa2\xed\x51\x09\xb3\xa5\x82\xa5\xdd\xca\xa4\x64\x16\x5b\xcb\x9e\x4f\x14\xca\x0d\x43\x7e\x93\xa5\x6c\x6c\xa4\x43\x00\x9b\xf8\xaa\xa5\xde\x6b\x11\xdb\x17\xc1\x23\xbd\x70\x1f\x3f\x36\x39\xd5\xcf\x13\x81\x2a\x8c\xdd\x1a\xee\x4f\x13\xe1\x4a\x8c\xdb\x60\xad\x47\x57\x47\x8f\x32\xcb\xe5\xf1\x63\x63\x29\x3c\x7e\x2c\xa6\x46\x38\xcb\x98\x6e\x21\x68\xa5\x32\xc6\x22\x14\x19\x10\x89\xb0\x8c\xf0\x96\x48\x13\xe2\x66\x2d\x25\x91\x0e\x50\x48\xea\xf5\x94\x0e\x7e\x89\xef\x6d\x60\x4b\x9b\xd4\xc3\x48\xc4\xb0\x83\xb2\x4b\xe7\x74\x2c\x54\xc9\xd5\xc9\xdd\xc2\x75\x00\xdc\x44\x2a\xfc\x34\x2b\xb9\xba\xae\x5a\x48\xab\xa2\x5c\x85\x9b\x4e\xe5\x58\x6a\xa9\xd3\xfa\x7a\xa3\xa9\x9c\x70\xd6\xa8\x2a\x92\x45\x90\x1e\x8b\xda\x27\xec\xf7\xa1\x13\x2b\x67\xcc\x34\xa0\x17\x62\xc1\x35\xaa\x96\x4e\x5e\x71\xc6\x6b\x11\xc1\x58\xdc\x8c\x02\x2b\x50\xd1\x79\xc5\xae\x39\xd3\xa3\x87\xb2\xf0\xc8\x74\x75\x9b\x53\x9c\x25\x79\xdf\xf2\x48\x95\xaa\x3b\x9d\xc4\x9d\xae\xa4\x57\xf9\x5f\x22\xd6\xce\x74\xa4\xca\xa9\x3b\xf5\x61\xea\xc7\x88\xd3\x29\xac\x4e\x27\x3d\xa6\x2a\xdd\x8b\x14\x68\xc0\x9c\xbb\x16\xcb\x36\x75\x25\xa0\x57\x0f\x27\x58\x2e\x9f\x98\xd2\xca\x44\x6a\xad\x4c\x0b\x31\x2b\xf1\x4c\xc0\xc3\xb4\x50\x0d\xd9\xe8\x41\x15\xf0\x27\xa8\x02\xa6\x9e\x17\x25\xcb\x4e\xe4\x3c\xb7\x02\x27\xe4\xe1\x89\xc7\xfe\xa9\x01\x1a\x72\xf4\xc3\xe9\xfe\x7f\xc0\xe9\x7e\xda\x89\x35\xcf\x44\xf7\xc0\x5f\xcc\x53\xd5\x64\x4a\x99\xc4\x81\x51\x9e\xea\x54\x84\x65\xa0\x94\x28\x72\xcc\xf8\x4c\x21\xa1\x91\xbf\xfb\x2b\x59\xdf\x54\x50\x4d\x14\xa1\x52\x37\x61\x4a\x8a\xc2\x77\xef\xa9\xcd\x49\x81\xb7\xf6\x1e\x73\x6c\xa0\x55\x90\x63\x10\xb7\xf1\x64\x83\x94\x44\x52\x29\xd7\x70\x0e\xb0\x6d\x5c\x28\x6a\x4c\xe3\xcd\x45\xa5\x2c\xaa\x57\x7e\x84\x61\xdd\xb3\xc6\xd4\x21\x61\x65\x24\x09\x9f\xa5\xc3\xb2\xea\xd7\x54\xf2\x3d\x06\xbe\x4a\x03\xaf\x9c\x2c\xcf\x1a\x0d\xcd\xcf\x1a\xb5\xa6\x30\x3f\x4b\x59\xa7\x29\x6b\xb4\xcf\x89\x1f\xe4\x5a\xa3\xb5\xc3\x31\xfe\x4a\x19\xa1\x2d\x18\xe6\x67\x68\x74\x96\x67\x5a\xc6\xcf\xa6\x91\x8c\x43\x7d\x45\x4a\x4e\x09\xfc\xf4\x9b\x1e\xfa\xa3\x80\xd6\x82\xa8\x5b\x3e\xa9\xf9\x1e\x0d\x13\x3f\x19\x97\x05\x67\x86\xb5\x2f\x7e\x67\x0d\xd1\x4c\x03\x33\x59\x31\x6b\x60\x06\x29\x05\xe6\x60\xa2\x56\xc6\x1c\xec\x59\x73\xd2\x54\xe5\x04\x07\xbf\x85\x25\xc7\x6c\x41\xc7\x55\x27\x9c\x2a\x39\xb3\xc6\xe7\x90\x9f\xc8\x19\x79\x41\x96\x9a\xa4\x45\x1c\xf2\x33\x7c\x88\xdf\x1b\xf0\xd1\x20\x2d\xb2\xe7\xec\xad\x83\x65\x47\x7a\xa4\x13\x43\x96\xdf\xcf\x48\x45\xc4\x8a\x85\x3a\x3a\x73\x28\x8c\x8e\xdf\x90\xd1\xf1\x27\x98\x34\xdc\x05\xec\x89\xe6\x04\x39\xe0\x6b\xe1\x84\xc0\xfd\x0a\xc6\x6c\x5d\x68\xc2\x56\x72\x92\xc0\xae\x52\x34\xbc\xc6\x7d\xc0\xbe\xc3\x18\x6d\x40\xb3\x75\x66\xd9\xd0\xec\x15\x0e\x74\xf9\x3e\x60\xdf\x61\xa0\x36\xa0\xd9\x3a\xb3\x22\x08\x82\xf5\xa3\x28\xe9\x15\x0e\x75\x65\xf5\x7e\xc0\xdf\x61\xb4\x69\x50\xb3\x75\x68\xf5\xe4\x64\x98\xf8\xc1\xc9\x87\x61\x4c\x3f\x81\xff\x97\xe2\x65\xba\x36\x5b\x13\x6b\xa2\x09\x10\xc2\xf8\x6e\x54\x4c\x41\xcd\x95\xca\xba\x65\xeb\xa5\xc3\x6c\x39\x8c\xf9\xdd\x90\x7c\xff\x6e\x18\x59\x62\xfc\x37\x2b\xda\x9e\x11\x30\x34\xfd\x92\x52\x84\xff\xc4\xd0\x76\x0c\x42\xb3\x5b\xcf\x1f\xfd\xe3\xf5\x4c\xd4\x3e\x2c\x76\xab\xc0\x7d\x58\x45\xc6\xee\xbb\x92\x11\xec\x44\xf4\x3e\xcc\x35\x02\xf8\x65\x83\xd9\x29\x2b\x2c\x90\xb3\x30\xa4\x58\xca\x4d\x93\xfe\xb2\x64\x4c\x9f\x32\x81\x13\xe1\xe7\x3f\x83\x1a\x11\x0b\x15\x2f\x20\x72\xd0\x82\xd1\x9e\x06\xa8\x56\x87\x52\x80\x16\x9d\x5c\xd3\x11\xca\xc8\x46\x41\x3a\x9f\x23\xf0\x1b\x65\xe6\x9b\x61\xcb\xa4\x86\x13\x90\x3a\x0f\x1b\xf9\x3c\xc7\xb6\x2e\x5e\x31\xab\xca\x08\x68\xaa\x5a\xbe\x19\xa4\x1c\xb9\x51\xf3\x9c\x8e\xcd\x6f\x8c\xc8\xa7\x82\x80\x2b\x8c\x1a\x71\x14\x00\x71\x49\xa4\x94\x8b\x5c\xdc\x92\xae\xd0\xa5\x8f\x7d\x91\x5d\xc9\x22\xdf\x00\x64\xc6\x7d\x33\xea\xac\x2b\x97\x49\x0a\xee\x24\x28\x76\x17\x54\x60\x47\xa3\xc4\x3a\x58\x68\x95\x6d\xdb\x3d\x79\x13\xb3\x5c\x25\x27\x09\xed\x0f\x96\xd7\x1f\x22\x24\x3e\x44\x48\x7c\x88\x90\xf8\x97\x45\x48\x14\x27\xbf\x7f\x75\xfc\x80\xee\x5f\xd0\xf8\xc2\x07\x6a\x75\x13\x27\xec\x06\x78\xe6\x11\xff\xf8\x22\xee\xd2\x44\xe4\xd1\x0f\x4e\xd2\x4b\x79\xb9\x37\xb3\xca\x97\x55\x32\xae\x92\x91\xef\x25\xbd\x2a\xe9\x51\xbf\xdb\x4b\xaa\x24\x76\x3c\x7f\x68\x5c\xc2\xf7\x9d\xcb\x4f\x90\x44\x36\xc8\xae\x93\xf4\x6a\x7d\x3f\x2c\xc3\x0f\xe7\x8c\x95\xa1\x72\x85\xd4\xc9\x72\x95\xa8\x44\x04\x05\xa9\xfa\x16\x93\x6f\xc0\x1b\xa2\x15\x08\xf3\x2a\x4e\x24\x4b\x4d\x75\x43\x1a\x44\xee\xf9\x17\x9f\xd1\xdc\x72\x0d\x59\x6c\x80\xa3\x32\x7c\xe7\xf3\xa9\xd1\xdd\x14\xd7\x57\x38\x0e\x93\xf1\xa0\xce\xd0\xb8\x1e\x0d\xe9\x48\x0d\xed\x48\x38\x2f\xb0\x77\xbc\x2a\x41\xc7\x0a\xab\xb8\xf5\x81\x53\x04\xdf\xf4\x88\xa0\x40\x60\x94\xd9\x58\xfd\xfe\xd9\x40\xdc\x0b\xe3\x77\x4b\x97\xb1\x2e\xe9\xc4\xa8\x4a\xbb\x25\xb2\x48\x2e\xc9\x22\x29\x55\xe1\x0a\x6d\x4c\x16\x11\x77\x0b\x46\x5b\x8d\x63\xcb\x59\xa1\x91\xce\x47\xaf\x7b\x07\x40\x17\x37\x48\xa9\x0d\x6f\x34\xac\x82\xb2\x85\x4c\x62\xa3\xda\xa8\xe2\x8b\x0e\x39\x1d\xaa\x33\x97\xa9\xf2\x15\x95\x35\xce\x0e\x86\xb7\xfb\x9e\xa8\x7a\x40\x29\x64\xc9\xa8\xdf\xb4\xeb\xe7\x8c\xa7\x39\xed\x78\x9a\x79\xe3\x69\x4e\x1a\xcf\xbf\x43\x22\xfe\xd9\x3d\xac\xdc\x80\xfa\xe6\x71\xc5\x74\x7f\x5c\x38\xd2\x14\x1c\x41\xcf\x4b\x59\x80\xcb\x05\x73\xb9\x3c\xed\xd8\x97\xf3\xc6\xbe\x3c\xcb\xd8\xad\xd9\x59\x3e\xce\x1d\xc2\x8d\xa3\xd7\x10\x56\x0a\x21\xe4\x0c\x77\x65\xda\xe1\xae\xe4\x0d\x77\x65\xfa\xe1\x5e\x4e\x3b\x31\x2b\x05\x33\xfd\x5b\x09\x6e\x8a\xf5\x95\x7d\x11\xeb\xe1\x3b\xf9\xa2\xf8\xad\x53\x8d\x51\x82\xcc\x65\x32\x21\xc5\x5f\x15\x48\xc5\x8f\xd7\x53\x6c\x22\x6f\x2c\x62\x08\x1a\x24\xe0\x5f\x0f\x9f\xff\x43\x74\x1a\xad\x4a\x08\xa9\xa4\x1b\xb8\x40\xaa\x0d\x5c\xc3\xd9\xd6\x72\xd6\xff\x94\x35\xef\xa9\x9f\x13\xd6\xf4\x44\x34\xdd\x72\x39\xff\x19\x28\x9f\x84\x40\x73\x79\x4d\x1c\xcc\xed\x2b\xdf\xbd\xf7\x37\xac\xb8\x54\x97\x88\xb5\xbe\xae\x26\x52\x3d\xd0\x0d\xe9\x41\x2a\xa2\x87\x7f\x5f\xc0\xb7\x68\x46\x17\x58\xd2\x25\x44\x13\x86\xa9\x07\x6f\x41\xdb\xed\x2b\xe1\x4a\xc9\xa1\x13\x74\x29\x79\x5a\x90\xa3\x79\x67\x9e\xd4\x17\x94\x3e\x77\xa1\x7e\x5c\x11\x8f\x9e\xc8\x06\x29\xe3\xb9\x8a\x6c\xc8\x93\x96\x1d\x41\xb0\x30\x76\xa0\xea\x56\x95\x9c\x14\x05\x0d\x54\x65\xca\xe9\xf8\x5b\x56\x30\x40\xda\x1f\x54\xd1\x45\x34\xdc\x00\xc9\x88\x05\xf9\x11\x05\x15\x4c\xc9\x85\x66\xf0\x3b\xa5\x9d\x4c\x35\xa6\x75\x32\x75\x93\x83\x29\x6d\xa5\x93\x28\xa4\xe2\x8f\x29\x43\x1d\x4a\x23\x18\x35\x3e\x43\x0a\xff\xfe\x5d\x4a\xf2\x5d\x5b\x92\xd7\xc8\xa8\x80\xce\x46\xf8\xa0\xc2\x6b\xb9\x23\x0e\x38\xe5\x7d\xaa\x22\x10\x2d\xff\xea\x88\x76\x62\xc0\x49\x94\x38\xc1\x7b\x40\x1c\x17\x87\xc5\xeb\x13\x9c\x24\x5e\xa9\x78\x18\xc6\x04\x56\x14\x45\x9b\xba\x1f\x93\x64\x8e\xb0\x3d\x69\xa6\x95\x0a\x1a\x57\xaa\x0a\x7f\xc5\xd9\xb7\xd1\xda\x26\xcb\xf3\xbd\x25\xf0\xd4\xb1\xc4\x68\xb2\x84\xe3\x00\xa3\x60\xf5\x58\x74\x8a\xa8\x74\x66\x88\x82\xc8\xa3\x2a\x78\x0f\x78\x8a\xea\xd2\xe4\x50\xa3\xc3\x74\x7d\x0d\xc1\x34\x74\x96\x0a\xc2\x94\xad\x55\xae\x18\x1e\xce\xa1\xad\x7c\x88\x99\x70\x40\x73\x26\xdf\xb3\x66\xc5\xf8\x30\x0a\x5d\x9b\x21\x1e\xe6\xcc\xbf\xf0\x0e\x48\x9a\xc6\x21\xc6\xd1\x41\xb6\x78\x77\x94\xc6\x56\xca\x7b\x76\x71\x90\xa0\x29\x7c\x5f\x13\x72\xa9\xdd\x5e\x5f\x9a\xe9\x63\x9d\x3e\x36\xd3\x91\x31\xaa\x3c\x3c\x10\x1a\xf9\x82\x95\xaa\x02\xe2\xa8\x68\x94\x90\x12\x8f\x2c\x81\xdf\x66\x09\xd3\xda\xf7\x24\x65\x53\x6d\xc6\xa9\xca\x99\x62\xf4\xa3\x69\x64\xac\x67\x50\xb1\x5c\x88\x0b\x15\x50\x65\xdb\x61\x18\x34\x49\xd4\xa8\xa5\x72\x72\x2b\x6d\xe9\x78\xe8\x99\x6a\x32\x2f\xb7\xe2\x4b\xda\xf5\x73\x6b\x41\x86\x59\xc5\x67\x6d\x99\xd7\x96\x16\xa7\xb2\x56\x26\xcf\xae\x88\x21\xf8\x26\x55\xcf\x2d\xb1\x3e\x67\x06\xf8\xba\x04\x8d\xcf\xe2\x25\xe7\x78\x63\xfc\x0d\x6f\x25\x91\x28\xe0\x1b\x7f\x7e\xff\x2e\x09\x01\x12\xc5\x6f\x55\x92\x4b\xbb\x0d\xa3\x10\x7c\x9b\xcb\x2d\xe3\xcc\x5d\x31\x72\x9c\xc9\xc0\x19\x4b\x15\xcf\xc6\xad\x6f\x7c\xca\x95\x72\x29\xa6\x6e\xcf\x89\x13\xb6\x14\x4b\xa6\x57\x32\x3d\x31\x58\x61\xcd\x1e\x15\xe0\x26\xa7\xc3\xb7\xb8\x44\xac\x39\x29\x03\x87\x12\x97\x2b\x4a\xda\x1a\x14\x6c\x50\x6f\x94\x28\xf2\x2e\x3d\x8e\xe6\xcf\x41\xa2\x80\xdd\x88\x32\x69\x00\xd1\x4e\x92\xd8\x3f\x1b\x26\x94\xa1\x8c\xa1\x17\x41\x65\xe6\x86\x28\x34\x84\xae\xed\xc1\x6d\xdf\xc4\x46\xae\xf2\x16\x79\xcb\x98\x4d\x93\x66\xbd\xd6\xad\x94\x50\x9a\xbb\x56\x2a\x19\x9a\xb9\x87\xe9\x51\xf0\x6f\x7f\xe9\x56\x73\xf4\xb8\x2c\x14\x38\xb8\xc4\xad\x3d\x83\x1f\xfa\x4c\x34\x74\xe2\xa8\xdf\x22\x57\x38\xea\x96\x3d\xf8\x96\x42\xc2\x65\x8b\x70\xe4\xb4\xc8\x58\x3e\x46\xc5\x7f\x49\x34\x7b\x5d\xe9\xc4\xb5\x95\xe5\x71\x13\xb8\x66\x2b\x9d\x90\x62\x60\xe2\x6d\x40\xc1\x9a\xd2\xb3\xa8\xab\x19\xe2\x6e\x4c\x3b\xcb\xf6\xb6\x0c\xca\xc0\x61\x1c\x7f\x91\xfb\x12\x2f\x92\xdd\x96\x00\xdd\xc3\x38\x7e\xa3\xb6\x27\x28\x97\xdd\x9d\x64\xc1\x5f\x55\x99\xcb\xbc\xec\xaf\x2a\x7b\xbc\x6e\xee\x6d\xf7\x48\x67\x77\xa7\xb5\x34\xbd\x4d\x4d\x73\x9a\xee\x4a\x8d\xc1\x25\x9e\x08\xad\xcd\x16\x9c\x96\x08\x65\xab\x25\x31\x2d\x92\xd2\x40\xbf\xc5\x96\xff\x38\x15\x9a\xf5\xa1\x14\x69\xe4\x94\x74\x24\xfb\x40\xce\x50\x62\x49\x1c\x9d\xd3\x2d\x87\xf5\xc0\xc6\x3f\x53\xfe\x0c\xc7\x52\xbc\x65\x92\xe9\x09\x99\xa4\x08\x74\xc2\x7e\xca\xff\xd1\x7c\x72\xb7\x4a\x5d\x57\xa7\x9c\xce\xbf\xe1\xf6\x60\x46\xd7\xfb\x81\x1b\x44\xaa\x99\x0c\xbd\xde\xb4\x4d\x90\xfc\xad\x02\xd6\x70\x15\xd7\x6a\x55\x73\x88\xaa\xc1\x05\xd4\xd6\x91\x06\x17\xd3\x8e\x25\x6f\x77\x52\x31\x7e\x8c\x09\xc5\xce\x8b\x80\xa9\xfc\xcf\x7a\xaa\xcc\xb5\x4d\x0f\x95\x8a\xf1\x9d\x73\x24\x30\x43\xea\x1c\x5b\x0f\x4c\xd4\xe9\x0c\xa2\x6f\xdc\x4c\x48\x47\xf3\xea\xd8\x3f\x7f\x5c\x51\x17\xb5\x35\xe1\x36\x41\xda\x3b\x7e\x32\xe4\x1f\x59\xc4\x7c\x24\x62\x91\xdb\x6d\x27\xdf\x85\xc9\xff\xf0\x69\xfb\x60\x7b\xef\xb0\x7d\xb8\xb3\xbf\x77\xd2\x3e\x3c\xfc\xb4\xf3\xf2\xf3\xe1\xf6\x01\x9f\xfe\xdb\x83\x44\x5d\xc9\xf6\x2f\xdb\x7b\x87\x19\x58\x57\xe9\xa7\xd5\xb7\x33\x79\xaa\x39\xea\xd9\x35\xe1\x9b\xe2\x0c\xf5\xa5\x07\x03\xc2\xb7\xd3\x3b\xd5\x17\x5b\xf6\x9d\x60\xc8\x8d\xfe\x4e\x40\x70\x8d\xcc\x04\xc4\x30\x3e\x9f\xbd\x0b\xb3\x34\x0c\x7b\xc5\x31\xac\xeb\x0c\x1b\x9f\x69\x24\xf8\x26\xba\xf0\x1c\x75\x27\x98\xf6\xde\x75\xc7\xd9\xca\x6c\x70\xf7\x05\x4f\x0a\x77\xb3\x92\x41\xf9\xa8\x44\x1d\x06\x4f\x81\xf9\xdf\x25\x3f\x54\x3f\xa3\x61\x62\x24\xcb\x4f\x7c\xbd\x0e\xef\xbf\x4d\xee\x95\xb5\x36\xbf\x14\x46\xe6\x63\xf1\x57\xac\x9c\x86\xb9\x02\xe0\x03\x62\x27\x52\xa9\x7f\x88\x3a\xe4\x2c\x8a\x3d\xf0\xbd\x9c\xc9\xe9\x44\xc3\x98\xb8\x51\x1c\xd2\x98\x61\x30\x0b\x79\x45\xcc\x88\x23\x7c\xf0\xe7\xd5\x0b\x68\x27\x59\x4a\xa2\x41\x15\xa3\xb1\x9a\x3f\xcf\xa2\x24\x89\xfa\x55\x2c\x82\x1f\x19\xc8\x21\x01\xca\x35\x56\x5d\xa3\x80\x86\x95\x81\x7b\x21\x45\x6a\xc7\xb8\x29\xfa\x6a\x14\xd0\x49\x53\xc4\x28\xc8\x4c\x39\x4e\xdc\x9c\x54\x33\x2e\x57\x2a\xe0\xef\x07\x66\x04\x3c\xa1\xce\x68\x92\x6c\xa9\x8a\x6d\xa3\xe2\x95\xbf\x93\x51\x71\x10\x79\x0e\xeb\x9d\xf8\x0c\x34\xd4\xc5\x36\x85\xcf\x66\x35\x2f\x4e\x37\x70\x27\x3b\xe3\x34\xb0\x59\x8d\x82\x15\x1c\xe9\x4f\xba\x78\xe0\x4f\xee\xb1\x8d\x3b\xd9\x1f\xe7\xc0\x9b\xd5\x54\xf8\x87\x58\x92\x2f\xdf\x83\x25\xf9\xf2\xdd\x2c\xc9\x57\x7e\xa0\x25\xf9\xca\x7d\x59\x92\xaf\xdc\x83\x25\xf9\xea\x89\xb7\x72\x02\x8f\xb4\x8a\x67\xf1\xf9\xf3\x59\x2d\x8d\x7f\x9c\x95\xfa\xda\x7d\x59\xa9\xaf\xdd\x83\x95\xfa\x93\x1f\x6f\xb5\xfd\xf4\x96\x56\xdb\x33\x34\xf1\x4c\x34\xb1\xe5\x24\xce\x0d\x2d\x80\xbf\xd1\xb9\x07\xd3\xf0\x07\xd3\xf0\x07\xd3\xf0\xfb\x35\x0d\x7f\xb0\x0c\x7f\xb0\x0c\x7f\xb0\x0c\xff\x9b\x59\x86\x6f\x0e\xe3\x0b\xcb\x2a\x1c\x57\xf0\xe6\xe7\x4f\xbf\x6c\x9f\xbc\x6a\x6f\x1e\xee\x7f\xda\xd9\x3e\x10\x07\x6d\x97\x17\x7e\xe9\x30\x9f\x6d\x06\x11\xa3\xde\x24\x65\x80\x29\x7d\x49\x3d\x60\xba\x3e\x2a\xed\x74\xea\xfe\x80\x4e\x54\x57\xd8\x30\xbd\x14\x4c\x5e\x3b\x0d\x71\x7a\x68\x67\x29\x68\x06\x24\x7c\x53\x7e\xdb\x21\x77\x34\x40\x13\x40\x06\xee\xf4\x10\x69\x1a\x22\xc0\x92\xf3\xb2\x1b\x85\x51\x12\x85\xf4\xd7\xe9\x01\x76\x35\x40\x55\xdb\xe8\x9f\x4c\xfb\x3a\x3d\xc4\x5e\x16\xe2\x57\x03\xe2\x9e\x93\x0c\x63\x27\x98\x1e\x9e\xaf\xe1\x89\xba\x06\x34\xe9\x84\x68\x3a\x50\xdf\x34\x28\x70\x91\x65\xc3\x81\xf8\xb3\xd3\x03\x3b\xb7\x81\x61\xf4\x5a\x73\x36\x78\xea\x4b\x88\x76\x35\x3d\xd0\xc0\x06\x8a\xd5\x39\x54\x65\x6a\x28\x3c\xe8\x9b\x92\x98\x48\x2a\x0f\xac\x27\xdd\x83\xda\x25\x5a\x14\xf3\x1f\x8f\x1f\x93\x41\x6d\x2c\xbf\xc7\x60\xb9\x28\x1e\x7f\xfc\x9a\x7a\xf1\xf1\x6b\x16\x8e\x59\xfc\x6b\xaa\xf8\xd7\x4c\xf1\xb1\xb6\x8b\xec\xd2\x04\xb8\xcb\x2b\x87\x33\xd2\x71\xaa\xaa\x99\x55\x46\xc6\x8b\xce\x24\x11\x20\x67\x93\x33\x2a\x0e\xca\x15\x80\x57\x49\xc5\xc4\xe0\x69\xca\xec\x0d\x1e\x74\x88\x0b\x10\x40\x78\x49\xec\x2a\x35\x16\xf8\x2e\x2d\x37\xaa\xa4\x59\xa9\x25\xd1\xe7\x01\x67\xa1\x0e\xa3\xe5\x8a\x5d\xa0\x59\x51\x8f\x49\x10\xce\x86\x84\x24\xe9\xbe\xc4\xf1\x6e\x0e\x49\xf5\x24\xc5\x5c\x8f\x4a\x60\x9e\x8e\xf1\x31\xa4\x47\x4d\x80\xa7\x7c\x6f\x90\x17\xa4\xf4\xb5\x44\x5a\xa4\xf4\x6b\x49\xf8\x1e\x9b\x2b\x04\xc7\x21\x1d\xa3\x43\xee\x3b\xf0\x15\x3d\x8f\x30\x53\xd3\xd8\xb6\xe6\x9d\x15\xa7\xb1\x6d\xbd\xb5\x69\x2b\xf4\x68\x82\x59\x2b\xe4\x2b\xfb\xb8\x7c\x33\x55\x28\x23\xcd\x7c\xe4\xad\xfd\x8d\x36\xa0\x50\x6b\x1a\xc3\x4f\x04\x5f\x11\xf6\x9e\x58\x5b\x9d\xf2\x2a\x05\xf6\x97\x62\x5c\x96\xed\x25\x87\x0b\xf7\xbe\xd2\xe0\x72\x01\x2f\x0a\x21\x56\x9c\x3b\x0c\x9c\x84\x8a\x18\xde\x09\x84\xd5\x74\x71\x43\xc7\x22\xff\x92\xde\xd3\x31\xdc\xd5\x35\x94\x12\x99\xf9\x96\x98\xa2\xb9\xb4\x71\xe1\x64\x13\x42\x21\x6a\x09\x4b\x3d\x58\xcc\x46\xee\x20\xf2\xc3\xc4\x30\xf7\xc3\x6f\xb3\xc4\x99\xc3\x80\xf2\x74\x19\x99\x62\x96\x92\x2b\x43\x96\xc1\x6f\xcb\x6c\x10\x9d\xc3\xec\x0d\x83\xc0\x68\xcf\x4c\xb5\x0c\x23\x5d\x9b\x3b\x4d\x64\x4a\xa6\x15\x61\x27\x8a\xfb\x4e\xf2\x41\x0e\xcb\x6a\xf5\x85\x18\x6e\x0d\x2f\xbc\x0d\xaf\x9b\x34\x4c\xe2\x71\x8e\xc5\x98\x64\xe0\x98\xaf\x0c\x97\xb8\x54\x87\xa0\xcc\xa6\x03\x3f\xa4\x92\xe3\xd9\xcf\xda\x08\xb9\x89\x69\x16\xab\x99\xcb\x95\xb2\x44\x78\x25\x6d\x45\xeb\xc4\xd4\x51\x43\x35\x47\x9e\x72\x2a\x0a\xdd\xaf\xa6\xdd\x4e\x9a\x8b\xcb\xbc\x47\x16\xa5\xaf\x60\xea\x5b\x8a\x00\x8e\xa0\xfa\xb1\x6d\x2b\x6b\xfc\xe6\x03\xcc\x65\x90\x76\x8b\x29\x2c\x4d\x61\x94\x6f\xb2\x43\x64\x58\x7c\xdc\xc8\xad\x2a\xb5\x71\x99\xef\x75\x95\xda\x65\x93\xff\xf8\xb5\x52\xbb\x6c\x18\x23\xf7\xd2\x76\x01\x72\x62\x81\x8a\xf9\x06\xaa\xb3\xac\x81\x99\x8f\x16\x7e\x4c\xc7\x2f\x45\x7f\xc7\x4d\x31\x82\xf1\x2d\x3a\x3e\x2e\xec\xf8\x5c\x5e\x7f\x6b\x92\x90\xc5\xdf\x4a\x0d\xd6\x57\xd9\x5c\x65\xa6\xad\xb5\x68\xcc\x04\x51\xd6\xc4\xa6\x17\x82\x7e\x3a\x95\xbf\x35\x3e\x7e\x7c\x33\x9e\x72\xf4\x7f\x52\x40\xf7\xd9\x1e\x06\xd4\x06\x94\xe5\x2e\x83\x3f\x83\x9c\x54\xc3\x39\xe3\xfe\x1f\x36\xbc\x3c\xa2\x2b\x1a\xde\x7d\xf5\xa2\x0f\xbd\x00\x9f\xb0\xe9\x5e\x60\x27\x32\x06\xa1\xb3\x93\x6e\x1e\xe1\x9a\x8c\xd1\xb4\xe0\xb9\xb3\x55\xff\x0d\x06\xeb\x59\x43\xf9\xe5\xac\xf7\x71\x92\xdd\x84\x97\x73\x76\x61\xf1\x6e\x4a\x15\x70\x6c\x03\x4a\xfe\xfd\x09\x5e\xc0\x98\x25\x3e\xc1\x53\x21\x63\xff\x29\x3f\x12\x4d\x7d\xff\x4e\xc4\x4f\xa1\xe3\x85\xb8\x6b\x8f\x78\xa5\xdb\x18\x7a\xc7\xd4\x09\xc4\xd3\x74\x01\x98\x1f\x67\x4c\xb8\xe4\x05\x22\x47\x8b\x2e\x2d\xf1\x42\x6b\x5a\xdb\xdf\xcc\xad\xdc\x3d\xd9\xde\xe5\xdd\x6c\xfc\x10\xd3\xec\xfc\x86\x66\x35\xcd\x9e\xca\x82\x2a\xff\x96\xca\xb2\xac\xc7\x83\x95\x69\x55\xaf\xe9\xc9\x6b\xa9\x99\xad\x1a\xb4\xd0\x69\x49\x3a\x53\x72\x50\xb1\x41\x1c\x48\x6b\x93\x8d\xe1\x96\x6f\x69\x0c\xb7\x29\xba\x7c\x07\x43\xb8\xfc\xb9\x98\xc2\x10\x6e\x6a\xe3\xb5\xfc\x5b\x56\xcb\x78\x8d\xe7\xcd\x04\x62\x2a\x8b\xad\xc9\xb5\xcb\x47\xa5\x33\x87\xf9\x10\x01\xe0\x4c\x2b\xfb\xd4\xe7\xfe\x00\x83\x00\x04\xca\xe9\x7f\x60\xe8\xc7\x20\x22\x00\xaa\x7a\xf8\xcf\xbe\xd4\x4b\x99\x1f\x5f\xcd\x0f\xfe\x9b\x89\x78\x04\x4c\xa9\x4d\xe4\x17\x68\x66\x4a\x30\xe3\xb7\x1f\x0e\xe7\xcd\x68\x44\x86\xa2\xc7\xec\x18\x9d\xe4\x56\x93\xc3\x97\xfb\xe3\x5f\x30\x67\x37\x5b\xd9\x15\x56\x35\xac\xec\x90\x23\xcf\xd4\x7d\x80\xb2\xdf\x99\xda\x1a\xc0\x1c\xb9\x70\xbf\x3b\x67\x9f\xfd\x66\xea\x86\xb4\xc6\xe3\xfc\xe7\x8e\xab\x4f\xb0\xb0\x99\xa0\x60\xf0\xf5\xc9\x06\x6f\xb8\xba\xd5\x02\x32\xd0\x7f\x74\x9c\xc5\x05\x46\x53\x56\x6f\x44\xef\xc9\x76\x4b\xe9\x4f\x6c\xbb\xad\xd5\xbf\x93\xdd\xd6\x83\x33\xc8\xff\xf1\xce\x20\x7f\xb8\xf5\xc9\xca\x2c\x3e\x03\x1f\xac\x22\x1e\xac\x22\x1e\xac\x22\x1e\xac\x22\x1e\xac\x22\xfe\x33\xad\x22\x7e\x25\xed\x4b\x9f\x69\xb3\x08\xbe\x7c\x7f\xe5\x49\xd3\x68\xa6\xf2\x36\xad\x1f\x72\x0d\x06\x3d\x9a\x70\x0d\x06\xf9\x37\x5c\x83\x41\x99\x5b\x5f\x83\x41\xad\x69\xae\xc1\x10\xfc\x2d\xaf\xc1\xc4\xb8\x8e\x66\x57\x9d\x65\x94\x4a\x39\xda\x03\x68\xe5\x7e\x9f\xd2\x01\xc8\x02\xed\x01\x84\x45\x08\x82\x68\xb4\x45\x5d\xbf\xef\x4c\x3e\xa4\xdc\xf8\x64\xa8\xe7\x7b\x77\x7b\x73\x24\x1e\xae\xc0\xad\x73\xd4\x21\x9e\x93\x38\x32\x9e\x32\x84\xee\xc5\xc8\xbe\xb0\x08\xa0\xd0\x5f\xf0\xfc\x4b\x9c\xa7\x66\x7f\xbe\x84\x27\x53\x31\x52\x08\xff\x7c\xd3\x48\x79\xa1\xff\x84\x91\xfe\x3e\xa4\xc4\xf7\xf8\x70\x2f\x97\xc4\xd0\x2e\x39\x6d\xee\x4c\xb4\x5f\xfa\x7b\x8f\xce\x8b\xfa\xce\x8c\xaf\xe3\x6e\xd6\x30\xfc\x5d\x87\x3e\x53\x55\xce\x17\x67\xaa\x28\x55\x55\xce\x30\x89\x4a\x55\x52\xe2\x6b\x65\x17\xdf\xe9\xc1\x4f\xe7\xb2\x74\x0c\x41\x6c\x34\xb1\x9d\xd3\xf1\x8d\xab\x8a\x67\xbe\xa3\xb3\xbd\x87\xfd\x9f\x8a\x7f\x6b\x45\xa2\xcf\x9b\xa8\x03\x08\x21\xa3\x9e\xef\xf6\x88\xcf\xc8\x90\x0d\x9d\x20\x18\x73\x11\x14\x0d\x39\x38\xe2\x20\x4e\x4e\x10\x8c\xef\xe9\x05\xb0\xe8\x81\x70\xb3\x23\xba\x50\x15\x7d\x08\x29\x46\xb9\x3e\xa3\x84\xd1\x84\xb7\x7f\x36\x26\x43\x06\x2f\x1b\xef\xe5\xe9\x70\xdf\xe7\x52\xed\x7d\x6c\x54\x66\xb4\x54\x31\x8a\x6c\x60\xb9\x99\x09\x3e\x89\x40\x7d\x8c\x8f\x32\x85\x4a\xf6\x26\x15\xfa\x8d\x40\x11\x0d\x10\xee\x56\x44\xc8\x29\x69\xaa\xf0\xdd\x73\x46\x5c\x27\xe4\xb8\x77\xc2\x31\x9a\xd0\x8c\x64\xd4\x7a\xa0\x13\x1f\x63\xf5\x40\x0e\x9c\x5f\x10\x88\x09\x00\x0e\x07\x70\x2a\xe0\x4d\xb1\xc9\x00\xd4\xa3\xd5\x84\xd7\x9d\x9d\x91\x1a\xb3\xe2\x46\xc3\x10\xa8\x0a\x40\x0a\xd0\x9b\x3c\xf1\x7e\xc8\x16\xaf\x55\x13\x1a\x6b\x59\x4f\x34\x26\xda\x7a\x25\x0b\xcc\xd4\x1e\x30\x4a\xd0\xd7\x7a\xde\xac\x6f\x9b\x31\x0a\x18\x0a\x9e\x01\xed\xdc\x75\xe0\x04\x1f\x0b\xdf\x01\x0a\x04\x26\xad\x2a\x69\xd3\x49\x1c\x7e\xac\xe9\x04\xd1\xe8\x4e\xeb\x90\xb9\x4e\xf0\x57\x48\x81\xb8\x9a\x6e\xa7\xbf\x93\xb6\xe1\x07\x9b\xed\xf7\xdb\x27\x87\x5f\x3f\xe0\x15\xdb\xc4\x4b\xa0\x29\xb8\x39\x27\xb8\xbf\x00\x03\x30\x03\x7f\xae\x1c\x00\x67\xb9\x99\xaa\x52\xbc\x30\x47\x84\x71\x2e\x74\xd3\xad\xd6\xdf\x0d\x69\x38\x76\x3d\xe1\xff\x93\xfb\xdf\xf7\x43\xbe\x4f\xbc\x76\x26\x9a\xc9\x4f\xc1\x95\x38\x22\x0e\xfc\x3f\x66\x43\x84\x06\x03\xd2\xcd\xc5\x64\xfb\xff\xbf\x9f\x2f\x11\xb9\x9f\x0f\x62\xca\x28\xd8\xe6\x3b\x31\x38\xa8\x90\x09\xdb\xa1\x67\x7e\x42\x3e\x4f\xe3\xb2\x32\x38\x50\xa1\x17\x34\xbe\xe1\xed\xc8\x44\x42\x80\xcb\xbb\xe2\xeb\xc0\x94\x5a\x01\x54\x6d\x4a\x47\x50\x10\x08\x51\x88\x3a\x45\xee\x32\x56\x1a\xa6\xf8\xa6\x60\xa8\x43\x64\xa3\x6a\x6f\xf6\x6b\x5a\x62\xd2\xd2\x8e\x79\x6a\x3b\x6a\x54\x09\x9e\x2b\x8e\xad\x1d\xf7\x4a\x6c\x9a\x8d\xaa\xdc\xf8\x1a\xe8\x33\x2b\x67\xf7\x52\xdd\x10\x7b\x91\x38\xa7\x58\x18\xfe\x31\x97\x9d\x4a\x4b\x66\x5f\x76\xae\x3d\x5c\x76\x3e\x5c\x76\xfe\x65\x97\x9d\x0f\x37\x91\x0f\x37\x91\x0f\x37\x91\x0f\x37\x91\x0f\x37\x91\xff\xc1\x37\x91\x5f\xed\x9b\x48\xbe\x7a\xbf\xfe\xed\x2e\x22\xbf\xde\x70\x11\xf9\x75\x8a\x8b\xc8\xaf\x33\x5d\x44\x7e\x9d\xf6\x22\xf2\xeb\x2c\x17\x91\x5f\xff\x94\x8b\xc8\xaf\xf7\x7f\x11\xf9\xf5\xe1\x22\xf2\xef\x74\x8b\xf0\x70\x11\xd9\x21\x63\x79\x11\x39\x7e\xb8\x88\x7c\xb8\x88\x7c\xb8\x88\xfc\xf3\x2f\x22\x1f\xae\x9c\xfe\x46\x57\x4e\x79\x37\xc3\xd3\x5c\xcb\xfe\xb0\x3b\xe1\x1b\xae\xa5\xc9\x66\xcf\x89\x93\xff\xd3\xee\x85\x03\xda\x01\x4d\x2f\xa8\x26\x7f\xf8\xbd\xf0\x7d\x5d\x43\x26\xd1\x5d\xf5\xfd\x84\xa0\x7e\xf8\xe1\x1a\xb2\x68\x47\xd2\x8f\xd7\x06\xd1\x08\x1e\x9b\xfd\x8e\x97\x02\x41\xd4\xe5\x7f\x7c\x8f\x86\x89\x9f\x8c\xf9\xef\xc4\xef\x53\x7c\xfd\x26\x2e\x0a\x22\x3f\x84\xb2\x51\xec\xf9\x21\xbe\x07\xfb\x7d\xe8\x84\x89\x0f\x4e\xf8\xc5\xef\x3f\xe0\xf7\x30\x71\x0f\x45\x75\x46\x7f\x1f\x72\xa0\x58\x21\xe9\xc5\x94\xf5\xa2\xc0\xbb\xe1\x71\xdb\xc3\xbd\xe6\xc3\xbd\xe6\xc3\xbd\xe6\xc3\xbd\xe6\xff\x21\xf7\x9a\xb8\x63\x6b\x41\xe9\x49\x36\x0a\x40\xe6\x56\x73\x3c\xcd\xad\xa6\xdc\xb5\xa7\xba\xd3\x84\x1d\xb8\x51\x55\xbb\xe8\xdf\xf1\x4e\xf3\x6b\xfe\x9d\xe6\x93\x49\x77\x9a\x02\xca\xf4\xf7\x98\x73\xb8\x6c\x97\xd0\x71\xf2\x5c\xd9\xad\x90\x03\x3f\xf4\x62\x4a\x0e\xa2\xb8\x37\x64\x73\xff\x0a\x7c\x97\x86\x8c\x92\xdd\x9d\xc3\x39\x50\x72\x66\x43\x8a\x86\xd1\xd2\x30\x1c\x32\xea\x2d\x5d\x38\x31\xe3\xfd\x13\xee\xe5\x0c\xb7\xc7\x07\xe3\xfe\x59\x14\x18\xae\x9a\x73\xb3\xf1\xd2\xcc\x76\x98\xac\xab\x14\xb9\x54\xc6\x5a\x9c\x8e\x77\xd8\xb6\x79\xb3\x95\xa9\x37\x10\x35\xcc\x72\xe6\xb5\x4a\x12\x09\xa5\xed\x85\x13\x70\x7c\xfd\xc3\xef\x10\xfe\x1b\x6e\x03\x40\xa1\xfe\xfd\x3b\x91\xdf\xc3\x50\xba\x23\xe1\x25\xff\x91\xa7\xa4\x2f\xd9\x7e\xa9\x5d\xbc\x4d\x39\xa3\xe2\x86\x82\x8c\xfc\xa4\xa7\x14\xf5\x0a\x5e\xa9\xb2\x3e\xf7\x8f\xeb\xb9\xb9\x7f\x08\x05\xa4\xd1\xa7\xf5\x39\xf3\xe2\x81\xf5\xa2\x61\xe0\x7d\x66\x74\xcf\x49\x7c\xe1\x51\xed\x1f\x49\x3c\x86\xfe\xc0\xf5\x8a\xd5\x3e\xf6\x53\x42\xc5\xdb\xbd\xb9\x7f\x40\x4b\xff\xa8\xd7\xc9\x16\x4d\xa8\x9b\x90\xb3\x61\xb7\x3b\x26\x12\x53\x52\x57\x8f\x02\x7c\xec\xd1\x98\x1f\x36\xa2\x80\xff\xf8\xe5\x19\xe1\x4b\xc0\x8f\x42\x56\x13\x30\x7a\x49\x32\x60\xad\x7a\xfd\x6c\xd8\x65\x35\xb7\x17\x47\x7d\x7f\xd8\xaf\x45\x71\xb7\x3e\xa8\x5f\x3c\xab\xfb\x8c\x0d\x29\xab\x7b\x34\x71\xfc\xe0\x85\xef\x6d\xac\x36\x9b\xcf\xe6\xfe\xf1\x0f\x88\x15\x4a\x59\xd2\x24\x1b\x80\x41\x74\x87\x56\x2e\x39\x67\x6e\xa9\xb2\x0e\x87\x09\x9b\xe6\x96\xc0\x95\x4c\x18\x2d\x85\x74\xb4\x34\x8a\x9d\xc1\x80\xc6\x8c\x4f\x02\x07\x72\xb4\xc6\x17\x50\xc9\xa3\xa5\x75\x81\x87\x5c\x9a\xdb\x73\xfa\x94\x95\xa1\x46\xe5\xa8\x71\x8c\x7e\x8b\xd6\x4a\x37\x60\xe9\xb6\x23\x5c\x69\xac\x3d\x31\x46\xb8\xcc\x79\xe7\x35\x07\x98\x77\xa5\xdb\x6c\xc8\x8b\x5c\xde\x05\x28\x7f\x54\x3a\x29\x91\x45\x81\x91\x5a\x27\x8e\xfa\xfc\xa4\xb7\x19\x79\xb4\xec\x57\xf8\x38\x7d\xec\x1d\x36\x01\x33\xb4\x5c\xb4\xca\xf4\x88\x97\x2b\x29\xf7\x60\x29\xe2\xc0\xa6\xc3\x63\x80\x5d\x91\x68\x44\xe8\xb5\x6f\x91\x1f\x96\x4b\xa5\x0a\xdc\x51\x95\x1a\xcd\xe5\x95\xd5\xb5\x27\x4f\x9f\x3d\xff\xc1\xa8\x5b\x51\xa8\xe3\x74\xe1\xd1\x4e\xb7\xe7\x7f\x3b\x0f\xfa\x61\x34\xf8\x3d\x66\x49\xa9\xc6\x06\x81\x9f\xf0\x8e\xd5\x3a\x51\xbc\xed\xb8\x3d\x63\x7c\x01\x3f\xa8\xc7\x06\x62\x57\x8e\x30\x89\xa3\x10\x7f\xd9\x63\x15\x08\x3c\xa7\x63\x56\xb6\x56\x11\xb8\x17\x01\x08\x95\x8a\x85\x0a\x0e\xb9\xa0\x6b\x93\x10\x23\x31\x1e\x0f\x79\xda\x35\x71\x9d\xc4\xed\x91\x32\x8d\x45\x6f\xeb\x75\xf2\x85\x12\x2f\x0a\x4b\xb0\x73\xf0\x25\xea\x84\xa0\x4b\x03\xad\xce\x59\x74\x41\x49\x12\xe1\x1d\x61\x95\x9c\x0d\x39\x7f\x01\xfd\x88\xd0\x50\x38\x1d\x5a\x9b\xcb\xb4\x7d\xcd\x19\x09\x6e\x1b\x35\xb1\x6b\x90\x8d\x1c\x86\xf2\x22\xe5\x5a\xbf\x95\xf1\xac\x5f\xd5\xfe\xef\xe7\x60\xae\x38\x8d\xae\xe3\xcf\x24\x22\x1b\x9a\xa9\x0a\x4f\xfc\x22\x8f\x49\x96\x3f\xa7\x97\x02\x43\xc7\xfc\x2c\xd7\x31\x3f\x93\x0b\x83\x37\xa0\xef\xd7\xb4\x6f\x7e\x06\xf7\x36\xc6\xca\x12\xfe\xf9\x79\x79\x31\x03\x7c\x66\xf3\xfc\xf1\xf3\x22\xca\x1b\x3f\x4c\x64\x12\x49\x6f\xfc\x3c\x0f\x7d\xf1\xf3\x8c\x6b\x39\x6f\x1c\x54\xee\x26\x26\x20\x30\xb5\xe3\xe5\x96\x82\x26\x81\xda\x72\x39\x81\xa8\x9d\x32\xef\x80\x9e\x09\x03\x06\x6b\xb3\x33\x47\x21\xaa\x1e\xf9\xc7\x6a\x30\x7c\x34\x3a\x59\x0d\xca\x48\x82\x8e\xc0\xe0\xc4\x08\xcd\x0d\x28\x89\xd0\xdb\x68\x4a\x14\x79\x7a\xaf\xa2\x08\x11\x22\x2a\xf9\xa5\xfd\x89\xec\xec\xbd\xdd\xde\x3c\xdc\xd9\xdf\x23\x0b\x75\x0d\x7b\x10\x47\x2e\x85\x1b\x75\x71\x17\xbb\x19\x0d\xc6\xa0\xfb\x21\x5c\x72\x59\x6e\x34\x57\x96\x06\xe8\xb4\xa9\x4a\x5e\x39\x2e\x3d\x8b\xa2\xf3\x2a\xd9\x09\xdd\xda\x1c\x81\x0a\x87\x3d\x9f\xc9\xb0\x0e\x6e\xe4\x51\xe2\x33\x22\x24\x1c\x0f\x36\xe0\x18\x56\xd5\xee\xce\xa1\x4c\x26\x9d\x68\x18\x4a\x45\x35\x07\xf1\x7e\x67\x73\x7b\xef\x60\x9b\x74\xfc\x80\x4a\xfd\x75\x1c\x45\x09\xf1\xfc\x98\xa2\xaf\x4a\x58\x9b\xba\xa1\x24\xa6\x54\x74\x00\x6e\x89\x45\xe7\x3f\x33\x5e\xff\xc2\x89\x7d\x07\x02\xaa\x27\x11\x71\x18\xa3\x71\x42\x30\x16\x3b\x2a\xfc\xc6\xd1\x10\x64\x9b\x6e\xec\xf4\x79\xfe\xb0\x4f\x99\x58\xda\x9c\x65\xc8\x81\x7d\x88\xa3\x0b\xdf\xa3\x84\x0d\x62\x3f\x4c\x3a\x4b\x2c\x19\x07\x52\x59\x4a\xca\x51\x18\x8c\xc9\x7f\x81\xfa\x97\x0d\x07\x7c\x62\xb8\xd4\xe2\x84\x9e\x5e\x66\x1c\x48\x12\xf1\x96\x00\x8e\x1f\x62\x5d\xbe\xd0\x9d\xb3\x68\x98\x90\x51\xcf\x49\xc8\x59\x1c\x9d\x53\xa8\x08\x9f\xe3\x68\x48\x46\x34\x06\xbc\x20\x6f\xe2\x9b\x94\xc2\xb5\x31\x3e\xd2\xa7\x8c\x39\x5d\x4a\x46\x7e\x10\x00\x5f\x4a\x62\x7f\x30\x40\xdd\xe5\x20\x8e\xbc\xa1\x30\x51\xe0\x0c\x2c\x31\x6b\x72\x50\x50\x29\xa6\x5c\xac\xe7\x9d\xa4\x21\x1b\xc6\x94\x04\x51\xd7\x77\x89\x17\x51\x06\x86\x0d\x9e\xdf\xe9\xa0\x78\xa2\xe1\xd5\x10\xe7\x7c\x71\x5d\x38\x81\xef\x39\x09\x45\xfd\xb0\x79\x73\x6e\xe7\x08\x5f\x71\x15\xd8\x6b\xe6\xc4\x62\xe3\x64\x57\xa3\xe1\x45\x6d\x6f\x7f\x6b\xfb\x64\x7b\xef\x17\xdc\xfb\x74\x43\xc2\xc3\xe5\xed\x1b\x99\x93\x8e\xd9\xc4\x5c\x65\x24\x4b\xbc\xa8\xd6\xd2\xa5\x90\x2c\x35\x66\xc5\xb2\x82\xe8\x64\x94\x67\x2a\x5c\xcb\xc9\x2d\x99\x3e\xba\x6c\x11\x52\x13\xa0\x1b\x85\x9e\x8f\x73\x80\x5d\xa9\x12\xa7\x4a\xce\xaa\xc4\xad\x12\xaf\x4a\x68\x95\x74\xf2\xc6\x28\x47\xa2\xdc\x2d\x3f\x52\x80\x64\xef\x39\xf6\xa1\x63\xeb\x53\x0e\x16\x47\xb1\x61\x0e\x77\xd7\x0f\xfd\x8e\x4f\x3d\x42\x2f\x5d\x3a\x40\x69\xd4\x75\x87\x71\x4c\xbd\x75\xc2\x39\x09\xa7\x99\x30\x0a\x97\xfa\xb2\xa0\x47\x2f\x08\x0d\x2f\xfc\x38\x0a\x39\x0e\x20\x46\x6e\x89\xb3\x5a\x5e\xb2\xc3\x65\xee\x14\xb2\xf8\x6a\xf0\xb0\xe7\x4e\x40\x7a\x34\x18\x74\x86\x01\x19\x39\x71\xe8\x87\x5d\x56\x53\x48\xb4\x3d\x23\xa2\x0f\xd6\x2e\xe7\xf3\x47\x69\x7c\x1d\xaf\xdb\x85\x76\x42\x8f\x5e\x02\x8f\x2f\x1c\x28\x22\xa6\x16\xd3\x41\xe0\xb8\xb4\x5c\xff\x2f\x56\xef\x56\x6d\xbb\xc1\xb4\x6b\x3e\xde\xfa\x91\x84\xbe\xb8\x78\xbc\x9e\x76\xcd\x26\xda\xa9\x49\x87\xda\x3b\x8a\x74\x7e\xf1\xa3\x00\xd6\x78\x49\x12\xc8\x9c\x2e\xde\x89\xb9\xb8\x78\x18\x7d\x88\x06\xb8\x2d\xd7\xeb\x64\x24\x25\x11\xd7\x89\xa9\x60\x0c\x8a\x84\x4a\x8c\x44\x23\xbe\xdd\x3a\x7d\xf4\x70\x8c\x44\xab\xa6\x3e\x5f\xe6\x50\xd5\x27\x6e\x02\xd7\xb8\xc3\x4d\xda\x55\xca\x2b\x95\x4a\x25\xbd\x47\x3d\x9b\x62\x8f\x82\xed\x28\xd3\x2f\x8d\xf3\x33\x3f\xe9\x3b\x83\x2a\x5a\x93\x58\xfe\xd4\x71\x2e\x4c\x73\xa6\x47\xa2\x34\x79\x4c\x9a\xc2\x9d\x9e\x6d\xca\x64\x14\x58\x16\x05\xb4\xed\x93\x91\xb9\x5a\xb1\x4c\x58\xe0\x8f\x58\xbe\xd9\x9d\xf8\xf9\x9d\x76\xe2\x7a\x9d\x34\x9f\xd7\x9a\xb5\xe5\x5a\x73\x95\xd4\x49\x73\xad\xb6\x5c\x5b\xe1\xbf\x2d\x19\xb8\x02\x5c\xf4\x9f\xfc\xa3\x28\x9e\xd6\xca\x73\x61\xf6\xca\x31\xf2\x72\xd8\x7d\x57\x5c\xb6\xf9\x64\x85\xb3\x8c\x0c\xd6\x8d\x26\xad\x30\x4e\xa2\x0f\x26\xf2\xff\x89\x69\x55\xb3\xb5\x4a\x1e\x7a\x9e\x37\x66\x26\x82\xab\x1c\x68\xcd\x7b\x14\x7b\xe6\xe6\xf2\xcd\x60\x15\x98\xf9\x93\x13\xca\x76\x01\xf8\x7c\x55\xb2\xdf\xa1\x30\x89\x9b\xbb\x56\x16\xa3\x0f\xa1\xb0\x1e\x4c\xad\x1f\x4c\xad\x67\x31\xb5\x06\xaa\xf9\x34\x04\x74\xe5\x72\xaa\xe5\x66\x4e\xe1\x65\x5e\x1a\xee\x15\xa2\xc1\x27\x2c\xbb\x85\xea\xdd\xb2\x51\x4a\x55\x0c\xfc\xf0\x7c\x42\x1b\xcb\x4f\x96\x33\x45\x27\xb5\x20\xcb\xa8\x4a\x07\x5c\xdc\x9f\xd0\x00\x72\x5b\xbb\xe8\xa4\x06\x54\x21\xcd\x60\x98\xeb\x0c\x8a\xc0\xaf\x3e\x7d\x9e\x2a\x38\x09\x38\x96\xa8\xac\xdb\x26\xd4\x79\x45\xa3\xb3\x6f\x9c\x8e\xc4\x2c\x46\x67\xdf\xc8\xe3\xc7\xfc\x4f\x4d\x73\x45\xf2\x02\xd2\x5b\xe4\x8a\x94\x84\x82\xbd\xd4\x82\xa4\xeb\x94\x95\xf6\xdf\xce\x64\x5e\x1d\x62\xc3\xc4\xf1\x43\x46\xe2\x61\x40\x19\x41\x8d\x3c\x43\x79\x34\x08\xa2\x11\x23\x78\x71\x51\x8f\x69\x3f\xba\xf0\xc3\x2e\xa1\x09\x1c\x68\xc9\x0e\xe3\xa2\xaf\x07\x2c\x8b\xd6\xba\x35\x72\x36\x26\xa7\x30\x75\x07\x3d\x4a\x93\x53\x12\xc5\xe4\x74\x53\x8a\xe3\x4e\xc0\x27\xf4\x14\x8f\x44\x7c\xaa\xf8\xe7\x7b\x9f\x25\x69\x6e\x39\x87\xe6\x1b\xfb\xb1\xdf\xf5\xb9\x28\x0c\x67\x49\xd9\xb1\x9a\x69\x38\x2c\x21\x94\x23\x10\xc9\xd9\x64\x13\x62\x59\x5a\x5a\x11\x83\x7b\x63\x2e\xed\xe0\x3e\xab\x92\x62\x67\x94\x4e\xf2\x85\xe4\x7c\x74\x6c\xd6\x15\xad\x92\x0d\x22\x7e\x19\x35\xa0\x07\xd4\xc8\x93\x29\xca\x94\x58\x84\xea\x58\x20\x9b\xb0\x5e\x01\xe1\x31\xed\xfa\x2c\xa1\x31\xcc\x45\x0d\xb2\xb1\xcc\x17\x7e\x02\xe5\xf3\x8a\x26\xc4\xc4\x81\x88\x42\x80\x6b\x02\xc8\x26\x23\x87\x89\x4c\xea\xe1\x19\xc3\x8f\x59\x42\x12\xbf\x2f\x00\xd5\xe7\x04\x62\x3f\x33\xb4\x1f\x12\xc7\x58\x37\x8a\x63\xea\x26\x72\xfa\x63\x8f\xc6\x35\x51\xf2\x13\x24\x61\xa7\xe2\x31\xcc\xb3\xe3\xf2\xb3\x28\x9f\xe9\x5a\x97\x26\xe5\x0a\xe9\xd3\xa4\x17\x79\x35\xac\xb0\x93\x70\x71\x13\xc9\x89\xf7\x81\x71\x91\x9f\x03\x56\x23\x43\x6b\x25\x38\x0a\xf0\x01\x9f\x8d\x09\xa3\x01\xe8\x2d\x6a\x73\x19\x03\x6b\x39\x63\x29\x1b\x6b\xc7\xf3\x0a\x0c\xac\x1d\xcf\x83\x78\x3b\x7c\x17\x71\x83\x2a\x49\xd1\x85\x70\x9a\xae\xe7\xcd\x9c\x46\xdb\x99\x79\xcc\xcf\x6c\x1b\xaa\x6c\x0d\x53\xcc\x32\x0c\xd0\x6e\x14\x81\x04\xb3\xc4\x37\x90\x04\x54\xfe\x37\x66\xb5\x81\x26\xf7\x34\x36\x8b\xc8\x34\xb3\x5c\x97\x86\x34\x96\x28\x91\xbe\xdc\x65\x85\x4c\xa6\xf6\xb6\xae\x47\xa9\x3d\x53\xdb\x3e\xbc\x29\x6b\x59\xc4\xaa\x5b\xc5\xd1\xb6\x48\x7a\xd4\x30\xc4\x16\x49\x8d\xf4\x1b\x63\x2d\x62\x8d\x4e\x8e\xa3\x45\xb2\x23\xca\x74\xb9\x95\x4d\x92\x47\x48\x3d\x83\x56\x10\x93\x47\x0a\xe5\x82\x76\x38\x5f\x36\x47\x82\x41\x8e\xcc\xc3\x6a\xa6\xc6\x06\x29\xd5\xf8\x99\xbc\xdc\xa8\xaa\x4d\xe3\x48\xb1\x70\xe9\xfd\xdc\x86\x97\xf1\x40\x2f\xf9\x85\x08\xaa\xb4\x01\x64\x67\x05\x91\x89\x71\x53\x84\x56\x8c\xed\xdb\x6a\x29\x8f\x62\xed\x48\x34\xc6\xd4\xe7\xc4\x74\xc9\x45\x07\x34\x6c\x6c\x1e\xc6\xc6\x6b\x36\x9e\xe7\xd7\x1d\x74\xc6\xa9\x19\x29\xc7\x70\xbe\x80\x99\x37\x62\x7d\x00\x9f\x9a\x1e\xa7\xda\xd5\x7b\x01\x2a\x05\x97\x10\xad\x99\xc5\x0d\x74\x48\x6e\x2c\x87\x2d\xbe\x4d\x65\x8e\x74\xfa\x0f\x59\x32\x10\x40\xcb\xae\xb1\x6e\xb6\x8c\x05\xd9\x00\xa2\x77\xc1\x47\x15\x1e\x1d\x0b\x19\x44\x8c\x16\x05\x01\x9e\x68\x29\x2c\x8c\xa8\x4b\xaf\x69\x42\x1c\xcd\xbe\x91\xef\x66\x22\x3d\x74\x69\x52\xc0\xc1\x38\x53\xe5\xf4\x90\x79\x23\x22\x77\x2b\x24\xb5\xa2\xe6\xb7\x68\x40\xf9\x5e\x72\x63\x0f\x60\x33\xa7\x85\xef\x54\x78\x26\x4c\x82\xa9\x02\xf4\x59\x6d\x18\x5a\x53\x54\x29\xc6\xa1\x4e\xd9\xef\x60\xd9\x2a\x69\x56\x26\xa1\x0d\xa7\x31\xea\x4c\xd1\x7b\x01\xb7\xa0\xfb\x56\xab\xb9\x78\xc4\x9e\x5a\xe5\x8a\x7a\xf6\x69\x18\x92\xd3\x88\x1f\x1a\xf9\xc6\xc7\xd7\x4f\xb9\x72\x4a\x06\xc1\xb0\xcb\x37\xb9\x28\x24\xf4\x82\xc6\xe3\x1b\x7b\x2c\x94\xb8\x05\x3d\x16\xb9\xa9\xe8\x1e\xb2\x11\x7b\x9f\xe2\xfb\x48\x4d\x64\x49\xf4\xe3\x25\x9d\x34\x0c\x76\x83\x28\xa4\x04\x2c\xa3\xc9\x19\x75\x9d\x21\x06\x8a\x19\x51\xd2\x8f\x3c\xbf\x33\x16\x0a\x6e\x8e\x6d\x16\xf5\xe9\xa8\x47\x63\x8a\x5a\x45\x6f\x18\x73\x01\xcf\x21\x41\x14\x0d\x34\xec\x11\x25\x34\xf4\xc8\x70\x80\x16\x03\x30\xe0\x9e\x13\x7b\x4b\x49\xb4\x94\xc4\x8e\x7b\xbe\xe4\x45\xa3\x90\x30\xdf\xa3\x84\x76\x3a\x5c\x7e\xac\xcd\xe5\x50\x06\xc6\xce\xd3\xf7\xa3\x62\x14\x35\x0b\xbd\x55\x39\xee\xe2\x29\x91\x52\x92\x23\xb9\x1c\x39\xe5\x4b\xe3\x14\x44\x8a\x53\xc9\xb4\x4f\x49\xdf\x19\xb0\xc9\x8b\x00\x01\x15\x2e\x83\x02\x6e\x64\xaf\x09\xbe\x28\x61\xfa\x85\xce\x40\xb3\x07\x64\xcf\xb7\xe7\xc4\x36\x58\xc9\x5e\xd3\xb0\x11\xba\xd1\x2b\x6b\xc7\x32\x7b\xe4\x6a\xe9\x40\x72\xdd\x7c\xcc\x7e\x56\xcb\x7b\x8a\x45\xa8\x79\x41\x01\xfe\xd2\xcc\x42\x8d\xd0\x43\x2e\x95\xc5\xde\xdd\xd0\x96\x0b\x56\x61\x6f\x3d\xb7\x5c\x06\x5d\x37\xa2\x68\xe0\xc9\x98\x7a\xe6\xe5\xca\x90\x32\x5c\x1c\x0e\x1c\xc8\x3c\x27\x71\x26\xe2\x0e\xa0\x14\xe1\x0d\x32\xa5\x58\xe0\x24\x4e\xbe\xfc\xba\x3c\x49\x80\x55\xac\x43\x95\x36\xf9\xc6\x24\x39\x76\x19\x05\x59\x4b\xc2\x10\x0f\x76\x75\x28\x4b\x7c\xb0\x62\xc5\x55\xd3\x8b\x19\x51\x54\xe6\x3d\xaf\xaa\xd8\x3b\xb8\xab\xe5\x48\x10\xc0\x96\x33\xe2\x80\x56\x83\xa9\x4b\x0b\xf1\xf3\xa7\xec\xce\x2e\xb2\xf0\x8e\xba\xb0\x3f\x88\x4f\x5d\x59\x44\x93\x4b\x77\xa9\x68\xe2\xdf\xfb\xe1\xb9\x38\x61\x81\x76\x0b\xcf\x4b\x30\xe7\x9b\x07\x07\xf2\xa8\x32\x69\xd2\x03\x3f\x3c\x2f\x98\x72\x9e\x55\x76\x91\x01\xa6\x8e\x2b\x78\x42\xb5\x76\x00\xe8\x70\x4d\x9c\xf6\x62\x8e\xdd\xcf\x21\x8a\x5b\xde\x3b\x3a\x66\xbb\xce\xc0\xd8\x7e\xb5\xf8\x92\xa7\x5a\x94\x6d\xa6\x6f\xfa\x25\x16\x41\xfc\xc4\x32\x9c\x91\x88\xd2\x47\xbe\xb1\x9c\x80\x26\xcf\xe9\xf8\xe6\x5e\xbe\xa3\x63\x39\xc8\x54\xd4\x3e\xbe\x5c\x39\x8c\xe3\x8a\x04\xa5\x52\xec\x86\x84\x3c\xad\xd6\x78\xaa\x88\x64\x1c\x15\x94\x41\x95\x32\xcb\x92\x42\x05\x3b\x4f\x75\xa4\x68\xde\x37\xa3\xf0\x82\xc6\xf2\x7c\x9c\x44\xc4\xe1\xf3\x4d\x70\x05\x4c\x9a\xee\x24\x42\xab\xa9\x82\x29\x97\xd9\x69\xe5\x05\x8e\x93\x25\x20\x4e\x97\xcc\x2b\x3c\xb9\x52\xb3\x58\xb6\xc4\x63\x3e\x68\x30\xa6\xe1\xa5\x5f\xe0\x5f\x55\x1c\x32\x5b\xd2\x0e\xe7\xde\x16\x5b\x7a\x6a\xcc\x05\xb6\x9e\x26\x26\xb1\x8f\xd5\x32\x18\x30\xc2\xff\xd5\xeb\x64\x2f\x52\x12\x8d\xd4\x7a\x84\x84\xf6\x07\x89\x25\x6d\xc9\x33\x90\x8b\x3e\x01\x1e\xf1\x01\x56\x40\x0b\xe1\x87\x43\x6a\x40\x44\x45\x6e\x5c\x01\xd4\x2e\x6e\x90\xd2\xbf\xc3\x92\xee\x9a\x48\x74\x19\xcb\xb0\x22\x21\x38\xb2\x24\x2e\x7c\xa3\x2d\x57\xff\xfa\x1c\xaa\x76\xc5\xfd\x89\x41\x75\x64\xc3\x28\x94\xba\xd1\x59\xfe\x1b\xdf\xe8\x2c\x17\xa9\x5c\xd3\x05\x57\x26\x69\x5c\x05\x2c\x55\xc7\x7e\x7d\x5f\xd0\xc4\xb3\x82\xe2\x93\x74\xbb\x76\x49\xdb\xa1\x89\xd2\x07\x16\x8d\xe9\x79\x41\xf9\x49\x43\x4b\x41\xae\xe4\xdc\x06\x15\x35\xd7\x6c\xe4\x95\x9e\xd8\x98\x01\x54\xd5\x2d\x74\x82\x50\xd8\x6e\xf3\xe6\xba\x93\x7a\x51\xdc\xa0\x82\x2b\x5d\x3f\x14\x76\x21\x5b\x74\x52\x8b\x0a\x9c\xaa\x05\xfe\x0e\x26\xf8\xb2\x32\x4a\x4d\x22\x17\x28\xa0\x8a\x8f\x62\x67\xb0\x65\x79\x4a\xc8\x03\xff\x74\xb5\xa8\xc2\xa4\x96\x52\x45\x53\x33\xbf\x3b\xf4\x0f\x7b\xb4\xb0\xc9\xa6\x71\xbf\x61\x57\xb8\xf9\x1e\x48\x96\x54\x00\x12\xfe\xc5\xf9\x10\x0d\x51\xf9\x98\xdb\xe0\x72\x7e\xf9\x49\xed\x59\x05\xef\xff\x7a\x45\xb0\x52\xf3\x72\xa5\x5e\x27\x64\x44\x9d\x73\xf8\xd5\x09\xa2\x11\x61\x4e\xe8\x27\x63\xe2\xf2\xc5\x48\xca\x5b\xfb\x64\x6f\xff\x90\x6c\x6d\xbf\xdf\x3e\xdc\xae\x28\x03\x60\x5e\x12\xec\x7e\x93\x78\x5c\xff\x5f\x8d\xb7\x5f\xbf\x8c\xb6\xba\xcf\xbb\x87\xdd\xf7\xdd\x97\xed\xb7\x1f\xdf\x7d\xdd\xde\xdd\x7a\xfd\xec\x65\xff\xf3\xce\xb7\xae\xeb\x07\x1f\x57\x46\xaf\x57\xdb\xd1\xe7\x83\x2f\xfb\xaf\xdb\x87\x7f\x6c\x1e\x76\x5f\x3f\x5b\x7d\xd9\xfb\xf5\xa0\xbd\x3f\x3e\x58\xeb\xbe\xfc\xfc\xfa\xb0\xfd\x7e\xed\x92\x0d\xdb\xe7\xbf\x7e\x1c\x8d\xd7\xf6\x3f\xbe\x19\xac\xb9\xed\xf7\x07\xbf\x37\x9f\x7c\xfb\x6d\xf8\xcb\xc8\x73\xdd\x28\xee\xbe\x5c\xf9\xba\xd5\x6e\x7f\x59\xfa\xdc\xe8\xbd\xdc\x6d\x6f\x77\xdf\x9c\x2f\xaf\xbd\x6d\xb7\x9f\xff\xfe\xa5\xfd\x6e\xcd\xdd\x1d\x6d\xbe\x1a\xef\x86\x7f\x1c\x2c\xb3\xf6\x9b\x6e\xfb\xd5\x9b\xad\x76\xfb\xb7\x51\x7b\xf8\xaa\xbf\xdd\xfe\xd0\x6d\xbf\x73\x83\xe6\xf2\x61\xf0\x9c\xbe\x7e\xe5\xef\xbb\xed\xf1\xe2\xc7\xcf\xbf\x75\x9b\xdf\x76\xe3\xb7\xaf\xfc\xa7\xed\xcd\xdd\xf6\xbb\xf1\xc7\xdd\xfd\x57\xdb\xed\xdd\x6f\xbd\x91\xbf\xf9\x6d\xb5\xfb\x72\x30\x6e\x6f\x0f\xd8\xf3\xb7\x6b\xcf\xa2\xc3\xcd\x9d\xf1\x07\xff\xcb\xfe\xa7\x46\xa3\xfd\x92\x7d\x3e\xd8\xf5\x57\xdb\x6f\x3e\xb7\xfd\xe6\xbb\xd5\x57\x97\x3d\xda\x7e\xb9\xbb\xb6\xf6\xfa\xbc\xbd\xdf\xfb\x63\x78\xf8\xee\xcd\x97\xf1\x07\xe7\xcb\x17\x7f\x73\x3c\xdc\xfe\xdd\x19\x46\x07\x97\xcd\x77\x3b\xc3\x2d\xe7\x63\xf4\xe9\xdd\x93\x37\xcd\xf7\x5d\xff\xf5\x1b\x37\xfa\xb0\xbc\xf9\xf2\x8f\xf1\xb3\xd7\x5f\x87\x7f\xbc\xfc\xad\xdf\x3e\xff\x65\xf9\xeb\xeb\xd7\x51\xef\x5d\xb3\xdb\xbe\xd8\x1d\xed\xfc\xb2\xb5\xf3\xad\xfd\x79\x3f\xf1\x2e\x36\xcf\xdf\xbd\x5d\xfb\xb0\xfd\xee\x5d\xd0\x6b\x1f\x3e\xf1\x83\x8b\xf3\x5e\xe7\xe2\xd9\xab\xf3\xe4\xfd\xf0\x53\xaf\x1d\x05\xaf\x06\xaf\x3f\x8f\x9b\x1f\xa2\x60\xf7\xeb\x1f\xbb\x49\xfc\xa6\xdd\x7e\xf7\xfb\xa7\x57\xed\xb6\x3b\xfe\xb8\xb6\xd9\xdf\xfd\xa3\xdf\xde\x7e\xf5\x0b\x5b\x6b\xb2\xe7\x09\xfb\xf8\xf5\x03\x5b\x3c\xf7\xfc\x81\x37\x4e\x7e\x71\x2e\x5e\xbe\xf6\x47\x9f\xdf\x6f\x0f\xf7\x57\x3f\xbe\xfc\xe5\xd7\xbe\xfb\xee\xdb\xef\xcf\x3f\x3a\xd1\x07\xaf\xff\xe6\xa0\xf1\x7e\xb5\xf1\xeb\xcb\xfd\xcf\xdd\xbd\xf3\xad\xc5\x8b\xf6\x76\x67\x75\xff\x37\x6f\xbb\xff\x6e\xd8\xfb\xb8\xf5\x61\xb7\xff\x32\xe9\x7c\xe8\xad\x6e\x8d\xde\x9c\x7d\xdc\x79\xd3\x1e\xbd\x7b\xb7\xba\xdb\x5e\x6a\xb7\xb7\xce\x5e\x5f\x36\xbf\xb6\xf7\x9a\xab\xaf\x46\xdd\xa7\xe1\xda\xe0\x5b\x97\x7d\x6d\xb3\xf0\x63\xf8\x5b\xb0\xdd\xf8\xd8\xde\x79\x3a\xfc\xfa\x72\x7b\xff\x6b\xff\xd7\xb3\xf3\xaf\xef\x97\x2f\x97\xdf\x5d\xf4\x46\xaf\x5e\xee\x74\x37\x77\xa3\xee\xef\x07\x3b\xed\xc3\xf7\xdf\x56\x2f\x0e\x7e\xd9\x1d\xbf\x7c\x12\x7c\xf9\xf2\xf4\x70\x87\xed\xf5\xbf\xae\x7e\xf8\xed\xcd\xe6\xea\xca\xfb\x8f\xbd\x37\xed\xf6\xf6\xdb\x83\xf6\xd6\x97\xf3\x97\xdf\xde\x47\x3b\x7f\x9c\xfb\x8b\x5b\xdd\xf6\xcb\x67\x9b\x6f\xb7\x3f\x6e\x5d\x3c\x5f\xea\x7e\x7c\x99\x7c\x1b\x7d\x7a\x7b\x31\x7e\xbf\xd4\x0b\xdf\xee\xfd\xb6\xff\xe9\xc9\xce\xe8\x77\xfa\xe1\x70\xb3\x11\x85\x2f\x7f\x75\x2f\x0f\x0e\x5f\x1f\xee\xb6\x3f\xbf\xdd\xfd\xba\xd6\x6f\xb7\x97\xde\x6f\x1f\x3c\x89\xde\x0d\xb7\xb7\xe2\x41\x63\xff\xdb\xeb\x77\x8b\xd1\xeb\xf7\xfe\xd0\x59\x7b\xf6\xb6\xe1\xbd\xdd\x7f\xb7\xda\x68\xd3\x57\xab\xbb\xed\xc5\x37\xab\x4f\xdf\x7d\x63\xed\xf8\xe9\xc5\xdb\x67\xfd\x4d\xba\xb7\x7a\xe1\xc7\xaf\x46\x83\x6e\xf4\x6a\xf5\x60\xeb\xcd\xab\x6d\xf6\xa9\xfd\x65\x71\x74\xf9\xf6\xdd\xc1\xef\x1f\x5f\x85\xa3\x8b\x83\xb5\xdd\x27\x2f\x3f\x35\xdc\x91\xfb\xaa\xff\xfa\xe5\xc1\xab\x8f\x07\x3d\xf7\x65\x37\x66\x4f\x9f\x7c\x6a\x9f\xef\xbe\x1a\x6d\x35\x9c\x43\xf7\xb7\xf3\x8b\x37\x8d\x83\xdd\xaf\x97\xec\xd7\xf6\xce\xef\x7f\xbc\x3a\xf8\xad\xb7\xfb\xdb\xbb\xc6\xe0\x6c\xa7\xeb\x46\xef\xba\x83\xce\xd6\x3b\x67\x77\x65\xad\xf3\xfa\xe0\x8f\xf1\xc5\xee\xa7\xb5\xf3\x2f\x74\xb0\x17\x75\xe3\xc5\xfd\xed\xf6\xe7\xcb\xdf\x46\x9b\xce\xd7\xc8\x1f\xfa\x7e\xe3\xfd\xd6\xeb\xc1\xb7\x3f\xce\xc3\x67\xed\x1d\xf7\x60\x73\x35\xa4\x87\x9b\x6f\xc7\xfe\xfe\xda\xc1\xfb\xd5\x1d\xba\xd8\x7e\xce\x0e\x7a\x3b\x6f\x0f\x0e\x9c\xf3\xa5\x9d\x57\x5f\xce\xb7\x9d\xc5\xcb\xb7\xdb\xc3\xdd\xdf\x76\x3e\x87\xab\x17\x5b\x9f\xcf\x3e\xbd\x7a\x19\x7d\xfc\xda\x5e\x0b\x68\x34\x7a\x3a\x7c\x33\xee\xc6\x9b\xc9\x6e\xff\xfc\x7d\x3c\xe8\x8f\xc7\x21\x1b\xfd\xf2\x6a\x7f\xed\xe3\xf9\x47\xb7\xb7\xfb\x32\xdc\xfb\xdd\xdd\x7c\x72\xf1\x7b\x2f\x7e\x1d\x36\x07\xbf\x5f\xbc\x74\x06\x6f\x3f\x6c\x3e\x3b\x1b\x75\xde\xff\xb6\x3d\xda\x3f\x18\x3d\xed\xd3\x4f\xee\xf9\xce\xe2\x81\xfb\xee\xf3\xcb\xdf\x0e\x46\x1f\xcf\x76\xdb\x07\xbf\x8d\xde\xf8\x83\xb7\x8d\xc0\x71\x9b\xbb\x1f\x9f\x8c\xbe\x74\xfc\xfd\xc3\x37\x17\x3b\xe7\x9b\x4f\x29\xdb\xef\x0c\x46\xed\xd7\xbf\xbe\x7c\x19\x36\x0f\x36\x7b\xdf\xda\xab\xce\xa7\xc1\x60\xf7\xec\xb7\xe1\x9a\xff\xdb\xce\x66\xbf\xd3\xeb\xef\xf7\xfb\x67\xbf\x85\xfd\xd1\x2f\xaf\xce\xbb\x83\xb3\xe0\xbc\x1b\x9c\x8d\xbf\x7d\xb9\x5c\x69\xb2\xdf\x9e\x6d\xed\xb1\xd1\xd9\x6f\xa3\x97\xcb\x7f\x6c\x79\x71\xb2\xf8\xb6\xdd\x06\xa6\x7b\xe6\x9c\xd1\xe0\x03\x1c\x60\x5f\x05\xd1\x08\x9c\x17\x7f\x90\x4e\x7a\xe0\xc9\x1c\x17\x70\x4e\xde\xf8\xdd\x1e\x8d\xf7\x63\x8f\xc6\xca\xef\x4f\xe1\x8e\xfb\xa4\x52\xbb\x0b\xd8\xef\xdf\x0b\x3c\x2b\xd6\x9c\x70\x2c\xf6\x0a\xc1\xa2\xe5\x56\xa6\xae\x2a\x4c\xed\xf6\x96\x51\x46\xe8\x3b\xb9\x64\x6e\x56\x95\x07\x0b\x1d\x01\x5f\x65\xa9\xdb\xd3\x54\x53\xc6\xfd\x8a\xda\x1a\xe5\x9b\xc1\x4a\x19\xce\x78\xb9\xd0\xae\xe7\x6e\x83\xef\x9d\x90\x8b\xd6\xd4\xb3\x82\x2d\x72\x40\xad\x22\xdc\x88\x4b\x6b\x9f\x89\xad\xcf\x13\xf6\x61\x75\x65\x31\x0d\xfe\x30\x60\x14\x58\x16\x2f\xeb\xd5\xfb\x27\x78\x5a\x41\x89\x1f\x0e\x86\x09\x71\xe5\x6c\xd4\xa0\xd7\x23\x3f\xe9\x49\x04\x28\x14\xab\xc4\xb2\x65\xad\x66\x5a\xcf\x58\x6e\xba\xf0\x54\xf6\x25\x0f\x54\x19\xbd\x66\xff\x33\x53\x83\x20\xbe\x95\xe8\xa6\x31\xad\xe0\x54\x49\xa6\xb2\x3e\x6e\xca\x06\x54\x69\x78\x50\xc0\xc0\xed\x5a\x42\x2f\x13\xf3\x64\x89\x33\x6b\xcb\xe3\xba\x3d\xbc\xd9\x57\x70\xcc\x13\xa4\x10\x5e\xc0\x17\x1a\x00\x29\x16\x76\xd3\xf0\xf4\x30\x6c\xdf\x61\x00\x26\x75\x18\xc9\x19\x7b\xa5\x82\xa6\x65\x08\x2c\x35\x34\xb3\x8b\xd0\xbd\x1a\x9a\xdb\x6b\x8b\x03\x9d\x33\x0c\xd9\xf0\x8c\xb9\xb1\x7f\x46\x77\x3c\xb2\x21\xfc\x84\x15\x55\x37\x74\x7a\x78\x1f\xc0\x0f\x86\xdf\xbf\x73\x82\xf2\x93\x12\x23\x81\xf3\xc7\x98\x50\x7e\xda\x73\x12\xea\xd5\x8c\xe2\x92\x86\x6d\x51\x4f\x8e\xac\x26\x3c\x1e\x96\xd5\xec\x7c\xff\x9e\x5d\xc9\x0a\xdc\x75\x5a\xb7\x87\xfd\xcc\x1c\xab\xeb\x75\xb2\x7d\x39\x88\xa4\x01\x49\x42\x59\x42\x06\xc3\x98\xa7\xb0\x9a\xba\xc5\x36\x16\x36\x1e\x8f\x72\x69\xed\x48\x0f\x1e\x75\x2f\x6a\xa5\x6c\xf9\xde\x6e\x34\x0c\xe5\x75\x5b\x9e\x22\x26\x53\xd6\xb2\x72\x36\x08\x49\x2a\x5c\x8d\x29\x50\xd7\x62\xf6\x44\x15\x61\x52\x95\x12\xb7\xcb\x88\x50\xd3\xc0\x3a\x31\x19\xa0\x35\xd1\xcb\x35\x46\x93\x03\x3e\xd9\xe5\x2b\x39\x63\xc8\x38\xae\x0d\x65\x1a\xb1\xbe\xae\x25\xd2\xcd\xf8\xdd\x29\x0c\x7d\xf1\x83\xe0\x73\xd8\x9f\x16\x49\x46\xf1\x14\x9e\x40\x51\x9c\xc5\x86\xe1\x49\x32\x3d\xa8\x5c\x1c\x19\xb5\x53\x58\xca\x02\xb7\x07\x3e\xcd\xb0\x2d\xff\x7c\x79\x03\xcd\xf8\xe8\x33\x09\x19\x0f\x94\xaa\xab\x76\x10\x78\xc5\xe9\xaa\xe2\x02\x5c\x28\x46\x34\xc5\x1a\xf3\x26\x17\x6e\x4d\x4c\x61\xd5\x88\xe0\x5f\xc9\x9b\x41\x6d\x7d\x20\x3a\xa3\xc8\x5f\x68\xa5\xca\xe9\xde\x65\x38\xaf\xe6\x6a\x02\xa5\x2a\x74\x79\xc1\x54\x98\xc5\xd6\x53\x20\x6c\x97\x82\x30\xe0\xf4\x71\x58\x0f\xdc\x40\x4d\x49\x6d\x50\xf2\x45\x83\x86\xb9\xe7\x9c\x53\xbe\x7c\x54\x71\x69\xcd\x92\x37\x64\x61\x8a\x2e\x14\x5b\x35\xed\x9c\x79\xa4\x4b\xa5\x14\x6d\x2b\x77\x52\xb4\x81\x8e\x33\x8a\x8a\x24\x2c\xb0\x3e\xe7\xd0\xc9\xcb\xa1\x1f\x24\x4b\xbe\xb8\x17\x22\xb1\xf4\x28\xcb\x6a\xd2\xf4\x0d\x1f\xe1\x91\x0d\x80\x57\xc3\xaf\x3c\x73\x74\x95\x93\x1a\xc8\xc4\x30\xca\x7f\x95\xc6\x70\xc7\x8d\xc2\x02\xdc\xac\xad\x81\x01\xe8\x0d\x0d\x29\x6d\x29\xb6\x62\xbe\x6b\x90\xce\x1d\xba\x34\x49\x19\x4b\xa4\x84\xc5\x22\xe5\x04\xef\x5c\x45\x12\x89\x78\x0d\xf2\xe7\xe8\x28\xac\x89\x9b\xe8\x12\xfe\xc7\x4f\x5c\x76\xea\xea\x75\xe3\x15\xe3\x72\xa3\xf9\x14\xde\xcd\x75\xa3\x25\x9a\xf4\x68\x4c\x87\x7d\xd2\x1e\x26\xbd\x28\x66\x73\xe0\x51\xcb\x67\xe2\xe1\x21\x23\x03\x27\x4e\xe4\x33\x60\xb3\x7c\xe0\x9f\xc5\x4e\x3c\xae\xcd\xd5\xeb\x73\xc2\x0b\x57\x4e\x36\x87\xd0\xf9\xff\xd9\x7b\xf7\xee\xb6\x71\x5d\x51\xfc\xef\xc9\xa7\x40\x7b\xce\xa9\xa5\x46\x76\x6c\xa7\x4f\x67\xd2\xec\xb4\xcd\xcc\xce\xd9\x7d\xad\x26\x33\x73\xf7\xc9\x2f\xcb\x95\x2d\x3a\x56\x23\x4b\xde\x92\x9c\xd8\xd3\xe6\xbb\xff\x16\x01\x3e\xf5\x70\x1c\x27\xed\x9e\x73\x6f\x3b\x6b\x4d\x2c\x3e\x40\x10\x04\x41\x90\x04\x81\x94\x31\xc8\x92\x51\x7e\xe9\xa7\xac\x87\xaf\xf9\x86\x3e\x97\xc0\x41\xc8\x3b\x39\x98\xe5\x0c\xc2\x1c\xfc\x38\xd8\x4a\x52\x61\xbb\xc0\x41\x86\xb9\xf1\x56\x32\x67\xe9\x24\x93\x78\xfc\xfa\xee\x37\x78\xc3\xb2\x8c\xa5\xf0\x2b\x5a\x30\x45\xf0\x61\x36\x88\xc2\x21\xbc\x11\xcf\x29\xfd\x0c\xa6\x3c\x25\x1b\xa3\x25\x22\x07\xc7\x2b\xfe\xc2\x51\x39\x12\xa8\xc0\x2f\xc9\x2c\x0e\x7c\x7a\x8c\x26\x3c\x1a\x0b\x4f\x03\xb0\x2d\x9b\x12\x00\x3d\x48\x52\x0e\xc4\xa1\xe7\x88\xa9\x30\x31\x72\xf1\x91\x74\xe4\xe7\xba\xea\x0a\x04\xd1\xfd\x56\xae\x09\xc7\xc9\x94\xef\x0f\xfc\x9c\xf7\x5a\x3e\x5e\x9c\x65\x6c\x34\x8b\x3c\x0e\x6d\x30\xcb\xe1\x8f\xc3\xe3\xbf\xbf\xff\xed\x18\xf6\xdf\xfd\x13\xfe\xd8\xff\xf8\x71\xff\xdd\xf1\x3f\x77\x50\x0c\x26\xb3\x1c\xd8\x85\xf0\xc0\x17\x4e\xa6\x51\xc8\x02\xb8\xf4\xd3\xd4\x8f\xf3\x05\x24\x23\x0e\xe1\xed\xc1\xc7\x57\x7f\xdf\x7f\x77\xbc\xff\xf2\xf0\xcd\xe1\xf1\x3f\x21\x49\xe1\x97\xc3\xe3\x77\x07\x47\x47\xf0\xcb\xfb\x8f\xb0\x0f\x1f\xf6\x3f\x1e\x1f\xbe\xfa\xed\xcd\xfe\x47\xf8\xf0\xdb\xc7\x0f\xef\x8f\x0e\x5a\x70\xc4\x70\xd7\xc2\xeb\x5f\x4f\xf3\x11\x8e\x5e\xca\x80\xde\xd6\x67\x92\x12\xff\x4c\x66\xe2\xc9\x37\x8c\xfd\x0b\x2e\x28\x87\x2c\xbc\x60\x01\xf8\x30\x4c\xa6\x8b\x95\x07\x95\xc3\xf2\xa3\x24\x3e\xa3\xdb\xd8\x3a\x86\x84\xc3\x11\xc4\x49\xee\x41\xc6\x18\xfc\x3c\xce\xf3\x69\x6f\x6b\xeb\xf2\xf2\xb2\x75\x16\xcf\xf0\x38\x50\x3c\xb9\xcd\xb6\x5e\xb4\x70\x8b\x16\x66\xef\x66\x51\xf4\x3e\xfd\x4d\x59\x95\x91\x18\xc8\xc8\x21\x74\x28\x78\x3f\xe4\x04\xc6\x47\x64\x03\x9a\x19\x25\x8f\x1a\xb4\x5d\x2b\x83\xdb\x95\x53\xbe\x55\x95\xa7\xed\x99\x8a\x99\x8e\x6c\xad\x20\xfc\x14\x12\xa6\xbf\x10\x71\x77\x6f\xe5\x35\xb4\xb3\x0f\x5a\x45\x39\x7e\x6f\x0e\xdf\x1e\x1e\x1b\x38\xc9\x6f\x6a\x62\xc2\x26\x49\xba\xe8\x41\xb7\xdd\xf6\xb8\xee\xfe\xd6\x9f\x87\x93\xd9\x44\xf8\x70\xe4\x63\x45\x25\xc8\xc5\x66\xe6\x4f\xa6\x11\x13\xc6\x37\x79\xea\x8f\x46\xe1\x70\x59\x5d\x51\xa4\xa2\x72\x94\x9c\x61\xc5\xea\x7a\x51\x72\x96\xb5\x78\x0f\xc4\xc4\xca\xc2\x80\x0d\xfc\x14\x26\x2c\x9e\xa1\x35\x10\x1f\x21\x7c\xb7\x8b\xba\x4c\x9c\x03\x9f\xdf\xca\x4e\x7a\xe0\xf3\xed\x47\x82\xf3\x23\x63\x20\xbc\x78\x65\x34\x5e\xc7\xfb\xbf\x1e\x19\xe4\x10\x9f\xe5\xb7\x90\x58\xd6\xda\x80\x8d\x13\xae\xe4\x7d\x81\x3c\xcc\xf9\xe2\x75\xff\xef\xc9\x84\xdd\x27\x1f\x3f\xf4\x6f\x38\x46\x0f\x41\xba\xc4\x2b\x9e\x60\x15\xc9\x53\x3f\xce\x7c\x6c\x2a\x33\x4b\x1e\x1b\xe9\x56\x85\x98\xe5\x97\x49\x7a\x6e\x96\x7d\x47\x49\x56\xb1\x6c\x91\xe5\x6c\x62\x96\x3a\xc2\x14\xab\x10\x27\xab\x59\xe4\x4d\x72\xc6\x1b\x23\x45\x93\xb4\x36\x34\x24\x0f\xe3\x33\xa4\x30\x3e\xbf\xca\x60\x18\xa6\xc3\xd9\x24\xcb\x7d\x74\x43\x47\x0f\xb2\x26\x0c\x86\x7e\xc6\x32\x0f\xb2\x84\xcb\xb0\x30\x33\x1c\x44\x84\x31\x3e\x38\xe7\x42\x3e\xca\x12\x3a\xfa\xc0\x15\xaa\x25\xdb\xc0\x25\xe7\xd2\x27\x9b\xb5\x49\x98\xe5\x8b\x29\x6f\x94\xaf\x3f\x29\x97\x6c\x6a\x27\x5b\x7c\x0a\x76\x6c\x6a\xf0\xc7\xf8\x82\xeb\xa4\x11\x06\x78\x13\x7b\xce\x16\xfa\x2a\x57\xcd\x9e\x63\x79\x7b\xcb\xa1\xbc\xde\x3f\xde\xef\xff\xe3\xe0\x9f\x26\x07\x98\x69\xd5\x6c\xf0\xfa\x1f\xc6\x3e\xfe\xe4\x3e\xcd\x88\xfb\x1e\xdc\x17\xfc\xcd\x7f\x72\xda\xde\x3f\x2d\xf8\x3f\x39\x67\x0b\x13\xdf\xd7\xff\x90\x0f\xd0\x34\xaa\x42\x5b\x16\xc8\xbe\xfe\x87\xc4\x96\x13\x89\x4d\xa6\x09\x2e\x22\x4d\xc8\xfd\x73\x46\x3e\x27\xe0\x2d\x5f\x7e\x42\x3f\x6a\xfe\x76\x48\x7d\xfa\xb8\xff\xc7\xc1\xc7\xfe\x1f\x87\xaf\x8f\xff\x6e\x76\xcb\x4e\xee\x3e\x6a\x97\x14\xe7\xa5\x5e\x9f\x7e\x44\xb2\xf9\x11\xc9\xe6\x86\x91\x6c\xf0\x3c\x2f\xf6\x27\x4b\x3a\xda\xbd\x0b\xd8\xb7\xe8\xa8\x0d\x68\x3d\x64\xaa\x82\x0f\xd6\xb1\xed\xb6\x0c\xd9\xf3\xff\xf6\x53\x5a\xbd\x1f\xa3\xe3\xf0\x3f\x48\x8b\x35\x9e\x5b\x26\x83\xcf\xd8\x44\x26\x3b\x44\xd5\x49\xf0\x9a\xe4\x08\x71\xbf\x26\x7b\xc0\x6b\x28\x8b\xef\xd0\x85\x17\xbb\xd0\x36\xec\x84\xc0\xf4\x57\xb6\xbc\x9b\x88\x40\xe8\x9a\x95\x45\x4f\x43\xde\xcf\x64\xf0\x19\x09\x5a\xee\x5e\x4d\x0c\x8f\xa3\x59\x3a\xf2\x87\x4c\x05\xf1\x50\xee\xe4\xcc\x90\x0c\xb7\x75\xec\x6c\x5c\x41\x78\x77\xe1\xa6\xb9\x00\x8f\x77\xe4\x65\x32\xbf\xb5\x6f\xe2\xf5\x20\x98\x9e\x89\xd7\x73\xdf\x6e\x42\xb8\x0b\x1f\xda\x77\x40\x61\xe5\x21\x79\xa8\x1f\x4a\xad\xef\x5a\x7e\x03\xe8\x1d\xe5\x7a\x3e\x48\xc9\x31\x2e\xc7\x65\x1c\x46\x41\xca\x6e\xe1\x36\x7b\x6d\x57\xa6\xb7\x08\x8e\x10\x27\x01\x5b\xcf\x0b\x32\xaf\x79\xea\xf2\x0d\x86\x12\x4c\x62\xba\x3a\xf2\xc5\xfe\x86\xb0\x6b\x14\x94\x91\x0f\xf1\x5b\x32\x41\x6a\xd5\xe4\xcb\x5d\xe6\xe2\x97\xcc\x12\xae\xd6\x65\x1e\x7d\xca\x4c\x31\xb5\x54\xae\xf8\x96\xd9\xe6\xab\x2d\xd1\xb0\x4c\x91\x45\xc8\x19\x93\xcc\xc6\x2f\x99\x95\xf0\x4d\x32\x99\x89\xd7\x88\x5b\x71\x7d\x75\xd2\x90\xfd\x69\xe0\x19\x6e\x90\x8f\xf9\x0f\x42\x95\xff\x12\x68\xa1\xdf\x72\x89\x00\xba\xa5\xe6\xcd\x35\x84\xb9\x24\xae\x3f\x17\x67\xbf\x73\xb1\xb7\xab\x7a\xf6\xf5\x2b\x7c\x91\xb3\x8e\xe8\xa2\x66\x8f\x20\x05\x97\x0b\x6d\x8f\xcf\xed\x36\xed\x3f\xd0\xce\xd5\x5f\xc8\x60\x50\xbb\x37\xd6\x08\x1c\xd7\x69\xa4\x6c\x38\xf6\xd3\x3c\x6b\x66\x34\xa4\x0d\xfb\xc5\x99\xf0\x9b\x93\xe7\xe9\x4a\xe1\x94\xaa\x23\x0d\x9f\x63\x38\x25\xbc\x33\x44\xc7\x60\x78\xaa\xb4\x9f\x8b\x63\x9e\x8c\x02\x2c\xd1\x28\x58\x16\xa5\x37\xd0\x54\x5b\x7e\xe1\x22\x02\xc7\xb6\x91\x5d\x48\xcb\x63\xfd\xfe\xf3\xca\xa3\xfe\xe8\x7b\x11\x43\xb8\x68\x7a\x5a\x2c\x2b\xc7\xc4\xe2\x55\x35\x32\x26\x8b\xf5\xc0\xe2\x2d\xb5\x26\x88\x11\x6f\xcd\x61\x13\x1a\xe8\x08\x49\xa6\x2c\x4a\x29\x34\x4b\x8a\xa9\x85\x19\x41\x07\x6a\x3d\x68\x74\x5a\x9d\x86\xd8\x1d\x09\x67\x37\x82\x49\x37\x00\xc8\x59\xa9\x98\xad\x56\x88\x23\xf5\xfb\x36\xfe\x71\x05\xe0\x92\x87\xdc\xe7\x4b\xdd\xd2\x7d\xef\xbd\x52\x3f\x4b\x87\xfd\xa9\x9f\x8f\x6b\x15\xcf\xa7\xa8\x79\x1a\xc0\x53\x26\x08\xe0\x0c\xc2\x38\x08\xe3\x33\xd7\x26\x85\x56\x9f\x03\xa7\xb2\x3b\xf7\xfd\xfb\xfa\x46\xd3\x31\x4e\xcf\x57\x44\x14\x49\xbc\x83\x1b\xde\xd2\xc5\xc7\x52\x7f\x4a\x77\x43\xdc\x6f\xd5\x7b\x7f\x90\x51\xa7\xee\xb0\xad\xa0\xae\xad\xdc\x8f\xbb\x77\xde\x1a\xab\x69\x6d\x98\xdc\x7d\xcf\xc6\x35\x6d\x4d\xfc\xf9\x9d\xb7\x15\xd6\xb5\x15\xc6\x77\xde\xd6\x79\x4d\x5b\xd9\x37\x68\x2b\xaa\x6b\xeb\x5f\x69\x7e\xe7\x8d\x8d\x6a\x1a\x63\xd3\x2c\x8c\x92\xbb\xef\xdc\xe7\x9a\xf6\xa6\xe1\x9d\x37\x75\x56\xd3\xd4\xd8\x8f\x46\x1f\xee\xbe\xb9\x49\x4d\x73\xb9\x3f\xab\x6d\x2b\x9c\x4c\x66\x39\xdd\x08\xd4\xad\x5b\x03\x5c\xb7\x7c\x3e\x59\xd7\x84\x30\x24\x08\x9c\x55\x71\x8f\xea\x0f\xf8\x6a\xfa\xd6\xcf\xc7\x2d\x2e\xdc\x28\x8d\x4b\x1e\x95\x8a\x62\x08\xd3\x87\x89\x2a\x8b\x18\xd0\xcb\xb6\xb9\x4c\xe3\xd3\x9a\xd2\xc2\x58\xa5\xc9\x76\x32\x9d\xa6\xda\xe6\x3c\xac\x12\x39\x3f\xd3\xb6\x59\x70\x1b\xec\x42\x87\x35\x3b\xa2\xed\x69\x28\x4b\x7e\x38\x94\x2e\xde\xf9\xc8\x71\x55\x20\x84\x2d\x10\xc5\x72\x7f\x06\xbb\xd0\x85\x87\x9c\x87\x8c\x93\x08\x4e\x32\x67\x6e\x59\xd3\xcd\xe1\x05\x74\x60\x0f\xda\xd0\x83\x39\xfc\x0c\x4d\xfe\x31\x0d\xa1\x27\xfa\x4d\x35\x6c\x57\x97\x9c\x6e\x65\x30\xbb\x08\x47\xe0\x83\xc0\x76\x09\x5a\x53\xa5\x11\x48\xaa\x8d\x20\x0b\x6b\xe2\x52\xef\x7b\x77\xb3\x26\xde\x4c\x35\x52\x48\x64\x2c\x0d\x59\xe6\x91\x53\x19\x6d\xeb\x79\xcf\x71\xf8\x08\x51\xae\x38\xa2\x72\x39\x45\x5d\xd7\x78\x0e\x6a\x1f\x6c\x79\xf0\xd9\x83\xac\xed\x41\xd6\x51\x55\x4f\x10\xee\x49\xfb\xf4\xd4\x83\xd8\x83\x09\xcf\xe8\xe8\x23\x2f\xf8\x19\xe2\x1d\xd8\xdc\x0c\xe5\xc9\x7a\xd6\xc6\x12\x55\x30\xd0\x05\xb1\xba\x46\xf8\x4c\x4f\xe0\x3e\xc3\xcf\x30\xe1\x10\x3e\xeb\xb3\xf9\xac\x73\xf2\xf9\xf4\xa4\x73\x0a\x9b\xbb\xe2\x77\x1b\xbd\xa0\x67\xef\xfc\x77\x4e\xd6\xa6\x4c\x17\xf6\x80\x7e\xb7\x4f\xa1\x07\x32\xd9\x78\x3e\x46\xc6\x07\xf6\x40\x76\xda\x4b\x1d\x05\xfe\x05\x46\x52\xef\x76\x4b\xe3\xe7\x41\x22\x1c\x89\xee\xf3\x7d\xba\x13\xe3\x06\xea\x72\x1c\x46\x0c\x9c\x66\x33\x16\xe7\x6d\xc9\x49\xcc\x01\xc7\x86\x41\x6e\xb2\x53\x4d\x8c\xdb\xf9\x39\xa4\x0b\xd7\x5f\xe4\xe4\xab\xf3\x02\x29\xb6\x0d\x61\xf6\x86\x5c\x84\xd4\x9c\x45\xd3\x93\x29\xe9\x30\x6b\xcc\x86\xe7\x19\xe7\xe4\x4f\x78\x57\xf5\x09\xc2\x8c\xbc\x2d\x34\xa3\xf0\x9c\xb5\x60\x5f\x18\xfe\x84\x19\x86\x22\x0e\xe9\xae\x51\x97\xe0\x55\xc3\xbc\x81\x3e\x8f\xe3\x24\x37\x7c\x73\xe1\x95\xe5\x18\xaf\xc1\x08\xb6\xa0\xee\x27\x34\x01\x68\xa0\x8f\xdd\x30\xce\xd9\x19\x4b\xe1\x0c\xf7\x7c\x29\xcf\x89\x21\x49\xd1\x07\xf2\xbf\x66\x7e\x04\x79\x02\x9f\xda\xe4\x0b\x21\x62\x59\x26\x0b\x18\xb9\xef\xe8\x08\xef\xed\xfe\xff\xe9\x1f\xed\xff\x72\xd0\x3f\x7c\x77\x7c\xf0\xeb\xc1\xc7\x4f\xd2\x75\xf2\xdf\xc8\x8b\x1d\xfe\x9c\x30\x5e\xf6\xfd\x08\xfa\x94\x13\xc6\x43\x06\x8f\x5a\xed\x56\x1b\xbf\x65\x8c\x32\x78\xe3\xc7\x67\x98\x32\xf5\x53\x7f\x02\x5f\x1e\x5e\x09\x2a\x1c\x8f\x99\xf8\x95\x27\xf4\x30\x07\x9d\x87\xfd\x4d\xde\xa5\x7f\x19\x24\x49\xc4\xfc\xf8\x0a\x3e\x8a\x94\x4f\x79\x8a\x54\xad\x21\xb0\x47\xbe\x2a\x3e\xe1\x1b\xd6\x4f\x04\x8c\xcd\xf1\xce\x58\xe0\xdf\x6f\x85\x19\xb2\xe1\x9b\xf0\x9c\x39\x27\x1d\x0f\xba\x1e\x6c\xa3\x05\xdd\x43\xd8\xda\x82\xdd\x17\x64\x00\x53\x55\x3a\x48\x86\x78\x2a\xde\x1a\x24\xc1\x42\x1d\xe2\xac\x54\x55\xc4\x8b\x58\xa1\x64\xbf\x15\x27\xc9\xd4\x2c\x4a\x41\x5c\x38\xcb\x1b\xd7\xfe\xba\x42\xd9\xf7\x2b\x91\xf4\x9e\xb8\xe7\x7f\xf0\x40\xf1\xb0\x63\x32\x8e\x8b\x6f\x62\xf5\x44\x10\x80\x76\xaa\x5d\xe1\xea\x06\x2b\xe6\xe3\xed\x5e\xa9\x92\x95\x7d\xc6\xde\xfa\xf9\x70\xcc\xea\xdc\xb2\x3e\xeb\x3c\x17\x33\xd2\x28\x6b\x44\x62\xa9\xac\xd3\x95\x8e\x6c\x65\x50\xb5\xba\x82\x6d\x35\xdb\xb1\x9f\x75\x42\xe1\x99\x28\x36\xbd\xa6\xdd\x6d\x53\x28\x70\x2e\xe7\x38\xa3\x95\x0d\x1e\xc3\xa8\xa0\x83\x9f\xfa\xad\x30\x47\x6f\x4a\x4c\xcf\xb0\x69\x1a\x5e\xf8\x39\x2b\xcc\x98\x13\x1c\x9e\xdd\x7e\x4b\x76\xe5\xb4\x30\x7d\xc4\x5b\xf4\x3c\x41\x49\x20\xa0\x16\xe6\x93\x1c\x6b\x3d\xa1\xd0\xfa\xc7\x28\x6c\x30\x19\xc7\xf9\x50\x64\x99\x5c\xb6\xb5\x05\xaf\xd1\xd3\x72\x96\x27\x29\xbd\x52\xf8\x44\x96\x24\x9f\x20\x65\x19\x5f\x42\xc2\x18\x6f\xeb\x85\x59\x09\x47\x09\x1f\x7c\xf8\xf0\xdf\x87\xc7\x30\x98\x9d\xf1\x02\x47\xfe\xc8\x4f\x43\x78\x2e\xfc\xc3\x1d\x31\x66\x87\xe1\xb8\x64\x83\xf3\x30\x47\xeb\x9b\x6c\x9c\x5c\xf6\x07\xb3\xb3\xd6\xf0\x2c\xdc\x0b\x83\xdd\xce\xe3\x27\xed\xed\x47\x15\xc6\x43\x96\x4b\x0a\x22\xcd\xee\x2e\x34\x64\x97\x1a\x25\xa3\x98\x68\x26\xde\x8d\x50\x4d\x55\xc5\xb4\x4a\x16\x85\x25\xdd\xcd\xf2\xa5\x96\xe8\xa8\xb4\xd8\x8e\xe0\x2a\x41\x44\xa1\x2e\xec\x55\x31\x32\x15\x39\x69\x9f\x0a\x9f\xce\x5c\x63\x10\xe5\x7b\x66\x79\x35\x59\x09\x17\xb9\xc1\xb1\xa0\xd4\x4c\x65\x73\x58\x2b\xe6\xf2\x52\x43\xd8\x1f\xf7\xf9\x77\x75\x9f\xff\xe3\xf6\xf7\x87\x23\xe5\x1f\x8e\x94\xbf\x93\x23\x65\xbc\xb8\xa0\x18\x78\x3b\x7f\x69\xbf\xbb\x1a\xb5\xda\x17\x69\x4e\xc6\xa2\x91\x87\xc0\x14\x6a\x3c\xc9\x6e\xfd\xa3\x7c\x58\x20\x50\xc0\xc7\x6e\x63\x3f\xe3\xcb\xf6\x80\x31\xbe\x55\xc0\x87\x5b\x61\xc6\x02\x68\x42\x36\x9b\xe2\xc3\x16\xb3\x04\x05\x82\x23\xd4\xe4\x69\xae\x4f\xfa\xa4\x5c\xf7\xf0\x7b\x77\x77\x17\xee\xd3\xba\x77\xdf\x30\x2a\xd5\x79\xba\x97\xb0\x47\xc9\x3d\xe0\x18\x17\x9c\x20\xcb\x27\x83\x4e\x36\x1b\xd0\x55\x13\xa1\x85\xbf\x65\x57\x05\x70\x9d\x81\x6f\x88\x74\x13\x1c\xbb\x42\xa6\x58\xca\xab\x87\xe6\x88\x97\xe5\x2a\x6a\xca\x32\x34\xe2\xc6\x20\xe5\xc2\xb0\x1b\x63\x95\x93\xbd\xae\x1e\x2b\x0f\xf7\x65\xf7\x61\x13\x4a\xb8\x20\xa9\x24\xf6\x9a\xd9\xb5\xc0\x26\xf1\xe5\x18\x08\x5a\xe8\x9a\xf3\xe3\x0b\xee\x0f\xc5\xc8\xf7\x50\x14\xa1\x75\xbe\x26\x8e\xf9\x06\x82\x62\x41\x1a\xe1\x1a\xf0\x51\x44\x21\xbe\x03\x5a\x26\x5f\xc1\x95\x9c\x70\x06\x71\x05\x7e\x99\xed\x7b\x65\xaf\x3a\xbd\x66\x80\x34\x6e\xc6\xcb\xc8\x5d\xa3\x48\xbd\x99\xcb\xab\x34\xc9\x32\x65\xe4\xc2\xe7\xec\x2b\xc6\xb9\x07\x1c\x9c\xb3\x7c\x65\x1c\x96\x64\x7e\xbf\xf0\xf6\x54\x33\x10\xaf\xec\x41\xbf\xf0\xc8\x49\xd5\xe4\xd9\xce\x72\x7f\xd0\xbc\x88\x7c\x1a\x25\x6f\xa8\xea\x67\xa4\x78\x19\xca\x2b\xd9\x8f\x42\x75\xa8\x3b\x93\x7c\x08\xdc\x6d\xf9\xd3\x69\xb4\x10\x75\xd5\x8a\xeb\xba\xea\x19\xb3\xe5\xee\x98\xba\x74\x62\x7b\x28\x34\x9e\xab\x5d\xfb\x54\x4d\xf4\x82\x9e\x89\x42\xb5\xab\x22\xde\xc8\xce\xc6\xd5\x2a\x6a\xcf\xc9\x7d\x45\xdd\xfb\x18\x45\x1a\xc9\x58\x78\xf9\xd5\xe0\x00\x1b\x2a\xd3\xbc\x67\xb5\xee\x9d\x6f\xa6\x27\x9d\xdc\x1f\xe2\xc5\xf9\x87\x8f\x07\x47\x07\xef\x8e\xf7\x8f\x0f\xdf\xbf\xeb\xef\x1f\x1f\x7f\x3c\x7c\xf9\xdb\xf1\xc1\x11\x5e\x9b\xcb\x80\xa7\xa4\xdf\xae\x79\xc2\x25\x99\xa0\xa0\x20\x2f\x7d\x60\xf5\x6f\x3d\x89\x2b\x9e\x20\x2b\x53\xff\x3d\x78\xe7\xbf\x83\x1e\x6c\xce\x6b\x0e\xd4\x96\xbe\x3d\xba\xdb\xbb\xd3\x95\xaf\x23\x28\x4e\x7a\x98\x8d\xd7\x05\xe3\x1b\x60\xd6\xdc\x28\x04\xdb\x7d\x3c\x5c\xaa\xd5\xce\x1f\x3d\x5d\x77\x03\x10\x6c\xd3\xb3\xb2\x69\x12\xf9\x39\xab\x57\xff\xdb\x4f\xd6\xb5\x76\xed\x0b\x23\xc4\x64\xb6\x64\x77\xf1\xe8\xd9\xda\xf6\xab\x79\x38\x3c\xa7\x48\x5b\xb5\xe0\x9f\x3d\x7f\x4a\x57\xf5\xc6\x42\xaf\xc6\xd5\xc1\xc0\xc5\xfa\xe0\x98\x82\x23\xf3\x25\x83\xa7\xb7\xe8\x13\xe5\x13\x25\xf0\xf6\xcc\x25\xc0\x19\x26\x33\xdb\x55\x41\xc0\xf5\x6f\xac\xe6\xd8\x26\xf1\xd7\x5a\xe8\x98\x43\x7d\x72\x7f\x8c\x02\x86\xda\x43\x2b\x9c\x00\x77\xe4\xc1\x49\x20\xfd\x45\x37\xa1\x73\xca\xd7\xd7\x59\x9c\x83\x9e\x65\x9d\x36\xf4\x28\xd1\x15\xcf\x50\x2d\xe4\x4b\xa1\xd7\xa8\x07\x1e\x64\x53\x36\x0c\x47\xa1\xbc\x08\x59\x1d\xed\xc2\x28\x70\x9e\xe7\x98\x4b\xf9\x41\xb8\x0b\x82\x08\x74\xcd\xd6\x8a\x48\xc6\xe1\x90\xd5\x12\x18\x3d\xca\x9a\x1d\x76\x65\xff\xa1\x23\x9d\x8e\x17\x07\x41\x3f\x1b\x09\xdb\x7c\xab\x65\x7c\x77\x78\x31\x83\x9c\xc6\x33\x94\xdc\xc7\x0b\xbc\xe0\x24\x6c\x9f\x9a\xc9\x18\xed\x2b\x38\x09\x3b\x56\x2a\x9b\x8a\xc6\x69\x17\x91\x4c\xe1\x67\x02\x61\xdc\xcc\xe4\x8c\x57\xc5\x54\x4f\xc1\xe7\x65\x3d\x09\x96\xe0\x58\xc5\xc3\xb6\x47\x68\x87\x1d\x8f\xf0\xd5\x85\x84\xab\x02\x51\xf2\x86\xec\x35\x52\xec\x75\x18\x0f\x53\x3c\x11\xa4\xa1\x52\x08\x72\xc4\x24\x1f\x19\x7d\x63\x53\x78\x01\x6d\xb3\x5f\xbe\xbe\xea\x1c\x45\x49\x92\x12\x08\xd8\x42\xcc\x5c\x78\x58\xe8\x17\x76\x95\x6e\x5a\x59\x18\x11\xb5\xea\xca\x7e\xfb\x9e\x81\x8e\x59\xa7\xfa\xf7\x73\x6d\xff\x04\xc6\x3c\xe5\xa1\x40\x79\xab\xb6\x7b\x92\x18\xc9\xb4\xb6\xf0\x77\xea\xdf\xb2\xf1\x43\x0e\x5f\x7d\xfc\x90\xf5\x57\x1d\x40\x31\x05\x83\x55\xe8\x6c\xe1\x71\x2d\x9d\x2d\x34\xae\x25\x74\x11\x0f\x4b\xa9\x46\xb1\xa3\xa5\x90\x9d\x7a\x55\x5a\x34\x1c\xbd\x58\x60\x99\x55\x06\xb0\xb0\x0e\x72\xed\xa2\x24\x22\x6f\x50\x7b\x28\x6a\x1b\x6b\xf7\x1b\xc4\x8d\x43\x5a\xae\xca\x16\x57\x7c\x09\xcc\x48\xa4\xdb\x37\x44\xca\x10\xcb\xf8\xe2\x75\xd7\x32\xfc\xb8\xd1\x2a\x51\xea\x04\xad\x12\x08\x96\xb8\x97\x37\xe3\x29\x22\xbb\xa5\x11\x29\xae\xd9\x15\xb6\x06\x9d\xf6\x5f\xea\x25\x18\x1a\x0d\xe2\xae\xa8\xfe\x19\x51\xe7\xe9\x5f\xc6\xbc\x51\x60\x6a\xd8\x37\xae\x77\xaa\xcc\x61\x2d\xd7\x58\xb7\x9f\x0a\x85\x72\x16\x63\x84\xa6\x52\xe7\x0d\x76\xa4\xbb\x30\x1c\xd5\x75\xf4\x4f\x8e\xcc\xc0\xcf\xc2\x25\x2f\xb9\xba\xed\x95\x91\x79\xc9\x21\xad\x89\xcc\xb6\x81\xcc\xab\x28\xc9\x58\xb0\x84\x3e\x8f\x6e\x86\x12\xc1\x5b\x13\xb1\x47\x84\x58\xb0\x6c\x0b\xb0\xfd\xf4\xe9\xca\x18\xbd\xf6\x73\xb6\x26\x2a\x8f\x09\x15\x7a\x61\xb2\x64\xc3\x70\xe7\x93\x66\x78\xe3\x49\x53\x40\xf5\x76\xb3\xe6\x09\x01\xa3\x13\xcc\x25\x83\xf0\x6c\xe5\x41\x20\x81\xbc\xe6\x30\x3c\x25\x74\xd2\x64\x16\xd7\x33\xe9\xb3\x67\x77\x3e\x0a\x75\xf6\xc2\xab\x62\x7a\xbb\x41\x78\x46\xb0\xe8\x45\xd2\x92\x41\x78\xbe\xf2\x20\x90\xff\xf0\x35\x07\xe1\x39\xa1\x83\x0f\xed\x47\x49\x3a\xe9\xe3\xeb\xc0\x25\xc3\xb1\x3a\x73\x1c\x4b\x98\xaf\x32\x29\xcd\x6e\x52\xeb\xe8\x62\xdd\x3e\x75\xc4\x52\xf3\x67\x92\x4c\x96\x6c\xd8\x3b\x2b\xf7\xe4\x7f\x92\x64\xb2\x2e\x2e\x62\xa9\x4a\xcf\x06\x4b\x06\x7b\x7b\x65\x54\x3e\x9e\x0d\x56\xa7\xe5\xc7\xb3\x81\xb9\x96\xdc\xa0\xc6\xad\x44\x7d\x47\xac\x88\xe3\x2c\x5a\x42\xfe\xee\xca\x7d\xfe\x7b\x16\xad\xde\x83\xbf\x67\xd1\x9b\x64\xed\xe9\xd0\x11\xeb\x67\xe4\xd7\x0f\xd7\xb3\xe7\xab\x0f\xd7\x1b\x7f\xb0\x2e\x26\x62\xc1\x1c\x0f\x97\x11\x71\xf5\x15\xfc\xef\xc3\x9b\x10\x71\x78\x2b\x22\x8a\x55\x6b\x38\x1b\xb0\x31\x8b\xc2\x25\xe2\xe4\xf9\xe3\x95\x3b\xf0\x4a\x42\x2b\x60\x75\xfb\x05\x61\x70\xe3\x05\xa1\xa2\x87\xb7\x54\x68\xc5\xda\xfc\xaf\x99\x1f\xe7\xe1\x9f\xf5\x2a\xd2\xb3\xe7\xd7\x28\xb5\x12\x82\x7a\x48\x6d\xff\x2b\xec\x64\xbe\xc3\x3b\xad\x1b\xdb\xd6\x8f\x67\xec\x76\xe7\xe9\x67\xfe\x64\xe2\xdf\xee\x2c\x3d\x4e\xca\x40\x6e\xb0\x25\xc3\x1b\x4d\x3f\x5e\xa6\x64\x3d\xc6\xe3\xe2\xe2\xb6\xdf\xf7\x20\xa8\x74\x59\xeb\xe4\x85\xbd\xb0\x0f\x9b\x90\xc3\x43\x08\xa4\x1b\x40\x03\x18\xef\x4e\xcc\xd0\xff\x0c\x87\x38\xf0\x60\x61\x01\xf5\xe5\x99\xc6\x34\xb9\xe4\x05\x16\xae\x07\x03\x33\x8d\x6a\x34\x81\xe7\xc1\x2e\x74\x60\x0b\x16\x5e\x3d\x2e\x1a\x96\x40\x0a\xeb\x57\x20\x36\x9e\x31\x44\xc8\x38\x0a\x87\x5d\x18\xf0\x96\x4c\xef\xc4\xb0\x67\xd2\x03\x5e\x40\xe7\x59\x1b\xbe\x7e\x85\x00\x5f\x19\x3c\x6b\xc3\x1e\x04\xd0\x84\xed\x27\x6d\x78\x48\x8d\xa3\x6a\xe6\x04\xb0\xc5\x13\x5d\xe8\x71\x2a\xf6\x56\x39\xf3\x32\x86\xaa\xf2\x4c\x99\x6c\xda\x7d\x17\xf6\x60\x00\x3d\xf0\x0b\xef\x19\x90\x4b\x1c\x9b\xba\x0e\x27\xd9\xe6\xc2\xc5\x5b\xa9\x0e\xec\x49\x66\x02\x7d\x6b\x69\x10\x41\x55\x43\x2a\xc0\x5e\xf5\xe0\x7d\xab\xbe\x94\x46\x48\xe0\x7a\xf3\x51\xfa\xa6\xf4\x2e\x8a\xad\xef\xf0\x02\x72\xdd\x37\x02\x16\x2b\x64\xad\x89\x9f\x0f\xc7\xce\x56\xeb\xcb\x93\xab\xad\x33\xd7\x72\x78\x24\x6f\x31\x55\xe9\xfb\xff\x71\x1f\x36\x01\x43\x72\xf2\x65\xa4\xf2\xfe\xf2\x3b\xbc\x73\xf9\x61\xb4\xf8\xff\x90\x13\xa2\xbe\x08\x55\xcd\xd2\xfe\x1b\x7f\xb1\xec\x38\xe4\xf9\x0f\xf7\x3f\x3f\x0c\x40\x7f\x18\x80\xfe\x2f\x35\x00\xfd\xbf\xd1\x91\xd4\x0f\xf3\xd6\x1f\xe6\xad\x3f\xcc\x5b\xff\x4a\xe6\xad\x1f\x45\x88\x4a\x38\x4b\x93\xd9\x14\x92\x11\x30\x3e\x3c\x30\xf0\xd3\x0d\xd3\xb1\x1b\x0e\xda\x4b\x3f\x5d\xdb\xf0\x55\x02\x58\x62\xfc\x2a\x8b\x5c\x63\x00\x2b\x8b\xdd\xd8\x08\x56\x56\x5c\xc5\x10\x56\x35\x72\x43\x63\x58\xdd\xcd\x0a\x83\x58\x99\x59\x17\x4f\xbd\x50\xaa\x10\x57\x1d\xb5\x47\x15\x56\x9d\x1c\x5c\x19\xc1\x1e\x92\xd1\x28\xa3\x88\xc8\xa4\x2d\xd0\xb7\x59\x22\xf2\x17\xc9\xcc\x28\x41\xdf\x66\x09\xe9\xec\xab\x5f\xe1\xed\x0b\x0d\x26\xfc\xdc\xff\x07\xc6\xb9\x15\x25\x44\x42\xb1\x8c\x5d\xa0\x98\xfb\x21\x09\xe3\x9c\xec\xc2\x72\x8a\xe5\xa7\xcb\xda\x79\x66\xcd\xf9\xfe\x1c\x83\xe2\x88\xc2\xf8\x69\xe6\x2f\xec\xfc\x45\x31\xff\x7a\x9f\x61\x7d\xe5\x34\x8c\x68\xd7\xf0\xa0\x41\x34\xb2\x9c\x87\x89\x3e\xcb\x9f\xf2\xaf\x8d\x39\x4f\x45\x14\xf9\x0f\xc4\x45\x3a\x13\x93\xc3\x29\x47\xf3\x7b\x79\xe8\x32\xa6\x0a\x86\xf9\xb6\x3d\xf9\xb2\x38\x4f\x17\x7c\x59\x2f\x44\xc7\xed\x57\x0e\x58\x39\x51\x02\x10\xc4\x71\x4d\xca\x03\xcc\x39\xd9\xcb\x95\x5a\x73\xbb\xd8\xa2\xa6\xd8\xc2\x2e\x26\x9e\x34\x56\x16\xc5\x3c\xbb\x38\x0a\xb4\xdf\xfd\xa8\xa6\x86\xcc\x2e\xc4\xdc\xbd\x27\xd3\x2b\x43\xaa\x68\x5b\x75\x30\x83\x03\x11\xcd\xe6\x6f\xc3\x40\xc5\x11\x2b\xf4\xb0\x3e\x6b\xfe\x16\x0d\x4c\x6b\x6a\xd5\x65\xcd\xdf\xa2\x37\x92\xea\x5a\xb5\x59\xd2\x42\xa9\x2a\x6f\x98\x24\x69\x90\x1d\xa3\xbd\x5a\x7d\x7e\x7d\x3f\x28\xff\x25\x06\x1c\xa9\xca\x8f\x92\xcb\x97\xc9\x2c\xae\xab\x3e\x0e\xcf\xc6\x76\x7e\x61\x60\xd0\xf0\x43\x3e\x4b\x77\xd4\x28\xd9\xc3\x64\x34\x22\x4b\x9c\xb4\x4f\xcd\xb0\x3b\x66\x3b\xaa\x48\xc7\x28\x22\xac\xd2\xae\x81\x7a\x1d\xc8\x4a\x26\xe1\xdd\x90\xc2\x78\x77\x17\x1a\x17\x5c\x00\x0d\xfd\xa8\x61\x77\x42\x8e\x12\xca\x91\x96\xb2\x47\xd3\x43\x4f\x63\x20\x1f\x0a\xeb\x71\xc7\xf4\x05\x6c\x8a\x35\xa1\x50\x49\x99\x31\x3b\x08\xa1\xa9\xba\xe5\x16\xa0\xf0\x82\x08\x6c\x93\x16\x06\x1b\x0e\x32\x97\x01\x67\x53\xf7\xbf\x00\x08\x4b\x2e\xa8\xad\x12\x20\x93\xdd\xbe\xc0\xbc\xd3\x43\xd0\x1e\x2c\x3a\x3d\xc4\xc1\x83\x79\x57\xa5\x75\x7b\x04\xee\xaa\x0c\x81\x3a\x2d\x21\xf0\x7a\x02\x42\x50\x86\x10\x06\x55\x10\x88\x65\x2b\x20\x28\x1c\x30\xad\x02\x07\xc3\x80\xd1\x1c\xd6\x71\x92\x86\x7f\x26\x71\x5e\x3b\xb0\x8b\xa5\x03\x3b\xaf\x1c\xc0\x45\xcd\xa8\x8b\x81\x9d\xd7\x90\x59\x8c\xd7\xbc\x66\x38\x17\x26\x5b\x2c\x96\xb2\x85\x31\xee\x8b\x65\xe3\x5e\x35\xb0\x9a\xa8\x7c\x30\xd6\x1a\xd8\xa0\x62\x58\x82\xe5\x10\xae\x1f\x58\x83\x35\x62\x6b\x60\xf5\x9c\xbd\x2b\x07\x97\xf4\xef\x66\x07\x7c\x15\xe7\xee\xa6\xd0\xd4\x0f\x96\x4c\xbf\x98\xda\x4f\x28\x13\x0a\x65\xc3\x23\x6d\x34\x84\x2b\x79\xde\xe4\xad\x84\xd3\xf5\x5d\x6b\x44\x61\x8c\x8e\x48\xe5\xa0\x7f\x23\xc8\x6f\xc3\xe0\x1b\x41\x7e\x99\xe4\x3a\x18\xa0\x62\xe4\x2b\xd7\x78\x91\x26\xdd\x8f\xde\xe2\x8d\xdb\x9d\xb0\xcf\x1d\x32\xcf\x35\x1c\x93\x35\xac\xd8\x1e\x7c\xdf\x51\xda\xa3\x6c\x58\x24\xab\x78\xba\x27\xcb\xde\xee\xf9\x5e\xd1\xb3\xb8\x50\x34\xff\x0d\x1e\x9d\x85\x6b\xea\x5b\x78\xda\x5e\xa7\x2a\x67\xad\x53\xb7\xe0\xbf\x9c\x13\x61\x2d\x0a\xa0\x1d\x2e\x87\x80\xba\xc5\x2d\xbd\x6b\x2f\xee\x00\x06\xad\x9b\xb7\x74\x15\x5e\xd6\xee\xd7\x02\xc8\x49\x4d\x9e\xc7\xd3\xe4\xfc\xf6\xee\xcb\x39\x90\x3f\xee\xc0\x39\xfb\x5d\x38\x78\x27\x7d\xe2\x36\xee\xdd\xaf\xf4\x83\x5a\xca\x32\xa3\x0a\x4b\x8a\x35\x06\x91\x3f\x3c\x6f\x94\xfa\xdf\x69\x3d\x36\x7a\xf2\xd8\xc4\xa8\x6d\x72\x81\xa9\x3a\x61\x8b\xb7\x7f\x31\x6b\x9e\x1a\xd9\x37\xb4\x9d\xef\xe0\xbf\xee\x5b\x19\xef\x8f\x90\xd1\xf9\xfc\x7b\xeb\x4f\xd7\xb6\x65\x6a\xf7\xfb\xaf\xfd\xdc\xbf\xe6\xae\x6f\xed\xe7\xa4\xfd\x57\x7c\x55\x59\x0e\xbd\xdb\xfd\x71\x93\x68\x07\x12\x29\xdc\x96\xc9\x6b\x1f\xe1\x7c\xc9\xb8\xd6\x31\x2e\x7a\xaa\x2f\xda\x74\x55\x75\x96\x4d\xc7\x24\xe5\x58\x95\x15\xe7\xd6\xc5\xb3\x6d\x3c\xc5\x96\x9b\x63\xbc\xed\x11\x1d\xa4\x2d\x89\xee\x56\x32\xf8\x8c\xe7\xce\x1b\xda\x05\xa1\x1f\x0d\x67\x91\x9f\x93\x63\x2e\xda\x05\xe9\xc3\xfd\x69\x92\x85\xf4\xcb\xf2\xa6\x0f\xc9\x08\xfc\x39\xcb\x0c\x9f\x63\xf0\x85\x3a\x7a\x25\x0e\xd1\xf8\xbf\x37\x3e\x85\x62\xe6\x09\x95\x45\x7d\x9a\x24\x00\xe8\x9b\x4c\xf5\x53\xba\x3b\xab\x6d\x42\x9c\xab\x8a\x7a\xe2\x2b\x19\x51\x78\x36\x8c\x26\x29\x62\x1e\x66\x17\x67\x32\x14\x9b\x05\x88\xac\xbd\x09\x01\xae\x74\x10\x20\xbc\x9e\x10\xed\x7a\x30\x6f\xf2\x5c\x48\x52\x58\xe0\xaf\x4a\x00\xa8\x9c\xa1\xff\x02\x0e\x20\xe6\x3f\x92\x11\xa5\x1a\xae\xd4\x34\xe6\xaf\xcc\x3e\x6e\xc8\x20\xae\x96\xc8\x30\x0f\xef\xad\x0c\x19\x40\x41\x50\xcd\x13\x1d\xf7\x54\x2f\x3c\x8d\x8e\xb6\x3a\x5a\x37\x58\x84\x3a\x99\x36\x0f\xa6\x55\xe8\x85\xd0\x94\x06\xe7\x6c\x91\x39\x02\x2b\x15\xed\x20\xcb\x99\x5a\x83\x00\x22\x36\xca\x7b\x02\xe1\x16\xff\xf0\x54\xf2\xdb\x90\x2f\x03\x15\x99\x29\x85\x07\xa0\x0e\x34\x65\x7e\xaa\x91\xc4\x9f\xb2\x7a\x7d\xb1\x3c\x99\x2a\xe8\x79\x32\x55\x89\x85\x86\x55\xd6\x20\xc9\xf3\x64\x22\xe3\x12\x68\x90\x94\x6e\x96\x91\x10\xaa\x4b\x16\x5f\xc5\x85\x01\x57\xd5\x83\xd9\x90\x19\x87\xbc\xe4\x01\xcf\x83\x30\x30\x5f\xa6\xfb\x74\x6e\x2e\x68\x7a\x12\x06\xe2\x10\x8c\xe7\x25\x69\xa8\x7c\x02\x52\x91\x96\x91\xa4\xb7\x06\xea\x7d\x3c\x16\xa1\x2f\x9d\xdb\xe7\xa9\xff\x39\xf5\x03\xbe\xf6\xc9\x42\xe2\x53\x97\xd2\xf9\x85\xf2\xbb\xbb\x3a\x26\x25\xec\xc1\x97\x2b\xe8\xd9\x45\x34\x8c\x09\x12\x49\x36\x41\x5f\x9e\xb1\x87\xbf\x60\x69\x86\x51\x2a\x31\x5f\x7e\x1b\x2f\xc4\x89\xa8\x74\xc7\xd1\x68\xc0\xa6\x45\x81\x4d\x70\x44\x03\x7b\xd0\xa0\xf1\x68\x40\x0f\x1a\x0d\xd7\x80\x90\xfa\xf1\x59\xd5\xd9\x6a\xd5\x59\xec\xa2\x22\x2d\x66\x2c\x38\x9a\xfa\x43\x56\x3c\x00\xe5\xe2\x5e\xc9\x10\x3c\x60\xa2\x0b\x06\x63\x93\x29\x9a\x3e\x31\xd8\x9b\x23\x2d\xc8\x44\xdf\x5f\xbf\x42\xdb\xf5\xc0\x2e\x22\xbe\x24\x5f\xab\x1a\x14\x60\x17\xab\x9c\x96\x1e\xeb\xda\xc8\x2c\x6a\x90\xa9\x39\x11\x83\x3d\x85\x66\x9e\x4c\x35\x0a\x8a\xbd\x15\x0e\xc4\xe0\x05\xbc\xa9\x8e\x2a\xc3\x3f\x09\x4b\xe8\x15\xe0\x96\xcb\x14\x80\xac\xd4\xb0\xdd\xfb\x62\x1f\x89\x9b\xf8\x47\xe9\x65\xb5\xe4\xb1\x8a\x51\xc2\x1f\x27\x9d\x53\x8f\x92\x4e\xda\xa7\xa7\x56\x75\xba\xf4\xf3\xd3\x8c\x1d\xad\xfa\xa2\xb8\xa0\x6c\x9d\xdc\xff\x13\xf7\xfe\x06\x10\xbc\x17\xe2\xf8\x9a\x02\xdc\xf0\x59\x20\x5a\x32\xda\xa5\x03\x4a\x73\x16\xf9\x11\x66\xd0\xd8\x5b\x45\xad\x3c\xc1\xb7\xa6\xcb\x0c\xe1\xf1\xc1\x25\x62\x39\xf8\x7f\x71\x72\x70\xf3\xbe\xd1\x13\x65\xf4\xcd\xfb\x1a\xc1\xbe\x1f\x19\x7d\x94\xaf\x81\x25\x25\xa5\x8b\x8e\x9b\xb7\x73\x21\xaf\xda\x8e\x39\x88\x72\x23\x5e\x21\x54\x0d\x12\xf7\x8b\x4d\xa7\x5e\x81\x6c\x57\xae\xbb\xf2\xb4\x36\x25\x82\x25\x90\x79\xe1\x3c\x99\x36\xd0\x5b\xae\x90\x4c\x5f\xbf\x96\xcb\x10\x23\x63\x31\x2a\x25\x8f\xb7\xb8\x4c\x32\x04\x81\x4c\x5e\x08\x7f\x12\xd9\x89\x12\x87\xa7\xd0\x34\xf0\x78\x48\x1c\x4f\x53\xe6\x86\x72\x61\x69\x6f\x38\x16\xd7\x76\x07\x85\x52\x4d\x6f\x56\x41\xdb\x3a\xfd\x5e\x68\x12\xe4\xc9\xb4\x34\xff\x46\x61\xec\x47\xf2\x66\xb9\x3c\xca\xc8\x54\x9e\x71\xca\x57\x3f\xe4\x18\x0d\x6a\x8e\xd1\xa0\x16\x1e\x4d\x8a\x1e\x58\x53\x4b\x6c\x8b\xab\x98\x01\xf6\x6c\x11\xdd\x33\x7a\x52\x0c\x71\x54\x45\x7e\x5d\x5f\x88\xb9\x9e\x39\x82\xd4\x69\x31\x57\xf0\xf2\x93\x32\xc3\x80\x71\x2a\x2f\xe7\xce\x12\xc5\x37\x77\xc1\xd1\x34\xdf\x83\x66\x07\x7a\xd0\x71\xe1\xa1\x26\x66\x1d\xe7\xe8\x76\x6f\x09\xdf\x18\x62\xdb\xab\x83\x35\x86\x52\x1f\x2a\xee\xb5\x78\x5e\x18\x78\x1a\x9e\xb0\xf6\xf0\xe0\x0b\x9a\x79\x97\x8f\x10\x6e\xe7\xf5\xbd\x74\x6c\x20\x44\x13\xfc\xbe\xff\x11\x0e\xdf\xfd\xf7\xc1\xab\xe3\xc3\xf7\xef\xe0\xe1\x96\x86\x3d\x4d\x93\x21\x43\xe3\x2c\xb9\xb7\x52\xe1\xf0\x9d\xa1\x0b\xdd\x76\x67\xbb\x39\x25\xcb\x00\x0f\x7e\xf1\x87\x6c\x90\x24\xe7\x1e\x1c\xc6\x43\xe9\xcb\x19\x43\x14\x8b\xcd\xf0\x30\x09\xd0\xef\xbb\x08\x25\x1e\x18\x81\xea\xdf\x1e\x1e\xcb\x64\x18\xe1\xe5\x26\x6d\x77\x38\x88\x37\x87\xaf\x0e\xde\x1d\x1d\x88\xd8\xfa\xb4\x0b\x4a\x93\x24\x87\x20\x4c\xd9\x30\x4f\x52\x11\x0c\x5d\x37\x94\xa7\xe4\xca\x59\x3a\xd4\xc3\xe0\x17\x93\x69\xbe\x10\xef\x92\x29\x0c\xf1\x86\x30\xdc\xe4\x3d\x6c\xb1\xf8\xa2\xf5\xee\xfd\xeb\x83\xfe\xc1\xbb\xdf\xd1\xaa\xac\x31\x4d\x93\x60\x66\x3a\x4d\x16\x5b\x83\x51\xca\xd8\x9f\xcc\x31\xe0\xd5\xb8\x19\x36\x4a\x2c\x25\xf7\x15\xed\xeb\x97\x8d\x9f\xb3\xed\xba\x6e\x89\x1d\x6e\xe7\x74\xfc\x9b\xb0\xc3\xa3\xff\x55\xec\x70\x4d\x04\x84\x47\xcf\x0d\x1f\xe6\x47\xe1\x24\x8c\x7c\x11\x98\x1b\x1d\x7b\xc7\x39\x0c\x66\x39\x24\x71\xb4\xc0\x98\xe0\xe0\xc3\xa5\x9f\xc6\x18\x81\x9b\xa2\xdf\x0f\x93\x38\x08\x85\xbb\x7a\xb4\x2a\x9c\xb0\xbc\xa5\xc8\x30\xf4\x63\x18\x30\xc0\xe7\x7a\x79\xc2\x41\x40\x98\x65\x33\x96\x91\xd1\xf3\x05\x8b\x92\x29\xfa\xd7\x61\xf1\x45\x98\x26\x31\x9e\x22\xf1\xbc\x61\x1a\xe2\x45\x3e\x87\x34\xf5\xf3\x71\xd6\x82\x8f\x6c\x92\x5c\xc8\x80\xe3\x51\x72\x76\xc6\x7f\x23\x81\x47\x09\x1a\x01\x09\x56\xb6\x61\x5d\x86\x51\x04\xe7\x8c\x4d\x25\x6d\x33\xbe\xdb\x8f\x92\xb3\x70\x88\x11\x12\x46\x49\x14\x25\x97\x74\xec\xc0\x73\x10\x20\xb5\x48\xb4\xc4\xdd\xb8\xe8\xf3\xae\x4d\xd3\x9b\xcf\x2f\x32\x57\x0a\xe3\xfc\x0f\x05\x51\x6d\x2a\xcd\x74\x87\x8e\x10\xa4\xec\x56\x47\x6a\xfd\x08\x03\x4c\x16\x8f\xe5\xd0\x9c\x8e\xcf\x47\x32\xe5\xc0\x52\x14\xa0\x06\x7f\x36\x81\x0b\x76\xae\xae\xf7\xcf\x71\x3f\xd6\xd9\xa1\x5f\x3f\x63\x3e\x7d\xe0\xb9\x9e\x58\x29\x38\xb4\x13\x2c\xd1\x04\xf4\x02\xa4\x4f\xf8\xfa\x78\xec\x56\x5c\xdc\xfd\xf4\xec\x30\x0e\xd8\x1c\x0d\xed\x55\xea\x84\x65\x99\x8f\x1a\x7a\x43\xf4\xab\x87\x51\xfd\xa8\x73\xad\x94\x4d\x23\x7f\xc8\x9c\xad\xff\xca\xb6\xce\xbc\x8a\x88\xea\xfa\xd1\x1e\xc7\x47\xb6\xb1\xb9\x79\xba\x53\x5a\x67\xa5\xc1\x6e\x12\x67\x49\xc4\x88\xfa\x6a\xab\x6b\xac\xb1\xa2\x00\xd9\x2a\x39\x02\x41\xd7\x0c\x06\x9f\xa7\x0b\x55\x7a\x6b\x0b\x9a\xcd\x26\xfc\xc1\xa2\x61\x32\x41\x17\xf7\x01\x1b\xcc\x88\xf3\xd0\x88\x8c\x67\xeb\xb2\xc8\xf2\x64\xf5\x79\xe9\x67\x64\xac\x1b\x93\x95\x34\x3a\xee\x8f\x43\x16\x0f\x19\x64\x09\x46\xf3\x80\x45\x32\xc3\x09\xc2\x85\x14\xcd\xe5\xdc\x1f\x9e\x6b\x70\x79\xc2\xd7\xcd\x80\xa6\x99\x1f\x45\x59\x88\xe7\x7d\x7e\x0e\x43\x9f\x66\x14\xc5\xc6\x27\x4e\xc2\xd2\xa9\x08\x9c\x0f\x86\xa5\xf0\x41\x55\x57\x61\xe8\xe7\xc3\x31\xe0\x3b\xac\x2b\x75\xe4\x71\x59\xe6\x4a\x91\xe4\xa8\x79\xee\x81\xcd\x9b\x9c\xfa\x23\xe1\xf3\xce\x3c\x5f\xd0\x34\x2f\xa2\xd2\xf8\x54\x0b\xd4\x83\x56\xab\xc5\x47\xdb\xfd\x04\x42\x48\x99\x32\x87\x33\x4f\x43\x72\x95\xe4\xc9\x46\xd9\x09\x97\x60\x30\x69\xa4\xdf\xf8\xc5\x0f\x23\x16\x00\x5e\x87\x22\x15\xe5\x1d\x68\x0f\x1a\xf4\x56\xb1\x5d\xe4\xb9\x1d\x3e\x02\x87\x67\x71\x92\x32\x5d\x4f\xdd\xa7\x22\x00\x3c\x78\x94\x01\x4d\x6c\x04\xee\xa9\x9e\x69\xb8\xd6\x24\xee\xae\x36\x8b\xbb\xf0\x02\xba\x62\x1a\x77\xa1\x09\x5d\x63\x1e\x73\x10\xdd\x1d\xf1\x93\x66\xb2\xfc\x34\xe7\xb2\x31\x9b\x11\x42\x79\x3a\x77\x95\xad\x96\xb2\xd2\x30\x65\x91\x30\xdb\x55\x03\xeb\xc1\x09\xd1\xf7\xb4\x35\x4c\xe2\xa1\x9f\x3b\x38\x60\xe6\xb5\x75\xb5\xb2\x20\x46\xf1\xdb\x28\x0a\x4b\x23\x1a\xdc\x58\x51\xf8\xdf\xa9\x08\xc2\xdf\x38\x4b\x22\x47\xe2\xb9\x37\x2d\x60\x5b\x0f\x59\x16\x85\x71\xde\x0c\xc2\x0c\x1f\x13\xc5\x49\x33\x63\xd1\xa8\x39\x4c\x26\x53\x3f\x65\x86\xc6\x60\xdf\xc5\xe8\xa3\xe2\xba\xdb\x1a\xad\x3a\x84\x71\x84\x87\x8a\xa2\x42\x98\xc1\x34\x89\x16\x23\xbe\xf8\xaa\xc0\x20\x44\x72\x5a\xb5\xe3\x6c\x36\x61\x69\x06\xd9\x38\xc4\x95\x39\x4c\x21\xb9\x8c\x39\x24\x19\x1e\x44\x68\x07\x2c\x6d\x4d\x92\x3f\xc3\x28\xf2\x31\x48\x08\x8b\x9b\xbf\x1d\x6d\x05\xc9\x30\xdb\xfa\x83\x0d\xb6\xfe\xdb\xbf\xf0\x8f\xf0\x8d\xd3\x96\x7a\x2d\xb2\xf5\x6b\x94\x0c\xfc\xa8\x4f\xa8\x64\x5b\xf4\x77\x2b\xcc\x8a\xd1\x75\x9c\xb9\x7a\x1c\xbe\xb5\x05\x47\xfe\x84\xfd\x8e\xf6\xb0\x7e\x74\x96\xa4\x61\x3e\x9e\x88\xf8\x1f\xe4\x63\x77\x21\xa7\x14\x2f\x8b\xa7\xe4\x9d\xe6\x63\x0f\x9e\x36\x3b\x6d\x3b\xf9\x49\x6b\xd0\x7c\xd2\x62\x3d\xd8\x6c\xc3\xbd\x5d\x68\xaa\xec\xfd\x20\x60\x24\xcd\xe3\x24\xfe\x93\xa5\x09\x2c\x48\x7c\x70\x12\x4d\xfc\x73\x06\xbf\x70\x55\x64\xec\x4f\xa7\x0b\x0f\xf5\xae\x30\xe7\x2c\x94\xb2\x60\x16\x07\x7e\x9c\x9b\xdb\xaf\x39\xae\x71\xf8\x34\x7c\xa1\x7f\x76\x60\x4b\xb8\x04\xc6\x77\xeb\xb8\xd7\x32\x0f\xda\x04\x92\xf0\xa4\xe5\xf7\xd0\x5d\xf0\xee\x2e\xff\x53\x06\x3c\xe7\xdb\x55\x02\x2c\x62\xa1\xe8\x77\x0f\x1f\x58\xca\x05\x40\x46\x01\xa5\xc2\x7c\x01\x83\x85\x08\x2f\x43\xea\x59\x9a\xcc\xce\xc6\xf8\xb2\x0a\x30\xa4\x15\x90\x75\x02\xea\x5b\xd4\x0a\x2f\x27\x23\x1e\xc1\xe5\x98\xf1\x52\x0b\xbc\x30\x1c\xfb\x19\xdd\x7f\x65\x70\x39\x0e\x87\x63\xe0\x1c\xca\xf5\x4a\x9a\x9d\xd1\x42\x84\xb1\x1a\xb0\xfc\x92\x31\x9a\x20\x5a\x90\x72\x70\x2a\xe8\x4d\x3a\x63\x04\x3b\x97\x21\x74\x32\xbc\x27\x42\x85\x70\x91\x21\x64\x1b\x6a\x21\x36\x4e\x36\xf6\xb9\x72\x78\xc0\xb3\x9c\x64\xf0\x79\xdf\xe3\x3d\x79\xa9\x03\xd9\x85\x99\x99\x5c\x78\xd2\x8c\x2f\xf6\xe4\xd3\x06\x43\x47\xe1\x35\x48\x41\x11\x71\x64\xf0\x68\x86\x27\x2a\x57\xce\xfa\x05\x12\x07\x5c\x55\xf8\xa5\x2a\x5c\x68\x95\xde\x1f\xca\x66\xc5\x35\x6c\xb6\x5f\xb8\xf6\xe1\xcd\xa9\x3b\x1f\x9e\xf2\xb2\x5c\xe0\x25\x9d\xab\xc9\x27\x6f\xfb\xd2\x8d\x2b\xc7\x06\xab\xa8\x10\x53\x4b\x10\xe0\x5a\x11\xcb\x72\x5c\xfc\xf6\x1b\x19\x11\x3e\x08\x47\x38\x57\x73\x18\xa5\xc9\x04\x5e\xb6\x8a\xd1\xfe\xc4\x63\x4d\xb3\x59\x79\xf3\xac\x97\xd8\x9a\x17\x75\x2f\xe9\x4d\xdf\xfe\x49\x78\xea\x72\x62\xdd\x13\x83\x74\x22\x53\x4f\x69\xb8\xf4\xb7\x5b\xd2\x37\x55\x1f\x64\xb4\xbe\x8d\xc2\xa8\x56\x2d\x6f\x26\xb7\x94\xcf\x35\x96\x3a\x14\xbf\x76\x7d\xda\xda\x82\xa7\xad\x4e\xab\xf3\x18\x8e\x13\x8a\xf2\x45\x11\x2b\x93\x43\x11\x0c\xae\x2e\xbe\x5d\xdb\xad\x0e\xab\x59\xc2\x5e\x6b\xdf\x61\x6e\xbd\xe3\x0f\x73\x78\x01\x6d\xd8\xe3\x20\x1c\xd5\x20\x2f\xe5\x41\x7b\xde\x19\x99\xff\x5c\xae\x9e\xa0\xe6\x34\x4d\x2e\x9d\xae\x07\x8f\xb7\x5d\xdc\x7d\xec\xee\xc2\xf3\x76\xfb\x69\xe7\xf9\xf3\xee\xe3\x47\x4f\x1f\xb5\x9f\x3f\xef\xe0\xe1\x4f\x91\x4a\x4b\x5d\x94\x0b\x64\x75\x78\xbf\x80\xb6\x1b\xb8\xa9\x52\x91\x44\x53\x3f\x0e\x92\x89\xe3\x2e\xed\xe3\x39\xb3\xfd\x56\x34\x8e\x16\x93\x41\x12\x39\x0d\xa9\xd2\xe0\x3e\xa9\x70\x5d\xd6\x68\x40\x8f\x6e\xff\x1b\x6e\xbf\xe1\x81\xb3\xb9\x89\x56\xbb\xd3\xb9\xdb\xca\x13\xba\x5b\x76\xb6\x9f\xb8\xe2\x60\xab\xd8\xb7\xa5\x9e\x33\xcd\xbe\x89\xdf\xad\x11\x1e\xe2\xb4\x64\xbc\xa7\xc3\xec\x40\x19\x19\x54\x80\x5f\xea\xce\xe6\x86\x0a\x90\xc6\xa1\xdf\x67\xd9\x5b\x04\x22\xdf\x20\x8b\xd7\xb6\x24\xef\x93\x3a\xce\x7b\xd4\xdd\x76\x8b\x45\xb9\xc2\x4a\xce\x51\x93\xa9\xb0\xbd\x7b\x2d\x82\xf1\xab\x32\xaa\x52\x86\x03\x52\x07\x9d\x42\xaf\x19\x05\x97\xc1\xa6\x12\xaa\x82\x90\xac\xbb\x52\xc4\x4a\x08\x2d\xe5\x8f\xa0\xf4\x1a\x53\x96\x54\x3d\xb1\xcb\x12\x80\xfb\xb0\x67\x70\x98\xb0\x23\x91\x52\x43\x49\xf3\x1d\xb8\x32\x9c\xa1\x14\xcb\x25\x83\xcf\x66\x7b\xd7\x63\x96\x0c\x3e\xb7\x8c\x47\x96\x58\xa2\x54\x8d\xca\xa1\xe0\x2e\xe6\x19\x2f\x3c\xf7\x74\x47\x7a\x36\xc2\x3b\xf6\x13\xd7\x2a\x22\x57\x76\x83\x23\x67\x30\xd0\x1e\xa6\xf7\xe0\x8b\x34\x38\xeb\x61\xc2\x15\xda\xb6\x48\x86\xd3\x4e\x21\x56\x27\x82\x18\x52\xa7\x3c\x3e\xee\x75\x03\x64\x08\x76\xd5\x63\xaa\xa3\x66\x3e\xaf\x66\x7e\xf5\x54\x7b\x1c\xc4\xce\x46\xd5\x78\x1a\xd1\x4d\xff\x7a\x23\x7a\xd3\xfe\x95\x17\xb3\xa5\x3e\x68\x56\x59\xcc\x3a\xcf\x5b\x9d\x56\xb7\xd5\x85\x2d\xe8\x3c\x6e\x75\x5b\xdb\xad\xc7\x85\xf7\xc5\xef\xe1\xc4\x03\xfd\xa4\xf0\xd4\xa5\xe8\xd2\xb1\x3a\xde\xae\x92\x0b\x6a\xb9\x0b\x3e\xd4\x45\x98\x7c\xd4\x7d\x2a\xca\xb0\x78\x36\x79\x39\x3b\xfb\x07\xd7\x48\xea\x96\x4f\xe9\x95\xe3\xf0\xa0\xff\xe1\xe3\xfb\xe3\xf7\xb5\x05\x3b\xae\xd3\x90\x85\x1a\xa2\xd2\xc1\x64\x9a\x2f\x4a\x0e\x2c\xb6\x1e\xd2\x21\x22\x70\x82\x52\x41\xac\x75\xfc\xcf\x0f\x07\x40\x67\x86\x34\x7c\x8d\x1d\x24\xd5\x2b\xa4\x87\x54\xa1\x2f\xc3\x7c\x0c\x23\xbe\x57\xf8\xc4\x95\xbf\x4f\xa0\x8a\xf7\xf0\x1c\x29\x1c\xa5\xfe\x84\x09\x5a\x52\xe9\x61\xc4\xfc\x94\x05\xba\x24\xc5\xe3\x46\xb0\xaf\xc3\x61\x5e\xc4\x50\x68\x6d\xe3\xd4\xcf\xc6\x1e\x5c\xfa\x59\xce\x50\x73\xcf\x92\x20\x99\x2c\x7a\x70\x78\x00\xbf\xbe\x82\xc1\xec\x4c\x1a\x15\x51\x93\x35\xd6\x88\xdb\xcf\x5c\xa7\x41\x45\x1a\x4a\xe3\xe4\x3a\x9e\x41\x7e\xa9\xe2\x89\x5c\x9c\xfd\x8d\x9f\x1b\xf2\xfb\x0c\xbf\x5f\xa8\x6f\x82\xf6\x5a\xc4\x69\xdd\x41\x1d\x95\xa7\xb4\xb2\x7c\x11\x31\x19\x9e\x86\xd7\x89\x93\x98\x61\xb5\x6a\x4e\x78\x86\x4f\x92\x59\x1c\xbc\x1a\x87\x51\xe0\x10\x14\xd7\x04\x98\x0e\x39\x98\xcf\xfe\x85\x4f\x9e\x34\x7a\x0d\xd4\x6e\xec\x0d\x75\x93\x6f\x7d\x71\x57\x8d\x65\x9a\xb3\x34\x22\x1a\x5a\x34\x16\x20\x87\x49\x9c\xb3\x38\xff\x23\x8c\x83\xe4\xb2\x25\xaf\x4e\xb0\xf8\x38\x9f\x44\xad\x94\x4d\x92\x0b\x56\x83\x90\xec\x73\x1d\xb8\xa0\x44\x13\x59\xa3\x95\x4c\x99\x88\x97\x51\xc8\xb8\x4c\xc3\x9c\x39\x51\x0e\x9b\xd0\xa0\x0e\x34\x60\x93\xd3\x7c\x13\x1a\x2a\x16\xee\x2f\xbb\xef\xc5\xf6\x63\x13\xa8\xe8\x96\x59\xb6\x0a\xee\x30\x4a\x32\x46\x2d\x56\xd0\x41\x15\xfb\xc5\x08\x13\x1d\x36\x9b\x2e\x04\x2c\x62\x39\x33\xea\x9c\xa8\xe9\x71\x7a\x62\x30\x8d\x0c\xd9\x2d\xdd\x3a\xa8\xf2\x8e\x90\x59\x25\xf5\xcf\x12\x30\x96\x15\xac\x94\x39\xa6\xc4\xd1\x07\xf6\x74\xb9\xb9\x23\xf6\x42\xef\x4d\x87\x0c\xb8\x45\xc0\x79\x6e\x60\x09\xbb\x4a\x4e\x39\xef\x55\x88\x92\x8c\x56\x35\x3c\x06\xe5\x15\x64\xf0\x92\x8a\xda\xfa\x4d\xec\xd6\x16\xf8\x41\x00\xf7\xd5\x3b\xfb\xfb\xb8\x51\xaa\x7c\x69\xaf\x4e\x5c\x8c\x06\x4f\xa4\x4c\xe2\x60\xdf\x1b\xc7\x01\x0a\x1f\x9b\x6e\x8a\x9c\x9a\x0e\x25\x35\x58\x54\xed\x71\x21\xab\x0c\xe1\x0c\xba\x55\x6b\xbf\x4b\x9d\x77\xad\x14\x3d\x38\x60\xa3\x3a\x8f\x82\x5d\xb7\x35\x92\x81\xfd\xeb\x84\xf9\x13\x69\x17\x7d\xbc\xff\x6b\x1d\x9c\xb6\xeb\x34\xa4\x26\x7f\xec\x9f\xa1\x35\xda\xd2\x9d\x92\x07\xb9\x7f\x46\xae\x6a\x8c\x53\x01\x5c\x9f\xf9\xfe\x94\xff\xc4\x88\x24\x39\xec\xf1\x8d\x54\x0f\xc2\xdc\x74\x90\x71\xbc\xff\xab\x8b\x6e\x70\x10\xd4\xf1\xfe\xaf\xc2\x67\x46\xc9\x70\x58\x18\x1b\xe7\xfe\x19\x5c\x55\x13\xb8\xbb\xd4\xf6\x7e\x25\x02\x0f\xf3\x79\x0d\x61\x1e\x3f\x17\xb4\x23\x87\x28\xd5\x92\xfe\x71\x47\x14\x12\x2f\x8a\x0f\xf3\xda\x7d\x69\xf7\xb1\x1c\x8c\x55\x17\xf4\x3c\x59\x1a\xa0\xbd\xd3\x79\x24\x0a\x9e\xb1\x9c\x37\xfc\x4b\xdd\x85\x67\xf7\xb1\x5c\xd3\x5f\x7e\x3c\xd8\xff\x87\xb8\x27\xe7\xdf\x1f\x0f\x8e\x7f\xfb\xf8\xce\x48\xd0\x43\xbe\x94\x07\x68\x47\xe6\x01\x8b\xf3\x34\x64\x99\x07\xa3\xd8\xc3\x6b\x1a\x0f\x0e\x8f\x0f\x3e\xee\x1f\xbf\xff\xa8\x65\x49\x28\x71\x93\x59\x96\x4e\x6a\xa8\xd0\x12\x2e\xed\x17\x54\xaf\x54\x7b\x6a\x2d\xe5\x93\x62\x98\xcf\x1d\xdd\xaa\x40\x04\xf6\xf0\xba\xa0\xa3\x57\x5d\xf3\x86\x0e\x17\x5a\x71\xed\x90\xe5\x6c\xea\x81\x54\x9e\xbd\x82\xc0\x13\x8a\xa3\xc0\xfc\x9e\x1d\x69\x99\xee\x76\xb4\x33\x1a\x89\x1e\x5f\x22\xe4\x8d\xb0\x4c\xbb\x47\x0a\xc0\xd6\x16\x8c\xfc\x2c\x87\xa1\x9f\xd1\xd5\x2d\x3e\xa1\xca\x48\x59\x91\x0a\xae\x44\x46\x1d\xb4\x29\x96\x72\x08\x11\xd7\xa5\x23\xa3\x48\xb2\x85\xe4\x10\x85\x82\x3c\x9e\xda\x11\xfd\x84\x17\x44\x81\x1d\xfa\xa3\x4f\x93\x94\x2c\xd4\x84\x1b\x39\x4a\x82\xcb\x38\x41\x02\xea\x09\x56\x3e\x75\x31\x56\x14\xcf\x3b\xe9\x9c\xba\x7c\x07\xe0\x14\x4b\xec\x18\x96\x8b\x99\xd4\xf5\x89\xe9\xbe\x7e\x05\x23\x8d\x18\xcf\x95\x23\xaf\xa9\x2f\x64\x35\xf6\xd3\xd8\x6f\x13\x01\xe8\xc0\x4b\xb3\x03\xdc\xb3\x50\xcd\x93\xb4\x15\xb3\x79\xee\xb8\x6e\x2b\x48\x62\xb6\x53\xea\xad\xae\x8f\x83\x3e\xa2\xee\xb4\xd4\x83\x06\xa4\xc5\x5d\xf4\x82\x8b\x2b\xb9\xbd\x93\x93\x0e\xff\xea\x64\x35\xf7\xe8\x47\x85\x78\xbb\x4b\xbb\xa0\x8d\x8d\xea\xe7\x1d\x0a\xcc\x7d\xbd\x6b\xbd\xef\x89\xb9\x4b\x02\x38\x9d\x31\x74\x4e\x29\x8a\x9e\x34\x04\xc3\x36\x4e\xd5\x5a\xfa\x71\x16\xa9\x53\x12\x7d\xa1\x5a\x1d\x66\xc1\x2d\x14\x5c\x76\x8c\x21\x8a\xa8\x2a\x47\x5c\xdb\xfd\x48\x27\x33\x95\xb2\x73\xbb\x5c\x74\x19\x7c\x55\xc8\xf0\xa8\x96\xc4\x0c\x93\x6b\x03\xe3\x3d\xae\x28\xbc\xac\x11\x5d\xca\xbd\xf3\x53\x05\x35\x16\xe6\xb9\x82\xbc\xcb\x23\xa5\xcf\x87\x74\x16\x69\xe7\x67\x85\xf3\x7e\x3d\x7e\x46\x0c\xa2\x98\x36\x37\xc5\xcb\x5a\x3c\x14\x7d\xf0\xc0\xb8\x4a\x6d\x9f\xa2\x66\x68\xaa\x4a\x56\x66\x0f\x1a\xb3\x98\x43\x0b\xd4\x4e\x26\x60\xc3\xc8\xba\x8e\x25\xb7\x19\x68\x3e\x3f\xe5\x28\x65\x56\x6e\x57\xe5\x7e\x46\x6f\x51\xa2\x4c\xeb\x73\x96\xa9\x27\x1e\x1c\xe4\x2b\x0a\x25\xe4\xb4\x3d\x6b\x58\x0c\x66\x75\x1d\x5e\xce\x55\xb5\x52\x62\xa3\xcf\x59\xd6\x9a\x46\xb3\xb3\x30\xce\x5a\x49\xfc\x4a\x93\x83\xa3\xed\x29\xd8\x9e\x6c\xd9\x95\x6b\x04\xaf\xaf\xa7\x3e\x4d\x00\x94\xf4\x87\x78\x83\xe5\xc7\xe0\xe7\x4d\x6c\x84\xef\x24\xc3\x1c\xf5\xb4\x38\x31\x07\x02\xe1\xf0\x76\x38\xad\xd0\x3e\xf2\x6f\xca\x6e\x03\x7b\x22\xa7\x88\xd5\x0d\xe1\x34\xac\x71\xf2\xdf\x47\x47\xa7\xf0\x5b\x7c\x1e\xa3\xc9\x85\x68\xec\xbf\xb2\x86\x87\x03\xa8\x7d\x4c\x49\xb7\x33\xec\xd2\x9c\x16\x06\xcc\x25\x7d\xbd\x2a\x49\xa5\xbb\x34\x4f\xbb\x03\xa9\xf4\xe3\xdd\xdf\x0f\x0f\xa2\x3f\x3c\x88\xae\xed\x41\x34\x0a\xe3\xf3\x25\x0b\x6a\x17\xb7\x90\x76\xd1\x65\x6b\x9d\x2c\xa3\x2a\xf1\x8f\x37\x61\x56\xb7\xd9\x79\xde\x29\x95\x5c\x06\x5e\x96\xf9\x4e\x0b\xe9\x5f\xd8\xe3\x28\x27\x19\xca\xf2\xa3\x31\x63\x55\xe7\x99\xea\x5b\x97\x72\xf0\xb0\x30\xd3\xe2\x7d\xa9\xa7\x44\x5d\x4f\x3e\x36\x41\x17\x1e\x7e\x9e\xfb\xc3\x31\x3e\x83\x33\xae\x8c\x31\x2b\x60\xd3\x28\x59\x54\x66\x71\xbe\xa8\xcc\xc0\xa6\xc9\x2f\xc7\x95\x91\xac\x55\x01\xcb\xe6\x5e\x24\xeb\x37\x13\x19\xc7\xaf\x87\x75\xe4\x4b\x86\xa9\x9f\xb2\xb8\x90\x26\x5a\xe9\x59\x6d\x5a\x06\x95\x86\x7b\x12\xdc\xc2\xf3\x81\x91\xba\xc6\x47\x91\x8c\x84\xb1\xca\xcf\x22\x44\x1d\x57\x56\xc5\xbf\xe6\xc2\x6a\x76\x46\x92\x51\x49\x58\x54\xb3\xf8\xaa\x81\xc3\x62\x1a\x0f\x4a\xd8\x2d\x3f\x08\xc4\xe2\x4c\x85\x4e\xf8\xc7\xa9\x6d\xfd\x67\x14\x17\x66\xb9\x8e\x5e\xfb\x51\x17\x04\x78\x08\xfb\x38\x6e\xc2\xb7\x0c\x8a\xc7\x3c\x21\x53\x2b\x72\xe2\x29\x6c\xaa\x80\x4c\xa3\x0a\x8e\x29\x35\x2f\x14\x5c\x53\x12\x37\xd4\xf8\xb1\xa1\x4c\xc3\xb4\x15\xb7\xd6\x26\x13\x29\xfd\x89\xa7\xee\x18\xa5\xee\x59\x0c\xe5\x9a\xfc\xe5\x28\xff\x3a\xd6\x98\xb5\x64\x6b\x65\x30\x82\xf9\x1e\x3c\xb0\x78\x0b\x93\x5d\xcd\x9e\x05\xb8\x06\x9f\x4b\xab\x16\xd3\xd0\x45\xe1\x2b\x06\x41\xd0\x19\xd0\x18\x67\x92\x5c\x30\x93\xd2\x68\xf2\x51\xa4\x33\x51\xba\xe4\x19\x28\x60\x4b\x28\x4a\x99\x05\x8a\xde\xbb\x9e\xa4\x36\xa5\x24\x94\xba\xfe\x1a\x73\x74\xa5\x0e\xef\x07\x81\xdc\x65\x08\x9e\x1a\xce\x52\xb4\x75\x21\xa6\xe5\x7c\x23\xbb\x0c\x7f\x84\x51\xc4\xe5\x22\x4b\x73\x59\xc9\x8f\xb2\x04\xfc\x51\x2e\x6c\x05\x75\x25\x54\x99\xd1\xa9\xb1\xc0\x3d\x80\x51\x98\x66\x39\xe4\xe1\x64\x29\x11\xfd\x20\xe0\xd3\xb1\x8e\x2f\x29\xd7\xd0\x7a\x4b\x22\x91\xb6\x08\xff\x9a\x31\xf4\x15\x89\x04\xc2\x0f\xe5\x4e\x70\x6b\x0b\x3e\xd0\xae\x01\xed\x99\xc5\x01\x3b\xcd\x42\x5d\xe4\x30\x86\x24\xc5\x51\x4f\x00\xed\x28\xd3\x0b\x72\x5f\x40\x36\x96\x98\xe7\xc1\x25\xc3\x67\x66\xbc\x10\xb5\xc8\xc5\xff\xa7\x96\x40\xf3\x13\x19\x42\x7b\x1a\x2a\x19\x89\x8d\xf1\x1e\xc7\xa0\x1b\x91\xe6\x93\x16\x1c\x2e\x55\x6d\x6d\xd4\x4d\x3f\x3c\xb3\xc5\x26\x5d\xa3\x8f\xb0\x0b\x27\xa7\x96\xb7\x51\xb1\x55\xaa\x94\x4b\x36\xf9\x2c\x96\x32\xf6\x6a\xc6\x16\xeb\x03\xc9\x28\x1c\x81\x54\xa8\x0a\xb5\xe2\x41\x5b\xf4\x56\x49\x05\x6b\xf3\x25\x0b\x6e\x6d\xc1\xeb\x24\x6e\xe4\x92\xc9\x10\x79\x32\x25\x8d\x16\xe2\x09\x47\xca\xe8\xa0\x0e\xc8\xd5\x4e\x38\x0a\x59\x00\x17\x2c\x45\x57\xd2\x0b\xc5\xad\x20\xf7\x73\xf8\xa2\x62\xc0\x04\x48\x16\xe0\x08\xe5\xc9\x19\x43\x7f\xd3\x68\x70\x27\x90\x06\x7c\x01\x12\x45\x2c\x68\x59\xa8\x0b\x2a\xe3\x9f\xd6\x74\x96\x8d\x45\xdf\x4b\x6e\x22\xb1\x8b\xd4\x8e\x49\x22\x5d\x40\x51\x49\x80\x34\x2b\x83\x31\x8c\xad\x51\x92\x1e\xf0\x79\x5e\x80\xe8\x81\xb1\x8c\x95\xab\x81\xb1\x9d\x37\xcb\x5c\x6d\x94\x7f\x55\xd0\xff\xca\x98\x20\x7f\x30\x3e\x37\x1a\x39\xde\xe7\xd0\x5a\x99\x27\xe0\x0b\x29\xc6\x02\x9a\xe9\x10\x27\x01\x6b\x59\xb5\x90\xdc\x29\xa3\x81\x26\x99\x80\xe2\x20\xe1\x3a\xd5\x2c\xe3\x24\xe7\x25\x24\xc5\xf3\x96\xc9\x75\x65\x2d\x64\xa3\x06\xdb\xb2\x24\x3b\x34\x58\x26\x8c\x85\x30\xd3\x8b\xdf\x12\x89\xa3\xe9\x5b\x23\x74\x8a\x43\x6a\x09\x1a\x63\xad\xd8\x2d\x08\xeb\x3a\x56\xa0\xe3\x49\x55\xad\x7a\x71\xc3\x43\x04\xa5\xb7\x5b\xa7\x08\x29\xb2\x82\x86\xe0\xd6\xd1\x44\x1e\x23\xc5\x81\x1e\x47\x5b\x9a\x8b\x95\xcd\x10\xe3\x74\x80\x46\xaa\xe9\xa5\x9f\x69\xf1\xad\xe5\xd4\x8a\x22\xbc\xce\xdb\xb5\xcc\xae\xd3\x69\xc5\x1b\x1d\x34\x3f\x26\x79\x46\xa9\xd7\x2a\x5f\x40\x95\x68\x8e\x92\x34\xb2\x96\x0b\x53\x0f\xd3\xad\x6a\x9f\x7f\x36\xb3\x21\xac\x3a\xca\xfe\xca\xd4\x12\x38\x58\x20\x42\xcb\x08\x72\xc6\x96\xb1\x97\xc8\x45\x24\x4b\xb6\x9d\x86\xe0\x3e\x63\xb9\xa3\x4e\x87\xaa\x90\x7a\x4d\x77\xd1\xd5\x78\x29\x43\xe3\x4f\x5c\x27\xfa\xd4\xe3\x5c\x88\xe5\xd4\x42\x4d\x57\xd9\x01\xa9\x3c\x7c\xb4\x5f\xbf\x7f\xbb\x5c\xdd\xe1\xe5\x97\x74\x4c\x17\x28\xf4\xad\x7a\x61\x32\xfa\x67\xaa\x48\xd6\x61\x9d\x2d\x16\x8c\xca\x64\x88\x70\xdd\xaa\xc4\xe7\x1a\x2f\xd2\x32\x26\x8f\xc1\x3e\x16\xcd\xb5\xca\xa5\x7a\x51\xac\x5a\x92\x9c\x05\x5b\xea\x3a\xce\xa1\xab\xad\x64\x24\x86\x6a\x19\x91\xc5\xa3\xa0\x5a\xc9\x44\x4f\x86\x6c\xb1\x54\x66\x1d\xab\x5c\x3d\xfb\xa0\xcc\x9e\xce\x52\x06\xaf\x8e\x8e\xc4\x02\x4b\x72\x5f\x77\x7a\x39\x47\x70\x08\xb5\xdc\x40\x5b\x80\xc2\x5e\x49\x93\xb9\x62\x87\x60\x2c\x08\x37\xd4\xe4\xdf\x84\xf1\xb9\x29\x9b\x79\x87\x68\x1d\x43\xf6\xa6\x45\x09\xef\xf0\xe8\x39\xc7\x30\x49\x53\x96\x4d\x13\x74\xd3\x06\x93\x24\x60\x51\xb6\xac\xab\x5c\x32\xd7\x74\x94\x76\x24\x16\xb3\x0f\x49\x69\xca\x4a\x4b\x84\x98\xfb\xb8\xed\x33\x74\xcf\xcc\x38\x97\x47\x15\xe5\xf7\x30\xcd\x67\x7e\x24\xb7\xb3\x5c\x55\x99\x65\x5a\x51\xe1\x8c\x2e\xdb\x70\xcd\x81\x47\x5c\x54\x8e\x45\x5b\xb5\xaf\xbf\x21\x65\x7f\x9b\x06\xd2\x93\x97\xea\xb2\x7c\x02\xc1\xe9\xe9\xe3\x9e\x1a\x5d\xcd\x2f\xa1\xdf\x0c\xa1\xd4\x50\x90\x32\xa5\x96\xea\xe7\x7e\xe5\x06\xbb\x5c\xea\x06\xbd\x78\x95\xc4\x17\x52\x5f\x10\xba\x8d\xe6\xf9\x65\x88\x4b\x83\x8b\x1a\xd4\x95\x65\x75\x69\x51\x2b\xcf\xca\x52\xd9\x5a\x57\xaa\x5a\x8f\xd9\xd9\xa0\x13\xc0\xca\x1b\x3d\xb3\x58\xf1\xec\x7f\xe9\x8b\xb3\x5b\x38\x3b\xac\x3e\xa1\xad\xf6\x66\x68\xdf\x08\x98\xf7\x01\x45\x0f\x86\xb7\xf5\x9b\x18\x66\x2f\xd3\xe4\x32\x63\x69\x8d\xff\x44\x95\x4f\xbe\x13\x2b\x2d\xad\x8f\x84\x4d\x77\x9d\x7d\x35\xe5\xb7\xf4\x55\xf7\xb7\x34\xae\xae\x45\xa6\xca\x00\x57\x14\x36\xcc\x6e\x05\xae\x2b\x9a\x4f\x93\x59\x8c\xa0\x10\xec\x2a\xa3\x8a\x4b\xb4\xdb\x5b\xd9\x20\x97\x8a\xbb\xae\x1d\xaf\xc8\x08\x66\x14\x28\x03\xc1\x15\x21\xca\x0a\x02\xa6\x7a\x65\xf4\xe0\x81\x82\xd5\xe2\x7b\x12\xe5\xb5\xe4\xf9\xce\x3a\xae\x43\x45\x31\x72\x20\xaa\x08\x51\x11\xe4\xb1\xbb\xf4\x9d\xcc\x5f\x63\x56\xd1\x60\xbe\x65\xe9\x19\xe3\x2b\xa1\x32\x60\x32\x9e\x16\x16\x32\x1d\xe9\x69\x72\xe3\x27\x35\x5d\xde\x25\xf1\xbb\x59\x14\x59\x05\x36\x7e\xfa\xe9\xc1\x03\xb8\x17\x66\x47\x53\x36\x0c\xfd\x48\x26\x5b\x16\xf8\xd5\x55\x0d\xd8\xf7\xee\x51\x5c\x0f\xcd\xeb\x22\xce\x87\x31\xc0\x56\xe0\xd3\x62\x7b\x1c\x16\x39\x03\xe4\xc2\xf4\x77\x11\x24\xa4\x74\x83\x27\xa5\x2d\xdd\xdd\x51\xd5\x9d\x0d\x85\x86\x55\x9b\x37\x7d\x22\x6c\x98\x3f\xb2\xb3\x83\xf9\xf4\xb4\xb1\xf1\xd3\x4f\x5f\xbf\xd6\x17\x7b\xed\xe7\x4c\x16\x0a\x33\x7c\x6e\x2f\x1d\x78\x4b\xb2\xa0\x81\x74\xc6\x98\x7a\x34\x7a\x16\xe6\xe3\xd9\xa0\x35\x4c\x26\x5b\x23\xf1\x42\x77\x0b\xbd\x61\x6f\x0d\xa2\x64\xb0\x35\x78\xec\x0f\x9f\x3f\xd9\x1e\x0d\x9e\x3e\xef\x04\x9d\xee\xf3\x67\xec\xe9\x68\xfb\xf9\x93\xee\xf6\x93\xed\x67\xdb\x83\xe1\xf3\xc7\x8f\x47\xcf\x3b\x4f\x86\x9d\xad\x2c\x1d\x6e\x85\x59\x32\x49\xd2\xe9\x38\x1c\x6e\xe1\x21\x79\x38\xdc\x12\x4e\x29\xb7\x4c\x64\x5a\x9f\xb3\xff\x78\xd3\xed\x34\xdf\x74\x1f\x0b\x13\xb9\xf8\xb7\x8c\x49\xe9\x52\x21\x6d\xb4\xf9\x14\x1f\x21\x21\x47\x46\x49\x2a\xad\xd0\xf6\x5f\x1d\xf7\x0f\xde\x1c\xbc\x3d\x78\x77\xdc\x17\x46\xe1\x16\xcc\x3d\xa3\x8e\xd3\xc0\xde\xb5\x04\x62\x0d\x7c\x80\x35\x67\xfe\xf0\xa9\xcd\x31\x15\xd4\x33\x18\x06\x13\x5a\xff\xf9\x9f\x52\x5e\xa3\x35\x4f\x11\x0d\x3b\xca\xf2\x64\x9a\x2f\x8e\xf1\xd2\x90\x83\x33\x81\xd9\x51\x45\x30\x73\x0f\x4e\x4e\xa1\x07\x5f\xae\x2c\x18\x68\x99\xf0\x5b\x1c\xb1\x2c\x7b\x9f\x8f\x59\x7a\x19\x66\x0c\xf9\x70\x14\xb2\xc0\x11\x66\x48\x62\x21\xdf\x17\x37\xcd\x8a\x35\xb1\x32\xec\xc2\xbd\x42\x01\x7c\x1e\x69\x27\xb5\xa8\x2c\x17\xda\x72\xb3\x23\x71\x75\x28\xeb\xc1\x83\xda\x29\xcb\xa7\xe4\x1e\x04\x8c\x4d\x27\x3c\xdf\x29\x74\x7c\xc6\x5c\x0f\x6a\x50\xdd\xf8\xe9\x27\xe1\x1e\xd6\xea\xb6\x10\x85\x48\x1e\x6c\x53\x5d\xbe\xca\xdb\xef\xaa\x3e\x5b\x17\xdd\xf2\x91\x9a\xb8\x61\xb7\x23\xeb\x0a\x56\xc0\x5a\xb2\xda\x72\x52\x8b\x1a\x55\x3d\xb8\x72\x2d\xdc\x91\x06\x82\x3e\xab\x60\x2d\xae\xc5\xf3\x30\x96\x8e\x2f\xbf\x5c\xed\x6c\xfc\x44\x16\x7d\x45\x82\x0b\x8b\x04\x42\xdc\x7c\x8b\x2a\x32\xd4\x19\x9e\xea\xaa\x78\xc5\xf7\xd3\x4f\x3f\x19\x8d\x48\x6b\x81\xe5\x7d\x36\x2c\x0b\xca\xa8\xef\x6c\xfc\xf4\x13\x17\xf4\x3f\x5d\x6d\x58\x88\x48\x7a\xd7\x23\x82\xfb\xeb\x72\xd7\x0c\xcb\x05\x7a\x93\x6a\x34\xbf\x6e\x0f\x0c\x98\x35\x3d\x90\x0f\xbf\xab\xa1\x6b\x9e\xb6\x68\x71\x3d\xd8\x0d\xa2\x8d\x8c\x80\xa5\x21\x17\xd8\xdc\x06\x7f\x3d\xa3\x50\xfe\x21\x09\x0e\xe9\x05\x43\x09\x12\x41\xfb\x1d\x2a\x4b\x30\xeb\xca\x0a\x86\x11\x65\xf5\xf5\x69\x85\xac\xf8\x42\xd6\xa7\x38\x60\xbd\xf2\xdc\xe4\xca\x9b\x81\xdc\x7e\x1c\xd0\xdc\xc7\xf8\x09\x6f\xd1\x85\xca\x6e\x11\xf1\xdd\x5d\x1b\x3d\x2e\x6f\x28\xc2\x65\x1d\x8c\x1b\xcc\xd5\x3a\x22\x6e\xfc\x64\x38\x7f\xb3\x10\x22\xe0\xe4\xa4\x47\x75\x4b\xdb\x8e\x19\x89\x5f\xbf\x96\x09\xb0\xa3\x11\xf3\x57\x97\x58\x1b\x26\xf3\x89\xea\x37\x91\x1d\x7c\xe6\x5d\x6d\x6c\x28\x1e\x6a\x91\xd9\x79\x99\xb9\xf6\xa3\xc8\xa1\x08\x0c\x95\x6c\x85\x64\xb7\x79\x03\x4b\x0b\x21\x53\x72\x4c\x43\xa7\xb1\xd2\xac\x09\xb2\x71\x32\x8b\x02\x18\x30\x34\x60\xe3\x15\x1b\x88\xda\x86\x45\x92\xa2\x77\x60\x67\x9a\xb2\x0b\x0f\x62\x36\xb7\x85\xb0\x9e\x11\xba\x40\x65\xd7\xd1\x39\xde\x86\xdc\x36\xa8\x6a\xfd\x8e\x39\x6b\x6f\xaf\x86\x1b\x80\xab\x14\xf1\x55\x9e\x62\x7f\x7f\x83\xdb\xd6\x90\x8e\x19\x5e\x25\x51\x92\x1e\x0b\x05\x94\xcb\xca\x8a\xe4\x52\xa5\xbf\xb3\xf9\x71\xf2\xf1\xd7\x97\xba\xbc\x4c\xd9\x31\xde\x9f\x0e\xd1\xdb\x0f\x43\x50\x48\x71\x33\x41\x17\x3c\x63\xf9\xab\x24\xce\x53\x3f\xcb\x3f\x72\xf1\x07\xbb\x50\x4c\xb2\x0a\xbf\x99\x4d\xc2\x18\x0d\x61\xb0\xa0\xfa\xd4\x85\xd8\x64\x3a\xf6\xb3\xf0\x4f\x46\x7e\xc6\xe8\xb7\xce\x1e\xf9\x01\xc3\x7b\x9c\xc0\x48\x0c\xfc\xf4\x1c\x5d\x82\xd1\x0f\x9d\x11\x85\x67\xe3\x1c\x73\xc4\xaf\x1d\xae\x2b\xc3\x25\xf3\xcf\xf9\xf8\x96\x5d\xc2\xcc\x32\xd6\x1c\xb0\x51\x92\xb2\x26\x8d\x92\x70\x1e\xf3\xd0\xf4\xa9\xe1\x03\x05\xaf\x80\xcb\x71\x92\x09\xa7\x1a\xe4\xe5\x66\x12\xe6\x74\x6b\x9b\x8f\x19\x9c\x85\x17\x2c\x26\x5f\xbc\xca\x35\x0d\xf9\x60\xff\x42\xf5\xaf\x44\xd5\x63\xe9\x99\x83\xd7\x1c\x30\x18\x46\xfe\x64\xca\x82\xaa\x0a\x93\x30\xc6\xe2\x51\x72\xc9\x52\x18\x24\xb3\x38\xf0\xa5\x37\x1c\x06\xc9\x2c\x9f\xce\x72\x6a\xb2\xb2\xb6\x3f\xc7\xda\xb3\xe9\x74\x95\xda\xa9\xe8\xaf\xaa\xbf\x2f\x3b\x2e\x7d\xf2\xa0\xeb\xe1\x93\x49\x18\x7b\x1c\xf6\x69\xc1\x90\x98\x77\x43\xaa\xb0\xb2\x8c\x7e\x20\x44\x3d\xfe\x99\xe7\x14\x9c\x67\xa0\x6f\x06\x3a\xb0\xd2\x05\x5f\xe8\xda\xba\xa0\x3f\x97\x05\x4d\x25\x7e\xc7\x70\xd3\x22\x0e\xe4\xc8\xfb\x18\xe7\x65\xf3\x09\x29\x1e\x59\xf8\x71\x20\x0f\x1a\xf1\xbc\x4e\x9d\xd5\x59\x23\x96\x08\x27\xf8\x04\xa4\x09\xaf\xe5\x84\x08\x28\xc9\x2c\x9b\x49\x07\xfb\x3c\xa3\x85\x8d\x34\xe1\x7d\xcc\x20\x19\x79\xd0\x48\xcf\x06\x0d\xfa\x83\xb1\x3e\xc7\x59\x24\xfe\xf8\x0d\x13\x08\x4a\x55\x09\x43\xe0\xd7\x84\x93\xd8\x8b\xbd\xf8\x14\x92\x54\xfc\xf4\xe2\x53\x7b\xac\x64\xe3\xfb\x78\xf0\x48\xe8\x52\x5a\x61\x74\x2a\x64\x85\x83\xc5\xb5\xd5\xb7\x88\x79\xac\xfb\xe1\xa9\xc3\x67\xc4\x67\xd7\x42\x6f\x67\xc3\xf4\xf1\xa2\xfd\x8e\xf1\x0e\xbb\xf0\x02\x9a\x1d\xc3\x79\xd0\xfb\x38\x5a\x48\x1c\x8c\x3b\xc0\x6d\x63\x28\xc2\x38\x07\x27\x6c\xb1\x16\xbe\x9f\xf1\xa3\xe9\xd8\xa7\xe8\x50\x55\x06\xa9\xdb\xfc\xcf\xe6\x2e\x74\xcc\x13\x72\x0e\x89\xa2\x88\xa3\x4f\xe9\x43\xb9\xed\xe3\x89\x1e\x74\xda\x6e\xc1\xbb\x09\xee\xa9\x78\x8f\x94\x44\x35\x3c\xa6\x97\x3b\xc6\x87\xce\xee\x98\x5d\xd9\x18\xff\x4d\x68\x38\x0d\xd8\x94\x38\xb5\x4f\x79\x8a\x07\x46\x52\x07\x93\xfe\xcb\x4a\xeb\x52\x5a\xa3\xe4\xc1\xe8\xd6\xed\x14\x9a\xb1\x3c\xf4\x50\xaa\xb4\xf0\xe7\x9a\xdc\xa3\xaa\xfe\x6d\xee\x4a\x30\x26\x13\x9c\x6c\x23\x7c\x77\x39\xce\xbc\xae\x28\x62\x1c\x47\x1b\x25\x96\x4e\x61\xbc\x6a\xe1\xdc\x3d\x66\x73\xe1\x32\x8f\xf3\x0b\xde\xc5\x9c\x0d\xa4\x63\x45\x31\x81\xab\x67\x25\x34\xe1\xef\x6c\x4e\xbf\x3d\x40\x26\xfb\x8f\x38\x8e\xf9\xbc\xe2\x7f\xe3\x38\xa6\xba\x35\xd3\x8a\x37\x73\xed\xd4\x92\xcb\xaa\x39\xab\xf0\x46\x05\xc9\x55\x45\x5e\x7a\x6f\x97\xb3\x38\x60\x81\x5c\x79\x1b\xff\xd1\xd8\x29\x73\xbd\xb0\x50\x37\x41\x95\x27\x80\x0d\x6a\x53\x32\xca\x70\xec\xa7\xfb\xb9\x13\xba\x6a\xe8\x54\x8a\xe9\x02\x72\x28\x10\xb0\xa0\x58\x3e\x95\x94\x14\x10\x42\xb9\xa7\xa7\x19\xc1\xcd\x66\x83\x2c\x4f\x9d\x8e\x07\x5d\xd7\x83\xce\x13\xe1\x18\xfe\xac\xae\xe0\x76\xa1\xe0\xa0\xae\xe0\x63\x55\xb0\x18\xa8\x82\x4b\x1b\x63\x06\xb4\xd2\x22\xb7\xb7\xce\x4a\x29\x03\xc9\xb1\x57\xe5\xa5\x3e\xb6\x17\x0c\x19\x69\xc5\x58\x34\xf0\xbe\x95\xb0\x13\x2c\xf7\x2e\xc9\x59\x0f\x5e\x27\x8c\x5e\xfe\x65\xb3\x29\xea\xa3\x9c\x69\xfe\x4b\xb6\x59\x58\x5e\x8a\xcc\xa9\x64\xb7\x60\xce\x04\x57\x8f\x1e\x32\xa7\x27\x59\xd4\xe3\x20\x1d\x17\xff\xf8\xfc\xef\x38\x8b\xc4\x1f\xdf\x71\xed\x65\xe1\x0b\x79\x47\x90\xc1\xe6\x08\x8b\x9e\x58\xcf\x4f\x4e\xaf\x38\x67\xbf\xfd\xed\xd0\x5a\x24\x6d\xae\xb6\x55\xc0\x6a\xa6\x16\x8c\xd4\x16\xe7\xe8\xff\xd1\x28\x2c\xd8\x25\x18\x55\x13\xc5\xb5\x98\x6c\xc2\x55\xba\x54\x49\x39\x25\x7c\x1d\xed\x48\xc1\x5a\xa6\x88\x43\xf8\x62\xd6\xf6\x44\x65\x55\xb0\xb0\x6c\xe9\xa2\xa2\x91\x4d\xe8\x78\xd6\x9c\x82\x26\x74\xdc\x56\x36\x8d\xc2\xdc\x69\x78\xb2\x45\x01\x44\x8c\xa4\x1d\xf8\x5a\x1d\x2b\x1a\xbd\x46\x1e\xfe\x25\x4a\xfc\x5c\x9d\x0f\x93\x99\xb1\x66\xdb\x2f\x40\xe3\x43\xe6\xfe\x72\x74\x44\x53\x57\x96\x34\x94\x41\x8f\x32\xe9\x79\x18\x55\x6d\xc0\xb0\x3c\xda\x21\xdc\x65\x42\x1d\x51\x9c\xf6\x4b\x92\x4e\x66\x91\xdf\xc3\x53\xe2\xde\xd6\xd6\xe5\xe5\x65\xeb\x72\x1b\xdd\x09\x1e\x7f\xdc\xea\xb6\xdb\xcf\xb6\x3e\x1e\xbc\x6a\xfe\xf1\x6a\xff\xd7\x6e\xbb\xc9\xbf\x3b\xdd\x4e\x67\xeb\x3f\x64\x03\x4d\x6c\x20\x60\xa3\x1a\xce\xe5\x3a\xf3\x59\x8a\x8e\x1c\xef\x8e\x7d\x0b\x6d\x0c\xfc\xe1\xf9\x9d\xb7\x51\xa1\xe5\x16\x88\x2a\x14\x7c\x53\xe7\x6d\x43\x13\xba\x1d\x12\x0a\x5d\x08\xc2\xb3\x30\x87\x69\xca\x86\x61\x16\x26\x71\xe1\x41\x5d\x71\x43\xe4\x68\x52\x79\x46\x97\xb4\xda\x15\xcd\x26\xfb\x85\xfd\x91\x51\x47\x71\x73\x34\x9b\xbc\x2c\x16\x33\xc0\xed\x28\x85\xc6\xde\x9f\x39\xe4\xff\xcc\x9f\x3b\xbc\x1d\x0f\xc1\xf0\xa5\xa0\xdd\x6a\x3f\x76\x61\x4b\xe6\x87\x71\x55\xbe\xc9\xb3\xef\x90\x5e\x8e\x05\xbf\x95\x27\xbf\x84\x73\x16\x38\x5d\xd7\x45\x27\x21\xc7\xe9\x2c\x1e\xa2\xb5\x58\x8e\x4c\x89\xa4\xca\x0c\x7e\x3e\x46\x83\xf3\xc8\xcf\xc3\x0b\x06\x03\xb4\x82\x8d\x59\x46\x62\x35\x5e\xc0\x34\xe1\x6a\x60\x18\xab\xc5\x3f\x9b\xfa\x43\xae\x87\x3e\x84\x98\xaf\xf3\x51\xf8\x27\xed\xb8\xda\xb8\x40\xe2\x06\x30\xcb\x01\x03\x06\xa2\x94\xee\x60\x3a\x6d\xff\xb2\x1c\x2e\xc7\x61\xce\x2a\xe7\x44\x66\x4f\x8a\x3f\xf6\x0f\xb7\x7e\x7d\xb3\x75\x19\x9e\x87\x5b\x1f\x05\x7e\xfd\x48\x12\xfa\x7b\x8b\x6f\xc9\x9b\x4b\xa8\x45\xd2\x80\xb7\x5f\xe2\xd4\x4e\x89\x21\x35\xc7\x14\x54\x7e\x25\xa1\x83\xea\xad\xbf\x28\xaf\x34\xe2\x42\xf9\xd6\x75\xaa\x3f\xda\x68\x9d\x0d\x4c\xb8\xa2\x66\x9d\x38\xb5\x14\x7a\xd8\xda\x85\xee\xe3\xc7\xc8\x5a\x7a\xfc\x6d\x53\x08\x5e\xec\xe7\x5d\xce\xaf\xdb\xcf\xbb\xcf\x60\x8f\xea\x41\xa7\xdb\x7a\xde\x85\x1e\xf9\xc7\x9b\x26\x97\x0e\x07\x2e\xf8\x1a\x19\xbf\xc3\x7f\x78\xd0\x6d\x3d\x72\x6d\xd7\xda\x05\x36\xde\x96\x4c\x6c\xb4\x29\xe6\x82\xd3\x6e\x75\x3b\xdd\x27\xf0\x90\xf7\x91\xb4\xef\x76\xeb\x69\xe7\x71\x57\xa4\x74\x28\xa5\xfd\xb4\x2b\x53\xba\xa7\xae\x9a\x33\xdb\x62\xe9\xd3\x67\x98\xcb\xa9\x5b\xde\x7f\x14\x97\x59\x8b\xb4\x7c\x3b\xb1\x05\x9d\x76\x5b\xad\xaf\xa5\xa3\xbf\xb7\x7e\xce\xd2\xd0\x8f\x9a\xbf\x1d\xf6\x60\x16\x0b\xcd\x85\x05\xf0\x49\xe9\xf9\x5c\x57\xfa\x24\x16\xc9\x86\x6b\xae\x4c\xaf\xe9\x14\x46\xcd\x36\x39\x67\x67\xa9\x07\x01\x9b\x32\xb2\x81\x4a\x62\x08\xf3\x0c\xd4\x4c\x42\x6f\xa5\x6f\xd0\xf8\x9d\x16\x2c\xf4\x48\x4a\x07\x39\x2c\xf0\xf0\x97\x99\x23\x60\xa3\x91\xd2\x77\x99\x83\x85\x33\x94\x61\xc2\x46\xa3\x70\x18\xb2\x38\xdf\x6d\xb7\x3a\x8f\xa1\x09\x93\x59\x94\x87\xd3\x28\x2c\x1e\x8c\xc8\xa9\xb7\xd2\xee\xbc\x85\x1b\x92\x30\x9e\xce\x72\xb9\xee\xf3\xee\x52\x4d\x16\x80\x9f\x71\x1c\xed\x89\xac\xce\xc7\x8a\xb3\xd8\x40\xb2\xfa\xd5\x76\xc7\x7e\xb5\xdd\x59\xf6\x6a\xbb\x73\x0a\x3d\xe0\x5d\x35\x85\x7f\x95\x0c\x79\x01\xed\xd6\x63\xd8\x13\x83\xe7\x08\xe2\x1b\xb8\xb8\xd0\x93\xe3\x57\x95\x6b\x32\xd3\x11\xa3\x63\x01\x7f\x90\x25\xd1\x2c\x67\x90\xa7\x7e\x9c\xe1\x4b\xae\xe1\xa2\xa0\x73\xc3\x3e\x9a\xf6\x84\x19\x7a\xde\xc5\x83\x02\x93\x84\xc9\x05\x4b\x2f\xd3\x30\xcf\x59\xfc\x6f\xe2\x19\x52\x20\x9a\xfa\x90\x2f\x93\xbd\x43\x5c\x87\x63\x3f\x8e\x59\x44\x67\x1e\x36\xff\x7c\x53\xf6\x19\xf9\x01\x93\xe3\x60\xe8\xad\xc3\xe5\x82\x1f\xa4\x21\x85\x7d\xc0\xd7\xf6\xd0\xc9\x8a\xb5\x1d\xc8\x55\x94\x1f\xbe\x10\xc0\xd7\xaf\x50\x4c\x27\x11\x66\x1c\x10\x88\x63\x8c\x5d\x68\xf8\x0d\x79\xb6\x57\x3c\x5f\x90\xb1\x41\xad\xa3\x83\xda\xd3\xac\xb2\x88\xca\x8a\x1b\xb6\x7f\x9f\x08\xf9\x77\x4a\x8f\x25\xd3\x74\x25\x36\xb0\x85\x0c\x31\x83\x91\x56\xcf\x12\xd7\x9e\xa0\x19\x0b\xd6\xc3\x5d\xe8\x40\xd3\x6c\xab\xb0\x44\x56\x81\x2d\xab\x1d\x2b\x1e\x19\x5a\xad\x87\x75\xad\xcb\x13\xc3\x9b\x72\xdf\x1b\x12\x7d\x3f\xd8\x4f\xd8\x33\xd7\x2e\x04\x7f\x21\xfe\xdb\xdc\x05\xa7\xd3\x6e\x23\x13\x58\x39\x2e\x3c\xfc\x77\x71\x25\xc7\xa9\xfb\xf8\x71\x11\xa7\xb0\x0a\xa7\xb2\xef\xee\x15\x98\xd5\xbc\x01\x5d\xd9\x61\x73\xa9\xe6\xdd\xfa\x62\xbe\x23\xb7\x20\x6f\x93\xc0\xaf\x73\xde\xf6\xb8\xdb\xe6\xe5\xae\x69\x49\x99\x46\x53\x33\xa5\x98\xd7\x1b\xc0\x95\x23\xfb\x21\x8e\x53\x50\xd0\xeb\xbc\x19\x20\x76\xae\x74\x62\x2b\xfc\x46\xdd\xbd\x6b\x83\x0a\xcf\xc3\x85\xb1\xbb\x9d\x6f\xdb\x6f\x34\x76\x61\xfc\xfa\xfd\xdb\x3a\x3f\x4f\x8f\xed\x62\x4b\xdd\x6c\xf3\x02\xdf\x85\xaa\x65\x7f\xce\x15\x4e\x66\xff\x7e\xfc\xf6\x0d\xf0\x9e\xf9\x71\x00\x47\xbf\xff\x8a\xbf\x27\xfe\x02\xc6\xfe\x05\x33\xc2\x04\xc8\x73\xe4\x88\x5d\x30\x7a\xfd\xbb\xb5\x05\x59\x62\x3e\x16\xa6\x40\x1a\x74\x05\x91\xb3\x39\xbe\x78\xcd\x99\x1f\x90\xc2\xac\xec\xa2\x31\x96\x8a\x30\x78\x6b\x6d\x98\x5c\xc9\x29\xa7\xb0\x35\x8d\xcd\x05\x40\x0f\xdf\x66\x9a\x11\x08\x44\x06\xfa\x60\xf5\xc3\x8a\x97\x09\xc5\x02\x0e\x42\x28\xc5\x6a\xd4\xc5\x30\x1e\x8b\x74\x8d\xfa\x41\x44\x71\xaf\x03\x4b\x11\x20\x92\x00\x0d\x77\xee\xdd\xbb\x0e\x0c\x35\x0e\x0f\xa0\xf3\xc4\x46\xa1\x1c\xfb\x20\x1a\xf8\xc3\xf3\x42\xbf\x0d\x89\x0a\x3d\x55\x48\x3e\x9e\x30\x14\xeb\xca\xda\xea\xb0\x9c\xbe\x82\xc4\x20\x23\x76\x81\xf7\x45\x54\x71\x4b\x01\x34\xa4\x7f\x58\x2a\x49\x6f\x64\xc9\xb3\xc5\x3b\x42\x6d\xa3\x18\xb9\xe1\xaa\x22\x54\x61\xe9\x7d\x47\xf9\x49\xc7\xed\x9c\x94\x7e\x33\x9b\x17\x3d\x87\x92\xcb\x98\xa5\xda\xf3\xb1\x22\xbb\x95\xee\x68\x92\x4b\x6f\x57\x09\xc5\x1f\x45\xca\x59\x65\xd1\xe8\x4b\xc1\x5b\x42\x36\x6d\x3b\x54\x22\xdb\xf6\xed\x5c\x8f\x7e\x23\x91\x79\x38\x4c\xe2\x97\xb3\x3c\xaf\x0d\x7d\xf8\x98\x1c\xe4\xfd\x1b\xd7\x3c\x8d\xe2\x5f\x60\xe1\xdb\xfe\x8b\x79\x58\x14\xa3\x88\x8a\x75\x8d\xfb\xc4\x67\x8f\xff\xdd\x03\xc8\xb1\xab\x1a\x3b\x8d\xfb\x7e\x90\xa4\xb1\xf0\xd9\x5d\xed\x5a\x77\x25\xcd\xcb\x86\xf5\xcd\xfa\xa2\x5a\x58\xde\xa9\x37\xfe\x80\xd5\xaa\x92\xe4\xc6\x6a\xa5\x0e\x21\x9c\x6f\xd6\x19\x84\xfe\x57\x98\x59\xff\xc6\x20\xb6\x77\xb8\x0a\xd1\x63\x7f\xdb\x25\x86\xe5\x70\xb0\x5b\xe7\x25\xb4\xe8\x99\x70\x7b\x89\x86\x2a\x61\xa9\x3a\x36\xe2\x75\x6d\x3c\xad\x29\xbf\xac\xa9\x02\x64\x05\x81\x4c\x00\xfe\x08\xf3\x71\x32\xcb\xb5\x6f\xb9\xba\xa6\x1f\x5f\x57\x71\x19\x0e\x75\x6d\x29\x98\x29\x1b\xa1\xe5\xe6\xdf\xc2\x78\xcc\xd2\x30\x67\x81\x0e\x42\x49\x6b\xc7\x4b\x3f\x63\xaa\xb0\x5f\xeb\x4a\xbb\x63\x80\xf4\x87\x4b\x3d\xcb\x61\x01\xc3\xb1\xab\x9f\x65\xb1\x3f\x61\x75\x9e\xd5\xbb\x15\x45\x97\xfb\x80\x95\xa5\xb4\xfb\xdb\x30\x1f\x1f\x49\xfe\xaa\xdc\xe4\x54\x14\x5d\xea\x2c\x57\x95\x52\x15\x35\xb5\xea\xf8\xf4\x71\x45\xd9\x65\x8d\xe8\x52\x86\xa7\x5d\x36\x5d\x26\x1d\xb7\xdb\x4f\xcb\x65\x97\x7b\xe5\x15\x85\xbe\x8b\xe0\xe2\x78\x0d\x78\x6b\xe4\xcf\xe9\x97\x28\xb9\xc4\xa7\x63\x1f\x44\xbc\xd4\xac\x2f\x03\x9f\xf6\xc5\x6b\xb2\x5a\x6e\x6b\xdd\x10\xce\xd7\xaf\x95\x80\xda\x6e\xcb\x8f\x17\x3b\x37\x42\xed\x7d\x1a\xb2\x38\x97\x4f\x8e\x2a\xc5\xc5\xf3\x95\xf1\x33\x81\xad\x82\x63\x98\xc9\xf1\x37\xde\xdf\x61\x92\x33\x1c\x87\x51\x60\x29\xe6\x98\x82\x21\x8c\xe8\x1d\x1f\xc6\xfd\x48\x59\xdc\x1a\x26\xb3\x38\x97\x15\x28\x9e\xe3\x83\x07\x54\x9c\xee\x09\xac\xaf\xd6\x64\x16\xbe\xf3\x27\x75\xa9\x78\xdf\xa0\x18\xa9\xb1\xa3\xde\x16\x28\x91\x5e\x92\xf1\x3a\x06\x22\xa6\x38\x16\xd6\x62\x09\x4e\x92\xbc\xa7\x76\x8f\x22\xea\x4a\x0f\x1a\xa3\x88\xcd\x1b\xd2\x5c\xd6\x8f\xc2\xb3\xf8\x30\x67\x93\xac\x07\x8d\x21\xe3\x5c\xdb\xd0\xce\x09\x83\x20\x8c\xcf\xde\xb0\x51\xde\x83\x76\x21\xf5\x63\x78\x36\x36\x93\xb5\x79\x47\x4f\xc4\x75\xa1\x0d\x29\xe5\xfb\x51\xce\xd2\x18\x6d\x03\xb0\x8f\x1a\xaf\x89\x9f\x9e\x85\x71\x0f\x1a\x6d\xf0\x67\x79\xd2\xd0\xdb\x58\x4d\x86\x15\x39\x81\xab\xeb\x35\xfc\xd4\x76\x5b\x49\xcc\xde\x8f\x78\x0d\xe7\x44\xbc\xa3\xbc\xe9\x44\xb2\xdf\x86\xee\xdd\xb4\x7e\xaf\x0e\xb3\x6c\xec\x4f\x99\x73\x33\x68\x6e\x75\xe8\x5d\x0e\x4d\xd8\xd1\xd5\x64\xd3\x51\xfb\xa9\x7b\x33\xd2\xa2\x8f\x56\x61\x4e\xa9\xbc\x34\xfe\x2d\xc4\xf0\xcb\xf4\xf1\xc1\xcf\x32\x86\x91\x72\x2f\x42\x1f\x3e\x71\x6e\xfe\x04\x4d\x98\x52\xb2\x8c\x39\x9a\x27\x94\x85\x4c\xf0\x49\xba\x70\x04\xf0\x87\x9c\x35\x6a\x29\x34\x48\x92\xc8\xdb\xa8\x6d\xfb\x08\x3d\xcc\x20\x87\x45\x11\x46\x3b\xe5\x6d\x4c\xa5\xb7\xb3\x30\x6f\x64\x78\x44\x15\x85\x2c\xd0\xd6\x92\x45\x9e\x04\x19\xc8\xcf\x40\xab\xc4\xb6\x2b\x23\xf8\x8a\x22\xeb\xfb\x66\x7f\x21\x49\xc1\xa7\xcd\x7e\x9e\x00\x06\x57\x87\x30\xce\xc2\x80\x59\xa5\xfc\x8c\x84\x44\x8a\xb7\xc2\x02\x15\x99\xa2\x7c\x17\x7c\x5f\xee\x6d\x85\x99\x58\xcb\x82\x5b\xd5\xed\xfd\x7b\x67\x8d\x81\x4a\x3d\x3f\x21\xb9\xa5\x13\xd6\x3a\x69\x82\x7a\xe1\x0a\x30\xb8\x80\xaf\xef\x03\xcd\xd5\xa5\x9c\x9d\xc1\x30\x99\x4c\xc9\x51\x15\x17\xf6\x78\xa7\x75\x98\xa9\x99\x95\x80\x62\x1d\x83\x5b\x64\x95\x75\xa7\xd4\x6b\x7a\x78\x44\x96\x9c\x03\x3a\xa6\xc1\x20\x63\x1c\x21\xf1\x2a\xe9\x06\xf8\xc8\x1a\x37\x40\xe7\x78\xcc\x20\xe4\x12\x5d\xac\x5c\x2c\xe0\x13\x9b\x7c\x6e\xb2\x29\x44\x76\x03\xbc\x64\xfd\x60\xfd\x10\xfd\xa6\xe8\x5f\xce\xb5\x91\x9f\xe5\x6b\x72\x0d\xaf\x4e\xef\x25\xfd\x9b\x88\xca\x12\x08\xad\xd1\xdd\x54\xda\x59\x9a\xe5\x9a\x83\x66\xc0\x58\x4b\xea\xd5\xd4\x5f\x59\xf2\x99\x7d\xb8\x1b\xc6\x31\x20\x9a\x12\x90\xc2\x54\x19\xbe\xb7\xd9\x94\x76\x4c\x8e\x74\xb0\x2f\x6c\xb6\x68\x75\x96\x5e\xf3\x5b\xf4\xa9\x35\xc8\xc2\x32\xaa\x8a\x15\x32\x94\x7f\x6b\xb1\x92\xa9\x82\x32\xc1\x72\x80\xcd\xe5\x26\xef\x8a\x2e\x25\x53\x55\x31\x25\x16\x55\x11\x99\x52\x70\xa5\x6d\xc3\x60\xca\x3d\xad\x92\x63\x32\x5f\x26\xc8\x02\x21\x69\x94\x94\xc9\x3f\x64\x06\x9f\x24\x2a\x83\x7f\xc8\x0c\xc9\xfe\x2a\x53\x26\xa8\x02\xd6\xde\x47\x94\xd1\x69\xaa\x18\x3a\x6b\x15\x31\x42\xea\xce\x2d\x54\x14\x55\x1a\x30\x0f\x4e\x1a\x34\x36\x0d\x0f\x1a\x45\xf2\xf3\x34\x49\x69\xfc\x2d\xe9\x89\x1f\x92\x72\x2a\x87\x65\xfc\xa7\x24\x08\xff\xcd\xfb\xcf\xff\xf2\xee\xf2\xbf\xb2\x67\xf8\x5b\xf7\xa0\x81\xba\xa5\xb4\xf6\x93\x8d\xe8\x70\x27\xea\x04\x42\x63\x2f\x1a\x6c\xf1\x1d\x8b\x47\xe5\x0a\xa7\x44\xba\xec\x97\x2b\x4f\x0e\x6b\x99\xc3\x4a\xcc\xe8\x7a\x36\x37\x69\xd3\x73\x4e\x09\x53\xab\xd5\x3a\xa8\xc9\xde\x65\x05\xb0\x9a\xab\x8d\xf5\xb6\xc0\x84\x7a\xe5\xb3\x99\x8b\x16\x2c\xcd\x53\x5a\x6e\xda\x1c\x63\x09\x43\xe3\x83\x76\x48\x46\x67\x60\xd7\xde\xc7\xa6\x2c\x76\x61\x4f\x9e\x26\xa9\xe8\xb3\xe8\xbe\x40\x7a\x9a\x51\x33\xcf\xa0\x87\xcb\x85\x4e\xb1\x12\xba\x55\x95\xb5\x10\x2f\xe3\x74\x44\x16\x13\xa4\x50\x90\x8c\xef\x94\x71\x84\xad\x9b\xc0\x55\xda\x30\x8e\x79\xec\x46\x90\x47\xe4\x69\xa5\xc1\x1c\x55\xe4\x36\xf5\x30\xcd\x8f\x57\x1e\xcd\x31\xd7\xc0\x92\x50\xbc\xda\xd8\xd0\xa2\x10\xa3\x7b\xa3\x38\xa5\xd9\x3a\x64\x59\xd6\x62\xf1\x45\xeb\xdd\xfb\xd7\x07\xfd\x83\x77\xbf\xa3\x75\xea\xfd\x69\x9a\x04\x33\xe1\xa2\x6c\x0f\x9c\x7e\x8a\xb1\x10\xbf\xac\xac\x48\x5a\x7a\xe9\x8a\xdb\xa1\x1b\x6f\x4f\x7e\x6c\x22\xee\x7c\x13\xb1\x71\x75\x9d\xbc\xe2\xac\x60\xc9\xd4\xa5\x7c\xe0\xde\x04\x9c\x10\xde\x4b\x95\xc1\x95\x01\x1a\x0b\xc0\x12\x26\x5a\x15\x9c\xb1\x6e\xdc\x01\x34\xb1\xf2\xfc\xd0\xee\x57\xd1\xee\x57\x25\xaa\x58\xc6\xef\x60\x78\x0c\x45\xe0\x2e\xa0\x19\xaa\x84\xf7\x43\xfd\xff\x76\xea\x3f\xe7\xb4\x94\x8d\x5c\xf4\xfc\x56\x65\xcc\x42\x51\xdd\xf4\x75\x8e\x1e\x2a\xe1\x87\xdc\xd1\xeb\xa4\xbb\xf4\xe6\xf3\x8a\x5c\x10\x2e\xbb\x4a\x75\xb6\x5d\xd7\x2d\xdd\xcc\x2e\xf5\xe1\x6a\x9a\x78\x2e\x89\x00\xcb\xe6\x6c\x48\x7b\x99\x3c\x5d\xd8\xd7\xd3\xf7\xee\xf1\x4c\x11\x81\x06\x86\xe8\x2f\xca\x29\xbe\x91\x55\x66\x4e\x55\x61\x7d\xb7\xbf\x95\x3f\x4c\x85\xff\x9b\x30\x66\x7e\xea\x28\xe3\x2b\xec\xc8\x38\xcc\x5a\x7d\x65\x67\x26\x2d\xb3\x50\x77\xa1\xf2\x86\xe3\x53\xd2\x43\xfc\x94\xf9\x47\xb9\x9f\x1a\x17\xf6\xea\xb2\x9e\xc0\x61\x94\x74\x11\x7d\x16\x8f\xed\x79\x95\x83\x38\xb8\xae\xc2\x3b\xff\x9d\xaa\xc2\x93\x96\xb7\x42\xaf\x26\xcd\x66\x78\x9d\xea\x66\x94\x37\x73\x6a\xea\xeb\x57\xeb\x93\x2b\x5e\x6d\x15\x4b\x40\x02\xde\xdd\x85\x8e\xeb\xda\x14\xa2\x58\xe7\x1f\xfc\x5c\xc5\x91\xb1\x3a\xd0\x81\xa6\x91\xa0\xf0\x42\x80\x06\x56\x73\x0f\x16\x12\xb3\x39\xec\xc2\x26\x4f\xe0\x7f\x17\x04\x33\xbb\x0c\x91\x7f\x0c\x74\x0c\x43\x69\x3f\x63\xd0\xee\x15\x88\xd0\xd9\x31\x31\xd9\x2b\x60\xcd\x13\x8f\x13\xd1\x6e\xaf\x90\x39\x49\x2e\x54\xe6\x0e\x0c\x52\xe6\x9f\xef\x98\x6d\x75\x8a\x6d\x75\xf1\x65\x22\xaa\xb0\xea\x59\xa2\xba\x61\xac\x6f\xd8\x82\x7d\xa5\xa6\xc1\xcd\x7d\x5b\xf9\xe4\xd5\x4a\x91\xd3\x62\x68\x23\xea\x63\x81\xdf\x77\xc8\x24\xa4\x38\xed\x96\x7a\xbf\xba\xc5\xb4\xbb\x7d\xbf\x5c\xf8\x52\x89\xf1\x52\x6b\xf5\xbb\xc1\x58\xfa\x90\x0e\x27\x93\x59\x4e\xae\xfe\xeb\xb0\x1e\x22\xd6\xc8\x1b\xeb\x82\xa0\x8e\xbf\xf4\xb3\x30\x33\xc4\x15\x82\x74\x28\xd0\xb5\x9e\x31\xfc\x5b\xf3\xd7\x80\xfd\x19\xb2\xf4\xd5\x2c\x45\x16\xa6\x0d\x5d\x17\x1e\x8a\x52\xf3\x36\x6c\xca\x9f\x1d\x17\xb6\x60\xdb\x2b\x16\x59\xe8\x22\x0b\xab\x88\x01\xc1\x00\x58\x51\x64\x61\x17\xa9\x85\xf2\xc8\x80\x02\x9b\x30\xe7\xc5\x9e\x94\x21\x3d\x32\x20\xc1\x26\xef\xf5\x16\x3c\x51\xdb\x49\x45\x1c\x24\xd6\xea\xa2\x1c\x8b\xff\x65\x25\xf9\xbc\x2d\x9d\xfb\x73\xda\xec\x1a\x39\x0b\x9d\xb3\xe8\x68\xb8\xeb\x2c\x01\xd7\x0b\xd5\xed\x9e\xe2\xb9\x30\xf3\x14\x42\x9e\x42\xc0\xad\x10\x7c\x58\xb3\x5b\x23\xf7\x2a\x41\x14\xa4\xe0\x8f\xc5\xe9\xae\x17\xa7\x72\xa9\x6e\xb1\xd4\xf6\x4e\x35\x12\xce\x63\x9c\x7e\x82\x29\x37\x15\x0f\xd0\x64\x05\x23\x7b\xa1\xb3\x69\xca\x3f\xa9\xe2\x0e\xb5\x2c\x9a\x8c\x55\xbd\x1a\x56\x4e\x06\xcf\x98\x16\x30\xdf\xa9\x9b\x19\x9e\x39\x47\x16\x3b\xb7\x58\x5b\x07\x2b\xae\xad\xb6\xfc\xa9\x59\x5a\x97\x3e\x8e\xfa\xee\x0b\xd5\xe0\xae\x16\xaa\x57\x7e\x1a\x84\xb1\x1f\xdd\x7e\xad\x32\xd6\x03\xfa\x79\x0e\x0f\xd5\xa2\xd1\xc5\xf9\x4a\xeb\x87\x38\x5b\x34\x16\x86\x52\xf9\x85\x2e\xbf\xb0\xcb\xcf\xbb\x95\xf0\xb9\x3c\x98\xdb\x80\x2b\x0b\x2e\x78\xc1\x45\x01\xa2\x5d\xad\xbc\x3e\x49\x1a\xe9\xd7\x21\x39\x8b\x33\xf5\xc6\xa5\x76\xad\x92\x59\xe7\x9c\x0b\x51\x62\xc9\x6a\x5b\xf0\x04\x9b\x90\x90\xff\xb7\xac\x66\xf2\x67\x77\xe9\xc2\x26\x7e\x76\xbf\xf5\x1a\x77\xcd\x4a\xd5\x55\x92\xa4\x5b\x29\x6e\x57\x59\x22\x7f\xac\x6f\xdf\x78\x7d\x33\x97\x84\x82\xe4\x5f\x71\xed\xfb\xb6\xeb\x54\x91\x97\x38\xeb\xaf\xba\x78\x49\xee\xf3\xcc\x19\x61\xaf\x68\xb3\x78\x96\xb1\x60\xc9\xc2\x86\x26\xb7\x54\x4a\x09\x71\x51\x4a\x08\x73\x2e\x5c\xb4\x03\x9e\xe1\x2c\xcb\x93\x89\x63\x08\x28\x33\x90\xf4\xb0\x20\xc9\x0a\x67\x3a\x7c\x31\xac\x17\x76\xca\x0b\x8d\x84\xd2\x12\x39\xc6\xb9\x92\x63\x49\x46\x6d\x30\x4a\x58\x6d\x5a\xa0\x2c\x77\x10\x6a\x19\xba\x72\x9d\xb6\x5b\xb5\x00\x2f\x7d\xe1\x7a\x37\x0b\x70\x38\xb1\xc8\xde\x17\x07\x77\xfd\xc3\xb7\x1f\xde\x7f\x3c\x3e\x78\xdd\x7f\xfb\xfe\xf5\x6f\x6f\x0e\xfa\xed\x7e\x94\x04\x7e\x36\xee\x87\xd9\xbb\x30\xea\xf7\xeb\xac\xa6\x3b\xee\x9d\x80\xef\xeb\xc3\xc7\xaa\xd8\x47\xb1\xb3\x3a\xa8\xf5\x10\xea\x68\x28\xbf\x08\xca\xd7\x76\x1a\xdf\x69\xde\x55\x1b\xb7\xe8\x79\x25\xbc\xf5\x50\xeb\xd2\xa5\x6c\x7d\x97\x6f\x09\xf6\x16\xbd\x54\x30\xd6\x43\x61\x1b\x8f\xc3\x31\xaa\x52\x56\xdb\xbd\xf6\x5d\xc0\xbe\x45\x1f\x6d\x40\xeb\x21\xf3\x48\xd0\x29\x9b\x24\x49\x3e\xae\x9f\xb1\x8f\xee\x06\xfc\x2d\x7a\x5b\x04\xb5\x1e\x42\x8f\xfb\x7d\xf1\xba\xe2\x38\x49\xa2\x3c\x9c\xbe\xe2\xd2\x3c\xae\xe7\xe1\x67\xdb\x6b\xce\xdb\x27\xfd\xfe\x2c\x0f\xa3\x3e\x5e\xb3\xfc\x96\x87\x51\x3d\x23\x75\xb6\xd7\x6b\xe2\xa9\x68\xe2\xb5\x9f\xfb\xd7\xb4\xf0\x74\xbd\x16\x9e\x89\x16\x3e\xcc\x52\x46\xb1\x15\xeb\x9b\xc0\xe7\x36\xf6\xcb\x30\x1d\x66\xca\xcf\xb2\xf0\x0c\x5f\x5c\xe8\x9b\x16\x11\xd7\x03\xbe\x54\x7a\x04\x2e\xfa\xfa\xda\x81\x70\x73\xd3\xc5\xf8\x5d\x32\x7e\x87\xe9\x11\xec\x24\x3c\xdd\xd1\x70\xce\xd9\x02\x03\xe0\x52\x94\x11\xf8\x82\xea\x69\x29\xe2\xd5\xd8\xcf\xde\x5f\xc6\xf2\x6e\x91\x2e\x9d\x64\x0c\x8b\x73\x86\x61\x25\xc0\x88\xa6\xa2\x62\x83\xe0\xd7\x0e\x5c\xe1\x7f\x56\x28\x1f\x1d\x1e\xae\x4f\x06\x2a\xaf\x22\x3f\xcb\x8a\xde\x12\xcc\xc8\x17\xc6\xed\x66\xc8\x32\x15\x4a\x43\x9a\xd4\x55\x7a\x56\x11\x76\x64\x65\xb2\x04\x2c\x1b\xa6\xe1\x14\xc3\xdc\x51\x29\x24\x8b\x4e\x6e\xe9\x67\x99\xe8\x90\xa6\x2a\x9d\x8f\x11\x3e\xbb\x37\xf3\x87\x49\x3c\x0a\xcf\x66\x2a\x8e\x73\x3a\x63\x3b\x48\xd4\xfb\xf8\xbe\xf0\x3e\xa7\xb6\x2e\xee\x9a\x55\x2f\xd3\x30\xb7\xaa\x55\x3f\x61\x94\x3d\x37\x6a\x9e\xb3\x85\xf9\xed\xee\x98\x04\xd7\x14\x7d\xa5\xa3\xfb\x21\xe1\xf2\x84\xec\x89\x20\xcb\xfd\x3c\x1c\x7e\x90\xa4\xe4\xe8\xea\x6c\xb7\x4c\x7c\x03\x90\xe6\x12\x13\xa4\x4b\x7d\xb6\xe0\x2e\x83\x62\xa3\xb0\x23\x51\x37\x4a\xec\xe0\x4b\x2d\xc7\x7e\x72\x27\x0d\xdf\xba\x1e\xf4\x73\x36\x99\x76\xad\xb7\x62\x98\xf5\xca\x8f\xa2\x57\x63\x36\x3c\x77\xc2\x38\xcb\xfd\x98\xb3\xac\x01\x56\x76\xf7\x9e\xca\x06\xf9\x23\x19\x59\x05\x91\xc7\x95\xf7\xc4\xe3\xc5\x94\x91\x07\xc5\xfb\xaf\xfc\x38\x4e\x72\x0c\xf8\x0e\x3e\xd9\x25\x81\x9f\x81\xaf\x08\x7f\x9f\xc6\xc3\x44\x6d\x9a\x64\x59\x38\x88\x98\xd1\x00\xf9\x9f\x76\x32\x16\x8d\x3c\x04\xa6\x50\xe3\x49\x76\xeb\x1f\x19\x3a\x08\x19\x4a\x14\xf8\xee\x00\xc6\x7e\x16\x37\x72\x8a\xc0\x1c\xc6\x61\x1e\xfa\x51\xc8\xb7\x06\x4d\xc8\x66\x53\x96\x3a\xae\x55\x82\xe2\xd3\x13\x6a\x4a\x85\x8e\x22\x33\xa8\x22\x7e\x5b\x11\x17\xbf\x7e\x85\x52\x9e\xee\x25\xec\x51\x72\x0f\x38\xc6\x3b\x76\x8f\xc5\x33\xce\xcc\xc9\x66\x83\x57\x34\x76\x88\x16\xfe\x96\x5d\x15\xc0\x75\x06\x59\x81\x59\x61\x2a\x0b\x99\xf1\x8c\x28\x55\x39\x34\x47\xbc\x2c\xdf\x0b\xa5\x2c\xc3\x7d\xc6\x64\x96\xe5\xc0\x42\x34\x02\x1d\x30\xac\x4c\x8f\x47\x64\x13\x1e\xfa\xef\xbe\x0f\x9b\x50\xc2\x05\x49\x25\xb1\xb7\xce\x5b\xc4\x3c\x25\x41\xe6\x18\x08\x5a\xe8\x9a\x33\xe5\x0b\x18\x91\x36\x7b\x3a\xd6\xa2\x26\x8e\xf9\x2c\x1c\xa5\x8c\x07\x52\x3e\x88\x77\xe2\x60\x8a\x1a\x19\xa6\x11\xae\xe4\xd4\x33\x88\x2b\xf0\xcb\x58\xfe\x41\xa2\xf0\x7e\x04\x7b\xd5\xe9\x35\x03\xa4\x71\x6b\xf5\xfb\xd8\x13\x5c\xe0\x74\x11\xf9\x00\x1c\x1d\x88\x8d\xc2\x88\xbd\xbf\x60\xe9\x45\xc8\x07\x84\x14\x08\xf4\x05\xa6\xfe\xf1\x49\x7c\xf0\xe1\x08\x97\x31\xfa\x32\x2d\x02\xc9\x1b\x18\x2a\x1c\xbd\x1b\x6b\x88\x2d\xdf\xb4\x5d\x5a\xa3\xb6\x0a\x0c\xb7\x46\x5d\xce\x48\xa7\x78\x3c\xc8\xfb\xfe\x32\x99\xaf\x85\x3f\xd9\xa1\x88\x63\x99\xb5\x20\x90\xd9\x12\x1d\x4c\x2e\x6e\x0d\xe1\x32\x0c\xf2\xf1\xad\xa1\x8c\x19\x3d\x6e\x5c\x1b\x0c\x3a\x51\xc7\x47\x0e\xda\x92\xf3\xc6\xa0\xa4\xd1\x66\xc6\xa6\x3e\xc6\xdb\x5d\x6f\x84\xc4\x13\x23\x10\xc1\x27\x72\xb6\x1e\x1c\xce\x2f\x1c\x4a\x32\x1a\x65\xec\x36\xb4\x41\xb2\x84\x39\x9b\xa0\x55\xd1\x7a\xb3\x46\x3c\xbe\x02\x7a\x05\x74\x17\x80\x2e\x53\x7f\x3a\x65\xe9\x5d\x80\x1a\xce\xd2\x6c\xcd\xc1\xba\x9d\x38\x40\x86\x59\xa7\xd9\xdb\xc8\x11\xea\xb7\x78\x54\x34\x4c\x12\x3c\xdd\xca\xd7\xa3\xe1\x5f\x47\x9a\x88\x09\x0c\x30\x15\xde\xb9\xfe\xef\xe8\x8f\x9c\x31\x6b\x41\xf2\xe3\x05\x52\xc4\x5f\x44\x89\x1f\xac\x07\x22\x4d\xfd\xc5\xfb\xd1\xca\x47\x20\x35\xb4\x8c\xc5\x9b\xca\x75\xbb\xa0\x7c\xa8\x7c\xf7\x29\x2a\xc6\xf3\x16\x82\x7c\x6d\xb2\x9f\x8a\xbb\xc0\x59\x1c\xae\x27\xbe\xfd\x78\x81\x6c\x44\x7c\x14\x66\xfb\x71\x38\x41\xa3\xd2\xfd\xdb\xaf\x71\xbe\x84\xf5\x7a\x96\xfa\x6b\xcf\x37\x3d\x5b\x14\xbc\x03\x3f\x0b\xe3\xb3\xf5\x47\xda\x39\x69\x30\x3f\xc3\x37\x52\xfc\x6f\x33\x8c\xd5\xcf\x64\x96\x1b\xc9\xf2\x33\x42\xf3\xb5\x06\x51\x1b\x97\xb9\x24\xbd\xed\x9a\x3b\x0a\xa3\x9c\xa5\xef\x66\xd1\x7a\x13\x97\x13\xd9\x08\x57\x89\xc9\xe6\xd3\x27\xa9\xa3\x90\xfa\x6e\xac\xf1\x9d\xb6\xa5\x1f\x7e\x81\x79\xa7\x07\x6d\x0f\xe6\x5d\xfc\xb3\xa0\xaf\x05\xff\xa2\x5b\x3b\x53\xfe\x7f\xe1\x22\x8f\x67\xeb\x5c\x5c\x18\xc5\x12\xfb\xe5\xaa\xa0\xdb\x34\xa0\x07\x8d\xf2\x52\x4c\xe5\x0c\x7d\x81\x12\xcc\x85\xff\xcb\x95\xb9\xec\x4a\xdf\x54\x15\x0c\x7a\x4f\x84\x37\xbd\xd9\x19\xdf\xc9\xfd\xf8\x3e\x6c\x3d\x84\x30\x3b\xca\x52\x78\xb8\x75\xea\x3a\x6e\x25\x8f\x09\x4e\xa9\x66\xe7\x47\xed\x76\x91\x23\xb4\xff\x11\x95\x58\xf4\x9f\xd5\xec\xa8\x1b\x51\x93\x09\xc8\xf7\x93\x18\xd1\x14\x8f\xf1\xc4\xb1\xa7\x79\x32\x65\x65\x38\x62\x9b\xa2\x4f\xa2\x84\xc7\xc7\x1b\x1c\xdb\xb7\xfc\x56\x98\xfd\xee\x47\x61\xa0\x1e\x90\x11\x50\xb7\xe8\xf6\xeb\x46\x30\xed\x27\x69\x36\x9a\x05\xe7\xc5\x6b\xde\xaa\x38\x6e\x1d\xa6\x22\xd9\x31\x5a\x33\xdf\xa8\xdd\xac\x1f\xd6\x0b\xb6\x75\x8e\xac\x4f\xee\xfb\xc8\x6a\xf2\x50\xfd\xe1\xd6\xa9\x26\x84\x1c\x6f\x51\x49\xed\xe7\x97\xb4\x54\x75\xda\x5b\xd1\x86\x2b\x7c\x3e\xc1\x2e\x38\x74\x3e\x05\xbb\xf2\xc4\xca\x3a\xea\xec\x2b\xdf\x56\x44\x46\x7d\x5a\x22\x90\xf2\xc0\x28\xb2\x63\xdd\xc8\x8a\x12\x8e\x19\x6e\x85\xbc\x67\xe9\x4f\xde\xb6\x07\x7d\xba\xc8\xee\xa7\x2c\x17\x99\xc5\x23\x32\x2a\x20\x20\xba\xa2\x90\x3a\x58\xed\x47\xf8\xb8\xb8\x78\xde\xec\xf1\x94\x4c\x06\xa3\x76\x78\x29\xd7\x83\xfe\x39\x5b\xd0\x41\x2c\xfe\xfa\x19\x6b\xd3\x07\x1e\xc3\xca\x57\xce\xe9\x59\x76\xd2\x17\x87\xc6\xfa\x8c\x1a\x53\xe4\x2d\xbb\x35\x03\x52\x96\x2b\x72\xd2\x8f\x71\x88\xce\xb3\xea\x8f\xd4\xa8\x57\xf2\xf1\xa0\xe8\x9d\x71\x8a\xf1\xf5\xab\x3c\x09\x39\xb3\x4f\x42\x24\x21\x5c\x3c\xf1\x6e\xf9\xd3\x69\xb4\x10\xcf\x69\x4e\x38\xd0\x53\x19\x90\x9e\xf7\xc2\x75\x5d\x41\x62\xf9\xb7\x95\xe5\x7e\xce\xd4\x3b\x58\x80\x41\x32\xff\x83\x36\xd2\xcd\x8e\xa7\xd3\xfe\x2e\xb6\xc5\xcd\x0e\x75\x58\x1c\x66\x72\x30\xf5\x9d\x32\x06\x53\x4f\x2f\xf3\x2c\x5d\xb3\xce\x09\xb5\x7f\xce\x16\x3d\x7a\x90\x86\x6c\xf4\x3a\x0c\xde\x26\xb3\x38\x6f\x58\x9a\x9b\x11\xd1\xb0\x50\xce\xd1\x83\x86\x9d\x9b\x4d\x03\x3f\x67\x2f\x5f\x26\x73\xc7\x74\x92\xeb\x41\x5d\x6b\xbf\x61\x85\x15\x9a\xa3\x82\x6b\xb5\xa7\x0b\xd5\xb4\x63\x42\x31\xa2\x0c\xa5\xd0\x97\x83\xa5\x47\x4e\x0e\x91\x39\x74\x9c\xd3\x30\xb3\x25\x53\x0a\xa5\x68\x30\xad\x62\x94\x44\x8f\xb7\x2d\x0b\x20\xb1\x22\xbf\x13\x5e\x6a\x8b\x69\x9c\x1d\x5f\x26\x33\x0c\xa2\xf3\x2a\x0a\x59\x9c\x7f\x64\x43\xc3\xfc\x86\x10\x1f\x24\x73\x89\xf5\xb5\x75\x1d\x39\xa7\x25\x1a\x18\x19\xc9\x1f\x64\xce\x20\x99\xb7\xf0\x90\x07\x9a\xaa\xaf\x2e\xbc\xc0\x23\xba\xaf\x5f\xc1\x2a\x47\xc7\x38\x54\x90\xfa\x26\x4a\x9a\xa8\x89\x51\xcb\x58\x7e\xc4\xe9\xe0\x98\x39\xe6\x4c\x50\x0d\x7b\xc5\x02\x72\x5a\xe8\x26\x8d\x12\x32\x50\x93\xb6\xc3\xb1\xd6\x33\x35\x5c\xf7\x76\x77\xa1\xd9\xe1\x5d\xd0\x63\x43\x69\x26\xb2\xf5\xa8\x56\x4d\xd9\xea\x69\x6b\x63\x75\x55\xc7\xa1\xa4\x3c\xd4\x70\x27\x65\x16\x39\x93\x63\xd7\x15\x63\xac\xc6\x0f\x73\xa6\x42\xdb\x44\xfc\xa7\xfa\x6d\x38\xfd\x13\x3b\x4a\x14\x8e\x78\x11\x26\x12\xcc\x32\x25\x6d\x4e\x97\x2e\x65\x99\xf5\x4a\x9a\x98\xae\x57\xca\xaa\xac\x47\xca\x5d\x45\x2d\xca\x30\xeb\x68\x0d\x4d\x17\xd7\x69\x16\x45\x46\x61\xec\x47\x1f\x54\xbf\x8d\x9a\x0f\x1e\x28\x7a\xe8\x9f\x32\x3a\xd2\x9e\x4a\xa0\x1a\x46\x38\x32\x16\xe7\xe9\xc2\xe4\x15\xf9\xc4\xed\xe6\xd6\x37\x8e\x4b\xd0\x5a\x3a\x24\x24\x31\x0d\xf4\x64\xfb\x3b\x46\x5f\xc6\x7e\x66\xf6\xc4\xe8\xd8\x83\x07\xd6\xb7\xbc\xe0\x2c\x71\x46\xb7\x96\x35\x86\x4a\xab\x15\x25\x5b\x52\x3f\x34\x0a\x89\x0d\x8a\x51\x48\xa4\xd8\x90\xe4\xd6\xc4\x02\x26\x13\x2d\x7e\x14\x67\x3e\x46\x41\x99\x64\xb1\x88\xcd\x87\xdd\x82\x5f\x14\xfe\x8f\x36\x52\x46\x11\x4a\x30\x8b\x98\xbb\x1d\xa3\xa0\x99\x6c\x71\x4e\x32\xcb\x8d\xd2\xe2\x5a\xde\x10\x05\x68\x0a\xc8\xd2\x83\x0b\xae\x9f\x48\x57\x7c\xba\xc1\x8b\x30\x0b\x07\x61\x14\xe6\x0b\xe9\xe8\x82\x8f\x92\x31\x84\x7b\xd0\xc0\x32\x11\xc3\x0d\xd9\x38\x0c\x02\x16\x1b\x00\xf4\x81\x58\x43\x06\xc0\x32\x72\xf3\x64\xda\x83\xb6\x64\x18\xcf\xea\x9d\x6b\x0e\x3c\xc6\xcc\x8a\xfc\x9c\xfd\x1f\x15\xca\xda\xa4\x8a\xca\xfe\xa7\x1d\xe9\x1a\xc4\x7a\xa0\x86\xe8\xc1\x83\xeb\xb5\xe0\x0a\xab\x8a\x93\xfb\x23\xb1\xa7\xa3\xf0\x78\xa4\x05\x4b\xa8\xad\xb9\xfb\x8d\x00\x2f\x5c\x4b\x9c\x9b\x44\xd0\x8d\xef\x94\x0b\xfc\xd3\x2c\xb0\xd8\xb1\x17\x12\x7b\x9d\xa5\xf5\xbc\x5b\xab\x21\x54\xe8\x08\xdd\x4a\x25\xa1\x4a\x4d\xe8\x56\xe9\x09\x60\x2f\x65\x2f\xc8\x30\x58\x57\x16\x09\x7a\xb2\x15\xd6\xdf\x2a\x2a\x7c\xbb\x81\xdd\x33\x28\x2d\x63\x2e\x4e\xfc\xb9\xa3\xd1\x6b\xcd\x61\x53\x13\x69\x53\xce\xe2\x17\x52\xd0\x60\xbe\xfc\x4d\xca\xc8\x1e\x58\xd5\xb5\x6e\x02\x4d\x59\xbd\x07\x85\x16\x84\x2c\xd0\x50\x4d\xa5\xa7\x66\xec\xbf\x19\x5b\x9a\x64\x59\xd4\x90\x65\x41\x64\x11\xa3\x5a\x41\x97\x85\x41\x17\xa1\x7c\x59\x84\x59\x98\xba\x58\x0d\x65\x16\x15\x94\x59\x98\x4a\x54\x91\xe7\xc1\x10\x89\x2d\x2d\xde\x60\x57\x09\xaf\x0a\x0d\x4c\x12\xba\x46\x9a\x5e\x79\x46\x8e\x77\x3d\xc5\x8b\xa6\x6c\x27\xf7\xd5\xe8\x21\x88\xfb\xa7\xae\x53\x98\xf6\xa3\x24\x9d\xf4\xa0\xa1\xca\x61\x64\x70\x63\x2a\x6c\x42\x63\x3a\xa7\x58\xe0\x06\x27\x60\xaa\xdb\x50\x2b\xb2\x6b\x49\xc5\xb2\x92\xf4\xe0\x81\x90\xf2\xe6\x94\xfb\xb7\x74\x5a\x74\x5b\xae\x1d\x8a\x06\xd8\xc3\xb2\x96\xb6\x09\x8d\x49\x66\xe7\x91\xc2\x65\xe8\xb0\x86\x12\x2b\x7e\xdc\xc1\xb1\x8d\x82\xdf\x08\xc2\x0b\x63\x65\x33\x7b\x62\x38\x14\x6a\xa4\x6c\x38\xf6\xd3\x3c\x6b\xe6\xb4\x8d\x6d\x8a\x25\xaf\x61\x8a\xd2\x8c\x0e\x2a\x0d\xf2\x1a\x99\x29\x1b\x59\xaa\xf5\xc8\x31\x03\xd9\xc8\x7f\xa4\x5d\x5b\x5b\x31\x8a\xb4\xb2\x63\xee\x36\x34\x75\x3c\x43\x11\xac\x3c\x06\xb4\x06\xde\xd0\xbe\xe0\x8b\xbe\xe2\xb1\xb4\xb9\x2b\xd7\x15\x30\xcd\x7d\xed\xa9\xe5\xd4\x49\xec\xe5\x77\x36\xae\x56\x39\x57\x3c\xb9\xaf\x0e\x8b\xee\x9f\xba\xca\x48\xaa\x25\x3c\x3e\x0a\xbf\x61\x0d\x01\xb4\xa1\x0b\x14\x9c\x32\xd1\x6f\xa3\xbe\x7d\xc6\x6d\x7e\x4a\x03\x2c\xd7\x45\x67\xd1\x58\xe1\x36\xcf\xd9\x8d\x33\xa8\x82\x15\xff\xed\x62\xd5\x60\x14\xed\x30\xcb\x5f\xf9\xc3\x31\x7b\x15\x31\x3f\xad\xf3\x94\xbd\xfd\x4c\x5c\xec\xa8\xe2\xaf\x59\xc4\xf2\x3a\x27\xea\x4f\xb7\x9f\x17\xcb\xff\xca\xea\xbc\x84\x3f\x7d\xd4\x2e\x16\xfe\xbb\x5f\xe7\x02\xfe\xe9\xa3\x4e\xb1\xf0\xd1\x12\xc8\x5d\x41\x33\x8c\x1c\x8f\x53\x30\x03\x3f\xc6\xba\x30\xe4\x95\x45\xa8\x7f\x1d\x8a\x30\x0d\x2f\xfc\x9c\xe1\x6f\xc3\x2a\xc9\x8c\x23\x88\x27\x7b\x57\x70\xc2\xb7\x2f\x21\xcb\x4e\xd1\x89\xe8\x39\x5b\x34\x29\x2e\xe8\xd4\x0f\xd3\x0c\x83\x51\x71\xf8\x85\x58\xe8\x6f\x24\xd2\x8e\xa8\xad\xfd\x1f\x62\x9c\x3c\xd8\x35\xb6\xd6\x62\x3f\xb6\x0b\xa2\x2c\x08\x0b\x2f\xd8\x83\x36\xf4\x64\xaa\xda\xf0\xc8\x07\x72\x43\x3e\x90\x74\x2c\x24\x42\x26\x6d\x6e\x12\xf0\x9f\x05\x48\xf3\x74\x14\x37\x61\xba\x8d\x13\x2c\x79\x6a\xbc\xc8\xc9\x58\x4e\x3b\xb5\x93\xf6\xa9\x47\xc5\x4f\x3a\xa7\xe2\x98\xed\x6a\x63\x63\x6b\x0b\xf6\x83\x00\x26\x2c\x1f\x27\x01\x76\xfc\x93\xea\xe5\xa7\xd6\x86\xfa\x6d\x58\xd0\x0e\x05\xab\xd9\xbc\xb7\x53\x55\xf6\xa4\x11\x20\xa3\x35\x4e\xcd\xf2\xc4\x7c\x95\x15\x5a\x67\xc8\x0e\x26\xdf\x55\x97\x1b\x23\x8f\x99\x2c\x57\x5d\x2e\xb3\xe1\x1d\xe1\x79\x71\xc9\x13\x8c\xaa\x59\x7e\x6a\xf3\xe8\x76\x91\x91\x70\x90\xfe\x55\x17\x75\x81\x62\xd2\x0b\x0e\xff\x95\xe5\xe4\x4b\x97\x86\xdb\xc7\x70\xef\x43\x72\x44\xfd\xe9\x9c\x2d\x3e\x41\x98\xc1\x28\x99\xc5\xe8\x42\xfb\x13\xde\xd8\x7e\x82\x64\x54\xe4\xde\xca\xd9\x60\x73\x3f\xd6\x45\xce\xa7\x5f\x18\xbb\x37\x9b\x8a\xa9\xa4\x4a\x3f\xbc\x42\xa3\x6a\x31\x43\x28\xf4\xaf\x9f\x0e\xc7\x30\x12\xa1\x8b\xcb\x21\xde\x3f\x8a\x04\xdd\x0f\x11\xdc\x7d\xe2\xe7\xc3\x31\x0b\x40\x04\xdc\x45\x0d\xed\x53\xb3\xf3\xa9\x30\xc5\xfc\x2c\x4b\x86\x87\x22\xe8\x24\x22\x47\x66\xd9\x6a\xa2\xa9\x69\x85\x99\xc6\x79\x81\x98\x2d\x94\xd0\x6c\x9a\x0e\x62\xd8\xbf\x08\xd4\x09\x65\x9e\xe2\x5c\x10\xc6\xde\xb6\x5a\x60\x1e\x3f\x14\xc2\xa4\x36\x3b\xf8\x4a\xb5\xc4\x3b\x26\xc6\x15\xec\x73\xbb\x90\x4c\xbc\xc7\x67\x2c\x7f\xe7\xcb\x73\x84\xaa\xb8\x1a\x4f\x89\x89\xe0\xe5\x2c\x8c\xf2\x66\x18\x8b\xd9\xcc\xf5\x04\x32\xad\xcd\xf0\x3d\x2f\x06\x35\xbd\x60\x69\x38\x0a\xc9\x09\xf3\x80\x01\x79\x06\x6c\x71\x1c\x79\x53\xf4\x49\xa2\x16\x76\x75\xcb\xc2\x8c\xde\x83\x06\x69\x42\x0d\xb7\x6a\x16\x99\xb5\x2b\x28\x71\xbb\x10\x3a\x14\x97\xe1\x1f\x6c\x21\xcc\xca\x2b\x57\x8c\x27\xed\xaa\xf9\x14\xf8\xb9\x8f\x57\x3f\x9f\x26\xfe\xf4\xd3\xb2\xe9\x41\xdd\xbc\x82\x89\x3f\x45\xae\xe7\x7f\xf3\x04\xfe\x35\x63\xe9\xa2\x55\x15\xec\x56\x4e\x0f\x45\x6a\x9e\x52\x98\x1a\x0f\xed\x59\xc1\x61\x72\x8c\x0a\x8c\x7f\xc6\xf2\xb7\xfe\x94\xef\xc7\x9c\x89\x3f\x2d\x30\x3d\xf6\x60\x97\x57\x6d\xf5\xfb\xfc\xa3\xdf\xdf\xd1\x9c\xa9\xc8\xe2\xf0\x4a\xc8\xbb\x7b\x58\x45\x3a\xbb\xc3\xfb\xab\x5d\x68\x10\xd6\x0d\xd8\xd3\x3f\x7b\xd0\x18\xfb\xd9\xb8\x71\x8a\xd5\x7a\x84\xd9\xc4\x9f\x56\xf3\xba\x46\xb2\x62\x7c\x57\x71\xc4\xf5\xd7\x0f\x91\x74\xe9\xa7\xb1\x11\x4d\xe3\x8c\xe5\xc7\x6a\x53\xf2\x3b\x3a\xed\x95\x59\x22\xb0\xaf\x91\x62\x6f\x6e\x8c\x8c\x89\x3f\x25\x04\x8d\xb4\x80\x0d\x66\x67\xa3\x62\x82\xf1\x1d\x25\x67\x16\x22\x31\x4b\xfd\x9c\x7d\x48\xd9\x28\x9c\x17\x1b\x38\x63\xf9\x6b\x3f\x1b\xbf\xf2\x2d\x7c\xc2\x80\xc5\x39\x6d\x74\x8d\x82\x87\x71\xce\xd2\x8c\x21\x0d\xff\xc1\x16\x95\xe1\xa0\x42\xa3\x4c\x6d\xbc\xa6\xe7\x66\xd4\x52\x5d\x7e\x59\xac\x24\x0b\x6e\x31\xa6\xd4\xff\xa3\x2f\x87\xbe\x79\x44\x20\xdd\x40\x61\x7a\x24\x83\xcf\x88\xba\x0e\xa0\x8f\x3d\x17\xe4\x10\xed\x56\xcf\x2c\x5d\x55\x19\xfc\xcb\x95\xbd\x18\x04\xae\xc2\xb8\xbf\xf8\x00\x00\x4d\xfd\xe5\xb1\x0d\x6f\x58\x52\x90\x42\xe5\x6b\xba\x25\x83\xcf\xc2\x38\x1f\x58\x16\x85\x71\x0e\x71\xd2\xe4\x9a\x7e\xc2\x41\xb5\xe5\x3a\xf6\xe1\xe3\xc1\x2f\x87\xff\xa7\xff\xe6\xf0\xe8\x18\x76\xe1\xa4\xf1\x07\x1b\x9c\x87\x68\x7b\xf5\x36\xf9\x93\xff\x79\xcf\xff\x37\xc9\x1a\xa7\x3b\x58\xfe\xf0\x5d\xff\xcd\xe1\xbb\x83\x7e\xb1\x5e\xf3\x12\x2b\x36\x79\xe9\xe6\x24\xf9\x93\x7e\x24\xe2\x3b\x6b\x1a\xf5\x5f\xbd\x7f\xfb\x61\xff\xf8\xf0\xe5\x1b\x0e\xe5\xfd\x87\x83\x8f\xc7\xff\x44\x10\xea\x14\x83\xd7\x51\x1f\xef\xd3\xf0\x8c\xec\xc4\xf4\x91\x07\x46\x33\x15\x0b\x7e\xc5\x1c\x5d\x3e\x83\xcd\x75\xa4\x98\xed\x4c\x53\xf6\x9e\x8f\x57\xcc\xe6\xf9\x7b\x1c\x55\xbd\x78\xa0\x07\x47\x6b\xfa\x6a\x1f\x8e\x62\xe8\xcf\x35\x0c\x57\x1e\xfa\x50\xa2\x04\x68\x98\x9e\x54\xc8\x1c\x23\x49\xdb\x33\x89\x34\x07\x17\x54\x0b\x23\x4c\xd9\x11\x4e\x01\x70\x29\x95\xcf\xc1\xf0\x5c\x48\x44\x00\x87\xa1\x3f\x61\x11\x79\x42\xc8\x13\x08\xfc\x6c\x8c\x1f\xbc\x02\x2d\x6e\xb0\xfb\x42\xfc\xda\x90\x7c\x51\x2d\x26\xed\x54\x93\x92\x32\xd9\x89\xfd\x49\x21\x1c\xab\x3f\x61\xad\x94\x61\x80\x16\x67\xcb\x39\xd9\x6f\xfe\xcf\xa9\xbb\x75\xe6\x19\x02\xeb\xa2\x60\x47\xd4\x68\x36\x60\x13\x2e\x5a\x79\xf2\x26\xb9\x64\x29\xc2\xa5\x8d\x98\x5b\xdf\x5b\x3f\x08\xd0\xa0\xc0\xcf\x43\xae\xf7\xe0\x29\x11\x4c\x71\x0d\xe0\x85\x1d\x69\xf2\x29\x5c\xf9\xf2\x3e\xd3\x9e\xd8\xe8\xf3\xf2\x85\xa3\x2a\xd7\xa0\x41\x29\x1b\x69\xa1\x25\x86\x30\x11\xab\x9e\x01\x2a\x7c\x3c\xd1\x6f\xd7\xba\xad\x96\x27\x71\x05\xc9\xf2\xe5\xca\x03\xb3\x09\x65\x11\x42\x1a\xa0\x5e\x8d\x51\xe3\x94\xa1\xb1\x8c\x69\xa4\x5c\x9e\x73\x06\x11\x07\x44\x85\xe1\xfa\xff\x2e\xdd\xad\x65\x43\xc5\x07\xe9\xb7\xe9\xb4\x38\x48\x04\x17\xc7\x80\x54\x01\x12\x4f\xc6\xe1\x96\x21\x40\x5a\x29\x0b\x66\x43\x66\xdc\xbf\xa6\x2c\x9b\x45\xc2\x6c\x8d\x77\xd5\x83\xd0\xdc\xa5\x98\x7d\xd3\x1b\x93\x62\x6b\x46\x2f\x94\x34\xf9\xaa\x7e\x35\x13\x14\x2c\xee\xd6\x59\x38\xf1\xaa\xc4\x1a\x46\xe0\x87\xc6\x7f\x76\x1a\x6e\xa5\x4d\x92\x79\xe2\x27\xf1\xad\x1a\x21\xd9\x07\xd8\xd4\x74\xf6\x14\xb2\x74\xee\x7a\xe5\x91\x9f\x43\x29\x1a\x6c\x85\x86\xbe\x14\x75\xa2\xe4\xcc\xd1\x0a\x6f\x5f\xc8\x74\xa4\xad\x23\xbf\xc8\x9f\x10\xff\xe5\xf2\xea\xd2\x8a\x49\xa4\x79\x7a\x79\x5f\x32\xa1\x78\xb3\x5c\x0d\xa7\x0d\x33\x46\x16\xbf\xf0\x53\x3e\xb9\x6c\xc9\xe1\xc7\x0b\xf1\x47\xcd\xa4\xa2\x82\x26\xbf\x8d\x97\xbd\x83\xd9\x59\x59\x56\x68\x0e\x08\x73\x36\x91\x43\xcb\x3b\x4c\x7c\x8e\xa9\x3b\xd6\x38\xf0\xa4\x1d\x1d\xe1\xac\xae\x23\x54\xdf\x4f\xcf\x32\x4f\xb1\xae\xee\x97\x6c\x97\xd7\x55\x38\xec\xbe\x30\xd3\x8d\x8e\x95\x54\xd1\x51\xa9\x6b\x23\x27\xf7\xb9\x88\xab\xe9\x9d\xec\xd9\x5f\xc3\xca\x8e\xec\x5e\x71\x6d\x14\x8c\xa2\xb4\x5c\x42\x40\x4c\x00\xda\xf7\xa2\x94\xc8\xfd\x33\xd4\x39\x5b\xf8\xfd\xf5\x2b\x34\xfc\x38\x89\x17\x93\x64\x96\xa9\x6e\x36\x74\x2d\x3f\x3d\x7b\x27\x62\x6a\x36\xf0\x6e\x86\x43\xe5\xba\xbe\xf3\xdf\x47\xef\xdf\x09\x6b\xfc\x70\xb4\x70\x5b\x9f\x93\x30\x76\xf8\x6a\xef\xf2\xc9\xe7\x36\xc4\x60\x4b\x16\xe0\x89\x3d\x10\x10\x08\xe4\x26\x34\xf8\x50\xf1\x34\x1b\x18\x97\x22\x6e\x81\x5b\x52\x96\x5d\xc3\x2c\x7c\xd3\x49\xeb\x02\x24\x31\xb0\x0b\x96\x2e\x64\x08\x7d\xae\xea\xa1\xe1\xa1\x3e\x4b\xd5\xfb\x37\x4f\xa4\x56\x2d\x2c\x55\x9b\x1a\x33\x4d\x31\x86\x4a\x74\x46\x04\xd0\xe2\x1f\x53\x9f\xe0\x79\x95\x72\xd3\xd8\x0f\xd7\xca\xaa\x6a\x41\x85\x3a\xea\x28\x76\xf0\xaf\xd4\x2c\xdd\xb2\x80\x5a\x61\xf1\xa5\x65\x17\x8f\xc1\xb8\x9c\xe3\xe5\x05\x4d\xcb\xc4\xa9\xdd\x0a\x96\x32\x54\x3f\xed\x1c\x72\xa0\x5d\x4b\x29\xca\xbd\x05\xad\xaa\x56\x76\xa4\x51\xca\x32\x41\x23\x41\xa2\x4c\x58\x66\x48\x31\x5e\xde\xf7\xea\x14\xdb\x08\x32\x93\x96\x8f\x96\x44\xe8\xae\x26\x12\xba\x42\x26\x74\xb5\x50\xe8\x0a\xa9\xd0\x15\x9f\x5a\x2e\x28\xa9\xd0\x2d\x8b\x85\xee\xa9\x52\x21\xf0\x0d\x3a\xce\x52\xfb\x28\x5d\x4a\x5d\xa1\x94\x5a\x2a\xc7\x28\xce\x08\x64\xd6\x4a\xf9\xc4\x91\x0a\xc1\xd6\x16\x8c\xc2\x34\xcb\x4d\x87\x52\x7c\x2a\x0e\x59\x78\xc1\x60\x32\x8b\xf2\x70\x1a\x2d\x34\x2e\x12\x1c\xaf\xf3\x0b\xba\x89\x8a\xb3\x93\xf6\xa9\xd4\x2a\x72\x3f\x8c\x32\x99\xde\xca\xa2\x70\xc8\x28\xde\xef\x12\x41\xab\x36\x93\x58\xb5\x86\x19\x46\x71\xe9\x94\x73\x14\xa3\x14\xd9\x91\x36\xba\x02\xa7\x4a\x31\x29\x16\x54\x77\xc7\x8e\xb7\xb9\xe4\x5c\xa4\x22\xcb\xd4\xa9\xad\x3c\x19\x95\x28\x90\xf6\x75\xc0\xf0\x0a\xd7\xde\x10\xa0\x99\x1c\x97\xab\xba\x6b\x3c\xad\x40\x06\x53\x5f\xa7\x6c\x2e\x44\xb9\x04\x0d\xca\x57\xc6\xd4\x0c\x29\x76\x52\x3c\x37\xcc\x6d\x4c\xf6\x9a\x5d\x2c\x8b\xe7\xd2\xd0\xf1\x5c\x1a\xa2\x4e\xe1\xe8\x48\x7c\x2a\x9c\xf9\xb7\x33\x4c\xe2\x80\xcc\xc4\xc4\x63\x5b\x0f\x7c\x0f\x06\x1e\x0c\x3d\x08\x3c\x60\x6a\x75\x25\x8d\x90\x23\xf1\xe0\x81\xf2\x54\x20\xd4\x20\x6c\x5f\x0d\x53\x83\x2c\x67\x30\x0b\x1b\x35\x95\x4a\x6a\x04\x75\x64\x55\xc1\xf0\x7a\x67\xd4\x72\x1a\x6f\x92\x33\xb4\x05\x01\x71\xc6\x83\x97\x6d\x2c\x4d\x93\x14\x26\x2c\xcb\xfc\x33\xa6\x18\xa2\xa0\x3d\xe2\xbc\x52\x5d\xd3\xf0\xaf\xc7\xa0\x88\xc3\xdb\x30\xa6\xf3\x69\x36\x1f\x32\x14\xc3\x90\x0c\x87\xb3\x34\x65\xc1\x0e\xcc\xf8\x5e\x6f\xcc\x20\x4e\xe2\xe6\x44\x16\x0c\xd8\x05\xb0\xf8\x22\x4c\x13\x8a\xd1\xcf\x47\xb7\xc1\x05\x0e\x2f\x39\x9a\x45\x51\xb1\x0b\x71\xc0\x05\x3b\x62\xea\x47\x30\x66\xd1\x74\x34\x8b\x70\x74\xc2\xf8\x2c\x6b\x35\xdc\xa5\xb6\x53\x42\x4e\x9d\x14\x47\xed\x74\xa7\x58\xec\x50\x5c\x09\xb6\x0d\x9b\x1d\xab\xb3\x44\x19\xad\xd0\xff\x57\x66\x6f\x20\xed\xfb\x7d\xc1\xe5\x28\xe9\x24\xf4\xcd\x4d\xa3\x59\xcb\xda\x01\x4c\x57\xec\xdf\x20\xec\xc2\xa3\xa5\x41\x0d\xcc\xb0\x0b\xe2\x34\x7e\x1f\xb2\x29\x1b\x86\x7e\x14\xfe\xc9\x02\xe0\x72\x14\xc7\x76\x04\x9f\xfa\x7c\x6a\x7f\xc2\x35\x02\x6f\x69\x32\x8c\xbf\x9a\xcc\x72\x0c\xc8\x9a\xa4\x39\x66\x85\x39\x2e\x57\xa4\xa5\x8f\x93\x34\x1f\xfb\x71\xb0\xca\x5d\xd7\x09\x3d\x6d\x2c\xdc\x76\x11\x34\x48\x2e\x58\x6a\x1d\xec\xcb\x87\x41\x57\xaa\x41\xac\xa8\xcf\x2d\xe2\x8b\xe4\x9c\x05\x30\x65\x12\xa5\x30\x89\x0b\x07\xfe\xa2\x61\xf3\xd0\x3f\x66\x97\x5c\x0d\x9a\xb2\x40\xdc\x5b\x15\x6e\xbd\x78\xda\x5b\x7f\x2a\x6f\xbc\x64\xdb\x2b\xdd\x2f\x53\xa7\xec\xdb\x65\xf3\x72\xcc\x53\xc2\x3f\x23\x2f\x5c\xb4\xc6\x8a\x15\x10\x99\xf3\x9a\x9b\x66\xaa\x29\x2e\x97\x61\x57\xa1\x27\x6e\xd5\x28\xdd\x23\x1c\x3d\x6a\x5b\x6c\xdb\x4d\x15\x75\x16\xe5\x35\x37\x68\xa2\xf7\x15\x77\x0a\x4b\x7d\xf8\xaf\x78\x67\x74\xb4\x98\x0c\x92\xba\x60\xee\x4f\xc5\xe5\xd9\x43\xf8\x2d\xe3\x83\x93\x99\xb7\x66\x9c\xef\xf8\xe6\x90\xeb\xff\x9f\xc8\x2a\xee\x13\x79\x3b\xf1\xb9\xea\x22\x75\xbd\xc3\x77\xbf\x1c\xbe\x3b\xc4\xf3\xbe\x0e\x6c\xe1\x7c\x97\x46\x0b\x74\x56\x95\xc1\x27\xdc\x96\x7d\xe2\xac\xe7\xcb\x4d\x26\x1e\xb3\x8e\x28\xf4\x70\x9c\xe4\x3a\x23\x49\x21\x43\x9c\x97\x71\xf7\xc3\x2b\xb1\xd5\x3b\x56\x9b\xd9\xe2\x2d\xae\x62\x48\x82\xfb\x95\x80\xda\x8c\x29\xae\xab\x0c\x5e\xcc\x93\x7f\xb0\x85\x53\x38\xde\x11\x0b\x10\xb5\x63\x5e\x25\x7d\xfd\xaa\x28\x2c\xea\x14\x8f\x52\xe8\x88\x84\x98\x41\xec\xc9\x44\xec\x18\x82\xb6\x09\x0d\x12\xb9\xf2\x40\x52\x16\xd8\x85\x46\x1b\xd7\x36\x87\x53\x55\x20\xb4\xbb\x0b\x4d\x49\x6f\x17\xf6\xa0\xd1\x6c\x37\xa0\xb7\x94\xbd\xb0\x43\x15\xbc\xb5\x34\xda\xc2\x9d\xf2\xd6\x86\x88\x55\x3b\xf0\x33\x06\xe1\x64\x4a\x1b\x2f\x52\x49\x92\x91\x32\xbe\x88\xc2\x73\x46\xe2\x70\xfe\x09\x97\x29\xfe\x3b\x8c\x3f\x09\x3b\x00\x7f\xc8\x57\xc4\x0c\x7c\x0e\xee\x13\xee\x4b\xf0\x5d\x2c\x72\x55\xc0\x72\x96\x4e\xc2\x98\x16\x48\x36\xcf\x53\x36\x99\x4d\xc4\x91\xd1\x7a\x06\x01\x37\x14\x91\xea\x63\x89\x88\x2c\x41\xd0\xbd\x40\x18\xc6\xe7\x4c\x44\x0a\xa6\x24\xc1\xe2\xd9\xf2\xab\xd5\x72\xb7\x0d\xbe\xe6\xc4\x3f\x10\x05\x8a\x72\xd6\x33\x5a\x5e\x5d\xe6\x9a\xb6\x3b\x2b\xd8\xea\x88\xc9\x03\x96\xd0\xd4\x9a\x01\xd7\x71\xf0\x19\x83\x92\xae\xf2\xfc\x53\xa9\x58\xb2\xcc\x3d\x21\xeb\xf9\xdc\xe0\x88\xcf\x30\xc2\xa9\xa9\x60\x19\x7a\xc3\x9e\xae\xc7\x8b\xc8\xdf\x0f\x1e\xc0\x3d\x35\x73\x45\xa2\xb2\xde\xa3\xbb\x60\x4d\x13\x59\x80\xe8\xc4\x9b\xd3\x25\x5d\xfb\x89\x8f\xc6\x47\x36\x65\x1b\x32\x8a\xc9\xaf\xc4\x42\xc9\xce\x62\xd9\x54\x36\xc7\xb0\x62\x46\x7f\x07\xb7\xf4\x6b\x46\x7c\xe1\xda\xa2\xb5\xa7\xf1\x61\x17\x36\x79\x2a\x34\x77\xf9\x0e\x40\xfb\x0c\x2e\xc8\x4f\x1f\x36\x61\x00\x0f\x21\x97\x1b\xb0\x0a\x77\xc0\x8f\xbe\x83\x3b\xe0\x1b\x07\x8e\x09\x18\xde\x2a\x4d\x93\xc8\xcf\x19\x45\xec\xb9\x9d\x77\xfe\x61\x32\x5d\xdc\x2e\x44\xc0\x30\x89\xf3\x30\x9e\x25\xb3\x6c\x4d\x57\xc4\xc1\x76\x1f\x67\x6f\xad\x43\xcc\x47\x6b\xfa\xdc\xec\x70\xd0\x06\xbd\xea\x3d\x6e\xb6\xd7\x74\x4d\xda\xed\x5f\x83\xfa\x93\xe7\xeb\xba\xb6\xed\x4b\x95\xa8\x16\x76\xb7\xbb\xa6\x5b\xe0\x47\xfd\x3e\x59\x96\xd5\x7b\xa9\x7d\xd6\x26\x1f\xa4\xc2\x11\xdb\x2c\x0e\xb9\x7c\x39\x69\x7b\xd0\x39\x35\x6f\xd7\x2b\xf8\xb1\x3c\x2d\x1d\x9c\x8f\x0e\xcd\x4e\x25\x0e\xf7\x0c\x27\xf3\xc6\x55\xbc\x33\x87\x26\xf8\x2e\x6c\xc1\x60\x47\xd9\x55\xf7\xae\xb7\x8a\xb7\x28\x56\xf9\xd6\x7e\x50\x08\xba\x60\xe1\xfe\x2a\xf2\x27\x53\xc7\x4a\xaa\x3c\x90\x37\x7a\x27\xac\x88\x8a\xb3\xd2\xd1\x52\x68\x17\x36\x07\x62\xfb\x58\x04\x63\x76\x79\x0e\x3f\xef\x82\x2f\x36\x19\x73\x78\xb1\x0b\x03\xd8\x83\x0e\xf4\x20\x70\xe6\xee\x0e\xc5\x1b\xbe\xb2\x91\x4f\xcb\xc8\xa7\x37\x47\x3e\x85\x5d\x1b\xd2\x6a\xc8\xe7\x06\xf2\x39\x47\xbe\x0d\x7b\xe0\x43\x0f\x72\x8e\x7c\x07\xf6\x60\xc0\xd5\x47\x27\xaf\x41\x7e\x10\x4e\xfc\xa9\x13\x24\x13\x3f\x8c\x3d\x48\xfd\xf8\x8c\x79\x36\x11\x3d\xa8\xe8\x0d\x92\xbb\xcd\xe9\x8d\x35\xd1\xe0\x30\xe8\xe8\xef\xce\xa9\x07\x29\xcf\x47\x88\x98\x9d\x76\xd4\x67\x07\x77\xf5\x7c\xc5\x0f\x3a\xf0\x33\x04\x6d\x57\x00\xb3\xfa\x1f\x74\x3c\x9e\x25\x01\x59\x79\x69\x87\x27\x23\x4d\xf0\x0c\xa3\xaa\x7a\x9b\xa3\x54\x53\xbd\xcd\xf1\x31\xb5\xf2\x4a\x6e\x48\xdb\x4e\xd0\x76\xe6\x2e\xd1\xce\x24\xdb\x34\x89\x16\x6b\x13\xee\x33\xec\x8a\xc7\x45\x61\x2c\x20\xa8\x63\x62\x04\xa4\x4e\x6f\x9b\xa0\x54\x33\xce\xdc\x7c\x97\x4d\x9b\xdb\xcf\xae\xda\xf5\xd6\xa4\x87\xa8\xd8\xa1\x72\xb5\xb5\x05\x1f\xe9\x64\x17\x1d\xcf\x32\x7c\x69\x2e\x46\x8a\x6b\x9c\x34\x12\x34\x70\x9f\x4f\xf9\x80\xc8\x41\x95\x0c\x4a\x09\x6a\x78\xc5\xf1\xad\x6b\x1f\x18\x03\x21\x2f\x47\xb9\xba\xd0\x95\xad\x4c\xc2\xcf\xf0\x59\x35\x72\x12\x96\xd6\x55\x89\x56\xc8\xf9\x4b\xfc\x84\x4d\x10\x16\xde\x00\x29\xd5\x29\x8c\x2e\x32\x19\xaf\x22\x7e\xe9\x1a\x57\x15\xe7\xcd\x38\xe4\x6a\x1e\x86\xab\x38\x15\x31\x57\x4a\xbe\xf8\x72\x01\x37\x08\x33\x36\x14\xf2\x4d\xb2\xc5\xdc\x83\x8e\xc7\x7b\xd8\x84\x8e\x35\x7f\x39\xde\x0e\xef\x30\x72\x57\x79\x5a\x72\x5d\x40\x19\x5f\x29\xcb\xb0\x0d\xb0\xed\xab\xc4\x50\xb7\xa8\x39\x51\x5e\x7e\x29\xe9\xde\x42\x2a\xc8\x5c\xfa\xd0\x99\x26\xe1\x44\x11\x33\x49\x17\x1c\xa2\x64\x13\x45\xe8\xc3\x25\x31\xbe\xb5\x55\x14\xbb\x5c\xb6\x71\xb2\xe6\xfe\x39\xcb\xc0\x97\xfc\x43\x3b\x84\x39\x84\x31\x9c\xf8\xde\xe0\x14\x37\x81\xa9\xb1\xc1\x19\x26\x69\xca\xb2\x69\x42\x1c\x8a\xbb\x29\xbe\xef\x03\xbc\xc4\x3b\x69\x7b\x9d\xd3\x16\x6f\x2d\xad\x68\x2d\xd7\xad\x55\xd5\xbb\xa6\xa9\x1a\x04\x5b\xe6\x88\x48\xdd\xca\x59\x51\x3c\xca\x39\xc3\x57\x6c\x35\x5b\xc5\x0c\x31\xd3\x8c\xda\xa8\x03\xac\xae\x43\xc9\xb5\xd5\x84\xf0\x70\x4b\x6d\xba\x70\x90\x60\x57\x3b\xb5\xe2\xff\xa6\x21\x1b\xb2\xcb\x50\x27\x24\xb3\x7c\x3a\x33\x90\x99\xce\x72\xdb\x6b\x4d\xca\xb2\xa1\x1f\x69\x27\x1f\x0a\xc2\xca\x62\xec\x05\x74\xf1\x71\x25\xca\x4c\xe8\xd1\xa2\x43\xf3\x81\x5a\xe7\xbb\xc2\x98\xfe\xc6\xe8\x27\xc0\x98\x2a\xd8\xb8\x9a\xbb\x0a\x2b\xc2\x69\x5e\xd8\x4d\x38\x02\xde\xd7\xaf\xea\xe7\xae\x46\xb8\x28\xae\x89\x40\x7b\x2b\xa8\x1f\xbd\xa2\x68\x37\x73\x5d\xd7\xd9\x9c\x6b\xf1\x82\x98\xb5\x42\xb2\xe2\x32\xa2\xa5\x14\xef\x2c\x1d\xea\x32\x47\x55\x76\x5e\x63\x2a\x17\x14\x81\x70\x85\x72\xa7\xd1\xbf\x5e\x01\xe9\x15\x98\x94\x63\xbc\x30\x02\xb3\x10\xca\x8a\x63\x15\xca\xfd\xe2\x66\xad\x70\xad\xc9\x37\xdf\xaa\xd6\x2a\xba\xb9\xe4\x58\xce\x07\x0f\xb7\x4e\xe9\x70\xbe\xbf\xcc\xa3\x9f\xa1\x21\x57\xa9\x92\x9e\x66\x4f\x1c\x25\x6b\x7d\x2a\x76\x50\xce\xbe\x1b\xf5\x4f\x56\x5a\xad\x7b\xb4\x16\x60\xfb\x46\x07\x8b\x68\x5a\x0b\x64\x25\x96\x1f\xf1\x1d\xcc\x12\x54\xef\x08\xad\xdb\x08\x9f\xa0\x28\x7c\x08\x69\xf4\xd8\xa5\xba\x5b\xec\x9d\x12\x4a\x37\x19\x03\x59\xe9\xde\xbd\x7e\x81\x92\x98\x53\x6c\xc3\xee\xd4\x8d\x5a\x2a\xd0\xa3\xd0\x9a\x91\x5b\x8a\x6a\x64\xf4\xf8\xaa\x7c\x82\xb1\xf4\x29\xe4\xf7\x0e\x68\xd4\xa7\x9b\xb9\xd7\x6c\x18\x4e\xfc\xfa\x90\x46\xdd\x6e\x57\x1c\xc6\xdc\xf6\x78\x68\x6e\x29\x2f\xf3\xd5\x54\xac\x22\x96\x95\x3b\x49\xe5\xed\x68\xee\xba\x1e\xcc\x61\x0f\xe6\x27\x9d\x53\xe8\x51\x30\xba\xaa\xc3\xa4\xc7\x4b\x1f\xbc\x7d\xef\xa1\xf8\x26\xc1\x86\xda\x77\x10\x6c\xa8\x7d\xbb\x60\x43\x9d\x6f\x18\x6c\xa8\x73\x57\xc1\x86\x3a\x77\x10\x6c\xa8\x4b\x0f\xa8\x63\x7f\xb2\xa4\xa3\xdd\xbb\x80\x7d\xab\xc8\x51\x26\xa0\xb5\xcf\xc1\x6e\x14\x36\x67\xbd\xd3\xb0\x6f\x1d\x5e\xe8\xb1\xec\x45\x12\xf9\xe9\xf2\x26\xb6\xd7\xec\xc5\x93\x9b\x45\x30\xfa\xf1\x42\xe8\x47\x6c\xa1\x1f\xb1\x85\xee\x34\xb6\xd0\x8f\xd0\x42\x3f\x42\x0b\xfd\x08\x2d\xf4\x17\x0b\x2d\x74\xc4\x84\xab\x92\x2d\x2b\xb0\xd0\x19\xcb\x5f\xb3\x28\xf7\xf7\xe3\xb3\xe2\xd3\x2c\x23\x83\x8b\x90\x34\xc7\x9f\x9c\x28\x01\xfe\xd2\x67\x6d\xb8\x56\xae\xb0\xa9\xa8\x58\x9a\x4f\xee\x8f\xc5\x89\x44\x3e\x3e\xe2\x60\x70\x5b\x21\x9b\xe0\xd3\x46\xb5\xac\x5e\x48\x05\x26\xc2\xea\x08\x4c\x6d\x45\xaa\x2b\x7b\xb0\xfd\xf8\x79\xeb\xf9\xf3\xe7\x96\xd1\x33\x62\xfe\xd0\x80\x68\x9b\x20\xf3\x4d\x7e\x9c\xbf\x0a\xd3\x61\x89\x38\x56\x1e\xba\x3a\xd6\xf4\x18\xa2\x27\xc8\x94\x8d\x5a\x43\xe5\x01\x72\xb8\x50\x69\x0b\x7d\x1c\x19\x84\xb3\x4c\xa6\xd3\x97\xcc\xf3\x45\xff\x30\x0b\x3f\x64\x8e\xa0\x36\x66\xf0\xdf\xea\xec\x30\x3b\x98\xe7\x2c\x8d\xd1\x24\x1a\x73\x75\x8a\xc2\x22\x49\x63\x96\x7e\xb4\xda\x35\xd3\x76\xa4\x59\xfa\x90\xf1\xbd\xb6\x2a\x68\xd5\x7b\x08\x8e\xd1\x16\xdd\xcf\x35\x3b\x2e\x6c\x8a\x0e\x29\x9b\xf3\x31\x43\xbf\x02\x34\x32\x59\x18\x3b\x16\x98\x2d\xab\x11\x17\xb6\x6e\xa8\x37\xca\x0d\xe9\xc7\xfd\xd7\x87\xfb\xef\x38\xe3\xec\x58\xc8\x4b\x0e\x21\x4a\x6e\xca\xb1\x46\xac\xec\x92\xab\xf0\x6e\x35\x06\x0c\x31\x98\xf2\xb4\xe3\xe4\x95\x9f\xe6\x2c\x0b\x7d\xc1\xc4\xc3\xb9\x07\xc3\x85\x67\xf5\xd2\x33\x71\x93\x76\xfe\x64\x9a\xa4\x9c\x83\x26\x23\x72\xa1\x29\xec\xb2\xc2\x0c\x72\xe2\x35\xc8\x13\x3a\x3b\x47\x9e\x93\x3d\xc0\x0f\xe2\x46\xe4\xb1\x6f\xd8\x93\xf4\xee\xfa\x20\x58\x3f\x0a\x63\xd9\x11\x0c\x77\xfe\x5d\xba\x61\xf1\xf6\x43\x62\xcf\x61\x92\x39\xc4\xaf\x0f\x6f\xcd\x86\xae\x47\x3c\x67\x49\x9a\x2f\xa2\xd9\x9e\xf8\xeb\x15\x46\xae\x57\xf8\xf6\x2c\x82\xf4\xac\x2f\x8f\x98\xb8\x27\x66\x98\xfd\x6e\x82\x04\xfd\x07\x1f\x0d\xc9\x4c\x89\xa5\x33\x50\x5c\x75\x2b\xe4\x55\xb7\x4a\x60\x75\x0d\x89\x15\xc6\x45\xf1\xd1\x6d\x19\x69\xc6\xa5\x46\xa9\x98\x91\xa6\x24\x99\x12\xcf\xaa\x94\xb1\xd0\x88\x42\x4a\x9c\xcb\x22\x32\x41\xc9\x2a\x29\x2a\x57\x58\xb2\xe4\x85\xec\x1f\x63\x16\x23\x1f\x52\x5d\xae\x62\x20\x75\x80\xfd\x6b\xe6\x47\xe8\xa8\x6a\xfb\x49\x1b\xf5\xe1\x54\x70\xb2\x1f\x07\x1c\x8e\xf8\x1a\x26\x61\x3c\x0c\x03\xc9\xbc\x5c\xed\x3d\xd0\x88\x1a\x1d\xdb\xa4\x26\xa4\xc0\x11\x0e\xf8\xfc\x34\xff\x20\xc2\xea\x7f\x43\x46\x37\x49\x5e\xb5\x90\x62\xfe\x41\x1c\x7c\x6f\x54\x4c\x6a\xb9\x6a\x18\xa7\xc4\xb2\x8d\xb7\xf8\xc6\xa2\x40\x28\xf4\x57\xda\xf0\xaa\x72\x16\x3c\xe7\xff\x8b\x39\xaf\xec\xeb\xaa\x82\xfb\xac\x4a\x46\x5a\xdb\xa3\x1a\x3c\x6f\x53\xeb\x0e\x34\x6f\xe1\x05\x74\x9e\xb5\x5d\x55\x79\xd3\x60\x26\x78\x61\xa3\x8f\x85\x34\x2c\x8b\xa4\x45\xa4\x55\xba\x42\x99\x9e\x6a\xe2\x63\x1c\x63\x66\xbd\x80\xb6\x75\x27\xce\xb3\xbe\x17\xcf\x98\xb3\xb9\xc8\x33\x06\x3a\xdf\x87\x6b\x2c\x64\x0a\x5c\x83\x77\xa1\x9c\x65\x36\x77\xa1\xf1\x06\x89\x6f\x61\x66\x10\xdf\x4e\x37\xf8\x45\xfe\xdb\xd7\xd5\x0b\x7c\x53\x4c\x93\x7c\x23\xff\xdd\x9c\x7f\x7e\xde\xad\x65\x20\x13\x68\x61\xd0\x8b\xbd\x29\xf2\x3f\xfc\x4f\xc3\x08\x54\xf3\xa5\x8a\x3a\x43\x0d\x62\x68\xd5\xd9\x30\x9d\x63\xe4\xe3\x8a\xd5\xe4\x8f\x30\x1f\xbf\x42\xdd\xad\x72\x4d\xd1\xd9\xb8\xb2\x6c\x57\xac\x2c\xdb\x55\x2b\xcb\xf6\xd2\x95\x65\x7b\xb5\x95\x65\xbb\x6a\x65\xa9\xd0\x73\xb7\x2d\x45\xb7\x76\x09\xda\xbe\x7e\x09\xda\x2e\x2f\x41\xdf\x6d\x07\x24\x1d\x18\x54\xec\x4e\x4a\x9b\x12\xe2\x82\xe1\xbc\x07\x34\x9f\x7a\x86\x12\xd7\xb3\x25\x32\xf2\x6d\x0f\xcc\x35\x93\x77\xa9\x87\xff\xf7\x2c\x72\xf6\xac\x2f\x15\xa6\x10\x89\x99\xe0\xcb\xec\x12\x72\xad\x82\x6a\xa3\x8a\x47\xd5\xc5\x2d\x5d\x47\x15\xae\x2e\x2b\xd4\xf9\x3a\xba\x74\xef\x86\x30\x72\x38\x24\x59\x9a\x37\xa2\x0b\xab\xa1\x4b\xb7\x86\x30\xac\x86\x30\xdd\x4a\xca\xb0\x6a\xca\x74\x0b\xa4\xc1\x6e\xed\xa7\x43\x6b\xe3\xcc\x65\x96\x31\x05\x9a\xc6\xe6\xbe\x89\x24\x6f\x72\xf0\x6a\x91\xb2\x61\xfc\xac\x97\x29\xfd\x46\xd6\xd0\x32\xd5\x33\xd0\x02\xa1\x8d\x69\xdd\xb3\x45\xbc\x41\xfa\x5e\x9d\xf6\x62\x73\xa9\xc4\x57\x0f\x11\x19\xfd\xdb\x7e\x5d\x6c\xd5\x82\xf3\x9d\x21\x4f\xf1\xd3\x54\x22\x50\x42\x9a\x02\x44\x89\xcd\x62\x62\xdb\x6b\x4b\x01\xcf\x67\x2e\x12\x44\x83\x1d\xda\xad\x0c\xcb\xad\xac\xa6\xa9\x50\x0b\x36\xed\xcb\x2b\x4c\x09\x01\x66\x23\xc0\xaa\x10\xb8\x7d\x37\x99\x4d\x4c\x66\x11\x73\x25\xf5\xa6\xc4\xb9\xdb\xf5\x73\xb6\x7e\xd6\x5a\x7c\x74\x8d\x38\xd3\xa7\x17\xfa\x14\x6f\xc9\x44\x36\xa7\x32\x40\x16\x56\x4f\xe6\xed\x9a\xc9\xcc\x6b\x54\x4f\xe7\xed\xca\xe9\xcc\xcb\xd7\x14\xd7\x13\xba\x86\x72\x8f\xee\x8a\x72\x35\xf2\xee\x56\x84\x63\x35\x84\x7b\x54\x4b\x38\x56\x43\xb8\x47\x35\x84\x63\xd5\x84\x7b\x54\x22\x1c\x76\xf9\x66\xb2\x30\x44\x59\x18\xe6\xc6\x7b\x29\x1b\x8a\x21\x0d\x2d\x75\x8a\xcf\x85\x37\x95\xfa\xd7\xff\x34\xac\x57\xee\x5a\x5d\xc3\x89\x14\xda\xf3\x2a\x8c\x0a\x9a\xeb\x5d\xcd\xdf\xd0\x96\x12\xe1\xb0\xaa\x9d\xd5\x54\x63\x6a\xc3\x26\x4b\xb5\xa0\x7a\x61\x49\x4a\x1b\x85\xac\x1a\x85\x3b\x90\xc8\x36\x49\x33\x45\xd2\xa5\xba\xf3\x92\xa1\xab\xd7\x9c\x69\x15\x5c\x45\x23\xac\xba\xd7\x5f\x25\x40\xe2\x8d\xe3\x23\x12\x4a\x4b\xc2\x23\x52\x01\x65\x67\x5a\x1d\xf1\x90\x0a\x15\x1c\x04\x5d\x1f\x51\x90\xaa\xad\x12\x49\x50\x34\xe0\x0a\x6f\x21\x54\xbf\xe8\x28\xa4\x14\xc1\x4f\x76\xee\xe4\x96\x01\xc4\x96\x87\x09\x1b\xea\x08\x4f\xc6\x76\x46\x6f\x69\x44\xce\xc2\x0a\x1b\x66\xef\x6b\x44\xc0\xb0\xf2\xc6\x06\xca\x9b\x1b\x2a\x5b\xb1\xbb\x81\x8a\x1d\x8e\x68\xbb\x62\x8b\x03\xa5\x6d\x0e\x95\x2d\xef\x73\xa0\xb0\xd7\xa1\x72\x6a\x2d\x30\x5b\x97\xf1\x27\x8c\xa6\x65\x92\x1d\xbe\xcf\xec\xd3\xcf\x16\x35\xbe\x7e\xb5\xd0\xda\xdd\x2d\xdc\x2c\x59\x92\x54\xdb\x25\x1b\xc1\x36\xf0\xd8\xd8\x5f\xc8\x8b\xbe\xe5\xd6\x98\x55\xb6\x3c\x8e\xeb\xe8\xf0\x19\x74\x02\xd8\xf0\x74\xe7\xac\x78\x51\x78\x47\xa4\xe8\x6d\x76\xab\x69\x76\xcb\xac\x32\x5c\x49\x02\x54\xee\x09\xc9\x62\x94\xcf\x0d\x96\x0e\x59\x9c\xff\x8e\xa6\xf1\x74\x38\x62\x8e\xb1\x89\x96\x07\x6d\x0f\x97\x65\x0b\x6f\xa1\xfb\x56\x84\xb0\x1a\xa6\x32\x30\xd2\x75\xeb\xdf\xcf\xb0\xfd\xa4\x6d\x8e\x8a\x00\x5a\x75\x02\x60\x85\x29\xb9\xbd\xe6\x5f\xc3\xf2\x3d\x7d\xf1\x37\x4c\x2d\x2a\xc0\x16\x74\xdd\x6a\xde\x5f\x69\xeb\x00\x76\x74\xc2\xa2\x93\x96\x62\xcf\x69\xa7\xf3\x9d\xf7\x38\x56\xf8\x44\x5b\xe5\xb8\x81\x59\x62\x29\xf2\x4c\x83\x77\xae\x51\x08\xcc\xb2\x42\x14\x9e\xaa\x88\xd5\xe7\x8a\x81\x53\x96\x49\x77\x04\xfb\x79\x9e\x86\x83\x59\xce\x32\x62\x65\x2d\x66\xdd\xb5\x1b\xa2\x73\x44\x8a\x46\x88\x31\xe7\x96\x36\x62\x38\x06\xd2\x21\x74\xb4\x0c\xd1\x7c\x13\xf4\x70\xa8\x25\x95\xdd\xfa\x88\x33\xc4\x07\xcb\x03\xce\xb4\x6f\x18\x70\xe6\x48\xca\xa2\xaa\x78\x33\xd6\xf0\xdc\x94\x5c\x43\x24\xd7\x87\x8f\x07\x47\x07\xef\x8e\xf7\x8f\x0f\xdf\xbf\xeb\xef\x1f\x1f\x7f\x3c\x7c\xf9\xdb\xf1\xc1\x11\x19\x8f\x73\x1a\x19\xd4\xb9\xa9\x25\x68\xcb\x17\xee\x04\x31\x26\xfa\x7c\x2d\x00\x3a\x8e\x3e\x9f\x50\xb7\x02\x60\xcd\xc4\x5b\x41\xb2\x66\xee\xad\x20\x99\x33\xfd\x56\x80\xb4\x68\xb8\x1d\x91\x2d\xc9\xba\x06\xa8\x24\x66\xef\x47\x9c\x3f\x9d\x93\xf5\x11\x59\x9f\xd3\x4e\xdd\x8d\x2b\xb7\x36\xfa\xd2\x17\xc1\x87\x6d\xc9\x4f\xed\x12\x5f\xb4\x4b\xe3\xdb\x2e\x8e\x53\xdb\xa6\x77\xbb\x4c\xb7\xf6\x86\x0a\x48\x7d\x47\xb1\x9d\xb4\xb6\x5d\x30\xa2\x5f\x1a\xf6\xe3\x7b\x1b\xd1\x57\x84\xbd\xaf\xb3\xb8\x5d\xd3\xbb\x40\x65\x1b\xb7\xb2\xae\xaf\x80\xb7\xae\x35\xbc\x00\x35\x09\xe3\x97\xf5\xee\x0f\x9e\x6f\x3f\xbb\x1b\xf8\xb7\xb2\xb7\xb7\x41\xad\x6b\x15\x2f\xa1\xf8\xf3\x25\x1d\xde\x7e\xbe\xa6\xfd\x76\x11\xfe\xad\xec\xee\x6d\x50\xeb\x5a\xde\x7f\x93\x57\x22\xdb\x77\xf0\x4a\x64\xfb\x76\xaf\x44\x1e\x7d\xc3\x57\x22\x8f\xee\xea\x95\xc8\xa3\x3b\x78\x25\xf2\xf8\xdb\x3f\x9e\x78\xd2\xef\xab\xc8\xfc\xfd\x63\x36\xaf\xe7\x97\x27\x6b\x4a\x82\xa7\x66\x0b\x6f\xfc\x01\xab\x7f\x3a\xf6\x78\xcd\x4e\x3c\x43\xd7\x21\xb9\x1f\xc6\x2c\xed\xbf\xe1\x5a\x71\x3d\x9d\xd6\xf4\xe7\xf2\xfc\xdb\x3f\x32\xe9\xb4\x6f\xf8\xca\x44\x1a\xc3\xfe\x78\x07\xf2\xe3\x1d\xc8\x8f\x77\x20\xdf\xe6\x1d\x08\xbd\x5e\xf8\x83\x5c\xaf\x1a\xcd\xca\x48\x3f\x99\x64\x06\x22\x28\x57\xdb\xaf\x76\x4c\x36\xd2\x21\x83\x44\x10\xa1\x4c\x85\xff\x08\x5d\x78\xb1\x0b\x6d\x57\x7a\x89\x10\x63\x7c\x6f\xa5\x99\x83\x08\x84\xae\x59\x59\x4c\x1e\xf4\x6d\x92\x0c\x3e\x23\x33\x96\x67\xcc\x8f\x57\x2e\x3f\x5e\xb9\xfc\x78\xe5\xf2\xd7\x7a\xe5\x82\x2e\x46\xe7\x61\x46\x06\xe8\x11\x3a\x8c\x54\x46\xe9\xd9\x22\xcb\xd9\xc4\x7a\x02\x43\xe2\x0b\xf5\x04\xda\xc5\xef\xf3\xca\x37\xb1\x69\xfc\xd6\xd7\x76\x05\xdc\x96\xdc\xdf\x15\x4a\x5e\x73\x91\x57\x28\x7d\xe3\x1b\xbd\x42\xfd\x55\xae\xf6\x8a\x4d\xde\xf0\x8e\xaf\x44\x09\xeb\xb2\xef\x8c\xe5\xc7\xe1\xf0\x1c\xef\x49\x5e\xf1\x31\x6f\x78\xe2\x1e\x0a\x19\x85\xff\x7b\x08\xaf\xfc\x68\x38\x43\xe7\x12\x79\xe9\xbd\x42\x1e\x0e\xcf\x65\x39\xe1\x49\x16\xbe\xbc\x13\x71\x67\x8d\xa2\xc7\xfa\xf5\x42\xb1\x96\x34\xf5\x97\x71\x3e\x9d\xb9\x07\x22\x62\x26\x67\x3a\xa8\xb8\x86\x2c\xa1\x6d\x3c\x25\x52\xd7\x48\xba\x71\xf5\x64\x47\xa6\xec\xac\x7e\x7b\xe9\xdb\xd7\x7a\x7e\xe9\x4e\x6f\xc5\xdb\x4d\x7d\xbf\x67\x05\x0e\x59\x76\xf0\x50\xa5\x90\xaf\xf8\x56\x43\xf5\x54\x3f\xaa\x50\xe7\xf0\xf2\x38\xdf\xe2\x00\xbe\xf7\xda\x8f\x87\xe3\xa4\xee\xe6\xb7\x54\xae\x70\x09\x9c\xa4\xa1\x72\x9f\x6c\xd2\xb2\x65\x64\xec\x98\x57\x90\xb9\x82\x54\xbe\x67\xcb\x2e\xc3\x7c\x38\x06\xc7\xa8\x6b\x45\x27\xf0\x33\x06\x8d\x88\x8d\xf2\x46\xcf\x20\xb8\x05\xb1\xc1\xe2\xa0\x61\xc6\xd8\x1f\xa4\xcc\x3f\xdf\x29\xc0\x48\xc3\xb3\xf1\x32\x20\x78\x94\xb9\x0c\x8c\x8c\xec\x58\x0b\x61\x12\x06\x41\xc4\xea\x41\x14\x6f\xa2\x74\xed\x65\x43\xf6\x7b\xc8\x2e\x5f\x26\xf3\xfa\xb1\x12\x05\x2a\x6f\xea\xbb\xab\x5c\xd5\x77\xeb\xb9\xb9\x5b\xb8\xac\xb7\xa7\x48\xb7\x3c\x47\xf8\x74\xcf\x8c\x02\xf8\x6d\x31\xc3\xc4\x9f\x93\x8c\xe2\x3c\x76\xcd\x95\x74\xf5\x41\x97\xe3\x3a\x08\xd6\x8c\xd5\x80\x91\xd5\x2b\xae\xc5\x31\xdd\x10\x07\x5c\xf8\xb6\xd5\x80\x58\xf7\xc0\x93\x30\x5e\x11\xb1\xba\x23\xc7\x3b\x45\xcc\xe6\x15\x63\x46\xd8\x17\xa9\xda\x28\xce\x38\x8a\x2f\x0c\x8b\x3e\x94\x2f\x64\x58\x47\xfc\x56\xff\x8b\x98\xe9\x3a\xd6\x25\x80\x35\x98\xc5\x3a\xb2\x33\xb5\xdc\x4d\x26\x26\x7c\xad\x7a\x13\xc6\x6c\xa9\x1d\x8a\x2c\x54\xc9\xe5\xdb\xab\x70\xf9\x76\x3d\x97\x6f\x2f\xe5\xf2\xed\xeb\xb8\x7c\x9b\xb8\xdc\x82\x20\xd0\x35\x81\x88\x24\xcb\x9e\x85\x2b\xbf\x08\xa8\x6e\xf7\x27\x6a\x7b\x70\xd2\x18\xce\x1b\x1e\x34\x86\x0b\xfe\x7f\xc4\x08\xc3\x97\xf2\x96\x31\x45\x52\xf1\xd4\xb5\xa6\x1b\x9e\xd8\xf0\xdd\x22\x96\xac\x0f\x8a\x58\xc7\xa7\x27\xca\x8c\x40\x44\xa1\x68\x9f\x7a\x25\xe6\x75\x3d\x61\x6d\xe0\xcf\x65\xb1\x4e\x55\x31\x15\x2d\xe5\xca\x83\x93\xc3\x78\xc4\xb7\x46\x0b\x0f\x9a\xf2\xe7\xa9\x6d\x98\x91\x84\x71\xde\x5e\x45\xd9\xbc\xc5\xfa\x49\xf4\xc1\x5e\x99\xcb\xa7\x81\x41\xe7\xfb\x60\xd0\x39\xb5\x5e\x45\x2a\x14\x84\xca\x72\x33\x93\x83\xaa\x43\xc4\x15\x4d\x0e\x88\x27\x2d\x4b\x80\x51\x18\x45\x3d\x68\xc4\x49\xcc\x1a\x7a\x00\xbf\x25\x12\x92\x9b\x2d\x34\xe6\x9d\x9e\xe0\x89\x96\x31\x93\x17\x3a\xd5\x98\xc4\xf3\xae\x48\xed\x58\x65\x75\xea\xa2\x56\xd4\xde\xe0\x46\xa2\x6c\x20\x12\xa1\x20\x33\x46\xcb\x34\x14\xd0\xa6\x54\xc8\x11\x4d\xd2\x92\x9b\xbc\xb3\x4d\xac\x08\x57\xf2\x84\xb0\x5e\x8b\x23\x79\xc8\xe5\xed\x61\xce\x26\x4b\x85\xa6\x2c\xe4\x24\x53\xda\x4f\x8b\x68\x5f\x46\x70\x11\xc9\x66\xb9\x28\x5a\x6d\x08\x75\x33\x92\x84\xd9\xef\x7e\x14\x06\x92\x26\xd4\xb8\x6b\xca\x16\xa3\xb5\x1b\x52\x3b\x4a\x62\x66\x03\x96\x14\x2b\x18\x24\x2d\x47\x7b\xe9\x7d\xa9\xe3\x5e\x83\x33\xe5\x3a\x95\xed\xde\x45\x27\x2d\x96\x32\x96\x8b\x1b\x5d\xae\x54\x6c\xb6\xcd\xa5\xc7\x92\x27\x82\x2f\x4c\xcb\x34\x58\x95\x71\x79\x37\x9b\xc8\x51\x0d\xa3\xfa\x95\x65\x61\x86\xd9\xea\xbb\xd6\x34\x4b\x52\x6c\x05\xde\xcf\xae\x65\xfc\xac\xa8\x2a\x70\x0d\x41\xea\xc3\x96\x88\xa5\x35\xf6\x51\xad\x12\x61\xaf\xf6\x8f\xca\xab\x7d\x2e\x14\x46\x23\xbf\x5e\x9d\x78\x54\xad\x4e\xfc\x82\xce\x04\xc9\xd7\x82\x09\x48\xa5\xdb\x16\x7b\x69\x72\x6e\x82\xa4\x84\x75\x54\x8b\x47\x5c\xb5\x50\x5a\x04\xff\x51\xd2\x2f\x14\x0a\x3c\x81\x5a\x2a\x6a\x19\xd6\x46\x08\xa9\x58\xb1\x89\x34\x57\x56\xce\x3a\xd2\xfc\xe4\x3b\xac\x66\x96\xd1\xe9\x2c\xcb\x93\x09\x47\xee\x7b\x20\xc0\x09\x68\xd3\x2a\xcc\xd9\x24\x53\x0a\x99\x1d\x56\x11\x35\x26\x23\x2e\x35\x98\x27\x1c\x7c\x30\x91\x89\x5b\xe5\x43\x11\x52\xdf\xec\x18\x78\xb9\xd1\x45\x3d\xdd\x2b\xb7\xaf\x3d\xe3\xb7\xc5\x99\x32\xb0\x35\x9f\x7c\x49\xee\xe7\x0c\x03\xed\x3a\xcf\xdb\xd0\x14\xda\x0a\x1a\xfe\xd3\xfb\x59\x8e\x89\x78\x3f\x60\x24\x2c\x28\xe6\xae\xb6\x1d\xf5\xf4\xe8\xdb\x32\x87\x78\x4b\x6a\x1a\x9e\xd0\x3b\x28\xd5\xac\x5e\x18\x41\x1b\x08\xde\x79\xf4\x20\xb4\x2a\x70\x44\xec\x62\x53\x7f\x11\x25\x7e\xd0\x23\x25\x55\x17\x76\x8d\x68\x81\x77\xa0\x10\xac\x24\xbd\xab\x6e\x95\x57\x16\xdf\xeb\xca\xec\x86\x67\xd5\x24\x01\x8b\xc2\x1c\xdf\xae\x98\xb2\x7c\x6d\x5d\x6f\x54\x34\x3d\xcd\xde\x8f\x5e\x8d\xc3\x28\x10\x47\xbf\xc4\xcd\x62\xf5\x51\xbc\x6f\x2d\x1d\xa2\x4c\x41\xa1\x41\x11\xab\x19\xdc\x2b\x88\xd0\x3d\xfb\x9b\x66\x47\x4b\xa8\x3d\x62\xc8\xc5\x67\xc5\xaa\x74\xa7\x1a\xe1\xc6\x37\x18\xfe\x95\x95\x4a\x92\xeb\x70\x65\xec\xf8\xb9\xf0\xd9\xb0\x7a\x5c\xbb\xce\xde\xfc\x61\xc8\xe3\x15\xd7\xd0\xff\x9f\xbd\x77\xed\x6a\x23\x47\x1e\x87\x5f\x0f\x9f\x42\xc9\xce\xc6\x76\x30\xc6\x36\x10\x88\x59\x26\x6b\x6e\x09\x93\x10\x12\x20\x93\x4d\x78\x38\x4e\xdb\x96\xed\x0e\xed\x6e\x4f\x77\x1b\xe3\x04\xbe\xfb\x73\x54\xa5\x6b\xdf\x7c\x83\xfc\x66\xe6\x1f\x66\xcf\xc6\xdd\x2d\x95\x4a\xa5\x52\xa9\x24\xd5\x65\x63\x8a\x1d\xf3\x46\xe2\x8e\xd9\x58\x6a\x11\x8c\xe9\x4e\xf1\x08\x5b\xba\xbd\x25\xf8\x2b\x92\x69\x98\x4c\xf0\x98\xf8\x9b\x8f\xb8\x31\xd6\x92\xa4\x4f\x9e\xe0\xa8\x44\x8f\x52\x8a\x86\xae\x1a\x29\xc6\x75\xa8\xe2\x14\xdd\x49\x32\xbc\x49\xe8\x0e\x07\xbc\x67\x39\xce\xee\xf8\x9d\xe5\x33\x62\x69\xdc\x22\xf5\x06\x79\xa0\x59\x48\x60\x54\xd3\xb4\x3c\x72\xe5\x91\x6d\x63\xbe\x36\xa3\x8d\x79\x04\xb8\x66\x6c\xce\x28\x7b\x8e\xf7\x8d\x39\x3f\xa9\xc0\x1c\xd6\xe8\xc9\x12\x74\x0a\x6b\xf4\x59\x41\xe2\xb8\x1c\xfc\x71\xf0\xf6\x3c\xd1\xb2\x3d\x1c\x0f\x32\xcd\xa5\x93\x0d\xd7\x84\x8d\x73\xfe\x22\x87\xd6\xca\x70\x58\x65\x85\xb4\xeb\xf9\xe3\xdc\x65\x61\xb2\xad\x7b\x2a\xdc\x69\x6d\xdd\xa7\x00\xd0\xb3\xdb\xf3\xf5\xad\xe9\x79\x10\x23\x4e\x8d\xf6\x51\x7b\x7e\x22\x4d\x32\x04\x4f\xad\xcd\xfd\x06\xe6\x27\x02\x1b\x88\x25\x22\xbc\x98\x17\xa2\x25\x93\x19\x7b\xde\xd0\x0d\xef\x01\x4e\xa6\x51\x7d\x2a\x0c\x48\x1f\x70\xd2\x99\xda\x36\x52\x27\x64\xcf\x1a\x08\xcf\x6f\xbe\xc0\xcd\x83\x80\xcb\x8f\x9c\xd4\x19\xe7\x02\xc4\x80\x90\x18\x30\x51\xb4\xcb\xb0\x85\x66\x22\xdc\x9b\x15\xc5\xdd\x57\x51\x5e\x51\xe1\x74\x14\xeb\xc3\xff\x01\x1f\xc3\x74\x9a\xab\x59\x50\x44\x11\x7f\xc6\x38\x7f\x3f\xdc\xe7\xaa\x4a\x51\xb7\x98\xab\x2e\x53\xdc\x90\x60\x62\x7f\x35\xbf\xe0\x59\x8a\x1c\x56\xcc\x05\x8b\x21\xc4\x20\x61\x32\x94\x1f\x3d\xf3\x17\x1b\xfc\xc9\x9e\x38\x13\x27\xa5\x35\x0c\x3d\x36\x17\xdb\x56\x68\x1d\xdb\xae\xfc\x69\xdd\xe4\x2e\x0b\x97\x28\x00\x20\x55\xc7\xff\x01\x6f\x47\x71\x74\x20\x95\x0f\xfb\x35\xf0\x46\x70\xfc\xf3\xa7\x0f\x82\xc4\xf1\xba\xec\x1f\xbb\x4d\xdd\xd0\x0e\xc7\x78\x54\xd4\x87\x23\xa3\xa6\xe5\xb6\xb1\x86\xed\x42\x59\x14\x8d\x0e\xfb\xf9\xe7\xd0\x72\x43\x1b\x8f\x96\xf0\xf7\x37\xf8\x3d\x0c\x5b\xe7\xbc\x7a\x40\xff\x1c\x32\xa0\x58\x21\xec\xf9\x34\xe8\x79\x4e\x3b\x07\x8a\xda\x22\xdc\x6f\x39\x8e\x37\xda\xb7\x42\xeb\xe4\x9a\xfa\x1d\xc7\x1b\xcd\xad\x08\x4c\xf2\xa5\x42\x0d\x4a\xea\x41\x31\xb5\xa1\x5c\x4c\x74\xb8\xb2\x34\xc7\x29\x63\x05\x10\xf2\x5b\x9b\xc2\xb9\x7f\xb5\x5a\xad\x9c\x29\xc5\xc1\x12\x4d\xca\x45\xfd\x89\x2f\xd3\x1b\xfa\xac\xbb\x28\x17\x09\x8e\xf3\x65\x0a\x75\x64\x5e\x2e\xce\x8d\x58\xfa\xde\x7d\xb8\x12\x0c\xad\x22\xce\x5c\xd5\x9f\xce\x5c\x7f\x19\x67\xae\x07\x71\xf5\xa9\xdc\x83\xab\x4f\x65\x31\x57\x9f\xea\x03\xba\xfa\x54\xef\xcb\xd5\xa7\x7a\x0f\xae\x3e\x3f\x26\x4f\xca\x43\x7b\xc9\x6c\x3c\xbc\x97\xcc\xb3\x46\x03\x76\x09\x8d\x7d\x2f\x9d\xe1\x37\xe7\x64\x89\x4d\x01\xfc\x9d\xe7\x8c\xbb\x19\x42\xa4\x5a\x5d\xc4\x55\xe9\x41\xfd\xad\x9e\xcf\xec\x45\xf4\xd3\x87\xe8\xa7\x0f\xd1\x4f\x1f\xa2\x9f\xb9\x64\x7e\x7a\xd9\xfc\xf4\xb2\xf9\x27\x7b\xd9\xd4\xb9\x87\x0d\xdb\xf6\x59\x0e\x69\xdb\x3e\x05\x5a\x47\x5c\x6b\x60\x5a\xf3\xb4\x08\x3c\xc6\xe2\xbb\x23\xb2\x4a\x2a\x5b\x65\xcc\xbb\x46\x61\x4b\x59\xa1\x2b\x1b\xdb\x9a\x23\x0e\xd8\xf2\x4e\xeb\x87\xf3\xc3\xc2\xe7\x99\xa8\x4d\x72\xc3\x91\x05\xa7\xf1\xc2\x91\x85\xe7\x73\xc2\x91\xd5\xa7\xf6\xc1\x51\x0d\xce\xe3\x82\xa3\x11\x21\xc9\x03\x87\x6d\xd6\xe7\x72\xc0\x71\x6c\x97\x12\xea\xb6\xe1\x60\x45\x54\x90\x9e\x38\xc2\xa7\xa6\x6d\x85\x16\xf8\xe0\xb0\xcd\x3c\x9b\x18\x70\xbe\x2e\x8b\xc7\x5d\x70\xca\x45\x32\x2e\x17\x6a\x50\x07\x8c\xc8\x79\x06\x07\xaf\x03\x46\x21\x45\x51\x35\xf6\x97\xbf\xa9\x14\xc9\xb8\xc2\xab\x6a\xa9\x1f\x1c\x2f\xa0\x90\xc7\x64\x42\xf5\x6a\x91\x8c\xab\xe9\xd5\xad\x1b\x5b\xe0\x9d\xe9\x1b\x24\x09\x9a\x67\x7d\x7f\xf0\x80\x85\x7e\x24\xa4\xa0\x1f\x0f\x53\x68\x38\xc8\x34\x62\xce\x31\xd1\x0b\x6d\xe3\xde\xbb\x24\xde\x98\x06\x56\xfc\xe5\x99\xfd\x8d\x72\xdb\x21\x79\xb5\xcb\x7f\x97\x02\xf6\xed\xf6\x96\x6c\x19\x26\xcc\x53\x99\x2f\x27\xa9\xf2\xb3\xa5\xbc\x61\xa4\xd7\x4d\xbd\x0d\x1c\xaa\x3f\x02\x07\xb2\x6c\x78\x11\xc1\x5a\x9d\x03\x0f\x87\x1c\x79\x41\x56\x2a\xa4\x46\x2a\x05\xf2\xd4\x20\x65\x12\xde\xa6\x25\xc0\x77\x34\x3b\xae\x94\x6e\x8a\x68\x6a\x5c\x29\x8d\x8b\x68\x5e\x5c\x85\x77\xf8\x6b\xac\xbb\x39\x18\x33\xfa\x25\x0d\x61\x2e\xb3\xc9\xb0\x62\xa1\x8d\x9c\xd7\x21\xd4\x6a\xf5\x92\x5d\xea\x8c\x89\x0c\x93\xd8\x4b\x9b\xc4\x67\x70\x2a\x7f\xa7\xc3\x96\x13\xe6\x3e\xfd\xbf\xe2\xf3\x6a\x66\x1f\xb0\x96\x17\x88\x35\xae\xe5\x05\xf9\x95\x08\xdd\x89\xc8\x0f\x64\x30\x4e\x96\xe3\x18\x04\x68\xf4\x02\xf2\x1b\x5b\x25\x0d\x43\x5d\xbd\x52\x8c\x21\xc0\x7d\x85\x31\x04\x77\xf8\x22\x35\xd3\x7f\x4c\x33\x1f\x66\xd0\xff\x43\x56\xe6\x04\xcf\x80\x32\xe0\xa6\x5f\x59\xdc\x4a\x38\xcb\x85\x6c\x0e\x8f\xb1\xfb\xf2\xa9\xb9\x6f\xcf\xb1\x88\xd4\xac\x26\x88\xcd\x98\x09\x50\x35\xd1\x04\x48\xbc\xe3\x06\x18\xd1\xa2\xec\xf5\x3d\x78\x50\x24\x1d\x30\xcd\x13\xb4\x71\x61\x2f\x8a\x05\x10\x91\x5e\x14\x05\x63\xd6\x98\x04\x64\x5c\x8b\xf1\xc5\x73\x09\x46\x52\x33\x9c\xd9\xc6\x0c\xa1\xa6\x3d\x5a\x4b\xb2\x7c\x4a\x36\x70\xcc\x30\x82\x82\xcb\x13\xcd\x95\x42\x37\xff\x4c\x30\x6f\xe7\x5e\x74\x06\xef\x9a\xfe\x74\x84\xf8\x35\xce\xb5\x9a\x75\xa8\x66\xbb\xae\x38\x4c\x18\xb7\x69\x62\x30\xee\xf7\x08\xca\x4d\xa6\xdd\x6f\x02\xf9\x7f\xc0\xc2\x1d\x73\xd2\x9a\xc7\x0e\x72\x11\x66\x88\x1f\x85\x4e\x60\x88\x59\xd8\x40\x1f\x7e\x3e\x04\x35\x31\x14\x77\x7f\x1b\x2f\x9b\x24\xf2\xde\x93\x97\x4d\xe2\xc8\xfd\xd3\xbc\x6c\x26\xb3\xe7\xf4\x76\xda\x3f\xce\xcb\x46\xe3\xe5\x7f\x8a\x93\x4d\xba\xa7\xee\x44\x97\x5a\xc3\xf2\x77\x2d\xe6\x64\x13\xdb\x47\xad\xc9\x8d\xd4\x64\x57\x9b\xb5\xa9\x5d\x6d\xd6\xb8\xab\x8d\xd1\xb7\x99\x9c\x59\xee\x47\xb1\x58\xd0\xa1\x65\x11\x24\xd0\xa1\xc5\x14\x6a\x6f\xf8\x31\x77\x4c\xcf\xd2\x3d\x3d\x0c\x0d\xe8\xa1\x75\x1f\x81\x55\x61\x71\xe7\x1b\x47\x9c\x2f\xc4\x1c\x70\xd4\xc9\x43\xa2\xff\x8d\xae\xda\x9b\x15\xb5\xbd\xd5\x3d\x7a\xee\xe8\x3a\xcf\x8f\x70\xb1\x29\x46\xbc\x68\xf4\x79\x73\x53\x53\x74\x2b\xc1\x49\x8f\xfe\x62\x5c\xd5\x74\xaa\x59\x3c\x6e\xee\x49\x92\x27\xdd\x50\xdf\xbb\xc7\x4d\x44\x7e\xdf\xaf\xc3\x4d\xf2\xd4\xb8\x07\x87\x1b\xfd\x68\x69\x91\x71\x88\xbb\x42\xcf\xbb\xee\x99\xfa\x3c\x90\xc7\x90\x39\x45\xc5\x58\xf1\xae\x40\x37\xfe\xd2\x3e\x44\x33\xb0\xf4\x3d\x32\xf4\xb4\x5a\xf4\x8f\x76\x21\x5a\xc0\x0d\x37\x72\xc4\xb0\x3e\xcd\x11\xc3\xba\x3c\x37\x30\xdd\x88\x38\xac\xff\xec\x90\xb2\xf2\x25\x7a\x38\xaf\xa2\xbf\x34\x0f\xcc\xed\x54\x14\x73\x26\x4a\xe0\x9a\x04\x7f\x1e\x79\x7f\x92\xed\xce\x53\x99\xc7\x9d\x47\xc2\x4e\xf1\xe6\xb1\x12\xbe\xcf\xe1\xcc\x93\x2c\x9d\x17\x72\xe6\x49\x06\xb9\xa8\x33\x4f\xb2\x69\xda\x34\xce\x3c\x92\x52\xd9\x8e\x30\xd9\x0d\x4c\x32\x54\x4e\xad\x3d\xd9\x11\x26\xb5\xaa\x72\x84\x21\x70\xc6\xfe\x9a\x66\x7a\x15\x3d\x50\x07\x26\x1b\x92\x3f\x44\xdf\x95\x35\x74\xb6\x2f\xd6\x24\xb4\x27\xfa\x62\x4d\x01\xc0\x9f\x98\x4d\xe3\xaf\x4a\x7a\xa4\xe0\x24\x5f\xb2\x54\x20\xc2\x97\x6c\xa2\x91\xff\x03\xf5\x1f\xa7\xf6\xac\x92\xa6\x0d\x92\xe6\x6c\xaf\xfe\xe6\xa0\x71\xfe\xe9\x1d\x0a\x99\x4c\x9b\xfc\x89\x5c\x38\xa5\x0f\xd2\x03\x91\x61\x92\x1f\x4f\x7a\xb3\x9a\x0f\x92\x7e\x96\xbe\x90\x9c\x1d\xe0\xe1\x27\x08\x5a\x3c\x8d\x57\x4e\x4e\x7f\x67\x02\x4d\x72\xd2\xfa\xab\xe1\x0e\xce\x49\xf3\x77\x7a\xae\xaa\xdc\xbb\x8b\x4f\x89\x89\xfe\x90\xa9\x70\x26\x7b\x45\xa5\x0b\xb6\x59\xfc\x21\xd3\x11\x98\xcd\x1f\x72\x82\x84\x56\xfe\x90\x93\x1d\xd7\x26\x2d\x96\xd3\x3b\x55\x4e\x9c\xa9\x68\x52\x50\x14\x77\xbd\x8a\xcd\xa7\xf2\x8a\xcb\x64\xbc\x29\x1d\x8b\xa4\x26\x16\xd3\xc3\xca\x31\x77\x9d\x64\x57\xa3\x14\x27\x20\xd3\xeb\x08\xfb\x97\xee\x63\x94\xe5\x75\x84\x8b\x23\x98\xf1\x3d\x8c\xc3\x90\x61\x13\x16\xf1\x17\x5a\xfb\x2b\xf9\x0b\x3d\x88\xc3\x4c\x2c\x55\xe1\x5c\x6e\x41\x0b\x39\xcc\x54\x1e\xd0\x61\x26\x39\x9b\xd9\x5c\x4e\x41\x8b\x3b\xcc\x54\x67\x74\x98\xf9\x69\xe1\xff\xd3\xc2\xff\xa7\x85\xff\x4f\x0b\xff\x9f\x16\xfe\xff\x60\x0b\xff\xcf\x60\xe3\x2f\xed\xf9\xd9\xec\xfd\x3c\xad\x49\x7e\xd2\x82\xf2\x20\x26\xf9\x9f\x27\x58\xe2\x7f\x9e\xc2\x00\xff\xf3\x5c\x76\xf7\x9f\xa7\x35\xb7\xff\x3c\x8f\x95\xfd\xe7\x04\xe3\xfa\xd9\xee\x1b\x62\x87\xf5\x09\x67\xd1\x9f\x27\x1f\x41\xcf\x9a\xb5\xf8\x73\xc6\xc9\xf2\x34\xa7\xb5\xd9\xe9\x65\xb3\x4e\x6b\x57\x57\xc1\xca\xde\x65\x88\x78\x1d\xb4\x2d\xe6\xc8\xd1\x36\x5b\xbe\x43\x9e\x18\x66\x89\x40\xa1\xff\x83\x24\xb7\x93\x8f\x35\x27\xe4\xc7\x35\x7a\x3a\x74\xed\x70\x62\x4f\x59\xa1\x7f\x42\x4f\xff\x1c\x52\x62\xb7\x59\x77\xbf\xad\xf0\xae\x7d\x9b\x7c\x34\xff\xb7\xe8\xdd\x15\x1d\x4f\x1c\xc6\x29\x4e\xf1\xff\xaa\x7d\x9d\xab\xaa\x3a\xc5\xe7\x44\xf2\x2d\xb7\x0b\xf3\x9a\x13\x04\x9e\xe7\x22\xc7\xe4\x23\xa4\x09\x1d\x9a\x2e\x7c\xcd\x03\x0d\xc7\xdf\x36\x7c\xcd\x84\xa1\x86\x23\x94\xf4\x63\xa1\x6f\xc6\xf1\x0f\x1f\xfc\x8b\x67\xeb\x45\xf2\x6c\xfd\x32\xf1\x44\xc8\x8c\x50\x73\xef\x27\x34\x9f\x53\x0e\x66\xd6\xb3\x0e\x66\x38\x98\x19\x0e\x63\x38\x35\xc9\x1f\xf5\x53\x72\xf4\xf6\xf7\x83\xbd\xf3\xa3\x93\xb7\xe4\xe9\xaa\x82\x3d\xf0\xbd\x16\x05\x5d\x9c\x6b\x71\x7b\xde\x60\x0c\xd1\x74\x48\xbe\x55\x20\xd5\x72\x65\x6d\x65\x80\x56\x64\x45\x72\x68\xb5\x68\xd3\xf3\xae\x8a\xe4\xc8\x6d\x95\x96\x08\x54\x38\x67\xdb\x10\x1e\x52\xa0\xe5\xb5\x29\xb1\x03\xe2\xd8\x2d\xea\xb2\x6d\xc8\x90\xa9\x15\x20\x89\x8e\x8f\xce\xc5\x6b\xd2\xf1\x86\xae\x10\x51\x0c\xc4\x9b\xa3\xbd\x83\xb7\x67\x07\x84\x29\x90\x42\x72\xf9\x9e\x17\x72\xbf\x50\xcf\x07\x09\x17\x6a\x0d\x85\x3e\xa5\x25\xa1\x5c\xf2\x8d\x2b\xeb\x47\x89\xba\xd7\xa5\xb7\x27\xfb\x07\x8d\x83\xb7\x7f\xc0\x56\x21\x37\xf0\xbd\xf6\x10\x3a\xcb\xcd\xf7\xe1\xb4\xc0\xbd\xb6\x7c\xdb\x72\x53\x8e\x4c\xf2\x5b\x9b\xa0\x59\xb1\xa2\x23\xcb\x77\x6d\xb7\x9b\x76\xa0\x51\xa9\xca\x92\x70\x1d\xf4\x4e\x68\x2c\x67\xb4\xe5\xd3\x34\xf8\x15\xc8\xaf\xcb\xad\xe7\xbc\x6e\x97\xb6\x59\x9d\x43\xcb\x76\x86\x3e\x2a\x3b\x77\xdb\x4b\x4a\xb5\xae\x07\x01\xf5\x43\x12\xf6\x2c\x74\x95\x02\xf5\x2d\x20\x7d\x2b\x6c\xf5\xc8\xc8\x0e\x7b\xe8\x40\xc5\x36\x26\xc1\x80\xb6\x02\x46\x1a\x02\xdb\x21\xd2\xa7\x41\x60\x75\x69\x40\x2c\x9f\x92\x3e\xed\x7b\xbe\xfd\x8d\xb6\x89\xe5\xb6\xc9\xc8\x66\x1b\x21\xd7\x19\xb3\x5d\x51\xd0\xf3\x46\x2e\xf1\xdc\x16\x15\x03\xcb\xfd\xad\xbe\x7b\xdc\xdd\x8a\x81\x3f\x63\xd0\xc9\xb1\x35\x60\x03\x02\xba\x52\xe8\x11\xcb\xec\x79\x52\x5d\x8e\xf0\xe9\xd0\x65\x52\x44\x3c\x42\x7f\x5c\x4a\xdb\x0c\x4a\x13\x3b\xb0\xd2\x62\xba\x35\x6d\xeb\x50\x02\xee\xc5\xe5\x78\x2d\xf4\x24\xa2\xa5\x6e\x89\x3c\x66\x12\xe1\x71\x91\x3c\x6e\x79\x6e\x48\x6f\x42\xf8\x09\xa6\x5c\xe2\x45\x12\x0c\x69\x9f\x0c\x2a\xe7\x5b\xae\xee\xa1\x2f\x29\xff\x02\x87\x4a\xd4\xa0\x5e\x49\x07\xf5\x42\xd8\x6a\xdf\x91\x2e\x0d\xcf\x42\xab\x75\x45\x50\xbb\x0f\x22\x80\x02\xf6\x8d\xd7\xf5\xed\x6b\x2b\xa4\xc0\xb3\x52\xed\x86\xbe\x4a\x8e\xc9\x4b\x0a\x73\xdb\xf8\xa0\x28\xbb\x5c\x34\x11\x2f\xca\x96\x91\xa7\x67\x9c\x02\x44\x9d\x9b\x89\x36\x81\x12\x6c\xee\x09\x1c\xd4\x5e\x40\x6c\xd2\xe1\x75\x24\xee\x47\x5e\xaf\x5f\x88\x1a\x86\x02\x11\x95\xe5\xe6\xea\x2a\x61\xf5\x90\x51\xaf\x2d\xc7\x6e\xe3\x70\xf6\xad\x31\x6e\xe5\x4b\xe4\xc8\xc5\x6c\x64\x61\x8f\x8e\x49\xdb\x2b\x92\x11\x25\x6d\xcf\xcd\x85\x64\xc4\x66\x6b\xe8\xe9\xc0\x3a\x96\xed\xa0\xb0\x80\xed\x0b\x19\xf4\x58\xd5\x51\x8f\xfa\x94\xd8\x4c\x7a\xb4\x59\x45\x28\xd5\xa4\x1d\xcf\xa7\x25\x72\xe6\x31\x88\x8e\xd7\x25\x76\x58\xd2\x61\xd5\x3b\x21\x4a\xaa\x80\x92\x9e\x75\x4d\xf9\x81\x89\x43\x2d\x97\xc9\xb1\x01\xc3\x24\xe7\x38\xc4\x41\x6f\xc5\x3e\x47\x58\xd9\xf2\xf8\x63\xc3\x04\x14\x14\x0f\x3b\x60\xd2\xd0\x76\x43\xb6\xe0\x79\xae\xe5\x38\x63\x62\xb9\x9a\xf4\x81\x19\xd0\xa5\x61\x40\x5a\xd6\xb0\xdb\x0b\x4b\xe4\x28\xcc\x21\x17\x05\x56\x9f\x9a\xf0\x9a\xb4\x67\x5d\xdb\x9e\x4f\xac\x00\x26\xbd\x37\x0c\xb9\x50\x0c\xad\x10\x2e\xc8\x08\xbd\x69\xd1\x41\x88\x22\xc1\x22\x4d\x0a\x86\x7a\x9c\x89\x4b\x86\x81\x2a\xc7\x40\x9c\xbe\xc8\xf1\xbd\xd0\x07\xf4\x12\xbd\x9f\x04\xbf\xb2\x05\xfb\xdf\x41\x8d\xfc\x3b\xc0\x21\xfc\xf2\xef\xe0\x0b\x76\x10\x06\x73\x9b\x11\x1d\x0e\x5b\x9a\xd4\x38\x5d\x19\x06\x43\xe8\x7a\xc7\xf7\xfa\x10\xf7\x3e\xc7\x3a\xf8\x85\xcd\xdf\x15\x58\xd1\xbf\x10\x26\x1f\xad\x2e\x2d\x92\xe6\x30\x24\x3e\x6d\x51\xfb\x9a\xb6\xa1\x81\x52\x2e\xc2\xfb\x6c\x05\xce\x81\xc4\xc1\x73\xb7\x9c\x3e\x4b\x74\xec\x8b\x24\xbb\x73\x05\x3d\x11\x1d\xce\xf7\x9d\xb4\xb2\x79\x31\x21\xcd\x06\x22\x93\x52\xe1\xc1\x36\xce\xc5\xc4\x15\x41\x6b\xf5\x8e\xb4\x40\x82\xe7\xe9\x4d\xc1\x60\x1e\x81\x0c\xbd\xd1\x0a\xcb\x5f\x7c\x45\xca\x3f\xc2\x62\xb7\xb7\xbc\xbc\x76\x86\x09\xb2\x9f\x8f\x96\x5c\x16\xec\x8e\xcd\xe5\xa7\xd7\x61\x63\x18\x1b\x3e\xb9\x88\xa0\x0c\xf6\x71\xac\xa4\xb4\x82\xa1\xe5\x7b\xff\x2f\xac\x83\x5f\xe0\x18\xcd\x25\x5f\xa0\xb9\x2f\x7c\xec\xd8\x77\xb6\xc2\x90\x7f\x07\x25\x84\xf0\xc9\x1b\xc2\x1c\x87\x79\xd5\xf1\xfc\xae\x17\x86\xd4\x65\x42\x7f\x00\xe7\xa6\xae\x3c\xd1\x00\xa7\xf8\x44\x2c\xe0\x78\x83\x09\x2d\xae\x80\x17\x65\x77\xd9\x6f\x5c\x67\xe0\x97\x4b\xe5\x3f\xe7\x70\xec\xc6\x96\x3a\x00\x01\x57\xb8\xc4\x72\x1c\xc2\x17\x62\xbd\xe5\xc2\x3d\xf0\x19\x0c\x83\x36\xbe\x4c\x70\x26\x0f\x0d\x79\xf2\x84\x3c\xc2\x6f\x25\x3e\x3d\x99\xf0\x8d\xab\x02\x85\x42\x54\xaa\x9c\xb0\x05\xbb\xef\xb9\x36\xa3\x06\x4c\xff\x0e\x96\x85\xc5\x9b\x34\x69\xcb\x1a\xa2\x00\xf5\x29\xc1\x40\x52\xb8\xba\x5a\xc4\xf1\x42\xbe\xd8\x99\x20\x99\xa8\x41\xe4\x75\x19\x11\x47\xe6\xc2\x40\xf8\x52\xdc\x58\x2c\x19\x3e\x36\x3e\xae\x7a\x64\x47\x2d\x8e\x2f\xe4\xcf\x7c\x81\xd4\x48\x2e\x67\x54\x11\xec\xcc\x0f\x3c\x73\xac\x35\xda\x16\x42\x86\x49\x9b\x7f\x9b\xb4\x37\xb0\x28\xf2\xe6\x1e\xe1\xa9\x30\x79\xc1\x9f\x59\x33\x85\xf8\xec\xb9\x53\x87\x59\x4c\xbf\x42\xd5\xba\xc4\x35\x6b\xb2\x13\x59\x91\x51\xc5\x4f\xd3\xa2\xef\x30\xe8\x55\x96\x5a\x9e\x5f\x2b\x14\x0a\x31\x2d\x7f\xe3\x5e\xb5\xfc\xbf\xab\xda\x9e\xa1\x32\xe7\xce\x0e\xf6\x4e\x0f\xce\x1b\xfb\x27\x8d\xb7\x27\xe7\x8d\x77\xf5\xb3\xb3\xc6\xf9\xab\xa3\xb3\xc6\xc9\x69\xe3\xd3\xc9\x87\xc6\xc7\xa3\x37\x6f\x1a\xbb\x07\x8d\xc3\xa3\xd3\x83\x7d\xc6\x4d\xb1\x71\x4c\x02\xbc\xbd\x14\x1b\x89\x67\x0b\x8d\xc4\xea\x2a\xd9\x2c\x55\x4a\x15\x72\xee\xbd\xf3\xed\xbe\x1d\xda\xd7\x34\x6f\xbb\x83\x61\x48\x2e\x8a\xe4\x9d\x4f\x3b\xd4\xf7\x71\x0a\x5d\x16\xa0\xbf\x76\x80\xa7\xbc\x29\xdb\x82\x0d\xb8\xed\x5e\x05\x71\x41\xad\xb6\xd0\x4c\x0f\xce\x9e\x81\x00\x27\xd7\xd4\x0f\x60\x0a\x30\xad\x08\xb5\x1b\xbb\x3f\x40\xe3\x18\xf2\xdf\xff\x86\x0a\x0d\xd0\xa2\x18\x28\x26\xfd\x40\x9d\xa0\x2d\xcf\x6d\x2b\x41\xbb\x42\x3a\x8e\xd5\x25\x2b\x64\x20\xd0\x44\xa1\x6b\x07\xc4\x22\xa8\x2c\xc7\xa9\xaa\xce\xd4\xed\xb0\x48\xce\x94\xee\xf9\x48\x74\x2c\x6f\x87\x85\x82\x58\x24\xec\x50\xec\x71\x3a\x2e\xa8\xb4\xdb\xbc\xf8\x19\x18\x47\xa3\xd0\xcc\x77\x5c\xb2\xc3\xb4\xb1\xd0\xc3\x68\x0d\x05\x62\xe8\x1c\x20\x2a\x25\xf8\x6b\xcb\x61\x78\xb8\x38\xf5\x58\x63\xb2\x35\x0d\x7e\x14\x34\x2c\xde\x27\x9d\x7b\x80\xfc\xe8\x21\x51\xc7\xeb\x2c\xf3\x96\x31\x17\xb2\xed\xcc\x35\xdb\xfe\xe1\x22\x07\xcb\xa6\x1c\x66\xbc\x5e\x2e\x6c\x2f\xdd\x25\x70\xf7\xe6\xa2\xdc\xdd\xb1\x1c\xa7\xc9\xa4\x29\xdb\x2e\xb8\x9e\xbb\x02\x8b\xef\x8a\x63\x5f\x31\xa6\x5c\x03\xe6\x62\xaf\xb5\xeb\x71\xcf\x69\x93\x3f\xb6\x38\x07\x05\x4b\x18\xd9\xa2\x93\xba\x0d\xde\x42\x86\xa7\x81\x63\xbb\xe1\x4a\xdb\x0e\x18\x90\x15\x97\xde\x84\xe0\xd5\x42\x5c\x6f\x45\xde\xa0\xad\x34\x87\xb6\x13\xda\x6e\x10\x67\x4c\x4e\xe2\xdc\xb7\x5c\x01\xee\x0c\xd8\xd6\xe4\x28\x38\x90\x68\xe5\xcb\x05\x79\xf5\x45\x6a\x06\x1f\x23\x13\x8b\xdb\x50\xaf\x03\xaf\xd8\x30\xe2\x90\xe6\xc8\x0b\x36\xc2\xc1\xc0\xb1\xc3\x7c\x2e\xc7\xd6\x2f\xc5\xe9\xc9\x64\xdf\x9a\x82\xec\x40\x61\xd8\x7f\x71\xd6\x81\x3d\xbf\x64\xa4\x24\x91\x96\x8a\xb4\xa8\x24\x19\xab\x14\x30\x91\x9d\xdf\x2a\x92\x95\x4a\x0a\x8e\xcf\xa7\xc5\x11\x64\x5c\xb5\x54\x21\xa7\x38\x6a\xd8\xf9\x3d\x8f\xfa\x2d\x9b\x11\x56\xea\x4f\xd3\x20\xcc\x66\x90\x1d\x32\xea\xb2\x15\xa6\x63\xbb\xb4\x5d\x48\xe5\x7a\xa6\xa8\xf5\x69\xd8\xf3\xda\xc4\x73\x09\x5c\xcf\xda\xa8\x3d\x6b\xe2\x25\xa1\x6f\xcf\xca\x33\xf5\xad\x52\x5a\x27\xe7\xde\x91\x1b\xd2\x2e\xf5\x91\x5f\xa9\xed\xc8\x50\x2c\xd4\x76\xd0\x62\xa5\xe3\x78\xa0\x93\xc3\x6b\x78\xd8\x9e\x61\x8c\xec\xe0\xad\xf5\x16\xfa\x4e\x96\xd9\xa7\x17\xa4\x4c\x6a\x40\x8c\xdf\x48\x99\xbc\xe0\xd0\x6b\xd0\x76\x21\x95\xb5\x9e\x55\x16\x9a\xd1\xa0\x9c\xf5\x2c\x26\xeb\xd3\x02\x32\x57\x0b\xf9\xdc\x15\x1d\x07\x39\x6e\xa7\x33\xb4\x53\xcb\x82\x2d\x4f\x06\x05\xae\xe8\xd8\x20\x01\xb6\x8c\xc1\x40\x6f\x6f\x49\x5e\x7f\xde\x61\x0d\x41\x8d\x94\x8e\x67\x46\xb8\x9e\xaa\xe3\x5d\xc7\x6b\x82\x04\x4e\x54\xd3\x9e\xf1\xfe\x9e\xbd\xaa\x9f\x1e\xec\x33\x15\xa4\xd1\x68\x79\x3e\x5d\xf9\x1a\x34\x10\xd1\x46\x23\x87\x45\x82\xd0\xf3\x29\x53\x6f\x01\xe0\x05\xd6\xc0\x2e\x45\x5e\xb1\x29\x3d\x23\x8d\x18\x6c\x8d\x44\xea\x91\xc3\x4a\xa2\x4d\xa6\x35\x5f\x84\xdf\x8f\x0e\xc8\xd6\x0a\x3f\x51\x61\x52\x9b\x34\x87\x5d\xc2\x06\x3c\x8e\x65\x7e\x89\x90\x9c\x66\xb1\x50\x34\x4f\x7e\x8a\xe0\x3e\x2b\xee\xa9\x8b\x49\x52\xb7\x18\x7a\x6f\xbc\x96\xe5\x50\x94\x4f\x45\x21\xa8\x8a\x7c\x3d\xce\x2d\x15\x84\x60\x2d\xe6\x0a\x09\x3d\x9b\xe6\x38\x1c\x7a\xc6\x7f\x97\x3a\xca\x30\xa3\x4b\x43\x0d\xdb\xb3\x71\xbf\xe9\x39\x41\x42\x1b\x8b\x29\xe3\x31\xaa\x7d\x27\x8f\xf9\x55\xc0\xe3\x5a\x22\xab\xad\x57\x9e\xc3\x4d\x07\x0d\x8e\xa1\xae\x30\xe2\x88\x5d\x06\x3c\x5b\x4c\x39\x35\xb7\x09\xc0\xb9\xbf\x5a\x69\x8a\xe7\x7a\x75\xa3\x90\x67\x78\xc0\x9d\xc4\x2a\xa9\x56\x4a\x95\xd2\x5a\xa9\xba\x49\xf8\xd2\x22\x17\xe1\x8b\xff\xfe\xd7\x0e\xa9\xcf\xf6\xe2\x97\xf9\xc2\x52\xb2\x14\xd9\x2c\xe4\xf9\x48\xcb\x65\xb4\x68\xc8\x46\x06\x80\xc9\x7e\xb8\xd3\xef\xd9\x41\xa9\xc1\x30\xc3\xa2\xea\xf3\x36\xdb\x9c\xa2\xe1\x9b\x2c\xc7\xed\xfc\x22\x7f\xab\xab\x84\xe9\x0c\xe8\x78\x2d\x3b\xb0\x01\x0b\xd7\xbf\x11\xec\x11\xc7\x5a\x32\xed\xbf\x4b\xac\x4a\x1e\xee\x8e\x0c\xfb\x43\xae\xb3\x9e\x08\x47\xcb\x86\x54\x63\x01\xbc\x7c\x6d\x8b\xd7\x70\x13\x26\x34\x44\x2c\xf3\xdb\x0e\x39\x91\x3e\x90\x32\x52\x1a\x37\xbb\x90\x8b\x5f\x91\xcd\x44\x8d\x03\x08\x8f\xf0\xb7\xc3\x86\x2a\x7f\x52\xc4\x06\x0b\xdb\x5a\xef\x97\x77\xb0\x8c\xb0\x6f\x5c\x22\x31\xf0\xf0\x5d\x80\x86\x5d\x35\x83\x7d\x97\x34\xc1\x16\xd3\x10\x13\x58\xec\xcd\xd1\xee\x69\xfd\xf4\x53\xea\xfa\xb2\xc5\xe5\xec\xaf\xfc\x9e\x2c\x25\xa6\xf7\x26\x2f\xe6\x53\xa4\x54\x5a\xb9\xf5\x2a\x2f\xd8\xb3\xdb\x69\x85\x36\xca\xa2\x8c\x15\xa4\x05\xf8\x16\x60\x04\x93\xa4\x15\x7c\x2e\x60\xfd\xca\x98\x74\x0f\x4c\x6e\x52\xa7\x94\x58\x53\x02\x1a\x9e\x73\xc9\x77\x6e\xa5\x5f\x24\x3d\xe7\xc5\x4d\x03\xa0\xd4\x9e\x0b\x4c\x8e\xce\x0f\x4e\xeb\xe7\x27\xa7\x69\x2b\x5b\xb9\x90\xcf\x89\x19\x2b\x56\xf5\xdd\x0f\x2f\x5f\xb2\x31\x7a\x94\xbf\xb8\x2c\x31\xe9\xcf\x76\x2a\x39\x36\x1d\x72\x6c\x23\xcf\x5f\xe6\x0b\x38\x03\xcf\xac\x8e\xe5\xdb\x40\xbe\xe6\xb0\xdb\x1d\x13\x5b\x52\x69\xb4\xea\x91\x2f\xac\xde\x17\x80\x7b\x78\xd8\xd0\xd0\xc9\x29\x51\xc1\x97\xce\xd7\x07\x9f\xce\xd8\x07\xd0\x30\xf0\xd5\x1f\xf5\x37\x1f\x0e\xe0\x25\x9e\xb0\xe6\x38\x23\x21\x53\xc3\x29\x45\xd4\x3c\x58\xa8\xbd\x3d\x3b\xc0\x90\xe1\x19\x0b\xec\xae\x15\xd0\x22\x79\x5b\x3f\x3e\x30\x2c\x40\x8b\x20\x2e\x8a\x64\xff\xe0\xb0\xfe\xe1\xcd\x79\x91\x1c\x9d\x35\xce\x0e\xce\x8b\xe4\xf0\xe4\x74\xef\x60\x1f\x85\x80\x36\xc6\xa6\xd5\x2a\x82\x63\x10\xe4\x25\x5e\x97\x86\xc7\xa8\xab\x1a\xcb\xbb\xed\xb6\xc5\x01\x1e\xec\x1e\x91\xf0\x4f\x9e\x10\xf6\x85\x91\x1a\xe4\xaa\x94\x10\xf0\x74\xc1\xbe\x5d\xe2\xd1\x55\x30\xb2\xe1\x80\x58\x07\x44\xf0\x86\x84\xd1\xb2\x16\xb3\xf6\xc5\x71\x53\x44\x72\xe9\x48\xef\x37\x37\x20\x03\x70\xdb\x22\x22\x23\x07\x88\x23\x11\x07\x89\xe3\x32\x2b\xd0\xb8\x21\x32\x75\x43\xdf\x9e\x15\xd0\x9d\x20\xf0\x79\xfd\x25\xd9\x01\xca\x93\x65\x92\x93\x13\x35\x27\xbe\xef\x1f\x1c\x36\x24\x2f\xf1\x61\x65\x1b\x0d\x7c\x27\x4a\xe1\x53\x63\xf7\x03\x03\x86\x66\xdc\x4b\x32\x08\x5e\xe8\x91\x1d\xc2\x18\x46\xad\x76\xe2\xeb\xaf\xae\x05\xdb\xed\x1d\x3e\x44\x82\xcb\x41\x4d\xc3\x57\x1a\xef\xc3\x5b\x81\xc3\x93\x27\xbc\x00\x7f\x71\x29\x61\x2a\xab\x7d\x01\xfe\xf6\x56\x31\x52\x9e\x97\x97\x2c\xf6\x2b\x27\xa0\xd6\xbf\x17\xe4\x91\xd6\xef\x17\x0a\x64\x4d\x83\x93\xe3\xf5\x60\xef\x2a\x97\x1e\x09\xd5\x72\xc7\x6f\x45\xe7\x80\xbc\x6c\xef\x5b\x67\xfb\x7c\xb6\xf5\x05\xd4\x4b\xa2\xe5\xdb\x5b\x89\x6a\x4d\xfc\x12\x80\x70\xab\x16\x40\xf0\xff\x22\x89\xad\xb6\xdb\x68\x8c\x73\x68\xdf\x10\xac\xc7\x97\x4b\xd5\xbe\xe0\xef\x58\x55\x3c\x4a\xd6\x8d\x22\x55\x25\xdc\xf3\x32\x3e\x62\x03\x97\x2f\x88\x88\x65\x0c\x74\x1c\xd0\xa3\x1d\xa9\x1e\x2a\x53\xde\x27\x4f\xe2\x4d\x82\x6a\xa0\x26\x1c\x13\x82\x14\x4f\xd8\x94\x1c\x0f\x3d\xde\x13\x25\x0f\x79\x71\x53\xe0\xc7\xf1\x28\x32\x6e\x2e\x12\xae\x6f\xc9\x26\x3a\xf6\x0d\x1c\xb4\x04\x5e\x1f\xcf\x51\xa8\xdb\xb5\x5d\x1a\x68\xd7\xb0\x8f\xc4\xfa\xfa\xe4\x09\x79\xd4\xb3\x82\x24\xd8\x82\x0b\x0b\x05\x58\x15\xb3\x8a\x14\x35\x31\xab\xc7\x1c\x58\x92\xf8\x00\x23\xfc\xeb\xbb\xb8\xfd\x52\x12\xfd\xae\xe4\xf2\x1b\xe3\x3f\xb6\xc8\x2a\x39\x3c\xe4\xe3\xa9\xf1\xe3\x93\x27\x92\x5b\xd4\x4f\xac\xf6\x48\xce\x4c\x41\x64\x63\x66\xe2\xb5\x02\x7b\xad\x4d\x92\x0c\x81\x24\x60\x03\x33\x84\xd0\x19\x2e\x3e\xb0\x27\xfb\xa8\x44\x08\xdc\x39\xaa\x8a\x9a\xb7\xb7\x52\xf0\x3f\x79\x42\xf2\x28\xa5\x6f\x6f\x75\xa4\x6e\x6f\xc9\xa3\xc8\xdc\x97\x77\x33\x40\x66\xf8\xa8\x93\x56\xa0\x5e\xd0\x10\x79\xe7\x0c\xbb\x30\xc6\x8e\xdd\xf4\x2d\x48\xab\x2d\x55\x8e\x0b\x36\xfb\xd8\x46\x4f\x54\xdc\x36\xbe\x9e\xd7\x5f\xb2\x8f\x6a\xc0\xb6\x15\xc5\x41\x4e\x70\x64\xf8\x3c\xe4\x96\x4f\x44\x18\xfb\x06\x35\x32\x59\x54\xf0\x21\x11\x11\x2a\xd8\x62\x52\xe3\x4b\x63\x5a\x15\xb6\x0c\xc9\x0a\x5c\x4e\xd4\xa4\xac\x42\x96\x52\x53\x52\x50\x19\xcc\x0f\x78\x9e\x11\x8e\xb0\x69\x6f\xf0\x48\x7c\xc5\x05\xb2\x20\x35\x41\x41\x67\x90\x32\xbc\x2a\xec\x90\x05\xff\x62\xfc\x3b\xae\x5f\xe6\xf9\xbf\xa5\x77\x64\x59\xbc\x2b\x1d\x92\xa7\x89\x63\x5c\x10\x2b\xbb\xc0\x48\x0c\x1c\xe7\x32\xfe\x3a\x79\x13\x3e\xf5\xa1\x5f\x4c\x59\xe1\x77\x68\x51\x80\xd3\x9c\xd0\xa5\xab\xe6\xfa\x86\x38\x45\x2d\x8c\xb7\xb9\x39\xcd\xc9\x59\xf6\x29\xcb\xf1\xc1\x79\x3d\xe3\xc0\x28\x9f\xeb\xd3\xd0\x12\x6a\xe8\x34\xb7\x21\x53\x2a\xee\x01\x0d\xf7\x69\xd0\x4a\xeb\x6d\xb5\x50\xea\xf0\x36\xdb\xb0\x81\xe4\xed\x1f\xdc\x84\xd4\x05\x4b\x7d\x75\x70\x60\xbc\x35\x72\xee\x98\xa7\xae\x30\x6c\x77\x08\xe9\xf0\xf4\xe0\xe0\xf3\x01\xd3\xa8\x13\xb1\xac\x14\xf2\x29\x50\xf4\xc6\x54\x8e\x1d\x7a\x4d\xdd\x90\x7f\xf0\xdc\x20\xff\x1d\x22\x71\xde\xa9\xbe\x1e\xd3\xd0\x4a\x3c\x6e\xe4\x74\x80\xfb\x19\x36\x16\x45\xb5\x2d\xe4\x6a\x68\x8d\xe4\x4e\x72\x64\x99\x2c\x2f\xdb\xed\x22\x93\x49\xfc\x5a\xe1\x68\x1f\xbe\x8f\x6a\xe4\xfb\x9d\xb1\xb1\x1e\x51\xeb\x8a\xb4\x3c\xc7\xc1\x14\x0d\x01\x39\xda\x67\xf3\x1a\xbc\x4e\x44\xff\x3b\x56\x10\xbe\xa6\xe3\xd8\x15\x11\x3a\x25\x20\x6a\xab\xab\x4a\xcd\x15\xd7\x17\x60\xa8\x32\xf0\x69\xc7\xbe\xc9\xbc\x49\xe2\x17\x2e\x78\x76\x9c\x0b\xe0\x30\x07\x4f\xe6\x49\x4d\x5e\xf7\x88\xaf\xf2\xdc\x3e\x77\x06\x01\xa6\xdf\xe5\x0a\x70\x76\x2c\xef\x70\xd8\xc2\x29\x08\x24\x85\xf8\xea\x2a\x69\xc1\xc1\x73\x40\x43\x36\xd5\x2d\xb0\xa8\x0e\x3d\x32\x74\xd1\x36\x87\x74\x7c\xef\x1b\x75\x39\xbd\x94\x4e\x6f\x0c\xa1\x8e\x74\xee\x90\xc7\xa9\x5e\x5d\x05\x07\x23\x97\xb6\x68\x10\x58\xfe\x18\x8c\xe6\xda\x6d\xd9\x8a\x82\x25\xe8\x25\x20\x1c\x28\x08\x50\xc1\x0e\x02\xdb\xed\x9a\x15\x39\x3b\xe4\xf9\xe1\xb8\x22\xb3\x3e\xb0\x77\xea\xd0\xfc\x82\x75\xfb\xb2\x64\xcb\xc1\xeb\xd2\xf0\x23\x1b\xe3\xac\xc1\xfb\x91\x74\x53\xab\xff\xdc\x84\x93\xaa\xfd\x9c\xa4\xeb\x59\x41\x2f\x9d\xf1\xa3\xa4\x1c\x01\x29\x45\x43\x82\x04\x9e\x4b\x3a\x3e\xa5\xdf\xe8\x4a\xc7\xea\xdb\xce\x58\xae\xcc\x4c\x4b\xb1\xdd\x2e\xd0\xde\x73\x0f\xa1\x4c\xea\x75\x09\x97\x2c\x4f\x9e\x00\xe0\xd2\xdb\x83\x83\x7d\xf6\x10\x25\x9e\x54\x08\xb5\xf1\x89\xf4\xce\xbc\x35\xe1\x2a\x3b\x93\x22\xf1\x33\xcc\x25\xc2\xb6\x97\x35\x94\x20\x4b\x84\xb0\x56\xb5\x74\x97\x7c\xb6\xd7\xc4\x0f\xf6\x8e\x33\x51\x4d\xfc\x00\x6f\x79\xde\xb9\x9a\xfc\x95\xb4\x74\x6e\x2e\x7e\xa9\x31\xdd\xd9\x7e\x0b\xcf\xed\x13\x8f\x53\xd6\x78\x99\x69\xcf\xaf\x46\x57\x6c\x00\x52\x8b\x89\xb3\x1c\xd3\x89\x37\x7b\x75\xca\x38\xc5\x60\x3a\xb3\x3a\x98\xfc\x15\x0f\xb3\xc9\x0e\xf4\xa8\xc4\x9f\x6e\x6f\x49\x5e\x7f\xde\x91\x7d\x79\xc1\x24\x7a\x8d\x13\x49\x2b\x0e\x17\x0a\xc8\x65\xac\x81\x52\xab\x67\xf9\xf5\x30\x5f\x2e\x90\x47\x3b\x24\xd7\xc0\xeb\xeb\xbc\x50\xf3\x79\xab\x85\x88\x4b\xef\x38\xcf\x3f\x14\xc1\x1e\x58\x5b\x6f\x90\x44\xa5\x0e\xc7\x3e\xe5\xf6\x62\x73\xb1\x9b\x9d\xc8\x11\xe4\x52\xb2\xf3\xb4\x04\xf3\x58\x9d\xbb\x3f\x2e\x72\x82\x02\xb2\x4c\xe6\xc0\x02\x2b\x14\xa7\xbd\x57\xf5\xb7\x6f\x0f\xde\x90\x1d\x7d\xcb\x8c\x4e\xc8\x26\xf0\x6a\x5a\xe2\xc3\x42\x72\xf9\x35\x56\xde\x76\x43\xea\x7b\x03\x7e\xa7\xba\xcf\x03\x3e\x47\x21\x4b\x08\x46\x80\xb5\x94\x28\x02\x91\x92\xd5\x8c\x66\x64\xa1\xc2\xb6\xe9\xad\x9b\x54\xda\x6b\x7e\xd5\x76\x5a\x5e\xf3\x2b\x63\x0b\xaf\xf9\xb5\xa4\x48\x49\x5e\xc0\xfb\x1a\xf9\x2e\xdc\x20\x6a\xf0\xe2\x0e\xdd\x43\x57\xc9\x99\x25\x8c\xbe\xc9\x30\xa0\x6d\xd2\x1c\x13\xf0\x0b\x5c\xf9\x1a\xa0\x89\x80\xa2\x76\x9c\xfe\xb9\x46\xe3\xfc\xd5\xc1\xf1\xd1\xdb\x97\x70\x05\x87\xb7\xe6\x3d\xda\xa7\x6f\xec\x20\xa4\x2e\x44\x29\x66\x23\xc9\xad\xbe\xa1\x63\x35\x92\x2f\x17\x63\x94\x17\xae\x21\x05\x08\x4e\xc7\x5b\x28\xea\x44\x13\x25\x78\xb0\x1a\xd8\xd8\x70\xb7\x6a\xcd\x6a\x80\xbf\xc9\xf3\x16\x8d\x13\x3e\xfe\xee\x82\x43\xbf\xcc\x74\xa9\xd4\x7d\x46\xa3\x15\x4b\x68\x33\x17\xd2\x3c\xee\x43\xc0\x4d\x65\xd8\x0c\x5a\xbe\xdd\xd4\x5d\x37\xe5\x3b\x81\x4e\x91\xb4\x9a\x0f\x84\x92\xd6\x56\x53\x61\x35\x74\x93\xf0\xd2\xde\x2a\xcc\xf8\x2b\x08\x5c\x7e\x64\x1c\x8d\xa6\x23\x19\xc3\x42\x87\x1c\x01\xa8\x9f\x61\x30\x61\x23\xb8\x49\x9d\x22\x18\x9c\x13\xbb\x73\xdb\x9c\xe6\x2e\xf5\xc7\x4b\xa3\x8b\x1c\xef\x40\x0e\x8c\x2e\xbd\x3d\xf0\x3e\xc2\x78\xe2\xec\xe1\x0f\x98\x5a\x29\x4b\xdb\x33\x25\x1d\x54\xe1\x2c\xf1\xa0\x4a\xdd\xbf\x7c\x90\x1d\x31\x24\x04\xda\x30\x1e\xb9\x6d\xea\x86\xd2\xfc\x0c\xfc\x26\x7a\x61\x38\xa8\xad\xae\x7e\x0d\x06\xd4\xef\x94\x5a\x5e\x7f\x15\x4d\x90\xbe\x7a\xb6\xbb\x72\x1d\xac\x74\x3c\xdf\x74\xa9\xb0\x01\xc8\x59\xe8\xe7\x83\xd0\x2f\xf2\x47\xb5\x76\xfa\x34\x40\x3e\xc8\x81\x66\xad\xc2\x87\xf0\x9b\xbd\xf2\x36\xff\xf9\x1f\x5e\x95\x3f\x43\x10\x11\x3e\x37\x00\xc2\xf2\x0e\xc9\x11\x02\x40\xee\x78\xdf\xc5\x17\x86\xbf\xee\xbd\xb3\x87\xf6\x5b\x01\xb1\xc8\x29\xa3\x46\xe8\x91\xbd\xb3\x33\xad\x97\xab\x1a\x95\x81\xf8\xf9\x80\x3a\x54\x44\xc8\x18\x3b\xda\xda\x8f\x31\xff\x03\x3d\x79\x2b\xbf\x09\x24\xbf\x91\x2a\x23\xbd\x4a\xea\x5a\xbd\x84\x73\x36\xb9\x7e\x91\x17\xe6\xc7\x1a\x78\x19\x25\x11\x46\x28\xfc\xbc\x71\xa3\x7f\xb2\x46\x83\xe3\xf2\x2b\x12\x4a\x26\x24\x08\x4a\xf8\x42\x1c\x0a\xc9\xcf\xb1\x0a\x11\xe4\xca\xa4\x16\x2d\x23\xed\x07\xb9\x21\x1a\xeb\x38\x20\x55\x92\x6f\x30\x2c\x2d\x16\x5f\x5e\x06\xec\x56\x57\x49\x7d\x30\x70\xc6\x5a\xb5\x8e\xed\x07\xe0\xf0\xc1\xfa\x25\x5f\x6b\x7b\x18\x38\xe8\x24\xc1\xd8\x0d\xad\x1b\xf2\x5d\x96\xa8\x91\x8b\xef\x6c\x79\xa8\xe1\xd4\xbc\xbb\xbc\x93\x12\x0b\x6a\x94\xec\x00\xfe\xd5\x60\x2a\xc9\x95\xc5\x5d\xb2\xbc\x0a\x54\x63\xf2\x99\xb0\xa6\x96\x36\x78\x3b\xaa\xce\x05\x94\xbd\x54\xe6\xcd\xb2\x25\x86\x2b\xd3\xd6\x44\x51\xd3\x7c\x9c\x95\xb8\xe6\xb2\x42\x94\xb8\x60\x55\x2e\x75\x57\x08\xd6\x39\x2c\xf5\x48\x86\xda\x30\x42\x53\x6b\x53\xe0\xff\x73\x21\x36\xb7\x9c\x74\xd0\xfe\x32\xc9\xd5\xc0\xe4\x1e\x16\x61\x4d\xe8\x68\x72\xac\x90\xe7\x91\xa2\x97\x49\x6e\x3b\x27\x27\xaa\x8e\xc7\x5d\x86\xf5\x36\x9a\xc2\xe3\x06\x37\x61\xd0\x8c\x31\xc3\xf2\x91\xb4\x18\x92\x62\x8d\x28\xc9\x82\x38\xcd\x1a\x51\xa2\x05\x17\x8d\x44\xb2\x35\xe6\xa5\x5b\x63\x06\xc2\x35\xe6\xa4\x1c\x2c\xee\x66\xbf\xab\x90\xe8\x59\x89\x18\xbd\xbb\x55\x31\xd7\xb0\xaf\xd5\x4b\x75\x8c\x2b\x0a\x08\xa3\xfb\x27\x4f\x04\x38\xf0\x37\x93\x54\xca\xe9\xaa\x46\x76\xdf\xab\x33\x75\xbe\x9a\xdc\x7b\xd9\x4b\x36\xa1\x1d\xc7\x1b\x11\xda\x1f\x84\x63\xec\x06\x9a\xa8\xdb\x01\xdc\x76\x16\xa5\xa3\xc4\x40\x86\x26\x42\x87\xc8\x26\x65\xdb\x78\xda\x26\xed\xb1\x6b\xf5\x6d\xb6\x59\x1f\x0b\xc1\xf1\x88\xf7\x82\x6d\x8c\x84\xb0\xb3\x58\x3b\x07\xac\x99\x24\x41\x89\xe8\xad\xac\xe0\x06\x9c\x8b\x58\x6d\x8d\xe2\x72\x1e\xee\x34\xbf\xb3\xce\xcb\x45\x84\x91\x49\xad\x5f\x3a\xbd\x72\x77\x7a\xbf\xd5\xce\x5e\x34\x7b\x17\xd3\x6a\xa6\xb6\xa3\x4a\xdd\x83\xf2\xd2\xac\xd0\x2f\x76\x27\xff\x88\x17\xe4\xea\xc6\x3b\xcf\x19\x77\x6c\x64\xf8\x5f\x7e\xe1\xdf\xda\x74\xe0\xd3\x16\x1a\x48\x48\x30\x05\x58\x73\x64\x99\x81\x15\xf6\x58\x33\x17\x97\xec\xe5\xea\x2a\x91\xef\x7d\x5c\x33\xd4\xfa\xd0\x94\x3e\xd6\x4b\xbf\xe8\x28\x80\xcb\xa7\x4f\xdd\x02\x89\xbc\x90\x60\x93\xb5\x30\xd1\xfd\xc7\x8e\x67\xb5\x69\x1b\x14\xb0\x5f\x7e\xf9\x45\x0f\xc1\x83\xb1\xfa\x7e\xf9\xe5\x97\x2e\x0d\x6b\x46\x1f\xd8\xcb\x5f\xc4\xb5\x00\x36\xeb\xb0\xa6\x7e\xb9\x5b\xfa\xe5\x17\xa6\xb8\x4d\x6c\xd5\x5e\xbc\x45\x3b\xd2\x62\xf2\x98\x40\x52\xf8\x25\x56\xcc\xa8\x9d\xbc\x19\xbf\x5f\xcf\x94\x29\xfc\xcf\xf1\x50\x02\x6a\x3f\x90\xb2\x8c\x67\xc3\x23\xdb\x6d\x7b\x23\x74\x67\x94\x3c\x95\x23\x2f\xc4\xd1\x51\x8d\x97\xc8\x44\x7b\x1a\x87\x9f\xf5\x4a\x82\xc7\xcf\xe6\xbd\x9a\xf2\x2d\x4e\x29\xdc\x0d\x9c\xf5\x28\x0d\x83\x53\xda\xb5\x83\xd0\x4f\x3b\x9c\xaa\x6e\x3c\x4f\xa9\x90\xb5\x85\x30\x4b\xfe\xd8\x6d\x84\x70\xbb\xb5\xc4\xd8\x06\x80\x0c\xf1\x39\x36\x25\x74\xa1\xdb\xf7\xfa\x18\x5b\x8a\xfa\x28\xf8\xad\x76\x5b\x14\x0d\x3d\x74\x0f\x7e\x4a\x4e\x5c\xee\x3d\xe3\x5f\x53\x9f\x78\x2e\x38\xca\x0f\x9d\x36\x61\x43\x62\xb9\xc4\x1b\xb9\x24\x42\x47\x19\x53\xce\x72\xdb\x00\x94\xbb\x4b\xe9\xb0\xd5\xf2\x33\xf6\x86\xd2\x05\xbe\x6f\x5d\x51\x12\x0c\x7d\xd8\x22\xe0\x89\x36\xb1\xc0\x48\x46\xe0\x4e\x70\xbf\x83\xc9\x51\xd9\x20\xd1\x20\x64\xeb\x9a\xe7\x83\xc3\x96\x07\xc7\xe5\x0e\xb5\xae\x44\x6b\x56\xcb\xf7\x82\x40\x14\x0d\x70\xb7\x91\x38\x51\x58\x33\xd1\x11\xd6\x4a\xe4\xe3\xd1\x2a\x36\xef\xdd\x7a\x10\x2f\x76\x4e\x9a\x8c\xdc\x3c\x26\x62\xe2\x1c\x7b\x0e\x47\x63\x19\x07\xa6\x1d\x17\x44\x26\xe7\xa6\x5d\xcf\x73\xa8\xe5\xe6\x3b\x2e\x63\xaa\x8e\x7b\x11\x6d\xe7\x32\xe5\x6c\x72\x9a\x4b\xdd\x1f\x3e\x6d\xed\xe0\xc8\xdd\xf5\xbd\x51\x80\xf9\xb9\x92\xce\x9f\xe1\x38\x3b\x56\x3a\x6b\xc2\x6a\xc5\x7e\xd0\x6c\x65\xd8\x7d\x0d\x70\xc3\xa9\xd2\x01\xcb\xbf\xa7\xe4\x00\x2d\x44\xbf\x5a\xd7\x16\x1e\xf1\x70\x35\x8e\x4d\xab\x56\x10\xf0\xa7\x6b\xea\xb6\x3d\x9f\xdf\x21\x42\xa0\x86\x08\x98\x5d\x2b\xa0\xe0\x41\xf2\x38\xf4\x2d\x37\xe8\x78\x7e\xff\x31\x09\x86\x03\x00\x1e\xd2\x20\x8c\x55\x59\x45\xe4\x5a\x41\x20\xb6\xc3\xab\xab\xe4\xa3\x9c\xf9\x6c\x8a\xb5\x3d\x62\xb9\xe3\xb0\x67\xbb\x5d\xa6\x18\x72\xd2\xb7\xb9\x9c\x08\xec\x36\x2d\x41\x58\x12\x83\xfc\xba\x1e\x2b\x6e\x44\x4f\x60\xe2\x62\x54\xe4\xa0\xc4\x5a\x11\xc2\x00\x3c\x51\xc9\x47\xda\xbc\xb2\x31\xe8\x87\x63\x05\x21\x48\x20\x2e\x3a\x10\x80\x07\x61\x0d\x91\x0a\x01\x48\x25\x7e\x47\xc6\x6b\x0a\xc2\xb0\xd7\x60\x58\xa4\xf4\x5d\xbe\xb7\xfe\x1a\xec\x05\xc1\xb1\x35\x90\x16\x23\xc7\xde\xb7\x1a\xc9\xad\xf4\xbd\x6f\x2b\x3c\x5c\x1c\x3a\x0e\xb4\xed\x36\xb1\x43\x32\xf2\x3d\xb7\x4b\xac\xae\x65\xbb\xa4\x54\x42\xea\xf5\x03\xa8\x11\x88\x0a\x27\xec\xd1\x13\x4f\x88\x0a\x7b\x35\x82\x5f\x2b\x39\xdd\xb2\x0f\xc7\x71\x87\xb4\xbd\x16\x9c\x4d\x44\xd3\x24\x0d\x72\x85\x12\x94\x11\x15\xd8\xa0\x41\x1c\x89\x1d\x92\x3b\x17\x63\x8a\xa7\x16\x72\x77\xc3\xad\x47\x44\xdf\xf4\x93\x46\xf6\x69\x59\x01\x89\x6e\x80\x08\x72\xe5\x15\x1d\x4b\xeb\x48\x60\x04\x01\x0a\x8c\x4d\xc4\xa7\xa6\x4f\xad\xab\x6d\xd3\xa7\x98\x2f\x43\x7f\xe8\x8c\xc9\x0f\x7b\x00\x3f\x08\x11\x32\xf4\x41\xc1\x6d\x22\x6b\xc8\x90\x2b\x60\x90\xf6\xfd\xfb\xd7\xa0\x46\x84\x01\x7d\x2b\x90\x0f\x6c\x27\xfb\x94\xfc\xd7\x1a\xd8\x64\x30\x6c\x3a\x76\x2b\x5d\x9a\x7f\x27\x0c\xc6\xd7\x80\xd7\x67\x5d\x88\x7b\x18\x6c\x2e\x66\x63\xb2\x50\xb8\xa1\x7b\x13\x87\x3c\xdf\x4c\xda\x35\xcc\x7a\xb4\x60\xd6\xfd\x8b\x80\x25\xeb\xe0\x35\xc0\x47\x0c\xb6\xa1\x82\xd8\xa6\x35\xb6\x31\xa9\x62\x56\xe3\x69\x6d\x69\xf7\x48\x74\xd0\xa7\x7e\x37\x6d\x59\xac\x54\xd7\xe3\x65\xb3\x84\xbe\x2c\x24\xab\x4d\x08\x76\xb4\x1e\x2d\x98\x05\x9d\x17\x51\xb1\x7b\x61\x5a\x9f\x8f\x07\x5e\xd7\xb7\x06\xbd\x34\x85\x73\xa3\xbc\x99\x5a\x25\xab\xb9\x68\xd9\x08\x90\x5d\x36\x53\x65\x8a\xe1\x64\x83\xfd\xf4\x2a\x93\x1b\xd6\x0a\x47\xc0\xbc\xb3\x1c\x1a\xa6\xba\x09\x6c\x94\xb7\x92\xcb\x4f\x6e\x92\x17\x8c\x54\x3f\xb6\x6f\x6c\x37\xad\x8f\x1b\xe5\xe7\x89\xc5\x27\x37\x86\xe5\x64\xe5\xa0\x67\xb5\xbd\x51\x6a\x33\x95\x72\xb4\x64\x56\x0b\xbc\x88\xba\xa6\x60\x42\xdd\x16\x07\xdd\x89\x16\x55\xeb\x49\x85\x33\x2f\x35\x54\x31\x59\xf5\xdb\x11\x3f\x97\x4d\xee\xc3\x5a\xa4\x60\x16\x78\x2c\xa1\x3a\x3d\xb0\x5a\xe9\xf3\x68\x43\x9b\x48\xbc\x64\x26\x79\xb0\xc8\x0f\xb9\xac\x55\xa1\xa9\x70\xd4\x87\xf6\x79\x8f\xf6\x69\x7e\xca\x1b\x88\xb2\x79\x03\x51\xce\xba\x81\x28\x8b\x1b\x88\xc8\x75\xc2\x40\xce\x17\x71\xc4\xc6\xdf\x88\x0b\x05\xfe\x78\x04\x81\x16\x76\x12\x2a\x46\x9a\x04\xeb\x87\x68\x29\x01\x4c\xbe\x6f\x1a\x02\x42\x34\xad\xbd\x2d\xea\x6b\x3e\xbe\x8a\xa1\x60\x00\xc9\x44\x23\x01\xb0\xfc\xd6\x17\x53\x58\x60\x81\x2f\x44\x39\x7c\x8a\xb5\x2d\x6a\x65\x36\x6b\x42\x92\xaf\x43\x5d\x2a\x8b\x56\xd5\x4b\x51\x5e\xbd\x89\xb5\xae\x43\xc8\xc4\x20\x0e\x95\x4f\x7f\x01\x52\x34\xcf\x5f\x8b\x52\xa8\xe8\xee\xe0\xe9\x70\xda\xf2\xaa\x6e\xf8\x39\x94\x22\xb9\xc8\xf1\x11\x87\xd8\x95\x8a\xea\xec\x11\xa9\x01\x71\x28\x25\x56\x10\xa3\x12\x9b\xce\x41\xbc\x63\xe1\x20\x22\xd9\x12\x30\x30\x65\xb5\x6a\x57\x67\x4e\xe9\xba\x61\xf2\x96\x56\x5f\x5f\x62\x14\x8c\x28\x87\x15\xe4\x9d\x5b\x9f\xcf\x47\x01\x45\xe8\x34\x9a\x65\x03\x90\x0b\x23\xb0\x60\x96\x12\x27\x14\x51\x9f\x39\x6e\x35\x62\xcc\x01\xd5\xf5\x9a\x8e\x9a\xb6\xea\xc6\x7a\x57\x8c\x72\x02\xb7\x00\x47\x7a\x1a\x60\xf8\xfa\x92\xd8\xb9\xa2\x12\x7f\xe2\x7b\x51\xe7\x6e\x0e\x55\xab\x51\x23\xb1\x79\xc3\xc7\xaa\x66\xb2\xd1\xed\xad\x5a\x79\x04\x6c\xcc\xc1\xc9\x0d\x43\x84\x7a\x14\xa5\x9c\xb6\x4e\xd4\xcc\xc5\x45\xa2\x88\xcd\x22\xe2\xb5\x84\x2e\xc0\x77\x5c\x10\x6a\x72\xed\x30\x91\x00\x66\xe6\x99\x97\x53\xe3\xf6\x3d\x56\x71\xfb\x1e\x93\x17\x88\xb8\xd0\xbb\x14\xda\x82\x25\xc4\x7c\x11\xc2\x98\xcd\xc2\xea\x46\x91\xe4\x8e\xad\x90\xfa\xb6\xe5\xac\x7c\x38\xaa\xe1\x61\x16\x5f\xbb\xe1\x26\x9d\x35\x7f\x6d\xb7\xf9\x9e\xd3\x10\xfa\x62\xc3\x2b\x36\xcb\xd5\x0d\x42\x1d\x7a\x6d\xe1\xf4\x04\x77\x22\x2d\x49\xbf\x38\x5d\xe6\x95\xb7\x97\xee\xd8\xb6\xf1\x3f\xa4\x72\xd5\x14\x59\x90\x89\x77\x4d\xfd\x1e\xb5\xda\x64\xd4\xa3\x2e\xc1\xdc\xf7\xab\xa8\xd2\xda\x01\xf9\x8d\xac\x5d\x35\x4b\x09\x36\x1b\x26\x5a\x0b\x1f\xd1\x26\xc5\x64\xda\x5a\xcc\xf4\xfd\xde\x8f\x7a\x56\x57\xc9\x47\xcb\x0e\xc1\xfe\x21\xa8\xad\xae\x76\xed\xb0\x37\x6c\x82\x01\x44\x87\x87\x73\x5a\xed\x38\xde\x68\xd5\x0e\x82\x21\x0d\x56\xd7\xb6\xca\x3c\xcc\x17\xdb\xed\xb7\x59\x9f\xcc\x98\x2a\x84\x95\x66\xdb\xcb\x55\x8e\xf9\x0a\x04\x7d\x5b\xe9\xd8\x0e\x5d\x81\x64\x16\x18\x1a\x4e\x9c\x7e\x74\x7d\x30\xe7\x66\xb8\x6d\x94\x6b\x24\xf7\xaf\x8e\xc5\xfe\x03\x49\x52\x29\xe3\x9b\x0d\xf6\x1f\xbc\xa9\xe2\x1b\x0a\x7f\xf0\x66\x8d\xbf\x29\xb3\xff\xe0\xcd\x3a\xbe\x69\xb6\xd9\x7f\xf0\x66\x03\xdf\x3c\xa7\xec\x3f\x78\xf3\x0c\xdf\x6c\x6e\xb0\xff\xe0\xcd\x26\xbe\x79\x56\x61\xff\xc1\x9b\x2d\x7c\xb3\x5e\x65\xff\xc1\x9b\xe7\xf8\xa6\x5a\x61\xff\xc1\x9b\x3a\x47\xb1\xbd\xc1\xfe\xc3\x57\x1c\x47\x0b\xfe\xf0\x15\x47\x69\xad\xcc\xfe\xc3\x57\xf1\xf6\x5a\x9e\x1b\xfa\x56\x10\x72\x1d\x6b\xcf\x73\x3c\xbf\x46\x72\x6d\xcb\xbf\xca\xa5\x18\x19\x31\xe2\xc5\x76\xdb\x5b\x8b\xd9\xb9\xde\x3b\x8b\xa1\x49\x6c\xbf\xef\xb9\x7c\x9c\x9b\x8e\xd5\xba\x62\x9d\x2f\x97\x91\x18\xa3\x9e\xcd\x56\x8b\xdc\xbf\x3a\x9d\x0e\x46\x45\x66\xe2\x10\xef\xe6\x6a\x24\xe7\x77\x9b\x16\x13\x4a\xfc\x7f\x05\x28\xd2\x19\x3a\xce\x2e\x07\x64\x16\xa8\x60\x01\x46\xb7\xe4\x02\xe5\xd2\xd6\x26\x96\x71\xec\x6e\x2f\x4c\x2b\xb4\xb1\x8e\x85\xfa\xb6\x9b\x56\xa4\xfa\x8c\x23\x63\xd9\x6e\x2a\x9c\x4a\x55\x61\xfc\x91\xf7\x14\xca\x54\x37\x36\x8a\x44\xfd\x9f\x86\x77\x56\xb1\x08\xf6\xd9\x45\x59\x1f\x52\x78\x07\x87\x24\xce\x3d\xf7\x6b\x27\x2b\xda\xd5\xf6\x05\xd2\x13\x09\xb4\x71\x88\xd5\x99\xb2\x7d\x59\x57\xe7\x1c\xac\x58\xd6\xde\x85\x7d\xff\x21\x1b\x97\x38\x21\xd5\x6d\x80\xe5\xfb\xca\xa0\xde\x34\xdb\x61\x9f\x62\x31\x71\x21\xc6\x44\x91\xad\x8f\xac\x6b\xb2\xa0\x88\xe7\x80\x59\xa6\xd4\x0b\x91\x63\x8a\x2b\xaa\xac\xda\x85\x7d\x09\x1b\x24\xff\xc2\xbe\x4c\xb2\xac\x64\x65\xc0\x74\x4c\x37\x4b\xe1\xdf\x60\x9d\x07\xba\xaa\x45\x9e\xa1\xb9\x2d\xad\x1a\x23\x9c\xf1\xd7\xb4\x59\xc4\x33\xdb\x20\xc9\x80\xfa\x41\x8f\xec\x7e\xbc\x75\xf6\x5f\xea\x90\x70\xaa\xe8\x11\x5b\x29\xc5\xb3\x66\xb2\x59\xd2\xcc\xc8\x25\x73\xe2\xa4\xf5\xf9\x79\x4a\xf9\xac\xae\x46\x20\x47\xce\xad\xf6\x44\x9e\x9f\xc4\x83\xca\x72\x52\xe9\xcc\xc6\x34\xa0\xca\x98\x3e\x2d\x8b\x4f\x6a\xbb\x95\xc9\x75\xb3\xb0\x48\x6f\x50\xdd\xe7\xf1\xdc\x45\xa9\x28\xc4\x8b\x66\xb5\x28\xc1\x15\x92\x17\x23\x20\xcb\x19\x44\xa1\x10\x60\xc1\x72\x3f\x23\x5b\xa3\x56\x2a\x8b\x9f\xa0\xc0\x0f\xf1\x70\x50\x7c\xe7\x5a\xfd\xd4\x16\xaa\x09\x45\x33\x8f\x45\x65\x29\x75\x28\x6e\x87\xbd\x33\x21\xf5\x12\x8f\x2d\x13\x8a\x66\x1e\xa1\xcb\x52\xb2\xe2\x51\xcb\x73\x77\x87\x61\x08\x5a\x5b\xe2\x10\xac\x95\x13\x0a\x67\xb5\xa2\x4a\xc9\x8a\x30\xe5\x76\xbd\x9b\x93\x61\xe8\xd8\x2e\xdd\x75\x2c\xf7\x2a\x4d\x9c\x3d\xdb\xc8\xac\x96\xd5\x72\x52\xf9\x18\xb0\xd4\x76\x9f\xc7\x8a\x4e\xd3\x96\x41\x9c\x34\x71\xb5\x6e\x94\x9a\x44\xbc\x1f\xa2\xe0\xc0\x39\x92\xd5\xa4\xce\x3b\x67\xd8\xb5\xdd\x43\xc7\x1b\x99\x41\x6e\x81\xe9\x99\x74\x6e\xf0\xab\xd3\xd4\x39\x5a\x9a\x11\xce\xed\x6d\xca\x9c\x2c\x59\xee\x78\x7b\x26\xd4\xde\x7a\xa9\x71\x9a\xa6\xc7\x0b\x80\x4c\x83\x94\x54\x41\x62\x3a\x09\xb8\x60\x7b\x5e\x28\xdc\xa2\x79\xe6\xa4\x1a\xc9\xd9\x2e\x63\xc5\x95\x8e\x43\x6f\xf8\xb1\x99\xe5\xd8\x5d\xf7\x28\xa4\x70\xc9\xdd\xa2\x6e\x28\xd3\xa8\xa9\xe3\xa1\x1a\xc9\xb9\x9e\x4b\x73\xc2\x27\x06\xa2\x00\x0b\xe0\xad\xa1\x1f\xc0\x9e\x91\x4b\x5b\x71\x1c\xe7\xc9\xba\x56\x33\xf0\x9c\x61\x48\xf9\x17\x6f\x60\xb5\xec\x50\xe4\x22\x26\x64\x64\xb7\xc3\x5e\x8d\xe4\x2a\xe5\xf2\xbf\x79\x91\x1e\x65\xbb\x0c\xf3\x5d\xe8\x0d\x64\x15\x87\x76\x42\xf9\xd0\xb7\xfc\xae\xed\xca\xc7\x81\xd5\x6e\xc3\xd9\x55\x59\xa0\x2b\xf9\xed\x3b\x3c\xf2\x1c\x1c\xe2\x91\x1f\x21\xc0\x33\x28\xa0\x33\x0c\xb8\x9e\x86\x87\x5b\x79\x3c\x25\x47\x1d\xf2\x85\xe9\x8b\x5f\x8a\x91\x84\x19\x76\x20\xda\x06\xbb\x82\xa7\xab\x3a\x32\x29\xc3\x6d\x64\x44\x4a\x2c\x21\x72\x9d\x27\x7e\xc4\x9b\x79\x9e\x5a\x5c\x62\x78\xde\xa3\xc4\x6e\x81\x3f\x86\xe0\x0d\x3c\xb4\xca\xc6\x97\xf5\x4c\xf8\xaf\xb0\x8f\xe2\x70\xad\x08\x86\x13\xdc\xbc\x18\x5c\xe0\x30\x59\xa8\xe7\x86\x6c\xbb\x68\x85\x43\x9f\xc6\x7a\xcc\x44\x4b\x4d\x18\x30\xce\x34\xbf\xcc\x28\xc4\x2f\x66\xaa\x9c\x4a\x67\xcc\x80\x3e\x03\xa8\x08\x49\x3f\x04\xb4\x33\x74\x18\x41\x51\x67\xc7\xb3\x48\x34\xe9\x19\x0c\x1c\x9b\x1f\x41\x0a\xda\x06\x1a\x3d\xd8\x52\x4b\x83\x74\x0e\xc0\xcc\xf2\x46\x6b\xff\xb5\xbb\xae\xe7\x53\x13\xc6\x5b\x9e\xb8\x2f\x83\x11\xb2\xa1\xf0\x79\xb2\x37\x81\x25\x81\xe1\x96\x32\x38\x9e\xc7\xf5\x12\x1c\x21\x26\x98\xea\xb2\x9a\x72\xf3\x36\xe1\xdb\x83\x81\x43\x09\xed\x74\x68\x2b\x9c\xdc\xd2\x29\x14\x9f\xa1\xb9\xe9\x67\xc8\xd0\x7d\x80\x39\x62\xff\xb3\x26\x47\xaa\x44\xb4\x06\x03\x6a\xf9\x01\xd8\xfb\x87\xd4\xef\xdb\xae\x15\xea\x64\xd0\x5f\x3f\xc8\xe8\x25\x34\x7c\x4f\x23\xa8\x03\xfe\x87\xc9\x3a\xb5\x33\xd7\x65\x1b\x64\xbd\x01\xcd\xe0\x0b\xa1\xa8\x5b\xe9\xe4\x18\xe0\x8e\x7e\x36\x39\xf7\x01\x72\x7d\x58\xa1\xb0\xeb\x1b\xab\xb4\x2a\xc4\xa7\x98\xb3\x19\xdc\xc7\x78\xfb\x22\x64\x19\xdc\x92\xc9\x81\x8e\xa0\x71\x4a\x3b\xa9\x48\x30\x5a\x73\x14\x92\x65\xa4\x3b\xab\x90\xdd\x93\x51\xe6\xc1\x86\x52\xb2\x21\xa4\x35\xc2\x25\xd6\x72\xbb\x42\x7c\xf0\x46\x23\x09\xc6\x20\x62\x0e\x70\x35\xfe\xe2\x09\x27\x44\x6a\x2f\xde\x82\x59\xb7\x89\x66\xc1\x77\x62\xbd\x85\xea\x5f\xf8\xc3\x17\xee\x28\xc7\x21\xa0\xc0\x96\x7d\xf4\xdc\xbd\x9e\x48\x21\x39\x89\x4a\x29\x64\x0a\xad\xa6\xb8\x22\x9c\x57\xaf\x51\x19\x32\x67\xd4\x6c\x8c\xae\x25\x30\x01\x3f\xd2\xcb\x84\x8b\x27\x91\xab\xe4\xed\x6e\x8d\xc9\x03\x3e\x46\x45\x32\x70\xa8\x15\x50\x32\x1c\xb4\xd9\xe8\xc1\x4a\xd9\xf4\x6e\x8a\x04\x0f\x11\xc0\x7a\xf7\xd4\x6a\xdb\x1e\xab\x1b\x78\x2a\xa7\x5d\xfd\xdd\x91\x34\x01\xc5\xab\x28\xb6\x74\x00\x94\x76\x69\x26\x95\xf3\x44\x5a\xa8\x7c\x57\x4b\xf6\x3c\x02\x46\xee\xa3\xe6\x94\x31\xbc\x7e\xc9\x0e\x4e\x85\x81\xf0\x22\x75\x6b\xb3\xe2\x7d\x3f\xe2\x8d\x43\x2b\x68\xa8\x14\x63\xaa\xd0\x4f\xf2\xde\x33\x79\x41\x0e\x9f\xf3\x74\xd7\x93\xa6\x21\x3f\x71\xc3\xf3\x5b\x3c\x79\x93\x91\x2c\x4c\x6b\xea\xe4\x23\x1a\x65\x7d\x01\x6e\xab\x1a\xc4\xb5\xe9\x21\x26\x40\x89\x58\x93\xa1\x08\xd0\x6c\xc9\x58\x0b\xf7\x66\x48\x26\x8d\x9a\x7c\xda\xf9\x55\x9b\xf5\xd8\x83\x4e\x49\x7b\x25\x8a\xc6\x4b\x99\x15\x23\x4d\x22\x89\x6b\xb1\x82\x49\x2d\xcb\x79\x11\x69\x5e\x9b\x2f\x11\x2c\xb4\x2f\x11\x64\x34\x58\x09\x18\xad\x45\x30\x92\xa5\x0d\xb4\x24\x3f\x09\x7c\xe4\x0b\xe5\xa7\x6f\x96\xd0\xab\x44\x9a\xcd\xb5\xb8\x58\xcf\x89\xb6\x65\xd9\xed\xa4\x45\x8f\xac\x40\x12\x44\xdf\xb5\x9c\xe4\xe5\xc6\xe7\xcb\xc3\x2e\x5b\x3a\x8c\xdc\xfd\x30\x6d\x7e\x8d\x64\xf0\x27\x78\x49\x26\x0f\xb8\xd5\x45\x99\x02\x53\x24\xb1\xba\x3c\xed\x98\x84\xae\x0a\x6b\x99\xef\x05\x5f\xae\xcb\x24\x65\x68\x66\x4a\xfb\x83\x22\x69\x60\x84\xe2\x06\x66\x93\xc2\xcf\x68\xec\x64\x5e\x6b\x28\x84\xb0\x82\x6a\xa9\x20\xeb\x29\x4f\x6c\x07\x9c\x55\xa3\xb3\x00\xf2\xfc\x07\xf2\x02\x92\x95\x2a\x14\x49\xe3\x0a\xec\x32\xca\xdb\xf8\xeb\x3f\x50\x1b\x1f\xcc\xd8\x01\xac\xf2\x45\x83\xe7\x8e\x50\x93\xa5\xa1\xbb\x2f\xdc\x2d\x49\xef\x6c\x38\x96\x6c\x60\xfa\xad\x3c\xf4\x16\x7f\x60\x00\x6e\xe8\x63\xfa\x95\x46\xb4\xbb\x79\x20\x20\xd9\xd1\xfa\x5d\x6a\x34\x20\x72\x67\xa3\x01\x91\xaa\x18\xbc\xc8\xdd\x53\xd2\x20\x16\x0a\x60\xcf\x53\x62\x4a\xf4\x18\xa1\x16\xc9\x05\x6b\xe4\xb2\xd4\xf2\xdc\x96\x15\xe6\x59\x3f\x0b\x85\x02\x1f\x1b\xf1\x6f\x09\x95\xc7\x1d\x26\x17\xf8\x1b\x9b\xdb\x17\x62\x6a\x46\x7c\xd7\x14\x27\xe9\xfa\x4b\x3b\xd8\xf3\xdc\xd0\xf7\x1c\x07\x12\xa5\xe8\x9f\x7a\x96\xdb\x76\xd0\xb8\x0f\x15\x40\x83\x59\x41\xf5\x8c\xc6\x6f\x10\xca\xe5\x0e\x6a\xa6\x25\xcc\x67\x50\xe2\xaf\xb5\x4c\x78\xe0\x60\x1e\xc7\xc0\x0c\x22\xc0\x3b\x27\x42\x03\x7d\x57\xa7\x63\xa2\x9d\x3b\x23\xeb\x9d\x01\x1d\x2b\xb3\x95\x27\x28\x09\x0d\x36\x09\xbc\x59\x02\xbb\x55\x14\x0d\x24\x25\xd5\x13\xd9\xb1\x8b\xd3\x33\x8a\x36\x93\x0a\xc6\x0d\xb9\x66\x3b\x88\xb7\x76\xc9\x93\xfb\x42\xa0\x7d\x45\xc7\x35\x92\x93\x52\xe5\xa3\xed\x38\xc7\xde\xd0\x15\x87\xac\x52\x99\x55\x6b\x51\xac\x68\x3e\x3a\x66\x03\x7e\x68\xa9\xa8\x81\x76\xa0\xf8\x97\xc4\x24\x48\x32\x31\x06\xc6\x5a\x15\x1d\xe2\x09\x23\xcc\x63\x1e\xb6\xe4\xe7\x22\x78\x75\x49\xf9\x09\x8c\xad\x95\x8f\x30\x84\xe1\xcc\x26\x99\x03\xd1\x33\x17\x88\xd8\x8a\x9a\x58\x88\x87\xfd\xd3\x83\x4b\xa4\xa7\x55\x2c\x12\x73\x54\x30\x2f\x6f\xea\x48\xe0\xe7\x18\xf5\x1b\xf2\xac\x4e\x1a\xff\x6a\xdc\x59\xe5\xe3\xa2\x91\x55\xde\x0b\x9a\x63\x56\x4c\xa2\x05\x77\x1c\x6b\x18\x03\x16\x29\x89\xc7\x8d\x5a\x29\x7c\x91\x50\x8a\x21\x19\x81\x28\x5e\x27\xb6\x2e\x16\x77\xa3\x75\x5d\x17\xc0\x3f\x71\x4a\x67\x82\x16\x6f\xcd\xb2\x76\xcb\x73\xcd\x72\x76\x0c\x9e\x3a\x5b\xd0\x4a\xc9\x77\x09\x65\x4f\x41\x2f\xd3\x4b\x9e\xd2\x8e\x59\x0e\xe2\x02\xca\x32\x6e\xac\xc7\x42\x7c\xa8\x32\xe2\x8d\x59\x4e\xec\x83\x55\x39\xf1\xc6\x2c\x27\x42\xb0\xf0\x42\xf0\x18\x69\x71\x36\x0b\x71\x04\x54\x24\x17\x39\x3e\x0e\xb9\x22\xc9\xf1\xa1\x96\x3f\xd9\x48\xc2\x83\x1a\x2a\xf6\x28\x86\x82\xfd\xb6\xf9\x3b\x45\x50\xf9\x74\x4a\x3b\xec\xb7\xcb\x81\x08\x02\x80\xc1\x39\xef\x24\xfb\x0d\x7d\xc9\xe9\xf9\x88\xb9\xad\xf7\xa1\xe7\xf7\xb9\x9c\x10\x9c\xcd\xa3\xa1\x95\xcc\xaf\x91\xc9\x20\xd0\x23\x3b\x06\x2b\x45\x24\x91\x09\xc2\x94\x42\x5a\x16\x45\x05\xcc\x0c\x9e\x10\x8d\x6e\xa3\x35\x6a\x42\x96\x8c\x9b\x16\xa2\x26\x65\xbd\x8c\xcb\xd9\x17\xc6\x2c\xae\x11\xb5\xd2\xab\xf5\xd4\x80\x25\x86\x50\x5a\xdd\xab\xab\x7d\xc5\x08\x7c\xcc\x4b\xbe\xe7\xb1\x65\x8e\x3f\xc9\xcd\x8c\x31\xd1\x99\x6e\xa3\xc4\x13\xd7\x2f\xb2\x63\x0d\xea\xe2\x4c\x42\x17\x82\x47\xae\xaa\x73\x41\x91\x12\x41\x12\xbf\x50\xd4\xc5\x67\xa1\x10\x61\x0c\x1b\xe5\x8f\xa0\xf1\x0b\x43\x2e\xd5\xa4\x2c\x89\x30\x8a\x88\xaf\x2c\xf6\x44\x22\xc4\x72\x84\x65\xe4\xc6\x25\x63\xb7\x68\xca\x73\xb8\x5c\x37\xed\xe6\xa5\x78\x61\x5a\x57\x4c\xd0\x69\x2f\x92\xd5\x1c\xa5\xc8\x4e\x87\x84\x6e\x22\x91\x84\x48\xa6\x97\x85\xf8\x93\x1a\x45\x8d\xe4\x82\x81\xe5\xe6\x52\x56\x8a\x1a\x49\x59\x1d\xd4\x6d\x4f\xb2\x8c\x57\x67\x85\x71\xb2\xf8\x9e\x63\xa4\x94\x8a\x7c\xf4\xf0\x30\x57\xad\xb9\xf8\x26\xef\x7a\x6d\x1a\x9d\xc1\x62\x85\xd5\xd4\x62\xaf\x4d\xb7\x8d\x32\x77\xfa\x1c\x16\x8e\x0c\xc5\x08\x1b\xe8\xcf\xd9\x43\x81\x72\x32\x57\x9c\x8e\xd0\x98\x10\x3a\xb6\x73\xc5\x3f\x3c\x77\x8e\x2f\x44\x52\x09\x9a\x2c\x4f\x52\xa8\xa8\x4e\x7b\x93\x37\x01\xd9\xc3\x4d\xf9\x0a\x3a\xef\x90\x67\x2c\x87\x3c\xc2\x99\x39\x24\xda\xc2\x1e\x8b\x3f\x66\x70\xc2\x24\x2e\x90\x1b\xa6\x18\x13\x88\x4c\x67\xb8\xc4\xc5\x01\x28\x2d\x02\x5b\x88\xd6\xbe\x4b\x67\xa9\x42\x41\x3e\x15\xb6\x4d\xed\x52\x2c\x90\x7c\x8e\xab\xdd\x00\x58\xc6\xe6\xa3\x8c\x16\xd9\xf7\x6b\x5b\x51\x5e\x42\x37\x4d\x88\x5c\xba\xa7\x1d\xd6\x44\x2e\x4b\x65\x44\x6c\x71\x1f\xa9\x1d\x0a\x89\x10\x07\x5a\xbb\x7a\x84\x5a\xd9\xae\xb9\x56\xd6\x32\xa2\xd1\x22\x44\xcd\xd7\x06\x3d\x82\x94\x25\x99\x9a\x36\x68\xe7\x52\x24\xdf\xf9\xac\xc8\x1d\x0f\x6d\x85\x48\x8e\xdc\x19\x9b\xec\x84\x90\x61\x5b\xd3\x84\x0c\xfb\xeb\x86\x06\x10\xf6\x3e\x76\xf0\xd1\x6e\x87\xbd\x7d\x6f\xe4\x6a\x56\x40\xfc\xed\x87\xc1\x0f\x37\x4e\xfe\x69\x2a\xfc\xd3\x54\xf8\x1f\x61\x2a\xfc\x70\x96\xc0\xf0\x74\x70\x4d\xdd\x50\x8b\xef\x9d\x38\x13\xd7\x32\xea\x4c\x6c\xcf\x28\xad\x39\x03\x34\xbd\xa1\xdb\x4a\x0d\xd6\x50\x8d\x95\xcc\x8e\xaf\x81\x65\x94\xd5\xaf\x6f\x0d\xf6\xd1\xda\x82\xef\x4a\x12\x7d\x13\xd6\xd3\x2a\x64\xda\x0a\x9b\x45\x0d\x4b\x63\xe1\x33\x9c\x38\xdf\xaa\xf1\xa2\x93\x6c\x92\xa1\xd0\x9c\x01\x36\xfe\x4a\x86\xb2\xaf\xec\x6e\x8f\xfa\x10\x83\x49\x6a\x0b\xa9\x93\xe5\xd9\xd4\xf6\xa9\x89\x60\xb3\xed\x55\xc9\xea\x2a\x81\x84\x23\x98\x77\xdf\xf1\x46\x24\xb0\x5c\x3b\x1c\xf3\x38\x50\xf9\xfd\x13\xf2\xf6\xe4\x9c\xec\x1f\xbc\x39\x38\x3f\x28\x48\xbf\x50\x56\xb2\xe4\xf9\xdd\xd5\xd0\x1f\xaf\xfe\xab\xfc\xfb\xa7\x8f\xa3\xfd\xee\xf3\xee\x79\xf7\x4d\x77\xb7\xfe\xfb\xfb\xd7\x9f\x0e\x8e\xf7\x5f\x6e\xed\xf6\x3f\x1c\x7d\xed\xb6\x6c\xe7\xfd\xda\xe8\xe5\x7a\xdd\xfb\x70\xf6\xf1\xe4\x65\xfd\xfc\xdb\xde\x79\xf7\xe5\xd6\xfa\x6e\xef\x7f\x67\xf5\x93\xf1\xd9\x46\x77\xf7\xc3\xcb\xf3\xfa\x9b\x8d\x9b\x60\x58\xbf\xfa\xdf\xfb\xd1\x78\xe3\xe4\xfd\xab\xc1\x46\xab\xfe\xe6\xec\xcf\xca\xb3\xaf\x9f\x87\x7f\x8c\xda\xad\x96\xe7\x77\x77\xd7\x3e\xed\xd7\xeb\x1f\x57\x3e\x94\x7b\xbb\xc7\xf5\x83\xee\xab\xab\xea\xc6\xef\xf5\xfa\xf3\x3f\x3f\xd6\x5f\x6f\xb4\x8e\x47\x7b\x87\xe3\x63\xf7\xdb\x59\x35\xa8\xbf\xea\xd6\x0f\x5f\xed\xd7\xeb\x9f\x47\xf5\xe1\x61\xff\xa0\xfe\xae\x5b\x7f\xdd\x72\x2a\xd5\x73\xe7\x39\x7d\x79\x68\x9f\xb4\xea\xe3\xe5\xf7\x1f\x3e\x77\x2b\x5f\x8f\xfd\xdf\x0f\xed\xcd\xfa\xde\x71\xfd\xf5\xf8\xfd\xf1\xc9\xe1\x41\xfd\xf8\x6b\x6f\x64\xef\x7d\x5d\xef\xee\x0e\xc6\xf5\x83\x41\xf0\xfc\xf7\x8d\x2d\xef\x7c\xef\x68\xfc\xce\xfe\x78\x72\x5a\x2e\xd7\x77\x83\x0f\x67\xc7\xf6\x7a\xfd\xd5\x87\xba\x5d\x79\xbd\x7e\x78\xd3\xa3\xf5\xdd\xe3\x8d\x8d\x97\x57\xf5\x93\xde\xb7\xe1\xf9\xeb\x57\x1f\xc7\xef\xac\x8f\x1f\xed\xbd\xf1\xf0\xe0\x4f\x6b\xe8\x9d\xdd\x54\x5e\x1f\x0d\xf7\xad\xf7\xde\xe9\xeb\x67\xaf\x2a\x6f\xba\xf6\xcb\x57\x2d\xef\x5d\x75\x6f\xf7\xdb\x78\xeb\xe5\xa7\xe1\xb7\xdd\xcf\xfd\xfa\xd5\x1f\xd5\x4f\x2f\x5f\x7a\xbd\xd7\x95\x6e\xfd\xfa\x78\x74\xf4\xc7\xfe\xd1\xd7\xfa\x87\x93\xb0\x7d\xbd\x77\xf5\xfa\xf7\x8d\x77\x07\xaf\x5f\x3b\xbd\xfa\xf9\x33\xdb\xb9\xbe\xea\x75\xae\xb7\x0e\xaf\xc2\x37\xc3\xd3\x5e\xdd\x73\x0e\x07\x2f\x3f\x8c\x2b\xef\x3c\xe7\xf8\xd3\xb7\xe3\xd0\x7f\x55\xaf\xbf\xfe\xf3\xf4\xb0\x5e\x6f\x8d\xdf\x6f\xec\xf5\x8f\xbf\xf5\xeb\x07\x87\x7f\x04\x1b\x95\xe0\x79\x18\xbc\xff\xf4\x2e\x58\xbe\x6a\xdb\x83\xf6\x38\xfc\xc3\xba\xde\x7d\x69\x8f\x3e\xbc\x39\x18\x9e\xac\xbf\xdf\xfd\xe3\x7f\xfd\xd6\xeb\xaf\x7f\x3e\x7f\x6f\x79\xef\xda\xfd\x57\x67\xe5\x37\xeb\xe5\xff\xed\x9e\x7c\xe8\xbe\xbd\xda\x5f\xbe\xae\x1f\x74\xd6\x4f\x3e\xb7\x0f\xfa\xaf\x87\xbd\xf7\xfb\xef\x8e\xfb\xbb\x61\xe7\x5d\x6f\x7d\x7f\xf4\xaa\xf9\xfe\xe8\x55\x7d\xf4\xfa\xf5\xfa\x71\x7d\xa5\x5e\xdf\x6f\xbe\xbc\xa9\x7c\xaa\xbf\xad\xac\x1f\x8e\xba\x9b\xee\xc6\xe0\x6b\x37\xf8\x54\x0f\xdc\xf7\xee\x67\xe7\xa0\xfc\xbe\x7e\xb4\x39\xfc\xb4\x7b\x70\xf2\xa9\xff\xbf\xe6\xd5\xa7\x37\xd5\x9b\xea\xeb\xeb\xde\xe8\x70\xf7\xa8\xbb\x77\xec\x75\xff\x3c\x3b\xaa\x9f\xbf\xf9\xba\x7e\x7d\xf6\xc7\xf1\x78\xf7\x99\xf3\xf1\xe3\xe6\xf9\x51\xf0\xb6\xff\x69\xfd\xdd\xe7\x57\x7b\xeb\x6b\x6f\xde\xf7\x5e\xd5\xeb\x07\xbf\x9f\xd5\xf7\x3f\x5e\xed\x7e\x7d\xe3\x1d\x7d\xbb\xb2\x97\xf7\xbb\xf5\xdd\xad\xbd\xdf\x0f\xde\xef\x5f\x3f\x5f\xe9\xbe\xdf\x0d\xbf\x8e\x4e\x7f\xbf\x1e\xbf\x59\xe9\xb9\xbf\xbf\xfd\x7c\x72\xfa\xec\x68\xf4\x27\x7d\x77\xbe\x57\xf6\xdc\xdd\xff\xb5\x6e\xce\xce\x5f\x9e\x1f\xd7\x3f\xfc\x7e\xfc\x69\xa3\x5f\xaf\xaf\xbc\x39\x38\x7b\xe6\xbd\x1e\x1e\xec\xfb\x83\xf2\xc9\xd7\x97\xaf\x97\xbd\x97\x6f\xec\xa1\xb5\xb1\xf5\x7b\xb9\xfd\xfb\xc9\xeb\xf5\x72\x9d\x1e\xae\x1f\xd7\x97\x5f\xad\x6f\xbe\xfe\x1a\xd4\xfd\xcd\xeb\xdf\xb7\xfa\x7b\xf4\xed\xfa\xb5\xed\x1f\x8e\x06\x5d\xef\x70\xfd\x6c\xff\xd5\xe1\x41\x70\x5a\xff\xb8\x3c\xba\xf9\xfd\xf5\xd9\x9f\xef\x0f\xdd\xd1\xf5\xd9\xc6\xf1\xb3\xdd\xd3\x72\x6b\xd4\x3a\xec\xbf\xdc\x3d\x3b\x7c\x7f\xd6\x6b\xed\x76\xfd\x60\xf3\xd9\x69\xfd\xea\xf8\x70\xb4\x5f\xb6\xce\x5b\x9f\xaf\xae\x5f\x95\xcf\x8e\x3f\xdd\x04\xff\xab\x1f\xfd\xf9\xed\xf0\xec\x73\xef\xf8\xf3\xeb\xf2\xa0\x79\xd4\x6d\x79\xaf\xbb\x83\xce\xfe\x6b\xeb\x78\x6d\xa3\xf3\xf2\xec\xdb\xf8\xfa\xf8\x74\xe3\xea\x23\x1d\xbc\xf5\xba\xfe\xf2\xc9\x41\xfd\xc3\xcd\xe7\xd1\x9e\xf5\xc9\xb3\x87\xb6\x5d\x7e\xb3\xff\x72\xf0\xf5\xdb\x95\xbb\x55\x3f\x6a\x9d\xed\xad\xbb\xf4\x7c\xef\xf7\xb1\x7d\xb2\x71\xf6\x66\xfd\x88\x2e\xd7\x9f\x07\x67\xbd\xa3\xdf\xcf\xce\xac\xab\x95\xa3\xc3\x8f\x57\x07\xd6\xf2\xcd\xef\x07\xc3\xe3\xcf\x47\x1f\xdc\xf5\xeb\xfd\x0f\xcd\xd3\xc3\x5d\xef\xfd\xa7\xfa\x86\x43\xbd\xd1\xe6\xf0\xd5\xb8\xeb\xef\x85\xc7\xfd\xab\x37\xfe\xa0\x3f\x1e\xbb\xc1\xe8\x8f\xc3\x93\x8d\xf7\x57\xef\x5b\xbd\xe3\x5d\xf7\xed\x9f\xad\xbd\x67\xd7\x7f\xf6\xfc\x97\x6e\x65\xf0\xe7\xf5\xae\x35\xf8\xfd\xdd\xde\x56\x73\xd4\x79\xf3\xf9\x60\x74\x72\x36\xda\xec\xd3\xd3\xd6\xd5\xd1\xf2\x59\xeb\xf5\x87\xdd\xcf\x67\xa3\xf7\xcd\xe3\xfa\xd9\xe7\xd1\x2b\x7b\xf0\x7b\xd9\xb1\x5a\x95\xe3\xf7\xcf\x46\x1f\x3b\xf6\xc9\xf9\xab\xeb\xa3\xab\xbd\x4d\x1a\x9c\x74\x06\xa3\xfa\xcb\xff\xed\xee\xba\x95\xb3\xbd\xde\xd7\xfa\xba\x75\x3a\x18\x1c\x37\x3f\x0f\x37\xec\xcf\x47\x7b\xfd\x4e\xaf\x7f\xd2\xef\x37\x3f\xbb\xfd\xd1\x1f\x87\x57\xdd\x41\xd3\xb9\xea\x3a\xcd\xf1\xd7\x8f\x37\x6b\x95\xe0\xf3\xd6\xfe\xdb\x60\xd4\xfc\x3c\xda\xad\x7e\xdb\x6f\xfb\xe1\xf2\xef\xf5\xfa\x92\x0c\x86\xb6\x2b\x83\xf7\x8a\x94\x93\x01\x26\xbd\xb6\x3b\x24\x68\xf9\x94\xba\x68\xe3\x4e\xec\x00\xcd\xad\xd8\xea\xe8\x81\x17\xba\x15\x52\x9f\x84\x3d\x0b\x6d\xc2\xba\xf6\x35\x75\xb5\x20\x10\x32\x72\x1a\xda\x74\x21\x2c\xd0\xee\xb5\xb7\xaa\xb8\xf6\xd2\x76\x5b\xce\x30\xb0\xaf\x29\x59\x11\xb8\x41\x90\x3c\xd8\x43\xb0\xcd\xcf\x0c\xeb\x88\x5a\xfb\xd2\x97\xbe\x69\x17\x0f\x0d\xd6\x34\x2e\x0e\xfa\x5e\x26\x69\x7f\xa3\x12\x23\x88\x97\x5a\x04\x8e\xa2\x4e\x30\x65\x96\xa1\x48\x73\x3f\x69\x06\xb8\x5f\xb1\x38\x35\xe0\xc0\x0b\xa6\xdb\x6b\x5c\x8d\x80\x24\xd4\x90\x4c\xe0\xe6\xa4\xa3\x61\x5d\x20\xff\xd9\x99\x58\x5c\xef\x58\x24\x8f\xe3\x4c\x2d\xcd\xd8\x10\x77\xcf\x5d\x84\xe7\x1d\x1a\x04\xff\x67\x0c\x9f\xb9\x61\xe6\x6f\xa3\x2c\xc5\x5e\xff\x4d\x99\xca\xc0\x74\x0a\xae\xd2\x58\x63\x46\xa6\x32\x5b\x9a\xad\x21\x6e\x69\x89\x21\x8d\x2c\x87\x5f\x4f\xdb\x6e\x08\xf1\x61\x30\x36\x3a\x18\x6a\xbc\x3a\xd9\x9b\x49\xfd\x3d\xd9\x4b\x74\xcf\xa9\x07\xe4\x0b\x86\xc3\x2e\xd9\xae\x4b\x7d\xc0\xfa\x0b\x9a\xf2\x5b\xd7\x96\xed\x40\x40\x11\x4f\x0f\x8d\x5c\xc4\x9a\x23\x2a\x58\x8b\x71\x16\xde\xef\xda\x6e\x97\x58\x2e\x8f\xc4\x2f\x8e\xca\x99\x46\xdc\x1e\xc2\x37\x06\x04\xd2\x73\x90\xbe\x37\x14\x66\x41\xe4\xc8\xc5\x70\xa5\x81\x1d\x0e\xd1\x1c\x74\xec\x0d\x49\xdf\xee\xf6\x42\x32\xb2\x5c\x80\xcf\x63\x30\xb3\x6d\x69\x10\xda\x2d\x88\x7c\x3a\x18\xf8\xde\x8d\xdd\xe7\x77\xe4\x4f\x11\x45\x7d\xb6\x09\xab\x57\xc7\xd6\x02\x70\x1a\x45\x74\x3b\xe3\x43\xcf\x97\x01\x9d\x8b\x80\x42\x0b\x62\xe2\x80\x81\xbb\xc0\x7e\x18\x50\x7f\xc5\xea\x32\x78\x22\xbe\x27\x40\x5f\xe9\xd9\xd2\x8f\x45\x64\xb2\x69\x59\xae\x3d\x84\xb3\xc0\xfe\xea\xbf\x02\x6a\xf9\xad\xde\x0e\x96\xfe\x77\xb5\xdc\x83\x19\x2b\x2d\xb1\x21\xcb\xd4\x47\xf4\xfd\x9a\xcd\xb4\x52\x5f\x90\xe6\xb4\xae\xd4\x40\xdc\x8f\xa1\xa3\x02\x18\xb1\x48\xde\x1d\x83\xbd\x3a\xa3\x1b\x0e\x51\xcb\x72\x5a\x43\x07\x47\xdd\xf1\xba\x76\x4b\x99\x8a\x8d\xfe\x81\xd4\x10\xe9\x18\xa7\xac\x79\xe4\x7e\xa5\xad\x10\xef\x2c\xc4\xd4\xfd\xbf\x27\xcb\x5c\x56\xb8\xc9\xd5\xa7\x36\xc4\x7d\xc8\x41\xd1\x10\xc2\xd0\xe0\x6c\x84\x46\x76\xd8\x83\xf9\xa8\xaf\x82\xf2\xe5\x03\x07\x49\x14\xa9\x4d\xa5\xb9\x59\xcc\x28\xd2\x08\xa3\xe8\xd3\xc0\xfe\x46\x8f\xdc\x90\xfa\xd7\x5a\x54\x3d\xfd\xb5\xa5\x5d\x25\x9a\xef\xf5\xc8\x7e\x26\xa0\x08\xa6\x95\x67\xcf\xf4\xe0\x7e\x7a\x59\x7e\x89\xbc\xba\x4a\xbe\x40\xd2\xb5\x2f\xe8\x4d\x84\xcc\x4b\x9a\xd4\xf1\x46\x6c\xe1\x92\xe7\x49\x4b\xb2\x0f\x31\x12\xa7\x9a\x81\xa6\x1b\x82\x02\x8c\x74\x1b\x50\xcd\x0a\x54\x1f\x3b\x71\xb7\x86\x26\xa0\x51\x13\xa3\x74\x1b\xd0\xe9\xac\x40\x85\x92\x28\x2b\x3d\xb0\x09\xe8\x74\x46\xa0\x29\xf7\xe7\xf7\x67\x08\x4a\x76\xb0\xe7\xb3\x98\x80\x22\xa9\x62\xd6\x9f\xb3\x1a\x7f\x6a\xa4\xe0\x22\x52\x32\xaf\xea\xbd\x69\xdc\x79\x0a\x2c\x2c\xba\x2a\x8f\x79\x15\x6a\xd1\x4c\xde\xe2\x0f\x81\xa0\xc7\x0a\xf2\x54\x4c\x87\xd2\x6d\x16\x8a\x91\x29\x57\xb8\x17\x23\x4a\x6d\x30\x33\x0c\x29\xf9\xe4\xb8\x50\xe8\x47\xac\x28\xf7\xed\xb6\x69\x44\x99\x61\x46\x29\xca\x46\xc8\x31\x1b\x35\x94\x25\x69\x2a\x4e\x1f\x6d\xc7\xf9\xe0\xf6\xa7\x45\x4b\x2b\x9e\x84\x99\x3e\xd8\xa5\x16\x53\xef\x9c\xfc\x74\x08\x69\x7d\xca\xc0\x43\xef\xb9\xd6\xe5\xb8\x91\x95\x32\xb8\x05\x29\x19\xbd\x4c\x8f\x87\x0f\x8d\xd6\xd0\x63\xd4\x6e\xc7\xea\x36\x46\x5c\x98\x62\x92\x4f\xe3\x7b\x2c\xeb\xc2\x53\x72\x16\x5a\x7e\x88\x69\xd9\x41\x73\x76\xbc\x11\x0d\x42\x6e\x7c\x67\x05\x04\x72\x6a\xb9\x6d\xd2\xa6\xd7\x76\x8b\x06\xc4\xeb\x84\xd4\x25\x3d\xeb\x9a\x12\x8b\x04\x7d\xcb\x71\xb8\x2a\x1d\xc9\xaa\x10\x6b\x48\xd1\x84\xdc\x96\xf1\xe5\x4d\x80\xff\x06\x7d\xfc\xb7\xdf\xc6\x7f\x9d\x2e\xff\xee\x44\x81\x68\x7f\xb7\x2b\xf8\x37\xe5\xbf\xbf\x45\x41\x21\x99\x10\x14\x47\x45\xfb\x17\x50\xba\xe5\x28\xdd\x72\x94\x6e\x13\x50\x5a\x8d\x0d\x80\xc8\xfd\x57\x31\xc7\x66\xd4\xb3\x1d\x4a\xf2\x62\x78\x76\x54\x26\x35\x91\x21\x30\x6d\x8b\xc8\xa3\x90\xc5\x8c\x2e\xc0\xe0\x0d\xf3\x0a\x88\x05\x34\x05\x84\x4c\x1f\x18\x81\xb0\xba\x4a\xfe\xdb\xa7\x6d\xdb\x22\x96\x4f\xd5\x86\xbd\x48\x02\xb6\x97\xc3\x68\xa4\x14\xf8\xa2\x49\x7b\xd6\xb5\xed\xf9\x6c\xef\x45\xa3\x09\x34\x70\x43\x2e\x87\xf7\x3f\x3a\xff\xa2\xdd\x66\x70\xa1\x23\x7a\x99\x64\x40\x22\xf9\x36\xb3\x0f\x64\x85\x54\x2e\xa3\xd6\x25\x46\x5a\x06\xf5\x77\x17\xed\x2e\x42\x58\x8e\x0d\x4d\xa4\xa0\xc2\x04\x7f\xdc\xde\x92\xdc\x8d\x93\x8b\x50\x0f\xec\xeb\xb1\x00\xd3\xe6\x34\xcb\xc4\x51\x7c\xe2\x93\x09\x76\xdb\x44\xad\x57\x08\x33\xda\x95\x42\x86\x51\xd6\x34\x32\x2c\x62\x98\x3d\x95\x69\xf6\x94\x76\xd6\xe6\xc6\x55\xb7\x22\x56\x6f\xa3\x35\x42\x71\x3f\xa9\x89\xb5\x68\x99\x91\x09\x6e\x94\x04\x67\x6e\x0b\x60\x1d\x39\xb0\xce\x65\x18\xb0\x1f\xd0\x0c\xc6\x81\x36\xe9\x20\xc8\x30\x95\xdd\x1a\x1f\x4b\xc9\x3f\x51\xee\x60\xef\x74\x14\x92\x6c\xec\x0c\x0c\x56\x57\xc9\xc7\x1e\x75\xb5\x13\x16\xd3\x6f\x3f\x7e\x36\xa3\x2a\x8e\x28\xca\x6b\xd7\x23\x76\x9b\x5a\xc4\x6a\x7a\xc3\x70\xaa\x33\x11\x05\xe3\x48\x4b\x39\x35\xf0\xd1\xe5\xba\xe9\xd8\xee\x55\x00\x0e\xbe\x3d\xea\x0c\x30\x08\x05\x65\x8a\x9a\xed\xd8\xb8\x99\xe7\x67\x2f\xa0\x93\x93\xd0\xa7\x34\x86\x19\x13\x3c\xae\x17\x46\x3b\xd6\xb3\x9d\x76\xc4\x73\x4c\x56\x33\x61\xd4\x5d\x62\x39\xe0\x2a\x81\x7e\xee\x81\x38\x28\xe2\xce\xf7\x8a\xc8\x5f\xa4\xcb\x7c\x29\xb2\x26\x6b\x1c\x66\x6e\x78\xe2\x09\x3d\x23\xf9\xb3\xf9\x98\xe9\x43\x35\xab\x45\x2a\x49\x34\x67\x48\x36\x92\xfd\x4e\xd0\x9b\xa8\xc6\x18\x95\x69\x57\xb9\x22\xf1\x5c\x54\x6a\x6a\x71\x3d\x87\xdc\x15\x13\x1a\x4a\xc3\x49\xee\x99\x8a\xc8\xec\x05\xad\x6e\x92\xa6\xa4\xec\xd7\x79\x97\x81\xca\xdc\xb7\x67\x92\x75\x9e\x24\x7c\x72\x28\xec\x9c\x0a\x85\xad\x59\x1d\xe3\xae\xa2\x6d\x18\x54\xa0\x4d\x5c\xc4\x6c\x42\xcd\x4b\xad\x53\x39\xb9\x71\xcf\x15\x92\x62\x74\x4a\xeb\x3a\x34\x89\x50\x30\xc4\xee\x64\x1b\x0d\xf2\x92\xc3\xb8\x4a\xe0\x0f\x13\xae\xfa\x3e\x13\x35\xfe\x8c\xf9\xf9\x33\xe6\xe7\x4f\x43\xbe\xff\x47\x0d\xf9\xc4\xcc\xed\x59\x98\x6d\x99\xec\x10\xf1\x53\x37\xa3\xdd\xb7\xfd\x70\x4c\x76\x08\xff\xa5\x7f\xaa\xb7\x3d\xdf\xa5\x6d\xdc\x39\xb2\x12\xfa\x8b\x9f\x41\x43\xff\x0a\x41\x43\x81\x6c\xaf\xa8\x33\xa0\x7e\x5a\x2b\x9b\x4a\x3e\x9c\xd3\x9b\xd0\xf2\xa9\x95\x26\xcb\xb6\xd6\x63\x45\xb3\xf0\x11\x65\xfe\x6a\xc6\x7f\x52\x15\x10\x31\x0f\xd2\x23\xf9\xe8\xe6\x79\x7f\xc9\x60\x97\xab\xab\xe4\x0c\xb3\x74\x04\x44\x45\xd5\xe2\x2a\xb7\xee\xf2\x92\x2f\x94\x58\x61\xcd\x07\x06\xbd\x3c\xac\x56\x8b\x0e\xc2\x80\xd8\x61\x20\x93\x13\xca\x43\x1f\x0b\x14\x40\x56\x91\xd5\xfd\x6f\x40\xa9\xb2\x3f\xe4\xc9\x28\x4a\x3c\x41\x85\xed\xad\x02\xb3\xad\xb6\xbd\x56\xb0\xda\xf1\xfc\x7e\x50\xea\x85\x7d\xe7\x5f\xca\x9f\x79\x45\x85\xf8\x03\x70\x68\x9d\x80\x8e\x2c\xec\x59\xd8\x4a\xa8\xf8\x4c\xd2\x6a\x02\x23\x8e\xe1\x6d\x7f\x9b\xfd\xcc\xe5\x0a\xc4\xf3\x09\x06\x42\xd2\x3f\x7c\xa3\xbe\x57\x50\xec\x26\x44\x5a\x9e\xa7\xce\xff\xae\xee\x53\x44\xc6\x7e\xfd\x5e\xe3\xc9\x13\xed\xb5\x38\x97\x79\x14\x09\x1d\xcf\x41\x89\xb2\x7a\xde\x95\x32\x77\xa9\x58\x25\xfb\x7c\x30\x00\xff\x8e\x4d\x9d\x36\xdb\x92\xb4\x41\x9a\xe6\xad\xd2\x55\xc9\x2a\x91\x8e\x0d\x5e\xe0\x82\xbe\xa7\x34\x18\x78\x6e\x40\xe5\x40\xd2\x80\x55\x76\x18\xbb\x60\xb4\x35\x1a\x50\x37\xa4\x6d\xb6\x73\xbb\xa6\x1c\xaa\xe7\xb3\x91\x1a\x38\x56\x8b\xf6\x3c\xa7\x4d\x7d\x39\x5c\x48\x5f\xaf\xf9\x55\x7b\x3a\x3b\x3b\x4d\xa1\xf5\xa1\xe5\x04\x14\x63\x70\xb1\x7d\x18\x6f\x8c\x81\x17\xa9\xf4\xd9\x18\x00\x13\x25\xfc\x9d\xb3\x91\x82\xca\x96\x3b\x16\xc3\xe2\xf9\x62\xe4\xe0\x5c\x11\xe9\x54\x5a\xd2\xcc\x48\x60\x4d\xe1\x93\x5f\xc4\x03\x39\x3b\x4d\xbe\x3d\xab\x98\xb7\x67\x95\xac\xdb\xb3\xca\xa5\xf0\x5f\xd7\x53\xd4\x70\xb1\x92\x97\x4c\xc1\x04\x8c\x1a\x4d\xf9\x84\x3b\x8f\x1c\x9b\x7c\x0c\x9b\x27\x4f\x88\x51\x83\x4b\x9f\x3f\x8c\x8a\xfa\x4b\x5e\x3f\x99\x17\x2c\x97\x60\xa6\x22\x3b\x20\x16\x2e\x98\x6c\xd7\x1e\xb0\x45\x13\xa8\x7b\x14\xe6\x02\xd2\xf2\x7c\x1f\xd8\x01\x98\x9a\x87\x70\x73\x68\x87\x1f\xd1\xbe\x39\x3f\x4d\x19\xe6\x09\x03\x8b\x4d\x22\x65\x27\x0f\x25\x47\x8f\x07\xea\xe2\x28\x6a\xc3\xa7\x2f\xf8\x6a\x14\x15\xb5\x4b\x50\xa5\x2e\x9a\x04\x7a\x64\x87\xe7\x95\xc0\xf1\x4d\x5e\x3b\x1a\x87\xc3\x17\xc5\xe6\xca\x7f\x8b\xe7\x65\xe1\xd2\x0b\xd2\xb4\x44\xc3\xe9\xe2\x79\x39\x4f\x62\x55\x0a\x45\x68\x9b\x1c\x64\xec\xc8\x91\x17\xa4\x5c\x5a\xaf\x92\x1a\x29\x97\x36\xe2\x01\x7e\xb1\xb2\x96\x11\x8a\xef\x97\xf3\x39\x0e\x3f\xa7\xce\xd9\xda\x43\xdf\x4a\xab\x25\xbe\x95\x82\x9e\xe7\x87\xea\x78\x86\x5a\x01\x04\xe5\x8d\xd7\xc0\x2f\xec\x1f\x3c\x30\xb9\x2b\xe8\xf9\x73\x35\x62\xbc\xb2\xdb\x6d\xea\x4a\x92\xa8\x30\xc2\x29\xe5\xff\xb0\x41\xf5\x8c\x57\x98\x81\x50\xdc\x2b\x4d\x8e\x37\xb7\xbf\xd2\x62\x2b\xc3\xb9\xcc\xb1\xdd\xb7\x5b\x68\xe4\x21\x36\xc9\xb8\xf2\x88\xe8\x93\x32\x7e\x21\x04\x8e\x6c\x8e\xc5\x31\x54\x00\xb7\xa4\x96\x8b\xc5\xc5\x51\x4d\x56\xbc\xe6\x48\xc4\xe6\xa6\x15\x50\x56\x44\x7e\xd5\xe2\x2e\xfb\xd4\x81\x73\x22\xf9\xad\xe3\xb9\xe1\xa1\xd5\xb7\x1d\x49\x04\x95\xe9\xac\xa4\x3e\x8a\xe2\x9c\xe9\x4c\x72\x21\xa2\xe8\xa5\x4a\x6f\x42\x1d\xf4\x19\x3f\x98\x89\x00\x1e\xdc\x9c\x7b\xa7\xb4\x9f\xaf\x3c\xc3\x43\x16\x7e\x4e\xd3\xd1\xfd\x02\x05\x2d\x73\xb8\x10\x2c\x93\x27\xb9\x9a\x76\x1c\x85\x21\x9e\xcf\xbd\x81\x00\xcf\xd3\x92\x95\x86\xae\x1d\x92\xa7\xa4\xba\xa4\x1f\xd7\xf0\x06\x6c\xf7\xaa\x69\xf9\x1a\xec\x27\x35\xab\x13\x52\xdf\x80\xdc\xb4\x5a\x57\x5d\xdf\x1b\xba\xed\xbd\xa4\xde\x0e\x7c\xbb\x6f\xf9\xe3\x8b\x89\x2c\x93\xab\x6f\x96\xcb\x39\x52\x23\xb9\x7a\xb5\x5c\xce\x5d\xaa\xb3\x28\x23\x56\x35\x34\xe9\x85\xa1\xd7\x37\x5e\x31\xf9\xe9\x89\xf3\x40\x3c\xe7\x1d\x59\x63\x62\x01\x62\xa4\xe5\x5b\x41\x8f\xc9\xcf\xa3\x83\x4a\x85\x3c\xce\xe5\x1e\x27\x65\xce\x6a\x05\x81\xed\x7e\x0d\x56\xbf\x06\x81\xc8\x9b\x55\x5d\xaf\xca\x26\xc0\x3d\x13\x9c\xb8\x1f\x3f\xd6\x8e\xc6\x45\xa4\xed\xaa\x7a\x95\x1e\xb9\x1b\x78\x1f\xcb\x6b\xc8\xcb\xcc\xe3\x35\x92\x0b\x5a\x96\x43\xff\x97\xe7\xe9\x92\xb4\xef\x13\xc5\x8c\x84\x92\x33\x1d\x7b\xe7\x11\x36\x53\x0b\x9c\x93\x61\xa8\x8e\xfa\x0a\x3a\x09\x40\x83\x87\x53\xca\x40\x44\x3f\x67\xa3\x74\xae\x72\x44\x89\x05\xab\xe7\x5d\x53\x2e\xed\x4b\xf2\x4e\x42\xb2\xdc\xaf\x1d\xaf\xc5\xe6\x7c\x02\xeb\x25\xd0\xad\x52\xc8\x25\x71\x32\xf5\x7d\x6f\x41\x46\x06\x10\xa5\xfa\x7a\x39\x7b\xe0\x2a\x05\xe8\x26\x94\x86\xc5\xdb\x19\x59\xe3\x00\x14\x10\xdf\x01\x0d\xc4\x76\x89\x2f\xed\x0b\x22\xf3\x4d\x8b\x0a\x8f\x12\x21\x16\x15\x3e\x73\x25\x83\x79\x10\xc0\x94\xc2\x63\x6e\x54\xf2\x43\x8f\x04\x03\xda\x12\x49\x09\xd9\x73\xdf\x0a\x5b\x3d\x72\x6d\x07\x43\xcb\xc1\x8f\x3e\x0d\x30\xff\x20\xd1\x43\xc0\x27\x08\x8b\x15\x52\x21\xcb\x24\x37\xb8\x21\x65\x92\x23\xcb\x24\x9f\x50\x66\x99\x54\x0a\x58\x48\x62\xd6\x84\x1b\x01\x8d\xef\x9b\xde\xcd\x99\xfd\x0d\x5a\xc9\xf1\xb9\xb5\xd2\xf4\x54\x85\x6b\xea\x87\x76\xcb\x72\xea\x4c\x5a\xd7\x48\xae\x6f\xb7\xdb\x8e\x9a\x48\x6a\xb8\x04\x7b\x89\x2f\x2a\x9c\x3d\x41\x7d\x99\x86\xb0\x48\x9c\x59\x1d\xcb\xb7\x15\xa1\x4e\x69\x9f\x29\xc8\x90\xca\xae\x67\x77\x7b\x40\x37\x71\x76\x0c\x99\xe8\xcf\xad\xc1\x2b\xf1\x21\x91\x29\x30\x1b\x57\x49\x4b\x7c\x56\x8c\xad\x40\x4d\xc7\x6b\x5d\x49\xe4\x12\x62\xf5\x03\x3f\xd6\x44\xf2\x7b\x60\x82\x15\x6d\x15\xce\xd5\xf4\x35\xd9\xa8\xd2\xf7\xbe\x65\x94\x64\x7d\x3c\xb4\x7d\xda\xf1\x6e\x48\xe5\xf9\xb2\xaa\xb8\xd2\x0f\x26\x36\xc3\x93\xfa\x57\x2a\x46\x7b\xd3\xd5\x3b\x68\x77\xa9\xaa\x06\xf3\xd7\x98\x69\x1e\x06\x97\x44\xc5\xc3\x98\xee\x72\xbc\x04\xde\xb6\x0b\x79\x08\x89\x2f\xac\xff\x50\x2b\x00\x61\xa1\x9a\xe0\xa5\xcc\xe9\xec\xdd\x9c\x41\x26\x4b\x2d\xf7\x42\x44\xb4\x28\xa2\xa3\xa5\xed\x4a\x9b\xb6\x3c\x9c\x33\x06\x28\xc5\x2b\x4c\x5c\xf1\xb9\xc1\x03\x11\x8f\x07\x74\x07\x6b\xab\x6b\x22\x0c\xca\x6d\xb9\x2d\x9a\xd6\x36\xdb\x90\xf7\xbc\x11\xde\x86\xd9\x6d\x0e\x58\x53\x5b\xc1\xae\xd5\x58\xd2\x2f\xda\x56\x68\xad\x04\x3d\xdf\x76\xaf\x76\x60\xd3\x72\x49\x96\xc9\xaf\x9a\x12\x10\x59\xf2\x67\x60\x2a\x54\x0c\x8b\x66\xd5\x4c\xe6\xe2\x35\x92\x59\x6c\x5a\x26\xd3\x80\xe8\xac\x36\x35\xb3\x69\xf5\x35\x96\x53\x4c\x37\x75\xff\xb9\xa2\x5b\x4c\x82\x90\x49\x06\x51\x31\x83\x0e\x08\x67\x8a\xde\xe8\xb0\x62\xe4\x90\xd8\x4c\x0b\x26\x42\x94\xf8\x3a\xb3\x4f\xdd\x80\x2a\x7e\xe1\x5c\x9d\xa6\x21\xae\x72\x0d\xf1\xce\x08\x74\xd1\x56\xf5\x13\x55\x5d\x08\x45\x25\xca\x9a\xaa\x2b\xae\xe9\x32\x2e\xab\x5c\x1f\x8d\x45\xba\x49\x3b\x9e\x4f\x67\x59\xa5\x51\xb9\x46\x05\xf1\x8d\xed\xd2\xbf\x9b\x16\x59\x59\x50\x8b\x9c\xa8\x25\x2a\xfa\xad\xb4\x50\x73\xf8\x71\xca\xe2\x03\x6b\x8a\x35\xf8\x5c\x73\xbd\x30\xff\xab\x0c\x78\x35\x07\x0f\x01\xd7\xf2\x7d\x4b\x82\x9e\x9f\xa0\xa2\xca\xe9\x90\xd9\x58\x8d\xe4\x34\x45\x41\x1b\x4b\x55\xe4\xa8\x6f\x75\xd9\xa2\xc1\x66\x82\xe5\xaf\x74\x7d\xab\x6d\x53\x37\xcc\x87\x1e\x0e\x78\x11\x34\xae\x6c\x96\x67\x7a\x17\x59\x5b\xfb\x77\x51\xcf\xc7\x4a\xca\xff\x2e\x24\xb6\xf8\x4e\x71\x19\x1c\x1c\x85\xde\x20\xb1\xdc\x29\x1d\x50\x0b\xd2\xba\xc2\x8f\x95\x9b\xc4\x52\xb8\x81\xcd\x6d\x0c\x6e\x48\x65\x70\x93\xa8\x8a\xf7\x87\x4e\x68\x9b\x33\x3d\x5b\xdb\xac\x4e\xd4\x36\x57\x94\xb6\x19\x17\x73\x31\x49\x25\x4f\x31\x2a\x4a\xdd\xb0\x4f\xce\xc4\xfb\x18\x84\x33\xdb\xed\x3a\xd4\xc4\x58\xa5\x57\xa2\xfd\x78\x9b\x67\xa0\x0f\xa8\xd2\x86\x3e\xc0\xb8\x0b\xce\x64\x81\xc9\x8f\xfa\x03\x1f\x14\x0b\xb6\x21\x46\x3d\x42\xe7\x6f\x1d\xea\x71\x9c\x70\x3e\x37\xe5\x30\xf5\x5f\x23\x7f\x93\x12\xb9\x43\x47\x38\x0b\x7d\x4f\xd2\x45\x97\xc4\x48\x71\x9b\x85\x45\x93\x38\x9d\xf7\x30\xf5\x07\x9e\xda\xf4\xa8\x33\x08\xc0\x13\x0a\x2c\x6e\x3a\xb6\xe3\xc0\xf9\x45\x40\x3a\x56\xc0\x64\x09\xa1\x6c\x17\x62\x5b\x8e\x33\x66\x22\xb6\xef\x35\x6d\x87\x0a\x3b\xd2\xd2\x92\xcc\x4d\x00\x71\x25\x5b\x96\x4b\x9a\x94\xc9\xd2\x0e\xb8\x59\x15\x89\x1d\xe6\x02\xd2\xf7\x7c\x4a\x1c\xfb\x0a\xdc\xbe\xac\x61\xe8\xb1\x66\x78\xdd\x4f\xde\x10\xaa\x39\xd4\xf2\x5d\x2c\x89\x96\x4d\x76\xc8\x76\x64\x60\xbf\x6e\xb1\x0d\x87\xc3\x3d\xc3\x84\x68\x6f\xd3\x6b\xea\xb0\x5e\x04\xa5\xae\xe7\x75\x1d\xf4\xcd\x1a\xd1\xe6\x2a\xda\xf0\x06\xab\xd5\x72\x65\x63\xb5\xfc\x6c\x15\x42\x31\x78\xc3\x70\x05\xbb\xb4\x32\xb2\xc3\xde\x8a\x40\x63\x49\x98\x7f\xb2\x17\x7b\x5e\x7f\xe0\xd0\x8c\x8c\x2c\x49\x79\x30\x22\x39\x60\x50\x11\x16\xe9\x54\xf8\x82\x9a\xe9\x34\x27\x5a\x3f\x04\x5d\x62\xfa\x64\x30\x3f\x36\x33\x13\x1b\xe4\xbd\xb3\x33\xac\x8b\xc3\xcd\xed\xc2\x46\x3e\x9b\x48\x7e\x3c\x37\xca\x7c\xc9\x9b\xce\x63\x67\x8d\x18\x34\x94\x71\x29\xeb\xaf\xbc\xe4\x10\x77\x53\x31\x3b\x3a\x2d\x4b\x92\x76\xae\xbf\x40\xc6\x0e\x8e\x66\x1a\x00\xbc\x30\x89\x66\xec\xc8\xe4\x8b\x87\x48\x1d\xa5\xb5\xc0\xc8\x83\xd6\xdd\xae\x52\xe1\x62\x6d\x7d\x50\xca\xdd\xd4\x6d\x1e\xb8\x6d\xf2\x05\xae\x40\xe4\xc5\xc0\x17\xd8\xc5\xc3\x4c\x4d\x18\x02\xea\xb6\x65\xc9\x7f\x50\xaa\xa0\x74\xda\xdb\x6e\xdb\x6e\x59\x21\xd0\x1e\x0f\xa7\x50\xe6\xda\x01\x71\x3d\xbf\x8f\x92\xb4\x19\x5a\x70\xe8\x74\x6d\x5b\x84\xc7\x97\x23\x1d\xdf\xeb\x2f\x09\xf7\x55\x19\x85\x55\x11\x12\xcf\xca\xee\x81\x3b\x42\xeb\x8a\x92\x21\x9a\x7a\xb2\xe5\x47\xb9\xd8\xc2\x3d\xb2\xe7\x02\x72\xbe\x6a\x5a\x5b\xa3\x66\x4b\x55\xd5\x16\x32\x22\x3d\x7f\x52\x3a\xc3\xa7\x09\x07\x65\x2f\x0b\xa2\xb5\xc3\x9d\x77\xb1\x83\xae\xd7\x16\xe9\xae\x0e\x6c\xd8\x29\xc8\x94\x57\xc2\xf5\x98\xec\x9f\x1c\x0b\x44\xe0\x02\x36\xca\xb6\x78\x89\x67\xb9\x12\xeb\xa6\x8c\x09\x10\xc9\xb8\xb4\xa7\x42\x88\x2e\x2c\x5c\x66\x9b\x1a\x11\x33\x88\x39\xe7\x88\x09\xe5\x7e\x26\x8b\x01\xb3\x10\x95\x8a\xff\x6f\xa4\xd8\xd2\xa6\x60\x9b\xed\xe7\xbf\x14\x71\xe6\x59\xed\xaf\xc3\x20\x94\x47\xa8\xe2\xe4\xf7\x9e\x24\x84\x38\x60\xcd\x62\xc5\xfc\x45\x0e\x30\x82\x00\xd7\x4c\x3b\xcd\x58\xb6\x2c\x12\x0a\x9b\x22\x31\x5d\xc4\xfa\x85\x86\xde\xfa\xfa\xa5\xed\x1f\xa6\x96\x11\x60\xfc\x6b\x85\xa1\x6f\x37\x87\x21\x9d\x28\x2b\x66\x4e\x51\x16\x4d\xde\xe5\x53\xab\x7d\xe2\x3a\xe3\x19\x50\x8c\x82\xf0\xdc\x5d\x67\x98\x2e\x86\xe3\x3c\x90\x96\x26\x0d\x6d\x15\xee\x3d\x4d\xda\x9c\x69\xce\xce\x4f\xf6\x4f\xf4\xfa\x0e\xb5\xd2\x19\x69\x62\x75\x30\x0c\x59\x20\xc9\x9a\xe7\x66\xeb\xc2\xd3\x40\x78\x4d\xc7\xfb\xde\x68\x96\x4e\x24\xc2\xf8\x30\x98\x85\x0c\x4c\x01\xef\x79\x7e\x48\x7a\xb6\x2b\xef\xc8\xf1\x6e\x49\x2d\x51\x78\x18\x21\x43\x50\x10\x48\x4d\xcc\xa4\x12\x1a\x24\xc9\xf6\xb5\xc3\xc3\x99\xb8\xfe\x2d\xb7\xdf\xe9\x10\xdf\x1b\x05\xb1\x54\x91\x72\xa2\x72\xe7\x72\xc6\x83\x6c\xaf\xcd\x63\xca\xa8\xf6\x59\xed\x1f\xad\x34\x1f\x5b\x37\x76\x7f\xd8\x97\x36\x48\xf7\xd1\x87\x63\x6b\x91\x6c\x7d\x73\x75\x03\xad\x6a\x67\xd2\x93\x4d\x63\x9b\x7f\x90\xa6\x0c\xaa\x05\x17\x55\x38\x01\x84\x60\x27\x47\x21\x9b\x2e\x3c\x30\x0b\xf0\xbf\xdd\x26\xaf\xce\x8f\xdf\x6c\xf0\x92\x0c\xa6\x22\x51\x38\x39\xaf\x5a\x82\x0e\xaa\x6f\x21\xe5\x75\x55\x87\xeb\x7d\xd2\x9e\x72\xe6\x74\x8a\xf7\xc4\x39\xa9\x9f\x2d\xdf\xb7\xc6\x27\x9d\xfc\x43\x33\x6e\xe1\xb2\x20\xcf\x95\x8e\x78\xe8\xf0\x49\x11\x1c\xd2\xa2\x37\x40\xfd\xb4\xe8\x0d\x12\x28\x94\xca\x1b\xd1\x2f\x54\xd4\x86\xcc\x88\x0d\xd3\x44\x6b\x00\xe8\x32\x67\xd8\x43\x46\x6a\x98\x1c\xa5\xc1\xf4\x4c\xba\xef\xe8\x0c\xd0\xd3\x59\xa2\x33\x20\x69\xee\x2b\x3a\x83\xbc\x2b\x52\x99\x86\x32\x93\x76\xa1\x4b\x1b\x2c\xec\x59\xe9\xb7\x62\xa9\xb2\x64\x3b\x60\x4f\xac\x7c\x68\xe3\xa9\xb1\x00\xb6\xee\xec\x97\xf0\x99\x37\x17\x89\x51\x6f\xe2\xc8\x34\xbc\xf9\x50\x04\x52\x64\xe2\xc8\x60\xa7\xa3\xc8\xbe\x4e\x83\xe1\xe4\x2c\x66\x29\x69\xc9\xf2\x85\x78\xe3\x70\x3e\x8a\xb6\xbc\xda\xe8\xc5\x23\x53\xac\xae\x92\x77\xd4\xef\x78\x7e\x5f\xe8\x33\x6c\x37\xf0\x01\x4e\x5b\x53\xfb\x1b\x4f\x57\x96\x9e\xac\x2c\xbb\xcf\xa7\xb4\x13\x97\x4f\x66\x26\x84\x08\xf3\x69\x09\x10\xa2\x88\x25\x25\x41\x48\xfa\x6e\x26\x42\xb8\x23\x94\x8d\x6f\x22\x30\x3c\x6c\x7f\xf2\x24\x0e\x06\xbe\x94\xfc\x09\x8d\xc9\x52\x91\x26\x15\x29\x16\x8c\x32\x02\xe3\x98\x11\x5d\x84\x0b\x6f\x1e\x5d\x64\x42\x7e\xb6\x99\xb2\xb3\xc9\x80\x19\xe9\x9c\x18\x65\x44\x45\x9d\x28\x25\x96\x34\xcf\xf8\xec\xf0\x27\xb3\x84\x3e\x49\x4e\xf1\x36\x05\x8e\xd1\xb9\x32\x09\x47\x46\x9f\x53\xda\xa2\xf6\x35\xe5\x49\xa7\x26\xd3\x53\x2f\x9f\x77\xe9\x0d\xf2\x4a\x41\xb7\xd3\x65\x9a\x4e\x93\x89\xad\x91\xe7\xe6\x42\xd8\x6b\xaa\xad\xa6\x4c\xf1\x24\x53\x73\x33\x5d\xd9\x73\x21\xc9\x3b\xde\x4f\x18\x56\xba\xab\xab\xe4\x23\x25\x2e\xc5\xb3\x99\xa6\xe7\x5d\x91\x2b\x4a\xf9\x79\x21\xaf\x80\xa0\xfa\x96\x3b\xb4\x1c\x47\xba\x62\x2b\x32\x9a\xb9\xcf\xd8\xbc\x90\x88\xcb\xb7\x31\xe2\x26\xc6\x55\x48\x58\x67\x88\x11\x4c\x61\x3a\xa2\xa3\x9c\x9a\x86\xdc\x58\x32\x89\xd0\xc9\x8c\xac\x0a\x66\x71\x8b\x2a\xa5\xa4\xc9\xea\x2a\x0a\x94\x01\x8a\x55\xb5\x51\x14\x72\x51\x13\xbd\xbb\xe9\xc3\xb0\x38\xf5\x17\x48\x5c\x16\x4f\x49\xc6\x9a\x8b\xa4\x12\x8b\xaf\x7b\xd1\x0c\x2a\x62\xf1\x4b\xcf\x52\x28\xe3\x92\xbd\xf2\x9c\x76\xa0\x6d\x27\x7c\xda\xa1\x3e\x75\x5b\x40\xad\x08\x0b\xe8\x03\x95\x2b\x2e\x49\x18\x75\x5d\xf7\x9f\xc1\x97\x8a\xa8\xd8\x05\xf7\xec\x53\x25\x40\xde\xa3\x1f\x55\x12\xa7\x9b\xe2\xcd\x48\x9f\x2b\x62\x63\xdc\x47\xec\x3b\x23\x05\x27\x36\xc1\xb5\x60\xe9\x8c\xa3\x25\x04\x94\x8e\xfc\xf1\x29\x2c\x27\x50\xda\xcc\x55\x33\x4c\xba\xb0\xcc\xc9\xd1\xda\x2c\xd2\x7d\x9b\x74\xae\x9d\x92\xd9\xa1\xf2\x04\x6e\xc7\x06\x12\xd8\x3d\x16\x60\x2a\x11\x5e\xfc\x7b\x32\x2c\xa4\x7a\x4c\x97\x9b\xb2\x23\x70\x0e\xa8\x37\x9c\x5c\x22\x1f\x91\xc5\x09\x5d\x88\x41\x8a\x7f\x8d\x42\x49\x60\x07\x23\x00\xce\xc4\xe0\x37\xd1\xac\xa4\xfa\x43\xd5\xcc\x13\x9d\x1d\x1e\x47\xb7\x0d\x50\xb1\x6c\xf4\xb7\xd1\xd2\x62\x9b\xa3\x15\x85\x57\x7a\xb9\x69\x12\x96\xce\x92\xae\xd4\x70\x62\x53\xe9\x47\xb5\xb7\x46\xe9\xa9\x93\x95\x46\x6f\x8b\x63\xa5\xe5\x17\xc3\xf2\x4c\xbb\xf7\x55\x35\xf4\xb7\x46\x69\xdf\xf7\x7c\x13\x15\x78\xa5\x97\x91\xb7\x90\xaa\x8c\x7c\x65\xa4\xb2\x6b\x6b\xe1\x8b\x8c\x9e\x98\x77\x76\x91\x54\xa9\x2a\xc6\x88\x56\x03\x0b\xfc\x9a\x9d\x89\x55\xb0\x6d\x7a\x61\xe3\x5d\x44\x72\x7e\xbf\x23\xb5\x78\xb1\x6d\x8d\x3b\xd5\xdb\x3d\x2d\x33\x66\xac\x4a\x32\x57\xa8\xef\x9c\xbc\x33\x45\x59\xfa\x55\x4f\x4b\x77\xa1\x25\x57\xbd\x2c\xc4\x1a\x99\x98\x7d\x16\xef\xa7\xcc\x51\xc6\x77\x46\x29\x79\xb6\xab\x0a\x89\x57\x7a\x39\x54\x18\xf4\x3c\xb5\xec\xd9\x2c\x11\x99\x86\xfc\x85\x59\x66\x9a\x7c\xb7\x5c\x42\x19\x85\xd8\x0b\xb3\x8c\x88\xb6\xd0\x30\xe4\xb2\x59\x86\x5f\x4b\xe8\xa5\xf8\xab\x58\xb9\x0f\x83\x48\xa9\x0f\x03\xbd\x8c\xe9\x4d\xc9\xcb\x25\x78\x24\x90\x89\x59\x7f\xc5\xb5\x98\x2a\x21\xde\x18\xa5\xbc\x91\x46\x4a\xf6\x14\xfd\x7a\x6c\xdd\x98\x05\x8e\x2d\x23\xfd\xa1\x79\xc4\xad\x8a\x9a\xef\xf5\x1a\x21\xf7\xf1\xe7\x01\xc6\x22\xc9\x23\x27\xe5\x16\x9e\x3b\xae\x98\x2e\xd9\x73\x45\x92\x93\xe2\x3b\x2b\xd7\xb0\x2e\x68\xa3\xc9\x86\xa3\x82\x92\xbd\xd3\x45\x21\x3c\x33\x79\xc7\x7e\x48\xa1\x06\x09\x89\xdb\x32\x2d\xb1\x14\x50\xd9\x69\x8b\x71\x46\xc1\x2f\x31\x6d\x30\x8b\x31\x9b\x1e\xf8\x4b\xf6\x45\x4f\x6d\xcc\x59\x1a\x7f\x72\x95\x8b\xfd\xe4\xec\x29\x1f\x3e\x0c\xd8\x4f\xdd\xce\x5d\xcb\x95\x2c\x18\x07\x7e\x7b\xa3\x40\xfc\x7b\x6c\x41\xca\x64\x73\xa4\x21\x64\xdb\x78\x40\x93\x92\x29\xcf\xbd\x23\xc9\x4c\xa4\xac\x8a\xa0\x23\xd8\x8e\x5a\x78\x8c\x86\x81\x84\x64\x47\x93\x58\xdb\xe9\x9a\x53\x54\x41\x9c\x29\x01\xf3\x2c\xe9\x97\xef\x12\xf3\xfb\xf2\x9e\x64\x35\x22\x3a\x1b\x69\x01\x5e\x4f\x02\x2f\x68\x91\x05\x5f\xd1\xcb\x6c\x00\xdf\x27\xed\xe8\x34\x62\xcf\x93\xed\xf9\x7e\xb2\x39\x27\xe6\x61\x9e\x03\x0e\x6a\x2a\x48\xe5\xf9\x20\x28\x3d\x46\x69\x39\x73\x42\xc2\x83\x81\xa2\x1e\xac\x90\xbf\x9b\x17\xa0\x1c\xcf\x62\x64\x7c\xe7\x03\x88\xde\xcb\x45\xf2\x28\x2a\x14\xe7\x03\xa7\x74\x03\xa5\x39\xcc\x07\x49\x1a\x4a\x26\xe3\xa6\x27\xe8\x8e\xa4\x17\x2f\x18\xd2\x07\x85\xf5\x4c\x5c\x8d\x99\x86\x0d\xb6\xae\xce\xca\xd7\xd5\xa2\x99\xb8\x78\x7f\x21\xee\x8e\x42\x53\xd6\xf6\x45\xf2\x68\x2e\x42\xc7\x20\x82\x55\x7d\x91\x28\x9f\x73\xb4\xb3\xcf\x2d\x02\xf4\x78\x41\x6e\x88\x11\x91\xba\x01\x83\xa5\x09\x41\x34\x9f\x32\x19\xa2\x5a\x28\x26\x69\xe9\x26\x5f\xc8\xcb\xe7\xa8\x9c\x4c\xd8\x7a\xab\xb2\x3b\x3b\x2a\x67\x8e\x80\x74\x14\xdd\xc7\xf0\x7c\xdc\xc9\x9b\x86\x8c\x70\xa7\x46\xde\x69\x4c\x94\xff\x5d\x3b\x3a\xe8\x44\xa2\x51\xe2\x05\x8c\x10\xe2\x05\x63\x4d\x34\x55\x14\x7d\x7d\x88\x61\x6b\x16\x8d\x9c\x25\x02\xaa\x7a\xe4\xab\x92\x1d\x1c\x0f\x6d\x05\x39\x6f\xc2\x63\xfa\xda\x19\x75\x68\x2b\x84\xf7\xb9\xcb\x42\x24\x5a\xf7\x34\x74\xd0\xca\x13\x12\x00\xb4\xd3\xec\xde\x93\xa9\xb2\x76\xbb\x43\x47\x0f\x35\x7d\x97\x74\xba\xa9\xee\x94\x14\xc7\x46\x34\x0a\x50\xbd\x9f\x3c\x21\x8f\xb8\x2a\x65\xf6\x30\xce\x0d\xc2\x6c\x2f\xa7\x35\x87\xcd\x2c\x46\x19\x69\x4d\x93\xa0\xdc\x13\x69\x2c\xf8\xd0\x94\x4b\xe8\xb1\x8a\x68\x26\x50\xcf\x50\x3a\x66\x0b\xed\x9a\x6b\xdb\xd7\x9a\x4f\x55\x1a\x9d\xa4\x61\x60\xe4\x1e\xb9\xa8\x8c\xd9\xa2\xb7\xe0\xc5\x58\xce\x79\x58\x2f\x12\xd2\xf3\xa7\x6d\x90\xb2\xbb\x10\x9d\x27\x53\x0c\xb1\xe9\x04\x33\xf1\x80\xab\x46\xd2\x0f\xb6\xb0\x5b\xe6\x5a\x98\xb4\xf1\x36\xe8\x92\xb4\xf3\xe6\x46\x78\x09\x3b\x60\xcd\xc8\x2f\x71\x17\x9d\x9d\xac\x5f\x88\xd8\x9a\x12\xcc\x2f\xf0\xac\x5d\x4b\x37\x11\xdb\x6e\xf2\xdc\xfd\xe6\x79\x53\x8d\x98\xe7\x4c\x68\xa8\x1a\xdd\x66\x9b\xce\x28\x69\xe7\x72\x86\xd5\x5f\xca\x76\x1e\x0d\xa1\xa2\xdb\x61\x65\xdd\x9a\xb6\x7d\xc7\x89\xab\x66\x86\x3e\x0b\x0b\x1a\xbf\xe9\x5b\x53\xfe\x52\x3f\xa2\xc7\x5d\x1a\x9f\x46\xc0\x65\xdb\x4b\x13\x42\x05\xa3\xad\x4a\x7f\x68\x73\x95\x28\x77\xc4\x17\x2c\xfc\x90\x90\xda\x3f\xee\xa3\x22\xd3\xf6\x6b\xee\x08\xf2\x9d\x66\x7e\x2c\xdf\x21\x99\x40\x1a\xe6\x30\x1b\x10\xb6\x96\x90\xd0\x7f\x86\x74\xfe\xc9\x81\x83\x67\x4b\xea\x8f\xbd\x27\x77\xc2\x26\x67\x3b\x16\x29\xf8\xd9\xbd\x46\x0a\x5e\x5d\x25\x47\xc7\xef\x4e\x4e\xcf\xeb\x6f\xcf\x71\xc2\x91\xfe\x30\x08\x49\x93\x12\xbb\x4d\x5d\x34\x46\x0f\x3d\x82\x9e\xfb\xa5\xaf\x01\xc1\x13\xc5\x25\xb8\x5a\x46\xd3\xf4\x1e\xf5\x29\x69\xd2\x96\xc5\x60\xb7\xbd\x56\x97\xba\xa4\x65\xb9\xb9\x90\x8c\x69\x48\xec\x3e\x43\x09\x95\x39\x98\x3b\xe8\x66\x4c\xac\x96\xef\x05\x01\xe9\xd8\x0e\x0d\x4a\x7f\x93\xe4\x9c\x53\xe7\x8b\x66\xc4\x4a\x74\xb2\x8c\x9a\x12\xcf\xe7\x09\xf7\x4a\x44\xa0\x88\x66\x93\xcc\x07\x05\x65\xa6\xe8\x65\x19\xb4\x6b\x66\x82\xff\xa8\xe4\x6b\x13\xcd\x26\xff\x51\xbd\x8d\x79\xd1\x1c\x75\x60\xa5\x12\x39\x3b\x03\x9c\xd2\x10\x2c\xde\x72\xdb\x64\x38\x90\x8e\x1a\x3d\x9c\xd1\x92\x5b\x6e\x82\x0c\x8b\xf6\x44\x27\xb2\x39\x1b\x0a\xfa\x3f\xa8\xa1\x7e\xfb\x07\x35\xe4\x74\x7f\x50\x43\x37\xce\x7d\x36\xd4\xf6\x46\x6e\x06\x3b\x64\x3a\x49\xdc\x6f\x63\x41\xff\x07\x36\xd6\x6f\xff\xc0\xc6\x9c\xee\x0f\x6c\xec\xc6\x99\xd8\x98\x48\x68\xac\x6b\x14\x9b\x7f\xad\xdc\x03\x18\x89\xfa\x8d\x1d\xa4\xad\xef\x1b\xcf\x21\x60\xf5\x84\x86\xc4\xb5\x0b\x8f\x97\x42\xdd\x61\x9f\xfa\x4c\x71\xc4\xa6\x98\x1a\x08\x99\x36\xa4\x95\x40\x97\x2a\xbb\x3f\xb1\x13\x4c\x09\x81\xcd\x90\x2b\xe8\x1b\xca\xbb\x08\xe6\x47\x21\xed\xa7\x85\x18\x7f\xbe\x35\x0d\xf6\x02\xca\x43\xa1\xcf\x60\x4f\xec\x42\xfd\xda\x0a\x2d\x3f\x75\x18\x36\x66\xe9\x08\xc2\x7a\xc8\xee\x60\x0b\x13\x3b\x75\x4e\x6f\xd2\x39\xeb\xd9\x2c\x5d\x62\x90\x1e\xb2\x43\x0c\xfe\xc4\xee\x1c\xb5\x3c\x37\xb5\x3b\x9b\xb3\x74\x87\x41\x7a\xc8\xee\x30\xf8\x13\xbb\x73\x46\x5b\x9e\xdb\xb6\xfc\x71\x1d\xdb\x49\xeb\xd9\x4c\x93\x28\x02\xf4\x21\x3b\x19\x69\x2a\xb3\xbf\x67\xc3\x66\x8f\x5a\xfc\x9a\x3e\xb1\x97\xcf\xa7\xed\xa5\x04\xf5\x50\x7d\x93\x0d\x24\xf5\xe8\xc1\xd3\x00\x44\x56\xac\xad\xbf\xe2\x8a\x75\xee\x79\x4e\x33\x55\x5a\x3e\x5b\x9f\x6a\x2c\x1f\x70\xd1\xe2\xf8\xfd\x15\xc6\xef\xf9\x14\xe3\x07\x43\xb5\xba\x9a\x14\xb1\xed\x9b\xe3\xd9\xbe\xd7\xba\x5a\x6d\x79\x3e\x5d\xf9\x2a\xc3\xb6\x6d\x3d\xfb\x17\xfc\x6a\x79\xfd\x3e\x75\xc3\x95\x4a\x65\x63\x73\xe3\x79\xb9\xba\x05\x03\xd4\x75\xbc\x26\x64\x42\xc6\x86\x4a\xbc\x1d\xb2\x23\x3c\x2a\x31\xe5\x16\x79\x64\xdc\x67\xb3\x9e\xf2\x4c\xa7\xc7\x16\xa4\x03\x20\xec\xdf\x25\x42\x5e\x88\x0a\xd2\x25\x33\xa0\x4e\x27\xa1\x3a\x7b\x6d\x54\x26\x2f\xe0\xdd\x12\xd8\xf5\xd2\xc0\xb1\xdd\x70\x85\x9f\x6a\xad\xb8\xf4\x26\x5c\x01\x23\x27\xd7\x5b\x71\xe9\x68\x85\xd1\x67\x89\x90\x1a\x39\x14\x84\xca\xf1\x71\x60\x9a\x61\xae\x90\x2f\x6c\x2f\x69\xb7\xf2\x8d\x46\x97\x35\x93\x43\xd3\xdf\x5c\x01\x5f\xf0\xce\x6f\x27\x34\x28\xda\x02\x9c\x97\xa2\x43\xf5\xbc\x3c\xed\x50\xc1\x8d\xbd\xe7\xd3\x24\x02\x7f\x27\xd7\xd4\x0f\x30\x68\x59\xb5\xb4\x51\xaa\xe4\xc8\x5d\x04\x6b\x1a\xc5\x9a\x01\x62\xf0\xe6\xc0\xb9\x32\x2d\xce\x31\x44\x95\xff\x90\x1d\x1a\x51\xef\x39\x9e\x36\x3f\x06\xc0\x13\xbf\x1c\x79\xc1\xde\xc8\xa4\x12\xb5\x68\x31\x79\x5a\x80\x11\xba\xa2\x78\x56\x17\x12\x63\x70\x02\x67\xb9\x57\xb9\x80\x1c\x1d\x6c\x81\x47\x23\xdb\x2a\x74\x86\xae\x3b\x26\xa6\x80\x89\x77\xf4\x51\x62\x12\x93\xb5\xb5\x78\x3a\x64\x4e\x80\x64\xc1\xf5\xfd\xae\x48\x72\x16\x93\x56\x11\xb9\x94\xd7\xe4\xc5\xe6\x36\xb9\x23\x77\x85\x92\xc5\xe6\xc6\xe6\x36\x8a\x9c\x28\x2d\xd6\x66\x10\x09\xd5\x72\xa9\xca\xfe\xdb\x82\xd9\x54\x0a\xec\xae\x9b\xbf\x29\xc4\x3b\x29\xbf\x92\xdb\x5b\x2d\x05\x01\x16\xc7\x73\xb9\xec\xf9\xc7\x66\x29\x98\xe2\x5b\x70\x64\x27\x12\xc9\xdd\x90\x1d\xb2\x7c\x53\x60\x1c\x5b\x66\xa0\x6f\x58\xc7\x6e\xc8\x0b\x72\x43\x6a\xe4\x86\xfc\x87\x94\xc9\x0b\xb2\x52\x21\x35\x52\x49\x1e\xf8\xf5\xd9\x3b\x5b\x59\xc7\xee\xd0\x9b\x41\xbf\xc2\x7a\xcb\xe6\xdb\xaf\xf0\x24\x7a\x0a\x0f\xdb\x71\x32\xe4\x1f\x61\x39\xec\xef\x89\xd3\x26\x87\x87\xa4\x39\xec\x2e\x11\x86\x3c\x7e\xcb\x57\xca\x05\xf2\x1b\xa9\x56\xcb\xd5\x8d\xd2\xfa\xb3\x8d\xcd\xe7\xeb\x5b\xe5\x67\x9b\x95\xe7\x91\x22\xff\x89\x17\x79\xb6\x51\x79\xb6\x85\xb0\xcf\x3d\x9f\xec\xf2\x6c\x93\xd1\x06\x56\xaa\x74\xa5\xb2\x59\x60\xa4\xc2\x9f\x4b\x05\xf2\x42\x8d\x8a\xe8\x97\xce\x73\x26\xa1\x05\x79\x7f\x23\x2b\x15\xba\xf2\x8c\x49\x56\x46\x6b\xf8\xcd\xbe\x2d\x93\x1b\xf2\x94\xdc\x90\x55\x52\x25\x35\x49\x11\x06\x72\x05\xc6\x81\xd4\x38\x2a\x09\x03\xb2\x58\xfa\x3d\x3c\x1a\x0e\xe8\x4b\x1a\x9e\x5b\xdd\x34\x65\x6e\x8d\xdf\xa3\xf0\x7c\x33\x69\x89\x84\xb6\x64\x31\x9c\x72\x6f\xec\xab\xb4\xa4\x43\xeb\xeb\xfc\x7e\x80\x7c\xc1\xb2\xff\x0a\xbd\x33\x38\x2e\xfe\xc2\xa3\x83\x2b\x17\x98\xa0\xc4\xba\x88\x59\x3a\x58\x09\x44\x34\x77\x81\x92\x8c\x60\xb5\xcb\x1c\xc2\x5b\x22\x4f\x09\x38\x51\x43\xa6\x9a\x2f\xa0\xef\x40\xba\x7f\x38\xae\xb6\x3b\x36\x6d\xa3\xef\xcb\x17\xd1\xdc\xc0\xb7\xfb\x36\x84\xc9\xf1\x7c\x82\x30\x4b\x4b\x04\x00\xfd\x37\x08\xad\xd0\x6e\xe1\x4f\xdb\x6d\x51\x52\x2e\x55\x4a\x65\x78\xee\x53\x26\xef\x4f\x3a\xa4\x01\x8f\x2d\x2b\xa4\x5d\xcf\x1f\x93\x37\x96\xdb\x5d\xd2\xe2\x9d\x3c\xbd\xe3\x36\x9d\xe7\x32\x40\x4a\xe8\xa1\x8b\x47\x09\xca\xc5\x9d\x63\x4e\xf9\x1b\x8c\x59\x13\xe9\x87\x08\xfd\x54\xc4\xcb\xef\x2f\x70\x33\xf4\x05\x41\xd1\x1b\xab\x3f\x70\x28\xc7\xbe\x51\xb2\x03\xec\x64\x3e\x67\x35\x5b\x90\x5a\xf2\x29\xe3\xf5\x9d\xdf\x50\x01\x8c\x15\xab\xe8\x45\xb8\x6b\xda\xd3\x55\x3d\xbf\x0a\x2f\x18\xcf\x5d\xc4\x97\x0f\x6e\xbe\xba\x43\x72\x88\x65\x8e\xdc\xde\x02\x4f\xe4\x1f\xc5\x93\x15\xe9\x7c\xa2\xbd\x56\xfc\x28\x5e\xee\xec\xa8\xa1\xc7\x1c\x36\x31\x49\x21\x50\x4b\x98\x21\x8b\x5d\x3b\xcd\x3a\x43\x1e\x88\xf5\x51\xbd\x88\xb0\x3e\x46\x45\x99\x9d\xf5\xb1\x5e\x26\xeb\x3f\x7d\xfa\xd6\x0b\x69\xed\xe9\x53\x72\xee\x11\x7a\xd3\x72\x86\x6d\x4a\xbe\x1c\xb9\x70\x0b\x36\xfe\x52\x24\x5f\x56\xb4\x07\xcb\x6d\x93\x2f\x6f\xad\xb7\x5f\x8a\x64\xd4\xb3\x5b\x3d\x02\xab\xce\xd3\x48\xcb\xd8\x87\xa0\xa8\x92\xe0\x32\xde\x3b\x64\x40\xe8\x17\xd2\xa7\x61\xcf\x6b\x27\x4d\xbd\xc8\x54\x8b\xce\xc4\x1f\x38\xf5\x44\x7c\x8b\x69\xa6\x1e\x12\x39\xbf\x96\x31\xed\x78\x11\xfc\xa7\x74\x7c\xf4\xb6\xf1\x47\xfd\xcd\x87\x83\xc9\x35\x04\xe9\x27\x97\xcc\xad\xe5\x26\x4e\x6a\x5e\x74\x8a\x49\xcd\x95\x5c\x39\xa9\x67\x99\xc1\x92\x83\x53\x67\x30\xe2\x91\x30\x83\x33\x8f\x79\xd5\x1c\xe3\xb0\x1a\x8d\x69\x37\xd0\xab\x4f\x49\xcf\xf2\xfb\x9e\x3b\x16\x77\xbd\x4f\x57\xd1\x77\xaa\xc1\xd3\xe4\x36\xf0\x8a\xf9\x60\xbf\x71\x7c\xb2\xff\xe1\xcd\x41\xa3\xdc\x70\xbc\xb6\x15\xf4\x1a\x76\x20\x76\x35\x8d\x46\xda\x82\xf8\xac\x70\x7f\x6d\x34\xd4\xbd\x7c\x42\x5b\x25\x37\x3f\x23\xbc\xf9\x50\xab\xa0\x45\x44\x7a\x97\x17\x04\xbb\x40\x2f\x25\x8c\xf9\x50\xa8\xc2\x2d\x65\x23\x84\x0b\xcb\xb4\xee\x95\xef\x03\xf6\x02\x7d\x34\x01\xcd\x87\xcc\x5a\xa3\x31\x0c\x6d\xa7\xf1\x6e\xe8\xd3\x53\x70\x2f\x4c\x1f\xcd\x8d\xf9\x9a\x58\x6f\x34\xf8\xf9\xcb\x1b\xda\xa5\x6e\x7b\x0f\x03\xd1\xa7\xb6\xb3\x59\x99\x93\x6f\x36\x78\x5f\xf6\xad\xd0\xfa\x10\xda\x4e\xfa\xc8\x55\x36\xe7\x6b\xe1\x19\x6f\x01\x6e\xb4\x27\x34\xb1\x06\xbb\x43\x3d\x75\x34\xd9\x11\xbb\x4f\xb6\x0e\x46\x76\x73\x79\xcc\x98\xce\xb6\x9b\x32\xa6\x8f\x4d\x76\x48\x65\x9b\xd8\xe4\x3f\x31\x97\xe5\x6d\x62\x43\xa4\x1e\x40\x98\x47\xcb\xd3\x63\xf4\xd8\x97\xdb\x0a\xce\x15\x1d\x13\xdb\xe5\xc5\x58\x25\xbb\x43\xf2\x1c\x95\x81\x08\xa4\x53\xea\x59\xc1\xc9\xc8\x15\x5b\x62\x4c\x00\x8e\x55\x8a\x0c\x42\xa1\x20\xd3\xba\x5f\xf0\x90\x40\xf8\x15\x9e\x60\x6b\x4c\xee\xe4\x5a\x01\xe5\xb6\xc9\x5d\x42\xea\x63\xe3\x78\x02\xfa\x2b\x9e\x8c\x4d\xb9\x4d\x03\x4e\x13\x91\xe7\x3d\x4a\x9a\x32\x92\x06\x7d\xa3\x12\xc8\xd2\xa6\x41\xcb\xb7\x07\x21\x78\x86\x40\x29\x20\x8b\x7a\x5d\x52\xe7\x92\x64\x27\xe5\x3d\x1b\x23\x48\xd4\xa8\x7f\x6f\x79\x6e\xc7\xee\x0e\x45\x4d\x30\x5f\x06\xa2\x3e\x86\x15\xee\x31\xa3\xb6\x2a\x5e\xd0\xab\x8e\x7c\x3b\x34\xaa\x25\x1f\x48\x88\x9e\x6b\x35\xaf\xe8\x58\x7f\x2e\x6c\xeb\x04\x57\x14\xd5\x22\xa6\x00\xe1\x42\x8f\xdb\xa0\xa2\x0e\x25\x02\x3e\x88\xbc\xf6\xfc\x73\x21\x4e\x7c\x0d\x90\xe2\x12\x1d\x64\x01\xfb\x6c\xc0\xcd\x82\x62\xa2\xb0\x2d\x50\xd7\x4a\x6c\xc3\x31\x6b\xde\x4c\x5e\x2c\xec\xd0\xab\x3c\x44\x4c\xd5\x38\xe8\x35\x83\x65\xe5\x6d\x37\x08\x2d\x97\xb1\xac\x06\x56\x74\xf7\x91\xfc\x4c\xc4\x0f\xaf\x63\x14\x04\x1e\xef\xf9\xde\x88\xb8\x74\x04\x81\xdd\x0e\x7c\xdf\xf3\xf3\x8f\xf7\x2c\x17\x22\x72\x5b\x8e\x43\x2c\x1e\x22\x1c\xd4\x67\x81\xc9\x63\x1c\x0f\x1d\xb5\xd4\x18\x36\xf9\x80\x3a\x9d\x22\x00\x93\xa8\xb1\x57\x66\xeb\xa7\x42\xef\xe7\x28\xc0\x05\x7a\xcf\x0a\xdc\x5c\x48\x9a\x94\xba\x04\x4c\xd0\x2c\xc7\x0e\x68\x9b\xac\x90\x60\x38\x00\xdf\x70\xbd\x04\x6b\x81\xb6\x11\x35\x4e\x6d\xe8\xc1\x93\x27\xf2\xc4\x12\x9e\x77\x76\x76\xc8\x63\x54\xf9\x1f\x33\x8e\x8f\x7d\x53\xbd\x24\x2f\xf0\x75\x0d\x8e\x7e\xb7\xcd\x1e\x8b\x88\x69\xf9\x60\xd8\xdc\xc3\xb1\x03\xb4\xe0\xb7\xe8\xaa\x38\x64\x96\x1f\xe0\xe0\x51\x35\x01\x47\xcd\xe6\x47\x77\x88\x94\x4a\x1c\x9a\xb3\x21\xc4\x66\xbf\x19\xf8\x34\x08\x18\x1a\x60\xf8\x47\x31\x36\x72\x93\xe2\x91\x26\x44\xc3\x13\x4d\x14\x21\x7c\xf8\x63\xb2\x4c\x62\xb8\x00\xa9\x04\xf6\x8a\xed\x95\xe8\xe6\xe9\x4c\x34\x04\x0d\x74\xf5\x99\xf2\x9d\xb4\xd4\xc8\xd7\x40\x28\xc1\x7d\x8b\x22\x8e\x7e\x2f\x82\x46\x9d\x44\xc8\x07\x7e\x51\x42\x74\x51\x23\x22\x84\x91\x3b\x31\xf5\x34\xe2\x72\xfc\x02\x33\xe7\xfe\x8b\xe4\xf7\x29\x03\xa4\x70\xd3\xa2\xae\xed\x68\x45\xc4\x25\x08\xec\x72\x3a\xb6\x43\x4f\xae\xa9\x7f\x6d\xd3\x11\xc1\xb5\x1d\x36\x13\xe2\x0f\x5d\x42\x98\x4e\xc1\x97\x7c\x5d\xf2\x1b\x1f\xf2\x3c\x39\x8d\x92\xf4\x4b\x3c\xa2\xd5\xf4\x4a\x62\xc9\x2a\xd9\xc1\x1f\x96\x63\xb7\x85\x79\x38\x07\x5a\x88\xde\x2b\xcd\x04\xb3\xe5\x78\x2e\x8d\x40\x14\x68\xc2\xcd\x93\x16\x31\x6b\x3e\x1d\x3e\x5f\x48\xc3\x94\xbf\xce\x6b\xad\x69\x09\x4d\x67\xec\x87\x61\x39\x3f\x87\xb6\x76\xf1\xd8\x7a\x4c\x56\x9f\xca\xcc\x05\x4f\x57\x2f\x15\x1d\xc4\x3a\x7f\xf0\xee\x0c\x74\x16\x0c\xb6\xb8\x77\xf2\xb6\x71\xfe\xe9\xdd\xc1\x19\xe8\x48\xb3\x28\x55\x17\x8f\x9b\xd0\xd8\x9b\x83\x97\x07\x6f\xf7\x39\x90\xa7\xab\x97\xa5\x8e\xed\x84\xd4\xd7\x0e\xf7\x19\x3f\xc7\xb6\xa9\x98\xe1\x18\xa2\x3f\x6f\xab\x9b\x4d\xec\x90\x9c\xca\x19\x44\x48\xd2\x8a\x13\xfa\x2f\x1c\xab\x64\xcc\x43\x48\x37\x8f\x8b\x95\x19\x64\x32\xe2\x36\xa4\x04\x25\xe2\x54\x24\x8d\xb4\x58\x92\x58\x60\xae\x60\x92\xd1\xb5\x11\x0b\x20\xc0\xbf\x57\xfc\xc8\x8c\xa5\xd4\x8c\x18\x89\x9d\x33\x43\x46\x72\x01\x68\x06\x8d\xe4\x84\xbf\xb7\x58\x91\x4d\xef\x86\x1b\xec\xaf\x54\xb4\x3c\x93\xaf\x78\xba\x9e\x15\xcc\xa9\xa6\x45\xb9\xcb\xe8\x52\x62\x5c\x3b\x5d\x83\x96\x5c\x93\x1c\xca\x6e\x81\x28\x71\xd0\x37\x4c\x2f\xb3\xbb\xeb\xdd\xe4\x33\xe2\x16\x69\x50\xa6\x8b\x3c\x26\x0b\xce\xd5\x5e\x97\x86\xac\x44\x4a\x23\xfc\x6b\x34\x34\x8e\x18\x25\x35\x64\xba\xc3\x88\x18\x33\xc6\x60\xe8\x47\x2c\xde\x44\x4a\xe1\x28\x1a\xc5\xf0\x95\x19\x53\x49\xc2\xfb\x6d\x07\xe3\x49\xa9\xaa\xec\x4d\xc1\xf0\x3c\xc4\x9c\xd4\x22\x13\x92\x6c\x58\x26\x78\x52\x75\xef\x62\xb1\x8d\x78\x6d\xa6\xd8\x64\xd1\x8b\xcb\x71\x91\x68\x2b\x9d\x74\x91\x82\xe8\xd0\x11\x21\x65\x76\xfc\x20\xc7\x1a\x7b\x43\x2d\xe0\x05\x3e\x1b\x2e\x55\x0e\xdb\xf1\xaa\x78\x41\xec\xd1\xf0\x3d\xd2\x93\xae\x6a\x21\x2f\xf4\xd7\xf1\x50\x2b\x59\x61\x56\x5a\x3d\xcb\x0f\x23\xe1\x74\xd4\xbb\x58\x49\x35\xc8\x5a\x51\x39\xcc\x8a\x12\xbd\x77\x1e\xa3\xc3\xb5\x67\xb7\xf5\x24\x78\x84\x5c\xeb\x1f\x0c\xcf\xd1\x47\x98\xb3\xe8\xf6\x96\x20\x69\x4b\x90\xf0\xcc\x0c\x93\x73\x7b\x4b\x22\xdf\x50\xe9\x65\xaa\x3a\x7e\xf0\x11\xbf\xe4\x5a\xea\x23\x54\x8b\xfa\x57\x72\xea\xb3\x55\xb1\x05\xd1\xd8\xc1\xa0\x43\x8c\x1a\x7b\x2d\x08\x1d\x09\x7c\x00\x17\x1e\xde\x8d\x18\x78\x35\xcf\x6e\x6f\x15\xf7\x96\x15\x8f\xb2\x3f\x4e\xa1\xef\x3c\xf3\x61\x3e\xaf\x8d\xc4\xed\x2d\x9b\x08\x2b\x0c\x66\x09\x6a\x17\xe0\x9e\xf3\x2e\xd3\x8f\x93\x03\xd4\x3a\xe1\x8b\xe4\xdd\xdf\x45\x3e\x42\xce\x0f\x4f\x9e\xf0\x5f\x9c\x22\xac\x3d\x72\x07\xe6\x3c\x88\x4d\xac\x1c\xd0\x1b\x8b\x65\xb8\x54\x26\x0e\x63\xe8\x0d\xd2\xc6\x43\x7c\x8a\x0e\x22\x66\xcb\x4b\xab\xa5\x7d\x4d\x1c\xc6\xc8\x24\x61\x94\xe0\xc9\x89\xe3\xa3\xd6\x48\x1f\x36\x21\x63\x22\xe3\x76\x2d\xc6\x2d\xf4\x06\x72\xd8\xf8\xb4\x10\xe3\xc6\xa0\x96\xb0\xfe\x34\x23\x27\xe6\x44\x1c\x6f\xec\x2a\x0e\xa1\x48\x88\x19\x1b\x1b\x4e\x0f\x6d\x10\x01\xb5\x58\x39\x46\xed\x89\x43\x28\x94\x0c\x7e\x1a\x07\x36\x1f\x8c\xb3\x8a\x80\x65\xfa\xca\xa3\x96\xa7\x14\x09\xaa\xaf\x5f\x09\xeb\x4f\x75\xfa\x05\xa8\x3a\xe5\x0a\x54\xd5\x97\x20\xd5\x9e\xe7\x32\x24\x70\x91\x35\x44\x75\x49\xff\x62\x2e\x5a\x50\x88\x27\x38\x83\x30\xf9\x4f\x9e\x90\xe8\x3b\xe0\x1f\x6f\xe8\xb6\x6d\xb7\xbb\xe7\xd8\xd4\x0d\x4f\x69\x2b\x8c\x86\xd7\xd4\xf8\x6d\x62\xdd\x7c\x21\xe2\x14\x0f\x66\x0e\x56\x33\xc8\x4b\xc1\x80\x42\x02\x03\x85\x90\xdf\x60\x67\x71\x7b\x4b\x8c\x72\xc8\x87\x58\xf0\x15\xe7\x49\x28\x99\x10\x49\x30\x31\xf2\xaa\xae\xb7\xc9\x86\x8b\xd1\x02\xaf\xd4\x92\xcc\x9b\xd4\x4a\xdc\x15\x49\xd4\xd2\x48\xfd\xb1\x9e\xe9\xa4\x8f\x7e\x27\xc6\x90\xb1\x3e\x19\x5e\xe0\x7a\x98\xc3\x89\xbe\xf5\x92\x99\xd8\xde\x67\xa5\xc2\x88\xa5\x18\x07\xdf\x4d\x17\x8e\x36\x49\x95\x25\x89\xea\xec\x84\xfe\x4f\xea\xbd\xd1\x77\x90\x77\x7a\xe7\x55\xd7\xa7\x08\x84\x3b\x47\xd8\x44\x46\x00\x31\x35\x13\x42\x25\x56\x53\x75\x9d\x96\x3c\xcc\xe0\x25\x4b\xe2\x58\x40\x2b\x34\x32\xf4\x8e\x6a\x9c\xb3\x7a\xa6\xba\x51\xe5\x9c\x65\xc0\xc0\x59\x04\xfe\xb6\x3a\x28\xed\xb5\x81\xb8\x37\x0c\xb5\xd2\x52\xcc\x49\x88\xd9\x79\x7d\xf9\x5a\x3e\x12\xcb\x34\xc4\x04\x4b\x48\x14\xdc\x93\x0b\x02\x96\x58\x92\x7c\x20\x96\x9a\xa8\x3a\xa9\x23\x5c\x28\x1a\xdd\x2a\x44\x83\xa7\x2e\x72\xa8\x21\x51\x8d\x44\x34\xd0\xb9\x4e\xf3\x53\xcd\xf9\x14\x56\xb8\x60\xc5\x81\xed\xd4\x0a\x47\x2c\x67\x46\x74\x1b\x3b\xb4\xa6\x91\xd6\xf4\x47\xef\x18\x6c\xd6\x89\x44\x6b\xc7\x3f\xe4\x34\x43\xc6\x9a\xa1\xdb\x23\xdc\xae\xa5\x5a\x4e\x3e\x23\xd3\x42\x87\xf3\xa2\x86\xef\x7a\x64\x5b\xd8\xa5\x10\x13\x0e\xa7\x6e\xfa\x1e\x40\x95\xc9\xdb\x21\xed\x17\x35\xf5\xd9\x9c\x38\x52\xd5\x67\xc5\x4a\xba\xba\x6f\x2e\x2c\x89\xca\x25\x5b\x5d\x26\x9e\xbe\x24\xdc\xe3\x5d\x3c\xee\xc0\xe1\x8b\x30\x0b\xc0\xd3\x17\x0d\x03\xae\x92\x24\xed\xb1\x62\x93\xae\x46\x62\x15\x15\xf5\x13\x22\xe1\xeb\x3d\xe9\x79\xbe\xfd\xcd\x73\xc3\x88\xa2\x9c\xd0\x16\x9f\x4f\x5a\x53\x72\x6a\x29\xd2\x26\xb4\x9b\xbd\xc9\xbb\xc4\x19\xc3\x3f\xe2\x39\x00\xc4\x26\x98\x3c\x6f\x2e\x1e\xcb\x33\xa6\xc7\x97\x32\xba\x4f\xb5\xc4\xf3\x0e\x89\xb8\x05\x08\x33\xa7\xbe\xcb\x40\x01\xfc\xb8\x43\x26\x12\x9f\xf5\x8a\xbb\x64\x99\x49\x5d\x66\xae\xcd\xd3\xea\x14\xe7\x69\x99\xf1\x3a\x86\xf4\xd4\xe5\xcf\x7c\x9d\xe0\xb9\xf8\xf4\x2d\xe6\x5c\x80\xb8\x01\xd1\x92\xb1\x03\x5d\x10\xd2\xe8\x1e\xb0\xe9\xdd\x07\x22\x76\xcb\x73\x31\x2b\xf7\xc2\x60\xce\x79\x5a\xa4\xf9\xd8\x2d\xaf\xce\xa1\x61\xfc\x71\x3a\x2f\x00\xef\x42\x97\x02\x45\x4d\xba\x21\x7f\xc1\x36\x75\x21\xf0\x7c\x8b\x5e\xc4\xcc\xe8\x10\x61\x12\x84\x37\xc2\x37\x36\x53\x0b\xb5\x03\x29\xd7\xe5\x56\xac\x28\x37\x93\xd8\x8e\x4a\xb6\x38\x73\x03\x18\x06\x00\xa5\x21\xec\xd8\x16\x62\x01\xc2\xb7\xee\x0b\x02\x11\xbb\xcc\x05\xc1\xf8\x0b\xce\x0d\x26\xc5\x81\xbe\x03\x6b\xec\x78\x56\x7b\x2e\x50\x2a\x77\xd6\x42\x63\x23\x13\x80\xcd\x8e\x80\xcb\x63\xef\xd8\x73\x76\x40\xd4\x0f\x17\x9b\xdb\xf7\x73\xad\x54\x80\x41\x81\x51\xe9\x78\x7e\xdf\x0a\x43\xcc\x48\x38\xd7\x2a\x53\x84\x90\x25\xc7\xde\x30\xa0\x07\xee\x3d\x01\x7a\x43\xad\xeb\xf9\xc8\xa4\x00\xed\x39\x76\xeb\x6a\x41\x18\x6a\xc3\x36\x37\xa0\xa5\x3b\x4d\xf5\x88\x47\x45\x52\xcb\x46\x65\x5d\x97\xd6\x86\xcc\x55\x52\x56\xca\xca\xb8\x60\x14\x72\x6d\x49\xdc\xba\x54\x0b\x70\xfe\x85\x8d\x83\x95\xb4\x34\x00\x13\x97\x7a\x68\x34\x4a\x9e\xae\x26\x19\x92\x5e\x3c\xb6\x1e\x5f\x92\x1d\x92\x57\x57\x68\x11\xd3\xd4\x4c\x7f\xce\x1f\x6d\x9a\xfa\x20\xb6\x99\xe5\x7b\xb0\xcd\x2c\x2f\x66\x9b\x59\x79\x40\xdb\xcc\xca\x7d\xd9\x66\x56\xee\xc1\x36\xb3\xda\x68\xaf\x35\x40\x5c\xa7\x8f\x22\x78\x56\xcf\x65\xf7\xa9\xc2\xb5\xa6\x42\xaf\xde\x07\xec\x05\x88\x68\x02\x9a\xdb\xfa\xf4\xa1\x0d\x5c\x37\x66\xb4\x0a\xfd\x69\x13\xfa\xd3\x26\xf4\xa7\x4d\xe8\xbd\xda\x84\xfe\x34\x09\xfd\x69\x12\xfa\xd3\x24\xf4\x2f\x66\x12\xba\x37\xf4\xaf\xa9\x6e\x11\xca\xe6\xef\xd9\xa7\xe3\xdd\x93\x37\x8d\xc3\xfa\xde\xf9\xc9\xe9\x11\x98\x06\x32\xb5\x3f\x18\xf7\x9b\x9e\xb3\x67\xfb\xad\x49\x87\x72\x4a\x27\xba\x78\x3c\x84\xdd\x9c\x5e\x17\xcd\x12\xf9\x1b\xdf\x0b\x82\xe9\x81\x5d\xeb\xc0\x20\xa6\xa7\x06\x6b\xdf\xb6\xfa\x9e\x3b\x61\xaf\xab\x43\x1b\x69\xd0\x78\x65\x80\x27\xfb\x7a\xf6\xe7\xd0\xf2\x67\xe8\xeb\x8d\x06\x10\xeb\xea\xf8\x9d\x85\xd6\x84\x8d\xa6\x0e\x6b\xac\xc3\x0a\x2d\x5f\x87\x74\xee\xdb\x96\xdb\x9d\x65\x14\xbe\x69\xd0\x44\x6d\x1d\xe2\xc7\xf1\x0c\xc0\xea\x1a\xb0\x8f\x63\x80\xb3\x74\x87\x3a\xd3\x69\x7d\xff\xa8\xfe\x56\x44\x09\x78\x77\x44\x56\x49\x65\xab\xcc\xd7\x85\x2e\x0d\xcf\xa0\xd2\xa1\xc5\xe6\xd6\x58\xd7\x28\xa2\xdf\x34\xa3\x51\xf0\xa6\xe5\x27\xdf\xd8\x68\x8e\xcb\x80\x52\xe0\xd8\x2d\x9a\x2f\x17\x49\xa5\x50\x0a\xbd\x0f\x03\xc6\xf0\x56\x40\xf3\x05\xb3\x40\xc5\x38\x91\x8f\xb2\xf7\x05\x03\x7e\x89\x41\x59\x17\xe1\x69\x65\x62\xdb\xb2\x9c\xd6\xd0\xb1\x42\x5a\xf7\xa9\xc5\x76\xca\x7a\x4f\x63\x1f\xf3\x81\xfd\x8d\x16\x21\xee\xde\x39\x48\x20\xd5\x75\x90\x16\xfc\x3d\x5e\x6e\x40\x44\xf5\x88\x0d\x32\x2b\x21\x8d\x10\x83\x91\x1d\xb6\x7a\xba\xd1\x2d\x21\x2d\x2b\xa0\x24\x07\x41\x70\x73\x35\xf3\xee\x62\x83\x3c\xc5\x88\x7f\xfc\x9f\x55\xf2\x7c\x5b\xab\xd3\xc6\x69\x11\xad\x55\x2e\xc5\xeb\x61\x04\x8c\x3f\xfd\x10\x3d\x68\x25\x88\x00\x26\x42\x14\x82\x56\xd7\x28\x1c\x5a\xbe\x2c\x6a\xda\x2e\x20\xcf\xee\x90\xca\x16\x79\xca\xf9\x4c\x33\x50\xe0\x60\x2b\xa5\x6a\x14\xb3\xa7\xdc\x72\x21\xb4\xdc\x3c\xc0\x28\x90\x15\x62\xbe\x21\x4f\x49\xb5\x40\x9e\xe2\xdb\x81\x37\x8a\x56\x28\x92\x6a\x21\x72\xc1\x8d\xe8\x86\x7c\x2a\x45\x7b\xa7\xd3\x22\x46\xa8\x75\xbd\xc3\xa3\x71\xac\x72\xbe\x5a\x21\x2b\xa4\x52\x16\x08\x71\x38\x71\x40\x5b\x08\x48\xc4\x40\x4a\x40\xe1\xdd\x51\x72\xeb\x77\x92\x55\x71\xd2\x05\xd3\x58\x5c\x27\x6d\xd3\xa6\xb1\xb8\x9e\xd9\xe0\x9a\xe3\x94\x61\x71\xcd\x4b\x48\x7b\x81\x64\x33\x6a\x5e\x4a\x5c\x60\x8b\xeb\xeb\x89\x86\xca\xbc\xde\x34\x26\xca\xa2\x89\x02\x37\x4f\x46\x08\x72\x3f\x57\x48\x31\x0e\x96\x3d\x8c\x5e\x03\xbf\xb3\xc2\x9e\x4a\x11\x8b\x81\x3a\x09\x79\x4a\xf6\x84\xd0\x00\x37\xfc\x81\x15\xf6\x08\xd3\xf4\x70\xf5\xc6\x22\xff\x15\x17\x9c\x18\x9b\xe0\x0e\x4a\xf1\x8f\xab\x69\x57\xca\xac\xbd\xa8\xd5\x45\xb6\x19\x69\x80\xe2\x4c\x64\x4d\x63\xa2\x2b\xf2\xf5\xdc\xc8\x97\x26\xc5\x9a\x6e\xed\x13\xcb\xa8\x66\x18\x49\x04\x91\x45\x22\x79\x6d\xd8\x8e\xd5\x98\x86\x89\x4d\x41\x1e\x6a\x82\x1c\x79\xb7\x00\xe8\xe4\x0d\x14\x0a\xd0\x89\xfc\x94\x82\x3b\x66\x2f\x81\xb0\x32\xec\xa6\xe7\xb0\x8c\x99\x64\xff\x12\x4b\xd1\x58\x4d\x4e\xcc\xd8\xba\xd1\x4b\x18\xb9\x34\x5a\x63\xfd\xd3\x38\x95\x07\xaa\x25\x14\xe2\xba\x61\x01\x03\xbb\xb3\x43\x96\x5b\x37\x4c\xcf\x66\x90\xe0\x69\x0c\x5a\x37\x54\x66\xcf\xec\x17\x9c\xa4\x46\x84\xf8\x0c\x47\x9b\x31\x03\x93\xdc\x00\x66\x90\x69\x42\x38\xb5\x39\x83\x79\x11\x71\x05\xdc\x01\x33\x9e\x06\xd4\x65\x9b\x60\xcf\xad\x87\xa1\x6f\x37\x87\x21\x0d\x90\x61\x34\x4b\x8f\xb9\x1b\xa2\xd0\x10\xfa\xcd\x1c\x5c\x53\x37\xcc\x6c\x24\xc5\x56\x66\xd6\xc3\xbe\x7c\x21\xaf\xcc\x6b\x90\x47\x83\x9c\x96\x0e\xc4\xc8\xad\x19\xfa\x96\x1b\x74\x3c\xbf\x5f\x63\x8b\x9e\xe5\x06\x6c\x1e\xe4\x99\x1e\xd6\xba\x21\xcb\x24\x57\x24\xf0\x7b\xcc\x7e\x17\x0c\xeb\x9c\x76\x4d\x1a\x1d\xa1\xb0\xd1\x6c\xc6\x0a\x73\x59\x54\x70\xe1\x99\x6d\x52\x51\x9e\xd1\xa4\xe2\x4c\x12\x20\xc9\xa6\xc2\xe0\xa6\x59\x47\xb7\x05\xa3\xfb\xee\xf4\xe0\xec\xe0\xed\x79\xfd\xfc\xe8\xe4\x6d\xa3\x7e\x7e\x7e\x7a\xb4\xfb\xe1\x1c\xaf\xb6\x70\x48\xa7\x1a\xca\xe4\xc3\xef\x92\x25\x43\xf7\x4f\xbe\xad\x4b\x05\x21\xaf\xb6\x41\xa3\x85\xd4\x92\xa0\x31\x16\x95\x1a\x58\x94\xea\x1c\xcf\xa3\x08\xd9\x13\x85\x12\x54\x44\x75\x06\xaf\xa6\x5b\x37\x73\x21\xa1\xd9\x5b\x8c\x17\x04\x10\x4c\xb0\x6c\x98\x12\xc4\x24\xcb\x86\x89\xf4\x04\x95\x9d\x13\x91\x86\xd4\xcf\x5d\x16\x96\xee\x0a\x99\x37\x6c\x3c\x69\x88\x18\x09\xd9\x99\x67\xeb\x26\x56\x08\x5b\xde\x9e\xdd\xd7\xe5\x99\xa6\x38\x45\x6e\xcf\x32\xa3\x69\xfe\xe8\xdb\xb3\x46\xe0\xb7\x1a\x96\xdf\xca\x08\x53\xc1\xaf\x47\x86\xee\x30\xa0\x6d\xd9\x84\x4f\x39\x1d\x2c\xbf\x85\x1d\x9a\xe3\x16\x8a\xb7\x4e\xad\xd4\xe6\xd7\xa2\xf1\x64\x64\xbb\xf9\xa6\x0d\xd6\xd6\x05\x73\x24\xd4\x95\x4b\x3b\x9f\x48\xcc\xc7\xd6\x63\x65\xcb\xab\xc7\x3d\x9c\x12\x51\x18\xe1\x6d\xb0\xd6\x9d\xeb\xb2\x0b\x40\x39\xb6\x9b\x7e\xdb\x55\x2d\x97\xef\xbb\xcf\xfd\x99\xfb\x6c\x20\xba\x58\x9f\xd7\x10\xd4\xc0\x4e\xef\xf2\x66\x65\x3d\x9b\xcb\x06\x36\x9d\x93\xcb\xd6\xd5\xe0\x9d\x5a\x6d\xdb\x72\x32\x90\xd8\x9c\xc4\xea\x02\x06\xc7\x25\xad\xa0\x0f\x85\x98\x8e\x3b\x27\xd2\x1b\x8a\xfa\x13\x90\x5e\xab\x6c\x65\x23\xad\x60\x4c\x85\xf4\x1b\xdb\x9d\x97\xd2\xcf\xf8\x38\x7b\xb6\x1b\x4e\xc4\xfa\xf9\x84\xf1\x56\x40\xe6\xc4\x66\x53\x92\xf0\xaa\x61\xbb\x6d\x7a\x93\x31\xee\x93\x49\x78\xf5\x4a\xda\x65\x4c\x20\x23\x2b\xfc\x07\x37\xd1\x98\xa2\xe8\x42\x7d\xdc\xc2\x3e\xa2\xe6\x99\xd1\xbf\xe7\xf7\x2d\x4f\xc2\x99\xe5\x49\x04\x55\x53\xa2\xa4\x11\x88\xab\xd4\x73\x52\xe7\xb9\xd1\x24\x2a\x02\xe9\x1c\x59\xad\xdc\x37\x91\x86\x33\x13\x29\x19\xe3\xc5\xa4\x6f\xa5\x6c\x02\x65\xfa\x68\x06\x15\xaa\xf7\x4d\x85\xeb\xd9\x97\xdb\x44\x8c\x17\xa4\x42\xc5\x80\xc9\x95\xf1\x0c\x3a\xac\xdd\x37\x1d\x46\xb3\xd3\x21\x05\xe7\x05\x29\x51\x35\xa0\xe2\x5e\x24\x83\x10\x1b\xf7\x4d\x88\x9b\xd9\x09\x91\x8c\xf2\x82\x74\x58\x33\x81\x86\x56\xba\xc9\xcc\x5a\x75\xfd\xbe\xa9\x30\x9e\x9d\x0a\x49\x08\x2f\x48\x83\x75\x03\xa4\xd8\x85\x66\xd0\xe1\xde\xb5\xf1\x6f\xb3\xd3\x21\x0d\xe9\x05\x69\xb1\x61\x80\x1d\x8d\xb3\xc8\xb0\x79\xdf\x64\xa8\xcf\x4e\x86\x04\x7c\x17\xa4\x00\x57\xe0\xe0\x48\xbc\xd1\xb4\x02\x3b\xd8\x73\xbc\x80\xa6\x8b\xc9\xcd\xea\xbd\xef\x54\x5a\xb3\x13\x22\x1d\xed\x05\xe9\xb1\x19\x03\x7c\x32\xa0\xe9\xa1\x4f\x37\xef\x5f\x85\x68\xcf\x4e\x8d\x34\xa4\x17\xa4\xc5\x56\x0c\x6c\x86\xf5\xdf\xbd\x4b\x89\xe6\xec\x74\x48\x42\xf8\xe2\x71\x73\x11\x1a\x3c\x37\x40\x0e\xdd\x76\x86\xa8\xdc\xac\x4e\x38\x37\x01\x28\xbb\x00\x64\x4e\xfd\xb6\x5a\xd6\xf1\x69\x59\x7e\xdb\x76\x2d\x67\xc2\x94\x5d\xab\x4e\xd8\xec\x00\xb4\x3d\x03\xd8\xbc\xf8\x55\x92\xf0\xcb\x9c\x42\x6b\xd5\x09\xfb\x42\x03\x3b\x06\x6a\x5e\xdc\xaa\x49\xb8\x65\xb0\xf4\x84\xa3\x01\x03\xaf\x79\x71\x5a\x33\x71\x0a\xfb\x43\xc7\x39\xf5\xfa\x13\x85\xf0\xda\x54\xb8\x99\xe0\xe6\xc5\x71\x3d\x19\xc7\x09\x82\x71\xc2\xe9\x4e\x04\xc3\x45\xc6\x75\x23\x19\xbf\x8c\xc3\xb6\x69\xe6\xa9\xc2\x6d\x5e\xbc\x8c\x45\xca\xb1\x5d\x6a\xf9\x13\xc7\xf5\xde\x55\xef\xce\xec\xc7\x80\x19\x78\x2f\x78\x12\xba\x19\x87\x9c\x31\xff\xee\x5d\x01\xa7\xb3\xd3\x22\x11\xe3\x05\xa9\x60\x2c\x53\x7d\xcf\xf5\x42\x2f\xe3\x68\x78\xf3\xfe\x15\xf0\xee\xec\x74\x48\xc1\x39\x99\x12\x8b\x63\xd8\xbb\x47\x0c\x17\x59\xff\xab\xc6\xfa\xef\x5a\xe1\xd0\xcf\x3a\x4d\xbe\xff\x4d\x82\x3d\x3b\x21\x92\x51\x5e\xf0\x3c\xdf\xd0\x3b\x82\x90\x0e\x32\x88\xb0\x75\xdf\x44\xf8\x3a\x33\x11\x92\xf0\x7d\x28\x5e\xbd\xba\x27\xec\x92\xf8\x74\x71\xec\x9c\x7b\xc2\xae\xb5\x08\xf7\x88\x53\xad\x90\x61\x97\xce\x38\xf7\x7e\x66\xed\xce\xde\x79\x13\xd5\x05\x67\x0d\xd7\x38\xbd\x4e\x27\xa0\x21\xc3\xcc\xca\x38\x80\xdc\x5c\xbb\xf7\x9d\xb5\x37\x7b\xff\x93\x51\x5e\x90\x0e\x6b\x06\xd0\xb6\x7d\x4d\xfd\xae\xed\x76\x33\x48\x51\x99\x70\x4b\xc0\x86\xe7\x04\xc0\xed\x0b\x68\x73\xaa\x69\x6b\xeb\x06\x72\x6e\xd6\x5a\x1c\xf5\x49\x5c\x7c\x84\x06\xb3\x8f\x50\x12\xbe\x0b\x8e\xcf\x86\x01\x32\xb0\x9d\x9e\x37\xa4\x61\x98\xa1\x94\xac\xdd\xfb\xa5\xc1\x9f\xb3\x53\x22\x1d\xed\x05\xe9\xf1\xcc\x00\x3c\xb2\xbb\x59\x27\xa4\x9b\x6b\xf7\x7e\x71\xe0\xcf\x4e\x8b\x64\x94\x17\xa4\x03\xd7\x7e\x3d\xbf\x4d\xfd\x86\x15\xb4\x28\x74\x27\x63\x63\x35\x61\x5b\x8a\xd3\x96\x41\xab\x0b\x60\xf3\xce\xda\x2d\x1d\xb5\x36\x9d\x88\xdb\xe6\xda\x84\x0d\xa9\xc2\x6d\x9f\x2e\x8a\xdc\x73\x1d\x39\xdb\x0d\xec\x36\x3d\x19\x66\xe4\x85\x59\xdb\x98\x16\xb7\x23\x01\x6c\x5e\xd3\x88\xb2\x8e\x5a\xa6\xb0\xab\xdc\xbf\x4d\x4a\x30\x33\x5f\x27\xe1\xbb\x18\x53\xaf\x57\x74\x88\x3e\xbd\xa6\x7e\x90\x35\xb9\x9f\x4d\x3b\x34\xa7\x08\x4a\x78\x85\x91\xd5\x55\x02\xb9\xe5\x74\xd3\x10\x3b\x20\x6d\x3a\xf0\x69\xcb\x0a\x69\xfb\x51\xac\x0c\x58\x62\x44\xca\x4c\xfd\x67\xd8\x9c\x55\xcb\x99\x69\x81\x7f\xb4\xcd\x59\x7b\xad\x31\xb0\xc2\x5e\xfa\xc2\x3a\x67\xda\xa2\x4a\xa3\x01\x6e\x87\x56\x46\xd6\xa5\x67\x73\xa6\x27\xab\x36\xe6\x3c\xa8\x98\xc1\x48\x0a\x6c\x5e\x32\xe4\x29\xb8\x60\xe1\xe0\xce\x69\x94\xa8\x4f\x37\xee\x15\x76\x93\x99\xb4\x40\x61\x25\xbc\x54\x6e\x84\x7b\x1f\xfb\x1b\x4f\x5d\x19\x03\xd2\x8c\xf5\xca\x22\x2c\xf0\x14\x1e\x07\xc6\xc8\x26\xfa\xcb\x84\xfe\x50\x59\x5b\x43\xe8\xb6\x9b\x90\xa0\xfb\xac\x7c\xcb\xc6\x2f\x13\xe1\xd8\x20\x27\x25\x83\xe0\xd0\xbc\x61\x38\x18\x8a\x26\x4c\xcf\x1a\x56\x3b\xdf\xb6\x42\x4b\xcf\x66\x60\x2b\x83\x6e\x97\xec\x10\xf6\x59\xe4\x1e\x90\x1f\xda\xda\x4f\x24\x4e\x99\xec\x70\xf7\x58\xf9\xa5\x39\xec\x74\x20\x61\xa0\x74\x14\x10\xbd\x15\xde\xc2\x12\x35\xe8\x4c\x1e\x2b\x4c\x43\x66\x6d\x6a\x8a\x9e\x83\x9b\x0c\x7a\x75\x18\xb9\x14\x54\x10\x82\x1d\xe2\x6e\x93\xe5\x65\x5b\x79\x57\x70\x87\x73\xf2\x1f\x02\xc1\x8b\x79\x57\xf2\x6d\xde\xed\x0b\xfb\xb2\x48\xec\x22\xfc\x2e\x14\xc0\x8d\x41\xf4\x36\x1a\x08\x5a\xa3\xc2\x23\x55\x06\xfb\x57\x62\x64\x3e\x0b\x2d\x3f\xcc\x6b\x01\x55\x21\x9a\xa1\x56\xe0\xc0\x6d\xe7\x23\x6e\x67\x26\x68\x09\x0e\x58\x35\xbf\x7c\x93\x6f\x2b\xec\x8a\x64\x79\xac\x3f\x17\x8c\x74\x0e\x10\x8e\x16\x88\x5b\x90\xb9\xf6\x75\xae\x28\xf2\xb1\x22\xcb\xe4\x31\x38\x97\x0b\x93\x7c\xa8\xcf\xb0\x2b\xdd\x68\xee\x5c\xf9\x46\xc4\x27\x31\x1a\xf8\x82\xbc\xc0\x14\xcb\x22\x09\x7b\xc4\x41\x9d\xbc\x20\x0d\x52\xbb\x8f\xc9\xb4\xdc\x28\x14\x01\xbf\x02\xa9\x91\x1b\xc0\x78\x5b\xa2\x3c\x9e\x15\xe5\xf1\x0f\x47\x79\x1c\x41\x59\x49\x9a\x99\x10\x57\xd5\x1e\x1c\xfd\x47\x8f\x74\xfc\x79\xc3\x91\x5e\x08\xf9\x35\x53\x1f\xa4\xd0\x2b\x4a\xa9\xf8\x88\xa7\xbf\x7f\xf2\x84\xe4\x23\xa2\x82\x17\x29\x68\xb8\xc0\x87\x28\x26\x52\xbe\xce\x84\x4b\x43\x88\x28\xf2\x42\x13\xd1\xc6\x94\x21\xb5\xa8\xf4\x52\x05\x75\x0a\xf1\xb7\x0a\x2f\xde\x2c\xfb\x9e\x98\xb1\xbe\x5a\xae\x3c\xbc\x0a\x24\x34\x62\xbb\xdf\x1f\x42\x28\x83\xc2\x84\x05\xf9\x66\xde\xea\x4d\xa8\x3e\xde\x56\x11\x28\x6e\xf2\x03\x23\x3f\xd0\xe0\xa2\x7c\x09\x39\x67\x65\x89\x71\xac\x44\x05\x4b\x44\x29\x55\xfd\x0b\x52\x0a\xa4\xf3\xbc\x3e\x0e\xfd\x4c\x6d\x73\x6b\x7e\x6d\x73\xba\x6b\xe3\x25\x6d\x10\x70\x95\x09\x7b\x56\x58\x24\x37\x45\x32\xd6\x14\xb1\x0a\xb8\x22\x5a\x61\xa9\x71\x23\x03\x92\x8f\xd5\xcb\xb1\x7c\x79\x53\x55\x25\xab\xb2\xa4\x7a\x39\xae\xc2\x94\xc0\xb0\xf7\xec\x85\x53\xae\x34\x2c\xf2\xdb\x34\x44\x12\x11\x88\xe9\x20\xb0\x1d\xcf\x05\xe9\xa4\x69\x31\x16\xd9\x21\x55\xf2\x94\x28\xb8\x55\x8b\x2c\x93\x35\xe3\x95\xa5\x9e\x2a\xd5\x06\xfb\xae\x9e\xaa\x96\xa9\x07\xc5\x6b\x1a\x38\xeb\x55\x2d\xbe\xfa\x02\xa1\xf2\x37\x15\xf2\x94\x58\x64\x45\x10\xa2\x6c\x34\x5a\x55\x55\x6f\xa2\xf8\x16\xc8\x2a\x71\x11\x14\x90\x37\x3f\x36\x41\x8d\x53\x41\x8d\x53\x41\xdd\x45\x08\x5e\x5d\xbb\x27\x82\x37\x4d\x82\x57\xd7\x62\x04\x87\xa6\xa6\x23\x78\xdf\x24\x38\xaf\x69\xe0\x9c\x48\xf0\x2a\x10\x9c\xa1\xd1\x54\x64\xad\x44\xb1\x5a\x61\x7b\x03\xa3\x65\x46\x9e\x3e\xa7\x34\xc0\x18\x9b\x30\xc6\x09\x30\xc6\x69\x30\x80\xc4\xf8\x85\x4b\xff\x52\x93\x7e\xb3\xa9\x0f\xf1\x57\xce\xbd\xfc\x4d\xa5\x48\xc6\x95\x22\xb9\xa9\x16\xc9\xb8\x5a\x54\x33\x44\x8e\x5e\xc1\x14\x88\xea\x52\x5f\xac\x32\x45\x62\x39\x83\x1e\xd7\xdb\xc1\xe5\xb2\xa1\xd6\x1f\x6d\xcd\xc1\x4f\x50\x16\x12\xb6\x0c\x7a\x16\x80\x56\x10\x8d\x00\x3a\x0c\x9a\xe5\x53\x0b\xb4\xd5\x1a\x89\xec\xc2\x04\x38\xb6\x76\x81\x56\xbd\xc4\xa3\xa3\xb3\x2a\x07\x6e\x7b\x52\x85\xb7\xd6\x5b\x59\x45\xea\xc4\xa9\x95\x6e\xca\xc2\xe3\xb9\xc1\x25\x0e\xfc\xac\x92\x1d\xad\xd0\x58\x15\x1a\xab\x42\x30\x86\xbc\x35\x89\x03\x4c\x53\x51\x02\xd9\x4f\x3e\x01\x47\xed\x44\x4a\x57\xcd\xe2\x55\xb3\x7c\xd5\xac\x00\xe2\xd2\x20\x0a\x57\xea\x13\xfa\x27\xa3\x76\xa8\x9a\x6a\x3f\x01\x91\x22\xaa\x35\x73\x50\x61\x87\x70\xee\xe5\x05\x0d\x8a\xb2\xa3\x85\x6d\xd2\xf4\xa9\x75\xb5\xad\x57\x5f\xe3\xd5\x85\x0c\xcf\xae\x74\x27\xf7\x08\xda\x68\xdd\xde\x1a\x8f\x8f\x76\x78\x0a\x2d\xa3\xb7\x3b\x3b\xa4\x52\x28\x44\x50\x6d\x39\x5e\x40\xd1\xfb\x77\x3b\xce\x03\x15\x90\x5e\xe2\x85\x24\x16\x00\xd4\x48\xa5\x56\x1c\x02\x1b\xff\x65\xf6\x82\xfd\x3b\xd6\xf6\x93\x89\xf4\x83\x15\xaa\xba\xa6\x33\xcc\x0a\x31\x7c\xdd\xc7\xda\xd7\x31\xfb\x3a\x16\xc4\x33\xb8\x41\x8b\xc7\x61\x8e\xba\x8a\x1c\xc2\xda\x79\x0a\xad\x2d\x03\xd4\xa7\xec\xff\x8b\xfa\xa4\x8b\x6c\xc4\x26\x8f\x7c\xb9\x16\x61\xa8\xca\xb6\x4e\xc0\x17\xc9\x7c\x81\xe4\x8a\x32\x4d\xdf\xbb\x96\x1f\x93\xd8\xa4\x12\x6d\xab\x9a\x54\xaa\x1a\x2d\xb5\xb6\x4d\x56\x57\xc9\xc0\xf7\x5a\x94\xb6\xd5\x11\x09\x84\x25\x21\x8a\xe5\xb8\xda\x10\x61\xb5\xec\x19\x59\x4c\x9f\x9e\xd1\xb9\x1c\x9b\x9d\xc5\xac\xb9\xba\x9d\x26\x58\x8a\x49\x22\xa6\xa8\x09\x1b\xdc\x56\x26\xca\x9b\x62\x92\xe4\x29\xea\x32\x68\xac\xe2\xaf\xc4\x0f\x63\xe3\x27\x62\xa0\xc7\x61\x29\xa9\xa3\xf1\x52\x5c\xd1\x64\x6b\x93\x4a\xb6\xd9\x1a\x06\xa1\xd7\xcf\xcb\xa5\x40\x3f\xdb\x69\xc5\xd6\x8c\xe8\xc6\x07\x16\x85\x17\x10\xaa\x2d\x63\x81\xa9\x41\x81\x29\xb5\x4b\xb1\x65\xd4\xec\x0b\x2f\x15\xc4\xb2\x0a\x90\xa2\xb0\x2b\x89\xc5\x49\xce\x7d\x6d\x65\x53\x99\x57\xb1\xa7\xcb\xf8\x2d\xb6\x9b\x52\xe0\xd8\x9e\x2a\x5f\x2e\x6d\x14\x92\x76\x56\x6b\x7f\xa9\xfd\x02\x6e\x8d\x82\x61\x7f\xde\xdd\xc2\x14\xf7\x20\xf7\x71\x04\x1b\x50\xdf\xa6\x81\xd2\xff\x83\x61\x3f\x60\x88\xc3\xeb\x52\xdf\x1a\xe4\x83\x61\x1f\xc6\x84\x8f\xc6\x14\xc7\x77\xda\x9d\x48\xec\x88\x81\xb7\x57\x0a\x3c\x3f\x54\x58\x58\x45\xd2\xd4\xee\x5e\x18\x12\x17\xd6\x25\x04\x55\xec\x07\x17\x4d\x7e\xb3\x02\x1b\x6a\x39\x07\x82\x61\x3f\x8e\x3d\x5b\xa4\x8b\x10\x9b\x74\xa5\x52\x04\xd5\x9e\xf7\x44\x24\x58\xbd\x66\x5d\x19\xf5\x6c\x87\x92\xfc\xf2\x32\x9c\x0e\x16\x30\xdb\x1b\x5b\x80\xb0\xf0\x85\x7d\x79\x51\xb9\x2c\x90\x80\x2c\xef\x60\x05\x81\x57\xe2\x46\x75\x3d\x8b\xf1\x38\xe9\xd3\x99\x0d\xd4\x6b\x2b\xa0\x47\xc1\xc1\x9f\x43\xcb\xd9\xa7\x74\x90\x7a\xef\xb3\xc9\xcf\x96\xed\x00\x47\xe1\x8d\x7d\x45\x53\x0a\xaf\xaf\x73\x9f\xff\x25\xf2\x94\x9c\xf7\x28\xb4\xc1\xf8\x0f\xa3\xab\x40\x00\x14\xe2\x75\xc8\x97\x46\xc9\xc6\x96\xbf\x30\xb2\xb4\x7a\x24\x18\x0e\x00\x65\x32\xb0\xfc\xd0\xb6\x1c\xc8\x29\x6a\xf9\x76\xe0\xb9\x01\x03\x66\xb9\x6d\x12\xfa\x56\xeb\x2a\x60\xff\xc0\xfd\x52\x9b\x60\xec\xca\xa0\xb4\x44\x30\x34\xe1\xc0\xb7\xaf\xad\x90\xe2\x6f\xcb\xb7\xfa\xe4\xfb\xd3\x3b\x8c\x88\x03\xd8\xe0\xaf\xd0\xe3\xc0\x69\x29\x52\xd2\x83\xe0\x91\xac\x24\xfe\xca\x2c\xdf\xf4\x3c\x87\x5a\xee\x1d\x69\xda\x61\xdf\x0a\xae\xb0\xbf\xfc\x77\xc7\xb1\xba\x80\x17\x01\xf5\xe4\x83\x0b\x97\x6c\xb4\xad\x75\x0b\x3e\x32\x5d\xe1\x5d\xac\xc7\x7a\x33\x22\x99\xf4\x1d\xb9\x40\x89\x65\x7f\xa3\xfe\x25\x34\x26\x99\x92\x61\x28\xbe\xe9\x84\x33\xf0\xc5\xc1\xbb\x23\x17\x70\x51\x77\x49\xce\xa3\xd4\xfc\x02\xdd\xfd\x02\xa4\xfe\x02\x04\xf8\xa2\x53\x58\x04\x88\x0a\xb4\xae\x9f\xf2\x37\x5f\x42\x9f\xd5\xb4\x3b\x10\x5e\x0a\xe0\x04\x4c\x85\x27\x8c\x33\xfe\x7f\xf6\xde\x7d\xbd\x6d\x1b\xe9\x03\xfe\xdf\x57\x81\x78\xb7\x91\x14\xd3\xb2\x0e\x96\x0f\x72\xdd\x6c\xe2\xb8\xad\x77\x93\x38\x4f\xec\x76\x9b\xd7\xf1\xeb\x42\x24\x24\xb1\xa1\x48\x95\xa4\x6c\x2b\x89\xbf\x7b\xfa\x6e\xe1\xbb\xb2\xef\xc1\xe0\x40\x80\x04\x29\xea\xe0\x24\xed\xeb\xee\xb3\xb1\x88\xc3\x60\x30\x18\x00\x83\xd3\x6f\xae\xb1\x07\x1e\x5d\x60\x7b\xfa\x77\xd8\xd1\xff\xbd\x0e\x98\x91\xb2\x02\x8a\x2a\x56\x21\xb7\xc5\x5a\xc0\x12\x02\xb5\x92\x0a\x32\x3c\x59\xfb\x43\x82\x70\xc7\x9a\x89\x9a\x8e\x90\x29\x35\xce\x03\xdc\xee\x1a\xb3\x49\xd5\xd4\x6c\xcf\xed\xf3\x67\xde\xd6\x4a\x40\xf5\x91\xaa\xea\x2c\x03\x38\x78\xd4\xc3\x59\x61\x69\x87\xde\x8c\x3c\x35\x6e\xd9\xaf\xc7\x8f\x79\x01\x8f\x04\x7f\x82\x19\x9e\x21\xd5\x0d\xcb\xd4\x5f\xc9\x22\x84\x01\x63\x04\xeb\xfe\x75\xde\xfb\xd1\xa1\x9a\xd0\x30\x77\x75\x4a\x0c\x21\x30\x5a\xf0\x0e\xfd\x86\x84\xfd\x20\x1c\x45\x08\xd3\xaf\x8b\xdf\xcf\xf0\x88\xfc\x4a\xb9\xfd\x1f\x12\x06\xbf\x5f\x56\x87\x71\x3c\xee\x6e\x6d\x11\x7b\x84\x37\x5d\x3f\x26\xa1\x0f\x1d\x1e\x7b\xf5\x20\x1c\xb0\xe0\xd6\x4e\x6b\x6b\xb7\xde\xd8\xfa\x47\x44\xec\xcd\x08\x8f\x08\xd4\xf6\x23\x09\x83\x1a\xa5\x99\xe8\x2e\xea\x91\xf8\x86\x10\x1f\xc5\x37\x81\x50\xa8\x38\x40\x0e\x89\x49\x38\x82\xc3\x61\xd0\xb5\x69\x4a\xcb\xe4\x50\xc0\x20\x87\xe1\xe7\x88\x8c\x7a\x24\x3c\xed\xa3\x2b\x16\xe3\xfa\x36\x41\xdb\xf5\x46\xbd\x01\xdf\x36\x8e\xc9\x20\x08\xa7\xe8\x25\xf6\x07\xf7\x3c\x74\xac\xb8\x07\xa1\x7f\x91\x5b\x4c\x07\x57\x5e\x6b\xf0\x10\x07\x0a\x0a\x3e\x3e\x2b\xb8\xd2\x45\x4d\xf0\x3b\xc5\xe3\x98\xa6\xa7\xa2\x68\xec\x55\x9d\xfc\x59\xe5\x4e\x8f\x38\x89\x1a\x64\xdb\xda\x42\x87\x3f\x40\x1f\x32\xa6\x84\x2e\xa0\x24\x04\xde\xd4\x94\x15\x80\xae\xc1\x95\x22\x6a\x90\x86\xcf\xf0\x34\x69\x21\xc1\xd7\xf8\xb5\x45\x17\xe2\x06\x82\xca\x80\x42\xfe\xd4\xfa\x91\xb6\xf7\x9b\x1a\x2e\xa0\xc7\xcf\xee\xb5\x39\x3d\x8c\xfc\x69\xe8\x58\x3b\x4b\xcf\xcd\x03\x12\xbf\xc6\xb1\x7b\x9d\x37\xd1\xee\x88\x49\x39\x0c\x82\x1c\xd8\xfd\x6a\x7b\x9f\x4d\xc6\xe8\xf9\xc4\xf5\xe2\x4d\xd7\x47\x23\x12\x0f\x03\x07\x85\x02\x62\x3a\x82\xdd\x21\x50\xb3\x6b\x12\xba\x7d\x97\x38\x54\x65\x7b\x04\xf9\x50\x78\x9d\xd6\x83\xb2\xf3\x0a\x8f\x19\x8e\x1e\x63\xaa\x4a\x4b\xb5\x50\xe5\x15\x1e\xd3\x86\xcd\x4a\xe5\x15\x1e\x1b\xc4\xb2\xbb\xb4\x58\x46\x78\x7c\x84\xed\x21\x39\xf2\x08\x0e\xf3\x0c\x96\x4e\x8b\xcb\x46\xa4\x7e\x41\x3c\x12\xe7\x49\x72\xb7\xb3\x9f\x4a\xfe\x13\xc9\x93\xe8\xee\x4e\x33\x95\xf6\x67\x1c\xe5\xa6\x4d\xb3\x71\x56\x40\xb7\xad\xd8\x4d\x47\x00\x48\x17\x21\x4c\x73\x22\x9b\x66\x15\xbd\x3a\x0e\x50\x14\x07\x21\x41\x1f\xc8\x74\x93\x69\xea\x18\xbb\xa1\xd9\x02\x52\x60\xa8\xd5\xc1\x0a\xbc\xfc\xdf\xa1\x0b\xe2\xc7\xd4\xec\x64\xa6\x44\x8a\x1e\x0c\x5c\xb4\xe0\xd4\x3c\xfd\x8a\x57\xa5\xca\x33\x27\x36\x30\xa0\x8c\x30\x03\x98\xaf\xdf\xf9\xd9\xd7\x21\xe2\x69\x95\x03\xb0\x06\xea\x8a\x50\x01\xe0\xbf\x26\x76\x16\x6d\xda\xb4\x6c\x9f\x27\x31\x98\x81\xf8\xf7\x9c\xa4\xba\x45\x4c\xa9\x4c\x93\x32\x2e\x20\xe5\xa5\xb2\xbc\x8e\x48\x0c\xcc\x4e\x2f\x1a\x97\x16\x4b\x4e\xad\x6c\xbe\x88\x5e\x5b\xdb\xda\x42\xcf\x1c\x87\xf7\x0c\xa8\xf7\xef\xa2\x92\xbf\xd7\xd7\xc4\x4f\xc5\x5d\x82\xcd\x55\x4f\x53\xc5\x03\x43\xca\x8b\x8a\x03\x7a\x57\xb9\x54\x52\x33\x55\x34\x25\xaf\x0f\x40\x3d\x14\x25\x34\xa6\x1a\x82\xc2\x29\xea\x67\x4c\x15\x69\xb4\xce\x28\x2d\x63\x27\x85\x68\x43\x4f\x2d\x74\x72\x53\xaa\xa7\x82\xf7\x2a\x6a\x26\xfd\x87\x4c\x73\xbb\xc8\xee\x0e\xef\x22\xd4\x4e\x29\x4a\xb8\xd7\x92\x6b\x90\x67\x82\x70\xee\x22\xb5\x69\xea\x4b\x3e\xe3\x88\x2e\x3e\xe8\x04\x1b\xdc\xf8\x0a\x0c\x3b\x78\x89\x20\x61\x3c\x05\x9c\xe8\x08\x56\x28\xac\xc7\xfd\x2e\x7a\xd6\x93\x27\x70\x3d\xed\xc9\x13\xf4\x3a\xf0\x37\x79\x77\x54\xa6\x69\x3b\x20\xa1\xcd\x86\x4f\x61\x33\xa3\x33\x02\x70\xab\x60\x2c\x1d\x9f\xa1\x68\x4c\xec\xf9\x8d\x24\x46\xad\xfe\x81\x4c\x23\x30\x91\xfa\x41\x88\x46\x74\x08\x70\x48\x8c\x5d\x2f\x32\x59\x3c\xcc\xc4\x69\xd4\x9b\xdc\xc4\x49\x59\x40\xd2\xe2\x61\x73\xae\x69\x91\xc0\x2b\x78\xae\x0d\x3d\x7f\x4e\x48\x38\x4d\x19\x32\x7c\x34\x11\x66\x0c\x95\xad\x14\xb4\x2e\x55\x93\xc1\x22\x07\x96\x1f\x83\x80\xed\x65\x3f\x11\x1d\x17\xc3\x46\xa5\x12\x00\xa7\x41\x10\x70\xc7\x73\xff\x18\x04\x6a\xc7\x84\x7d\x44\x69\x2a\x50\x81\x55\x7d\x72\x43\x53\xa9\xb6\xc2\x05\xb3\x48\x7a\x95\x4b\x54\x75\x63\x12\xf2\x35\x29\x5d\x9e\x21\x37\x02\x17\x01\x83\x09\x0e\xb1\x1f\x13\xe2\xd4\x74\x72\x95\xa1\x5b\xd1\x69\x35\x28\xad\x66\xe5\x52\x1f\x26\x21\x31\xb7\xa2\x54\xcb\x43\xd1\x5e\x19\xfd\x54\xef\x2a\x32\xbc\x2b\x3b\x45\x55\xda\x63\x26\x03\x84\x96\x65\xe8\xc1\x85\x40\x7b\x73\x6c\x0f\x3c\x13\x77\x19\x72\xfb\xf0\xde\x02\xdb\x03\xe8\x17\xba\xe0\xa4\xaa\xdc\xcb\xb5\x4d\xa4\xf1\xc1\xaa\x0f\xa8\xc9\x89\x43\x06\xd9\xee\x2a\x41\x3a\x6b\x0d\x89\xfd\x41\x74\x41\x28\x81\x76\xf5\xb1\x74\x4c\x22\xa9\xea\x6e\x6f\xd0\xa1\x5a\x4c\xca\x27\x0e\x2f\x42\x9a\x51\x6c\xa2\x34\x70\x2a\x14\xfe\x24\x3a\x56\x3d\xcc\xa8\x94\x4d\x49\x94\xe1\x8a\x72\x1f\xd1\x55\x80\x58\x8c\xbb\x11\xf2\xdc\x0f\xc4\x9b\xd2\x21\xec\x77\x79\xb3\x44\xac\xcc\x4b\xaf\x77\x92\xc1\x60\xde\xf5\x0e\x65\xa9\xfc\xea\x45\xe1\xdb\xc8\xb0\x05\x3d\x7a\xd6\x42\xe6\xaa\xee\x26\x9a\x57\x35\x5d\x94\x96\x84\xc1\x71\x4c\xee\xea\x42\x25\x73\xd1\xb4\x50\xcb\x42\xed\x4b\xd3\xfa\x82\x35\xa0\xab\xe9\x7b\xaa\x07\x94\xe1\x03\x3d\xcd\xf4\x1b\xe5\x08\x8a\xef\x24\x68\x23\x82\x71\xa3\xc1\xe4\x93\x89\xaf\x67\x2a\xe0\xdd\x85\x54\x68\x3a\xe8\x77\x8f\x4c\x2a\x65\xce\xc2\x3c\x0c\x64\x86\x10\xa5\xd6\xd9\x91\xa4\x59\x78\x7d\x3a\xb5\x4b\xc0\xba\x21\x8e\xd4\x25\x06\xed\x83\xd7\x38\x74\x83\x49\x84\x7e\x67\xae\x9d\x7f\x47\xe2\x4a\x58\xd2\x77\x5e\x3d\xfb\xed\xea\xec\xd9\x8f\xc7\x57\x27\xaf\xcf\x8f\x7f\x3a\x7e\x8b\x0e\xd1\x7e\xa3\xb1\xdb\xdc\xdf\x6f\x75\xb6\x77\xb7\x1b\xfb\xfb\xcd\x54\x57\x77\x48\x4c\x27\xa6\x89\x1f\xb9\x03\x9f\x38\x88\xce\xa6\x03\xb1\xf4\x4e\x08\x87\xe4\x24\xfa\x85\x1d\x33\x6d\xfd\x6f\xf5\x69\xb7\xf1\xf9\xa2\xb9\xb9\x7f\xf9\xde\x79\x52\xfb\xe7\xd6\x8c\xae\x87\x29\x31\xd7\x61\x43\xf4\x26\xed\x88\xcc\xd0\x5d\x60\xc7\x31\xe9\x46\x3c\x1d\x43\x89\xbd\x43\x17\xcc\xaa\x3d\x4c\x0b\x80\x19\xe6\x93\xf1\x98\x84\xa8\x17\x4c\x7c\x07\xec\x12\xc1\x91\x64\x63\xfe\x6e\xa9\x52\x28\xdc\x95\x73\xa3\x13\x9a\x46\xa8\x91\x6a\x7d\x4b\xe3\x5e\xfc\x90\xb6\x7d\xa6\x1d\xbb\x48\x98\xf8\x52\xeb\x1f\x3d\xe2\xd9\xb8\x0a\x0b\xe7\x40\x72\x6b\xae\xc2\x84\x53\xa1\x6b\x73\xd1\x7e\xf5\x98\x44\x31\xef\x23\x52\xf9\xf9\xc2\xfd\x07\xb4\xd9\xa4\xfd\x86\x7d\x7d\x87\x9a\x48\x1c\x2e\xb3\x10\xb9\x74\x30\xcf\xa1\xbc\xa2\x06\xe5\x2f\xbc\x38\xf7\x15\x94\x7f\x1e\x4d\x65\x55\xce\x1a\xb0\xe7\x43\x37\x12\xd3\x2d\x9d\x5e\x82\x20\xa2\xf3\x0b\x1d\xb7\x1c\xc4\x36\x9f\x2f\x7e\x3f\x0f\x5e\x42\xf6\x05\xb6\xf5\xe2\x80\x0b\xfb\x0b\x6c\xc6\x2d\x3e\x39\x71\x79\x89\x13\x9a\x32\x33\x12\x93\x08\x73\x4f\x92\x33\xdb\xf0\x24\xac\xa5\xeb\xaf\x4e\x5e\x5f\xfd\xfa\xec\xe5\x2f\xc7\xf9\x3b\x5a\x32\xcb\x89\xdf\x77\x7d\x37\x9e\x96\x48\x5a\x69\x57\xcc\x53\x98\xd2\x73\x79\xd2\xec\x8c\x93\xdb\xd5\x78\x8f\x2a\xd9\xa1\x0e\x33\x3a\x9b\xd7\xb5\x5e\x8a\x05\x7e\xba\x6f\x15\x5e\xb5\x34\x6c\x3f\x17\x9f\x27\x4d\x7c\x1c\x4e\x7f\x47\x37\x6e\x3c\x0c\x26\xb1\x38\x4f\x82\x0e\x18\xc5\x41\xe8\xfa\x03\xaa\xf3\x18\xde\x1e\x14\x8c\xde\xc9\x71\x0b\x65\x29\x7b\xcc\x82\xc7\xc9\x94\x4f\x89\xa7\x94\x2f\xc9\xae\xae\x88\xe8\x32\xc4\xc6\xe3\x31\xb5\x79\x79\x02\xc3\x01\xc8\x2f\xb4\x06\x20\x09\xad\xc1\x4c\xd6\x83\x16\xc9\x23\xf8\x09\x76\xde\x31\x00\x50\x37\xb4\x42\xe1\x01\x76\xa9\x85\x02\x5f\xd5\xe4\xad\xc7\x93\xf5\xc1\x99\xf0\xb2\x61\x5e\x48\xd4\x52\xf3\xfb\x08\xc7\xf6\x30\xbd\x34\xa7\xed\xeb\xfa\x49\xe8\x18\xc7\x43\x7d\xae\x7f\x41\xc8\x98\x5a\x4e\x74\xbe\x7f\x5f\xff\xfc\xfe\xa2\xfa\xb4\x7b\xf1\xbf\x17\xef\x2f\x2f\x9f\x7c\xae\x5e\xac\x57\x2e\x6b\xd5\xa7\xdd\xea\xd3\x47\xef\x9b\xb5\x8b\xff\x7d\xff\xfe\xf2\xf3\xfb\xf7\xf5\xda\x93\xa7\xef\x9b\xb5\xf7\x97\x5b\x7c\x53\x95\x9c\x44\x6f\x3c\xec\xfa\x82\xce\xff\xbe\xbf\x79\x52\xc2\x58\xd0\x78\x85\x73\x34\xba\x9c\xc4\x3a\xb7\xab\xb0\x1d\xe4\x59\x1e\x33\xaa\x2f\x4d\x0b\x75\x58\x19\x22\xa6\x69\x0b\x0c\x8f\x5a\x5d\x66\x98\x09\xff\x21\x53\xb9\xdd\xae\xac\x7a\xdd\x3e\xaa\x72\xe5\x90\xf3\xb6\xae\xbd\xe0\x61\x93\x1f\x87\xd1\xf6\xe3\x77\x06\xd5\x31\xea\x40\x5c\x2e\x65\x2e\xac\x34\xd3\x40\x86\x09\xb7\x5e\x6a\x18\xaf\x28\x0d\x94\xf7\xb8\x52\x27\x7f\x42\x25\xcd\xdc\xa9\x07\x87\x3c\x48\x53\x0c\xd5\x20\xa1\xd4\x1e\xa9\xda\x97\x8a\x64\xc6\x0a\x6f\x21\xe5\x11\x02\x63\xc9\x95\x17\x1c\xb8\xf8\x72\xed\x94\xff\x10\x53\x1f\x2e\xbc\x0b\xb0\xdc\x25\x94\xd4\x05\x23\x7e\xcf\x63\x40\xe2\xb3\x78\xea\x11\xe6\x2a\x28\xf5\x02\xf7\xbe\x50\x10\xa1\x50\x5a\xde\x99\xfb\x91\x64\x5e\xbd\xde\x17\xca\xde\x80\xc4\x0c\x5e\x61\xe5\x25\xe6\x61\xf1\x4b\x3f\x41\x47\x43\x1c\xc6\x47\x41\x00\x17\x9f\xe2\x6c\x95\xe7\xb8\xd7\xf3\xe0\xb7\xb8\xb4\xdf\xe2\xc4\xaf\x69\x1c\x1c\x05\x7e\x34\x19\xd1\x05\x35\x1b\xc5\x70\x28\xbd\xca\x42\x40\x5d\x0c\x6f\x34\x22\xeb\xa8\xd8\xa2\xe6\x78\x0b\x1d\x22\x99\xa8\x2e\xd6\x21\x5c\x4a\x61\x5a\x3e\x34\xc3\x85\x7b\x09\xc2\x09\x41\x2c\x77\xc9\x56\x43\xd8\xa2\x9f\x30\x14\x4b\x6d\x61\x7c\xf4\xc3\x60\x04\x4c\x70\x77\xb4\x6c\x66\x66\x4e\x5d\x60\x93\x9f\xdf\xc4\xbe\x71\x9d\x78\x08\x01\x5d\xf4\x09\xae\xc9\xc2\x31\xcf\x51\x30\xf1\xe3\x2e\x6a\x08\x37\x8c\xd4\xb6\x3b\x7a\x76\xf4\xf3\xf1\xd5\xeb\x5f\x5e\xa1\x43\xd4\x6a\x34\x1a\x2c\xe6\xec\xcd\xb3\xd7\x57\x67\xe7\xef\x5e\x1e\x73\x8a\xe3\x20\x72\xa9\xb8\xba\xa8\x82\x7b\x51\xe0\x4d\x62\xe6\x70\x24\x0e\xc6\x5d\x54\xd9\xa4\x39\x1b\xe3\x5b\x08\xf2\x48\x9f\x16\x02\x97\x73\xb1\x43\xfb\x0c\xff\x1a\xe1\x70\xe0\xfa\xfc\xa3\x07\x7b\xb1\x5d\x54\xf1\x03\x9f\x91\xba\x19\xba\x31\x39\x1b\x63\x9b\x74\x51\x65\x1c\x92\x8a\x60\x13\xf8\xb8\x7a\x79\x72\x76\x8e\x0e\xd1\x45\x65\xe4\xfa\xff\xa5\xf5\xab\x58\xa8\x32\xc2\xb7\xf2\xf7\x8d\x0c\x74\xfd\x9f\x89\x3b\x18\xc6\x3c\x45\xf2\x31\x94\xbf\xe2\x60\x4c\xff\x50\x5e\xe9\xdf\x7e\xe0\xc7\x74\xbc\x81\x30\xd7\x27\x49\x16\x5e\x05\x46\x8a\xf2\xaf\x04\xbe\xe4\xb9\xf9\xe7\xdb\x54\x9e\x73\x56\x06\xff\x7a\x1e\xc4\x71\x30\x4a\xe8\x88\xcc\xec\xeb\x6d\xc2\x2f\xfd\xe4\x59\xd9\x07\xcf\x79\xc9\x1b\xed\xf8\xd9\xd9\x2f\x6f\x8f\x5f\x1d\xbf\x3e\xbf\x82\x66\x3a\x79\x81\x0e\x91\xf4\xd1\x74\x35\x22\x38\x9a\x84\x60\x38\x5f\x45\x63\xec\x57\x54\x65\xc7\x13\xaa\xed\xd4\xb0\x8e\x09\x0c\xed\x55\x36\xef\x2b\x46\x27\xd5\xfa\x44\xe2\x75\xd8\x3f\x38\xed\x43\xba\x1a\xfa\x41\x5b\x1e\x80\x7b\x2e\x93\xbd\xca\xa2\x37\x50\x65\x7c\x5b\x91\x37\x37\xd5\x38\xfd\x95\x82\x8d\x47\xc4\x3b\x0f\x5e\xb9\x8e\xe3\x91\x97\xae\x4f\xaa\xc9\xad\x53\xae\xe0\xe0\x69\x8e\xdc\xc6\xf5\x68\xec\xb9\x71\xb5\x52\x61\x4f\x75\x69\x6c\x3f\x08\x47\x98\xce\x19\x70\xb7\x30\x0e\xa3\x7a\x48\x9c\x89\x4d\x92\xdb\xae\xd5\x90\x44\x13\x2f\xe6\x07\x83\x82\x57\x5a\x51\x7e\xb0\x78\xc8\x8e\x16\xa7\xba\x77\xd0\xe4\x82\x35\x67\xfd\xe2\xb2\x6e\x07\xbe\x8d\xe3\xaa\x61\xd0\x60\x65\xd4\x2c\x74\x51\xd9\xac\x58\x92\xde\xcb\xe0\x46\xd0\xbb\xd4\xaf\x74\xcf\x47\x14\xe8\xf1\x13\x4d\x0b\x5d\xe8\xbe\xae\x12\x11\xd4\xff\x08\x5c\x9f\x89\xe7\x2e\x71\xa7\xaa\x4c\xe2\x29\x67\xaa\x49\x4c\x35\xa2\xbf\xb5\x35\xc9\x69\x72\x28\xc5\x63\xf3\x45\x1b\xa5\x54\xa0\x52\x41\x1b\x88\x45\xa2\x0d\x43\x0b\x47\x35\xaa\x1f\x5d\x9a\x2a\xab\x94\xe0\xcf\x7c\xea\x91\x8b\xe8\x12\x92\x1d\x54\x78\xbd\x2b\x62\x77\x53\xd6\x4c\x58\x0a\x99\x8a\x89\x88\x8c\x2e\x4d\x3d\x6d\x52\x12\xaf\x37\x7f\x40\xb0\x14\x4e\x26\xab\xe6\x25\x5c\x0b\x99\xf8\xe2\x91\xec\x53\x3d\x92\x0e\xad\xc9\x2b\x34\xf6\x3c\x5d\x4d\x4e\xad\x54\x11\x2a\x4c\xd1\x32\x17\x5c\x75\xb7\x60\x3e\x5c\x73\x75\xa3\xb3\x28\x14\x8f\xd4\x75\x41\x7f\x62\xa3\x3d\x1d\x56\x11\x1b\xdf\xba\xa8\x01\x57\x7e\x98\xa2\xf1\x0e\x44\xc7\x08\x70\x88\xcb\xdf\xf7\x48\x59\x48\xbd\x30\xaa\x83\x48\x0a\xf3\xc7\x7f\xc8\x94\x75\x31\xda\x26\x9b\x94\x9a\x42\x41\x8a\x42\x99\x8e\xea\xc9\x44\x74\x21\x28\x5c\xa6\xdd\xd2\xce\x48\x9e\x3c\x8c\x0a\xa7\xca\x95\x00\x65\x98\x3b\x1b\x63\xc0\x1b\x08\x6c\x68\x9c\xfa\x80\xc4\xdc\xcf\xdf\xf3\xe9\x89\x53\x35\x0c\x98\xbc\x23\xc2\x2b\xfe\x14\xa1\xa4\xd3\x17\x94\x90\x72\x26\x08\xc3\xac\x7c\x82\x9f\xca\x57\x8f\x48\xe2\xa8\xaf\x5a\x71\x9d\x8a\x65\x1a\xc3\x65\x76\x59\x48\x2f\x70\xa6\x75\x3c\x1e\x13\xdf\x39\x1a\xba\x9e\x53\x4d\x73\xaa\x8d\x26\xc5\xa5\x42\x3b\x55\xac\x74\x1b\x6b\x0e\xeb\x92\x39\x9f\xf7\xbe\x9a\x78\x83\x92\xa6\x4d\x75\xe8\x28\xf0\x63\x02\xdb\xed\x51\x2c\xa0\x1a\xd8\xda\x1c\xae\xa5\xa5\xb3\x0c\x48\xfc\x3c\x98\x80\x05\x7d\xe4\xb9\xc4\x8f\xdf\xd2\x7e\xc0\xe9\xb3\x7c\x30\x54\x1c\x26\xfa\x4c\x29\x31\x8d\x48\x14\x1b\xc2\xd8\x07\xbf\xc7\x8f\x66\x2a\x10\x3a\xe4\xc4\x95\x07\x40\x1b\x1b\x6a\xae\xc4\x38\x42\x3f\xe8\x46\x51\xa2\x0d\x39\xe9\xf9\xbb\xad\x7c\x3e\x68\x8d\xee\x4c\xe3\xbe\xe0\x09\xa1\x3b\x64\xc3\x1e\x48\x35\x3d\x8d\x16\x76\x6d\x65\x14\x64\x2b\x97\xd4\x08\xc8\x02\xab\xc4\x4b\xc6\xbe\x61\x3c\xf2\xd0\x21\x22\x5e\x3d\xb8\xf1\x49\xf8\x42\x68\x9a\x50\x39\xae\xd0\xa2\xcf\xf7\x82\x5b\x68\x0f\xb0\xf1\x1a\x96\x30\xec\xb8\xe0\xb7\xb6\xd0\x49\x1f\xdd\x10\xe4\x04\x7e\x25\x46\x43\x7c\x4d\xd0\xe0\xf9\xd1\x5b\x0b\xfd\x31\x89\x62\x44\x57\x98\x0d\xab\x81\x42\x0c\x17\xec\xe2\x21\xf6\x11\x09\xc3\x20\x64\x59\x9f\x7b\xd8\xfe\xf0\x9c\x84\xe1\x14\x75\x2c\xe4\x9e\x9e\xa1\x36\xaa\x06\xa1\x3b\x80\xc7\x1f\xee\x9b\x61\xe0\x93\x9a\xb2\x27\x10\xf4\x29\xdb\x46\x2d\x82\x51\xba\x22\xc7\x5d\xe9\xf6\x9a\xb1\x9f\x97\xab\x5a\x4b\x1b\x26\xfc\x09\x21\xad\x6c\x2f\xb8\xad\xc7\xc1\x18\x6d\xa0\x1b\xd7\x77\x82\x9b\xfa\x18\x0f\xc8\x3b\x2e\xe6\x4d\x90\x63\xdd\x06\x52\xe7\xc1\x98\x6d\x26\x31\xe1\xd0\x8c\xf4\x97\x9e\xf3\x37\x53\x4e\x6a\xff\xf1\xbd\x3c\x65\xc7\x49\x3a\xf0\xb5\xe5\x82\x90\xbb\xf0\x8d\x82\x90\x2e\x97\xc0\xca\x53\x36\x89\x92\x5d\x22\x72\x4d\xfb\x23\x02\xcf\xa0\x7c\x83\xc6\x98\x8e\x41\xa6\xb1\xbd\x24\xf6\x33\xe8\xa3\x11\x76\x7d\xb8\x94\x4f\xcb\x88\x87\x04\x45\xd7\x03\x44\x98\x3e\xac\xa9\x6e\x83\x05\x15\xfe\xdf\x27\xe0\xe7\x37\x8b\xf1\xf5\xee\x4e\x9e\xb1\xe6\x2d\x6f\x8d\x3e\xce\x53\x69\xaa\x50\x15\x8b\xb3\xa7\x99\x24\xdc\x53\x39\x14\xda\x65\xef\xe9\x42\xda\xb6\x2c\x0b\x93\x36\xda\xe4\x39\xa1\x29\xf8\xbe\x24\xe3\x2f\x27\xcb\xbb\x24\x4b\x1c\x8c\x6b\x5a\xb3\xa8\x3b\x30\x85\x57\xa9\xbf\x34\xc6\xd4\x15\xdb\x22\x2b\x78\xc7\xb3\xbd\xa2\x77\x3c\xec\xa8\xd5\x42\x63\xbe\x50\x08\xfa\xa9\x5b\xf9\x41\x3f\x81\xe6\x91\x01\xe5\x98\x37\x3c\xe4\x11\x7b\x81\x8f\xaa\x74\xd2\xe5\xe7\xbc\x7c\x45\x2d\x60\x68\x44\x9a\xea\x18\x1d\xa2\x8d\x71\x0d\x7d\x4f\x57\x26\x9f\x3f\x23\x1f\x7d\x8f\x5a\x12\xac\x66\x83\x73\xc3\xab\x00\xb7\x03\x1b\xbc\x16\x51\x4d\x10\x19\xd3\x75\x4d\x33\x37\x93\x8f\x36\x51\xf3\xd2\x42\xf0\x57\xcb\x4c\x9b\xc8\x17\x37\x21\x5d\x2a\x33\x48\x53\x43\x4f\xd0\x58\x06\x37\xc4\xc3\xcf\xbe\x17\x04\x61\xd5\x95\x18\x4e\x40\x88\xc6\xa6\x0b\x74\x29\x9b\x6e\xc2\xa7\x96\xa1\x69\xcc\x80\x36\x80\x45\xf6\x43\xe3\x51\x5d\x76\xd1\xd8\x2a\xa7\xb2\xc9\x83\x28\xb3\x55\x17\x6d\x22\xb7\x51\x33\xe3\x8a\x34\x0b\x2f\x3a\xaf\xf6\xf5\xdb\xaa\xf7\xf5\xc6\x21\xe9\xbb\xb7\x6c\x4f\x8d\xdd\xdd\xa1\xdf\xe8\x10\xad\xff\x73\x5d\x5d\x18\xbf\xc2\x63\x9a\xed\x6e\x6d\xed\x15\x1e\x6b\x2f\xdb\x47\xa9\x6f\x70\xc2\x9b\xdc\xb9\xa5\x23\x0a\xb4\xf5\x10\x47\xca\x1d\x90\x0f\x64\x9a\x9a\xcc\xab\xbc\xe8\x0d\xd8\xb6\x62\xc3\xac\x1b\xc9\x77\xcc\x03\x12\x17\x66\xa7\x89\x2f\x54\x12\x97\x32\x6b\x94\xce\xaa\xad\xe7\x91\x21\xab\xe8\x56\x07\xe9\x12\x24\xcd\x90\x8c\x82\x6b\x62\xe6\x48\xbd\x03\x85\x0e\x91\x4a\x59\x23\x28\xd3\xf0\xba\x32\xa4\x2c\xb8\xa4\xcd\x59\x62\xf1\x49\x4d\xe0\xd6\xad\xe1\xdd\xbb\xdc\x6f\x4b\x93\x64\xcf\xeb\x44\xe8\x45\xe3\x12\x56\x5b\x8c\xa3\xda\x8c\xc2\xe8\xb2\xd6\x50\x16\xdf\x9a\x8c\xd0\x21\xba\xe0\x57\x8c\x17\x2c\x9e\x52\xa9\x8f\x27\xd1\x50\xa6\xa8\x47\x9e\x6b\x93\x6a\x53\x18\xd6\x5c\x50\xec\x72\x1f\x67\x8b\x75\xdd\x1c\xc6\xf8\x55\xd4\xa5\x59\xe3\x83\x2a\x30\xa7\x8b\x47\xe7\x8c\xa5\x93\xbc\xf1\xfb\xd7\x39\xcc\xc9\x1b\xe0\xcb\x72\x27\x2e\x8d\x03\x7b\x9f\xc0\xfb\x7d\x46\x82\x96\x70\x81\xaf\xb3\x7f\xa7\xf3\xcf\x29\x25\x5d\x05\xfc\x23\x1b\xb9\xe7\xde\xea\x1b\x4b\x71\xbe\xb1\xc1\xbc\xdc\xab\xeb\x5b\x1e\xc0\x04\x38\x1a\xc7\xd3\xd5\x29\x78\xfa\x80\x2d\x7b\xa8\x05\x85\x62\x7b\xa8\x94\xd9\x5f\xb2\xd0\x7e\x4a\x63\x2c\x53\xe3\x00\x99\x64\xa1\x22\xc7\xd9\x11\x1e\xcb\x67\x45\xfd\x64\x65\x32\x82\x97\x27\x3e\xb9\xe1\x6f\x4a\x60\x8d\x70\x14\x8c\xa7\xea\x50\x5b\xe7\xd3\x35\x3f\x5f\x73\xe1\x7a\x8d\x4d\x6d\x8d\x57\x78\x5c\x13\x57\x25\x69\x6d\x53\xa6\x0b\x3b\x29\x40\x9f\x60\x2c\xa7\x8b\x22\x65\x8c\x64\x53\x03\x5f\xcf\xc0\x03\x04\x76\xb1\xb9\x37\x45\x70\xcd\xce\xb5\xf9\xa3\x87\x20\x84\xab\xdd\xec\xf9\xcc\x07\x32\x55\xcf\xf8\xd9\x66\x7d\xf6\xbc\x40\x9c\xf3\xa9\x20\x89\xda\xeb\x09\x86\x10\xc4\x39\x4f\x63\x25\x06\xca\x82\x55\x31\xb0\xd2\x0f\x8c\x45\xa5\x5c\x71\x2c\x7b\xe1\x8a\x5e\x0c\x6c\xe5\xa5\xef\x57\x03\x59\xb6\x00\x2c\xe4\x0c\x5b\x28\x48\x96\x47\xd0\x12\xfe\x35\x09\x63\xe5\xec\x99\x12\x51\xeb\x2d\x0e\x84\xd3\xa7\x3b\x22\x5c\x93\x3c\x2f\x93\xce\x44\xda\x36\xe6\x88\xb6\xfd\xdd\x12\x16\xeb\x08\x8f\x4d\xf6\x4b\xe1\x8b\xa4\xaf\x00\x0d\x6b\x07\x5e\x90\x6f\xb7\x77\x16\xc4\x6f\x6d\x5e\x5d\x85\x83\x5e\xbe\xdf\xa9\xdd\xf6\xc2\xb8\xb0\xd0\x25\x0a\x28\x2f\xc8\x71\xfb\xea\xca\xc1\x05\xa8\xeb\xed\xdd\x05\x61\x72\xb7\x67\x2f\x8e\xb6\x17\x24\xdd\xb9\xba\x62\xea\x5b\xc0\xf5\x82\x70\x6b\x3b\x57\x57\x6c\x0f\xa9\x80\xf4\xfe\x62\xa4\x77\x4b\xe0\x06\xb7\x77\x3b\x02\x7d\x77\x35\x08\xbc\x1c\x78\x41\x5c\xfa\x48\x6e\x7c\xf4\x2c\x64\x2b\x4b\x93\x9e\x7a\x59\x83\xed\x97\xaf\xf3\x6b\x1d\xeb\xe8\xe9\xec\x3d\xf3\xdd\x99\xd8\x93\xbd\x1a\x1f\x54\xbb\xa8\xca\x0b\x60\xfa\x01\xf8\x96\x65\xd4\xc8\x40\x56\x92\xe4\x14\x59\xdb\x51\x8a\xd5\xaa\x5d\x1a\x8b\x96\x8f\x05\x82\x3e\x7c\x0a\xa6\x6b\x94\x56\x0f\x1d\x22\xdb\x2a\xd1\xef\x4d\x35\x47\xdd\x72\xfa\x66\xca\x2b\xeb\xd7\x53\xa7\xda\x05\xab\x53\x28\xe7\x82\x1a\x98\x99\x78\x81\x63\x52\x48\x51\x8e\x2c\x45\x24\xf5\xb9\xba\x57\x2b\xa4\x98\x8c\x82\x85\xaa\xc0\x15\xbc\x0e\xc6\xc5\x69\x1f\xf6\x26\x15\x34\xd5\xc7\x8f\x93\x24\x71\xc0\x8f\x5e\x52\x69\xe0\xc6\xd2\x6b\xfc\x7a\x16\x47\xca\x48\x54\xc4\xd2\xa2\xea\x5d\x63\xfd\x37\x67\x4b\xa0\xf0\xe9\xe0\x57\x02\xd0\x3c\xa2\xca\xb6\xd2\x5d\x85\x3c\xdf\xa4\x0e\x0e\x3f\x90\x70\xe5\x57\x85\xf2\xae\x44\xf5\x42\x77\x30\x8c\x0b\x0a\x2c\x21\x22\x02\x22\xb2\x73\x45\x54\x82\xc4\x10\x48\x84\x83\x1e\x37\x07\x17\xa5\x33\x10\x74\x96\xc3\x3f\x7a\xcb\x09\x98\xef\xae\x0d\x23\x4f\x58\xad\xe6\x7b\x6b\x25\xca\xe9\x43\x39\xc3\xc8\x5b\x74\x87\x96\x1d\x49\xe4\xe3\xdd\x37\xe1\xed\xbe\x02\xd7\x48\x9b\x87\xef\x43\x51\xe2\x4c\xcf\xe8\xaa\xb4\xbe\xcb\xf6\xaf\x84\x2a\x00\x20\xde\x96\x50\xc4\x35\x71\x2d\x16\x1d\xa2\xf5\xf7\xef\xa3\x27\xd5\x8b\x8d\xcd\xcb\xa7\xef\xdf\x3b\x1b\x35\xfa\xb9\x2e\x2e\xbc\xbe\xce\x24\x78\xf2\xfe\x7d\x1d\x12\x56\x9f\x76\x2f\xc8\xf1\x65\x92\xf1\xa9\x9e\xf5\xcd\x5c\x59\xbf\xd3\xf2\xfe\x4c\x6e\xdb\x70\xc1\xf6\x1f\xd5\x8b\xc6\xe6\x3e\xde\xec\x5f\x7e\x6a\xdf\xd5\xfe\xb9\xa5\x24\xd8\x49\x27\xd8\x51\x13\xbc\x1d\xf4\x4e\xf8\xc3\x1f\xb6\x4e\x7c\x4b\x06\xc7\xb7\xe3\xea\xfa\xff\x86\x83\xde\xfb\xf7\xd5\x75\xb4\x81\x2e\x42\x72\x62\x21\xf1\xcf\x25\xda\xa0\xfc\xd6\xfe\xb9\x5e\x53\x88\xbc\x21\xa1\xcd\x8e\x2d\xf3\x89\xbc\xa1\xf9\xd9\x3f\x66\x22\x38\x9f\x15\x6c\xe4\x85\xfe\xf3\x3a\x87\x56\x3e\x47\xd8\xc8\x52\x1e\xad\x9f\x23\x2f\x87\xd4\x30\xf2\x12\x4a\xaf\x0b\x2b\xf7\x73\xe4\xe5\x31\x34\x8c\x3c\x6c\x24\x93\x66\x88\x6b\xa3\x8f\x47\x00\x2c\x0e\xc8\xa0\x9e\x6b\x93\x1e\x6c\xd7\x34\x6e\xfb\x8d\xfe\x5e\xbf\x0f\xe8\x9f\x7e\xec\xfe\x39\x21\x70\xf1\x0b\x62\x30\xe9\x39\xbb\x10\xf3\xe7\x04\xd3\x90\x46\xa3\xdf\xe7\x69\xff\x9c\xe0\x11\x0e\x5d\x1f\x52\xee\xf6\xfb\x7d\x67\x1b\xc2\x3f\x4e\x42\x41\x96\x27\xed\x11\x77\xc0\x82\x3a\xfd\x8e\x63\x43\x90\x1b\xfd\xc9\x4b\xef\x93\x6d\x1b\x72\xf6\x3c\x6c\x7f\x60\x85\xd0\xff\x78\x90\x6f\x0f\x89\x83\xbd\x51\xe0\x3b\x3c\x79\xcf\x76\x58\x1c\x23\x40\xd3\xf2\x72\xbc\x09\xb9\x76\x03\x8f\xc4\x34\x7c\x0f\xb7\x7a\x04\xb0\x8a\x7b\x61\x70\xe3\xd3\x20\xdc\x69\x61\x06\x4e\xdb\x9b\x84\xde\xf4\x26\x08\x80\xa6\x43\x7a\x7b\x7b\xbb\xec\x56\x9e\x43\x62\x41\xb8\xd3\xdf\x27\x18\xd8\x80\xb3\xaa\x90\x4c\x22\x59\xd7\x06\x0f\x0f\xec\xc0\xc3\x4c\x58\x4e\x6b\x67\xbf\x09\x4e\x13\xec\x20\xc4\x1e\x63\x76\xb7\xdf\x69\xf0\x20\xbf\xef\x05\x37\x24\x14\xd4\x77\xb6\xf7\x3b\xc4\x11\x71\x91\xeb\x7d\x60\x39\xfa\x7b\x4c\x42\x76\xe8\x8e\xa2\x00\xd8\x76\xec\xe6\x76\x9b\x05\x4e\xb1\xaf\x37\x03\x1d\x70\x54\x49\xec\xf5\x44\x68\x92\x76\xaf\x97\x84\x0e\x02\xcf\x21\x7e\xc8\x2a\xde\xdb\xdb\xdb\x69\x24\x51\x21\x9e\x82\x94\xf6\xe9\xff\x92\x50\x42\x38\x9d\x9d\x6d\x56\x6d\x1e\x6c\x48\xfc\x61\x88\x3f\xb8\x40\xd9\xe9\xed\xee\x48\xca\x23\x3c\x20\x7e\x0c\x0a\xb4\xd7\x53\x79\x0c\x3c\xf7\x9a\xc8\x12\x3a\x9d\x9d\x5e\x4b\xd6\x2a\x08\xb1\xcf\xd5\xa6\xbf\x67\x27\x25\x07\xa1\x3d\x74\x81\xfd\xfd\xfd\x76\xcb\xb6\x45\x78\x48\x1c\x51\x40\x92\x38\x02\xcd\xa1\xe1\x64\x7f\x7f\x67\x17\xcb\x70\x82\x65\xb1\x7b\xfd\x9e\xbd\x27\x8b\x8d\x68\x7b\x0a\x89\x6e\xef\xb5\x9d\x84\x5b\x88\x12\x52\x6a\xf5\xb7\xfb\xdb\xfd\x54\x14\x31\x44\xc5\x93\xf0\xcf\x49\xe0\x46\xbc\x89\x6c\xe2\x34\x45\x54\xa2\xac\xfb\xdb\x8d\x86\xd3\x86\x70\x42\xc6\x63\xd7\xe7\xda\xd0\xdc\xde\x97\xa1\xd1\x87\x69\xd2\xd2\x3d\xd1\xfe\xee\x48\x70\xb4\xb3\x4f\xff\x27\x03\x49\x3a\x30\x70\x06\x89\xfa\x35\xc9\x3e\xef\x35\x7d\x37\x24\xbd\xd0\x65\x5d\xaf\xd7\xa2\xff\x41\xb0\x47\xb5\x38\x19\x0a\xfa\x7d\xdc\x07\xb1\xf6\x83\x90\x44\xb1\x94\x5e\xab\xb5\xd7\xe3\x39\x26\xf6\x30\x72\x31\x4b\x2d\xfa\xe4\x00\xbb\x7e\xd4\x0b\xc2\x80\x29\x32\xfd\x1f\x04\x0f\x83\x28\x4e\x88\xef\x89\x11\x88\xaa\x27\x23\xe0\xec\xb2\x56\xd4\x14\xd6\xc1\xb8\xd3\x62\xc1\xbc\xd2\x7b\x0d\xfa\x3f\x16\x22\x15\x75\x8f\x6b\x00\x04\x4d\x89\xe7\x05\x37\xa0\xab\x4e\xbf\xcf\xf4\x4b\x48\x27\xc9\x3d\x0c\x7c\x32\x75\xc8\x8d\x1c\xb9\x78\x68\x9c\xb4\xc5\xce\x7e\x0f\xc6\x29\x6a\x4c\x62\x9f\xab\x9b\xed\x74\xec\x8e\x2d\x82\x07\x50\xcd\x6d\xaa\xe3\x20\x12\xf7\x3a\x08\xa7\x5c\x7c\x9c\xa4\xec\x22\xfd\x06\xd9\xd9\x83\x9c\x1e\xbe\x26\x3e\x5c\xbe\x6d\xdc\x92\x1d\xb2\xd3\xc7\x6a\x68\xcf\x9b\x44\x43\x4e\xa3\xd1\xef\xb0\xa8\x1b\x5f\x56\x77\xd7\xee\xf3\xde\xe1\x91\x51\xe0\xdb\x43\xb7\xdf\x67\x2a\x4f\xdb\x8c\x8d\x95\x1e\x35\x52\x44\xd3\x63\xc7\xd9\x23\x3b\x32\x38\x19\xad\xa4\x30\x58\x38\x1f\x3f\x88\x1c\x6b\x20\x58\xb6\x47\x22\xd7\x3e\xee\x63\xa7\x95\xa4\xe0\x4d\xe3\xb4\xe9\xff\x94\x60\xce\xf0\x7e\x83\x90\xfd\x86\x1a\x6e\x4a\x9e\xc8\xbd\xb7\x63\x37\x65\x70\xd2\xa1\xfb\x7d\xdc\x60\x1d\x9a\x45\x28\x3d\xba\xd5\xe8\xb5\xb0\x12\x95\x74\x9c\xbd\x5d\x9b\xf4\x95\x18\xb5\x47\xef\xee\xee\xed\xed\xef\xa7\xe3\x88\x31\x2e\x26\xc4\x13\x34\x7b\x0d\x7b\xdb\x21\x32\x4e\x91\x4b\xbf\xdf\x27\xbc\xa2\x23\x22\xc6\xed\x86\x0c\x91\xfc\xb6\x5b\xb6\xd3\xe6\x02\xf4\x59\x10\xed\x6d\xac\x91\x94\xc1\x33\xe9\x56\x23\x1c\x06\x4c\x0c\x7b\x72\xb2\x1c\x11\xc7\x9d\x8c\xf4\x79\x79\x67\xc7\x76\x98\x24\x58\xac\x3a\x55\x30\xd5\x60\xe1\xc9\xa0\xda\xc3\x9d\x0e\x6b\x06\x16\x33\x9e\x84\x63\x0f\xf2\xec\xb7\x77\x1b\x4e\x2f\x89\x51\x25\xde\xb6\x7b\xed\xdd\xa6\x12\xa7\x8e\xa2\xbb\xbd\x9d\x3d\x42\x94\xc8\x31\x5d\x66\x2b\xfd\xb5\x8f\xf7\x15\x1e\xb5\x01\x73\x7b\xcf\x69\xb2\x31\x9e\x45\xb2\x21\x53\x74\xbe\xdd\x66\x67\x0f\x7a\xc4\xc8\x75\x7c\x55\xc7\x9b\xfb\xcd\xfd\x5d\x26\x15\xd7\x8f\xed\x90\xe0\x11\x37\x40\xfa\xac\xf9\x47\x6e\x14\x4f\xc3\x20\x92\x36\x08\x61\xdc\x07\xb6\x8d\x23\xd7\x17\xa1\x3d\xa0\xee\xe3\x6b\xfc\x47\xa0\x8c\x85\x0e\xc1\x0e\x8f\x98\xca\x99\x17\x8a\x0b\x3c\xc7\x83\x1b\xf3\x8d\xdb\xbe\xd3\xef\xb0\x26\x84\x69\x4e\x8c\x37\x8d\x86\x0c\x72\x42\xdc\x83\x56\xea\xed\x91\x16\xc8\x5c\x9d\xf4\x70\x87\x27\x85\x30\x5e\xe5\x7e\x7f\x5b\x06\x8b\x26\x73\xf0\x6e\xc3\x81\x82\xc6\xd8\x23\xda\x80\x49\x08\xd9\x63\xed\x0f\x51\xb2\x0b\xee\xf5\x7b\xfb\x7b\x22\x58\x13\x38\xee\x13\xc2\x1a\x8b\x46\x69\xe2\x76\x7a\xbb\x0d\x36\x1d\x8d\xf1\x18\x4f\xf1\xcd\xd0\x1d\x73\x41\xf5\x1d\x10\xd4\x98\x60\x7b\x38\x9e\xf4\xfb\x5c\x4c\xb8\xb7\xcf\x82\xc3\x09\x1b\x2c\xf7\x3a\x6d\xd0\xdf\xa4\x77\xdb\x0d\x1b\x74\x6a\xec\x4d\xa0\x89\x1c\x07\x37\x1c\x10\xee\x38\xb8\x71\x92\x09\xab\xd7\x20\xbc\x43\x24\x1a\xb9\x27\xc5\x1e\x92\x1e\xb1\x6d\x9c\x44\xed\xec\xb4\xdb\xac\xc3\x4a\xc1\x89\x7e\x12\x06\xd1\x54\x9a\x84\x74\xea\x67\x93\x7f\x18\x4c\xb1\xec\xd3\xdb\xcd\x9d\x7d\xa6\x11\x11\x76\x1c\x8f\xc8\xf4\x7b\xbd\xed\x4e\xb3\xcd\x22\xe4\x48\x84\xf7\x1a\xbb\x2d\x16\xe6\x3b\x09\xed\xfe\x36\xde\xde\x81\x22\xb5\xc1\x89\xec\xf5\x3a\xbb\x3c\x34\x1a\x12\x8f\x9b\x8a\xfd\x0e\x13\x7b\xe4\x12\xdf\x87\xee\x8e\x1b\x9d\x56\xcb\x61\x61\xde\x35\x9b\x1f\xec\x06\xfd\x1f\x84\xe9\xa3\x1a\x01\x29\x6a\xfd\x6e\x07\x77\xf8\xf8\xaf\x8f\x73\x8d\xbd\x06\x1b\x7f\xf5\x21\x2e\x09\xf6\xe5\xf8\x85\x59\x6f\xc9\xf6\xd8\xfe\x2e\x08\x4d\x1b\x08\xb7\x77\xf6\x5a\x6c\x8a\x8c\xd9\xd4\xe1\xb4\x7a\xdb\x6c\x8a\x8b\x09\x9b\x63\x1a\x72\x8e\x89\x87\x6e\x14\xb3\xb6\x72\xf6\x7a\x7d\x07\xb4\x31\x0e\x46\x38\x0e\xf8\x74\xdb\xde\x06\x29\xe9\xc3\x41\x83\x34\x1c\xc8\x9f\xd8\x4e\x84\xec\xb5\x98\xe8\x6e\x86\x04\xc7\xac\x9f\x3b\xa4\xd7\xb6\xc4\x23\x16\x39\x03\xf7\x65\x50\x34\x0a\x3e\xc8\x35\x09\x9b\x55\xf5\x81\x9b\xe9\x0a\x0b\x4b\xfa\x0d\xa6\x03\x35\x9c\xa0\x96\xb9\x39\x2e\xb6\x1b\x8c\xbb\x79\xb0\xb7\x60\xb1\x1d\x20\x0b\x56\x65\x8e\x1b\x8d\x3d\x3c\xc5\x3d\xcf\x74\x26\xae\xdc\x0a\xa9\x87\x83\x5e\xb5\x56\x57\xd2\xf3\xdb\x93\x4c\x86\x6c\x1b\xb3\x0c\x09\x70\x13\xc6\x4f\x85\x35\xbc\x65\xe0\xaa\xca\x9e\x31\x28\xa7\xc2\x07\xcc\xfe\x1b\x61\x80\x2f\xe7\xbf\x28\x8d\x5a\x3d\x0e\xdd\x51\xb5\xa6\x3f\xb0\x50\xce\x14\xaa\x23\xb8\xf6\xfb\x33\xb9\x6d\xd7\xc9\x2d\xb1\x05\x6d\xd8\x52\xa7\x71\x63\x1c\x46\xe4\xc4\x8f\xab\xa3\x8b\xe6\xa5\x85\x9a\x3b\x35\x8b\xad\x77\x07\xbd\x6a\x75\x84\x7e\xf8\x01\xed\xa1\xc7\xb4\x6d\x6a\xe8\x33\x62\x01\xdb\x10\xd0\xe8\x37\x6a\x96\x16\x22\x92\xc0\x6f\x88\x14\x1f\x35\xf4\xfd\xf7\x68\x5b\x8d\xae\x59\xe0\xf8\x60\x6b\x0b\xfd\xa3\xdf\x68\x24\xa7\x12\x92\xdd\x9d\x0c\xbb\xe1\xa0\xe7\x57\xb3\xec\x72\x22\x30\xcc\xa4\xe9\x24\xbb\x25\x19\x6a\xa2\x8e\x8c\xce\xe8\xa2\x05\xff\xb6\x29\x4d\xa0\x48\xdb\xa9\xd5\xe9\xc0\x35\xb9\x46\xcd\x40\x98\x6f\x0f\x14\x12\x46\x4f\x50\xab\xd3\x41\x5b\xa8\xd9\x68\xb0\x42\xd2\x21\xed\x54\x48\x52\x78\xb3\xd1\xf8\xce\x42\xec\xff\xa6\xf2\x71\x5e\xcd\xc2\x41\x0f\x1b\xaa\x35\xba\xd8\xbe\x14\xc4\x71\x52\x35\x5a\xa4\x89\x7a\x5e\xf5\x24\xf5\xf9\xeb\xa6\x72\xa0\x55\xcf\xc4\x43\xb2\x8d\x93\x61\x61\x18\x79\x6a\x05\xb5\x02\x35\x31\x0e\x23\xaf\xda\x6c\x35\x2c\xd4\xa1\x65\x74\x0c\x72\x54\xf6\x79\x16\x29\x46\xd6\x08\xd2\x6a\x45\x69\x75\x82\x3d\xa0\xd4\x13\x4e\xd9\xcb\xb9\x66\x43\x9a\x0b\x16\xa8\x1c\x3a\x89\x6e\x7f\x78\x88\xd6\xe3\x10\xfb\xd1\x18\x87\xc4\x8f\xd7\x15\x4d\x13\x18\xb1\xfc\x1f\x45\x5b\x99\x17\x42\xf5\x89\x19\x2b\x4a\xbb\x4a\x2c\xc8\xf8\xb4\x27\x37\x77\x58\xff\xec\x5b\xc8\x57\x3a\x3f\x7c\x8a\x5f\xcd\x5a\x86\x26\xae\x86\x16\x1a\x58\xa8\x67\x21\x9c\xdc\x89\xc5\x70\x1b\xb5\x86\x42\x74\x88\x06\xe8\x10\x3c\x1c\x71\xa7\x32\xa9\xb2\x95\xdc\x19\xda\x7c\xfb\xba\x1a\x24\x84\x1f\x55\x03\xf5\x18\x0c\x86\xf4\x5a\x0d\x05\x62\x67\xbf\x1a\xc8\x3b\xad\x8f\x82\x5a\xaa\x30\x1a\x03\x37\x3e\xd8\x58\x6c\xe0\x26\xa8\x87\x16\x0a\xea\x03\xfa\x4f\x8f\xfe\x13\x8c\xb1\xcd\xc0\x4a\x52\xbc\x25\x8c\x8b\x24\xaa\x64\x33\x6f\xab\xc0\xdf\x0b\x6b\x70\x51\xab\x50\x38\x88\x78\x6b\xa0\xa6\x00\x0d\x35\x51\x17\x99\xd9\x30\x65\x54\xdc\x1a\x51\xe1\x6f\x84\xd2\x95\x11\x6d\x87\x8d\x81\xfc\xa4\x4d\xb2\xd1\x93\x9f\xb2\x5c\xb4\xc1\x7f\x42\x59\x4b\x4f\xba\x6f\x07\x3d\x8b\xd6\xda\x2a\xf5\xf2\x2b\x21\xc5\x7c\xc9\xb2\xd7\x39\xda\xf4\xfd\x09\xf6\x17\xd9\x19\x80\x7a\x3b\x53\x4c\xb9\x1f\xd0\x21\xfd\xbf\x14\x9f\x3c\x2f\xe8\x26\xce\x67\x44\x98\x85\x3e\xe8\xb7\xe5\x44\x73\x70\xf9\x3d\x41\x1f\x2c\x21\xbc\xe4\x77\x4f\xf9\x9d\x34\x0c\x37\x06\xd8\x79\x44\x19\xc6\xf8\xd1\x86\xc2\x16\x0b\xb9\x07\xa6\xc2\x41\xaf\xd8\x38\x49\xd8\x2f\x63\x11\x55\x1b\xb4\x7b\x73\x76\x84\x63\xa3\x90\x86\xb5\x3a\x9d\x9a\xbc\xbd\xf5\xf8\xb1\x9a\x72\x20\x53\x0e\x66\xa4\xec\xc9\x94\xbd\x19\x29\x85\xd2\x8a\xf4\xe2\xfb\xfb\x43\x18\xaa\x66\xdb\x67\xc2\xdd\x9d\x9a\xfb\x00\x42\xd8\x01\x34\xae\xf1\x0e\x08\x6d\x34\xc2\xb7\xd5\x86\xc5\x7f\xbb\x7e\xb5\x49\x47\x2d\xbd\xad\xaa\x58\x76\xf5\x75\x3a\x4a\xac\xa3\x2e\xfc\xc0\xd5\xf5\xa4\x12\x1b\x66\x72\x30\x33\x2b\xaf\x33\x98\x58\x01\x72\xa3\x51\x03\xcb\xd1\x42\xeb\x0b\x11\x19\xac\x82\x48\x4f\x10\x51\x72\xab\xd5\xad\x41\x5d\x2d\xb4\x8e\x36\x10\xa6\x05\xd5\xd6\xc5\xfd\xc7\x9a\x66\xea\xc2\x94\x39\xb4\x50\x64\x21\xcf\x38\x6b\x0c\xd1\x21\xf8\x1a\xf1\x92\x59\x43\x5e\xb3\xf3\xe4\x3b\x07\x8f\xbf\x59\x10\xa9\xd3\x29\x23\x85\x5a\x76\xee\xf9\x39\xf2\x54\x1e\xf4\x81\x35\x39\x3a\x55\xe7\x1e\x6d\xe6\xf9\x39\xf2\x6a\x69\x7a\x41\x7d\x48\xe7\x8c\x88\xfe\xe3\xe9\xb3\xc7\xb2\xb3\xd7\xcf\x91\x77\x30\x8b\x8d\xc0\x30\xbf\xc1\xa9\x28\x0b\x42\x5b\xb4\x2b\x59\xbc\xf5\x06\x10\x38\xd0\x03\x7b\x10\xd8\xd3\x03\x47\xae\x2f\xde\x6f\x50\xdd\xe0\x13\x8e\x7c\x92\x31\xc2\xb7\x32\x1a\xdf\x66\xa2\xb9\xf4\xc5\x27\x03\x75\xbe\x45\x9b\x94\xac\x08\xf4\xd8\xcd\xc5\x5b\xb4\x41\x43\x6b\xb4\x78\x51\xd9\x48\x7d\xab\x1e\x82\xb2\x8d\xf0\x2d\x6b\xd4\xea\x00\x6d\xa2\x1e\x4d\x1e\x51\x55\x1c\xa0\xef\xe9\xd7\x13\xb4\xa3\x5c\xfd\xa4\xd9\x06\xa9\x6c\x3d\xb4\x89\x42\x91\xad\xa5\x24\x86\xd8\x10\x6d\xa2\x81\x88\xdd\x66\xb1\x11\xda\xa2\xda\xf8\x3d\x6a\xd4\x3b\xe8\x29\x92\xac\xa2\x2e\x38\x36\x91\x15\x62\xa9\x87\xe8\xc9\x21\xda\x61\xde\xec\x38\x88\xc5\x9a\xa8\xbb\x87\x7e\x60\xf8\x01\x94\x5a\x93\x43\x84\x0f\x53\xe8\x3b\x19\xfd\xcc\xb3\x43\x86\x5a\xa2\x79\xec\x10\x45\xc3\x87\xc2\x0e\xf9\xd9\x40\xad\x94\x1d\x62\xca\xa8\xd8\x21\x54\xac\x1b\x43\x69\x69\x44\xe0\x0a\x48\x7e\xd2\xc6\xdf\xf0\xee\xdd\x0e\xf9\x39\xf2\x2c\x5a\xeb\xbf\x8e\x1d\x42\xa5\xca\xe4\xc7\xa7\xf5\xc8\x12\x12\xfb\xf2\xf6\xc7\x62\xcc\x98\xed\x0e\x78\x88\x2b\x26\xdd\x21\xfa\x0e\xb5\x77\xe0\x59\x16\xff\xfe\x1e\xc1\x8b\xac\x36\xdb\xc8\x4b\x86\x0d\x36\x23\x0f\x6b\xc9\xf5\x30\xc6\x48\x8d\xf7\x22\xce\x96\xcc\xe3\x89\x22\xbc\x24\x6c\xd4\x82\x3e\xb8\x01\xf3\x08\xef\xcd\x1e\xea\x82\xef\x22\x8f\x96\xaa\xe4\x1f\x35\xb9\x5b\x56\x8f\x76\xee\x96\xd1\x24\x13\x83\x5c\xe4\xb5\xe8\x90\x3b\xa4\x53\x52\x6b\xbb\x41\x3b\x18\xda\x84\x5f\x5d\x34\x44\x1b\x08\x16\x88\xa3\xa6\x85\x46\xad\x64\x64\x14\x99\xf2\x63\xe8\x18\xd1\x62\xd4\x36\x24\xb5\x4d\x23\x35\xb5\x01\x20\xa8\xb6\xb0\x4d\x17\x49\x7b\x0a\xa6\xd0\x66\x46\xe0\x79\xe6\x98\x27\x33\x7a\xcc\x04\x5b\xd8\x6c\xe3\x26\xc3\xd6\x13\xf4\x63\x18\x8c\xd0\x8f\xd7\x2f\x50\xb3\x5d\x6f\xef\x5a\xe8\xe8\xec\x8c\xcd\x9b\xe8\x15\xdc\xb5\x43\x2f\xc9\x35\xf1\x50\x5b\x43\x6a\xcb\x8a\x56\x1d\x14\x41\xae\x3b\x54\xac\xa3\x26\x55\x85\x11\x8c\xe1\xf0\x66\x71\x88\xb6\xd0\x4e\xb2\x99\x04\x0d\xb0\x07\x29\x5b\x5a\x20\x6b\xe3\x4c\xf6\x2a\x0d\xdf\x44\xc3\x9a\x4e\x86\x45\xb6\x3a\x1d\x93\x83\xb3\x66\x21\x82\xf9\x57\xf2\xac\xc7\xc6\xbb\x83\x15\x5c\x81\x56\x5e\xaf\x58\xa8\x8f\xe9\xdf\x29\xbc\x97\x61\xcf\x09\x6b\xe9\xd7\x84\xda\x4b\x43\x9e\x5e\x0b\x53\x00\xd1\x11\x52\x50\xf1\x13\x12\xcc\x8d\xaf\xf8\x4a\x3b\xb6\x63\x55\xab\xb2\xcd\x14\x8b\xb9\xe1\x07\x60\xa7\x64\xd7\x55\x2d\x8e\x23\xc0\x30\xbc\x0b\x9e\x2b\xe1\xa7\xc6\xf7\x67\xb5\x17\x1f\x2a\xc9\xc4\x4b\x06\x7f\x75\x98\x44\x5e\x88\x27\x8c\xc9\x63\x41\x51\xb1\xac\x96\xb4\x0a\xd1\xa9\xbf\xd2\x75\xd3\x1e\x8e\xe8\xd2\x51\x05\xf7\x74\xa3\x6a\xdc\xb4\xd0\x75\xc3\x42\xd7\xf4\x6f\xcb\x42\xd7\x6d\xe5\x0a\x3c\x38\x30\x07\x8f\xd0\x4d\x0b\xc5\xe0\x4c\x16\x3c\x5f\x37\xd5\x9d\xeb\x2a\x1d\x8e\xc1\x87\x75\x53\xb8\xc1\xa6\x7d\x2c\x6e\xd3\x6e\x74\x2d\xfa\xd5\x06\xaa\x6e\xa3\x4d\xb4\xc3\xa2\x79\x3a\x96\xa4\x99\x24\x91\x14\x34\x52\x4a\xda\x96\x4c\x1b\xd3\x50\xca\xed\x16\x35\x21\x17\x7a\x85\xd3\x33\xbe\x1b\x4f\xea\x9f\x79\xce\x4d\x47\xf3\x03\x03\x06\x6a\x9c\x7e\x31\x15\xb3\x75\xcf\x53\xb8\xbe\x4f\x67\xc8\x2e\x8a\x61\x01\x24\x82\x9a\xfc\x79\x76\x4d\xcc\xe8\xec\xb1\x75\x8c\x9e\x20\xbf\x96\xcc\x6a\xd7\x4d\xc9\xc2\x85\x7b\xa9\x84\xb7\x94\x70\xf6\x96\x3a\x89\x6b\xd0\xe9\x17\x2c\xd7\xa7\x49\x9a\x4d\x04\x10\x40\x2d\x10\x38\xda\xa4\x6d\x9d\xe4\x68\x43\x8e\xef\x19\x4b\x6a\xae\x0d\xd4\x92\xb9\x68\x4b\x5c\x37\xb5\x89\x95\xa9\x50\x35\x46\x9b\xc8\x45\x5b\xc8\xa7\x4d\xe4\x67\xf4\x49\x40\xc0\x1a\xee\x65\xb7\x0a\x91\xac\x57\xd3\x51\x16\x1c\x0a\x6f\xcd\x70\xb7\xa9\x89\xf8\xb6\xa8\x72\x85\x50\xc2\xcb\x54\x6e\x0b\x1d\x05\xa3\xf1\x24\x26\x0c\xc8\xd7\x21\xb6\x3b\x02\x57\x8d\xa4\xdf\x77\x6d\x97\xf8\x31\xc0\xbc\x52\xc2\x3e\xa0\x6b\x30\xf7\x32\xc9\x7b\x40\x76\x8f\x1e\xdd\x02\x70\x2d\xa5\x17\xb9\x03\xdf\xed\xbb\x36\xf6\x63\xe4\xb8\x03\x37\x8e\xd0\xd8\x42\x37\x43\x12\x12\x74\x8b\xdc\x88\x03\xea\x5d\x33\xfc\xd8\x31\x0d\x71\x7d\x04\xbe\x0b\x9a\x97\x28\x08\x13\x1c\xa9\x3a\x25\xf7\x63\x10\x22\x8e\x54\x6d\xf1\xad\xf1\x17\x8c\xc9\x6a\xb3\xde\x6a\x8b\x45\x70\x84\x2e\xd6\x9b\xad\xf6\xba\x85\x1a\x97\xf5\x55\xb4\x99\x85\xc6\xc9\x0e\x40\x15\x10\x0e\xe8\x7a\x77\x8c\x9e\xa2\xdb\x7a\x1c\x1c\x73\x81\xb8\xd8\xab\x8e\x45\xf7\x4b\x47\xd4\x6a\x12\x44\x6e\x9d\xac\xd7\x6a\xcc\xc4\x15\xa6\xe4\xc4\xf3\xc0\x2b\x34\x6c\xe1\xff\x7f\xff\xaf\xc0\xc7\x16\xfe\xa6\x2c\xad\x11\x0e\xd1\x2d\x7f\x63\xda\xb0\x90\x2b\xdf\x6d\x9e\x0f\x09\x47\xdf\xe1\x64\x89\x83\x7a\x53\xa4\xb1\x81\x88\x0b\x40\x34\x43\xcc\xda\x98\x0a\x11\xbd\x77\xde\xd7\xdf\x3b\x1b\xe4\x62\x73\xe3\xf2\xbd\xb3\xc1\xa8\x55\x49\x7d\x50\xb7\x50\xb3\xde\x22\x1b\xed\x1a\x6d\x0b\x25\xbd\x48\x2a\x53\xd1\x34\xf5\x44\xaf\x2f\x18\xd8\x48\xc2\xb3\x0a\x2f\xf6\x54\x8d\xb8\x68\x5c\xa2\x0d\x2d\x25\xab\x59\x8b\xca\x50\x09\x66\xc3\xca\x86\xa8\x38\x8c\x4e\xd4\xb4\xbc\xcc\xe9\x24\x5f\xc0\x55\xf1\x1c\x37\xe0\xa3\xd0\xbe\x02\x34\xf9\x6b\xec\xe5\xdf\x83\xe7\xef\x07\x53\x37\xf9\x43\xc2\xd5\x35\x76\x47\xe4\x84\x13\x49\xdd\xe6\x9f\xe3\x71\x24\x65\x65\xe4\x7a\x9e\x1b\x11\x3b\xf0\x9d\x5c\x6e\xf6\x9b\x2d\xfd\x95\x85\xe4\x63\xe5\x0f\x3b\xe6\xe3\x17\xfa\xa7\x7c\x03\x52\x24\xac\x57\x49\xb6\x28\x25\xb0\xe5\x2b\xe3\x7f\xc1\xca\x4c\x62\xbb\xa0\x2e\x73\xbc\x60\xa5\xe5\xcf\x6c\xf7\xf6\xaa\xdb\x7d\x30\xb7\xa8\x52\xac\x96\x6f\xf2\xb3\x7b\x6a\xed\xf0\xcb\x54\x61\x12\xdb\xe6\x1a\xcc\xf1\x96\x98\xe9\x98\x3f\x29\x78\x51\xbc\xdf\xdc\x5e\x75\x1b\xe7\xbd\x11\x2b\xcd\xea\x3c\xdd\xda\x07\x1b\x65\x31\x09\x6d\xb3\x62\x87\xc1\x24\xff\x59\xf4\x7e\xb3\xb3\x6a\xf9\xe4\x21\xf3\x94\x64\xb4\xbc\x74\x7e\x0e\x26\xe1\xa2\xb2\xe9\xb0\x22\x9d\x82\x57\xee\xfb\xcd\x9d\x55\x8b\x26\x0f\x1a\xbc\x1c\x9f\xe5\x25\xf3\x02\x4f\x17\x15\xcc\x0e\x2b\xf0\x86\x90\x0f\x05\x92\xd9\x5d\xb5\x64\xfe\x98\x5b\x32\x1a\xa3\xb0\x14\x2d\x25\x9a\xff\x12\xf2\x61\xf5\x83\xe6\xf0\x4b\xb1\x7f\x36\xf1\x9d\x6c\xe3\x2e\x5f\x01\xb2\x6c\x05\x4a\x0f\x69\x81\x5a\x81\xa2\x94\xe7\x13\x12\x39\x78\x5a\x3e\x65\x19\xa2\xff\x25\x8e\x5f\x96\xac\x4c\xbb\x7a\x71\xbb\xcb\x8a\xdb\x2e\x29\xee\xf3\xe1\x24\x2c\x2b\x9b\x1f\x43\xb7\x9c\x60\x58\xc2\x32\x24\xcf\x70\x3c\x09\xcb\x11\x15\x49\x17\x1d\xb8\x76\xf9\x24\x1b\xf8\xf1\xb0\x60\xe4\xda\x5b\xf5\xc8\xd5\x9f\xbb\x29\x75\x4e\xe7\xea\x3a\xf1\x70\x51\xf1\xec\xb1\x42\xa7\x04\x17\x19\x03\xfb\xab\x96\xce\x87\xb9\xa5\xa3\x31\x5a\x5e\x38\xef\x08\x5e\xd8\x18\xd8\x67\x45\xc2\xda\xa3\xd8\x9a\x6c\x35\x56\x2d\xa0\x60\x6e\x01\x65\xb9\x9d\x63\x69\xb5\x8c\x3d\xd9\x6c\xc8\x92\x7f\x2e\xb4\x29\x5b\xcd\x55\x4b\x69\x34\xff\x12\x34\xcd\x6c\x69\x21\x2d\x63\x56\x36\x9b\xb2\xd4\x17\x45\xa6\x65\x6b\xe5\x3b\x0e\xde\xfc\x12\x4a\xf1\x5a\x5a\x40\x4b\x58\x97\xcd\x96\x2c\xf3\xbf\x85\x16\x66\x6b\xe5\x4b\xf3\xc9\xfc\x02\x4a\x33\x5b\xce\x4c\xe3\xc9\x57\x6f\x34\x44\x5f\xb0\x06\xf7\x65\x67\x8e\x57\x51\x87\xb2\xa3\x5d\x29\x53\x73\x12\xdb\xe5\x2c\xcd\x24\x61\x09\x92\x65\xed\x4c\x35\xe9\xea\xa5\x1d\xaf\x42\xda\x65\x4c\x4d\x2a\x9b\x92\x96\xe6\x24\xb6\x4b\x19\x9a\x32\x5d\x09\x82\x25\xcd\x4c\x25\xe5\xc2\x03\x58\x3b\x99\x7d\x8b\x2d\xcd\xd6\xca\x37\x9e\xfe\x9c\xbf\x35\x33\xdc\xce\xd3\x79\x16\x37\x36\x9b\xdb\xb2\xdc\x77\x85\x06\x67\x6b\xe5\xbb\x4f\xd7\xf3\x0b\x29\xcd\x6c\x69\x19\x49\x9b\x73\xc6\x7f\xa9\x03\x9b\x7b\x74\xeb\x77\xdf\x3e\xec\x60\xf5\x07\xa7\x91\x79\xf2\x51\x4c\xf2\x37\x38\x8c\xc8\x8a\x9d\x08\xe6\x6d\x2e\xd2\xd1\x42\xe7\xeb\xbe\x31\xba\x26\xb1\x0d\x15\x9c\x21\x88\xe4\x56\xe6\x82\x07\x6a\x5e\x60\x63\xaf\x00\x32\x73\x8f\x41\x4a\x51\x3a\x2c\x29\xc3\x8d\x52\x5a\x4a\x7e\x33\x7e\xe1\x33\x91\x97\xf8\xe4\x91\x6b\x9c\xe1\x97\x40\xab\x0a\xcf\x46\x71\x4c\xce\x01\x60\x60\xfd\xbb\x5b\x0b\x7d\xf7\xdb\xba\xc5\x43\x69\xc8\xe6\x68\xeb\xbb\x4d\x67\xeb\xbb\x77\x10\x1a\xf3\x74\x9b\x27\xdd\xef\x5e\x75\xbf\x3b\x43\xdf\x8d\xd7\xf9\x0b\x6d\x37\x70\xa2\x2e\xba\x58\x7f\xf6\x6a\xdd\x42\xeb\x6f\x5e\xad\x5f\x32\x32\x53\x08\x65\x06\x07\x8d\x61\xd3\x36\xfd\xc5\xa7\x5b\xfa\x53\x4e\x92\x10\xce\xa7\x1a\xfa\x9b\xcd\x11\xf4\x97\x18\xda\x19\xdd\x68\x18\x84\xf1\x8b\x84\x38\xa7\xcc\xc9\x72\x92\x9c\x18\xa7\xc3\x89\xb0\xfc\xb0\x3a\x87\xcc\xff\xc6\xfe\x04\x87\xac\x30\xd2\x0b\xc5\xef\x57\x38\xb4\x87\xf4\xc7\xb3\x71\xe8\x7a\x2c\x04\x22\xfe\x3d\xf1\x09\xfb\xeb\xc1\xf7\xb3\xc9\x60\x12\xc5\x40\x9c\x8c\x63\xf0\x93\x4d\x3f\x4e\xed\x38\xe0\x3f\x5f\x07\xd7\x32\xf8\x05\xb1\xd9\xef\xa4\x16\xaf\x54\x56\x38\x1b\x9c\x03\x5e\xbe\x5e\x3a\x2f\x9c\x97\xcd\x0b\xe6\x45\xf2\xe2\x78\x49\xeb\x97\xa9\xdb\x62\x7a\xe3\xa7\x2f\x8b\x31\xfd\x2a\x87\x74\x29\xf5\xd6\x78\x3d\x59\xa1\x7c\xc0\xb5\xe6\x47\xf1\xec\x97\x65\xac\xf7\xb9\x7a\x22\x65\x2c\x91\x91\x63\xa6\xac\x28\xd1\xe3\x24\x4e\x51\x6d\x24\x15\x5b\x8b\x7e\x23\x72\xf3\xae\x2c\xfa\x8d\xe1\x1e\xda\x37\xe5\x00\x24\x24\xb8\x00\x86\xb6\xb9\xa8\x17\x51\x4e\xf6\x4a\xb4\x90\x91\x7c\xdd\x2f\x6c\x6e\x4e\x63\x51\x20\xe3\x71\x18\x8c\xaf\xe2\xe9\x98\xe4\xfb\x31\x6d\xac\x82\xf6\x12\x75\xd4\x09\x2d\x8a\xac\x6c\x7b\x38\x8a\xc0\xe5\x75\xfe\xe5\x88\x55\xd0\x5e\xa2\xa2\x3a\xa1\x85\x81\x9e\x27\xb1\xeb\x5d\xbd\x99\x84\xe4\x2d\xa0\x0c\xe5\xab\x6d\x67\x61\xc8\x67\x28\xe2\xc1\x05\x6e\x69\x17\xb8\x20\x02\x76\xb5\xf7\x88\x36\xb1\xea\x9a\x09\x4c\x1b\x75\x1e\x70\x7d\xc2\x39\x70\x49\xc4\x65\xc2\x90\xff\xa3\xac\x47\x5c\x26\x1a\x88\x34\x89\xc5\x21\x91\x1d\xba\x63\x76\x59\x19\x52\x81\x58\x92\xe0\x3a\x01\xec\x7d\xdc\x83\xe9\xc5\x1c\x4e\xdb\x08\xfc\x1e\xa8\xf1\x76\xe0\xf7\xdd\xc1\x44\xe4\x04\x37\x08\x20\xd4\x75\xb8\x82\xb9\xce\x2e\x28\x8b\xe4\x35\x35\xeb\x4d\xe8\xc6\x5a\x36\xde\x0e\x5a\xdd\xa7\xb2\xe6\x4a\x4e\xc0\xb4\x57\xa8\x1e\xa8\x02\x4f\x24\x7a\xa4\xde\x05\x87\xd6\xa5\x44\xc1\xd5\x25\x8e\x5d\xfb\x8d\x10\x25\xf7\xbd\xc0\xa3\x6b\x59\xe1\x1f\x99\xee\x8b\xab\x24\x6b\x07\xdc\x11\xa3\x42\xb7\x88\x8a\xce\xc2\x81\x60\x5d\x49\x41\x15\x06\xdd\x55\x6b\x52\x6b\xa8\xbe\x58\xfc\x6f\xcb\x42\x57\x31\x19\x8d\x35\xaf\xca\x10\x73\x84\x3d\x0f\x9c\xe8\x57\xc5\xa3\x3d\x4b\xa5\x2a\x6a\xfb\x48\x46\xeb\xef\x03\x93\x84\xa0\xe2\xc3\x30\xb8\x81\xb7\x27\xe7\xd3\x31\x39\x0e\xc3\x20\xac\xae\x1f\x61\xdf\x0f\x62\x44\xfb\x04\xc2\x08\x0a\x45\x38\x42\x58\xca\x7d\x5d\xf8\x4a\x4e\x58\x1b\x07\x51\xe4\xf6\x3c\xa2\x14\xc0\xbc\xe4\x57\x23\xe2\xf5\x2d\x20\x26\x59\xa3\x41\x7a\xe9\x6f\x49\x9f\x84\xc4\xb7\x05\x0b\xe0\xda\x66\x88\x23\xbf\x12\xa3\x1e\x21\x3e\x02\x53\x06\x7b\x2e\x35\xff\x37\x51\x34\x19\x93\xb0\x5a\xd3\x52\xd0\x12\x88\xc3\x58\x4b\xdc\x81\xc3\x03\x12\xe1\xed\x0e\xbe\x01\xfd\x80\x81\x3c\xaf\x0b\xaf\xf7\x5a\x5c\x52\x4b\xf4\x94\x05\x77\x11\xe5\xf8\x40\xaf\xb1\xeb\x0f\x49\xe8\xc6\x51\x35\x9a\xf4\x8e\x58\xd3\x01\x5b\xf0\x5b\x54\x95\x13\x4f\x22\x0c\xe0\xd5\xa9\x48\xe6\x90\x22\xa7\x69\xce\x68\x5a\xba\xee\x09\x49\x14\x81\xef\x8f\x49\x14\x8b\x6b\x98\x3d\xc2\x1e\x62\x05\xa1\xd2\x56\x16\xa2\x6d\xb9\x8e\x36\x50\x86\x17\x10\x95\xe0\xbe\x9e\xff\x44\x41\x61\x50\x63\x57\xed\x28\x9f\x74\xff\x4d\x9f\x84\x27\x99\x44\x38\xc9\x30\xd3\x65\x83\x8c\x85\xc4\xf0\xd0\x85\xd1\xc1\x42\xea\x48\xc3\xc2\xa8\x9a\x89\x9e\xa7\x08\x97\xf3\x17\x91\xf8\x8d\x60\xe1\xb4\x2f\x61\xed\x53\xe1\x39\x0d\x94\xf0\x56\xbf\xba\x82\x9a\xc0\xe4\x96\x24\x81\xf6\xe6\x3e\x04\xff\xd5\x77\x3d\x72\x7a\x4d\xc2\x6b\x97\xdc\xa0\x37\x81\x37\x1d\x04\xfe\x5a\xb2\x2f\xc1\x9d\x46\xf2\x88\x37\x81\xeb\xc7\x51\xca\x77\xa4\x16\x57\x1d\xc3\x1f\xed\xfa\x36\x0b\x9a\xd7\xd1\x72\xfd\x96\xb9\x8c\x16\x1f\x8f\x1f\x73\x37\xc9\x53\x35\x7c\xaa\xfa\x5d\xa6\xe4\x98\x1f\xa0\x0b\x9e\x4b\xb8\x56\x9e\x9a\xdd\x29\x2b\x6e\x35\xc1\x4d\x32\x77\x88\x8c\x54\xc7\xc1\xbc\x7a\x65\x56\x2e\x26\xcb\xc5\xb8\x84\x61\x03\x1e\x3a\x44\x55\x18\x0b\xa9\xe9\xc1\x06\x47\x6d\x56\xbd\x3a\x0a\x46\xec\x4a\x32\xab\x64\xd2\x33\x39\x4f\x16\x52\x92\xc0\xfd\x66\x99\x99\xa7\x90\x37\xe6\xd3\x43\x2c\x1d\x87\x2c\x91\xaa\x76\xa0\x49\xa5\x60\xcc\x63\xd9\x44\xf9\x8a\x7e\x49\x77\xc5\xf5\x81\xae\xa3\xa2\x88\x5a\x1d\x8f\xc7\xde\x94\x53\x90\x26\x4e\x2d\x71\x1d\xa3\x5a\x17\x49\x0d\x2f\xf8\x8b\x4c\x32\xed\xa2\x4a\x08\x42\xad\x58\xfc\xb9\x07\x74\xc4\x04\x69\x04\x22\xab\x89\x42\xc0\xe4\x03\x16\x83\x78\xde\x08\x1f\xc9\xd3\x0b\xc4\x55\x93\xca\x9f\xd9\x1f\xec\x5b\x4d\x01\x72\x7b\x8d\x47\x24\x49\x24\x83\x0e\xd6\xd6\x78\x4a\x18\xfd\x39\xb1\xcf\x9f\x11\xff\x29\xfc\x10\x4a\x8e\x90\x76\x93\x9d\x07\xde\xad\x29\xfc\x7a\x78\x2a\x86\xa4\x22\x9f\x88\x66\x83\xbd\x5a\xab\x4a\xd7\xee\x9b\x63\x26\xc1\x8a\x95\x54\x41\xb4\x33\x9a\xbd\xb1\x99\x59\xd9\xd5\x71\xda\x91\x71\x52\x80\xe6\x19\x78\x66\x2f\x31\x19\xdf\x17\xeb\x1f\xa0\x97\x80\xf2\x90\x88\xf8\xd4\xc4\x08\x7c\xe9\x94\x38\x62\xfd\x26\x69\xc4\xda\xc2\x05\x11\x28\xa8\xef\x7a\x31\x09\xc1\xfd\x69\x61\x21\x49\xcb\x49\x29\x76\x95\x46\x4a\x34\x85\xb5\x78\x37\x77\x40\x14\x8d\x5d\x93\x03\x11\x42\x77\xba\x47\x23\x9e\xef\x60\xed\xae\xcc\x72\xf9\x62\x5d\xf6\xfd\xf5\xcb\x9a\x34\xaf\x04\xf0\x1a\x57\xd9\xca\x9b\xa4\x95\x78\x02\x5a\x35\x3a\xf3\x82\x86\xa9\x2d\x37\xaf\x24\x6d\x90\xe4\x9b\xb7\xc7\x67\xc7\xaf\xcf\x9f\x9d\x9f\x9c\xbe\xbe\x7a\x76\x7e\xfe\xf6\xe4\xf9\x2f\xe7\xc7\x67\x54\x96\x4c\x7c\x8a\xe0\xe6\x5d\x6a\xd7\x71\x9d\x3d\xd5\x60\x90\x8b\x4c\xc2\x0b\x10\x01\x67\x1c\xa7\xfd\xd2\x2b\x74\xb5\xfc\x21\x1e\xb3\xad\x4c\x84\x6e\x17\x2a\x9c\x3d\xf7\x61\x9a\x32\x5d\x82\xc2\x1a\x68\xcf\xda\x5d\x8d\x5b\xd0\x35\x78\xde\xcd\x5a\xf5\x60\x09\x17\x3c\xca\x24\x90\xda\xc0\xfa\x02\xae\x3c\xcb\xef\x34\x79\x81\x83\xa3\xe1\x95\x1b\x1d\xff\x39\x29\x78\x1e\xb2\xbd\xa0\x7b\xa9\x6c\x01\x4b\xed\x69\xa5\x89\x2d\xba\x01\x25\xe9\xfc\xc8\xe5\x9f\xbf\x51\xb1\xb0\x27\x30\x43\x19\x4b\xed\x75\x19\xe8\x2d\xba\x2d\x25\x49\xbd\x76\xf3\x9b\xbc\xbd\xe0\xee\x65\x9a\xfc\x52\xfb\x5e\x3a\xa9\x45\x77\xbe\xee\x65\x97\xb6\xbd\x82\x5d\xda\xf6\x72\xbb\xb4\xdb\xf7\xb8\x4b\xbb\xbd\xaa\x5d\xda\xed\x15\xec\xd2\x76\xb8\x9c\xa2\x51\x10\x14\x9c\xf0\xb7\xb7\x57\x43\x7e\x89\xda\xa6\x49\x2d\xea\x86\xee\xfe\x76\xa5\x77\x56\xb5\x2b\xbd\xb3\x82\x5d\xe9\xdd\xfb\xdf\x95\xde\xbb\xba\x02\x6b\xe3\xea\x68\x12\x5e\xe7\x9f\xda\xee\x2d\xe8\x9a\x71\x5f\x90\x7f\x11\xe4\x0f\x31\xbb\x8b\x1e\x95\x34\xc0\xaf\x5e\x8c\x5d\x9f\x84\x57\x2f\xa9\x81\x9c\x2f\x9f\x05\xfd\x12\x36\x9b\xb4\x0c\x6e\xf3\x5e\xbd\xc4\x3d\xe2\xbd\x74\xa3\x82\xba\x2c\x38\x5e\x36\x5b\x57\x57\xb0\x2d\xf5\xbc\xe0\xfa\x49\xb3\xb1\x68\x2d\xc4\x2e\xc1\x0b\x1c\xe3\x19\x67\x0f\x0b\xba\x9d\x6c\xce\x7b\xbe\xb1\x48\x19\x1d\x5e\xc6\x11\x5d\x6e\x16\x97\x01\x37\x56\xc5\x6e\xd2\xc3\x39\xca\xc3\x39\xca\xc3\x39\xca\xca\xce\x51\x5a\xda\x41\x0a\xdb\xfe\xff\xaf\x1b\x0f\x83\x49\xac\x94\x1b\xf4\xfe\x00\xb5\x8d\x84\x36\x30\x89\xa2\x43\xf4\xe9\xee\x40\xd5\x23\xe6\x85\x59\x48\x04\x9c\xd2\x0b\x3c\x06\xb7\x86\x7e\x00\x38\x15\x3a\xce\xbb\xbe\x68\xe4\x47\xa5\xba\x0e\x30\xe0\xd6\xd4\xcc\xbc\xf7\xb8\x97\xcc\xb1\x34\x68\x63\xb6\xcb\xa8\xb5\x8b\x03\x2a\x9d\xc9\x88\x6a\x0c\xf3\xc3\x89\x43\x79\x2e\xa4\x3b\xe8\xa4\x11\xd9\x2e\x62\x21\x1c\x86\x2d\x74\x88\x64\x22\xb1\x45\x27\xc6\x95\x30\xdd\x75\x68\x06\xc6\x23\x0e\x43\x9d\x47\x1a\x75\x20\x71\x0b\x45\x28\xe3\xa3\x1f\x06\x23\x60\x22\x73\xa0\xf4\x70\xd6\xf5\x70\xd6\xf5\x70\xd6\xf5\xf5\xcf\xba\x5e\xba\x3e\x59\x33\x5c\xc0\xa5\x83\xc5\x8f\xcf\x8e\xce\x4f\xdf\x52\x7b\xa3\xce\xfc\xfd\x35\xf9\x18\x4c\x33\x95\x39\x09\x32\xad\x16\xca\x9c\x04\xb5\xe6\x3e\x0a\xa2\x1c\x15\x9c\x03\xd1\x68\x0d\x4d\xf2\x2a\x24\x7d\x7e\x0c\x00\x9f\xb4\x54\x3a\x95\xc0\xb1\xcc\x55\x48\x62\x1e\x69\x3e\x30\xa2\xe4\xc4\x29\x82\x1c\x5a\xaf\x3c\xe2\xab\xe6\x16\x1f\x42\xe1\x94\x27\x92\x83\x2d\x4d\x55\xb3\xd0\x15\x35\xbf\xc0\x5a\x81\x5f\xdf\x43\x6e\xf6\x01\x03\x2e\xdf\x27\xa7\x59\x2f\xae\xb8\x65\x95\x18\x72\x57\x02\x08\x2e\x7d\x92\x47\x39\x57\xcf\xd3\xaa\x50\x23\x38\xb3\x99\x75\x98\x45\x25\x82\x0e\xa1\x6a\x65\x0e\xb4\x40\x04\x35\x98\xd5\xf8\x91\x16\x25\x60\xa1\x0b\x4a\xee\x92\x1a\x43\x36\x8e\xab\x94\xff\x5a\xad\xc6\x25\x2b\xfe\xd6\xe9\x94\x4f\xb8\x9f\x4b\x38\x37\x8a\x9e\xf9\xee\x08\xce\x3a\x7e\x74\x7d\x37\x1a\x12\x87\xf7\x23\x81\x55\x19\xc4\xd8\x7b\x09\xf2\xec\x22\x06\xe7\x76\x27\x88\xb9\x4e\x19\x55\x34\xad\x37\x2e\xd6\x5d\x50\xc5\x89\xef\xfe\x39\x21\x27\x1c\xad\x35\x39\x3b\xf2\x5c\x9f\x6c\x56\x24\xd7\x36\xb6\x87\xe4\x4d\x48\xae\x29\x09\x4d\x2f\xd5\xd3\x5e\xd0\x1a\x56\x4b\x12\x9f\xd1\x8a\x56\x3f\xa1\x71\x48\xae\xdf\xf0\x8d\x7b\x7e\x3e\x76\x27\x4e\x40\x04\xf9\x31\x8e\x87\x6f\xa1\x0d\x12\xc2\x7e\xe0\x90\x34\xd9\x11\x76\x7d\x58\x1a\xa3\x43\x44\xe3\x53\x64\x86\xd8\x77\x3c\x22\xe5\x79\xec\x3b\x69\xdb\x3a\x8f\xc9\xdc\x56\x90\xbc\x8a\x4c\xcc\xba\x0e\x7c\xb5\x94\x6a\xba\x3e\x29\x46\xce\x62\x1c\xc6\x4b\xb1\x02\x23\xed\x6c\x5e\xa0\x20\x8d\x1b\x32\x1a\xd3\x46\xcc\xef\x02\x4a\xbf\x4f\x0e\x62\x61\xb8\x44\xe8\x09\xe0\x9c\x05\x11\x61\x30\x67\xb4\xe9\x83\x3e\x22\xd8\x1e\xa2\x41\x18\x4c\xc6\x2c\xcd\xbf\xc6\x38\xc4\x23\xf4\x89\xe9\xe1\x1d\x5b\x59\x00\xc8\x16\xfb\x45\x0d\x21\x20\x20\x57\xee\x5a\xbe\x24\xe3\xed\xb3\x5b\x37\x42\x08\xb2\xca\x39\x04\xe4\x15\xf4\xd1\xed\x26\xbe\x75\xa3\x9c\x9c\xd3\xa2\x9c\x53\x53\x4e\x06\x72\x7f\x07\x95\xfa\x0f\x99\x42\x4e\xd6\x17\x60\x75\x18\xf4\x11\xd6\xea\xc8\x07\x99\x4f\x30\x92\xdd\x21\x21\x18\x07\x08\x40\x9a\xad\xb5\xcc\x11\x36\x1b\x99\xb5\xf3\x6b\x29\x83\x17\xae\xf3\x2a\x98\xf8\x71\xc5\xe2\x47\xc8\x5b\x4f\x10\x89\x3c\xd7\x8f\x37\x1d\x37\x82\x15\x11\x82\xed\xb9\x2d\x3f\xd8\x74\x5c\x67\x73\x44\x53\x6f\x46\x24\xde\x64\x43\xc8\x93\x2d\xe3\x19\x78\xa6\x00\x45\xd7\xc0\x6a\x53\x34\x47\x51\xb5\x67\x76\xec\x5e\x93\xec\x39\xb5\xf1\x88\x5a\x19\x92\xc4\xb9\xfa\x80\xc4\xe7\x49\x68\x55\x2a\x6a\x5a\xbb\xb5\xd1\x4c\xa5\x73\xa7\x9e\x8a\x8a\x53\xd7\x94\xcc\xfe\xeb\x7a\xde\x5b\x62\x13\xf7\x1a\x56\x54\x51\xce\x35\x80\xdc\xf4\x55\x9f\xdc\xc6\x62\xc1\x57\xfe\x8a\x00\x16\x42\x3a\x71\x92\x2b\x00\x4a\xe0\xec\xeb\x04\xfa\x35\x01\xc9\x85\x4a\x04\x8c\x46\xe5\x5b\x6d\x8a\xec\x10\x2c\x86\xdd\xa4\x79\x72\x64\xa7\xb7\x4b\x8e\xc0\xd2\x8d\xa7\x09\xc7\xa6\xe3\xed\x8b\x60\x24\xc4\x23\xc7\xe0\x83\x5c\x8d\x90\x59\x1e\x3f\x96\xbf\x53\x1a\x52\x10\x55\x65\xae\x13\xd2\x37\x15\x94\x22\x72\x35\x65\x40\x15\x2d\x0c\x3e\x90\x17\x38\x1a\xc2\x91\x6f\x7e\x8d\x53\x09\xab\xc2\x64\x51\xca\xb1\xc0\xe1\x65\x4a\x59\x68\x90\xac\x29\xc4\x67\xef\x35\x8d\x43\x62\x21\xda\xcc\x86\x8b\x1f\xe3\x90\xa0\x0d\x88\x94\x8d\x97\xdc\xca\x00\x81\xd3\x5e\xab\xba\x1c\xe3\x90\x80\x5b\x4a\xd1\x16\x6a\x36\x6a\x6a\x03\x84\x84\xb6\x4b\xc2\x17\xfb\xf1\x9d\x92\x45\x4f\x1d\xc5\x49\xff\x55\x5a\x65\x93\xe7\xd4\x18\xe2\xb4\x69\x55\xd1\x21\xba\xb8\x14\x94\xd2\x2b\xeb\x68\x32\x02\xbb\xee\x00\x7e\x6d\x70\xe9\x5c\xb8\x97\x16\xda\xd8\x70\x55\x51\xb0\x85\xc0\x08\x6d\xc8\x24\xe8\x07\xad\x0a\x6a\x62\x94\x61\x40\x98\x58\x86\xed\x00\xd6\x20\x0a\xe8\x63\xcd\x42\x17\x9a\x70\xe8\xb2\x73\x74\x29\x85\x47\xff\xeb\x85\x04\x7f\x48\x02\xee\x4c\x63\x1e\x19\x8d\xe3\xa9\x60\x41\x61\xa8\x2e\x45\xdd\x82\x75\x67\x03\x3d\x45\x17\x0d\x4b\x11\xf1\x25\xea\x52\x16\xe4\x67\x5a\xb1\x0b\xeb\xc3\xdc\x9a\x90\x31\xc1\x31\xab\x9b\xc5\xf4\x83\x19\x96\x99\xe4\x0a\x63\x35\x4b\xe1\xb9\x56\x1f\xe1\xb1\xa2\xa0\x94\x94\x41\x37\x69\x30\xda\x40\x95\xf1\x6d\x25\x51\x4e\x7e\x25\xce\x82\x3b\x71\x39\x1d\x8f\x71\x98\x7b\x2d\x2b\xcb\x7e\xa6\x4b\x45\xbf\xf8\x6e\x2c\x7b\x94\x22\xd4\x47\x42\xa8\x33\x9b\x9d\x36\x75\xe3\x92\x2e\x09\xe1\x33\xa5\xf0\xec\xe0\xe8\x22\x11\xbf\x69\xef\x14\x98\x3b\x48\xab\xab\x92\xbb\x80\x07\x96\xca\xdc\x2e\xb2\x86\xb5\x5a\x66\x46\xcd\xdc\x44\xcc\x91\x30\x5d\x43\x8a\x43\x89\xc2\x0b\x70\x22\x51\x6a\xe6\x2f\x9a\xf8\xe9\x70\xfc\x28\x59\x9f\xd4\x0d\x46\xe8\x3c\x77\xd8\xd8\xe4\xd7\x2a\x7b\xe9\xae\x65\xb8\x75\xc7\x8c\xc1\x24\x05\x7c\xab\x09\xa6\xa9\x04\xd3\x74\x02\x0f\x4f\x83\x49\xac\xa4\x60\x01\xda\xd5\xbe\xa1\xeb\x39\x21\xac\x5d\x45\x22\x11\xa4\x8d\x80\x84\x4b\xf4\x24\x26\xa3\x52\x2b\x2e\xf3\x75\x29\x97\x5f\x3c\xf3\x9d\x23\x5a\xca\xf3\xe9\xf9\x74\x4c\xd8\xca\x4b\x14\x5b\x74\x07\x4b\x3f\x95\x32\x6d\x26\x1c\x68\xb7\x11\x55\xae\xcb\xb6\x5e\x72\xf6\x80\x63\x0c\xcb\x36\xf6\x1a\x2e\x26\x61\x55\x06\x59\xc2\x6c\x36\x50\x55\xc7\xed\xdb\x6e\x42\xa6\x7e\xab\x35\x9e\x1a\x33\x55\x63\xb8\x4a\x27\xb1\x10\xa0\xa6\x80\x6a\xfd\x8a\xbd\x6e\x89\x76\x30\x1d\x51\x5d\xac\xdf\x88\x9b\x86\xbf\x52\xda\xcf\xa7\x2f\xf8\x22\x80\x3d\x2e\x94\x25\x8f\xf1\xd4\x0b\xb0\x93\xd4\x36\x99\x21\xf2\x3a\xf1\x1c\x57\x30\xea\xb8\x6e\x7b\x81\x2f\x6f\x53\xaa\xad\xa5\xde\x3a\xa4\x85\x8b\x95\x73\x22\x06\xe8\x0e\x5d\x94\xea\x15\x53\x16\x9a\xea\x0a\x4c\xef\xbb\x28\xad\xff\xd9\x26\xee\x1a\xc2\x14\x23\x05\x15\x0d\x4d\x2f\x82\x98\xb2\x5e\x38\x32\xf1\x34\xd5\x60\xcc\xf6\x34\xc7\x59\x5b\xdc\x61\x49\xd0\x21\xba\x0e\x5c\x47\x31\x03\xa9\x4a\xcf\x27\x5e\x37\xfa\x15\x7b\xae\x23\x04\xcc\x0a\xad\xa9\x3a\x9b\x14\xb6\x44\xc3\xe9\x95\x91\x9a\x91\xb8\x54\x5a\xf0\xe6\x55\xb5\x56\xcc\x32\x8b\xac\x1a\x8b\x4d\xd2\x83\x45\xa9\xde\x60\x9e\xf3\xb2\x45\x35\xb3\x2b\xe4\x04\x71\xc5\xe2\xa5\xd7\xd5\x9b\xc5\x4b\x4b\x55\xbb\x5d\x5c\xf6\x1a\x83\x61\x1c\x4c\xdd\x47\x66\xd3\x0f\xfa\xa4\xde\x43\x4d\x44\x72\x97\x3f\x25\xf3\x8a\xcc\x56\xfc\xbc\x95\x68\x92\x20\x7d\x29\x9d\xce\x8b\x62\x7e\xd4\xa6\x9a\xec\xd4\xac\x4e\xa2\xd9\x99\x5b\x5f\x5a\xde\xcb\xc4\xae\xb0\x0d\x4c\xb4\x73\xe7\x75\x27\x48\xe6\xdb\x76\xdd\x09\xe2\x82\x49\xbf\x9d\xac\x8d\x93\x02\x3c\x7e\x58\x1a\x2d\x31\xcb\xce\x7b\x8f\xfc\x40\x5b\xec\x46\x71\x30\x7a\x11\xc4\x5f\x84\x09\x27\x88\xb5\xd2\x9d\x00\xe4\xc3\x9f\x0e\xe8\x16\x3b\xbc\x62\xa1\x0b\x9a\x54\xdf\x76\x12\x5e\x13\xa5\x57\xa4\xce\x34\xd5\x09\xe2\xcd\x0a\xda\x40\xae\xda\x20\x61\x17\xb5\x93\x29\xcd\x4a\x84\x6f\xa5\xe4\x60\x69\xb3\x3a\x57\x72\xf6\xac\x26\x33\x3b\xdb\xb7\x22\xea\xd6\x42\xf6\x54\x7c\x50\xd6\x7d\x87\xdc\x76\x91\x6b\x21\x3e\xb1\x8a\x38\xfe\x99\xb0\x92\xd8\x31\xc9\xc4\x0a\x1d\xa6\xae\x4f\x23\x54\xc1\xa4\x00\x6a\x86\xe5\xf4\x62\xb3\xb2\x36\x0c\x49\x46\xe6\xbc\xf9\x64\x1a\x96\x24\x2d\x6d\x28\xca\x0e\xaf\x51\xc5\x4a\xda\x2d\xaa\x30\xc7\x54\xb2\x87\x45\xfc\x63\xd6\x84\x0c\x9b\x34\x67\x70\xc3\x00\x7b\x5e\xde\x4e\x88\x31\x2d\xdf\x5e\xb2\x90\x4f\x88\x73\xe4\xb9\x63\xe3\x54\xcd\xfa\xf1\x76\xee\x68\xc0\x4f\x21\x79\xb2\x3a\x9c\x30\xe6\xdb\xe7\xdb\x26\xfb\x3c\xf0\x7d\x62\xc7\xaf\x27\x9e\x17\x29\x09\xd5\x60\x7d\xeb\x84\x56\x23\xdb\x1d\xca\xbc\x49\x59\xd1\x60\xb2\x78\x49\x8b\xbe\x4a\xe9\xbb\x9e\xd7\x45\x15\x3f\xf0\x49\x25\x91\x5d\xbe\x7e\x81\x8c\xb4\x94\xee\xf8\x0d\x8e\x87\x5d\xd9\xd8\xe8\x29\xaa\x4c\x42\xaf\xfa\x0f\x11\x05\x43\x87\x38\x70\xda\x40\x95\x5a\x85\x3b\xcd\xce\x3e\x7e\x61\x7f\xd7\xe4\x98\x32\x4e\x8f\x1f\x54\x0b\xba\x88\x9d\x36\xa7\x0c\x53\xad\xb9\xbb\xda\xd7\xbd\x74\xed\xf2\xf7\x30\x67\xdb\x18\x89\xe6\x51\x43\x83\x9f\x67\x71\x37\x7b\xe2\x74\x4b\x7f\xf9\x93\xdb\x65\xff\xeb\xc6\x43\x39\x49\xcf\xee\xb5\x5a\xf2\xaa\x68\x43\x83\xb9\xd1\x36\x99\x1b\xac\x4b\x75\xca\xae\xd4\x3b\x86\x95\x7a\xa4\x6f\xa4\x2a\x69\x53\x31\x6a\x26\x93\x99\x23\xb2\x65\xe2\x8c\x9b\xf1\xcf\xc9\xc0\xf5\x95\x5c\x7a\x84\x31\xcb\x0b\x71\x2a\x64\xc8\x25\xe2\x8c\x19\x8f\x71\xe4\xfa\x03\x53\x36\x16\x33\xeb\xb4\xa0\x93\x77\x5c\x10\xc0\x8d\x8f\xc3\xfc\x6b\x5b\x3c\xbf\x85\x2e\x2a\x4c\xf2\x15\x0b\x55\xa2\xf4\x1e\x37\xaa\x64\x64\x46\x03\x75\x91\x68\x21\xa2\xba\x5a\x20\xab\x8c\x16\x74\xe2\x54\x2e\xf5\xed\xe9\x2b\x71\x82\x9d\x58\x95\x9a\xc2\xc8\xe3\x5e\x5a\x2d\x66\x74\x26\x61\xda\xf4\xa0\x9d\x19\xf0\xa4\xda\x2e\xff\x97\x9d\xc6\xf3\x6e\xd6\xd7\xb1\x32\x71\xab\xbb\xc6\x54\xa8\x5d\x94\xaf\x77\x0e\x97\x71\x37\xab\x81\xa9\xae\x00\x2d\xd6\xcd\x76\x0a\x6d\xdb\x03\x1a\xa7\x9b\x56\x4a\x35\x49\x3f\x0c\x46\x5d\xf4\x09\xc5\x5d\xd4\x50\x8d\x06\x2a\x6b\x1e\xde\xd4\xc3\xd9\xe0\xc3\x0e\xfb\xd1\x06\xca\xd3\x52\xed\xb4\x9b\x8f\x6a\xd9\xc3\xf6\x9c\x2c\x70\x28\x6d\xce\x04\x51\x8a\x09\x9a\x4c\x6a\xc9\xbd\x97\x90\xf4\x5b\xb5\x94\x01\x1a\x22\xb0\x1b\x68\x54\x3d\x56\x8c\x45\xc4\x6f\x71\x0a\x75\xd3\xf3\xb1\x9c\x51\x4c\xc6\xfc\x16\x43\xa1\xa1\x4d\xad\xd5\x74\xfe\x34\xfd\x0b\x48\x75\x99\x4d\x26\x5c\x23\x92\x6b\xb8\x6a\x9b\x4a\x7f\x60\x4c\x0d\x7e\x8f\xc6\x81\x87\xe3\x20\xfc\x6d\xf1\x7b\x1d\x0e\xcc\x54\x09\x31\xf2\x9a\x39\x1b\x03\x1b\x82\xb2\x92\xbc\x89\xbf\xad\xcd\xe6\xe4\xdd\x7d\x72\x32\x95\xaf\xf3\x6b\x5a\x2b\xb2\xff\x44\xb7\x57\xe7\x59\xde\x3a\x9f\x10\x5d\x49\xa8\x02\xab\xc6\x35\x0b\x4d\xf5\xc0\x77\xd5\xb8\xa6\x5c\x9a\x90\x7a\x96\x2e\x8a\x17\x04\xb4\xf5\xc4\xe9\xcc\xea\x6a\xa4\x5d\x37\xdb\xce\x42\xc1\x12\xeb\x59\x23\x72\xb7\x96\x2f\xec\x7b\x92\x75\x43\x3b\xd5\xd4\xb8\xe1\x56\xb3\x1c\x86\x55\x6e\xaa\xb1\x29\x69\x48\xfc\xf4\xd9\x69\x76\xb3\x4e\x74\x95\xd4\x4c\x65\xea\x8f\x1e\x3f\x53\x4b\x25\xad\x47\x63\xcf\x8d\xab\x5b\x17\xd6\xfb\xe8\x72\x63\x6b\xe0\x8e\xd2\x67\x58\xfe\x64\x94\xed\x78\xe2\x90\x15\x87\x11\xf9\xd1\x0b\x70\x0c\xc9\x8a\x1b\x35\xb7\x52\xbc\x99\x0d\x87\xc5\x52\x64\xc6\xf3\x62\xad\xb9\xd3\x1b\x72\x85\x25\x26\x4d\x01\xa7\x70\xa8\x02\xae\x9e\xb5\x03\x5a\x99\xa4\x96\x3a\xa9\xcb\xa8\x76\x19\x65\xcd\x2e\xf4\x74\x4e\x53\xad\xd2\xcd\x61\x7d\xcd\x2c\xdd\xbb\x79\x96\xaa\xb3\x4d\xdd\x3c\xeb\x16\x6c\xa4\x9d\xb2\x36\xec\x8e\xc1\x86\xcd\x37\x47\x77\x4c\x5b\x6e\x4a\xd9\x60\xb6\xb4\xe6\x31\x87\x5a\x73\xd8\x43\x2d\xb3\x41\x94\xbb\xd5\xc7\xab\x2a\x7f\x89\x83\xd4\xc7\x8f\x51\xf5\x91\xc2\xcb\xe3\xc7\x5a\x71\x3f\xa0\x06\x80\x56\x2c\xf2\x38\xba\x5a\x53\x26\x44\x8b\x97\x5b\xab\x19\x76\x15\xf9\x59\xf6\xac\x95\x4b\xde\x6e\x6c\x3a\x7b\x81\x16\xcf\xd2\xb7\xf9\xf1\x43\x76\x73\xb5\x6b\xe8\x3a\x89\xb6\xec\xd6\xe9\x67\xde\x96\xe8\xee\x8c\x2d\xd1\xdd\x52\xe8\x23\xbb\xc9\xa6\x7b\xfe\x81\xe9\xee\xac\x03\xd3\xdd\xec\x81\x69\x1c\x8c\x95\xe8\x38\x18\x6b\xbb\x35\xa4\xaf\x56\x84\x7e\xaa\xd1\x37\xae\xc3\xd4\x96\xc7\xc3\xb7\x26\x26\xe2\x0e\x86\x2a\x05\x16\x50\xae\x13\xee\xce\xda\xf7\x86\x46\x48\x60\x57\x96\x43\x60\x31\xec\x91\x6b\xfd\xdb\xb4\x89\xae\x2d\x91\x86\x38\x3a\x73\xfd\x81\x47\xa0\x53\x24\x86\x26\xef\x8c\x87\x87\x87\xa8\xa9\x0e\x22\x25\x21\x5f\x4a\x1e\xd0\xa4\xf0\x5e\x92\x62\xe4\xfe\xce\x21\x57\x96\xc7\x8f\xd9\x8f\x3a\xf6\xbc\xe0\x86\xda\x13\xa7\xd7\x24\xec\x7b\xc1\x0d\x15\xe0\x54\xa4\x99\x9a\xd3\xfc\xb5\x76\x59\x15\x19\x2b\xeb\x0c\x65\xcb\x6b\x25\xec\x23\x54\x71\x48\x3f\xaa\xa8\x6a\xad\x6f\x94\x15\x55\x71\xae\x82\x10\xaa\x88\xfd\x39\xad\x38\x5a\x6f\xd7\xe9\x26\xb1\xda\xee\xdd\x9d\x9e\x74\x19\x5e\xa8\xd6\xc5\x15\x6e\x8b\xc3\x78\x40\xed\x6f\x3a\x6c\xb0\xd1\xa0\xcb\xfe\x58\xbc\xeb\x77\xc5\x10\x70\x57\x53\x58\x48\x7e\xd7\x32\x7b\x8a\x8f\x52\xfd\x88\x4e\x5a\xa9\x39\x20\x99\x35\x92\x6c\x4a\x9a\xe4\x26\x4c\x12\x5d\x4d\x51\xfd\xfc\x99\x8e\xd1\xb5\x14\x75\x76\x66\xa7\xe4\x7a\x94\x1d\x9d\x3e\x7f\x36\x0d\x15\x40\x69\x81\x27\xcc\x06\x55\x16\x35\xc5\x9e\xf7\x7c\xfa\x06\xbc\xe9\x2b\xbb\xc0\x72\xae\x35\x18\x59\x3a\xac\xd0\x4b\xd7\x27\xc5\x98\x42\xed\x39\x31\x85\x5e\xb2\x71\x66\x09\x40\xa1\x9c\x5d\xf0\x12\x88\x42\x73\xd3\x64\x72\x3d\xfe\xf5\xf8\xf5\xf9\xe2\xf0\x44\x66\x8c\x09\x0d\x9e\x88\x6d\x6d\x2f\x40\x22\xf0\xc9\x69\x9f\xca\xaf\x7a\xb1\x68\xee\xea\x45\x05\xbc\xc1\x57\x2c\xc4\x7e\x1c\x79\x41\x44\x1c\xf9\x79\x3a\x26\xb0\xd7\x47\x27\x08\x1c\x26\xbf\x92\x64\x3e\x8e\x27\x21\xf6\xe8\xcf\x51\xe0\x07\x71\xe0\x93\xdf\xd4\x8f\x77\xea\x07\xdb\x85\x24\x63\xf1\xf7\x39\xe9\x07\xa1\x0c\x7d\xd6\x8f\x49\x58\x01\xf5\x99\xbf\x3a\xd4\x1a\xbb\x84\x9e\x37\xf1\xdd\xf8\x2b\xc8\x93\x37\xe8\x22\x05\x33\x98\x26\xc6\xbd\xbf\xa8\x42\x7d\x13\xdc\xc3\x9c\x7f\xe2\xfc\x75\x2b\x70\xfb\x57\xaf\x00\xbf\xcb\xb5\x08\xfb\xb0\x85\x24\x85\xb0\x24\x0d\x8f\x0c\x88\xef\x9c\x2f\x35\xb6\xcd\x7f\x1a\xda\x83\x31\xfb\xe5\xf1\x4f\xc7\xaf\x5f\x5c\x9d\xbf\x7b\xc3\xc6\x6b\x10\x8c\x38\x35\x5c\x62\xa8\x1c\x06\xa1\xfb\x91\xda\x92\x30\xdc\x5d\x93\x10\x16\x92\x15\x46\x5f\x3f\x85\x5c\xa0\x94\x5e\x10\x80\x15\x43\x17\x25\x4b\x10\x58\x43\x68\x6b\x0b\xdd\x0c\x09\x9c\x11\x0d\xf1\x35\x81\xc5\xa4\xcb\xae\x69\xaf\x21\x84\xc1\x0c\x79\x11\x7c\x8d\x41\x92\xeb\xc7\x22\x05\x13\x66\x3f\x2e\x3c\x39\x2c\x94\x91\x8a\x94\x35\xaf\xf3\x20\xaf\x39\xe4\xb5\x06\xdb\x02\x0b\x09\x2c\x41\x3d\xa4\x8b\x83\x25\x49\xf0\x15\xc5\x52\x34\xc4\x3a\x64\x29\x22\xb3\x31\x28\x73\x89\xcc\xc6\xa0\xcc\x9f\x53\xca\x62\x50\x96\xa8\xc1\x0c\x0c\xca\x52\x14\xf8\xce\xd9\x02\x54\x20\x27\x03\xb2\xa4\xa4\xb2\xe7\x84\x8b\x6a\xf9\x5a\xf6\x9c\x72\x61\x52\x6b\x86\xcd\xa8\xa5\xa6\x02\xfd\x90\x78\x49\xf1\x67\x4e\x93\x57\x45\xef\x98\x1f\x31\x2f\x31\xb3\x12\x1c\xc1\x32\x80\xfe\xdd\x64\x77\x0e\xe0\x67\x30\x89\x95\x60\xf1\xc9\x57\x23\x6c\x60\x56\x0e\x9f\x97\xa8\x10\x43\x47\x15\xab\x56\x16\x29\x6e\x84\x7d\x52\xed\xc2\x86\x66\xe6\x36\xb2\x33\x3f\x43\xb7\xd0\xe7\x59\xf1\x30\xdf\x51\x3f\x54\x0b\xa9\xc2\x76\xe0\xd6\xc4\xc9\x49\x17\x55\xfe\xd1\x6e\xee\xb5\x7a\x8e\x12\xf8\x5f\x36\x98\x35\x69\x08\xbf\xbe\xf5\x8f\x7e\xbf\x5f\x51\xc7\x97\x0b\xd8\xc8\x32\x68\xe1\xa3\x45\x2f\x98\xf9\xec\x88\x30\x3a\x8b\xf8\xb1\x60\xcd\xa4\x99\x8d\x1c\x0d\x6b\x76\x1a\x0d\xa3\xb2\xf0\x26\x97\xf6\x0e\x17\x9b\xb1\x6f\xcb\x9d\xf6\xec\x9b\x75\xf4\xe9\xce\xd4\x85\x4d\x39\xe0\xc5\x3d\xfa\x74\xb7\x76\x97\xb4\xf4\x80\xc4\xe2\x49\x76\x06\xa2\xe0\x2a\x24\xfd\x36\xdb\x00\x66\xa7\xf2\xfc\x7e\x20\x0d\xd6\xf7\xf3\xe5\x1e\x3a\x44\x69\x3b\xe8\x53\x2d\x4a\xdb\x3b\x87\x74\xe7\xae\xfd\x21\x95\x15\x82\xb4\xfc\x7a\xa2\x69\x26\x91\x78\x8d\x2e\x52\xf0\x6f\x11\xdd\xc3\xbe\x73\xe6\x7e\x24\x32\x5e\x04\xc8\xfc\x6c\x97\x46\xca\x80\x53\x51\x43\x45\xd2\xa0\xdf\x8f\x48\x2c\xd3\xb0\xcf\x83\x35\xb9\x21\xcd\xae\x66\x72\x2c\x31\xf8\x64\x3b\xee\x20\x41\x71\x6c\xa1\x51\x2e\x71\x8f\x82\x66\x86\x09\xa0\xd4\x41\xf7\x02\x8f\x77\x78\xa1\xe2\xc1\x0e\xdf\xa2\x76\xfb\xa8\x2a\xaa\x74\x78\x88\x54\xf3\x5f\x75\x1e\x90\x7a\xbf\x74\xbb\xf8\x03\x23\x4f\xf0\x78\x84\x63\x72\x14\x04\xa1\xe3\xfa\x38\x26\xa7\x7d\x40\x8f\x01\x4e\x3f\x21\xac\xbc\xe0\x41\x31\x55\x83\xae\xa2\x4a\x96\x6c\xed\xae\xfc\xc5\xaf\x3f\x74\x91\x2a\xdb\x2e\xfb\x03\x98\xcd\x82\xf5\xc2\x09\x3e\x0f\xf4\xb6\x5a\xab\x42\xdb\xd4\xd0\x53\x06\x40\xc4\x1f\x12\xd5\x23\x70\xe7\xc6\xe2\x92\x32\xb8\x09\x90\xba\x00\xae\x5f\xed\x16\xa7\x2b\x26\xbc\x16\x21\xe8\x42\x73\x66\x0e\x5e\x6f\x73\x79\x9d\x7e\x91\x86\x9c\x6a\x0d\x39\x5d\x45\x43\x9a\x44\x6c\x10\x30\x88\xf7\x4e\xdb\xf1\x4d\x36\x61\x53\x37\x73\xd3\x97\x6e\xd1\x9d\xc5\x87\x82\xda\xc1\x9a\x40\x0c\x69\xad\x0a\x58\x5c\x80\x05\xa5\x50\xc5\x77\x1f\x50\xc5\x1f\x50\xc5\x1f\x50\xc5\xbf\x20\xaa\xb8\xa4\x02\xcf\xd1\xf3\xdb\x7a\x6f\x55\x05\x2c\x05\x34\x9e\x26\xb6\x28\x2a\xf8\xbd\x60\xa9\x6f\xaf\x00\x4b\x7d\x7b\x39\x2c\xf5\xce\x3d\x62\xa9\x77\x56\x85\xa5\xde\x59\x01\x96\xfa\xff\x21\x6c\xf1\x7b\x05\x8d\x4f\x93\x5f\xa2\xb6\x69\x52\x0f\x40\xe7\x7f\x75\xa0\xf3\xfb\x06\xb5\x97\x17\x96\xef\x13\x8b\x7c\xfb\xfe\x21\xd5\x17\x81\x3b\x7f\xc0\x3b\x7f\xc0\x3b\x7f\xc0\x3b\xbf\x4f\xbc\xf3\x07\x30\xed\x07\x30\xed\x07\x30\xed\xaf\x0f\xa6\xfd\x2c\x24\xd8\x00\xa6\x4d\xbb\x31\x8d\x2a\xb5\xe1\x6b\x32\x46\xee\x07\x33\x9b\xb2\x54\x80\x99\x4d\xa3\x57\x88\x99\x4d\xc9\xfd\x4d\x31\xb3\x69\xd5\xca\x60\x66\x83\x08\x96\xc6\xcc\x2e\xc2\x69\x9e\x13\x13\xdb\x60\x30\xce\xc2\xc4\xc6\x21\xc1\x73\x60\x62\x5b\xa8\x87\x23\xf2\x52\x43\x5a\x4c\xa3\x3d\x27\xfb\xe6\x19\x94\x6c\x4b\x8b\x7b\xce\x49\x75\x25\x51\xb1\xb7\x3e\x03\x7b\x3a\x1f\x04\x9b\x2a\xa1\x7e\xaa\x26\x9e\xbc\x19\x41\xae\x93\x07\x17\x73\xa2\x67\x2b\xcf\x34\x96\x40\xc2\xd2\x78\xd1\x5e\x17\x99\xb1\xb8\x25\x26\xee\x02\x98\xdc\x29\xc9\x88\xa4\x45\xa0\xdb\x07\xf3\x09\x27\xc1\xf3\x5e\xb5\x74\x80\x9b\x3c\xf9\x68\xf8\xe0\x9a\x84\x16\xc3\x09\xd7\xd0\xae\xd9\x98\x6a\x46\xbb\xfe\xcb\x22\x37\xab\x29\x44\xcf\x4b\xd2\x88\x90\xfb\xc2\x77\x56\x86\x90\x99\x48\xcf\xff\x47\xc0\xc8\x32\x8d\x9f\x8f\x32\xaa\x3e\xbd\x6b\xcd\x78\x7a\xd7\x32\xa1\x91\xd1\x01\xbf\x3c\x10\x98\x69\x9b\xe3\x8b\xa3\x91\x2d\xc1\x04\x43\x23\x53\x8a\xff\xca\x70\x64\x52\xfa\xc5\x70\x64\x2a\xe0\x98\x1a\xac\x40\x8f\xa9\x6f\x0c\x05\x08\x99\x12\x56\x0c\x68\xb6\x38\x58\x99\x62\xfd\xaf\x1c\xb8\x2c\x73\x0a\xf1\x55\x81\xcb\xc0\x32\x5a\x06\xab\xec\x67\x79\x23\xe3\x2d\x3c\x2a\x2b\x18\xc0\xf4\xa4\x55\xec\x8d\x87\xd8\x34\x29\xe4\xa3\x14\x66\xc6\xf1\xb6\x1c\xc8\x0b\x46\x88\x76\x2e\xf4\xd1\x7f\xb5\xb7\xaf\xed\xba\x12\xaa\xf5\xa7\x88\xce\xbe\xbf\xc9\x1e\x75\xd1\xb8\xac\xdf\xaa\xdd\x9d\xf8\x8e\x12\xab\xbf\x19\xdd\x44\xcd\x54\x6a\xf1\xe2\x16\x04\x80\x9e\xa0\x57\x38\x1e\xd6\x71\x2f\xaa\xf2\x62\x36\x81\x9e\x36\x9e\x8c\xf0\xed\x3b\x74\xc8\x52\x8e\xf0\x2d\x37\xc4\xe1\xd1\x5d\x41\x2f\x37\x0c\xc9\xbc\x63\x71\x9c\x7e\xa1\xbd\xba\x35\xb3\xa0\x09\xde\xe7\xb7\xd4\x54\xfc\x0a\x39\x09\xaa\xac\xa4\x2a\x23\x13\x59\x10\x93\x0f\x88\x9a\xce\x67\x94\x86\x20\x36\x4b\x1e\x85\x12\x61\x97\x5c\x53\xec\xac\xb0\x87\xcb\x07\x98\xea\x95\x25\xde\xfa\xdf\x33\x6d\x7a\x2a\xbe\x65\xc4\x26\x4a\x3d\xcd\x9e\xf2\x3b\x7f\xec\x3f\xed\xe5\xa6\x0c\x15\x37\xa7\x41\x76\x1b\x02\xd6\x83\xe9\xfd\xe7\xcf\xa8\x59\x4b\x2f\x46\xf2\xfa\xf9\xaf\xfc\xa9\xc5\xcc\x5e\xae\x26\xcc\xef\xe3\xf9\xd8\x83\x99\x3e\xbe\x5d\xa6\x8f\x6f\x97\xec\xe3\xdb\xc5\x7d\xfc\x9d\xd6\xc7\xa7\xa9\x3e\xfe\xae\xb0\x8f\x6b\xa9\xe5\xa3\x79\x73\x27\x7f\xc7\x3a\xf9\xbb\x74\x27\xff\x6d\x85\x9d\xfc\xf6\x6b\x77\xf2\xdf\x72\x3b\xf9\x6f\x85\x9d\xfc\xb7\xfb\xea\xe4\xb7\x39\x9d\xfc\xb7\x2f\xd7\xc9\x1b\x5a\xf7\xe5\xba\xf0\x3d\x53\xae\xa7\xe2\x5b\x46\x6c\xa2\x34\xd6\x02\xef\xe5\x20\x25\x53\x77\xce\xf6\x7c\xf6\xb7\x6c\x37\x3f\xf2\xdc\xf1\xcc\x2e\x2e\x12\x99\xba\xb7\xbc\x80\xaa\xac\x36\xd4\x5b\xa8\xc8\x70\xab\x53\x3e\xe3\x2a\x86\x1e\x31\x8c\x2c\x25\x10\x47\x8c\x56\xc7\x0c\x29\xd0\x05\x71\x49\xfc\x55\x3d\x69\x66\xf5\xa7\x20\x9b\x18\x46\xc1\x7c\xf4\xc6\x14\xc4\x6a\xc7\x00\xb1\xaa\x81\xb4\x76\x32\x20\xad\x4c\x35\x32\x98\x8e\x9a\xa5\x6d\x02\x69\xed\x68\x20\xad\x3a\xca\xc7\x5b\xec\x0f\x74\xbc\x47\x08\x99\x03\xef\xef\x2b\x5a\xbf\x8b\x83\xa5\xaa\xa6\xf1\x32\x55\x5b\x25\x6c\xa9\x8a\x26\xf0\x29\x33\x2f\x66\xb7\x22\x93\x89\x35\xd9\x88\xcc\xaa\x4b\x16\x8e\x36\x07\x90\x16\xd6\x0d\xf4\x9f\x8a\x36\x9a\xae\xa5\xb4\xef\x11\xed\xde\x40\xb1\x18\x5b\xe1\xcb\xca\xee\x4b\xed\x08\xa4\x96\xbb\xb9\x72\x4c\x03\xfb\xe6\x3b\x7e\xd0\x50\x78\x73\x7a\xb2\x8e\xbf\xab\xa6\x32\x03\x0e\xe7\x40\x00\x97\x69\x50\x31\x22\x3c\xb4\xed\x37\xdf\xb6\xa9\xc3\x07\x68\xdd\x92\x4b\x7c\x3a\xc5\x95\x87\x36\xce\xa4\x5e\x10\xd9\x78\x29\x54\xb8\xcc\x22\x62\xc7\xb8\x88\x98\x0b\x3c\xce\xb8\x3d\xad\x63\x19\xef\x2c\x84\x65\xbc\xb3\x18\x96\xf1\xce\xbc\x58\xc6\x3b\xea\xae\x76\x16\x0a\x6f\x05\xc0\xc0\xea\x79\x97\x9e\xf6\x79\x66\xbf\xfd\xcb\x98\x0a\x79\xf7\x27\xff\xfe\xd0\xc0\xec\xcc\xf3\xff\x00\x34\xf0\xd6\x16\x9a\x8c\x1d\xaa\xc0\xb4\xa6\x31\x76\x03\x5f\x8b\x17\xd0\xc1\x52\x85\xff\xea\xe0\xc1\xc6\x85\xf9\x57\x01\x0f\x5e\x90\x93\xbf\x1c\x78\xb0\x50\x21\x65\x6c\x33\xc0\xe6\x7e\x99\x8d\x15\x73\x7b\xdd\x63\x73\x3d\x97\x4b\xd9\xcc\x91\xa6\xf8\x2f\x25\x9b\x02\x28\xe2\x1c\x58\xdd\x0c\x89\xa2\x1d\x9e\xdc\x5e\x9a\xf4\x53\x41\xa9\xa0\xa7\x66\xfa\x6a\x2a\x4f\xb6\x8f\x7c\x4b\xfd\xf5\x9b\xea\xb1\xf7\xd7\x67\x0d\xbd\xb6\xa8\xdf\x66\x7b\x6e\x2a\xbb\x09\x58\x39\xb5\x83\x93\x4c\x15\x96\xa6\x94\xb9\xa0\xe0\xd9\xdd\xc6\x95\xd8\x34\x68\xc5\x5b\x20\xc8\x00\x68\xb9\xdc\x76\x46\x4a\xf4\x59\xfc\x4c\x73\x91\x2b\x2d\x34\x1f\x4b\x13\x25\x78\x9a\xd2\x02\x3a\x52\x77\x7a\xb8\x12\x64\xa1\x35\x91\xb8\x0c\x24\xa1\xb7\xc5\x7e\x67\x5c\x4b\x25\xd4\xbf\x6b\xf7\x26\xdb\x55\x2b\x82\xbe\x23\xc6\xb6\xc1\x66\x49\x89\xed\x88\x65\x64\x55\xd4\x97\x0a\x76\x43\xd7\xf2\xc4\xb8\x00\x08\x39\x2d\x75\xe6\x9a\xb4\x10\x82\x3c\x1f\x24\xba\x04\xd0\x73\x66\xb1\xb9\x3b\xe7\x62\xd3\x08\x92\xac\xb0\xb8\x3a\xa4\x72\xe3\x02\xad\xa5\xad\xd0\xf4\x15\xc6\xdf\x08\xd8\x7c\x59\x72\x06\x3b\x68\x06\x56\x7a\xc1\x56\x48\x89\x83\x8b\xf2\x7d\x69\xe5\x98\xe9\x7b\xe5\x30\xd3\xf7\x0a\x31\xd3\xf7\x66\x5c\xdc\xda\x2b\x85\x99\xbe\x67\xc6\x4c\x57\x11\xcf\xf7\x0a\x11\xcf\xf7\x32\x88\xe7\x3a\xde\xfa\xde\x2c\xbc\xf5\xbd\x2c\xde\xba\x8e\x99\xbe\x37\x13\x33\x7d\x6f\x2e\xcc\xf4\xbd\x07\xcc\xf4\x72\x98\xe9\x70\xfe\xf0\xcd\x61\xa6\x7f\x0b\x17\xbc\x96\xc0\x4c\x9f\xcb\x36\x59\x06\x33\x7d\x4e\x23\xe8\x5e\x31\xd3\xe7\x38\xcd\xff\x52\x98\xe9\x4f\xd3\x73\x81\x62\xc0\xa4\xf3\x56\xe9\xb8\xfb\xf9\x73\xaa\x2b\xfe\xad\x91\xd1\xa9\x44\x8a\x91\xd1\xb7\xe7\x44\x46\x67\x56\xe4\x52\xc8\xe8\xe6\xa3\xa5\xe5\x90\xd1\xcd\x34\x57\x82\x8c\x6e\x46\x8c\xd0\x90\xd1\x39\x1e\xd7\x42\x54\x4a\xe1\xae\xce\xe2\x61\x91\x82\x39\x40\xe2\x22\x59\x19\x86\x79\xdd\x8d\xde\xb2\x27\xe1\xb0\xff\x3d\x0b\x1e\xfe\x9e\x24\xf0\xd7\x84\x87\x9f\x21\x5a\xab\x04\x3c\xfc\xb7\xaa\x51\xe5\xe0\xe1\xbf\x6d\xee\x4b\xc0\xc3\x7f\xdb\x15\x28\x01\x0f\xff\x6d\x57\x60\x26\x3c\x7c\x3e\xfb\xe5\xe1\xe1\x4b\xd0\x88\x62\x6c\x7f\xf8\x2a\x82\x5c\x62\x7c\x66\x6d\xc0\xe1\xe4\x4b\xe1\xdb\xcf\x18\x5e\xe7\x9e\x79\x0b\xf0\xed\xcb\xe2\xcf\xe7\xb2\x24\xe1\xe3\x4b\x01\xc4\xdf\xd7\xb4\x33\x13\xf0\x3c\x37\x6b\x09\xc0\xf3\xc2\xe9\x61\xa1\x8c\x09\x40\xfc\xd6\x16\x6c\x40\xc8\x87\xf7\x31\x3b\x0a\x9e\x81\x1b\x7f\x4f\x62\x5c\xb8\x3e\xcb\x08\x71\x89\xb6\x4b\xc4\xe8\x51\x03\xfe\x41\x62\x73\x48\x6c\x96\xbf\x88\x19\x1d\x1e\x34\x17\xdc\x44\xc0\x6d\xb1\x8c\x02\xcf\xf6\x9b\x31\xd3\x86\x2c\xf4\x9b\x91\xdc\x0c\xfd\x2b\x4d\x05\x00\xca\xcf\x2a\xc0\xef\x21\x2e\xd5\x04\xb3\xdd\x03\x14\x73\x52\x38\x97\xe4\xcf\x67\x65\xdd\x03\xcc\x92\x20\x50\x58\x6c\x9d\x36\x97\x7b\x80\x6f\x56\x0f\x16\xf3\x4c\x50\x3c\x18\xcd\xe5\x99\x60\x06\xa9\xf2\x38\xf9\x25\x1a\x6a\x2e\x1f\x07\x33\x55\xbf\xbc\x8f\x83\x12\xac\xcd\xe5\xe3\x60\x1e\x7a\xb3\x7d\x1c\xcc\x1c\x05\x17\xf4\x71\x30\xcb\x33\x81\xd1\x61\x80\x70\x0f\x90\x0a\x3a\x1d\x63\xdb\x8d\xa7\x5d\xd4\xa8\xef\x58\x33\xbc\x1a\x98\xdd\x13\xe4\xf8\x3a\xd8\xda\x12\x07\x2c\x41\x1f\x5e\x60\x67\x5c\x12\x80\x1d\x54\xe4\x1b\x21\xed\x06\x60\x31\x1f\x06\x66\xb3\xf9\x5e\x7d\x18\xa4\xfc\x09\x3c\xc7\x11\xf9\x95\x83\xd5\x2b\xd8\x2e\x6c\x83\x91\xc3\xb6\x83\xa4\x13\xd7\x02\x46\xdc\x7c\xb1\x55\xda\x53\xe8\x25\xf0\x11\x10\xc2\x0e\x66\xee\xe1\xde\x17\x50\x97\xe7\x8b\x7c\xd3\x53\x29\x96\x9f\xe2\xc0\x49\xc7\x64\x44\x42\xd7\xe6\x87\x56\x39\x70\xf9\xe8\x29\x3f\xe2\xe0\x78\xeb\xc2\x61\x80\x13\x8c\x30\xdc\x60\x56\xa8\x30\x2c\xf6\x3a\x8b\xaa\xb2\x6d\x57\x80\xc7\x50\x92\xb0\xd7\x47\xf0\x1a\x00\x38\xaf\xa8\xa0\x4b\x23\x7c\xab\xbe\xe1\x63\x84\x2e\x1a\x97\x16\x2f\xee\xa2\x79\xc9\x77\x76\x21\x35\x94\xcf\x52\xbb\x7e\x5e\xea\x35\x71\xfa\xa5\xb4\x06\x2d\xde\xc1\x31\x7e\xe5\xfa\x59\x7f\x00\x23\xd7\x4f\x76\x8f\xf3\xb3\xe2\x5b\x43\x56\x7c\x6b\x02\x5d\xa2\xd5\xfa\x1e\x35\xd0\x53\xf8\xd5\x4d\x3f\x52\xcc\xe3\xdd\x42\x8d\x04\x78\xa5\x44\x0d\x78\x69\x92\x16\xcb\x5b\xaa\x06\x7a\xd6\xe6\xa5\x2c\x36\x4b\xf3\x6f\xe7\x82\x63\xb6\x8f\x8d\x62\x1f\x1d\xb0\x1f\x92\x72\xc0\xa1\x84\xa9\x54\xc0\xac\x38\x01\xcc\x7f\x95\x58\x12\x2c\x13\xdf\xb3\x5b\x8f\xe4\x04\x96\x32\x8a\x0e\xb5\x4a\x3c\x7e\xac\x7e\x0a\x9c\x4d\x9e\x47\x1d\xd3\x00\x0a\x4c\x1d\x37\x8d\x63\xa5\xc8\x99\x3c\x03\x64\xf0\x9a\x2b\xf5\x2d\xa2\x5d\xab\x85\xb3\x6e\x5e\x37\xf5\x9a\x02\x4b\xaa\xd4\xed\x22\xd5\x28\x1b\x48\xbd\xc3\x99\xba\x71\xfa\x15\xdc\x98\xb0\xaa\x14\x5c\x3e\xc9\x87\x61\x97\xfe\x32\x74\xbc\x16\x56\x85\x0b\xd9\x8a\x16\x0b\xbb\xcc\x7d\x57\x9d\xb4\x1a\x80\x97\xca\x9b\x00\xca\x28\xf7\xe0\x6c\x45\xe5\x79\x96\x03\x13\x3a\xb2\x17\xf8\x5b\x81\x81\x5f\x6f\xb0\xaf\xed\x72\x45\xe7\x38\xe3\x75\x45\xe5\xf8\xff\x92\xe3\x15\x31\x1a\xa6\x2e\xf6\xeb\xc3\x0f\x3b\x18\x87\x2e\x24\xfa\x82\x92\xa7\x0c\x3a\x83\xa9\xe3\xe4\xdb\x6a\x02\xb0\x40\x6f\x27\x08\xa5\xe3\xba\x82\x78\x74\xd1\xb8\xd4\x55\x7a\x86\x01\x38\x83\x14\x92\xe0\x4b\x29\x7d\x64\x26\x0c\x1b\x56\x4a\x8c\x14\x8a\x74\xd4\x62\x13\xd3\x56\x21\x97\xc9\x71\x9b\x9f\xa3\x9c\xab\x1c\xc3\x5b\xe7\xf4\xbb\xcb\x64\xd3\x48\x0c\x8d\x69\x87\x3a\xdc\x3a\xd2\x00\xa0\x34\xdb\x28\x18\x33\x4c\xda\x71\x02\x6f\xc7\x91\xb4\x78\x52\x65\x36\x2b\x86\x09\x34\xdd\x3f\x71\xa3\x5f\xb1\xe7\x3a\xe2\x02\x0a\x2b\x4c\x4e\x03\x49\x21\x73\xde\x6a\xf1\x02\x9f\xe8\x34\x45\x05\x52\x0d\xbc\x04\xa8\x61\x1e\xab\x2c\xa2\x9a\x29\x6e\xc9\x2a\x95\x7c\x4c\xac\xfb\x16\x98\xfd\x94\x58\xbc\xae\x2f\x46\xce\xaa\x30\x68\x95\xb4\x9d\x0d\x55\xb9\x07\xc7\x4c\x02\x91\x36\xe5\x98\x69\xef\xc1\x31\xd3\x83\x63\xa6\x6f\xc3\x31\xd3\xfd\x38\x2a\xca\x16\xb0\x1a\xe7\x4c\x4b\x39\x2a\x6a\xdf\x8f\xa3\xa2\xf6\x0a\x1c\x15\xb5\x97\x73\x54\xb4\x7d\x8f\x8e\x8a\xcc\x7e\x60\x17\x72\xc6\x34\x5e\xda\x51\x51\xe7\x1e\x1d\x15\x75\x56\xe5\xa8\xa8\xb3\x02\x47\x45\x3b\xf7\xeb\xa8\x28\x4d\x7e\x29\xb7\x4c\xab\x70\x54\xb4\x2b\x66\xfb\xb7\xc4\x8e\xb1\x3f\xf0\x0a\x9c\x15\x2d\xd8\xbe\x7b\xf7\xef\x4e\x68\xff\xea\x0a\x9c\x25\x3c\xc7\x05\xb4\x1b\x8b\xfa\x2a\x6a\xa8\xf7\x76\x8f\x88\x97\x3f\x57\x37\x1b\x8b\xfa\xf7\xf9\x3b\xfa\x43\xba\x47\x5f\x45\x26\x0f\xd0\xab\x76\xb9\xb4\x88\x3f\xa4\x07\x77\x48\x0f\xee\x90\x1e\xdc\x21\x3d\xb8\x43\x7a\x70\x87\xf4\xe0\x0e\xe9\x6f\xed\x0e\x89\xd9\x0e\x08\xa3\x41\x18\x4c\xc6\x28\xe8\xa3\x1e\x0e\x0d\xfe\x91\xa0\x63\x3f\xc7\xe5\x90\x57\xbe\x9c\x7f\xa4\xe7\x38\x2c\x70\x8f\xf4\x1c\x87\x2b\xf4\x8e\xf4\x1c\x87\x7f\x53\xe7\x48\xcf\x71\x58\xc6\x37\x12\x15\xc0\x3d\xb9\x46\xe2\x7e\x66\xe6\xf4\x8d\x64\x30\x50\x67\xf9\x46\xea\xe1\xb0\x94\x6b\x24\x07\xc7\x38\xdf\x1d\x12\x20\x0b\xd0\x3c\x5d\x38\xfb\x5c\xc2\xb9\xd1\x9c\x3e\x8a\xd4\x4c\x63\x83\xf3\xa3\xea\x0c\x46\x8a\xbc\x09\xcd\xeb\x11\xa8\x90\x17\xcd\x83\xcf\x12\x9e\x7b\x60\xd0\x42\xe8\x09\xe2\x57\x36\x50\x3c\x24\x4c\xe6\x41\x1f\x11\x6c\x0f\xd9\xc0\xc5\xd2\xfc\x6b\x8c\x43\x3c\x42\x9f\x98\xe6\xdc\xf1\xeb\x1b\xec\xee\x1a\xed\xb2\x34\xaf\x5c\x9d\x99\xb3\xb8\x31\x19\x89\xd3\xa5\x67\xbe\xb4\x37\x68\x69\xcf\xe9\xc0\xa8\xe6\x81\xce\x7d\x47\x07\xcc\x37\x41\xe4\x82\x38\xd1\xf9\x90\x88\xbb\x0d\xd8\x77\x50\xe4\x7e\x24\x92\xd3\x5e\x9a\x80\x28\x94\xdd\x25\x61\xff\x9d\x0f\x53\x37\xa2\x69\xf6\xdb\x4d\x7c\xeb\x46\xe6\xcc\xd3\x59\x99\xa7\x86\xcc\x9c\x75\xf5\xfe\x04\x64\xe6\x01\x52\xc2\x98\x32\x0d\x42\xe1\xf9\xd9\x98\x23\xf2\x8b\x7b\x34\x90\x1e\x52\x6c\xad\x65\xfc\x2d\xc1\x18\xfd\x97\x75\xb7\xe4\xf0\xab\x2c\x2c\x11\xfd\x5a\xbd\x13\x25\x18\x6c\x4a\x3a\x4e\x92\xfb\x3b\x85\x38\x17\x32\x95\xe9\xd4\x4e\x48\x29\x14\x89\xb2\x00\x6f\xc5\x27\x62\x99\x1d\xdb\x99\xe7\x77\x6c\xba\x4a\x8a\x9b\x8f\xf6\x8c\x53\x3c\x84\xee\xe7\x24\x2f\xcd\x74\xe6\x3c\x0f\x99\xae\x9e\x2c\x51\xcd\x92\x27\x7b\xa6\xbd\x3e\xe3\xf9\x5e\x8a\xd3\x14\xa6\x83\x64\x74\x06\xa0\x8a\x2c\x25\x2a\x09\x12\x6f\xca\x90\x9a\x50\x8b\xdd\x79\x41\xed\x74\x50\x7d\x08\xd2\x12\xf5\x70\x44\xca\xfb\x9b\x32\x6d\x34\x2d\xe2\xf4\x4a\x17\xa1\xc3\x2f\x9e\x39\xf9\x57\xbf\xd2\x8e\xa7\xc6\x19\xaf\x53\x77\x56\x52\x17\x05\x47\x4e\x5c\xf9\x30\x7b\x6e\x5a\x42\xb1\x4a\xc1\x55\x98\x36\x7b\x67\xe0\x6c\x19\xfd\x68\xe5\x80\x45\x53\x33\x4c\xea\x5f\x45\x49\x5f\x0a\xd3\xda\xdc\x98\xec\x6e\x71\xdf\xf5\x62\x12\x1e\x5f\x53\x9b\xf9\xb4\x7f\x34\x74\x3d\x6e\x03\x72\x67\x57\x63\x4d\xcc\x6e\x0a\xd9\x3a\xd1\x7c\xce\x1b\x73\xff\xa5\x32\xa8\xc1\x9e\x71\xa2\xe9\x41\x17\xb4\x55\xf4\xbf\x04\x05\x43\x75\xa0\x55\xb2\xcb\x95\x47\xa2\xce\xc9\x63\xf2\xa1\x57\x80\x43\x5d\xe0\xa5\x4e\x9d\x08\x5b\x30\x13\x66\x71\xbe\x95\x04\x59\xc0\xef\x7c\x0c\xa0\xd6\x42\xf8\xd3\xad\x85\xf0\xa7\x5b\x8b\xe1\x4f\xb7\xe6\xc5\x9f\x6e\xe5\xe1\x4f\x8f\x93\xf5\x86\x82\x3b\x24\x42\xe7\x80\x8c\x9e\xa3\xab\xcf\x7f\x92\xf5\xf7\x87\x8c\x86\xa5\xe0\xdf\x02\x31\x5a\x00\xf6\x72\xad\x2a\x98\x8d\x4c\x48\xb2\x29\x60\x58\x71\x99\x5a\xfc\x96\x00\xb1\x5a\x26\x01\x3d\x3b\x1b\xab\xb7\x1c\x6a\xac\x71\x29\xbf\x14\x6a\xec\x62\x88\xb1\x0b\xf2\xa1\x21\xc6\x16\xf3\x21\x3c\x74\xdd\x1b\x2f\x1c\x99\x89\xf1\x03\x1f\x33\x79\xfa\x59\x00\xb8\xdd\x1b\x53\x1c\x11\x8e\x73\xc5\xbe\xb2\xe0\xba\x45\xc0\xba\xa9\xa4\xc8\x08\xb4\x9b\x49\x64\x00\xde\xcd\x26\xe2\x90\x56\x99\x56\x32\x26\x16\x88\x57\x59\xf9\x65\x01\x53\x67\xe0\xf3\x96\xba\x82\xae\xb6\xd9\xd5\xdc\x20\xd8\xf3\x37\x57\x23\xd3\x48\x59\x3e\x00\x0d\x30\x83\x7b\x3d\x47\x63\xa2\xc4\xeb\x29\xda\xd0\xca\x43\x9b\x48\x85\x15\x9b\x25\xc2\x85\x90\xc1\x97\x10\x8a\xa9\x3f\x81\x97\x4b\x13\x10\xf8\x5a\x69\x71\x08\x50\xb5\x54\x75\xef\x74\x22\xab\x35\xfe\x57\x6c\xfe\x1b\xf1\x96\x55\xb4\x5c\xe3\xb2\x50\x4c\x5b\x4b\x62\xe2\x26\xb4\x4b\xda\xc8\x46\x20\xd0\x7c\x57\xac\x9a\xf1\xdb\xce\x18\xbf\xf9\x96\x6d\xbb\x18\xec\xb6\xac\x2d\x98\x8b\x37\xab\xad\x40\xd3\x58\xb3\x40\x79\x49\x1c\x58\x78\xb4\x05\xe4\x67\xe1\xbf\xe6\x2e\x40\x4a\xa0\xbf\xe6\x6f\x19\xcc\x68\x78\x71\x5d\xa8\xb0\xd9\x45\x22\xa5\xd1\xe1\x44\xb3\xc0\x43\xf8\xbd\xb8\x00\xcf\x77\x03\xaa\xe9\xd7\x76\x46\xbf\x74\x0c\xd7\xed\x59\x18\xae\xdb\x59\x0c\xd7\xd4\xf2\x6c\xdb\xb0\x3c\xb3\xe9\x5a\x39\x24\xbe\x92\x48\x04\x69\x0b\x45\xc2\xa5\xc9\x6f\xaf\x2f\xba\x5c\x77\xf9\x72\xdd\x77\x60\x91\xfe\x7c\x7a\x3e\x1d\xf3\x17\x33\xa2\xd8\x22\x80\x04\xed\xaa\x98\xe9\x70\x51\x7f\x8c\xa6\x32\x3d\x4f\xc3\xc9\x77\x8a\x46\x0f\x8e\xe8\x29\xb4\xdc\x45\xe3\x52\xcc\x5e\x5b\xa8\x85\xba\x32\x90\x21\xe7\x6e\xa1\x96\x64\x26\xb9\x34\x83\x63\x0c\xb8\x95\x3f\x06\xe1\x08\xc7\x31\x09\xab\x32\x28\x79\x51\x97\xe5\x54\x35\x0b\x6e\xbb\x09\x19\xdd\xab\xf8\x54\x8d\xd1\x1c\x8b\xf3\x1e\x92\xc4\x66\x1c\x89\x83\xa8\x7e\xc5\xde\xe2\x8f\xa2\x0a\xdf\x0c\x1a\x6a\x99\x0c\xf7\xf3\x7b\x26\x9d\xb9\x5f\xac\xb6\xbc\x6a\x46\x3a\xf2\xf8\x2e\xa9\x3c\x07\x1a\x4b\x75\x2f\x0e\x61\x96\xea\x53\x79\x8e\xcd\x98\xc6\x74\xf9\x5f\x4b\x2b\x4f\x6f\xf0\xae\x21\xac\xec\x0e\xd1\xfc\x28\xd7\xf9\xde\x37\x35\x94\xeb\x4e\x16\xe5\x5a\x1d\x9b\x3a\x99\xb1\x29\x0b\x62\xdd\x31\x83\x58\xeb\x83\x58\x67\xd6\x20\xd6\x31\x0c\x62\x2a\xd2\x75\x27\x83\x74\xad\xa2\x64\x77\xd2\x28\xd9\x3a\x88\x75\x67\x26\x88\x75\x67\x2e\x10\xeb\x8e\x11\xc4\x9a\xe7\x52\x31\xac\x1d\x31\x25\x2b\x13\xf6\x17\xc5\xaf\x2e\x89\x47\x6d\xbe\xcc\x5d\x4d\x1d\xa5\x7f\x7b\x70\xd4\x2b\xd9\x13\x9b\xdb\xfa\x5d\x15\x1a\xf5\x5c\xf6\xfb\x32\x68\xd4\x73\x2e\x14\xee\x15\x8d\x7a\x36\x2f\xf7\x8e\x46\xfd\x2d\x1e\xa7\xcc\x7b\x8a\x92\x76\x46\xb3\x8c\x0b\x60\x75\x09\xaa\x8d\xb0\x26\x8b\xbd\xaa\x48\x36\x49\xac\x24\x4d\xcc\xef\x6f\x1c\x8d\xdb\x51\x16\xa2\xf9\x58\xdc\xcf\x71\x58\x0c\xc5\xdd\x9e\x13\x8a\x1b\x96\x2f\x4b\x21\x71\x9b\x2d\xec\xe5\x90\xb8\xcd\x34\x57\x82\xc4\x6d\x7e\x12\xa5\x21\x71\xcf\x06\x01\xcc\x25\x22\xe0\xaf\xa4\x95\x6e\x69\x3b\x6b\xa5\x71\x75\x8b\x0b\x98\x85\xfd\x96\x9b\x7b\x36\xf6\xdb\x0c\xf1\x94\x46\x36\xfe\x0b\x54\x60\x31\xf6\xcb\x03\x03\x97\xa0\x51\x02\x18\xf8\xdb\x16\x64\x0f\x87\x0c\x3c\x62\x71\x16\x4a\xa0\x94\xdf\x93\x0c\x66\xa3\x4c\xcf\xe0\xbd\x1c\x4a\xf9\xb7\xcd\x7d\x09\xb7\x03\xdf\x6a\x05\x16\xca\x6a\x74\x3b\x50\x0e\xdf\x7a\xc6\xa8\x3f\xf7\x7c\x56\x80\x6f\x3d\x72\x7d\x58\x9b\xaf\xa0\x73\x8d\xf0\xed\xf3\x95\xf4\xd2\x59\xd0\xbb\xb9\x24\x24\xd6\x36\x5c\x4d\xf9\x0a\x9a\x36\x0b\xee\x38\x37\x23\x87\x3b\x4e\x7a\xca\x42\xcc\xcf\x06\xad\xcd\xef\x23\x65\x41\x6b\x4b\xb4\xdf\x0c\x14\xa6\x52\x14\xf8\x92\x67\x49\x2a\x62\xa9\xb4\x24\x99\x10\x3b\xee\x64\xc1\x29\xf8\x6b\x4d\x9e\x0a\x94\x72\x09\x08\xe0\x6f\x8f\xff\x25\x06\xed\xa5\xd0\x83\x8b\xfb\xf6\x5c\xe8\xc1\x33\x48\x95\x47\x0f\x2e\xa1\xa4\x73\xa1\x07\xcf\x18\x40\xe7\x41\x0f\x2e\xc1\xda\x5c\xe8\xc1\xf3\xd0\x9b\x8d\x1e\x3c\x73\xf9\x74\x4f\xe8\xc1\xa5\x11\x80\xd9\x9e\x4f\x66\x1e\x6e\x64\xa0\x7b\x99\x27\x04\xfe\x60\x81\xbd\xb1\x60\xd3\x04\xc3\x01\x16\x2b\x49\x65\x3d\xb8\x30\xd8\xaf\xd9\x86\x58\x0e\xec\x77\xbb\x10\xeb\x17\xfa\x42\xb6\x93\xca\x0d\xff\xec\x93\x1b\xf4\xe9\xce\xd4\x17\x4d\x39\xe0\xc1\x10\xfa\x74\xb7\x7a\x74\x54\x97\x23\x5b\x41\x0c\xfd\x48\x60\x4b\x93\xc7\x32\x09\x72\xa9\x0c\x2b\x8d\x6e\xfa\xb5\xe1\x57\xbf\x4d\xf8\x54\x89\x4d\x5a\xee\x52\xbc\xf9\xf4\xae\x2f\x0f\x66\x45\xab\x9c\xf6\x9f\x63\x09\xd6\x9c\xb4\x15\xb4\x72\x4d\x60\x07\x3e\x1a\x07\x51\x0a\x98\xf7\xe2\x52\x43\x6e\xce\x81\x75\x15\x57\x9b\x62\x32\xfa\xa7\x50\x29\xfa\xa1\x6b\x94\x02\x67\x9b\xa4\x4c\x83\xda\xaa\x47\xd8\x4a\x2a\x79\x9e\xcc\x93\xa9\x23\x4a\x2a\xa9\x1a\x75\xb0\x12\xc8\x69\xa1\x15\x02\x79\x5a\xd5\x9c\xa7\x05\x38\xd4\x7c\x2b\xd6\x84\x60\xbb\x68\xcb\xfe\x21\xce\x65\x25\xf4\xad\xd2\xb2\x9f\x58\xb3\x74\x05\x10\x9c\xc2\x59\x57\x93\xc0\x9d\xc4\xc6\xb5\x89\xe7\x2d\xf3\xfc\x62\x28\x35\xed\x99\xe7\xcd\x7b\x01\xc0\x04\xe7\x92\x7b\x0f\x40\x3c\x77\x5a\x0d\x60\xaf\x72\x60\x6c\x08\x9b\x1a\xc2\xc4\xe9\x63\x3a\x5c\x1e\x3a\x66\x90\x80\x15\x35\xc9\x82\x01\x2f\xaa\x00\xcf\x41\x3a\x71\x38\xf1\x6d\x1c\x93\xe7\x53\xae\x94\x20\xf3\x12\x00\xc3\x96\xae\xcc\xb5\xbf\x0c\xe0\x70\x3e\x9c\xda\xa2\x80\xc3\xfc\x70\x40\x36\xd7\xcc\x6b\x9c\xb7\x4b\x88\xe4\x43\x1e\xc8\x6c\xd2\x79\x25\xef\xd8\x74\x83\x21\x0b\x24\x2c\xa3\x0c\xd8\xb3\x99\xab\x0c\xe3\x20\xaa\xa7\xaf\x33\x68\xf8\xb4\x32\x54\xc5\xa9\x4d\x5d\x65\x60\x1d\xc3\x88\x1c\x2c\x12\x88\x5e\x42\xcb\x8b\x60\x00\x4e\xf5\x92\x6c\xee\xc6\x65\x0d\x6d\xe6\x51\x55\x94\x03\x30\xeb\x71\x2f\xaa\xaa\x03\x7c\x0d\xfc\xae\x3f\x7e\x8c\x64\x2c\xbf\xf3\x8a\xbe\x47\xe6\x0c\xe9\xd7\x5c\x0e\xf1\x60\xaa\x5e\xf0\xce\x29\x1b\x00\x47\x38\x1e\x9e\xb9\x03\xde\x0f\x79\x65\x3f\x7f\x46\x3a\xab\x4f\x72\x2b\xb1\x99\xe1\x5f\xbd\x36\x3a\x45\x9b\x87\x8c\xcf\x83\xf4\xb0\xb3\x91\x8a\xb8\x33\xf5\xe7\xdb\x14\x42\xad\x94\xbb\xda\xac\x5f\x4e\xb3\xa7\x46\xcd\xce\x1a\x68\x5f\x54\xb3\x85\xe2\x1a\x51\xa6\xd1\x66\xb1\xfc\xa4\x76\x27\x6a\x3f\xbf\xe2\xb2\x7b\xc9\xa5\xf5\xf6\xea\x1e\x14\x97\x09\x61\x31\xbd\x65\xec\x2b\x17\x7f\x19\xb1\x8d\x43\xce\xa9\x71\xdc\x2d\xf1\x5a\xe0\xb6\x8b\x6e\xe1\xb2\xc0\xb4\xf8\xaa\x80\x25\x41\x5e\x34\xeb\x8c\x4d\x04\x1c\x60\xfb\xa2\x29\xcf\xe7\x4d\x18\xdb\x16\x37\x87\x1e\x3f\x66\x3f\xf8\xbb\x99\xf4\x77\x5d\x81\x03\xd6\x8e\x95\x15\x7c\x67\xb6\x7c\x05\x7b\x25\x0d\xe4\x9c\x81\x6d\x5e\x29\xdc\x2e\x87\x38\x49\xa1\xed\xee\x3f\xa0\xed\x3e\xa0\xed\x7e\x1b\x68\xbb\x80\xf4\x9f\x87\xe5\xb9\x20\x96\x62\x9e\x23\x81\xe5\x90\x76\x81\xd4\x03\xce\x6e\xd1\xa6\xe3\xdf\x1a\x67\xf7\x5e\xe1\x67\xd3\xe4\x97\x02\xdb\x5d\x05\xfc\xec\xce\x3d\xe2\x0a\xef\xac\x0a\x57\x78\x67\x05\xb8\xc2\xbb\xf7\x8f\xbb\xfa\x65\x70\x76\xef\x1d\x76\xb5\x71\x75\xf5\x3f\xd4\xec\x2d\x90\xcf\x12\x20\xbb\x0c\x00\xe5\x68\x12\x5e\x17\x00\x1d\x2f\x4a\xbf\x25\xe8\x9f\x4d\x47\xbd\xa0\x48\x38\xfb\x0b\xe2\xbb\x53\xab\xfa\x1e\x91\x8e\xb7\xbf\x00\xd2\x71\xe7\xfe\xd1\x81\x77\x1e\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x1f\x90\x7b\x67\x21\xf7\x46\x36\x3c\x21\x8c\x4c\xf0\xbd\xd0\xbd\xcf\x58\x82\x32\xdb\x7e\x26\x3b\xf7\x7e\x20\x7c\x39\x53\x05\x30\xbe\x3c\xc5\x0a\xa1\x7c\x39\xc5\xbf\x29\x9c\x2f\xaf\x5d\x19\x48\x5f\x21\x88\xe5\x61\x7d\x99\x83\xed\x13\xb6\x4b\xbe\xd9\xb4\x4a\xe1\xfc\x4a\x18\xcc\x37\xc2\x9b\xaa\xe2\xc0\x1a\x82\x66\x60\xf0\xbe\xd1\x3c\xe1\x7d\x59\x1c\xde\x2f\x85\xb1\x3b\x2f\x2a\xb2\xc1\x30\x9f\x85\x8a\xcc\x47\x0e\x8e\x8c\xfc\xe5\x90\x7a\xb3\x10\xb8\x65\xe1\x6f\xb3\xf8\xb7\x65\xb1\x6f\xd1\xa7\x33\xb8\x3f\x79\x27\xaf\x94\xd0\x9c\x4c\x32\x60\xb8\x03\xec\xad\xca\xab\x78\x79\xcf\x41\x6f\xcb\xa1\xde\xca\x61\xed\x2f\x8b\x7c\x2b\x3d\x1c\xf3\x64\xec\x7b\xa5\xe8\xb7\xac\xfb\x8a\xae\x5e\x12\x01\x97\x2d\xca\x4f\x62\x32\x2a\x7c\x04\x9f\x24\x2b\xc2\xc0\x8d\x20\xd5\x97\x01\xc0\x95\x65\x2d\x81\x66\xf0\x65\xd1\x6f\x25\xc7\xe5\xa0\x6f\x17\xad\x60\x49\xdc\x5b\xc3\xbe\xcc\x1c\x6e\x2d\x63\xb8\x56\xca\x2a\x22\x9c\x58\x22\x03\xd4\x04\xab\xc4\x0c\xf8\x05\xce\x40\x49\x40\xdc\x4c\xea\xcc\xe4\x56\x8c\x87\x3b\x0b\x9a\x53\xe0\xe5\x0a\xe0\x49\x06\x3f\xaa\x76\x7b\x98\x9c\xcf\x52\xc9\x94\xd0\x6c\x62\x79\x61\x51\x4b\x0c\xa1\x8b\xc3\xf0\x9a\xf6\x1d\x97\x47\xe1\xcd\xf7\x47\x5c\x0a\x7f\x97\x37\x2c\x6b\x77\x86\xf7\x8a\x0c\x98\xbc\x7f\x43\x14\x5e\x31\xed\xb3\xaa\xcf\x0b\xc3\x6b\x6e\xcc\x55\xa2\xf0\xaa\x4d\xa2\x32\x97\x0f\xc1\xab\x0c\xfa\x9a\x1a\x1f\x1e\x22\x17\x3d\xd5\xfa\x41\x17\x2d\x8b\xd2\xcb\xbb\x75\x79\x88\x5e\x53\x86\x39\xf1\x79\xf3\x21\xca\x52\xd3\x75\x9b\xcf\xd7\x0b\xc3\x94\x19\xcd\x06\x1d\x80\xb7\xbd\x10\x00\x6f\x7b\x31\x00\xde\xf6\xbc\x00\xbc\xed\x22\x00\x5e\xb9\xe0\x48\xc1\xae\xbd\x49\x19\x39\x5f\x06\x70\x24\xef\x3c\xef\xef\x0f\xc2\x3b\x76\xc9\xdf\x13\x84\xb7\x70\x52\x2a\x01\xc3\xcb\x15\x94\x03\xf1\xb2\xaf\x65\xa1\x78\x8f\xe6\xbb\x84\x3a\x27\xc4\xab\x2d\xc1\x78\xed\xd9\x68\xbc\x47\xf3\xdd\x1a\x9c\x97\x15\x89\xc7\x6b\xcf\x06\xe4\xe5\xaf\x00\xee\x8d\x99\xc8\xfd\x48\x04\x3b\xf4\xf7\x92\xb0\xb7\x76\x0a\xf7\xf6\xe8\xd6\x08\x53\x6b\xa7\x90\x6f\x8f\xa6\xc6\x64\x11\x5c\x90\x4c\x8b\x63\x6e\x24\xdb\x85\x60\x58\xe7\x97\x67\xa3\x48\x8e\x85\x00\xab\xd9\x7a\x56\xe3\xda\xdf\x19\x6d\x35\xbb\xe6\x58\x11\xd4\x2a\x27\x5c\xc6\xd0\x31\xe2\xd0\xe5\x83\x60\xa6\x2c\x98\xed\xb9\x2c\x98\xed\xd9\x40\xab\x65\xe7\xfc\x5c\xb0\xd5\x71\x32\x26\xb3\xd1\x3d\x0d\xb8\xca\x4b\x58\x12\x72\x95\x51\xb1\x78\x21\xb3\x60\x57\xcd\x46\x65\x09\xcc\xd5\xdc\x55\xe9\x3d\x41\xae\xa6\xe0\xeb\x64\xfb\x15\xc1\xb0\x1e\xcc\x6c\x93\x95\x83\xb4\xe6\xe3\x24\xa6\xf4\xb3\x63\xd0\xcf\xe5\x31\x0e\x33\x28\xac\x9d\xd9\x28\xac\x4b\xac\xbd\x97\x7b\x82\xd5\x5e\x1c\x84\x35\x2a\xdb\x32\x05\x88\xa9\xef\x96\x84\x4c\xb5\xf3\x31\x53\xed\x62\xd0\x54\x2d\x76\x1e\xc0\x54\xd3\x95\x96\x95\x02\xa6\x16\x88\xeb\xb7\xaf\x26\xae\xdb\x6f\x56\x5c\xbc\xce\x9a\x66\xa6\x8c\x76\x78\xbe\x9c\xdd\x48\x72\xdc\x90\xd8\x7c\x61\x9b\x3c\x57\xad\xcb\xe0\x64\x3e\x59\x05\x8a\xad\x9b\x42\xaf\xe5\x43\xb2\xab\x2d\xfa\xe0\xd9\x40\xce\xa0\x94\x79\x13\x96\x87\x6b\x9b\xbc\x98\x57\x6a\x78\x78\x88\x2a\xb7\x15\xf4\x54\xc5\x3e\xee\x6a\x2f\xdd\xd2\x8c\x64\xa0\x6e\x0d\xc4\x0c\x2a\x8a\x4c\xa0\xb8\xef\x92\x06\x2c\xbf\x3b\xf3\xd2\xf5\x8b\x7d\xe4\xd1\x04\x46\x0b\x65\xa7\xec\x0c\xb0\x63\x98\x01\x3c\xd7\x27\x4a\x02\xfa\x99\x8e\x3e\x9f\x8e\xd3\x49\x68\x50\x3a\xd9\xbf\x29\x6d\x43\x5a\x19\xae\xfb\x4c\x63\x7b\x79\x5f\x7c\x2b\x36\xe1\xc0\x9e\x44\x71\x30\x7a\xc9\x6f\x23\xdd\x37\x13\x54\x12\x5a\xf1\x34\x40\x5a\x78\xe9\x77\xb6\x4c\xa2\x1c\xb1\xdc\x70\xd4\x93\x34\x0b\x55\xce\x3f\x28\x19\xcd\x05\x87\x46\x3c\x7f\x69\xaf\x2f\xc1\xc5\x78\x4a\x47\x51\xb1\x30\xb6\x12\xcf\x17\xf6\x34\x19\x8f\x34\xcd\x4e\x57\xca\xe4\x31\x4e\x6d\x6e\x75\x5c\xe8\xbb\x9e\xd7\x45\x15\x3f\x90\xca\x8f\x00\xad\x20\x0c\x3e\x90\xae\xae\x24\x8f\x1f\x6b\xdf\x75\x9a\x55\xb0\x60\xa5\x5b\x53\x2d\x63\xcc\x0f\xdd\x13\xa1\x28\x7d\x52\x11\xea\x52\xe7\x67\xd0\xbe\xe9\x26\xe0\x0d\xb8\xc4\x38\x0a\xfd\x31\x11\xeb\x6a\x4f\xd0\x8a\x78\xa6\x3f\xab\xb9\xe5\xae\xa2\x9a\x65\x4f\xd1\xd2\xb7\xa7\x67\x9f\xa1\x79\x8a\x16\xf0\x73\x34\x7d\x80\x2a\x38\x4e\xbb\xe7\x9d\xd3\xe5\xa0\x9a\xb3\x47\x21\x1e\xcc\x1a\x89\x17\x40\x43\xac\xba\x5b\x28\x5a\xab\xe4\xda\x79\x7e\xd4\xf6\xdd\x72\xa8\xed\xbb\x19\xd4\xf6\xd4\x54\xb5\x3b\x6b\xaa\xda\xcd\x4c\x55\x59\x60\xf7\xdd\x32\xc0\xee\xbb\xb3\x16\x3d\xbb\x33\x80\xdd\x77\x0b\x81\xdd\x77\x8b\x81\xdd\x77\x67\x02\xbb\xef\x72\x60\x77\x33\x3e\xfb\x38\x59\xc1\x6b\x6b\xfc\x79\xd6\x91\x25\x21\xd6\xcd\xef\x5a\xaa\x86\x7b\x39\x0f\x30\xeb\xbc\xef\x9a\xb4\x53\x05\x5c\xd7\xd5\x77\x05\xf8\xd7\x0f\x00\xee\x2b\xe1\xe5\xde\x01\xdc\x61\x28\x7b\xfc\x58\xdd\xde\x62\xe6\xbd\x82\x14\x50\x0c\x48\xfe\x2d\x9e\xe5\x7f\xca\x9b\x87\x22\xbe\x07\x9b\x8b\xce\x2e\x37\x60\xd7\xd2\xd2\xcb\xc7\x35\xe7\x37\xd6\x56\x8b\x6d\x7e\x26\x47\xb0\x25\xf0\xcd\xcd\xcb\x84\x22\x28\xf2\x79\x69\x95\x80\x4a\xff\xb4\xf6\x55\x61\xc3\x57\x04\x35\xfc\xf5\x60\xc3\x57\x54\x81\x8f\x7f\xf5\x0a\xd0\xa1\xea\x2b\x70\x0f\xf8\x95\x4b\x20\xa5\x2f\x0c\xe6\xb9\x34\xe6\xaf\x58\x9b\x2f\x85\x66\xd9\x77\xe3\xd8\xf5\x07\x15\x4b\xac\xee\x13\xda\x72\x19\xf3\x15\x5a\x45\xb0\xd7\xc3\x91\x1b\x51\xe6\xe0\xc7\x91\x17\x44\xc4\x91\x9f\xa7\x63\xe2\x2b\x18\x9b\xf2\x57\x92\xcc\xc7\xf1\x24\x64\x9e\x0e\x46\x81\x1f\xc4\x81\x4f\x7e\x53\x3f\xde\xa9\x1f\xf4\x77\x14\x93\xb1\xf8\xfb\x9c\xf4\x83\x50\x86\x3e\xeb\xd3\xe1\x1a\x46\xf4\xc5\x1a\x9c\x0b\xf6\x7e\xd1\xbc\xcd\xa3\x78\x01\x98\xf7\x6a\xfc\x52\xac\x21\xfd\x9d\xc3\x72\x60\xad\xc9\x65\xb4\xaf\xa1\x79\x5f\xbb\x5b\x7f\x2d\x20\x72\xd1\xe5\x6c\x37\xb4\x3d\x50\x7b\x3b\x0c\x22\xe8\x7c\x8e\x8b\x47\x81\x0f\x3d\x2a\xfa\x73\x82\x45\xa7\x60\x7d\x2e\x0e\x5d\xf0\x77\x43\x7f\xdf\x4c\xc9\xa2\x5d\x84\xcb\x60\xc9\xee\x25\xb6\xe0\x16\x85\x80\x5e\x1e\x09\xdd\x5e\x1e\x0a\xdd\x5e\x1e\x0b\x3d\x5a\x1e\x52\x1f\x21\x3f\x58\x10\x54\x5f\x95\xc7\xa2\xd8\xf0\xdf\x84\x0b\x11\xb4\x30\x30\xfd\x37\xc3\xfe\xc7\xbf\x26\xfb\x6c\x31\xc6\x6b\x21\x61\xc5\x16\xe9\xd6\xfe\x34\x41\x75\x5f\xde\x4d\xc4\x3d\x81\xa6\x2f\x0d\xe6\xfe\x00\xbf\x7e\x7f\xf0\xeb\x1f\xf3\xc1\xd8\xc5\x64\xa9\x99\xe3\xdc\x92\x36\xd8\xd1\xd2\x54\x4d\x61\xb1\xf3\x39\x5f\x25\xa7\x41\xb9\x2f\x0a\xcc\x6e\x36\x07\xef\x09\x97\x9d\xd7\x6d\x41\xd0\xf4\xc5\x80\xcb\x3f\x6a\x51\x1f\xd5\xa8\x5c\xa8\xf5\x79\xe0\xc4\xfd\x93\x98\x8c\x5e\x05\x93\x88\xbc\x24\xf8\x3a\x81\x5d\x4f\x47\x18\x32\x1c\xfb\xec\x49\x79\x26\x03\x44\xc8\x0c\x26\xc0\x72\x11\xb9\x3c\x2c\xbb\x04\x79\x2e\x0d\x49\x3d\xe7\x75\x28\xe5\x86\x47\xa9\x9b\x51\x06\x04\x1e\xf3\xfd\x28\x45\x2b\x5e\x24\x10\xe7\x73\x83\xd5\x55\x6b\x55\xb6\xf1\x2f\xef\xf5\x3c\xd5\x6e\xa5\x70\xd2\xfc\x16\x88\xf8\x16\xc5\x4f\x57\x50\xfc\xb4\x54\xf1\x53\x53\xf1\x1f\xf5\xe2\x3f\x8a\x63\x8a\x8f\xa6\xc4\xbc\xc4\xb7\xd8\x1f\x90\xff\x91\xa9\x9f\xf2\xc4\x21\x0d\x46\x45\x23\xaf\x02\x4c\x65\x72\x11\xa9\x8e\x99\x8c\x5a\xaa\xe0\xff\x01\xe4\x1a\x95\x87\xc7\x8f\xf5\x80\x8b\xc6\xa5\x6c\xd7\xe7\x89\x23\x03\x05\x04\x16\xdc\x19\xb0\x83\xab\xa7\xe6\x70\xc0\x7f\x6f\xc8\xf6\x51\xc8\x4c\x73\xc8\x18\xc3\x75\x32\xf2\x4c\x70\x11\x08\xf4\x5b\x74\xc8\x2e\x2e\x5c\xa8\xca\xca\x21\x0c\x80\x49\x99\x60\x6a\x4e\xf0\x11\x1d\x16\xdd\x8b\x2d\xd0\x2d\x55\x41\xc0\x1f\x28\x2b\x47\x0d\xbe\x44\x9f\x3f\xa3\xca\x66\x25\x29\x2e\x0e\x02\x2f\x76\xc7\x6f\x98\x51\x85\x0e\xd1\xc5\x27\xee\x27\x8e\x49\x9c\xfe\xa6\x99\xb4\x1e\x61\x71\x47\x78\x2c\x90\xfe\x06\xba\x15\x09\x10\x7b\x6b\xa5\xd0\x5f\xe1\xa4\x97\x13\x9e\x6a\x84\xa7\x26\xc2\xd3\x3c\xc2\xd3\x2c\xe1\x4b\x05\x0f\xfe\x23\xbc\xaa\xae\x6c\x2a\xd7\x52\xf4\x0a\xd6\xc7\x93\x68\xa8\xbc\xfa\x63\x1c\x7d\xd4\x38\xfa\x68\xe2\xe8\x63\x1e\x47\x1f\xd3\x1c\x19\xae\x5e\xf1\x51\xb7\xdc\xc3\x12\xf3\x6d\x3e\x2f\x0f\x03\xfa\xa5\xeb\x13\x1d\x04\x5a\x05\x37\x37\x80\x9a\x2b\x90\xcf\xb2\xe3\x59\x3a\x9e\x73\x16\xc7\x59\xd4\x06\xea\x51\xee\x55\xca\x8a\xea\x31\x2d\x51\x8f\xe9\xdc\xf5\x28\x7c\x06\x41\x57\xed\xf6\xad\x05\x4b\xef\xe4\xce\x26\x5b\x45\x4b\x0d\x93\x83\x29\x03\xac\xfe\x48\xc7\x10\x31\xf8\x89\x2c\x6c\xcd\xfc\x49\x03\x58\xfe\x48\x69\xc8\x13\x29\x5d\x3b\xbb\xa9\xef\x74\x2a\xee\x53\x84\x93\xe4\xf7\xa4\xec\x69\x42\xee\x7e\x21\x97\xd7\x98\x51\x93\x18\x3a\xdd\x8c\x4d\x64\xa9\x69\xc0\xb6\xe9\x66\xcc\x20\xbe\x8c\xd3\x40\x49\xd8\x5d\x90\xfb\xc3\x6c\x56\xb0\x6c\x74\xdc\xe6\x76\xa3\x08\xb7\x99\x13\x2a\x8f\xd5\x0c\x10\x44\x47\xc1\x78\x1a\xc2\xd1\x6c\xd5\xae\xa1\x56\xa3\xd9\xde\x1c\xb3\x4b\x7a\x16\xfa\x11\xdb\xa4\x17\x04\x1f\x2c\x74\xe2\xdb\xf5\x35\x04\x19\xce\x87\x6e\x24\xe0\xf2\xec\xc0\x21\xc8\x8d\x90\xe7\xda\xc4\x8f\x88\x83\x26\x80\x60\x14\x0f\x09\x7a\x75\x72\x2e\x82\x51\x3f\x98\xf8\x0e\x72\x7d\x1a\x41\x49\xbc\x3c\x39\x3a\x7e\x7d\x76\x8c\xfa\xae\x47\x78\x30\x0a\x83\x20\xe6\x57\x4a\x83\x10\x20\x3b\x62\xa5\xa0\x38\x24\x84\x33\xb0\x25\xb0\x8f\x6c\xec\xff\x12\x91\x17\xa7\xaf\xe8\x24\xf4\x48\x60\x62\xdd\xb8\xbe\x13\xdc\x30\xc5\xa7\xdc\xf4\x5d\x9f\x38\x15\xaa\x40\x2c\xa6\xee\x04\x36\x00\xf6\x18\x82\xf4\x43\x60\x2e\x7f\xca\xf0\x99\x3b\x1a\x7b\x70\xcb\x6c\x30\x8c\x6f\xd8\x49\x36\x13\x3b\xc2\x51\xe4\x46\xb1\xeb\x0f\xd0\x8d\x1b\x0f\x19\x44\x0a\x89\xf9\xc5\x58\xec\x3b\xc8\x0e\xfc\x98\xdc\xc6\x28\xe8\x53\x4a\xff\x0d\xc2\x0f\x24\xac\xa3\x9f\x89\x37\x8e\x10\x86\x8b\x8b\x74\xed\x34\xf1\xc0\x1e\x19\x13\xdf\x21\xbe\xed\x92\x08\xf2\xc2\x7d\x8e\x88\x89\x39\x0e\x50\x48\x70\x44\xa9\xf6\x82\x49\x4c\x89\xdd\x0c\x09\x20\x74\x05\x21\xa0\x71\xc5\x43\x32\x45\x38\x04\x91\x62\x5e\x92\x85\xc8\x35\xf1\xe9\x7c\x03\xb1\x3e\xb9\x26\x21\x72\x7d\xdb\x9b\x38\x0c\xcf\x65\x84\x5d\x9f\xd2\xfa\x1d\xcc\x66\x96\xe9\xf7\x84\x93\x69\x1d\x44\x4e\xe5\x7d\x7c\x4b\xec\x09\x7b\x9e\x79\xed\x86\x81\x0f\x42\x3c\x64\xa7\xa8\xb2\x2d\xba\xc9\x4f\x2b\x89\x60\x64\xa3\xae\x00\x0b\x63\xdf\xe9\x46\x52\x32\xc0\x3b\xf3\x97\x6e\x14\x13\x1f\xf2\x25\x6d\xfd\xf8\x31\x6d\x6c\xde\x70\xd8\x71\xb4\x94\xb4\xff\x89\xa8\x38\xc6\xf6\x10\x62\x6b\x0a\xe1\x5f\x5d\x72\x43\xbb\x49\x86\x24\xcf\x16\xd9\x21\x21\x3e\x5f\xb7\x9e\xf8\x8c\xd1\x2e\x7a\x94\xa4\xde\xda\x42\x3f\x82\xc0\x6f\x2c\xa6\xa2\x6e\xc4\x50\x84\x36\xd1\x08\x14\xc3\x1e\x82\xc5\xca\xf5\xba\x3f\x89\x27\x21\xa9\xaf\xad\xdd\x1d\xac\xad\x31\x9d\xa9\xf3\x9e\x8a\x0e\x8d\x32\xcd\x76\xfb\xe6\x4a\xbb\x3d\xe2\xb3\x20\xfa\xf5\xd9\x5b\x74\xf2\xfa\xdf\xc7\x47\xe7\x27\xa7\xaf\xd1\x93\xad\x84\xf6\x38\x0c\x6c\x02\x70\x73\x6b\x7f\xd9\x71\x02\xfd\x8b\x2a\x9b\x3d\x24\xf6\x07\x8e\x9f\x06\x8f\x6c\x46\xe3\x78\x2a\xae\x7a\xe6\x21\xcd\xef\x2b\x5d\xff\x97\x71\x14\x87\x04\x8f\xd0\x35\x09\x23\x8e\x41\x44\xbb\x54\x8c\x3c\xae\x74\x75\xf4\x22\x20\x11\xeb\x81\xf8\x03\x65\x34\x0e\x10\xb6\xed\x60\xe2\xc7\x28\x1a\x13\xdb\xed\xbb\x36\x25\x05\x67\x7a\x84\x12\x18\x7b\x38\xee\x07\xe1\x48\xe9\x5c\x9a\x1a\xb3\x9d\x1d\x89\xbf\xc4\xc2\xe9\x08\x40\x15\x10\x4a\x8f\x90\x33\x09\xe9\xa8\x43\x65\xd2\x9b\xf4\x7a\x1e\x41\xe3\x21\x8e\x68\xed\x11\xe2\xf9\x38\x3e\xd2\xa7\x17\xa7\xaf\x80\xfe\x39\x20\x62\xde\x71\x68\x51\x46\x8c\x8d\x75\x6c\x74\x19\xd0\x72\x42\x59\x31\x14\xf8\x75\x9d\x50\xc4\x71\x96\x80\x05\x58\x4a\x03\x5d\xc4\xc0\xfa\x48\x7d\x50\x87\x9b\x47\xf6\x87\x0a\x1d\x93\x2a\x23\x3a\x8d\x06\xd7\x24\xac\xa4\xe8\x08\x45\xbb\x03\x20\xc4\x1e\xb6\x3f\xa0\x23\xf1\x43\xc4\x89\x2c\xe2\xce\x75\xc0\xd1\xa1\x98\x31\xc7\x46\x5b\x8c\x7e\x0f\xc9\x28\xb8\x26\xbf\xa3\x11\x89\x87\x81\xc3\x32\x6d\xc1\xfe\x15\xad\x84\x72\x25\x93\x05\x48\x54\x50\x59\x05\x4b\xf2\x20\xec\x70\x40\x58\x84\x64\x99\x01\x46\x31\xd5\xcd\x09\xaa\x06\xba\x16\xdb\x0c\x93\xf7\xfc\x32\xaf\x72\x58\x1d\xb4\xeb\xa3\x34\xa0\xaa\x5f\x3e\xe7\x25\xb2\xb8\xb9\x0b\x4d\x6e\xa1\xdf\x69\x4e\x9e\xd4\xca\x2a\x43\x66\xa6\x9e\x49\x5c\xb5\x12\xf8\x15\xb4\x61\x94\xe0\x6a\xaa\xe8\x90\xb9\x0a\xcb\x56\x0d\x2c\xb4\xb5\x79\xba\x90\x8d\xc7\xd0\x39\x1f\xfa\x90\xd2\x87\xb8\x50\x54\xf4\x32\x16\xf2\x75\x7a\x11\x9d\x65\xbf\x74\x27\xd2\xca\xcc\xeb\x43\x9f\x94\x7b\xc7\x7c\xea\xac\x13\xff\xba\xfe\xfa\xf4\xc5\xf1\xd5\xf1\xeb\x5f\x99\xa1\x33\x0e\x03\x67\x02\xac\x69\x0f\x51\xec\xc0\x8f\x02\x6a\x14\x00\x14\x6b\xe5\x59\x4c\xd7\x12\x31\x71\xa8\x3a\x79\x52\x6b\x67\x68\x2c\xa2\x66\x21\xa2\x1d\xa5\xd2\x0b\x83\x9b\x08\x26\x57\x1c\x23\x47\xcc\x4c\xd1\x64\x0c\x4b\x8f\xac\xae\xa3\x77\xc1\x24\x44\x78\x3c\xf6\x5c\x9b\xc1\xba\x00\x99\x1b\xd7\xf3\x20\x67\xc8\x30\xea\x50\x14\x8c\x08\x67\xa3\x5e\xc9\x3c\x6d\xc9\x6d\x0e\x6d\xc2\xcd\xeb\xa6\xa2\xdb\xbc\x60\xeb\x24\xad\x11\xb5\x18\xee\xdc\xd4\x68\x4a\xa9\x8d\x59\x68\xe7\xdc\x31\x60\xee\x22\xc3\xa9\xda\xae\xd5\x6a\x19\x3b\xac\xb5\x42\x3b\xec\xef\x64\x58\x6d\x3d\x41\x24\xf2\x5c\x3f\xde\x74\xdc\x08\x90\xb9\xfb\xbd\xcd\x9b\x9b\x9b\x2d\x66\xee\x6f\x4a\x13\x9f\xa7\x66\x6b\x2a\x3c\xa2\xab\x27\x24\x17\x5f\xec\xf6\x0c\x5f\x7c\xa1\xde\x24\x46\x37\x21\x1e\x47\x6c\x35\x13\x87\xd3\x4d\x1b\xc7\xf6\x10\xf5\xbc\xc0\xfe\x50\x47\x27\x3e\x3a\x39\x46\x6e\x8c\xdc\x08\x6c\x2b\xaa\xe3\xb8\x0f\xcb\x24\x00\x57\xce\x21\xcb\x16\x42\x21\x08\xcd\x0f\xe2\x21\xed\x4d\xfd\xc0\x9e\x44\xc4\x49\xe4\x4b\x90\x9e\x09\xfa\x82\x84\x41\xf6\xbd\x29\x27\x23\x0b\xa1\x23\xb5\xfc\xdd\x0b\x9c\x29\x27\x4f\xc9\x4d\x49\xcc\x21\xbd\x65\x09\x62\x08\x7f\xfa\xe2\xf4\xd5\x0b\x9e\xed\x8e\x12\x40\x5c\xcd\x23\xa8\xc6\x24\x0c\x29\x3d\x59\x93\x35\x75\x28\xa7\x79\x39\x7f\x77\xd0\x0a\xb2\xcb\x0c\x48\xfc\x4c\x65\xbf\xea\x04\x76\x0d\x6d\x3d\x51\x72\x3c\xd9\xa2\x1d\x95\x16\x78\x08\xff\x7e\xfe\x2c\x31\xa5\x65\x35\xd2\x2b\xe8\xa7\x49\x54\x17\xc9\x70\xe9\x2c\x36\xc9\xce\x5e\xdc\x25\x39\x53\x2e\x64\xc5\x23\x0b\xda\xfb\xe3\x70\xaa\x47\x3a\x81\x9d\x6a\xb0\xcf\x9f\x21\x90\x0a\x15\x72\x21\xa6\x05\x55\x52\xcb\xe6\x94\x89\xd6\xee\x0c\x03\x44\x5a\x2e\xd9\x75\x56\xfb\xa1\x7f\xd3\xdc\xc9\x6a\xc9\x8d\xce\xc9\x6d\xfc\x3a\x60\xef\x92\x4c\x4b\xa5\xc6\x0e\x5b\x2b\xa5\xfa\xbf\x1f\x6c\xf6\xdc\xf8\xc6\x8d\x88\xda\xe5\x01\xb0\x39\xa2\xea\x82\xd1\xc0\xbd\x26\x3e\x98\x4f\x3e\x25\xcf\x2f\xd2\x47\xb4\x27\xb9\x11\xc2\xb4\x6f\x92\x50\xc6\xd7\x75\x15\x17\xa9\x29\x67\xd5\x60\x12\x93\x90\xfe\xb2\x90\xeb\xfb\xec\x27\x53\x0e\x80\x28\x90\xd1\xf0\x04\x28\x95\x42\xaa\x0f\x73\x50\xb0\xa6\x99\xc5\x49\x4e\x40\x9b\xcb\xc9\x09\x2e\x08\xf4\x8c\x89\xd8\x12\x1a\xb5\x12\x05\x2a\xf9\x92\xd2\x52\xf9\x66\x56\xbd\x3e\xc6\x74\xd8\x80\xbc\x29\xfa\x15\x91\xb9\x42\x95\x22\x61\x4d\x2f\x41\x86\xd7\x45\x72\x85\x9b\x3c\x11\xd5\xed\x60\x44\x0b\x16\xc3\x99\xd8\xfe\x4d\xd1\x7e\xf4\x68\x76\x16\xa5\x34\xf4\x18\x81\xf7\xb3\x94\xa5\x95\x11\xa1\xb1\xbf\xab\x92\xca\xf6\xf5\xed\x87\xad\x54\xb6\x95\x2a\xa0\xe8\x95\x75\x0e\x9f\x56\x58\xcf\x74\xfd\xf1\x24\xde\x8a\xc9\x6d\x8c\x43\x82\xe9\xc4\x04\xf3\x25\xcb\x2e\x7b\x24\x84\x81\x4e\xfa\x52\xa3\xb6\xb6\xd0\xc9\xf1\x1e\xb2\xb1\xcf\xbd\x0e\xac\x1f\x61\xbf\x12\x23\x6a\x18\xb2\x0c\x94\x5a\xcc\x50\x9e\xe3\x30\xa0\x73\xac\x8d\xa9\x64\x61\x5a\x47\xae\x7f\xed\x02\x5e\xb5\xc5\x88\xd1\x39\x9e\xf8\x74\x7c\x71\x2c\x3a\x4e\x00\xac\x33\xb8\x16\xd0\x6d\x5d\x6c\xdb\x64\xcc\x4c\x5d\x28\xa5\xbe\x0e\x78\xf0\xd4\x2a\xf8\xe0\xfa\x4e\x04\x5b\xb1\x94\x20\xdb\x4f\x8d\x58\x76\x1c\x52\xe3\x21\xa0\x6d\x4f\xfc\x88\x5a\xbc\xd8\x77\x50\x3f\xc4\x03\x2a\x5a\xca\x28\x89\xe8\x1c\xac\x4c\x5a\x30\x32\x41\x11\xd5\x5a\x66\x72\x32\x2b\xa5\x94\x53\x56\x23\x3b\x4b\x69\x64\xa6\xa4\x4f\x68\x9d\x1f\x3b\xac\x77\xcd\x63\x77\x73\x1b\x2e\xbc\x92\xe8\x15\xe4\x15\x60\xe8\x59\xce\x76\x4a\x70\x66\x66\x42\xc5\xdc\x48\xc6\x64\x6e\x2b\xb8\xd4\xc8\x40\x15\x91\xa6\x52\xe3\x6a\x92\x38\xa6\x70\x63\xba\x14\xe1\xc6\x94\xe2\x7d\xe2\x11\x5b\x80\xf0\x71\xc0\x8d\x0f\x60\x49\x90\x66\x7b\x77\xb5\x02\x7d\x64\x5c\x27\xec\xc2\xe9\xb5\x31\x6e\xa7\x59\xab\xa6\x21\xe3\x39\xcb\x66\x8f\x35\x46\x37\x48\xed\xbd\x5a\xb5\xe2\xb8\xd7\x95\x9a\x85\x2a\x18\x9e\xdc\x0d\x88\xba\x44\x02\x07\x40\x9c\xee\x2e\x78\x50\xa9\xd5\x31\x95\xec\xee\xc1\x1a\x9c\x8e\xa5\xe5\xb2\xb7\x94\x5c\x98\x5d\xc0\x77\x10\xcc\x56\x41\xa7\x59\x3b\x80\x74\xd2\x62\xcc\x71\x96\xb7\x53\x93\x67\x2f\x07\x6b\x5b\x5b\x28\x65\x83\xea\xe7\x31\x54\x0d\x2a\x6c\x07\x83\xcd\x5f\x9e\x83\x4e\x8e\x39\x3f\xe8\x50\x32\x55\x15\xd9\xa1\x65\x32\xa1\x99\x43\x9e\x12\x4a\x2b\x14\x2d\x52\xac\xe0\xd4\x8b\x41\x9a\xb4\x8b\x3e\xdd\x99\x55\xb1\xd0\xe1\x6a\x29\x91\x0f\x71\x94\x23\xc5\x9d\x16\x97\x76\x1c\x9c\x14\x36\xcb\xae\x48\x08\x17\xc6\xe1\xc1\xc3\x69\x3f\xcf\xb0\x6b\xee\xd6\xaa\x62\x07\x91\xe6\x39\x39\xbe\x7a\xf3\xf6\xf4\xfc\x34\xd7\x49\x69\xb3\x56\xad\x88\x44\xb4\x7b\x16\xc9\x55\x3c\x55\x80\x97\xd2\xc9\x4d\x3a\x4a\x5c\x56\x82\x27\x92\x17\xaa\x98\xbb\x2a\xe9\xf9\x3f\x62\x1e\x03\x2f\xe4\xc5\x9c\x0f\xec\x42\x11\x78\xfe\xe0\xde\xba\x4e\x6b\x30\xdc\xd0\xaf\x47\x87\xb2\x06\xe0\xdf\xa7\x7a\xca\x3c\x72\x51\x15\x61\xc4\xd8\x6d\x8b\x0f\x84\xc1\x4b\x6e\x6d\xa1\x17\x01\x9d\xac\x88\x3f\x19\xa1\xde\x64\x80\x1e\xa3\xa1\xeb\x38\xc4\xa7\xd9\xa2\x35\x84\x6e\x86\x74\x5e\xa8\x42\x15\x04\x6c\xdc\x0f\xc8\x65\x45\x26\x25\xa0\x43\x56\xcb\x0b\x77\x63\xe3\x52\x1a\x73\xff\x8f\xda\x04\x55\xc6\x00\x67\xe8\xf3\x67\x23\x43\x77\x89\x1a\xb2\x68\xa3\xa2\x6d\x2f\x77\x42\xbc\xb5\x85\x9a\xfb\xf5\x66\xbd\x55\xdf\x47\x5b\xa8\xd9\xa9\xb7\xea\xed\x7a\x2b\xc7\xd3\xc8\x69\xad\xbc\x62\x16\xeb\x65\x7b\x51\x1d\x03\xa5\x01\xd2\xc0\x58\xe2\x62\x48\xba\x10\x32\xe9\xa1\xb1\x3a\xba\x27\xb9\x53\xd6\x50\x4c\x21\xb9\x3e\x9e\xca\xb5\x2e\x6f\x5d\xa9\x50\x35\x39\xac\x5f\x88\xb0\xcb\xd4\xba\xf8\xb4\xae\x38\x32\x42\x87\xea\xb4\x47\x55\xf0\x54\xf5\xa6\xa5\xa5\x4d\x19\xd0\x5a\x9c\x5a\x4d\x94\xf8\xa7\xd2\x89\x31\xc9\x3f\xd5\xe4\xd4\xe5\xab\x70\x93\x06\x2d\x77\xd8\xb8\xb5\x85\x46\x41\x14\x8b\x62\xd9\x8e\x72\x84\x7a\x53\x74\x7c\xb6\x83\xa2\x61\x30\xf1\x1c\x61\xa0\x8d\x43\x77\xe4\xd2\x05\x79\x04\x0d\xf9\x4f\x7e\x3b\x22\xc7\x1d\xe0\x2e\x6f\x6f\x3b\x08\xf3\x56\xa3\x2d\xa1\x48\x7d\xec\x7a\xb9\x5a\xd9\x2c\x1e\xf3\xff\x73\xfc\x8e\xd6\x93\xd8\xc9\xb8\xd4\xf7\xd1\x21\xaa\xd2\x82\xeb\xbc\x5e\x9f\x3f\xa3\x4f\x77\xb5\x8b\xff\x1c\xbf\xbb\x4c\x5c\xf1\xc0\xa7\x18\x8e\xc8\xed\x98\x1a\x61\xb0\xd5\x49\x6e\xc7\x2c\xe9\x21\x10\xae\xf6\x7d\x50\x25\x5e\xe1\x2a\xff\x5b\x3f\x43\x1b\x22\xac\xfe\x23\x7a\xc2\x6a\x51\x4d\x39\xfa\xf3\xab\xcd\xda\x01\x6d\x2d\x54\x61\xa5\x56\xa0\x55\x6a\xe6\xc6\x5c\x6e\xc7\x32\x23\x25\xe3\x64\xdf\x30\xd8\x18\xdb\xcb\x6d\xa5\x18\x67\xa4\xd6\x3e\x6f\xdd\x81\x17\xf4\xb0\x97\x6f\x53\xb0\x54\x02\x4d\x25\x8f\x65\x18\x70\x62\x12\xe2\x38\x08\xf3\xea\xb6\x2f\x12\x9e\x9f\x5e\x9d\x9d\xbf\x3d\x79\xfd\xd3\xd5\xf9\xb3\x9f\xf2\x4a\x6e\xd4\xaa\x95\x38\x60\xbe\x68\xce\xf1\xa0\x22\x7c\xf0\xbd\x38\x7d\x05\x05\xf5\x3c\x78\x22\x5f\xad\x1c\x9d\x9d\xbd\x9d\x78\xe4\xa5\x1b\xc5\xd6\xd1\xd9\xd9\x59\x3c\xf5\xc8\x0b\x62\x7b\x98\xe3\x79\x1f\x9d\x9d\x01\x0e\x1e\x4b\xe0\xb9\xc4\x8f\xdf\x12\x1b\x36\xb7\xad\x17\xa7\xaf\xd4\xdf\xac\x34\xf8\xaa\xa0\x8d\x35\x84\x2a\x2f\x4e\x5f\x9d\x07\x1f\x88\xcf\x52\xe0\x18\x9f\x87\xd8\x8f\xfa\x04\x90\xf0\x20\xf0\x47\x97\x97\xfd\xf3\xf9\xab\x97\xcf\x3c\xef\x28\xf0\x3c\x76\x61\x05\x42\x52\x9f\x3f\x06\xe1\x88\x1b\x39\xf0\x7d\x46\x68\xac\x08\xe1\x85\xbe\x22\x8e\x8b\x81\xe6\x2b\x77\x04\x8f\x09\xc0\xb5\x8e\xf5\x1a\x8f\x88\x43\x97\x3b\xaf\xf0\xd8\xa2\x7f\x21\xcd\x1b\xec\xd2\x1a\xfd\x39\x21\x11\xab\xc8\x1b\x6f\x32\x70\x7d\xfe\x87\xe5\x3c\xfb\xf5\xa7\x97\x30\xa9\x42\x82\xb3\x5f\x7f\x62\xa8\xc1\x6a\x4d\xcf\x7e\xfd\xe9\x0d\x8e\x87\x67\x64\x20\xd2\x00\x76\x95\xf8\x50\x44\x73\xf6\xeb\x4f\x4c\x0a\x41\xc8\x44\x70\x06\x6b\xe1\xe7\x93\x7e\x9f\x93\x84\x36\x38\x1b\x12\xc2\xb2\x9f\x93\xdb\xf8\x3c\xc4\xf6\x87\x23\xde\x0a\xbc\x48\x19\xce\x52\x05\x13\x1b\xf8\xab\xd4\xea\xd1\xd8\x73\xe3\x6a\xc5\x82\x56\x37\xf9\xd8\x54\xb5\x20\xe5\x6a\x93\x0f\x19\xaf\x9f\xbd\x3a\x46\x87\x5a\xc2\x0b\x57\x0e\x28\x49\xb3\xa0\x43\xde\x05\x2e\x68\x0e\x99\x60\xcc\xa7\x40\x25\xe1\xe3\xc7\xca\x97\x3e\x5b\x48\xdf\x95\xb0\x7c\x81\x5f\x17\x9a\x96\x5f\xd6\xa0\x0b\xb1\x44\x96\xde\x03\x2c\xe0\x15\x06\x31\xd9\x85\x18\x33\xe8\x30\x09\xa9\x43\x4b\x1e\xd0\x75\x70\x7a\x78\x28\xb3\xfb\x32\x6b\x45\xe9\x04\x3e\xe1\x37\x5b\x35\x2b\x5d\x3a\x09\x84\x3f\x16\xa2\xe9\xba\xe8\xd1\x23\xfa\x17\x99\xed\xf3\xed\xe5\xd6\xde\x5b\x5b\x68\xb7\xde\xaa\xb7\xd0\x49\xc4\xfc\xc9\x09\xa7\x70\x35\x3e\x63\xe5\x59\xd9\xcd\xce\x9e\x69\x32\x02\x22\x75\x97\x11\xd3\x0c\x13\x37\x29\x40\xab\xb3\x1d\xf4\x59\x18\xb5\x2c\x20\x49\xc5\x5c\xd1\x32\x4b\xf9\x32\xf6\xe1\x6e\x62\x1f\x6e\x2b\x06\x95\xe2\xfd\x96\x76\xfd\x48\x18\x89\xff\xa4\x46\x73\xee\xac\xbd\x9f\x0c\xd9\x0e\xf1\xff\x93\x9f\xb4\xb9\xd3\xae\x09\xff\x75\x15\xd6\x87\x2a\x16\x9c\xac\x32\xc5\x86\xce\xc7\x6b\x51\xef\x6b\xa6\x5e\x9a\x33\x4d\xac\x66\xce\x55\x01\x43\x05\xa8\xd1\x97\xf0\x98\x33\xe5\x2e\xb7\xeb\x00\x1d\xf9\xe4\x38\xaf\xfe\x4d\x31\xbb\xb1\xc5\xe7\x0b\x12\xd9\x79\xae\xb2\xf7\xe6\x5d\x15\xc6\xc1\x1b\x61\x90\xe5\xaa\xab\x9c\x5c\x67\x1b\xfd\x27\xc7\x7b\x57\x2f\x4e\x5f\x5d\xbd\x38\xfe\xf1\xe4\x75\x5e\x85\x5a\x6d\x61\xd6\x0d\x4e\xdf\xbc\xc8\x6b\xb0\x17\xd2\x63\x6f\xaa\x79\xf3\x76\x64\x9e\x32\x72\xdd\xbc\x16\x4e\x08\xd2\x26\x7d\xa3\x1a\xfb\x27\x9a\xb5\xff\x06\xc2\xa4\x5c\xaa\x6f\x94\x1b\x01\x74\x04\xd5\x2b\x59\xcb\x1e\x68\x51\x3e\x58\x19\x99\x0d\x42\xb4\xf5\x84\x9d\x8e\x23\xaa\x3e\xfa\xd2\xe2\x4d\xb2\xa6\x48\x5a\xba\xfa\x68\x7c\x72\x5c\xef\xb3\xd3\x6b\x48\x64\xa1\xd3\x8b\x37\x97\x39\x8a\x58\x66\x9b\x07\x74\x2e\x93\x73\x05\xbb\x15\x33\x8c\xaf\x82\x61\x5d\x5c\x2d\x89\x42\xdb\x82\x23\x5d\xd6\x3a\x19\x4f\xdc\xa1\xad\xde\x34\x81\xb3\xdf\xc7\x8f\x55\xef\xda\xb5\xb4\xab\xed\xd0\xbe\x48\x5c\x74\xc2\x71\x02\x4c\x70\xa2\x40\x70\x0e\x2d\x12\xd5\xb4\x15\x15\xf7\xc5\x6d\x12\x73\xa7\xcc\x8a\x7b\xf6\xe6\xa8\xe6\x6c\x99\x6d\x8c\x58\xb4\xce\x3d\x18\x6e\x7e\x74\x89\xe7\x28\x67\x5a\x55\x37\xce\x73\xbf\x0c\x67\xb9\x7a\x46\x38\xca\x4d\xce\xe0\x1f\x3f\x4e\x11\xa6\xe2\x74\x63\xb9\x37\x91\xde\x84\x85\xa7\x26\x1b\xa8\xd2\x45\xae\x6f\x07\x61\x48\x87\x12\xd7\xbf\x0e\xd8\x6d\x11\xbe\x15\x7b\x37\x63\x33\xb6\xb3\xf4\xb2\x12\x4e\xf5\xa3\x80\xae\x28\x5d\x7f\x80\xe8\x64\xc8\x0d\x0d\x70\xd2\xc2\x2e\x33\x81\x1a\xd8\x5e\x10\xf1\x24\x70\xa9\x86\xed\x79\xf9\x85\xa3\xe0\xce\x0c\xad\x14\x65\x59\xa8\xef\x5b\xc2\xb2\x20\x7e\x1c\xba\x62\x03\x2b\xd3\xf5\x79\x2c\x7a\x4a\x17\x6d\xa2\xf8\x2a\xb3\x57\x2e\x1a\x97\x9c\xca\x45\xf3\xb2\x46\x07\x2a\x9f\xc7\xf0\xcd\xa7\xdd\xfa\x76\x7d\x47\x9a\x52\x80\x0b\xa3\xf0\x60\x07\xa3\xb1\x47\xe0\x7c\xcd\x78\x26\xce\xb6\xc8\x62\x86\x63\x0d\x79\x2e\x2a\x8c\xab\x0a\x57\x7f\xaa\x46\x34\x85\xa6\x1a\x35\x29\x25\x1a\xc7\xc6\x19\x41\x40\xe0\x81\x32\xed\x10\xc7\x6e\x86\x86\x5e\x6e\xc9\x49\x1b\x7a\x48\xec\x0f\x88\xf9\xb2\x87\x57\x13\xcc\x0c\x12\x8c\xcc\xb7\x70\x3b\x39\x3f\x7e\xfb\xec\xfc\xf4\x6d\xd1\x9a\x4d\x50\x16\x3b\x4a\x50\x9e\xd8\x50\x62\xb6\x58\xe1\x7e\x52\xfe\x7e\x71\x9c\xed\x7a\xd5\x94\x79\xcc\xce\x96\x61\x47\x21\x29\xf7\x42\xb0\x7d\xc9\xa3\xcd\x43\x7c\x67\xb9\x55\x36\xd8\x11\x1e\x8e\xa2\x5c\xfb\xb4\xd5\xd9\x5e\x42\x8e\xa5\x1a\xa9\xd4\x1e\x43\xab\x5d\xa3\x26\x81\x20\xf8\x0a\x76\x95\x72\x8f\x97\xd8\xb9\x92\xa2\xd5\xb2\x39\x12\xb9\x82\x2e\x7f\xfe\x4c\xc3\x2a\xff\xfa\x97\xe4\x5c\x86\x27\xcb\x1a\x2e\x21\x5a\xc2\xa5\xb9\x15\x96\x3b\x4a\xde\xda\xa2\xc6\x09\xbc\x20\x89\xf1\x00\xdc\x6e\x31\x23\xbb\x5d\xdf\xc9\x6c\x67\xd6\xc5\xfe\x42\xb5\xdc\xd2\x02\xf6\x2e\xe6\xda\xb1\xd8\xda\x42\xc7\x67\x6d\x74\x13\x06\xfe\x00\x0d\x49\x48\x58\x97\x78\xfb\x13\x9c\xa8\xf7\xab\xc6\x63\x27\xe9\x04\xfb\x00\xdd\x55\x6b\x62\x15\xc2\xc3\x2a\x07\x50\xc9\xbe\xbc\x9c\x1a\x50\xe3\xb0\xd9\x44\x67\x60\x83\xa1\x67\xb6\x4d\xa2\x08\xbd\x20\xbe\x4b\x1c\x65\xc4\x8e\xc3\xe9\x4f\x24\xce\xcc\x93\x1f\x84\x8b\x83\xcc\x80\xeb\xc6\x72\x7e\x2f\x32\xb4\x8c\xb7\x07\xb3\x9a\x04\x7b\xcb\x16\x3a\xb7\xd0\x73\xed\xac\x11\x7a\x64\xd2\xa5\x9f\xa2\xca\x2f\xc9\x25\xa9\xae\x48\x00\x57\xc5\x9e\xa2\xca\xeb\x89\xc7\xdd\x30\x6e\x6d\xa1\x7f\xfd\x4b\x11\x36\xb2\x71\x44\x20\x46\x3e\x8b\xa9\x9e\x53\x73\x13\xaa\x5d\x3d\x4d\xde\x2d\xba\x71\xcd\xa2\xad\xc8\x05\xcb\x2e\x10\x57\xd0\x53\x74\x2e\x08\xf7\x26\xae\x17\xbb\x7e\x8a\x2a\x6d\xb4\xa7\xd0\x68\xa7\x35\x91\x92\xb6\xad\x6c\x2d\xd9\x26\x3c\x43\xf5\x39\x6f\xe4\x53\x5e\x14\xdf\x61\x04\xc3\x4a\xee\x63\x63\xcf\x23\x24\xb5\x85\xfd\x54\x6d\x6f\xd4\xa5\x22\x33\xf5\x94\xe5\x96\xd9\x65\x4f\x1e\x67\x18\x5a\xe7\xef\xde\x1c\x2b\xb6\x94\x3c\x20\xa4\x0d\x0f\x23\x42\xfd\x8a\x8d\xdb\x2c\x61\xda\x1c\xaa\x9c\xf8\x70\x71\x25\x76\x7b\x1e\x11\xb7\x63\x43\x0b\x6e\xcd\xd2\x1c\x70\x62\xcd\x39\x72\x4a\x1d\x54\x77\x96\x5b\x94\xa7\xef\x9d\x89\x05\x52\x72\xb2\x0f\x5a\x35\x21\x7c\xa1\x45\xe2\x17\x1a\xa2\xa7\xba\x46\x52\x62\xaa\x29\xff\xfe\xca\x61\x86\x8c\x61\x57\xfd\xb8\x42\xa6\x4e\x2a\x64\x22\xe9\x4f\x1c\xc4\x9d\xa2\x2a\x93\xcb\x1e\x25\x93\xa7\xe9\x68\x40\xa4\x9f\x3f\x2b\x11\xe2\x31\x74\x45\x06\xf1\xdd\x0f\x21\x0a\x61\x49\x1c\xa6\xea\x98\xb9\xea\xd0\x59\x6e\xf5\x9e\x6e\x0a\xf3\x31\xbf\x24\xb3\x9e\x34\xd1\xba\xc5\x07\x1d\xd8\xb9\xa2\xad\x05\x67\xf7\xfc\x72\x0e\xec\x48\x8c\xb1\x4d\xe0\xc6\x0c\x7f\x35\x18\xf8\x7d\xcf\xb5\xe3\x88\x9a\x4a\xe2\x12\x0d\xb9\x8d\x93\x37\x45\x7f\x00\x5c\xb5\x90\x01\xfb\xaa\xec\x6c\xe3\x4e\xc7\xe9\xec\xee\xf5\xf7\x3a\x3b\x4e\xab\xb3\xe7\xd8\xed\xed\x4e\xaf\xb1\xbf\x8d\x5b\xb8\xd5\x6b\x57\x98\x96\x44\x43\x42\xe2\xe8\x2d\xdc\xbe\x0e\xa7\x0a\x99\x4c\x44\xc5\xd9\xee\x39\x8d\x1e\xc6\x76\xcf\xee\xb4\x7a\x3d\x67\x7b\xaf\xd7\xeb\xed\x93\x5e\x6b\xbb\xbd\xbd\x4d\x6c\x87\x53\x1c\x61\x1f\x0f\x48\xa8\xb2\xa4\x04\x55\x7a\xbb\x3b\x7b\xbd\xdd\xbd\xfd\xe6\x7e\xa7\xb1\xdd\xef\xe1\x7d\x87\xb4\xec\x46\xbb\xb3\xdd\xb1\x3b\xb6\xd3\xc6\x2a\x5f\xa7\xe0\xf2\x39\x4a\x73\x95\x04\x57\x76\xfa\x76\x67\xb7\xe1\xec\xf4\x9c\x9d\x66\x7b\xaf\xbd\xd7\xdc\x77\x1a\xfd\x7d\xb2\xbb\xdd\xd8\xb5\xb7\x3b\x2d\xa7\x92\x6d\xf9\xe5\x6e\x45\xac\xbc\xe5\x45\xcd\xd8\xf2\x5f\xa9\x2a\x0b\xf8\x89\xf8\xd4\x40\x61\xae\xe9\x79\x47\xd6\x9b\x48\x09\x10\x87\x0d\x4a\x10\x6c\x75\x47\xaf\x58\x03\x64\xc2\x0d\xed\x4e\x3b\xce\xd4\xc7\x23\xd7\x86\xad\x72\x4a\x5e\xe9\xb2\xd0\x36\x57\x86\x34\xc6\x93\x1c\x38\xf0\x9d\x25\xa2\x4a\x9a\x5a\x85\x09\x8a\xf8\x93\x11\xdb\x1d\x67\xd2\xb2\xd6\x50\xea\x42\xcc\x80\xc4\xd5\xd4\xe8\x72\x05\x7e\x02\x83\xf1\x5b\xc6\x84\x78\x4d\x90\xe1\xb8\x76\x51\xe1\x63\x05\x5b\x28\xdd\xb1\x1b\x34\x50\xbb\x8c\x68\xcc\x16\xf3\x7e\x99\xba\xe9\xb4\xee\xa3\x66\x7a\x09\xb3\xeb\x95\xa8\x82\xb9\xc9\xb6\xcb\x57\x8b\x93\xba\xbf\x5a\xf1\x02\x8a\x2a\xa5\xa8\xbc\x71\xe9\xd1\x2c\x53\x1d\x41\xe4\x3e\x6a\x22\x68\x17\x55\x42\x76\x64\xa3\x81\xbf\xbb\x53\xa6\x0e\x8c\xc6\x7d\xd4\x80\x51\x2e\xe2\x3f\x7f\xa8\x32\x76\x9d\x9d\x52\xc3\x42\x0e\xd1\xfb\xa8\x61\x4e\x51\x45\x55\xfe\x77\x94\xbb\x86\xdd\xd9\x56\x53\xb5\x68\xb2\x9c\x72\xff\x1d\x81\x4b\x7c\xc9\x72\x4e\xba\xa0\xf7\x87\xb2\x06\x0b\x7a\x7f\x50\x3b\x3d\xe8\xfd\xa1\x5a\x7e\x4f\x21\xbc\x8b\x3e\x21\xc9\x73\x17\x82\xee\x0e\xa8\x95\x25\x6e\x2e\x43\x45\x23\x84\x91\x4f\x6e\xe4\xce\x22\x0a\xfa\xe8\xdf\x51\x94\x18\x14\x39\x73\x91\x6a\x43\xb2\x90\x6a\xc0\xa6\x62\x6d\x37\x84\x92\x86\x9a\x2b\xe2\x93\x09\x99\xbd\xc6\xd9\x79\x26\x8e\xf8\xa9\x34\x05\x37\x8c\x0d\x5e\xb2\x42\x82\x2e\x59\x58\xa1\x59\xc0\x8c\xce\x72\x3b\xd9\x2b\x9f\xd4\xd5\x6e\x21\xdc\x89\xa4\xee\x77\x48\x67\x7f\x6a\x21\x2e\x89\xe4\x36\x35\x83\x3e\xa1\x49\x0d\x87\xcc\x0c\x9c\x4b\x3f\x5d\xe6\x50\x57\xe2\xc4\x03\xbc\x51\x07\x63\x38\x5a\x56\x82\xeb\x49\xcf\x01\x38\x2c\x53\xf8\xe7\xcf\xfc\xce\xbd\x1a\x4f\xed\x50\x77\x30\x11\x39\x61\xa1\x01\xa6\xfe\x3a\xd4\x7e\x1d\xb9\xbe\x92\xbc\xa6\x66\xbd\x09\xdd\x58\xcb\x66\x16\xb0\xa8\xb9\x92\x13\xf6\xea\x15\xaa\x70\xed\x55\xbe\x0b\x90\x12\xd5\xf6\xd4\x61\x13\x85\x3b\x3d\x8a\xc0\x45\xea\x1b\x21\x4a\x79\x18\xce\x43\x32\xc2\x3f\x32\x5d\xba\x52\x49\xd6\x58\x9d\x35\xba\x45\x54\x74\x16\x0e\x92\xc5\x8e\x4c\x71\x00\x5d\xb4\xaa\x0f\x04\xb0\x19\x75\x84\x3d\x0f\x9e\xd2\x54\x45\xdf\xb0\xf4\x23\x80\x4f\xe2\x94\x40\x74\xe4\x9c\xb3\x02\x9a\x92\x2d\x6f\x69\xdf\x4c\x96\xb8\xeb\x47\xd8\xf7\x83\x98\x6d\xb9\x63\xb6\x47\x88\x70\xa4\x5c\xc0\x5e\x67\x12\x4f\x1e\xf3\xb1\x99\x2a\x14\xc6\x11\x43\x40\x20\x51\x44\x57\x26\x23\xb8\x7a\x8f\x63\x14\xf8\x04\x8d\x3d\x2c\xfa\x32\xd5\xcb\x8c\x51\x95\xbe\x30\x2d\xbf\xf5\x94\x72\x08\x4f\x8b\x24\x1e\xba\x91\x95\x4a\x2c\x9c\x98\x71\x77\x1a\xb2\xac\x8b\x4b\xb9\xd8\x54\x3b\x65\x55\xcf\x6d\xa1\x0b\xd5\xef\x13\x76\x00\xa9\x84\x6d\xa8\xb0\xe7\xe5\x08\x3d\x41\x6f\xc5\xcb\x6f\x8c\xc0\x94\x64\x2c\xd4\x79\xf4\x16\xdf\x96\xd7\xbd\x44\x61\xc7\xa9\xc2\x2c\xaa\xfb\x89\x52\x38\xd4\x38\x56\xfd\x04\x01\x0e\x12\x3a\x64\xeb\xa1\x3a\x1f\x45\xeb\x10\xaa\xbb\x3d\x16\x99\x59\xdc\x69\x5f\x14\xf8\xe8\xf0\x10\x6d\x36\xc5\xde\xe8\x81\x31\x0b\xbf\xd5\x4a\x17\xf9\x0d\xd8\x1a\x81\x42\x7f\xe0\x6c\x65\x7c\xde\xcb\x7c\x70\x71\x95\x95\x73\xa0\xc4\xb2\x82\xc4\xbb\x61\xfe\x63\x6b\x0b\xfd\xe8\xfa\x0e\xc2\x68\xcc\xdf\xff\x70\x99\x19\xc7\xb7\x14\x6b\xca\x05\x9a\x2c\xfb\x17\xee\xa5\x2e\x18\xf4\x83\xc9\x4f\xbf\x24\x19\x8d\x3d\xd7\x26\x55\xd7\xfa\xff\xd9\x7b\xf7\xb6\x36\x8e\xa4\x51\xfc\x7f\x3e\x45\x67\xcf\xbe\x1e\x29\x16\x42\x80\xb1\xb1\x08\xf1\x3a\xd8\xd9\xf5\x9e\x38\xce\x63\x9c\xcd\xd9\x1f\xeb\x03\xa3\x99\x16\xea\x30\x9a\xd6\x99\x19\x71\x59\x87\xef\xfe\x7b\xba\xaa\xef\x73\xd1\x05\x61\x93\x44\x79\xdf\x67\x8d\x7a\xaa\xef\xd5\xd5\xd5\x75\x25\xbd\x0e\xf1\x47\xef\x8f\xdf\x72\x05\xdf\xb0\xe6\xe3\x20\x44\x4e\xd1\x09\x45\xf7\xa0\x91\xa1\x2a\x9b\x58\x4e\x8b\xda\x64\x62\xb9\xc5\xb3\xd4\xa1\x71\xf5\x18\xc0\xd7\xa6\x06\x25\xab\x46\x21\xe0\x6b\x87\x01\xfe\xf4\x15\x08\xab\x90\xd1\x19\x98\x87\x70\x07\x55\x83\xd7\x6b\x2e\x40\x3b\x64\xbb\x5d\x37\x91\x23\x9e\x5e\xd2\xac\x90\x84\xa4\x08\xa3\x11\x8d\xa5\x8c\x02\x68\x0d\x39\x3a\x3e\x26\x28\x87\x6a\x9a\x9f\x12\xbf\xd6\xcc\x50\x0b\xd7\x1d\xf6\x85\x94\x72\x6d\xcb\xc1\x0f\x59\x52\xd0\xcc\x92\x88\x7b\x4b\xa3\xab\xe1\x21\x55\xe3\x36\xf9\x4e\xbd\x38\x8d\xcd\xd5\x4b\x83\xb3\xda\xf9\x95\xb3\xb4\x15\xfc\x27\x0d\xea\xd3\xd5\xc1\x12\x57\x11\xae\x23\xe9\x66\x3c\x62\xe7\x23\x9a\x17\x72\x33\x31\x04\xb2\x4b\xbe\xea\xf9\xe8\x9a\x05\x72\xe8\xc7\x0b\xd2\x23\x7d\x17\xe0\xa4\x12\x7c\x93\x6c\x7f\xf4\x29\x1a\xa9\x49\x70\xe4\x10\xea\x83\x0d\xbc\x2e\x2b\x79\x44\x1f\xd4\xe3\x14\x9f\xae\x32\xb4\xda\xea\xc4\x3f\xee\x1c\x0a\x7e\x94\xe7\x60\x19\x8a\xc2\x30\xb1\xed\xbf\xb0\x62\x74\x3c\x09\x23\x87\x0b\x77\x3e\xb4\xca\x26\x72\x50\x22\xb1\x86\x04\x2e\xf3\x2d\x8f\x5a\x8e\x5e\x22\x08\x0a\x87\x4c\x1f\x2f\x00\x3b\x1b\x87\x19\x44\x5b\x3e\x39\x09\xf6\x26\xd7\x41\x87\x04\xdb\xbd\xc9\x75\xf0\xf1\xe3\x19\xf9\xd6\x7c\xdd\x9b\x5c\x13\x51\x7e\x70\x06\x95\x06\x3c\x8b\x69\xd6\x27\x27\xc1\x36\xd6\xd9\x11\x55\xa0\x86\xfa\xb4\x3d\xb9\xee\x90\x1d\x59\xc3\xf2\xf9\x35\x93\xb7\x27\x04\x8c\x8e\x63\x2f\x27\xbf\xb6\x9d\xb9\x02\xd2\x6c\x6d\x91\x63\x19\x06\x03\x84\xa9\x24\xa7\x93\x50\xbc\xec\x62\x39\xcb\xae\x6c\xb0\xa2\xbd\x93\xde\x47\xdf\x13\xd7\x1f\x10\x9c\x66\x67\xe5\xdb\x6d\x5f\x98\x6d\x2f\x7c\x07\x57\xbe\x84\x89\xab\x8c\xf6\xb5\xb2\x37\x0b\xe6\x27\x7b\x37\xc8\x69\x76\x29\x59\xf6\x6a\x39\xd1\xd3\xda\x2a\x4d\x2f\x5e\x1f\xf6\x33\x3d\x7f\x2b\x4f\x99\x21\xc8\x35\x07\x47\xf4\x83\x48\x51\x9e\xa3\xd5\xd4\x47\x0d\x07\x14\x70\x9e\x1a\x2d\x73\x14\x6d\x8c\x58\x6d\xdc\x91\x95\xd1\x26\xed\x5f\xfa\x11\xb3\xe1\x5e\xbc\x9f\x26\x54\xeb\x2c\x7e\x60\xe9\x05\xc9\xc4\x26\x80\x65\x8e\xb2\x73\x7f\x0f\x41\x13\xd3\x98\xa4\x34\x17\x27\x4f\x40\xe4\x08\x02\xc6\x45\xf9\x84\xa7\x31\x4b\xcf\xd5\xf7\x28\xcf\xdf\x03\x08\x1b\x92\x01\x2f\x46\x84\x5e\xb3\xbc\xc8\xbd\x80\x00\xaa\xf7\x56\x06\x6b\x22\x2b\xc9\xad\x9b\x26\x54\x26\xd1\x93\x98\x2b\x3f\x2b\x23\x3e\x04\x80\x4e\x1e\x3d\x52\x1f\xbb\xaa\xe3\x36\x31\xdf\xbb\xa2\x9f\x56\x09\xa2\xea\x14\xaf\x32\x96\xc4\xc2\x31\xfb\x56\x74\xe8\xaf\xc2\x2c\x15\x5b\x51\x23\x80\x7c\xe2\x03\x36\x9d\x70\x09\x62\xa4\xce\xda\xe0\xbe\xae\xf9\x9d\x9d\x0a\xe0\xa6\x2e\x0c\x94\xae\xd8\xe8\x2a\xb2\xfd\x6c\xcf\x03\x6c\x6a\x1d\x21\x3e\x13\x61\x82\x54\xb0\xa0\xc9\xda\x19\x6e\x87\x51\xf4\x34\xda\x0d\x9f\xf6\x9e\x0e\x7a\xfb\x3b\x74\x8f\xd2\xe1\x1e\xdd\x7b\xf2\x64\xfb\xc9\x70\x38\x08\x0e\x36\x36\x20\xc7\xb5\x9c\x81\x45\x4e\x4e\xd2\xfc\x23\x91\xb6\x08\x6d\x52\x0b\x40\x7a\x60\xf5\xf1\x26\x05\xdb\x01\x72\x45\xc9\x28\xbc\xa4\x64\xcc\x33\x70\xac\x4f\xe1\xd9\xfe\xcf\xe3\x63\x15\x01\xb1\xab\x94\x8b\x47\x7c\xaa\x32\x05\x54\xb7\xfd\xf8\xb1\x5c\xde\x71\x78\x8d\x87\xf8\x90\x6c\xd3\xed\x9e\x2c\xa5\xe9\x25\x0a\xa3\x4a\x01\xb3\x0c\x37\xf2\x1e\x16\xd1\x16\x3d\x90\xab\x11\x8b\x46\xe4\x5c\x4a\x65\x73\x32\x4d\xd9\xff\x9b\x52\x29\xa5\x00\x5f\x4b\x32\x08\x73\x1a\x13\x08\x14\x02\x43\x04\x72\x41\x7e\x19\x51\x94\x42\xca\xba\x3c\xb3\x0d\xeb\xa5\x14\x31\xee\x20\xd1\x92\x35\xc5\x07\x78\x7f\x61\xf4\x1e\xf2\x0b\x85\xb4\xb1\x18\xeb\x4d\x3f\xf0\xec\x0a\xe2\xd9\x7a\x7c\xfc\x1e\xfe\xa5\x61\x34\x02\x5b\x00\x0c\x1d\x20\xde\x24\x33\xae\x1c\x63\x7b\x22\x1a\x35\x2b\xdc\xb3\xd9\x5e\x03\x8e\xe4\xce\x79\x38\xd8\xf5\x1e\x1f\x92\x6d\x2b\xe2\xb8\xfd\xe9\x5b\xbd\x29\x86\x89\x6f\xf5\x3a\xe6\x2c\x5b\x23\x94\x9e\xc0\x1d\x12\x9c\xfc\xf3\xf8\xf8\x23\xf9\x37\x9f\xca\x58\xa7\x80\x29\x21\x19\xd3\x31\xcf\x6e\x48\x42\xc3\x8b\x2e\x79\xef\x2d\x5f\x58\x90\xff\xc9\xbb\x41\xc7\x1e\x99\xfb\xd0\x13\x63\x03\x64\xa8\x0d\x93\x26\x27\x1e\x44\x01\x79\x6c\xa3\xde\x63\xbb\x51\xa7\x4d\xf4\x88\xa1\x43\xa6\xa5\x24\xe4\x85\x27\x2d\xd1\x19\xe4\x7e\x42\x38\x88\x95\x4e\xfa\x24\x08\x9c\xb8\xdb\xb2\x15\xec\xaa\x7b\x41\x6f\xc8\x63\x88\xa9\xed\x0d\x04\x8b\xbc\xe1\xa0\xbb\xc9\x3d\xc4\x22\x7b\xba\xca\xf8\x25\x2b\xbb\x30\xa4\x7d\xc8\xa1\xb2\x16\xc2\xa4\xb5\xb0\xaf\x7f\xd1\xa2\x43\xcb\x9a\x08\xbf\x77\xb5\x21\x2f\x00\x22\x87\xf4\x17\xf2\xc2\x75\x18\xb7\x48\xaa\xac\xcd\x07\xbf\x1e\x90\x5b\xdb\xca\xbf\x9a\xf4\xce\x1a\x8c\x20\xcd\xae\x77\xee\xa1\x02\xc6\xaf\x20\x2c\x93\x63\xd5\xd2\x5f\xf2\xc2\x0c\xb5\xef\x0e\x49\x2d\x87\x0c\x46\x6e\xdc\x1a\xc2\x3c\x67\xe7\xa9\xeb\x6a\x8c\xd2\xed\x92\x40\x7f\x1b\x05\x5e\xda\x56\xab\x4a\xa8\x2f\x23\xba\x1c\x1a\x28\x10\xea\x97\x4c\xe5\x01\x4c\x89\x85\x4b\x26\x85\xa3\x30\xb7\x5c\x23\x10\x1f\xb1\x0a\x1a\xdb\x81\x94\xd8\xb5\xa4\x87\xaf\x68\x6c\x07\x82\x77\xdf\x50\xde\x2c\xc1\x5a\xd7\xb1\xd6\x75\x2c\xa4\xeb\x00\xac\x61\xf9\x9b\xf4\x3b\x19\xc7\xb2\x8e\x3b\xdc\xad\x82\x6e\x62\xe0\x2c\xb0\xcf\xcc\x85\xa2\x5f\xeb\x2c\xd3\x91\x27\xfb\xbd\xba\x1a\x4d\xfd\x79\xa0\xba\x89\x6c\xda\x60\x81\xb3\xbf\xed\xc2\x35\x75\x90\xc9\x37\x0e\x82\x73\xfd\x72\xad\x6f\x7c\xa7\x0a\xba\xa9\x0b\x0b\x4c\x57\x55\x98\x5d\xdf\xcd\x6e\x19\xb6\xa9\x13\x0d\xb4\x90\x7d\x85\x05\xd8\x28\xc0\x40\x63\x08\x07\x55\xde\x4f\x6b\xe5\x24\x4f\x77\xcb\xa0\x33\x91\x0a\x9e\xb4\x77\xb2\xad\x68\xaa\xd9\xd4\x7d\x9d\x21\x84\xdb\xa4\x9e\x44\xe5\x39\xda\xae\x80\xde\x9d\xd9\x27\xb4\xa9\x6b\xbe\xe2\xe3\xf7\xf0\x90\xaf\x37\x54\xda\xdf\xab\x82\x6e\x9a\x9c\x05\xa6\xab\xfe\x8b\x65\xc5\x34\x4c\x66\x76\xf6\xb4\xae\x46\x53\x87\x1e\xe8\x67\x7a\x52\x3e\x60\x25\xf2\xa5\xc9\xc5\x25\xa9\x19\x24\x84\x03\xc2\x64\x3d\x43\x94\xe7\xef\x89\x43\x56\x2c\x80\x8e\x4d\x09\x6c\xb9\x9a\xda\xa5\x7f\x96\xb9\x10\x5b\xc5\xfc\xcf\x3c\xf7\x55\x3f\xd5\xea\x65\x69\xa0\xa3\xf5\x59\x2a\x37\xc0\x21\xf9\xcb\xf3\xee\x6e\x77\xe7\x2f\x07\xe6\xdb\x44\xcf\x08\x0c\x60\x7c\xca\x6e\x1b\xc3\xb4\xad\x6a\x5c\x1b\xb3\xaa\x37\x50\xcd\x21\xec\xd7\x9f\x68\x7b\x69\x64\x23\x0a\xe9\xfa\xee\xb5\x69\x3f\x47\x5f\xb8\x27\xc7\xfe\xd4\x2f\xe3\x79\x45\x1f\x72\xc6\x7d\x72\x82\xee\x34\xb7\xd6\xb4\xce\x2b\x08\x16\x3c\x3b\xe7\x98\x43\xbb\xa5\x16\x7d\x6b\xcb\x0b\x38\xbc\x99\xd2\xeb\x62\x33\x61\x29\x85\xe7\x1a\xcd\x36\xf3\x49\x46\xc3\xd8\x74\x3c\xcd\x69\x37\x9c\x4c\x92\x1b\xb9\x85\x2e\xbe\xd9\x2b\x9f\xd3\x62\x3a\x71\xb4\x6c\x65\x0b\x81\x7f\xe6\xb9\x67\x16\x00\xb5\x6a\xf4\x8a\xd8\xa2\xab\x33\x35\xfb\xeb\xb3\xf8\xe4\x5b\xd2\x13\xc7\xdb\x30\xf5\xbd\x8f\x9e\x1f\xd9\x0b\xf7\x23\xc6\x1d\xb3\x34\xf8\xfa\x85\x5b\x43\xb7\x2d\x1d\xa3\x8d\x6c\x0d\xb6\xc5\x33\x20\x8c\x5a\x7c\x6b\x8b\xfc\xf5\xfb\x84\x5f\x7d\xcf\xae\xdf\x52\xb7\x97\xaa\xbd\x9f\xd1\x6e\xab\x5d\x32\x18\xb0\xe7\xc7\xd2\x5c\xb0\x9b\x3c\x85\xc0\x1f\xe4\x2b\x25\xeb\x72\x26\xe5\x01\x99\x3e\xdd\x0f\x07\x15\xed\x5f\x22\xb2\x8b\xc7\x80\x2a\xd2\x54\xbb\x6e\x0d\xad\x3b\xa3\x54\xf4\xdb\x6f\xe5\xb6\x5f\x34\x9e\x29\x71\xe4\x6a\x4e\x63\x79\x69\x16\x3b\x16\xee\x54\xe5\xa1\x6d\x57\x9f\x16\x1f\x4a\x63\x9b\xa5\xf7\xad\xd5\xdd\xa3\x91\xe0\xdc\x46\x08\x88\x0a\x86\x8d\xae\x39\x54\x3e\x58\x2b\x47\x0b\xee\xf9\x4f\xd9\xb6\x7b\xca\xb6\x9b\x4e\xd9\xb6\x77\xca\x6c\xb3\x87\x0a\x5d\xb5\x1b\xe7\x12\xe0\x20\x9e\x36\xaa\xd5\x9d\xf8\xff\xaa\x15\xc5\x64\xda\x17\x9e\xfc\x66\xe9\xcf\xeb\xa1\x1e\x93\x6d\x3f\x28\xbf\x76\x98\x50\x97\x8f\xf5\x82\xb1\xef\x1d\x5c\xb9\x8e\x9b\x61\x4e\xce\xaa\x63\x0d\xf5\xd7\x3c\x47\x0d\x7e\x47\x17\x95\xce\x74\x5f\x2f\x47\xf9\xb8\xff\xf6\x5b\x0d\x21\xe8\x58\xab\x61\x9f\xc9\x7e\xd3\x49\x36\x95\xcc\xa5\x56\x79\x12\x3b\xee\x5a\xdb\x29\xf6\x20\xbf\xb6\x63\x9a\x22\x31\xbc\xcb\xd3\x9f\x50\x30\x2d\x91\x4b\x3d\xe8\x1c\xb4\x87\xd2\x3a\xbc\x7f\x05\x59\x4c\x40\x40\x6c\x61\x3e\xe8\xbe\xd0\x94\x86\xb0\x02\xdd\x3d\xe7\x37\x12\x12\xd5\x66\x9e\x0c\x1f\xcc\x37\x2c\x41\x29\x28\x26\x59\x31\x04\xb6\x0a\xb3\x1c\x93\x9f\x83\x25\x8e\xbc\xd6\xff\xf1\x69\xb1\x28\x05\x10\xac\x7f\xe3\xd9\x07\x85\x5f\xea\xdc\x67\x80\xf1\xd0\xc9\xea\x4e\xfc\x9c\xd4\x64\xc7\x6d\x7b\xa7\xa9\xed\x1d\x8f\x9a\x6c\x6d\x91\xd7\x10\xd8\xd8\x5d\x30\xf0\x6b\x1b\x72\x41\x69\x80\x86\xe3\x39\xed\x5a\x14\x46\x91\x18\x80\x3c\x2c\x45\xec\xb7\x7f\xf5\x95\x78\x16\x97\xac\x8d\xe0\x32\x9e\xaa\x4d\x90\xcc\x2c\xa1\x3f\x73\xb5\xab\x85\x4d\x9d\x0b\x1f\xbb\x76\xfd\xf7\xfc\x5b\xe9\x28\xcc\x25\xaa\x8b\x3d\xfb\x3e\x84\xc0\xd4\xca\x5d\xab\xe0\x50\x2a\x7f\x9a\x4a\xa3\xa2\x98\xe4\xfd\xad\xad\xbc\x08\xa3\x0b\x7e\x49\xb3\x61\xc2\xaf\xba\x11\x1f\x6f\x81\x3e\x45\x00\x6f\x3d\xd9\xde\xdd\xd9\x7f\xb6\xb3\xbf\x35\xe4\x59\x44\x37\xa3\x10\x52\xf1\x6d\xb2\x74\x53\x00\x5b\x5b\x97\x99\x1e\x0c\xc5\x36\xc7\xd9\x7c\x95\x7e\x72\x06\xbb\xdd\xaf\xd6\xed\x5e\x49\x6b\x6c\xf2\xff\x95\x5d\xb1\x44\xf3\xda\xa4\xf1\xb3\xea\xa0\xf4\xa1\xb6\x07\x78\xa9\x28\x7d\xb5\x57\xa8\x43\x11\xda\xeb\xe1\xb2\xde\xf0\x1e\x77\xb8\x6d\x0c\x42\x02\xbb\xde\xb1\x1b\x6d\x3b\xbc\xa6\x33\x86\x1c\x82\xc3\xf1\x0c\xc2\xaa\x4e\x13\xe7\xd1\x68\x49\x3a\xec\x6e\x6c\x7b\xb7\x69\x42\x4d\x13\x87\x24\xe8\x2a\x95\x4a\xed\x32\x81\x4e\xab\xcc\x09\x55\x93\x72\x6d\x21\x50\x22\xe4\xd9\x54\x21\x7a\x95\x11\xa5\xb4\xec\xc5\xf6\xba\xe4\x27\xb1\xa4\xb1\xa5\x90\x94\xe9\x41\x58\x7a\xc9\x2f\x68\xac\xd2\x2a\x39\xf3\x6f\x22\x77\xd3\xbc\x8e\xce\x4d\x73\xea\x3d\x1b\x4e\x21\x94\xbb\xc2\x4f\xf9\x41\x4b\xc7\x4f\x13\x9a\x56\x50\xa7\x0e\x31\x8f\x50\xb4\x69\x12\x80\xed\x0e\x39\xc5\x00\xb5\xbd\x03\xfc\xeb\x1b\x68\x00\x7f\xb8\x76\xb5\xb2\xfe\xc9\xa9\xd4\x00\x18\x52\x76\x6a\x42\xea\x58\xeb\xaf\x96\x7e\xc8\xb3\xd7\xe2\x96\x31\x4f\x6e\xfc\x62\xb7\xbd\xb5\x45\x5e\x5e\x72\x16\xe7\x90\x84\xe8\x86\xa5\xe7\x24\x17\x07\x00\x21\x49\x71\xc5\x22\xda\x21\x61\x41\x12\x2a\xc8\x88\xd6\xed\x66\x74\xd8\x35\x37\xfb\x90\xb4\x4e\x9d\x13\xa9\x86\xa0\xcc\x50\x55\xc7\x87\xd2\xf0\xd9\xb6\x01\xae\xae\x09\x66\xcc\xb2\xda\x41\x09\x5a\x41\x89\x3d\x2a\x01\x69\xe3\xe0\x46\x4e\xb9\x64\xcf\xf8\xcf\x3c\x6f\x34\x62\xfc\xa7\x4c\x2c\xeb\x68\x02\xef\xe6\x54\xbf\xf6\x71\x59\xeb\x7d\x1e\x82\xde\xe7\x81\x8b\x27\x31\x03\xb0\x94\xe8\xd7\xfb\xa8\x68\xa8\x16\xec\x9e\x8c\x13\x35\x97\x4c\xd1\xd4\x75\x44\x8b\xa0\x6a\x3e\x24\x41\x0e\x9f\x03\x4b\x4e\xc5\x72\x79\xad\x51\x08\x85\x83\xc9\x50\xcc\x67\x24\xed\x32\x2a\xba\x92\x53\xa2\x35\xa2\xb2\x89\x25\x65\x61\xa3\xe6\x8c\x24\x31\xd7\x09\x14\xff\xae\xed\x6d\x4a\xc6\xf6\x60\x1e\xde\x24\x7b\x48\xf9\xe6\x34\x9d\xe6\x34\xde\xbc\x0c\xb3\x7c\xa3\xec\x6f\xa3\xa7\xee\x09\xd5\x96\xb6\xd7\x2f\x5b\xf1\x9a\xf9\xb7\x6d\xda\x8f\x0f\x06\x60\x36\x02\x43\xbe\x0d\xd9\x91\x8f\x73\x41\x7a\xe0\xcf\x6f\xac\x85\x34\x34\x48\x7c\x72\x2f\x4c\x02\xad\x3e\x3e\x34\x7b\xf1\x98\x04\x10\x23\xc4\xd4\x57\xc9\xcd\x1f\x93\xe0\x20\xb0\x2f\x18\x90\x1d\x78\x60\xe2\x7d\xff\xb1\xad\x5a\x0d\xfe\x93\x06\xe5\xdb\xc6\xbc\x4b\x8b\xac\x74\x25\xdb\x16\xfa\xd5\xe3\xb1\x07\x52\x65\x6c\xaf\x77\xa9\xd9\xd0\xde\x02\xf3\xaf\xaa\xd5\x06\x3a\x59\xd1\x55\xb5\xb6\xd2\x58\xdf\xd6\xeb\xdb\x7a\x09\x2b\x8d\xb9\x62\x2c\x38\x90\x4d\x5a\x51\x1d\x10\xe1\x4f\xaf\x0e\x55\xa6\xaf\x62\x16\xe2\x48\xfd\xed\x82\xde\x0c\xb3\x70\x4c\x73\xed\x36\xfb\xbf\x55\xc9\x2c\x8e\xc4\x01\x44\xa6\x04\x7f\xcf\xc9\x95\x38\xf5\x2b\x19\x13\x3d\xb8\x3b\xf2\x26\x95\x3c\x88\xf2\x17\x94\xb6\x2c\x20\xc4\xd6\xc8\x64\x8b\xb0\x6b\x44\xd7\x04\x93\xe1\xa1\x60\x18\x65\xbd\x1b\xce\x05\x0f\xd2\x2b\x96\xca\x45\xf1\x7d\x2c\xc1\xe6\x3f\x8c\x63\x29\x0a\x41\xa0\x13\xf1\xe3\xa3\x27\x2d\xb7\xa7\x60\x8b\xcc\xed\xfe\x8d\x1c\x5a\xc9\x38\xfa\xd0\xbf\x2f\x89\xbe\xdd\xf0\x66\xde\x95\x36\xd2\xad\xf6\xa2\x7c\x59\x89\xd5\x72\xf6\x73\x49\x6e\xeb\x5e\x15\x99\xc0\x4c\x89\x15\xdb\x26\xbe\xb6\x25\x35\x62\x37\x5c\x96\x5a\x97\x48\x88\x02\x99\x42\xa6\x69\xac\xe6\xb1\x4c\x55\xbc\xd0\xa7\xff\x40\xa2\x71\x09\x4f\x82\xdb\x7a\x4e\xc8\x59\xc4\x46\x66\xc8\x83\xf4\xf9\xa1\x07\x16\x6d\x6c\xcd\x0f\xad\xf9\xa1\x35\x3f\xb4\xe6\x87\x1e\x26\x3f\x74\xc4\xd3\x18\x02\x44\x84\x09\xca\xd6\x81\x37\x1a\xd3\x98\x85\x1d\xf2\x37\x99\xe0\xde\xb0\x48\x16\xf8\x2c\x26\xc9\x03\x45\x36\x49\x29\xc5\xe7\x62\x93\xbc\x16\x2a\x19\xa5\xc8\xc0\xfc\xae\x59\x25\xdf\xce\xa2\x92\x55\x42\x20\x64\x95\x96\x63\x6b\x0a\xa9\x42\xa9\x65\x65\xbc\x35\xf7\x98\x99\x73\x5a\x34\x28\x90\xe5\x57\x4f\x7b\xec\x04\x31\x80\x11\x9e\xd3\x02\x61\xea\x94\x43\x62\x9c\x28\x9f\x81\x6c\xb4\x7a\xc0\x35\xaa\x1e\xa9\x8c\xa8\x19\x95\x52\x55\x64\xda\x77\xb5\x7a\x54\x0e\xdc\x2c\x1d\x3c\x98\x1b\x48\x0d\x16\xba\x8b\x65\xd3\x54\x2b\x68\x1a\xc6\x1a\xc6\x71\xc3\x0a\xca\xaf\xae\x92\xb0\x24\x87\xb3\x54\x8d\xf5\x68\x62\xea\x39\x96\x18\xdc\x28\x64\x9b\x55\x79\xce\x32\x35\x69\xf2\x1a\x78\xe5\x3b\x06\x0c\x79\xf8\x2c\xb1\x0a\x41\x0c\x55\x5e\x34\xb3\xbe\xff\x49\x6f\x6d\x3f\xb8\x0a\x0e\xd8\x3b\x7b\x8d\x3c\x70\x09\xd6\xe7\x82\x1f\x58\xe4\xd5\x35\x0b\xb8\x66\x01\x97\x65\x01\x21\x26\x48\xad\x43\xc9\xae\x0b\xd7\xc4\xfd\x01\xc0\x9a\xf5\x13\x8b\xf5\x3d\x4f\x8b\xef\xc3\x68\xa6\xf2\xcd\x86\xb3\x58\xb8\x39\x39\x38\xbb\x76\x25\xfb\x36\xe4\x69\xb1\x39\x0c\xa3\xbb\xea\xe0\x94\x15\x95\x65\x5c\xb5\x1a\x1d\x5c\x89\x41\xb2\xa7\x74\xcf\x8a\x35\x98\xcc\x2a\x14\x6b\xd0\xd0\x5c\x8a\x35\x30\x5d\xc2\x73\xe4\x58\x2d\xa9\x85\xef\x58\x0d\x4a\x4d\x5b\xbb\x52\xc9\x66\x41\xac\x4a\xc9\xb6\xc8\xd8\x7c\xee\xa7\xe2\xb6\xb5\x37\xb2\xf1\xaa\x75\x01\xfd\x7b\x76\x1d\x0c\x75\x7d\xcf\xae\xef\xd9\xf5\x3d\x5b\x73\xcf\xfe\x8b\xd1\x2b\x71\x78\x67\xdd\xb3\x36\xdc\xe2\xf7\xac\x5d\xbb\xf2\x9e\xbd\x94\x00\xbf\x9b\x6b\xd6\x9e\xd1\xaa\xae\xd9\xfb\xb9\x47\xec\x91\x36\xde\x23\x2e\xa0\x77\x8f\x3c\x7b\x60\xa1\x12\xb7\xb6\xc8\x2f\x21\x2b\xb4\xbd\xf8\x39\x2b\x46\xd3\x01\x18\x8a\x0b\x76\x6d\xc0\xf9\xc5\xd6\x30\xe1\x57\x5b\x2c\xcf\xa7\x34\xdf\xda\xdd\xef\x91\x82\x93\x01\x25\x43\x76\x4d\x63\x31\x27\xd7\x72\x89\x08\x68\x81\x8e\x5b\x72\xe4\x9b\x97\x61\xc2\xe2\xcd\x21\x4b\xe8\x26\x1c\x29\xc8\x7c\x08\xc8\x20\x79\x19\x76\xce\xa5\xa7\xe6\x5e\xaf\x4f\x82\xff\x45\xf7\x69\x38\x7c\x0a\xdb\xbe\xdd\x83\x92\x68\x2f\x0a\xe9\x73\x28\xd9\xc1\x92\xe7\xc3\x70\x3f\x0e\xa1\x64\x17\x4b\x9e\x3d\xdf\x7f\x1a\x0d\xa0\xe4\x09\x96\xec\x45\x4f\x07\x51\x0f\x4a\xf6\xb0\x64\x77\xb8\xb7\x3d\xd8\x83\x92\xa7\xb2\xe4\xf9\x93\xe7\x21\xd6\x7a\x26\x4b\x7a\xbb\xc3\xe7\x28\x64\xda\xc7\x92\x9d\xfd\xdd\xbd\xe7\xbb\x50\xf2\x1c\x4b\xb6\xc3\x9d\xdd\x67\x28\xdc\x79\x29\x87\xb8\x1f\x3d\xa7\x43\xac\xf6\x52\x8e\x71\x6f\xf7\x69\x3c\x94\x50\x72\x48\xbb\xf1\x5e\xa8\x8a\x74\x7f\x4f\x86\xb2\x28\xe2\x69\x91\x85\x79\x21\xc9\xe6\x11\x4f\x78\xd6\x27\x41\xc2\xce\x47\x45\x50\x93\x93\x07\xd7\xaf\x8c\x67\x0f\x2c\x10\xe2\x17\xc7\xb3\x09\x4b\x2f\x1c\x2c\x1b\x46\xf4\x09\x8d\x6c\x2c\x1b\xee\x0f\x06\x71\xcf\xc6\xb2\xe1\x93\xfd\xe1\x60\xdb\xc6\xb2\x61\xef\xe9\xce\xf3\x1d\x1b\xcb\x68\xf4\xa4\xf7\x2c\xb4\xb1\x8c\x3e\xdf\xa6\x4f\x77\x6d\x2c\x8b\xf7\xb7\x07\x4f\x7b\x36\x96\x45\x3b\xdb\xfb\x7b\x03\x1b\xcb\xc2\x78\xfb\xc9\xde\x33\x1b\xcb\xf6\xf7\x7b\xf4\xc9\xd0\xc1\xb2\xe1\x70\xbf\x27\xd1\x55\x61\xd9\x70\xf8\xa4\xb7\xbf\xed\x60\xd9\x70\xaf\xd7\x93\x4d\x29\x2c\x8b\xf6\xb6\xb7\x9f\xee\x2c\x8d\x65\x62\xf5\xca\x38\xf6\xc0\x42\x2b\x7e\x71\x1c\xcb\xe0\x86\xb5\x50\x6c\x48\x07\x94\x3a\x28\x36\x8c\xe2\x78\xc7\x46\x31\x3a\x7c\x1e\x3e\x77\x08\x19\xdd\x7b\xb6\xfb\x6c\xd7\x41\xb1\xe1\xde\xee\x9e\x43\xc8\x86\x4f\x9e\xec\xee\x3e\xb5\x51\x8c\xee\xed\x3e\xdf\xdd\xb3\x51\x2c\xde\xdd\x19\xee\x38\x84\x2c\x7a\xba\xb3\xbf\xb3\x6f\xa3\xd8\xe0\xd9\x76\xb4\x1d\xf9\x28\x16\xee\xf7\x3c\x14\xdb\xdb\xd9\xdb\x71\x51\x6c\xb8\xfd\xec\xc9\x13\x07\xc5\xe2\xbd\x5e\xaf\xd7\x5b\x1a\xc5\x32\x48\x85\xe4\x61\xd8\xdd\x02\x41\x96\x72\xd9\x7d\x22\x3a\xec\x66\xbf\x26\x05\xde\x76\x5b\xb4\xa7\x30\x0d\xb1\x8b\x94\xc3\x8a\x3e\x5b\x6d\x08\xb1\xcb\x55\xa7\x3f\xf9\x8c\x01\x7a\xca\xba\xc2\xea\x29\x3c\xab\xab\xd1\xd4\x5f\x85\x6e\x10\x9a\xf0\x6d\xb8\xaa\xbb\x7c\x5a\x0d\xdf\xd4\x61\xc9\x66\xeb\x33\x85\xa4\xf1\x1e\x10\xd5\xf3\x79\x5e\x09\xde\x1c\x2e\xc5\x7d\x31\xe0\x10\x6d\x7b\xfc\xea\x9e\xf6\x2a\x80\x1b\x27\xe4\x18\xe0\x43\x45\x4f\xf4\x58\xdd\xcf\x7e\x25\x78\x53\x4f\xbe\xac\xf1\xf3\x24\xfa\xb1\x8f\xfe\x83\xf4\x19\x7a\x95\x85\x57\xb5\xb1\x76\xf6\xb6\xe7\x4a\xac\xa6\xe6\x7e\x0f\xd9\xa0\x70\x78\x6d\x45\xef\xad\xcc\x4f\xab\xdd\x3f\xd9\x7e\xc3\xee\x3d\x30\x33\xfa\xf2\x45\x18\x46\x05\xbb\xa4\xaf\x13\x3a\x86\xfc\x9f\x32\x16\xd8\x55\x4a\xb3\x57\x3c\x02\xdd\x66\x2d\x35\x37\xf4\xc1\x81\x6f\x8c\x1e\x66\x03\x7e\x96\xfd\x30\x5a\x70\x7b\xa2\x56\xf0\xd6\x98\x47\x2b\xd2\xfe\x82\x08\xc0\x5d\x0a\xb5\xd0\x2a\x1e\x4e\x29\x11\x72\xcc\xa3\xae\xb7\x05\x5e\x4a\xe4\xad\xaf\x09\xa3\x28\x34\x82\xc8\xda\x29\x97\x53\x21\x14\x6b\x90\xaf\xb7\x6e\x37\x6e\xcb\xec\x47\x59\x5c\x50\xe6\x2b\x1e\x9a\x55\x63\x19\x3f\x8d\x6c\x2b\xe5\xb1\x18\xd4\x25\x4d\x8b\x0e\x19\x85\x69\x9c\xd0\xac\x43\xa2\x70\x52\x4c\x33\x69\x83\x81\x3b\x90\x5a\xcb\xde\x5c\xc9\x4a\xf8\xab\x76\x65\xcc\x2f\x2b\x32\xa9\x78\x81\x77\xf9\x70\xb8\x50\x1f\x52\xc4\x83\x11\xe3\xf1\xc4\xa4\x75\xc4\xd3\x8a\xbe\xc6\xd3\xc6\xb3\x94\x1a\xc0\x61\x5d\x6e\xf1\x3d\x8b\xe7\x12\xa3\x6e\x6a\x6f\x38\xfc\x12\x14\xf2\x41\x9a\x14\x48\xbb\xab\xba\x10\x79\x4f\x7c\xc0\xa6\xe8\x78\xaa\x2d\x2b\xd2\xa2\x18\xe3\x2f\x18\x39\xc2\x88\xd9\xeb\x3a\xdb\x9b\x55\xb1\xa9\xf3\xba\xbe\xda\x56\x22\xd8\x9f\x94\x62\xe0\x5d\x1d\x16\xed\xd7\x80\x37\x06\x61\x77\x20\x8d\x12\xc9\x91\x34\xd7\xcd\xf9\x79\x0d\x7c\x63\x14\x42\xb7\xe5\x2a\xb5\x55\x6d\xc8\xc3\x5e\x15\xf4\xec\x90\x87\xd8\xa8\xae\x3b\xe1\x79\xce\x06\x09\xb5\x24\xfe\x18\x14\xbd\xb6\xdf\xed\xd9\x75\x9b\x46\x51\xdf\xa1\x89\xb8\x9a\x8e\x68\xc6\x8a\xfa\xa9\x97\x41\x9b\x7a\xd4\xcd\x99\xa0\xa4\x34\xac\xcd\xf1\xbe\xed\x42\x35\x86\x2e\x15\x00\x1a\xfc\x43\x16\xa6\x98\x62\xac\xa6\x65\x2b\xe2\xa7\x81\x6d\x6a\xdf\x40\x19\x8d\x93\x2e\xaa\x7b\x09\x5b\x0f\xe1\x2b\x56\x8c\x3e\x8c\x68\x6d\xd8\xce\xe7\x3b\x65\xd0\xc6\x24\x0b\x0a\xe8\xb3\xd0\x5c\x31\xae\x41\x38\xa0\x09\x06\xd1\xfb\x3e\xe1\x57\xef\xc5\x82\x0b\x8a\xf0\xe1\x66\x42\xf3\xd3\x49\xc6\x27\xe2\xa8\x9e\x4a\x3e\xa4\x76\x47\xbb\x0b\xb6\xf3\xdb\x6f\x95\x0d\xf5\xda\xdd\x30\xbd\x01\x31\xda\xdf\x24\x52\xd1\xd8\x64\xab\x37\xdb\xb5\xd0\xe0\x4d\x35\x41\x08\x06\x61\x74\x51\xf7\x16\xec\xcd\x3d\x91\x8a\x36\x67\xcc\x69\xb9\x11\xbf\x9a\x66\x61\x03\xc6\x2f\x35\x62\xdd\xe6\x0a\x47\x0c\xaa\x5f\x29\x79\xd4\x8a\xb8\xbf\xb1\xf3\x94\x67\x54\xfb\x98\x87\x93\x09\x0d\xb3\x6a\xb1\x97\x98\x08\xe7\x49\xc7\xd1\xe4\xbd\x24\x39\x4b\xcf\x13\x4a\xa2\x11\x4b\x62\xcc\x90\x9f\x16\x8a\xc7\x35\xce\xeb\xf0\x39\xa3\xa9\x8e\xe3\xbe\x28\x5a\x1f\x1e\x92\x40\x9d\xb7\x80\xbc\x58\xb0\x7e\x97\xe5\xf2\x6c\xc6\x77\xaa\xdb\x5f\x74\xdc\xb5\x4b\x99\x8f\xc2\x09\x6d\x2d\xd6\x5a\xdb\x1a\x8a\xbb\x0d\x6f\x86\xe4\x4c\xf0\x42\x67\x1d\x08\x75\x16\xe9\x03\x09\x91\x73\x0c\xc5\x24\x2c\x35\x7b\xc2\xd2\xc6\x8d\xae\xed\xcc\x47\x1a\x9e\xbe\x16\xe4\x6f\xd1\xad\xad\x3a\xf4\x4b\xee\x72\x45\x53\xab\x59\xf8\x72\xc3\xed\xb9\xd6\x82\xa5\xe7\xeb\xe5\xc0\xe5\xb8\x66\xc5\x7a\x29\x36\x08\xa4\xe9\xa5\xb5\x7d\x23\xc3\xdf\xdc\x02\x18\x21\x2c\xd4\xc2\x87\x11\x25\xb1\xba\x4b\x86\x3c\x03\xe2\x60\xa8\x41\x87\xb0\x94\x8c\x59\x92\xb0\x9c\x46\x3c\x8d\xd1\x59\xe1\x6b\xcc\x3e\x13\xde\x90\x7c\x42\x23\x36\xbc\x21\xa1\x22\xf2\x05\x1b\x53\x3e\x2d\xa0\xa9\xd0\x21\x2c\x79\x87\x70\xd4\xd3\x5f\xb2\x78\x1a\x26\xc9\x8d\x0c\xd2\x05\x7c\x8f\x78\xdb\x99\x85\xc0\x46\x96\x47\x0a\x73\xe3\xde\x19\x29\x74\x53\xab\x46\x0a\xd5\x70\x1b\x64\x07\x52\xf1\x37\x4c\xf8\x95\x2d\x1b\xc1\x12\x10\x44\xb8\x79\xdc\x79\x4c\xbb\x79\x94\xf1\x24\xf9\xc0\x27\x4e\xee\x48\xb1\xa3\xdf\x87\x31\x75\x68\x7a\x4e\xa6\x39\x8d\xc9\xe0\x06\xf6\xf7\x2d\x8f\xc3\xc4\x5c\x01\x90\x54\xe9\x4d\x11\x08\x20\x96\x9e\x93\x13\x60\xd9\x37\x4d\xfd\xcd\xf3\x8c\x4f\x27\x1f\x5b\x15\x1a\x51\x00\xfd\x35\xdf\xaa\xae\xd2\x26\xc0\xf6\xa6\x62\xb7\x65\xee\x25\xb0\x26\x16\xc3\xb3\x25\x40\xa7\xb0\x5c\x7f\xd5\x5c\xa2\x25\xf4\xd1\x6f\x17\x23\x96\x11\xd5\x3b\xa4\x54\x07\xe4\x70\xc6\x12\x39\x8c\x8d\x74\x47\xbe\x54\x86\x07\x26\x2f\xd1\x69\x41\xc7\x93\x0e\xc6\x11\xeb\x88\x8f\x85\xfc\x88\xe1\xf8\xdc\xc7\xa9\xe9\x5b\x1a\x2a\x87\x31\x2d\xf9\x66\xd5\x06\x7e\x0b\xb3\xf3\x65\xa3\xbe\x89\xaa\xcd\x01\xdf\xa4\xd9\xab\x92\x9b\x67\xa0\xa4\x6b\xc1\xec\xf0\x0f\x8c\x55\x07\xb3\xaa\x7f\x8a\xfa\x13\x14\xcf\xb6\x21\x39\x84\x89\x76\x4f\x4f\xc1\xac\xf0\xf4\x14\x62\x27\x8b\x86\x3c\x61\x81\xbb\x35\xed\x36\x78\x02\xcb\xd8\xc5\xa2\xa1\x0e\x81\x2c\xb3\x3a\x78\xbc\x98\x55\xbb\xdd\x96\xab\xaf\xfe\xed\xa2\x84\xed\xb5\xcc\xb6\xe5\xca\x07\xcd\x92\x20\xea\x83\x89\x32\x9f\x84\x11\x2b\xc4\x3a\x06\x3d\xcb\xaf\xdc\x1c\x19\x27\x48\xa2\x0c\x19\x07\x06\xa9\xf2\x12\xb6\x8d\x9a\x2b\x3e\xab\x46\x6c\xe3\xe3\xdb\x8a\xd1\x62\x7e\xbe\xba\x01\xeb\x90\x81\x7f\x9d\x48\x06\xdb\xea\xaa\x63\x59\x43\x17\xea\x15\x6a\x80\xbb\x50\xe6\x00\x49\x02\xeb\x81\x61\xa9\x9e\xaf\xb5\x48\x85\xfd\xe2\x86\xe6\xac\x22\x15\xf4\xbb\x15\xc8\xb5\x0c\xec\xc0\x09\xea\x62\xd0\x84\x58\x77\x6e\xc5\x51\x26\x2f\x74\x71\x5f\xfd\xd5\xa5\x62\x59\x74\x4c\x05\xb5\x82\x4e\x5c\x72\xb2\x39\xdb\xc2\x62\x32\x4d\x92\xad\xbd\xed\xa7\xdb\xe5\x69\x5d\xd1\xc1\x05\x2b\x3e\x3c\x9c\xc9\x55\xe3\xe5\x76\x30\x0b\x07\x59\x7a\x3e\x03\x0d\x59\x7a\x3e\x0f\x26\x5e\xb3\xb2\x58\xbd\x16\x0b\x77\x16\x42\xc3\x9d\x39\xf1\x70\xe7\xe1\x21\xe2\x35\x2b\xfe\xb0\x78\x58\x35\xb7\x7a\xf2\x58\x8f\x86\xd7\xac\x68\x40\xc1\x6b\x56\xd4\xa2\x1f\x1d\x4f\xda\x9d\xf9\x2f\x17\xeb\xb6\x35\xfe\xc6\x56\xfc\x5b\x94\xce\xfa\x37\xfd\x89\x1b\x7f\x3b\x8d\x69\x56\x1b\x75\x5b\x7c\xf4\xc3\xb5\x2a\xb2\x5b\x8d\xee\x28\xd0\x10\x78\x8c\x33\xc6\xdf\x36\x84\x92\x4c\x18\x18\x55\x62\x43\xc9\xc3\x6a\x80\x64\x41\x05\x8c\xcc\xe7\xea\x1f\x72\x0f\x12\xcf\xf3\xa9\xbd\x0f\x1d\xc7\x05\xe7\x26\x01\x45\x88\x01\x42\x1b\xe4\xaa\xa3\x5c\x73\x99\xf0\x62\x04\x23\x46\xdd\x57\x8d\x12\xc2\xda\x3e\x5c\x3c\x72\x12\xe0\x22\x05\x1d\x12\xa8\xa5\x10\x7f\xcb\xa9\x58\x7f\x82\xdd\x35\xfc\xba\x66\x85\xf8\x0b\x86\x28\xfe\x80\xb1\x40\x02\x05\xdb\x9b\x56\x59\x8c\xc3\x80\x94\x0a\xc6\x0c\xe0\xd3\x6d\xc7\xcc\xbb\x6d\x87\xee\xfe\x9e\x67\x24\xa7\xd9\x25\xcd\x48\xce\x62\x2a\x31\xc1\x78\x16\xa3\x19\xbf\x85\xd8\x0c\x44\x67\x38\x0f\x1b\xf9\x1b\x38\x0b\xdf\xc3\x48\xca\xbe\xd5\xf0\xe4\x29\x57\x8a\x68\x73\x9c\x2c\x39\xb6\x82\x35\x9b\x50\x37\xd3\x12\x86\xf6\x49\x19\x33\xe5\x7b\xaf\xb4\xef\x46\xde\xe2\x71\x2a\xd5\xc8\x58\x86\xab\xc4\x46\x17\xcc\x10\x1f\xa0\x05\x80\x4a\x6d\x53\x49\xe1\x85\x2c\xf0\x0d\xe2\x8d\x5f\x55\x18\x83\x1d\xbc\xbf\x98\x0e\x5f\x0f\x6c\xa8\xca\x16\x63\x49\x29\xd5\xca\x28\xbb\x12\xfd\x70\xc4\xe5\xa3\xb8\x08\xb6\x3e\xa0\xab\xc8\x2d\xde\xe2\x2c\x3d\x3f\x8e\x32\xaa\x4e\x32\x85\x59\x56\xc3\x27\x34\xbc\xd4\xe0\x68\x77\x52\x65\x76\x81\xf9\x5b\xb5\xa2\xc0\xb2\x13\x68\xa9\x57\x83\xa7\x27\x5d\xad\x4b\x98\x1a\x91\xa5\x40\x90\xce\x4c\xfa\x93\xce\xb9\x9a\x1f\x8b\xa7\xab\xb1\x28\x50\xb7\xb7\x2e\xb7\x02\xca\x6b\x10\xbd\x36\x1f\x34\x07\x50\x2a\xd3\xba\x2f\xf5\x00\xae\x11\x7d\x1b\xed\x9c\x86\x6c\x52\xad\x68\xa0\xcf\x6b\x60\x52\x9a\x5e\xcb\x2a\xb9\x99\x50\x63\x72\x22\xd7\x4f\xa0\xa8\x8c\x1f\x1f\x18\x50\x08\xf4\xe9\x54\x24\x8f\x49\x20\x9b\x04\x22\x73\x09\x09\x99\xc3\x41\x42\xe3\x79\x9b\xa8\x4e\x49\xac\x5c\xf2\x36\x24\x75\x7c\x33\xf4\xe4\x3a\x84\xe5\xaa\xa7\x0d\x45\x1d\xd1\x09\xcf\xeb\xdf\x8a\x0d\x8f\xed\xa4\x5c\x73\x22\x5a\x6e\xc4\x72\x32\xc9\xf8\x25\x8b\xa9\x9d\xd5\x06\xdb\xf3\x96\xc4\x4a\x86\xfd\xc9\x77\xe6\x4c\xe9\x15\x41\xaf\x29\x7f\x1d\x1f\x93\x80\x5c\x85\x79\xfa\x9f\xa0\x20\xf9\x74\x32\x49\x18\xa6\x7f\x3e\x3a\x3e\x36\xc4\xf5\xef\x19\x9f\x4e\xfa\x10\x4f\x35\x80\x57\x6f\x14\xa6\x24\x0a\xc5\xf9\x98\xa6\x19\x4d\x18\xd8\x62\x87\x29\x1b\x87\xa8\x1a\x0c\xd3\x98\x5c\x71\x68\x74\x40\x89\x0c\x5e\x43\x63\xc2\x52\x6c\x24\x24\xc3\x69\x31\xcd\xa8\x4a\xba\x4d\xf8\x90\x80\xd0\xa1\x4b\x8e\x29\x45\x18\xc5\x3a\x0e\x07\xdd\x31\x95\x52\x10\xdd\x45\x49\x1e\xb2\x69\x8b\xc7\x20\xb9\x37\x34\xc2\xd2\x21\xcf\xb0\x4a\x37\x30\xd7\x9a\xbd\x75\xd6\x5a\xa7\x41\x41\x42\x82\x8c\xa1\xba\x99\x08\x4d\x72\x6a\xe7\xbb\xa9\x59\xfc\xba\x04\x38\x73\xed\xc0\x78\x9a\xc3\x4a\xa9\xce\x49\xcb\x13\x0e\xb6\x03\x9f\x47\x74\x84\x13\x62\xdb\x55\x42\x66\x3c\xf6\x3e\xbd\xa9\xa3\x43\x16\x79\xd0\x17\x04\x4f\xe9\xbb\xa1\x28\x6b\x9d\x54\x7d\xc6\x21\x76\x2a\xab\xa2\xc4\x0e\x8d\x13\xf1\x86\xa8\x6f\x60\x43\xdf\x0a\xb5\x30\x1b\xb7\xb6\xda\x45\x27\xba\xab\x27\xb3\xe5\x2f\x4b\x4c\x10\x3d\xe2\xee\x30\x41\xd9\x40\xe3\x04\x0d\x0c\x9a\xa6\x35\x41\x6d\xdc\xb6\x57\x33\x1a\x01\xf4\x72\x66\x77\xf3\x0e\x5c\xc0\xcc\x6e\x6d\xe3\xb6\xfd\xb1\x7c\x37\xef\x3f\x30\x37\xbb\x46\x33\xba\x8c\x46\x61\x12\xe1\xa9\x06\x6e\x37\x67\xff\x05\x17\x69\xfb\x83\x7c\xff\xb1\xf4\xd5\xbb\xb7\x86\x39\x71\x73\xf7\x80\x58\xf9\x15\xbb\x24\x87\x24\x96\xf6\x8e\x1e\x6f\x1b\xc4\xec\xd2\x22\x54\xba\x86\x7c\x78\x4e\xb8\x7e\x0b\x07\xe1\x20\xe7\xc9\xb4\xa0\x9a\x8b\xf6\x81\x0b\x78\xc1\x04\x9b\xcf\x9f\x3f\x7f\x3e\xb9\xae\x05\xbb\x62\x71\x31\x12\x80\x7b\xbd\x06\xa8\x11\x85\x94\xf8\xb3\xc0\x54\x26\x1b\x08\xea\x0e\xdf\xcc\xfb\x58\x4f\x79\xc0\xe3\x1b\x78\x0d\xa6\xf1\x91\x60\x66\x5b\xba\x15\x4d\xe5\x60\x85\x0f\xad\xe6\xf9\x70\x98\xd3\xe2\x17\x18\xeb\xa6\x55\x1e\x25\x8c\xa6\x58\x7e\x50\xd9\x0f\x9a\x23\x56\xf7\x73\xab\x5e\xca\x2a\xe8\x01\xfb\x2f\xb5\x2c\x0e\x61\x2f\xeb\xec\x5c\xf6\xda\x0e\x58\x63\x6e\x66\x01\xf0\xd9\x8c\x56\xe4\xd2\x5d\x72\x16\x93\xde\x41\x85\x93\xcd\x1c\x56\xae\xfb\x0f\xcc\x3b\x71\x6d\x62\xb8\x36\x31\x5c\x9b\x18\xce\x67\x62\xa8\x6e\xb2\x9c\xa2\xf0\x34\x09\x0b\xfa\x2f\x99\x1a\xa3\x54\x76\xaf\x26\x89\xf0\xeb\x15\x1f\xd7\x99\x67\x3d\x77\x21\x5f\x5f\xd2\xb4\xf8\x81\xe5\x05\x4d\xeb\x93\x52\xef\x36\xd4\x99\x39\x32\x07\x5a\x37\x14\xd3\x01\x9f\xa6\x51\x9d\x99\xe2\xde\x4e\x09\xb2\xa9\x23\x05\xf3\x79\x0d\x33\xef\xd5\xd6\x72\x21\xd3\xcf\xb5\x61\xe6\xda\x30\xf3\xcb\x1b\x66\xfe\xfd\xe7\x0f\x1f\x5e\xbf\x27\x87\x64\xe7\x89\x60\x6e\xb6\x88\x26\x7b\xf0\xe8\x4f\x79\x4c\x49\xce\xc9\x88\x92\x28\x4c\xa5\x98\x82\xd2\x94\xf0\x14\xbe\xe7\x20\x8b\xec\x8a\x8a\x3f\x84\x85\x78\xed\x5e\x51\x72\xce\xd3\x34\x44\x51\x0f\x34\x04\xcb\xa7\x5b\x2b\x38\x19\xb1\x9c\xf0\x8c\x9d\xb3\x34\x4c\x48\xc2\x23\x18\xae\x68\x03\xcc\x71\xce\x74\xcd\xdd\xb8\xd5\xeb\x10\xf1\xff\xed\xb3\xee\xd9\x86\xed\xae\xe7\x52\xe7\x96\x54\x0b\x18\x85\x23\xb8\x5f\xb1\x8c\x46\x72\x75\x51\xe4\xae\x4b\x80\xd7\x46\x83\x17\x20\xe7\xa0\xb3\x3a\xa7\xc5\x77\x7c\x9a\xc6\x2c\x3d\x3f\x02\x6e\xf9\x3d\x8d\x0a\xe9\x5d\x05\xb2\x02\xd1\xe7\x90\x67\x63\x9b\x6b\xc4\xe7\x0c\xd4\x1f\x86\x17\xf4\x83\x82\x51\x2f\x1a\xbb\x52\x19\x0a\x5d\xb2\x40\x74\x62\xec\x44\x22\x3e\x9e\x4c\x0b\x1a\x1f\x4b\x55\xc4\x15\x4b\x63\x7e\x25\x86\x77\x64\x7f\xb1\x55\x62\x76\x2f\x4e\xf5\x2e\x32\x32\xc0\x48\xe2\x52\x05\x9b\xa8\x30\xdc\xd4\x75\x82\xb6\x40\x95\x59\xd5\x2c\x70\xad\x38\x13\xa3\xc5\x07\xc7\xff\x01\x53\x12\xa7\xe8\xdf\x58\x24\x57\xc8\x8c\xf0\xd1\x23\x6b\xb8\x28\x0e\xe2\x29\x0d\xa0\x5c\xea\x1f\xcd\x6c\xc4\x67\x7c\x1f\x07\xb6\x29\x8d\x86\x80\xc1\xe5\x4a\x02\x2c\x4a\xba\xf9\x24\x61\x45\x2b\x68\x05\xed\x93\xed\x8f\xea\x57\x3b\x68\x9f\xf4\xf4\xaf\x8e\x12\x13\x99\xc1\x4f\xc2\x2c\xa7\x6f\xd2\xa2\xe5\x35\x7d\xf2\xe4\x63\x87\x00\x87\x65\xe0\xff\xdd\x04\xbf\x67\xe0\x6f\xd5\xe4\x2d\x4c\x14\x13\x4a\xe8\xd0\x24\x5b\x95\x04\x3e\xd0\x58\xff\x7f\x5a\xdb\xbd\xde\xe5\x55\x9b\x58\x25\x9b\x01\x79\x0c\xef\xeb\xa2\x2b\x2a\x93\x4d\x35\xf2\x36\x79\x4c\x82\xc9\x75\x3b\xb0\x30\xa9\xa2\xc7\x0c\x02\x16\x34\x74\xe9\x77\xf0\x18\x4e\x86\x7c\xf3\x3e\x56\x64\x62\xd1\x6e\xa7\x93\xfa\x3e\xff\x0d\xd3\x1c\x59\xd3\xfc\xb7\x3d\x0a\xf1\x28\x57\xdd\xfd\xdb\xed\x6e\x03\x13\x8d\x79\x7d\xc5\xfc\x2a\xdd\xa8\xe8\x07\x89\x08\x34\xdc\x23\x9b\x56\xeb\x72\x8a\xf8\x60\x6f\xcb\x2e\x04\xad\x09\x40\x3a\x68\xe7\xed\x9f\x87\xda\xd8\x47\xb0\x99\x40\x95\xcf\x84\x5a\x24\xdf\x56\x41\x36\x57\xd8\xe4\xa2\x4e\xf7\x5f\x05\x7b\xbb\xb1\x18\x1f\xf0\xca\xa2\x98\x75\x26\x9c\x29\x7d\x37\x6c\x9d\x20\x0e\x77\x14\x66\x75\x60\xaf\x3b\xb8\x0b\x81\x16\x40\xde\xc5\xec\x7f\x6d\xb5\xff\x20\xac\xf6\x0d\x4a\x80\xd1\x3e\xec\x05\xdc\xe3\x60\xb5\x0f\x92\x52\xc8\xe9\x6c\x36\x44\x9f\xcb\x7a\x33\xe0\xb9\x70\xa8\xd6\x7b\x20\x1f\xf1\x2b\xd7\x85\xe0\x80\x14\x19\x3b\x3f\xa7\x59\x0e\xe5\x38\x2a\x9e\x81\xe4\xd5\xe8\x5b\xd6\x5e\x05\x6b\xaf\x82\xcf\xbd\x1c\x34\x5e\xaf\xc6\xda\xc7\xa2\xbc\x14\xeb\x63\x62\xaf\xc6\xfa\x94\xac\x9d\x67\x7e\xaf\xce\x33\x77\xf7\xa8\x5a\x95\xfb\x8d\x68\xe1\x38\x61\x77\xf2\x6c\x81\xfa\x33\x5d\x5b\x00\xea\xde\x7c\x5b\xa0\xf5\x3f\x85\x73\x0b\xcc\x74\x11\xef\x16\x5c\x9a\x65\xdd\x5b\xf2\x22\x2c\xa8\x7c\x67\x49\xe3\x9e\x5f\x28\x99\xe6\x14\xb3\x3d\xe1\xe7\x82\xcb\x40\x33\x28\xe0\x03\x8b\xd6\xcd\x6a\x8b\xd6\x21\xcb\xf2\xe2\x2d\x9f\x42\xbe\xa8\x6c\x4a\x5d\xa7\x00\xc7\xda\x3e\x9d\x26\x89\xeb\x2d\xf0\x9e\x4a\x05\x2c\xcc\x58\x6b\x0c\xcc\x5c\xfd\xd0\xd3\x72\xc4\xc7\x17\x6c\x42\x74\x84\x75\x00\xb8\x1a\xd1\x0c\x87\xab\xf5\xfe\x62\x3a\x20\x9b\x44\x35\x2f\x4b\x2f\xc3\x8c\x85\xf2\xdd\x58\x61\x83\x8e\xc6\xb8\x76\x49\x85\x78\x21\x98\x01\xe3\x4a\x59\x0c\xde\x94\xcc\x77\x05\x3e\xc3\x23\x4a\xce\x5e\x29\x80\xba\x43\x96\xc6\xaf\xde\xbd\xfd\x51\x1c\xf7\x96\xbf\x8c\x4e\x62\x4b\xa8\x6e\x85\x02\xff\xc7\x87\xb7\x3f\xa8\xc7\x9c\x6d\x4c\x5c\x92\x44\xd8\x3e\x17\xa4\xda\xaa\x7e\xfb\xe9\xd3\x05\x5d\xa2\x16\xe9\x66\xed\x1e\xb5\x94\x57\x8a\x91\xbf\xae\xd0\x87\xc8\x0c\x9c\x86\xb9\xb4\xc3\xf6\x07\x80\x5f\xc4\x3f\xf4\xdd\xf4\x01\xb9\xb2\x94\xe5\xd8\x0f\x6b\x61\x6a\x84\x79\xbe\x64\xb2\x27\x45\x8e\x4d\x8b\x31\x57\xd5\xb5\x77\xd7\x97\x39\x47\x8e\x57\xcc\x4c\x6c\xc9\x47\x61\x36\xf9\x13\x1c\xa2\x55\xac\xca\x7c\xb7\x4a\x3d\xfa\x2f\xef\x55\xe6\xa2\x3d\xe6\x9b\xa8\x41\xfc\xad\x2d\xf2\x23\x27\x29\xa5\x31\x3e\xc0\x2c\xf5\xff\xd5\x88\xa6\x5e\xac\x13\x96\x93\x11\x8b\x63\xed\x95\x52\x87\xbf\x26\x5d\xd2\x3d\xa3\x46\x30\xcb\x2f\x8f\xc6\xcd\x6b\x48\xe3\x2f\xe5\x9b\x27\xdf\x2a\x8e\x73\x9e\x5e\xe9\x57\x2c\x06\xce\xb4\xc6\x4f\xaf\x04\xe7\x32\x99\xc0\x0a\x77\x0d\x7f\xab\x58\xe2\xe3\xe3\xf7\x1d\xc2\xd3\x88\x96\xb7\x75\x2c\xe0\x68\x0c\x1a\x70\x81\x0d\xa6\xb1\x82\x83\xfa\x99\x66\xc9\x8d\xd8\x7c\x4a\x58\x51\xef\x13\x66\x2f\x36\xf2\xe7\x80\x5a\x05\x17\xa7\x81\xb0\x94\x15\x2c\x4c\x2c\xe5\xfa\x25\x2a\x40\x95\xd6\x14\xb7\x55\x2a\x49\xec\x86\xc0\x3b\xea\x8a\xe5\xa5\xc0\x3b\x03\x0a\x02\xf5\x14\xb1\x95\xa5\x87\x90\x58\xa5\xbb\x61\xc8\x35\xcb\xbb\xd3\x49\x1c\x16\xf4\x27\xc9\x5d\xb7\x4a\x46\xf6\xa5\x94\x99\xba\x93\x5f\x58\x92\xbc\xa7\x11\x65\x97\x60\xd0\x98\xcf\xda\x0f\x1f\xbe\xe5\xa5\x98\xcd\x69\x71\x2c\x36\xc7\xf2\x4f\xb3\x9f\x21\x30\x78\x8f\x90\x34\x0d\xef\x15\x8b\x7f\x86\xb9\xcd\x81\x27\x08\xd8\x9a\x64\xf4\xf2\x27\xdb\xbd\x45\x39\x9b\xc8\x62\xeb\x55\xf0\xd5\xa1\xed\xf3\x69\x7d\x78\xf4\x88\xcc\xbb\xed\xb8\xf4\xee\xeb\x86\x4b\x97\x0c\x0c\x95\xac\xc9\x8c\x69\x3f\x1a\x85\xe9\x39\xa4\x7d\xb5\x5b\xc5\x1d\x2e\x02\x45\x83\x56\xba\xc9\x3f\xa7\xe3\x79\xce\x9b\x05\xea\x6f\xad\xfd\x2e\xec\x46\xe2\x5d\x93\xb4\xea\xb7\xd0\x1d\x6d\x4d\xb7\xfe\x94\x1c\x76\x85\x6a\xab\xa7\x86\x47\x58\xd3\x1b\x4c\x35\x30\xfb\x19\xa6\xb4\x96\x48\x86\x2f\x59\xce\x06\x2c\x91\xee\x9d\x52\x0a\x63\x25\x99\x2b\xdf\x7b\xf6\xb5\x27\xdb\x9a\xbd\x3d\x4b\x38\x2a\x8b\x7e\x76\xa4\xa3\xb2\x93\x64\x76\x86\x0b\xf3\xc3\x74\x50\x56\x17\x94\x0f\x43\xe3\x07\xe3\xc6\xbc\xa0\xf3\xb2\x1a\xff\xbd\x39\x32\x57\x38\x29\x3f\x7a\x44\x8c\xf4\xc8\xba\x13\xcb\x3e\xcb\x2e\x5e\x23\x8d\xb9\xb3\xef\x72\x85\xf9\x6a\xd9\x87\xf9\x13\xc1\x8c\x78\x7d\x12\xa0\xb5\x54\x20\xae\x69\x24\x25\xfd\x32\x75\x21\xb7\x1d\xaf\x83\x99\xe3\x98\xe5\x45\x3d\x97\x1f\xf5\x9c\x7e\xd1\x0b\x79\x46\xd7\xfa\x46\x57\x01\x81\xa2\xc5\x67\x6e\x5d\x40\xdf\xa3\xd9\x3b\x28\xd2\xd7\xdb\xfa\xa0\x5c\xaf\x3b\xc4\x9d\x6a\x46\x87\x0e\xbd\x19\x7a\x8c\xb3\x5e\x57\x20\x3a\x9e\xb8\x90\xc7\xf4\xc0\x81\xbb\xb5\x7b\x6c\x57\xd1\x1e\x5d\xd4\x96\x7f\xd5\x7a\x7c\x03\xe3\x38\xd3\xe5\x1b\x85\xb3\x15\x3e\xdf\x96\x81\x03\x8a\x05\x1f\xbe\xe3\xb7\x16\xa9\x7b\xee\x2b\x77\x4b\x7c\xb4\xf5\x35\xf9\xe5\xf5\x77\x3f\xbd\x3c\xfa\xdf\xe4\x5f\x2f\xdf\x93\x37\x3f\xfe\xf3\xf5\xd1\x87\x37\xef\x7e\x24\x5f\x6f\x99\xd6\xce\x13\x3e\x08\x13\x88\x36\xff\x35\x79\x45\x0b\x1a\x15\x64\x98\x51\xc1\xb9\x66\xe8\x10\x7b\x86\x20\x67\x60\x47\x42\xc4\xb5\xdb\xfd\x35\xef\x8a\x91\x09\x3a\x26\x60\xff\x0e\x00\xe2\xf6\xc1\x67\xe8\xb9\xfc\x7d\x48\x02\x24\xb6\x60\x3d\x28\x4b\xf5\x5f\x5d\x74\xa7\x81\xc7\xaa\xfc\x53\x7f\xab\xf2\xf7\x31\x3d\x1d\x34\xce\xed\x16\xc4\xef\xad\xa6\xe5\x69\x3d\xd9\x6e\xb7\xdb\xa5\xe5\xbe\x5b\x16\x20\xb1\x1a\x2c\x57\x93\xaa\xec\x76\x77\x5f\x1e\x0d\x96\x1f\xdf\x8c\x07\x3c\xa9\x33\xa5\x7f\x26\x91\x81\xfc\x9c\xd3\x98\x84\xb9\x38\x9f\x34\xa3\x69\x44\x73\x78\xc6\x8a\xcd\xe1\xd3\x9c\x9c\xfd\x08\x8f\xfc\x33\x12\x71\x60\x72\x0a\xb3\x31\x3f\xbe\xfc\x91\x1c\x92\x1e\xd9\x02\x2b\x4f\xdd\x56\xc1\xc9\x18\x52\x0c\x24\x34\x8c\xc5\x35\x1e\xa6\xb1\x78\x9b\xb0\x44\xfc\xb8\x1a\xb1\x82\xe6\x93\x30\xa2\xba\x9d\x8c\x7e\xc8\xd8\x98\x1c\x92\xad\xff\xfb\x9f\xfc\xf1\x6f\xff\xc9\x1f\xff\x75\xeb\xdc\x6b\x31\x46\xbc\x19\x84\x31\xc9\xd9\x79\x4a\x63\x32\xa2\xd7\x61\x4c\x23\x36\x0e\x13\x99\x9a\x51\x3e\x85\xac\x76\xdf\xe4\xdf\x85\xf1\x3f\x20\xc3\xf0\xd6\xff\x3d\xd9\x7c\xfc\xb1\x77\x7d\xd2\xdb\x7c\x1e\x6e\x0e\x3f\x3e\xfe\xeb\x16\xab\xe9\x83\xa5\x61\x76\xd3\xd4\x26\x02\x88\x36\x7b\x83\x93\xde\x76\x43\x5b\x3c\x2a\x1a\x87\xf7\x0e\xbe\x43\x4b\xfc\xa4\xb7\xf9\xcc\x6e\xea\xbb\x29\x4b\x8a\x4d\x96\x92\x31\x2d\x46\x3c\xb6\x37\xe8\x0a\x59\x0b\x12\x92\x98\x4e\x04\x1f\x97\x46\x37\x84\xa7\xe4\x2c\xe3\xbc\x38\x73\x4e\xce\x4f\xd2\x4c\xd5\xb2\x58\x35\x81\xfa\x8e\x78\x7a\x49\x05\xee\x9f\xc1\xd8\xce\xc4\xc8\x95\x6b\x75\x77\x83\x00\xcc\xdf\x30\x29\x2b\xfc\x39\xa6\xe2\xcb\xbb\x21\x39\xc5\x2f\x4c\x3c\x84\x9f\x74\x7b\xdd\x1e\xfc\x8e\xc2\x82\x9e\xf3\xec\x86\xfc\x10\xa6\xe7\x50\x32\x09\xb3\x70\x4c\x3e\x7d\x7d\x8b\x93\x07\x75\x35\xfe\x85\x6f\xe2\x88\xe6\x39\xc4\xfe\xfb\x1b\x52\xe6\x9c\x7c\xc2\xde\x6f\xc9\x7b\x59\x00\x76\xe3\x7a\x44\xe4\x6f\xf4\x3a\x1c\x4f\xc4\xfd\x03\xa3\x3b\xed\x16\x1c\x31\xb4\xb5\xdb\xdd\x11\x34\xfe\x6b\xf1\xd0\x39\xfc\x96\xec\x76\x77\xca\x30\xf8\x4f\xf7\xed\x9b\x1f\x4f\xff\xf5\xf2\x87\x9f\x5f\xdb\x15\xf6\xe8\xe6\xee\xce\x93\x72\x9d\x37\xe9\x50\xbc\xba\x6f\x6c\x58\x55\x56\x86\x0e\x76\xbb\x3b\x41\x79\x1c\x5b\x56\x2c\x07\x05\x0a\x0b\x61\x9c\x65\x25\x69\xc3\xe5\xa9\x70\x92\x97\x77\xd7\x25\x7a\x23\xe1\xb5\x26\xea\xa9\x93\x2e\xdb\xf3\xc0\x7f\x7c\xf9\xa3\x0b\x8c\xe4\xc3\x03\x06\xa3\x6d\xc9\xc2\xda\xe3\xe8\xc2\xff\xbe\x1b\x12\x5f\x0f\xef\x7c\x6d\xb5\x49\xdf\x8c\x8b\xa8\x29\x68\x5a\xd5\xc2\xc8\x2c\xe4\x05\xc1\xbf\xc8\x63\x12\x04\xa2\x0e\xfc\xb2\x87\xe7\xac\xc1\x57\x65\xd3\x6f\x7b\x0d\x80\xac\xf7\xd4\x58\x48\x9f\x3c\x76\x96\x46\x0d\x02\x47\x9a\xd1\x49\x12\x46\xb4\x85\xb4\xa6\x23\xfa\x57\xc6\xea\xcc\x1c\x68\x73\xba\xbb\x05\xcd\xd5\x22\x59\x8c\x43\x4b\x03\x83\x53\xb3\x3c\xc0\x36\x30\xf2\x1e\x2f\x9c\xb3\x87\x9f\xba\x79\xc2\x22\xda\xda\x69\x77\x4c\x97\x2f\xc8\x0e\xe9\x93\x7d\xac\xd4\x27\x2d\x43\xb2\xec\x36\xc9\x0b\xa0\xb5\x6a\x86\x6d\x30\x4f\x2e\xdd\x5e\x0a\xaf\xc4\x2b\xc0\xbb\x76\x56\x9b\xe2\x6d\x45\x4e\xaa\x2f\x27\x93\xef\xc2\xda\x3c\x4f\xbb\x7b\x5f\x38\xcf\x13\x0e\xef\x01\xe4\x79\xda\x5f\x65\x96\xae\xb9\x38\x36\x49\x98\xa1\xfa\xca\xd2\x42\xc1\xab\x21\x77\x23\xfa\x7c\x06\x6f\x65\x77\xe0\x75\x7d\x3c\xab\x81\x6f\xea\xca\x6b\xf9\x61\xfa\x47\xa3\x55\xce\xfd\x79\xae\x82\x25\x4f\x1a\x8e\x6b\xe3\x2b\xed\x54\x80\x36\x35\x6f\xa0\x1c\x3f\xcc\x63\x85\x3d\x95\xfe\x94\x15\xa0\xb3\x7c\x36\x11\xca\x0c\x8e\x27\x3c\x7b\x1b\xa6\x6c\x32\x4d\xc2\x82\xd7\x91\xa5\xed\x9d\xbd\x3f\xb9\xeb\xe6\x12\x43\xfb\x80\x29\xdd\x57\x32\x3c\x68\x6b\x9e\x21\x6a\x72\x53\xa2\x3f\xc6\xaf\x07\x4a\x5a\x20\x3d\x73\x6c\xeb\xe4\xfd\xc0\xb9\x7e\xcd\x13\x2d\x7a\x07\xb1\x6a\x12\x16\xec\x52\x69\x0c\x08\x89\x59\x3e\x49\xc2\x9b\x3e\x09\x86\x09\xbd\xd6\xc5\x61\xc2\xce\xd3\x37\x05\x1d\xe7\x7d\x12\x44\x14\x45\x7b\xf2\xdb\xaf\xd3\xbc\x60\xc3\x9b\x23\x74\x6a\x29\x7f\x17\x0d\x1d\x8f\x32\x96\x5e\xf4\x49\x4f\x15\x82\x33\x56\x9f\x3c\xd1\x05\xe8\xba\x64\x97\x0c\x21\xa7\xe4\x98\x25\x37\x5a\xd9\x7a\x33\xe1\xe7\x59\x38\x19\xdd\x74\xcd\x47\x1b\xfc\x58\x8a\xc8\x3c\xe0\xc9\xf5\x07\xfe\x9e\x8e\x5b\x3b\x3d\x2d\x6c\x19\xf0\x2c\xa6\xd9\xfb\x30\x66\x53\x31\xa5\xbd\xde\xff\xe8\xf1\xaa\x70\x26\x7d\x2d\xf6\x53\x5f\xa6\x39\xcd\x8e\x69\x42\x23\x31\x4b\x70\xf4\x93\xfa\x41\xf8\x07\xce\xdd\x2b\x75\x00\xd4\x62\x47\x98\x66\x17\xc7\x34\x09\x13\x5a\x14\xb4\x3b\x08\xa3\x8b\xf3\x8c\x4f\xd3\xd8\x17\xbe\x99\x2f\x32\x3f\x2f\xea\x0c\xbd\x23\xdd\xa5\xe3\xc9\x28\xcc\xd9\x7f\x41\xa8\x3f\xa3\x65\xd2\xeb\xee\x3c\x6d\xdb\x23\x65\xe3\x73\x33\xc0\x71\x78\xfd\x0b\x6e\x46\xb0\xdd\xb3\x96\xe1\xaa\xaa\x50\xed\x52\x10\x4e\x0b\x1e\x18\x91\x94\x31\xda\xbc\x8b\x9b\x14\xbc\x38\x19\x28\x58\xc4\xcb\x15\xed\xe1\xc0\x8d\x36\xcf\xa2\x33\xc2\x33\xf8\xe3\x98\x16\xe2\x75\x87\x55\x64\xa4\x34\x12\xa6\x24\x4c\x0a\x12\x16\x45\xc6\x06\xd3\x82\x6a\x03\x62\xd4\x0d\xd0\x98\x9c\xb1\xf1\xf9\x59\xd9\xe5\x2a\x14\x9b\x55\x67\x4e\x2b\xc3\x1e\x95\xc6\x58\x70\xd9\x2e\x61\x11\x4f\xc5\xc0\x0a\x7a\xad\xfd\xb9\x72\xc2\x52\x30\x32\x14\xfd\xbf\xbc\x0c\x8b\x30\x93\xb6\xca\x38\x8f\x30\x8d\xc9\x59\x98\x14\x67\xe8\xc9\x8b\xaa\xcb\x94\x83\x43\x32\x04\x96\x17\x00\x29\x97\x23\x16\x5f\xb1\xf6\xc0\x9a\xcd\xe0\x46\xd1\x5a\x6c\x7a\x43\x9a\x50\xcb\x40\x6d\x03\x58\x11\x39\x1e\xb0\x76\x16\xa7\x94\x84\xf2\xfd\x5e\xe5\x71\xd6\xe4\xdf\x24\xe3\x66\x35\xae\xd2\x97\x71\x59\x5b\xb1\xeb\x98\xef\xa9\x65\x9b\x40\xc3\x8b\x5f\x07\x1b\x53\x7a\x4b\xf4\x22\x73\xd0\x0a\x71\x64\x70\x43\x8e\x46\x6c\x02\x9b\xf9\x03\xcb\x0b\x41\x3d\xdf\x44\xf0\x68\x96\xfa\x0c\x83\x1e\x80\x46\xe5\x4d\x39\x52\x9d\x2d\x8a\xa1\xc3\x69\x22\xba\x41\x0e\x12\x6d\x5f\xa1\xc7\xd0\x04\xfb\xd3\x4a\xcc\xdc\xea\x57\xf4\x47\xf3\x3b\x25\xcd\x88\x96\x1a\xf3\x07\xc7\x02\x01\x0e\x81\x3e\xc0\x9c\x17\x68\xf7\x81\xa0\xaf\x19\xbc\xbb\x15\x2a\x83\x5a\x39\xa7\x24\x24\xaf\xde\xbd\xd5\x6a\x50\x2e\x00\xec\x94\x0c\x6a\x74\xaa\x68\x49\x0f\x4b\xbc\xff\xef\x86\xb2\xd0\xc6\x4a\xd1\x16\xc2\x66\xba\x0b\x6a\x18\x68\x7b\xd3\xc5\x7a\x3a\x74\xb0\xc2\xac\x07\xeb\xab\x1c\x17\x05\x57\x2c\x81\x20\x28\x6c\x1c\x9e\x53\xcb\xf5\x70\x7c\x0e\x74\x7c\x61\x37\x8f\x33\x71\x75\xe5\x67\x15\xe4\xba\x86\x4a\x03\xfc\xc2\x18\x25\xc9\xed\xdc\x9d\x64\xd1\x52\x5d\xc0\x85\xb4\x48\x2f\xc7\x74\xd6\x9d\x83\x6e\x14\x9a\xbd\x43\x2a\x61\x07\x22\x15\x57\x6d\x08\x9a\x12\x19\x67\xdb\xb0\x10\xf2\x14\xeb\x4f\xf2\xb7\xf3\x59\x1c\x50\xa9\x26\xb6\x80\x44\xa9\x06\x93\x34\xc8\x85\xf2\x14\xe1\x25\x42\x55\x09\x7d\xe4\xb7\xad\x55\x53\x2e\xb8\x2a\x55\x60\x0a\xbd\x34\x84\x2a\x50\x00\x80\x15\xfa\x2b\xfc\xd2\x9f\xb2\xc8\x7c\xc8\x22\xab\xf8\x98\x16\xf6\x97\x63\xaa\xfb\x5b\x50\xf1\x6d\xc2\x77\x83\xd4\x26\x90\xeb\xac\xff\x14\x33\xf6\x63\x7a\x97\x96\x04\x0a\xd5\xc4\xc5\x0f\x35\x47\xd0\x8a\x8b\x19\xc1\x1f\x59\x24\xff\x39\xa6\x85\xd6\x8e\x3b\x61\x31\xd5\xb8\xad\xa7\xa9\x19\xaa\x1c\x5a\x57\xd0\xd2\x8e\x72\x52\x70\x84\x03\xae\x32\x5d\xc1\xdb\x2c\x6d\xc7\x45\x89\x47\x8f\xc8\x57\x62\x91\xe5\xbf\xc7\xb4\x68\x77\x5c\xdc\xd2\x52\x49\xcb\xa0\x02\x83\x96\x4a\x09\xa9\xdd\x9e\x1d\x4f\xb1\x1a\xab\x4c\x48\x0d\x67\x1c\x5f\x59\x51\x35\x04\x8c\xaf\x06\x65\xf9\xbf\xc2\x84\xc5\x4a\x07\xee\xf4\xe9\x19\x8c\x94\xfa\x6d\x5e\xd3\xaa\x51\xba\x8b\xd4\xf5\xce\x96\x36\x73\xb1\x4d\x4c\x7c\x95\x7d\xc2\x53\x5a\x35\xda\x0e\xf9\xe4\x5c\xae\xe5\xd1\x6a\x1b\x31\x3b\x08\x8b\xd3\x99\xdd\x9e\xa5\x50\x36\x31\x2f\xc4\x8e\xfe\xf6\x9b\x3c\x26\x6a\x79\x9a\x46\xeb\x06\xb2\x64\xe3\xf3\xa0\x33\xcb\x78\x00\x38\x6e\x8b\x5e\x01\xd9\x2d\x9d\xd1\x3e\x71\x0f\xa7\xbc\x01\x9c\x43\x6e\x2d\x87\xc2\x58\x36\x3e\x97\x2f\x1d\x4d\x3e\xda\xc6\x00\x73\x7e\x73\x0d\x87\x44\x61\x7f\x75\xd3\x2a\x0d\x03\x37\xc3\x0d\xe2\x6e\x29\xf6\x51\xe6\x2d\xdf\x05\x76\x4c\x6f\xa5\x44\xa2\xe9\x65\xf7\xc7\x77\xaf\x5e\x9f\xbe\xfe\xf1\x5f\x80\xdf\x7f\x99\x64\x3c\x9e\xc2\x55\xf0\x17\xf2\x42\x7b\x5c\x7d\x9a\x9b\x65\x73\x82\x00\x3c\x1c\x2e\xe8\x2e\xf1\x26\xfc\xfa\x8b\xc6\x9c\xb8\x27\x2e\xcc\x5b\xe9\x79\x5e\x97\xeb\x47\x58\xc5\x23\x6c\xf1\x47\xd0\xc6\xed\xac\x9b\x0d\xbd\x0b\xad\x7b\xba\xf1\xcc\xb4\x17\x69\x4e\x5e\xe5\x8d\x03\x9c\xbb\x41\x8b\x1d\xf8\xa3\x3d\x52\xe6\x5d\x03\x8b\x0b\x5a\xc9\x26\x29\x4e\x6a\x25\x1b\x84\xdc\xd8\xaa\x9a\x12\x1c\xdd\xec\xd6\x04\x7c\x9b\xf4\xc9\xa7\xdb\x03\x75\x75\x54\x58\x73\x59\x84\x1d\x82\x4a\xc3\x33\xa2\xc1\xb8\x4a\xea\x17\xcc\xb0\x50\x8e\x2c\x58\x8d\x14\x4e\x5c\xf0\x76\xca\xb0\xbb\x80\xdc\xb6\x5b\xf8\x67\xbb\x51\xf7\x36\x8f\x45\xd1\x6e\x95\x41\xd1\xd3\x2f\xa9\x1b\x6c\x48\xf4\xe1\x28\xec\x88\x32\xbf\xea\x86\x79\xce\xce\xc1\xd3\xd6\x78\xd3\xa0\xe1\x66\x9b\x7c\x32\xae\xde\x8c\x1c\x92\xed\x03\xc2\xc8\x37\x25\x77\xef\x03\xc2\xc0\x81\x1b\x4d\x5c\xf9\x34\x83\x70\xa4\xc6\x75\x9b\x7d\x3c\x30\xed\x5c\xd0\x1b\xc2\x52\x09\x26\x2a\x09\x76\x4d\x0e\x65\xa2\xfc\xab\xbb\xa3\x30\x7f\x77\x95\x2a\x7c\xc3\x9d\xc0\x2a\x1d\xd1\x82\xe0\x78\xa5\x75\xe9\x89\xf4\x14\xc7\xaf\xf0\xeb\x80\xdc\xc2\xff\x49\x2e\x09\xe1\x0e\xc8\xed\xe7\xc8\x3f\x72\x7f\x6a\x3d\x88\x02\xfe\x36\x9c\x4c\xa4\x19\x76\x95\xde\x72\xaf\xf7\x79\x73\xa0\xd4\xbd\x2e\x45\x17\xb0\x51\xb9\x42\x0b\xdc\x04\x71\xbc\x6f\x0f\x6c\xa4\x62\x30\x00\x85\x07\xa2\x46\x97\xa5\x31\xbd\x7e\x37\x6c\xb1\x36\xf9\xf6\x90\xf4\xda\x10\x66\x8c\xa5\x53\x7a\x80\x96\xd0\x73\x21\x0b\x0c\x80\xb5\xed\xca\x12\x5f\x98\xc0\x16\x3e\xf8\x15\xd0\xb2\x8c\x24\xf6\xec\xdc\x98\x08\x2d\xe5\x52\xd0\x21\x96\xc7\x94\x1a\xfa\x57\xfa\xb3\xed\x7a\x60\x03\x02\xce\x8e\x32\x7e\x05\x09\x35\x04\xc6\x60\x52\x8d\xbf\x1c\x85\x69\xca\x0b\x22\xc6\x4d\x42\xe4\x84\x49\x98\x93\x50\x1f\xc8\xbf\xb4\x01\xa5\xed\xa1\xd5\xfa\x6e\xb5\x72\x9a\x0c\x3b\xd0\x98\x1e\x9a\x28\x72\x7b\x7f\xaf\x0c\xd7\xe4\x10\x20\xd6\xc0\x28\xcc\x31\x9c\x28\xf8\x1c\x81\x53\x13\xcb\x69\x4c\x36\x49\x3e\x9d\x80\x5f\x82\x0d\x21\x7a\xa0\x31\x0e\x4d\x2e\x22\xcc\xe0\xd1\x23\x6d\x33\x04\xbf\xc5\x05\xfe\x17\xc4\x93\xbf\x08\x2a\x53\xfa\x66\x66\x49\x5e\x60\x71\x9f\x88\x11\x7b\x9b\xa1\x02\x63\xb4\xf2\xe9\x00\x78\xa9\x0e\x0e\x0b\xfe\x56\x53\x95\x8d\x9b\x0f\xf8\xee\xd0\x5d\x88\xd1\x79\x1f\x65\xda\x99\xea\xad\x39\x16\xb0\x82\x68\x67\x34\x87\x64\x2f\x90\xed\x84\xa2\xe8\x76\x40\xa1\x32\x0a\x69\x55\x17\x1d\xd0\x80\xfc\x85\x3c\x26\xa5\xb1\xc0\x52\xa9\xd1\x1b\xfc\x35\xa4\x58\x3a\x80\x5a\x03\x74\x86\x6b\xaa\xc0\x1b\xda\xec\x7c\x1f\x0e\x19\xd8\x78\x98\xc5\xb1\x2d\x6f\xc0\x03\xab\x43\xae\x32\x56\x58\xa6\x38\x26\x62\x83\x2e\x13\x68\xd6\xc6\x73\x66\x2f\xae\x1c\x5f\xee\x46\x76\x7f\x51\x5d\x5e\xb3\x41\x66\x6c\x56\x70\x8d\x43\x0b\x44\x6b\xd9\x2f\x55\xfc\x50\xd9\xbc\xfc\xed\xdc\x50\x48\x34\xcc\x53\x58\x82\x0a\x02\x02\xdf\xba\xe3\x70\x62\x45\xab\xb8\xf0\x2c\x8c\xc4\xf9\xbf\x80\x70\x22\xb7\x6d\xa3\xf3\xb3\x2f\x06\x47\xa1\x77\xf6\x8d\x97\x50\xe8\xdb\x33\xa9\xc2\x12\xc7\xf4\xec\x9b\x98\x5d\x7e\x7b\x66\xeb\xb2\x20\x9a\x0f\x64\x1a\x42\xa7\x2f\x71\xbe\x94\xf2\x6b\x14\x5e\x32\x9e\x09\x68\x54\xfa\x81\x3d\x2e\x39\xd3\x3c\x0f\xaa\xd3\x2a\x65\xfd\x55\x99\x4a\xc2\x14\x54\xc7\x76\x8c\x46\x5a\x10\x3e\x74\x06\xfd\xed\x99\xa5\x28\xe9\x90\x62\x14\x16\x24\xcc\x28\x29\xf8\xf9\x79\x02\x4a\xc5\x14\xf5\x79\x60\xc2\x0a\x16\x9e\x37\xd8\x5c\x42\xc3\x4b\xda\x45\x41\x70\xc5\x2a\x80\xce\x8f\xa5\x60\xfe\x8c\x91\x8b\x58\x64\x7b\x3d\x4a\xe1\x62\x2e\xd5\x9c\x19\x45\x7b\x55\x50\x1e\x4d\x32\x1a\x82\x56\x67\x0c\x87\x6f\x7a\x3e\x12\x88\x77\xc3\xa7\x30\xb4\xab\x4c\xde\x75\x7e\xd7\xdf\x9e\x91\x50\x2e\x26\x28\x55\xf9\x34\x23\x67\xdf\x7c\x1f\xc6\xf4\xdb\x33\x22\x4d\x51\x2b\x15\x83\x15\x8b\x97\xf2\x98\xba\xc2\xf0\x97\xe2\x54\x5c\xd2\x94\x09\xea\x08\xc3\xc7\xd5\xc2\x0c\x58\xb9\x38\xec\x31\xcb\x21\x1b\x96\x4a\x12\x69\x92\x47\x61\x13\x2a\x50\x93\xea\xba\x4b\x7e\xe4\xe0\x2d\x18\xaa\x35\xba\xc1\x79\x31\xa9\x33\xe5\x97\x34\xcb\x50\xfb\xab\x51\x28\x17\xdb\x88\xed\xf1\xd4\x8a\xf1\x64\xa4\x58\x1f\x2c\xb7\x04\xa3\x06\x96\x9e\x22\x55\x93\x1d\x70\x9e\x74\x96\x9d\x2b\xc6\x6f\x7c\x48\x53\x6d\x48\x1b\xe4\xcd\x74\xd1\xa9\x3a\x11\x2a\x73\xd9\xc2\x6a\xa7\x3a\xff\x5c\xe5\x64\x6b\x73\x1a\xe1\x5c\xed\x6d\x55\x91\xc4\x94\xb7\x2a\xc4\x24\x22\xc0\x4d\xb2\x4b\x2a\xfd\x2f\x73\x34\x2c\x47\xb5\x6f\x98\x13\x06\x0e\xd3\x14\xc3\xe0\x75\x2d\x35\x3c\xcb\xc9\x39\x4d\x69\x06\xe1\xc5\x62\x9e\x52\x41\xb9\x30\x25\xfc\x99\x2d\xe4\x3d\x23\x23\x7e\x45\x2f\x69\x26\x78\x3a\xd0\xc4\x85\x39\x68\x97\xc3\x54\x35\x8b\xad\x62\x97\x10\x13\x54\x8a\x5d\x46\x82\xdb\x49\x04\x35\xb8\x41\xde\x02\xf3\xde\x28\x03\x82\x82\x84\x91\x78\xe0\x08\x7e\x47\x69\xff\xc4\xed\x27\xee\x37\xdb\x6a\xe0\x0d\x12\x8f\x98\xfb\x7e\xba\xee\x34\x81\xa2\xe5\x00\x2a\x28\xb4\xb6\xbc\x20\x67\x00\xf5\x7d\x28\xae\xd4\x9b\x33\x6c\xb3\xe0\x40\x88\x88\x98\xd8\x0d\x36\xd3\x11\x3f\x70\x8a\x3c\x15\xeb\xa8\x88\xa9\x74\x09\xb2\x87\xf4\x37\xb8\xe0\xbf\x57\x2f\x35\xa8\xdf\xc7\x74\x71\xda\x23\x75\xf3\x5b\xa7\xc0\xa5\x5c\x72\x34\xd5\x5b\x2f\xee\x37\x7d\x79\xcd\xf1\x8c\xee\x94\x5a\x35\xbe\xc0\x56\x31\x0e\xd3\xbb\x31\xa1\xec\x40\x39\x3a\x29\x6f\x85\x0f\x35\xd7\x82\xd1\x81\x8f\xc3\x34\x3c\xa7\xe2\x9a\x9c\x75\x2d\x89\xf6\x58\x4a\x42\x92\xb0\xbc\xe8\x92\x1f\xd8\x05\x45\x02\x5f\x71\x01\x18\x1d\x5b\x55\xf7\x1d\x81\xb4\xa1\x68\x0f\xc3\x67\x8d\xc3\x68\xc4\x52\xd4\x68\xc2\x78\xd4\xb5\x02\x2e\xcf\xca\x1f\x66\x9a\xea\x9f\x82\x3f\xd5\xe3\x82\x83\x2c\x1a\x2b\xd8\x98\x2a\x17\x0c\xc1\x77\xb3\x98\xa2\x86\x54\x5e\x3a\x64\x40\x13\x7e\x25\xcf\x06\x0c\x5a\x5c\x4a\x67\xe4\xe8\xf8\xd8\xbe\x12\xc1\xa3\x6a\x40\x87\x3c\x83\xd6\xc8\x4b\x81\x95\x74\x9c\x03\x0e\x29\xcc\x17\xc4\x26\x8e\x8d\xb6\xfb\x03\x8f\xf9\x0f\x2c\x2f\xa4\x46\x36\x45\x26\x41\xcc\x53\x5e\xe1\xa2\xa5\x70\x5a\x70\x41\xb4\x22\x38\xab\x83\x9b\xba\x5b\xdb\xb0\x27\xd3\x9c\x92\xd3\x30\xbd\x39\xf5\x16\x58\xb4\x66\x45\x52\x48\x81\xcb\xa9\x58\x67\x71\x38\xc1\x22\x27\x42\xa7\x11\x51\xef\xec\xec\xec\xd7\xfc\x1a\x76\x73\x3c\xe1\x99\x9d\x43\x02\xea\xe1\x02\x04\x98\x15\xd1\xcf\x85\xb8\xe5\x01\x07\x07\xb2\x55\x7c\x16\xe9\x65\x50\x62\x0c\xcc\xbc\x68\xf2\x55\x7c\x12\xb0\xc4\x66\x8e\x2d\x6d\xf3\xd7\xa8\x81\x81\xc7\x0c\x96\xaa\x32\x37\x14\x1b\x43\x03\xc1\x93\x60\x44\x93\x84\x07\x1d\x12\x5c\xf1\x2c\x89\x51\x23\xca\xa2\x0b\xf1\xc7\x98\x06\x1f\x6f\xb1\xba\xfc\x07\xdd\x37\x5f\xc6\x71\xcb\xea\x0c\x06\x22\x5e\x15\x60\x74\xa8\x7c\xb5\xd1\x6d\x17\xba\x51\xe1\xe1\x4e\x54\x0d\x22\x76\x76\x3c\x29\x5a\x01\x3a\x66\xe7\x7c\x4c\xc1\x2c\x2b\xd0\xa3\xfd\x88\xce\x2c\xa4\x1c\x7f\x81\xc8\xa1\xeb\x0e\x6f\x15\xa8\x33\xc8\xf7\x80\x65\xe2\x85\xad\x07\x9a\xd0\xe6\x61\xa2\xa7\x84\xe9\x58\xc1\x42\xf8\xfe\x88\xb6\x58\x87\x6c\xd7\x0e\xcb\x1b\x95\x3f\x28\xdb\xef\x1d\xeb\x2b\xdf\x0e\xb3\x28\xc0\x63\x9b\x9f\x84\x7c\x33\x98\x16\x05\x4f\x09\x4f\x8f\xc4\x9e\x1c\x7e\x6a\xb5\xc9\xe1\xb7\xb6\x27\x2d\x6c\xc5\xed\xb7\x2f\xe3\x98\x88\x6e\xbf\xd9\xc2\x1a\x6e\x2b\x3e\x52\xdb\x1f\x09\xf9\x54\x5a\x07\xf1\xae\x68\x89\x3f\x3b\x84\x41\x87\x2d\xb7\x06\x21\xc0\x8a\x5a\xf1\x5c\x2e\xe8\xcd\x21\xac\xc0\xed\xb7\x3e\x68\xc5\xb4\x74\xcf\x50\xe3\x53\x40\x82\xdb\xaa\xcf\xb3\x67\xaf\xf7\xb8\xaa\x5b\x5c\x63\x01\x50\xd9\x78\xd5\x4a\xa9\x4f\x55\x03\xfe\x66\xcb\x9d\xb3\x07\xd0\x6e\x3b\x73\xf8\xc6\x3f\xe4\x16\xb8\xdb\xbe\x83\x27\xb7\x92\xb8\x48\x82\x60\xb8\xaf\xaa\x0b\x88\xc4\x9c\xe6\x40\x9e\x50\x74\x0d\x4c\x98\xe6\xe9\xf4\x2b\xec\x2b\xd1\xd2\xeb\xeb\x30\x2a\x92\x1b\x72\x3a\xe2\x57\xa7\xf2\xfe\x81\x83\x24\x2b\x50\x60\x82\xa6\x13\x45\x8b\x2d\xae\xad\x81\x6a\xe6\x5d\xe4\x9f\xc6\x34\x4c\x0d\xb7\x31\x66\xd7\x70\xd9\xa0\x3b\xa6\x9d\x76\x36\xca\x78\x9e\x93\x98\x0d\x41\x32\x53\x88\xb6\xf4\x40\x80\xb6\x6e\xe1\x3d\xef\x53\xd3\xd9\x71\x45\x8d\xe8\xc4\xab\x3b\x33\xa6\xa8\x07\xaf\x4c\x45\x20\xee\xff\xb5\xd6\xab\xfb\x72\x32\x0c\x19\xe4\xd5\x55\xe1\x0c\xb6\xb6\xc8\x1b\x19\x30\x47\xb3\xbc\xf9\x88\x4f\x05\x7b\x86\x91\x6f\x94\x27\x76\x47\x7b\x52\x16\x82\x57\xc6\x97\x8d\x76\x8d\x53\x51\x3e\x1b\x24\x61\x32\x74\x91\x37\x45\x94\x0f\xe2\x37\x6f\x3e\x6a\x8c\x33\x62\x4d\x5d\xd0\x1b\x0c\x74\xd5\xd1\x19\x73\xfe\x01\xb0\x99\x6b\x88\x11\x4d\x33\xb1\x93\x9e\xe0\x16\x94\x16\x76\x19\x24\x91\xb1\x7e\xb7\x9d\x80\x4f\x6a\x91\xdc\x70\x10\x52\x8a\x5e\xd1\x43\x5b\xc7\xb7\xb4\xc0\x4b\xc3\xf4\x0a\xbc\xc0\x8f\xa7\x2e\xf9\x36\x33\x07\x42\x68\x47\x0b\xf0\xcc\x62\x94\x76\x41\x46\xb2\x10\x54\xb3\x3c\x7e\x42\x62\x9a\xd0\x82\xea\x8a\x27\x26\xb4\x2b\x31\xb4\xff\x93\xf5\x74\xd7\x5d\xdc\xea\xc8\x15\xca\x46\xc4\xd9\x32\x3f\x98\xaa\x69\x61\x8e\x55\xf7\x4c\xc3\xac\x0d\x77\xf8\x61\x35\x6d\x2b\x90\x89\x86\x74\xa3\x6f\x39\x51\x15\xca\x38\x85\xcd\x76\x2d\x6c\xc2\x02\x2f\xd0\x97\x59\x98\x5b\x6b\x09\xd5\x05\xa9\x83\xe4\x38\x06\x37\xd2\xaa\xc7\x8d\xfe\x60\xa2\x4d\x54\x45\x5c\x61\x69\x39\xbc\x84\x16\x26\xc0\xd8\x65\xfa\x21\xd5\x74\x80\x5f\x03\x27\xee\x83\x0e\xb1\x50\x55\x01\xdd\x29\x5c\x78\x19\x61\xa1\x12\xfc\x9a\x01\xcf\x43\xdc\x1d\x17\x7f\xa9\xad\xb7\x56\xe2\x14\xc3\xe3\x48\x03\x19\x8f\xf8\x58\xca\x02\xb5\xed\x47\x78\xe6\xed\xdd\xf3\x3e\xf9\x5e\x89\x3a\x2e\x52\xe6\xe5\x16\xff\x44\x58\xfe\x56\x3e\x1d\xfa\x32\x86\x14\x2e\x0e\x8d\x55\x24\x20\x99\xe1\x1a\xe8\x9f\x60\xba\x75\x02\x95\x21\x3b\x27\xd3\x34\xa1\xb9\x78\x7c\x0b\x56\x4a\xdc\x44\xe2\xa9\x24\xd9\x77\xe8\x63\x63\xe6\x9c\xa4\x05\xa2\x3d\x17\x7b\x31\x27\x96\x69\x9a\x92\x74\xe6\x15\x91\x9b\xc9\xb7\x64\x87\x3c\x7a\x64\x29\xef\x76\x30\x3d\xb8\xf6\x10\x24\x2f\xdc\x8f\x7d\x2b\xfa\xd0\x81\x13\x98\x19\x8a\x4e\xc4\xff\x8a\x26\x50\x54\xfe\xc2\x29\xed\xdb\x18\x8f\x65\x72\x9d\x1a\xa7\x5b\x8a\x13\x67\x4f\xbc\x3e\x88\x9c\xbb\x2f\x4a\x2b\xba\x40\x77\x7e\x18\xb4\xca\x6e\x4b\xb1\xd2\x52\x7a\x5d\x38\xa1\xc9\xea\x82\x3a\xe1\xbe\xd0\x4b\xef\xbe\xb0\x38\x50\x45\x9b\x0e\x34\xbc\x68\x7c\xf1\xfb\x45\x0f\xa9\x44\x9d\x3d\x7a\x5e\x6e\x6b\x4c\xb3\x73\x6a\x97\xe4\xed\x96\x3f\xe8\x4e\x69\x58\xaa\x79\x5b\x4a\xaf\xbb\xee\x0e\x79\xf6\x3a\x8c\x46\x2d\xe7\x86\xf5\xae\x52\x38\x2e\x87\xfe\x95\x61\x5d\x71\x5f\x59\xa4\xd0\xb5\x95\x94\xc4\xb0\x5d\xba\x19\x17\xa6\xe2\x32\x2a\xce\x1d\x88\xf8\xad\xd3\xf9\x28\xcc\x7f\xca\xe8\x25\x39\x54\x5a\x71\x7f\x25\x0f\x5c\xe0\x1f\x91\x60\x49\x60\x7f\x91\x9d\xa6\x75\x4b\x60\x8f\xe7\xb6\xea\xdc\xb7\xe8\x6e\xff\x03\x8a\xae\x9c\xb0\x6b\xa5\x65\xd4\xed\xb4\xc1\x5a\x56\xff\xd4\x61\xa9\xf4\x08\xb6\xb6\x90\x7f\x66\x39\x28\xd4\x5a\x8a\xa5\x6b\x5b\x1b\xa6\xe6\xf3\xe8\x11\x69\x7d\xa5\x56\xe2\xb7\xdf\xcc\x60\xda\x5e\xfc\x3d\xf1\x94\xe6\x09\xed\x26\xfc\xbc\x15\x50\x13\x8a\x4b\x20\x8b\x86\x73\x10\xc4\x9d\xce\x3d\x5c\x90\xd6\xf5\xb5\x53\x7d\x7f\xe1\x59\xc0\xf3\x5f\x77\x51\x56\x54\x95\x31\xc7\x4c\xdd\xaa\x6b\xb0\xbc\xd8\x3c\x89\x49\x4b\x0a\x5b\x55\x15\x6d\x13\xfb\x95\xb5\xe2\x6a\xbd\xc5\x3e\x9a\x05\x77\x56\xc3\x5f\x71\x29\xdd\xf4\x17\x7c\x89\x25\x87\xa5\x04\x95\xa4\x35\x1b\x3b\x9a\x94\x9a\x91\x54\x37\xa3\x0e\x2d\xb6\x65\x68\x40\x0f\x73\x17\x3b\x26\x37\x20\xa9\x83\x5b\x33\x09\xf3\xa2\xa4\x86\x32\x5d\xe9\x35\xa9\x5e\x92\xb9\xce\x80\x1f\x34\xcb\x5f\xaf\x69\x2a\xc7\x5d\x5e\xb1\xbb\xa1\xe9\x6c\x54\x55\xe8\x5a\x3e\xa1\x3e\xd4\xf2\x08\x7c\x27\x24\x76\x11\xd9\x6c\xfe\xad\xba\x28\x7c\xb1\x56\xd5\x53\xa0\x3d\xcf\xe5\x2d\xdd\x1b\x0f\x6b\x83\x2c\xce\x0c\xa4\x68\x64\x8b\x26\x8e\xa2\xef\xe1\xe1\x8a\xd5\xbd\x80\x8b\xb2\xd4\xc0\xea\x88\xf6\x75\xd6\x33\x56\x28\x42\xdb\xa5\xc2\x6e\x0d\x9d\x27\x48\xf9\xca\xae\x64\x17\x10\x52\x3e\xbb\xa4\xa3\x0d\x30\x42\x07\xe5\x0f\xb0\x6d\x55\xe5\xd7\xac\x38\xf0\x33\x6f\xcc\x8e\xd2\x77\xe4\xaf\x95\xb3\xbc\xa8\xda\xb7\x78\x81\x71\x28\x11\x48\xce\x13\x71\xc6\xda\x6a\xd9\xb7\xb7\xe3\x33\x03\xc7\xf9\x18\x12\x59\x8c\xbe\xad\xf2\x2f\x31\xf7\x55\x7a\x97\x92\x31\x3a\xba\x39\x55\x60\xe1\xc2\x36\xf1\xa6\x0e\xda\x48\xfa\x6d\x7a\x5a\x1e\xfb\x67\xa5\x89\x64\x69\x9d\x4a\x31\x6a\xe4\x5f\x27\x3a\x70\xcb\xc7\xfb\x31\x8b\x7c\xf6\x10\x03\xde\x7c\x87\x52\xd4\x3a\x73\xba\x27\x5f\x38\xe0\x0d\x0e\xef\x21\x04\xbc\xd9\xff\x83\x07\xbc\xf9\xfc\x31\x69\xee\x35\xc4\xce\x3a\xe0\xcd\xef\x2b\xe0\xcd\x67\x89\x5e\xb3\xf2\xf8\x2b\x61\x1c\x5b\x29\x24\xf2\x49\x18\xb1\xf4\xbc\x3b\x4d\x59\x41\xbe\x26\x3b\xea\x8e\x0f\x1e\xf5\x05\x3b\xbe\x09\x57\x6e\xd0\xb7\x78\x59\xd9\xc0\x77\xbc\x28\xf8\xb8\xa6\x99\x5d\xe7\xb5\xb3\xda\x20\x1d\xbf\x83\xf0\x02\x9e\x03\xf5\x51\x98\xc5\x32\x40\x8d\xef\x45\x3d\xaf\xbb\x74\xbd\xab\xf4\xb2\x7e\xc3\x95\x0e\xc3\xca\xb9\x77\x2e\x5e\x11\xad\x53\xe6\xf2\x4c\x9c\xd7\x39\xd8\x38\xab\x1a\x17\x46\xf4\x58\xb4\xd6\xf0\xf3\xbb\x2d\xfe\x1e\xbc\xbb\x6c\x1f\x9d\xbb\x3a\xdd\x58\x8b\x0d\x9e\x37\xd6\xef\x7b\x72\xbf\x79\xbe\x52\x3e\x73\xa6\x3f\x8d\x7c\xa4\xb2\xa8\xee\x6a\x7d\x6a\x98\x06\x0d\xdb\x74\x31\x68\xa0\xcf\x77\x2f\xd0\xe2\x15\xc6\xc6\x90\xf4\xc1\x4e\xb3\x6f\x7d\x69\xc5\xe6\x6f\xe7\x72\x00\x94\x30\x93\x33\x18\x11\x58\x35\x82\x0e\xb1\xeb\x1f\xd4\xf8\x74\xb9\x5d\x96\xa2\x63\x3f\xef\xfd\xae\x19\x51\xc4\x03\x37\x95\x64\x0d\xe2\xec\xd7\x80\x37\xe1\x8e\x0b\xe9\x72\x3d\x5a\x3f\x5f\xc7\x04\x3e\xaf\x81\x6f\xe2\xfd\xbc\x96\x4d\x0b\x26\x39\x50\x5d\x77\xdb\xbd\x2a\xe8\xc6\xce\xac\x46\x8d\x8b\x56\x9d\xfa\xbf\xb6\xdf\xed\xd9\x75\x9b\x46\x51\xdf\xa1\x6e\x57\xd9\x5b\xd4\x0e\xa1\x0c\xda\xd4\xa3\x6e\xee\x7e\x1d\xcc\x54\xae\x95\x3a\x26\xfa\xb9\x0b\xe9\xa4\x7f\xa8\x7b\xc4\xec\x36\xd4\x99\x39\x32\x07\xfa\xa1\xc5\x78\xfc\x11\x53\x85\xde\x2d\x82\x22\x34\x32\x4f\xe8\x44\x96\xbf\xa2\x79\x44\xd3\x38\x74\xb5\x9d\x76\x79\x8b\x26\x1d\xa2\x3d\x37\x55\xf4\x66\xf4\xbb\x53\x8e\x4e\x10\x7d\x04\x8a\xba\x93\x30\xa3\x69\xf1\xa3\xa5\xe2\x92\xeb\x46\xd1\x2f\x4b\xd6\x04\x8d\x4c\x65\x27\x76\x0b\x2a\xc2\xb3\x6c\x02\x84\xfb\x77\x62\xd3\x8d\xc0\x77\x31\xd7\x71\xdc\x96\x25\x7d\xc6\x21\xcd\xc1\x32\xb1\x1c\xfc\x8a\x73\x07\x71\x80\xe1\xae\xc6\x3d\x1d\xf6\xc1\x0b\xdb\x20\xad\x03\x5f\x5e\x85\x37\xb5\x9d\x88\x75\xf2\x45\x99\xd2\xba\x1b\xcf\x1e\x98\x4d\x83\xdd\x2b\x18\xbe\x17\x96\xc5\x7b\x91\xb1\xf3\x73\x88\xe3\xc7\xa7\x05\x84\x0a\x54\xd1\xe4\xb4\xd0\x5c\xbb\x4b\x6c\xa8\x10\xf8\x7a\x48\x16\xf1\x58\x36\x35\x76\xa9\xad\x99\x26\x6d\xa5\x1a\xf7\x96\x32\xbb\xd4\xd3\x9f\x22\x7d\x76\x69\xd6\x8b\xa4\xd2\x2e\x2f\xd9\xb2\x69\xb5\x65\xe6\x3f\x81\x5a\xe8\xfb\x68\xdb\x5f\xe9\x6e\x1c\xcc\x03\xe4\x76\x32\x0e\xbe\x81\x37\xbb\x83\xf5\xa3\xf0\x92\xa2\x8f\xca\x19\x14\x77\x27\x19\xfc\xab\xae\xa0\xf6\x19\x19\x87\xd9\x05\x8d\xed\x6c\x82\x08\xa9\x65\xf5\xf0\xd3\x4d\xe1\x58\x93\x93\x5a\x8c\xe1\xf5\xf6\x36\xc9\xa7\x13\xc1\x62\x76\xc8\xd5\x88\x45\x23\x75\xec\xe0\xa4\xf9\x33\x02\xdf\x94\x70\x58\xc8\xcf\xd3\x74\xc0\x74\xc2\x39\x93\x4c\x52\x2e\x8f\x6f\xd3\x26\x48\xff\xcc\xec\xd7\xb6\x25\x9f\x99\x9d\xbc\x2e\xaa\xd3\xae\x89\x6b\x27\xe6\x11\xe0\x62\x57\xfd\x31\xc7\x37\xb1\xc9\x45\xc8\xd2\xdc\xe9\xa4\x2d\xd5\xd6\xde\xad\xe4\x80\x54\x19\xdf\x29\x9b\x0c\xbd\x58\x72\xcb\xcb\x2a\xe8\xcf\x97\x2f\xb3\x82\x80\xad\x3c\x77\xa6\x77\x20\x94\xdd\xd3\xe7\x48\x1f\xe8\x1d\xc3\xda\x6e\x17\x4b\x8b\x77\x2f\xd9\xca\x2c\x74\xd1\x79\xcb\x14\x3a\x06\x6e\x06\xbb\xb7\x7c\x9a\xd3\xe9\xc4\x49\xdb\xa5\x37\xd2\x05\xfd\xc0\xa7\xd1\x88\xa6\x71\x35\xac\x41\x3c\x53\xab\xc2\xf6\x57\x7e\xab\xcd\x9d\x55\x42\xa2\x99\xea\xd0\x32\x95\x5e\x46\x12\xb6\x66\xd4\xbe\x28\xa3\x56\x2b\xa2\xab\xc0\x87\x7b\x90\xb4\x3d\xdf\x7e\x88\x1a\xdd\xef\x79\x36\x56\x8e\x11\xd5\xcf\xd8\x9d\x79\x94\xba\xba\x99\xfb\x50\xeb\xea\xc6\xab\x34\xbb\x7a\x16\x3f\x08\x74\xaa\x93\x2a\xee\xef\xce\x3b\x0b\x68\xe6\xbe\x66\x01\x8d\x37\xce\xe2\x88\xa7\x45\x56\x9b\xf3\x6c\xe7\xf9\xdc\xf3\x90\x0d\xdd\xd7\x4c\x64\xf3\x8d\x73\xf9\x07\x4d\x26\x34\xfb\x80\x56\x98\xd5\xd3\x99\xcb\x62\xc0\x6d\xeb\xbe\x66\x64\x7a\x98\x67\x83\x9a\xb1\x6d\xae\xcc\x3f\x7e\x6b\xf7\xbc\x55\xb5\xb8\xf7\x99\x6d\x23\x9e\xdf\x2d\x61\xe3\x97\x16\x49\xaf\x93\x01\xad\x6d\x23\xd6\xb6\x11\x0f\x52\xea\x5b\x6f\xb0\x01\xca\x37\xcb\x18\xa3\x32\xdd\x8d\xf8\xf3\x95\x95\x17\x37\xe2\xc9\x74\x9c\x5a\x1f\x7f\xc9\xc2\x49\x9f\x04\x57\x59\x38\x09\x36\xe4\x23\x24\xe3\x57\xaa\x51\xbf\x7e\xc6\xaf\x02\x1d\x00\xe2\xae\xe6\x17\x98\x29\x01\x14\xc1\x25\xa1\x61\x55\xf4\x9e\xcf\xfc\xba\x58\x25\xaf\xff\xfb\x4f\x6b\x21\x35\xb2\x04\x42\x34\x88\xed\xb2\x32\xc4\xc8\x04\x15\x82\x76\x65\xfc\xca\x8c\x16\x10\xa9\xa6\x8f\x01\xe7\x09\x5a\xb6\x48\x49\xf3\x99\x66\x89\xcf\x20\xde\x4a\x0e\xb8\x91\xf1\x24\x27\xf9\x34\x1a\x91\x30\x27\x67\x20\x65\x1d\xf0\x6b\x99\x78\xe6\xf8\x8a\x15\xd1\xe8\x0c\x42\x68\xbc\x29\x54\x18\x97\xdc\x1e\x0c\x49\xc2\x1b\x3e\x2d\x00\xe4\x7b\x95\xcd\xe0\x7d\x18\x33\x7e\xd6\x01\x8f\x6c\xe9\x78\x0c\xf9\x6a\x74\xd0\x0e\x00\x90\x63\xb1\x63\x60\xe4\x05\x0d\x63\xc4\x55\x96\x13\x9e\xd2\xae\x9b\x44\x54\x4f\x61\xf5\x96\x39\x96\x7d\x77\x75\x02\x03\x31\x59\xf5\x2d\xe3\x57\xf7\x62\xd1\xe3\xa5\x00\x10\xd4\x40\x1a\xa1\x8b\x49\x0a\x6a\x34\x67\xc0\xf9\x25\x83\xf8\x8b\x79\x89\x89\xda\xf1\xf9\xdb\x07\x8b\x85\x43\xd7\x61\x70\xe6\x0b\x83\xee\x4e\x6a\x56\x28\x74\x8d\x00\x5f\x28\x1a\xfa\x1f\x81\x56\xfe\x1e\xec\xa3\xe6\x6a\x50\x1c\x8f\xda\xa6\x04\xfd\xf3\x0c\xad\x0c\xf2\x54\x04\x72\x02\x5a\x0a\x12\xd4\x95\x44\x42\x36\xc2\x0d\x72\xdb\x6e\x19\x69\xc4\xfd\x88\x89\xee\x96\x60\x7d\xe5\x62\xa2\xf5\x7b\xe7\x4b\xbe\x77\xd6\xa6\x4f\x6b\xd3\xa7\x87\x67\xfa\x74\xef\x11\xc1\xff\x00\xcf\x70\xa8\xf8\x26\x9d\x4c\x6b\x57\x7f\x7f\xcf\x5d\x7f\x14\x40\xd6\x8d\xe6\xd9\xfe\x9f\xfb\x71\xff\x27\x4c\xd8\x6b\xa4\x14\x2c\x4d\x58\x4a\x37\x9d\xdc\xbc\x8d\xe2\x8a\xe6\x6c\xbf\x5b\x5b\xe4\x3d\xcd\x69\x41\x86\x8c\x26\xb1\xf8\x43\xb1\x46\x30\x3e\x09\x35\x66\xa9\xcc\x10\xab\x73\xf3\x6a\x17\x16\x5d\x32\x0e\xb3\x73\x96\x5a\x05\x98\x61\xb7\x4f\x7a\x1b\x96\xa2\x16\xa1\x7e\xe4\xd9\x38\x4c\xec\x14\xb4\xa2\xf4\x03\x9f\xcc\x72\x89\x41\xc0\x7a\xbf\x97\x72\x57\xaf\x68\x9a\xd3\x39\x7b\x9a\xb7\x17\xb2\x45\x76\xec\x9e\x86\xd3\x24\x91\x0b\xa4\xfa\x71\x92\xe7\xde\xc1\x03\xe7\x2d\x0c\xa5\x96\xba\x62\x62\xa0\xd6\x09\x26\x23\x06\x9f\xca\x34\x87\x3f\x52\x58\x62\x7c\x68\xae\x50\xe4\x94\x2b\x99\xd3\x90\x67\x63\x25\x6b\x58\x8b\x9d\x1e\x98\xd8\x69\x9d\x4d\x75\xc5\xd9\x54\xdf\x0c\xc9\x99\x78\x08\x9d\x75\x64\x94\x8c\x01\x4d\x3a\x84\xc1\xa5\x1e\xa6\x31\x19\xc1\x8d\x8d\x49\xa0\x8d\x6c\x4c\x92\x6d\xcc\x69\x1d\x9a\x38\xd9\x18\x65\x40\xaf\xa2\x2a\x6f\x94\xfa\xcd\x1e\x4f\x6d\xc7\x29\xa1\x59\xc6\x33\xbf\x5b\x28\x5c\xbe\x4f\x2b\x92\x70\x98\x93\x2b\x9a\x24\x18\x26\x3a\x27\x8e\x8c\xed\x6b\x8c\xe9\x5d\x84\x17\x14\x22\x41\x0a\xd2\x31\x4d\x12\x24\x90\x82\x98\x40\x0d\xb4\x56\x53\x51\xa9\xb7\x36\x1c\x9a\x3a\xf7\x08\xfd\xc3\xc3\xd3\xef\x92\x69\xfd\x14\x05\xce\xcd\x6a\xe0\x7b\x1e\x4d\xeb\x4f\x70\xb9\x85\xca\x8d\x91\xb1\xfe\x63\x16\x85\x2a\xf4\x26\x86\xc3\x14\xe8\xc3\x72\x22\xdb\x8c\x2d\x19\xb0\x2c\x59\x70\x7b\x80\xfa\x63\x9e\x74\xa4\xff\x67\x1d\xec\x3c\x8c\x21\xd8\xf0\xa5\x78\x55\x46\x61\x42\xe4\x6d\xa6\x85\xb2\x02\x87\xd5\x26\xc4\x95\xc4\x4c\x5d\xef\x4b\xdf\x43\xb6\x7d\xf4\x4f\x46\xe6\x8c\xc1\xe4\x94\xac\x3a\x66\x59\x71\xb3\x35\x14\x8b\x4e\xe3\x2d\xc0\xd0\x2d\xb5\x16\x40\xc2\xe0\xda\x81\x85\x83\xd0\x9e\xe4\x3d\x4d\x20\x7a\x3c\x57\x49\x8c\xb1\x3d\x2d\xd4\x1e\xb1\xf3\x11\x30\x48\x6c\xc0\x92\xe2\x06\x26\x4a\xd3\x7c\x9a\xa9\xf8\xe3\x48\xcd\x21\xd8\x79\x72\x15\xde\xe4\xe2\xc7\x0d\xc6\x23\x4d\x73\x06\x5a\x16\x19\x61\x54\x27\xfb\xce\x68\xaa\x6e\xc1\x33\x4b\xad\x8e\x12\x75\xcc\xc0\x2e\x87\xa1\x92\x28\xcb\x90\x74\x43\x9e\x24\xfc\x4a\x0c\xd7\xac\x70\x1f\x02\xb5\x6e\x12\x6d\x14\x62\xfd\x36\x86\x08\xb2\x10\x5e\x11\xf6\xdf\xaa\x06\x1a\x88\xbb\x66\x23\xcb\x9a\x86\x5b\xad\xcc\x34\x0a\xb7\x60\x6b\x62\x9c\xce\x63\xf0\x6d\x9b\x91\x98\x68\xa7\xbf\x50\x1d\x8e\x9e\x15\x34\xc3\xa3\x83\xd9\x2e\x9c\xad\x10\x5b\x3a\x64\xf2\x62\xc6\x77\x16\x4b\x09\x30\x9f\xaa\xa9\x82\x03\x3d\xb9\x51\xf6\xc0\x24\xa7\xd9\x25\xcd\x08\x58\xde\xa3\x95\xa4\x8a\x3f\xef\xc4\x48\x5d\xd4\x94\xdb\x9a\xc8\x22\xd6\xdb\xf6\xfc\xdb\x73\x87\x59\xf5\x63\x76\x86\x31\xcf\x52\x1a\x1f\x17\x61\x56\xa8\xcc\x35\xfa\xfd\x90\x15\x37\x5e\x99\x3c\x64\x4a\x3c\x4a\x4a\x31\x41\xd1\xe4\x12\x08\x60\x93\xb9\xb7\xb1\x8d\x56\x66\xc2\x50\xa5\x14\xfe\xcd\xfd\xec\x59\x10\xdf\x5a\x8d\x7d\x65\x4d\xaf\x2b\x47\x59\x6e\xcd\x8a\x71\xa4\x67\x82\x89\x78\xbc\x46\xab\x26\x25\xae\x85\x19\x26\xec\x82\x85\x82\x52\x32\x66\xe7\xa3\x02\x54\x5d\x4a\xde\xd9\x35\x60\xdf\xf3\x8c\x98\xf4\x56\xa1\x0e\x4f\xa9\xa3\xf8\x43\x65\x48\xce\x84\xa9\xa2\x38\xbf\x30\xb5\x21\xf9\x7a\x98\x9a\x9b\x40\xb3\x08\x83\xa9\x78\x82\x09\xd2\x3d\xc2\x00\x73\x48\x3f\xa2\x69\xde\xad\x5d\x77\x98\xd5\xa3\x47\xc4\x9b\x8c\xbf\xfe\x02\xac\x61\xf9\x97\x5e\x7d\x3f\x30\x59\xfd\xf2\xbf\x12\xe8\xe8\xac\xbf\x8b\x4e\x0e\x06\x00\xee\x36\x8e\x40\x62\xf7\xdc\xbb\x7f\x94\xd0\x30\x6d\xe8\x7e\xa9\xde\x9b\x67\xef\x87\xfb\xad\xb0\x55\x96\x90\x76\xfe\x6b\xd3\x6f\xc9\x26\x59\x39\x07\xa9\x10\x90\x73\x45\xdf\x15\x6d\x1b\x27\x05\x29\x65\xea\xb2\xfc\xed\x94\xf9\x71\xd3\x4e\x02\xa0\xa4\xe2\x06\x3f\xa6\x09\x8d\x8a\xe0\x63\x5b\x47\x78\x83\x4f\x5d\x96\xc3\x3e\xca\x2a\x32\xfa\x17\xec\x42\xa5\x13\x81\xb5\x9e\x8e\x2d\x3d\x71\x22\xd8\x2d\x31\xc4\x8a\x81\xbd\xb4\x48\xa1\x33\xbe\x86\x91\xd9\xe4\xb3\x76\x80\xb7\x96\x29\x79\x4d\x04\xdd\x06\x9f\x05\xe7\x66\x75\xbc\x15\xbc\x08\xba\x35\xf6\xfc\x75\x71\x76\xe7\x08\xc6\x66\x5e\x19\x26\xc8\x9a\x2a\x71\xc2\x2b\xc2\x4b\x41\x83\xc0\x4f\xfb\xbb\x66\xc6\x34\x48\x66\x69\x52\xd5\x7f\x63\x2d\xb5\x40\x18\xfc\x6d\x47\xce\x3c\x55\xb7\x97\xd9\x01\x27\x80\xb2\xbb\x19\xa7\xe5\x2d\x72\xa7\x86\x48\x75\x6a\xe1\x98\xfd\x5d\x92\x28\x03\x21\x0b\x54\x7c\xb7\x52\xa4\x62\x42\xc6\xa8\xec\x93\xbb\xd5\x77\xb0\xc6\xbd\x68\x1b\x07\xd5\x27\xa5\xc1\x98\xd7\x5e\xed\xfa\xf7\x49\x69\xdd\x0d\x95\xc5\x3f\xca\xab\xdd\x97\xff\x56\xed\x56\x9f\x54\xed\x12\x4f\x5f\x49\xca\xe9\x91\x66\x17\x08\xc8\xa5\xe7\x86\x41\xc3\xd4\x05\x92\xef\x24\x9f\x71\x70\x81\xf0\x35\xe6\xdd\xc3\xe5\x33\xb6\x22\x67\x17\xa3\x14\xf8\x31\x1c\xd3\xdc\x89\xf2\x8a\x78\xb9\x53\x7b\x58\x6c\x5a\x8d\xa0\x25\xcb\x11\x42\x88\x65\xa0\xa2\xa1\x5c\x13\x15\xe2\x99\xa9\x38\x60\xb6\xa1\x0a\xf1\x53\xce\xdb\xc0\xe5\xa8\x89\x15\xc7\x79\x67\x8e\xf3\xbc\x53\x3e\xd0\xfa\x9d\x6d\x01\xe9\xb2\x86\x33\xbd\xd3\x2d\xa3\xdb\x82\x56\x33\xb2\x21\xb0\x9b\xb1\xec\x63\x6a\x6d\x68\xec\x90\x8e\x6a\xae\xe2\x6f\x98\x93\xf8\x43\x8f\x1b\xf2\xcc\xc0\xf0\x74\x38\x1d\xb2\xb0\xfb\x93\xb3\x1d\x66\x9a\x75\xe6\x2f\x55\x3b\x3e\x7f\xd4\x9d\x96\x85\xa9\x90\xec\x75\xa6\xb5\x84\x81\x37\x96\x3e\xb6\x74\xbd\xa3\x77\xec\xf0\x50\x3f\xc3\x67\x1b\x61\xd4\x37\x0b\x92\x74\xb7\x55\x7c\xe5\x2f\xd7\xa8\x41\x32\x83\x83\xed\x8e\x7d\x62\x1d\x7b\x25\x43\x26\xa4\x31\x91\x1f\x82\x78\x15\x14\xa8\xed\xc5\x25\x9d\xc3\x85\xcc\xba\x25\x66\x3a\x8f\xd9\xcf\xc3\x39\xb3\x8e\x99\xdb\x42\x3f\xde\xe4\x15\xa1\x7f\x5b\x92\x32\x5d\xa6\xae\x04\x29\x8f\x71\x24\x4a\xda\x1c\xc6\x1e\x4e\x5d\x58\x4f\xff\x1e\x9c\x3b\xaa\xe7\x2a\x4c\x6d\x94\xe7\x8a\x32\xb6\xb1\x64\x04\x9e\xa9\xcc\x93\xb5\x27\xc1\xda\xb2\xe6\x81\x7a\x12\xac\x6d\x24\xd6\xae\x0a\x9f\xcf\x54\x20\xe2\x09\xcf\x94\xd2\x7a\x12\x26\xb4\x28\x68\x17\xe4\x4b\xdd\x91\x16\x27\x1b\x19\x60\x5a\x7c\x1f\x8e\x59\x72\xa3\x6a\x14\x37\x13\x7e\x9e\x85\x93\xd1\x4d\xd7\x7c\xb4\xc1\x8f\xd9\x7f\x69\x05\xf0\xe4\xfa\x03\x7f\x4f\xc7\xad\xed\x1d\x7d\x87\x8a\xab\xe4\x65\xc2\xce\xc5\x35\x94\xd0\xa1\xf1\x05\x9f\x4b\x07\x9f\xb0\x94\xfe\x83\xb2\xf3\x91\xb8\x0d\xb7\xe9\xd8\xd4\x66\x69\x75\xb9\xb2\x3f\xc0\x8b\x1a\x8b\xe3\x05\xb4\xff\xbe\x56\x5f\xde\xb3\x8d\x0b\x0b\x30\xdd\x97\x4f\x7a\x6e\xaf\xfa\xd2\x9e\x63\x57\x14\xb0\xe1\x2f\x56\x13\xa6\x73\xed\x27\xf2\x3b\x52\xd8\x7b\x6a\xc3\x2f\xa8\x4e\x9e\xa7\xeb\x15\x2a\x94\x51\x63\xd9\xac\xa5\xec\xea\x7c\xca\xf8\x8a\x49\x6e\x08\x1f\x48\x55\xe5\x25\x0b\xb5\xb6\x6d\x98\xf1\x31\xb6\x6c\x73\xb6\x1b\x0b\x6a\x30\xf1\x4d\x23\xf5\x95\xae\x93\x8a\xd1\xc7\x55\x2a\xbb\xaa\x04\x0e\x9e\xe0\xb7\xda\x09\x65\x5e\x3f\x17\x29\x17\xa8\xf1\x75\x51\xfb\xee\x40\xf9\x32\x01\xd8\x23\x07\xc2\x91\x08\xe0\x1a\x39\xdf\xdd\x67\xfe\xd2\x8e\x31\x73\x3c\xf0\x2b\xdf\xf4\xd6\x33\x1e\x57\xd3\x7d\x91\x90\x43\xb5\x07\x5d\xf7\x03\xbe\xfa\x45\x05\x4b\x52\x62\x2f\x91\x6a\x4f\x49\x48\xf4\xca\xe8\x8e\x94\xc0\xc3\x2c\x0a\x6c\x29\x1b\x92\x96\xdb\x97\x92\x39\x41\xdc\x38\x24\xa3\xa6\x53\x41\x23\x35\x3f\x1f\xb4\x6d\x9b\x3e\x35\x2c\xb7\x35\xbd\x67\x4e\xd4\x29\xab\x6d\x39\xe2\xba\x86\xd5\x84\xbc\x56\xa1\xb8\xae\x49\xfb\x51\x5f\xd5\xa6\x59\x0b\xb7\x51\x5b\xb0\x7b\xab\x24\xe0\xda\x75\x6b\x51\x8f\xa6\x95\xc8\x40\x34\xc6\xeb\x15\x5e\x4e\x3e\x81\xe7\x02\x57\x73\xb9\x16\xe2\x06\x81\x49\x8d\x98\x43\x34\xbd\xb0\x6b\xd6\x64\x01\xc7\xac\x68\x21\xa7\x2c\x43\xf0\xd6\x9e\x59\x6b\xcf\x2c\x8b\x3e\x37\xbb\x67\xcd\xd5\x9a\xa2\xf0\x2b\x68\x4a\xde\x11\xf5\xeb\xe6\x5d\xed\x15\x1e\x64\x16\xa6\x47\x77\x91\x82\xad\xcc\xcd\xcc\x0a\x73\xa2\xc4\x5f\x56\x5c\x92\xfb\x71\x38\xdb\x7b\x58\x0e\x67\x28\x4e\xf8\x07\x8b\x63\x5a\x9b\x69\x66\xff\xe9\x17\xce\x34\x83\xc3\xab\x0d\x14\x83\x9f\xff\x59\x2b\x99\x79\x3e\xd7\xf8\x55\x2b\xf7\x37\x81\x7f\xe6\x0f\x21\x20\xcc\xd3\xdf\xb5\x18\x57\xc6\xaa\x07\x9a\xca\x86\x37\xb5\x28\xfb\xac\x0c\xdb\x18\xd7\x5e\x01\xe9\x6a\x17\xf4\xa6\x0e\xa1\x76\x77\x1d\xa8\xa6\x76\xc5\xf7\x87\x29\x91\xbd\x57\x69\xf7\x55\x98\xa5\x98\xb1\xb3\x52\xc2\xf7\xc4\x07\x6c\x14\x62\x22\x88\xe7\x94\xf8\x5d\x46\xc3\x8b\x09\x67\x69\x51\xb7\x4b\x4f\x76\x1c\x69\xa9\xd6\xbf\x56\x3a\x87\x3d\x29\xc3\xce\x12\xac\xa2\x32\xed\x4f\x2d\x57\x9d\xb3\x3d\xa4\x7e\x4a\x80\x56\xbd\x01\x4f\xe7\x1e\x9d\xdd\xda\x0a\x07\xa9\x86\x57\xc7\xe0\xdf\x76\x96\x9a\xee\x61\xad\x57\x51\x98\xde\x90\x17\xe4\xd3\xed\xfc\x61\x1e\xad\x86\x3b\xbf\x2b\x39\xe4\x1f\x28\x1a\x66\x9d\x58\x52\xfa\x5a\x88\x9a\xca\x30\x1e\x4c\xd2\x0d\xe9\x89\x69\xc4\xb3\xb0\xe0\x99\xde\x8f\xab\x46\xd7\x0b\xbc\x92\x1c\x8d\x6f\xdb\x0a\x4a\x23\x3b\x27\x9b\x04\xa8\x4e\x1a\x26\xce\x96\xdb\xb1\x5f\x14\xf7\x51\x0a\xfd\x32\x4b\x66\xc6\xd3\xe4\x46\x7f\x14\x3f\xd4\x87\xeb\xfc\x67\x23\xbc\x12\x3f\xd4\x87\x7c\x6c\x7d\x10\x3f\xb4\xd0\x2b\xb6\x3e\x88\x1f\x5a\x07\x71\x6e\x7d\x10\x3f\x74\x1f\x89\xdd\x47\x62\x7d\xc8\x5f\xf1\xab\xd4\xea\x5e\xfc\x34\x03\x70\x3e\xe2\x4f\x33\x08\xe7\x23\xfe\x34\x03\x71\x3e\xe2\x4f\x33\x18\xb7\xcf\xc4\xfe\x78\x25\xaf\x16\xfc\x76\x65\x1b\xf5\xac\x42\x94\x27\x16\x5e\xfc\x2b\xd6\x59\xfc\x2b\x96\x15\xa4\x76\x31\xfe\x2b\x16\x0d\xbe\x27\xf2\x5f\x58\x10\x84\x54\x7f\xe1\x54\x11\x5a\xfd\x85\x93\x10\x7f\xc1\x90\xb5\x15\xcf\xdc\x92\x07\x78\x6f\xc9\x0b\xdc\xcc\x01\x8a\x81\x2f\x32\x65\x28\x04\x51\x69\xfc\x05\x29\xe9\x75\x48\xf0\x36\x2c\x68\xc6\xc2\x64\xf3\xe7\x37\x7d\x32\x4d\xa5\xdf\x00\x8d\x61\x21\x71\x6d\x48\x86\xd9\xea\x63\x12\x90\xc7\x32\x95\x8f\xe6\xe7\xfc\xf6\xc9\x63\x12\x88\x33\x77\xf6\x8d\x7c\xcf\x6c\x7d\x7b\xd6\x0d\xc4\x0b\xf4\x92\xb3\x98\xf4\xb4\xb0\xf8\x92\x81\xb3\x81\x49\x96\x04\x86\xe2\x67\x62\xa1\xcf\x48\x34\xa2\xd1\x05\x61\x39\x19\x86\x39\x04\x2a\xe7\x82\xd3\x27\x7c\x5a\x90\x9c\xf3\x94\x66\x84\x0d\xc1\xe3\xa4\x2b\xe5\x94\xa2\x9a\x2d\x9d\x84\xc0\xf8\x5d\x96\x63\x80\x7c\xf8\x6a\x84\x7c\x3a\xbc\x3e\xc3\x70\xf9\x8c\x7c\x03\xc7\x4c\xae\x8d\x28\x78\x7c\x48\xb6\xfd\xd8\xe7\x03\xcd\xee\x90\x43\x80\x3f\x61\x1f\x8d\xe5\xac\xe8\x55\x22\xe1\xe1\xa1\x05\xeb\x1a\xe2\x9a\x59\x5b\xe1\xae\xf1\x3f\xa8\x52\x1b\x69\xdc\x64\xa4\x06\x82\xf0\xe8\x11\x31\x9d\xd9\x93\xaf\xe9\x42\xcb\x2c\xb7\xb6\xc8\xcb\x24\xe1\x57\x6a\xa5\x0b\x4e\x06\x70\x51\x0d\x40\xcd\x20\x48\xa5\x3c\x30\x78\x92\xc8\x9b\x21\x09\x93\x8c\x86\xf1\x0d\x19\xc1\x8e\x76\x48\xca\xb5\xc3\x0a\x6e\x14\x54\xc8\xd5\x5e\xc8\x01\xa8\x11\x6d\x6d\x91\x98\x16\x34\x1b\xb3\x94\xe2\xe0\x58\xc2\x8a\x1b\x32\x08\x73\x1a\x2b\x7f\xa6\x7c\x1c\x26\x09\xcd\x0b\x92\xb3\xff\x52\x32\x9d\x6c\x38\xfb\x74\x2a\x37\xea\x54\xec\x54\x99\xf9\xec\x0a\x4c\xd7\x9b\x77\xea\xef\x1e\xb4\xe0\x6c\x5e\x4d\x13\x27\xa7\xcc\xc9\x7a\x6f\xea\x18\x2a\x78\x62\xb7\xf4\x98\x04\x3f\x4f\x82\x9a\x3a\x36\xb1\xf2\x6b\xc1\xa1\xd7\xf5\xc4\xa2\x39\x7d\x29\x33\x6f\x7d\x71\x75\x59\x0e\xff\xfe\x3c\x69\xb7\xac\xa6\x3a\x88\x04\x6d\xc1\x83\x79\x1d\xd7\x36\x21\xbe\x56\x36\xe2\xa0\x7b\x1d\x9a\x3a\x48\x7a\xeb\xa2\x16\x78\x34\x78\x9b\x2f\x19\xee\x74\x9a\x24\xda\x70\x5c\x96\x19\x7f\x80\xdb\x46\x49\x12\x3e\x04\x0c\x9d\x69\xb7\xf4\x4b\xfe\x7e\xa4\x43\x0f\x32\x0f\xf1\xdf\x33\x16\xd7\xbd\x51\xe7\x0b\x58\x7d\x8f\xb2\x21\x31\xb8\x87\x20\x56\x59\x65\x0e\xe2\xb5\xb9\xdb\xef\xdc\xdc\x6d\x1d\x48\x6a\x1d\x48\x6a\x1d\x48\xea\xf7\x68\x24\x09\x15\x31\xb3\xfd\x77\x61\x5e\x27\x4b\x7b\xb2\x57\x01\xdb\xd4\x89\x81\x5a\x47\xa1\x5a\x47\xa1\x9a\x2b\x0a\x95\x13\x7e\xea\xd7\x69\x5e\xb0\xe1\x8d\x4c\x4e\x2c\xbf\x6e\xe6\x45\x98\x19\x93\xcf\x30\x61\xe7\xe9\x9b\x82\x8e\xf3\x3e\x09\x22\x2a\x70\x65\xae\xf8\x54\x05\xbd\x2e\x5e\xa1\x70\x0a\x21\xc0\x9f\xc1\xb6\xb5\xd4\xa1\x43\xac\xf4\xea\x15\x0d\xda\x55\x2e\xe8\xcd\x80\x87\x59\xfc\xbd\xf2\xa9\x53\x15\x07\x61\x74\x71\x9e\xf1\x29\x66\x1d\xb2\x4d\x35\xc1\xc0\x28\x66\x97\x4c\x05\x15\xd0\xf6\xa5\x12\x63\xbd\xd4\xee\x60\x62\xba\xbd\xe3\x45\xcb\x52\x11\xa5\xb6\x77\x1a\x6c\x54\xed\x16\xea\xcd\x63\x67\x66\x80\x6f\xb6\x47\xe5\x02\xb2\xb8\xe9\x93\x5e\x77\xcf\x85\x84\x29\x5a\x4b\x02\x71\x14\x54\x37\xc1\xf6\xe4\x9a\xe4\x3c\x61\x28\xf3\xa8\x58\xa3\x84\x9d\x8f\x8a\x57\xe5\x85\x3a\x9f\x16\x05\xcd\xf2\xd2\x34\x7f\xa0\xc3\x62\x56\xd0\x2f\x09\xfa\x1e\x8d\x7e\xab\x61\xed\xbe\x06\x40\xd0\x4c\x57\x45\x16\xa6\x0a\x23\xa4\xe1\xb2\x2e\xc9\xa5\x45\x4d\x2b\x30\x9b\xbf\x09\xd6\xba\x81\xed\x60\x14\x4f\x15\x06\x96\x1b\x50\xdf\xba\xf9\x88\x67\x05\xcd\x0b\xf5\x0c\x6c\x5b\x89\xfc\x47\xfc\x92\x66\x4e\x0e\xff\x6a\xd4\x36\x0e\x48\x66\x3c\x47\x55\xc6\xc3\x36\x46\x9a\x4a\x3a\x9e\x1b\x4f\xc9\x98\x0b\xc6\x3d\xa6\x97\x2c\xa2\xb9\x86\x08\xfe\x36\xa6\x31\x0b\x49\x0b\x46\xd4\x27\xa2\xd7\x76\xe0\x3a\xb8\x96\xba\x0e\x60\xbe\x98\xb6\x34\x30\xa2\x18\xd3\x6f\xf0\xe8\xaf\xda\x3a\x64\xb9\xb6\xdc\xb7\x33\xb6\x9c\xd3\x88\xa7\x71\x98\xdd\xbc\x94\xa1\xed\xac\xf8\x0c\x2f\xe3\x98\xe4\x7c\x4c\xc1\x48\x94\x92\x82\x93\x10\x24\x69\x11\x4f\x12\x96\x0b\xda\x16\xe6\xe4\xec\x07\x96\x17\x82\xec\x1c\xbb\x2d\x9d\x99\x76\x58\x4e\xc2\x41\xce\x93\x69\x41\x93\x1b\x4d\x3a\xac\x20\x0f\x73\x60\xdf\x93\x55\xdb\x6e\x7b\xe6\xc0\x6a\x16\x68\x25\x3b\xa0\x24\x94\x38\x6e\xf4\x27\x0a\xe7\xe7\x36\xbe\x7d\xe0\x6a\x99\xb5\x79\xf8\x3a\x9e\xdb\xe7\x89\xe7\xa6\xd2\x1e\x68\xab\x73\x79\xe0\x49\x4c\x73\x76\x9e\xca\xa5\x56\x3c\x03\x44\x1b\x42\xca\x8a\x41\x5b\xd4\x91\x54\x52\x77\x69\x83\x8f\x77\xfa\xd2\x91\xcb\x56\x10\x12\x8e\x0e\x31\x34\x5d\x06\x11\x68\xd4\xa4\x20\xda\xd8\x98\x5f\x3a\x83\xc5\xce\xfe\xae\xae\xe8\x65\xba\x0c\x89\x60\x0d\x12\x0c\x95\x03\x3c\x03\x50\xd6\x38\xc6\xe3\x24\x46\x34\x00\x26\x42\x11\x9b\x84\xe5\x05\x61\x05\x1d\xdb\xe3\x90\xcc\xc7\xac\xe4\x17\x82\xbc\x6a\x9a\xb8\x7c\xa0\x2b\xd5\xc4\xcc\x28\x57\x0a\xb0\xb5\x48\x50\x2b\x55\x49\x7a\x0e\x4b\xbe\x7a\xd1\x88\x52\xaa\x95\x45\xc2\x49\xe9\x9e\xdb\x32\xfd\x2f\xb6\xa5\x73\x1a\xb7\xe7\x4a\xb0\x6a\x56\x67\xa5\x91\x4a\x4a\x91\x36\xe4\x51\xb1\x22\xe2\x40\x89\x98\x26\x94\x29\xf3\x7e\x5d\x6a\xe2\x55\x7d\xce\x58\x11\xb5\xa1\x22\xf0\xe6\x35\xb1\x4e\xf0\x77\x55\x30\x09\x27\xac\xc3\x5c\xf1\x24\x1a\xc3\x49\x78\xcd\x55\x45\x94\x88\x2a\x23\x4a\xd4\x04\x94\x80\xf5\x35\xc1\x61\xc0\x78\xdd\xfe\x3e\x57\xfc\x18\x79\x86\x6d\x20\x8f\x45\xf5\xe9\x4d\xa9\x3d\x59\x7e\xe7\xc0\x12\x1d\x72\x12\xe0\x66\xf8\x19\x58\xe6\x8b\x30\xa1\x22\x18\xda\x6e\x29\x72\x36\x56\xb1\x1c\xad\xca\xe8\xa2\x90\x86\xe5\xaf\xe4\x7a\xce\x83\xcd\xb6\xa6\xcc\x0e\x3d\x52\x17\xf5\xa9\xe0\xa8\xc0\xb5\x31\xcb\xed\x7f\x14\xe6\x2f\x2f\xc3\x22\x14\xab\xa6\x33\xc9\x0b\x7e\xb9\x65\xa8\x25\x9c\x8a\x72\x32\x6d\x32\x2b\xfe\x12\xd4\x13\xab\xab\x48\x04\xf6\x24\x7d\x74\x88\x15\x26\x49\x8f\xc5\xe3\xbf\xed\x41\x49\xc5\xbb\x52\xcc\xcd\x8a\xfb\x94\xd1\xf4\xc4\xaf\xbb\x49\xb6\x3f\xda\xe3\xf1\x7a\xf3\xf7\xe6\xcb\xf9\xa6\xc8\x57\x70\x87\x7c\xe5\x62\xcf\x92\xfe\x25\xf2\x68\xa9\x43\xb7\x6c\x2b\xab\xf1\x97\x91\x74\x4f\xd2\xc3\xe5\xda\xf0\x1e\x7c\x9d\x0a\xd4\x59\xac\x61\x75\x0c\x7f\xfb\xcd\x3a\x11\x2f\x5c\x0f\x1d\xd2\xb7\x7e\x43\x23\x32\x8a\xd9\x1c\x5e\x3a\x0a\xa5\x12\x89\x79\xb3\x2c\xf5\x2a\x5d\x71\x3a\x15\x31\xa1\x8c\x7b\x8e\x7d\x92\x34\x83\xf2\x36\x04\x6f\x2c\x87\xbe\xeb\x01\x81\xde\x1c\x77\xc1\x3a\xdc\x7e\x5d\x5b\x3a\x6c\xeb\x28\xf1\x3f\x67\x42\xe6\xc2\xf0\xfb\x14\x0b\x1b\x24\x2c\xa8\xab\xe8\x89\xda\xec\x3c\x57\x6a\xcd\x3d\x90\x52\x2a\x7f\x31\x9b\x0a\x34\x28\x93\xad\x39\xc3\xfa\x38\xb9\xac\xf0\xbf\xf2\xb6\xd0\xbc\xab\x05\x8b\xb6\x9c\xa3\x1c\x89\xaf\xb6\x17\x6f\xc5\x3b\xce\x27\x67\x95\xdc\x4f\x5e\xe0\x19\xf1\x5f\xbb\x8a\x9b\xe8\x4e\xf8\xa4\x65\xc2\xe2\xb4\x4b\x0b\xb7\x64\xb4\x23\x77\xb0\x35\x03\x9d\x37\x3a\x8e\xa2\xc8\x33\x43\xe3\x68\x3e\xb7\x22\x2e\x8e\x92\x6d\xe8\xe8\x36\x76\xa0\x9c\x84\x61\x9c\x1c\xe4\x22\x35\x48\x45\xdc\x1c\xff\x99\x63\x7d\x90\xef\x0e\x93\x28\xca\x8c\xa7\xc2\x1b\x48\x3d\xee\x2a\x9c\x80\xf4\x13\xc5\xd4\xaf\x09\xac\x33\x4f\x23\x77\xf5\x23\x52\x83\x00\x0f\x22\xeb\x3d\xe2\xdb\x07\x3c\x7f\x58\xf6\x01\xa8\x83\x7a\x4b\xd3\x69\x9d\x93\x43\xaf\xf7\x85\x2d\x3b\xc4\xe0\x6a\x7d\x7e\xc4\x47\xb1\xda\xb5\xa3\x9f\xcb\x2e\x45\xb5\x72\x5f\xc3\x17\x6d\x37\x4e\x41\xbe\xae\x2b\xf5\x98\xbd\xb9\xdc\x96\x54\x2b\xf7\x35\x05\x40\xe7\x2f\x6e\x5f\xb3\xdb\xeb\x3d\xac\xf3\xf3\x85\xed\x6b\xd6\xd6\x2e\x6b\x6b\x97\xb5\xb5\x4b\xa3\xb5\x0b\xfc\x7a\xc5\xeb\xc8\xeb\x8e\xc1\x8f\x3c\xca\x78\x92\x0c\xc2\xec\x98\xfd\xb7\xce\x82\x60\x67\xbf\x57\x0d\xdf\xe8\x55\x68\x03\x7e\x56\x0b\x96\x9f\xf8\x84\x5f\xa2\x88\xa8\xf2\x76\xdc\xf6\x21\x9b\xda\x97\x20\x0b\xde\xbd\x0e\x68\x53\xf3\xfa\xa2\xfc\xb3\xda\xba\x6c\x6d\x91\xbf\xc9\x43\x41\x63\xcd\xb1\x13\xb9\xec\x0b\x8d\xf9\x83\xd6\x99\x0b\x2a\x36\x08\xa3\x8b\x3a\x7c\xee\xcd\x3d\x85\x8a\x36\xef\xc1\xef\xae\xe4\xcf\x66\xeb\xd2\x40\x1b\x57\x70\x92\x53\x4c\x26\xa2\x54\xc8\x4a\xd1\x31\xa6\xe9\xd4\xe8\x38\xc2\x34\x1a\xf1\xec\x75\xa2\x15\x6c\xff\xf8\xf0\xf6\x07\xf9\x18\x2b\x6b\xce\x6a\x26\xa2\x12\x0e\xbc\x1b\xb6\xac\xea\xed\x7a\xad\x59\x98\x82\x7b\xd4\xd6\x16\x19\x87\x45\x34\xd2\xdb\x67\x4d\x0b\xd8\x6d\x95\xe4\xab\x63\x22\x2d\x9d\x29\x46\xeb\x2c\x5f\xab\x85\x57\xa6\x16\x36\xac\x8a\xdd\x3a\x64\x94\x51\x24\xe7\x4c\x61\x98\xe9\x49\x7d\x02\xbc\x5c\xa8\x3f\x7d\x3a\x86\xe0\xaf\x38\xa0\x43\x9e\x51\xe8\x0f\xf6\x1d\x0c\xb2\xac\x29\xf1\xf4\xb5\x28\x59\x74\x7b\xab\x4e\xf8\x92\x9b\x5d\xd1\xd4\x6a\xb6\xbe\xdc\x70\xbb\x71\xa9\x20\x45\x87\x5e\x28\x96\xe3\x5a\xa9\x6c\x31\xf6\x6a\x41\x3a\xc4\xf5\x82\xb9\x0b\x36\x0a\xe5\x8a\xd9\x0a\x67\xb9\x60\x90\xb2\xe5\x4f\xbf\x5e\xa5\xb3\x78\xcd\x0a\xf7\x28\x5e\xb3\x85\xed\x31\xfe\x88\x0b\x55\x3e\x89\xd7\xac\xf0\x0f\x22\x16\xad\x97\xab\xf2\x1c\x5e\x0b\x26\xce\x5f\xae\xf5\x29\x74\x56\xcb\xa8\x3a\x44\xe7\x34\x2f\x72\xe5\x0b\x9a\x70\x6d\xe2\x23\x8d\x76\x26\x61\x16\x8e\xc9\x27\xbc\x70\x6f\x65\xba\x28\x93\x38\x2a\xe7\xd3\x2c\xa2\xda\xba\x4e\x76\x68\x2d\xff\x7b\xec\xe1\x48\xb4\xbc\x7c\x8e\xc1\xb1\x3c\x0e\xd2\xc5\xd0\xda\xdf\x09\x5d\xc4\x22\xd0\xb7\x41\xfa\x29\x9c\xd0\x6c\x71\x56\xe3\x4c\xf2\x43\x67\xca\x55\xfa\xa6\xc4\xe2\x48\xf6\xb3\x82\xc3\x91\x5f\x8e\x56\x60\x69\x07\x96\x9a\x0b\xb5\xf0\x01\xcc\xa6\x40\xa3\x2c\xf7\xcc\x98\xf9\x12\x96\x92\xb3\x71\x7e\xd6\x21\x3c\x23\x41\x38\x2d\x78\x60\x7a\xd2\x50\xaf\xb4\x99\x70\x53\x24\x32\x81\xaa\xad\x93\x1a\x88\x74\x3a\x1e\xd0\xac\x3e\x62\x1b\x1c\x02\x94\x90\x52\xe4\xd1\x9a\x1b\x42\x48\xb8\x42\x1a\x01\x37\xc0\x60\x79\x56\x04\x35\x98\xf8\xc7\xb6\x8a\x8e\x2a\xde\x52\x59\x91\xbc\xcb\x18\x46\x87\x04\x69\xa4\xb4\xa3\xeb\x93\xa0\xe0\x18\x9a\x70\xc4\x33\xf6\x5f\x9e\x16\x50\x08\xf6\x68\x81\xb6\xe3\x4a\x8a\x6c\xa1\xea\x10\x49\x5a\xd7\xae\x77\x71\x10\x6d\x4d\x04\x06\xf7\x8d\xbf\x75\x3e\xa1\xd1\xff\xd7\x87\x7d\x1e\x87\xd7\x6c\x3c\x1d\x93\x11\x84\x92\x16\xfb\x1d\x92\x9c\x8d\x27\x89\x3c\x4f\x26\xf4\x2d\x4f\xa9\xd8\xf3\xb1\xb8\xa4\x33\x7e\x95\x93\x84\x42\x32\xc8\x10\xe9\xc5\x25\xa3\x57\xaa\x7d\x6c\x4c\x86\xab\x55\x59\x26\x43\x52\x84\x93\x49\x38\x10\x0f\x89\x8c\x86\x84\x4f\x0b\x48\x3b\x28\x51\xcc\xee\x14\xbc\xcc\xaf\x46\x2c\x1a\x89\xa3\x12\xb3\x7c\xcc\xf2\x5c\x35\xee\xbc\x25\xc5\xf8\x75\x14\xec\x28\x4c\xa2\xd6\x76\xaf\x77\x39\x22\x9b\xe4\xf9\xd3\xc9\x75\x5b\x6a\x37\xa5\x99\x34\x7b\x77\x4c\xc6\x5c\x1c\xb4\xe9\x98\xa0\xdc\x47\x67\x3b\xfc\x85\x0e\x2e\x58\xf1\xee\x92\x66\xc3\x84\x5f\x1d\xab\x8f\xb0\xfa\xd3\x68\x14\xa0\x50\x5d\xae\xb6\x54\xc9\x2c\x6b\x6f\x27\xaa\xcf\xb4\xb5\x13\x40\x5a\x07\x70\x69\xe2\xf3\xeb\x9f\x05\x1d\x4f\x3a\x98\x73\x0b\xcc\x45\x0a\xf9\x71\x1e\x9b\x3c\x50\xdb\x48\x78\xe3\x45\x9f\x80\xb1\x8d\x36\x8f\x93\x56\x25\x60\x30\x27\x30\x09\x4d\x6d\x04\x54\x1b\xa3\x47\x48\xa7\x7b\xf1\xd7\x37\x50\x1b\x7f\x3c\x7e\x6c\x94\xd2\xa2\xea\x89\x28\xfc\x68\xb7\x8c\x25\x4e\x0c\x56\xa3\xa4\x05\xf5\x1e\xcc\x0e\xff\x58\x2e\x03\xa5\x8c\xb8\x29\x26\xba\x88\xc9\x20\x2c\x0c\xa6\x9e\x94\x36\x83\x18\x5a\xf1\x44\x34\xfb\xb1\x1b\xf1\x34\x0a\x8b\x96\x98\x55\x1b\xa2\x27\x8a\x62\xf5\x6f\xf7\x9c\x16\xd2\xf9\xe7\xa5\x94\x6e\xcc\xce\xed\x37\x56\x72\xba\xdf\x7e\x23\x5e\x51\x37\x87\x84\x73\x34\x06\xf5\x8e\xa5\xe7\xdf\xda\x22\x7f\x15\x77\xfe\xf7\xec\xfa\x2d\xad\x37\x5a\x7a\xc5\xc7\xdd\x21\x4b\xe3\x57\xef\xde\xc2\x3b\xbf\xe5\x36\xdf\xee\x0e\x59\x96\xa3\x79\x62\x9d\xce\x7c\xee\xc6\xdc\xb1\xca\x9d\x55\xeb\x32\x36\xb2\x48\xad\x81\x51\xdf\x86\xa5\xb4\x9a\x55\x39\x08\x75\x0b\x8f\x1e\x91\x3b\x2d\xd2\x92\x13\xc2\x61\xb6\xda\x07\xde\x6a\x97\xd6\x0d\xe2\x25\x9b\xe9\xce\xbf\x19\x76\xac\x07\x7b\xb6\x7a\x3c\x66\xb3\x66\xcf\xb2\xa2\x92\x3f\x83\x5b\x77\x8b\x30\x09\x10\xbc\x46\xdd\x7c\xa0\x4a\xa4\x66\x1b\x88\x02\x47\xe1\x65\x6f\x84\x32\x93\x61\xea\x0e\xeb\xb0\xa1\x67\x86\x29\x57\x73\x64\x96\x90\x5e\x03\x5b\x3a\x2d\x42\x5b\xb0\xa8\xe4\xe8\x57\x3c\xbb\xc8\x09\xf0\xf7\x13\xd8\x3a\xe5\xb9\x62\x61\x5a\xcb\xe9\xe0\x07\x5a\x04\x39\x91\x41\x9a\x20\x0b\xf2\x84\x51\xe4\x54\x13\x7e\xce\x22\x19\x45\x26\xcb\xc5\x8d\xa5\xc3\x9c\x88\xce\x32\x16\xab\x64\xa4\x10\x1d\xc3\xb4\xe9\x4b\x3b\x6b\x36\xc9\xdf\x67\xc5\x01\x46\x09\xa3\x69\x81\x57\x1a\xf9\xc6\xec\xa4\x53\xfe\xe8\x11\xf9\xca\x20\xaa\xb8\xe9\xbb\x32\xd0\x87\x1b\x91\x26\x47\x5d\x09\x86\xe4\x71\x14\x22\x56\xb8\x0c\xf2\x98\x04\x93\x6b\xcb\x72\x69\x06\x4e\x41\x7f\x27\xe8\xff\x13\xb3\x8c\x4a\x43\x46\xf1\xf0\xc9\x8a\x44\xbc\x79\x02\xcb\xa7\x2d\x20\x7d\xfd\x1b\x5c\x87\x02\x71\x13\x88\x81\x2d\xd6\x61\x57\x05\x70\xd2\xb7\xfc\xff\x40\x28\xa1\xc7\x38\xc9\xc7\x24\x68\x07\x95\x26\x53\x6e\xce\x57\xc0\xf0\xfa\x94\xb0\xf0\x59\x23\x7d\xe3\x59\x11\x43\xfb\xdf\xf4\x46\x46\x71\xf1\x32\xe8\x76\xc8\x05\xbd\x71\x09\x19\xdc\x97\x62\x91\x8a\x70\x10\xd8\x23\x80\x0a\xdd\x49\x06\xff\x2a\x1d\x8a\x41\xd3\xaa\x59\xd8\xef\xa5\xaa\x44\x9e\x55\x70\x5e\xa6\xdb\xb2\xa7\x19\x72\x14\xca\xac\x70\x9e\xab\xd6\xe2\x3d\xe6\xb2\xa4\x47\xbe\xc7\xb1\xa2\xd7\xaf\xcc\x57\x2c\x7e\xcb\xa7\x69\x9d\x1d\x7d\x09\xce\xbb\x26\xec\x69\x4f\xa8\x63\x15\xe7\x1e\x7e\x67\xce\x65\x6b\x79\xbb\x9f\x9f\x27\x71\x58\xd0\x39\x06\x84\x80\x2d\xb1\x85\x3f\x99\xe8\x6d\x6a\x68\x5f\xe9\x72\x18\x9a\x38\xbc\x0d\xa3\xdd\xda\x22\x3f\x52\x1a\xc3\x63\x3b\xa3\x78\x3b\x86\xb9\x4c\x90\xac\x9f\xb8\x68\xb7\x0f\x59\x28\x0a\x4e\xc2\x14\xed\xc2\xdf\xf2\x38\x4c\x1c\x1f\x48\x48\x96\x2c\xee\x00\x32\x16\xdf\x54\x16\xe6\x51\x98\x9e\x53\x93\x49\x59\xf4\x25\xf1\x8f\x84\xe9\x0d\x49\x68\x78\xd1\x5d\x6e\xfd\x96\xf0\x36\x10\xed\xab\x04\x94\x8b\xf8\x1b\x94\x52\x53\x2e\xed\x49\xe0\xa8\x13\x0c\xa4\x53\xec\xa6\xcf\x53\x17\xe5\xa9\x43\x38\x1c\xf3\x48\xf8\xf2\x57\x23\x3b\x30\xd0\xa6\xcc\xae\x50\x01\xe9\xd4\x3e\xb4\x98\x27\x15\x93\xb2\x04\xe6\x34\xe8\x88\x10\xac\xee\x9d\x72\xbb\x86\xbe\xd7\xad\x2b\x7d\x25\xde\x07\x35\x3e\x07\xce\x02\x63\x14\xbd\xd7\xe8\x11\x4f\x02\x33\x27\xf8\xe5\x8c\x59\x94\xc0\xe0\xee\x90\xd4\x52\xeb\xd4\xb5\xad\xb3\xcb\x23\x36\x27\xb6\x2c\x73\xfa\xd2\x71\xa7\xfc\xa1\x02\x19\xfb\xa4\x7e\x0f\x8c\xc6\xc9\x63\xcb\x6c\x20\x54\x9e\xa2\xb8\x40\xb9\xe2\x56\x5f\xc5\x46\x28\xd1\x37\x12\x06\x67\xcf\xb3\x30\xcd\x87\x3c\x1b\xaf\xa4\x35\x5b\x54\xd6\x10\xa4\xd5\x42\x58\xe7\xf6\xb2\x56\x68\xae\xda\xfa\x30\x7b\xad\xa8\x80\x0d\xca\x84\x19\xe4\x1f\x0e\xc4\x6d\x7b\xa3\xf2\x87\x97\x0c\x82\x2c\x62\xe8\x6c\x0c\x29\xca\x38\x35\x17\x56\x89\x61\x27\xb4\x4f\x02\x41\xe6\x03\xd7\x1a\x9a\xa7\x92\xd9\x70\x30\xc3\x62\x42\xec\xf9\x74\x5c\x92\xe6\x2f\x4f\x46\x87\x0e\x55\x1e\xb6\x52\xc1\x8a\x97\x16\x11\x49\xb3\xfd\x7c\x13\x70\x07\xee\x42\x3a\xeb\x58\x45\x9f\x75\x91\x5a\xe5\x5a\x23\x69\x31\xe8\x99\x06\xd2\xf0\xa2\xaf\x30\x8e\x46\x21\xaf\xb6\x65\xae\x92\x45\x4a\x71\xe5\xd2\x49\x39\xc5\xe7\x0f\x28\x4d\x05\xb3\x4d\xcb\xc2\x58\x8c\x0a\xac\x8b\x95\x64\xc5\xb3\x8c\xdc\x7e\x58\x96\x91\xf3\x18\x20\x3d\xfd\xe2\xc6\xc5\xca\xa6\xe9\x01\x58\xb6\xee\xfc\x01\x02\xf2\xff\x79\x8c\x5d\x0b\x2e\x9e\x2d\xd3\xb1\xc0\x43\x90\x5a\xd6\x5a\x45\xee\x37\x54\x6a\x1a\x42\xb9\x87\xb5\xa5\xed\xda\xd2\xf6\x0f\x61\x69\x7b\x41\x6f\xa2\x7a\xab\xca\x67\x7b\x3e\xe0\x8c\xd4\x1a\x02\xc4\xe0\x02\xfa\x92\xd5\xa6\x18\xd8\xd9\x2f\x81\x36\x86\x9e\x93\x30\xba\x52\x18\x15\xec\x92\x6a\x33\xc2\xea\xa9\x3e\x7b\x5a\x0d\xdf\xd4\x93\x03\x68\x68\xd7\x55\x4a\xb3\x57\x3c\x9a\x36\x74\xb7\x6d\x2d\xad\x03\xdf\xd4\x9d\x03\xa8\xab\x37\xd8\xf3\x6e\x5b\xc9\x54\x66\xd9\xf2\xae\xed\x78\xcb\x76\xbc\x62\x4d\xee\x6e\x12\xab\x8d\xae\xff\xc4\xf6\xa3\xab\x09\xf4\xe3\xb7\xc2\xd3\xef\x92\x69\xbd\x8e\xbf\x6c\x1b\x52\x6e\x40\xbf\x9f\x1a\xda\x70\x34\xbc\xf2\xb8\xdd\x45\xcb\x2b\x9a\x98\x4b\xd3\x2b\x00\xef\x55\xdb\x6b\x2b\x57\xfe\xf0\x1a\x5f\x50\x1b\x2c\xa8\xf5\x85\x05\x5a\x56\xf3\x0b\x09\x80\x25\x35\x80\xb7\xef\x34\xcb\x68\x5a\x7c\x08\x07\x6f\xd2\x98\x5e\xf7\x8d\xe8\xce\x55\x25\x24\x35\x5a\x51\x5b\xf9\x58\xf5\x7d\x90\x4c\xb3\x0f\x6c\x0c\x6f\xb7\xd2\x47\x14\x0d\x88\xf3\x52\x56\x4c\x98\x7d\x2a\x37\x94\xd3\x42\xfc\xc9\xa7\x45\xab\x4a\x1b\x6b\x2b\x22\xc4\xb8\xbd\xc4\x05\xd2\xf9\x7f\x1e\x65\x5f\x62\x2b\x3c\x55\x65\xb9\x64\xdf\x4b\x7d\x30\x34\xe2\x5e\xcf\x5e\xfa\x0a\xf7\x32\x35\x1f\xa1\x75\xa7\x79\x90\xc2\xe3\x41\x51\x4c\x85\x0b\xde\x71\x7a\x6f\xfb\x92\x10\x1c\x75\x46\xc5\x02\xc9\x1d\x6d\x39\x1d\xdc\x96\x95\x2a\x1d\xb2\xdb\x6b\x1f\xd4\x2b\xa2\xc4\xf6\xd4\xeb\xa1\xc4\x57\x4f\x61\x53\xa9\x84\xaa\x55\x40\xb9\x32\xf6\xa5\x36\x46\x54\xc4\x23\xaf\xb2\x85\x00\xb7\x67\x56\xce\x1d\xdf\xbd\xec\xa1\xb5\x7c\x46\x81\x36\x9d\x04\xe2\x48\xeb\xdf\x31\xbf\x4a\x83\x36\x04\x4e\xf9\xca\x19\xc1\x6f\xbf\xb9\x23\x7a\xf4\x88\x2c\x84\x06\xd5\xb8\x5f\x67\x70\x50\xa7\xc7\x9c\xc3\xe8\x60\x86\xad\x81\x4c\xee\x31\x4f\x57\x49\xb3\xd6\xdf\x42\x50\x93\x30\xc4\x5f\xc8\xd9\xaa\x49\x7b\x51\xec\x25\xeb\xa6\xf4\xba\x90\x5b\x7d\xcc\x06\x09\x4b\xcf\xdd\x15\x9a\x01\xbc\xd8\x70\xa7\x93\xbb\x0d\x56\x80\x32\x3e\xcd\xe7\x1e\x70\x75\x85\x86\x41\xd7\x1f\x7f\x79\x70\xeb\x29\x80\x04\xb0\xd5\xc9\x8d\x94\x40\xa0\xce\xf7\x25\x5b\x9a\x55\xd1\x02\x31\x01\x9f\xe6\x57\xa3\x60\x55\xee\x1c\x40\x4a\x2f\x56\x51\x55\x12\x9d\x7a\xb4\x56\xfd\xeb\x56\x4e\xd8\x47\x40\x02\xdc\x74\x7d\xdd\x66\xe7\xb4\xa8\xa6\xde\x36\xed\x66\x6d\x57\x86\xed\x65\xd6\xa9\xa4\xe7\x9f\x55\x49\x8e\x6c\xe3\xca\x15\xe5\xf5\xd7\x58\x93\x26\xfc\x17\x96\x24\x3f\xa7\xe3\x79\xfa\xb4\x40\xad\x6e\xa3\x84\x86\x99\xe2\x2c\x5c\xae\xa3\xbe\x7b\x6b\x90\x35\xbd\x3a\x3b\x2a\xfe\xd7\x9b\x68\x4e\x8b\x63\xc1\x96\xb5\x3e\x95\xd9\x31\x80\xd7\xd1\xb9\x2a\xba\x87\x33\x5d\xd3\xb1\x3c\xef\xce\xa9\xf2\x7a\x50\x4a\x6b\xe0\x0b\xbb\xde\xc7\x52\xc0\xa4\xe6\xe3\x58\x7d\x1a\xbf\x4a\x94\xd1\xa0\x73\x2e\x4c\x49\xb5\xbd\x58\x8d\xd9\x9a\x45\x1b\xf5\x14\x1e\x3d\x2a\xcd\xea\xdb\x43\xd2\x9b\x4d\x02\xdc\x83\xea\xb5\xf1\xb1\x64\x4a\xe0\x5f\x6e\x0d\x8d\xce\x34\x67\xab\x32\x48\x98\x8d\x49\xde\x91\x58\x90\x5c\x56\x73\x4e\xf7\xc4\xce\x56\x2d\x0e\x50\xdb\x82\x8e\x45\x3f\x27\xfa\xa5\x02\x8d\x96\x65\xda\x6e\xc3\x7a\x9b\xda\xb5\x83\x57\xf8\x0c\x3d\x74\xe1\xe0\xbc\x1b\x3a\x17\xa9\xcb\xa7\x95\xeb\x7e\x75\x78\x48\x36\xb7\x2b\x02\x55\x95\x08\x73\xa9\x6e\x39\x98\x93\x36\xf6\xa9\x63\xc3\xea\xda\x76\xc7\x3f\x6b\x3f\x9d\xd6\xdb\xb5\x31\xa5\x4a\xbd\xf4\xea\x49\xca\xc3\x34\x8d\x91\x41\xc8\x9a\x82\x67\xe2\x73\xc4\xb6\x76\x11\xbf\x5d\x08\xf3\x10\x39\xf5\x38\x98\xfb\x31\x20\x51\x91\x2a\x71\x2c\xf8\x97\xec\xf0\x2e\x46\x21\x35\xda\xfb\x39\x74\xf7\x75\x9a\xfb\x8c\xf3\xe2\xbd\xab\x6f\xc7\x92\x4a\x9d\xbb\xd4\xb8\x27\xd5\xda\xf6\xdb\xca\xdd\xb3\x03\xe8\x55\xed\x89\x63\x30\x50\xb5\x29\x52\xb4\xe6\xc9\x0e\x0c\x0b\x34\xdb\x24\x42\xc7\xe3\x1c\x87\x13\x1d\x9d\xb2\x63\xf1\xa1\x50\xd6\x21\xde\x35\x4d\xb4\x29\xbc\xd7\x1e\xcb\xff\x15\x26\x2c\x56\xfb\x03\xb5\x4b\xaf\x72\x2f\x75\x9c\x1e\xee\xc6\x46\x09\xa6\xb4\xfd\x09\x4f\xa9\xd3\xba\x6f\x22\x51\x78\xac\x02\xe4\x08\xc6\xcd\xa9\xbc\xd3\xc9\x0b\xd2\x23\x7d\xb2\xb9\xdd\xf1\xc6\x38\xec\xe3\x69\x94\x8c\xbd\xa2\x2b\xe4\x85\xb5\x3a\x8d\xd6\x17\x9e\x28\xa8\xc2\x02\x83\x58\xe2\x25\xdf\x68\x04\x48\x69\x5f\xb5\xe5\x3d\x15\xec\x55\xb3\x9f\x2f\x73\x19\x6a\x88\xa3\x32\x97\xb1\x06\x08\xe3\xec\xb4\x46\xf3\xe6\x2e\xfd\xf4\xc7\x11\x90\x2f\x22\x06\x9f\x53\xd8\x3d\xbf\x48\x9b\xf4\xc9\xa7\x4a\x9b\x17\xb3\x8d\xab\x4f\x93\xb8\xdb\xdb\x7d\x88\x26\x2f\xc7\x70\x9a\x6a\x83\xe2\x3c\xf9\xc2\x16\x2f\x38\xbc\x87\x60\xf0\xf2\xe4\x77\x6d\xf0\xb2\x8e\xfc\x76\xcf\xe6\x04\x32\xa5\x74\x5d\xb3\x4f\x7c\xc0\xc6\xd0\x58\x08\xe2\x9d\xd1\x37\x90\x55\xa2\xc6\x34\x6d\x7b\xaf\x0a\xba\xa9\x13\x0b\xec\xb3\x06\xf9\x6a\x9a\xc6\xf6\xee\xb6\x0b\xd7\xd4\xb6\x3b\xf4\xdf\x65\x62\xba\x66\xbb\x8c\x85\xf3\xbf\x2d\xa9\xea\x87\x85\x5c\x68\xdc\x8a\xbd\x85\x17\xf4\x9d\x47\xef\xb6\xd6\x3c\x07\xf1\xde\x7f\x33\x16\xb4\x0c\x02\x32\xa5\x43\x9e\x45\xe8\xb8\x71\x74\x7c\x4c\x58\xfa\xab\x34\xd2\x86\x44\x23\x1b\xf7\x93\xed\xae\x29\x2d\x1d\x38\x65\xf5\x49\xb0\xdd\xeb\xfd\x8f\x93\x5a\x0e\xb9\x56\xd3\x48\xb0\x39\xe6\xff\xdd\x0c\x27\x13\x1a\x66\x61\x1a\xd1\x40\xe7\xf9\xc2\x54\x5d\x63\x7e\x49\xc9\xf7\x2c\xa3\x43\x7e\x4d\xa2\x69\x5e\xf0\x31\x8e\x52\xd7\xbf\x02\x07\xed\xda\x26\xbe\x67\xd7\xe4\xf8\xf8\x3d\x61\x79\x3e\x55\x95\x0c\xac\xd7\x5b\x4e\x0b\x23\x4f\xf9\x65\x44\x53\x02\x87\x23\x8c\x0a\x41\xd3\xfe\xdf\x94\x45\x17\xc9\x0d\x06\x95\x28\xe8\x75\x41\xa2\x30\x25\x34\x8d\xc9\x74\x42\x14\x3b\x6e\xf9\xf6\xfd\x08\x6b\x22\xbf\x08\xd8\xa0\x20\x03\xaa\x21\x09\x85\x4c\x44\xaa\xc2\x34\xa7\xd9\xb1\x5c\x1d\x37\xd5\x99\xf4\x92\xeb\x93\xa0\x67\x65\x95\xf3\x53\x6c\xa1\xbb\x1e\xd9\x99\x5c\x93\x5e\x69\x1f\x8c\x6f\xdc\xe6\xcc\x26\xda\xba\xf6\x98\xa5\xbf\x60\x03\x35\xf9\xe7\xc4\x2c\x8f\x39\x61\x05\x89\x39\xcd\xc5\xfc\x22\x9e\x24\xe1\x24\xa7\x6a\x56\x23\xd7\x07\x9f\x8e\xa5\x73\x5e\xab\xba\x45\xb2\x49\x76\xda\xfe\x30\xa2\x69\x96\x43\x62\x34\x48\x3b\x6e\x25\x46\x0c\x1e\xf5\x51\x1e\xdb\x77\xc5\x84\xc7\x23\x7e\x85\x6e\x9b\xac\x08\x72\x92\xf2\x82\x84\x29\xee\x18\xe4\x24\xd2\xb0\x0d\xf9\x0c\x75\xa2\x26\x48\xd9\x03\xde\x8b\xd9\xf9\x20\x14\x2f\x7e\xf9\xff\xdd\xde\x5e\x1b\xbc\x18\xa1\x7c\x67\x6f\xaf\x43\xcc\xff\xe0\x57\x2b\x59\x1d\x9c\xc4\xf7\x61\xcc\xc4\xb3\xab\x67\xf2\xd0\x1d\x8d\x32\x48\xd2\x66\xe1\xb4\x7e\xce\x97\x4f\x00\xba\x65\x61\x63\x66\x11\xe0\x0c\xc1\x27\xf1\x52\x70\x56\x23\xaa\xc8\x29\x67\x46\x25\x96\xe4\x78\x14\xc6\xfc\x0a\x90\x4b\xfc\xdf\xff\xea\xf5\x7a\x41\xfd\x40\xde\xbc\xde\xde\x26\x61\x96\xf1\x2b\xd3\x7d\x7f\x73\x9c\x6f\xd2\xeb\x49\x98\xba\xb9\xed\x4c\x3a\x4c\x93\x94\xb2\x94\xc0\x4e\x20\xbc\x78\x6f\x98\x8a\x0a\x67\xc1\x28\xdf\x9c\xe1\x70\x18\x66\x0c\x46\xac\x82\x31\x6c\x98\x49\xa8\xa2\x3e\x09\x68\x92\xb0\x49\xce\x72\x73\x06\x46\xac\xa0\xc7\x93\x50\x9e\xf6\xab\x2c\x9c\xe8\x6f\xdc\xd4\x1b\x41\x72\x78\xfd\x25\x61\x29\xfd\xc7\x1d\x90\xd7\x9e\x65\x39\xbd\xa4\x46\x69\xf5\x66\xb0\xc1\x59\x64\xa7\xf2\xb3\xc8\xac\xca\xc3\xa7\x07\x99\xe1\xf8\x7a\x3a\x1b\x28\x9f\xf4\xc9\x13\x7d\x6e\x6a\xd3\x22\xea\x34\x12\xfa\x24\xc9\xa3\xb5\x09\x7a\xb3\x5c\x93\x50\xb1\xfa\xaf\x38\x10\xae\x84\x47\x17\x64\x02\x50\xa8\x5d\xcb\x09\xc7\x08\x1f\x92\xc0\x09\x56\x1a\x53\xae\x89\x09\x74\x8d\x88\x60\x65\x29\xff\xd0\xb9\x42\xfb\x56\x2b\x97\xea\x89\xf2\xf3\x66\x49\x42\x04\xd6\x8c\x43\x88\x90\x92\xdc\x20\xb9\x2d\x48\x18\x45\x3c\x8b\x65\xb6\x37\x18\x21\x88\xc5\x59\x0a\x81\x46\x8a\x11\x9a\x83\x81\x17\xa5\x14\x6a\x5d\xb1\x5c\x40\x99\x84\x82\x05\x49\x68\x98\x17\xe5\xde\xe5\xec\x81\xb0\x58\x61\x2c\xa7\x05\x97\xb4\x73\xa1\x8c\x83\x7c\x02\x17\xb1\xf4\x34\x46\x0f\x4c\x3e\x99\x26\x61\x41\xed\xde\x04\x43\x29\xf3\xd9\x1d\x85\x29\x4c\x53\x50\x11\x63\x4b\x88\x8e\xa1\x67\x29\x5c\x41\x67\x84\xe5\xe8\x01\x03\x09\xcf\xce\xb0\x93\x0a\x18\xb1\xc0\x0d\x46\x88\x7f\x7d\x4f\xc3\xf8\x5d\x9a\xdc\x48\x86\x67\xf1\x68\x9c\x6e\x0b\xed\x2e\xcb\x25\xdb\x19\x37\xc6\xe6\xb4\xe0\xbe\x64\x50\x4a\x2f\xae\x94\xbe\xc8\x05\x36\x89\xe5\x93\x04\x4f\x5c\xed\x97\x82\x77\x18\x12\x56\xe4\xf8\x06\x85\x70\x6c\xe3\x49\x71\x23\x77\xed\xdf\x7c\x0a\xdc\x03\x4f\x93\x1b\xc8\x3f\x28\x70\x4d\x85\xd8\xd2\x5b\xa2\x03\x44\xb1\x9c\x9c\xc1\x06\x9e\x91\x96\x12\x33\x3b\xf9\xe9\x44\xbf\xaf\x45\xfb\x0b\xe0\xdb\xcb\x94\x9c\x01\xd3\xab\xe3\x4c\x1d\xc0\x3d\x0e\x17\xe6\x28\xbc\xa4\x32\xb0\x57\x48\xc6\x61\x41\x33\x16\x26\x9b\x53\x06\x31\x82\xd8\x90\x45\xaa\xae\x19\x06\x1c\x81\x25\x13\x23\xde\x35\x29\xe2\x6a\x13\x22\xb6\x17\x8e\xd8\xe5\xae\xa3\x59\x13\x28\x5f\x26\x5a\x97\x87\x6b\x26\xea\x9a\xc9\xa7\x28\xe8\x59\x48\x10\x57\xc8\x19\x62\x63\xc5\x10\x10\x60\xb1\xac\x85\x48\x69\xcf\x00\x75\xcf\xc8\x78\x9a\x03\xe7\x1a\xa6\xe2\xea\x0f\x6f\x80\x8a\xe8\xc8\x6a\x30\xa0\x7c\x3a\x81\xd7\xc8\x78\x9a\x14\x6c\x92\xa8\xc3\x01\xf9\x7f\xef\x01\xe3\x55\x37\x0b\xcc\x6a\x46\x44\xd9\x9a\x68\xb2\x8b\x87\x77\x7b\x4f\xf5\x3d\xa8\x09\x04\xac\xe3\x7d\xac\x03\xaa\x07\xff\x85\x52\xae\xb9\x6d\xa0\xc5\x45\x83\xc9\x39\x65\xa6\xb2\x4c\x11\xe1\xa1\x4c\x7c\x9a\x16\x19\x4f\x12\x1a\x57\xe5\x40\xbd\x6c\xec\xcd\x0a\xe0\x76\x5f\xb7\x46\x73\x18\xe7\x19\x62\xf4\xe6\x20\x6f\x2a\x6e\x9b\x7e\x11\xe3\x8b\xac\x35\x31\xe1\x1b\x04\x1f\xa3\x6f\x77\xd4\x5a\x4c\xf2\xae\x2e\xd1\xcc\x97\x51\xb5\x56\x6b\x5a\x4d\x00\x82\xca\xf8\x03\x36\x4d\xd7\x30\x76\xa1\x02\x64\x52\x90\x84\x10\xf0\x4b\x7d\xb2\x89\x8f\x86\xb0\x0b\x15\xa0\xa4\x21\x0a\x04\x7f\xea\x57\xa0\x3a\xd2\xea\xb3\x2a\x50\x00\xfa\x9c\x68\x08\x5d\xa2\x19\x55\x83\xa7\x1a\xc8\x2a\xd3\xec\xf8\x62\x7a\x60\xad\x06\xd6\xab\xdf\x90\xc8\xd0\x5e\x3b\xf1\x1b\x56\x4a\xfc\x61\x2f\x88\xf8\x9d\x4a\x51\x06\x09\xd4\x44\x55\x4c\x02\x1d\x76\xc0\x1a\xba\xca\x9d\xb7\xb5\x45\xde\xa4\x79\x41\xc3\x58\x30\x86\x67\xf2\x22\xf9\x46\x9e\x01\xe8\xe3\xdb\x33\x41\x71\xe0\x62\x85\x60\x79\xc3\x84\x5e\xb3\x01\x4b\x98\xe0\x0a\x36\xc8\xdc\xfa\x2f\x74\x49\x96\xf2\x53\xcf\x5a\xa4\x21\x3b\x20\xa2\x06\x39\xc1\x09\x07\x1f\xdb\xe2\xef\xb7\xea\x66\xff\xf9\x4d\x9f\xdc\xf0\x29\x0e\x6f\x92\xf1\x4b\x16\xd3\x58\x50\x7c\x96\x5e\x86\x09\x93\x34\x4c\x93\x4c\x86\xf7\x9d\x22\x53\x5d\xb1\x2a\xbf\x50\x19\x61\x49\x54\x53\xd1\xdf\xd5\x31\x56\xec\xb2\xba\x29\x0d\x61\x09\x3e\x76\x7f\xe5\x2c\x6d\x05\xff\x49\x83\xb6\x38\xdc\x90\xa6\xbc\x07\xab\x3a\x8f\x9e\x56\xce\xab\x51\x17\xbf\xb5\x45\xde\xf2\x5c\x27\xf2\x96\x41\x9c\x72\x02\xb1\x05\x45\x2b\x10\x32\x85\x9c\x59\xd2\x60\x64\x6c\x44\x4d\x41\x2e\xe5\x17\x6b\xdc\x90\xbe\x57\x45\x27\x7c\xf9\xd3\x1b\x22\x1e\x96\x13\x41\xf9\x39\x48\xd8\x72\xe4\xc9\x8b\x91\xb8\xa6\x07\xe2\xed\x05\x9f\x04\x0e\x1a\xf6\x1d\x4f\xef\x91\x49\xd7\xe5\x88\xad\x5d\x83\x03\xcd\xb1\xda\x08\xbb\x61\xf4\xf0\x4a\x55\x0d\x4d\xce\x8e\xb5\x80\x74\xe3\x85\x7c\xb8\x58\xd4\x03\x8f\x72\x1f\x52\x38\x6a\xe7\x0d\xf3\x9c\xa9\xa5\x74\x7d\x52\x43\xe2\x74\xbc\x85\x2a\xda\xd6\x27\x55\x44\x4d\xf1\x2c\xd5\x94\xa8\x4f\x6a\x49\x50\x9f\x34\xd1\x9e\xbe\xfd\x03\x1f\xa8\x6d\x88\xeb\xd9\x3e\xd8\xb8\xdd\xd8\xc0\xb5\xaf\x0a\x22\x60\xcd\xdf\x4e\x97\x66\xcd\x42\x17\x4b\x2e\xb8\xd9\xb2\xe4\xd4\xdb\x60\xb0\x56\x00\x7d\xb0\x9a\xb9\x6e\xcf\x4c\xda\x64\x5f\x93\x03\x1d\x4f\x99\x34\xd3\x09\xb0\x24\x58\x41\x4e\x34\xd9\x12\xb9\x6d\xb7\xa4\xd6\xf1\x7e\xd4\xc0\x7b\x6b\x45\xe2\x1f\x44\x91\xe8\xae\x62\xdd\x18\x9e\xd5\xc0\x37\x75\xed\xb5\x6c\x69\xb9\x86\xf5\x99\x57\x20\xa6\xcb\x3d\xaa\x38\x4d\x32\xdc\x3a\x47\xe2\x0a\xd0\x46\x6f\x65\x0d\xf5\x79\xd3\x0c\x89\x85\xaa\x43\x98\x27\x2e\x58\x63\x86\x21\x01\xa0\xc1\x3f\xdc\x4c\xf8\x79\x16\x4e\x46\x75\x0a\xb1\x27\xbd\x0a\xd8\xa6\xf6\x0d\xd4\x43\xd3\x5b\x7e\x36\xe7\xe4\xe5\xf5\x77\x88\xe0\x9c\xa3\x5b\x28\x04\xe9\x04\xcd\xc6\x1c\xea\x8e\x38\xcc\x2e\x40\xbf\x81\x45\x07\xb2\xbe\xd1\x99\x1c\xf1\x84\x67\xa5\xa6\xf2\x51\x18\xd3\x1c\x1e\x7f\x1f\xbb\x06\xd8\x98\xae\x54\x6b\x15\x5b\x30\x4a\xcb\x55\x52\x4a\xa4\x5f\x83\xa8\xb9\x2f\xf8\x75\x56\xb0\x30\x09\x1a\xa5\xdb\x32\xcc\x56\x16\xe6\xc5\x07\x7a\x5d\xb4\xbc\xc1\x6a\x53\x45\xaf\xbc\xef\x17\x78\x9c\x4a\x9f\x04\x82\x59\xd7\x7d\x87\x09\x3b\x4f\xdf\x14\x74\x2c\x06\x16\x51\x47\x29\x25\x00\x7f\xc9\xc2\x49\x9f\x04\x8e\xaa\xc1\x68\xf1\x9e\x4e\xae\xeb\x95\x70\xbb\x32\xec\xa6\x54\x08\xcc\xca\xe5\x8c\xc9\xb7\xb1\x25\x70\x57\x81\x65\xcb\xbb\xd3\x49\x2b\x18\xc7\x41\xdb\xb0\x70\x46\x99\xb7\xb3\xbf\xaf\x39\xaa\xf0\x5a\x16\xee\x3d\xd5\x85\xae\xae\x6a\x47\xf2\x49\x4b\x0f\x25\xe6\x57\xa9\x3f\x18\xb1\x48\x7f\xcf\xf8\x55\x9f\x6c\xeb\xe6\xa1\x01\xb9\x43\x63\x9a\xe7\xe1\x39\xb5\xb4\x20\x6a\xf5\x2a\x16\x0d\x15\x9f\x3d\x47\x87\x12\x46\xa8\x33\xf9\xb4\xfc\x46\x8e\xc3\xec\x9c\xa5\x3f\xd0\x61\xa1\x95\x51\xee\x60\xf0\x53\xf5\x2e\xba\x8d\xbc\x47\x3d\xcd\x66\x19\x76\xd5\x5a\x12\xf1\x56\xc1\xb9\xcb\x08\xe9\x62\xd6\x96\x5a\x42\x2e\xcb\xef\xda\x68\xf2\xcb\x29\x00\x56\x13\xc3\x00\xc2\xeb\x23\x82\x57\x6e\x92\x46\xfe\xcf\xbc\x4b\xb6\x36\x66\xe9\x8a\xfd\x2f\x85\x17\xd6\x20\x7c\x19\x5e\x1a\x46\x17\x83\x30\x93\x01\x18\x4b\xc2\x3c\x19\xcf\x50\x49\xf2\x30\xb3\xfe\x7c\x52\x3a\xdb\x55\xa2\xc6\x53\x42\xed\xb4\x96\x9e\xe1\xef\x3b\x8b\xbc\x70\x87\x5d\x19\x97\xe3\x02\x21\x3b\xd2\x6e\x0f\xf3\xbb\x3c\x48\x9e\xcf\x15\x3f\xcc\xf0\x75\xb0\x52\x8e\xdb\x7c\x9d\xef\x33\x31\xa2\x61\x9c\xb0\x94\xbe\x0d\x27\x13\xa0\xe7\x9f\x2c\x13\x89\xf8\x66\xbb\x8f\xc9\xe7\x7d\x03\x04\xe9\x45\x11\x26\x34\x2b\x62\x16\x26\xfc\x5c\x13\xe3\xfc\xff\x4d\xc3\xcc\xb2\xb1\x15\xff\xd1\x84\x5e\xca\xd8\x7e\x4f\x4b\x5b\xd5\xb7\x62\x63\x20\x6f\x6e\x66\xa3\x02\x43\xe2\x5d\xa6\xab\xb4\xd5\x6d\x6c\x3b\x3c\xcc\xe5\x3b\xe2\xa4\xd2\xaf\x4c\xa3\xaf\xf0\xe3\xd6\x43\x18\xf8\xd5\xb6\x6f\x33\xf2\x62\x55\x7d\xca\xf6\x74\x97\xf8\x1b\x7b\x24\x7d\x10\x46\x6c\x80\x99\xff\xed\xc6\x86\x77\x7a\x96\xb2\xd8\x57\x31\x38\x3e\xcd\x4d\x77\x1d\x8d\xef\x1f\xe2\xde\xda\x98\x83\x99\xa3\x43\xe7\x3c\x37\xae\xd0\x1c\x0c\x99\x69\x4e\xd2\x84\xc6\x4b\x6a\xde\x06\x15\x5d\xe9\xac\xef\xa7\x25\xef\x27\x60\x76\xe9\xb0\x5d\xeb\x80\xb1\xa0\xc4\xce\x3d\xa1\x28\xba\x73\xcb\xee\x49\x86\xf7\x74\x2d\xc3\x5b\x5e\x86\xf7\xf9\xc5\x66\x0f\x4a\x6a\x88\x71\xac\xd6\x62\xba\x06\x31\xdd\x9f\x57\xd6\xf5\x30\x1d\x07\x16\x19\xda\xbb\x8c\xd1\x54\xe6\xa3\xa9\x39\xd9\xcf\xe7\x1e\x9f\xdd\xd8\xbd\x89\x0a\xab\x4c\xfd\x25\x87\x68\x27\x98\xfb\x34\x9f\x10\xc4\x93\x95\x48\x09\x48\x3d\x5c\xf0\xa8\x0f\x51\x1c\x36\x41\x89\xe8\xd8\x11\x3b\x3d\xf5\xfc\xa7\x41\xf0\xa8\x9f\x84\x4d\xf5\x64\xd7\xba\xa2\x23\x26\x4a\x0a\x9a\xa1\xca\xed\x07\xb1\x15\x7d\x47\x42\xd5\x27\xda\x6d\xb7\xc9\xd9\xc1\x16\x14\xf5\x56\x2d\xd0\x39\xa6\x45\x2e\x85\x1a\x74\x42\xc2\x9c\x60\xb0\x88\x2e\x79\x93\x93\x89\x60\x14\x51\xc0\x21\x26\x5f\x29\xe6\x40\xf0\x25\xb3\x5c\x8a\xde\xd1\x05\x22\x45\x73\xda\x1b\x72\x5c\x50\xd0\x72\x83\xc9\x12\x98\xd7\xe7\x53\x29\x68\x81\xec\x7c\x62\xa8\xfe\xaa\x1a\x33\x01\x33\xac\xd2\xc2\xcf\x3d\xc0\x63\x9d\x79\xf0\x4c\x0c\xe6\x8c\xe4\xd3\xc1\xa6\x99\x3a\xc9\xa7\xd1\x48\x2c\x14\x7c\x85\xc6\xcf\x3a\xf8\x43\x32\x43\x67\x7f\xbe\x38\x9b\x5f\x44\xce\xf5\x36\xcc\x2e\x1c\xd4\x15\x9b\x94\xd0\x82\xc6\x73\x63\xaf\xae\xb1\x2c\x02\xff\x84\x9d\xc4\xfc\x2a\x25\xc3\x8c\x8f\x35\xfe\xb2\x61\x19\x4d\x59\x4e\xc2\x24\xe7\x24\xa7\x85\x3d\x84\x34\xa5\x51\xc1\x17\x4e\xf6\xfe\x7b\xb0\x6c\x2d\x6d\x91\x72\x55\xe8\x48\x6b\x7a\xb1\x1c\xb2\x0c\xe0\x06\xd3\xa2\xe0\x29\x61\x43\xac\x0f\xc7\xea\x3b\x28\x3b\x43\x83\x18\xdc\x4b\x3e\x94\x87\x73\xee\x9d\x36\x3e\x12\xcb\x6d\xf4\xcf\x39\x66\x3d\x52\xa4\x6a\xc8\x33\x82\x36\x7d\x4e\x06\x6c\x86\xc1\x1b\x66\xa4\x84\x6d\x3a\x0b\xe2\xb2\x59\x60\x90\xaf\x80\x17\x87\x20\x1a\x7a\x91\xd1\xfe\x3e\x4c\xec\x4c\xc4\x58\x72\x87\x6c\xc4\xdc\xf0\x08\x8b\x62\xaa\xc3\xab\x2c\x89\xad\x76\x1b\xab\xc1\x58\xab\xc5\x92\x55\x66\x41\x27\x55\x62\x5c\xcb\x86\x11\x7f\x1a\x3d\x8f\x77\xd4\x35\x98\xf7\x61\x55\xe6\x9b\x9a\x62\x8a\x89\xd5\x0b\x87\x35\x7d\x33\x20\xaa\xc4\x80\x48\xfa\x63\x81\xc8\x12\x4b\x4b\x09\x67\xc7\xb6\x13\xc5\x53\x2c\x01\x64\xac\x12\x6d\x23\x1a\xd3\x6b\xed\xe7\x14\xe6\xc6\x7a\x54\xfc\xd0\x82\x69\x87\x81\x95\xc1\x7b\x4c\x99\x06\x93\x98\x6b\x60\x64\xc1\x2a\x04\xdc\x68\x86\xe9\xef\x51\x83\x91\xa7\x23\x00\xd7\x4b\x89\x3f\xe4\xa2\x49\x5b\x50\x58\x1f\xb4\x03\x85\x00\x60\x24\x10\x93\x87\x80\x41\x66\x92\xf0\x53\xce\x47\xcb\xd1\x21\x10\x96\x25\xf7\x5f\x48\x9a\x4c\xf3\x13\xab\xfd\x8f\xb3\x44\x6e\x9f\x6e\x3b\x46\x68\xeb\xa3\x6a\x09\xab\xdb\x1d\x17\xef\xda\x8d\x36\x94\x65\xd1\xb1\x25\x38\xae\x93\xf6\x57\x86\x17\x9a\x25\x19\x9f\x2f\x0c\x90\x89\x74\xb3\x40\x74\x9e\x99\x11\x98\x14\xff\xeb\xd2\x83\x2a\x06\xb4\x8e\x14\x38\x5c\x48\xe9\x78\xda\x37\x97\x7f\xec\x94\x2b\x1f\x1e\xbf\xc7\xc4\x0a\x02\x84\xb7\x88\x7d\xde\x3c\x0a\x5e\x71\xd4\xec\x6b\x42\xfd\xa5\x5f\x43\x76\x34\x21\x15\x97\x4c\xe5\x5d\x32\x24\xe4\xd1\xa3\x32\x29\x7c\xf4\x88\x7c\x05\x54\xe0\xd1\xa3\x19\x4b\xae\xe9\x0e\xf9\x54\x3f\xd8\x39\x56\x16\xad\x2e\xa5\x7a\xa1\xa0\x93\x3b\xeb\x14\xe6\x78\xe4\x78\x0a\x85\xf9\x18\x4b\xbf\xd2\x32\xaa\x8b\xb9\x18\x1b\xaf\xce\x5c\xec\x80\xa3\xf0\x9c\x53\x76\xaf\x89\x6a\x43\xbb\xf3\xea\x01\x2a\xc8\xf2\x0a\x5a\xb5\x08\xfb\xef\xf8\x49\xb6\x90\x72\xe6\x01\xeb\x7a\xec\x2b\x74\x15\x9b\x6b\x5d\xc2\x7f\x84\xc7\xd4\xbc\xf3\xb6\xf8\x8d\x15\xac\xa2\xe2\x58\x1a\x1f\x31\xf3\x36\x26\xb9\x9e\x15\x0c\x4b\x33\x4a\xab\x69\xcd\xe1\xc2\xfe\x68\xef\x19\x4f\x03\x08\x97\x60\x95\xdb\x41\xe4\x39\x03\x58\xd7\x96\xed\x87\x20\x2f\x18\x5d\x64\xee\x0f\xe3\x33\xb0\xb8\x96\xb1\xdd\x12\xe3\xba\x27\xd5\xe1\xb3\xb5\xea\x70\xad\x3a\x5c\xab\x0e\xef\xd5\xc2\xff\xbe\x6d\xf1\x31\xce\x5a\x41\x27\x6f\xa2\x5a\x2d\xd7\xd3\x9d\xed\x12\x68\x63\x3c\x36\x09\xb3\xd6\x7f\x3e\x74\x25\xe3\x9c\xcd\x36\xe0\xc6\xf6\xee\xce\xdc\xa3\x83\x66\x3e\xab\xee\x73\x71\xcb\x71\x5b\xb3\xe8\xa8\x4c\x65\xd9\xa5\x20\x64\x91\x5d\xa2\x2e\x78\xad\x75\xe4\x69\xf1\x8b\x8c\x3a\xb4\xd7\xeb\xd9\x0d\x5a\x57\xff\x1c\xd0\x4b\x84\x1c\x3a\xc2\xe4\x37\x34\x33\xc3\x73\x8a\x7f\xe4\x2f\xcd\x8b\xaf\xa4\x07\xae\x55\xf0\x36\xa9\x5b\xdf\x3b\x2b\x2d\xd6\xf7\x95\xca\x2f\x0e\x99\x26\x92\xe9\x38\x0d\xe6\xd3\xd7\x16\xf4\xba\x78\x29\xf6\xa4\xce\x90\xff\x03\x9f\xd4\xc5\x31\x5b\xb5\xce\xd6\x57\xa1\xae\x15\xb8\x6e\x7c\x91\x94\x8c\x79\x5e\x90\x28\xcc\x69\x2e\xc3\x87\xb0\xf1\x04\xc3\x35\x85\x04\x5f\xa8\x44\xe6\x62\xc2\x20\x27\x05\x2b\x12\x0a\x3a\x1d\x70\xdf\x16\x1d\x3e\x00\x25\xee\x1f\xc6\x20\xd1\xdd\x9f\x23\x2b\xcc\x62\x0e\x8b\x5e\x11\x05\xe4\xcb\xa9\x95\x1d\xfc\xfe\x42\x3a\xe6\x95\xe8\x4d\xe1\xdc\x34\x28\x4f\xd1\x76\xe1\x3e\x35\xa8\x1f\x64\xb0\x36\x2b\x72\xd5\xe0\xc6\xcc\x0b\xce\x19\xd9\x24\x6c\x08\x21\xa1\x72\x6a\xa2\x0f\x89\xbf\x25\x31\xa9\xc2\x0e\x94\x7b\x2f\x76\x1c\x91\x51\x58\xf2\x38\x42\xe5\xd5\x1c\x0e\xe0\x3e\x57\xaa\x03\x2e\xa9\x6a\xd7\xda\xde\x45\xb5\xbd\x70\x16\x7c\x95\xef\xa9\x26\x20\x79\xc7\xfe\xb1\xa3\x9d\x5d\x1b\x95\xc2\x0f\x47\xc7\x3b\x5b\x81\x1b\x59\x5a\x58\xf1\x63\x41\x2d\xed\xc2\xfa\xef\x7a\xb5\xf0\xfd\xeb\x7b\x17\xd6\xed\x3a\xea\xdc\x48\xaa\x6d\x5d\x2d\x6e\x95\x0e\x59\x2b\x7c\xef\x59\xc3\x6b\x61\xa6\xe0\x14\x67\xeb\x6a\x6c\xb4\x56\x3d\x98\x0b\x46\xfd\x35\x5b\x92\x5a\xd5\x8e\xc1\x3d\x83\x98\xcb\xb5\x54\xc5\xcc\x57\xea\xa4\x17\x68\x3b\x70\xce\x54\xe0\xeb\xb3\x9d\x53\x8e\x5a\x4e\xc8\xc5\x25\x3a\x3a\x9a\x6b\xc3\xec\xee\x76\x16\xdd\x8d\x9d\x05\x95\xf1\xcb\x34\x7c\xd7\xfd\xb1\xc7\x88\xd4\x4e\x12\x41\x77\xf1\x76\xda\x5f\xca\x38\x00\x48\x59\x95\xaa\x79\xb6\x2b\x9b\x51\xc8\x2f\xe2\xcb\xe7\x3c\x62\x17\x31\xb8\xa8\x7f\xfd\x76\xc8\x57\xa5\xed\x6e\x6b\x55\xbc\xfc\x63\x46\x04\x20\x2d\x0c\x33\x41\x80\x3e\xcd\x69\x71\x50\x67\xd3\x20\xad\x0d\x22\xdb\x64\x60\xb6\x36\x5e\x8d\x1b\x27\xb0\xb4\x73\x63\x3a\x4d\x92\xf9\xa6\xae\xc7\xd6\xe4\x28\x4a\xc8\x27\xe0\x6b\xfa\x24\x00\xc7\x50\x9b\x16\xf4\xfd\x13\x6f\x25\xc0\x52\x97\x87\x2c\x68\x97\xee\xad\x79\x51\x6f\xee\xe1\x45\xe1\x44\xde\x32\x15\x9e\x96\xba\x5b\x6b\x88\xc1\x3b\x75\xe1\xa8\x41\x6e\xa8\xff\x35\x36\x11\xb0\x35\x5f\xc0\x30\x62\xa1\x77\xfd\x2a\xec\x23\x96\xb2\xc4\x58\xc6\xa8\xe2\x8b\xbc\x49\x96\x12\x11\xf8\x15\xe7\x16\x11\xac\xfa\x15\xe4\xad\xe0\xcc\x67\x8f\x6f\xc6\xf2\x60\x1e\x29\x4b\x6d\x43\x4d\xfd\xb9\x77\xe3\x7e\x1f\x49\x6b\xf3\x9f\xb5\x30\xaf\xce\xbb\x78\x6d\x7b\x74\xef\x36\x38\xd1\x12\x76\x29\x0f\x4a\xc2\xb5\x36\x10\x7a\xc8\x22\xb0\x0a\x03\x21\xe4\x08\xe7\xb1\x12\x2a\xf3\x70\x8b\x1a\x10\xe1\x4d\x5f\x67\x4f\x54\xba\xdb\x03\xa3\xed\x0c\x30\x40\xa9\x1e\xaf\x1d\xa3\x54\x15\x2e\x17\xa6\x14\xcd\x91\xf0\xb1\x75\x3f\x36\x49\xfb\x0f\x2b\x33\xe5\x6c\x23\xa3\xcf\x6f\x07\xf4\xe7\x89\x6a\x7a\x4e\x45\x71\xc1\xc5\xd1\x7c\x37\xac\x19\xc2\x7e\x0d\x78\x93\x85\x8b\x0b\xe9\x5a\x12\x1d\x85\x49\x72\x34\xa2\xd1\x45\xdd\x9c\x9f\xd7\xc0\x37\x4d\xd5\x6b\xd9\xb4\x00\xcf\x5e\x78\x45\xd7\x75\xb7\xdd\xab\x82\x6e\xec\xcc\x6a\x54\xd7\x9d\xf0\x3c\x67\x83\x84\x1e\xf1\x34\x2f\xb2\x69\x54\xf0\xec\x3d\x08\x9e\x6a\xfb\xdd\x9e\x5d\xb7\x69\x14\xf5\x1d\xea\x76\x65\xe8\xd8\xfa\xa9\x97\x41\x9b\x7a\xd4\xcd\xdd\x6f\x7e\xcd\xcf\x61\x9a\xf6\x21\x0b\x53\xf4\x76\xaf\x23\x28\x4f\x2b\x60\x1b\xcd\xc6\x34\xd4\x67\xb5\x7f\x2b\x74\xb7\xb5\x9d\x3c\xf9\x3c\x39\x74\xab\x43\x15\x9b\x65\x59\x26\xea\xc5\x07\x0c\xe4\xba\x92\xc8\x17\xd0\xd6\x0a\x8d\xbe\x1e\xa4\xb5\x9c\x59\x6e\x41\x0c\x07\x61\x74\x51\x77\x86\x7a\x73\x8f\xb1\xa2\xcd\xcf\x63\xa4\x16\x59\xd6\x5a\x52\x8c\xa8\x72\x2d\xea\x74\x70\xf5\xd9\xed\xcc\xc9\x50\x36\x51\xd6\x59\x91\xf2\xd0\x56\x80\x0d\x06\x6d\xdb\x02\x0b\x4c\xab\x6c\xbb\x32\x9d\xe1\x11\x42\xa4\xda\xa0\x32\x21\x82\x01\xdd\xda\x22\xff\x10\x2b\x54\x70\x72\x4e\x0b\xa3\x7f\x05\xbb\xa3\x90\xa4\xf4\x1c\xf3\x90\xa0\xc1\x96\x00\x4b\x79\x01\x2c\x27\x1b\xa2\x59\x02\x76\x06\x5c\xec\x54\x4a\x66\xaa\xcd\xf4\x2a\xc6\xf1\x26\x75\x56\xab\x22\x45\xe9\x52\x16\x60\x06\x03\x5e\x4d\xb3\x26\x53\x4c\x37\x39\x4e\xb3\x07\x7a\xf3\x7b\x02\xd3\x8b\x17\xb4\x3e\x15\xbc\x72\x64\x27\x84\x5e\xb3\x7a\x99\x1d\x82\x6d\x40\xf4\xdd\x86\x11\xb7\x30\xc3\x4a\xf0\xb1\xfd\xb1\xbd\x62\xf3\x38\x30\x25\x83\x74\xac\x0b\x9a\xad\x44\x18\xcb\x83\xa4\x82\x48\x60\x9e\x32\x95\x7b\x34\x5e\x9b\x86\xdd\x97\x69\xd8\x83\x09\xb7\x2b\xb7\xf3\x18\x6d\x05\x97\xc8\x29\x85\x35\x67\xe4\x92\xaa\xc0\x3a\x75\x77\x4f\x73\x99\x2e\x4b\xac\x00\x84\x2e\x17\x98\x28\x73\x7c\xbd\x86\xcc\xbe\xc6\x96\xb1\xe0\x90\xe9\x2b\x24\xaf\xde\xbd\xd5\x99\x71\x64\xaa\x2d\xc7\x76\x0a\x3a\x51\x4f\x62\x9d\x38\x30\x24\x67\x68\x3f\x76\xe6\x5a\xad\xc9\x78\xab\x4b\x79\xd2\x7d\xd0\x11\xdf\x97\xf7\xa6\x83\x36\x56\xea\x51\x27\x4a\xdb\xe5\x65\x97\x64\x5f\x66\xef\xd1\x57\x1f\xda\xb0\x56\x1d\x7b\x55\xa4\x32\xb8\x2e\x60\x5e\xd8\x9c\x78\xcf\x5c\x93\x84\xa5\x76\x58\x91\xf9\xf5\x22\x8d\x66\x5d\xe9\x6b\xa4\xeb\x8b\xed\x69\x15\x67\xb3\xe4\xd6\x56\x34\xb5\x9a\x1d\x2e\x37\x3c\xc3\xc8\x4e\xae\x05\x46\x7d\x5f\x2f\x87\x5c\x0e\xc1\x7a\xad\x57\x43\xac\x06\x30\x36\xeb\xa5\x90\x4b\xb1\x3e\x26\xb8\x1a\xc0\x8c\xdc\x89\xcb\x80\xf7\xd0\x42\x2d\xc0\xa5\xad\x98\x7f\xc5\x13\x98\x9b\xa2\x43\x58\x4a\xc6\x2c\x49\x18\xe6\xdd\xb6\x33\xa2\x8e\xc3\x1b\x99\x51\xf7\x06\xb2\xc9\xa5\xe7\x09\x25\x05\x1b\x53\x3e\x2d\x30\x1b\xa7\x73\xe9\xe4\x1d\xc1\x36\xb0\x34\x66\x97\x2c\x9e\x82\x4b\x07\x3e\x9e\x40\x2c\x41\x23\xc9\x46\x18\xdf\x8f\x82\xcb\x87\x99\xf8\xcb\xcd\x8d\x1d\x85\x49\x24\x13\x4b\x9b\x4b\x4d\x74\x4d\x06\xa1\x60\x6e\x78\x2a\xef\x5d\x73\xcd\xc9\x81\xcd\x93\xfc\xf3\xae\xef\x9b\xf9\x5f\x38\xf3\xbd\x71\x64\x8e\x91\x39\x5f\x39\xfa\x11\x78\x24\x39\x09\xfb\x65\xde\x3a\x05\x6c\xfd\xab\x16\xe4\xe0\xf3\x1c\xf4\x17\x5a\x54\x68\xb4\x17\xaa\x89\x0e\x29\xd5\x03\x13\x3c\xdd\xae\x02\x6c\xa9\x48\x38\x96\xb3\xab\xfe\x59\xd0\xf1\xa4\x43\x4e\x8b\x11\xcb\x41\x45\x54\xc8\x8f\xc6\x0e\xce\xc8\x84\xcd\x18\x10\x5c\x75\xd0\x96\x75\x04\x7e\xb5\xa0\xd5\x04\xac\xa0\xc3\xec\x7c\x0a\x69\xc7\xbb\x09\x4d\xcf\x8b\x51\x47\x94\x88\xe7\x1b\xe4\x5d\x6d\x09\x28\xb1\x86\x17\xf4\x86\x1c\x92\xde\x01\xfe\xf5\x0d\xd4\xc6\x1f\x8f\x1f\x9b\x20\x3e\xa2\xea\x89\x28\xfc\x68\xb7\x8c\x25\x32\x3c\x0d\x8e\xc2\x98\x20\x82\x16\x08\x66\x88\x7f\x8c\x58\xae\xf4\x42\xf5\x52\x60\x7f\x92\xca\xfc\x49\x4d\xb6\x7b\x2a\xa8\x49\xc1\x4f\x4f\xc9\x6f\xbf\x61\x63\x9e\xac\xbe\xbc\x55\xed\x36\xa8\x90\xba\xe2\x4d\x73\x23\x15\x8e\x27\xa2\xf9\x8f\xdd\x88\xa7\x51\x58\xb4\xc4\xec\xda\xa0\xa5\x13\xc5\xea\xdf\xae\xca\x01\x79\x88\xe6\x70\xb2\x54\xa0\x55\xa5\x98\x40\x2b\x74\x14\xe4\x28\x4c\xe3\x84\xc2\x45\xef\x60\x9c\x78\x5b\x98\xa5\x85\x97\x06\x10\xba\xae\xe4\x8c\x0f\x65\x7d\x65\x5f\xee\xb0\xbf\x72\xb7\x09\x61\x43\xb9\xaa\x12\x4e\xb2\x14\x6d\xcb\xf0\xb0\xe2\x33\x76\x7e\xa0\xcc\x04\xa5\x64\xa5\x3c\x60\x78\x88\xd5\x8e\x19\x91\x77\xc4\xf2\xbf\x4e\xa4\x4c\xc0\xea\xca\xd8\xc6\x69\x1a\xa3\x00\x10\xbc\x2b\x4b\x1d\x40\x41\xa7\x7d\x30\x51\xa6\xe7\x2b\xfa\x94\x3b\xf2\x0f\x77\x9d\xd4\x3e\xbd\x70\x7f\x77\xa3\x84\xd1\xb4\x90\xc0\x7d\x99\x84\x54\x2d\x9d\x1e\x99\xb8\x24\x81\x54\xd8\x2b\x27\x3a\x53\x97\xc0\x8e\xce\x8a\x65\x8b\xd5\xce\x69\xf1\x72\x5a\x70\x6c\x5d\x61\x41\xcb\x19\xa0\x5e\x66\x67\x93\x8b\x2a\xdc\x31\x7d\x3d\x26\xc1\x38\x0f\x0e\xbc\x3d\xac\x45\x3a\x5d\x51\x6f\x29\xa1\x49\x4e\x71\x8a\xc8\x40\x38\x33\x45\x02\xea\xcc\x75\xd6\xd8\x54\x7d\x77\x64\x76\x3f\x08\xb0\x44\x9b\x5d\xb8\x16\xaa\x5b\x36\x8d\xc9\xac\xad\xca\x7c\x12\xdf\x6e\x57\x61\x26\x5e\x6d\x18\x8b\x31\x0a\x73\xda\xd5\x38\xdd\x70\xb0\x5c\x04\xc2\xe4\x5c\xb3\x4e\x14\x48\x16\x1a\x0f\x15\x4b\xcf\xe7\x3d\x57\xe0\x16\xb2\x08\x29\x40\xdc\x9c\x35\x46\x1a\xcf\x18\x22\x8d\xe7\x19\xe1\x35\x2b\x66\x9c\xfa\xbb\x9e\xc0\xd5\x6d\xcd\x35\x2b\x1a\xe6\x7c\xcd\x8a\x39\x27\xbc\x10\xa5\xdb\x59\x90\xd4\xed\xcc\x49\xeb\x76\xd6\xc4\xee\x4f\x40\xec\xae\x59\x4d\xc3\xf7\x42\xeb\x96\x64\x22\xf0\x48\x34\x1f\xad\x59\x04\x2f\x8c\xe3\xd7\x69\xfc\x03\xcb\x0b\x9a\x56\x30\x3f\x1d\x92\xd2\xeb\xc2\x3d\x64\xe6\xf8\x58\x19\xc3\xab\x86\xd8\x8c\xcb\xde\x29\xac\xc3\xa5\xdf\x7e\x33\xc4\xa8\xb4\x07\x7e\x1b\x4e\xbf\x07\xfe\xd2\xe7\xb4\xf8\x80\x9f\x5a\x62\x56\x1d\x55\x5d\x85\x6d\xec\x20\x9b\xaf\x2c\xe1\xe6\xe1\x7d\xad\x07\x01\xb4\x02\x7d\xe1\x9b\xc0\xb2\xdb\xa8\x7a\x94\x9c\xe0\x2c\x2e\xe8\x4d\x5f\x25\xb6\x97\x6a\x42\x69\x8f\xa4\x37\x02\x3f\xb6\x2a\x28\x1d\x92\x00\x96\x3b\xc4\xe8\x54\x31\x7a\xd5\xc4\x0f\xb5\x3e\x62\xc5\xa4\x27\x22\xfc\xb6\x21\x2c\xff\xcc\xd3\x6a\x07\x4d\xe2\x38\x69\x9e\x56\x7a\x69\x12\x2f\x4d\xdb\x69\x8d\x9b\xa6\xf8\x4f\xbf\xcc\xa4\x47\xe7\xa9\xf1\xd7\x84\x62\xa7\x4d\xf7\x7c\xd8\xd0\xce\x07\xbb\x8e\xbc\x59\x0d\xac\x2c\xa8\x80\xc1\x3b\xe6\xd4\x67\x1a\x2a\x20\x81\x3f\x38\xf5\xae\x6e\x0f\x0e\x6f\xe9\x53\xfb\x40\x96\x21\xfc\x2e\xb1\xc8\x86\x43\x4d\x8f\x86\x81\x9f\x35\x17\xda\x6c\xb6\xdd\xe2\xd8\x9d\xb1\x2c\xe6\x3f\x7a\x6a\x1c\x48\x01\x81\x16\x71\x20\x85\x3d\xc5\x1f\xce\x96\x81\x53\x28\xae\xa4\xf5\x27\x4b\xcf\xad\x5f\xe8\x6d\x8a\xab\x64\xfe\x92\x30\xb0\x30\xe2\x0f\x39\x7f\xf8\x53\x4c\x54\xbb\x98\x92\x86\x30\xb7\x75\xde\x48\xc6\xd4\xa6\xec\x8d\x34\x33\x0e\xae\x51\xb3\x96\x0f\x9a\x23\x69\x2f\xbf\xea\x2a\x40\xcb\x70\x95\x88\x59\x06\xab\xc2\xcc\x52\xbf\x65\xc4\xd3\xe2\x5e\x17\xca\xa1\x27\xce\x05\x22\x41\xdd\xc2\x12\x2a\xf7\xeb\x5d\x19\xc7\x2c\x55\xca\x23\xff\xa4\xdf\x76\xb0\x76\x5b\x37\xe7\xb9\x38\x8a\xff\xcc\xf5\x95\x17\x61\x41\xed\x0b\x67\xd1\x9d\x27\x3e\x65\xea\x38\x9f\x3e\x39\xbf\x16\x74\x8e\x8c\x96\x71\x8c\x94\x36\x20\x62\x19\xc2\x42\x6a\x11\x65\x59\xd0\x2e\xa5\x4d\x34\x8b\xe4\xfc\x5c\x60\xf2\x9e\xa7\x61\xdd\xc4\x49\x95\x03\x9e\xe4\x38\xfd\xba\x62\x0f\x86\xce\xdd\x36\xf4\xd8\x78\x67\xac\x70\xc9\xd9\xd2\x1d\x1e\xd3\x83\x12\xe0\xad\x57\x72\xeb\xf7\xba\xd0\x9c\x6b\x66\x5d\x93\xd2\xd1\x36\x72\x29\x77\x5c\xf2\x8b\x54\xff\xb9\x5b\x64\xff\xb2\xb8\x73\x35\x2f\xc5\x9f\x08\xfe\xe2\x23\xfc\x90\x88\xac\xb8\x89\x83\x8d\xdb\x56\x29\xf8\xb7\x2d\xed\xd4\x42\xb9\x2a\x33\x76\x49\x9f\x1c\x5b\x75\xa9\xe2\xd6\x2b\x51\xd2\xec\x06\xbd\x09\x06\xe5\x32\xb2\x69\xfb\x19\xa2\xf8\xff\x6e\x5e\x84\x69\x1c\x66\x90\x1b\x76\xa9\x84\x7b\x1b\x04\x44\xed\x1f\x50\x3b\xa0\xb2\x8d\x9a\x2c\x7c\x6a\x6a\xc1\xc6\xad\x25\x48\x3c\x28\x19\x99\x3f\x5f\x07\xbe\x5c\x07\xbe\x7c\xa0\x81\x2f\x6d\x77\xe3\x6a\x55\x49\x09\xb2\xa9\x71\x0d\xf4\x87\x8b\xac\x39\xa2\xc9\x84\x66\xb5\x93\xf8\x3c\x56\xc5\xbf\x77\x7b\xdc\xdf\x81\x1d\x33\x64\x0c\xbb\x2e\xe4\x0d\x55\x84\x83\x99\xba\x65\x3f\x0d\xf9\x22\xc6\x92\x18\x49\x71\x86\xf9\x68\xeb\x44\x47\x70\x84\xa7\x0e\x8d\x2e\x06\x1c\x12\x98\xc4\x34\xcd\xe1\xd5\x91\xf2\x54\xbe\x34\xee\x6a\xaa\xf9\x61\x44\x71\xd6\x24\xa2\x49\xa2\x8c\x2e\xf3\x07\x60\x60\x79\x7f\x09\xd4\x1e\x8c\x8d\xe3\x02\x46\x6b\x9f\xc3\x36\xf1\x4f\x65\x75\x68\x59\x01\x2a\x4b\x63\x19\xd8\x8f\x9d\x83\x65\x3a\x2c\xad\x6b\x1d\x91\x4e\xc7\x34\x63\xd1\x22\xa9\x0c\x55\x6c\x50\x19\x44\xd5\x46\x30\x30\x3e\xa4\x89\x15\xe7\x52\x02\x35\x5b\x5f\xcc\x4f\x1e\x04\x79\xba\x8f\x80\xb9\x03\x9e\xc5\x34\xfb\x8e\x17\x05\x1f\xf7\x49\xb0\x3d\xb9\x26\x39\x4f\x58\x4c\x02\xf2\x58\x2a\x0a\x26\x61\x42\x8b\x82\x76\x05\x6d\xed\x26\xa0\x21\x60\x97\x2c\x36\xcf\x34\x3b\x9a\x6b\x42\x87\x6e\xb0\x5a\xbd\xce\x55\xb1\x5f\x33\x14\xe0\xc8\x2f\x7e\x48\xd9\x8c\x5f\x6d\x66\xf4\x92\x66\x39\x0d\xc8\xd6\x16\x89\xc2\x94\x0c\x28\x89\x6f\xd2\x70\x2c\xcd\x62\xb4\x9f\x0e\x09\x0b\x92\x4d\x53\xb4\x88\xb9\xd1\xb4\xcf\x1e\xc9\x88\x86\x35\xe1\x78\xa5\x42\x44\x07\x90\xe9\x9a\x8f\x6f\x69\xcc\xa6\x63\x35\xc2\xaa\xc4\xa2\x62\x64\xbf\xf0\xec\x22\xcc\xf8\x34\xc5\x93\xfc\x81\xf3\xa4\x60\x13\x0d\x2e\x90\x85\xe5\xf9\x54\xca\xf5\xe5\x78\x24\x86\xbc\x52\xbc\x82\x17\xa3\xb7\x32\xfe\xed\x16\xd9\x41\xd5\x99\xb5\x3f\x5e\x80\xdc\x67\xcd\x00\x73\xb4\xb0\x2b\xb5\x73\x6a\xd6\xf3\x26\x6d\xad\x6e\xcc\xd3\x20\xb8\x53\x4f\xf3\x05\x82\x13\xeb\xd6\xdc\x56\x8e\xe4\xb1\xa9\x58\xc1\xa0\x47\xb6\x77\x26\xae\x83\xc9\x90\xf3\xc2\x76\x2d\x71\x4f\x40\x29\x25\xac\x3e\x56\x1f\xc4\xcd\x7a\x44\x93\x44\x45\xc1\x8b\x90\xdd\xa8\x8c\x70\x78\xe0\x44\xa6\xbb\x7b\x54\xc2\x59\xc1\x0f\xe5\x29\xd3\xdf\xe5\xef\x8e\xbb\x20\xfa\xb3\xfc\x6d\x07\x3d\xc4\xcb\xc8\x0e\x7a\xe8\x08\xd1\x97\x0d\x14\x58\x2b\xd1\xb5\xa4\xbe\x72\xb0\xe2\x4f\x39\x30\x57\xe6\xfb\x51\xc7\x8e\x43\xee\xe6\x50\x2d\x7d\x17\x7e\xeb\xb5\x3e\xb2\xa6\xa1\x94\x4c\xa8\x5f\x8a\x5c\xe3\x2f\xe2\x80\xea\x8f\xa0\x8a\xb1\x95\x45\x36\x14\x76\xfd\xe8\x11\xfe\xd1\x15\xc4\x84\xbc\x20\x41\x31\x0a\x48\x9f\x04\x45\x1c\x68\x45\xce\xb2\x01\x09\x57\x13\x7a\x50\xed\xbc\x42\x89\xa5\xc2\x05\x9e\xe8\x8d\x20\x8f\xb1\xba\x7c\x43\x75\xa3\x70\xc2\x8a\x30\x61\xff\xa5\xdf\xb3\x2c\x2f\x7e\x10\x37\x43\xd6\x6e\x49\xf0\xf6\xc7\x8e\xc6\xb5\xaf\x40\x43\x2b\x6e\x2f\xb1\x6a\x4e\xa9\xba\xf3\x96\x0b\x65\xe8\xd2\xcd\xaa\x0e\x97\x6b\x57\x6c\x69\xa7\x6a\x9f\x97\x6b\x0e\xe9\x4c\xa9\x41\x2c\xf6\x82\x23\xde\x31\x15\xe0\x91\x7b\x5a\xef\x14\xf1\xcf\x12\x3d\x62\x7c\x33\x4d\xf7\xee\x1c\xdf\x6c\xa9\x88\x63\x2b\xe6\xa3\xbc\xd6\xe7\xe1\x02\xfd\x10\x68\x7f\x84\x47\xd4\xdc\x41\xa8\x7e\x0f\x71\x87\x94\x66\xf0\x8f\xf6\xc8\x99\x77\x0d\xcc\xfd\xb9\x82\x48\x3d\xe6\x06\x5e\xcd\x81\xf3\x62\xe3\x18\x6a\x52\xa1\x54\xd0\xa7\x51\x6b\x15\x0c\x27\xa7\x13\x61\x08\xa6\xcc\xb4\x22\x39\x01\x45\x96\x6c\xc1\x8f\x91\x7a\x6a\xda\x59\x2d\xf5\x59\x4a\xc3\x60\x29\x13\xf4\x68\x02\x72\xdb\x6e\xe9\x5f\xf7\x13\xf7\x66\xbb\xf7\xb0\xe2\xde\xdc\xa7\x80\x7b\x9a\xd5\xc9\x1a\x77\xf6\x1d\xa8\x46\xb9\xf6\x34\xa3\x26\xa9\xd1\xe5\x79\x43\x8a\x9b\x9d\x3d\x1f\xb0\x31\xf9\x11\x82\x7c\x9e\x98\x14\x5f\x7f\xfd\xff\xb3\xf7\xae\xe9\x6d\x23\x49\xa2\xe8\x7f\xaf\x22\xcc\xe9\xb2\x00\x09\xa2\x48\x4a\xb2\x65\xc9\xb4\xc6\x25\xdb\xdd\x9e\x63\x97\x3d\x7e\x54\x57\x0f\x9b\x23\x81\x44\x52\x42\x89\x04\x58\x00\x28\x91\x65\xeb\xfb\x66\x21\xe7\x2e\xe3\x6e\xe0\x2e\x65\x56\x72\xbf\x8c\xc8\x27\x5e\x22\xf5\x70\x57\x9f\x33\x35\xd3\x16\x98\x8f\xc8\xc8\xc8\x88\xc8\xc8\xcc\xc8\xc8\x07\x7a\xff\x09\x36\xd5\x33\x21\xd6\xbe\xcf\xfa\x96\x3a\x79\xe0\x78\xd7\x1a\x0e\x6b\x53\x3f\x3b\x5b\xe3\x8c\x1c\x70\x2e\x6e\xef\x36\x77\xda\xd0\x7e\xdc\x6c\x3d\x1d\x6f\xee\x34\x77\xf7\xf8\x3f\x4f\x41\x7d\xbd\x6d\xef\xc0\x6e\x73\x77\xbc\xf9\x18\xf0\xff\x7e\xe7\xbc\x2e\x88\xf5\xbf\xd8\x62\x10\xfb\x49\xf0\x22\x49\xe2\xcb\xb7\x6c\x64\xf9\x98\x16\x32\xcd\xb8\xf0\xcb\x9b\x38\x6a\x40\x6c\x6f\x0a\xc3\x51\x89\xf7\x5a\x18\x2d\x07\x0f\xca\x50\x22\xf7\x2c\xce\x2d\x5a\x9c\x0b\xe5\xdc\x92\xba\x56\x58\x2c\x42\xa3\x3c\x28\x56\xa1\x66\xe1\x40\xb1\xdd\xfe\x1f\xe9\xfd\x1f\xe9\xbd\x73\xe9\xdd\xe3\xb2\xda\x7e\xdc\xdc\xde\x19\x2b\x89\xdd\x34\x64\xb7\x05\xbb\xcd\x27\xbb\xe3\xc7\xf0\x78\xb3\x4e\x76\x3f\x0a\xdf\xb8\x72\xe1\xc5\xdc\xef\x2f\xbd\x12\xa9\x6b\xc5\xf7\xa3\x70\x53\x2e\x26\xde\x4c\x80\x3f\x0a\x4f\xda\x9c\x04\x77\x6e\x25\xc1\xe8\x8b\xcd\x06\xf1\x2c\x1a\x56\x49\xc7\x6e\x47\x06\x5f\x4f\x49\xbe\x2b\xca\x6d\xef\x09\x87\x05\x78\x95\x24\x71\x02\x13\x96\xa6\xfe\x29\xde\xb8\x4f\x33\x3f\xca\xd2\xa6\x64\xa9\xd7\x5f\x7e\x3a\x3a\x7e\xf5\xf1\xe3\xfb\x8f\xc7\x9f\x5f\xfd\xf2\x99\x93\xe1\xd5\x7c\xca\x86\xb8\x6f\xaa\x46\x7b\xed\x40\x71\xea\x11\x0e\x61\x0a\x3e\x64\x67\x49\x9c\x65\x63\x16\x68\xa6\xc8\xce\xfc\x0c\xe2\x08\x77\x5f\x2f\xe2\x73\x96\xc2\x09\xcf\x3b\x01\x3f\xa3\xa7\xa2\x62\xde\xb7\x29\x4b\x38\x24\x76\xc1\x92\x05\x9c\x5c\xfa\x61\x76\x62\x5f\xab\xa4\xe3\xaa\x22\xf8\x61\x3c\xc1\x87\xa6\x30\xca\xcc\xc9\xd0\x8f\x86\x6c\x7c\xc2\x41\x4d\x58\x76\x16\xd3\x71\x0e\x26\x42\xc0\xe8\x15\x1c\xd1\x3c\xc7\x66\xe8\x53\x00\x29\x3f\xe2\x3d\x3b\x19\x8d\x67\xe9\xd9\x89\xae\xc9\xc1\x84\x93\x09\x0b\x42\x3f\x63\xaa\x03\xb8\xd5\xd8\x84\x0f\x49\x7c\x11\x06\x0c\x4e\x28\x80\x62\x7a\xc2\x9b\x0a\xa3\x20\x1c\xfa\x19\x83\xcb\x33\x86\x5b\x60\xd4\x18\x07\x94\x9e\xc5\xb3\x71\x00\x03\x26\xc0\xe0\x25\x4c\x7c\xf1\x8a\xf9\x74\x3e\x10\x05\x5b\x71\x02\x59\xe2\x87\x63\xfe\x9b\x05\xa7\x4c\x86\x45\x20\x8a\x70\x30\xd2\x7b\x1c\xe9\x21\xbb\x92\x2a\x98\xea\x99\x2f\x7c\xe4\x43\x5d\xcd\xe3\xb2\xc3\xb1\x95\xa7\x0f\x08\xa9\x40\xcc\x26\x7c\x9a\x0d\x52\xf6\xdb\x8c\x45\x19\x70\x7b\x33\x95\x87\x15\x25\x84\x17\xe2\x2c\x80\x25\x2c\xe5\x32\x21\xd0\xc5\xc6\x0b\x74\xe6\x4a\x8b\x97\x5d\x5f\xff\x29\xce\xd8\xfe\x3a\x9d\xc4\x88\xee\x9f\xe0\x20\x9c\xc8\xde\x9f\x88\xb8\x94\x29\xf8\x09\x53\xc7\x35\xaa\xbf\x38\x32\x36\x19\x4b\xe9\x26\x9d\x56\x89\xff\x46\x15\x7d\x41\x68\x9a\x86\x13\xae\x75\xb3\x33\x3f\x22\xd6\x0c\x66\x74\x96\xa6\x86\x41\x8d\x81\xe8\x0f\xef\x05\x65\x84\x29\x9c\xb4\x44\x4f\x54\xbf\x78\x22\xae\x50\x8c\x0e\x28\x9a\xf0\xdc\x80\x8d\x58\xc2\x57\x17\xb0\x0e\xb3\x28\x0b\xc7\x92\xea\x11\x9b\x67\x90\x85\xc3\x73\x0f\xd2\x70\x12\x8e\xfd\x84\xe7\x9c\x68\x17\xf3\x13\xc9\xf8\xaa\x9f\x23\x8e\x80\x44\xec\x13\x63\xd0\x7b\xe9\x5f\x84\x01\x1c\xc5\xc9\xc0\x1f\x9e\xc5\x6b\x9c\xa0\x59\x38\x1c\xb3\xbe\x73\x96\x65\xd3\x74\x7f\x6b\x6b\x98\xa6\x9b\xdc\x48\x38\xc7\x8d\xdc\x2d\xa1\x6f\xc2\xe8\x74\x53\x90\x8a\x7f\xb2\xf9\x74\xec\x87\x11\x0b\x36\xd9\xdc\x9f\x4c\xc7\x2c\xdd\x72\x79\x1b\xa3\x98\x6b\xa8\xcc\x0f\xc7\x29\xc6\xa4\x42\xc4\x83\x70\x34\x62\x09\x8b\x86\x2c\x85\x01\xcb\x2e\x19\x8b\xe0\xe4\xb8\x29\x29\x2f\x28\x74\xdc\x94\xaa\x4d\x61\xfc\xaf\x69\xe6\x67\xe1\x10\x3f\x27\x6c\x32\x60\xc9\xfb\x11\x1c\x53\x4e\xc8\x07\xa3\xd5\x6c\x37\x5b\xf8\x9b\x8b\xd9\x69\x9c\x2c\xe0\xb5\x31\x8a\xff\x3a\xf5\x13\x7f\x02\x5f\x65\xda\x15\x8e\x31\xca\x8a\x56\x48\xb1\x62\x81\xa6\x59\x87\xae\x87\x5c\x41\x8f\x8f\x65\xb7\xd5\xc7\x5a\x94\xc8\xe9\x6a\x6a\x23\x13\x86\xa5\x48\xb2\xd8\x02\x49\x0a\xf9\x0a\x7a\x82\x99\xbb\x5f\xaf\x08\xac\x64\x6e\x75\xb1\x5b\xd7\xe1\xab\x6f\xe6\x47\xba\x52\x53\x70\x52\x97\x0b\x41\x9f\x17\x85\x4f\xe2\x56\x39\x72\x2c\x67\xce\x9c\x2a\x29\x11\x81\x6b\xda\x90\xd2\xb3\x44\x23\x75\x82\x46\xad\x90\x6a\x48\xcd\x61\xf8\x28\x92\x88\xad\x2f\xcb\x94\x0f\x56\x15\xcc\x25\xd8\x61\x6b\x0b\x5e\xe0\xd6\x3c\x9b\x0f\x59\x9a\x86\x17\x5c\x0b\xcf\xa6\x81\x9f\x49\x89\x94\x67\x66\x70\x79\x16\x8e\x19\xa4\xc3\x24\x1e\x73\xe4\x10\xda\xaf\xff\x3e\x63\xc9\xc2\xb9\x0c\xa3\x20\xbe\x74\x9b\x71\xe4\xac\x51\x81\x35\x0f\x34\x37\x3a\x08\x90\x7d\x88\xe5\x8d\xfe\x76\xab\x85\xef\xcf\x48\x14\xde\x90\xda\x3f\x49\x58\xc4\x2e\x3f\xc7\xe7\x2c\x3a\xa1\xe8\x34\x78\x8c\x3b\x0e\x87\xe7\x7c\xde\x8a\x32\x2e\xcb\x23\xdc\xf7\x83\xc1\x2c\xc3\xf8\x66\x39\x55\x42\xd3\xdb\x2e\x4c\xc2\x68\x96\xb1\x14\x91\xc4\x83\x0a\x45\x8d\xae\x89\x98\x6e\xd0\x83\xed\x16\xff\x8f\x9b\x70\x6b\x72\x00\xd6\xc4\xce\x07\x9a\x67\xba\xbb\xe2\x9c\x9f\xfa\x8b\xe8\xad\x79\xba\x05\xb3\x63\x47\x34\x31\x5a\x83\xaa\x51\xb1\x15\x77\x19\x31\xa7\xf1\x14\xbd\x84\x4d\xf8\x4d\x9a\x6d\xb1\x99\xad\x07\x86\x15\x20\xfa\xc4\x53\x3c\xe0\x22\xe6\x49\x29\xd0\x47\x62\x92\x7f\xbb\xca\x07\x13\x28\xa0\x1d\xe1\x46\xc9\xb8\xdb\x6d\xdc\xf1\x42\x09\x7f\x68\xee\xc8\xc9\x63\x1b\xde\xe8\x25\xb2\xdb\xe7\xc5\x94\xa1\xd9\xe3\xe4\x8c\x1b\x71\xa1\x86\x00\x4a\x0b\xca\x91\x88\x49\x40\x1a\xaf\x35\xf1\xb9\x06\x61\xa4\xa4\xf8\x10\x1e\x3e\xcc\x09\x2b\xec\xcb\x4a\xe4\x57\x6b\xf4\x41\x8f\x5f\x15\x0c\x55\x78\x5f\xd5\x93\x68\x8a\x59\x57\x2a\x4e\x8b\x9c\x84\xab\xc2\x50\x61\x40\x74\x5c\x9b\xf8\xf3\xbf\xfa\x61\xb6\xb6\x4f\xc5\x29\xd1\xe0\x25\xf9\x89\xe1\x14\x70\x2f\x9f\xcc\xd4\xa6\xb0\x52\xf1\xb6\x0f\x8d\x22\x5f\x4c\xe6\xec\xdc\xed\xff\x71\x7d\xfd\x67\x72\x7d\x4d\xd8\xe8\x80\xab\x00\xb8\x64\xfe\xf9\x3f\x7b\x50\xdb\xff\xab\xbc\x42\xef\xda\xa5\xc7\x70\x52\xf1\x07\x69\x3c\x9e\x71\x7d\x2e\xf2\x64\xfc\xcf\x8e\xa7\xbc\x1f\x84\xdf\x83\x4c\xb0\x22\x6d\xae\x14\x81\xd4\xd5\x20\xc6\xe3\xa3\x33\x3f\x3a\x65\xc2\x21\xc8\x23\xa8\x96\x1b\xc6\x30\x1e\xc7\xc9\x8b\xe1\x10\xdd\xd3\x94\x2f\x86\x3f\x3c\x3f\x45\x3f\x9a\x23\x9e\xbd\x9f\xf3\x40\x22\x63\xcd\x4f\x16\xcd\x17\x9d\xfc\x7b\xdb\xe3\x38\xf9\x90\x84\x13\x3f\x59\x2c\x0d\x6e\x4a\xe5\x7b\xbb\xad\x56\x3f\xef\xf6\xb1\xca\x9b\xe9\xb4\x44\x8c\x93\x4f\xe2\xc2\x1d\x6f\x9e\x77\xfb\x9a\x28\x37\xb9\x73\x45\x41\xf8\x65\xab\x48\x87\xb0\xe5\x1d\x46\x71\xb9\x68\x1e\xb7\xac\x7c\x1e\xbb\x7a\x9b\x45\x27\xd5\x7f\x46\x87\x4d\xeb\x11\x63\xf2\xde\x1c\xc7\x89\xb2\x94\xfd\x81\xdc\x26\x88\x13\x2b\xac\x61\x5c\x1d\x11\xe9\xfa\xe0\x4b\x2a\xcc\x11\xca\xc8\x5a\xff\xfa\x80\x48\x82\x9f\xeb\x8a\x52\xef\xfa\xd5\x31\x43\x0b\x5d\xa5\xa1\x11\x5d\x45\xf7\x54\x61\x8e\xea\x9e\xd6\x47\xf1\x32\xa3\x44\xad\x2e\x15\xab\xcb\x05\x37\x76\xf2\x27\x7c\xcb\xef\xc0\x9a\xee\x5e\x4a\xb0\xf3\x4f\xd9\xde\xd5\x53\xb3\x9c\x89\xb4\xc7\xd5\x38\x56\x1e\x95\x48\x51\xab\x36\xa6\x68\xaf\x32\x52\x77\x4c\x98\x34\xd0\x05\x3d\xfa\xf8\x72\x14\xb1\x4c\x33\x8c\x02\x36\x7f\x3f\x72\xb0\xbc\x8b\xfe\x19\x9b\xed\x83\xdb\xf8\x28\x2d\x7b\xed\xb0\xb7\x86\x6d\x2e\xeb\x3f\x44\x08\xf6\xbd\x7c\xcf\xca\x3d\x63\xd4\xac\x89\xde\x5b\x36\x29\x0e\x0d\xe2\x55\xdf\x18\x95\xb7\x42\xf1\x82\xa6\x98\x2f\x0a\xb3\x05\x82\x16\xc6\xf3\xb2\xdb\xdd\x74\xf7\xad\xe4\xd6\x1f\x8e\xbc\x14\x15\x42\xfe\x4a\x39\xd8\x28\x4e\xfb\xfe\x3e\x36\xff\x07\x79\x82\x70\x7e\xab\x57\x92\x7f\x08\x85\xbb\x6c\x87\xe4\xbd\xf4\x6b\xf5\xea\x77\xb0\x35\x72\xf8\x9b\x1e\x1d\x77\xe0\x3d\xa1\xd8\x5f\x3a\x50\xa8\x84\x7b\xf2\xa1\xd8\xb9\xfd\x19\xce\x87\xaa\x95\xc9\x1e\x5f\xff\xa0\x7e\x45\xc5\xf0\x92\xa5\xc3\xca\xa2\x7c\x01\x58\x58\x93\x97\xae\xd6\x9e\x76\x5c\x38\x34\xee\xa9\x0b\x63\x07\xce\xd9\xc2\xa3\xc5\xaf\xb5\x2e\x08\x3e\x34\x47\x76\x19\x8d\x8d\xd3\x96\x35\xb8\xfe\x81\xfd\x25\xa0\x52\x7a\x4f\xc4\x07\xc4\x0c\xe3\x42\x31\xe5\x1e\xa8\x99\xd6\xa4\xf4\xee\x12\x94\x46\xa2\x6e\x6d\x41\xa7\xd5\xec\xf0\xff\x6b\xc1\x3b\x3f\x3b\x6b\x8e\xe3\xd3\xf6\xd4\x99\xbb\x45\x0a\xe9\x6c\xf8\xf6\x4d\xa3\x2f\x2b\x98\x84\x70\xe6\xd0\x85\x8d\xb9\x0b\xcf\x61\xb3\xcd\x36\xf7\xf8\x02\x6d\x0e\xcf\x00\xbf\x0f\x61\x0e\x9b\x30\x87\x75\x98\xa3\x5f\xfc\xbe\x82\xec\xb4\x61\x03\xe6\x6e\x79\x9f\x1e\xd7\xf5\x49\x8f\x9e\xc0\xf7\xf8\x78\x85\x5d\x92\x33\x3f\x99\xc4\xd1\x02\xc2\x09\xaf\x0b\xeb\x5b\xe4\x58\x7e\x2c\x24\xe0\xf8\xcd\xbb\x0f\xef\x3f\x7e\x7e\xf5\xf2\xf8\xdd\xfb\x97\x5f\xde\xbe\x3a\x6e\x1d\x07\xdb\xc7\x53\x3f\x3b\x3b\x3e\xae\x7a\x83\xe8\x89\x7b\x23\xc8\xed\xe3\x63\x79\x90\x58\x09\xfb\xf1\xe3\x9b\xc1\xee\x1c\x1f\x0f\x67\xc9\x05\x3b\x1e\x87\x11\xf3\x93\x4a\xf8\xed\xed\x9d\x9b\x35\xb0\x7d\x8c\xa0\x2b\x01\x77\x5a\xad\x9b\x01\xde\x39\x3e\x9e\xc6\x61\x0d\x49\x3a\x2d\xdc\x58\xc1\xff\x0c\xf8\x52\x39\x12\x4f\xf0\x76\x4a\xf8\xa4\xd7\xf0\x1b\x5c\xbe\x34\x53\x69\x93\x73\xde\xc2\x06\xaf\xc7\x8b\x03\x81\x2d\xce\xd1\xeb\x5b\x7d\x69\x4f\xce\xdb\x32\xc8\xa5\x48\x58\x70\x70\x62\x6f\x74\x49\x1e\x90\x80\x65\x57\xd6\xb7\xfa\xae\xd3\x52\x8b\xfe\x45\x7b\x69\x04\x07\x08\x67\x61\x22\xa8\x0d\xd9\x3b\x40\x2a\x4b\x66\xcc\xd5\x56\xb6\xbc\x14\x6a\xf6\x1f\xd9\xaf\x16\xe1\x02\x8f\x96\x34\xa5\x2e\x47\xcc\xb2\xe9\x4c\x36\x61\x87\x89\xf5\x13\xe6\x3b\x81\x9f\xf9\x66\x98\xd8\x50\x47\x7c\xf8\x55\x7f\x9e\xeb\x4f\x0c\x86\xe6\x67\xbe\x0c\xed\xaa\x32\x8c\x80\x2c\x82\x64\x7c\x20\x95\xbb\xa4\xd8\xf6\x98\x8d\x46\x66\x10\x8d\x79\xeb\x77\x8e\x1b\xbb\x14\xa1\x61\x23\x23\xf2\xc9\xa2\x90\x27\xc2\x42\xd1\xb5\x09\x41\x3b\xea\x99\xab\x3b\x8a\xa4\x71\xa8\xa1\x65\x06\xcd\xd0\x53\x92\x8e\xfc\x17\x8d\x97\x6b\x85\xb8\x0d\x29\x5c\x6d\x08\xcf\xba\x10\x1d\xc0\xc6\x46\xa8\xc3\x7c\x70\xa4\x1e\x3a\x21\x3c\x03\x7c\x95\x5e\x90\xc0\x09\x04\xb9\x7a\x61\xdf\x83\xd0\xc3\x6f\xd7\x45\xaf\x5e\x49\x25\x33\x54\x08\x87\x62\x50\xef\x61\x59\x19\x80\x5f\xa1\x0b\xa1\x19\x36\x84\x3a\xdf\xe4\x23\xfa\x29\xf3\x93\xcc\x71\x4b\x72\x39\xb7\x14\x72\x0b\x11\xc8\xac\xe2\xaf\xa2\x60\x79\x50\x82\x48\xe7\x1c\x39\xd8\x84\xf6\x01\x9c\xc3\xf3\x2e\xfc\x7a\x00\x9b\x9b\xe7\xf9\x78\x28\x02\x10\x0a\x9e\x33\x6f\xfd\xde\x3b\xef\x7b\x7c\xc4\x7b\xe7\x7d\x0b\xe4\xd5\x6a\x88\x71\x0a\xe4\xf2\xae\x1e\xd8\x7f\x4d\x12\x9b\x58\x71\x24\xc2\x3e\x4e\xc9\x2d\x27\xd0\x83\x45\x68\x51\xce\xc2\xca\xd1\x6d\xd8\xbd\x69\xc3\x21\x6c\xcc\xdb\x66\x51\xd8\x17\xf0\x3d\xae\x8d\x0e\x61\x63\x91\xcf\xa6\x46\xf2\x51\xed\x34\xc3\x13\x43\xbb\xca\xb0\x31\xe5\xda\x13\x72\x05\x1b\xd0\x68\x70\xbb\x83\x84\x5d\xd4\xb7\x04\x9e\x13\x4f\x45\x5e\x13\xb0\xae\x15\x11\x35\x67\x95\xea\x34\xb7\xa9\x98\x5d\xac\x8c\x9b\x24\x83\xf8\xaf\x2b\xfd\xa0\xa5\xc8\xea\xb0\x72\x1c\x9f\xe6\xdc\xd8\x4c\x76\x8e\x73\x98\xe5\x03\x49\xf3\x15\x25\x4e\x37\xe2\x38\xee\x18\x05\xa9\x21\xeb\xf3\x15\xe7\x31\xec\xdf\x85\xa2\xde\x38\x76\x3d\x63\x6e\x42\x5c\x69\x14\x0f\x68\x27\x56\xe1\xdf\xfa\x03\x77\xa0\x1a\xeb\xf6\xca\x58\xe3\x24\x2a\xf5\x2d\x1c\xd2\x9f\xfd\xef\xdd\x91\x76\xae\x23\x8b\x55\xfb\xb1\xf8\x7e\xd4\x5f\x14\xd9\x67\x91\x1f\x88\xc5\xca\xec\xf3\x1d\x3b\x50\x8d\xf5\xca\xec\xb3\xf8\x43\xb0\xcf\x22\xcf\x3e\x5c\xad\xfd\xd2\x82\xae\xf9\xfb\x6f\xd6\x90\x14\xfa\x26\x75\x68\x73\xee\xcc\x5b\x6e\x73\xe1\x2c\x5a\x6e\x09\xd4\xbf\xb5\x57\x84\xd2\x2e\x83\xf2\xcb\xf2\x50\xda\xe5\xb8\x68\xf3\x75\xa5\xf1\xd2\xd5\xee\x7d\x84\x1e\x3e\x34\x87\x48\x1d\x85\x5b\xbd\x90\x46\xf1\x4a\x7d\x50\x96\xb4\xba\x10\x0d\x0f\x05\xff\x3d\x7a\x04\x4e\xce\x62\x94\xd3\x93\x81\x0b\x66\xe4\x31\x51\x46\xfb\x4a\xb8\x98\xac\xaf\x41\x58\xb3\x38\xec\xe7\x8d\x58\x5d\xd0\xa4\x90\x48\xd5\x78\x19\xec\x70\x40\xae\xf3\xf9\x6d\x81\x27\xf7\xbf\x2d\x20\x96\x8f\xce\x20\x8c\xf0\xba\xad\xbd\x90\x54\x40\x9a\x81\x53\xda\x5e\xc3\x6f\x78\x16\xa3\xcb\x5e\x21\x25\x3e\xfa\x41\xe8\x8f\xdf\xe2\x72\xe7\x00\x37\xa7\x4b\x5a\x0e\x27\x93\x19\x5e\xb0\x72\x2b\x17\xb1\x03\x5c\xc4\x1a\x20\x6f\xb8\xb3\xb1\xdc\xee\x00\x6d\xc7\x15\x3a\x60\x63\x50\xbb\x32\xa9\x5b\xe1\x59\x4e\x00\x02\x16\x59\x5c\x74\xd5\xec\x2c\x4c\x9b\xc7\x52\x04\x04\x27\x5f\x3d\x78\x40\x25\x9b\x53\xf9\x6e\x85\x0c\x9a\x27\x97\x0e\xfb\x45\x75\x63\x80\xca\x2f\x31\xf0\x8c\x5b\x18\xdd\x4b\xd4\x54\xa6\x39\xd6\x53\xab\x88\x6b\x6a\xe6\x56\x1b\xaa\xee\xf5\x6d\x5a\x4b\x05\xac\x87\x26\xba\x51\xcb\xf7\x20\x29\xab\x49\xa6\x7c\x02\xeb\xb4\xef\x96\x86\x91\xc3\x97\x02\x3c\x61\x13\x53\x86\x71\xea\xf8\xae\x30\x66\xad\x68\x0c\xe6\xe0\xaa\x01\x31\xed\xf0\x44\xe4\x99\x41\x1a\x94\x14\xf3\xf5\xae\x59\x59\xeb\x25\x65\x37\x53\xfd\xc2\xe0\x6a\x4d\x90\x08\xde\xbe\x2a\x6a\x82\xda\xa7\xe9\xef\x56\x13\x2c\x21\x8f\xb4\xa9\xc4\x47\xe9\x76\xe2\x48\xdb\x21\xd4\xed\x4a\xa1\xdc\x6e\xdf\x7c\xbf\x71\x89\x2d\xbb\x07\x06\x0b\xe8\x1e\x39\x63\xe3\x6c\x96\xf7\xb5\xa9\x47\x6b\xdc\xf4\xf1\x99\x26\x9e\x3a\xf7\x20\x60\x63\x96\x31\xfe\x7d\x80\x99\xbc\x3b\xb3\x14\x73\x17\x46\xee\x42\xd4\xbd\xc9\x94\x38\x74\x96\xd8\x0e\xc9\x51\x53\x6e\x8a\x59\x73\xf6\xb1\x8b\x33\x91\xe3\x0a\x2e\x2c\x4c\x46\xc4\x7d\x5b\xeb\x30\x8b\x30\x8a\x54\xf5\x6e\x23\xd2\x9e\x4a\x29\xda\x8a\x52\x82\x55\x4a\xf6\x1d\x65\x2b\x9a\xce\xcb\x18\x22\xb5\x8b\x58\x92\xb6\x95\x08\x43\x70\x8a\x0a\x9e\x43\x74\x2b\xa6\xe2\xda\xb0\x9d\x77\x23\x80\x37\xdc\xd1\x9d\x7b\xb0\xb0\xa8\xdb\x73\x16\xb8\xe9\xe1\x4a\x2d\xc8\x75\xde\x1c\x36\xc5\x29\xc7\x87\x37\xb0\x05\x1d\xbe\xce\x31\xb5\xe4\xdc\xed\x97\xf7\xbc\x53\x7b\x3b\xf8\x8f\x6d\x84\xa4\xe3\x70\xc8\xc8\xf0\xc0\x03\x7e\xfe\x53\x3e\x67\xa5\xa7\xd2\x26\x15\x2b\xf6\xbc\xf6\x66\xe5\xf7\x3e\x95\x39\x9e\xd4\x9e\xc9\xec\x89\xa1\xbb\x21\x37\x71\xf6\x09\x12\xff\xd2\x98\x62\xc5\x04\xe6\x41\x1a\xfe\xce\xcc\xbd\xe6\x44\x9e\x97\xa5\xbf\x25\x99\xc3\x73\x61\x6b\x19\xd4\x7b\x8d\x5f\x69\x9b\x36\x14\x76\x10\xe8\xcd\xf4\xe6\x24\xbe\x60\x9f\x63\x27\xf1\xa0\x95\xcb\xf1\x93\xa1\xd3\xf2\xa0\xe5\x41\x82\xff\x2e\xd5\xd2\x04\x5b\xca\xfc\x99\x6a\xea\xaa\x9c\xbb\x6b\xef\xde\xfd\x23\xe4\xfa\xd6\x23\xb1\xeb\x72\xf9\x2e\xa5\xee\xe6\x36\xac\x73\x2a\x6e\x26\x39\x1a\x73\x0d\xcb\xf3\xaf\xcb\xc3\xfa\xe5\xf9\x4b\x64\x57\x64\x5d\x83\x94\xc8\xae\x86\x5b\x9d\x53\x83\xcf\xe6\xf5\xd9\x55\x59\x15\x08\x0d\xc7\x71\xca\x3e\xf8\xd9\x99\x53\xc7\x6f\xb5\x3e\xf0\xb7\xe0\x37\x8a\x65\x15\x6d\xb7\x2c\x96\x68\xc3\x16\x6c\x8b\xb3\x19\xcc\x3d\xc6\xa7\x3a\xb0\xdc\x3a\x67\x92\xef\xc3\xa7\x8b\x32\x3e\x15\xf8\x18\x27\x47\x73\xe8\xe2\xa4\x84\x39\xa5\x0c\xdc\xf2\x60\x73\x51\x3e\x2c\xf3\xa2\xe6\x10\x39\x2d\x3e\x41\x96\x0f\x65\x49\xa5\xe5\x86\xb1\xd6\xdd\xe3\x0f\x39\x35\x70\x20\xe7\x3e\x74\xa1\xd5\xdc\x7b\xda\xda\x6b\x6f\xb7\x9e\xb6\x77\x3b\x4f\x3b\x7b\xbb\x9d\xce\x5e\x5b\x38\x6b\x9f\x6b\x8d\x12\x46\xf5\x46\x55\x99\x4e\x87\x2d\x68\xb7\xb8\xfa\x51\x20\x9e\xc0\xfa\xea\x53\x03\x81\x11\x18\xcd\x57\xc6\xc8\xd2\xfd\x02\xa5\x75\x38\x17\xc7\x97\xe7\x9c\x19\xf5\x5a\xf0\x56\x10\xbf\x97\xfc\x94\xe8\xf9\x75\x38\xf7\x73\xa2\x73\x3e\x47\xc5\xa4\x0f\x62\x79\x1a\x97\xa7\xa4\x52\x96\x2a\x54\xdc\x5c\x4b\x8c\x7a\x23\x34\x84\x2e\xb4\xf1\x10\x15\x76\x73\x67\xa8\x3c\xdb\xaf\x3d\xfa\xae\xa4\xe5\x3a\x84\x7c\xca\xb2\x1e\xd6\x91\x9d\xa5\xa5\xba\xf5\x68\x87\xc9\x0b\xfa\x20\x2f\x87\x7d\x2a\xe6\x93\xa1\xa1\xde\x0b\x85\x86\xe8\xa2\xb3\x09\xbc\xf0\xc2\xc3\x3f\x73\xd8\x00\x9e\xbc\x30\xde\x39\x58\x55\x2f\xd4\x3a\x27\xfd\xd1\xcd\x89\xcb\x02\x9b\xe5\x38\x6c\xf3\xb2\x68\x5a\x24\x7c\xf9\x36\xf7\x60\xee\xc1\xa5\x07\x97\x75\xc4\xb9\x2f\x2f\x27\xb4\xed\x7f\x4b\xb2\x6d\x0b\xff\x6d\xf7\x7b\x4e\x6f\x9b\x85\xf9\xcd\x21\x94\xd6\x61\xdb\x2d\xb7\x75\x5b\xb4\x04\xeb\x54\xcc\x4d\xb2\xfa\xa2\x7a\xce\xab\x2b\xb2\x1c\xbf\xde\xd7\x0e\xb3\xdc\x37\xd9\x6c\x35\x85\x70\xa7\xb9\xc1\xe1\x9c\x24\x34\x32\xd7\x2c\x6a\xd2\x40\xb3\x45\x5a\x05\x5c\xab\x38\xe7\x22\xc2\x6c\x9b\x2b\xdd\xed\x7f\xa0\xce\xdd\x02\x4b\xe5\x72\x53\x2b\xd1\xdd\x00\xe9\x04\x95\x70\xe5\x6c\x94\x6b\x43\x17\xe6\x2d\xa3\x50\x5b\x16\x82\x0d\x53\x5f\xcf\xb9\x6d\xb6\x39\x6f\x1b\x25\x79\x0a\x1d\x7e\x15\xb8\x67\xce\xd9\xa7\xc2\xe2\x99\xb7\x3d\x10\x07\x53\xc5\xbc\x8e\x07\x8b\x0a\x9e\x43\xa5\xd8\x92\x5a\xb1\x25\xd4\x62\x4b\xea\xc5\x8a\xd6\xb0\x56\x5b\xd6\x6a\x8b\x5a\x6d\x59\xab\x02\x0f\xac\xd5\x91\xb5\x3a\xa2\x56\x47\xd6\xaa\xc7\x70\x43\x61\x48\x88\x09\x30\xf3\x7a\x0c\x37\x14\x86\x84\x98\xac\x55\x8f\xe1\x86\xc2\x90\x10\x93\xb5\xf2\x18\x2e\x27\x70\x7f\xc4\x8d\xdc\x23\x3f\x09\xc2\xc8\x1f\x1f\xf1\x1e\x04\x37\x35\x42\xa3\x38\x9e\xd6\x9c\xac\xec\xde\xdc\x69\x54\xa0\x57\x03\xfc\x49\x6e\x23\xd7\xee\x91\x16\xf2\x8c\x45\x69\x18\x47\xd6\x51\x8b\x3a\xac\x33\x0e\xe8\x28\x8b\x2b\x26\x87\x73\x89\xaa\xb6\x05\x8f\x71\x83\xd4\x86\x5f\x77\x2a\xb3\x04\xc9\x2a\xdc\x00\xd5\xf1\xcc\xcd\x41\x5c\x7f\x52\x43\x4e\x2d\xf4\xd9\xd6\x9f\x1d\xfd\xb9\xad\x3f\x77\xf4\xe7\x2e\x9e\xbd\x4b\x28\x0b\x0d\x65\xa1\xa1\x2c\x34\x94\x85\x86\xb2\xd0\x50\x16\xbb\xd0\x85\x9f\xfc\x9f\x0e\x0c\x50\x78\x80\x83\xfe\x7a\xd7\x1f\x19\xa5\x97\x61\x36\x3c\x03\xc7\xa8\xa9\x8d\xd2\xa1\x9f\x32\x68\x9b\xa1\xc5\xad\xf1\x96\x6a\x54\xf6\xd2\x53\x98\x1a\xfe\x61\x76\x8d\x9c\x80\xd3\x7f\x83\x84\xf9\xe7\x07\x39\x5f\x35\x6c\xbb\x53\xdd\xb6\x50\x30\xf7\xd7\xf6\x76\xa1\x6d\x3a\x18\xbb\xbe\x45\xab\xdc\x8e\x2a\xb7\x53\x5b\x6e\x57\x95\xdb\xad\x47\xef\xaa\xea\x3c\x4f\x6f\x62\x93\xa5\xb9\xc1\x13\x70\x17\xfb\x60\xc9\xa1\x6e\xed\xe7\x38\xa8\x7d\x60\xb2\xf0\xdc\x33\x59\x71\x71\x60\x63\x27\x99\xc5\x86\xd0\x39\xa8\xe5\x99\x1d\x0b\x2c\xff\xb5\x70\xcb\xe0\x76\xf2\x70\xb7\x0f\x0c\x31\x32\x40\xec\x96\x60\xa6\x6e\x78\x2f\xe5\xb1\xa1\x34\xa5\x3c\xfd\xa1\x26\xc9\x87\x19\x5f\x88\xa5\xa5\x9d\xd9\xc6\x55\x95\x3a\xf0\xca\x14\x83\x67\xaa\x88\xf9\x41\x95\x12\xf0\xca\xd4\x81\x67\x2a\x86\x85\x3e\x82\xbd\xbb\xe3\x26\xc7\x38\xcd\x4d\xb3\x78\xe2\x18\x0a\xdf\x3c\xca\x95\x84\xaa\x39\xcc\xbd\x6e\x0a\x51\xc7\xba\x12\x56\x53\xe4\x98\x67\x7b\xd6\x7c\x03\xda\x37\x02\x71\xdb\xb0\x40\x99\xa7\x70\x12\xe4\xc1\x83\x2b\xd7\xc1\x40\x33\x05\x3b\xe2\x3b\x9c\x47\xdd\xd8\x8e\x78\x3f\x65\xd1\x8d\x8f\x84\x97\x9d\xec\x0b\x73\x3d\x6f\xf5\xfe\x66\x7a\x0e\xfd\x06\xde\x17\x5c\xd3\x5b\xb3\xd9\x75\x4e\x17\xa2\x82\x98\x15\x97\xf4\xb7\xa8\x9e\xc5\x97\x9b\xa4\x6f\x31\x07\x63\x90\x1d\x8d\xf9\xb7\x6f\xd6\xcf\x87\xdd\x2e\xb4\x30\x52\xbd\x09\xb8\xdb\xe5\x6b\xe2\xeb\x66\x38\x8b\x1e\x38\x36\x2a\xa1\xd2\x2d\xe4\x7e\xa6\x91\xe5\xa6\x8a\x55\x14\x3f\xf6\xea\xb0\xd6\x2a\x30\xb4\xa5\x0b\xfb\xb5\x13\x91\x59\xb4\x0c\x8f\xed\x3c\x1e\x3b\x18\xd7\x05\x2f\x03\xe3\xf5\xf6\xd5\x26\x9a\xd6\xff\x4c\x34\xf7\x31\xd1\x94\xeb\xaf\x7f\xec\x34\xb3\xfd\x87\x0c\x0d\x1e\xa6\xaf\x7e\x9b\xf9\xe3\xca\x38\x4b\x8f\xf3\x25\xeb\xa2\x1f\x49\x60\xf9\xe0\x4c\xea\x0e\x52\xd3\x4f\xd3\xf0\x34\xb2\xee\x85\x3a\x99\x9f\x9c\x32\x3e\x9a\xa5\x1b\xe4\x79\x17\x9e\x03\x08\x37\x36\x78\x61\xdc\xa9\x8c\x67\x09\xba\x21\xa8\x52\xbd\xb0\x7f\xa0\xe1\x9c\xb3\x05\x84\x91\x28\xc6\x2b\x71\x15\x2b\x50\xd1\x3e\x0b\x67\x7e\xfa\xfe\x32\x92\x34\xa4\x5b\xcb\x54\x05\xef\xda\xba\xbc\x22\x21\x29\xef\xd8\x52\x2e\xfe\x3a\x80\x2b\xfc\x3f\x19\x9f\x13\xcb\x1d\xc0\x95\x8a\xb2\x84\x37\x7b\x8f\xc6\x7e\x6a\xc5\x0c\x42\xd7\x0a\xf5\xcb\x1a\xc5\x90\xa5\x82\x26\x1e\xc8\xd0\x16\x36\x69\xe8\x02\x96\x88\x3d\x51\x42\x96\x80\xa5\xc3\x24\x9c\x66\x3a\x80\x05\x92\x45\x27\x37\x19\x06\xf3\x17\xef\xf5\x94\xa7\xf3\x31\xf2\xc7\x29\xb3\xea\x0d\xe3\x68\x14\x9e\xce\x64\x4d\x8c\x0f\x87\x44\x6d\x20\x7b\x35\x38\xb5\x75\x71\xd7\xac\x7a\x99\x84\x99\x55\xad\x9c\x83\x65\xcf\x8d\x9a\x78\xdf\xd9\x80\x7a\x60\x12\x5c\x53\xf4\x28\x8e\xd2\x2c\x99\x0d\xb3\x38\x41\xc2\x65\xf1\x07\x7a\xe7\x88\x82\x5c\x7e\x90\xa4\xe4\xe8\xea\x6c\xb7\x48\x7c\x03\x90\xe6\x12\x13\xa4\x4b\x7d\xb6\xe0\xd6\x41\xb1\x51\x38\xd0\x4f\x3d\xab\x12\x07\x18\x71\xca\xb1\x63\x73\xc9\xa0\x1f\x1d\x0f\x8e\x33\x36\x99\xfe\x73\xbf\x57\xfb\x22\x0a\x27\x7e\xc6\xde\xf9\x91\x7f\x8a\xd7\x12\x4b\x63\xae\x3d\x6d\x55\x54\xa8\x6b\xcc\x2e\xa9\x00\x7c\x98\x25\xec\x23\x8b\x82\x9a\xd6\xb6\x4b\x0a\xd7\xb5\xa4\x4b\x69\x1d\xe7\xa7\xd5\x2f\x8d\x6e\xef\xe8\x16\x48\x76\xbe\x60\xf4\xcb\x8a\xe2\x7b\xed\x4e\x69\xf1\xda\x00\x6d\x46\x39\x55\x79\x96\x85\xe3\x2a\x0e\x21\x94\xee\x3d\x78\x9a\x6e\xa0\xe2\x41\x32\xde\x04\x2a\xd8\x54\xea\x2d\x92\x7d\x7c\x5d\xeb\xc0\xd4\x78\x21\x22\x20\x65\x97\xd7\x50\xb1\x73\x42\x17\x9e\x77\xa1\xe5\xe2\x3a\x24\x8c\xa4\x3a\x7a\xb8\x94\x92\x47\x04\x42\xd7\xac\x2c\xf4\x3c\xde\x75\x8c\x07\xbf\xa2\xde\x2c\x2a\x77\xb3\x77\x59\xcc\xe5\x78\x36\xe1\xba\x8d\x6e\xe9\xfa\x49\x22\x71\x25\xf7\xb8\x30\xd5\x19\x45\x65\xee\x81\x9f\x20\xd3\xa9\x42\x42\xa7\xbb\x72\x06\x4c\xf2\x4a\x9e\x57\x20\x1c\xfd\x24\xb1\x71\xe4\x59\x07\xea\x4e\xab\x4c\x25\x3c\x46\x49\x3c\x41\x24\x50\x83\x9a\x9d\xc8\x29\x61\x39\x32\x3a\xcc\x84\xa4\xbc\x31\x16\xe5\xfa\x5b\x57\xfd\x2a\x4d\x0e\xfc\xe3\x81\x9e\x5b\xc4\x9b\xef\x60\xce\x26\x32\x4d\x4e\x13\xf4\x1b\xae\x5c\xa3\x33\x7c\x40\xac\x28\x17\xba\xdb\xf1\xe0\xd7\xdc\xb8\xa0\xea\x3c\xf2\xc7\x63\x7c\x81\xd0\x09\xf1\x02\x0e\x9f\xd2\x0d\xb5\x2b\x3b\xf6\x50\x65\x83\xfc\x88\x47\x56\x41\xb4\x01\x4a\xe2\x9b\x36\x8e\xfc\x28\x8a\x29\x7c\x37\xf8\x14\xe0\x07\xfc\xd4\x08\xdc\xde\x28\x52\x7b\x1a\xa7\x69\x38\x18\x33\xa3\x01\x0a\xd8\xeb\xa4\x6c\x3c\xf2\x10\x98\x42\x8d\x27\xd9\xad\x7f\x64\x22\xda\xb3\x40\x81\x1b\xe8\x70\xe6\xa7\xd1\x5a\x06\x03\xc6\x22\x08\xa3\x30\x0b\xfd\x71\xc8\xad\xf3\x4d\x48\x67\x53\x96\x38\xae\x55\x82\xb7\xc0\x02\x42\x4d\x59\xb0\xe2\x52\x90\xb8\xed\x84\xbf\xf1\xc2\x13\xc9\x2f\xde\xaa\x2d\xe4\xe9\x5e\xc2\x21\x25\xef\x03\xc7\x38\x37\x18\xe2\x25\xd0\xd4\x49\x67\x83\x23\x9a\xdb\x10\x2d\xfc\x96\x5d\x15\xc0\x75\x06\x85\x53\xd2\xf7\xad\x1e\x3d\xca\x67\xd2\xc5\xf7\x8a\xa1\xf9\xc4\xcb\x72\xcb\x3a\x61\x29\x9a\xf9\x93\x59\x9a\x01\xa3\x47\x7b\x07\x8c\x6e\x1c\xe1\xf3\xbc\xb2\x09\x0f\xa3\x08\x37\x60\x03\x0a\xb8\x20\xa9\x24\xf6\xd6\xee\x85\x90\x03\x11\x67\xd1\x40\xd0\x42\xd7\xb4\x24\xbe\xd2\x2b\x00\x34\xf2\xfb\x5a\x50\x34\x71\x4c\x59\xa1\xf8\x01\x39\xc1\x28\x13\x1e\xce\x66\xd2\x34\x31\x88\x2b\xf0\x4b\x19\xd7\xbd\x84\xc2\xfb\x11\x1c\x96\xa7\x57\x0c\x90\xc6\xad\x79\x7c\x8c\x3d\xc1\x4d\x25\x5d\x44\xc5\xcb\x14\x73\xb1\x0c\x34\x64\x4c\xab\xf9\x17\xf9\x78\x11\xb4\x6b\xf8\x44\x45\x86\x8e\x65\x21\x1f\x1f\xd9\xef\x42\x6a\x26\x12\x6d\x78\x60\x14\xb1\x03\x3b\x88\x12\xa5\x8f\x81\x42\x41\x37\xd0\x2a\x5b\xd4\x91\xe1\x0e\x70\x1e\x45\xd1\xea\xd6\x49\x2c\xd5\x95\x28\x19\xd4\xf9\xf6\x4d\x52\xf8\xd4\xa6\xb0\x6c\xc7\xa5\x49\x88\x00\xe4\x10\x2d\x20\xf1\xa7\xa9\x08\xd7\x78\x4c\x47\x06\xfa\x6d\x0e\xdc\x39\x4a\x5f\x0c\xb3\x90\x6e\xfa\xe9\xd2\x4d\x99\xac\x0b\xfa\x59\x96\x84\x83\x59\xc6\x44\x64\x39\xb3\xb4\x95\xa7\xab\xf0\x49\x23\x57\x92\x27\xe9\x02\x59\x9c\xcb\xce\x62\x9d\x99\x66\x4c\xa3\xfd\x27\x19\x2d\x8f\x99\xc8\x1b\xcf\xa7\x9a\xa5\x64\x32\x5f\xec\xe2\xa0\x61\xc7\xcf\xfc\x28\x18\x33\x0c\x5d\x45\x41\x4c\x15\x49\x0a\x39\xcd\x41\x18\x05\x0e\x66\x8a\x6d\x30\x2a\x38\xc4\x5c\x19\x0e\xb4\x90\x66\x57\x53\x1b\x73\x0f\x25\x31\xf5\x26\x17\x55\xc5\x90\xdc\xdc\x66\x91\xe1\xe3\xbe\x5e\x89\xad\x01\xfe\xdf\xd6\x16\xaf\xad\xba\x18\x9a\x33\x03\xbd\x83\x81\xdc\x20\x9e\x26\xe0\xda\xc7\xa7\x21\x83\x94\x65\x22\x12\x5d\x16\xc3\x5a\x16\xaf\x09\x88\x86\xa6\xd4\x94\xeb\x96\xc5\xe3\xae\xc1\x31\x8b\x39\x8e\xf2\x38\x49\x7c\xc8\x10\x7a\xd5\xcc\x6e\x12\xd3\x08\xcc\x40\x83\xcc\xd5\x1d\xff\x90\xd6\xcb\x75\x74\xc2\xc2\xbd\x56\xbf\x29\xe2\xed\x09\xb0\x34\xd9\x73\xb0\x9c\xcd\xec\xe8\x22\x37\xee\xb7\xe9\xf8\x46\xad\x73\xe0\x2a\x55\x8f\xd7\xaa\x54\xd0\x87\x85\x55\x2d\x8a\xf6\x6c\xc9\x3b\x2c\x98\x5c\x5f\xaf\x3c\xbb\x8c\x07\xd4\x7f\x0b\x55\x9b\x48\x4b\x31\xa2\xc6\x51\xf6\x8c\x97\x56\x7b\x61\xe6\x06\x85\x56\xac\x3d\x02\x7d\xce\x16\xfb\xc6\x2b\x8e\x2f\xc3\xe0\x5d\x3c\x8b\xe4\x9b\xe0\x62\xd6\x32\xdf\x86\xb1\xcb\x39\xb6\x5f\xe3\xb1\xd4\x61\x65\x2a\xcc\x56\x62\x55\xfa\x0b\x60\xe8\x47\x3f\xb2\xd3\x30\xd2\xa5\x64\x8a\x54\x14\x62\x6f\x73\xc2\x31\xa0\xeb\xdb\x32\x8a\x7d\x41\x96\xb9\x92\x7e\x28\xeb\x9b\xec\x43\xa4\x2a\x48\x08\x02\x4e\x66\xd1\x0b\x29\xb4\x8e\xee\x8a\xe1\xe9\x78\x25\x83\x56\xe6\xe8\xf7\xd7\x70\x3c\xfe\xc8\x86\x2c\xbc\xc0\x71\x4f\xaf\xa3\x63\xbe\xbc\x13\xb1\x79\xf6\x41\x47\x3b\x95\x84\x35\x28\xa7\x4a\x5c\x47\x3c\x5d\x50\x26\x9a\x05\xf3\xf3\x84\x2e\x5d\x31\x4b\x80\x78\x70\xe7\x23\xd3\x06\x80\xae\x94\xcb\xd3\x23\x85\xa3\xb1\xc2\x00\x54\x68\x62\x31\x32\x29\xcb\x3e\x71\x21\x70\x4a\xe4\xfd\x06\xf2\xa7\xf1\xcf\x62\x2e\x87\xe6\x6f\xad\x3a\xdc\x82\xee\x28\x60\x8d\x4e\xbd\xd4\x75\x19\x75\xb9\xc7\x35\xba\x07\x6b\xb2\xef\xfc\x5b\xf6\x6b\xad\x6f\x71\x2b\xda\x51\x72\xf7\x55\x1b\x51\x9a\xf3\xf8\x84\x9b\x43\x56\x1e\x13\xd9\x12\x92\x4b\x2e\xa3\x63\x4d\x0f\xc2\xf4\x73\x12\x9e\x9e\xb2\x04\x85\xea\x61\x19\x7c\x2e\x4e\x25\x0d\x58\xdd\x21\xe1\x14\x5b\x35\xf9\x11\x14\xe9\xcd\x34\x8b\xa7\x8e\x5b\x3a\xfc\x42\xd7\xc5\xd3\x7f\xfb\xa4\xc4\xb0\xc8\x09\x76\x7e\x09\x28\xde\x23\x61\xda\x98\x1d\xfb\xf6\xad\xc0\xc8\x87\x06\x6d\xb1\xc6\x3e\x58\xb4\x3f\xb0\xb4\x43\x09\x0f\xde\xed\x0c\xe0\x1e\x54\x6b\x23\xb9\xe1\x8e\xb0\x14\xd6\x9e\x41\x1d\x0e\x89\xe0\x19\x11\xc9\xf8\xd8\xc9\xc7\xf5\x79\x0b\x4b\xaa\xb2\x2f\xd1\x64\x99\xd9\xc0\x28\x6a\x4c\x08\x39\x1d\x4d\x5b\xcd\x85\x71\x9e\x45\x9f\x66\x83\x74\x98\x84\x83\xa2\xb4\x1b\x79\x75\xac\xb2\x1a\xab\xd9\x99\x2a\x68\xdc\x3d\xf0\x61\x05\x85\x93\x59\x64\x54\xa8\xa0\xad\x5d\xc8\x0c\x80\x0d\xe6\xa2\x41\x3a\x8d\x1d\x94\x30\x7d\x99\x25\x2f\x6c\xf9\xa2\x15\x0f\x10\xcc\x12\xb2\x52\x65\xb6\x4c\x30\x0b\xa9\xad\x50\x2a\x42\x3f\xcd\x02\x03\x31\xf9\x50\xfe\x20\x3f\xeb\xc4\x9a\x95\x5f\x45\x81\x2a\x67\x27\x57\x54\xc0\x53\xfd\xb2\x2a\x98\x61\x51\x20\xe5\x29\x2a\x5f\xc5\xd7\x36\xf7\x5b\xb5\x9a\x45\x0a\x01\xd7\xb0\x14\xad\x1a\xfb\x24\xce\x41\x5e\xe1\x0f\xd7\xa1\x44\xd7\x53\x54\x12\x87\xa6\xc6\xaa\xc2\xb5\xc7\x20\x8c\xfc\xf1\xa7\x3c\x1a\x6a\x78\x4b\xb2\x9d\x82\x71\xdb\xc9\x33\x17\x5f\x8f\xe7\xea\x1c\x68\xb3\xf1\x41\x29\xeb\xfb\x49\xe6\xf4\xf2\xc4\xf2\x68\x9c\xbc\x32\x3c\xcc\x3e\xda\xe3\xd2\xaf\xd6\x1a\xc9\x2c\xfa\x94\xb1\xe9\x12\x5c\x6d\x15\xab\xe4\xeb\xed\x32\xbe\x96\x2b\xcd\xd2\x35\xe6\x2a\xac\x77\x1d\x27\x19\xc8\x60\x2b\x7f\x42\xc2\xd3\x5a\xc6\xb2\x67\x69\x17\x4e\x2d\x34\xa9\x30\xad\x76\xcc\x72\x22\xe3\x4f\x86\x88\xc9\xb2\x65\x42\x26\xc0\x7e\x0e\x27\x06\x54\xa3\x72\xd7\x78\x4d\x07\x0e\xa1\x05\xfb\x85\x42\xda\xfe\x42\xcb\x24\x08\x24\x8e\x7a\x65\x2a\xd2\x1c\x7a\x9e\x70\x28\xac\xa1\x37\x19\x9b\x78\x80\x7b\xef\xf9\x90\x8d\x98\x88\xad\xe7\x22\x35\xca\xfb\xe3\x02\x90\x56\xb4\x57\xda\x6e\xc2\x43\x4b\xdd\x7d\xd9\x54\x69\xff\x01\x8e\x65\xfe\x9f\x94\xc2\x51\x35\x8a\x3a\xc7\x50\x4b\xc5\x8a\x39\x62\xad\x31\x3f\x65\x6b\x9c\x62\xb9\x92\x36\x40\x19\xdd\x5e\xb5\x5a\x18\x53\x50\xb3\x2f\x9d\x75\x98\x85\xa7\x2a\xd5\xae\x51\xd0\x7e\xaa\x86\x9d\xa3\x47\x8f\x08\x37\x4d\x18\x2f\xc5\x0d\x19\x1c\x83\xe7\xd0\xc2\x38\xfb\x9c\x23\x29\x65\x13\xda\x7d\x61\xbf\xf2\x92\x07\xb9\xea\x39\x24\x0d\xac\xf5\x1e\xd6\x39\x5b\xa4\x14\x20\xdc\xb4\x77\x8d\x35\xb9\x41\x51\xe3\xad\xfe\x6f\xdf\xac\x8c\x74\x9a\x84\xd1\xe9\x5a\x29\x83\xf4\xfa\x5c\xab\x0e\xfd\xcc\x29\x39\x52\x91\xdc\xe3\x7a\xd0\x23\x15\xd0\xb4\xe7\x40\x63\xd7\x66\xdb\xcb\x05\xda\x24\x9b\x47\x90\xa9\x6c\xac\xb2\x58\x04\xfd\xb7\x93\x25\xf7\xed\x43\x39\x1f\x52\xcf\xf6\xc5\x5f\x23\xeb\xca\x98\x0a\xfa\x6e\x25\xc7\xeb\x57\x7a\xe4\x1c\x34\xcb\xc2\x71\xf3\x94\x65\x9f\x55\xce\xcf\xfe\xd8\x75\x0c\x8e\x31\xd4\xaf\x98\x75\xec\xd1\x8c\xd8\xa5\x52\x38\xa6\x31\x68\xf7\x5e\xf4\xd6\xa2\x93\xf5\x8a\x90\xfa\xae\x5b\xe7\x2c\x3f\x64\x12\xab\xba\xd9\xa3\x39\x0a\xc7\x19\x4b\x1c\x22\x42\x18\xb0\x28\x0b\xb3\x45\xc9\x14\xa6\x5e\x42\xbd\x7e\x26\xab\xc5\x0f\xf7\xaa\x12\x16\xcc\x86\xcc\x91\xfa\xce\x83\x9e\xa9\xb6\x3d\xba\xb6\x34\xf1\xe7\x8e\xa1\x76\xc5\xfc\xe8\xf6\x5d\xde\xb7\x32\x1b\xa5\x5f\x63\x42\x9b\x06\x7b\xf5\x44\x58\x39\x09\xe2\x0a\x78\x19\xc3\x56\xf2\x54\xee\x18\x5d\x5b\x36\x85\x1d\x2c\x7c\x3c\xa8\x7e\x9a\x5c\xca\x0c\xcc\x6f\x1e\xd4\x6e\x2f\x8b\x77\xa6\x5f\xd7\x59\xa5\x98\xfa\xb9\xca\x34\xbd\xd6\xea\x5c\x7a\x6e\xbf\x95\x2d\x7a\x8d\xfd\x61\xec\x72\x97\xef\x6f\x13\xfd\xf5\xe0\x99\x63\x69\x9b\x6f\xc6\xc2\x07\xba\xa0\x44\x40\x2d\x86\xca\xb7\xc3\x5d\x7b\x75\x75\x8d\xd6\xae\xdf\x69\x5d\x42\xaf\xcb\xc5\x69\x71\x9d\x72\xb0\xcc\x26\x8f\xb9\x93\x0c\xcf\xa1\x5d\x06\xba\xcc\x58\xbc\x16\xf8\x05\xbd\xea\xdb\xbd\xc9\x72\x5c\xf0\x21\x5f\x91\x8b\x4f\xd3\x1a\x5c\x5a\x9d\x9b\x53\x6a\x16\xbb\xa5\x3a\x5d\xc0\x5d\xd6\x52\xb7\x74\x3d\x5f\xac\x7c\xad\xd0\xe7\xd6\xdc\xb4\x82\x09\x5f\x60\xa7\x0a\xd5\x55\x28\x27\x8c\x06\x7b\xdd\x6f\x2c\x8c\x94\x51\x51\xd1\xb0\x51\xb4\x6a\xa3\xa1\x00\xcc\x3e\x33\x30\x36\x1a\x56\xda\x31\xc4\x3f\xd6\xfc\x27\x59\xa9\x02\xd5\x04\xcf\x39\xab\x74\x3a\x66\x96\xee\x88\x77\x2a\xb7\xc4\xcd\xa3\x31\x2a\xaa\xd4\x46\xd9\xda\x46\x96\xa9\x53\xdb\xb2\xcc\x32\x8a\x5b\x96\xad\x54\xdd\xda\xb2\x16\x25\x8b\xca\xb7\xb0\xab\xdf\x29\xdd\x99\x56\xe7\x84\xa2\x4c\x41\x7f\xca\x63\x48\x91\x5f\xba\x71\x21\x33\xed\xf9\xa1\x70\x62\xd0\x29\xdd\xf2\x2e\x28\x7c\x59\xb8\x46\xe5\x17\xb6\xbc\x15\xfa\x76\x4e\x45\x3b\x1f\x99\x9c\x8f\x4a\xda\x12\x99\x56\xd5\xec\x4c\xbc\x89\x59\xe5\x52\x25\xe0\x78\xd0\x5b\x93\x8c\xb2\xe6\xc1\xda\x40\x6e\x31\xcb\x51\xc7\x77\xc8\xcc\x51\xe5\x09\x34\x78\xd6\x4e\x34\x3e\x74\xc4\xa6\x29\xff\xe0\x24\xe7\x7f\x8b\x1b\xd7\x36\x85\xb0\x92\xdd\xff\x5c\x21\xd1\xb5\xb5\xbe\xbd\x2b\x32\xe4\x42\xca\x7b\x87\x9e\x89\xcd\x23\xd1\x81\x26\xa6\x3b\xb2\x3f\xee\x81\xbd\x95\x93\xa9\xa3\x5c\xad\x73\x51\xdf\x8d\x65\x96\xeb\xe8\xf3\xb1\x66\x6e\x0d\xb3\xda\xa9\xa2\x74\x95\x11\x25\x1d\xdd\x7c\xf9\x06\xa4\x75\xd0\x24\xba\x97\x5f\x21\xe7\x60\x96\x4e\x58\xc3\x71\x1c\xb1\xa3\x38\xca\xfc\x30\x42\xe3\x40\x2b\x3f\x2b\x07\x7d\xde\xf1\xcb\x6c\x41\xba\x13\x52\x8e\xf2\x24\x50\x29\x45\xbd\x03\x85\xf2\x7f\xe2\x74\x43\x47\x0d\x3b\xbd\x6c\x39\x25\x97\xc7\x15\x30\x72\x6b\xee\xaf\x57\x7c\xbd\x5d\x56\xd4\x86\x6a\x3e\x88\x57\xc0\x42\x65\xe6\x17\xc7\x09\x2e\x6b\x91\x33\x88\xab\x90\x60\xe2\x3d\x38\x57\xd3\x2b\x37\x85\x92\xa4\x79\x65\x07\xc7\x56\x39\xb5\x9c\x52\x7c\x60\x69\x9e\x92\x57\xe6\x8c\x09\xa5\x60\xac\x70\x6c\x8b\xeb\x1d\x7a\xeb\x43\xf2\x4e\x3b\x3f\xb2\x71\x34\x5e\xa0\xa8\x94\x48\x0e\xcf\x33\x05\xa7\xc0\x74\x36\xf7\xd4\x57\x2f\xb2\xf8\x52\x6f\xee\xa9\x36\xe9\xf1\x3d\xf5\xd3\x7c\xf0\x05\x0a\x98\x4f\xfc\xa9\x6a\xd9\x33\x9c\x82\x30\xad\x74\xff\x20\x2f\x09\x58\xd0\x58\x7b\xbb\xe2\xd3\x34\x35\xfa\xd6\xdb\x81\xea\x74\xf2\x4a\x51\x42\xb9\x17\x29\x5f\xec\x66\x10\xa6\xd3\xb1\xbf\x10\x9c\xb8\xa6\x35\x9c\x2c\x60\x7a\x52\x73\x3c\x69\xfb\xc1\x70\x9b\x56\x84\x32\x5f\xbd\x2b\xcb\x16\xef\x7d\x95\xe5\xc9\x97\xeb\x38\x05\xb3\xf8\x5e\xc1\x5b\xf3\x44\x79\x4b\xf2\x59\x56\xf4\x77\xd1\x1e\x2d\x72\xb6\x79\x60\xee\xa5\x94\xd5\xa7\x37\xed\x78\x7d\x71\x16\x55\x5f\x48\x6e\xbc\xdc\xa0\xd3\x02\xd3\xd2\xaa\x9c\xcb\xa8\xcb\x38\xe7\x95\xc3\xf7\x93\xc4\x5f\xbc\x1f\x39\xa5\xc0\x8d\xc7\x54\x97\xe9\x70\xe1\x35\x55\xa9\x62\x2a\x47\xab\x50\xe3\x16\xa4\x90\xef\x24\xe2\x9e\x27\x4d\xff\x6c\x93\x26\x74\xfc\x8c\x67\x99\x91\x2c\x7f\x52\x38\x6e\x7a\x54\xb1\x96\x86\xc8\x0b\xc6\xc2\x63\x98\xa6\xc6\x5e\xa3\x13\xf8\xe9\x19\x5e\xa9\x73\x3d\xf1\x28\xbf\x3f\xc6\x5a\xba\x4c\xfd\x00\xac\xd1\x50\xae\x89\xc6\x6c\x1b\xa4\xbc\x2a\x47\x0e\x5f\x0c\xc5\x3a\x52\xbd\xdc\x88\x78\x51\x1c\xb0\xeb\x28\x20\x27\xff\xf2\x06\x06\x71\x8c\xfa\x4f\x1a\x52\xf5\xa5\x96\xed\x9e\x90\xc1\x80\x0d\xc3\x00\xbd\xa8\xc2\x4c\x98\xa9\x90\x30\xe1\x83\x00\x97\x61\x76\x26\xcf\x11\xc8\xb0\xa6\x29\xfb\xf2\x8c\x45\xb4\xb2\x15\x8b\xaa\x07\x05\x1b\x77\x69\x2c\x65\xcc\x8e\x1a\x3c\x8b\x16\x61\xcd\xb0\x5d\x19\x1a\x98\xd2\xcd\x07\xac\xe5\x11\xb6\x67\xa9\x9a\x76\xab\x85\x29\xa4\x81\xd7\xd6\xa4\xb2\xa4\xaf\x9c\x5e\xa3\x44\x29\x4f\x42\x2a\xac\x51\x44\xbf\x5b\x6b\xc4\x64\x8a\xd0\x17\xbd\x7e\xd9\x50\xa9\xc9\xcb\xce\xe0\x4b\xc1\xab\x72\xa2\x95\xd5\x10\xd1\xdf\xe1\xeb\x15\x92\x22\x63\x93\xa9\xeb\x72\xb3\x92\xa8\x72\xf0\xa0\xe4\xa9\x4f\xed\x6e\x93\xbb\x8a\x58\x1b\x8d\x77\xa9\x17\x36\xdf\x86\x69\x76\xe4\x0f\xcf\xaa\x6e\xb2\xb4\xb7\x9f\xba\x52\xa7\xf9\xc3\xf3\xa3\x31\x45\xfd\x2f\xbd\x85\xb3\xb3\x6d\x16\x7d\x49\x51\xbe\xab\xca\xee\x98\x65\xff\xcc\xaa\xee\x41\x3d\xd9\xd9\x35\x0b\xfe\xc5\xaf\xba\xd7\xf4\x64\xe7\xb1\x59\xf0\x53\x0d\xc4\x27\x14\x05\x0d\xdf\xaa\x3e\x42\x1b\x27\x05\x9f\xaa\xc1\x10\x69\x41\x4a\x9a\x2f\x46\xd3\x2c\x4e\x18\x9c\xb3\xc5\x26\x6e\x04\xc0\xd4\x0f\x93\xb4\xf9\x00\xe8\xa1\xeb\x69\x12\x5e\xf8\x19\xc3\x6f\xc3\x15\x9c\xf2\xfc\xc4\x9f\xc0\x57\xdc\xa4\xbe\x82\x1e\x8b\xb2\x24\x64\x69\x1f\x9f\xfb\xce\xc1\xc3\xb7\xd8\x79\xc3\xb9\xd7\xb1\x3f\x71\x94\x1c\x51\x53\x07\x5f\x0f\xfc\xcc\x57\x37\x7b\x8f\xf9\x2f\x74\xe2\x8e\xd8\xa5\x1e\x4e\x55\x4b\x5d\xe8\xc7\x70\x5d\xe2\xc1\x3b\xfe\x4d\x51\xcd\xb7\xe0\x45\x10\xc0\x84\x65\x67\x71\x80\x78\x9c\x60\xa3\x27\xcd\x07\xf8\xd7\xb8\x78\x33\x14\x43\xaf\xf9\xe0\x20\x5f\xa6\xb7\x46\xa1\xdd\xd7\xfa\xb2\x1c\x31\x41\xa1\x60\x93\xae\x07\xc9\xb1\x2f\xe6\x9f\xe1\x38\xcb\x21\x2f\xe6\xa7\xba\xfe\x27\x5e\xbf\xf8\x7a\x29\xd6\x28\xb9\xbd\x5b\x1b\xdc\xd8\x7a\x2a\x75\x1d\x9f\xd1\x0f\xf0\x96\xcf\x60\x16\x8e\xb3\xcd\x30\x12\x94\x82\x44\x5e\xdd\x48\x9b\x1c\x1e\xfa\x02\xcc\xa2\x21\xba\x87\x43\x17\x5e\x0b\xc0\x1a\xe3\x03\x03\x60\x16\xf3\x05\x42\x3c\xbe\x60\xf8\xdc\x7b\xc0\x86\xf1\x64\x1a\x8e\x59\x20\xef\xc1\xc6\x23\xa5\x3a\x6c\xf8\x9f\xe3\x4f\x38\x59\x8a\x95\x23\x36\xd7\xcc\x44\xa2\xc1\xd4\x71\x74\xc1\x38\x19\x4e\x78\xa9\x13\xde\x60\x98\xa5\x12\xfa\x30\x0e\x58\x29\x07\x0b\x8e\x95\xc8\x5f\x61\x1b\xc8\xaf\x8a\x23\x39\xa3\x12\xf0\x26\x56\x21\x8b\x3b\x85\xaf\x34\x89\x5f\xc1\x47\x91\xc0\x3b\x96\x6b\xcf\x60\xec\x2c\xfe\x84\x79\x38\x02\xc4\xd8\xe8\x28\xcc\xdb\x7b\xa8\x6e\x83\xa0\x34\x67\xc9\x42\xad\x12\x8c\xab\xa2\x92\x12\xe4\x7b\x8f\x60\xa4\x4b\xed\xd0\xc7\x78\x06\x0c\x75\x6c\x05\x08\x6a\x6a\x03\xd6\xd6\xaa\xaa\x5d\xe9\xf5\xc4\xda\x1a\xca\x4a\x81\xc5\x64\x2f\x4a\xb8\xac\x36\xa4\xf1\x52\x8a\xf9\x13\xab\xd5\xcb\xdb\xdb\x52\x81\xa2\x1d\xf5\x29\x9e\x54\xaa\xda\xc7\x52\x31\xa2\x8a\xa9\xd6\xa0\xdb\x18\x8f\xcc\x62\x53\xf4\xfd\x4a\x19\x0c\xc2\x6c\xe2\xa7\xe7\x29\xca\x02\x29\x2e\x9e\xe5\x27\x61\x6a\xb2\xe8\xd1\xfb\x77\x1f\x5e\x7c\x7c\x75\xfc\xe1\xc5\xc7\xcf\x6f\x5e\xbc\x3d\x7e\xfd\xf6\xc5\x9f\xa1\x0b\x22\x7a\x9f\xcc\xfd\xf2\xd3\xfb\x8f\x2f\x5f\x7d\x7c\xf5\x52\xe6\x77\x34\xe7\xbe\x80\x74\xca\x86\x21\x3e\x5d\x1f\xc0\x05\x4b\xf0\xbe\x4f\x3c\x82\x93\x81\x9f\xb2\x37\xe4\x3c\xf9\x92\xb1\xe9\x09\xa2\x82\x7d\x4f\xc9\x0e\x4a\x67\x53\x8c\x44\x30\x22\xfd\x3b\xf5\x13\x34\x8b\x02\xc6\xa6\x16\xb2\x35\x9c\x2f\x74\x35\x42\x45\xbe\xa7\x2f\x41\x08\x3f\x61\xcd\x92\xd2\xb8\xc5\x80\xa5\xe9\xab\xb6\x0e\xad\x17\xae\x24\x41\xb1\x9a\xfc\x1e\x8d\xfd\xd3\xb4\x09\x9f\x18\xb3\x7a\x4b\x3d\x9d\xf0\x69\x28\x60\x99\x1f\x8e\xd3\x66\xb9\xb4\x52\x6c\x83\xf0\x77\x81\x8d\x25\xb3\x32\x2b\x4f\x89\x12\x30\x8c\x37\xfa\xba\x4c\xf2\x03\x96\xb1\x64\x12\x46\x8c\x97\x09\x2f\xfc\x31\x8b\xb2\x94\x0f\x0e\x72\x84\x0d\x8f\xce\x46\xae\xc4\xac\xfa\x39\xf1\x87\xe7\x29\x5f\x45\xf0\x21\x65\x01\x9c\x20\x95\x4e\xf0\xe6\xc4\x09\xd2\xed\x44\x4c\xba\x69\x4e\xb1\x70\x93\x94\xf9\x91\xd6\x2c\x27\xdc\x58\x3b\xe1\xfa\x22\x93\x23\x94\x82\x9f\x98\x48\x79\xe4\x56\x7f\x82\xce\x88\x27\x39\xdd\x83\xfd\xc3\xb1\x4b\x1d\xac\x2d\x76\x89\x3c\x39\x10\x9e\x41\x49\x4f\x93\xc3\xa3\xbe\xe8\x69\x38\x4c\x3f\x08\x1e\xeb\xaa\x31\x7c\x54\x2a\x03\x72\x7b\xc4\x4f\x92\xb7\x74\x12\xd6\x25\xc4\x73\x2f\xcf\xc6\xd9\x99\xca\x47\x9c\xe4\x7d\xd1\x07\x42\x41\x6a\x00\x0f\xbb\x46\xe9\x47\x8f\xe0\xa1\xa3\xd1\x79\xf4\xc8\xc8\x7b\xae\x5b\x75\x73\xc1\x30\x84\xaf\x26\xe9\x3a\x6e\x09\xa4\xe9\x6c\xc2\x60\xb8\x18\x8e\xc3\xa1\x18\x54\x49\x59\x7f\xdc\x7c\xa0\xb6\x6a\x87\xe7\xe8\xeb\x89\x5f\x7c\x2a\x27\x3a\xa2\x26\x15\xf7\xe9\xb1\x04\x5e\x24\x91\x45\xb0\x3f\x79\x0c\x14\x2c\xd1\x5f\x89\x0c\x92\x97\x1c\x91\x60\x53\x05\xff\x4c\x58\x4a\xf6\xb0\x34\xd7\xd1\xda\x63\x78\xac\xe2\x14\x47\xc0\xd6\x33\x2e\xfa\xff\x5e\x6a\xbd\xba\xaf\x77\x2f\x91\xbe\x84\x6a\x2a\x7b\x23\xb8\x02\x3b\xa5\xb3\x04\xa7\xc8\xfe\x12\xdd\xde\x9c\x46\x5c\x3a\xa3\x38\xda\x24\xa4\xf5\xd2\x97\x13\xed\xf2\x2c\x1c\x33\x70\x36\x36\x28\xf3\x99\x31\x20\x46\x6c\x55\x3f\x49\x7e\x46\xc5\x2a\x58\x83\x5c\x7e\x0c\x47\xb4\x38\x3b\x93\x05\x10\x0b\x51\xc0\x7c\x48\x58\xb1\xad\x7d\x3a\x25\x14\x51\x80\x2e\xd2\x82\x49\x14\xd8\x43\x83\xdb\x1d\xd9\x86\xa7\xd0\x11\x5e\x62\x4a\x46\x04\x6d\x48\x14\x14\x90\x7d\x13\x88\xae\xaa\xc1\x09\x20\xb6\xbc\x11\x10\xf3\x66\x0b\x6d\x91\x0a\x6c\x1f\x9a\x1b\xcc\xf6\x59\xa0\x2c\x63\x6e\x20\xaa\xbb\xdf\x39\x6f\x08\xc5\x35\x8a\xdd\xc1\x0e\xc4\x77\x25\x37\x39\x3e\xb2\xe1\x2c\x49\xc3\x0b\x36\x5e\x48\x9a\x49\xfd\xe2\xa4\xb3\x74\xc8\xa6\x59\x38\xa0\x7b\x5c\x78\x43\x96\x74\xdb\x38\x9c\x84\x59\xea\x36\x55\x07\x38\x47\xe6\xfc\x3c\xd4\x1c\x2d\x19\x48\xd9\x04\x9a\x44\x71\x76\xf6\x26\xef\x90\x07\xfa\x6a\x05\x4d\xdd\x08\xdc\x2c\xfb\xe8\x91\x55\x98\xff\xe7\x68\x56\x22\xb9\xa2\x1f\xdf\xbe\x69\x5d\x56\x3a\x46\xa5\xea\x8f\xc6\xc8\xcd\x23\x65\xb8\x03\xb2\xa8\x39\x9d\xa5\x67\x8e\xc2\xe9\xc0\x2a\x69\xbe\x7a\x7c\xe5\xda\x07\x26\x65\x03\x53\x1e\x23\x51\x5f\x26\x7b\xe8\x98\x07\x9d\x15\x3d\xb5\x30\xb8\x71\xaf\x15\x14\x03\xed\xa5\xb8\xe9\x4a\xea\x0c\xbd\x20\x32\x54\x64\x3e\x47\xeb\x19\x7d\x7a\x30\x1b\x67\xe5\x36\xa7\x31\x7b\x95\x98\x9d\xb5\x4f\x30\x2c\x65\x76\xbe\xf3\xa7\x75\x66\x67\xa7\xf5\x44\xae\xb2\x85\x1e\xe5\xcb\xc7\x2a\xc3\x73\x27\x57\xb6\x66\xf5\xfe\x78\x57\x2f\xca\xad\x75\x79\x24\x0c\xaa\xf2\x85\xf9\x2c\x0a\x7f\x9b\x31\xc3\x00\x59\x75\x59\x4e\x35\x69\x55\x2e\x66\xbc\xaa\xc5\xb8\xe8\x84\x43\xc5\x0c\x3b\xa0\x30\x51\x8d\xe5\x24\x2e\x20\xea\xf7\x32\x5b\xb0\x2f\x91\x35\xa6\xf6\xb2\x95\xbc\x1c\x88\x83\xb2\x19\xc4\xbe\x99\x89\xd5\xfd\x20\x10\x98\x89\x89\x41\x46\x5c\x2e\x5f\xe4\x8b\xce\xf0\x75\xbe\xf8\x34\x56\xd7\x3e\x8e\x69\x49\x06\x17\x74\x3e\xf1\xeb\xb1\x3f\x28\xab\x2f\x56\xef\x7a\xd4\x4b\x17\xe8\x22\xbb\x84\x8d\x6b\x5f\x0c\xc8\xad\xd1\x91\x59\xce\x18\x37\x2f\xc3\x11\xf8\x70\x82\x63\x77\x22\x56\x29\xdc\x74\x3e\x39\x67\x8b\x13\x60\xf3\x30\xcd\x6a\xad\x7f\x69\xb2\x12\xa7\x71\x86\xa0\xaf\x2c\x86\xdf\x66\x2c\x59\x58\xf6\xad\x5c\xef\x9e\xb3\x85\xdc\xd1\xe1\x96\x30\x37\x49\x59\xc4\x17\x9c\x9c\x8b\x38\x5a\xcb\x9b\xb3\x7e\x24\xaa\xe6\x91\xae\x35\x67\xd5\xcc\x80\x1f\x14\xe8\xca\x7c\xf9\x8c\x58\xf9\xcc\x4f\x1d\x9e\x53\xae\x54\x86\x7a\x98\xf2\x43\x51\xfb\x3e\x41\xc9\x50\xbc\x98\x4e\x31\x52\x18\x12\x82\x4e\x0e\x71\x89\x70\x42\xbc\x89\x7b\x11\xc2\xf8\xbf\xd9\x4a\x6c\x12\x07\xe1\x68\x51\xb6\x10\x13\xc2\x66\x4b\xb2\x8f\xf8\xe4\x06\x41\x54\x50\x43\xa0\xf1\x31\x08\x8b\x89\x1f\xf8\xcc\x26\xac\x96\x95\xe5\x3e\x6f\xdd\x8f\x46\xb4\x6d\x65\x9a\xfe\x28\xff\xd7\xc8\x37\xd9\x83\xa2\xfa\x06\xb5\xab\x62\xa7\xa4\xca\x0e\xb4\xf6\x2c\xb0\x4e\xf9\x68\xab\x8e\x95\x0c\x77\xed\xdb\x07\x65\xc3\x5d\xb9\x5e\x3f\x16\x7e\xc0\x85\x85\x7a\x3c\xcb\xf2\x6b\xf5\x30\x63\x89\x9f\x31\x06\xe9\x59\x9c\x64\x67\x7e\x14\x2c\xb3\x4c\xef\x21\xd0\xbe\xcd\x1e\x02\x14\xc4\x17\x2c\xa9\x58\xe0\x4e\x13\x16\x84\x43\x5e\xc8\x5a\xe0\x86\xd1\x45\xcc\xd7\x22\x53\x96\x08\x28\x61\x1c\xd5\x33\x0e\x67\x72\xae\xab\xa9\xa7\x2c\x10\x23\x5b\xc2\x47\xaf\xc9\x27\x5a\x70\x92\xc2\x60\x29\x66\xa2\xbe\xd9\x73\x48\xd9\xea\x31\x61\xe9\x1b\x01\xa5\x55\x58\x32\xf5\xfa\xcb\x70\x1a\xc7\xe4\xa2\x64\x15\x72\xa0\x8c\x5b\x85\xba\x73\x51\xb4\xec\x0b\x76\x52\x4f\xe2\xb4\xb1\xa1\x83\xfd\x58\x66\xd2\x12\x26\x8f\x41\xc0\x12\x8e\xad\x7d\x3c\xe0\x5a\x93\x67\x6b\x1d\x44\x48\x4f\xf8\xf9\xc5\x47\x78\xf3\xd3\xbf\xbd\x3a\xfa\xfc\xe6\xfd\x4f\xb0\xbe\x95\x87\xe6\xc2\x57\x74\x44\x89\xe3\xaa\x93\x05\xe3\xa8\x64\x36\x78\xcd\x95\x75\x95\xb5\xf3\xe4\xa9\xdc\x69\x7b\xc9\x32\x6e\xd0\x8c\x12\xc6\xb5\x56\x12\x62\x64\xbd\x13\x81\xf7\x89\xde\xfc\x4d\x18\x7b\xa5\x37\x1e\x85\xd3\xaf\x4c\xe8\xc2\x1a\x19\x46\x6b\x7c\xcd\x2d\x93\x1f\x3d\x82\x87\xf2\x2c\x29\x8a\x03\xf6\x79\x31\x65\x46\x7e\x2d\x02\xd4\x65\xbb\x7d\x11\x2c\xac\x6b\x21\xf3\xe8\x91\xc4\x66\x22\xb2\x6d\x64\x44\x2a\xc7\x45\x0c\xac\x89\x0a\x25\xd9\x98\x70\xa1\x9a\xc6\xd3\xd9\xd8\x4f\xe0\x28\x9e\x4c\xe2\xe8\xdf\x3e\x01\xfa\xea\xa0\x6e\x39\xb1\xf9\x43\xa3\x48\xe9\x9a\x48\x06\xca\x8f\x1e\x19\xbf\x34\x67\x75\xad\xae\x08\x2c\x7e\x94\x3b\xfd\x24\x07\x25\x1b\xfd\x3f\xce\x46\x23\x74\xde\xb2\x5b\x3c\x44\xd6\x68\x8a\x5c\x7b\x77\x61\xcb\x80\x5b\x38\x41\x40\x05\x99\x9d\xc5\xa9\x38\xd0\xc5\xad\x73\x7f\xc2\x20\xe2\xff\xf8\xa9\xd8\x57\x3c\x19\xc7\x81\x9f\x9e\x9d\x48\x3b\x4e\xe1\x13\xf9\x59\x78\xc1\xde\xa4\x0a\x2f\xf1\x71\x28\x3e\x9a\x61\x5a\x81\x54\xce\x78\xa2\x39\xfa\x84\x82\x9b\x0c\xa8\xae\x54\xc3\x14\xf8\x10\x3f\x27\x6c\x32\x60\xc9\xfb\x11\x1c\x53\x4e\x18\x0d\x19\xec\x34\xb7\x9b\x2d\x32\xb8\xfd\x8c\x9d\xc6\xc9\x02\xde\xfa\xd1\xa9\xa9\x81\xd7\xc5\x14\xad\x67\xe8\x1b\x18\x49\x25\x38\x16\xcd\x23\xf8\x57\x36\xf7\x27\xd3\x31\x13\xd8\x1f\x2b\x12\x38\x5c\x5d\x8b\xcf\x0e\x7a\x42\xad\xf3\x95\x7f\xf7\x39\xc5\x53\x2d\x2d\xfe\x25\x8c\xb2\x3d\xba\x6b\x62\x57\xc1\x06\x1f\xc8\x61\x08\xf5\x00\xe4\x46\xe4\xdb\x37\xad\x11\xca\x2c\x61\x59\xf3\xa0\x56\x1f\x5d\xd1\x51\x47\x9d\x4a\x73\xda\x4f\x76\x5c\xa9\xae\x5c\xb7\xa0\x2b\x6b\x03\xa4\x2f\xb5\x3c\xa4\x7d\x69\x2e\xbe\xc1\x0b\x9a\x96\xca\x15\xdc\x9e\x7c\xab\x8e\x57\xf8\x12\xf9\x49\x55\xc9\x8e\x7a\xd7\x88\xeb\x85\x2f\xd5\xe1\x0e\x9f\xec\xb5\xc5\xe3\x55\x3f\xc5\x01\x6b\xfe\x9a\xc2\x19\x1b\xf3\xb9\xba\x44\x42\x39\xa8\x1c\x96\x0a\xfa\xa3\x47\xea\xbb\x19\x1a\x65\xae\x11\x08\x3c\x9c\x0f\x47\x21\x9f\xe4\x39\xeb\x71\xa5\x67\xcc\xf7\x4b\xc9\xc8\x76\xb3\xf5\xfd\x65\xc4\x40\x74\x39\x41\xd1\x24\xc9\x71\x7f\x8d\xb4\x18\x75\x7a\xfd\x3a\x11\x29\x8c\x89\x35\x4c\x87\x9a\x5d\x9c\x7c\xa6\x0b\xfb\x05\xee\x2b\x17\x26\x2b\x3f\x27\x02\x3b\xcb\x04\x6f\xb6\x96\x96\xca\x3f\x60\x86\x5c\xac\xcf\x43\xce\xfc\x4c\xd8\x8c\xea\x9c\x95\xfc\x71\xb2\x54\x85\x31\x26\xbf\xa9\x51\x9c\x4c\x58\x70\x8b\x23\xd7\xcb\xc4\x9f\x56\x18\xb3\xaa\x01\x61\x06\xe7\xdb\xcd\x71\x8d\xae\x58\xb0\x61\xe5\x91\xb5\x6d\xbd\x72\x3b\xfa\x45\x72\x8a\xb4\xf2\x34\x58\x6b\x89\xa9\xe8\xe8\x27\xa7\xf9\x23\x86\x59\x34\x74\x54\x2d\x2c\x20\x63\x6e\x97\x99\x7a\xa2\xb5\x92\x71\xbb\x9d\xa7\xcb\x52\x66\xde\xe9\x38\x1e\xf8\x63\x61\xe6\x45\xf1\x65\x65\xb0\xd9\x8e\xfb\x00\xc0\x93\x96\xa0\x30\x7f\x2e\xc3\x28\xe0\x75\xb8\xfd\xa3\x66\xd9\x35\x38\x04\x02\x0b\xfb\xa2\x04\x56\xbd\x60\x51\x10\x27\x14\x3f\x66\x12\xff\xbe\xe6\xc1\xda\x25\x1b\x9c\x87\xd9\x5a\x1f\xf3\xd3\xd9\x68\x14\xce\xb5\x5b\x6a\x18\x47\xaf\x13\x7f\xc2\xd6\xa8\x61\x7f\x04\x5d\x6c\xbe\xb7\xc6\xf1\x62\x69\xb6\x06\x1b\xa2\x12\x01\x18\x1a\x45\x86\x7e\x34\x64\x63\xa3\x04\x9f\x90\xcc\xac\x8f\x45\x18\x0f\x46\x71\x62\x86\xa9\x7e\xc8\xdb\x7c\xf4\x08\xe3\x98\x0a\xe4\x73\xb1\x4c\x39\x3b\xe8\x46\x45\x99\x5e\xd8\x87\x0d\x58\x2b\x69\x00\x4c\x14\xed\xd2\x47\x79\x7c\xc5\x92\x42\x62\x5d\x56\xba\xa4\x05\xda\xf8\xc2\x83\x71\xb1\x2e\xc5\x8d\x88\xd7\xaf\xe1\xcc\xbf\x60\x90\xbc\x78\x0d\x83\x59\x86\xa1\xda\x86\x2f\x5e\x3f\x08\x47\x0e\x76\x92\x22\x49\x8d\xf4\xca\x6c\xec\xa7\xf8\xf0\x03\x62\xe1\x41\x18\x18\x3f\x7e\x9b\x31\x5c\x2b\xf5\xfa\x22\x61\xc4\x47\xe9\xa5\xbe\xa5\xd3\x6e\xb5\x5a\xb0\x05\x8f\x5b\x0f\x14\x7d\xf4\x33\x7b\xfe\x78\x3c\x50\x27\x8a\x7c\x79\xe5\x20\x3c\x79\x5b\x2e\x77\xc3\x00\xbd\xff\x89\x2d\xa3\xf8\xd2\xd1\xbb\xd3\x74\xa5\x5f\x3e\xcd\x37\xf1\xe7\x4e\x2b\x8f\xc8\x26\x38\x58\x75\x13\x7b\xe3\xca\xba\xa2\x6b\x58\x7d\x03\x81\xab\x43\xb5\xec\x73\x38\x61\xf1\x2c\x73\x0a\xaf\x5b\x48\x5c\x86\x53\xe8\x12\x01\xe8\xb1\x78\xa7\xa5\x51\xda\xda\x02\xf2\x14\x23\x02\x9d\xb1\x04\xe7\xb1\x69\xc2\x2e\x58\x94\x99\xc5\x24\x11\x52\xf2\x5f\xa4\xed\x9a\x30\x3a\x85\x71\x98\x66\x2c\x62\x49\x6a\x96\xce\x62\xd4\x57\xc3\x59\x92\x70\x2d\x87\x9d\x5c\x4b\xa9\x15\x55\xce\x26\xa2\x0a\x87\x83\xef\xb6\xe6\x43\xaf\x0f\xa7\x45\x36\x96\xff\x71\x8e\x18\x4e\x7b\x61\xbf\x49\x62\x32\x66\x41\xfe\x18\x24\x4b\x16\xf9\x73\x11\x59\x83\xba\xe5\x20\xbd\xed\x03\x11\xf2\x34\x71\x58\xf1\x4c\xa5\x82\xec\x22\x2a\x2a\x83\x2b\x0f\x5a\x6e\xf5\xe9\xca\x83\xfc\xd7\x95\xb8\xf7\x9c\xc4\xb3\x28\xc0\xa0\x63\x62\xe8\xa9\x00\x11\x0a\x0f\x6f\x24\x26\x74\xed\x6f\x1f\x36\x36\x42\x75\x43\x4a\xf6\x65\x5f\x7d\xe9\x1c\x41\x97\x7d\x39\xd1\x6b\x07\x7d\x31\x01\x84\x81\x7e\xac\xc1\xe2\x7e\x6a\x49\xd2\xa0\x64\x68\xcc\x61\xcc\x8d\x8e\x94\x14\x4e\x69\x82\x83\xc2\x62\x83\x54\x3d\xb4\x46\x50\x9c\x1e\xdb\xa7\x4b\x72\xa3\xbc\x30\x1f\x29\x6c\x47\xe2\x44\x6f\x6b\x0b\xfe\x9a\xf8\x53\x08\x23\xf0\xad\x69\xd3\x66\xef\xad\x2d\x38\xa1\x26\x4f\x60\x1a\x67\x2c\xca\x42\x7f\x3c\x5e\xc0\x80\x71\xd6\xa6\xc7\x13\xf0\x95\x11\xcd\xd3\xb4\x66\x40\xb5\x24\x61\x1a\xdb\x23\xfe\x88\xac\x7f\xae\x00\x3d\x18\x45\xee\x83\xab\x1c\xb6\xa2\x8b\x26\xd2\x84\xf2\xd0\x1f\x35\xfd\xe9\x74\xbc\x10\x95\xd5\x13\x0b\x25\x30\xa6\xf1\x78\x31\x0a\xc7\x16\x14\x5a\xcc\x6b\x27\xad\x87\x66\x02\xc8\x13\x19\xd2\xe4\x72\x13\x52\x38\xb9\x8b\xc9\xc9\x9e\xc3\x78\x51\x7f\xa4\x0b\x11\xde\x85\x32\x43\x7f\x84\x2a\xfc\x76\x0b\xa2\x9d\x76\xc9\x3a\x68\x67\x19\x1f\xc0\xeb\xd7\x41\x7f\x66\xd9\x67\xbf\x2a\x60\xfc\xae\xf4\x85\x35\x83\xc6\x56\x5a\x14\xf2\xa0\x2c\x4c\xe9\x10\xe2\x6d\x78\x5e\x55\x78\x67\x47\x6e\x1d\x9d\x50\xd9\x7f\x91\xfe\x7f\x27\x72\xb7\xaf\x64\x45\x44\xb4\x26\x74\xd7\x7a\x62\xcc\xa8\x7e\x7f\xed\xe0\xae\x9d\x1d\x3d\x83\x33\x64\xa9\x7c\x20\xf7\xef\xe6\x10\xa9\x9d\xd9\xf8\x2a\x4a\x7a\x19\x61\x47\xe3\xcb\xc8\xf4\xd5\x90\x80\xed\x10\xf3\x14\x40\x5e\xf6\x24\x17\x7f\x3e\xd7\x44\x18\xf1\xf5\x3e\xef\x83\x18\x9c\x13\x33\x42\x74\x6e\x34\x8e\xb2\x38\xb1\xb0\xb7\x7d\x1a\x09\x80\x7b\xed\x46\xcd\x74\xec\x53\x2c\x77\xbc\x04\x44\xcb\x92\xd4\x03\x5f\xa6\x01\x5d\xe3\x0a\x60\xb0\xe0\x98\x71\x48\x65\xc8\x01\xff\xff\x48\x6c\x41\xf9\x70\xd2\xeb\x29\xb6\xed\xf7\x4f\x70\x4b\x3f\x9a\x8d\xc7\x27\x4b\xaf\x76\x5b\xcd\xbd\xef\xbf\xda\xb5\x89\x71\xdd\x72\x57\x29\xef\xd7\x71\x4c\xda\x72\x5d\x1d\xa7\xe2\xcb\x35\x3c\xe1\xca\x58\xe7\x7e\xe0\xe0\xc5\x63\x50\x5c\xfb\xbf\x8e\xe3\xb2\xd5\x6e\x59\xf1\x5e\xdb\x83\x8e\x07\xdb\xa5\xcb\xe3\xb2\x0a\x5f\x61\x6d\xbe\xb6\x0f\x2d\x0f\xd6\x16\xfc\x2f\xdd\x5c\xaf\x58\x80\x9b\x15\xed\x38\xe6\xe8\x4b\x5b\x52\xd3\x58\xe3\xd9\xd5\xe5\x4b\x01\x0f\xd4\xd5\x57\xad\x93\x64\xe6\xb7\x6f\x86\x06\x94\x89\x0f\xbb\x5a\xcd\xd4\x79\x9a\x89\x60\x45\xa8\x15\x4c\xed\x28\xe0\x48\x2f\x32\x51\xa4\x6b\xbb\x03\xcb\xa0\x31\xc9\xcc\x82\x77\x44\x6f\xe4\x94\x3d\x0e\x81\x70\x3c\x58\x33\x78\x7d\x0d\x03\x6b\x62\x46\xd3\x48\x36\x5c\x30\xc4\xa2\x8e\xc0\x5a\x11\x33\x1e\x3d\xa2\x54\xf3\x7d\x01\xfe\x5b\x38\xe2\x14\xe5\xf8\x08\xdf\x27\xe8\x76\x0b\x52\x5f\xbe\x04\xb6\x06\xa3\x64\x21\x7c\x3b\xcf\xe2\x3b\x7f\x7d\x4a\x59\x1f\x46\x20\x3d\xe8\x82\x9d\xfc\x69\x9a\x94\x25\xff\xc8\x7e\x0f\x71\xbf\xd4\xdc\x95\x5e\xf9\xd9\x93\x7f\xe2\x77\x3b\x30\xce\xfe\xd1\xd1\x97\x8f\x2f\x8e\xfe\xc6\xf5\x0d\xdb\xdc\x11\x14\x18\xce\x06\xe1\x90\xe8\xf3\xda\x1f\x12\x73\x1b\xcf\xab\xe5\x32\x9d\x61\xdb\x83\x61\xc7\xda\x94\xe9\xb5\x3c\xd8\x86\x75\xe0\x59\xf8\xb7\x03\x9b\xf0\xd8\x4c\x68\xc3\xa6\xcc\xd9\x80\x76\xff\xe0\x81\x7c\xeb\x6a\x32\x1b\x67\x0b\x11\x97\x4e\x35\xaa\x12\x1d\x54\xde\xa9\x07\x99\xd5\x1e\xa5\xe2\x7d\x5f\x7d\xcb\x17\x13\x3d\x08\x73\xd2\x4b\xea\x7f\x9d\x16\x27\xd3\xf8\xd2\xc9\x78\x19\x94\x67\x57\x46\x72\x32\x80\x24\xcc\xc3\x25\x5f\x1e\x4a\xc2\x60\x03\x33\xa8\xa6\xee\x80\x41\xa0\x0a\xba\x95\x51\xcc\x78\xc9\xcc\x3c\x0f\xa5\x8e\x71\x8b\xb4\x8a\xec\xc2\x05\x53\x80\x29\x23\x94\xdc\xf2\x12\xf8\x05\x0c\xb7\x00\xc3\x0b\x76\x54\x8e\x69\x69\x81\x3b\xc6\x19\x74\xa4\xb1\x0f\xb2\x78\x6d\x20\xb0\xa5\x46\xb8\x30\xc6\xa1\x38\xef\x75\xc5\x2e\x41\x1b\x83\x6d\xb5\xfa\x95\x54\x53\xf8\xe4\x08\x47\x9b\x05\xc3\xd9\xd8\xcf\x18\xf5\x6b\x73\x40\x84\x9b\xa1\xd2\xf9\x89\x5d\x66\x71\xb4\x96\x0a\xab\x95\x18\xc1\xd6\x33\x15\xea\xc7\x08\x75\xab\xd3\xc5\xea\x49\xa9\x8a\xe3\x31\xfa\x19\xe7\x9f\xb1\xc3\xf5\x54\xaa\x94\x07\x2f\xe5\x7a\x70\x7c\xce\x16\xb4\x92\xc5\xaf\x67\x58\x9b\x7e\xe8\x75\x2c\xaf\xd8\x3b\x16\xef\xe0\xe8\x87\xef\x30\x45\x85\x75\xe7\x4d\xe3\x1b\x90\x58\x5a\x07\xa6\x5c\xa8\xb4\xb6\x4a\xc3\x67\x21\x31\xad\xa3\xcb\xa9\xb4\xed\x3e\xc5\x54\x20\x3f\xf2\xd3\xd4\xdc\x66\x6a\xe7\x9f\x0f\x17\xad\xe5\x1e\x02\x95\x97\x86\xf7\xd5\x02\x1b\x51\x6b\x35\x5b\xda\x7b\x73\x51\x48\x41\xb4\xda\x56\x19\x95\x52\xee\xf4\x49\x8d\xe1\xcd\xcd\x42\x53\x9d\xdd\x42\x5b\xed\x5c\x5b\xb9\x42\x4b\x37\xb6\x19\x46\xc5\xf6\x76\x3a\xf7\xd5\x37\xbc\x89\x7d\x93\xf6\x5a\xcd\xdd\xbd\x1b\xf6\xaf\xbc\xcd\xeb\x87\x6f\xb5\x26\xe5\x2b\x62\x2a\x57\x47\x74\xb9\xf4\x93\xc8\x75\xc4\x53\x38\x6b\x3d\x53\xe2\xfa\xfb\x5a\x0a\xe4\x5d\xe7\x01\xc3\x45\x49\x3c\x82\x35\xd8\x80\x35\xbc\xcc\x0d\x7f\x17\x7c\xf8\xf7\x35\x0f\xfe\x8e\x3d\xd3\x5f\x9b\x61\x64\xfc\x88\x67\x19\xff\x85\x75\xff\x6e\xd2\x80\xa7\x72\x0b\x8e\xf9\x7c\x79\x8b\x91\xf9\x03\xf8\x21\x5d\x23\x71\x36\x43\x4b\xf0\x2e\xe6\xd1\xef\xcd\xdb\x1e\xcc\x3b\x1e\x2c\xda\x1e\x2c\x3a\xfd\x26\xbb\x60\xc9\xc2\xd0\x8a\xd1\x6c\x92\x37\x58\xc9\xa0\x8c\x66\x13\x3a\x22\xa0\x8b\x40\x68\x4e\xf2\xb4\xe7\xe2\x4d\x60\xfe\xfd\x8c\x56\x1e\x18\xe1\x6b\x29\x0a\x71\x6c\x16\x12\xa3\x0e\x27\x16\x9f\xfc\xdb\xfd\xfa\x1e\x0a\xe5\x32\x9c\x25\x17\xec\x17\x7b\xaa\x70\xa8\x7f\x48\x06\x55\xe6\x6f\xb9\x32\xd4\x77\x55\x26\x60\xc9\x91\x04\x55\x3e\x7d\xe5\x80\x26\x7e\x74\xca\xe4\x8d\x06\x1d\x5e\x4b\xa5\x9a\x0b\x11\xd2\x5a\xb4\x42\xb4\x82\xc8\x09\xea\xb6\x0b\x6f\x8e\x50\xd9\x67\xe6\x06\xba\x28\xdb\xb2\x9e\x3d\x11\x89\xca\x33\xe9\x4a\x11\x66\x50\x98\x1e\x28\xc5\x39\xb6\xa6\x5a\x74\x06\xca\x38\x56\x70\x08\x6d\xd8\x87\xe3\x4c\xcf\xad\x73\xe8\x82\x8c\x59\x5d\xf6\xf2\xe7\xde\x01\x6c\x6c\x84\xf6\x1e\x3f\xbb\xf0\xc7\x9f\x91\xd6\x9c\x9a\xce\xdc\x85\x4d\xb0\xa2\x15\x07\x2c\xf9\x19\x2f\x1d\x29\x92\x3b\x73\x3b\x10\x12\xda\x55\xfe\x20\x75\x08\xd6\x26\x37\xd5\x9e\x69\x4b\xf3\xdb\x37\x09\x43\x27\x96\x45\x32\xc2\x51\x77\xe6\xc5\x78\x31\x73\xdc\xc3\x53\x03\x35\x87\x4d\x81\xf5\x96\x00\xec\x96\xd1\xd8\x82\x47\x74\x26\x8a\x36\xc3\xf4\x53\xc6\xa6\x53\xa2\xb6\x0a\x20\x2f\xaa\x51\x19\xc3\xb8\xab\x5b\x52\xa8\xe4\xdc\x9c\x4e\xe9\x8e\x3e\xd5\xa1\xe4\x92\x09\x1d\xc3\xee\x3e\x7a\x64\x4c\xc8\xad\xbe\x7d\x15\x05\x0e\xed\xcc\x7d\xf8\x7a\x25\x99\x5a\x44\x1f\xff\x53\x9a\x85\xa3\x11\xc5\x66\x1a\x85\xa7\x4d\xfc\xa9\x6e\x2c\x89\xbc\x5c\xd9\x5c\x13\xed\x56\x4b\xc4\x53\x52\x65\x24\x00\x99\x18\xf8\x93\x29\xf5\x56\x34\x23\x12\x64\x39\x9d\x5f\xa8\x91\x6b\x6c\xcf\x68\x2a\x07\x44\x25\x67\x46\x3b\x2a\x9a\x19\xa6\x9a\x45\xf2\xbd\x78\x62\x42\xce\x94\x70\xa5\x7a\xbc\xe5\x40\x89\x24\x87\x1b\xf4\xbf\xe0\x3b\xb1\xd9\x2f\x64\xf7\xff\x6c\xca\xdb\x6b\x35\xc4\x9b\x54\x14\x36\xa9\xac\x0b\xeb\x44\x5a\x2d\x7e\xaf\x5f\x6a\x0a\x71\x38\xb0\x2e\x69\x62\x99\xbf\x3f\xab\xfc\x0d\x70\x24\xfc\x4d\x55\x9b\x03\x0e\x32\xd8\xc2\xc3\x3c\xab\xe2\x2f\x26\x60\x59\x42\xac\x49\x7e\x31\x2e\x66\x29\x79\xc4\x3a\x0a\x5f\x43\x24\x1f\x3d\x02\xb3\xd0\xcf\x6e\xa9\x68\xca\xa5\x9d\xa0\x4d\xab\x5f\xf2\x2a\x50\x8f\xb7\xe1\x61\xb7\xfa\x5a\xd0\x04\x71\x2d\x49\x93\x7b\x28\x32\x0f\xc7\x52\x8c\x91\xba\x9f\x87\x59\x79\xe1\xab\x58\xe6\xab\xe4\x9c\xf0\x51\x7a\x99\x41\xdd\x59\xce\xa2\xee\x08\x93\xba\xa3\x6d\xea\x8e\x30\xaa\x3b\xe2\x67\x89\x59\xdd\x29\xda\xd5\x1d\xdb\xb0\x56\x61\x0f\x85\xb9\xab\x0d\xe4\x92\xb0\xaa\x32\x4c\x4d\xce\x52\x16\x91\x3e\x73\x86\xb2\x65\xbb\x56\x5b\x60\x15\xc6\x60\xb9\x49\x5a\x61\x82\x4b\xed\x6a\xae\x5d\x72\x21\xa5\xa9\xa6\x08\xee\x5a\x51\x53\x6a\xc8\x9b\xda\x70\x34\xc8\xfd\x7d\x18\x85\x49\x9a\x69\x4f\x94\x82\x21\x57\x61\xb1\x99\x36\x9a\x30\xd0\x0a\x16\x9b\x36\xfc\xf0\xe2\xf0\xdf\x45\x97\x4c\x63\x6e\x09\x6b\xee\xba\xb0\xb9\x39\xcb\x8d\xca\x1c\x54\xd9\x82\x4b\x92\x01\x8f\x7f\x34\x2d\xb4\x7f\x4d\x42\x3d\x97\xf1\xac\xae\x33\xd9\xe4\x23\xf9\xf8\x9a\xc9\x55\x21\x22\xcc\xce\xed\x6f\x80\xc9\x88\xdd\x55\x4f\x1b\x4b\xcf\xbe\xf8\x82\x25\x1f\x59\x5a\xe5\x0c\xbd\xd7\xda\xd6\xb7\xbf\x8c\x63\x9a\xf2\xb2\xc6\xed\x2f\xba\x13\xcf\x39\x36\x9c\x4c\xe9\x06\x09\x39\x31\xd0\xad\x82\x84\xa5\xd9\x09\x5c\x9e\x85\xc3\x33\x08\x62\x86\x4f\xa1\x5e\xf8\xe3\x10\x5f\x63\x8e\xb9\x86\x62\xc9\x90\x19\x5a\xe5\xe6\x6e\x57\x78\x6a\x0a\x3e\xf0\x26\x69\x3f\x83\x65\x2c\x81\x2c\x2e\xbd\xd2\xdf\xc3\xd8\xbe\x5d\x0e\x40\x68\xb2\xcd\x36\x5d\x4e\xc0\x0c\x98\xc6\x22\x80\x96\xb8\x26\x64\x43\xbd\xad\x9f\x16\x27\x18\x1f\x0d\xe1\xa8\x85\x4d\x5a\x3b\x45\xc6\x28\x38\x72\xe8\xcc\xc2\x9e\x1a\x78\x97\xae\xa7\xca\xe8\x18\x65\x9b\xd4\xb2\xb5\x92\xfd\xe9\x65\xee\x6e\x5d\x7f\xb6\xfa\x3a\x4e\xde\x5f\x46\x95\xaf\x6b\xcb\x98\x40\x74\xc6\xf1\xa3\x9f\xb2\x57\xfe\xf0\xac\xb2\xf8\xde\xd2\xdc\x35\x8a\x13\x0e\xe9\xa4\xec\xa6\xca\x8d\xae\xa9\x7c\x53\xb7\xca\xe2\xf1\x98\xd1\x58\xe1\xd5\x32\xfd\x73\xb9\x5b\x2b\xaa\xf1\x9b\x5d\x5a\x51\x78\xa8\x03\x34\x8d\x81\xb8\xf9\x24\x69\x2f\x48\x69\xd3\xd6\xd1\xa3\xe2\x96\xb9\x5d\xca\x8a\x25\x1c\xb1\xcc\x15\xb2\x6b\x54\x92\x38\x82\xaa\xba\x77\xb1\x77\xdd\x29\x69\x3a\xa3\x37\x77\x71\x18\xe9\xf8\x83\x6e\xd2\x72\x3d\x67\x84\xc4\xf0\x20\x6c\xb2\x26\x9c\x74\xbb\xdd\xda\xeb\x69\x77\x7b\x70\x39\x2a\xc3\x0f\xcf\x22\xcb\x71\xac\xb9\x0d\xc8\xed\x3b\x5e\xfb\x08\xcb\x73\x90\xe6\x32\xda\x5c\xec\xe2\xa4\x47\x5f\x8f\x1e\x81\x3a\xe5\x53\x87\x70\xe5\x67\x53\x79\xe8\x25\xc3\x7d\x77\x57\xc8\x26\x7e\x36\x3c\x63\xa9\x3c\x96\xa2\x9b\x64\xc2\x23\x40\xdc\xf0\x93\x84\xc3\xd3\xdc\xbb\x19\xdb\x9a\x9b\x9d\x53\xe9\x12\x90\xc5\x70\xca\xb2\x66\x8e\x25\xd2\x64\xf8\x73\x91\x2b\xb0\x17\x4b\xab\x77\x4e\x8b\x2a\x1d\x2f\xe8\x51\x18\x61\x7c\xa5\x5d\x36\x5e\xee\x99\x6b\xfb\xec\x70\x0b\x48\xfa\xed\xd8\xc7\xab\xc5\x13\xdb\xdc\xf2\x82\xaa\x89\xd7\xdb\xbb\x5d\xdd\x67\x15\x88\xc0\x51\x49\xf6\xaa\xf9\xdb\x37\xf5\xf0\xbc\x60\x35\x81\x54\xad\x47\x70\x45\x9f\x4b\xf8\xee\x76\x17\xc1\x0c\xa7\x9e\x2a\x2d\xb3\xf3\xd4\x50\x33\x7f\x66\x19\x0d\x1a\x8d\xb3\x9f\xc1\xc9\xd4\xcf\xce\xc8\x51\x82\x3a\x76\xd2\x84\x37\x6a\xaa\x8f\xc7\xdc\x98\xa3\xc2\x61\x8a\x4e\x18\x8a\x34\x27\x1e\xb9\x8c\x08\x93\xfb\x67\xa5\xb6\x88\xe6\x2c\xe0\x34\x0b\xb3\x14\xa6\x63\x7f\xc8\x56\xb8\x6e\xf0\x24\xef\x80\x41\x84\x2f\xbb\xf4\x2c\xd8\xe1\xb3\x75\xc7\xbe\x78\xed\x99\xe6\x12\x29\x22\xbc\xc7\x58\x05\x3f\x96\x13\x92\x9e\xd9\x4b\xe3\xde\xbd\xee\x2c\x5e\x7f\xd6\xc4\xc9\x51\x2f\x1f\x1f\x68\xdd\x96\x21\xbb\x70\x99\xd3\x87\x76\xc0\xc1\x37\x76\xd7\xfc\xb5\x7d\xe8\x7d\x85\xb5\xc1\xda\x3e\xff\x39\x5c\xdb\x87\x6d\xb8\x82\xab\x3e\x3e\xba\x2b\x3c\x2c\x30\x82\x8d\xf0\x2a\x59\xf3\x7b\xad\x7e\x73\xd0\x1c\xae\x99\x6e\x15\xdb\xa5\x65\x7b\x6b\x3e\x5f\xdb\xb4\x30\x78\x3b\x86\x5b\x5f\xeb\x5f\x5f\x6b\xcd\x47\xf0\x1e\xac\x09\x62\x59\x2d\xa9\x44\x5b\x3b\x98\x00\xf8\x78\x78\x60\x52\x5a\xef\x7c\xa9\x2b\xa1\xb6\x06\x80\x43\x43\x56\xf7\xa5\x2c\x58\x10\x8b\x31\x2a\x0a\xfb\x3d\x66\x93\xb0\x5f\x7b\xad\xf3\x94\x95\x99\x8f\xb7\xbf\xa2\x34\xf4\xd3\xec\x83\x9f\x55\x59\x83\xdb\xbb\x72\x01\x93\xc5\xff\x8b\x55\xad\x72\xda\x3b\xcb\xaf\x48\x4e\x59\x56\x6e\x2f\xca\x00\x9e\x35\xd1\x29\xbe\xaf\x14\x2e\x2f\x34\xb9\x95\x45\x81\x13\x90\x9b\xa6\x44\x65\x49\x70\x87\xb8\x2e\x56\x7e\x6b\xf6\xcd\xe6\x56\xe1\x62\x33\x2f\x5f\x72\x0d\x5e\xf4\x5c\xc4\x01\xc4\x5b\x07\xa5\x97\x95\x95\x10\x8b\x39\x09\xc7\x13\x91\xa0\x5b\xcb\x1b\x1b\x7d\x37\x7f\x2d\x5e\x3c\x6f\xa7\x60\x76\xbb\x0a\xe8\xa1\x04\x68\xdd\x92\xac\x5a\xfd\xfc\xb9\x8c\x7b\x77\x97\xb9\x5d\x74\x9d\xa9\x5b\x77\xaf\xae\xbd\xa7\x1c\x45\xab\x79\xb7\xd3\xd6\x71\x58\x39\x87\x7c\x8e\x6b\xc4\x61\xaf\xb3\xad\xc4\xa1\x7e\x8d\xde\x79\x6c\x5a\xd9\x7e\x9a\xa5\xca\x82\xe5\x6b\x65\xe2\x06\xba\xab\x8e\xe1\x8a\xd7\xe8\x19\xfc\x38\xaa\x0d\x36\x59\x6e\x49\x87\x11\xb7\x83\xb2\xd2\x88\x72\xc2\x7b\xb5\x5f\x26\x25\xdc\x58\x4b\x61\x99\x6b\xfb\x9c\x69\xb5\x90\x68\xdc\x0b\xd1\x35\x04\x6f\x8b\xdb\xee\x79\x67\x68\xe9\x59\x44\x56\x73\x6e\xe7\x48\x1f\x2a\x69\x06\xc4\x81\xcb\x43\x3b\x14\x71\x68\xfa\xb0\x6f\x8d\x99\x23\xc7\x44\xc2\xaf\x0a\xdf\x41\x48\x96\x30\x64\xed\xb5\x29\x3d\xcc\x02\xd6\xf1\xf1\xb2\x9e\x63\x4b\x5d\xa8\x9a\x26\xf1\x90\xa5\xdc\xd8\xdf\x5a\x87\x33\x3f\x99\xc4\xd1\x42\x48\x01\x38\x83\x10\xef\x79\xb8\xb0\xbe\x55\xd6\x66\x33\x70\x4a\xd1\x6b\xf8\x0d\xcf\xf2\x70\x97\x84\xbd\xf4\x93\xe8\x00\xbd\x80\xb6\xd6\x81\xa5\xe3\x30\xca\x20\x8a\x37\x87\x71\x94\xc6\x63\xb6\x0f\x2d\x7d\x09\xf1\x25\xbb\xa0\xd7\xbb\x38\x76\x4d\x16\x5d\x34\x7f\x7a\xff\xf2\xd5\xf1\xab\x9f\x7e\x46\x93\x75\x6d\x9a\xc4\xc1\x8c\xf6\x02\xc5\xb6\x37\x07\x6e\xee\x6b\xf3\xdf\xce\x30\x8e\x02\xdc\xd1\xf1\xb8\xb6\x9f\xf8\x99\x07\xbe\x07\x03\x0f\x86\x1e\x04\x1e\x30\x0f\x46\x26\xa3\xf0\x56\xf5\x6d\x79\x81\x17\x35\x68\xdc\x17\x7b\xf4\x48\x66\xd1\xfe\xa2\x61\xb1\x53\x23\xf6\x94\x6b\xec\x3b\x1b\xb5\x9c\xb5\xb7\xf1\xe9\x97\x2c\x1c\x73\x13\x12\x09\x8a\x81\x94\x58\x92\xc4\x09\x4c\x58\x9a\xfa\xa7\x7a\x87\x6c\xcd\x3e\xac\xa3\x70\x63\xb2\x6b\x76\x1c\xb3\x7a\x0c\xf2\x38\xbc\x0b\x23\xba\x30\xcb\xe6\x18\x3a\x8d\x4f\x98\x43\xbc\xba\x13\x1c\x00\xe7\x26\x5c\xf3\xc4\xd1\xe6\x44\x16\x0c\xd8\x05\xb0\xe8\x22\x4c\xe2\x08\x37\x4d\x71\x67\x94\x6e\xc7\x33\x18\xf1\xc9\x20\xd7\x85\x28\x00\x3f\x20\x4c\xfd\x31\x5e\x08\x1e\xcd\xc6\x38\x3a\x61\x74\x9a\x36\xd7\xf4\xd1\xa5\xf0\xc7\x53\xa8\x52\xc8\x3d\x3c\x67\xe8\xe5\x47\xad\x7f\x90\x2f\xa6\xe2\x6a\x18\x1e\x0f\x56\x67\x89\x32\xcd\x84\xa1\x89\xee\x6c\xfd\x90\x6e\x9d\x9a\xcf\x5d\x94\xbe\x74\x81\xa7\x0e\x12\xfa\xc6\x46\xdf\x7c\xe4\xa2\xec\x95\xaa\x07\x57\xb5\x82\x27\xee\x43\x2c\x2b\xd5\xce\x76\xc9\xd5\x88\xdd\xbb\xb9\x1a\xf1\x7a\xec\x67\x19\xab\xdc\xbf\xdb\x35\x6f\x87\xbf\x4f\x02\x96\xfc\x58\xb9\xdd\xbc\xdb\x31\xca\xd6\xec\x37\x6f\xef\xe8\x4b\x14\x6f\xc4\x5e\xd9\x91\x3f\xae\x72\x23\xdd\xde\xdd\x2e\x8b\x02\x2e\xa3\x8d\xc5\x23\x15\xbd\xc8\x83\x34\x4e\x32\x5a\x84\xf9\xe9\x50\x5c\x4f\x8b\x39\xd6\xc2\xa5\x5e\x98\xb9\x29\xc4\x23\x0e\x2c\x99\x45\x9c\xfd\x80\xf9\xc3\x33\x09\x85\x2e\x0c\x99\x9b\x7e\x67\xc9\x8c\x4a\xc8\x8d\xbd\x26\x7c\x3e\x0b\x95\xf7\x1a\xac\xc3\x94\x25\x9c\xad\x44\x6c\xf2\xc1\x98\x21\x22\x86\x8b\x7f\xc8\x67\x30\x96\xb2\xe4\x82\xd1\xa4\x16\x27\xe1\x69\xc8\x25\x81\x17\x14\x28\x12\x4e\xb8\x21\xa2\xba\xd4\xc4\xb9\x53\x36\x4c\x31\x3e\xe5\x4e\x22\xfa\xff\xc7\x91\xd6\x0f\xfb\xc2\x99\xc2\x5d\xc1\xf3\xbf\x9d\x5f\x78\x1e\xa9\x9e\xdf\xf5\x0e\x69\xb3\xd9\x74\xe4\x76\xca\x37\xf9\xd1\xeb\xbb\x57\xd0\x53\x1d\xec\xf6\x8e\xd5\x43\xa4\xfd\x3e\xee\xac\xd9\x04\xc8\x62\x22\xd9\x60\xb1\x5c\xc0\x1f\xc1\x11\xca\x62\x28\x5b\x63\xce\x52\x7a\xe3\xab\x47\xb7\x0a\xbe\xc2\x1a\x4f\x59\xdb\x87\xb5\x51\xc2\x82\x35\x0f\x00\xd6\xfc\x53\xb6\xb6\x0f\x3b\x7b\x70\xe5\x15\x4a\x0d\xfc\x24\x62\x0b\x7c\xe0\x0b\x4b\x6d\x3f\x2e\x2b\x55\x80\xd5\x5a\x0a\xd6\x0e\x5e\x6b\x80\xbe\x5e\xe1\xf2\x2e\xfd\xb8\x70\x10\x6b\x0f\x7a\x7a\xe7\xc8\x98\x63\xe3\x26\xcf\x3e\xa0\xf7\x76\xd4\x7a\xd4\xbc\x51\xd3\xeb\xe9\xb6\xb6\x1f\xf7\xf9\x02\x58\xff\xde\xc1\xdf\x02\xe3\x9d\x3d\xeb\x57\x0b\xc7\xa5\x14\x15\xea\x85\xc0\x7d\xb9\x96\x77\x72\x2d\x3f\xce\xb5\x65\xe3\xd1\x57\xdb\xdf\xd4\xb2\x71\xc0\xa1\x75\xa0\x66\x47\x4f\x33\x8e\x9e\xdf\x0d\x6e\x2d\xbf\xb1\xd0\xeb\x9b\xf7\x15\xd4\x1a\x48\x81\x52\x0b\x21\x82\xa7\x5f\xcc\xc4\xc5\x8a\xa5\xd2\xca\x71\xe9\xf1\x6e\xe9\x5f\xed\xbe\x32\x47\x35\x9f\x77\x25\x1a\xda\x51\x4a\x35\xd4\x29\x69\xa8\x1a\xb8\xf9\xab\x53\xd1\x94\x59\x3b\xbf\x10\x33\x34\xbf\xd5\x1d\x63\xf6\xd0\xad\x7b\xd0\x76\x3d\xc0\xc8\x12\x57\xa5\xa7\x0f\x34\x6e\x25\xf6\xef\xed\xe3\xb0\xb3\xdf\x2a\x43\x61\xee\xaa\x09\x07\xd5\x44\xcd\xa5\xbd\x76\xab\xad\x27\x27\x61\x4b\x94\x2f\xdd\x5a\xb9\x9b\x80\xab\x1d\x79\x70\xfd\x74\x1a\x5e\xb0\xc8\xf0\x13\xe4\xca\x9d\xee\x56\x47\xfa\x10\x89\x5b\x0a\x4b\x2f\xcb\xd4\x0d\x56\x5d\x5f\xec\x7a\x8a\x46\xf2\x7b\x7c\xb4\xb6\xae\xa8\x4a\x99\x71\x82\x1b\xeb\x55\x10\x8c\x8d\x90\x12\x10\x22\xd7\xae\xbc\x7c\xc4\xf0\x6b\x29\x43\x0a\xb4\xf6\x98\xc5\x12\x13\x3b\x14\x5a\xe1\xc2\xac\x3a\x5b\x91\x1b\xde\xd7\x5c\x8e\x12\x57\x45\xc5\x4a\x01\xa1\x1e\x18\x7e\x0b\x60\xf8\x8f\x2a\x8b\xf1\x50\xad\x45\xf1\x9e\x96\xc4\x81\x44\x9a\x43\x70\x2c\xec\xe4\x0d\x17\x33\x84\xb3\x06\x2e\x5c\x5d\xf4\x36\x89\xba\x53\xa7\x1e\x5f\xcb\xf9\x48\xfc\x26\x5a\x94\x51\xab\x41\xdf\xe5\x32\x84\x5e\xf4\xb4\xfc\x68\xc9\xa4\x68\x89\x24\x2f\xe3\xd8\x60\x1e\x2b\x5d\xb3\x67\x57\xf0\x21\x58\xc5\x6f\xa0\xe2\xf8\xaf\x24\xde\xff\x7a\xf1\x7d\x80\xf2\xf2\x2b\xde\x74\x3c\x45\x83\x95\x2f\x8c\xfc\x48\x06\xd0\xbf\x96\x6b\x71\xdf\x2a\x53\x9b\x0f\x18\x76\xb8\x78\x2e\xf8\x5c\x86\x62\xaf\xdc\xfa\x2a\xdb\xf9\xba\x9b\x63\xff\x57\xf3\x2c\x61\x93\xd9\xa4\x72\x57\xf6\xb1\xb1\x18\x78\x5b\xa9\x1c\x77\x65\xb1\xeb\x7d\x59\xcc\x47\x53\x26\xd3\x59\x26\x2c\x69\xbe\x24\xe5\x78\x10\x49\x38\xcf\x88\x18\xa1\xf0\x46\x7d\xf3\x71\x60\x93\x69\xb6\xe0\xca\x0c\x09\xbe\xf0\x72\x07\x3b\xe6\x21\x4e\x99\xf9\x9c\xb7\x97\x73\xe6\xb4\x32\x9f\xdf\xf9\xd9\x59\xc1\x70\x2e\x0d\x8f\x5a\xb4\x93\xab\x36\x7d\xad\x2e\x96\x07\x83\x9a\x84\x91\xd3\xdb\xc1\x7b\xab\x7b\x1e\x3c\xb6\x6c\xaf\x8e\x5d\xca\xca\x53\x04\xc8\x9d\x5f\x86\x91\x08\x83\x6d\x72\x1d\x25\x91\xcb\xad\x0e\x6a\x49\x8a\xe6\xd0\xe2\x0a\x19\x3e\x53\x8e\xaa\x27\xd8\x80\xca\x5e\xbb\x6d\x3b\x09\xa3\x12\xc6\x5d\x35\xc0\x6d\xbd\x5e\x19\xff\x93\xeb\x95\x31\x4b\xd3\xd5\x95\xca\xdb\x6b\x95\xca\xb3\xeb\x94\xca\xdb\x32\xa5\xb2\x8c\x2b\xc1\x77\xbc\xeb\xfa\x7f\xce\xa5\x53\x43\x2f\x6a\x9b\x46\xa4\x39\xa1\x35\x7e\xa1\x76\xfe\xfd\xf0\xf6\xc5\xd1\xab\xe3\xbf\xbc\x7f\xfb\xf2\xd5\x47\xc3\xf9\x37\x97\xcc\xeb\xae\xfd\xeb\xbf\x4a\xb8\xfe\x78\x0b\xf7\xc4\xce\xe2\x71\x80\x8b\x51\x22\xe7\x81\x3c\xee\xf8\xc0\x33\xff\x82\x99\x16\x36\x66\x06\xe7\xae\x3c\x53\xe1\x2e\xa4\xd9\xb4\x79\xfd\x33\x49\x16\x2d\xfb\xe6\x27\x4f\x51\x51\x5c\xf2\x97\x27\x8f\x79\x7e\xc8\x02\xc7\xdc\x6e\x2d\x5c\x0c\xc0\x78\x4c\xf0\xed\x5b\xf1\xca\x00\x5e\xa1\x23\x5b\xcb\xc4\xba\x50\xee\x19\x07\x60\x9f\xb3\x9a\x37\x09\xdc\x82\x17\x86\x44\xac\xec\x3a\xc5\x28\x12\x61\x5d\x14\x38\x33\xb6\x4b\xee\xc6\x29\x12\xe0\xa7\x02\x49\x7e\x72\x22\x8c\x26\xa3\x6c\xd5\xc8\xbe\x0e\xa8\x9a\x52\xee\xaf\xfa\x2e\x07\x12\xb4\xb0\xc1\x79\x8f\xf7\x25\xaf\xbf\x31\xa9\x48\x24\x77\x77\x8d\xd7\x76\x4e\x53\x11\x90\xda\x40\xda\x88\x57\x67\x6e\xca\xe2\xa6\xbc\xcd\x5a\xb4\x29\x6b\x1e\x56\xea\x8b\x94\xf2\xa1\x9d\x2e\x44\x45\x37\x9a\xf2\x41\x4a\xab\x2e\xc8\xe0\x90\xc0\xa6\x81\xbc\x57\x4d\xeb\xa5\x9c\xe9\x13\x96\x66\x2f\x6e\xe5\x50\x4f\x18\x12\x94\x7a\xc7\x7a\xc8\xbf\x77\x1e\xb1\x4b\xd1\x36\x0e\x80\x7d\x75\xd8\xa2\xbe\x71\x40\x96\x13\x21\x17\x0e\x55\xf3\xcd\xf4\x2c\x1c\x65\x8e\x4b\x82\xa3\x9a\xd4\xb7\x9f\x6a\xc8\x5e\xa2\xb3\x05\x7a\xae\xbc\xf4\x2c\x9b\x91\xbb\xef\x62\x1b\xde\xbe\x5a\x9e\x60\x2c\x53\x75\xf3\x41\xfc\xb6\xe5\x2a\xaf\x69\xc4\xc8\x8e\x22\x35\x2c\xa3\xc8\x00\x8a\x77\xa9\x0c\xa0\xf2\xb7\x7d\x2b\xce\xc1\xc7\x51\x3d\x60\x51\xa0\xbd\x39\xfc\x24\xd1\xd1\xbd\xad\x29\x06\x4b\xd3\x64\xc2\xa2\xc0\xba\x68\x86\xf3\x07\x6c\x52\x11\x3e\x98\x61\x5e\xbe\xfd\xc4\xb8\xf4\x31\xf1\xa7\x06\x72\xf4\x4b\x74\x53\x0d\xe6\x28\xc2\x19\x4d\x6b\x92\xd2\x49\xf0\x81\x25\x68\x09\x31\x44\xe4\xe6\x5b\x17\x33\xf5\x39\xa3\x27\xba\xdc\x1c\xe3\xa8\x27\x0e\x4c\x58\x3d\x75\x6d\xda\xd5\x60\x91\x33\xe4\x13\x48\x71\xca\xac\x2b\x2b\x32\xc5\xb8\xad\x82\x49\x65\x17\x55\xb6\x97\x53\x65\xdb\x42\xae\xb6\xb5\x5c\x6d\x0b\xb9\xda\x16\x3f\x4b\x2e\xaa\x6c\x17\xe5\x69\x5b\x5f\x54\x11\x0f\x08\xa9\x0b\xdb\xb9\xae\xcb\x69\xdb\xba\xd8\x32\x8a\x94\xcc\x25\x0c\x9f\x5c\xa3\x8b\x1d\x5b\x5b\xe2\x5e\x82\x71\xc0\x1d\xc9\xbb\x06\x78\x07\x3f\x44\x97\x77\x89\x8b\x04\xc7\xeb\xbc\xc6\x13\xd0\x88\xee\xc9\x88\x8d\x0a\x3f\x1c\xa7\x32\x5d\xdd\xef\x37\xef\x29\x14\x95\x96\xbc\x0f\x4b\x55\x8b\xd1\x1e\x12\x96\xea\x29\xc9\x12\x69\x9e\x25\x05\xd3\x93\x38\xd5\xcd\x81\xf9\x49\x50\x90\xc2\x14\x34\x95\xa2\x45\x4d\xd0\x6b\x75\x66\xb6\x28\x7d\x25\xde\x06\xe3\xf4\x1d\x30\x71\xaa\x6f\xc9\x57\x33\x9d\x8e\xc3\xcc\x59\x5b\x73\x65\xcd\xe6\xaf\x71\x18\x39\xe4\x74\x2f\x45\x8f\x4d\x62\x7a\xb7\x55\x89\x9f\x4a\xd1\xeb\x2a\x4a\x52\x4a\x47\x46\xad\x14\xaa\x97\xee\x8a\xe8\xe4\x8f\xd2\x01\x8c\x32\xea\x06\xcb\x92\x81\x9d\xe5\x64\x60\x47\xc8\xc0\x8e\x96\x81\x1d\x21\x03\x3b\xe2\x67\xe9\x9c\xbe\x53\x94\x82\x9d\x7e\xe1\x68\x5a\xf5\x8b\xae\x68\xa6\x85\xab\xd7\x17\xfe\xb8\x2c\x1c\x85\xb4\x18\x65\x7d\x6e\x3f\x4b\x1d\x9f\x2f\xab\x89\x64\x35\x6f\x90\x94\xb7\x7c\xa0\x12\x15\x41\x6b\x66\xfb\x07\x95\xf0\xaf\xca\xee\xf1\xec\xd6\x7a\xb3\xde\xc2\x71\xa3\x7c\x11\x54\xee\x6a\x61\x2f\x88\xcc\xe5\x90\xf4\xb3\x90\x4e\x1d\xe1\x04\x9d\x3a\xd6\xb7\xe8\x12\xec\xb1\x38\xa2\x3e\x7e\xf3\xee\xc3\xfb\x8f\x9f\x5f\xbd\x3c\x7e\xf7\xfe\xe5\x97\xb7\xaf\x8e\x5b\xc7\xc7\x69\x32\x3c\x1e\xf8\x51\x80\x0f\x1d\x95\x6e\xca\x3c\x6e\xdb\xc0\x13\x76\x5b\x9f\x91\x74\xe8\x8f\xd9\x8f\x7e\x14\x54\xf8\x8e\x2c\x89\x70\xaf\xe1\x37\xfa\x07\xf9\xbe\xdf\x11\x7a\x1f\xe2\x30\xca\x6e\x8b\xdf\xa0\x04\xbf\x65\xc7\xa6\x4d\xa0\xe4\x7c\x52\x3d\x3e\x7b\x3b\xf7\x42\x80\x37\xa2\xe1\x95\x69\x50\x40\xbc\x7c\x9c\x96\xa5\x43\x87\xc0\xd1\x4d\xc3\x4a\x2a\xb4\xf1\xca\xda\xdd\x53\xe1\x2d\x36\xbb\x32\x0d\x72\x48\xdf\x8e\x02\xdb\x02\x58\x7c\x5a\xd9\xfd\xa7\xad\x27\xf7\xd3\xfd\xf8\x74\xe5\xbe\x9b\xe8\xde\xae\xe3\x3b\x04\x29\x4e\x82\x30\xf2\xc7\x95\x9d\xdf\x7e\x72\x3f\x1a\xea\x3d\xb5\xbb\x32\x01\xf2\x68\xdf\xab\x9e\x7a\x33\x99\x8e\xc3\x61\xb8\xba\xaa\x2a\x62\x79\x1b\x6d\xb5\x4b\xd0\xa6\xf1\x65\x0d\x8f\xee\xdd\x93\xa6\xbe\x5c\xb9\xf3\x26\xba\xf7\x3a\x3c\x9f\x7e\x4b\x56\x1f\x1a\x1b\xbb\xdb\x0c\xcb\x63\x82\xf4\xdb\xcc\x8f\xb2\x70\xcc\x6a\xc6\xe6\xe9\xbd\x74\xff\xdf\x45\xc3\x2b\x93\xa0\x80\xf8\xed\x34\xc9\x13\x13\xdc\xef\x35\x74\x68\xb7\xee\x91\x0e\xbf\xaf\x4e\x87\x02\xe2\xb7\xa3\xc3\x1e\x81\xcb\xce\x12\x96\x9e\xc5\xe3\x6a\xab\xef\x69\xfb\x7e\x74\xea\x67\xd9\xf2\xca\x94\x28\xa2\x7e\x3b\x52\x3c\x15\xf0\xc2\x49\x35\x3b\x6c\xef\xdd\xcf\xb4\xfa\x39\x9c\xac\xce\x0a\x16\xc2\xb7\xb4\x2d\x85\x9d\x3a\xcb\x86\x9f\xeb\xfa\xff\xb4\x73\x3f\xfd\xff\x92\x0d\x57\x37\x2b\xf3\x38\xdf\x6e\xf8\xdb\xc2\x4c\x95\x67\xba\x1c\x7c\x25\x15\xee\x61\xe2\x3a\x63\x13\x76\xa4\xda\x5e\x9d\x1a\x25\xe8\xdf\x92\x20\x1d\x1b\x62\xa7\x35\xa8\xa1\xc8\x3d\x4c\x17\x26\x45\x3a\xad\xc1\xea\x24\x29\xeb\xc0\x2d\x69\xb2\x9d\x07\x39\xac\xa6\xc9\xf6\x3d\x4c\x1d\x36\x4d\x6e\x20\x34\x65\x1d\xb8\x25\x4d\x76\xf2\x20\x6b\x48\x72\x0f\x93\x88\x4d\x92\xd5\x29\x52\x82\xfe\x2d\x09\x22\xcc\xb5\xe1\x6c\xc0\xce\xd8\x38\x9c\xd7\xd0\xa3\x73\xd7\xf4\x08\xa3\x8c\x25\xd3\x78\xec\x67\xec\x48\xb6\xff\x92\xee\x39\xae\x4e\x9a\x62\x47\x6e\x49\x19\x61\xc5\x25\x7e\x18\x0d\xea\x56\x06\xdb\xdb\xf7\x48\x97\x8f\xd4\xfa\xea\xe4\xc8\x63\x5f\x3e\xe7\xde\x29\xae\x7f\xf5\x93\xc9\x5d\x20\x3a\xbc\x6f\x44\x8f\xe2\x78\xf5\x85\x71\x09\xa2\xb7\x62\x2f\x61\x1c\x5f\x84\x49\x18\x84\x69\x0d\x7b\xdd\xf9\x0e\x99\x41\x89\x9f\xa9\xf5\xd5\x89\x91\xc7\xfe\xbe\xd6\xa1\x06\xae\xef\xfc\xd3\x49\xd5\x85\xbd\x95\x30\xbd\x77\xfe\x7a\x13\x8d\x58\x12\xc5\x77\x81\xeb\xbd\x0b\xed\x87\xb1\x9f\xde\x0d\x59\x83\xdb\x48\x83\x58\x20\xa5\xec\xb7\x19\x39\x68\xd7\x08\xc4\xfd\x6c\x96\x7e\x52\x4d\xaf\x4e\x8c\x12\xec\x0d\x81\x58\xf2\xbf\xdc\xa1\x4d\x6d\xf0\x82\xdb\xdd\xb6\x9d\x45\xb3\x94\x05\xf9\x5b\xb4\x83\x30\x65\xc3\xec\x63\x78\x7a\x96\x51\xd3\xb5\xe5\xde\xb2\x91\x2c\x76\x83\x83\x1b\x75\xf7\xad\xfa\x64\xa0\x7d\xe3\x93\x07\x42\x30\xae\xde\x6f\xdf\x7e\xdc\xa2\x61\x41\xa7\x07\x89\xca\x8f\x58\x4d\xbd\x2e\xe4\x2c\xd9\x06\x1f\x68\xd8\x5a\x57\x01\x1a\xd6\xb7\xfa\x6e\x4d\x5d\xbb\xf3\x65\x95\x0f\xc8\x83\xd9\x18\x8d\x6e\x1e\xc9\x66\xc2\xd3\xcd\x82\x38\x1c\xc5\x72\x63\x36\xca\x2c\x32\xca\x86\xc4\x58\x5a\x82\xa2\x58\x09\x79\x17\xba\x5c\xa0\x14\x12\x6e\xd1\xa5\xf2\x71\x6d\x84\x82\xdb\xb1\xe8\xfd\xf1\xd4\x83\x9b\x93\xc3\xb8\xbf\x85\x5e\xb1\xe6\x8d\x2d\x72\x93\xb5\xc3\xe0\x8b\x54\x73\x5c\x44\xd4\x21\x7c\x3c\x41\x00\x31\x02\xa1\xd0\xd9\x31\x1f\xb4\x7d\xe3\x21\x54\x0f\xe6\x1e\x8c\x63\x0f\xce\x42\xfb\x0a\xf5\x38\xd6\xf7\xc3\xf8\x37\xa8\x48\xeb\x3c\xf7\x2c\xd4\xb9\xfc\x1b\x7c\xe3\x5a\x18\xff\x4f\x84\xc8\x18\xc7\xf0\xcc\x02\x4d\xa7\xfb\x13\x7c\x9c\x72\x1c\xc3\x06\xaf\xfd\xfc\xf9\x73\x30\x42\xe3\x1b\x7d\x76\xfc\xde\x24\x0c\xfa\x1e\xcc\x5d\x0a\x91\x8d\x98\xf0\xda\x1b\x66\x0d\xf4\x26\x45\x34\x26\x61\x60\xdf\x47\xd6\x67\xd9\xb1\xf4\xc8\xa0\x13\x6e\xce\x77\xff\x9c\x84\x78\xce\x09\x91\xef\xad\x20\x42\x19\x7d\xaa\x08\x21\x8e\xf4\x2d\x7f\xe1\x32\x5e\x1a\x95\x47\xea\x0a\x10\x19\xcb\xb9\xe4\x5a\xe5\x76\xbd\x82\x72\x46\x4e\xe0\x72\xc8\x3a\xd4\x56\x5e\x33\xdc\x63\xa8\x88\x7c\xec\x87\x70\x32\x99\xe1\x8d\x66\xf7\x1a\xf1\x9d\xfa\x61\x52\x36\xfd\x15\x75\x00\x3d\x1b\x84\xa5\x14\x38\x51\x4a\x80\xb5\xb4\x81\xb8\x49\x60\x04\x68\x18\x69\x86\x1b\xa9\x96\x45\x04\x1b\x72\xd8\x26\x77\x56\x7d\x45\x01\x36\xa1\xed\xc1\x54\xa6\xe2\x15\x49\x5e\x0d\x7d\x6e\xd8\xa5\x70\x89\x89\xb8\x84\xc1\x21\xb4\x60\x1f\xc8\xd3\x4d\xb0\x6e\x08\xcf\x20\x72\xa9\x06\xb9\x75\x8f\x9c\xa9\x09\x6f\x63\x23\xec\x9b\x9a\x06\x4b\xe6\x39\x8b\x27\x72\x29\x1b\xd8\x8f\xff\xf0\x94\x7e\xe9\x30\xd7\x5e\xf0\xff\xee\x13\xc0\x85\x9f\x84\x7e\x34\xac\xd9\x11\x7f\xbc\x7d\x47\x13\x80\x3d\xe4\x1c\xb3\x8b\x65\x0c\x07\x0b\xc9\x52\xd1\x52\x80\x8d\xb1\xba\x80\x43\x0a\xe8\x9d\xfe\x96\x64\xce\x85\x0b\xfb\x70\x21\x86\x2e\x3f\x20\xb5\x57\x54\xbf\xfb\x80\xd0\xbd\xc2\x1a\xb7\x87\x9d\x3b\x1a\x0e\x0a\x8a\x25\x2e\x0a\xc6\xc6\xa8\x70\x31\x13\x11\xb3\x84\x8f\x99\x50\xb4\x13\x33\x88\x14\x97\xc9\xcd\xb6\xca\x62\x7e\x64\xe6\xd2\x6d\x14\x15\xc9\x7a\x9c\xf9\x2a\xf8\x3e\x5e\x2e\xa3\x38\x1e\xea\x9d\x88\x78\x94\xbf\xb4\x2d\x64\x74\x63\x43\x48\xa9\x39\x73\x3d\x0c\xd3\x9f\xfc\x9f\xc4\x0b\x13\xcb\x71\x90\xa4\x6a\x29\xff\x50\x67\x7b\x61\xdf\x75\xcd\x79\x0c\xd1\x96\xb4\x80\x4d\xec\xa3\x9e\x96\xb0\xc7\x1b\x5d\x51\x6a\x0b\x36\x36\x26\x3a\x93\x77\x52\xe5\xad\xcb\xc7\x30\x08\x44\x69\x60\x91\x07\x60\xc6\x47\xf9\xee\x9d\x8f\x47\x9a\x08\x1e\x84\x82\x29\x52\xf7\x1f\x4a\x10\xde\xdb\x09\xbd\x36\x22\x43\x28\xcf\x26\xb0\xc5\x13\x37\xa1\xed\x56\x48\x73\xed\x35\xd5\xbb\x91\xe6\xef\x26\x70\xb6\x8c\x59\x32\x35\x09\x23\xf5\xe9\xcf\x57\x96\x26\xd8\xda\x82\xd7\x61\x14\x50\x60\x1f\xf4\x48\x1e\xaa\xd8\x9e\xea\x46\xa2\x62\x3a\xc5\x6e\x5a\x54\xcc\xf0\x70\xe2\xde\xaa\xc8\x36\x59\x66\x12\x46\x18\x43\x74\x2e\xeb\x6a\x96\x28\xc5\xe9\x48\x58\xff\x14\xd4\x65\xe2\x87\x18\xc8\x45\xc5\xef\x03\xd3\x84\xac\x41\xca\xcd\xbd\xec\x8d\xac\x14\x46\xf0\x5c\x62\x48\x78\xe5\x30\x52\x25\xfd\x39\x3c\x53\x25\xcb\x70\x2f\x7d\xeb\x7b\x79\x71\xbe\x15\xf5\x2b\x65\xf5\x8f\x36\x22\xd7\x22\xfa\x07\x18\x25\x69\xae\x71\x71\xe2\x40\xfa\x15\x5a\xa5\xf6\x76\xf5\xdd\xda\xe6\x37\xdd\x90\xab\x3a\x3f\xc5\x5b\x01\x85\x4d\xc6\xfb\x8a\x02\x37\xf1\xa7\xd4\x96\xb8\x1b\x83\x91\x14\xc9\x7b\xdf\x7c\x79\x1a\x63\xbd\x70\xc4\x94\x49\x4f\x68\x1a\xd7\x5d\x28\x99\xc3\x2b\x0e\x47\xed\x9d\xe1\x7f\xa8\x92\x17\xa1\xfc\xd3\x2c\x9e\x7a\xf8\x7a\x0b\x31\x39\xbd\x40\xd0\x85\x0d\x23\x9f\x7e\xca\x72\x1c\x4a\xd9\x7d\x3d\x17\x9e\x41\x07\x0e\xc1\x11\x55\x14\x00\x02\xd8\xf2\xf8\xfc\xb8\x0f\x7c\x95\xb3\x2d\x1e\xc0\xda\xe0\xf0\x74\xf8\x4f\x6b\x12\xe1\x4d\xa0\x5d\x3c\xf1\xe7\x4e\xcb\xa3\xef\x21\x0b\xc7\x0e\x35\xb0\x29\x5f\x2e\xd8\x22\xec\x5d\xf8\xa6\xad\x3a\x79\x2d\xca\x58\x5c\xb9\x66\xe0\xd0\x9c\xc1\x82\xc5\x69\x65\x45\xe8\x6e\x40\x88\x6f\x04\x71\xec\x6c\x01\xc4\xa2\x15\xb2\x57\x7b\x09\xf9\xbb\xaf\x8b\x07\x38\xe0\x59\x38\x3c\x7f\x13\x0d\x13\xbc\x7f\x7e\x53\x50\x43\x05\xea\x13\x92\x04\xa3\xdd\xb4\x5b\x72\x84\x70\xe5\xa2\x22\xb5\xb1\x5d\x2b\x5d\xc5\xa9\x61\x1d\x2b\xbd\x43\x01\x15\xee\x94\x8d\x87\xf1\x2c\xca\xcc\xf8\xc5\x78\x59\xa6\xdc\x48\x51\x56\x09\xef\x56\xaa\x5f\xdc\x12\x0c\x99\xe7\x7b\x5b\x2a\xb0\x21\xfe\x1b\x3f\x64\xc8\x15\x51\xaa\xdb\xa5\xda\x18\xa0\x91\x97\xc3\xfd\x22\xa9\xc0\xb1\x50\x5f\x56\xd1\xd7\x8a\xb0\xca\x33\xc9\xd4\x51\x51\x80\x24\x26\x88\x57\x24\x01\x38\x42\x24\xad\x71\x2e\xa3\x8a\xab\x6f\x25\x3f\x0c\xd3\xd7\x61\x14\x66\xcc\x11\x92\x63\x04\x9e\x52\x5d\x61\x53\xc2\x5b\xbc\x61\x24\x90\xd0\x52\x48\x29\x42\xf8\x0e\x44\x21\xc4\x0d\xcb\x8c\xc6\x71\x9c\x90\xa4\x5a\x65\x90\xda\xb9\x6d\x0f\x1b\xac\x96\x6d\xd8\x80\xb6\xbc\x60\x99\x17\x5c\x84\x43\x22\xeb\x28\x99\x75\x4d\xa1\x35\x0d\x1b\x0b\x7d\x89\x1a\x4f\x5a\xaf\xc2\x5f\x23\xb3\xbe\x1a\xfa\x1c\xea\x26\x81\x5a\x09\xfd\x4d\x8e\xfe\x96\xad\x73\x0c\x0e\x11\x55\xcc\xab\x63\xc6\x1b\xe4\x3c\x2b\xbf\xdf\x73\x2d\x47\x28\x39\x91\x5a\x3d\xaf\x57\x4d\xf5\x4b\x55\xa4\x98\x4c\xe3\x4b\xbc\x84\x6f\xd0\x13\x3f\xc7\xf1\x29\xf1\x94\xac\xfd\xf6\x27\x25\xff\x20\x42\x72\x76\xa9\xbd\x2d\xfd\xa6\x73\xbb\xe5\x11\x44\x6b\x0f\x0b\x9b\x78\xde\x85\x96\xa8\x7d\x08\x0e\x01\x78\xde\x45\xe5\x73\x08\xed\x16\xec\x83\x4e\xdb\x85\x43\xd8\xb5\x52\xf8\x74\xd4\x81\x7d\x3e\xf1\xac\x97\x35\x27\x20\xef\xc3\xa6\x95\xb9\x49\xb9\x7c\x05\x77\xf3\x16\x71\x4b\xcd\x1a\x0c\xae\x3b\xaf\x1d\x07\xa5\x54\xfd\x41\xba\xc2\x80\xf0\xaa\x6d\x59\x55\xf6\xa3\x6a\x74\x5a\xf6\xf0\x94\x8e\x4f\x4b\xf0\x62\x5b\x2a\x1a\x93\x12\xae\x68\x6f\xbd\x0b\x6d\xdc\x8c\x57\x31\xe2\x0c\xda\x18\x85\x76\x2b\xca\x74\x8c\x32\x9d\x03\xf3\x31\x39\xad\x0b\xe1\x10\x36\xa9\xd0\xbe\x44\xa8\x64\xaf\xf2\xbe\x2e\xc1\xdd\xd5\x62\xda\xda\x73\xd5\xea\x42\x0d\x8b\xb5\xaa\x36\x86\xa7\xe3\xd2\x41\x42\xa9\xbd\x71\x8f\x87\xc8\x7f\xb0\x1d\x84\x3f\xf8\xb6\xc1\x77\xdc\x30\xe0\xe8\x58\x4b\x4f\x7b\x65\x5a\xb1\x10\xfd\x27\xdf\x04\xf8\x07\x2f\xff\xef\x89\xe6\x72\x21\xca\xd9\xbb\x4c\xbe\x9f\xfc\xb1\x4e\xe0\x27\x61\x54\x73\xf6\xf2\xf4\x8e\x36\xfb\x27\x7e\x96\x84\x73\x23\x24\xa2\x43\xbb\x40\x3c\x55\x85\x22\xb4\x23\xa5\x5a\xb1\x2c\x36\xdb\x1e\x6e\xff\x2f\xb3\xdd\x8c\x3d\x2a\xdd\x6b\xa6\xf6\x3c\xf9\xe2\x83\x07\x59\xe2\x47\xa9\x88\x02\xa1\x6d\xbf\x89\x8b\xc1\x32\xe0\x19\x4c\x0e\x0a\x17\xe1\x7f\x15\xd8\x44\x1e\x24\xf1\x25\xbe\xa2\x2a\x60\x90\xdd\x67\xad\x4d\x61\x63\xe3\x57\xce\xcc\x07\xc6\x15\xf3\xf8\xb2\xf7\x6b\x5f\x75\xbe\xf7\x6b\x5f\xdf\x44\xb7\x83\x25\x2a\xc0\x79\x13\x90\xd0\x77\x02\x6b\xf6\x09\xd4\xf9\x78\x71\x1e\x7d\xf2\x1d\x8f\x76\xef\x7a\xfb\x28\x14\xd7\x0d\x2b\x77\x90\x96\x3e\x4b\x16\x17\x0f\x6f\x28\x28\xc1\xf6\xb1\x0e\x53\x5b\xed\xad\xf2\x64\xef\xc6\x2e\x50\xb8\xe1\x54\x09\x59\x88\x22\x05\xcd\x12\x34\x81\x2e\x7c\x8d\xfc\x09\xdb\x87\x86\x4c\x6a\x5c\x99\x9c\x22\xba\xec\xe0\xf6\x86\x9e\xae\xe5\x8b\x2c\x4b\x48\x53\xae\xdb\x52\xac\x26\xfe\x94\x44\x4a\x59\x99\x41\xcc\x95\x33\x86\xa2\x91\x49\xb3\xe8\x3c\x8a\xf1\x11\x47\x35\x88\xa8\x20\xc5\x2e\x8e\xf8\xab\x5e\x1f\xea\xf5\x61\x7f\x29\x0a\xf5\x1a\x03\x44\x82\x36\xf0\xd6\xb7\xfa\x14\xf7\x9e\x3a\x49\x71\x70\x24\x01\xd0\x4b\xd0\x51\x6f\x14\xf0\xce\x53\xa4\xa9\x00\x36\xa0\xd1\xf0\x50\xb9\x20\x39\xf0\xfd\xa5\x73\xb6\x10\x2b\x3b\x3a\xea\xb2\x8f\xbe\x64\x7f\x1e\x76\x75\x8f\x94\xd2\x12\x99\xca\x87\x05\x61\xa6\x04\x93\x9a\x21\x0a\x35\xa7\xb3\x94\xcb\xae\x5b\xf2\xb6\x1a\x6d\x58\x39\x21\x9e\x2f\xc1\x0f\xf4\x5b\xc8\xb5\x8e\x07\x83\x7d\x6a\x2a\x7a\x2b\xa1\x39\x36\x83\x97\x3d\x2c\xee\xe3\x49\x45\x41\x68\x50\xb0\x16\x81\x85\x39\x78\x77\xca\x1d\xfa\xb5\x6c\xa9\xc5\xf1\x4d\x00\x15\x3c\x24\xf0\xf8\x78\x94\x2f\xa6\x69\x08\x90\x8e\x67\x7e\xea\xd0\xb8\x39\x01\xaf\x8f\xa6\x13\x1f\x40\xd7\xcd\x53\xba\x94\xca\x72\x01\xc2\x29\x67\xbc\x89\x8d\x84\xcc\xc7\x5a\xd2\x74\xd4\x01\xc1\xec\x28\x6e\x87\xe0\xc8\x4a\xb7\x60\xd7\x63\xd7\x23\x0c\x5c\xd8\x17\x23\x6d\x8c\x89\x89\xa1\x96\xa3\x95\x70\xd4\xd5\x8e\x8d\x96\x0c\x3e\x35\xdb\x18\xc6\x53\x33\x8a\x55\x3e\x5a\x8f\x54\x24\x3a\x5c\xb0\x60\x40\x87\xfe\x18\xe9\x14\xaa\x8a\x84\x51\xa7\x8a\x66\x25\x52\x46\x1f\xed\xb1\x29\x99\xbc\xbe\x83\xc3\xca\x7d\x9d\x46\x04\xec\xb4\x93\xf8\xc1\x9d\x9f\x7e\x54\x4d\x96\x89\x1f\x74\x02\x76\xaa\x4f\x40\x04\x02\x72\x0b\xe1\xc3\x1b\xd8\x82\xf6\x5e\xeb\x40\x44\x1d\xc3\xd2\xd0\xe5\x49\x72\x71\xfa\xe1\x4d\x89\xc9\x7a\x8f\x2e\x2a\xe5\xfe\xca\xc9\xe9\xe0\x47\x3f\x0d\xd3\x5a\xa7\x66\x59\xe8\x68\x1c\xf3\xdc\x9b\x3a\x36\x93\x12\xab\x71\x3d\xde\x7d\x7c\x73\xb7\x66\x8e\x5f\x25\xe0\x4e\xa7\x75\xe3\x10\x25\x03\xdd\xf3\x9a\x38\x15\x3b\x37\x0e\x00\x52\x4f\x92\x36\x86\xff\x10\x2e\xf0\x37\x5c\x1c\xe8\x98\x4d\xc9\xe9\xe0\xcf\xfe\x64\xe2\x3b\x0b\x6d\xa3\x60\xfb\xcb\xcc\x42\x1a\x57\xa9\x68\x4f\x39\x2c\x9a\x80\x16\x39\x7b\x20\x39\x1d\xc8\xbd\x3a\x15\x45\x4f\x9c\x2a\x40\x97\xda\x74\xe4\x86\xff\xf2\x13\x20\x35\x3e\xc2\xc6\x93\xd3\x01\x35\x4d\xdb\x7b\x6e\x33\xf1\xc0\x61\x51\x70\x6b\x78\x1c\x5f\xb7\x99\x28\x83\x0b\xe0\x54\xa1\x8c\x6d\x35\x4f\xb1\x53\xcd\x53\xa3\xc8\x20\x57\x64\x40\x45\x06\x46\x91\x78\xea\x0f\x29\x12\xec\x4a\xa4\x2e\x59\x5e\x51\x13\x02\x1e\x35\x24\x7e\xd8\xd3\xb0\xd2\x20\x99\xb6\xaf\xa8\x2e\x1f\x84\xc4\xc9\x94\x47\x8e\xe8\x17\x74\xe1\xb4\x90\xca\xbb\x36\x28\xa4\xea\xde\x88\x2f\xa3\x84\xda\x86\xa4\x73\x85\x46\x43\x98\x60\xfa\x30\xf0\x74\xd0\x24\xe6\xe9\x2a\x9e\x34\xe7\xa8\xe4\x74\xc0\xd7\x62\x0e\xee\xff\x3f\x30\x99\xea\xd3\x74\x1c\x46\xcc\x49\xf1\x4f\xb9\x5f\x2f\x52\x2e\x35\x59\x2e\x92\x83\x93\xdf\x35\x03\xe4\x46\x73\x25\x69\x0f\x7a\x79\xce\xa0\x32\x27\xf4\xa8\x9d\x03\xbd\x94\x0d\x29\x38\x1b\x9a\x5a\x56\x68\x48\x58\x5e\xf2\x6a\xd9\x95\x3a\xd6\x13\x1e\xac\xd8\x27\x5a\x20\x63\x46\x33\x81\x6f\xdf\xb4\xc7\xf7\xa9\x99\x75\x6a\x65\x0d\xcc\xac\x81\x91\x25\x2c\x67\xe8\x02\x51\xdd\x49\x44\x4b\xa7\x3a\xe9\x54\x24\x0d\x74\xd2\x40\x24\x11\x40\xcd\x2e\xed\x6b\x59\x54\x22\x6e\xb3\xa8\xc4\xd9\x66\x51\x89\xae\xcd\xa2\x32\x18\x28\x12\x38\xcf\x80\x68\xfb\xa0\x26\x92\x73\x5f\xd7\xe0\xac\x65\x66\x19\xa9\xff\x8a\x17\x53\x72\x33\xe5\x72\x80\xf3\x93\x4c\xf9\xbd\x97\x82\xad\xf0\x1d\x1c\xe0\x56\xd8\xde\x5a\x66\x02\xbe\x3b\x6f\xd6\x9a\x1d\xf1\x83\x12\x95\x90\x99\xda\x20\xb4\x0f\xde\x1c\x27\x83\x1f\xf0\x46\x0a\xb9\x8f\x6f\x6c\x64\xb0\x0f\x99\x0b\xeb\x60\x8a\xf6\x45\x4b\xef\x27\x3b\x21\x6c\x40\x24\x17\x8f\x51\xdf\x28\xd5\x36\x76\x9d\xf3\x79\x9d\x1c\x84\x62\xed\xed\x5c\x89\x0e\x95\xb0\x24\x66\x99\x9d\x39\xc5\xa7\xc4\x48\x03\x61\xe1\xf5\x5d\xde\xd9\x4d\x08\x61\x8b\xaf\xfb\xd6\x21\xf2\xe0\xa2\xe5\xc1\x45\xdb\x83\x8b\x8e\x07\x17\xdb\xea\xd6\x42\x19\xc3\x7d\x07\xdf\xa8\x1b\x32\xc5\xbc\x7c\x26\xc8\xad\xad\xe6\x75\x9d\xfb\x0e\x9e\x46\x2b\x79\xeb\x8f\x67\xd5\xae\xfa\x9d\xf6\x93\xbb\x72\xd5\x57\xf7\x19\x50\x96\x50\x8f\xc2\x21\x0c\xe4\xea\x76\x5f\xfb\x04\x45\x7c\xb2\xf6\xa5\xb7\xfd\x24\x8c\x9c\x68\xe0\xa9\xdb\x42\xae\x59\x74\x6e\x4f\x90\xda\x08\x1a\x56\x65\x84\x3a\xaa\xb2\x39\x61\xfa\x62\xc6\x9c\xd3\xdc\xb4\xdc\x15\x02\xa4\x5c\xf9\xfd\x01\x3c\xa1\x18\xc8\xb9\x12\x9b\x13\x2d\x0d\x44\x4b\x43\x6a\x69\x80\x7b\xc5\x75\x9a\xa4\x12\x57\x01\x81\xa3\xac\x66\x24\x39\x1f\xd5\x31\xe0\x77\xf0\x7e\xba\x13\x26\x09\xc4\x18\xbe\xf4\x33\x66\xe8\x5a\xce\x1d\x1b\xbc\x24\x6c\x76\xc1\xf7\x4a\x28\xa6\xf6\xcf\x53\x96\x7d\x0e\x27\xcc\xf1\x61\x03\x06\xb0\x0e\x99\xeb\x41\x50\x47\x9a\xef\x70\x3a\xfd\x87\x97\x4d\xce\x6a\x5f\xaf\x4c\x41\xd2\xbf\xce\xd5\xf9\xae\x8f\x5e\x4a\xb8\xcf\xfb\xed\x9b\x7c\xd7\xca\xc7\x8d\xd4\x06\xbd\x1b\xd5\x70\x71\xa8\xbe\x5e\x49\xc7\x84\x41\x59\x95\x41\xae\xca\x40\x54\x91\x52\x73\x0e\x61\x24\xb1\x23\x30\x98\xe2\x1b\xfb\xb8\xbd\xf3\xbb\x11\xd9\x73\x14\xd9\x73\x69\xde\xe6\xde\x97\x1d\x52\x33\xbc\xc0\x41\xe9\xf1\x60\x85\xe4\x22\xba\x28\xad\x58\x9f\x63\xbb\x92\xb4\x7e\x07\xdf\x81\x3b\xbc\x4b\xb4\x43\x3c\x49\x4e\x7d\x2f\xa0\x0b\x5b\xbd\xcd\x8d\xfe\xa1\x73\xb8\xff\xf7\x60\xe3\xef\xcd\xc3\xbf\x07\xeb\xdf\xf0\xcf\x86\xeb\x1c\xee\xf7\xd8\xab\x3e\xe6\xf3\xdf\x87\x5b\xa7\xe2\xc2\x29\xfb\x51\x48\xfe\x47\x76\xfa\x6a\x3e\x75\x12\xf6\xa2\x99\xc6\xb3\x64\xc8\x3c\x68\x9c\x36\xac\x95\xda\xef\x2c\x89\x9d\xc1\x52\xb3\xf2\x40\x1b\xe5\xfa\x38\x05\xd7\x0f\xa5\xb5\xf3\xea\x84\x9b\xfd\xca\xc4\x27\x30\x77\x2d\x7a\x03\x2e\x7b\xbc\xb7\x63\x3f\xcd\xe4\xa3\x82\x09\xfb\xd1\xfa\xdd\xf2\x60\x6b\x0b\xd2\xa1\x1f\x89\x7d\x7d\xce\x66\x11\x9b\x67\x40\x83\x83\x02\x23\x98\xd6\x9f\x60\x61\x7c\xa1\x39\xca\x60\xe2\x67\xc3\x33\x14\x1f\xb9\x14\xab\xc8\x97\xf5\x07\x29\x35\x46\xaf\xc8\x4f\x13\x36\x64\xf8\x54\xae\xac\x60\xb4\xe8\x71\xe1\xf4\xa3\x85\xed\x26\xc2\x6b\xab\xf7\xe6\x52\xb9\xae\x17\xc7\x12\x1a\xf2\x30\x8e\xd2\xcc\xc7\x07\xfc\xa2\x00\x8c\xc7\x65\x64\x95\xdf\xe8\x45\x04\x5e\x45\xb5\x29\x83\x67\xc4\x49\x2a\x22\xb3\x1f\xd1\xc3\x4c\x61\x34\x9d\x65\xf4\x02\x2c\x82\x47\xb7\x02\x32\x2a\xe8\x88\x88\xac\x0f\x1a\x4b\xaa\xf9\x46\x87\xe2\x10\x17\x3e\xe3\x91\x68\x29\xa5\x87\x7e\x1f\xc1\xa0\xa9\xfd\x92\x1d\x7f\x22\x86\x8a\xcd\xd9\xd0\xf1\xd5\xab\x7b\x8f\x1e\x81\x33\x98\x88\x61\xc3\xbc\x81\xbe\xf2\x84\x2e\x0d\x03\x7c\x1f\x69\xd2\x44\xb2\xb8\xf0\x1c\x06\xa1\xf0\x8c\xf0\x6d\x42\x33\xf9\x38\x6d\xe9\xd0\x12\x18\x71\xc0\x30\x08\x3d\x18\xa4\xae\x79\xdd\x9a\x9c\x51\xd0\x75\x71\xa3\x0b\x83\x14\x69\x37\x8c\xfd\x31\x4b\x87\x8c\x9e\x04\x9e\x26\xec\x22\x8c\x67\xa9\x0e\x65\x0f\xf2\x76\x74\x8a\x57\x55\x01\x2b\x1a\x6b\x73\xec\x00\x76\xdd\x9f\xf4\x5a\x7d\x72\x55\xa5\xfe\x0e\x26\xe2\xb9\x1b\x3d\x46\x9a\x72\xc4\x59\xd5\xd8\x4d\x6e\x8a\xdd\xc4\xd6\xd5\xc4\x6e\x7a\x28\xf1\x29\x72\xde\x34\xa7\xaa\x40\x4a\x32\xa1\x84\x21\x63\xe9\x23\x9b\xd1\x29\xd3\xd7\x70\x1f\x42\x0f\xe6\xfb\xb7\xbf\x0c\xc7\x25\x70\x30\x71\xaf\xac\xc3\x41\x21\xe7\x86\x5c\x9b\xef\x0b\xbc\x08\x02\xe1\x18\x83\x5c\x88\x6c\x87\xf3\x27\xb7\xfe\x06\xb9\x27\x23\x72\x6c\x60\x9c\x75\xde\x90\x01\xca\x86\x5f\x62\xf6\x69\xca\x86\xa1\x3f\x86\x78\x9a\x85\x93\xf0\x77\x7a\x25\x8d\xab\x9f\x38\x1a\x2f\x38\xfb\x86\xd1\xe9\x98\xd1\x60\x37\xa9\xca\xfb\xec\x8c\x25\x97\x61\x8a\x6f\x69\xea\x81\xc1\x67\xb2\x63\x7a\xbd\x53\x32\x0b\x17\xfd\x84\xfd\x1a\x87\x11\x26\x13\x4e\x4d\xe3\x3c\x49\xbd\xb9\x44\xd7\x17\x7e\xeb\xb5\xfa\x62\xdc\x0e\x51\x91\xf3\x84\xe6\x5c\x3b\x8b\x8a\xb9\x41\x27\x70\x13\x04\x7e\xd3\x0f\xb6\x94\x6c\x09\x01\x40\xe1\x59\xaf\x98\x0c\x6f\x69\xb9\xa7\x3d\x27\xe6\x70\x38\x7d\x9b\x48\xa5\xb8\x39\x37\xf6\x84\x8c\x39\x23\xa5\xf7\x1f\x1a\x0d\x23\xf3\xaa\xe2\x9e\xe1\xde\x77\xf0\x22\xba\x93\x55\xef\xc6\xbc\xa2\x03\xdf\xc1\x27\x65\xc5\x57\x09\x44\x7f\xdf\xc6\x43\xbf\x26\x72\xf1\xde\x53\xe1\xe2\x91\x3b\x94\x52\x21\x8d\x46\x71\x32\xf1\xb3\x97\x26\xb0\xdc\xd9\xd4\xed\xa3\x1f\xad\x1e\xfc\xa9\xbc\x8f\xf7\x15\x02\x6c\xf5\x60\x9a\x55\xf8\xdd\xc1\x8b\x06\xe3\xfa\x01\xdd\xde\xeb\x2c\x33\xa0\xa5\x23\xb9\xe2\x9b\x02\x04\x09\x15\xe3\x28\xac\xb1\x8c\xb7\xf7\xee\x3c\x3e\xe1\xea\xa1\x3c\xab\x70\xbe\x93\xb7\x05\xb8\xd1\x12\xa6\x61\x1c\xbd\x0e\xe7\x35\x27\x98\x4f\x5b\x77\x1e\x49\x6f\xf5\x40\xd0\x15\x28\xdf\xc9\x53\x03\x0a\xe8\x87\x84\x8d\xea\x22\x79\xde\xfd\x73\x13\xab\x07\x84\xae\xc2\xf9\x76\x94\xd8\xcd\x41\xfd\x18\xcf\x6a\x5e\x87\x79\xda\x7a\x7c\xd7\x84\x18\xdd\x38\x5e\x7e\x0e\xe5\x92\xf8\x71\xb9\x49\xef\x8f\x15\x7c\x85\x37\x13\xb1\x28\xab\x59\xa1\x3f\xbd\xb1\xe6\x25\xbd\xf1\xe7\x24\x9e\x4d\x6b\xe6\xd2\x1b\xc2\xef\x48\xf8\x3f\xcd\x26\x2c\xf1\xc7\x35\xb1\x38\x5b\x37\xf4\xb1\xd8\x3e\xbe\xb9\xba\x5e\x41\x09\x50\x1b\x9f\x17\x53\x56\xdd\x87\xed\xfc\x8b\x3b\x2b\x88\x16\xc1\x27\x49\x7d\x31\xcb\xe2\x9a\x46\x76\x6f\xfc\xe4\xc3\xb5\x6f\x06\x3d\x6d\x6d\x1b\x42\xc1\xe1\x4d\x11\x23\x86\xab\xfb\xc6\xa2\xe1\x35\x7e\x6f\x78\xdc\xac\xe1\xd2\xd8\x98\x36\xbc\x46\xd4\xf0\x1a\xff\xdf\xff\xdb\xf0\x1a\x93\x86\xd7\x68\x78\x8d\xf3\x86\xd7\x78\xd7\xf0\x1a\x7f\x6e\x78\x8d\xcf\x0d\xaf\xf1\xa1\xe1\x35\x5e\x35\xbc\xc6\x7f\x34\xbc\xc6\xdf\x1a\xfd\x3b\xb9\x76\x4a\x96\x82\xde\x62\x39\xe5\xdc\x8b\x81\xc4\xd0\x49\x0e\x7f\xf2\xc5\xe1\xa3\x47\x32\x29\x3b\x8b\x67\xa9\x1f\x05\x29\x1c\x2e\x15\x83\xd0\x92\x8a\xd2\x35\x60\xae\x2d\xaf\xd0\x92\x5b\xeb\x26\x6b\x8d\x46\x49\x03\x6a\xab\x16\x37\x65\x86\x0b\xdd\x3b\x99\xa2\xc3\xe6\x0c\xc3\x89\x3f\xd6\x05\x44\x82\x3a\x79\x11\xa2\xa7\x0b\xa8\x94\x25\x68\x51\x22\xc1\x75\xe4\x90\xa0\xef\xa6\xf3\x53\x96\x0c\x19\x5e\xf5\x15\xe0\x65\xc2\xb7\x6f\xd0\xf8\xa1\x61\xfb\x0c\x45\xec\xf2\x35\x62\xea\xa4\x52\x13\xa8\xfb\xb3\x32\x61\x49\xef\x99\x52\x5b\xaa\xe8\x47\xa3\x9a\x39\xd0\xaf\xd9\x8e\xc2\xf1\x18\xbd\x18\x44\x5e\x93\x27\xe8\x33\x5a\x7f\x1c\x9e\x46\x56\x3e\xa6\xe8\x02\x69\x3e\x3f\xb5\xb3\x17\x93\x41\x6c\x37\x40\x49\xba\x08\x5f\x20\x5b\x05\x78\x82\xce\xbe\x0c\x03\x7c\x69\x57\xe7\x63\x8a\x2e\x30\x8c\xc9\xb3\x46\x17\xc0\x14\x5d\x40\x4d\xa7\x56\x21\x95\xaa\x0b\x66\x8b\x29\xb3\xca\x88\xa8\x0e\x3c\x4f\xdc\x19\x9a\x65\x74\x67\x88\xd4\x0c\xee\x16\xa4\xb3\xd1\x28\x9c\x37\x65\xa9\xd7\x71\x02\x9f\xde\x6c\x52\x01\x8f\x36\x11\xb0\x04\x3e\x83\xee\xff\x1e\x8e\x17\x78\x21\x6a\x96\xe1\xd3\xfd\x62\x18\x04\xbc\xae\x22\x58\xb7\x0b\x8d\x3f\x35\xe0\x50\x09\x54\xaf\xd5\x87\x7d\x2b\xfb\x5f\x1a\x5c\x61\x6c\xf5\x06\xf1\xfc\x97\xfe\x56\x33\x63\x69\xe6\x70\x8c\x5d\x38\x84\x46\xab\x01\x1b\xd8\xa1\x66\x16\xbf\x8d\x2f\x59\x72\xe4\xe3\x0b\xa4\xfb\xd0\x68\x18\xc3\x43\x98\xd5\x35\xdb\xe6\xcd\x6e\xf5\x7e\x98\xe6\x9b\x90\xbc\xbd\x2f\x77\x30\xb1\xfb\x7f\x3d\xf3\xe5\xca\xc6\x70\x97\x3f\x8b\x67\xe3\x00\x2e\x19\xcc\x52\x76\x28\x8b\xbe\x49\x21\x3b\x0b\x53\xc0\x3d\xe4\x8c\x9d\xb2\x04\x11\x56\xf9\x47\x7e\x44\x05\x70\x5c\x4e\x59\xc4\x12\xdc\xb5\x11\xd6\x45\xe8\x8f\x21\x8a\xe9\x95\xfc\x43\xcd\xcf\x6a\xde\xab\x75\xa3\xce\xcf\x90\x25\x02\xd3\xe3\xcd\x1a\xee\x0a\x13\x7f\x31\x60\x9f\x24\xc1\x1e\x22\x52\xdf\xbe\xc1\x56\x2f\x60\xa3\xd3\x69\x92\xfe\x60\x11\x48\x53\xe4\x13\xcb\x90\x0b\x24\x68\xcd\x8e\xe1\x88\x77\x40\xf1\x5b\xe0\xc9\x2a\x71\x02\xc3\xb1\x3f\x99\x12\xf7\xc8\x6c\xa3\x66\x16\x0b\xc6\x9a\xf2\x39\x87\x05\xc2\xd1\xdb\xe4\x41\x2e\x87\xe1\x28\x1c\xfa\x91\xd1\xa4\x07\x61\x06\x93\x59\x9a\xc1\x80\x41\x18\x41\xaf\xed\x41\xa7\xdd\xb7\x2a\xf2\xe9\x33\xa8\xa9\xd2\xf2\xa0\xd3\x12\x55\x4c\xd1\x32\xbe\xd5\xdd\x0b\xa4\x05\x1c\xc2\x63\xd8\x87\x76\x47\xfb\x6d\x73\x8e\xe2\x34\xcb\xf3\x94\xba\xb2\xdc\xf6\xf4\xc1\x7b\xa7\xed\x69\xe0\xae\x09\xa4\x10\xf1\x03\x8b\xb7\xac\xe2\x62\x20\x14\x2f\xd2\xb0\x3b\xb9\xbb\x79\x18\xb6\x8f\x27\x7d\x90\x82\x28\x04\xd8\xd8\x4e\xc3\x7c\xc5\x00\x24\x3a\x66\x7e\x88\xb7\xb7\x86\xea\xcd\xe8\x70\x24\xfa\x8f\x52\x35\x6c\xd8\xc1\x44\x4d\x58\x9a\x15\x25\x5e\x1b\x66\x89\x03\xbb\x1a\x74\x95\x8b\x57\xe1\x80\x50\x17\xd9\x10\x57\x0c\x55\xc6\xd6\x16\x7c\x60\x09\x6f\x0a\x79\x27\x8c\x42\x14\x21\x6a\x3b\x13\xbb\x9c\x39\x6a\xfc\xc4\x4e\xfd\x2c\xbc\x50\x97\x1f\xe1\x99\xf6\xa0\xd3\x4d\x19\xe8\xab\xcb\xe8\xd4\x0f\x73\x24\x6c\x54\xde\x8c\xc0\x87\x48\x82\x27\x48\x09\x5f\xee\xe0\x91\x09\xce\x09\xc1\x0c\xcf\x21\x34\x82\x1e\x64\x09\xf3\x33\xf0\x53\x98\xc6\x69\xc8\x6b\x6a\x9c\xd5\x7d\x5f\x85\xf3\xa3\x47\x82\x08\x14\xcb\xc2\x2d\x74\x69\xe4\x8f\xd3\x1c\x85\x96\xd0\xf1\xaa\xe7\x8a\x55\x72\xed\x1e\x82\x43\xb3\x22\x1f\x76\x87\x2b\x53\xfc\xb9\x0f\x8d\xcd\x06\x57\xc0\x3a\x73\xb3\xc1\x35\x48\xae\x70\xa3\x21\xca\x28\x2e\xa0\x86\x0e\x2a\x98\xc7\xfc\xb5\x61\x72\x5c\xca\xa1\x49\x7b\xb8\xb7\x07\x1b\xab\x5a\xf4\xd2\xf1\x8f\x60\xbc\x12\x7a\x97\xeb\x46\xd8\x82\xed\x3e\x6a\x7e\x8e\x64\x91\xee\xf9\x2e\xb9\x0d\x2a\x6c\x13\xfb\xc7\x84\xf9\xe7\x74\x4f\x98\xc6\x98\x05\x82\x13\xc2\x48\x68\x38\x39\x31\xfc\xf7\x7f\xfd\x6f\xcc\xf9\xef\xff\xfa\x7f\x60\xea\x27\x5c\xa3\xfa\x99\x78\x04\xd9\x04\x89\xe6\x2d\x3e\x8f\x1b\x05\x30\x4a\x7c\x94\x79\x7f\xcc\x35\xaa\x39\x6f\xfc\xf7\x7f\xfd\x6f\x1a\x52\x1b\x5e\x98\x72\x85\x6c\xf3\x94\xa1\xf6\xed\x0d\x7a\xf3\xe6\x11\x5d\x6b\xb6\x23\x09\x43\x4d\xc4\x43\x0d\x7e\xa8\x6a\x0f\xcf\xfc\xe4\x28\x0e\xd8\x8b\xcc\x09\x5d\x0f\x76\xf6\xe0\x39\x0c\x39\x7f\x0c\xe1\x39\xec\x3e\xc9\x57\xce\xb3\x01\x87\xd4\xed\xc2\xce\x63\x38\x54\x26\xb6\xe0\x1f\x71\x30\x23\x9c\xf0\xf6\xed\x44\xb7\x52\xd9\xd8\x42\x6e\x56\x6a\x79\x10\xba\xf9\x82\x03\x3e\x9a\x76\xe2\xd5\x83\xb2\x6f\x7d\xc1\xf9\x81\xa9\x0e\xe8\xbe\xf8\x78\x0c\x9c\x10\xfe\x30\x63\x89\x18\x0f\x6e\xcc\x78\xa0\x16\x49\xdc\x62\x98\x4e\xc7\x7c\x42\x1c\xb0\x51\x9c\x30\x98\xfa\x41\x60\xe8\x2f\x11\x87\x79\xe2\x73\x4e\x7c\xc8\x55\x89\xab\x7a\x81\x50\x88\x5f\x3d\x78\x13\x8d\xb8\x16\x5c\x68\xb6\xcc\x6b\x00\x1b\x30\x3e\x74\x2d\xa2\x7a\x9b\x92\x29\x8f\x84\x36\x2c\x3e\xb0\xc9\x5a\x70\xc5\x06\x09\x9d\xaf\x16\xe4\x91\x12\x19\xbb\x87\x86\xd7\x18\xa5\x6c\x82\x82\xd9\x76\xe9\x38\x87\x93\xca\x35\x8d\xaf\x7a\x3a\x56\xd2\xd0\x1f\xf1\x12\x75\x24\x2c\xa3\xa0\xc4\x5d\xf4\xd1\x53\x00\xd4\x3d\x31\x89\x78\x91\x06\xb0\xaf\x29\xef\x19\x54\xb0\x7b\xf2\x91\xe1\x79\x7c\x32\x1b\x66\xa2\x4b\x28\xc7\xb3\x6c\x3a\xcb\x60\xe0\xa7\x2c\x80\x38\x12\x86\x55\x1a\x26\xbc\x27\x7c\x65\x32\x61\x91\x12\xe0\xf4\x32\xcc\x86\x67\xe0\x60\x86\x29\x3f\x43\x3f\x65\xd0\x78\xd6\xd8\xb7\xb9\x5b\x28\x74\xd1\x27\x7b\xfc\x60\x43\x62\x7a\x90\xe7\x74\x82\xd6\xad\x84\x96\xa3\x55\x4e\xdc\xca\xa1\xfd\xa7\x01\x4d\x92\x56\xc9\x9e\xe2\xc1\x1c\xd1\x9f\x63\x50\xd1\x8d\x55\x3a\x23\x80\x8a\xe3\xdc\x02\x32\xc2\x66\x2d\xe0\xb2\x4c\x23\x39\x60\x4a\xda\xc5\x2e\xa8\x5c\x79\x0b\x4b\xc1\x7a\x11\x9d\xa6\x83\x66\x16\x7f\x22\x57\x84\x92\x0b\x84\xfa\x74\x53\xad\x95\x2d\xcf\x77\xd3\x69\x86\xc0\xa9\x33\xe4\x9c\x29\x48\x7d\xd0\xab\x63\xcf\x8e\xdb\x80\x8b\x0a\x72\x05\x12\xcb\x75\xe7\xbe\x97\xe7\x5e\x6e\x09\xca\x65\x63\xd4\x30\x52\x5d\xc3\x53\x9b\x99\x91\xef\x36\xf7\x0c\x43\x78\xcf\x8a\xe9\xb3\x8c\x13\x81\xde\xb8\xad\x8e\xa9\xeb\xf2\xb9\xdf\x75\x5d\x58\x87\x6d\x8d\xc5\x79\x3e\x9a\xd0\x26\x73\xad\x15\xb8\x69\x54\x0b\x6b\x84\xa1\x15\x51\x7e\x3f\x22\x67\x9e\xcb\x6c\xe7\x1c\xd6\x41\x99\xc8\x53\xc3\x2e\xba\xca\x87\xde\xfb\x6a\x70\xd2\xbe\x1e\x3d\xcf\x48\xa6\x91\xdf\xb7\x7e\x55\x3b\xc1\xed\x7d\x87\x80\xda\x2b\x07\x1f\xc8\xb1\xd6\x4d\x77\xec\x97\xdf\x2d\x7e\xf0\x60\x6b\x0b\x7a\x3d\x3e\xc1\xf4\x51\xaf\xf6\x7b\x29\xfd\x8b\x3b\x08\xfd\x5e\xab\xdf\x43\xd5\xdf\xef\x79\xfd\x9e\xde\x65\x11\xcb\x69\xe1\x94\x07\x5d\xd8\xfa\x4f\xe7\x70\xdf\x69\xba\x87\x4e\xef\xd9\xf3\xee\x7f\xf6\x5d\xfe\xb5\xf1\xf7\xcd\xbf\x3b\xd0\xe7\x9f\x7f\xfa\x17\xfe\xa7\xe5\x1e\x3a\xe8\x97\xe7\x78\xfc\xab\x49\xdf\x3d\x7f\xf3\xf7\x1f\xfa\xee\xe1\x9f\xb6\x42\xd3\x0d\x2f\x47\x8c\xfc\xbe\x9a\x54\x3c\xec\x12\x5e\x57\x96\x24\xcf\x3c\x3b\x5b\x87\xf8\x84\x6e\xbe\xaa\x11\xfe\x93\xfc\x7e\xd2\xcc\x8f\x86\x2c\x1e\x19\x78\x55\xb7\x66\x04\x2e\x21\xb7\xb7\x2e\x24\x8c\x3c\xb6\x0c\x61\x77\x21\x3b\x4b\xe2\x4b\xc4\xfc\x55\x92\xc4\x89\xd3\x08\xa3\x0b\x7f\x1c\x06\x8a\xbf\x1b\xb0\x01\xb9\xfd\x3d\x0a\x39\x9a\x0d\x95\xcd\x21\xb6\xfa\x30\xad\xd7\xee\xe3\xa6\x24\xa8\xcd\x20\xb9\xd3\x47\xd9\x1d\xca\x7e\xae\xb2\x53\x33\x77\x9b\x72\x37\x75\xae\xdc\xe6\xa3\xfc\x1d\xca\x57\xd9\x62\x8b\xef\xe1\x43\xca\xde\x55\xbb\x2a\x72\x73\x8f\xd2\x1f\xf7\x71\xcd\x26\x7f\xa8\x2d\x65\xb1\xc1\x27\xab\x3f\xd1\xfb\xad\xc6\xf6\x03\xe5\xed\x99\x20\xf6\xfa\x62\x7a\x6b\x2b\x5d\x24\x06\x91\xf2\x9f\x0a\x34\xa5\xff\xdd\xe7\x33\x06\x8d\xa8\x41\x85\x68\x63\xca\x1f\x87\x7e\x8a\xbe\x38\x0d\xef\xb4\x21\x9d\xa0\xf4\x1a\x2b\x6a\xb8\x0a\xbf\x2c\xe1\x86\x90\x54\xd8\xa7\x0a\xec\x3b\x7f\x0a\x72\xbc\x78\x6e\x2a\xb7\x6f\xa4\x72\x15\xd3\x9d\x19\xf5\xec\xe1\xf2\xe2\x5a\xb9\x75\xe5\x2a\x5c\xb4\x87\xe1\x88\xc6\x02\x59\x21\x4c\x8d\xad\x27\x35\xb3\x9f\xc6\x2c\x15\x46\x21\x8e\x39\x5f\x48\x09\x3b\x3b\x08\x4f\xc3\x2c\x95\x44\x40\x40\xdf\xbe\x81\x43\x7c\xc5\xa9\xd1\xc2\x1d\x49\xc1\x49\x3c\xa1\xdb\x70\x5d\x39\xfa\x44\x1e\xc1\x84\x68\x8e\x4a\x96\x6b\x74\x09\xc1\xec\x2c\x4c\x9b\xa2\x00\xff\x73\x20\xd3\x64\x41\xfc\xab\x52\xe5\xd6\xb3\x95\xa6\xf6\x9b\xf1\x43\xa5\x0b\x1c\xf8\x1f\x95\x26\x99\x0f\xff\xaa\x54\x39\x9a\xf8\x57\xa5\x96\x6e\x74\xa9\x5c\x41\x67\xda\x2e\xbe\x7a\xf0\xa0\x52\x47\xd4\x98\x34\x32\x3a\x8f\xa4\x81\x60\xd8\x0d\x83\x02\x76\x52\x5a\x4c\xc1\x3e\xab\x34\x47\xf7\x9c\x36\x84\x71\x09\x9e\xcb\x16\x44\x50\x3b\x76\xb8\xfb\x60\x6e\xc3\x19\xa5\xbe\x41\xcb\xcd\xd7\x27\x72\x1d\x42\xc3\x2b\x87\x5f\xb6\x2b\x88\x6d\x34\x9a\x5c\x67\x99\x3b\x78\xb9\xf2\x76\x6b\x8a\xce\x07\x0f\xae\x4a\xe6\xe6\x3f\xd6\xed\x40\xcb\x55\xab\xe6\xf0\xf2\xe6\xef\x9a\xdd\xff\xf1\xab\x3a\x48\x43\x27\x84\x5a\x5f\x9a\x8e\x38\x83\xbd\xf1\x41\x29\xe7\xff\x46\xa3\xee\x04\xae\x48\xd4\x8a\x63\xb8\xc6\x0f\x0d\xe3\x99\xa8\xb9\x07\x53\xc3\xf3\xc2\x99\xc3\x3a\xb4\x5b\x2d\xb7\x99\xc5\xe8\x6d\xe3\x4c\xdd\x03\x7a\x62\xaa\x31\xb0\xea\x19\x95\x90\x45\x71\x6b\xd2\x99\xbb\x4a\x80\x9d\x8e\xaa\x39\xac\xaa\x39\xa7\x25\x89\x28\x16\xac\xd8\x40\xbb\xa5\x5a\x60\x35\x7d\x9a\x37\xb3\xf8\x95\xde\xda\x32\x7a\x34\xba\xa6\x56\x9e\x02\xa7\xd7\x94\xff\x20\x45\xd3\xa8\x13\xaf\xd8\xa9\x3d\x55\x73\x5a\xd3\xda\xf2\xa7\xbc\x8a\x39\x4b\x17\x2c\x62\xb8\x39\x70\xd9\x6c\x52\xcb\x66\x4b\xc1\x45\x38\x69\x2d\x9c\x52\x09\xad\x02\xf5\xcb\xaa\x8c\xf1\x98\xff\xf8\x32\x9d\xca\x43\x3d\xd9\xb7\xf9\xea\x80\x0e\xe0\xaa\x7c\xb1\xf3\x4f\xfc\x32\x80\xbd\x5d\x7d\x63\xff\x31\x43\xe5\xe0\x6e\x6a\xcd\x6d\xef\x8e\xba\x6f\x94\x6b\xfb\x2e\x9c\x47\x84\x6c\x18\xf7\x11\x97\x59\xca\xe7\x50\x2f\x17\x0f\x14\x0c\xb9\x02\x09\xdc\x9c\xde\x52\x11\x53\xd8\x68\x14\x0e\x43\x72\x6c\x08\x7a\x2d\x65\x7e\xcb\xed\x02\x4c\x6e\xf7\xcd\xe0\xac\x2a\x6b\x13\x9c\xdc\xf1\xc1\x72\xdb\x15\x0a\x80\xde\x6d\xc0\xe0\xb6\x66\xc0\x7f\x03\xb3\xe2\x6d\xf8\x90\x2e\xfa\xc1\xa1\x59\x4c\x39\xe1\x87\xf0\x3c\x9f\x07\x1b\xc6\xb6\x6b\x08\x9b\x10\x19\xbb\xad\x8d\x56\xc3\xb5\x2a\xb7\xec\xca\xe6\xc6\x38\xa7\x1e\x1a\x37\xc5\xfc\x50\x03\x69\xb4\xb0\x8c\x6e\xb2\x8d\x41\xbd\x75\x73\xb0\x71\x97\x03\x6d\x1a\x5a\x53\x7c\xb1\x60\x13\xda\xae\xdb\x6b\xd1\x7d\xa6\x31\x4b\x53\xc8\xce\xfc\x08\xda\x8b\x87\xe5\x1a\xe1\x8f\xfb\x38\x05\xc5\x0a\x13\x77\x3b\x2e\x7c\x11\xe7\x57\x05\x9f\xcb\x47\xa6\x93\x57\x4c\x5b\xd6\xbb\x5f\x6d\x5d\xd2\x78\x86\x4f\xe4\xce\x5b\x2a\xb7\x17\x6a\x01\x98\xb7\x8d\x64\x2d\x00\x99\xba\xa0\x3a\x6f\xc3\x33\x98\xab\xb8\xf8\x9c\xf9\x43\xce\x23\x1c\x5c\xd8\xf6\xa8\xd5\xec\x40\x65\xce\x5b\x1e\xb5\x35\x6f\x7b\x04\x5d\x6f\x5b\xea\xe6\x31\xb6\x20\x75\x55\x48\xcb\xbc\x85\x72\xac\x51\x31\x8b\x60\xec\xe8\x79\xdb\x0c\x97\x4e\x05\x2b\xf6\xb9\xfe\x58\x0f\x53\xd0\x60\x0f\xfd\x31\x8b\x02\xff\xa6\x1b\x5c\xc1\xf6\x35\x61\x30\xf1\xca\xe8\x8d\x4c\xf1\x60\xfb\xd8\xb8\x53\x54\x13\xd9\xea\x86\xd1\xbe\x3a\xbc\x85\x2c\x9c\xd4\xdc\xc1\xee\xdc\xd0\x4d\x74\x5b\x81\x26\x25\x52\xb3\x88\xb8\x61\xf8\xd1\x9d\xa5\xc2\x8f\xde\xcc\x03\x75\x18\x47\x59\x18\xcd\xe2\x59\xf5\x96\x65\x7b\xe7\x86\x78\x3f\x3e\x3e\x8e\xc2\xba\xd7\x23\xf7\x1e\xe7\xfc\x4e\x83\x59\x82\x9e\x48\x9f\xd8\x30\xc6\xa8\x5c\xed\x56\x4b\x28\x17\x99\xf5\x2e\x8c\x66\x19\xe3\x1a\xc3\x2e\xbb\x0e\x8f\x73\x25\xff\x12\xcf\x12\xa3\x9c\xa8\x58\x2c\xf7\x12\x9f\x21\xb2\x6a\xad\x43\x67\xc7\x2e\xf4\x57\xc6\xce\x8d\x52\xbc\xce\x3a\x3c\xc9\xa1\x16\x47\xb8\x15\x62\x17\xda\xce\x35\xf7\x37\xe6\x27\xc5\x42\x8f\x77\xcd\x3d\xd8\xc0\xcf\x98\xbc\xca\x66\x6c\xb8\xbe\xa4\x64\xfb\xde\x33\xdd\xb9\xcb\x95\xce\x8c\x3d\x54\xac\x06\x87\x80\x31\x6a\x36\x14\x9c\x8d\x3c\x20\xa9\x1d\x9c\x05\xf3\x13\x0f\x26\xbc\x37\x1e\x5c\x32\x76\xee\x41\xe0\x2f\x3c\x38\x8b\x67\x3c\x1d\xe9\xe8\x41\x8a\x74\xe7\xbf\xc7\xe3\x50\xfe\x20\x11\x30\x9e\x57\xc0\x6b\x39\x4b\x18\x5b\x39\x56\x2c\x8b\x96\xb4\x4a\xed\xa1\xa8\x6d\x28\x95\xb7\x61\xc4\x29\xcf\xd7\x0b\x2b\xa9\x22\x09\xcc\x48\xfc\x89\xae\xf0\x72\xa4\xd4\xcc\x17\x5d\x30\x7a\x32\x06\x5d\x56\xe9\x67\x21\xfc\xae\x19\x1d\x56\x4d\xa1\x44\xb3\x77\x9a\x8c\xea\x44\xc2\x69\x34\x7f\x78\xdb\x50\x6d\x88\x0d\xf5\x7c\x99\xfd\x1f\x3e\xe5\xcb\x28\x21\x91\x65\x7e\x78\xb3\xff\xc3\xbb\x7c\x29\x21\x20\xba\x0c\xfc\x30\xcd\x97\x21\xe1\x50\x45\x7c\xf8\x21\xc8\x17\x11\xa2\xa1\xca\x0c\x4a\xca\x48\xd1\x50\x85\x7e\xcc\x97\x10\x62\xa1\x0a\xfc\xad\xa1\x8d\x0c\x7a\x56\x85\x26\x62\xf4\x49\xc7\x9a\x3d\xc9\x74\xd0\xf6\x04\x9d\x2d\x95\x20\x2c\x09\x5d\x6c\x97\xff\x0f\xd6\xaf\x29\xd6\xde\xe5\xff\xbb\xb6\xd8\x76\x8b\xff\xaf\xb2\x98\x94\x92\x02\x6e\x34\x34\x85\x62\x79\xdc\xca\x8b\x15\x70\x2b\x2f\x56\xc0\xcd\x2e\x06\x42\x92\x0b\xb8\x21\x43\x40\xa1\xd8\x36\xff\x9f\x01\xad\xa2\xd8\x63\xfe\xbf\x6b\x8b\xb5\x3b\xfc\x7f\x35\xc5\x48\xd7\x14\x70\xe3\x8c\x58\x52\xac\xc3\xff\x67\x40\xcb\x17\x23\xf5\x55\x80\x86\x3c\xab\x8b\x09\x5d\x57\x1c\x2c\x64\xdb\x42\xb1\x3c\x41\x72\xc5\x80\x14\x68\x01\x1a\xb2\x38\xf4\x1f\x00\xf4\x6d\x27\x76\xce\xdf\xe2\x58\x9c\x6b\xfe\x5c\xb4\x0a\x87\x58\x4e\x64\x3d\xc3\xc9\x01\x0e\x8b\x6a\xc3\x70\xe9\x24\x46\x28\xaf\xf1\x29\x5f\x98\x8f\x4b\x15\x70\x0e\xc6\x28\x1a\xf8\x8b\xf2\x92\x7c\x10\xcd\xf6\x39\x41\xf2\x25\x1d\x3e\x16\xe5\xd5\xf9\xa8\xed\x1b\xea\xc4\x74\x4f\xe5\xc4\xac\x40\x8f\xb7\x62\x94\xd4\x8a\xc4\xa5\x0a\x45\x67\x05\x53\x93\x38\xd2\xb6\xf7\xa0\xe2\x61\x3e\x5a\x7e\xc8\x62\xfa\x01\x14\x9d\x82\x6f\xf1\x60\x49\xe9\x8d\x29\xfd\x68\x78\x4b\xe2\x2d\xb2\xdc\x11\x11\xcf\xf0\x21\x61\x7e\x1a\x47\xf8\x9c\x07\x16\x95\x30\x25\x30\xcb\x39\x87\xcd\x33\xbe\xb6\x16\xb7\xec\xc5\x74\xe2\x47\x01\x87\x13\xcf\x4e\xcf\x80\xa5\x59\x38\xe1\xb4\xe1\x45\x38\xb8\x34\xfc\x5d\x7b\x32\x1b\x37\xf7\xfd\x34\x9d\x4d\x98\xee\x41\x98\x82\x3f\x4e\x98\x1f\x2c\xc0\x07\x6e\xc5\xea\x2c\x0e\x9f\x2f\x3d\x42\xe1\x0a\x24\xcf\xec\xe2\x91\x41\x00\x3c\xbe\xc3\xe9\xb0\x61\xfb\x01\x67\x7e\x72\xca\xb2\xba\x97\x95\x14\xf9\x73\xee\x80\xcb\x85\xb6\x54\xf1\xbb\x69\x76\x1e\x70\x21\xc8\xe2\x44\xbc\xa7\x2f\x17\x5c\xa1\xf9\x58\x41\xaf\x83\xf7\xff\x9a\x49\x78\x7a\x96\x39\xd6\xa4\xe2\x09\x7c\xad\xb8\x1b\xb4\xf9\x61\x95\xcb\x85\x6c\x00\xf1\x0c\xd4\xea\x58\x9f\x22\xd6\xf2\x89\x2a\x23\x44\x2b\x6c\x59\xfa\x42\xbc\x3e\x97\x4f\x54\x8b\x74\xed\x65\x64\x30\x25\x17\x99\x9c\x6b\x33\xf6\xc7\x44\x3b\x84\x5c\xd7\x7a\x62\xc4\xb6\x72\xc9\xb8\xc7\xd1\xef\x75\xfa\xf0\x2c\x9f\x83\xa9\x5b\x72\xa8\x0f\x69\x3b\x04\xf6\x41\xbe\x99\x61\x90\x27\xec\xb5\xfb\xa5\xb8\x86\xbd\x56\xbf\xd2\x0d\xfb\x8e\x69\x2b\x25\xbc\x9e\x7a\x86\x41\xab\xdd\xae\x40\xfb\x55\xa9\x48\xb5\x1c\x37\x75\x1c\xa7\x00\xec\xeb\x3d\x03\x76\xc1\x92\x85\xa3\x9e\xb2\x33\x1e\x08\x50\xe6\xa2\xe2\xd4\x45\x4e\xeb\x2b\x3b\x9d\x8a\x3a\x0b\xb7\x10\x7a\xbe\xe6\x95\x81\xea\xc8\xf3\x22\x32\xfc\x32\xab\xcd\xdc\x8b\x01\x22\x32\xbe\x27\x56\x1c\xae\xcb\x27\x04\x82\xe6\x36\x27\xfe\xd4\xd0\xb9\x06\x92\xf2\xf5\x3e\x2d\x92\x86\xd6\xd5\x8a\x56\xee\xca\x4a\x80\xc6\x7d\xa2\x56\x6e\xc3\x14\x20\xc3\x1d\xa3\x5e\x60\xec\x31\xf5\xed\xf0\xbc\x59\x9b\x73\x6b\xcb\xa8\xa2\xa3\xa9\x24\x2e\xee\x12\x65\x2d\x8f\x60\x67\x6d\x8f\x20\x1a\x5b\x48\x15\xf3\x04\xd6\x69\x7b\xd6\xeb\x84\xbc\x34\x1c\x42\x26\x62\xeb\x53\x11\xe9\x24\x2c\x02\x1d\x85\xd1\x70\x3c\x4b\xc3\x0b\x86\x0c\x68\x8e\x50\x42\x55\xe5\x0b\x83\xb0\x2f\xf6\xaa\x72\x14\x24\xeb\xc0\x24\x23\x4e\x2d\xa6\x37\x9b\x3d\xf2\x86\x77\x9d\x62\x51\x03\x90\x9c\x2c\x2d\x9f\x1d\xbb\xd9\x88\x1e\xe0\x5d\x71\xdc\x2c\x47\x34\x63\xea\xac\xa2\x28\x0e\x6c\x61\x2c\xc5\xf3\xb2\x6a\xf4\x14\xdb\x5e\xab\x09\xd4\x9e\x43\xe9\x16\x6e\x60\xc8\xbe\x69\x63\x94\xbe\x3d\x71\xcd\xab\x0b\xab\x2f\x69\x09\x21\x04\x4b\x3a\x89\x37\xe3\xdd\xe5\xba\xbb\xee\xe5\x86\xd5\x77\x88\x07\xb9\x1d\x62\x6b\x87\x41\x61\xbd\xd4\xa6\x5b\xaf\x71\x2e\x94\xf2\x84\xfd\x6d\x89\x65\xb8\x55\x75\xa4\xaa\x92\xa1\xbd\x4a\xdd\x5f\x55\x5d\x34\xf9\x57\xa9\xea\xab\xaa\xb8\x47\xb3\x42\xcd\x81\xaa\x49\xbb\x49\x2b\x54\x0d\x74\x5f\xc5\x7e\xd5\x0a\x95\x4f\x55\x65\xb9\x29\xb6\x42\xe5\xa1\xd1\xb2\xde\x8a\xb8\x06\x42\x71\xf3\xd3\xa4\x9b\x50\x36\x9c\xd9\xe5\x8b\x24\x3d\x35\xaf\x75\x5a\xad\x96\x47\x4f\x54\x7b\x50\x4c\xed\xb8\xfd\xaa\xe8\x4a\x7f\xac\xd0\x9e\xcb\x07\x27\xea\x74\x76\xea\x63\xd9\x68\x9a\xfd\x33\x06\x28\xaa\xeb\xd5\x07\x3f\x49\xef\xbe\x1f\xf7\x13\xc8\xa8\xaa\x1f\xb3\x6c\x58\xd6\x8d\xbb\x8e\x77\xf4\x74\x59\x1e\xb9\x8b\x98\x47\x61\x1a\xbf\xbe\xe6\xd4\xe2\x69\xab\x1e\x21\x05\xe2\x86\x98\x6c\x2b\x4c\x90\xba\xd5\x1e\x52\x9d\xc7\xd7\x22\xa2\xc6\xa7\x34\xbe\xcb\x77\x88\xbf\x7a\x43\xd7\x73\x1a\xca\x9b\x1f\xcb\x2d\x71\xb2\x65\x3e\x51\xc8\x5b\x43\x6d\x1b\x68\xdf\xe9\x16\x3c\xeb\x42\xd0\x5c\xc0\xa3\x47\xf8\xe7\x19\xba\x78\x99\x56\x9e\x9f\x31\x23\x8c\xb3\xb3\xd9\xf6\x20\x68\x4e\xf8\x3f\x01\xff\xe7\x2f\xfc\x9f\x77\xfc\x9f\x4f\xfc\x9f\xb7\xf2\xf5\x32\x3f\x63\xcd\x94\x65\xaf\x67\xe3\xf1\xdf\x70\x2b\xa7\x99\x7b\x71\x24\x10\x41\xa1\xaf\x4a\x0e\x3b\x82\xe6\xe2\xda\x56\xcc\x33\x8c\x59\x36\xbc\x75\xc7\xf8\x3f\xcd\x2f\x9f\x8f\xae\xef\x61\xae\x8b\x5f\x3e\x1f\xdd\xac\x97\xaa\xc5\xeb\xbb\x9b\x3f\xfc\x61\x97\xd8\xdc\xc2\xb2\xcd\xbe\x2e\xf6\x61\xe1\xc1\x64\x9f\x4f\xa4\xc1\x3e\xb4\x3d\xf8\x0b\x7e\xbf\xc3\x7f\x3f\xe1\xbf\x6f\xf7\xa1\x95\x0b\xa1\x6b\x32\x63\x21\xdc\x8a\x50\x5c\xbc\x1f\x9f\xc3\x09\x33\x22\x8f\x88\x14\xb9\xd8\x32\x0a\xda\x85\x72\x05\x32\x0b\x4a\x56\x84\x30\x65\x49\x18\x07\xa9\x15\x08\x84\x27\xe4\x8a\x71\x4b\x39\xf0\x17\xa9\xd9\xd8\x22\x5f\x28\x3d\x8b\x13\xdc\x5a\xb4\x4b\x62\xf2\xcb\x62\x71\x34\xc2\x8d\x72\xf4\xbb\x0c\xe6\xbb\x5c\x49\x23\x51\x9d\x5f\x10\xde\x1f\xf5\x81\xcc\x47\x49\x5e\xd9\x47\xd7\x08\x7e\x12\xc6\xc1\xdb\x38\x3e\xc7\xd8\x36\x72\x44\xf8\xcf\xaa\x2a\xa2\xff\xa5\xe0\x25\x6d\xf2\x85\x6b\x1b\x28\x54\x32\x89\x57\xda\x8c\x45\xdd\xd2\x6a\xb5\x0d\x96\x57\x47\x9a\x97\x36\x47\xa3\x61\x17\xac\x6d\x20\x57\x41\x8f\x51\x75\x6f\xde\x55\x55\xb9\xbe\x27\xa2\x6a\xee\x80\x8f\xf3\x08\x29\x9d\x86\xdf\x90\xeb\xef\x4f\x46\xcf\xa9\xa9\xc6\x8b\x86\xb9\x13\xae\xd3\x07\x76\x25\x6c\x44\x64\xfd\xa8\xb2\xcc\xd4\x61\x63\x1f\x57\xfe\xe2\x67\xa0\x0a\xbd\xf4\x17\xef\x47\x66\x49\x56\x9d\x35\xd2\xa0\xc3\x61\x12\xd3\xaa\x40\x08\x42\xe3\x2f\x2a\x93\xaf\x73\xe4\x91\x79\xe3\x8d\x95\xdc\xee\x88\xe4\x5f\xed\x56\x70\x23\x93\x72\xde\x1a\x8d\xa8\xa5\x87\x6c\x64\x62\x77\x8e\xce\x5e\x45\xde\x3b\xa3\x22\x5f\x2d\xc9\x3a\x53\x95\xfe\x01\x85\x45\x24\xff\xbb\x4a\xfe\x12\x85\x73\xae\xb3\xd2\xcc\x9f\x4c\x45\x6e\x5a\x9e\xfb\xc9\xc2\xe6\x93\x1e\x05\x2b\x7d\x96\x1f\x35\xc2\xf3\x5d\x1c\xe9\x11\xfc\x62\x95\xa1\x02\x9f\x66\x46\x81\x9f\x4b\x0a\xbc\xf9\xf4\x5e\xe4\x5e\x96\x37\x61\x41\xf8\x6b\x09\x04\x0b\x87\xb9\xcd\x14\xbf\xd8\x3f\x17\x0d\xf3\x14\x45\x24\xfe\x4d\x25\xca\xd9\x4d\x64\xfc\x87\xca\xf8\x8f\x38\x12\xca\x9b\x3c\xc7\x49\x32\xc2\x8c\x25\xfe\xf8\x03\x45\xb8\x51\x1b\x13\x5c\x22\x66\xd9\xf0\x75\xb5\x50\x7c\xf9\x7c\x54\x2b\x17\x5f\x3e\x1f\x55\x89\x86\xac\x5a\x2e\x1d\x5f\x3e\x1f\x2d\x25\x20\x5f\x3e\x1f\xd5\xc8\x48\x59\xee\xc8\x6a\xa3\x4e\x52\xbe\x7c\x3e\xaa\x10\x16\x91\x53\x22\x2f\xb2\xc5\x52\x91\xc1\x06\x6b\xa4\x46\x76\xba\x42\x70\xb0\x7a\xb9\xec\x7c\xf9\x7c\x74\x7f\xe2\xc3\x47\xaa\x42\x82\xf4\xf8\xd6\x0a\x91\x28\x56\x2b\x47\x56\x99\x32\x51\xca\xb7\x55\x21\x4d\x16\x9c\x1b\x09\xd4\x97\xcf\x47\xa5\x32\x65\x18\x8d\x05\xb1\xfa\xf2\xf9\x68\x55\xc9\x9a\xf2\x15\x50\x4e\xaa\x30\xad\x42\xa2\x30\xaf\x28\x4d\xba\x4a\x5e\x92\x30\x27\x2f\x45\x98\x48\x76\xe3\x4b\xcb\x1a\x44\xa1\xc2\xdc\x52\x81\x2a\xcf\x19\xa9\x66\xca\x05\x09\xf3\x0a\x42\x54\x4c\xfd\xd5\x6a\x21\x27\x3c\xa2\x81\x52\xc1\xd1\x7d\x2c\x08\x8d\xa8\x96\x17\x18\x4c\x2e\x08\x0b\xa6\x56\xc9\x4a\x31\xb3\x28\x2a\x34\x0c\x05\x31\x31\x07\xad\x42\x44\x54\x91\x0a\xf1\xc8\xe5\xdb\xa2\x51\x84\x5f\x10\x8b\x5c\xfd\x82\x48\xe4\x38\xc2\x90\x0e\x23\xc7\xe0\x93\x85\xcc\xc9\x09\x09\xa6\x95\x08\x08\xa6\xe7\x84\x83\x20\x97\xcb\x06\x5d\x4c\x4d\x19\x24\x6c\x38\x4b\xf0\x28\x26\x08\x13\x36\xc4\x58\x3b\x01\xc3\x40\x1a\x61\x1c\xa5\x2a\x48\x57\xc0\x46\x2c\x49\x28\xba\x9c\x30\xe0\x9a\x73\x2b\x82\x81\xb1\xce\x91\x1b\xf0\xa9\x7c\x23\x0a\x8b\xff\x52\x56\x1c\xd7\x39\xa5\xc5\x87\x55\xd0\x3f\x17\xaa\xe8\xf9\xb3\x0e\x27\x5d\x2a\x5f\xa9\x06\xb3\xea\x4a\xd7\xe0\x67\x55\xbc\x26\x44\xa3\xee\x8d\x7d\xa6\xa2\x9d\xd1\x0d\x37\x18\xe1\x49\x28\x6f\x7c\xf6\xfa\x79\x87\x81\xcd\xb6\x99\xf2\xab\xe9\x90\x0e\xe2\x92\x83\x0e\x05\x51\x8c\x20\x33\x34\x7f\x4c\xfd\xc0\xfc\x49\x68\x5a\xc1\xc8\x1e\x22\x72\x79\xff\x4a\xd7\x2d\xec\x23\x6c\x88\xf3\x50\xb9\xf2\xaa\x8c\x62\x84\x4f\x3c\xe8\xb8\x8b\x66\x04\x23\xf4\x40\xd8\xce\x85\x2d\x12\xcf\x29\xe0\xfb\x16\x46\x44\x48\xf4\xcc\xff\xd5\x83\xd0\xb5\xa2\x0a\xe1\x43\x1f\x53\x7c\x66\x7a\xea\x07\x69\x6f\x68\x47\x79\x3c\xf3\x93\x17\x19\xc7\xca\xed\xbb\xf0\x50\x7a\xb8\x54\x16\x32\x21\xe3\x61\x3d\x41\xa6\xb0\x49\x0d\x86\x71\xaa\x00\x6f\xa6\xb6\x1a\x79\x2c\x46\xea\x10\x93\x06\xbf\x37\xec\x53\x4b\x23\xed\xfb\x84\x57\xa8\xad\x56\xcc\xde\x0e\xad\x1c\x3e\xd2\x18\x8e\xc9\x78\x91\xe1\x81\xfc\xfb\x60\x55\x5a\xa9\x63\x7d\xac\x60\x3f\xf6\x70\x55\xf4\x24\x8a\xd8\x25\xee\x36\x9a\x4c\x1d\xb1\xcb\x97\x45\xff\x2d\xc5\xd4\x04\xda\x66\x6b\xf1\x32\x1a\x6e\xe2\xb4\x9f\xb6\x5a\x6e\x9e\xb9\x69\x0a\x50\x51\x0f\x02\xe3\xc8\xd7\x93\x42\xb1\xd1\xc5\xb7\x70\xec\xca\xea\x00\xd1\x76\x69\x79\xd8\x95\x5d\x94\xae\x2c\x2a\x94\xcc\x78\x9c\x0b\x82\xe4\xc3\x97\x9f\xde\xfc\x82\x5b\xce\x38\x41\xe5\x3c\x99\xa4\x5f\x4d\x66\x06\x3c\x6a\xfc\x7b\x03\xc2\x08\xf4\x3d\x28\x63\x2f\xef\xdf\xad\x18\x51\x9f\xcf\x18\xf8\x93\xcd\xe9\x04\x46\x63\x1f\xa3\x29\xb5\x30\x46\xc0\x8b\x77\x14\x78\xac\x8d\xbf\x3e\xbc\xb3\xa0\x4f\x25\xf4\xa0\xf9\x17\xe8\xe2\xbf\x3f\x40\xbb\x03\x1b\x10\x34\xa7\xb0\x0e\xed\x8e\x1d\x86\x8a\xfc\x2c\x02\x7f\xb1\x19\x8f\x36\x39\x49\x10\x34\xff\xe0\x09\x0b\xe6\x27\x90\xc5\x32\x9f\xff\xb4\x5a\xfb\x59\xb6\x66\x0b\x6b\xd0\xfc\x19\x9e\x41\x1b\xbe\x7d\x03\xfe\xf9\x1c\x76\xb7\x73\x64\x34\x4b\x3f\x74\x1a\x97\x02\x0e\x47\xfb\x52\xbf\x67\xab\xda\xf9\x8f\x62\x3b\x34\x80\xd0\x55\x5b\x9a\x92\x4b\x82\xe6\xc2\x75\x71\x60\xa1\x8b\x65\x9a\xa7\x4c\xac\x10\x1c\x4b\x3c\x44\x7d\x5e\xf0\x39\xec\x20\xb2\xbc\x4e\xb7\x8b\xd7\xae\x96\xda\x51\xee\x71\x7a\x6f\xad\x73\x1c\x68\x86\x27\x3f\x10\x16\x8e\xd1\x99\xcf\x85\xa5\x9e\xd5\xa9\x07\xe7\x12\xa8\x12\xcc\x97\x84\x39\x96\x30\xc5\x31\x6d\x33\x1e\x8d\x52\x96\x39\x24\x00\x38\x58\xf8\xea\xea\x3a\x3c\xb1\x5a\x09\x9a\x39\x0a\xaa\xcd\xdb\x5c\xb1\x89\x5d\x0c\x0d\xc3\x7c\x99\x20\x3f\x18\x19\x73\x30\xaa\x1f\x1f\xf0\x0d\x78\xec\xc2\x0f\xf0\xc4\xd0\x53\x79\x4f\x27\xd5\x69\xa1\x43\xea\x87\xfb\x7e\xc6\x9a\x99\xe7\xec\x77\x30\xd8\x65\xf0\x6e\x3d\xda\x85\x53\xf9\x9b\x0d\xf7\x32\x63\x7d\xed\x40\x5f\x3b\xca\x0f\xac\xd1\x46\x51\xff\x2b\x89\x3a\xc6\x4c\xf9\x52\xae\x5e\x4a\x14\x46\x63\x26\xaa\x1d\x42\xd0\x9c\xf1\x56\xf8\x14\xfb\x57\x95\xd8\x86\x7d\x33\xa6\x28\x71\x8b\x54\x2b\x70\x58\xae\x44\x4c\xc5\x01\xfb\xe5\x9c\x57\xc2\x6d\x44\x24\xb3\x35\x24\x8a\x81\x8d\x45\x0e\x54\xcd\x7f\xe5\xc3\x01\x9b\xe0\x70\xcc\x36\x60\xd7\x15\x5d\xa0\x82\x41\xf3\x8b\x9d\x6f\x13\xf2\x2a\x3f\x2b\xe1\xc9\xc1\xef\x71\xc4\x72\x13\x92\x3f\x1e\xc3\x28\x64\xe3\x20\x05\x3f\x11\x9e\xac\xd3\x84\x65\x2c\x00\x3f\x85\x2f\x9f\x8f\x50\xf9\x67\x67\x2c\xd2\x00\x89\x7b\xc0\x1f\x0e\xe3\x04\x43\xb7\xc8\xa8\xc0\x2a\x60\xb0\x6a\xcd\x9a\x1a\x4a\x54\x36\x9f\x8c\x36\xf8\x9c\xf4\x1f\xb0\x05\xed\x56\x0b\xbe\xd9\x54\x7a\x27\x73\x7f\xe0\xb9\x3a\x47\xcc\x1c\xfa\xec\xaa\xac\xe3\xa6\x0f\x6f\xbe\x9b\x74\xf6\x80\x88\x36\x6d\x6b\x46\x8e\x69\x50\x6d\xc8\x2c\x61\x60\x78\xf0\x6b\xfe\x31\x6c\xc3\xc2\xae\xb7\xaf\xff\x7f\xf6\xbe\xb5\xaf\x71\x1c\xd9\xfb\x3d\x9f\x42\x9d\xdd\x21\x76\x63\x42\x12\x68\xba\x27\x99\x74\x6f\x5f\x98\x5d\xf6\xe9\x69\x38\xc0\x5c\xfa\x30\x1c\xda\x89\x15\xe2\xc1\xb1\xb3\xb6\x03\xc9\x00\xdf\xfd\xf9\xa9\x74\xb1\x64\xcb\x8e\x73\xeb\xcb\x0e\xbd\xe7\x0c\xb1\x2d\x95\x4a\x52\xa9\x54\x92\x4a\xff\x22\xb2\xa2\x18\x1c\xc9\x27\xc9\xf0\x06\x26\xd8\xcc\xcd\x0c\xe5\x94\x99\x4c\x1a\xfd\x0f\xf4\xb2\x83\x86\x62\xaa\xdd\x16\xd3\x68\xd6\x5c\xe5\x16\xf4\xd6\x96\xe2\xd2\xdb\xd3\x18\xd4\x5a\x5b\x57\xce\xc8\xd8\xe3\xc6\x18\x31\xa1\x5d\x1f\x8c\x69\xf4\x4a\x9f\x13\xb5\x50\xef\x22\x65\x05\x50\x1a\xf7\xf7\xc8\x30\xfe\xe0\xa4\xa0\xb5\x45\x13\x43\x34\x71\x53\x53\x3d\x49\x7f\xf4\x24\x03\x4e\xaa\xe7\x1f\x5b\x5b\xa6\x5c\xa7\x2c\x89\x0d\x94\xf1\x60\xfd\x23\x47\x18\xe8\x3e\x86\xcc\x9b\x2b\x77\x3f\xa0\xf7\xb0\x13\x2d\x86\xb2\x45\xf9\x11\x58\xa8\xca\xc1\xa7\x4f\x15\xc2\x48\xe4\xa2\x27\x26\xe7\xfe\x79\xfd\x42\x85\x55\xbf\xb0\xc0\x9c\x87\x0f\x49\x84\x68\x5a\x07\x9d\xcc\x4a\x3b\x5a\x85\xcc\xaa\xc7\x57\xe5\x59\xbe\x4d\xe5\x5d\x15\xe3\x65\x78\xbe\x5d\x8c\xdd\xdb\xd5\x72\x9a\xec\x00\xce\x6e\x60\x76\x9e\x56\x9e\xdf\xa1\x92\x73\x55\x2c\xcf\xe6\x76\xb8\x08\xa3\xc3\x55\xf2\xa8\xee\x94\x6a\x99\xe5\x28\x1c\x19\xe5\x9c\xd9\x77\x49\xb2\xce\x2c\x6d\xe1\x92\x4a\x97\xb2\x70\x7d\xe2\x99\x75\xc9\x1e\x98\x1a\x4e\x8a\xba\xee\x38\xf9\xdc\x11\x26\xcc\x45\x1e\xd1\x19\xf4\x6e\xe7\x20\x25\x8f\x98\x02\xee\xe8\x11\x31\x25\xc8\xcc\xcc\x5c\x92\x85\xd4\x86\x73\x10\xe2\x7a\x5d\x4f\x89\xb9\x15\x9c\x6f\x19\x40\xec\x5f\xc1\x38\x8c\x0c\x93\xcc\xb8\x8d\x66\x3e\xcd\xd4\x59\xdd\x1c\x5d\xc2\x2d\xcf\x22\xd2\x73\x75\x4c\x19\x82\x0b\x74\x4f\xb2\xe2\x2b\x22\x5c\xba\x93\xca\x91\x9b\xab\xab\xd8\xc1\xa1\xae\xb7\xb4\x30\xae\xc9\x86\x54\xfa\xf2\x80\x0e\xa8\x57\x82\x06\xa6\xdb\x4c\xf2\x46\x34\x90\xcd\xc3\xe3\xcb\xdc\x45\x68\x53\xfb\x53\xaa\x50\x9f\x99\xa5\xd4\x12\x04\xed\x30\x9b\xbf\x11\xe5\x2f\xb5\xfd\xc6\xd9\x13\xde\x6d\x82\xc1\xd1\x12\x0c\x8e\x14\x06\xc5\x1e\xf7\xd2\x8d\x98\xda\x66\x5f\x6d\x3b\x72\x4f\xd5\x45\x9b\xd2\xe2\x6b\x91\x95\x36\xa1\x88\xb5\x4e\xcf\x29\xc1\xb1\xeb\xae\xb2\x5d\x81\x60\x3a\xa8\x72\x49\x7e\x20\xf2\xab\x5e\x81\xed\x63\x56\x19\x7a\xdb\xe8\x84\xa2\xdd\xfe\x1e\x3d\xfd\xdd\xd9\xda\x81\x80\xe3\x7e\x10\xe3\x16\x72\xaf\xfc\x20\xc4\x11\x8d\xad\x2d\x8e\x74\xa8\x38\xd1\x33\x20\x96\xf5\xbb\x1d\x8b\x0d\xa5\xff\x8c\x83\x18\xd3\xb7\xe7\xbf\xff\xfe\x7f\x7f\x7f\xba\xf5\xea\xfe\xfc\xf7\x0b\xc3\xac\xdd\x3d\x5c\xec\x5c\xc9\x40\x0c\x23\xdb\xe1\x38\xf7\x10\xd2\x89\xc2\x5c\x4a\xf8\x06\x14\x3d\x53\x84\xf5\x40\xaf\x20\x1e\x85\x1c\x1f\x48\x1c\x5c\xd0\x78\x16\xaf\xd0\x36\x4d\xdd\x4a\x20\x98\x93\xc4\x02\x94\x5c\x59\x32\x49\x98\x33\x40\x63\x0b\x19\x8b\x83\xdd\x6f\x71\x8e\x5a\xec\x47\xca\xa5\x90\xb5\x8f\x11\x29\x2e\x85\x51\x2d\xc4\x10\xcc\xdd\x10\xed\x67\xa1\xca\xef\xbf\xff\x7d\xb3\x62\xea\x9c\x08\x4f\xb0\xe1\xdb\x43\x1c\x65\x30\x2c\x4e\xf0\xd5\xc1\x64\x64\x54\xfe\xcf\x78\xd5\x02\xe8\x26\x92\x0a\xae\x8f\x31\xc2\x1c\xbc\xe9\x1e\xc0\x9b\x2a\x26\x91\x08\x57\x5f\x08\xf3\xbd\x92\x0a\xa2\x70\xbd\x44\xaa\xef\x1e\x2c\x25\xb8\x04\x2d\x27\x69\xcf\xf4\x71\xcc\xd0\x1e\x9d\x43\x9a\x73\x37\x6d\xdc\xa1\x0e\x72\xa5\x2e\x18\xda\x23\x95\x99\xbc\xe3\x52\x8d\x21\xc4\x6d\x50\x2e\xd4\x3a\x23\x94\xda\x92\x0d\x53\x86\x1a\x92\x4c\xfc\x2d\x1f\xae\x4c\xe5\xd8\x9b\xc5\x7c\xd1\x7d\xb8\xd5\xf3\x35\x5e\x8c\xaf\x95\x35\x56\x53\xc7\xd4\xcf\xcb\x30\x75\x78\x7a\xb4\x7a\x8e\x7e\x59\x86\xa3\x15\xf4\x9d\x96\xa9\x5f\xe7\x67\x2a\xf1\x72\x5e\x82\x99\x3d\x1d\x33\xd3\xf9\x99\x59\x9a\x11\x6d\xab\x08\x46\x88\xb2\xa5\x3f\x5e\xa2\xfd\x17\xe8\x15\x6a\x7c\x5f\xaf\xa3\x16\x6a\xd6\xeb\x75\xb3\x3c\x97\xff\x1b\xf8\xba\x85\x11\xe7\x72\xe7\xff\x8c\xff\x35\xef\x8d\xf3\xad\xed\x8b\xdf\x9d\xdf\x1d\xd3\x78\xd5\x6a\xbd\x32\xe0\xa7\xf9\x6a\x27\x9f\xf7\x7d\x1d\xef\xff\x4b\xaa\x7d\xde\xb8\x40\xaf\x10\xe1\x74\xdb\xf0\xcf\x9b\x50\x0f\x9f\x63\x8e\xd7\xeb\x15\x73\x0e\xe6\x25\x57\x98\xd5\xb7\xf4\x10\xb8\xad\x5f\x00\x52\x5c\x69\x96\x12\xa7\xa1\xd5\x73\xe4\xcc\x2f\x84\xc2\xc3\x68\x29\x6e\x76\xf3\xda\xa7\x6e\xa1\x85\xd8\xa2\xee\x50\xab\x6f\xa1\x7f\xcd\xcf\x0a\xf3\x99\x5a\x3d\x2f\x3f\xcd\xcf\x0b\xf3\xa8\x5a\x3d\x2f\xa7\x8b\xb4\x4b\xe2\x82\xb6\x7a\xe1\x79\xbf\x08\x43\x89\xd3\xdd\x52\x0c\x69\x75\xd3\x7b\x8e\x08\x42\x21\x17\x61\xe0\xc3\x61\xc9\x3c\xca\x54\xf5\xf1\x2a\x60\x52\xac\x00\xe6\xb1\x67\x52\x5c\xe4\x31\xa1\xb8\xee\x2d\xd8\x50\xba\x16\xfa\x9f\xf9\xbb\x4c\xe7\x45\xb8\x62\x8e\xe8\x1c\x68\x52\x28\xe8\x7a\x29\xd6\xd2\x37\x0a\x08\x47\x23\x65\x3d\x40\x56\x57\x4e\x72\x90\x6a\xa1\x91\x85\x9a\x5a\x4b\x3f\x51\x64\x39\x14\xd8\x06\xc8\x0c\x12\x8d\xe6\x6c\x12\xd4\x9f\xe4\xfe\x1e\x90\xaa\x72\xa9\x29\x0a\x3f\x4b\xb0\x51\x18\x27\x70\xc6\x81\x36\x40\x3b\x94\x09\x35\x54\x78\xbd\xde\x34\x1c\xd3\x42\x0e\x6d\x92\x5d\x6d\x25\xd2\xba\x27\xa7\x61\x94\x64\xc5\xf4\x54\xd5\xa1\xd2\xcb\x2d\x73\x8b\x18\x24\xf5\x8a\x96\xa2\x6a\x79\xe4\x31\x48\x37\xd4\x00\xd9\x38\xbf\xcb\xa4\x19\x28\xb7\xa2\x34\x45\x91\x18\x9d\xce\x6c\xae\x53\xa5\xa5\xf4\x54\xb4\xab\x32\x09\x9f\x9a\x42\x52\x2a\x87\xef\xe2\x1e\x61\xe2\xd7\xf1\x9c\x42\x72\xe5\x15\x90\x5e\x5e\x65\xf9\x2d\x29\x5c\x83\x04\x57\x60\x9c\x38\x86\xac\x5e\x4a\xf3\xdb\x4a\x59\x94\x8d\x8a\x1b\x8a\xd8\x49\xe0\x47\xf0\xb2\x93\x72\x85\x31\xcb\xc4\x3e\x57\x18\x76\x05\xc3\x67\x83\x71\x18\x09\x27\x16\xa7\x38\xd4\x79\x09\x1a\xd4\xb1\xc6\x91\xbb\x76\x8e\x1e\xc9\xa3\xb9\xd2\x3e\x21\x4b\x86\x55\xd0\x12\xbd\x43\x63\x6b\x96\x1e\x17\x5c\x72\x15\xb1\x95\xfb\xba\x48\x56\x92\xe5\xf2\xc2\x62\xaf\xf7\x87\xfa\x5c\x62\x9f\x3f\xb9\x38\xaa\x03\x13\x75\x27\x29\xa0\x24\x2f\xd7\x4b\x52\x63\xf4\xf6\xb4\xf4\xe8\x5a\x36\x19\x84\x7f\xf2\x21\x48\x6c\x90\x3f\x03\x1f\x1f\x51\x8f\x2c\x59\xb6\x8d\x3f\x19\xdc\x3b\xdd\x1e\x35\xfe\x44\x4f\xe9\xde\x5c\x65\xab\x22\x05\xa8\x21\x0c\xfd\x89\x76\xd0\x3e\x38\xcf\x58\x34\xc2\x51\x33\xfd\xfd\x3b\xb4\x9f\x7c\xd3\x71\xa8\x5c\xd1\x2a\xa8\xb6\xf0\xd4\x2b\x68\x3d\x71\x61\xab\x98\xce\x6c\x03\x44\xdc\xef\x2a\x45\xa8\x9c\x19\x22\xdf\x0c\x5b\xda\x12\xc9\x38\x52\x2e\x22\xeb\x37\x9c\xc8\x1c\x76\x48\xea\x0a\x5b\x71\xfb\x94\xb6\x46\x52\x37\xf1\xf2\x0c\x12\x7d\xe1\x05\x36\x89\x7a\xa1\x6e\x06\xb3\xa5\x2c\x93\xe4\x0e\xde\xac\xaa\xcf\xb6\x4f\x92\x7b\x75\xc5\xb4\xca\x58\x29\xfa\x8b\x78\x8a\xa1\x12\xdc\xf2\xc1\x2f\xbb\x20\x0b\x80\xfc\x5b\xd5\x56\x09\x6e\x0b\x8a\x59\x99\xb9\x12\x71\x11\x5c\xd2\x5a\x29\x16\xe5\xc2\x26\x2b\x61\xaf\xc8\xed\xb5\x4a\x93\x25\xe6\x5c\x2f\x6e\xb1\x68\x49\x2c\x67\xb0\xe4\x90\x5c\x65\xaf\xcc\x6f\xae\x68\x49\x29\x5e\xb1\x33\x0d\x16\xfd\xfd\x51\x9d\xcd\x92\xf4\xf7\x0c\xa9\x59\x81\xe5\xa2\xf5\xda\xff\x7c\x23\x60\x86\xb1\xa1\xb8\xda\xcf\xb4\x5e\x14\x54\x95\x79\x68\x16\xda\x30\xec\x6a\xad\x8a\x69\x57\xd9\xaa\xe7\x29\xfd\xd4\x96\x93\x9a\xed\x3b\xfd\x3c\xa1\x6e\x10\x29\x59\xb6\x9c\x99\x39\x84\x16\x57\x32\x4a\x7b\x67\x5b\x0e\xdf\x39\x03\x5a\x29\xb4\xa3\xef\xeb\x5f\x7f\xec\xa9\x3c\x1c\x32\x37\x0a\x4e\x25\x7f\x82\x85\x23\x4f\xcd\x03\xcb\x46\xdd\x12\xe4\x92\x51\x07\x55\xbe\xfb\xb8\xfd\xdd\x70\xfb\x3b\xe7\xec\xbb\x7f\xb5\xbe\xfb\xa9\xf5\xdd\x69\xed\xbb\xf7\xff\x5b\xc9\x86\xcb\x3d\x8c\x82\x0f\x76\xec\xde\x60\xe9\xe6\xa2\x04\xfc\x53\x8b\x83\xc3\xd3\x23\x16\x30\xcc\x14\x4e\x10\x22\x2f\xea\xc0\x15\x29\x25\xc4\xa5\xc8\x00\xc6\xef\xab\x74\x41\xf0\xb6\xd4\x8d\x0c\x1d\xda\x19\x1b\xd6\x12\x40\x9f\x21\x57\xdd\xa4\x31\xb7\x52\x48\x5b\x59\xd8\x48\xe8\x01\x9a\x4a\x34\x2c\x4b\xc5\x3a\x1a\x00\x24\x39\xe7\x1a\x30\xbf\xef\x1b\x5f\x13\x98\x9f\x17\x38\x76\x34\xb8\x74\xa3\x1f\x19\x27\xf9\x41\x51\x16\x0c\x44\xa3\x2d\x83\xb7\x99\xbe\xac\x5a\x11\x5a\xaf\x96\xde\xa2\x51\x78\x42\x6c\xf7\xf2\x91\xe0\x16\x8e\xb3\xc9\xc8\x2e\x51\x4b\x41\x63\xd1\xe8\x3f\xa3\x30\x18\x5d\xc6\x85\x91\xb9\xeb\xab\xa0\xbd\x44\x1d\x55\x42\x8b\xc6\x22\xea\x79\x76\x14\x81\x1f\x4b\xbe\xbe\x5b\x05\xed\x25\x2a\xaa\x12\x5a\x38\x24\xd2\x38\x76\xbd\xcb\xe3\x71\x88\x4f\xb0\xef\xe0\x30\x5f\x6c\x17\x0c\xdd\xca\xe0\x7b\x6d\xd7\xc7\xe1\xe5\x7b\x7b\x5a\x54\xc4\x82\xf1\x97\xf6\x2f\x2f\xa3\x81\x3d\xc2\x97\xef\x82\xfc\x61\xf7\x7c\x41\xc1\x7c\xce\x9a\xe8\x84\x8c\x9c\x9f\x63\xd7\x2b\x88\xf0\xb4\x60\xe8\xab\x17\xa4\x89\x86\x34\xc4\xe0\xe5\x7b\xbb\x8b\xf3\xc3\x3b\x3e\x5b\xb0\x17\xbe\x67\xb5\x78\x67\xc7\xf6\x8c\x4a\x2c\x1a\x7c\xac\xce\x8a\x78\x3b\xb0\xc3\x19\x0d\x25\xc5\xa8\xbc\x84\x98\x0c\xe0\xc4\x48\xe7\xe0\x9a\x1d\x81\x73\xde\xfd\x7d\xe2\xcf\x6b\xb0\xa8\x02\xe8\x0e\xee\x32\x1b\xfc\xf6\x54\xa3\x8d\x5c\xf4\x43\x06\x9e\xbd\x8d\xe0\xf2\xd0\x1d\x75\x2d\x0c\xc6\x21\x20\x70\x8b\x54\xe7\xee\x45\x3b\xa1\x73\x8d\xa7\xc8\xf5\x59\x32\x92\xc9\xed\xf3\xf5\x8f\x64\x47\x0c\xec\xe8\xe8\xd6\x3f\x0e\x83\x11\x0e\xe3\x29\x85\x70\xa7\x59\x2c\x42\xc1\x24\x19\x29\x93\xe7\xd7\x78\x7a\x81\x3a\x8c\x20\x3c\xb5\xd1\x03\xfc\x8f\x07\x95\x82\x74\xe0\xe0\x49\x9b\xa0\x17\x62\x3b\xc6\x6f\xc9\x68\x96\xdc\x42\x11\x98\x72\x49\x2c\x2b\xdc\x77\x7d\xcc\x38\x70\x71\xc4\xda\xc4\x42\x44\xdd\x45\x99\xa6\xa9\xd3\xa6\x81\x8f\xba\x66\x71\x70\xd4\x0b\xdd\x51\x1c\x84\x10\x44\x3c\x18\xd1\x66\x49\x5e\xd7\xb0\x3f\x1e\xe2\x10\x22\x6b\x74\x72\xde\x93\x3e\xb2\xbd\x08\x2b\xf9\x7a\x81\xdf\x77\xaf\xc6\x3c\x67\x1c\x8e\x71\x9b\xde\xf5\x03\x47\x4d\x7a\xdf\x4f\x24\x37\xe5\xac\xb7\xa1\x1b\x2b\xd9\x58\x3f\x28\x75\x9f\x8a\x9a\x4b\x39\xaf\xf1\x54\x7e\x36\xdb\x72\x83\x27\x2d\xfa\x36\xf0\xa3\x38\x1c\xf7\xe2\x20\x84\x86\x8b\x03\x42\x34\x82\xc8\x25\xb1\xdb\x3b\xe6\x4d\x49\xd8\x4d\x3e\x9b\xd9\xc6\x97\x08\x25\x52\x22\x93\x34\x69\x9d\x15\xba\x45\x54\x54\x16\xda\x9c\x75\x29\x05\x11\x18\xf4\x00\x31\x23\xa9\xd4\x10\x79\xb1\xd8\xdf\xa6\x85\x2e\x63\x3c\x1c\xc9\x26\x35\xfd\xf2\xd6\xf6\xbc\xb7\x03\xdc\xbb\x36\x38\xd4\x86\x25\x53\xe5\xb5\x7d\x22\x3e\xcb\x90\x1c\x72\x42\x10\xf1\x41\x18\xdc\x82\xff\xe9\xd9\x74\x84\x0f\xc2\x30\x08\x8d\xca\x5b\xdb\xf7\x83\x18\x91\x31\x81\x6c\x04\x85\x22\x3b\x42\xb6\x68\xf7\x0a\xed\x0e\x99\xb5\x51\x10\x45\x6e\xd7\xc3\x52\x01\x27\x50\x63\x23\xc2\x5e\x1f\xc0\xdc\x3d\xc1\x1a\x79\xa5\x96\x7e\x82\xfb\x38\xc4\x7e\x8f\xb3\x10\x0f\xdc\x08\x0d\xec\xc8\xaf\xc6\xa8\x8b\xb1\x8f\x00\x87\xc6\xf6\x5c\x62\x77\x6f\xa3\x68\x3c\xc2\x64\x3d\x2b\xa7\x20\x25\x60\x87\xb2\x96\x60\xb1\x7b\x68\x73\x53\x84\x67\x81\x67\x00\xe4\x08\x40\x0e\x2b\x44\xe0\x33\xdf\x92\x5a\xa2\x57\xf4\x75\x0b\x11\x8e\xdb\x6a\x8d\x5d\x7f\x80\x43\x37\x8e\x8c\x68\xdc\x7d\x4b\xbb\x0e\xd8\x82\xdf\xbc\xaa\x8c\x78\xf2\x01\x3d\x51\x8a\x20\xdc\xa5\x3e\x52\xa0\x91\x9c\xae\x39\x25\x69\xc9\x42\x23\xc4\x11\xc4\xb1\x07\x58\x1e\xec\xc6\x03\x1c\xa2\x2e\xa6\x11\x0d\x82\x50\xea\x2b\x0b\x91\xbe\xac\xa0\x2d\x94\xe1\x05\x9a\x8a\x73\x9f\x48\x7d\xa2\xb9\xa9\x1e\x33\x24\x06\x15\x76\xe5\x81\x72\x87\x7a\x49\xcf\xb7\x40\x27\x79\x63\xdc\x42\x49\xe3\x24\x6a\xa6\x45\x95\x8c\x85\xb8\x7a\x68\x81\x76\xb0\x90\xac\x69\xe8\x3b\x22\x66\x7c\xe4\x49\x8d\xcb\xf8\x8b\x70\x7c\xcc\x59\x38\xea\x8b\x1d\xc1\xd4\xfb\x9c\x0e\x4a\x78\xab\x5d\x5e\x42\x4d\x60\x7a\x4b\x92\x40\x7f\xef\x3c\x7d\xba\x81\x9e\xa2\x7f\xf4\x5d\x0f\x1f\xdd\xe0\xf0\xc6\x95\xa5\x15\xbd\x0b\xe2\x8d\x04\x57\x39\x09\xd8\x28\x52\xbc\x0b\xe2\x32\x81\x5a\x74\x76\x9b\x36\x52\x03\xd5\x01\x64\xf5\x08\xea\x81\xcc\xc7\x54\x5f\x28\x13\xcd\xe5\x5b\x6e\x7e\xd0\x25\x77\x22\xac\x32\x63\x16\x92\xd2\xa9\xd8\x44\x72\x32\x11\xe0\x21\xad\x7f\xc8\x20\xb5\x94\xa4\x1c\xc7\x84\xe3\x8d\xe7\x6b\x05\x9a\x57\x61\x47\xea\x86\xfb\x7b\xde\x95\x57\x6a\x57\x2a\x85\x99\x35\x7b\x34\xf2\xa6\x8c\x96\x30\x07\xcc\xe4\x92\x9c\x3c\x13\xa7\xaa\x7e\x4e\xeb\x74\x8d\xa7\x2d\x54\xbd\xc2\xf1\xdb\x00\xee\xb9\xdb\x31\xae\x5a\xec\x5a\x24\x08\xb0\x68\x12\x25\x8d\xa1\x5e\x17\x81\x25\x0a\xe9\x15\xc2\x4a\x0d\x1e\x64\xc8\x99\x09\xe9\x26\x3a\x73\x4f\xe4\xf7\xd3\xe4\xfd\x54\x49\xff\x7a\xe2\x46\x52\x1e\xf2\xa8\xe4\x53\xbf\xc3\xa3\x80\x77\x21\xfc\x4c\x4e\x59\x7c\x49\xc8\x5a\x13\x61\x3c\xf8\xf7\x29\xff\x3e\xd5\x7f\x0f\x71\x44\xd7\x30\xd2\x6d\xf0\x49\x8b\x91\x35\x26\xb0\xa5\x4c\x1f\x6a\x5d\xdb\x77\xf8\x5d\x8b\xf4\x2b\xc3\x44\x3b\xa8\x89\x5a\x0a\x02\x4f\x6f\xda\x62\xe5\x1b\x53\x20\x34\xcd\x12\x4a\xbf\x92\x08\xf1\x7b\xdb\x0a\xf6\xd4\xcc\xf1\xa5\x35\x66\xcf\x2b\x6f\x61\x80\xdd\xd8\x9e\xeb\x10\x31\x11\xdd\x7b\xe8\x9f\xd8\xfe\x15\xa6\x43\x8e\x36\x46\xad\x37\xb1\x58\x05\x4d\xa2\x06\x3f\x4b\x91\x53\x8b\x35\x85\xee\x12\x3b\x4d\x94\xc1\x44\xc8\xe0\xed\xc0\x05\x23\x0b\xc9\xf2\x1e\x82\x8a\x79\x17\xc4\x39\xb2\x2e\xbe\x1b\xc1\x88\x4e\x22\xdc\x28\x95\x84\xc4\x01\xd5\x76\x13\xb8\x0e\xaa\x2b\xbd\x31\xc7\x9e\x47\xcd\xae\xb9\xd1\x2f\xa4\x31\x0e\x3c\x4c\x46\x2f\x2b\x50\xa9\x2f\x2d\x68\x3e\xaa\x3d\x2f\xf0\xb1\x4a\x93\x57\x42\x83\x1e\xb0\xe0\xbe\x94\x61\xe6\xb3\x4b\x3f\x18\xda\x22\x97\xac\x1a\xe8\x34\x5e\xb7\xb2\xab\x68\xcd\x6c\x62\x89\xc5\x9a\x71\xf7\xc0\x5a\xc7\x52\xb0\x77\xc8\xa0\xa7\x3a\xa6\xa7\x28\x2e\x32\x86\xd9\x7b\x45\x71\xc1\x04\xf1\xc1\x1e\x62\x90\xb1\x1e\x11\xfc\x68\x3b\xe4\x7a\x77\xdb\x09\x62\xf2\xff\xd5\x04\x08\xc6\xcc\x62\x7a\x88\x33\xd2\x78\x86\xf8\x16\xca\xae\x56\x41\x37\x4b\x68\xe8\x66\x9e\x8a\x6e\xaa\x3a\x3a\x94\x3e\x84\x8a\xf2\x75\xa3\xdf\xca\x4c\xf9\x9a\x15\x3c\x77\xad\x71\xa3\x0f\xe3\xe1\x51\x78\x1a\xb3\xb3\xa5\x89\xd9\x56\xe8\x7f\x5c\x31\xfd\xa9\xa9\x22\xf9\x91\x1a\xdc\xdf\xa3\x27\x6e\xf4\x51\xa3\x77\x64\x24\xaf\x07\xb9\xe2\x3d\xa1\xcc\x78\x3b\xa7\xe6\x4c\xb5\x94\x24\xf9\x3c\x85\xd0\x36\xdf\xcd\xed\x49\x10\x79\xd1\x37\xbb\x35\x78\xd6\xca\xa8\x94\x48\xbc\x6b\x6f\x6c\xa8\x1a\xee\x98\x4d\xec\xca\x48\x99\xd9\xf6\xba\x3d\x26\xee\xee\x04\x16\x0d\x8e\xb0\x1f\x43\xdc\xc2\xd7\x71\x1c\xba\xdd\x71\x8c\x23\xda\x17\x49\xad\xcc\x85\x0b\xa2\xbd\xdc\x77\xbd\x18\x87\x07\x37\xd8\x8f\x0b\x0b\x91\xfa\xa1\x9d\x1a\x84\xcb\x28\x26\xd1\xe4\xf3\x6d\x25\xea\xf4\x94\x20\x75\x27\x6b\x98\x79\xb7\x64\x0d\xd3\xc8\x51\x4a\x55\x2b\xa1\x6b\xf2\xcb\xc2\xe4\x1f\xb4\x53\x32\x19\x52\x59\x12\x62\x21\x19\x35\xf3\xed\x05\x6a\xea\xc8\x4a\x21\xc6\xf5\x9b\xe9\xb1\x1d\x92\x16\x94\x04\x5c\xd1\xca\x93\x96\xd4\x67\xb5\xde\x04\x6d\xa3\x50\xd1\x59\xea\xf7\x69\xfa\x3b\x98\x54\x2d\x08\x0f\xac\xbc\x1f\x60\xf7\x6a\x10\xb3\x0f\x92\x8e\x66\x3f\x4d\x49\x1f\x5f\x98\x72\x30\x35\xd9\xb2\x6e\x6f\x3c\x94\x31\x00\xce\x2b\x62\xe9\x51\xb9\x30\xc5\xae\x47\xcd\x71\xa3\x91\x67\x4f\xd9\xf8\xac\xca\x94\xab\x49\x2a\xd2\x28\x64\x55\x9c\x19\x99\xf3\x8e\x14\x1a\xdc\xeb\xf8\xe4\xe0\xf4\xe0\xc3\xd9\xeb\xb3\xc3\xa3\x0f\x97\xaf\xcf\xce\x4e\x0e\xdf\xfc\x7c\x76\x70\x3a\x2b\xc8\x97\x9e\x24\xed\xda\x83\x5f\x0e\x3e\x9c\x65\x68\xc1\xf1\x67\x91\xe4\xea\x4f\x4d\x6a\x76\xcd\x67\x80\xcb\x1b\x6c\x75\xb0\x10\x11\x90\x5f\xe3\x8e\x06\xbf\x5b\x88\x02\x99\x65\xe1\x8c\x92\x2d\x42\xbe\x34\x1b\x1b\x08\xb9\xd1\x8f\x61\xe0\xc7\x0b\xd1\xe9\x06\x01\x20\x92\xdb\xde\xad\x3d\x8d\x4e\x07\xc1\xed\x52\x64\x26\x0b\xe5\x06\xc7\x50\x22\xcd\xc6\xf9\xe2\x82\xb1\x50\x3f\xc0\x31\x3a\x8d\xd5\x3f\xfd\x56\x59\xdf\x40\xe5\xe6\x84\xaf\xb9\x0e\x6c\x30\x1d\x3a\x5f\xa0\x02\xfc\x2e\xd4\xc2\x75\xa7\x15\x98\x7c\xeb\x15\x00\xa5\xf4\x05\xd8\x27\xaa\x6c\x21\xe6\x31\xb5\xb3\x2e\xcc\x8d\x07\x79\xfe\xa4\xdf\xb9\xd9\x7a\x27\x2b\x48\xba\xeb\x9a\x52\x77\xe2\xa5\xe8\xc1\xba\x22\x90\xf0\x14\xb6\x50\x03\x7e\xf4\x5d\xcf\x6b\xa1\xea\xdf\xfa\xfd\x3e\x2c\xbf\xa2\x38\x0c\xae\xc9\x6a\xef\x6f\xbd\x5e\xaf\xca\x53\x1c\x8d\xec\x9e\x1b\x4f\x5b\xa8\x91\xa4\xf9\x95\x1a\x1d\x8d\x8d\x07\x76\xb2\x61\x9a\x64\x8d\x41\xf9\x6e\x2f\x12\x86\x95\x06\x8a\x33\xd2\xfb\x8f\x29\x3f\x9a\xe6\xa3\x1f\xcd\xa3\x1f\xcd\xa3\x1f\xcd\xa3\x1f\xcd\x5f\xd3\x8f\x66\xdd\xae\x2e\xcf\xd7\xef\xea\xf2\x62\xed\xae\x2e\xdf\x2f\xe6\xe9\x02\x57\xc3\x9d\xb3\x00\xe0\xa5\xf2\x1d\x3d\x20\xd9\x61\x8c\x43\x3b\x0e\x42\xc3\x0e\x43\x7a\xf1\x9c\xf2\x64\x87\x21\xc4\xee\x68\xd3\x47\x5f\x78\x4a\xc0\xa3\x43\xa8\x52\x87\x0c\xea\x5b\x83\x3a\x68\xec\x53\xb7\x03\xa7\x8d\xe2\x70\x2a\xbb\x89\x5c\xba\xe0\x15\x13\x9e\x9f\x4e\x87\xdd\xc0\xab\xb9\xac\xcc\x0b\x83\x18\x08\x51\x1b\x3d\x31\xa0\x00\xe3\x12\xd6\xcd\x6e\xcd\xc7\x93\xd8\x30\xcd\x9a\x13\xf8\xd8\x6c\x27\xa5\x13\xee\x08\x67\x34\x3c\xc4\x65\x54\xa3\x88\x5c\x6d\x16\x2a\x61\x73\x93\x7e\xe5\xa0\x5c\x9d\x0e\xa9\x50\x37\xc4\xf6\x35\x75\xd3\xe8\xd9\x71\x6f\x80\x0c\x1c\x82\x37\x02\xd4\x82\x56\x0a\x2a\x80\xc3\x90\x24\xeb\xbb\xbe\xed\x79\xa4\x02\xb4\x1a\xb0\x27\x78\xe9\x03\x75\xf7\xbc\x42\xb7\x16\x2a\x17\xa6\xf2\x64\x98\x6a\x56\xd8\xbc\x77\x4c\x76\x58\x7e\x89\x15\x37\x11\xc2\x64\x5b\xe7\x35\x92\xf4\x01\xc9\x0f\xdd\x57\x73\x23\x8a\x12\x66\x87\xd4\x33\x82\x65\x62\x24\xc4\x49\x41\xaa\x69\x91\x2b\x02\xde\xa7\x32\x6a\x7b\x5d\x90\xca\x39\xde\x3f\xf4\xe1\x60\x08\xd9\x31\xb1\x90\x62\x08\xc1\x80\xe9\xc9\xe9\x38\xc4\xc8\x0f\xfc\x6d\x28\xb9\xeb\x25\x5e\x1d\xcc\x19\x43\x75\x25\x79\x74\x40\x7a\x74\x40\x5a\x99\x03\xd2\xa3\x5b\xdf\xa3\x0f\xd6\xa3\x0f\xd6\xa3\x0f\xd6\x57\xea\x83\xf5\xde\xf5\x71\xda\x09\x8b\x3a\xb1\x10\xbb\x9d\x7c\x95\xe7\xc0\xe4\xad\xce\xb7\x01\x02\x7a\xd3\x1c\x92\x63\xc3\xaa\x9d\x1a\x58\x09\x2b\xf5\x68\x58\x87\x37\x03\xe3\x33\xe3\xca\xa0\xb8\x31\x2c\x56\x19\xe5\xa8\xb0\x4a\x68\x54\x8b\xdd\x11\x66\xb8\x16\x10\x0a\xf0\x1f\xea\x5c\xf0\x20\x39\x81\x71\x8c\x68\xd7\xc7\xed\x0d\xee\xa3\x2d\xc4\x87\xc9\xc7\x57\xe8\xa1\x47\x38\x2b\xe3\xa2\x07\xb2\x5c\xd2\x47\x8f\xa4\x5d\xdc\x49\x8f\xe4\x9e\xcb\x4b\x0f\x8a\x5b\xd4\x4d\x8f\xd6\x3f\xed\xa7\x77\xe0\x3b\xc7\x81\xeb\xc7\x51\xbe\x9b\x9e\x48\x62\xb8\xd1\x6f\x16\x52\xbc\x18\xca\x78\xeb\x2d\xe0\x7d\x27\x7f\x27\xea\xe9\x4d\x20\xf9\xfc\xb1\x17\xb2\x0f\x07\xf9\xca\x5e\x67\xfd\x4d\xf8\x87\x69\xe6\xd0\x56\xfa\x08\xcf\xd9\xd3\x5b\x29\x05\x7d\x91\x78\x34\xc0\xe2\x4d\xf5\xe8\x20\xac\x50\xd4\x65\xb9\x31\x6a\xd3\xb6\x92\x22\xd2\x39\x0b\x2a\x29\x58\xb0\xa0\x0e\x4d\xaa\xb8\xf2\x45\x79\x9e\x7c\x6a\x19\x70\x60\xcd\x09\x18\x02\x01\x9a\x12\x96\x4a\x2b\xe5\xed\xa7\x5b\xcf\x97\xf4\xbc\x03\x3e\x2c\xca\x86\xa9\xc6\x9d\x63\xe3\x85\xb6\x42\x10\xba\xdc\x83\x03\x2c\x96\xaa\x87\xfb\x71\x15\xbd\x42\xe7\x77\x68\xd2\x42\x13\x4b\x9c\xc2\x83\xf3\x12\xbc\x43\x5b\xb4\x17\xe5\x6f\x17\xa8\xc5\xb3\xe8\x3e\xf3\xac\x4a\x96\xc2\x40\x5a\x6e\xf4\x5b\xba\x87\x2f\x35\x5d\x3c\x51\x9b\xff\x32\xd2\x39\x8c\xaa\x49\x44\x27\x5f\x66\x7b\x39\xfd\x2a\xaf\x9b\x2f\x79\x3f\xd3\x0c\xc6\xa5\xe8\xe9\xcb\xcf\xde\xd5\x97\xac\xaf\x2f\x0b\x3a\x7b\xa2\xef\xec\x38\x18\x25\x7d\xcd\xe9\x4c\x5b\x68\x2a\x7a\x4c\x79\xb9\xc5\x07\xa7\xd4\xdd\x39\x09\x74\xd9\xb5\x3d\x3e\xbf\xbb\xe7\x97\xf5\x97\x53\xfd\xb2\x9a\x65\xfc\xb2\x9a\x8a\x5f\x56\xc2\x5c\x49\x07\x3b\xcd\xbe\xe1\x4a\x1d\xec\xe6\xa0\xaf\x73\xb0\xdb\xdc\x9c\xdb\xc1\x0e\xf3\x89\x4d\xf2\xaf\xd3\x4c\x76\x6a\x59\x22\xd3\x5c\x5e\x76\x72\x51\xea\x46\xa7\x21\x3e\x59\xa8\xa9\x44\x56\x8d\x62\x1b\x2e\xb6\x27\x99\xcf\xeb\x4a\x50\x62\xec\x3b\xea\xe7\xc6\x85\xd2\xb1\xa3\x85\x9c\xed\x74\xbb\xdc\x6b\x71\xb6\xd3\x17\x34\x9f\xb3\x5d\xd2\x05\x93\x46\x8b\xb6\x98\x3c\x80\xa6\xe2\xa5\x34\x78\x26\xcd\x16\x69\x3a\x25\x1d\x7b\x35\xe5\x9d\xf7\x97\x74\xdd\x63\xcb\x06\xbd\xef\x9e\xb4\xd0\x63\x7e\x7b\xa3\xd2\x4e\x7b\xba\x53\x8d\xe5\x9d\xf6\x00\xa3\x64\xe8\xb2\x95\x54\x6d\xd2\x60\x2c\xd5\x26\xea\x38\x9a\x66\x92\x4e\x45\xd2\xa9\x9a\x94\xb9\xf2\x41\x72\xbb\x1b\x71\xca\x4d\xb4\xcd\x49\x37\x4c\x9d\x8b\x5f\x2a\xc3\x34\xc9\x30\x6d\x98\x0b\xb9\xfe\xbd\xa7\xcb\xab\x75\xf8\xfe\xbd\x67\xab\xc3\xc5\x9d\xff\xf4\x23\xb7\x84\xf3\x1f\xec\x09\x50\x7b\x7a\x19\x57\xb7\x0d\x26\x01\x4b\x38\xfe\x31\xc1\x58\x92\x02\x93\x97\x25\xa9\x70\x29\x5a\x98\x0c\x91\x23\x73\x49\x67\x46\xba\x7d\xb8\x9c\x27\x22\xa7\xf1\xe8\x46\xf8\xe8\x46\xf8\xe8\x46\xf8\x15\x78\xe1\x7d\xe3\x6e\x84\x4b\xf9\x11\x92\x15\xd9\x67\xf0\xe5\x63\x2e\x7c\x7e\xe0\xe3\xaf\xce\x85\x8f\x6f\x4f\xa6\x7c\xf8\x76\x1f\x7d\xf8\x1e\x7d\xf8\x1e\x7d\xf8\x1e\x7d\xf8\xfe\x9a\x3e\x7c\xeb\x76\xb0\xfb\x3c\x88\x58\x5f\x99\x0f\xdf\x82\x88\x58\xf4\x46\xf5\x09\xee\xc5\xb6\x7f\x55\x00\x9e\xf9\xe2\x11\x11\xeb\x11\x11\xeb\xd1\x21\xed\x11\x11\xeb\xd1\x1b\xeb\xd1\x1b\xeb\xaf\xee\x8d\xa5\x7a\xdc\xbc\x0e\xb1\xfd\x75\x7a\xdc\x10\xce\xca\x78\xdc\x90\x74\x65\x3d\x6e\x48\xda\xc5\x3d\x6e\x48\xee\xb9\x3c\x6e\xa0\xb8\x45\x3d\x6e\x68\xfd\xd3\x1e\x37\xc4\xd8\xc9\x77\xb6\x21\x5f\x8d\x81\x1d\xfd\xd6\xb0\x88\xf2\xf9\xad\x09\x7f\x3e\xd2\xa7\x8f\xcd\xf9\x3c\x6f\x7e\x21\xf4\x1b\x92\xef\x4d\x23\xfb\xb9\x29\x7d\x6e\x2a\xc7\x26\xe9\xdc\xd3\x46\xf6\xb3\x94\x7b\xda\xfc\xaa\x30\xb7\x26\x47\xdc\xbf\x62\x2e\x64\x2d\xa5\x08\x41\x62\x2e\x4c\x2d\x85\x0b\xea\x20\x21\x98\x08\xc9\xa3\xa1\x1c\x8f\x4f\x79\x92\x69\x6e\x92\x49\x43\x38\x50\x2a\x6d\xdc\xd4\xbe\x9e\xea\x53\x4f\x9b\x7a\x78\x29\x10\x36\x53\x39\x49\x15\xfc\x1a\x4c\x84\x4c\xb4\xc5\x1b\x34\x17\x7b\x89\x66\x83\xca\x9c\xd7\x2f\x32\xc7\xe0\xbc\xa8\xa6\x52\x54\x33\x5d\x54\xb3\x54\x51\xcd\xa4\xa8\x46\x6e\x51\x1f\x95\x5a\x41\xab\x70\xa0\xb4\xa4\x56\xd3\x19\x45\xd1\x6c\xb3\x6a\xf5\x51\xa9\x15\xb4\xb4\x52\x54\xb3\x54\x51\xcd\xa4\xa8\x9c\x5a\xad\xd3\x7f\x67\xd2\x98\x0f\x90\x6d\x99\xa2\x9a\x9f\xad\xa8\x69\x43\x60\xbe\xad\xbd\xa8\x66\x11\xbc\x5c\xde\xe1\x35\x34\x7b\xfe\x81\x35\xf0\x5f\x7c\x48\x0d\xc7\xd3\xb3\x0e\xa6\xe1\x48\x5a\x39\x8c\x5e\x02\xe9\xae\x60\x0a\x4b\x12\x14\x61\xdd\x85\xb8\xf7\x99\xc0\xee\x58\x49\xdf\x0c\xda\x1d\xe3\xb7\x1c\xdc\xdd\x62\x95\x2b\x89\x77\xa7\xdd\x9e\x59\x0c\xf6\xae\xd8\xd7\xdc\x0e\xb1\xbd\x4d\xaa\x52\x0a\xc8\x8e\x24\xfc\x9c\x9e\x79\x0d\xd9\x35\xaf\x91\x99\x7e\xc5\xa7\x66\x66\x0a\x16\x7e\x7b\x8d\xcc\x34\x2c\x3e\x35\xe7\x71\xd9\x93\xd8\x86\x49\x7b\xd5\x5e\x7b\x0d\xc5\xe8\x80\xc9\x7a\xd5\x45\x34\xd3\x45\x7c\x5c\x75\x2d\xa6\x99\x5a\x7c\x5c\x75\x2d\xa6\x99\x5a\xfc\x86\x3a\xac\x4b\x36\x37\x69\xc3\xa5\x79\xa0\x09\x3e\xf2\x04\x1f\x9b\xaa\x57\xa1\xc8\xfc\x84\x36\x3b\xfb\xf5\x51\xbc\x53\x2d\x8c\x59\xfe\x86\x4c\x31\x70\xa7\xc6\x59\x8b\x0a\x95\x17\x92\x79\x9e\xc2\xb8\x2b\xaa\xe4\x0e\x0d\xaf\x12\x89\xfd\x0b\xf9\xd0\x11\x65\x56\x06\xff\x0e\xba\x84\x39\xd2\x29\xfa\x53\x76\x78\x83\x9e\x28\xe5\x61\xa7\x3b\xd6\x58\xc0\xc3\x0e\x0a\x2c\xef\xa4\x46\x16\xb8\x6b\x72\x52\x7b\x4d\xdb\xf1\x4b\x20\xd4\x3d\x3a\xa9\x3d\x3a\xa9\x7d\x7e\x27\xb5\xc6\xb7\xeb\x26\x35\x69\x7e\xbb\xbc\x4f\xbf\xe1\x76\x9f\x7e\xb3\xed\xfe\xe8\x1e\xf8\x15\x78\xd7\x7d\xf3\xee\x81\x8f\x28\x83\xf3\xa1\x0c\x6a\x1d\x12\xeb\xb5\x67\x8a\xdb\x62\xca\x91\x71\xfd\x4e\x8a\xfc\x44\x27\xe5\xa4\xb8\xf7\x35\x39\x29\xae\xc5\x4b\xaf\xbe\x02\x2f\xbd\xfa\x72\x5e\x7a\x8d\x35\x7a\xe9\x35\x56\xe5\xa5\xd7\x58\x81\x97\x5e\x73\x8d\x5e\x7a\xcd\x55\x79\xe9\x35\x57\xe0\xa5\xb7\xbb\x7e\x2f\xbd\xbd\xb5\x3b\x9f\x3d\x9b\xd3\x83\xee\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xd1\x2d\xec\xbf\xd9\x2d\xec\x6d\x18\x44\x91\xec\x0d\x46\xc6\x2f\xbc\x2c\x73\xc2\xa1\x33\x0d\xd6\xe2\x00\x06\x1c\x15\x38\x7e\xc1\xf7\x19\x0e\x5f\x90\x66\x6e\x47\x2f\xc8\x55\xc6\xc1\x8b\x92\x9f\xd3\xb1\x8b\xd5\x2b\xed\xd0\x75\x6c\xc7\x83\x7c\x87\x2e\xf2\xd5\x98\x58\x68\x6a\x71\x38\x1a\xba\x93\x6a\xa1\x38\x18\x59\xc8\xc3\x7d\xe9\xb0\x85\x55\xb4\xfa\x53\x15\x6d\x01\x82\x4d\xd5\x22\xbf\xe2\x60\x44\x7e\xdf\x54\x13\x64\x93\x2d\x96\x88\xe4\x17\xe9\xa6\xe4\xd7\xa0\xca\x91\x6f\x56\x7e\x4c\xba\xb2\x88\x8c\x1c\x7d\x89\x7d\xcb\x07\x5f\x62\x09\x58\x93\x49\x29\x48\x93\x88\xcf\xa4\x25\xa5\x6f\xd0\x26\xe2\x23\x79\x2a\x3e\x65\xd5\x1d\xb2\xc2\x7c\x51\xda\xa7\x52\x39\x34\xec\x27\x87\x86\x5d\x2c\x10\x51\x20\x02\xd8\xea\x08\x4e\x57\x4d\x10\xfa\x60\xd5\x44\x69\xbf\xad\x9a\x6a\x1c\x8c\x56\x4d\x12\x86\x61\xd9\x43\xcf\x99\xc7\x99\x99\x95\x7d\x16\xa2\x6f\x04\x4a\x63\x4e\x68\x16\xdd\xba\x68\x11\x68\x16\x29\x0c\x69\xb9\x5d\xd8\x99\x07\xa0\x3d\xa2\x1a\x95\x73\xcf\x64\xc8\x39\x2d\x71\x10\x5d\x46\x19\xf2\xd6\x36\xf3\x0f\x20\x41\x11\x17\x1f\x3c\xd6\xe7\x3c\x78\x7c\xcb\x2a\xb0\xc4\x81\xa3\xbe\x77\x4a\x1e\x38\x16\x1e\x14\xea\xb7\x52\x94\x03\xba\xc2\x63\xc2\x12\xf9\x67\x1e\x12\x96\xa0\x31\xfb\x88\xb0\x04\x91\x38\x18\x2d\x49\x81\x48\xd1\x92\x24\x4a\x0d\x8b\x5c\x3a\x74\x73\x7b\xd6\x0e\xef\x84\x6f\xda\xb2\xbf\x50\xf1\x7a\x52\x81\xba\xd4\x2d\x75\xb9\x79\xeb\x2b\xdf\x8b\x15\xc6\x56\x6a\x0f\xf6\x59\xd1\x1e\x2c\x23\x93\xbf\xef\x4a\xec\x86\xae\x1d\xe1\x83\x49\x1c\xe2\xe1\x78\x98\xb7\x83\xb3\xb7\xcf\x94\x05\x49\xfc\xcf\x9c\x8d\x33\x63\xf7\xd9\x9e\x94\x8c\x22\xc1\x63\x9c\x47\xb3\xde\x64\xd5\x21\x46\xf4\x19\x59\xd4\x0d\x71\x3c\x08\x1c\xe4\x46\xc8\x73\xaf\x31\xfa\x74\x59\x1b\xda\x93\x4f\x08\x4f\x7a\x78\x14\xa3\x78\x60\xc7\xc8\x8d\x91\xdd\x23\x8f\x11\xfa\xe4\xb2\x02\x3e\xa1\xdb\x81\xdb\x1b\x20\x97\xd8\xdd\xc8\xf5\x6f\x82\x6b\xec\xc0\x0e\x09\xb6\x7b\x03\xc4\xf6\xf3\x91\xeb\xa3\x4f\x76\x18\xda\xd3\x4f\x28\x0e\xd0\x15\xf6\x21\x37\x8a\x07\x18\xf5\x42\x42\x8b\x58\x56\xdd\x29\x25\x46\x28\x91\x2f\x14\x47\xd0\x8d\x50\x68\xfb\xd7\xd8\xa9\xa1\xb3\x01\x46\xbc\x60\xf2\x9e\x17\x77\xeb\xc6\x03\x14\xf8\x58\x98\xa8\x2d\xc4\x30\x1d\x6b\x1b\x88\xae\x13\xe8\xa2\x1f\x7e\x0e\x31\x11\xe3\xa3\x3e\xba\xa4\x5f\x5c\xb2\x16\xdf\xab\xd5\x6b\x75\x78\xee\xd9\x31\xbe\x0a\xc2\x29\xf8\x86\xc2\x9b\x91\x1d\xda\x43\x74\x07\x70\x64\x0f\x08\xaa\x01\xac\xd0\x5f\x71\xc0\x79\x42\xc1\x0d\x0e\x6b\x72\x16\xee\xd5\xf8\x80\xce\x39\xdf\x9d\xcb\x9a\xeb\x60\x3f\x76\xe3\xe9\x45\xaa\x42\xac\x36\xb0\x92\xa4\xed\x46\x89\x51\xad\x1e\xa1\xbb\xa7\x0f\xe8\x84\xfd\x26\xed\x33\xb4\x27\x2e\x91\x1b\xa8\x2a\x4d\x8a\x27\xf6\x70\xe4\x61\x56\x6b\xc0\xca\x84\x49\x93\x0c\xaa\xf3\x3b\x54\xf5\xab\x2d\xd4\xa0\xb0\x7f\xf0\xbb\x49\xd1\xfe\x20\x35\xf4\xf8\x9b\xa9\xc1\x72\x58\xc2\xe4\x35\x02\x29\xd0\x40\x50\xf3\xdb\x80\xff\x85\x9e\xa2\x9d\x1d\xd4\x79\x29\x91\x62\x84\x76\x76\xa0\x62\x9f\x2e\x61\x96\xc0\x61\x3c\xfd\x94\xd4\x32\x1a\x04\x61\x3c\xb0\x7d\xa7\xa6\x2d\xb3\xea\x57\x73\x69\xef\x24\xab\x7c\x9a\x0b\x3a\xc0\x12\xb4\xa9\x7d\xc2\xf8\xa4\x1f\xc9\xc2\x18\x7e\xb0\xad\x39\x3a\x7b\xbe\x52\xc6\x1d\x27\x23\x8f\x1b\x83\xd3\x04\xd0\x39\x36\xf2\x68\xe6\x96\x14\x12\x63\xe3\x61\x63\x83\x8e\xf7\x1a\x1b\xee\xa8\x43\x79\x23\x96\x72\x4a\x5b\xec\x7f\x4d\x27\x36\xc2\xf1\xf6\xe0\x3f\x63\x3b\xff\x8e\xf7\xde\xf2\x98\x12\xac\x80\xd5\x00\x4a\x30\x62\x8b\x9e\xb8\x08\x3a\xc7\x9e\xed\xfa\xd4\x9e\xcc\xad\xfb\xee\xde\xa2\x17\xb7\x73\xca\x59\xea\x8c\x47\x4f\x72\xd1\x13\x99\xf5\xa3\x8a\x68\xcb\x58\xea\xf0\x67\x65\xa8\x22\xbb\x09\xa9\x0f\x6e\xbe\xec\xef\x2e\x78\x6e\x99\x26\xbf\x14\x2e\x85\x4a\x6a\xd1\x03\xa9\xb5\x9c\xcf\xee\xad\xe0\x7c\x76\x6f\xb9\xf3\xd9\x67\x6b\x3c\x9f\x7d\xb6\xaa\xf3\xd9\x67\x2b\x38\x9f\xdd\x67\xed\x14\x0d\x83\x20\x1e\x14\xa8\xac\xd5\x90\x5f\xa2\xb6\x69\x52\x8b\x62\x84\xac\xef\x3c\xfa\xf9\xaa\xce\xa3\x9f\xaf\xe0\x3c\xfa\xc5\xfa\xcf\xa3\xbf\x5f\x3f\x6a\x4c\x72\x17\xe6\x14\xf7\xe2\xa0\xa8\x0e\x8b\x7a\x4b\x34\x78\x09\x6f\xc7\xe1\x4d\x01\x10\xca\x82\x88\x31\x8d\xa6\xec\x21\x7e\x86\x27\xf9\xea\x72\xff\xc5\x82\x45\xec\xae\x1f\x5b\xa7\xb1\x97\x29\xe3\xbd\x1b\xe5\xd7\xe5\xf9\xa2\x08\x5a\xcf\xe4\x72\xde\x62\x2f\xbf\x2a\x8d\xfa\xa2\x5d\xf2\x19\xe2\x09\x36\xb8\x17\xfc\x71\xe0\xd9\x61\x71\x19\xbb\x8b\xf6\xc9\xfa\xd1\x88\x1a\x9f\x01\x8e\xa8\x59\x67\x65\xbc\x0f\xae\x66\x35\x54\x03\xd0\x88\x1e\x01\x89\x1e\x3d\x4f\x1e\x3d\x4f\x56\xed\x79\xd2\x7c\x74\x3d\x79\x74\x3d\x79\x74\x3d\xf9\xca\x5c\x4f\xa8\xed\x8e\x22\x30\x7f\x23\x14\xf4\x91\x8d\x46\x6e\x16\x9a\x48\x72\x4c\x39\x76\x4b\x45\x02\xd3\xad\x10\xca\xb8\xa5\x34\xe7\xf6\x4b\x39\x76\x8b\x02\x80\x1d\xbb\x49\xd8\x2f\xd0\x4e\x21\xee\x33\xff\x13\x78\x24\x65\x12\x15\x05\xbe\x22\x97\xa1\x88\xad\xa3\xf7\x5f\x39\x76\x45\x60\xb0\x24\xa0\xb0\x87\x7d\x79\x16\x67\x93\x1a\x78\x9e\x90\x7a\xd1\x78\x20\x24\x95\x69\xa1\x4b\x32\xab\xc3\x24\x08\xbf\x7e\x80\xdc\xf4\x01\xa6\x40\x76\x4c\x4a\xb2\x9e\x5f\xb2\x09\x3b\xb1\x0f\xe0\x0d\x3f\x3f\x55\x7c\x68\x42\x00\xb4\x11\x9e\x3d\x06\x54\x08\x5c\x21\x66\x39\xd7\x90\x06\x41\x1d\x52\xb3\x32\x1e\x36\xa4\x01\x4c\xb0\x32\x98\x93\x0d\xc9\x6e\xa1\x73\x42\xec\x82\xcc\xb0\x3d\x3b\x36\x08\xf7\xa6\x69\xb2\x66\xe5\x7f\x6b\x64\x1e\x21\xb2\x73\x87\xdc\xe8\xb5\xef\x0e\xe1\x44\xfb\x47\xd7\x77\xa3\x01\x76\xd8\x50\x42\x0f\x3c\x75\xcf\xee\x0d\xf0\x71\x88\x6f\x88\xfd\xa9\x88\x02\x93\xd6\xa4\xb5\x18\x79\x1c\x9f\x92\x12\x8c\x3b\x34\x0a\xf1\x0d\x5d\xd2\x45\x2d\x21\xdc\x0f\xfc\xe4\x99\x97\xe0\x3a\x65\x04\x59\x67\x07\x9f\x57\x5c\x10\xe4\xb1\xef\xfe\x67\x8c\x0f\x1d\x2a\xc9\xc9\xb9\xf9\xc8\xc5\xdb\x55\x51\xef\x81\xed\x3b\x1e\x16\x35\x3e\x80\xf8\x2e\x8a\x31\x95\x53\x0f\x71\xd6\xae\x6d\x2f\xa2\x55\xc4\xa9\xba\x54\x35\x3c\x1c\x91\xa2\xf3\x3b\x5e\x12\xf6\x1c\x97\x28\x18\x52\x8a\x43\x94\x58\x35\xfd\xea\x7a\xde\x09\xee\x61\xf7\x06\xec\x85\xbc\x00\x73\xb9\xe9\x0d\x1f\x4f\xe2\xe3\x2c\x76\xc8\x0c\x57\x24\x9b\xd7\xff\xd0\x49\x1c\x7c\xa4\x97\x4a\x84\x1d\xd6\xe1\x22\x1d\x7b\xa1\xba\x01\x09\x3e\x6a\x52\xeb\xbe\xee\xc5\xee\x0d\x86\xd9\x4b\xba\xf7\x9e\x49\x20\xbb\x94\x64\x85\xd5\x38\xbf\xd0\x01\x8a\x24\x05\xca\x95\x21\x45\x49\xcf\x33\x28\x73\xd1\x4f\x9c\x57\x90\xde\x17\xec\x0a\xc7\x67\x78\x12\xbf\xf6\x7b\x83\x20\xcf\x25\x4c\x49\x63\x4c\x2c\xd4\x9b\x24\xc5\x13\x8e\x27\xe8\xa5\xf2\x2e\xf1\x64\x83\xe8\x3b\x55\x4d\x25\x27\xe8\x87\x9c\x2c\xd8\x77\xaa\x79\x3e\x37\xd5\xa1\xeb\x38\x1e\xae\xe6\xba\xb6\xb9\x11\x6d\xf8\x43\xdf\xc1\x93\x9c\xea\x28\x69\x0c\x57\x15\x2f\x3b\xf9\xa4\x62\x1a\x48\x1f\x54\xf9\x48\x05\x3c\x4f\x92\xe9\x1c\x8a\xa4\xcf\x35\x97\xfc\xf7\xa8\x4f\x38\x20\x9d\xbb\xdd\xc8\xab\xb5\x0b\x56\x9a\xc2\x40\x4e\xf5\xd9\xfd\x7e\xcf\x1d\x15\x78\x25\xaa\x89\xe6\x04\x44\xe9\xc9\xb1\xca\x7a\x8a\xb7\x5f\x4f\x8e\x56\xd6\x53\x1c\xfe\x86\xf6\xe4\xc4\x76\xdc\x71\x24\xa5\x10\xef\x32\x41\xaf\x5e\xfb\x57\x9e\x12\xdc\x4c\xbc\x94\x93\x66\x47\x63\x92\x23\xf3\x4d\xab\x22\xde\x8d\x43\x16\x85\x4e\x64\xcc\x7c\xd3\x66\x3c\xb0\x23\xd7\xbf\xd2\x65\xa3\x5f\xb4\x99\xde\xe0\x2b\x57\x5b\x14\x7c\x98\xa5\xc3\x9a\xb2\x32\x98\x03\x5a\x23\x73\x8a\x91\x0f\xad\x51\x75\x70\x9f\xab\x69\xf2\x8f\x58\xd6\x65\xc0\x27\xe6\x28\x02\xa1\x6a\x4f\x15\x4e\xfa\xef\x0e\xb9\xdc\x4d\xcc\x75\x64\xc8\x8c\x95\x95\x5b\x8c\x9e\xa1\x3f\x1e\xa8\xd9\x96\x42\xe1\x4e\x79\x42\x08\x43\x67\xb7\xd2\x72\x61\xa5\x92\x71\x7d\xd3\xca\x8a\x6c\x3a\xa9\xc3\xa4\xae\x95\x15\xd2\x74\x52\x18\xf0\x39\x13\x5b\x56\xee\x5a\x28\x5f\xdc\xc8\xbf\xc0\x97\xcd\x0e\xd6\x15\x59\x7b\x24\x9d\xad\x1f\x06\xc3\x56\xa6\x5d\x20\x34\x1d\x8c\xd7\x96\x34\xa0\x53\x89\x1e\xd2\xb4\xe2\x40\x47\x29\x18\xc7\x38\xa4\x7a\x82\xc3\xa2\xd9\x13\xc9\x9d\xb1\x26\x25\xb0\x24\x3d\x73\x7f\x8f\xea\x66\xba\x08\x84\x5c\xdf\x4f\xc8\xd5\xb3\xdf\x13\xc6\xa5\x22\xf8\xcb\x74\x0d\x36\x0a\xea\x23\x2d\x48\x42\xdc\x6f\x9a\x99\xaa\x81\xf3\x4a\xc2\x3b\x19\xe8\x24\xa1\x52\x9f\x0c\x7b\x4a\x05\x44\x16\xe9\x9d\x2e\x0b\x67\x5f\xa4\xe7\x2f\xda\xa9\xc4\x2b\x50\x26\xf3\x9c\xa1\x68\xc1\xc4\xb2\x12\xd0\x9b\xb4\x90\x3a\xd1\xb0\xf7\xd3\x16\x52\x67\x19\xfa\x4f\x91\x98\xc2\xd6\x54\x84\xa1\xb0\x11\x13\x29\x96\x25\xba\x48\x7c\xf2\x64\xc6\x54\x1b\x5d\x96\xa1\x04\x9c\x4f\x87\xc1\xa3\x9b\xe8\xd9\x01\x88\x8f\x0f\x63\x3c\x2c\x9c\xed\x95\x94\x79\xd0\x7c\xc5\x68\x76\xba\xce\x2f\x03\xc0\xb7\x88\x4c\xad\x08\x80\xaf\xd0\x49\x23\x0f\x80\x8f\xba\x81\x69\x01\xf8\x56\x38\xeb\xce\x71\x14\x58\x1e\x74\x0f\x36\xbc\x5a\x08\x02\xc0\xdb\xa1\xec\x8f\x2d\x43\xef\x91\x45\xa7\x47\xe4\x81\x46\x7c\x4c\xb9\x5a\xe7\xca\x59\x39\x19\xcb\xca\x97\x85\x58\x54\xe2\x6f\x52\xcc\x24\xd3\x18\xda\x0c\x75\x68\x75\xda\xa5\x2a\xb3\x80\x00\xf2\x52\xb4\x12\xb8\x82\xc6\x03\xfa\xfa\xf0\xcc\xf0\x69\x76\x70\xe4\x95\x58\x64\xf3\x1d\x55\x17\xe2\xb8\xcd\xc2\x9f\xb4\x3d\xf7\xca\x27\xa5\xbf\xb1\x23\x4c\x44\xbe\x25\xd6\x91\xda\x8b\x41\xfa\xb1\x12\xe3\x89\x82\x50\x69\xa9\x3d\x36\x8f\xc6\xce\xdb\x0b\x91\x93\x64\x37\xaf\xe8\x2e\xe4\xc0\x15\x8b\xb3\x54\x14\xe7\xec\x6a\xa8\x68\x67\x22\x1d\xc8\x3e\x9d\x7b\x73\x13\x3d\x49\x36\xe3\x6a\x9a\x8d\xa5\x99\xd7\x65\x24\xb6\x81\x89\xdd\xdc\x45\x25\x97\x79\x96\xae\x06\xcf\x99\x04\x64\xfa\x4a\x27\x22\xef\xe4\x84\x8e\x1d\xdb\xff\x0f\x4f\xa5\x64\xec\x8d\x9c\x08\xda\x5d\x4d\xc5\x5f\xa9\x01\x94\x5d\xcc\x3d\xf6\x67\xef\xfe\xad\x26\x6e\xb2\x8c\x1b\xd9\x1b\x47\x71\x30\x04\x71\xf8\x2c\x6c\x50\xcd\x90\xc3\xc1\x7b\x76\xee\xf7\x79\xb8\x60\x91\xeb\x12\x4e\x68\x38\x7b\x61\xf7\x52\x81\xd9\xdc\xa4\x3f\x6a\xca\xd7\xfb\x7b\xd4\xac\x2b\xfd\x08\x89\x48\x36\x36\xa6\x6a\x43\x7b\x64\x24\x06\x3a\xf6\xe3\x70\x6a\x21\x37\x1d\xe8\x7f\xe8\x0a\xbb\x99\xa6\x91\x36\x22\xd0\x16\xa2\xaf\xb8\x9d\x07\xf0\xef\x6a\x74\x7e\x1e\x98\xbb\x54\x8b\xe9\x1c\x35\x38\x00\xe9\x88\xbc\x3b\x0b\xde\xda\x61\x8c\x23\xd7\xf6\x69\x43\xd1\xf2\x7b\x13\x8b\x71\xd2\x9b\xf2\x5f\xf2\xb2\x62\x4b\x69\x3a\x4b\x54\xca\x54\x79\xf5\x64\x29\x53\x15\x2a\x1b\x04\x8c\xb8\xaa\x5a\x55\xd8\xa0\x44\x3b\x5a\x19\xe1\x55\xf3\xc1\xd6\x57\x0b\xb9\xca\x95\x4e\xb1\xc5\xd8\x62\x7a\xae\xa6\x6e\x3c\xf2\xf6\xac\x25\x55\x9e\x98\x72\x99\x3c\x41\xba\x6e\x92\xe8\x96\xaf\x5a\x3a\xb0\x63\xba\xca\x94\x03\x92\x2a\xa7\xda\x62\xc4\xcc\xae\xfa\x08\xe2\xb7\xb7\xd0\xf9\x17\x93\x13\x49\x30\x92\x76\xbc\x90\xa6\x3b\xb5\x49\x43\x6c\x7b\xef\x84\xaa\x65\x2a\x36\x49\xb2\xb3\x83\xce\x8e\xde\x1d\xb5\x60\x77\xdf\x8e\xdd\xae\x87\x51\x1c\x20\x2f\xb8\xc5\x21\xba\xc1\x61\xe4\x06\x7e\x54\xd2\xa4\xc9\x73\x37\x36\x4c\x83\x95\x0b\xc8\xee\x0b\x11\xe0\x5a\x3f\x63\x0e\xc9\xb5\xab\x42\xaa\xaa\x64\x17\x95\x59\x7a\x94\x60\xbb\xa8\xd0\x64\x3e\x12\xa5\x6e\x2c\x69\xec\xe6\xed\x8c\xcd\xe7\x59\x59\x68\x89\x21\x74\xc7\xac\x1d\x6a\x33\x55\xd1\x16\x72\xd5\x9d\x91\x64\x26\x27\x9d\x46\x87\xb9\x6e\x89\x9a\xcc\xee\xc9\xf8\x55\xf6\x73\xb2\x79\x93\x7c\x96\xa4\xcf\x4a\xdc\xab\xd5\xba\x97\x9d\x57\x6e\xf9\x74\x05\x31\x1c\xde\x4c\x79\xef\x24\xa3\xca\x92\x7b\xcd\x94\xd6\xef\xc2\x08\x4a\xb0\x95\x3f\x8f\xf1\x3c\x77\x97\xdd\xcd\xb0\x7b\xa3\xaa\xdc\x7f\xf4\x55\x49\x5b\x97\xee\xf3\xcc\x5c\x36\x26\xc9\x1e\xf7\x25\x16\xdc\x97\x28\x53\xe6\xac\x5b\x3b\x85\xc5\x7e\xd1\x2d\x41\xdd\xfa\x8e\xb3\xfa\x99\xb7\x66\xca\x31\x2c\xf7\xce\x8c\xd1\x11\x9d\x82\xcf\x9c\xed\x79\xd3\x12\x83\x44\x4a\x5d\xb0\x3e\xdc\xd5\xad\x0f\xe9\xe9\xe1\x69\x16\xab\x5d\xfa\x90\x39\x56\x2a\x6f\x2f\x7f\xc5\x53\x52\x22\x3e\xca\xce\x6b\xae\xda\xa3\x95\xae\x4a\x89\xcb\x60\x33\xe4\x2c\x79\x28\xd8\x44\xdf\xf5\x62\x1c\x1e\xdc\x60\x3f\x8e\x8e\xfa\x6f\x07\xae\xc7\x3c\x41\x68\x7f\x71\xf8\x75\xd1\xb0\xe9\x6d\x70\x2a\x37\x94\x31\x3a\xa9\xca\xdc\x65\xa7\xc5\xdd\x5a\x46\xb5\xb2\xf7\x99\xb3\xef\x57\x8a\x64\xb4\xe8\xa1\x1f\xe5\x24\x67\x3e\x2b\x23\xd5\xbf\xba\xf1\x40\x6c\x18\x94\x11\x6c\x25\x43\xfa\x48\x9a\xb0\xbe\xa7\x13\x6a\xba\x7a\xdf\xcb\xdd\x57\x48\x3b\x78\xec\x71\x0f\x8f\x72\xe7\xc8\x7b\x25\xcf\x91\xd5\x93\xdd\xbd\x32\x27\xbb\x99\xa3\xe7\xbd\xc5\x8e\x9e\xf7\x4a\x1d\x3d\x4b\xe7\xc8\x7b\xea\x39\x72\xd2\x96\x92\x2b\x14\x6f\x4f\xba\xf5\x23\x7d\x58\xcf\xb9\xf3\x72\x07\xb3\xf2\x48\xe9\xce\x3a\xea\x2c\x79\xbe\x5a\xf2\xc4\xb6\xc4\xf9\x2f\x3b\x20\x45\x71\x0b\xd5\x55\x43\x18\x8e\x3b\xc9\xfb\x86\xfa\x9e\x8e\x26\x70\x0c\x43\x5b\x79\x07\xbc\x25\x8f\x6b\xa5\x95\xa9\xf8\xa9\x1e\x4c\xee\xaa\x8b\x10\x22\x08\x31\x3b\x27\xdc\xad\xc5\xed\x8d\xd4\xb7\x28\xc6\x23\xe6\x66\x77\x7e\xd1\x4e\x7d\xec\xbb\x61\x14\x27\xbb\x2c\xe0\x39\x4b\x7f\x4a\xa1\xd3\x90\xd8\x5a\x0a\xf9\xe6\x0a\xe4\x93\xf6\x56\x94\x52\xf9\x14\xd4\x0f\xc2\x03\xbb\x37\xd0\x4c\x43\xe0\x6a\x93\x52\x98\x5c\xa0\xe1\x66\x40\x22\xd7\x9b\x9b\xf2\xe3\x39\x64\xbd\x68\x67\x73\xda\x8e\xe3\xfa\x57\x9c\x3f\x48\x86\x5e\xa2\x3a\x7a\xc5\x16\xce\x4a\x82\x96\x14\xc2\x8a\x89\x0f\xf8\xde\xe3\x1b\xfd\xa1\x2f\x84\x52\x3a\x1c\x2d\xee\x52\xe8\x50\x00\x23\x3f\xc6\x21\x59\xf1\xc7\x58\x46\x32\x22\xe5\x8a\x4d\x29\xb4\x0d\xf5\x95\x1d\x68\x52\xdb\x56\x68\x1b\xa5\xb7\xb6\xcc\xf4\xb1\x30\xdd\x1f\x8a\x31\x74\xae\x62\x8c\x69\xb6\x4d\x58\xaf\x49\xe7\xa5\xa2\xa7\xb7\x94\x86\x2d\x3a\x3c\x95\xb2\xb0\xd6\x32\x62\x33\x95\x3f\x95\x5d\x5a\x69\x25\x4c\x50\x61\xad\x8d\xc6\xd1\xc0\xa0\x35\xc8\x54\x4e\x92\x43\x9a\x22\xe7\x74\x3c\x13\x7c\x2b\x69\x1b\xe9\x7c\x5d\x6d\x5c\xdd\x61\xbc\xe2\xe0\x94\x6e\xfa\x4c\x15\x60\x67\x5f\x74\x74\x20\x58\x5d\x87\xe4\xd4\x2d\x24\x49\xc5\x0c\x79\x70\xb0\x17\xdb\xc9\x00\x49\x71\x68\x64\xdb\x99\x3a\x40\x7f\x29\x29\x92\xd8\x5d\x4e\x8a\x2e\x67\x8b\xd1\x65\xb1\x1c\x6d\xe4\x96\xb6\x5a\x1b\x7a\xc5\x56\x74\xda\x1d\x0c\x71\x5b\x73\xaf\x96\xbb\x42\x61\x2d\x67\x4a\x99\xcc\xec\xf1\x62\x49\x93\xb2\x8c\x15\xa9\xf5\x65\x7c\x56\xda\x3c\x7c\x36\x9f\x79\xf8\x4c\x77\xaa\x96\x94\x3e\x9f\x41\x95\x7b\x0a\x97\x9d\x4d\xd9\xbd\x01\xb8\xe6\xf3\x44\x2e\xe5\xfe\x1e\x3d\x59\x04\xb3\xc4\xa0\xd3\x06\x23\x63\xf1\x72\x4c\xdd\x4e\x80\x14\xc3\x4a\x6f\xba\xa7\xcf\xff\x72\xf3\x69\xd6\xb2\x2b\x47\xac\xdc\xcf\xed\xfb\x81\xeb\x24\x3d\xb9\x5f\x23\x8f\x45\xa2\xb1\xaf\x13\x8d\x2c\x94\xe4\x7e\x82\x25\x99\x7f\xbe\xb9\x9f\x3d\xdf\x94\xbc\x6a\xf7\xf3\xbd\x6a\xf7\x53\x5e\xb5\x29\x5f\x30\x96\x26\xc7\x91\x29\xe5\x6b\xc6\x12\xe7\xf8\x47\xe5\x0b\xfd\xfe\xac\xa3\x64\x68\x58\x22\x89\x91\x24\x95\x29\xc9\x2d\x05\xde\xa8\x9f\xc2\x74\xe8\x8d\xbd\xb2\xf0\x9a\x73\x90\x2c\x0b\xb0\x59\x9e\xa4\xd4\x2f\x2b\xa7\x2d\x75\x63\x69\x18\xcb\x94\xd7\x00\x3f\xd6\x57\x75\x95\x26\x41\xea\x68\x75\xca\x2f\xca\x15\x05\x22\xd5\x63\x52\x18\xa9\xab\x30\x0a\x80\xe4\x37\xb5\x71\x2e\x35\xc3\xc3\xea\x5d\xa6\xaf\x52\xbe\xd2\xdc\x85\xba\x85\xaa\xe3\xd0\x33\xfe\x06\x18\xc1\xcc\x77\x7a\x0b\x55\xcd\x6a\x6a\xa5\x99\x51\xbd\x86\xb4\xb5\x93\xda\xdc\x27\xb3\x8a\x94\x21\xe5\x8c\x52\xa6\x6e\x5a\x1c\x88\x05\x82\x11\xd2\x9d\x28\xb8\xec\x25\x95\x6b\x3c\xc9\xea\xa6\xfb\x7b\x9d\x20\xcf\x38\x16\xcc\x85\x92\x58\x80\x55\x3e\x37\x30\x6e\x35\x86\x8d\x0a\x60\x7a\xec\xe2\x62\xf8\xd2\xbd\x39\xe1\x4b\x8f\x61\xf0\x2c\x01\x5e\x9a\xb3\x7d\x59\x02\xbd\x74\x6e\x9a\xb4\x75\x0f\x7e\x39\xf8\x70\xa6\x85\x42\x2d\x05\xbe\xa9\x47\x2f\x4a\x22\x4b\x6d\x28\xbb\x5f\x0b\x51\x92\xe0\x40\x0b\xd1\x59\x73\x09\x94\x8a\x31\x35\xab\xf8\xc5\xdb\x80\x86\xc8\xea\x15\x22\xc3\x7e\xdd\xbc\xcb\xeb\xbf\xa5\x3a\x30\x59\x13\x2e\x45\x46\x5e\x38\x2e\x49\x4a\x71\x3d\xff\x56\xfb\x47\xf1\xb4\xff\x56\x2b\xd1\x0b\xc2\xff\x82\xae\x60\x3e\x25\x5f\xa0\x02\xb3\x43\xf9\xad\xa3\xee\x64\xf1\x77\x61\xd6\xdc\xe8\x84\xc2\xf2\xc0\xee\x38\x31\x2f\xff\x7a\x8d\x40\x6a\xce\xdd\x85\xfe\x82\x55\x27\x92\xbf\x50\xb5\x01\x16\xf7\xa8\x5f\x1a\xd9\x30\x13\x43\x18\x8a\x1f\xba\xfe\x2a\xe6\x03\x0f\x5f\x61\xdf\x39\x9b\x16\x87\xb3\x2c\xee\xc2\xf9\x4f\xa7\xbb\x60\x8a\xbd\x3f\xf8\xe7\xc1\x87\x77\x97\x67\x1f\x8f\xa9\x19\x46\xeb\xc5\x6f\xd2\x2d\x55\xb1\x0d\xb1\x93\xf2\x05\xbb\x68\xe0\x3a\x8b\xb5\x2a\x0f\xce\x2c\x7c\xd1\xbe\xc0\xf0\x62\xe1\xaa\x17\x1d\x23\x0b\x65\x64\xe8\xdc\x0b\xe5\x25\x6d\x46\x25\x08\x5a\xed\x4b\x28\x24\x29\xfe\xba\xec\xfb\xbc\x84\x20\xd3\xd8\xe5\xdf\x60\x1f\x48\xbe\x1d\x7f\x2d\xd9\x95\xab\x7f\x48\x3d\xae\xbf\x25\xd3\x6e\x09\xc5\x47\x4b\x35\x59\x98\xed\xcc\x66\xc9\x52\x8a\x30\x7d\xa7\x7c\xa9\x29\x2f\xe3\x81\xb1\x2a\x7a\x07\xcc\x2d\x63\xe1\x79\xf4\xbc\x8a\xed\x08\x57\x2d\x04\x7f\xb7\x5d\x5f\xfc\x0c\xc6\xb1\xf4\x9a\x3f\x46\x23\x62\x02\x91\x5f\xec\xe2\xe5\xec\xf8\xce\xe2\xe2\xc4\xdf\xfa\xfd\xbe\x88\xca\x4c\x9e\x5f\xd4\xc9\xff\xaa\x69\xa3\xa0\x1a\xe2\x5e\x0c\x6f\x59\xf8\x01\xbb\x1b\xf5\xdc\x28\xb2\x51\xd0\x47\xa3\x00\x4e\x32\x7b\x93\x16\xaa\x3e\xab\x7f\x27\x27\x0b\x42\xc7\xf5\x21\x78\x43\x92\x6c\x9a\x4d\x06\x4b\x6d\x7a\xd8\x4e\x52\x52\x57\x0e\x3a\x75\xa7\x16\xe2\x75\x29\x97\xe3\x12\xae\xdc\xc0\x27\x79\x9c\xd0\xbe\x75\xfd\x2b\x3e\xe1\x2b\xcb\xee\xdd\x7d\x39\x1b\x2c\x7e\x51\x48\xcf\x22\x82\xbe\x94\x23\x7b\x3d\x9f\x57\x83\x2c\x35\xb5\x59\x94\x45\x68\xf5\x05\xab\x96\xba\x54\xaf\xa7\x66\x71\xc0\x5e\x13\x96\x81\x88\xa6\x9d\xd8\x72\x90\x41\x33\x76\x4a\xec\xd9\xeb\x2d\x2d\x9f\x6d\xda\x9f\x46\x6c\xc7\xde\xd4\x8d\xa7\xbd\x7a\x3d\x67\x64\x34\x9e\xa5\x3e\x71\x21\x67\xa2\x2a\xaf\x7e\xaa\xe4\x57\x15\xa2\xc4\xf0\x0d\x41\x3b\x8c\xf0\x3b\xf9\xc8\x5e\xf5\x02\xda\xa3\x67\x06\xd4\xc3\x47\x06\x60\x21\xdf\x34\xf0\x2b\x29\x44\x81\x3d\xe9\xac\x9b\x93\x71\xaf\xfc\xc5\xfd\x14\x06\xd0\x5a\x43\x3b\x1e\x9c\x12\x3a\xcc\xe1\x3e\xcf\x37\x21\xe3\x8f\x40\x61\x22\x5c\xdf\x80\x1f\x76\x37\xca\xc9\x6c\x11\xb9\x54\x36\x66\x81\xed\xa7\x12\xb5\xb6\xdc\x8c\x57\x38\x3e\xc1\xb6\x77\xec\xe2\x0c\xd4\x98\x1b\xe3\x61\xd2\x88\x97\xe4\xf1\xef\x23\x36\xde\xc9\x83\x7a\x00\xe9\xd0\xec\x52\x32\xb8\xa6\xc8\x3f\xf7\x06\xae\xe7\x84\x00\x16\x27\x27\xe1\xaf\x45\x23\x8f\xa4\x6b\x74\x9f\xe5\x6e\x5e\x52\x13\xd1\xf0\x3d\xec\x79\xcb\x94\x3b\x60\x0e\xb2\xbe\xf3\xda\xf3\xde\x4c\x89\xb2\x63\x27\x70\xac\xb6\x85\x3b\xcc\x1a\x98\x66\x1d\x76\x20\xb4\x98\xdb\x47\x70\xf5\x06\x6d\x6e\x42\x07\xf0\x90\x29\xec\xb8\x8c\x49\x00\x7c\xd1\xfb\x3b\xab\x8e\x66\xfc\x58\x2a\xeb\x5d\x3c\xb2\xa7\x5e\x60\x3b\xec\x8a\x18\x3f\x76\xb3\xb2\xdd\x25\x5c\x5f\x68\x23\x6e\x6e\xd2\x1f\xcc\x2f\x2d\xfd\xac\xdc\x10\x7d\x48\x00\xd9\x48\xbd\x54\x02\xfa\x9a\xd1\x4f\x6a\xd5\xc8\xbb\x82\x2a\xe9\x99\x26\x99\xf2\x98\x61\x24\xce\x2f\xda\x19\xfd\xf3\x36\xe0\x73\xd1\x51\x9f\x62\x43\xaa\xc3\xc7\x62\xd6\x7a\x32\x8c\x68\x90\x47\xfa\x56\x0e\xf2\xc8\x02\x3c\xb2\x0f\x72\x80\x47\x1e\x58\x92\x7d\x52\x02\x4b\x8a\xa0\x92\xec\x23\x7d\x16\x83\x69\x68\x4f\x8e\x5d\x2c\x0e\xc8\x17\xbd\x89\xd7\xe3\xe3\xe8\x27\x01\x45\x93\xc4\x57\xe4\xf1\xee\x92\xd1\x33\x41\x1d\x1e\xc3\x73\x41\x5d\xd9\x15\x03\x17\x87\x3d\xec\xd3\xcb\x4a\xe9\xe1\x0a\xd7\xff\x18\x0b\xb4\x8d\x76\x50\x33\xe1\x62\x8a\x3a\x2c\xc8\xe8\x7a\x99\x98\x26\x01\xff\x58\x6f\xc8\x6c\xa8\xee\x0c\x6b\xe5\x44\xf6\x91\x50\x7a\xde\x42\x75\xc1\x8f\xea\x31\xb1\x56\x7e\xd2\x20\x46\x12\x3f\x8a\x5c\x3e\x45\xf5\xda\x0b\xc1\xa0\x8c\xaa\x26\x11\x53\x40\x90\x60\x0a\x8c\xfe\x13\xc6\x54\x02\xd1\x53\xd6\xff\x22\x92\xec\x53\x2e\x93\xf4\x02\x73\x32\x86\xef\x38\xf2\x0e\x47\xda\xc9\xc7\xcb\xc9\xc7\xdc\x91\xf7\x91\x12\xbe\x1e\xd2\xd3\x2a\x1c\x72\x46\xd8\xc9\xcc\xab\xc4\xbc\x78\x96\x68\x04\x52\x4b\x66\x74\x3c\xab\x81\xd2\x60\x83\x9b\x8e\x69\xf1\x89\x3e\x8a\x8f\xfe\x61\x8c\x87\x3f\x05\xe3\x08\xbf\xc7\xf6\x0d\x4e\x92\xa5\x3e\x68\x32\x1c\xf8\xc4\xf0\xd4\x64\x80\x0f\xc9\x54\x2c\x6c\x82\x63\x17\xa7\x0c\x05\x6a\x1c\xb4\x99\xaa\x7e\xc2\x93\xde\xdf\x23\xfe\x5b\xaf\xb0\xa9\x87\xf5\xc3\x46\xd6\xa8\x68\x6a\xad\x0a\xf9\x24\x43\x35\x1d\x9a\x35\xf9\x1b\x4f\xaf\x9a\x7a\x72\xea\x62\x8b\x4f\x4e\x99\x76\x75\x4d\xb9\x4e\x2b\x69\x75\x7e\x9b\x12\x5e\x83\x9c\x34\x05\xda\xc0\x4c\xdb\x74\x2a\xf6\xda\x12\xfe\x28\x09\xac\x83\x9c\x4c\xc1\x76\xa0\x17\xfb\x7d\xc5\x54\x24\x16\xa2\x3c\x7e\xd8\xe7\x44\x3f\x8a\x99\x8b\xf5\xaf\x6e\x3e\x53\xe7\x30\x9e\x95\x42\xfe\xaa\xdd\xac\xb5\x59\x05\xd9\xc4\x4c\x37\xee\xf2\x70\xa7\x34\x38\x53\x6c\x12\x06\x07\xf3\x6e\xf4\x2e\x63\x0e\x93\x3a\x26\x05\x8a\xb4\x71\x10\xdb\xde\xb1\x2d\xf7\x99\xa1\xe6\x7f\xd9\x21\x56\x32\x7a\x05\x55\x69\xc1\x7f\xb7\x51\xc3\x44\x4f\x95\xbe\xe6\xf4\x42\x6c\x7b\x67\x84\x26\xa7\xa6\x12\xdb\x86\xfc\x4f\x93\x1e\xd8\xce\x70\x20\x53\xd2\x5c\x31\xdf\xf8\xaa\xee\x8b\xcf\x9c\x14\x34\x51\x25\xb8\x81\x7a\x6b\x87\x6c\x69\xc3\xb0\xc1\xab\x3f\x47\x18\x55\x18\x93\x15\x14\x07\x28\x1a\xe1\x9e\xdb\x9f\x4a\xd1\x22\xc9\x2a\xde\xc5\xd6\xef\x3e\x77\xed\xc1\xf4\xb6\x21\xaa\x70\xde\x2a\xe8\xd6\xf5\x3c\xd4\xc5\xc8\xc1\xa3\x10\xf7\xec\x18\x3b\xc8\xf5\x51\xa3\xd6\xa8\xd5\xab\xcc\x62\xcb\xbd\xe1\xbe\xea\xbb\xed\xff\x1d\x0d\x24\xdf\xc6\x17\xfa\x38\x82\x90\xa6\x7c\x68\x87\xd8\x19\xf7\xb0\x64\x5a\x87\x38\x1a\x7b\x31\xbf\x4a\x27\x01\x8b\xdf\xd8\x5e\x29\x73\x62\x25\x97\xd2\xb9\x3d\x23\x26\x15\xca\x16\xda\xe2\x11\x42\x56\xe2\x7e\x78\x63\x7b\x26\x7a\x05\x35\x6b\xb1\x02\x1f\x64\x4b\x2a\xf1\xa6\xa5\x73\x9a\x74\x3d\xe7\x26\x70\x1d\x76\x81\x86\x42\xde\x0f\xd1\x4b\x54\xe7\xed\x95\x64\xe4\xed\x3c\xeb\x2a\xea\x17\x6c\x61\x5a\xb8\x4f\x5d\xb2\xd6\x59\x3a\x9f\xf7\x90\xab\x94\x3c\xa2\x16\x26\x51\xe1\xeb\xeb\x5b\xb4\x43\x04\x5f\x2e\x36\xc6\xc3\xd1\xa9\x6c\x4a\x48\x5d\x8a\xb8\x67\xbb\x02\x57\x9d\xce\xa0\xde\x59\x5a\x78\x11\xa2\xdb\x35\x92\xa6\x3c\xcd\x8c\x85\x74\x17\x7b\x32\xec\xc9\xf7\x73\x58\x9e\x8d\x54\xfd\x0f\x12\xf3\x28\x95\x7d\x8d\xb5\x31\xc4\x2c\xba\x25\xfa\xfe\x69\x6a\x06\x56\x04\x44\x06\x34\xca\xb0\x29\x57\x43\x01\x33\x62\x39\x1d\x2f\x59\x1c\x1b\x89\x45\x24\x2f\xa5\xd0\x96\x64\x2a\xc9\x6b\x9a\x0c\xbd\x38\x08\xbc\xd8\x1d\x1d\xd3\x9d\x12\x1a\xbc\xd7\x07\x97\x3f\xf2\x5f\x8b\xbb\xf8\xdf\xd8\x9e\x95\xda\x4e\xa1\x01\x7d\x33\x84\x82\xc8\x65\xd7\x69\xd7\x01\xa1\x23\xd5\x0a\xd6\x43\xd2\xe3\xd4\x52\x1a\x47\x01\x58\xe2\x36\x31\xd5\x74\xba\x9d\x22\xda\x6b\x2d\xfe\xc3\x4a\x79\x23\x29\x56\xbb\xd2\x40\x6a\x03\xb6\x52\xcf\x09\x17\x2d\xf1\x4b\xe5\xb3\x95\xe2\x3a\xd5\x8e\xad\xf4\x8b\x64\x17\x8b\x6f\x59\x89\x36\xb0\x14\xd8\x2c\xe8\xb7\xcf\x85\xb8\x92\xb8\x05\xcb\x86\xb2\x2a\xda\x49\x1a\x09\xdb\x57\x92\x75\x2b\x67\xdf\x4e\x7e\x2f\x9f\x25\x7c\x16\xe5\xc4\x9b\x3b\xe3\x05\x4f\x64\x29\x6f\xd3\x4d\xd9\xb7\xcb\xf6\x4f\x94\x8a\x73\x41\x2b\x18\xf8\xc9\xf2\xb7\x95\x59\x29\x2b\x69\x60\xc5\xdb\xca\x2c\x8e\x37\x28\x2f\x3c\xa4\x44\x73\x55\x51\xe9\x59\x08\x95\x54\x94\xe9\xe7\x8f\x51\xa6\xbf\x9a\x28\xd3\x6b\x0b\xae\xac\x2d\x63\x35\xe1\xa5\x97\x0d\xae\xdc\x5c\x4f\xb0\xe1\xe6\x0a\x82\x0d\x37\x97\x0b\x36\xbc\xbb\xc6\x60\xc3\xbb\xab\x0a\x36\xbc\xbb\x82\x60\xc3\x7b\xeb\x0d\x36\x9c\x26\xbf\x82\xf0\xd1\xcb\x05\x1b\x7e\xb6\xc6\x60\xc3\xcf\x56\x15\x6c\xf8\xd9\x0a\x82\x0d\xef\xaf\x3d\x10\xe9\xf3\xf5\x87\x33\x7e\xb1\xfe\xa8\xb0\xdf\x7f\x86\xa0\xb0\xf5\xf5\x47\x6c\x4d\x80\xd2\x8f\x03\x6f\x7a\x55\x30\x0f\x35\x9b\x8b\x56\xa3\xc9\x8b\x78\x17\x14\x44\x19\x5e\x34\xe8\xf3\xee\x67\x08\x5d\xbd\x48\xc4\xe4\xc7\xc8\xb6\x8f\x91\x6d\x1f\x23\xdb\x3e\x46\xb6\x7d\x8c\x6c\xfb\x18\xd9\xf6\xbf\x3e\xb2\xad\xed\xd8\xa1\x2e\x8e\x2d\x19\xc8\xf0\xb1\xcc\xa6\xa2\xce\x30\x5c\x4f\x14\x5b\x60\xa9\x20\x8e\x2d\x7c\x5f\x61\x24\x5b\xa0\xf7\x5f\x1a\xcb\x16\xea\x56\x26\x9a\x2d\x6d\x84\x2f\x1d\xcf\x96\xc2\xc4\xcf\x08\x67\x7b\xcc\xb0\xe4\x69\xe2\x6c\x30\xdb\x85\x83\xcc\xe6\x07\x97\x9d\x59\x08\xec\xc6\x2e\x55\x0c\x6b\x23\x7d\x39\x8a\xa3\x8e\x74\x38\xa8\x9e\x0a\xca\xbb\x98\x44\x48\xe4\x18\x72\xbe\xe2\xd2\x23\x1d\x5c\xc9\x5f\xe4\x33\x2c\xf9\xbd\x71\x29\x63\x41\xe0\x74\xcc\x55\x0d\xaf\xdc\x0b\x69\x16\xaf\xc2\x5b\x29\xcb\x2b\x7c\xd2\xf2\x0a\x5f\x34\xbc\xc2\xfb\x12\xbc\xae\x20\x2c\x30\xd3\x51\xdf\x6c\x60\x60\x36\x76\x44\x32\xfa\x9c\x17\x16\x78\xf1\x28\xbd\x6c\x40\xcf\x0c\xd2\x4b\xe1\x47\xde\x05\xf1\x4c\x30\x75\x96\x26\x0f\x49\x1d\x56\x17\x34\x89\xfe\xa0\x76\x8e\x1d\xca\x52\x30\xeb\x49\x61\xf3\x51\x5e\x15\xd2\x7a\xe1\x4e\xb2\x1e\xf2\x3c\x61\xb9\x08\x6c\x7d\x05\x55\x2c\x0b\x3a\xae\xee\x41\xcc\x11\x0d\x4e\x0b\x71\x1d\x92\xb1\xb9\xed\x04\xb1\x14\xf8\x2d\x8b\x9f\xce\x2a\x35\x03\x90\xed\x5d\x10\x17\xe3\xf2\x91\x04\x99\x69\xab\x38\x90\x95\x13\xc4\x2a\x40\xb9\x13\xc4\x4a\x82\xae\x1d\x95\x8f\x44\xa4\xdb\x4d\x5b\x45\x54\xa6\x77\x41\xfc\x39\x78\x70\x82\xd8\x4c\xb7\x0e\x78\xc3\x40\x93\x96\x8c\x63\xe4\x24\xbc\x6a\xb1\xd0\x69\x8f\x3a\x41\x4c\xa1\xc5\x65\x45\x18\xb6\xd0\xae\x78\x7c\xb0\x92\xb6\xb7\x52\xed\xa0\xc2\x77\xf6\x26\x3c\x3e\x4e\x0a\xca\x8e\xbf\x4e\xc1\xd8\x69\x22\xe2\x78\xba\x4b\x14\x29\xc8\x4c\x6e\x07\xca\x91\x40\xb8\x02\x74\x82\xd8\x12\x35\x5f\x28\x1e\xc7\xec\x31\x5b\x1a\x0c\x6b\x05\x01\x39\xc4\xb0\x55\x03\x72\x90\x17\xec\x61\x16\x7a\x22\xdb\x24\x2d\x19\x70\x20\x93\x5a\x3f\x8c\x85\x3b\x72\x0e\xc2\x26\x8b\x37\x20\x22\x79\x93\x67\x05\x90\x1b\x46\x3b\xff\x4c\x87\xba\x44\x3f\x64\xeb\x2f\x3e\x53\x31\x81\x59\x76\xa2\x02\x36\x54\xa0\x3c\x56\xd0\x12\xb3\x14\xad\x9b\xaa\x8a\x65\x63\xeb\x4e\x84\x79\x12\xa6\xf9\x6a\xe7\xb2\xfc\x5a\xd1\x2b\xf1\xcb\x70\xb6\x74\x4b\xcd\x1d\xfc\x54\xec\xe9\xcf\x9e\xf0\x16\xd4\xc0\x38\x1d\x9b\xa1\x60\x06\x50\xf5\x9b\xea\x10\xa1\x5d\x89\x58\xd9\xe4\xcc\xc7\x42\xbb\x18\x90\x95\xec\x67\x9a\xd4\xd4\x2a\xa9\x12\x20\xe9\xdb\x05\x42\xac\x7c\x8d\x9a\x73\x44\xc5\x49\x51\x9e\xf0\x45\xd1\xa5\xe8\x95\x0c\x7e\xa8\x58\x2f\x34\x34\xc6\x7c\xba\xb6\x7c\x18\x0c\x5d\x06\x5d\x18\x0c\x6d\x6c\x97\x59\xe1\x35\x53\xcb\x99\x5d\xb6\x9e\x29\x07\xf8\xba\xbb\x50\x10\x8c\xdd\x85\x82\x60\xec\x2e\x16\x04\x63\x77\xde\x20\x18\xbb\x45\x41\x30\x8e\x79\x6b\xa5\x20\x9b\x8f\x53\x8b\xc0\xcf\x33\x0c\xf2\xbc\x09\xfe\xfb\x43\x60\xd0\x71\xbb\x7c\x10\x8c\x9c\x2c\xb0\x27\xa5\xcf\x04\x9f\x24\x8d\x2c\x7e\x16\x06\xf5\x97\x63\x67\x34\x8b\x63\x67\x14\x9a\xef\x25\xe2\x59\x30\x11\x65\xe1\x2c\xe8\x93\x88\x66\xa1\x64\x2c\x0e\x45\x71\x29\x23\xf7\xff\x56\x66\x2d\xa3\x71\xb1\x28\x13\x90\x42\x04\x9f\x9c\xe8\x03\x03\xc8\x7c\x7c\x5c\x23\x1f\x22\xf4\xe5\x34\x0b\xf4\xaf\xf3\xa2\xcc\x0d\x4d\x30\x69\xa5\x1a\xcf\x88\xcd\x6c\x2c\x82\x69\x2a\xd5\x47\x23\x36\x53\x89\x1e\xcc\x74\x7c\x80\x4c\xc7\x7f\x86\x4e\x4a\xc7\x08\x4d\x77\x53\x9a\x8d\x35\xf5\x51\x3a\x40\x69\xa6\x97\xe6\xe8\x23\xb2\xa2\x9c\xd1\x41\x53\x35\x49\xa6\x77\xd4\xbe\xc9\x89\xd6\x20\xc7\xdb\xca\x2e\x9a\x44\x0c\x84\xf9\xe3\x1e\x30\x62\x65\xcc\x06\x2d\xf6\x7d\x7e\x58\xac\x94\x3d\xb0\x37\x97\x3d\xa0\x09\x8a\xb5\xe8\x0c\x9a\x1b\xf3\x60\x94\xe8\x37\xaa\x29\xd3\x11\x0f\x58\x09\x4b\x06\x3c\xa0\x54\x2c\x56\xc8\xac\x70\x07\x7a\x13\x2d\xcf\x3a\xce\x66\xcc\x2e\xa5\x57\x1e\xee\x20\x3f\xd4\x85\x12\xee\xe0\x59\x26\xdc\x41\x36\x92\xc1\x33\x7d\x24\x83\x94\xe8\x3c\x9b\x4b\x74\xb4\x01\x33\xb4\xb1\x03\x46\x49\xff\x2a\x12\xf0\x35\x62\xdb\xeb\x5d\x20\x15\x6c\x7b\x30\x65\x16\x44\xb7\xff\x1a\x16\x53\x7a\x78\xfb\xac\x88\x1b\x5f\x3b\x50\x3b\x1b\x78\x1a\x0d\xac\x02\xb4\xc3\x01\x56\x31\x44\x7b\x73\x4e\x88\xf6\x13\x26\x03\x4b\x80\xb4\xeb\xd7\xfd\x25\x30\xda\x4b\xc3\xaa\xeb\xfd\xb4\x15\x58\xf5\x12\x48\xc3\xb9\x54\x4a\xe1\xe9\xe5\xe6\x9e\x8d\xa7\x37\x8b\xfd\x45\xb2\x6a\x91\x86\x01\x28\xed\xf5\xc4\x8d\x8a\xb1\xe5\xd7\xd4\x10\x4b\xd4\x86\xb6\x21\x45\x47\xa4\x68\x6a\xdf\x76\x2d\x36\x92\x9d\xab\x05\xe8\xcc\x86\x59\xcc\xe7\x5e\x42\x19\x2d\x04\x97\x9c\x25\xce\x40\x61\xb1\xe1\x24\x53\x28\x8e\x51\x50\x8e\xc4\xf2\x5c\xd8\xb3\xa0\x90\x4b\x51\x09\x67\xe2\xb5\x96\x22\xc3\x0c\xa7\x25\xa9\x88\x5b\x81\x8b\x0c\x10\x58\x22\xc1\x05\x39\x1a\xd0\x60\x16\x10\xeb\x9a\x86\x5a\x09\x30\xd9\x19\xfa\x2f\x41\x53\x7d\x17\xc4\x5f\xa0\x06\xb3\xa1\x64\xd7\x56\xf9\x85\x32\x26\x10\xbc\x3b\x3b\xe8\x76\x80\xc1\xa7\x73\x60\xdf\x60\xd8\x65\x76\x7d\x34\x0a\xbc\x29\xf2\x5c\x1f\x6f\xc0\xc6\xf3\x63\x93\xce\xd1\xa4\x33\x91\xa5\xbf\xd2\x61\xb4\x50\xc6\x25\xba\x49\x6a\xb1\x52\xf0\xf2\xc5\xcd\x36\xf7\x81\x54\x01\xba\xfc\x2c\x48\xf6\xc2\x2a\xc1\xac\xaf\x1e\xc1\x2d\xda\x21\x1b\xe9\xc3\xb9\xa5\x08\xbd\xf5\xdc\xde\xf5\x52\x34\xe6\x82\x6b\x9e\xd1\x48\xa5\x23\x20\x95\x98\x06\xcb\x03\x3f\xcf\x43\xac\x0c\xf0\xf3\x3c\xf4\x66\x03\x3f\xcf\x90\xf0\x79\x81\x9f\x4b\xc3\x3d\x2b\xeb\x85\x7a\xd6\xf8\xae\x6b\xd0\x88\xa5\xe9\x96\xe3\x15\xc3\x44\x21\x12\xe8\xe1\xa1\x17\x42\x2d\xd6\x0f\xe0\x72\xa0\xc5\x0b\x42\x16\xcf\x83\x00\xb8\x9b\x20\x00\x26\xed\x26\xc2\x94\x27\xaf\xf8\xee\x83\x68\x6e\x91\x46\xbc\x11\xc0\x73\x74\x75\x2e\x0a\xa4\xc9\x94\xb7\x1a\x8c\x3a\x9a\x88\x63\x91\x49\x18\x9e\x82\xbe\x14\xbd\x13\x60\x35\xa5\x0f\x09\x00\x9d\xd8\x45\x53\xca\x9b\xe1\xce\x35\x17\xb8\x90\xee\xfa\x65\x39\x7c\x8d\x84\x61\x0e\xc2\x27\x60\x86\x18\xb6\xd2\x78\xdd\x2c\x38\x69\x64\x25\x11\x36\x5d\x69\xd0\xa8\x67\x7b\xd8\xf0\xe9\x76\x1a\x42\xb2\x7c\xa0\x8e\x24\x28\x2c\x21\x70\xce\x37\xde\x74\x07\x09\x33\xab\xa4\xbb\x37\x3b\x03\x38\x06\xd0\x33\x2d\xc6\x0c\x6b\x5c\xc9\xf3\x42\x8f\x79\x03\xd7\x67\x52\xd8\x9b\x7c\x4d\xa4\x50\x6a\xd1\x3f\x09\xf8\x62\xc6\x67\x8e\xa1\x84\x98\x2a\xb0\x67\xda\xdd\x67\x0d\xe8\x1d\xe2\xda\x48\x0a\xbf\xe3\xc5\x23\x7e\xc7\x23\x7e\xc7\x17\xc5\xef\x10\xa4\xe0\x8e\x52\x7e\xdd\x5f\xac\xaa\x80\xa5\x20\x3d\xd2\xc4\x16\xc5\xdf\x58\x0b\x6a\xc9\xee\x0a\x50\x4b\x76\x97\x43\x2d\xd9\x5b\x23\x6a\xc9\xde\xaa\x50\x4b\xf6\x56\x80\x5a\xf2\x17\x42\xf1\x58\x2b\x3c\x4b\x9a\xfc\x12\xb5\x4d\x93\x5a\x18\x53\x84\x7a\xbc\xd2\xe0\xcc\x05\x80\x22\x0b\x8a\xf1\x8b\xf5\xa3\x4c\x7c\xbf\x7e\xd0\x12\x61\x4f\xae\x11\x7b\xa5\xd1\x58\x00\x2c\x63\x41\x58\x91\x74\xdc\x8a\xbc\xaa\xd4\x17\x6d\xaf\xdd\xb5\xa3\xe1\x34\xf6\xe6\x04\x79\x79\x04\x16\x79\x04\x16\x79\x04\x16\x59\x33\xb0\x08\xdd\x30\xfe\xd5\x8d\x07\xc1\x38\x96\xca\x0d\xba\x7f\x80\xd8\x46\x5c\x1a\x68\x8b\xa2\x0e\xba\x7b\x68\xcb\x72\xe4\xfa\x28\xe8\xfe\xc1\x5b\x84\xe4\xa8\x81\x6f\xe9\x51\xdf\x70\x4d\xf4\xb2\x83\xea\x26\x22\x13\x8a\xeb\xf3\x4e\x7e\x52\x6a\xe8\x00\x03\xae\x29\x67\x66\xa3\xc7\x25\x63\x27\xe8\xfe\x01\xd2\x98\x1d\x32\x8f\xb0\x29\x8f\xb0\x29\x8f\xb0\x29\x5f\x19\x6c\x0a\x58\x60\xc8\x46\x57\x61\x30\x1e\xa1\xa0\x0f\x3b\x53\xb6\x87\xba\x5a\x34\x15\x06\xa6\xe2\xda\xde\x9b\x72\x80\x2a\x5a\x73\x6f\x6d\x88\x2a\x94\xaf\x62\x54\x15\x9a\x66\xb5\xc8\x2a\x94\xe6\x7f\x2f\xba\x0a\xad\x5f\x49\x84\x15\xd6\x18\x4b\xa3\xac\x6c\x64\xfc\x50\x53\x38\x22\xb4\xb6\xb3\xf1\x56\x1c\x3b\xb6\x67\xa0\xad\xbc\x83\xe8\xe3\x10\x56\xee\xbf\x17\x69\x65\x35\x88\x20\x7c\x8c\x7d\xb3\xa8\x20\x3c\x6a\x63\x12\xb0\x71\xf5\x88\x20\x8e\x7c\x57\x20\x17\x0f\xe4\x0a\xc7\x49\x50\x9d\x9c\x96\x52\xd2\x68\xbd\xc5\x0b\xae\x6d\x2b\x91\xa1\x72\x83\x42\xa1\x54\x60\xa8\x54\x4c\x28\xc5\x99\xba\x74\x40\x50\xcd\xb2\x75\xde\x80\xa0\xbc\xcc\x65\x83\x82\x4a\xda\x50\x13\x18\x34\xa7\x6f\xa8\x07\x32\xdd\xcb\x81\xc0\xdb\x85\x6e\xfc\x52\x3a\x7e\x81\x5c\x03\xd9\x12\x25\xa9\xe6\x85\x6d\xc9\x6c\xd1\x96\xb9\x0d\xaf\x96\x37\x1f\x71\xdd\x9d\xf8\x35\x00\xb7\xcc\x62\x9a\xfa\x67\xce\x80\x6e\x59\xaa\x9e\x25\x6f\xb4\x67\xb6\xf7\xb4\xf7\xd9\x53\x8c\xa6\xa5\x2f\xe1\xb3\x94\xdc\x45\x25\x41\x1e\x32\xa9\x0d\x16\x1b\xa0\x2c\x58\xcb\xac\x9b\xc7\x2a\xfe\xc3\x6e\x16\xff\x41\x0a\x50\x2f\xdf\xce\x4d\xde\x66\x13\x43\x38\xf7\x4c\x62\x78\xab\x5c\x69\x49\x45\xc3\x63\xa9\x75\x81\xf0\xc8\xbf\x80\x2c\x1f\x20\x61\xde\xfa\x99\x51\xb0\xd0\x79\x35\xa2\xe3\x1a\x55\x25\x46\x93\x47\x60\x85\x3c\xca\x65\x55\x2f\xcc\xc5\x51\x6c\x74\xdb\xab\x25\x2f\xfc\xd3\x7a\x65\xf5\x19\xed\xe7\x92\x08\x32\xa3\x0c\x7c\x8c\x8a\x05\x73\x97\xd3\xee\x6a\x04\x93\xe4\x06\x9c\xb8\xb4\xb7\x60\xcd\xfb\x69\xe4\x86\xe8\xa8\xff\x76\xe0\x7a\x0e\x5b\x11\x50\x40\x98\x91\x12\x63\xd7\x4d\x01\x1e\xd0\x51\x43\xdb\x21\x0b\x7c\x93\x87\x24\xe0\xda\xde\x76\xd7\x0e\xb7\x69\xbe\x6a\x52\xa5\x59\xb8\x34\xb2\xa2\x77\x61\x91\x2d\x4b\xf3\x2b\x65\x20\xb4\x90\x5e\x6f\xce\xba\x30\xc6\x86\x73\x79\xd4\x01\x5d\x86\x39\x51\x07\xf2\x6f\x19\x2a\xe6\xd2\x9e\x12\xe0\x1a\xcd\x7b\xc3\xb0\x04\xe2\xc0\xde\x42\x88\x03\x7b\x8b\x21\x0e\xec\xcd\x8b\x38\xb0\x57\x84\x38\xc0\x16\x1e\xa9\xdb\x92\xef\x14\x03\x73\xe6\x3d\xb1\xd9\x73\x54\x89\x7b\x62\x79\x87\x63\x7f\x09\xb4\x01\xba\x40\x29\x89\x38\x30\x0b\x3e\x60\x01\xa0\x02\x49\x3f\x8a\x9f\xab\x42\x1c\x28\x1d\xd6\x5c\x95\x4c\x86\x37\xf0\x8e\x85\x4d\xe7\xbf\x17\xc1\x1a\x90\x6f\x5a\x2b\xe1\xd5\x16\x5c\x12\xcc\xbe\xec\xaf\x06\x4c\x8d\xc3\x69\x4d\xb3\x4e\xc8\x63\x51\x8a\xe8\xb6\x36\x06\x45\xf0\x5c\xc6\x1e\x7f\x5e\x12\x9b\x40\x8e\x85\xa5\x6f\x75\x2d\x58\x41\x12\x1e\x4b\xd7\x0e\x65\x90\x0b\xd2\xed\x29\xad\x0d\xd5\x0a\x66\x0b\x57\x56\x9c\xe9\xce\x6a\x17\x63\x22\xac\xa9\x8b\x74\xf1\x76\xe7\xc1\x23\xc8\x69\x50\x23\x36\xcb\x01\x0b\xac\x42\xd3\xa3\x42\x6d\xaf\x73\x0c\x28\xbc\x14\x4c\xfe\xf9\x63\xcf\x53\xdf\x28\x10\x08\x9a\x25\x05\x87\x40\x90\x32\x2d\x00\x87\xc0\x08\x97\xb1\x67\xe6\xbc\x1b\xaf\x18\x2a\xcf\xe6\x30\x54\xb4\xf7\xd9\x93\x72\xcb\x4e\xed\xb9\x30\x08\x0e\x53\xbb\x4e\x12\x3b\x3a\x81\x40\x10\x31\xc4\x97\x00\x40\x00\x2f\x67\x20\x3f\x0b\xfc\x40\x6f\x29\x96\x00\x3f\xc8\xca\x83\xb4\xc5\x95\xdb\xd9\x6f\xec\xde\xf5\x55\x18\x8c\x7d\xa7\xb0\xbf\x93\x64\x05\x0b\xd7\x3d\x9d\xf1\x9a\x5a\x1d\x4a\x70\xa3\xf2\x97\xd4\x8a\x8d\x17\xf6\x39\xd6\x6d\x12\x47\x49\xc1\x4b\x2c\xe3\x76\x76\x10\x8e\x3c\xd7\x8f\xb7\x1d\x37\xb2\xbb\x1e\xde\xf6\xf1\x24\xde\xf6\x5c\x1f\x23\x3f\xd8\x1e\xfb\xe3\x08\x3b\xdb\x37\x76\x18\x29\x2b\x3f\xee\xee\x4d\x55\x32\xf5\x4d\x56\x06\x7f\xc2\x9c\x48\x95\xbc\xb2\x52\xca\x32\x8a\x8b\x16\xd8\x8c\xed\x73\x16\x8e\xda\x42\xd5\x84\x92\xbc\x7c\x66\x71\xf4\xa5\x66\x51\x26\x41\x0d\x2e\x84\x02\xab\xa3\x5f\xd0\xce\xbd\x82\x25\xb5\x51\x67\xdf\xbe\xeb\x79\x2d\x54\xfd\x1b\xc6\xb8\x2a\xa7\x94\xda\x23\x2d\x44\x6b\x5d\x01\xef\xcd\x58\x01\xeb\x70\x57\x97\x5b\x15\x27\xb5\x2b\xbf\x40\xde\xd3\x2c\x90\xe5\x16\x9b\x73\x0d\x3c\x3f\x68\xca\x7e\x39\xd0\x94\xfd\x0c\x68\x8a\x32\x6f\xec\x67\xe6\x8d\x2c\xa6\xca\xbe\x1e\x53\x45\x19\x42\x3c\xa5\x7e\x10\xe5\xcf\x45\xfb\xa5\xb1\x55\x1c\x3e\x71\x48\xd3\xca\x37\x8a\xab\x62\x87\xd8\x5e\x10\x56\x65\x25\xcb\xe5\xb9\x0d\xa8\x12\xa8\x2a\x92\x34\x14\xc2\xa2\xcc\x65\x05\xae\xd4\x06\xcc\xc7\xd9\xcc\xea\x81\x6a\x6a\x0d\x9e\x18\x06\xd2\xdc\xed\x28\xd6\xa1\xb4\x34\xf9\x36\x6b\xcf\x26\xe5\xfc\xaa\x73\x33\x35\xb7\xde\xab\xc3\xce\xc9\x73\x68\x2d\x89\x9d\x93\x0f\x19\xac\x28\xba\xa0\x77\xfd\xab\x1b\x71\x6c\xdb\xf4\xc9\xe3\x0f\xa8\x2e\x4d\x03\xcc\xde\xd4\x58\xfd\x19\x08\x1e\xba\x21\x53\x0c\xc3\xb3\x3b\x3f\x0c\x0f\x25\xbb\x1c\x14\x8f\x7e\x56\x5e\x25\x14\x8f\xfe\xf2\x81\x02\xc5\x53\x12\x85\x26\x97\x52\xa9\xdb\xf0\xb3\xf8\x58\xa4\xe0\x45\x50\x68\xbe\xee\x5a\xcc\x44\xf6\x58\x13\xfb\xb3\x60\x05\x72\x33\x32\x2c\x03\x19\xd9\xe3\xf4\x0b\xd5\x61\x36\xc2\xc1\x67\xa9\xfe\x21\x35\x87\x17\x16\x84\x92\xe0\x58\x5f\xab\x1c\x2f\xdc\xfe\x29\x70\xac\x8d\xf4\x02\xea\xb3\x37\xc5\x12\xf5\xa1\xad\x48\xa5\x62\xe8\xfa\x00\x10\x79\xea\xfe\xb9\xd8\xa8\x48\xc4\x62\x68\x4f\xde\xd8\xe1\x0a\x08\x39\xe0\x6e\xb6\x00\x89\xd9\x48\x57\xf9\x6d\x22\x21\x5d\x15\xa3\x4c\x95\xa8\xc0\x2c\x94\xa9\x52\x24\x5c\x7f\x39\xf1\x92\x69\x05\xe3\x78\x65\xb4\x66\x02\x4e\xe5\x52\x81\x9c\x09\x4e\x54\x39\xb8\x96\xe2\xe1\x33\xf7\x96\x42\x01\x5c\xcb\x4c\xc0\x9d\x35\x8d\x64\x00\x32\xf9\x12\xf3\xc2\x42\x79\xe9\x3c\x46\x5b\x2c\x59\x01\xfd\x25\x9a\x6d\x89\x29\x5c\x99\x89\x67\xe1\x02\x15\x57\x79\x1e\x5c\xa0\xe2\x36\x98\x03\x17\xa8\x04\xa1\x99\xb8\x40\x33\x68\xcc\x0b\x0c\x34\xa3\x95\xe6\x81\xf3\x29\xa1\xf7\xe6\x82\xf3\x99\x87\xde\x6c\x38\x9f\x19\x1a\x70\x41\x38\x1f\x0b\x55\xa3\x11\xb1\x03\x56\x05\xec\xa3\x5a\x12\x3a\xac\x1f\x3d\x94\x0f\x9d\xed\xcf\x2f\x16\x86\xf5\xd1\x2b\xfa\xaf\x11\xd6\xc7\x65\x11\xf4\x00\x60\x87\x3c\x08\x4c\x13\xbe\x53\x0f\x5f\x94\x2d\xda\x52\x50\x40\xc9\x9b\x33\xb7\x77\xad\x4b\x09\xef\xe7\x40\x0e\x12\x2f\x54\x82\xea\xeb\xd5\xc1\x0c\xf1\xcf\x51\x6c\xf7\xae\x53\x74\xa4\x77\x3c\x59\xd7\x0e\x8f\x83\xc8\xe5\x4e\x4e\x90\x4c\x7a\x97\x24\xf3\x1d\x22\x8e\x52\x1a\xfa\x42\xe6\x06\x1c\x06\x84\xbb\xa5\x60\x2a\x79\x2d\x01\x1a\x95\x3a\x0f\xd3\x5e\x18\x4e\x0e\x33\x7c\x87\xb3\x79\xd4\x7f\x63\x33\xe1\x94\x99\x07\x31\x81\x2d\x23\x38\x01\x1a\x05\xe2\xbc\x8f\x6d\x1a\x9d\x5f\x88\xeb\x07\xf3\x42\x33\x89\xbd\xe9\x60\x1c\xf3\xdb\xb1\x35\xfa\xc8\x3f\x5e\x92\xe2\xff\xce\x25\x92\x3c\xa8\x02\xd9\x1b\xb8\x9e\x13\xc2\xd5\x1d\x29\x69\x8d\xbf\xe6\xc9\x64\x75\x90\x4a\x2a\x7f\x12\x8d\x0b\x97\xc6\xdc\x1e\x93\x4a\xce\x61\xa7\xc3\x9d\x96\xaa\xe8\x95\x24\xb7\x2d\x49\xe4\x39\xe3\x5c\x4e\x82\xa1\x0d\x1e\x73\xb2\x2c\xbd\x92\xe9\x53\xa8\xa4\x9a\x03\x09\x0d\x1e\xf4\x88\x93\xe9\xda\x11\xfe\xa5\x34\xfe\x93\xbe\xaf\xff\xe0\x87\x9f\x6f\x38\x31\xa9\xaf\xef\x68\xb3\xb7\x78\x08\x4b\x89\xb3\x96\xd2\x0c\xf4\x18\x08\xba\x18\x7b\xde\x12\x67\xb1\x03\x21\x7a\xaf\x3d\xef\xcd\x94\x68\x60\x86\xdc\xc4\x3b\x6d\xce\x6b\xfc\xba\x2b\x6a\xa2\x1b\xe8\xbe\x6f\x49\xdc\x2f\xd9\x2f\x4b\x3e\x8a\xa5\xee\xff\xc9\x66\xb1\xb4\x1a\xd2\x7c\x95\xd6\x37\x9a\xaf\x8a\xdb\x4d\xfa\xa3\xe4\xbe\x93\xfe\x94\x98\xb7\x74\x2f\x3b\x7d\x2b\x81\xdd\x82\xe6\x42\x26\x1f\xbb\x2d\x27\x3e\x6f\xa0\x71\xe3\x70\xec\xf7\xec\x18\xbf\x99\x32\x91\xe6\x0e\x3b\xbc\xc0\xf3\x94\xfa\xda\xa2\xcd\x79\x61\xa9\x43\x81\xef\x3e\xab\xf7\x02\x96\xe5\x71\x0e\x88\x33\x53\x0e\x69\x58\xe0\xc9\x91\x0f\x2a\x64\x98\x0c\xd8\x4c\xf5\xd9\xa6\x35\x38\x17\x23\x96\xc1\x8b\x5d\xa4\xaf\x16\x89\xde\xd2\xa8\x95\x84\xa2\x2a\x62\x8b\xb6\x8b\xf0\x7b\x78\x6b\xc7\xf8\x6d\x10\x84\x8e\xeb\xdb\xb1\x32\xfe\x45\x0d\x6c\x18\xf2\xd9\xe9\x1c\xa1\x98\x4c\xaf\xad\xf4\xbc\x2e\x8b\x26\x9d\xc8\x5a\x28\x3d\xa5\x21\x14\xf4\xfb\x11\x8e\x5b\x64\xba\xaa\xd1\xdf\xb2\xb4\xc7\x21\x8f\x4f\x2a\x0f\x2e\x7a\x46\x4e\xfe\xa4\x8e\xa0\x95\x01\x92\x46\xa5\x83\xd6\x3e\x6f\x5c\x88\xb4\xca\x48\xd3\xa7\xae\x27\xa9\xd5\x51\x2b\x37\xff\x16\x30\x1f\xc1\xfc\xc0\x3b\x3b\x75\xd3\x49\x7b\xaf\x49\xb9\x2e\x24\xae\x40\xc9\xf3\x8d\x89\x5e\xa2\x3a\xda\xdc\x44\xe2\x6b\x42\xd5\x44\x3f\x20\x7d\xa6\x4c\xb0\x59\x92\x67\xb5\x17\xbd\xa4\xca\xdd\xdf\x23\x95\xe5\xa7\xb9\x95\xd9\xd6\xd6\x43\xf6\x42\x10\xed\xb4\xd5\xa1\x6c\xab\x83\x43\xab\xe5\xee\x34\x2a\xb0\x95\x89\x7d\x2b\x03\xf7\x29\x9b\x55\xd2\x83\xa5\x6e\x3d\x49\x0f\x96\xe2\xc1\x49\x0d\x83\xe2\xcb\x77\x3c\x15\x7f\xce\x38\xd7\x3d\x68\x15\x9d\x3a\xac\xf5\x80\x89\xf9\x52\x99\x93\x3e\x4f\xe6\x3f\x9f\xd6\xc8\x58\xec\x42\x69\xe8\x6d\xf4\x2f\xa5\x33\xa4\xe6\x29\x18\xd5\xa2\xbd\xe5\xd6\xdf\x96\xfb\x6e\xe1\xa1\x4d\xb3\x97\x1f\xdb\x97\xeb\x1a\xdc\xac\x56\x4b\x8c\x6e\x56\x15\xc9\xaf\x54\x6e\xae\xad\x0e\xe3\x5d\x3b\xfd\x15\x38\xf1\xa6\x35\x40\x72\xf0\xad\x62\x6d\x5a\xb2\xe9\xd0\x4a\xd9\xd7\x74\x36\x66\xc8\x9e\xe7\x0d\xe1\x4d\xb0\x6a\x4d\xa1\x73\x58\x6e\x21\x45\x27\x3c\x58\xcc\x60\xde\xdc\xa4\x3f\x98\x27\x7f\xfa\x59\x8a\x7b\x9e\xc6\x0e\xa5\x9b\x12\xcc\x94\xb5\xd8\x72\xa4\xc5\x97\x25\x6b\x82\x12\x4d\x70\x12\x52\x70\xa2\xdf\x7f\x85\x70\xa2\xa1\xed\x5f\xe1\x7c\x30\xd1\xfa\x82\x30\x6e\x69\xfa\xab\xc0\x12\x65\xa4\x1e\x91\x44\x17\x02\xfa\x5c\x0b\xa6\x66\x26\xde\xd7\x42\xb0\xa1\x4b\x61\x6a\xee\xae\x11\x53\x53\x8f\xc0\xbe\x10\x6e\xe8\xf2\x98\x9a\x7b\x6b\xc4\xd4\xdc\x5b\x15\xa6\xe6\xde\x0a\x30\x35\x9f\x5d\x3a\xbb\x97\x60\xa5\xe5\xe3\x69\x3e\x5b\x10\xf0\x76\x7f\x4e\x10\xc0\xc5\x20\x32\xd7\x0d\xfd\xf8\x79\x40\x32\x93\xdd\xa2\x33\x3c\xc9\x57\x1d\xfb\x2f\x28\x58\xe2\x23\x56\xe2\x23\x56\xe2\x23\x56\xe2\x4a\xb1\x12\x15\xa8\xc4\x54\xb3\x71\x84\x44\xb6\x59\x26\x21\x20\x4a\x98\x88\xfa\x16\x4f\xb2\xde\xa5\x80\xfc\x65\xcc\xb7\x3c\x88\xb7\x34\x0c\x1c\x00\xbe\xf1\xc5\x3a\x00\x23\xb2\x31\x03\x34\x25\x74\xbf\xa0\xfb\xc7\x23\x3e\xe2\x23\x3e\xe2\x23\x3e\xe2\x57\x87\x8f\xf8\x26\x1c\x47\x83\x14\x10\x22\xd1\x4a\xf0\xbe\xcc\x16\x8a\xce\xe6\x29\x83\x7f\x38\x37\xfc\x21\x70\x54\x00\x7d\x08\xdf\x0d\x05\x95\x4a\x8f\x67\x08\x09\x4d\x05\x0f\xb1\x2c\x62\x20\x64\x2d\x03\x13\x48\xcb\xa0\x10\x81\x2c\x33\xe5\x8c\x97\x2b\xa3\xe2\xbd\x0b\xed\x2b\xa5\x11\xb0\x74\xa4\xd1\x67\x88\x86\x35\x0f\xdb\x37\xf8\xcc\x1d\xe2\x50\xde\xef\xea\x79\xd8\x0e\xc9\xdb\x60\x1c\x67\x13\x26\xdb\x4c\xe9\x4f\xa8\xa3\xbf\x39\x95\x94\xc7\x2f\x49\x9d\x85\xf6\x0d\xf6\x3c\x1c\xfe\x14\xdc\xb8\xfe\x95\x5c\xb8\x5c\x09\x39\x19\x36\xb0\x16\x45\x4b\xa1\x7b\xea\xb9\x0e\x2e\xa6\x09\x49\x48\xeb\xc8\xf4\x36\xd8\x46\x71\xa6\x19\xcf\x82\x71\x6f\x40\x4a\x2f\x6a\x4b\x5c\xeb\x0d\x6c\xff\x0a\x3b\x90\x1a\x13\x3d\x45\x35\xcd\xe6\x26\x4a\x7f\xe3\x77\x99\x5f\xa2\x7a\x1e\x87\x94\xb9\x54\x3e\x79\x2f\x3a\x9f\x5d\x92\xb5\x3c\xd6\x62\xb2\x6b\x9b\xee\x10\xc9\x3d\x87\xa7\x90\x9a\x56\x86\x92\x94\xae\x25\x6a\xf8\x01\x0f\xb2\x5f\x43\x7b\x34\x02\xe9\xd0\x31\x35\x53\x38\x60\x23\xad\x7c\x2f\x2b\xe2\x18\xe1\x58\x95\x63\xa5\x99\x2c\xd4\xa8\xd7\xeb\x25\x9a\x15\x3c\xea\xa0\xd4\xa3\x50\x70\xb7\x40\x23\xe3\x49\xcc\x1d\x98\x88\xf6\x2e\xdb\x80\xab\x2d\xb9\x6c\xdf\x89\x81\x92\xc5\xd5\xc4\xea\x5d\x52\x7c\x83\x7d\x92\x20\x33\x0e\x0a\xe4\xff\x55\xe6\xcb\x79\xfd\x02\xb5\x50\x72\x58\xb7\x3a\x69\xe5\x21\xe4\xe8\xbf\x88\x7d\xc2\x50\xaf\xdf\x5a\x94\xfd\xda\xc8\xbe\xc2\xbf\x15\x36\x4b\xcc\x4b\x15\x8d\xf2\x2f\x68\xa8\x30\x92\x0e\xc7\x22\x46\x54\xab\xc6\x44\xc6\x5a\xd7\xf5\x1d\x0e\x1d\x5a\xa5\x79\xaa\xe2\x12\x1c\xf6\x9d\x39\x29\x90\x1c\x55\x53\xc3\x33\x07\x86\x4d\x70\x3b\x29\x96\x0d\x7f\x4a\xba\x83\xa6\x1f\x8f\x1c\x3b\xc6\xa7\x70\xa6\xc5\xa6\xbd\x16\xba\x63\x47\x68\xf2\xd5\x65\x3d\xd4\x29\x9b\x4f\x3f\x33\xcc\xe9\x0c\x88\xbe\x72\xe0\x17\x99\x3b\xcc\xb7\xae\x13\x0f\x92\xcf\xf0\x28\x7f\x4f\x70\xf8\x6a\x0a\xf8\x9e\x10\x93\x5f\x55\x02\xea\x7b\x39\x07\x6d\x74\x19\x85\x95\xbf\x51\xaf\x31\x4b\x28\xab\xc0\x3a\x31\x87\xf9\x8d\xe6\xe4\x93\xa0\x46\x3e\xf3\x07\xb8\x2b\x99\xca\x9e\x79\xa3\xb9\x10\xad\x8e\xc1\x8c\x88\x24\x3d\xa2\x9b\x9b\x13\xea\xb4\x2d\x09\x43\xf4\x97\xc2\xf0\x04\x3e\x4c\xd4\x97\xa9\x56\x24\x29\xd4\x57\x59\x2e\xc1\x7d\x0b\x76\xf5\x8d\x73\x89\xba\xa5\x14\xb5\x85\xd2\x5c\x6d\xe7\x96\x7a\x21\xd9\x3a\x49\x11\xe0\x53\x22\x84\x4a\x75\x1a\xd3\xb9\x33\x69\x11\x1a\x18\x3e\x1e\x3d\x3c\xa6\xc9\x24\xc0\x06\xf9\xa4\x3e\x4f\x0b\x26\xaa\x26\xe1\x43\x6a\xf1\x48\x38\x00\x99\xa9\x53\xf3\xbc\x1c\xd8\x77\x68\x7a\x85\x0f\xf6\x6b\x03\xe9\x81\x07\x94\xc1\xfa\xb3\x3f\x0c\xc6\x7e\x5c\x66\x5c\xb3\xa4\xd2\xec\x95\xf0\x94\x32\x23\x35\x2d\x4f\x3f\x4b\x23\xa3\xac\x31\x9b\x6f\xcb\xce\x32\x65\x73\xea\x7f\x85\x69\x23\x1f\xfa\x27\x44\xf0\xf2\xf1\x88\xe5\x54\x06\x08\xa9\x85\x26\xaa\x1e\xa3\xc0\xe7\xf0\x8d\x6f\xca\x49\x5f\x23\x36\x0b\xd7\xe5\x97\x18\x6c\x3d\x92\x71\x1b\x35\x44\x8b\xdc\x0e\x5c\x0f\x13\xe9\x73\xb8\x1b\x0c\x7a\x89\x1a\xe9\x13\xed\xa1\xeb\x38\x09\x3a\x70\xdf\x0b\x82\xd0\xa0\xc0\x4f\x68\x8b\x10\x36\xd1\x0e\x6a\xa6\x91\x47\x80\xbb\x73\x9a\xf5\x02\xbd\x44\x29\xf4\x34\xca\x0f\xfd\x2c\xc9\x73\x1a\x7b\x16\x89\xda\x64\x92\xa6\xd7\x0e\x6c\xbc\x4c\xd0\x4b\xd6\x34\xe7\xd8\x77\x2e\x88\xf9\xe0\x3b\x88\x9d\xfb\xe6\xc2\x62\xf0\x76\x9f\xd1\x2d\xe0\x90\x9d\x42\x1d\x86\xb1\xc5\x5c\x7f\xe9\x60\xfa\x2d\x3d\x8e\xf8\x57\xf2\x5b\x99\x76\x86\xe0\x68\x2a\x40\x97\x59\x6e\xc8\xa3\x60\x34\x0f\xed\x89\x48\x67\x4f\x0a\xd2\xb9\x3e\xf7\x44\xe6\x97\xcc\x15\x71\x4a\x8f\x10\x8b\xe4\x48\x97\x34\x2f\x05\x7b\x92\x41\x94\x90\xc0\x83\x85\x76\x69\x09\xee\x14\xe7\x49\xfe\x8d\x95\xcb\x7b\xb5\xa8\xa7\x88\x8d\x7a\xd4\x3f\x73\x7b\xd7\xf9\xdd\x95\xa4\x31\x52\xd8\x7d\x65\xa0\xbd\x95\xf9\xbe\x99\x99\xf0\x63\xb7\x77\xfd\x63\x10\x0e\xed\x38\x06\x05\xc0\xd3\x29\xef\xd3\xf4\x98\xd7\xba\x44\x12\xc2\xe3\x4a\x5c\xc5\x78\x12\x97\xd9\xf4\xd0\x9d\x25\xcd\x70\xa8\x74\x12\x3c\x42\x29\x72\x2c\x6d\x99\xf2\x70\x20\xb3\xe0\xa6\x95\xfa\x9b\xe8\x95\xda\x50\x06\xa9\x1f\xb1\x12\xc9\xdf\xdc\xfe\x4d\x2d\x29\x72\x7a\x38\xbb\x42\x57\xfb\x97\x5b\xb3\x89\x69\x2b\x77\x47\xca\xb0\x27\xdd\x42\x57\x8c\xa9\x0f\x56\x66\x0e\x95\x92\xe6\x8e\x74\xfa\x9d\x8e\xf5\xb4\xc8\xe5\x83\x40\xcb\x60\xcd\x93\x7c\xeb\x72\x37\x6b\x5e\xe6\x98\x91\xbb\x05\x76\x64\xa4\xdc\x59\xe0\xb0\xd3\xe2\x65\xaa\x56\xe9\x84\xfc\x95\x8a\xde\xf9\x16\xd6\x68\x52\x32\xfe\x4a\x91\x71\xee\x1c\x85\xe9\x32\x8a\x4c\x3b\x6a\x9b\x2b\xb3\x35\x4d\x9d\xda\x01\xe1\x24\x84\xda\x84\x17\x16\x22\x26\x1b\x37\xd4\x52\x6d\xb2\x0d\x9d\x33\x23\x09\xed\x51\x9d\x79\x4a\x4b\xfc\xa1\x88\x0d\x7b\x92\xb0\xc1\x49\xd1\xdf\x8a\x92\x7e\x90\x9a\xc2\xc7\xb7\x5a\x55\x6b\xa4\xb4\xe7\x6f\x2d\x2e\x7c\x5b\xb4\x50\x45\x7f\xfe\xd6\xa2\x82\xc7\xbe\x49\xeb\x52\x75\x3d\x40\xcb\x92\x3a\x19\x2c\x65\xe9\x11\x8c\x6a\x96\x4a\x74\x3a\x49\x23\xcc\x3d\xb2\x0e\xe0\x9d\x2a\xb7\x04\x7f\x27\x4a\xc9\x42\xde\xe5\xd9\xa6\xf3\x57\xb0\x68\x79\xae\x5f\x9a\xe7\xe9\x98\xec\x52\xb9\x50\xd9\x64\x93\x1b\xae\x63\xa1\xcf\xb2\xc3\x91\xbf\xc1\x91\xdd\x6c\xb3\x8a\xb6\x3f\xd4\x0d\x8e\x21\xbc\x15\x89\x0e\x9d\x16\x72\x25\x24\xad\x2e\x59\xa3\x97\xdc\xff\x98\xd9\xc8\x84\x4e\xb9\xf6\x65\x5b\xb8\x29\x85\xce\x2a\xaf\xae\xda\x41\xd5\x36\x73\xf5\x7c\xaa\x02\x42\x39\x37\x6b\xa9\x2f\x72\xa6\x4c\xa3\x48\xd9\x32\xdf\x14\x76\x46\x21\xbe\xe1\x37\x7f\x12\x86\xce\x33\x99\x2e\xb2\xf3\x42\x3e\x40\xf8\x44\x42\xc7\x2e\x98\x17\xf6\x4a\xcf\x0b\x7b\x05\xf3\x42\x46\x8b\xef\xc9\x5a\x5c\xae\xaa\x1d\xda\x43\xd8\xcd\x4a\x2d\x2e\xe5\xb9\x51\x59\x43\x8a\x49\x91\xdb\x76\x79\xf3\x41\xaa\x6b\xd6\x34\x1f\x88\xbe\x5a\x89\xbe\xd7\x50\xe3\x6c\xd3\x96\xd2\x08\x01\x43\x8d\xa6\x02\xb3\xa5\xfa\xd6\x17\x4e\x0f\x94\xa2\x99\xa3\x1c\x0c\x31\x54\x20\x66\xa1\x95\x39\xbf\x17\xdf\xad\xac\xa8\x5b\x59\x96\xcc\x42\x0a\xd5\x54\x6f\x55\x2d\xde\x93\x24\x1f\x4f\x67\x5a\xda\x6d\x68\xda\xa7\xba\x19\xa5\x68\x4e\x91\x96\x7e\xf9\xca\x47\xda\x7a\xca\x51\x3a\x9a\xfd\xcb\x72\x88\xfe\x6c\x6d\xa0\xdf\x0a\x54\x0c\xab\x51\x6a\x7f\x25\xc7\xac\x1a\x29\x9b\x2a\xe9\xb1\xaf\xd9\x37\xe4\x23\x3f\x67\xbb\x31\x33\xee\x75\xbb\x8a\x2a\xd6\x20\xec\x27\x48\x1b\x7b\xd9\x1d\x95\x32\xeb\x12\xd9\x7f\xee\xbc\x02\x3f\xc0\x19\xbd\x72\x61\x1a\x26\xdf\xf9\x9a\xdf\x75\xd7\x30\x8d\xba\x45\x78\x34\x4d\xbe\x69\x37\x29\x1a\xdd\xc9\x66\xdc\x6a\xb6\xe2\xe4\x8d\xb8\x5d\xed\x46\x5c\xb2\xfd\x95\x59\xff\x6a\x4e\x54\x8a\xcf\xca\x0a\xa7\xef\x54\x0a\xcd\xbe\x9e\x76\x37\x2f\xb3\x97\x97\xde\xc1\xcb\x5f\x6e\x2f\x8a\x34\x3c\x1f\xb8\xf4\x44\x42\x8b\x56\x44\x7d\x2a\x7d\x98\xe6\xcf\x7e\xcf\xb2\xa3\x60\x80\xdd\xab\x41\x2c\xa5\xa0\x2f\xe4\x24\x7d\xd7\xf3\xa4\x04\xe4\x51\x1d\xcb\x61\x70\x2d\xe3\x58\xd3\x17\x73\x44\x9b\xc8\x78\x29\x67\xf0\x17\x19\x8c\x81\xb2\x61\x42\x0a\x69\xb1\xbf\x09\x3f\x14\x37\x57\xe5\x71\xd2\x42\x52\x6b\x4d\x5b\x48\x6a\x22\x68\x90\x16\x4a\xb5\x0b\x6d\x84\x16\xfb\x3b\x5b\x8f\xd2\x7e\x3d\xb6\xfd\x20\xb4\x87\x76\x61\xe7\xf3\x44\x73\xc2\xc7\x4e\x24\x70\xd6\x9c\xae\xdf\x2f\xea\xfa\xfd\x99\x5d\xbf\xaf\xe9\xfa\x59\xa8\xb4\xd2\x1d\x75\x0e\x4a\x9b\xba\x9f\x8e\x60\x6e\x77\x1c\x39\xe0\xc9\x7e\x8d\xbd\x51\x51\xb4\x07\x76\x18\xb3\x0e\x2f\xc4\x72\x6d\x4a\x28\x8d\xac\xb4\xca\x45\x2d\xf0\xbd\xa9\xb8\x68\xad\x2e\xeb\x9e\xc8\xa4\xcb\xa2\xd3\x2e\x26\xb5\x72\xbc\x32\xb9\x54\x59\x74\x97\x15\x47\x69\x61\x62\x87\x00\xaf\xc1\x9a\x33\xf9\xd0\x0b\x86\x23\xbb\x17\xa7\x17\x32\x8e\x08\x30\x59\x56\xa4\x85\x6a\x2d\x94\x69\x91\xca\x10\x53\xcc\x6f\x16\x72\x1d\x9d\x88\x3f\xcf\x15\xf1\x44\x92\x9f\xab\x92\x9c\x63\xa1\x3f\x2f\xb0\xd0\x53\xb2\xfd\x5c\x23\xdb\x29\xbd\xf5\x3c\xd1\x5b\x09\xcb\x9e\xeb\xe3\x8f\xea\x8e\xfe\x14\x6d\x71\xea\x3b\xa8\x69\xd2\x73\x82\x24\x87\xb2\x01\x2d\xb7\x86\x84\xc1\x3e\xcf\x5e\xe2\x6c\xdd\x28\xaa\xb4\x4a\x68\x61\x79\x90\xeb\x10\x6a\xc1\x9e\xdd\x8e\x53\xd2\x41\xff\xa9\xa8\x49\xb3\xbc\x3e\x34\x39\x19\x4c\xd2\x2c\xaf\x0d\x4d\xce\x77\xc1\xad\xcf\x32\xe6\x3b\x17\x9c\xbb\xce\x85\x9a\x17\xb6\x13\xe4\x20\x3c\xe5\x33\x47\xf1\xd4\xc3\x2d\x74\x87\x7a\xe3\x30\x0a\x42\x38\xc1\xf3\xb6\x43\x1c\xb9\x7f\xe2\xaa\x14\xc6\x44\x82\xef\x5d\xed\x44\x98\xd6\x27\x69\x8d\x22\x74\xca\xac\xc1\x92\x55\x2f\x7c\x36\x4d\xcf\xb1\xc9\xec\x5b\xf5\x03\x5f\xc6\xa7\x2f\x05\xb7\x5c\xa2\x96\x64\xdc\xa5\x6b\xd9\x68\x81\x31\xdb\x50\xaa\xda\x68\xd1\x31\xaa\x4c\x95\x4d\x9a\x32\xb3\x98\x55\xb3\x36\x35\x59\x19\xea\x3e\xd4\x4a\x5b\xdf\xbf\xf5\xfb\xfd\xaf\xa1\xbe\x68\x0b\x35\x97\xa8\x73\x3a\xfb\xdc\xf5\x66\x3f\x67\xc6\x59\x21\x43\xb6\x38\xca\x0a\x49\xa1\x9e\xd4\x69\x26\x8d\x17\x25\x26\x8d\x17\xea\xa4\x91\x9a\x01\x5e\xcc\x9e\x01\x5e\x7c\x1e\xcb\xb5\x40\x9f\x46\x52\x73\xa1\x25\x34\xe9\xa2\x7a\x34\xab\x45\x75\x9e\x6b\x72\xfa\x8c\xe6\x2c\xce\x90\xd5\x96\xc3\xe0\x06\x2b\xe0\xe6\xaa\x6a\x49\x1b\xf6\x3a\x73\xff\x68\x64\xf7\xdc\x78\xda\x42\xf5\x5a\x53\x31\xfa\xf5\x07\xc6\x33\x4c\x2f\x39\xa2\xef\x6f\xc9\x71\xc7\xb2\x6b\x03\xb2\xbc\x2d\xb6\xa1\xf0\x24\xd6\xae\x09\xbe\x2f\x8e\xac\xac\x9e\x3a\x7d\x5f\xf6\x78\xea\x7b\xed\x4e\xca\x54\xfa\x5e\x34\x9a\xbe\xd7\x8c\xa6\x1c\x2b\xed\xfb\xc2\xf3\x35\x65\x00\x7e\x2f\x06\xa0\xd4\x06\xb0\x23\xba\x9b\x7f\x46\xa9\x6e\x59\xef\xce\x3a\x70\xdc\xcd\x7a\x17\x50\x20\x06\xd4\x41\xcf\xe4\x82\xed\x38\x56\xfc\x10\x11\x1a\x05\x10\x7a\x8b\x46\x48\x29\x16\xd0\x64\xbf\xe0\x2b\xb7\xf3\x0a\xad\x3b\x3c\x89\xd5\xc0\x03\x2b\x61\xbf\x88\x8c\xe6\x56\xe3\x8c\x08\x0a\xda\xa0\x3b\x08\xce\xce\x5f\xfb\xbd\x01\xe8\x18\x2c\xf6\x63\xf8\xbf\x1b\x1c\x42\x04\x29\x91\x84\xba\xcd\xa4\x52\xe5\xaa\x10\xb4\x8d\xd2\xe8\x1d\x88\xe9\x13\x65\x75\x20\x7d\x7d\xb0\xa8\x44\x29\xce\x63\x7c\xc3\x5a\xf2\xc2\x90\x36\xa6\x44\xc2\x15\x59\x19\x5f\xb0\x07\x22\xe9\xd8\x70\xc1\x3e\x48\xfb\xf3\x64\x8d\x9d\xad\xb5\x75\x4a\xd6\x93\xaf\xac\x01\x34\x7f\x04\xa1\x46\xbd\x9c\xbb\x4d\xa3\x5e\x22\x48\x50\xa3\xae\x8f\x12\x94\xd9\xb8\x21\x09\xd9\xbb\xac\xf6\xdd\x2b\xab\x7d\xf7\x66\x69\xdf\x3d\xd0\xbe\xf2\x67\x79\xe3\x57\x4a\x26\xbf\x56\x93\x4b\x5b\xc1\x4a\x7a\xe9\x7d\x8a\x7e\xea\xf6\x83\x52\x88\xfa\x4d\xf5\x0e\x5e\x3a\xb8\x51\xc9\xd8\x44\xfa\xcb\xfd\x4a\x6c\x22\x50\xc8\xa9\xe0\x44\x49\x39\x6e\xc4\x36\x15\xdd\x5e\xb9\x8d\x33\x49\x45\xf0\x1d\xb4\x5a\x0f\xdc\x47\xc5\x06\x1a\x5c\x4d\x6c\x7c\xf5\xf3\x97\x7e\x9f\x22\x69\x78\xcd\x1e\xc1\x4f\x41\xca\x28\x26\x76\x6a\xf9\x5d\x08\x76\xf9\x46\x93\xe1\xe7\x51\x86\xec\x81\xef\x68\x76\x1a\xd2\x71\x7b\xf3\x53\x66\x78\x15\x6f\x75\x1b\x0b\xfa\x80\x48\xa6\x7c\x54\x92\x08\xca\xe6\xa6\x9c\x3e\xd9\x95\xd6\x92\xd3\xac\xd2\xb4\xe9\x92\x8d\x40\x9e\x36\x73\x17\x23\x27\x3d\x75\x3c\x62\xf7\x2e\x92\xb4\x86\xa2\x1f\x20\x6c\x91\xac\x00\xe0\x45\xe6\xee\x9b\x5a\x35\x6a\x58\x6b\xf4\xb5\x1a\x22\x08\x6e\x5a\x14\x87\x07\x6a\xce\x19\x1e\xe8\x0d\x1b\xb5\xba\xd0\x40\xa5\x43\xf7\xe8\x31\x4e\xa4\xd0\x3d\x1b\xdc\xf4\x5c\x82\x46\xb2\xec\x5a\x8a\x48\x61\x40\x87\xdc\xfc\x14\xad\x5b\x89\xfb\x01\xd3\xf6\xaa\x48\xb1\x85\xdd\xaa\xc8\xf1\xf5\xdf\xaa\xe8\xa9\x56\xcc\x12\x74\x09\x31\x76\x12\xb0\x58\x3f\x4a\xb1\x39\xe2\x60\xb4\x24\x27\x08\x85\x4b\xb6\x13\xa5\xd2\x0d\xe2\x38\x18\x2e\x4d\xc6\xc3\xfd\x65\x78\xd9\xa0\x9b\x7d\xe5\xa2\xf2\xe4\xd2\x2a\x15\x89\x61\xd6\x38\x5b\xa2\x25\x16\xc9\x4a\xa3\xf2\x58\x25\xe2\xc5\xe4\x92\x80\x78\x31\x54\xc9\x24\x5e\xee\x4b\xf5\x67\xe2\x10\xbf\x14\x19\xc5\xef\x7a\x21\x5a\x22\xa6\x02\x37\x9c\x16\xe3\x28\x70\x30\x0b\x38\x41\xdd\x79\x96\xe0\x25\xb9\xfd\xf6\x2d\x8a\xe8\x85\x29\x63\xfe\x6b\x62\x24\x4c\x58\x30\x81\x29\xfb\xcb\x94\x7b\x5d\xd6\xcc\x7b\x75\x9d\x5e\x7d\x66\x6d\x24\x61\x75\xfb\xfd\x7e\x55\x9e\xf6\xaa\x7f\xdb\xdf\xdf\xaf\x2a\x1a\xf4\x8e\x2a\xc1\x86\xc5\x15\x59\xc3\x12\xca\xa8\x61\x31\x85\xd2\x40\x0f\x02\xa3\x70\x55\x10\x85\x02\xfa\x40\x81\x27\xdc\xab\xd7\x8b\xe0\x09\x19\x99\x7c\x48\x42\x38\x62\x07\x83\xfc\x84\xbb\x2e\x6a\xc0\xa2\xbe\xdf\xfd\x9e\x95\xbc\x81\x9e\xa2\xb7\x90\x3e\x42\xb6\x8f\x60\x0c\xa3\xa0\x8f\x68\x3f\x45\xc8\x18\x01\x90\xfe\x0d\x46\xb6\xef\xec\x04\x21\xf2\xf1\x95\x4d\x9e\x4d\x34\x0a\x83\x2b\xc0\x0b\xf1\xaf\x50\x3f\x0c\x86\x84\xd4\x27\x18\xfb\x9f\xd0\x78\x84\xe2\xc0\x42\xdd\x71\x0c\x38\x21\xae\xdf\xf3\xc6\x70\x76\x8d\x3e\x61\xdf\xf9\x54\x43\xaf\x51\x14\xe3\x11\x29\xe9\xd3\x76\xe3\x13\x72\x23\x34\x8e\xb0\x43\x16\x64\xb6\x28\x42\x26\xe8\x46\x28\x1a\xe1\x9e\xdb\x77\xb1\x83\x6e\x69\x1c\x68\xc2\x30\x90\x43\x41\x48\x12\xe2\xd1\xa7\x1a\x3a\xec\xb3\x77\x6e\x04\x45\x8b\x5c\x16\x21\xe7\xc6\xd5\x08\x45\x38\x46\x71\x20\x48\x13\x6a\xe2\x21\x1e\x60\x5f\x24\xa8\x7f\xaa\x6d\x20\x68\xa2\xa7\x4f\x3f\x04\x31\x6e\x3d\x7d\x8a\xfe\x6d\xdf\xd8\xa7\x80\x88\x84\xfa\x81\xe7\x05\xb7\x11\xc9\x83\x0e\x0f\x0e\x0e\xb6\x9f\x3f\xdb\x23\xca\xcf\x77\xec\xd0\x01\xe4\xa8\x10\x47\x81\x47\xac\x55\x42\xa3\xef\x05\x76\xec\xfa\x57\xdb\xb0\xc3\x48\x37\x0b\x22\x74\x3b\x70\x7b\x03\xd4\xb3\x7d\xd2\x9e\xce\xb8\x87\xd1\xd8\xc7\x93\x11\xee\xc5\xd8\x21\xf9\xc7\x5e\x1c\x71\x2e\xfe\x41\xe1\x8c\xe8\x4f\xd7\xef\x61\x54\xaf\x35\x6a\x75\x78\x1e\x62\xd2\x61\x47\x7d\x74\x09\x8f\x3d\x3b\xc6\x57\x41\x38\x45\x3f\xc7\xae\x07\x6f\xc0\x51\x12\xdd\xd1\x8e\x7d\x40\xe7\x50\xe1\x4e\xfd\x02\x9d\x0d\x30\xbb\x57\x16\xf4\xa1\x2e\xf4\x2a\x9d\x2e\x13\xf6\x1d\x48\x4e\xfe\xce\x4c\x7c\x4e\x7a\xa4\xd3\xa0\x05\x50\x40\xd3\x38\x20\xa2\x10\x52\xe7\x8f\x20\x44\x0e\xe6\x0f\xdd\x29\xa5\x41\xcd\xf4\x08\xdd\x01\x66\xf9\x03\x3a\x61\xcf\xa2\x28\x49\x38\x69\x8e\x08\x63\x74\x59\x73\xe9\x8d\x2c\x0b\x5d\x52\xaf\xb8\x13\xba\x6b\xff\x14\xfd\x03\x4f\xec\xe1\xc8\xc3\xac\x09\xd9\x67\x63\x8f\x2c\x11\x9e\xa2\x9d\x1d\xd4\x79\x89\xce\xeb\x16\x19\xeb\x4d\x0b\xed\x5e\xa4\xd2\x6d\x67\x12\x6e\x37\x2c\xb4\xdd\xb4\xd0\x76\x26\x6d\xc3\x42\xcf\x94\xd4\x8c\xa6\x85\xf6\xd2\x49\xeb\x16\x6a\xd6\xd3\xc9\xc9\x0b\x0b\x35\x08\x33\xcf\x34\x19\xb6\xf7\x48\xe1\x73\xb1\xb3\x67\xa1\x7a\x9a\x23\xf2\x7f\x19\xea\x4a\xa2\x0b\xc0\xa0\x21\x9a\x24\x64\x3a\x44\xd2\x28\x80\x95\x45\xd5\x51\x8d\x69\x23\x7e\xfb\xb2\xbd\x91\x51\x66\x8d\xaf\x10\x6b\x75\x8d\xd0\xa3\xda\x32\x56\x01\xba\xba\x3c\xf4\x68\x63\x3d\xd0\xa3\x8d\x15\x40\x8f\x36\x96\x83\x1e\x6d\xae\x11\x7a\xb4\xb9\x2a\xe8\xd1\xe6\x0a\xa0\x47\x77\xd7\x08\x3d\xba\xbb\x2a\xe8\xd1\xdd\x15\x40\x8f\xee\xad\x1f\xbb\xf3\x19\x07\x1b\x3f\xfa\x69\x06\xfe\x68\x63\x6f\x61\x8c\xd3\x75\xa3\x83\x3e\x9f\x0f\x1d\x74\x51\x88\x53\x25\x16\x78\x6e\x11\xcf\x16\xec\x09\x5d\x90\x9d\xbc\x76\xda\x5d\x50\x49\xd5\xb3\xd0\xf2\x79\x45\x3c\x07\x18\xd5\x47\x14\xd5\x47\x14\xd5\x47\x14\xd5\x65\x51\x54\x33\xe0\xa9\x14\x1f\xf3\x57\xba\x7c\x93\x4a\xe3\x50\xa8\x11\x97\x01\xda\x8e\x70\x67\xab\x2d\x4b\x4f\x82\xa9\xca\x50\x56\xa3\x1a\x5c\xdb\x3f\xea\x1b\xae\x89\x5e\x76\x50\xdd\x44\x44\xeb\xba\x3e\xef\xda\x27\xa5\x06\x0c\x30\xe0\x9a\x72\x66\x36\x66\x5c\x32\x62\x82\xee\x1f\x20\x83\xd9\x81\xf2\x88\xa3\xfa\x88\xa3\xfa\x88\xa3\xfa\x75\xe1\xa8\xbe\xb5\xc3\x18\x47\xae\xed\xa3\xd7\x13\x37\x4a\x01\xaa\x52\x15\x25\x92\xb0\x08\x89\x29\x1c\xd4\x92\x30\xa8\x0a\x95\x02\x38\x54\x25\x9d\x51\x8c\x88\xaa\xa4\xe5\x37\x08\xf8\xb9\xfc\x4c\x50\x54\x25\x77\x19\x70\x54\xb5\x38\xb3\x66\x8f\x46\xde\x94\x51\x13\x66\x09\x45\x29\xcb\xc2\xd6\xa5\xea\xaf\xc0\xd7\x45\x83\x60\xec\x39\xa2\x45\x7e\x86\xdd\xea\x1c\x3f\x19\x6d\x5a\x40\x17\xa2\x73\x4f\xea\xfa\x3b\xe9\xe4\x37\x01\x0f\x30\x5a\x63\x8f\xf2\xb9\x7a\x88\x23\xb1\x9d\x9c\x3b\xe9\x50\xfa\xe7\x55\x96\xbf\x7a\x91\xdc\xd7\xd8\xd9\x61\xe6\x09\x2f\xca\x8d\x50\x14\x0c\x71\xec\x0e\x71\x84\xae\xb0\x8f\x43\x3b\xc6\x0e\xc2\x37\x38\x9c\x22\xf2\x16\x6d\x27\x59\x7b\xa4\x3b\x51\x3c\xb0\xd9\xee\xa3\xed\x79\x53\xa2\xa1\x29\x23\x08\xff\x67\x6c\x7b\x6e\x3c\x25\x44\x3d\xf7\x1a\x7b\x53\x14\x07\xa8\x6f\xbb\x5e\xc6\x4b\x28\xd7\x47\x88\xf1\x75\xe4\x49\xe0\x77\x45\xed\xc0\x12\xe6\x36\x05\x0b\x9e\xa9\x6d\x0c\x26\x7c\xb3\x43\x07\xeb\x96\x6d\x3c\x46\x7c\x34\xb0\x3d\x2f\xb8\x3d\x20\x75\xa7\x20\x3c\x9c\x5d\xa9\x2e\xb0\xb3\xbe\xea\x72\x44\x1b\x58\x4a\x73\xac\xa5\x2c\xea\x39\x25\x79\x51\x09\x47\x04\xf8\x03\xda\x8a\xfc\x7b\x8a\xde\xda\x5e\x6f\xec\xd9\x31\x86\x9d\xcd\x9e\x88\x51\x16\xa1\xa0\x8f\xb0\xef\xc0\x1e\x71\x44\xec\x1d\x88\x43\xc6\xb3\xb1\x3d\x56\x74\x47\x19\x7f\xa0\xce\x62\x67\x03\x4c\x7f\x04\x7d\x64\xa3\xc8\x1d\x8e\x3c\x0c\xf9\x44\x36\x7e\x13\x97\x67\x33\x26\x0d\x0b\x4d\x1b\x66\x0b\xf2\x26\xc5\xcb\xa5\xa3\x9e\x17\x44\xb0\x67\x4b\x48\x81\xa7\x1f\xa7\x87\x8c\x49\xd3\x42\xd3\x66\xc9\xfc\x36\xa8\x61\xc8\xba\xb3\xa1\x07\xb1\x72\x7b\xd7\xef\x5d\x9f\x06\x6b\x2b\xc0\xb1\x92\x93\x01\x8c\xd3\x7c\x48\x56\x13\x09\x73\x2a\xc7\x23\xba\x59\x74\xbd\xb2\x39\xf3\x7a\x65\x53\xe3\x32\x1d\x84\x2e\xf6\x63\x9b\xc7\x57\x66\xe9\xa4\xb7\x8a\x5f\xa2\xdb\xbb\xe6\x51\x7e\x25\x20\x2d\x35\xc0\x1c\x42\x43\x97\x58\x1c\x52\x22\xfa\x42\xf1\x78\x9e\x34\x34\x61\x58\x11\x9a\x34\xb5\xaf\xa7\xfa\xd4\x53\x7d\xea\x78\xa2\x7f\x3d\x4d\x87\x75\x65\xb8\x70\x64\xdd\xdc\xe1\x5c\xbf\x42\xdb\x0d\xd4\x52\x6f\xd4\xf5\x5d\xdf\xf6\xce\x92\xca\x83\x33\x9e\x68\x0c\x62\x08\xb2\xdf\x72\x26\xf2\x0e\x64\xa1\x54\x80\x39\xcd\x2e\x00\x0f\x24\xed\x46\x1f\xe0\x4c\x21\xc1\x07\xab\x09\xda\xc4\xce\x54\xdf\x20\x7a\xbb\xb2\x96\xc8\xbd\xa8\x6c\x74\xeb\xc6\xbd\x01\x32\xa4\xde\x55\x50\x15\xed\x08\xa3\x6a\x1c\x8c\xaa\x2d\xb9\x47\x48\xd3\x43\xb7\x64\xc8\xa6\x3a\x62\x8a\xb6\xd0\x13\xd6\x8a\x4f\x99\xec\xb5\xd3\x9d\x08\x9d\x30\x6d\x12\x43\x1c\x62\xe6\xa9\x6d\xdb\x4e\xf7\xa2\xa8\x96\xfc\xa5\x1b\x62\xfb\xba\x9d\xe2\xdb\xc3\xfd\x58\x61\x1c\x8a\x9b\xce\x60\x1c\x2a\x36\x51\x18\xbf\xa5\xa0\x0b\xa9\x16\x00\x6e\x26\xa5\xf8\x9e\xce\xc5\x37\x9c\xec\x2e\xc1\x78\x49\xbe\xb7\x56\xc7\x37\xdb\x7f\x5d\x5c\x48\xca\xca\x48\x09\x9e\xcb\xc9\x48\xfa\x46\xf5\x1d\x5c\x41\x23\x4b\x0d\xb8\xe2\x06\xd3\x4d\x0b\x4d\x1b\x16\xbd\xc4\x06\xd3\x47\x8b\x70\xf0\x60\x01\x75\x48\xd9\x42\xf1\xc4\x42\xd3\x16\x61\xef\x61\x06\xec\xa1\xdb\xbb\x3e\x13\xce\xe7\xc5\x53\x46\x92\x4e\xeb\x8b\x9d\x0f\x43\xa7\xd3\xdc\xbb\x79\x9a\x3b\xa5\x92\x77\x75\x2a\x39\x71\x97\xcf\xea\xc9\x52\xaa\x23\x33\x04\x15\x8a\x42\xbf\x32\x57\x7c\xc4\xae\x45\x2c\x30\x42\x72\xe8\x12\x6a\x48\xb8\xfa\xcf\x27\xc1\x0a\x49\x7e\x0f\xa0\xb4\x40\x25\xb9\x67\x89\xc5\x2f\xca\x95\x83\x62\xd1\x50\xd3\x6a\xc5\x23\x1f\x8d\x4a\x27\x1e\x7b\x25\xc5\x63\x4f\x27\x1e\xea\x65\x09\xd2\x4a\xb4\xf7\x96\x90\x90\xbc\xfe\xcd\x16\x35\xab\x43\xf2\x66\xaf\x0c\xa5\x05\xa4\x50\x23\x2d\x05\x64\x4b\x0a\x61\x5a\x82\x54\x8a\x33\xae\x74\x90\x25\xed\x7b\xd7\x2f\xbe\xd6\xca\x13\x7d\x13\x00\x2f\x3a\x69\x7d\x96\x27\xad\x36\xab\x99\x94\x92\xbf\x2a\x10\xea\x67\x3a\xa1\xe6\x2b\x59\x25\x58\xee\x4c\x6b\x4d\x77\x2c\x24\x45\x76\x3e\x0e\x71\xc4\xf9\x7e\x1d\xc7\xa1\xdb\x1d\x93\xc5\x13\x98\x6f\x49\xa3\x9b\xf2\x8d\x5c\xf9\xf6\x33\x97\x90\xf5\x32\xc2\x5b\xcc\x54\x81\x4a\x94\x8e\xe8\x74\xe8\x88\x22\x26\x6e\xe6\x03\x75\x44\xab\xa6\x21\xa8\x7d\x8c\x9d\x7f\xf1\x0e\xd7\x53\xdb\xdc\x14\xe6\x56\x01\x61\x92\x8c\xf7\x18\x2f\x40\xdb\x5d\x6c\x7f\x20\x73\x73\x3d\x7d\x6b\x7d\x0a\x40\xf1\x82\xbb\xa7\x1a\xb0\x01\x7e\x87\x3d\x23\xc2\x60\x0f\xe8\xf3\x8b\x54\x0f\x69\x80\xba\x6c\xc3\xf0\x7b\xa9\x99\x3a\x83\x62\x9c\xd5\x30\x54\x51\x2e\xdd\x2e\xac\x1a\x94\x97\xa7\x9a\xba\x36\x52\xe8\x0d\xbc\x55\x8a\x73\x35\xe5\x5b\x6e\xba\x46\x99\x03\xbc\xb8\x2c\x5a\x41\x52\x5f\xfd\x2d\xd2\x1e\xdf\x04\xdc\x26\xe2\xbe\x0d\xb9\xd0\x83\x14\x63\x09\x15\x5e\x98\x76\x7b\xd7\x87\x31\x1e\x16\x5f\x9a\x66\x89\x8c\x60\x44\xf7\xcc\x59\xb3\xf3\x90\x7b\xa9\x15\x21\x49\x9a\x35\xaf\x20\x60\xce\x5c\xed\xe1\x46\xbf\xd8\x9e\xeb\xf0\x06\xa1\x85\x2b\x11\xce\xa5\xd2\xe6\x6c\x6a\x19\x41\x48\xa9\x95\x36\x58\xd3\x62\x0e\x47\x86\x39\x83\x67\xfa\xd5\xd0\x96\xbb\x8a\x4a\xce\x7f\x2f\x55\xe3\xd1\x50\xfa\x5e\xaa\x7e\x38\xe6\x20\x31\xa4\xa4\x96\xd4\x71\x1b\xc4\xa9\x2a\xe5\x7d\x50\x6e\x8c\xc2\x67\xf1\x9c\x3b\xe6\x78\x73\xe5\xed\xfc\x51\x91\x86\x6d\x3f\xdd\xd6\x1e\x77\x7c\x84\x6f\xb0\xbb\x46\x7f\xc5\x01\xb2\x7b\xf1\x18\xf6\x92\x19\x09\x23\xb8\xc1\x61\xe8\x3a\xe0\x45\x6a\xc7\xe8\xd6\x8e\xd0\xc8\x8e\xc0\x8f\xd6\x67\xd2\x24\xa8\xf3\x65\x19\x4c\x63\x62\xab\xfd\x81\xd1\xc2\xce\x99\xc4\x8b\x6e\x93\x2e\x19\x89\x79\x01\x68\xa4\x14\x80\x7d\x3e\x67\xb8\x99\x7c\x50\xb4\x98\xed\xfa\x49\xc8\x62\xfc\x55\x01\xcc\xc0\x7e\x2d\x0b\x68\x03\x1b\x99\x2a\x95\xf4\xe7\x2c\x92\xfd\x7e\x3e\x92\xfd\xd8\x77\x65\x64\x35\xf2\xa8\xd4\x4c\x2c\xaa\xc9\xc4\xa1\x9e\xcd\xb0\xf5\x47\x64\x28\x02\x2c\x35\x00\xba\xa3\x3d\xdf\x62\x02\xf0\x60\x2a\xb7\x41\x95\xc5\x94\xb8\xcc\x9c\x5a\xec\xb6\x8b\xd6\x16\x72\xa6\xf4\x32\x48\x81\x48\x98\xb8\x11\x3f\x4c\xf9\x4c\x66\x9b\x5c\x7c\x6f\x1c\xc5\xc1\x90\x30\xf9\x59\x98\x70\x7b\xd7\x66\x7a\x8b\xf1\x3d\xf3\x8d\xc8\x4c\xff\xa2\x69\x48\x6f\xc9\xf6\xe5\xba\x2d\x4b\xce\x95\x2a\x13\x6e\x8c\x01\x86\x38\x11\x3b\x1d\x9a\xa7\x85\xdc\xb4\x41\x79\x99\xde\x5b\x27\x15\xa5\xa1\x76\x32\xbb\xee\x14\xec\x53\xbd\x7d\xef\xc9\xf9\xd2\x39\x6a\x5e\x6a\xa0\x22\x65\xdf\x36\x9b\x9e\x7c\x95\xe2\xa7\xf0\x5e\xc8\xf6\x80\x76\x6f\xa1\x25\xfd\xb6\x72\xd7\x93\xad\xd4\x73\x62\x4c\xa9\xbd\x9a\xd1\x2f\x02\x11\x44\x87\x04\x02\xd9\x53\x02\x6b\x25\xb5\x55\xe9\xb9\xf4\x6a\x93\x6b\xa1\x91\x3d\xf5\x02\xdb\x69\x21\x68\x5b\xc5\xae\x13\x0f\x2b\xb0\xe8\x4a\xcd\xc0\x3a\xb7\xc5\xc5\xa0\x21\xca\xce\xbb\x29\x28\x08\x3a\xdd\xc0\x84\x5c\x45\x5b\xc8\x95\xe7\xe3\x85\x07\x15\xdd\xe5\xef\xbb\x9e\x40\x76\x39\xea\xc3\x9d\x78\x16\x0f\x95\xca\x3a\x53\xbc\x62\x94\x98\xda\x59\x68\x73\x73\xc5\x76\xf5\x62\xd6\x0a\x90\x51\x1b\x47\xd1\x55\x56\x32\x2a\xb3\x15\x81\x4a\xd0\x4a\xa7\x4c\x6c\x98\x13\x93\xf1\x66\xa1\x2a\xe9\x85\x25\x4c\xd0\x19\x61\x50\xa0\xb1\x6b\xcc\x92\x67\x23\x80\x3f\x6e\x21\x03\x66\xd8\xfb\x7b\x54\xad\x9a\xa6\xc6\xf6\x9a\x2b\x5c\x4b\xe9\xf1\x51\xbd\xaa\xce\x04\xcf\xd1\x74\x89\x8a\xa2\x03\xca\x78\x43\x61\x78\x85\xf8\x21\xf9\xf8\x9a\x99\x9d\x9b\xe7\xda\x9d\x9b\xdb\x14\xc8\xe6\xac\x1d\x25\x1d\xb6\x26\x54\xfa\x9f\xd4\x1b\x42\xda\x05\x7a\x5e\x53\x3f\x14\x83\x97\x3c\xd7\x63\x97\x0c\x5c\x47\x4e\x43\x1e\x55\xdc\x0e\xf2\x66\x1e\x98\x8e\x59\x10\x73\x31\x33\xd3\x38\x4a\x1c\x3c\xcb\x09\xfc\x00\xa6\xd4\xd9\x7e\x25\x94\x80\x85\xce\xab\x54\x2a\x24\x5f\x8a\x8c\x51\x08\x29\x4a\xae\x51\xcb\x8c\xb4\xa4\xd5\x95\x45\x5f\xb6\x4c\x80\x4f\x00\x13\x21\x89\xac\xcb\x06\x67\x42\x43\xb6\xc9\x50\x2b\xfd\x51\x6e\x90\xec\x72\x88\xd4\x85\x0a\xd9\x0f\x1d\x54\x27\x63\x98\x49\x14\x7f\x7c\x22\x31\xa5\x3e\xce\x09\xc2\xb2\xca\xa1\xbf\xc2\x89\xf1\xae\x2c\xf2\xc3\x4c\x5c\x18\x55\xd7\x28\x00\x31\xb2\xc6\x11\x23\x5f\x45\xc6\x48\x36\xa9\xf5\xe0\x1c\xb0\x0a\x49\x1a\xbf\x14\x0c\x95\xee\x5e\x80\xa6\x31\x58\x11\x6f\x6d\xcf\x7b\x33\x3d\xb6\x43\xd2\xd4\x92\x48\x69\xb4\xe3\x45\xca\x8d\x8c\x2f\x93\x8a\x4f\x71\x22\x5d\xd0\x02\xb6\xd8\xa3\xce\x51\xba\xa5\x5e\xa4\x7c\xd5\xf9\x57\x89\x04\x1a\xdf\xaa\xa1\xeb\x93\xa2\xff\x69\x8f\x44\xaa\xe4\x55\xfe\xbe\x3b\x4d\x99\xb3\xeb\x0e\xc8\x73\x37\xb6\x27\xd2\xf1\x17\x45\xab\xd4\xa4\x0a\x45\x6b\x54\x9a\x8a\xad\x50\xa5\x21\xfa\x24\x16\x03\x50\x51\x07\xfc\x85\x66\x10\x9e\x5f\x68\x07\xfb\x0a\x1d\x30\x78\xb5\xcd\xc4\x71\x71\x6e\x93\xcf\x67\x74\x4f\x23\x46\xd4\xd4\x54\x25\xb3\x26\xa7\x5c\x1c\xb2\xf2\xa5\xcd\x8c\x12\xa6\xe7\x22\xf5\x7b\x95\xf4\x79\x0b\xd5\xf5\x5a\x34\x91\x8a\x4e\x07\x55\x47\x64\x59\x18\xb2\x10\x23\x07\xbe\x53\x2d\x53\x2d\xa8\x08\x0d\xd3\x74\x97\x1e\x05\x4c\xaf\x5b\x69\x9c\x04\x55\xa2\xf8\x90\x68\x21\xe1\xb8\x27\x09\x71\x4b\x7e\xb0\xa4\xb1\xd1\x92\x7e\x5b\x20\x8b\x2d\xf8\xaf\xbc\x60\x8a\x43\x7d\xe0\x99\x82\x7a\x7f\xeb\x95\xce\xdd\x3d\xd4\x57\xe2\xc0\x77\x0c\x75\x43\xf6\x8b\x56\xa0\x00\x06\x55\x3f\x84\xf2\xb5\x77\xc1\x78\x4b\x06\xc9\x5d\x76\x87\x35\xaa\xd1\xc5\xdc\x8c\xcd\x0d\x96\xc3\x45\xdf\x49\xe2\xb4\x85\x1a\x14\xf8\xac\x9e\x0e\x59\x92\xef\x53\x10\x15\x85\x44\x53\x65\xed\x32\xc4\xfd\x26\xc4\x0e\x02\x79\x3d\xf0\x9d\xec\xbc\x14\x31\xe7\xe5\x66\x76\xea\xc9\x6c\x42\x8a\x64\x5a\xf5\xae\x3a\x43\x37\x75\x33\x55\xea\xe0\x17\x92\xe5\x3a\x29\x48\x93\x1a\x4d\xa9\x9f\xd4\xf8\xce\x27\x24\xa1\xb3\x4a\x52\x43\xf0\x0d\xa4\x7c\x64\xcf\xb7\xf9\x07\xed\xf9\x36\xff\x98\xbf\x1a\xe1\x29\xb8\x5f\x93\x54\x6c\xe4\xfe\x89\x69\x5c\xd1\xb9\x4f\x58\xd1\x2b\x54\x85\x32\xc1\xaf\x80\xd2\xae\xca\x55\xa2\x48\x0c\xa8\x83\x0c\x31\x5f\x9e\x5f\x98\xb5\xc8\x73\x7b\x58\xdd\x2e\x25\x8d\xc1\x7c\x18\xa1\x91\x5e\x95\x09\x15\x94\xbe\x8c\x7a\x5e\xe9\xf1\x6d\xc0\x53\x00\x5b\x01\x8a\x30\x77\x10\xa2\xe6\x39\xab\xeb\x05\x99\x35\xe4\xd2\x59\x30\x64\xe0\x56\x17\x0d\x99\xfa\x61\x92\x54\x2f\x3b\xa8\x59\x86\x39\xfd\xac\x36\x00\xf6\x86\x76\x3c\x38\x05\xff\x31\xe6\x69\x3d\xf6\xe2\xf3\xc6\x85\xe4\x9c\x86\xb6\x19\x33\xe7\x75\xf9\xb5\x49\xdd\x3f\x65\xce\x58\x64\xe3\xac\x4f\x29\x0d\x8e\xac\x39\xcd\xa3\x95\xe9\x74\xd4\x18\xcd\x9c\x90\x90\x06\xd2\xcd\xac\x6f\x5f\xa1\x09\x6a\xa1\x69\x72\xa8\x4b\x69\xe7\x25\xe5\x31\x95\xe4\x53\xd7\xdc\x63\xb2\x59\xe5\x16\x11\x9b\xc5\x88\xc4\xb3\x62\x19\x68\x75\x0c\xdc\x41\x38\x0b\xe1\x56\xc1\xd5\xd8\x0e\x6d\x3f\xc6\xd4\xcd\x3c\xb6\x5d\x8f\xbc\xed\x62\xc4\x30\xec\xb0\xa3\x6e\xb3\x92\x04\x6c\x81\x78\xce\xc2\x63\x5f\xb4\x33\x49\xde\x06\x7e\x3c\x2b\x7c\xcb\x92\xdb\x42\xa4\x98\x64\x57\x28\x79\xca\x32\xc3\xc6\xda\x6a\x07\x99\x54\x4b\x69\xac\x6d\x89\xc1\x9d\x65\x83\xaa\x4c\xe6\x4c\x49\xd9\x97\x46\x81\x70\xb3\x14\x1c\xef\xa0\x26\x0d\x87\x2a\x85\x72\x63\x23\x85\x37\x3c\xe9\x09\xda\x21\xea\x19\x91\xed\x7a\xea\x4e\xb2\xd8\x60\x6e\x09\x56\xd8\x6a\x3e\xc5\xc6\xb6\xf8\xfe\x94\x32\xd4\x4a\x27\xd1\x6f\x3e\x53\xf8\xd1\x33\xc2\xfb\x20\xb8\x4d\xd7\x33\xd9\xcd\xdf\xce\xa9\x26\x8c\x0d\x7a\x3f\x13\xee\xa8\xe9\x73\x17\x35\x12\xec\x1a\xa4\x82\xaa\x27\x1c\xe9\xa2\xa9\xe7\xb1\x66\x28\xd4\xb7\xa4\x29\xcf\x94\x3d\xc9\xb2\x7d\xa1\xeb\x04\xb2\xbe\x18\x04\xb7\xfc\x36\x9c\x2e\x2c\x9f\x12\xfc\x28\x18\xfb\x74\x31\x26\xc6\x2d\x7a\xc5\xe3\xd0\xa3\x16\xf9\xc5\x29\xe8\xae\x4c\x43\x76\x7e\x57\x5a\xe9\x1c\xb0\x7d\x84\xe2\x3f\x77\x53\x83\xb6\xb7\xfe\x01\x9b\xbf\x8f\xab\xb2\x12\xad\x63\xb8\xf6\x0a\x87\xaa\x2a\x34\xd4\xf2\x53\x25\x86\x30\x76\xa5\x0c\x60\xca\xbf\x32\x74\xd8\xa7\x28\x2d\xd6\x1a\xa9\x81\x4b\xc3\xbc\x4f\x14\xb9\x61\x46\x6a\x0a\x44\x3b\x19\xbf\x84\x8b\x1f\x60\xec\x6a\x38\xb8\x92\x07\x6e\xfa\xbb\x7c\x14\x20\xcb\x61\x7a\x9e\x9a\x83\x49\x99\xb1\x0c\x3b\xaa\xb0\xa7\x54\x45\x4a\x4d\xd0\xcc\x9a\xc1\x98\x69\xcc\x8c\x8e\x48\x67\xdd\xd2\x64\xcd\x57\x10\x59\xe5\xc0\xa7\xe9\x5c\xba\x46\x54\x56\x37\xb8\x19\xad\x20\x1a\xae\xbc\x5a\x60\x2b\x14\x66\xb1\xe9\x17\x35\x9a\x15\x0d\x65\x9f\x16\x33\xc7\x2a\xe6\x20\x37\x66\xa1\xbc\xd4\x24\x56\xfd\x6e\xfe\xa2\x65\xb7\xdc\xa2\x65\xb7\xec\xa2\x65\xb7\xdc\xa2\xa5\xc0\xf1\x3e\xb5\x68\xd9\x9d\xbd\x68\xd9\xfd\x2b\x2c\x5a\xbe\xec\x52\xa4\xfc\x92\xe9\x71\xd1\xf2\x57\x59\xb4\x28\x56\x0d\xb3\x7b\x88\x6d\xf3\x92\xda\x38\xdb\xdb\x8f\x86\xcd\x72\x86\x0d\x6b\xd3\xb9\xcd\x9b\xbc\x69\x75\xe5\xc6\xcd\xcb\x47\xe3\x66\x7d\xc6\x0d\x1d\x90\xb9\x0c\xfd\x97\x98\x36\x2a\xa2\xbf\xb2\x63\x5e\x8c\xec\xdf\x28\x46\xf6\x4f\x03\xfb\x2b\x94\x05\xc0\xbf\x82\xef\xaf\x34\xd1\xbc\x27\x54\x74\xd4\x1f\x9f\x1c\x9c\x1e\x7c\x38\x7b\x7d\x76\x78\xf4\xe1\xf2\xf5\xd9\xd9\xc9\xe1\x9b\x9f\xcf\x0e\x4e\xe1\x2c\x79\x6e\x92\xf4\x04\xf6\xe0\x97\x83\x0f\x67\x19\x5a\xa5\x63\x11\xe8\x41\x0f\xcb\x87\x00\xc8\xcd\x9f\x40\x72\x17\x02\xab\x97\xc8\x3f\x13\xec\xbf\x04\x8d\xd9\x08\xff\x25\x88\x28\xa7\x29\x0b\x50\x02\x20\x6e\xe3\x1c\x6c\x3d\x4b\x58\x76\x16\xbb\xad\x62\xf1\x0b\x29\x14\x9a\x7d\x67\x87\x62\xe9\x32\xeb\x39\xe8\xa3\xe8\xe6\x6a\x03\x25\x87\x3c\x8b\xf4\xa9\x14\x0e\x60\xd9\x5e\x5d\xbe\x5f\x57\xd3\xb3\x2b\xe8\xdb\x0d\xee\xfd\x4f\xef\x26\x2f\xda\xb3\xb3\x20\xd6\x73\x73\x77\x83\xc0\x2b\x1a\xfe\xb9\x19\x01\x1e\x7e\x21\x7e\xc1\x70\x59\x28\x2b\xa6\x5e\x34\x54\x48\xb9\x17\xca\xb7\xd4\x68\xb4\xee\x17\xa2\xc3\xbf\x65\xfe\xe9\xbd\xb5\x85\xb8\x87\xf2\x37\x36\x90\x72\x12\xbc\xd4\x48\x64\x47\xd5\x0b\xd0\x10\xd1\x24\x38\xee\xc7\x92\x9c\xcc\x8e\x7c\x53\x62\xda\x2b\x1d\x49\xa2\x78\x78\x6e\xa4\x5d\x27\x97\x22\xc5\xcf\xb5\xbf\x80\xc0\xce\x0e\x38\x32\x73\xe2\x53\xdd\x3a\xac\xc4\xcf\x03\xb6\xaa\x34\xee\x2e\x17\xe6\x85\xb9\xf1\x20\x19\x6d\x8b\x45\x8f\x80\x07\x31\x71\xde\xd1\x3c\x34\x47\x92\x3e\x49\x4d\xfd\xec\xd8\x04\x2c\x6f\xc8\x04\x7d\x0e\x6f\xa4\x98\x02\x62\x26\x4f\x72\xf1\xdb\x5e\x6c\x4c\x9c\x5f\xc0\x50\xcb\x86\xa6\x48\x14\x10\x0f\xeb\x9f\xa8\x54\xfe\x86\xce\x4a\xfc\x89\x0f\x79\x8a\xdb\x97\x1e\xc0\xcf\x24\x1e\xe8\x6a\x3e\x08\xf9\xd6\x54\xd0\xe7\x38\x51\xc9\x30\xdb\x57\x85\x4a\xe9\x90\x24\x0a\x06\x05\x7b\x5f\x30\xf6\x45\x06\xe4\x2e\x05\x1b\xdf\x5c\x2a\x06\x86\x0a\x15\xcf\x30\x49\xc1\xf2\x2f\xc0\x3e\x97\x52\x35\x49\x32\x68\x80\x60\xc4\x42\x38\xbd\x63\xbb\x05\x34\x81\x9a\xfc\x5d\x30\xcc\xc3\x8e\xfe\x5e\xa4\x84\x90\xc8\x51\x1e\x74\xf2\x0b\x91\xee\x9d\x1d\x0d\xba\x81\x4d\x6f\xc6\xe8\x92\x52\x80\x62\x35\x6d\x11\xc3\x22\x91\xd9\x56\xe1\x31\x75\xa9\x19\xb6\x2a\x5b\x59\x05\xdd\x3f\xc8\x62\x35\xe8\xfe\x51\xbb\xbc\xc4\xd1\x4f\xd0\xfe\xe8\x15\xbc\x27\x43\x86\x83\x36\xc0\x8b\x07\x8a\xc7\x08\x62\x36\xc4\xb0\xd1\x13\x03\x2c\x19\x2b\xbe\x46\xbe\xbd\x0d\x46\x53\x30\x68\x51\xb3\xde\x78\x0e\x12\x79\x15\x6c\xe3\x78\x80\x43\x3c\x1e\xa2\xd7\xe3\x78\x10\x84\x11\xa5\xe2\x46\xa8\xef\x7a\x18\xb9\x11\x1a\x49\xc1\x29\xe4\xf4\x9e\xdb\x0d\xed\x70\x4a\x48\xb3\x92\x75\x9f\x09\x85\x7e\x88\x31\x8a\x82\x7e\x7c\x6b\x87\xb8\x85\xa6\xc1\x18\x42\x6e\x84\xd8\x71\x23\x76\xb3\x0a\xb9\x31\x8f\x71\x32\x0c\x1c\xb7\x3f\x25\x24\xdd\x18\x8d\x93\xeb\x9a\x38\x1c\x46\x9c\x8f\x7f\x7e\xf8\x19\xbd\xc7\x51\x84\x43\x44\xd5\xb8\x87\x8e\xc7\x5d\xcf\xed\xa1\xf7\x6e\x0f\xfb\x11\x46\x76\x84\x46\xe4\x4d\x34\xc0\x0e\xea\x02\x39\x92\xf1\x47\xc2\xca\x29\x63\x05\xfd\x18\x8c\x7d\x87\xf9\x5f\x31\x9c\xd0\x1b\x1c\x02\x76\xe8\x2e\x2f\x8a\x11\xb4\x50\x10\x12\x22\x86\x1d\x93\x0a\x84\xec\xfa\xae\x89\x6c\x7f\x8a\x3c\x3b\x4e\xb2\x96\x68\x90\xa4\xde\x70\x59\x94\x14\x33\x08\x46\x98\xa2\x16\xba\x31\xba\x75\x3d\x0f\x75\x31\x1a\x47\xb8\x3f\xf6\x2c\x42\xad\x3b\x8e\xd1\xaf\x87\x67\xff\x3a\xfa\xf9\x0c\xbd\xfe\xf0\x11\xfd\xfa\xfa\xe4\xe4\xf5\x87\xb3\x8f\x6d\x11\x8f\x05\xdf\x60\x4a\xca\x1d\x8e\x3c\x08\xd4\x42\x66\x71\x3f\x9e\xa2\xa0\x4f\x28\xfc\x74\x70\xf2\xf6\x5f\xaf\x3f\x9c\xbd\x7e\x73\xf8\xfe\xf0\xec\x23\xd1\x43\x3f\x1e\x9e\x7d\x38\x38\x3d\x45\x3f\x1e\x9d\xa0\xd7\xe8\xf8\xf5\xc9\xd9\xe1\xdb\x9f\xdf\xbf\x3e\x41\xc7\x3f\x9f\x1c\x1f\x9d\x1e\xd4\xd0\x29\x75\x5e\x20\xf9\x67\xb7\x79\x1f\x7a\x2f\xc4\xc8\xc1\xb1\xed\x7a\x11\x6f\x89\x8f\xc1\x98\xa1\x4c\xa2\x81\x7d\x83\x51\x88\x7b\xd8\xbd\xc1\x0e\xb2\x51\x2f\x18\x4d\x4b\x77\x2a\xa1\x65\x7b\x81\x7f\x45\xa3\xc6\xe4\x09\x24\x3a\xec\x23\x3f\x88\x2d\x14\x61\x8c\x7e\x18\xc4\xf1\xa8\xb5\xb3\x73\x7b\x7b\x5b\xbb\xf2\xc7\xb5\x20\xbc\xda\xf1\x28\xb9\x68\xe7\x65\x8d\x0e\xe6\x18\x46\x4d\x07\x19\x75\x8b\x2b\x0b\xe6\xa2\xfe\xd3\xd8\x85\x21\x65\xb2\x45\xda\xc8\xf6\x70\x1c\xe3\x96\x7c\x43\x7b\x3a\x22\x33\x88\x63\x87\xd7\x55\xb6\x4d\x02\xc7\xf7\x3b\x3b\x88\x62\x16\xd2\xf8\x29\xb7\x83\xc0\x53\x46\x24\x14\xc6\x75\x58\x6d\x30\x75\x42\x3b\xc6\x26\x53\x72\x22\x2e\x93\xce\x55\x9e\xb3\xc8\x99\x3b\x0e\x83\x1b\xd7\xe1\xab\xaf\x3b\x5a\x9d\x16\xab\x15\x73\x51\x2f\x26\x2b\x69\x33\x9e\xc2\xa2\x60\xbb\x1b\xa6\x85\x9c\xa0\x07\x50\xa4\xb5\x2b\x1c\xb3\x1c\x6f\xa6\x87\x8e\x51\x15\xb5\xa9\x9a\x9a\x79\x64\x77\x85\xf3\xc8\xce\xd3\xa7\xe8\x1f\xac\xdf\x10\xec\xba\xa0\x9b\xc6\x7e\xad\x51\x6b\x6c\xc0\xad\x6e\x9b\x82\x4c\x3b\x63\x28\xa5\x36\x74\xfd\xda\x1f\x11\x8b\xb3\x92\xe8\x3d\xa3\x67\x12\xdd\xb7\xbb\x3d\xa2\xb7\x3b\x2d\xf4\xa3\xdd\xc3\xdd\x20\xb8\xb6\xd0\xa1\xdf\xe3\x91\x7e\x40\xfd\x31\x7c\xf8\x5e\xe0\x60\x8a\x15\x0a\x65\x3b\x92\x46\xfa\xe9\xf0\x8c\xbf\x46\x7d\xa2\x49\xd8\x58\x26\x24\xde\x1f\xbe\x3d\xf8\x70\x7a\xc0\x94\x28\x1d\x97\x61\x10\xc4\xc8\x71\x43\xdc\x8b\x83\x90\x49\x7d\x52\x50\x1c\x62\x88\xe4\x43\x63\xbf\x0c\x3b\xba\xf9\xe7\xc5\xbe\x69\xf9\xda\x2f\x8d\x46\xc3\xb4\x46\xda\x4f\x7b\x64\x1e\x14\x73\xcf\x7f\x0c\xdb\xbc\xeb\x07\x21\x9c\x03\x74\x3b\x69\x88\xfc\xed\x86\x85\x3b\x95\x9f\x5c\x9f\xc6\x7a\xa2\x2d\x8d\x01\xb0\xe3\x6f\x95\x2d\x7b\xab\xd2\x46\x37\x6e\xe4\xc6\x88\x0d\xab\x3e\x6b\xbf\xda\x95\x1b\x0f\xc6\xdd\x9a\x1b\xec\x40\x67\xec\x38\x41\x2f\xda\x81\x8c\xdb\x0e\x26\x8d\x18\xd6\x06\xf1\xd0\x7b\xe5\xfa\x37\x76\xe8\xda\x7e\xfc\xfb\x64\xd7\xa9\x6c\xd9\x96\xd3\xa9\xb7\x9d\x1f\xba\x6d\x67\x6b\xcb\xc4\x5b\x9d\xca\xef\x93\xe6\xbe\x1d\x5e\x45\xe7\x17\x34\x05\xf6\x49\xee\x9f\x4f\x0e\xc5\xa6\xa1\x91\x20\xf6\x3b\x5b\x8d\x0b\xb3\xdd\xed\x50\x04\x68\xbc\x55\x11\x53\x5f\x7f\xec\x79\x68\x88\xa3\xc8\xbe\x22\x26\x23\x51\xa5\xf0\xde\x0f\xfc\xed\x21\xaf\x9e\x83\x6f\x10\xf6\x6f\xdc\x30\xf0\x21\x0e\x12\xc9\x0c\x19\x81\xf1\x88\xcc\x48\xc8\x76\x1c\x97\xb4\x9c\xed\xa1\x01\xf6\x46\xfd\xb1\x47\x14\xab\xef\xfa\x57\x51\xad\x62\xb6\xbb\x35\xdf\x1e\xe2\x4e\xe5\x90\xd7\x0b\xfd\xe2\x06\x1e\xcc\x29\x95\x76\xb7\xd6\x0f\xed\x21\x8e\xce\x82\xe3\x60\xd4\x69\xb4\x29\x6c\x75\xb7\xfd\x40\xe3\xfb\x74\xee\xdc\xe8\xa7\x60\xec\xc7\xd8\x69\x89\x01\x62\xde\x51\x03\xe0\x49\xe3\xc1\xc2\xfe\x7f\xc6\x78\x8c\x7f\x0c\xc2\x1e\xa6\xb8\xbc\x72\x3a\xf1\xfd\x04\x8f\x3c\xbb\x47\x8c\xf4\x9c\x04\xa7\x38\xce\x7e\x7c\x68\x0b\xa1\x88\x0d\xdb\xea\x5a\xd8\xbc\x4b\xae\x87\x74\xec\x36\x3c\xc0\x19\xc8\x24\xee\x74\xdb\xec\xd6\x4a\x3f\xea\xf8\xf4\x37\x8d\x81\x17\x76\xf0\xfd\x7d\xf8\x20\x63\xbc\xbb\x91\x8a\x73\xd0\xb9\x7b\x68\xcb\xdf\x23\xc6\x4e\x47\xb0\x63\x5b\x5d\xf3\x8e\x03\x8f\x3f\xe9\x74\x18\x1c\xb7\xbd\xb9\x99\xc0\x81\x2b\xaf\x89\x6e\x7a\xd2\xb1\x5f\xfd\xc7\xa8\xbc\x78\x56\x31\x5b\xec\xac\x4f\xe6\xab\x96\xaa\x3c\xc5\x55\x26\x15\xad\x70\x06\x2a\xa6\xca\x58\x3f\x69\x68\x89\x37\xd6\x2c\x29\xb2\x52\xa7\x70\xca\x15\x29\x3f\x21\x9d\x8c\xba\xf1\xf2\x0d\x2c\x68\xdd\x90\xce\xbb\x49\xb8\xee\x48\x35\x68\x13\xb9\xba\xed\x8c\xa5\xaf\x3e\xbe\x45\x37\xed\xdb\x9a\x04\x41\xde\x19\xb7\x87\xc6\xad\x25\xe5\x33\xdb\xb7\x35\x37\xa2\x30\xbb\x4a\xcf\x3d\xa9\x27\x52\x32\x59\xbe\x12\x84\xbd\x69\x67\x92\x61\x6f\xaa\xb0\x37\x69\x0f\x8d\xa9\xca\xde\xb4\x36\xf6\x23\xc0\x43\xbf\x74\xa3\xd7\xd1\xd4\xef\x65\x19\x9d\xb2\x0b\x4f\x9d\xcc\x58\x92\x2e\x1d\x8a\x10\xec\x0f\x6d\x18\x84\x7f\x76\xee\x7a\xe3\x30\xc4\x7e\xdc\x22\x32\xf5\x60\xbd\xee\xcc\x88\x59\x60\xbd\xe9\x24\x42\xd9\x11\x42\x79\x3a\x1d\x76\x03\x6f\x73\x93\xfe\x3d\x27\xb2\x50\xb9\x48\x3d\x1a\x15\x3a\x53\xb1\x2d\xbb\x8a\x79\x7f\xbf\x5f\x6f\xd4\x77\xad\xb7\x9d\xbb\x6b\x3c\x6d\x3d\xa9\x5b\x21\xee\x93\x3f\x97\x97\x11\xf6\xf8\x2f\x98\x20\x5a\x4f\xea\xb2\x44\xbd\xe3\x9d\x01\x41\x3b\xac\x5e\xe7\xee\xc1\x1a\x74\x48\x15\xac\x6b\xf8\xd3\x76\xfb\x06\x1d\x25\x5d\x93\xe8\x7b\x98\x9d\xe8\x30\x79\xd2\xe9\x74\x49\x1f\x6d\x6e\x1a\xd7\xf4\x97\x69\x49\x5f\xae\xf1\x74\x73\xd3\x18\x74\x2a\x95\x2d\x78\x30\xad\xae\xf9\x9a\x46\x6a\xe8\x5a\x8e\xb9\xb9\xf9\xe4\x6d\xaa\x49\x0c\xf2\xd6\xe8\x9d\x3b\x17\x9d\xee\xb9\x73\x61\x82\x18\xf6\xb3\x93\x4b\x93\x30\xd5\xe8\x74\x3a\x7d\xb3\x27\x3a\xa2\x83\xdb\xec\xd2\x89\xd1\xf8\xa1\x9f\x4c\x4e\x57\x1d\x00\x63\x31\xfa\xa6\xe5\x75\xea\x6d\xef\x87\x7e\xdb\xdb\xda\x32\xaf\xce\xbd\x8b\x84\xf2\xb9\xb7\xd5\xbc\x68\x4b\xc4\xae\x1e\xdc\xbe\x61\x6f\x6e\xda\xca\xd6\x44\xd2\x02\xfd\x8e\xfa\xc5\xea\x9b\xb4\xea\x9d\x4e\x87\x54\x80\xd7\xa3\x0f\xf5\xa0\xe2\x73\xf7\xf7\xbf\xd3\x4e\x6e\xbd\xb1\xc0\xda\xb3\x2d\xd2\x5b\x03\xe8\xac\x6b\x0b\xe4\xaa\xd5\xb3\x2e\x83\x5b\x1f\x87\xad\x3f\x6b\x4c\xa0\x1e\x92\x31\x7b\x40\xb4\x08\x25\xc6\xb5\x5c\x27\xab\xce\x3a\xc0\x37\x2f\xac\xd3\xe9\xbc\xa1\x13\xc5\x8f\x25\x04\xae\xe6\xc6\xec\xbe\xef\x3f\x57\x2f\x9e\xff\x5a\x9a\x24\x31\xf6\x6c\x8f\x53\xdc\x4f\x94\x0a\x8e\x7a\xf6\x08\x93\xe6\xa1\x06\xc9\x5d\x05\xa6\xfd\x16\xfc\xa9\x57\xac\x4a\x8b\xfd\x6e\x56\x1e\x58\x77\x54\xfe\x5e\xd9\x32\x2a\x95\x2d\xdb\xac\x85\x74\xe6\x33\x76\xce\x3b\xad\x8b\x9d\x2b\x4b\x56\xda\x6c\xe8\x77\xcf\xed\x8b\x07\x13\x34\xcf\x61\x67\xe7\xf7\x9d\xad\x9d\x2b\xeb\xdf\x9d\xf3\x0b\x69\x2c\xfd\x3f\x3a\x96\x2c\xc7\xbc\x73\xfb\xc6\xbf\xf9\x05\x58\xe0\xa8\xd7\xf9\x77\x6d\x14\x8c\x0c\xb3\xdd\xab\xd1\xb3\xd4\x8e\xdd\xee\x91\x61\x71\x1c\xe2\xbe\x3b\xe9\x74\xdb\x3d\xd8\x0c\xec\x60\x22\x86\x4c\x0f\x3a\xf0\x7b\xec\xc7\x9d\x7a\x9b\xc7\xdb\x78\x60\xc2\x44\xa9\x50\x19\xa2\x34\x5a\x5d\x60\xbc\x85\x2d\x96\xbf\xe5\x58\x90\xbb\x55\x97\x64\xe8\x3d\xa9\x94\xcd\x99\x80\x21\x6e\x4b\x7c\xb0\x17\xc0\x0a\xfb\xcd\xb9\x11\x8f\x94\xa1\x46\xfd\x25\xaf\xe3\xe6\xe6\xbf\x6b\xa3\x71\x34\x30\x6c\xf3\x21\x69\x8f\x9f\x92\xf6\xa0\x4d\xc0\x05\x95\x0c\xdf\x0a\x31\x80\xfb\xae\x8f\x1d\x22\x0a\xbd\xfb\xfb\x4a\x37\x08\x3c\x6c\x83\x64\xf4\x4c\x5b\x51\x3e\x9d\x4e\xc7\xbe\xbf\xaf\xd0\x3d\x5c\x9e\x9e\xee\x5b\xf2\xa7\x64\x38\xf4\x52\xd2\xff\xcf\xc2\xaf\xff\x32\xf9\x89\xb5\xe1\x90\xb9\x97\xa4\xe9\xbe\xaa\xd4\x2a\x5b\x1f\x0c\xdb\xaa\x9b\xad\xae\x69\x35\x40\x11\x0d\x3a\xf5\x76\xb7\x93\x24\x68\x75\xb7\x2a\xad\x0a\x61\x11\x14\x4c\xcd\x8d\xa8\xa2\xb1\x4d\x93\xeb\x9e\xeb\x4e\xbd\x7d\xfd\x83\xcd\xdd\xa1\xae\xb7\xb6\xcc\xbb\x5e\xc7\x3e\xbf\xbe\x60\xaa\xad\xbb\xf5\xc1\xe8\x59\xd7\x66\x7b\xb0\xd5\xf9\xc9\xe8\x59\x7d\x68\xae\x07\xae\xc8\xfa\x9d\x1f\x37\x37\xed\xf3\x1f\x2f\xee\xef\xed\xf3\xca\x3f\xfe\xc1\x07\x67\xe5\xc2\xd2\x8d\xa4\x3e\x14\x6c\x77\xfa\x54\xcb\xda\xa6\x45\x18\x78\x62\xf4\x3a\x76\xcd\x87\xd0\xfa\x66\xcd\x09\x7c\xdc\x36\x7b\x9d\x1e\x75\x7f\xb1\x04\x0f\x5b\x5b\xa6\xa5\x70\x01\xea\x54\x6d\x39\x03\x13\x6d\x6e\x5b\xff\x31\x2a\xbb\x8d\x8a\x55\x39\x67\xd1\x10\xe8\x54\x77\x41\x52\x6d\xe0\x57\x2c\x0f\x5d\x5d\x5f\xe3\x69\x84\xee\x2a\x5b\x6c\x36\x24\x8f\x86\x6d\xd6\xfe\x08\x5c\xdf\xa8\x58\xa8\x62\x6e\x55\x1e\x2a\x2d\x6c\x55\x2a\x26\xd7\x93\x68\x90\x48\xeb\x07\x6a\xd3\x95\xd2\x79\xcc\x98\x23\x65\xbc\xe2\xfa\x00\x26\x9e\x56\xb7\x16\x07\xd4\x2b\xc7\xd8\xdd\x37\x13\xea\x47\x94\x3a\x15\x77\xd6\x68\x5c\xdc\xad\xae\xc5\x64\x7d\x6b\x4b\x96\xea\x63\x65\xc6\xec\xf0\x91\x64\xf5\x3a\xd2\x30\x6a\xdb\x9d\xd9\x44\xdb\x69\xb9\x79\xf5\x3f\x86\x6d\x39\x16\xb6\x46\xb5\x78\x60\xc7\x2c\x6c\xea\x6b\x36\x49\x99\x2d\x56\xc1\xcd\x4d\x83\x4c\x04\x9b\x9b\x46\xb7\xd3\xdb\x32\x9e\x40\xb9\xf7\xf7\xdd\xcd\x4d\x98\x67\xc9\x60\x81\x36\xa8\x54\x5a\xa0\xdf\xa0\x0d\x84\x8e\x3b\xb4\x2a\x7f\x27\x8b\xa3\x1d\xd2\xf4\xe4\x3f\xd8\xb2\x3b\xd9\xa9\xa9\x06\x31\x67\xc8\xfc\xd4\x85\xf9\x89\xd4\xb3\xcf\xe6\x28\x9b\x01\x2f\xb0\x99\xca\xae\xd1\x1f\x0f\xa6\xe5\x70\x35\x20\x35\xf2\xff\x70\x35\x60\xf5\x68\xa3\x11\x93\xa0\x4d\xeb\x82\xc1\x42\x20\x5c\xe2\x7c\x0e\xdb\xdd\xce\xff\x33\xba\xd6\x00\x28\xb4\xa9\x3e\xb0\xef\xef\x89\x7a\xa9\x54\xac\x63\xab\x6b\xb6\xdf\x1b\x5d\xf3\x61\xd9\xc9\xa5\x1f\xda\x57\x74\xc2\xa2\x36\xdd\x49\xe7\xee\x2d\x0f\x15\x7e\x37\xb4\x47\x2d\x79\x9d\x41\x24\x40\x68\x27\x9b\x2b\x11\xbb\x4d\xa5\xe2\xfc\xa2\x4d\xfb\x12\x2c\x29\x92\x98\xcb\xb6\xf3\x60\xf5\x83\xf0\xc0\xee\x0d\x4a\x91\x23\x55\x07\x1a\x09\xa1\x74\x03\x1c\x89\x06\x60\xda\x5e\x33\x7b\xb1\x3c\xaf\xea\x2d\x96\x49\x91\xb0\x0f\xbc\x00\xf3\xc1\x8a\x03\x90\x46\x85\x08\x9d\x52\x59\x9d\xba\x94\x15\xbd\x88\xf2\x5a\x76\x1f\xac\xc0\xf7\x54\x2a\x44\x66\x5f\x51\x23\xa9\xf5\x1f\xa3\xd2\xd8\xdb\xad\x88\xf4\xf6\xc3\x83\x25\x8c\xf0\x56\x6c\x91\x25\x44\xf2\x3c\xb6\x84\xd5\x0e\x36\x7b\xf2\x65\x62\x29\x1b\x50\xad\x77\x96\x0c\xca\x98\x69\x61\xda\x39\x43\xe3\xee\xc1\xb2\x39\xb8\x2c\x1b\xb7\xd6\xa0\x43\x45\x7c\xe3\xba\xc3\x05\x5a\xb6\x7d\xef\x32\x36\xef\x80\xfe\xb2\xae\x3b\xc2\x54\x33\xdb\x19\xfb\xb7\x97\xd8\xbf\x84\x1c\x1d\x57\x64\x0e\x82\x25\x81\x62\x5c\x32\x6b\x37\xfb\xa5\x4d\xd4\xfa\x15\x31\x3b\x25\x0b\xfa\x4a\x6b\x41\x93\xb7\x86\x73\x7e\x75\xd1\x11\xe6\x68\xf7\xfc\xea\x62\x73\x53\x30\xd6\x7f\xd5\x3f\xbf\xba\x68\x91\xb7\xd4\x9c\xb9\x2a\x30\xb0\xaf\x4c\x47\x6f\x60\x5f\x99\x77\x7d\x66\x58\x5f\x99\x6d\x3e\xdf\x51\x03\xfb\x0a\x0c\xec\xbe\xc6\xc0\x96\x88\xf5\x1f\xf2\x8c\xe2\x44\xf3\xf4\x40\xf3\x0c\x98\xd6\x71\xb8\xbe\xb9\x7e\x78\x60\xdd\xfe\xa3\x0d\x7b\x60\x1a\x61\x7d\x57\xeb\xba\xbe\x43\x87\x8e\x6d\xb6\xbb\x40\xb4\x63\x4b\xf2\xa9\x02\x83\xb6\x0e\xac\x0d\xb6\xf1\xde\xaa\xd0\x1d\xc1\x8a\x75\x79\x79\x7a\xf0\xf6\xe4\xe0\xec\xf2\xf0\xc3\xd9\xc1\xc9\x87\xd7\xef\x4f\x2f\xdf\x1d\x5d\x7e\x38\x3a\xbb\xfc\xf9\xf4\xe0\xf2\xe8\xe4\xf2\xe3\xd1\xcf\x97\xbf\x1e\xbe\x7f\x7f\xf9\xe6\xe0\xf2\xc7\xc3\x93\x83\x77\x2d\x06\xcd\x48\xc5\xe1\x88\x1a\xf2\x16\x0d\x39\xd9\x1a\x3e\x3c\x58\xa7\x7c\x59\xd8\x0f\x31\xfe\x13\x1b\x77\xfc\xfc\xe5\xe4\xc1\xb4\xce\x3a\xa7\x9b\x9b\x27\xf7\xf7\xa7\x6d\x35\x36\x73\xe7\xec\xbc\xc2\xd2\x55\x2e\x5e\xc9\x0f\xad\x33\x4d\xbc\xe6\xbd\x95\x6e\x98\x22\x76\x2a\x8c\x7e\x79\x7d\x82\x0e\x3f\xfc\xfb\xe0\xed\xd9\xe1\xd1\x07\xf4\x74\x27\xa1\x3d\x0a\x83\x1e\x86\x80\x6c\x65\xf6\x57\x1d\x7c\x83\xbd\x60\x04\x3b\xc1\xdf\xec\xe6\xea\xc6\xc6\x06\x0b\xe2\x48\x6a\x5e\xc3\xfe\x4d\xed\xc3\xd1\xbb\x83\xcb\x83\x0f\xbf\xd0\xf0\x73\xc9\x2e\x72\x85\xba\x47\x26\xcd\x45\x9e\xab\x49\x2b\x57\xf9\x51\x20\x8b\x4c\xaa\x3f\x33\x7c\xb1\xcf\x66\x25\xb1\xf3\x99\x97\xf0\x39\x4b\x88\x87\xa3\x78\x4a\xa5\x2d\xef\xc8\xb4\xd1\x60\x69\xd9\x56\x64\x6e\xba\xa6\x4c\x93\x3b\x60\xe7\xa4\x86\x8d\x62\x30\xf8\x07\x98\x02\x90\x09\x47\x4b\x6d\xec\xdf\x3d\x76\xca\x71\x76\xf4\xee\xa8\x45\x9b\x9b\xb4\x38\x0d\xba\x85\xba\xb8\x67\x93\xb6\x72\x63\x74\x85\xe3\x88\x85\x8b\xc5\x0e\x72\xc6\xc4\x9e\x43\xdd\xb1\xeb\x39\xec\xfc\x05\x04\xee\x17\x76\xf2\xd6\x41\x55\x2a\x79\xd5\xb6\x08\x31\xf7\xeb\xeb\x93\x0f\x87\x1f\xfe\xd9\x42\xef\x8e\xd0\x87\xa3\x33\x34\xb4\x7d\x0e\xc6\x0a\xfc\xd0\xd2\xd9\xe0\x13\x52\xe6\x46\xc8\x46\xcc\x38\x11\xfb\xbb\x9f\x44\x3f\x18\xb5\x5a\xcd\xfc\x84\xc6\x11\x9c\x10\x82\x14\xd1\x9d\x6e\x10\xcb\x68\x1a\xc5\x78\x48\x68\xd9\xbe\x43\x4f\xe4\x2e\xc9\xd4\x78\x89\xba\x98\x17\x2b\xf2\xf5\x82\x30\xc4\xd1\x28\xf0\x1d\xa8\x9a\xdd\xc5\x1e\x80\xc1\x02\x2f\x87\x31\xb2\xbd\x5b\x7b\x1a\xd1\xb0\x85\x11\x13\xc4\x9d\x1d\x74\xc0\x42\xb8\x43\xfd\x6b\x3f\x32\x33\x86\x76\x98\x4f\xa6\x4d\xf8\xc0\xdf\xa3\x0e\x8b\xaa\x9a\xc9\xfa\xee\xe8\x27\x76\xa0\x73\x12\x04\x31\x91\xf1\x9d\x1d\xf4\xd3\x38\xb6\x63\xc2\xce\x90\x54\xc7\xa0\x83\xfa\xdd\xd1\x4f\x16\x1b\xdf\xaf\x4f\xce\xf8\xcf\x0f\x76\xec\xde\x60\xb3\xc5\x99\xc2\xa1\x4b\x0a\xb4\x3d\xe4\x07\xc1\x88\x11\x60\x53\xa5\x37\x45\x63\x9f\xb4\x99\x2e\xf9\x88\xf4\x61\x04\x97\x02\x68\xa6\xb7\xa7\x24\x19\x49\x77\xe4\x93\x9c\x0c\x1e\xf7\xf6\xf6\x96\x0a\x40\x54\x13\x7d\xfc\x63\x10\x5e\x63\x07\xf5\xc3\x60\x88\xfa\xdd\x3f\xa2\x1d\x26\xdb\x2d\xf2\x71\x10\xc7\xa3\xa8\xb5\xb3\xc3\x8e\x19\x7a\xc1\x50\x1c\x3d\xec\x40\xe2\xae\x17\x74\x77\xf0\xfe\x7e\xd7\x6e\xd6\x6d\xe7\x59\x17\xef\xed\xee\xe2\xee\xb3\xbd\xbd\xe6\x6e\xbf\xd9\xad\x7f\xff\xdc\x79\xd1\xfc\x7e\xb7\xb9\xe7\x7c\xef\xe0\xfd\x1d\x22\xcb\xf6\x15\x8e\x68\xde\x28\xec\xed\x5c\x5e\xf6\x83\xf0\x3a\xba\xbc\xe4\xc5\x26\x2a\x0e\x38\xef\x0d\x20\x1a\xbf\x1b\xa1\x5b\x38\x97\x85\x90\x8e\x81\x87\x6b\x24\x39\x44\x11\xc5\xb6\x43\xd4\x0e\x7f\x0f\xa2\x64\x71\xf9\x71\x02\xe4\x07\xf1\x80\x74\xc7\xed\x00\xfb\xa8\xca\x92\x55\x09\x45\x3f\x88\x51\x34\x1e\xd1\xf1\x91\x88\x6f\x88\x41\xc4\x21\xa2\x98\xdb\x77\x71\xc4\x44\xcd\xa1\x22\xbe\xbd\xbd\x4d\xfe\x9c\xba\x43\xd7\xb3\x43\x14\x07\x92\x86\xe9\x8e\x63\x44\x84\x15\x79\xc1\x15\x19\x04\x5c\x4d\xb8\x7d\x46\xc3\xa7\x87\x1a\xbc\xf4\x21\x8e\x93\x72\x7b\xb6\xcf\x0e\x9f\x1d\x42\xd5\x0b\xae\x90\x1b\x45\x63\x1c\xd1\x08\xbd\x62\x12\x90\x8f\x4e\xe0\x5b\x2f\x74\x01\xd4\x93\x50\x1a\xd9\xf1\x20\xaa\xa1\x13\x3c\x0c\x6e\x48\xc9\xa4\x58\x2f\xb8\xba\x22\xbf\x61\x7c\x91\xb1\x98\xe8\x5a\x95\x16\x8c\xb6\x6b\x8c\x47\x5c\xe3\x47\xf6\x10\xb2\xbb\x3d\x68\xcd\x7e\xe0\x79\xc1\x2d\xd0\x84\x2f\x40\x90\x96\x48\xc7\x16\xd8\x34\xc1\xed\x71\xe8\x06\xa1\x1b\x4f\x7f\x15\x5a\x52\x09\xa2\xfc\xd0\xde\xd8\x20\x1a\x9e\xc6\x49\x70\xfd\x58\x97\xae\x0f\x1e\x67\xdc\x53\x5e\x5c\xa1\xb9\xa4\xd7\xa6\xd2\x16\x18\xc4\x6d\x24\x2a\x93\x9a\x58\x90\xea\x25\x6a\xa0\x57\x34\x03\xbd\x68\x5c\x37\x2d\x74\x79\x0d\xd7\xce\x1a\x6d\xfa\xeb\x07\xf8\x4e\x1f\xe4\x0b\xc6\x70\x12\x06\x29\xd8\x3d\xe8\xc4\x30\xbb\x84\x10\xd2\x1b\x92\xd3\x3f\xe0\x05\x87\x57\x87\xbe\x83\x27\x48\x00\xac\xc0\x71\x22\x3b\x08\xeb\xa0\x2a\xab\x63\x0b\x55\xd1\x16\xa2\x95\x4b\xb6\xd1\xbe\x8b\x76\xae\x2c\xb5\x91\xd4\xeb\x04\xc0\x0f\x2f\x63\x6b\x8b\x97\xcf\x2e\x08\x48\x51\x5d\x99\x7c\xc3\x9c\x5a\x15\x5b\x46\x12\x72\x90\x3c\x7e\x0c\xc6\x9f\x74\xcf\x00\xa1\x38\x9c\x8a\xc4\x3b\x3b\x44\xdc\xd1\xaf\xd8\xeb\x05\x43\x88\x6a\xe7\xe0\xee\x98\x4a\x13\x55\x61\x30\x1a\x78\x5a\x10\x63\xaa\xcb\x6f\x6d\xa6\x76\x7d\x1a\xa6\xb7\x17\xf8\x37\xd8\x77\xb1\xdf\xc3\x28\x0a\xa8\xc7\x05\x77\x48\xa1\x67\x84\x64\x0e\x8b\x6d\x1e\xbe\x8f\x90\x8b\x03\xd4\x77\x7d\x87\x0e\x1d\xdb\xf3\x22\x37\x66\xbe\x1a\x30\xc5\x39\x34\x13\x1f\x63\x90\x3a\x24\x63\x94\xba\x07\x88\x50\xb5\xf4\x90\x32\x55\x55\xd4\xb3\x21\xaa\xcc\x84\xc8\xe3\x06\x82\xe0\xdf\x68\x96\xec\x8a\xf1\x6b\x21\x55\x3c\x49\x07\xd0\x37\x70\x1f\x49\xb4\x7b\xd2\xec\x69\x76\xaa\x9f\x18\xdf\x59\xa2\x16\xaa\xd5\x6a\xa4\xc3\xcd\x4f\x7c\xc2\x93\x75\x09\x91\x9f\x2a\x17\x2c\x2e\x96\x55\xa5\x0b\x01\xe2\x4c\xd0\x4d\x98\x50\x46\x51\xb3\xdc\x30\x6a\xa2\x97\x70\xfb\x90\xfe\xde\x46\x4d\x69\x20\x11\x12\xcd\x36\xfb\x49\x87\x12\x7f\x54\x6f\xeb\x8b\xe1\x04\x14\xb2\xe3\xa9\x99\x05\x57\x93\x15\x03\x0b\xd0\x2a\x9a\xd5\x42\xe7\xb4\xa9\x2e\x6a\xbd\xc0\xef\xd9\x70\x34\xad\x86\x5d\x68\x6f\x3c\xe4\xa9\xa3\xbf\x37\x50\x47\xf3\x9a\x59\x95\x8e\xeb\x90\x17\x70\x4e\x49\x8f\x14\x7f\x0c\xc2\x9f\xfd\x21\x3d\x2f\x16\x2b\x69\x1a\xa5\x5b\x72\x2e\x23\xdd\xf3\x21\x08\x46\x06\xb8\x3f\xf5\x0e\x45\x1c\x6c\x88\x01\x1d\x52\xdc\x42\xd2\x22\x77\x42\x3b\x48\x67\x6f\xa8\x83\xd4\x7c\xf2\xc1\x5c\x5b\xca\xc1\x8a\x67\xb7\x75\x64\x0a\x9b\x9b\x20\xa0\x22\x0c\xba\x7c\xaf\xe7\xfe\x5e\x4e\x0a\x47\xe7\x80\x32\x57\xa5\xab\x2f\xcf\x8e\xa2\x6a\x52\x0a\x93\x34\x7a\x41\x57\x2d\x72\x0b\x55\x6b\x44\x00\x93\x4a\x25\x1a\xa8\x64\xcb\x9d\x27\xe4\x2f\xd2\x7a\x4e\x16\x62\x3e\x3e\x58\x5c\xe6\xea\x77\x11\x18\x8e\x2d\xf4\xd6\xf6\xe9\x24\x4b\x8f\x38\x91\x8d\x58\x11\x08\xfc\xa0\xc6\x7e\x4c\x27\x3b\x56\x5e\x8d\x8e\x18\xd0\x4d\xe3\x88\x9a\xaf\x43\x6c\xfb\x11\xd3\x3f\x9e\x87\x1d\xf4\x5d\x64\x98\x28\xf0\x11\xd1\x46\x9c\x63\x3d\x09\x30\x6e\xfd\x60\x3b\x18\xd5\x7e\xf7\x7f\xf7\x8f\x3d\x6c\x13\xab\x84\x45\xbf\xc5\xc9\x24\x4b\x1e\xbe\x8b\x24\x22\x55\x59\x16\x52\xbf\xe5\x46\x66\x62\xbc\x40\x73\xf2\x38\xfd\x10\xb7\x38\x09\x14\xcd\xf9\x26\x1c\xd9\xdd\x28\x0e\xc1\x0c\x3d\x3e\x04\x36\x49\x8d\x69\x3b\xc2\xf1\x7a\xe2\x0a\x03\xa2\x41\x24\x9a\x16\xfe\x3f\xe4\x2b\x73\x35\x66\x81\x1d\x9e\x22\x88\xe1\x1c\x11\xd3\x0a\x9c\xf8\x82\x10\xac\x1a\x50\xcb\x50\x25\xd0\xd8\xa2\x72\x08\xd6\x0a\xc0\x7e\x6d\x43\x09\xff\x90\x88\xe1\x43\x6a\x1c\x80\x3b\x9f\x88\x1a\x7f\x8b\xd1\x2d\xb1\xb3\xe2\x00\xc5\x38\x8a\x39\x15\x1e\xe6\x81\x9d\x88\x3c\xa0\xb3\x70\x0c\x68\x7a\xac\x34\x8b\x1a\xf0\x28\x20\x5c\xde\xba\x11\x16\xc5\x87\x41\x8c\x7b\x31\x05\x04\x82\x88\xda\xbe\x0d\x01\x89\x9f\xee\x6c\x20\x94\x78\x89\x48\x73\x80\xca\x1e\x17\x60\xc6\x01\x5b\x27\x20\xf4\x00\x0e\xc9\xa2\x9d\xc0\x69\x21\x4a\xda\xba\xc6\x96\xe3\xd4\x39\x0f\x84\xb9\x4b\xaa\x79\x13\x10\x53\x1c\x2c\x55\x17\x9a\xeb\xda\x27\x33\xe8\xad\x1b\x0f\x28\xa1\x1e\x0e\x63\xdb\xf5\xe3\x29\x9d\x07\x6f\xc9\x0c\x80\xd1\xd3\xa7\x7e\x10\x3f\x7d\x4a\x6c\x41\x9b\x2c\x35\x50\x1c\xda\x7e\x64\x53\x9f\x2c\xc8\x48\x73\x7f\x0c\xc6\x68\x68\x4f\x45\x1b\x42\x20\x79\x3a\x89\x92\x22\xc9\x78\x20\x05\xb2\x28\xce\x64\xc6\x77\x30\x1e\xe1\x10\xd9\x64\x75\xc9\xbd\x51\x19\x27\xbc\x57\xab\x11\x0d\x57\x8d\x06\x76\xc4\xcc\x75\x07\x0c\xe1\x4f\xdc\xdd\xe3\x13\x58\x03\x3c\x7c\x3f\xef\x7c\x4a\x06\xda\x01\xec\x4e\xf2\x9d\xb6\x00\xfa\xa4\x8d\x8d\xfd\xc9\x02\xb2\xdc\x4f\x93\xa6\xa5\x54\x3e\x09\x6e\x7e\x75\x3d\x8f\x25\x07\x93\x35\xf9\xf2\xce\x75\xd8\x07\xb9\xfc\x79\x25\x90\x36\x0d\xed\xb7\x10\x53\xc7\x87\x94\x30\xbf\xe2\xc2\xf2\x00\xf5\xed\xda\xbd\x6b\xf4\x96\xaa\x19\xbb\x1f\xe3\x50\x1d\x10\x54\x20\xd2\x03\xe2\x15\x3d\xba\x7b\x90\xb4\x04\x22\x5a\x9b\xfb\x6c\x92\xd7\x44\xcb\x09\xb9\x64\xdb\x31\x94\x75\x32\xb8\x39\x41\xf0\x79\x96\xa5\x5a\xe3\xdc\x94\x2b\xde\x96\xa8\x41\x76\x1e\x43\xf9\x53\x5e\x55\x72\xc8\xa1\x96\x49\x6a\x3c\x30\xcf\xa9\x08\x11\x01\x64\x55\x02\x21\xaa\xa1\xd7\x74\xc9\x2e\x6c\xc2\x20\x94\x05\x29\x0e\xd0\x70\x0c\xd2\x46\x93\x27\x72\xcd\xfa\x24\x26\xcb\x71\xf4\x29\x09\x46\xfd\x89\xd8\x9f\xee\x90\xe4\xea\x7a\x58\x15\x3d\x1c\x62\xba\x12\x53\x20\xc3\xd2\xf9\xb9\x57\xb0\x3b\x1c\x62\xc7\xb5\x63\x2c\xa6\x1e\xc7\x42\x51\x40\x89\xd9\xbd\x1e\x8e\x22\xd2\x25\x6a\xd9\xb4\xc3\x59\x6f\xd1\xdd\x12\x1c\x0f\x02\x07\xc6\xa1\xf0\x92\xc1\x28\xf0\x1c\x8a\x4e\xb2\x66\xe1\x0c\x58\x2c\x6c\x22\x83\x1e\x8e\xa9\xf3\x1a\xfa\x80\x27\xb1\xd2\xa2\xdf\x96\x2c\x2b\x8e\x78\x45\xc2\x2c\x57\x7a\x51\xd9\x0e\xa5\xc2\xb4\xc2\x7d\x8a\x63\x62\x23\x44\xe3\x6e\x84\xe3\x94\x74\x83\xba\x03\x7d\x8f\x27\x6e\x14\x47\x62\xbb\xee\x72\x84\x61\x13\x8b\xf6\x07\x8d\x1c\xfe\x14\xf1\x0a\xb3\x8c\x23\xea\x70\x4c\xa8\x0f\x71\x08\xab\x30\x32\x9b\xc7\xf8\x8a\xcd\x07\x6c\x5b\xc1\xbe\xb1\x5d\x8f\x88\x3b\x5d\xb1\xe1\x11\xa5\x36\x12\x70\xed\xe8\x76\xe0\xf6\x06\x08\xa6\x69\xbf\x3f\x26\x72\x5b\xfb\xff\xec\xfd\x7b\x5b\xdb\xc6\x16\x28\x8c\xff\xfd\xe3\x53\xc8\x3a\xdd\x46\x2a\x83\x03\xa4\xb7\x48\x55\x39\x04\x48\x43\x73\x21\x05\x92\xb4\x9b\xcd\x8f\x8c\xa4\xb1\xad\xda\x96\x5c\x49\x86\xb8\xd8\xdf\xfd\x7d\x66\xad\xb9\xca\x32\x21\x69\xf7\x39\xef\x79\x9f\xb3\x9f\xdd\x60\xcd\xfd\xb2\x66\xcd\xba\x8f\x90\x27\x1e\x7f\x9c\x16\x15\x73\xac\xe1\x14\xa5\x93\x16\xf9\x66\xed\xa0\x60\x11\x5b\x13\xf2\x44\x3e\x39\x3e\x98\xff\x55\x80\x3b\xa5\x65\x9d\xd1\xb1\x01\xb7\x22\x45\xdc\x42\x18\xe9\x0f\x46\x94\xa2\x46\xfd\xbf\x0e\xd7\xaf\xff\x51\x60\x56\x46\xa3\xf7\x00\xb2\xb9\x08\x5f\x0a\xc7\x12\xa9\x0a\x18\xde\x58\x6a\xb1\xef\x53\x20\x69\xf9\xb6\x81\xed\x2d\x2b\x2b\x45\xd1\xc2\x52\x20\xe0\x89\x97\xef\xa9\x41\xe2\x02\xf1\xa8\x86\xad\x2d\x87\xc5\x1b\x23\x52\xa9\x2f\x16\xb4\xc4\x41\x6a\x23\x41\x19\xb1\x3b\x94\xa9\xa2\x02\x72\x3a\xfc\x97\xca\x29\x59\x9f\x17\x37\x64\xf6\x21\x3a\x7c\xbd\xe7\x60\x95\xf1\xd5\xc9\xfe\x42\xd3\x63\xe9\xa5\x25\x3a\x05\x22\x02\x54\x17\x8c\x8e\x9d\x22\x67\x42\x4e\x9e\xff\x01\x94\xa0\x10\x2d\x63\x63\xe2\x9d\x30\x80\x45\xd3\xaa\xd2\x89\x54\x6b\x8b\x45\x2b\xa5\x0c\xfc\xa7\x5a\x80\x7b\x8c\x74\x25\x23\x29\x96\xfe\x3e\xe4\xd1\xbc\x1a\xd5\x65\x08\xa2\x3a\x2c\xf3\x59\x57\xa1\xe0\x0e\xfe\xa1\x6b\xf0\x9f\xbd\x04\x3f\x35\x36\x10\x08\xf1\x25\x30\xc9\x4c\x3e\xc4\x72\x96\x3b\xd5\x3c\x4f\x86\x65\x91\x17\xb3\x6a\x3c\x47\x61\x30\xb0\x3f\x73\xe8\x91\xdd\xb0\x5c\x3c\x2a\x17\x33\x27\xa6\x75\x32\x04\x91\xeb\x00\xb8\x98\x9e\x03\x8b\x98\xd0\x5c\xe2\x5b\x4e\xb7\xa3\xdb\x11\xca\x58\x15\xc6\x40\x1a\x5c\xac\x0b\xfb\xc8\x12\xf0\x2c\x02\x5a\x5a\xe2\x02\x3e\x42\x39\x40\xe0\x1d\xc5\x73\x76\x1b\x82\x84\xe6\xd7\x51\x2a\xa7\xfb\x9e\xd7\xa4\x06\xee\x50\x28\x3f\x35\xdb\x21\xa6\xaf\x92\x60\x60\x25\xc1\x3e\x2d\x32\x8e\xb3\x72\xde\x1c\xda\xe3\xd7\xb3\x92\x39\x1e\xc8\xba\xcd\x55\xf1\x7b\xce\xc9\x4a\x2b\xca\xbf\x67\x36\x85\xab\x43\xc0\x96\x46\x86\x4a\x6c\xe3\x78\x15\x0e\xc5\x3e\xda\x3e\xbf\xa9\x58\xc5\x70\x1b\x95\x4c\x3b\xcd\xfa\x7d\x8e\xd6\x6b\xde\x1a\x68\x1a\x00\x3e\xbe\x56\xd7\x1f\xb8\x76\xa9\x79\xf3\x4d\x32\xa6\x06\xe0\x23\x9c\x97\xd0\xe3\x95\x1f\xe1\x98\xf5\x8b\x12\x41\xbf\x8d\x5b\x20\x40\xfe\x03\xb0\xe5\xec\xd6\xb1\x47\xcb\xb3\x24\x6e\x51\xcc\xc7\x9c\xf1\x46\x11\x58\xaa\x6c\x90\xe3\xa2\xc3\x40\xc5\xfe\xd8\x77\xd1\x42\xdf\x21\x9f\xba\x94\x0a\x63\x72\x35\x1c\x15\x47\x4a\xb9\x8a\x74\x96\x30\x27\x7f\xc8\x45\x26\x34\x41\xea\x42\xfb\x8c\xeb\xac\x92\xf0\xa7\xaf\x32\xcd\xee\xda\x8c\xf0\xd7\x8f\x5a\xf1\x96\x02\x62\x53\x20\xda\x7e\x0f\x21\x5a\xef\x48\x91\xb4\xb5\x38\x10\x2f\x0b\xd7\x0f\xc2\xbc\xad\x2d\x23\x3b\x81\x52\x8d\x6c\x74\x91\x82\x67\x04\xa4\x4e\x51\x4a\x89\xe4\x30\x85\xac\xa8\xa6\x23\xe4\xbb\x85\x89\x5d\xd1\x17\x4b\x01\xf5\xe2\x31\x03\x14\x22\x04\x20\x45\x69\x1e\x3e\x24\x91\x10\x3b\xdd\xdf\x44\x6f\xd3\x77\x02\x15\xf6\xcc\xbe\x29\xda\xbd\x21\xd6\x5e\xe0\xd6\xad\x6c\x5c\x0b\xff\x88\x00\xe1\x0b\xc5\x07\x30\x80\x7f\x4a\x74\xf0\x77\x05\x07\x5a\xa0\xf5\xb7\x84\x06\x5f\x20\x32\xf8\xfa\xb3\x0e\x9c\x00\x29\x21\x08\xe3\x58\xfe\xf3\x8f\x9c\xc1\x45\xdb\x6a\x08\xeb\x9c\x3d\xc8\x49\xc6\x04\xb1\x06\x73\x6e\x40\xd9\x11\x9b\x96\x2c\xe1\xf8\x81\x13\xaa\x95\xc4\xe5\xfc\xb7\x52\x4b\x02\xdf\xe2\x14\x39\xd2\x87\x59\x22\xf4\x40\xf0\xc5\x10\x33\x57\x59\x9e\xc0\x1a\xdf\x32\xe7\x16\x00\x74\x9c\x8d\x04\x2f\x22\x3a\x00\x27\x49\xe2\xdc\xb2\xcd\x92\xc1\x26\x0e\x0a\xa1\xc3\x99\x14\x37\x98\xeb\x14\x37\xac\x94\x18\x98\xb7\x36\x29\x52\x56\xe6\x4e\xac\x88\xd3\x9e\x73\x82\xfa\x5f\xde\x90\x83\xba\x01\x87\x72\x72\xae\x06\x6b\x16\x78\x1d\x96\x1f\xde\xac\xef\x64\x1c\xdc\x90\x3e\x41\x38\x7a\xa4\x54\x90\x6a\x50\x29\x4c\x34\x92\x3a\x1d\x2d\xfd\xbb\xdc\x54\x1f\x9b\xc4\xd9\x54\xbd\x4e\xe8\x88\x39\x15\xbf\x5f\xf9\x89\x18\x33\x38\x9e\x40\xbb\x25\x65\x06\x04\x03\xfa\xb2\x09\x66\x0a\xb4\x39\xac\x42\xa5\x2d\x48\x94\x6d\x18\x44\xd9\x2e\x6f\x6b\x5a\x02\x8d\xe2\x4c\xd8\xa4\x28\xe7\xce\x98\xd1\x51\xd5\xdb\x14\xcf\x2c\x95\x16\xb7\x7b\x69\x33\xa4\xc4\xd9\x3c\x63\x7d\x30\xf3\xc2\x4b\x15\xe4\xd1\x1c\xc7\x55\xcc\x20\x44\x84\xde\xdc\xab\x18\xc3\x91\xdc\xa7\xe8\x47\xcf\x42\xd4\x45\x3f\x7a\xbc\xf7\xf8\x3b\xbf\xb7\x79\x85\x4a\x16\xb9\x82\x7c\xe9\x25\xf4\x64\x45\xde\xa6\x3c\x43\x92\x0f\xe5\xdd\x59\xde\x2f\x24\x87\x22\xec\xbb\xb0\x0d\x65\x97\xd7\x72\x1e\x88\x63\x36\x21\x15\x07\x03\x56\x07\xad\x9a\xd3\x36\x6d\xde\x57\xbb\x4d\x75\x02\xb8\x85\x6b\xb0\xcf\x72\x67\x3a\xa6\x59\xee\xfc\x42\x6f\xe8\x39\xec\xa2\x0d\xe0\x3d\xe7\x5f\xd5\x26\x4e\xe0\x72\xe7\x4a\xfc\xd8\xbd\xb2\xe2\x99\x03\x3d\xab\x94\x55\x5a\xb3\xa5\x55\xb6\xb0\x72\x4a\x1b\xd7\xcf\x81\x83\x04\x2d\xbf\x09\x8a\xa6\x76\xd1\xce\x69\x5a\x31\x62\x0b\xc6\x5b\x3f\xeb\x76\x44\x94\x24\x8d\x9e\x2e\x31\xf9\xca\xd4\xa0\x19\x0a\x84\x7f\x88\x1f\xb4\x8c\x54\xef\xe7\x09\x1f\x3d\x72\x8e\x66\xd3\x71\x86\xbb\x02\x14\xe3\xa1\xd1\xea\xff\x87\x79\xc6\x55\xee\xf9\x68\x36\x99\xcc\xc1\x6e\x62\xc3\x4e\xd3\x47\xc3\x89\x9c\x96\x03\x83\x56\x65\x53\x73\xd5\xdf\x18\x35\xac\xed\xb0\xda\xe2\x04\x73\xb3\xfb\x70\xa3\xbd\xa1\x9e\xad\xc5\xb4\x1a\x05\x8b\xa9\x03\x20\x8c\x68\xee\xb0\x8f\x75\x49\x1d\xdd\xcf\x1f\xb3\xc9\x54\xc2\x51\xc5\xc4\xe1\xae\x7a\x1b\xc2\xae\xcf\x6b\xef\x8f\xb4\xcd\x74\xfd\xe8\xda\xbc\x2b\x95\x9a\x4c\x2f\xb6\x6d\x26\xfd\x7f\x61\xb3\x1d\x36\xc1\xd0\xc5\x5a\x29\x13\x9e\xec\x35\x7c\x00\x40\xad\x69\xaa\x01\x51\x76\xb3\x7f\x0f\xa4\xd6\xf4\xb8\x0e\xa6\xd6\x0d\xf0\x7e\x9f\x58\x05\x5e\xeb\xaa\x8b\x97\xec\xa3\x95\x6b\x6b\xbd\xd7\xac\x45\xa6\xbd\x60\x6c\x5a\x71\x22\x3d\x19\x29\xb1\xa3\x60\x0d\xc1\xe0\xdb\x90\x9e\xd8\x19\x52\x09\xac\xf9\xf9\xdb\x61\xa1\x98\x88\xdb\x1c\x82\xaa\xa8\xcc\x0a\x49\x28\x8a\x4c\xb6\x36\x43\x8c\x19\xea\xd7\xc5\x26\x49\x72\x4a\xe9\x8c\x4d\x63\xee\xa6\xc2\xd8\x96\x7a\x3a\xff\x13\x76\xad\xf9\x3c\xbf\x92\x88\x4a\x0f\x61\xe0\xf7\x60\x05\xc0\x1d\xc6\xba\xfb\x54\xf4\xe1\xb5\x8e\xc3\xa1\x8c\xd0\x23\x9c\x5b\x14\x29\x5b\x53\x14\x5f\x43\xf7\xc2\xae\x1d\x18\x52\x08\x65\x52\x1b\xb2\xa7\x1c\x0c\x35\x45\x7d\xde\x5a\x5e\x94\xce\xb4\x18\xcf\xfb\xd9\x78\x4c\x78\x51\xce\x3a\x21\xe5\x80\x6e\x76\xc0\x6b\xf3\x7e\xc0\xde\x8e\x95\x60\xaf\x92\x27\xac\x87\xeb\x74\x7c\x70\x78\x71\x7d\xfc\xf2\xf8\xd5\xf1\xeb\x8b\xeb\x8b\xdf\xdf\x1c\x83\x51\x8a\xe5\x83\xd3\x64\x83\xbb\x5d\x91\x71\xc9\x29\xf8\xcd\xab\x95\x04\x6f\xd3\x72\x23\xdd\x04\x0b\x8f\x9d\x8f\x8c\x26\xdf\x8b\x95\x3b\x3b\x3e\x3f\x3e\x7b\x77\x7c\x74\xfd\xe6\xec\xf4\xcd\xb9\xd8\x1b\x88\x95\x2f\x83\x6a\x95\xac\xaf\x3f\x84\x33\xb4\xf9\x8d\x2e\xd1\x90\xa2\xf6\x43\x58\x1e\xf3\xe5\x7e\xc1\x24\xa5\x75\x3e\x2c\x6e\xf3\xb0\x99\x7f\xc6\xfa\x76\xbe\xc6\xc0\x43\x8a\xfe\x05\x67\xac\xef\x25\x45\xde\xcf\x06\xa6\xb9\x0c\xbc\x7d\x6b\xed\x2a\xba\x75\x60\x49\xd0\xca\xf4\x37\x7d\x3b\x7a\xbf\xe0\x03\x14\x7c\x0c\x58\x6d\xd4\x3f\x62\x48\xa4\x17\x65\xa3\x11\x5e\x4e\xd2\x6c\xbc\x5b\xd1\x4c\xb7\x2b\x1a\x94\x12\x5c\x31\x91\x96\x58\xbe\xca\x0a\xc0\x20\xfb\x36\xf0\x3f\xe9\x94\x0a\x3d\x72\xa4\x0f\x86\x7a\x06\xad\xb8\x6c\x59\x92\x17\x6c\xfe\x25\x4b\x32\x62\xf3\xbf\xbf\x24\xd0\xc8\xff\xc2\x25\x19\xb1\xf9\x7d\x4b\x82\x89\x2f\xd8\x9c\x8f\x59\x74\xf7\x33\x8c\x41\xde\xd9\x86\xd9\x13\x8e\x43\x5a\x34\x1d\xc4\xc5\xac\x3e\x90\x12\x6a\x34\x6e\x5a\xe5\x1b\xc0\x74\x6e\x3d\x44\xeb\xa9\xad\x2f\x63\x58\xe1\xb4\xdb\x31\x05\xce\x87\x11\x9b\x7f\x50\xda\x3a\x20\x12\x7a\xce\x45\x39\x17\x3c\x30\xf2\xa9\x4a\x68\x21\xde\x14\x00\x3e\x2d\xcb\x9d\x0f\x6a\x6d\x3e\x08\x5c\x8c\x4b\xc8\x52\xc0\x5b\xf3\x62\xe6\xe4\x0c\x31\x9c\x68\x48\x19\xec\x42\x13\x20\x9a\x05\x91\x90\xd0\x4d\xc1\x25\xa3\xf1\x3e\x81\x26\xc4\xad\x30\xa5\x38\x10\x30\xe2\x54\x62\x5c\x6c\x08\x87\xed\x49\xd6\xb1\x1f\xf7\x26\x0c\x99\xc5\x6d\xb1\x3a\xdb\xe8\x33\xb6\x69\x6f\x8b\x65\xa6\xe7\xb4\x6f\x4e\x03\xa4\x8c\x35\x6d\xe7\x17\xc5\xee\x03\xbc\x4a\xe6\x10\x58\xc3\xd6\xd6\x91\x91\x46\x90\x9b\x95\xfc\x2a\x17\x38\x0d\x19\xb4\x55\x88\x3b\x63\xfd\xbf\x0b\x71\x67\xac\xff\x20\x88\x6b\xe0\xc8\x56\x88\x6b\x94\x79\x08\xc4\x95\xac\xff\x7f\x21\x6e\x2d\xc4\x9d\xb1\xfe\x97\x42\x1c\xbf\x34\x3e\x01\x71\x67\xac\xff\x69\x88\x93\x92\x5e\x74\xd1\x93\x1a\xb2\xba\x70\xd0\xc3\xc4\xa1\x40\x45\x8b\xc8\x50\x78\xc5\x0b\x29\x70\x5e\x38\xe3\x22\x1f\xb0\xd2\xa1\x29\x27\x5a\x2a\xa1\x63\x80\x95\x06\xae\x7d\x0a\xb1\x5b\x73\xe2\x54\x85\x70\x89\x00\x79\x10\x6f\x50\xca\x72\xb3\xba\xe7\x1c\x8c\xab\x82\xf0\xe6\xa4\x62\xbe\xe8\xa3\x65\x23\x08\xf3\x38\x60\xdc\x16\xe5\x48\x89\xdd\xc0\x06\xcf\x91\xfe\x88\x4e\x3f\x63\xe3\xd4\xa1\x03\xca\x6b\x0b\xd2\xa4\xd7\x2f\xca\x55\xba\x84\xf7\x29\x9b\xcd\xfa\x20\x2e\x46\x1f\x0d\x30\xae\xc4\x29\x0a\x7a\xac\x29\x78\xfd\x7a\x09\x54\x52\x23\x69\xc4\xe6\x66\x0a\x2a\xe6\x17\xd2\x64\xa0\x64\xfd\x46\x79\x4e\xd7\x38\x07\xce\xd7\x35\x9b\x4c\x8b\x92\x96\xf3\xaf\x85\x60\x03\x85\x94\x35\x4b\x6a\x47\x58\x28\xdd\x02\x19\x08\xfa\xcc\x0f\x0e\x0a\x22\x35\x50\x0a\x55\x16\x73\x3e\x00\x7d\xfd\x01\x85\xe1\xe8\x56\x64\x39\xda\x82\x20\x18\xe4\xc3\x44\x99\xbf\xdf\x22\x5d\x4d\xd1\x76\xb8\xc7\x39\x3d\x29\x5d\x1f\xb0\xda\x29\x33\xf0\x6b\x41\xc2\x9d\xe6\xa9\x94\xfb\x39\x38\x3b\x3c\xd1\x15\x6a\x86\x68\x59\x16\xb7\xa0\x5b\x13\xe8\x45\xe8\xb8\x68\x05\x90\xc1\xff\x8a\x19\xf0\x54\xd1\x64\xc9\xd4\x31\x25\x82\xda\x95\xea\xc0\x1c\xe0\x47\xfa\xde\xe4\x4e\xcc\x86\xf4\x26\x2b\xca\x5e\x73\x1d\xd1\xcd\xef\x80\x73\x0e\x79\x21\x83\xc3\xa2\x9e\xc4\xa3\x69\x8a\xec\x27\x45\x85\xc2\x34\x1b\xa3\x8d\xa8\x32\xc3\xf4\x01\x00\xf2\x94\xb3\xd2\x60\x34\x91\x8d\x59\x0e\xc3\x19\x67\x39\x73\x64\xa0\x5d\x11\xa0\x12\xaa\x81\xc0\xad\x9c\x50\xa9\x9b\x30\x47\x03\xf3\x6a\xa4\xc1\x29\xdd\xb0\x39\x0f\x93\x59\x91\xfb\x63\x62\x66\x64\x09\x47\x6c\x4e\x38\xe8\x10\x80\x16\x22\xe6\x4a\xb0\x17\xa1\x49\xd4\xf8\x9e\xa9\x76\x10\x13\x48\x6f\x08\xce\x63\x50\xf0\x9a\x99\xa1\xaa\x29\xcf\xfe\x9c\xb1\xf1\xdc\xc9\x52\x96\xd7\x59\x7f\x8e\x4a\x14\xba\x02\xf8\xd0\x8a\xf2\xf5\x6d\xe5\x18\xc8\x86\xec\xea\xe9\x2c\x1b\xd7\xdb\x59\x6e\x9a\xf8\x00\x8c\xc5\x0c\xf6\xbf\x40\xb4\xcb\x8c\xa6\x31\x7c\x22\x4c\x15\xbe\x81\x0d\x18\xc9\xab\x11\xf8\x80\x52\xa2\x2d\xf4\x27\x16\xca\x53\xd5\xe9\x19\x4b\x8a\x32\x6d\x30\x94\xe8\x8e\x57\x65\xf1\x18\xad\xa0\xe1\x14\x28\xb5\x3f\x53\x87\xda\x71\x1c\xe1\x9d\x2c\xb7\x4d\xb8\x60\x18\xcb\x07\x5a\xe4\x0c\x03\x85\x3a\xfd\x31\x05\xfc\xa0\xf9\x50\xb0\x7d\xc8\x6e\x18\x9c\x9c\x29\x2a\x79\x8a\x5c\x56\x47\xe9\x00\xec\xb8\x13\xd3\x64\x84\x32\xca\xa2\x64\xc6\xf9\x83\xc3\x87\x8e\xc5\x46\xac\x48\x84\xdf\x9e\xb5\x8d\x42\x8f\x2d\x8e\xa0\xd0\xc7\x52\xe7\x3d\xa3\xa3\x57\x74\xea\x14\x68\xc4\xc4\xe6\x70\xaa\xb2\xc9\x14\xe7\x09\x02\x65\xd9\x4e\x52\x4c\x26\x85\x72\xc6\x5b\xe7\xcf\x85\xdd\xca\x75\xba\xc6\x11\x0b\x13\x11\x39\xa0\x02\x15\x0f\x7c\xd1\x69\xa9\x5c\x71\x04\xdc\x54\x0e\xa3\x55\xc6\x4a\x14\x83\xb0\x0a\x16\x7f\x3a\x2b\xa7\x45\xc5\x2a\x50\x94\xf0\xca\xb2\xad\xba\x65\x91\xf3\x22\xdf\x66\xf9\x6c\xc2\xe0\x9a\x72\x3c\xc4\x80\xd3\xa2\x82\x5d\x25\x42\x31\x8a\xb7\xb5\x6c\x27\xcb\x93\xf1\x2c\x65\x0e\xbb\x61\xe5\xdc\x8a\xed\x77\xcb\xc0\x22\xa3\x16\x7a\x0f\x5f\xe0\x3f\x86\x97\x07\xc4\xe9\xe3\x97\x8a\x6a\x68\x90\x17\xfc\x06\xcb\xc4\x06\xb4\xdf\xbd\xf6\xfa\x10\xa0\x30\x32\x50\x6c\x6f\x12\xd3\xd3\xc9\xb8\x6c\x45\x98\x68\xcc\xd2\xd3\x6b\x64\xdc\x96\x59\xad\x2f\x67\xa2\x58\x27\x7c\x36\x8e\x97\x34\xa4\xf8\x30\x60\xb8\x4a\x38\x56\x15\xb8\x90\x03\xc0\xd1\xf1\x3b\xd4\xc9\xea\xe3\xf8\x80\xd9\x10\x67\x13\x18\xee\x7f\x6c\x0a\x56\xb2\x98\x03\xef\xa0\x39\x85\x8b\xdb\x42\x42\x5c\x25\xa8\x0d\x74\xfb\xbe\x2d\x8c\xbb\x4e\xdc\x87\x82\x4a\x8b\xd1\x13\x33\x4b\x59\xc9\x14\x14\xb0\x3f\x67\x74\xdc\x0a\x78\xc2\x18\x83\x95\x60\xb4\xc1\x81\x62\x98\xa5\xe0\xa4\x0c\x57\xa8\x98\x8c\xb2\x57\x7f\xc0\x42\xc1\x6a\xff\x77\x97\x0a\xba\xb0\x16\x8b\xd3\xea\x56\x3c\x02\x4d\x9d\xdb\x61\x0a\x24\x80\xe2\x2d\x11\xde\x57\xc6\xd2\xb9\x68\x7e\x58\xe4\x5a\x82\xbf\x43\x41\x09\x02\x31\x80\x7e\x81\x9a\x28\x94\x37\x99\x0c\x19\x9d\x41\x5c\xe2\xf9\x14\x15\xcf\xe7\x8c\x29\x67\x5e\x20\xc7\xfe\xa8\x20\x26\x2f\xc4\x0b\x45\x0a\x9a\x4e\x33\x88\x15\xfa\x3f\x10\x04\xd4\x65\x61\xaa\x70\xec\xf0\xb5\x78\x51\x4a\x59\x81\x94\x55\xea\x4b\x91\xcf\x1e\x7d\x84\x36\xc4\x8d\x01\x31\xd5\x53\x30\xff\xad\xe0\xa8\x80\x04\x57\x78\x60\xc8\x2a\x95\x46\x78\x10\x14\x0a\x58\x75\x08\x6f\xb5\x21\x1f\xd9\xeb\x37\x52\xe0\x14\x36\x92\xf0\x3c\xca\xc4\x0d\xdc\x3d\x1c\xac\xd3\x91\x36\x24\x96\x2c\xa5\x29\x80\x32\xdd\x93\xfa\x28\xb4\x17\x62\x9b\xa6\xb7\x5d\x8b\xa8\x46\x57\xc6\x09\x6c\x82\xdf\x94\x92\x72\x58\x1e\xa4\x62\xf8\x22\x17\xe5\x6e\xb6\x27\xa1\xb3\x0f\x03\x76\x02\xbb\x10\xb6\xa2\xa6\xaa\xf3\x44\xca\xa7\x9a\x80\x62\xa1\xbe\xd1\x27\x34\x03\xe6\xc7\xa0\x23\xf8\x2e\x21\x29\xc7\xd9\x3b\x80\x37\xdc\x24\xbc\x27\xa1\x2e\xa8\x32\xe5\x6e\x83\x4b\xb2\x21\xae\x7a\x88\xb0\x4a\xd6\xf5\x9d\x6e\xd7\xe9\xd8\x72\xca\xa6\xb2\x53\x95\x35\xe5\x4c\x30\xa4\x4b\x99\x75\xa5\xd6\x42\x27\xb5\x49\x9f\x10\x2c\x65\xd0\x22\x79\xcb\x43\x2c\xed\x7a\x08\x6e\x66\xda\xc5\x52\x1a\x94\x15\x15\x22\x79\xa0\x69\xfb\xac\x2c\x59\xea\x14\x39\xe7\xb8\xe4\x85\x9a\xb3\xdb\xf1\x1c\xa8\x3e\x54\x11\x99\xcb\xd5\x13\xd0\x29\x0f\xcb\x4b\xf0\xbb\x6c\x71\xc5\x74\xb6\x9d\xbd\x50\x02\x6d\xa3\xb0\xf9\x90\xa2\xad\x27\xe0\xf3\x56\x2a\x03\xf5\x54\x5c\x4b\x1b\x3f\xe9\x16\xd4\x70\xc0\xe9\x53\x39\x7f\xda\x15\x04\x96\x6a\x7d\xa0\xd9\x2a\xd8\x78\xa9\x59\x37\x8c\xcf\xab\x69\xbf\xcf\xcc\xd9\x72\xf6\xae\xcc\x83\x64\x02\xcb\x1a\x2c\xdb\xc4\xa1\xba\x79\x7f\x75\x7f\xd7\x2d\x0e\x94\x0f\x0d\x00\x38\x63\x55\x31\xbe\xd1\x9a\x35\xc1\x34\x28\xbf\x6a\x0e\x94\xab\xe1\x87\x8c\xe5\x6b\x3c\xc7\xb1\x1a\x90\xa8\xfd\x94\xb4\x35\x27\xdf\xb8\x6f\x80\x73\xbb\x57\x71\x1b\xdc\x9b\x8d\xde\x0f\xfd\xa6\x24\x99\xe3\xa8\xc5\x82\xe3\x39\x7b\x20\xd2\x3e\x0f\x16\x52\xb1\xfa\x91\xed\x5d\x0e\x26\x7a\x76\x89\x4e\x14\xb5\xf2\x2c\xcd\xa7\x2e\xed\xd7\xe7\x44\x65\xd4\x1a\xda\xea\x8f\x7d\xb1\xaa\xb6\x57\x2b\xa4\xe5\xe2\x63\xf3\x6d\x0e\xe6\x6e\x9b\x0e\x32\x36\xda\x26\x43\xcc\xd0\x7e\x37\xf0\xf3\x64\xc9\xab\x4f\xfe\x61\xb3\xd6\x8a\xe9\x66\x1f\x2a\x30\x6c\x7b\x49\xd0\x59\x95\x8e\x9b\x37\xfc\x27\xf8\xd3\x15\x1d\x9c\x0c\xb6\x25\x79\x56\x53\xda\x74\x26\xc9\x08\x6d\x9e\xca\x59\x23\x61\x96\x5a\x35\x38\x0b\xb0\xee\xf8\xdb\x84\x05\x5a\x27\xcd\x45\x58\x20\x4d\x5a\x8c\x8b\x9c\x1d\xe4\xa9\x70\xe6\xe1\x37\x69\x31\x96\xe1\xa6\x08\x47\xaa\x2f\xe4\x0e\x72\xc0\xc9\xd9\xad\xe6\xdd\xad\xe5\xd1\xb5\x30\x32\x96\xa8\x4a\x1c\x23\x03\xd6\xcd\xf8\xbe\xc6\x35\xb4\x52\x24\xbf\x6f\xa4\x09\xde\xdf\x48\x92\x4b\xaa\xb7\x4a\x0f\xcc\x5c\xe8\xc3\x31\xdc\x25\xf7\x52\x6e\xe0\x87\xa3\x24\x09\xb4\x92\xb6\xff\x25\x92\xd2\x45\x86\xe2\xb0\xcf\x5b\x72\xde\x6f\x3b\x29\x67\x04\x7e\xd3\x94\xf5\xc3\x89\xb9\xd3\x32\x1b\x64\x9c\xbb\xc6\xeb\x8d\x5f\x89\x49\x31\xcd\x56\x28\x39\xa9\x7b\x87\xf7\x34\x57\x57\xed\x61\x64\x21\x92\x50\xb2\xba\x20\x9f\x34\x29\xc8\xf4\xb6\x0a\xb3\x89\x73\x4e\x41\x81\xfd\xbc\x6c\x1c\xac\x12\xd1\xcd\x40\xea\xc2\x55\x66\xcf\x26\x23\x99\x09\x15\xb2\x41\xa4\xa8\x5a\x9a\x34\x17\x12\xd4\xbe\xf9\x38\x1b\xb1\xf1\x5c\x58\x70\xd7\xb4\x1c\x30\x61\x88\x41\x05\x91\xa0\xc4\x61\x92\xa8\x80\xe7\x95\x70\x39\x2b\xa3\xa3\x22\xa6\x31\x27\x25\x9c\x18\x35\x6e\x42\x56\x56\x94\xda\x15\x17\x9a\x9b\x31\xa5\xf9\xb7\x69\x5f\x66\x43\xb3\xda\x3b\x58\x01\x29\xed\x53\x13\x22\x7c\xec\xac\xaa\x60\x55\xb3\x0a\x2c\x30\xcb\x2c\x4d\x59\x2e\xda\x2d\x84\x4e\x9f\x59\x07\xe2\xef\x12\xd7\x7c\x75\xb3\x31\x0a\x75\xaa\x9a\xd1\xb1\x30\x67\xe9\x6b\xf9\xea\x94\x96\x4a\x6e\xb4\x8e\x1a\x77\xd4\xf0\xd6\xa2\xc0\x7f\x98\x6c\x5f\x47\x32\x8b\x75\x63\x68\x2c\x2b\x33\xab\x56\x72\x41\x33\x96\xcc\x40\x5a\x9c\xe2\x30\xbf\x5b\x29\x0f\xa7\x49\x77\xac\xad\x61\xce\xfb\x7f\x3f\xad\xae\x41\x65\x1d\x85\xc3\x5b\xb6\xe6\xd6\x59\x47\xff\xdc\x4b\xbf\x7d\x29\x91\xd4\xfa\xc6\xf2\xc3\x39\x8c\xf6\xbb\xfc\xff\xf2\x1a\xff\x6f\xe2\x35\x1e\xc2\x19\xb4\xd1\x5e\xcc\xa2\x2c\x1e\xa4\x23\x30\xc9\x80\x77\xac\xd4\x21\xc5\x84\xa2\x44\x2b\xbd\x0c\x9d\xd7\x67\x5d\xf2\x59\x05\xf2\x4f\x7d\xcd\x6b\x3f\x05\xa9\x03\x93\xcc\xfa\x7d\xd1\x32\x3e\x60\xa1\x0f\x38\x22\x68\xd2\xb6\xe5\xd5\xee\x0b\x06\x1d\x61\xc7\x05\xf5\xb0\x0d\xdb\x9e\x0d\xa9\x7a\x31\x5d\xcb\x03\x08\x5f\x5a\xe3\xc9\x1d\xe1\xd6\xa3\x93\x6c\x76\xa3\x8d\x99\x50\x46\x89\x18\x8d\x8f\xc5\xb3\x81\xc0\xfa\xcf\x4a\x64\x28\x54\xac\x31\x78\x87\x4d\x2a\x29\xa4\xaf\x34\xea\xb2\x6f\x31\x00\x1e\xa8\x0e\xda\x1b\xea\x0d\x98\xbc\x4e\xce\x6b\x9a\x8c\x4c\xa1\xd2\xfa\x1a\x50\xf4\x80\xdf\x9e\xe9\x6c\xd2\xaa\xfa\x07\xe0\x9e\x4c\xc7\xf2\xca\xfa\x64\xc7\xfa\xb2\xe0\xd5\x56\xa2\x84\xf1\x44\xcf\x8a\x04\x65\x84\x33\x0e\xad\xb0\x48\x27\x17\xc7\x67\x07\x17\xa7\x67\xd7\xe7\xbf\xbf\x7a\x7a\xfa\xf2\xc1\xc6\x67\xea\xbd\x03\xb4\xed\x7a\x76\xf0\xf6\xb7\xeb\xd5\xb6\x36\x75\xe8\xf5\xcd\x10\x14\x54\x28\xf7\x15\x8d\x57\x53\x96\xf4\xfe\x0f\x30\xca\xfb\xef\x9a\xe4\xe9\x3e\xdf\x9c\x9e\x5d\x1c\xbc\xfc\x67\xbb\xc4\x97\x1f\x8c\x1e\x29\xf6\x78\x7e\xfc\xe6\x00\x76\x8b\x6f\x53\x6f\x53\x24\xbe\x7d\x6a\xa5\x07\x46\x0c\xd0\x63\x88\x0c\x8f\xd1\x38\x4b\x3a\x05\xb2\xa8\x2a\x84\x7b\x59\x45\xfb\xca\xbb\x84\x62\xd8\x4f\x9a\xd4\x59\xda\xd0\xda\x4b\x4f\x79\x5e\x17\xa9\x62\x8c\x37\x2f\xfc\x10\x25\x46\x92\xc5\x40\x57\x89\x05\x78\x95\x86\x1b\x81\x08\x55\x3f\x32\xb9\x41\x4c\x3b\x63\x03\x88\xc0\x27\x9e\xa5\x08\xad\xcc\xf2\x65\x51\x8c\x66\x53\xa5\xa1\xdd\x8c\x36\x03\x67\x33\xda\xd9\x44\xb1\xff\x66\x00\x9f\x7b\x9b\xa6\x63\x8b\x18\x04\x86\xc2\x77\x22\xc7\x03\x6a\xd0\x0a\x0f\x6f\xf4\x6c\x46\xf0\x9b\xd0\x3a\x19\x36\xa2\x03\x59\xe3\xb8\x84\x12\x70\x27\x2d\x2d\xfe\x71\xf3\x2b\xde\x87\xd5\xb3\x79\x83\x60\x94\x86\x0b\x56\x09\x34\x46\x39\x17\x32\x18\x4b\x9b\x1a\xd0\xfa\xe7\x0e\x3c\x24\x8c\x5a\x4a\x4e\x57\x64\x35\x9b\xe0\x1b\x80\xca\x30\x47\x98\x4c\x08\xcb\x10\x23\x7e\xa3\x88\x3b\x05\x16\x2c\xaf\x28\xd0\x95\xc2\x7a\x0f\xb2\x67\x15\x2b\xc5\xc3\x77\x9c\x6c\x3e\xb6\x17\x1e\xde\xf9\x08\x9b\x7b\xf5\xd6\xae\xe3\x81\xa7\xb0\x79\x43\xe0\xba\xa2\x03\xb1\x5c\xd8\xf5\x1d\x11\x67\xf3\xab\xee\xa3\x4d\x5f\x21\xb3\x37\xa7\xa7\x2f\xaf\xcf\x4f\xfe\xcd\x4f\xcf\xee\x0e\x82\x74\x5d\xd2\x1b\x56\x56\xec\x10\x0d\xed\xdf\x14\xfc\x2c\x39\xd6\xfb\x23\x03\x06\xc9\x2c\xbd\xb0\xcb\x7a\x13\x3a\x3d\xc3\x47\x0a\x1c\xf5\x42\x01\x71\x26\x74\x2a\x23\xf9\xc2\x87\x28\x8d\x13\x01\x59\xd9\x6a\x97\xf2\x4d\x13\x03\xe1\x37\x4a\x81\x9d\xd1\x6a\x3d\x7c\xfb\x04\x35\xf5\x76\xb6\x78\x3f\xc1\x89\x1c\x35\xcc\xf6\x72\x6a\xe8\x4e\xa4\xa7\xd1\x5e\x94\x2f\x09\x36\x28\x67\xd8\x5e\x4e\xfb\x2f\xe8\xf9\xaf\x2b\x39\x03\xc9\x8c\x08\x86\x29\x29\x01\xbb\x94\x41\x36\x5a\x07\x45\x5f\x6b\xf0\x64\x8b\x9e\x28\xd1\xac\x99\x78\xc2\xc5\xd8\x20\x91\x07\x4f\xba\x58\x9b\xa5\x35\x84\xf0\xc8\x8b\x31\x76\x9d\x35\xcb\xeb\xc0\xd9\xc1\x9b\x53\xc5\x4f\x53\x90\x52\x32\x08\xf3\xd6\x84\x93\xc6\x74\x84\x3f\xe6\xba\xed\x92\x97\xf0\x7d\xfb\xb4\xae\x8c\xd8\xa0\x75\xd9\x7a\x5f\xd6\x97\x30\xf6\xe3\x7e\x60\x75\x7e\xd4\x07\x4a\x02\x6e\x2b\x88\xce\xaa\xe1\xca\x12\x34\x63\xcf\x29\x42\xf4\xeb\xa5\x22\xde\x35\x13\x54\x97\x0c\xf4\xc8\x35\xcd\x84\xdf\x82\xaa\xd0\x91\x97\x41\x4e\x27\xec\xbc\x78\x46\x4b\x2b\xce\x0a\xbf\x49\xa6\xb4\x1e\xf2\xab\xa8\x4f\x1b\x55\xd7\x38\xe7\x62\xcc\x86\x42\x3a\x0c\x03\x76\x64\x34\x19\x0a\xd4\x09\xe1\xce\x7b\xcd\x41\x37\x8f\xeb\x5b\x41\xa7\xa0\x99\xa2\x36\x46\x82\x08\x9f\xb3\x01\x3c\x09\x0b\xe6\x0d\x58\x4f\x44\xe5\x15\x61\xcf\xad\xdb\xae\x83\x44\xc9\x12\xa8\x20\x41\xa0\x80\xc1\x9d\x58\x9c\x2c\x17\x51\x51\x67\xb1\x8e\xa3\xae\xe5\xb4\x62\x5c\x07\xe3\xb1\x5c\xce\x13\x4e\xfe\xc9\xea\x44\x2f\x9c\xe9\xfd\xdb\x0a\xb2\x80\x96\xd0\x53\x47\x86\x91\x55\x8c\x9d\xa9\x06\x69\x11\xfb\xeb\x74\xc1\x4e\xa8\x50\xb3\x8f\x1e\x39\x07\x3a\xba\x17\x8d\x8b\x1b\xe4\x65\xa7\xac\x94\xcf\xd0\x56\x00\xae\x28\xd5\x31\x58\x31\x45\xad\x6e\x34\x78\x52\xe8\x08\x98\x04\xab\x67\x84\x94\xc6\x70\x70\x41\x79\xa2\x7e\x08\x1c\xe3\x17\x0b\x43\xc3\x2c\x1f\x83\xa8\x01\x64\x4c\x16\xfb\x85\x26\x3f\x18\x23\x52\x18\x09\x15\xd3\x3a\x9b\x64\x7f\x09\x81\x1b\xf8\xb7\x83\x05\x23\x84\x5a\xa6\x49\xed\x3c\xcb\xf8\xf6\xd1\x31\xa7\x8c\xa0\xe1\x0a\x37\x0f\x83\x27\x73\x7a\xb3\x12\x01\xa3\xa5\x49\x04\xf8\x60\xa9\xe1\x1a\x0c\x91\x9c\xed\xa7\xf8\x1f\x7b\xbe\x0f\x6c\xc0\x20\x35\xe5\x46\x49\xe0\x68\x9e\x65\x2d\x04\x26\x72\x43\x4f\x84\x23\x35\x70\xaf\x18\x9e\x3b\x1b\xa7\x44\x84\x9a\x01\x79\x04\x3f\xa3\x54\xb8\x5c\x83\xfb\x3e\x27\x1a\xa7\x68\x50\x22\x09\x13\x65\x3b\x53\xc8\xa7\x97\x37\x2b\x34\x27\xc1\x18\xe6\x22\x5c\x76\xcb\x99\x18\x88\x40\xee\x8e\x63\xe0\x05\x98\xff\xa6\xb3\x6f\xd0\xb6\x5b\xfc\x72\x57\x0c\x1f\x88\xf7\xd4\xb9\xd8\xf1\x9d\x40\xd7\xf6\xad\x0b\x6a\x57\xc1\x9d\x92\x54\x84\x4a\xe1\xf0\xb1\x96\x01\x4f\x41\xc6\x8a\xc7\xf2\x50\x21\x56\xe4\x31\x67\x68\x82\xa1\x46\x6c\x3e\xa2\xa0\x23\x78\xa8\x23\x6d\x35\xad\xaf\x81\xfb\xe6\x66\x0c\xde\xd9\xb2\x48\x77\x75\x5a\xed\x87\x92\x94\x2c\x7f\x25\x9a\x76\x8b\x64\x45\xbe\xbd\xd5\x22\x5a\x31\x04\x3e\x97\x99\x92\x76\xc9\xc1\x83\x9b\x9f\x35\x8f\x35\x9b\x40\x9c\x4c\xa9\xbd\xac\x45\xdc\x8a\xee\xc7\x6a\x44\x75\x70\x1f\x46\x33\xcc\x69\x4c\xd2\x02\xa6\x2b\x78\xd2\x67\x1c\xcb\x34\xb9\x56\xe3\xe0\x5c\x36\xf2\xae\x20\x80\xae\xcc\x6c\xe3\x79\xaf\x56\x02\x71\x9b\x7d\x59\x2c\x9c\x5e\x54\x2d\x5d\x7c\xf4\xc8\xe1\x34\x37\xc7\x92\x33\xa9\x07\x02\xda\x1b\x22\x63\x60\xbf\x96\xf8\xb4\xd1\xba\xda\x3c\x96\xd7\x65\xc6\x2a\x5b\x42\x2a\xfd\x01\x9a\x94\x3d\x71\x36\xdf\xb6\x76\x85\x5a\x0c\x15\x1a\x5f\xbf\xc4\x20\x14\x1b\x73\xb0\xf4\x06\x8b\xfc\x59\xce\x3e\x4e\xd1\xd1\x14\x09\x9d\xaa\xe7\x1c\x16\xf9\x0d\x2b\xc1\x1e\x13\x4c\x46\x2a\xf6\xe7\x8c\xe5\x09\x7b\x04\xa3\x8e\xc7\x70\x89\x8f\xd8\x9c\x89\x36\x6c\x25\xa3\x88\x4d\xd0\x03\x3f\xfb\x07\x4a\x57\x3c\xdf\x50\xa4\x3a\x6d\x2c\x8c\xe9\x1f\x61\xca\x67\x95\xc9\x97\x86\x0e\x27\x32\x36\x4f\x88\xbe\xe5\x09\x0a\x8d\xf2\x55\xcd\xa6\xe6\x77\x96\x69\x7a\xd7\x71\x6e\x87\xd9\x98\x39\x5e\xc7\xe3\xc5\x8c\x26\xad\x87\xe5\xcc\x7d\x92\x47\x8c\x97\xc7\xb7\xe6\xf4\x78\xbf\xe4\x8c\xf1\xf3\xab\x5b\xf8\xaf\x1d\x34\x25\xe4\xd6\xe2\xdf\x95\x4b\xc9\x76\x42\xa3\x5a\x24\xb6\xb9\x19\xae\x9c\x05\x33\x5b\x7a\x97\xf0\xbb\x18\x80\x49\xb8\xce\x52\x27\x29\xc6\x63\x86\x94\x90\x81\x6d\x09\x0a\x22\x24\xff\x2b\xfc\x57\x10\x9e\xf8\xc7\x83\xc1\xc9\x9e\x9b\x2d\x46\x57\xd2\x00\x54\x0d\x19\x22\x70\x38\x9d\x2b\x21\x89\xd0\x62\x05\xf5\x9a\x79\x51\x0b\xc1\xaa\x61\xf1\x8d\x3b\xef\xc1\x4d\x11\x38\xff\xaa\x7c\x84\xfd\x66\x7f\x7c\x41\x1b\x0f\x08\xf2\x8b\x61\x73\xf5\xf5\x40\x3e\x2e\xf3\xfd\x40\x05\xbe\xf8\x8c\xe0\x26\x71\x36\x7d\xbe\x34\xcb\x4d\x27\x68\x74\x43\xd4\xfa\xaf\xb1\x4b\x34\x01\xc9\x92\x4b\x08\xe8\x30\xb0\x88\x74\x1f\xe6\x54\x4a\x96\xe0\xa3\x1a\x53\x96\xe0\x1b\xe0\xb4\x72\x3e\xd8\x42\x78\x0c\xd5\x03\x91\x5e\xe0\x61\x23\x20\xa6\x62\x66\xd4\x11\x24\xb6\x43\xeb\xba\xcc\xe2\x59\xcd\xaa\x40\x08\x9a\xb6\x9d\x0f\x2d\x10\xed\xb5\x78\x52\x43\x74\x7d\xff\xc3\xc3\x2a\x8d\x59\xbf\x7e\x43\x73\xa6\x32\x75\x6d\xe9\x60\xfd\xa1\x71\x2c\x50\x7a\xae\x03\xc6\x29\x2d\x84\x92\x3a\x73\xce\xc1\x98\x8c\x08\x8b\xc4\xf2\x3a\x2b\x0d\xb6\x01\xc2\xb3\x35\x9e\x04\x41\x6b\x70\x9a\x24\xb3\xc9\x0c\xdf\x3a\x87\xf8\xb8\x34\x9f\xa3\xfb\x0c\x9c\x40\xde\x8d\xf2\xfe\x91\x5c\x0f\xae\x28\xbc\xa6\xc0\x79\xd9\x1b\xba\xea\x59\x73\x0f\x87\xa6\xd4\x49\xf7\xf3\x58\x17\x8a\xb5\x9a\x4d\x35\x87\x02\x03\x53\x5c\xd6\x27\xf9\x2b\xf9\x17\xac\x88\xd5\x62\xfc\x77\x19\x27\x83\x38\xfc\x04\xa7\xd4\xe0\x46\x2c\x3d\xb7\x18\xde\x4e\x53\x7f\xf4\x69\x4e\x6d\x73\xf3\x7e\x3c\xab\x4f\xd9\xcf\x2c\xe7\xd7\x08\x73\x28\xca\x61\x6b\x11\x83\x95\x43\x16\x3a\x94\x80\xc9\xa6\xe9\xe1\x8f\x5e\x77\xfc\x16\x6e\x73\xa6\xd2\x05\x0f\x8c\xdf\x18\x61\x11\x0c\xbd\x05\x77\xee\x50\xf1\xf8\x93\x14\xc8\xaa\x46\xe4\x66\x64\xf0\xfc\x09\x3e\x82\x22\x41\x1d\xdf\x1d\xea\x5b\x95\xa5\x13\xa2\x8c\x6c\xd8\x2a\x02\xb6\xb7\x6c\xe5\x8a\xd3\x8e\x83\xd0\xab\x8e\xcb\x51\x20\x6f\xc6\x6f\x20\xe0\xcf\xf8\xea\x80\xca\x00\x4d\x35\x6e\x99\x11\xb8\x2c\x1e\x67\x79\x3a\x9e\x5b\x8e\x57\x2c\xaf\x66\xa5\x34\xab\x10\x4e\x22\x18\xfa\x36\x1e\x17\xc9\xc8\x99\x16\x9c\x41\xc9\xe8\x58\x06\x56\x3c\x3e\xc7\x50\x59\x1b\x8d\x57\x58\x54\x2c\x88\x26\x6f\xa6\x72\x4c\x85\x97\xd6\xb2\xa1\xff\xb3\x05\x57\xf8\xd8\xd3\x38\x4b\xb2\x1a\xa5\xb6\x4d\x89\xb2\x67\x55\x17\x22\x18\xe4\xd7\x26\xba\x1e\xf8\xb5\x95\x13\xe0\x79\xc5\xf3\x59\xb8\x65\x82\x37\xa9\x58\xad\x61\x16\x72\xac\x47\x60\x6d\xaf\x58\xf1\x24\xe7\x39\x88\x9e\x01\xaa\xbd\xb8\x28\x46\x2f\x18\x9b\xc2\x25\x22\xc9\x08\xcb\x27\x56\x08\xb1\x8c\x82\x20\xd7\x6a\xc8\xe7\x1a\x25\x54\xa0\x94\x0d\x14\xed\x29\x5b\x04\x83\x45\x25\x8d\x1a\xe2\xb9\x58\xe3\xdc\x9c\x00\xf5\xc5\x2a\x85\x75\xbf\xf8\x92\x92\x67\xe8\x73\xf4\xb3\xa8\x91\x51\x44\x7a\xbf\xe0\x09\x43\xe3\x12\x51\x51\x3e\xc5\xba\x3e\x9b\xe5\x89\x22\xe4\x10\xc2\x1b\x91\x3a\x39\x7a\x14\x8d\x38\x63\x46\xfb\x1a\xbb\xfe\x2d\xa9\x9b\x7a\x73\xef\x6b\xde\x71\xed\x2f\xcd\x11\x35\x50\x87\xc8\x69\x43\xdc\x76\x56\x03\x01\xcb\xcc\x55\xe4\x6b\xf4\x45\x1a\x6d\x3c\x18\xfd\x5a\x26\x09\x1b\xeb\x44\xee\x6b\x45\xff\xf0\x00\xa6\x83\xff\xde\x37\x1c\x53\xc6\xda\x7e\x93\xac\x1e\x91\x76\x12\xfa\x81\xb2\x65\xfb\xfc\x4d\xe8\xd4\x68\xf8\x24\xaf\x0b\x59\xaf\xed\x18\xc2\x1f\xcb\x7a\x52\x09\xa5\xcd\x83\x53\xb6\xcb\xd8\x1b\xa5\x5a\x05\xee\x7f\xe3\x58\x8b\x11\x4d\x40\x4a\x74\x28\x98\xa0\xcf\x3d\xe9\x6d\x62\x0f\xa3\x45\x25\xf9\x98\xd0\x29\x5f\xac\xf7\x59\x3d\x7c\x21\xe7\x71\x22\x1c\x43\xcd\x0a\x44\xac\x90\x5e\x3b\x62\xbf\xe5\xd8\xfe\x9a\xaf\x6d\x06\x63\x4e\xa9\xc5\x26\xae\x61\x38\xd1\x36\x5c\xa7\xb1\x2c\x2d\x36\xb2\xe6\xa0\xb5\x3d\x1d\x5f\x21\x27\x2e\x44\x34\x5f\x51\xc8\x47\xef\xdf\x71\x8a\x6c\x02\x4a\xd9\xe6\xc2\xc5\x8b\x38\x7f\xcc\xaa\xda\xa1\x95\x6e\xa4\x05\xbe\x15\x29\x9a\x16\x70\xd0\x0b\xc9\xdb\xac\xc8\x29\x34\xf8\x6c\x59\x2b\x01\x37\x5c\xb7\xeb\x78\x1d\x64\x7b\xa4\x64\x45\x45\xfe\x68\x94\xf5\x9d\xfd\x35\x5a\xc4\x95\x82\x5b\xce\xe6\x23\xce\xd1\x6c\x02\x77\xa3\x80\xde\xb6\x87\xe0\xbb\x8a\xaa\x0b\x73\xc1\x57\x55\x3e\xf7\x42\x8a\x3e\xe5\xc0\x68\x12\x67\x2a\x74\x84\x00\xf8\x2a\x18\x72\x43\x3d\x9d\xaa\xf3\x84\x7c\x2f\x1a\xfa\x43\x52\x03\x3c\x9a\xe5\xdb\x17\x00\xeb\x8a\x79\x7f\x21\xbe\x13\xe3\xb7\x3a\x6c\x4e\xe3\xd3\xb8\x6e\x2d\x3a\xfa\xfb\x28\x4f\x5c\xe0\x20\xc6\xf9\xdf\x79\x69\x4f\xe8\xb4\xed\xc2\x36\xf4\x8c\xf2\xc2\x06\xa3\xb0\xff\xdd\xb7\x36\xc7\xc9\x7c\xa0\x13\x3a\x55\x56\x09\x4d\x7f\xf9\xa4\xe5\xe6\x36\xe6\x63\x13\xe6\xd2\x90\x4c\x3c\x90\x2b\x06\x22\x5f\x80\x28\x4a\x70\x04\x85\xee\x8a\xbe\x12\x05\xda\x17\xff\x84\x4e\xdb\xee\xc9\xd5\x23\xf3\x85\xd7\xbc\xba\xd4\x2e\x41\x1c\xfb\xc0\x13\x2c\x11\xbd\xb8\xf3\x57\x20\x5f\x74\x58\x0a\x4d\xbb\x61\xd2\x8f\xd1\x5a\xdb\x79\xd0\x4f\x40\x28\x44\x20\xfe\xe7\x81\x14\x2e\xc4\x2f\x86\x26\xb9\xd5\xf7\xb3\xd7\x8d\x4d\x85\x2e\xdb\x18\x69\x73\x43\xd7\x73\xc2\x46\x8d\xb5\xf7\xeb\x6b\x45\x93\xd9\x91\x52\xc6\xb4\xae\xc1\xc6\x4b\x4d\x4f\x86\x9e\x78\x20\x5a\x80\x0b\x71\x03\x1e\xda\x46\x9f\x0c\xcb\x70\x86\x4e\x79\xf1\x52\x3c\x75\x50\xb2\x6d\x14\x59\x9b\xeb\xf0\x37\xb7\xab\x2e\x84\x3a\xcc\x92\x4f\x14\x0d\xad\xcd\x2a\xd1\xf6\x37\xe0\xfb\x61\x44\xcc\x5a\x98\x17\x85\xf1\x69\x81\xac\xac\xa4\xf0\x12\x04\x04\xed\x32\x59\x20\x3a\x6e\xb4\xdd\x2b\x2a\x0a\x31\xa8\xa0\x7c\x0c\xa7\xc8\x99\x6e\x08\x03\x4a\xc8\xa6\xfe\x81\x65\xe6\x5d\xb4\x84\x44\x54\x61\x1a\xa8\x1c\x32\x88\x05\xd4\x46\xd0\xaa\x9a\x4d\xe4\x90\x1b\x66\x56\x03\x56\x57\x68\x3e\x05\xb2\x3c\x0e\x2f\xc5\x8c\x97\x42\x6d\x67\x49\x54\x54\x4e\xa1\xee\x55\xcd\x8b\x38\x33\xe6\x1b\x0f\x18\xad\x47\xbd\xcc\x47\x6f\xe9\x5c\x3a\x3d\xd4\x59\x32\x1b\x83\xae\xa1\x9c\x25\x20\x70\x68\x9c\xc4\x56\x63\x5f\xfb\xb8\x9b\xfb\xa2\xda\xb1\x4f\xbc\xa9\x81\xc1\x73\x8f\x9b\x0b\xf4\x22\xdf\xa0\x0f\x66\x89\x0f\x0a\x71\x98\xaf\xc3\x5b\x4d\x1b\xf0\xcc\xeb\xa3\x84\xc0\x86\xe8\x4e\x83\xfe\xd5\xb9\x6d\x71\xfd\x31\xa6\xce\xa1\xb9\xa5\x8e\xd2\x3c\x81\x62\x00\x8c\x0a\xf4\x3e\x59\x81\x92\xc4\x3d\xdb\x88\xd3\xbf\x72\x95\x08\x73\xb2\x14\xe2\xe0\xc5\x3a\x9c\xac\xb4\x26\xd6\xe6\x7d\x18\xa5\xc6\x32\xf7\xd6\xf1\xbf\xa4\x21\xdf\x7f\x72\x54\x08\x80\x1e\xc2\x5b\xf1\x52\xe4\x84\x9b\x27\x3c\x75\xf6\x9d\x4d\xc7\xa3\x18\xe5\x0a\x93\x7a\xfd\x6c\xcc\x78\x9b\xfa\x95\xe0\xff\x7f\xef\xeb\xcb\xff\xfc\xe7\x3f\x8f\xae\x1e\x11\x41\xe3\x6e\x06\x46\x85\x71\x96\xb3\xd7\x88\xae\xb7\x9c\x4d\x9f\x53\xc2\x6a\x60\xd8\x81\x8c\xed\x10\xa3\x6a\x44\xe7\xca\xf2\x9b\x32\x20\x7c\xab\xe8\x8d\x17\xf5\xfa\x59\x2c\x03\xe1\x1a\x66\x23\x90\xda\x43\xa7\x4b\x5b\x14\xb6\x62\xa6\xd1\xb8\xc8\xa5\xa3\xe6\x72\x5d\xb5\x15\xc5\xa9\x51\x71\xad\x3b\x68\x68\xbb\x4f\xa2\x45\x89\x89\xc6\x34\x34\xbf\xc3\xd0\x21\xf8\x2c\xb6\x7c\x5e\x4b\x1c\x63\x87\x96\xa0\xbe\xa7\x0a\x90\xb4\xf3\xa2\x88\x83\x22\x23\x8f\x20\x4e\x44\xf7\x0b\x29\xe1\x2f\xcc\xa8\x3b\x3d\xf5\x0e\x67\x96\xd7\x2c\x17\x0e\xf5\xf8\xe0\x08\x70\x55\x00\xd3\x59\x0e\xd1\x43\xf0\x81\x12\x11\x68\x43\x45\x9d\x81\x58\x4a\x15\xc7\x57\x09\x2e\x10\xc8\x38\x45\xac\x97\x31\xcd\x07\x33\x3a\x60\x15\x0a\xff\xa9\x7a\xdb\x1c\x63\xa9\x7c\xfd\x48\x3f\xba\xad\x62\xe8\x88\xb9\x67\xf9\x40\xfb\x52\x2a\xcb\x76\x11\x30\xf2\xc8\xf2\xd0\xd5\x47\x40\x86\xaf\x30\x38\x5a\x15\x04\xc9\x26\xd9\xf4\x89\xf8\x1f\x70\xfd\x08\xa5\x5f\x43\x63\x58\xf4\x75\x10\xa5\x16\xab\x9e\x66\xb6\xb0\xef\x69\xe9\x83\x93\x1d\x9f\xea\xa2\xb7\x16\x2c\x9b\x01\x38\x7a\xda\x93\xd8\x68\x6d\xa5\x19\xb4\xae\x79\x76\x76\xf0\x73\xab\xb3\xb3\x1c\x1c\xa2\xb1\x67\x25\x1d\x80\x3d\xb8\xd5\xee\x3d\xfd\x37\xe1\xdc\xca\x5b\x41\x2c\x56\xb4\x3b\xbd\x91\x0f\xf3\x47\xa8\x84\x83\x83\x54\xcd\x02\x2d\xbe\x16\x5e\x6c\xcd\x6e\x8e\x30\x62\x03\xcd\x7d\xb5\x4d\xf5\xb9\x74\xde\x5b\x5f\x5c\xb9\x1b\x0a\x95\x36\x8c\x74\x2b\x5a\x83\xaf\x05\x8e\xbe\xaf\x39\x0b\x7f\x8b\x70\xa6\x36\xb6\x83\x1c\xdf\x12\x21\xa8\x6e\x1f\xac\x4c\x86\xcd\xd9\xb4\xec\x8c\x2a\xe9\xcd\xa1\x77\xa8\x15\x82\xfe\x31\x77\x80\xbe\x04\x39\xed\x10\x10\xab\xae\xdf\x1d\xbc\x3c\x39\xd2\x5d\xcb\xe8\xc0\x39\xbb\xe5\x7c\xb7\x77\x79\xb9\x29\xef\xc8\x4d\x02\x96\x14\x57\xc4\xb9\x14\xa1\x36\xe1\xf3\xca\x5f\xe7\x58\xf2\x19\x53\x78\x80\x6b\x09\xb4\xf6\x20\xe7\x12\xeb\x06\x3b\x62\xc9\x98\x62\x78\x21\x78\x7d\xdd\xd8\x1a\xc9\x6e\xae\x75\x19\x35\xcf\x86\x86\x6f\x1b\x4a\xd6\x57\xd6\x67\x28\x37\x1e\xe5\x33\x49\x84\xff\xe4\x87\xea\xed\x68\x61\xdd\x20\x42\x3f\x16\x7d\xe7\x03\xbf\xa6\x73\x71\x43\x7f\xe8\x99\x27\xdb\xa0\x33\x36\x6d\xd9\x30\x07\x40\x00\xec\x93\xbc\x5f\xd8\xf3\x15\x78\xc3\xf0\x22\x35\x90\x99\xf6\xb4\x94\x6a\xa9\x95\x0c\xcb\x41\xd3\xcc\xd5\x21\x67\x5a\x3d\x35\xdb\x7c\x92\xed\x7a\xa1\x2a\x27\xe9\x1e\x27\x7a\x30\x25\xa4\x2b\x1b\x34\x50\xb4\x4a\x17\x59\x47\xd0\x58\x7b\xfd\x50\x8a\x20\xc1\xd4\x18\x24\x89\x65\xd3\x56\xbd\xcd\xb0\x75\x0b\x04\x75\x01\xa6\x5c\x99\x70\x56\xda\x04\x5f\xa5\x11\x03\x72\x15\x94\x71\x9c\x2b\x65\xf0\x84\x4e\x3a\xcf\xe9\x24\x4b\x90\xe9\xac\x2c\xa6\xa9\x80\x40\x86\x82\x9f\x05\x71\xad\x65\x3e\x22\x88\x09\x88\x2c\x58\x89\xd0\x82\x23\xc6\xa6\x3a\x2a\xbc\x6a\x29\x66\xf5\x2d\x63\xf0\x20\x1c\xc6\xf8\xaf\x74\xbc\x76\x40\x6f\xcf\x69\xf5\x82\xcd\xdf\x56\x4c\x47\x3e\xbd\x5b\xa1\x01\x11\x9e\x15\xd8\x03\x58\x71\xf8\xf2\xd0\x33\xfb\x62\x3e\x35\x14\x7d\x59\xde\x2f\xc4\x3d\xb0\xf6\xe4\x29\x3a\xb1\x63\x3e\x06\x03\x81\x03\xa0\x45\x3b\x22\x88\xee\xc5\x26\x0e\xf6\xcd\x9c\xc0\xf8\x68\xde\x98\x46\x4e\x6e\xbd\x5a\xaf\x7b\x33\x3c\xa0\x71\xfc\x8d\xd3\x59\x17\xd3\xed\x31\xbb\x61\x63\x79\x4e\x41\x95\x8c\xc6\x7a\x3f\x72\x20\x31\x06\xbe\xe5\x6c\xfe\xb4\xe6\xb8\xf2\xc6\xd7\x40\x8b\xa2\x70\xd2\x82\x55\xf9\x66\x8d\x2e\x3b\x10\xc9\xd0\xd0\xe3\x9a\xaf\xd3\x21\x69\x87\xc0\xc0\x74\x08\x02\xc3\xd6\x16\x1e\x71\x12\x62\x0d\xa4\x28\x07\x65\x71\x8b\x11\xeb\x86\x65\x96\x8f\x9c\xa2\x14\x54\x68\xc9\x84\x18\xaf\x07\x96\xdb\xb6\x2c\x8b\x0f\x85\x0f\x89\x8e\x4b\x46\xd3\xb9\x13\x33\x96\x2b\xe2\x37\x05\xe8\x2c\xd9\x9f\xb3\xac\x84\x81\xf1\xe6\x70\xf0\x8e\x3b\x62\x73\x57\x7a\xc7\xaf\x8c\xde\x01\xb0\x00\xa2\x76\x56\x89\xe0\x0f\x09\x85\x07\x19\xab\x82\x13\xe2\x08\x93\x2a\x00\xad\x7c\xea\xac\x82\xb8\xc7\x05\x38\xef\x09\x2e\xd8\x08\xf0\x69\x3f\x40\xab\x18\x5b\xb9\x42\xca\xad\x90\x4f\x4c\x8c\xba\x42\x93\x8a\xa6\x8c\xd4\x00\x2f\xe9\xc4\x57\x89\xc4\xcd\x4a\x45\x41\x31\xd8\x5d\xb9\x24\x52\x65\xff\x82\x19\x71\xeb\x9a\x87\x05\xe0\xbf\x11\xec\xd1\x20\xef\x30\xa5\xa7\x57\xd9\xc8\x6b\x31\x14\x40\x00\x93\xa8\x69\x6d\x23\xea\xf5\x13\x8b\x19\x58\x3d\xda\xe2\xa6\x7b\xc8\xc9\x97\xda\x8c\x56\x7c\x72\xb9\xb6\x87\xab\xf6\x91\x7f\x6e\x2b\xe6\x8c\x1e\x3d\x72\xde\x56\xf8\xb6\xe7\xca\xbb\x18\xf2\xf9\x8b\xa2\xdf\x87\x03\x2c\x9e\x86\x03\x4b\x75\x9a\x24\x6c\x5a\x1b\x2a\x06\x5a\xc9\x68\x1d\x12\x74\xe1\xd9\x4d\xf1\x34\x25\xb4\xcd\xb9\x69\x15\x8a\x43\x08\x86\x38\x48\x6d\x56\xcd\x30\xa8\xd8\x10\x82\x3e\xb8\x1f\xd4\x0a\xda\xb4\x69\xa1\x7c\x30\x43\x2b\x87\x24\xbc\x1a\xc1\x20\xae\x15\xad\xda\x48\x81\x80\x4b\x9f\x22\x62\x1e\x3d\x72\x7e\xce\x84\x17\x60\xc3\xda\x47\xc6\x1f\x19\xcf\x55\x08\x48\x90\x57\x49\x0d\x85\xb4\x50\x55\xa3\x84\xe7\x43\xa9\x62\x76\xa9\xf4\xa2\x29\x8b\x09\xdc\xa1\x2b\x54\x92\x3d\x60\xdf\xbc\x48\xf5\x5b\x1f\xed\x3c\xa9\x0a\x86\x28\x0d\x45\x9b\x21\xce\x8f\xb5\x1b\x8f\x81\xfb\x38\x6a\x53\x56\xbd\x22\x70\xa5\xc0\x4a\x18\x87\xd7\x40\x4e\x60\x1f\xba\xf9\xaf\xea\x5f\x95\x25\x6a\x34\x43\x8c\x8b\x4e\xb7\xe1\x3a\x06\x65\x09\x3f\xaf\x66\x40\x62\xb4\xdb\x5c\x07\xa8\xc4\x58\x41\xb2\xc2\x91\x09\x1b\xe6\xe5\xa7\xd6\xa2\x29\xcb\x38\xce\xf1\x05\x3a\xbe\x89\x22\xfc\xaa\x28\xcb\x32\x8c\x98\xac\xf6\x08\xed\xc0\x50\x7e\x00\x01\x23\xc0\x95\x11\x16\x0c\x24\x90\x86\xec\xdb\xbe\x73\x2a\x8d\xbf\x05\x65\x47\x60\x6d\x73\xe3\x5d\xcc\x31\xac\xf4\x18\x31\x75\x2d\x04\x23\xe8\xa7\x25\xc3\x88\x7c\x12\x53\xbf\x2e\x52\xb6\x74\x72\x4e\x89\x9d\xc3\x30\x01\x1e\xc5\xe8\x71\x7b\x8b\x3e\xbc\x52\xa3\xe2\x4f\xb5\xe3\x6a\xde\xc4\x03\x11\xf5\xa1\xd0\x13\x57\x1e\xaf\xd4\x8e\xa3\x05\x15\x02\x03\xeb\xb4\x18\x36\xdb\xf8\x6b\xd5\x14\x81\x57\xbc\xd7\xfb\x82\x17\x68\xf7\xbc\x50\xe8\x81\x6f\x7d\x91\x32\xc3\xf3\xa2\xc5\x88\x20\x69\x98\x0f\x38\xad\xf7\x91\x50\x54\x36\x10\xb8\x63\x07\x2c\xd1\xc2\x8e\x46\x1f\xd6\x64\x64\x80\x64\x09\x73\x06\x46\x00\x68\x43\x28\x90\xc0\xd6\xd3\xec\x10\x9f\x30\x5e\x4d\x7a\xb4\x46\x62\xcb\x7d\xd5\x32\x32\x18\xca\x03\x1d\x3c\xbe\xda\xe5\x58\x13\x96\x70\x25\x07\x1c\x3c\x20\xab\x9d\xeb\xfc\x22\xf7\x8e\x47\x8f\x9c\xe3\xbc\x2e\xe7\xaa\xac\x7e\x44\x53\x3e\x2c\x9d\x19\xf6\x79\x95\x61\xbe\xc1\xef\xa5\xbc\xb8\x75\x6e\x99\x33\x2d\xb3\x1c\xd4\x0f\x8c\x03\x7a\xcd\x24\xea\x93\xcf\x5c\x4d\x9c\x31\xbc\xfc\x69\xc2\x84\x1e\x1b\x70\x73\x7c\x55\x5b\x1c\x43\x3e\xe1\xf3\x00\x6b\x1b\x5a\xa5\x4d\x8f\x87\x2f\xf0\x70\x68\x85\x58\xed\xee\xe0\xdb\x65\xdb\x41\x57\x17\x6f\x85\x5f\xc7\x8a\xcf\xd7\x16\x86\xc7\xb0\xa5\x85\x40\x76\x54\x49\xda\x88\xea\x50\x7a\xa5\x55\x42\x9e\x8b\x7e\x83\x4a\xc0\xcb\x7b\xac\x10\x11\x66\xc2\xc1\xf8\x6b\x6d\x11\x20\x6c\x2b\x25\xc6\xf9\x24\x35\xda\x8e\x95\xde\xc8\x7e\x6c\x39\x2b\x60\x03\x79\xb1\x1c\xc2\xdb\x0e\xd1\x8a\xa4\xb2\xcd\x10\x15\xcb\x76\xee\x11\xa8\x9b\x9a\x74\x21\xe8\xb0\x6b\x37\x59\xaa\x46\x6e\x6e\xf8\xc6\xe9\x55\x5a\x69\x44\x65\x29\x06\x50\xa5\x28\x87\xc4\x07\x92\x02\x0e\xca\xbf\xf5\x52\xa9\x96\x1a\x91\xe6\x08\xbe\x1c\xb2\x89\x06\xa9\xab\x57\xaf\x00\x9f\x07\x5c\xbb\x2b\x7a\x8a\xc6\xec\x80\xe5\x35\x63\x72\xb5\x2e\xb8\xa4\x5e\xee\xaf\x2c\x1f\x24\x81\xcc\x83\x29\x07\x30\x7e\xef\x6e\x36\xfb\x90\x4a\x54\xa1\x44\xb0\x1f\xe6\x15\xcf\x50\xe0\xf6\x03\x89\xa3\xe1\xb6\xea\x39\x6f\x2b\xa6\x49\x02\x75\xc7\xf3\x55\x4a\x9d\x0f\x66\x90\xac\x0f\xca\x2f\x6b\x73\xc5\xc7\x5b\x1c\x24\x47\xca\x18\x57\x0f\x12\xfa\xd0\x0a\xd6\x4d\x9d\x14\x20\x13\x64\x25\xe3\xa5\x86\xd6\xd3\x22\xcb\xb5\x1f\x17\x29\x51\x87\xb1\x7a\xb2\x2c\xae\xf7\xbd\xdb\x2a\x8b\x2a\x76\xe8\x5a\xa2\xb1\xd7\x9c\xaa\x1b\x1f\xe2\xeb\xcd\xbc\x2f\x7d\x0f\x41\xb9\x34\x4b\x4f\x44\x51\xe4\x61\x23\xfd\xca\x95\xd5\x90\xcc\x35\x9e\xb4\x02\x83\xaa\x79\x93\x1e\xb8\x36\xb0\xb1\xe9\xbe\x23\xc7\x28\xc2\x26\x5e\x36\xc4\xa5\x57\x9e\x4f\x9c\x6b\xc0\xcd\x4e\xc7\xbb\x6f\xfc\xde\xb5\x40\xd5\xd7\xed\xb8\x3a\xfc\xe4\xec\x6d\xba\x04\x23\xe4\x5d\x9b\x1e\x6b\xc6\x35\xd4\x69\x13\x2b\xf7\x86\xb4\x82\xd0\x2d\x26\xb2\x6f\x52\xf3\x27\x39\x92\x0d\x7c\xbe\xce\x87\x7f\x55\x1f\x40\x95\x35\xce\xf0\xf2\xfc\x60\x2b\x51\x3e\xf4\x0c\x2f\x42\x95\xaa\x21\x0e\x08\x7e\x7c\x70\x0b\x5f\xf7\x96\xd6\x1f\x22\x06\x18\xd0\xec\x60\xb3\x75\xaf\x57\x61\x5c\x32\x3a\x6a\x23\x93\x12\x5a\x27\x43\xc7\x63\x65\x29\xa7\xd4\x06\x1a\x9a\x84\x59\x81\x0b\x56\x96\x68\x38\xda\x17\xfc\x97\x0c\xb9\x30\xb7\x42\xf2\x75\xd6\xef\x4d\xb7\xab\x5b\xbd\xdc\x44\x74\xbe\x79\x65\xae\x70\x4b\x76\xd3\xc9\xad\xd9\x3f\xf6\xba\x32\x17\xb3\xd5\x7a\x58\x16\xb7\x8d\x09\xb5\x2c\x91\x44\xf4\x0a\x8e\xe5\xbb\x77\xa6\xf0\x62\x1d\x0c\x28\x5f\x2f\xf1\x84\xd5\xbd\x90\x00\x7b\xb9\x96\xb1\x7a\x30\x67\xd5\x1e\xee\xfe\x7d\x56\x0f\xdf\xa9\xb7\x32\x44\x14\x5e\xf9\x52\xec\x8a\xb1\x0e\x8c\xfe\xc2\x0a\xaa\xb0\x36\x62\xc1\x9a\x90\xc7\x6d\xb9\x15\x9c\xfd\xf6\x3c\xa1\x12\x0d\xd5\xc3\xb1\xb7\x20\x5a\x14\xde\x50\x09\xad\x18\x10\x96\xe8\xcf\x02\x7b\x07\xbe\x2f\x68\x46\x61\xc9\x1f\xf1\xd5\x16\x30\x46\x12\x11\x0f\x66\x49\xc2\x84\x27\xb0\xf1\x54\x90\xf0\x07\x8e\x19\x07\x62\x4e\xe0\x66\xb9\x10\x8e\x4a\x87\x98\x8e\x5a\x07\x8b\x4e\x17\x02\xd6\x4d\x9b\xae\x6e\x04\x81\x6c\x9b\xa3\xe1\x4a\x03\x89\xa6\xba\xc2\xc4\x99\xf0\x82\xab\x0c\x68\xc2\x6b\xee\x34\xc4\xbb\x5b\x91\xb3\xe9\xfc\x5e\xcc\xe4\x1c\xfa\x45\x39\x28\xd0\x07\xe8\x23\x68\xcd\x85\x52\x40\x0a\x49\x54\x28\xd2\x3e\xa7\x7a\x39\xc6\x71\x21\x6c\x81\x1c\x6c\x96\x03\x4b\x0c\xde\xaa\xe0\x6c\x07\x78\x67\x92\x7d\x64\xa9\x33\x9b\xaa\xd0\x94\x7c\x01\xf1\x7a\xcd\x26\xbc\x9b\xaa\xe7\x5a\x21\x45\xb5\xa6\x44\x8b\xe0\xd6\x69\x73\xcc\xc7\x25\xf8\x12\xea\x7a\xab\x73\xd5\x79\xad\x3a\x67\x59\xec\x13\x22\x7b\x63\xa0\x46\x8d\x35\xea\xce\xd6\x63\xdd\xf2\x36\x16\x06\xeb\x46\xb1\x35\x9e\xf9\xed\x6d\x6d\xdb\x43\xa5\x93\x9b\xc7\xef\x49\xc0\xf4\xb1\x7c\xed\x48\x3f\x55\xeb\x83\x1f\x24\x92\x3e\x8f\xb4\x62\x1b\x5e\x20\xe2\x85\xaa\xac\x66\x8d\x27\xf7\x2b\x1f\x4e\xc3\xa0\xa8\x03\xe7\x5f\xe2\x1a\x10\x70\x86\x10\x85\x11\xc7\x45\x2c\x71\x01\x84\xe2\xe9\x7a\x2b\x4a\x84\x7e\xfa\xc9\x9a\x56\x8f\x4e\xa7\xe3\x39\x78\x93\x12\x1d\x8a\x52\x05\x3d\xbe\x00\x7d\x1f\x18\xf4\x09\x2f\x4f\xde\x69\x56\x0d\x85\xbf\x5c\x91\x8c\xc4\x9c\x66\x55\x5d\x4c\x2c\x83\x31\x4e\xe9\xf5\x44\x33\x10\x0e\xec\x88\x5f\x94\x70\xca\xe1\x01\x32\x7c\xfd\x18\x15\x46\xea\x69\x38\xce\xc2\xa0\x19\xa4\x64\x4f\xd4\xa8\x7a\x1b\xf7\xda\x6f\x34\x5f\x24\xd1\xd1\x4c\xcf\x47\x19\x06\x84\x93\x4c\xa9\xd0\x63\x88\x0d\xe5\x78\x06\x77\x14\xdd\xef\xf8\x89\xe2\xa5\x8d\x17\x87\x20\x3e\x0a\x36\x26\x95\x1e\x02\x1f\x51\x78\x88\x08\x37\x5f\x6f\x29\x8e\x3b\x4f\x61\xd1\xf0\xfe\x49\x8a\xbc\x2f\x42\x67\x03\x12\xea\x29\xfc\x87\x98\x0e\x7c\xfb\xd8\xc7\x84\x81\x47\xae\x7a\xcb\x0c\xbc\x18\xc0\xf5\x41\xaa\xc8\x9c\x94\xdd\x40\xdb\xd3\xb2\x90\xeb\xeb\x9d\x01\x3a\x83\x38\x91\x19\x78\x0e\xf2\x2e\xc5\xf3\x4f\x43\x36\x9e\xf6\x67\x63\x67\xc2\xaa\x8a\x0e\x98\x7c\x72\xad\x2a\xc0\x7a\xd0\x5c\x09\x6c\xac\xcf\xb1\x01\x51\xf1\x8b\xc4\xa2\x55\xd8\x32\x9d\x4e\x19\x2d\x7b\xbe\xd8\x8b\x15\xbc\x69\x89\x8d\xf6\x50\x6c\xd4\x0c\xe4\xba\x22\x3b\x6a\x8a\xb8\x8c\x90\xa8\x57\x08\xee\x4d\x37\xef\x76\xd3\x2d\x71\xeb\x48\xac\xfb\x49\x8b\x97\x76\xba\xdc\x7c\xf1\xa6\x11\x9c\x63\x1d\xd7\xdb\x74\xa6\x65\x46\x68\xf5\xc6\x35\x2d\x5e\x4e\x6c\xb9\xa6\x1b\xb7\x32\xad\x59\x2a\x9f\x59\x8c\xee\xbb\xe3\x7b\x71\x96\xa7\xc2\x25\x4c\xad\xd5\xa3\x47\xce\x4b\x36\xa0\xc9\xdc\x19\x16\xc5\x48\x1c\x40\xad\xc4\x43\x13\x2f\x7c\x06\x53\x84\x2f\xb7\xbb\xec\x19\x91\x96\x8c\x17\xcf\xda\x5f\x3c\x6a\x56\x26\xce\x26\xaf\x67\xbc\x7b\xb4\xf6\x71\x23\x78\x8b\x72\xd5\xc6\x87\xff\x6f\x5c\xdc\xbe\x29\xb3\xa2\xcc\x6a\xf9\x70\xed\x57\xbb\x0a\x43\x5b\xc3\xcc\xf8\x05\x37\x2d\x19\x04\x17\xee\x39\x07\xfa\x75\x4f\x7c\x58\x32\xcd\x4a\x96\xd4\x63\x11\x6a\x21\x46\x43\x8c\x29\x85\x57\x2f\x45\xfc\x0f\x6b\x73\x7a\x9b\x06\x49\xdd\x3e\x65\x44\x98\xcd\x69\x3a\xfa\x5d\x26\x7c\xff\x51\x8a\x78\x8c\xf6\x1a\x16\x85\x06\x15\xba\x02\x46\xcd\x75\x6d\xc0\x93\x11\xd1\xbd\x01\x4e\x5a\x95\xb7\x8e\xf0\xb3\x1e\x26\x30\x5b\x5a\x7b\x21\x7c\xc1\xd9\xfe\xd4\xc9\xd6\x83\xe8\x29\xc0\x5d\x6e\xb4\x1d\x34\x5d\xd2\xb4\xfc\x6e\x3c\x62\xb0\xc6\x3e\xe9\xbf\x6d\x9d\xa4\x42\xfb\x8a\xa0\x9d\xd2\xfc\x37\xd0\xde\x7c\x81\xe9\x55\x42\x24\xa2\x3c\xa6\xc9\x30\x68\x3a\x9a\xca\x27\x58\x21\xd4\x9f\xe5\xb6\x80\x39\xc2\xf0\x3e\x90\x3f\x30\x95\xf3\x90\x81\x36\x62\xe6\xeb\x08\x4f\x20\x2a\xf5\x4e\xa0\x7f\xf2\x1a\x6f\x66\x25\x33\xf2\xac\x4f\x9e\x3f\xcb\x2b\x78\x73\xec\xfa\xa0\x9a\xe7\x89\x51\xd2\xfe\x86\x3e\x1a\x64\xd2\x3d\x98\x8a\xb7\x6c\xc2\x5a\x70\x0f\x0c\x13\xd5\xb2\x00\xfe\xe0\x3e\x04\xca\x4b\xdb\x22\xdb\xa0\xf1\x0d\x43\x85\x48\x0f\x45\x1e\xe0\x7e\xbd\xc3\x2f\xc8\xb9\xbe\x3e\x3f\x3e\x3c\x3b\xbe\xb8\x3e\x79\x7d\x71\x7c\xf6\xfa\xe0\xe5\xf9\xf5\xd1\xe9\xf5\xeb\xd3\x8b\xeb\xb7\xe7\xc7\xd7\xa7\x67\xd7\xbf\x9f\xbe\xbd\x7e\x7f\xf2\xf2\xe5\xf5\xd3\xe3\xeb\x67\x27\x67\xc7\x47\x72\x7b\x57\xd4\x99\xc1\x6a\x92\x0a\x4d\x06\x71\xf9\xe2\xb9\x60\x3f\x58\x09\x26\x31\x14\x8c\xbd\xe3\x59\x9e\x8e\x39\x42\x42\xe6\x61\x1b\xf5\xb0\x4e\x7d\x9b\x25\x10\x00\xff\xed\xab\x23\x2c\x03\xf1\x44\x1c\x47\x28\x6a\x03\xf9\x74\x05\x8a\xbb\xc2\x8d\x0d\xa0\x91\x72\xbe\x7b\x30\x8e\x67\x96\x98\xa9\x21\x7f\x68\xbd\x20\xe1\x30\xf1\xc2\xf2\x51\x0c\xac\xf4\xf9\x4b\x44\x4c\xf5\x0b\x27\xf6\x84\x76\x33\x2f\x6a\x4e\x4a\x8a\xe7\x18\x41\x07\x83\x6f\xb9\x68\xed\x4b\xbb\xd9\x62\xb0\x26\x5d\xad\xef\xf9\x30\x9b\x00\x9e\xc2\x03\x79\x74\xfa\xca\xd9\xfd\xae\xb7\xd3\xdb\x91\xef\x41\xd6\x9c\x88\x49\x99\x72\x03\x48\x1d\x0f\xd5\x18\xf0\xd6\x70\xea\xc3\xdd\xa8\x5f\xd5\x84\x6b\xb3\x64\x93\xe2\x06\xf6\x00\x5b\xdd\xfd\xbe\xb7\x63\x8c\x52\x9d\x86\x8b\x92\xb1\xe7\x45\x31\x0a\x9c\xbb\xa5\x7e\x31\xd9\x40\x10\x5f\xed\x69\x99\x99\x78\x1a\xea\x6e\xe3\xff\x27\x98\x2e\x31\xb7\x0d\x88\xb3\xab\xab\x3c\x76\x22\xc7\x53\xd5\xbb\x5d\x31\x06\x40\x41\x22\x35\xdc\xd8\x50\x63\x4d\x59\x92\xa5\x4c\x3e\xa5\xaa\x8d\x81\x04\xbb\xd8\x2f\xca\x89\x88\x69\x8d\x24\xc0\x90\x26\xa3\x39\xb0\x18\x13\x3a\x62\xf8\xb6\x76\x51\x8e\x90\x76\x04\xd7\xdc\xb3\x62\x3c\x9e\x4d\x81\x6a\xfc\x85\x55\x35\x46\xa1\x2e\x05\xbe\x13\x63\xbc\xdc\x14\x93\xd8\xbc\x72\xf6\xdb\x12\x03\x99\x18\x6e\x6c\x4c\x8a\x74\x36\x66\x3d\x1c\x51\xe5\x44\xd8\x18\x86\x18\xf6\xa4\xef\x94\xf3\xfe\xf8\xe9\x9b\x83\xc3\x17\xce\xbb\x83\x33\xe7\xe4\xf5\x2f\xc7\x87\x17\x27\xa7\xaf\x9d\xaf\x1f\x2d\x51\xef\x23\x6a\x13\xe7\xfa\xfa\x96\xc5\x53\x9a\x8c\xae\x85\x89\xcc\xf5\xb5\xf7\xd8\xf7\x7d\x90\xfb\x7e\xfd\xc8\x59\xfa\x84\x37\xf7\xcd\xce\xb7\xce\xd7\x8f\x44\x9a\xa7\x5c\x11\x71\x2c\xc4\xb9\xaf\x39\x7e\x70\x36\xdc\x59\x85\x6f\x1a\x27\xb5\x1b\xf2\x66\x9c\xff\x39\xce\x12\x96\x57\xd2\x87\xe3\x66\xf7\xbb\xde\x6e\x6f\x17\x2d\x94\x68\x52\x6f\xa7\xc5\xa4\x67\x40\xf5\x24\xcb\x7b\x7f\x54\x42\xd5\x72\x58\x4c\xe7\x25\xf0\xdf\x5e\xe2\x3b\x7b\x3b\xbb\x8f\xb7\xe1\x79\x13\x7e\x65\x3f\xa3\x09\x8b\x8b\x62\x44\x9c\x93\x3c\xe9\x29\x8f\xa0\xac\x92\xb6\x89\x60\x02\x98\x55\x8e\xe8\x3f\x05\x59\x04\x68\xd9\x9c\x57\x27\x17\x32\xd9\x0a\xe9\xc7\x9b\x78\x79\x72\x78\xfc\xfa\xfc\x18\x25\x03\xc2\x81\xa9\x2c\x8a\x5a\x50\x47\x9c\xcc\x94\xde\x3f\xa2\x23\x1d\x96\xe6\xd1\xd7\x1b\xce\xab\x22\x65\x65\x9e\xfd\x55\x3a\x8f\xf9\x81\x9a\x96\xcc\xf1\x0e\x91\xeb\x7b\x3a\xcb\xc6\xa9\xef\x2c\x78\xff\x1b\xc2\x68\x8f\xd2\xa8\x6d\x6b\x76\x7d\x32\x69\xcd\xd8\x7b\xbc\xe3\x93\x83\xd6\xac\x1f\xbe\xf3\xc9\xd3\xd6\x9c\x6f\x9e\xf8\x24\x69\xef\x68\xef\xf1\xae\x4f\xd2\x75\x79\x7b\x3e\x61\x6b\x06\xb8\xfb\xd8\x27\xc3\x75\xf5\x1e\xfb\x24\x5b\x97\xf7\x8d\x4f\x0e\xd7\x34\xb9\xeb\x1b\x01\x9d\x8f\x3c\xea\xdf\xf5\x8b\x12\x48\xa9\x38\x6a\x52\x50\xdb\xbb\x24\x89\xdc\x57\x59\x8e\x0e\x81\xc2\x43\x08\xa4\xb0\xff\xc3\xdd\xa2\x5b\x6e\xe8\xdc\x64\x55\x56\x83\xf1\x47\xf0\xe8\x51\x5f\xc0\x4b\x6f\x90\xd5\xc3\x59\xdc\xcb\x0a\x34\x04\x41\x9f\x33\xa8\xb8\x9d\x32\x0e\x34\x25\xf8\x9d\xed\x2b\xb7\xa5\xff\x7c\x7c\x9c\xba\x5b\x94\xa4\xd1\x4e\x98\xfe\x18\x87\xe9\xd6\x96\x9f\x6c\x45\xee\x7f\x3e\xee\x7d\x47\xcb\x41\x75\x79\x85\x25\x58\xce\x6b\xbf\x3d\x3b\x51\x98\xce\xa0\xe3\xd2\xad\xdd\x2b\x3f\x8c\x23\x90\xc2\x78\xc9\x96\x2b\x55\xbe\x4e\x7f\x36\xd6\x4c\x67\x01\x31\xb9\xd1\x0f\xb5\xc8\xb7\x27\x72\x7a\x9c\x99\x35\x1f\xe2\x85\xb8\x1c\xbc\xa2\x10\xd5\x01\xb3\x9a\xa6\x99\x08\x53\x25\x79\x59\xc9\x94\xf6\x5c\x3f\x8c\x41\xa9\x17\xb9\x27\x72\x5e\xce\xbb\xac\xc0\xc0\x53\x6e\x18\xf7\xe0\xf1\xde\xea\xa2\x78\x53\x4c\xa3\xdd\x10\x39\xe3\x38\x5c\x52\xba\x8f\x3e\x56\xc1\x91\xe7\xee\xed\x7d\xef\xfa\x68\xd0\x3d\xa6\xd1\x9d\x24\x97\x83\xce\x0e\x49\x69\x3e\x60\x65\x31\xab\xc6\xf3\x73\x56\x9f\xe4\x39\x2b\x9f\x5f\xbc\x7a\x09\x59\x88\xde\xde\x01\xc1\xaf\xbf\xc1\x16\x93\xa5\x3c\x25\x33\x8b\x57\xb3\x29\x3f\xe4\x15\x38\x32\xe7\xf5\x71\x8a\xcf\xba\x0a\xde\xc6\x2c\xf1\x7c\x9e\xa2\x68\xcb\xcc\xab\xe7\x63\xde\xcb\x32\x54\x80\xf4\x27\xf5\x28\x89\xfd\x3b\xa4\x86\x3d\xda\x8d\xfd\x28\x8a\xe2\x25\x62\x68\x1a\xdd\xbd\x7a\x7b\x8e\x97\xf3\x9b\xb3\xd3\x37\xc7\x67\x17\xbf\x07\xbb\xe4\xf9\xc1\xf9\xf5\xd3\xd3\xd3\x97\xc7\x07\xaf\xaf\xdf\x1d\xbc\x7c\x7b\x1c\x7c\x03\x69\xaf\xdf\xbe\x3a\x3e\x3b\x39\x14\x69\x3f\x40\xda\x9b\xd3\xf3\x93\x8b\x93\x77\xc7\x8d\xcc\x3d\xac\x71\xfa\xee\xf8\xec\xe5\xe9\xc1\xd1\xf1\x51\xa3\xc1\xc7\x7b\x90\x7f\x7e\x71\x76\xf2\xfa\xe7\x46\xde\x77\xdf\x90\x2c\xe7\x17\xe0\xd1\xe9\x2b\xc9\x4c\x1d\xc2\x0b\x35\x81\x42\xca\xd4\xbf\xc3\xa3\x51\x52\x92\x44\xb4\xf7\x46\xbd\x59\xb4\x58\xdc\x2d\x49\x1a\xd1\xde\xd1\xe9\xab\x03\x29\x72\x7f\xcd\xf7\x77\x4a\x13\x91\xcd\xda\xb2\x79\x4e\x48\x31\xe7\xd5\x0c\x7d\x29\x5f\x81\x01\x3b\x66\xc9\xe3\xd8\x87\xa7\x86\xfc\xbb\x8a\x36\xdf\x08\xea\xfb\xfb\x47\x9e\xfb\xcd\x0f\x2e\xe9\xfb\x81\xf0\xce\x03\x97\x95\xa8\xdf\xab\x8b\x97\xc5\x2d\x2b\x0f\x69\xc5\x3c\x9f\x8c\xa2\xe4\xb2\x7f\x15\x0e\xa2\x3b\x6a\x8e\x21\x18\x10\xba\x32\xe4\x00\xd8\x76\xa9\xd2\x84\x62\x7d\x32\xb1\x06\x88\x45\x26\xb3\xaa\x7e\x5b\x29\xfe\x33\xf8\x93\x7a\x23\x12\xf7\x56\x76\xd8\x27\x1b\x43\x5a\x3d\xc5\x28\xc7\x08\x99\xa2\xe8\xca\xc6\x73\x34\x57\xbd\xe6\x7c\x79\x96\xac\x94\xb4\x76\x1c\x4a\xbe\x29\xaa\xac\xce\x6e\xd8\xba\x1a\xed\xc0\x02\x55\x4f\x6f\x58\x39\x2e\x68\xca\xd2\x75\x03\x5b\x07\x4b\x50\x1d\xc3\x3b\xad\xab\xda\x06\x66\xfe\x32\xdc\xfd\x29\x1a\xf4\x1a\x4b\xb1\x05\x29\xe6\x04\x30\xa5\x7d\x7c\x06\x7e\xf8\x76\x87\x6f\x7b\xc8\x56\x81\xa2\xdb\xf5\x06\x3d\x6b\x5f\x23\x76\xd9\xbf\xf2\xc3\xf4\x21\x65\x01\x06\xa2\x14\x2a\xb4\x40\x1c\x54\xb0\xa1\x21\xa2\x50\xb8\xe2\x7f\xa2\xc1\x72\xb9\x24\x15\x8d\xee\x96\xc6\xf5\x52\x0b\xac\x90\xf5\xbd\xf1\x4a\x9b\xd4\x5f\x2c\xf6\x7e\xa4\xe2\xaa\xe9\x76\x3d\xb7\x70\xa3\x28\xa2\x97\x3b\x57\x8b\x85\x7b\x2a\x7f\xf3\x9e\xdd\x1c\xbf\x76\x79\xce\x6b\xf9\xdb\xf7\x11\xdb\x74\x76\xc3\xac\x0f\x42\x27\x8e\x72\x64\xe2\x4e\x58\xdd\x66\x75\x32\x94\xb2\xb9\xd8\xbf\x03\x85\x8e\x2b\xc2\x6e\xbb\x81\xe0\xdc\xdb\x46\xb6\x4f\xa3\xce\x4e\xe0\xc5\xd1\x8c\x7a\xd4\xe7\x9f\x71\x73\x03\x17\x0b\x48\x5a\x05\x08\x91\xb1\x06\xd0\x3c\x7e\xf2\xad\x43\xda\xab\x38\x99\xe4\xed\x90\x6f\x7d\x42\x23\x37\xa5\x35\xdd\x86\x29\x2e\x16\x2e\xbf\x44\xf0\xc3\x27\x34\xc4\xf1\x2b\x75\x8f\x1b\x60\x02\x6a\xb1\xe4\x17\xca\x7f\xe5\x17\x32\x70\x72\xae\x9d\x9d\x50\x52\xf8\x72\xe9\x96\x4b\xb5\x5b\x30\xd7\x3b\xe9\x6f\xd5\xb6\x2a\x15\xbd\xa4\x57\x80\x04\x10\xb1\xdf\x50\x8e\x17\x6f\x69\x74\x43\x57\x8f\x3f\x79\xce\x93\x57\x8e\x3a\xf9\x48\x65\xba\x75\x3a\xc9\x5c\xa5\xb7\x1f\x5f\xf2\x97\x2a\xb0\xee\x88\x92\x03\x55\xa4\xed\x28\x92\xa7\x34\xba\xd3\x18\x3c\xb8\x03\x11\xff\xb3\xd9\x78\x7c\x9e\x94\x8c\xe5\xc1\x73\x42\xab\x79\x9e\xf0\xbf\xb3\xba\x78\x56\x24\xb3\x4a\xfc\x7e\x33\xa6\xf3\xe0\x39\x49\xe8\x94\x73\x6a\xc1\x5f\x94\x24\xe2\x6a\xbd\xa5\x8b\xe7\x24\x29\xc6\x55\x30\xa7\x24\xb1\xef\xd3\xe0\x00\x93\x4a\x9e\xfd\x9c\xb8\x62\xf1\xdd\xe0\x39\xbf\xa0\x59\xc9\xff\x66\x15\x2f\x99\xf2\x9f\xc5\x6d\xce\x21\x86\xb7\x9e\x96\x74\x30\x90\x4d\x70\x4e\xe9\x75\x21\x24\x0c\x2c\x78\x4e\x86\xf0\xc4\x60\xf0\x9c\x8c\x8b\x62\x1a\x3c\x27\x93\xd9\xb8\xce\xa6\x63\x86\x83\x99\xcc\x6a\x39\xae\xdc\xac\x55\x4c\xa1\xce\x74\x4c\xe7\xd5\x09\x84\x5c\x0f\x9e\x93\x92\xd1\xf4\x34\x1f\xcf\xe1\x27\x7a\x23\xc0\x4f\x08\x3b\x01\x3f\x8b\x5b\x98\x5a\x59\xdc\x9e\x4f\x69\x1e\x7c\xa4\x64\xa3\x4a\x8a\x29\x64\x56\x8c\x4e\xc6\xac\xaa\xe0\xe7\x18\xf4\x4f\xd8\x71\x95\xfd\xc5\x78\x2d\x78\x8c\x93\xd7\xa9\x78\x5d\x9e\x30\x65\xe3\x31\x90\x25\x7c\x66\x48\x49\xec\x90\x9a\xc6\x10\x07\x31\xd8\x21\x59\xcd\x26\xe7\xbc\x7d\xbe\xf2\x60\x63\x7e\x38\xa4\x65\xc5\xea\x60\x87\x80\x08\x15\x6e\xa6\x1d\xc2\xe9\xc7\x67\x45\x09\xbf\xea\xe9\xf1\x9f\xb3\xec\x26\xd8\x21\x28\xf1\x3c\xa0\x4b\xb2\x72\xef\x06\x77\x76\x73\x2e\x7e\x6e\x27\xf8\xed\x1a\xad\xbb\xf0\xd3\x55\x7d\xb8\xfd\xa2\x74\x8d\x7e\x5c\xfe\x73\x9b\x2f\xd7\x8d\x0b\x3d\x35\xee\xf1\xe0\x0e\xc7\xa1\xc9\x08\x81\x05\x11\x49\x49\x1c\xe5\xd0\x1e\xf2\xf3\x6a\xa0\x9e\x0b\x15\x5d\x3f\x94\xa7\xba\x13\x71\x7c\x31\x9f\xb2\xc5\xa2\xb3\xcb\x11\x01\x3f\x96\xab\xe5\xf7\x69\xaf\x62\xf5\x4a\x3a\x71\xdd\xad\xd8\x0f\x28\x1a\x87\x66\xf5\xbc\xdb\xed\xe8\x8f\x5e\x4c\xd3\x93\x7c\x3a\xab\xbb\x5d\xda\x03\x1b\xf3\xa3\x22\x41\xfd\x16\x4d\xf8\xfd\x2a\xe4\x55\x7c\x0c\xdd\xee\xc6\x7d\x5d\x70\xec\x7f\x78\xff\xe1\x7b\x11\xdd\x7d\x1c\x67\xf9\x08\x57\x2f\x78\xf4\xe8\xf6\xf6\xb6\x77\xfb\x18\x62\x52\xec\x3e\x79\xf2\xe4\x11\xe4\xba\xe4\xe3\x64\xdc\x56\xe4\xb7\x57\x2f\x79\xb1\x1f\x1e\xe5\xf2\xb2\xe2\x4b\xdf\x3c\xd0\xb3\xba\x38\x43\xd8\x0d\x0e\x29\x61\x1f\xd1\x6c\xfa\x8c\x21\x1b\x59\x9d\x49\x10\x3f\xa4\x44\x3e\xe2\x79\x30\x9e\x0e\x69\x70\xb8\x06\x64\x8c\x06\x5d\xe3\xc3\xbd\xa7\x6d\x77\x6d\x96\xdb\xe8\xd4\xb5\x3e\xdd\x96\x11\x00\x2d\x19\xe0\xc2\x1d\x24\xf5\x8c\x9f\xe4\x17\x3d\xf8\x24\x98\x58\x26\x65\x31\x6e\x24\x3e\x2f\x59\xdf\x4e\x39\x5b\x29\x73\x3e\x2c\x6e\xed\x94\x8b\xac\x6e\x16\xba\x98\x4f\x75\xca\xc6\xc7\xc9\xf8\x29\xad\x20\x61\x32\xe6\xfb\xf4\x92\xe6\x03\xfd\x75\x0e\x54\x24\x7c\x2e\x97\xe4\x98\x46\x8f\x2e\xff\xb3\xfd\x9f\xe0\xca\xbb\xa4\xdb\x7f\x5d\xf9\x8f\x06\x9a\x5d\x78\x6e\x5e\x35\xfc\x2e\xef\xd5\xc5\xdb\xe9\x54\x5e\x89\xcb\x0d\x38\x9c\x79\xbd\x3d\x64\x22\xb2\x71\x36\x00\xa6\x6c\x3b\xa6\x15\xe3\xa8\xcb\xa1\x25\x8d\xb3\x64\x9b\xe3\x46\x47\x26\x6e\x57\xc3\xac\x5f\x3b\x09\x9d\xca\x8a\xc9\x38\x9b\x6e\xc3\xb3\x27\xf0\xab\x9c\x8d\x21\x54\x4a\x51\x6e\x83\x49\xfd\x54\x30\x67\x6d\x69\xdb\xfd\x6c\x5c\xb3\xb2\x12\x79\xd3\xb2\x00\x71\x05\x7e\x95\x4a\xc9\x99\x16\x93\x2c\xa7\xe6\xc8\x50\xe0\xb9\x1d\xd3\x64\x34\xc0\x68\x08\xfd\x6c\x3c\xde\x2e\xa6\x34\xc9\xea\x39\x7e\xc0\x40\xfa\xe3\xa2\x48\xb7\xa1\x41\xf1\x5b\x95\x29\xf2\x7a\xbb\x4f\x27\xd9\x58\xfc\xe6\xf8\x54\xff\xda\xa6\x29\xc4\x9e\xc3\x84\xba\x64\x75\x32\x94\x1f\xf3\xb1\x28\x28\x39\x50\xf8\xb8\xc5\xe5\x18\x8c\xe7\xd3\xe1\x36\x18\xab\xe2\xcf\xa2\xcc\x64\x3c\x97\xed\x61\x51\x66\x7f\x15\x79\x4d\xc7\x2d\x99\x37\xfc\x88\x25\x9c\xed\xe5\xa5\xb6\x69\x7a\xb3\xfd\x51\xfc\x46\x47\x98\xed\x8f\x4e\x36\xa1\x03\x66\x2c\xcd\x18\xde\xe0\xdd\xe6\x40\x0c\x9f\x7c\x08\x59\x3e\x10\x33\x9e\xd0\x72\xc4\xca\x6d\x96\xa7\xf2\xe7\x24\x53\x3f\xe1\xde\x80\x67\x61\x61\x5f\xc1\x1e\x01\x62\xa3\xc8\x94\x7a\x98\x25\xa3\x9c\x55\x95\x33\xa5\x59\x5e\x6f\x83\x23\x9e\x33\xa5\x79\x51\xb1\xed\x5d\x7c\xfb\x99\xb7\x7e\x03\x21\xf2\xd5\x98\x60\x8b\xf3\xda\xa9\x86\x74\x6a\x0e\xb5\xaa\x8b\xa9\x18\x17\xfc\x94\x1b\xc1\xa9\xa9\x11\x13\x31\x50\xf5\x30\xec\x64\x3d\x96\xaa\x2e\x8b\x11\xdb\x4e\x69\x35\x44\xdf\x10\x23\xa1\xe8\xf7\x2b\x56\xcb\x14\x3e\x89\x84\x4e\xcd\xcf\x3f\x8a\x2c\x97\xdf\x93\xac\xe6\x13\x9d\x64\xaa\x82\x31\x22\xfe\x79\x9b\xa5\xf5\x10\x1e\x00\xdb\xa6\x79\x32\x2c\x4a\xfc\x9d\xb2\xa4\x28\x85\x25\x12\xff\xd6\x33\x04\xc9\x9c\xbd\x98\x3a\x49\xcf\x60\x96\x67\x49\x91\xb2\xed\x38\x4b\x33\xf5\x51\xd2\x7c\xc0\xf8\x57\x5d\x6d\x4f\xf9\xaa\x4e\x9c\x9b\x6d\xca\x71\x56\xcc\xea\x2c\x71\x6e\xb6\x87\x34\x1f\xf0\x5e\x6e\xb6\xb3\x94\x15\x83\x92\x4e\x87\x90\x3e\xa1\xf5\x90\x4d\xd0\x31\xc5\xb9\x01\xd9\xde\x36\xeb\xf7\x59\x52\x3b\x1c\xa2\x00\x8e\xe6\xf8\x53\x81\x91\xf9\x35\x77\x6e\x8b\x32\x55\x20\x74\x5b\x66\x00\x41\x93\x22\x65\xce\x47\x79\xc8\xf1\x5a\xa1\x88\x1e\xe5\x17\xe2\x45\xf1\x35\x2c\x59\x5f\xfc\x34\x52\xab\x61\x71\x2b\x7e\xd6\x1c\xf7\xc9\xdf\xf3\x29\x73\xf8\x2d\xc4\x4f\x34\xff\x91\x57\x01\xe4\x40\xe2\x98\xe6\x03\xf8\x81\x77\x50\xaf\x9a\x8e\xb3\xda\x73\x1d\xd7\xef\x09\xf5\x99\xb7\x2a\x3d\xa0\xca\x13\xfb\x98\x92\x8d\xe7\xd4\x0f\x8f\x4c\x59\xc2\x65\x7c\x15\xed\xf0\xa4\x15\xfc\xcf\x73\xe8\xd2\x0f\x6f\x68\x6f\x8d\xac\xc2\x7b\x4a\xef\xcd\x3e\xa2\x42\x9a\xf4\x3a\xba\xbb\x4e\xe8\x6c\x30\x44\xff\x2a\xe4\xe5\xaf\x87\xb4\x3a\x34\x12\x3b\xbb\xe4\xba\x04\xc0\xbe\x6d\x94\x3a\x33\x53\x3b\xbb\x42\x74\x92\x15\x79\x70\x87\x3f\x21\xe7\x6d\x9d\x8d\x2b\x4b\x7c\xe2\xca\x0f\x4e\xca\x08\x5e\x8c\x8f\xf6\xa6\x18\xb1\x9f\x67\xb4\x4c\x59\x2a\x9f\x9a\xda\x3f\xf2\xdc\xdd\x27\xdf\xbb\x4a\xa8\x71\xc2\x99\xa5\xd6\xa2\xcb\x25\x69\x4d\xb7\x48\x2e\x92\x90\x94\x30\xd2\x27\x03\x32\x22\x43\xff\xee\x84\x0a\x8d\xf2\x6b\xa2\xb5\xc9\x6b\x1a\x3a\xc8\xd3\x43\x5a\x27\xc3\x67\x59\x59\x89\xb5\xb9\xaf\xe9\xd7\xed\xc3\x34\x35\xd8\x86\x02\x3b\xeb\x7b\xaf\x7b\xf6\xca\x7b\x3e\xc2\x4a\x19\xbd\xee\x25\x63\x46\x4b\x2b\x2f\x7c\xdd\x6b\xee\xc1\x62\xe1\xad\x26\x46\x9d\x1d\xf2\xba\x67\xed\x60\xb4\x51\xfa\xcb\x25\x11\x49\xe6\x5e\xab\xf9\xa8\x9b\xf8\x97\xf6\x05\x6a\xc0\xc8\x6a\x3d\x1c\x88\x51\x66\x49\x9a\x73\x30\x6b\xc1\xf4\x1b\x35\x70\xf6\x34\x7a\xdd\x33\x81\x34\xb4\x3f\x23\x30\x38\x5d\xa9\x1b\x75\x76\x43\x49\x4b\x2c\x01\x86\x7e\x70\xfd\xa5\x21\x9d\x3c\xa1\xed\x7b\xd6\xd2\x4e\x5b\x87\xb8\x2f\xe8\xa0\x36\x2d\x8b\xba\x00\x57\x15\x60\xdb\x51\x03\xa4\x16\x8b\x3c\xf6\xc3\xba\x9c\xdf\xc5\x62\x1d\x13\x52\xfa\x4b\xb0\x77\xf6\x72\xe8\xd0\x6a\x9b\xb4\x8c\x60\x67\xb9\xd4\xf2\x93\x5f\xa8\xb9\x5a\xe6\x46\x1b\xcb\x65\x6e\x76\xd8\xdc\x7c\x63\xc1\x6c\x38\x91\xe2\x67\x1a\x2e\x97\xbc\xa9\x17\x14\xca\x92\x97\x0d\x11\xce\x2b\x31\x84\x17\xd4\x97\x82\x49\xea\x64\xb9\xf3\x52\xe1\xb6\x97\xf4\x92\x5e\x91\x24\x7a\xc1\x8f\x6a\xca\x3e\x9e\xf6\x3d\xea\x87\xdb\xbb\x3f\x26\x86\xd4\xea\xc9\x77\x2e\xa1\x00\xf8\x9d\xd7\xf4\x32\xb9\xf2\xef\xe2\x1e\xfb\x08\xe1\xdb\x8e\xe1\x8a\x36\xcb\x7e\x0f\x65\xa1\x5c\x14\x87\x49\x14\xf7\xe0\x1a\x47\x27\x18\x39\x8a\x54\x88\x47\xc1\xa0\x30\x32\xa4\xa0\xfd\x28\xb9\x4c\xaf\xc8\x20\x8a\xc9\x28\x4a\xc3\xd3\x15\x41\xc6\x08\xc4\xa7\x4f\x9e\xb8\x64\xa4\x30\xcd\x29\xbd\x1c\x5d\x45\x7d\x68\x60\x18\xf5\x7b\xd3\x21\xad\x58\x7a\xc6\x06\x59\x55\xe3\x7d\x0a\xe8\x98\x4f\x60\x88\x1a\x13\x50\x5c\x0d\xfd\x61\xb3\x75\xe6\x77\xbb\x6f\xa8\x37\xbc\x64\x57\x1c\xd0\xfc\x90\xf1\x4d\x05\xd3\xad\x7e\xaf\x6c\x34\xb8\xef\xbd\xa1\xde\x6a\x32\x54\x24\xbc\xa2\x1f\x30\xbe\x57\xa6\x00\xf0\xc9\x0f\x2e\x49\x09\xe5\x2c\x97\x01\x2a\x6f\x04\x88\xfb\x77\xbf\xf2\xfd\x00\x54\xba\xb3\xc3\x17\x52\x4e\x11\xd2\xa3\x38\x3c\xc3\xbf\xc6\x9a\x5e\x26\x57\xbd\x94\x4d\x39\xa9\x90\x27\x19\xab\x00\x20\x5e\xd3\xe8\xf2\x8a\x9c\x72\x70\x20\xbf\xc2\xbf\x67\x00\x1a\xaa\xc7\x73\xa0\xe1\x5f\x50\xec\x6a\x57\x63\xed\x17\xf4\xde\xb3\xe2\x87\x1c\xa6\xb4\xd8\xe9\x82\xea\x7b\xb2\xb3\x4b\x12\xd8\xe1\x04\x9c\x21\xfd\xac\xef\xad\x6c\x5f\x22\x30\x65\x1a\x71\x00\x09\x5f\xb6\x14\xe8\x76\x5f\x02\xf0\x44\x51\xba\x58\x78\xf0\x1b\x47\xb9\xe7\x92\x44\x8e\x93\x60\x99\x94\xc4\x7c\x9d\x97\x71\xb7\x0b\xe3\x82\xbb\xf2\x2d\x8d\x1a\xba\xf1\xe9\x78\x36\xc8\xf2\x2a\x78\x4d\x09\x2c\x1c\xdf\xa6\xa3\xac\x9a\xf2\xb3\x8d\x37\x6d\x15\x9c\x52\xd2\xdc\xc9\x57\xa0\xd4\xad\x82\x5f\x57\xb3\x8e\x8c\x15\x0f\xce\x28\x99\x16\x15\xb8\xbf\xaf\x00\x1d\xde\xc1\xe2\x92\xe5\x7d\xbf\x81\xb1\x9c\x72\x8a\x37\x38\xa7\xab\x39\xd5\x53\x14\xdf\x5f\xd0\xa5\x4f\xde\x89\x83\xfd\x5e\xfc\xfd\x0d\xff\xea\x7d\xfc\x5d\x21\x47\xff\x2e\x56\xc2\x06\x77\x86\xb1\xb1\x90\x82\x76\x43\x2a\x3d\xe3\x2f\x68\x39\x60\x75\xf4\x1b\xf5\x52\x7e\x2d\x3d\xf0\xf2\xf4\x78\x07\x62\xdd\xa9\xbf\xd2\x1a\x8a\x14\xd5\x90\xfe\x2d\xe4\xc6\x42\x5c\xc2\xf7\xee\xf1\x8e\x06\x30\x25\x48\xa1\x52\x90\x12\xf3\x34\xdb\x83\x98\xfa\x80\xb7\xec\xc4\xd8\xd7\xa2\x97\xe9\xac\x1a\x0a\x34\xcd\x3b\x23\x34\xc4\x34\x2f\xf6\xf5\x6d\x22\x7e\x34\x5b\xd9\xbf\xa4\x57\xbd\xa4\xc8\x13\x5a\x7b\xb1\x1f\x5c\x52\x12\x5f\x69\x88\xfe\x4a\x9d\xc5\xe6\x90\xf6\xa9\x22\x12\x79\x7e\x40\xbb\xdd\x58\x44\x6d\xe7\x27\x1a\xb0\x6b\x8c\xfb\xa3\x57\x23\x8e\x95\xfc\x48\x1c\x94\x24\xa2\xbd\xeb\x54\x40\xdf\x4b\x78\x03\x90\x95\x15\x68\xa3\x54\xf2\x49\x5e\xd5\x34\x4f\x10\x67\x35\x9e\xb7\xf3\x15\x2e\x67\xd1\x4e\xc8\x7e\x4c\x94\x10\xbe\x43\x7b\x59\xc5\x4f\x12\x1d\x00\x00\x9e\xd7\xc5\x74\xca\x52\xcf\x0f\xd9\xd6\x96\x2f\x41\x85\xe3\xb6\xf4\x92\x5d\xf9\x21\xe0\xb5\xa4\xdb\x35\x80\x28\x6c\x1b\x1b\xce\xa9\x6d\x78\x32\x27\xab\xde\xb0\x52\xbc\x67\xe8\xf9\x8b\x05\xe5\xeb\x8b\xb6\x31\x45\xd9\x13\x01\xb0\x3d\x8e\xf6\xb4\xd5\x61\x6c\x48\x11\x60\x95\xf8\x41\x56\xd9\xe9\x6a\xf6\x2e\xae\x71\x16\x47\x77\x5f\x76\x9e\x8c\x6d\xf9\x43\x6c\x8b\xdc\x90\xaa\xa6\x35\x7b\x5d\xa4\x0c\x6e\xb9\xc4\x37\x23\x29\x22\xbe\x7a\x47\xbd\x04\xef\xc0\xd4\xca\x4d\xa2\xf4\x32\xbe\x0a\x69\x20\x34\x16\x4a\x55\x51\xe4\x87\xe3\x2c\x19\x29\x61\x3e\x7e\x1e\xa2\x10\x5a\xa7\x1e\x15\xb3\x78\xcc\x1a\x45\x8d\xc4\x95\x0a\xaf\x8a\x59\xc5\x8e\x8a\xdb\xbc\x25\xa9\xbd\xf0\xab\xe2\xa6\x2d\xa9\xbd\xf0\xdb\xe9\x4a\x82\x2a\xe8\xa5\x51\x27\xed\x49\xa9\xb7\xbf\x58\xa0\x42\x64\x3e\x65\x24\x8d\x3a\x9e\x1b\xcf\xea\xba\xc8\xa5\xfe\x23\xcb\xa7\xb3\x5a\x7e\xa0\x84\x59\x7e\x71\xf6\x96\x96\x8c\xa2\x76\xc4\x0f\x69\xd4\x49\x43\xf0\x39\x73\xa8\xd2\x72\xd0\xa8\xb3\xbb\x84\x73\x63\xad\x77\xb7\xdb\xc6\x95\x24\x1c\xcf\xec\x3d\xde\x75\x49\x4c\x64\x92\xc2\x39\x1b\x32\xf6\xa9\x86\xaf\x51\xac\x11\xa7\x3a\x4f\xa4\x1f\xed\x84\xfd\x1f\x5f\x4b\xbd\x56\xd8\xdf\xda\x42\x18\x19\x44\xaf\x29\x28\x63\xbb\x5d\x6f\x10\x0d\x6c\xf2\x47\xb5\xe4\x77\xbb\x1e\x8b\xfe\x4d\x3d\x46\x06\xbe\x2f\xf1\x0f\xd3\xbd\x8e\x01\xaa\x69\xb7\xeb\xd1\x98\x97\xa3\x31\xa1\xbe\x01\xf5\x93\xd8\x60\x3b\xe3\x50\xa2\x13\xba\xff\x15\xe5\x38\x27\xf6\x03\xf8\x91\xc6\x7e\x48\x01\xb3\x3e\xf9\x56\x63\xd6\xd7\xbd\x55\x3e\xc1\xc3\x33\x93\xc7\xcd\x2b\x51\x73\x80\x59\x4c\x06\xac\x96\x87\x3d\xf8\x23\x26\xd6\xe4\x82\x51\x4c\x58\xfe\xe7\x8c\xcd\x98\x48\x18\xc7\x44\xbc\xf0\x0b\x09\xbf\xf2\xac\x60\x12\x2f\x7d\x52\xc4\xd1\x2b\x5a\x0f\x7b\x25\xcd\xd3\x62\xe2\xf9\xd6\x93\x3a\x42\x55\xb6\xe7\x93\xd3\xc8\xbd\xbe\x06\xdb\x12\x19\xc0\x59\x22\x94\xaf\xdc\xad\x22\x26\xd3\x58\x15\x80\x1e\x9e\xd3\x3c\x1d\xb3\xb2\x82\x5c\xe3\x10\xff\x09\xab\xc5\x21\xe4\xf2\xf4\x4a\xdd\x0d\x97\xa7\x57\xa1\xb6\x8a\xb9\xbc\x0a\x3b\x90\xc4\xc9\x91\x18\xef\x08\xea\x13\xda\x13\xe1\xab\x8a\x94\xf9\x1c\x88\xf5\x27\xa2\xc5\x26\x02\x48\x04\x95\xca\xf1\x34\x6f\x2e\xeb\x7b\xdf\x72\x12\xa5\x57\xd3\xc1\x62\xf1\x9d\xfc\x29\x47\x91\xc2\x10\x42\xbe\xd3\x58\x81\xc3\x78\x8c\xef\x9c\xfb\x49\x94\x86\xab\x10\x59\xca\xd9\x7c\x0b\x9a\x02\xd5\x2e\x35\xdb\x35\x31\x15\xbf\x58\x1f\xbb\x06\xf4\x54\xb1\x25\x98\x9d\xc6\x57\x8b\x85\xd6\xf7\xd5\x2b\x30\x00\x96\xee\xc9\x90\xc1\x6b\xbe\xbc\xc9\x86\xce\x23\xbe\x3c\xbd\x8a\xe8\x92\x83\xc7\xe1\xb8\xa8\x58\x55\xcb\x7d\x7a\x56\x16\x13\xa8\xf0\x27\x00\xcf\x4a\xb2\x29\x43\xa0\xb8\x60\x42\x67\x49\x17\x8b\x6f\x3b\x62\x52\xdd\xee\x77\xf2\xe7\x3e\x1f\x67\x80\x7d\xf1\x16\x78\x4b\xb2\xd5\xa0\x84\x4e\x60\x94\xc2\x58\x13\x1c\x2c\x54\x6f\x55\x4c\x30\xd6\x1b\x14\x81\xbc\xc6\x4c\x60\x31\xa2\x78\xb9\xf4\x35\xe9\xf4\x2b\x1f\x5c\x5a\x38\x7c\x7c\x2e\x8e\xce\xbd\x0a\x21\xcc\x83\x47\xbb\x5d\x35\x4a\x4d\x50\xec\x53\x54\x9f\x6a\xa5\x6b\x2c\x69\x05\xc5\xd8\x70\x80\xa3\xa1\x9f\x6a\x48\x8b\x78\x47\x00\x0e\x34\x4a\x25\x62\xd9\xf9\x91\x6e\x6f\x87\x7e\xec\xa5\x9c\xff\x72\x85\x6a\x32\xe5\x14\xae\x28\xba\x13\xd2\x1f\x55\x71\xba\xb5\xa5\xca\xc6\xb3\x98\x63\x5f\x5e\xd4\xa0\xba\x6e\xd4\x50\x38\x9c\x47\x70\xbf\x25\xbd\xd4\x22\x72\xd7\x31\x46\x97\xf1\x95\xef\x27\x6d\x17\xff\xbf\xa9\xd7\x96\xce\x29\xae\xa4\x8d\x1c\xb0\xcb\xab\x74\x4e\x1e\xa9\x91\xde\x4a\x1c\x48\x1f\x38\xbc\x6e\x97\xaf\x73\xef\xba\x06\x72\x93\x37\x4a\x6e\x62\xab\xc9\x8f\x0a\x11\x3c\xbc\x55\x2d\xdd\x33\x1a\x0e\xe3\x28\xde\xff\x95\x53\x85\x70\xf0\x67\xb1\x17\x8b\xbe\x8c\xa5\x9e\xab\xa5\xa6\xdd\x6e\xd2\xed\xae\x2c\x73\x93\x59\xe8\x76\xd7\xee\x48\xb3\x28\x5c\x21\xff\xe5\xad\x30\x16\xee\xaf\xb5\x7b\xb1\x3a\x87\x79\x73\x13\x80\x23\x31\xb7\xe1\x00\x5a\x03\x02\xfa\x36\x36\x81\xf3\xa9\x71\xd9\x66\x7d\x2f\xe9\x76\x53\x9f\x06\x82\xfb\x4f\xb4\xd1\x54\x94\x92\x41\xb4\x43\x46\x11\x0b\x47\xe1\x28\xfa\xd5\x1b\xf9\xfe\x60\x6b\x2b\x1c\xf1\x6b\x59\x14\x1a\x46\xfd\x70\x18\x0e\xa3\x5f\xbd\xa1\xef\x8f\xb6\xb6\x10\xd1\xee\xfc\x38\xd8\x1e\x85\x3e\x8b\x7e\xf5\x98\x4f\x06\xdb\xdb\x32\x79\xb4\x3d\x08\xfd\x7e\xf4\xab\xd7\xf7\xc9\x48\x26\xf3\x7c\x18\x09\x8b\xa2\xa8\xbf\x58\xc0\x9f\x1e\x1d\xc3\x65\x54\x33\x5f\x52\x22\xd8\x5c\x88\xd5\x97\x0c\x39\x1d\xb8\x1e\x98\xe0\xc3\x22\x06\x2d\x32\x7e\xec\x39\x28\x74\xa2\xa8\x1f\xfa\x77\x83\x28\xd1\xcd\x49\x96\xa7\x13\x45\x83\x6e\x77\xc0\xfb\xc2\x1e\x42\x86\x58\x22\xf1\xc3\x24\xfa\xd5\x4b\xfc\x25\x70\xcf\xbc\xad\xb4\xdb\x4d\x55\x5b\xe9\x43\xda\x4a\xb0\xad\xd4\x0f\xd3\xe8\x57\x2f\xc5\xb6\xd0\x22\x53\xc5\x5a\x4a\xb7\xb6\xfc\x79\xec\xb1\xcb\xd4\xc4\x23\x0a\x3b\x25\x0d\xec\x34\x8f\xbd\xa4\x81\x9e\x62\xc1\x63\x1f\xae\x5c\x26\xea\x9d\x4e\x76\x71\x5b\xbc\xe1\x67\x4e\x72\xd8\xac\x0a\x0e\x62\x72\x5f\xfe\xf9\x28\x9b\x22\x33\x69\xdd\x1c\x00\x49\x1f\x63\x7f\x69\x54\x3e\xe6\x14\xc3\x4b\x46\x6f\xcc\xe6\x9f\x9a\xcd\x1f\x81\x19\xb2\x91\xbb\xd2\xe4\x5f\xb1\xbf\x5c\xfa\xe4\x28\x6e\x30\xd3\xc7\xb1\xe7\xdf\x75\x8e\xe2\x6e\x77\xd2\x4b\x68\xfe\xb6\x62\x47\xa7\xaf\xba\x5d\xef\x28\x8e\x80\x62\x15\x06\x97\x6e\x96\x3b\xa9\xd4\xb5\xcb\x1f\x42\xdb\xbe\x6f\x15\x0c\x5c\x30\xdc\xbc\x60\x1f\x6b\x57\x5d\x23\x47\x31\x90\x64\x67\xd1\xdd\x75\x59\x14\xb5\x10\xd2\x83\xce\x8c\x17\x14\xdf\x7d\xc1\x8d\xab\x24\x93\x7b\x79\x16\xa3\x5c\xef\xac\x67\x95\x93\x44\x42\x23\x19\xe8\x17\x4a\xe2\xe8\xac\xa7\xbb\x21\x49\x14\x8b\xed\x26\x29\x61\xd1\xcf\xb1\xe7\x93\x7e\xa4\x40\x45\x5f\x42\x49\xb7\x1b\x5f\xd2\xab\x28\x8a\xd8\x25\xbd\x82\xab\x48\x18\x2c\x26\xdb\x34\x44\x28\xdb\x0d\xd3\x1f\x39\x40\xc6\x97\xc9\x76\x8a\x45\xfb\xdb\xe9\x15\x00\x5c\xd8\x18\x4e\x24\x24\x4a\x1e\x25\xbb\x3f\xa6\xfb\xbb\xdb\xa9\x20\x60\xd5\x0a\x35\x2a\x68\x04\xc3\x07\x29\xe8\x1b\x61\xc0\x90\x41\x69\xbe\x8e\xfb\xe2\x2f\x86\xe6\x08\xc4\xd7\x25\xdf\xd3\x2b\x84\xd9\xe7\x71\xe4\xda\x58\xce\x31\xd0\x99\x93\x53\xb0\x9a\xb8\xc1\xa0\xa2\x2a\xe6\x0c\x88\x50\x58\xea\xb4\x71\xd6\xce\x2a\x3e\x76\x56\x51\xae\xa9\x66\x22\x27\x71\x74\xc7\xf9\x13\xdc\x66\xec\x1e\x7f\x5b\x42\x95\xe0\xe9\xca\x93\x30\x30\x10\x38\x38\x58\x1e\xcf\xaf\x10\x30\x25\xbc\xa7\x31\xd8\x1c\x61\xc3\xd9\x84\x9d\xd7\x74\x32\xb5\xa0\x5f\x11\x91\x2a\x7b\xb1\x38\xa2\x35\xeb\xe5\xc5\xad\xe7\x2f\x49\xda\x98\xb4\x10\x5e\x55\x17\xe5\xac\x92\x9f\x26\x1c\x9e\x6b\xb4\x0e\xee\x2e\xf6\xea\x46\x34\x84\x54\x63\x91\xa3\x18\x93\x8c\xb5\x8e\x92\x90\x46\x90\x68\x8a\x0c\x80\x31\xe8\xd3\x84\x29\xbc\xcf\x50\xa8\xb8\x22\x30\x64\xfc\xc6\xf4\xe2\x88\x5e\xb2\x2b\x7f\x9f\x37\x74\xc9\xae\xa2\xd8\x4b\xfc\xc0\xc5\x8e\x39\x93\xc9\x20\xa7\x87\x09\x51\x1a\xc8\x72\x09\x08\x42\x20\x6f\x75\xcf\x23\x81\x6a\x93\x5e\x73\x61\xf6\x57\x93\x02\xb0\xf0\x49\x7a\xb8\xc6\x60\x2f\xe8\xef\x5b\xbb\x78\x51\xce\x98\xbd\xaf\xcf\x20\x82\x8e\xe8\x7d\x15\xbc\xa2\x96\xc2\xd2\xeb\x73\x98\x55\xcb\x8d\x03\xef\x5c\xcb\x69\x09\xa7\xe7\xf9\x58\xc4\x34\x4c\xa5\x0d\xee\x4e\x73\x7a\x1d\x94\xb9\x8b\xe5\x37\xf6\x04\xf8\x16\xda\xb3\xdb\xdb\x6f\x26\x78\x7e\x20\x05\x8d\x96\x7a\xd0\x58\x01\x68\xc6\xf8\x8e\x3a\xbb\x3e\x59\xb7\xda\x2b\x8b\xe5\x2f\x49\x55\x17\x53\x63\x61\xcc\x39\xdd\x3b\xf4\x46\xbd\xfd\x95\x94\x75\x83\xc7\x83\xf4\x14\xce\x16\xb4\x64\x26\x44\x9d\x1d\x35\xfc\x4f\x6d\x97\x98\xc0\x14\xe5\x62\x2b\x9b\x61\x4a\xcc\x56\x2b\x2e\x89\x99\xdf\x02\x34\x64\x43\xfa\x9e\xd9\xda\x39\x63\x51\x5a\x8f\x13\x89\xe1\x40\xc5\x78\x98\xe0\x14\xc4\x57\xe2\x1a\x54\x18\xff\x79\x6c\xf2\x1d\x50\xe8\x39\xbf\x02\xb0\x20\x67\xa2\xce\x75\x8b\xd1\x49\x1c\x9e\xf7\xe8\x0c\xfc\x00\x21\xf0\x56\x64\xf3\x5e\x5a\xe2\xe7\xf9\x77\xcb\x44\x03\x6c\x24\x9f\x1e\xc7\x4f\x21\x67\xcb\xd9\xad\x93\x84\x07\x5e\xca\x79\x74\x99\xe7\x87\xc6\x47\x94\x9a\x5f\xe6\x3c\x23\x1a\x52\x63\x64\x07\xde\xdd\x12\xb7\xcb\x98\x3f\x6f\xca\x1a\x2d\x14\x30\x53\xc2\x5f\x38\x1d\xbb\xe4\x7f\xce\x4d\x7e\xd1\x26\x62\xa1\x1a\xe2\xe4\xa2\x18\x8b\x05\x93\x1a\xad\x46\x26\xb0\xfd\x78\xce\xd1\xe9\x8c\x28\x79\xab\x92\x11\x69\x57\x64\x38\xdc\xaa\x2f\x83\x8c\x3e\x43\x6a\x1d\x62\x93\x71\xa8\x14\x6e\x56\x96\xff\xc9\x63\x97\x4f\x50\x03\x87\xe7\x87\xbb\x3b\x3f\xb5\x0e\xb6\xdb\x6d\x0e\x13\x59\x56\x7d\xdf\xfe\x82\x1d\xea\x22\xc0\xdd\xf6\xd4\xf3\x8a\xd1\xaf\x71\x48\xa5\x78\x37\x3a\x8b\x75\xcd\x73\x63\xb1\xc4\xcc\xce\x71\xee\xa8\x4e\x97\x93\xb3\x21\xc7\x3b\x8f\xc9\x5d\x4a\x6b\xc1\x67\x1b\x8b\x7f\xf1\x65\xed\x5d\x34\xda\x03\xf5\x50\x1c\x5d\x3e\x21\xbb\x8f\xc9\xde\xf7\xe4\xf1\xde\x15\x79\x17\x47\x16\xb9\xe7\x1e\x8a\x10\x2a\x59\x91\x03\x4a\xe1\x44\xc6\x6d\x96\xa7\xc5\x2d\x79\x2f\x48\x46\xbb\x82\xa4\x01\x5f\x15\x29\x33\x89\xc3\x6e\xd7\x7b\x1f\x47\x2b\xa4\xe2\x2b\x08\x35\xc9\x87\xf2\x5b\x1c\x6e\x64\x7d\xef\xb7\xe6\x08\x38\xd5\xd3\xe8\xba\xdb\xed\xbc\x17\xf2\xea\xdf\xe3\x08\xd3\x7a\xfc\x0a\xa4\xe1\x6f\x71\xd4\xf1\xa4\xb1\x78\xa4\x70\xd9\xef\xb1\x29\x29\x35\xd3\x7b\xc2\x7d\xb9\xdb\xdd\xdd\xfb\x29\x9a\xd2\xb2\x62\x27\x79\xed\xe9\x0c\xcf\x27\xbb\x3b\xbe\x20\xf5\xff\x1d\x47\xbf\xc5\xe4\xab\xc6\x18\xbd\xce\xbb\x78\xb1\x78\x1f\x77\xbb\x3f\xfc\xc8\xff\xdd\xdd\xfd\x29\x7a\x1f\xfb\x84\x26\x11\x8a\xfc\x7a\xfd\xb2\x98\x1c\x0e\x69\x79\x58\xa4\xcc\x7b\xbc\xe7\x93\x38\x89\xee\x30\x66\x02\xd8\xad\x06\x77\x6b\x38\xf3\xe0\x4e\xb0\x26\x81\x5b\xe4\x4f\x75\x05\x57\x5a\x70\x37\x33\xa4\x7c\x9a\x13\x30\x86\x5a\xee\xd2\xad\x8b\xa9\xb9\x99\x79\xea\x12\x9e\x86\xef\xc7\x55\x15\x7e\xf1\xc5\x16\xed\xf3\xcf\x37\xb4\xaa\x99\x7b\xb5\x24\x89\x55\xf3\x61\xa3\x6d\xf6\x66\x0e\xd8\xce\x5b\x33\x66\x3e\x82\xa7\xe3\x59\xe9\xac\x0c\xdd\xc1\x81\x1f\x15\xb7\xb9\x63\xcc\x41\xfc\x7e\x3b\xe5\x3f\xb4\x6a\xc0\x20\x39\xad\x99\x9c\x83\x49\xf7\xe7\xce\x05\x6a\xb9\x64\x63\xcd\x74\x20\xfb\xf3\x26\x04\x55\xfe\x99\x29\xbd\x05\xd1\xdf\x67\xcf\x09\xab\xad\xdd\x22\xcc\xfe\xbc\x49\x61\x9d\x2f\x9f\xd5\x92\x24\x49\xd4\xd9\x35\x08\xec\x34\xc1\x3b\x54\xe8\x96\xa8\xd4\x2d\xc9\xb6\xa4\x6f\xc8\xf6\x6e\x27\x8a\xde\xc6\xca\x86\x23\xee\x8d\xd8\xfc\x10\xf0\x8c\x59\x01\xb5\x46\x02\x7f\xee\xed\x3d\xe9\x44\x91\x2a\x69\x15\xc4\xe3\x11\xa8\xa4\x15\x9d\x93\x58\x80\x87\xf9\xa6\xb0\x44\xc8\x81\x7b\x29\xab\x69\x36\x16\x97\xde\x2a\xca\xa2\x1c\x99\xd2\x9a\x72\xb4\x47\xf7\x69\x4f\xa3\x6e\x10\x0f\xc1\xe2\xe8\x77\x3a\xd6\xaf\x4d\xe3\x18\xca\x19\xb3\xc4\x8b\xfd\xb6\x79\x66\x7d\xef\xf1\x1e\x2c\x06\x78\xf7\xdb\xfa\xa6\x84\xd3\xc9\x92\x73\x4a\x74\x75\x8d\x37\x64\xfb\x34\x8a\x61\xc8\x84\x46\x51\x44\x93\x6e\x37\x49\x84\x5c\xbb\xb1\x3a\x0e\xd2\x51\x7a\x9f\x87\x89\xd2\x12\xf7\xa5\xf2\xb1\x65\x22\xa8\x3d\xeb\xbc\x8b\xbb\x5d\x01\x19\xfb\x1e\x8d\x9e\x71\xd6\x5d\xf0\xbb\x68\x26\x60\x32\xfa\x2a\xc5\xe2\xc1\x21\x11\x16\x94\x50\x21\xec\x6c\x59\x47\xc4\x85\x81\xb5\x1c\xad\xab\xd7\xf1\xe2\x5e\x52\x97\xe3\x17\x6c\xbe\x58\xc4\x3d\x3a\xae\xc5\xaf\x09\xab\xe9\x0b\x36\xf7\xf9\x6f\x51\xa0\xdb\x95\x05\x50\x56\xdd\x4b\x86\xb4\xec\x76\x77\x7f\xc4\x5f\x92\x92\x92\xaa\x5f\x48\x0c\xa1\xa0\xb5\x39\x6d\xb7\x8c\x2c\xb2\x6c\x1d\xf1\x1a\xa8\xf8\x2a\xc6\x4d\xc2\xbd\x5b\xb3\x53\xa0\x78\x4e\xa2\x3b\x6d\x77\x13\xc4\x49\x43\x51\xd6\x34\x31\x14\xc4\x20\x1f\xfb\xbb\xd8\x8f\x83\x4f\x40\x2a\x22\xd9\x00\x05\xa1\x71\xd2\x6b\x62\x6d\xa1\x1f\x8d\xd7\x4f\xa8\x59\xed\x38\x4f\xef\xad\x24\x50\xe0\x4a\x3d\x4c\x97\x55\x97\x7d\xa1\xfa\x12\x76\x50\xc9\x3e\xc0\x5e\xc2\xf9\xee\x96\x1e\xfd\xc0\x44\x36\x11\x78\x9f\xec\xed\x3d\x01\xde\x58\xa0\x9a\x96\x8a\x30\x43\x3f\xec\xef\x7b\x5f\xc5\x3c\x3b\x59\x2c\xfa\xfc\x40\xae\x16\xda\xef\x47\xcd\xf4\xe3\x3c\xed\x76\xfb\x09\x28\x5f\xf9\x61\xf0\x03\x4f\x1e\x87\xd4\x3e\x0b\x28\xe5\xe2\x27\xda\xf7\x49\x3f\x3a\x8f\x35\x2d\xeb\xf5\xc5\xae\x11\xb6\xdf\x07\x50\x88\x36\x58\xe0\xb1\x88\x25\x5e\xe2\x13\x21\x74\x85\xb1\x63\x2e\xf3\x7d\x72\x10\x7b\x7d\x9f\xb0\xa8\xef\x07\x42\x22\xec\xd1\xe8\xdf\xf1\xfe\x00\x57\x28\x18\xe2\x5f\x7f\xdf\x8b\xa3\x0b\xb3\xb3\x38\xe9\x19\xa4\x90\xec\x19\x41\x30\xa2\xbc\xdd\xd8\xf7\x03\x41\x6d\x22\x28\x5e\x32\x12\x5f\x2d\x97\xe4\x8f\x04\x4f\xef\x48\xfc\x1d\x27\x0d\x31\xe6\x24\x91\xda\x90\xe8\x3d\x78\x40\xde\xfd\x91\xb4\x93\x82\x7f\x24\xbd\x92\x41\x00\xfa\x43\x74\x74\x1b\xb3\xf4\xbc\xa6\xb5\x69\xb1\xb6\xfb\xe4\x1b\x17\xa9\xd5\x38\x7a\x47\x3d\x43\x01\xe9\x87\x6b\xeb\x9b\xc5\x88\xb0\x10\x88\x7d\x34\x56\xcc\x13\x69\xbf\x81\x1a\x3d\x55\xf3\x79\x51\xe9\x18\x28\x96\xdc\xea\x8f\x24\xa2\xa6\x49\x68\x01\x33\x1c\x25\xfb\x63\xfe\x7f\xc9\xb7\x04\xe3\x24\xba\xa4\x57\xc1\x88\x97\xd6\xb8\x75\x9a\xa0\xb0\x74\x94\x48\xf6\x78\x94\x90\x38\x1a\x27\xe1\x38\x89\xc4\x22\x86\xb0\x66\x80\x65\x7c\xcd\x07\x5b\x6c\xf0\x24\xf1\x38\x0f\x2c\x26\xf1\x67\xb2\x5e\xa1\x9e\x27\x52\x61\x0e\x6b\x71\x86\x2b\x14\x14\x09\x11\x8b\x05\xc9\x27\xfd\xd7\x8c\xa5\x2c\x0d\xa6\x89\xc9\xe8\x94\x89\xe9\x8b\xef\x50\x2f\x46\x0d\x7e\x65\x5f\x7e\xb5\xbe\x30\x2a\x65\xad\x22\xea\x86\x15\x5c\x59\x75\x39\xbf\xb3\x33\x96\x22\xe4\xed\x1d\x34\x46\xf8\xc2\xe0\x6c\x66\x49\x74\x07\xfe\x13\x18\xa8\xa0\x66\xf2\x6f\x9d\x4d\xe0\xb7\x2b\x3f\xb6\xc7\x45\x42\xc7\x2e\x4f\x63\x13\x9a\x8d\xf9\x8f\x49\x91\xd7\x43\xfe\x03\xbd\xde\xf8\xaf\x29\xad\xaa\xdb\xa2\x84\xd8\x05\xe0\x7f\x00\x91\x07\x18\x2d\x13\x28\x58\xb3\x31\xfe\xf9\x58\xc3\x5f\xd1\xcb\xac\x84\xe4\x5b\xc6\x46\x10\xa0\xc0\xd0\x6e\x26\x86\x5d\x44\xb7\x4b\x7b\x79\x91\x32\x54\x4b\xe9\xdf\xb6\x67\xae\x24\x32\x94\x15\x4a\xbc\xdf\xe9\xcc\x92\x4b\x84\xc6\xab\xc0\xb2\x41\x89\xf7\x3b\x3b\x41\x67\xd7\x50\x52\x2a\x92\x05\x45\x86\x8b\x05\xed\x55\x65\x22\xa4\xfc\x8b\x05\x32\x60\x21\xed\x25\x45\x89\xaf\xdf\xa4\x59\x3e\x78\x5b\x49\xaf\xbb\x6e\x17\x4c\x63\xd6\xe4\x2a\xb6\xff\x31\xe8\xf7\xf9\x04\xf8\x9d\xb2\x6f\x9a\x21\x04\x14\xb6\xe6\x63\x62\x33\x9b\xde\xc7\x44\x73\x94\xf6\x9b\xce\xdd\xee\x9a\x8c\xde\x90\x56\xcf\x18\xe5\x94\x6c\xb7\xdb\xd9\xe9\x44\xeb\x5a\x30\x0a\x7a\xae\x4b\x5c\xd7\x37\xe3\x8d\xcc\x35\xcc\x75\x8c\x31\x2d\x16\x71\xb7\xdb\xf1\x5c\x9a\xa6\x70\x11\x4a\x51\xb8\xc9\x09\x1b\xde\xde\x71\xe4\x16\xb9\xbb\x45\x85\x55\x05\x48\xa2\x64\xb1\x30\x59\x2c\x3c\x63\x7e\x56\x08\x30\xcf\x4d\xb3\x1b\xd7\x27\x89\xed\xc9\x18\x13\xa1\xbc\x0f\x79\x5e\xd4\x86\xe6\x92\xcb\xf8\xca\x0f\x3b\x49\xb7\xfb\x91\x23\xc2\xdb\x21\x63\x63\x71\x33\x79\x6b\x57\xd3\x5a\x0b\xbc\xe1\x7b\x58\x93\xb8\x8f\x7b\x3b\x7c\x69\x56\x6d\x38\xfe\x32\xe1\x14\x5f\x28\x90\x41\x35\x22\x0d\xa8\x7e\xb7\x6b\x18\x47\xd9\x60\xdb\xed\x7a\x2e\x78\x27\xc7\xc5\x47\x80\xcc\xc5\xc2\x2d\x69\x9a\x81\x7b\xbd\xa5\x54\x3d\x30\xfa\x82\x7e\xf7\x5d\xe1\xd6\xec\x06\xd2\xbd\x53\x61\xa9\x01\xab\x0d\xa1\xf9\x11\x3c\x21\x3a\xad\x39\xa6\xb3\xe4\x84\x5a\x98\x1c\xfb\x24\x8d\x5c\x77\x8b\x5e\xc6\x60\xec\xd2\x59\x11\xbc\xc7\x7e\xfb\xa5\x92\xf0\xce\xd6\x65\x55\x4c\x69\xa9\xda\xe3\x21\x72\xda\xe9\xce\x88\xf2\x98\xf4\xf4\x07\x49\x40\xaf\x30\xc3\x9c\xce\x0e\xb1\x14\x86\x0a\x67\xc2\x00\xb4\x70\xc8\x5f\x92\xaa\xa1\x58\xc4\x99\x85\x30\x1c\x53\x8a\x04\x6a\xc1\xbb\x01\x13\xa1\x58\x56\x9b\x4e\xa1\xad\x46\xae\x6a\x10\xc5\xd5\x17\x25\x4d\x46\x59\x3e\x30\xab\xd3\xde\x35\xec\x08\xe4\x31\x61\xd9\x9f\xb2\x31\xab\x99\xc3\x57\xd8\xb2\x06\x7f\x8a\xb8\xc7\xae\xb2\x58\x78\xcd\x46\x00\x00\x0c\x69\xdd\xa1\xbc\xf7\x3b\x54\x1f\x37\x65\xe4\x60\x56\x85\x0d\x35\x82\x2d\x88\xa3\xd8\x93\x33\xf7\x7c\x21\x8c\x75\x5d\x61\xc2\x84\x00\x46\x7b\x02\xc2\xf6\xdd\xba\x9c\x31\x37\x70\x21\x8c\xa6\x8b\x3e\xca\x33\xe6\x87\x54\x9b\x36\xd1\x4e\x14\x25\xfb\x5e\xdc\x93\x2b\xe6\x51\x9f\x74\x76\x7c\x8e\x67\x79\xeb\x47\xfc\xd2\x19\xc2\xe5\xf0\x30\xde\x1d\xca\x36\x18\x76\x48\x7b\x08\x97\x0e\x05\xe1\xd7\x38\x4b\x46\xfc\x07\x44\x08\xe0\x3f\x80\x04\x5b\xe5\xda\x91\x53\x3f\x67\xe2\x31\x79\xd1\xbd\xc5\xaf\x1b\xc8\xf1\x38\x51\x46\x21\xd1\xb9\x41\xe8\x1d\x25\x3d\x9c\x24\xca\x28\xfd\x10\xd1\x42\xe4\x62\xaa\x1b\x16\x9c\xbc\x0c\xc1\x74\x42\x5b\x2e\xc3\x8b\xb0\x82\xbe\xfb\xb9\x49\xdf\x3d\x87\x7d\x06\x53\xc2\x70\x12\x7b\x9d\x5d\x03\x06\x4e\x0c\xa4\x00\x06\x65\x7c\xab\x0f\x13\xd3\x76\xda\x10\xef\x6a\x84\xee\xaa\x35\x42\x93\x4c\xc9\x7d\xc1\x48\x7e\x05\xda\xc3\xbe\x86\x7e\x4d\xa2\x79\xe2\x09\x34\xc6\xb1\x56\xa7\x55\xce\xb9\x58\x3c\xf9\xb1\x5d\x00\x6a\xd0\x3c\x67\x9c\x42\x7b\xc6\xe9\xf7\x67\x09\x88\x08\x92\x21\x20\x5c\xcf\x2d\x72\x19\xd2\x46\x2c\x17\x39\x4f\x7c\xbe\x22\x62\x71\x8c\x99\x9f\xc3\xcc\x05\xe2\x03\xbc\x6a\x46\xc3\xe9\x76\x4f\x12\xef\x67\xe0\x59\x68\x74\xcc\x7f\x12\x4a\xe0\x92\xf7\x49\x9d\x78\xcf\x13\xb0\x8b\xd1\xdb\x79\xa1\xb6\xd3\x95\xa0\x02\x8d\xee\x7b\x7c\xb0\xe4\x59\x12\xc5\x7c\x18\x09\x79\x96\xf4\x68\xfd\xa9\x11\xfb\x0a\x16\xc5\xb5\xc3\x1b\xd1\x43\x7f\x2b\x0f\xae\xdb\x02\x70\xd2\x62\x56\x4a\x7c\xac\x6f\xc5\x63\xc9\x0d\xc3\x59\xea\xa6\xdf\x35\xb6\x18\xcc\x8c\x1b\x15\x62\xa3\xfc\x7b\xbb\xfc\x89\x69\xc2\xdb\x0e\x22\xd8\x00\x30\xc8\xbf\xd9\x0c\xf2\x51\x42\xae\xb3\x0a\x9a\x80\xc5\x39\xc7\x07\xda\x59\x1a\xfc\xfa\x40\xd6\x39\x8a\xf7\x4b\xce\x09\x05\x42\xfc\xde\x8f\x98\x41\xf9\xb1\x75\x94\x1f\x1f\xbc\xb6\x37\xee\x9b\xa6\xc8\x7d\x7e\x31\x65\x63\x98\x02\xc3\x60\xb1\x68\xcb\xf0\x4b\x12\x8a\x77\xb6\xbc\x9b\xc4\x63\xbe\x9f\xf5\xbd\x5f\x13\x7f\x10\xbd\xc7\x8c\xbb\x41\xf4\x36\x01\xac\x38\x8a\x2e\x12\xc1\x0a\x1b\xc3\x21\x1d\xdd\x4f\x27\x6a\xc6\x72\x5a\x2c\xf4\xa5\xde\x91\x3d\x77\xbb\xe2\x66\x57\x29\x8b\x85\x37\x88\xde\xa1\x99\xb9\xb0\x34\x86\xed\x50\x87\xf7\x38\xf1\x06\xa8\x37\x1a\x75\xbb\x23\x8f\x12\x50\x68\x35\x80\x0b\x59\xd5\x18\x40\x3d\xee\x5d\x8b\xc7\xfd\x81\xe9\x58\x2c\x98\x9d\xe0\x73\x02\x3a\x51\x2c\x58\xb7\x2b\x43\x57\x44\x7a\x94\x1e\xe5\xb7\x1b\x13\xef\x50\xc1\x93\xdf\xab\x31\x2c\x3a\x51\xb4\x41\xf9\x9e\xb4\x86\x99\xe0\x87\xcb\xe0\xdf\x7e\x4f\xbe\x48\x9b\xf3\x7b\x42\xee\x6e\x32\x76\x8b\x66\x09\x28\x4b\x34\x35\x3b\xff\x4e\xa2\xbb\x83\x71\x1d\xb8\x28\x5e\x72\x89\xe0\x2d\x03\x57\x88\x9e\x5c\xf2\x8a\xd5\x34\x70\x85\x54\xca\x25\xe7\xc3\xac\x5f\x07\x2e\x44\x1e\xe0\x09\xc6\x18\xbf\x32\x30\xe9\x8a\x92\x59\x09\xa7\x06\x8c\x63\xb3\xac\x9f\x89\xf5\xdc\x5f\x4d\xe2\x9c\xa9\x47\xa3\x7f\x27\x9c\x7b\xdc\xef\x74\x38\x17\x69\xf1\x1a\x34\xd5\x04\xc6\x57\x06\x31\x19\xa7\x0f\x5b\xa5\x8d\xdf\x13\x7b\x9d\xe2\x94\xdc\x55\x10\x14\xe7\x37\x5c\x2a\xfc\xf8\x5d\x98\x8a\x8c\x33\x96\xd7\xbf\x99\x1f\x22\x67\x4a\x07\xec\x37\xfd\x53\x96\xc7\xb5\x13\x2d\x89\x95\xc2\x2f\x5c\x67\x11\x58\x0c\xd7\x14\x3f\x9a\x6b\x10\xd0\x94\xa0\x73\x80\xb4\x5d\xe1\xbf\x85\xed\x4a\xc9\xc6\xb4\x66\x69\x8b\x01\x98\x11\x69\xc5\x28\x02\xa4\x50\xbf\x2c\x26\x82\x31\x00\x64\xaf\x99\xb3\x7d\x4e\x51\xcb\xe0\xbd\x56\x41\x4e\xde\xa1\x3b\x75\x92\x46\x77\x93\x62\x56\xa1\x39\x59\x70\xd7\xb4\x76\x0c\xa4\xf3\x03\xe4\xbb\x2d\x7a\x25\xc8\x3d\x95\x4a\x23\xfc\xba\x61\xa5\x7b\xb5\x24\xd0\x30\x98\xa8\xdd\xd3\x30\xe4\x7f\x5e\xc3\x4b\x92\xa6\x16\x82\x4d\xd2\x4f\xa2\x51\x81\xc7\x75\x33\x92\xed\x69\x2e\x69\x62\x2d\x14\x62\x7b\x35\x14\x8c\x21\x63\x37\xd4\x31\xee\x00\x65\x25\xcf\xa2\xb4\x87\xb8\x3a\x8a\xa2\x74\x3f\x0d\x3c\x9e\x62\x45\xa7\xf1\xf7\x99\xb4\x44\x79\x97\xb1\x5b\x8e\x91\x90\xe9\x7d\x0f\xf5\x04\xaa\x0f\xad\xfe\xf1\xe6\xa5\x51\x4c\xe2\xc8\x8b\xa3\x96\xc1\xab\x1d\xf7\xf7\xff\x8c\xa5\xfd\xae\x1f\x08\x77\x39\x90\x85\x45\xd1\x46\xbc\x32\xe0\x7e\x24\x9c\xd1\xf6\x59\x80\xf4\x12\x8b\xa4\xe3\x1a\xa4\xc4\xd2\xd8\x2d\x4e\x0d\xaa\x2e\x49\x7b\x7a\x97\x09\x45\x94\x3c\x10\x94\x1d\xe4\x8c\x61\x7f\x79\x1a\x9a\x1c\xf5\xc3\x81\x3d\xea\x88\x85\x49\x7b\xa3\x00\x73\xd2\x3e\x20\x31\x1b\x65\x00\x8d\x3c\x4d\x35\xd1\x68\xb4\x1f\x3e\x8d\xe1\x8a\x00\x41\x90\x10\x1c\x0e\x48\xc2\xa1\x87\xa5\x11\xa5\x5f\x10\x7d\xb9\xb7\x12\x86\x5a\x63\xc9\x7e\xaa\xe4\x24\x9a\xd9\x95\x61\xcc\x0c\xc5\xce\x3e\x0d\xda\x18\x42\x50\xf2\xe8\x77\xf6\x16\x0b\x0a\x31\x38\x83\x86\x4b\xe1\x20\x35\xd8\x6a\xd8\x4d\xc3\x58\x17\x2c\x7a\x63\xc3\x84\xdf\x8f\x23\xf3\x13\x6e\xef\xac\xef\xed\x74\xa2\xc8\x8b\x7b\x18\xc0\xe2\x82\x0e\xba\x7b\xea\x5a\xdd\x0d\x57\x1b\x01\x33\x7a\x23\x85\xdc\x57\x7f\x69\xc8\x73\x62\xf0\x67\xd8\x0b\x1e\x6b\x4c\x3e\x4c\x35\x36\x03\x49\x80\xed\xfd\x02\x72\x50\x7f\x7f\x2f\x8a\x22\x98\xa9\x75\x3b\x64\x50\x77\xaf\x23\xf2\xc0\x15\xf6\x87\x1f\x94\xd7\x8f\xb1\x4a\x7f\x98\xab\x64\x9b\x0c\x2b\x66\xcf\x89\xb1\x19\x02\x23\x6d\x36\x46\x76\x21\x55\xe8\xac\xa4\xe5\x5d\x12\x51\x92\x46\x71\x18\x4a\xaa\x2c\x31\x56\xa5\x1f\xb1\x7d\xa6\x3b\x0b\xe4\x79\xeb\xb0\xc5\xa2\x23\x6d\x93\xb3\xbe\xc7\x7a\x10\x0c\x15\x0c\xad\xf1\xd9\x56\xe5\x33\x31\x88\x44\x66\x38\x40\xab\xec\x41\x14\x45\x4a\xa8\x99\xa5\x1e\xf3\x09\xec\x3a\x4f\x4f\xed\xf4\x38\x1c\x44\x83\x5e\x95\xc5\xe3\x2c\x1f\x2c\xe5\x74\x96\x59\xdf\x33\x06\xd9\x89\xa2\x54\x7f\xf9\x49\xc4\x48\x1a\xf5\x25\x59\xd7\xd9\x55\x33\x1d\xa9\x91\x8c\x70\x24\x23\x18\x09\x2f\xb4\x13\x26\x11\x0b\x79\x35\x98\xd2\x52\x64\xa6\x22\x33\x85\xe3\x2c\x33\x47\xd1\x48\x8d\x89\xaf\xc5\x00\x27\x3b\x92\x73\x6f\x6f\xbe\x0f\xad\xac\x69\xbe\x0f\xfd\xaf\x36\x3f\xd8\xdf\x30\x64\xf5\x3f\x3c\xe1\x6c\xa9\x61\x7b\xce\xa7\x8e\x91\x39\xb4\x0b\xee\xf2\x31\xe7\xcc\x01\x4a\x1b\xfb\xaf\x24\x5a\x5a\x7a\x2f\x7d\x7d\xf9\x48\xf7\x69\x60\x98\xf8\x8c\xc4\xd1\x07\xb0\x0b\x4d\xb1\x83\xa3\xec\xc9\xe4\x91\x0d\x95\x63\x53\xac\x1d\x9b\x62\xd3\xb1\x29\x0e\x85\x2e\x90\x83\x86\xf8\xab\xf7\x0c\x30\xbf\x48\x55\x07\x3a\x06\x36\x04\x21\x0c\xce\x6f\x27\x96\xcb\x82\xfd\x75\x8c\xe3\xbb\x58\x18\x1f\x51\xf3\xee\xb2\x4e\xfa\x52\x35\x63\x0e\xc0\xc0\x0d\x7c\x28\x72\xfd\x4d\x55\xa3\x71\x16\xc7\xff\xb5\xc5\xe9\x76\xbf\xe9\xc8\xec\xff\x53\xd7\x89\xcf\x7c\x02\xae\x52\x7a\xc5\x72\x0b\x7b\x19\x2e\x39\x69\x81\x63\xf4\xef\x68\x0f\xec\xa9\xeb\xa2\xac\x94\xb3\x37\x9e\x08\x40\x53\x18\x7b\x20\x8a\xc3\xc4\xc4\xe3\x89\x89\xae\xc2\x24\xd2\xc0\x0f\x68\xce\x02\xf5\x22\xaf\x69\x96\x33\x78\xbe\x5c\x38\x02\xe3\xb2\xb5\xf6\x1c\xfd\x19\x7b\x89\xbf\x44\x8f\xb1\xd8\x17\xdd\xef\x84\xc9\x8f\x66\x71\xa1\x42\x4a\xb6\xb6\x7c\x40\xcb\x32\xe3\x32\xb9\x22\x45\xea\x71\x62\x75\xfa\x92\xdd\xb0\xf1\x05\x88\x5d\x09\x35\x19\x0d\x10\x51\x98\x09\x3e\x6a\x83\xa6\x69\xd4\xd9\x21\x45\x2a\x43\x67\x68\x97\x48\x58\x45\x9e\xdd\x31\x04\x3d\x6f\xa5\x30\x43\x9e\xef\xfd\x84\xf6\xc6\x20\xa7\xf7\x12\x12\x93\x32\x35\xde\xfe\xa1\xbe\xdf\x70\x73\xab\xd2\xb6\xfa\x42\x0e\x77\x4f\x03\x7a\x73\xcb\x54\x89\x15\xa6\xa9\xf4\xba\xbe\x45\x73\x0c\x5c\xc6\x50\x84\x80\x4d\x16\x0b\x23\x7a\xa2\x92\x1b\xc3\xb9\x10\x17\x64\xe2\x83\x96\x00\x28\x3c\xbe\x4b\x93\xd4\xb2\xbe\x4c\xa3\x49\x2a\x2c\x2e\x53\x6b\x71\x23\x1a\xa6\x96\xe5\x79\xcc\x0b\x68\xdb\xf4\x24\xa4\x51\x8a\x9c\x3d\x8d\xee\xcc\x9a\x01\x25\x46\xbd\x20\x26\xba\x56\x90\x10\xb5\xa5\xc1\xe5\xd5\x12\xd4\x6e\x75\xe2\xe5\x10\xe5\x43\x2a\xdc\xec\x5d\x46\xb9\x9e\xb5\xaf\x32\xc9\x18\x8e\x48\x69\x42\x52\xb4\x43\x76\x77\x7e\x52\x73\xee\x76\x27\xca\xd7\x70\x29\x0c\x15\xea\xb4\xa9\x9c\x1c\xb0\xda\xb9\xc6\xd0\x76\x06\xb3\x39\x4d\xc1\xdf\xd2\xb9\x1e\x82\x83\xed\x85\x18\xa2\x2e\x50\xa0\xbc\xfb\xb9\x95\x6d\x71\x68\x45\x1a\x51\x28\x73\x8c\x8d\x07\x7f\xa6\x24\xab\xe4\xc7\xaa\x00\x9d\x77\x59\x97\x74\x8a\xf6\xd4\xa8\x30\x0a\xde\x42\x92\x90\xe2\x8a\xb4\x2a\x25\xd2\x9b\x00\x13\xca\xd4\x54\x93\xce\x52\xd3\x7f\xff\x6e\x19\x82\x62\xcf\x14\xb9\x5c\x71\x1c\x69\x89\x85\x92\x4b\xf7\x3d\x8b\x47\x59\xed\x6e\xd1\xab\xc8\xbd\x15\xbf\x01\x5f\xbc\x2a\xfe\xc2\xd4\x09\xff\x01\x49\x93\x0a\x53\x5e\x9d\x8b\x84\x53\xfc\x2e\xdc\xad\x66\xcb\x4a\x11\x84\x81\x75\xd3\xe8\x8e\xe6\xd9\x04\x98\x3e\x96\xa7\xc1\x2c\xf5\xdc\x03\x99\xe0\x12\xfd\xfb\x38\x4f\x5d\x9f\xa8\xb2\xf8\xb2\x68\x56\xe4\xeb\x6b\x9c\xc8\x22\x66\x3d\x8c\xd3\xba\xb6\x0e\x1a\x96\xf8\x7c\x91\x73\x34\x98\x90\x83\xba\x50\x29\x2e\x31\x3e\x60\x58\x4b\x72\x9b\x46\x77\x4b\xf2\x91\xff\xdb\xd4\x41\xa6\xf7\xeb\xe8\x7a\x10\xc9\xd0\x9c\xa8\x6d\xcc\xba\x58\x78\x42\xf9\x71\x93\xf6\xcc\xa5\xd2\x1f\xa4\xa5\x80\x5a\x9f\xfb\x8b\xc1\x72\xe8\x4f\xdf\x9a\x5a\x73\x20\xba\xbe\xb5\x3c\xc6\x97\xa5\x02\x4d\x85\xa4\xf6\x36\xbd\xa4\xca\xe5\x1c\x3e\xe0\xbe\xb8\x31\x93\xa9\x50\xbe\x40\xa2\x19\x1a\x27\x46\x5f\xf4\x96\xc8\x37\x90\xfd\x31\xb5\x1a\x8e\xe2\xcb\x44\xba\x4f\xbb\x2e\x82\xd8\x5f\x29\x20\xa8\x83\xb8\x28\xeb\xc0\xa5\xfc\x8f\x4b\x78\x82\x01\x59\xc1\x3c\xf5\x5c\x73\x71\x5d\xce\xd6\x5b\x09\x56\x15\x05\x5a\x76\xc5\x4c\x43\x9c\x59\x5d\x27\x5b\x8d\xa0\x7d\xa9\xd5\x40\x85\xe0\x67\x56\xc6\x24\x22\xc4\x96\x81\x1b\x8f\x67\x25\x7c\x1e\x82\xb3\x45\xe0\xa2\xd3\x85\x4c\x82\xf8\xcd\x3c\x8d\xf3\x89\x66\xe2\x05\xc6\x70\x54\x79\x22\xa6\x23\x16\x41\xd5\x92\xd4\xb3\x10\x29\xfd\x0e\xdc\x04\x84\xe0\x98\x50\x54\x10\x30\xb8\xa8\x44\x09\xdb\xe6\xd7\x35\x8c\x8c\xe4\x7a\x35\x2d\xb6\xac\x42\x7a\x62\x2b\x66\x56\x56\xb9\x99\x30\x3e\x85\x82\x79\xcd\x3e\xd6\xaf\x58\x3e\xe3\x45\xe0\x63\xc2\xf2\x99\xc8\x9c\xf2\x99\x17\xd3\xb9\x4b\x36\xf8\xf7\x8c\xf7\x37\xc3\x2e\x8c\x20\x21\x81\x9b\xc6\x63\x3d\xaf\xa3\x92\x0e\x02\x37\x2d\xe9\x40\x7d\xc2\x74\x78\x8a\x9c\x07\x26\xd6\xac\x94\xc9\x20\xe8\x92\x19\x1f\xb3\x5a\xa4\x7f\xcc\x6a\x95\x8c\x42\x2d\x48\x47\xf9\x86\xcc\x38\xbd\x91\xed\x14\x37\x46\x33\x62\x81\x78\xba\x5e\x99\xa3\xb2\x98\xf2\xb4\x62\x8a\x9f\x33\x84\x23\xb9\x5f\xa9\xf8\x36\xf6\xed\x78\x32\xad\x33\x88\xcd\x8b\x3f\x30\x31\x4f\xca\xf9\xb4\x86\x64\xf9\x53\x64\xa4\x98\x98\xca\x04\x08\x61\xe7\xc2\x43\x20\x90\x80\xb1\xc1\xdd\x3e\x68\x75\x88\x54\x73\x04\x42\x7a\x4f\xb4\x6a\x25\x70\x47\x6c\x9e\x16\xb7\xb9\x4c\x04\x8b\x47\x48\x9d\xa2\x01\xb9\x54\xcb\x40\xda\x0c\x67\xf4\x12\x02\xc7\x1f\xd1\x9a\x06\x2e\x06\x91\x07\x9b\x56\x99\x85\x89\x46\xc9\x57\xac\xa6\xa9\x51\x7a\x22\xbe\x55\x11\xb1\x8c\x3c\x57\x2c\xe3\x86\x69\x93\x1b\xa0\x70\x48\x8d\x53\x05\x78\x11\x19\x93\x42\xec\x94\x94\xa7\x89\xf4\x42\x4c\x56\xc9\xf4\x64\xba\xdc\x42\x11\xfe\x45\x24\x8b\xd9\x81\x4d\x68\xe0\x4e\xc1\x34\x14\x13\x66\x15\x24\xcc\xc4\x21\xc2\xe3\xaa\xce\x2a\xff\xcc\xf2\x01\xa6\x64\x39\x82\xe4\x9b\xb2\x18\xe0\x5a\x4e\xc5\x2f\x48\x3e\x83\x47\xfe\x10\x10\x4a\x5a\x33\x03\x08\xce\x93\xb2\x18\x8f\x03\xb7\x82\xbf\x98\xc4\xd8\x88\x6f\x75\x05\x7f\x55\x12\x74\x56\xe1\x0f\x91\x68\xa9\xd4\x02\xa1\x1c\xb2\x81\xec\xbc\xa6\x63\xd0\x34\x57\xf8\x03\x13\x67\xd5\x94\x5f\x96\x6e\x85\x3f\x20\x51\x19\xfe\xa2\x0d\xd1\x89\x82\x9a\x8b\x6c\xc2\xe4\x61\xaf\xb3\x09\x33\x4e\xf9\x45\x31\x18\x8c\x79\x32\xfc\x15\x49\xb3\x64\x28\x11\x5e\xcd\x3f\x0c\xac\x07\x99\x70\x66\x21\x47\x75\xcd\x3f\x70\x6b\x21\x1d\xb7\x76\x43\xe6\x08\x40\x81\x2c\x7d\xe0\xac\x8b\x1d\x70\xb3\x75\xd5\x01\x6a\xb6\x53\x78\xad\x77\xc5\x78\x36\x51\x9b\x71\x03\x5f\xc6\x72\xbd\xa7\x10\xcc\x35\x70\x6f\xf1\x07\x26\x0e\x19\x9f\x0c\x9a\xc9\x2c\xc9\x01\x10\x10\x4f\xd3\x68\x87\x1c\xa6\x91\x8b\x42\x2f\xe5\x29\x7b\x72\xe4\x6e\x79\xae\xbb\x65\x45\x8c\xd1\x51\x62\x34\xad\x77\x04\x97\xae\xa0\x68\xb5\xdf\x97\x7d\x7d\x8a\xf8\x74\xe4\x10\xc3\x12\x5d\x1e\xa6\x57\xd1\xd3\x74\x6b\x8b\x1c\xa4\x97\xf0\x75\x15\xdd\x2d\x15\xa5\xa6\x12\x35\x93\x73\x9c\xca\xe7\x94\x42\xb0\x30\xeb\x67\x65\x85\x4f\x26\x86\x10\x20\xc6\xf8\x56\x9a\x74\xc3\x23\xdb\xa2\x47\xa1\xad\x90\x1a\x51\x0b\xd2\x30\x41\x5e\xfb\x31\x18\xc2\x4a\x8b\x2f\xff\x2e\x8d\xe8\x56\xd2\x33\x9c\xc6\x25\xc3\x98\xf5\x3d\xfa\x63\x14\x77\xbb\xe9\x4f\x2a\xe6\xfc\x1d\xaf\x17\x24\x04\xa3\x11\x07\xf1\x36\x5d\x02\xcf\x42\x03\x1c\xb8\xe8\x23\xe9\xe5\xec\x63\x7d\x8e\x9c\xb7\x7f\x97\x44\x56\x82\x8c\xb3\xb4\xe4\xe9\xda\xde\x6c\x29\x23\xdc\x2c\x61\xfc\x89\x19\xab\xeb\xe7\xf4\x4b\xcd\xef\x9c\xb8\xdb\xf5\x0c\x1b\xbc\x6e\x17\xce\x8c\x30\x7c\xc2\x60\x75\x96\x21\x1e\xc0\xa2\xd4\xe0\x37\x5e\x64\x10\x6a\xe6\xe7\x69\xf4\x50\xff\xab\xdd\xdd\x9f\xda\xfd\xaf\xc8\x49\x1a\xdd\x21\x1a\x78\x98\xf5\x09\xe2\x10\xdb\xfa\x04\xd3\x1e\xe4\x23\xa2\xee\x78\xcb\xf2\xa4\xcd\xe0\x44\xa1\x75\x47\x63\xe0\x4f\x1a\xa2\x90\x5f\x52\xe4\x17\x5f\x88\xbf\x2f\xc5\xdf\x57\xa9\xed\x50\xf2\x5a\x33\xe2\xaf\x52\x8c\x0e\x14\x45\xbf\xa4\x8b\xc5\x2f\x69\x27\x8a\x52\xea\xf9\x2b\x2a\x92\x24\xfa\x25\x0d\x35\xca\x44\x6e\x22\xcb\x9d\xa4\xdb\xfd\x99\xc3\xc9\x7e\x12\xdd\x21\x07\x92\xf4\xec\x52\x84\xa3\x4e\x23\xf1\x38\x4f\x97\x42\xbf\xd3\x1b\xb0\x5a\xcd\x68\xdf\x4b\xa2\x96\x64\xcf\x27\x09\xe7\xa4\x92\x61\x81\xd1\x89\x92\x9e\xfe\x20\xf8\xf3\x14\x4f\x82\xcc\xc1\x4f\x02\x37\xbb\xa8\xa2\x7e\x63\xaa\xaa\x60\x7c\x2d\xfd\x40\x02\xbf\x04\xdb\x97\x69\xb7\xcb\xa8\xf7\x32\x25\x89\x8f\x82\x22\xef\x65\x1a\x25\xc4\x36\xee\x39\x49\xc5\xe4\xc8\x8b\x94\x60\x1c\x42\xa1\xae\x11\xe6\x07\x8a\xa3\x8f\x7e\x49\x09\xd8\xf8\x10\x2a\xa0\xf8\xd4\xd6\xe5\x9d\x7c\x5a\x97\xd7\xa6\x60\x53\x40\x1d\x3c\x81\x10\x54\xca\x94\x34\x0d\x1a\x7a\x37\xd2\x07\x0e\xc5\xeb\x47\x1d\xe6\xfb\x77\x34\xb8\x63\xd1\x51\x8a\xe1\x4d\xce\x68\x4f\x42\x73\xa8\xa5\xf2\x3b\xe1\xe0\xc7\xbe\x44\x47\x03\x19\x09\x6d\x14\xf5\x2f\x07\xc8\xed\xac\x3c\x63\x34\xf2\x17\x8b\x0e\xbb\x1c\x5d\xf9\x77\x10\xf9\x54\x62\x9a\x25\x84\x51\xe5\x3d\x2f\xb3\xbe\xd7\xb7\x40\xac\x69\xe4\xd1\xe6\x87\x82\xf6\x37\x81\xb4\xcd\x30\x70\x04\x5b\xc1\x11\xbf\xa4\x11\xe3\xc7\x20\x96\x67\x20\x14\xf1\x51\x6c\xbf\xa5\x97\x69\xf4\x22\x8d\x7e\x69\x2f\x62\xb8\x3b\xbd\x02\x37\xf9\x46\xbe\x71\x9e\x9b\x4e\x52\xda\x27\xcb\x81\xb3\x47\x5e\xa7\x1e\x2a\xf2\x64\xb1\xe6\x41\xe6\xd3\x7a\x9e\x0a\x41\xe3\xc6\xaa\xbb\x56\xbb\xc7\x97\x23\xda\xb5\xe4\xaa\x86\xf9\xc2\x9b\x07\x1a\x0f\x34\x4c\x2c\xde\xa4\x44\xcb\x2e\x5e\x4b\x55\x1c\x61\x63\x3a\xad\x58\xca\x09\x1c\x61\x1f\x50\xb1\x59\xaa\xb4\xec\x4d\x6f\xdd\x5f\xbf\xac\xf3\x5f\x53\x72\x97\x8c\xb3\x69\x5c\xd0\x12\xe9\xe7\x55\x63\x00\xd7\x2a\x20\x1d\xc5\xec\x5a\x02\x97\x58\x89\x56\xe8\xaf\xb3\x07\x8e\xaf\x69\x58\x71\x96\x92\x3b\xdb\x5a\x41\xcc\xdc\x08\x89\x61\x89\xb1\xa5\x6f\x1d\xe7\x42\xc1\x45\x09\x07\x8c\xb6\xe1\x22\x89\xec\xa0\x4e\x7e\xf7\x31\x5e\x90\x1e\x8d\x76\x1f\xfb\x7e\x40\xa3\x58\x99\x89\xef\xfd\x18\xd1\xc5\x02\x4a\xd0\x7d\x1a\xec\x20\x0a\xb9\x48\xa3\xbb\xe3\x2a\x09\xdc\xe3\x2a\xa1\x53\xe6\x12\x78\xc4\x23\xa6\x65\xe0\x3a\x2e\x79\xc9\xfa\x75\xe0\x1e\x94\x65\x71\xcb\x7f\xba\x84\x53\xf2\xf0\xf9\x76\xea\x92\xb3\x6c\x30\x94\xd9\xf0\xdb\x25\xc8\x4b\x40\x0a\x40\x1e\x39\xe2\xc4\xdc\x11\x08\x48\x5c\xf2\x3e\xcb\x03\xf7\xf4\xdc\x25\xc8\xa9\x9a\x47\x80\x1c\x4c\xa7\x55\x23\x49\x92\xeb\xf8\xf7\x65\xc1\x39\xd3\x57\xc5\x5f\x6f\xca\x2c\x87\x73\xfa\x82\xcd\x03\xf7\x6d\x9e\xa5\x2c\xaf\xe1\x05\x47\x77\x49\xde\xa6\xd1\xdd\x0f\x81\xfb\x94\x26\x23\x8c\xcf\x4f\x9e\x04\xee\x05\x8d\x5d\xb2\xbb\x17\xb8\x87\x63\x46\x4b\x97\xec\x3e\x0e\x5c\x61\x95\xb1\xfb\x5d\xe0\x82\x05\x8f\x4b\x76\xbf\xc7\xfe\xcb\x62\xec\x92\xdd\x1f\x02\xf7\x60\xcc\x53\x9f\x04\xee\x1b\xe4\x4b\xf6\x76\x02\xf7\x90\x4e\x2b\x1c\xc9\xde\xf7\x7a\xd1\x1e\xef\xc1\x72\x3d\x7e\xcc\xcb\x0e\xf8\x01\x26\x8f\xbf\xc1\xdf\xb8\x0c\x8f\xbf\xe5\x3d\xa6\x2e\x79\xfc\x5d\xe0\x3e\x2f\x26\xbc\xce\xf7\xd6\xca\x3e\xfe\xc1\x58\xd9\xc7\x4f\xec\x65\xfd\x66\xc7\x5a\xd4\x6f\xbe\x0d\xdc\x93\xbc\x62\x9c\x38\xff\xe6\x3b\xbd\xbe\xbb\x7c\x8e\xcf\x76\xf9\x8f\xc7\x81\xfb\x6c\x8f\xff\xf8\x26\x70\x9f\x3d\xe6\x3f\xbe\x0d\xdc\x67\xdf\xb8\x64\x63\x97\x4f\xf9\xd9\xb7\x3c\xe9\xfb\xc0\x7d\xf6\x1d\xff\xf1\x43\xe0\x3e\xfb\x9e\xff\x78\x12\xb8\xcf\x7e\xe0\x6b\xb5\x13\xb8\xcf\x9e\xf0\x1f\xbb\xbc\xc5\x1d\xfe\x0b\xda\xe6\x8d\xef\xf1\xc6\x77\x79\xeb\xdf\x7c\x13\xb8\xaf\x67\x13\x5c\x90\x5d\x3e\x2c\x73\xaf\xf6\xf6\xbe\x09\x5c\xce\x99\x9a\x36\x51\xef\xbe\xd4\x22\xe9\x5d\x4a\xee\x46\x6c\x6e\x9d\x67\x50\xe3\x8f\xd8\x5c\x9e\x96\x8b\xf4\x12\xbe\xaf\x16\x0b\xf8\x0b\x66\x7c\x16\x84\x74\x8c\xd7\x97\x62\x81\xf8\x34\x2f\xae\x48\x4a\x7e\xbc\xe0\x18\x12\x71\x60\x04\xbc\x04\x6d\x2e\x83\xd4\xf7\x35\x97\x6f\x52\xa5\xc8\xcf\xeb\x46\xdf\x8a\xe1\xf1\x5a\x57\x8b\x85\x3d\xb2\xc0\x75\x97\x64\x5c\x24\x28\x3f\xfb\x62\xb3\xa9\x92\x4d\x19\x15\xe1\x80\xc0\xd1\x86\xad\x37\xa7\x92\xe8\xa3\x0d\x47\xb6\xac\x09\x2c\x48\xb0\xb3\x24\x62\x0a\x6b\xaa\x7d\x72\x19\xd4\x1a\xf0\xb6\xc0\xdb\xf2\x53\x03\xd8\xb0\x46\xf0\xd9\x9d\x98\x78\xfb\xfd\x03\xe1\x2f\x4e\x6d\xf0\x7b\x9f\x62\x18\x08\xe0\x84\xfb\xac\x5c\xb9\xb0\x7e\xfb\xc2\x0b\xe1\xb7\x94\xdc\x21\x83\x5e\x99\x01\x9d\x2e\xcc\x24\x64\x9a\x53\x2b\x6d\x2d\x04\xdc\x03\x35\x2d\x40\x60\x4e\xe1\xf7\x2f\xbb\x73\x7f\x4f\xc9\x9d\xf5\x6c\xe8\x67\xdc\xf7\x46\xcc\xef\x2f\xdc\x98\x7f\xf3\x8d\x61\xe3\x9a\xfe\xd6\x06\x45\x98\xa3\x9c\xc1\xb1\x1c\x4a\x17\x8e\x8c\xac\x6d\xda\x33\xd2\x38\x5c\x42\xd1\xdf\xd7\x36\xf9\xbb\xd5\xe4\xef\x66\x93\xbf\xb7\x34\x69\x15\x68\xc9\x57\x3d\xfe\x5b\x1a\xa6\x8e\x6b\xca\x99\x4c\xd3\x36\xf5\x2b\x90\x85\x50\x06\x0f\x34\xa0\xc4\xde\xa1\x86\xb4\x5e\x7f\x28\x39\xbc\x4e\xc2\x68\x09\x31\xe7\x26\x51\x46\xc4\xff\xbc\x19\xd3\xb9\xfc\x2b\x04\xe1\x0e\x88\x80\x1d\x90\x67\x3b\x89\xc1\x74\x26\xc5\x74\xee\x24\xb3\xda\x49\xb5\xcc\xd8\x49\x4b\x3a\x80\x7f\x78\xf7\xa9\x14\x07\xe3\xaf\x8f\x59\x0d\x3f\x40\xe2\x0b\xbf\x4e\x6f\x44\x1e\x0e\x26\x2d\x8b\xa9\x93\x5a\xb2\x5b\x47\x88\x67\x1d\x25\x8f\x75\x40\x08\x2b\x1e\x9d\x06\x86\xcb\x01\x51\x80\x93\xe5\xf0\x8c\x9d\x33\x12\x0c\xf0\x48\x06\x49\x18\x01\x1b\x3c\x2e\x68\xea\x8c\x95\x18\x55\xfc\x94\x72\x52\xf8\xc4\x51\x4c\x14\xb3\x3c\x91\x42\x4f\xfc\x75\x3a\x13\x99\x30\xec\x89\x60\xa3\x41\x68\xe9\x80\xa4\xd2\x99\xf2\xe5\x13\x22\x49\x47\x0a\x21\x9d\x52\x09\x20\x9d\x92\xc1\x8b\x4f\x70\x27\x3a\x28\x62\x74\x84\x54\xd1\x11\x32\x42\xa7\x9a\xc5\xf0\xca\x13\x4a\x07\x9d\x5a\x09\x00\x1d\x14\xf4\x39\xb5\x16\xf2\xe1\x6f\x8c\xe4\x21\xa4\x78\xf8\x4b\xc4\xc2\x30\xa5\x74\xce\x8d\x21\x7d\x73\x84\x88\xcd\x41\xb9\xda\x03\x1f\x2d\xba\xdc\x69\xbc\xcb\xb6\xb5\x41\x85\x70\x6d\x17\x1c\xe5\x8a\xdc\xdd\x8a\xc3\x38\xe2\xac\x05\x68\x38\xa3\x4f\x0b\x42\x12\x2d\xff\x48\xb6\xdc\x75\x71\x57\xe2\xab\x65\xf8\x15\xa8\xae\x92\x90\xb2\xcb\xf8\x2a\x4a\xa4\xe1\x6d\xcc\x2c\xae\xf7\xab\x87\x72\xbd\x94\x49\x15\x1b\xb3\xb8\xc7\xf6\xc0\x18\x3a\x30\x01\xa7\xad\xcf\x53\x2f\xb1\xc5\x1a\x9f\x66\xb2\x68\xf4\x2e\x6d\x67\x1c\x9b\x4c\x29\x8d\xce\x56\x4a\x8a\x68\xee\x59\xdf\xdb\x03\x71\x1f\x9a\x3b\xb7\x0f\xa1\x25\xfe\xfb\x9a\x80\x1b\x2b\xb1\xdc\x4d\x9e\xd3\x4e\x39\x9d\xd5\x2b\x49\x37\xcc\x1c\xbd\xc5\xc2\xd2\x28\x5e\x99\xc3\x51\x49\x07\x46\x79\xa1\x43\x5a\x49\xa9\xad\x56\xa5\xee\xa8\x91\x84\xc6\xce\x76\x5a\x63\x3c\x4a\x5d\x64\xa5\x15\xb0\x15\x1b\xef\x57\x46\x67\x08\xcf\x8d\x0a\x52\x6a\xde\x4c\x6a\x2c\x9a\x96\x95\xf3\xd6\x7f\x5b\x69\xdc\xd2\xcf\x07\xab\xc9\x5a\x09\xdf\x92\xa9\xda\x7d\xb3\x3a\x68\x4b\xc3\x1e\xd0\xe8\xf7\x95\x22\x48\x82\x43\x5e\xd2\xcc\x03\xe9\x3a\xcf\xfa\xf7\x2a\xc0\x15\xd3\xb9\xb9\xb9\xd6\xf6\x8b\x28\x1e\x34\xfa\x55\xd6\xd3\x11\xf6\xcf\x97\x9c\x4d\xd5\x12\x2d\x26\xed\x8e\x21\x02\x81\x12\xe2\x2e\x97\x61\x91\x46\xab\x87\x93\x46\x46\x1c\xfd\xd0\x72\x49\x0b\xb3\xb8\xd7\xfe\x4c\x83\xe7\x9e\xa1\x4f\x34\x2b\x8d\x2c\xe7\x1c\xfc\x6f\xcd\x94\x0b\x3a\x35\x3f\x75\xe8\x57\x33\x15\x71\xa4\xd5\x10\x08\x58\xcc\x14\x23\x56\x94\x91\x6c\x62\x52\x3f\xdc\x78\x47\xa3\x1a\xbc\x37\xd6\x06\x1a\x0f\xdf\xcb\x22\xcd\x80\xe7\xe1\x6f\x32\xa7\x19\xbc\xbc\x75\x19\xc4\x9b\x14\xde\xdd\xca\x9c\x83\x98\x91\xd6\x79\x06\x69\x4a\x56\xa6\x1a\xfc\x96\x90\x95\xd9\x06\xa7\x29\x69\x9f\x70\x90\x25\x82\x1a\x49\x58\x74\x79\x45\x52\x16\x6d\x1b\x31\x05\xde\x71\x34\xba\xf3\x53\xca\xc0\xc1\x42\xda\x7d\x26\xec\x32\x65\x57\x04\xff\x44\x82\xc0\xd9\xde\x36\x7d\xc6\x50\xa4\x9c\xb2\xad\xad\x50\x14\x53\xd5\xf5\x63\x31\x51\xbc\xcc\xd9\xad\x73\xce\x30\x1e\x2d\x63\xd1\x9d\xc8\x09\x0e\x97\xe4\x37\xfd\xd5\xd9\x5d\x92\x3e\x8b\x0e\x8d\x48\x3f\xcc\x70\x06\x19\xf2\x8f\xfd\x3e\x0b\x98\xb2\x4d\x35\xf4\x30\x19\xb3\xdf\xf5\x90\x11\x02\x39\xae\xc3\x27\xa8\xac\xf7\x3d\x0e\x85\x9f\x6b\xe3\x01\x90\xb4\xdb\x4d\x7b\x8d\x27\x0a\x5e\xb1\x49\x91\xfd\xc5\xd2\xb7\xf9\x84\x56\x23\x96\x82\x2a\x48\x60\x51\xe3\xe9\x72\x67\x6d\xc5\x57\x2b\xd5\x84\xcb\xc4\xdd\x92\xf4\x41\xec\xda\xc7\x57\xb1\xd8\x65\xff\x2a\x8a\x2f\xfb\x10\x05\x1a\x44\x45\x66\x2c\x8d\xcf\x19\x56\xbc\xbe\xfc\xea\x68\x22\x66\x44\x23\xd4\xa6\xeb\xe6\xda\xef\x45\x2a\x72\x3f\x3a\x99\xc9\x05\x36\x9a\x81\x55\xd6\xf5\xff\x80\xfa\xd0\x4a\xb7\xeb\xbd\xf3\x7e\x23\xd4\x27\xef\x3c\xc6\x1a\x0e\x97\x23\x26\x6d\x0c\xb1\x65\xdc\xdd\xaa\x28\xc1\x46\xf9\x3b\xc3\x46\xf9\x3d\xaf\x1c\x13\xea\x87\xef\xbd\xdf\x48\x62\x45\x20\x1f\xb3\x35\xcf\xba\xc0\xf3\x3a\xed\x63\x05\x39\x83\xf2\x4d\xe8\xd8\x7e\xec\xe6\x02\x69\x6b\xdc\x24\x5a\xc9\xf4\x7c\x3b\x52\x6d\xe2\xc3\x9f\xd4\x8c\xa4\xb2\xf3\x83\x4b\xc0\x61\x02\xc4\x07\x18\x7b\x94\xe8\x55\x87\x70\x95\x7c\x09\x8c\xf7\x40\x98\x74\xe9\x86\x15\x5c\x75\xeb\xd6\x60\x1b\x47\x71\xb7\x1b\xaf\xdd\x6e\x56\x0e\xec\xed\x5e\x2c\x0e\xc3\x3e\x8b\xf4\x29\x6a\x2c\xec\x6f\x32\x9d\x28\xc7\xe4\x8e\xe9\x6d\x90\xaf\x5b\xea\xd0\x7c\x3a\x6e\xf7\xbb\x27\xae\x88\xab\x22\x8c\x33\x61\x8b\xfa\xcc\x0f\x93\x87\x8f\x35\x4a\x43\x84\x9c\x50\x40\x0e\x8e\x15\x4c\x2c\xc1\x5e\x53\xe4\xf2\x71\x43\xb4\x7e\x3d\xcc\xdf\x25\x58\x89\xf8\xbf\x2a\x2a\xf1\x88\xcd\x65\x34\x62\x35\x74\x74\xf4\xab\xa5\x89\xa6\xc8\x45\xb5\xa9\x08\xaa\x0a\x4e\x0c\x10\x12\x55\xdb\x3c\xeb\xb2\x10\x7f\x2d\xda\xc1\x8f\x89\x98\x0f\x70\xeb\x58\x1d\x2d\x02\xe0\xc5\x94\xc8\x2a\x03\xf7\x8c\x08\x88\xca\x20\x5a\x88\x91\x52\xb2\xbe\xd5\x07\x2e\x97\x84\x61\x3a\x88\x12\xcc\x51\xae\x29\x72\x04\x63\x5a\xd5\xc7\x90\x88\x0d\x81\x0e\xdb\x4c\xc8\xd9\x47\xf9\xad\x3b\x60\x1f\xa7\x19\xd2\x37\x9c\xff\x97\x6d\x29\x97\x82\xe6\x7b\x5f\x85\x3a\xb9\x12\x97\x6a\xd7\x13\x61\xd4\x9b\xee\x7b\x18\xd8\xf5\x77\x0f\xd0\x07\x01\x01\x0f\xa1\x2d\x73\xf1\x49\x8a\x1b\x20\xdf\x15\x32\x76\xc7\x3a\xcf\xc6\x80\x28\x31\xfa\x8c\x52\x3f\xf0\x52\x73\x2d\x48\xda\x9c\x27\x49\xad\xa5\x10\x49\xc6\x6a\xa1\x6d\x71\xda\x5c\x8a\x24\x4c\xed\xed\x89\xc3\x54\x80\x04\x15\x46\xf7\x69\x63\x4b\xa9\xfd\x6d\xe4\x23\x58\x50\xfb\x3b\x4c\x2d\x18\xa1\xe6\x57\x98\x2a\x58\xa4\xca\x80\x3f\x15\x30\x27\xde\x6f\x0c\x53\x80\x16\xca\xff\x0d\x55\xd0\x0a\x23\x18\x52\x63\xb3\x84\xdf\x8f\x5a\xee\x3e\x2a\x2d\xc2\x36\x67\x2d\xc6\x77\x91\x69\x0b\x8c\x6e\xd7\xf8\xe8\x65\x15\xba\x89\xc9\x00\x4e\xfb\xb8\xdf\x7b\xa4\x4f\x62\x3f\xc0\x8f\x1d\xf8\x90\x3b\xcc\x37\xd1\x5a\x4d\x74\xd9\xaf\xfc\x60\xd5\x81\x8c\x69\x08\xfa\xf6\xa1\x8d\xac\x84\x17\x64\xf2\xda\x8a\x98\xe5\xe8\x2c\xb3\xc1\x2b\x80\xcf\x71\x6d\x9b\x1c\xa3\x3d\xde\x71\x09\xc2\x35\xdb\x67\x81\xac\x4b\x5c\xb7\x15\x60\xd4\x1e\x68\x13\x7d\x66\x3e\xd9\x87\x73\xda\xdd\x21\x29\x89\xfd\x30\x6e\xf4\x1b\xc6\x6b\x5b\x8c\x4d\xf3\x7a\xb5\xab\xb2\xc1\xef\xf0\x75\x8e\xcf\x6d\x52\x9b\xfc\xaf\xb4\xf8\xbd\x38\xb4\xd0\xa4\x38\xa1\x68\x37\x5e\x7e\x61\x1f\x35\xd3\x21\x33\xb0\x8f\x27\x6a\xd4\x74\x6d\x03\x86\x5b\xc3\x6c\x65\x90\xdf\x98\x83\x6c\x6c\x21\x9c\xcf\x92\xe5\x8b\xc5\xe5\x55\xdb\x00\x63\x03\xd3\xdc\x59\xae\x20\x01\xb5\x5d\x43\x88\x68\xf9\x50\xb4\x28\xc2\xe4\x5b\xe1\x83\x02\xda\x88\x27\xb4\x0c\xad\x98\x1a\x37\xc2\x0b\xe0\x96\x35\x5f\x0c\xfc\x68\x52\x5c\x8a\xe5\x8a\xfd\x3b\x23\xa0\x17\x84\x05\xc3\xa7\x69\x13\xff\x6e\x69\x98\xea\xcc\x25\xc5\xe0\xce\x72\x0c\xad\x93\x1a\x20\x7e\x7d\x7d\x76\x7c\x70\x78\x71\x7d\x74\xfc\xee\xe2\xf4\xf4\xe5\xf9\xf5\xcf\x2f\x4f\x9f\x1e\xbc\xbc\x7e\x7e\x7a\xfa\xe2\xfa\xba\x49\x5e\xdc\x5f\x1a\x7d\x92\xb2\xea\x48\x3c\x07\xb7\x58\x74\xe2\x5e\x85\x31\x1e\x2a\x74\x69\x54\x01\x66\xf8\xd0\x65\x90\x19\xe4\x86\x38\xa7\x78\xc3\xa2\x8f\xcc\x6b\x71\xf8\x8e\x7b\x10\x8b\x75\x92\x21\x2f\x76\x56\x14\x35\xbe\xb1\xe8\x87\xb7\x0f\xac\xf3\x36\x9f\x14\xb3\x5c\x56\x13\x6b\x95\xfa\x77\x4b\x45\xca\xe8\xa0\x4d\xcc\x7e\xea\x5a\x2f\xd7\x0d\xeb\x76\x6f\x98\x15\x12\xfb\x60\x6d\xe1\x5b\xd6\xed\xde\x42\x61\x23\x94\x8f\xb1\x97\x77\x31\xad\x98\x90\xdc\x13\x1b\xfa\x82\x1d\x02\xf7\x91\xd0\xfc\x50\xf9\x2b\x11\x21\x3b\x5f\x66\x32\x65\x48\xab\x67\x45\x99\x48\x33\xc3\xce\x2e\xc9\xaa\x93\x3c\xab\x33\x3a\xe6\x77\x48\x60\xc5\x5d\x3d\x64\xe6\x4b\x9c\x11\x85\x1b\x6e\x5f\x98\xb2\x89\xcf\x28\x0e\x3c\xfc\x05\x97\x24\xb0\x0c\x98\x0e\x64\x1b\xe8\xa6\x1b\x67\x65\xb1\x68\xa6\xfc\xd4\x3c\x4e\xfe\xca\xf9\x6d\x96\x30\x16\xe9\xa8\x41\x49\xaa\xab\x1c\x88\x76\xf3\x02\x94\xe4\x04\xbe\xaa\x66\xdd\x94\x4f\x19\x38\x1f\xf9\xe8\x48\x84\xa1\x87\x68\x94\x98\x65\x88\x5c\x07\xe0\xaa\x92\xf6\xea\xca\x67\x9c\x46\x14\x9c\x27\x31\x00\xad\xec\x9a\xee\x1f\x32\x2f\x25\xc2\xc1\x1c\x4c\x6e\xf8\x6a\x49\x4b\x2a\xb9\xc6\x9e\x28\x45\xc4\x16\xf8\x81\x4a\x51\xcb\x6b\x98\x1e\x32\x53\xa2\x02\x41\xe0\xf8\x86\x22\x41\x20\xa8\xcc\x35\xce\xd3\xa0\x63\xc1\xaa\x81\x69\x8f\xf8\x92\x99\x8f\x66\x4b\xa6\x0a\x8d\xf7\xcc\x79\x47\x51\x02\x41\xd0\x62\x2b\xd5\x00\xd5\xa4\xa7\x7e\x37\x81\x36\x69\x6c\xa9\x80\xe1\x04\xe1\x0b\xc1\x38\x81\xd9\x36\x80\x34\xe9\x59\xdf\x0f\x01\xf3\x25\xe7\x17\x56\x08\xd3\x46\x43\xfb\x7c\x57\xf5\xd0\x3d\xeb\x33\x8a\x6d\x4a\x8b\x34\x2a\x47\x9d\x1d\xdf\x30\x7e\xea\xec\x90\x51\x24\xa7\x32\x8c\x3a\xbb\x12\xae\x46\xa1\x7c\xeb\x7d\xd4\x18\x10\x3f\x2f\xe5\x4f\x7d\xcc\xce\xa3\xe6\x78\xe5\x71\xca\x17\x8b\xfc\xa7\xd2\x5f\x99\x4e\x19\x0e\x17\x0b\x6f\xc8\x7b\x36\x87\x2d\x58\x9c\x3b\x9e\x29\xc6\x13\x8d\xe0\xac\x4a\x78\xde\x10\xc9\x10\xd6\x01\x80\x4b\x9c\x84\xac\xef\x8d\x80\x2e\x9b\x8e\x69\xc2\x7c\x1a\x1d\x33\x6f\xc4\xb9\x26\xc2\x7c\x02\x7e\xc5\x32\xe4\x4d\x69\x66\xf9\x34\x1a\xec\x03\x33\x4a\x49\xe9\x07\x07\x1e\xff\x43\xc0\x51\x9a\x37\x07\x1b\x93\x42\x67\xf6\x36\xc1\x0a\xca\x55\xea\xc9\x4d\xed\x76\xbd\x32\x4a\x7a\xe6\x1e\xcb\x81\x97\x2d\x79\xd1\xe5\x95\x4f\x4a\xf4\x68\x1b\xf9\x3e\xf8\x3a\xf3\xc9\x2e\xe5\xb1\xb6\x4a\xef\x1b\xfe\xf8\x8b\xe8\xf1\x5e\xa0\x4a\xc1\x8a\x2c\x16\xcd\x31\x2e\x16\x9e\x0d\xea\x48\xe9\xe3\xe2\x9a\x8b\xde\x66\xe4\xfb\xaa\x81\xa8\xcc\x91\x18\x0f\x73\x25\x18\x42\xd4\x9e\x16\xaa\x7d\xf1\x41\x25\x33\xac\xa8\xa0\xc3\xe1\x9d\x2d\x16\xa5\xaa\x52\xa8\x7f\x22\x3e\x6a\x13\x51\x30\x74\xed\xde\x75\x09\x53\xe2\x11\xf1\x52\x77\x6c\x3d\x59\xf7\xda\xc0\x30\x3a\x2c\xb7\x78\xe5\x51\xac\x47\x19\xf5\x43\x83\xc3\x8a\xe2\x30\x6e\x8b\x53\x10\x61\x74\xb2\x7e\x74\x97\x55\xaf\xf8\x15\xcb\xd2\x60\x98\xaa\x88\xa7\xac\xc6\xc3\xa7\x6e\x68\x40\x41\x68\x84\xdc\xd2\x5a\x28\x5f\x7f\x87\x37\x7a\xc0\xd0\x92\xc9\x80\x1b\x5e\xe2\x87\x47\xcc\x4b\xc8\x5d\x03\xf1\x0c\x88\x89\x21\x03\x8d\x40\x02\x46\x14\xb8\xe3\xdd\x88\xc0\xca\x7f\x73\x20\x92\x4f\x5c\x23\x92\xc9\xd5\xd3\x5a\x7e\x48\xbd\x84\x0c\xfc\xa5\x9c\x86\x68\xe3\x9f\x99\x4a\xff\x9e\xa9\xf4\x1f\x36\x95\x9d\xcf\x98\xca\x06\x9f\x4b\x5f\xcf\xc5\x44\xa4\xe6\x54\xd6\x4f\x24\xd5\x13\x49\x71\x22\xa9\x10\x55\xae\x9f\x08\xb3\x27\x62\x91\x2f\x41\xba\x6e\x5b\x76\x1e\xb0\x2d\xcc\x5f\x4a\xda\xf9\x8e\xa6\xc5\x14\x4d\x07\xd4\xe3\xa0\x10\x15\x12\x03\x58\xda\x19\xa6\xb6\xc2\x16\x08\x93\x34\x02\x91\x32\xe9\x47\x6b\x25\x9a\x86\x80\x90\x0c\xa2\xfe\x3e\x08\x96\x53\x3f\x38\x0c\x91\xd7\x48\xbc\x98\x0c\xfc\x10\xcf\x50\xd8\xff\x9b\x82\xda\xf4\xb3\x04\xb5\xff\x0f\x7b\x6f\xdf\xdd\xb6\x8d\x3d\x08\xff\xaf\x4f\x41\x73\xbb\x32\x19\xc3\xb2\x9c\xa4\x49\x4a\x16\xd5\x2f\x4d\xec\xd4\x6d\x1c\x67\x62\xa7\x9d\x5f\x5d\x6f\x0a\x92\x20\xc5\x8a\x22\x15\x92\xb2\xad\x58\xfa\xee\xcf\xc1\xc5\x0b\x01\x92\x72\xdc\x99\xd9\x3d\xcf\x9e\xb3\x73\xa6\xb1\x08\x80\x17\x20\x70\x71\x71\xdf\x70\x6f\xa2\x19\x66\x10\xb0\xb9\x5b\xbf\x7c\xb0\x95\xaf\x6a\x86\xca\xc8\x4e\xc5\xa3\x83\x71\x47\x13\xc6\x82\x68\xb2\x93\x9f\xe8\x0a\xbd\x6f\x5f\x88\x70\xd0\x33\x3e\x89\x7e\xc4\x85\x63\x9c\xf8\x02\x4c\x5b\xa7\x81\x29\xd7\x4a\x54\xf8\x15\xa3\x6a\xe2\x23\x60\x42\x67\xf2\xc0\x20\x22\xd6\x98\xb1\x08\x9a\xa6\x61\x67\xac\xbc\x83\x34\x9d\xc3\x92\x7d\x71\x90\xd1\x4f\x69\xf5\xb2\x5a\xe5\xa1\xa9\x81\x80\xf4\x4d\x5d\x0d\xd3\x1a\x1f\xba\xbd\xfa\x8d\x88\xc7\x14\xcf\x21\x16\x51\x96\x01\x71\x83\x98\xe2\xe2\xbb\x50\x5f\x03\xc7\x45\x10\x64\x83\x37\x19\x0e\xe3\x51\x0f\x09\x71\x22\xa9\xc7\x82\xa3\xcf\x45\x2d\xcd\x8e\x1e\x5d\x5c\x4e\xe2\x5b\xb6\xcb\x08\xa2\x28\x42\x09\x84\x80\xfb\xda\x98\x5f\xa7\x91\x1c\x32\xd1\x4f\xc5\xc1\x53\x77\x23\xf2\xe3\x6e\xdf\x20\x8c\xae\x09\xb2\xab\x69\x72\x13\xb1\xb4\x41\x4b\x89\x95\x88\x31\xb6\x58\x2a\x81\x16\xad\xd6\x68\x8a\x4d\x59\x5c\xf0\x39\x33\xc1\x06\x4c\xe1\x10\xfb\xf6\x3b\xa5\xe1\xe7\xe8\xb5\xc4\x89\xc4\x15\x74\xcb\x50\x2d\x70\xfd\x5b\x86\x35\x01\xba\x75\x7b\x4f\xc3\xc4\x5c\x9e\x0f\x34\xa4\xe9\x35\x44\x96\xad\xd6\xeb\x19\xc6\x78\x3a\x1c\x2e\x31\xc6\xb7\xeb\xb5\xc3\xa0\xf3\x05\xb9\xe7\x2d\x67\x8a\x6e\x5d\x24\x1a\xee\x60\xbc\xdc\xb6\xbc\x89\x6c\x84\x04\xe7\xb5\xec\x4c\x0d\xe7\x34\x20\x72\x87\xb6\xf0\x13\xc1\xa7\x1b\x85\x28\x41\x53\x76\xa0\x2f\xb9\xc3\xfe\x6c\x07\xe3\xe9\x7a\xbd\x64\xf8\xb1\x5e\x2b\xb5\x3c\xdf\xac\x6d\x80\xc3\xa1\xf1\xd8\xe2\x7e\xa4\x01\xc1\x98\xbd\x41\x77\xfa\x5e\xa7\x91\x64\x97\x66\xb0\xef\x8c\x05\xe5\xb3\xd8\xda\xe4\xc0\x58\x69\x58\xf7\xd4\x45\x42\x8f\x70\x8c\xa7\x92\x39\xc2\x18\xcf\xfe\xa5\x71\x1f\x4b\x66\x15\x90\xf4\xad\x8e\xa4\xe8\x0d\xe6\xfa\x28\xff\xb8\x37\xf8\xf3\xdb\x51\x35\x2d\x96\x8c\x78\x8a\x8f\xe3\x20\x27\x5b\xca\x9d\x63\x44\xd1\xad\xeb\xbd\xd1\xa9\xcf\x1b\x43\xcf\xf9\x7e\x59\xd2\x96\xae\x73\x87\x12\x67\x86\x8e\xe1\xfa\x03\x71\x96\x6c\xf5\x76\xc6\x9b\xe3\x89\xd3\x37\xa2\x16\xc6\xf1\x7e\x87\xc3\xde\x62\x67\x0a\xc3\x41\x5f\x81\xa3\x16\x6c\x38\x6c\x2f\x83\xeb\xf5\x5a\xb7\xfa\x57\x7b\xf0\x6f\x2c\x37\x3b\x11\xa7\x2e\x8a\x1c\x46\x4c\x5c\x45\x3b\xa6\x8a\x5a\x30\x7a\x22\xa9\xff\xad\x3c\xc1\x8e\x37\x3c\x04\xfd\x19\xed\x5d\xbd\xf3\xd5\x3c\x28\xb2\xe1\x90\xff\xbd\xb4\xe3\xa2\xb4\xaf\x5a\x8f\x8e\x0d\x07\xe7\x68\x51\x94\x35\xc9\x6c\x77\xbd\x7e\x36\x3e\x1c\x3f\xd3\xee\x42\xb4\x94\xde\x4f\xbe\x27\x65\x02\x97\x62\x2a\x15\x45\x83\x93\x1e\x26\x22\xcb\xaa\xcb\x27\x57\x13\xfd\x81\xeb\x01\x04\x23\xf2\xcd\x37\x7c\x80\xde\x19\x45\x33\xe1\xa1\xa9\xb8\x25\xdb\xde\x8b\x90\x54\x37\x7a\x04\x99\xca\xc4\xa0\xad\x29\x0c\xf9\x0c\xfc\x83\xe2\x97\x65\x49\x56\xa3\xb4\x82\xbf\xe8\xc3\x43\xa6\x64\xc4\x2f\xe2\x17\x25\x3a\xa7\xe8\x82\xa2\x8f\x14\xfd\x4a\xfd\xc1\x83\xe7\x72\xe2\x9c\x53\xdc\x3b\x9d\x94\x8f\xd1\x76\xd1\xc5\x96\x16\x8c\xbf\xb3\x5d\xf4\x71\x4b\xb5\xa0\x35\x2e\xfa\x75\x4b\x83\xb8\x24\x09\xef\xc2\xf5\xd8\x30\xd8\xb2\x3d\x61\xbd\xb1\x1f\x4f\x19\x5c\xf6\xe3\x5b\xf6\x3e\xfb\xf1\x5c\xf7\x04\x96\x6a\x4e\xa9\x77\x59\xaf\x7b\x15\x9e\x66\xf8\x22\x82\x3f\xd0\xe1\x90\x5c\x7e\xa0\x57\xeb\x35\xb9\xb4\xff\xeb\xbf\xe4\xec\xd9\x57\xf7\x2b\x5a\xda\x01\x6d\xfe\x69\x88\x82\x01\x98\x5b\x34\x09\x50\x0f\x7f\xae\x59\x94\x45\xc2\x9b\x4f\x70\x31\xcb\xbd\x0b\xb0\xfc\xed\xeb\xd6\x18\x3f\x18\x0e\x9d\xc7\x32\xc8\x13\x9c\x8e\x87\x4d\xf4\x2e\x14\xe9\xd4\xcf\xf5\x0d\x0b\xf3\xd3\xe7\x90\x41\x9e\x33\xeb\xb6\xbd\x17\x6a\x83\x52\x91\x61\xb9\x75\x68\x38\x84\x3f\xa3\x4f\xdc\xd6\xf2\x81\xc6\x4c\x6e\x71\xb5\x90\x9b\xb1\x4f\x70\xd7\xb1\x50\xb0\x72\x18\xbf\x9a\x88\x9f\x77\x1b\x8f\xff\x6a\x94\x64\x22\xaa\x46\x70\x49\xaf\x3c\xf6\x0f\x26\x1b\x9f\xe8\x5d\xd1\x46\xbe\x96\xc6\x1e\x6d\x9e\xe0\x9b\x9f\x6a\x36\x7f\x39\x4f\xc6\xb7\x7e\x07\x29\xf0\x9b\xd8\x2b\x8d\xcd\x57\x2c\x4e\x73\xb3\x74\x07\x2b\x0e\xf3\xb5\x63\x3f\x39\xb4\x91\x7d\xc9\xcd\x43\x22\x0c\xfd\x15\x5b\xee\xce\x15\xe3\xba\x10\x57\x06\x84\x48\x3d\x11\x36\x25\xeb\x26\xad\xa7\xd6\x8c\xae\x2a\xeb\xce\xde\x13\xaf\xb1\x47\x27\x70\x47\x7f\x15\x69\xee\xd8\xc8\xb2\xdd\x3d\x7b\x63\x7b\x01\xb2\x6d\x5d\x25\xfc\x3b\xed\xa4\xc5\x94\x91\x3a\x03\x19\xbd\x5d\x43\x6c\xcd\xce\x29\xd6\xc6\x8f\xf4\x42\x1e\x0e\x0a\x87\x9a\xf5\x52\xea\x60\x16\x13\x67\xa1\x5b\x3e\x23\xa4\xb7\xc2\x91\x2b\x55\x75\xa2\xc0\xac\xf5\x3b\x56\x53\x5f\xb7\xaa\xbe\xd0\xf4\xcc\x11\x88\x46\x77\x46\x9c\xc1\x5c\x46\x39\x93\xa3\x89\x7c\x37\x84\x76\x88\x8d\x5f\x9a\x2f\xf5\xdb\x6b\x6d\xc5\x04\x4f\xc4\xc2\x84\xad\x53\xb2\x90\x60\x02\xdf\x55\xfc\xc3\x8c\xae\x26\x64\x54\xd1\x9a\xe7\x3b\x43\x81\xeb\xc9\x47\x30\x86\xa2\xc0\x45\x5a\x0c\xb2\x1e\x0b\x52\xec\x34\x71\x52\x9b\xa0\xe7\xb8\xa0\x8e\xca\xc8\x23\x4c\xfa\x48\x81\xe1\xaa\x9c\xa0\x6b\x42\x8a\xfc\xc0\x30\xc1\xcb\x77\x07\xec\xa7\xfe\x72\xdb\x36\xd5\x67\x1c\x4b\x1c\x22\x14\xc2\x02\x4a\x64\xc6\x71\x0c\xfd\xa8\x1d\xe4\x51\x4e\xb4\xf2\x44\xc2\xc2\x38\x8c\xa2\xef\xc3\x89\x2e\x14\xe0\xc7\x28\x74\xbd\xc8\x37\x8a\x7a\xd2\x59\xcc\xd8\xb6\x0f\x38\xdd\x00\x1e\x40\xf5\x67\x0a\x19\xf8\xb1\xdb\x33\xb9\x53\x23\x0c\xad\x80\x11\xac\xd7\xcf\x76\xda\xe1\xed\x30\x84\x11\xeb\x13\xd6\x60\x0d\x34\x57\x0b\xc2\x26\x1e\xcb\x65\xf3\x8d\xaa\x9e\x59\x2c\x3b\x43\xd8\xc1\xdc\x4f\x06\x2c\x98\x10\x09\x6e\xb5\xa0\xcd\x8c\x01\x64\xce\xb9\x00\xaa\x82\x35\xfd\x9f\x80\x0e\x2e\x8a\x8c\x81\x44\x7e\x84\x17\xf7\x8c\xdb\x1f\x18\x6f\xfb\x51\xdf\x58\x35\xbb\x70\xbe\x65\xba\x9e\x77\xa7\xab\xfa\xdf\x34\x5d\xab\x2d\x43\xf8\xae\x3b\x84\xfa\xde\x21\xf0\xe9\x0d\x45\xc8\xf0\xfe\x11\x71\xaf\x0b\x65\x4d\x16\x8d\xbf\x3a\xc6\xe5\x96\x31\xaa\xa8\x88\xeb\x75\xb0\x2d\xa6\x1f\xd7\x1f\xeb\x25\x66\x63\x93\x31\x83\xd6\x66\x51\xf3\xfd\xcb\xad\xdf\x3f\xd8\xbe\x06\x86\x0d\xfa\x21\x0b\x72\xdb\x58\x71\x5a\x9f\x7b\x38\xee\xae\xc9\xe7\xed\x6b\x82\xe8\xbf\x85\x18\xc7\x92\x81\x86\xd0\xfa\x6d\xe7\x8c\xa0\x89\xd9\xa7\x15\x1a\xbb\xdb\xb6\xf7\x82\xfe\xa1\x85\xdd\x81\xb1\x4e\x3a\xce\x1b\x81\x62\x5f\x9a\x9c\x8f\xc1\x48\xf2\xe1\xc2\xff\xff\x9c\x7a\xc0\x61\x89\xdd\xfd\x2b\x35\x26\x27\xe0\x1b\x5b\xad\xc2\x96\x01\x21\x38\x4d\xba\xc3\x0a\xd9\x76\xdf\xfa\x15\xfe\x20\x94\xdb\x5d\x3a\x31\x84\x7d\xb3\x2a\x32\x48\x5e\x50\x4f\xdf\xce\x0f\x9f\x1c\x78\xfb\xa3\x7a\x3b\xc4\xf5\x7d\x6f\x8b\xf0\xd1\x81\xd8\x89\xc6\x88\x90\x18\xca\x99\x36\x94\xe5\xdf\x18\xca\x26\x8d\x9d\x7f\x50\x27\x70\xd7\xeb\xdf\xa8\x96\x61\x84\xcf\xf5\xb6\xc9\xe5\x0a\xb0\xf6\x57\x09\x96\x6d\xd3\xcb\x0f\xbc\x6d\xdf\x06\x91\x88\x30\x81\x95\x52\x31\x87\xbb\x98\x19\xf6\x61\x66\xa8\xf3\x28\x3b\x4a\x59\xcf\x8f\x2b\xc6\x34\xb3\x1d\xd1\x8b\x83\xa1\xc2\xc1\x50\xe1\x60\xd8\x83\x83\x72\x6d\xc0\xc9\x10\xe3\x01\x9d\x84\x0d\x4a\x4e\xc4\xa6\x6e\x23\x23\xdb\xa3\x5e\x73\x60\x79\xcd\x35\x91\x8b\x0e\x44\x3a\xc9\xfb\x1a\x36\x68\x21\x08\x05\x9d\xac\xfa\xda\x9d\xf5\x00\x5c\x9a\x0d\xc5\xe2\x86\x7c\x71\xcd\xfb\x33\xcd\x9c\x35\xf4\x89\xdb\xd1\x60\x19\xc3\x2d\xcb\xf8\xa6\x45\xcc\xba\xcb\x15\xf5\x2d\x97\xe2\x67\x08\xbf\xa9\x00\x63\xe2\x56\x62\x86\x65\x08\xa4\x6d\xba\x65\xc5\x22\xb5\x62\x91\x5a\xb1\x68\xfb\x8a\xc9\x2e\x14\xf3\xcd\x58\xcc\xd0\x83\xbf\xb2\xd7\xc8\x58\x4a\x36\x82\xa8\xbd\x94\x14\xf1\x37\xbc\x41\xc9\x1b\x20\x99\x88\xf7\xe2\x6f\x75\x95\xb7\xde\xfe\xd8\x79\x5b\xcd\xc5\xaa\xd5\xf4\xec\x6f\x75\xb4\x54\x6f\x8b\x75\x8f\xf8\xba\x47\xee\xd6\xc9\xbf\x95\xaf\x34\x4b\x1f\xb4\xe3\x51\xa8\xa5\xbf\x70\x08\x8a\xd1\x35\x9a\x35\x51\xbf\x17\x9c\x8f\xfe\x22\x92\x58\xe2\x18\x4d\x71\x8c\xc7\x48\xc8\x1a\x62\xd5\xb2\xe1\x70\xfa\xfd\xb5\x34\x98\x4e\xf7\xf6\xdc\xbb\x8c\x33\xb5\x3f\x4c\x27\x4e\x8d\xd9\x9b\xd0\xbf\x57\xe3\x4c\x31\xfa\x0c\xfe\x0d\x66\x64\x23\x43\xd7\x97\xd3\x2b\x34\x73\x35\x15\xe4\x8d\xf2\x88\xc9\x86\x43\x27\xc3\xb5\x8c\x22\x1c\x0c\x87\x99\x62\x76\x6f\x74\x66\x97\x49\x2e\x99\xeb\xc7\x38\x71\x6e\x50\x8c\xa6\x2a\x5c\xed\x97\xc9\x02\xdf\x78\x5f\x14\x7b\x7f\xe3\x7f\xc1\x37\xfe\x20\xc3\x35\x9b\xc8\x29\xc6\xf8\xba\x95\xd0\x36\x02\x50\x68\xa1\x0d\x28\x13\x71\xa7\x5a\x5f\x9a\xc6\x4e\x86\xd9\xc9\x2b\x3e\xc1\x65\xdd\x67\xd0\x3d\xd2\xba\xcf\xb4\xee\xd9\x7c\x4a\x1d\x95\xb5\xd8\x30\xa8\x19\xa6\x7c\xf0\x5d\xe8\x35\x7e\xe3\x64\x88\xa0\xa9\xea\x01\xa4\x50\xb5\x65\x6a\x4d\xf6\xcc\x2e\x6d\x2e\xd4\xdb\x57\x72\xd8\x20\xf2\x4e\xa6\x1e\xfc\xe5\x93\x53\x77\x26\xa7\xd6\x46\x57\xfb\x5f\x70\x0d\xb3\xdc\xbd\xb8\xd8\xa4\xbc\x14\xb9\x2a\x5d\xed\x33\x24\x1a\x9d\x34\x68\xc4\x51\xe8\x37\xea\x5c\xf7\x1b\x03\x16\xdc\xaa\xd0\xe8\x4d\xfc\x6b\xbc\xe0\x72\xfc\xb5\x1c\xe0\x35\x6f\x73\xd8\xb4\x91\xc8\x39\xc5\x8b\x06\x2f\xbf\x68\x78\x89\x6e\xf0\x35\xc8\xc5\x8e\xab\xa1\xe8\xce\xcd\x28\x2a\x72\xea\x7f\xd9\xdb\x43\x83\xa6\x45\x83\xab\x5f\xee\xc7\xd5\x5c\xe0\xea\x8d\x38\xa6\x0d\x74\xcd\xdd\xbb\x6c\xbd\xde\x8a\xa7\xf9\x16\x3c\xcd\x51\x8c\xbe\xa8\xa5\x98\x4e\x16\x38\xf7\xa6\x8d\x18\xea\x4f\x71\xee\x0b\x34\xe5\xa3\x7f\x00\x82\xea\xdf\xa9\x7d\xe6\x0d\x60\x69\x33\x78\x69\xce\xba\x81\x44\xbf\x7c\xcb\x7c\x51\x38\x3b\x85\x2d\xd3\x0c\xe5\x06\x4d\xf1\x8d\xbb\x05\x69\xb7\xf4\xc8\x06\x2d\x90\xf7\x4b\x5f\xc7\x2d\x44\xbe\xb9\x1f\x91\x6f\x00\x91\xbf\x78\x37\x0d\x22\xdf\x74\x66\xcf\x18\xb2\x3f\xc5\x37\x0f\x42\xe4\x81\x89\xc9\x6d\xaf\x4e\xb0\xbc\xa1\x84\xa3\xf3\x14\xdf\xeb\xb2\xcc\xd6\x63\xea\x8a\x33\x8c\xf6\x9c\x61\xc4\x03\x30\xd7\x98\x82\x0b\x37\x9b\xc7\x29\x0e\x24\x9a\x4e\x79\x6c\xb8\xa9\x38\xf0\xaf\xd9\x1c\x1e\x8e\xd9\xc7\x81\x96\x91\x36\xa7\x9a\x37\x95\xbf\x45\x86\xac\x3b\x86\x12\xea\xeb\x5d\x10\x1c\xa6\x48\x7b\x63\x42\x5b\x27\xa0\x27\x0a\x10\x6b\x2d\xd9\xe2\x29\x3b\x9c\x4c\x49\x83\xe0\x40\x05\x89\x02\xf3\x0e\xf4\x24\xf1\x1c\xbc\x93\x42\x5e\x32\xc5\x6a\x00\x1b\xbd\x67\x87\x32\x6e\xb3\xdd\x7f\x3f\xf3\x99\x20\xca\x39\x7b\x6a\x70\x9f\x04\x53\xd7\x73\x12\xc6\xdd\xd3\x2d\x2f\xba\x28\x69\x64\x79\xea\xa2\xa4\x05\x20\x51\xe7\xde\xcc\x21\xae\x88\xe2\x74\x01\x4b\xc2\x97\x81\x2f\x49\xa3\xc3\xe2\x8a\x60\xbe\x14\x53\xb6\x14\xcf\x55\xcc\x7f\x98\x83\xa0\x99\x6d\x0a\x62\x1a\x05\x6f\x83\xd6\xe4\xd1\xee\xe4\x05\x9d\xc9\x83\x50\xf5\x4d\x20\x7e\xca\xc4\x8d\xad\xdf\xd9\xed\xc2\xf8\x30\xc9\x85\x10\x4f\xd7\xa7\xb0\xf1\x7f\xb7\x75\xfc\x9a\xb4\x9f\x28\x69\x9f\xf6\x4a\xfb\x6d\x74\xb0\xe4\x17\x31\x21\x67\xfb\x98\xbf\x06\xb3\xfb\x09\x67\x7f\x67\x69\x9e\xca\x4f\x1b\x0e\xb7\x6a\x16\x54\x28\x32\x55\x32\x1c\x0e\xb6\xab\x16\xa0\x79\x4b\xb5\xb0\x65\xdd\x4d\x9d\xc1\x7f\x0c\x09\x96\xff\x32\x12\x6c\x7a\x59\x77\xda\xc7\xba\xab\x33\x05\x8c\x11\xca\xcd\x21\x18\x0e\x55\x8a\x8b\x89\x63\x7e\x36\x6a\xd0\xdd\xf5\x78\x1d\x2b\x2b\xef\x19\x6e\xcf\x7e\x46\x33\x91\x76\xe3\x1f\xd4\x51\x56\x6f\xe0\x42\xc5\x4e\x4a\x63\xe7\x37\xbd\xea\xa4\xa9\x9a\x0e\x87\x20\xc6\x08\x91\xa2\xcf\xaa\x44\x25\x19\x26\x1c\xe3\x01\xa7\x1e\xf3\x1b\xd7\x87\x1e\x95\x21\x6f\x10\xb0\x17\x8f\x6d\x44\xcd\x24\x47\x14\x92\x1c\xad\xd7\xb6\x32\x20\xdb\x8a\x7e\xf0\x2f\xe6\x16\xc1\x6f\x28\xfe\x9d\x3a\x3b\x63\xb4\x33\x76\x11\x89\xe1\xe1\x10\x1e\x02\xf5\x70\xa8\x87\x61\x09\x63\x5d\xc4\xd2\xb4\xdc\x42\x7b\x93\x88\xea\x8e\xbb\xb6\xa9\x77\x96\x97\x53\xc4\xd5\x26\x65\xd5\x09\xd8\xca\x88\x52\xe1\x72\xac\xb2\xfa\x88\xe2\xc9\x37\xb4\xd3\xa6\xfd\x96\xa1\x5f\x6e\x1b\xd1\x72\x95\x06\x82\x08\x0b\x15\x7f\x32\xcd\xcd\x87\x8f\x5f\xb8\xbd\x8a\x66\x0e\xd1\xbc\xe4\xcb\x64\x40\x36\xaa\x9d\x43\x17\x71\x6f\x30\x3f\x34\xdc\x5c\x68\xd4\x5c\x52\x16\xb6\xb3\x70\x54\xd2\x3c\xa2\xa5\xe3\xfa\x66\xc7\x7e\x2c\xdc\x65\xfc\x96\x87\x07\x16\x99\x44\xfc\x96\xfb\x0b\x16\x82\xbe\xaf\x86\x31\x6e\xdc\xb7\xf8\xac\x18\xfa\xea\x26\x78\x9c\x76\xb7\x53\xda\x0b\x04\xde\x4f\xe0\xb6\xec\xa0\x5d\x8c\xda\x05\xa0\x22\x14\x26\x77\xd7\x53\x3f\x87\x43\x7e\xdb\x56\xf9\xd7\x30\x2c\x7a\xa3\x4a\x14\x09\x73\x5b\xca\x69\xdd\x8d\x5c\x0c\x1d\x0c\x6b\x7c\xe5\x01\xd9\x9f\x34\xbc\xb4\x76\x40\xc8\x8c\x4f\x44\xe5\xa6\xe1\x4b\x0e\x57\x07\x4d\x67\x33\xd4\xbe\x39\xc0\x26\x9a\x23\x99\x88\xa0\xaf\x27\x9b\xf1\x95\x45\x53\x25\xb4\x21\xcd\x03\x0a\xd9\xa2\x08\x9e\xed\x41\x7d\x21\x13\x7a\x68\x98\x6d\x36\xdb\x56\x6d\xc5\x27\x47\x29\x25\x1b\x9a\xf0\xc4\x2b\x55\x92\x1a\x5f\x50\x89\x39\x6d\x15\x3d\xf5\xde\xc0\x0e\xd9\x72\xb4\xb8\x9d\xd4\x39\x4b\x46\x60\xb8\xf7\xca\x39\xad\x2f\x9a\xd8\xc1\xe8\x16\x93\xd1\xb2\xa2\xe7\xab\x3c\x3c\x0f\xa7\x34\x5a\xc2\x34\x1c\x63\xd9\xfc\x35\x5d\x94\x69\x51\xa6\x75\xfa\x85\x9e\x2f\x83\xba\xa4\x14\xbd\xc5\x01\xb8\x5b\xff\x54\x54\xb5\x44\xa4\x37\xad\x32\x18\x0c\xba\xc0\xe1\x08\xe2\xc4\xff\xb4\x8a\x4a\x19\xec\xa2\xa6\xe8\x04\xb6\x4b\x45\xeb\x56\xf9\x17\x1c\x8e\xea\x72\x75\x51\xbc\xca\x48\x3a\x7f\x47\x6f\x45\x03\x12\x64\x54\xc5\x47\x20\xf8\x1d\x75\xe0\x96\x82\xe1\xaf\xd9\x72\x42\xc1\xc1\x66\x6b\x03\xe1\xde\x2f\x42\x1b\x2c\x30\x19\x75\xdd\x44\xd1\x35\xd6\x32\x9d\x9b\x55\x35\x26\xa3\xae\x17\x25\xfa\x25\x50\x4e\x7a\x46\x85\x74\x01\x09\x68\x92\xe6\xbf\x15\xe5\xac\x15\xb4\x06\x18\x88\x31\x90\xc4\xf6\xbd\x99\x76\xc9\x0f\x8a\x46\x71\x14\xf2\x7b\x50\x68\x2c\x7d\xda\xc9\x64\x00\x5b\xec\x5b\x4d\xa4\x05\xaf\x01\xce\xfe\x20\xda\x72\xb3\x43\x89\xf0\x9a\x4b\xb8\xd7\x5c\xe2\xfa\x11\x8e\x1c\xca\x39\x26\x83\xa6\xdd\xab\x37\xeb\x4f\xe5\x1e\x09\x02\x39\xe1\x83\xc5\x8f\x11\xc5\x80\xd9\x68\x01\x7a\x20\x54\x73\x9b\x59\x80\x39\x75\xde\x19\x23\xca\x4e\x74\xde\xfa\x10\x71\x32\x0a\xb6\x22\x73\xa1\x69\x93\xc1\xaa\xa1\x93\xbe\x38\x5a\x21\x6a\xad\x70\xf7\x0a\xdb\x6e\x85\x51\xc7\x4f\x31\x8d\x1d\xe5\x2f\xe7\xca\x93\x85\x27\xfd\x77\xd5\xdd\x87\xe6\xc4\x89\x78\x3a\xb6\x00\xe7\x1a\x0f\x65\x91\x4d\x24\x26\x32\xe2\x13\xc9\xde\xc5\x94\x47\x75\xfd\xfa\xe1\x20\x4d\xbc\xea\xab\x36\xe6\x47\x3d\xf6\x14\x8f\xc4\xe7\x4f\x5d\xca\x15\x03\x1b\x90\x89\x46\x1b\x1a\x32\xeb\x5c\x03\xd5\xd0\xa7\x40\xcd\x3a\xdc\x66\xf1\x22\xfc\x8b\x88\xce\xe2\x22\xbe\x0a\x8d\x7e\xf0\x89\xec\x96\x11\x28\xc0\x9d\x3e\x7f\xd4\x89\x13\x75\xee\xcd\x80\x6b\x2a\xe7\x96\xb8\x92\x12\x5c\xbd\x59\x9f\xf0\xc2\x89\xc3\x16\x3d\x97\xd7\x9e\x22\x4c\xa5\x27\x11\x32\x9c\x4b\x91\xe6\xba\xa3\xec\xcb\x7c\xd9\x87\xc3\x64\x34\x05\x4a\x41\x87\xc3\x0b\x27\x70\x27\xe6\xe9\xff\x58\xb2\x13\xd8\xe0\x48\x22\x14\xb2\x1e\xd9\x00\x24\x76\xe9\xe8\x25\x7c\x91\x35\xf4\x12\x8d\xd5\x68\xa5\x75\xe5\x5b\xef\x2d\x5b\xee\x5c\x5d\x17\xfb\xc2\x1e\x15\xe2\xb1\x5d\x97\x75\x70\x2d\x6a\xa3\x63\xae\x5f\x56\xcb\xe4\x6a\x8a\x73\xf2\xa9\xe6\xed\x9a\x60\xb5\xc3\x5b\x54\xcf\x1b\x80\x2e\xb4\xeb\xf3\x19\x0d\x87\xf0\x67\xe2\x64\x38\x6a\xa4\xde\xa5\x43\x51\xe4\x4e\xb8\x9a\xc9\x4b\x86\xc3\x25\x6c\xf7\xb6\x53\xe0\xe1\x33\x17\x71\x46\x09\x3d\x3e\x7c\xfa\xfc\xe9\x8b\x27\xcf\x9e\x3e\xe7\x6e\x4b\x3b\xb7\xc3\xe1\x31\x87\xe2\x74\x1c\x1c\x9a\xc6\x6c\xce\x40\x93\xe5\xf0\x99\xce\xba\xfb\x38\x32\x26\x5a\xed\x29\x13\xf9\x9f\xb5\xec\x15\x62\xae\x11\x69\xd3\xb2\x5c\xbf\xba\xd7\xea\xaa\xdb\x37\x41\x8d\xad\xe3\x85\xc7\x49\xce\x73\xfe\xf8\xdc\x6b\xd3\xc9\x5e\x2a\x41\xc1\xf1\x1b\x58\x50\xd3\x99\x59\x19\x56\x3a\xcb\xd8\xa2\x27\x40\xee\xcd\x61\x61\x4c\x5d\xda\x83\x38\x8d\x8c\x67\x5c\x42\x1e\xb4\x19\x6f\x2d\xfa\x01\x0a\xef\x61\xbe\xdb\xed\xfa\xde\xee\x50\x28\xda\x30\xa5\x5a\x28\x0f\x36\x65\xdf\xe9\x8b\x24\x59\x16\xe2\xdd\xdd\xcf\xb5\xf8\xff\x89\x79\xfe\x97\xa7\xb9\x4b\xc4\x9b\xc9\x94\x11\x1b\x74\xda\x41\xd9\x44\x6d\xa5\xde\x74\x2b\xf5\x3e\x1c\xb3\x99\xe8\x1c\x45\xdb\x0f\x9e\x36\xee\xf6\x1c\x43\x83\xee\x07\xf5\x9d\x4a\x52\xaa\x7b\xd8\x59\x23\x43\x7e\xc1\x7c\x3e\x83\x9c\x01\xc0\xc0\x1c\x93\x34\xa3\x51\x2f\x1b\xd3\xc3\x8c\xf4\x70\xaf\x06\x8b\x6b\xf4\xf2\xdc\x76\x37\x06\xdd\x79\xf6\xd4\xef\xac\x02\x50\xaa\x8e\x30\x01\x14\xcb\x08\xac\xa1\x6e\x23\xff\x0b\x5c\x55\xd0\x89\xf6\xe1\x07\xed\x68\x1f\x3e\x17\x7c\xc5\x61\xe6\x3f\x6e\x74\x3e\x40\x70\x9a\xcd\xd3\xa1\x35\x42\xd3\xd9\x3e\x68\x84\xfc\xd6\x91\xf5\xf4\x6b\x79\x91\x92\xcc\x75\x5f\x3a\xc6\xdb\xea\xae\xd5\x1b\x11\x02\x51\xa4\x5a\x53\x0c\x6a\xac\x8a\x78\x46\x1a\x51\x9c\x30\x06\x78\xc1\xd0\x51\xdc\x6e\x85\xbb\x43\x68\x06\x39\x4c\x72\xb8\xec\xaa\x57\xb0\x73\x63\x0a\x5f\x41\x17\xa4\x14\x0e\xf7\xa8\x84\x3b\x40\x65\x05\xc9\x5a\x42\x8a\x72\x0c\xd1\xcd\x3e\x14\x45\x6d\xca\x04\x2b\x86\xfa\xc5\x42\x17\x1e\x96\xbc\xad\x5e\x74\x6b\xb6\xe2\xaf\x1e\x83\x68\x0c\xbd\x5e\x14\x5c\x32\xa0\xac\x85\xfa\x92\xb7\x5b\x1a\x18\x9f\xfb\x86\x35\x2a\x16\x2d\xd1\xe3\x42\x32\x51\x27\xf2\xc7\x17\xe9\x5d\x4b\x46\xf3\x25\x57\xb9\x4d\x9c\x0b\xac\xa5\x28\xdc\xa0\x13\xdc\xde\x03\xad\xdb\xa2\xa1\x3b\x1c\x46\x4e\xe0\x6e\xd0\x97\x76\x34\x3c\xea\xde\x85\xfc\x0a\x0f\x34\x70\x3d\x88\x5c\xf5\xf8\x09\x63\xd7\xe1\xc7\x33\xdb\xf5\x07\x42\x76\x08\x8b\xf9\x22\xa3\x35\xed\xdd\x77\x5c\x8a\xe9\x52\x14\xb1\x77\x16\xee\xa2\x73\x86\x48\x22\x62\x1c\xe7\xdd\x9d\xd2\x54\x03\x4d\x69\xb9\x21\xe6\x5a\x40\x4d\x7d\xd3\x1f\x76\xe9\xbf\x62\x5a\xff\x02\x96\xb5\xa9\x78\xe2\xdd\x32\x6a\xf0\xab\xf3\x4f\x14\x88\x68\x4d\x81\xeb\x2f\x0c\x75\xcb\xa2\xa5\xa5\x18\x0e\x9d\x85\xba\x18\xd0\xae\x44\xed\x82\x26\xef\xe7\x56\xfe\xf1\x0d\x1b\x93\x9e\xa9\x1b\xef\x3f\xf1\x2f\xb4\x78\x86\xcd\x78\xbf\xf5\x56\x3c\x09\x69\xee\x70\xf1\xf1\x5a\x72\x79\x3d\x8e\xd3\xba\xdf\xf5\x1d\xe7\x02\xdb\xc7\x56\x6d\xd0\x8a\x12\x2f\x1d\xd7\xaf\xf1\x60\xea\xd4\xe8\x1a\x65\x68\x81\x42\x54\xba\x3e\xd7\x36\xaa\x22\xd7\x07\x45\x17\x2c\x19\x78\x66\xf7\x28\xbb\x64\x32\xdf\x9d\x85\x6b\xb2\x4c\x6d\xd9\xe0\xd9\xb3\xc6\x55\x3c\xe7\x4e\xef\x6c\x10\x69\xec\xb0\x69\x71\x8f\xc1\xe5\x8b\x08\x3c\xe6\x77\x6a\x08\xa6\xce\x35\x8c\x0d\xc8\x25\xf1\xb8\x09\x4e\xea\x6a\xa4\x9d\xb3\xc9\x53\x9c\x35\x79\x8a\xe1\xa7\xcb\x88\x67\xa6\x7b\xa5\x4b\x84\x7c\xba\x23\x9a\x28\x79\x32\x93\xca\xa0\xac\x93\xbc\x38\xf3\x33\x59\xed\x33\x7c\x48\xf3\x25\x24\x0c\x81\xcf\xd4\x13\x18\x4b\xb3\xa4\x99\xc6\x58\x96\xea\xc9\x8c\x33\x23\x99\xb1\x00\x62\x11\xd6\x91\x96\xc8\x38\xeb\x49\x64\xac\xd5\xc3\xb0\xa4\xea\x9c\x31\xce\x30\x59\x72\x0a\x75\x96\x8d\x6c\x94\xca\x0b\x16\x72\xd0\xb3\x92\x1d\x1c\x7c\xe6\xa5\xb1\xd3\x8b\x64\x5f\x00\x4f\xda\x38\xb6\x70\x55\x6a\xe7\xae\xef\xfc\xbf\x80\x1e\x0c\xf5\x43\x40\x12\x86\x21\x13\x26\xfb\xf0\x4f\xf3\xf4\x4f\x8b\x9d\x05\x22\x28\x6c\x39\x69\x49\xa6\xda\xe9\xd0\x24\xd7\x88\x02\xf7\xad\x0d\x66\x1a\x92\xe0\x17\xfe\x35\xbe\xbc\x12\x48\x06\x58\xd6\x7c\xef\x70\xe8\xe8\x0b\x16\xb8\x0f\xc0\xbd\xf5\xfa\xa9\x42\x43\x46\x67\x9f\x3e\xb7\x1b\xf4\xfb\x4e\x55\x5d\xf3\x90\x02\x19\xb7\x68\x1a\x5c\xd7\xbf\x80\x94\x5f\xc7\xc2\xc1\xff\x66\x34\xcc\xf0\x42\x85\x5f\x5a\xe0\xcc\x59\x08\x36\xe4\xba\xd1\x97\x82\x34\xa0\x89\x96\x50\x2a\xc2\xb9\x33\xa2\x63\x32\x26\x52\x5a\x52\xa5\x20\x34\x69\xa4\xbd\x47\x0c\x38\x1c\xf7\x89\x06\xa2\x88\x1d\x04\xe8\xc2\x3c\x1e\x04\x36\xb0\x25\xea\x32\xa4\x3a\x67\x44\xe3\xce\x2d\x09\xd2\xdc\x64\x6e\xdd\xb6\x71\xeb\x72\x75\x17\xf2\x00\x2e\x22\xd2\xcf\xb5\x7b\x17\xb0\x8d\xea\x9a\xd7\x14\xfa\x23\xf7\xbc\xa4\xc3\x21\xc4\xf5\xf1\xfb\xcd\x3a\x10\xab\xa8\x2f\x4e\xe8\x03\x6e\x11\x8b\x38\x44\x30\x44\x79\x53\xba\xbd\xa1\xb7\xdc\x9b\x6e\xdf\x37\x96\x21\x8d\xba\xdf\xa8\xb1\xe3\xdf\xf2\xe1\x6a\x25\xcf\x3d\xea\x10\x9d\x36\x1b\xaa\xe7\xe9\x70\x98\x40\xea\x68\xfd\xf6\x45\xe3\xa5\xc5\xf3\xd3\xa7\xb1\x13\xc9\x85\x6c\xc4\xcd\xf5\x7a\x3a\x1c\x3e\x6d\xec\xbe\x7d\xa9\xe6\x1b\x2a\xd4\xb3\x47\x8c\xb4\xf3\x83\xfe\xbc\xf3\xff\x46\xca\x79\xd8\xe3\xf7\xa6\xc8\xd7\x2f\x82\x34\x91\xa4\xbe\x95\x31\x01\xd6\xeb\x27\xcd\xcf\xa7\xf2\xa7\x61\x2b\x33\x66\x0a\x85\x78\xe7\x10\xc5\x92\xe3\x4c\x24\xc7\x29\xb2\xec\x87\x2e\x13\x14\xb5\xc1\x72\x1a\xc8\xaa\xa5\xf0\xc7\x49\xb4\xe6\xb4\xa4\x9c\x4c\x1b\x84\xfc\xd6\x8b\x71\xa8\x5f\xd2\xd6\x32\x6d\x49\x26\xcc\x68\xd1\xca\x6b\x9f\xa8\x84\x56\xb2\xfd\xd3\x07\xb7\xdf\x18\xd9\xf4\x37\x21\xde\x19\x6f\x04\x5d\x0e\x1a\xba\xcc\xf1\x01\x38\xc3\x64\x72\xe2\xc4\xba\x96\xc0\xf5\x2e\x5a\x05\xfe\x40\x31\x0b\xca\x28\x1c\xe3\xad\x8a\x05\x4f\x61\xa2\x6e\x59\xea\x59\xe6\x46\x0a\x36\x98\x89\x7f\x03\x45\x1f\x82\xa1\xbe\xe6\x2d\xe0\x30\x7c\x70\xff\x16\xce\x6e\xf8\x15\x7a\x1e\x92\x7b\x19\x64\x69\xa8\x04\x1d\x26\xa4\x49\xc9\xc5\x27\xa6\x7c\x06\x57\xea\x49\x57\xe0\xe0\x74\xab\xc4\x53\x46\x49\xe6\x69\x0d\x01\x02\x50\xae\x9e\x85\xb4\xb7\xc2\x53\x6e\xc0\xd1\x6d\x49\x4b\xd5\x8a\x95\x8a\x96\xb7\x78\x2a\x84\x4b\x2e\x55\x1e\x9b\xcf\x17\x45\x23\xde\xbd\xc5\xd3\x51\x0a\x89\x8e\x78\x34\x6a\xf4\x46\x15\x9c\xe4\xaa\x99\xa8\x1b\x5c\xc0\x10\xe6\xc5\x35\xe5\x80\x4f\xcc\xe7\xe3\xb2\x98\xab\x77\xfc\x46\x8a\x9a\xa7\xf5\x87\xd6\xc0\x8d\xb4\x1f\x2b\x83\xf4\x6d\x10\x7f\xe5\x7d\x46\x42\x9e\xc9\x44\x6f\x2b\x3c\x42\x64\xfe\x84\x66\x81\x4c\xdf\x90\x98\xb1\xd1\xd2\x66\xad\x36\x86\x49\xa6\xe4\x36\xf6\x55\x52\x4d\x61\xaa\xc1\xf7\xed\xeb\xc0\xd8\xd7\x91\xda\xd7\x72\x57\x07\xf7\xec\xd2\x76\x9a\xba\xa7\x0f\x6d\xad\x9f\xc3\xcf\x0e\x6d\x77\x13\x6a\x82\xd3\xe1\xb3\xe1\xd0\x61\x12\x12\x0a\x0d\x71\xea\xf0\x39\x13\x13\x02\xa0\x5f\x21\x1c\x11\x77\xfa\x5e\x0a\x7b\xf7\x52\xa8\xef\xa5\x58\x37\xe4\xba\x8c\x32\x72\x5d\xf7\x16\x42\xd3\xb3\x85\xb4\x7a\x6e\x18\xd6\xba\xfd\x16\xee\xee\xc0\x26\x7c\x26\x7f\xca\xdc\xa8\xcd\x77\x3c\x76\x25\x61\xb0\x02\x4d\xa0\x0c\xe5\xf1\xf6\x14\x8b\x57\xf5\x76\xdc\xa5\xa6\x43\x6e\x42\x30\x36\xf3\x53\x05\xc2\x36\x98\x1d\xf1\x60\x3b\x9a\x45\x5f\x66\x46\x54\x41\xa3\xf9\x2c\x0a\x62\x4a\x1b\x62\x4a\xf9\x00\x26\xd1\xe4\x0d\xb8\x03\x35\xd2\x65\xe8\x7a\x6f\xbb\x45\xd1\xe4\xd8\x2c\x74\x99\x48\x6e\x14\x18\xd2\x19\x35\xa4\x33\x2a\x09\x2a\xed\x7c\x21\xf5\xa9\xac\x36\x08\x2a\xdd\x42\x50\x69\x2f\x12\x50\x1d\x09\xa8\x41\x50\x07\x8a\xa2\x52\xbd\xd9\x86\xf6\x2c\xbe\x56\x0f\xc3\x52\xf4\x53\xec\x70\xc8\xaa\x96\x16\xb9\xb1\xc1\x13\xc8\xca\xdb\x0e\xdc\x4c\x34\x4d\xa4\xdf\xbe\xe2\xa8\x9e\xb4\x46\x7a\xb4\xe1\x16\x30\x45\x61\x3a\x8a\x9d\x2d\xea\x54\x83\x73\x93\x7e\x30\x06\x8f\xc9\x17\x46\xc5\x2e\x68\x6b\x7e\xc8\x76\xe3\x91\x0a\xda\x24\x43\xfb\x1a\xba\x2c\xbf\x1b\x07\x4d\x12\xba\x78\x38\xcc\x9d\x10\xc5\x88\x82\x87\x7f\x60\x30\x98\xcf\xbc\x6d\x92\xe5\xe3\x86\x6d\xe9\xe8\xb9\xfd\xa5\xa3\x2b\x46\xb6\x1b\xbc\x42\xd0\x68\x1b\x54\xaf\x4b\xa6\x9e\x80\xfe\x9a\xcf\xf4\xdb\x34\xa6\xaf\x56\x61\x46\xab\x87\xcc\x77\xef\x14\xeb\xaa\xa2\xa7\xae\xa6\x59\x72\xc3\xfe\x00\x38\x28\xec\x0f\x80\x83\xc2\x6e\x38\x1e\xc7\x6d\x02\x97\x44\x9d\x70\xd0\xa4\x13\x00\x7a\x4b\x97\xfe\x96\x2e\xfd\xb0\x27\x90\x87\x03\x91\xd1\x83\xd6\x82\x37\xde\x77\xa7\xe2\x4a\xaa\x31\xcf\x61\x7f\xf3\x10\x9a\x87\x2d\x8e\x4b\xea\xef\x9b\x89\xf4\xb8\x5e\xce\x14\x45\x8c\x99\x6e\x6c\x78\xc6\x84\x0f\x87\xa5\x13\xa2\x81\xc0\xd2\xf6\x4c\x9b\xc6\x86\x67\x9e\x79\xc4\xdd\x8f\x1a\x2f\xeb\x9a\x84\xd3\x0f\x34\xf6\x7a\xf2\x23\xb5\x84\xc8\xde\x48\xf6\x3d\xe2\xe0\xb7\x5e\xe0\xcc\x9c\xd0\x6d\x5b\x3c\x02\xc8\x98\xdd\x90\x9f\xbe\x9e\x89\xe8\xb5\xd1\x2b\x12\x21\xb4\x72\xbe\x2f\x8e\x21\x3b\x58\x23\x5f\x80\x54\xa2\x1e\x03\x0e\x03\xe3\x38\x86\x0d\xf7\xbc\x31\x8b\x35\xb7\xaf\xe5\x47\xc8\xf4\x04\xba\x16\x3e\xe2\xe5\xba\x12\x9f\x15\x6b\x99\x38\xe2\x78\x83\x62\xf3\x31\x31\x1e\x25\xeb\x65\xea\xf7\x3d\x4d\x8b\x2e\xf5\x07\x8e\x4a\x2c\xe0\x6e\x50\x9f\xe9\xa0\xf7\xa5\x44\x7b\xa9\x6d\x30\x30\xe6\xf2\x57\x87\xf2\x7c\x00\x31\xff\x93\x30\x8c\x47\xa6\x25\xc2\x78\x21\x56\x3e\x7e\xdc\x8c\xcc\x01\x20\x0e\x80\xbd\xda\x76\x77\x6a\x91\x93\xdf\x9c\x84\x27\x47\x08\x30\xa8\xfd\x7e\x63\x2f\x8a\x54\x04\x3c\xe9\x00\x6a\x79\x51\x75\xb0\x2e\xc2\xfa\x07\xa2\x19\xd6\x27\xc9\x1f\x44\x38\x74\x66\x48\x86\xa8\x73\xfd\x19\x37\xf4\x3b\xb2\x27\xc4\x7a\x8a\xf8\x68\xb9\xbb\xd5\xb6\xe9\x54\x50\x71\x1c\xfb\x89\xf6\x60\xe8\x58\xa6\x1d\xf4\x6a\x9c\x31\x65\xa8\x75\x38\xef\xc6\xae\x2f\xee\x2f\xda\xaf\x8f\xde\x1e\x5d\x1c\xbd\xb6\xfd\xd0\x88\x14\x69\xde\x74\x0d\xf5\x38\x11\x8d\x8b\x5e\x63\x71\x9b\x38\xfa\x93\x1e\x67\x22\x44\x7a\x0d\x06\x2b\xb7\x6e\xbc\x33\x6b\x37\xba\x7a\x48\xa3\xf9\xe6\x86\x95\xc8\x05\x8e\xc5\x62\x7a\x49\xcb\x6f\x46\x52\x81\x89\x63\x84\xc0\x44\x3b\x63\xd7\xdb\x39\x6c\x39\x2b\x04\x38\x01\x48\x7f\x0b\x84\x24\x14\x1c\x86\x11\xa7\x39\x92\x7a\x04\xd2\x27\x76\x90\xe1\xf0\xdb\x1d\x15\xa5\xf0\x89\xfc\x09\x9e\x8e\x5a\xeb\x95\x08\xcc\x49\x71\xbf\x6f\xa0\x3f\x60\xe4\x67\x2a\xcd\x64\x3e\x8f\x34\x22\xb6\x73\x8f\x57\x5f\x77\x7b\xee\x1c\x4a\xbc\xdb\xda\x70\x83\xbe\xe6\xef\x67\xb6\xbe\xcf\xfc\xa7\xb7\x04\x72\xf7\xad\xed\xf6\xbf\xa1\xdb\x03\x3b\x6f\x3d\xb3\x05\x5d\xf8\xfa\xd7\x6d\x44\xb8\x4e\x32\x0a\x49\x2e\xe0\x1b\x66\xd5\xa6\xd8\x30\x41\x0a\x79\xdd\xfc\xe0\x73\xe1\x83\x3a\xe5\x95\xc7\x0c\x89\x9b\x5a\x2e\xe4\x96\x6a\x45\x9a\x7e\xf2\xa6\xcc\xe8\x64\xc5\x79\xcf\x25\xff\x73\xcb\x84\xc3\x87\x2c\x1e\x71\xef\x96\x78\x30\xd5\x71\xb2\xed\xa8\xb1\x6a\x2e\xa7\xdf\xe2\x9d\xf1\x57\x17\x79\x89\xf9\x58\x7c\x36\x88\xbf\xb3\xe2\x3c\xb0\xcd\xad\x24\x86\x10\xdf\x4e\xc4\x8d\xe1\xa1\x61\xdc\xbb\x08\xcf\x1c\x6e\xeb\xdf\x89\xd6\x6b\x55\x6c\x18\xc4\x1f\x43\xc7\xda\xb0\x37\x81\xb3\x42\x4b\x77\xc3\x4a\x96\x78\xea\x44\x22\x2b\x8c\xf9\x16\xcc\x19\x62\xdb\xe4\xa1\x78\xa7\x92\x0b\x94\x8e\x19\xda\x53\x90\x90\x16\xa7\x02\x76\x35\xdf\x8c\xaf\x1d\xe8\x26\x47\xa0\x0e\x3b\x63\xc8\x70\xf5\x70\x3c\x6e\x14\x93\x79\x6b\x18\x66\xff\xe4\x7e\x3c\x17\x19\x97\x77\x30\x1e\xac\x9a\x40\xff\x6c\xa2\x6f\xb5\x9b\x7f\x2e\x9b\xa5\xb1\x0c\xdd\x27\x03\xa6\xb2\x66\x8a\x06\xad\xd7\xf6\x94\x12\xc8\xc6\x1c\x0e\x87\x76\x50\x44\x2b\xf1\x7b\x87\xc7\x9f\x30\xcd\x40\x2e\x97\xcd\x97\x7e\xe8\xbb\x01\xdc\x0e\x47\x21\x66\x1c\x94\xcf\xba\xf3\x97\x78\x35\x99\x19\x4a\x1a\x3d\xce\xda\xce\xd8\x38\xb1\xfe\xea\x61\x88\xde\x06\x78\x4e\xf0\xce\xb8\x2f\x25\x92\x7e\xe4\x73\x96\xe9\xb9\x1e\x53\x0a\x52\x96\x44\xab\xe3\xa2\xe4\x89\x03\x18\x56\x69\x77\x01\x72\x11\x56\xe0\xf0\x7b\x0d\x91\x5c\xcd\x2e\xac\x9d\x45\x0c\x45\xfb\x4f\x34\xa2\x66\x52\x3b\xc7\xc4\xc5\x1c\x4c\x7c\xf9\x43\xaf\xf5\xaf\x13\x91\x4e\xea\x33\x0e\xe5\x31\xf0\xd9\x97\xfb\x66\xe7\x10\xc9\x50\xc3\x90\x58\x41\x8f\xb2\x24\x5b\xc5\xf8\x73\x33\x66\x3f\x06\x45\xce\x4d\xe2\x7c\x86\xad\x15\x0f\x0f\x1f\xbf\x90\xf1\x3e\x3f\xb7\xd2\xf5\xec\x60\x9c\x0c\x87\xb7\x89\x93\xb8\x1b\x71\x9c\xc6\xc3\xfd\xc7\x4f\x1f\x2b\x19\xea\x27\xca\xe0\x7c\x6e\xd9\xd7\x0d\x2e\xbd\xbf\xc9\x09\x75\xb4\xde\xd0\xe7\x96\x29\xa2\x55\x3d\x30\xeb\x5f\x78\x6f\x43\x86\x9a\x2b\xf6\x15\x88\xfd\x3e\xdc\x7c\xc6\x9f\xb5\xa9\xde\x08\xbb\xc8\x69\xc8\xe8\xc8\xce\x18\x51\x7c\x1a\x6e\x18\x07\x25\x24\x8f\xcf\x1c\x07\x9a\xb8\x62\x68\xe6\x7c\x46\x54\x1d\xdd\x9f\x87\x43\xc7\x04\xe9\xba\x9b\x2f\x09\xdc\x01\x91\x48\x41\xfa\xd6\x85\x0d\x46\x45\x4d\xde\xba\x26\x53\x63\x4d\xa6\xc3\x27\xcf\x86\xc3\x97\x49\x7b\x4a\xa6\x6c\x71\x86\xc3\x1f\xe5\x62\x4d\x87\xcf\x9e\xaa\x5b\x9f\xf8\x73\x63\x5e\x10\xd0\xdf\xc3\x25\xdb\xf7\x70\x39\x9f\xba\xe8\xbd\x76\xbd\x95\x4a\x8b\x4d\xac\xe9\x77\x74\xfd\x06\xd5\x9f\xd1\x56\x28\xae\x82\x03\x13\xf8\xa2\x91\x3b\x10\x35\xa4\x6b\x6a\x1c\x32\x8d\x54\xfa\x0a\xd6\x25\x1e\x41\x22\x60\x74\xa7\xaa\xce\x6b\x12\xce\xbc\x78\x64\x16\x6c\x5c\x7f\x60\x48\xa6\x52\xe1\xc0\xd8\xf6\x80\x60\x01\x67\xab\xcf\x19\x04\x1d\x25\xc6\x3a\xfa\x9f\x3b\xc1\xcc\x3e\xe3\x63\xa2\x63\x0c\x20\x57\xc4\x30\x26\xfc\x1a\xc6\x44\xf7\x63\xcc\x9c\xe0\xb7\x01\xc3\x88\x3e\xf3\xe0\x17\x3a\x1c\x7e\x69\x19\xe4\x62\xf6\x61\x31\x51\x77\x89\x8f\x5d\x14\x13\xe1\xe7\x22\xcf\x0d\xe1\xf9\x4a\x50\xc0\x6b\xd0\xb5\x43\x5c\x7e\xa9\x4f\xa0\x66\x3b\xdd\x00\x38\xcb\xb1\x4f\x21\xf8\xbd\x00\x26\xf9\xd7\x8d\x69\x56\x95\x56\x28\x4e\x41\x8b\x44\xd7\x7b\x21\x82\x7e\x66\x14\x5b\x63\x35\x79\xf8\x68\xed\xfa\x3a\xc5\xc4\x37\x9c\x8f\x30\xc6\x3f\xeb\xde\x46\x80\x78\xad\xab\x36\xec\x34\x7a\xdc\xe8\x1f\x19\x5f\x3b\xe0\xd8\xc4\xe9\x97\x48\x4e\x10\x63\x6a\x78\xa6\xc7\xf2\x3a\x5a\x3c\x19\x7b\x71\xfb\x9b\x9b\xfc\x0d\xd4\x74\x5e\x49\x7c\x77\xcc\xfe\xb4\x5e\x18\x0e\xc1\xa7\x30\x5e\xaf\xe3\x1f\xda\x75\x2e\xbf\xbd\xde\xb9\x22\x94\xe0\x44\x7d\x7d\xfb\xab\x70\xbc\xd1\x55\x0a\xca\xfb\xb2\xd1\xa5\x34\x4a\x66\x8d\xe0\x43\x32\x05\x53\xcc\xd1\x9e\x14\xb6\xe9\x47\x8c\x80\x04\xca\x6d\xa3\x34\xdc\x76\x0e\x99\x20\x8d\x60\x7f\xc6\x49\x86\x8c\xf3\xae\xbf\x9f\xc9\xd6\x5e\x5a\x31\x05\x49\xab\x23\xd7\xed\x8d\x54\xe7\x0f\x74\x73\x3e\xc1\xa1\x70\x4c\xd2\x2f\xd0\x76\x0e\x6b\x61\xc1\xd8\xf4\x87\x1c\x89\x1a\x5d\xcf\x4d\x07\xa1\x95\xd1\x8f\x51\x14\x1c\xc2\x56\x6a\x9f\xfc\xdd\xcd\x42\x1b\x90\x79\x77\x93\xfc\x6b\x30\x63\x2d\x8e\x29\xa3\xe6\x9c\x1d\x06\xac\xfc\x79\xbd\xfe\xf9\x07\x02\xc1\x0e\x7e\xfe\x1e\xbf\xe3\x69\x25\x24\x2a\x1d\xf9\xee\x11\x9e\x3a\x47\xee\x84\x3a\x47\xae\x17\x39\x47\x42\xad\x6f\x34\x1a\x0e\x77\x16\x8e\xdb\x6d\xba\x91\x16\x80\x87\xf6\xf4\x55\xf8\x00\xd5\xbc\x45\xea\xde\xcd\xb9\x49\xf2\xa9\x76\x2b\x90\xf3\x6a\xa4\xbb\x9c\x03\xce\x8d\x32\x06\x95\x06\xeb\x75\xb0\x03\xc3\x12\x73\x7a\x24\x88\xd4\xfe\xe1\xf7\x11\xf5\xdd\x76\x32\x5a\x1f\xf2\xc5\x36\xa9\x2c\xf1\xab\xe6\xce\x04\x23\xc4\x73\x76\x86\xd3\x00\x13\xff\x67\x1c\xf8\x47\xb8\xa0\x0e\x55\x74\x53\xe6\x1c\x13\xaa\xb3\x9d\x43\x24\x6c\x01\x70\x8e\x37\x89\xb6\x7e\x69\x0e\x89\x5f\x42\xee\x01\x14\x0a\x8b\x60\xe0\xde\x05\x04\x8b\xec\xca\x1b\x4e\x80\x8e\x34\x8b\x52\xe2\xc6\x81\x11\xc1\x7a\x8a\x67\x0e\xc4\x08\xcc\x65\x80\x09\x38\x58\xcd\xdb\x93\x3b\xb1\x48\xfa\x15\xe2\xa9\x1f\xe1\x40\x44\x74\x08\x35\x9a\x26\x15\x1e\x89\x71\x0c\xff\x45\x9d\xa4\xa5\x89\xcd\x5a\x25\x4f\xbc\xe3\x76\xa3\xa7\xbc\x88\x11\xb0\x04\x43\xc8\xf1\x44\xcb\xaa\x88\xf1\x54\xd8\x78\x12\xac\x19\x62\x36\x47\x98\x32\x5e\x9e\x09\x72\xad\x79\xf2\xd9\x3c\x35\x96\x22\xb1\x57\x37\x01\x0e\x88\x1f\x73\xa6\xfd\xd0\x1f\x88\xe3\x4c\x53\x4e\x5f\x6b\x8e\x9a\x5d\x3c\x99\xa8\x84\xc2\xcd\xe0\x3c\x73\xe7\x1b\xb7\x8a\x5b\x3b\x10\x09\xf6\x19\xfc\x34\x24\x83\xaf\xbc\x3c\xdc\x10\x13\x54\xf2\x54\xb5\xb0\x62\x1a\xce\xf3\x55\xed\xd1\xcf\x24\x2a\x14\x0b\x43\x87\xc7\x6c\xb9\xc1\x87\xa1\x3f\x64\xf7\x3d\x0c\x12\x5c\x14\xda\x19\xa3\x18\xc7\x91\x93\xb0\x43\x37\x41\x90\x54\xc7\x7b\x22\x81\x82\x4f\x01\xbf\xbe\x5e\x3a\x09\x8f\xd7\xf3\x36\x54\xd7\x82\x24\x23\x31\x25\x95\x93\xb8\xaa\x38\xd1\x99\x3e\x59\xad\x85\x44\x69\x25\xc7\xe7\xf3\xc2\xe6\x68\x63\xae\xb5\x4e\xa3\xa5\xcb\x4a\x4e\x38\x8b\x21\x72\x3b\xbb\x7e\x4e\x46\x24\x8a\x1c\x11\x85\x78\x8a\x6d\xdb\x4f\x30\xf1\xa3\xe2\x8e\x78\x3d\xd8\x3a\x96\xb7\xe6\xf5\x3b\xf4\xdc\x14\x36\xc3\x83\x64\xf4\x29\xa2\xc1\x32\x39\xbb\xc9\x69\x89\x32\x2c\x9f\xcf\x8b\x65\x19\xf2\x9b\x58\xc7\x84\x4f\x97\x08\xa4\x03\x63\x9f\xb1\x31\xb1\xe2\x99\xeb\xfa\x33\x9c\xf9\xc7\x04\xdb\x7f\xe4\x96\x65\x59\x69\x6e\xd9\x7b\xce\x31\xd1\x52\xf0\xba\x7b\xce\x6c\x62\x5b\x0e\xa9\x2d\x7b\x6f\x36\x8a\xd3\x8c\xbe\x23\x73\x3a\x2a\x79\x88\x7f\xe7\xe0\x7f\x8d\x1e\x5d\xfe\xf1\xc7\x1f\x07\x57\x07\xc8\xb6\xdd\x3d\xdb\x63\xcd\xb2\x34\xa7\xef\x20\xe0\xc1\x9e\xed\xda\x5e\xce\x20\x70\x6f\xfc\xc8\x0a\x56\x96\xbd\x97\x43\xb9\x6d\xab\x1b\x1b\x8a\x53\x65\xa3\xb1\x37\xd3\x3d\x7c\x4c\x5a\xbb\xe9\x66\x9a\x66\xb0\x2f\x13\x3c\xf5\xe1\xc3\x88\xa2\x11\x8c\xd1\x7f\x2f\xc3\xe1\x32\xce\xaf\xe1\xa3\xd9\x70\x21\xce\xb8\xc1\x57\x27\x08\xf8\x64\x2f\xe0\x7f\x7f\x2c\x96\x79\x44\xca\x95\x17\x4d\xc2\x96\xd9\xc6\x6c\x70\xcc\xfe\x7a\x91\x59\x08\x5d\xc4\xe8\x06\x52\x24\xd4\xe5\xca\xa3\x1b\xff\x3d\x04\xdb\x0d\x51\xe0\x02\xad\x0c\x8b\xbc\x2a\x32\xca\xb9\x73\x27\x10\x5c\xba\xa0\x0a\xaf\xd8\x82\x1b\x0d\x5e\x25\xee\xe6\x6d\x30\x91\x34\x52\xe0\xae\x42\x24\x34\x88\x25\x26\xb9\xde\xb1\xd3\xf8\x2b\x86\x9b\x96\x3c\x60\xfa\x75\x1b\x61\x01\x1a\xd5\x49\x23\x2c\xbd\x07\xfc\x27\xcd\xf6\x30\x6c\xbe\xa2\x56\xdf\x1d\xad\xeb\xf9\x26\x44\x81\xff\xf7\xc2\x94\xd5\xfd\x40\x35\xfb\xc7\xe3\xf1\x23\xc7\x71\xde\x3a\xee\xde\xe1\x78\xec\x1e\x3c\x1e\xaf\xc7\xee\xde\xa1\x6b\xdc\x34\x57\x8d\x19\x3f\xfb\x17\x99\xfc\x45\xbc\x39\x99\xbc\x0d\x26\x87\xde\xcf\xde\xce\xeb\x64\xbd\xee\x0b\x93\x31\x3c\x9c\xe4\x8e\xeb\x1d\xb6\xe2\xa8\x2a\x60\x3c\x90\xdf\x8e\xde\xd7\x6d\x13\x85\x59\xa9\xa2\x7d\x75\xb9\xf9\x21\x49\x01\x7b\xb2\x00\xfa\x7d\xf3\x23\x00\x36\xb6\xf6\x36\xe8\xc1\xf6\xca\x1f\x02\xb7\x65\xa8\x6f\x77\x69\xdc\x15\xd0\x7c\x4e\x0c\xc2\xdf\x63\xfc\xdb\x99\x93\xe1\x30\xc4\x8c\x1d\x19\x0e\x83\xef\xf1\xcf\xc3\xa1\x73\x84\x29\xbf\xf9\x88\x7e\xc6\x63\xe9\x14\x1a\xf8\xa7\xc1\x0f\x47\x09\x84\x16\x3f\x7c\xf1\xad\xed\x1a\xbe\x24\x8c\x39\x16\x77\xf1\x69\xf4\xa1\x28\x6a\x37\x1c\x95\x74\x4e\xd2\x3c\xcd\x93\xa3\x56\x04\x69\xe9\x61\x79\x3a\x71\x0a\x82\x4f\x71\x88\x7a\x00\xe0\xd0\xf5\x9c\x53\x7c\xda\x57\x83\xfa\x4a\x0b\xa2\xd9\xa0\x79\x6c\x8b\xde\xfe\xe5\x15\x2b\xba\x5e\x47\xdf\xd3\xfb\xc6\xb9\x79\x43\xd6\x6b\x67\x46\x26\xef\x82\xe1\xf0\x8b\x13\xa2\x43\xd7\x3b\x84\xdb\xad\x27\xce\x21\x0f\x08\xe8\x25\xc1\x7a\xed\x24\xec\x14\x45\x3f\x53\xe7\xc2\x75\x05\xd7\xc9\xb9\x08\xc3\x78\xb1\x31\x22\xcd\xba\x77\x0c\xf5\x0e\xd1\x60\x67\xec\xea\x41\x40\x15\xb2\xbe\x0b\xb1\xe3\xfc\x42\x1d\x77\xff\x38\x71\x0f\x0e\x61\x97\x3c\xd6\xe3\x4c\xf2\xe5\x24\x78\x2c\xee\xa9\x6a\x32\xc7\xa9\x2b\x0f\xf3\x10\x9f\xa2\x08\x17\x44\x0b\x50\x2e\x26\x28\xfa\xea\x04\x35\x1e\x9b\x8a\x45\x3d\xe5\xac\xee\x53\x83\x85\x8b\x20\xe0\x62\x17\x05\xee\x60\x75\x7b\x6a\x70\xe3\x04\xa5\x78\x74\x06\xa4\x20\x6e\x41\x30\xed\x7b\xa5\x77\xc9\x29\xda\x0a\x5c\x07\x7b\xea\xde\x9d\xe2\xd0\xef\x47\x1a\xff\x21\xe3\xeb\xc3\xcf\xbe\x41\x6e\x85\x15\xf5\xed\x11\x75\xdd\x65\x0c\x7e\x41\xeb\x35\xfd\x9e\xb8\x04\x2e\x6f\x47\xbe\x1a\xbb\x60\x5e\x71\x04\x21\xf1\xbb\x40\x36\x21\x5e\x10\x4d\xf6\x66\x9b\x39\x98\x9c\x06\x7b\x7b\xde\x69\x80\xc7\xfe\x82\xe0\xc0\x3f\x0b\x30\x31\x02\x55\xba\x77\x27\xce\x18\xe9\x39\x5f\x4f\x38\x25\x9c\x06\x82\x07\x7f\xd3\x04\xff\x5b\x90\xe1\x90\x11\xe2\xb3\x40\x92\xb1\xf5\xfa\x2c\xf8\x1e\x33\x16\x72\xe7\x2c\xf4\xdd\x2f\xce\x82\xa0\xb3\xc0\x45\xda\x4b\x53\xd6\x98\xed\x8c\x43\x75\xb8\x2f\xc8\x7a\xdd\xd9\x30\xfe\x54\xa0\xef\x19\x28\x18\x61\xcc\x69\xec\xbc\x0f\xdc\x7a\x5a\x16\x37\x16\xc1\xef\x43\xf4\x9e\xf3\x6b\xe8\x3d\x83\x87\x88\xaf\xe5\xb5\x05\x6d\xfb\xdd\x1b\x21\x84\x69\x71\x23\xde\x80\x10\x96\xc6\x4e\xf8\x3d\x7e\xeb\xb8\x4d\xe6\xf6\x38\xcd\xd3\x6a\xca\xef\x83\xaa\x7d\x31\x71\xcc\x0a\xe9\x04\xb5\x8d\x3a\x04\x0e\x5c\xad\xef\x7b\x29\xc2\x09\x37\x01\xe4\xea\x1e\xbb\xb3\x1d\xd0\x00\x20\x09\xb2\xd1\x1e\x1e\xfa\x3f\x34\xbc\x85\xe3\x4e\x5a\x6d\x23\xef\x2b\xd0\x5d\x98\x61\xed\xb0\x5d\x38\x06\xdf\xc0\xa4\xa9\x60\xbd\x9e\x06\xa3\x3a\x9d\xd3\x0f\x12\x94\xe3\xfe\xf0\x26\x99\xec\x1c\x7a\x67\xe0\x58\xad\xde\xbe\x66\x48\xa9\x10\x85\xaf\x66\x73\x8d\xc7\x5f\x6c\x1f\xcd\xd8\x7f\xcf\x90\xea\x3d\x20\xd5\xfb\x10\x13\x2e\xe5\xd6\x18\x5c\x4b\xd0\x2f\x01\x06\x27\x00\x74\x4c\x71\xdd\xbd\xa0\x99\x99\x85\xf4\xb6\x46\xf3\x04\xd7\xa3\xae\xf3\x01\x7a\x43\x31\x04\x9f\xaa\xd1\x2f\x01\x5a\xa2\x95\x8b\x6e\xf0\x1b\x3a\x52\x31\x52\x50\x9e\xa8\xe7\xe6\xca\x31\x2a\x12\x1c\xc9\xd7\xdc\x91\x7e\x2b\xd2\x1f\xd4\x18\x2e\x81\xcc\xf8\x31\x7b\xc3\x3a\xee\x77\xf8\x45\x3f\x51\x55\xa7\x3c\x7b\xd1\xaa\x79\x41\x3a\x03\xa2\x93\xa6\x21\x74\xff\xb2\x69\xd3\xb8\x91\xa1\x1f\x9b\x52\xe5\x41\x84\x6e\x75\x70\xb2\xf0\x17\x8a\xc9\x28\x2f\x6e\xd0\xcf\x60\x75\x17\xc4\xe7\x35\x8d\x69\x59\xd2\x48\xa6\x35\x44\xaf\x93\xde\xb0\x3c\xd7\x49\x73\xed\x56\xc9\xb7\xe8\x4b\x02\x5e\x42\x15\xad\x5f\xc6\x35\x95\xa5\xc7\x09\x66\x07\x1e\x7a\x17\xe2\xc7\xe8\x2f\x76\xb2\x81\xfc\x8c\x8e\x38\xe2\x6a\x5c\x09\xfa\x2c\xe8\x01\xff\x93\x0b\x75\xb1\x50\x28\x2b\xf5\x71\x0c\xe4\xe2\x2d\xff\x17\xb4\x1e\x85\xa8\x39\xe5\x7f\x80\x3e\x21\xc0\x63\xb4\x10\x55\x67\x01\x1e\x23\x20\x46\x82\xdc\x48\xe2\x23\x08\x15\x9a\x41\xf3\x77\x50\x77\x94\xe0\xc3\xa3\x27\x88\x51\x2d\xf4\x26\xc1\x87\x9a\xd7\xf6\x62\x59\x53\x48\xd8\xd7\xa0\xab\x97\x23\x51\xd1\x94\x1d\x17\x25\x24\xa4\xf4\x56\x68\x20\x27\x17\x1c\x2b\x97\x28\x60\x42\x05\x15\xee\x6e\x6d\xcf\x3f\x7e\xba\xcf\x88\x3f\x03\x3a\xd7\xce\x9b\x0e\xb7\xa0\xb3\xd5\x9d\x33\x23\x38\x74\xd7\x6b\xc6\xcb\x28\xb6\x65\xb3\x41\xcb\x7c\x2b\x74\x60\x7f\x67\x64\x38\xdc\x79\x17\xb8\x77\xef\x82\x0e\xf8\x06\x3a\x4c\x82\xd2\x4d\xb2\x1a\x14\x67\xcb\x6a\xca\x90\xa0\xc7\x1f\xcd\x18\xad\x88\xe4\x19\xe2\xbf\x88\xff\x17\xc1\x87\x2a\x7f\x7a\x84\x89\xa3\x45\x00\x10\x5d\xfd\x45\x70\xb8\x91\xe6\x27\x15\x48\x4e\x55\xcf\x08\x0e\x10\x3f\x05\x0e\x5f\x34\x06\x50\xa4\x7f\x73\x24\x70\xb6\xef\x93\xf9\x00\xf9\x50\x72\xc7\xdd\xf6\xc1\x7f\x11\x1c\x98\x97\xb8\x66\xbd\xfe\x6b\x33\x10\x6a\x5b\x71\x3f\x78\x38\x71\x8d\xfd\xd6\x1d\xd9\xcc\x8b\x10\x3e\xc1\x60\x07\x56\x57\xb2\xfa\x11\x0a\x72\x2c\x6e\x45\x29\xb8\x3c\xaf\xe3\x94\xc2\x4e\x10\xe1\xb7\x39\x81\xe9\xce\x51\x4f\x94\x73\x14\x69\x5c\xe4\xc2\x56\xb2\x2f\x82\xe4\xed\x65\x19\x19\x15\x5e\xda\x42\xaf\xbd\x31\x6a\xeb\xbb\xbc\x9d\x43\xa4\x1f\x3e\x22\xb3\xaa\xf0\x30\x83\x07\xf3\x7e\xb4\x48\xa0\xcd\xbd\x0a\xbc\x00\x75\xd8\x22\xae\x2d\x53\xd2\xb4\x71\x7b\x55\xe6\x89\xec\xfd\x7c\xb8\xbb\xac\xb2\x44\x8a\x2f\x06\x2e\x02\xdc\xf7\xfb\x73\xc9\x82\x12\xc8\x0f\x3c\xae\x18\x63\xd2\xfc\x70\xf8\x58\xfa\xd5\xeb\x57\x44\x9f\x8f\x6d\x57\x69\x38\x9f\xec\x88\xb8\xb4\x22\x68\x2d\x75\xa6\xae\x7b\x07\x31\x60\x95\xfe\x6c\x5b\xbe\x54\x5a\x26\x66\xbe\x54\xb1\x5f\x82\x8d\x33\xc5\x53\x4d\x00\x34\x7a\x3f\xb4\xdd\x8d\x09\x5f\xcc\xf1\x26\xc4\x53\xea\x84\xee\x24\xa3\x4e\x88\xa6\xae\x37\x95\xc6\xfb\x57\xcd\xd5\x21\xd1\x76\xa2\x7e\xe1\xd0\x6b\x07\xe3\x83\xb8\x1c\xa5\x1f\x34\xc9\x75\x03\x8e\xf5\x81\x5f\x0a\x27\x6e\x62\x26\x40\xfd\xcf\xa6\x43\x9d\x44\x8e\xeb\x81\x72\xe9\x35\x75\x92\x4e\x02\xdf\xd2\x4c\xe0\x7b\x27\x82\x36\x79\x64\xd3\xe4\xf1\x0d\xb6\xa7\x57\x1e\xdc\x9f\xc8\x37\x76\x12\x54\xba\x9b\x36\xdd\x26\x23\xb3\xa0\x4b\x7b\xc9\xa8\x5d\xd4\xa1\x55\x64\xd4\x2a\xd1\x08\x2d\x19\xa9\xdf\x48\x51\x12\xb6\x0b\x7a\xfd\x6c\x08\x26\x3a\x5e\xef\xc8\x80\x02\xba\x7a\x54\xb9\x18\x72\xff\xe7\x1e\x47\xc3\x50\x55\xea\x69\xda\x0c\xf7\x3f\xab\xd3\x62\xb3\x61\xdb\x3c\x32\x1c\x91\x82\x4e\xd1\x6f\x69\x3d\x7d\x57\xbc\x87\x44\x87\x55\x6b\xe8\xd9\xc3\xe8\x2a\x4a\xf3\xbf\x28\x6c\x9b\xe2\x35\xbd\xbe\x28\x8a\xac\x4b\xed\xb9\x3f\x4a\x1e\xc1\x16\xfe\x71\xa5\x8f\x40\x76\xb0\xa2\x0e\xa4\x88\x1f\x10\x74\xd7\x1e\xe5\x8f\x2b\x7e\x6c\xf7\xb8\x30\xb1\x33\x80\x7f\x69\x0f\xec\xbe\x17\xc2\x49\xe8\x10\x91\x92\x62\xe3\x4a\x4f\xe9\x2c\x96\xc9\xda\xe2\x92\xd2\x2f\xd4\xb9\x93\xf3\x3b\x8b\x37\x2e\x9a\xc7\x38\x8b\x87\xc3\x59\xbc\x5e\x67\x31\xca\x63\x3c\x8f\x2f\x6d\xd1\xc2\xbe\x9a\x18\x4f\xde\x3c\x46\x45\xdc\x13\x7a\x7b\x41\xcb\xb8\x28\xe7\x6c\x60\xfd\x21\xf0\xb4\x06\xc0\x04\x2e\xa4\x6b\x86\xbf\x88\x71\x11\x4f\xba\xfe\xcd\xad\x37\x1c\x77\xd3\xe3\x04\xfd\x9a\xd4\xb2\x16\xa8\xe7\x67\x05\x76\x90\xc6\xce\x7c\x14\x92\xfc\x63\x45\x5f\x9f\x9d\xba\xc6\x0d\xe4\x26\x04\x40\x49\x3f\x2f\x69\x55\x9f\x44\x19\x95\x1b\x92\x2f\x6b\xc9\x4d\x1e\xa8\x8a\x19\x7f\x56\xc3\xbf\xcb\x18\x8f\xd1\x75\x8c\x9f\x3c\x41\x37\xf0\xef\x6d\xec\xdf\xc2\xf0\xef\x0c\xd9\xa4\x67\xa0\xcb\x78\xbf\xfb\x41\x1b\xef\x21\xef\x69\xdf\xc8\x3f\x72\x15\x63\x5b\x12\x74\x6d\xdc\xdf\xd8\x7b\xa7\xa4\x9e\x8e\x4a\x92\x47\xc5\xdc\x71\x55\x46\x3e\xe7\xc9\x33\x77\x54\x65\x69\x48\x9d\xc7\xae\x7f\x93\xe6\x51\x71\x33\x22\x51\x74\x74\x4d\xf3\xfa\x2d\xdc\x8a\xa4\xa5\x63\xcf\x69\x55\x91\x84\xda\xc8\xd8\x2a\xa3\x0a\xcc\x07\x18\x63\xfe\xe2\x70\x48\x46\x11\xa9\x09\xc6\x78\x15\x0f\x87\x0e\x9f\x1f\x82\xcb\x18\xc9\x29\xcb\x35\x97\xfd\xdb\xd8\x75\x37\x10\x33\x95\x8d\xfc\x4b\x6c\x24\x49\x84\x59\x95\xbe\x68\xfb\xcb\x78\xef\x26\xf6\x83\xef\x6f\xe2\xe1\xf0\x3a\xfe\xfe\x26\x9e\x38\x2f\x7e\xe0\x06\xe2\x17\x2e\x9b\xf0\xe0\xfb\xeb\x78\x72\x1d\x7b\x81\xeb\x5d\xc7\x38\xf0\x97\x31\x26\xec\x95\x2a\x5e\xaf\x61\x1c\x63\x34\x10\x5f\xb7\x28\xaa\xfa\x94\x7f\x8f\xb3\x8a\x91\xfd\xc8\x76\xdd\x8d\xff\xd9\xec\xbe\x8c\x31\xf1\x6b\xf6\x72\x0d\x2f\x0b\x5c\x78\x99\xa7\x73\xce\xff\x94\x64\x4e\x9d\x2f\xb1\xab\x28\xc5\x78\xc3\xcf\xb3\xcf\x31\xee\x41\x1c\x5f\xd6\xe9\x9d\x30\xf1\x2b\x9d\xd3\x62\x59\x3b\xda\xea\x12\xe7\xab\x2b\x7f\x92\x33\x56\xa6\x5e\x6d\x36\x5a\x54\xfc\xf1\xc6\x1f\xb0\xf9\x7a\x19\xe3\x83\xff\x75\xe9\xbd\xdc\xff\xfd\x13\xd9\xff\xf2\xc7\x72\x3c\x7e\x35\xde\x67\x7f\x5e\x3f\x83\x7f\x5f\xc0\xc3\x31\x3c\x1c\xc3\xc3\xe3\xe3\xe3\x3f\x96\xe3\x27\xcf\xa1\xd9\x93\xe7\xaf\xe1\xdf\xe3\xfd\x3f\x96\x87\xc7\xac\xe6\xf1\x78\xfc\x6a\x1f\xfe\xbc\x66\xff\x42\xb3\xc7\x87\x2f\x58\xcd\xab\x31\x3c\x1c\x1f\x1d\xff\xb1\x7c\x32\x1e\x1f\xee\xff\xb1\x7c\xfd\x9c\xbd\x73\xfc\x1d\xd4\x1c\xbf\x7e\xc5\x1e\x5e\x1f\xc3\xc3\xf1\xf1\xeb\xab\xff\xbf\x0e\xec\x8f\xfd\xd1\x78\xff\x3b\xd6\xf5\x8f\xcf\x59\x37\x63\xde\xe7\x33\xe8\xe6\xc9\x31\x74\xf3\x74\x7c\xf5\xe8\x9b\x03\xf4\x63\x8c\xef\x36\xe8\x15\x5c\x32\x51\x4c\xf9\x6b\xe9\x80\xf0\x2a\x1e\x4d\x49\x75\x76\x93\xbf\x2f\x8b\x05\x2d\xeb\x95\x43\xa4\x5d\x90\xeb\x8a\x7e\xbc\xa7\x01\x98\xee\x5f\xc6\xa3\x9a\x56\x75\x53\x6c\xbd\x8a\x2f\xc9\x15\x13\x6a\x7e\x94\x3f\x94\xaf\x75\x23\x25\x1c\xc5\x66\x76\xde\x25\x13\xd2\x40\xc9\x37\x1c\xd6\x04\x2e\x2a\x35\x8a\x59\x79\x01\xfa\x94\xd6\xd3\x22\xf2\xe9\x84\x27\x1c\x12\x2e\x62\xe1\x7a\x1d\xb1\x41\xfe\x58\x14\x19\x25\xf9\xaf\x24\x5b\x32\x66\x49\x16\xbf\x5b\xce\x69\x99\x86\xa2\x38\xad\xde\x91\x77\x90\xcf\x06\x2a\xdf\x17\x55\x5a\xa7\xd7\xd4\x6c\x74\xf8\x83\x7c\xf9\xec\x9a\x96\x59\x41\x22\x1a\xb5\xa0\x1f\xc2\xc5\xfd\x63\x1e\xb0\xc2\x63\x43\xac\xea\x8f\x15\x95\xb3\x34\x21\x97\x3c\xee\x03\x7b\x78\x47\xe6\xf4\x0a\x87\x9e\x13\xe0\x68\x44\xea\xba\x4c\x83\x65\x0d\xd6\x46\x04\x79\xe6\x8d\xa2\x6a\x41\x42\xea\xf2\x0c\x97\x2f\x55\xc5\x39\x5c\x37\xb1\xed\xbd\x90\x75\xd6\xfa\xd8\xaf\x8d\x75\x0c\x63\x35\x21\x3a\x90\xa1\xd4\xeb\x29\xdc\x0b\xa5\xf2\xed\x0d\x5f\x23\xb1\x1c\x93\x90\x5f\xf6\xd2\x16\xf1\x8d\x5a\xc4\xd7\x31\xc4\x8f\x11\x06\x10\xd6\x19\xbf\xc6\xad\x81\xde\xde\x59\x63\x06\x88\x75\x81\x8b\xa3\x44\x38\x71\x02\x1c\xb6\x50\xc0\x9d\x40\x0c\x0c\x1e\x1c\xd0\x0b\x7b\x66\x3f\x6c\xcf\x7e\x7b\xd2\x26\x3b\x87\x9e\x6d\x7b\xdd\x81\x86\xe6\x7a\xb8\x3d\x4d\x02\x7d\x12\x7e\x8a\xcd\x78\xe6\x3c\x2d\x49\x04\x77\xe6\x68\x38\xa3\x91\x24\x79\x2f\x9d\x3b\x76\x56\x4b\x41\xbc\xaa\xe9\x42\xfe\x9e\xa7\xb9\xfa\x49\x6e\xc5\xcf\x0d\x0a\x90\xe4\x70\x5e\x71\x50\x2a\x1b\x30\x2f\x85\x0f\x91\x65\xd0\xaf\x08\x1b\x1c\x4e\x18\x13\xfc\xe9\xa6\x24\x8b\x05\x2d\x81\xb7\x1f\xa5\x3c\xfc\xdb\xaf\x3c\x25\x9c\x80\xc7\x9b\x47\x93\x68\x5b\x73\xd1\xf1\x46\x57\x8c\xb7\x3e\x58\x1f\x8c\xdf\x02\x83\xef\x4c\x38\xa2\x43\x35\x37\x13\xf5\xcb\x53\x80\x44\x53\xa4\x0f\x58\xbd\x07\x5f\x39\x11\x7f\x85\xe0\x5d\x16\x59\x46\x23\xcf\x06\x48\x41\x71\x6b\xf3\x60\x0c\xab\x05\x5d\xaf\xed\x92\x44\x69\xd1\x94\x4c\x5a\x03\x30\x01\xeb\x7a\x8c\x9f\x5b\x9f\x29\x57\x53\xcc\xf0\x70\x08\x24\xcc\x16\xc5\x36\x0a\xd7\x6b\xc6\x1d\x28\x14\xd0\xaf\xf1\x0a\x9b\x46\x38\x1c\xda\x36\xc8\x70\xd0\xc2\x15\x7f\xb1\x3d\xb6\x95\x81\x46\xcb\xa7\x10\x88\x44\x2c\x10\xbf\x62\x41\xca\x8a\x1e\x67\x05\xa9\x1d\xf9\xfa\x7a\x3d\x46\xe1\x0e\x0e\xd6\xeb\x10\x7c\x68\x44\x39\xeb\x50\x41\xb6\xf7\x42\x79\x2d\x42\x54\x42\x19\x68\xe0\x9b\x26\xc2\xe3\x85\xef\x5e\x31\xfe\x26\x34\x95\xbe\xc0\xc0\x35\x69\xcf\x1c\x5e\xbb\x8d\x63\x36\xea\x36\x91\xbe\xc5\x6a\x5a\x3b\xbd\xbd\x92\xe5\x0d\x2c\x51\x84\x77\x76\xda\xad\xf4\xfd\xf8\x4b\xdc\xbe\x09\x0c\x93\x08\xd2\x9a\x5d\x2d\x83\x79\x5a\xdb\xdc\xe1\xc4\x06\x85\xab\xad\xdf\x2e\xb5\xc3\x22\x2b\x4a\x59\xcf\xe4\x4a\xfd\x37\xe3\x74\xda\xcf\xfb\x59\x11\x92\x4c\x96\xce\x8b\xbc\x9e\xca\x07\xbd\xf9\x0d\xa5\x33\x46\x6d\xe4\x9c\xfb\xf2\xa7\x39\x53\x2d\xef\xe6\xa6\x11\x47\xcf\x00\x13\xc8\x22\xe1\xdb\x36\x77\x9b\x72\xf8\x33\xb6\x6d\xd7\xef\xce\x53\xbb\xe4\x21\x4d\xda\x90\x03\xdd\x1a\x1b\x37\x9a\x41\xf6\x09\x64\x24\x15\x5c\xca\x8b\x99\x18\x4c\x37\x5f\x64\xb2\x5e\x77\x43\x96\x91\xe1\x50\xa2\xba\x56\xb8\x5e\x3b\xc1\x1e\x26\x1a\xa3\x18\x68\x4b\x7b\x2a\x96\x96\xe0\x97\xce\x9d\xca\x3a\xa4\xa8\x25\xf0\x0f\x01\x7e\x1b\xcb\x30\xa2\x25\xcd\x5d\x97\xa8\xdf\xcd\xbd\x1c\xcd\xf6\xf7\x2e\x6e\xf2\x48\x10\x4c\x46\xc5\x82\x15\x43\xe8\xc5\xc0\xbd\x0b\x80\x6d\x52\xd1\x1a\xc6\x3e\xfd\x3e\x94\xf9\xd4\xe8\xde\x9e\x1b\x5c\xda\xdf\xd8\x7b\xe1\x25\xbd\x02\x46\x87\xdf\x7a\x19\xfb\xe1\xf7\x44\xb6\x0a\xf7\xf6\x20\xfc\x6f\x8b\x8b\x62\xaf\x91\xcb\xf0\x4a\x6c\x65\x04\xbf\x2b\x9a\xd1\xb0\xa6\x11\x8f\x28\xe9\x18\x65\x98\xba\x88\x0e\x87\x91\x2c\x17\xcb\x76\x2e\xab\x77\xc6\x22\x5c\x60\xc8\x53\xc0\x0b\x23\x22\x1b\x11\x1f\x37\xd1\xc7\x0d\xb7\x82\x2e\xa9\xe8\x9e\xc7\x9a\x85\xe7\xaa\x81\xe7\xf3\xbe\x68\x6f\x5f\xf2\x12\x96\xf4\xe0\x5b\xaf\x79\xcb\xb4\x22\x41\x46\x23\xb6\x8e\x98\x95\xb8\x9b\xc6\xc7\xcf\x09\x74\xf0\xae\x4e\x6c\xcf\xfa\x0e\xd1\xad\x87\xc9\xaf\xad\xa3\xce\xa4\x2d\xe8\x86\x54\xa7\xcb\xac\x4e\x17\x19\xf5\x18\xad\x98\x8b\x07\xcd\xe1\xe0\x7d\xac\xa7\xb6\x08\x46\x11\xc9\x13\x5a\x16\xcb\x2a\x5b\x9d\xd3\xfa\x24\xcf\x69\xf9\xd3\xc5\xe9\xdb\xc9\x6b\xc7\xfe\xee\xb0\x73\xe1\x1a\x74\x20\x01\xba\xbb\xd6\xcf\xdf\xbe\x33\x59\xe1\xa8\x6d\xef\xdd\x77\x1e\xeb\xc7\xeb\x3f\xb6\xf0\x13\xa1\x50\x3c\xca\x88\xc2\xc6\x27\xab\xa8\x47\x25\xcd\x85\xd8\x1a\x28\x27\x6e\x08\x30\xf5\x5d\x13\xa8\x01\xbd\x2c\x4b\xb2\x1a\xa5\x15\xfc\xe5\x8c\xdb\xe1\x0f\x38\x10\x08\xa2\x69\x48\xbf\x7b\x62\x43\x32\xf5\xcb\xf1\x95\x8b\x00\xb1\x54\x3c\x30\x3e\x0c\xdb\x76\xd9\xd0\xdc\xaf\x2c\x95\x6d\xef\x45\xfa\x72\x7f\xe8\x5d\x6e\x75\xb2\x3a\x1c\x87\xd9\xe1\x26\x49\x9f\x76\x60\x85\xcd\xe1\x71\xff\xa9\x13\xba\xd2\xf8\xfe\xb5\x96\xad\xc3\xa9\x59\x8c\xf3\x58\x0f\x1e\x50\x6b\x17\x6b\x21\xa2\xd4\x3d\x4b\xaa\x0d\x58\x78\x19\x5f\xc4\xf8\x6e\x5a\xcf\x33\xcf\x9e\xd6\xf5\xc2\x3b\x38\xb8\xb9\xb9\x19\xdd\x3c\x19\x15\x65\x72\x70\xf8\xdd\x77\xdf\x1d\xdc\xb2\x5a\x1b\xcd\x49\x3d\xdd\xda\xea\xc5\xc1\x29\xa9\xa7\xf0\xcf\xe9\x5b\x1b\x55\xd7\x49\x5f\xc3\xc7\xe3\xf1\xf8\xa0\xba\x4e\x6c\x3d\xb0\xc0\x47\xf8\x16\xa9\xc9\x54\x27\xe2\x75\x62\x0b\xfd\xe4\x7d\x80\xc4\xf1\xc8\xc6\x76\x4f\xf3\xce\x00\x5b\x1a\xd0\xfb\xbf\x5c\xdb\x9f\xbf\xc6\x86\xa3\x5a\x73\x8e\xdc\x0b\x00\x74\x9f\x1f\x19\xe1\xbe\x77\x52\x78\x2c\x00\x3b\x2e\x4a\x9a\x26\xf9\x99\x52\x01\x06\x93\xfb\xc1\x7b\x64\x03\x3a\x8b\xdf\xd4\x6d\xac\x7f\xb6\xf4\x30\xfc\x23\x9b\xe4\x51\xcd\xc9\x76\x7a\xfe\x72\xb1\x18\x0e\xe1\xcf\x88\xde\xd2\xf0\x63\x5e\x91\x98\xbe\x65\xcc\xc3\xb1\x00\xd1\xe8\x0e\x55\x36\xa7\x7b\xdb\x3b\x5d\x5d\x0b\x51\xaf\x6e\xdc\x8d\x47\x36\x8e\x69\xc9\x62\x54\x1f\x8e\x75\x90\x32\x3f\x7e\x38\xd9\xc1\xf8\x22\x1e\x55\xd7\xc9\x7a\x6d\xa7\x92\xea\xd9\x69\x6e\x11\x97\x8c\x54\x01\xe6\x01\x90\xee\x7e\x8b\xf1\x6f\xf1\x7a\x1d\x15\xe1\x72\x4e\xf3\x5a\xc4\xa1\x3e\xe2\x36\x03\xc7\x8e\xd2\x6b\xdb\xf5\x7f\x8b\xb5\x17\xed\x3f\x6e\x9f\x84\xd5\x75\xf2\xc7\xed\x13\x6a\xef\x05\x7b\xf0\x7c\x20\x0b\xe0\x74\x0a\xf0\x6f\x31\xbf\x3d\x02\xcc\x84\x4f\xf4\x07\x97\xe8\xf1\xc0\x1c\xbd\x8e\xdb\x8d\x64\x98\x6f\xd5\x5c\x8b\x4b\xe6\xe8\x75\xee\x66\xe3\xa2\xff\x8e\xf1\xc1\xa5\xbd\x3b\xfc\xfe\x87\xab\x03\x6d\x67\xfc\x1e\xab\xe9\x09\x74\x5d\xb8\x82\x9b\xc6\x8e\xf0\x24\xe2\x97\x66\x5e\xf1\x70\xe5\x4f\xb8\xaf\x5f\x11\xd1\x0b\xce\x63\xc2\x6f\x41\x52\xe4\x09\xb9\x31\xe8\x06\x0e\x36\x03\x4d\x9b\x3b\x1c\x3a\xb6\x56\xcb\x66\x5e\xcd\xae\xfc\x21\xe6\x77\xbd\x76\x7e\x8f\x71\x67\x3d\xb9\x37\xa3\x1a\x03\x31\x86\xa0\x22\xc6\x06\x5c\xf2\xfd\x7a\xfa\xf6\x00\x88\x3c\x7f\x51\xfc\xe6\xf3\xf1\xdf\x31\xa0\xa1\xd0\xd2\x28\xbd\x8d\x6d\x23\x8a\x62\x3c\x16\x8c\x46\xc8\x53\x9f\xfa\xf4\xfb\xc0\x60\x37\x14\x33\x1e\x4e\x49\xf9\xaa\x88\xe8\xcb\xda\xa1\xae\xcc\x97\xf4\xd4\x0b\x19\xa6\x3c\x7e\xf6\x79\x59\xd4\xbe\x6d\x5c\x59\x78\x21\xeb\xc8\x7c\xd1\xaa\xfa\x4e\x56\xfd\x8f\xdb\xc7\xcf\xcd\xba\x67\x63\x59\x97\xb5\x00\x3e\x7b\x2c\x6b\x92\xa6\x46\x52\xa9\x26\xd4\xab\x60\xc1\xa2\x3d\x1c\x8c\xaa\x65\xc0\xd9\x57\x27\x46\xd4\x75\xfd\x18\xd3\xbd\x43\x3f\xda\xc3\xe1\x26\xc0\xd0\x72\x12\xed\xb5\x9b\x79\xd1\x66\xf3\xcf\x58\xe4\x75\x73\x5d\xae\xed\xfc\x26\xc6\xbf\xc7\x88\x24\xf8\x8e\x48\xdd\xec\x49\x4d\xb9\x3d\xee\x55\xb1\xcc\x6b\x6f\x67\x8c\x82\xa2\x8c\x68\x79\x32\x27\x09\x3d\x5b\xd6\x15\x6d\x17\x9e\x67\x69\x48\x5b\x65\xbf\xa5\x51\x3d\xe5\x65\xb7\xc7\x19\xbd\xd5\x7e\xbe\x29\x8b\xe5\x42\x3c\x9f\x95\x51\x9a\x93\x4c\x15\x85\x45\xb6\x9c\x37\x3d\xf3\xc7\x8a\xfd\x8c\x05\x90\x98\x43\xb8\x91\xbf\xa5\xc2\x4c\x3e\x9f\x4f\xcb\x34\x9f\xc9\xa7\x77\x34\x21\x7a\xed\x19\x1b\x20\x7b\x48\xca\x34\xfa\xc0\xa1\x88\x9f\x47\x79\xa4\x3d\x9d\x2f\x48\xae\x3f\xd6\xa4\xac\xe5\xf3\x2b\x18\x95\xf9\xa4\xbd\xcd\x0b\x74\x00\xa2\x44\xc2\x88\x8b\xbc\xfe\x8d\xa6\xc9\x14\x9e\xb2\x34\xa7\xaf\x32\x32\x5f\xc8\x87\x9f\x54\x55\xb1\x20\x61\x5a\xaf\xe0\xa7\x1c\x78\x51\x2e\xa6\x84\x4f\x49\x4d\x82\xf3\xf4\x0b\x7c\xdb\x4d\x1a\x15\x37\x50\xf8\xe5\x84\xe1\x3b\xfc\x2a\x8a\x39\x74\x97\x66\xd9\x59\x03\x69\x10\x67\x45\x11\x69\x05\x55\x5d\x2c\x8c\xc7\xb2\x98\xd1\xd7\xa4\x9a\x12\xc6\x8d\x99\x45\x45\x1c\x8b\xf5\xe7\x65\xa7\x69\x4d\xcb\x2c\x05\x0f\x01\x59\xd6\x81\x25\x71\x61\x83\x82\x04\x5f\xda\xbf\xd1\x60\x96\xd6\x36\xb2\xe7\x95\x8d\xec\xd3\xe2\x8b\x8d\xec\x33\xfb\xca\x17\xa6\xb4\x19\x5d\x55\x0e\x49\xdc\x6e\x4e\x5b\xe2\xde\x05\x49\x6f\xaa\xdb\x00\x07\x7b\x04\xb6\xf2\xcb\xda\x19\xbb\xa3\xba\xf8\xc8\x98\xa0\x57\xa4\xa2\x8e\xbb\x47\xb4\x9d\x70\xe8\xfa\x24\xb9\x0c\xae\x30\x49\x2e\xc9\x15\x18\x00\xb4\xc4\x85\x89\x14\xe7\xc8\xa8\xaa\x57\x59\x73\x93\x33\xb4\xd2\xdc\x82\x0c\xa3\x1d\xc1\x29\x54\x8e\x8b\xa0\x51\xe1\xf4\xe6\x2c\x76\xec\xfd\x7d\xdb\x95\x79\xfc\x44\x48\x8f\xe0\x32\xbc\xf2\xa9\xb8\x3b\x1a\xaf\xd7\x3d\x64\x90\x95\xda\x70\xb1\xd4\xb6\x3d\x2d\x13\xfd\x8e\xde\x42\xdc\x16\x25\x49\x7b\x30\xd4\x1d\x0e\x49\x72\x49\xaf\x26\x8e\x6d\xef\xc5\xee\xa8\x2e\xd3\xb9\xe3\x7a\xf1\x9e\xbd\xb8\xb5\x7d\x3b\xce\x0a\x02\xac\x85\x60\x6a\xc3\xaa\x02\x15\x8e\xed\xfa\x11\x57\xc8\x36\xdf\xc5\x68\x06\x93\xec\x30\xe5\xd6\xce\x28\x61\x52\xee\x9c\xe6\xcb\xb4\xa6\x73\x58\xcf\x3b\x52\x52\x02\x5b\x99\x54\x9c\x02\x94\x62\xdb\xb2\x3f\x74\x1e\x50\xd8\x15\x53\x28\x4d\xe7\x09\xfc\xc9\x17\x4b\xc0\x96\x19\x5d\x25\x34\x17\x58\x0f\x3b\x76\x4e\x6b\x80\xb6\x20\x25\x01\xd4\xe5\x16\x32\xc0\xf5\x92\x84\xd0\xe6\x06\xba\x30\x96\x8d\x26\x2a\x46\x06\xa3\x90\x6c\x61\x95\xa8\x11\x68\x89\x4b\x1f\x20\x5b\x1d\x3e\x79\x6e\x23\x82\x42\xc7\x55\xa9\x5e\xd0\x57\x5e\xeb\xe9\x8a\x41\xd2\xc2\xe7\xa2\xae\x55\xf7\x1e\x68\xf6\xa7\x4f\xc0\xdc\x31\x84\xdb\x3a\xd4\x46\x22\x7a\x76\x68\xbb\xcd\x18\x01\x6b\x87\x43\xd9\xe1\x8e\xd6\x21\x54\xc1\xc8\x1e\xdb\xc6\x07\x6a\x62\x50\x9c\xa8\x63\x7c\xff\x10\xce\xf1\x06\x9b\x6d\x69\x4f\xe9\x66\x5d\x0d\x46\x69\xe5\xb7\xf9\x78\x92\xe7\x05\x57\x91\xef\xdf\xce\x95\x3e\x0a\xd4\x59\xfb\x8b\xb2\x88\xd3\x4c\xe9\xa2\x18\x41\xdc\x8f\x49\xd8\x2d\xd8\xaf\xca\xb0\x5b\xb8\x2c\xd3\x6e\x21\x58\x80\xeb\x6e\x39\xe3\x2e\x95\x36\x2c\xad\xaa\x34\x4f\xf6\x93\x6c\xb5\x50\x62\x43\x37\x2a\xd2\x98\x23\x7c\x92\x30\x5e\x94\x2d\x06\x9a\x26\xf8\xc7\x51\x3d\x25\xf5\x07\x68\x51\x39\xb6\xad\x63\x60\xaa\x08\xc7\x77\x06\xf7\xb3\x5e\x1f\x1e\x1a\x05\x13\xe2\x91\x51\x71\x93\xd3\xf2\xb5\x60\xa6\x04\x37\xf3\x1a\xdc\x26\x02\xfc\x81\x5c\x06\x57\x8a\xec\x44\x78\xec\x47\x0d\xe7\x12\x31\xce\x45\x44\x53\xbc\x8c\xae\xfc\xb0\x6f\xfb\x87\x97\xf4\x6a\xbd\x76\xec\xba\x58\xfc\x36\xa5\x14\x84\x10\x3a\x59\x85\x8e\x7d\x03\x8f\xee\xe4\xa3\x56\x89\x44\x29\x22\xae\xc7\xda\xcc\x8b\x65\x45\xfb\x1b\x6a\x55\xac\xb5\x59\xf9\xfa\xec\xf4\x94\xd5\x9f\x87\x65\x91\xf1\x06\xac\x5a\x3c\xc2\x10\xaa\xc8\xd1\x8a\x90\x5d\x99\x4d\x8f\x8b\x70\x59\xd9\xfc\xde\x07\x7b\xfe\x31\x5b\x96\xfc\x45\x47\xbc\xc9\x5b\x20\x3b\xe6\x7f\x89\x8b\x44\x05\x34\x45\x76\x00\x7f\x88\x8b\xc2\x91\x28\xc4\x8c\x18\x8d\xe4\xab\x70\x89\x91\xb5\x7f\x45\xf2\x50\x4e\x8c\xc3\xbe\x3a\xe4\x05\x68\x67\xec\x0e\x87\x02\xa8\x68\x84\x54\xa5\x04\xcc\x2b\xf0\x40\x41\xcb\x8a\x8a\xea\xc0\xe0\xd9\x84\xc5\x8b\x64\x95\x82\xc4\x1e\x61\x54\x5f\xa2\xbe\xa5\xfc\xe8\x50\xf4\x25\xba\xa4\x57\xf0\xc6\x25\xbd\x12\x5a\x2a\x86\x02\x7f\x25\xf8\xae\x2e\x16\x2f\x83\xa2\xac\x3d\x9b\xb0\x3f\x36\xe2\xa3\x7b\x9f\x91\x95\xc7\x86\xbd\xc8\xc8\x4a\x2f\xbc\x98\x96\xc5\x32\x99\xaa\xba\x9a\x3f\x43\x93\xd7\x4b\xc1\xf5\x4d\x19\xc9\xf1\xec\x48\x3c\x87\xf0\x0c\x4d\x8e\xe6\x8b\x3a\xa5\x91\x67\x53\xfe\x83\x17\xe6\x61\xb9\x5a\xd4\x50\x2c\x7f\x8a\x8a\x88\x17\x46\xb2\x00\xae\x01\xda\x70\xed\x0e\x0a\xde\x82\x6d\xf0\x35\xa9\x89\x67\x73\x3b\x61\x44\x6a\xa2\x55\x9d\xd2\x9a\x44\x5a\xf5\x5c\x3c\xab\x26\x9c\xa5\x82\xda\x8a\xfd\x84\x8a\xf7\x64\x59\x51\xcf\x5e\xb0\x3f\xbc\x00\xe6\x43\x4d\x06\x7b\x4c\xf3\x84\x97\x30\x42\x06\x85\x65\x91\x94\xb4\xaa\x3c\x7b\x21\x7e\x41\xf1\x07\x52\x53\x39\x23\x25\xa9\xa9\x36\x1b\xe7\x94\xce\xd8\x07\x56\xf0\x57\x15\x01\xe4\x8a\xff\xe0\x85\x35\xe1\xd6\xa0\x8a\xff\xe0\x85\xcb\x8a\x49\x85\x9e\x5d\xf1\x1f\x50\x78\x91\xce\x45\xe2\x23\x0f\x54\xf5\xdc\x0b\x12\xaa\x7e\x65\x1c\xa4\x1a\xc9\x35\x3c\xc9\xb1\x0c\xd8\x36\x24\x69\x0d\x3d\xdf\xf0\x1f\xb6\x66\x5b\x9f\x69\xc9\x94\x43\x20\x50\x8d\x88\x38\x09\xbd\xb0\x45\x8f\x22\x8c\x71\x92\xc0\x2d\x60\x50\xd0\xb8\xa2\x64\xc2\x36\x6c\xba\xa8\xb9\x52\xc3\x21\x38\xec\x15\xb7\x11\xe9\x48\xdb\xf0\x1a\x93\xaf\xb9\xac\xad\x1e\x6d\xc4\x43\x51\x6e\x11\xa7\x5d\x8f\xe0\xfe\xb3\x66\xd2\xee\x9a\xa0\xbb\xb4\xf2\x58\xd5\xc6\xf5\x3a\x95\x0c\x50\xab\xf0\xdd\x39\x04\x27\xed\x51\xbf\x67\x89\xae\xe8\x11\x09\xe5\xd5\x74\x05\x5e\x60\x4e\x97\xab\xe5\xbe\x7a\x57\x44\xd4\x21\xfa\x79\xba\xd0\xa6\x9e\xd3\xed\x38\xe1\x31\x4f\xa5\xfc\x29\x4f\xcb\x34\x2e\xb5\x73\x4a\x1c\xdf\x82\xc6\x32\x4c\xb7\x11\x60\x39\xa3\x1d\x82\x97\x0c\x75\x21\xd2\xbe\x4e\x23\x5a\xc8\xd7\xc9\x32\x4a\x0b\x1b\xc2\x62\xc7\x8c\x71\xfd\x2b\x71\xff\xea\xb0\x8a\x31\x10\x98\x18\xfd\x95\x5c\xc6\x8c\xc0\xf8\x6d\x90\x9c\xf9\x92\x83\x38\xe2\xdb\x56\x6e\xdf\x9e\xf6\xe9\x3c\x91\x03\x48\x99\x08\xb8\xfd\xcd\xfe\xcf\x6a\xc3\x63\x07\xba\x84\x01\x97\x2d\x6c\x24\x0c\x64\x0d\x8c\x73\x6e\x3e\x43\xd2\x8e\xd6\x07\x27\xa2\x35\x49\xb3\x4a\x82\xba\x28\x92\x24\x63\xc4\xb8\x16\x3f\xfa\x3e\x85\xf1\xa8\xb6\x07\x86\xe5\x90\x55\xff\x24\x7e\x71\x10\x27\xf9\x35\xc9\x52\x36\xf8\x54\xfe\x22\xae\x3f\x48\x13\x27\x42\xb6\x24\xa1\xb6\x11\xd6\xc0\xe6\x66\x1c\xdb\x8b\xf1\xa9\x80\x65\xcc\x35\x98\x21\x6c\xef\x4c\xf5\x08\x2a\xfd\xd0\x54\xe9\x6f\xee\x1f\xc0\xbd\xfd\xd7\xf4\xb6\x66\xdc\xba\xed\xfd\x43\xf5\xf1\xfe\x01\x5f\xb5\x05\xa8\xe4\x98\x62\x1c\x6e\x28\xc3\xe9\x18\x4d\xc5\xed\xf7\x04\xc7\x88\xc7\xe0\x9e\x31\xe4\x83\x58\x65\x1d\xec\x9b\xb9\x32\x1a\x55\x72\x39\xbb\xf2\x6d\xe0\x4e\xd9\x36\x9f\x4d\x40\x0a\x9b\x32\x70\x9e\xbd\x85\xff\xe5\x0d\x9d\x29\x9e\x4e\xa6\x23\xce\x2f\x7b\x46\x3c\xaa\xe9\x70\x08\xba\x8e\xa9\xeb\x7a\xb6\x64\xcb\xf9\x5b\x5d\x92\x32\x9d\x38\xcd\xf4\x70\xdb\x11\x18\x1d\xa7\xee\x70\xf8\x0d\x87\xe2\x75\x55\x53\x53\x51\x39\xb0\xed\x3d\xd6\xa0\x5a\x2e\x16\xec\xdc\x10\x9a\xb3\xa3\x28\x05\x2f\xe8\xdf\x48\x99\x0b\x43\xe3\x6c\x38\x54\xad\x54\x7c\xbc\x56\x3d\x59\xd6\x05\xe7\x73\x78\x81\xf3\x0f\xd2\x9d\xba\x89\xfa\x48\x58\x9d\x99\xeb\xd1\x09\xb8\xbe\xcc\xd8\x50\x55\xe5\x91\x2c\x52\x21\xd4\x1a\x72\xc3\x11\xfc\x47\xc8\xd2\xf2\x4b\x0f\x42\x36\xe8\xc2\xdb\x9c\xf7\xb4\x91\x28\x2d\xcc\x24\xd2\x2e\xd2\xf2\xaa\xb1\xa1\xd8\x46\xa2\xbe\x1f\xef\x89\xb2\x89\xe1\x9d\x9d\x50\x3d\xf8\x81\x04\x2b\xed\x26\x13\x30\x8f\xea\x6d\xf8\x85\x71\x35\x08\xd3\xae\xd2\x6d\x6d\xb6\x80\x34\xf8\x26\x46\xf7\xf9\xd8\xc6\xa3\x22\x7f\x95\xa5\xe1\x0c\x8c\x28\x45\x1e\xb2\xdf\x78\xf0\xa3\x61\x32\xfc\xac\x88\x3d\xa2\x32\xfc\x9d\xee\xab\xdd\x9e\xfc\x50\x51\x95\x88\xff\x8a\xd8\x9e\xbc\xbc\xea\x9d\xe3\x50\x91\x8d\x88\xff\xea\x6b\x2c\x67\x33\xdc\x46\x3d\x22\x5e\x11\x75\x2a\x3a\xa0\x9a\xf5\x0f\x15\x99\x88\xf8\x2f\xb3\xe7\xee\xb4\x35\x42\x67\xd8\x4c\x5b\x7f\x8e\xa2\xbe\x59\xfd\xd1\xe5\x04\x25\x6a\x08\x0a\x9a\x89\x00\xf3\x40\x55\x12\x46\x55\xc0\x85\x65\xa7\xc3\x35\x27\x4c\x00\xea\x2b\x14\xe8\x71\x99\xc0\x8d\xfb\x86\xdc\x24\xae\x22\x54\x01\x54\xa3\xc0\xed\xa8\x78\x66\x70\xb9\x7f\xbd\x76\x08\xbe\xdb\xb8\x88\x5c\xce\xae\xf0\xc0\x16\x09\xbe\xb6\xd2\x28\x1e\x94\xa5\xa1\x3e\xe2\xf9\xeb\x74\x22\xf9\x0a\x9d\x48\xda\x74\x22\xe9\xa5\x13\x89\x3b\x89\xd7\x6b\x87\xad\x95\xeb\x39\x31\x8e\xd7\xeb\xcb\x2b\x97\x27\x20\x4b\xf8\x95\x2b\xb7\x99\xd0\x48\xd2\xe3\xe8\x32\xb9\x12\xc6\x7a\x30\x66\x5f\x26\x57\xfa\x55\xf2\xbe\xc9\x9d\x0a\x73\xba\xa0\x3c\x4a\xd3\xe2\xb6\xe7\x9a\xdb\x33\x9a\x19\x77\x77\x7a\xe6\x1a\x12\x3a\x4d\xfb\xca\xdb\x6b\x60\x8b\xbb\x3a\x00\x6c\xea\xf6\xbc\x33\x1c\x06\x97\xb3\x2b\x46\xcb\x2f\x67\x57\xdd\x45\x64\xa5\x32\x4a\x2b\x9b\x2a\x39\x5d\x28\x96\xd3\x44\x5c\x17\x11\x3c\xbd\x7f\xa5\x31\xc6\x83\xa4\xff\x38\x0a\x70\x30\x09\xb6\x1d\x51\x01\x1b\x18\xc4\x77\x33\xd7\x06\x4e\x94\xd6\xc1\x95\x4c\x02\x1e\x0e\xa9\xeb\xb9\x32\xed\xf3\x5c\x99\xc2\xb7\xf4\xc0\x7d\xc8\x49\xf5\x00\x0c\xec\x47\x38\x47\x3f\x99\x28\x4a\x5c\x14\xaf\xd7\x62\xe0\x7c\x6a\x7b\x50\x91\x1d\x50\xa4\x33\x0d\x02\x6f\x34\x2e\x3d\xd6\x88\x6d\x69\x10\xdb\x38\xe1\x79\xf0\x23\x0c\xbf\xa8\xab\x34\x28\x60\x09\x6a\x34\x28\xf1\x1e\x7e\xac\x2e\x8f\x31\xbe\x77\xc6\xfe\xec\x1d\xea\x1c\x48\xc2\x39\x90\xd9\x57\x39\x90\x64\xf2\x4f\x7e\x35\xb8\xbd\x52\xdf\x88\xe2\x48\x1c\xd4\x33\x7e\x3a\x27\xac\xac\xeb\xbc\x99\xc8\xc3\x6b\x36\x39\x52\xcd\xc0\xf3\xb4\x89\x7d\x1a\xb6\xce\x0e\xf0\x05\xa4\xae\xff\xaa\x9d\x66\x4d\x23\xdc\x1f\x44\x9b\xfe\xf3\x76\xbb\xa3\x00\x56\xa8\xdb\x6e\xa5\xf9\xb1\xa0\x7b\xea\xf0\xce\x0e\xd5\x0e\x5c\x4c\x85\xcb\x88\x24\x29\xe2\x50\xd6\xdb\xc0\x11\xce\xb6\x83\x5e\xac\x28\xca\x80\x1a\x87\x76\x0f\x00\xda\x39\xd5\xbd\xbe\x46\xf2\xe7\xe4\xf2\xca\xb3\x6d\xd6\xa9\x71\x82\x57\x06\x52\xfd\x3b\x22\xda\x43\x44\x33\x40\xcf\x87\x8b\x67\x7f\x47\x34\xfb\x4f\x8a\x65\xff\x09\x91\xec\x6f\x8a\x63\xf7\x88\x62\x5f\x11\x55\xe8\x56\xf9\xa7\x2d\x61\x0d\xfe\x65\x48\x1d\x49\x0a\xdd\x03\x0a\xb5\x41\x71\xe6\x26\x04\xe6\x26\x6a\x98\x1a\x20\x49\x9c\xb1\xe9\xe5\x5f\x9c\x98\x73\x27\x2d\x4a\xd3\x15\x66\xe2\x89\x61\xde\xe7\x79\x74\x9c\x08\x5f\x36\x6f\xa2\xf8\xaa\x4f\xa0\x89\x19\xeb\x6e\xbe\x6a\xdb\x7b\xdd\xb7\x59\xe1\x95\xeb\xf5\xd1\x7f\xc9\x67\xc5\x8a\xfe\xf7\x68\x3a\xfe\x13\xa2\x87\xe2\x74\x0d\x26\xf9\xeb\x8c\xbc\xc6\x91\x0e\x4c\x9e\xb3\xb9\xaf\x2e\xa9\x41\x6d\x68\x82\x2c\xcd\x91\x81\xb1\x3b\x5c\x0b\xbb\x4c\xda\x37\x00\x0d\x35\x93\x37\x4b\x90\xa9\x1f\xf2\xb2\x04\x55\xec\x1c\x01\x7a\x2b\xa6\x2e\xa5\x95\xb7\x48\x50\x94\xc6\xb1\x56\xf2\x39\x11\xf7\xa0\xb5\xb2\x92\xb7\x12\xd1\xda\x23\xad\xa6\x32\x6b\x58\x7f\x5e\x9d\xa0\x1b\x52\xe6\xc7\x45\xf9\x31\x9f\xf3\xdb\xab\x17\xad\x3c\x29\x1b\xd9\x02\xa2\x53\xd0\xa8\x09\x9c\x2f\x3f\xe1\x41\x8d\xb7\x82\x3d\x81\x4c\x7b\xb2\x29\x8d\xee\x83\xda\x6e\xdb\x05\x5a\xd2\xaa\x2e\x4a\xb8\x18\xce\x7d\xec\xdb\xd1\xe5\xb9\x19\x70\x0b\xca\xfd\x2c\x11\x09\x87\xdc\x69\x99\x71\xa7\xca\x1d\x3f\x34\x2e\x3b\x0b\x36\x35\x84\x3c\x22\x0b\x52\xd2\x1c\x96\xcf\x77\xe1\x8a\xb9\x56\x10\xe2\x70\xf4\x79\x49\xcb\x15\x77\x46\x2d\xca\x97\x59\xe6\xf0\x1e\x2f\x59\x27\x7f\xdc\x3e\x89\xec\xbd\x9f\xcf\xcf\xde\x8d\xf8\x5e\x4d\xe3\x95\x03\x7e\x8b\x7b\xbb\x57\x97\xac\x4b\x68\xc1\x87\x71\xb5\xeb\x0a\x17\xa4\xb1\x1f\x34\x8e\xbd\x81\xb4\xfb\x44\x38\xbc\x0c\xae\x80\x0f\xe7\xd7\x00\xa3\x11\x23\xc9\x60\x62\x62\x3f\xa4\x96\xb1\x0a\x9c\xc8\xf5\xa9\xee\x38\x39\xb6\x5d\xff\xe7\xd8\x01\x4f\xac\xcd\xe6\x1e\x8e\x61\xcb\x4e\x53\x92\x78\xe3\xcd\xb9\x45\x14\xdf\x6c\x36\xae\x9f\x87\x23\x7e\xc3\x17\x2e\xd8\x36\x0b\xc6\xe3\xb5\x88\xbb\xe0\xce\x52\x48\x78\x3f\x25\xfc\x7e\xe3\x49\x22\x28\xa2\xba\xf3\x90\x34\x6e\x6c\x3b\xce\x0e\x59\xaf\x0f\x77\x74\x7b\xda\x70\xf8\x5d\xeb\xf9\xb0\xdd\xc0\x79\xb1\x63\x9a\xe4\x6c\x0b\x2e\x78\xee\x43\x1a\xdb\xfd\x45\x91\xe6\xf5\xbe\xbc\xb3\x6e\xd9\xaa\x31\xf7\xbc\x34\x1c\xf9\x13\x71\x3b\x7b\xf2\x5d\xcb\xa8\xd7\x76\x8d\xf2\x74\x45\xb6\x91\x49\xa0\xe7\x1b\xd6\xeb\x1d\x20\xa5\x9a\xca\x24\x22\x35\xd9\x87\x51\x96\x45\x51\xdb\x6c\x14\x6c\x9a\x7e\xc7\x79\xec\xdc\x75\x73\x27\xf5\x26\x96\x92\xe0\xdb\x04\xf8\x3b\x11\xea\xf2\xd0\x23\xd8\x21\xb8\x33\x76\x77\x62\x7a\xe4\x79\xbf\xf2\x6b\x23\xc8\xee\x28\xff\x02\xfc\x02\xbc\x14\x89\xb6\x21\x3c\x82\x08\x0e\x0c\x08\x5c\x1e\x04\x97\xe0\x9a\x24\x70\xcd\x8c\x60\xe1\x50\xa9\x22\x93\x40\x76\xa6\x76\xae\xa8\x56\xdc\x0b\xd1\x56\xbe\x8a\x3a\x41\x39\xfa\xae\x6e\x13\x95\xe5\xa2\x89\x66\xa1\x11\x95\x9f\x12\xbc\xe0\x29\xea\x08\x8e\x88\x48\x51\x1f\x39\x84\x47\x35\x15\xe8\xcf\xf3\x58\x94\x35\x77\x44\xe4\x33\x7c\x07\x16\x27\xb8\x43\xa6\x37\x41\x34\x8f\xf4\xc2\xa3\x3c\xda\xf0\xcb\x2c\x2a\x9c\x8a\xb8\x49\x9b\x50\xe1\xc0\x9e\x16\xf9\x70\xd8\x53\xe8\xb8\x70\xd7\x3a\xe4\xb1\xbd\xc2\x51\xc9\x38\x08\xf0\x8d\x72\xef\xd8\x76\x24\x79\x38\x2d\x4a\xa0\x42\x82\x38\x88\xa2\x33\xf0\xd2\x41\x14\x87\x23\xb0\x95\x2a\x42\x05\x4f\xbc\x16\xe2\xa7\x34\x96\x0d\x44\xd5\x4f\x11\x2a\xf3\x96\x75\x92\xeb\xc9\x30\x85\x3c\x85\x12\xbc\x7f\x88\x66\xec\x9f\x29\x1e\xa3\x12\x8f\x51\x8e\x89\xc8\x0c\xe3\x07\x2a\x9b\xb0\x64\x6b\x96\x90\x5a\x98\xeb\x55\xc7\x3c\x9c\xd5\x93\x1d\x8c\x73\x6d\x03\x38\x09\x8e\xf7\x22\xd7\x67\xad\x28\x6f\x15\xf6\xb4\x9a\xe1\x78\x2f\x74\xfd\x27\x58\x2f\x67\xbc\xd1\x9e\x78\x86\x3d\x2b\xa8\xa6\x1e\xff\xd0\x59\xe2\xdc\x30\x2d\x71\x3c\x5e\xe1\xdc\xcf\xf1\x72\x23\x47\xcc\x5e\x68\xd2\x48\x5a\x81\xbf\xe2\x81\xb4\xf7\xf6\xa6\x98\x87\xe1\x4a\x70\xec\x42\x29\x65\xa5\xa5\x70\xa4\x99\xb1\xd2\x26\xb8\x1f\xf4\x06\x01\x4f\x78\x7c\x76\xd9\x5d\x8e\x57\xac\x4b\x6d\xb3\x6c\x58\xef\x01\x06\x5f\x8b\x64\xbd\x86\xbf\x33\x1e\x2c\x61\x20\xf0\x2b\x01\x84\x9a\x89\xeb\xd1\x7c\x45\x36\x01\x9b\x4b\xd1\x60\x0c\x0d\xc6\x46\x03\xff\x24\xc1\x77\xb0\xd8\xfc\xc4\xf5\x08\x52\x08\xf9\x01\x6c\x88\xc1\xc6\xff\x1c\x39\x8c\x5a\xa3\x76\x94\x27\x7d\x77\xf0\x7d\x71\x92\xa0\x00\x36\x07\x02\x37\xd4\x06\x2e\x8f\xc1\x6f\x40\x86\x7b\x2a\x7c\xfd\xa6\xc4\xd9\xe6\x3b\x0a\xb7\x69\xf9\x4e\x0b\x41\x4b\x14\x60\x88\x42\x51\xd6\x88\xe0\x68\x44\xf3\x08\xa9\xf8\x24\x22\xe7\x80\x8b\x7a\x36\x23\xe3\x96\xcd\x52\x1c\xa0\xd0\xd8\x7d\x18\xae\xee\xcf\x53\x46\x43\xc4\x11\xa6\x30\x44\xde\x71\xeb\xd9\x7c\x0c\xfb\xfb\xf7\xa4\x70\xe9\xba\x3c\x0a\x1c\xf7\x4a\x1e\xd1\xa4\xe9\x46\x7e\x08\x75\x55\x32\x0e\x88\xbf\x48\xf3\x68\x42\x3c\xad\x19\xfb\x4a\xea\xfa\x3b\xc1\x88\xde\xd6\x34\x8f\x86\x43\xf2\xc3\x20\x82\x84\x18\x11\x9b\x59\x44\x30\x75\x7d\x8a\x8f\x23\x27\x6c\xec\x7e\xf0\xc4\x93\x13\xd1\xe1\x90\xb1\xe7\x87\x90\x10\xb1\xa1\x0e\xeb\x75\xa0\xd1\x06\x48\x6e\xc0\x36\x47\x53\xcc\x29\x00\x54\x70\x87\x3e\x56\xa5\x28\x05\x13\x19\xd4\x0b\x1a\xc5\x80\x72\xde\xde\x95\x3a\x94\x96\xe7\x35\x60\x80\xe3\xfa\xc9\xa8\xa2\x35\x2c\x87\xc3\xfb\x46\xb2\x27\xd7\x0f\xa4\x02\x24\xcb\xa0\x79\xe5\xb8\x3e\xf9\x21\x9a\x38\xc1\x88\x44\x11\x87\x90\xb8\x48\x4e\x8a\xc3\xc7\x82\x9a\xae\x3d\x07\xc0\x1f\xf5\xd4\x21\x03\x86\xbb\xd9\x04\xf8\x92\x7b\xd3\x10\x1c\xf2\x6c\xd5\x1a\x2b\x67\xba\xe6\x0c\x87\x01\x57\x3c\x35\x31\x67\x50\x46\x63\xa0\xf0\xe0\xa9\xf2\x96\xc6\x35\xaa\x8b\x85\x2a\xb8\x28\x16\x1b\xd7\x4f\x09\x44\x1e\x57\x17\xad\x02\xfd\xa2\x15\x01\x97\x3f\x44\x46\x02\xa6\x06\x0a\x93\x11\x03\xdf\xa9\xbb\x28\x16\x78\x40\x46\x75\xb1\xd8\x48\x76\xe8\x73\xe4\xfc\x94\xb8\xbe\xe0\x92\x36\x42\xa4\xd8\x92\x29\x8a\x2b\x2f\x08\xd6\xcc\xfe\x3e\xb9\x3c\xbb\xc2\xd4\x27\x97\x8b\xe0\x4a\xbf\x74\x86\xb8\x73\xfa\x89\xbc\x12\xcb\xb8\x15\xf3\xc8\x6d\xf9\xaf\xf3\xa8\x29\x24\x4b\xbf\x50\xfd\xa5\x92\xe6\x9d\x51\xb8\x77\x0b\x7d\x04\x5e\x87\x2b\x0f\x96\x75\x0d\xa6\x0d\xc3\x28\xd2\x23\xde\x35\x0c\x2a\x01\xeb\x90\xd2\x7d\xab\x93\x09\xc2\x1c\x76\xce\x7b\xe1\x4b\xd1\x37\x3d\xa2\xad\x61\xb2\xd9\xa0\xbe\x84\x75\xbd\x2c\x48\x33\x24\x6c\xdc\x26\xd4\xdd\x14\x1a\xbf\xc3\x1e\xb7\x76\xbd\xb6\x71\x0e\x1c\x7c\xdd\x3b\x50\x5e\x5e\xbb\xc7\x7f\xb0\x67\x2c\x5b\x1a\x0b\xbd\xb4\xfc\xf0\xd7\x74\x51\xa6\x45\x99\xd6\xe9\x17\x7a\xbe\x0c\xea\x92\xd2\xde\xaf\xdf\xd9\x09\x46\xd3\x34\x8a\x68\xbe\xd1\xa4\xdb\xad\xe8\x08\x51\x81\xb8\x2c\xcd\x11\x31\xd2\x10\x30\x2f\x6e\xbc\x45\x8c\xe4\x6d\x7a\xef\x4e\xcb\x10\x6f\x46\x16\xe2\xa4\xc8\x51\xb9\x8d\xef\x59\x5d\x8e\xe7\xd4\x2f\xcd\xe5\x6d\xe7\x96\x6f\xc1\xd7\x2f\x45\xd8\xb6\xec\xa6\xc9\x3a\xdf\x11\x33\xf5\xab\x0d\xa1\xdc\x4b\x0f\xdb\x44\xfd\xc9\xea\xf5\xd7\x06\x81\x7b\xf7\xa2\x2d\x66\x34\xd4\xcb\xc8\x69\xef\x04\x88\xb8\x5e\xb7\x17\xbd\x4d\xcf\xe8\x5b\x20\x42\xf5\x46\x27\x31\x7e\xe7\xe5\xbf\x31\x32\x48\x9e\xd9\xd3\x95\xe6\xf7\xd3\x99\x2e\xdd\x27\x28\x30\xdb\x1a\x29\xf8\x5b\x2f\xde\x37\x2a\x13\xa4\xd7\xe9\x63\x83\x54\x52\x4a\xef\xae\x9b\x78\xb1\x5f\x12\x69\x0b\x72\xc1\xa8\x2e\xde\x16\x37\xd2\xf3\x5c\xd5\x42\x20\x7f\xa3\x4a\x44\xc4\xda\xa0\xfe\x64\x8e\x6d\x4c\x10\x64\x07\x2e\x85\xad\xd7\x4f\x8c\x6e\x15\xa8\x6d\xc9\x1f\xcd\x04\xb4\x3c\xc1\xa7\xce\x9f\xfa\x64\x38\x6c\x4b\xcd\x66\x17\x90\xe5\xd3\x78\xc5\x10\xdb\xfa\xb2\x4a\xf6\x76\xaa\xdf\xaa\xfa\x77\xfa\x9c\xde\xb3\x38\x7c\xbb\xa3\x98\x91\x81\xb3\x2b\x1c\x8b\x53\x2f\x94\xaf\x2b\x25\x3f\x45\x91\xab\x40\xdd\x43\xc1\x04\x20\x05\x40\xe8\x05\x37\x28\x4a\xa3\x77\x45\x7d\xca\xa4\x25\xa9\xb2\x52\x98\xb9\x2d\x19\x68\xef\x5b\xdb\x1b\x0f\x78\x6b\xd1\xf0\x55\x13\xd4\x71\x3b\xe4\xad\x88\xdb\x34\x39\x4e\x73\x4d\x77\xf7\x20\xa8\x5b\x5e\xf9\xda\x67\x9a\xaf\x3d\xbc\xe5\x56\xb8\x1b\xb4\x2d\xbe\xad\xf7\x39\x46\x9d\xe8\xb6\xfc\xaa\x40\x19\xe2\xdf\x5b\x21\xfe\x34\xe7\xed\xb7\x86\xd5\xe7\xe7\xc4\x09\xf5\x98\x8c\x8f\xc7\x63\x5b\xb9\xdc\x89\xd8\x92\x1f\x8a\xa2\x09\x3a\x0c\xa9\x0c\xdd\xdf\x47\xad\x98\x95\xe0\x12\x05\xf6\x37\xb8\xba\x16\xe1\x68\xbd\xfe\x85\xc1\xe6\x59\x45\xc1\xed\x40\x85\x54\x8b\x45\x5a\x2b\x71\x69\x30\x34\x88\x53\x2c\xdd\xaa\x7e\x1f\xb5\xc2\x82\x72\x41\x60\xcb\xb8\x70\xe2\xff\xde\x89\x5a\xa8\xdf\xd0\xec\x1b\x72\x02\x43\xde\x28\xb5\xcc\xef\xa3\xde\x70\x85\x4e\xac\x5d\x49\x3e\x4d\xf4\xbb\xd3\x8f\xbf\x27\x65\x02\x32\x41\x25\x18\xe1\xe1\x90\x7f\x25\xdb\xdd\xb2\xea\xf2\xf1\xd5\x44\x7f\xe0\x3a\xb2\x9f\x13\x27\xe8\xce\xbd\x18\xca\x7b\x0a\xcb\xc4\x03\x8f\xea\x6a\xb9\x77\xa2\xff\x7a\x9a\x56\xbd\x13\xd1\x9d\x37\xd8\xbf\xef\x12\x2d\x68\x65\x49\xf3\x88\x96\xad\xdb\x8c\xdd\x19\x22\x68\x5b\x2f\x2a\x7f\x93\x6f\xc0\x5d\xe6\xa0\x66\x34\x6e\xe5\x76\xc1\xc2\xbb\xf7\x43\x26\xae\x08\x50\x76\x96\x60\x61\x64\xe0\x01\x18\xbd\xd3\x04\x22\x19\xbe\x3e\x3b\x05\xfd\x5b\x2b\x4c\xb0\xb8\xa9\x6c\x04\x8f\x4c\x63\xc7\x94\x7d\x64\x2d\x51\xe9\x4b\xfb\x82\xa8\x82\xf7\x86\x42\x8c\x76\xb8\x45\x27\x70\x7b\x53\x0d\x12\x31\xb7\x3c\xf0\xef\x0b\xdb\x85\x95\x3d\x7c\x62\x23\xe3\xc2\x97\xdb\xd0\xe2\x0e\xfd\x15\x7d\xbe\x4d\xf8\x44\x41\x8e\x90\xb1\x60\x22\x18\xe8\x07\xbd\x70\x08\x2f\xa8\xe0\xa4\xfc\x4d\xc1\xe6\x9e\xe4\x75\x3f\x17\x26\x18\x58\x75\xdd\xbb\x51\x4a\xf4\xcd\x10\xfb\xc4\x27\x2f\x3a\xd1\x19\x14\x81\xd9\x39\x84\x23\x47\xe0\x84\x52\x83\xbf\xac\x3b\x0b\x07\x7a\x6f\xb9\x13\x06\xaf\x1d\xfb\xa9\xb6\x13\x48\x1f\x96\x4c\x9c\xfb\x77\xbb\x9c\x0b\x31\x21\x3b\x87\x48\x0f\x9a\xd7\xbb\x6f\x78\xd0\xd4\x8d\x2b\x72\x87\x6b\x93\xd7\xc6\x3f\x55\xd1\x0a\x9b\x5a\x87\x4d\x55\x3b\x5e\xea\xef\xf7\xc4\x4b\xfd\x5d\x8b\x97\xfa\xe9\xd3\xf9\xd1\xab\x0f\x47\x17\x9f\x4e\xde\x5d\x1c\x7d\x78\xf7\xf2\xed\xf9\xa7\xd7\x67\x9f\xde\x9d\x5d\x7c\xfa\x78\x7e\xf4\xe9\xec\xc3\xa7\xff\x3e\xfb\xf8\xe9\xb7\x93\xb7\x6f\x3f\xfd\x78\xf4\xe9\xf8\xe4\xc3\xd1\x6b\xef\x0e\xe2\x2f\xbe\xcf\x96\x49\x9a\xff\xb4\x0c\xbc\x3c\x40\x5a\xc9\x07\x9a\xa4\x55\x5d\xae\xbc\x8f\x44\x14\x97\xc5\x82\x24\xa4\x2e\xca\xca\x7b\x15\x20\x11\xaf\x56\x5a\x2c\xd4\x32\x79\x9f\x43\x5e\xf7\xfa\xec\x54\x15\x5e\x30\x21\xa9\x0e\x54\x85\x11\xf9\xd1\xab\xa3\xcd\xc6\x1f\xfc\x3e\xea\x06\x3b\x75\xee\xb6\x45\x1f\xfd\x1c\xa0\x60\x99\x47\x19\x6c\x4c\x6f\x8c\xae\x69\x59\x31\xa6\xd4\x3e\x7c\x36\x3a\x1c\x1d\xda\x02\xe7\x69\xf9\x9e\x84\x33\x92\x00\x6f\xe9\xd9\xdc\xa4\x11\x15\x73\x7b\xc3\x8f\x8b\xf7\x1d\xcb\xa4\xd4\xda\x9f\x25\x1b\x17\xfd\x23\xc1\xef\x93\xe1\xf0\x2c\x59\xaf\xdf\x27\xfe\xbc\x60\x27\xea\x88\xde\x2e\x8a\xb2\xae\xf0\x3f\x12\x3d\x4e\xa9\xf1\xe4\xfd\x23\xf1\x07\x83\xc1\xc1\xa3\x47\x8f\x0e\xac\x8d\x8b\x06\x07\x8f\xac\xa7\xe3\x67\xd6\xa3\x03\x51\xd6\xe0\x1c\x07\x8a\x2c\x01\x15\x59\x9f\x3e\xdd\xd0\x60\x41\xc2\xd9\xa7\x92\x7e\x5e\xa6\x25\xfd\xf4\xc9\xb5\xee\x06\x03\x7b\x59\x51\x8b\x49\xad\x61\x6d\x0b\xe0\x03\xeb\x91\xf5\xaa\x58\xac\xca\x34\x99\xd6\x96\x13\xba\xd6\xe3\xf1\xe1\x93\xfd\x05\x13\xe1\xf2\x1a\x59\xc7\x24\xa4\x41\x51\xcc\x90\x75\x92\x87\xa3\x81\x05\x2f\x5c\x4c\xd3\xca\xe2\xae\x11\x56\x58\x44\xd4\x4a\x2b\x2b\x4b\x43\x9a\x57\x34\xb2\x96\x6c\xd2\xac\x7a\x4a\xad\xd3\x93\x0b\x59\x6c\xc5\xc5\x32\x8f\xac\x34\x67\x15\x0c\xc4\xdb\x93\x57\x47\xef\xce\x8f\xac\x38\xcd\xa8\x28\xb6\xca\xa2\xa8\xad\x28\x2d\xc1\xba\xb7\xb2\x8a\xd8\xaa\xb5\x8e\x18\xf9\x90\x03\xf8\x2f\x46\xf2\x20\x7e\x54\x35\x60\x33\x02\xf4\x3a\x05\xa5\x9a\x85\xfb\x3e\xdf\x79\x3a\x7e\xee\xfa\xea\x8b\xff\x0b\x2e\x3e\x5a\x77\x8f\x36\x16\x57\x0a\x58\x17\x53\x2a\x7f\xd6\x85\x05\xa0\x47\xd0\x52\x90\x82\x3b\x71\x81\x74\x63\xfd\x36\xa5\xf5\x94\x96\x56\x51\x5a\x79\x51\xc3\xc0\xc5\x8b\x69\x65\x11\xeb\xf5\xd9\xa9\xc5\x04\x5c\x8b\x91\xfc\x11\x8c\xae\xb9\xbd\x56\xa9\xdb\x0b\xfc\x15\xb6\x2a\x96\x25\xba\xe0\xe3\x57\x35\xc3\xa1\x80\xab\x0e\x0f\x0b\x63\xeb\x89\x3f\xd8\x0c\x06\x26\x1a\x59\x58\x83\xec\x77\x70\xe6\xf9\xff\xc3\x99\x5e\x9c\xf9\x3f\x83\x0b\xbd\x68\xd0\x41\x01\x30\x2b\x15\xa1\x85\xe5\xfb\x13\xb9\xf8\xc6\x25\x18\x6b\xbd\x96\x0d\x3c\x15\x2e\xc2\x97\xef\x0b\xc7\xac\x94\xde\x58\x98\xd5\x8e\xf4\x92\xf5\xda\xe2\x5a\x76\xbf\xc1\xb8\x9d\x1d\x31\x08\x86\x6c\x8e\x74\x16\x6e\x5e\x1a\xf1\x0d\x85\xb1\xb5\x2b\x07\xbf\xab\x46\x66\xa5\x82\x90\xf6\xbd\xe3\x59\x02\x9a\x68\x0b\x30\xf8\xef\x5d\xd6\x99\x51\xab\x23\x38\xb6\x76\xb9\x12\x6f\x4b\x33\x46\x84\x79\x33\xae\x7d\xdb\x75\xdd\x6d\x3b\xa2\x7f\x37\xbc\xf8\x0f\xee\x86\x83\x47\xd6\x6f\x47\x3f\xbe\x7f\xf9\xea\x17\xeb\xd7\x97\x1f\xac\x93\x77\x3f\x1f\xbd\xba\x38\x39\x7b\x67\x3d\x3a\x68\x60\x2f\xca\x22\xa4\x55\xe5\x5a\x77\x07\x8f\x1e\x59\xff\x25\x91\x1b\xce\x31\xeb\x9a\x9f\x35\x0c\xbb\xd4\xc1\x32\x8a\xe8\x35\xcd\x8a\x05\xa8\xaa\xff\xaa\x04\xfa\xfe\xdf\xb5\xe1\x0e\x06\x83\xc1\x20\x8d\x2d\xf9\xf5\x23\x9a\x5f\x8f\xde\x9d\xbd\x3e\xfa\x74\xf4\xee\x57\x6b\x07\x63\xcb\x5e\x94\x45\xb4\xe4\x3c\x2c\xdf\x03\x1a\x13\x65\xdd\x0d\x76\x9b\x99\xde\xf5\x39\x81\xe7\x53\xd6\x4f\xdf\x0f\x45\x9c\x8d\x34\xbf\x26\x65\x4a\xf2\x6d\xed\x5e\x3c\x17\x0d\x6f\xb8\x93\xed\x36\x70\x87\x8f\x45\xbb\xa3\x5b\x1a\x2e\xb9\x85\xeb\x3a\x2d\x8b\x1c\xb6\x61\xff\x4b\x8f\x9f\x8c\xc5\x4b\x9f\x48\x55\xa5\x49\xbe\x6d\x0c\xcf\x44\x33\x3a\x5f\xd4\x2b\x19\xd3\xe7\x9b\xc3\x6d\x47\xd7\x77\x72\x28\x3a\xcb\xb3\x75\x0c\x72\x26\x12\x5a\xbf\x0c\xeb\xf4\x5a\xfa\x17\x6d\x7d\x41\x7e\x69\x35\x25\x59\x56\xdc\x1c\x7d\x5e\x92\x6c\xeb\xb4\x3c\x11\x8d\x45\xda\x8b\xfb\x8e\xdc\xc7\x4f\x64\x63\x65\xf1\xda\xda\xf2\xa9\x3e\x23\x67\x82\x66\x6c\x19\x82\xfc\x40\x20\xcc\x8c\xa5\x64\xa4\xa3\xda\xd6\xfc\x5b\x09\x7a\xba\x5a\x4c\x69\x4e\x6a\x7a\x5e\xaf\x32\x41\x47\xb6\xb0\x0a\x72\xc2\x43\x32\xa7\x59\xfa\xe5\xeb\x6f\xc0\x98\xe4\x81\xf2\xdb\xcb\x0f\xef\x4e\xde\xbd\xf1\xac\xd7\x67\xd6\xbb\xb3\x0b\x6b\x4e\xf2\x25\xc9\xb2\x95\x25\x5e\xe0\x1b\x46\x10\x2c\xb5\x53\xe1\xc0\x10\x29\x48\x61\xb9\xe2\xa2\xb4\xfe\x54\xe8\xec\x8c\x46\x23\xf7\x4f\x6b\x59\xf1\x74\xa3\x6c\x27\x82\x3f\x29\xdf\xda\xd5\xaa\xaa\xe9\x9c\xc1\x22\x79\x64\xdd\xa4\x59\x66\x7d\x2a\xf2\x6c\xf5\xc9\x0a\xa8\xec\x56\xbd\x17\x16\x65\x49\xab\x45\x01\xc9\x2a\xac\x80\x04\x34\xb3\x16\xa4\xaa\x60\x2c\x27\xb5\x45\xb2\x1b\xb2\xaa\x2c\xc8\x39\x56\x89\xcd\xbc\xc3\xf7\xde\xa4\xd9\x5f\x4e\x4c\xb2\x8a\x22\x6b\x57\x32\xe4\xd6\x0d\xa9\x2c\x7e\x7d\xd8\x0a\x40\xff\xcc\x37\xec\xc8\x3a\x25\x33\x6a\x55\xcb\x92\x5a\xab\x62\x09\x4d\x60\x1c\x1c\xe4\x82\x33\xd7\xf2\x15\x56\xcb\x86\x25\xa1\x8e\x76\x5d\xcb\xb3\x64\x40\xfc\xc1\xc1\x01\x3b\x9d\x2b\x6a\xa9\x48\xbd\x95\xc5\x6d\x2a\xec\x4b\x49\x96\x59\x59\x71\x43\x4b\x30\x67\xd5\x85\x05\x08\xcd\x66\x92\xbd\x08\x85\x69\x5e\xd1\x9c\x07\xb2\xb1\x04\x33\x00\xa4\xe5\xe8\xfc\xe8\xc3\xaf\x47\xaf\x3f\xbd\xff\x70\xf6\xfe\xdc\xc2\x40\x90\x54\x0c\x3f\xab\x2e\x97\x14\x0d\x2c\x6b\x8b\x79\x47\x6b\xa0\x87\x02\x6c\x97\xca\x48\xb8\xaa\x3c\xed\x02\xb8\xff\xca\x40\xb7\x5d\xfb\xd2\x80\xd6\x82\x21\x2d\x7f\x1c\x6c\xfc\x81\x16\x7c\x85\x0d\xe3\x94\x54\x33\x87\xbb\x99\x59\x41\x5a\xcf\x49\x35\x33\x98\x51\x5e\x67\x0d\x9b\x4a\x76\xe8\x8a\x07\x38\x71\xd9\xb4\xbd\x3e\x3b\x95\x4e\xa9\x27\x20\x79\x31\xf8\x7c\xf2\x60\x33\x58\xd6\x23\xeb\x94\x2c\x16\x6c\x45\xe3\xb2\x98\x5b\x79\x51\xce\xc1\xa8\x19\x21\xbe\xbb\xd8\xa2\x44\x96\x8c\xd8\x6c\x81\x37\x13\xac\x1c\xa3\x30\x71\x9a\x88\xcb\xf1\x56\x3d\x25\x35\x87\x57\x2d\x68\x98\xc6\x29\xad\xac\x69\x71\x03\x88\x44\xaa\xaa\x08\x53\xc8\xc4\xcb\xf0\x50\x01\xd3\x10\x23\x64\x87\x10\x8d\x18\xa3\x26\xa4\xba\x68\x04\xe0\x0e\x06\x96\x75\xfa\xf1\x9c\xcb\xb8\x6c\xf1\x8f\x3e\x5c\xfc\xb7\x67\x8d\x6f\x0f\xd9\x1c\xfe\xf4\xf2\xfc\xd3\x8f\x67\x67\x6f\x8f\x5e\xbe\xfb\xf4\xeb\xcb\xb7\x1f\x8f\x58\xcd\x53\x59\xf3\xee\xe3\xe9\xd1\x87\x93\x57\x4d\xcd\x0b\x59\xf3\xfe\xec\xfc\xe4\xe2\xe4\xd7\xa3\x6e\x93\xc3\xb1\xb5\xd6\x5b\x9e\xfd\x7a\xf4\xe1\xed\xd9\xcb\xd7\x47\xaf\xbb\x1d\x3d\x1e\xcb\x56\xe7\x17\x1f\x4e\xde\xbd\xe9\x19\xca\x18\x0d\xf4\xb9\xe6\x8b\x60\x55\xc5\x9c\xf2\x79\xe2\x73\x6d\xcd\xf2\xe2\x26\xa3\x51\x42\x2d\x12\x14\x4b\xce\xa8\xb2\xcd\xc5\x49\x4f\x4d\x66\xb4\x52\x33\x2e\xb8\x2d\x0e\xf0\x26\xad\xa7\xd0\x3a\x2e\xd8\x56\x62\xeb\xb8\x68\x5c\x61\xa1\x0d\x6f\xa8\x39\xc8\x4a\x9e\x6f\x2e\x16\xde\x58\x13\xb6\xc0\x6c\x7d\x8b\x9c\x72\xde\x81\xf2\xf7\x7b\x31\x29\x2c\x80\xc5\xac\x2b\x60\xb0\x97\x59\x36\xb2\x4e\x62\x46\x44\xca\x66\xff\x5b\x69\x95\xef\xd6\x70\x2f\x89\x96\x80\xf8\xd6\x23\x2b\xad\xad\x9b\x82\x15\x27\xb4\xb6\x6e\xca\xb4\xae\x69\xce\x7a\x95\xdf\xad\x0d\xfc\xf5\xd9\xe9\x4b\x23\x0a\x7b\x67\xfc\x9c\x4e\x35\x1d\xca\x4f\x10\xc0\x38\x18\xb3\x7a\x64\xbd\x34\x9e\x2b\x10\x0f\x24\xe6\x46\x8c\x8c\xc3\xeb\x8f\x1e\x29\x72\x25\x97\xb0\xd9\x21\x1c\xd2\x7d\x43\x5d\x90\xf0\x3f\x33\x5e\x80\x64\x7d\xfc\xf0\x76\x64\x39\x5f\x1f\x79\x5e\x34\x2f\x8d\x5c\x73\x80\xef\xb5\xd8\xeb\x95\x67\x55\xe9\x3c\xcd\x48\xc9\xba\xef\x8c\xde\x0a\x96\xfc\x94\xd3\x10\x24\xa5\xd5\xc8\x40\xa8\xd5\xbd\xf3\x77\xff\x64\x9d\x1a\x91\xe3\x2b\x4f\x43\x52\xa0\x27\xea\x40\x16\x5b\xc5\x92\xc6\x71\x6b\xce\xdf\x60\xe8\xc6\xa1\xfd\x09\xe4\xf0\x4f\x76\x4a\xab\x18\x8f\x08\x86\xd0\x7a\x47\x12\x9d\x65\x5e\x51\xbe\xcf\x24\xea\xeb\x83\x93\x32\x27\x5f\xb9\x8d\x15\x15\x73\xf9\xbd\xaf\xf8\x26\xe4\x07\x35\xfc\x24\x95\x15\xd1\x2a\x2c\xd3\x80\x46\x6c\xff\x5e\xd3\x86\x74\x71\x7d\x97\x36\xef\xfc\x75\xcf\x52\xd4\xde\xe9\xc0\xe6\x74\x9e\xcb\x8c\x3a\xd5\xee\xdb\x82\xbe\x6a\xa9\xcd\x1d\xee\x8e\x77\xa4\x55\xaf\xd7\xd6\xdd\xa6\x79\xb1\x1f\x6b\x7b\x81\x6c\x69\xfa\x35\x80\x0f\x83\xd5\x03\xa6\x85\x20\xdb\xe0\xb4\x9b\x09\x40\x00\x89\xe1\x2f\x38\x5f\xb2\x65\x06\x16\x31\xcd\xb5\xb9\x92\x73\x6d\x59\x3b\x3b\x1a\x8a\xb7\xee\x73\xc8\x77\xdd\x3e\x06\xcb\xde\xb2\xc6\xc0\x11\x7a\xd6\x7f\x17\xcb\x5d\xc6\x53\x96\x2b\xb6\xf7\xeb\x42\xa0\x84\x49\x75\x77\xff\x67\xb5\x6b\xdd\x4c\xd3\x70\x6a\x4d\x49\x65\x91\xac\xa4\x24\x5a\x59\x01\xa5\xb9\x68\x4f\xa3\x11\x03\x65\xcd\xc9\x4a\x1c\x98\x69\x44\xf3\x1a\xf8\x56\xde\x02\xc0\x4f\xa9\x55\xb1\x8f\x34\xa0\x0b\x3c\xad\x6f\xd2\x90\x22\x46\xaa\x57\x0d\x20\xed\xdd\x9b\x42\xb4\x14\xbb\x6f\x4a\xae\x39\x8e\x67\x29\x6f\x61\x72\x01\x23\x1b\x59\xcd\xc4\x68\x3c\x20\x9f\x4f\x48\x0b\x25\xcd\xfc\x91\x85\x55\x5b\xd3\xfc\xef\x6b\xcd\x59\x0b\xb1\xbd\xb0\xb6\x46\x97\xf2\xcd\x2b\x03\xf8\x42\xed\x85\xb8\x10\x3c\x0d\xff\x9f\x91\x24\xc2\xd3\x06\x81\xfa\x9b\x00\x16\x7b\x70\x7e\x35\x2d\xf4\x1c\x15\x9e\x1a\x7b\x53\x6f\x66\xbd\x90\x6f\x6b\xd5\x46\xda\x0b\x4f\x63\xea\x9a\xaf\x44\xcd\xf6\x1e\x75\x78\x1c\xb7\xe9\xab\x95\x1f\xe3\xeb\xc0\x3a\x6c\x91\x09\x4c\x4f\xa9\xf2\x30\x60\x06\x9b\x64\x02\xeb\xcb\xd3\xf2\x30\xa0\xfd\x4c\x98\x09\xbd\x3f\x73\xca\xc3\xe0\x6f\x63\xdd\xcc\x1e\x78\xfe\xaa\xbf\x0f\xbd\x8f\xe5\x73\x05\xe0\x8d\xc4\xea\x1d\x47\xc7\xd2\x76\xa2\x13\x6b\xcf\x6a\x57\xeb\xb3\xd8\x53\xdd\x3f\x1d\xd6\xf7\xd8\x3a\xec\xa7\x4d\x1a\x55\xf2\x2c\xde\x38\x24\x39\xdb\xf8\x82\xc1\x13\xaa\x52\x64\x15\x0a\xb4\x56\xc6\xb8\x3a\x18\x90\x25\x45\x91\x65\x0d\x47\x3d\x63\x46\xe7\x41\x9a\x73\x37\x21\xeb\x7f\x56\xf7\x13\x83\x34\xb6\x9c\x0e\xc1\xdf\x4a\x65\x5d\x6d\x33\x83\xdf\xb5\xfe\x1a\x3f\x08\x4d\x48\x3d\x14\xc2\x32\xe7\xae\x0d\xc2\x78\x96\xab\xb5\xb9\x77\xb8\x70\xd6\x3d\x68\xcc\xdb\x7b\xe6\x7c\x5c\xcf\x17\x00\x70\xfd\x33\xfa\x47\xd4\x3a\xe9\xfe\xfe\x68\x4c\xb2\xc5\x47\xd2\x02\x7a\xcf\x28\x0e\x0e\xac\xd7\xc5\x4d\x0e\x82\x7a\x49\x63\x5a\xd2\x3c\xe4\xe2\xe0\xcd\x34\xad\x69\x96\x56\xb5\xc6\x28\x2a\xe5\x3c\x1c\xc2\x73\x3a\x0f\x68\x59\x4d\xd3\x45\x03\x8c\x49\x2f\x4c\xdc\x61\x00\xf7\xa5\xdc\x9f\xd6\x2b\x21\xf7\x80\x76\xa0\x82\x43\xad\x81\x5f\x17\xd6\x22\x0d\x67\xd6\x52\x83\xf3\x27\xb4\x8c\x97\x59\x56\x85\x25\xa5\xf9\x9f\x48\x1c\xa6\x8d\x84\x29\x85\x8c\x65\x25\xcf\xc9\xd6\xf1\x28\x04\xd9\x06\x28\xe8\x77\x00\xf0\x71\x03\x78\x60\xcc\xa9\x71\x38\x89\x23\x4e\x4e\x35\x9f\xbc\xcd\x80\xfd\xb7\x01\xe5\x93\x45\xab\x2c\xcd\xeb\x7d\x91\x89\xc1\x9a\x93\xdb\xfd\x8c\xe6\x8c\x51\x84\x7c\x6b\x17\x17\x1f\x4e\x7e\xfc\x78\x71\xf4\xe9\xdd\xcb\xd3\xa3\x4f\xe7\x17\x2f\x3f\x5c\x7c\x7a\xf5\xd3\xcb\x0f\x16\xb6\x6c\x95\xed\x4c\xa6\x3b\x13\xf9\xce\x64\xc2\x33\x91\xf1\x4c\xa6\x3c\x13\x39\xcf\x64\xd2\x33\x91\xf5\x4c\xa6\x3d\x13\x79\xcf\x64\xe2\x33\x91\xf9\x4c\xa6\x3e\x13\xb9\xcf\x64\xf2\x33\x91\xfd\x4c\xa6\x3f\x13\xf9\xcf\x64\x02\x34\x91\x01\x4d\xa6\x40\xe3\x39\xd0\xb8\xe6\x5d\x7c\x2d\xcd\x1f\xf0\xb1\xe2\x33\xb7\x4f\xc1\x9e\x65\xff\x21\x52\xab\x89\xdc\x6a\x32\xb9\x9a\xc8\xae\x26\xd3\xab\xf1\xfc\x6a\x60\x09\x03\xbd\xd1\xd9\xd9\xc5\x27\x13\xac\x85\xad\x5d\xf3\x5a\xd9\x6e\xa3\x1b\x3c\x25\x0b\xae\x08\x51\xd8\x61\x33\x09\x37\x22\x25\x97\x60\x6c\xd0\x7d\xe4\x52\xa4\x03\xf1\x3b\x65\x0c\x08\x97\xdb\x41\xe3\x51\x58\x15\xad\x19\x30\x03\xcb\x84\x7a\x1e\xa4\xfa\x23\x12\x4e\x25\x08\xa9\xa8\xf5\x84\x59\xc0\xe4\x5e\x58\x89\x65\x7d\x64\x1c\xd4\xcd\x94\xe6\x42\x39\xc2\x50\x78\x4e\xca\xd9\x72\xc1\x48\x34\x0c\xe2\xcf\x47\xcd\xad\x39\xf7\xcf\x51\x07\x12\x50\x18\x56\x6a\x30\x36\x1a\xf8\x22\x57\xe6\x30\x65\x39\xaa\x46\x96\xc3\x95\x9f\x79\x98\x2d\x23\x5a\x19\xbb\x9b\xf1\x88\x40\x4f\xa8\x15\x2d\x99\x04\xcb\xa1\xd1\x5b\xee\x08\x62\xc5\x24\xac\x8b\xb2\x62\x12\xe8\xa3\x36\xbf\xc4\x9b\x9e\xc4\x56\x5e\xe4\xfb\xc0\x3b\x71\xd5\x29\xeb\x99\x92\x48\xa8\x1e\x9a\xd9\x63\x7b\xd1\x08\xa6\xe4\xfe\x69\x91\xb8\xa6\x25\x07\x24\xa2\x36\x88\xe9\x19\xf1\x0e\x4d\x0e\x8c\x37\x94\x06\x41\x03\x38\x6b\x6a\x68\xa1\x48\x1e\x89\x2f\x8b\x98\x74\xd7\xac\xb7\x26\x2b\x3e\xea\xb0\x65\xf7\xf4\xd0\xd0\x21\xee\xcf\x26\x56\x13\x44\xd0\xc2\x22\x16\x1c\xd7\x2b\x7e\xc8\x4a\xd8\x06\x43\xf5\x80\xd1\xcb\x93\xba\x28\x2d\xc8\x48\x05\x23\x57\xa5\xec\x93\xd4\x28\x38\xb4\x87\x0f\xa5\x97\xc7\x7b\xc0\x90\x16\xe2\xbd\x2d\x63\x93\xd5\x1c\x52\xef\x48\xff\xc6\x20\xb7\xb0\x8a\xf7\x0c\x53\x70\x42\x80\x78\x30\xa0\x38\x23\x20\xce\xdf\xd0\x2c\x83\xbf\x6c\x67\x11\xad\x1b\xcb\xfa\x60\x8c\x07\xcc\x5f\xd9\xca\xa2\x60\x93\xa9\x0b\x3e\x30\xdf\x12\x96\x3f\x75\xc0\x09\x18\xf0\x16\x87\xd3\x7d\xb5\x2e\x97\xad\x37\xd5\x6b\x05\x1b\xfb\x4d\x5a\x09\xd3\x9d\x26\xfd\x70\x71\xff\x6e\xd3\x50\x30\x50\x62\x57\xac\x27\xf8\x60\xd2\x52\xed\x81\x19\x83\x1d\x86\x14\xc8\xb2\xa2\x11\xdc\x80\xce\x75\x24\xa6\x35\x5c\xdd\x05\x69\x36\x1f\x83\x84\xf8\xd8\x38\xa7\xc1\xd8\x93\xb4\xfa\x40\x2b\x5a\x5e\xf3\xcb\xf8\xd0\x46\xf1\x21\x32\x6e\x0d\xcc\xce\x80\x1f\x8b\xec\x1d\x50\x0a\x71\xe7\x48\xeb\x07\xeb\x31\x98\xb9\x59\xd9\xe5\xf8\x4a\x98\xa4\x77\x99\x34\x6f\x14\x9d\xed\xba\x4d\xbb\x43\x51\x98\x37\xed\x64\xd1\xbb\xdd\xaf\x76\xcf\x67\x97\xb5\x86\x20\x50\x66\x6b\x58\x0f\xd1\x98\xdf\xd8\x51\x26\x78\xed\xcb\x2d\x6e\xb6\xd8\x15\x3c\xf3\xae\x27\x38\x04\xe9\x63\x0d\x93\xa7\x66\xee\x65\x18\xd2\x45\xad\xe3\x27\x9f\x27\x5f\x83\xa4\xf4\x57\x02\x16\x2f\x15\x46\x77\xbd\x48\x18\xd8\xf5\x22\x61\xc1\x6f\x0d\x42\x7e\x89\x32\x74\x78\x1a\x97\x23\x96\x19\x59\xd5\x6a\x1e\x14\x99\xf9\xa6\x36\x63\x1b\xcd\x42\x91\x34\xd1\xd1\x19\xab\xc3\xbf\x41\xb7\x4e\x6c\x57\xa5\xe4\x42\x8d\xa2\x71\x50\x39\x70\x4f\x5c\x84\xf6\x8d\x7e\x1e\x38\x7b\x7f\x07\x05\xf5\x55\xed\xd1\x22\xf4\x7e\x99\x2f\xc0\xeb\x6d\x5b\x60\xef\x15\xf3\xd6\xeb\x4e\x7d\x57\xea\xec\x6b\xd5\x4f\xd2\xcc\xe1\xd3\x38\xbd\xb5\x30\x57\xaf\x1a\x9a\x15\x91\x8e\x79\x8c\xac\x6f\x5d\x5f\x5f\x1a\xfe\x06\x96\x6c\xd0\x2e\xef\xb9\x29\x65\x22\xe4\xfe\x2e\xac\x84\x49\x53\x80\xb3\xa1\x6c\x2a\x7a\xa8\x0a\x23\x58\x82\xc7\x01\x3e\xbd\x88\xb5\x35\xe6\xfe\x13\x7c\x69\x80\xb1\x4e\x85\xb7\xa8\x50\x86\xb3\x76\xc0\x1e\x54\x23\x61\x3f\xd4\xe8\x1b\xc7\x82\x01\xe8\xde\xe1\x58\x61\xc7\x40\x91\xb3\x63\xf9\xa7\x8b\xd3\xb7\x96\xbc\x35\x28\xfd\x88\x16\x65\x7a\x4d\x6a\xaa\xfb\x0e\xf1\xad\xb2\x81\xc1\xf6\x7b\x0a\x9d\x70\x86\xa3\xf5\x35\x6a\xcc\x6c\x38\x55\xdb\x4b\xa8\x8b\x6c\xfa\x1e\x30\x4d\x96\xbd\xfb\x40\xd9\xe9\xd2\xaf\xaa\x79\xa1\x59\x47\x49\x64\xe1\xe6\xd5\xae\x0a\x89\x1b\xc9\x3b\xca\x20\xe3\xa5\x4e\x6d\xf3\x92\xa1\x96\xe9\xbc\x64\xd4\x36\x2f\xf5\x2b\x75\x3a\x6f\xf7\x37\x6b\xc0\x6c\xd3\xdd\x74\x00\x6d\x6b\xd8\x80\xea\x53\xd4\x74\xc0\xf4\x35\x12\x93\xce\x70\xac\xa3\xdc\x95\x46\xd4\x03\xc6\x59\xe4\x16\x89\xc0\x28\xae\x19\xbd\xc1\x9e\x03\x1e\x3d\x55\x8d\x00\x69\x97\xa5\x30\x79\x57\x05\x6b\xcf\xd0\x6d\x0e\x4c\x33\x83\xc2\x70\xef\xcf\x45\x51\x55\x69\x90\xd1\x73\x21\x71\x00\xdf\xfe\xa7\xf0\x44\x60\xef\xd2\x1c\xa0\x84\x04\x84\x58\x02\xbe\x40\xe0\x2d\x00\xe6\xc0\x83\x03\x8e\xbe\xc2\x73\x06\x0c\x35\xba\xd9\x8f\x13\x2c\x25\xd1\x9e\x83\x44\xeb\x75\xf1\x83\xab\xc7\x0e\x0e\x34\x4b\x6e\x4d\xca\x84\x72\x59\x85\xde\x72\xa3\x50\x96\xe6\x33\xc1\x21\xfd\xb9\x28\x29\x23\x53\x7f\x82\x3f\x18\xef\xa5\x5a\xe5\xe1\x7d\xb0\xdf\x15\x35\xf5\xd8\x67\x97\x82\x27\x91\x36\x1e\xee\x1a\xc0\x64\x8b\x45\x49\xaf\x69\x5e\x57\x56\x5a\x73\x99\x2c\xa0\xec\xb3\xbb\xe6\x42\x09\xb3\xe0\xe4\x27\xcc\x52\xc6\x41\x55\x69\x44\xad\x80\x86\x44\x1a\xa3\x82\xb2\xb8\xa9\x68\x59\x59\x84\xf5\x99\x87\x45\x5e\x81\xaf\x4e\x3d\xb2\x4e\x84\xd8\x71\xc3\x26\x37\xcb\x2c\x71\xc3\x72\xc4\xbf\x45\xde\xb2\xdd\xfa\x3d\xac\x05\xc4\x56\xdf\xd6\x20\x24\x8b\x7a\x59\x52\xef\x5e\xdc\x16\x4d\xa5\x13\x42\x77\xb3\xaf\xb7\x82\x2f\x32\x31\xb8\xfe\x7d\x25\x5b\x19\x2e\x0b\xde\xd6\xdd\xd1\x34\x2f\x15\xe0\x9e\x06\xbb\x82\x9b\xd8\xdd\xda\x02\xfc\xda\xb7\xd7\x8a\x8c\x94\xdb\x1b\x14\x37\x39\xc3\xab\x87\x4c\x5b\x54\x92\x24\x79\xc8\x67\xc5\x45\x39\x7f\x57\xfc\x4a\xb2\x14\xae\xb2\x6e\xeb\x9b\x5f\xeb\xdd\x5a\x9d\x15\xc5\xe2\x3e\xf4\x7e\x45\xc0\x27\xcd\xb7\xfe\xe4\x21\xb9\x54\x7a\x4d\x30\x51\xb2\x73\x8c\xdf\x7c\x89\xd8\x69\xfa\x27\xaf\x54\xd1\x83\x58\x1b\x09\x48\x4e\x92\xd8\x69\xad\x90\x89\x7f\x72\x0c\x95\x2f\xfe\x2d\xa4\x99\x2f\xeb\xbf\x89\x66\xf9\xd7\xa7\xad\x58\xdc\x33\x69\x8b\x8c\xac\xaa\x93\x3c\x4b\xf3\xed\x00\x4a\x4a\xa2\xb3\x3c\xdb\xbe\x95\xa4\xb7\xd4\x3d\x0d\xae\x69\x59\xdd\xd7\xa0\xb8\x79\xc0\x6e\x29\x45\xea\xab\xee\x51\xc8\xeb\xab\xb0\x58\xdc\xd3\x49\x45\xc9\x3c\xa3\xd5\xf6\xdd\x23\x11\xe2\x6f\xad\x40\x95\x7e\xa1\x5f\x1f\x3a\x0f\x87\xb2\x6d\xe0\x8c\xb0\x2f\x17\x8b\xa2\xe4\x74\x7c\x51\x16\xd2\x02\x58\xd2\x64\x99\x71\xcb\xab\x25\x9c\x12\x2b\xeb\x3a\x25\xd6\xaf\x87\x70\xb2\x44\x56\x95\x15\x75\x65\x39\x56\x35\x25\x51\x71\x63\x45\xc5\xdc\xe2\x36\x8f\x4a\x4d\xd5\xbd\x03\x5b\xd0\x8c\xe7\x1b\xff\xda\x2e\x3d\x38\xb0\xc0\xa9\x4f\xa9\x12\xe8\xed\x22\x4b\xc3\x94\x49\xcc\x8c\xfd\x13\x9c\x66\xe3\x25\xc1\xce\xd9\x91\xe0\x26\x43\x79\x27\x45\xed\x22\x7a\xbb\xa0\x21\x13\xc3\xc1\xe9\x4a\xf3\xa0\x91\x5e\x58\x63\xd5\xed\x2f\x94\x2e\xd8\x89\x23\x7a\x68\x14\xcf\xf2\x28\x49\xc1\x79\xdc\x50\x59\x53\x98\xc9\xf3\x5f\xdf\xf0\xed\x58\x93\x80\xe7\x1e\xd3\xc0\xa6\x35\x9d\x9f\x33\x94\x61\x2f\xb3\xd6\xec\xbf\xd3\x34\x2c\x0b\xc6\x84\xcb\x15\x19\xa9\x8f\xa7\xd4\x12\x19\x2f\xab\x70\x4a\xe7\x04\x32\x5e\x46\x45\x58\x1d\x24\x15\x64\xe2\x81\x96\x0a\xea\x7d\xb4\xa8\xe3\x90\x07\x73\x5a\xd5\x64\x65\x7c\xe4\xbe\xf1\x95\xf5\x94\xae\xc0\x02\xdc\x10\xa2\x18\x14\xfe\x6d\xcf\x95\xca\x72\x98\x50\xd0\xe3\x3d\x42\xb3\xe2\x86\x63\x07\x01\xc1\xed\xd5\x94\x94\x15\xad\xd5\xac\x84\x19\xa9\x2a\x6e\x5f\x15\x25\xec\xbb\x8e\x8b\x52\x7b\xae\x17\x47\x9f\x97\xe9\xb5\x3e\x93\x2f\x9b\x0f\x01\x9a\xd8\x76\x0a\x51\x28\xd3\xb8\xa3\xb4\xd7\xb2\x99\x65\xee\x02\xc2\xc5\x03\x69\xf7\xe2\x6a\x20\xe5\x9d\x08\xac\x03\x9d\x92\xeb\xb4\x28\x85\x73\x02\x18\x09\xb7\x21\x30\x93\xce\xd8\x60\x7b\x1c\x97\xee\xfa\x66\x63\x97\x3f\xef\x87\xbc\x60\xb7\x33\x39\xbb\xf0\x7b\xb7\x35\x45\xbb\x71\x51\xee\x76\xa6\x69\x97\xfd\xde\x67\x24\xf2\x7a\x57\x1b\x48\xc7\xd3\xe6\x4e\xff\x92\xc6\x17\x05\x82\xc8\x98\xea\x0d\x53\x53\x62\x28\x4a\x34\xf9\x37\x6f\x22\x0b\x34\x6a\xa2\x5d\x78\x6b\xd7\xed\xb3\x23\xbd\x03\x7d\x86\x05\xc1\x4e\x2a\x70\x03\x93\x0c\x60\x5d\x52\x52\x83\x87\x2d\xd7\x2a\x73\x6f\x39\x70\x8e\x63\x9b\xae\xb2\x52\xcd\x48\xf3\x6a\x5a\x16\x73\x3a\xb2\xde\xd2\xda\x62\x74\x7f\xc5\xc4\xb6\xc4\xe2\x61\xc6\xb8\x8f\x37\x5b\x3f\x3e\xfc\x06\x71\x49\x25\x5c\x93\x46\x0d\x28\x36\x73\x95\x77\x70\x90\xa4\xf5\x74\x19\x8c\xc2\x62\x7e\x10\x0b\xbf\xfd\x03\x30\x15\x1c\xa4\x55\xb5\xa4\xd5\xc1\xf3\xc7\xdf\x3e\xf9\x1f\xf0\x3b\x2c\xe6\x6c\xa0\xfb\x8f\x9f\x3c\x1b\x3f\x7f\xfa\xe4\xf1\x33\x6d\xc6\x60\x46\x18\x3f\x0c\xde\xf4\xea\xd2\xc4\x7a\xcd\xe7\xca\x08\x73\x27\x27\x0a\xe4\x6f\xd0\xb9\xe8\x53\x0c\xed\x0d\xe5\xb7\x68\x8f\xac\xdd\x5d\x6b\x4f\x2c\x97\x9a\x64\x4b\xc4\x72\x12\x43\x80\x00\xac\x69\xbd\xb2\x86\x43\x6b\xc7\x28\x19\x05\x24\x3a\x61\xf3\xcf\xaa\xa0\xc6\xb8\xcb\x32\x22\x86\x77\x3a\xfb\x0a\xd6\x48\x1f\x19\xd8\x03\xf3\xdd\x5a\x4e\x35\xc9\x75\xbf\x3f\xd0\x93\x31\x76\x01\xc2\x54\x53\x7e\xf1\x23\x20\x91\xfe\x3a\xac\xff\x48\x2c\x23\x77\x8c\x0e\x33\x4a\xca\x66\xd5\x46\xd6\xcb\x28\x4a\x19\x0c\x92\x65\x2b\x64\x45\xac\x43\x1d\x04\xd7\x1d\x50\xc6\xfd\x0b\x6c\x6a\xbc\x57\x80\x8f\x47\x8d\xfe\x54\x76\x34\x4f\x93\xa9\x01\x84\x51\x80\x85\x55\xc4\xb1\x55\x97\x24\xcd\x18\x0e\x45\x34\x4c\xe7\x24\xb3\xc0\xe3\xbb\x02\x69\xab\x91\x25\x96\x15\x2d\x77\x2b\x1d\x42\xb8\x2c\x2b\x76\x9c\x82\x4e\xbb\x00\xf1\xe4\xaf\xe5\x7c\x21\xc5\x94\x80\x26\x69\x0e\x17\x1a\x84\x69\x83\x7f\xb9\x06\x41\x07\x76\x92\x2b\x07\x6b\x58\x21\xc4\x24\x13\xf8\x22\x92\x5b\x45\xfe\x63\xb6\x2c\x2d\x10\x8e\xf8\xb7\xc2\xbc\xd5\x65\x9a\x24\xb4\xd4\xc1\x80\x04\xaa\x76\x37\x49\x48\x9a\x73\xc5\x35\xcc\x0b\x5c\x38\x29\x2a\x6d\x10\x7f\x13\xd3\x5a\x16\xce\xfb\x04\x6e\xb8\x3c\xf1\x20\x91\x1b\xc0\xbc\x93\x2e\xde\xb7\x90\x11\x91\x93\xb5\xbe\xec\xcf\xac\x1a\xa8\xe0\xed\x3c\xeb\x6d\xf6\xcf\xd3\xb7\x3c\xf7\xb5\xf2\x88\xdc\x1d\x68\xda\xf2\xc6\xb5\x5f\x2a\xad\x98\xf8\x77\xfe\xeb\x1b\x43\x96\x67\x73\x9c\x53\xc6\xff\x34\x42\x6a\x9a\x27\x08\x74\x52\x02\x2e\x7b\xb6\x8a\x52\x1d\x22\x82\xe4\xc0\xc6\xd0\xd5\x53\xff\xbe\xbe\xe0\xd1\x7f\x42\x5b\xf0\xa8\xa3\x2b\x80\xd1\xb1\x2f\xd7\x0e\xd8\xb7\x69\x55\x83\x05\x45\x12\x47\x6d\x66\x2f\x3e\x1c\x9c\xff\xfa\xe6\x80\xd4\x35\xa4\x46\x14\x4c\xc9\x23\xeb\xfc\xf4\xe4\xad\x75\xbe\xa0\xe1\x3d\x2f\x56\xf3\x34\x1b\xe8\xb6\x60\xb6\xde\x97\x70\x12\xe6\xf5\xfe\x14\xf2\xbe\x32\xa4\x23\x99\x98\xbd\xfd\x80\x54\x94\x09\x0e\x50\x5a\x92\x20\x0d\x21\xcf\x21\x7b\x94\x55\xfb\xd5\x34\x8d\xe1\xb5\x90\x2c\x34\x20\x61\x96\x2e\xf6\x17\xa4\x9e\xaa\x87\x72\x99\x01\x20\x9e\x83\x11\x74\x91\x8b\x22\x03\x42\xb5\xa5\x78\x3f\x4e\xb3\x9a\x96\x55\x53\x2d\x32\x37\x36\x05\xca\x34\xcb\x8a\xa2\x62\x9e\xe6\xa4\x35\x6e\x6e\x0a\xdf\x0f\x48\x38\x4b\xca\x62\x99\x47\xac\x30\x4e\xb3\x6c\x5f\xe4\xb7\x55\xcf\x72\x80\x90\xa1\x76\x1f\xe0\x37\x8f\x7a\x63\x9e\xdc\x71\x9e\x66\xcd\x23\x93\x11\x8c\x87\x7d\x12\xfd\xb5\xac\xea\xa6\xac\x2e\x69\x1d\x4e\xb5\xe7\x55\xd6\xbc\x21\x3c\x88\xd4\xf3\x8d\x9a\x47\xc8\x15\x09\x59\x24\x9b\xa7\xa2\x4c\x69\x2e\x92\x5b\x4e\x8b\x32\xfd\x52\xe4\x35\xc9\xfa\xeb\xaf\x69\x59\xa7\x21\xaf\x85\xb6\xfb\x24\xba\xde\xbf\x6d\x1e\x8b\x32\x4d\xd2\x9c\x97\x40\x84\x76\x73\x4e\x33\x5a\xd7\xb4\xdc\x17\x9b\x0d\x4a\xd8\xd0\xd2\x3c\x69\x66\x68\x4e\xca\x19\x2d\xf7\x29\x9f\x5b\xf1\x34\x4f\xf5\x27\x90\x8e\xd8\x33\x78\x3c\x31\xbc\x91\x34\xdb\x28\xac\xa7\x69\x38\xcb\x69\x05\x4b\xbe\x20\x69\x5e\xef\x43\xea\x61\xfe\x98\x17\x15\xdd\x3f\x84\xdf\x05\x20\xca\x3e\xd7\x55\xb1\x12\x35\x68\x40\x21\x3e\x95\xd5\x94\x2c\x5a\x9f\x53\xd5\xc5\xa2\x19\x38\x3c\x69\x2b\xcb\x0e\xa4\x19\x15\x79\x09\x8d\x11\x9a\x35\xc6\x30\x79\x96\xe1\xfd\x48\xa6\x2c\x6e\x95\xf1\xd8\x80\x5a\x21\xfb\xd0\x90\x2c\x5a\x25\x7f\x15\x69\xae\x15\xcd\x55\x66\x63\xad\xd0\x1c\x29\x2b\xb9\x49\x23\xbe\xc3\x6a\x7a\x5b\xef\xf3\xf0\x8a\xea\x31\xa2\x61\x51\xaa\xfd\x05\x45\xc6\x5c\xc0\x75\xc7\xce\x5a\x34\xa5\xc6\x57\x2e\xf3\x34\x2c\x22\xba\x1f\xa4\x51\xaa\x3f\x43\xdc\x47\x51\x50\x57\xfb\x0b\xb6\x28\x40\x20\xae\xf7\x49\xb6\x98\x92\x80\xd6\x69\xc8\x9f\xa7\x24\x4f\x44\xd7\xd7\xfb\x69\x44\x8b\xa4\x24\x8b\xa9\xac\x9d\x13\x46\x6b\x89\x42\xd6\x6b\xb8\x4b\xb9\x4f\xe3\x98\x86\x35\x2f\x28\x6b\x40\xde\x95\x7a\xd2\x71\x57\x2f\x80\x16\x37\x45\x19\xe9\x78\x7b\x53\x42\x6e\xc2\xfd\x79\x11\xc1\x80\x6f\x35\x6a\xc5\x4f\x3c\x12\xd6\x4b\x52\x53\xad\xa0\x0c\xcb\x22\xd3\x0a\xa6\x25\x8d\x9b\x27\xb3\xae\x9a\x16\x37\xcd\x53\x9d\xd6\x7a\x25\xe3\x49\xe1\x69\x9e\x79\x8c\x3a\x89\xdf\x79\xe5\x89\xd3\x94\x57\x65\x84\x8f\x95\xfd\xe6\xe7\xe6\x95\x38\xe3\xcf\x7f\x7d\xb3\x4d\x1f\xde\xa3\x6e\x5e\xd6\xc5\x07\xae\x91\xd9\x2e\x32\x7d\x73\xc8\x05\x19\xe9\x3a\xf2\x81\xf2\xeb\xaa\xd5\x07\x43\xd9\x73\xdf\xab\x0b\x61\xaa\x79\xc9\x56\xfa\xbe\xe6\x5f\x17\xcf\xf4\x11\xef\x6a\x4f\xbb\x5f\x1d\xe4\xee\xd6\xba\xdd\xde\x51\xee\x1a\xcf\xbb\x5b\x87\x26\xee\x91\xf0\xf1\xc1\x2a\xbd\xe4\xf8\xe1\x59\xef\xce\x47\x50\x80\xb4\x3a\x8e\x2a\xbd\x75\x3f\x95\x34\xee\xad\xf8\xb0\xed\x8d\xf3\x69\x71\xd3\x5b\x71\xc1\xd0\xaa\xbf\x66\xb5\xe8\x56\xcc\xb3\x1f\x49\x25\x8a\xe7\x99\x2a\x7c\x4b\xf2\xa4\x53\x78\xce\x3d\xb2\x79\xa9\xc1\x5f\xbe\x7a\x79\x7a\xf4\xf6\xe4\xf7\x23\x0b\x5b\x07\x97\x7f\xec\xff\xe1\x5d\x39\x97\x64\xff\xcb\x95\x7b\x90\xc8\x2b\xa1\x8b\xb4\x86\x2b\x27\x16\xd6\x04\xdb\xba\x98\xd1\xdc\x30\xcf\x41\xc9\xe5\xe1\x95\x99\x22\xdd\x87\x9e\x80\x23\xe9\xe4\x57\xb7\x1c\xbe\xa7\x49\xd6\xc4\x04\x00\xc1\x50\xf8\x94\xca\xda\x91\xb8\x25\xea\xc8\xc1\x22\x6d\x54\x2e\x78\xa8\xf6\x6d\x21\xed\x8a\xc6\xa5\x02\x7b\x65\x61\x6b\xec\x6f\x7b\xa3\xeb\x08\x6b\xbc\x28\x07\xe4\x0f\x36\xac\xdb\x86\xfd\xde\x76\x63\xa1\xd7\xd4\xe5\xfa\x0f\x78\xb3\x6f\x78\xae\x7e\x2d\x1c\x92\xac\x7c\xac\xd3\xac\x6a\x4c\x67\x1f\xc5\x65\x59\x08\xfe\x02\x92\x7e\x3a\x5f\x66\x4c\x96\x23\x56\x5d\xae\xf6\x21\xfc\x36\x93\x4e\x3e\x85\x64\x99\x4c\x39\x8c\xc6\x51\xff\xd3\x94\x54\xaf\xf4\x0a\xee\xf4\x3c\x30\x81\x73\x31\x89\x5f\xc0\x05\x8f\x54\x6e\x8a\x39\x28\xe1\x08\xe5\xea\x1d\x88\xc6\xc7\xef\xeb\x42\x77\xa2\xae\xa7\xbf\x0f\x46\x4d\xd3\xa1\x9a\x21\xb9\x4b\x79\x41\xf3\xd5\xba\x96\x45\xde\xe8\x68\x6a\xb5\x6b\x28\xd2\xc7\xa4\xdb\x68\x94\xe6\xd7\xc5\x8c\xbe\x59\x92\x32\x6a\xa2\xbd\xb5\xc2\x3f\xf4\xba\x81\xef\x9e\x08\x60\x56\x2f\x08\xc7\x6d\x5c\xe0\xd4\x30\xcd\x8b\xbd\x42\xaf\xd1\x3f\x80\x07\x8f\x55\xf3\x89\x35\xef\x45\xb2\x06\x5a\xdf\xd6\xcd\x34\xcd\xa8\x95\xb0\xb7\x41\x76\x61\x92\xab\x5c\x21\x25\xdf\x2f\x16\x34\x57\x96\xfa\xb4\x16\xf7\xd2\x44\x5e\x72\x26\x28\xf3\x0b\xd8\x69\x6c\xa5\xb5\xb8\x2d\xad\xab\x02\xe0\xbe\xe2\xa0\xb9\xf3\x75\x02\x5e\x1c\x22\xe4\x01\xe2\xd2\x18\xfb\xff\x7c\xc1\x35\x20\x70\xad\x0d\x46\xa3\x21\x27\xc4\x22\x29\x29\xa9\xd8\xa0\x69\xa3\x9c\x78\x04\x57\xe0\xb4\x96\x22\x24\x43\xb6\xb2\x20\x18\x83\x90\xdb\xb9\x37\x7e\x75\x43\x16\x16\x77\x13\x53\x5a\x56\x0e\x44\x75\xce\x95\x28\x69\x6e\xbd\x3e\xfa\x95\x89\x78\xb4\xef\xb6\xda\xb9\xe6\xe5\x20\xd5\x0c\x30\x87\x0c\xef\x97\x15\xd7\x52\x67\x45\x92\x80\x1a\xa2\xb4\x22\x1a\x2c\xe1\xc1\x04\x23\x03\x1e\x6c\x60\x3d\xe0\x0b\x9b\x54\x30\x85\x40\x02\xf3\x95\x47\x1b\x65\x1b\xbe\xe0\x17\xe3\xe0\xb7\xe8\x16\x54\x0e\x21\xc9\x32\xe9\x7a\x2d\xc1\x99\x40\x46\xa3\xd1\xa3\x8d\x45\xca\xa4\xb2\x5e\xca\x88\x78\x5c\x55\xae\x37\xe7\xb7\xea\x7a\x90\xcb\xd0\x63\x82\x83\x1a\x7b\x46\x72\x30\xc8\x22\xc8\x0a\x90\x15\x22\x2b\x42\x16\xab\x75\xd5\x56\xed\x81\x36\x22\x8b\x45\xb6\x72\x5a\xb4\x0b\x59\x2a\x56\x1f\xa8\x41\x5a\x68\x7c\xce\x26\x9e\x54\xfd\x10\xf9\xe5\x09\xcd\xc1\x95\x1f\x44\x5c\x36\xe7\xb8\x8a\x18\xa6\x42\x62\x97\x6a\x20\xef\xc9\xa6\xb9\x45\xac\x24\x2b\x02\x92\x31\xbc\x49\x6b\xe9\xb6\x28\x88\x54\xce\x88\xdc\x9f\xe2\x41\x23\x87\x7f\x5a\x8c\x92\x96\x62\x57\x5c\x9c\xbd\x3e\xf3\xc0\xaa\x90\xc6\x06\x39\x05\xbd\x80\x41\xf0\x94\x5b\x64\x0e\xca\xf3\xff\x87\x68\xed\x85\x7c\x99\x47\xaf\xd8\x96\x86\x60\xaf\xf2\x24\xf8\xd7\x50\xaf\x85\x5e\xfd\x54\x53\xa0\x22\x23\x48\x6d\xfc\xe3\xaa\xe6\x36\x14\xf3\x5c\x74\xb4\xdb\x20\x10\xc2\x03\x16\x19\x77\xfa\x06\xbd\xab\xf1\x9e\xaf\xa9\xb3\x77\xda\xcd\xdb\xa7\xa1\xae\x17\xfe\x5a\x5b\x0b\x6b\x3e\x89\xbd\x2f\x94\x66\x6b\x18\x73\x8f\xde\xd1\xdc\x7e\xaf\x97\x60\xc6\xa1\x32\x22\x0c\x43\xcd\x84\xcf\xa5\x5a\xa0\x8a\x11\x5d\xae\x67\xe6\x8c\x40\x9b\x01\xe0\x37\x47\x38\x40\xd9\x54\xf1\x0a\x05\xdb\x18\x53\x92\x47\x59\x13\xae\xa3\x2e\x16\x56\x46\xaf\x69\x26\xde\xe7\xd5\x65\x73\x07\xb8\xbb\x37\x75\x7c\x69\x39\x12\x76\x1b\xff\x1d\x4a\xd4\xe1\x88\xb6\x75\xd3\xb7\x42\xda\x9b\x0d\xc4\x36\x56\xf4\xc1\xec\xc3\xc1\x16\xc0\x87\xa1\xa0\x4e\x98\xe4\x6a\xdf\xd7\xc6\xc2\xc2\x69\x74\x3b\xda\xbd\x32\x5a\x2b\x7f\x56\x6d\x2a\x34\xdc\x12\xb6\x93\xbb\x86\xdd\x69\xf1\x51\xed\xd9\x80\x98\x2a\x8c\xe0\x30\x74\x80\xab\x71\x12\x89\xa0\x1c\x10\x2c\x12\xb7\x99\x04\x37\x52\x59\x59\x3a\xa3\xd9\x8a\x1b\x13\x00\x8b\x88\x15\x2c\x21\xe5\x9d\x88\xc7\xf2\x3e\xa3\x84\x11\x51\xc6\x03\x91\xdc\x02\x53\xd3\x48\x9a\xd1\x4c\x7d\xfb\x36\x8e\xec\x5f\xa2\x47\x7f\x63\xfe\x1e\xb8\x2a\x10\x5c\x68\x99\x87\x2f\x19\xad\xc5\xd6\xcb\xb2\x24\x2b\x2d\x26\x2c\x78\xa8\x8e\xd8\xfc\x39\x0a\x9b\x91\xf5\x04\xbe\xb4\x2e\x57\x62\x21\x18\x00\xb1\x09\xd4\x07\x48\xa0\x1c\xf7\x2d\xce\x62\x39\x54\x47\xb5\xaf\x0c\x51\x5b\xf6\xaf\x7f\x77\xe3\x35\xcc\x26\x5e\x88\x2f\x27\x0d\x37\x06\xf6\x19\xc5\xc6\xf5\x2f\x0a\x3b\x60\x1a\x37\x37\x11\xcc\x52\x7a\xff\x91\x9a\x7b\xc7\x58\xf3\xa2\xa4\x56\x9e\x86\x0c\x43\x54\x70\x0f\xe1\xb9\xb6\x5b\x59\x32\x6a\x26\x67\x3c\xd3\x88\x12\x86\x51\x75\xa1\x34\x0b\x1c\xa0\xfd\x1e\x2c\x55\x45\x6e\xd1\xdb\x90\x82\x07\x52\x65\x2b\x2b\xf6\xc8\xfa\x51\x58\xf9\xb9\xbf\xc4\x4d\x49\x16\x70\xdb\x0e\xcc\x5a\xfb\x8b\xb2\xb8\x4e\x23\x1a\x0d\x0c\x07\x71\xc6\xd5\x6c\x63\x6c\x18\x0f\x21\x6e\x56\x08\xfe\x59\x7e\x9f\x55\xc4\x03\x61\xe8\xeb\x9b\x93\x65\x05\x81\x4d\x14\x97\x8c\xd4\x28\xb4\x81\x83\xbf\x1e\x58\x85\xe5\x98\xd8\x0e\xb2\xf8\x72\x6a\xed\x9a\x71\xc8\x59\x12\x41\x46\x16\xf0\xad\xcb\x3c\xa3\x15\xbf\x4d\x28\x02\xb8\x81\xb1\x8c\x4d\x3f\xc4\x57\x81\x90\x4d\xb7\x75\x49\xac\xaa\xa6\x0b\x76\x76\x80\xbe\x1e\x2e\xbe\xcb\xd9\xec\xf4\x39\x92\x16\x24\x0e\x69\x99\xd7\x69\x5e\x2f\xc1\x27\x84\x89\x10\xc5\x32\x99\x22\xe5\x53\xc1\x44\x51\x51\x28\x66\x7e\x0a\x64\x02\x60\xaa\x88\x51\x08\x9c\x1d\x1b\xb7\x50\x35\xd8\xdd\xca\x5a\xd0\x92\x21\x90\x04\x4f\x1b\xa2\xb2\xcc\x39\x9c\xd1\x40\xd8\x12\x0f\x0e\xac\x8b\x06\x2d\xc4\xd7\x2d\xb8\x14\x78\x3f\x7a\x20\x25\xc9\x70\x21\x46\x0c\x45\x49\x32\x5c\x0a\x51\x4e\x93\x1c\xf7\x57\x79\x38\x2d\x8b\x1c\x42\x2f\x59\x51\x5a\x2d\xa0\x29\xb1\x62\x32\xa3\xd2\x54\x59\x88\x67\x0e\x50\xde\x36\x43\xc2\xb4\x9a\x65\xca\xb2\xaa\x50\x10\x8a\xf9\xee\x29\x8b\x39\x63\x9e\xd3\x08\x68\x22\x87\x28\x8e\xda\x81\xba\xaf\x09\x1b\xa9\xe9\x72\x24\xdd\xba\x15\x18\x29\x06\x1a\x73\x67\x4b\x4a\x6d\x73\x09\x8f\xc3\x53\x5c\xb7\xd1\xd7\xc8\xfa\x71\x69\x78\xc9\xa8\x53\x9f\x8b\xa3\xc0\xae\xeb\x52\xdc\xc1\xc1\xff\xc7\xde\xdf\x77\xb7\x71\x23\xf9\xe2\xf8\xdf\xf1\xab\x80\x3d\x59\x93\x4a\x28\xca\x4e\x76\x67\x27\xd4\x68\x7c\xf5\xe4\x44\x37\xb1\xe5\x6b\x2b\xe3\xdd\xeb\xf5\x11\x41\x36\x48\xf6\xa8\xd9\xe0\x34\x9a\xa2\x39\x13\xbf\xf7\xdf\x41\x55\x01\x28\xa0\xbb\x29\xd9\x49\x7e\xf7\x9c\xfd\x6e\xfe\x88\xc5\x6e\xa0\x1a\x8f\x85\x42\x3d\x7c\x8a\x08\x14\x5a\xaf\x02\x07\xce\x6b\x91\x69\xc2\x4d\x01\x03\x42\xb5\x5e\xd5\x0c\x33\xc5\xee\xa5\xb9\x95\x56\x67\x85\xde\xe0\xa4\x8a\x73\x50\x40\xe7\xb7\xaa\xd8\xd2\xfd\x74\x9e\xdf\x2a\x23\xd6\x86\xcd\x8e\x9b\xc5\x10\x7b\x34\xad\x11\xde\x8c\xf5\x8d\x5d\x60\x5f\x2a\x59\x3f\x24\x9d\x09\xb8\x66\xe1\x20\x32\xb6\xe3\x9c\x93\x70\x8b\x1c\xbf\xba\x00\x19\x0a\xec\xa1\x56\x4a\x77\x57\x54\xa1\xd7\x95\x63\x6f\x34\xc3\xe7\x7f\x65\x7c\xa0\x9d\x05\x50\x68\x05\x29\x3d\x10\x01\x13\x3d\x26\x42\x1c\x0c\x43\x9a\xa4\x44\x54\x6e\x81\x01\xe2\x5e\x0a\x80\x19\x4a\x3b\x04\xce\x1d\x04\x93\xbc\x4d\x6d\x04\x39\x1e\x8b\x5d\x5b\x04\x94\x97\xd6\xc4\x51\xe8\xf7\x40\x05\xd7\xdb\xa3\x48\xf4\xce\x43\xfa\x4c\xdd\x7e\xee\x39\x2d\x82\xa7\x9a\x9d\x79\xbb\xae\xed\xd0\xb0\x10\xb7\x8e\x4d\x54\x2f\x2a\xb5\xf1\xb7\xcd\xa1\x78\xab\x02\x35\x84\xc3\xc1\xc3\xc4\x1e\x77\xc2\x2d\x02\xe7\xb8\x00\x9b\x06\x63\xf0\xf2\xda\xc7\xba\x09\xc4\xbc\xa4\x58\x4c\xef\x0c\xd1\x72\x07\xf3\x9b\xd1\xf7\x19\xd5\x39\x03\x31\xce\xf2\x8c\xee\xac\x20\x6e\x97\xea\x56\x55\x10\xa6\x18\x35\x8e\xbe\x48\x2c\xd7\xd4\x95\xac\xd5\x7c\x2b\x36\xba\xba\x31\xc8\x5b\xf3\x59\xb4\x6e\x73\x23\x66\x85\xbc\xd9\x5a\x06\x13\x68\xcd\x64\x5e\x60\x6c\xba\x65\x39\x76\xd1\xba\x7d\xce\xc5\xf7\x01\xf7\xf7\xb3\x3b\xd5\xb2\xc3\xca\x9e\xca\x3c\x46\x3c\xec\x7f\xdc\xe3\xb2\xb6\x07\xd8\x90\x89\xba\xae\x6b\x5e\x88\x60\xbe\x4b\xb0\x6e\x1a\xdc\x0c\x18\x99\x6d\x16\xe7\x63\x6f\xe9\x26\x12\xf1\xd9\x40\xca\x33\xdc\xb8\x1e\x29\xac\xc6\xd1\x76\x19\x03\xe7\xb6\x7c\xd4\xb6\xde\x77\x77\xa3\xe2\xe9\xdb\xb1\x8e\x78\xff\x3e\x53\xba\x73\x72\x1d\xc2\x88\xc9\xa2\x60\xba\xc8\xc8\xbf\xe8\xad\x12\xf9\x72\xa9\xb2\x5c\xd6\x0a\x20\x1a\x97\x9a\x4e\xb3\xf8\x68\x20\x1e\x4b\xe0\x9b\x5e\xc5\xc6\x49\x95\xca\xd8\xc3\x6f\xdc\xba\x1d\xc7\x40\xcf\x88\x4c\x03\x4b\x9e\x16\xd2\x2c\x86\xe2\xd2\x69\x0b\x07\x70\x0c\xa6\xa4\x60\x9c\x36\x10\xaa\x4a\xde\x37\xb8\xc0\xc3\x04\xd0\xf0\x1a\xf0\x2c\x29\xb7\x58\x63\x91\xcf\x17\xb1\xa3\x0e\x39\x28\x9a\x9a\x8d\xae\xf0\xcc\x86\x1c\xeb\x22\x78\xd1\xbe\xba\xad\x21\x5d\x65\x34\x7a\x03\xf2\x1e\x0b\x37\xeb\x3b\x85\x67\xfc\x8f\x2d\xd3\xe8\x8e\xf4\xb1\x65\xbd\xc6\xfb\x25\x39\x1d\xdf\x2a\x02\xff\xca\x0d\xd3\xb6\x07\x77\x2e\xbe\x77\x64\x0d\xf7\x24\x54\x63\x0d\xc5\x45\x6d\x25\x1c\xf2\x6a\x71\xa7\x90\xbf\x38\xb9\xdd\x01\xdb\x60\x96\x57\x0a\x44\xe5\x88\x5c\x29\x74\x39\x55\x87\xb0\x81\xd4\x07\x69\x0f\xa6\x81\xe5\x09\xa5\x2e\xf7\x9d\x67\xb0\x15\x1f\x0a\xa3\x69\xb6\x93\x9d\x11\xa8\x59\x91\x44\x46\x3b\x12\xda\xe3\x7c\xae\x00\x79\xd3\xf6\x95\x07\x2a\x9b\x1c\x03\x4f\x6a\x2d\x96\x1a\x9c\x89\x78\xeb\xb4\x21\xff\xc5\x21\xe0\xc4\xda\x76\xd9\xcd\xda\x32\x88\xd0\x3b\xba\x09\xf8\x5e\x0d\x1c\x14\x1f\xd2\x2b\xa4\xd7\x57\x60\x5d\x80\xcb\x00\x5c\x50\x7b\xab\x6c\x0a\x3e\x5e\x0a\x00\xa9\x03\x05\xcd\x40\x6e\xa3\x00\x82\x30\x1c\xfd\x6d\xf4\x3d\x36\xe9\xb4\x16\xba\x54\x9c\x43\xf6\x40\x90\x09\xf4\xfc\x2c\xc2\xa5\xa7\xe4\x5e\x99\xb5\x46\x47\x36\x14\x98\xd0\x39\x77\xa2\xea\x8d\x52\x25\x0c\xc8\x34\x08\x06\x44\x0c\x9a\xe1\x5c\x98\xb0\x11\x19\xad\x0f\x44\x3d\xc4\xa6\x25\x73\x89\x5b\x0d\x9c\x90\x1d\x4c\x5c\xe0\xd9\x7e\x58\x1c\x67\x27\xc9\x7b\xb2\xae\x1b\x3c\xdd\x2e\x51\x3b\x23\x28\xe8\xe2\x30\xe9\x40\x2e\x9f\x97\x76\xa2\xf2\x20\x14\xa6\xc7\xd9\x44\x91\xa1\xa8\x0b\x29\x2e\xd1\x8a\xc4\x36\x17\x34\x65\xb1\xa3\xd9\x36\x9b\x9f\xf5\xc9\x2c\xc1\xd9\x89\x2a\x89\xe4\x1c\x7a\xa3\xda\xf5\x20\x88\xcd\x7f\x5a\x69\x63\x2e\xc1\x62\x98\x94\x4a\xd9\xb5\xc6\x02\x7d\xf8\x24\x67\xd7\xae\x03\x78\x66\x45\x3a\x3b\x91\x34\x20\x56\xff\x59\x09\x90\x2a\x93\x8b\xb1\x95\xd0\x90\xcc\x54\x17\xa5\x86\xe7\x4f\xc2\xc3\x22\x2f\x95\x7b\xca\x5b\x20\xda\x3b\x12\x7f\xed\xe3\x2e\xde\xc6\xef\x2b\xf6\x10\xe3\xf3\x83\x1c\x57\x1c\x09\x94\xf1\xf6\x7b\xe2\x6b\x94\xdb\xc4\x33\x54\x85\x8f\x44\x0f\x0f\x17\xd2\x3a\xba\x65\xe6\xa5\x41\xe7\xc0\x2e\xe9\xa8\x8e\x0f\x09\x2a\x42\x32\xae\xcc\xb2\x98\xe3\xf7\x60\x88\x7a\x03\x37\x01\xe1\x20\x75\xe7\x44\xa3\xca\x1d\x87\x44\x68\xd3\x9b\xf6\xfb\x5b\x2a\x86\x10\x57\x89\xc5\x02\xae\x35\x67\x3b\xd6\xc0\x25\x87\xbb\xa6\x76\x0a\x5b\xc9\x28\xb7\x08\xd7\xb7\x20\x5a\xc3\x3f\xc1\x9f\x5c\xdd\xd6\xc3\xbc\xcc\x6b\x7c\xeb\xfb\x4a\x9b\x2d\x3e\x09\xfd\x18\x45\x5c\xc2\x56\xda\x8b\x50\xaa\xdc\xde\xe5\xab\x0a\xf4\xdf\x6c\xfd\xc6\x2b\x0e\x23\x2c\x02\x4b\x81\x9e\x59\x6e\xd1\xc6\x4c\x50\xb4\x05\x76\x32\x64\x34\xdc\xce\x29\xd5\x46\xe0\xe6\xea\x1d\x97\x4c\x95\x48\x96\x1e\xba\xff\x12\x74\x17\xe0\xac\x86\x58\x17\xfc\x20\x9e\x73\x76\x65\x3e\x72\xbc\x0d\x58\xd6\xc6\xb2\xcb\x1c\xb8\x99\xd7\x59\x38\x4d\x24\xf9\xd9\x3b\xb1\xf9\x91\xf8\x5a\xf4\xac\xe0\x9c\x97\xca\x18\x17\x54\x03\xe7\x46\x5e\x1b\x31\x51\x84\xc2\xc4\x55\x0b\x41\xa3\x60\x3f\xdd\x6b\x53\x2b\x38\x43\x91\x53\xce\x38\x8c\x26\x0a\xe8\x32\xe8\xe7\x0f\x2d\x3f\x3b\xff\x2b\xf8\x46\x09\x5d\x16\x5b\xbb\x7a\xa6\x37\xa6\x43\x3e\x50\xc6\xe9\x2a\xec\x3d\xc0\x1e\x26\xd0\x7c\x18\x1b\xea\xd0\x50\x5c\x55\x5b\xb7\x06\xdd\xad\x84\x2e\xff\xdc\xe6\x4b\x9a\x3c\xe8\x80\xae\x08\xf3\x81\x40\x1b\x25\xbc\xac\xca\x40\x13\x81\x6e\x85\x59\x83\x42\x86\x89\x2b\xb9\x41\x12\xfe\xc4\x75\x2a\x5c\xd4\xe7\xc1\x68\x0e\xc4\x6a\x97\x8e\x57\xc4\x7e\xfc\x4d\x9e\x16\xaf\xc0\xe6\xea\x79\x74\x2c\xa6\xb6\x0a\x79\xa1\x35\x56\x12\x9f\x54\x3b\x76\xe8\x5a\x0e\xf0\x37\xb6\xb7\x30\x84\x10\x5f\x05\x7d\xa0\xea\x3e\xad\x84\xe0\x09\x10\xb0\xb3\x2e\x5e\xc9\x8c\x0e\x0e\x66\x93\xe1\x52\x61\xc8\xc4\x3e\xb4\x82\x5c\xe1\x90\x0a\x60\x81\xc1\x89\x59\xce\x74\xb5\x94\xe4\x6b\xd0\x64\xcf\x9f\xa2\x97\xed\x28\xdf\xa9\xf1\x6d\xa8\xfa\x3f\xd9\x78\xf0\x49\x86\x09\x7e\xd2\x20\x80\x0c\xe3\xfe\xfe\xce\x12\xb3\xff\x36\x99\xbf\xe3\x04\x70\x58\xa7\xdd\xee\x19\xed\xfa\x07\x0f\xec\x81\x9e\x4c\xa9\xe1\x29\x52\x4f\x04\x90\x8d\xfb\x1a\x02\x77\x1a\x7a\xb8\x7d\xaf\x43\x09\x9f\x98\x00\xc3\x78\xde\xc3\xba\xc8\xa6\x0a\x2d\x77\x7e\xee\x3f\x72\xef\x7f\x74\x8b\x01\x20\x1c\xf0\xed\xa5\xf0\x0c\x9c\x97\x15\xe4\xc8\x32\x01\x72\x47\x85\xcc\x59\x97\xb6\xb4\x6f\x54\x0b\xb9\x65\x04\xaa\xee\x40\xd3\x39\x61\x72\xd4\x67\xf4\xa1\xd8\x95\xc6\x2f\xa4\xb0\x3e\xaf\x95\xe5\xf4\x14\x8e\xa0\x1c\x0d\x08\x5a\x08\x90\x76\xce\x0f\xc7\xb5\x1d\x24\x66\x2a\xea\x3a\xd8\x02\x93\xc1\x40\x2d\x2a\xf7\x19\xd6\xcf\xbc\x9c\xb3\xe9\x7f\x98\x0e\x83\x9b\x6f\x7b\x59\x97\x79\x0d\x3a\xf0\xc2\xf2\xb4\x71\x5a\x12\x62\x9f\x3d\x9c\x2d\x33\x47\x3a\x44\x93\x00\xd6\x0b\x95\x1c\x5c\x6f\x3c\x30\x7c\x7d\x61\xb9\x17\x18\xf2\x70\x94\x14\x7c\x17\xa8\xbc\x3f\x4c\xaa\x40\x7c\xa6\x13\x55\x59\x13\x87\x10\xcb\x70\x39\xeb\x87\xba\xb4\xc9\x1e\xf6\x79\xcd\xbf\x88\xfd\x76\xc4\xcd\x5e\x5b\x7e\x35\x71\x2a\x4b\x54\xf4\x02\x07\x8d\xd6\x17\x9e\x1c\xa4\x76\x50\x1f\xec\x84\x92\x36\x20\x99\xb8\x81\x18\xff\x8b\x19\x0f\x7b\x03\x36\x3a\xa9\x8b\x16\xa0\xd4\x44\xbd\x87\xe6\xbe\x0f\xe7\xc5\x54\x97\x75\x5e\x3a\xae\x89\xbc\xf6\x21\x1f\xc6\x21\xd8\x40\xa6\x28\x54\x99\xfb\x77\xf1\x3c\xea\x14\xf8\x93\x05\xd5\x30\xac\x06\x4e\x77\x4c\xd1\x9a\x28\xb4\xd8\x8e\x79\x75\xf8\xee\x1e\xb6\xf5\x4e\x1c\x45\x0b\x81\xcd\xf5\x7a\x52\xe4\x66\xa1\x32\xea\x4c\x5c\x6e\x08\xf3\x00\xc9\x49\xb0\x8a\x5f\x7e\xf0\xc2\xad\xbe\x84\x08\x73\xd5\xa3\x37\xf0\xfc\xb9\xae\x70\x44\xfa\x49\xf9\x77\x9e\xd8\xfb\x41\xf4\xf9\x41\xf8\xcc\x27\xac\xa4\xe7\x32\x2f\x50\xf1\x4e\xdf\xa1\xd5\x04\x43\x08\xf1\xdc\xb8\x6a\xdc\x5a\xf1\xdf\xd8\x35\xa8\x1f\xdd\x41\x40\xcc\xe6\x15\x75\xc1\x04\xe5\xa4\x73\x59\x0b\xfe\x47\x4e\x90\x0e\x9e\x10\x66\xbd\x5a\x15\xb9\x67\x3f\x81\xd3\x24\x60\xea\x54\x91\x3c\xc7\xcf\xdc\x65\x23\x4e\x28\x81\x3a\x17\x77\xf3\x68\xa3\xf3\x8a\x6f\x7e\xfc\xe1\x06\xc5\x4b\x79\xa1\x72\x03\xf1\xe7\xaa\x5a\x2b\xa7\x31\x0e\x37\x7d\xb3\x06\x29\x68\xb6\xb6\x92\x9b\x9f\xca\x61\x37\xc7\x6c\x5f\x04\x71\x1f\x77\x4c\xbc\x5d\x4c\x0f\x1f\xfa\x07\x67\x51\xbd\x06\x7a\xd6\xfd\x57\xcc\x0f\xeb\xc9\x48\xbc\x60\x2a\x24\xcf\x4f\x64\x5d\xab\xe5\xaa\x8e\x17\x91\x07\x0e\xa7\x6b\x0a\x2c\x98\xc6\x1a\x8a\xd7\x4d\x57\xa3\xd9\x8a\xb7\x37\xb9\xe8\x25\x48\x2a\xb0\x35\x17\xd2\xa8\x8c\xd6\x35\xcc\xb8\x87\x8a\x8f\x2a\x0c\x3b\x0a\x7a\x4c\xae\xf6\xd7\x6e\x97\x86\x13\xc5\x96\xf3\x5b\x7a\x77\xa5\x9d\x94\x1b\x98\xbb\x8e\x70\x03\xb6\xb8\x9d\x80\x65\x42\xed\x94\xdf\x79\x52\xef\x83\x94\x49\x13\x94\x16\xee\x68\x5d\xf7\x42\x6b\x3a\x4f\x35\x21\xd1\xc2\x8d\x23\x99\x83\x2a\xf9\x8c\xeb\x69\x57\xe3\xee\xa8\x7e\x57\x2b\x5b\xa0\xda\x62\x3c\xba\x56\x4e\x25\xf8\x67\x28\xa9\x06\x70\x2c\x54\x89\x82\xad\x32\x53\x65\x9d\xcf\xb6\x9c\x77\x61\xdc\x56\xca\xab\x1c\x60\x58\xda\x74\xf1\xba\xf9\x11\x08\xcf\xfc\x0d\x38\xd4\x2e\xf6\xd2\x18\xe2\xfb\x8f\x29\xb1\x98\xb4\x02\x16\x34\xef\xd2\xe7\xef\x7f\x2f\xce\xd2\x98\x9e\xc0\x60\x9a\xeb\x8b\xf3\x99\xfb\xb7\xbc\x29\x07\xa4\x65\xce\xd4\x4a\x95\x99\x2a\xa7\xf9\x3d\x08\x30\x01\x81\xf1\xb4\x61\xc6\x68\x00\x3f\x0b\xf2\x68\xc8\x35\x40\x5b\x3d\xfd\x44\x5b\xf2\x03\xa7\xd2\x68\x32\x84\x98\xdc\xfb\x16\x7a\xee\xe6\x37\x13\x8d\x15\x41\x00\x9a\xe5\x99\x5e\x4f\x0a\x75\x5a\xe4\xd3\x9b\x5e\x60\x51\x9d\x1f\x1d\xea\x32\x9b\x14\x53\x5b\xbc\xf5\x7b\x6d\xf2\x02\x12\x51\x95\xf1\xf2\x9f\x13\x17\x00\x46\xc4\x0a\x0c\x24\xfd\xc1\x8d\xc4\xab\x17\x93\xbd\x67\x94\x12\x49\xc6\xe2\x8f\x51\x2a\x50\x10\xd1\x55\xe6\x63\xb5\xd3\xfb\x0e\x83\x47\xf5\x97\xa8\x77\xef\x23\x74\xe7\x70\x2b\x0b\x27\x9d\x5d\xae\x59\x2c\x85\xc4\x97\xbe\x96\x43\x2e\xb9\x9e\x45\x94\x5b\x18\x91\x8e\x6f\x7d\x9e\x7c\xc7\xda\xfe\x64\xea\xa1\x33\x9d\xa4\xf9\xd2\xdf\x45\x3f\x24\x68\x6b\x7c\xc9\x38\x34\x03\x44\x67\x04\x27\x46\xcb\x5a\xc9\xc9\x03\xe2\xe1\x1d\xaf\xdd\xc8\xaa\x74\x37\x19\xa0\xa6\x67\x62\x99\x1b\xb8\xab\xc6\x6a\xef\xa1\x38\xbe\x95\x79\x61\xef\xcd\x96\x00\xe8\xfc\x72\x64\xff\x43\x9f\x18\x56\xfc\x13\xb3\x0e\x7e\x0c\x53\xdc\xb5\x82\xa9\x73\x07\x07\x56\xc4\x33\x75\xec\x44\x85\xb9\xad\xc0\x1b\x46\xed\x20\x41\xdf\x4f\xae\xf6\x08\x05\xcd\x34\x05\x6e\x99\xf5\x27\x5b\x37\xc1\x00\xec\xd8\x04\xb0\x77\xb5\x20\x7c\x1f\xdc\x88\x33\x35\xd5\xeb\x95\x15\xe6\xc9\xb7\xc9\x41\x40\x92\x9e\x94\x74\x6f\xe9\x8e\xf2\x9f\xcf\x01\x55\x93\x8c\x7e\x99\xaa\x55\xb5\xcc\xcb\xdc\xd4\xf9\xd4\x4e\x9c\xac\x32\x70\x77\xb3\x8d\x84\x0c\x7e\x88\x4f\x50\xee\xd7\x0b\xb5\x3f\x0b\x49\x63\x74\x39\x10\xaa\x9e\xa6\xe7\x1f\x84\x0f\x7f\x14\x2e\x6e\xe8\x3c\xb9\x26\x43\x51\x87\xe1\xd9\xb5\x77\x87\x69\xd8\x58\x4a\xe5\x63\x02\xa8\xd9\x5a\x28\x44\x4b\xb5\xea\x1d\x1e\x36\xf4\x11\xbf\xc5\xad\x3c\x8c\x72\x6c\x85\xc5\x1c\x3c\xb2\x52\x4e\x75\x1e\xd2\xfa\x40\xda\xc4\x65\x74\x2c\x4e\xf5\x0a\x12\xb0\xa2\x5b\x6f\x12\x4f\x75\x70\x20\x4e\x0b\x5b\x8a\xaf\x8e\x10\xe1\x41\x50\xa7\xd9\xb6\x94\xcb\x7c\x0a\x7a\x64\x42\x24\x1f\x3a\xd1\x3b\x56\x45\xed\xf0\xbe\xe8\x1c\x41\x3c\x21\x3b\x34\x3e\x5c\xcc\x72\xcb\xdf\xeb\x2c\xb4\x07\xce\x9e\x6c\xc5\x38\x9e\xf7\x31\x3a\xa7\xb2\xfd\xe0\x31\x99\x2c\x2d\xe2\x09\x61\x1d\x3b\x26\x6e\x29\xb5\xaf\x81\xb1\x5b\x9e\x4e\x37\x46\x57\x50\x5f\x55\x1a\xb1\x92\x15\x82\xce\xca\xb9\x72\x78\xf0\xf9\x3f\x90\x77\xe9\x8a\xad\xfc\xae\x6b\xa9\x23\xf6\x32\x56\xc3\xf9\x8c\x00\x9e\x01\x36\xf5\x77\xbf\x6e\x2f\x98\x13\x00\xe3\xbf\x6b\x37\x50\xb1\x7e\x7b\x3b\x43\x48\x6a\x6e\xdc\x1c\x9e\xe5\x55\xbd\xe5\xda\xd0\x0e\xfd\xda\x2e\x8a\xa4\xf4\x6b\x2f\xd2\xb8\x0b\x05\x0d\xc3\x6e\x8d\x53\x8b\xee\xae\xfd\x0b\x4d\x1d\x1e\x34\xa7\xbc\x6f\x33\x1c\x2a\x78\x3b\x45\xf0\x0b\xe4\xed\xe0\xe9\xc0\x76\x54\xfb\x4c\x0e\x53\x6f\x34\x83\x51\x8b\xb5\x80\x41\x89\x0b\xc2\x72\x2c\x1f\x77\x6b\x6e\xc4\xae\xde\xb5\xa9\xc5\x44\xcb\xfa\x08\x56\x94\x8f\x0c\x1c\x3d\x29\x17\x02\x48\x3a\xf9\x05\xb3\x26\xb4\x8c\x86\x38\x12\x78\x84\x0f\x67\x95\x52\xff\x50\xfd\x7f\x3e\xf8\x82\x7a\x3f\x72\xc3\x30\x78\xf0\x45\x97\xc0\x35\xea\x14\xc5\x06\x0f\xbe\xe8\x10\xa3\x46\x5d\xf2\x55\x4b\x15\x2e\x1e\x35\xeb\xf1\xb7\x83\x07\x5f\x74\x0a\x0e\xa3\x6e\x99\x62\xf0\xe0\x8b\x76\xee\x36\xea\x38\xf9\xda\x2a\x10\x13\x68\xa9\x42\x6f\x30\xd4\x9b\xf2\x4b\x43\x60\xf5\xe9\xba\xb2\xeb\xcd\xee\x0e\xf3\xbc\xd2\x4b\x72\x5f\x45\xd3\x05\x15\xbc\xa0\x84\x1f\x5d\xef\xed\x33\xfb\xce\x95\x0b\xa6\x8f\x08\xbd\xfa\xcb\x6f\x28\xb8\x1b\x9f\x9c\x3a\xdb\xf4\x55\xa5\x22\x98\x39\x27\x56\xb8\x35\x75\x47\x53\x5d\xf1\xe1\xae\x72\x87\x8e\x52\x4b\x5f\x38\x81\xf4\xb5\xaf\xd7\xd2\x47\x5e\x2f\x7d\x4d\x37\x2f\xc7\x2f\x08\x48\xa9\xdf\x46\xe8\xf1\xe3\xb6\x76\xc5\x3c\xc3\xc5\xff\xc5\xa7\x44\x34\x82\x94\x50\xd0\xc7\x72\x83\xe1\x95\xe0\x9e\x72\xe3\x85\xeb\xb6\x16\xe8\xd6\x59\x6e\x89\x29\x82\xff\xec\x9c\x12\x74\x1b\x1a\x20\xdd\x86\xb3\xf7\x5d\x3c\x66\x5a\x5f\x46\x06\xc3\xc8\x3b\x08\x3d\x90\xb0\xdc\x4f\xde\x47\xd3\x79\x0a\x5d\x37\x5e\x1d\x36\x6a\xb9\xb6\xb7\xd4\xf2\xaf\x98\xcb\xb5\x37\xaa\x5e\x98\xe3\x2a\x88\x47\xb9\x81\x7f\xfb\x8d\x0f\xee\x1d\x36\xab\xfe\xa4\x4a\x71\x94\x52\x7a\xd6\xec\x87\x4b\x60\x31\x6a\xe9\xe2\x33\xf1\x54\x8c\x7c\x22\x34\xdc\x2c\xd4\xda\xdd\x2d\xf3\x9d\x62\x2d\xf3\x55\xb1\x65\x09\xa5\x67\xcd\xb1\x6a\xb6\x2c\x0c\x63\xdc\x32\xb7\x7c\xd3\xd6\x1d\x35\x06\xe0\xf1\xe3\xa4\x1d\xbc\xc8\x4f\xaa\x6c\x59\xd6\x76\xcd\xc2\x92\x21\x93\xe0\x98\x16\xde\x47\x2e\x62\x7a\x33\x40\xd0\xc7\xd3\x65\xd3\x51\x8f\x54\x6c\x6f\xb6\x65\xbd\x50\x75\x3e\x85\x8f\x7d\xa4\x1a\xf1\x53\xf4\x35\xb4\x97\x4c\x5e\xd3\x1b\x00\x1c\xda\x44\xe6\xdc\x9a\xbc\x0f\x5d\x78\xd3\x9f\x2e\x64\x39\x57\x46\xa8\x0f\xa5\xf7\x64\xd9\xe3\xe4\x66\x3e\x88\xd9\xb5\x53\x1c\xaf\x56\x45\x3e\x45\xd0\x2b\x8c\x0c\x0d\x4e\x8d\x51\x28\x33\x80\x1a\x5c\xb8\x54\x08\xde\x95\xc7\x0f\x70\x2c\x11\x62\x5c\xab\x3f\xfd\x70\x87\x0d\x42\x63\x07\xbe\x05\x03\xa0\x10\x44\xc2\x1a\xdd\xd6\x70\xdf\xc0\x8f\x5f\x7e\x11\xbd\x75\x79\x53\xea\x4d\x89\xc8\x55\x3d\xaf\xd1\x1f\x4e\x91\xbb\x5e\x21\xe6\xfb\x51\x1b\x43\x81\x75\xb2\xd7\x16\x08\x78\xcf\x88\x69\x08\xf8\xe0\x0d\x66\x59\x7b\x91\x73\x74\xb7\xc7\xe7\x09\xa1\x95\xe3\x00\xf0\x0e\x0c\x18\x1c\x45\x5e\x2b\x9f\x94\x1c\x40\xb2\xbc\x15\xab\x67\xc4\x54\x17\x88\xbb\x1c\x74\xc0\xa4\x36\xea\x1a\x67\x65\x2e\xe8\x26\x9a\x0e\x78\x18\xe0\x4f\xe5\x6d\x9f\xce\xd9\x82\x96\xb1\x95\xf5\xf6\xc3\xa0\x39\xf9\xed\x2e\x8e\xd7\x30\x91\xe4\x80\x35\x23\x72\xf1\xe7\x4e\x1e\x77\x28\xf2\xaf\xbf\x8e\xcd\x24\xd8\xe4\xdc\xd8\xc3\x58\xce\x61\xdc\xdf\xd4\x7a\xb5\x52\x59\x3f\xb2\x88\x4c\x2a\x25\x6f\x62\x2b\x04\x5c\x82\xc3\x90\xc9\x32\x13\x61\x30\x20\xe8\x6f\xa3\xed\xbd\x4e\x16\x85\x2a\x04\xa8\x24\xc8\x5c\x6e\x5f\x92\xe6\x23\x2f\x21\x28\xc2\x79\xd3\xdd\xbd\x49\x1a\x7d\x7b\x97\xbf\x1f\x34\x67\xe3\x5d\xfe\x9e\x9f\x8e\x4d\xdb\x48\x18\x49\xea\xe5\x67\x7c\xba\xe5\xbb\x7e\x0e\xbb\xd6\x0f\xf3\x85\xe9\x5a\x2e\x2d\x9b\x04\x2e\xa5\x5d\x2b\xdb\x4e\xd8\x71\x7d\x55\xad\xd5\xc5\x72\x85\xc0\x8c\xbe\xe2\x39\x8f\xa6\x97\xe2\x11\xe2\x98\x3c\x0a\x0a\xd3\x7d\xca\xe2\xe0\x21\x64\x6a\x72\x7f\x2f\x83\x8d\x18\x34\x55\xd3\xe9\xda\xb1\x55\xca\xd4\x80\x0c\x57\x57\x0e\x53\x5b\x83\x7f\x63\x05\x19\xd8\x5c\x8c\xd2\x05\x0f\xbf\x41\x3d\x08\x84\x10\x7e\x25\x8c\x2a\x8d\xf3\x30\x77\x16\x5c\x04\x84\x46\x34\x7c\xb6\xc3\x45\x7f\xb2\x9e\x4c\x0a\xbb\x65\x6b\x2d\x6e\x94\x5a\x85\xb8\x29\xf0\xab\xff\xca\x59\x98\x20\x48\xc1\xd8\x4e\x28\x09\xa8\x2d\x4e\x55\xed\x86\x81\x60\x3c\xc8\x21\xb2\x56\x25\x68\x3b\x6d\x9b\xa8\x41\x2e\xc7\x57\xa6\x24\xc4\x40\x41\x9b\x1a\xc3\xa6\x82\xda\xdb\x59\xa6\xbf\xfa\x48\x68\x32\xa1\x21\xe0\x8d\x84\x5f\x76\xb7\xc3\xbc\x9c\xb3\xae\x0d\xe3\xc9\xda\x79\x3a\xee\x34\x83\xcf\x04\x22\x14\xdb\x2f\xb2\x71\xe3\x93\x96\x1b\x31\x07\x6f\xdc\x0a\x55\x5c\x4f\x86\x91\x72\xfe\xd8\x17\x35\x80\x4b\xee\x33\x04\x9a\xda\x25\xee\x01\xcf\x6e\x5d\x05\x66\x2f\xf2\x92\x0e\x79\x44\x60\xd0\x25\x85\x77\x81\xa2\x28\x18\xee\xec\xca\x00\x5f\xd3\xa5\x5a\xea\x6a\x0b\x41\xf3\xf6\x1a\x0c\x51\x01\x96\x2f\x80\xaa\x15\x8f\x5c\x1f\x07\xbc\x36\xc2\xc8\x69\x95\xcf\xf2\x29\x66\x20\x3a\x7e\x75\x01\x78\x06\x25\xfa\xb5\xbe\xc9\xad\x68\x3c\xa6\xe3\x65\xec\x94\x4a\xd0\xc8\x89\x9a\xe9\x4a\x51\xc6\x91\x95\x34\x98\x9b\x10\x08\x43\xa0\xc3\x57\x58\x0c\xc2\xde\x62\x98\xdd\x01\xad\x05\x07\xdf\x8a\xc8\xc8\x79\x2d\x30\x02\x4f\x87\x0f\xba\x8c\x8f\x63\x29\x8e\xd8\x40\x5f\x94\xb5\xee\xcb\x81\x98\xec\x1d\x8e\xa9\x04\x28\x93\x6d\xeb\x43\xb8\x89\x59\x49\x7b\xed\x46\x45\x76\x86\x2e\xae\xe3\x40\x04\x7d\x41\x8c\x5e\x2a\x0c\xbd\x80\x6e\xa3\x08\x15\xaf\xb9\x5f\x60\xf8\xfe\xfc\xd5\x5f\x3e\x8a\xe3\x32\xb4\xc2\x85\x6c\xda\x79\xa4\x69\x0e\x38\xc2\x71\x53\xa9\x3b\x03\x51\xaa\x0f\x24\x73\x3c\xec\xdb\xbf\xc5\x43\x07\x17\xde\xa6\x2f\x49\xa8\xe0\xdd\xe6\x98\x2f\x37\x58\x43\x3b\x97\x4f\xac\x53\xa5\x73\x8f\xda\x93\x82\x95\x3b\xa0\x72\xf5\xa1\x46\x0e\x8b\x3a\xd8\x13\x5d\x2f\xe0\x38\x01\xf7\xab\xe5\xaa\xde\x0e\xc5\x5b\x14\x86\x47\xe2\xa5\x0f\xa6\x10\x1f\x86\x53\x5d\x4e\x65\xdd\xdf\xee\x21\xcc\xcc\x96\x14\xc1\x18\xf7\x72\x70\x20\xa6\xaa\xaa\x25\x28\x37\x65\x2d\x3e\x40\x40\x4e\x89\xc2\xbd\xe8\x7f\x10\x53\x37\x71\xd2\xa1\xcd\x03\x5f\x40\xa2\xe4\x0c\x05\xf9\x66\x9a\x47\x37\x75\x68\x8f\x2b\xe4\xe2\x12\x30\xf2\x4c\xe3\x86\x15\x86\xab\xb5\x59\xb8\xd8\xaf\x68\x92\x12\x04\x0c\x7a\xc9\x15\x74\x9c\x44\x9f\xd5\x69\xd6\xf8\xf8\xa0\xb5\xd1\x51\x93\x0e\x0e\xc4\xb1\x98\x40\xd4\xa8\x16\x99\x15\xa8\x2b\xbd\x06\x5d\x2a\xe5\x0f\x1d\xdb\xe2\x63\xee\x12\x28\xde\xd1\x37\xde\xbb\x81\xf7\xad\x80\x2f\x26\xa5\xb0\x63\xef\xa3\x13\x2f\x36\x65\xc8\x0a\xce\x89\x47\x7c\x89\x3f\xf2\x6b\x9c\x7c\xd1\x73\x23\x54\x8e\x79\x13\xdd\xdc\x69\x30\x76\x48\xc7\x78\x6d\xe9\xa1\xf8\xd9\xa8\xd9\xba\xc0\x85\xb0\x92\x79\xe5\xf2\xb3\x40\x1c\x12\xdf\x85\x78\x3d\x0f\x1e\xf7\x12\x0e\x2e\x94\x53\xd7\x75\x5e\xe4\xf5\x96\x24\x1a\x34\x15\xe1\xa8\x10\xa0\x18\xe6\x94\x95\x4e\x66\xe5\x7b\x12\x4e\x21\x4c\x7c\x59\x66\x3e\xd4\x16\xec\x6c\xd0\x28\x9f\x58\x49\x7d\x90\x80\x3a\x66\x4f\x63\x5b\x53\xf4\x2d\x0f\x83\x00\x7f\x58\xf2\x14\xc6\x8d\xa6\x24\x60\xa1\xe0\x8f\x0e\x83\xb6\x37\x6c\xbf\xe8\x4c\x27\xc2\x7b\x17\xa3\xbc\x4f\xdd\x87\x23\x53\xb9\x70\xf0\x2a\x6a\x7a\x44\xeb\xd9\x47\xf1\x0e\x12\xa8\xbc\x17\x98\x14\xc3\xe5\xe0\x1c\x5b\x5e\x3a\xc6\x28\x7a\x16\x6e\xca\xc5\x73\x82\x65\x64\xac\xa2\x2f\xab\x6a\x20\xa6\x93\x01\x26\x65\x09\xbe\xaa\xf1\x92\x94\x55\xe5\x57\xa4\xac\x2a\x8f\xef\x18\x2a\x26\x5e\x30\xb6\x82\x4b\xf2\x38\x41\x53\x0a\x94\x1b\xd8\xea\x41\xdf\xe9\x6d\x24\x74\x8f\xfb\xfb\x5a\xd1\xc9\x8d\x5e\x87\x01\x8e\x9e\x9f\xa6\xf5\x42\xe5\x55\x74\xd4\x96\x99\x65\x28\x96\xd4\x46\xe6\x35\x99\x95\xa0\x5e\xa3\x2c\x09\x72\x59\xe2\x9c\xfc\x7f\xe0\xcb\xa9\x5b\xf2\x19\xff\x86\x0b\x54\x2e\x33\x51\x29\x88\x41\x30\xfe\x70\xf2\x87\xf1\x4a\xeb\x62\xe0\x00\x33\x56\xaa\x72\x79\xb2\x12\xcb\xc9\x33\x67\x3a\x49\x2e\xdf\xe1\xfa\x1e\xb9\x09\x0e\x7f\x97\x5b\x38\x73\x9a\x81\x71\x48\x45\xdc\xe3\x32\x7b\x8d\x1d\x6d\xaa\xa7\x1a\x77\x39\x7f\xa1\xe9\x90\xe9\x77\xdc\x05\x99\x27\xc6\x43\x7f\x27\xf2\x43\xc7\xef\x42\x2e\xae\xad\x34\x75\xb5\x9e\xd6\xba\x1a\xd2\x4c\xb0\x4b\x1c\xd3\xc9\xdd\xd1\xab\x37\x7e\x94\xa2\xee\x45\x58\xa7\x3b\xaa\xf7\xd5\x00\xf4\xff\x88\x7c\x7a\xc7\xb7\xae\xf4\xea\x27\xd0\x67\x7c\xf6\xa7\x5c\x50\xd6\xc7\xc3\x07\x3c\x93\x22\xec\x1d\xcc\x37\xd1\xaf\xe5\x3c\x06\x6a\x95\x73\x74\x65\x99\xac\xeb\x5a\x63\xa2\x57\xff\x0c\xb2\x28\xc4\x8f\x30\xb1\x52\xfc\xac\x56\x1f\x6a\x59\x29\xd9\x6b\xcb\x2f\xfa\x0a\xf3\xcc\xbd\xd0\x6b\x43\x81\x66\x68\x7d\x41\x15\x05\x64\x7e\xc4\x06\xb9\x2c\xb0\x25\x73\x81\xa3\xbc\xab\x25\xfa\xd7\x8c\x9a\xcf\x4e\x31\x02\x3a\x79\xc5\x9d\x72\x3a\xdf\xb4\x57\x85\x76\x9e\xe9\x4d\xd9\xf5\x7c\x47\xb5\x17\xfa\xb6\xf3\xf9\x8e\x6a\x3f\xaf\xda\x9f\xc6\x55\xfc\x8c\x3d\x7c\x08\xa9\x52\xcd\xd0\x27\x2f\x7b\xfc\x38\x9d\xe4\xed\x4a\xed\xed\xb5\x26\xa5\x6d\x4d\x3d\xdb\x48\xd7\x40\xe8\x84\x88\x9d\x32\x93\x53\xbc\x08\x26\x9e\xf5\x1a\x8d\xc4\xa6\x46\x84\x2e\xc0\x99\x21\x27\x63\x64\x47\x70\xc1\x8d\xea\xd8\x4b\x40\xf0\x5b\x87\x9b\x09\xc4\x18\xc3\x3d\x20\xa0\x5b\x53\x5d\xd1\x70\x6b\xf7\xc7\x64\x1f\xc5\xbc\x81\x38\xbb\x7c\x01\x2f\x51\x7f\x35\x10\xee\x39\x32\xcf\xbd\x91\xf8\xea\x23\x92\x12\xc2\xa1\x45\x0f\x29\x4b\x84\xa8\xf5\x8a\x34\x88\x9e\x2b\x52\x28\x32\xdc\x39\x50\x6c\xc4\x63\x9e\xa0\x7d\x5c\x16\x76\xe1\x3d\xae\x4c\xcc\x96\x0d\x4b\x19\x62\xa5\x55\x3b\xd6\x13\x85\x87\x56\x16\xb9\x67\x85\x21\x12\xa4\xb8\x05\x57\xb8\xb1\x37\x99\xbb\x2f\x5d\x42\xa8\x9f\x2c\x06\x71\x4c\x03\x04\xe9\xd3\x37\x41\x8c\x77\x2e\x81\xd2\x87\xc7\x00\x0a\x66\xb0\x93\x39\x82\x64\x6a\x77\x9a\x1e\x77\x0b\xac\xc8\xcd\x2c\xe8\x9b\x87\xe2\xaf\x78\x5f\x87\x7b\xbc\x1d\x11\x22\x6c\xbf\xe7\xa8\x4d\x5c\xc2\x2f\x22\x49\x19\xf7\xc5\x38\x35\xf2\x8d\x21\xcd\x7c\x87\x77\xee\x98\x0f\x46\xcc\xe4\xf8\xac\xe3\x97\x06\x3c\xaf\x32\xcc\xf7\x5e\xcb\x68\x91\xcc\xc7\x96\xab\xbe\x55\x55\x95\x67\x4a\x2c\xf4\x26\x1c\xd6\x73\x55\x1b\x3e\x2b\xe2\x64\xeb\x88\xd1\xde\x19\x44\x8a\x72\x3a\x3c\x57\xe0\xe5\x03\xe2\x99\x5f\xeb\x56\x40\x23\xff\x05\xe7\x1c\x9b\x07\x6c\x60\x7b\x3b\xc5\x85\x1c\x9c\x39\x10\x03\x37\x20\x70\x40\xba\x9d\x49\xa1\x82\x30\x60\x67\x75\x1a\xa9\x02\x28\xcd\x14\x65\xfa\x75\xe9\xe5\xb8\xdf\x64\x10\x5c\x82\xf1\xf0\xa9\x43\x86\xfe\x2a\x81\x1b\xbd\xd3\x19\x49\xf0\x76\x78\xe8\xce\x4f\xb3\xb5\xb6\x7d\xf8\xd7\xbb\x86\x74\x35\xe6\x1e\x76\xdc\xc3\xc6\x4d\x26\x34\xc7\x20\xfc\xa9\xb3\x13\x0c\xc2\xf5\x05\x74\x44\x80\x3d\x1f\x24\xd0\xe1\xbd\x3c\x9b\x5f\x12\x98\xab\x5f\x45\x7d\x35\x9c\x0f\xc5\x98\xce\xb1\xf1\x5e\x1c\x47\xf1\x2c\xdc\x07\xae\x00\xba\x44\x57\x31\x44\x0c\x97\xd9\xe7\x2a\x04\x31\xda\x46\xb7\xb9\xfc\x3a\x5d\xba\xfb\xfe\x21\xdd\xd0\x11\xba\xb6\xe3\xa8\xb6\x5d\x3e\xbb\x7c\xb1\x4f\xb9\xde\xa6\xc8\xc0\xd4\x2c\x2f\x73\x58\xad\xa4\x30\xf1\x97\xf4\x22\xbf\x55\xc2\xde\x8d\x0e\xe1\xe6\xe3\xce\x08\xcc\xe9\x0f\x71\xbe\x13\xc8\x32\x82\x59\x9f\x84\xd1\x10\xd6\x6e\x9b\x65\xec\x45\x95\xec\xc9\xb6\x0b\x43\xff\xc0\x85\x22\x3c\xf4\x4f\x78\x48\x1c\x45\x25\x03\x9c\x97\x15\xa7\xfb\xea\xc3\x48\x68\xc8\x6b\xea\x98\x23\xb8\xe0\x4c\x2b\x04\x7a\x2e\x20\xd2\x78\x2f\xba\x0b\x3b\x7d\x2f\x4f\x5a\x6e\xd0\x32\xd3\x69\x0f\xef\x87\xd6\xf8\x06\x32\x59\xa6\xb5\x71\x9d\x1f\xf5\x6b\xe2\x08\xbf\xdd\x74\x9d\x76\xdf\xe8\x12\xa9\x9a\xfe\xea\x30\x88\x5c\xc6\x4a\x35\x35\xec\xfb\x0f\xfb\x0f\x7d\x13\xac\x5c\x87\xd8\x5d\xa1\x55\xf7\x80\x40\x3f\x77\x27\x24\x44\x4a\xf9\xaa\x38\xff\x92\xf1\x6b\x87\xd0\x3c\xd7\xf6\xee\xed\xd5\xb0\x50\x0d\x3c\xeb\x5a\x1c\xd6\x07\x69\x93\x52\x0f\x76\xe8\x51\x58\xd9\x41\xa2\x39\xc6\x33\xc0\x1d\x6d\x51\xec\xa6\xd0\x80\xbb\xb6\x2e\x41\x4b\xa0\xfd\x89\x4e\xcb\x06\x58\x8f\x97\x10\x30\xa5\x13\x24\xa3\x74\x81\xfc\x89\x7b\x35\xd3\x33\xb7\xa8\xfa\x52\x31\xa1\xe1\xd7\x16\x59\xc8\x98\xcc\xd3\xaf\xe9\x56\x80\xe8\x0b\x98\x2a\xfa\x02\x36\x39\xb6\xe7\x1c\xaf\x4a\xec\x07\x8a\x42\x61\xcb\xe3\x17\x23\x0f\x35\x66\x8c\x72\xce\xdd\x2d\x26\x28\x4c\x24\x8d\x99\xff\x1c\xf3\x4d\xfd\x0b\x97\x72\x6b\xa7\x18\xf3\xe8\x0b\x59\x8b\x6a\x5d\xd6\xf9\x92\xa0\x3d\xb8\x27\x31\x45\x68\x1c\xf9\x20\xc3\x9c\xf9\x9c\xc5\x85\x12\x3c\x5b\x1c\x0f\x1e\x67\x18\x95\x1e\xfe\x46\x03\xc6\x01\x99\x93\x6f\x46\x38\x2c\xae\x15\x89\x8e\x15\x9f\x0f\xd2\xe6\xb6\x26\x74\x0b\x17\x3a\x9a\x9b\xb0\x64\xcf\x4b\x10\x16\x21\x69\x77\x7a\xe5\xb7\x32\x45\x50\x52\xb3\x30\x1b\x67\x15\x19\xaf\x2a\x3d\x55\xc6\x9c\x7b\x7d\x05\x45\x05\x47\x72\x0a\xb3\x91\x53\x67\x7e\xed\x8a\xc5\x36\xd3\x04\x28\x36\x64\xfe\xca\x1f\xec\x78\x5c\x95\xd2\x36\x84\xf0\x8e\xec\xd4\xa6\xa1\x07\xe2\xea\x16\x44\x6c\x8b\xc5\xef\xc8\xf6\x05\xad\xf2\xbd\x6e\x6f\x7b\x63\xc4\xfa\x89\xd6\x82\x32\x99\x8e\x15\x1b\xd3\x5a\x47\x86\x0c\xa2\x01\xfe\xb6\x75\x9a\x7f\xa0\x56\xf6\x2e\x30\x73\x80\x5a\x0e\xb1\x12\xd3\x72\xd2\xc8\x65\x94\x93\x21\x10\x1a\x86\xc3\x88\x9e\x9c\xf3\x81\x0b\x8d\xf1\x96\xca\x58\x3d\x45\xe7\x45\xdc\x15\xd1\xa6\xde\x6b\xfb\xc2\xe0\x5e\x3a\x11\xae\xd1\xfb\xed\xc8\x3b\x35\x88\x37\xd5\x92\x13\x3a\xf6\xaf\xed\xf0\x69\x4e\xe1\xde\x88\xe5\xb5\x74\xe3\xbd\x51\xf6\xc6\xd4\x35\xe0\xe1\x42\x80\xab\x46\xbc\x61\x69\x9c\xe1\xf6\xb3\x90\x08\x28\xba\x55\xb5\x98\x28\x55\xf2\xe4\x15\x2d\xfe\xe7\x70\x9b\xde\x04\xc3\xc4\x5c\xeb\x4c\x58\xd6\x88\x97\x2d\x44\x4e\xc8\x11\xb8\x4e\x73\xe5\x9c\x47\xb5\x03\x40\xc9\x61\x8b\x1b\x48\x13\x4d\x82\x1c\xca\x13\xe7\xd0\x1f\xd6\x93\x36\xbf\x50\x96\x4e\x85\xdd\x0f\x06\x0f\xbe\x60\x82\xe4\x88\x4b\x95\x83\x07\x5f\x44\x3c\x76\x14\x9f\x51\xf6\x35\xe7\x00\xa3\x98\x21\x0c\x1e\x7c\xd1\x98\xa1\x51\x73\xdf\x05\xdf\xca\x8b\xd2\x05\x5c\xc8\x5a\x79\x27\x3d\x3c\xb2\x0e\x0e\xc4\x09\x6e\x3a\x07\x17\xe6\xd0\xba\xd0\xca\xed\xf6\xb5\x04\x5b\x16\xe4\xf6\x05\x9a\xcf\xfd\x73\x4e\xf0\x29\x2a\xe5\x4e\x6d\x31\xfe\xfc\x1b\x7c\xfe\x83\x36\xf5\x6b\xad\xed\x93\x6f\xe1\xd3\xf0\x03\x2c\xf5\x0b\x6d\x6a\x51\x57\x4a\x0d\xc5\xa9\x9b\x63\xc2\x2d\xf4\x38\xba\x90\x0d\x05\xd3\x7e\x7a\x72\xaf\x74\x65\xa5\xd0\x23\xf1\xaf\x87\x68\xb8\x31\xeb\x49\x42\xc6\x2e\xc4\xb2\xb6\x47\xae\xce\x1d\xb0\x6f\x70\x6c\xc6\xcc\x6e\xaa\x0a\x24\x79\xc3\xff\x2d\x34\xfc\x4a\x7d\xb0\x4f\xfe\x48\x5d\x94\x45\xd4\xf3\x7f\x0f\x8f\x7f\xc0\xf5\xf6\x6a\x81\x5a\xdc\x3f\x1d\x52\x5e\x21\x7b\x40\xf1\x2a\xdf\xe1\x8b\xe7\x95\x9c\x2f\x69\xf8\x9e\xd0\x8c\x55\xb2\xcc\xf4\xf2\x47\xb5\x15\x47\xe2\x85\xac\x17\x43\x7c\xd0\xdf\x1b\xd6\x1a\xd3\x59\xf4\xbf\xfd\xe3\x1e\x46\x4d\xf4\xbf\xd9\x3b\xa4\xbb\x29\xf2\x63\xe7\x58\x81\xd5\x7b\xd7\xd7\x00\x6e\x73\x91\xbc\xfd\xb2\x27\xbe\x0e\xdf\x89\x29\xc0\x22\xa2\x6e\x98\x98\x4c\xf4\x2a\xa5\xc1\x4f\x01\x35\x95\xd3\x85\x02\x81\xdf\x8a\xf5\x5f\x3e\xed\xdb\x29\x26\xc1\xc1\xdf\x3a\xec\x5f\xef\x5a\x1a\xfe\x5e\x1c\x09\x57\x9e\x9f\xe6\xdf\xe7\xb7\xa0\x6a\x0a\x70\xcc\x4e\xef\xba\x50\x62\x5a\x68\xa3\x4c\xed\x93\xd1\x86\xc1\x46\xb3\x98\x7b\x6e\x67\xf2\xb4\xe1\xbe\x26\xc0\x19\xa5\x86\xa4\x4a\xc9\x6d\xf0\x14\x09\xa7\x1e\xa9\xfd\xd0\x0f\x97\xc0\xb8\xb5\x2f\xe9\x55\xa1\xab\x1c\xb7\xf4\xbe\x95\xc5\x8d\x58\xaf\x30\x67\x43\xa5\x14\x01\x95\x6c\x94\x98\xe5\x25\x78\x9c\xb8\xe6\x8a\x0d\xa0\x35\xfa\x6e\xb8\xdc\xbb\x30\xfe\x99\x3f\xf7\x64\x45\x62\xd6\x3b\xf8\x0e\xb2\xeb\xfe\xc3\x3b\x1b\x4d\x15\xc9\xb6\xea\x2e\x68\x2c\x6b\x34\x16\x78\x19\x25\x5b\x2e\xc9\x2b\x3b\x7e\xdf\x9a\xb6\x00\x90\xbf\x57\x8e\x63\xe3\xd6\x05\x56\x0f\x34\xb8\x41\xdd\xc5\xcc\x48\x82\x83\x82\x61\xe9\x03\x28\x76\xa0\xb5\x2e\x97\x7a\x5d\x82\xff\xd2\x4a\xd7\xaa\xac\x73\x59\x14\xdb\xbd\x61\xac\xae\x0d\xf0\x3c\x1f\xdd\x98\x43\x3a\x36\x5a\x40\x1c\xd5\xd0\xb9\xb2\x52\x77\x3a\x27\x0e\x82\x10\xe0\x92\x48\x6a\xfc\x98\x95\xfc\xf2\x8b\x68\xbc\xbd\xf2\x2e\x08\x0e\xa1\x1f\xb6\x0b\xa9\x4b\x41\xe7\x49\x6e\x63\x13\x45\x71\x81\x6a\x65\xdb\x57\x69\x5d\x47\xb7\xdf\x1c\xb6\x09\x83\xa5\x39\xc4\xe1\x7b\xfc\x18\x1b\xb5\xab\xf1\x7b\x87\x6e\xba\xfc\x54\xeb\x55\xb0\x00\x85\x31\x09\x1f\x09\xf2\x36\xbd\xbd\xf7\x16\x6d\xdb\x9a\xed\xfb\x12\x83\xaf\x9c\xc6\x48\x57\x28\x20\x12\x02\x06\x34\x78\x43\xf2\x03\x71\x70\x02\xf6\xc8\x0d\x45\xb0\x35\x76\x71\xba\x7d\xbf\x7c\xca\x36\xf0\xa7\x4e\x33\x77\x6f\xf8\x15\xd3\xde\x98\xc1\xc6\xfe\xe8\x58\xb1\xc9\x8b\xe6\xf0\xdf\x7f\xa4\x63\x1e\xaa\xab\x4a\x99\x95\x2e\x33\x0a\xff\x74\xd3\xd8\x1c\xcf\xd4\xcd\xf6\xcb\xa7\x6c\x64\x7e\xbb\xed\x20\x30\x95\x50\x6e\xc4\xdf\x5c\x7c\x2c\x28\x8b\x70\x11\x20\xa0\x77\xa9\x37\x00\x70\x2b\x8d\x59\x2f\x95\x47\x72\x24\x50\x6e\x80\xc7\x07\x01\x63\xca\x07\x03\x45\x0e\xf5\xa1\xb9\x95\x62\x6d\x99\x67\xc9\x04\x51\x8f\x0e\x54\xe0\x01\xe6\x65\xe7\x01\xb8\x5d\x61\xbe\xb5\x52\x97\xfb\x67\x97\x2f\xf6\xc3\xc7\x08\xcd\x0f\xf5\x9d\xa5\xfa\x50\xfb\x2c\x13\x58\x9b\xb2\x6d\xb8\x98\x08\xdc\x87\x4c\x4d\x6a\xd6\x2b\x55\x81\x31\x68\xed\xee\x32\x4d\xa9\xbd\x65\x46\x82\x2b\xbb\x83\xb4\x06\x5f\x76\x6e\x54\xdc\xa5\x94\x8b\x36\x48\xdb\xe1\x95\xca\x09\xef\x21\x80\xcd\x2d\x48\xff\x8d\xf5\x2a\x93\x35\x8a\x02\x40\x9f\xe8\x46\xd6\xca\x3b\xe8\x92\x26\xcf\x0b\xe5\x8d\xd5\x7d\x65\x0f\x83\xb6\x98\xad\x54\x10\x19\xb5\xc9\x26\x28\xab\x77\x1c\xf3\xa3\x1d\x22\x00\x56\x6c\xad\xd1\x64\x37\x58\xb8\x39\x49\xad\x7b\x09\x0b\x77\xce\xcd\xe8\x8e\x99\x1b\x3c\xf8\x22\x1d\xf6\x51\xcb\x44\xe0\x25\x81\xaf\x86\x57\xb0\xf8\xd8\x4e\xce\xb4\xcf\x3c\xe7\x8f\x81\x77\x3d\x5c\x0e\x3d\x52\x39\x79\xc5\xf7\xc5\xcc\xc3\x4a\xca\x20\xee\x6f\x94\x58\xc2\x3e\xdd\x48\xf2\xb4\x90\x79\x21\xf4\x9a\x76\x1e\x5c\xee\xd0\xbc\x83\x56\x17\x30\xb6\x01\xe8\xf4\x46\x61\x1d\xba\x0a\x90\x70\x6f\x44\xbf\x90\x5b\x70\x66\xb6\xc4\xc0\x59\xd6\x51\x72\x66\x43\x4d\x7e\x28\xb8\x99\x80\x3b\xa0\x57\x1b\x00\x6a\xcf\xb5\x77\xb7\x0f\xf2\x09\x29\x3b\x1c\x25\xe0\x0f\xc0\x64\x10\x1b\x55\xd6\x78\xfd\xf4\xf0\x9d\x33\xc7\x51\xc5\x4b\x54\x65\x82\x3a\x9f\xdc\x7f\x0b\x55\x8b\xb5\x71\xb4\x32\xe7\xaa\x02\xb7\x95\x99\x92\xf5\xba\x02\x9d\xde\x47\x27\x89\xc1\xe8\x52\xb8\x0a\xb0\xc5\x87\x29\xd3\xdc\x6b\x3b\x7f\x5a\x04\x80\x8e\x83\xe1\x75\x60\xf2\x85\xde\x28\xe4\x86\x4b\xcd\x04\x49\x3d\x13\xc7\xd0\x87\x93\xf4\xc0\xdd\x82\x65\x33\x47\x4f\x61\x7f\x75\x82\xa9\x68\xb1\x9d\x00\xf5\x53\x20\x7e\x4c\xb4\xa1\xcd\xc7\xa8\xae\x3e\x61\x91\x08\x6a\x55\x2f\x8e\x5d\xd6\x58\xaf\x4e\xad\xd5\x72\x75\x4c\x4b\xed\xf8\x10\x7f\x1e\xfa\xa7\x61\x91\xc2\x13\x2f\xa9\x20\xb1\xaf\xbf\xe6\xb6\x07\x78\x76\xd2\xfa\x81\x13\xfa\xc0\x09\x52\x76\xff\x34\x3e\x70\x12\x7f\xe0\xc4\x7d\x80\xd2\x2a\xd9\x31\x83\x85\xab\x56\x56\x74\x9b\x56\x72\x53\x88\xf5\x6a\x18\x64\x6c\xea\xe4\xbe\x6b\xcc\x5f\x02\x0a\x34\x74\x30\xfa\x22\x3c\xf1\xae\x06\xb6\xe2\xfe\x7e\xf2\xbd\x93\xfb\x7c\xef\xc4\x7d\xef\x38\xfd\xde\x49\xe3\x7b\x27\xfc\x7b\x27\xf1\xf7\xe0\x1e\x92\x97\xa2\xd0\xd3\x1b\xc8\x34\x94\xdc\x43\xc4\xd2\xa5\xbd\xf5\xc3\x2d\x8e\xe8\xcb\x87\x49\x9b\xf6\xf7\x53\xa9\xe9\x18\x0e\x7f\x6c\x15\x89\x04\xec\xd1\x50\x16\x70\x1e\xd4\xaa\x55\x5c\x3a\xe6\x2e\xa0\xbb\x47\x72\x57\xbf\xef\xde\x32\x39\xcd\xb1\x8c\xf7\xca\x49\xe2\xce\xce\x36\x18\xf2\x94\x70\x27\xa3\xdb\x0d\xba\x66\xef\xe7\xa5\x7f\xd3\xdc\x3d\xd8\xbe\x38\x74\x89\x1f\xc0\x09\x8b\x8e\x42\x8b\x72\xe7\xd1\x8e\x57\x29\x79\xab\x2a\x23\x0b\xbc\x33\xd5\x1b\xbd\x0f\xce\x02\x03\x9f\x54\x18\x19\x27\x69\xc9\x62\x1f\xfd\x90\xd9\x12\xa9\xa8\xab\x8d\x06\x85\x06\x19\x44\x67\x25\xa4\xf4\x0b\x3b\x79\x25\x61\xe2\xa3\xcb\x25\xe7\x53\xf6\x3d\xde\x21\x7d\x30\x96\x3f\x51\x1a\x5d\x0a\xfb\x37\xf7\xdb\x36\x87\x0b\x4a\xbd\x08\x86\x95\xfd\x7d\xbb\xb4\x0f\xbd\x2a\xb6\xec\xdb\xf7\x10\x1f\xd3\x73\x39\x92\x7a\xd8\xcc\xe8\x6e\xc4\x8d\x35\x11\xc1\x60\xa9\x89\x68\x51\x30\x46\x44\x8a\x39\xf9\xd0\x00\xe1\xa0\x5f\x9c\x89\x45\xae\x2a\x59\x4d\x17\x90\xc8\x85\x4c\x05\x26\x46\x1c\x1c\x4f\x27\x63\x01\x9c\x77\x2b\x2e\xce\x0c\xe5\xfe\xf8\xca\xd9\x22\x50\xc9\x59\xa9\xa9\x82\x43\x45\x8c\x97\x60\x99\xb4\xc2\x11\x3a\x7d\xc0\xef\x9f\x94\xbc\x55\xe3\x00\xc9\x05\xc2\x7a\x48\xd2\x64\x3f\x1b\x67\x0f\x20\x55\x7e\xa9\x64\xd5\xc6\xfd\x5d\x42\x80\x52\x83\x13\xbe\x25\xf7\x48\x95\x60\xe5\x7b\x64\xbf\xfa\xa8\x50\xb3\xfa\x11\x65\x96\x40\x3d\x6d\xc7\x5a\x81\x96\x42\xf3\xfa\xb3\x4a\x2f\x07\xa2\xd6\x7e\xc5\x3c\x87\x07\xb2\x9a\x5f\xe9\xb0\x78\xa8\x29\x47\x68\x24\x7c\xfc\xd8\x9e\xde\xcf\x3a\x8f\x12\x47\x73\x4f\x8c\xa2\xd4\x7d\x76\xc6\x2c\xf9\x74\x19\x82\xc3\x20\x87\x87\xb0\x04\x02\x47\x61\xa1\x5e\x1f\x7d\x19\x68\x88\x65\x44\xd8\xb4\x1d\xa5\xed\x97\x3d\x9f\xa2\x2e\x04\xc6\x15\x74\x25\xa1\xcc\x43\x96\x35\x80\xd5\xbc\xcf\xc7\x5c\x17\x71\x27\x41\x3f\x08\x0c\x14\xfb\x1d\x76\x92\x7f\xf7\x91\x8d\xce\x95\xbe\x73\x6c\x6a\x7d\xc7\xc8\xd4\xfa\xfe\xe3\x72\xcd\x07\xa6\xd6\x6d\xc3\x72\xdd\x3e\x2e\xd7\x9f\x31\x30\x57\x1a\x87\xa5\xd6\x34\x28\xb6\xa9\xfc\x30\xd7\x7b\x0d\xe8\xde\x84\x17\xc0\xd8\x76\xf3\x03\xfb\xba\x85\x27\x3c\xe7\x63\xed\x49\x5f\x3b\x8e\x75\xa5\x3d\xc9\xeb\x0e\xa6\x75\xa5\xdf\x5d\xb7\xf0\xad\x2b\xdd\x60\x37\x6f\xf4\x92\x67\x7c\x30\xe4\xaa\x6d\x77\x2d\x19\x1a\xb9\x6a\xbb\x81\x88\x65\x5b\xc7\xf2\xbd\x7d\x25\x1e\xc1\x99\x60\x20\xb6\x60\x15\x82\x22\x49\x07\x67\xcf\x78\xc3\xf2\x14\x41\xfa\xcf\x39\x68\x18\xa0\x5e\xc2\x00\x5c\xc1\xe3\x9a\x9f\x15\xe4\x7c\xcc\xa8\xc3\xdb\xb0\xfd\x9b\x58\x70\xc4\xd5\xee\x07\xae\xf9\x2e\xa5\xfc\xfe\x30\x3a\x2e\xef\xf2\xe5\x89\x1c\x1c\x84\x59\x82\x1d\x54\xd5\xc9\x88\xd8\xa9\xb4\x4b\xd2\x0c\x30\x70\x00\x72\x98\xd9\xfb\x39\xea\xe9\xa6\x53\xb5\xaa\x85\xa4\xea\x12\x94\x90\x80\x0f\x36\xe3\xd0\xf1\x18\xec\x35\xb7\xad\xc1\x04\x1e\xf4\x9d\x47\x3e\x72\xaf\x52\x32\xdb\xba\x50\x43\xf4\x03\x7c\x24\xf6\x5d\x9a\xdf\xaf\x40\x0e\x37\xaa\x36\xed\x1e\xfb\x05\x56\x07\x6b\x1a\x80\xb9\x80\xab\x35\x44\x3b\xf8\x6f\x05\x33\xb7\xa5\xe7\x5d\x4b\x7c\xe6\xcc\x83\x3c\xa3\x84\x9d\xc7\xaf\x2e\x50\xd4\x34\xf9\xbc\x84\x20\x80\xdc\x88\x8d\xdc\x12\x02\xdd\x54\xaf\x2b\x39\x57\x98\xd6\xc0\xd2\xe2\xa3\x45\x09\xcf\x72\x45\x9e\x1f\x3e\xbf\x40\x1c\x20\x18\xa2\x04\x06\xc2\xe4\xa8\xbe\x66\x40\x61\xee\xbe\x48\x81\x19\x68\xd4\x2b\xeb\x1c\x07\x21\x89\xfe\x23\xe3\x71\xf8\x80\x02\x4d\x18\xc6\xb0\x40\x38\x8c\x2e\x55\x1c\x05\x78\x25\xe7\xf6\xa2\x3a\x8e\x23\x10\xc7\x38\x62\xcc\x1f\x80\xb9\x70\x42\xee\x15\x6c\x3e\x33\x8f\x41\x70\x8b\xaa\xd4\x20\x0e\x8d\xb1\x47\x31\xc6\x44\x68\x31\xb1\xf2\xb2\xae\x04\xe6\x08\x61\x99\x4a\xc1\x15\x58\x3a\x80\x41\xf0\x0b\x78\xb1\xae\x65\x1d\x81\x6e\xf6\x8c\x58\xaa\xe5\x04\x22\x8f\xbb\xbe\x30\x75\x69\x61\x36\x15\x3a\x96\xc2\x06\x77\xdd\x78\xe4\x52\x22\x60\xfe\x56\x99\x93\x3e\x8a\xc5\xa2\xa6\xf8\x05\x07\x6d\x61\x74\x67\x10\x1b\x0a\xa6\x3f\x16\xd1\x8d\x7b\x8b\x04\x4c\x16\x94\xf0\xcf\x06\x60\xc3\x40\xf4\x5c\x3d\x04\xd4\x32\xcd\xb0\xcb\x5e\x74\x74\x31\x7f\xae\xdd\x1c\x06\xd8\x8a\xbb\x25\x07\xe7\x26\xe6\x28\xd1\x1e\xa1\xdc\xe6\x36\xd1\x52\x32\x20\x00\xd0\x01\xb3\x23\xa2\x79\x37\x49\x5f\x92\xb0\x0f\x52\x2e\x7f\x4a\xeb\x9d\xc7\x04\xbb\x88\x65\x5c\xff\xc5\x96\x81\x03\xd0\xca\xcf\xd8\xb0\xee\x0b\x03\x46\xa3\x1c\xb8\x50\xad\x4c\x6d\xf6\x86\xe2\x27\xf9\x8f\xbc\xd8\x86\xd8\x29\x40\xee\x83\xc0\xb1\x66\xd8\xea\x50\x88\xb7\x64\x80\x81\x64\xa0\xa4\x2f\xb1\xe4\xc2\x6a\x45\xcc\x7e\x55\x59\x0e\x97\xdc\x3a\xfc\xb2\x86\x30\xd9\xb7\xca\xe1\xc4\xb9\xd2\x7c\x63\xc6\xb5\xd8\x2e\x8f\x83\xc9\x88\xe1\xf9\x0c\xb5\xa1\x19\x4b\xb9\xc5\xf8\x32\x38\x0c\x99\x8a\x02\x5c\x91\x3a\xd7\xb2\xbb\xd5\x84\x85\xfc\x06\x1a\xc4\xc3\x6a\xbc\xcb\x4d\x48\xe8\x74\xbf\x73\xc9\x2d\xbc\xc6\x15\x8a\x16\x03\x77\xa5\xba\x63\x7b\x71\x98\x89\x48\x1a\xb0\xa7\xa5\x34\x3c\x8a\xaf\xab\x4b\x63\x0c\x05\x37\x37\xf9\xca\x80\xe7\x36\x4e\x17\xb6\xe1\xec\x93\x47\xe8\xcd\x4d\xbe\x42\x3f\xaf\xdf\x74\xac\x40\x39\xe3\xc7\x25\x60\x4c\x84\x67\x0c\x2f\xdf\xdf\x94\xad\x74\x19\x2a\x3d\x6b\xb9\x46\x87\xd7\xfc\xd6\xd0\x32\x37\x81\xe8\x67\x4f\x0a\x0f\x2d\x77\x69\x6d\x11\xe3\x12\x0f\xce\xca\x21\x59\xfa\x94\xba\x85\xd6\xa8\x4d\xc4\xd1\xc1\x00\xff\x54\x76\x1b\xb6\xcd\x36\x36\xac\x31\xd7\x30\xd5\xf4\x6d\xa4\xf6\xf7\x75\x4e\xd9\x84\x28\x67\x9e\x4f\x40\xf7\x42\x56\x37\xf6\x62\x49\x36\x46\x43\x1f\x89\x4e\xe7\x4c\xec\x58\x22\x8d\x53\x00\x93\xcc\x65\x67\xa1\xa7\xc9\x12\x71\xba\xce\xdd\x4b\xa5\x0b\xc7\xfb\x53\x44\xc6\x76\x44\xe0\xe4\x50\xb9\x97\x8c\xe8\x2e\x2c\xe9\xb1\xf2\xbb\x1c\x2c\xbf\xf1\xd1\xd2\xc4\x40\xe6\x6b\x94\x1d\x32\xa0\x0f\x68\x88\x43\xc8\x39\x00\x87\x96\xd8\x33\xf8\x46\x26\x0b\xe8\x6e\xc0\xa3\xdd\x12\xc5\xaf\xe3\xc1\x5d\x8b\xa5\x75\x99\xb6\x30\x60\xcb\x12\x1a\x1b\xfa\x5e\xfc\x30\xf2\xc7\x6c\x71\xd8\x73\x7e\xac\x77\xf3\xd4\xc4\x34\xb7\xb3\x42\xc2\x7e\x7f\x8b\xcf\x07\x9a\x9d\x0d\x09\x9a\x1d\xd6\xff\xc2\xfe\x1e\x08\xd0\x15\x61\x3a\x78\xd4\xce\xd8\x06\xed\x54\x09\xb5\xcd\xcd\x40\x70\x72\x9d\x0d\x49\x97\xcc\xa7\x8f\x42\xfb\xa2\x4b\xdd\xfe\xe8\x46\xa3\x61\x37\x37\x8c\x8b\xbb\xc6\x74\xb4\x73\xc4\x07\xbb\x2b\x87\xa9\xd8\x4d\x26\x94\x8b\x08\xb6\x4d\xd3\xe8\x8e\x69\x8c\x08\xa4\x83\x33\xda\x31\x70\xc1\xcf\x10\x52\xf6\x96\x35\x3a\x8c\xc5\x51\xdd\xdf\x2b\x4a\xc8\x7e\xa3\xb6\x3e\x42\xce\xa5\x70\x53\x1f\x6a\x57\x17\x38\x50\xe4\x73\x10\x87\xf1\xb8\x78\xa0\x1f\x77\x93\xd9\xe5\x5c\x3d\x57\x35\xba\x3f\x40\xc9\x63\xa8\xac\x2b\x9e\x33\x8a\xf5\xe3\xf1\xe3\x00\x29\x74\x5e\xde\xe6\x95\x2e\x31\xd1\xa3\x2c\x7f\x36\xea\xec\xf2\x05\x73\x58\x78\x55\xa9\x99\x15\xab\x02\x71\xc8\xe2\x50\x96\xaa\x02\xdf\x41\x27\xb6\x2e\x65\xb9\x75\x51\x0f\xc6\xa5\xab\x17\x13\x5d\x2f\x10\x26\x81\x72\x5c\xfe\xf5\x7b\xf1\x67\x4b\xeb\x2f\x4e\xdb\x6a\x28\x75\xa0\xab\x11\x28\xc3\x45\x17\x90\x14\xfe\x9c\xe5\xb7\x7f\x01\xc1\x02\x4d\xab\xd1\x94\xf4\x58\xd3\x7a\x90\x19\xcf\xe5\xad\x74\x7f\x50\x5a\x78\xf1\x2c\x29\x0b\xa9\x42\xe9\x6b\xbd\xc4\x68\x12\x3e\x71\x98\xc6\xbe\x2e\x54\xb1\x52\x3e\x15\x1f\x04\x5d\x19\xae\x0e\x21\xcc\x88\x78\x01\x80\xb1\x02\xd1\xd3\xc0\x4b\xc0\x81\x3d\x40\x50\xeb\x54\x2f\x57\xb2\xca\x0d\xde\x07\x5c\x1d\xba\xff\x00\x26\x01\x60\xdc\x38\x25\x55\xa4\x1c\xbf\x70\xf9\x34\x82\x07\x11\xe0\x4e\x60\x08\x36\xa4\xf6\x46\x53\x7a\xb1\xc5\x3c\xf2\x86\x92\xc8\xeb\x09\xdc\x8b\x2c\x0d\x98\xa5\xbc\x4e\x16\x2d\x28\xfa\x6b\xe3\xea\x8b\x95\x36\x39\xc1\x22\x63\x12\xc9\xcb\x17\x0e\xc0\x87\x0e\x4f\x17\xf4\xb2\x94\x5b\x8a\x9c\x80\x74\xe1\x18\xc7\x15\x04\x73\x6c\x66\xb6\xae\x5c\xdf\x89\xf0\x80\x9c\xe1\x09\xc2\x1e\x3e\xee\x3f\x5a\x6b\xb4\xcd\xd9\x87\x44\x72\x19\x86\xc1\x87\x32\x32\x72\x6f\x6a\x54\xd1\xda\xa5\x7c\x5d\x69\x5d\xa3\x88\x3c\xb0\x3f\x4d\x2d\x2b\xd8\x30\xec\xd9\x8c\x4c\x0a\xe1\x71\x12\x22\xef\x00\xad\x55\xbf\x23\x8e\x26\xfd\xf8\x10\x3e\x0b\x49\xd1\x92\xf2\x87\xad\xa5\x7d\xab\x50\x7c\xb3\x7f\xf5\xf7\x98\xda\x0f\x41\x82\xf9\xd9\x51\x29\xa3\xea\xfe\x5d\x5f\xa7\x8b\xc1\xee\x0f\x76\x97\xe2\x03\xc3\x61\xcd\x38\xf3\x39\x93\xb5\x64\xdc\x66\x37\x91\xc4\xcc\xbf\xbb\xf0\x21\xf7\x65\x84\x06\x1f\xf2\x1f\x10\x7c\x2c\x8e\x76\x75\x2e\x2a\xff\x13\xc2\x71\x1e\xb1\xda\x4e\x91\xed\x22\xa1\xca\x8c\xfd\xe9\xe8\x47\xf3\x41\xef\x3c\x2d\x57\xce\x53\x72\x2a\x73\xf8\x08\x6a\xe3\xf1\xcf\x3f\xf3\x56\xd0\xc3\xa0\x91\x87\x68\x0c\xdf\xae\x77\xf0\x27\x22\x64\xbb\x2f\xd0\xb3\x4e\xa3\x81\x1f\xa9\x65\x5e\x9e\x97\x99\xeb\x27\xb5\x74\x3f\x0c\x20\x34\x4f\x41\x89\xa7\x87\x96\xbc\xf8\xf3\x11\x55\x82\x9f\xbb\x1b\xe5\xe9\xa9\x32\x4b\x1a\x18\xc6\x05\xdf\xde\xdd\x54\x70\xf8\xbe\x92\x79\x81\x23\x29\xfe\x22\x9e\x02\x34\x2a\xd4\x17\xa3\x80\x35\x75\xaf\xe5\xe9\xe7\x02\xfd\xc8\xa1\xb9\x83\xf0\x0d\xbe\x9f\xee\x5a\x78\xc9\x1a\xc7\xf9\xf7\x6b\xbc\x07\x71\x89\x70\xe4\xb4\x6f\xbd\x3b\x97\x39\x78\xbc\x02\x95\xc6\xe9\xd3\x56\xf4\x5d\xd7\x21\xef\x30\x97\x84\x32\x45\x5e\xd6\x08\x50\xb9\x8f\xe1\x90\x23\xf1\x04\x74\xc3\x94\x80\xfc\xad\xac\xca\xe7\xba\x3a\xce\x32\x95\xbd\x54\x1b\x87\xd7\x1e\x10\xea\x11\xbe\xfe\x55\xa5\x3f\x6c\x29\xb6\x05\x60\x4d\x28\xb6\x12\x9e\x27\xb1\x9e\x58\xe7\xfc\xaf\xe7\x2f\xaf\xae\x5f\x5d\x5e\xfe\x74\xfd\xe6\xe2\xff\x9e\x73\xbf\x7f\x34\x00\x9f\x28\x0a\xdd\xc9\x5e\x79\x0c\x07\x71\x24\xde\xf5\xe2\x3b\x4f\x6f\x20\x7a\xec\x0e\x63\x7f\x32\xee\x69\x7f\xe6\xe6\x0c\x23\xee\x29\xc2\x15\xec\x4a\xbd\x36\xf4\x4b\xa0\xd5\xb8\x97\x46\x4f\xfd\xc5\xb2\xc7\x72\xd4\xfc\xaf\x80\x68\x71\x7e\xeb\x50\xfb\x0c\xa5\xd7\x1d\x1d\x1c\x6c\x36\x9b\xe1\xe6\xdb\xa1\xae\xe6\x07\x57\xaf\x0f\xce\x2e\x5f\xec\x43\x2c\xd2\xfe\xb7\xfb\x18\xcb\x72\xe0\x8f\x23\xf8\x7d\xe1\xa9\xe1\x61\x64\xc7\x32\x9c\x3b\x35\x49\xc4\xee\xf7\xc1\x81\x88\xd1\x56\x73\x03\x66\x01\x90\x84\x98\x32\xf4\x50\x94\x1a\x8f\xc9\x12\xb2\x5c\x50\x5c\x99\x3d\xfc\x1f\x88\x98\xc4\x08\x51\xd5\x5c\x74\xcb\x97\x4f\x87\xf5\x42\xd6\xe8\xd9\x61\x5e\xd2\x77\x61\x2c\x41\x12\x0f\x6d\x41\x83\xa0\x09\x0f\xa6\x76\xac\x20\x4d\x0c\xeb\x40\xbe\x54\x6f\x6a\xb9\x5c\x8d\xba\xa0\xa7\x79\x18\xe3\xd0\x17\x17\xbf\xfc\x22\xce\xec\xe2\x2e\xf5\x86\xa0\xeb\x2d\xb9\x2c\x99\xdc\xf0\xa1\xdc\x40\x32\x19\xf7\x88\x87\xe7\xbf\x49\x23\xfc\x64\x95\x66\x47\x8c\x70\x49\x20\x58\x98\x72\x7a\xe4\x70\x8c\xae\x74\x69\x10\x2d\x10\xd3\xc3\xc4\xa0\x1f\x99\x2a\x14\xd9\x80\x42\xbe\x74\x12\x09\x95\x51\xc2\x6c\x0d\x40\x98\x91\xaf\x03\xda\xc2\x0a\x9f\xe2\x46\x17\x04\x25\x55\xa9\x6c\x4d\xb2\xd0\xac\x52\x7f\x5f\xab\x72\x0a\x71\x5d\x73\x59\x4d\xe4\x1c\x84\x28\x06\xd7\x85\x51\xfd\x40\xda\x51\x9e\x2e\xd4\xf4\x46\x8c\x39\xae\x11\x04\x1a\xba\x58\x28\xe5\x23\x9d\x48\x26\xc3\xf6\x87\x78\x50\xc2\x39\xca\x62\xa4\x29\x92\x30\x11\x6b\x91\xc3\x5c\xfc\x6c\xd0\xc3\x17\x5d\x39\x00\xa9\x4c\x7a\x38\xaa\x2c\xa6\x4e\xee\x19\x63\x7a\xed\xd1\x3a\x1a\x93\x03\xf8\x67\x66\x3d\x81\xc0\x2b\x65\xf6\x12\xb4\x17\x7b\x51\x42\x8c\xa3\x6f\x05\x45\xf3\x1e\xbf\xba\x10\x13\x50\x86\x97\x56\xcc\x2e\xf2\x7f\xd8\x86\x3a\x79\xf3\xef\xeb\xbc\xba\x31\x43\xf1\xc6\x93\x0c\xd0\x6a\x96\x47\xca\x2a\x2f\xb6\xde\xa0\xc4\x52\xa2\x3a\x57\x70\xbf\xdf\x0f\xc5\x74\x6d\x6a\xbd\x14\x92\xe1\x47\x7b\x60\x03\x6a\xfe\x54\x96\xe8\x6f\xe9\xba\x00\x56\xb3\x7b\xa6\xda\x3c\x8d\x32\x6c\xba\xdb\x5e\x16\x90\xb7\x73\xd3\x92\x6f\xf3\xab\x8f\x5c\x17\x8c\xba\x29\x9f\x4a\x2f\x32\xa9\x31\xe3\x40\xa3\x29\x8c\x91\x3a\xe7\xce\x28\x4e\x3d\xaa\x14\x63\xe6\x7c\x6c\xca\xb0\xe2\x2a\x48\xf3\x89\x1a\x35\x56\x94\x35\x32\x71\x7e\x6a\x7c\xba\xbf\x8c\x62\xae\x79\xb2\x87\xcc\x01\x25\xe2\xc0\x20\x58\xc4\x0c\x92\xab\x83\x41\xce\x90\xdf\x5f\xa1\xc0\x18\x94\x9b\x21\xa3\x7b\xd8\x78\xb9\x42\x4e\x43\x87\x4a\xf3\xbd\xa9\xf5\x8a\x9d\x2d\x5e\x1e\x85\x97\xc9\xec\x36\x73\x6d\x52\xb9\xeb\x48\xff\x1f\x2b\xfe\xd3\x26\xc6\x17\x06\x9f\xae\x93\x1f\x23\x50\x85\xc3\x97\xf9\x97\x91\x47\xe8\xaa\xd2\x2b\x97\x61\xc6\x97\x88\x3c\x63\xfc\xd3\x46\x02\x17\xaa\x7a\x47\x16\x19\xf7\x8e\x0d\xd8\x3b\x57\xf5\xfd\x21\xce\x19\x45\xc5\xde\x39\x63\xc1\xc5\xc6\x6d\x72\x4c\x00\x41\x2d\x64\x74\x59\xac\x16\x15\x0c\xad\x8c\x9b\x00\x91\x2f\x54\x86\x5f\xdb\xf6\x5a\xc3\x52\x00\x64\xc0\x8d\x19\xa2\x96\xc1\x4c\xf5\x78\x68\x3f\x8c\x7d\xed\x91\xd0\xdb\xae\x76\x2d\xa4\xdb\x1a\x16\xaa\xa6\x7d\x8b\x81\x00\xbc\x1f\x6a\x7c\x32\xc6\x24\x86\x8d\xd7\x84\xfd\x2a\x9e\xed\x2e\x36\x8a\x5e\xe3\x59\x4d\xb7\x9e\x23\x96\xb8\x08\x70\xb7\x93\xba\xde\x18\x68\x87\xa4\x29\x97\x59\x69\xbc\x5b\xf0\xb8\x8a\x73\x9e\xfe\x0a\x4a\xcf\x03\x4e\x99\xa7\xd0\x94\x06\xef\x49\xc3\x87\x0d\xe5\x18\x98\x71\x8d\xf0\xc1\xfd\x98\xa7\x85\x2c\x5f\x03\x68\x79\xcc\x44\x46\x8d\xac\xfd\x8e\x5d\x34\xfb\x15\x32\xff\x78\x18\x0e\xb7\xc1\x1b\x6c\x2b\x20\x1b\xa6\xbe\xc3\x6e\x4f\xfa\x62\x8a\x5a\xc9\x9b\x95\x5a\x77\xe2\xb7\xfd\x78\x4f\x80\x5b\x1c\x4a\xfd\xaa\xb1\x32\xec\x8d\xcf\x25\x2f\xe8\xa5\x64\xa3\x25\x14\x16\x90\x5b\xd3\xbf\x6e\xb1\x00\x4a\x54\xc2\x92\xdb\x86\xfb\x77\x18\xcc\xe4\xab\x69\xb7\x93\xd7\x77\x0d\x27\x8a\xd2\x27\xe8\xad\xdc\x31\x9e\x10\x43\xa2\xc4\x29\x40\x6f\xb2\x90\x7d\x8f\x55\x63\xb9\xea\x23\xc2\xc4\xdb\x22\x42\xe7\x23\xea\xf6\x4c\x57\x81\xca\xc5\x39\xf9\xbe\x91\x38\xeb\x6c\xb4\x5e\x4f\x6b\x9b\x01\x01\x2a\x15\xc9\xf8\x05\x00\xe4\xc9\x32\x0b\x44\x64\xb9\x15\xa0\x0d\x56\x60\xb3\xab\xb5\x88\xfa\x80\x58\x05\x8f\x5e\x80\x43\x0f\x50\x9f\xe9\x75\x99\x3d\x1a\x0a\x71\x1c\x88\xd0\x18\xa0\x1c\xab\x67\xe2\x11\xf5\xfa\x91\x98\xe6\xd5\x74\xbd\x74\xde\x5f\x10\x6e\x63\xd6\x0a\x85\x45\x48\xe4\x68\x34\xef\x90\x70\x62\x99\x0f\x83\x6d\x19\xd7\x38\xb1\x16\x5f\x7e\x9f\xca\x1f\xe2\x05\xe8\x61\xca\xde\x7a\x89\x1a\x90\x46\xd8\x95\x23\xb5\x37\x1a\x92\xb1\x99\x7f\x47\xa1\xf5\x6a\x20\x64\x86\x51\x89\x96\x5c\xbd\x50\xcb\x16\x20\xd8\x38\x97\xa5\x74\xee\x6a\x0b\x5d\x64\x42\x97\x10\xfb\xef\x27\x86\x84\x75\x4b\x6d\x03\x9a\xf5\x89\xb2\x9f\xb0\x97\xa0\x26\xdd\x07\x0e\x1d\x8d\x64\xf6\x4e\xc6\xc5\x2f\x1c\x9f\x35\x50\xa7\x76\xc2\x0d\x46\xde\xf8\x75\xd8\x72\x2d\xe9\x6a\x24\x52\xd9\x95\x42\x3e\x37\x0c\x6a\x8c\xd3\x24\xc8\x53\x01\x48\x0b\x9b\xdc\x28\x06\x0a\xc7\xba\xb5\xf3\x96\x0c\xc7\x43\xdc\xa3\xf1\x2b\xdb\x86\x0c\x60\x21\xc6\xe0\xed\x80\x5e\x6f\xe3\x4c\x39\xb1\x0c\xfc\xe1\x61\xc2\x7d\xd0\x44\x5e\x7b\xd0\xdf\xd0\x8c\x50\xa3\x8b\x95\xdd\x5f\xf8\xbb\xaf\xf8\x27\x98\x68\x42\x36\x40\x54\xb3\x79\x11\x10\x43\x54\x1d\x91\x01\x38\xa0\x40\x97\x09\x9c\xdd\x15\x3c\x43\xac\x37\xcb\xf3\x42\xe1\x16\xb1\x6d\xaf\x35\x03\x7a\x9b\xd7\x72\xb7\xc6\xa8\x3d\x09\x0a\x88\x56\xdd\x95\xde\xe5\xef\xdf\x33\x0d\x77\x2a\xbb\xee\xea\x7d\xa2\x7c\xba\xc7\x10\x24\x35\x00\xff\xde\x77\x7c\xe7\xa7\xe2\xe3\xf8\x9e\x5f\x6b\x54\x4a\x16\xf1\x3d\xbf\x9d\x1c\x5e\xf7\xfc\x78\xb3\x56\xc7\xd7\xc9\x53\x63\xef\xf0\xc1\x83\x44\x8e\xe2\x0b\x3b\xd6\x96\x05\xed\xce\x0f\x68\x71\x0b\xfa\x93\x89\xce\x0b\x55\xad\x0a\x59\x13\xd6\xfa\xd4\xf9\xaf\x06\xad\x42\x7a\x1f\x0f\x58\x89\xb0\x63\x5b\x41\xb4\xfd\xb7\xe1\x3a\x9b\xb4\x54\xae\x01\xd1\x04\x6a\x47\xe8\xcb\xf0\x64\x90\xee\x30\xbb\xa4\xdf\x40\x88\xf3\x11\x09\x93\xf4\xf0\x3c\xaa\xbc\x07\x89\x92\x85\x38\x0f\x12\xa5\x38\xc2\x8a\xe1\xc9\x61\xc0\x79\xf2\x45\x4a\xb5\x11\xe7\x7d\xc4\xbc\x76\x32\x2a\x13\x4a\xa1\x51\x81\x02\xcc\x43\xf2\x0c\xe3\x8f\xc3\x17\x92\xd7\x9c\xc5\x88\x23\x7c\x0b\x5f\xc3\x72\x7c\xe2\xdc\xf7\xff\xf9\x71\x40\x4d\xf7\x6f\xf9\xb8\x84\x8f\x24\x63\x89\x75\xf8\x43\x5b\x54\x66\x84\x33\x8a\xfa\xb3\x2b\x8d\x23\x4d\xd0\xd5\x07\x5f\x7d\x85\xea\x68\x88\x4f\xc7\xa3\xf5\x56\x55\x5b\x4c\xb6\x01\x8e\xd4\xa9\x22\x02\x35\x7b\xa2\x52\x46\x17\xb7\x8a\x94\xd9\x28\x65\xe8\x12\x32\x75\x88\xb7\x6a\xf2\x63\x5e\x7b\x43\x36\xe2\x35\x90\x4f\x3c\x14\x20\xa8\xe2\xa0\xc2\x26\xdf\x75\x4b\x38\xe4\x54\xe9\x7f\xff\xc3\x1f\x9e\x3e\x79\xf2\xf4\xc9\x1e\xac\x24\xef\x22\x96\x28\xd6\xbd\x9d\xfd\x2b\xd4\xdc\xef\x13\x5a\xb3\x28\xf5\xbe\x5d\x22\xfb\x94\xba\x04\x0e\x09\x91\xa6\x56\xc3\x35\x00\x14\x93\xdb\xc9\x80\xdf\xd9\x71\x0e\xf9\xc1\x52\x13\x0c\xb2\xac\xe6\x11\x68\x1d\xbb\xfa\x50\xce\x0a\x57\x92\x78\x07\xfa\x62\xd3\x53\xb6\xb8\x88\x94\x67\xef\x03\xfa\x03\x88\xf0\x2f\xb3\x25\x35\x00\x41\xa5\xb3\x11\xa1\x6b\xfc\xa4\xa3\x56\x85\x8a\x03\x56\x53\xd8\x79\x68\xeb\xa7\x9d\xad\x01\xc2\x48\xee\x45\xe5\xc3\x8d\x1f\x25\x70\x2e\x0e\xf4\xc4\xe3\xc7\xe2\x21\x75\xb5\xf5\xb4\x6d\x53\x99\xec\xd9\x5a\x3b\x8e\xaf\xbc\xcc\xd4\x87\xcb\x19\x95\xb5\x17\xec\xfd\xa7\x69\x9b\x82\x67\xf9\x0e\x83\x0d\x40\xab\x43\xdb\x62\x8c\xfb\x81\x78\x04\xb2\x62\x0a\x0b\x98\x1b\x51\x29\x50\x37\x82\x4b\x26\xba\x2b\x83\x44\x82\x99\x2e\xcc\x50\x5c\xcc\xc4\x56\xaf\x7b\x95\x12\x8f\xc4\xd7\xe2\x91\x51\xca\x45\x04\x0c\xdc\x0b\x94\x55\x85\x84\xe9\x71\xf7\x0e\xe7\x10\x90\x7e\x12\xb9\xea\x10\xa8\xf5\xae\x7c\xca\x7a\x5b\xc1\x88\x12\xf2\xba\x38\x11\x6d\x28\xde\x28\x85\xd9\x34\x17\x75\xbd\x32\xa3\x83\x83\xd9\x64\xb8\x54\x07\x00\xcf\x84\xe9\xf1\xf6\x9d\x1e\xdd\x76\x00\xb2\x7c\x33\xa7\x0b\x9f\x47\x33\xfc\xb7\xd3\xda\x15\xae\x05\xee\xbf\x8f\xd1\x2f\x1c\x5b\x90\x5d\xac\xe8\xe0\x8d\x74\xe1\xbf\xc8\x26\xdf\x46\xe6\x63\x2a\xee\xd0\x6f\xbf\xd9\x55\xd9\xb9\xd7\xc1\x51\xaf\xc9\xff\xe2\x5d\xbe\xd7\x76\x42\x5a\x79\x23\x9f\x6d\xc3\x64\x10\x46\xaf\x93\x3f\x19\xe7\x42\x8b\x12\x89\x9e\x18\x58\x11\x79\x3b\x92\x57\x92\x93\xdf\x5a\x4f\xcc\xb9\xaa\xff\x4a\x29\xb7\x9d\x68\xee\x15\xdf\x91\xa0\x41\xab\xa1\x19\x19\x7c\x6f\x89\x12\x3f\xc5\x80\x6d\x8c\x93\x33\x82\x7d\x12\xcb\x34\x0c\x94\x7e\xb6\xfe\xe9\xfc\x87\x50\x07\x0f\x76\x2c\x3b\x83\xc8\xb0\x80\x7d\x18\x55\xe3\x2f\x30\x9c\xcd\x55\x8d\x59\x32\x1f\x88\xc0\x58\x8c\xaa\xfb\xb7\xb2\xe0\xf2\xb9\x74\x0d\x61\xad\x7a\x26\x7a\x46\xd5\x3e\xe2\x05\x91\xe2\xc1\xed\x88\x3f\x76\x9b\xa2\x77\xe8\x83\x4a\xfa\x92\x3c\x8c\x7b\x0e\x6c\x5f\xcd\x66\x6a\x4a\x0e\x35\xd2\xae\x18\xbd\xea\xc5\xe9\x80\x6e\x65\xe1\x35\xd3\x7c\x7c\xfb\xf7\x68\x25\xfa\x9a\xb5\xb4\x33\x7e\x91\xb4\x14\x3d\x96\xcd\xba\xa8\x1b\x04\x43\x8e\x00\x68\xaa\x6f\x10\x10\x75\x2f\xe9\xd0\x84\xc8\x98\x96\xbe\x23\xe9\xb8\x93\x38\xbd\xcd\x7e\xb6\x55\x64\xdd\x26\x76\x7a\xaa\x4b\x44\x7b\x8c\xb5\x52\x8e\xd9\xa6\xa5\x7e\x13\x4e\x1a\x31\x51\x60\xab\xf4\xe2\x5f\x0c\xc2\x19\x83\x6b\xa0\x63\x83\x07\xb8\x7b\x73\x95\xa5\x5f\x1d\x8a\x7f\x31\xc4\x49\x91\x38\xc6\xb0\x60\x1a\x3d\x80\xda\xcd\xe7\x79\x29\x1b\x58\xa7\x42\x56\x7a\x5d\x66\x03\x30\x44\x92\xd6\x0f\x4f\x8b\xfe\xde\x10\x19\xee\x1b\x32\x6c\x7f\x0e\xd3\x1d\x08\x37\xea\x61\x9f\xb2\x89\xfb\x98\xba\x50\xe0\x6e\xff\x2c\xab\xd0\x45\x94\x4e\x15\x5e\x9d\x46\x02\x2a\x0a\xd9\x78\xa4\xa7\xaf\x87\xca\x31\x52\xba\x40\xf2\xe5\x91\x87\x6c\xd3\x3b\xea\x01\x7e\x18\xae\x98\x46\x29\xc8\x4b\x14\x70\xbd\x3e\xa7\x67\xd1\x3a\xcf\x7d\x82\xeb\x18\xc9\xc1\x8a\xfc\xc9\xb7\x3f\x6b\x18\x53\x27\x32\x58\x7d\x7c\x6e\x98\x5a\xf4\x8e\xd1\x7e\x48\x2e\xec\xae\xc9\x7a\xd6\x28\xdd\x0e\x06\x7e\x55\x6d\xbd\x51\x9c\x14\x68\x0e\x5b\xd5\x4f\x08\x2a\x82\x24\x9a\xa8\xc1\x87\x92\x05\x41\x01\x0e\x78\x0c\xa8\x4a\x4e\xf4\x5e\x9b\xd2\xdf\xbb\xf7\x82\x10\x7f\x4e\x5d\x58\xdc\x12\xd9\xb5\x26\xd6\x66\xd1\xef\x74\xaf\x6f\x1c\xdf\xcd\x81\xb1\x5f\xe8\xa6\xef\xe3\xda\x1b\x45\xfc\x56\xa2\x58\xf0\x30\x75\xad\xc5\x2b\x9f\x7d\xa9\x39\xd7\xde\x37\x3c\x16\x2e\x20\x15\x44\xfc\xe8\x37\x74\x90\xf9\x03\x9a\xd2\xf7\x99\xa3\x13\x3e\xf1\x9e\x33\xa7\xe1\x4d\xab\x13\x4d\x26\x6b\xd9\xf4\x03\xf9\x5d\x8c\xef\xce\x3d\x3b\x0e\x0d\xf9\x9d\xad\xf0\xea\x43\xad\xca\xcc\x34\x82\x4e\x3a\x0c\xed\xe9\x70\x35\xd8\x42\xdc\xf8\xfb\xd9\xdd\x89\xed\xa4\x0b\x03\xd9\x1d\x1e\x69\xbf\xf2\x33\xb0\xf8\x1a\xf4\xb9\x22\xa0\xdf\xd9\xc5\x41\xf7\x1a\xd9\xfb\xdc\xa5\xfa\xcd\x93\xa7\xdf\x1e\xbc\x3d\xdb\x6f\x2e\xd9\x7d\xfb\xea\xe9\xd3\x27\xff\xe6\xd2\xbe\x08\xbf\x88\x21\x01\x56\xb2\x7c\x2f\xec\xb3\xff\x59\xb8\x77\x2f\xdc\x30\x50\xff\x0d\x97\x6c\xe8\xdc\xa0\x6d\x45\xb8\x10\x93\xf3\x97\x67\xd7\x3f\x9e\xff\xe7\xe9\xe5\xd9\xf9\x1b\xcb\xf3\xbf\x1b\x88\xa7\xdf\x0e\xc4\x37\xff\x3e\x10\xdf\x7e\x83\x5e\x14\x57\x72\x32\x20\x2c\xa6\x81\x38\x37\xd3\x81\x78\xb3\x92\x53\x85\x8c\xfb\xea\xf8\xf5\x95\x23\x20\x8e\xc4\x37\xdf\x7c\xe7\x62\x57\x20\xa0\x23\xdd\x26\x56\xce\xd9\x19\xfe\x21\x1e\x3f\x16\xbd\xb4\x16\x38\xba\x6e\xf2\x32\xd3\x1b\xa2\xee\xe2\x2b\x5e\x10\x2e\x2e\xa8\xd7\xe1\xb0\xbd\x9b\x3a\xaf\x1b\x45\x6d\x38\x78\xbe\x88\x74\x23\xa4\xe3\x05\xa0\x58\x7e\x7c\xf0\xe0\xe0\x40\xbc\x55\x93\x9b\xbc\x16\xda\x0a\x06\xf6\xca\x01\x89\x28\xd6\x98\x1d\x74\x5c\xab\x0f\x35\x8c\xfc\x98\xa7\x47\xa0\x34\xc3\xb4\x8f\x2c\x11\x0c\x60\xc5\x70\x85\x4a\x19\x5b\x72\x8c\x01\x18\x58\x1b\x7d\xf1\x2e\xce\x91\x62\xce\x29\xe6\x68\x4a\x95\xc6\xd2\xc1\xef\x0e\x84\xd1\x98\xe0\xb3\xec\xd5\x14\xcb\x30\x64\x33\x72\xe5\x5a\xf5\x09\xf3\x61\xeb\xa4\x13\x01\x2a\xaa\x68\xac\xec\x83\xdc\xbc\xaa\x94\xa9\x35\x28\x87\x11\x73\xf4\xe2\xfc\xbb\xaf\x07\x1e\x44\xd9\xc5\x16\x69\xee\x68\x2c\x5c\x34\x19\xe2\x02\x2a\x60\x54\x1e\xdd\xc9\xd2\x99\x50\x90\x09\x6e\x7d\x7e\x74\x97\x59\x88\x58\xc7\x7c\x6f\x80\xb8\x3a\xad\x87\xe2\x7f\xcb\x95\x2c\x95\x1d\x81\x4c\xe9\x79\x25\x57\x8b\x7c\x6a\x89\x19\xbb\x7c\xcd\x80\xf2\x53\x91\xbc\xd7\xff\xaf\xf5\xb7\x4f\x9e\x3c\xd9\xf3\xd9\x80\x2b\x35\xd5\x55\xa6\x32\x41\xf4\x8a\x2d\x0e\xe3\xda\xa8\xe7\xe4\xaa\xcd\xd6\xe9\x99\x6d\xf1\x7d\x06\xb3\xff\xb0\x63\x67\xfc\xf2\x8b\x48\x87\x33\xfa\xfd\x17\xf1\xa7\xc6\xb3\x3f\x1f\x89\xa7\x4f\xd9\x89\x73\xb9\x52\x95\x84\xa7\xdf\xd8\x81\x28\xd6\x99\x32\xc2\xcf\x5e\x98\x3c\x1c\x69\x6f\x8a\x9f\xe5\x98\x78\x14\x62\x70\x60\x81\xb9\x9c\x1a\xe2\x35\x24\xfd\x2a\xc5\x8d\xda\xae\x20\x81\x11\xe5\xc7\x49\xbc\xee\xc2\xbc\x7b\xc1\x1d\x32\x85\x89\x23\xfa\xe2\x10\x7e\x72\x27\x17\xd4\x9a\x50\xa9\xa3\x23\xd1\x43\x5e\x0f\xba\x4f\xfe\x72\x78\x6b\x2f\x8d\xf6\xe6\x1c\x69\x56\x6c\xb1\x95\xac\x8c\xba\x28\xeb\x7e\x54\xb0\xbf\x37\x10\x4f\x9f\xec\xe1\x30\x04\x11\xf3\xd5\xf1\xe9\xf9\xc9\xf1\xeb\x6b\xe2\x54\xdf\x12\x84\x7e\x78\xfe\xc3\xf1\x6b\x2b\x77\xc2\xc1\x35\x9c\x55\x7a\x79\xba\x90\xd5\xa9\xce\x54\x3f\xaa\x4b\x2b\x9b\xbc\x43\x31\xd7\xb8\xca\xab\x18\xe8\x37\xe8\x1b\x31\xd4\x3c\x24\x69\x85\x24\x7a\x74\x1e\xb3\x5d\x3e\x72\xb0\x6e\xed\xe1\xfc\xa3\x10\xc9\x80\x40\x49\x23\xd1\xd3\xe5\x49\xa8\xdf\x73\x7a\x6f\x07\x78\x94\x16\x70\xc9\x1a\x1f\x30\x2d\x39\x4f\xc9\x36\x12\xef\x7a\xb5\x5e\xf1\x65\x59\x82\x17\x7b\xad\x57\x3f\xaa\xad\x9d\x5e\x43\x3f\x3d\x0b\xa1\xdf\xaf\xa4\xa9\x55\xef\xbd\xf3\xa2\x9e\x46\x24\x3e\xab\x63\x69\x2b\xda\xfa\x16\x97\xb9\x67\xf7\x4e\x8a\x75\x45\xad\xee\xea\x29\xe4\xd6\x6c\xed\xf7\x8f\x6a\xfb\xf3\x8a\xfe\x0e\x69\x38\xdb\xfa\xfd\xa6\x96\xd5\xe7\x4d\xe9\x69\x42\xe4\xce\xbe\x43\xa9\x5f\xd5\x7b\xfa\xce\x6f\xd9\xff\x9f\x01\x17\xf7\xd7\x0e\x00\x52\xb9\x73\x04\xb0\xd8\xaf\x1a\x02\xf7\xa5\x5f\x35\x06\x28\x53\x1f\x88\xab\x4a\x4e\x6f\xbc\x2f\xfc\x46\xf5\x6e\x41\xc0\xad\xc8\x7d\x3f\x13\x32\x70\x53\x82\x10\x84\x13\xc9\x3e\x45\x46\xb1\x90\x06\x44\xac\x1f\x5d\x31\xaf\x34\x4c\xa0\x31\xdd\x47\xa4\x3b\x19\x3d\x61\x2f\x1f\x20\x82\x77\xe6\x33\x9d\x4d\xf5\x72\x29\x4b\xcc\xc6\xec\xd4\xa1\x15\x25\x1e\xf5\x11\xb5\xcf\xf3\x4a\xcd\xf4\x07\x38\x18\x8c\x18\x3b\xaa\x63\x9f\x7b\x4c\x57\x10\x78\x4c\xc4\xc0\x56\xd9\x9f\xae\xeb\x01\x84\x83\x0c\x28\x02\x74\x5f\x02\x04\x40\x3d\x1d\xee\x61\x44\x6d\xbd\x00\x80\xe0\x52\x8b\xe9\x42\x42\x0e\xaa\x0a\xb3\x3f\x19\x55\xf9\x74\xd6\xec\x4c\x71\xfd\x3f\xc5\xcf\x44\x4e\xb4\x5c\xe4\xe6\x2f\x86\xd3\xba\x2a\x7e\x54\x60\xa5\xe2\x8f\x65\x51\xb7\x3c\x5d\xaa\x5a\xfe\xa8\xb6\x7b\xe2\xf1\x63\x8a\x7f\xa1\xda\x08\x25\x68\xff\xb2\xd7\x9b\xbf\xaf\xf3\x5b\x59\x50\x00\xf2\x71\x51\x7f\x5f\x21\xf0\x98\x93\xbf\xd8\xa8\x8a\x87\xad\xad\x79\xfc\xb8\xa5\x35\x11\x52\xda\x55\x25\x4b\x03\x6e\x05\x34\x97\xb5\x5e\x09\x16\x08\x62\x50\x23\x45\xa2\xa4\x3d\x45\x52\x37\x03\x77\xe7\xe2\x09\xc6\xda\xcc\x23\xcd\x74\x1c\x89\x2c\x62\x2b\x46\x69\xca\xe2\x04\xc8\xcd\x37\x2e\x35\x70\x1b\x63\x49\x12\xfb\x86\x43\x70\x98\x32\xcc\xc3\x4e\x4a\x96\x41\xdf\x8b\xce\x39\x06\x50\xb6\x53\xa1\x5d\x7e\x2f\x42\x58\x36\x45\xa2\x01\x38\x50\xbd\xae\x84\x0b\xd6\x13\x13\x65\xea\xfd\xf9\xda\x6e\xb9\xa5\xce\x54\x61\xef\xc3\xe5\x4d\xe4\x68\x96\xcf\x21\x59\x71\x08\x65\xe1\x92\xef\x42\x1a\x31\x51\xf3\x75\xf9\xec\xbe\x93\xd9\x7d\x33\x7e\xd0\xe6\xa5\x96\xee\xa9\x16\xd9\x15\x06\x3f\x49\x4b\xd7\xb5\xd5\x78\x29\x72\x53\x0f\x1c\x33\x5d\xe5\x37\x6a\x7b\x0a\xb7\xa8\xa3\xa3\xf8\xa6\x78\xb8\x73\x4c\xed\x40\xfa\x71\x94\x35\x1f\x4c\x4a\x71\x6a\xa5\x7e\x08\x57\xf7\x7d\xf8\x7f\x38\x7c\xe7\x65\x76\xd7\xe0\xdd\x6b\xe7\xe0\xd1\x32\x0a\x8e\xa6\xc4\xf6\x2c\xa7\x75\x4c\x12\x73\x46\x29\x59\x89\x8b\x17\xe7\x28\xaa\x27\x99\x58\xf8\x85\xde\x9b\xfc\x5b\x26\x65\x0f\xdc\x0e\xf6\x9f\x1e\x36\x1a\xc1\x92\x8b\x43\x33\x30\x75\x26\x7c\xd0\x4d\xa8\x73\x2d\xbc\x51\xdb\x4c\x6f\x4a\xb0\x3a\x6d\x14\x24\x8c\x83\x6c\x61\xf6\x50\x0a\x04\xa6\x00\x0d\x40\xd0\x67\x70\x0b\x54\x1f\x72\x08\xe1\x92\x55\x91\x43\x3c\x1b\xef\x41\xdb\x0a\x7a\xd8\x5c\x41\x69\xb3\xf1\x94\x1e\xc5\xcf\xdb\xb3\xa5\x3b\x39\x80\x77\xf2\xd6\xc7\xee\x01\xa6\x1a\x25\x70\xf4\x78\x53\xc1\x33\xd9\x0e\x44\xd2\xe2\x60\x88\xff\x84\x64\xe6\xdf\x6b\x3d\x2f\x14\xea\x66\xc4\x95\xd6\x85\xb1\x97\x86\xdb\xdc\x5e\xd9\x38\x87\x80\xbb\xf0\x6d\x2e\x85\x14\xa7\x10\x20\x86\x4a\x1d\x4b\xc2\x63\x0c\x8e\x6d\xa1\x71\xb8\x74\xac\xf4\x0a\x71\x5a\x9c\x7f\xc4\x38\x53\xb5\xcc\x8b\xb1\x77\x8c\xa0\xbc\x02\xe0\x64\x64\x84\xbc\x95\x39\x84\x56\xc6\xe9\x09\x5d\x36\x6b\xd2\x22\xd8\x4a\xa5\xae\x07\x2c\x23\xc1\xaa\x90\x08\x62\xdf\xb8\xcd\xc3\xf9\xe8\x6e\xfd\x04\x81\x8c\x7e\xd3\xb2\x60\xd9\x4c\xbb\x42\xd7\xba\xf6\xa5\x03\x2c\x69\x9c\x61\xf6\x02\xfe\xdc\x5e\xda\xc2\x18\x35\xe5\x05\x0c\x65\xa9\x31\xde\x3b\x8e\x4c\xb1\x0f\x9d\xc5\x86\xae\x9f\xae\x64\x72\x39\xed\xd9\xc1\x46\xc5\x11\x14\x48\x42\x4d\xf1\xe1\xd0\x16\x4a\x6d\x68\x1e\x0d\xdd\x09\x89\x00\x27\x4d\x18\x17\x76\x7f\xf1\x51\x34\xb5\xac\xd7\x66\x40\x19\xf8\x86\x14\x1d\x4d\x7c\xa7\x9c\x37\x65\xc2\x30\x46\x6e\x10\x8f\xbb\x95\xf4\xc3\xd6\x94\xae\x0d\x55\xfe\x6f\x94\xdc\xf5\x8a\x39\x12\x3a\x36\x7f\x06\x03\xe4\x40\x1b\x5a\x75\x22\x11\xd2\x24\x9e\x38\xf7\x13\x57\x58\x6c\x0f\x84\x5a\xb0\x71\x8b\x10\xf3\x3f\xe7\x34\x4c\x62\x2f\xa8\x59\x77\x8a\x35\x1f\xe3\x26\x7d\xc6\x49\xd2\x36\x1a\x3b\xa5\xa0\x8f\x6e\x74\x1f\xfa\x62\x9d\x49\x96\xa9\x64\xb7\x72\x8b\xe1\xf2\x5c\xb1\x55\xcb\x57\x6c\x6e\x5c\x1e\x70\xbb\x76\x29\xc4\xd9\xb2\x01\x86\x46\xea\x68\xe8\x5b\x55\x6d\xaa\xbc\xae\x01\x68\x27\x2f\x22\xa5\x9e\x0f\xf7\x23\xd0\x9d\x74\x0e\x3d\x68\x99\x97\x42\x76\x0c\x7f\x98\xaf\x78\xf7\xec\xc4\x54\x69\xc4\xcf\xdc\xe7\x73\xe7\x65\xb6\x17\xc5\xf3\xb5\x2c\x3b\xfb\x1f\xdf\x01\xb8\xa2\x11\xc2\x64\x47\xfc\x9d\x0b\x27\xea\xde\xcf\xde\x14\x1b\x9a\xfa\x89\xc9\x85\x69\x09\xf0\xd6\x45\xd9\xa3\x00\x73\x08\x4e\x23\x87\xb7\x9c\x21\x14\xb1\x17\xdc\x20\x67\x81\x0f\xa0\x48\xdd\x48\xc2\xf2\xc9\x0d\x66\xb9\x20\x18\x7f\x7f\x6c\xe9\x99\xbb\xfb\x74\x9a\xd7\x86\x61\x0b\x00\x8b\x45\x36\xc8\x18\x4a\x12\xd4\x07\x8a\x6f\x38\x12\xe2\xd1\xde\x75\x54\x84\x18\x2d\x56\xd3\x81\xa9\xa7\xa1\x57\xd4\x88\x50\x32\x41\x19\xb9\x1b\xe9\x8e\xc3\x82\x28\x6f\x16\x4f\x8c\x73\x57\x8c\x2d\x98\x58\xac\x15\xaf\x41\x53\x8d\x73\x31\x3e\x41\xb3\x58\xb0\xc3\xcb\xb2\x36\xe3\x5f\x61\x54\x6b\x40\x85\x61\xbe\x7f\x42\x50\xe2\x3a\x4f\x98\xf7\xdc\xc4\xd6\x8b\x40\x2a\x49\x76\x06\x1f\xe4\x0a\xca\x85\xac\xd2\xe4\xd8\x9f\x27\x48\xef\xbe\x38\xde\x7b\x01\x74\x09\x97\x3e\x0e\x47\x40\x2c\xce\x85\x5f\xb4\x0d\x8b\x0f\xca\x93\x5e\xb8\x1a\xc0\x35\x67\xae\x65\x01\xf7\x18\x2d\x96\xf2\x46\x05\x42\x56\xca\xc2\xbc\x26\xcb\xa1\xf8\x41\x6f\xd4\x2d\xa6\x2e\x54\x95\x42\x61\xcb\x49\x4f\x53\x00\xca\xf0\x7a\xa3\x89\xac\x50\x75\x14\x9a\x54\x92\x65\x6a\xe0\x82\x43\x01\x5b\x01\x65\x53\x74\xfb\xf2\x35\x1b\x8d\x0e\x64\x50\xe6\x35\x5c\x59\x03\x97\x10\x70\xba\x9a\xac\x6b\x91\xd7\xe2\x2b\x59\x18\x6d\x8b\xae\x5d\xc6\x0e\x5a\x42\x81\x4c\xad\x61\x8b\x62\x78\x55\xad\x01\x46\xcb\xb5\xc5\x37\x63\xa2\x16\xf2\x36\xc7\x3c\x30\x66\x5a\x69\x14\xb5\x5d\xf2\x28\xa0\xb3\x92\x73\x15\x3a\x19\x9e\x83\x28\x05\xae\xc1\x5e\xee\x16\x5f\x79\xb7\x32\x7b\xf9\x18\xce\x41\xd6\xb6\xbc\xfa\x60\x75\x30\x5d\x54\x7a\x99\xaf\x97\x07\xe0\x7e\x6f\x0e\x50\x60\x7b\x96\x67\x47\xdf\xfe\xdb\xbf\x3d\x7d\xf2\x6d\xdb\x27\xb4\x90\xe0\xea\x13\x82\x03\x51\x2a\x26\x04\x3e\xae\x73\x93\x10\x69\x56\x6a\x3e\xb2\x81\x52\xd0\xcb\xb9\x55\x11\xba\x74\x40\x7f\x81\xdf\x20\xb8\xfd\xc7\x42\x2a\x3c\x3b\x64\xe7\x0b\x16\x82\xbb\x51\x64\xa1\x68\x71\x69\xf7\xf1\x47\x3e\x18\x51\xb4\xa9\x19\xb9\x4b\xb1\xb3\x67\x73\x03\xc9\xe1\x83\x78\x6b\x04\x53\x00\xbb\x4b\x11\x3f\x02\xe1\xd6\x2d\x1d\xe3\x14\x90\x10\x0e\x48\x27\xc4\xd9\xe5\x8b\x21\xeb\xb3\x2d\x6c\x52\xc1\xdc\x49\x89\xee\x18\x9a\x89\xbc\xee\x19\xbe\x82\xfd\x37\x06\x2e\x5d\xa1\xcb\x6e\x1e\x61\xf8\x93\xf6\x35\x90\xca\x6b\x41\xd0\xbd\x7e\x06\x51\xdd\x66\x45\x16\x48\xa8\x96\x2f\x97\x2a\xcb\x65\xad\x8a\xed\x50\x1c\x97\x59\x65\x97\xc0\xa9\x5d\x3e\x2a\x90\x71\xf9\xc9\xe6\x96\x05\xac\x8d\x25\x66\xd7\x9c\x71\x86\x58\x00\x2e\xb1\x9d\x2f\xe4\xf4\xa6\xc8\x4d\x0d\x06\xd9\x30\x89\xd4\xeb\x68\x12\x7f\x38\x7e\x6d\x65\x9c\x74\x82\xee\x3b\xb1\x0e\xca\xc9\x52\xa6\xc1\x4b\x2e\xa6\x07\x07\xe2\xb9\xdd\x6c\x98\x00\x1a\xd9\x17\xd3\x2c\x0e\x08\xc4\x64\x41\xc9\x11\x5b\x3e\xc8\xaf\xb2\x96\x94\xc7\x5f\x84\xc1\x27\x0c\x14\xba\xd0\xe2\x15\x34\x65\x34\x03\x77\xeb\x70\x78\x31\x72\x65\x25\x81\xca\x0e\xb8\x3b\x60\x6a\xc4\x19\x9a\xe9\xaa\xcd\x6d\xe3\x3e\x0a\xd0\xff\x17\xa7\xa3\x17\x88\xa8\x17\x3e\x43\xfb\xbd\x4e\x46\x27\x80\x7f\xea\xd9\x88\xbb\x63\xa3\xe0\xd0\x09\xc8\x8b\x53\x2f\xf3\xf6\x2f\x5e\x9c\xef\xc1\xea\x5e\x53\x66\x4d\xdf\xd0\x5a\xdb\x29\x33\x9a\x50\xa0\xea\x6a\xcb\xee\xe8\x94\xc7\xd4\x92\x51\x19\xdf\xd2\x30\xa6\x35\xef\x30\xa9\x17\x7c\x6b\x9a\x6a\x01\xce\xfa\xc0\x2d\xc0\x7d\x44\xba\xd1\x02\x5c\x64\x49\x29\x3d\x53\x2f\xbd\x41\x08\xa5\xf5\x35\x71\x23\xfb\x36\x90\xe9\xfa\x41\xa7\x0c\x8e\x59\x77\x5a\xf4\x98\x89\xe0\x20\x7e\xf9\x45\x74\x59\xeb\x1f\x3f\xfe\x1c\x65\x60\xd8\xc0\x9c\xdf\x35\x2e\x00\x04\xad\x78\xd8\x7a\x6f\x61\xee\xe3\xe9\x4e\x17\xfe\xf2\xd0\x76\xbf\xbb\x97\xec\x84\xb6\xdc\x51\xc4\x70\xa5\x58\xd9\xa7\x4e\x29\x34\x9d\xae\x2b\xe3\x71\x41\x1d\xef\x1c\x50\x10\xbe\x26\x17\x0e\xd0\x4d\x32\x1d\xa0\x6d\xe1\x50\xbc\x0a\x84\xa2\x90\xe9\x42\x49\x60\x92\x6c\xcd\xb3\x79\x6c\xe5\x77\xf7\x14\xcf\x8e\x21\xb3\xcb\xed\x37\xff\x3e\xf0\x56\xad\xa5\xdc\x82\x65\x2b\x39\xb9\x0d\x83\x7d\xe5\x26\xaa\x40\x8b\x72\xe0\x06\x83\x95\x38\x16\x33\xb5\x21\x6d\x61\x5e\xe4\x75\xae\xcc\xa8\x45\x7e\xd8\x17\x63\x38\xab\xc7\x76\xf9\x8f\x9f\x8c\x87\xe2\xb8\xb2\x83\x75\xa3\xb6\x06\x7c\xaa\xec\x5f\x68\x2a\xbb\xab\x36\x5e\x98\x94\xb1\x5b\x11\x4d\x70\x99\x42\x69\x8c\xda\xdc\x21\x5c\x08\x21\xce\x3f\x8c\x44\x0f\xac\x57\xe2\x6b\x91\x8d\x45\x5e\x8a\x57\xba\xc8\xcd\x02\x3c\x8c\x50\xca\x2c\xb5\x58\xea\x0c\xe3\x00\x82\xdc\x17\x00\x1d\x80\x10\xf0\x32\xb2\xff\x4d\xf2\x92\xa0\x67\xcb\xac\xd3\xb2\xe7\x2f\x85\x9c\x8a\xf3\x64\xc1\xd6\x3f\x7f\x4e\xd6\xc6\xe8\x40\xb6\x9c\x13\x3a\x05\x3a\xe4\xf1\xd3\x27\x4f\xc6\x42\x96\xdb\x8d\xdc\x46\x3d\x7b\xa9\xc5\x38\x72\x8c\x82\x99\x82\x95\xfa\x2b\x06\xd4\x9b\xf5\xa2\x7e\xfa\xe4\xe8\xf0\x65\x84\x2d\x5b\x43\x1c\x99\x1d\xdf\xf1\xe9\x32\xfb\xfa\x74\x3c\xb4\x4d\x6a\x1d\x8a\x01\x0d\x14\x27\x72\x77\xdb\x0f\x98\xc0\xf0\x70\xb7\x61\x94\x0b\x09\x88\x56\x11\xc6\x35\xb5\xe4\xe2\x62\x97\xb6\xfd\x15\xa5\xbf\x92\xa5\x50\x4b\xfd\xb7\x5c\xdc\xe6\x92\xd3\xb9\xd2\x6b\x54\xf8\x4f\xb4\xac\xc0\xfa\xf2\x16\x1c\x7b\xcc\x50\xd8\xfb\x86\xb1\x6f\x25\x6c\xca\x01\x7e\xca\xf6\x3e\xa8\xa4\x39\xa9\x85\x2e\x32\xf6\xa1\x30\x4c\x45\x7e\xa3\xc4\xf8\xbf\xd6\x67\x7f\xfa\xf6\xec\xbf\xd6\x67\xe7\x4f\x8e\xc7\x43\x21\x4e\xc8\x28\x6d\xef\x0d\xe8\x30\xcf\x89\xe5\x46\x7c\x33\x88\xd5\x08\x6e\x72\xbd\x7f\x53\x70\xac\x0b\x1f\x0d\x4e\x5d\x7c\xb0\x92\x8e\x6c\x14\xf7\xce\xf3\xd9\x28\x93\xbe\x39\x9f\x28\xa1\x67\x9c\x18\x1e\xb2\xd4\x98\xf0\x19\xc0\x8e\xe2\x16\x62\xbb\xbc\x13\xc3\x99\x7d\xe6\x82\x03\xfe\x22\x92\x28\xcd\x16\x33\x89\x2d\x1f\x22\x01\x99\xda\xaa\x71\x7d\x68\x25\xd5\xe6\xf3\xd4\xac\xc9\x3e\xf0\x20\xfe\xb7\x9b\x37\xef\xbe\x8a\xef\x70\xa5\x7b\x86\xf8\x51\xa3\x96\xcb\x80\xe8\xb4\xb3\xb4\xc9\xa6\xe7\x5e\xbc\x68\x11\x20\x11\x34\x83\x0b\x65\x03\x31\x01\x2c\x10\x2b\xaf\xe4\x4c\x3a\x86\x04\x0d\x4c\x82\xd5\x91\x0d\x18\xef\xae\x4d\x74\xf5\x16\x45\x7c\x2c\xbd\x36\x55\xf0\xec\x04\xfc\xad\x54\xf0\xe1\x1e\x10\x54\xed\xb1\x1b\xa8\x17\x03\x82\x44\xf2\xc9\xfa\x99\x86\xea\x8d\x11\xfb\x0c\x91\xf6\x30\xce\xd1\xcb\x4f\x16\x54\xab\x20\xe7\x0d\x6c\xb5\x6c\x91\x1e\x48\xc4\x40\x2a\x13\x05\x9c\x30\x1b\x7a\x58\x7a\xdb\x84\x5d\x1a\xf1\x56\xcd\x2b\x9b\xc0\x16\x9d\xab\x19\xb2\xd5\xf4\xe9\x0a\xd8\x58\xa7\xe8\xa4\xba\x5f\xa9\x43\x3c\xa5\x34\x66\xa5\x18\x47\x2e\x81\xde\x2f\x59\xa3\x3a\xf6\x01\xa9\x4d\x3e\x27\x34\xa1\x2d\x22\x21\xe0\x94\x7a\xfb\x3d\x62\xa0\x5a\xa6\xed\xb7\x19\xf3\xeb\x6d\xd1\x45\x7d\xc5\x6c\x93\x79\x49\x97\xef\x81\x78\x23\x67\xb2\xca\x07\xe8\xf0\x8a\x47\x6a\x82\x33\x85\x87\x1e\x48\xa9\xb0\x77\x75\xe9\xe4\xc4\x31\x14\x1f\xa7\x1e\x84\x94\x95\x85\xa0\xef\xc7\xba\x24\xef\x6b\xea\x44\x7c\x75\xcb\x0d\x68\xe3\x7a\x19\x49\x5e\x75\x80\xf6\x44\xa3\x2b\x4f\x49\x40\x58\x56\x5f\xe1\xd9\x11\x9d\xf5\xfe\x88\x72\x37\x65\x5b\x8f\x1c\xc8\x9b\xb8\xfe\x1b\x4c\x4c\x08\x56\x5b\x9f\xff\x0f\x73\x13\x66\x99\xdd\x03\x53\x5d\xd6\x95\xc4\xcb\x1b\xea\x07\xd5\xd4\x8e\xca\xda\x0c\xa2\xc1\x25\xb1\x67\xa2\x4c\x32\xc4\x7e\x41\xe4\x1c\xdb\x9f\x6b\x71\x42\x6e\xc4\xa8\x01\x6e\x1f\x22\x6a\x05\x7d\xbe\x8e\x51\x3a\xfd\x5a\x08\xab\x00\xb0\x4c\x09\x02\x17\xec\xed\x90\xe4\x6c\x99\x63\x8c\xf2\x98\xdd\xfe\xc6\xde\x49\xbc\x5e\xac\x4d\x94\xc3\x00\x13\xf7\x99\x05\xdc\x7b\xd9\x85\xd3\x33\x68\x10\x1e\x2d\x65\xc8\x36\x10\xcf\x24\x4d\x4d\xcb\xa7\x82\x93\x15\xc6\xd5\xa4\x9c\x99\xf0\xd0\xd0\x95\x37\x30\x80\x11\xfb\x1b\x50\x9b\x88\xb1\xe3\x86\x89\x30\x22\x7e\x15\x67\xf7\xfb\xfd\xdd\x6f\x6e\xbc\x1d\xfc\xf6\x87\xd1\xfb\x43\xee\x22\xf9\x33\xe2\x1d\x83\xcb\x38\x4c\x5a\x59\x57\xba\x28\xc8\x72\xa8\xfc\xe5\x12\x61\xe5\x68\x3a\x16\xd2\x38\x06\x0e\xf3\x31\xcb\x27\xaa\x8a\x12\xfa\x87\x2c\x29\xf6\xfd\x6b\x05\x83\xe2\x48\xfb\x52\x68\xc9\xc2\x58\x6c\x40\x47\x81\xdf\xcf\x2d\xb5\x50\x3a\xa2\xcb\x27\x6d\xc1\x5f\x5c\x2c\x57\x45\x62\x18\x85\x56\x05\x6e\x80\xdb\xd7\xe9\x08\xad\x18\x9b\x6d\x4b\xb9\xcc\xa7\x21\x82\x2a\x52\x13\x3a\x52\xd8\x28\xbc\x49\x47\xb4\x50\x90\x6c\xed\x7b\xa3\x69\x61\xcc\x29\x60\xde\x8e\xf6\x95\x87\x0f\x85\xa1\x62\x6f\xfe\xcf\x5a\xad\x43\x34\x4d\x94\xe9\xc1\xbe\x06\x38\xf8\xcb\x19\x65\x49\xaa\xd9\x52\x84\x48\x18\x96\xb5\xd0\xb2\x17\xf2\x66\x04\xe6\x55\x73\xa7\xad\xe0\x5e\x02\x59\x10\x8d\x76\xea\x5a\x24\x44\x89\x4a\x5d\xb2\x6e\x54\x3d\x81\xac\x4e\x43\x4b\x28\xe3\x18\x3d\x8d\xf9\x68\x2e\x42\x14\x35\xad\x47\xfb\xeb\x79\xa5\x97\x2f\xad\x28\x5b\x07\x9b\x2e\xde\x9f\x92\x6a\x6c\x06\x7f\x2e\x21\xd1\x2c\xa9\x89\x03\x24\xe3\x47\x70\xec\x6c\x19\xf5\x10\xac\xd0\x7c\x39\xa4\x81\x0b\xab\x8a\xf2\x82\x44\x81\x0c\xed\x21\xca\xb0\x1c\x61\x51\x38\xcd\x39\xae\x08\xd4\x25\xa3\x2e\x5b\x48\x1a\x12\xe2\xb3\x70\x59\x0e\x5b\xc9\x85\x70\xe0\xa1\x58\x55\x1a\xee\xa1\xf6\x8e\x55\x6c\xd1\x60\x93\x61\xfe\xe1\xc9\xda\xca\x51\xb8\x5f\x86\xe2\x15\xc6\xeb\xce\xf2\x02\x44\x06\x30\x76\xa4\xc1\xce\x0e\xe1\xcd\x89\x77\xb0\x77\x50\xe3\xf8\xca\x3e\xf6\x43\x9f\x0e\xf5\x10\xf6\xb7\x7d\x05\xd3\x71\xef\x31\xdb\x41\x68\xd0\x58\x06\x43\x84\xa1\x82\x06\x86\xfc\x53\xb9\xdb\xf6\x5f\x7e\x2b\x8e\xee\x66\x0e\x7c\x03\xa8\xf2\xef\x76\x6b\x40\x4b\x5e\x63\xfb\xa2\xf5\x6f\x57\x55\xb4\xbb\xb8\xa6\x91\x6f\x2e\x8e\xf6\x19\x9e\x52\x96\xed\x16\xcf\x83\xb6\xd2\xe2\x48\xbc\xc3\xb2\xef\x1b\x9e\x25\xee\x5c\x88\x37\x7a\xed\xc1\x81\x3f\xa6\x19\x5c\xfc\xbe\xbe\x98\xbd\x54\x2a\x53\x19\x4f\xdb\xd4\xda\xa5\x78\x4f\x84\xf4\x92\x10\xe0\xcd\xca\xbb\x65\x02\x23\x97\xe1\x33\x13\x0a\x41\x57\x50\x68\x6d\xe3\x4a\x8d\x2e\x13\x4f\x12\x3b\x99\x91\xdb\xe1\xd1\x37\x7d\x66\xf0\x16\xb0\xbf\xa8\x60\x3b\xbe\x5f\xeb\xf7\xa2\x7a\xef\xf2\xf7\x69\x52\xc0\x5d\xc7\x4f\x5b\xde\x33\xbf\x36\x47\x7c\x99\x0e\x1e\x7c\xd1\xb2\xf2\x46\x6d\xcb\x71\xf0\xe0\x8b\xb6\xd9\x1c\xb5\xce\x31\x82\xe1\xe1\x31\x9c\x09\xc9\x50\x3d\xa7\x68\xa7\x05\x14\x51\xf4\x80\x26\xa8\x1e\x1f\x50\x48\x00\xe8\x0c\xf2\x13\x62\x18\x2d\x9b\xae\x54\x99\xa9\x4a\x55\x43\xf1\x06\x74\x28\xbe\x6a\x2f\x49\xa5\x4b\xda\x56\xcb\x8f\xc0\x0b\xb1\xca\xc4\x4a\x56\xf5\xd6\x12\x2a\xf2\x49\x25\xab\xdc\x4a\xc5\x64\x37\x6b\x69\xd3\x10\xdd\x35\x41\xfc\x24\x6f\xc4\xe3\x57\x17\xa8\x38\x9b\x6b\x21\x6d\x6f\xec\xb7\x2d\x41\x06\xcc\x06\xb7\x0e\x9f\x94\x81\x54\x08\x43\xf1\x56\xf5\x8a\x02\x13\x53\x51\xef\x4c\xbe\xcc\x0b\x59\x01\xd1\x5a\x0b\xbd\xaa\xf7\xad\xf8\xad\x67\x10\x3d\x68\x09\xac\x2d\x83\xdd\xe8\xea\x06\xc3\x00\x48\xff\x93\x69\x61\xb6\xe5\x74\x51\xe9\x52\xaf\x0d\xbc\x1f\xc2\x40\x13\x44\xa2\x09\x72\xcb\x49\x3c\xc8\x1c\x96\x6f\x56\x0e\xc4\x44\xeb\x9b\x1b\xa5\x56\xde\x6a\xe1\x3c\x49\xcb\x3e\x7f\x75\xe8\x0f\xf7\xdc\xbc\x54\xc6\x0a\xcd\x44\x38\x18\x0a\x3c\xe1\x78\x0c\xdb\x3f\x83\x16\x93\x98\x14\x77\x02\x6a\xb1\x2f\xe5\xa5\xc1\x8b\x0b\x1a\x13\xe1\x2b\x03\x6e\xf8\xdc\xc8\xbc\x16\xeb\xb2\xce\x0b\x91\xfb\x6c\x6c\xb3\x75\x41\xb6\xa9\x42\xd5\x21\xd7\x38\x2e\x57\x70\x15\x85\xe4\x33\xa8\x98\xb6\xaf\x80\xa4\xcc\x32\x7e\xb1\x08\xe2\x92\xc4\xad\x0c\x49\xe4\x61\xd4\x99\x7c\xdc\x32\xde\x8d\xce\x3b\x7e\xd6\x32\x8c\xce\x24\x5e\x57\xdb\x58\xee\xbe\x37\x5d\x31\xcb\x4b\xb8\x29\xf9\x71\xfc\x41\x55\xe0\x11\xcd\x86\xc6\xae\xf2\x35\xad\x06\x58\x86\x2e\xf9\xbb\xbd\xd7\xa1\xa1\x3f\x37\x56\x16\xd4\x55\x2d\x4b\x3f\x8e\xb0\xc5\x50\xd3\xc8\x8e\xfe\xa9\x63\x36\x98\x30\x37\x2f\x45\x21\xb7\xaa\x22\xdb\xc4\xc1\x81\xf7\x8e\x98\xe7\xf5\x62\x3d\x01\xc7\x88\x99\x9c\x2a\xdb\x74\x84\xe0\x71\xce\x11\x4f\xff\xf8\xdd\x9f\x98\x78\x0b\x9c\xc0\x89\xed\x28\xab\x6b\xf0\x4f\x6d\xfd\x3a\x79\xef\x75\x2e\xcd\x94\xbf\x86\x43\xe8\xb0\xc1\x49\xbf\x57\xa5\xaa\xf2\xe9\x09\x31\x91\x1d\x42\x7c\x3c\x25\x5c\x76\xbf\x8e\xb7\x80\x3f\x19\x5a\x37\x64\x52\x38\x96\xa5\x03\x97\xfe\x57\x27\x4c\x74\x35\x90\x39\xe8\xa6\xd8\x0f\x0b\x59\x6f\xe6\xa0\x64\xb1\x17\x75\x73\xb0\x51\x93\x7d\xb9\x5a\x99\x03\xda\x5d\xfb\x76\x2d\x1f\x2c\xd7\x45\x9d\xaf\xe4\x5c\x1d\xd4\x0b\x85\xfa\x95\x7d\xca\x60\x38\x5c\xd4\xcb\xe2\x0f\xf8\xc8\x0a\x3d\xfb\xb2\xae\xab\x7d\xb3\x5e\x2e\x65\xb5\xf5\x17\x57\xe3\x30\x1f\xe1\x22\xc7\x03\x50\xa7\xba\xd0\x55\x80\x21\xc3\xa0\x3d\xfe\xab\xce\x97\xec\x49\xcf\x3d\xda\x2f\xf4\x54\x16\xbd\xf0\x46\x2d\x65\x5e\x84\x9f\x4b\x5d\xd6\x8b\xf0\xb3\x5c\x2f\x27\x8a\x7d\x67\x25\x8d\xd9\xe8\x2a\x0b\x4f\x2a\x7b\xcf\x0b\x3f\x8d\x92\xd5\x94\x11\xa8\x55\xc1\x7f\x7c\xa8\xd9\xaf\xa8\x85\xeb\x8a\x15\xdc\x28\x75\x83\xbf\x92\x6c\x7a\x26\x68\x3f\x71\x1c\xfb\x76\x3c\x83\xc2\xb4\xd4\x99\x72\x49\x90\x0b\xb5\x04\x77\xd3\x42\x2d\x87\xfe\x79\xfa\x60\x58\xeb\x9f\xf4\x46\x55\xa7\xd2\xa8\x7e\x70\xa5\x0c\x74\x00\xe1\x11\xfc\x64\x92\xcb\xfb\xc3\x87\x2d\xb3\xf3\x0e\x88\xdb\x09\x7d\x1f\x79\xe7\xc6\xf4\xec\x38\xc8\x4a\xc9\x94\xa4\x63\x58\x1f\x1f\x3c\x48\x23\x10\x82\x4e\xf0\x87\xab\x17\x3f\x41\x3f\xc1\x00\x0e\x18\x83\xa4\xdc\x09\xc6\x12\xe0\xb4\xf6\x35\xdd\xda\x6c\xf1\x07\x3e\xa3\xd7\xf9\x4f\xe7\x2f\xce\x5f\x5e\x5d\xbf\xc4\x78\xea\xa7\x78\x95\xbc\x3a\xff\x0f\xff\xe8\x5b\x7c\x74\x7a\xf9\x82\x17\xfc\x13\x3e\x3d\xbb\x3c\xfd\x99\x3f\xfe\x2e\x79\xfc\xfc\xf5\xf1\xf7\x11\xfd\xa7\x2d\xc9\x4f\x79\x52\x47\x70\x46\xf0\x81\x90\x91\xab\x06\x5c\x73\xa6\x53\x7b\xb3\x23\x77\x0c\x54\x53\x4d\x75\x89\xe0\x95\xd3\x1c\xf2\x68\xfa\x5a\x67\x97\x2f\xec\xe1\xdf\x99\x58\xe7\xd3\x7c\x43\xd2\x74\x36\xdd\xc9\x6b\xe6\xaa\x66\x25\xdb\xe3\x17\xda\xd2\x7f\xb8\x9c\x20\x49\x74\xa3\xa9\xa6\x2e\x01\xe9\x2f\xbf\x04\x00\x0d\x60\xe6\x2f\x7d\x9e\x13\x48\x8c\xba\x36\xca\xe7\x45\x75\x02\xda\x1f\xfe\xf5\xbb\x3f\x7e\xeb\x42\x22\x1c\x18\x29\x73\xf8\xfc\xd9\x28\x22\xef\xf1\xda\xe3\x2b\x47\x57\x71\xae\xdb\x47\x4d\x6e\xb0\xc9\x3b\xe1\xb0\x44\x34\x02\x3b\x48\x46\xf4\xed\x45\x6f\x18\xd6\x56\x6e\xc4\xb7\x7b\xe4\x65\x92\x72\x55\xcc\xc8\xb4\xb4\x15\x2c\x67\xfd\x9b\x39\x40\x92\xd7\x01\x7e\x12\xd8\x26\x8b\x69\xc3\xc6\xfa\xdd\x60\x77\x57\xf8\xd6\x33\xf7\x1e\x33\xd9\xdb\x96\x88\x91\xbf\x53\xd1\x11\xb5\x36\xea\x07\x69\x9e\x2b\x59\xaf\x2b\x75\x1f\x24\x12\x1c\xb1\xa8\x1a\x07\x1b\x49\xf4\x47\x0c\xf7\x21\x79\x35\x5c\x84\xfa\x2e\x86\xd5\xab\x50\x00\x3e\x1e\xf8\x81\x5d\xdc\xa5\xda\x28\xe6\xa7\x25\x8d\x58\x61\xae\x2e\x7b\x90\x97\x99\xac\xb2\x96\x11\xcd\xf4\x72\x08\x5a\x64\x76\x58\xfd\x21\xd3\xcb\xfd\x4c\x2f\xe3\x96\xec\x2f\xa4\x99\x61\x4b\x18\x8a\x4a\x77\x73\xfb\xbd\xde\x40\xf4\x7a\x18\x87\xe6\xd3\x8b\x3a\x93\x85\x87\xec\x97\xcc\x71\xc8\xb3\x4a\x17\xd6\xe4\xa2\x10\x94\x1b\x6b\xa1\xd8\x60\xd3\xe6\x7d\x79\x79\x75\x3e\x42\x2d\x08\xdc\x10\x4a\x5d\xa3\xe8\xee\x6d\xc0\x70\x37\x2c\x75\xb9\x3f\xc7\x33\xdc\x3b\xa8\xd0\x3d\x66\x8c\x7a\xc8\x31\x04\x5d\x8d\xc1\x3b\x67\x3c\x10\xe3\x42\xcb\xcc\xfe\x0b\xba\x95\x31\x5a\x21\xc6\x18\xfa\xec\xcd\x06\x27\xba\xb2\x03\x8e\xdc\xe9\x85\xce\x54\x55\xe6\xff\xa8\xba\x1c\xd7\xe0\xbb\x96\xc3\xbf\x59\xcf\x66\xf9\x07\x42\x7c\x2e\x01\xdb\x50\x0d\xe7\x43\xf1\x68\x5a\xe4\xd3\x9b\x47\x91\xc3\xda\x33\x9f\x90\x80\x22\xe4\x71\xf4\xf0\x72\xa5\xfc\x43\x88\xc2\x8f\x46\x71\xd8\x1a\xf1\xc8\xd2\x1a\xa8\x96\xa1\x6f\x64\x82\x16\xff\xab\xc8\xa7\xaa\x34\x2a\x74\x4f\x7c\x3b\x7c\x32\x7c\xb2\xaa\x94\xe8\xa3\x8b\xb5\x38\x59\xe7\x45\xb6\x27\x7e\x11\x2f\x2e\xae\xd2\x90\x4a\xe8\xa4\xc7\xa5\xee\x27\x63\x30\x70\x1d\x60\x8a\x89\x3b\x50\x56\x7e\xf9\xc5\x77\xfa\xf1\x63\xf1\xb0\xdf\x73\x70\x78\x2e\x0f\x63\x8c\xfa\x93\x1c\x9f\x2c\x58\x8f\x9b\x00\x49\x1e\xe8\xe9\xb2\x27\xbe\x4e\x27\xea\xd0\xe3\xc2\xf2\xc4\x95\xa1\x1e\xfb\x9c\x17\x0e\x1e\xb2\xc2\x51\xe6\x18\x62\xc2\x8c\x1b\x20\xf6\xb5\x93\x55\x7a\x59\x7e\xeb\x10\x58\x9d\x1c\x68\x54\x7d\x5c\xd7\x55\x3e\x59\xd7\x2a\x8c\xe0\x40\xf4\x48\x5d\xe3\xca\xc7\x0d\x74\x49\x61\x90\xc8\x3b\x5f\xef\x7d\x0b\x8a\xed\xc7\xb6\x76\xdb\xf1\x8d\x79\x98\x8b\xcc\x61\x8b\x18\x68\x6d\x16\x4a\x15\xbd\x48\x57\x8e\x31\x84\x80\x20\x5a\x16\x5b\xa7\x82\xa8\x95\x09\xb9\x61\xd0\x71\x52\x89\x31\x54\xf7\xa8\x47\x08\x2a\x34\x6c\xe9\xd1\x7d\xd8\x0e\x1a\x62\x86\xd8\xa2\x81\xe8\x7d\x3b\x7c\xd2\xdb\x4b\x05\x26\x46\x36\x46\xac\xcc\x0d\xec\x2e\x39\x29\x54\x22\x35\x12\xae\xbd\x97\xdd\x0e\xdb\xa5\x49\x2f\x34\x32\x93\x2d\x17\x2c\xdb\x65\x4a\x2e\x42\x02\x8c\x50\xed\x1d\x17\x21\x9f\xcd\x44\x7f\x00\x7f\xc5\xf0\xb8\x92\x59\xae\x7b\x7b\xcd\x54\xb2\x95\x9c\xde\xa8\x0a\x84\xc9\x48\xb7\x00\xf2\xc8\x35\x88\x82\x54\x26\xae\x9b\xa9\x5a\x4e\x17\xcd\xea\xcd\x7a\x5d\x99\x9a\x21\x2f\x93\xd7\x0d\x07\x0a\x76\x94\x6e\x29\x67\x53\xaf\xe7\xf5\xf4\xa1\x00\x87\x1a\x66\xc2\x2d\xf9\x77\xfa\xf9\x80\x0a\x61\x2f\x21\x41\x68\x1e\x8c\x91\xca\x20\x0f\x7b\xb5\x56\x00\x06\x0c\x1b\xbd\xd7\x12\x31\xc4\xea\xc5\xdf\x8b\x1b\xc1\x3b\x57\xdb\x8e\x43\xf7\x2e\xcb\xae\xce\x3d\xcf\x55\x91\x01\x5e\x71\xd2\x62\xdb\x2a\x6a\x20\x34\x0c\x93\xfb\x1e\xfa\x78\x55\x33\xad\xf2\x15\x42\x9f\x92\xe6\x70\xae\x6a\x86\xfe\x7e\xe6\x4b\xf4\xb1\xb3\x0c\x7e\x93\xa5\x65\x08\x8d\xd8\xf3\x09\x21\xe8\x00\xfd\xab\x1f\x7c\xf1\x35\x74\xfc\x5d\x28\xfc\xde\x49\x8c\xf9\x0c\xd2\x10\xe8\x52\x61\x4e\x3d\xf2\xab\x77\x79\x07\x24\x8d\x9c\xae\xbc\x75\x1e\x74\x6a\x13\x99\x17\x24\x97\x94\x19\x69\x11\x61\xb8\xa8\x3c\x9c\xc9\xe8\xe1\xa5\x11\x97\xdd\x6e\x3b\x70\x04\x9e\x91\x01\xd0\x90\x5b\x32\xc6\x9c\xf4\x8c\x98\x60\x1a\xbf\x1a\xbd\xd7\x16\xb2\xca\xc4\x4c\xe6\x05\x8a\x1e\x07\x07\xa2\x5f\x82\x1e\x01\x2d\x22\xaa\xaa\xa5\x95\x17\x94\xa9\xe9\x8a\x63\x56\xdb\xcb\x92\x80\xae\xe8\xea\x63\xdb\x86\xcd\xde\x63\x97\xad\x14\x66\x9f\x0d\xa1\xdb\x6c\x10\x27\xec\xc6\xdf\x4e\x0c\xc2\xf9\x07\x9c\xaa\xd6\x72\xa6\x51\xae\x4d\xbf\xfe\xa0\x2b\x73\x0a\xe4\xf1\x67\x13\xea\x52\x11\xa8\x72\xbd\x54\x84\x2d\xce\xbe\x16\x1e\x23\x2e\x4e\x17\x08\xf9\x5c\xb5\x66\x61\x62\xa1\xcd\xbc\xa3\x01\xd8\xd0\xa9\xbf\x19\x94\x79\xa0\x92\xe4\x3e\x68\x5b\x71\x11\xc4\x7d\x3c\x4a\x1c\x3d\x11\x29\x31\x55\x7b\x58\xc7\xb5\x67\x3c\xff\x74\x3d\x81\x2f\xec\xec\x0e\x6f\x4a\xda\x83\x46\xed\x4f\xeb\x86\x23\x54\xeb\x95\x0b\x4f\x6a\x6f\x4a\x0b\x53\x0d\x03\x01\x79\x2d\x9b\xdb\xd1\xf7\x9f\xc3\xa9\xb5\x71\x6c\x78\xc8\x58\x91\x5d\xd6\xe9\x09\xd0\xb1\xee\xec\x09\x7d\x79\x76\x39\x12\x97\x98\x39\xaa\x67\xc4\xdf\xd6\xa6\x16\x68\x97\xdc\x28\xc0\x31\x5c\xea\x5b\x45\xe6\x5e\x4d\xc7\xc0\xa6\x92\xab\x95\xaa\x40\x9d\xd7\x75\x36\xb4\x33\xcb\xb8\xe9\xa8\x0a\x85\x42\x17\x33\x4c\x42\x97\x25\x3d\x69\x3b\x1f\x9a\xc2\x5b\x58\x19\x69\xcf\x0f\x3d\x5b\xab\x99\xf7\xb3\x2b\xef\x70\x47\x56\x3a\x2f\x89\xeb\xac\x4b\x34\x9e\x52\x8c\x04\x40\x93\x20\x92\xb4\x9c\x4b\xc0\xd6\x2b\x0a\x7b\x67\x98\x2a\xb0\x1f\x43\x1b\x89\xdc\x2e\x15\x8d\x6d\x65\x21\x8d\x5f\x4b\x54\x65\xe8\xd6\x70\xc8\xfb\x5f\xaa\x0f\xbe\x54\xfb\x71\xea\xce\xce\x50\xd2\x72\x19\x4f\xdd\xdf\xd3\xe9\x13\x6e\xa1\x87\xf2\x31\x18\x78\x68\x67\x8b\x26\x29\x86\xb4\x03\xd0\x66\xd0\x29\x2e\x50\x97\xf7\x39\xd8\x5f\x50\xb5\x03\xf0\x0b\xde\x7d\x06\xca\x17\xd1\xc4\x1f\xf6\xf6\x44\x7f\x3f\xd7\xd3\xb5\x43\xf5\xe2\x68\x76\x0d\xf8\x2f\x8f\xf7\xf5\x46\x51\x76\x6c\xa2\x19\x50\xbf\xfc\xb2\x45\x49\xfd\xb8\xcc\x8e\xbd\xcb\x1e\xcb\xa0\x08\x38\xed\x89\xab\x4c\xdd\x86\x97\xd0\xc0\xbf\xfe\xf2\x69\xab\xb3\xe1\x97\x4f\x87\x38\xdc\x03\xd1\x4d\x3a\xa0\x93\x93\x84\xda\xc3\x3a\x3d\xda\x00\xcf\x0b\x39\xe7\x18\x3b\xe0\x96\x21\xd1\x00\xe7\x2d\x31\x4e\x4f\x6f\x85\xee\x1d\xe6\xf0\x5f\xe1\xad\xc8\x62\xc9\x2e\xce\x85\x59\xe4\xcb\x00\x69\x2c\x21\x01\xc5\xb9\xbf\x19\x05\xd7\x95\xe8\x0d\xa5\x38\x26\x5b\xb1\xcb\xcf\x7e\x7e\x7a\x75\x71\xf9\x72\xe4\x9c\x26\xdc\x65\xde\x7b\x18\xb2\xcb\x28\xba\x8b\xfe\x6c\xa2\x49\xdb\xa9\x1b\xbe\xbf\x4e\xb8\x29\xec\x83\x98\x8e\xfa\x02\x10\x13\xda\xd4\xc5\x9e\x6c\x10\xec\x67\x79\x61\xe7\x8e\x73\xcb\xa5\x2c\xd7\xb2\x70\xc3\xcc\x1b\xdf\xaa\x42\x74\x6b\xec\x8e\xd5\xda\x18\xdb\x64\x7d\xed\xd0\x56\xee\x1d\x06\xd7\x5d\x72\xe2\xb2\x12\x56\x9c\x2e\xd4\xed\xfd\x81\xd8\xa8\x5e\x86\xe7\xcb\x24\x2f\x33\x0c\x12\xc6\x68\x00\x89\xa6\x59\x24\x86\x16\x46\x17\x5a\x5d\x66\x68\x28\xcb\x6b\x31\xd7\x10\x7d\xb4\x9e\x2f\xd0\x16\xc3\xc3\xfc\xce\x97\xb9\x15\x16\x87\xe2\x4d\x8e\x47\xd9\x03\x1e\xb6\x09\x66\x45\x1c\xbe\x62\x2b\x0a\x50\x10\xf8\x6b\x27\xfb\x12\x3a\x69\xb9\x3c\xee\xb4\x03\x28\x47\xe9\xc1\x81\xed\x18\xe2\xda\x2e\x94\x90\x13\x83\x2e\xe7\x0e\x97\x16\x89\xa3\x72\x0d\x8b\x3b\x23\x11\x66\x23\xc2\x3c\xf1\x5b\x81\xa7\x50\x29\x74\x95\x61\x42\x1d\x55\x1a\x7b\xa7\x86\x93\xc6\x0e\x84\xf3\x83\xb3\xeb\xb8\x32\xa2\x5a\x97\xce\xb3\x19\x8c\xa7\xa0\xa3\x57\x1f\x6a\x51\x29\xb4\xc5\x8b\x3e\x82\xc0\x7a\xa3\x7b\xa8\x2b\x6b\x2b\x77\xa0\x81\x56\x96\x53\xd8\xc5\x48\x8c\xb4\x01\x86\x45\x35\x84\x20\x08\xf2\xd7\x85\xb5\xb9\x37\x14\x6f\x09\x1d\x09\xe5\xb3\x60\x02\x64\xb1\x7b\x68\x85\x44\xb1\x1f\xb4\x6e\xb8\x06\xc0\x70\x6c\x6b\xfc\xcd\x27\x52\xc9\x6b\x97\x9c\xd4\xa7\x84\x25\x3c\x42\x77\xe0\xaa\x40\x12\x61\x0b\xc9\xe5\x20\x73\x30\xac\x74\xa5\xa8\xd4\x2d\x86\x1d\xd1\xc0\xd0\x22\xf2\xf1\xed\x07\x07\x61\x20\xac\x1c\x53\xad\x4b\xcc\x02\x75\x6f\xb3\xe8\xbf\x3f\xf9\x93\x9d\xcf\xc4\xa4\x5e\xad\x1d\x5a\xc5\x09\x5a\xc1\x1d\xb7\x8b\xbc\x6e\xe2\x42\x3c\xdf\x05\x2d\x2b\x54\x50\x30\x56\x49\xab\x0b\x9e\x83\x43\x0c\xba\x89\x35\xef\xf6\x76\x93\x5e\xcc\xe0\x20\x77\x32\x53\xf0\xd1\x4c\x4d\x08\x2f\x11\xe0\x9a\xfe\xb2\x72\x84\x73\xa0\xfa\xf2\x29\xaf\xe6\x64\x8a\x56\x91\x2c\x90\x4a\xf5\x68\x71\xa2\xf9\x46\x3a\x96\x2b\xff\xfa\xb9\xae\x38\xd7\xe9\x72\x31\x0d\x82\x5f\x7b\xec\x26\x9e\x69\x77\x37\xa2\xeb\x58\xc8\x63\xbf\xf3\x03\x72\xab\x08\xce\xaf\x5c\xcf\x44\x52\xd0\x7d\xf5\xfc\x10\x87\xf5\x9d\x98\x16\x32\x5f\xa2\xb3\x32\x29\xb8\xfc\x66\xf2\x2b\xbf\x86\x9b\x2c\x14\xaa\xab\x7c\x3e\x57\x95\x65\x70\xe0\xcd\x82\x7c\xcb\xde\x0a\x20\x34\x5a\x7d\xa8\x5d\x8c\x79\x3e\x2f\x21\x3f\x0e\xec\xda\x38\x76\xb2\xab\x07\x0d\xbd\xab\xb7\x4f\x02\x48\x75\x2b\xec\x39\xc7\xa8\x1e\x26\xe0\xd4\xdf\x45\x60\x96\x7d\x3a\xc6\xff\x7c\xf4\xdd\x9e\x00\x18\x1e\x83\x42\x27\xc7\x46\xe6\xde\xbd\x1e\x0a\x75\x25\x8d\x51\xd9\x7e\x5e\x3a\x46\x04\xae\xde\x65\x06\xca\x81\xca\x05\x93\xe3\x3e\xf7\x01\x58\xc1\x89\x14\xf6\x73\x96\x83\xbf\xc1\x3a\x37\x0b\x0c\x6d\x73\xb0\xa5\x95\x5e\x5a\x72\x58\x9b\x74\x0b\x96\x0f\xfd\xef\x37\x89\x21\xce\xd8\x26\xbf\x25\x2e\xfd\x5c\x57\x6c\x4b\xf9\xd4\x7e\xe9\xd2\x4c\x85\x94\xe0\x76\xd7\x26\xa4\xc4\x2b\x33\x2a\x31\x44\xe6\x8c\xdb\xa1\xa7\xcb\x78\xbc\x7a\x03\x5a\xb2\x4e\x1b\x80\xcd\xea\x1e\xfe\xd7\xca\xde\xd3\x0c\x77\xbc\x25\x3d\x38\x8b\xe0\xf6\xfe\x3c\xfb\x78\x37\xc8\xdc\xf0\x83\xcd\x03\x31\xc8\x84\xfa\x90\x9b\xda\x34\x86\x4a\xaf\x3a\x46\x8a\xdd\xd5\xa2\x0e\xb6\xfb\x12\xc6\x63\x80\x17\xe3\x4f\x1e\x83\xe6\x34\x38\x87\xc2\x6e\x49\xb1\x63\xdc\x7e\x80\x2f\x00\xca\x5d\xcb\x82\x1d\x08\xa3\x4a\xca\x48\x18\x8b\x94\x22\x9f\xb9\x60\x0f\xd2\x88\xa1\x2d\x05\x1b\xe0\xf5\xfb\x0b\x69\x68\x09\xa6\xc0\xb7\x6d\x5d\x6b\x0a\x72\x69\x78\x9f\x6b\x24\x48\x90\xa0\x5b\x42\x3d\x62\xfb\x60\x93\x2a\xa0\xe5\xc0\x68\x8c\x93\x67\xec\xf7\x93\x32\x9b\xdc\x1e\xfb\x83\xa7\xda\x73\x5d\xb1\x08\x0a\x5d\x6c\x67\x79\x51\xb4\xf2\xfc\x4f\xe0\xfd\x78\x95\x8b\xc0\xaa\x2c\xbf\x1d\xa4\x13\x87\x31\x41\x98\x4e\xcc\xc4\x48\xf7\xa8\x5b\xb4\xff\xcc\xe7\x5b\x9f\x7b\x9e\xc1\x7b\x80\x71\x1a\xbc\xad\x10\x25\xdf\x90\x7e\x26\xc3\xb0\xa1\xa9\x2e\x6f\x55\x99\xc3\x16\x72\xf8\xc7\xb9\x2e\xf1\xc3\xde\x4b\x6d\xb5\x52\x12\xa1\x50\x80\x5c\x5e\x82\x68\x42\xeb\xa3\x52\x4b\x99\x97\xe0\xc9\x25\x8d\x32\xc4\xda\xa7\x94\x65\x45\x1b\xc5\x9b\x35\xd3\xd5\x46\x12\xc8\x8a\x5b\x75\x6c\xc9\xb1\xc5\xc5\xc6\x84\x22\x1a\x43\x6c\x2b\x4a\x65\x12\x43\x7e\xa6\x91\x98\xe4\x24\xa4\x88\xae\x8f\x4e\xf0\xd4\x91\x83\xfc\xef\x37\xd4\xda\x4a\xa1\xa6\x52\x48\x61\x50\x47\x0b\x11\x96\xa8\x47\x1f\x23\x93\x26\x2f\x37\x47\x4b\xaf\x93\x5b\x1c\xea\x2d\xc0\x21\x1e\x30\x22\x92\x38\x1f\x3a\xeb\x70\x44\x88\x87\x13\x2d\x47\x92\xb3\xa4\xfe\x1e\x4b\xf5\x2e\x45\x69\x2f\xb7\x20\x68\xdb\x59\x83\xf1\x2d\x0a\x7b\xc2\xc2\xed\xc3\x8a\xa4\xd2\x28\x0c\x46\x00\x52\xcb\x1c\x02\xc3\xa5\x98\x14\x6b\x77\x71\x32\x7a\xa9\x16\x7a\x33\xf4\x2a\xbe\x2e\xf6\x77\x48\x25\x3e\xe9\x2c\x49\xb0\x0b\x5b\x17\x3c\xe8\x37\xdc\x7a\xbf\xab\x05\x1f\x09\x72\x12\x79\xdb\x9f\x28\x58\xee\xbb\x61\xb7\x38\x76\xcf\x1d\x7a\x8f\x9d\x99\xaa\x4c\x40\x1b\xde\x01\x21\xfc\xf3\x6a\xe7\x6b\x50\xca\xb0\x3d\x7e\x49\xd0\xe9\xf1\x56\x73\xcc\x99\x79\x07\xe5\xa4\xba\x74\x02\x8b\xf7\xa6\x2c\x7b\xde\x8d\x72\xa1\x8a\xd5\x6c\x5d\xc0\x6a\x5d\xc3\xd6\x83\x2a\x60\x95\x49\x4e\x94\x90\x00\x23\x5a\x73\xdf\x7d\xf7\x2f\x6e\x23\xd7\xf9\x52\x0d\x1c\x36\xae\x20\x04\xdf\xf5\x4a\xc8\x4a\xd9\xfd\xe6\x2f\x7c\x43\x98\x0e\x2f\xee\x61\x16\x0e\xe1\xee\x93\x9c\x71\x91\x6c\x34\xcb\xab\x98\x6d\x51\xa0\x94\xcb\xe9\x39\xa6\x6d\x86\xae\x50\x7e\x37\x80\x3a\x1d\xda\x81\x0c\x10\xcc\xad\xd4\xbc\x01\x03\xf0\x80\x56\x0e\xc5\xa9\xbb\x9c\x62\xab\xd7\x06\xae\xaf\x8e\x1a\xb8\xf1\xe7\x48\x6e\xca\x4a\x42\x5f\x0b\xfb\x72\x8d\x61\x5a\xc1\x73\xc3\x5d\xa7\xa1\xf9\x8e\xce\x8d\xda\x9a\xba\xd2\x37\xb0\xca\x41\x48\x83\x58\x48\x00\x14\x11\x95\x5a\x29\x59\x8b\x7e\x5e\xf7\x10\x71\x43\x8a\x22\xaf\xeb\x42\x59\xa6\x2b\xb7\xe0\xd8\x9e\xcf\x17\x9e\x18\xbb\x00\x1b\x35\xd5\x84\x99\x0c\xe4\xf7\x86\xe2\x12\xb8\x1e\x0e\x1b\x66\x18\x35\xa2\xaf\x86\xf3\xe1\x00\x81\x4d\xf6\x84\x51\x6a\xc9\xbc\x89\xa1\xf9\xe9\xc2\x2a\xc1\x61\xca\x01\x06\x04\x30\xb9\x7b\x1d\xa1\x77\xde\x3e\xc0\xaf\xe3\x0e\x9d\x94\x2d\x92\xaa\xa4\x5c\x30\xdd\x22\xa1\x01\x88\x3e\xaa\x56\xd3\xda\xcb\xb9\x96\xc5\x93\xa9\x18\x66\x0f\x0c\xc4\x38\x2c\x86\x3c\x7f\xc0\x28\x0f\x30\x4c\x72\xba\x80\xeb\xba\x11\x72\x5a\x69\x63\xe0\xa0\x0a\x01\xad\x1b\xcb\x42\x99\x67\x4c\x9a\x4b\x06\xf0\x0f\xc0\xaf\x79\x6c\x19\xe7\x18\x6d\xf6\x70\x67\xfe\xfd\x4c\xe2\x89\x9e\x2c\xb2\x8b\x27\xef\x3a\x8d\xe3\xd1\xad\x34\x0c\xf8\xe7\x5e\x4a\x41\xdf\x9c\xdc\x49\xef\xbc\xa7\xdf\x7d\x5f\x06\x06\x7d\xf9\x5b\x5c\x9b\x51\xf3\xdd\xc9\x77\xdb\x6f\xd5\x9f\xd1\x03\x5c\xe7\x21\x1c\x06\xbe\x6b\x8f\x31\xa7\x13\xf7\xb6\x1c\x6f\x79\x02\x21\x0e\x15\xdb\x96\x87\xeb\xe9\x54\x9a\x5c\xa3\x27\xbd\x15\xdc\x87\xe2\xed\x62\xfb\xcc\xb9\x01\x80\x40\x1f\x43\x74\x36\x4d\x5a\x68\xbd\xb2\x8b\x1f\xd4\x84\x67\x97\x2f\x30\x8d\x2d\x59\xad\x48\xd5\x9d\x97\xc2\xa8\x95\xac\xec\xdf\xab\x42\x4e\x41\xbe\x00\x47\x6a\x0c\xdf\x83\x26\xc5\xa6\x2e\xa7\xbe\x8d\x9f\x06\x5f\x1f\xe3\x0a\xe1\x5f\x43\xe6\x2d\xef\x6a\xc2\xe2\x04\xb9\x1d\xdd\xa5\xbb\x2c\xc2\x0e\x58\xcb\x11\x00\xd4\xbb\x7c\x5e\x32\xe9\x4f\x3a\x57\x20\x17\x07\xee\xfc\xe4\xe8\x3e\x52\x82\x34\xd3\x70\xbc\x20\xdb\x7f\x70\x7a\xf0\x66\xf0\x39\x77\x2f\xf2\xf7\x0a\xdb\xd8\xc8\x2c\x0a\x65\x4d\x4b\x59\x6e\xbb\xe5\x6c\x90\x47\x83\xa3\x32\xda\x10\x4c\xc1\x69\x74\xa3\x02\xb9\xb1\x74\x1e\xab\x26\x8a\x0b\xa6\x68\x78\x60\x52\x10\x7f\xea\x14\x98\x6d\x70\x00\xb5\x90\x70\x3c\xa3\x24\x0f\x56\x3d\x0f\xf5\x6e\xf9\xff\x57\x8e\x34\xc8\xc1\x48\xa8\x67\xbc\xa7\x02\x6a\x3b\x29\xb1\xb2\x14\x33\xbb\xbd\x95\xf7\xe6\x0b\xea\x15\xaf\x43\x95\x95\x1a\x3d\x00\xc4\x21\x3c\x7e\xfa\x46\x29\x31\x6e\x3a\xa0\x8f\xf7\xb0\x94\xf3\xe9\xc6\x5f\x78\x04\x85\xbc\xa4\x61\xbb\xdf\x23\xf6\xfc\xcb\xa7\x10\x7d\x7e\xdd\xaa\x00\x1a\xb5\xeb\x85\x7e\xdf\x78\xf5\x86\xea\x31\x90\x10\xcf\xee\xd6\x43\x8a\x11\x77\x61\x46\x72\x31\x63\x5c\x97\xd3\x01\xbf\x6d\xda\x07\x01\xcc\xb7\xd5\xb8\xd3\xa2\xbf\x14\x4d\xaa\x64\x3d\xee\x50\x59\x36\xc0\xa2\x5b\x02\x0c\x5a\xbf\x83\x65\x5b\xe6\x81\xa3\xf4\xdc\xa7\x31\xcd\xf3\xc0\x63\x42\xc6\x81\xa4\x9f\x40\x2e\x92\xff\x03\xf6\x4f\x32\xbc\xe2\xe8\xee\xeb\x7d\x82\x6b\x1d\xc6\xa9\x4d\xb4\xf9\xfc\x09\xf1\x34\x9c\x87\x84\x9f\xf9\x46\xf5\x18\x87\x0f\xcf\x8e\xe6\x47\xba\xcf\x54\x0e\xc2\x9a\xfb\x43\x36\x50\xbc\xa7\x81\xad\xc5\x66\xdb\x05\x45\x2e\x44\x6a\x31\x8d\xc6\x34\xf4\x35\x99\x9f\xd0\xb2\xe4\x45\x6b\xe7\x30\x9e\xba\xd1\x51\x22\x7f\x70\x20\xde\x82\x47\x57\xb1\xae\xaa\xbc\x9c\x0f\x30\x8f\x7e\xcb\xb1\x03\xfe\xd4\x70\x8a\x91\x7c\xe9\x9b\x77\xf7\x75\x56\xec\x90\x15\x38\xcf\x61\x0b\x25\x8a\xbe\x0d\x96\xdf\x17\x3a\x5b\x17\x64\x3e\x03\x04\xb6\xbf\xa9\x69\x4d\x48\x32\xb5\x16\x63\xc6\x49\x7f\x58\x4f\xc6\x03\xe7\x1c\xa6\xa6\x98\xaf\x07\xb8\xb0\x15\xa2\xab\x65\x5e\xe6\xa6\xce\xa7\x68\x9a\x23\xdf\x34\x5e\x7f\x6c\x86\xe2\x98\x29\x81\x9c\x37\x2b\xa6\xe5\x47\xf8\x16\x4b\x0d\xcf\x3a\x2b\x40\xd3\x59\xb2\x90\xb7\x84\x73\xba\x92\xd3\x1b\x89\x87\x5a\xb5\x15\xba\x64\x60\xd0\xce\x57\xd6\xbb\xbd\x49\xc8\xb9\x41\x75\x89\xa6\xbd\x26\x41\xf3\x82\x7b\xbc\xb1\xf2\x33\x59\x13\x31\x91\x8e\xda\x42\xf4\xa6\xc7\x12\xf0\x06\xb6\xaf\xb0\x84\xef\xdf\xc6\xa9\x4c\xf2\x72\x56\xac\x55\x39\xc5\xa0\x59\xd4\xd0\xdb\x86\xc2\x20\xd8\xd2\xe0\x10\x3e\x7e\x8d\x61\x1e\x64\x73\xa5\x41\x41\xe0\x7f\x80\xb2\xf3\xb8\x3a\x6f\xc0\x33\x37\x2a\x45\xda\x7b\x18\x9f\x56\xb8\x6a\x52\xd1\xe5\x86\x8f\x70\x5e\xb6\x12\x73\x86\xbd\x80\xdb\xe2\xc2\x6f\xb0\xc4\x25\x0c\xc7\x91\x78\xd7\x6b\x6b\x72\x6f\x20\x7a\x0d\xa2\xf6\xe1\x95\x5c\x25\x4f\xce\xcb\x5a\x55\x3f\x29\x79\x9b\x16\x6d\x1c\xd3\x40\x14\x8e\xf2\xe4\x61\x3b\xa2\x4c\xef\x7d\x6b\x0a\xe9\x9f\x2f\xce\x6f\x3f\x27\xdf\xb9\x1f\x07\x22\x90\x26\x85\xbe\xcd\xd5\x06\x93\x42\x43\xd0\x1f\x80\x61\xff\x4f\x92\x68\xff\x92\x46\xed\xbf\x61\x86\x68\xea\xd9\xa0\xb1\x30\x58\x42\xd9\x2b\x06\xe3\x02\x5a\x25\x02\x07\xc5\xf4\x7f\x74\xbb\x90\xc6\xe8\x69\x0e\xf9\x20\x18\x24\x62\x98\xb3\xe1\xa7\xe7\xe8\xbf\x51\x5b\xb3\xff\x82\xbe\x65\x42\xd0\xa1\xfb\xfc\x8f\x6a\x7b\xa5\x5f\x55\x7a\x45\x8b\xf8\xb8\xa8\x47\xa2\x87\x59\xf5\xc0\x7f\x8c\x4e\x8f\x91\xe8\x51\x06\x3e\x78\xfa\x42\xd5\x72\x24\x7a\x94\xf5\x0f\x1e\xbd\x59\xe4\x33\x5b\xd7\xd8\x7f\xed\x43\x87\x51\x74\x71\xfe\xa7\xa0\xd5\xf0\xe1\x04\x56\x4a\x70\xed\xc2\x9b\x1f\x2a\xbe\x8d\x2d\xb1\x15\x4b\xb9\x12\x79\xed\x06\x46\x97\x05\x80\x1a\xf0\x41\x33\x42\x7d\x40\x20\x65\x62\xa7\xa4\xbd\xaf\x8d\x2a\x66\x83\xf0\x45\x67\x21\xfe\x49\x4f\x6f\xf6\x6d\xbd\xa1\xa5\x74\xea\xcc\x74\xa0\x16\x17\x4b\xf9\x37\x0e\xbd\xad\x3e\x4c\xd5\xaa\x26\x90\x34\x50\x6a\x45\xc6\x66\x46\x2a\x78\x0e\xf1\xbe\x7c\x0f\xe7\x4b\xff\x46\x6d\x8f\xab\x79\x70\x17\x30\xd1\x7a\xb2\x72\xfb\x22\x37\xde\x27\x91\x6d\xba\xa3\xa4\xe8\x90\xbd\x3c\x6c\x31\x59\xa5\x63\x99\x62\xf1\xed\x28\xea\x1a\xc9\x81\x48\x6e\xd4\x96\x96\x44\x63\x99\xbc\xc3\xe2\xef\x99\x82\xc9\x95\x7e\x26\x1e\x3e\x64\x5f\x7a\x47\xcf\xdf\x8b\x11\xf3\x75\x6c\x44\x68\xc6\x8d\xe9\xca\x96\xd7\x32\xba\x51\x72\x8f\xc0\xdd\x21\x51\xd9\xaf\x64\xf0\x81\x46\xca\xe3\xcd\xb4\x52\xaa\xfc\x8f\xc0\xe6\xf1\xc1\x7f\x86\x07\xd3\xc2\x1e\xaa\xff\x91\x3e\x60\x25\x56\x72\xae\xfe\x23\xfe\xc9\xeb\xe3\x2e\x63\x5f\xa0\xfd\x14\x9e\xe0\xee\x0c\xbf\x69\x17\x86\x07\xe9\x1c\x8f\xda\x47\xdb\x16\x9d\xac\xeb\x5a\x97\xa1\x2a\xfe\x36\xe1\x41\xa5\x20\xff\x19\xb2\x45\x7e\x89\x65\xee\x36\xb1\x44\x3d\x8c\xaa\x88\x5f\x7e\xa1\xb2\x00\x8b\xea\xcd\xc9\x2e\xf9\x0f\x8f\xad\x7d\xe6\xdc\x2b\xb5\x7b\x42\xf7\x70\x5e\x75\xef\x30\x15\x4f\xff\x3b\x1f\xa9\x74\xa4\x74\x1d\xaa\x61\xa5\xfe\x2e\xe7\x2a\x7d\xfd\x77\x3b\x57\x1d\xfd\xf6\x73\x35\x74\x6e\xd0\xb6\x25\xf7\x0e\x1b\xae\xd3\xdf\xd0\x36\x5d\x42\x69\x5b\x70\xe4\x17\x68\xec\x38\x0d\xae\xd0\x2f\x7c\xb1\x5e\xa7\x07\x34\x94\xb9\xf4\x4e\xcd\xf8\xf3\x56\x55\x21\x5d\x33\x7c\x0c\xe4\xd7\xbb\x3f\x06\xc5\x3e\xf7\x63\x1e\x34\xa3\x55\x62\xde\xad\xc3\xfa\x06\x34\x52\x04\xe8\x8e\xce\xc1\xb2\x00\xe3\x3d\x5e\x93\x80\x81\x4a\x72\x20\x54\x62\x0a\xf9\x76\xec\x65\xcb\x25\xce\x71\x90\xed\x80\xfc\x28\x45\xad\x57\xfb\x90\xe4\x03\xe9\x8d\x61\x10\xf4\xad\xaa\x08\x14\x14\x7f\x33\x68\x54\xb8\x14\x01\xe2\xfd\x50\x5c\x96\x05\x80\x73\xf2\x62\xfe\xee\x02\xf8\xf0\xca\x25\xbe\x70\xa9\x09\xb2\xf5\xaa\xc8\xa7\xd2\x63\xde\xb3\xc4\x3e\x4b\x7d\xeb\xb6\x21\x90\x8b\x30\xd2\xbf\xf2\xdb\x0c\xa4\x2e\xbd\xae\x01\x64\xc7\xc7\x2f\xa3\x81\xad\xd1\xde\xa1\xb8\x28\x91\x33\x78\x1b\x3f\xba\x4f\x3a\xf0\x51\xd6\x5f\x3f\x14\x2c\x3d\x17\xe0\x8c\xff\x6e\xfa\xbf\xce\xfb\x7f\x58\x30\x60\xc7\xe1\xe7\x7e\x83\x29\xf3\x97\x9c\xbd\x36\xa2\x7b\x02\x1a\xf5\xc7\xf6\xaf\x3f\x8c\xbe\x4e\x46\xa4\x1d\x25\x6e\x15\x57\x52\x1c\x1c\x88\x17\x21\xad\x9d\x90\x7e\x12\x05\xb8\x97\x40\x38\xdb\xba\x16\xfb\xe8\xaf\xd0\x9d\x47\xc5\x6b\x57\x20\xeb\x4f\x5e\x06\x7d\x65\x63\x1c\x87\xa8\xfe\x84\x61\xeb\x1c\x64\x68\xd9\xb8\xf1\x1a\x30\x5f\x57\x95\x9e\xc8\x49\xb1\x15\x92\x34\xa9\x2c\x5f\x87\xfd\x6f\x03\xdb\xb1\x51\xb7\x15\x92\xce\x9b\x69\x9e\xdb\x43\x0a\x3b\xbb\x59\x6c\xc5\x58\x6f\x4a\x55\x9d\x91\xad\x1d\x91\x72\xf5\x12\x50\x63\x8c\x58\x97\x2e\x5a\x30\xd8\x03\x5d\xdf\x33\x3d\x6d\xfb\xf8\x30\xa2\xc7\x15\x6f\x99\x9e\x72\xbd\x1b\x36\x3e\xd3\xd3\x21\x69\x0e\xfe\x9a\xab\x0d\x79\x2c\x12\x76\xc3\x5b\x52\x1f\x77\xa8\x46\x91\xc2\x26\x2e\x94\x4e\x91\x5d\x73\x87\x41\x9d\xad\x0f\xef\xb3\xb4\x19\xee\x8b\xc0\x1d\x9d\x3a\x00\x3a\x82\xb4\xde\x13\x78\x8f\x9d\xbb\xc0\x8b\x1d\x8e\x4e\xad\x01\x67\x0f\x09\x81\x62\xfd\xb4\xd0\x46\x99\x26\x32\x26\x15\xda\x13\x23\xbe\x1e\x1b\x13\xfd\x42\x3b\x25\x95\x64\x58\x2b\x8e\x29\x59\xc6\x82\x83\x36\x8c\x7b\xc8\x73\x13\x41\x9b\xd2\x2e\x33\xb5\x25\x56\x39\x3a\x12\xb5\x8e\x56\xf2\x4b\xca\x1c\xbb\xc2\x28\x4e\xb8\xcf\xe8\x75\x25\x96\xb2\x94\xf3\x08\xe9\xea\x3e\xfb\x6b\x46\x1d\x17\x47\xd4\x46\x6c\xa4\x78\x06\x73\x3f\xea\xb0\x41\xd8\xa2\x7b\x7c\xce\x9d\xf9\x42\xdf\x93\x40\xad\xf7\x98\xcd\xa2\xb0\x27\x20\x8f\xf0\x09\x42\x42\x7b\x90\xcf\x37\xc3\x70\x56\x0f\xa0\xe1\xf7\x54\x1a\xc3\x97\x7c\xd4\x0f\x10\x81\x47\xbd\xe8\xb5\xc3\x6c\x71\x83\xc3\x5f\xc6\x0b\xef\x88\xfa\xce\x3a\xa3\xec\x01\xfc\x19\x9d\x01\x59\x60\x20\x6a\x7d\xcf\xae\xc0\x77\xe2\xae\xc0\xa3\x5e\xf4\x3a\x6d\x66\x78\x95\x76\x24\x74\x16\x0a\x85\x98\xa5\x20\xa4\xb0\xa8\xa5\x02\x87\x5e\x61\xa3\x71\x06\xc2\xa4\x3a\x1c\x66\x5e\xea\x7d\x43\xdc\x1f\x83\xc9\xd9\xad\x8a\x17\x72\x35\x16\x4b\x99\x97\xb8\xaa\xa5\x58\xca\xd5\x0a\xc0\x89\x10\xc6\x68\xb5\x9e\x14\xf9\x54\xcc\xe4\xd4\x87\x60\xcd\xd6\x05\xc2\x16\x11\xd8\xad\xbd\x02\xef\xf9\xc8\x07\x87\xc8\x11\xf0\x9b\x24\x0f\x5c\x25\x25\x32\xf8\xd2\x19\xa2\x6e\xa9\x39\x7f\x18\xbb\xb7\xa7\xa0\x3d\xb0\xc4\xc0\x1f\x87\xbe\xed\xbf\x27\xc1\x36\x2b\xab\x39\x7a\x51\x41\x62\x57\xb9\x02\x15\x35\xe4\xf6\x7b\x80\xb9\xfe\x7c\x43\x88\xb4\x87\x61\xd1\xb5\x62\xf9\xdc\x97\xa8\x9c\xb7\xa2\x8a\x87\x12\x04\x08\x6f\x0c\xe6\xc0\x4c\x6e\x19\x61\xdf\x42\xff\x0b\x65\x80\x98\xcb\x5d\x2d\x26\x6a\xaa\x97\x68\x31\x46\x30\x72\xf1\x42\xae\x48\x8b\x8f\x72\x5f\xa5\xe4\x0d\x2a\x82\x23\x8b\xf3\xf1\xab\x0b\xe6\x14\x68\x6f\x09\x2a\x13\x63\xf4\xe7\x1c\x93\x63\x60\x2f\xf3\xd1\x3e\x4b\x79\xa3\x04\x46\xe2\x68\x02\xd7\x81\xbe\x56\xb2\x34\x84\x78\xac\x10\xd0\x1a\x6f\x5f\xe8\x62\x7a\x71\xee\x14\x2f\x43\x34\x9b\x04\x5c\x64\xa8\x94\x1b\x04\x41\xb4\xa4\x02\xb0\x0d\x79\xb0\x57\xaa\x04\xdc\x10\x4a\x12\x11\x2b\x20\x70\xe2\xff\x19\xa9\x32\x86\xd7\x15\x2e\x2f\x1c\x7c\x70\x74\x38\x4c\x3c\x30\xcc\x7d\x2b\x82\xe0\xe3\xcf\xea\x98\x8c\xc1\xef\x0f\xb8\xe5\xbf\x8b\xcc\x11\x83\x4a\xf0\x40\x7e\xae\x88\x71\xc0\x79\xc3\xeb\xeb\x37\xe7\xa7\xaf\xcf\xaf\xae\x2f\x5e\x5e\x9d\xbf\x7e\x79\xfc\xd3\x9b\xeb\xb3\xcb\xeb\x97\x97\x57\xd7\x3f\xbf\x39\xbf\xbe\x7c\x7d\xfd\x9f\x97\x3f\x5f\xbf\xbd\xf8\xe9\xa7\xeb\x93\xf3\xeb\xe7\x17\xaf\xcf\xcf\x22\x84\x6f\x5c\x3e\x97\x56\x4c\x70\x24\xfd\x37\x86\x8d\x22\x87\xa1\xe6\x99\x9a\xac\xe7\xf4\xee\x79\x85\xee\x48\x6d\xd5\x1b\xe5\x0e\xe3\xf9\xf0\xd0\xae\xf6\xd2\x84\x20\xd1\x0d\x54\x10\x78\x4a\xb0\x20\x71\x96\xf1\xe0\x94\x84\xab\xa7\x11\xc2\x42\x50\x22\x1f\xbb\xaa\x75\x40\x08\x40\x89\xa1\xbd\xe7\x16\x12\x9d\xc2\x09\x89\x60\x58\x92\xa7\x55\x47\x6a\xf2\x33\xf0\x0a\x0e\x7e\x10\x76\x69\x6f\x34\x01\x25\x8c\x60\xf8\x5e\xea\xf3\xd9\x4c\x4d\x6b\x44\xd2\x3d\x38\x10\xe1\xbf\x27\x93\x27\xf4\x1f\x94\x7c\x85\xa0\xe0\x2a\x7b\xab\xab\x1b\x80\x89\xf3\xc5\x7d\xc9\xa7\xf0\xd9\xff\xd4\x6b\x58\xfa\xcc\x01\xa3\x52\xa6\x16\x7d\x60\x07\x59\x26\x96\xba\x52\x7b\x98\x07\xfd\x55\x21\xa7\xce\xbf\xff\x9b\xb8\x01\x8e\xea\x53\xfc\x3e\x86\x66\x89\x23\xf1\xaf\x49\x3b\x7d\xc9\xa7\xae\xa5\x8e\xe6\x71\x99\xf9\x5a\x7f\x84\x5a\xae\x24\xd1\x3c\x83\x10\x1c\x80\x9e\xfc\x53\x6b\xef\x9f\xba\xde\x9f\xea\xb2\x56\x65\xfd\x5a\x19\x38\x74\x9e\xfe\x31\xe9\xfd\x53\x3f\x4e\xa7\x2e\x57\xc1\x91\xf8\xb6\xa5\x47\x4f\xc3\x88\x9e\x57\x76\x99\xff\xb1\xd9\x1f\x28\xf9\x94\x8d\xfd\x6b\x35\xb3\x1f\xfd\x26\x6d\x24\x94\x7c\xea\x66\x09\x55\x87\x97\x3f\xbf\xbc\xba\x78\xf9\x7d\x00\xf2\x83\x27\xe7\x67\x30\xc0\x38\x92\x2f\xc3\xa3\x6f\x63\x38\x45\xd8\xed\x2f\x10\x38\xfd\x62\xb9\x2a\xd2\x3d\x50\x92\xc8\x85\x4c\x89\x5c\xa2\x70\x47\xc8\x02\xb6\x5a\xad\x62\x94\x59\x1e\x91\xef\x8b\x10\xd4\xef\x32\x9f\x2f\xe8\xce\x55\xaa\x8d\xa8\x2b\xe5\x6d\xbc\x76\xe1\x86\x4c\x14\x48\x6d\xab\xec\xb5\x78\x26\x72\x5b\x80\x30\x49\x72\x3a\x20\x08\xef\x77\x45\x91\x1c\x3e\xbd\xad\x50\xb8\xbc\x6d\xef\xea\x90\x83\x1c\x9d\xa1\xf0\xdd\x95\x9c\x8b\xc7\x61\xd1\xa0\x37\x94\xdb\x17\x8d\xcb\xa8\x1b\x5f\x7e\x21\xc5\xb4\xe7\x40\xf3\x1d\xe1\x34\xf5\xde\x87\x9a\x34\x68\xf1\x6b\x7e\xff\xf9\x8c\xd6\x74\xb4\x27\x4a\x39\xce\xa5\xff\xcf\x6f\xe2\x47\xc6\xb1\xd0\xbd\x4d\xce\x81\x5d\xfd\xa0\x4d\xfd\x5a\xeb\x9a\x43\x41\xc1\x3d\x92\x81\x96\xe5\x46\x6c\x00\x96\xba\x54\xc6\x1e\x8a\xae\x8e\x43\xbb\xb5\xe7\x64\x4e\x69\xc0\x0e\x0e\x08\x78\xda\xee\x35\x99\x97\xaa\xba\x28\x6b\xfd\x66\x3d\xb1\xeb\x22\xf2\xd5\xa5\xe5\xeb\x38\x9f\x87\x33\xce\xf2\x0c\x90\xad\x73\x94\x7d\x2a\xad\x6b\x12\x22\x96\x4a\x96\xc6\x45\x96\xf5\x28\x60\x03\xc2\xcb\xa6\xba\x2c\x09\x8d\xbf\x52\x8a\x01\x42\x2c\xa4\xc1\x84\x28\x6b\x97\x49\x60\x18\xb8\xac\xdf\x42\x29\xa4\x14\xdf\x40\x7c\xf3\x78\x30\xaa\xae\x1d\x66\x47\xb4\x83\xa6\x23\xe7\x6f\x48\x48\x32\xb8\x62\x69\x7e\x62\xf2\x23\x72\x48\x12\x59\xb8\xda\x62\x51\x97\x02\x5d\x3c\x7e\x8c\x95\xfd\xa4\x82\x06\xf4\x34\xfe\x50\xf4\x19\x27\x0f\x68\x3c\x82\xc3\xdb\x3c\xa4\x6e\x08\x05\x03\xb8\xbf\x2b\xba\x91\x55\x99\x97\xf3\xbe\x2b\x3e\xbc\xb6\x4f\x54\x76\x3c\xd1\xeb\xfa\xb5\x9a\x99\x8b\xf2\x35\xac\x82\x81\xe8\xfd\x0b\x78\x0a\x58\x69\xd6\x18\x8c\xb1\xa6\xa1\x70\x50\xd5\x79\x6d\x68\xcd\xf4\xf7\xbc\x7a\x6b\x28\x7a\xe2\x6b\xd1\xf3\xcf\x79\xd0\xc8\xca\xca\x7e\x7e\x68\xf5\x8c\x72\x1f\x40\x5c\x38\xc2\x54\x5f\xb8\x54\x53\x48\xa5\x54\xb7\xaa\xa2\x26\xa0\xfa\x63\x81\xba\x3e\xc0\x57\xfd\xfb\x1a\x9c\x11\x4d\x2d\x0b\x85\x09\xf5\x7d\x18\xde\xaa\x52\xb7\xb9\x5e\x1b\xde\x98\x81\xc7\x21\xac\xd4\xcc\x0c\xed\x6d\x9c\x50\x57\x0a\x3d\xcf\xa7\xe0\xd7\xed\x86\xfe\x2c\xcf\xa0\xb3\xd0\x36\xa0\xc1\x5f\xd1\xb1\xe6\x22\x18\x7a\x83\xa6\xf4\x12\x26\x01\x10\x8e\x7a\xc7\x81\x76\x2f\xb8\x3d\xdd\x35\x0b\x51\x26\xe9\x8f\x1c\xe8\x64\x46\x0b\xc1\x8a\xb1\x61\x65\xc6\x87\x42\x37\xa6\xcb\xaf\xd9\x11\xd2\x58\xe6\x7e\x61\x5a\xb6\xd9\xc3\xfe\xbd\xe8\xb5\x67\xea\xf8\xb9\x94\xe8\x3d\x2a\x66\x39\x64\x76\xcc\xc0\xc3\x56\x32\x16\xc0\x10\xb1\xa3\x44\x1a\xbc\x79\xb6\xb2\x93\x31\xed\x97\x7f\xb6\x6b\xf7\x4d\xa1\x37\xaf\x64\xbd\x48\x0f\x54\x7f\x24\x7a\xc9\xd2\x3f\xf1\x43\xf9\xa9\x27\x2b\x62\x7b\x43\x6c\x88\x87\xde\x77\x2c\x19\xce\x4e\xc1\x18\x5a\xe2\x0f\xdd\x35\x7a\xb8\x00\x1e\xf6\xb1\xa0\xe5\x1f\x9e\x05\xfe\xe6\x83\xe9\x78\x95\xf1\x39\x56\xdc\x21\x77\xa7\x6a\x98\x03\xba\x37\x8e\x07\xbc\x05\x6e\x74\x70\x14\x9e\x54\xb2\x9c\x2e\x94\x01\xdc\x8a\xa2\x10\x1b\x59\xdc\xc0\x0d\x78\x23\xab\xcc\x88\xf5\xca\xd9\xff\xed\x51\x42\x67\x83\x16\x46\x29\x4c\xe0\xb5\x92\xf5\xc2\xbf\x46\x7c\x21\x7b\xff\x1e\xba\x88\x26\xc8\x5e\xa0\x00\x11\xd7\x9e\x49\xc1\x13\x0c\x49\x81\x7f\x9a\x2c\x28\x48\xd0\xee\x73\x6c\x45\xa6\x64\x81\x20\x0a\xe0\x34\xe6\x56\x0a\x97\xbb\xec\x83\x89\x38\x12\xd1\x62\xa1\x33\xde\xee\x57\xee\xa8\x8b\x1a\xd3\x63\x5b\x3a\x3d\xdb\xc3\xeb\x13\x71\xe4\x0b\x3e\x73\x7f\x85\xb5\x18\xa9\x15\x61\x51\xba\xc2\xbf\xfc\x22\xe8\xef\x93\x48\xdd\xf7\x16\x8e\x59\x19\x4e\x62\xa7\xd5\x83\xab\x7c\xea\x8d\x78\x31\x43\xbb\xce\x54\xaf\x72\x65\x5c\xf8\x15\xd2\x25\x4e\x83\xf0\x4d\x2e\x1d\x9a\xbd\x05\x4d\x17\x79\x01\x90\x23\xf6\xb6\xe1\x28\xf1\xc4\xf1\x98\xf1\x2c\x2f\x32\xa6\x9c\x20\xf5\xc9\x42\xae\x56\xaa\x0c\x39\x31\x26\x32\x2f\x20\x33\x44\x29\x0a\xbd\x71\xc4\x56\x55\xae\xab\xbc\xde\x8e\x30\xc9\x9a\xcc\x0b\x95\x81\x7e\x1c\x9a\xd4\x33\x44\xbd\x52\x6b\x43\x61\xd9\xce\x3f\x1f\x5e\x04\x79\xd3\x0d\x28\x96\xb7\x4b\x9a\xc6\x0c\x9f\xa4\xd9\xa4\xa1\x90\x88\x2a\xf9\xf3\x13\x27\x39\xa9\xe6\x12\xd0\x3b\xea\x32\xce\x0e\x8a\xf3\x71\xab\xbc\x0f\xa4\xe5\x0a\x76\x84\x8e\x1d\x70\xa7\x6b\x37\xee\x88\x21\xab\x9b\x72\x5b\x6a\x15\xf3\x66\x6d\x6e\x3b\x2e\x8a\x36\x1b\x37\xb9\x67\xe3\x4e\x7e\xd3\xc6\x45\x5b\x25\x6d\xa0\x1b\x72\x9c\x36\xcb\x1c\xf2\x72\x1e\x8b\xd4\x2e\x39\x96\xcb\x75\x0d\x82\x01\x5e\x3b\x18\x71\x50\x18\xc9\x72\x8b\x2c\xd6\x8a\x0a\x20\x33\x8b\x37\xcc\x8f\xc8\x53\x03\xd7\x52\xb0\xf1\x01\x49\x62\x4b\x5b\x5a\x9c\xe0\xe9\xca\x84\x68\xcf\x37\x07\x10\xc5\x0f\x40\x32\x43\x7f\x8e\xff\x5a\xfe\xdb\xd0\xe3\x33\x66\x01\xfc\x7e\xd2\x76\x6f\xa0\x54\x69\x34\xc4\xb0\x45\x55\x65\xb7\xef\xb1\x57\x67\x36\xdf\x9d\x84\xbd\x9c\xe5\x33\x48\x3f\xc3\xf2\x8b\xc3\x22\x32\x43\x3b\xd4\x7c\x2f\xc7\x64\x0c\x8d\xff\xb4\xca\x8d\xd9\x87\x90\x11\x40\xd0\x38\x06\x47\xd5\x40\x6c\xa2\x0a\x8d\xf6\x8e\xc0\x0b\xec\x0d\xde\xb6\x70\x88\x24\x11\xed\xf9\x04\x3d\x5c\x5b\xca\x07\x62\x54\xf1\x84\x2a\xba\xb1\x97\x61\xab\xba\x15\x33\xf1\x8f\x4e\x3a\x4d\x6e\x8d\xa1\x31\x2d\x2c\x0e\x45\x02\x4a\x6c\xe3\xb4\x98\x6b\x0c\x13\x0c\xb4\xc8\x4c\x36\x10\xa6\xd0\x1b\x38\x95\x46\xc2\x4c\x65\x19\x77\x1a\xd8\xaa\x92\xd3\x85\xe3\xab\x61\xd1\xe2\xa1\xc6\x16\x26\xc4\xd5\x62\x4d\x1c\x12\xd0\x2b\xe3\x63\xa3\x3c\x2f\x3f\x38\x08\x75\xde\x40\xa6\x07\x47\xfb\xd8\x33\x47\xa3\x6a\x6e\x1b\xcc\xb3\xe7\x56\x3e\xa2\xfd\x16\xa5\xc0\xb7\xef\xaf\xef\xc3\xfc\xae\x5b\xb9\xdf\x75\x27\xfb\x4b\x3e\x1a\x04\xda\xce\x09\x6c\x9d\x44\x7a\x1c\xce\x2f\xd1\x60\x72\xd7\x9d\x5c\xee\x8e\x36\x4c\xda\xdb\x20\x3f\xb1\x0d\x7e\xf8\xae\x77\x72\x32\x38\xc1\x79\x8b\x78\x5b\x1b\x73\x79\xd2\x32\x97\x22\x9d\xa9\x93\x78\xa6\x76\xcc\xd5\x5d\xb3\x75\xe7\x58\x75\x0e\x4b\xe7\x30\x36\x46\x8c\x8f\xd9\x5d\x33\x77\x8f\xf6\x74\x2c\x95\xce\xa5\x75\x47\x7b\xee\x98\x45\x5e\x38\x9a\xc5\x56\x41\x1c\xdf\xd8\x03\x04\xdc\x4d\xf4\x1a\xd2\x5c\x39\x04\x09\x9a\x62\xbb\xa7\x29\x38\xa1\xcc\xc0\xcd\xc5\x24\xe9\x04\xbd\x19\xda\x49\xc4\x11\xef\xba\x5f\xb2\x41\x91\x9a\xe1\x1f\xf6\x25\x93\x31\x69\xec\xdb\x3a\xf1\x9a\x09\x18\xc6\x1d\xc1\x94\x1d\x61\xa2\x90\xab\x01\xa6\x9c\xf9\xaf\x5e\xe0\x6b\xbf\x4f\xca\xc4\x70\xa7\xf0\xa2\x7f\x8e\x83\x2b\x21\x71\x27\x44\x74\x82\xfe\x6a\xc0\x94\x4d\x4d\x5d\xd3\x50\x5c\x0c\xd5\xd0\x45\x58\xb3\x2b\x99\x1d\x95\xa6\x92\xed\x37\xbf\x64\xc1\x21\x1f\x14\x34\x4e\x57\x14\x6f\xc9\xcf\x93\x1c\x3b\xae\x61\x10\xbe\xbf\xc9\x8d\x12\x27\xa0\x5e\x43\x93\x60\x93\x40\x53\x62\xeb\xb8\x5f\xdb\xd1\x81\x0b\x2b\x09\x7e\xe1\x5e\x4d\x44\x5f\xe1\xf2\x3e\xba\xe3\x52\x4e\xb5\xfd\x8d\x3b\xaa\x9d\xfa\x32\xf3\xbc\xe2\x07\x07\xe2\xa5\xfa\x50\xbb\x8b\x5b\x95\xdb\xff\xeb\x8d\x73\xdd\xf2\x18\x77\x6e\x86\x02\xf6\x43\x94\x2b\xf3\xe0\x4a\x7d\xa8\x87\xb1\x8e\x3d\x6a\x43\xc7\xf5\xae\x55\x27\x1b\xf2\x13\xfa\x80\x64\xf6\xd6\x7e\xa9\x79\x8d\xf6\x0a\x3a\x16\xd3\x47\x70\xeb\x11\xf7\x0e\xcf\x98\x74\x78\xc4\xea\x47\xaa\xe4\xf8\x48\xb0\xdb\x22\x2f\xb9\x2e\x29\x74\x00\x9a\xd7\x3a\xea\x9d\x57\x7d\x1a\x8e\x87\x18\xaa\x8c\x1c\x32\x0e\xc8\x7c\x18\xab\xb3\xdd\x70\xf0\x96\x77\x7f\xb5\xe5\xbb\x81\xef\xde\xa1\x2e\x77\xf1\xd3\xd8\xa8\xc6\x48\xa5\x55\xf8\x88\x31\x56\xff\xd1\x81\xba\xea\x8d\x4b\x1f\x1b\xf8\x2e\x68\x6f\x17\xaa\x52\x08\x5a\x74\xfe\xe6\x27\x2b\x3a\x42\x16\x3e\x74\x43\x80\x34\xe3\x68\xf2\x38\x38\x10\xca\x14\x79\x59\xef\x67\xb9\xb1\x0c\x63\xbf\x54\x1f\xea\xfd\x22\x2f\x95\x28\xf5\xfe\xba\xac\x2c\xff\xb4\x2f\x5a\xcc\x88\x3b\xb7\xdd\xdb\xbc\x5e\xbc\xd4\xaf\x74\x55\xcb\xc2\xfc\xcf\x1e\xfc\x3d\xf7\xa0\x43\xcf\x00\x42\x0f\x89\x10\x8e\xfc\xff\x6c\xcf\xff\xef\x6e\x4f\xb0\x38\x1f\xff\xf4\xd3\xc9\xf1\xe9\x8f\xd7\x27\x97\x97\x3f\xfe\x78\x7e\xfe\xea\xe2\xe5\xf7\xd7\xaf\x2e\x2f\x7f\xba\x7e\x73\xf1\x7f\x21\xe3\xda\x13\x34\xfc\x4e\xc9\x34\x7d\x12\xf2\x5a\xbe\xd2\xba\x10\x47\xe2\x1d\x8b\x54\x7c\xee\x36\x49\xa6\xd4\x4a\x99\x9a\xe4\xbf\xb0\x91\x5c\xae\xcf\x62\xeb\x44\x1d\xe7\xfe\x0c\xc2\x90\x53\x71\x7e\xc5\x10\x20\x83\xab\x13\xe2\x32\x11\x6c\x83\x2a\xeb\xbc\x52\xf4\x01\x2b\x13\x01\xce\x82\x33\x16\x52\xc2\x4b\xdb\x7b\x4b\x0d\xe4\xbb\x3d\xb0\x00\x37\x2a\xe8\x9a\x2a\x0d\x7c\xb2\x2c\x00\x16\x89\xa3\x16\xec\xf6\xb7\xc2\x94\x37\x30\x52\x66\x6b\x53\xa7\x80\x25\x35\x28\x6d\xc1\x64\x34\xd7\x3a\x13\x79\xa6\x24\x22\xab\x4d\x17\x01\x28\x9f\x62\x5c\xc5\xba\x0c\xd0\xbf\x67\x97\x2f\x48\x51\x5c\xc9\x5b\x55\x19\x59\x10\xac\x9c\xf4\x38\xc1\x59\x3e\x9b\xe5\xd3\x75\x81\x1a\x10\xcd\xb2\x57\xb9\x58\x62\x4c\x03\x2a\x91\xd0\x72\x4d\x0e\x60\x7a\x62\x54\x75\x8b\x80\xc2\x0c\xdf\x58\x16\x05\xa4\xb9\x23\x74\xa0\x61\x60\x53\xb6\x67\x4d\xad\x0d\x05\xc9\xc7\x2f\xb9\x5f\x0a\x80\xa2\x70\x36\x93\x5a\x79\xd1\x2d\xbd\xf4\x7a\xaa\x59\x24\xe7\x2a\x87\x47\x9c\x9a\x6d\x03\xd7\x0e\xd6\x1f\xfb\x29\x26\x82\x06\xcb\xef\x4c\x3b\x2f\x96\x9f\x29\x60\x06\x53\x95\x3a\x88\x63\xb1\xc8\x55\x65\x6f\xa9\x18\xa1\xa8\x57\x02\x5d\xe0\xdd\x1a\x8f\x21\x77\xc8\xa1\xf7\x94\x6d\x80\x1f\x71\x03\x24\xbe\xf0\x2d\xb0\xeb\x31\xf6\x4e\xc7\x1e\xa2\x94\xd3\x5c\xef\xce\x0c\xa2\x5d\x95\x56\x7a\xe5\xb0\xe5\xbc\x25\x2e\x76\x3e\x8e\xdc\xd8\x93\x92\x71\xc0\x5e\x12\xa1\xc7\x29\x06\x70\x8e\xa6\xe7\x2e\x9b\x08\x5b\x38\x99\x1f\x4a\x32\xc0\xda\x30\x8a\x7e\x61\x20\x09\xfb\xf4\x28\x1a\x41\xac\xed\xbf\x38\xe2\xa1\x06\xf0\xce\xcd\xa6\x19\x89\x77\xef\x31\x11\x46\x9c\xd7\x1c\xee\x63\xbb\xa6\x2f\x8f\x52\xff\x77\x8d\xa2\x5b\x7a\x5d\x63\x97\xbe\x8e\x86\xac\xf1\xd6\xb7\x9a\x66\x1d\x9c\xa7\xee\xb5\x3e\xc4\x9f\xef\xe0\xd6\x6e\x01\x75\xae\x98\xb5\x59\x84\x3e\x1f\x76\xa0\x33\xb9\x01\x03\x03\xde\x24\x8c\x56\x0a\x1c\x4d\x1d\x64\x25\x86\x7c\x7d\x20\xff\xf9\x49\xeb\x95\x07\x65\xb7\x5c\xde\xef\xbc\x81\x87\x59\x04\x5b\x64\xcf\x80\xe6\x9b\xb8\x77\xec\xcf\x6d\x2f\xcc\x75\x8f\xa5\x3d\xf6\x30\xbf\x93\xb5\x95\x6e\x20\xfa\xb8\xaa\xe4\x16\xb3\x10\xd3\xf8\x3a\xac\x01\x3b\x1a\xc0\x11\x4b\x4a\xd9\x11\x63\xa0\x0f\x1c\xfa\x41\x8a\x8d\x8e\xa9\x4d\xb2\x7c\x86\x01\xba\x67\x97\x2f\x06\xa2\x50\x32\x43\x1f\x78\xca\x1a\x92\x24\x0f\x05\xc3\x1b\x1c\x30\x60\x54\xe8\x19\x14\x00\x80\xf3\x23\xb6\xf8\x1f\x9e\x3e\x7d\xf2\x6f\xde\x2c\xe7\xf8\x51\xba\xb5\x32\xcd\x04\xc4\x87\xae\x58\x90\x60\xf8\xa0\x87\x05\x05\xf3\xeb\x0b\x7b\x7d\x32\xb7\x99\x39\xfe\x02\x87\xed\x51\xc7\xa1\x96\x90\x80\x36\x54\x8c\x8d\xb7\xd0\xbc\x7f\x83\x58\x9f\x77\x85\x24\xd8\xcf\xc1\x0a\x75\xe7\x11\x23\xf3\xa0\x3d\x8d\x7f\x7b\x1b\x5a\xd2\xf9\x77\xae\x5f\x5f\xeb\x5d\x4e\xf2\xdb\x75\xbc\x27\xfa\xd1\x6a\xef\x0c\x84\xe2\xa5\x76\xe5\x4a\xe8\x28\xb7\x17\x01\x76\xa2\x54\x61\x57\xe3\x46\x01\xca\x27\x84\x8e\x63\x6e\x2c\xf0\xcb\x7c\x06\xf2\xd9\xb5\x02\x7d\x4e\xd0\x31\xc2\xc3\xb8\xf9\xe2\xc8\xab\x70\x22\x57\xde\x1f\xe2\x4e\xc6\x95\x70\xd4\x9a\x94\xe2\x07\x0d\xf7\xe0\x73\x6c\x4e\x9f\x9a\x45\x54\x42\x23\x1f\x3e\xa4\xbf\x53\x8f\x25\x57\x31\xf2\x7d\xba\xe6\x85\x03\x2a\xc1\xca\xa4\x01\x6c\x46\x4c\xb6\x24\x02\xc5\x59\x04\xba\x92\x6d\x46\xcc\xfe\xb5\x9a\xea\x8a\xd0\x6c\xc7\x3c\x7d\xc4\xa9\x86\x15\x5a\x9b\x71\x6b\x9c\x2d\x31\x8d\x13\x69\x10\xad\x10\xcf\x06\x70\xde\xee\xf3\x8c\x9d\x7b\xad\xe1\xb5\x0e\x0b\xda\xc5\x0d\xeb\x92\xac\x25\xb5\xa6\x0c\x0d\x1e\xab\x3b\x4e\xd6\xf9\xcc\x51\x38\x2e\x29\x86\x0b\x39\x90\x14\x15\xa0\x7d\x07\x6f\x25\xa4\x07\xde\x8e\x33\x5d\x4d\x95\xf7\x39\x6f\xfc\x47\x35\x2d\xcb\x8b\x3f\xca\x92\x7d\x1e\x44\xc9\xa5\x56\x27\x98\xc0\xa3\x0d\x81\x30\x19\x98\x81\xeb\x2b\xc3\x04\x57\x6d\x68\xe0\x6d\xf2\x1e\xd0\x77\xc9\x3b\x87\xd8\xb8\xbe\xc3\x27\x6f\x7e\xc9\xc5\xf6\x62\x14\xca\x24\x2f\xb3\x3e\x84\x85\x47\x33\xbe\xb7\xd7\x5c\x51\x32\x5d\x53\xe9\x92\xc2\x8c\x44\xff\xb3\xa6\x7e\xcf\x35\x45\x29\x9e\xfe\xff\xbc\xa8\x28\xd7\xd4\x6f\xb4\xaa\x42\xce\x4c\x5e\xa9\xfb\xd2\xc0\xda\x7f\x1d\xb1\xcd\x06\xfa\x63\x02\xb9\xe1\xe3\x99\x76\xe4\xe2\x39\x6c\x13\xde\x76\x9c\xc0\xed\x21\x58\x21\x09\x38\x50\xe0\xbe\xa0\x2e\x22\xc1\xbf\xf5\x6a\x2b\x07\x65\x09\x79\x78\x13\x37\x57\x76\x4d\x8a\x3d\xd4\x36\xca\xb6\x2e\xc0\x07\xf7\xd5\x87\x91\xc8\x97\x73\xa1\xcb\x42\xcb\x6c\xcf\x8b\x77\x7a\xb9\xcc\xeb\xda\x39\x56\x3a\x0a\xc1\x5f\x91\x3c\xd6\x06\x21\x3d\x06\x25\x7a\xde\x88\x3e\x39\x8c\x0f\xec\x7d\xd3\xfe\x55\x0b\x69\xc8\xd3\x0d\x5c\x8f\xbd\x67\x10\xb6\x41\x97\x10\xfa\x58\xee\x07\x1d\xc2\x1e\x38\x1b\xa0\x33\xba\x2c\x8c\xbd\x90\x83\x7b\x69\x25\x20\x89\x8b\x67\x1a\x26\x42\x93\xa7\xf5\x40\x47\xf8\x92\x00\x9c\x29\x08\x9c\xa2\xb0\x45\xeb\x3d\xc2\x4f\x3f\x93\x1d\x08\xb5\xee\x57\xdf\x53\x41\xb2\xaa\xab\x6d\x98\x07\xe4\x39\x98\xe5\x68\xa2\x28\x6b\xc7\x54\x01\x18\x3a\x47\x17\x9b\x6e\xa7\x85\xa2\xb0\x32\x57\x77\x4c\x1a\x8e\x33\x74\x30\x18\x63\xa7\x92\x5c\x39\xcd\x2b\x47\x24\x3d\x91\x08\x38\xcb\x11\xef\xd5\xed\x85\x3b\x2f\x76\x0d\x12\x51\xec\x91\x83\x02\x73\xdb\x3e\x64\x54\x9d\x55\x4a\xfd\x43\xf5\xff\xf9\xe0\x0b\xbb\xf6\xbc\xb4\x62\x65\x91\x86\x24\x22\x3e\x0e\xa8\x58\x22\x1a\x45\xa5\x13\x29\x09\x2a\x35\x24\xae\x51\x53\x08\xc3\x62\x24\x0b\x8d\x98\x40\x35\x78\xf0\x85\x97\x91\x46\x41\x5c\x1a\x3c\xf8\x22\x3d\x8a\x47\x8d\xc3\x99\x0a\x45\xbc\x75\xd4\x64\xb7\x83\x07\x5f\x44\x1c\x6b\x14\x33\xb0\x07\x1f\x19\x34\xd4\xf7\x76\x00\x65\xad\x58\xec\xa2\x9e\xf9\x54\xf2\xe2\x56\x95\x99\xae\xc4\xaa\x52\xb3\xfc\x83\x32\x74\x8c\xa2\x82\x10\x43\xc0\x4d\xbd\x2d\x58\x0e\x17\x59\x66\xb4\xd9\xec\x49\xd7\x75\xc0\x42\xa5\x57\x95\x5e\xed\x4c\x9f\xce\xce\x35\xe3\x4f\xc6\xf8\xa8\x59\xca\x1b\xf5\x0a\x1a\xf7\x42\xae\xfa\x9e\xec\x20\x10\x09\xd7\x5e\xdf\x89\x23\xf1\xcf\x8f\xb0\x57\xdc\x93\x77\xbe\x62\x8c\x4d\xfd\x9e\xa7\xff\x6e\x66\x82\xf3\xd5\x7b\x6f\xd5\xe4\x26\xaf\x7b\xe2\xeb\xd0\x33\x5b\xb7\xb7\xf1\xcf\x3d\x99\xb8\xe2\x0b\xfd\x8f\x66\xad\x25\x3e\xec\xa8\xb2\x34\xcd\x1a\x2f\xde\xec\xa8\x70\xd9\x2c\xaf\xa3\xe2\x69\xcf\xc2\xe9\xea\x88\x70\x21\xeb\x18\x64\x00\xf0\x27\xf2\xf3\x8c\x91\xa7\x51\x46\x5a\x5f\x2a\x59\x42\x01\xd1\x0f\x5f\xbc\x62\xb3\xf2\xc0\x5e\x2f\xf3\x25\x68\x3c\x55\x99\x8d\x92\xe9\xed\x1d\xbb\x97\xbd\x81\x08\x3f\xce\xcb\xac\xb7\x37\xe0\x75\xf3\x5a\x21\xfe\xc9\x3d\x29\x5c\xb8\xf2\x09\x1d\xc8\xf9\x70\x4f\x1a\x90\x1e\x09\xeb\x43\x74\x68\xde\xd5\x89\x2b\xff\x16\x10\x09\xfd\x2f\xe8\x06\x0f\x35\x3e\xe7\xc3\x8b\x51\x29\xb7\xca\x27\x6c\x86\xf0\x14\xc4\x86\xa7\x60\x5b\x1a\xe1\x4c\xf4\xf3\x99\x90\x2b\x80\x2c\x99\x14\x6a\x2f\x8c\xb8\x2b\x71\xee\x66\xde\xef\x05\xf7\x49\x92\x36\xbd\xd7\xf8\x8c\x6f\x7e\x5d\x06\x52\xb8\xed\xe3\xda\x27\x5a\xd7\xc6\x72\x23\xf0\x51\x04\xbd\x34\xcf\x35\x74\xdf\x34\x5b\x8e\xf4\xce\xc4\xf9\x43\x28\xe5\xd4\x54\x97\x25\xc4\x67\x88\x55\x21\xeb\x99\xae\x96\x06\xb4\x53\x2b\x59\xd5\xf9\x74\x5d\xd8\xe6\xda\xb7\x74\xf0\x80\x2f\xdc\x71\x99\x55\xf6\x2a\xfd\xaf\xc3\x0f\x83\x90\x98\x6e\x5d\xee\xfb\x51\x7c\xe4\x97\xc1\x23\x18\xde\x47\x61\x5a\x1f\x39\x7e\x97\x93\x0d\xc2\x31\x43\xcc\xf0\x40\x1e\xde\xd0\x0d\x12\xc1\x27\xeb\x9a\xe7\x22\x84\xe9\xc4\x5c\x34\x90\x6d\xb6\x26\x7c\x1b\xf7\x71\x97\x11\xac\x54\x2e\x0b\x1f\xf7\xe3\x4f\x5b\xea\x04\x94\x4a\x89\xb5\xa1\x6c\x2b\x65\x66\x4b\x96\xba\x66\xc2\xfb\x32\x44\xa8\x2c\xe5\x6a\xe8\x64\x55\xb6\xa2\x61\x61\xf4\x04\x64\xc1\x2d\x33\xbd\xf1\x32\x1d\x65\x31\x8e\xb7\xec\x90\x6f\xd6\xf0\xe3\xf0\x3e\x35\xfc\x16\xfd\xc4\x7a\xb0\x25\xe3\x3a\xce\x10\xfc\xc6\x4a\x32\x12\xec\x6b\xb7\x2a\x74\x8e\xed\xb0\x4f\xeb\x5d\xb4\x8d\xd9\xaf\xc3\x04\xfe\xfc\xb8\xae\xd5\x72\x05\xde\xff\xc1\x53\x86\xf2\x1c\x82\x71\x27\x61\x81\xf7\x39\x20\x3b\xce\x40\x7a\x1d\x9f\x81\x73\x55\xff\x95\xb7\x3c\x6c\xef\x7e\x72\x0a\x82\x37\x7a\x83\x07\xbc\xf3\xa5\xde\x27\xf7\xad\x9d\x65\x0f\xe3\x0c\x37\x0f\xe3\xd1\xeb\x26\x1a\x9d\x52\x5e\x1c\x5e\x39\x06\x29\x8e\x44\x27\xa5\x58\x75\xe8\x8f\x34\xd8\xeb\xae\x3e\x37\xcd\xfb\x87\x69\x06\x78\x5f\x15\xf2\xe4\x45\x84\xe0\x47\xc3\xc2\xbd\x73\x24\xc4\x51\xf8\x7c\x10\x25\xde\x27\x71\x53\x44\xa9\xd7\x8b\x34\x16\xdb\x15\xf2\xa3\x4a\x6e\x84\xc9\xe7\x10\x51\xef\x77\xa9\x43\x8f\x9a\xca\x35\xdc\x4f\x90\x87\x78\x7b\x97\x5b\x3c\xcf\xb5\xcf\x8d\x07\xd9\x56\x7b\x66\x3d\x59\x5a\xb1\x03\x6f\xf8\x98\x1f\xca\x2b\xba\xeb\x62\x4b\x29\x5b\x45\x9f\x54\x00\x8a\x80\x10\x56\x08\xad\x5f\x58\x61\x00\x35\xdf\xf5\x42\x96\x62\xec\x38\xf1\x78\x6f\x00\xa9\x5d\x41\x1d\x5f\xb3\xe7\x08\x34\x0c\xc0\xfb\xa0\x8a\x4f\x01\xb3\x88\x9d\x61\x4b\x30\x9b\x29\x71\xa4\x85\x82\x6c\xc4\x74\xaa\xf0\x7b\x4e\xc8\x45\x5d\xeb\xd5\xf1\x44\x57\x80\x0d\x6a\xff\x05\x08\x33\xfb\x90\x49\x00\xa3\x5d\xdb\xa0\xc7\x19\x55\x0f\x43\xe2\xa2\x47\x29\xc1\x8b\x20\x40\xdc\x8b\x6c\x1e\x04\x88\x98\x78\x78\x91\x7e\xe2\x0d\xca\x16\xf7\x22\x6f\x50\xb6\x88\x49\xe3\x43\x22\x7b\x52\xac\xab\x91\xe8\x4d\x20\x63\x36\x3e\x3a\x95\xe5\x54\x01\x74\x2a\xfc\xc1\x1e\xbf\x2a\xe4\x16\x9f\xaf\x0a\xb9\x4d\x5e\x5c\xa1\xb1\x27\xbc\x27\xeb\x8f\x2f\x46\x89\xc1\x5d\xfa\x69\xf7\xb8\xc8\xa7\x37\xf6\x29\xe6\xe6\x76\x0f\xb5\x81\xa2\xf6\x5f\xff\xd0\xde\xec\xbd\xc8\x33\xa2\xd8\x46\xcf\x68\x5b\x8a\xd1\x50\xf1\x82\x51\xe7\x59\x51\xbc\x97\xc6\x65\x31\x53\x59\x28\x5c\xd6\xea\x43\xfd\x42\x95\x6b\x28\x06\xbf\x96\xaa\x5c\x87\x02\x2b\x18\x1d\xbd\x0a\x43\xb3\x86\xcf\xaf\xfd\x17\xcf\xf4\x7a\x52\x28\xd7\xe7\x6c\x52\x44\xdd\x3e\xab\xe4\xdc\x3e\xae\xe4\x9c\x3f\xc2\xde\xda\xa7\xac\x9b\xf8\x02\xb0\x02\xe9\x95\x03\x04\x74\x2f\x3f\xe4\xb5\x7b\xf7\x21\xaf\xf9\x2b\x82\xfd\x83\x77\x85\xc7\xf6\xa3\x97\x97\xb7\x9e\xa6\xbe\x8d\x49\xba\xf1\xb4\xef\xa2\x81\x3c\xab\xf4\x0a\x9e\xeb\x95\x7f\x44\xd0\x95\x7e\xda\x33\x7a\x10\x4f\xff\xf9\x72\x55\xe7\x90\xe3\x5d\xe1\x5f\xfe\x45\x39\xad\xb6\xab\x1a\x5f\xb9\xbf\xc3\xcb\x8c\x5e\x64\xec\x61\x55\x69\xdb\x72\x70\xdc\x75\x0f\x21\x37\xe0\x48\xf4\x66\x98\xee\x1d\x1f\x02\xe4\xf6\xc8\x25\x0f\xa2\x87\x94\x63\x6c\x24\x7a\x94\xce\x8a\xbd\x78\x55\x29\x63\xf0\x0d\x24\xcb\x62\xaf\x7e\x5e\xe1\xf3\xb5\xef\xf9\x4f\x5a\x66\x2a\x3b\x93\x80\x35\x5c\xc0\x8f\x4c\xd6\x92\xbf\xa6\x17\x71\x8d\x17\xaa\x96\x19\xaf\xb5\xa4\x07\xbc\x98\x9b\x02\x5b\x22\x9a\x02\x00\x5e\xa2\x0e\x00\x3e\x12\xef\x02\xbc\x7c\xa1\x61\xd2\xe1\xa5\x95\xec\xa2\x97\x97\x30\x20\x0e\x4f\x30\x7e\x85\x0b\xc2\x63\x07\x46\x2f\xa1\xfb\xf0\x2a\x0c\xc0\x2b\x69\x60\x2b\x41\x76\xad\xf0\x70\x6d\xf0\xe1\x3a\x6c\x69\x62\x28\x9c\x9b\xd8\x47\x79\x39\xa7\xa7\x79\xe9\x77\xc2\xab\x4a\xcf\x69\x1a\x56\xf4\xa7\x7b\xf5\xda\x27\x56\x18\x89\x5e\x25\x6b\x15\xaf\xb1\x37\xd3\x4a\x17\x96\xa1\x19\xf8\xc3\x3f\x56\xea\x06\x56\x91\x81\x3f\xf8\x63\x6c\x80\xc1\xbf\xc2\x8b\x28\x99\xdd\xc8\x25\x6f\x6f\xac\xe9\x37\x35\x40\x0a\xd9\x02\xf8\x97\x7f\xb1\x36\x2b\xb8\xd9\xf5\x0c\xfe\xe5\x5e\xf8\x7c\x21\x23\xd1\xab\xdd\xdf\xfe\x65\xbe\x54\x9e\x3d\xd5\xf9\x52\xc5\x7c\xe9\x4a\xcf\xe7\x05\xbc\x82\x3f\xc2\xe3\xf5\x74\xe1\x59\x79\x6d\x7f\xc5\xfc\x1c\x0a\x20\x6b\x81\xb7\xbc\x39\xf6\x37\x2d\x17\x78\xc7\x97\x0b\xbc\x74\xcb\x10\xde\x46\xeb\x30\xba\x97\xee\x3e\xa6\x22\x39\x99\x4e\xa9\xf8\x19\xd1\xfc\xab\x2e\xd6\xcb\x30\xc3\xb7\xf0\x33\x1e\xf3\xb7\x32\xaf\x71\xd6\x36\xf8\x97\x7f\xb1\x50\x30\x02\x1b\xfb\x6f\xcf\x83\x91\xb6\xda\x63\x82\xd8\x10\x84\x89\x51\x2a\x5b\x00\x89\x46\x3a\x6f\xc8\xcb\x1d\xe5\xf4\x36\x28\x0b\xb6\x24\xf5\x36\x77\x67\xf5\x76\x79\xe2\xea\x4a\xc9\xa5\x11\x12\xee\x7c\x59\xc3\x3e\xd5\x92\xc6\x02\x73\xb3\xf9\xac\x10\x18\xfe\x85\x9e\x75\x1a\x50\xa6\xd6\x65\x5e\x03\x76\x3b\xde\x8e\x09\x98\x0c\xa8\x8c\x9d\x77\xbd\x53\xfb\x75\xe4\xa6\xf5\x06\xe3\x5f\x07\x09\xea\x61\x70\xed\xc0\x47\xb0\xa3\x9f\x4f\xd8\x8e\xec\xae\x39\xf1\xfe\x8f\xd1\xac\x8a\xa3\xf6\x05\x11\x99\xfa\x4d\x50\x58\xbc\x59\x2f\x97\xb2\x02\xb7\x13\x1c\x3e\x5e\xfb\x7c\x99\xd7\xb5\xaa\xc6\xdc\xaf\xc4\x2e\x4d\x12\xba\xc5\xbe\xb8\xf2\xd3\x68\x2f\x90\x73\x49\x06\x70\x8f\xf2\x0c\x12\x35\xc0\xdc\x96\x2d\xa0\xcb\x14\xa0\x42\x06\xb7\xa5\xdc\x62\xd4\x3e\xe6\xd9\x20\xe5\xfc\x52\xc2\x1f\x95\x92\xa8\xe2\xc9\x9d\xa3\xa9\x59\x59\x71\x7e\x92\x17\x76\x11\xe8\x19\x11\x69\xd5\x8e\x0f\x7c\xa6\xcc\x90\x30\x04\xd3\x3e\x96\xe8\xba\x03\x66\x18\xc2\x2e\x23\x42\x76\xd9\xcd\x41\x8b\xe7\x72\xa5\xae\xab\xa9\x0f\xa9\xa1\x56\x40\x73\x37\xba\xba\xf9\xff\xb1\xf7\xae\xfd\x6d\xe4\xc6\x9e\xf0\x7b\x7f\x0a\xd8\x67\xc6\xa4\xc6\x14\xe9\xcb\xe4\x26\x45\xf1\xf1\x48\xf2\x89\x36\x96\xe5\xb5\xe4\xe3\xcd\x3a\x5e\x1b\x62\x83\x62\x47\xcd\x06\xa7\xd1\x94\xcc\xc4\x7e\x3e\xfb\xf3\x43\x5d\x70\x6b\x90\xa2\x3c\x33\xd9\xec\xc9\x99\x17\x63\xb1\x1b\x8d\x6b\xa1\x50\x55\xa8\xfa\x57\x88\xaf\x1b\xf6\x9c\x2a\xc3\xfe\x0f\xfd\xbc\xbd\x55\x3e\x0b\x18\x74\xa5\x50\xdb\x1d\x8d\x01\xa1\xec\x00\x05\x63\xe2\xd1\xf1\xc5\x8f\x8b\xb2\xb9\xec\x4e\xdd\x39\x28\x17\x8a\x5b\xb7\xbd\x82\x0b\x99\xa4\xe5\xe7\x3e\xdf\xae\x51\xbc\x2a\xd4\x60\x9f\xa3\xee\xc3\x4c\x08\x7e\xa7\x02\x52\x17\xad\x2c\x0f\x0c\x4c\x5d\xed\x56\x6e\xff\xba\x59\xaf\x05\xa8\x7d\x60\xe7\x91\xe6\xd2\xed\x68\xb4\xe3\x2c\x21\x6f\x2f\xd7\xa7\x1d\xe2\xb0\xac\x97\x1e\x85\xdf\xe7\x81\x77\x94\x37\x55\x19\x8e\x51\x62\xe6\xdf\x9a\x79\x12\x86\x46\xb9\x2b\x70\x59\xd7\xba\x95\xad\xbb\xb4\x42\xf0\x1d\x68\xf9\x9e\xe3\x14\xe6\xde\x00\xb2\xfe\xfe\x08\xd9\x62\xec\xce\xf0\x69\xc6\x21\xe5\xec\x01\x59\xaf\x3c\x48\x33\xfe\x76\x40\xe2\xeb\xba\x08\xbd\xf3\x6d\x05\x26\x31\xfe\xd2\x4a\x29\x57\xa5\xba\xb6\x2d\xe3\x2d\x1d\xc7\x12\x13\x25\x2e\x4d\xab\x66\xbc\x09\x1f\x6c\x07\xff\x3d\xb0\x23\x81\x7b\xe9\xcf\xf6\xaf\x83\x93\x63\xd0\xe0\x3f\xbb\xc7\x2b\x4a\x0b\x5f\x8c\xfe\x0b\x1e\x5f\xa5\x8f\x57\x36\xe9\xf9\x6f\xd0\xe4\x67\x21\xdc\x2d\xd5\xfa\x9e\x74\x6f\xdd\xe9\xbf\xb0\xec\x83\x15\xfd\x5d\xf5\xc9\x83\xcf\x41\x1a\x9c\xcf\x9b\x7d\xec\xdf\x7d\x26\x6c\x6f\xf8\xdb\x77\xfb\xf3\x9a\x6e\x5f\xad\xee\xf6\xe7\xb0\xf6\xcf\xee\xe3\x68\x2a\xa8\xd6\x75\x53\x10\x56\x16\x3e\x1f\x6e\x6f\x6f\xff\xe1\x73\x4c\x70\x9f\x73\x95\xc1\x43\x5c\x27\x1a\xd6\xe7\xce\xeb\x61\x3a\x49\xee\xe7\x83\xb8\xaf\x9f\xc5\xab\x46\xcf\xe5\x85\x6c\x75\x63\x3e\xaf\x20\x84\x95\x95\x7d\xe6\x7c\x44\xf8\xe4\x73\x38\x4c\xee\x19\x1d\x43\x6b\x7b\xf6\x7b\x58\xea\x70\xb5\x84\xf8\xac\x31\xc6\x13\x1e\xfe\xf4\x61\x8a\x45\x6b\x0f\x9b\x52\x99\x70\xce\xba\x0b\x90\xab\x6c\xc3\xd5\xbc\x91\x34\x36\x23\x41\xf1\x7f\x72\x0d\x6d\xb8\x73\xfc\xcb\xcf\xa0\x95\x8f\x40\xc7\x0e\x76\xce\x83\x75\x1f\x3f\x70\xdb\x2e\xbf\x73\x42\x22\xbf\xc5\x86\xff\xcc\xb7\x39\x20\x60\x7c\x76\xbc\x25\xaa\xf3\x73\xc4\xfc\xa2\xf1\xac\x7b\x9c\xe9\x58\xd6\x05\xc8\x3d\x46\xa6\xbc\x6f\x65\x06\x9a\x03\xbc\x42\xae\xc4\xab\x45\x33\xd7\x86\x1d\x9d\x68\x06\x4e\x81\x5f\xfb\xd4\x3f\x74\x7d\x85\x4c\xb1\xac\x2f\xce\x34\x5d\x22\x21\x6c\xb6\x1c\x83\x1f\x04\x1f\x39\xfb\xe0\x65\xd2\xa0\x8f\xb5\xb3\x99\x6a\xa1\x6a\x00\x72\xad\xc1\x5d\x63\x52\x95\xe3\x96\x7c\x77\x89\xe8\x75\xab\xea\xb6\x94\x15\xf5\x96\x7d\xa6\x0d\xa7\xe0\x9e\xcb\x0b\x15\x19\x1d\xb9\xc1\xa3\x83\x3f\xa9\xa5\xd8\x13\x3d\x04\x42\x0d\x9e\xf7\xc4\x03\xd1\x87\xec\xaa\xc7\xb2\x9d\x0e\x1b\x59\x17\x7a\xd6\xdf\xda\x1a\x9a\xaa\x1c\xab\xfe\xe3\xad\x04\x4e\xd4\x8d\xf0\xb9\x76\xb8\xe7\x7d\xf0\x0e\x79\xe6\x23\x4e\x20\x39\xee\x6f\x07\x80\xe8\x6f\x5f\x00\xd0\x3a\x45\x12\xd3\xcd\x11\xc8\x47\x5a\x01\x28\x22\x68\x01\x1f\x63\x5b\xf6\xc7\x3b\xe4\x92\x82\x61\x24\xee\x56\x87\x3c\x22\xe6\x8d\x6e\x35\xe0\x85\xc6\x9f\x61\x56\x0d\x6a\x76\xd0\x9d\x03\x77\x37\x42\x45\xde\x75\x4a\xbc\x07\x78\xf2\xfc\x82\x3d\x78\x40\xce\xc2\x9d\xd5\x7e\xb7\xba\xbe\xf7\x44\x09\x91\x7f\xd7\xed\x6a\x08\x95\xae\xb7\x2a\x0c\x94\x41\x8b\xb7\x15\xde\x16\x2c\x13\x39\x6a\x70\x29\xe5\x1d\x8e\x3e\xc5\x42\x59\xd9\xf8\x93\xb8\xfa\xed\xf0\xe1\x23\x04\x30\x75\x28\x2d\x18\x6f\xbe\x25\xd4\xa7\x69\x79\x5e\xb6\xe0\x07\xd1\x00\xe2\xe9\xb9\x9a\xca\xab\x52\x37\x10\xe4\x04\xd8\xcc\x0c\x06\xf3\x51\xd7\xce\x68\xf3\xd1\x5d\xda\xb5\x78\x37\xc9\xd6\xf6\xd6\x45\xeb\x87\x3d\xb3\xf5\x90\x4f\xdb\x10\x24\x2b\xb3\x9c\xcd\x5b\x3d\x33\xe2\x5a\x35\x8c\x9b\x39\x11\x4b\xc0\x54\xc7\x0c\x06\x58\x09\xa5\xa7\xd0\x57\xaa\xf1\x08\x76\x60\xa7\x27\x8f\x71\x17\x69\x85\x50\x89\x20\x6f\x23\x14\x09\x44\x6b\xa9\x4f\xd2\xca\x0f\x3c\x53\xe7\x72\x7c\x79\xd1\xe8\x45\x5d\x6c\xb1\x36\xea\x25\x64\x2f\x28\xda\x2f\xe3\xd1\x5e\x83\xe5\xdf\xc1\x34\x07\x09\x34\xb0\xdb\xb6\x26\x4c\x5c\x42\x7e\x54\x1f\x83\x8f\xf3\xcb\x94\x80\x80\xea\x89\x18\xeb\x45\x83\x59\x10\x21\xa5\x3d\x04\x47\x05\xf5\x18\x87\x9e\xad\xeb\x0b\x64\x17\xe5\xc9\x29\x69\x14\x03\xf1\xd7\x85\x69\x31\x63\x64\xa3\x4c\xdb\x94\xe3\x96\xa6\x2a\x37\x42\x02\x42\x48\xba\x04\x2a\xd1\xc0\xae\x69\xa5\xa4\x71\x29\xf3\xb1\x4f\xb6\x0f\x78\xb9\xce\x77\x3e\xde\xb1\xcc\x13\x96\xed\x73\x2c\x11\xa7\x59\xa4\xb0\xbf\x33\x5d\x28\xc8\x26\x75\x5e\xe9\x8b\x91\x6c\xc6\xd3\xf2\x4a\x99\xd1\xe3\x87\x8f\x1e\x8e\x1e\xfe\x6e\x04\xf6\xe8\x0f\x50\xd1\x87\x42\x55\xc3\x69\x3b\xab\xa8\xbe\x67\x95\xd1\x03\xf1\x11\x6c\x9d\x1f\x47\x1f\xd9\x16\x8a\x7f\x16\xfa\xba\xfe\xc8\xe9\x4f\xe8\x96\x88\xc6\xca\xb9\x26\x30\x9f\xf7\x39\x66\xc2\x04\x15\xc6\x97\x73\x57\xf6\x2b\xae\x35\xd3\xdc\x34\x02\xfe\x17\x28\x19\xe4\x1a\xfb\x51\xd7\x60\x5c\xff\x98\x77\x8e\x1d\x23\x20\x2f\xb3\x55\xf4\xbc\x12\xfc\x93\x34\x2f\x7d\x5d\x13\x48\x01\x07\x47\xc4\x36\x10\x6c\xf2\x4c\xf7\xd3\x4e\x0d\xf2\xf5\x7b\x63\x07\x31\x20\xb1\x97\x2f\xc8\x9e\x9a\xa5\x71\x5c\x0b\x3d\xfc\xd6\x1e\x09\xfc\x55\x98\x98\x07\x38\x6c\xdc\xb9\x83\xe0\xf5\xbb\xf4\xe5\xfb\x95\xb1\x15\x61\xad\xb9\x90\x8a\xa8\x65\x7b\x00\x86\x1f\xb8\x68\x0a\xbc\x51\x0f\xc6\x95\xde\xab\xfa\x2a\xe0\x62\x35\x28\xf9\xce\xbf\x7a\x9f\xe4\x4e\x0e\xdb\xa5\x7c\x1b\x60\xed\xeb\xa5\x20\x3f\x25\x5a\xd9\x5c\x7e\xe5\x3e\x59\x03\xb7\x62\xcc\x96\x8e\x4b\xbb\xaf\x71\xc0\x06\xc4\x81\x08\xe7\x1d\xff\x8b\x52\x3f\xa7\x2d\x01\x1b\xf9\x8a\xe6\x82\xef\xd6\xb4\x99\x40\xa2\xf1\xc9\x43\xa1\xc5\x9a\x3c\xd6\x15\x20\x89\x10\x68\x16\xf1\x79\xb4\x85\x07\xc9\x7f\x7c\x2d\x37\x30\x8e\x42\xcf\x46\xc8\x69\x46\xad\x32\xad\x19\x61\x55\xc4\x2a\x36\x1c\xde\xc1\xc9\x31\xdc\x1f\x9c\x92\x49\x3e\x37\xc4\x3b\x9d\xe9\xcd\xac\x38\x55\x10\x4e\x6d\xd7\x8d\x3c\x28\x38\xf0\xd7\x00\x9d\x36\xd7\xb7\x04\x57\x49\x3d\x48\x29\xd3\x7d\x99\xe4\x30\x5e\xd5\x09\xac\x63\xe0\xee\xa3\x32\xc3\xce\x7f\x08\xf5\x0f\xf8\xa2\x36\xf8\x2c\x44\x60\x8a\x92\x15\xd8\x92\x70\x44\x40\x53\x64\x05\x09\x6c\x32\x0d\x19\xe2\x30\x28\x00\x7c\x90\xc6\xca\x6f\x9b\x60\xaf\x52\xf3\x1d\x10\xa3\xa4\x0c\x8c\x2d\x29\xb4\x7e\x46\xf1\x7a\x62\x83\xed\xca\x37\x17\x50\x77\x66\x1b\x75\xe7\x6b\x9f\xbf\xf0\xdf\xae\xa6\xb0\xce\x50\xf0\xeb\xdb\x8d\x05\xae\xaa\x37\x18\x0a\x5e\x69\xdf\x62\x24\xf4\x81\xfb\xf2\x36\xe3\xb0\x9f\xac\x1e\x46\x64\xdd\x5e\xc3\x92\x53\xba\x8e\xb6\xb5\x2f\x17\xc7\x42\x98\x90\x73\x67\xf6\x1a\x53\xee\x0a\x5e\x9f\xc1\x10\x8e\xc3\xc5\x02\xc9\xfe\x59\x55\x85\xc7\x5b\xe6\x60\x8e\xf4\xa7\xff\x6b\x67\xec\xff\x5b\x47\x6c\x8a\xbf\xec\x51\xdd\x39\xc3\x44\x43\xc9\x3d\xd8\x25\xbc\xbc\x52\x35\x46\xf3\x5a\xa5\x84\x4b\x39\xe4\x94\x4a\xc9\x09\xbe\x62\xc8\x02\xc0\x12\x69\x54\x9d\x8a\x7d\x07\x27\xc7\xe4\xb5\xf9\xf9\xe0\xe4\xf8\x4c\x7d\x82\xb4\x4a\x5f\xe0\xe3\x28\x68\x69\x45\xc1\x8e\x9f\xdb\x0b\x25\x27\x18\xdd\xa2\x0b\x12\xc8\x02\x70\x7b\x07\x93\x02\xfd\x8c\xb0\xed\x42\x1c\x0f\xff\x36\xd1\x35\x11\x2a\x25\x98\x08\xca\x8b\x5f\xab\x4f\xad\x20\xf4\x0f\x56\x97\xa4\x17\x2b\x49\xad\x00\x2d\x04\x40\x84\x17\x73\x56\x8e\x0e\x4e\x8e\xd1\x17\xd6\x56\xdd\x33\x5c\x09\xdd\xe7\x81\x0b\xaf\xfa\x34\x95\x0b\x83\xe8\x5f\x5f\x37\x79\x4f\x37\x9d\xbd\x53\x6c\x7d\xf5\x04\x76\x60\x6d\xec\xc8\x4f\x53\xfc\x96\x60\xb6\xc2\x02\x29\xc6\x0a\x4f\x37\x62\xfb\x30\x0c\xfc\x97\x64\x7e\x49\x71\x2a\x94\x19\x37\xe5\x39\x07\x17\xd8\x0f\x0d\x23\x51\xe2\x3c\x8b\xf1\x54\x36\x72\x0c\x58\x99\xb2\x15\x7a\x32\x41\x2c\xca\x8d\xe6\x0c\x21\x9c\x7d\x39\x0c\x68\xfa\x42\xb5\x64\xe3\xe7\x3a\xb3\x07\x19\xc1\x74\xb3\xcf\xdd\x38\x81\x6f\xfb\x98\x68\x00\x2b\xea\xe4\xca\x08\x49\xd6\x85\x44\xf3\x7b\xb8\x7c\x67\xf8\x00\x7e\x78\x58\x17\x64\xed\xba\x61\x65\x74\xa1\x5c\x8a\xba\xb3\xc3\xff\x75\xf6\xe1\xe5\xc9\xc1\x61\x8c\x06\x84\x75\xf9\xa6\x1e\x10\x88\x90\xfa\xd4\x52\x4a\x13\xe6\x53\x77\x02\x71\xdc\x97\xff\xfd\x1e\x8d\x8b\x37\x96\xad\xf0\x0f\x7b\xd1\x60\x23\x92\x08\x4f\x41\x5b\x7e\x07\xfe\x3f\x08\x9e\xe2\xa7\x3b\x5c\xef\xb6\xef\x9d\x3f\x05\x3b\x47\x4b\x38\x59\xd4\x8d\x08\xb1\x36\x33\xd9\x39\x6a\xdf\x4a\xe9\xaf\x4b\x35\x5f\x84\x5e\xb4\x18\x45\xbf\x19\x51\x20\x11\x98\xbe\xfb\x2c\xc8\xb7\xcd\x5e\x25\x2e\x1b\xe1\xd0\xf6\xca\x3d\xbd\x7f\x3f\xf7\x98\xe2\x2f\xe0\x18\xf0\x35\x7c\xfe\xec\xab\x1b\x82\x9d\x09\x0c\x6d\xb0\xf8\x0f\xd7\xe1\x63\x11\x4a\xc1\x54\x37\x94\xed\xce\x57\xe3\x1f\xef\x46\x05\x71\x48\x99\xa2\xf8\x82\x0b\x83\x38\x6a\xbf\xfe\x06\xfc\x34\x7d\x61\xf7\x22\x2a\x99\xa9\x35\x78\xce\x7e\xfc\x47\x35\xeb\x3e\x83\xb0\xdb\x4e\xfc\x7d\x89\x68\x0c\xb5\x38\x57\xe2\x9e\xac\x75\xbd\xb4\x5a\x90\x28\xca\x2b\x73\x6f\x20\xc0\x74\xe0\xfc\xef\x17\xf3\x11\x20\x81\x51\x52\x69\xc2\x46\xfc\x3d\x38\x8b\x81\x0d\x66\xef\x1e\xb2\x81\x7b\x7f\x18\x8a\x67\x51\x5d\x6c\x00\x31\x4a\xcd\x1c\x56\x04\x26\x7c\x0f\x3c\xff\xad\xf0\x57\x5e\x5c\xa8\x06\xdc\x61\xc5\xbd\x57\xaa\x99\x95\xc6\x40\xc0\xa8\xaa\x4b\x55\x20\xf6\xe4\x3d\x38\x01\x6a\xf0\x32\x28\x5b\x73\x87\xc0\xc5\xa3\xf8\x01\xcc\x31\xa1\x0a\x34\xee\x81\x3c\x6f\xdb\x2e\xeb\x8b\x6a\xe9\x11\xeb\x01\x32\x5a\x0b\x09\x18\x00\x50\x37\x58\xa8\x00\xc8\xc2\xe5\x7e\x33\x46\x48\x1f\x8e\x85\x50\xe8\xcb\x79\x39\x86\x00\xbc\x6b\xdd\x5c\x1a\x0a\x9f\xac\xb7\xe3\x09\xa4\x00\xc7\xd1\x88\xad\x67\xf5\x92\xc0\x33\xd1\x34\x28\xc9\xea\x09\x18\x8e\xb2\x29\x0d\x22\x62\xe0\x27\x56\xcd\x34\x3b\xa3\xd1\xf9\xe2\xe2\x6f\x65\x55\xc9\xe1\x4c\xe3\xbf\x56\xd3\x34\x53\x7d\xfd\xe1\x7c\x71\x31\x1c\x5f\x94\x4f\xcb\x62\xef\xf1\xc3\xdf\x7e\xff\xf8\x37\x71\xac\xe2\x77\x09\x0e\x16\xa2\x5f\x2d\x8c\x2a\xb6\xd5\x27\x30\x50\x95\x76\x11\xbf\x1b\x31\x08\x05\xd1\x86\x63\x84\xc8\x11\x42\xaa\x4c\x5e\xf9\x26\x30\x02\x70\x5d\x0b\x5f\x68\x0e\xfa\x9d\x64\xf6\xe1\xe6\xa2\x67\x98\xf0\x5c\x35\x35\x31\x83\xe7\x8d\x9e\xbd\x82\x7c\x00\x9e\x2d\x84\xe4\x3c\x88\x36\xda\x20\xea\xf3\x20\xdc\x2d\x91\x0f\xd1\x6b\x1f\x03\x20\x9b\x76\x20\x54\x5d\x7c\x21\x27\xa1\x8f\xf0\xe8\xa3\x03\xe5\xe4\x13\x6a\x34\xd6\x85\x42\x63\x6e\x59\x17\xea\x13\x39\x8a\xf4\x57\x75\x65\xcb\xdb\x82\x95\x08\x4e\x09\xf0\x8f\x71\x43\xf9\x38\x40\x4a\xf9\x4e\x7c\x54\x75\xe1\x5a\xe5\x16\x44\xdf\x8d\x27\x1e\x0c\x9f\xd5\xaf\x03\x8c\x2e\xb2\xfe\x02\x58\x98\x28\x6b\x71\x21\x9b\x73\x79\x61\x2b\xb3\x9b\x14\x53\xf8\x31\xe2\xab\x4b\x7b\xfb\xd7\x85\x69\xc5\xb8\x91\x66\xca\x55\x1e\x7e\xa2\xbc\x7b\xb0\x73\xc0\xea\xaa\x4c\x4b\x01\xfe\x31\xc3\xfe\x85\x56\xca\x71\xfd\x18\x14\x88\xd2\x6b\xc0\xc9\xb5\xfd\x88\x9f\x28\x38\x97\xfd\x6f\x98\xba\xb7\x30\xf5\xcf\xa0\xbd\xf0\xf3\xe0\x25\x6b\xe6\x91\xc0\x20\xf6\xfc\x99\xc5\xcf\xbd\xc8\xe5\x22\x8f\xef\x08\x2c\xb6\xb3\x2a\x53\x04\x08\xb9\x41\xe9\x2c\xde\x61\x82\x0a\x18\xb0\xe8\xfb\xf7\x99\xae\x98\xd3\xdb\xa3\xc9\x21\x20\xae\x10\x57\x42\x19\x82\xe7\x89\x66\xf0\x81\x48\x4f\x1d\x91\x80\x58\xbb\x6e\x44\x47\x91\xed\x48\x74\xe2\xdc\xb6\x1f\xb8\x3a\xae\x17\xd1\x29\x95\xea\xbc\x9b\x4a\x63\xc2\xd5\xb7\xe7\xfb\xf1\x9f\xb2\x5a\x28\x27\x81\x65\xaa\xee\xf3\x9a\xa4\x3a\xcd\x1e\x85\xed\x87\x0d\x44\xa0\xd2\x41\xd6\x02\xca\xfa\x8b\xf0\x15\xb6\xa6\x8f\x90\xde\xb3\x35\xa4\xcd\x21\xc0\xe4\x47\xdb\xd4\x47\x36\x20\xc6\xf4\x93\x01\x90\x54\x9f\xe2\xdc\xbf\x37\x93\x4a\x22\x20\xb9\xee\x1d\x45\xac\x05\x90\x81\x59\x9b\xa4\x44\x71\x70\x63\x03\x60\xcf\x10\xae\xae\xc6\xba\x2e\x44\x5b\xce\x94\xb8\x2a\x4d\x89\x97\x34\xbe\xbe\xd2\xa5\x89\x9b\xc2\x3d\x5a\xa6\x36\x8c\xb6\x0b\xf4\x59\xad\xe7\x03\xe7\x66\x14\x64\x69\x80\x0a\xaf\x64\x55\x16\x81\x30\x67\xbb\xb3\x4a\x32\x81\x34\x26\xea\xc7\x85\xac\xf0\xd2\xa4\x34\xa4\xad\xf9\xea\xec\x07\x50\x0c\x25\x60\x23\x1e\x42\xa8\x22\xa9\x3a\xd2\x28\xcb\xf1\x7c\x56\x3b\x74\xd4\x2c\x30\xa6\x6d\x18\x2f\x36\xce\x69\x6e\x67\x84\xeb\xd7\xd9\xa6\x0f\x1e\x64\xf8\x8d\x2b\x75\xd2\x91\xed\xe3\x7d\xb9\x41\x73\xe9\x76\x8c\x1a\x24\x1e\xc6\xc5\xba\xcd\x85\xdb\x2f\xd7\x58\xb4\x29\x22\xfd\xf4\xee\xa6\xbb\x82\xa8\x38\x56\x4c\xb3\x74\x3f\x4c\xcb\xf8\xac\x35\xab\xf7\x55\x64\x2e\x08\x37\x56\xb2\x7b\xbe\xb0\xa0\x4f\x33\xbc\x67\xcf\x04\xcb\xa9\x60\x0a\xe0\x57\x0a\xbc\x98\xe4\x1f\x99\xcf\x55\x3d\x14\xfd\xb7\xf0\xd0\x03\x32\x82\x0f\x23\xac\xe6\x08\x8d\xc6\xa8\x4e\xdb\xa1\xf4\x1c\xc0\x06\xe6\xda\xad\x96\x9c\x4e\x0d\xdd\x22\x18\xb3\x13\x06\xbf\x75\x93\xe4\x83\x9d\xa3\x28\x69\x94\x4b\xee\xd0\x1a\xee\xd8\xff\x39\x50\x3f\x92\x61\x8e\x00\x91\x4d\x81\xf1\xa0\xde\x3e\x3a\x64\xaf\x4e\xc3\x89\x7c\xd8\x0d\x15\xb7\xc8\x84\xbc\x35\x61\xcf\x50\x62\x26\xc8\xb3\xcb\x9b\x31\xca\x4a\xbc\x23\x8e\x0e\x1f\x3d\x7c\xc0\x55\x20\xbb\xf0\xea\x16\x5f\x1a\x9f\x03\xf6\x2a\xb8\x54\xa0\x8c\xef\x1d\x5f\xe1\xde\x59\x7d\x6a\x41\xac\xc1\xbc\xc7\xec\xc6\x19\xe4\x10\x54\x57\x76\x96\xdd\x48\x8e\x0e\x07\xa2\x44\xa4\xb8\xd6\x89\xea\x94\x44\x19\x02\x1c\xe4\x6c\x26\x5b\x92\xbf\xc9\x57\x5b\xba\xe1\x04\xea\x90\x38\x9b\x2e\xcc\xc0\xa1\x7a\x1e\x1d\xda\x4a\xae\x54\x03\x62\x29\x4c\x10\xe5\xfe\x10\xba\x2a\xc4\xd1\x21\xe4\x3f\xf6\xfe\xdf\x7a\xd1\x64\x26\x66\x63\x63\x52\x72\xc3\x4a\xdc\x29\x16\x9f\x8c\xd7\x77\x41\xaf\xe7\x52\x01\xee\x4d\x46\xa3\x5d\x03\x81\x73\x83\x8a\xdc\x77\xe6\x12\x27\x55\x01\x46\xef\x85\x02\x14\x65\x92\x4e\x9f\x81\xd2\xa3\x9b\xfe\xd6\xfb\xe0\x30\x0d\x25\x2f\x70\xd8\x99\x95\x75\x9f\xfa\x3b\x24\x11\x9a\x60\x3b\x63\xb1\x8c\xcb\xf0\x26\x74\x09\x94\xc5\x53\xaa\x70\xa7\x5b\xa1\xaa\x8b\xa0\x3a\xd2\x65\x0f\xc5\xa3\x47\x02\x92\x43\x11\xa9\xb8\xe1\x22\x15\xb2\x57\x0f\xd3\x3c\x38\xb9\x02\xf5\x11\xf1\x0d\x19\x65\xb8\x9c\x67\x08\xc6\x70\x90\x38\xec\x1b\xe5\x60\x9e\x8c\xd5\x1a\x95\x00\x2b\xc1\xb0\x63\x4a\x18\x52\x0b\x10\xf6\x6a\x47\xf3\x07\x3b\xee\x50\x10\x6c\xd5\x6c\x2e\xf6\xec\xd3\xdd\x3b\x9e\x21\x43\xe1\xdd\x3b\xe1\x81\x60\x0b\xc6\xcb\x69\x5f\x1c\x4b\x70\xbd\xde\x5b\x63\x32\x43\xe2\x81\xd2\xe1\xe4\x6f\xfc\xa5\xed\xf0\x6e\xc4\x3c\xe9\xd3\xfb\xf7\x7d\x3d\xa1\xc5\x6c\xa5\xed\x04\xce\xa7\x9c\x49\x04\xde\x06\x55\x0f\xd9\xbe\x9c\x37\x8a\x74\x8a\x7b\xbb\x59\xc6\x30\x02\xa5\x5d\x47\x33\x55\xa7\xf2\xab\x2f\x9b\x9a\xde\xfc\xa6\x8a\xd0\x21\xc1\x13\xa9\x83\xa0\xf0\xda\x3e\x66\xcc\x59\xa4\x0f\xa3\x5a\xb0\xac\xf5\xd3\xb1\x0e\x32\xc3\xa1\x2f\x83\xd9\x04\xc7\x9a\x67\x55\x05\x35\x9b\x3e\xdf\x63\xfa\x43\x2d\xa2\xae\xf0\x53\x59\x14\xd8\x1d\xe8\x87\xbb\x4e\x4a\xe9\xb4\x1f\x4f\xd3\xa0\x3b\x15\x11\x6c\xba\x9b\x16\x1e\xdc\xe1\xe6\x55\xdc\xd8\xbb\xdc\xed\xd5\x51\xed\x2e\x99\xbc\x99\x96\x4e\x47\x32\x5c\xc3\x92\xf7\xdd\x52\xf0\x1f\x87\x0c\x51\x06\xdf\x85\xa7\xe4\xbf\x53\xf6\xf2\xf9\xc2\xb3\xc2\x1d\xe7\xc9\x68\x15\x63\xcf\x37\x31\xff\xfe\x50\xfc\x20\x0d\xc2\x4f\xb8\x2f\x86\x7f\x35\x03\x5b\x9b\xe5\x34\x00\x83\x5a\xfa\x3c\xfc\x8b\xb2\x05\x0b\x88\x3d\x6b\x1a\xe7\x64\x3f\x85\x64\xbd\x63\xbd\x00\x87\xaf\x09\x64\x47\x41\xe0\x8f\x3e\xb1\x2a\x5b\x1f\xe5\xe5\x62\xab\x1a\x48\xa9\x48\x6f\x9e\x33\x21\x92\x94\x2a\xd0\x7b\xe7\x28\xdb\x67\x68\x1c\x33\xaf\xa0\x77\x68\x98\xe2\xde\xc7\xe8\xc9\xb9\x3c\x27\xc7\x63\x40\x75\x8b\x4d\xec\x2f\x31\xdd\xbb\x7d\x01\x9b\xbf\x52\xb3\xa1\x7b\x9e\x3e\xe8\x02\xf8\x04\x37\x19\xfc\x45\xdf\x57\xbb\xb7\xc7\xa1\xa5\xae\x2a\x9f\xae\xbd\x55\x9f\xda\x1e\xab\x95\xbe\xbc\x7d\x2c\x1b\x25\xe1\x15\x7c\x42\x2e\x42\x87\x05\xcd\x39\x16\x6b\x16\xaa\x97\x80\xcc\x85\x27\xdf\x51\x3d\xd1\x0d\x86\x79\xf7\xfd\x88\x81\x2d\xa8\xc2\x52\x0e\x72\xc9\x67\x63\x88\x9b\x22\x60\x94\x70\x48\x7f\xf7\xd6\x30\xfc\x60\x27\xfc\x31\x88\xf7\xf1\x6b\x0c\xc8\x5b\x39\xef\xc1\x97\x5b\xe2\x69\xd4\xd1\x6f\x1e\xc5\x6f\x31\x55\x64\x2a\xf7\xfd\x7b\x03\xb0\xac\x2a\x20\xe7\x23\xb4\x89\x06\x7a\x95\x1f\x32\xb8\x40\x3a\x1f\xde\x6a\x29\x2a\x0d\x98\xd1\xdf\x09\xaa\x07\xb4\x3c\x0e\x45\x5a\x18\x35\x59\x54\x88\x29\x3f\xc7\x3c\xf5\xe0\xf2\x38\xa7\xc8\x7b\x8e\x57\x01\x21\x99\xc0\x50\x0a\x3d\xb3\xd5\x91\x5c\x5c\x17\x62\x5e\xc9\x31\x21\x12\x40\xfe\xf6\xb2\x1e\xd8\xc6\x16\x55\x8b\x19\xc5\xc9\xfb\x02\x31\xd4\x6c\x77\x12\xcb\x52\x3a\xc0\x3e\x64\x8f\xcc\xad\x67\x94\x22\xe3\xf9\x06\x2b\x8a\xe8\x18\xa5\x4e\x0a\xaf\x6c\x60\x18\x2c\x48\xf4\xfd\x69\xb4\xde\x6b\xab\x88\x49\xc3\xc1\x5b\xc7\x1d\xb6\xfa\x56\xa7\x63\x70\x25\x1d\x70\xc5\xb4\xc0\x56\x78\x2e\xaf\xa4\xb8\x95\x5f\x59\xaa\x6d\x93\x59\x0e\xca\x0d\x72\x23\xdd\x4a\x55\x37\xf8\x00\x8d\xf6\x35\x5f\x28\x60\x18\x2a\x9a\x18\xd0\xa5\x8a\xe1\x03\x82\xf8\x39\x2b\x0b\x9a\xb2\xa1\x74\x0c\x31\x06\xb4\xa1\x4c\x0a\xe9\x73\xd1\x9d\xa4\xdd\xd0\x66\x12\x94\xe3\x3f\x03\xad\x33\xb6\xa6\xb8\x02\x91\xbd\xe9\xf0\xc5\xe1\xf1\xe1\xcb\xae\xc9\x29\xc1\x71\x0e\x2f\xe7\xc8\x97\x78\xc7\x95\x09\xef\xe8\x2a\x35\x09\xde\x0c\x71\x3a\x5e\xa8\x49\x1b\x16\x6a\xf5\xbc\x53\xe6\x4c\xcf\xfd\x2d\xde\x56\xac\x75\xd3\xec\x3b\x19\xa8\xbb\xc4\xbb\x5c\xa2\xeb\x5a\xb1\x16\x0d\x9a\xcd\xa4\x13\x1d\x4c\xa1\x77\xa8\x10\xf0\x6a\xc8\xde\xd3\x7e\x34\x90\x06\x61\xa2\x87\x76\xb8\x6b\x8a\x9e\xe9\x39\x97\x6c\xf5\x3c\x91\x04\x98\xbf\x85\x2c\x71\x47\xfc\x87\x6a\xd9\x58\xc5\xdc\xed\x5c\x2f\xea\x02\x9c\x7e\x25\x33\x62\xc1\x67\xc5\x80\x4e\x75\xdd\xb0\x63\x76\x78\x5e\x80\x26\x6e\x5f\x6c\xff\x7b\x89\xa1\xe5\x2f\xb4\x06\x1f\x83\x5c\xed\x68\xe3\xb2\xe5\xf0\x13\x3e\x0e\x58\x47\xe7\x4f\x4e\xdd\x25\x42\xf0\xf0\xb0\x2e\x32\x4e\x03\x01\xab\x87\x8a\xf3\x37\x9c\x0e\x97\x1a\x29\xb5\x17\xb7\x04\xa0\x4b\xc1\xd7\x64\x41\x01\xad\x88\x23\x3b\xd1\x21\x9b\x66\xc2\x4d\xce\x30\x3e\xaa\x28\xb4\x3b\x30\x3b\xc0\x17\xc3\x64\x60\x77\x9c\x2d\xa9\x53\xe0\x90\x60\x3c\xbf\x04\xf8\x45\xae\x4b\x7c\xe1\xa1\x78\xf6\x75\xc3\xda\xf6\xea\x0e\x05\xd7\xc0\x38\xc4\xd4\x4c\x12\xdd\xe3\xfe\x9d\x3b\xfe\x90\xa6\xff\x61\x72\x56\x9a\x88\x96\x4e\xd7\xd3\x12\xf7\xca\x76\x14\xe7\xce\x59\x24\x95\x61\x9b\x06\xce\x40\x40\x43\x30\x39\xa7\xaa\xbd\x81\x84\xc2\x75\xc0\xaf\xd9\x68\x29\x08\x70\x13\xb0\x22\x21\x57\xa9\x6e\x66\x14\x86\x60\x68\xd8\x8a\x30\x93\x2f\x54\xfb\x5d\xc7\x8e\xe0\x59\x38\xb4\x94\x98\x12\x42\xe5\x3d\xd6\xd9\xfd\xc2\xc6\xaa\xba\x23\xbc\x8e\xda\xce\x04\x97\xa8\xb1\x5f\x36\xa6\xd4\x1c\x81\xc5\x0a\x71\x97\xc2\x42\xa3\x03\xd8\x06\xb0\xc8\x55\x60\xf1\xdf\xea\xd0\x9f\x49\xe8\xc8\x4f\x4a\x04\x81\x6a\x2e\xcb\x14\xc3\x82\x53\x59\xac\x47\xd7\xb3\x67\x73\x8f\xd5\x0f\xbb\xf9\x60\xac\x2e\x84\xe1\xfe\x7d\xd1\x51\x52\x6c\x29\xf1\xfb\x3d\xf1\xe8\x11\xe1\x2d\x80\xfb\x29\x22\x28\x3c\xa1\xbd\x88\xe3\xde\xa1\x41\xcc\xa7\x56\x13\x79\x9d\x38\xcd\x99\x1d\x9f\x7a\x00\x9d\x0e\x77\x44\x4f\xd7\x38\x8c\x1e\xaf\x2a\x79\x39\x87\xef\xc8\x8f\xb2\x87\x5b\x16\x0b\x86\x7e\x73\x3b\xe2\x5d\xe8\x56\x1b\xe3\xfb\xd0\x13\xe7\xac\xeb\xd1\x61\xfc\xaf\x37\x73\xfa\xdb\x01\xaf\x84\xbf\xdd\xdb\x64\xc2\x7b\xef\x71\x45\x68\x56\x64\x28\xb5\x81\x3b\x04\x5a\x4b\x3b\xef\x8e\x6a\x93\xbe\xaf\xa4\x09\x9c\x42\xc2\x37\x33\xee\x91\xcf\x95\x1b\x7a\x4e\x49\x8f\xef\xcd\xf2\x89\x14\x8b\xba\xfc\x71\xa1\x44\xa3\xe6\x8d\x32\xaa\xe6\xe4\x41\x93\x28\x5b\xa3\xd7\x73\xc9\x4a\x18\xe4\x23\x06\x12\xc5\x0b\x08\x08\x01\x51\x01\x70\x98\x90\x90\x6c\x99\xc4\x66\x1f\x94\x6f\x7c\x38\xc8\xb5\x16\x65\x61\xe5\xf6\xb1\xac\x42\x85\x50\x07\x60\xc3\xe4\x3a\x58\x55\x2e\xff\x8c\xfb\x02\x07\xb4\xc6\x7a\x99\x71\x7f\x5b\xe5\x9a\xe3\x59\x8c\xd7\xcc\x57\x6d\x78\x36\xc1\xac\x14\x48\xd1\x81\x28\xf6\x05\x48\x0e\x22\xcc\x11\xb6\xfa\x1c\x8a\xdf\xe7\x8e\x21\xdb\xbb\x35\x06\xd4\x8d\x2d\xa6\x9d\x1e\x7a\xbb\xd6\x4e\xd6\xda\x35\x88\xca\x9d\x90\x8f\x56\xde\xd4\xc5\x65\x9d\x24\xb7\x93\x33\x71\x45\xa5\xba\x15\x06\x8f\x83\x59\x08\x4e\xc1\x57\x56\x02\xf7\x83\xc5\x1c\xd5\x56\xc7\x83\xf8\x4e\xb0\xb7\xa3\xc4\xde\x71\x9b\x64\x0b\x76\x80\x29\x12\xbb\x72\x9d\x32\xac\x02\xbc\x4b\xe8\xc6\x12\x7b\xdb\x2c\xc6\x34\xa5\xe8\x1a\xbd\x09\x08\xca\x68\x24\x0e\x31\x28\xf5\x5a\x39\xb4\x16\xd1\x00\xae\xb8\x43\xa3\xc7\x3b\x46\x82\xf1\x5b\x58\xa1\x87\xc2\xf4\x8a\x46\x5e\x5c\x04\x69\xbf\xfc\xc8\xfb\x70\x1c\xcf\x08\x2f\x81\x10\x2b\x3e\xe2\x7b\x86\x26\xe1\x90\xc3\xad\xa1\x38\xaa\xc5\x1f\xcf\x8e\x5f\xfc\x6a\x40\x55\xdc\xa1\xb4\xea\x0d\xc4\xbe\x56\x4b\xa1\xeb\x40\x4e\x70\xd2\x43\x3b\x5d\x30\x22\x05\xa4\xf2\xa9\xb5\x93\x52\x39\x11\xc1\x35\x79\xfa\x60\x24\x1f\x63\x38\xb0\x81\xd9\xf3\xaa\xcf\x9f\xbb\xec\x90\x40\xe6\x33\xaf\xac\x0e\xd9\x55\x7b\x6f\xc8\xf8\x78\x02\x5e\x1e\x80\x9e\x6a\x95\x7e\x3f\x59\x60\xc1\xe2\x7b\x2d\x4f\x1f\x61\x42\xca\xd3\x58\x70\xf3\x3b\x27\xe9\x99\xcf\x45\x19\x33\xe8\xcf\x9f\xc5\x5d\x33\x05\xfb\xd6\xe1\x8f\x0b\x59\xf5\xa3\xd7\x83\x4e\x33\x6e\x2c\x29\x9f\x4f\x0b\x92\xfa\x03\x9b\x3c\xa2\x50\xb1\x27\x62\x92\xfd\xe6\x91\xdd\xf3\xaf\xb4\x86\xf4\x2c\xc1\x81\x4c\xdc\x65\x90\x3b\x73\x36\x40\xdc\x41\x21\x24\x6a\x8a\x0c\x5e\x0c\x91\xd5\xdb\xcd\x96\xe1\xec\x05\xc9\x14\x52\x8d\x72\x3c\x5e\xcc\x16\x95\x6c\xd5\xd9\xb5\x7e\x65\xc5\x83\x03\x07\x00\xd2\x8f\xab\xe2\x4e\xb0\xdc\x1c\xbd\x4c\xa5\x6a\x97\x06\x91\xc3\xc2\xed\x46\x41\xb8\x03\xba\x13\x33\xf6\x8c\xfc\xc8\xa2\x04\xef\x16\xd8\x80\x0e\x7f\xc6\x10\xf9\x50\xd0\x25\x58\x38\xf1\x94\x03\x91\x96\xa8\xdf\x9d\x48\x2e\x02\xc4\xbd\x11\xb2\x51\x3b\x20\x1d\xd3\xc6\xea\x5b\x4e\xf5\xb1\x34\x0e\x0c\x8c\x26\xe4\xe3\x16\x96\x8a\x24\xea\x54\xdd\x73\x07\x32\xa5\x0a\x84\x68\x5a\x2b\x45\x27\x08\x42\x80\xea\x31\xe3\x03\xde\xa1\xee\x4c\xb4\x25\x4c\x70\x53\x97\x4b\x43\xdd\x7a\x4e\xbb\xbf\xa3\x5a\x4e\x4a\x55\x15\x46\x48\x23\xae\x15\xa0\xd3\xe0\x08\xcc\x30\xfc\xce\xea\xe3\x63\x5d\x55\x72\x6e\xb9\x41\x24\x3a\xb8\x32\x98\xfe\x00\x19\x1a\xeb\x1a\x18\x5b\x1f\xb0\x51\x02\x04\x40\xa1\xd1\x93\xed\x4e\x24\x53\x0e\xec\x02\x47\x18\x52\x3b\x3e\x61\xc9\x4f\xc4\xa9\xa2\x10\x0c\x3d\x8e\x13\xe6\x61\x91\x21\x85\xb7\x82\x6b\x4d\x27\x33\xc7\xd3\xcc\x07\x4e\x70\xde\xc9\xbc\x8c\x0c\x34\x07\x27\xfb\x6f\x9c\x85\x26\x57\x57\xb6\x0a\x7d\x5d\x2b\x17\xc2\xb2\xeb\xdc\x00\x1a\x39\xbe\x74\x07\xa1\xac\xc2\xa0\x64\x04\xdb\xa6\xa8\x63\xb7\x19\xc0\x1f\xa6\xd6\xb5\xc2\xf7\x03\x04\x62\xe5\xfa\xec\xe9\xc3\xa0\x43\x0c\x4b\x05\x79\xce\x9e\xfc\xfa\xc9\xef\x86\xce\x52\x77\xd7\x4e\x9b\xe5\x7d\x6b\x03\x76\x02\x91\xde\xce\x73\x37\x08\x25\x4c\x14\xeb\x2f\x1c\x61\xbc\xe4\x75\x11\x24\xcd\x78\xea\x2e\x02\x1b\x3d\xe3\xfc\x26\xdf\x3c\x0a\x53\x8e\x88\x1d\x92\x82\x98\x7b\x5d\x97\xe0\xb6\x19\x25\x73\x71\x9d\x70\xd3\xe7\x94\xe2\x20\xec\xde\x9e\x1d\x70\xe6\x0d\x9d\x36\x62\x54\xa0\x3f\xec\x38\xd3\x16\x06\x84\xa5\xdb\xbb\xef\x87\x01\x10\x78\xfe\xe7\xba\x2b\x80\xc8\x65\xbe\xab\x46\xf8\x4a\x76\x57\x95\x73\x2a\x45\x9a\xdc\x11\xff\xcb\xab\x17\xce\x4a\x97\x77\x94\x71\x43\x07\xbd\xca\x8f\x7c\x95\x9e\xb3\xbe\x63\x71\x99\xf5\x1d\x8a\xba\x31\x1a\x89\x03\x90\x36\xe0\xac\xf7\x18\x50\x68\x39\x0d\x65\x28\x96\x9f\xe8\x56\x60\xe6\xe1\xa5\x7c\x55\x46\xcd\xa4\x55\x33\x0c\xab\x43\xc4\x52\x43\xfe\xdf\x59\x7b\xaf\x15\xfa\x59\x08\xf5\xb2\x38\x92\x32\x3f\x89\xa1\x46\xba\x93\x6d\xe0\xcd\x7c\x45\xf5\x41\xd0\x56\xb0\x8b\xbe\x46\x48\x0d\xe6\x74\x7f\xda\xe8\x19\xba\xae\x1d\x1d\xe2\xdc\xd6\xba\xde\x76\x39\x3f\x78\x92\x23\xd1\xaa\x74\x02\x37\x20\x61\x04\xd3\xaa\x67\xaa\x2d\x67\x10\xae\x83\x70\x0c\x53\x69\xea\x5e\x6b\x85\xd1\xc3\x1e\x07\xac\x92\x04\xba\x00\x8b\x91\x6e\x0a\xb6\xf7\x35\xca\xcc\x51\x4c\x15\x2e\xf6\xf5\x52\x61\x1a\x11\xdc\xa1\x1e\xaa\x03\x50\xda\x41\xc8\x22\x34\xe9\xd2\x8c\x6d\x7f\x4b\xb7\x6c\xa3\x91\xaf\x88\x63\xa8\x53\x2f\x8b\x04\xec\x13\x2a\x43\x64\x7d\x3f\x58\xd3\xca\x76\x61\x7c\x5d\x78\xbe\x01\x9a\x9a\xed\x9c\xaa\xdb\x66\x49\x38\x1c\xee\x1b\xca\xc0\x4b\x65\x09\x4a\x01\x5d\x97\x00\x61\xcf\xd7\x06\xc8\x0b\x03\xf6\x6e\xc6\xb6\x75\xed\x3f\xa1\xe3\x98\x8e\x74\xa0\x14\x3d\x11\x53\x5d\x01\xee\x36\x96\x89\x6a\x1b\xe0\xd4\xcf\x16\x55\x5b\xce\x2b\xe5\x6a\x0a\xf2\x02\x20\xee\xa4\x6d\x92\xb4\x00\x85\xdd\x10\xa5\x19\x06\xdc\xd1\xf9\x5b\x1a\x0d\x0e\x45\x72\x3e\x6f\xb4\x1d\xb6\x3d\x53\x8e\x0e\x1d\x08\xe2\x80\xa1\x2d\x44\xa3\xa4\xd1\x75\xec\x9f\xe8\x88\x3b\xb5\x9a\xc4\x3c\x74\x95\x21\x2b\x66\x8a\xd1\x9e\x8a\x3c\x5b\x27\xb2\xaa\x0c\x27\x27\x4d\x9b\x66\x43\x4f\x67\xc3\xa1\xcd\x67\xe7\xe7\xdb\x53\x5f\xee\xe4\x75\x95\x20\x31\x06\xe6\x49\x9b\xc8\x31\x81\x23\xe5\x60\x3d\xae\x9f\x40\xac\xc4\xd9\xeb\xd1\xd8\x98\x27\xdb\x1e\xe6\x7b\xf4\x6f\x71\x7a\x86\x6d\x57\x59\x54\x8d\xd9\x19\x8d\x0a\x7b\xe6\xe9\xb9\x6a\xa2\xf0\x0b\x55\x6f\xbf\x39\x1d\x15\x7a\x6c\x46\x6f\xd5\xf9\xe8\xd9\xab\xa3\x51\x5c\xa3\x93\xd6\xe2\xc7\x47\xae\xd3\x49\x6a\x96\x97\x72\xa6\xf0\xa2\xd7\xaa\xf9\x0a\x45\xc3\xb3\x32\x7c\x38\x37\x6a\x51\xe8\x43\xbe\x66\x82\x4b\xe1\x70\x42\x12\x65\x9d\xd5\xc9\x7d\x48\x20\x23\xf6\x39\x8f\x0c\xec\x2c\x86\xd3\xe4\x42\x28\xdc\x38\xbc\xc1\x0e\xc8\x08\x97\x23\xa7\x20\xfa\x07\x8d\x4c\x93\x25\x87\x18\x92\x32\x80\xb2\xd6\x0d\x06\x04\xf1\x32\x83\xdf\x89\x1f\xa1\x9b\x8a\x11\x7f\x5f\x6b\x56\x70\x2f\xe3\x19\xee\xc7\xe3\x1e\x24\x5d\xdf\x4c\xac\x25\xc2\xeb\xe8\x88\x00\xf0\x64\xa7\x6a\x20\x7e\x62\x33\xa0\x65\x75\xea\x97\x8b\x0b\xbb\xb8\xfb\x95\x34\xa6\xbf\x62\x80\x83\x55\x24\xb5\xf5\xd5\x9b\xa3\x2a\xe7\xe7\x5a\x36\xc5\xb6\x9c\x97\x66\xe4\x48\x77\x9f\x9f\x67\x49\xd7\x7d\x85\x70\xde\x5e\xa3\x50\x57\xdd\x2c\x83\xbd\xa8\x34\xd8\x07\x91\x58\x9e\xd2\xc2\x47\xef\x9d\x08\x1a\x3f\xee\xf2\x80\x7f\x55\x92\x8f\x57\xe6\xbf\x20\xc9\xc7\x03\x1c\xac\x22\xc5\x3c\xc9\x83\x72\xb1\x01\xdd\x1f\x9c\x1c\x6f\x83\x4a\xb3\xfd\x64\x1b\x15\x63\x4f\xfb\xbe\x8e\x94\xee\x1b\x55\xc9\x56\x15\x38\xa8\x7f\x2d\x36\xfc\xe6\x68\x2d\x55\xfa\x39\xfb\x45\x28\x92\x5a\xff\xc5\x28\x92\xeb\xcf\x53\xa4\x1f\xdc\x20\x47\x1c\x01\x25\x7e\x1c\x4f\x65\xb3\x0f\xd1\x0b\xee\xce\x08\xef\x9b\xd1\x8e\x2a\xee\xb9\x68\x42\x31\xd6\x85\xba\xc7\x30\xd4\x46\x4e\x00\xf1\x6b\x61\x94\x03\x12\xfe\x78\x0a\x4b\x3f\x9c\x34\x7a\xb6\xcf\xf5\x0e\xc5\x33\x23\xcc\x62\x3c\x1d\xa0\xe8\x79\xa9\x96\xce\x23\xab\x41\x20\xeb\x02\x7d\xe5\xcb\x9a\x4d\x60\x61\xac\xff\xbc\xd1\xc5\x62\xac\x84\xa4\x48\x1c\xdf\xe3\x81\x47\xa1\x56\x9f\xc6\x6a\xce\x37\x05\x1c\xe7\x03\x00\x9e\x43\xbe\xdf\x3a\x93\xe7\xdb\x56\x78\xb7\x8a\x0c\xa5\xf8\x54\x05\x28\x3e\xae\x65\x87\xb5\x08\x56\x11\xcc\xb6\x16\xb6\x67\xab\xb2\x73\xb4\x98\x41\x1c\x22\xe7\x9d\x0f\xa3\x09\x7c\x6f\x5b\x79\xbe\xed\xe7\xae\x74\x7e\x0e\x9d\xcb\xad\xdb\x11\x3a\x5f\x63\x30\x82\xc1\x4b\x36\x64\x86\x33\xe3\xe2\x7f\xbb\xf1\x8f\x08\x8c\x4e\x05\xfb\x9d\xe4\xb5\x60\x29\xa7\xb7\xec\x3c\x76\xa9\x96\xfb\x14\xb9\xe2\x8b\x0f\xe9\xa9\xf7\xf8\xe0\xcf\xf0\x42\x2d\xad\x58\xb8\x6a\x93\x7a\x7c\x6b\xce\x3d\xeb\x79\x10\x9d\xa1\xda\x70\x5c\xac\x75\xc0\xd2\x6e\x83\xea\x83\xfa\x93\xbc\x90\x65\x6d\x5a\x80\xb5\x43\xb2\x73\xa6\x2b\xdf\x2e\x44\x02\xde\xbf\xef\x07\xb4\xb7\x27\x1e\x3d\xf1\xea\x46\xd0\xc3\x47\x4f\x02\x4f\x9f\xc4\x49\xe4\xe8\xf0\xb7\xbe\x83\xce\x10\x1b\x11\xa6\x55\xb4\x5c\x57\xc0\xb4\x14\xa5\x03\x03\x37\x80\x74\x52\xdc\x84\x06\x19\xcd\x10\x19\x32\x24\x51\xd8\x3e\x56\xa3\x6b\x14\x19\xa2\xcb\x3a\x68\x7a\xe4\x5a\x1d\x38\xfd\xb8\x9d\xaa\x19\x85\x12\x1c\x2f\x4c\x8b\x17\x4e\xfe\x9d\xe8\xdb\x16\xb6\x7c\x13\x6e\x72\xf9\x72\xc7\x75\xf2\x0f\x7b\xe2\xc9\x63\xf1\xf9\xb3\x88\xe6\xd4\x4f\x21\xeb\x52\x01\x01\x85\x16\xfb\x87\xa1\xb9\x9e\x09\xd7\xdd\x50\x17\x96\xff\x8c\x01\x75\x1d\xae\xb0\x60\x02\x3f\xe2\x64\x99\xaf\x57\x75\xfe\xa4\x96\xfe\x30\xfe\xb7\x3f\xa9\xe5\x07\xc8\xa8\xe8\x0e\x4f\x77\x13\x80\xc0\xaf\x76\x20\x87\x66\xbc\x23\x7a\x87\x66\x2c\xe7\x98\x98\xe2\x74\x2e\xc7\xea\x5c\x36\x3b\xa2\x27\xe0\xc1\x0b\x70\x91\xeb\x3d\x6b\x1a\x7d\x6d\xff\x86\x87\x90\x43\x05\x1e\xbd\xc1\x1c\x2a\xaf\xcb\x8b\xa9\x2b\x06\x3f\xe0\x31\x65\x77\x81\xa7\x07\x9c\xdd\xe5\x00\xb2\x5b\x1c\x40\x22\x3a\x78\xf0\xb6\xb4\x85\x4e\x4e\xe1\x07\x65\x2b\x8a\x7c\x1b\xee\x08\xf1\x6c\x3e\x37\x99\xc7\x2e\x51\x0a\xfe\xf1\x42\x53\x6a\xa2\x63\xfd\xb7\x57\xbc\xca\x7f\x52\xcb\x1d\xd1\x7b\x53\xd3\x79\x5c\xaa\xa2\x17\x4a\x06\x90\xfe\xa3\xc2\xb5\x81\xfb\x87\x4a\x5d\xc8\xf1\x32\x20\xea\x56\x87\xcb\x64\xbf\x81\x6b\x39\x33\x57\xe3\x52\x56\x48\xa7\x86\x6f\x4b\x06\x60\xa9\x46\xd0\x54\xf2\xdf\x20\x93\x07\xac\x8d\xa8\xe4\x52\xa3\xbf\x11\xb1\xbc\x5f\x6e\xbd\x5b\x1a\x99\x3a\xd3\x7e\xc5\x7b\xbf\xed\xed\x88\xde\x0f\x72\x7c\x69\xec\x52\xc3\x6c\xf5\x7e\x67\x9f\x9d\xc9\x73\xfc\xf5\xe8\xb1\xfd\xb9\x5f\x29\xd9\xd0\x83\x27\xf6\xc1\xa1\xcb\xd7\xd4\x7b\xf4\x6b\xfb\xe0\x74\x5a\x12\x3d\xf4\x1e\xfd\xa6\x47\xab\xd3\xe8\x8a\x1e\x41\x43\xcf\x2a\x2e\x01\x6d\xbc\x72\xb9\x74\x7a\x8f\x1f\xc2\x27\x72\x6e\xdc\xaa\xf5\x1e\x43\x35\x01\x39\xf6\x9e\x40\x5f\x04\xfd\x78\x82\x75\x5c\x28\x22\xbb\xde\x93\xef\xf9\x89\x23\xaf\xde\x93\x5f\x61\x6f\x0b\xfa\x09\x7d\xfd\xa3\x9e\x71\x8d\xd0\x46\x4c\xcf\xbd\x27\xbf\xed\x25\x14\xdd\x7b\xf2\xbb\x5e\x97\xa0\x7b\xdf\x3f\xec\x75\x08\xba\xf7\x3d\xb4\x78\x54\x1b\xd5\x70\x31\x68\x34\xa0\xf1\xde\x23\x9c\xd5\xe7\x8f\xf8\x27\x8c\xe5\xf9\x63\xfe\x09\x03\x79\xfe\x84\x7f\x42\x8d\xcf\xbf\xe7\x9f\x50\xdd\xf3\x5f\xf1\x4f\x18\xc2\xf3\x5f\xf3\x4f\xe8\xfc\xf3\xdf\xf0\x4f\xe8\xf8\xf3\xdf\xf2\x62\x42\x8f\x9f\xff\x8e\x7f\x3e\xc2\x6e\x3c\xe4\xdf\xd4\x2d\xee\xd7\x63\xec\xd7\x23\xee\xd8\xf7\xd0\xb1\x97\x8b\x99\x5f\xa5\x47\x38\xde\x64\xcb\xf5\x1e\x3f\x86\xa2\xc7\xaa\x95\xbd\x75\xa2\xf7\xed\x4e\x7f\x96\xb1\xc3\xd3\x1f\xb8\xe5\x0d\x07\xff\x9f\xd4\xb2\x7b\xe6\x43\x9c\x76\x7c\xb2\x07\x5e\x9a\xae\x09\x51\xd6\x81\x2b\x10\xb2\x65\x7f\x0a\x9d\x2f\x9d\x80\x23\x8a\x85\x42\xd4\x14\x8c\xc8\x4e\xae\x2a\xc1\x6f\xf1\x5a\x37\x97\x60\xcd\x6c\xe4\xa4\x45\xa6\x31\x21\x80\xf3\xa1\x17\x04\xca\x46\x3d\xd7\x9f\x7c\x0d\x86\x46\x69\x8f\x57\xce\x89\xf9\x31\xe1\x6a\x1f\x39\x82\x92\x6b\xf1\x07\x5b\x20\x55\xf6\x6b\x3f\x73\xad\x16\x1f\x43\x46\xf8\x71\x2b\xc8\x35\x3f\x74\xd7\x54\x97\xc0\x2d\xc2\xe3\xe2\x5d\x32\x6b\xef\x21\x1e\x24\x7e\xe6\x51\xdd\xec\xf7\x77\xf7\xf6\x12\xa6\xdb\xb9\x22\x73\xdf\x7c\x09\x04\x01\xca\x4b\x93\x15\x3b\xec\x8c\x0c\xc4\x5c\x57\xcb\x09\xe6\x18\x11\xb3\xc5\x78\x8a\x68\x33\x68\x4c\x16\x63\x59\x0f\x33\x0b\xed\xa3\x59\x5c\x42\xb4\xf0\xa6\x34\x90\x4d\xd6\x0a\x8e\x5e\x72\xb3\x72\xb6\x62\xe9\x01\x80\x41\xd4\x78\x5a\x53\xec\x2b\x84\xf4\xc6\xb2\x76\x57\xfa\x1e\xfb\x94\xfd\xe0\x93\x02\x88\xd1\xe8\x15\x68\x49\xcc\xa3\x15\x0f\x44\xad\x09\xed\xbd\x23\x20\x51\x98\xf4\x30\x27\x93\x90\xc4\x22\x9e\x32\xeb\x16\x3b\x22\xa3\xb6\x38\x99\x67\x8b\x31\xe2\xd6\x4e\x1e\x24\x69\x4b\x57\x3f\x2a\xb1\x98\xf7\x82\x4d\xf5\x16\x6e\xb0\xe0\xf6\x2a\x3d\x03\x5d\x06\xd9\x48\x0d\x9b\x29\x59\x53\x6e\x76\x25\xc7\x53\xae\xc7\x1f\xc7\xb0\x1f\xed\x31\x0b\xf9\x86\xec\x69\xeb\x36\x3f\x1c\xc5\xa4\xcd\x2c\xea\xf2\x4a\x35\x46\x56\xa1\x10\xea\x70\x00\xc3\x93\x31\x25\x6e\xdb\x0c\x10\x78\x4c\xbf\x09\x84\x5e\x9c\xdd\x34\xb0\x73\x44\xc7\xf2\xd7\x9b\x3a\xa2\x6a\x52\x6b\xc7\xa5\x95\x69\x02\x56\x67\x19\x70\xa5\xc7\x94\xc8\x93\x4d\xd3\xe3\xb6\xa9\x40\xfa\xe1\x07\xc6\x9e\xd8\xd1\x13\x59\xc5\xbf\x67\xaa\x95\xd1\x83\x46\xcd\x95\x6c\xfd\x6f\xdb\x4a\x15\x98\xbf\x11\x68\xc6\xce\x50\x73\xda\x42\xc6\x37\xee\x56\xf4\x78\x80\xbb\xfb\x05\xca\x56\x47\xde\xae\xef\xc8\x75\xa5\xad\xd2\x2e\xbe\xd7\x8b\x7c\x5e\xa8\x45\xd5\x22\x87\xe5\x74\x87\x64\x61\xb1\x9b\x2b\xd1\xf0\xd1\xd5\x53\x4f\xfc\x86\x73\xe4\x96\xe1\x99\x9e\x2d\xbb\x9a\x4b\x13\x08\xed\x1c\x59\x0f\x67\x42\x25\xc7\xc8\x9d\xc8\xbf\x6d\xa9\x5a\x31\x29\x6b\x59\xd1\xb6\x6f\x3b\x87\x03\x2a\x32\xb2\x5e\x8a\x99\xfc\xab\x97\x03\x87\x28\x55\xba\x26\x11\x1f\x04\x87\xed\x55\x3c\x75\x13\x3b\x0b\xb1\x9a\x62\x46\xa6\x88\x85\xf9\xbb\x25\xaf\xac\x90\xc7\x31\x11\xff\xda\xa5\x70\xfb\x30\xbf\x12\x56\x2a\x1a\xbd\x99\x6f\xbe\x16\xf3\xe9\xd2\x80\x47\xac\x63\x0f\xa0\x8f\x85\x8c\xb6\xcb\x19\x7c\x45\x28\x62\x3b\xb7\x5b\xcb\x68\x4c\x2f\x65\x35\x5c\x19\x63\x8f\xd4\xe4\xf0\xcb\x49\xe5\x87\xe2\x99\x31\x8b\x19\x5a\xea\x24\xa0\x26\x80\x8f\xf1\x9b\xd3\x55\x35\xcd\x1b\x7d\x55\x42\x48\x9d\x30\x8b\x66\xde\x94\x06\x11\xcc\xe4\x78\xbc\x68\x64\x0b\x69\xc7\xe7\x80\x9a\xa1\x1b\x5b\x8d\x9d\x88\xc3\x85\x15\x59\x64\x8d\x9d\x1c\x72\x55\x07\x0b\xc5\xb6\x9c\x01\xb5\x5c\xa9\x49\xcb\x60\xf4\xc0\x3a\x5b\x1d\x9c\x83\xe0\x55\x69\x67\xbf\x9c\xad\xa7\x0c\xc7\xab\x33\xef\x02\x2e\x1d\xe7\xab\x1e\x06\xda\xf9\x4a\x42\x81\x89\x5c\x4b\x26\x50\x02\x93\x7c\xd4\x42\x56\xa5\x44\x6f\x1d\x55\xc2\x41\xe6\xa9\x48\x37\xe1\xee\xc6\xd5\x84\x45\xae\x9d\x4f\x83\xdd\xb0\xb6\xeb\xb4\xee\x81\xfb\xc2\xcf\xbe\x23\xfe\xa1\x13\xf9\xdf\xf6\x69\x78\x1d\x1d\x74\xff\x05\x4d\xd4\xd1\xf8\x06\x2b\xce\xf5\xfc\x95\x09\x64\x45\xfe\x69\x62\x84\xab\x22\x15\x21\x0a\xd9\x4a\xb0\x7d\x4c\x54\xf3\xaf\x75\x5f\x02\x8e\x48\x6b\x49\xd2\x4d\xda\x2f\x42\x8e\xbe\xfd\x5f\x8c\x22\x83\x26\xf2\x44\xe9\x46\x38\xc8\x50\x48\x9e\x18\x31\xfd\xee\xcd\xd4\x08\x79\x87\xb6\x55\x42\x87\xfe\xeb\x94\x10\x31\x97\xaf\xf1\x22\x25\x2e\xf9\x59\xfa\x98\x9c\xb2\x3a\xcf\x6f\x14\x61\x37\x10\x83\x37\x94\x62\xff\x55\x76\xc8\x0d\x1c\xdb\xaf\xe5\x7f\x41\x76\xed\x07\x37\xc8\x11\xed\x57\xbb\x73\x3c\x7e\xf8\xf0\x77\xa3\xb7\x07\xdb\xe0\xf3\xe4\x93\x46\x9b\x6d\xfb\xe2\xe1\x93\xc7\x0f\x47\xff\xe6\x9f\xd2\xf6\xd9\xfe\x7a\xe3\x70\x90\xd5\xfa\x2a\x74\x7c\x4a\x9e\xa7\x9b\x91\xad\x6a\xff\xed\xf8\xb4\x6e\x7f\xac\xdf\x1d\xf1\x0c\xff\x17\x74\x03\x49\x46\x38\x58\x49\x54\xf9\xcd\x02\x29\x75\x7e\xa2\x58\xe3\xeb\xe8\xc8\x35\xaa\x6a\xe5\xff\xba\xd1\xf3\x09\x8b\x65\x5c\x9e\xf0\x85\xd8\x01\xb3\xac\xac\x2a\x00\x49\x69\xb5\xd5\x68\x94\xaa\x0e\xe0\x2d\x5a\x5e\xdf\xaa\xf3\xcb\xb2\x25\x3d\x9f\x4d\xc7\x7d\x0c\x84\x2b\x0d\xa1\x6a\x5c\xa9\x2d\xd4\x55\x7a\xc1\xf7\x51\xb3\xb8\xd7\x87\xc1\x6b\xb1\x13\xa8\x5a\xd0\x9f\x3f\x6f\x36\x9e\x3f\xaf\x1a\xcf\x9f\xd7\x8e\xe7\xcf\xeb\xc6\x03\xfe\xb5\x6b\x87\xf3\xe7\xf5\xc3\x59\xdf\xf6\x47\x72\xb8\xfd\xfd\xef\x6e\xdf\xf0\xfa\x76\xbb\xb3\xf8\xbf\x99\x79\x45\xa6\x66\xe3\x92\x7b\xdc\x83\x52\xc7\xe0\xfc\x51\xb2\xc5\x9f\x50\x71\x1a\x79\x2d\xa0\x6e\xac\x8a\xf0\xa8\x75\x4d\xb1\x82\xb5\xb6\x5c\x8b\x63\x7f\x11\x56\xc5\xc3\xb9\x3e\x18\x6d\x8b\x47\x8f\x1f\x0e\x04\x38\xf0\x56\x4b\xa1\x7e\x5c\x94\x57\xb2\xa2\x8c\xf8\xf3\xf2\x93\xaa\x0c\x5d\x5c\x3f\x13\x17\x5a\x17\xe8\x8f\xfc\x89\x3c\x0a\xad\xea\x7b\x70\x72\xfc\xe1\xe0\xf0\xc5\xd9\xb3\x0f\x2f\x8e\x5e\x1e\x8a\xfe\xa3\x2d\xdb\xc0\xaf\xbe\xb5\xef\xae\x4a\x75\x8d\x2e\xdf\x76\xe6\x74\x83\x35\xfd\x7f\xdf\x3f\xa4\xaa\xd1\x89\xd9\xd7\x70\xba\xff\xfa\xf0\xf0\xa5\xe8\x3f\xde\x22\x83\xc3\x6f\x7f\x33\xcc\xd4\x34\xe4\x89\x3b\xc6\x0c\x07\xff\x42\x1c\xfe\x66\x1d\xc1\x73\xa0\xff\xb2\x4a\x82\x1f\xe2\x20\xc7\x70\x03\xee\x7e\xb6\x68\x6a\xf0\x5c\x78\xd7\x93\xe7\xba\x69\x7b\x03\x31\x1c\x0e\xdf\xdb\x27\x65\x8d\x59\xe4\x7d\xec\x1b\x32\xea\xef\xec\x5e\xc6\xc2\x3b\xfc\x7b\x3d\xa8\x02\xe7\xea\x0d\x71\x15\x9e\x61\x6b\xfe\x65\x84\xac\x00\x6f\x19\x58\xc1\x15\xfa\xe2\xfe\xca\xe0\x2b\x60\x85\xef\xa9\x08\x17\x1d\x0e\x81\x50\xbe\xec\x22\xdc\x29\x86\x5c\xe1\x99\x74\xa6\x0f\x62\xba\xf7\xa3\x73\xd5\xed\x88\xbf\x03\x20\x00\x95\xf8\xe2\xea\x1a\xa5\x50\x13\xdf\x07\x39\x82\x6f\x6e\xe7\xcb\xee\x1d\x3f\xe1\x3d\xe7\xb5\x0e\x77\xdf\xc1\xef\xa3\x96\x00\xc2\xa2\xa7\x88\x09\xe0\x33\xb4\xf9\xbc\x63\xf6\xaf\x57\x95\x5c\x06\x7f\x9e\x61\xec\x01\x66\xf5\x2a\xc7\x97\x61\x7a\xaf\xde\x38\x06\xa2\x18\xeb\x39\x7e\xba\x80\xea\x0b\xbd\x38\xaf\xd4\x3e\x7f\x55\x34\xf2\x82\xff\xa5\x8e\xe2\x9f\xe0\x5d\x40\x3f\x3e\x95\x2d\xff\x0d\x69\xa9\xf9\xc7\xc9\x95\x2f\xe4\xfa\x5f\x34\x1a\xc0\x2b\x0a\xe2\x35\x14\x82\x31\x10\x3d\x35\x9b\xb7\xa5\x82\x36\x54\x3d\x6e\x96\xf3\x96\x7f\x14\xf4\x47\xd3\xe8\x26\xcc\x6e\x47\x30\x78\xf0\x07\x78\xe1\xd9\x3f\x2f\x3d\x94\xc6\x25\x99\xe7\xe9\x6f\x44\xcd\xa8\xb4\x2c\xf8\x5f\x85\xae\xd4\xee\xd7\xb1\x6a\x65\x11\x3c\x71\xbd\x9e\x85\x28\x1c\xf0\xe3\x58\xe3\x40\xe1\xc7\xc9\xc2\x97\xe2\x51\xcf\x3c\x50\xc7\x5c\x9a\x56\xe1\x1f\x0b\x5c\x84\x39\x2d\x98\xfd\xb7\xac\x61\x8a\x01\x94\x97\x3a\xdb\xc8\x56\xf9\x89\x69\x94\x51\x6d\x94\x59\xb0\x67\x94\xba\xc4\x49\xb1\x7f\x51\x0d\xa6\x85\x24\xb6\xf0\xe7\xe2\x7c\x86\xab\x62\x16\xc6\x6e\x1b\xc0\x0b\x29\x67\xea\xcd\xbc\x90\xd8\x97\x56\x5f\x5c\x54\xf4\xd7\x62\x3c\xf5\x19\xed\xe0\x27\x2d\x36\xfc\xcd\x43\x85\x1f\x6e\x4a\xbc\xfe\x43\x65\xaf\x74\xb5\x98\x05\xdd\xbe\x96\x80\x82\xee\x93\x5b\xbe\x1f\x4e\x74\x73\x28\xc7\xd3\x7e\x56\x3c\x82\xbb\x5d\x39\x2f\x5b\xbc\xff\xc6\x63\x60\x0f\xf7\xdb\xbb\x87\xef\x87\xad\x7e\x33\x9f\x33\x4c\xa2\x78\x40\x47\x02\xa6\xb9\x7e\xe4\x20\xe9\x48\xaa\x15\x7b\x96\xa5\xf4\xc4\x83\x4e\x95\x5c\xb0\xd5\x73\x57\xb2\xd5\xf3\x7c\x51\x2e\x8b\xe1\xe6\xb7\x85\x92\x61\x91\xbb\x83\x23\xc3\x9d\x7c\x00\x3e\x35\x37\x21\xc9\x70\x4f\xdf\xdf\x21\x44\x8a\x90\x05\xbd\x83\x1f\x90\xcf\x8e\x52\x8a\xac\xe7\x44\xbe\x36\xf7\xc9\x17\x38\x1b\x08\xbf\x00\x8e\xfe\xb2\x16\x07\x87\xff\x89\x77\x00\x98\x07\xac\xbc\x52\xb5\x32\x06\x9d\x5d\xc9\x1f\x02\xbc\x0f\x6a\x7d\x5d\xff\xf1\xec\xf8\xc5\x59\x98\x9b\x4f\xec\x85\xfc\x79\x20\xe2\x94\x89\xf8\x83\x79\x96\xff\x15\xb0\xad\x30\x31\x61\xab\xe7\x07\x1d\x66\x61\x47\xe1\xf9\x85\xfd\x15\xb2\x0c\xf8\x5d\xf8\xbf\x99\x71\xb4\x7a\x7e\xc4\x2c\x03\xfe\x76\x5c\xc3\x4e\x1a\x31\x06\xfa\xd3\xf3\x06\xf7\x20\x64\x0f\xf4\xd0\x6f\x07\x3d\x7f\xc5\xbb\xdb\xfe\xed\x47\xf7\xca\xef\x71\xfb\x2b\xd8\xe6\xad\x9e\xbf\x8e\x76\xba\x7d\xc0\x9b\x1d\xe2\xd4\x78\x97\xd3\x0f\x5f\xcd\xa9\xdf\xeb\xf6\x97\xdb\xee\xf0\xc3\xef\x78\x3d\x3f\x4b\x36\xfd\xfc\x2c\xd8\xf7\xf3\xff\x4c\xf6\x6c\xab\xe7\x6f\x69\xdb\xbe\x27\x10\xa1\x53\xb8\xcb\x02\x92\xd9\x24\x54\xfe\xfb\x7f\x40\xa8\x7c\x7a\xb4\xde\x4c\xf1\xae\xcd\x30\x9d\x61\x5c\xcf\xda\xa0\x70\x6e\x1a\xaf\xa4\x38\x26\x4f\x53\x96\x83\xf5\xe1\xdd\x61\x88\x1f\x1e\x47\x3e\xca\x2f\x08\x08\x75\xd8\x10\x82\x2f\xc5\x38\x46\x55\x37\x89\xd3\x44\xab\x35\x45\x14\x23\x6e\xa8\x09\xeb\x83\x6b\xc8\xfa\x5a\xc2\xdd\x75\x5c\x95\x19\xa2\x13\xad\x55\x22\xa6\x98\xe8\x3c\xe3\xfe\x12\x56\x16\xf9\xb0\x0c\xc5\x49\xad\xc4\x35\x00\x96\xaa\x4f\x73\x35\x6e\xc5\x99\x3c\x27\xf0\x5e\x0e\x0f\xed\x13\x90\x7d\x89\xc1\xb6\x51\x64\xe5\x7a\x3f\xef\x28\x69\xd8\x8a\x95\x10\x61\xa8\xe5\x77\x71\xa8\x25\x27\x61\xfa\x9a\x68\xcb\x74\x5d\x43\x70\x93\xe8\x0e\xe8\xa6\xa0\xea\x28\x32\x7d\x65\xa8\xfe\xba\xe6\x7c\x60\xc4\x8d\x01\xdc\x20\xa5\xdd\x40\x4c\x20\x00\x12\x25\xe9\x9a\x90\x7f\x30\x47\x33\xbc\x32\x31\x25\x05\xb1\xe9\x98\xad\x8c\x29\x29\xa8\xc7\xc4\xab\x1a\x3a\xe4\x20\xfc\x32\x2c\xe5\xe3\x9f\x77\x29\x0f\x02\xc1\x34\x1f\xad\x9e\x5f\xe9\x63\x27\xac\xdd\x18\xe3\x3e\x1a\x89\xb3\x93\x83\x93\x1d\x71\x80\xb9\xbe\x02\x30\x15\x4e\x70\xa1\x5b\x11\xc4\x86\xe0\x34\x32\x42\xcb\xa6\x23\x39\x66\x89\x31\xdf\x21\x90\x1f\x3b\xaf\x72\xc1\xfa\xeb\xe9\xc8\x2b\x8c\x37\xd1\xd1\x81\x15\xf2\x3b\x2d\x1e\x90\xc8\xbf\xe2\x45\x9b\xeb\xe5\x01\xab\x03\xd9\x37\xa8\x1c\x64\x5f\xe5\x07\x7d\xe0\x14\x87\xcc\x2b\xbd\xe9\xfe\x75\x57\x66\x37\xcd\xc3\x59\x20\x07\x77\x1a\x3c\x63\xa9\x38\xff\x26\x4f\x61\x67\x5e\x62\xde\xac\xaf\xfe\x0e\xe3\xa6\xce\x3e\x0b\xf5\xc7\x4e\xc3\xcf\xba\xda\xe4\xea\x32\xb7\xe9\x60\x1c\x37\x7b\xe3\x8c\x46\x3a\xc2\x86\x53\x10\x9b\xa7\x6f\x6a\x82\xf2\xae\x6f\x56\x37\x5d\x26\xdd\x54\x27\xa6\x91\xdf\xac\x4a\x6f\x6a\xb9\x19\x6f\x63\xbe\xcc\x6c\xec\x1c\x23\x78\x05\x0a\xe3\x66\x1d\x88\xc3\x3a\x57\x74\xa2\x50\x13\xb9\xa8\x5a\x5f\x63\xc8\x9a\xc1\x0b\x38\x2b\xc7\x0f\x21\x43\xd2\xc9\x24\x91\x6c\xe2\x24\x40\xfc\xdf\xb5\x6c\xea\xb2\xbe\xe8\x03\x38\xc8\x40\xf4\x3a\x82\xe3\x8e\x78\x53\x73\xe2\x28\xb2\x05\x82\x14\xf8\xf1\x5b\xf3\x91\x93\x15\x63\x1d\xc2\x6a\x63\xbd\xd2\x88\xaa\xbc\x54\xd5\x52\x40\x40\x1b\x78\xda\x4a\x80\xff\x2f\x6b\x82\xe8\x17\xaf\x2a\x65\x27\x6d\x52\x82\xec\x22\x4a\x63\x16\x6a\xd8\x8b\x53\x85\x6f\x85\xc0\x33\x5f\x3a\x87\x0f\x30\x7e\x3b\x74\x9c\xe6\x48\x98\x5a\x7d\xdf\x31\x6d\x67\xd5\xaf\x46\x30\x3f\x43\xfb\xf7\xbf\xd1\x25\xe0\xc3\x8d\x16\x8d\xae\x6c\xb2\xab\xe5\xa5\x4d\x45\xfa\x69\x5a\x53\x80\xb3\x96\xda\x18\x6f\x21\x51\x63\x6b\x6b\x61\xd0\x42\x9f\xab\xd0\x5b\xca\x7b\x44\x19\xd5\xfe\x11\x96\x94\xe9\xa6\x3f\x8d\x7e\x06\x66\xc7\xa3\x1a\x50\x41\x31\xcd\x82\xa1\x24\x0f\x46\x57\x90\xaf\xea\xe0\xe4\x58\x4c\x4b\xd5\xc8\x66\x3c\x5d\x12\xf4\x3d\x28\x1b\x00\xca\xe2\x52\x26\x96\x50\x07\xa0\x3e\x0f\xf1\xef\x80\xbe\x4e\x6c\xd1\xfe\xc1\xc9\x71\xfa\x6c\x6b\x37\xf8\xf0\x31\x7d\xb8\xaf\x67\x73\x5d\xdb\xe9\x68\x94\xea\x03\x39\x1d\x9c\x1c\x47\x4f\x83\xce\x43\xc8\x5b\x39\x9b\xeb\xa6\x95\x35\xa1\xbf\x50\x17\x8d\x28\xeb\x71\xb5\x28\x90\x40\x69\xa7\x89\x3e\xdf\x53\x4c\x25\x0c\xb0\xd5\xa2\x51\x3f\x2e\xca\x46\x11\xfc\xf1\x6c\x6b\x83\x21\x99\x1f\xe0\x72\x17\x40\xd2\x33\xfb\xa9\xf3\x68\x70\x47\xa0\x88\x0f\x67\x6d\x54\x36\xfb\xd8\x96\x0f\x20\x4e\xb8\x6c\xe7\x11\x84\x6f\xa5\x98\x69\x3b\xdd\x47\xb6\xdc\x0f\x80\x2b\x83\x18\x54\x61\xe1\xfc\x73\xb4\x3e\x60\xaa\x1d\x2b\x74\x3d\x33\xcb\x7a\x7c\xba\x38\x6f\x1b\xa5\x9e\xbd\x3a\x72\x58\x46\x69\x89\xf1\x54\x15\x8b\xaa\xac\x2f\x7e\x58\x1e\xe0\x94\x1f\xd5\xbc\x88\x1e\xa1\x68\x34\xa2\x24\x9c\x86\x18\xc6\xf3\x46\x82\xf1\x3c\xa8\x0f\x5e\xf0\xf3\xd5\x9f\x1e\x9c\x1c\x73\xbe\x1a\xad\xc3\xef\xf7\xdd\x43\xff\xb1\x7f\xfb\xc6\xa8\xe6\xac\x9c\x95\xf5\x45\x38\x9a\x3b\x10\xf4\xd8\x4a\xb8\xb0\x9a\xe9\x42\x09\xa4\x40\xbb\x0f\x06\x94\x53\xe5\xd9\xeb\x33\xfe\x13\x2f\x43\xb6\x76\x82\x7a\xf9\xeb\xd7\x6a\xac\xeb\x71\x59\x41\x86\x22\xac\x1c\x7b\xae\x9a\x12\xa2\x5b\x2a\x51\x6b\x3d\xa7\x46\x08\xdd\xb1\x5a\x0a\x4c\x31\x1b\x55\xf9\x52\xeb\x79\x54\x5d\x34\x13\xbe\xbe\xb9\x6a\x38\xdc\x06\x6b\xdd\x3f\x8d\xea\x79\xe5\xde\xe7\x6a\xeb\x58\x9a\xae\xaf\xaf\xc5\xf9\xa2\xac\x0a\x33\x44\x42\x00\x5f\xe1\xd3\x56\x8e\x2f\x29\x77\xc1\x1d\x97\x69\xa4\x3c\x07\xe7\x1e\xf7\x86\xb0\xa7\x31\xc9\x2b\xe6\x2e\x0d\x40\x53\x61\x61\xf6\x17\x8d\xd1\x4d\x9f\xf6\x25\x24\xb7\x8c\x2e\x71\x28\x0a\x18\x27\x66\x47\x84\xe5\x5c\xbe\x90\xa0\xd2\xb9\x9e\xdb\x59\x34\xba\x19\x60\x77\x7c\xb0\x12\xf6\xe2\xf7\x5e\x89\xe5\xf3\x31\x3d\x19\xdf\xd4\xa8\x3e\xab\xc2\x56\x37\xec\x65\xfc\xbc\x5d\x8c\xaa\xcf\x4a\x01\xad\x41\xa8\x8e\x9f\x86\x77\xd0\xe6\xfb\xad\x4d\x9a\x7a\x0e\xdf\xcf\xf5\x7c\xae\x8a\xa8\x4d\x68\x07\xc7\x34\x64\x2c\xe6\xbd\x60\x15\xa8\x11\xb2\x86\x26\x4f\xc3\xdc\xac\x94\xdd\x25\xed\x5d\x80\xa6\x86\xf0\xe6\xf6\xe9\xf6\x76\x9c\x66\x06\x72\x41\xf0\xc4\x52\xd4\x48\x38\xbf\xf6\x9b\x07\x0f\x56\xf6\x21\xee\xfe\x0d\xbd\x81\x67\xbb\xeb\x47\x1e\xf7\x0e\x4c\xf0\xdf\x3c\xa2\xa4\x37\x94\x22\x03\xd7\xfb\x0f\x81\x28\xb4\x76\x76\x3c\x3d\xac\x9b\x21\x07\xdc\xe4\x66\x29\xc0\x58\x2f\x94\x19\x37\xe5\xb9\x72\xa7\xd4\xf3\x06\x33\x0d\x79\x03\x5b\x2d\x67\x00\x1e\xb6\x68\xc6\x6a\x20\x00\xac\xd1\x9e\x20\x11\xc9\xf7\xfe\x52\x63\x0b\x20\x67\xc1\x27\x14\x41\x03\x62\x60\x6f\xcb\x3e\xc5\x2a\xc4\x53\xd1\x13\x7d\xd9\x42\x49\x7c\x34\xb4\xc2\x16\x24\x2e\xa2\x88\x8a\xfe\xe8\xff\x0c\xbf\x7b\xf7\x97\xbf\xfc\x65\xf4\x7e\x34\x10\x3d\xf8\xbc\xb7\x13\x7c\x50\x95\xb5\x7a\x09\xc0\x00\xf6\xcd\x56\x4f\xec\xf8\x8e\x61\x03\xb8\x55\xe1\x00\xb5\xdf\xf9\xb7\x5c\xbe\x07\x69\x89\xc2\xdd\xcd\x73\x01\x64\xdd\x0f\x48\x85\xad\x71\xf0\x68\xd8\x4a\x67\xd9\x03\xf1\xfa\xa8\xe6\x48\x26\xcb\x1b\x78\x1e\x77\x7c\x81\xe7\xd4\x80\xac\x72\x6f\xe1\xd2\x35\xf7\xe2\x8f\xda\xb4\xc9\x73\xba\x90\xb0\x63\x61\xa2\x1b\x7e\x28\xd4\xf9\xe2\xe2\xc4\x3e\xdb\x0d\x0a\xd1\x64\xc7\xa5\x4e\xe1\x61\x58\xac\xc6\xd5\xbe\x50\xbe\x29\x10\x0f\x70\xf4\xbb\x69\xab\x94\x86\x2a\xb4\xb9\x58\x46\x02\xef\x42\xe9\x3d\x2c\xdc\xa9\x1b\x4b\xa7\xb9\x4a\x89\x92\xf2\x04\xb9\x92\x08\x77\xef\x64\x94\x91\x20\x44\x8b\xc1\xb6\x09\xf2\xcd\x73\x72\x59\x23\xa0\x06\xc4\xdd\x55\x56\x81\xa0\xac\x82\xd7\xba\xb9\xdc\x2e\xeb\x6d\xbe\x3d\xc3\x09\x04\x33\xe6\x68\x84\xdf\x14\x0b\xc8\x84\x7f\xae\x50\x9c\x14\x63\x6d\x85\xa6\x56\xe1\x45\xce\x50\x1c\x60\x52\x7d\x5b\xaf\x28\x5b\xc8\xd0\xd0\x60\x62\xfc\x76\xaa\x1a\x5b\xcd\xb8\x6c\xc6\x8b\x19\x02\x7d\x9a\x61\x8c\xe6\x6e\x77\xf1\xb3\xa2\x50\x75\xb1\x98\xfd\xb0\x7c\xab\x9b\xcb\xa3\x9a\x6d\xfc\x48\x9a\xd7\xd1\x33\x7f\xd7\x45\xa9\x61\x70\xdc\x41\xda\xec\xb8\xbc\x7d\x59\x68\x97\xf3\x61\xa2\xc5\x83\xbd\x84\xf6\x6b\x8e\x07\x44\x14\x6a\x97\x0c\xbf\x9d\xba\xa4\x17\x02\xd2\xad\xab\x46\xcc\xc0\xfe\x87\xc9\xd7\x29\x66\xe5\xba\xd1\x56\x3e\x6d\x94\xc2\x15\xa9\x7d\x9e\xd9\x77\x3d\xfc\xbc\xf7\x1e\xe1\xe0\x89\xf1\xb9\x06\x19\x28\xbf\x9e\xe8\x4e\xd2\xb0\x7d\xe4\xa7\xd0\xc5\x13\xa6\x00\x62\xa0\xde\x96\x8f\xcb\xb5\x47\x22\x96\xa5\xfa\xf0\x3b\xcf\xcf\xe3\x43\xb0\x9b\x68\x7a\x8d\xcd\xfe\x86\x0d\xe8\x76\x84\x4b\xd4\x2b\xee\xdf\x07\xcd\x54\x4f\x84\x7f\xd1\x73\x99\x3b\xb2\xb1\x2a\xab\xf7\xcc\x97\x38\x12\xd1\xc1\x43\xaf\x9a\xab\x88\xa2\xfe\xd1\xf3\x35\x1a\x89\x53\x39\x51\x1e\x43\x66\xe2\xb2\x33\x60\x4d\x88\xe5\x0b\x60\xbd\x88\xf6\x81\x02\x5e\x59\x5f\x0c\xb8\x02\x40\xe2\x01\x47\xa5\x8b\x85\x6c\x64\xdd\x2a\x97\xe1\x0f\xc8\x2d\xdd\xb1\x94\x4b\x36\x8a\xf9\xdc\x6c\x67\x79\xb6\xb7\x76\x82\xe1\xf0\x0e\xa7\x89\x66\xb5\x3b\x87\x96\x79\x0d\xfd\x7a\xb0\xa4\xc9\xb3\xb4\x7e\xd2\x6f\x2e\x08\x0c\xc7\x15\x0b\xbb\x98\x76\x30\x38\xce\x36\xee\xe5\x3a\x3a\xda\xa8\xf7\x4e\x2c\xfa\x09\xdd\x07\x0b\x42\x1f\x4a\xae\xea\x7e\x54\x17\xfc\xeb\xe4\xf8\x7c\x61\x06\xcb\x63\x11\xdd\xf9\x34\xdb\x6f\xc3\xe0\xd7\x64\x16\x77\xba\x8f\x20\xa0\x20\x2d\xb5\xb6\xcc\x2b\x6c\x24\x79\x40\x61\x08\x59\x1e\xb7\xb3\xf2\x4d\xe6\xab\x68\x95\x3a\x5f\x46\x6f\xd1\x9b\x6f\x24\x5e\x35\x6a\x52\x7e\x12\x33\x25\xcd\xa2\xe1\xfb\x09\xcd\xb1\x90\x3d\xe3\xb2\x3d\xdb\x4d\x37\x29\x2b\xcb\xf6\x11\x6b\x67\x34\x12\x2f\x74\x7d\x61\xb5\x00\xa8\x03\x93\x6f\x8b\x29\x20\xee\x68\xd1\x28\x89\x57\xff\xea\xea\x4c\xeb\xca\xe0\x0d\x3f\x24\xe2\x3c\x9c\xe9\xbf\x96\xf6\xb0\xfa\xcb\xe2\xf1\xaf\x7f\xf7\x43\x0f\x35\x5c\x52\x36\xa2\x97\x07\xdf\xd3\x4b\xce\x77\xed\x15\x60\x72\x38\xd0\x13\xce\x87\x68\xcf\xd3\x94\xb9\x06\xcc\x37\x28\x35\x9c\xc9\xe6\x12\xa3\xf8\x98\xe8\x56\x95\x1c\x57\x4a\x36\xc7\xb2\xb9\x34\x9b\x95\xa7\x79\xbc\x4d\xe5\xf8\x45\x5a\x3f\xae\xce\x9f\x94\x9a\x8b\x16\xe0\xbc\x75\xca\x3c\x79\x95\xae\x15\xf8\x4d\x50\x6e\xf3\x76\x0a\x80\x65\xf5\x75\x89\xe8\x33\xe0\x24\x04\x8b\x85\xb7\x51\x70\x8c\x57\x5a\x5f\x1a\x9f\xab\x46\x62\x3a\xf7\x37\x75\xd9\x9e\x4c\x2c\x6b\xb4\xeb\x66\xd0\x26\xa2\x9a\xa1\xd8\x97\x35\x64\xe6\xae\xcb\xc9\x12\x16\xff\xe9\x9d\x20\xd9\x04\xef\x2a\xdc\xc8\xa3\x91\x38\x9a\x88\x6b\xd5\x6b\x14\x83\xfb\xce\xca\xa2\xc0\x64\xab\x10\xd0\x3a\x86\xfc\xb4\x18\x8f\xeb\xe4\x2b\x4a\x06\x6d\xf9\x7c\xd9\x3e\xb5\xb5\xbc\x56\x98\xbe\xf0\x63\xd8\xcc\x47\xba\x30\xc6\x8c\x3d\x13\x2c\xe1\xa0\xe0\xf9\x9c\x71\xcd\x60\xfd\x20\x74\xf9\xec\x87\x24\xc1\x8d\xf5\x6c\x56\xb6\xb8\xed\x45\xab\xb5\xc3\x2a\x2e\x00\x8d\xbb\xa6\x73\x86\x66\xb2\x6c\x45\xdf\x94\xf5\x58\xd9\xca\xaa\x72\xa2\xc6\xcb\x71\xa5\x5c\x4a\x82\xa8\x32\xac\xc0\x72\x8b\x19\x5c\x82\x83\x34\xb4\x35\x0c\xe7\xec\x55\xc4\xfc\xd2\x17\x9d\x19\x3d\x28\x0b\xdf\xa8\x98\x6a\x7d\xe9\x96\x47\xc8\x5a\x2c\xc0\x23\xe3\xa9\x43\x36\xd6\x93\x56\xd5\x42\x46\x1b\x63\xde\xe8\x73\x48\x8a\x0a\x68\xd6\x76\x9c\x90\x9c\xe8\x32\x22\xb0\x92\xd2\xb7\x90\x09\x12\x0e\xde\x9a\x42\xbd\xed\xf6\x43\x3a\x82\xd2\x38\x62\x13\x18\xd3\xc7\xd2\x8c\x25\x04\xf0\x62\x7f\x68\xc7\x97\x56\xc1\x99\x95\x6d\x8b\x7b\x36\x30\x69\x4d\xa5\x21\xc3\x9b\x2a\xd0\xa9\xe4\xa8\x26\x7e\x85\x9f\x6c\x5c\x9c\xa7\x33\x28\x8d\xfd\x83\x24\xd8\xae\x98\x25\xed\x17\x1a\x52\x1d\x3e\x24\xab\xda\x64\x02\xc6\xdb\xb0\x94\x6b\x9b\xca\x94\x86\x9c\x58\x9e\xeb\x66\x9f\x3d\xd9\x43\x73\xd6\x41\x48\x50\x28\xcd\x80\xaa\x60\xa6\xfa\x5a\xc8\x90\xb5\x0a\x0d\x4b\x61\x25\x67\x24\x77\xab\xda\xdc\x41\x40\x70\x09\xc9\x05\x4d\xdb\x28\x74\x91\x4e\x88\x0a\x34\x94\xa8\xaa\x2b\xd5\x4c\x95\x2c\x86\x94\x60\xeb\x5c\x55\xa6\x3b\x86\x5a\x5d\x8b\x53\x05\x49\x56\xef\x60\x76\xdd\x66\x26\x21\xe1\xf5\xcb\x54\xd7\x9f\xd1\xc3\x48\xb9\x0f\xf8\xf5\x03\xd1\x03\x75\x9a\xcb\xed\xba\xcc\x60\x58\xe9\x0b\xdb\x85\xa8\x46\xe8\xd4\x80\x19\xfb\x37\xdf\x3c\xf2\xea\x0a\x1e\x19\x56\x3f\x71\x2f\xc5\xd3\xf8\x08\xc0\xf6\x76\x3a\x5d\x60\x05\xc7\x2c\x26\x99\x2a\x7a\xe2\x2d\xfe\xdc\x81\xce\x06\xef\x76\x48\x39\x72\x1a\xa2\x78\xc0\xdd\x78\x80\xf3\x27\x1e\x50\xa5\x7e\x68\xa0\xe7\x1d\xc3\x71\xb1\x72\xaa\xd2\x93\xa5\x1f\x4f\xb2\x2f\xbd\xe5\xeb\x75\xe7\xca\x86\xf5\xfa\x73\x68\x93\xda\x29\xf9\x77\x6e\x31\xb8\x78\x7e\x59\xb0\xee\x56\x15\x21\x85\xac\x68\x6f\x37\xfd\xc6\x11\x80\x27\x87\x0c\x09\x80\x53\x61\xb3\x64\xf7\xc7\xee\xd9\xd9\x8f\x2b\x1c\x74\x3b\x45\x59\x05\xc7\x10\x4c\xd0\x57\x8d\x95\x6d\xbf\x60\xe0\xc3\xd1\xc4\xae\xe9\x55\xa9\x17\x06\x86\x0a\x59\x96\x67\xa5\x71\x07\x85\xd1\x33\xc6\x73\x1f\xe0\xa9\x01\x7c\xb0\x9d\x36\xfa\x9a\xc2\x30\x80\x8d\x62\x26\x65\xd8\xc7\x53\x39\x9f\xab\xda\x6a\x2f\x68\x3f\x1f\x37\xd2\x4c\x19\xca\x43\x2c\x02\xf3\x2b\xe4\x57\x56\xb2\xa9\x4a\xc0\xe4\xf4\xb9\x1d\xe6\x56\xd3\xd5\x35\xed\x62\xdd\x28\x01\xee\xc7\x66\x48\xf1\x28\x80\xb8\x06\x1d\x36\xa2\x9c\xcd\x54\x51\xca\x56\x55\x4b\xcf\x17\x2e\x1a\xcc\x78\x73\xbe\x98\x4c\xb0\xee\xb5\xd4\x91\x4e\xd6\x4a\xa9\x23\x99\xec\x80\x86\x2e\x14\x1e\xb9\x59\x5e\x41\xcb\x0a\xda\xef\xd1\x41\xc4\x31\x78\x27\xf5\x44\xff\xdf\xec\x16\xa3\x32\x68\x7b\xeb\x56\xdf\xe5\x1a\xe3\x50\xf9\x1d\x88\xd2\x1c\x5b\xf6\xac\x8a\x81\x08\x14\x01\xab\x8d\x92\xd4\x9f\x68\xa3\x08\x1c\x62\x50\xa3\x84\xba\x4c\xd9\xd2\x5f\x35\x46\xdd\xb4\xb2\x02\x04\x8d\x48\xea\x8d\x81\x94\xc2\x3e\xc0\x60\xde\x81\x71\xd3\x75\xc6\x72\x1a\x3c\xe6\xc0\x9e\x38\xb3\x4f\xd1\x54\xf9\xbe\x97\xcf\xb9\xda\xed\x08\x9e\x01\x37\x34\x3c\x04\x36\x85\x7a\x4d\x98\x8d\x11\x18\x93\x5b\xa0\x68\x02\x41\xe8\x89\x66\x8b\x0e\xc4\xa0\xe6\x95\x66\xbf\xc8\x74\xcb\x5b\x9c\xd7\x30\x36\x7b\x1c\x1d\xf0\x7b\x3f\x2d\x5c\x42\x5a\x45\xa1\x96\xad\x72\x76\x10\x2e\x5b\xd1\x82\x47\x04\x70\xe3\xa2\x3b\x04\xd6\x48\x9c\xb8\x7f\x3f\x7f\xf0\x0d\xa7\xd2\x20\x8d\x6e\x05\x64\x41\xe7\x74\x7a\xb4\x0e\xbc\xd0\x07\x27\x76\xb1\x98\x57\xe5\xd8\x76\x1d\xeb\x66\xb1\x92\xab\x81\xf4\x71\x08\x12\x63\xb5\x9e\xc2\x9d\xc4\xe8\xe1\x7c\xa5\x9a\x65\x48\x58\x28\x51\x71\x13\x5c\xc9\xb5\x44\x93\xd9\xca\xf3\xfe\x5c\x2d\x75\x5d\x88\x5a\x8d\x95\x31\xb2\x59\x46\x54\xe2\x32\xa6\x58\xae\x97\x9f\x01\x59\x14\x34\x03\xce\xef\x7c\xe6\x77\x72\xba\xb9\xd3\x0d\x6d\xeb\x76\x47\x5f\xcc\xf2\x1d\x8e\xd6\x42\x25\xc7\xd9\xbf\x12\x35\x7e\xd5\x8c\x3a\x36\x1d\xce\x68\x70\x66\xdf\x3c\x81\xf9\x53\xfb\x5f\x72\x32\x49\xc6\x59\x2b\xd7\xf8\xd9\x45\x97\xcb\x23\x00\x3c\x64\xf5\x2a\x99\x62\x97\xe2\xf2\x8f\xda\xb4\x7e\x4e\x9d\xbb\xe6\xb9\x82\xac\xc4\x73\x3c\xf9\xed\x86\xb5\x67\x48\x55\xd6\x8a\x8e\xfa\xb7\x8a\xa4\x06\x44\x6b\x26\x85\x9f\x2e\x8e\xc0\x37\xc9\x6a\x98\x80\x6e\x88\x82\x87\xd5\xb4\x41\x22\x78\xfd\xf2\xe9\x8d\x57\x4d\xb6\x57\xaf\xb5\xbe\xe1\x96\xc8\x3d\x3f\x53\x9f\xd2\x47\xaf\x74\xd3\xca\x2a\x78\xf8\x1a\xb6\x72\xf6\xda\x8a\x1c\x18\x92\x5b\x15\x9f\x08\x2a\x7f\xeb\x12\xf0\xa5\x88\x33\xbc\x42\x64\x27\x50\xd3\x8e\x03\x1d\x26\x5c\x03\x7f\xae\x47\x3a\x72\x68\x46\xef\xea\xc8\x77\x93\xc3\x3f\xe6\x43\xfd\xce\x07\x83\xa8\x0e\x67\xec\x5d\xad\x7c\x8b\xbc\xc6\x2e\x6e\xa1\x8d\xf2\x4c\x80\x25\xe6\xac\x9c\xa9\xc6\x64\x06\x3e\x1a\x89\xd3\x56\xcf\x0d\xa0\x1a\x7a\xc7\x0a\x4c\x36\x96\x37\xcf\xb5\x53\xb5\x04\xc3\xc6\x39\x42\xb1\xcd\x54\x81\x15\x95\x13\xc0\xc3\xd4\x75\x5b\xd6\x0b\x30\xc3\x48\x51\xc9\x56\xd9\xdd\x3e\x51\x4d\xa3\x0a\x51\x59\x35\x18\x30\x8f\x9d\x15\x68\x51\x97\x80\xe5\x66\xc9\x72\x78\x27\xbe\x20\x08\x6d\x30\xbb\xfe\xce\x3a\xd8\x37\xc1\x05\x01\xf3\x10\xb3\xcf\xc3\x40\x8b\x9d\xbf\x2f\x08\x79\x1d\xf3\x37\x30\xbc\xe2\x62\x86\x77\x08\xdc\x03\xf8\x37\xb9\x41\x72\x53\x8b\xa3\xc7\xb9\x7d\xad\xc6\x8b\xc6\x94\x57\x56\x7c\x5e\xb1\xc7\x5d\x4f\x7d\x7d\x1d\x4a\x5a\x51\x65\xfa\x5d\x84\x9c\xb9\xd1\xe8\x63\xc1\x2d\x1c\xfd\xd6\xea\x41\xe5\x09\xe6\x35\x94\x40\x92\x89\x28\x84\xec\x82\x8d\x62\xfa\x29\xbc\xe8\x53\x49\xd3\xc6\x74\x30\x8c\xf7\x5d\x7e\x67\xad\x9a\x8f\xf0\xa3\x60\x00\xc1\x75\xc9\x58\x37\xc5\x21\xd8\x59\x82\x3d\x9e\x71\x67\x72\x39\xec\x57\xda\x64\x1e\x3c\x70\x97\xba\x49\xfd\xbc\x15\x71\x27\x6e\xd6\x4e\x2a\x4d\x7a\xf2\xdc\xc4\x30\xe5\x59\xa1\x87\x8f\xdb\x88\x71\xa1\x89\xda\x1d\x2f\x6f\xcb\xaa\x82\x03\xb1\xb7\x41\xc1\xd7\x6a\xac\xca\x2b\xf5\xaa\xd1\xf3\x10\xe4\x6e\x03\x5e\x14\x77\x37\x9e\x42\x48\xed\xfd\x5a\xfd\xb8\x50\xa6\x65\x03\x17\x2c\xf4\xe6\xf3\x98\x31\xcf\xdf\xbf\x2f\xee\xe6\x4c\x67\xbe\xdb\x2b\x0c\x6b\x61\xb6\x41\x2f\x83\xf6\xfa\x54\x18\x91\x8f\xcd\xb2\x1e\xc3\x25\xbb\xfd\x68\x38\x1c\x6e\xc5\x2e\x48\xf1\xf0\xf4\x3c\x3b\xba\xa2\x2c\x0e\x3f\xcd\xcb\x46\xfd\x84\x61\xde\x38\x9a\x28\xb9\x61\x70\xcd\xf1\x0d\x64\x8d\x74\x5d\xb0\xfa\x24\x5a\x17\xae\xa5\x11\xe7\x95\x1e\x5f\xa2\x55\x75\x26\x41\xd8\x68\x94\x2c\xac\xa6\x19\x7a\x5f\xb0\x04\x74\xe3\xd4\x0c\xc4\x06\x45\x12\x13\xcd\x4a\x42\x79\xab\x1b\x9a\xbf\x84\xa3\xde\x30\x77\x77\x33\x34\xf2\xf9\x73\x57\x30\xa3\x6a\xd3\xcb\xe5\xe4\x5e\x19\xee\x18\xf0\x48\x1d\xb8\x5c\x28\x90\x1c\x18\xb8\x97\x37\xdc\xdb\x33\x6e\x18\x3a\xe5\x3d\x0f\x0f\x94\x20\x7e\x6f\x0d\x5f\x5e\xd7\x97\xb5\x3c\x3f\xa0\xe6\x78\x26\x31\xde\xfe\x9f\x63\x2a\x5f\xab\x99\x02\x6f\xaa\x6b\x45\x55\x58\x55\xd8\xf9\xb5\x84\x36\x67\x77\xd3\x82\xa3\xee\x3a\x89\x4c\x2a\x39\x53\xe3\xa9\x6c\x5a\x34\xab\x01\xd0\xaa\x42\x48\x58\x34\xbf\xcd\xec\x61\xe5\x2e\x08\x36\x99\xc1\x60\x07\x25\xe2\x5d\xe6\xec\x4c\xf6\xfd\x3f\xc7\x0c\x47\xc4\x5a\xb6\x46\xcc\x65\x43\xb8\xc1\xb7\x27\xd9\x58\x06\xa2\xee\x6e\x28\x77\xdd\x9e\x7c\x83\xc9\xdf\x40\x68\xeb\x2e\xc0\x73\x59\x56\xaa\xf8\xef\x65\xf8\xf9\x96\xa1\x73\x86\xf4\x9e\xd5\x68\x4d\x86\xa3\x03\x0c\xd9\xb5\x28\x21\xf9\x13\x21\xed\xc0\xcb\x73\xbd\xa8\x0b\xd9\x2c\x7b\x37\xad\x66\x72\x10\x64\x8e\x00\x10\x2a\x82\xf5\xec\x58\x66\x6f\xbf\xac\xeb\x26\x67\x9d\x0a\xd9\xdf\xba\x91\x85\x63\xdf\xd6\x36\x90\x51\xff\x82\xe3\x21\xd1\x00\x43\x63\x6c\x42\xed\xc1\xc4\xfc\x52\x93\xf1\x13\x15\xe4\x0c\xfd\xdc\x28\x3d\x3e\x15\x3d\x57\x40\xc8\xce\x3d\x6f\x46\x2c\xd9\x58\x03\x5f\x21\x76\xac\xd4\xba\xd7\xab\xea\x2b\xa4\x95\x17\x1a\x81\x0b\x9a\x7e\xec\xe5\xb0\xd1\x12\xa5\x4e\x0e\x51\x0d\xbb\x5f\x4d\xd2\x37\xde\x4e\x8b\x38\x59\x71\xab\xe7\xa2\x52\x57\xaa\x02\xb1\xcd\x9d\xbc\xcf\xd8\xb1\x34\xd6\xff\x64\xa3\xf8\xca\x87\x9c\x5b\x4b\xf2\x88\x0b\x05\x6a\x94\x37\xcf\x1a\xa5\x04\x87\x56\x94\x10\x8d\xe9\x84\x69\xa7\x63\x22\x66\x7d\x5e\xc5\x2c\x6b\xe1\xbc\xef\x52\x3d\x93\xd5\xcb\x58\x7f\xec\xaf\x39\xad\xfd\x62\x81\x8b\x69\xb3\x98\xb7\xaa\xf8\x61\xf9\x4b\x6d\xa7\xce\x6e\xf0\x94\x86\x41\x18\x41\x1f\x32\x9b\xa9\x53\x66\xd8\xca\x0b\xb8\x92\x62\x73\x5d\xe8\x19\x9d\xb0\x6d\xbb\xa8\xdb\xb8\xa8\xb8\x93\x44\x50\x15\xba\xf3\xf0\x55\x66\xa3\xea\x42\x35\x3d\xe7\x37\x1d\xde\x2e\xf1\x30\x6e\xb4\x02\x27\x13\x9a\x5a\x83\xb3\x7d\x64\xe7\x12\x7b\x2e\x02\xa8\x4d\xe7\x62\x6c\xe3\x3e\xdf\x09\x7a\x0e\x5c\x6c\xdd\x1e\xf8\x83\x78\xd4\x09\x43\xa1\x3e\x9d\xc1\xfd\x0b\x90\x5e\xc7\xe5\xa4\xf7\x55\x9b\x0c\xa0\x56\xba\x24\xbe\xa8\xdb\xb2\xc2\x24\xfa\xea\x53\x48\xcb\x81\x25\x8f\xcf\x1f\xaf\x8b\xad\xd9\x55\x56\x0f\x5b\xfb\xfa\xe6\xa3\x17\xed\x0f\xbf\xf0\x11\x13\x7b\xec\x78\x7d\xfc\x16\x0e\x3b\xb6\x78\xfe\x62\x0a\x4e\x73\x9e\xb6\x90\x1d\x05\x8d\x62\xc4\xa0\x21\x3e\xd4\x65\x14\xbf\xf4\x2c\x6c\xc2\x1a\x6e\x9c\x8c\x55\xf4\xfb\x22\xef\xc8\x95\x3d\x5a\x77\x6f\xb9\x69\x1e\xae\x6a\x74\x3f\x88\x79\x4e\x5b\x01\x28\x4d\x74\x5a\xa0\x3d\x13\x6d\xa3\x5b\xae\xfa\xba\x1e\xa2\x01\xaf\x43\x61\x9b\xd3\x4c\xb2\xd7\x72\x24\x63\x37\x59\xfe\xf9\xa6\xbb\xcb\xb2\x6e\x34\x58\x9a\x5f\x76\xa3\xdd\xe4\x7d\xb6\x66\x87\xc0\x1d\x15\x75\xf2\x86\x6d\xf2\x0f\x1b\x0e\x1e\x42\x0b\xc4\x59\x5b\x39\xb4\xdd\x8d\x87\x9e\x5d\xe7\x70\xe0\x3b\x74\x24\x2d\x10\xfc\x4c\x9c\xe9\x56\x56\x1d\x0a\x88\xa7\x6a\x8d\xb6\xea\x08\xc0\xee\xd0\x7d\xf0\xef\xfc\x27\x5b\x7f\x59\x55\x76\x44\x9e\x83\x1c\xa3\x0b\xc9\x0d\x14\xf0\x8f\x1a\xcf\x2f\x48\x00\xab\x46\xbe\x8e\x04\x56\xcf\x56\x4a\x04\x7c\x91\x6e\x39\x84\x2a\x9e\x9d\xeb\x45\x7b\x8c\x3e\x63\xff\xa1\xda\xfd\x69\x59\x15\x84\x98\x43\xc8\x9b\x18\x55\xf6\x8c\x82\x3d\x39\xf4\x89\xdd\xb3\x67\xaa\xb9\x50\x85\x20\x68\x4c\x81\x78\xb4\x0e\x20\xb8\x95\xe3\x4b\xf2\x05\xc6\x02\xe0\x96\x8f\x71\xc5\x62\x2f\x0e\x33\x56\xb3\x79\xbb\x3c\x81\xef\xb7\x76\xd3\x26\xa5\x38\xd7\xba\x52\xd2\x2a\xfb\x05\xa4\x15\xac\x2f\xc4\xf5\x54\x81\x3a\x80\xfe\x24\xd8\x01\x4a\x27\x55\x5f\x28\x72\x16\x2d\xca\xe2\x15\x6a\x07\x96\x31\xaf\x69\x1f\x18\x33\xb6\x1c\x7b\xa2\x47\x82\x5e\x32\x50\xd4\x0c\xa4\x49\x46\x8c\x17\xe4\x0b\x8e\x24\x6b\xb5\x15\x50\x85\x1c\x8f\xad\xde\x40\x33\x48\x06\x19\xae\x50\x4e\x5a\x34\x4b\x62\x5e\xb7\xaa\x51\xb2\x58\xda\x8a\xe6\x0b\x70\xc0\x73\xa2\x19\x7f\x40\xa9\x99\x9a\x01\x01\x4a\x5f\x3b\x37\x6e\x58\x13\xfb\x41\xe9\xe6\x9d\xfc\x93\x79\x18\x7e\x85\x83\x59\xdf\x8d\x23\xab\xde\xd4\x33\x69\x2e\x15\x53\xc3\xca\x60\xbc\xa9\x34\x27\xd7\xb5\xaf\xb1\xe4\xda\x5f\x51\x07\xd3\x2f\x77\xef\x38\xa1\xc2\x7f\x18\xb8\x2e\x1d\x4d\x02\x13\x15\xb8\x1e\xa5\x43\x16\x65\x6b\x54\x35\x19\x58\x0a\x00\x6f\x7d\x8c\xbf\x68\xdd\xf2\x70\x55\xc9\x74\xf2\x5c\xda\x92\xfa\xba\x16\x63\x4b\xed\x7e\x49\xc3\x25\xb4\xd4\x17\xd7\xe5\x1a\x0f\x10\xad\xee\x19\xa5\xee\xe5\xab\x1b\x0a\x90\xdd\x27\x1a\xe4\x77\xec\x61\x90\xe9\xc9\x11\x54\x1f\xe9\x60\xcb\x75\xa3\xac\x4d\xcb\x0e\x56\xdd\xa1\x47\xae\x51\xc9\x72\x26\xe1\x5c\xdd\x2d\xe7\x83\xdc\x62\xfb\xfc\x78\xaa\xf2\xab\x3c\x10\x8b\x98\x0a\x06\x22\xfa\x19\x86\x64\x62\x90\x67\x27\x0a\x73\x68\x5a\xd9\xaa\x97\x94\x20\x8a\x8b\x0d\x3f\x7c\x00\x57\x67\x00\x59\xae\x65\x75\xac\x66\xba\xfc\x9b\x2a\x1c\xd1\xc5\x7c\x28\xe9\xc5\x26\x35\x1d\xe7\xea\x49\x6a\x49\x62\x09\x8f\xd7\xd0\x7b\x67\x26\xfc\xd0\x09\xe2\x34\x19\x36\x63\x8a\x06\xcc\x8f\x01\x3e\xed\xab\x61\xf8\x8c\x77\xc4\xdd\xf0\x61\x82\x7c\x1f\x6d\x54\x9f\x47\xf4\x19\x78\xcc\x36\x0a\x58\x19\x40\x62\x40\x27\x1d\xdd\x2c\xea\xca\xf2\x1c\xee\x7c\x9e\x4f\x22\x00\x9e\x84\x60\x44\x00\x2f\xd7\x81\xb7\x30\x25\xbe\x2b\x6b\xb1\xa8\x9d\x87\x1e\x58\x66\x80\x95\xad\xbc\xb3\x0d\x1d\x8c\x67\x72\x29\xda\xa6\xbc\xb8\x80\xc4\xf9\x93\xb2\x2e\x5b\x05\x3a\xa6\x81\x38\xc9\x55\x55\x50\x2b\x06\x42\x1a\x5b\x35\xbc\x25\xad\x81\xbd\x82\x8a\xde\xbf\xff\x95\xb4\xb7\xd7\xa1\xbe\x64\x61\x6e\x4f\x88\x6e\xfd\x02\xda\xa0\xc3\x56\xc0\xb6\xef\x73\x76\xda\xb2\x16\x39\x92\xa0\x67\xef\x20\x43\x6d\xa7\x7f\xf0\x78\x37\x46\xc1\x58\x17\x02\x9f\x32\xf6\xae\xad\x04\x7c\xbc\xec\x8a\x40\x2f\xfa\x61\x97\x06\xdc\x19\x8f\x8f\x6d\x25\x0e\x70\x4e\x5b\x11\xc0\xb8\x2e\x52\x6f\x2b\xa4\xed\x7d\xcb\x98\xba\xa4\x8b\x11\x3d\x63\x59\x93\xbb\xf8\x8d\xc4\x1f\xf9\x95\x82\x7f\x32\x71\x5a\x23\x1c\x7a\x02\x32\x6a\x90\x24\x2a\x69\x4c\xe0\xb9\x5c\x1a\x5a\xe2\xb6\x84\xa2\x46\x93\xcf\x9b\x5d\x29\xb7\xf8\x09\xbd\x79\x6f\xb6\xdb\xf0\x56\xea\xb7\x9f\x84\x98\x93\xc7\x0c\x6b\x2a\x99\xef\xa3\xda\x57\xf4\x23\xd7\xf4\x95\x72\x4f\xfe\x10\x70\xa7\xf6\xbe\xae\xcd\x22\xb9\xbd\x62\x8f\x37\xf6\xd5\x83\x5d\x11\xe3\x39\xd8\x0d\xe6\xbd\xff\x22\xee\x26\xee\xe6\x02\x5f\xbb\x62\xc2\x4f\x6b\x30\xd8\x5f\x6b\x5a\x9d\x3b\x3c\xc8\x5c\xb3\xc0\x83\x57\x75\x2c\xde\xf6\x6e\x89\xe6\x7a\xde\x5f\x39\xd7\x0c\xc4\xb2\x4b\x05\xbb\x47\xb2\x2f\x91\x74\x93\x61\xc0\xa8\x33\xc8\xf9\xc3\xce\xfe\x32\x0d\x2f\xcc\x74\x4d\xcb\xc1\x6e\x2f\xca\x02\xe9\x0e\x7b\x73\x37\xd3\xc4\x90\xe4\x77\x67\x49\x7e\x2a\xca\xfa\x4a\x36\xa5\xac\xdb\x1c\xcc\x0e\x6f\xdb\x89\x5e\x60\x3c\x27\x89\x62\x67\xfe\x62\xef\xeb\x81\xed\xb6\xc4\x8e\x00\x76\xf1\x10\x2c\x2b\x08\x9a\x93\x99\x15\x37\xc0\x60\x02\x6d\xd9\x35\x53\xed\xa6\x62\xc5\x9c\x36\xda\xf2\x9f\xf0\x04\x70\xd7\x75\x12\x55\xc1\xd5\xc2\x14\x92\x78\x74\xae\x61\x26\xef\x94\xdc\xf7\xd6\xee\x86\x5d\x62\xa9\x67\x27\x07\x27\xa2\x7f\x7e\x25\x17\x17\xd3\x7a\x4b\xbc\x46\x18\x1a\x8e\x28\x9d\xca\xab\x52\x37\x04\x10\x52\x07\x8b\xb5\xc5\x5e\xc0\x93\x45\xbb\x68\xd8\x07\xf8\x08\xc5\x08\x82\x17\x51\xb5\x90\x45\x81\x0e\xc3\xcf\xf9\x7a\x79\x26\xd9\xe1\xbf\xbf\xa8\xcb\xba\x55\x35\x02\xc4\x6c\xf9\xd6\xca\x5a\x9c\xa2\xd6\x84\x1b\x90\x5c\x89\x1d\x67\xbd\x48\xb4\xd2\xbb\x51\xe8\x70\x0a\x18\xf5\xf5\x2e\xe2\xc1\x2d\xc7\xdd\x1b\x75\xe3\x77\x51\x1b\xef\xd3\x8b\x8f\xdb\x7c\x9b\x78\x81\x75\x81\xa8\xbe\x35\x19\xee\x56\x1a\xce\xb1\x6f\x37\xc1\xa2\xf5\x91\x1a\x35\x28\x9b\x11\xb5\x6d\x71\x08\x26\x80\x43\x92\x9e\xe3\x26\x58\xfc\x59\x2f\xe0\x38\xa5\xa4\xb5\x18\x4f\x9e\xa9\x44\xd7\xe2\x5b\x23\x00\x7c\x70\xa6\xaf\x14\xd6\xd6\xed\x1a\x78\xda\x96\xed\xb0\x37\x10\x89\x3b\x7c\xf4\x33\x01\xc6\x89\x12\xc7\x46\xfb\x22\x16\x97\x62\x81\x9e\x77\x34\x13\xc0\x0a\x91\x23\x45\x59\xe8\x25\x83\xeb\x39\xd7\xd6\x15\x77\xfe\xf9\x0f\x92\xce\xac\x22\x59\xbc\x00\x48\xef\xcc\x6f\xdd\xe9\xc0\x8c\x13\x88\x89\xc4\xaf\xfe\x44\xd2\x62\xd0\x2c\x13\xa5\x63\xcd\x99\x32\x24\x56\xe6\x18\xf3\xb7\xa6\x3b\x8e\x1d\x90\x4a\xef\x7d\x6b\xee\x71\x1e\x70\x02\x1f\xc8\xd6\x6b\x29\x60\x93\xbd\x37\x08\x06\x11\xb2\x69\x1c\xe9\xcd\x02\xec\x8a\x88\x8f\xae\xdc\x9a\x76\x70\x10\xf5\x79\x40\xc4\x2c\x12\x39\xd6\xd9\x25\x2c\x2b\x97\xe3\xb6\x1c\x83\x1b\x1e\x6d\x37\x5d\x2b\x0c\x23\x28\x6b\x8a\xf3\xbf\x56\xe2\x1a\x22\xac\xc0\xe6\xc3\x87\xd8\x51\xdb\x33\x60\xaf\xe0\xea\x8c\x9e\xa9\x73\x5d\xb0\x2a\xb5\xb0\xc4\x73\x5e\xa9\x0f\x78\x95\x48\x38\x8e\x47\x75\xab\x6d\xf7\x64\x59\x83\x2d\x93\xc2\xab\xe8\x48\xe1\xaa\xdc\xc1\xc9\x3e\xee\xce\xb6\xe4\x84\x58\xb7\xd9\xcf\xd8\xc4\xe1\x9c\xd6\x28\x62\x94\x2b\x73\x00\x36\xb6\xc3\x7a\xd1\x82\x6f\x0d\x99\xc1\x9a\xe8\x16\x0f\x2d\x4f\x86\xcc\x59\x04\x93\x64\x4f\x84\x20\x1d\x3c\x9c\x0b\x46\xb5\x43\x77\xbb\xdf\xc8\x06\xc0\xf2\x21\x38\xc4\x4e\x13\x84\x64\x36\x43\xf1\x56\xf5\xaa\x4a\xc8\xca\x68\x66\x30\x60\x5d\x7b\xf6\xea\x68\xb8\x6e\x9b\x6c\xa6\x4e\x10\x63\xf9\x20\x8d\x29\x2f\xea\xfe\xdf\xbf\x24\x87\x6f\x4c\x0a\x19\xa9\xe8\x06\xa3\xd6\x3a\xf9\x31\x29\x9a\xe8\x8f\x41\x1c\xc9\xed\xf4\x5b\x34\x32\xda\xbe\x45\x16\x50\x69\xe0\x82\x6b\x69\xff\x08\xf1\x4c\x54\x0d\x60\x1d\xb8\xf6\x76\xad\x2e\x9a\xb2\x65\x95\x88\x6c\x6e\xae\x65\x08\xdc\xb1\xfb\x1b\x50\x8b\xc4\x52\xb5\x03\x07\xa3\x00\x2d\x82\x17\x8e\x6c\xc5\xa4\x6c\x0c\xa4\x69\x21\xf8\x22\x02\xb6\x13\x65\x6c\x4f\xa3\x90\x0c\xb0\xd7\x51\xc6\x21\xd4\xd8\x82\x9e\xb3\x7a\x3f\x63\xc5\x19\x4c\xcb\xfb\x79\x1e\xbb\x89\x42\x9f\xa9\xe0\xf3\xe7\xc4\xe2\x19\x7b\x85\x66\xec\xb2\x5e\xdb\x44\xb3\x2a\x08\x47\x65\x8b\x03\xe2\xd9\xab\xa7\xaa\x29\xdb\xe0\xf3\x9e\xb1\x52\xe1\x36\xf9\xa5\x6c\x43\xf4\x13\x26\xf2\x77\x51\xce\x65\x2d\x8b\x2b\xd5\xb4\x18\xfb\x02\x5e\xd0\x11\x9e\x84\xc8\x58\x6b\xd7\x99\xf4\xd6\xc8\xb4\xab\x67\x74\x20\x32\xc6\xd9\x0d\xe4\xdd\xf5\xaa\x65\xa6\xd6\x4e\x30\x65\xa8\x0a\x32\x41\xa8\xf5\x3b\xa7\xa3\x74\xdc\x62\xb3\xdc\x75\xe5\x72\x67\xdd\x21\xab\x20\xad\x26\x83\xb1\xb7\xeb\x58\x15\x03\xe4\x63\xe0\x70\xbf\x8c\x36\x62\x19\x47\x32\x36\x20\x2c\x58\x30\xa6\x48\xbb\xbd\xc0\xcc\xec\xb7\x0b\x86\x52\x5d\x96\x73\x72\x0b\x67\x30\x1a\xbb\x73\x81\x90\x2c\x45\x15\x48\x75\x66\xff\xcd\x30\xf2\xb4\x02\x32\x34\x81\x55\xaf\xac\x96\xc0\xe1\x67\xf3\x05\x5a\x53\x88\x6c\x90\x72\xc9\x83\x19\x77\x28\xd0\x91\x23\xcb\x9c\x86\x93\x2e\x5d\x42\xcc\xec\xca\x78\xfb\x2d\xbc\x17\x37\x4f\x82\x3b\xec\x62\x56\x66\x94\xd0\x55\x21\xfa\xba\xc1\xcd\xee\x6d\xeb\xb0\x79\xf1\x26\xe5\xda\x9e\xdc\x6e\x42\x8e\xd0\xce\xe3\x50\xaa\xbd\x67\x6c\xc8\x5a\x1d\x3e\xcc\x95\x6a\x8c\x42\x80\x6d\xf2\x92\x59\xaf\x8c\x67\x36\xd9\x6a\xbd\x3c\x5b\x78\x34\x12\x2f\xf5\xb5\xe7\xf6\x76\x00\x8e\xe3\xd7\x05\xe2\x3f\x10\x90\x55\x6a\xdc\x5d\xcb\x19\x82\xa9\x5c\xd5\xcf\xcd\xd5\xdf\xcc\xf7\x91\xfb\xd6\x57\x4d\xd3\x4f\x6b\x3e\x83\x67\xe7\x14\x9a\xbf\x67\x99\x6c\x62\x69\x5f\xcd\x73\xbb\x65\x6f\xe4\x8c\x41\xa4\x64\xd0\xad\x49\x59\x17\x24\xc3\xa4\xb7\x6e\x71\xb4\xae\x73\x96\x76\x61\x20\xda\xe1\x41\x03\x6d\xaf\x16\x1e\x77\x81\x29\x80\x08\x50\x4e\x44\xd9\x62\x85\x33\x79\xa9\x8c\x30\xaa\x36\x0a\xd6\x09\xd2\xbd\x82\x39\xa7\x44\xa4\x40\x8a\x5f\xe6\x7e\x78\xa3\x5b\xd6\x28\x97\xd7\x24\x1c\x77\x35\xd8\x2f\x66\x68\x94\xfe\x48\xcc\x28\xe8\x3a\xb1\xbc\xfe\x32\xac\x36\x80\x0b\x9d\x24\x11\x9e\xf6\x31\x0c\xec\x6e\xc6\xa7\x91\x23\xe8\xe2\x03\x0a\xf0\x3c\xbb\xd8\x90\xb6\x22\x77\xfc\x6c\xce\xdb\x52\xff\x02\x9a\xa7\x1c\xa2\xa8\x10\x77\xe9\x6d\x6e\xc6\x9f\x83\x05\x2d\x40\x6b\x29\x54\x2b\xc7\xd3\xce\x12\xfc\x02\x53\x2c\x3c\x0e\x2a\xb6\x91\xdc\x4a\x26\x73\x13\x9a\xb6\xed\x90\x5f\x6a\xc0\x64\xdb\x13\x0f\x77\x7d\x56\xa1\x37\xe0\xb1\x28\xf4\x5c\xfe\x68\xcf\xb2\xe5\x5c\x21\xb8\xd4\xe1\xe9\x8b\xb2\x6e\x85\x55\xb3\x2a\x46\xcd\x43\x99\x73\x59\xb7\xf2\x13\x65\x61\x5b\xd6\x63\xb1\x27\x1e\x21\xc0\xd5\x4b\x48\xdd\xb5\x27\x1e\x3f\xfa\xfe\x37\xdf\xff\xf6\xc9\xaf\xbf\xff\x0d\xb4\x73\x2c\x3f\x59\x99\xf8\xc9\xe3\x1d\x71\x2c\xdb\xe9\x70\xae\xaf\xfb\x8f\x07\xe2\xc9\xa3\x2d\xb1\x2d\x1e\x61\x45\x6f\x5e\x1e\x9d\x7d\x38\x3d\xfa\xdf\x87\xb6\x36\xc2\xcb\x3a\x7e\xf6\x1f\x47\xfb\x1f\x5e\xbe\x39\xfe\xe1\xf0\xf5\x87\x93\xe7\xcf\x4f\x0f\xcf\x6c\xe5\x08\x68\xf7\xc8\x85\x19\xab\x4f\xf3\x92\x12\x04\x03\x16\x4b\xa3\xe6\x96\x15\xd5\xad\x11\x8f\x1e\xce\x42\x60\xdc\x99\x39\xd3\x87\xae\xf4\x59\x39\x53\xfd\x99\x71\xfb\xff\x19\xe6\x59\x96\x45\x01\xf3\x31\x99\x18\xd5\x86\xd8\x78\x88\xec\x61\xf7\xd1\xd4\x9f\x75\x33\x79\x51\x8e\x45\x8d\x28\xd2\x13\xcd\x73\x3c\xf4\x6b\xd2\x9f\x19\x31\x0a\xc6\xf7\x59\x3c\xdc\x12\x0f\x72\x83\x4b\x6e\x8e\x15\x5c\x19\xf6\xeb\xc5\x0c\x0e\xf8\x71\x69\x4a\x5d\x47\x26\xfc\xbe\x7d\x29\x46\xfe\x2d\x57\xfe\x68\x4b\x7c\xe7\x9f\x26\xf5\x82\x08\xa2\xfc\x3c\xfc\xb0\x18\x5f\xaa\x96\x1d\xec\xed\xac\x0c\x82\x39\x3d\xaa\x8f\xcd\x40\x9c\x43\x99\xd3\xf2\x6f\xea\xd8\x44\x5d\xe0\x5e\x06\x5f\x8b\x07\xc9\xe7\xe1\xf0\xe3\xaa\xc2\x37\x5b\x01\x99\xfa\xf3\x82\x48\x01\x92\x2b\xa0\xcf\xa0\x41\x7a\xbb\x13\xb8\x48\xfc\x20\x8b\x63\x39\x7f\xa5\xab\xe5\xc4\xea\x50\x81\x1f\xa0\xc7\x87\x42\xd6\x54\x1f\x7e\x6a\x55\x0d\x6a\x1b\x1e\x2c\x62\x4f\xe0\x1f\x43\x7b\x56\xa9\xba\xa5\x02\xba\x36\xfd\xbf\x7f\x61\xf9\xe0\x3b\xa1\x4c\x55\xd6\xed\x76\x81\x29\xb8\x44\xad\xb7\xad\x90\x40\x59\xb4\xec\x9f\xc7\x72\xde\x7f\xf7\x2e\xd3\x02\xba\x08\xbd\x7f\x4f\x75\x31\x8e\x5a\xae\xe8\xfb\x4e\x7b\xe8\x56\x15\x35\xe7\xe1\xaa\x42\xa0\x22\xd8\xca\xfb\x1a\x82\x75\x9c\xb7\xa9\x90\xe7\x7a\xd1\x8a\x73\x59\x88\x39\x4d\x8e\x61\x4f\xcc\xce\x9c\x45\xf1\x85\xe0\x21\xf4\x9c\x9d\x44\x40\xc3\xd2\xb5\x90\xc2\xdf\x10\xc1\xae\xa8\x95\x2a\x0c\x1d\x35\x85\xae\xad\xd4\x06\x0e\x3b\xf6\x6f\xf2\xd1\xb0\xda\xdd\x1d\xb0\x55\x20\x5c\x55\x3b\x05\xd0\x6c\x04\xaf\xf3\xc7\xd1\x1d\xbf\xa0\x10\xbb\x04\xfe\x5c\xc0\x4c\x1e\xc5\xe4\x0b\x9d\xb2\xdc\xad\xdf\xca\x8b\x81\xb8\x54\xcb\x01\x7a\x8e\x03\x32\x3a\x9a\x9f\x18\xf0\x02\xb4\x47\x94\x81\x2d\x2d\x4c\x4b\x83\x47\xab\x68\xe5\xc5\x2e\x3f\xb9\x54\x4b\xb1\x67\xeb\x71\x4f\xc8\xe7\x80\xbd\x74\xe1\x99\x63\xaa\x21\x74\x3e\x64\xb6\x3b\x57\x0d\x15\x0a\x40\x00\x92\xaf\xd1\xf4\x95\x56\x59\x9e\x57\xe8\xb6\x1a\x3d\xe6\xa4\x11\x78\xa2\xc2\xa3\x46\x4d\xc2\x66\xe1\xd9\x9c\xc2\x98\xe0\x2a\x3f\xa9\x82\x75\x8b\xec\x4b\xd4\x81\xff\xe7\x42\x2d\x3a\x83\xe4\xef\xc0\x21\xa0\xd3\x62\x77\x96\xc1\x64\x90\x3e\xe4\x99\x21\x47\x49\xfe\x1a\xdd\xf4\xf0\xa3\x97\x1a\x5f\xba\x86\x6b\xf5\x89\x3c\x4b\x3b\xad\x82\x0d\x24\x79\x47\xaf\x2a\xd9\x79\xe3\x5a\x8b\xb8\x3c\x34\x89\x61\x36\x5c\xc0\x63\xcf\x74\x12\x45\xc0\xfb\x0f\x1e\xce\x26\xa4\x47\xf6\x3b\x0e\xca\x9c\x32\x46\xbe\xf7\xea\x0e\xde\x9e\x10\xca\x77\xf6\xe5\x0d\x01\x7a\x60\xf1\xea\x6e\x55\x0f\x01\xbb\x8a\x73\x25\x08\xb0\x5e\x84\x5a\xc9\xea\x6c\xa7\xd2\x68\xed\x20\x68\x08\x5c\xa5\x5c\xc2\x28\xae\x78\x20\x1a\x49\x3e\x82\xd2\x32\x87\x57\x27\xff\xe3\x24\x2c\x38\x10\xa6\x2d\xab\x0a\xfc\xec\x50\xb4\x21\x33\x19\x1c\xa6\x78\xe5\xa5\xab\x0a\xf0\xe8\x76\xe0\x4c\xdf\x12\x2f\x35\x98\x6d\xc9\x0d\x0c\xcf\xe2\xa5\x37\x17\x10\xd2\x19\x9a\xbf\x4a\x33\x74\xfb\xdb\xbd\x41\x18\x13\x5b\x9b\x10\xc8\x71\x8a\x72\x32\x29\xc7\x8b\x0a\x64\xe2\x79\xa3\x8a\x72\xdc\xa2\xb1\x0c\x70\x4f\x2e\x54\x2b\xf4\xbc\x2d\x67\xa0\x8d\x4b\xd4\x4a\x97\x10\xf9\x24\xab\x99\x36\x2d\xd5\x55\x83\x70\x53\xd6\x15\x98\xe4\xe7\x8d\x9e\xab\xa6\x02\x9b\xbf\xe5\x0d\xe5\x18\x98\x59\x59\xa9\xc6\x80\x8b\xe2\xe3\x74\x2c\x8d\x15\xfe\x74\x2d\x3e\xf2\x60\xf4\x44\x10\x14\x2d\x44\x43\x5b\xa6\xd3\x2a\xd3\x96\xf5\xc5\x50\xbc\xe5\x08\x6a\x6a\x5c\xa2\x6c\x02\xf0\xbc\x68\xe7\x6b\x19\x38\x0c\xe2\xa7\x47\x23\xf1\x64\xcb\x7e\x85\x40\xfa\x0c\x0a\xa6\x5c\x7e\x1c\x94\x58\x10\xe6\xb6\x5e\xcc\x54\x53\x8e\x31\x69\x2b\x60\xd1\xfa\x21\x2b\x69\x4a\x04\xba\xb5\xa4\xaa\xdd\xcc\x20\xf6\x4b\xad\xeb\xed\xff\x71\x74\x26\x54\x7d\x55\x36\xba\x9e\x01\xe7\x1e\x8d\xc4\xf7\xd0\x36\x5c\x73\x49\x53\x56\x4b\x71\xa1\xd1\x5e\x1e\x13\x0e\xf8\x9a\xa2\x57\x08\x9e\x2d\xe4\xe8\x59\x95\xad\x6a\x64\x65\x09\xde\x1e\x2b\xd4\x7a\x69\xc4\x44\x9a\x96\x86\xf7\xab\x2d\x71\xd4\x06\x08\x4a\x4a\x1a\x40\x35\x24\xb1\x14\x1d\x41\xa5\xd8\x17\xd8\x1a\x2c\x24\x60\xd2\xda\x67\x90\x8f\x0a\xd2\x04\x59\xba\xa5\xfa\xed\x7a\xc9\xd6\x9e\xbe\xe4\x45\x1b\x74\x2c\x44\x49\xd9\xe8\x9c\xf9\xe6\x79\xa5\xaf\x9f\x97\x9f\x8e\xd5\x0e\x0a\xc9\x53\x39\x27\x1c\x6b\xf5\x49\x8e\x5b\x01\x67\xe1\xf9\xa2\x15\xb6\xa0\x33\xcf\x5b\x9d\x20\x9c\x22\x13\xc8\xf2\xea\x7a\xd3\xc3\x2e\x49\x41\x82\x93\xe4\x12\xb3\xf5\x03\x0d\x32\x90\xdc\xee\xde\xf5\x2f\x86\xf3\x46\xb7\x1a\x48\xf0\xfe\x7d\x91\x79\x3c\x2c\x0d\x28\x29\xbe\xaa\xdd\x84\x45\x80\x52\xd3\x6a\x9a\x45\x2b\x41\x7b\x16\xeb\x02\xa2\x0b\xcd\xb2\xc4\x30\xcd\x87\x14\x03\xe9\xf7\x9d\xb1\x33\x3c\xe7\x42\xb9\xd4\xf2\x75\x6f\xa8\x8c\x8d\x13\x1e\x67\xc8\xf3\x79\x76\x5a\x4b\x4b\x76\x41\x1f\xc9\xb9\x58\x8a\x02\x72\xbb\x12\x52\xa6\xdd\x38\x73\xad\xd1\x8b\x4f\x8d\xa7\x75\x69\xd5\x25\xbe\xcf\xf1\xd0\xd9\xa0\x2b\xf4\xaa\x8a\x6b\x03\x1b\x02\xb0\x0e\xf0\x20\x96\xad\xb0\x3c\x45\xb4\xd7\x9a\x33\x0c\x18\xab\xc4\x20\xb6\x33\x6c\x7c\xdb\x0a\xd0\xd0\x3d\x08\xc8\xbc\x47\x39\xb1\xb8\x42\xd0\xff\xb8\x9d\x46\x89\x89\xd5\x38\x01\x26\x7d\x61\x94\xbf\x09\xaa\xe4\xdf\xec\x46\x64\x1f\x2c\x67\x19\x97\x55\xa5\xd1\xc5\x9b\x2b\x84\xa4\xd8\xb4\x15\x0d\x23\x33\xd4\x17\x14\x99\x69\x29\x18\x59\x1f\x0a\x0e\xc5\xd0\xee\x43\xb8\x48\xb2\x55\x5d\x8b\x85\xdd\x79\x5c\x57\xa3\xc6\x95\x2c\xf1\x9e\x0c\xeb\xb5\x32\x45\xb3\xb4\x53\x6f\xc7\xcf\x36\xb3\xee\x7a\xf9\xcd\xc7\x6b\x3f\x04\x9a\xe7\x1f\x40\xfb\xfc\x23\xbb\x07\xba\xf5\xb2\x24\xe7\x2a\x24\xb7\xd1\x4e\xb9\x50\xba\xe3\xc2\x81\x85\x3b\x72\x82\x18\x8d\xc4\xc1\xe1\x7f\x6e\xc3\xba\x4e\x4a\x55\x15\x9c\x99\x31\xa9\x33\x90\x20\xb8\xca\x10\x12\x6f\xe5\x17\x4e\x9e\x88\xbf\x8a\xb3\xee\x64\xbf\x64\x59\x23\xfe\x30\xc8\x29\x42\xf1\x68\xc9\xc7\xa1\x28\x14\x25\xea\xe8\xec\xa1\x6c\x16\x98\x14\xa0\xf4\xad\xf7\x08\x67\x6b\xbf\xab\x60\xe8\xcd\xc9\x56\xb9\x06\x2a\x41\x01\xae\x95\x17\x39\xca\x58\x21\x36\x7a\x53\xbb\xab\xa0\x2a\x4d\x4b\x1e\x1a\x15\x26\x13\x80\x7b\x8f\x6c\xa5\x19\x71\x33\x53\x2a\x2f\x79\x76\x8a\x65\xa4\x50\x9a\xe9\x74\x28\xa9\x4c\x1a\x3f\xd8\xed\x7e\x91\xc8\xf8\xe1\xcf\xdd\x4c\x03\xac\x65\xf0\xba\xc1\xef\x4c\xb5\xa9\x7a\xc0\xe5\xa3\xe7\x6b\xbe\x63\xf5\x20\xfd\x0e\x9e\x67\xbe\x8b\x35\x0e\xfe\x2a\x78\xea\x1c\xa8\x00\x6e\x97\xaf\xce\xf5\x95\x6a\x9a\xb2\x28\x54\x1d\x46\x83\xbb\x2b\xc0\xf8\xba\xbc\xdb\xaa\x57\xaf\xdc\x8e\xc6\x27\x99\x1e\xb2\xce\xe5\xf9\x4b\xa1\x3e\x65\xca\xa1\x22\xc6\xa5\x1a\x35\x09\xef\xde\xd2\xad\xf1\xa5\x93\xf3\x8f\xcd\x9e\x61\xb6\x97\x08\x1c\x2f\x60\x82\x5c\x96\xc1\x34\x9c\x51\x24\xc4\x4e\x25\x23\x6b\xb7\x25\xa8\xe3\x79\xa3\x67\x87\x28\xf7\xf4\x29\x65\x78\x4e\x7c\x58\x7d\xaa\xea\x44\x79\xc1\x3d\xce\x4f\xa9\xca\xe1\x07\xcd\x1c\xc6\x5d\xb2\xf3\x80\xbc\xdd\x32\xf0\xe5\xe7\xef\x00\xc9\x92\xf8\x19\x2a\xe1\xfc\x06\x94\xf1\xd8\x63\x0d\xbf\xcd\xaa\x35\xdc\x58\x2a\xf6\xb4\x90\x14\xf8\x69\x34\xab\xb1\x45\x7d\x8d\x58\xb7\x13\x7d\x96\xcf\xce\xb6\x4e\x20\x73\x1d\xe3\x33\xc8\x9f\x3d\xf8\x38\xd9\xdb\x3c\xf4\x39\xef\xbd\x20\x54\xb7\x33\x05\xa6\xb5\xdb\xa1\x33\x01\x29\xf9\xfc\xdf\xef\x28\x0a\x15\x2e\x6b\x49\x2e\x95\x15\x48\x97\x7c\xe1\xd1\x43\x43\x6a\x2f\x90\xc6\xfc\xad\x8c\x34\x80\x4c\xe9\x6e\x36\x08\x96\x12\x2d\xbf\xa4\xb7\x51\x4c\x90\x57\x8d\xf8\x2c\x1a\xc6\x96\x32\x7b\x70\x2c\xed\xe1\x2d\xcc\xd2\xb4\x6a\x06\xee\xea\xae\xa5\xf3\x46\x5f\x12\xcc\x14\x79\x0c\x80\x9a\xa7\x67\xe8\x8d\x64\x86\xe1\xf9\xd3\x28\xf4\x13\xa4\xea\x5a\xdd\x28\xd7\x7a\x92\x0a\x84\xd4\x37\x9f\xaf\x04\xef\x14\x8d\xbb\x85\x0c\x83\xff\x20\x42\x29\xe6\x29\x4f\xc5\x5b\x52\x5b\xe3\xc1\x5f\xa8\x96\x51\x12\x54\x21\xe8\x96\x89\x63\xb4\x82\xa6\x09\xce\x53\xd6\x28\x2c\x62\xf3\xd8\x13\xdd\xd0\x5b\x8e\x73\x1b\x57\xba\x56\xa2\x6c\xc3\xb1\xe2\xcc\xce\x1b\x7d\x2e\xcf\x2b\x08\x00\xaf\x40\x32\xbc\x96\x4b\x94\x40\x71\xe7\x2d\x1a\x74\x7a\x1d\x46\xd4\xf9\x95\x74\xe5\xad\xb7\x51\x62\x3a\x11\x21\x67\x38\x8a\x73\x09\x7b\xc4\xe7\xcf\xe2\x56\xe4\x48\xa6\x11\xab\x13\x23\xe7\x18\x56\xaa\xbe\x68\xa7\xf0\xe5\xc3\xd0\x07\x95\xb3\xdd\xf5\xc0\xb7\x93\x6e\x75\x26\xba\xb9\xd0\xac\x73\x5b\x95\x74\xa9\x17\x81\x7d\xd3\x7b\x8f\xc1\xed\x4e\x4f\x3c\x10\xf7\xc0\x07\xcc\xbb\xf8\x0d\xec\x1a\x2c\xf5\x82\x54\x78\x90\x9d\x66\x00\x0b\xbe\x98\xbb\xf4\xcd\x10\x8d\x28\xed\x2e\xc0\xeb\x74\x33\xbc\x17\x7b\x7a\x76\xd3\x2c\x22\xbb\x7e\xba\x2a\x1b\x5c\x82\xb9\xe3\xd2\xce\xf9\xec\x11\xc9\xa8\xff\x52\xff\xa5\xde\x47\x5c\x62\xa0\x7e\xc8\x4b\x48\x2e\xb0\x7a\x22\x3e\x76\x12\x65\x7e\x1c\xa6\xd0\x1d\xe4\x9d\xd0\xb9\xca\x44\x12\xc0\xb5\x81\xc8\x10\x10\xe1\x76\x84\xbb\x69\x93\x02\x59\x9f\xe8\xdb\xbd\x79\xbe\x28\xab\x76\xbb\x0c\xb0\xee\xcd\x16\x6e\x1b\xb8\xec\x1c\x05\x90\xad\x94\x5f\x31\x01\xce\x37\x5b\xb0\x3f\x2f\x74\xbb\x23\xbe\x35\xc3\x6f\x4d\x6f\xc0\xd4\x82\x74\xf1\x14\x7f\xee\x84\xa4\x34\x80\xa9\xd8\x4a\x62\x80\xba\x09\x32\xc3\x13\xd2\x04\xc2\x7b\x27\xdf\xdf\xea\xa3\x14\x8b\xde\x28\x37\xde\x46\x1e\x60\x3c\x66\x16\x08\xcc\x26\x12\x01\x9c\x1f\xeb\xc5\x15\xae\x77\xfd\x51\xb3\x6e\xe7\x9b\xdd\xcd\x47\x7c\x8b\x01\x9f\xa9\x4f\x2d\x7a\x67\xdc\x56\xfa\x59\x75\xac\x9e\x81\x37\x07\x4a\x65\xb7\x19\x27\x75\xe2\x97\x19\xa6\xed\x18\xdb\x42\x9f\xeb\xe6\x40\x55\xca\x16\xdb\x40\xc8\x0c\xa4\x84\x9c\xa4\x19\xc9\x06\xbd\x83\xc3\x17\x87\x67\x87\x07\xbd\x5b\xf5\x6d\x5f\x56\x55\x7f\x2c\xf3\xf3\x75\xbb\xf9\xb7\x55\x05\x1d\x06\x08\xab\x9b\x09\x8e\xcd\x00\xb6\xf4\x54\xd6\x45\x85\x7b\x2c\xbf\x4a\x12\x99\xe1\xcf\xbf\x44\x08\x92\xde\xc7\xf2\x2f\x21\x77\xd9\x4f\x9d\x8e\x04\x77\x7d\x23\xaa\xfc\x39\x87\x84\x40\xf0\x7d\x70\xec\xfa\x19\x56\xd7\x63\xcb\x0f\x04\xd6\xb9\xc1\xe2\xa6\x4a\x32\x7e\x07\xba\x6f\xa3\x6a\x2b\x07\xbc\x7b\x7f\xab\xd1\x27\x51\x41\x94\xe6\x11\x7d\x95\xc0\xdb\xe7\xa8\x9e\xe8\x1d\xd7\x50\xf8\x14\xd5\x19\xea\xd1\x3e\x75\x81\x52\x41\x5a\x19\xea\x0d\x79\x7e\x04\xa9\xea\x49\xc0\xc4\x23\x31\x32\x53\xbb\x26\x12\xeb\x35\x64\x7f\xdf\x70\x91\xac\x06\xd9\x8f\xbb\x28\xa6\xcb\xa2\x91\xad\xf2\x7e\x4f\xcb\x71\x05\xd7\x17\xa4\x38\x95\xba\x26\x33\xe2\x78\xaa\x64\x8b\x98\x96\xb0\x85\x48\x56\x6e\x40\x40\xb1\x02\xa5\x4f\x68\x32\x1a\x09\x3f\x63\x56\xfc\xae\x97\xec\x72\xbc\xa8\xcb\xba\x6c\x4b\x59\x95\x7f\x53\xc5\xf3\x68\xd9\x13\x85\x98\x15\xc5\x46\xeb\xd6\x4f\x3b\xe7\xd7\xec\xd6\x33\xc8\xad\xcb\xc6\x0b\x42\x7e\xe2\x33\x59\x42\xaa\xb0\x88\x0e\x76\xe8\xc2\x10\x0b\x81\xf1\xbb\x58\x3e\xd7\x0d\x02\x8b\xec\xe0\x2d\xdd\x80\xce\xf3\xba\x34\x53\x84\x26\x0d\x6b\x26\xe7\x9b\xf0\x11\xf7\xa3\xfb\x86\xd6\x64\x87\xff\x18\x90\xaf\xc0\xa7\xd6\x21\x26\x41\xca\x06\xf8\x84\x29\xa0\x3b\x21\x11\xd5\xda\x59\x0c\x08\x05\x7f\x92\x8b\x85\xae\x71\x24\x8e\x48\xa2\x14\x82\xd1\xdb\x37\xf5\x8c\x90\x58\x7c\x81\xa9\x34\x2f\xf4\xc5\x85\x2a\x0e\xc1\xb9\xc9\xdd\x5a\x86\xb8\x07\xed\x78\x0a\x6f\x4d\x7f\x12\x7b\xad\x78\xb1\x4c\x36\x0e\x05\xc6\x3b\x6a\xf8\x72\x35\x14\x20\xd3\x65\x9c\xa4\x2b\x94\xfd\x9b\x05\xdc\x5a\xdc\x8d\x3b\x15\xca\xae\x9d\xee\xae\x8f\x09\x43\x64\x35\x4e\x37\x2a\x54\x3d\xc6\xcb\x5f\xb8\x1e\x44\x7f\x2e\x2b\x2f\xf6\x06\xf6\xef\x4c\xa4\xd5\x97\xd4\x03\xdb\x6a\x16\xec\xa0\x66\xfa\xcc\xcd\x82\xb8\x06\x12\x2f\x3f\x7c\x78\x7d\xf8\x6c\xff\xec\xc3\xc1\xe1\x7f\x9e\x9d\x9c\xbc\x38\xfd\xf0\x1f\x2f\x4e\x7e\x78\xf6\xe2\xc3\x1f\x4f\x4e\xfe\xf4\xe1\x03\xea\x30\xdd\x7c\xcf\xe0\xbd\xea\xba\xbb\x22\xfa\x81\x7c\x65\xb4\xbe\x14\x7b\x37\xb4\xc3\x37\x25\xb6\xf0\xb0\x34\x07\xe8\xf2\x52\x84\xde\x26\x78\xc7\x60\xf5\x4a\x29\x1a\x25\x2b\xba\x0e\x6d\x97\x1c\x97\x60\xbf\x45\xe5\xb7\x6c\x39\xb3\x04\x58\x7c\xe1\x46\x51\xe8\x85\x8b\x61\xd1\x13\x3f\xd3\x18\x38\xe1\x15\x7a\x69\x8c\x1e\x63\x60\x38\xad\x91\x81\xe7\x95\xbe\xf0\x3a\xf8\xb4\x6d\xe7\x66\x67\x34\xba\x28\xdb\xe9\xe2\x7c\x38\xd6\xb3\xd1\x44\x8e\xd5\xb9\xd6\x97\x23\x70\x0d\x1c\x81\x23\x9d\x19\x3d\xf9\xed\x6f\x7e\x13\xce\x8e\x77\x78\xe1\xab\x76\x3b\x60\x06\x2a\x7a\x5e\x06\x19\x29\x12\x28\x34\x47\x29\x67\x1c\xd6\x01\xb9\xdf\xe9\x3e\xc7\x0e\x29\x21\x21\xb8\x9d\xd4\xe0\x38\x0d\x41\x46\x65\x55\x81\xc7\x28\x5c\x86\x41\xa4\x9f\x73\x28\x63\xf5\x3f\xad\xcc\xb9\x07\x12\xd4\x5a\xdc\xc2\x10\x6b\xe1\xb9\x98\x9c\x0f\x67\x0a\x47\xbf\x5d\xa8\xab\xd6\x16\xe9\x45\xb0\xa8\xa3\x51\x40\xe0\x94\x3c\x1b\xb0\xb5\xdb\xa9\x5e\x5c\x40\x10\x06\xdf\x51\xb2\xef\x1f\x72\x98\x55\x33\x18\x7b\x5a\x91\x31\xa2\x81\xeb\x0f\x24\x24\xd8\x05\x01\xf1\xef\x06\x17\x06\xa0\xec\x9a\x05\x40\xf8\x4c\x16\x15\x5c\xab\xff\x15\x54\xbe\x81\x30\x1a\x8e\x1a\xbc\xf0\x36\x72\x82\xfe\xf6\xca\x9e\x9c\x50\x33\x51\x42\x8e\xa3\x45\x4c\xc8\x71\x9d\x26\x02\xd3\xa4\xa1\x40\x1f\x3b\x75\xf4\xfd\x38\x06\xc0\x40\x79\x0e\xe9\xdf\x15\x8c\x32\xdf\x6e\x94\xe3\x64\x4d\xc3\x54\x4f\xd4\xb6\x8f\x97\xe6\xc6\x73\x0c\x11\x60\x1d\xec\x43\x59\x55\x94\x17\x30\x88\x38\x83\x5b\xda\x9a\x67\x10\xe0\x9d\xd9\xb0\xee\xce\x11\xd8\x7b\xc3\xb5\x34\xbf\x21\x77\x1c\x46\xec\x91\xb3\xcd\x77\xc9\x6e\x5d\xec\x0a\x4f\x0b\x2e\x85\x5b\xb6\x80\x63\x66\x56\x3d\x6b\x23\xce\xac\x2c\xaf\xe6\x97\x6c\x93\xbc\x08\x09\x80\x41\xae\x59\xb7\xee\x37\xb7\x1c\xd7\xba\x9b\xa2\x86\x15\x65\xf1\x56\x36\x35\x63\x23\x9a\xb2\xa0\x3c\x24\x91\x67\x3b\xac\x32\x66\x5c\x40\x07\x03\xcb\x49\x38\xc8\xa7\x20\xb0\xd1\xb2\xbe\x82\x6b\x5e\x5d\xdf\x81\x2f\x4e\xcb\xfa\xa2\x5a\x8a\xaa\xac\x2f\x55\xb1\x0d\x97\x65\x7a\xe2\xe2\xa1\xd0\xae\xe8\x12\x00\xc3\x4e\x63\xb9\x63\xc0\xbe\x26\x10\x7f\xde\xea\x3b\x64\xa7\xfc\x11\xee\x73\x28\x76\x31\x4e\x28\x4d\xc6\xd8\x6e\x4e\x7d\x14\xad\xc1\x6c\xda\x5e\x6b\xac\xc2\xd8\x0a\xed\x30\x8c\x9a\x4b\x2b\xfb\x70\xc4\xf5\x52\x98\x29\x78\xe1\x84\xe2\xb2\xb3\x30\x0e\xef\x8c\x46\x41\xce\xdc\x34\x78\x92\xed\xb6\xb6\x02\x0c\x78\x2c\xbc\x0d\x2e\xdf\x2f\xc8\x68\xec\xda\x46\xc1\x90\xcf\xb3\x68\x7c\x76\x00\xb2\x25\x67\x26\xba\x26\x2f\x27\x64\xad\x0d\xeb\xb5\x15\xda\x99\x3b\xd7\x0d\xb0\x32\x5b\x13\xfd\x48\x3a\x38\xd6\x57\xb0\x83\xce\x97\x60\x78\x85\xfc\x1a\xb6\xb7\x7c\xd5\x44\x83\x3d\xcb\x75\x1e\x17\xc2\xb6\x43\x0e\xcc\xc2\x2c\xce\x2d\x83\x4c\xd6\x06\xca\x71\x4d\xce\x90\x0c\x0e\xeb\x90\xa6\x14\x70\x0e\xb9\x9b\x9d\x56\xce\xd5\x58\xcf\x94\x09\x6b\x1c\xde\xe9\x28\x1d\x6f\xfc\xa5\x5e\xff\x5c\x1a\x05\x57\x82\x5e\xe9\xfb\x91\xee\x00\x71\x6b\xb8\x02\x3b\xfe\x4f\x14\x7c\xd5\x1a\x61\x1c\xae\x65\x43\xd9\xb9\x92\xf1\x6f\x4e\x47\xf2\xa2\x8c\x9f\x4f\xa5\x79\xae\x9b\x31\xf5\x31\x92\xe1\x4b\x73\xe4\x25\x69\x7a\xc3\x52\x36\xf6\x15\x27\xaf\x34\xaf\x30\x1a\x2b\xf1\xd5\x0b\x5c\xf0\x7f\xc4\x0b\xcd\x58\x00\x34\xaa\x69\x79\x57\xb7\x1a\xa7\x07\x0a\x32\xa1\x7a\x27\xf4\xb9\x55\x12\x60\x96\x3d\x5e\x32\xdc\x93\xd7\x05\x2f\xa8\xdd\xbd\x0c\xe8\x80\xfd\x02\x88\xec\x8c\x2b\xcb\xff\x64\xd2\x80\x50\x9a\x60\x20\x30\x89\x62\x4f\x84\x9f\x53\x83\x1d\xdb\xbb\x2f\x03\x17\xe7\x51\x41\xb1\xb2\x86\xa8\x7f\xa9\xd6\xbd\xc7\x0e\x99\x56\x3d\xcf\x16\xf9\x03\xd5\x35\xcc\xd9\x0f\x44\xfe\x9b\xbd\xfc\x37\x5d\x26\x9f\x2e\x48\x90\xfa\xa1\xb3\x20\x18\x38\x8d\x9e\x0c\xad\xb0\x22\x58\x0b\xee\xcb\x20\x9f\x06\xce\x3c\x45\x69\xda\xb2\x1e\xb3\x42\x4f\xbc\x8d\x75\x60\xe7\x01\x11\x65\x05\x88\xbd\x93\xdc\x06\x79\xe4\xde\x47\x77\xe4\xc1\x84\x3e\xca\x26\xab\x85\x9b\xad\xb7\xc9\x65\x13\xa6\x77\x83\x0d\x86\x1a\xba\xbb\x5f\xc7\x83\xe2\x5a\x21\x32\xa8\xcb\xd6\xc6\x21\x7b\x85\xb2\x94\x08\xae\x96\xe1\x95\x15\xe5\xb8\x40\xb4\x44\xe2\x03\xc2\xef\x1e\x87\x6f\xe2\x29\xce\x72\x55\xd7\x3a\x70\x97\x9a\x75\x01\x88\xa0\x88\xbc\x0a\xc0\xb9\x11\x25\x1f\x70\x84\x7c\x09\x71\x55\x73\xf0\xb1\x46\x71\x5f\xce\xe7\x4b\x8e\xbf\xb0\x4c\x6f\x3e\x6f\xb4\x1c\x4f\x87\x9e\x2e\xb2\xf3\xe7\x6c\x0e\x21\x8b\x0a\x50\x1f\xc2\x05\x78\x1c\x5d\x5d\xdb\x59\x4f\xd6\x2f\xc5\x6f\x77\x5f\xc5\xe5\xd2\xf5\x0b\x56\xf0\x71\x67\x05\x37\xaa\x65\xfd\x28\x48\xce\xea\x6c\xde\xc7\x91\x67\x4a\xf0\x90\xfe\xb0\xc3\xa1\x99\x7b\xca\xcf\x76\x22\x37\x77\x2b\x96\xc0\x19\x97\x15\x11\x08\x95\x04\x33\x85\xb8\x22\xde\x51\x78\xe8\xd8\xa8\x1d\x3f\x91\x70\xcc\x4c\x99\x0f\x3c\x8e\x2e\xe5\xf0\x51\x54\x12\xc2\xe4\xee\xae\x94\x94\x3a\xb0\xd5\x4e\x6e\xf5\x08\xf4\x7d\xc6\xbc\x1b\x70\x44\x3d\xfd\xd2\x10\xc2\x33\x76\x55\x5d\xcb\x70\x90\xa0\x61\x65\x47\xea\x07\x2a\xde\xc4\x0f\xc2\x9c\x9f\xf3\x45\x63\xfb\xe1\xb4\xbd\xbf\xa9\x46\x0b\x5b\xd1\x36\xba\x30\x99\xa1\x0f\xe0\x40\x47\x5d\x77\x51\x75\x50\x12\x60\x36\x5e\x6f\x21\x36\x0c\x67\xdd\xea\x39\x13\xc4\x3a\xf9\x31\xcd\xdb\x16\x42\x13\x34\xaa\x47\xc1\x8e\x96\xb3\xd1\xc1\x24\x8b\xee\x31\x24\x49\x8a\x00\xee\xa7\x3e\x95\xf1\x31\xd4\xa5\xe9\x35\x27\xdf\x23\xc7\x69\x77\x03\x95\x72\x37\xee\x1b\x81\xe6\xfc\x18\x1d\x63\x83\xf0\x9a\x1a\x7a\xa9\xc5\xb9\x6e\xa7\x01\xcb\xf5\x8c\x32\x3e\x1a\x3d\x99\xe5\x8f\xcc\x5b\xf4\x77\x4d\xd1\xc7\x9b\x0c\x0d\x7a\x6c\x4f\x72\x2f\xc3\xd3\xe8\x5c\xce\x0b\xbf\xd3\x5c\x6a\x4d\xb8\xf6\x74\x5f\xde\x89\x30\x45\xf4\xc4\x49\xc7\xb2\x02\xd9\x19\x38\xe8\xa9\x1e\xf8\x84\x5c\xb8\xca\x92\x84\x0c\x0d\xeb\xad\x27\x77\x9c\xf3\x01\x54\x3b\xbc\x73\x8b\x99\x18\x8d\xc4\x0f\xe8\xe3\x00\xce\xfe\x6e\x61\x98\x6c\xa6\x4a\x7c\xb4\xa3\xf9\xe8\x40\x4c\xf4\x84\xd7\xc0\xb1\xa2\x54\x7e\x48\xb0\x43\xb1\x1b\x49\xe4\x5e\x2e\x0d\xa7\x0b\x30\x5d\x09\x67\xb7\x22\x00\x95\x84\x37\x8e\x12\xf1\x16\xb3\x98\xf7\xae\x3c\x95\xa3\x62\x9d\x84\x97\x99\xba\xe9\x61\xf0\x5d\x47\x6a\x49\x26\x01\x78\xd4\xf3\x46\xcf\x28\x35\x25\x7e\x3a\x70\xb1\x11\x88\x02\x40\x9c\x0c\xbc\x28\xbc\xdc\x3d\x97\x8d\x3d\x9f\xd9\x71\x8f\xc4\xa4\xf0\xe9\x6e\xac\xe0\xc6\x1f\x64\x15\x5b\x3f\x3b\xcf\x6b\x8c\x47\x8d\x2a\x4b\x86\xf8\xbc\x1e\x5a\x86\xd5\x5f\xd3\xdb\x8e\xe0\xe9\xf1\xaa\xa2\x9a\xbf\xe4\x00\xe0\xc2\xf3\x70\x05\x50\xc6\x80\x39\x5b\xd8\x07\xf0\x2a\x47\x79\xe3\x30\x23\x69\x06\x49\x92\x72\xf9\x91\x86\xe9\xba\x43\x0b\xb1\x2f\xb9\x73\xa8\x21\xc7\xf8\x15\x0a\xdc\x20\xd4\xfd\x32\x6a\x1b\x4f\x39\x3d\x66\x8a\xfc\xd1\xcb\x16\xac\x5c\xad\xf5\xbe\xe4\xd3\x31\xd0\xbd\xc2\x1a\x87\x89\x22\xd6\x55\xc5\xa2\xd2\x89\x9b\x00\x7d\x42\x1a\x5a\x54\xd2\x41\xd9\x78\x8d\x2d\x7a\x6f\x1f\xf1\xeb\x44\x1b\x8b\xca\x45\xef\xf8\x03\xe7\x3a\x8a\xfe\xd8\xc4\x50\x23\x3f\x60\xc7\x25\x41\xb9\xc7\x8c\xb6\xe4\xa5\xec\x34\xdf\xa1\xaf\xce\xf9\x27\xcf\xf8\xe1\x2a\xad\x72\x85\x5e\x89\x27\x6d\xe2\x24\x32\x1a\x89\x53\x45\xd1\x2a\x93\x4a\x5e\x04\xf8\x37\xd7\x24\x60\xb1\x68\x02\x2a\x39\x9a\x95\x5d\x06\x36\x3e\x8b\xb9\x2e\x6f\xb4\xb2\x82\x19\x66\x6f\x0a\xe1\x7c\x57\x68\xad\xde\x6a\x7b\x27\xf1\xc5\x76\x97\x61\x69\x4c\xf5\x90\x52\xde\x99\xcb\x72\x0e\x7e\xb9\x10\x95\x45\x26\x8c\x81\x0b\x78\x18\x8d\x44\x59\x5b\x3a\x67\x6c\x76\x39\x1e\xeb\xa6\x00\xd3\x93\x63\xf6\x6b\x63\xf3\x7e\x3e\x35\xe6\x67\x55\x62\x7e\x36\x15\xe6\x06\x05\x06\x12\xcc\x13\x93\x8e\x15\x90\x1f\xbb\xd4\xcf\x6c\x86\x3f\xf8\x31\xde\xc0\x1d\x76\xba\xa2\x5c\x97\x63\x74\xfc\xb9\x3d\x21\x05\xcd\x47\x94\x44\xf6\x4b\x5d\xb7\xc7\x0b\xfb\xd5\x2b\x66\xee\x41\x29\x7f\x60\xb8\x4e\x00\x57\xd8\xf5\xd6\x4f\x40\xdb\x09\xec\x2a\x84\x1d\x41\x5f\xa5\x5a\x97\xaf\xf0\x70\x63\x43\x40\x78\x5c\x1f\xa6\x26\x87\xd5\xe7\x40\x78\xf1\x45\xbd\x71\x28\x5e\x74\x79\x31\x99\x94\xe3\xd2\x32\xec\x79\x53\x6a\x40\xff\x42\xf0\x20\x76\xa1\xe4\x8b\x91\xec\x7d\xb3\x9b\x91\x5c\x8f\xb1\xcf\x2b\xbf\x8c\x8c\x29\xab\x4a\xfd\x21\x3b\x53\xe1\x25\xe9\x68\xc4\xca\xcb\x7a\x56\xe0\x3e\x58\x6b\x83\x39\xcc\x8e\xe3\x4b\x30\x9e\xbb\xb4\xde\x61\x1f\x3c\x09\xc4\x37\xb4\x5d\x92\x35\x9e\x36\x7d\xb5\x04\x3f\x0d\xb9\xea\x69\x6b\xc2\x16\x27\x6a\xa0\x52\x8e\x06\xe9\x71\xed\xc0\x41\x84\x4b\x75\x1f\xc5\xcb\xe4\x16\x7e\xe5\xa2\xbb\x4f\x8e\x26\xf6\x0c\x72\xa9\x08\xd8\xde\x0b\x47\x8f\xe5\xa3\x73\x55\x0c\x44\xd1\x68\x82\x97\x62\x4d\x92\x6d\xd4\x78\x9a\x9f\x3b\x13\x8a\x2c\xae\x64\x3d\x66\xe1\x60\xaa\x64\xc7\x1c\xb8\x6a\x5a\x63\x8b\x5f\x66\xd0\x9e\xbf\x50\xa1\x8e\x65\x22\x31\xf3\x85\x0e\xa3\x5f\x92\x99\xa2\xa3\x26\x3d\xae\x2c\xed\x7f\x48\xc4\xd0\x10\xd5\xc4\xef\x4a\x08\x35\x04\xad\xdc\xb7\xcf\xac\x6b\x23\x31\xd8\xa4\x42\x25\x50\xd6\x5a\xd6\xd4\x49\x84\x97\x76\xf5\xeb\x1b\xb6\x03\x8b\x6a\x8b\x9c\x6a\x27\xa2\x9f\xe9\x59\x58\xa4\x13\x5d\x7a\x54\x5c\x8a\xa9\xbe\x06\x02\x87\x98\xe1\x29\xfa\x64\x43\x38\xf2\x30\xf8\x8e\x27\x2d\x84\x65\xa4\x2e\xc6\x1d\xf2\xfb\xac\x93\x0e\xb0\x5b\xcb\x4d\x35\xf8\xbd\x9c\x9d\xf1\x28\x8b\x79\xe4\x0e\x1c\x12\x00\xc8\x53\x45\x4a\xc2\xb1\xa0\xb5\x22\x75\x3e\xd5\xc1\xe2\x5a\x26\xd5\x62\x60\x65\xd7\x82\x6f\xc2\xb8\xbc\x09\x99\xf5\x87\x50\xe8\x73\x2c\x3a\x7c\x18\xad\x72\x5c\x3a\xb3\x89\x6e\xae\x4f\xec\x91\xb7\x5a\x38\x97\xd1\x67\x43\x80\xec\x8a\xec\x0b\x58\x6e\x15\x5b\xfb\x72\x27\x12\x21\xa2\xd6\xd2\xc9\x59\x19\x7c\xf7\x79\xcf\xdd\x39\x26\x31\x1f\x39\xc6\x01\x26\xba\xdc\x9a\x45\x3e\x24\x2a\xb1\xeb\x0c\x39\x86\x1c\x80\xc4\xdc\xb9\xb9\x56\x9d\x89\xe2\xed\x72\xec\x2f\x77\xa2\xac\x39\x4d\x62\x61\xfd\xa5\xd3\x21\xe6\x4e\x80\x5e\x23\x58\xc7\x60\xa3\xa4\xbd\x52\xd5\x09\x02\xcf\xac\x6c\xdd\x1d\x2e\xdf\x04\x8d\x53\xa4\xf2\x8d\xa8\x0f\x34\xd4\x75\x84\x17\x5a\x9f\x02\x15\x04\xcf\x0d\xbb\x05\x60\xc5\x00\x4e\xfc\x52\x21\x86\x19\xe8\x48\x85\x83\xd9\x25\x3d\x24\x84\x6f\xc1\xa4\x0c\x59\xfa\xe5\x25\x71\x20\xca\x25\x02\x4e\x95\xe2\xf7\xd1\x88\x28\xbe\x62\x57\x94\x0f\x1e\x74\x25\x3a\xf2\xc4\xe5\xc2\xef\x4a\xda\x15\xd1\xb6\xf4\xc4\x3e\x0e\x88\xb3\x73\x60\x63\x40\xc5\xb9\x43\xf6\x55\x85\x90\x17\xb2\xac\x87\x62\xbf\x52\x92\x52\x5c\x71\x95\x46\x13\x38\x6f\x5d\xb9\xb3\x97\x26\x80\x87\x2d\xd2\x56\xa3\x23\xf1\xae\xf3\xe6\xf2\xaf\x13\x03\x4a\x0e\x55\xec\x08\x83\x1d\x84\x6c\x2e\x16\x10\x05\x31\x97\xd8\x53\xe3\xfa\x36\x14\x87\x3e\x10\xc2\x9b\x9c\x8f\x28\xa7\x51\x83\xc9\x5d\x0a\xf2\x4d\x73\xcd\xa7\x00\x62\xee\x05\x5a\x64\xe2\xbc\x18\xe4\x1f\x38\x91\x97\x8a\x3d\xd6\x8e\x3c\x08\xe8\xdf\xbf\xa0\xff\x5f\x69\x9e\x35\x8d\x5c\x8a\x3d\x01\xff\x0e\xe9\xf7\x6e\xc7\x95\x01\x90\xda\x61\x97\x3d\x83\xe3\xc3\x8e\x0c\xdd\x28\xc9\x32\x87\x75\x06\x59\xd3\x4e\x6a\x9a\x89\x7d\x3f\xb9\xde\x87\x86\xbb\x8e\xae\xdf\x71\x94\x0a\x1b\xfc\xa3\x69\x67\xab\x2f\xad\xc9\x8a\x25\x01\x44\xee\xfe\x70\x38\xdc\xda\xf1\x73\xec\xec\xb0\x7a\x8e\xb8\xfa\xe2\x23\x7f\xfe\xd1\x2f\x13\x47\xa3\xe1\xed\xc0\xda\x45\x01\xd0\x76\xd7\xed\x81\xeb\x0c\x4e\xbd\x0f\x82\xc5\x00\x7e\xa3\xc5\x45\xa3\x8d\x21\x2f\xba\x9e\xf1\xf7\x8f\xb5\xae\xb7\xc7\x4d\xd9\x96\x63\x59\x81\x29\x9e\x3c\xec\xd8\xd1\xa1\x24\x8b\x2e\xf8\xde\x2d\x8c\xc2\x98\xad\x4a\xcd\x8c\xc7\x07\x98\x29\xc2\x08\xb9\x28\xaf\x6c\xff\xeb\x72\xac\x1a\x02\xab\x9b\x29\x63\xe4\x05\x58\x9b\xd9\x44\x20\xc7\xed\xc1\xc9\xf1\xa3\x5f\x0d\x37\x81\xd2\x6e\xb8\xf8\xaf\xbd\x6b\x3a\x56\x64\xa7\x78\x8b\x54\x71\x30\x58\x5c\x97\x60\x2b\x68\xf4\xb5\x11\x52\xdc\xfb\x90\x41\x3b\x65\x34\x74\x4f\xf3\xf7\xee\x10\x70\xc1\x58\xcd\xf9\x7e\x89\xe2\xb7\xd0\x39\xf2\x15\xb9\x23\xf6\x73\x74\x3c\x10\xbd\x5c\x33\xbd\x01\xd1\x91\x02\x7c\x14\x3b\xc6\xc8\x47\x00\x70\x5a\x77\x02\x5a\x0c\xdc\x50\x3b\xbb\x79\xed\x38\xae\x64\x59\x01\xac\x17\x43\xff\x89\x47\xbf\x7e\x40\x2b\x43\xe1\x64\x76\x75\x0c\x44\x83\x61\x1c\xd8\xa2\x6a\xcb\x79\xa5\xc4\x58\xcf\x4b\x65\xbc\x87\x21\xdc\x42\x37\x4a\xc8\xb6\xb5\x67\x28\xa5\x98\xaa\x95\xb1\xd3\x45\x75\xff\x8a\x7c\x3c\xe8\xd2\xca\x35\x89\x8f\xf1\xa6\x69\x83\x55\x1d\xd0\xb2\x95\xa6\xfe\x8b\xf7\x0a\x54\xc5\x50\x9c\x35\xcb\xf8\xfc\x70\xfd\x76\x77\x4a\x63\x3d\x5f\xfa\x5e\xf7\x6d\xb7\xcb\x42\xc9\xaa\x5a\x0e\x84\xb9\x2e\x21\x8f\x85\x76\x64\x36\x44\x5b\x29\x86\x02\x6c\x0d\x43\xcf\x45\x74\x7e\xa3\xc5\x9e\x34\x4a\xfd\x4d\x65\x17\xd9\xa3\xc9\x41\xa5\x70\x91\x9a\x5c\x0a\x84\x7c\x85\x6f\xf9\xc0\xcd\xa4\x0b\x91\xf7\x5c\x37\x94\x73\x9e\x6c\x23\x04\x47\x42\xbf\x02\xa1\xdd\xaa\xa0\x49\x8e\x23\x94\xa0\xe9\x4e\x34\xb2\x83\x34\xce\x20\x5b\x1a\xc2\x02\xdd\xf1\x7f\x92\x2b\x4c\x0d\xa7\xec\x29\x29\x20\x21\x01\x06\x76\xec\x40\x18\x0f\xf8\x4a\x94\xb8\x83\x03\x2e\x2e\x54\xeb\x33\x29\xed\x26\xd6\xcd\xe0\xd8\x4d\xe2\x29\x9f\x22\x2b\xdd\x11\xf1\x51\x2b\x92\xe4\x1c\x1d\xf6\x1d\xb0\xec\x1e\x1b\x27\x7b\x5b\xb9\xa0\xc5\x8e\x25\x61\xe5\x32\xf4\x43\x77\xc8\x44\x6a\xf0\xdd\x49\x2d\xd7\x79\x63\xb5\x88\x26\x6f\x27\x9e\x4a\x57\x86\x07\xe1\x87\xef\xdf\x39\x7d\x35\x62\x17\xf8\x06\x15\x99\xce\x0b\x2b\x9b\xef\xbb\x2a\x43\x63\x32\xbe\x73\x7e\xfe\x82\xad\xc8\x22\x73\xe5\x98\x73\x5b\xe1\xb2\x21\x41\x73\x91\xc4\x95\x86\x36\x55\x44\x66\xaf\x83\xfb\xf0\x3c\xa9\x99\x7f\x72\x1a\x0b\x6f\xf4\xff\x99\xe9\xcc\x7c\x15\x81\x59\x25\xe6\xff\x65\xfa\x8a\x2f\x4a\x32\xe4\xf5\x4f\x4b\x57\x81\x63\xc8\x3f\x33\x59\xc5\x6b\xfd\x53\xd9\x56\x4c\x6e\xff\x4c\x54\xe5\x24\x66\xaf\x55\x4f\xd5\xf8\xf2\x94\x30\x40\xe8\xec\x25\x53\x5d\x7a\x0f\xac\xab\x82\x0e\xf0\x5a\x5d\xd3\x5f\xba\x2a\xe8\xf8\xac\xd5\xb5\xff\x2b\x49\xf7\x03\xe1\xf1\x15\x23\xe7\x04\xfa\xc5\x1a\x2b\x45\x78\x6f\xbc\xba\xd8\x0a\x4b\x49\x98\x40\x24\x01\xcd\xf2\x28\x4b\x46\xc8\x9a\x8d\xf7\x68\xb3\x19\x84\x4e\xf5\x54\x51\x12\xb4\xe1\x8c\xb6\xb7\x48\xf4\xb0\x49\x4e\xd6\x7c\xa2\x31\x93\x5b\x98\x95\x38\x95\x69\xa2\xa8\x74\x01\x7b\xd9\xea\x7a\xd1\x96\xc2\x22\xce\x56\xb8\xbe\x27\x7d\x4f\x08\xd9\xe5\x77\x04\xda\xc9\x33\x95\xe5\x24\x56\x0d\x8d\xda\xbf\x1b\xf2\x23\xcc\xff\x94\xef\xc7\xd6\x8e\xc0\xa0\x5e\xf0\xe4\xf7\xe8\x10\xa8\x4d\x02\x50\x1c\x68\x9a\x9c\xb1\x1b\xb4\x92\xa1\x38\xf6\xb6\x1b\x1d\x2e\x34\xb8\xb4\xd9\xdd\x9d\x4d\x17\xb5\x2e\x39\x69\xc0\xe3\x62\xfa\x09\xc7\x15\xd1\x11\x2f\x7b\x0c\x26\x18\x3f\x19\x96\xe6\xd5\xa2\x51\x09\x96\x60\x1a\x13\x73\xd7\x4c\x01\x5b\xee\xf0\xc7\x85\xac\xfa\xdd\xdd\x0a\x3d\xed\x14\x4a\xb6\xef\x56\xd4\xb9\x4e\xc4\x52\x87\x75\x80\xd8\xce\xea\x43\x36\x03\xd1\x2f\xb0\x55\xc2\x43\x6e\xc3\x14\xb2\x21\x8d\xa3\xb6\xf6\x0a\xe1\xce\x43\x22\xc7\x17\x71\xde\xbd\xa8\x70\x7a\x0b\x91\x5f\x38\xc6\xe7\xf1\xeb\x47\x78\x1f\xab\x36\xae\xc8\xa6\xd8\x23\xcb\xca\x4b\x2d\x3e\xe2\xf7\x1f\x19\x30\xc4\x65\xa3\xc4\x3b\x47\x22\x7c\xaf\x3b\x01\xad\xf3\xa8\x76\x44\x51\x16\xa0\x5c\xca\xf1\xb8\x2c\x54\xdd\x5a\x05\x92\x97\x56\xd6\x0c\x27\xea\xee\xd0\x02\x60\xcd\xa7\x94\x70\x6c\xfd\x65\xc7\x2f\xd8\x75\x40\x76\x91\x84\x89\x87\x68\x31\xad\xaa\x01\x14\x13\x53\x02\x72\xfd\xc3\x4c\x4f\xd3\xad\x88\x60\xe6\xff\xa1\x5a\xba\x8f\x07\x82\x3f\xa9\x0f\x4f\x7f\x2d\xf6\x7c\x36\x9e\xe1\x45\x5c\xc0\xee\x9a\x55\xef\x1c\xc0\xa7\xdd\x05\xcf\xe6\xf3\x06\x0c\x49\xe1\x07\xd1\x8d\x2b\x4f\x54\xbe\x13\x98\xd2\x2f\x6a\x1a\x50\xc1\x89\x9b\x41\xaa\xc3\x81\x90\x62\x5e\xc9\xb2\x16\xff\x43\x5e\xc9\xd3\x71\x53\xce\x11\x5c\x9f\x63\x19\xcf\xc2\x24\x1c\xce\xda\x00\x66\x65\x28\xa6\x7c\x82\x61\xb4\x61\x60\x98\x24\x3e\xdb\x0f\x2a\x3a\x20\xa2\x99\x59\x7e\xe9\xe7\x5b\x92\x62\xee\x42\x57\x89\xc9\x76\x28\xc5\x4d\xf6\x01\x82\xf0\x00\x0b\xca\x4e\x76\x58\x20\x9d\xec\xf0\x5d\x76\xb2\xb3\x53\xdb\x69\x12\xa7\x36\x6a\xe8\xff\xe2\xd4\x42\xee\x08\xc6\x3f\x76\x13\xe9\xe7\xb8\x08\xfb\x49\xf3\xdb\xa1\x6f\x9c\x5f\xe6\xbc\x2e\xa3\x60\x34\xb9\x73\x7e\xda\x9d\xa5\xce\x87\x03\xd1\x73\xc5\xa3\xc9\x41\x39\xc9\xf1\xef\x30\x66\xf9\x5b\x33\x14\xd1\x60\x60\x78\x99\x11\xf9\x9a\x37\x1b\x4e\x92\x46\xd6\x8f\x28\x4d\x51\x9f\x1f\x54\x9c\x50\xb1\x17\x65\x7e\xfe\xb9\x87\x16\x55\xbe\x7e\x74\xee\x80\x3a\x8d\x85\xac\x54\xea\x1b\x67\xcb\xc5\x49\x66\xbb\x83\xcf\xd6\x0e\xdc\x18\x65\x5d\xe6\xc0\x74\x2d\x83\xde\xf0\xb9\x6f\xfa\x5b\x43\x11\xed\xfe\x15\x32\xd7\x53\xde\x16\x0a\x0f\xe1\xd2\x88\xf9\xb4\x91\x74\xfd\x22\xc5\x8f\x0b\x65\x40\x50\x08\x9c\x08\x45\x90\x6c\x1b\x3f\x57\x41\x9e\x33\x3e\x93\x48\x3e\x4b\x67\xf1\xab\x45\xa5\xe0\x60\xbe\x41\xb4\xbe\x9b\x07\x0b\xc8\x9f\x72\xd9\x79\x5d\x31\x59\xb4\xf5\xf3\xad\x92\x97\x79\xad\xe1\xbe\x0d\x53\x27\x4d\x55\x2d\xd4\xa7\x16\xb1\x2f\x88\x95\xd8\x91\x79\x98\x69\xac\x91\xe2\xdb\xb1\x28\x95\xf3\x03\x2f\x27\xf9\x0e\x31\xf6\xf4\xc6\x02\xee\x33\x08\xc4\xf0\x07\x75\x5e\x9b\x0f\xa8\xf0\xa0\x2c\x7c\x68\xf7\x4a\x0a\x0f\x4a\x6d\x4c\xdf\xfe\x9b\x4d\xa9\xdb\x7f\x61\x17\xe2\x87\x24\x35\xb1\x59\x8c\xa7\xa2\x2a\x27\x6a\xbc\x1c\x57\x0c\x89\x9f\x3b\x05\x5d\x7d\x6f\xcb\xaa\x72\x15\xae\x38\xf9\xc2\xee\xbe\xc6\xeb\x2c\x06\xdb\x59\x37\x1b\x51\xd1\xdb\x4c\x49\xf8\xe1\x2d\xe6\x25\xfc\xec\xb6\x93\x73\x34\x71\x73\xd3\x26\xc1\x0b\x28\x24\x94\xe0\x95\x30\xd7\xb5\x01\x0d\x0b\xf2\xbf\x01\x22\x38\x75\xd2\x56\x62\x19\x43\x34\xb1\x69\x8f\xd2\x56\x26\xaa\x1d\x4f\x45\x21\x5b\x69\xd5\x34\xa8\xa3\x59\xd4\x51\x48\x90\x7d\x31\x5b\x20\xf0\x8f\x11\x72\xd2\x2a\xba\xd0\x80\x39\x21\x44\x6e\xe8\xe7\x9b\xa3\x81\x88\x7a\xe0\x62\x86\xfa\x5b\x37\x71\x71\xea\x6c\xa9\x36\x58\xd9\x4e\xd9\x8d\x97\x36\xfd\x72\xd3\xb5\x4d\xbf\xeb\x70\xf5\x35\x93\x9e\x25\xe9\xa9\x34\xe8\x98\xe4\x10\x90\x23\x39\x03\x87\xb4\x06\x8a\x39\x1d\x63\xf2\x75\x07\x87\xf2\x6e\xd2\x60\xa8\x58\x40\x1c\xb6\x1d\xb6\xa5\x26\xf0\x12\xc6\x7c\xf0\x1f\xbf\x35\x1f\x07\xa1\x4b\x86\x06\x87\x00\x44\x8e\x5c\xcc\x7d\x44\x10\xb6\x09\xa1\x59\x31\xe4\x64\xcf\x44\xb9\x17\xac\xb4\x80\x2e\x05\xc3\x7b\x94\x7b\x79\x9d\xdc\x12\x49\x98\xa1\xdc\x12\x8a\x74\xab\xe5\x96\xf0\xf3\x81\xe8\x9d\xaa\x16\xb3\x65\x86\xb5\xae\x95\x59\xf8\xb2\xd4\x4b\xa7\x0e\x38\xe5\x5c\x89\xf2\xa2\xd6\x8d\xe5\xf9\x96\x50\xf8\xae\x7d\x90\x95\x3a\x81\xbc\x52\x09\x15\xc5\xa2\x5e\x66\x1e\x02\x9b\x18\x7b\xbe\xe5\x34\x20\x7b\x80\xe3\xfb\xfb\xf7\x9d\xb1\x0b\x1f\xdc\x0d\x91\x46\xad\x12\x80\xbe\x11\x58\x7c\x6b\x6b\xdd\xad\xf1\xb7\x64\x43\xd8\x11\xb3\x85\x69\x03\xcc\x1c\xaf\xdb\xea\x06\x6c\x89\x1b\x1c\x76\x5b\xa9\x67\xdc\x4d\xb9\xff\x57\xe9\xf4\xce\xa1\x25\x63\xc5\xc8\x24\xcf\x0f\x91\x56\x6f\x93\xfc\xbc\x5b\x13\x4f\x42\x90\x06\x1d\xb2\x82\x02\x87\x36\x99\x24\xfa\x9b\xc8\x00\xa9\x37\xcc\x97\x8e\x35\x08\xdc\xcf\x8e\xea\xf9\xa2\x7d\x85\x11\x6b\xa6\x63\x7f\x74\x77\x10\x3e\x6e\x30\xe2\x00\x6b\x11\xd7\x77\xe3\x4f\xcc\x86\x4e\xf8\x71\x27\x65\xa1\xe7\xed\x3a\x93\xd5\x9a\x4e\xfa\xcb\x67\xfa\x0b\x7b\xb4\x26\x27\x02\x7f\x1a\xb8\x57\x05\xf9\xac\x31\x0b\x98\x1c\xa3\xdf\x2f\x25\xf6\x81\x1b\x1b\xce\x9e\x47\x20\x50\x6c\xde\x8f\x40\xef\x4c\x70\xa7\xb3\x22\x4b\xa9\xdf\x31\x9c\xd0\x36\xca\xf9\x18\x38\x28\xe5\x5c\x01\x56\xad\xb3\xe3\x8e\xeb\xa7\x31\x08\xa5\x23\xb7\xbc\x16\x30\xc4\x56\xda\xf4\x10\xf3\x2e\xca\x34\x8a\x66\xbd\x34\xfd\x68\x76\xac\xc0\x86\xed\x84\x06\x69\xb9\xf9\xef\x7d\x5d\x9b\x45\xd7\x1e\x1e\x7c\x39\x76\x1f\x45\x75\x00\xfa\xef\xf1\x9a\xc6\x07\x69\x8f\xed\x36\x49\xf2\xaf\x76\xcc\x9f\x90\x26\xb7\xd5\x4d\x9f\xa4\xa0\x71\x64\x2c\xbf\x0d\x85\xfa\x8c\x0e\xfb\x72\x3c\x55\xae\x33\x99\x44\xe1\x98\xc5\xa4\x51\x60\x8c\x80\x44\xca\x71\xc9\x45\x5d\x59\x32\xe4\xb4\xcb\xcb\x20\xe5\x84\xf3\x03\xe1\xa2\x66\x01\x06\x44\x76\xcd\x07\x4f\xea\x31\x74\xe0\x7c\x01\x14\xdb\x6b\xc1\x28\x52\xab\xeb\x6a\xb9\xcd\x26\x11\xee\xb5\xf1\x4e\xf7\xe1\x64\x7b\xc6\x09\x55\x6d\x38\xdf\xe9\xec\xc5\x66\xeb\x70\xff\x25\x44\x1c\x02\xa2\x5a\xf9\x07\x9c\x47\x6e\xe4\x05\x37\x5e\xb0\x8c\x3b\x75\xf6\x02\x32\x63\x6b\xfb\xaa\xd3\x31\x2b\x35\x62\xcf\x78\xad\x57\xdc\xa4\xd0\x05\xdb\xa9\x3b\x4a\xe3\xfa\xfd\xe4\xae\x53\x67\xb3\xed\xee\x08\x74\x41\x04\x39\xa4\x6c\xd4\x18\x32\xfd\xea\x20\xbd\x1f\x6b\xf2\xf7\x0a\x35\x6f\xd4\x18\x16\xbb\x8f\x4e\x66\xde\x7b\x2a\x94\xaf\xee\xa1\x9c\xea\x84\xac\x2d\xb4\xb4\xf8\x18\x3e\x6f\x44\xd9\xf0\xb4\xf6\x4a\x28\xb1\xe6\x61\xc6\x31\x23\x60\x97\xf1\xec\x20\xfe\xeb\xd6\x4a\x86\x97\xd2\x4a\x24\x2b\xaf\x22\x99\xf0\x92\xb4\x7b\x21\x7a\x3b\x42\x0a\x1b\xfc\xc9\xf4\x14\xf5\x3e\xdb\xc7\xdd\x9b\x28\x2d\x39\x84\x2d\xbd\x71\x57\x72\x94\x86\x1c\x36\x58\xc5\x0d\xae\x6b\xc0\xe6\xe0\x4a\xf4\x76\xa3\x5b\x97\xbb\x1b\xba\xc9\xbe\x8b\x5a\x7d\x7f\xd3\x7d\xcb\x9a\x79\x5a\xb9\x0d\x80\xf0\xe3\xbd\xf0\x0b\x6c\x83\x68\x1c\xc1\x0d\x87\xd8\xd4\x61\x38\x99\x89\x4e\xa4\xd8\x97\x5f\x6c\x1b\x41\x32\xd1\x2b\x7d\x49\x18\x58\x68\xea\xa9\xca\x89\xda\x06\x83\x82\xc1\x04\xa9\x1c\xef\x55\x2d\x29\x6b\x96\x4b\xcb\xe0\xda\x08\xb7\x24\xd4\xb2\xfe\x90\x5c\x17\x94\x18\x04\x84\x77\x25\x92\x00\x5c\x28\x92\xa2\x6e\xbe\xed\xfc\x69\xee\x01\x79\xbd\xc9\xee\x03\x87\x28\x43\xa8\x04\x79\x61\xb9\xab\x6a\xdf\xc5\x92\x39\x5d\x02\xb3\x52\xb0\xa6\x40\x9f\x52\xcd\xf6\xe8\x06\x0d\x13\xee\xa1\x70\xae\x7f\x99\xbc\xe7\x3f\x45\xe8\xcb\x2b\x10\xf3\xaf\xd4\x14\xe2\xd0\xc8\xe0\x3e\x78\x62\xba\x19\xf5\x23\xce\x1a\xf4\xf9\x76\x92\x62\xc0\x4f\x31\x5d\x31\x24\x6b\x26\x17\xe2\x67\xaf\x8e\x32\x7e\x2f\x94\x7d\x63\x95\x5b\x4c\x62\x1a\xdf\xb4\xa0\xf7\x4d\x2f\x0d\xf4\x21\xb1\x9d\x5b\xcd\xd4\x72\x8b\x00\x23\x28\x4d\x03\xd5\xc9\x70\xfb\x79\x2f\xca\x3d\x9d\x75\x78\x58\x69\x27\x3b\x5e\x83\x0b\x29\x6e\x2d\xba\xed\x46\x0e\x41\xd7\x4a\x4c\x25\x64\x48\x2d\x29\x3a\x21\xf4\x33\x36\x3e\x65\x16\x10\x39\x73\xa9\x81\xa8\x54\xdb\x33\xbe\xa6\xb9\x0f\xd7\x9c\x89\x5a\x5f\x87\xe1\x6f\x71\xa8\xd5\x6a\xd7\xa5\xf0\x56\x23\xe7\xf8\x14\xa7\x11\x49\x88\xf9\x36\xf8\x1d\x41\xe5\x9b\xa2\x78\xac\x0a\x35\x5c\x67\xb9\x5e\xbf\x6c\xeb\x62\xe4\x62\xaf\x18\x7f\x70\xec\x73\x00\x11\x9e\x10\x80\x7c\x0a\x00\x4f\xe0\x2a\xee\x3a\x41\xae\x3f\x06\x5d\x76\x10\x53\xb2\x51\x98\xf5\x08\x47\x87\xd5\x8d\x19\x52\x0a\xd2\xf8\x14\x04\x77\x10\x1a\x30\x16\x33\x75\xdc\x3d\x5a\xb0\x5c\x3a\x84\x1d\xe1\xc0\xd4\xe1\x2d\x87\x32\xbf\x50\x57\xaa\xda\x11\xaf\xc2\x9f\x54\x68\x6b\x47\xb0\x03\xd2\xdf\xf9\x33\x10\x00\x36\x3d\x29\xe0\x8b\xdb\x18\x5a\x38\x3a\x46\x58\x02\x76\x3e\x3e\x1b\x98\x4d\xc2\x6f\x5e\x6d\x76\xe0\xc0\x27\x20\x9e\x79\x87\x23\x37\xcc\x08\x36\x8b\x41\xb0\xeb\x25\x28\xc3\x44\x88\x00\x0f\x01\x98\x18\x2e\xcf\x92\xc7\x88\xc0\x42\xc3\xa8\x3a\x04\xdb\xe7\x45\xc5\xc4\xb9\x1e\x9c\x64\x5e\x29\x40\xc0\xf6\xc0\x16\x02\xf3\xc8\xaf\x18\x4e\xc7\xd8\x44\x5f\xf8\xc3\xd3\x3f\x0b\xea\x21\x2e\x3b\x08\x5f\xd2\xf1\xca\xd9\x98\x11\x5f\x34\x38\x67\x21\x56\x28\x1a\x57\x72\xbc\xf6\xc4\x83\xb0\x3e\x21\x7a\x5f\x79\xe0\x06\xdd\xda\x72\x63\xfa\x12\xd3\x5e\xad\xae\xdf\x7c\xa5\xdd\x25\xae\x65\x7f\xf3\xc3\xb0\xdb\x66\x40\xaa\x58\xa1\x0e\x4c\xac\x9d\x03\x77\xb7\x53\x76\xb3\x55\x0d\xc9\xd4\x4f\xcd\x4d\xb7\x36\xc1\xdd\x5d\xc4\xdd\xc4\xfd\xfb\xbe\x12\xef\xe0\x0a\x0c\x9c\xe9\xe3\xf3\xe7\x70\x24\xf4\x8a\xc7\xcc\x5f\x47\x1b\x65\xbd\xbe\x19\xd2\x45\x32\xab\xe1\x2b\xc7\xe6\x73\x44\x9b\x3e\x64\x63\x4a\x9e\x58\xf8\xaf\x2c\x4a\x01\x03\x2e\x60\x02\x39\x77\x23\x93\xbb\x72\x8e\x97\xec\x36\xa7\xa4\x5b\xb2\xd5\xc7\xa4\xdf\xde\xa7\xab\x4f\xc8\x0d\xe7\x2e\x3c\x2f\x37\x99\x53\x17\xf4\xb2\x7e\xa2\xe7\x99\x13\x61\xcd\x5c\x23\xa0\x0f\xfa\x65\x40\x42\x3a\x25\x2b\x42\xd8\xf1\x3a\x22\x98\x89\xa7\x00\x4c\xa7\x0a\xba\xe8\xe4\x00\xcc\xa0\xae\x8c\x78\x25\xeb\x82\x57\x0d\x0d\x78\x9d\x22\x4f\xed\x72\x43\xca\xba\xa0\xa6\x45\x1d\x5e\x2d\x2d\xaf\x25\x42\x77\x64\x36\xd5\xdd\x35\x9e\xe5\x1b\x2e\xc4\xba\xbd\x7c\xf3\x7c\xaf\x3b\xe2\x36\x5a\xc2\xcc\xb6\xc8\x6e\xd8\x18\x02\xc6\x49\x29\x4c\x2e\x3d\x13\x41\x5c\x0c\x30\xf4\x94\x18\x02\xa1\xfb\x19\xc8\x22\x10\x55\x49\x19\x05\x30\x5b\xf5\xb9\x2c\x61\x63\xe9\x45\x3b\x0c\x8f\xa6\x44\xfd\xe1\x79\xd8\xcd\x94\x61\xc9\x91\x47\x9b\x2b\x13\xda\xc1\x79\xf8\x41\xb9\x34\x3f\x46\x97\x68\x83\x79\x28\xad\x84\xe2\xc7\x57\xeb\x6b\x77\xaf\xe1\xd2\xe6\x8f\x75\xd3\xa8\x71\x8b\xce\x2e\xd7\xc8\x3f\xd6\x92\xad\x23\xb5\x1b\x47\x7e\xf3\xb8\x6f\x18\x75\x48\xd5\x5f\xa9\xae\xac\x62\xe8\x1b\x68\x2c\x9e\x0e\x32\x6d\x39\x87\x58\x76\x39\x62\xf4\xb2\x95\x0c\x3a\x20\x1a\x7f\xe8\xdf\x96\x03\xb3\xd1\x3e\xfa\x32\xcb\x86\x6f\xc3\x88\xd7\x72\x00\x91\x74\x34\x79\x99\xe5\xc8\x2b\x36\xf4\x0a\x2e\xb1\x9a\x2f\x87\x9c\x39\x10\x9a\xbe\x6c\x46\x19\x6b\x15\x22\xaa\x73\x33\x9d\x28\x6d\x75\x35\x61\x7b\x0d\x21\xf2\xda\x1f\x8d\xb2\xa6\x38\xa2\x8f\xd0\x16\x67\x39\x53\x93\x2a\x53\x65\x4b\xe7\xb9\x95\xd9\x1b\x85\x1a\x55\x64\x8e\xc3\x9a\x62\xa5\x69\xa5\x36\x7a\x93\x61\x6e\x63\xa3\xd9\xad\xf5\x20\x67\x34\xdf\x54\x03\xe0\x6b\xc5\x4d\x35\xa0\xac\xfa\x23\x12\xdd\x47\x36\xea\xeb\x95\x1f\xf1\x15\x9a\x8f\x88\xd5\x1e\x1e\xff\xae\xf3\x53\x48\x75\x99\xbc\xfb\xc1\x4f\xd5\x69\x7e\x06\x93\xa1\x70\xb6\x08\x5a\xc8\xf5\x0a\x82\x5b\xbe\xaf\x55\x6f\x5c\x05\x3f\x83\x66\x43\xc8\x38\xad\xda\xe1\xdc\x1b\x2d\x60\x6f\x06\xdb\x6f\x90\x1c\x6b\xa3\x64\xab\xdb\x13\xf3\x7a\x2a\x5d\x0e\x28\x30\x94\x43\x72\x77\x6f\x3d\x27\x44\x03\x76\xa7\x85\xa8\x93\x6d\x70\x09\xb2\x05\xef\xd1\xae\xbc\x37\x14\x7f\xd4\xd7\xf6\xfb\x01\x57\x46\x86\xaf\x0c\x76\xf6\xb5\x42\x1f\xaa\xa8\x02\x26\xc9\xcd\x2c\x7a\xeb\x75\xa8\xaf\x52\x9d\xd6\x18\x04\x7f\xca\xfd\x5c\x64\xa9\x04\x60\x3c\x88\x46\xf5\xa0\x78\x64\x2e\x34\x0c\x29\xe7\x88\x9e\xd6\x28\xce\x42\x91\xa0\xd0\x06\x17\x76\x37\x83\x47\x3a\x1d\xe0\x15\x83\xe1\x61\x13\x84\x5a\x62\x77\xea\x30\x24\xd2\x55\xf8\x70\x1b\xc4\x58\xfa\xc9\x5c\x7f\x6e\xaf\x64\xea\xab\xdb\xc8\xcf\xf8\x1a\xa3\x63\x12\x5f\x14\x74\x88\x67\xaf\x63\x4d\x8e\x43\x4b\x99\x7c\xee\xdf\x0f\xe6\x7b\xcf\x9f\x93\x9c\xf5\x8e\xbd\x43\xa6\xb2\xbe\x50\x45\x1f\x11\xf2\x37\x99\xad\xdb\x45\xa4\xa6\xa7\x80\x87\xbf\xbf\x96\x3e\x1a\xb5\x04\x48\x66\x9e\x4d\xc7\x67\x9d\xeb\x8f\x8b\x54\xf5\x75\xa1\xb8\x10\xa5\x1f\xeb\x28\x0b\x03\x27\x73\x8f\xdf\xbe\x19\x8d\x0f\xde\xa0\xd8\x0d\x62\xe3\x30\xf1\xaa\x5f\xe9\x9f\xbd\x3e\xe8\x34\x59\x02\x3b\x49\x8c\x0d\x1b\x1d\xa8\xb4\x9d\xbd\x8b\x42\x5a\x2a\x83\xe1\xb7\xa9\xd1\x58\x64\xae\x30\x53\x65\x25\x76\x52\x8c\x03\x30\x7e\xd9\x20\xe8\xe0\xa6\x27\x6c\x37\xc9\xc7\xb8\x8e\x7f\xde\xb8\x04\xb7\xf3\x27\x48\xe3\x7e\x57\xb9\x0a\xdc\x2e\xc8\x37\xe7\x32\x10\x2f\xc9\x4f\xa6\xb4\xcd\xe9\xe1\x4b\x8e\x97\xfc\xf7\x06\xfc\xc7\x6c\xc0\x68\xba\xf3\xe1\x27\x2e\xf2\x93\xc4\xcb\x60\xc6\x21\x1f\x82\x0f\x25\xf0\x95\xc5\xf2\xe5\x08\x4f\xc3\x56\x8b\xb2\x2e\xca\xb1\xb3\x86\x81\x35\x0b\x32\x44\x3a\x78\x2f\xbe\xed\xb1\xff\x85\x48\x44\x39\xe1\xed\x55\x04\x43\x1a\x22\x15\xe5\x4a\x67\x42\xa6\x7f\x4e\x6b\x10\xd4\xb6\x32\x84\x27\xd2\xd4\x86\xf9\x0b\xf1\xd0\x2e\x72\x83\x51\x64\x13\x8b\xc8\xca\x70\xf6\x10\xbb\xf1\xef\x2b\x1c\x19\x77\x32\xcf\x5c\xd2\xdf\x8c\x4f\xe9\xce\x8a\xe7\xf8\x4d\xd7\x07\x64\x27\xf3\xcc\xc9\xb7\xab\x6e\xf7\xb0\x40\x46\x83\xdd\xc9\x3d\xa4\x34\xb5\xbb\x77\x38\xad\xdc\xe9\x72\x76\xae\x2b\x0c\xd9\x6a\xb5\x68\x25\x4a\x85\x66\xae\xc6\xa5\xac\x28\xe8\xc4\x6e\x6e\x33\x0c\xaf\xbf\x44\xad\x45\x2d\xdb\xf2\x8a\x6b\xb0\xf5\xd5\xba\x11\x73\x5d\x2d\x27\x65\x55\x91\x46\xc8\x11\xa9\xf5\x62\x46\x00\xec\xd0\xd2\xc4\x96\x54\xcd\x44\x37\x33\xf4\x8d\x01\xc4\x2e\x48\x4e\xfb\xea\xe4\xf5\xd9\xb3\x17\x1f\xce\xfe\xfc\xea\xd0\xc7\xa3\x50\x2f\xbb\x92\x37\xbe\x78\xd7\x9b\xe8\xa6\xf7\xbe\xf3\xa0\xdf\x03\x87\xe1\x21\x26\xd4\xee\x81\x53\xd6\xc3\x4f\x4a\x8e\xe5\x6e\x27\x85\x1d\xa2\x8e\x7d\xf3\xa8\xcf\x29\xc4\x07\x69\x4a\x69\x27\xcf\x4e\xca\x8b\x45\xa3\x2c\x77\x84\xb9\x7a\xf6\xea\x08\x63\x68\x1b\x6d\xcc\x36\xa7\xef\x4c\xb2\x7a\x0f\xef\xc4\xbf\x3d\xdc\xe7\xa5\x5a\x8a\x3d\x07\x2c\x68\x08\x1f\x53\xfc\x41\x3c\xb1\xe3\x71\xcf\xdf\x3d\x79\x1f\xc3\x49\x88\xa7\xf1\xcb\x20\x73\x53\x44\xc7\xac\x6e\xdb\xa5\x05\xe4\x04\xb1\x00\x77\xed\x45\x5d\xfe\xb8\xb0\x1a\x2d\x84\xd4\x97\x93\x25\xe1\xd2\x1b\x87\x15\x87\x53\x02\x95\x7c\xf3\x0d\xae\xc4\x4e\x77\x95\x90\x00\x2f\xd5\x72\x07\x87\x42\x32\xa6\x03\xdf\xe9\xf5\xc4\x03\xfb\x86\x76\x8a\x4b\xc6\xed\xe6\x99\x77\xd0\x0d\xd9\xbc\xd3\x2c\xe9\xb9\xf4\xe8\x84\xfd\x76\xa1\xda\x7d\x3c\x1b\xe0\x8a\xfb\xb4\x95\xe3\xcb\x67\x45\xa1\xea\x62\x31\xfb\xe6\x91\xd8\x23\xc4\x39\x75\xbe\xb8\x08\xcb\x0d\xd7\x7d\xb7\x7b\x27\x8f\x72\x79\x2c\x81\x4f\x79\x9b\xf2\x77\xdf\xd9\xee\x7e\xe7\x72\x67\x71\xa2\xa5\x5a\xc3\xfc\xa8\x4f\xf3\xaa\x1c\x97\x6d\xb5\x84\x28\x0f\x5d\x8b\x62\x59\xcb\x59\x39\x16\xb2\x69\xe4\x12\x40\xfe\x5c\x16\x7b\x00\x62\x14\xdf\x71\x14\xc8\xa5\x5a\x26\xa9\x3f\xc9\x48\x01\xeb\x6a\x68\x61\x2f\x95\x9a\x8b\xb6\x91\xe3\xcb\xa8\xae\x73\xd5\x5e\x2b\xe4\xca\xdf\xb9\x0c\xa0\xf0\x6b\x44\xc3\xd2\xd7\xb5\x6a\xfe\x28\xcd\x9f\xd4\xf2\x8d\x51\x6f\xd1\xbf\x90\xa0\x3a\xe3\x12\xcf\x69\xef\x9c\x2d\xe7\x49\xb9\x00\xd2\xf3\xb9\x6e\x8e\x4b\x00\xc9\xfd\x13\x90\x78\x00\xe7\x69\xfb\x14\x62\xeb\xc0\x83\x2c\x70\x27\xbc\xb8\x1b\xc5\x96\xc4\xa8\x21\x69\xb8\xcb\x5d\xf8\x64\xf8\xc1\xb4\xba\x01\xef\xb3\xf0\xf7\xd0\xe7\x4b\x75\x6f\xec\xa2\xdc\x4d\xd5\xc8\x6e\xdd\x2e\x1c\x26\xaa\xff\xe6\xa8\x17\xdc\x4a\x41\x40\x6b\x9d\x99\x1c\x12\x1d\x30\xdd\xa0\xa0\xbe\xfe\x32\xf6\xa7\x15\xd3\xc1\x0e\x95\xa9\x7f\xa1\xeb\x38\xe4\x35\xb6\xbb\x51\xec\x89\xde\xa1\x1c\x4f\x69\x6d\x4a\x80\xe0\x00\xda\x15\xb6\xa3\xad\x6a\x64\xab\x9b\x64\x48\xc8\x6c\x30\xc2\xef\xde\xa5\x5a\xa2\xfd\x65\x28\x4e\x95\x12\xb9\xec\xd5\xe4\xdc\xba\x0d\x14\x3f\xe1\x30\x49\x80\x22\x2e\x6b\x38\x36\x80\xa9\xda\xa7\xfd\xf5\xbb\xbd\x8f\xae\xb8\xac\x2c\x80\xa8\x99\xa3\xf3\x77\x2b\x07\xfc\x7e\x1d\x59\xdc\xb6\xae\x78\xa2\x53\x1f\xde\x7f\x96\x79\x05\x24\xe1\x9b\xe6\x95\xf1\x6b\x89\xe9\x52\xc0\x1b\xf0\xd7\x14\x1e\xd8\xbe\x3f\x3a\x3b\x7c\xfd\xec\xec\xe4\xf5\x87\xd3\x3f\x1f\xff\x70\xf2\x62\xe3\xc3\x7d\xc8\x43\x47\x0c\xe2\xe7\xcf\xde\xfc\xaf\x0f\xdd\xba\x7a\xff\xfe\xef\x5c\xae\xb7\x6b\xcf\xbc\x1f\xf0\x6e\x98\x2a\xb7\xf2\xcc\xf0\x26\xa1\x07\xf6\xd1\x21\x1e\x2a\xdb\x76\xbb\xfd\x43\x05\x9f\xc3\x17\x87\xc7\x87\x2f\xcf\xe0\x4c\xdd\x0d\x9e\xef\x3f\x7b\xf1\xa2\xf3\xf0\xf5\xe1\xd9\x9b\xd7\x2f\x3b\x8f\x9f\xbf\x7e\xf6\x1f\x41\x25\x81\x62\xb6\x99\x04\x85\x94\xde\xed\x8f\xd8\xcb\x0b\x56\x0a\x27\x0b\x37\x57\xd2\xdd\x55\xdf\x58\xdd\x31\xfc\x20\x18\xca\xaa\x4f\x70\xdb\x85\x1f\x45\x03\x5d\xf5\xd9\xa4\x91\x17\xdc\xbd\x40\x93\xce\x0e\x0f\xc4\xc2\xdf\xe4\x87\x01\xef\x7e\xbb\xaa\xc7\xf0\xf6\x77\xab\xbb\x06\xef\xcf\x3b\x79\xdd\x8e\x88\x5a\x9f\xd7\xfd\x99\x5c\x9e\x2b\xf8\x7d\x5e\x05\x09\xc8\xa2\xc7\xb9\xc3\xb1\x5b\x20\x83\xfc\x40\xb2\x60\x98\x07\x14\x76\xab\x6b\x5e\xec\x75\xb6\xe6\xfd\xfb\x71\xdd\xef\x92\x02\xef\x6d\x27\xe2\x12\xb9\x6d\x09\xd8\xed\xa1\x71\x20\x68\x33\x6b\x0b\xe0\xb0\x27\x57\x6e\x37\x4e\x9b\x87\x83\x88\x31\xf5\x55\x33\x56\xaf\xd5\xc4\x9b\x76\x89\x26\xbd\x80\x3d\x2b\x3f\xa9\xe2\xb5\x9a\x88\x3d\x7e\x37\x6c\xd4\x84\xfb\xe6\xde\x86\xd6\x51\x9e\xe0\xf0\x5d\xb7\xbb\xe0\xfa\x4c\x35\x7e\x80\x83\x20\x86\xaf\x84\x47\x41\xab\x58\x26\x0c\xbc\xb6\x0a\x6b\x62\xf1\x0e\x8e\xa8\xad\x24\x06\x05\x1e\x72\x26\xe1\xa8\x2e\x2b\x9e\xf8\xb7\x90\xee\x70\xaf\x93\x0e\x31\x2f\x9f\x80\xfa\x0c\xb1\x73\x61\xa2\x02\xfc\xc2\x88\xb1\xac\x5d\xae\xa3\x46\x4d\x4c\x57\x9e\x60\xbd\x9b\xbb\x84\x3d\x48\xae\x3a\xbd\x71\x05\x22\xca\xb3\x1d\x21\x71\x88\x66\xcd\x32\x4a\xd3\x52\x8e\xf7\x09\xa0\xd9\xfc\x2c\xe2\xd0\xc0\x2d\x6a\x77\x20\x18\xc5\x60\xdb\x44\x6a\x01\xcd\x85\x8b\x07\x6e\xd8\xfb\x53\x35\xbe\xb4\xcb\x34\xf7\x17\x1b\xae\xa7\x33\xd9\x8e\xa7\xca\xc0\xdd\xa8\x7f\x1c\x2c\xed\xba\xbc\x82\x4d\x42\x87\xc1\x73\x2b\xb2\xb9\xae\xed\xed\xf9\x8e\x86\x54\x42\xfb\x24\xf8\x2c\x07\x72\xd2\xc0\xe8\xbc\x38\x0e\x60\x35\x29\xb1\x51\xe8\x80\x5d\x2e\x0a\x23\xd8\x8b\x02\x09\x60\x0d\xdd\x3b\xf1\xf7\x2f\x62\xc7\x3f\x88\xc3\x9d\xa0\xfe\x6c\x66\x14\x21\x0a\x55\xa9\x16\x69\xeb\x9d\x1b\xd2\xfb\xc0\x28\xd7\x45\x6b\x4b\xca\xda\xfd\x63\x1b\xc8\x18\xf2\x76\x9d\xd8\x16\x4f\x9f\x9f\xbc\xdd\xd8\xd8\xee\x26\x2c\x69\xd6\x09\xff\x9e\x97\x58\x8e\x80\xd5\xac\x10\xfc\x5d\x42\x01\x3b\xdd\x9c\x2e\xc0\xe7\xee\x6b\x00\x9f\x00\x52\xc5\x65\xf6\xd4\xdd\x98\x67\xe4\x1b\xc0\x22\x50\x3f\xa4\x2c\x9e\xab\x71\x39\x29\x19\xbd\x88\x88\xaf\xff\xad\xd9\x82\xb8\xd6\x5a\xd3\xd6\x82\xb2\xaa\x1d\x8a\x3f\x87\xd8\x74\x2b\xb1\xe6\x2b\x2d\x0b\x55\x0c\x45\xbf\x50\xad\x2c\x2b\xb3\x93\x15\x2c\xed\xa2\x6c\xcf\x16\xa6\xdd\xb6\xb5\x6d\x23\xff\x5a\xb7\xdd\xbe\xc4\xac\xdd\x6f\xb3\x90\xbd\x43\x86\x00\x87\xcf\x8b\x84\x67\x75\xce\x3e\x7e\x45\xe0\xec\xb5\xba\xde\xf7\x1a\x25\x26\x4d\x73\xaf\x39\xe8\x64\x4f\xf4\x5a\xf5\xa9\x95\x8d\x92\x51\x2e\x53\x49\x12\x2d\xec\xf7\x38\xee\x3c\x7c\xd5\x41\x71\xa1\xbb\x69\x29\xc6\xba\xaa\x94\x4b\xc8\xe8\xad\x47\x0b\xa3\xbc\x04\xef\x50\x01\x21\x20\xee\xd6\x5a\x0b\xa9\xb7\x1d\x12\xc0\x19\x49\x6c\x02\xa1\x09\x07\x75\x89\x3e\x80\x16\xee\x88\x6f\xcd\x16\x8a\xf6\x04\xa4\xef\x43\x68\x5a\x7d\x8a\xb4\x08\xb9\x41\xfc\x84\x02\x99\xbf\x23\xf3\x03\x7e\xf5\xbe\x27\x9e\xb2\xce\x8b\xfe\x9c\xa0\x4c\xfc\xdd\x8e\x8a\xea\xb5\x0f\x7c\x25\xc3\xbf\xea\xb2\xee\xf7\x06\xa2\xb7\x65\x67\xe1\x4b\x4f\xec\xb8\x25\x1b\xb8\x49\xf6\x89\x48\xdc\xea\x23\x38\x73\x68\x6b\xe8\x07\x59\x72\xd6\xe9\xa7\xcf\x5d\x1e\xee\xf5\x33\x43\x87\x0a\x6e\x82\xf9\x5c\x81\xc1\x06\xd6\xca\xae\xb5\x43\xf3\x0a\xb5\x77\x87\xc8\xfa\x7b\xff\x74\xf4\x07\xf4\x61\x21\xd7\x22\xac\xe1\xa4\x41\x11\x29\x26\x1b\x3b\xbf\x94\x09\xd4\xc5\x6d\x48\x48\xe1\x09\x29\x76\x9c\x04\x74\x4b\x22\xb9\x13\x6b\xb6\x19\xfb\xcc\x06\xfa\x6d\x9c\x32\xe8\xeb\xea\x0a\xf5\xdb\x54\xbb\xfd\x2f\xb0\x2a\x1b\x29\xc6\x6e\x55\xbe\x90\xc6\x59\x1a\x71\xdd\xd8\x91\xf8\xdc\xf8\x78\xb1\x62\x1c\xb4\xdc\x91\x40\x1c\x39\xe8\x4d\xa5\x6b\x45\x48\xa6\x05\x80\x50\x29\x39\x9e\x8a\xb9\x6c\xa7\xb6\x3e\x3a\x4b\xac\xcc\xdf\x6a\xc8\x52\x33\x2b\xff\xa6\x7c\x19\xb8\x4f\xba\x2a\x0b\x44\x39\x38\x5f\x8a\xf3\x46\xd6\xe3\x29\x24\x75\x94\x4d\xb5\xa4\xe9\x05\xf0\x02\x5b\x1f\x46\xf5\x96\x95\x6a\xec\xa9\x44\x78\x0b\x85\x16\x65\x2b\x66\xb2\x86\x5a\x86\xe2\x8f\xaa\x9a\xab\x86\x10\x87\x30\x47\x14\x66\x38\xb6\x55\xb9\x06\x6c\x75\x95\xd5\x8d\xf5\xa2\x85\x88\x61\xc8\x55\x18\x4c\xeb\xd0\xef\x6e\xd8\xff\xaf\xd5\x58\xd7\x63\xdb\x36\x5d\x2d\xef\xdb\xb1\x0f\xc8\xca\x71\xd6\xc8\xf1\xe5\x69\x59\xa8\x43\x84\xc5\x42\x42\x75\x35\xa0\xec\x00\xf5\xc4\x07\x02\x50\xd1\x99\x3e\x80\xf7\xa1\xb4\x7e\x77\x5d\xbd\x82\x7d\x9c\xf4\x7c\xb8\xde\xc4\x18\x74\x35\xfa\xf4\x2d\x39\xc1\x35\x56\xa0\xc1\x81\xe1\xd5\x99\x80\xf0\x63\x0c\xde\xbb\xe2\x64\xd0\xe1\x95\x2d\x64\x4a\x19\x8a\xb7\xc1\x6d\xa1\x1c\xb7\xb8\x82\xd7\x40\xa4\x41\x6a\x68\x2c\x9b\x18\x25\xc2\x97\xce\x1d\xcf\xd7\x16\x2e\x99\x26\xeb\x30\xcc\x9f\x9d\xc8\x10\x7a\x2c\xbc\xd4\x8d\xe6\xd1\x07\x16\x67\x45\xb9\x70\xaa\xbc\x08\x16\xd5\x00\x8e\x0a\xd9\x1a\xc3\x19\x1e\x8d\xc4\x01\x75\x0c\x19\x85\x3d\x21\x0a\x84\x62\xbb\x52\x8d\x95\xf6\x11\x0e\x08\xc1\x41\x64\x51\x58\x4a\x65\xfc\x99\x46\xd7\xad\xc3\xfe\x78\x46\xb7\xa9\x70\x2d\x39\x08\x10\x7b\x11\xa7\xa6\x67\xf8\x0a\x1c\x72\xa2\x71\x42\x3a\x4a\x30\x44\x69\x90\x70\xf6\xb8\x43\x83\x00\x92\xe4\xaf\x0b\xd3\xba\x9c\xfa\x53\xe5\xa7\x93\xfa\x02\x09\x3a\xc1\xde\xe4\xb2\xaa\x72\x7d\x0c\xf3\xc6\xbe\x94\x30\x42\xcc\x68\x8c\xdb\x1e\x7d\x20\xc5\x7c\x2a\x8d\x1a\x8a\x93\x1a\x89\xc7\x5d\x79\x44\x97\x82\x65\x7d\x31\xc0\x71\x5a\x8e\x49\x18\x8c\x96\x09\x7b\xef\x2a\x4a\xe0\x19\x8a\x45\xf6\x11\x92\xbf\x37\x8c\x42\xb1\xae\x4f\x95\x7d\x0c\x79\x05\xb1\x7c\xba\x8c\xb1\x0c\x9d\xd6\x9e\x2f\x9d\xc8\xd7\xe1\xa7\x90\x53\xd0\x7d\x7b\xab\x4a\xef\x74\x48\x2e\xee\xb6\xcf\xd6\x16\x17\xf2\x6e\x01\x7b\x8e\xf6\xba\x98\x2b\xc8\x6e\x5e\xf3\x5a\xee\x93\xa4\x97\xb0\x1e\x3e\x18\x1a\xd3\xee\xa7\xd7\x1c\x5f\xc7\x7e\x82\x6e\x07\x99\x69\xe1\x26\xf2\xb9\x46\x07\xca\x80\x21\x89\xb1\x34\x6a\xc0\x31\x31\xe4\x61\x3b\x2b\xc7\x8d\xde\xe6\xa3\xa2\xb0\xba\x72\xd9\x86\x59\x66\x0d\xd2\x11\xb2\x77\x1f\x86\x83\xf9\x1d\x51\x88\xbc\x56\xbd\x2b\x9f\x3d\x1d\x49\xd6\x6e\xc8\x65\x3b\x75\xf9\x11\x41\x30\x4b\xb7\x7c\x3a\x23\x04\x3b\x85\x39\x9e\xe3\xd2\x5d\xda\xdb\x90\xc7\xef\x6e\xc4\x6f\x4c\x79\x6e\x19\x72\x48\x2d\x1d\xf3\x58\x04\xd3\x20\xe7\x5f\xbb\xdc\x96\xfb\x14\x45\x92\x53\xd9\xdd\xc5\xb5\x5a\x48\xd1\xaa\xd9\x5c\x37\xb2\x59\xda\x76\x9c\x9b\x0d\x31\x97\x49\x89\x5c\x65\x16\xac\x12\xc8\xd9\x3f\x2e\xca\xf1\xa5\x3d\x91\x8f\x66\x78\x91\x28\xfa\x38\x63\xf0\xf6\x42\x31\x37\x21\x88\x1b\xb8\x64\xa4\xac\xe3\xaa\x6c\xac\x6c\xa0\x3e\xb9\xb5\x62\xef\x0e\x1e\x1c\xa1\x3b\x1d\xcb\x79\x3f\x74\x39\x8f\x8a\xdd\xb8\xa4\x71\xe9\xee\x92\x82\xd9\x2c\x2c\x43\x57\x70\xdd\x33\x25\xed\xde\xd0\xa8\xb6\xfb\xe9\x20\x2e\xe7\xbd\xb6\x52\xd3\xc1\x06\xd5\xc1\xf4\xac\xac\xf0\x4e\xa6\x1e\xb1\x17\xff\x5e\x43\x64\x69\xfb\x5d\x82\x5b\x18\x15\xe5\x49\x09\x1d\xf4\x3b\x29\x51\x3c\xa5\xbd\x75\xb2\x01\xdd\x2a\x53\x1f\x5c\x9a\x4f\x48\xbc\x66\x87\x66\x9f\x3c\x14\x20\x36\xb0\xe4\x59\xe2\xc9\x27\x8d\xa3\xb3\x56\x03\x52\x3d\x62\x10\x16\x9a\xc3\xec\x70\x14\x20\xd0\xb4\x43\x71\x38\xbc\x18\x82\x95\x0e\xf8\x4f\x59\x5f\x54\x8a\x18\x85\x65\x40\x1e\x23\x2b\x2b\x2b\x01\x9f\x00\x6e\xb5\x47\xee\x17\x6f\x23\xdf\xa4\x8d\xc6\xef\xf6\xbc\xad\x08\x57\x0e\x52\x8e\x46\x8f\x79\x26\xe2\xec\xd5\x6c\x27\xb3\x45\xb2\x07\x12\x4e\xaa\xbe\x52\x4d\x63\xc5\x58\xf4\x84\x8a\x12\xa2\xa3\xdb\x1c\x86\x97\xc0\xfc\x35\x55\xf9\xff\xb3\xf7\xee\x5d\x6e\xdc\x56\xbe\xe8\xff\xfa\x14\x90\xd7\x44\xdd\x7d\x42\xb1\x13\xdb\x99\x7b\xae\x3a\x6d\x2f\x59\x8f\x44\x77\x22\x59\x57\x92\xc7\xf7\xac\x4c\x96\x02\xb2\xc0\x66\x9d\x2e\x16\x98\x42\xb1\x29\x8e\xa5\x59\xf3\x21\xe6\x13\xce\x27\xb9\x0b\x7b\x6f\x00\x1b\x28\x54\xb1\xd8\x0f\x1f\xc7\xb1\xfe\xb0\x25\x16\xde\x8f\x8d\xfd\xfc\x6d\x3b\x64\xbf\xac\x8b\xd0\x54\x97\x25\xb4\x54\x56\x54\x00\xc7\x07\x8d\xc1\xd5\xc7\xec\x7f\xcc\x09\x4c\x1a\xce\xc0\x6d\xeb\x87\x14\xea\x63\x69\xb8\x7b\x23\x60\xa5\xba\xe9\xd8\xf3\x09\xe5\xa9\x30\x7b\xee\x5e\x69\xce\x04\xb8\x12\x9d\xc5\xc4\x9f\xf3\x8b\x89\xdf\xf8\x56\x89\x73\x91\x03\x4e\xe5\xbc\x57\x02\x96\xe0\x6f\x00\x30\xca\x48\xee\x6b\xb5\x25\x2a\x6b\x1f\xfe\xd7\xf6\x43\xf1\x02\xef\x67\xad\xb6\xf0\x37\x77\xa2\x5c\x51\x3f\x70\x57\xe0\xec\xa6\x6f\x6f\xd2\x75\x1a\xc3\x11\x50\x78\xfc\x10\x12\xa6\x36\xa7\xf2\x4d\xcc\x04\x15\xb6\x1d\x08\x2b\x4e\x23\xb2\x07\xb8\x32\xbf\x4f\x47\x94\xe4\xf2\x77\x18\xff\x52\xac\xf4\x15\xcb\xda\xef\x87\xc7\x37\x1f\x9a\xb1\xfc\xe4\x59\xaa\x41\xce\x4e\x3b\x43\x52\x7d\x8f\xad\x5a\x21\xd6\x63\x2b\x77\x5e\xe0\x99\xa6\xcd\xba\x69\xec\xf3\x72\xf5\xb3\xa8\x29\x8f\x14\x65\xfb\x1c\x3f\x93\x7d\xdb\x97\x39\x75\x6f\x81\x88\xc5\x67\xef\x24\x71\xa2\xb2\x0f\x2a\x70\xe1\xcd\x00\xed\x03\xd2\x51\x03\x14\x14\x3e\xc4\x85\x16\xd2\x35\xb3\x76\x23\x85\x06\x68\x76\xf5\x05\xa2\x2a\xba\x87\x29\xa1\x9e\xe9\xa1\x15\x0f\x1e\x64\xce\x5b\x46\x2c\x1b\xb3\x56\x31\x1f\x44\x15\x32\x4f\x13\x78\x0c\xbd\x53\x1f\xda\x57\xba\x50\x59\x2e\x68\x22\x08\xad\xb2\x45\x43\x5c\xf6\xb9\xe2\xf7\x81\xdb\x34\xdd\xd1\x6f\xe5\x05\xdc\x93\x3f\x6a\xd3\xbe\x8b\x70\x15\x21\xfc\xcf\x2e\x17\x7f\x44\x08\x9c\xd1\x3d\x23\x30\xa0\xe7\x8d\x5e\xd9\xaa\xc7\xd1\x70\xb8\x24\xd1\x45\xfc\xe9\x7f\x5d\xb0\x87\x3f\x1f\x91\x11\xfa\x2f\xb1\x50\x92\xbe\x28\x58\xba\xef\x4d\x89\x3c\xb0\x39\x67\x25\xce\xc3\xdb\x3f\x6a\x35\xcf\x12\x5e\x64\xe4\xf8\x5c\xf1\xbe\x8b\x80\xbb\x4c\x96\x85\x9e\x4d\x26\xd3\xc4\x98\x0d\xce\xd9\xb2\x30\x37\xd2\x79\x30\x8b\xda\x1f\xa2\x5d\x7e\xa9\xaf\x94\x98\x41\x1e\x06\x5d\x33\x8e\x75\xc4\x92\xb9\x36\xd7\x83\x1c\x83\x6b\x62\x8a\x96\xb0\x01\x23\xf2\xa1\xcb\xdc\x65\x36\xa7\xef\x0b\x35\xdb\x5c\xbc\xd5\x9b\x06\x62\x42\xbd\x61\xc7\xc0\x2f\x67\x7d\x15\xbe\x1d\x34\x1e\x7f\x1a\xdc\xd6\x6e\xd4\xc0\xe8\x7b\xe3\xb6\xde\x6f\xf2\xcd\xae\xcd\xf8\x15\xbe\xc9\x3d\xeb\x39\xc6\x4f\x64\x55\xf5\x9c\xe1\xb9\xac\xaa\x01\x86\x3a\xc2\xae\x40\xb7\xd8\xca\x68\xd0\xcb\xc8\x46\x89\xa5\xac\x8b\x0a\x01\xa9\x0b\xd5\xaa\x66\x55\xd6\x4a\x6c\x97\x0a\x35\xc6\x1a\x3d\xf6\xbf\x3e\x88\xdc\x3d\xe1\x41\x80\xd7\xa4\x79\x30\x5f\x9c\xd9\x4f\x81\xd8\xdd\xe0\x1a\x67\xb7\xe7\x4e\x49\x1e\x42\x70\xf5\x9c\x16\xfc\xd5\xbe\x7b\x37\x7d\xd5\xb0\x9b\x9b\x6e\x74\x34\x58\x1c\xd6\x0d\xaf\x29\x25\xac\x0b\x2d\x4e\x23\x9b\xfa\x4f\xe5\x5c\x00\x52\xd5\x5e\xaa\xbe\x67\x32\x77\x72\x7e\xd0\x57\xbe\xe7\xfc\x60\xfc\xc1\x6d\x70\x44\xd8\x0d\xff\xea\x3d\x6d\xa6\x91\xcf\x3c\xd4\xc0\x7e\x93\x0f\xd9\xba\xb1\x33\x3d\xaf\x9c\x0b\x5b\x38\xf8\xc0\xd2\xea\xb8\x75\xf8\x29\x50\xa7\xc3\x58\x31\xb7\x92\x4e\x4f\xf6\xf1\xa3\xf8\xf3\x5f\x7e\x5c\x0a\xf5\x9c\xbc\x19\x7b\xce\x98\x73\x76\x4c\x07\x35\x11\x97\x6a\x77\xe8\x51\x73\x7d\x5d\x73\xbb\xfd\x50\xc3\xa0\x0e\xdb\x72\x1c\xf4\x4f\x60\xdf\xfb\x56\xf5\xae\xb6\x9a\x72\xed\x75\xd5\xdd\xc1\x61\xa2\x9f\x88\x90\x8f\x92\x2b\x1a\xf9\x28\x31\xb7\xd1\xf8\x3b\x3a\x28\x1f\x45\x3b\x6d\x85\x27\x51\xeb\x42\x19\xb2\x1b\x82\xd5\xf2\x52\xed\xbc\x2f\x74\x70\x7d\xab\xc1\x44\x6d\xc0\x36\x45\x71\x2d\x97\x6a\xa7\x0a\xae\xfd\x02\xcd\x80\xa5\x42\x65\xbd\xa1\x54\xb5\x68\x10\x2d\x51\x37\xad\x37\xad\x90\x33\x8d\x82\x70\xac\x57\xab\x75\x0b\xaa\xf2\x0f\x6d\x68\xd0\x76\x39\x1d\x2d\x04\x82\x17\x5f\x58\xbe\xff\x03\xb4\xa7\x03\x32\x11\xef\x80\x4b\x1a\x83\x42\x7d\x9f\xd6\xdc\x6c\xcb\x76\xbe\x14\xde\xad\x66\xea\x42\xb2\xb8\x02\x68\x2e\x8d\xca\xf8\x37\x3f\xf2\x05\x44\xe4\x49\xe7\x01\x91\xb0\x45\x2f\x99\x65\x1c\x99\x4f\x92\x8a\xb8\xf2\xef\xf7\x93\x00\xdf\x3a\x02\x6e\x04\xff\xa8\x43\x29\x82\x6f\x88\x93\x06\xf7\xe7\xfd\xc8\xfd\x71\x7f\x68\x9f\xde\x47\x1b\xe5\xfe\x64\x7c\x0e\xd3\x09\x7f\xde\x2f\x39\xdd\xf8\xa8\xa5\x73\xfa\xbc\x23\x44\x21\x1b\xe4\x1d\xac\x7a\x2b\x5e\x73\x35\x3e\x4f\x96\xe3\x1e\xff\x7b\xee\xac\x79\x67\xf9\xfe\x83\xc6\x17\xef\x8b\x1e\xd1\xe5\x96\x56\xce\x77\x33\x6e\xfa\xc9\xe4\xbf\x38\xdb\x3b\x5d\xe6\xff\x3f\x6e\xc2\x5f\xf6\xb2\xf0\xb7\x3c\xe5\x2f\x1d\xef\xeb\x2f\x4b\xe2\x1a\x1b\x15\xbe\xd6\xfa\x7c\xb9\x7f\x7d\x58\x70\xe8\xb8\xf5\xf9\x5d\x2f\xc7\x78\xcb\xeb\xf3\xbb\x6b\x4d\xf9\x77\xf1\x94\x93\xa9\x43\x42\x09\x17\xfb\xc4\x5c\x27\x3f\x7e\x4c\xc2\x3c\xfc\xa7\xd4\xd5\xda\xf5\xf3\xcf\x23\xc8\xe8\x35\xe8\x66\x48\x6a\xc0\x97\xe2\x9f\xf7\x2f\x45\xb2\x0c\xff\x7c\x96\x4e\xfd\x40\xf7\xdc\xe8\x39\xcc\x60\x87\xc4\xcf\x62\x1e\x40\x23\xe3\x12\x9a\x18\x13\xa2\x30\xff\xbc\x5d\x1f\x19\xea\xb7\x95\x4e\x98\x69\x5d\x15\x23\xd9\xad\x18\x24\x01\xb3\x5e\x61\xac\x2f\xda\xe1\x21\x0a\x60\x22\x74\xbb\x54\xcd\xb6\x34\x8a\x8f\x67\x1a\x0c\xeb\x18\xfb\xed\xba\x0d\xea\xd2\xaf\xfd\x6f\x60\x1b\x7f\xc4\x53\x28\xfc\xa3\x72\x7a\x76\xde\x7d\x8e\x02\x1d\x47\x99\x8e\x86\x74\xc8\x7c\x11\xb6\x3d\xe1\x15\xb3\x34\xe5\xef\x86\x9d\xc3\x68\xfc\x73\x2e\xff\xf5\x94\x3c\x8c\xf1\x4b\xd6\x34\x2f\x97\x76\xaf\x52\x87\x01\x1c\x12\xf9\xdc\x9f\x4f\x79\x4e\x65\xc0\x4c\x31\xe2\x0e\x8f\xe2\xf6\x32\x47\xaa\x3b\xa4\x6b\xb3\x43\xe3\x37\x2a\x9a\x71\x57\xa3\xfd\x13\x98\xee\x28\x76\x08\x32\xb1\xb5\x00\xf7\x72\x53\x42\xe3\x1b\xbc\x39\xb9\x49\x5b\xdc\x95\xaa\x2a\xa6\x9d\x9d\x72\x1b\xd4\x0d\x5f\xea\xec\x50\x4e\x8f\xfc\x13\xd8\xa3\x51\x2c\xd9\x35\x0f\x65\x4e\xf5\xf9\x23\x4f\x39\x99\xfa\xcd\x58\xb2\xa1\x87\xa6\x67\x44\x6c\xd1\xaf\x45\x1b\xf7\x70\x6d\x3f\x13\x86\xcb\x32\xb4\x2f\xe5\xfa\x38\xf5\x83\x8b\x78\x5a\x74\xee\x29\x3e\xfc\x64\x54\x5e\xce\xe5\xbb\x56\x25\xd8\xf7\xe0\x03\x24\x03\x57\xf3\x4b\x20\x5c\x1a\x52\xdf\x37\x8c\x6d\x51\x5b\x24\x62\xce\x47\xe4\x52\xa1\xc3\xfe\x4c\xb7\x4b\xf0\x69\x6f\x7d\x77\x13\x44\x13\x07\x86\x91\x2b\xb5\x30\x8e\xb4\x70\xe1\xbe\x1d\xdf\xc5\x0b\x05\x42\xc1\x8b\xe2\xc3\x49\xc8\xb1\x95\x39\x82\x79\x96\x87\xb7\xfe\xf7\xcf\xf6\x80\x10\x35\x72\xc1\x62\xea\xe6\xa0\x8a\x60\x21\x59\x5c\x1a\x28\x99\xd2\x75\x0d\xf7\xe7\x9a\x9c\xd3\x08\xda\xf0\x3e\xde\x99\xd1\xcc\xd3\x80\x76\xec\x53\x4e\xb6\x1d\xe0\xa0\x7a\x86\x30\x48\xc0\x6f\xa6\x17\xe2\x1d\x7e\x7e\x97\x7b\xb7\x87\x99\x8a\x07\x72\xa3\xa9\xdf\x90\x29\x3a\x94\xe8\xf8\xf6\xf6\x93\x1e\x9c\x71\x96\xee\xf4\x6c\xc9\x17\x07\xd2\x9f\xcc\x5a\xe7\xd8\xa2\xb8\x8f\x1b\xad\xf6\x78\x8d\x13\xef\xf3\xcb\x1f\xed\xa8\xe5\x58\xa4\x78\x28\xa3\xa7\x9f\x2c\xc3\x2d\x68\x9f\xf8\x38\x7e\x77\xf0\x56\x1f\x4a\xd3\x7e\xf7\xb3\xe7\x7a\x22\x04\x38\xe3\x21\xe0\xd0\x2b\xb7\xd8\x58\x99\x46\xb6\x0a\x00\xe7\x09\xf2\xe2\x52\x81\xef\x3d\x00\xb1\x25\xd1\xcf\x34\xe9\x7f\x51\x3b\x0c\x95\x99\x88\xcb\x5a\x6f\xeb\x7f\x51\x3b\xef\xba\x9c\x99\x62\x17\x36\xcd\xe3\x9d\x0d\x04\xef\x85\xa6\x53\x25\x8a\x7b\xb6\xe7\xd7\x7f\xb3\x87\x9f\x85\xfd\x77\xb9\x03\x9a\x46\x28\x72\xfc\x76\x04\x95\x9a\x87\x76\xe3\x9f\xd9\x02\x39\xfe\x3e\x40\x38\xc4\xb4\x62\xd6\x28\x79\x99\xbb\x78\xae\x1d\xbf\x54\xbd\x82\x21\x2b\x01\x54\xf9\xad\x6a\x8f\x93\x97\xd9\x17\x99\xca\xa2\x38\xee\xbe\xdc\x7b\x47\x71\x3f\xb4\xb0\x94\x06\x5a\xe8\x1d\xc6\x75\xfa\xe8\xe0\x93\xd5\x73\xbd\xa9\x5b\x48\x6c\xdb\x6e\x75\x08\x68\x72\x11\x46\xc2\xc8\x15\xbc\x39\x13\xf1\xd7\x5f\x99\xbf\x52\xd0\x35\xac\x02\x01\x97\xcd\x94\x03\x2d\xf3\xc0\xc2\x01\x6e\x66\x25\x4b\x70\x55\x71\xc1\x4a\x80\x4c\xd9\x12\x7c\x82\x04\x80\x4d\x0f\x5d\x28\x5e\xe9\xfa\x21\x35\x45\x3a\x57\x82\x83\x89\xe2\xac\x66\x84\x8e\xe6\x2f\x5e\x21\x64\x5d\x9c\xea\x46\xe8\x55\xd9\xda\x7f\xfe\xf7\x7f\xfe\x17\x0c\x7d\xa6\x96\xf2\xaa\x44\x74\x99\x38\x4d\x54\x81\x4d\x60\x38\xdd\x1c\xf0\xd6\x01\x9f\x4d\x2c\x36\xed\xa6\x51\xe2\x4a\x35\xc6\xc3\xa6\xc1\xe4\x47\x61\xa7\xf5\x6c\x41\xa1\x16\x72\x53\xb5\x8f\xfa\x4a\xf0\x9c\x96\xb9\x8b\x1b\x8b\x5e\x2e\xea\x44\x39\x72\x0e\x6f\xc5\x9e\x28\xb6\x40\x4d\x33\xcc\x66\xea\x13\x2f\xab\x0b\xdd\x94\xed\x72\x45\xa9\xf3\x7d\x44\xfa\x6c\x27\x8c\x92\x0d\x86\x9e\x43\x28\xbe\x65\x42\x8c\x50\x75\x61\x84\x29\x31\xa8\xd5\x35\xc5\x18\xa0\x99\x9c\x5f\x7a\x24\x61\x4d\x01\x23\x66\x2a\x5e\x1c\xad\x44\xdb\xec\x28\xb0\xc9\x28\x25\x96\x7a\x2b\x16\xd2\x07\xad\x5f\x28\x1f\x19\x4b\x07\x52\xb6\x62\xa5\x0b\x55\x01\x0b\x54\xb6\xd8\xf5\x66\x4d\x51\xb2\xb6\xa5\xad\x6e\xe8\xe8\xb6\x8d\x2c\x94\x5e\x2c\x10\x3f\x7b\x2e\x3d\x80\x31\x85\x18\x43\xb8\xce\xd4\x47\x60\x3e\xbb\x72\xe7\x5e\xc2\x5d\x50\x75\xa1\x0a\x37\x79\x58\x2c\xdb\xce\x51\x41\xf1\xdb\x2c\x52\xdf\xb1\x66\x96\xe8\xf9\xf1\xc2\x13\xe1\x33\xac\x88\x05\x84\x03\xd8\x93\x86\x59\x6d\x66\xcd\xa6\x85\x9a\x73\xe5\x43\x84\x65\x53\x1a\xf0\xa0\x73\xe8\x07\xae\xb1\x0b\x0d\x2b\x4e\xdd\xbc\x94\xeb\xa9\x78\xd1\x1e\x15\x02\x31\xed\x34\x60\x90\xea\x46\x89\x65\xd9\xb6\x3e\xea\x13\xa0\x03\x30\xe0\xb3\xf4\x53\x5f\xe8\x66\x2b\x9b\xe2\x21\x84\x33\xd8\x95\x84\xc1\xc0\xbf\x2e\x34\xef\x41\x68\x8a\x51\xae\x75\x5b\xce\x95\x8f\x65\xac\x15\xe9\xed\x4e\x4f\x45\xa5\x5b\xc0\x95\xa9\xb4\xbe\x14\x72\xa9\xa4\x43\x7a\x28\xb4\x32\xb8\xfb\x75\x51\x29\x8a\xf3\x96\x95\x90\x46\x6c\x55\x05\xff\xf7\x2b\xec\x1a\xc3\x93\x05\xc8\x36\xb6\xaf\x23\x7b\x67\x37\x66\x23\xab\xa9\xf8\x46\x99\x12\x24\x6b\x37\xbe\xfc\xf6\x88\x56\xfb\xd5\xd7\xcd\xa5\x3d\x69\x0e\xce\xcc\xd0\xd6\xb9\x00\x8e\xb9\x5e\xef\xa0\xa5\xed\x52\x57\x90\xe2\x3c\x9c\x83\x17\x35\x41\x1c\xe0\xd2\x01\xc7\xe5\x36\xbf\xaa\x30\x4a\x1c\x30\x11\xe0\xac\x84\x25\xb7\xe7\xbc\x88\xce\xc0\xb1\x2c\x0a\x52\x54\x52\x54\x2d\x06\x8a\xbe\x94\xeb\x13\x4b\x6f\xec\x74\xe0\x1b\x85\x8d\x9c\x62\x88\x8f\x1f\x08\x22\xd4\x10\x7d\xa2\x00\xe0\x42\x4d\xd0\x77\x79\xe3\x30\xb7\x13\x72\xe0\x58\xc4\xe3\x13\xb1\x5d\x96\xf3\xa5\x6b\x6d\x63\x28\xcd\x12\x50\x74\x7f\xc7\xa7\x31\x5b\x75\x7a\x2a\x80\x6a\x4c\x84\x83\x12\x45\x9d\x2e\x53\x64\x44\xef\x20\x0f\x1b\xd3\x8d\x38\x06\x10\x34\x08\x34\x13\xa5\xf8\x3d\xa7\x3a\x84\x83\x7c\x26\xca\x5f\xff\x3a\x65\x59\x89\x91\xe1\xc5\xff\x5c\x32\xd0\x28\xde\xe5\x7e\x36\x2a\xcb\xd8\x21\x04\x96\xd9\x54\x76\xb7\x02\x61\x8c\xe6\x80\xc9\xcc\x51\x69\xfd\x8a\x02\x67\x7c\x01\x5f\xc2\x5b\xf7\x7a\xe3\x66\x5d\x84\x3e\x0b\x54\x0a\xb1\x77\x94\x1c\xc5\xca\x1d\xc9\x6f\x1f\xda\x6f\x43\xd3\x61\x54\xb0\xae\x67\x19\xa3\x22\x6a\x66\x6c\x43\xf9\x85\xc6\x8f\x7c\xb5\x29\xf2\x8c\x87\xd6\x7d\x25\x9c\x24\x10\xb6\x24\x19\x8a\xab\x11\xf6\x43\xe7\xc6\x99\xd1\xf9\xf6\x34\x14\x87\xd4\xc6\x58\x66\x75\x58\xf7\xf1\x56\x5d\x7b\x5e\x70\x1a\xfd\x3e\x9c\xa4\xe6\xa1\xc6\x33\x3c\x9e\x0f\x13\x78\x87\x10\x28\x4a\x5e\xc2\x6b\x85\x18\x12\x06\x88\x1d\x10\x5c\x58\x7c\x1f\xda\x25\xde\x01\xb5\xe2\xcd\x6c\xea\x85\x6e\xda\x0d\xc4\x70\xb1\xa8\xdc\xb6\x29\x2f\x2e\x10\x73\x45\xd9\xf6\xb6\x48\xa2\x11\xaa\x46\x41\xdc\x28\x84\x9a\x79\x12\xeb\x9e\x2b\x31\x53\x6d\x0b\x40\x5f\x3b\x24\x5e\xab\xd5\xa6\x46\xa1\xc3\x07\x29\x50\x7c\xa9\x90\x20\x84\x58\x61\xc4\x65\x01\xf6\xed\x50\xaa\xe7\x49\x80\x1c\x9f\x08\xd5\xce\x83\xb2\x80\x1f\x8f\x1e\x36\x98\xef\x3c\xdb\x5c\xae\x39\x1f\xe0\x71\x86\x62\xe0\x32\xf9\x23\xb0\xa7\xb1\xb1\x71\xc2\x87\xf9\x92\x78\xea\xd6\xb9\x9d\xc0\xab\xb2\x55\xa2\x28\x29\x67\x9c\x4b\x68\xe6\x7d\x45\x29\x3e\x19\x94\x34\x71\x7b\x3e\xe6\x0f\x21\x08\xa2\x5a\x28\x95\xb0\xf2\xbd\xe8\x06\x6e\x36\x27\xdd\x95\x72\xff\xef\x52\x8c\xf1\xb1\xb3\xc5\x87\xe8\x9c\x77\x89\xd8\xd0\x79\x07\xff\x7d\xbd\x69\x11\xdc\x47\xd9\xe7\x7c\x4d\x0f\x39\x30\x06\x88\xd9\x64\xfc\xeb\x8b\x0f\x63\xb3\xa9\x79\x38\x68\x96\xb2\xb2\xe0\xc3\x2c\x7d\xf0\x43\x78\xaa\x16\xaa\x71\x51\xee\x20\x62\x63\x88\x35\x18\xf5\x10\x2c\xa7\x29\x2f\x96\x2d\x05\xbd\xe3\x48\x4a\x03\xbb\x3b\xe5\xcd\xbd\x98\xaa\x29\x56\x87\xb4\xfa\x70\x55\xc1\x65\xca\x50\xd4\xbb\x87\xd2\xf1\x6c\x5c\x01\x7d\xdb\xe6\x78\x43\xf0\x36\xcb\xf9\x92\x35\x11\x72\x94\x01\x4e\x8d\x7d\x84\x91\xc9\xdd\x72\xd4\xa9\x40\xb5\x78\x73\x5e\x9e\xf2\x46\x51\x5d\xb3\x70\xda\x74\xc3\x78\x64\x76\xba\x88\xf7\xf2\x55\x32\x45\x07\x2f\x2b\xd3\xff\xbb\xe7\xe8\xfc\x3c\xf3\x8e\xc4\x80\x48\x80\x19\xd2\xd8\x85\xa1\xfb\xa5\xea\xc2\x9d\x9b\x28\xe2\x15\x30\x0c\x64\xcd\xaf\x4d\xa3\x8c\xdf\xac\x51\xd8\x2b\x9d\x4b\x43\xd2\x51\xe6\xb4\x75\xe6\x34\x40\xc7\x90\xb5\xb2\xe4\x20\x88\x28\xb2\xb6\xec\x70\x93\xde\xed\xc6\xa5\x81\xad\xc5\x7c\xa9\xb5\x01\xc8\x47\x69\x90\xb9\x0e\xcd\xa1\xec\xe3\xe6\x28\xb6\xa5\xe5\x71\xab\xca\xca\xaa\x3e\xdc\xd9\xf3\x50\xf4\x9e\x1f\xf8\x74\x93\x6e\x8f\x3d\x8f\x7b\x5d\xcb\xc7\xbc\x8a\xa4\x76\x78\x9f\xc6\x47\xe3\x1f\x67\x89\xcf\x91\xf7\x41\x72\xf5\x7e\x3c\xbd\x3a\x80\x62\xdd\x2e\xcd\xea\xa3\x5a\xef\xd3\x6b\x94\x35\x66\x0f\xdc\xd8\x5c\x03\xbd\x37\x3d\x57\xfe\xd3\x61\xc7\x9d\xa0\x69\x24\xe3\x4a\x50\xce\xb8\x54\x08\x45\x63\x17\x01\x60\x66\x40\x52\xdb\xb8\xcc\x9d\x3d\x80\x31\xfb\x41\x72\xd8\xbd\x74\x03\xf8\x17\xa5\xd6\xc2\xcc\x65\x0d\x78\x22\x56\xa6\xf4\x39\x43\xe5\x1a\x1d\x39\x30\xc1\x02\x5e\xfc\x02\x00\x06\x20\x39\x89\x95\x79\x68\x40\xd7\xbb\x19\xd1\xbd\xf8\xdc\xf3\x8d\xd7\x34\x4e\x8f\x65\x25\x43\x8f\x29\xe3\xb2\x9f\xbd\x49\x5b\x60\x6c\x4d\xde\x47\x81\x74\x33\x48\x62\xc9\x39\xd1\x64\x50\xe7\x90\xd1\xf1\x0a\x6a\x82\x24\xec\x78\xc5\x84\x80\xf4\x04\xa5\x64\xeb\x92\x53\x05\x2f\x48\xcf\x91\x06\x1e\x28\x6d\xae\x6c\x51\x19\x04\x6a\x0c\xb8\x44\x00\xbf\xc6\x00\x90\x90\xd0\xc6\xc8\x6e\x0e\x5d\x2d\x6d\x0d\x50\xd6\xa2\x1f\xd3\x1d\xfc\xf3\x11\x8e\xe3\xe8\x2f\x7c\x0d\xfb\x4c\x3b\x71\x91\xac\xf1\xe5\x70\xb2\xf6\xf9\x2d\xd3\xb5\x3d\x94\xe8\xf3\x1b\x93\xa2\xcf\x0f\xa5\x45\x9f\x67\xa5\xe8\x31\xe7\xdb\x92\xa3\x7a\x97\x79\x48\xe9\x34\x20\x44\xde\x5c\xd7\x66\xb3\x52\x85\x90\x33\x4b\xca\xed\xcf\x8e\x36\xa4\x42\x10\x22\x18\xc9\x82\xf0\xb3\x92\xf3\x13\x1d\x98\x8e\xa9\x6b\xa1\x9b\x67\x72\xbe\x3c\xee\xc9\x55\x23\x02\x95\x1d\x06\x26\x0b\x4a\x85\xd8\x1c\x35\x4c\xa2\xf7\x68\x6e\xbd\xaa\xe6\x00\xe5\xad\xd3\x68\xed\x53\xe2\x96\x4c\xd9\x93\x04\x83\x4a\xd3\xa7\x44\x3e\xf1\xd9\xc9\x2c\x1d\x09\x39\x65\x7d\xb2\x12\x87\x78\x1c\xb4\x21\x51\xde\x81\xbc\x85\x92\x8d\x9a\x16\xef\xfe\x88\x0c\x02\x39\x84\xec\xc7\xb5\xcb\x9c\xe4\x1c\xfe\x28\xb9\xc0\xac\xba\x8b\xf4\x3a\xa9\x66\x0c\x32\x40\xc9\x99\xf6\x6b\x03\xb9\xa2\xa4\xf1\x47\x9c\xbd\x0f\x89\x6d\x92\xad\xc1\x54\xd5\x6d\x53\xaa\x34\xef\x70\xca\xea\xad\xb5\xb1\xf7\x58\xbd\x94\xeb\x58\x33\xe6\xda\x49\x08\x4d\x28\x1e\x75\x10\x56\x38\x49\xa4\x48\x96\xa0\x34\xf5\xd5\x44\x1c\x7d\x97\x9d\x5b\xce\x8a\x02\x8c\x2e\x2d\x34\xb8\x5a\xa2\x5d\x65\x53\xab\x80\x95\x6e\x2f\x86\x99\x8a\x27\xba\xbe\x52\x4d\x4b\x0f\x80\x14\x46\xfd\x6d\xa3\xea\xb9\x3a\x75\xfb\x27\xd0\x8a\xa7\xa8\x0d\x9e\xbb\xc5\xf8\x73\x37\x3e\x8f\x8d\xfb\x93\x49\xed\xe5\xd2\xd0\xc7\xe4\x90\x67\x89\x1c\x52\x81\xa2\x14\x54\x55\x08\xcd\x27\x8a\x72\xb1\x50\x10\x7f\xeb\x2f\x09\xc2\x80\x39\xce\xd3\x72\x52\x90\xaf\x7a\x9a\xf0\x2b\x8c\xe5\x0a\x9b\x14\xe3\x75\x77\x6f\x4e\x60\x1d\x5c\x81\xf4\xdc\xf4\xa9\x67\xa9\x63\xd3\xaa\x35\xd1\x79\x4f\x24\xad\x70\xc8\x4d\x99\xc4\x87\xdd\x87\xc2\xd3\x42\xd7\xea\x6c\xa8\x62\x7c\xb0\xb8\x3e\x17\x1b\xe8\x84\x2c\x5d\x4f\x9d\x9b\x6a\x4c\x98\x62\xf7\xba\xab\x79\x9f\x7f\x1b\xce\x36\xff\x38\x50\x1a\x47\x83\xd6\x8d\xbe\x2a\x0b\x55\x88\x5a\xfb\x3e\x33\x04\xe4\xef\x53\xf3\xec\xbf\xd2\xbe\xf7\x9d\x97\x21\xed\xf4\x7d\x76\x7e\x1c\xdf\x3e\xe9\x6f\xf0\xe7\xab\xa7\x0e\xd7\xe0\x17\xf5\xf4\xcd\xd4\xd3\xf7\xbd\xec\xf9\x8b\x5a\xfa\x17\xb5\xf4\x2f\x6a\xe9\x9f\xb3\x5a\xda\xbf\x1e\xbf\xa8\xa0\xef\x46\x05\x7d\xed\xf7\x39\x51\xba\x7d\x31\xa4\x8d\x1e\xf1\xf6\x25\xfa\xb0\x2f\x7a\xa8\xe8\xcd\xb5\xd1\x5f\xfc\x3d\xab\xa3\xbf\xb8\xb1\x12\xe8\x8b\x43\x95\x40\x5f\xfc\xa2\x91\xbe\xd9\x45\x89\xae\xc9\x97\xd7\xd5\x4d\x8f\x64\x1f\x59\x47\x39\x35\xf2\xb5\x74\xd3\x5f\xfe\xa2\x9b\x66\xad\x5d\x4f\x37\xfd\xe5\x7e\xdd\xf4\x97\xb7\xa8\x9b\xfe\xf2\xc7\xd5\x4d\x7f\x79\x63\xb2\xf4\xe5\xa1\x64\xe9\xcb\x5f\x74\xd3\x77\xa6\x9b\x46\xd0\xec\x41\x58\x68\xae\x99\x1e\x01\x10\x8d\xe4\xc1\xa5\xcc\xf7\x1e\x98\x10\xf8\x64\xe9\x2b\xf8\x7a\xeb\x9a\x85\x50\x7a\x5f\xe2\x88\x3d\x72\x8d\x91\x98\x89\x32\x22\x2c\x7b\x80\xd7\xee\x8c\x30\x87\x58\x1c\xbe\xfa\xc4\xaa\x59\x70\xea\xef\x43\x76\x14\x62\xd0\xc2\xc1\x81\x90\x2c\xa3\x45\xa5\xda\x23\x83\x3e\xa1\xe4\x90\x59\xb6\xf0\xd8\x44\xe4\xc8\x9e\x92\xeb\x70\x9f\xdd\x01\xd3\xf5\xf1\x5b\xbe\x07\xf0\x6e\xec\x56\x9d\x25\x67\xf4\xda\xe8\x77\xfe\x35\x60\x22\x6c\x48\x39\x13\xa1\x82\xf8\x35\xdc\x06\x22\x8e\x5c\xa4\x15\x42\x5c\x5b\x61\x2d\x63\x19\x57\xd7\xee\x8d\xbe\x66\x1a\x9f\xa0\xff\xba\x6b\xcc\xf1\x51\x50\x66\x5d\xa0\xb9\xc1\x0b\x3a\x84\xe8\xcd\x37\x7d\x0f\xb6\x77\x08\xb0\x71\xb0\xd4\x3e\xc4\x86\xeb\x71\x47\xa4\xfc\xc9\x70\x07\x9e\x3b\x7e\x81\xf1\x39\xfe\x05\xb4\x7b\x3a\xef\xc4\xe3\x91\x08\xdc\x7a\xa6\x59\xae\xd7\x55\xa9\x8c\x73\xeb\xf6\xd7\xc8\x3b\x66\xaf\x04\x46\x96\x44\x64\xd6\xe7\x39\xeb\x43\x3c\x08\x05\xdc\xed\x77\x51\x6e\xe2\xeb\x08\xc3\xbc\x2f\x0e\x58\x3c\xa2\xd1\xef\x41\x3e\x1f\x7f\x38\xb3\x57\x7b\xf0\x7a\x47\xbb\x3b\x3c\xda\xaf\x63\x10\xf5\x80\x79\xfa\x68\x24\xba\xba\x18\x44\x58\x8f\x46\x92\xad\x33\x06\xa3\xeb\x87\x2c\x57\x35\x1a\x6b\x3d\x53\x69\x18\x6f\x5d\x24\x81\x51\x59\x82\x26\xf2\x3c\xcd\xf8\x3d\x1d\x8a\x0a\xfa\xd4\xa7\x7d\x1a\xfb\xd8\xd3\xff\xfd\x1d\x5d\x66\x92\x15\xf9\x87\x71\xcc\x49\x49\xd2\xf9\xec\x45\x82\xcc\x1f\xab\xc3\x01\xcd\x18\xe9\xb9\x03\x88\x58\x0e\xc8\xf6\x7f\xdd\x1d\x3e\xbe\xef\xa2\x0f\x21\x3f\x43\x95\xbb\x95\x47\xce\xd7\x97\x0f\x0f\xef\xe0\x6b\xd1\x0b\x9c\xcf\x07\x35\x04\xa1\xcf\x02\x31\x65\x55\xfd\x43\x3e\x12\x3d\x80\xfe\x87\x11\x84\xeb\x10\xf9\x41\xec\x7c\x71\x20\x9d\xfd\x39\xd3\xb9\x3b\xcd\xa5\x70\x17\x4c\xdc\x40\x8e\x02\x7e\x31\xf1\xfb\x50\xb6\x82\xb1\x22\x16\xf8\x68\x98\xa0\x2b\xde\x1d\x35\x4a\x00\x68\x7c\xa5\x8c\x99\x8e\xbd\xd2\xfe\x72\xf4\x24\x03\x8c\x2f\x4e\x6f\x8a\x84\x1b\x5e\x9c\x3d\xd7\x66\x30\xb5\xc0\xf8\xe4\x02\x87\x5c\xaf\x9e\xcb\xd5\x73\xf2\x0f\xba\x58\x1d\x97\x87\x3b\xcf\x25\x31\x2a\x93\xc4\x5d\xdc\x8a\x81\xcc\x0b\xfc\x56\x0c\xe7\x60\x08\x0f\x16\x21\xfd\xff\x23\x3e\x59\x2c\xc1\xc4\x83\x07\xee\x1e\xf5\xa4\x97\x38\xef\x4b\x2f\x91\xa9\x99\xf8\x13\x9e\xef\x4f\x2e\x71\xe3\xcb\xbe\xf7\xba\x1f\x96\xd0\xe1\xb0\x7b\xfd\x0f\xfc\x6c\xde\x46\xa2\x8f\x9b\x10\x09\xe7\xce\xfa\xf8\xf5\x0b\xb4\x69\xda\xb3\xed\x95\xf9\x31\x52\x45\x48\x7a\xee\xcc\x70\x3e\x43\xa7\x24\x6d\x3e\x58\x04\x8c\xaa\x16\x90\xc7\x7b\x87\x4d\xce\x14\x4f\xb1\x1b\x37\x04\xd6\x02\x08\x5b\x07\x1f\x3e\x80\xae\xd9\x5c\x40\x87\xd8\x9c\x1f\x87\xa4\xac\xe1\x6b\x09\x99\x37\xfa\x1d\x7f\x61\xd2\x66\xb4\xcf\xef\x3e\x47\x5f\xdf\x0b\x29\xd7\x1a\x35\xdf\x34\xa6\x74\xb9\x22\xd1\xd2\x0c\x0e\x3c\x7a\x2d\x2a\x75\xa5\x2a\x22\x31\x90\x8d\x51\x36\x8d\xdc\x81\xe3\x40\x6b\x57\x1e\xb4\x97\x06\xdc\x33\x61\x11\xbd\x50\xe7\xda\x02\xf5\x9d\x2d\xe0\x12\x69\x4c\xc5\x2b\x65\xc0\x1f\xd4\xb6\x84\x8a\xdc\xa5\x42\xa0\x64\x88\xff\xf7\x6b\xdc\xd2\x19\xa3\x24\xa8\xa7\xa7\xbe\x0d\xd4\xfa\x4e\xc5\x1b\x1c\xba\xae\xbd\xbd\x94\x9c\x2c\x6a\xdd\xac\x64\x25\x16\x95\xde\x86\xf0\xf8\x3f\x22\xb8\x40\x98\xd6\xa6\x46\xff\x51\xd7\x2c\x18\xf3\xd0\xe0\xb4\x43\x25\x3e\x8e\x71\x1a\xad\x5f\xa5\x64\x61\x40\x89\x5f\x0b\xb9\x9a\x95\x17\x9b\xb2\xdd\x89\x99\x6a\xb7\x4a\xd5\xe2\xf7\x5f\xfd\xf0\xe7\xe9\x74\xfa\x97\x4f\xbf\x3f\xfd\x0a\xb6\xf8\xf7\x5f\x4d\xa7\xd3\xdf\x9f\x7e\xe5\x1b\xf9\xde\x2d\x9d\x1d\x28\x36\xa0\x37\x06\x70\x00\x0c\x19\x10\x9c\x23\x76\xd0\x53\xab\x5a\xce\x2c\xff\x27\xe7\xad\x57\x3e\x3d\x78\x90\x47\x37\x1c\x02\xe2\xe3\x3f\x0e\x6b\x81\x78\xc1\x3c\xfc\x69\xe8\xb5\x0f\xa5\x2e\xb5\xf1\xd2\x0e\x90\x3b\xa4\xed\xde\x78\x8a\x52\x1a\xc4\x75\x12\xe7\x87\xcf\x8a\x01\x63\xbb\x66\x6e\x1f\x71\x90\x08\x4e\x27\x53\xe8\x35\x15\xad\xbd\xd7\xd5\x99\xa4\xc5\x08\x28\xbd\x91\x63\x1a\x25\xce\x0f\x0d\x28\x33\x9e\x1e\x7c\xbb\x91\x23\x1a\x29\xc9\x1c\x38\xa6\x1e\xe4\xa8\x91\x63\x1a\xc9\x47\xee\x1f\x53\xc7\xca\x78\x3b\x20\xa5\x23\xa7\x31\xda\x14\x37\x0c\xfa\xd9\x45\xfd\xcc\xa0\xcc\x75\x06\x77\x43\xb0\xa1\xfd\xd0\xa3\x7b\x31\xed\xfa\x06\x72\x70\xec\xcc\xfe\xb1\x74\x69\xcd\x4f\x13\xa8\x6e\xb0\x55\xef\x3c\x7b\x94\x7a\x9b\x45\xfe\x71\x18\xcd\xe1\xfd\x6c\x1d\xf3\x42\xab\xcd\xdc\x38\x00\xcc\xcb\x94\xdc\x94\xe9\xf1\xbd\x26\xb8\x40\x60\x18\x6d\x1a\xdd\x00\x28\x13\x5a\xeb\xa9\x21\x78\x13\x00\xff\xa8\x28\x8d\x7d\xf2\x8a\x49\x68\x67\x1b\xec\xab\xed\xb2\x51\x5b\x7c\x2d\xa7\x09\x9d\xe7\x2c\x67\x2b\x2f\x3a\x54\xfe\x49\x25\x8d\xf1\xda\x85\x7e\xb4\xc8\x14\xbb\x15\x1e\xa9\xda\xb4\xb2\x9e\xab\x98\x21\x0d\x92\xce\x59\x52\x07\x4e\x09\xd5\x99\x36\xaa\x2e\x54\x33\x7d\x5f\x9a\x97\x7a\x7e\xe9\xb6\x2c\x07\xaf\xef\x6c\xc9\x95\x5d\xab\x4d\xab\x1f\xae\xf4\xfc\x12\x78\x8e\x75\xa3\xe7\x0a\x78\x22\xc7\xa8\x1c\x45\x89\xf9\x31\xbd\x44\xda\x5e\x07\xe2\x4d\x74\x50\x61\x73\x70\xda\x84\x6e\xd4\xaa\xda\x0e\x54\x56\xd5\x4e\x2c\xd0\xbb\x9b\x78\x5a\x4d\x67\xe4\x43\x0b\x4b\x3b\x41\x00\x21\x42\x71\x32\x00\xf6\xc5\x9b\x72\x07\x18\x01\xad\xe6\x76\x1f\x54\xe4\xac\xaa\x4c\x55\xd6\xed\x43\xda\xfa\x87\xb6\xe1\x87\x95\x3d\x70\xa2\xd6\x0f\x6d\xd7\xd4\x73\xbc\xa1\x6e\x25\x65\x35\x62\x57\xed\x2e\xfa\x62\xc9\x36\xda\xc3\x17\xaf\x52\x37\xac\xe3\x57\xe6\x78\x3a\x9d\x9e\x3c\x12\xaf\x34\x02\x34\x6d\x21\x3a\xce\x36\x02\x9c\xa4\x5e\x09\xda\x67\xe4\x16\x01\x91\xaa\xda\x91\x63\x92\x74\xe7\x1c\x4e\x0c\x70\x71\xa5\x71\x28\x90\x53\xf1\x6d\x33\x41\x47\x33\xdb\x80\x65\x9d\x6d\x0f\x93\x28\x75\xc8\xd1\x24\x0c\x7f\x5a\x94\x66\x5d\xc9\xdd\x2b\xb9\x52\xf6\x19\x09\x1f\x6a\xfa\xe5\xc8\xff\x74\xd4\x83\x22\x2a\x22\x06\xcd\x0b\xa1\x8e\x1d\x6d\x14\xfa\xf3\x7b\x56\x1c\xc3\x07\xa6\x5c\x04\xbb\x81\x3d\x1d\x7a\xce\x52\x6c\x14\x7a\xce\xee\x7d\xba\x77\x0f\xe3\x61\xba\x1f\xc5\xb9\x80\x7f\xbd\x71\xdf\x9a\xe3\xb6\xd9\xa8\x09\xc4\x6b\x59\x2e\xaa\xaf\xe2\x8b\x1a\x7c\x9d\x32\xf5\x69\x97\x79\x03\x2b\xbd\xa9\xdb\x43\x2a\xc3\xff\x6c\xed\x90\xd3\xaf\xd2\x75\x24\xca\x79\x9f\xb5\xad\x6e\x2e\x5f\xd4\xaf\xc9\xe3\x0d\x49\xc1\xfd\x6c\x82\xc6\xb8\xe4\x34\x20\x79\xba\xcc\x8d\xe4\x0a\x94\x0b\x45\x7a\xa3\xcc\x66\x45\x50\x77\x97\x20\x91\xed\x54\x1b\x82\x3c\x55\xd1\x09\x42\xb2\x74\xab\xb7\x47\x2e\x05\xe0\xde\xf9\xad\x04\xd5\x00\x0e\xc8\x89\x06\xb9\x66\xce\xee\xc5\x61\x58\x5e\x8d\xf0\x7d\x54\xf8\x98\x37\x35\x89\x1a\x9e\xae\x55\x5d\x94\xf5\xc5\x6b\x34\x44\x47\x9f\x32\xcf\x76\x7e\x2e\xbe\x7f\x98\xb3\xfb\x47\xa4\x76\x88\x2b\x42\x53\xa4\xeb\xe3\x3d\x3a\x1f\xb5\x54\xf5\x97\x2c\x45\xae\x0e\xde\xca\x9c\x28\x15\x1c\xdf\xee\x76\x6d\x46\xcf\xfc\x13\x5b\x24\xee\xd8\x0f\x02\xd8\xa7\x7b\xf7\x7e\xa0\x5d\xb5\x2c\x89\x2a\x20\x80\xf2\xad\x33\x15\xbc\x51\x0b\x7b\x5f\x7f\xf8\xe4\x6f\x34\xca\xb2\xf6\x3e\x7c\xa3\x2e\xca\xda\xce\x4e\x9c\x0b\xe6\xda\xa6\xeb\x45\x79\x31\x11\x4b\x6d\x5a\xd2\x18\x4d\xc4\x72\x57\xe0\xe8\xfd\x2f\x66\xbe\x54\xc5\xa6\x82\xd5\x99\x00\xa7\xb1\x69\xd5\x33\x3f\xcb\xe7\xba\x61\xd1\x3f\x10\x9e\x06\x1e\x7f\x6f\x15\xb8\x6f\x91\x9f\x0e\x98\x5f\x6d\x77\xd3\xdc\x57\xc7\x81\x6c\x8c\x7a\xbb\xab\xe7\x6f\xb1\x47\xda\x1a\xac\xd6\xf9\xe4\xea\x60\x7b\x4f\xd5\xba\x29\x75\x53\xb6\xe5\xbf\xab\xb7\x9b\x59\xdb\x28\x95\x76\x99\x29\xe2\x6e\xc9\x7a\x63\x96\x7f\x0c\xab\x20\xce\xf9\x9a\x4c\x93\xaf\xae\x63\xfe\x33\xe8\x66\x07\xaa\xc1\x77\xd7\x9b\x25\x08\xcd\x1f\xdd\x3a\xc3\x06\xda\xaa\xc9\xc2\x4f\x33\xc5\x26\x9e\x03\x37\xaa\xdd\xdf\x42\xa6\x98\x6b\xa1\x6d\x76\xef\xf4\x93\x4a\x96\xab\x57\xea\x03\x95\xb1\x1c\xc1\x8b\xc0\x7e\x75\x9a\xdb\x57\xe7\xcc\xd1\xa7\xf7\xe1\xe4\x05\x56\x50\x9c\x8b\xdc\xcf\xf6\xe5\x3c\x1e\x79\xc4\x26\x62\xa5\x56\xba\xfc\x77\x45\xf7\x8e\xfe\x05\x13\x3b\x71\x33\x93\x85\x5e\xb7\xd0\x3e\x9b\x4b\x76\x44\xd3\x6e\x51\xd7\xc8\x5c\xd7\xa6\x6d\x36\xf3\x91\x0d\xe5\x8b\xbb\xc6\xf0\x7d\x1b\xd5\x50\xb7\xa8\xbf\x1a\x88\xa7\x3f\xaa\x95\x4c\xd9\x33\xa7\xb9\x05\x2b\xc9\x1b\xb5\x42\x25\x58\x69\xbc\x1b\x7e\x57\xae\x6c\x9f\x45\xa4\x4c\x14\x65\xa3\xe6\x6d\xb5\x9b\xde\x1b\xc6\x50\xe8\x7b\x7c\x27\xc0\xc7\xa6\x41\xd2\x7b\xfb\x1d\xd7\x5c\xfa\x35\x47\x87\xf7\xa1\xf6\x5e\xb3\x63\x64\x26\x9f\x8d\x4e\x3c\xde\x95\x02\x11\x1c\x42\x8a\x45\xa3\xcc\x12\x25\x42\xcf\x40\x83\x1b\xf4\x52\x02\x78\xeb\x4c\xa9\x9a\xba\x53\x85\x65\x31\x26\x21\x08\x11\x20\x56\x6d\x21\xef\xf4\x4a\x40\x01\xa0\x38\x9e\xa1\x8d\x0b\x80\x7d\x57\x65\x5d\xae\x64\xc5\x95\xea\x66\x2a\x5e\x60\x3c\x7f\x2c\x0c\x62\xcc\x92\x73\xa5\x06\x3e\x55\x33\xc7\x7d\x0c\x94\x13\x65\x2b\x2e\x54\x6b\xfc\xc8\x30\xc2\x15\x19\xf2\xa8\xb9\xb9\xac\x03\x44\x2f\x4c\x3b\x36\x07\xa0\x42\x7f\xb6\x03\x0e\xaa\x6d\xe4\xfc\xd2\x8e\x37\x1a\x27\xb5\xd7\xc3\x6e\xf4\xb0\x92\xc7\xe9\x06\xe6\xaa\x8f\xda\xd6\xc8\x9f\x89\x6d\x2e\x63\xde\x72\x6d\xe7\x04\x7f\x77\x2c\xbc\xf0\x1f\x90\x60\xf1\xef\xdd\x70\x8d\x92\x87\x5f\x44\x2b\xbb\x94\x57\xe0\x27\x6f\xd9\x4e\xd3\x4a\x82\x83\xd8\x79\xd4\xdd\x76\xa9\x18\x68\xf7\x14\x7d\x13\x30\xca\x71\xab\xec\xfd\x8f\xed\x9e\xc0\x4f\x33\xd4\xe9\xe0\x07\x2c\x11\xa8\x57\x2f\x7c\x14\x72\x34\x0f\xdb\xf8\xbd\x68\xaa\x14\x5f\x69\x07\xe3\x26\xa2\x0a\x1c\x17\xa9\x1a\x28\xb0\xc4\x5e\x02\xd4\xea\xa0\x8d\xa1\x34\x02\x10\xaa\x85\x61\x46\x59\x74\xee\x46\x1d\x47\xd9\x0a\xbd\x69\xf7\x9c\x88\xac\xa1\xe7\x6e\x8e\x43\xb4\xc5\x93\xae\xd9\x65\x42\x69\xd1\x9c\x86\x05\x01\x4b\x24\x2e\x76\x14\x5d\xb3\x55\x47\x57\x6c\x47\x5c\x85\x99\xba\xd8\xd4\xc2\xe8\x95\x62\xfb\x6a\x0f\x8e\xe5\x76\xc0\xae\x93\x64\x6b\x43\xc4\xeb\xad\x12\x95\x5a\xb0\xf3\xa2\x17\x0b\x7b\xc9\xfc\xdd\xb3\xa3\xb8\x90\x65\x6d\xda\x4c\xd0\x32\xec\xe8\xc1\x4b\x7c\x57\x17\x6f\x5f\xe2\xfe\x41\xb9\x2f\x60\x2b\xb0\x48\xb6\x64\x44\x9c\xb3\x0f\xae\x35\x4b\x69\x88\x0b\x7a\x02\xd0\xcf\x05\x8f\x28\x3b\x3d\x15\xaf\xc0\x1a\x56\xed\xdc\x0e\xcc\x64\x59\x61\xf0\x21\x5c\xdf\xb5\x11\xea\x6f\x1b\x59\x81\x19\x0b\x43\xae\xe6\xc4\x6a\x2e\x01\xcf\x05\xda\x8c\x2e\x34\x86\x59\x14\x9a\x50\xac\xcb\x0a\xf2\xec\xe1\x1e\xbb\x4c\x35\x18\x9d\xee\xb7\x0b\x3b\xf2\x78\x40\xa4\x5f\x01\x10\x03\x3e\xe3\x4c\x44\xd1\xf0\x92\x10\x9b\x55\xb0\x35\xf1\x7a\x8d\x40\x08\xb3\x9d\x64\xe4\xea\xa8\x35\x02\xb8\xec\x72\x05\x5e\x67\x41\x53\xff\xb6\x7e\x8c\x97\xe0\x79\x59\x97\x66\xa9\x0a\xcb\x2a\xf6\xee\x36\x0f\x7e\xb8\x2e\x7b\x82\x6d\x70\x86\xb3\x73\x98\x33\xe5\x69\xd4\x7d\x22\x79\x7c\x76\x57\xb2\xb9\x64\xee\xa8\x43\x87\x16\x3d\x58\x93\x66\x1b\xb5\x08\x47\xd4\x96\xe0\x36\xc8\xe3\xfb\x8e\x30\x7f\xfc\xe8\x55\x18\xae\x50\xa3\x16\xf1\x01\x26\xb9\xca\xd2\xf7\x37\x6a\x21\xf0\xb5\xcd\x5f\x7b\xfc\xf6\x4e\x5e\x88\x8f\x96\xa5\x5f\xec\xb9\x99\x5d\xd5\xe1\x98\xf9\x2e\x32\xe7\x30\x28\x0f\xdd\x35\xa6\x33\x34\x7c\x87\x7d\x8d\xe4\xe4\x8d\x38\xe6\x3f\x8f\xab\xcf\x6e\x5a\xe6\xde\xbb\xd5\xd8\x7f\xcb\x7f\x18\x6c\xd7\x1e\xb3\xfc\xdd\x86\x7f\x65\x42\xe8\x6e\x70\xb5\x83\x7e\xd5\xcb\x34\x56\x06\x2b\x0b\xd5\x88\x59\x53\xd6\x17\x10\xe6\x54\x93\xe4\xef\x4f\x1e\xe6\x93\x3e\x3e\x81\xf4\x17\x0c\x3d\xea\x45\x2b\x30\x8c\x15\x72\x99\xd8\x47\x73\xca\xd5\xb6\xf6\xf0\x6c\xea\x95\x34\x97\xaa\x08\x2a\x82\x0b\xd5\x7e\x17\xff\x78\x9c\x1d\x2b\x68\xec\x78\xad\x97\x03\x75\x26\x69\x47\x27\x67\xf7\xb2\x2f\x57\x02\x85\x06\x72\x20\x41\x70\x41\x98\xc5\xd4\x4b\x1d\x19\x3d\x93\xaf\xf1\x54\xcd\x36\x17\x1c\xb9\x6b\x6a\x3c\x92\xd7\xeb\xa5\x34\xea\xf8\x08\x5f\xe3\xa0\xdc\x4e\xde\x8a\x45\x1d\xce\xc2\xc4\xcd\xf3\xe4\xc0\x4e\x58\x4e\xaa\x4f\x41\x51\x2e\xe7\xad\x78\xaa\xae\xde\x69\x5d\x59\x41\x01\x7c\x42\xc0\xbd\xa6\x92\x17\xb8\x3f\x43\x94\xe9\xb5\x6a\x16\xba\x59\xe1\x71\x3a\xfb\x31\x9e\x02\x3c\xe7\xd7\x78\x07\x98\xbc\xbe\x97\x48\x0e\x8b\x9b\xa7\xa7\xe2\xf5\xc6\x2c\xfd\x79\x23\x3c\xac\xc6\x08\x25\x9b\x6a\x87\xf6\x2d\x75\x05\xec\x3a\x15\x31\xad\x9c\x5f\x8a\x55\x69\x10\x0b\x27\xb8\xe2\x3c\xdd\x34\x20\x2d\x5a\x91\x0a\x54\xdb\x8e\x32\x5d\xd6\x7a\xcb\x84\x40\xd7\x90\x15\x3d\x48\x72\xf1\x46\x3c\x97\x75\x04\x08\x15\xf7\xcf\x01\xc1\x92\xd8\x7d\x97\xe2\x3d\x6e\xae\xac\xc5\x02\x08\x42\xb2\x2e\x27\x84\xef\x22\x17\x2d\x18\x35\xed\x62\x94\xf5\x45\xf0\x94\x0e\x04\x5b\x9c\x83\x92\x8e\xfe\xf5\x9a\xd6\xa2\x7b\x4b\x7d\x55\x24\x17\x94\x75\xfe\xdc\xab\xeb\xc5\x5e\x41\x1e\x70\x90\x92\xcd\xf6\x26\xcb\x04\x4a\xe7\x45\x4d\x6b\x54\xb6\xa5\xac\x50\xe4\xdd\x2a\xb1\x82\x59\x85\x6c\x28\xa4\x51\x8a\xd6\x33\xd8\x1d\xf3\x1a\xa7\x7d\xec\x36\x7f\x18\x99\xb5\xaa\xab\x75\xea\x34\x34\xc0\x93\x0b\xaf\x84\xf5\x0b\xc7\xe1\xfc\x3a\xde\x92\xd7\xb3\x9e\x9c\x25\x4b\x28\x21\x88\x7a\xa5\x5c\x0e\x98\x34\x2c\xd8\x1f\x41\x7a\x96\xe1\xc1\x8c\x00\x80\x92\x31\x63\x73\x2f\x6f\xb8\x14\xd9\x07\x33\xe9\x29\xa3\x9e\x3b\xf0\xb6\xc7\xfc\x2d\xf9\x07\x64\xee\x4a\x6f\xab\x7c\x44\x13\x76\x63\x32\x6a\xb2\x5b\x6a\x38\x10\x28\x30\x54\x50\xa6\x32\xd2\x55\xb9\xb4\xe1\xd9\xe7\xda\x65\xd3\x44\xb3\x1f\x92\xe2\x3d\x8c\x33\xf3\x56\xbb\xcf\x47\x14\x31\x6e\x4f\x3a\x34\x92\x06\x45\x30\x4f\x5a\x98\x27\xdf\x41\xac\x86\x27\x32\xec\xb6\x77\xa7\xe6\xce\x36\x52\xb4\x61\xa2\x13\x6c\x98\xee\xd8\xdc\xa2\xd4\xe3\xc9\x19\xf3\xa5\xe8\xa3\x4d\x67\xcc\x30\x8d\xd3\xbc\x77\x1d\x76\x22\x23\x57\x73\xe2\xf9\xc3\xed\xf2\x1c\x89\xbf\xc7\xf1\xcf\x92\xdd\x38\x3d\x15\x2f\x91\xe3\x20\xee\xde\x4a\x00\xb0\x6f\x0c\x05\x98\x00\xcb\xb6\x8a\xf0\x0e\x88\x89\x25\xff\x88\x7b\x11\x83\xfc\x46\xe1\x8b\xb1\x69\x42\x88\xff\x15\x3c\xa1\xb2\x70\x0d\x79\x60\x96\xf8\xc5\xe1\x86\x96\xce\x49\xf6\x45\x61\x70\x63\x98\x25\x5f\x63\x4d\x0f\x91\x1f\x28\x64\x5d\xc3\x6b\x89\xef\x21\x90\x73\x12\x92\x12\x60\x82\x46\xcd\x65\x35\xdf\x54\xa8\xec\x9e\x66\x04\x36\xf6\x3e\x8f\xbe\x97\xe4\x98\x20\x3a\x98\x1d\xe3\x58\x39\x67\xf4\x7b\xa3\x75\xdb\x23\x15\x70\xa9\x5e\xeb\xee\x8d\x4a\x7d\x9d\x40\xb8\xd7\xba\x75\xaf\x77\x67\x72\xb6\xcf\x77\x7a\xfd\x27\x75\xa5\x9c\xe7\x3f\xfa\xc5\x75\x9f\xae\x6e\x33\xd9\x1f\x51\x47\x60\x7f\x8f\x19\x7a\xa6\xee\x89\xbe\x46\x9a\x04\x24\xa2\xb2\xda\xca\x9d\xb1\xe2\x94\x51\xed\xf5\x06\x3a\x77\x23\xe4\xb4\x12\x2f\x6c\xc7\xb6\xda\xdf\x82\x0f\x9b\xc9\xbc\x6d\xf8\xfc\xb8\xfd\xba\x1e\xcb\x3d\x62\xc7\x03\x8d\xc4\x0e\xff\xdf\x8d\xda\x64\x88\x32\xfb\x18\x76\x9e\xd7\xe8\xc6\x3d\x39\x90\x5a\x67\x02\xee\x51\x69\xc0\xe7\x33\x56\xc7\x50\x79\x70\x76\x33\xe6\xbb\xd0\x49\xff\x22\xb0\x91\xb8\x50\x3e\xfc\xef\x20\x43\xe4\x50\x8d\x68\x84\xe7\xe7\xd8\x77\xca\x13\xa3\x49\x04\x87\x95\x98\x42\x02\x1a\x23\xa4\x20\x94\x5e\x25\xe2\x80\x52\xd1\xc2\xc0\x9b\xab\x35\xb2\x92\xa0\x52\x07\x43\xa0\x32\xde\xa8\x00\xa8\xa9\x4c\x17\xd1\xb1\x91\x73\xdc\xe5\xdb\x54\x55\x80\xed\x1f\x59\x5a\x41\xcb\x30\xa5\x7f\xf3\xbd\x19\x45\x14\x70\x61\xb3\x7e\x4c\x5d\x8b\x14\x9e\x99\x07\x0f\xf0\x52\xa0\x5d\x5f\xd9\x7f\x67\x5c\x0c\xd2\xb3\xdb\xdd\xa8\x2e\x44\x62\x6a\x01\xc2\x75\x46\x02\x3e\x53\x2c\x90\x8e\x63\x6e\x07\x1f\x4c\x20\x14\x6d\x03\xd2\x29\x0d\x6e\xca\xec\xa2\x80\x05\x16\xbc\x11\x5c\xd0\x0f\x58\x36\xec\x38\x78\x7b\x33\x1a\xd0\x32\x20\xdc\xb9\xe9\xa2\xe3\x64\x69\x48\xb7\x59\x5e\xa9\x6a\x17\xce\x19\x7a\x1a\x4a\x13\x9f\xa2\xd6\x75\x6b\xe5\x4b\xfe\xe9\x9d\x37\xd9\xce\x4a\x88\xca\x91\x62\x29\xe7\x97\x53\x0c\x3d\x91\x94\x3f\x7e\xa9\x4d\x8b\xdb\x09\xf1\x39\xe0\x56\x0e\xbb\xef\xc3\x0c\xa1\x31\x92\xa7\x01\xed\xea\xa8\xf1\x06\xb5\x6a\x87\x09\x70\xbd\x00\x8e\x27\x06\x6d\xab\x5b\xb9\x13\xa5\x01\x69\x25\x86\xfe\xb5\xdb\x07\x51\x36\x0e\xef\x1d\xc6\xb4\xb2\xdc\x01\x1c\x75\x5c\x55\x32\xdc\xce\xf5\x6a\x85\xc9\x32\xa3\x5d\x71\x48\xab\x04\xf1\x53\x1a\xb1\x25\x24\x54\x82\xfd\xf1\x3d\x03\x53\xb2\x28\xeb\xe2\xe9\xb7\x2f\x21\x0e\xd1\x37\x33\xc8\x2b\xb9\x85\x38\x8b\x16\xf5\x59\x6d\x36\x0d\xa5\x35\xf5\x3b\x08\xb3\x17\x65\x0d\x76\xe7\xd2\xe0\x72\x6e\xcb\x76\x69\x29\x80\x33\x11\x47\x62\x5d\x64\xd5\xc6\x04\x04\xd0\xb0\x49\xf0\xe5\x10\x6a\xd0\x8f\x85\xce\x85\x11\x0c\x63\x0e\x0e\x41\xe1\x6b\x52\xd4\x14\x9d\xa8\xa2\x77\xb2\xb7\x63\x8d\x66\xf0\x17\x43\x02\x67\x06\x29\xf7\x5b\x7b\x3b\xb6\x25\x38\x75\xd8\x2d\x0f\x77\x87\x08\x6c\x8d\x6e\xbd\x5b\x25\xe4\x2c\xa4\x0e\x40\x09\xd8\xfe\x1d\x6c\x96\xbc\x45\x20\x1c\xe3\x69\xe6\x68\xbe\x37\x45\xdd\x70\xa4\x72\x90\xe1\xe4\x7c\xe6\x5e\xf6\x2c\x88\xc9\xbd\x63\xf6\xef\x0f\x26\x90\xaf\x7d\x22\xd7\xbf\xe1\x5b\xd7\xfb\xf0\x80\x7b\xbe\x3d\x8f\x4b\x09\xd5\x30\x34\xeb\xde\x6d\xbc\x1b\x7d\x7c\xca\x0d\xf5\x83\x89\x2b\x5b\x8f\x2a\x6c\x58\xd7\xb5\xcf\x0d\x2c\xcf\xfd\x30\xb1\x94\xc2\xd7\x07\xad\x3b\x87\xdb\x6a\x0e\xb2\x09\x89\x11\xe6\x91\xbd\xc6\x91\xfb\xac\x7a\x60\xcd\x72\xee\xc1\xdf\x2b\xa7\x5b\xa0\xd7\x0e\x9e\x4e\x1a\x92\xd0\xde\xa3\x97\x4e\xd0\xed\xa7\x4d\x09\xf7\xc0\x71\x8c\x6e\x66\xae\xe7\xfb\x01\x0b\xd3\x31\x10\xf1\x1e\x3c\x4a\xe3\x00\xff\x5e\x0d\x63\x89\xcd\xfa\x9a\x56\xac\x5b\x55\xd4\x24\xfa\x0d\xdf\x5d\x12\xe6\x89\x41\x9c\x4f\xc1\x0d\xef\x9d\xab\x62\x59\xc9\x8c\x4b\x2d\x84\x22\xc5\x76\x09\xbf\x73\x9d\x36\x52\x8c\x45\xb3\x56\xf3\x52\x56\xf8\x4a\x48\x72\xfc\x43\x84\x40\x7c\xdb\x90\xe3\xb1\xec\x8d\x7d\x1f\xa7\x8c\x1f\xb2\x2c\x85\x7f\x41\x4f\x4f\xa1\x09\x60\x41\xb6\x9a\xa5\x1f\x77\x31\xcd\x8d\x2a\x17\xa5\x72\x10\x0d\xcc\x30\x80\xe9\xd6\xb1\x74\x68\x0c\x39\xc2\x3a\x30\x57\xaa\xbe\x2a\x1b\x5d\xaf\xbc\xa3\x1c\x60\xad\x23\x63\x3a\xb7\x92\x8d\x70\x7c\x83\x3d\x08\xc8\x3b\x85\xe6\xa4\xbd\x1e\x06\xa2\x80\xe6\xc0\xe4\xb9\xa7\xcf\x83\x4f\x52\xd8\x15\xc4\x62\x35\xf2\x4a\x35\xa0\x79\x29\xfd\x5b\x98\x6e\x9c\xcf\x68\xc1\x0e\x59\xb8\x6d\x0f\x1e\x0c\x6d\x95\x2f\x77\xd2\x05\x25\x07\x50\x18\x88\xbe\xf2\x79\xfe\x73\xdb\x02\x80\xce\x14\x99\x4d\x5c\x84\x6e\x22\x50\x0b\x88\x2d\x99\x70\x35\x8a\xf3\xbd\xc5\x80\x74\x68\x8b\x5c\xb6\xd1\x1a\x0a\x0f\x67\x8f\x07\x50\xc4\xd5\xd1\x6c\xde\xd8\xf2\xd1\x09\x1f\xa9\xad\x3d\x3d\x15\x4f\x00\x1e\xc7\xef\x2e\xba\x6f\xc3\x20\x95\xa2\x68\x2c\x16\xdd\xdf\x28\xa1\x17\x0b\x33\x6f\x94\xaa\x4f\x97\x65\x51\x38\x4f\x25\x74\x87\xe8\xbe\x82\x40\xe4\x5e\x81\xd2\xeb\xc1\x03\x71\xbf\xeb\x6d\xee\x37\x28\xe3\x2b\xde\xb9\x50\xd1\x2e\x3d\xd5\xdb\xfa\x61\xa8\x13\x8d\xb4\x6f\xf1\xe2\xb1\xd1\xc8\xce\x42\x9b\xdf\x30\x0a\x37\xd7\x2b\x05\x56\x6b\x7f\xa0\xf1\x64\x42\x62\xa3\x69\x4c\x93\xd8\x29\xbc\x77\x0b\x8a\xc8\xbb\xb6\x7b\xba\xbb\xb6\xcf\x2d\xe4\x6e\xb8\x92\x3b\x67\x1d\xf6\x73\x2e\x9f\x0e\x5f\x66\x78\x5e\x51\x66\x6d\xb5\x7d\x11\xc1\x67\x21\xa4\x99\x53\xcd\xaa\xac\x65\x35\xa5\xbc\x58\xf4\x64\xce\xf5\x6a\x4d\x28\xc8\xa6\x55\x6b\xd7\x52\xb9\x5a\xa9\xa2\x94\xad\x65\x32\xc0\xaa\x1a\xb1\xb0\xee\x34\x25\xae\x4b\x56\xb4\x79\x51\x17\x8a\xba\x6a\xd5\x0d\x39\xd3\x6e\x4c\x56\x7f\xd2\x27\xde\x2d\xf3\x94\x26\x16\x0b\xb5\xda\xf0\x06\xac\x50\x4a\xbd\x23\x86\x6a\x9c\x9f\xd2\x7a\xec\xa1\xfa\xa9\x78\x99\x10\x96\x54\x64\xb8\xb1\x07\x7e\x51\x4f\xd7\x8d\x6e\x35\xb0\xef\x01\x19\x83\xff\x4c\x06\x99\x3d\x69\xf4\xfc\x8e\x41\x54\x25\x0c\xf6\x09\xff\x29\x3f\x41\xc1\x32\xe4\xd1\x61\xf8\xec\xdd\x52\x89\xdf\xff\xca\x88\xd3\xaf\xd8\x31\x90\xeb\xb5\x92\x0d\xbc\xfc\xc8\x08\xb8\x68\xcf\x95\x6a\x97\xba\x40\xd0\xfb\xe0\x98\xd0\xaa\xba\xa0\x7d\x0f\xd1\x9d\xe2\x33\xf1\x6b\x71\xe4\xae\x13\x9d\x17\xc8\xdb\x02\xdc\xa5\x3d\x48\x66\x2a\x90\xef\x15\xbf\x82\xbe\xf2\x2d\x79\xd6\xf3\x68\x12\xcf\x3b\xf9\x67\x47\x02\x3e\xdc\xa1\x07\xf6\x0d\x3d\x72\xd6\x39\x6f\x9c\xbb\x32\x75\x79\x8a\x48\x07\x82\xc6\x91\x20\x8a\xe0\xaf\xdc\x41\x91\x17\xdf\x77\x70\x4e\x4f\xc5\x6b\x8a\xcb\xde\x40\x41\x40\x76\x31\x66\xb3\x5a\x03\x39\x02\xde\x2f\xc4\x51\x40\xe0\xb3\x37\x33\xe5\x9f\x5f\x40\xe4\x4a\x42\xd5\xcf\x98\xeb\xfa\xed\xf8\xd1\xdc\xa5\x27\xcd\x1d\xfb\xd2\x5c\xd7\x9b\x06\xeb\x76\x63\xab\x3a\x34\x08\x76\xde\x57\xb8\xa9\x13\xca\xb5\xfc\x20\x30\x9a\x39\xf1\x7f\xc8\x39\xf4\x1f\x72\xfa\x16\xde\xe5\x35\xdc\xf1\xa1\x33\x98\x71\x91\x75\x93\x8a\x09\x27\x8f\xaa\xcf\xbe\x39\xbe\xb4\xbd\x8e\x3d\xc8\xa8\x8e\x86\xde\x0f\xd4\x0e\x0e\x8b\xc3\x0c\xdb\xad\x95\xe1\x51\xf8\x9d\x8f\x56\x98\xaf\x35\x68\xf6\x09\xac\xc2\x4a\xf4\xf9\x69\xdf\x4a\x30\xfd\xa7\x68\x5a\x5d\x1f\xe8\x9e\x2c\x28\xe8\x01\xb1\xd0\xe2\x5c\x1c\x1d\x9d\x25\x1f\x00\x79\x9a\xde\x9f\x1e\xaf\x81\x24\xa7\xe9\xb7\xae\xc6\x71\x14\xe7\x0f\x59\xa5\xdc\xa7\x14\x69\x02\xba\xff\xf5\xb9\x38\xfa\xb7\xfa\xdf\xea\x20\xdc\x44\xef\x91\x95\xa5\xff\x7a\x24\x7e\xcd\x86\xf4\x6b\x71\xf4\xd7\xe9\x51\x8c\x26\x90\x8c\x9f\x76\xf1\x5f\x00\x4f\x31\xd4\xec\xba\xdb\x23\xf2\xf6\x8b\xa7\xb0\xbc\x9d\x65\x88\xb1\xbc\xb3\x55\xdf\x76\x70\xbd\xed\x94\xd9\xa7\x74\xd2\xd1\xd0\x58\xb9\xa9\x65\xa7\xdc\xfc\x1e\xd9\x19\xf3\x8f\x55\x59\xab\x57\x80\xc7\x93\x43\x51\x10\xde\xc7\xae\x27\xf2\xf9\xcf\xa1\xd7\xbf\xe4\x06\xb4\xaf\x4e\x27\x07\xad\xe8\xb2\x1b\x47\xbe\x76\xe0\x83\xfd\x49\xe7\xd7\xe2\xa2\xbc\x82\x38\xbd\x85\x99\x62\xe6\xdc\xc7\x6d\x6b\x05\x6f\xc4\x34\x23\xbd\x04\x46\xbf\x2d\x90\x7a\x2f\x64\x59\x4d\x7f\x65\x20\x97\xae\x3d\x34\x93\x91\x87\x32\x4a\xb4\x9b\xa4\xd9\xed\xa6\xab\x09\x29\xa3\x46\xcb\x83\x09\x8d\x1e\x92\x51\xd6\x91\x57\xe1\x28\xb5\x7c\xd6\x0d\x96\x83\x3a\x5f\x4f\x96\xf0\x2a\x35\x59\x55\xff\x40\x11\x3e\x30\xdb\xbe\xe8\x1e\x5c\x0a\xc7\x43\x86\xcc\x2b\xf9\xe8\x1e\xa7\xdc\x86\x6a\x7f\x07\xba\xed\xbe\x78\x24\xbe\x24\xe3\x63\x91\x64\x2a\xcb\xe7\x0f\x52\x76\xe5\xbc\xf9\xf4\xfb\xa5\xc2\x53\x02\xcb\xb0\x81\x50\xdd\xc4\xc9\xd7\x21\x32\x39\xcf\x87\x57\xba\x50\x6e\x77\x43\x73\x9a\xe9\xbd\xa6\xe2\x9d\x03\x91\x2e\x5b\xf0\x4d\xb4\x63\x62\xec\xe0\x5d\xab\xa5\xed\x4a\x30\xad\xb4\x13\x29\xac\x20\xb6\xd0\x55\xa5\xb7\xa0\x1f\x05\x2e\x08\x22\x14\x17\x23\xe2\xca\x7d\x62\x7b\xd7\x5a\x58\x8c\x56\x93\x99\x36\xac\xc0\x08\x5d\x50\x9f\xeb\xc4\xf5\x4d\xb2\xbe\x89\x1f\x27\x48\x78\x60\x02\xd7\x89\x67\xbd\xc1\xe8\xaf\x39\xa2\xbb\x5c\xd6\x7b\xe3\xd4\x65\x70\x8b\xcf\xc2\x01\x2d\x8d\x97\xa1\x5a\x79\xa9\x84\x6c\x66\x65\xdb\xc8\x66\x07\x0e\x41\xe4\x5b\x38\x07\x42\x66\x76\xf5\x7c\xd9\xe8\x5a\x6f\x4c\xb5\x43\xcf\xca\x99\xba\x28\x6b\xd7\x98\x92\x17\xca\x4a\x81\x44\xbb\xb7\x74\xd2\xb3\x5e\x00\x12\x30\x5d\x29\xe8\x1d\xe6\x32\x1d\x50\x94\x46\x5e\x3e\xb9\xd7\x11\x11\x14\x6f\xd1\x0a\x9c\xf7\x9e\xeb\x1b\x56\xc6\xa3\xee\x97\xa0\xda\x71\x41\xb5\x07\x3f\xbd\xcb\x31\x39\xf0\x7f\xd2\xaf\xef\x4f\x2c\x1a\x78\xc4\xcb\x61\x25\x7d\xb8\x61\x08\xcc\xe6\xec\xa0\xcc\xd3\x90\x72\x53\xae\xed\x12\xc7\xf6\xa8\x82\x69\x79\x42\x73\xf6\x64\xca\x96\x3c\xad\x18\xee\x02\x37\xc1\xa1\xc7\x58\xc8\x09\x4c\xbe\x6a\x01\x66\x39\x34\xb7\xa8\xf4\xd6\xd3\xb1\x42\x47\x9d\x4e\x63\x2a\x87\x80\xcd\x3e\x29\xb6\xd6\xde\x71\x25\x34\xe7\xbf\xd0\xe9\x01\xe8\x08\x83\x00\xde\x52\x7c\x46\x0b\xf5\x99\xfb\x21\xe4\xb1\x9f\xa6\xec\xce\x13\x17\x7e\xb9\xa9\xcb\xc5\x0e\xfd\xd3\x4b\x6a\x69\x49\x5a\x2e\xf4\xdd\xd2\xcd\xe5\x3e\x18\x8f\x1f\x11\x51\xe0\xf0\x10\xef\xe4\x65\xbc\x99\x71\xed\x1a\xdd\x8f\xb6\xb3\x9d\xfe\x8f\x18\xee\x66\x63\xfc\x18\x29\x0b\x27\x07\x10\x14\x8f\x04\x81\x2c\x2d\x42\xaa\x46\xfa\xcd\x5d\x90\x4a\xb5\x1e\xbd\x7e\x91\x64\x68\x28\x34\xbf\x45\xdc\x97\x2f\xf8\x7f\x5a\x52\x5b\x49\xe3\x7c\xed\x1c\x6b\x8b\xf8\xec\x62\xae\x9b\x46\x99\xb5\xae\x0b\x86\x1a\xc3\xf1\x66\x1a\x55\x1f\x99\x7c\x53\x9c\x32\xdf\xe7\x88\x93\x50\x1a\xa7\xdb\x0d\x41\xee\x14\xf1\xa8\xfc\xec\xb7\x54\x33\x1f\x92\x3a\xd8\xfe\xbb\x4d\xa3\xf5\x39\x34\x9f\x2f\x15\x0f\x21\x94\x81\x7c\xc5\xfb\x07\xc3\xc5\xfb\x7c\x43\xbe\x76\xf8\x29\xa5\xd6\x51\x52\x8d\xf3\x4c\xa2\x07\x5b\xf0\x7f\x9c\x46\x6c\xc8\xb5\x28\xb0\x03\xeb\x93\xf5\x5c\x55\xb6\xa4\xbd\x80\x7d\x81\x98\x41\x82\xf2\x6f\x5b\x59\x28\x60\x04\x66\x4a\xc8\x19\x00\xcc\x07\x66\x00\x15\xf2\xa9\x73\x00\x3c\x83\xb5\x76\x0d\x42\x12\x77\x74\x09\xd7\xa2\xd0\x2c\x3f\x7f\x36\xaf\xa9\x30\x6a\x2d\xc9\x65\x52\x2f\x42\xc6\xff\xd3\x53\xbc\x0f\x47\x46\x90\xad\x7f\x07\x07\xd1\x63\x2d\xd9\xae\x77\xaa\x15\x0f\x13\x1d\xbf\x73\x58\x2d\xb4\xa5\x8c\x95\x6e\x7d\x7b\x74\x05\xc0\x09\x19\x06\x08\x15\x85\xac\x77\x5b\xb9\x9b\x8a\x6f\x69\x74\xc8\x9d\xd8\xdb\xc4\x86\x46\x7c\x91\x65\x50\x5d\x73\x7e\x59\xd0\x9b\xb1\xb3\x2a\xe0\xa7\x18\x56\xc3\x03\xed\xb8\xd9\x00\x6c\xbf\x0f\x1c\xca\xe8\x5b\x5d\xc9\x6f\x17\xfe\x79\xff\xfd\xb9\xaf\x0f\xa1\x1d\x2c\xd6\x2f\x76\xae\x84\x27\x95\xb9\xe7\x92\x2b\x0f\x03\x26\x72\x68\x57\xb0\x79\x68\x08\x99\x29\x55\x47\xcd\x91\xd3\xb2\x2a\xf8\x13\xaa\x62\x7a\xb3\x13\x17\x0a\x79\x1e\x60\xd4\xdb\x46\xd6\x66\xa1\x9a\x46\x15\x62\xb3\x9e\x86\xe6\x38\x37\xc0\x18\xb3\x90\x66\x66\x48\x4e\x83\x16\x44\x9e\xb0\xa6\x84\x9c\x67\x02\x81\x7a\x9f\xc2\x5f\x3b\x6e\x1b\xa7\xa7\x8e\x5b\x19\x8d\x6b\x7a\x0d\xef\x0b\x7f\x93\xff\xa4\xb7\xaf\x69\xff\x6e\xf9\x06\x53\x36\x82\xc8\x71\x55\xb4\xf2\xc2\xe0\xf1\x84\x24\x1e\x2e\x49\x8f\xac\xaa\x8e\x7b\xea\xc9\xd7\xae\xbd\xb7\x4a\x89\xd7\x6f\xc4\xff\xfc\xdd\xff\xfd\x1b\x51\x94\x66\xbe\x31\x90\x94\x62\xa1\xbd\xd5\x1b\x4a\x3a\x84\xea\xae\x9d\x25\xd0\x5e\x70\x6a\x73\x11\x3b\x01\xc6\x78\x74\x1c\x8f\x48\xe1\x9e\x07\x31\xaf\x0f\x30\x99\xe5\x9a\x0d\xf9\x82\xba\x23\xbd\x25\xf1\x2d\xe9\xf8\x53\x42\x84\x01\x9a\x2b\x80\xd4\x45\xc1\x09\x0e\xd0\xcb\x6f\xd3\x1f\xf5\x16\x48\x12\x5d\x63\xcb\x80\x7e\x0d\x3f\x96\xa4\xf1\x46\x0d\x39\x80\x4b\xd9\xa3\x5d\x7c\xcd\xcf\x6d\xe4\x6a\x92\xc6\x21\x70\x3e\xe9\x14\xa3\x89\xec\xb9\x41\x20\x43\x1d\xd8\xb0\x53\x27\xd7\x05\x45\x5a\xf0\x5a\x19\xe7\x63\x43\x47\x65\x58\x54\x09\xe5\x33\xde\x31\x43\xee\xeb\xb6\xde\x5b\x1e\x03\x35\x14\xb4\x45\xfd\xb0\x00\x2e\x70\x36\xb3\x0f\x8b\x0b\xe7\x50\x71\x64\x96\x73\xee\x0f\x24\xd7\x49\x83\x58\x0c\x92\xba\x18\x05\x51\x1f\x9e\xce\x1b\x72\xb5\x04\x21\xb0\x1b\x14\x36\xed\x12\x0f\x87\x28\x7b\x3d\x0d\x44\xe6\x61\x49\xdd\xe1\xce\xcf\xc5\x2b\x0d\x98\xb5\x5d\xa9\x31\x29\xfb\xd5\x60\x5f\x5d\xe1\x71\x0c\xc1\x8b\x84\xc6\xd1\x64\x25\xef\x11\xf5\x28\x61\xd5\x6e\xd1\x7b\x2a\x22\x16\x83\x30\xed\xd4\xf5\xe1\xa8\x4c\xa3\xc8\x5c\xd4\xfa\x8d\x90\x4c\x3a\xe4\x2f\x26\xd3\x51\x47\xd7\x8c\xdc\xec\x74\xb1\x6f\x42\x37\x89\xbc\xe8\x74\xf6\x4e\x7d\x18\xea\x67\xd0\x15\x32\xde\x0b\x59\x55\xf8\xc2\x36\x10\xd7\x1e\x1a\x8d\x22\xd4\x1a\x05\x52\x3d\x5d\x7b\x74\xf3\x95\x17\x4e\xb0\xf2\x30\x24\xb6\x85\xde\x88\x26\x72\x96\xe1\xa6\x39\x66\xf0\x18\x48\x60\xe0\xf2\x5a\xe2\x60\x9c\xbb\x4b\xc8\xbc\xc4\xa6\xb2\xf7\x54\xdd\xc0\x30\x18\xad\x5b\x92\xfd\x32\x5a\xb6\xc7\x3e\xeb\x59\xf0\xe0\x32\xa8\x02\xa6\x00\xbe\xa5\xae\x0a\x2b\x38\x30\xe6\x5b\x34\x9b\x3a\x49\x43\xe6\x1b\x84\xd4\x0d\xba\x56\xdc\xcb\x72\x9a\x4e\x30\xb0\x7e\x03\xcf\x7e\xb4\x18\x37\xd3\x03\xc7\x54\x83\xb0\x13\xfb\x48\xc5\x3e\x68\x45\xd7\x58\xa1\x16\x72\x53\xb1\x66\xba\xda\xca\xef\x6a\x2b\x0d\xd5\x62\x53\x63\xd4\x24\x4a\x64\xf2\xe2\xb6\xf4\x92\x7d\x96\x65\x78\xad\x9e\xcb\xb2\x1a\x96\x53\xaf\x8b\xad\x04\x2f\x6d\xab\x31\x9e\xc0\x9e\x93\x8d\x59\x9e\xae\xf5\x9a\x61\x19\xa0\x57\xd8\xf4\xb0\xd7\xe4\x0e\x79\xca\xdb\xe2\x7d\x47\x6c\x3a\xa5\xea\xc1\xb0\x2f\xda\xf4\xdb\xde\x70\xb7\x41\x8f\x8b\xc2\xa7\xbe\x71\x4a\x26\xb2\xec\xc8\xda\x05\x9f\x00\xc6\x29\x94\x20\xed\x29\xf9\x46\xaf\xca\x16\xc9\x60\x8e\x2b\x8b\x3c\x20\x9f\x35\x0d\xb7\x7d\x3a\x4a\xbb\x55\x65\x53\x50\x68\xa5\x43\x5e\x2d\xb4\xf8\x0c\x03\x2b\x3f\xc3\xe3\xfe\xdf\xff\xf9\x5f\x2c\x38\x7d\x01\x87\xd2\xc5\x9c\x9e\x9e\x0a\xbd\x69\x9c\x86\x0b\x9d\x46\xa6\xe2\x9b\xa0\x7d\xae\xb5\xa8\x74\x7d\xe1\xfc\x9b\xa5\xe5\xa7\x49\x49\xf1\x59\x40\xd7\x75\x6d\x41\xb4\x6e\xa9\x6b\x33\xf9\x8c\x71\x8b\x3e\x54\xa4\x0b\x42\xdc\x6a\xb1\x92\x97\x4a\x80\x2c\xed\xc3\x7d\x3d\x97\xd8\x22\x4c\xec\x94\x18\xf3\xe7\x65\x6d\x4f\xfb\x4c\xb5\xad\x6a\x20\x22\x19\x5c\x6e\x69\x8d\x4b\x33\x11\x6b\xd5\x2c\xe5\xda\xb8\x75\x96\xa0\x79\x70\xcd\x5d\xa8\x5a\x35\xb2\x12\xfa\xca\x96\xda\x54\x76\x12\xb8\x2d\xd0\x86\xf7\x43\x3c\xc8\xd6\xeb\xf3\x4e\xe4\x22\x71\xb2\x65\xef\x77\x33\x7c\xec\x69\x3b\x2a\xdd\x31\x2e\xfc\x1d\xb1\xb5\x49\x3c\xbf\xd3\x1d\x4d\x28\xe0\xe8\x02\x94\x55\x33\x84\x86\x5f\xad\x37\x2d\x7a\x32\x34\x41\x5b\x13\x00\x59\x5c\x7b\xad\x16\x45\xa3\xd7\x50\x8c\xe5\xeb\xcc\x3a\x15\xc7\x7a\xd7\xb0\x63\x49\xb1\x48\xa5\xc9\x62\x10\x4f\x4f\xc5\x77\x35\x86\x87\xe7\x60\xa8\x43\x02\x27\xf6\x96\x7b\xec\x74\xdb\x0e\xb4\x92\xf3\x73\xf0\x23\xb9\x5b\x88\xf8\xb3\xde\x43\xe3\x13\xdc\x47\x0f\x40\x0c\xfb\x31\x0a\xdc\x29\x7b\x8e\x53\x41\x36\x86\xe3\xd9\x53\xc9\x49\xa5\x31\xea\x4f\x12\x6e\xb4\x5f\x0b\x45\x65\x70\x42\x5e\x98\x7c\x14\xfe\x3a\x09\x5f\xc2\xc3\xfd\x28\xfd\xc1\x36\x77\x76\xef\xd3\x59\x9a\xf0\xe4\x09\x46\xba\xa8\xeb\xe5\x3c\x09\xa9\x4c\x10\xf4\x9c\x25\x5c\xa0\x8c\x22\xf1\xef\x3e\x6b\x04\xfc\x6a\x19\xf8\xbe\x1a\xfc\x9b\x4f\x58\x01\xb6\xc4\x17\xc8\x87\xfb\x44\x36\x58\xab\xfb\xcd\xd5\x5a\x94\xb5\xac\xca\x7f\x57\xfc\x1b\x19\x9a\xb1\x6a\x4f\x01\x9f\xbd\xa4\x51\x6b\xd9\x28\x0f\x4a\x47\xb5\xa2\x9f\x7d\x02\x8b\x8d\x4b\x2b\xed\x8a\xb9\x5f\x7c\x6b\xaa\x31\xa5\x69\x55\x34\x65\xf6\xe3\x19\xad\xe7\x85\x02\x1e\x63\x28\x6d\x4a\xae\x88\xef\x46\xaf\x07\xd2\xb4\x44\x1f\x5d\x95\x0b\xd5\xf6\x57\x89\x3f\x66\x7a\xc9\xe6\x75\x49\x3e\xbb\xb9\xd1\xd2\xbd\xd3\x18\x7c\x06\xc2\xdc\x50\x3a\x95\xa1\xf2\xc9\x2e\x45\x65\x92\xf3\x35\xaa\xdd\xdc\xb9\xb3\xf3\xd8\x9b\x42\xa6\x53\xe8\xec\x5e\x07\xc2\x9a\x50\x75\xf3\x1a\x63\xcb\x20\x51\x7e\x68\x8c\x58\x44\x53\x72\xed\xa1\xff\xd0\xea\x85\x5c\x14\xe2\xfc\x49\x06\xca\x51\xd6\xad\x37\xe2\xc8\x5a\x60\x57\x8f\xeb\xc2\x97\xd8\x1f\xae\x82\x75\x32\x4a\x3a\x0a\x4b\xcd\x8f\x7b\xa8\x45\x02\xbd\x8e\x9b\xc3\xab\xfa\xb8\xaa\x50\xbc\x74\xb6\xd5\x8e\x36\x36\x72\x52\x45\x0f\xaa\x61\xfa\x0d\xee\x14\x11\x8c\xa8\xfd\xd7\x9e\x4c\x52\x4e\x8f\x4b\x26\x3e\xe8\xa8\xeb\x26\xef\x9a\x8e\xd2\xd3\x07\x4d\xfd\xc7\x8f\xa2\xf3\x15\xa2\xa2\x73\x1f\x50\x22\x4d\xc1\x10\x93\xe0\x3d\x54\xf3\x93\xa7\x34\xb0\xb0\x14\xe8\xeb\xba\xf4\x31\xb3\x47\x29\xc2\x49\x67\xac\x89\x18\xdf\xb5\xee\x1a\x48\xc1\x44\x95\x76\xeb\x0e\x66\x8a\x6f\x31\x30\x82\x1d\x1f\x1e\xff\x39\x5a\xef\x3a\x4a\x44\x49\xbb\x18\xca\x86\x4f\x2e\x13\x43\x6a\x43\x66\xdb\x12\xf2\x7c\x65\xfa\x77\x43\xe4\xbd\x33\x67\x9a\xcc\xa7\xfc\x61\xe3\xcb\x92\x33\x21\xb3\x29\x84\xf6\xd2\x41\xf3\xd1\x76\x96\xa3\x5b\x8d\x2f\x4b\x92\xe4\xbe\x1b\x4d\x7a\x05\xea\x9d\x77\x9a\xeb\xb3\xae\xef\xfc\x3d\x1f\xeb\xaf\x7b\x1f\x4a\xe6\x1c\xab\x08\xc6\x0e\x03\xe0\x75\x75\x85\x62\x69\xad\xb7\x77\xe0\x43\xe5\x08\x1c\xa4\x6e\x84\xd0\x5c\xef\xf4\x6b\x87\x07\xde\x6c\xc4\xd0\x14\x53\xf1\x4a\x6f\xb9\xe5\x93\xbc\xd9\x8c\x65\x55\x8b\x04\xf2\xf1\x45\x2b\xb6\x6e\x1a\x75\x39\x57\x2c\x26\x72\xb5\xa9\xda\x52\x98\x56\x5e\x50\x2f\x8d\x5a\x5b\x19\x11\x50\x9d\xec\x2c\x5c\x4b\x06\x52\x1e\xf3\x0c\xb3\xba\x11\xb2\x15\x76\x56\xad\x68\xad\xcc\x00\xf5\x7d\x5e\x9f\x1a\x93\xcf\xeb\x5a\x99\xa9\x78\xe2\xcc\x45\x5e\x40\xb0\x52\x6f\xa3\xfe\xb6\x41\x4c\xb6\xa2\x28\x29\x66\x68\x51\xaa\xaa\x48\x31\x9a\xb6\x12\x71\x08\x20\x05\x91\x0e\xaf\x88\x9f\xe7\x5b\x07\x0b\xe5\x5a\xa4\xde\x51\x0c\x6d\x02\x9a\xf5\x2b\xdd\xaa\x47\xb1\x83\x14\x30\x31\xa8\x0e\x90\x55\xab\x1a\x08\x27\x46\x3c\x8b\x17\xd4\x7f\xbb\x2c\x6b\x70\xb5\xb6\xab\x6d\x44\x78\x8b\x98\x5e\x13\xd7\x10\xc6\x60\x45\xec\x85\x6e\x84\xba\x52\xcd\x8e\xa1\x9d\xf5\x6a\x53\xf9\x71\x0f\xe7\xe0\x9b\x4d\x09\xd8\xb8\x2c\xff\xaf\x49\x76\xd6\x92\x3d\xd9\xd0\x08\x00\xf6\x01\xc5\xe9\x56\x37\x76\x7f\xf4\x5a\xfe\x6d\xa3\xc4\x52\x55\x96\x09\x83\x33\x2a\x9e\x44\x70\x04\x98\x54\x02\x1f\xdc\x73\xf1\x67\xba\xb5\xa3\x1f\xb1\x24\x02\xda\x9e\x80\x29\xad\x79\x37\xf4\x19\xbe\xae\xbb\x50\x3d\x31\x8c\x3c\x05\xad\x52\x8f\x3c\x22\xb9\x93\xd9\x74\x18\xb7\x66\x4e\xae\x4b\xbd\x12\xe5\x41\xb9\x81\xb2\xf9\xab\x47\x3a\x97\x1d\x64\x8f\xf7\x6b\xef\x1d\xc9\xd0\x2f\xaa\x8f\x81\xc0\xe0\x4f\x5d\x57\x3b\xe7\x1d\x62\xef\xf7\x9a\xb2\x3d\xe3\x3d\xb2\x94\x83\x12\xcb\xce\x36\xad\x27\x1b\x8d\x9a\x6f\x1a\x63\x2f\xd9\xb6\x16\x65\x70\x46\xe1\xb8\x79\x0b\xd0\xee\x50\x8e\x27\x07\x28\x80\x70\x68\xd3\x3d\x0c\x0c\x7b\x04\xef\x84\xff\xe0\xaf\x5a\x57\x42\xf2\xcb\x86\x2f\x8f\x47\x61\xdf\xc7\x4f\xe4\x99\x18\x96\xc4\x0a\xe8\xe6\x1a\x4a\x38\x74\x95\xd6\xe1\xe2\x45\xd4\x8a\xa0\x62\x22\x3b\x80\x5b\x6a\x96\x83\xcb\x65\x5c\x23\x04\xf3\x0b\xd5\x72\x1f\x50\x00\x79\x51\x72\xbe\x74\x09\xc2\x22\x58\x3a\x70\x9b\xc3\xa1\x84\xb4\x7c\x3f\x15\xee\xc6\x75\xbd\x87\x21\x89\xd9\x91\x5f\x58\x23\xce\x1a\x05\xb0\xd8\x54\x14\x0d\x8e\xd7\x69\x99\x10\x1c\xdc\x57\xe6\x1d\x8a\xc0\xe1\xb3\x5d\x44\x27\xcb\x73\xdb\xbc\xaa\xe5\xac\x52\x2f\xe1\x4b\x7d\x11\x32\x30\x47\x9e\xd2\x2f\x9d\x5a\x60\xa5\x0b\x77\xd6\xf3\x63\x0e\xfa\x97\xfe\x3d\x80\x37\x5a\xaf\xdd\xc2\x9e\x65\x1a\x0c\x13\x64\x0a\x9d\x61\xb8\xda\xd7\x72\x57\x69\x7b\xc7\x10\xbd\x47\x57\x05\x65\x2a\xa9\xd5\x96\xfe\xd6\x90\xd1\x83\xfc\x62\x50\x48\x4e\x46\x86\x8f\xee\xbb\xdd\xda\xbd\xf9\x6b\x35\x2f\x17\xe5\xdc\xa3\xf1\x38\xe3\x46\x88\x7c\xf6\xd5\x13\xe2\x18\x43\x00\x47\xa3\x3c\x4b\xa8\x4e\xf0\xed\x10\x6b\x2c\x21\xca\xba\x28\xe7\xb2\x75\x90\x94\x1e\xb4\x50\x52\xbc\x83\x7d\xfc\x4b\xf2\xb7\xe3\xad\x41\x91\x5a\x6d\x31\xe4\x54\x81\xf0\x4b\xf9\x3f\x4d\x90\xc6\xa7\xe2\x31\x11\x7c\xb0\x50\x00\xaf\x54\x23\x5e\x24\x98\x47\xbe\x67\xc1\x66\x1c\x9e\x98\xc6\x1f\x5f\xa9\x7e\xd5\x40\xf7\x9a\x65\xb6\x9b\xce\xea\x88\x9d\xd6\x55\xf1\x0e\xf4\x78\xb5\xda\xa6\xcf\x43\x58\x48\x50\xff\x14\xe5\x62\xa1\x1a\x33\xc1\xf9\x13\x0a\x59\xdf\xec\xeb\xbd\xb3\xa7\x9e\x91\xb8\x76\x3b\xbf\xd6\x1a\xa4\xc9\x96\x3a\x92\x89\xbb\x95\x81\x7d\x01\x39\x84\x52\xfa\x17\xb1\x19\x94\xc1\x90\x05\x6d\x5c\xf7\xa6\xbf\x76\x1f\xdb\x9e\xbb\x1e\x0a\xa0\xc4\x0e\x29\x07\xd9\xbd\x07\x36\xad\xd2\x35\xd7\x95\xb2\x1e\xa7\xd1\xb7\x09\x5b\x21\x64\x4f\xfc\xfd\x83\x17\xfc\xad\x6a\xd3\xea\xf9\x52\xbc\x21\x64\x04\xe0\xcb\x3b\xbd\xaf\xbd\xe1\xc2\xbc\x59\xa7\x46\x8d\x0b\x21\xd3\xca\x5b\xec\x2d\xc7\x31\x45\x1e\xd7\x62\x53\x2f\x74\xd3\x6e\x40\xd6\x70\x21\x92\x1d\xce\x2f\x86\xb6\xb6\xbc\xdd\x56\xd3\xd9\x85\x58\x1e\xf4\x97\xb7\x34\xc7\x78\x5c\x62\xbb\x03\x9d\x86\xd8\xe4\x52\x35\x78\x32\xe5\x81\xd7\xf1\xb6\x19\x4d\x71\x0d\x66\x53\x8c\x65\x38\xc5\x5e\xa6\x53\xdc\x0e\xe3\xb9\xff\xcc\xe5\x56\xb9\x87\x27\x15\x07\xf3\xa5\xe2\xb6\x78\x53\x71\xfb\xfc\xa9\xd8\xcb\xa3\xe6\xe6\xdb\xcf\xa7\x8a\xb1\xbc\xaa\x18\xe6\x57\x45\x86\x67\x15\x19\x94\x89\x11\xbc\xab\xc8\xf0\x8c\x71\x43\x63\xf9\x58\x71\xeb\xbc\x6c\x7e\x6c\xf1\xe8\xf6\xf0\xb5\x69\xf1\x03\xf9\xdb\x74\x1f\x22\x1e\x57\x0c\xbf\xfb\x87\xf2\x8d\xa0\x68\x80\x53\xf6\x6d\xf3\x66\x1c\x74\x3e\x3d\x57\x74\xd0\xbf\xab\x5d\x7e\x91\x4e\xcd\xc8\x42\x7d\x7e\x1e\xf9\x69\xb1\x40\x20\xde\x48\xbc\x15\xc0\xd4\x12\x6b\x66\x26\xe4\x2c\xa6\x1c\x76\xb4\x0f\x32\xed\xe6\xf7\xea\xc0\x7a\x07\x84\x37\xb7\x38\x7c\xd2\xb1\x63\xf7\x59\x52\xab\x56\x5b\xf6\x0e\xf6\xbc\xa5\x81\x5a\x75\xf0\x6d\x7a\xdf\xb6\x50\x67\xc2\x3b\x39\x49\xcf\xe3\x18\x36\x28\x3e\x70\xd1\xe4\x5c\x72\x12\x0e\x45\xe0\x3b\x3b\x8b\x97\xfb\xc5\x82\x61\xc7\x77\x52\xc8\x4c\x78\xa4\x6f\x2e\xaf\x39\xc3\x3a\x15\x5c\x1f\x96\x79\x50\x8f\xd9\x20\x7a\x9d\xe2\x68\x54\x21\xbd\xaa\x37\x7c\x51\x7a\xe8\xb0\xa3\xad\x16\x66\x2b\xd7\x10\xbd\x13\x7d\x99\xde\x1e\x53\xfd\x7f\x52\x86\x8a\xc2\x80\x6a\xed\xf1\xf6\xa5\x31\x7a\x5e\x02\xeb\x00\xb6\x41\x8a\x13\x28\x14\x3d\x61\xb5\x65\xc2\xf5\x22\xf6\x3c\x71\x29\xc5\x9d\x4f\x7b\x24\xac\xd9\x06\x2e\x36\xb2\x91\x75\xab\x18\xec\xbf\x4f\x03\x07\x1b\x8e\x1a\xf6\xd5\xf4\x76\x69\x02\x53\x57\x72\x1f\x00\xd2\x4c\x66\x28\x51\x96\x88\x88\x07\x0f\xe2\xb5\xef\x79\x39\xae\x4d\x5e\xbc\x4a\x9c\x61\x97\xe1\x6d\x69\x14\x9a\x2b\x24\x00\xdc\x95\x7a\x63\x90\xaf\xe7\x75\x07\xc0\x20\x92\xb9\x9f\xed\x23\x68\x8d\x9a\xef\xe6\x15\x07\x6a\x1d\x45\xbf\x3d\x5d\xe3\x8b\xcc\x45\x8c\xe3\x64\x20\x07\x9c\xe5\x6c\xe8\x16\xdf\x9d\x49\x66\xd4\xbd\x34\x33\x71\xbf\x38\x66\x63\x76\x83\xd8\x77\x8d\x6e\x4e\x4d\x07\x36\x8c\x8d\x27\x9d\xc2\x9e\xb7\x2d\x7b\xa9\x11\x3e\x3b\x8a\xef\xa3\x04\xf5\x11\xe8\xf4\xa2\x92\x17\xe1\xa2\x5b\x29\x7c\x29\xaf\xc0\xbd\x2c\x3e\x69\x18\x4b\x7c\x05\x81\x81\xe0\x5d\x8d\x9e\x69\xb5\x6e\xc9\x3b\xad\xd5\xc2\x1e\x77\x02\xc3\x91\xf5\x0e\x40\x71\x3b\x4d\x84\x8c\x18\x28\x3b\x19\x82\x23\x0f\xa9\x57\xd8\x2c\xd4\x36\x92\x4d\xd6\x8d\x5e\xcb\x0b\xc8\xbb\xb6\xde\xca\xa6\x30\xd3\xeb\xec\x46\xf7\xf8\xdf\xc1\x73\x95\x79\xb0\xe2\x03\x37\xea\xbc\xdc\xb9\x52\x66\x94\xea\x24\xd1\xdc\x38\x50\x72\xaf\xc1\x41\xa1\x04\x99\x19\xd2\x6d\x11\xd6\x25\x51\x04\x7b\x20\xca\x68\x79\x5c\x76\xa5\xce\x15\x43\x10\xda\x8e\xdb\x51\x8c\xf4\xc7\x48\x7b\xec\x51\x14\x7b\x11\xc5\x95\x86\x48\x65\xc7\x23\xec\x98\x16\xa2\x87\x10\x4c\x32\xdd\xef\x63\x3c\x10\xff\xd9\x1d\x21\xa6\xf5\xa2\xfb\x26\x6b\xba\xac\x13\x4c\xc2\xe9\xaf\x19\x5d\x10\xff\x96\xe0\x83\xd7\x77\xc9\xdc\xab\x5b\xa9\xd6\xb0\x90\x7e\xc3\x2e\x98\x37\x19\xd3\x73\xde\x2e\x55\xd9\xc4\xa1\xc9\x74\xea\x6f\xc8\xef\xec\x55\xa0\x31\x5d\xd6\x78\x15\x5a\xaa\x31\x7b\xa5\xf5\xba\x47\x57\xf6\x4a\xa3\x8e\x4c\xaf\x15\x5a\x04\xcd\xcf\x5b\x39\x3e\x3c\xb2\x5b\xd3\xe3\x76\xbb\xd9\xbb\xd3\xb6\xca\xa8\x3d\x8e\x0c\xb1\x73\xe6\x3c\x7a\xed\x50\x91\x3f\x90\xb7\x7d\x65\xd9\xd3\x96\xa7\x06\x22\xce\xe5\x40\xb0\xf9\x6d\x3f\xd6\x7c\x5f\x53\x39\xa8\xf9\x5e\x67\x78\xd5\x97\x29\xe1\xe3\xc7\xec\x54\xd1\x93\xdd\x96\x88\xce\x7e\x88\x31\x73\x51\xa7\x64\xd6\xdf\xd4\x95\x87\xbd\xdc\x42\xee\x8f\x22\x4a\x99\xc0\xa0\xb1\x3a\x54\x93\xaf\x49\xec\xdb\x7f\x60\x78\xe6\x98\x00\xc9\x4e\x2c\x56\x5f\x14\xce\x0f\x29\xa5\x05\xee\xa1\x52\x48\x58\xd1\x4c\x84\xa9\x23\x26\xc2\x68\xc1\xe3\x81\xca\x85\xa5\xa2\xd3\x48\xde\x5d\x8f\x8e\xe8\xc9\x0e\x35\x90\xc1\x9e\x18\x9f\x1f\xe2\xde\x86\x02\xc8\xa3\xbe\xd6\x7a\x3d\x26\x67\x67\xe7\xa9\x04\x3f\x9d\xd1\x0a\x19\xc7\x34\x53\x9d\xde\x5c\xa7\xf8\x27\x94\x0b\x90\xf7\x7d\x75\xcf\x7a\x6a\x26\x19\x4f\x53\x41\x2e\xc1\xdc\xcd\x05\xa1\x0c\x25\x5b\xec\x53\xd4\x52\xea\xb8\x09\x1c\x07\xa3\x23\xd9\x94\x92\xeb\x59\xb1\xb6\x51\x2b\x59\xd6\x10\x26\x4f\x0f\x64\x57\xb9\x0a\x15\x1b\x05\xa8\x25\x9d\x8c\x74\x22\xe7\xe0\x3b\xb4\x65\xe1\x0d\x07\x37\x26\x7c\xc5\x97\x72\x7e\xb9\xa3\xa4\x71\xa0\xa5\xff\xc0\x52\xff\x0d\xe4\x10\x14\xa2\x1b\xbf\x7f\xcd\x3c\x82\x62\xc8\x17\xf7\xc1\xb9\xf8\x0f\x96\x4c\x90\xef\x5d\xf8\x7b\xe6\xd5\xbd\xf9\xdd\xda\x43\x0f\x62\x5f\xf4\x7d\x57\xe5\x66\x3c\xe9\xbe\x74\x6a\xdd\x03\xcc\x51\xf8\x7b\x19\xd4\xfb\xfb\x8e\x32\x25\xda\xf7\xae\x73\x98\x28\x4f\xac\x94\xac\x4d\x40\x43\xf7\xfa\x2e\x82\xd9\x23\x09\x30\x6d\xd3\x67\x21\x92\x1c\x21\x86\xf9\x37\x76\x14\x3d\x6e\xfa\x8e\x6b\x61\x6a\x96\x1e\x5c\xbd\x68\xf8\x17\xaa\xa5\x36\x0b\x6f\x6d\xcb\x29\x9a\xa8\xcc\xc4\x5b\x52\xd2\xe6\x10\xac\xc6\x3d\xc2\x10\x11\xc5\x59\x6e\xaf\x8e\x59\xf5\x5c\x8f\xb7\xeb\xaa\xe4\x30\x0e\xe2\xf1\xeb\x17\x96\x41\x27\x9c\x1f\x94\x63\xe0\x41\x85\x0e\xae\xcc\xb4\x93\x58\xc8\xb7\x08\x92\xb2\x8b\xc7\x73\x8e\x9f\x25\x13\x31\x1d\xc1\xe0\x09\xbe\x0a\x01\x79\xb3\x2a\xcb\xfb\x77\x97\xf7\x80\x30\xa3\x50\xe9\x60\x31\x89\x3b\xaa\x78\x95\x57\x1c\xa3\x72\x5c\x26\x6a\x93\xd1\xec\x6a\x4e\x6e\x3a\x39\xbb\x17\x75\x7f\x50\x9c\xff\x0d\xb9\xe7\xa4\x6b\x0e\x10\xeb\xd0\xec\x93\xa5\x6e\xd4\xa2\x6b\xe2\xe9\x89\x5f\xe8\xb7\xf9\x64\x75\x10\x00\x98\xe6\x46\xdc\xed\xe4\x7e\xca\x54\x71\x02\xb1\x07\x98\x12\x92\xce\xba\xeb\x41\xc7\xd7\x1e\x66\xfb\x2f\x88\xdb\xbb\x3b\x3c\x4a\x7e\xcb\x6c\x0f\x18\xfd\x0b\x78\x88\xee\x09\x82\xcc\xa7\x11\x7c\xb2\xfb\x93\x7d\x01\x44\xca\x11\xe0\x91\x7d\x7f\x8d\xa3\xee\xaf\xfe\x4b\x7d\xa5\xd2\x10\x33\x48\xba\x46\x31\x70\x40\x33\x2f\x95\x5a\x5b\x99\x1d\x72\x2c\x70\xac\x23\xd6\xdc\x67\x90\x7c\xe4\x33\x97\x34\x04\x85\x6f\x00\x9b\x74\x6e\xa5\x51\x58\xa4\x25\x7f\xda\xae\xaa\xef\x29\x6d\x50\x37\x91\x14\x24\x0a\xe5\x21\x45\x61\xf1\x22\xbf\xec\x25\xe8\xc9\xd6\x0f\xbf\x02\x1b\xb2\x6e\xd2\xc6\x66\xba\x6d\xf5\xea\xe1\x57\x9b\xf5\x54\xbc\xf3\xe5\x4a\x23\x16\xd2\x58\x4a\x55\xd6\xe2\xc5\xb3\xdf\xfe\xb6\x4b\x7b\xb6\xd2\x50\x0c\x13\x50\x83\xc3\xd8\x19\x90\x71\x42\x03\xdd\xa3\x1d\x6f\x03\xfa\x42\xd9\x85\x8a\xf7\x03\xbc\xf1\x29\xfd\xb0\xc2\x05\x7b\xed\x63\xc4\xa3\xc6\x5a\x6d\xb7\xc7\x68\xcc\xc2\x92\x1e\x2a\xca\x04\xd8\x1b\xf1\x95\x4d\x60\x9f\x21\x65\x99\x03\xd7\x51\x10\x0b\xa6\x5b\x04\xd3\x80\x53\x17\x3a\x3e\x11\xb5\xae\xce\xa7\x1d\x60\xf5\xd6\xeb\xaa\xc4\xa7\x80\x03\x58\xb0\xd6\x90\xcf\x7b\x08\x01\xf2\x1d\x0f\x32\xb3\x71\xe0\x06\xfc\xcf\x38\xd5\xa8\xe8\x98\xa6\xb3\x84\x8a\xee\x1b\x7b\x8f\xe2\x9d\x3a\x1e\xa5\x4c\xcf\x2e\x60\x5f\x46\xc2\xf0\xa7\xab\x56\x7d\x5f\xf6\x2b\x55\xbb\x67\xe3\x89\x6a\xec\x38\x5c\xfc\x71\xe3\x03\x16\xdc\xb2\x02\x06\xb5\x53\x9b\x83\xe6\x92\x70\x59\x10\xd9\xb5\xdb\xe2\xb1\xba\x10\x4f\xbf\x7d\xe9\x5b\x14\x66\xb3\x5e\xeb\xa6\x35\x42\x6e\x5a\xfd\x70\xa1\xe7\x1b\x6c\x68\x4e\x5d\x53\xaa\x65\x73\x92\x69\xec\xa5\x0f\xfa\xb7\x1b\xc9\x46\x69\xb9\x24\xc7\x9a\x15\xd0\x1c\x24\x1c\xcc\x92\xcd\x21\xab\xc7\xfb\xf4\xf1\x3e\xd4\xe6\x71\x93\xe3\x34\xa8\x85\xf5\x23\x1b\x24\xf5\x07\x25\x9e\x11\x89\x69\x84\x50\x78\x16\x48\xc2\x7d\xd6\xd4\x6c\x12\x4e\x09\xc1\x12\x33\x39\xbf\xbc\xf1\x6b\x7f\xb0\x4c\x13\x03\x13\xa5\x96\x3a\x52\xca\xa1\xc9\xa8\xc3\x59\x27\x40\x8a\x87\x4a\x15\xc4\xc8\x53\x07\x87\xf0\xf1\x37\x10\x43\x3a\x22\xb5\xbe\xa6\x18\x32\x0e\xbc\x29\xa3\xe0\xdc\x6b\x21\x62\x69\xd5\xdc\xfa\xdb\x33\x77\x64\xda\xa6\xac\x2f\x8e\x7e\xe1\xd7\x7a\x4f\x77\x7a\x05\xe8\xf9\xb8\xbe\xa8\xdd\xcb\xef\x7d\x3e\x4a\xb6\x79\x7f\x63\x66\xe6\xfd\x20\x37\xd3\xc7\x5f\x44\xf6\xa5\xa4\x8f\xdb\x24\xb2\x3d\x6f\xf6\x35\xed\x5f\xf9\x7d\xca\x3e\xde\x9f\x0f\x9a\xc0\x6e\x42\x13\x87\x41\xc9\x6e\x25\x66\xf5\x2c\xed\xaf\x17\xcf\xad\x03\xde\x56\xeb\x2d\x30\x6e\x84\x16\x84\x7c\x19\x44\xda\xdd\xeb\x59\xfc\x01\x10\xb7\x7e\xed\xf7\x10\x58\xda\x53\xad\x00\xd1\x33\xb6\x06\xf6\xb5\xd4\x8b\x33\x36\x0a\xfd\x6c\xbc\xca\xfa\x20\x7d\x5f\x66\x08\xa7\xa7\xe2\x19\x10\x38\x3b\x16\xc3\xc7\xb5\x0f\xdd\xf1\x3a\xd9\x6a\x81\xde\xce\x14\xe4\x77\xe6\x05\x83\x76\x15\x52\xf6\xd6\xb7\x8c\x91\x86\x79\x4c\x4c\x55\xd6\xed\x43\x32\x89\x3d\xac\xd5\x87\xf6\x61\x55\xd6\x4a\xd4\xfa\xe1\x42\x56\x15\x41\xda\x51\x85\x9f\x1e\xbe\x5b\x04\x22\xc3\xe5\xd5\x47\xd1\xbf\x62\x90\x98\xb2\xbe\xd2\x97\xea\x0f\x1b\xd9\x14\xaa\x78\x42\xcc\xd6\x3f\x7d\xee\xf2\x00\xc2\xd6\x7f\xd7\x96\x95\x99\x66\x4b\x9e\xdd\x73\x59\x31\xe5\xe6\x62\x89\xc5\xff\xe9\xb7\x99\xda\x71\x11\xac\x36\xaf\x94\x6c\xf6\x55\x4c\x0b\x9d\xdd\xcb\xa0\xdb\x50\x38\x4a\x16\xdb\x66\x2e\xd7\xed\xa6\x51\x50\x39\x40\xd9\x5c\xa8\xf6\xf5\x66\x56\x95\xf3\x2e\x36\x4d\xe7\xd3\x6d\x02\xbf\xb8\x68\xb6\x39\xa7\x3b\xdf\x97\x55\x45\xe0\x4d\xdf\x97\xed\x12\xc0\xa4\xf3\x46\xe2\x32\xb1\x39\x03\x96\x25\x90\x47\x44\xa0\xf6\x05\x8f\xe6\x99\xc6\xdd\x91\x89\x21\x8e\x86\x59\xcc\x18\xd9\x28\x53\x96\x81\xf1\xfa\xb2\xb9\xce\x1d\x1b\x60\x5a\xbd\x66\x23\x46\x64\xfd\x33\xc2\x38\x7e\x82\x9b\x45\x39\x85\xd1\x24\xa4\x76\xe4\xb4\x5f\xd6\xad\x6a\x9a\xcd\xba\x15\x9b\xda\x65\x8f\x9d\x72\x53\xb5\x91\x0b\x55\xed\x9e\xf4\x2c\x6d\xff\x2a\x32\x93\x79\xee\x32\x1c\x5b\x7a\x38\xd9\xbf\x65\x13\x41\x05\x3b\xfd\x38\x2a\xe3\xf2\xfc\xf0\x33\x7f\x7c\x92\xfa\x6f\xd3\xec\x90\xec\x9e\x67\xae\x09\xe7\xa8\xf8\xf1\x0e\x33\xe4\x4d\x24\xc9\x94\xbb\x16\x7e\x5c\xb6\xa7\xaa\x95\xf3\xa5\x15\xaa\xa8\x15\x0e\x21\x61\xe5\xb5\xb0\xf5\x0d\x22\xbe\xb8\xe4\x0e\x39\xc9\x2f\xc2\x3d\x19\x58\xd4\x46\x2d\xdc\xb2\x41\x03\xb1\x2b\xe8\xf0\x5a\xf9\xa1\x8d\x5b\xa9\xbe\xb5\x72\x0d\xe4\x7c\x68\x7a\x56\x0c\xd5\x14\x7f\x2a\x17\xea\xc9\x6e\x5e\x29\x06\x44\xbf\x60\x09\x20\xfc\x25\x25\x83\x3c\xff\x76\x00\xbe\x65\x3a\x61\xa6\xf3\x89\x5a\x1c\xb0\x23\xb3\x52\xcc\x5c\x48\x58\x40\xb9\xf0\x8b\x7e\x84\x41\xf7\x27\xa5\x3c\xbc\x13\x4e\x7e\x9e\x96\xc5\x4b\x4e\x7b\x58\x3f\x29\x15\x8a\xc6\x39\x20\xed\x66\x88\x52\xb6\x2a\xa3\x4c\x99\xaa\x9d\x11\xa6\x72\x4a\x9e\x54\x85\x3f\x03\x7a\xb9\x75\xa3\xae\x0e\x30\xc3\x85\x4a\x6f\xf7\x13\xd9\x6b\x6d\x01\xee\xf4\x4f\x7a\x0f\x48\xcc\xf2\x4b\x37\x09\x0b\x72\xe8\xc6\xf4\xc8\x38\xc1\xa8\xe6\xe2\x8d\xa3\x21\xb3\x4f\xe9\x0d\xe2\xb5\xfa\xb4\x5c\x48\x13\x1c\x81\x33\xc7\x09\x0c\x7d\xc6\x31\xba\x2b\x7f\x5d\xcb\x7d\x05\xe4\xe9\xeb\xcd\xeb\xfd\x98\x89\xa5\x8a\xe6\xa8\xf1\x38\x4c\x4d\x7c\x9d\xf9\xca\xc4\xdc\x47\x19\xb5\x44\xba\x6e\xef\xa3\x85\x7b\x7f\xf3\x95\x1b\x41\x52\x7d\x2f\x9f\x0f\x10\x55\x56\x07\x24\x50\xa7\x15\x5e\xc9\x5d\xd0\x94\x6d\x29\xab\xce\x4c\x61\xb8\x34\xe6\x92\x8f\x61\xbd\x30\x9b\xda\x0a\x7d\x3d\xe2\x56\x3b\x7a\xec\xa8\xf1\x44\x97\x5d\xd6\xeb\x4d\x8b\x66\x9a\x85\x6e\x56\x60\x0e\x6b\x74\x15\xeb\xb4\x31\x1d\xa9\x09\xea\x74\x92\xb4\x20\x80\x75\xa6\x78\xfe\x98\xa5\xaa\xd3\x41\xa2\x34\x4d\x43\x9d\xc4\xcd\xca\x4b\x89\x75\xbc\x5e\xb7\xd6\x8e\x70\x9d\x7a\x05\xe4\xb4\x47\x2d\x7a\xce\xbc\x2e\x0e\x7c\xa0\x98\x9b\x47\xfc\xa4\x26\x4e\x1e\x31\xec\xce\x58\xca\x86\x0b\x82\x2f\x42\x38\x17\x4e\x53\x4f\xfe\x7b\xd1\x33\xdf\xeb\x26\xb5\xf7\x68\xf6\xeb\x98\xd1\x85\x8e\x52\xff\x88\xaa\x5c\xa8\x87\x73\x60\x35\xba\x01\x42\xea\x43\x64\x11\xd9\xdb\x69\xaa\x4b\xb8\x5e\xb7\x18\x92\x66\xc6\xf4\xdc\x11\x95\xa3\xd8\xe3\x8e\xd8\x0c\xc2\x71\x2a\x33\xbb\x63\xeb\x91\xf2\x78\xe6\xa4\xdb\x56\x06\xec\x63\xfc\x1e\xb7\x8e\x55\xce\xb1\x7b\x81\x5f\x8e\x8e\xdc\x08\xa6\xf9\x20\xee\x6e\x3f\x57\x39\x4c\x03\xed\x7e\x2d\x8e\x3b\xc2\xae\x77\x2c\x89\xd3\xa7\x47\x30\xe7\x99\x2d\xc5\xd6\x3a\xc4\x7a\x78\x1d\x07\x45\x0e\xfa\xe9\x4d\xbf\xe4\xc1\x4a\x74\xd7\x32\x7c\x3c\x66\x82\xc5\x27\x96\x4f\xe7\x3b\xa3\x9a\x87\xba\x29\x2f\xca\x1a\x11\x24\x48\xe8\x3c\xb6\xc7\xde\x9d\xfa\xba\x80\xcc\xf5\x27\xfc\xfc\x79\x39\xf4\x5e\x84\x2b\x0e\x7e\xad\x28\xa9\x56\xa8\x9c\x5c\x41\x1a\x84\xed\x14\xb6\x20\xd7\x15\x36\x8a\xcd\x04\xe9\x36\x6a\xb0\x6c\x8f\x8c\xd0\x97\x72\xd7\x5d\xbe\x44\xae\xe5\x38\x16\x64\x25\xd1\xf5\x13\x5e\x12\x88\xee\x91\x6b\x85\xd9\x4b\x92\x72\xbe\xc5\xac\x5f\xb1\xdb\x8b\xeb\x49\x30\x7d\xc2\x66\xea\xc7\x57\x8e\x8a\x17\x8c\x66\x3b\xa8\x7e\xe8\x9d\x3b\x1f\xd6\x01\xaa\x83\xbb\x62\x47\xc6\xac\xcf\x60\x1f\x3d\x7a\x7a\xde\x07\x1e\x9f\x57\x80\x0d\x48\x33\xf4\x22\x6c\x0f\x1c\xc3\x4d\x5f\x15\xf4\x2d\x71\x06\x48\x04\xc2\x28\xaf\xd2\x18\x4c\xf2\x1a\x97\x95\xd1\x70\xd3\x20\x0f\x3a\xe5\xe4\x43\x94\x8f\x38\x67\xab\xe8\x40\x2b\x6c\x4b\xc2\x66\x58\x6f\x2c\x51\xcc\xe7\x19\x19\x46\x75\xb2\x1c\x49\x8a\x02\xe5\xfe\x90\x5e\x25\xda\x47\x93\xdd\x23\x16\x5b\xd0\x0f\x2a\x63\xbb\xca\x20\xd1\xb8\x3f\x6a\xb5\x6e\x77\x2e\xb7\x89\x53\xde\x67\x3b\xdb\xbb\x53\x7d\x24\x38\x39\x04\x8d\xd6\x2d\x47\xd4\x03\xd4\x06\x8c\x32\x2c\x21\xa3\x2d\xd8\xee\x57\xfa\x4a\x15\xb1\xe9\x3e\x86\xd5\x98\x4b\xc2\x93\x87\x1c\xfc\x60\x1b\x02\x39\x81\xa2\xbc\xcb\xba\x56\x08\x5e\x62\xbc\xb7\x69\xbb\x54\x3b\xdb\x8d\x6b\x7d\xb6\x73\xc8\x2a\xae\x21\xc0\xd5\x74\x99\x20\xbf\xa7\x53\xc2\x7b\x14\xd9\x7b\xaf\x6b\xc1\x46\x03\x45\x4c\xd9\x42\xcf\x0b\xed\x30\x23\xc3\x5c\xe0\x74\xe2\x10\x00\xd3\x03\x06\xd1\x28\xc5\x92\x15\xfb\x27\x8a\x40\x1d\xec\xa2\xe1\x7a\x13\xca\x45\xdb\x6c\xd8\x5e\xc6\xc4\xba\xe6\x37\xeb\xf4\x54\xfc\x6b\x69\x4a\x06\xd3\xcf\x97\x03\x98\x7f\x8a\x7b\xc7\x2c\x95\x7e\xf4\x42\x37\x61\xcc\x86\xa5\x1f\x7e\x7b\x59\xae\x1d\x6f\xe6\x1b\x8b\x47\x70\xc2\xb2\xd6\x5d\xd9\xde\x0d\xbe\x55\xfe\x52\x86\xab\xd2\x83\x46\x62\x8f\xed\x71\xe8\x13\x5d\x0f\x6c\x47\x5e\x43\x6e\x4f\x44\x63\xaf\x22\x3a\xb7\xd5\xad\xf6\x83\xc2\x3b\x1d\x0d\x49\xc8\x99\x0e\xb4\x20\xc9\xc3\x30\xb6\x5d\x14\x42\xe2\xcc\xe4\xf7\x7d\x45\x8e\x61\x73\x3f\x86\x91\xf9\xd1\x31\x00\xf9\x25\xeb\xde\xd8\xbb\x47\xfe\x4b\xfb\xff\xe9\xe1\xfd\x79\x22\x55\xc0\x3b\x08\x66\x9e\x94\xcd\x39\x3d\x15\x4f\x36\x56\x46\x58\x30\x60\x58\xb1\xd6\xc0\x47\x81\x23\x5f\x51\x9a\xb9\xae\x6b\x35\x6f\x21\x22\x3a\xbe\xcd\x2f\x30\x89\xee\x44\x6c\x7d\x0a\x16\x62\xf1\x40\x8b\xcc\x72\xc3\x50\x93\x49\x7a\xe6\x80\x91\xdb\x6a\xe2\xf7\x42\x5a\x5c\xfb\x00\xfd\xe1\xc9\xa3\x00\xff\xc4\x93\xdf\x42\x36\x73\x2b\xbf\x63\x5e\x19\xf8\x27\x35\x5a\x1a\x9e\xbc\xc3\xb5\xa6\x6b\x15\x3c\xe9\x8d\x6a\xdb\x0a\xdd\xe0\xff\xf0\xe4\x91\xcb\xd7\x43\xa1\x55\x2e\x3d\x2f\x25\x2f\x26\xef\x11\xfb\x77\xd7\x56\xd9\x1a\x55\x2d\xf0\x99\x9c\x29\x1a\xa4\x93\xe2\xdd\x30\xc8\xad\x07\x53\xae\xab\x0f\xad\x68\x4b\x97\xa1\x8c\x86\x16\xef\xb2\xd7\xe9\x24\xf1\x3f\xec\x0b\x77\xeb\xf6\x4b\xd7\xe1\xd6\xc3\xa7\x4c\x13\x99\x52\x3d\xc3\xf0\xe7\x08\xdc\xb9\xd3\xb7\x1c\x91\x63\x40\xe9\x94\x05\x92\x14\x7d\x00\x71\x4e\xb4\x83\xc4\x67\xfb\x10\xd0\xfa\x8a\xdd\x1a\xda\xdb\x19\x87\x3a\xcb\x71\x0a\x39\x0b\x62\x1e\x2a\x68\x98\xc7\x8e\x90\x76\x5e\xd4\x0b\xed\xd1\x76\x52\x9c\x9d\xa8\x0a\x0c\xe9\x10\xa0\x9d\x24\x09\x6b\xdf\x02\xc6\x15\x26\x71\x3f\x41\xf0\x3c\x8b\x5e\xdf\xfc\xa2\xe4\xa4\x77\x31\x52\xb4\xde\x23\xf2\x88\x84\x05\xce\x51\x59\x91\x70\x6e\xc3\xd2\xfa\x0d\xda\x8b\xd5\x4c\x37\x6a\x2a\x56\x43\x0f\xf0\xff\xb9\x5e\x32\xe0\x54\xfb\x2d\x58\x62\xf0\x08\xe6\x00\x9f\x26\x49\x6d\xfb\xe7\x7d\x17\x35\x69\x08\x54\xa9\xe3\xb5\x3c\xf6\x34\xa6\xfd\x74\x4c\x17\xfb\x56\x3a\xa3\x59\xe9\x2e\xe4\x4f\x53\x69\x26\x86\x70\x33\x12\x6b\xd9\x75\xae\x65\x3e\xea\xdd\x53\xec\x01\x31\xeb\xe3\x47\x31\x8c\x53\x10\xf9\xce\x84\xf1\x81\x9b\x99\xbd\x3d\x4f\x10\x6f\xe3\x51\xff\x28\x3f\x4d\x92\xba\x3e\x12\xf3\x90\x4a\x4f\x49\xf5\xf3\x68\x98\x74\xa3\xbf\x19\xf0\x46\xa0\x9e\x0a\x39\xc3\xf3\x9e\x17\x4e\xf0\xda\x2e\x75\xe5\x99\x85\xe9\x48\x8d\x40\xb4\xc3\x39\x86\x8c\xf1\x8d\xe9\x7c\xd0\xfd\x28\xe3\xc8\xd2\xb7\xc7\x9d\x93\x71\xdc\xa3\x6a\xff\x34\xb9\x97\xf4\x15\xcc\xf1\x8f\x3a\xbf\xa4\xe3\xf2\x1a\xdc\x47\xe9\x0f\xdd\x1d\x49\x4a\xfa\x1f\xb2\xe7\xbb\x97\x75\xb8\x11\xf0\xc6\xed\x21\x3b\x70\xf6\xe7\x25\xea\xc5\xbc\x74\x35\x65\x3f\x4f\x62\xe1\xd5\xe5\xc5\x4a\x8a\xc6\x89\xb1\x9a\xe4\xb6\xf0\xf2\xe9\xb7\xb8\x7d\xfb\xa1\xaf\x8f\xf0\x2d\x4e\x11\xe6\x52\x1f\xf8\xe2\xec\xe7\x4c\xc9\x18\xfb\x35\x57\x89\x95\x98\xf8\x95\x36\xaa\x69\xbf\x41\x45\x01\xab\xc5\x7f\x8f\xcb\xbe\xa8\x7d\x23\x7d\xd5\x3a\x45\xc2\xfa\x05\x4d\x49\xb4\x74\xfe\xe7\x4c\xc9\xe7\x8d\x5e\x65\x67\xd6\x57\x26\x49\x59\x45\xbe\xda\xaf\x25\xa6\x75\x98\xc1\x8d\x9b\x05\xda\x08\x6f\x36\x8a\x05\x84\x2a\x90\x0a\x74\x24\xa8\x52\xa1\x7c\x5a\x83\xd2\x84\x4e\xa8\xe4\x49\x57\x04\xa6\x8e\x52\xf1\xd2\x77\x8f\x7f\x49\xfb\xa7\x17\xa0\x73\x29\x9e\x7d\x58\xab\x79\x4b\x08\x5b\x98\x9c\x13\x54\x26\x21\x1e\xf0\xb6\x9e\xbf\x58\x66\x8d\xe6\x1a\xad\x25\xcd\x12\x73\xb6\xf4\x62\xed\x76\x3f\x03\xaf\x94\xfd\x82\x5c\x57\x77\x0c\xb4\xab\x6f\x51\xba\x8e\x47\x81\x38\x48\x3e\xa3\x65\xab\x85\x51\xb2\x41\x99\x74\x2b\x9b\x22\xc4\xf7\x81\x48\xb9\xa9\xdb\xb2\xb2\x32\x2c\xad\xa1\xd3\x45\xd8\xb5\x74\xed\x61\x9a\x98\xef\x02\x98\xb3\x15\xac\xcb\x05\xa6\xd5\x59\x57\x8a\x23\xe5\xca\x46\x79\x24\x71\x29\x1a\x4c\xdf\x43\xf1\xe1\x5e\x12\xc7\x01\xad\x21\xa7\xce\x52\xad\xa6\x0e\x4f\x49\x62\x88\x9e\xfa\x80\xcb\x55\xca\x8a\x0d\x3e\xc8\xab\x34\xc6\x4e\x66\x0e\x58\x07\x72\x43\xc4\x22\xe6\x51\x5e\x69\x17\x94\x50\x65\x61\x45\x77\x9c\x3c\x61\x3d\x4d\xac\xc0\x7f\x64\x44\xdb\xec\x7a\xfa\xbc\x35\xf5\x4d\x74\x98\xe2\x72\x27\x39\x84\xb0\xad\x02\x2c\x0d\x0d\x9a\x11\x54\x8c\xd8\xc3\xa3\x1b\xb1\xa4\xb8\x7a\x07\x97\x1d\x52\xd0\xa1\xd2\x3d\x0e\x74\x3c\x3d\x15\x95\x5d\xfd\x64\x56\x62\x5f\xa8\xc0\x8f\xac\x31\x8a\xd7\x99\x2b\xf7\xc2\x95\x7a\xf0\xa0\xab\xfa\xcb\x03\xe3\x97\x2d\x7a\x31\xb4\x4c\x1f\x2c\x6b\x44\x3b\x60\x70\x74\x3c\x6a\x8d\xb4\xe2\x1c\x59\xed\xf4\x54\xbc\x6b\x76\xec\x5e\x15\xe8\x04\xce\xaf\x51\x04\xec\xe7\xb5\xac\xdc\xf5\xc1\xb3\x8f\x3d\xbb\x8c\x1a\x25\x1a\x8f\xc3\xb8\xa6\xf3\xe8\xce\x76\xaa\x0e\x15\x4c\x43\xe9\x0b\xe5\xf6\xf0\x86\xbd\x90\x25\xa7\x32\x5a\x98\x9c\x3e\x1a\x94\xdb\x92\x90\x0b\xd7\xb2\x69\xbd\xde\xca\xa3\xe9\x67\x56\x27\x06\x95\x19\x99\x75\x6f\x78\xc2\x5d\x0f\xbe\x91\xc0\xda\x03\x2a\xe0\x4f\xc9\x51\x3f\x3d\x15\x4f\x96\x6a\x7e\x89\x89\x28\x52\x5b\x83\x69\x2d\x97\x06\x49\xc4\x66\x00\x75\x0b\xae\x43\x20\x6b\x16\x5c\x0b\x7f\x7f\xe8\x84\x24\x27\xf9\xb9\xde\xd4\x85\x28\xdb\xfb\xe9\xf3\x1a\xc3\xad\x8f\xb3\xd1\xfb\x5e\xb2\x62\x19\x38\x42\x79\xb3\x01\x91\x79\x80\xcf\x08\xd6\x89\xf0\x9e\xd0\xcb\x9b\xf0\x15\x08\x9c\x7f\x9e\xe7\x44\x3a\xbc\x7f\xc4\x8f\x70\xa5\x1d\x18\x8d\x4d\x9f\x4a\xcf\xa9\x74\x58\x97\x19\x03\x76\x8f\xf2\x25\x61\x40\xb0\x76\x0e\xbd\x36\xea\x1e\xf8\x90\xf0\x71\x54\xe6\xf9\xc1\x8e\xfa\x60\xad\xe3\x6e\xed\x3b\xb6\xaf\xd7\x4e\x38\xd1\xdd\xf6\x7b\x40\x5a\x7c\xc6\xa1\x11\xbb\x73\xeb\xc1\x32\xa4\xdf\x65\x33\xe5\xb7\x8a\xe4\x13\x90\xfc\x7b\xb0\xdc\x22\x04\xce\xd8\x2a\x40\x36\xc5\x42\x23\x9a\xe4\x8e\x31\x3e\x3d\x42\x92\xe3\x86\x99\x49\xf0\x09\x18\x20\xf8\x40\x82\xf1\xc2\x85\xe0\xca\x8b\x88\x39\xee\xcc\xe3\x5c\xfc\x07\x6f\x20\x72\xe4\xb0\x37\x65\xe6\x84\x93\x0e\xa7\xd8\xb9\x71\x23\x13\x5e\xe0\x4c\xef\x38\xb5\x1a\x1f\xde\x80\xc9\xf5\x16\x12\x5a\xd8\x26\x70\x91\xba\xb9\x32\xd8\xc1\xef\x38\xcf\xe7\x45\xbc\x9e\x2c\x6c\x13\xda\x87\x11\xa1\xcf\x4c\xe2\x3c\xa8\xb1\xa1\xc7\x6e\xcf\x5c\xf2\xb2\xf1\xbe\x84\x72\xbd\x53\x60\xcd\x8d\x6a\xa3\xfb\xa2\x5e\x23\x55\x1d\xba\x1b\xd0\x1d\x74\xd6\x2f\x80\x20\x40\xa6\xe4\x97\xa4\x75\x23\x0c\xd6\x7d\xca\xba\x1f\xdb\x70\xdd\xaf\x34\xfc\xc9\x1a\xb0\x87\x1d\x86\xb8\x44\x7e\x9b\x14\x96\x51\x4c\xea\x2a\xa4\x53\x7d\x66\xcf\x63\xd9\x12\x18\xaf\x8f\x56\x7b\xed\x2d\xd0\x6b\xbd\xde\x54\xc1\xd1\xd7\xb6\x73\x64\xa2\x87\xb9\x5c\x58\xce\xdd\xd3\x72\xde\xc0\x0b\xf3\xaf\xf6\x1d\x0f\x84\x3b\xf7\x35\x66\x8e\x3a\xa5\x32\x8c\x5d\xd2\x4a\x8e\xcb\x1b\x7e\x0d\xee\xe7\xc6\xd1\xb1\x86\xba\xee\xfb\xf2\xb8\xd8\xa7\x0a\x5b\xe8\x51\x1b\x08\x00\x9d\xe8\xa8\xc2\x72\x10\x13\x3f\x8e\x7a\x2a\x8b\x2d\x11\x33\xc3\x5d\xcb\xe6\x7e\x53\xa4\xe8\xec\x18\xb5\xd5\x6b\xc2\x1b\xd8\xc1\x84\x51\xc6\x3f\xc0\x40\xb2\x05\x3f\xcb\x8f\x2f\xb5\x47\x8e\x19\x5a\x7f\x7a\x98\x3d\x03\x8d\x59\xdc\x83\xc6\x99\x33\x8f\xfe\x84\x46\x1a\x25\x9b\x19\x56\xb7\xc6\xc5\x7b\xae\x37\xef\xdf\x87\x44\xdc\x02\x57\x96\xb5\x53\xd5\x31\xeb\x70\x7a\x2a\x1e\x43\xd4\x8d\xe3\x29\x19\xaa\xfa\x95\x72\x14\x59\x15\x13\xaf\xef\xd9\x82\xd7\x2d\xe2\x53\xae\x10\xfe\x2c\x7a\xf8\x81\x94\xc6\xfe\x43\xd1\x2b\xd6\xb7\x11\xe9\x1b\x95\x57\xc8\xc7\xd5\x07\x78\xa2\x0c\x57\xc5\xda\x1c\xdf\x0c\x9f\xda\x53\xe0\x7a\xae\xf2\x4e\x88\x5b\x25\x64\xd5\x28\x59\x90\xa3\xa0\x2a\x22\xe8\xce\x83\xf9\xb1\xef\x89\xd5\x02\xb8\x3d\x48\xd3\xed\x98\xb0\xb2\x25\xd4\x07\x13\xe9\x28\xfd\x86\xd8\xc5\x4f\xf5\x4b\xe0\xc3\xd4\x28\x69\x4c\x79\x51\x43\x0b\x72\x7e\xe9\x01\x72\xd6\x7a\xcd\x39\x2c\x67\x00\x95\x3b\xb1\x59\x4f\xf3\xc7\xd7\x3f\xe9\xfb\xae\x5f\xbf\xdb\xa6\xd3\x74\xa1\xb6\xd0\xf9\x6e\x26\xe1\x5f\xbd\xba\xad\x7c\x04\xde\xcd\x55\x52\xb9\x3c\x6f\x09\x53\x9d\x5e\xb1\xac\xbb\xea\xd0\xcc\x01\x03\x6f\x87\x2f\x19\xf8\xaa\xa6\x31\x6f\x33\x55\xe9\xed\x4f\x6b\xea\x39\x5e\x37\x63\x6d\xff\xb1\xd9\xdc\xac\xc1\xff\x9a\x1c\x6e\x0f\xd5\xcd\x29\x4a\xe3\x0b\xca\x2c\x08\xee\x92\x32\x84\xb6\x46\x99\x16\x9d\xa7\x63\xad\x9e\x6f\xe9\x6d\x59\xcf\x99\x63\x38\xc0\x76\x4a\x01\xc0\x9c\x2e\xd7\x14\x34\x08\x97\x98\x99\x70\xe2\x14\x25\xfb\x99\xc7\xdc\x7e\xde\x1d\x37\x1f\x3b\x69\x64\xd8\x78\xae\x0c\x75\x00\xe6\xb1\x32\xd4\x3f\x23\x7c\xd9\x6e\xcd\x9b\x63\x4c\x7c\x42\x9f\x0b\x47\x6e\xaa\x71\xd2\x87\x3b\x06\x37\xb8\x8d\x48\xde\x83\xc1\x11\x7c\x85\x7e\x84\x6f\x8c\x8d\x0a\xa9\x90\x09\x58\xac\x10\x4a\x36\x55\x19\x67\xa4\xeb\x24\xb4\x18\x1b\x76\x0a\x7a\xfb\x86\x30\x49\xc9\xd5\x3d\x24\x2f\xf3\x79\xaf\xdb\xa5\x93\xfe\xda\x46\x21\x3c\xa9\xc7\x5a\x4e\xdb\x93\xce\x83\x17\x07\x03\x11\x0c\x09\xaa\x34\x5c\x3f\xf7\x4c\xa1\x1b\x35\xa4\x4c\x85\xe4\xd9\xb9\x1c\xa6\x80\x46\x67\xd4\x18\xe0\x71\x1e\x15\x9e\x05\x41\x10\x8f\xb2\xe0\x89\x87\x04\xf8\xa6\xc9\xc8\x55\x14\xe0\x8f\xc6\x14\x9e\x9d\xbc\xf7\x25\x16\x3d\xa0\xdb\x63\x22\xe9\x45\x6f\xa9\x4c\x1e\x85\x4c\xa2\xf0\x01\xe0\x4c\xee\x66\xc3\x20\xbf\x47\x43\x6e\xf7\xc6\x29\xef\x43\x82\x1b\xb8\x85\xfd\x41\xcb\xf7\x8f\xf3\x77\x6e\x8f\x24\x0c\x92\x2e\x07\x00\x93\xa8\x62\x27\x03\x2b\x60\xa7\xda\x43\x73\xa7\x32\x31\x9c\x39\x86\xbe\x37\x8a\x80\xc4\x48\xa0\xe3\xae\xfa\xed\x5e\xf4\xdb\xbe\xe6\x7d\x97\x3c\x0b\x49\x3a\xf2\x86\xbf\x4b\xf2\x8e\xa4\x7e\x5d\xc7\x7c\xdd\xf7\xe0\x82\xde\x00\x27\xe3\x1f\x26\x3c\x3d\xf5\x5a\x4d\xf9\x94\x8e\x09\x2a\x1f\xfa\xe9\x23\x28\xfa\x02\x25\x13\xb7\xa6\xd8\xb5\xb7\xeb\x3a\x9b\xff\x3d\x76\x04\x64\x4e\xb3\xc9\x0f\x71\xb9\xe0\x27\x1b\xff\x3b\x2e\xe5\xc1\xef\xe8\xef\xf1\xd7\x31\xfe\xa2\x63\xbd\x45\x47\xf9\x8a\x82\xa7\x68\x9c\x40\xad\x73\xba\xdc\x2a\x0f\x7b\x73\x7e\xf2\xf8\x7d\xaf\xbe\x7d\xff\xe4\xdb\x57\xef\x9e\xfd\x7f\xef\xc4\xb9\xf8\xc1\xfd\x1a\xc0\xf1\x62\x24\xfe\x14\x1d\x2f\xc2\xc3\x03\x2d\x42\x5c\x3e\x20\xe2\xa5\x1f\xdd\xc4\x13\xa4\xd8\xb4\x5a\xf2\x8d\xe1\xdf\xe1\x0f\x6f\xad\x40\xf0\x64\xd3\x18\xc4\xef\xc2\x10\x11\xf8\xe7\x71\x98\x19\x4c\x99\x55\x82\x89\x1d\x56\xb3\xd1\xda\x53\x98\xb1\x35\xf9\xc5\x22\x7c\xf2\xc2\x41\xda\xce\xdd\xd9\xbf\x7f\x3c\xc7\xec\x60\xa1\xe6\xb0\xb6\x97\x38\x10\x5c\x2a\x70\x65\x2b\xcd\x5d\x69\x7b\xe9\x62\xce\xb3\xfe\x81\x19\x80\x5f\x0e\x60\xc1\x16\x4c\x9c\x77\xe6\xdf\xb3\x9e\xd3\x58\xd2\xa0\xfe\x79\xe1\xee\x50\xd6\x1b\xb3\x8c\xc7\x01\x76\xff\x09\x78\xd5\xbd\x61\x55\x99\x98\xf5\x7a\x63\x96\xfe\x11\x02\x07\x37\xcf\xc6\x6b\xe7\x6c\x02\xb2\xa6\xb7\x60\xc3\xfa\xca\xaa\xd2\x5b\x23\x36\x86\x44\x58\x45\x95\x41\x67\xe4\x54\x37\xb2\x01\xe5\xd1\xda\xf9\xdf\xd8\xf1\xf5\xcd\xb7\x3b\xc8\x09\x7a\x2d\x38\xd8\x7b\x64\x10\xb0\x48\x94\x10\x23\xb9\x18\xc7\x9d\xc9\x06\x83\xcd\xbb\xc6\x0a\xcd\x2e\x07\xb6\x6d\xc1\xca\x87\xf6\xdf\xcc\x3e\xb4\xc6\x3c\x69\x85\x17\xa0\xdd\x9c\x91\x78\xbb\x49\x83\x6f\x60\x5d\xed\xb0\xaa\x89\xea\xda\x47\xed\x6f\x1b\xdf\x8b\x61\xd3\xef\xb9\x78\x34\xd9\x30\xe7\xb4\x42\x76\xa9\x7c\x9a\x81\x50\x2b\x39\x11\x29\xb8\x6d\xe4\xbe\xba\xd6\xeb\x6c\xf3\xd1\x18\x42\x99\x9e\x31\xb3\x82\xbd\x7b\xdb\x37\xbe\x14\xde\x3a\x8a\x2b\x74\x7b\xdc\xa1\x18\x9d\x21\xe7\x2f\xcb\x3c\xe4\x69\xeb\xbf\x27\xb6\xc1\x8e\x97\xf6\xad\x5c\xd9\x1b\x4e\xc2\x9d\xf7\xe8\xac\xa7\x6f\x87\x6b\x66\xe2\x1c\x9a\x41\x7c\x69\xf2\xa7\x1f\x15\xd4\x76\xf2\xc8\x98\xc2\x7e\x1e\x19\x3f\x48\xca\xa4\x08\x30\x29\x78\x80\xf1\xdc\x82\x5e\xde\x8d\x02\xb2\xea\xfa\x51\xa5\x61\x3f\x91\x73\xcc\xcf\xec\xc2\x1d\x72\xd9\x3a\xa7\x0a\x96\x1f\x9d\x34\xf5\x3a\xca\x59\x89\x0b\xe1\xd7\x80\x05\x2d\xbb\xd9\xf8\x45\x49\xcf\xed\x09\xae\x07\xe0\x73\x98\xf1\xcb\xc2\xf6\x33\x5d\x95\x29\x17\x47\xa2\x09\x64\x77\xf8\x16\x09\xc8\xa7\x84\x49\x30\xaa\xe7\x49\xed\xbf\x38\x82\xf3\x0e\x44\x09\x86\x6f\x6a\xa7\x46\x17\xfd\x39\xa6\x50\x8f\x92\x7f\x4f\xee\x65\x38\x37\x18\xef\xa3\xec\xaf\x13\xb7\x24\x49\xd9\xf4\x97\x4e\x39\xe8\x3b\xfe\xf7\xc4\x1f\xd9\xb4\xb1\xf4\xa7\x6e\x49\x6c\x2e\xfe\x61\x12\x24\x9a\xa4\xc1\xee\x6f\x31\xf2\x35\xe3\x91\x9d\x28\x3e\x86\x51\x46\x41\xef\x6d\x1a\xe8\x44\x2c\x6f\xee\xab\x63\x95\x83\xc4\xef\x8b\xfb\x9f\x1c\xfe\xf1\x0b\xf2\x11\x2e\xb4\x32\xde\xf3\x3a\x54\x5c\x41\x32\x48\x17\xd8\xee\x7f\xef\x11\xc4\x54\xdd\xb2\xc9\x01\x92\x26\x8f\xc5\xcb\xc4\xdf\x44\x8a\xf5\x4f\x51\x5c\xd7\x60\x3b\xbe\x68\xdb\xec\xde\xe9\x27\x95\x2c\x57\xaf\xd4\x07\xaa\x63\xc9\xa1\x3b\xce\x7d\xf5\x86\x72\x41\xf5\x8d\x79\x80\xc9\x1e\x4c\x2d\x75\x02\xf9\x02\x20\x9b\xef\x0c\x73\x04\xdc\x9e\x6a\xa9\xb3\x76\xfb\x92\x50\xdc\xd2\xe4\xa2\xbc\x11\x3f\xee\x04\xd3\xd4\x1d\x71\xb8\xeb\x2c\xb6\x82\x67\xcf\x19\x13\x8e\x03\x3c\x7a\x4d\xb3\x63\x1c\x8d\x3f\xef\xd3\xee\x67\x2f\x88\xfb\x2f\xef\x62\x65\x5e\xae\x32\x2f\xc2\x04\xda\xf8\xe8\xbe\x75\xb6\x3d\xd6\x44\x5f\x21\xd6\xc8\xf3\xb2\x31\xac\x80\x8b\xea\x8b\xda\xc8\x95\x89\xa9\x45\x7e\xfa\xcb\xfc\xdc\x97\x7b\x26\x9e\xf9\xee\xaa\x16\x65\xf1\x4a\xb7\x2f\x65\x3b\x5f\xba\xa4\x2a\x9e\x6c\xf6\xb6\x37\xb6\xd2\x40\x27\x87\xb4\xdd\xdf\x24\x95\xc8\x65\xb2\x49\x5b\xec\x2b\x9a\x6d\x70\x7f\x3b\xf9\xea\xcf\xcb\xba\x60\xdb\x3a\x62\x58\x7b\x6a\x8c\x6a\x7e\xcf\x5a\x8e\xa8\x35\xd4\xcd\xe8\x96\xc7\x34\x76\xd0\x50\x79\x61\xf7\x4e\xbe\x5b\x2a\x51\x28\xb5\x56\xa6\x25\x5e\x94\x6c\xa2\x68\x61\x2e\xeb\x2b\x5d\x5d\x59\xe6\x1c\x72\x8c\xf9\xf7\x93\xf1\xa6\x8e\x5d\x5f\xc9\x9d\xcb\x3a\xa2\x6a\xa0\x74\xde\x5b\x58\x37\xbc\xf2\xd4\xd1\x26\xff\xcb\xeb\x28\x7c\xc5\x19\x7a\x9c\x08\x94\x5d\x3a\x5e\xa8\xa4\xfc\x45\x48\x5c\x88\x24\x72\x7e\x32\xf3\x7e\xf7\xc5\xe6\x46\x56\x8b\xbd\xc1\x1b\xbd\xc3\xeb\xa1\x49\xc7\x71\x27\xf4\x08\xf4\xac\x03\x8b\xb1\x8c\x67\x18\x7c\xc2\xe8\x15\x70\x3f\xa4\x90\x4f\x95\x6a\x55\x77\x78\xc7\x58\xeb\x39\x0a\x40\x7d\x29\x1c\x9c\x39\x9a\x15\xee\x05\x45\x4d\x7d\x07\x87\x29\x44\xd4\x64\xcf\xf2\xf6\xe0\x43\x26\xe0\xa9\xc3\xce\x95\x59\xfa\x12\xcf\x07\xe5\x65\xf6\x4b\x64\x74\x89\x3f\xb1\xf0\x80\xfd\x63\xfb\xc4\xe5\x24\x78\x87\xd1\xf9\x9f\x92\x96\x3b\x6d\x29\xb4\xfc\xbc\xd1\x2b\xce\x57\x3d\xd7\x8d\x77\x8c\xa0\x1e\xa2\xda\x51\xb6\xab\x38\xcd\x60\x54\x2e\xf2\xd8\x60\x33\xc9\x35\x19\x02\x5e\xce\x85\xeb\x9c\x29\xce\xe0\x7e\x83\x27\x96\x51\x6a\x05\x3c\x0f\x7a\x9a\x55\xba\xbe\x30\x96\x64\xac\x29\x07\x92\x2a\xe0\xdc\xbb\x36\xa6\xe2\x8f\x7a\x6b\x19\xa8\x89\x6b\xab\x05\x0c\xed\x90\x36\xb6\x13\xbc\xa8\xbc\xc6\xbe\x44\x5a\x53\x95\x06\x3e\xc5\xe9\xa9\x5d\x5a\xea\x72\x11\xb2\xb8\x21\xc8\xac\x57\xf8\x47\x3e\x8b\x94\xbf\x0f\x0c\x78\x2d\x46\x95\xd2\x33\xee\x9a\x93\x17\xd2\x52\x39\xd2\x50\xa0\x93\x89\x1d\x9e\x69\x6d\x1d\xb2\xf7\xf9\xb8\x4a\x4a\xa9\x62\x94\x83\x00\x73\xcd\x34\x0a\xf7\xb6\x08\xe2\x36\x3f\x46\x95\x34\xed\x33\x8c\x3d\xea\x5a\xab\xf3\x05\xa7\x96\xcc\x50\x9d\xf3\x78\xe3\xce\x06\x2b\xe6\x4b\x27\x8e\x6a\xbc\x2a\xa0\x94\xfb\xba\x07\x35\xda\x8d\xde\x07\xf2\xff\x4a\x3b\x1e\xb1\xc8\xd3\x9f\x88\x0e\x2f\x92\xe8\xab\x8f\xe7\x22\xc9\xc3\x7f\x1b\xe4\x29\xf6\x0d\x08\xb4\x9f\xfb\xfd\x8e\xa0\x51\xb1\x17\x40\x70\xdf\xc9\x0c\x65\x0c\xb9\x0a\xa3\xf1\x1e\x1b\x8e\x46\xa5\x0e\xc8\x29\x1e\xbb\x2d\x47\x70\x49\xd9\x0c\x13\x23\xd9\xa9\xe3\x64\x19\x22\xa8\xf6\x0e\xfe\x52\x87\x1a\x27\x93\xec\x62\x65\x09\xe6\x1d\x70\x1b\xe3\x8e\x64\xb5\xee\xd8\x53\x8b\x77\xef\xa0\xe3\x8c\x83\x9d\x02\x9f\x46\xbe\x37\x7d\xc7\xea\x1d\x6e\x67\xfa\xf0\x74\x3d\x75\xb0\xb8\x73\xfe\xe9\x7d\x96\xfa\x2a\x46\x2a\xeb\xcc\xe9\xbd\xb3\xf3\xfa\x7e\xe4\x81\x7d\x7f\xd3\x13\x9b\x6c\xf6\x3b\x3c\x9d\x61\xd5\x26\xc9\x4a\x4c\x70\x68\x13\xea\xf9\x16\x8f\xf0\xfb\x1b\x9e\xe1\xcc\xd1\x1d\x35\x9b\xdb\x3f\xd3\x59\x00\xfa\xae\x9b\x6e\x97\xbe\xb7\xcd\x8e\x28\x3b\xb7\x33\xa6\x36\xc6\x81\x63\x76\x88\x37\xe2\xe0\x09\x1b\x4f\x0c\x53\x3c\xf4\x8e\xf6\xe3\xb8\x8e\x3c\x68\xfa\xe8\x5f\xe2\xef\x98\x77\x3a\x4b\xe4\x87\x0e\xb3\x16\x2f\x77\x27\xd2\x24\x93\x54\xb4\xc7\x5d\x77\x64\xa6\xe5\x51\x47\x36\xe3\xbd\x95\x57\xf3\xa4\x2b\x95\x9e\x4c\x80\x93\xe7\x0d\x8d\x5f\xa6\x36\x92\x53\x6f\x75\xa9\x3a\xa7\xbd\x5b\x3c\x7b\xd2\x07\x75\xb1\xb1\x2c\x09\x1a\x65\x26\xb0\xf5\x99\x50\x04\xb3\xf2\x71\xc1\x36\xdb\xc5\x59\x68\x3a\x77\xcb\x08\xd2\x0f\x30\x75\x18\x67\x3b\xc5\x0c\xec\x65\x1b\x89\xe3\x1e\x0d\xa3\x97\x41\xcb\x09\xa4\xb1\x59\x27\x15\x49\xa3\xe5\xde\x2f\xcf\xe6\xd6\x02\x26\xb7\x87\xa8\x64\x60\x85\xe6\x12\xd4\xfb\x58\x89\x70\xf1\xdd\x6a\x66\xc0\x85\x18\x5e\x0c\x06\xbf\xa0\xbf\x60\x69\x84\x34\x42\x8a\xa5\xda\x34\xa5\x69\xcb\xf9\x54\xbc\xb0\x75\x67\xd2\x28\x40\x5b\x2f\xeb\x76\x53\xc2\x69\xb0\x02\x82\x95\x58\x0a\xd9\x4a\xcc\x2b\x11\xda\x43\x19\x69\xa6\xc4\xa2\x92\x5b\x5b\xb1\x11\x9b\xba\x56\x73\x65\x8c\x6c\x7c\x50\x72\xb2\xe3\x7d\x3a\xd0\xe8\x86\x45\x99\x0f\xa3\x33\x20\x3e\x7e\x14\xe3\xd7\xed\x5a\x27\xe5\xa6\x67\x65\xf0\xb4\x8c\x3b\x2f\x7d\xc1\x23\xb8\x89\x2b\xd9\xce\x97\x64\x3e\x75\xdb\xec\x42\xc9\x6b\xbd\x15\xd2\x98\xcd\x4a\xa1\x04\x88\x78\x4d\x8d\x81\x42\x62\x2b\x4d\x68\xc9\x6c\xd6\xaa\x59\x54\x1b\xbd\x31\x94\xd0\xdd\x36\x40\xe1\x07\x65\x3b\x0d\xc1\x18\x78\xea\x94\xbc\x50\x4d\x08\x50\xe0\x27\x01\xab\x12\x1a\x17\xcf\xff\x5e\x78\xc9\xf8\x1d\x65\x7f\x97\xed\x04\x4f\x20\xb8\xe9\xd6\x4a\x15\xf6\x24\x16\x9b\xd5\x6a\x17\xda\x43\x84\xa9\x34\x77\x50\x08\xf2\xe8\x55\xf6\xe4\xf7\x27\x4f\x65\x22\x6c\x8f\xfd\xbb\x72\xb0\xf6\xab\x73\xa0\x13\x0b\xfa\x90\xb1\x89\x8e\x75\x4f\x02\xef\x65\x30\x64\x72\x9d\x5e\xd9\xab\xcd\x0b\x5e\x16\xa9\xa3\x7a\x62\x13\x60\xce\xe2\xdc\xc9\x62\x91\x55\x17\xed\x1d\x5c\x7c\x33\x52\xa7\xfb\xd2\x44\x3e\xf6\xf0\x03\x70\x3e\x7a\x11\x7c\xed\xa7\x4c\x52\x8e\x3d\xe4\xa3\x99\xf8\x1e\x08\xbb\xc1\xfb\x43\xe3\x3c\xcb\xba\x28\xe7\x84\x4d\x8e\x97\x02\x33\x8f\x49\xe7\xcc\xac\x1b\xc4\x59\x52\x8d\xd7\x6c\xc0\xe7\x5a\x6d\x21\x29\x13\x84\xa9\x35\x97\x81\x76\xd6\xd4\x45\x50\x7b\xec\xf3\xcd\xef\xbc\xe6\x78\xf0\xd2\x27\x79\xff\x21\x89\xf8\x92\x8e\x62\xb7\xe3\x8c\xde\x73\x10\xda\xc8\x0e\x9d\xd9\xe0\x50\x14\xad\xd3\x1e\x68\x33\x63\x0f\x4a\x5c\xb1\x59\xdb\xf1\x11\xe0\xa1\xf5\xbc\xd5\x34\xe0\x53\x45\x34\x6c\xdf\x22\x08\x70\x3c\xaf\x2a\xa7\xb8\x77\xee\x37\x5b\xd8\xe6\x24\x28\x37\x68\xf5\x63\xf0\x7c\xfa\x57\x1c\xe9\x91\x00\x8c\x45\x29\xd3\x10\xd4\xdd\x4b\x9e\xdc\x1e\xc1\x68\x48\x1c\x50\xc7\xcb\xe7\x39\xc4\x11\x9a\x1e\xb1\x2f\x90\x3d\x95\x6c\x6f\x4d\xeb\x23\x0e\x30\xf9\xe5\x55\x14\xd9\x33\x32\x56\x52\xfd\x94\x5f\x82\x5e\x79\x7d\x68\x1d\x46\xa9\x29\xc4\x4d\x54\x15\xe2\x06\xea\x8a\x9e\x85\xbe\x9e\x1c\x7d\xab\xeb\x9e\x81\xd7\xe9\x12\x33\x7e\xb5\xb3\xae\x63\xef\x34\xf0\x80\x3d\x78\xa7\xd7\xc5\x8e\x85\xb4\x48\x1e\x9b\x22\x0f\xe9\x98\xf9\xfe\x26\xca\x6b\x32\x0a\x35\xb6\x87\x5b\x08\x38\xb4\x5d\x67\xb9\x01\x7b\x1c\x26\x5b\x76\x34\x21\xd7\x76\x24\x09\x20\x0a\x2b\x98\x31\xc1\xa9\xb0\x8e\xfc\xe8\x3a\x56\xcb\x89\x4f\xc1\x54\x7b\x28\x98\xd0\x18\x47\x25\xc8\x4b\x87\x43\x32\x9e\x93\x4b\x8e\xc8\xae\x11\x32\x04\x2d\x3d\x03\x8c\xe1\x48\x98\x0a\x2a\x67\x55\x45\x28\x25\xce\x4b\x8a\xad\xa5\xdb\x91\x4d\x15\xc5\x90\xad\x0f\x24\x06\xc7\xc2\xb5\x68\x14\x18\x3b\x59\xa3\x7a\x21\xf4\xa6\x61\x4c\x2e\xa1\x37\xba\x39\xf6\x1f\xbe\xbc\xa8\xc7\x85\xef\xdc\xfa\x84\xf7\xb4\xab\xb3\xb9\xc7\x97\x88\x42\xd4\xea\x9d\x68\xd4\x4a\x96\x35\x60\xe1\x7a\x8e\x11\x0d\x30\x51\xac\x34\xb1\xd9\x90\x63\xa9\x76\x21\xf0\x0c\xf2\xa7\x20\x96\x89\x1f\x84\xa5\x92\x05\xac\xd5\x4c\x17\x3b\x61\x80\x7f\x07\xd4\xcc\x56\xd5\xd0\x28\x0c\xa2\x91\x75\xa1\x57\xae\x3d\x6d\xb9\x1e\x0f\xb9\x48\xb8\xb9\x0e\x87\xb3\xbc\xa8\x7d\x02\x29\x8c\xc7\xc7\x2c\x9e\x9b\x26\xc1\xb3\xa3\x68\x30\x58\xf1\x42\xb9\x58\xed\x69\xcc\xf8\x7d\xa3\x5a\xd8\x2d\x2f\x76\xc6\xc7\xbf\xe7\xd6\x7e\xfc\x88\x8b\x6b\xbf\x1c\xd9\x19\x1e\xd9\x8b\x1c\x7e\xb2\x73\x85\x9f\xee\xe7\xdc\xe8\x8e\x7b\x39\xd8\x93\x38\x41\xcb\x01\x9a\x89\x10\xc5\x9f\xd5\x4e\x0c\xc8\x27\x39\x71\x35\x90\xdb\x1b\x89\xca\x91\x11\x76\xdf\x31\xef\x15\x66\xb2\x94\xed\xeb\xfe\xa1\x24\xfc\xe5\x49\x94\xab\x79\xd0\x60\x9f\x71\x0f\xf4\xae\x6c\x7b\x7c\x25\x06\xc6\xcf\x52\x07\xe5\x85\xf0\xae\xd7\x6b\xd6\xdf\x31\xf3\x23\xf7\x19\x4d\x4a\x67\x7e\xc4\xd2\xfb\x1d\x1b\xf7\x95\x20\x7f\xd6\x41\x47\xc7\xa1\xaf\xfd\xf5\x63\x7f\xc2\x7d\x25\x82\x97\x6e\x32\xf7\xce\x4f\xc1\x5f\xd6\x19\xd3\x2b\xd5\x82\x63\xfb\x52\xeb\x4b\x84\x70\x21\x8f\x78\x4b\xe5\x66\x9b\x0b\xb1\xb5\x6c\x3e\xf8\xe2\x03\x04\xe6\xd4\xd6\x7c\xab\x94\x58\xb6\xed\xda\x3c\x3a\x3d\xbd\x28\xdb\xe5\x66\x36\x9d\xeb\xd5\xe9\x42\xce\xd5\x4c\xeb\xcb\xd3\x46\xc9\x79\x7b\xba\xde\x54\xd5\xe9\xff\xfc\xcd\x17\x5f\x4c\x7d\x6f\x84\xc5\xcc\x6d\xec\x6b\xc8\x55\x2b\x1e\xbf\x7e\x31\x81\x6f\xea\x4a\xd5\x80\x1b\x01\x5e\x8b\xe2\xa9\xba\x7a\xa7\x75\x65\xa0\x8d\xff\xa5\x37\xe0\xdd\x03\x44\xb6\xac\xff\xb7\x9a\xb7\xa0\xc8\x98\x6d\x2e\x6c\x21\x4b\xae\x76\x7a\x83\x21\x9c\x9a\xfc\x1e\x69\x3e\x88\x13\x38\x4d\xfc\x84\xed\x0a\x36\x9b\x95\xaa\x5b\xe7\xc6\x6b\xcf\x9d\x6f\x10\x2f\x4c\xc6\xbf\x38\xa9\xf7\xfe\xb7\xe2\xbc\xff\x2b\xd5\x26\x8d\xef\xdb\xa5\xde\x3e\x2d\x65\xa5\x2f\x62\xa7\x64\xb9\x6e\x37\x8d\x2a\x9e\x35\x8d\x26\x9e\x22\xba\xa2\x6e\x0c\x86\x57\xef\x34\x79\x76\xef\x9e\x6f\xb2\xd2\x17\x4f\x78\xa3\xb9\x2e\x6c\x8b\x95\xbe\x80\x5f\xc4\x39\x6b\x3c\x29\xec\x9c\xb4\x1e\x57\x95\xde\xd2\xca\xab\x82\x97\x07\x0f\xd5\x75\x63\x77\xaf\x75\xe3\xb2\x2f\x90\xd1\x95\x9a\xa2\x8f\x6a\xa5\x2f\x2e\x08\x78\x3c\x8d\xac\x68\x7c\xea\x75\xf0\xe8\x80\xa5\x7c\x25\xdb\xf2\x8a\x22\xfe\xe1\x6d\x5a\xc9\x5a\x5e\x28\xd1\xa8\x62\xa6\x3f\x88\x99\x5a\xca\xab\x52\x03\x54\x83\x7d\xa6\xc2\x34\xce\x89\xa4\xc4\x3e\xd4\x9e\xc0\xf0\xd0\x1e\x7a\xc7\x5e\xc9\x15\xda\x17\xd8\x9c\xa7\xd1\xd7\x28\x87\x08\xfe\x0c\x7e\xfc\xfd\xb5\xe0\x73\xa8\x06\x4b\xf0\x8d\xde\xd4\x85\x6c\x76\xd9\xfe\x3a\x25\x7a\x2a\x23\x16\xf4\x60\x6d\x28\x12\xaa\x6f\xcb\xaa\x7a\xa3\xda\x66\xd7\xa9\xe5\xbf\x60\x18\x67\x66\x59\x5e\x2a\x63\xec\xaa\x9f\x27\xab\xf5\xb5\x38\x7a\xb7\x54\x98\xe6\x91\x7c\x90\xf5\x1c\x78\xcc\xc2\x79\xa8\xfc\xfe\x48\xfc\x3a\xa9\xf5\x6b\x71\xf4\x55\xf8\xe9\xd1\x91\x78\x34\xdc\x8c\xae\x81\x5f\xd9\xe9\x8d\xa3\x07\x81\xdd\x79\x74\xc4\x22\xf2\xa2\xe9\x87\x31\xf3\xd0\xc9\xd3\xd3\xdc\x3a\xce\x11\xc8\xdb\x08\xb3\x59\x2c\xca\x79\x69\x85\x84\xcc\x66\xf9\x62\xad\x16\x46\xb6\xa5\x59\xec\xc4\x73\x8f\x7e\x04\x21\xd5\xdd\xb6\x1f\x3c\xe8\xb6\x14\x63\x18\xfa\xf5\xe7\x1c\x4a\xcf\x5c\x8e\x70\x01\xb8\xdf\x90\xf3\xf0\xa1\x00\x7f\xcf\x96\x81\x5b\x10\xc0\xd2\x98\x79\x63\xa5\x54\x61\xb7\xe2\xf8\xc8\x25\xdf\x75\x4b\x3d\xa3\x4e\x80\x6a\xba\xd0\x9f\x09\x14\xee\x2e\xc1\xaf\xc5\x11\xf7\x16\x4f\x41\xa6\xfa\x46\xcd\x9c\xd4\x11\xf1\x12\xc0\x1f\x00\x17\xb3\x2e\xaa\x90\x16\x36\x19\x51\xff\x18\xfe\xad\xb6\xdf\x8e\xde\xe0\xdc\xdd\x84\xba\x53\x5e\xc8\xd2\x36\x6f\xb4\x60\x0b\x47\x68\x3a\x01\xf5\xed\x28\xe1\xd1\xe2\x69\xf5\x4d\xea\x89\x06\xb9\xad\x11\xb2\x28\x10\x17\x3a\x1d\x7f\xab\xf1\xd4\xc2\xb8\x5a\x2d\xe6\x1b\xd3\xea\x55\xf9\xef\x6e\xa2\x30\x7b\x90\xc1\x1c\x1d\xa3\x79\x21\x18\x97\x7b\x5d\x17\xb3\xe9\x4a\xe1\x7b\xfa\x10\x2a\x3e\xa4\x1e\x4a\x65\x30\x4d\xa5\x6c\x28\x93\x2c\xa2\xcd\x47\xc3\x28\x95\x71\x13\xfc\xc4\xaf\xf7\xac\xac\x55\xc1\xa6\xd3\xb9\xa8\xee\xdb\xaf\x53\x72\xf7\x6b\x71\xf4\x6f\x35\x8e\xf4\xf8\xa8\xb3\x47\x54\x8d\xc5\xfa\xbd\xa8\x45\xa1\xae\x54\xa5\xd7\x10\xf1\x0f\x30\x6e\x14\x13\x66\x57\x47\x6f\x6b\xb1\xa2\xbe\x40\x7a\xf9\xdf\x1b\xcc\x0f\xc2\x0e\x33\xf8\xff\x72\x11\x0b\xf1\xa7\xca\x7a\x5e\x6d\x0a\x74\xad\xa3\x3c\xec\x15\xcd\xde\xb5\x68\xa5\xad\xff\xe7\x2d\x39\x10\xb3\x4c\x05\x62\xd6\xe8\xad\x51\x8d\x6b\x73\x29\x8d\x47\xc5\x5b\x37\x65\xdd\x62\x0c\xa0\x77\xeb\xb3\x55\xe4\x7a\x5d\x95\x73\xe4\x12\xcc\x96\xc2\x8e\xfd\xb9\x75\xc0\x83\xe0\xa1\xe7\x9a\x2d\x4a\xb3\xae\xe4\x2e\x1c\x71\xea\x16\xe4\xc1\x4b\x23\x28\xaa\xf9\xe9\xb3\x7f\x7d\x08\x0c\xcd\x42\x5e\x2a\x81\x0f\x68\xdb\x94\xe0\xf3\x8c\x47\x17\x68\xf5\x77\x6d\x59\x91\xa8\x1c\x3d\xab\xc7\xc9\x7e\x3a\x34\x01\x64\x17\xca\xfa\x4a\x5f\xaa\x3f\x6c\x64\x53\xa8\xe2\x89\xac\xaa\x99\x9c\x5f\xfe\x93\x67\x57\x58\xcb\xd9\x92\x67\xd0\xc8\x52\x9a\x27\x72\x73\xb1\x6c\x1d\x9f\x90\xd6\x8d\x0b\x60\x25\xc8\xb9\x3a\x5c\x2d\x2d\x62\x1f\x21\xc7\x95\x14\x65\xf1\xbd\x6c\xea\xc7\xf6\x50\x03\xeb\xfa\xae\x91\xb5\x29\x89\x4b\xf3\x22\x03\x2b\xfa\x56\x61\x41\xb0\xf0\xb0\xb8\xaf\x5c\x51\x5b\x0e\x75\x60\xcf\x75\xf3\x9d\x83\x8f\x0c\x72\x2d\x01\x2f\x60\xa5\xad\x1b\x07\xd6\xf8\xb6\xf6\x15\x92\x1c\x77\x89\x9e\x2c\x65\x2f\x2e\x54\x90\x9c\xed\x4f\xae\xc6\xc7\x8f\x44\xdb\x01\x51\xeb\x28\x58\xd8\x47\x8e\xf6\xcf\x51\x47\x7f\x19\x32\xf3\xdb\xa9\x80\x68\x48\x11\x48\x4f\x64\x8d\xcc\x34\x19\x65\xa4\x70\x33\xb3\xd7\xc8\xfe\xd5\x92\x28\xa0\x4b\xc1\xec\x83\xac\xdb\xc6\x6c\x80\x8c\xaf\x94\xac\x0d\x3c\x20\xa4\xe7\x37\xb4\x0f\x13\x97\x61\x91\xfe\x05\xad\xe8\xc6\xf2\xf6\x73\x9a\x0e\x64\xf2\xae\x03\x7e\xa7\x48\x3b\x41\x43\x8f\x7e\xa8\xd7\x53\x4b\x76\x28\x82\x09\xc7\x03\x2f\x32\x92\x8a\x42\xf9\x64\x41\xbf\x62\xef\xe0\xf4\x68\x12\x6f\x82\x83\x4b\xbb\xd6\xba\x32\x8d\x53\xe6\x6c\x50\xb6\x83\xef\x28\xcf\x2e\x3f\x18\xa9\x63\xbb\xb3\x23\xc0\x9e\x3f\xb5\xb2\xc6\x13\xd4\xcd\xa1\xde\x79\xbd\x94\x46\x25\xce\x49\x47\x2e\xe6\x9a\xce\xf5\xd1\xa3\xc8\x76\x31\x70\x03\xc6\x42\x0e\xa6\x27\xc3\xed\xe2\xf1\x74\x3a\x3d\x79\x24\x9e\xc8\x1a\x94\x88\x12\xf3\x15\x3b\x95\x00\xa9\x2f\x93\xd1\x1d\x9f\x70\x64\x9b\xe1\xeb\xb9\x2f\xb7\xc5\x11\x8a\x06\xf9\x09\xe7\xa8\xc3\x75\x27\x4c\x33\xa4\x8b\x50\x6c\x1a\xf7\xae\x7f\x28\x0d\xdc\x02\x50\xa4\x88\x36\x90\xa1\x63\xb3\x99\x2f\x85\x44\xbd\x5b\x59\xc3\xb1\xfc\xec\xaf\x38\xde\xbf\x42\xa8\x49\x8d\x0a\x3c\x7f\x8e\x30\xc8\xdd\x0a\x87\xf3\x56\x37\x27\x53\xf1\x06\x0a\x8b\x95\x6a\x97\xba\xf0\x88\x59\x9f\xd9\xf3\x3d\xb3\xb7\x11\x94\x79\xfe\x24\xe9\x05\x79\x97\xd9\x87\x0d\x86\x73\xc6\xdb\x8b\x10\x8a\xc0\x61\x1c\x2e\x8a\xb4\x77\xac\x2d\x1f\xae\xa5\x95\xa2\xea\x09\x68\x7d\xe7\xb2\x16\x33\x25\x30\x2b\x7e\xab\xc5\x5f\x23\x5c\x42\xc8\x17\xf8\xd7\x69\x66\x17\x7b\xe8\x71\xef\x2e\x7e\x22\x8d\x43\x2a\x40\xbf\x25\x3f\x84\x66\x30\x32\x77\x19\x61\xd0\x64\x21\x70\x5c\x9d\xb3\x34\x94\x27\x5b\x2f\xf9\x98\x56\x4e\xc3\x9f\xc5\x39\x1f\xc2\x34\x1f\x1d\x9d\xc6\x47\xf7\x57\x62\x20\x3b\xdd\x50\xe6\xa4\x5a\xb7\x80\xa7\x39\xef\xc3\x84\xbe\x51\x17\x65\xfd\xbd\x6e\x2e\xa3\x69\xfa\x5f\x69\x7e\x89\xe1\x3f\x5d\xa2\x89\xf7\x0a\x01\x44\x25\x38\xae\x9b\x56\x3d\xfb\xb0\x2e\xb1\xdc\x73\xdd\xa0\xa9\xc3\x8d\x7e\xc6\xba\xcd\x8d\x66\xea\x0b\x44\x35\x9e\x03\x47\xbe\xb7\x5e\x28\x96\x9b\xb2\x25\xcf\x95\x6a\xd5\xf7\x3a\x9a\x73\xf8\x79\xec\xb4\x4f\x18\xd2\x93\xaf\x1a\x0f\x2c\x34\x3a\xe5\x85\x7a\x86\x45\x90\x54\xe9\xb0\x3c\xe6\x26\x0d\x8a\x24\x70\x54\xac\xc4\x68\x53\x29\x92\x56\x67\x34\xd4\xd6\xf4\x20\xe0\xad\x3d\xad\xec\xc1\xe3\xda\x53\xbb\x1f\xa6\x6b\x4f\xc5\x21\xf4\xae\x3d\x55\xf7\x82\x7a\xed\xa9\xbf\x0f\xeb\x6b\xef\x94\xa9\x9c\x3f\x07\xb5\xde\x06\x04\x80\x5a\x6f\x5d\xbb\xee\x5e\x3d\x55\x0b\xd5\x34\x81\xad\x66\xe8\x02\x3d\x25\x5c\x0b\x1b\xa3\xde\xee\xea\x39\x91\x4b\xd4\x97\x53\xd5\xce\xa7\x24\x40\xfd\xb9\xa6\xa1\x87\x2a\xe9\x97\x88\x1a\x01\xc2\x7a\x5a\x23\xfd\xe2\x14\x81\x6f\xd4\xda\x7e\xaa\x5b\x13\x59\x38\xdb\x72\x05\xb6\xc4\x95\xf1\xb1\x95\xa6\x95\x4d\xfb\xae\x5c\x21\x20\xef\xf6\xd8\x13\xdb\x95\x36\xed\x1b\x35\x57\x75\x4b\xec\x0f\x15\x5a\x99\x77\x3a\xd0\x1e\xfb\xe3\xf1\x6f\x4e\x7a\xfa\x55\xbe\x1c\x76\x0d\x3e\x29\x65\x3d\xd7\x2b\xbb\x54\x1b\x62\xc6\xe8\x59\xdd\x18\x35\x15\xc7\x84\xc7\x70\xcf\x39\x12\xbd\xd2\x48\xf5\x9c\x6c\xe8\x74\x97\xa6\x6d\x64\xab\x2e\x76\x8f\x84\x34\xbb\x7a\xee\x1b\x2b\x6b\xfa\x61\x05\x11\x78\xf6\xaf\xd8\x16\x2b\xe0\xbf\x4f\x4f\x68\xb2\x61\xa0\xe1\x95\xc0\x9e\xfd\x21\x2a\x8d\xfd\x67\x1a\x3a\x4a\x91\xb1\xe0\x4b\x08\x7a\xed\x32\x84\xb8\x91\x2f\x1e\x86\x93\x81\x19\x37\x18\x79\xb7\xd4\x16\xfa\x4e\x3a\x23\xda\x77\x75\xd9\x7e\xbb\xa0\xdb\x99\x86\xb7\x52\xfe\x76\xf7\x33\xf5\x0c\xeb\x6a\x3b\x58\x96\xf3\x65\xa7\x1b\xe4\x76\x6c\x47\xb6\x43\xde\x15\xb2\x36\xf1\x46\xc6\x93\xe6\x53\xa3\xbc\x95\x65\xbb\x04\x9e\x8b\x52\x62\xe5\x26\x86\x77\xb0\x25\x45\xb2\xeb\xcd\x47\x84\xe1\xe8\xb1\xf5\x7f\x51\x6a\x6d\x19\x36\x04\xa8\xc6\x09\x2c\x10\x9d\x06\x8c\xad\x4e\x17\x1a\xd4\x37\xd0\xa3\xb3\xf2\xce\x94\xd3\x51\x91\xca\x1a\xd6\xad\x34\x84\x60\x5f\x38\xe0\x67\x50\xbd\x55\x95\x42\x26\x46\x42\xa2\x02\xcf\x4e\x3d\x2d\x8b\x27\xa0\x8e\xf2\x8e\x50\x53\x0f\x88\xc0\x34\xb1\x26\x5e\xf8\x7d\x23\x27\xdd\x16\x71\xa9\xfc\x06\xce\xa0\x33\xc2\xb1\xe4\xaa\x76\x10\xa5\x8a\x72\xb1\x50\x50\x0e\x33\x9f\xc9\x3a\x19\xc6\xc4\xeb\x49\x42\xe6\x4c\x84\x55\x83\x6c\x97\xf7\x7c\x9a\x23\x55\x17\xce\x82\x03\x5d\x06\x81\xcd\x2e\x1f\x79\x02\x34\x7a\x2d\x2f\x2c\xd7\xac\x70\x8e\x73\xdd\x60\x56\x24\xcb\xc4\xcb\x7b\xe4\xea\x3a\x43\xdd\x9d\x2c\x2b\x83\x9a\x2c\x18\x97\xae\xe7\xca\x2d\x15\x4e\xf7\x9b\xa0\xf9\x8a\x16\xeb\x59\xa2\xf2\xc2\x5d\xec\x6e\x6e\x66\xb5\xf0\x30\x4d\xa3\x1c\xda\xaf\xad\xfc\x95\xed\x0b\x86\x52\x36\xa6\xfd\xae\x9e\x47\x8a\x0d\x5e\xa0\x28\x8b\xe7\xb2\x95\x55\x74\x8b\x5d\x26\x43\x77\x74\x53\xbd\x44\x69\x48\xfc\xcc\x5c\xff\xef\x8c\x3d\x6a\xba\x11\x6b\xd5\x2c\x74\xb3\x02\x6b\x2a\x9c\x0d\x76\x07\xca\xba\x55\x4d\xb3\x59\xb7\xaa\xf8\x66\xc7\xaf\x41\x6c\xd3\x7d\xc2\x40\x8b\x8e\x23\x90\x73\x97\x09\x0f\x94\x65\xc1\x9a\xfa\x4f\xbf\x3d\x0e\x2e\xa2\xa1\xd4\x1c\xe0\x8b\x4c\x28\xe7\x25\xbf\xb3\x7b\x79\xf6\xf6\xb8\x17\x90\xfc\x71\x55\xd9\x92\x78\x83\x8d\x1f\x15\x33\xe3\xf7\x46\xa9\x06\x49\xaf\x47\x96\xb6\x23\x63\xff\x66\xad\x9d\xa4\xfe\xdb\x8d\x9a\xeb\xa6\xc0\x8f\xc7\x4e\x83\x49\xc4\x9b\xc5\x24\x87\x16\x42\x74\x28\xf7\x88\xdf\x9f\x78\xb0\x8f\xd9\xcb\x0f\xae\xa7\xe9\x37\x6a\x91\xa6\x3a\x0a\x58\x52\x6c\x8c\xb2\xb2\x32\x9f\x6c\x55\xec\xec\x98\xa2\xfd\xe6\xf2\xf5\x7b\x36\x27\x01\x9b\x17\x91\x83\x59\x70\xe7\xb1\xb4\x7c\xa1\xab\x4a\x6f\x41\x5a\x46\x25\x07\x48\xa9\x2b\xf2\xe5\x04\x4d\xd3\xdc\x5e\xec\xa6\xb6\x17\x13\x14\xd6\xeb\x94\xfd\x0c\x4f\xe9\x04\x04\x5d\xe7\xa7\x6e\xc0\x51\x5d\x82\x49\xc7\xd2\x18\x8a\x1b\x90\x45\x21\x24\xea\x0a\xec\x25\x51\x57\xaa\x61\xde\xea\x6b\x6d\x4c\x39\xab\x94\x98\x95\xed\x4a\xae\xc5\x95\xac\x36\xe0\x90\xcf\xf2\xc2\x08\xa3\xe6\x1a\xb5\xf6\x4e\x78\x76\x90\xfe\xa1\xa1\x90\xa5\x11\xa5\x6f\x9c\x1e\x40\x54\xc8\x16\x9b\x9d\xb2\x23\xb3\x6e\xca\x95\x6c\x76\xcf\xd8\xc9\xe1\xdb\xf7\x1f\xc7\x9e\x15\xfc\x68\xe9\x97\xf8\x18\x27\x87\xfc\x68\x37\x58\x7c\x14\xaf\xf1\xca\x27\x68\xdf\x3e\xd9\x53\xd2\x49\x27\xe6\x38\x60\xef\xb2\xdd\x4d\xbc\x55\x93\x94\xb0\x99\x43\xe8\xd7\x00\xb3\x58\xda\x15\xfb\xcc\xef\xda\x67\x94\x12\x2f\x2c\x8f\xd1\xee\xe1\x16\x97\x96\x31\x26\xb7\x6e\x7c\x1c\x9c\x97\x9b\xcb\x6c\x98\x76\x21\xeb\x9d\xa8\xca\x85\x7a\x38\x47\x41\x00\xcc\xc1\xfc\x31\x05\xd5\x84\xb8\x50\x2d\x7f\x4e\xa3\x26\xd0\x9f\x69\x51\xd6\xc5\xd3\x6f\x5f\x42\x20\x97\x83\xde\x6a\x54\xb5\xc3\x2d\xb3\x8f\x61\xbd\xc3\xd7\x66\xb6\xb1\x87\xf3\x25\x2a\xff\xd2\xc6\x6c\x55\xd8\x70\x5f\x02\xb0\x7b\x2d\x17\x3a\x87\xe8\x07\x59\xef\xb6\x72\x67\x27\xbd\x55\x8e\xd1\x9c\x29\x21\x67\x55\x67\x6e\xad\x16\x97\x60\xbc\x5b\x96\x09\x4c\x7d\x8e\xa8\x40\xc2\xcf\x24\xe6\xdc\xfd\xd9\x17\x19\xec\xab\x3d\xae\x49\x23\xd9\x7f\x00\x4e\x4f\x43\xf1\x9f\xf3\xc9\x18\xb3\xc6\x69\x9f\xb8\x76\xd1\xaf\x20\xf6\x8f\x25\xb5\x22\x12\x88\x8f\xdf\xfb\xb4\x1b\xbd\x6b\xb9\x6f\x67\xf7\xed\x26\x1f\xde\xe7\xd7\x1d\xdf\xe7\x37\x18\xa0\x87\xf1\xee\x1d\x62\xc2\xeb\x74\xf3\x9a\x25\x29\x59\x7a\x87\x92\x67\x9a\x46\x0d\xd6\xe7\x95\x89\x44\x87\xb0\x56\xe1\xaf\x91\x33\xa9\x9b\x48\x0f\xb7\x81\x9c\x10\xe7\x37\x4e\xfa\x22\x39\x3d\xeb\x13\x74\x19\x07\x71\x3e\xe3\xd8\x92\x1e\xe6\xe1\x98\xac\x2f\x1f\x85\x7b\x85\x4e\x62\x44\xb7\x98\x13\xe2\x67\x6b\xec\xc9\x4f\x15\x35\xc7\x43\x47\x7f\x2c\x97\xd3\x37\xb0\x44\xab\x73\x10\x23\xf5\xac\x69\xc6\x77\x01\xfc\xfe\x1f\xc9\x72\x3f\xd8\x8d\x93\x4b\x87\x8f\x15\x8a\x2f\xb5\xd9\x34\xca\x53\xc6\x79\xa5\xd0\x6d\xdc\x28\xb1\x59\x73\x9a\x89\x76\x6f\x39\x9f\x97\x85\xaa\x5b\x30\xbe\x41\x12\x26\x9e\xc0\xed\xf4\x54\xbc\x38\x5a\x81\xd8\x26\xe7\x2d\x5a\xe8\xa8\x79\x40\xc6\x6a\x5b\x2b\x43\xb2\x0c\x5f\x18\x3f\x88\x22\x1e\x03\x5d\x09\xcd\xd9\xc7\x8f\x61\xae\x04\xc7\x65\x2b\x96\xeb\x1a\x19\x2e\xf0\x51\x46\xff\x3d\x6f\xc1\xc7\x55\x5e\x6c\xaa\xd0\x96\xae\x95\x99\x8a\xb7\xda\xfb\x5c\xb7\x9a\xe6\x0b\xad\x60\x2c\xa8\x34\x21\x7f\x06\x61\xdf\xc0\x1b\x3b\xed\xdc\xd9\x69\x46\xf2\xef\x5b\xd6\xc6\xcb\x2e\x61\xf7\x21\x06\x89\x2d\xf0\x5c\xd6\x9e\x47\x50\xc9\x32\xb4\xf2\x82\x30\xc6\xa5\xb1\x52\x3e\xa6\xf6\x67\xa2\x64\x78\x9b\xba\x03\xa5\x53\x30\x4c\x0c\xde\x68\xdd\x9b\x91\xff\x7b\x45\x5b\xdd\xf8\x6c\x5b\xa5\xf1\x43\xe7\x1a\x65\x98\x04\xa9\x23\xe0\xcd\x0c\x72\xb1\x6b\x8c\xd7\xc9\x4b\xc7\xa8\x04\x04\x43\x24\xe6\x1e\xa1\x59\xe3\xa9\x94\x8d\xaa\x8f\x7c\xae\xd8\x4a\xcf\x65\xe5\x83\x04\x03\xe8\x4e\x38\x65\x24\xfc\x43\xb7\xe0\xdc\xe5\xfa\x9a\x7f\xff\x9d\x6d\xcc\xb5\xe4\x25\x76\x55\x19\x05\x01\x62\x13\xee\x54\x08\xb1\x83\xe4\xbe\x03\x9c\xc5\x4c\xd9\x46\x98\xe4\x4b\xce\x58\x4c\x8f\x16\x1e\x97\x44\xfa\x0e\x1f\x40\x3f\x89\xdf\xde\x95\x2b\xa4\xd9\xf7\x04\x03\xe0\xde\x93\x36\xe6\x3e\xc0\x70\x27\x80\xc5\x7c\x13\x73\xb9\x03\x9c\x39\x35\xa4\xa1\x32\x72\x45\x4e\x4c\xd2\x10\x07\x14\x54\x2a\xeb\x46\xcf\xe4\xac\x72\x90\x9e\x8d\xc2\x64\xbe\xe4\x40\xe2\x62\x1f\x4a\x55\xdd\x55\x42\x1d\x98\x62\x69\xde\x28\x59\xec\xb8\x5e\x39\x28\x2a\x22\x05\x01\xfa\xc9\x41\xdc\x0f\x65\xa5\xb7\x1c\x99\x5d\x79\x7b\x4b\x90\x81\xbb\xe7\x1f\x52\x7a\x31\xbf\xdd\xd6\x8a\x23\x22\x7b\x15\x06\x53\xbc\xf8\xeb\xc4\x07\x87\x41\x0a\x6c\x87\xc2\x0d\xff\x2a\x91\xa0\x78\x74\xcc\x63\xd4\xa8\x1d\x19\xc7\xa2\x02\xbc\xd7\x5c\xd7\xa6\x34\x2d\x09\xab\x7a\x11\x65\x07\x47\x0a\x47\xae\xc4\x96\x8e\x95\x0b\x46\x21\xec\x56\x68\xc8\x16\x63\x82\x12\x33\x8a\x1b\xb1\xb2\x6a\xd9\xba\x7d\x63\x2a\xb4\x8a\x32\x46\x30\x81\xb3\x51\x66\x53\xb5\xb8\x66\xc6\x87\x42\x92\xda\xae\x15\x5b\x92\x34\x2a\x8d\x62\xb0\xeb\xfd\xc8\x08\x97\x89\x9d\x0f\xae\xb4\xc3\x2a\x2c\x01\x3e\x23\x25\xb9\x95\xae\x29\x9b\xaa\x93\x7a\xc9\x6f\x13\x4e\x21\xba\x57\x39\x8a\x00\xfb\xcf\x5e\xd0\x68\xb9\x07\x81\xc4\x92\x4c\x5a\x7d\x58\x62\xbc\xd0\x19\xab\xca\xf7\x3c\x6a\x88\x7d\xea\x75\x49\xec\xaf\x3e\xe8\xf4\x87\xba\x0c\x8c\x42\xae\xb5\x3b\x1d\x84\x46\xc9\x57\xe2\x90\xe1\xb9\xe0\x8f\xc4\x02\x73\xcc\x7c\xe5\xe8\x56\xb9\x5d\x89\xac\xf9\xe4\x62\x20\xd1\x69\x51\x7c\x8f\x78\x00\xda\xc1\x4c\x88\x76\xab\xc5\x5a\x1a\xa3\x0c\x83\xae\x77\xf0\x02\xf6\x83\xd3\x1e\x1a\xdf\x3e\xc4\xcd\x86\xd4\xf6\x93\xa0\x75\xf1\x1a\x17\xfb\xf8\xdf\xf3\xe7\x71\xe1\xc8\x2f\xf5\x91\x6c\x60\x32\x61\x46\x57\x99\x7a\xcf\x93\x58\x71\x00\xa3\x5b\x94\x85\xd3\xb4\x46\x4c\x3e\x08\x3b\x8a\xbe\xc4\xf9\xbf\x22\xd8\xe5\x9c\x07\xdc\xb1\xed\x66\x92\x55\x41\x4e\x70\x08\xb1\xc6\x2c\x76\x71\x3b\x3e\x89\x35\x66\x6c\x84\xa9\x3c\xe3\x07\x98\x7a\xbb\x1d\x67\xf5\x69\xa1\x47\xd7\x26\xef\xe9\x7e\x7e\xb1\x72\x4f\xcc\x5b\x96\x7d\x0d\x38\x51\x3c\x4a\x77\x98\x71\x8d\xb3\x21\x6c\x9c\x13\x5a\x82\x38\xe7\xec\x13\xcb\xf6\x3d\xdc\xac\xa3\x45\x1e\x3c\x09\x9d\x23\x37\xc8\x58\xe7\x83\x60\x4d\xab\xd7\xfd\x67\x12\x9f\xba\xc4\xe2\xc9\x6f\xe8\x3b\xca\x17\xf9\xb0\xac\x1f\x7a\x23\x1c\x92\x4b\x4c\x3a\x1d\xd9\x42\xe1\xa6\x22\x62\xe5\x06\x23\xd7\x15\x5a\x87\x02\x23\x16\xdd\x50\x7a\x0b\x38\xf7\x35\xf1\x3c\x1e\x84\xca\x34\xea\xaa\xd4\x9b\xd0\x65\xe4\x6e\xea\xfa\x75\xcc\x55\x26\xd1\x28\xfa\xfe\xd0\x93\x1c\x34\x9f\xd0\xbd\xef\x2a\x1e\x1d\xd2\x34\x32\x3d\x9a\xde\x4e\x9c\xfe\xe5\xf4\x3b\x06\xbd\x10\x31\x46\x29\x01\x76\xdd\xbc\xa8\xd3\x91\x10\x64\x09\x11\x2c\xa0\x57\x5c\xf1\x83\xd8\x9a\x0b\x60\x29\xec\x5d\x0e\x14\xef\x4f\xac\xd4\x52\xae\xd7\xaa\x46\x2c\x1d\x63\x69\x2e\x62\x4e\x98\xc0\x35\xdb\x76\xbd\xb2\x8a\x91\x3f\xd7\x5a\xa4\x7b\x76\x6f\xa3\xaa\xdb\xb2\xa1\x27\x12\xa3\x46\xc9\x6f\x18\xb0\x86\x91\xd6\x14\x71\xf6\x10\xe8\x14\x22\x36\xdb\xa6\xbc\xb8\xb0\xf2\x17\x86\x9a\x62\xc8\xcb\x43\x0f\xb4\x41\xae\xf1\xee\x39\x3e\x90\xc8\x06\x59\xfb\x5a\x34\xf6\xfd\x7e\x22\xfb\xf9\xcd\xa9\x2c\xf3\xdc\x38\x9c\xc8\xbe\xdf\x4b\x65\x3f\xbf\x06\x99\x7d\xff\x73\xa3\xb3\x9f\x27\x8b\x7a\xa7\x44\x35\x27\x5b\xb1\xe3\x93\xf1\x69\x88\xc9\x70\xcf\xa9\x0d\x05\xa2\x9f\x01\xca\x6d\xb7\x56\x7a\x21\x74\xfd\xc4\x4b\xcd\x10\xf2\x75\xe4\x44\xcf\xa3\x30\x3b\x5e\xa8\x27\x91\xe9\x49\x1a\x4d\x6f\x4f\x96\x78\xf0\x60\x28\xd8\x6f\xea\x03\x04\x4f\x62\x95\xe0\xbe\xe2\x53\x37\x20\x50\xb7\x66\x32\xb9\x7e\x4a\x02\xd3\xd1\xcc\x0c\xf4\x82\xa4\x68\x2f\xa6\x63\xc0\xcf\xaa\x64\xee\x7b\x96\x42\x95\x4d\x4e\xe2\xd7\x1d\x48\x9c\xac\xad\xfb\x24\xc9\xf8\x98\x7c\x9e\x2e\x74\xf3\x4c\xce\x97\xc7\xae\x43\x38\x82\x6f\xd4\x5c\x5f\xa9\x66\xe7\x8f\xdd\x3e\x33\x7a\x38\x37\x20\x49\x74\xec\xe9\x3d\x04\x0a\x16\xe0\x0b\x47\x05\xa3\x2a\x67\x9c\x21\xef\x33\xce\xe3\x81\x88\xbe\x1e\x53\xa3\x27\x1d\xc8\x00\x0f\x04\x40\x6e\x2b\xfc\x29\x9b\xaa\xc8\xa9\xe5\x2c\x4c\x26\xa9\x75\xee\xdc\x5d\xb8\x37\x77\x8f\xd3\x07\x0c\xbf\xdf\xcd\xc1\x0f\xce\x25\xe0\xe3\x3d\xf5\x04\x70\x27\x4e\x54\xf6\x09\x7f\x51\xbf\x26\xb6\x65\x42\x0f\x90\xfd\xc4\xc1\x2e\xc2\xaf\x98\x04\x11\x72\x8e\x3c\x78\x20\xe2\xda\xc9\x12\xe0\x54\x6d\xd1\x93\x44\x8a\x0a\xf8\xda\x4e\x69\x15\x02\x7b\x64\xa3\xc4\xb2\x2c\x0a\x55\x4f\x29\x27\xd8\x6c\x33\x9b\xb9\x63\x1c\x9a\x49\x9c\xbc\x4c\x8c\x89\x91\x5e\x9c\x27\x10\x17\x80\xfe\x12\x80\x2c\xe9\x1e\xf6\xa9\xdf\xdc\x5a\x6d\x3b\x7e\x49\x17\x8a\xc2\x3b\x06\x57\x8d\xf3\x82\x60\x66\xb4\x4f\x9d\xf1\xf2\xfd\x15\xc4\x6e\x79\xda\xe2\xcb\x7e\x83\xf3\xda\xac\x91\x87\x80\x1c\xe3\xa6\x4d\x27\x16\x06\x38\xa7\xd4\x22\xc9\xa2\xc3\xcf\xd1\xb3\x8e\x05\xbb\x17\x06\x6e\xb8\xfd\x96\x6e\xd4\x7d\x7f\x26\xed\xa6\x1e\x67\x56\x22\x14\xf8\xf8\x31\xb3\x52\x5f\x89\x5c\xbb\xd1\x4b\x9d\x5b\xde\x5c\xa5\xd4\x03\xc3\xcd\x1a\xcb\x76\xf2\xf6\x8b\x7d\x67\xb0\xdb\x71\xd6\xe5\x04\xdc\x78\x83\x23\x5c\xba\xc3\xb1\x11\xc6\xbe\x06\xdd\x33\xed\xb3\xe7\x57\x1b\x4b\xc0\x27\x14\x1b\xe0\x8e\x38\x3a\xb3\x91\xc6\xc6\x1b\x47\xb8\x8a\xbe\x50\xa0\x99\xaf\x09\xfe\x90\xec\xc6\xdc\x3e\x8d\xac\xba\xfd\x05\xbd\xf8\x40\x83\xa3\x1a\xa6\x20\xc2\xc0\x9b\xd8\x38\x00\x07\x51\xd6\x10\x96\x68\xe7\x2b\x2b\x54\x0b\x3a\xed\x05\x79\x10\x86\x46\x9c\x14\xc3\x7d\x17\x02\xc7\x9e\x2c\x78\xc7\xce\x73\xb0\xff\x4d\xe7\x36\xc5\x27\x80\x59\x4d\xe6\x91\x3f\xb7\x5b\xf0\x94\x86\xf5\x39\x1a\x9e\x8c\x1e\x61\xaf\xcd\x2e\x31\xe6\xc4\x70\x62\xf1\x38\x52\x20\x22\x72\x7c\xc5\x03\x9c\xaf\x12\x8e\xb7\x27\x66\xfb\x29\xf6\xc0\x6c\xd9\xbd\x87\x05\xcc\x71\x7a\x96\xa9\xb2\xcb\x89\x2c\x55\xcf\x56\xdc\x88\x09\x12\x87\x31\x42\x61\x83\x7b\x07\xf3\x89\xeb\x0c\x5e\x2c\xdc\xb1\xf0\x2c\x10\x1c\x68\xb3\x96\xdb\x5a\x15\x80\x08\xb8\x05\x67\x5e\x82\xb3\x84\x15\x73\xda\x32\x2b\x7f\xf3\xd6\xc0\xfb\x06\xf4\x7c\x90\x6f\x21\x78\x0b\xd0\x13\x5b\xb3\x1c\xe7\x91\xf9\x70\x1f\x52\xdc\xe9\xa9\x78\x6c\x85\xcf\xa2\xa3\x60\x25\x09\xdf\xb9\x3c\x62\x86\x07\x4f\x30\x7c\x9e\xdb\xc8\xf6\x84\x46\x16\xca\x3c\x11\xd0\xf0\xd0\x2e\xe3\x96\x03\x52\xdb\x14\xb6\x8d\x45\x94\x6b\x42\x48\xea\x39\x41\xda\x63\xba\x45\xac\x38\x8d\xb6\xbf\x37\x13\x43\x56\x7e\xe8\xcf\xdb\x90\x9c\xf9\x8c\xce\x96\xef\x30\x04\xc4\xc7\x35\xf6\xa8\x96\x0f\x4c\x6a\xd1\x1d\x6e\x9f\x3a\x7a\xcc\xc0\x73\x68\xcf\x99\x14\x15\xbd\x33\xe2\x4b\x90\x9c\x72\x76\x28\x96\xb2\x88\x34\xc1\x60\x4f\x90\x78\xbc\xca\x56\x3c\x7e\xfe\xee\xd9\x9b\x68\xcb\x8f\x4c\xcf\x46\x1b\x80\x8e\x9a\xcb\xda\x6b\x56\xe6\xaa\x69\x65\x59\xc7\x9a\x66\xe4\x4e\x9a\x60\x3d\x80\x76\xd0\xa9\x77\x62\x05\x57\x80\x81\x11\xab\x4d\xd5\x96\xeb\x4a\x91\xd6\x59\x58\x11\x80\x1d\x5e\xb2\x68\xf8\x68\xed\xad\xac\xa3\x03\xcd\xa1\x68\x5d\x20\x78\x74\x28\x6b\xff\x33\x9c\x7d\xef\x95\xbc\x00\xb3\x09\xd3\x1b\x82\x6a\x1a\x81\x0d\xfc\xa9\x47\x05\x12\x13\x8b\x4a\x13\xd4\xf8\xad\x26\x0b\x0e\xd9\xb2\xc1\xc1\x9c\x37\x47\xda\x36\x55\x17\x31\xa2\x24\xf7\xb7\x48\x59\x91\xd4\x15\x14\x1a\x7a\x7b\x59\xae\xc5\x4c\xb7\x4b\xc7\x51\xd9\x0b\x1f\x19\xa4\xd0\xac\x0c\xc9\xaa\x23\x34\x03\xbe\x88\xbc\xc5\xb8\x32\x95\x02\x8f\x74\x09\x4a\x85\x18\x33\x07\x58\x08\xe4\x2d\x80\xbb\x76\xba\xc5\x96\xfb\x46\xc5\x0e\x11\xbd\x06\xb3\x1f\xed\xb2\x45\x17\x2c\xb5\xe8\x1c\x42\x6e\x6e\x78\x53\x07\x9c\x5d\x47\x3d\xa4\x37\x7a\x46\x6f\xf3\x11\x8d\xde\xae\x88\x29\xe9\x79\xbc\x5e\x2c\x02\x0a\x2f\x78\x48\xc2\x23\xdb\x02\x48\x74\x49\xde\x93\x51\xe6\x9c\xe8\xb5\x4d\x9f\x51\xde\x63\x62\xa9\x1b\xf9\x98\xba\xf1\x1c\x81\x39\x2e\x8c\x28\x33\x96\xa9\x70\x2b\xc2\x2c\xe3\xf8\xc5\xb7\x18\x2f\x53\x2e\x23\x95\xa0\xf4\xbe\x65\x1d\x94\x8c\x9d\xa3\x88\x68\x8f\x57\xe0\x1b\xe1\x21\xbf\xb9\x75\x30\xf2\x20\x48\xb9\xbf\x2e\xb6\x68\x9f\x89\x3d\xd6\x74\x3a\xde\x84\x69\x0d\x3e\x25\x02\xf0\xf7\x65\xbb\x44\xe7\x14\x4b\xf5\x3e\xac\xab\x72\x5e\xb6\x68\x8c\xa7\xda\xcf\x2b\xbd\x45\xd6\x41\x96\x35\x70\x25\x25\x46\xaf\x7b\xc8\xa9\xdd\x5a\x71\x39\x57\xbc\x09\xce\xd2\x08\xd5\x03\xe2\x11\x49\x47\x95\xd6\x6b\x57\x5a\x99\xaa\xac\xdb\x87\x45\x69\xe4\xac\x52\x0f\xed\x89\x78\x58\x95\xb5\x12\xb5\x7e\xb8\xa9\x61\xa9\xbc\x6b\x6c\x32\x97\x04\x97\x13\xc9\xd0\x5e\x39\xed\x16\x44\xb2\x5b\x10\xc8\x6e\x41\x1c\xeb\x08\x63\x63\x45\x31\x57\xfb\xad\x82\x1b\x05\x21\xb4\x75\x86\x41\x66\x97\x79\x4a\x4a\x56\xd9\xb4\x7b\xe8\xd8\x1e\x8f\xc7\x51\xf2\x5d\x9c\x61\x42\x9c\x87\xf0\xe1\x6b\x0b\x76\x37\x71\xc4\xfc\x51\xd4\xbc\x21\x04\xbb\x67\x49\xfc\x40\x6a\x9f\xce\x3e\xa2\x7c\x99\xcc\xd1\xb0\x8b\x4c\xc8\x99\x73\x52\xe7\x4e\x4a\xd8\x5e\x91\x8a\xd2\xfd\x77\x29\x1a\xd4\x48\x9f\x9c\x44\x4a\xca\xde\x5e\x8c\xe4\xfe\xe5\x0e\xff\x5c\xef\x70\x88\xd4\xff\xe5\x26\xff\x4c\x6f\xb2\x6d\xff\x4f\x5a\xaf\x8f\x13\x85\x2f\x33\x19\x24\x36\x8d\x2e\x17\xc7\x79\x4a\xd9\x28\xb1\xa9\x1d\xf6\x9b\xa2\xa0\x53\x8a\x68\x22\xfd\x87\xb1\xfc\x09\x1c\x7a\xcb\x5a\x30\xbd\x29\xea\xdc\xff\xa8\xb7\xe0\x4c\x07\x76\x51\xb4\x29\x20\x3a\x1f\x5e\xc8\x85\x04\x87\x8a\x76\xf9\xb5\x78\x29\x77\x33\xc7\x09\xa2\xb5\x3d\xb4\x35\x07\xea\x70\x99\x09\xb4\xb5\x9c\x18\xc5\xd9\xa6\x23\x05\x09\x0e\x40\x70\x64\x68\x69\xa1\x9b\x4b\x55\x88\x2b\xd5\x18\x42\x69\xc1\xde\xde\x30\x66\xd0\x4e\xe9\x7b\x5a\xca\x77\x4b\xd9\x82\x95\xc2\x3c\xd7\x0d\xbb\x42\x2a\xaf\xc2\xcc\x27\x28\xea\x0f\xb1\x4e\x14\xf8\x3d\xc5\xbe\x12\xf9\x0d\xcd\x9a\x55\x06\x3b\xfc\xfd\x79\x3e\x94\x3f\xda\xff\xe7\x96\xa4\x83\x3e\x0c\xba\x25\x8f\x12\xb7\x3a\xcc\x49\x81\x45\xa8\xe7\xc4\x81\x4e\x10\x7b\x97\x4f\x8c\x8b\xa4\x18\xcc\x1d\x57\x3f\x1a\x99\xd9\xd5\xf3\x65\xa3\x6b\xbd\x21\x7a\x0b\xf1\xce\x84\x08\x20\x0b\xe0\x61\x9b\x8d\xe5\x96\x37\xa8\x89\xf3\x06\x9b\x7d\xc3\x67\xf0\xd7\xff\xcb\x3e\x1c\xc7\x27\xb7\x3a\xa1\xce\x8d\xbd\xc6\x51\x63\x97\xf9\x1f\xf4\x5c\x79\xef\x13\x0e\x98\x9b\x2c\x7c\xac\xdb\xc0\xc8\x6c\x21\x33\xd7\xbf\xb3\x85\xac\x5a\xdf\x7e\x77\x58\xa5\x9e\x5d\xcf\x2a\x45\xae\x7f\x88\x3a\x1e\x1d\x3f\xb5\xfb\xf1\xcb\xc6\xf4\xdd\xf3\xf0\xc8\x00\xc0\xc4\x37\x95\x9e\x5f\x42\x2c\xc2\x84\x1c\x09\x10\xd7\xc4\x21\x92\x4e\x7a\x2e\xa6\xcf\x5a\x71\xa1\x29\xa2\xba\x51\xc0\x55\xe6\x50\x59\x63\x64\x05\x5f\xc0\xf3\xe0\x4f\x74\x3d\x57\x6b\x8c\x3b\x9a\x10\x74\xc7\xa6\xde\x96\xb5\xf7\x24\x47\x34\x4f\xf1\x7d\x70\x8a\xc7\xef\xde\x42\x01\x4f\x33\x42\xa4\x40\xd9\x89\x68\xb5\xc6\x0e\xb0\x24\x41\x0d\x98\xe3\xdc\x2c\x4f\xa2\x60\x84\xbe\x69\xa0\xba\x38\x73\x42\x3c\x17\x9f\x6e\x13\xce\x1c\x73\x07\xa0\x00\xe2\x1a\x3b\x0a\xe1\x01\x68\x93\x41\x17\x41\xd7\x92\x43\xa1\xdd\xcc\x1a\xe5\x33\x74\x07\xc4\xc3\xa9\x78\x9a\x8f\xbb\x99\x08\x89\x29\xb8\xa4\x77\xf0\xf4\xb1\x13\x84\x17\xc7\x72\x2b\x91\x2c\x12\x4f\x73\x42\xfc\x8c\x73\x3b\x74\xed\x48\xd1\xa8\x87\x78\x7a\x82\x8f\xe1\xa8\xa3\x9f\x59\xe5\x27\xa4\x27\x73\x80\x33\xd8\x62\x1f\xd7\x98\xf3\x54\x71\xa7\x98\xce\x6e\xfe\x94\xde\xbf\x1f\x5c\xc9\x72\x5e\x78\xa1\x19\x40\x19\xa6\x65\x69\xd4\x7c\xd3\x98\xf2\x4a\x55\xbb\x3b\xf2\xc7\xeb\x06\x1b\xc5\x97\x8a\xe2\xc4\xb4\x58\x6d\x10\x3e\xb0\xcf\x83\x78\xea\xd2\xa3\x35\x6e\x0e\xe4\xbe\x12\x2e\x05\x3a\x7b\x95\xad\xa8\xb5\xa8\x74\x7d\x01\xc2\xf0\x23\x97\x5c\x90\x6e\x93\x17\x25\xca\x96\xdb\x35\x47\x06\xf0\xa0\xf3\x4c\xe9\xf2\xc6\xc0\x05\xb2\x93\x83\x78\x2b\x29\x16\x8d\x32\x4b\x77\x2d\x31\x2f\x1b\x16\x6c\x94\xd9\xac\x5c\xc1\x20\x0a\xa3\xbb\x72\xb5\x13\x3b\x4b\xd8\xa3\xc7\x19\x74\xbf\x76\xaa\xf0\x0c\x38\xf4\xa1\x8f\x1f\x45\xc6\x61\xa5\x97\x45\x20\x46\x84\x9f\xdd\x9c\xf0\x91\xa0\x9b\x38\xf8\xc4\xa6\xf5\x28\x49\x0e\xef\x21\x52\xe0\x66\x10\x53\xce\x98\x3c\x46\x70\x49\xb6\x46\xf4\x73\x1e\xf7\x28\xef\xfa\xd2\xb9\x79\x88\xe7\xfd\x7d\x24\xd4\x1d\xbb\xde\xa6\x21\x88\x16\xdc\x6a\xb3\x02\x03\xb1\x56\x5e\x31\x00\x6c\x20\x28\x07\x3a\x2f\x8d\x97\xe9\xf3\xbe\xbf\x1e\x57\x3d\xf2\x43\xf3\x2e\x46\x83\x1e\xbf\x8e\x00\x0c\x0e\x75\xbf\xd3\x6f\xaf\xc7\xef\xfe\xa0\x8a\x54\x2d\xfe\xb8\x66\x28\xe4\xed\xb2\xd1\xdb\x9a\xc7\x3c\x22\x01\xa1\x98\xc7\x7b\x8c\x6b\xe9\xba\x07\x53\x70\x06\xa0\xfc\x24\xa6\x0a\xa0\x31\x5b\x70\x3a\x5f\x00\x08\x10\x3e\x8f\xe4\xde\x26\xdb\x56\xad\xd6\x2d\x21\xb7\x83\xc5\x14\x0e\x5e\xc9\x6c\x06\x59\x17\x46\xc5\x9d\x1c\x93\xb0\xf6\xc8\x4b\x65\xc1\x11\x16\xe3\xfd\xe6\x4b\xce\x8b\xf5\x38\x30\x64\x56\x6b\xb6\x69\xb9\x21\xc6\xe9\x12\x36\x75\xd9\x7a\xc0\x29\x5c\x81\xb9\xac\x79\x63\xe4\x8b\xdf\x13\x61\xea\xb3\x3b\x1e\x99\x40\x84\xb9\xcc\x3e\xe5\xc7\xc1\x61\x2b\xc5\xc7\xa1\x63\xad\x61\xb8\x34\x9f\x11\xef\xf8\x19\x7f\x22\x77\x00\x10\xe2\x86\x53\x2b\x69\x99\x1e\xff\x72\x4e\x23\x1b\x58\xad\x43\x63\x9d\x17\x56\x79\xe0\x38\x4e\x3a\xec\x5e\x78\x6e\xe3\x3c\xf6\xd8\xe6\x6c\x4b\x1c\x18\x73\xdf\x3f\xb0\x07\xf8\x9c\x2f\x20\xd5\x40\x07\x80\xfe\x0e\xde\xbb\x31\xc7\xdf\x2d\xf0\x56\x61\x20\xb8\xe7\x15\x33\x97\x02\x06\x88\x67\x23\xf2\x59\x00\x73\x78\xd8\x2b\x8f\x22\x66\x78\x9c\x63\x06\x29\x6c\xcf\x51\xe8\x0b\x70\xe8\x92\xb8\xf1\x81\x0d\x39\x1e\xdc\x91\xbc\x03\x58\xf1\x5b\x0a\x35\x1b\x13\x69\xd6\x5d\xa0\x6e\x58\x84\xe7\x5e\xa2\xf0\x1f\xcb\xdc\x89\x67\x1f\x4a\xce\x51\x73\xfd\x5c\x84\xfa\xeb\x1f\x90\x4d\x42\xca\x72\xce\xdb\x31\xcb\x54\xe8\x5a\x39\x0e\xd4\x03\x0b\x0a\x78\x46\x3d\x5c\xc0\x66\xed\xd4\xdf\x68\x89\x0f\x8f\x5c\x04\x84\xe6\xc2\x06\xb2\xe0\x68\xa2\x3f\x3e\xa1\x8b\xe1\x26\x86\xbd\xcb\x3d\x4b\xb3\xd9\xe3\xc9\x9e\x3a\xa0\x47\xe5\x4f\xb2\x9e\xde\x59\xce\xed\xeb\xd8\x23\xdd\x9b\x12\x58\x8e\xaf\x4f\x1e\x32\xd3\xb6\x13\x0b\x2d\x7d\x82\x1c\x70\x75\x20\x94\x53\xda\x03\x4f\x3f\x30\xdb\x5c\x11\xf9\xd2\x0e\x53\xb5\x20\x5f\xbe\x20\x28\x41\xc7\xb5\xa2\xad\x99\x81\x50\xa8\x0f\x65\x4b\xc3\xd8\x18\x40\x4f\x2c\xe8\x46\xef\x57\x61\x8b\x1b\x19\x11\xdc\x10\xdf\x2a\xd9\xcc\x97\x1e\x45\xde\x3d\x08\x09\x4d\xbd\x97\xa1\xed\xec\x00\x9c\x9e\x8a\xd7\xd2\x18\x64\xc4\x3b\xe9\x97\x4e\x62\xa6\x2a\x4d\xe7\x93\x30\x5e\x3c\x67\x4f\x8e\x27\x4b\x52\x09\xc5\xa3\xf8\x23\x66\xca\x25\xe8\x3d\xc4\x02\xf7\xe2\x24\xe0\xf4\x78\x71\x83\xe4\x53\xb4\x62\xa1\x5b\x14\x20\x45\x2e\xb5\x69\xb9\x3c\xee\x12\xc5\x5a\xda\x5c\x02\xb8\x08\x24\x5b\x2e\x5b\x03\x4e\x5a\xec\xe5\xac\x41\x1d\x47\xc8\xe7\xd2\x60\xea\x44\xd7\x14\x25\x2d\x0c\x86\x33\xec\xd2\x72\xe4\x10\x70\x6f\x70\x1f\x2c\xc7\xb1\xb9\x58\x32\x7f\x47\xc3\x12\x12\xfa\xa3\x06\x59\x09\xcf\xb3\xb9\x42\xd9\x0e\x2d\x62\x3c\x69\xd7\x4c\x69\x9e\xf3\x78\x8b\x1d\x6b\x37\x4d\x53\xef\xec\x37\xf0\xf0\xb8\x88\x3f\x2c\x3e\x21\x3e\x01\x42\x3c\xe1\x41\x86\x48\x40\xff\x1e\x6f\x43\x02\x4d\x72\x2e\x03\x1e\x90\x54\x2d\x0e\xcf\xa2\x8c\x12\x1e\x6c\x75\x63\xda\x87\x00\xa7\x64\xe6\xaa\x96\x4d\xa9\x7d\x24\x36\x35\x43\xc6\x4d\x58\xb3\x99\x0a\x30\x77\x37\xe6\xa5\xb2\x6a\x40\xc4\x38\x2e\x54\xb4\x98\x5d\xaf\x67\xa7\xe7\xb3\x25\xb9\x76\x2f\xec\x45\x8f\xe6\xd5\xd6\xf0\x7b\x09\x59\x30\x7c\x12\x86\xf8\xf1\x4b\x52\xa9\x43\xbd\x6c\x9e\x5e\x16\x29\xe6\xca\x4f\xbb\x98\xac\x7d\x71\x63\xec\x39\x4d\xaf\x69\x17\xae\x2a\x77\x1d\x3b\xa9\x3e\x6a\x0c\x35\x8b\x2a\x9e\x9e\x8a\xe7\x79\xe6\xed\x7e\x54\x8e\x13\x9b\x4e\x3a\x62\x4e\x27\xd2\xb1\x7d\x4a\x55\x93\x9d\xb5\xee\xde\x1b\x1a\xd8\x3b\x2b\x87\x06\x66\x0b\xc0\xd6\x28\x13\x47\x32\xd6\x7b\x23\x06\xca\x1c\x5c\xb3\x37\x0f\x56\xa7\x3b\x06\x7b\x21\x7c\x9b\x65\xc8\xd1\x03\x40\x08\x4e\xb1\xd6\x82\x0f\x40\x5c\xd3\x27\xbe\x0d\xb0\xc1\x1b\x0f\x15\x36\xc1\xc7\xcf\xd9\xfa\x79\x76\xaa\xb8\x15\x12\x7b\xf0\x54\x87\xfa\xac\x6f\xf4\xe3\x06\x6d\x26\x5d\x48\xa4\x6f\x69\x3b\x91\x9a\x94\xaf\x43\x00\x30\xcb\x3b\x4e\x46\x4c\x69\xb2\x92\xf1\x4c\xe9\x9e\xc7\x2a\xc4\x00\x49\x48\xd9\x52\xb4\x30\xe0\x61\x90\x0e\x90\x2f\xb4\x5b\xe5\x01\x00\x5d\x1f\x7b\x38\xcd\xec\x18\xd0\x2d\xc8\x9a\x11\x20\x80\xbc\xb7\xb0\x03\x02\xc6\xf4\x13\x91\x18\x1e\x37\x25\x85\x29\xeb\x8b\xca\xcf\x68\x4b\x5e\x6d\x9e\x97\x2b\x75\x9d\xae\x67\x3e\xf0\x90\x53\xa2\x7c\x91\xe9\x52\x1a\x3c\x83\xa0\x51\xb2\x17\x24\x30\x54\xbc\xfa\x70\xed\x50\xe9\xe4\x24\xdd\x4e\xdc\x2a\xa3\xf9\x9e\xf8\xb7\xd0\x1d\xc1\xe9\x75\x4e\x40\x90\xb9\xa8\xd9\x80\xba\x4c\xe2\x12\x38\x0f\xf8\xed\x7d\xf8\xdf\xff\xf9\x5f\x80\xc0\xa8\xd4\xda\xf2\xef\x41\x69\x8b\x7f\x3a\xac\x4d\xf8\xd4\xc3\x93\x24\xa3\xa2\x87\xc2\xfe\xaf\xfb\x44\xc4\x71\xc3\x0b\x91\x93\x78\x39\x46\x4f\xe1\x51\x8e\x18\xc4\xb6\x5e\xb8\x1b\xc8\xf2\x9c\xc5\xe9\x4c\x3d\xbe\x64\x68\xcb\x6c\x66\x46\xfd\x6d\x63\x79\x47\x3a\x85\xce\x81\xd4\xc5\x63\x8c\x5a\xc0\x69\x47\x8f\xc2\x03\x36\x73\xf8\x37\x99\xa8\x4e\xb5\x15\x6f\x55\x9b\x2a\xab\xba\x65\xa7\xb2\x28\x3a\x5a\xf7\x70\xd5\x82\x1d\x60\x53\x1b\xb9\x50\x42\x6f\x5a\x96\xe3\x19\x9d\x74\xd0\x67\xc1\xa9\x85\x81\x32\x98\x29\x97\xf4\xc4\xaa\xbc\x58\x82\x7b\x78\x86\x88\xa0\x34\xee\x49\x00\xdc\x6f\xa4\x0b\xdc\x2f\xc3\xbe\x13\xa5\xc1\x04\x89\x0e\xad\x82\xce\xef\x5a\xb6\x4b\x86\x94\x8e\x9e\xbe\x2b\x09\x7e\x5a\x80\x94\x3a\x9f\x6f\x9a\x38\x3c\xee\x9d\x6d\xc2\xb5\x27\xe7\x73\xb5\xc6\x44\xdc\x17\xe5\x15\x69\x06\x66\xaa\x56\x0b\x54\x3b\x61\x3a\x39\x88\xf3\x34\x96\xd7\x5d\x61\x52\x6c\xcc\xa2\xc2\xf8\x97\xf7\x9d\xc4\x9d\x17\x0a\xff\xfa\xb8\x28\x54\x5d\x6c\x56\xdf\xec\x62\xbd\x2b\x8a\x0a\x8c\x2b\x3c\xcb\x36\xd7\x9b\xdd\x8b\x57\x1c\x71\xa4\x03\xfc\x19\x9c\xce\xc0\x10\x9a\x56\x03\x19\xb6\x2c\xdd\x45\xa5\x67\x92\x21\xea\xad\xe4\xda\xd6\x65\xde\x29\x18\x03\x9e\xa4\xcf\x03\x94\x36\xe8\xe8\x52\xf1\x84\x74\x71\xa4\x78\x17\x1d\xce\x67\x1c\x5f\x69\x03\xaf\xa8\x21\x7a\xf5\x52\xae\x71\x40\x6f\x55\x7b\x86\xe9\x81\x25\xfc\x08\x1c\x69\xcb\x34\x66\xe8\xa6\xe3\xf2\x24\x92\xef\x1c\x4f\x33\x0c\xd3\xeb\x3e\x92\x19\xcf\xa2\xdc\xed\xea\x06\x54\xab\xad\x1d\x48\x4f\x18\x5f\x54\x9c\xd2\xfd\x52\x43\x7c\xf3\x1e\x25\xfb\xdb\x97\xfe\xf5\x51\x7a\xac\x92\x9c\xad\x8f\x48\xac\x8e\x7f\x75\x7c\xcf\xa3\x1c\x8b\xf9\x75\xa0\x34\x9e\xb3\x25\xa9\x7e\x28\x21\x6c\xae\xad\x81\xec\xb3\x8f\xba\x3f\x65\xf2\xc5\x3e\x0a\x7f\x75\x8b\xe9\x8f\x72\xbc\xf0\x53\xa3\xda\xe3\xa0\xdf\xca\x64\x0f\x16\x98\x72\x9b\xad\xf8\x9e\x04\xc5\xc1\xf3\x7e\x0e\xcc\xfa\xb1\x4a\xa4\xb2\xd7\x04\x0c\x88\x36\xd1\x72\x91\x11\xb9\x91\xc3\x30\x51\x0c\xcd\x63\xaa\x60\x69\x10\x00\xe8\x10\x28\x61\xa6\x01\x12\x9b\xec\xd9\x66\xc9\x55\x91\xc0\xc5\xed\xc6\x29\x19\x55\xf7\xf0\xed\xe5\xd5\x0a\xb5\x50\x8d\x8b\x59\xa2\xdc\x63\x1b\x9f\x25\x2f\xc2\x22\x0f\x76\x6c\xf0\xc1\xc0\x8c\x13\xac\x45\x8a\xb2\xb7\xf4\x3e\x92\x77\x03\x4a\x47\x2a\x80\xf5\x40\x36\x0c\xa0\xc3\x67\xe0\x1d\xd2\x47\x2d\xc2\x06\xce\x72\x4e\xc9\xeb\xe6\xf6\xbb\x1b\x69\xf1\xad\x15\x6a\xb7\x25\x00\x22\xb9\xa8\xae\xb0\x3e\xb5\xcb\xc3\x2b\xb8\x9b\xe0\x0b\xe2\xee\x3d\x0e\x6a\xad\xe6\xca\x18\xbb\x6e\x3d\x76\x9f\xaf\x6d\x9d\x32\x8a\x53\xf3\x82\x75\x70\x54\xc0\xe7\x94\xac\xde\x21\xff\x89\x64\x38\x8e\xeb\xa6\xd4\x4d\xd9\xee\x26\xbc\x29\xc7\xc1\xce\x35\xf2\xaf\x0e\xbb\xb2\x96\x15\x4a\x31\x5f\xfb\xd2\x59\x7c\x8d\xcc\x4a\xd1\xff\xe9\xa5\x75\xdf\xcf\xb8\x08\xdf\x83\xb1\xd1\xe7\xa6\x5a\xeb\x48\xe2\x02\xe3\xc2\x24\x31\x31\xc3\xd9\x0f\x04\xdb\xb1\x2e\x7b\x0c\x57\x9f\xb8\x52\x33\x1f\xf3\xd1\xf1\xf3\x89\x52\x6a\xfa\x8d\x4d\x48\x3e\x71\x6d\xe1\x19\x09\x13\x70\xf9\xf1\x83\xbb\x28\x25\x0e\x70\x0d\xb6\x5a\x84\x3c\x92\x89\x4b\x39\x0d\xb5\xc7\xbb\x15\xa5\x89\x98\x06\x5a\x41\x20\xe4\xf4\x84\xbf\xf5\x09\x12\x3d\x15\xb9\x08\xd1\x5d\x9f\xae\xc6\x2a\xbb\x3e\x1d\x86\xf3\x90\x15\x72\x4d\xb1\x0c\x0b\xfb\x56\xa8\xd3\x5f\xb4\x46\x1d\x96\x76\xfc\x2a\xf5\x57\x1d\x5e\xa7\x1c\x58\xb3\x47\x23\x7e\xde\x49\xd3\x9a\xb0\x04\x29\xb4\xe8\x5e\xf7\xe6\xb4\x81\x64\x73\x2f\x54\x9b\xf6\x7e\x96\x7d\x43\xff\x7c\x84\xfe\x45\x47\x7f\xe9\x2b\xdf\x19\x8e\xe8\x51\xa8\xc5\xf5\x33\xcb\x1b\x93\xf4\xb8\xb8\xcf\x55\xd1\xad\x1f\xd9\x91\xae\x3d\xed\xeb\x4c\xbd\x07\x7a\xea\x7e\xb2\x1e\xf7\x87\xcc\xa6\xaf\x34\x49\x31\x0b\xdd\x90\x30\x91\x31\x5e\xdf\xba\xc9\xd4\xa5\xeb\x48\x16\xb5\xe5\x09\x3b\x40\x69\x12\x6b\x3e\x03\x82\x7e\xa2\xf5\x4c\xda\x61\xfa\xcf\xa4\xc6\x42\x47\x1c\x6e\x97\x79\x8d\xd6\x6e\x1a\x7f\x0d\xeb\x7e\x16\x85\xa7\x3f\xae\x2a\xa2\xfe\x3c\xd7\x39\xba\xc9\x73\x43\x92\xcb\x0f\x3c\xdb\x31\xa6\x26\xd2\x84\xfb\xf7\xdb\x47\x64\x87\x33\xdc\xab\xb3\x8d\xf7\x7b\xea\xb2\x6f\xd7\x0b\x7d\x92\x46\x49\x9e\xf1\xb5\x75\x9a\xce\x38\x8f\xec\xa8\x97\xb1\xf7\x75\xcb\x0c\x25\xc7\xfb\xc4\xa3\xa1\xfc\x72\x6c\x1c\x9d\x73\x4a\xb9\x84\x21\x0c\xf3\xb6\x0f\x67\x78\x8c\x63\x9a\x99\xfa\x56\x36\x7a\x65\x1f\x05\x4e\x28\x9d\x05\xa0\xd1\xab\x08\x84\x28\xd2\xf7\x87\x65\x73\xc7\xde\x29\x9c\x3b\xd9\x69\xfa\x8e\x3b\x24\x54\xa5\x91\xbc\xc6\x64\xf1\x8d\x53\xa0\x87\x32\x49\x6e\x07\xbf\xc9\x7d\x0d\xf2\x9c\xb1\xa3\x1b\x8b\x4f\x8c\xe8\x24\x88\x1d\xdf\xd2\x6b\xdd\xb4\xb2\xba\x41\x5b\x1c\xb3\x10\x77\xe2\xfc\xdc\xde\x9c\xae\xc6\x12\x3f\xa4\xc8\x2f\xc1\xfb\x9f\xbc\xc1\xe2\xde\xe2\xbe\x52\x16\x3c\x8e\x78\x8f\xaa\xfa\x54\x1a\xfd\x6a\xbf\x2c\xe2\xfd\x7a\xd3\xaa\xc7\x66\x57\xcf\x83\xab\x1c\xcf\x48\xf6\x07\xaf\xeb\xf1\xb9\xda\x2a\x6d\xd9\x90\x72\x05\x99\xc5\xd1\xa6\x0d\xf9\x99\x63\x10\x2d\xf1\x3d\xba\xe4\x34\x96\x3a\xc5\xac\x1e\xe6\xc6\x03\x5b\x86\x4b\xd6\xd8\xea\x0b\x65\x65\x0b\xef\xc1\x4c\xae\x35\x5e\x5f\x46\xc0\xcb\xff\xf1\xdb\xdf\xfc\xe6\x37\x2b\x33\x15\xbf\xfd\xdc\xfe\x5f\xac\xe4\x87\x4e\x84\x9f\x83\x8a\x53\x73\x59\xcd\x37\x95\x6c\x15\x8b\x5a\x70\x62\x51\x9c\x0c\xf2\xa5\x15\x9c\x6c\xd3\xe1\xe3\x6c\x33\xbf\x54\xed\xdb\xf2\xdf\x15\x7c\xfc\xdc\x7d\x73\xec\x68\x9a\x9c\xf7\x1b\x28\x7f\xcc\xc6\x30\x89\x3a\x98\x44\x2d\xe6\xb9\xa5\x7c\xba\xdf\x6e\x46\xfb\x0e\xe2\x56\xca\x2b\x75\xd3\x5c\xde\xcf\x80\xe0\x91\x7f\x99\x0b\x4d\x67\x3b\xe8\x3c\xbf\xb7\xd2\x08\xa3\xbc\x5f\x65\xa7\xdf\x4e\x3f\x1d\x99\xc7\x7b\x76\xc4\x7e\x7b\x7d\x42\xb0\x4f\xf6\x93\xcb\x53\xd0\xd1\x89\x1a\xe6\x7f\x05\xb9\x3e\x9d\xc0\xc7\xdb\x9b\xed\x1c\xad\x0f\xc2\x69\x67\x22\x6f\x77\xf5\x7c\x48\xf0\x75\x83\xea\x91\x58\xdd\x48\x30\xf8\x25\x92\x41\x31\x6f\x67\xe4\x58\xe5\xad\xee\x84\x00\x4f\x19\x14\xc8\x36\x5c\x0c\x0c\xb3\xcf\xb1\x75\x5f\x70\x95\xe5\xb8\xf6\x6f\x33\xe6\x79\x43\xdd\x08\xa4\x45\x70\x56\xbb\xd0\x50\xc7\x1f\xe8\x89\xbb\x63\x42\x82\xe6\x21\x8b\xa5\x47\x3e\x39\x9d\x1c\xba\x0f\x1e\x88\xfb\x24\x48\x38\x11\x9c\xce\x11\x26\x85\x01\xba\x44\x4b\x9f\xfa\x02\x04\x33\x3d\x4b\x0b\x7b\xfd\x0d\xf6\xcd\xd5\x51\x9e\xd9\xfe\x06\xfb\x48\x67\x37\x2c\xcc\xd3\x8c\xae\xef\x71\x12\x31\xc6\xd2\x7f\xe3\xb2\xf4\xb9\xe1\x3b\x4c\x0f\x56\xe1\xc5\x6a\x5d\xe5\x2b\x4d\xd0\x48\x94\x21\x39\x63\xeb\x97\x26\x46\x18\xf5\xa3\x98\xeb\xa6\x70\x29\xe4\x71\x9f\x3c\x4c\x37\xbf\xed\xf7\x93\x06\x40\xa8\x74\xcc\xf7\x1e\x67\x83\x84\xe9\x5e\xa4\xbc\xb6\x2b\xb7\x75\x59\xf1\x89\x6b\xa3\x63\x73\xec\xea\xe6\x1d\x92\x39\x3f\x15\x80\x47\x86\x19\xaa\xd3\x53\xf1\xbd\xac\x2e\x99\x53\x0c\x1a\x57\xb8\x57\xa4\x04\x70\x24\xe0\xaa\x95\x9c\x2f\xa1\x8f\x23\xa6\xdd\x1f\xb8\x26\xc0\x45\xe4\x70\x3d\x43\xd0\x5f\xa6\x44\x7f\xbc\x9f\xc8\x96\xef\xf3\x84\x4f\xd9\x9b\x3d\x32\x6b\xb7\xd8\x88\xa1\xf7\x96\x1d\x9a\x84\xd8\x53\xb7\x6f\x42\x79\xb4\xe9\x98\x3d\x1a\xe7\x10\x93\x77\xd2\x60\xe0\x32\xc3\x6e\x30\x2c\x72\xe6\xc1\x03\xaa\xc2\x63\x2e\x1e\x3c\x48\x89\xcc\xef\xfb\x09\x7e\xc6\xae\xcd\xe3\xac\xa0\x75\x1f\x4c\xd1\x06\xe7\x50\x36\xb5\xfd\xc1\x98\x39\xe2\x18\xd9\xfd\xc5\xf1\x70\x52\xdc\x93\xa4\xa9\xd4\x01\x74\x11\x63\xfd\x88\x04\x21\x4a\xe4\xd2\x61\xc7\x1f\xb3\x89\xb4\x93\xfa\xc3\x09\xb0\xf3\x5d\x37\xea\x6f\x1b\x65\x10\x1f\x3a\x1b\x0f\x35\x18\x6e\xf8\x43\x67\xb5\x6f\x42\x01\xf1\x8f\xa7\x6f\x48\xd8\xbe\xad\xbf\x73\xb1\x6b\xc4\x1f\xf6\xaf\x63\x17\x75\xab\xff\x72\x1c\x24\x3e\xe4\xf5\xe3\x11\xbb\xda\xf7\xc4\xd8\xf7\x78\x02\x9e\x52\xd9\x60\xb4\x3c\xeb\x1e\xc4\x92\xb7\x9b\x99\x3d\x65\xad\x07\xeb\x07\x36\xcb\x68\x51\xb6\x62\x51\x42\x0e\x1d\x30\xc0\x7f\xf1\xf9\xac\x6c\x8d\x27\xf5\x2b\xe3\xb2\xdf\x8b\x87\x21\x23\x3e\x4e\xef\x80\x3c\xf8\x2b\x73\x12\x09\x03\xd9\xaa\xdd\x69\x81\x69\xa9\x51\xfe\x69\x5a\xd4\x9c\xa9\x77\x61\x5a\xcf\x32\x29\xea\x7b\xf8\xec\x5c\x36\xfb\x61\xbe\x84\x5b\xfe\x9c\xda\xd8\x7f\xfc\x24\x16\x65\x0d\xca\xa2\x1f\x3a\x0c\x7f\xe8\xa0\x77\x9c\xbd\xa7\x24\x30\x71\x77\x33\xe5\xc0\xdb\xfd\x88\xd3\xf3\x6a\xfe\x67\x21\x65\xde\x4c\xa1\x4e\x0e\xa9\xe5\xb6\x29\xdb\x16\x73\x5f\x94\x0b\xcc\xfc\x64\xd0\x2b\xb5\x2a\x17\x21\x6f\xd8\x3d\xc2\x4e\x44\xc7\x50\x33\x15\x2f\x92\x9c\x42\x92\xd2\x39\x3f\xdc\xac\xa7\xd4\xf3\x9f\xca\xfa\x52\x15\x0f\x1d\x1c\x29\x20\x65\xf0\xc4\xe8\x8e\x27\x2b\x12\xe2\x69\x0b\x54\xb2\xef\x7b\x48\x90\x4e\xf1\x15\xbe\x58\x37\x4f\xfa\x1b\x6f\x70\x4b\x3e\x59\x92\xfb\x1c\x81\x83\x32\x9d\xb3\xaf\x03\x14\x19\x62\xe1\x28\x9a\xfd\x69\x89\x25\x55\xda\xd1\x52\x9a\xef\x1c\x2c\x48\x27\xa0\x04\x43\x1e\x92\xaf\x51\x7a\x78\x17\x2c\xdf\x99\xfc\x37\xb2\x9d\xdb\xdd\x74\x22\x5f\x26\x45\xfc\xac\xaf\x88\xcf\x14\x4f\x29\xfa\x58\xda\x3c\x78\x3b\x17\x96\x5c\x29\x08\xd7\xb0\xfb\x56\x2b\x63\xcf\x01\x29\x41\xa8\x83\x57\xcf\xde\xbe\x7b\xf6\xf4\xfd\x77\xaf\x9f\x3e\x7e\xf7\xec\xfd\x9f\x5e\xbc\x7c\xf1\x8e\x29\x27\x70\x11\x6d\x35\xec\xfc\x09\xf8\x2d\x9f\x93\x92\xdb\x7e\xb5\x94\xf0\x8f\x6a\xd3\x94\xa6\x2d\xe7\xcf\x75\x13\x3d\x91\xbf\x75\x63\x64\x0f\x1c\x8b\x5f\x26\x7f\x14\x47\xb4\xd1\x6d\x1a\xa0\xe7\x25\xf2\x14\x8d\x9a\xab\xf2\x0a\xb2\xbf\xb0\x54\x06\x10\x5b\x70\x64\x00\x58\x5d\x47\x7e\xce\x60\xb7\x92\x00\x79\xe7\x03\x83\x65\x2b\x8c\x5e\x29\xb1\xd6\x65\xdd\x7a\xb4\x98\x4d\xbb\x69\xa0\x31\xf6\x0a\xec\x79\x83\x23\xb8\x8c\x74\x49\xbe\xca\x2d\xe4\x09\x0f\x9b\x4c\xb4\xbd\x2f\xe5\x87\x72\xb5\x59\x39\xb6\xbd\x50\xeb\x76\x29\xfe\x7f\xf2\xfe\x75\xbd\x8d\x1b\xd9\x17\x87\x3f\xbf\xba\x0a\x38\x93\x84\x52\xc2\x83\xe5\x24\x33\x13\x29\x4a\xb6\x22\xc9\x89\xd6\xb2\x25\xbf\x92\xec\xcc\x6c\x27\xdb\x02\xbb\x41\x12\x51\xb3\xc1\xd5\x68\x8a\x62\x26\xbe\xf7\xff\x83\xaa\xc2\xa9\x1b\x4d\xc9\x8e\xb3\x66\xaf\x67\xfb\x83\xc5\xc6\xf9\x58\x28\x14\xaa\x7e\x25\xee\x32\x40\x5c\xf5\x06\x75\xd6\x8a\x0e\xf5\xb1\x02\x7d\x84\x4a\x2c\x04\xaf\x45\x0e\xd2\xe0\xa2\x80\x1b\xf5\x25\x18\x1b\xd3\x59\x14\x7b\x02\x22\x95\x82\x2a\xf2\xdd\x43\x5e\x7b\x08\x3f\xb4\x90\x73\x89\x98\xc1\xac\x5c\xce\xc7\x08\x2b\x1c\xaf\x99\x70\x85\x45\xcb\x4b\x07\x32\x66\x7b\x68\x82\xca\x93\xe5\x0e\x2d\xc6\x0f\x4d\xb5\x87\x0e\xb0\xa6\xc7\x5e\xd3\x3e\x50\xf9\x5d\x18\x0e\xd3\xc2\x27\x47\x59\xad\x21\x31\x60\x8a\x36\xe8\x4b\xea\x0a\x75\x15\x16\x5f\x06\xfa\xfc\xb6\xd8\x7c\x08\x0d\xf6\xca\xad\x50\xba\x73\xb8\xf0\x40\xcb\x5e\xd3\xac\x04\xc5\x4b\xfa\xc7\x4b\x10\xce\x14\xb1\x0c\x2d\x8d\xa9\x55\x89\x3e\x47\xc9\x5a\x3c\x62\xab\xdc\x7b\x8b\x48\xe4\xb9\x3f\x45\xb2\xd4\x76\x47\xef\x13\x1f\x5d\xa5\x96\x82\x9b\x27\x44\x73\x33\x2b\xd5\x8a\xdf\x40\xa7\x07\xa4\x72\xb2\xcc\x2a\xc1\xb5\x17\x6a\x45\x4e\x3d\x5a\x73\xb8\x69\x8a\xc3\x19\xed\x2c\x21\xba\x6c\x36\xaf\x53\x5d\x15\x27\x05\x90\xe4\xe9\x0b\x3b\x34\x8c\xa7\xfb\x5d\x17\x61\x4b\xdb\x36\x38\x3f\xa3\x4d\x61\x55\xa9\x2a\x21\xca\xba\xe2\x65\xb6\x36\xb4\x80\x2a\x43\x99\xa1\x85\xae\x70\xc3\x1f\xe0\x24\x5b\xe4\x0c\x27\x65\xf4\x7a\xf7\x5e\x41\x06\x0e\xaf\x0d\xbe\x3b\xb0\x7d\x8d\x53\x30\x01\xf6\x03\xad\x89\xea\xc6\xd7\xc8\xb0\x78\xab\x5d\x3f\xee\x2a\x0d\xca\x1b\x0e\x87\xcb\xb2\x10\xe8\x71\xac\x72\xf4\x72\x89\xd9\x1c\xbf\xdc\x37\x67\x05\x42\x69\xc0\x73\x8e\xd3\xe0\x0e\xcb\x02\xcc\x42\x04\x67\x08\x94\x91\xe8\x76\x6a\x16\xc6\x79\x19\x80\x5c\x18\xce\xb1\x43\x8d\xa7\x49\x3c\x91\xd9\xfb\x41\xd4\xac\x92\xd0\x59\x93\x17\xe5\x3c\x3a\x70\x36\x27\xe7\xa4\x3f\x14\x8b\xe1\xdd\xea\x84\x1a\x5d\xf7\x83\x76\x6d\xe3\x8d\x28\xf0\xc6\x15\x48\xd1\x1f\x25\x78\xb2\xe0\x2c\x4b\x32\x6c\xa1\x15\x0a\x5c\x75\x2e\xf0\x3c\xb5\x69\x23\x8f\x4e\xfe\xa2\x76\x4c\x97\x14\x9b\x6c\x9b\xda\x08\x17\x8a\xc8\x45\x52\x93\xcf\x9f\xc8\x32\xff\x51\x4e\x67\x42\xd7\x2f\x68\xdf\xc0\x50\x87\x1c\xff\x2c\x8e\x27\xae\x24\xbc\x8b\x27\x52\x35\x99\xd4\x2e\xaa\x9e\x76\x58\x64\x19\xfa\x7b\x49\x7b\xa8\x56\x5c\xdd\x47\x2a\x49\x44\x58\xa5\xeb\xfd\x10\x74\xee\xa1\x94\x2e\x6d\xaf\x03\x0d\xf3\xa6\x9e\xe6\xea\x81\x02\x7b\x82\x10\x96\x81\x7c\xc8\xb1\x7b\x4d\xfb\x1d\x5c\xf3\x57\x01\xb4\x9f\x66\x95\xc8\x97\x39\xb7\x3e\x0c\x01\xc2\x18\xf4\x1c\xcb\x89\x7d\x01\x07\x2a\x60\x88\xd7\x2c\x2e\x0d\x6f\x47\xe0\x50\x1a\xf6\xae\xa8\x13\x47\x1a\xf9\x2b\xee\x33\x81\xef\x8e\x60\x7e\xb8\x12\xf8\x2e\x1a\x97\xe7\xda\x0f\xec\x74\x05\xca\xf3\xa0\x83\x19\x0a\xbb\x1e\x6d\xa7\xe7\x3f\xd4\x6f\xda\xb4\x92\xee\x33\xfb\xe7\xde\x1b\xa4\xf5\xd0\x8e\xb3\xfb\xe7\xf9\x9d\x0b\x40\x5b\xcc\x2a\x48\x33\x20\x09\x01\xa1\x95\xe2\x99\x21\x03\xf5\x70\x3c\xd1\x91\xff\x8e\x21\xee\xd9\x26\xc6\xa6\x2d\x66\x7b\x30\xeb\xd4\xce\xda\x78\xa7\x8f\x31\xc9\x6d\x17\xdb\xe5\xdf\xd3\x3d\xf4\xe6\xb9\xb9\x7f\x01\x88\x6a\xba\xab\x0f\xe8\x63\xe8\x9b\x04\xff\x3d\x8c\x05\x6b\xe7\x7b\xf0\x68\xa7\xc6\xa7\x55\xe9\x3d\xc3\xe3\x56\x69\xf7\xe8\xa4\x66\x2f\xb9\x93\xde\xa7\xfb\xdd\x64\xf5\x9d\x97\x5e\xd7\xfa\x89\xfb\x9f\x6c\x79\x27\xcb\x7d\xdf\x52\x78\xf8\x5c\x6d\xc5\x99\xba\xc6\x70\x53\x85\x89\xfe\x00\x38\x45\xea\x20\x8d\xb8\xdf\xae\x93\xe3\x9b\xd4\x21\x9c\x58\x30\x09\x36\xb8\x8f\x82\xac\x9e\xc6\x22\xaa\x28\x4b\xfa\x68\xbf\xf7\x90\x4b\x64\x4d\xde\x6d\xe2\xd1\x7c\xb7\xe5\xdf\x5e\x24\x5b\xf7\xac\x8d\x44\xf5\xd5\xc3\x16\x48\x52\x3d\xd2\x21\xef\x22\xc5\xb1\x57\x29\xa7\x24\xc0\x35\x8b\x1c\x0b\x23\x77\x5a\xbb\x27\x6e\xbc\xf4\xdb\xa2\x48\xf0\xc2\xae\xba\xa5\x4b\x7d\xbc\x79\xcd\xd1\x50\x42\xc4\x52\x03\x96\xa9\x65\x59\x0f\x5b\x62\xd8\x86\xd8\x2e\x16\xe4\x79\xe5\x92\x54\xf2\xf0\x38\x4d\x16\x77\x70\x90\x9a\x65\x3f\x51\x2d\x01\xce\xe7\x9f\xef\x77\xdc\x46\x11\x46\xcc\x49\xa6\x0c\x2b\x81\x2a\x6e\x20\x06\x1d\x76\x15\x88\x42\x32\x3f\x35\x6d\x41\x65\xa2\x81\xfb\xcd\xa4\x2d\x56\x2e\xb1\xec\xdb\x92\xff\x26\x0f\xbd\x9d\x3b\x66\x31\xbc\x02\xe0\xe6\xed\xb3\xbc\x48\x3c\x8a\x84\x09\xe7\xb2\x3c\x69\xbc\xd1\xfb\x12\x03\xd1\x66\x1e\x80\x51\xfc\xa7\x10\x0b\x07\xb4\xa6\x4a\x82\x57\x76\xf0\xa1\x2d\xbf\x1e\x80\x41\xe2\xd1\x45\x57\xe4\x61\xc3\x16\x17\x22\x8e\xe2\x98\x77\xf2\xff\x01\xd3\x2e\x4a\x3e\x2e\xc4\x4b\x0d\xae\x2d\x65\x39\x3d\x7c\x71\x6a\x96\x8c\x6b\x72\xb7\xe3\x79\x2b\x03\xee\x9e\x8b\x6f\xee\x51\xf9\x42\xf5\xb9\xe4\x2d\xc8\x55\x10\xcb\xcc\x02\xc0\xd4\xae\xc5\xde\xdd\x9c\x86\x8b\xc7\xd6\x94\x25\x90\x7c\x3b\xfa\x75\xc0\x5a\x99\x77\x40\x77\xa6\x25\x23\x4f\xde\x2c\xe9\xc6\xdb\xe8\x45\xbf\xbb\x46\x37\x5e\xe6\xae\x4f\x98\xa0\x48\xb8\x68\xb1\x7b\x41\x4f\x88\xf2\xbb\x61\xfe\x63\x52\x18\xe0\x0b\xc1\x75\xdd\x6b\x13\x9d\x48\x80\x2b\x31\x6b\x8d\x97\x21\x84\xad\xb3\x11\xb6\xde\xc6\x9d\x7b\x70\x44\x8a\x69\x7b\xa5\x29\xc4\x04\xad\xd5\x99\x5e\x4e\x26\x32\x93\xa0\xa7\xe1\xe4\x39\x01\x59\x8e\x84\x0e\xdc\xd7\xc0\x10\xad\x50\x82\x90\x15\x78\x7f\xe7\xa9\x8a\x40\xb5\x48\x39\xd1\x0b\x29\x01\x93\xab\x7b\x2d\xdf\xf3\xb2\x62\x29\x53\xec\x6b\xc7\xf7\x46\xdd\x8a\x2a\x34\xbc\x02\x85\x2b\xdb\xdc\x61\x20\x0b\xef\x5e\xae\xff\x57\x0a\x12\x9c\xe8\xb9\x10\xbc\x1c\x58\x4c\xa9\xd6\x0b\x4d\x18\x98\x7c\x15\xea\x24\xfa\x6e\x68\x5a\x6f\x46\x29\xdf\xc6\x5f\xb2\x83\xc6\xdb\x91\xed\x5a\xe7\x8b\x12\x30\x31\x9b\xde\xa3\xcc\x3f\xb4\xd7\xa2\x3a\xba\x84\x28\x5d\x92\xaa\x6e\x38\x56\xff\x12\x97\xba\xab\xb6\xca\xfb\xef\xc3\x65\xc5\x51\x8f\x5e\x0a\x63\x68\xd6\xf8\xa9\xc1\x30\x3a\xa0\x79\x07\x0b\x5e\x55\xf0\x6e\x3c\x6a\xc3\x89\x3b\xb9\xc4\x0b\xae\x75\x24\x78\x03\x4b\xe8\x6a\xba\x44\xae\x47\x05\x6f\x4e\xd6\xf5\xbd\xf9\xdd\x25\x9d\xfb\xa6\x5b\x65\x38\x21\xfd\x74\x2d\x0d\x05\xdb\xa1\x27\x71\xcb\x2a\x86\x61\xa1\x08\x3b\x4a\xdb\xe1\x71\x2b\x29\x77\xb7\x54\xc7\xb9\x11\xb4\xd6\xa6\x75\x43\x4a\xdd\x68\x4d\x7c\x39\xb9\x47\x8e\x9d\xa5\xfd\xb5\x77\x1b\x87\xde\x5f\x63\x73\x70\xee\x01\x1c\x8e\xc5\x60\xf7\x8e\x96\x3d\x58\x6e\x45\x40\x96\x1d\x1c\x24\x3b\x6a\x8f\xd1\x1f\x1e\x83\x77\xc2\x6c\x6f\xad\x95\x37\xef\xb2\x58\xde\xfc\x8f\x59\x2d\x6f\x3e\xd4\x72\x69\x8d\xcf\x3b\xad\x97\xfb\x07\xec\xbe\x05\xe3\x8c\x2d\xdd\x39\x64\xf8\x15\x44\xbb\x94\x73\xd1\x14\x6d\x4e\x10\xee\xc2\xea\xb4\x37\x21\x71\xba\x81\xf5\xa9\x84\x4b\xb0\x80\x07\x2a\x66\xce\x7a\xb7\x62\xdb\xde\xec\x3e\xc4\x7c\x24\xe7\xc4\x2d\x23\xc7\x4d\x05\xcd\x79\xce\x41\x5f\xdd\x81\xaf\xe9\x68\x65\xb5\xfc\xfa\xda\x71\xb1\x30\xcf\x6e\xd5\x31\x43\x5c\x9b\x08\x3b\x89\xc5\xf0\x26\xb5\x15\x58\x0c\xa6\x95\xba\x69\x77\x68\xa6\x58\x95\x9d\x9f\x66\xa2\x0c\x2f\x41\x7e\x6f\xf6\x49\x6f\x21\x53\x65\x26\x0b\x51\x31\xae\x6f\x74\xac\xcb\x80\x5a\x3c\xee\xcd\x69\x34\x62\x80\xa7\xcd\xc4\x9d\xc8\x96\xa8\x10\xf9\x54\x55\xec\xf8\xfc\x39\xc0\x0b\x49\x33\x3e\x74\x03\x97\x1a\x79\x51\xd2\x69\x38\xcd\x0b\x71\x14\x30\x6e\x5e\x57\x2a\x5c\x26\x81\x7e\x83\x67\x86\x5a\x4b\xd9\x59\xff\x36\xb8\xc8\x30\xdb\xd0\xcc\xa4\x7b\x48\xdc\xde\x61\xdf\x6e\x50\x13\xb9\xbf\xe8\x14\x17\xe6\xb9\x44\xeb\xbc\x90\x02\x62\x6d\xa9\x33\x55\x83\x06\xc5\xda\x42\xb2\x03\xf8\xac\x52\x37\xc3\x86\xd3\x82\x40\x61\xc4\x79\x10\x83\x72\x39\x16\x57\x2f\x17\x05\x58\xe5\x6d\x37\x41\x39\xfb\x0e\x9b\xd5\x42\x60\x86\x23\xdc\x44\xfe\x8c\x40\x32\x1f\x75\x32\xcf\x1b\x5f\x02\xc6\x22\x5a\x53\x7f\xe6\x03\xc0\x68\xc4\x5e\x96\xb1\x47\x5d\xd8\x90\x5a\x79\x57\x69\xc8\x40\x95\x0e\x7a\x3e\xbe\xe4\xdb\x62\x78\x89\xd8\x90\x5e\x8d\xa7\x25\x13\xd9\x40\x62\xc2\x27\x3b\x20\x70\x1b\x58\xeb\x14\x67\x1c\x5e\x2a\x5a\x6c\x75\x03\xae\x20\x5e\x41\xf6\x65\xda\x2e\x8b\x71\xb0\xd3\xfc\x6b\xb8\xdb\xb4\x85\xb8\x15\x45\x1f\x34\x4c\xf0\x8a\xb7\xe5\xc4\x17\x7e\xb3\x47\x7b\x30\x7e\x75\xde\x9e\x94\x7d\xc6\x53\x5a\x8b\xa7\x09\x55\xb1\xd6\xc3\x39\x8d\x50\x22\xa9\x1f\x81\xb4\xd6\x22\xef\x54\x5b\x4c\x95\xd6\xd9\xa8\x90\x8d\x78\xd4\xce\x89\x77\xc2\x84\x36\xc2\x3d\x8f\xd3\x2d\x7f\x28\xff\x7d\xf3\xd3\xd4\x0b\x08\x94\x4a\x93\xba\x0b\xd4\xc7\x0d\x5a\x08\x69\x9d\xbe\x70\x89\xc6\x88\x39\x2d\xd5\xd2\xd4\x2c\x75\x15\x1b\xdd\x09\x13\x56\x42\xb6\xd4\x0f\x35\xaa\x68\x39\x79\xef\xa8\x82\x24\xc6\x4c\x73\x87\x8e\xee\x9f\xb9\xda\x1b\x1a\xc2\x1f\x74\xdd\xdf\x7f\x45\x76\x3d\x0f\xaf\xc6\xe8\x10\xc0\xca\x84\x9a\x2e\x5f\x86\xec\xb4\x36\xdc\x34\x61\xa7\x51\x1e\x50\x09\x44\xd5\xbd\x80\x03\x77\x9a\x37\xa9\xd7\xdc\xcd\x0a\x20\x76\x15\xd0\x30\xe1\x38\xa4\x15\xbc\xf7\x3a\xc2\xfb\x61\x9e\xb6\x6d\xe9\x5e\x77\x14\xe6\x0c\xf5\xf7\xf7\xa2\x2f\x8c\x8f\xb7\xe2\x5e\xe3\x1b\xd3\x34\x37\xec\x5e\x5b\xb5\x07\x05\xc8\x76\x22\xf6\xfc\xcf\x3e\x31\x1c\x91\xe6\xfc\x5e\x33\x60\x0b\xe0\x11\xde\xee\x6f\x6d\xfd\x6b\xcb\x89\x8c\x7f\xb2\x16\x13\x67\x81\x54\x28\xd8\x81\x6f\xb7\xb6\x46\x23\xf6\xd8\xcc\xd5\x8b\x8b\xf3\xe3\x3e\xdb\x35\x3f\x8f\x4f\x5e\x0d\x4d\xf8\x73\xd4\x27\xc8\x73\x13\xf9\xf4\xf4\xd9\x89\xe5\x5c\xb7\xb6\xdc\x9e\x99\x3a\xbf\x24\x4f\x55\x75\x89\xe8\x85\xdb\x68\x12\xd6\xb0\xe4\x00\xea\x9b\x8c\xf1\xd6\x81\xf3\x45\xbd\x3e\x1f\xff\x2a\x32\xef\xfe\x11\x85\x0a\x88\x05\x32\x15\x75\xab\x6c\xab\x11\x6c\xc3\xad\x12\xfb\x44\x96\x39\x49\x30\x5e\x96\x73\xae\x6f\x84\x85\x14\x08\x8c\x45\xa8\x5e\xa9\x9b\x36\xfe\x64\xc0\xf1\x1d\x5b\x54\x2a\x13\x5a\x1f\xcd\x64\x11\xe7\xef\xc7\x35\x9a\x75\x1d\x05\xc0\xe0\x9a\x86\x79\xef\x9e\x17\x8e\xec\x7c\xbc\x6b\x5a\x68\xc7\x70\x3b\x53\xe5\x44\xd2\xc1\x63\xb2\x4c\x45\xfd\x62\x39\x2e\x64\x76\xea\xad\xfe\x30\xcd\xb0\x15\xe5\x94\x9e\xdf\xf8\x8a\x2e\x9d\xf2\xf2\x01\x4b\x84\xda\xfa\x2c\x26\x54\x7a\xdb\x98\x1b\x48\x22\xf3\x70\xd3\x26\xdb\xb0\xcd\xee\x29\xae\x6b\xf3\xc5\xdb\xaf\xab\x90\xf6\xa6\x6c\x6e\xcb\xae\x9c\xa9\x4d\xd8\xde\xae\x5d\xb9\xd3\x9b\x38\xd8\xc6\x5d\x19\x1b\x9b\xbb\xb5\xbd\xbb\xf2\x35\x92\xed\x27\x6d\x91\xae\xd4\xe2\x99\x39\xfc\xc8\x1c\xd5\xb9\xea\x11\x78\x56\xf6\x9d\xc0\xdc\x6e\xbf\xd0\x50\xb5\x03\xb8\x1e\x6d\xbc\x01\xa5\x1a\xa9\x79\xcf\x39\xba\x6d\x27\xb6\x12\xc9\x48\xec\xde\x49\x8e\x1a\x5e\x76\x3a\x69\x56\x8c\x29\xbd\xe2\x15\x5c\xe4\xec\x11\x86\x07\x1c\x1d\x4e\x3a\xe0\x11\x38\x5b\x2c\x2b\x11\xdc\x7e\x00\xa8\x73\xa1\xad\xef\xa5\x5a\xec\xb3\x1e\xfb\x9c\xf5\xc8\x39\x99\x39\x23\xe9\xad\xd8\x6b\xb6\x5b\x5d\x73\x38\x13\xc9\xec\xdd\x29\x6d\x17\x6a\x25\xf2\x21\x16\x72\x3a\xf1\xe0\x6e\x7d\xeb\xef\xac\xa9\xb1\x2e\xcb\x94\xca\xfb\xcf\xe5\xcf\x25\x94\xe1\x05\x2f\x55\xd8\x29\xd3\xf2\x4f\xf4\xb0\xd7\x6f\x03\x7c\x6e\x9e\x07\x40\xb7\xea\xbd\x2c\x6f\x4a\xb5\x2a\x7b\x69\x2b\x60\xbb\x24\x00\x4b\xc6\xfe\x3c\x38\x60\xcb\x32\x17\x13\x59\x8a\x9c\x7d\x87\x53\xb9\xe7\xe2\xf7\xa3\xb5\x63\xe7\x23\xca\x0d\x39\x7e\xff\x9d\x11\xfe\x79\x14\xe7\xd1\xce\x9d\xd3\xb4\xed\xe1\x70\xb8\xb3\xc7\x4e\xee\x16\x22\xb3\xb2\x28\x50\xd4\x51\x60\x6c\xc9\x0b\x76\x6d\x8b\xb8\x8e\xc4\xdc\x30\xcd\x30\x76\xb6\xd0\x21\x33\x04\x52\xf0\xdc\xda\x6b\xe4\x7b\x34\x78\x6e\xf1\x47\x6f\x2f\xf7\x62\x4a\xc4\xc2\x7a\xb0\x28\x1d\x00\x8b\x69\xb7\x55\x64\x3a\xbf\xaa\xf8\x62\x21\x02\xcb\x86\x21\x81\x2e\xdb\xb2\x6a\x40\x35\x0f\x4c\x18\xbc\xdd\x34\x3d\x02\x84\x30\xfc\x63\x59\xb3\x95\x90\x55\x0e\x1a\x87\x84\x2c\xec\x6e\xb1\x08\x6b\xca\xb4\x58\xf0\x8a\xd7\x82\x5d\xe3\x68\x02\x85\xbe\x66\x87\x2f\x4e\xfd\xc3\x18\x3e\x3e\x43\x0c\x1d\xd6\xf4\xfc\x6c\x3b\xf1\xc8\xef\x58\x0a\x1a\x02\xf6\x4f\x47\xf8\x70\x51\xa9\x5a\x3d\x2c\xc5\x70\x69\x8e\xac\x71\x21\xde\x48\x0d\x2d\x40\x8f\x1a\x6e\x8f\x01\x58\x4c\xb5\x0c\x5e\x70\xdf\x11\x71\xa0\x21\xce\xeb\xca\x9d\x80\x17\xb1\x1b\xa5\xb5\x24\x48\x5b\xe4\xa0\xa3\xd0\xbd\x26\x4e\x80\xe5\x69\x79\x55\x4b\x5e\x80\xed\xcb\x1e\xfb\x97\x1d\x90\x3d\x37\xcc\x6f\xdd\x79\x49\xab\x71\xaf\xf1\xac\x8b\x62\xbc\x45\xc1\x33\xb1\x87\xdc\x9a\x0f\x7f\xaa\xaa\xcc\xac\xe7\x28\xb8\x14\x77\xee\x39\x32\xc6\x68\x35\x31\x18\x82\xbd\xa3\x1b\x4a\xa9\x45\x45\x96\xb4\xa7\x65\xad\xa2\x81\xe8\x53\xc7\x69\x40\x22\x54\x06\x7f\x9c\xdc\xe7\x50\x11\x5e\xc3\x95\xae\x2d\xab\xd2\x46\x71\x99\x29\x5d\x5b\xee\x20\x60\xd8\x7e\xb4\xc1\x91\x5d\x2f\xbc\x5e\xfa\x0c\x5d\x52\x40\x2f\x43\x8f\xee\x94\x2e\x67\x6c\x9e\x9e\xb8\x5c\x80\xdf\x3b\x87\x85\xb4\x17\xf3\x69\x18\x78\x5a\x4e\x54\x9f\xcd\xd6\xb9\xd9\x6f\xad\x16\x60\x09\xc8\xf2\x29\x55\x77\x65\xa3\x46\xd2\x05\x81\x1e\x6c\x13\xb5\xfa\x63\xdb\x3b\x3f\x69\x70\xc1\xed\x23\x3d\x44\x1f\x9d\xb4\xd4\xa8\x62\x3f\x2a\xe0\xd7\xbf\xec\xd5\x6c\x9c\x76\x1f\xe6\xfd\xdc\xb8\x6c\xf6\x68\x71\x80\x6c\x31\x68\xc0\x3b\x3a\xc0\xb7\xd9\xda\x3e\x84\xd2\x10\x68\x0f\x77\x99\xff\x5c\x2d\xcb\x00\xd7\xca\xb5\x3f\xf5\x0c\x00\xf4\x91\xf6\xe7\x1f\xad\x97\x2c\xd3\x1f\x58\xf3\x7b\xd6\x11\x2f\x99\xae\x2a\x12\x8f\x05\xe1\xdc\xba\x0b\xd3\x83\x6e\x72\xa1\x28\x2d\x58\x0c\xb6\x90\x14\x2a\x76\x3b\x95\xad\xb4\xf3\x69\xcc\xe7\x21\xcf\xa3\x47\x9d\x59\xb7\x1a\xb7\x84\x87\xf3\xbe\x6e\xfb\x6d\x3d\xe8\x16\xff\xe0\x6b\xfc\x83\x6e\xeb\x94\x2c\x7d\xdd\x87\x28\x77\xd1\x33\x24\xc4\x52\xd0\x24\x31\x8a\x15\x38\x5c\xb0\xa5\xab\x89\x3d\xeb\xe7\xf0\x51\x9c\x7c\x08\xfe\x83\x77\xda\x72\xbe\xf0\x61\xd2\xae\x23\x8b\xaa\x97\x2a\x22\x89\xb2\xd7\x89\x89\x47\x95\xb4\xee\xb6\xe9\xa2\x1d\xfd\x0e\xd6\x79\x0b\xca\x30\x40\x29\xdb\x54\x44\x83\x17\xb6\x8b\xa1\x79\x72\xed\xb5\x42\xfa\xe9\x84\x3f\xc9\x7a\x76\xa6\x10\x61\x4f\x87\xb3\x15\x1d\x7d\x0f\x3b\xfc\xa2\xb2\x1a\x08\x17\xf7\x9d\x85\x1b\x27\x6e\xf3\x89\xe8\x8e\x24\x59\xfe\x2a\xb2\xda\xf0\x06\xc7\xe2\xd6\xd0\x9c\xa8\x43\x39\x85\x1d\x05\xb2\x0b\xe6\x95\x40\x72\x28\xf9\xfb\x75\x38\x38\xec\x80\xc5\xb9\x86\x1d\x09\xdd\xa9\x62\xe5\x33\xb6\x25\x80\x8f\xa5\xb7\xdf\x70\xad\xe5\xb4\xdc\xfe\xd7\xdb\x7e\xa3\xc4\x7e\x64\xcd\x1a\xcf\xcd\xf7\x6b\x92\xf7\x75\xce\x4a\x50\x65\x07\xef\x12\x28\x3e\xf4\xa3\x8a\x12\xbd\x08\x2b\x72\x10\x4c\xad\x33\xef\x51\x47\xee\xc4\x03\x39\xca\xe3\x48\xe0\x1a\x8a\xbe\xc9\xe2\xa8\xed\x59\xab\x63\x21\xb0\x24\x22\x4a\x57\x3f\xda\xf8\x51\xc1\x59\xb2\x13\x0a\x6a\x51\xfe\xd8\x29\xf4\x7a\xc2\x0e\x18\x4a\xf7\x86\x93\x4a\x88\xdf\xc4\xf6\xbf\xb6\xfe\x7f\x76\xe7\x76\xc8\xc9\xb6\xde\xee\x6c\x2a\xf2\x0b\x76\xc0\xb6\xbb\x6a\xb3\x02\x8a\xb6\xf0\x0d\x6e\xc4\xe9\x5c\xfb\x20\x12\x45\xce\x69\xbc\x04\x28\x59\xb0\xf0\x32\x37\x18\x7a\xc1\x46\xd4\xab\xec\x86\x4f\xc5\x70\x6b\x2b\x48\x9f\x8b\x0c\x5c\x9e\x94\xcd\x1b\xe2\xdd\x42\x55\x35\x9b\xa8\x6a\x0e\x82\x55\x7b\xb1\x9b\xf1\xec\x66\x0d\x57\xba\x39\xbf\x11\x9a\xc9\xda\x1a\xb8\xd6\x33\x36\x56\xf5\x8c\x5d\xa8\xa2\x58\x2e\x40\x54\xf1\x1f\x42\xd7\xc3\x2d\x34\xaa\xe3\x59\xed\xdb\x1c\x09\xf9\xc2\xb1\x79\xdd\xa3\xc1\xed\xfd\xc2\xbe\x7b\x40\x9a\x8e\x39\xf8\x22\x1c\x12\xcb\x49\x5a\x0f\x7e\xd6\xad\x92\xac\x0d\xf9\xd6\x66\x59\xaa\xca\xac\x49\x82\x09\x1c\x2f\x0d\xbd\x0d\x66\xf0\x15\x79\xb8\x3f\x60\xbd\xdd\xbf\x0e\x77\x87\xbb\x3d\x2c\x9e\x5b\xc5\x80\xc3\x52\xce\xf1\x76\x56\xf1\xb9\xe8\x03\x56\xb8\x05\x1c\x04\x6d\x0c\xeb\x19\x11\xb1\x9e\xc8\xe6\x76\x82\x89\xeb\x99\x28\x4d\x69\xa1\xf3\x02\xb6\x50\xba\x7e\x2e\xb4\xe6\x53\x41\xc6\xb3\xd0\xd4\xc0\x7c\x18\xdc\x16\x2c\xb8\x34\xf7\xf4\x9f\x10\x66\xb3\x9e\x89\x2d\x44\xdd\x77\x79\xf1\x89\xb6\x62\xb9\x32\x97\xf4\xf9\x32\xb3\x16\xc0\xda\x83\xf3\xd3\x3b\xb3\x69\xe7\xe7\xd8\x28\x86\x2e\x65\x46\x23\xf6\xfd\xda\xde\xd1\x6d\x7f\xa4\x59\x5e\x00\x0e\x21\xcb\x5a\x85\x77\x78\xb4\x69\xa8\x65\x76\x03\x5e\x29\x4b\x8d\x3e\x50\x78\x6d\x0a\x2a\xf8\x5a\x2d\xeb\x3e\xb6\x18\x3d\x16\xc2\x3b\xf6\xb8\x52\x2b\x2d\x2a\xf2\x67\xa8\xd1\xc8\xc1\xf4\x6f\xca\xcd\x1e\x46\xe0\xf4\x5b\x2e\x0b\xf0\x61\x83\xa8\x6b\xe4\x33\xc7\x37\xd5\x64\xcc\xd7\x25\x9f\xcb\x0c\x9e\x9e\x78\xfe\xeb\xd2\xdc\x19\x86\xf8\xb2\x60\x68\xd6\x89\xd5\xf6\x38\x29\x6f\x65\xa5\x4a\xb8\xec\x67\xbc\x7c\xa9\xc5\xf1\xf9\x73\xb3\xef\x48\xe0\x93\x9c\x52\x10\x0b\xb6\x7d\xdd\xb5\x05\x7a\x3c\xab\x59\x2e\x0c\x0b\xa8\x99\x07\xc3\x88\x0b\x1b\xb2\xe7\xfc\x46\x30\x37\x3c\x6c\xad\x96\xac\x50\x3c\xb7\x02\xa1\x85\x2a\xd6\x13\x09\x23\xcc\x54\x91\xfb\x51\xd2\x43\x36\xab\xeb\xc5\xde\x68\x34\x19\x0f\xe7\x62\x04\xbb\x6a\x60\x93\xeb\x1e\x5d\x68\x49\x8a\x3f\xe3\xfa\x8c\xd7\xf2\x56\xbc\xf0\x28\x5f\x67\x6a\xc5\x0e\x6c\x57\x43\xf4\x2f\x10\x6f\x29\xa0\x74\xbd\x60\x34\x82\x24\xc3\xd2\xe4\x8d\xc6\x81\xc8\x1c\x44\x38\xc9\x13\x69\xec\xa6\xaa\xc6\x71\xc3\xe4\xfe\xa0\x69\xbc\xa8\x34\xaa\xa4\x67\xd5\xfd\xad\x80\xe5\xbe\xa7\x84\x63\xb3\x7a\xa3\xac\x01\x35\x08\x14\xa5\x56\x7c\x8d\x48\x27\x65\x26\x8a\xbe\xa3\x0b\xc8\xa0\xe4\x4a\x68\x74\x3b\x3e\x27\x12\x76\x7a\x14\xf4\x12\xba\xf9\x68\xf3\xaa\xc2\x66\x61\xbe\xe0\x00\x37\x6b\xe0\xa8\x71\xf7\xd5\x02\x94\x56\xd5\xb2\xde\x6e\x77\x8b\xb1\x28\xcf\xb6\x3f\x65\x23\x05\xa1\xbd\xc4\x88\x44\x87\xe5\x29\xda\x1a\xad\x53\x67\x22\x1d\x89\x31\x42\xd6\xe3\x78\xe8\x03\xb7\x90\x09\x8d\xa8\xe4\x1e\x19\x8d\xd8\x0b\xbb\x9a\x93\x5a\x54\xf4\x12\xe4\x08\xdb\xc5\xe9\xd1\x91\x97\xeb\x36\x40\x7e\x4c\xd6\x0d\xe8\x46\xf1\x36\x4b\x24\xb4\x6f\x73\x26\xfa\xd8\x2b\xaa\x43\x37\xd1\x99\x17\x11\xe8\x65\xcd\xb8\xd6\xcb\x39\x12\x3d\x5e\x83\x6d\xc3\xb2\x64\xbc\x66\x5f\x3c\x9e\x2c\xb4\xf5\xe6\x8e\xa7\xe6\xcc\x2a\x64\x39\x0c\xbd\x2d\xf2\x59\x52\x14\x44\x8b\xf0\x10\xba\xe5\xc5\x12\xe0\x85\x38\x9b\x70\x6d\x08\xb8\x29\x4b\x4e\x4c\xf1\x53\x41\x5e\xb9\x27\x15\xf9\x59\xe3\xb6\x3b\x5b\x64\x38\xcd\xe7\xe8\x7b\x2c\xb2\xfe\x32\xa1\x24\x2c\xfc\xe2\x0b\x3b\x16\x3c\x33\x9b\xaf\x19\x97\xea\xbe\x7f\xba\xbc\x77\xdf\xb2\x54\xce\x40\xce\xf8\xa0\xc5\x88\xc3\x0c\x83\x4b\xd4\x0f\xbb\x6f\xcd\xb2\x43\x40\x42\x39\x07\xcf\x3c\x56\x4b\xe2\xf0\xa9\xbb\x09\x87\xc5\xc1\xc1\x98\xca\x09\xa3\x3d\x04\xdd\x35\xa0\xb5\xa1\xca\x7a\xb1\xe2\x6b\x0d\xa2\xdb\x61\xf3\xfa\x11\xaf\x8e\x41\x9a\x1e\xf9\xcd\x03\xb2\xc9\x48\x1c\xf0\x61\x46\xe9\xa9\xdd\x05\xb5\x0a\x08\xda\x7d\x8d\x8d\x49\x5f\xb3\x95\x5b\x6e\x9d\x5b\xb7\xfb\x21\xaf\x50\x57\x12\xab\x43\x67\x4a\x70\xd0\xc3\xb1\xdc\x74\x94\x54\x09\xe4\x3b\x68\x3d\xcd\x31\xff\x7f\x8a\xb5\xe1\x90\xde\xbc\x81\x53\x29\xdc\xe5\x1f\x9b\x53\xed\x39\xaf\x67\xc3\x8a\x97\xb9\x9a\x6f\xef\x0c\x6b\x75\x59\x1b\x16\x69\xfb\x8b\xbf\xee\x0c\x75\x21\x33\xb1\xfd\xc4\xbd\x8b\x9b\x9a\xaf\x24\x10\x80\x40\xa4\x78\x1b\x3c\xbe\x83\xdc\xcb\x04\x0c\xb5\x5a\x56\x19\x9e\xcf\x2b\x59\xe6\x6a\x05\x10\x32\x10\x95\xf3\x9a\x43\x84\x6f\x60\x53\xee\x19\x69\x5e\x76\x93\x17\xeb\xea\xc4\xd1\xa5\x14\xb9\x8a\xe5\xce\x49\x42\xc6\x9c\x17\x92\x80\x64\x36\xdd\xa1\x10\x91\x4f\xac\xa2\xf8\xde\x82\xe0\x50\xb0\x91\xb4\x23\x52\xb8\x8d\xf2\xfc\xc4\x8c\xc0\x33\xa9\x6b\x51\x9a\xa9\x24\x33\x2c\x11\x9c\x52\xf6\x6a\x26\x04\x69\xc5\x6a\x35\x17\x16\x10\xaf\x06\xda\xa4\x2a\xc3\x7e\xb0\xd3\x13\x33\xd3\x38\xba\xc3\x66\xd9\xdb\x3d\x1a\xdd\x5e\xdf\xcd\x9b\x87\x2e\xb6\xe4\xc8\x52\xb2\xd6\xac\x56\x7c\x12\x81\x82\xdd\x4f\xc3\x59\x00\x02\x10\x12\x38\x2a\x89\x0d\x1a\x7b\xe2\xf3\x26\x31\xf4\xd3\x10\x17\xf1\x4d\x8b\x6a\x86\x56\xb1\xdd\xc9\x62\x88\xf4\x66\x99\x7f\x6f\x6c\xeb\x63\x31\x11\xa5\x96\xa0\xbf\x9e\xcb\x72\x0a\x1a\xfe\xa8\x00\xaa\x97\x0b\xb8\x73\xa1\x95\x76\xc0\xde\xc2\xf4\x96\x6c\xf7\xc9\xe3\xd9\x6f\x91\xab\xae\x53\x77\x72\x14\x6a\x85\xb4\xb2\x84\xa5\xd0\x67\xe8\xc8\x6c\x51\xa9\x31\x1f\x17\xa4\xb6\xea\xf3\x36\x07\xef\xef\x4d\x79\x0b\x16\x0e\xb6\x7e\xd0\x8c\xa9\x12\x1a\x50\x49\xfa\xfe\xd8\x03\xdb\x42\x93\x84\xfc\xd1\xea\x99\x69\x3d\x30\x54\x75\x36\x63\xcb\xc5\x30\x2a\xac\x5e\x29\x3a\xc3\xc0\xa3\x3a\xa6\x96\xa8\x78\xbb\x72\xc5\x72\x70\x86\x58\x32\x59\xe6\x92\x9c\x2e\xd2\xda\xf6\x85\x39\x9f\x64\x74\x68\xb4\x06\x0c\x07\x62\x85\xf9\x62\x4f\xc6\x6a\x51\xcb\xb9\xfc\x2d\x50\xf6\xa7\x13\x09\x8f\x69\xb5\xac\x82\xe3\x3c\xba\x53\x64\x99\xaa\xcc\x8c\x15\x6b\x54\x18\x17\x77\x7c\xbe\x28\x44\x1f\x0f\xb0\x5e\x15\x34\xb0\x5a\x96\x25\xa9\x15\xc3\xa4\xb1\x5c\xea\x45\xc1\xd7\x4c\x55\xec\x6b\xf3\xfd\xea\xc2\x06\x85\x8e\x3b\xcd\xad\xc0\x0c\xec\x9c\xdf\xd9\x3b\xa2\x19\x34\x59\xa2\x2c\xd2\x0c\x35\x06\xcf\x41\xe7\x8d\x97\x8c\x97\x6a\xce\x8b\x35\xcb\x81\xad\xf0\x45\xcd\x25\x38\xd2\xc7\x11\xb1\x7a\xdf\xce\xc8\xba\xcd\x1d\x34\x57\x6d\x7b\xd9\x7f\x97\x08\xdb\x8b\xf3\x25\x5f\x34\x53\x7c\x4a\x2a\x57\xfb\xe4\x0c\xf6\xf4\x86\x3d\xfc\xa8\x41\xb6\x43\xf5\xd0\x26\x3d\x0f\xb5\x31\x88\x9c\x05\xe7\xdf\xb6\x3f\x26\xfa\xac\xf7\x59\x2f\xa6\xb6\x09\x46\xbe\xf9\x7e\x65\xa5\x24\xbc\x41\x93\xd1\x35\xbf\x55\xfe\xc6\x0d\x43\xf4\x9f\xd7\x8c\xe3\xcd\xdb\x5e\x3e\x70\x07\xd8\xf2\x66\x6a\x45\xd7\x91\xa5\x06\x61\xcb\x70\xd3\x21\x13\x6b\x39\xd0\xe8\x74\x10\xd4\xa6\xeb\x3a\xc3\x5d\xe5\x32\x87\x1b\x4f\x03\x2a\xce\x34\x19\x4c\x23\xac\x0b\xbb\xc0\x96\x15\x66\x6c\xd8\xf5\x7c\x07\x85\xd2\x3d\x6a\xce\x6b\x51\x49\x5e\xc8\xdf\xc2\xce\x0a\x27\x00\xa8\x67\x95\xaa\xeb\x42\xe8\x7e\xb4\xd7\xd1\xbb\xee\x8a\xa3\xd2\x04\x7a\x9c\x44\xcf\x11\xee\xc6\xe4\x54\x56\xcc\x04\x81\x5b\x55\x33\x08\x88\x6a\x89\x52\x08\x5f\x9c\x9d\x13\xf0\xdf\xdc\x74\x8b\xe0\x16\x4e\xf7\x21\x14\x2e\xa1\xe4\xe5\x7e\x3b\x3a\xeb\x76\x12\xaf\xba\x8f\xdb\xf7\x59\x5c\x59\x89\xfb\x11\x5e\x5d\x3f\xfb\x6c\x8b\x7d\x66\x68\xce\x8d\x55\x71\x9d\x8c\x7f\xd5\x23\x92\x3e\xec\x99\xc8\x59\x5d\x2f\xf4\xde\x68\x34\x95\xf5\x6c\x39\x1e\x66\x6a\x3e\x9a\xf0\x4c\x8c\x95\xba\x19\x41\xe2\x71\xa1\xc6\x23\xf1\xd7\xbf\x8e\xf9\x93\xc7\x3c\xff\x6a\x2c\xbe\xfc\xe2\x0b\x31\xfe\xea\xcb\x2f\x9f\x7c\x31\x79\x32\x7e\xfc\xf5\xdf\xf2\xbf\x3f\xf9\xfa\x8b\x27\x5f\xe6\x5f\xe7\xe2\xaf\x23\x12\x15\x6a\xcc\xab\xab\x6c\xf4\xe6\xcd\x44\x55\x37\xfa\xcd\x1b\x5b\xed\xf0\x57\xbd\xc5\xa0\x61\xe7\x66\x7d\x67\x33\x5e\x4e\x41\x10\xb3\x42\xee\xd2\xfa\xf4\x34\xc9\xc1\x15\x80\xe0\xa0\x0e\x14\xf9\xfa\xec\x9b\xfc\xbc\xcc\x59\xae\x58\xa9\x90\xfb\x00\x7d\xdc\x1e\x25\xeb\x59\x95\x25\x3a\x1c\x01\x92\xf0\x33\x32\x9a\x13\x40\x98\xb5\x9c\x2f\x0a\x39\x91\x42\x93\xab\x91\x5c\x40\x9a\xc1\x60\x60\xfe\x5c\xca\xb9\x2c\x38\x40\x9a\x3a\x25\x62\xb8\xbe\xc1\xb6\x2c\xd4\xd4\x2c\x18\xea\x93\x55\x94\xc9\x54\x99\xcb\x1a\x9d\x06\x42\xed\x73\x51\xfb\x7a\xe9\xb8\x03\x8b\x90\x5a\x99\x22\xd0\xec\x03\x94\xa4\x72\x71\x2b\x0a\xb5\x80\x17\xd9\x80\xdd\x42\x05\xaa\x4a\xd6\xe6\x34\x31\x25\x2d\x78\x3d\xd3\x84\xeb\x65\x45\x6b\x85\x9a\x4e\xcd\x6f\xd3\x05\x84\x67\xaf\x54\xbe\x44\x6a\x13\x95\x05\x17\x4b\x58\xc2\x80\x44\xfc\x19\xc2\x91\x14\x6a\x2a\x11\xdb\x0e\x91\x87\x3d\x50\x09\x14\x88\x35\x6e\xb1\xcf\x46\x28\xb5\x29\xd4\xca\xc1\x5f\x50\xf7\x1b\x32\x95\x50\x33\x77\x51\xc9\xb2\x4e\xa5\x83\xbb\x91\x63\xcc\x4d\xab\xb7\x41\xb5\xb3\x10\x25\x3b\x70\x1a\x4f\x7a\x58\x88\x72\x5a\xcf\xfa\x26\x44\xb3\x03\x76\x58\x55\x7c\xbd\x0d\xa9\xbe\x65\xbb\xec\x3b\xcc\x30\x60\xbb\x6c\x8f\x3d\xde\xe9\xb3\x37\x37\x70\x9d\xd8\xdd\xc7\x5f\xdf\x40\x3c\x7e\x7c\xfe\xb9\x27\x5e\xa6\xb4\xd7\x90\x62\xc0\x76\x7f\x09\x2b\x84\xd0\x5f\x5a\xda\x31\xbc\x9a\x9e\x96\xb9\xb8\xf3\xb8\x22\xc1\x15\xc6\xdc\x5f\xa8\x8f\x7b\x20\x8a\xc3\xce\x0d\x2b\xd4\x6a\xd9\x1e\x7d\xa2\x47\xd3\x7e\xf2\xce\x66\xcd\x9c\x4c\x7b\x6c\x1d\x9f\x7f\xfe\x4b\x2c\x56\x09\x04\x28\xb4\xbe\x51\x68\xe2\x34\xd6\x7a\xc1\x45\x20\xd8\x3f\xf6\x68\x8a\xc8\x49\xa8\x91\x3f\x1a\x99\xe5\xce\x7e\x12\x45\xa6\xe6\x02\xef\x70\xe3\x25\xae\x26\x14\x4a\xc2\x6e\x60\xe1\x31\x85\x36\x4e\x2b\x00\xb1\xa9\xd4\xaa\x44\xd2\x99\xa9\xf2\x56\x94\x52\x98\x6b\xb4\x56\x5e\x3e\x69\x16\xbd\xf3\x5f\xad\x03\x17\x77\xe8\x1c\x6a\x62\x01\x27\x00\x44\x57\xd6\xc2\x7a\xc2\xc6\x5d\x02\xfa\x1a\xb4\x78\x20\x75\xe5\x0e\x0d\xb4\xaf\x2f\xc5\x8a\xa1\x65\x57\xa3\xab\xd6\x7d\xf1\x9d\x59\x8f\xee\x28\xbe\x67\xed\xba\xfd\xdb\x67\xf1\xf2\x04\xa3\x64\x08\x89\x35\x05\xfd\xb0\x37\x9b\xd3\xbb\x76\x5a\x82\xcd\x42\xfb\x6c\x38\x1c\x9a\x09\xdf\xb9\x06\xda\x2d\x2b\x11\xd2\x12\x10\xe5\xda\x85\x65\x97\x65\x6f\xa7\x69\xec\xf7\xc8\x95\x1b\x88\xfb\xc2\x5d\xf4\xe4\x61\xdb\xe8\x09\xfb\x96\x3d\xa1\x7d\xf4\x84\x0d\xd8\x93\x60\x23\x99\x22\x9e\xec\xd3\x4f\xdc\x4a\xf6\x33\xdc\x4c\xc1\x76\x82\x12\xda\xfb\xe9\xc9\x2f\x2d\x2d\x86\x90\x30\x0c\xf9\x62\x51\xac\xb7\xdd\xb0\xf6\xd9\x6b\x1c\xaa\x5f\x86\x99\x2a\x33\x5e\x6f\xc3\x70\x35\xde\xdf\xba\xc8\x11\x68\x9c\xb7\x83\xf1\xed\x45\xea\xc3\xba\xae\xe4\x78\x59\x8b\x33\x73\x46\xf3\x89\xd8\xde\x81\x07\x04\xc7\xea\xe7\xcb\x45\x61\xee\x10\x22\x37\xc4\xf7\xf8\xfc\xf9\x73\x5e\xdd\x2c\x17\xe7\x0b\x81\x2a\x60\x7a\xe8\xa5\xc2\x00\x98\xc2\xed\xcd\x17\x76\x3b\x3d\xda\x48\x8d\xe2\xdf\x57\x87\xcf\x4e\x8f\xdf\x1c\x5e\x5d\x5d\x9c\x7e\xff\xf2\xea\xe4\xcd\xd9\xe1\xf3\x93\x37\x17\x27\x3f\x9c\xfc\x83\xbc\x37\x5f\x88\xe9\xc9\xdd\x62\xbb\xf7\x7f\x5e\x9b\x99\x6f\x24\xbc\xbc\x3a\xbc\xb8\x7a\x73\xf4\xe3\xe1\x85\x59\x15\xbf\xa4\x92\xb8\xc8\xcf\x3e\x36\xab\x04\x04\x21\x45\x21\xa6\xbc\x88\x7a\x7a\xc4\xb3\x19\x68\xf7\xbd\xc5\x34\xe0\x36\xc7\x74\xb2\x33\x55\xe0\x01\xb7\x3d\x66\x3c\x0c\xf1\x56\x0f\x1b\x4a\x1d\xce\xb8\x3e\x5f\x95\x2f\x2a\xb5\x10\x55\xbd\x6e\x94\xd0\x10\xc5\x7b\x73\x52\x32\xf3\xea\xea\xd1\x3b\x95\x1a\x18\x08\x63\xb1\xdd\x93\x33\xac\x85\xae\x3b\x4a\xdb\xd0\xc9\xd7\x51\x8e\x5f\x36\x5b\xca\xb2\xee\x89\xea\x2e\x27\xfd\x82\x64\x9d\x57\xba\x6c\xac\x04\x7f\xf3\xd7\x9f\xe8\xeb\x5e\x9f\xc5\xfd\xb0\xb5\xc7\xa3\x82\x8f\x1d\xa8\x4c\x7e\x3a\x2d\x55\x25\x5e\xf1\x62\xf9\x27\xee\x8e\x86\x19\x74\x58\xe7\x82\xa6\x13\xb5\x08\x41\x20\x4b\x8f\x22\xd8\x64\x14\x88\x07\x5a\xd7\x61\x06\xb3\x24\xbe\x57\xaa\x10\xbc\x84\xd2\x40\x25\x1f\x73\x24\x52\x9e\x2d\xe7\xa2\x92\x99\x4b\x29\xf5\x19\x3f\xdb\xa6\x2a\x13\xe9\x5f\x28\x2d\xcd\x9d\xb2\x99\x0f\x2b\xf8\x86\xed\xa6\x32\x9d\xdf\x8a\xaa\x50\x3c\x17\x79\xb3\x61\xb6\x27\x91\x9d\x12\x32\xee\x7e\x48\x61\xd0\x72\xc1\xe1\x91\x17\x5e\xcc\x8f\xcf\x9f\xdb\x4a\xa4\xb0\xdc\x19\x3c\xd0\x63\xde\x1f\x04\x0a\xbf\xb1\x78\x93\x9d\xbb\x46\xa1\xd5\x32\xb8\x2f\x42\x1e\x1c\xce\x5a\x33\x99\x27\xaf\x20\xe9\xe5\xe5\x85\x5d\xe3\x52\x95\xc4\xc0\x0a\xf6\x91\x20\x65\xf5\x8f\xbc\x42\xba\xd4\x98\x1b\x78\x80\x99\x2c\xd1\xad\xaf\x15\xbd\xdb\x0c\xd4\x0c\x09\x0d\x65\x97\xe0\x0e\xc0\x35\x1e\xaf\x65\xf3\x65\x51\xcb\x45\x21\x98\x39\x10\x6f\x79\x61\x0a\x87\x5c\xd4\xb9\xd0\x0a\x0b\x06\xef\xa9\xaa\xdc\xa6\x37\x7d\xe9\xc3\x8a\xef\xbb\x3a\x71\xbd\x84\x96\x8d\x7e\x4a\x50\x05\xf0\x45\x10\xb2\x5d\x72\x87\x2a\x81\xa8\x77\x3e\x2e\x56\xf8\x99\x2f\x51\x43\xf1\x39\x1a\x2a\x1c\xc4\x73\x1d\xc7\x86\x2a\x4c\x8d\x7c\xcd\x45\x32\x5f\xea\xfa\xa5\x16\xb6\x4d\x29\xf5\x26\x95\x8b\xd7\x51\x1e\xfb\x01\x24\xa2\x53\xc3\x10\xb8\xd7\x70\xff\x37\xdb\x1c\x45\x36\xdc\x19\x6b\x90\xb6\xe3\x6a\x8d\x30\x99\x53\x03\xd5\xbd\xd2\xdb\xba\x40\xb0\xfc\x66\xdc\x9f\x2c\x1d\xb4\x36\x6c\xcc\xad\x6d\x86\xc9\x3b\x15\x75\x57\xde\xfd\x28\x27\x1d\x4b\xb4\xcb\x7a\xbd\xb6\xb3\xa5\x06\x61\xf6\xff\xde\xb6\x0a\xba\x8f\x54\xb9\xd5\xd7\x59\x0b\x34\xe5\xbe\x6a\xc2\xf6\xb2\xcf\x1b\x6b\x3a\x51\xa8\x4d\xb0\xa9\xdc\xae\xfa\x03\xad\x59\xff\x5c\xfb\x6e\xd3\xf3\x87\x46\x06\xe5\xa8\x33\x9e\x83\x60\xd2\x9d\x5f\xe6\xaa\x8d\x65\x96\xbd\x1a\x69\x84\x49\x03\x32\x25\xad\xcc\x25\x3e\x67\xb2\x6e\x96\x64\x15\x66\xf0\x92\x42\x5c\x74\x5a\x49\xec\x1d\x16\x51\x13\x8b\x74\xd3\x69\x93\xe8\x9e\x15\x6b\xad\x50\xc8\x84\x89\x41\xd4\x1e\x08\xb9\x6a\xf0\xbf\xc2\x43\xb2\x2d\x75\xb3\x24\x50\xff\x31\xd7\xb2\xe8\xdd\x46\x26\xe1\x45\xed\x80\x27\x7b\x9f\x5a\x30\x61\x2f\x47\x23\x76\x72\x2b\x4a\xf7\xf6\xe9\xce\x0e\x90\x27\x72\xa0\xb5\x7a\xc1\x11\x1e\xcf\xdc\xef\xc2\x91\x8c\xcb\xb1\x42\xbb\x95\x7b\xbe\x95\xb5\xf6\x05\xe4\xf0\xb3\xd9\x01\xb5\xac\xac\x19\x68\x5c\xda\x95\x6a\x55\x77\x76\xe9\x85\x8c\x20\x0d\xc9\x78\x81\x85\xa2\x06\x94\x43\xca\x30\x83\x15\x97\x26\xcb\xa0\x26\x54\xd9\xf0\xf1\x0d\xda\xf7\xe0\xf5\xf2\x36\xa6\x90\xef\xb9\x31\xac\xb1\x7c\xd8\x08\xcb\xf0\x7c\xe7\x4f\xd6\xbd\x30\xc5\x7e\x6a\x2b\x37\x4b\xd8\x40\x51\x3a\x17\x47\x42\x79\xbf\xdd\xbe\x84\x7a\x88\xbf\xaf\x05\x7c\x4d\x8a\x37\xf1\xfb\xfe\x3d\x99\x93\x7a\x26\xab\xfc\xfd\xf9\x12\x60\x4a\x40\xa8\x68\x1b\xf2\x07\xf8\x12\xbf\x44\xee\x63\x4c\xac\xac\xbd\x75\xbd\x2a\x63\x22\x9b\x78\x75\x36\x39\xdb\x54\x3a\x99\xcf\xf7\xb7\x69\xe6\xe8\x7f\xef\xb5\x8c\x89\x36\x9f\xb8\x0d\x7e\xe9\xde\x03\x2b\xb9\xb4\x22\xf9\xb6\x3b\x98\xc2\xb5\x72\x29\xc8\x25\xd2\x3d\x8c\x2c\x89\x94\xff\xd7\x82\x57\x7c\xce\xfe\x75\x7c\xfe\xfc\x04\x55\x86\xdf\x42\x7c\x18\x87\x2b\xf6\x2d\xcc\x4a\x18\xfe\xd9\x5b\xac\x24\x9e\x56\x7d\x0f\xbb\x19\xdc\x4d\x1e\xce\x65\x6e\xb5\x8f\x11\x73\x17\x40\x4a\x71\xd9\x1c\x66\x5b\x49\x68\x4d\xf6\xee\x5c\x68\x9b\x07\xf5\x93\x13\x87\x53\xff\xb0\xd2\xe8\x71\xee\x21\xe4\x2c\x6e\x2b\x63\xb9\x28\x44\x2d\x36\x8c\xe1\xce\x7e\x6a\x91\xfb\x0a\x1f\xc6\x26\x8f\x46\xec\x48\x95\x75\xc5\x2b\xd0\xcd\xbb\xd6\xc1\x28\x5e\xf7\x19\x6a\x28\x86\xb7\x0e\x5e\xd9\x4b\x48\xe8\xf1\xfa\xda\x2a\x98\x5c\xa3\xae\xf9\xe9\xc9\xdf\x47\x5f\x3b\x90\xe9\xcd\x1c\x38\x3b\x08\x99\xab\x06\xc9\x7c\x57\x2e\xdc\xe7\xf2\x47\xed\xa6\x1c\x90\x62\x3f\xe8\x48\x34\x00\x78\x69\xc4\x41\xd0\xe6\x44\x56\x73\xa1\xf1\x25\xe3\xfa\x35\x06\xff\x72\x6d\xa8\x2c\xf4\xb7\xef\x8b\xd9\x86\xed\x4c\x8b\xdc\x69\x6e\xab\x65\xbd\x40\x45\x36\x96\xa9\xaa\x32\x23\xeb\x14\x73\x76\x06\xa8\x3f\x15\x5c\x7d\x5c\x0f\xc2\xd3\x06\xdd\xe7\x46\xc7\xb8\x4f\xd8\x90\x58\xf4\x59\xd0\x8c\xc6\x45\xe7\x3e\x7e\xec\x7d\xaf\xe3\xb1\x79\x6e\xa2\xbd\xdb\xad\x26\x76\x03\x20\x3e\x20\x73\xbb\x7f\xfe\xf0\x0c\x8b\xd3\xf7\x9d\x33\xf7\x50\x11\xf6\x1d\x75\x72\x2f\x04\x9f\xf1\x7b\x0f\xb8\x17\xac\xca\xd2\xe2\x14\x31\x4c\xd7\x1d\x50\xc3\x87\x1d\x6d\x61\xbd\xf1\x49\x12\xe9\x37\xc1\xf8\x55\xe0\xcb\x26\x71\x04\x45\xe3\xd3\x1e\xea\x32\x35\xc2\x89\x6e\xd2\x91\x73\x0c\x04\x4b\x47\xb7\x11\x42\x43\xf8\xc3\x87\x4d\x70\xb0\xc4\x74\x31\x35\x9c\x56\xeb\xb9\xbb\xeb\xed\x46\xff\xa9\x47\x65\x67\xeb\x53\x54\xfd\x1d\x8f\xc4\x6e\xb1\xcb\x7f\xd3\x71\xe7\xdf\x74\xde\xf3\x04\xb2\x7d\x4d\x11\xf7\xf0\x9c\x08\x85\x42\x0f\xbd\x48\xba\x93\xc7\x1e\x34\x31\xac\x58\x8a\xdc\x44\xc9\x7b\xbd\x06\x55\x89\x73\x24\xd7\x58\xf7\x59\x13\xbe\xc3\xb4\xb6\x5e\xf7\x2e\x8d\x50\x82\xe0\xb0\x56\x45\x21\x72\xe8\xac\x19\xce\x2b\x30\x3b\x42\x8d\x57\x70\x40\xe5\x02\xc9\xa4\x3f\x7c\x57\x9e\x71\xc0\x81\x34\x57\x04\x7b\x43\xc3\x46\x8c\x97\x75\xad\xca\x3d\xa0\xdf\x04\x87\x65\xca\x1a\xab\xbb\x30\x4c\xce\xf9\x54\x84\x01\x33\x99\xe7\x22\xca\x56\xf1\x5c\xaa\x28\x40\x68\x51\x87\x01\x7a\x39\x9e\x4b\x0a\x71\x4f\x8c\x76\x19\x84\xbd\x61\xb8\x27\x43\xad\x5d\xc0\x65\xe9\xbb\x05\xd3\xf7\xf0\x19\xfe\x41\xc5\xf1\xf9\x90\x38\x98\xd0\xdf\x7f\x6f\xf5\x1f\x62\x35\xc0\x50\xfc\x62\x8f\x3c\x3d\x54\xe5\x11\xea\x57\xb8\x90\x8a\x32\xf9\x90\x5c\x6a\x3e\x2e\xc4\x43\x4d\x61\x6d\x94\x7f\xe9\xfc\xa7\x5a\x9a\xa2\x6e\x65\x6e\x2e\x5c\xec\x1a\xfa\x7a\x0d\xa5\x93\xce\xba\xaa\xe6\x6c\x02\xe0\xa9\x86\x0f\x01\x2d\xf9\x12\xdf\x39\xaf\x6d\x0b\xaf\xad\xc9\x11\x61\x81\xac\xa4\x73\x23\x0b\xf6\x52\x3c\x1f\x00\xbb\x02\xc5\x00\xc2\x08\x02\xd9\x80\xfb\x27\x53\xb2\x47\xc1\x31\xdb\x1b\xec\x93\xb4\x60\xd7\x64\xf2\x05\x63\x74\x3d\x64\xe7\xf5\x4c\x54\x2b\x09\x6f\x26\x26\xbf\x16\x35\x13\xe8\x86\x20\x68\x8a\xaa\xd8\xb5\x1d\xa8\x6b\xef\x5a\x35\x58\x4e\x80\x49\xf1\xc1\x26\xf3\xdf\x38\x59\xd4\x9b\xff\xcb\xa6\xeb\x88\x5a\xf5\x07\x27\xcc\x6d\x4a\x38\x25\x19\xfb\x8c\x11\xea\x19\x80\xfc\x95\x37\x22\x77\xab\xd5\x0b\x20\x26\x0a\x2d\xcb\x91\x3a\xc1\x68\xe8\x21\x33\xe3\x46\x6d\x2e\x55\x6d\x1a\x8b\x05\x82\x74\x4c\x2d\x6b\x80\x0e\x24\xe5\x4b\x84\x28\x3a\x7f\xde\x2c\xc6\x2f\x0b\x54\xa9\xfc\x6c\xb4\xc5\x36\x53\xc3\x61\x4c\x07\x23\x65\x85\x9a\x4f\x71\xb1\xd1\xea\x9b\x82\x03\x62\xaf\x56\x18\x67\xdd\x76\x34\xc9\x65\xe8\x99\xbf\xbd\x3e\x73\x05\xb9\x12\x12\xe6\x4f\xb9\x04\x36\x1f\x6d\x1e\x11\xdf\x16\x34\xbf\x07\xa4\xf2\x05\xca\x5e\x9f\xc1\xad\x6a\xcc\xf3\x21\x7b\x2a\xef\xd8\x5c\xe0\x13\xf8\x54\xd4\x21\x56\xd3\xf9\xaa\x14\x95\xa9\x11\xac\x64\x3b\xf0\x9c\xba\xf2\xec\xa7\x4a\x84\x56\x1f\x1a\x02\x9e\x2f\xe7\x60\x28\xfb\xb0\x52\xa3\x7c\x64\x94\x46\xb0\x5c\x30\x0f\xc7\x01\xf1\xf0\x87\x6e\x90\x8a\xd6\xe9\x71\xb4\x6a\xd3\x29\xdd\x0c\x5f\xa9\x97\x65\xb0\x30\x52\x89\xc3\x04\x57\xea\x28\x91\x38\x7c\x9c\xf7\xf1\x48\x88\x3c\xeb\xb5\xd4\x42\xfb\x46\xf9\x13\x02\x05\x35\xf6\x5c\xec\x79\xf2\xe2\x23\xe1\xf4\x03\xae\x81\x68\x48\x58\xd6\x77\x94\x9c\x88\x87\xc3\x43\xda\xa3\x70\xe4\x40\x1f\xd9\x07\x23\xcf\xa6\x9e\x5a\x4b\x6e\x60\xaf\xbf\x91\xe5\x62\x59\x7f\x0b\xd6\xf9\x01\x00\x19\xc8\xb6\x01\x6a\x0c\xbc\x6a\x5b\x0b\x52\x2d\x1c\x36\x16\x28\xc2\x99\x9a\xf6\x3c\x01\xeb\xdb\xad\xdc\x6f\x51\x91\x3e\x28\xb7\x35\x8e\x02\x62\x83\x4f\x27\x01\x0d\x34\x64\xc4\xd2\x83\x4a\x38\xfd\xc1\x42\x8a\x9c\x6d\xab\x0a\xba\x33\xf2\x8c\x62\xdf\x0c\x0a\x1a\x4d\xa9\x52\x6f\x01\x35\x30\x4d\x9f\x4c\xe0\x46\x6c\x6e\xc7\x34\x40\x80\x3a\x60\x8a\xc7\x91\x01\x6a\x69\xb5\x4f\x1b\xc0\x58\x16\x50\xca\xb7\xaf\x9e\x89\x35\xaa\xbe\xbb\xb6\x98\xfe\x98\xd6\xb5\x1a\x14\xd8\xc6\xe7\x0e\x81\x09\xaa\x2b\x55\x0d\x2d\xdc\x5c\xab\x85\x12\xeb\x93\x87\x32\xb5\xd0\x6c\x0e\xde\x6f\x48\x4f\xb3\x64\xaa\xca\xd1\xc8\x03\x3b\x9c\xa8\x0f\x51\xca\xb0\x86\xdc\x76\xe4\xaa\xb3\x65\x63\x53\xac\xac\x51\xc7\x17\x44\xb6\xcb\xd2\x0e\x9c\x19\xf5\xe6\x74\xee\x98\xe2\x40\xa0\xc1\x09\x47\x93\x86\x35\x4c\x8c\xb3\xbc\x63\x6b\xbf\x14\xc2\x9a\xc0\xae\x56\xab\xe1\xea\x8b\xa1\xaa\xa6\xa3\xab\x8b\xd1\x93\xc7\xbb\x4f\x46\x3f\x1d\x0f\x66\xf5\xbc\xf8\x6a\x60\xbe\x76\x1f\x3f\xf9\x6a\x54\xcf\xc4\x00\x56\xe7\xc0\x8e\x8c\x49\x80\xcf\xec\xa1\xc8\xf7\x47\xa5\xe1\x3a\xa3\x3d\x74\x51\x63\x0f\x1a\xa6\x98\x1d\xd8\x1e\x5b\x53\x25\x2b\x58\x0d\xf6\x8b\x8d\xca\x1a\x1b\x96\xbe\x1d\x73\x39\xb3\x55\xb2\x03\xe6\xd0\x21\xb6\x48\x5e\xe3\x2d\x84\xc9\xe7\x2a\x6e\x69\xf2\x58\xc0\xcb\x35\x99\x4f\x07\x82\xb0\x6d\xbb\xc7\x86\x24\xfe\x8c\x9c\x1c\x60\xfe\xb9\xe0\xa5\xa6\x04\x00\x6f\x6e\x76\x2c\x88\x8b\x76\x77\x61\x73\x81\xb7\x57\xb4\x32\x33\x19\xf6\xfc\x75\xaa\xdf\xdd\x34\x5d\x8b\x85\xab\x87\xa6\x30\x6e\x8c\x8b\x35\x49\x6d\x41\xcd\xc6\x54\xca\x54\x96\x9b\x2b\x2e\x20\x11\xf5\xd9\x98\x6b\x80\x20\x54\x25\x83\x3a\x16\x95\xc8\xa4\x96\xaa\xc4\x16\x9a\xb0\x87\xb5\x70\x2e\x4b\xf6\x29\x1b\xce\xf9\x5d\xb3\x9d\x4e\x47\x9c\x86\x12\xb7\x85\x2d\x09\x50\x0f\xab\x52\x54\x60\x81\xa1\x99\x5e\x66\x33\x30\xa4\x87\xfd\x03\x86\x1a\xb9\xa8\x24\x68\xf0\x82\x64\x01\x4a\xed\x33\x31\x9c\x0e\xd9\xa9\xd6\x4b\xc1\xfe\xf2\xb7\xdd\xbf\x3d\xc6\xf6\xce\x65\xd9\x6a\xee\x9c\xdf\x05\x61\xe6\xbc\x76\xe7\x3a\x2e\x86\x78\xd3\xb4\xf2\x87\xdb\xa4\x15\x49\xb7\x95\x88\x8c\x87\x72\x23\x73\xcf\x7b\x43\xb8\x7f\x00\xfc\x36\xa4\x0d\x0c\xc5\x35\xd8\xe4\xe6\x21\xf1\x9d\x0b\xd9\x54\x12\xb5\x7b\x0b\x95\x60\xb7\x22\x24\x17\x58\xfd\xfb\x91\x64\xca\xe4\xfa\x29\x28\x26\xb9\x1d\x71\x60\xde\x85\xe1\xda\xee\x01\x11\xe8\x85\x4c\xd6\x06\xc6\x23\xf4\x7d\xd7\x3c\x21\xc3\x87\x17\x30\x10\x03\x76\x3e\x66\x1c\x5a\xa9\x1e\x6d\xe2\x33\x76\x5a\x80\x94\x56\x1b\xec\x13\x6d\xb1\x80\xc8\x26\x6a\x41\xbe\xd5\xcc\x5e\xfe\x44\x07\xa0\x1b\xb6\x7d\xa0\x4b\x1f\x37\x06\x5b\x48\x50\x9f\x50\x82\xb0\x67\x37\x9c\x08\x63\x61\x19\xf1\x80\x9b\x01\x27\x82\xc1\x37\xe4\xde\x06\x04\x8d\xc9\xda\xa6\x0f\x4f\x46\x53\x4b\x9f\xdc\xba\xa5\x5a\x80\x8e\xa7\xcd\x59\x07\x45\x99\x46\xef\x0c\xd9\x31\xa2\x8f\x8c\x45\xbd\x12\xc2\xf0\x26\x88\x7e\xb1\xa1\x21\x38\x06\x50\x86\x3d\x7c\x4c\x9f\x51\x5a\x11\x98\x48\x69\x61\x3b\xfe\x5c\x81\x9f\xb8\x89\x42\x95\xee\x9e\x35\x95\x08\x21\x14\x7c\x05\x03\xcf\xdb\xf7\x5a\xcb\x24\xe0\x78\xb7\x11\xa1\xf4\xd0\xf3\x3b\x76\x71\x01\xa5\x75\xd2\xdf\x7b\x18\x4c\xaf\xab\xf2\xb6\xb1\xe2\xec\xa6\xdd\xb4\xde\x5e\xa5\xd3\x3c\xea\xe2\x7d\x3f\xc4\x4a\xc3\x76\x05\xeb\x0c\x1b\xf1\xe7\xae\xb2\x5b\x57\x47\x73\x8d\xbd\x0a\x62\xfe\x9f\x5e\x61\xa9\x8b\x4e\xbc\xba\x1c\x36\x79\x1e\xa7\x6a\x2f\xa9\xfd\x4e\x9e\xa7\x4d\xe8\x9d\x68\x2c\x26\xf8\x7b\x1d\x57\x8b\xe6\x95\x63\x2f\x49\x41\xfb\x61\x89\x74\xb6\x25\xae\x24\xae\x34\x7b\xa2\x85\x9d\xb0\x18\xfa\x76\xdc\xf7\x52\x57\x2c\x77\x41\xf6\x7e\x2a\x80\xdd\xa5\x33\xe8\x1d\xb8\x41\x2f\xe4\x8e\x2e\x85\x89\x3a\x83\xc3\xe5\x51\xe2\xe0\x0c\xb2\x7f\xfa\x29\x8b\xbf\x1e\xdd\x73\xb1\xec\xde\xe0\xc1\x32\x02\x3d\x60\x73\x0d\x80\xad\x50\xa6\x56\x7f\xb0\xf3\xf1\x12\xe0\x53\xa4\xf7\x78\x20\x52\x21\x8c\x3d\x60\x87\xa2\xa2\x6b\x15\xf6\xc6\x30\xf9\xb7\x32\x13\xec\x56\x54\x9a\xef\x50\xb1\x1f\x64\xbb\x5a\xe5\xb1\x42\x4e\x04\x18\x57\x2a\x6b\xd6\xe5\x90\x8d\x83\x2d\xfb\xe0\xdd\xfa\x89\x8e\x36\xe0\x7d\x4c\xc4\xf6\x4e\x73\x8b\x6e\x10\x07\xa4\xce\x81\x7b\xd7\xc6\xa3\xf4\xe2\xe8\x12\x51\xbc\xc7\xe2\x60\xf7\xaf\x8c\x70\x32\xde\x69\x6d\xc4\x2b\x23\x9a\xd3\xff\x07\xd7\xc6\x06\xb9\x52\x07\x15\xef\xbc\x5f\x12\xc6\x44\x4c\x78\x77\xda\xcf\xce\x8d\xd7\xbe\x1e\xe5\xe8\xf5\x5d\xd1\xbf\xff\xee\x90\x1c\x82\x8a\x3b\xee\xbc\xfe\xd1\xb7\x51\x65\xac\x57\xf4\x18\xfc\x2f\x9b\xa5\x9d\x56\xe6\x0d\xa3\x58\xef\x71\x2f\xd0\x85\x38\x53\xb5\xd8\x63\xa7\x27\x5f\xb3\x4a\xa0\xf8\x92\xb3\x72\x39\x1f\x03\xc2\xc5\x62\x69\xbe\x35\xeb\xd5\xe2\xce\x9c\x94\x5a\x61\x37\x48\xf8\x41\x16\xa8\xc3\xd4\x9b\x60\x28\x2f\xc3\xf2\x7a\x91\x42\xca\xa5\x9c\x83\x77\x51\x76\x0d\xd5\x60\xeb\x0e\xf5\x19\x24\xbd\x1e\x42\x8b\x72\x25\x22\x43\x55\xaf\xd3\xea\x86\xcc\xe6\x30\x43\xc7\x2b\x2d\x9e\x16\x8a\xd7\xdb\xbe\xbf\x70\xde\x3f\x76\x7a\xd9\xa6\x75\xbe\x0d\x42\x17\xb2\xac\x07\xf4\x6e\x30\x28\xc5\x5d\x3d\x28\x64\x29\x5c\x25\x34\xf0\x71\x4d\xbf\xff\xfe\x8e\x25\x1c\x34\x4b\x88\x27\xcb\x56\xd0\x00\xb5\x38\xe2\xba\x76\x12\x37\x04\x85\xab\x2b\xb2\xf5\x73\x38\x70\x5e\x1b\x16\xee\xe4\xa4\x70\x52\xac\x87\xec\xa7\x99\x2c\x44\x58\x9e\x85\x3b\x33\xa4\x86\xe0\x17\x72\x85\x22\x7a\xae\x43\x67\x05\xbf\xea\x5c\xcd\xad\xf6\xed\x30\x56\xd3\x70\x6b\xc8\x29\x0c\x24\xdf\x4e\x1d\xa5\xf5\x0c\x77\xa8\x2b\x13\xea\x25\x7d\xb8\x5e\xfe\xe1\x3e\x6e\xec\x61\xeb\x41\xb7\x79\xab\x88\xdc\xfe\x27\xee\x13\x0d\x4c\x9a\xd1\x88\x9d\x96\xec\x68\x56\xa9\xb9\xe8\x33\x14\x55\x99\x7e\x47\xb9\xcc\xe9\x2e\x2a\x73\x83\x20\xb2\x8b\xe8\x93\x24\xa7\xd4\x14\x18\x69\x7c\xda\xc2\x9f\x82\x48\x36\xd8\xc7\x28\xb5\xb4\xa0\x19\xd8\xe6\x42\x69\x28\x8e\xcb\x02\xeb\xce\xe4\x9c\x17\x6c\xa1\x64\x59\x6b\x42\xe4\x98\x73\x59\xd8\x22\x82\x79\x83\x86\xb3\x8a\x4b\x53\xc2\x47\x57\x33\x81\x50\x90\x13\xe9\x34\x47\xbf\xb9\xfb\xd6\xf9\xc6\xc0\x36\x52\x61\x3c\xcf\x2b\xa1\xf5\x47\xbe\xb5\xbe\xdc\x1f\x05\x4a\x98\x90\xcc\xd4\x8a\x69\x21\xac\x05\x79\x34\x34\x33\xae\x3d\x66\x09\x0a\x60\xf3\x3e\xfa\x40\xf0\x32\xf1\x45\xa5\xc6\x85\x98\x6b\x5f\xfe\xca\x02\xad\x80\x74\x5a\xd2\x10\xa2\x18\x5d\xdc\xd5\x89\x16\x6d\x42\x01\x80\xc3\x6b\x84\x86\xea\xa3\xbf\x3d\xf9\xea\x8b\x50\xb1\xcb\xac\xa6\xd6\x9d\x12\x96\x55\x7b\x7d\xb4\x94\xa9\x1a\xd7\x89\x8e\x6c\x6d\x75\xa8\x94\x7c\xa5\x6b\x65\x1e\xa5\x4f\xb3\xb8\x05\xfe\x5a\xfd\xe8\x51\x2a\x77\x78\x88\x86\x2c\x3f\x80\x80\xa8\x65\x59\xbf\x2b\xd7\xbf\x45\x90\x3e\x35\xcf\xec\xc5\x18\x58\x9b\xb0\xdf\x00\xf0\x83\x58\xf5\xb9\x62\xbc\x5c\x23\xca\x81\x05\x8d\x09\x5c\x50\x12\x0c\x13\x28\x23\x18\x56\x06\xf4\x14\x82\x93\xad\x9e\x29\x4d\xe4\x45\xb3\x4f\xa3\x4a\x50\x0d\x12\x9f\x42\x87\xec\x6a\x26\xd6\x58\x98\x7d\xfd\x80\xa2\xe0\x75\xd6\x74\x41\xa3\x65\xb7\xd4\x4c\x59\xd3\xb4\xa6\x05\x83\xb9\xf1\xda\x25\x8b\x45\xe1\xfd\x57\x5b\xba\x35\xa0\xea\x6d\x7b\xb6\xc5\x94\x7d\x74\x89\x6d\xff\xff\x2f\x45\xb5\xfe\x68\x07\x17\x70\xa9\x42\x2b\x88\xd1\xc8\xbd\x5a\x03\xf6\x9f\x05\xe4\x0e\xee\xb5\xf6\xd9\x93\x6b\xc1\x7a\x38\x1a\xbd\xbd\x20\x08\xfa\xd2\xb3\xb0\xd9\xe3\x4a\x70\x02\x3c\xc1\xe8\x4c\x15\xaa\x8a\x32\x98\xfb\x5c\x2b\xc0\xf0\x7e\xc9\xc0\x01\xd8\x1d\x44\x51\x73\x55\xd6\xb3\x28\xa4\x95\x7b\x25\xc4\x8d\x6b\x93\xb5\xb0\x9f\xc8\x3b\x52\xe5\x2a\xd5\x40\xcf\xd4\x0a\x71\x22\xc0\xc9\xe7\xf9\x25\xbb\xe4\x13\x5e\x49\x18\xea\xc3\x32\xaf\x94\xcc\x89\x54\xed\xbd\xd7\x8e\xfe\xe2\x8b\xf4\xd9\xb0\x9f\x0a\x6e\x6d\xdc\xfd\xf6\x78\x36\x00\xca\xdb\xf9\x6f\x93\x19\x2d\xca\xdc\x99\xaa\xe6\xe8\x14\x76\x25\x7a\x39\x03\x78\xa5\x5c\xb1\x6b\xc8\xea\x99\xd7\xf0\xf3\x1a\x65\xfd\x74\xef\xb7\xaf\x00\x85\xd0\x1a\x97\xeb\x78\x39\xb5\x1e\x11\x11\xc7\xaf\x14\x22\xc7\xfb\x03\xa2\xda\xc2\x13\x82\xb9\x13\x20\xc9\x1f\x2f\x01\x4e\xa4\x12\xee\xfd\x31\x26\x08\x01\x4c\x23\xa0\x9f\xc9\x39\x80\x78\x4c\x8a\x25\xe0\x1f\xf8\xd3\x5c\x4d\x1c\x4f\x0c\xb8\x73\x04\x86\x97\xc3\xce\x37\xb4\x60\x67\x88\x65\x5d\x88\x89\xa8\x04\x20\x69\xdb\xa9\x1b\x2f\xa7\x86\xbe\x55\x6a\x2e\x97\x73\x78\xae\x5a\x8c\xec\xa7\x9d\x3d\x53\x90\x2c\xbe\x93\xf9\xc1\x5f\x1f\xff\xfd\xcb\xdd\xbf\x3a\x9c\x3e\x0b\xb9\x53\x8b\xf9\x42\x55\xbc\x92\xc5\x9a\x2d\x4b\x43\x17\xc0\x30\xc6\x70\x21\x80\x48\x9a\x4b\x5d\x2d\x17\xd0\x45\x78\xf1\x25\xf5\x29\x36\xad\xd4\x72\xe1\x40\x23\x4b\x54\x69\x83\x21\x2f\x49\x85\xcd\x2a\xf6\x12\xc9\x8f\x34\x35\x29\x3d\xae\xa1\xb7\x5b\x9d\xd4\x36\x11\xbc\xff\xce\xa9\x1f\xd0\x10\xdb\xe6\x98\x7c\x57\x42\xd7\xaa\x12\xfe\x06\x05\x77\xe5\x8f\x77\xdf\x41\x78\x13\x0b\x7d\xf0\x3e\x64\x85\x35\x36\xf6\x8c\xcf\x45\x7e\xa4\xcc\xb5\x53\x37\x92\xb4\xe5\x47\x51\xe2\x4a\xa9\xfa\x2c\xc8\xe0\x1b\xe2\x55\x0c\x75\x34\x21\xe9\x57\x7c\x60\xc6\x71\x84\xa2\x53\xd0\x14\xf5\x5f\x86\xe6\x82\xef\x63\x74\x4a\x8f\xd0\xf8\x10\xbd\x32\x8c\x27\xdb\x76\x29\x86\xe8\x21\x03\xdc\x11\xb8\x73\x34\xcc\x9f\x4a\x19\x01\xa9\xa0\x2d\xdc\xb5\xad\x67\x38\x51\xd5\xfc\x1a\xcc\xe2\x4a\x55\x0e\xc0\x91\x0f\xe2\xb9\x19\xee\x08\x2e\xff\x75\xb5\x66\xd7\x00\x26\x6e\xc5\x02\xd7\xee\xb9\x0e\xb1\x54\x79\x1d\xec\xc1\xb1\x98\x71\x73\xd8\xe8\xba\x32\xdc\x52\xb1\x26\x9d\x76\xf4\x87\x0f\x25\xf2\xc2\x1c\x62\xd5\x1a\xe5\x00\xb6\x2c\xac\x63\x2a\x6a\xd2\x85\xd5\xdf\x83\xae\xe6\x75\xdf\xd7\x02\xdb\x1d\x94\x9a\xe8\x29\x8a\x54\x62\xc0\xcd\x42\x25\x4a\x5b\x94\xa1\xcb\x78\x6e\xcb\x32\x2b\x96\xb9\xb0\x47\x31\x94\x62\xe1\xab\x7e\xbc\x7a\xfe\xec\x2b\xac\xf6\x20\xd0\x3e\x1a\xb2\x4b\x59\x66\xee\x11\x16\x80\xb3\x81\x01\x9e\x3b\x40\x7c\xa0\x23\xf0\x66\x4e\xba\x5a\xe0\x9e\x34\x19\x0f\x28\x3f\x58\x52\xae\xb2\x25\xbe\xf0\x3f\x13\x75\x4f\x23\x59\xb5\x8d\x41\x93\xb9\x6b\x98\xbf\x4b\x51\x88\xac\x56\xd5\x61\x51\x5c\x07\x37\x14\x6b\x44\xe7\x1e\x61\xa5\xd6\x8e\x2b\x19\xba\xe5\x04\x74\x23\x5a\x0a\xcd\x42\xe9\x49\xed\xb5\x59\x90\x07\x86\xe5\xfb\x8f\xcb\xf3\xb3\x21\xde\x88\xe4\x64\x8d\x06\x07\xa8\x41\x0c\x88\x17\x66\x31\x1f\x7c\x04\x0b\xf9\xa3\x5f\x7a\x56\x08\xea\x90\x4e\x24\x00\xf2\x30\xc9\xbe\xc1\xba\x09\xe8\x64\x9f\xc9\x10\xa1\xc4\xa4\x84\x87\xef\x33\xdc\xc2\x90\xf4\xb5\xfc\x25\xd4\xc5\x0d\xe2\x0f\xfc\x5e\x30\x77\x6b\x17\x03\x0b\x16\xe8\x4c\xb4\x84\x9b\x3e\x60\x64\xd9\x64\x5b\xfd\xd9\x8e\xaa\x1f\x00\x16\x23\x27\x11\xcd\xd5\x5e\x3d\x62\xbc\x66\xb9\x9c\xc0\x89\x60\xae\x82\x0b\x29\xb4\x39\x4a\xe0\xe5\xd2\x97\xc7\x09\x3a\x07\x6c\x26\x61\x7f\x1b\xb6\xcd\x15\x02\x30\xeb\x2e\x1e\x5a\xbe\x6d\xcd\x2b\xff\xb2\xfb\xf5\x17\x5f\xef\x84\xf8\x6b\x08\xa0\xe8\x70\x1f\xd5\x0d\x5f\xef\x7b\xcb\x49\x2f\x9c\xc0\x85\xc3\x75\x2b\xce\x97\x35\x97\x77\x1e\x3f\x28\xee\x21\x3c\x07\x99\xbd\x8e\x91\x2a\x00\x17\x74\x53\x64\x75\x1b\xa6\x02\x45\x60\x24\x0e\x83\xe0\xa7\x95\x9a\x9b\x61\xff\x78\xd7\x4f\x97\x93\x88\x3d\x0a\xb2\xa7\x3c\xff\x5a\xb5\x3c\x10\x33\xee\xb1\xe7\x61\x33\x51\xa1\xc6\xb6\x0b\x1b\x4d\xdb\xd6\xf9\x41\x80\xc1\xbb\x36\x03\x7d\xdd\x46\x17\x4b\x78\xfb\x0d\x2c\x7f\xa5\x8e\x05\x8e\xed\xb3\x16\xc0\x81\x32\x07\x96\x8f\x37\xe1\x19\x0f\x86\xd5\x90\x49\x8b\x8a\x08\xf7\x41\x3c\x18\x6b\x65\x3d\xb7\xc1\xd2\x72\x2e\x0a\xac\xfc\xdd\xdc\x60\xc5\x20\x73\x8c\x8b\x5d\x3c\x9a\xf1\x85\x39\x2e\x2a\xe9\xfc\xc1\x37\xcf\x33\x37\xc4\xfd\x60\x66\x76\xba\x6e\x43\x93\xc2\x5c\x01\xca\x23\x22\x87\xdb\x96\x2e\xfa\x63\x0b\x1c\x1a\x81\x73\x2d\xc3\x19\x20\xaf\xf2\x14\x73\x39\x2a\x8a\xe4\x13\xb0\xdf\xbc\xe6\x13\x2c\x33\xa0\x10\x9a\xb9\x3b\xbf\x26\x28\x5b\x49\xd0\x27\x28\x37\x30\x5b\x40\x82\x71\x5a\x3e\x74\xdc\x50\xc6\x4b\xa6\x65\x81\x00\x26\xfa\x46\x2e\x10\x0c\xd3\x39\x74\xa0\x12\x8e\xcf\x9f\x83\xd3\x30\x40\xd9\x40\x51\x37\x16\x01\x58\x52\xc8\x92\x6b\x41\x2a\x1d\xb2\x44\x84\xc5\xa1\xd5\xe1\x1c\xda\x9e\x1b\x9a\x70\xc2\xb3\x99\x1b\x81\x10\xf9\x2b\xf2\x3a\x84\xf2\x56\x59\xe4\x4d\x7b\x97\x2e\x8b\x4f\x0b\x02\x46\x79\x0e\x58\x0f\x87\xa5\x17\x7a\x9e\xf4\x91\x2d\xa1\xa4\x9d\x81\xcf\x0f\x30\x59\x30\x97\x91\x96\x05\xa5\xdb\xa0\xba\x87\xaa\x78\x69\xdd\x3d\x33\x76\x1a\x6f\x71\xd7\x1a\x28\xbf\x61\xd1\x51\xb2\x35\x6c\xe8\x50\x59\x2c\x9d\x6e\x25\x2a\x52\x41\x65\xdb\xeb\x65\x39\xd5\xb5\xa8\xf4\xce\x1e\xe2\xdf\x09\x47\x97\xcc\x71\x10\x56\xe5\x1b\x38\x6c\x41\xe6\x20\x8f\x64\x13\xdb\x91\xef\xb3\xde\x4b\x3a\x0d\x63\x15\xb2\x50\x29\x10\x45\xc2\xaa\x64\xdf\x60\xf6\x6f\x43\x80\x42\xab\x9e\x0c\xcb\x27\x68\x8c\x0a\x1a\x13\x78\x5a\xe8\x94\x22\x74\x30\xa0\xa3\x11\xde\x29\x0e\x3e\xfa\xc8\xbe\x8c\xcc\xf9\x8d\x40\xb9\xd3\x52\x04\x0a\xcc\xdb\x7f\xf9\xeb\x93\xdd\xaf\x77\xb6\x52\x5a\x01\xd1\x2a\xb3\xaa\x6d\x91\xb5\x54\x0f\x92\xba\x57\x89\xd0\x62\xea\x6d\x87\xee\xdb\x06\x96\x39\xa9\xac\xe6\x36\x7b\xa0\x78\xe4\xf4\x97\x3c\xfa\xb3\x27\x17\x4d\xd2\x62\x65\x3f\x44\x60\x9c\x41\x2d\xe5\xb0\xfd\x73\x95\xbb\xa4\xd6\xab\x5a\xe9\x9d\x6e\x27\xf5\x8a\xfe\x5c\xb5\xe7\x87\x2b\x28\xbf\x8b\xda\xf3\x97\xef\xad\xf6\xdc\x74\xa3\xde\x52\x09\x40\x1f\xde\x0e\x9f\x28\x5c\x04\xc7\x22\x2b\x38\xca\x82\xc0\xc2\xc0\x16\xbb\xed\xd7\x80\xb2\x9d\x20\xcf\x7b\xe9\x31\xd9\x76\x46\x60\x2e\x7d\x03\xbd\xab\xf7\x73\xf9\x73\xb9\xc1\x61\xf0\xb5\xd9\x81\xbe\xb2\xcf\x59\xef\x7a\xd8\x6b\x60\x5d\x99\x83\x87\xcc\x90\x6e\xad\xe2\x17\x98\xcf\xb2\x03\xf6\xda\x2d\xfd\x5e\x48\x01\x7a\xbf\xec\x3b\x22\xf8\xca\x89\xa1\x03\xd7\x9f\xa1\xd6\x70\x52\xcf\x38\xb0\x9b\x83\x73\x18\xb9\xe1\x58\x35\x9f\xf6\xcc\xbb\x29\xa7\x21\x91\x79\xa0\x76\xda\x97\xb8\x4f\x52\x9c\x73\x3c\x14\x29\x16\xba\x61\xdc\x16\x67\x70\x8c\xb4\xa3\x37\xa1\xf1\x59\x0b\xa9\x3e\xe2\x90\x3d\xd6\x80\xd4\x00\x4a\x68\xc1\x09\x87\xf4\xdd\x2c\xb0\x01\xd2\xa4\x87\x0e\xa1\xe1\xd3\x4f\xd9\x23\xca\xd4\xfd\x64\x7d\x65\x08\xfc\x27\x9a\xec\x5d\x9c\x46\x75\xad\x3c\x4d\xb7\x7a\x47\xbc\x64\x1c\x5a\x24\x89\xb8\x5f\xdb\xaa\xe0\x30\x03\x27\x10\xee\xfd\xd6\x59\x50\x74\x6f\x88\xb6\x61\xe1\xa3\x76\x0f\x3e\x68\x07\x98\xce\x78\xc1\x2b\x6c\x3d\x49\x53\x27\x2c\xee\x06\x94\xfb\x5e\xfd\x68\x9d\x09\xc8\x3d\x9e\xc3\x59\x67\x45\x1d\xb6\x2e\x2c\x1d\x15\x6c\x0c\x1f\x40\xe4\xe5\x92\x8e\xc9\x80\x5a\x60\x76\x2b\x6e\xa2\x4f\x47\xe2\x6d\x79\xe1\xc2\xb4\x67\x2d\x89\xb4\x0f\x7c\x55\xfb\xe9\x34\x04\x70\xd8\x75\x91\x8c\xcb\x4b\xdf\x28\x47\x23\xf6\xa2\x12\x13\x79\xe7\x65\x69\xd9\x8c\x2b\xba\x2e\x58\x97\x61\x37\x62\xed\x2e\x38\x51\xa9\xaf\x7b\xe0\xdc\x22\xae\xe9\xb5\xfc\xe5\x97\x84\x4e\x87\x47\xf5\xa4\x36\xbe\x31\x8d\xa4\x81\x71\xad\x7b\xd3\xba\xf0\x7a\x16\x27\xae\xa7\x09\x99\x88\x4d\xa1\xf2\x5e\xbf\x91\xbf\x0c\x63\x43\x74\xa0\xc9\x41\xac\x2b\xd7\x5c\x84\x75\x34\x81\xf8\x2f\x99\xd8\x27\x6d\x5e\x8d\x01\x55\xc2\x26\xfb\xf4\xd3\xce\xd5\xd1\x2e\x3c\x8f\x93\x35\x70\xb6\x3b\x0c\xe8\x47\x23\x76\xac\xf0\xf6\x26\x6a\xcb\xa8\x0d\x2d\x01\xd7\x4c\xdc\x99\x2b\x20\x48\x92\xa4\x32\x64\xc9\xdc\x3e\x32\x55\x6a\xf0\x5c\x51\x33\x9e\x55\x4a\x6b\xc6\xc9\xc7\x74\xf8\x24\x0b\x36\xd7\x70\x09\xd3\xf6\x62\x0b\xf3\xd6\x5c\x7c\xee\xa9\xab\xb1\x48\xdb\xfd\xf1\x46\x7d\xc1\x2a\x78\x62\x97\xc1\x93\xe4\x3a\x88\xb0\x59\xe3\xc9\x7b\xf2\x4b\xa0\x3d\x11\x37\x2b\x3d\xc6\x4f\xa2\x19\x8c\x11\xd2\x70\xde\x36\xcd\x55\xa3\xa4\xcd\xd3\x15\x02\x50\x85\xb7\x9f\x78\xa1\xb4\xca\x08\x5e\xfe\x1e\xc5\xb5\x25\x4c\x25\xdb\x2d\x08\xb3\x74\x3d\x35\x36\x73\xb5\xbd\xaf\x34\x52\xa4\xc7\xac\x89\x83\x14\xde\xa8\x3c\xf1\xde\x60\x0c\x65\xcd\x9f\xcc\x25\xd6\xdb\x45\x39\x63\xa8\x4d\x5c\x08\xc8\x5d\xdb\x74\xdf\x9b\xf9\xf8\x43\x03\x70\xc1\xe1\x56\x69\x86\x2f\x91\x13\x0c\xa0\x13\x19\xed\x71\xa9\x26\x41\x7e\x1d\x1a\x5a\x51\xfb\x02\xe1\xc9\xc3\x4c\xab\x08\x14\x1a\x4d\x90\x2c\x74\xb9\x1d\x62\x1c\x95\x8d\x36\x55\x4e\x26\x66\x37\x8b\x6f\x13\x62\xa7\xbd\xab\x65\x95\x3d\xa4\x42\xcb\x2a\x92\xc2\x48\x78\x58\x58\xa8\x52\xc3\x33\x4b\xd8\x8d\x86\x75\x55\x64\x28\x1d\x1b\x59\x99\xf2\x9c\x9d\x55\xba\x6a\x27\xf7\x09\x07\x38\xbe\xb9\x22\x6e\x1b\x3c\x9a\xf6\xd1\xf6\xc7\x35\xdb\x8a\xb4\x6c\xbf\xe9\x35\x96\xec\xb1\xc2\xf1\x6d\x5e\xd8\xa3\x8b\xdf\x93\xe4\xc5\x8f\x78\xed\xd0\x75\x6d\x64\x9a\x72\xdb\x30\x3a\x21\xf1\xc3\x26\x7b\x8e\x77\x7a\x95\x09\xec\x5f\xd3\xac\xf6\x43\xd4\xd2\xee\xd7\x58\x7e\xb5\xd9\x4a\xa6\xad\xca\xd0\x27\x39\x84\x7e\x4e\xdb\x69\xcf\x29\x1c\xd8\x0d\xe6\x2c\x96\xd3\x0a\x38\x1f\x56\xad\xff\xe3\xdd\x6e\x36\x13\x07\xee\x7f\xac\x32\x3e\xae\xde\xff\x26\x6d\xfc\x7b\x55\xea\xe1\xfe\x9c\x38\x08\xba\x65\x40\xe9\x8d\xb5\x41\xb7\xde\xdd\x21\x0e\x5a\x6b\xea\x1e\x9b\xc3\x4e\xfd\xcb\x14\x3b\xdf\x2c\xbb\x6f\x2d\xd7\x02\x7d\xcf\xa6\x92\xe4\x26\x25\xb1\x87\xd5\x91\xd8\x4a\x88\xcf\x94\x96\xa6\xbd\x7c\x4f\x55\xfc\xd1\x88\x1d\x3a\x67\x75\x0d\x65\x82\x95\xd3\x65\x77\x94\x71\x50\x0a\xad\xd9\x9c\x97\xa8\xa0\xa5\x15\x3d\x88\x2c\xb8\xd6\x81\xba\x01\x8e\x6d\xae\x56\x65\x92\xaa\x44\xa6\x73\x2c\xd8\xba\x4e\x0e\x16\x10\x0c\x7b\x2b\x8a\x4b\x08\x12\xa4\x29\xd7\x30\x2e\xa2\xbd\x40\xfe\x6d\x2b\x24\x6c\x98\x21\x5c\xcd\xdc\x81\x8f\xa4\xa7\xaa\x22\x9f\x2d\x99\xac\xd7\x7d\x56\x09\xf0\x1a\xd0\x3a\xf4\x5a\xec\x8a\x9a\x4e\x0b\x0b\x83\xfa\xb0\x55\xf9\x41\xd6\x65\x0b\x65\x07\xd4\x3c\x6e\x45\x85\xa6\xe1\x44\xa1\xac\xab\x46\x59\x6b\x4b\x0d\x41\x51\x83\x98\x1b\x30\x1c\x1f\xbe\x47\xa3\x1c\x3d\xf8\x8e\xbd\xfe\x85\xed\xb1\x5e\x2f\x9c\x81\x14\x0d\xea\x50\x87\x78\x17\x4a\xd4\xb9\x86\xfe\x8c\x45\xf4\x67\xc9\x69\x63\xa9\xd9\x57\x1f\x08\x4c\xc2\x1f\x07\x01\x88\x43\xf2\x22\x50\x8b\xbb\x9a\x57\x82\x3f\x08\x17\xc1\x61\x1e\xf0\x32\x37\x45\x35\xd9\x7e\x78\x73\xc6\xb7\x64\xc2\x30\x03\xef\x70\x15\x47\xd7\x21\xbc\x80\x47\xaf\xc3\x17\xa7\xee\x31\xcc\x2b\xdd\x7d\xc6\x96\x7a\x69\x6f\x1b\xe6\x66\xfc\xe2\xe8\xf8\xf0\xea\xd0\x49\xef\x3f\x1c\x67\xef\x11\x13\x4c\x79\xef\x83\x91\x10\x34\xe0\x8f\xa0\x24\x98\xd2\x4c\x8e\x77\x42\x49\x78\x3f\x3e\xfe\xc3\x80\x25\x24\x60\x10\xfc\xd5\xac\xbd\x20\xcc\x2e\x74\x3a\xcc\x8e\x0b\x73\xaf\x23\xf6\xc5\x65\x3b\x17\x8b\x4a\x80\x93\x87\x9d\x8d\xfc\xff\x17\xef\x40\x1c\x1e\x59\xc2\x6b\xc6\xa6\x82\x47\xec\x4b\x51\x9f\x96\xa5\xa8\x7e\xbc\x7a\xfe\xcc\x0b\x8a\x53\x6f\xf7\xd7\x1d\xb9\xae\xbd\x01\x05\xbc\x86\x69\x51\x82\xc7\xc3\x60\x1b\xc5\x4f\xf3\x74\xcc\xa3\x1f\x5f\xd0\xb4\xb7\x9d\x0f\xb5\x25\x50\xab\x85\x9d\x96\xec\xf4\xe4\xeb\x7e\x40\xaf\x81\x50\xc2\xe4\xe2\x72\x21\x47\xc2\x56\xe7\x76\xc2\xae\x4d\xbd\x47\x38\x8e\xb0\x1c\x01\x6c\x4e\xe4\x43\x16\xa8\x20\xe5\xa8\x6b\x28\xb2\x1b\x73\x5d\xd4\xa2\xbe\xf2\x99\xb6\xac\x6b\x24\x74\xff\x17\x61\x25\xcb\xc9\xc8\x29\x77\x13\x5b\xd1\xdc\xda\x30\xee\x84\x51\x40\xf0\xd7\xa6\x4e\x7a\xc7\x56\x86\xd2\xd4\x02\xb8\x95\xe2\x96\xbc\x32\x9d\x9e\x7c\xcd\xc6\xcb\xe9\x0e\xf2\xde\x97\x62\xcc\x75\x2d\x79\xf9\xf9\xa5\x5a\xcc\xa4\xe9\xb8\x98\x93\xc7\x32\x79\x83\x59\xac\xe3\xd7\x02\x7c\x98\x83\xe2\x30\xd5\x49\x3e\xce\x1c\xca\xb9\x59\x62\x84\xbd\x4a\x5e\xa1\x7a\x9a\xad\x66\x6b\x26\xcd\x8f\x89\xaa\x32\xab\x4d\x89\xfb\xc0\xda\x46\x0c\x37\xbd\x1f\xde\x77\x9f\x7c\x00\xc2\x81\x7f\x81\x44\x7d\xa3\xcd\x6c\xd9\xfb\xa2\x10\xbc\xd3\xe1\xf9\x3e\xe8\x04\x76\x91\x3f\xf0\x09\xe8\xab\xd6\xe3\xc9\x87\xb9\x56\xfa\xc3\x6d\xc3\xbb\x05\x35\xf5\x7f\xec\x95\xd2\x8e\x35\x16\xf3\xdf\x79\x99\x8c\x78\x87\x0e\xab\xbe\x0d\x80\x32\x8d\x0b\x86\x67\xc9\x46\x23\x84\x58\x1f\x23\x26\xcc\x44\xd4\xd9\x2c\x50\x76\x76\x44\x87\x2c\x0e\xa6\x8a\x8c\x96\x50\xc3\x68\x13\x5e\xeb\x83\xad\xc5\x1f\xae\xde\xd1\x3a\xa4\x64\x44\xe4\x5d\xb5\xc1\x53\x7f\xac\x26\xb0\x1f\xab\xdc\x98\x24\x2d\xb6\xdf\x4b\x8a\x9b\xcb\xf7\xa1\xca\x21\x81\x42\x88\xe5\xd1\x60\x01\xb8\x3a\x9b\x67\x53\x53\xc8\xfd\x68\x3b\x1e\xb8\x4d\xa7\xe2\xe9\x04\x7c\xec\x01\xc7\xd3\xba\x08\x01\xe2\xab\xaf\xaa\x4f\xbe\x32\xe1\x7a\xea\x79\xb8\x84\xde\x9a\x19\xa2\xf8\x09\xd6\x69\x5a\x84\xb2\xf4\x47\x2e\x98\xde\x1e\xd8\x37\x07\x6c\x37\xdd\xd0\x80\xa9\x35\x27\x04\x1c\x6d\xe8\x84\xb9\x66\x73\xc3\xe5\x82\x77\x5b\x53\x5c\xaa\x41\x2c\x9c\x54\xfb\xf3\xf5\xe3\xb6\x4f\xb9\x94\x45\x51\x3c\xfd\x2d\xa1\xfe\xab\xd4\xf2\x4d\x94\x14\x65\x8f\x37\x54\x73\x4d\x43\x73\x1e\x2c\x3e\x84\x46\x36\x0f\x9b\x0d\xd0\x02\xef\x24\x09\x7d\x9f\x4b\xfd\x87\xb4\x58\xfc\x83\xf6\x8a\xe8\xaf\x7d\x15\xcd\xa7\x27\x5f\xd6\x1f\x08\xbe\xbe\x02\x00\xa3\x80\x8b\x84\x66\xdb\x16\x70\xa9\x50\xda\xda\xbd\x79\x0e\x6e\xa7\xef\x99\x2b\x47\xe3\xc8\xbe\xce\xad\x0f\x57\x2f\xbc\xf6\x04\xc6\xb6\x49\x83\x63\x9b\x3a\x8d\xc9\xb2\x79\xad\xa5\x8c\xe1\xda\xe5\xbd\xdd\x7a\xa8\xf4\x22\x55\x5e\x9a\xfa\xde\x23\x84\x7c\x17\xee\xde\xea\x37\x83\xb9\xa1\x2f\x2a\xf4\xfe\x02\x36\x29\x3c\xcb\xc0\x2c\x07\x99\x6d\xd0\xb8\x84\x1b\x3f\xf2\xaa\x78\x7f\x24\x1b\xb4\x5b\x2e\x0b\x44\x06\x2d\x6b\x59\x90\xe9\x4c\x64\x73\x0f\x16\x92\x20\xa0\x43\xf9\x8e\x69\x5a\xc0\x7f\x5b\x69\x59\x10\x14\x9d\x7b\x60\x0e\xe3\x67\x51\x4e\xa2\xcc\x52\x33\xf1\x5f\x4b\x5e\xb8\xcb\x1f\xb9\xae\xb0\x5a\xa7\x28\x1e\x84\xac\x74\x53\xd8\x7d\x3c\x02\x40\xb4\x1a\x4c\x87\x40\xe7\xd7\x5b\x12\xc1\xa5\xac\xe0\x99\x98\xa9\x02\x50\x52\x03\x6f\x39\xd6\x98\x68\xa1\x16\x68\x30\x1e\xb6\x03\x74\xad\x8b\x82\xb4\x59\x2d\x23\x41\xfe\x82\x45\x35\x9c\xcb\xac\x52\x5a\x4d\x6a\xb0\xf2\x72\x5f\x03\x91\x4f\xc5\x68\x51\xf0\x7a\xa2\x2a\x67\x30\xb4\xfb\x78\xf7\xab\x27\x5f\x8d\x68\x2d\x45\x63\x75\x90\x94\x2d\x86\x94\x29\x5a\x60\x76\xe5\x47\x83\xfb\x40\x99\x52\x7a\x61\x8d\x46\x0c\x41\x53\x03\x48\x09\x74\xdc\x4d\x53\xbc\x4f\x94\xb0\x69\x78\xd3\x26\x89\x4e\xc9\xcb\xdc\x11\xc1\xab\xe3\xe5\x8b\xc3\xa3\x13\x90\xc3\xf7\xda\x38\x80\xbb\x5f\x7f\xfd\xf5\xe8\x6e\x56\xcf\x8b\x1e\x2a\xda\x3d\x3f\xbc\xfa\xd1\x67\xeb\xcc\xf4\xf7\xd1\x73\x5e\xcf\xe0\xbf\xe7\xcf\x28\xeb\xe5\xab\x1f\xee\xcb\xf9\xe4\xf1\xe3\xc7\x23\x7d\x3b\xed\x91\x94\xc8\xf9\x6f\xb0\x78\xd1\xa6\x25\x7b\xad\xb6\x9b\x9b\xcb\x9c\xd7\x33\x13\x17\x37\xd0\xc4\xe8\xdb\xe9\x5e\x5c\x39\xe0\x65\x9b\xcb\xae\xf3\x2b\x4f\xcb\xb2\x54\x0c\x0d\x74\xbc\x6f\x89\x61\x74\xc1\x3f\x2d\x0d\xb9\xd7\x32\x73\x2d\xdb\xf6\x26\x96\xd6\xf4\x32\x61\x74\x79\x3b\x75\xb6\x8c\x74\x51\x8a\x1a\x14\x9a\x5b\x9a\x8e\x34\x13\xc7\x9d\x4a\x1a\x13\x52\xca\xe6\xd0\x24\xf5\x53\x41\x5d\xd4\xf7\x80\x6c\x92\xbc\x8b\x09\xdf\x01\xa0\xab\x71\x74\xe4\x5c\xb2\x15\x75\xd0\x6a\x41\x70\x7a\x9e\x29\x90\x7b\x51\xcb\x77\x5a\x63\xbd\xc7\x16\xca\x6c\x17\x43\x3e\x44\x59\x57\x6b\x34\x46\x1f\x86\xba\x8e\x1b\x26\x21\x74\x96\x90\x6a\x59\xbc\x00\x3f\xfd\x94\x79\x73\xb0\x89\xaa\x84\x9c\x96\xe7\x70\x21\xef\x05\x4d\xfe\x09\x18\xfc\x42\x70\x40\x24\xbc\x7c\xf5\x43\xd4\x98\xf4\x68\x43\xc6\xef\xd7\xb6\x9f\x7d\x64\x2c\xbd\xb7\x12\x80\x84\x1c\xfa\x3b\x73\xa3\xad\xa4\x5b\xce\xa6\x85\x1a\xf3\x42\xb3\xe7\x97\x87\x8b\x05\x88\x9a\x48\x2a\x7a\x54\x09\x43\x0a\xb9\xd7\xb4\xc4\x33\xc2\xd0\xfc\xde\xb2\xd4\x7c\x22\x7a\x6c\x51\xc9\x5b\x59\x88\xa9\xd0\x6c\x9b\x7c\x29\x83\xf9\xcc\x4a\x96\xb9\x5a\xe9\xbf\x33\xbe\x00\xb4\xa6\xcf\x46\xb0\xd3\x32\x28\xf3\xb9\xa5\x91\x2f\xa1\x94\x67\x2a\xe3\xc5\x53\x5b\x49\xe4\xa3\x7c\x59\x66\x7e\x85\x90\x7e\x3d\x36\xb4\xe1\x7f\xdb\x8c\x33\x44\x0c\xc5\x9d\xc8\x12\xe5\x36\x3d\xd1\xba\x3a\x78\x35\x7d\x0c\x6e\x99\x77\xe1\xff\x27\xf0\xff\x17\x9e\x3b\xd8\x58\xea\x76\xca\xa5\x78\x54\x49\x57\xf9\x8e\x77\xb6\xef\x01\xfb\x4d\x3d\xa9\xa0\x10\xda\x5e\x48\x4e\x2e\x5f\xfd\x00\x66\xa5\x16\xf8\x8d\x84\x9b\xa7\x27\xac\xe0\x19\x98\xa4\x4b\x2b\x9d\x83\x31\xaf\xc4\x12\x14\x71\x2e\x5f\xfd\x70\xe4\x72\x1c\x78\x81\x9c\xf7\xf4\x44\xef\x6e\x56\x20\xb8\x70\xbe\x2b\x26\xe4\xbb\xe2\x3d\x5c\x57\x10\x6c\x2b\xfb\x5f\xb2\xac\x45\x85\xd8\xc1\xb8\x16\x74\x24\x7c\x7c\xc0\xd2\x08\x06\x1b\x79\x16\x53\xb6\x3b\xba\x4e\x4f\xbc\x28\x12\xbd\xf2\xb9\xc2\xc1\x6d\xd9\xab\x1f\xd0\x86\x1e\x10\x66\xec\x2d\x71\x65\x92\xfd\xea\x64\xdf\xa6\x9c\x52\xac\xd8\x1c\x5c\xea\xa2\x85\x1f\x0c\x35\xf0\x5b\x64\xef\x55\x32\xb8\x1b\x3b\xc1\x2d\x99\xe6\x93\x5a\x9a\x2c\x6b\xb5\xe5\x6c\x07\x6b\x5e\x4d\x89\xc9\xb1\x6f\x30\xce\x2e\x16\x76\xe1\xcb\x8b\x53\x20\x0d\xfe\x08\x1a\xea\xdb\x29\x88\x77\xb6\x7b\xae\x07\x3d\xd3\x14\x93\x31\xf0\xdb\x92\x9c\xd4\x64\xf0\xef\xbf\x7b\xeb\x43\x1c\x65\x9a\xb5\xed\x5e\x2e\x6f\x7b\xce\x03\x4d\x3b\xeb\x50\x06\x13\xd4\xfb\x46\xdf\x4e\xbf\x35\x57\x00\x33\xee\xe6\x4e\xfd\xcd\x08\x42\x02\x25\xcf\xdb\x29\x19\xf8\x25\x4b\x9b\xc8\x4a\xe3\xa9\x80\x59\xc8\xc0\x15\x46\xc4\xc7\xed\xa4\xdc\x62\x40\x4c\x2b\x65\xc8\xed\x53\x61\xd4\x84\xee\xf2\x0c\xc7\x52\xe6\x58\x5e\x22\xf1\x26\xd7\x1a\xe1\x68\x98\x31\xa0\x6d\xb9\x83\xfb\x32\x33\x3d\x07\x63\x41\x84\xf3\x9c\xab\x1c\xa1\x4a\x40\x36\x2c\x74\xc6\x17\x02\x60\x8e\xed\x8e\x7b\xae\xf2\x65\x61\x6e\x71\x95\x74\x9a\x5a\xec\x7f\x19\x8a\x0a\x3c\x96\x21\xc5\xe0\x7b\x85\xd7\xd9\xec\xc7\x7a\x5e\xa0\xa3\x72\x76\xc0\x46\xaf\x3f\xea\x7d\xfa\xcd\xb7\xbf\x8c\xfc\xee\x3d\x81\xe2\x9d\xde\x6b\x36\xe3\x15\xcf\x6a\xc4\x6f\x81\x95\x38\x95\xb7\xc2\x7a\x0b\x34\x1b\xda\x34\xa4\xe1\x8a\xc6\x6f\x5a\x4a\x06\x88\x2b\xfe\xe2\x89\x55\x98\xcd\x24\x4b\x2d\xaa\x1a\x49\x4d\xad\xe0\x7c\x82\x72\x88\x64\xd9\x72\xb0\xec\xe5\xb8\x90\x59\xe3\x11\x03\xcb\x32\x9d\x22\xf7\x88\xfe\x6a\xa3\xeb\xca\x5e\x35\x31\xca\xde\xa3\x61\x1c\xd8\x41\x73\x3c\x80\x34\x9b\x52\xbc\x19\xca\x23\x48\xd2\xa0\xf8\xba\xae\x22\xb5\x23\x6c\x82\x2d\x1c\x96\xb4\x95\x33\xa0\xd0\x2e\x17\x77\xa0\xe7\x49\x01\x05\xd7\xf5\xa9\x0f\xb4\x9a\xfc\x36\x1d\x54\x39\x84\xaf\x7d\xca\xfc\x8d\xa9\xd3\x6b\x2f\x9b\x30\xaf\x19\x6a\xb9\x38\x93\xc4\xcc\xd6\x91\xca\xc5\x61\x8d\xc5\x05\x62\x1e\x60\xd6\xbe\xf8\x72\xcf\x1d\x2d\xa3\x11\xfb\xc8\x7d\xd0\x94\x1c\xb0\xde\xa7\xff\xb5\x54\xf5\x7e\xcf\x4b\x6c\x02\x3c\x08\x5b\xca\xdf\xa3\x52\x3e\x4d\x95\xc2\xe7\x8b\x7b\x0a\xf9\x3a\x2a\xa4\x97\x2a\xe4\x2f\x77\x4f\xfe\xb6\xdf\xdb\x07\x53\xd4\xae\x3d\xb0\x8f\xee\x21\xf1\xd1\xa1\xf7\xe9\x5f\xbe\xf8\xba\xb7\xa1\xd6\xbf\x3e\x8e\x6a\xfd\x26\x55\x6b\x71\x4f\xf7\xff\xfa\x24\x2a\xe3\xdb\x54\x19\xd3\xee\x32\x1a\x7c\x70\xdb\x8c\xc2\x89\x1c\xfc\x42\x31\x3c\x0a\x4e\xa8\x9b\x4f\x24\x9d\x07\xb0\x32\xf4\x72\x8c\x2b\xdc\x67\xe9\x53\xfa\xa8\xd0\x70\xe5\xe1\xca\xfa\x9c\xed\x62\x0a\x5b\x9c\x5f\xcc\xa1\x4d\x55\xa2\x25\xec\x3b\x4b\xbd\xef\x69\x01\xdb\x23\x12\xf7\xd6\xd0\x36\x51\xe6\xef\x40\xdf\x62\xa2\xa4\x51\xfa\x53\x2b\xb0\x9e\x35\x9c\xb8\xce\x2a\x89\x98\x17\xbc\xae\x79\x76\xa3\x9b\x3e\xb1\x3e\x7b\x8b\x79\xae\xcc\x7f\x78\xd1\x75\x04\x68\x98\xa2\x34\xec\xd0\xd2\x94\xdc\x3f\x60\x85\x76\x3f\x18\x19\x3c\xf3\x3d\x55\xd5\xf7\x28\x19\x83\x5b\x78\x8b\xcb\x84\xfa\x81\x69\xa7\x97\xb4\xd0\xc4\xd3\x47\x36\x2c\x3c\xad\xce\x91\x9e\xa9\xaa\xce\x64\x95\x2d\x65\xcd\x66\xa2\x58\x68\xb6\x10\xd5\x04\x5f\xa1\x11\x5f\x8b\x1c\x08\xdf\x94\x6a\x45\x6a\xac\xe2\x56\x54\xde\x47\xee\x68\x94\xa0\xe6\x7d\x26\x28\xb0\x58\x13\x49\xaf\xd1\xa9\xaa\xd4\x2c\x70\x49\x81\xbb\x4b\x4d\x6a\x0f\x8b\x30\x41\xc3\x5d\x51\xc9\x8c\xe5\x6a\xce\x64\xae\xa3\x4b\x06\x50\x5c\xd3\xb1\x86\xc5\x56\x40\xaa\x61\xa0\xf6\x63\xef\xa0\xc8\xe6\x04\x72\x8c\x36\xd7\xd8\x47\x99\x25\xaa\x4b\x9b\x5e\xcf\x64\x4d\x77\x14\xd0\x90\x15\x5a\x54\xb7\x02\xd4\x27\x00\x3b\xc1\x42\x46\xc0\x71\x0b\x4b\x00\x44\x39\x0b\xa5\x2a\x06\x2b\x56\xd6\xd6\x4f\x4c\x24\xa7\x29\xf3\x3e\xe3\x73\x55\x4e\xd9\x9c\x97\x6b\x53\x1c\x0a\x5d\xfa\x74\x5e\x69\xf6\xcd\xb8\x8a\x4c\x46\x11\x50\xb2\x16\x15\x37\xc3\xbf\x2a\x24\x48\xc1\x79\xa5\x87\x01\xf7\x48\x98\x16\xe0\x9c\x16\xbc\x2f\xa2\xf5\xe7\xfb\xf8\x71\x43\xf8\xaf\x0e\x66\xf8\x2a\x12\x9c\x35\x79\xdd\xc6\x22\x75\x5f\x78\x38\x79\x06\xc6\xca\xdc\x42\x5e\xcb\x91\xa6\x20\xd9\xa7\x9f\x46\x99\xac\xf0\xc9\xd0\x81\x44\x82\xa1\x89\xbc\xb2\xf7\xd8\xab\x93\x7f\x5c\xbd\x39\x3b\x3f\x3e\xf1\x74\xad\x91\xf4\x55\x20\x9c\xda\x8f\x44\x07\xb1\x40\xb5\x29\x1e\x74\x59\xcc\x5d\xc7\xb4\xf8\xe4\x4e\x64\xf0\xc8\x7d\x52\xde\xca\x4a\x95\xc8\xc4\xf2\xf2\xa5\x16\xc7\xe7\xcf\x03\x4f\x87\xf8\x16\x4b\xc5\x00\xbf\xec\x78\x5e\xfb\x83\xa6\x67\x27\x80\xd4\x7c\xe8\x98\xb3\x10\x70\xed\xbe\xb1\xb0\xd8\x37\x1d\xe3\xd0\x65\x5d\x11\xde\x87\xa8\x01\xf7\x52\xad\xe8\xf2\x68\x65\x6e\x71\xbf\x40\xe6\x16\x07\x79\xb6\xf1\xe8\xf2\x32\x74\x45\x81\x17\x7c\x9e\x65\x62\x51\x5b\x2b\x7f\x78\xbd\xb5\x78\x64\xb2\x64\xcb\x52\xd6\x80\x86\xf1\xd1\xe2\xee\xa3\xa1\x5b\xc0\x52\xbf\x2c\x65\x5d\x08\xed\xc1\x32\xcd\x78\xf0\x52\xce\xc1\x86\xed\xb4\x26\xc4\xb2\x23\xb5\x2c\x03\x2f\x6e\x63\x50\xcf\x39\x9d\xf3\xa9\x38\x5f\xd6\x91\x83\xb7\x20\xea\xb2\x90\x99\x48\xc6\xfc\x24\xf3\x7a\x16\xc6\xdc\x3d\x2d\xc4\x5d\x2b\xe0\x87\x4a\x2d\x17\x51\xe8\x79\x95\xcb\x92\x17\x8d\x88\x4c\x15\xcb\x79\xb3\x8d\x18\xa8\x7d\xc0\x24\xaa\x62\x82\xe5\xaf\xe2\x90\x17\x4a\xcb\x5a\xde\x8a\x38\xf4\x72\x56\xc9\xf2\x26\x0e\x3b\x13\x53\xde\x4e\x79\x6e\xba\xe8\x83\xa6\x95\xcc\x2f\xc2\x3a\x28\xe0\xa4\xcc\x5b\x61\x97\x0b\x5e\xb6\x03\x6b\x5e\xd5\x71\xe8\x11\xf4\x2b\x15\xd6\x2a\x15\x83\xdb\x05\x53\x78\x5c\xf6\x44\x95\xf5\x4f\x42\x4e\x67\x41\x98\xa1\xad\x47\x05\x9f\x2f\xe2\xa0\x1f\x1b\xc9\xd4\x82\x67\xb2\x5e\x07\x01\xf1\x30\xa8\x6a\x31\xe3\xe1\x54\xd4\x7c\x7c\x29\x7f\x0b\xc6\x6e\x25\x73\xb5\x0a\x12\xfc\x06\x6c\x4d\xf0\xad\xd4\xdc\x7e\xe1\x45\xfd\xf2\xd5\x0f\x83\x4a\x14\xbc\x26\x97\x07\xb8\x19\x4c\x3f\x64\x51\x9c\x37\x1b\x34\x29\x94\xca\x5b\xa1\xba\x56\x8b\x44\x60\xa5\x6e\xc4\x31\xd7\x33\x30\xcc\x49\x45\xa8\xc9\x24\x5a\xf3\x18\xf3\xdc\x9c\x49\x85\x74\xce\x0d\x7d\x4c\x47\x1d\xc1\x2e\x40\x31\xd1\x67\x9f\xa5\xce\x9f\x05\x5a\x4c\xde\x8a\x32\x57\xd5\x80\x14\xd1\x32\x0a\xee\x33\x31\xdd\x63\x3f\x89\xf1\x8d\xac\x53\x99\x6f\xc4\x9a\xe9\x7a\x5d\x08\xeb\x4f\x7d\x6a\x2a\xe4\xa5\x06\x4d\xc6\xe3\x25\x6e\xef\x24\x77\xe6\xb3\x51\x5d\x56\x73\xee\x1a\x3f\xaf\xfb\x34\xf0\xc5\x9a\x65\x7c\x2e\x8a\x23\xae\x45\x0e\x55\x98\xf2\xb0\x4d\x57\xa9\xba\x02\x16\x0f\x8b\xfa\x4f\xb1\xde\xb6\xfd\xb9\x11\xeb\xc8\x20\x86\xba\xff\xb9\x89\x80\x4b\xd7\x61\xbd\xfd\x78\x67\x58\xab\x97\x8b\x85\xa8\x4c\x9d\xdb\x3b\x14\xeb\x39\xe3\xdd\x98\xe3\x21\x8d\x08\xdf\x23\x62\xe5\xe6\x7c\x8d\x60\x2f\x0b\xae\xc9\x63\xbe\xeb\xea\x78\xcd\x78\x0e\x90\xa1\x0b\x51\x59\xe7\xa7\xc0\x50\xa8\x09\x4d\x86\x4d\xac\x3d\x45\xb5\x21\x60\x19\x8f\x43\xd0\xeb\xb3\xde\x5c\x9b\xff\x9f\xab\xdf\xcc\x9f\x73\x34\x8e\x1f\xb1\x97\xf0\xcc\x8a\x82\xe5\xe1\x8d\x58\x6b\x36\x13\x95\x00\xa5\x1c\x90\x62\xe0\x73\x71\x29\x8b\x02\x30\xab\x06\xb2\x64\x85\x52\x0b\x72\x29\x7d\x7a\xf2\x77\x36\x55\x78\x99\xe7\xe5\x16\x3c\xaf\x4d\x64\x29\x6b\x01\xa9\xfa\x1e\xa9\xa5\x66\xc0\x2e\xd5\x42\x33\x75\x4b\xcf\x81\x86\x73\x82\x1e\x5a\xa7\x25\xac\x56\x6a\xb8\x15\x34\x66\xbb\x79\x3a\xec\x38\x8c\x96\xd8\x89\x23\x4e\x97\x1b\x8b\x54\x22\x13\xe5\xf0\x5b\x1a\xc5\xbe\x6e\xaf\x01\x28\xf5\x17\x00\xf4\x6f\xa5\x55\x0b\x50\x61\x00\xdb\xa7\x9d\xe0\x50\x54\x25\x68\x89\x5b\x64\x0f\x07\xe4\x84\x6b\x94\x65\x5a\xb3\x55\x25\x11\x97\x93\xde\x1f\x51\x54\xe2\x56\x39\xa2\x14\x81\x19\x97\xf3\xb3\x58\xa8\xa9\xcc\x78\x61\x98\x08\x36\x5b\x2f\x66\xa2\xd4\x3b\x7d\xc3\x52\x3a\x85\x50\x60\x59\x4b\x76\x7d\x74\x79\x69\x8d\x83\x87\xcd\x66\x5f\x37\xf9\xce\xd0\x47\x70\x78\x9e\xaf\x31\xc4\x3e\xc4\x5f\xd7\x6a\xf1\x9c\x57\x53\x59\x5e\x0f\x53\x5e\xf7\xe3\xac\x18\xe4\xf2\xee\x3e\x5e\xdc\x5d\xa7\x2f\x5e\x88\x16\x09\xba\xb0\xd8\x7f\xab\x3d\x5c\xcf\x58\x2e\xe7\xa2\xd4\xa0\x66\xcc\x51\x27\xb8\x71\x2b\x73\x4a\xa5\x97\x26\x2b\x7a\xb3\x0f\x1c\x59\xf7\x99\xd4\x47\x4b\x5d\xab\x79\xec\xed\x97\x20\xc5\xed\x1d\xaa\x77\x2b\x48\x15\x2c\x0f\x38\xa6\x80\x55\xda\x61\x19\x2f\x0a\xdc\x12\x4c\x4b\x82\x88\xa4\x77\xdf\x99\x2a\x9c\x94\xcb\x6a\xf8\xda\xab\xa4\x53\xf6\xf4\xe0\x2e\xf0\xbe\xfe\x2b\x1a\x07\xc4\xb2\x5e\x14\x1a\x83\xbd\xe6\xda\x3b\xf9\x64\xf8\x52\x82\x4a\xd7\x39\xaf\x39\xb3\xaf\xd1\x6b\x50\xc5\xc1\xc2\x2c\xea\xeb\x58\xa2\x07\x7d\x33\x19\xc8\x8c\x19\xba\x32\x76\x28\xc3\xbc\x96\x19\xdb\x3e\x45\x3d\xd6\xb2\x57\xb3\x4a\x2c\x2a\xd4\xe6\xd8\xd9\x8b\x1f\xa8\x57\xab\xd5\x50\xad\xb8\x5e\xc0\x93\x27\x5c\xea\x87\x8b\xd9\x62\xf4\x8f\xcb\xcb\x37\x4f\x65\x51\x8b\xea\xcd\xc9\x2d\x37\xb3\xf3\xe6\x68\x26\x78\xfd\xe6\x72\x26\x44\xed\xcb\xa0\x22\xea\x99\xb9\xaa\x19\xbe\x74\x98\xa9\xe1\xf2\x66\xf4\xe4\xf1\xe3\xbf\x8d\x76\x77\x47\x4f\xfe\x3a\x5a\x16\xb5\xe1\xee\xc4\xe0\x4e\xeb\x41\xa6\xf5\x00\x3b\x23\x55\x39\x8a\x35\x12\x00\x9f\xb9\x64\xff\xb8\xbc\x64\x30\xdc\x86\xa5\xb4\xd7\x30\x1e\xbc\xc6\x99\x6e\xbb\x32\xf0\xf6\x66\x67\xc9\xbe\x3c\x15\x26\x0f\xa8\xc4\x4c\x41\x94\x5d\xb1\x5c\xea\x6c\xa9\x4d\x47\x18\x1f\xab\x65\xcd\x66\xe6\x46\x1d\x69\xcc\xd1\x24\x55\x4b\x5d\xb3\x97\x17\xcf\x34\x9b\x2b\x74\xfd\xa5\xaa\x15\xaf\xf2\x21\xb8\xa7\xfb\xcb\x93\xdd\xdd\xaf\xbe\x7e\xbc\x6b\x05\x84\x52\x9f\x80\x52\xf7\x01\x8b\xc1\xb7\xbd\x18\x20\x00\xc2\x0f\x85\x04\x21\x3e\xbe\xd5\xf4\xa1\xc2\x9a\x88\x2a\x3d\x27\xb2\x21\x77\xed\xf1\x72\xb7\xaf\x87\x71\x5d\x24\x73\xf0\xee\xf2\x1f\x59\x78\xfe\x47\x2d\x42\xdb\xc4\x1a\x40\x60\x3f\xc0\xb9\x68\x90\xc3\x12\xc0\x3d\x1a\x0d\xc4\xf2\x3f\x67\xbd\xc5\x1d\x0a\xf4\x5e\x54\x02\x1f\xb3\xad\x21\x10\x44\x31\xbd\x9c\x98\x93\x75\x02\x3a\x9b\x58\xac\xbd\x3f\x34\x64\x52\xdb\x01\x48\xfb\xb0\xae\xe4\x7c\xdb\x2b\x0b\xac\x50\xdd\x52\xe6\x40\x0e\xd8\x01\x6a\xd5\xdb\xe7\x9f\x8f\x77\xc9\xfd\xf4\x68\x64\x4e\x41\x60\x07\x26\xaa\x9a\xf7\xc0\xf5\x05\x6a\x3f\x59\xb8\x48\xe1\xdc\xec\xd1\x19\xea\xc9\x70\xc6\x17\xb2\x46\x8a\x45\x13\x3d\xe6\xf9\x2b\x38\x84\x05\x56\x7c\xc6\xe7\xe2\x05\xc0\x29\x97\xec\x80\x8d\xfe\xcf\xf6\x77\x7b\x2b\x38\x7e\x7f\x9f\xab\xdf\x7e\x57\x3b\xaf\x0f\x07\xff\x1b\x64\xef\x28\xa4\xf1\x54\xcf\x56\x43\x80\x05\x80\xa9\xce\x99\x16\x73\x99\xa9\x02\x70\xa2\xa9\x3a\x4f\xee\x7e\x92\xf5\xec\xd2\x26\x08\x2a\xdd\xff\x59\x7f\xf6\xf1\x28\x30\x41\xab\xca\xa0\x75\xda\x01\x68\x34\x22\x1d\x02\x47\x33\xf6\xa9\xaa\xce\xf8\x59\xc3\x91\x6a\x23\xc1\x29\x9e\xf9\xeb\x46\xaa\x20\xd9\x8f\x70\x6c\x19\x46\xd9\x35\x25\xbe\x36\xc7\x6e\x6c\x03\x23\xda\x66\x07\x3a\xd7\x65\x33\x21\xad\xcb\x0e\x5c\x36\x7c\xf9\x49\x66\x89\x54\x75\x5b\xda\xa4\xa5\x43\x0e\xa4\x09\x74\x47\xdf\x27\x7a\xc8\x8e\x65\x0e\x34\x7c\x2e\x78\xc9\x3e\xd1\xdf\x01\x3a\x0b\x76\x0e\xd8\x53\xf9\x9b\x70\xd5\x61\xd3\x7d\xaf\x09\x9f\xe5\x6d\x34\x70\xdf\x27\x96\xd8\xff\xfc\x91\xa3\x7b\x84\xe3\x73\xdf\x6d\x24\xcd\xff\x1b\xb8\x70\x88\xd6\xe6\xde\xbf\xbd\x7b\xdf\xf0\x76\xec\xa7\xc4\x08\x13\x5f\x71\xcf\x40\x13\xf0\x4c\x63\xa4\x49\xff\x30\x1e\x6a\x42\x8e\x81\xb8\x07\x0f\x76\x94\x69\xd3\x70\x7f\x74\x19\x0f\xe9\x43\xc8\xcc\x90\x7d\x64\x28\xf6\x55\xb5\x66\x1f\x7d\xa2\xf7\xd8\x27\xfa\x23\xe7\x45\x25\x18\x7e\x64\x5c\x2b\x01\x3a\x71\xdb\xf7\x12\xa5\x3e\xeb\xf5\x1e\x3e\x0d\xa7\xfa\x8c\x9f\xbd\xcf\xf0\x07\x74\xea\x01\x83\x19\x53\xb5\xee\x45\x7b\x7d\xc6\xcf\xc0\x18\x08\x18\x2e\x04\x9b\x24\xd8\x7f\xb2\x5a\x00\x44\x27\xc3\xd8\xc7\x6b\x38\x1c\xb0\x07\x77\xdd\xd2\xd1\xf7\xec\x7f\x44\x86\x1f\x36\x08\x4d\xca\xbd\x61\x24\x6c\xd2\x3f\x67\x38\x5a\x27\xf8\x3b\x0c\x00\x6c\x78\xe0\x53\xcf\x27\xdb\xbd\x41\x6f\x87\x7d\xcb\x06\x0d\x84\x84\xc4\x01\xd4\x24\x9d\x2d\x90\xaf\x0d\xc7\xfb\xb0\x16\xba\x46\x0a\x1a\xd7\x93\xa2\xd7\x0f\xa9\x68\xf3\x1e\xc2\xea\x90\x8c\xc4\xf5\x75\xe4\xeb\x18\xb4\xd6\x93\x63\x27\x8f\x18\x4b\xaf\xa5\xd9\x95\xad\xfa\x9b\x2d\x80\xbd\xbb\xb1\xe6\x18\x43\x4d\xea\xa7\x20\x2a\x78\x40\xc1\x76\xf1\xdd\x57\xba\x7f\x23\xe8\xe0\x0d\x41\xa8\x1d\x07\xf9\xfb\xfb\xb9\x75\x8e\x81\x80\x50\xb9\xe0\x05\x5e\xee\xea\x59\x43\xe0\x4d\xb6\x95\x94\x0f\x6e\x2b\xa8\x20\xa3\x03\x95\x7b\x73\xc9\x94\xda\xa9\x1f\xd3\x9b\xb5\xf8\xaf\xa5\xbc\xe5\x05\x59\x90\xd6\xf6\xfa\x0f\xaf\x44\xee\xb2\x38\x15\x25\x08\x4b\x40\x04\x04\xaf\x5c\xd5\x00\xf4\xe4\xd1\xb6\x14\x6d\x1c\x6b\x36\x5e\x0f\x40\x6a\xa4\xed\x76\xd5\xd6\x9c\x58\x8b\x6c\x59\x19\x52\x02\x86\x67\xe0\xff\x03\x0c\xf7\xc0\xc8\xd7\x5c\x2b\xc9\x1a\x28\x00\x3a\x00\x0c\x2c\xeb\xad\x44\x91\xa5\x16\x07\xb9\x5c\xa6\xe6\x0b\x5e\x49\x6d\xce\x88\x53\xe8\x14\xa8\xe1\x2f\x49\x5e\x75\x7c\xf2\x0a\x55\xa5\x2e\x2f\x62\x7f\x3f\x11\x80\x22\x8c\xcf\xb1\xbf\xb8\x9b\x5e\x3c\x55\x15\xcc\x81\xde\x86\x41\x88\xdc\xfd\xe2\x8b\x44\x65\x0d\x66\xbd\x2d\x07\xda\x28\x81\x94\x53\x54\x41\xb8\x03\xda\xd2\x8e\x53\x92\x25\x0b\x0b\xb6\xeb\xf9\x11\x06\x36\xcf\x69\x97\x6f\xe7\x21\xc0\xe0\xae\x26\x4b\x3c\xb1\xd0\xd7\xae\x94\x08\xa4\x3c\x48\xd9\x32\x5e\xb2\xd7\xc6\xc6\x1d\xee\xc0\x77\x24\x20\x6f\x86\xbe\x81\x5b\x35\xff\x2c\x14\x8c\xd2\xe7\x07\xc1\xd0\x7c\x4e\xe2\x22\x5e\x07\x5c\xa7\xef\xa4\x39\xec\xf7\x7a\x9d\xc5\x24\x44\x2c\x2e\x6f\x3f\xe8\x79\x42\xd8\xe2\x5c\x9a\xb1\x78\xa2\xbc\x92\x44\x88\xd4\x65\xf5\x6c\x7c\xf5\xbf\xff\xee\xf0\xd3\xde\xc6\xaf\xc6\x3a\xb0\x5f\x31\xf3\xed\xd0\x12\x70\xf0\xd1\x76\x0a\x5e\xd1\x18\x3b\x9d\x78\x49\x5c\x20\x2c\x63\x1c\x24\xa8\xbd\x1e\xdb\x46\xe3\x6b\x52\x24\xea\x93\x89\x42\x85\x28\x50\x20\x76\x6d\x30\xa6\x56\xcc\x03\x0e\x39\xde\xe5\x1d\x17\x2d\x69\x49\x9e\xad\xe3\x8d\x11\x38\xe8\xa3\xbd\x80\x6f\x78\x98\xb6\x79\xe4\xb9\x55\x67\xdf\x6b\x35\xd2\xb0\x87\x2d\xff\x77\x5c\xfc\xdd\x88\x9f\xef\xb3\x54\xa3\x1d\x98\x16\xd0\x79\xea\x1f\x92\xec\xd6\xba\x0b\x37\xd9\xc6\x63\x20\xb1\x4b\x1f\xb2\xae\xe3\xf2\x13\xcb\x3b\xda\xd5\x78\x27\x03\x35\xed\x42\xf1\x3a\x38\x3b\x83\x68\xd6\xcb\xb4\x06\x07\x80\xbd\xa6\xa9\x51\xf7\x50\x40\xfe\xa1\x16\x75\x7b\x96\xc2\x1d\x98\x46\x2d\x81\xf8\xa0\x23\x76\x92\x5a\xe6\x49\x08\xc7\xf1\x54\xa1\xd1\x45\xdf\x79\x75\xab\xf9\xd4\xc9\x3f\xd4\x5c\x82\x78\x44\x56\x2c\x2b\x94\x39\x38\xf8\x14\x7c\x73\xdc\x08\xb1\x60\x1c\x55\x33\x0a\xa9\xc1\xe4\x73\x0b\x04\x9b\x26\x15\xe9\x9c\x0c\x40\x91\xca\x94\x37\xc4\x43\xd9\x14\x57\x8b\xfc\xc8\x14\x75\x65\xaa\xa1\x47\xdf\x4a\xf0\xe0\xad\x95\xeb\xf0\xe9\xb6\x8a\xde\x55\xfd\x87\x98\x8f\x45\xf0\xe8\x38\x0b\xd2\xc9\xf9\x34\xf8\x40\xef\x01\xf6\xf3\x46\xac\xa7\xa2\x8c\x1e\x15\x83\xe7\xd5\xb9\xa8\x83\x96\xc0\x2e\x0e\x9e\xce\xd4\xb2\x0a\x5f\x95\xeb\x8a\x67\x41\xde\x95\x6d\xaa\x55\xbc\xee\x18\xda\x8c\x97\x4e\xe7\xd8\x59\x64\x22\x33\x31\xe3\xda\x63\x1a\x2c\x96\xd5\xc2\x0c\x26\xd7\xa6\xb0\xeb\xe6\xd8\x5d\x33\x71\x07\xef\xee\xc0\x70\x5c\xcf\x45\xb9\x94\xb5\x98\x5f\xdb\xa9\x43\x4b\x1c\xd4\x6c\xae\x35\x4c\x1f\xb0\x27\x7c\x4a\x93\x71\xab\x64\x4e\x94\x8b\xe6\xc2\x19\xec\xc3\x48\x60\x79\xb6\x4b\xfd\xd6\xe4\xed\xec\x7b\x93\x1d\x34\xd4\x79\xf3\x86\x4c\x72\x3c\x95\x33\x6c\x4a\x55\xc3\xae\x46\xc4\xf8\x9a\x4f\x43\xdb\xf7\x80\xc4\x79\x80\xdd\x58\xa8\x18\x58\x2f\x90\x14\x1f\xa4\xe3\x80\x20\x7d\x70\x70\x4d\xb2\x5e\x62\x78\x26\x04\x60\x82\xd6\xe0\xa4\xed\x3f\xb4\xe6\x93\x71\x8f\x5f\xd7\x7c\xea\xae\xe0\x8f\x1a\x20\xe5\x09\x0f\x75\xef\x83\x83\xf1\x09\xf9\x92\x00\xed\x79\x07\x21\xc2\xa7\xa8\x11\xb7\xd4\x35\x2b\xc9\x3c\x1e\x66\xea\xda\x56\x7f\xcd\x4a\xd3\x03\x2d\x58\x27\x92\x06\x5e\xae\x60\x3c\x83\xbb\x55\x64\x8c\xdb\xb0\x41\xec\xe8\x40\x83\x31\xe9\x1a\x89\x74\x07\x8f\xac\x79\xb0\x16\xb5\xb5\xac\x0f\x7a\xa1\x2a\x76\xbd\xb1\xf6\xeb\xb6\x01\xf1\x23\x7b\x3f\xb9\x6f\xdc\x0f\x58\x0f\x4f\x58\x90\x6d\xd3\x3a\x84\x87\xd4\x0d\xf9\x3a\xf0\x4a\x36\x37\xd2\x61\x1f\x90\x76\x34\x78\x67\xb9\xfe\x17\x2e\xf8\x3d\x36\x1c\x0e\xdf\x5e\x0f\xd9\x8b\x42\x18\x82\x77\x2b\xb5\xac\x93\x2e\x85\x5d\xbd\x83\xa0\xa2\x81\x16\x26\xa6\x14\x15\x68\x43\x22\x7f\x63\xe1\x08\x2a\xd4\x86\x69\x0e\xd2\xdb\x2e\x2f\x09\xcb\xc5\xa2\x12\x5a\x93\xe2\xce\x49\x8e\xaf\x8e\x3f\x61\x22\xc3\x60\x11\x50\x53\x16\x27\x00\xab\xa9\xe4\xac\xb7\xbd\x46\x5f\x37\xf2\x22\x7e\x29\x09\x96\x74\x38\xf9\x73\x5e\xf2\x29\x5e\x66\xc0\xa6\x1e\xdd\x6e\xd0\x55\xa2\x54\x2b\xb6\x56\xcb\xca\xa2\x6f\xca\xb1\x2c\xcc\xcd\xa5\x56\x6c\xba\xe4\x15\x2f\x6b\x41\x2f\x76\x25\x2d\x2b\x28\x03\x0f\x18\x32\xa1\xa8\x0c\x4f\x66\x2f\x5a\xc5\xda\xab\x98\x9a\x6b\xdc\x72\x51\xc8\x0c\xa1\x5c\xec\xbb\x12\x94\xe0\x7c\xe6\xa0\x82\x12\xbc\x25\xa9\x92\x17\xb8\x9f\x9a\x62\x8a\x00\x08\x87\xf8\xaf\xd6\xb3\x4e\x1c\xeb\x17\x65\x7a\xa5\x01\x1e\x38\x24\x26\x04\x22\x6c\xbf\x21\x12\x73\xbe\x58\xc0\x33\x53\xa5\xe6\x31\x0f\x2a\x11\xd3\x08\xc5\x79\x7d\xf2\x5f\x4a\x8a\xab\xe8\x12\xf5\x8e\xcf\x01\x77\x0b\xb2\x1d\xfc\xeb\x5f\x73\x78\xbb\xbd\x40\x6d\x19\xbd\xe0\xe0\xaa\xe6\x73\xf6\x73\x4f\xcc\x7f\xee\xbd\x7d\x8b\x4f\x95\x88\xa2\xf1\x1f\x97\xff\x68\xf5\x3d\x58\x6d\x11\x60\x0a\xf1\x2c\x47\x76\x41\x18\x7a\x8e\x7c\x49\x40\xb9\x41\xc4\x80\xe1\xb1\x80\xc6\x8c\x8e\x17\xd1\xd0\x05\x20\x1a\x45\xa9\x23\x37\x29\x76\x0a\x9c\x0d\x23\x96\x1a\xa8\xcf\x5e\x01\x8a\x07\x3a\x52\x42\xbd\x50\x30\xdd\x31\x4b\x12\xcd\x3c\x1d\x7e\xc9\xd0\x66\xf9\xc9\x7a\x42\x9a\x4b\xb0\xd0\x91\x3a\xe0\x63\x6a\xa5\xd8\x7c\x99\xcd\x42\x43\x68\x9c\x21\x72\xd2\x83\x6a\xb7\xd3\x0a\x6d\xe5\x6c\x1b\x18\x2f\x40\x43\xb3\x96\xb7\x02\x41\xec\x90\x3d\x40\x85\x07\x67\x63\x87\x3e\xc0\xc4\x0a\x2d\x8b\xb5\xb7\xa2\xce\x54\x79\xab\x8a\x65\x6d\x71\xef\xc2\x87\xd9\x2f\xb2\x21\xb9\x85\x94\x6a\xb4\x12\x63\x0f\x3e\x32\x32\x8c\xd6\x28\x83\x29\x19\xfd\x05\xff\x0e\x6c\x7f\x07\x99\xaa\xc4\x20\x53\xa5\xe1\x12\xd0\xdd\x2c\x9a\x72\x02\xff\x01\x64\x65\x70\x37\x8f\x3d\x60\x82\x53\xcd\xc1\xa2\x52\x13\x59\xc4\x8e\x2f\x27\xaa\xac\x07\x13\x9e\x75\x84\x0e\x74\x95\x75\xc4\x2c\x2b\xd9\x11\x83\xe4\xad\x23\xd2\x0c\x5a\xec\x9d\x53\x6a\xb3\x5c\x07\xd3\x62\xbd\x68\x99\xa2\xba\x17\xaa\x2e\x0b\x54\x2b\xe2\x74\x5a\x8f\x66\x5b\xbe\xf0\xbb\x0b\x39\xd1\x9e\x09\x1d\x64\x08\xc8\xd3\xdb\x63\x8f\xfb\xf8\x64\x87\x46\xcc\x18\x8b\x3e\x1c\x35\xc4\xfa\x40\x02\xaf\xee\xc8\x33\x93\x79\x2e\xca\x8e\x48\x12\xa9\x76\xc4\xde\x88\x35\x6a\x87\x2f\xeb\x46\x9d\x05\x1f\x8b\x22\x0e\xaa\x54\x21\x72\x41\xfa\xf2\xaa\xb4\x91\x66\xd1\xcb\x7c\x2a\x6a\xe6\xfc\xc6\x68\x97\x87\x2f\x6b\x65\x81\xa6\xe2\xd2\xac\xa3\xf8\x28\x50\xdc\x2d\x78\x99\x37\x43\x67\x5c\x2f\xd4\x62\xb9\x68\xb4\x50\xdc\x36\x5b\x38\x57\x39\x6f\x06\x99\xcb\x7c\x21\x4b\x91\x08\x46\x0c\x08\x33\xb4\x71\xa4\xaa\xa4\x28\x71\x11\xc7\x11\x81\xc9\x7e\x23\xc2\x9c\x8b\xcd\x66\x57\x82\xe7\x86\x7b\x69\x86\xa2\x61\x6a\x1c\x6a\x31\x1e\x1b\xa1\xaa\xaa\xe3\x10\x20\xd2\x73\x7e\x97\x0a\x95\x65\x22\xb4\x54\xab\x44\x28\xb8\xb7\xf7\xf3\xf7\xcc\x10\x96\x0b\x31\x35\x54\x38\x35\x89\xb5\x9a\xcb\x2c\x2e\x66\xbc\xd4\x8d\x8e\x15\xf2\x56\x34\xbb\x5a\x88\x5b\x5e\x86\x35\x1d\x57\x7c\x3a\xe0\x65\x3e\x38\x36\xa7\x53\xa2\xae\xdc\xec\x1a\x00\xee\x88\xcb\x9a\x56\x7c\x3c\xf6\xe3\x03\xf0\x99\x05\x0a\x56\x67\x32\x59\x12\xcf\x0c\xbd\x34\x0b\x56\x94\x79\xd0\x0a\x5a\x7e\xaa\xc8\xd4\x32\x11\x0a\x67\x4a\x2b\x54\x2f\x78\xd9\x0c\x04\x18\x83\xe6\x56\x85\xfd\x31\x16\xf9\xb8\x31\x3a\xa2\xaa\x54\x35\x17\x5a\xf3\x69\x63\x94\x26\x85\x5a\xd5\x2a\xb1\xfb\x8a\x76\x29\x6a\x55\x36\x2a\x5c\x98\x9b\x17\xf8\x32\x8e\xb7\xea\x2a\xd1\xbb\x4a\xad\x12\xbd\xab\xd4\xaa\xdd\x3b\x2d\x6a\x2d\x7f\x83\x96\xc2\x8d\xd3\xbf\xcd\xc7\x64\xed\x2d\xe2\x1c\x54\x87\x17\xa7\x87\x88\x54\xc2\xd0\x12\x6e\xbb\xf7\x7f\xb6\x4d\x49\x3b\x83\xd7\x86\x31\x3a\xbc\xba\xba\x38\xfd\xfe\xe5\xd5\x09\x98\x8e\xbf\x39\xfa\xf1\xf0\x02\x3c\x3a\x7e\xf6\x71\x6f\x27\x28\xe2\x88\xcf\x45\x91\x2e\x07\x14\x1d\x1e\x50\x16\x14\x16\xcb\xa1\xd8\x81\x55\x46\x5c\x54\xaa\x56\x86\x27\x68\x48\xaa\xf6\x63\xb0\x80\x08\x28\x6d\x3b\x14\x92\x99\x53\x37\x85\x01\x5a\x19\x76\xa4\x9d\x73\x7f\x2b\x30\xf9\x33\x79\x3d\x32\x38\x7e\xef\x59\x27\x44\x49\x1f\x68\x20\x9e\x71\x4c\x50\xe9\x98\x13\xc3\x03\xc5\x1d\x18\x66\xbc\x28\xb6\x9b\x33\x64\xf3\xb8\x57\x62\x1f\x15\x3f\xc8\xb7\xce\x31\xaa\xc4\x4f\x4a\xe2\x75\xca\x1e\x74\x56\x18\x05\x0b\xa7\x17\xbf\x96\x7f\xb9\x33\xac\xd5\x33\xb5\xb2\x6f\xe9\x5e\xda\x4e\x4a\x32\x94\x39\x3e\x30\x9b\x72\x44\x5b\x8b\x61\x7a\x5d\x8d\x7b\x24\xcf\xb5\x2c\x4d\xe8\x5e\xb1\x84\x64\x83\xe0\xf9\x03\x95\x71\x48\xfd\xcb\x30\x63\xf8\xcc\x60\x38\xa8\x9b\x52\xad\x4a\x76\x7c\xfe\xdc\x96\x74\x7c\xfe\x3c\xe0\x8d\xc9\x0b\x2d\xfa\x06\x08\x1e\x29\x9b\x35\x78\x4c\xe1\xa8\x6b\x4d\xc1\x7c\xf3\x11\xf4\x94\x8a\x83\x1d\xe4\x5f\x6b\xae\x3f\xd1\xd7\xc3\x46\xa0\x66\x13\x55\x14\x6a\x85\xfa\x9f\xa4\x9f\x63\x9b\x61\xaf\xfc\xa0\xdc\xb9\x12\x95\xe1\x6b\x52\x4f\xa4\x2d\xd7\x3d\xac\x63\x6d\x34\x3c\x72\x34\x96\x88\x15\x36\x82\xa6\x60\x3c\x10\x3a\xd2\x33\xa5\xa6\xec\x33\xbd\x9c\x4e\x85\xae\xc9\xc7\x2c\x05\xb3\x5b\x51\x69\x7c\xd8\x61\x0d\xef\xcd\xc1\x28\xbe\xe7\xe8\x45\xfa\x1e\x26\x28\xd2\x9d\xf1\xc5\xff\x49\x83\x13\xef\xa2\x8e\x0d\x54\xd8\xbd\x91\x9f\x79\xf7\xd4\x5d\x7b\x46\xd7\xbc\xcc\x79\x95\x3f\x68\xd3\xc4\x25\x9b\xad\xd3\xa8\xeb\xff\xde\x0d\x14\xf7\x33\xb5\x83\x1e\x3a\x23\x01\xeb\xfe\x67\xaf\xd7\xb0\xd1\xdd\x0b\xf6\x65\x89\xa3\xf5\xee\x0b\x36\x2c\xff\xcf\x5c\xb1\x51\x4c\x78\x32\x99\x72\x69\xbf\x99\xd6\x93\xc8\x75\xbd\x68\xbb\x24\xa7\x19\xb6\x58\xad\xaf\x7f\x89\x9d\xcd\xdd\x88\xb5\x93\xa4\x85\x7b\x41\x6a\x90\xe5\xa2\x92\x6b\xe3\x10\x84\x6a\x6e\x44\xf8\x50\xf2\x88\xd2\x07\xef\xb0\x41\xbd\xc3\xc5\x52\xcf\xb6\x7d\x8e\x08\x20\x73\x89\xb3\x60\x12\xe2\xa3\x31\x58\x33\x07\x99\xe7\x7c\x91\xb4\x06\xf0\xda\xb2\xd7\xd6\x6d\x13\x38\x83\x43\x61\xc2\xce\xf0\x57\x25\xcb\xed\x5e\x9f\xf5\x3c\x00\x40\x54\x2e\x81\x23\x1e\x1c\x00\x3a\xe2\xbf\x92\x6a\x31\xa7\xc1\xfe\xc0\x1a\x3e\x41\x3f\xa3\x9f\xe8\x6f\xf1\x8d\x04\x44\x4d\x4f\x41\x9d\x00\xae\x8b\x7d\xa6\x85\x68\x08\x05\xa9\xda\x01\xdd\x4f\xd4\x02\x96\x52\xab\xe3\x88\x7c\xd4\xb9\x9e\x02\xdd\x8a\x54\x3f\xbe\x7d\x87\x5e\xe8\x7f\x67\x37\x36\xb1\x58\x52\x24\x96\x71\xf8\x88\x16\x08\xa4\x82\x64\xe9\x87\x84\x7b\x37\x89\x53\x22\x09\xfd\x83\x9c\x19\x9e\xd0\x2b\xb9\x76\xf2\xa2\x1f\xef\xfe\x7b\xb9\x51\x29\xf4\xc7\xbb\xe9\xc1\x02\x60\x29\x00\x42\x82\x47\xb1\x9e\x03\x9b\x82\x30\x87\x4d\x1c\x07\x93\xcf\xca\xd4\x50\x86\xaf\x0b\xae\xa1\xee\xbd\xc4\x6b\x17\x39\x7f\x5f\xcd\xf1\xb4\x85\x26\xc6\xd9\x53\x3d\xd7\xf2\x83\xa0\x39\xbe\x9a\xa6\xe7\x89\x84\x0e\x5b\x88\xf7\xae\x90\x6a\xdb\xf3\xc4\x9c\x94\x63\x01\x2d\xa4\xc5\x7e\xa4\x4a\x2d\x73\x51\x59\x88\x61\x8b\xd5\x8e\xbe\xb2\xd0\x49\x72\xe4\xaf\x02\x20\xbf\x15\xbb\x36\x2d\xbe\x26\x21\xb5\x62\x59\x21\x78\x13\xfd\x50\x55\xec\xda\x3d\x4a\x5d\x93\xf6\x7b\x80\x58\xec\x05\x7b\xf4\xb6\x93\xdc\x2f\x66\x81\xa5\x9f\x7e\xff\x9c\x8e\x7b\x44\x97\x07\xf4\x09\x4a\xfa\x00\x1d\x0b\x5e\xa8\x7f\x32\x43\x4e\xf6\x70\x01\x43\x40\x5a\x54\xf0\x14\x44\x78\x4d\x4e\x8a\xdb\x37\x5d\x43\xd8\x53\x65\x8a\xe0\x85\x56\x80\xe2\x0e\x6e\xc4\x6b\x82\x33\x9d\x23\x9e\x8e\xc7\x48\xcd\x38\xf5\xdc\xb0\x4d\xc4\x7c\xc2\xc9\xbe\x05\xee\xdc\x51\xd5\x0a\x7d\x50\x2c\x94\xd6\x72\x5c\x88\xcb\xe0\xc4\xb7\x42\xc4\xd1\x88\x10\x6e\xc8\x32\x7a\x8f\xf5\xf0\x47\xaf\xef\xc2\x00\x35\x40\xf8\xa8\x23\xfc\xee\xe1\xf5\x1e\x82\x06\x94\xa6\x97\x4c\x84\xb8\x9c\x37\x62\x4d\xb1\x5a\xff\xa7\x58\x53\x8c\x21\x0b\x10\x0c\xe2\x31\x08\x33\x77\x92\xc9\xb2\x28\x74\x56\x09\x40\x51\x87\x90\xa7\xcb\xa2\xb8\x84\x10\x4a\x05\x0d\x2a\xa8\x06\x6d\x3e\x34\xfd\x5e\x97\x19\x7c\xae\xcb\x0c\x43\x96\xb5\xf2\xa6\x11\x26\x6a\x59\xab\x23\x17\xe0\xd3\x90\x64\xd1\xa6\xb0\x82\x46\x1f\x0f\xc3\xec\xa2\xe1\xcb\xc5\x4e\x54\xb6\xd4\x14\xf7\xd4\xfc\x76\x31\x8b\x82\xaf\x29\xe2\x45\xc1\xd7\x2e\x5c\xf3\x5b\x5b\xd7\x25\xbf\xc5\x7a\x32\xbe\xa8\x97\x95\x09\xa6\x5f\x18\x2a\x8a\x62\x81\xeb\xca\xc4\x88\xa2\x78\x81\x5f\x2e\x96\x9e\x4d\x28\xf6\x12\xbf\x30\x76\xc6\x0b\x73\xbe\x42\x99\xf6\xb7\x8d\xa1\x89\x35\xbf\x2e\x69\xb6\x48\x92\x0a\xa1\x28\x53\xc5\x50\x07\x6a\x6f\x7f\x62\xb8\x84\xf1\x32\x7f\x70\x41\x64\x05\xd7\xda\xac\x03\xf8\x61\xd6\x1a\xa6\x33\x5f\x32\xb7\xe1\xa7\xc7\x3e\xd4\xac\xda\x76\x7a\x55\x98\xc1\x34\x7f\xdc\x37\x58\x68\x9b\xa0\xcb\x05\xa7\xda\xf1\x79\x0f\x42\x11\x1d\x21\x08\x15\xf4\xe8\xe7\x63\xed\x33\xa0\x4f\x75\x57\xcf\x45\xb9\xb4\x29\xee\xea\xe7\xa2\x5c\xba\xd8\xca\xb6\x81\x44\x73\x61\xb8\xd9\xba\x41\xdc\x33\xa9\x6d\xdd\xaa\xca\x31\x97\xf9\x81\x61\x95\xd2\x5a\x55\x72\x2a\xa1\xfd\xe6\xeb\x1c\xbe\x20\x36\x78\x5e\xd5\xa2\x86\xc7\x55\x7c\xa9\xed\x75\xbc\xf0\x52\xae\x9a\x43\x92\x9a\xdb\x6f\x51\x4b\x18\x48\xf3\xf3\x4a\xd2\x38\x5a\x77\xd3\x66\x46\xec\x4f\x48\x8f\xbf\xfd\x64\x53\xc0\x51\x30\xe7\x14\x44\x2e\x10\x62\xc7\xd5\x14\x2f\x2a\x8c\x10\x15\x86\x48\xf8\x96\xf6\x0b\x1f\x1a\x20\x88\xde\x1c\x20\x5c\xad\xca\x42\x71\x08\xa7\x9f\x18\x5e\xf1\xe9\x94\x66\xcc\xfd\x86\x18\x51\x66\x86\x0e\xef\xb1\x9e\x28\xb3\xab\xf5\x82\xfa\x36\x51\x95\xe9\x97\x19\xae\xa7\x0a\xeb\x9c\xa8\x6a\xbe\x07\x31\x73\xf7\x8d\x6e\xbc\x29\xf4\x39\x7c\xb8\x38\x47\x81\xcc\xc7\xa1\xa7\x42\xe6\xd3\xd7\x6a\xbe\x4e\x82\x9a\xcd\x77\xa9\x2c\x37\x43\x09\xce\x14\xb9\xf0\xf6\x69\x10\x23\x8f\xe2\xaf\xe0\x03\xe3\x0c\x4b\x35\x26\xfb\xff\x1e\x7c\x7d\x0f\x5f\x10\x3b\x13\x3c\x17\x95\x59\x44\xf4\x8b\x42\xf1\x81\xb4\x87\x3f\x30\x0c\xde\x6a\x4c\x18\x3e\xda\x60\xd8\x74\x06\x21\xd3\x19\x7e\x57\x62\x62\xbe\x2b\x31\x71\xdf\x05\x07\x52\x61\x7e\x3e\xe3\x44\x27\xcc\x28\x4e\x54\xd5\x18\x4f\xc3\x3e\x83\x3e\xf0\x1e\xa2\xcd\x9e\x98\xdf\x38\xfa\xe6\x73\x00\x71\xbd\x56\xa4\xcc\x60\x50\xcd\x1f\xfc\x36\xc3\x2f\x71\xd8\xc3\x25\x2e\xa3\x45\x0d\xac\xde\x5c\xe5\x62\x8f\xd8\xbe\xe7\x2a\x17\x14\x53\x8b\x69\x05\xe8\x00\x3d\xf7\x1b\x63\xcc\x38\x49\x1c\x22\x59\x8b\x39\xd6\x54\x8b\x39\x91\x18\xf3\xd3\x30\x15\x14\x6a\x38\x4f\x17\x8e\x23\x63\x7e\x5d\xd0\xe0\x98\xdf\x3a\x53\x30\xe9\xe6\xf7\xa5\xf9\xed\x62\x68\x35\x98\x9f\x6e\x29\xdc\x88\x35\xe8\x5e\x99\x66\xdc\x88\xf5\x0b\xf8\x6d\x63\x28\xc3\x8d\x58\xfb\xf4\xb2\x34\x2d\x34\x7f\xe0\x1b\x64\xf3\x7b\xac\x87\x2f\x64\x18\x02\x93\x53\xd8\x89\x21\x52\x53\x58\x12\x53\x28\xe8\x8d\xf9\x43\xdf\x2b\xf8\x5c\xc1\xd7\x9c\x97\x72\x22\x20\x87\xfd\x49\xe1\xd5\x54\x96\x2b\x04\x53\xe8\xe1\x17\x40\x2b\x04\xb1\x6e\x89\xe1\xe7\x8f\x7e\xa1\xcd\xf9\x1d\x04\xdf\xd9\x2f\xbc\xb1\x61\xd8\x33\xf8\x8d\x31\x22\x97\x86\x2e\xc1\x5f\x1f\x32\x45\x24\x12\x0c\x06\x58\x12\x8a\xa3\x8d\x39\xf7\x9b\x72\x0e\x44\x72\x4e\xc4\x71\x2e\x4b\x5f\x93\x2c\xc3\x9a\x9c\x9f\xcb\x9e\xfd\x49\xe1\x35\x50\x1c\xf8\x0b\x21\x74\xbe\x94\xf6\x68\x29\x55\x99\x41\x80\xf9\x4b\x21\xc1\x56\x2e\xe3\x6d\xac\x16\xb0\xc1\xcc\x1f\xfa\xae\xe5\x7c\x39\x87\x20\xf8\x05\xa1\x24\x3e\xdd\x63\x3d\xfa\x85\xa1\xfe\x81\xcf\xc4\x04\xcf\x7d\x14\xbb\xd6\xb2\x2c\x64\x29\x30\x76\xad\x4f\xe1\x0b\x63\x95\xae\x31\x1b\xfc\xc0\xb0\x4a\x10\xdd\xa4\x5f\x14\x0a\x4f\xe0\x10\x8a\x8f\xe1\x26\xb4\xe2\xb9\x54\x76\xdc\xe1\xc3\x8f\xbb\x7d\x4a\x34\x31\x82\xe7\xe7\x65\xb1\xa6\xf0\x89\xa8\x2a\x51\x2d\x54\x21\x33\x8c\xc5\x80\x17\x10\x40\x69\x0a\x88\x28\xe8\x0b\x9f\x1f\x21\x88\x5e\x22\x31\xfc\x56\x54\x9a\xc2\xf1\x27\x86\x2b\x68\xa8\xf9\x43\xdf\x2b\x0d\xdf\x2b\xed\xbe\xf1\x98\xaf\x10\xeb\x05\x42\x35\x2f\xf3\xb1\x32\x2b\x90\x7e\x61\x28\xed\x53\xed\xf6\x28\xfc\xca\x6d\x50\x4e\x61\x86\xb1\x47\xd6\xc8\xfd\xc6\x18\xc1\xe7\x85\xd0\xa6\x7e\xfb\x93\xc2\xf1\xf1\x74\xcf\xde\xe0\x6c\x49\x33\x8e\xf5\x99\xbf\x18\x82\xec\xa4\xb6\x4c\xa4\xf9\xa1\x29\x80\xca\xc2\xce\x68\xd7\x93\x85\x28\x0a\x38\x74\x21\x54\x14\x05\x1c\xb8\x18\x57\x19\xb6\x55\x57\x99\xfd\xca\x15\x05\x1c\x2b\x17\x46\xc4\x41\x57\x99\x23\xdc\xba\xca\x90\x8b\xd3\x55\x66\x99\x38\x8d\xa8\x35\x3d\xf8\x4b\x21\x62\x01\x01\x62\x41\xdf\x6b\x98\x0a\xf8\x8b\x21\xcb\xf9\x9c\x57\x66\xda\xe9\x17\x84\xd6\x7c\x2c\x11\x65\xa6\x57\xf3\x31\x00\xce\x50\x38\x1d\x6d\xb5\x3f\xd6\x6a\x59\x43\x99\xf0\x17\x43\x90\x00\xd6\x96\xfa\x2d\xb5\x98\x73\xd3\x8e\xa5\x16\xcf\x39\xb6\xc4\xf2\x17\xb7\x8e\xb1\xb0\x54\x6a\xe5\xe8\xd3\x8a\x4e\x05\xf8\x8b\x21\x15\x94\x63\xfe\xf4\x02\xb4\x1b\xc3\x5a\x8f\xd5\x12\x98\x74\xf3\x17\xd2\x9a\x4b\x47\x59\x3b\xea\x86\x9f\x01\x75\xa3\x90\x01\x9d\xac\xa9\x24\x3c\xcb\x96\x73\x00\xd0\xc7\x58\xfa\xc0\xb8\x3c\x27\x38\xa4\x9e\xfd\x89\xe1\x85\x9c\x02\xaa\xd7\x98\x6b\x41\xdb\xdc\x85\x7d\x4f\x61\xd4\x00\x1b\x3c\xb0\x69\x7b\x9d\x89\xe1\x3a\x54\x09\xcb\x3d\xc0\xe7\x85\xf0\xec\x03\x2f\x16\x33\x3e\x16\xb5\x84\x5b\x90\xfb\xc0\xb8\xf9\xa2\x90\xf5\x12\xc6\xd2\xfd\xc6\x98\x8a\x8f\x65\x46\xec\x13\x7e\x3c\xb5\x4c\x14\x7d\x83\x12\x4c\xaf\x1d\xcd\x75\x86\x4c\x38\xfe\xc0\x30\x7b\xfb\x25\xea\xeb\xbe\x1d\x87\xef\x42\x68\x8d\xb8\x6f\x77\x54\x9a\x8b\x11\x51\x0f\xba\x26\x5d\xe0\x17\xc6\xfe\x26\xe7\x4b\x58\x26\xf4\x0b\x42\xcd\xf0\x4d\x0c\x29\x12\x25\x50\x30\xf3\xfd\xd4\x7e\xbb\x14\x66\x2c\xf5\x4c\x4e\x6a\x4a\x61\xbe\x2f\xcd\x37\x76\xd7\x06\x0d\x20\x4d\x2f\x99\xc8\x84\x78\xca\x6b\xbe\x5e\x04\xd4\x77\x8c\xe4\x6a\x6c\x69\xd5\x58\x20\xf3\x0f\x7f\x31\x44\xc2\xa5\xd5\xfc\xc1\x6f\x68\x2d\x36\x31\xe3\x45\x46\x0b\xde\xfc\x74\x5c\x50\xc6\x17\x6e\x11\x67\x7c\x11\xae\xe0\x8c\x2f\x82\xe5\x1b\x47\x66\x85\x5c\xc0\x05\x4b\x2e\xdc\xf7\x82\xc3\xd0\x99\x9f\x2f\x38\x8d\x1d\x7c\x0d\x16\x80\x9e\xdf\x88\xb2\x59\x00\x21\x2d\x88\x7c\x69\xbe\x5d\x8a\x6a\x89\xb7\xad\x42\x2e\x2e\x96\x85\x08\x0a\x35\x31\xbd\x66\x14\x68\x70\xed\x91\x26\x97\x0f\x01\x00\xc1\x85\x42\x75\x0c\x1b\x7d\x1a\x06\x52\xc1\xa0\x00\x16\xa5\xee\x75\x27\x6f\x17\x3d\x01\xa4\x10\x9d\xcc\x82\x28\x22\xba\xb3\xa2\x01\x65\x4e\x57\x18\xe6\x86\x58\xbf\x50\xe0\x33\x5c\x29\x4d\x3d\xb6\x44\x12\x08\x70\x66\x75\x36\xc5\x85\x0d\x08\x8b\x71\xa9\x7a\xe9\x64\x74\x11\x46\xad\x2b\xda\x78\x14\x76\x09\x61\x6e\xf3\xd9\x94\xe6\x78\x68\x24\x34\x41\x3e\xdd\xb2\xd2\x38\x8b\xf0\x03\xc3\xcc\xda\xcf\x70\xe5\xc3\x2e\xa4\xad\x07\x37\x3e\xfc\xc5\x6b\x4e\xa5\xda\x9f\x18\x2e\x32\x51\x80\x5d\x21\xdc\x2b\xed\x07\xc5\x59\x3a\x43\xbf\x30\x54\x4e\x26\x4b\x2d\x32\x55\xea\x9a\x63\x2c\x86\x1c\x51\x08\xa5\xaa\x84\xbd\xe9\xb9\xdf\x14\xa3\x49\x3e\x43\xbf\x28\xf4\x56\x62\xb7\xe8\x17\x86\xaa\xb9\x2c\x79\x44\xcf\x6d\x50\x4c\xce\x6d\x68\x44\xcd\x93\x49\xf3\x25\x54\xb2\xa4\x0a\xcc\xc0\xe5\x38\x70\x39\xb4\x09\x9b\x23\xf2\xa9\x20\x82\x60\x7e\x3a\x82\x00\x1a\x51\xd4\x2d\xf7\x1b\x63\x4a\x73\x79\x1e\xf3\xec\xc6\xf0\x80\x70\xe5\xc0\xa0\xef\x5d\x10\x36\x15\x43\x07\x3e\x65\xaf\x2b\xa9\xa0\x52\xe8\xeb\x0e\xc5\xa4\x26\x88\x7e\x52\x38\xc2\x7f\x56\x02\x6d\x50\x74\xc0\x22\xda\xb8\x0b\x1b\x77\x11\xf2\x8c\x13\x59\x18\xd6\xd2\xfc\x71\xdf\x0e\x33\xaf\x17\x00\xd6\x61\xc3\x4d\xc0\x80\xe2\x7b\x89\x04\xe6\x9b\x08\x92\xf9\xe9\x09\x12\x64\xb4\x04\x29\x8a\xc2\x4d\x8d\xa1\x96\xe7\xc6\x9f\x15\xf0\x75\xf8\xfb\x82\x78\x3b\xfc\xb2\x14\x11\xbf\x3c\x3d\x04\x2c\xbd\xa0\xf9\x01\xb4\x1e\x35\xc3\x84\x44\x1d\x68\x26\x81\x00\x4b\x24\xe1\xe3\xc8\x51\x4a\xca\x8e\xa4\xb3\x1d\x0d\xc2\x48\x12\xa5\xb8\xdf\x14\x53\xd6\x13\x3e\x97\xc0\xfd\x9b\x8f\xa7\xf0\x41\x85\xa2\x4a\x2b\x04\xb4\xa3\xcd\x27\xb1\xbc\xe6\xe7\xa5\x65\x7b\x31\x1b\x29\x78\xc5\x51\x36\x0b\xcf\x7f\x5d\xea\x3a\x88\x3d\x84\x80\x46\xf6\x01\x26\xeb\xa5\xd3\x41\x59\x75\x25\xea\x6c\x66\x13\xe0\x57\x58\x0a\x85\x24\x12\x60\xf6\x75\xe1\x9a\xef\x18\x5f\x9b\x75\x5d\xf8\x0e\xb8\x48\xf3\x45\x7a\xf1\x14\xf7\x0a\xbf\x82\xac\x14\xdf\x4b\x24\x30\xdf\x2b\x7b\x66\x7b\xf0\xc8\x20\xf3\xca\x9d\xda\x8d\x68\x54\x39\x26\xe1\x11\xb7\x82\x23\x05\xe2\xad\x4a\x91\x78\xcb\x10\x8c\x09\x12\x8c\x09\xcc\x28\x4e\xd5\x74\x77\x8f\xf5\xa6\xbb\xf8\xfb\x89\xf9\xfd\x04\x7f\x17\xeb\xc5\x8c\x58\x32\xf8\xed\xd8\x31\xfc\x24\x55\xe6\x66\x24\x7c\x05\x7a\xac\xe6\xf7\x6f\xaa\xac\x79\x61\x93\x9e\xfb\xc8\x1f\x5d\x64\x58\x70\x90\x7b\xe0\xb3\xf7\xee\xcf\xdf\xac\xfb\x56\x54\xb5\xcc\x92\x35\xbf\xa2\xa8\xae\x7a\x6d\xd6\x54\xad\x51\x5e\x88\x44\xe9\x10\xfc\xb4\xe2\xa1\xa9\xb9\x48\x8b\xb2\xae\x2d\x40\x93\x49\x40\x61\x1e\xb4\x29\x4c\x69\xc9\x83\xfd\xf6\x04\x62\xc6\xcb\x29\x1e\xe7\xf4\x0b\x43\x4d\xe7\x79\x7e\x6b\xe6\x15\x7e\x1f\xe6\xb7\xff\xc0\xfe\xc0\xe7\x80\xe7\xb7\x83\xbb\x5e\x2b\x16\x87\x14\xa4\xca\x2e\x2b\x0a\x99\xa3\xdc\x98\x22\x28\x20\x4c\x23\x73\xa1\xa6\x15\x5f\xcc\xe0\xe6\x10\x7c\x61\xec\x9c\x4f\x45\xc8\x85\x40\x40\x83\x0b\x81\xb0\x98\x0b\x49\x24\x93\xe5\x13\x90\xe3\x3d\xa1\x4c\xc0\xb7\x11\x5f\x2c\x4b\x92\x77\xe1\x0f\x0a\xab\x45\x45\xcf\x53\xee\x37\xc4\xdc\x98\x75\x7e\x83\xeb\xfc\xc6\x14\x7a\x83\x65\xde\x7c\x61\x7e\x7f\x81\xbf\xbf\x34\xbf\xbf\xc4\xdf\xe6\x27\xfe\x12\x55\x29\x8a\x39\xaf\x2b\x79\x07\x22\x3a\xf3\xf9\x1c\x3e\x83\x78\x44\xfc\x22\x01\x14\x06\x99\x19\x0c\xe4\x50\x26\x10\xc7\x83\x7e\x51\xe8\x1a\x1c\x2f\x59\xa9\x20\xfc\xb6\x31\x7a\x01\xf7\x0f\x8c\xba\xc4\x0f\x1b\x57\xcb\xb9\x8d\xb9\x32\x3f\x21\x1c\x5b\xe0\x68\x28\x7e\x06\x94\xb1\x10\xb5\xe1\x37\xdd\x13\x10\x7e\x87\x8f\x40\x14\x34\xa0\x34\xbd\x64\xa2\xc2\x90\x1e\x59\x4e\xed\x91\x63\xbf\x83\x53\xc7\x06\xf9\x83\xa7\x9d\x08\xac\xe9\xa1\x98\x52\xf0\x72\x0a\x04\xd7\x86\x1d\xa9\x52\x1c\x9a\x30\x4c\xa9\x70\x1f\xc3\x5f\x08\x99\xf3\xea\x06\x16\x19\x0a\x21\x6f\x44\x75\x62\x19\x15\xfc\x1c\x08\xe4\x50\xe2\x48\xfc\x0a\xc5\x97\x37\xa2\x8a\xc4\x97\x26\x00\x65\xc3\xf8\xfb\xb9\x8c\x8b\x9d\xcb\xa0\x58\x1b\x89\x5f\x56\x96\x82\x5f\x97\x4e\xa2\x62\xb3\xa2\x8c\x25\x91\x00\xbf\x2d\x05\xc0\x2f\xbf\xff\xf1\x3b\x10\xc8\xde\x88\x2a\x14\xc8\xea\x1b\x08\xd6\x37\xee\x9b\xf8\x6f\x5f\xa0\xbe\x21\xe3\xb9\xb0\x54\x7d\x13\x26\x08\x63\xea\x19\xa2\x2c\xc2\x98\x87\x9f\x18\x8f\xfc\xa5\x13\xb0\x94\xcb\xb9\xca\x6a\x7e\x0b\xcb\xb1\x5c\xce\xcf\xf1\x03\xe2\x2c\xb4\x6f\x0f\x7f\x60\x98\xe3\x75\x54\xc0\xc3\x28\x00\x2c\x81\xe5\x64\x7f\x62\x38\x49\x2f\xbc\xd8\x02\x09\x35\x04\x49\xcb\x4c\x06\xc4\xdb\x45\x78\x1e\xd7\x3d\xa9\x29\xff\x9a\xa6\x6e\x45\x35\x41\x89\xb8\xfd\xe9\xc2\xcd\x46\x5b\x28\xc4\xd9\xa5\x78\x13\xf4\x82\x82\x70\x52\x6d\xe8\xc0\xa6\xec\x75\x25\xb5\x81\xf5\x4c\x66\x37\x25\x0a\x12\x6d\xd8\x95\x0d\x6b\x14\xea\xd2\xf6\x3a\x13\x2f\xb8\x2c\x6b\x3b\x3c\xf0\x71\xee\xc6\x08\xbf\x07\x38\x68\xed\xe8\x05\x2f\x95\x16\xbb\x10\x01\xbf\x6c\x26\xf3\x31\xd8\xed\x35\x22\xcc\x85\xde\x11\x37\xf3\x11\x90\x35\x12\x63\x37\x96\x1c\x85\xb6\x56\x1d\x85\x87\xc7\x22\x05\xc5\xa7\x22\x05\x36\x8a\x0b\xca\x51\x40\xde\xc1\x95\x06\x24\xc0\xef\x13\xf8\xa6\xce\x60\xd0\x00\xd3\xf4\x92\x89\x1c\xe9\x5d\x78\xba\x8b\x3f\x79\x7d\xe7\x82\x0f\xeb\x7f\x44\x31\xeb\x20\xe6\x9f\x51\xcc\x6f\x41\xcc\xff\xc6\x18\xc0\x85\x43\x41\xfc\x84\x4e\x0c\xeb\xed\x01\x44\x6e\x18\x05\xdf\x87\xe6\x3b\x4e\xa1\x17\x22\xab\x01\xc8\x27\x4c\x07\xa1\x17\x26\x94\x52\x03\xd1\xbc\x15\x6e\xb8\x6c\x40\x30\x60\xa4\xd1\x88\xc2\x7f\xf8\x09\xe1\x66\xed\xe0\x9a\x30\x7c\x07\xe8\x25\xe0\x0f\x0c\x13\xc0\x37\x56\x62\xf2\x0f\xfb\x4d\xd2\xfe\x7f\xd2\x37\x9d\xd6\xd2\x3e\xaf\xbb\x90\x53\xff\xcc\xee\x03\x07\x98\xae\xd7\x91\xb0\x12\x0b\xc1\xeb\x0c\x81\xe7\x7b\xf8\x05\x30\xf4\x41\x2c\xde\x83\xf1\xf7\x31\xdd\x86\xed\xcd\xd1\x5c\x1b\x11\x6b\x37\x78\x66\x38\x71\x81\x51\xda\x89\xe0\xf5\x12\x6f\x6b\x36\xe8\x29\x05\x51\x3a\x0b\x8d\xd0\xb3\x3f\x6d\x38\x91\x79\xfa\x65\x43\x97\x05\x05\xda\x97\x73\xfc\xa9\x5d\xa0\x7d\xb8\xa8\x51\x68\x81\x3f\x30\x0c\x06\x19\x17\x07\xc8\xd5\x49\xa4\xae\x33\x8e\xa2\x77\xf3\x17\x43\x08\x0b\x09\x9e\x1c\xf0\x27\x85\xd3\x33\x44\xf8\x04\x11\xf2\x60\x10\xd0\xe0\xc1\x20\x2c\xe6\xc1\x12\xc9\x74\x41\xaf\x27\x85\x7b\x3d\x71\xfc\x83\x0e\x98\x02\xb3\x28\x97\x05\xaf\x02\x01\x8b\x0d\x8a\x24\x2c\x36\x30\x90\x0b\xd8\xa0\x93\x50\x3e\xa0\x17\xd4\xa7\x85\xeb\xd4\xa2\x12\x3c\x77\x6f\x81\xf8\x19\x3c\xd3\xc3\x74\xb8\x13\x07\xbe\xce\xfd\xb1\xa3\xeb\x3c\x17\xb7\xd2\x9e\x11\xba\xce\x8f\xed\x27\xc5\x8b\xf9\x0c\x1f\x3e\xe6\x33\x17\x72\x4b\x21\xb7\x14\x22\xeb\x6c\x56\xcb\x02\x5f\x6f\xe0\xeb\xca\x7c\x51\xac\x5a\x58\x96\xc8\xfc\x0e\xd8\x21\xf3\xe9\x59\xa1\x38\xd2\x7c\xf9\x33\x31\x00\xd1\x0f\xb2\x06\xb7\xff\x66\x02\x5d\x57\xf2\x46\xd4\xb3\x4a\x2d\xa7\xb3\xe0\xd4\x8a\xc2\xe3\xa3\x2b\x8a\x8a\xce\xaf\xee\x4c\x51\x4c\x78\x92\x45\x11\x8d\xe3\x2c\xae\x28\x3a\xd3\x36\x64\x43\xe5\xbc\x3d\x67\x30\xdd\x77\x10\xff\x18\xa6\x6e\x44\x10\x96\x7b\xd7\x02\xbd\x86\xb3\x01\xd7\x08\x75\x23\x06\x2e\x5d\xaf\x23\xa1\x2f\x2e\x58\x43\xb1\x8f\x82\x56\x81\x14\xdc\x95\x14\x03\xcd\xd1\x9d\xf1\x85\x4b\xf4\x0c\xbf\xa3\xc2\x28\x4d\x2f\x99\xc8\x17\xf3\xab\x92\x65\x94\xc4\x04\xb4\x0a\x82\xc0\x74\x32\x0c\x9a\x07\xbe\x15\x7a\x4d\x77\x0b\x51\x71\x3e\x65\xaf\x2b\x29\x06\x5a\xfe\x34\xf0\xc5\x10\x15\x84\x4f\x74\x89\x04\xf8\x1d\x6e\x80\xc0\xc7\x43\x54\x44\xb4\x09\x9a\x89\x2c\x4a\x44\x43\xa7\x8b\x34\x1c\xe1\xad\x72\x13\x8c\x44\x54\xc6\x6c\x9d\x23\x78\x5e\x3b\xf7\x8f\x36\x2a\xce\x57\x4d\x78\x26\x1c\xb9\xc6\xcf\x4b\x4f\xb5\xd7\x86\x84\x14\xbc\x9c\x2e\x39\xa8\xd7\x61\xc0\x33\x0a\x80\x34\xd0\x18\xc4\x42\xc0\x17\x54\x8b\x90\x4a\xb1\xd5\x54\xd4\x77\xee\x15\xf5\x1f\x41\xe8\xda\x85\xe2\xa1\x0c\x3a\xcf\x65\x36\x03\x3a\x64\x3e\x0e\xe1\x03\x87\xd2\x7c\x0f\x30\xb6\xd7\x8e\x36\x9f\xb9\xc8\x54\x65\xa9\xa4\x09\x38\x76\x01\x41\x11\x3e\x55\x2f\x9d\xcc\x04\x39\x9e\xd1\x7c\x04\x3c\xa3\xf9\x0c\x0f\x27\xf3\xdd\x38\x9b\xa0\x92\xe8\x68\x6a\x27\xaa\x0d\x53\x54\x23\x0f\x14\x72\x94\x75\xc4\x4a\xf6\x10\x8b\xa1\xb7\xe7\x7e\x99\xd0\xa5\x61\x7e\x97\xc8\xde\x2e\x9f\x98\xdf\x28\x0f\x58\x9a\x0a\x1a\xfc\xbf\x0b\x8b\xa9\xa8\x0b\x8e\x28\x68\x3a\xb1\x0b\x0d\x29\xa7\x0b\x6c\x50\x4d\x5f\x70\x44\x31\x3b\x92\x2f\x4b\x99\xe1\x8d\x8c\x7e\x85\xa1\x63\x99\x4b\x1f\xf3\xbd\xcc\xa5\xad\x02\x02\x06\x26\xbe\x97\x48\x40\xdf\x15\x47\x75\x50\xfa\xbc\xe0\x56\x23\xd4\x15\x00\x29\x7a\xa9\x24\xc0\x8c\x1a\x26\x64\x8e\xb1\xb5\x7e\x21\xaa\x93\xb9\xcb\x5e\xeb\xc1\xc2\xb0\xe7\xf3\x5e\x3b\x7e\x59\x7a\x1b\x79\x88\x0d\x4c\xe6\xfb\xa8\x09\x10\x3c\x5d\xdf\x1e\xc6\x6f\xd7\xbd\xdb\x41\xf0\x9a\x9d\x48\xe0\xb6\xd9\xad\xdf\x61\xb7\x22\xab\x55\x85\x26\xe0\x26\x06\x3e\x4f\xd0\x22\x1c\x0b\x85\x90\x81\x33\x12\x6f\x27\x21\x1b\x2d\x88\x82\x5f\x36\xb4\xe6\xf9\xed\x1a\x83\xeb\xc3\xfc\xf6\x9f\xb6\xc0\xaa\x06\x29\xdd\xba\xd7\x8c\x33\x1f\x5e\x46\x67\xbe\x22\x11\x1d\xe4\x0c\x25\x74\xcd\x14\x3e\xff\x3a\x8a\xfd\x67\x3b\xff\xba\x97\x48\x71\xeb\x65\x8e\xb7\x3f\x06\x42\xc7\xde\xed\xc0\xca\x20\x9b\x51\xb7\xb1\x50\xf0\xf6\xb4\x21\x15\xec\xdd\x0e\x42\x41\x61\x2a\xc9\xad\x14\x2b\x7c\x0e\x37\xbf\xbe\xa7\x17\x71\xf3\xdb\xe9\x90\x98\x8f\x40\x3d\xf2\x56\x5a\x88\x1d\x88\xb3\x1f\x18\xd7\x90\x63\xdc\x3e\x6f\x0a\x32\x7a\xb7\x83\x48\xb8\x91\x4c\x74\xab\x32\x3e\x36\x31\xe6\x2f\x84\xc0\x49\xa6\xad\xd6\x09\xae\x9e\x95\xaa\x72\xcf\x16\x9b\xaf\x48\xa8\x66\x02\x42\x91\x5a\x33\xc1\xaa\x02\xa1\x97\xd5\x5d\xc1\x2f\xf7\x78\x67\x03\x06\x20\x72\x49\x24\xb8\x33\xc4\xec\x0e\x89\xd9\x9d\x21\x66\x77\x48\xcc\xcc\x50\xe2\x20\xde\x65\x33\x5e\x96\xa2\xc0\x7d\x04\x27\xc3\xdd\x11\x06\x5d\x52\x10\xa6\x73\xa2\xb1\xbb\x50\x69\xe0\x2e\x50\x19\x08\x23\xee\x0a\x59\xde\xf0\xac\x5e\xe2\x95\x06\x3e\x0f\xf1\x93\x32\x02\x14\x1d\xa5\xe8\xa5\x92\x60\x11\x55\x46\x0a\x5f\x18\x8f\x9f\x51\x11\x14\x94\x4a\x02\x01\x24\x85\x87\xdf\x3f\x5a\x15\x56\xca\x0c\x2a\xad\xad\x48\xf8\x0a\xab\xbd\x68\xd4\x19\x55\x78\x11\xd5\xa6\x67\x20\x39\x82\xdf\x97\x33\x12\x1d\x51\x36\x13\xd7\x6b\x45\xc2\x97\xd5\x7b\x82\x8f\x2b\xa7\xfc\x44\x19\x51\x1b\xaa\x1d\x8d\x59\xf1\x11\x1c\xa3\x9c\x62\x33\x65\x34\xdf\xad\xc8\xbb\x79\x81\xb0\x83\xbd\xbb\x79\xf1\x3d\xd7\x36\xcb\xbc\xd8\x33\xe1\xbd\x46\xc4\xdd\xbc\x20\x9d\xb1\xbb\x79\xe1\x74\xc6\x20\x39\x68\x98\x36\x22\xee\xe6\x05\x5c\xb3\xe1\xaf\x4f\x0a\x90\x40\x94\xf6\x12\x7e\xbb\xc4\xd8\x56\xca\xf1\x0f\xf3\xe1\xb2\x95\x7a\x0f\x62\x7b\xed\xe8\xbb\x39\x98\x2c\x88\x66\x91\x6b\xb3\xe6\xd7\xb8\xe6\xd7\x66\xcd\xaf\x71\xcd\x1b\x4a\x80\x04\x60\xdd\x5e\xf3\xeb\xd4\x9a\xff\x6d\x8f\xf5\x7e\xc3\x5f\x4a\xcd\x79\x99\xa3\x2a\x9e\xf9\x38\x2c\xf3\x17\xbc\xec\x01\x14\x45\xb7\x71\xdc\x93\xff\x1e\xe3\xb8\x7f\x45\xbe\x2a\x42\xcb\xb8\xc8\xd7\x45\x6c\x8e\x0d\x91\xf7\xa2\x50\x60\xce\x93\x57\x27\x67\x57\x08\x6e\x71\x71\xf2\xc3\xc9\x3f\xc0\xf1\x87\x2a\xad\xab\x0f\x4c\x04\x46\xe5\x50\xea\x7b\x82\x6e\x04\xc5\x00\xc2\x43\x57\x59\x0f\x06\xde\xc0\x02\x9b\xa6\xbb\x50\xac\x37\xa5\x8d\xd0\x2c\x08\x75\x3b\x44\x92\x6d\x8e\x5a\x1a\xd8\xe2\xe3\xdd\x0d\xd0\x16\x1f\xef\xa6\xbd\x4d\x44\xc6\xce\xae\xc2\x4a\x4c\xa5\x46\xd1\x5e\x69\x5a\x86\x8e\xd0\xd3\x9e\x2d\x1e\x56\xe2\xa2\x58\x4e\x65\x19\xd9\xfa\x82\x43\x9c\xe6\xb4\x26\x01\xdf\xd1\x0e\xbf\x54\x0c\xbd\x13\x53\x59\x08\xe0\x38\x16\xa2\x74\x0e\x9f\xfa\x6c\x25\xd8\xdc\x9c\x00\x04\x1d\xc8\x09\xd4\x9b\x89\xc0\x3b\xa9\x2f\xf5\x18\x50\xc9\x40\x93\x15\xcb\x26\x6f\xec\x52\x03\x04\xd6\xf0\x9e\x8e\xbd\x33\x56\x41\x73\x5c\xd9\x81\xb3\x6b\xbb\x68\x44\x3d\x00\xba\xa0\x33\xeb\xeb\x38\xed\x2f\x31\xaa\x41\x6a\x82\xdb\x58\xd9\x5d\xa6\xcb\x38\x05\x33\x5e\xe6\x05\xb8\xef\x21\x34\x99\x07\xd8\xea\x37\xeb\x4c\xd8\x23\x3e\xd9\x60\xb1\x6f\x57\xf0\xfd\x36\xfb\xae\x97\xf1\x30\x78\x64\x3c\x55\x5a\xc0\x64\xb3\x04\x1b\xa9\x9c\x15\xf7\x93\xfb\x01\x0b\x36\x0e\xc6\x69\xed\x70\xac\xe5\xb4\x54\x95\xc8\x37\x41\x8f\x7c\xc8\xbe\x8f\x46\xec\x19\x39\x7e\x6e\x40\x2a\xcc\x94\xba\x71\xd4\xa8\x89\xa4\xe2\x57\x07\x92\xd1\x60\x2f\xb2\xdf\x7f\x8f\xa8\x62\x72\x9b\x3e\x7c\x2a\x08\xb5\xb1\x04\xa5\x1e\x89\x4e\xb9\x36\xa4\x50\xcb\x10\xec\xb9\x39\x19\x70\x9a\xb1\xa5\x06\x54\x72\xb0\x59\x04\x83\x52\x55\x7e\x5f\x2c\xab\xd0\x99\x34\xc5\x9e\x96\x14\x0f\x5f\xe7\xcb\x9a\xcc\x71\x0f\x8b\x02\x4f\x46\x4b\x0a\xd0\xa7\xae\xf3\x9e\x57\x2b\x36\x5e\x8e\xc7\x80\xf9\xa8\x3a\x0b\xc3\xb2\xac\x3b\xde\x52\x88\x5c\xe4\x23\xef\x91\x67\xbc\xc6\x3a\x86\xbd\x3f\x6f\xa1\xe3\xd8\x39\x03\xa5\x0d\x43\x77\x0c\x4a\x84\x88\x25\x0b\xee\xde\xfd\x12\x96\x1e\x8a\x95\xf0\x4d\x16\xa2\x42\x40\xe2\x00\xa4\xa0\x09\x9b\xda\x67\x85\x52\x37\xcb\x85\xf3\xed\x0c\xa1\x60\x0a\xbd\x01\x8e\xf6\x4f\x1e\x09\x73\x62\x6f\x18\x04\xc0\x07\x35\x69\xae\x63\x2f\x82\x0e\xde\x72\xa2\x2a\x36\x59\xd6\xcb\x0a\x61\x90\x65\x49\x53\x88\xc3\xf0\x82\x6b\x73\x6a\xe4\xf2\x56\xe6\x4b\x5e\x60\x51\x83\xeb\xd0\x72\xda\x3a\xf7\xf9\xf3\xe7\x5c\x37\x9c\xce\x59\x20\x00\x1f\xe2\x4c\xc7\x5b\xae\xeb\x1e\x05\x30\xa0\x9b\x76\x5b\x26\xa4\x19\x15\x8e\xd6\xed\xe0\xcd\xc2\x9a\xac\x07\xd8\x2d\x12\x48\xa0\x47\xcf\xb1\xa0\xb1\x7d\x73\xb2\xd6\x16\x5a\xd6\xba\x18\x00\x7f\x81\x04\xaf\xea\x0c\xd6\x6d\xcb\xfe\xfc\x83\x62\xa3\x0b\xbf\xb4\x53\x96\xce\x71\x39\xe3\x67\xb1\x97\x1e\x8f\xe5\xf3\x07\xc6\xe3\xcf\x3f\x34\x10\x6c\xe6\xc2\x2e\xfa\x83\xe0\xc3\x94\x89\xc4\xde\x03\x23\xfd\x27\x1c\x80\x6d\xbc\xa0\x39\xaf\xb3\x19\x42\x16\xa0\x71\xbf\xf7\x07\x41\xc8\x48\x8e\xc6\x64\xaa\x9c\xc8\xa9\x47\x0d\x4a\x9a\xf8\xdf\xc3\x06\xf9\x09\x49\x60\x41\x25\x0b\x6c\x32\x47\xb1\xf3\x90\x20\x3f\xec\x9f\x08\xb7\xa8\x9b\x2b\x0a\xc0\x9d\x1e\xc4\x0b\x6d\xc6\x2d\x8a\xa6\xf5\xc1\x13\x9b\x98\x5a\xe7\xa2\x21\xf2\x06\xe4\xe6\xf8\xd3\x4f\x99\x43\x6a\x6a\xb2\x97\x01\xef\x6d\xb9\x9d\xf6\x64\x03\x07\xee\x71\xa0\xec\x8c\x93\x03\x57\x5e\xf7\x34\xf8\xfa\xac\x67\x62\xed\x8b\xb3\x4c\x91\xc9\x92\x33\x5e\xae\x57\x7c\x8d\xbe\x7f\x88\x57\xf7\xbe\x77\x36\x9e\xf8\xb9\x12\x78\x30\x55\x22\x53\xd3\x52\xfe\x26\xfc\x9e\xb3\x00\x1c\x1c\x66\x86\x00\x7a\x9d\xe7\x57\xd8\x6c\x01\x10\x75\xb1\x66\x2b\x5e\x5a\xbc\x61\xbe\x58\x08\xc0\x6b\x82\xe2\x4c\x7e\xae\x19\x67\x08\xf6\x4b\xc7\xbb\x07\x00\x03\xf3\x37\x93\x93\xeb\x60\x24\xa0\x11\x96\xec\x63\x1e\xaa\x9b\x67\x99\xcc\xcd\xc1\x68\x6a\xb5\xae\xa8\x6b\x44\xa0\xe6\x6c\xc1\xcd\x75\xdc\xc3\x77\xf4\xc9\x6f\x2e\x35\x99\xd2\xd9\x76\xd9\x7e\x05\x0b\x2b\x9e\xc6\x7f\x07\xe5\x74\x8e\x56\x3f\xfd\x94\x3d\xc2\x75\xe2\x80\x48\x0f\x01\x55\xe3\x7b\x4c\xe1\xbd\x09\xef\xc4\x5e\x83\x6e\x63\xbf\x6a\x1b\x68\x6d\x70\x02\x95\xaa\x1c\x50\xd5\x4d\x08\xb1\x9f\xcb\x9f\xcb\x70\x0a\x60\xae\x6b\x05\x82\x4d\x41\x93\x4e\x43\xda\x87\x29\xf1\x07\x1a\x4d\xe1\x1e\x8e\xff\x27\xfa\xe0\xa3\x4f\xf4\x47\x4c\x55\xec\x13\x7d\xf0\x2f\x74\xd0\x57\x2b\x44\x5b\xda\xde\x79\x8b\x13\x41\x67\x56\xd9\xbc\xd1\x3f\x88\x88\x37\x00\x66\xfe\x07\xf5\xbd\x59\x13\x38\xad\xaa\x95\xa1\xf2\xb9\x74\xfb\x0c\xfc\x9b\xc8\x1a\xf7\xbb\x29\xc8\x45\x3b\x36\xe5\x6d\x9f\x60\xe3\x4d\x6b\xe2\x24\xdf\xd1\x42\xdb\xf3\x6c\xcc\xdb\xd8\x75\xe2\x7d\x83\x1f\xfe\xbf\x79\x22\x3e\xd8\x55\xec\x0c\x28\xa0\x73\x84\x6d\x6f\x5f\x39\x91\xcb\x3e\xcb\x15\x90\x31\x1b\x61\xf3\x81\x2f\x6a\xb3\xbf\xd0\xc9\x86\x63\x47\x01\x85\xc9\x6d\x40\x4f\xce\xef\xbf\x88\x8d\x46\xec\x27\x5e\x95\x88\xa9\xc4\x59\x83\xaa\xa3\xdf\x8c\x31\xcf\xa1\x52\x8f\x28\x87\x7b\xf8\x52\xd4\x6e\x1b\x87\xde\xe1\x76\xba\x31\x08\x37\x0f\x55\x84\x42\xb8\x95\x68\x76\xec\x5a\xee\xa5\x47\x37\x73\x48\xbb\x81\x04\x2d\x85\xb8\x17\x00\xa2\x59\xc4\xbd\x3f\x04\xb8\xe7\x50\xbe\x6e\xc4\x9a\x2a\x7b\x7d\x23\xd6\xbf\x6c\x84\xdf\x0b\x1b\xf1\xce\xf0\x7b\x51\xe6\x0f\x01\xbf\x87\xad\x8c\x8a\x7d\x17\xf4\x3d\xef\x0f\x2c\x09\xc1\x77\x82\x8e\x55\xe8\xc8\x0a\x4f\x2b\x3a\xa9\x68\x67\x9b\xfc\x11\xa9\x01\x1f\x32\x86\xe1\xf6\xec\x2f\xf8\x3b\x32\xb4\xc2\x1d\xc3\x0f\xc3\xc6\x43\xbf\x1f\x6e\x51\x0f\xc6\x62\xc6\x6f\xa5\xaa\xde\x0d\x22\xcf\x91\x82\x80\x73\x4a\x8d\xda\x03\xb0\xfe\xc8\x23\xac\x1d\xb4\x36\xe2\x5f\x3c\x6a\x00\x98\xf5\x47\xc7\x0d\x0a\xf9\x77\x8f\x5c\xfc\x30\x91\x00\xcd\x7b\xf2\x61\x11\x06\x5b\x14\xa2\x0d\x31\x38\x1a\xb1\xab\xf3\xe3\xf3\x3d\xb2\xa4\x64\x72\xbe\x50\x55\xad\x59\x21\x6f\x04\xd3\x6a\x2e\x06\x0b\x9e\xdd\xf0\xa9\x18\xe9\x2a\x1b\x7d\x06\x12\xa0\xb1\xe1\xe0\x9e\xca\x3b\x36\x17\x88\x44\x36\x15\xb5\x7d\x36\x91\x63\x51\x9d\xaf\x4a\x51\x19\x66\x0b\x84\xfa\xed\xa7\x15\x93\x66\xd8\x95\x67\x3f\x55\x62\x63\x3c\x1f\x5c\x6a\x94\x6f\x3f\x02\x54\xa4\xc5\xe8\x14\x84\x3c\xae\x62\x90\xe8\x72\xc6\xf3\xb5\xe1\x2b\x3d\xe8\xa2\x89\x3d\x3e\x3c\xfb\xe1\xe4\xe2\xfc\xe5\xe5\xb3\x7f\xbe\xb9\x3c\xb9\x7a\x73\x7a\x76\x76\x72\xf1\x06\x3d\x02\x75\xc3\x3b\x61\xc9\x97\x2f\x5f\xbc\xb8\x38\xb9\xbc\x7c\x73\x74\x7e\x76\x75\x72\x76\xf5\xe6\xe4\xf8\xf4\xea\xf0\xfb\x67\x27\x6f\x7e\x3a\xbc\x38\x3b\x3d\xfb\xc1\x14\x71\x8f\xf2\x53\xa3\xa4\x1f\xff\x79\x7c\x71\x78\x75\x7a\x7e\x66\x8b\x40\x57\x58\x9d\x3a\x50\x98\xfd\xf0\xe5\xd5\xf9\xd3\xf3\xa3\x97\x97\x00\xca\xed\xc0\xcd\x30\xf2\xe8\xc7\xd3\x67\xc7\x17\x27\x67\xe0\x3d\xce\xe2\x82\x51\xb5\x57\xff\x7c\x76\x02\xe5\x83\x2d\xdd\xbe\x73\xc0\x15\xbb\xdf\xb2\xa1\xf0\x92\x71\xf9\xe2\xf0\xc8\xe4\x39\xb3\x5e\x48\xf4\xd0\xa4\xdb\xdf\xda\xb2\xb3\x7d\x49\x0f\x71\x0d\xf7\xf9\x43\xc3\x26\x5c\xc0\xc2\xd6\xdb\x3d\x78\x3f\x32\x8b\x3d\xc8\xb0\x79\xa5\x34\xbc\xd1\xd3\x86\x08\xfc\xbe\x01\x0b\x70\x34\xab\xd4\x1c\x7d\xa6\xcc\x04\xba\x92\x9a\xf3\x5f\x55\xc5\xc6\x95\x5a\x69\x51\xa1\xef\xd2\x99\x44\xd7\x38\xdf\xd4\x72\x2e\xbe\x1d\xb2\xef\x97\x70\xc5\x51\x13\xf6\x1f\xcb\x62\x6d\xcb\x7a\xf2\x78\xf7\x6f\x48\xa5\x6b\x51\xe6\x80\x11\x08\xae\x07\x64\xcd\x72\xa4\x47\x2b\x99\x0b\x54\x86\x65\x4b\xcd\xa7\x02\x9c\xd9\x45\x77\x2f\x5b\xd6\x67\xe0\x23\xe6\x33\x68\x3c\x90\x4b\xac\x1a\xa4\xb1\x86\x30\x80\x5f\xd5\x65\xe9\x6e\x7b\x20\x4c\xa5\xce\x90\xef\x18\x5b\x94\xac\x99\x56\xaa\xb4\x57\xcd\x3e\x22\x81\xf3\x72\x6d\x2e\x77\xe1\xc3\x11\x22\x2f\x9a\xdb\x1b\x5c\x43\xf1\xc2\x89\x08\x64\xd6\xcb\x9c\x75\x38\x53\xa1\xd3\x9b\x95\xaa\x6e\x40\x52\xaa\x8a\xf5\x44\x16\x05\x52\xf6\x6f\x72\xc9\x0b\x35\xfd\x76\x08\x82\xf7\x85\x50\x8b\x82\x84\x85\xf4\xdc\x84\xf1\xe4\xdb\x2d\xf4\x4d\xdd\xa6\x8b\xa7\xe5\xb1\xb8\x15\x85\x5a\x80\xeb\xb2\x8d\x5c\x0e\xbb\x0f\xb6\x75\xbf\x23\x51\x03\xb0\xb4\x33\xd9\x93\x56\x32\x6c\x39\x21\x2e\x9a\xfb\x2a\x8c\xa0\x13\x93\x6b\x76\x74\x01\xa3\x7d\x74\xf1\xec\xa9\x99\xff\x67\x4f\x87\x98\xfe\xb4\x46\x54\xc8\x8c\x97\x0c\xd8\x95\x9f\x97\x8f\x1f\x3f\x7e\x6c\xd6\x82\x62\x3f\x2f\x9f\x3e\x7d\x7a\x6c\x58\x79\x99\x8b\x40\xd0\x40\x79\x9d\x67\x9e\xd5\x6a\xb8\xfa\x62\xa8\xaa\xe9\xe8\xea\x62\x64\x36\xd5\x57\x23\x53\x7f\x61\x08\xf7\x54\xc0\x36\xfb\xcb\xa2\x12\x8b\x4a\x65\x02\x9d\xd7\xd4\x33\x31\x00\x14\x2e\xb0\xaa\xe5\xf3\x2d\xfb\x9c\xb8\x12\xb8\x0e\x38\x9b\x4b\x0d\x52\xab\xbe\x59\x08\xee\xf5\x10\x16\x14\xac\x31\xb3\x2b\xa9\x21\x3f\x09\x5c\x53\xe8\xeb\x6f\x01\xb2\xae\xe5\x22\x7a\x34\x04\x48\x70\xb3\x85\x26\xb2\x42\x89\x04\x71\x06\x43\x9a\xf1\xb3\xf3\x8b\xe7\x87\xcf\x4e\xff\xf7\xc9\x9b\xb3\x93\x9f\x9e\x9d\x9e\x9d\x5c\xfa\x17\xed\x9f\xab\x9f\xcb\xef\x46\xd3\xfd\x76\xd2\x97\xcf\x9e\xbd\x39\x3c\x3b\x7e\x73\x71\xf2\xe2\xd9\xe1\xd1\xc9\x73\x43\x4c\x7d\x36\x18\xca\xdf\x71\x14\x4d\x76\xca\xef\xa6\xe5\x39\xaf\x6e\x96\x8b\xa7\xaa\xba\x12\x77\xf5\x79\xe5\x38\xf9\x68\x79\xcd\x21\x51\xc8\x0b\x63\x88\x63\x47\xe9\xb2\x8f\xa1\x91\xdb\x28\xf6\x9d\x0d\xdd\x63\x3d\xc3\x6c\xe0\xd7\x7e\xc8\x9e\x86\x85\x39\xb7\xf6\x5d\x83\xd1\x67\xbd\x9f\xcb\xde\x4e\x2a\x5d\xe7\x48\x80\x07\xfc\xb6\xe7\x77\xea\xf5\xb1\x9c\x4c\x44\x25\xca\x2c\xee\x34\xca\x9c\x4c\x82\x3e\xcb\x0a\x30\x81\x15\x77\x75\xf8\xfa\xde\x71\x84\x76\x39\x7e\xb7\x63\xe7\x5f\x8e\x8e\x5c\xb1\xe0\x4b\xf6\x9e\x29\xd9\x0e\x5a\xb1\x9f\x28\xed\xd2\x35\xf8\x41\xa5\xf9\xfe\x05\xd7\x94\x74\x69\x07\x07\xc9\x46\x6f\xea\x68\x37\x7b\xd1\xed\xe1\x1e\x2a\x23\x4d\x68\x53\x00\x6c\x16\xd8\x80\x43\x86\xcd\xd9\x63\x20\x6a\xc0\x26\xe0\x47\xaf\x9f\x1c\x82\x7e\xba\xc5\xc9\x45\x60\xc8\x5a\xc7\x22\x30\xe4\x8d\x9c\xbd\x42\xd1\xe4\x6f\x19\x67\xe2\x55\x53\x1d\xe3\x03\x2d\x08\xeb\x28\xf7\xa1\x2b\x22\x74\x41\x9b\x5a\x12\x0f\x2f\x2f\xe8\xe4\x86\x45\xf1\xca\xc3\x49\xa7\x5a\xfe\xa1\x97\x85\x99\x1e\x14\x6a\x75\xac\x89\x4f\xb4\x5b\x11\x70\x25\xf1\x93\xf6\x1f\x97\xe7\x67\x43\xa4\x44\x72\xb2\x4e\x77\x64\x67\x43\xb2\xb0\x57\xe9\xb5\x73\x72\x57\x57\xdc\xfb\x53\x8a\x16\x4f\x04\x0a\xa5\xff\xe0\x42\x79\xc8\xc8\xc1\xe4\x13\xfc\xf1\x6b\x7a\xbf\x88\x1b\x31\x9c\xa8\xea\x84\x67\xb3\x40\x5e\x10\xbf\x64\x40\x76\x14\x47\xd0\xbb\x0e\x34\x61\x27\x3d\x35\xd0\xfb\xc8\xe5\x8a\xbd\x9f\x6a\x37\x37\x24\x81\xd6\xe9\xf1\xa3\xfe\x80\x75\xe3\x33\xa9\x6b\x51\x82\xa3\x72\xdf\xbc\xb6\x72\x48\x41\xc9\xc2\x01\x2d\x5c\xd6\x03\xba\xa3\x74\x3f\xc8\x9d\xd0\x03\x1b\xae\x29\x97\xb3\x56\xe6\x70\xe7\xae\xea\xbe\xd3\x10\x98\xaa\x9a\x5d\x43\xee\xb6\xd8\xf4\xdf\x23\xcc\x6c\x0f\xca\x43\x42\x36\xdf\x11\x1e\x0a\x65\xfe\x5e\xc3\x67\xdd\xc0\xab\x09\x66\x03\x7d\xbe\x8e\xae\x10\x33\x61\x4b\x7e\x78\xbb\x43\x26\xf4\x05\xaf\xb4\xf0\xb0\xe4\x86\xf1\x84\xab\x86\xac\xd9\x18\x9c\x41\x2a\x4f\xbc\x7c\x32\x92\x9e\x68\x85\x72\x59\x59\x63\x61\x86\x33\x1d\x0b\x9c\x6b\xc3\xd4\x67\x6a\xbe\xe0\x95\xd4\xe8\xd9\x24\x22\xb9\x74\x03\x0c\x4e\x10\x78\xb8\xe9\x03\xfe\x6c\xe0\x2c\xf3\x27\xc1\x32\xff\x52\x96\x55\x02\x04\xbf\x9c\x69\xb1\xe0\x15\xaf\x85\xd3\x93\x60\x70\xc1\xa8\x15\xe3\xb7\x4a\xe6\x36\x7b\x65\x78\x57\x59\x83\xbb\x7e\xd3\x62\x7a\x83\xb2\x0e\x27\xcd\x9e\xa8\x67\x62\xcd\xc4\x9d\xd4\x35\xde\xd1\x80\x0f\x1d\x57\x82\xdf\x68\x5b\xca\x4c\xad\xd8\x37\xa5\x42\xb8\xac\x6f\xcd\xc5\x6f\x2c\x4c\x69\xa8\xb7\x94\x0f\xd9\xa5\x32\xdc\xf0\x92\x46\x12\x7c\x61\xdb\x76\x39\xe7\x98\x97\x02\x63\x73\xa9\xb3\xa5\xd6\xe0\x9b\xb4\x74\x8c\x39\xb9\xcb\xcc\xd4\x7c\x34\xe1\x99\x18\x2b\x75\x83\xf2\xa4\xd1\x62\x59\x14\xa3\xdd\xdd\xdd\xaf\xfe\x36\x74\xc4\xab\x16\xba\x26\xb7\xd0\xec\x80\xde\xbc\x86\xce\x67\xe7\xcb\x8b\x53\xd8\xdf\x8d\xfb\xf4\x77\x36\xa1\x5a\x95\xa2\x3a\xb6\xed\xc3\x31\xa5\xd2\x68\x1a\x86\xce\x6b\xe9\xde\x03\x32\x9d\x5d\x6e\x27\x9a\xd0\x67\x8d\xb2\x70\xf5\x05\x4d\x1f\x4a\xef\x19\x99\xe1\x05\x3f\x94\x62\xa7\x12\x7a\xb1\xb6\x5b\x39\x88\x84\x8f\x34\x51\x96\xd3\x2b\xb5\x5d\x29\x55\x1f\xa1\x73\x5f\x51\x9d\x58\x01\x60\x73\x03\x05\x8e\x65\xb4\xed\xd7\x79\xf5\xb4\xe2\x53\x1a\xd6\x54\x31\xc3\x52\xe5\x00\x7a\x06\x03\x7c\x7c\x7e\xf4\x12\xb8\xe7\xb3\xf3\xe3\x13\xd0\xf0\x7a\x78\x96\xa7\x17\x87\x3f\xb8\xbc\xf6\xba\x92\xab\x0c\xf4\x06\x12\xed\xf9\x2e\x59\x38\xdb\x4b\xd7\x19\xcd\xd6\x3e\xa1\x07\x8b\xd2\x0c\x4e\x8b\x8e\xe4\x2a\xdb\x89\x87\x74\xfa\xff\xb1\xf7\xed\xef\x6d\xdb\xc8\xa2\x3f\xaf\xff\x0a\x24\x9b\x46\x52\x22\x53\xb1\xf3\x6a\xe5\xb8\x39\x6e\xec\x6c\x7d\xda\xd8\x3e\xb1\xd3\xdc\xbd\x3e\xbe\x0e\x44\x42\x12\x6b\x8a\x50\x09\xca\x8e\x36\xf6\xff\x7e\x3f\xcc\xe0\x49\x82\xb2\x1c\xbb\xdd\xdd\x73\xba\xfb\x7d\x8d\x4c\x82\x03\x60\x30\x18\x0c\xe6\xc9\xca\x7d\x17\xc0\xdb\x82\x4f\xde\xbb\xdd\x04\x51\x8c\x08\x55\xab\x77\x53\xe4\xdd\x6a\x7a\x4a\x31\x69\x54\x0c\x82\xa3\xae\x02\xf2\x0c\x2b\x67\x34\xbc\x9b\xd2\x33\x26\x88\x60\xb9\x00\x56\xf1\xeb\x4c\x94\xf2\xcb\x09\x4d\xa1\x03\x42\x01\x4f\xa4\xa0\xa0\x50\x2e\xc7\x34\x57\x2c\x87\x50\xf2\xa9\x2c\xe8\xf4\x07\xf0\x5f\xc3\x63\x18\x8d\x87\x8c\xc6\x63\xd0\x4a\x41\x67\x98\x7d\x40\x29\x8b\x4a\x3e\xdd\x1a\xf0\x42\x25\x21\x55\xb1\xe4\x25\x9f\xbe\xa1\xf9\x01\xe6\x9a\x8b\x69\x6e\x72\xcd\xd9\x17\x47\x18\x36\x6b\xdf\xab\x38\x5a\xdd\x6c\x7b\x86\xcb\xf7\x66\xac\x02\xb8\x12\xf5\x20\x1e\x9b\xf8\xac\x92\x4f\x77\x26\xd3\x32\xc5\x84\x6b\xf8\xcb\xbc\xc8\xe3\x62\x3e\xc5\xd4\xb6\x4c\xff\xb6\x2f\x13\xf5\x22\x71\x1e\x16\x05\x78\xd8\x43\xbd\x49\xfd\xf0\x67\x4e\x13\x96\x6c\x63\x06\xfa\x0c\xfe\x30\x79\xe8\xcd\xeb\x77\xac\xa4\x89\xdb\x64\xa2\x1e\xb8\xcd\x0e\x55\xcc\xbd\x6c\x61\xa3\xee\x4b\x3e\x3d\xa0\x33\x08\x71\x98\xca\x7f\xcd\x43\xc4\x9d\x8b\x38\xf9\x08\x83\x73\xa6\xf8\xcb\xbc\x28\xf8\xa8\xc0\x78\xbc\xa9\xfa\xa9\x5f\xbd\xa7\x25\x33\x18\x94\x47\x89\x8f\xbd\x43\xc6\xce\x74\xd4\xfd\x99\xc5\x84\x7c\xac\x62\x46\xf1\x97\x79\x51\xd2\x0c\x93\xdc\x0b\xfc\x65\x5e\xcc\xc4\x14\x33\xd9\x08\xfc\xa5\x5f\x1c\xa5\x13\xf6\x61\xaa\xd2\x4d\x97\xe9\x84\xcd\xa6\x26\xdd\x74\xc9\xa7\xbf\xf0\x6c\x36\xb1\x23\x3c\x87\x3f\xfd\x31\x7e\xa4\x10\x29\xd4\x27\xad\x0b\xfc\x55\x89\x65\x90\x14\xfb\x26\x4b\xe3\xb3\xfd\x7c\x8f\xe7\x90\x9b\x12\xeb\x97\x6a\x6e\x2f\x37\x64\x47\x57\x00\x79\xc7\x07\x69\xc6\xc8\x21\x1d\xd2\x22\xb5\xce\x21\xa0\x85\x41\xd7\x9c\x6c\xae\x1c\x38\xe5\xc5\xce\x7a\x7c\xf3\x1c\x01\xe4\x3c\xc7\xf4\x98\xd8\x89\x39\x65\xbb\xaa\x68\xf4\x84\xd1\x5c\x90\x84\x65\x6c\x84\xe6\x5b\x00\xa2\xe5\x17\xa1\xcc\xb8\x08\x4b\xf6\x1a\x41\x99\xea\x0b\x5e\x9c\x51\x48\x3f\xa8\xbc\xc2\xe4\xf1\x3b\x1b\x91\x34\x3f\xe7\xd9\x39\x13\x52\xac\xa6\xf1\xd8\x2b\x00\x03\x90\x11\x90\x11\xbc\x38\x5a\x73\x30\xd8\x0c\xca\xb1\x3b\xba\x31\xa5\x1a\xfb\x6d\x96\x16\x67\x62\x22\xdf\xf1\x62\xd4\x1b\x64\x7c\xd4\xa3\x45\x3c\x4e\xcf\x99\xe8\xad\x3f\x59\x7b\xd2\x7b\xf2\x5d\x0f\x80\x9f\xc2\xdc\x4f\x13\x96\x81\xce\x0c\x21\xfd\xe7\x4c\x94\x50\x5c\x27\x2d\x95\x62\x14\x15\xc4\x38\x51\xe3\xde\xa4\xc5\xa6\x0b\x5d\xd5\x1b\x64\x9b\x92\xab\xea\xf3\x84\xe6\x73\x84\x27\xa5\x80\x33\xc6\xb0\xc2\x3a\x2f\x48\x5a\x46\x64\x8f\x97\x58\x27\x26\x05\x0d\x5c\xce\x94\x5c\x0d\x85\x6e\xa4\x28\x3d\x66\x38\x51\x33\xf1\x54\xac\x28\x59\x68\xc2\xcf\xb1\x5a\xb7\x31\xe3\xec\xe7\xd9\x5c\xe2\x1d\xb0\xaa\x9d\xee\x74\x85\x5d\x45\x0a\x82\x4c\xe8\x7c\xc0\x5e\x43\x86\x74\x89\x19\x35\x9f\x9a\xf6\xdd\x3f\x44\x04\x2b\x77\x51\xf4\xda\xde\x7f\xe7\x6a\x57\x29\x58\xec\x27\xf6\x60\x0e\x1e\xd7\x39\xfb\x5c\x82\xa5\xb0\x5b\x2f\xe1\x7e\x44\x47\x48\xb5\xc6\x16\x2d\x71\xfb\x13\xda\xa3\xcd\x87\xee\xbd\xe7\x9e\x79\x5a\x75\x87\x53\x5f\x3a\x56\xf8\x98\xe7\x65\x9a\xfb\x05\x29\x41\x76\x55\x20\x20\xa0\x45\x41\x3b\x56\x9f\x9f\x58\x2d\x80\x1e\x8a\x3c\xe3\xc0\xf8\x61\x21\x5b\xa7\x14\x50\x17\x28\x20\xae\xa3\x0e\x2c\xcd\xdb\x82\x31\x25\x6d\xcb\x36\xaa\xae\x3e\x96\xe8\x77\x89\x47\x8a\xdb\x54\x88\xd9\x04\x4c\xc5\x17\x40\x4a\x03\xe6\xc3\x9a\xcc\x4a\x0a\x1e\xc7\x1f\xb5\xb6\x36\x93\xf2\xfd\x5c\x59\x38\xec\x96\xd2\xbe\x85\x54\x98\xf8\x0e\xf9\x3f\x15\x5c\x34\x84\x21\xd9\x21\x5b\x97\xb9\xab\x8a\xbb\x07\xd6\x50\x4e\xc1\x97\x9c\x7c\x42\x96\x06\x69\x14\xc5\x0f\xf3\xdd\xed\x4f\xa8\x97\x90\x83\x92\x44\xfd\x09\xa6\x86\x4c\x50\x7c\xd2\xfd\x0a\x86\xaa\x84\xb7\xbc\xc0\x2f\xdb\x2e\xb9\xe8\x31\x58\xcb\xa9\x7f\x1f\xab\xae\x41\xb3\xf5\xcd\x77\x7d\x94\x70\x7f\x2c\x27\x99\xb3\xbc\xe4\xb5\xf9\x79\x2c\x3f\x38\x71\xaf\x9a\xae\xdb\xa3\xf9\xb6\x16\x05\x42\x70\x1f\x28\xf1\xb5\x36\x11\xf9\x51\xa7\xd1\xd5\xd0\x9d\x86\x36\xb1\xf9\x9e\x5e\xea\x0e\x68\x49\x33\xe8\x82\x0c\xab\xb2\x25\xef\x45\xc6\x4f\x5d\xdd\x8a\x20\x58\x5f\x99\x0d\x2d\xeb\x90\x0f\xc1\xc5\x56\xee\xef\x88\xec\xe6\x64\x77\x67\x6d\x4d\x7f\xeb\x02\x75\x3f\x07\x6f\xc1\x57\xba\x26\xdb\xf7\xa8\xe7\x07\x23\x00\x52\x96\xad\x7b\x80\xb7\xca\xd2\x05\x24\xe4\x1d\xeb\x22\x2d\xc7\x8a\x0e\x1d\x38\xb3\xbc\x4c\xc1\x41\x70\x4c\x05\x1a\x9d\x20\xa6\x01\x5c\x1f\x13\x32\xc8\xe4\x95\x37\x21\x74\x44\xd3\x3c\x72\x41\x5e\x7f\xb5\x4a\x85\x98\x31\xd1\x7b\xf1\xf2\xe9\xda\x5f\xe1\x77\xcc\x27\x90\x7d\x7d\xfd\xf9\xb3\x6f\x5f\x3e\x7b\xfe\xfc\xa9\x81\x07\xc5\x85\x69\x7e\xc8\x40\x3f\xaa\xa7\xbc\x49\x4a\x3a\xaa\xd6\xa2\xbb\xbc\xb4\xeb\x01\xaf\x5a\x1b\xde\xbe\xaf\x81\xf1\x19\x80\xf0\xde\x3d\x58\x0b\x12\x7f\x68\x03\x5a\xba\x09\x52\x85\x72\xc8\xae\x90\x66\x73\x57\x60\x85\xa8\xf5\xb7\x90\x46\xaf\x37\x56\x5f\x5e\x92\xe0\x07\x01\x9b\xb4\xe7\x41\xbb\xc7\xf9\x74\x51\xcf\xc6\x3a\xed\x7d\xf5\x91\x19\x2b\x23\x58\x34\x95\xce\x20\x9b\x6b\x61\x00\xf5\xc2\x24\x99\x81\x3a\x43\xae\x7e\xea\x46\xb7\x7d\x64\x64\x90\xd1\xf8\x0c\x2e\x05\xa9\x52\x31\xb8\x97\x83\xaa\x43\x36\x34\x54\xa6\x54\xc9\xa1\x99\xd2\x6f\xa5\x39\x39\x3c\x7c\x1f\x55\x67\xb0\x64\x94\x60\xfd\x88\x72\x8f\x8f\x10\xcf\x01\x22\x28\x66\xcc\x09\x51\xf0\x49\x52\x9f\xd2\x2d\x9f\xf6\x16\x28\x1b\xf5\x28\x16\xd2\x20\x59\xfa\x36\xae\xe7\xd4\x48\x57\xcd\x87\x7e\xe5\x88\xb0\x5a\x79\x97\x7a\x9b\x46\xeb\xf4\xd0\x8c\x40\x6d\xdf\x6c\x15\x8c\xc0\x09\xa6\xaa\x09\x42\x30\x08\x54\x0a\x54\x67\x00\x84\x4b\x2a\x57\x6e\xeb\x7e\x64\xe8\xc1\x82\xf3\xbc\x8e\xa5\x14\xe5\x86\x55\xa5\x39\x4d\xce\x59\x21\xf7\xa0\x13\x49\xe4\x46\x30\x90\xa3\x71\x2a\x2c\xb4\x81\x7c\x28\xc8\x0c\x4e\xed\x2c\xcd\x19\x2a\x50\x8d\xee\x49\x3b\x1e\x19\x13\x2d\xe8\x9a\x90\xe1\xa3\x6f\x78\xe0\xa8\x35\xe4\xb6\x14\x1a\x6b\xe5\x4f\xf1\xa4\xf7\x45\x3d\x17\x12\xbe\x3f\xa0\x73\x79\xc9\xeb\x92\x0b\x1a\x58\xdf\x45\xa2\x9e\x11\x59\x7f\x04\xa5\x5b\x18\x80\x2b\x12\xa6\x64\x93\x3c\xd9\x20\x29\x79\xe5\xf7\xad\x3c\xcf\xe4\x9b\xc7\x9b\x36\x46\xd1\x95\x22\x37\xfd\x2f\x8e\xd3\x93\x0d\xaf\x8d\x36\x14\x55\x5a\x91\xc7\x64\x6d\x39\x41\x70\xb1\x84\x63\xba\xb8\x4b\x11\xa7\x51\x0c\x31\xbd\x2d\xee\xa3\x2e\x7f\x2c\x3c\x3d\x16\x40\x5d\xbc\xb3\x75\xbf\xbf\xa8\x90\xaa\x90\x3c\xb5\xe4\xd6\xaf\x8e\x21\xe0\x1c\x2e\x2f\xa3\x25\x5b\x0a\xde\xe2\x23\xb0\x61\xb8\x4b\xef\xaf\x06\x7c\xfd\xef\xe3\x48\xfe\x8a\x2c\x42\x5a\x23\x2b\xf2\x94\xd3\xbe\xa3\x4e\xd3\x6d\x13\x55\xd5\xc6\xdf\xcc\xb0\x9c\x8f\xda\xe6\x20\x05\x3d\x73\x49\x32\x6a\x6e\x89\xab\x72\xcc\xd2\xc2\xc6\x9d\x28\xc8\x5d\xc2\x3e\xc7\x6c\x5a\xea\xba\xaa\x92\x75\x78\x5a\x4b\xf4\x45\xfb\x1a\x35\xab\x55\x16\x6b\x94\xe8\x27\xbe\x05\xa0\x3a\x29\xed\xbc\x7c\x8d\x9d\x40\x13\x6f\x05\xd8\x48\xf2\x0f\xb9\xf6\x22\x8d\x0d\x48\x40\x6d\x47\xfb\x90\xde\x00\xb8\x7b\xf1\x0a\xf1\x03\xd0\x82\x2f\xf2\x62\xdd\xb0\xb4\x77\x88\xd4\x8e\xfe\x43\x90\x89\x60\xc0\x08\x6a\x98\x06\x73\xbd\x30\x66\x5c\xaf\xad\x06\xe5\x82\xe9\x68\x0e\x0b\x0c\xca\x28\x91\x57\x87\xbf\xfc\xed\x7b\xb9\xaf\x5e\x4d\xb6\x8e\x7e\xfc\xbe\x1a\x46\x15\x1c\xf1\xe5\x25\x31\x35\x9f\xc1\x6c\xe7\xa5\x30\xe8\x92\xd6\xab\x6f\x04\xe9\x81\xf5\x08\x75\x43\xb3\xe9\x54\x05\x3b\x49\x1c\x45\x64\x2b\xbb\xa0\x73\x01\x56\x24\x1b\x07\x05\xd6\x11\xa0\x3d\x15\x73\xa5\xa3\x9f\xd1\xfe\xd7\x09\xc6\x13\xa9\x6b\x20\x98\xab\x5a\x9e\x58\xf3\x46\x11\xb3\xdc\x97\xf0\x9a\x9c\xa7\x94\x38\x86\x18\xc1\x49\x5a\x0a\x72\x7f\x4a\x0b\xc1\x8a\xd5\x34\x17\x92\x0d\x24\xf7\xc9\x30\xa3\x23\xe2\x6e\x79\x55\x44\x1a\xc4\x4c\xa8\x3f\xec\x04\x94\xb1\xcf\x2c\x9e\x95\xcc\x59\xe4\x24\x3d\x27\x9b\x64\x91\xe5\xa9\x95\xa4\xe7\x36\xbe\x37\x49\xcf\x3d\xf3\x50\xeb\x95\xb2\xbe\xbd\x02\x3c\xf4\xd4\x5f\xad\x0d\x39\x14\x26\xb2\x34\x2f\x57\x55\x75\x51\x48\x92\x68\xc7\x79\xa4\xe2\x45\x47\x33\x5a\xd0\xbc\x54\xfa\xb2\x79\xca\x32\xb0\x23\x22\x16\x74\x20\x98\x33\xe2\x61\x5a\x88\xf2\xcd\x38\xcd\x12\xb2\x09\xc3\xb1\x0f\xcc\x20\xcd\x0e\x54\x4d\x90\xe3\x42\x9b\xb6\x6d\x5e\x3f\x02\x95\x4c\x8e\xe5\xc0\x53\xd1\x70\x6d\xef\xf5\xc8\x83\xb7\x19\xbf\xd8\x95\x57\x53\xf2\xc9\x43\x97\xa9\x8a\x3d\x50\x07\x82\xd2\xe5\x7c\x64\x03\x62\xc8\x52\x84\xc6\xb9\x68\x0d\x70\x87\x7d\x81\x6a\x9a\x66\x70\x57\x8d\x47\xd2\xa1\x36\xc2\xc2\x8b\x41\x41\xf3\x78\xec\x1e\x23\x48\xe7\x9f\x0c\xa4\xcb\x4b\xe2\x14\xde\xa6\x03\x7e\x6e\x1c\x4f\x65\x73\x4a\xde\xa6\x05\x1b\xf2\xcf\x64\x30\x1b\x45\x6e\x37\x5f\x69\x35\x7d\xf1\xed\x77\x2f\x9c\xad\x9d\x27\x0d\x60\x06\xb3\xd1\x3f\xd2\x2c\xa3\xd1\x84\xe3\xbf\xbc\x18\xf5\xc4\x98\x5f\x9c\xca\x81\xc4\xa3\xf4\x75\x9a\x6c\xae\xad\xbf\x7c\xb1\xfe\xec\xc9\xd7\xa0\xd4\x3d\xa9\x5c\x24\x2e\x0b\x64\xef\xb0\xed\x5b\x56\x1d\xb6\xbb\x42\x1c\x35\xe7\x92\xdc\xd7\x84\xda\x04\xd8\xd8\xc3\x87\xf5\x84\x42\x3a\x4a\x0d\xd3\xe6\xd8\x51\x63\x0e\x90\xd6\xb1\x52\x4d\xca\xce\x94\xcb\xb4\x6a\x70\x82\x41\x8c\xd7\x64\x28\x72\xb3\xf1\x38\x2e\xd7\x6a\x9a\xd5\x38\x46\xaf\xcd\xb1\x6c\x52\x8f\xe3\x0d\x65\x28\x28\xe9\x08\x63\x46\xd2\x8a\x13\xb4\xf6\x3d\x55\xde\xdb\x7e\xb4\xe9\x84\xa9\x78\x3f\x94\x52\x08\x55\x19\x2e\x9c\x00\x53\xb0\x58\x01\xd7\x84\x58\x60\x10\x7c\x30\xc8\x35\x77\x78\x3c\xd6\x59\xa8\xf0\x6d\x23\x4c\xea\xa5\x54\xd6\x53\xf7\x68\xaf\x4b\x36\x52\xea\xde\xe3\x09\x93\xa2\x0d\xb8\xf0\x5d\x6b\x8d\xfd\x4a\x49\x23\xf2\xfb\x83\xde\x3a\x4d\x5a\x7e\xcf\x37\xda\x15\xd7\x40\xe1\x5f\xd0\x8b\x83\x66\x01\xcc\xb5\xc5\x2f\x2b\x0c\xb8\x50\x01\x9d\x4d\xfe\xdc\x9e\x3b\x78\xe0\xbb\x86\xa0\x19\xb5\x19\xee\x55\x63\x3b\x1e\x3e\x74\x96\x27\x12\xf2\xb1\x44\x65\xb3\x1f\xd5\x37\xc2\x9e\xf9\xd0\x1c\x23\x8a\x3e\xf8\x0f\x90\x6e\x14\x71\xd1\x1c\x29\x48\x6b\x4f\x41\xb8\x2e\x39\xba\xa5\x10\x31\x1b\x94\xd9\x5c\x92\x52\x73\x24\x4d\x1b\x32\xce\xb4\xb6\x2c\xa1\xba\x67\x6b\x35\x5a\xc5\x0d\x74\x54\x94\x68\xee\xdb\xef\xe8\x19\x43\x79\xc9\xd8\x1d\x40\xc8\x4a\xc5\x3b\x3e\xcb\x41\xca\x62\x43\x5e\x30\x79\x60\xa2\x11\x6e\xae\xc4\x62\xc1\x94\x85\x50\x7b\xff\xc0\x41\x20\xfb\x11\x17\x69\x19\x8f\x21\x6f\x97\xc6\x1b\x6c\x92\x56\x0a\x45\xb0\x5b\x7d\xe7\x11\x32\x17\xf5\x08\x52\xc1\x7a\x56\xf8\x76\x4b\x19\x91\x5b\x5d\x34\x20\xb7\x5c\xeb\x92\x99\xf3\x54\xc5\x30\xea\x95\xd7\xcf\x01\xa3\x1b\x4e\x77\x90\xe9\xd2\x1b\x00\x9d\x25\x29\x37\xfd\x5b\x21\xca\x18\xd8\xb4\x1b\x80\xeb\x6f\xa0\x5a\x1b\x6d\x04\x26\x3a\x4a\x73\xd7\x4d\xa0\xaa\xb1\x73\x5e\x55\x55\x80\xf0\x79\xc7\x57\xd6\xd5\x30\x01\x8d\xba\x6e\x0f\xc7\xf0\xe8\x24\x88\x91\xba\xe9\x66\x69\x1c\xa9\x84\xf9\x0b\x97\x64\x07\x5d\x05\x8c\xcf\xc0\xad\x16\x25\x9d\x8c\xbc\x25\x81\x62\x42\xb7\xef\xff\xf7\xa6\x25\x2c\x94\xba\xa8\xb3\xf7\x0c\x92\x89\x43\x11\x01\xf8\xb1\xec\x28\x0f\x67\x03\xc8\xd0\x4d\x5a\x42\xff\xba\xcd\x48\x55\x54\xe3\xe2\xc1\x1e\xf1\x11\x94\xec\x21\xad\x52\xff\xba\xd5\xa2\xe6\xd3\x99\xdd\xd7\x69\x9e\x96\x1f\x0b\x2a\xcf\xcb\xc3\x92\x56\x54\x30\x15\x7e\x6d\x3b\x19\xb1\xf2\x47\x2e\xd0\x16\xbb\xf8\x8b\xe0\x8c\x94\xa2\x5b\x4e\x29\x35\x3f\x03\x73\xea\xf5\xc8\x5b\xf0\x67\xcc\xcb\x82\x67\x19\x4b\x2c\x5b\x15\x92\x23\x52\xbc\xba\x69\x63\x3c\x2a\xc1\x95\xba\x26\xd3\xba\x70\x0b\xab\xe4\x44\x7b\xef\x44\x64\x47\x45\x67\x95\x60\x5d\x80\x54\x51\x86\xb5\x68\x21\x78\x59\xad\x7a\x4b\x83\xb5\xcc\xbe\x86\x76\x3e\xc5\x64\xd6\xe6\xaa\x63\xcf\xcb\x6b\x50\x18\x42\x7a\xe5\xac\xaf\x7d\x53\xe7\x1d\x90\x9c\xb3\x71\xd9\xaf\x83\x17\x1c\xc3\xfa\x9f\x4b\xbf\xd4\xd2\x1b\x1b\x65\x23\xf6\xaf\xc1\x64\x10\xfb\x4f\xff\xc4\xfe\x35\xd8\x4f\xd8\x90\xce\xb2\xb2\xbf\x80\x43\x82\xcc\x45\x85\x60\x45\x09\xf9\x0f\x70\x3b\x82\xb0\xaa\x14\x97\x8e\x29\x60\x85\xdc\xd6\xbb\x66\xba\xc0\xb3\x06\xe1\x37\x4a\x68\x1e\xd7\x0e\x48\x89\x56\x40\xb4\xb9\xba\x30\xda\x6f\x96\x4f\x94\xc4\xc8\x0b\x92\x70\x90\x14\xe3\x8c\xd1\xdc\x02\x9b\x4d\x49\xce\x62\x26\x04\x2d\xe6\x2a\x0d\x12\x38\x39\x9d\xb3\x02\x2a\xa9\x48\x6a\x8a\xcf\x94\x98\x39\xe1\x85\xc9\x30\x0a\xcf\xdb\xa1\xe3\x88\x8b\x12\x04\x55\x45\xe7\x37\x64\x57\xb5\x2d\xf3\xef\x37\xe3\xeb\x36\xe8\x75\x27\x44\x0d\xde\x2d\x59\x7e\x0d\xde\x35\x4c\xa7\x79\x23\xd5\x54\x69\x3c\x7f\x83\xae\x69\x8d\x36\x6e\xb3\x7c\x47\x2a\xdc\xb4\x24\x13\x3a\x07\xa5\xe5\x80\x11\x61\xdc\x0c\x0f\x7f\xf9\x5b\x97\xbc\xa3\xe5\xf8\xdd\xcf\x72\xed\x2a\x71\x03\xd6\xcf\xe4\x5a\x17\xcb\xc0\x02\x5d\x55\x27\x76\xa5\x3c\x98\xdf\xd0\x2c\x9e\x65\x5a\x41\x9b\xa4\xc3\x21\x19\xb0\xf2\x82\x69\xb7\x9c\x0b\xae\xbc\xc0\x44\x64\x6f\xe0\xb2\xd9\xe2\xbb\x77\x46\x45\xf9\xde\xdc\xbf\x73\xf6\xd9\xf9\xab\xf9\x36\x7e\x83\xeb\xb4\x0b\xd2\xaa\xa5\x20\x27\x8b\x6b\x21\x25\x9b\x36\x8b\x2e\x64\xfe\xa5\xea\x08\x31\xf6\x0b\xed\x56\xb7\xf8\x8e\xe8\x71\x20\x03\x64\x91\x34\xe8\x62\xc0\x2c\x83\xe9\x6d\xd1\x97\xb5\xa9\xc9\xff\x55\x67\x75\x7c\xb2\xec\x5e\x6a\x1a\x6d\x65\xd9\x6e\x34\xde\x80\x8b\xd0\x6d\x46\x5c\xd9\xad\x8d\x23\x5e\xbf\xc5\x88\xd7\xef\x74\xc4\x35\x1e\xdd\x38\xe6\xa7\xb7\x18\xf3\xd3\x3b\x1a\x73\x85\x87\xb9\x63\x75\x07\x14\x1a\x8f\xdb\xe9\x46\x9d\x07\x1a\x50\x86\x0f\xfa\xbe\x3e\x01\x6f\xa0\x7f\x63\x96\xd9\x28\x2f\x39\x9e\xc3\xbe\xcc\xe4\xb8\x78\x6c\x98\x84\xfe\xf3\x8c\x61\x1e\x19\xe7\x81\x72\x48\x35\xfc\x4a\xe9\x71\x1c\x27\x63\x83\x6a\xd7\xc9\xf8\x5a\x1f\x63\x72\x79\x49\xee\xd9\x55\x5a\xd0\xca\x34\x32\x0e\xc6\x64\xb3\xea\x5b\x10\xf2\x53\xbe\xc6\xef\x44\x73\x5d\x70\x3a\x51\x04\x17\xf2\x63\x56\x13\x36\xd8\xd1\x53\x86\xef\xaa\x6a\x2b\xf3\xa2\x3a\x21\xf3\x79\x45\x71\x85\x49\xd1\x1c\x44\xfb\xaf\x49\x75\x11\xb0\xfa\x81\xfe\xdf\xd5\x4a\xb8\xe1\xb1\xe9\xee\x84\xf8\x4e\x97\xbe\x9e\xeb\xc6\x3e\x34\x55\xa7\xc5\xba\x27\x8c\x72\x50\x8c\x8c\xad\x51\x05\x06\x62\xee\x0b\xa6\x9c\xf3\xc1\xab\x16\x43\x38\x52\x31\xa9\x39\x03\xfe\x2b\x3b\x52\xe2\xec\x76\xd1\xc2\x9b\xb7\x4a\x08\xca\x20\xc6\xeb\x4b\x78\xd9\x5f\xee\xc2\xc1\xd1\xb1\xdb\x52\x4c\x80\x4b\x33\xac\x28\x40\x76\x87\x20\x46\x1b\xed\xab\x1e\x82\x13\x0c\x81\xb7\x36\xe7\xda\x37\xa6\x98\xcc\xfd\x7e\x8c\xda\xf2\xfb\x64\x98\x0e\x58\xa1\x0b\xcd\x4a\x3e\x21\x8c\x19\x55\x70\x03\x8b\x2a\x9f\x50\xef\x06\x89\xed\x50\xd2\xaf\xd8\x8d\x81\xb2\xbd\x53\xc0\x25\xed\xe6\xe3\xc1\xa3\xcc\x2f\xfe\xdd\x97\x66\x19\xe1\xe0\x72\x8a\xae\x31\x89\x76\xe6\x49\x71\xd2\x34\x49\x9c\x34\x94\xbf\xcd\xd8\x0c\x53\x04\xe9\x6c\x3e\x0a\x03\x8c\x5c\x8c\xd3\x92\xa1\x2b\xab\xf2\x7e\x85\xb9\x91\xe9\x98\x0a\xe3\xfd\xa3\x67\xd2\xae\x0e\xd6\xff\xfb\xf2\x92\x1c\x9f\x74\x30\xfe\xdd\xfa\x08\x4a\xf6\xe4\x9a\x11\xea\x7c\xb3\x16\x9c\xb1\x64\x60\x85\x2b\x2e\xba\x7c\xcb\xa9\xa7\x12\x60\x99\x35\x6f\xfd\xe5\x42\x41\x3c\x0f\x6e\xb9\x29\x4c\xcf\xfe\x0b\x93\x1c\xdc\x8e\xec\x0e\x78\xf4\xff\x86\x20\x11\x7d\x6c\x54\x67\x06\xb9\x92\x05\x53\xb3\xc1\x10\x12\xdd\xee\x93\xc9\x0b\x24\x9f\xea\x4e\x3e\xd9\x71\x84\x8f\xac\x3a\xf2\xdc\xce\x9b\x8f\x2c\xb9\xae\x96\x56\xe0\xe4\xd6\x7f\x2c\x38\xe7\xaa\x27\xd9\xb5\x47\xdd\x35\x87\x9d\x7f\xdc\x2d\x7b\xe0\xb9\x5f\x5d\x79\xc8\x45\xd6\xa5\xb0\x0b\x24\x82\x11\x85\x89\x52\x3d\x58\x6c\x2f\xc2\x6b\x98\x28\x5d\x72\x5d\x8c\x57\xdd\x89\x3b\x03\x48\x16\xae\x83\x6d\xec\xf3\x7f\x1e\x42\x03\x83\x59\x8c\xe1\x9a\x73\xe9\x1d\x84\x42\x5d\x3b\xe1\xc5\x27\x0e\x59\x78\xea\x54\xb1\xe1\xbb\x49\xfb\xbc\xdd\x1b\x41\xc8\xf1\xbf\x2a\x38\x2b\xec\x2d\x15\x37\xf2\x7b\x87\x68\xe9\xd3\x43\x7d\x6b\xd8\xb5\x3d\x34\xbe\x3e\xbc\x4b\x73\x13\xf5\x7e\xd3\x86\x75\x79\xeb\xf0\x35\xe7\xa9\x89\xc0\xf1\xa2\xc4\x16\x13\x1c\xde\xd4\x76\x9d\x34\x6c\x25\xe7\x04\x75\x4a\x3a\x4a\x14\x59\xb9\x4d\xe0\xa6\x33\x36\xba\x70\xb4\xe3\x9f\x3e\x0a\xa2\x65\xd6\x31\x1c\xa3\x66\xd0\xed\x6e\x71\x60\xaf\x8b\xa2\xd7\xb4\x3f\x65\x63\x1c\x93\x8b\xdf\x5b\x61\xf7\xe0\x5f\x34\xbe\xe9\x77\x8b\x0e\x42\xbf\x66\x46\x47\x10\xd1\x8d\x82\x34\xca\x8f\x52\xa2\x3d\x07\x6d\x23\x9f\x8d\xc6\x9a\x40\xa0\xc4\x17\xc8\x8a\x92\x20\xe6\xac\xf4\xb9\xd3\xbf\x63\xa0\x51\x88\x71\x7a\x92\x9c\x4b\xab\x55\x65\xc8\x1d\x5d\x4c\x9a\xae\x26\x68\x1e\xba\xe1\xd5\x64\x89\xcb\xc9\x57\x5f\x40\xf2\xb9\xba\x80\x98\x38\x37\x6b\x79\x0b\xdc\x3e\xc0\xd1\xb2\x1c\xb3\x9c\x5c\x38\x37\x90\x61\x9a\xc9\xe9\xa4\x25\xe1\x33\x37\x3a\xde\xde\x4a\x54\x14\x9e\xbd\x99\xdc\xea\x2e\x12\x8a\x57\xd2\x35\x4a\xea\x87\xe9\x0d\xba\x00\x71\x3d\x70\x20\x5e\x59\x77\x3b\xef\x63\x9d\x9e\x64\x6b\x3a\xcd\xe6\x46\xb1\x1f\x55\x23\xa7\x1a\x55\xf8\x95\xc0\xa9\x6b\x34\xfa\xd6\x93\x2e\x18\x20\xd5\xec\x4a\x57\x53\x86\xde\xdc\x1b\xaf\xa6\x13\x0d\xcc\x9a\xfc\x9e\x81\x62\x1b\x9e\xe3\xda\x4e\x6e\xbd\xd6\xa8\x46\x33\xee\x27\x11\x8f\x99\x64\xa6\x89\x24\x08\xeb\xb0\x66\x36\xb4\xae\x10\xd0\xeb\x69\xf9\x38\xba\x91\x4d\xf4\x83\xde\x85\x8c\x5c\xa0\x91\x8b\xa8\x14\x16\xd0\x54\x90\x47\x74\x58\xb2\xe2\x91\x8d\xe5\x41\xfb\x15\xf2\x96\x31\x15\x5e\x4c\xc2\x58\x42\xc8\x09\x7c\xa2\xe5\x48\x0f\x7f\x9f\x22\xb2\x2f\x37\xe8\x45\xaa\x22\x06\x9e\x63\x3f\xda\x7a\x93\xf2\xdc\x71\xdc\x2f\xa8\x6c\xa6\xbc\x14\xb1\xd4\xdb\xb4\x40\xff\x34\xbc\x4d\x5e\xe8\x34\xf5\x05\x9f\xa8\x4c\x57\x54\x88\x74\x94\x33\xa3\x1e\xc0\x41\x84\x4c\xaa\x15\x22\x58\x71\x8f\x1c\x4c\x5f\x0b\xa6\x52\x7d\x3d\xd5\xe7\xcb\x24\x85\x42\x2e\x3a\xff\x19\xc2\xef\x12\x31\x8b\xc7\x50\x3d\xc6\xc2\x79\x4f\x93\x94\x93\x51\xc1\x67\x53\x22\xc6\xe9\xb0\x34\x4c\x43\x02\x66\x89\x53\x00\x2a\x47\xb6\x95\xd3\x09\x4b\x48\x01\xdf\x01\x5e\xfc\x59\x40\xac\xd1\xee\x10\xed\xf7\x49\x48\xfb\x7c\xbd\xc5\xc1\xc3\xc7\x32\x06\x99\xeb\xcc\x2e\xbd\x1e\x79\x85\x8f\xbe\xf7\x50\x02\xcc\x1f\x7c\x41\x79\x1c\xcf\x0a\x45\x14\xaf\xd0\xcc\xf4\x7d\x55\x94\x83\xac\x1f\x31\xcf\xe3\x34\x4b\x81\x0c\xd4\xf3\x29\x17\xe5\x87\x65\x97\xb0\x32\x60\x3f\xd6\x4a\xee\x6a\x4c\xb2\xe8\x17\xae\x58\xe4\x01\x5c\x89\x4b\x5a\xc6\x08\x59\x90\xa6\xf4\xe4\x8e\x1f\xc5\xf1\x22\x71\xeb\x04\x03\x73\xbc\x1c\x90\xb7\x70\x36\xfe\xd3\xd1\xf8\x5f\xd5\xd1\xf8\x8f\xf7\x2d\xfe\xd3\x87\x38\x60\xa0\xbb\x6b\x5f\xe1\x7f\x71\x9f\xe0\x7f\x3d\xdf\xdf\xdf\xd3\xc7\xf7\x4e\x7d\x79\xff\x74\x10\xbc\xb5\x67\xee\x5d\x7b\xd9\xfe\xb9\x24\x77\xe5\x31\xfb\xbf\x1e\x93\x0b\x1c\x35\xac\x44\xe8\xfb\x69\x58\xa1\x8f\x79\x59\xc3\xf7\x54\xca\x6e\x79\x43\x39\x64\xa5\x5b\x17\x9e\xba\x99\xc5\x1d\xa9\xc9\x3e\xc7\xb6\xa1\xec\x20\x4e\xb1\x0c\x93\x1a\xe4\xf1\xe3\x8a\xe6\x19\xeb\xa1\xda\xa6\xc7\xe9\x49\xd4\x54\xa8\xde\xca\x20\xd5\xea\xa7\xbd\x1e\xf9\x61\x96\x66\xe5\x2a\x26\x04\xf2\x4b\xc7\x19\x4d\x08\x4b\xcc\x07\x8a\x73\xd3\x92\xae\x42\x5c\xab\xc4\xbf\xa1\xc5\x0a\xc5\xaa\x0e\xde\x58\x6a\x71\xb0\xa2\xeb\x69\x9b\xe2\x79\x75\xa5\x31\xe4\x02\xc4\x42\xeb\x58\xff\x8a\xe7\x2e\xe9\x95\x74\xe4\x38\xf1\x28\x41\x47\xde\x4c\x16\x8d\x07\x9b\xa9\x9b\xd9\xf5\x0d\x91\x6d\x2d\x6e\x59\xf1\x9f\x52\x53\xd8\xf5\x8a\x91\xea\x9c\x63\xbc\x48\x47\x69\x4e\x33\x58\xbf\xc8\xff\xe2\xab\xa3\x8a\xd7\x9e\xbc\x78\xf9\xc2\x05\x16\xa0\xd2\x88\x26\x49\xbb\x4e\x2d\x4d\x61\x9f\xcd\xae\x92\xe1\x1c\x87\x85\xa7\xed\x51\xca\x4c\xfd\xf0\x4e\x32\x1c\x9a\x3b\xd5\xe2\x04\x87\x41\x5f\x18\xc9\xb3\x4a\xb7\x46\x85\xbe\x95\x82\x4c\x0f\x39\xc1\x19\xe6\x6b\x13\xa5\x9b\x41\xae\x9a\x54\x04\x4d\x18\x58\x0f\x99\x26\x3a\x6d\xbc\x4a\x89\x00\x79\xc7\x05\x19\xa7\x49\xc2\x54\x41\xc6\x0b\x66\x72\x97\xc3\x25\xc8\xe1\x7c\x6e\x27\x3b\xd1\x28\x22\xf7\x87\x9c\xdf\xc7\x14\x75\xd8\xc1\xfd\xe1\x2b\x31\xa5\xf9\xf7\x9c\xbf\xea\xc1\x8f\xfb\x60\x6f\x86\x7e\xc0\x99\xdb\x42\x13\xb4\x4c\xc5\x10\xec\x7a\xb3\x82\x14\xec\xb7\x59\x5a\x20\xbb\x21\xfb\xfe\x03\x5d\xf9\xbd\xe4\x72\xf5\x92\x59\xcc\xc8\x94\x15\x43\x16\x3b\x1e\x25\x26\xef\xba\xc3\x87\xc8\x6e\xc2\xb0\xaa\xae\x49\xe6\x32\x55\xe5\x2b\x89\x28\x8b\x59\x0c\xb5\xd4\xe5\xf8\xd2\xb2\xe5\x60\x8c\x9f\xe9\xee\x90\xb3\x93\xf3\x14\xea\x37\x9b\x95\x30\x9e\xe9\x2c\x07\x0d\xbf\x6c\x99\x27\x69\x2c\xef\x22\x17\x63\xea\x0c\x0b\xec\x00\x36\x37\x2b\xde\xb2\x72\x9e\x30\x61\x4d\x4b\x17\x69\xc1\x12\x32\x9b\x92\x92\x3b\xe1\xfa\xc8\x4d\xa0\x4e\xa6\x7b\xbe\x4c\x90\xaf\xd0\x9c\x50\x82\x25\x87\x60\x59\xf6\x78\xc2\x54\x7d\x60\x49\x25\x35\x38\x2a\xbb\x87\x4a\xaf\xee\xb0\x76\x9b\x5f\x01\xf2\x4a\xff\xa2\xb5\x3e\x8a\xc0\x5e\x3b\x7a\xfe\x65\xb3\x24\x42\xc9\x09\xdb\x83\x9b\xdc\xb0\xc9\x1e\xe0\x9b\x40\xee\x35\x69\x29\xaa\x46\xd9\x60\x59\x9d\x86\xbe\x83\x86\x90\x05\x96\x5b\xb2\x49\x8e\xf5\xbe\xb4\xdf\x9e\x34\xda\x0f\x6f\x92\x31\xf0\x1a\x0c\xf9\x36\xb5\x7f\x27\x34\x79\x23\x0f\xe1\x6a\x85\xfc\x99\xbb\x6f\x99\x84\x58\xce\x39\xf0\x8b\x92\x35\xac\x91\xcb\xf1\x5c\x8b\x79\x51\x30\x31\xe5\x79\xa2\x8c\x47\x69\x61\x4a\xfa\xab\x92\x9f\x6e\x36\x16\xa7\xe2\x8e\x6b\xd5\xd7\x16\xa9\xdd\x7c\xc8\x5d\x8b\xfd\x32\x04\xd6\xeb\x91\x6d\x74\x87\x42\x35\xb1\xaa\x56\x91\x8f\x22\xf2\x11\x44\x68\x90\x85\x40\xd3\x94\x65\x8a\x01\x6a\xad\x79\x54\xdf\x42\xbf\x9b\xa1\x98\x5c\x5e\x3a\x7a\xa3\x1b\x49\x77\x5f\x23\xdb\xb9\xc3\x52\x02\x5e\x75\xb4\x46\xa0\xab\xbd\x30\x02\x5c\x05\xd1\xc6\xbe\x7d\x2b\x1f\x10\x5c\xf3\x82\x5e\x5c\xeb\x04\x72\x79\x29\x77\x74\xdf\xf3\x8a\xb2\x64\xa4\x72\x0a\x39\x7c\xc4\x2b\x30\x61\x9b\x6b\x82\x54\x1f\x78\xd5\x4b\xaa\xf7\xbe\x8a\x93\x86\x9c\x9f\xf7\xb9\xdc\xbb\xb6\xfb\xe0\xde\x3d\xf0\x0a\x6c\x39\xce\x37\xe6\xb3\xae\x37\xa4\xc5\x59\x60\x17\xf8\x18\xda\xdc\x42\x6f\xd3\xcf\xef\x18\x59\xd5\xc7\xec\x80\x91\x34\x1f\x32\xcc\xa8\x8b\xb2\x8b\xf1\x88\xb1\x22\x6f\x40\xe0\x3d\x6e\xa1\x77\x6a\xeb\xa4\x5d\x65\x0f\x3e\x2a\xb5\xeb\x39\xa6\x16\xd9\xd6\xc5\x4f\x31\xc1\x8c\xcd\x87\x18\x60\x54\xc2\x2b\xd2\xe5\x2c\xde\xc8\xad\xac\xad\xea\x8c\x36\xac\x04\xf6\x6e\x97\xe2\x97\x6a\xa5\xfc\x25\xd7\x42\xa5\x67\xf4\xc0\x2e\x5e\x8d\xc5\x59\x0f\xff\x88\x05\xf1\xaf\xaa\x8d\x88\x1d\x7d\x4d\x6a\x55\x0f\xd9\xde\x71\x75\x27\x78\x5e\x2e\xed\x71\xa0\xce\x7a\x7d\xac\xd5\xa3\xd6\x3d\x41\x70\xf6\x07\xce\x93\xc0\xf9\x7d\xeb\xc5\x5a\x66\xb9\x74\xff\x91\x57\x96\xcc\x13\x6c\x1a\x57\xed\xe0\x26\x89\x5c\x49\xc8\x8f\xcc\xa4\x2b\x34\x36\xba\x70\x36\x41\x17\x8f\x7e\xeb\x05\xa9\xa7\xf0\x7f\x15\xe0\x0d\xd9\x05\xc1\xa6\x6f\x3f\xba\xba\x5d\x9f\xb7\x5c\xb5\xdb\x6e\xb3\x20\xa2\xff\xa8\x51\x35\xe2\xf1\x0e\x36\xbf\x05\xfb\x4f\x64\x03\xbe\x42\x05\x7b\xf8\x6a\xd4\xe2\x91\x51\xd7\xea\x88\xf4\x1f\x8c\x7c\x4f\x9e\x2c\x79\x89\xb9\xc5\xd2\x86\xcb\x26\x86\x06\xd5\xa9\xd8\x53\xff\x8c\xdc\xff\xdf\x1b\xb9\xef\x99\x7d\x82\x46\x25\xa5\x9e\x43\xf7\x20\x70\xd4\x53\x68\x02\x5c\xa0\x89\x5f\xdb\x15\x20\xc3\xe7\x98\x29\xff\x13\xe3\xfc\xe7\x6a\x89\xe4\x88\x09\x60\x4a\xde\xe2\x86\xbc\x88\x99\x72\x07\x4c\xd2\x73\x56\x8c\x94\x13\x91\xab\xda\xfa\x91\x5f\x48\x14\x75\x65\x6b\x47\x73\x05\xc3\x84\x11\xe1\x24\x6c\x75\x9c\xdf\x66\x29\xd4\xf9\xb3\xd9\x84\x4b\x55\xed\x47\xb7\xb5\x60\x94\xbe\xad\x60\x22\xc5\xd4\xfe\xca\x31\x71\x7b\xff\x1d\x11\xa5\xbc\x8b\x82\x3f\x97\x2a\x5e\x68\xba\x48\x54\xbc\xcc\x98\xd9\x55\x32\xe4\xf2\x86\x43\x51\x6d\x2c\xeb\x9e\x70\x74\x37\x52\xe5\x72\xea\x78\x8c\xea\x6b\xd3\x9c\xb5\xc0\xa8\x6c\xff\x9d\xa3\x70\x1b\x9d\x1e\x83\x4e\x42\x47\xec\x73\xa9\x12\x17\xee\xf1\x84\x75\x01\x71\x5e\x2d\x3e\x75\x0a\x40\x75\x0d\xd5\xca\xd1\xf0\xc9\xc3\x44\x3e\xde\xb0\x3d\x3b\xdf\xf8\xfd\x2a\x26\xfa\x21\x07\x15\xef\xc2\xbe\x11\xd1\x61\x7d\x53\x7d\x14\xea\xcb\xba\x3b\x94\x02\xb0\x8d\x91\x7a\x38\x67\x3a\xc8\x9c\x64\xd4\x4a\x8c\x82\xee\x41\xe3\xe9\xf6\xff\x3b\xd6\xbc\xad\x3a\x0b\x6d\xab\x1a\xc1\x78\x85\x51\xe7\xac\xd2\xad\x73\x9d\xc7\x9a\x50\x95\x32\x33\x87\x7f\xa3\x96\x1a\x33\x60\x62\xaf\x66\xfe\x32\xae\x5d\x1a\x59\xf5\x26\x37\xc0\x99\x5a\xad\x7f\x2f\x84\x99\xf2\x39\x90\x52\x1d\xaa\x70\x07\x91\xa7\xc8\xe8\x16\xf8\xda\x55\x11\x1a\x7a\x63\x85\x49\xcc\x66\x10\xfa\x27\xa1\xcd\x94\xc1\x6d\xa4\x30\xd8\x9c\x92\xab\x56\x49\x0d\xc7\x7e\x77\x18\x0a\x10\x54\x95\x01\x00\x6f\xd6\xb5\xdc\x5b\xad\x6a\x35\x19\xb5\xf6\x60\x35\x91\xb0\x55\xb9\x39\xb3\xe0\x42\xc9\x01\xe5\x98\xcd\x5b\x4a\x27\x57\x30\x30\xdd\x80\x2c\x91\x3a\xe2\x83\x2e\xa6\x5b\x3b\x6f\xde\xeb\xb4\xfd\x52\x18\x71\x22\x0c\x54\xc8\x4e\x4c\x73\x28\x5c\x89\x85\x6e\xd5\x40\x24\xfa\x60\x2c\x0e\x7c\x33\xa8\xa8\x71\x41\xff\x35\xe9\xc0\xee\x1f\x79\xa0\x55\xf7\x10\xa6\xbc\xfd\x1a\xb2\x28\x98\x28\x79\xc1\xac\x0a\xb5\xee\x9c\x54\xdd\x2e\x4b\x0a\xd3\x61\xc8\x81\x92\x18\x56\x76\x73\xb1\xda\x20\xb0\x36\x40\x7d\x7a\x23\xa8\x15\x4f\xa0\x06\x98\xeb\x4b\xc1\x04\x74\xca\x53\x1a\xbc\x47\xb7\xf7\xdf\x81\x33\xa8\xd1\x68\x91\xcd\x4a\x24\xf0\x97\x95\xbf\x78\x79\xac\xfb\xd5\xd2\x0c\x5d\xdd\x40\xa7\x18\xee\xd7\x52\x1c\x77\x57\xfe\x12\xca\x31\xdc\x6f\xc8\x3c\xdc\x5d\xf9\x8b\x9f\x10\xa9\x5f\x4b\x90\xd4\x5d\xf9\x4b\x35\xe4\xa2\x1f\x08\xc2\x50\x90\xea\xce\xcd\xfd\x46\xa7\xe7\xca\x27\x72\x12\xfd\x80\xf0\xd3\x5d\xf9\x4b\x48\x32\xe9\x37\xc8\x2b\xb6\x79\x93\x58\xd1\xbf\x5e\xee\x58\x00\xc4\xeb\xbb\xe1\x14\xb6\x9f\x37\x1c\x3b\xfd\x6b\x8f\xa5\x66\x10\xde\x00\xc2\x4c\xbb\xbb\xf2\x97\x30\xe5\xf6\x1b\x28\x7a\xe5\xaa\xb3\x81\x55\x81\x81\xa7\x26\x69\x21\x19\x77\x3a\x99\xf2\xa2\x14\x24\x4b\xe5\x0d\x90\x4f\xd8\xea\x94\xc6\x67\x74\xc4\x7a\xa2\x88\x7b\x8f\xc0\x8e\x32\xa0\x49\x44\xde\xa6\x9f\xc9\x84\x45\x40\xec\x0b\xcb\xaa\xbf\x20\x9b\x6a\x37\xb0\xc1\x6c\xe4\xb6\x8b\x16\x7d\xb7\x81\xfb\x48\xdb\x6b\xb6\xf7\xdf\xed\x31\x51\xa2\x3b\x7b\xad\xaa\xe6\x8a\x2a\x46\x02\x92\xbf\x0d\xe9\x20\xb1\x64\x91\x17\x54\x90\x8b\x22\x2d\x4b\x96\x93\x01\x15\xf2\xc2\x9a\x9b\xb3\xe5\xb9\xe4\x93\xe8\xfe\x3d\x65\x71\x7f\xc5\xab\x8b\x37\x2e\x27\x59\x24\x9f\x47\x17\x63\x5a\x5e\x8c\x20\xeb\xfd\x64\x96\x95\xe9\x14\x30\x32\xcf\x4b\xfa\x19\xaa\x9b\xfe\x75\x4c\xc5\x2a\xcd\x57\xd5\x2d\x62\x35\xcd\x57\x45\xcc\xa7\x0c\xe0\xad\x28\x03\x8f\x5c\x0b\x38\xb3\x4c\x15\x88\x18\x3d\x37\xb2\x8c\x28\x2f\x37\x92\xe3\x24\xbb\x24\x87\x5b\x35\x13\x70\x59\x2c\xe6\xf2\x20\x68\x53\xa1\xbd\x19\xa0\x96\x6c\xa9\xa2\x55\xe5\xe0\xc8\x14\x2e\x27\x31\xcd\xc8\x80\xe5\x6c\x98\xea\x8b\x98\x00\xc7\x8a\xf3\x34\x61\xa2\xb3\xa1\x73\x58\x74\xb1\xb2\x47\x91\x13\x9e\x67\xaa\x94\x2a\x94\xa3\xa7\x82\x09\x72\x81\x85\xe2\x21\x8d\x41\x21\x58\x81\x4e\x20\xa3\xf4\x9c\x11\x8a\x8f\x48\x59\x30\x8c\x57\x62\x60\xfe\x83\x2b\x2c\x0c\x03\x56\x7a\x45\x05\xc8\x96\x50\x22\x39\x82\xfb\x34\xfb\x4c\x27\xd3\x8c\x75\xc9\xab\xc1\xf7\xaf\x92\xf4\xfc\xfb\x57\x3d\xfc\xef\x00\xf2\xcd\xeb\xf9\x0f\x66\xce\xbd\x56\x8e\x50\xd5\x79\x55\x35\x10\x52\xe5\x6a\x82\xc3\x50\x36\xd2\xb8\xcc\xe6\x1b\xf8\x15\x4e\x4a\x4e\x45\x59\x2c\x61\x42\x40\xcc\x12\xb3\x60\xf6\xeb\xf5\xc8\xab\xe9\xf7\x58\x32\xc4\x4e\x75\xc0\x46\x69\x0e\xe1\x12\x3a\xd2\x89\xc5\x3c\x4f\xf4\xbd\x50\x6e\x8c\x2c\x8d\xd3\x32\x9b\x93\x38\xe3\x02\x92\x03\x30\x53\x89\x57\x94\x5d\x28\xe4\x08\xb7\x6e\x79\x62\x0f\xf1\xf7\x84\x09\x11\xad\x7c\x35\x55\x29\xe1\x46\x67\x5e\xc2\xbf\x8e\xe4\xc0\x37\xc9\x71\x8b\x26\x09\x96\x6b\x26\x2d\x3a\x9d\x66\xe8\x2a\x0d\xe7\x23\xfc\x5b\xa6\x31\xfa\x29\x53\x79\x39\x97\x3f\x24\xf5\xeb\x7f\x87\x3c\x87\xf6\x83\x11\xdc\x8c\xe1\x67\xc6\xe3\xb3\xdf\x66\xbc\xc4\x46\x3c\x99\xc3\xbf\xe0\x0f\x3e\x98\x95\x25\xcf\xe5\xaf\x98\xa2\xbe\x44\xfe\x94\x32\x1b\xbc\x8e\x79\xa6\xfe\x81\xb0\x23\xf9\x3b\x01\x98\xda\xa5\x5a\xfe\x4c\x0b\xfc\xe7\x1c\xfe\x81\x0f\x12\x18\x03\x9b\x0c\x18\xb4\x1e\xa6\x2c\x4b\x94\xcf\xf7\x30\x1d\x39\x5d\x0d\xd3\xd1\xac\x80\x71\x0d\x39\x57\x9d\x82\x03\xb9\xfc\x17\xa2\x16\xf4\x0f\xf5\xf9\x78\x0d\xfe\xbb\x0e\xff\x7d\x0a\xff\x7d\x06\xff\x7d\x0e\xff\x7d\x01\xff\x65\xe8\xb4\x2e\xff\x45\x90\x63\x33\xfc\x31\xfe\x5d\x4e\x60\x9c\xa9\xe9\x23\x9d\x8c\xd0\x2b\x55\x4a\x37\xf2\x87\x48\xf3\x84\x7d\x06\xdf\xf7\x14\xff\x9b\x9f\xe1\xbf\xb0\x93\xe5\xcf\x09\x4d\x73\xfc\xb7\xf8\x6d\xc6\x00\xcc\x84\xe5\x33\xfd\x6f\x5a\xb2\x09\xfe\x2e\x61\xe9\x72\x0a\x18\xca\xb9\xc1\x4b\xce\x71\x6a\xf8\x5b\x95\xad\xe9\x9a\xe8\x0c\xf9\x0b\x86\x09\x23\x9f\xd2\x82\x02\xbc\x69\x46\xe5\x1e\xfc\x0c\x0d\xa6\x88\x3d\xfb\xad\x60\xb1\x46\xae\x92\x80\xba\x26\x16\x41\xfe\x02\x23\x21\x78\xd0\x4f\x26\xb4\x00\x52\x80\xe3\x0e\x7e\x68\xe2\x28\x61\x78\x25\x9b\x4c\x33\x8a\x64\x63\x64\x34\xf9\x5b\xae\x15\xfc\x18\xe3\x7f\x15\xbe\xcb\xb4\x54\x70\x0a\xfc\x2f\x8d\x01\x65\x33\x98\xc4\x05\x52\xdc\xe7\xc9\xb4\x75\xb2\xf1\xf5\x7b\xa7\x99\x23\x83\x16\x25\x3f\x94\x7f\xd9\xbd\x64\x36\x90\x43\x74\x7a\xf5\xed\xbc\x13\x3b\x1b\x67\x31\xed\x32\x58\x4c\xdc\x62\xe0\xe5\x24\x83\x2a\xe1\x23\xbc\x34\xac\x42\xa0\xb3\x1b\x07\xb4\x8d\xa4\x35\x4b\xc5\x98\x0c\xe6\x4e\xb1\x2d\xe0\x66\xab\xab\xc0\x00\x5f\x01\x96\xbf\xef\x92\x34\x8f\xb3\x59\x02\x25\x6d\x51\x7f\x87\xa0\x58\x51\x08\x7d\x12\x4a\x06\x21\xf9\xde\x90\x5d\x48\x76\xaf\x5c\x38\x56\x08\xec\x31\x96\x8e\xf2\x7d\x33\xc3\x84\x89\xd8\xae\xe1\xdd\x2e\x10\x32\x19\x6f\x9d\xf0\x91\xbb\x56\xce\xca\x45\x31\xcf\x63\x5a\xb6\x8f\x35\x7b\x3a\xe9\xdc\x62\x3c\x23\x96\x33\x29\x50\xad\x02\xab\x67\xc9\x2a\xcb\x93\x55\x79\x4a\x68\x92\xc1\xc7\x3b\x79\x62\xa8\x46\xf1\xb8\xd2\xee\x7e\x6e\x88\x87\x4f\x4b\xc3\x4c\xe0\x3f\x05\xfe\xb7\x54\x48\x03\x93\xbf\x14\x64\xb6\xf2\x18\x04\x34\x65\x5f\x55\x77\x28\x94\x8b\xfa\xe0\xfc\xd4\x45\xb3\x91\xe4\x77\x47\x74\xa4\x9f\xc9\x47\xf4\x88\x8e\x76\x11\x21\xee\x63\x44\x47\xf8\x5d\xce\x07\x45\xf8\xcd\x14\x1e\xff\x60\x31\xee\xf5\x2e\xf9\xd9\x6e\xc9\xe4\x08\xb6\x66\x25\x97\x87\x20\x54\xd6\xb7\xdf\x27\x59\xd3\x7b\x79\x33\xda\xf0\xdd\x78\x13\x77\xda\x0f\xd6\xc8\x26\x31\xb7\xd0\x36\xcf\x12\xf9\x54\x5d\x36\xa5\xcc\x42\xf3\x98\xb9\x09\xb1\xa8\x8f\xb3\x53\x8c\xbe\x6d\x7f\xb9\xea\x12\xf5\x31\xb9\xbc\xac\xa3\xd7\xf1\x87\x4f\x15\xb6\x65\x1f\x7d\xbf\xa3\xbe\xf9\xa5\x46\xad\xc2\x12\x1d\xc2\x03\x9e\xbf\x3f\xc4\x5b\xef\xbd\xcd\x4d\xb2\xea\x64\xab\x70\x07\x17\x39\x2b\xe4\xb8\x2c\xd7\x9a\x55\x57\x6c\x51\x5b\x7f\x05\xbd\x96\x56\x69\x51\xd9\x38\x37\x18\x71\x8d\x0c\x2a\x3d\x68\xc3\xe1\x21\x63\xa4\x98\x65\x0c\xf5\xfc\x8a\xfe\xcd\x8e\x50\x45\x7f\x54\x51\x40\xfd\xcd\x57\x6c\x4b\x25\x9f\xaf\xca\x43\x74\x35\xcd\xe5\xc9\x63\x26\xe9\x48\x44\xa1\x09\x82\x83\xa0\x2e\x3f\xad\xa5\x25\xef\xa1\x14\x46\xbc\x07\xd3\x56\x03\x56\xc2\xe4\xbf\x68\x99\x42\xdb\x21\x84\x4a\xef\x23\x6d\x60\xda\x04\x02\x75\xa8\x4f\x8e\x10\x6d\x1f\x52\xea\x69\x18\xa4\xe2\x10\xe6\x6b\x9f\x24\x0c\x08\xda\xf4\xbd\x4f\xac\x0b\x61\x28\x8e\xdb\x00\x28\x40\xce\x0b\xa1\x49\x92\x6e\x82\x55\x23\xf7\x85\x90\x1a\x17\x30\x44\xd6\x0b\x21\x65\xe9\x8d\x69\x61\x21\xbc\x04\xbd\x01\xed\xdf\x65\x13\xfc\x06\xca\x71\xa1\xaf\x58\xbd\x93\xf7\xed\x86\x61\xb5\xbd\x47\x8f\x64\xa3\x47\xe4\x3d\xb4\x82\xbb\x8e\xbc\x13\xc1\xc3\x9e\x31\x26\x1d\xd1\x11\x78\xa1\x7e\x4c\xcb\xf1\x01\x55\xb4\x67\x59\xb1\xa3\x61\x76\xdc\xb1\x7a\x3d\xf2\x16\x2f\x3d\x52\x68\x12\xd6\x44\x8c\x91\x55\x69\x0e\xe9\x24\xf2\x99\x98\xd1\xcc\x5c\xb0\x27\x3c\x61\x51\x84\xaa\x56\xad\x35\xac\x41\xbe\x23\x2e\xe1\x59\x3d\x83\x6a\x3e\x83\x3d\xb3\x1e\xea\xe8\xf6\xd6\xc8\x1c\xe2\xde\xd3\xbf\x82\x50\xbd\xe1\x81\x37\x2d\x6f\xd6\x81\x0f\x4a\x72\xd5\xb2\x48\x63\xa8\x29\x3b\x65\xf4\x0c\x54\x01\x82\x61\x86\x89\xdc\x66\x31\xd0\x59\x46\x27\x8c\xe6\x0e\xd2\x4d\x46\x04\x0b\x6f\x30\x2b\xab\xe3\x74\xad\xdd\xf5\x51\xd6\x46\x74\xfb\xd5\x28\x93\xbb\x84\xa6\x04\x74\x0b\x72\x8f\x1b\x2b\x80\xa9\xa2\x6b\xac\x0c\xc2\x1c\x52\x34\xcb\xc8\x80\xc6\x67\xa4\xe4\xe4\x7e\x9a\x13\x79\x92\xdc\x07\xaa\xf4\x0d\xed\xb2\x9d\x2a\x4d\xab\xc1\xc2\x05\x40\xd9\x2f\x2e\xc6\x69\x3c\x26\xa8\x8e\x18\xd0\xc4\x90\xb7\xe9\x5a\x67\x7a\xbd\x53\x0c\x16\xde\x22\x96\xc5\x82\x05\x2c\xc7\x3e\x89\x95\x15\xbe\x83\x37\x3b\xff\x11\xde\x0a\xfd\xcf\xf4\x55\xe6\x6e\x49\xc1\x9c\xdf\x66\x2e\x70\x97\xec\xfb\xcf\xe0\xa6\x58\x79\x36\xf4\x23\xfb\x6a\xd3\x2e\xfe\x85\xa6\xa9\x15\x21\xde\x0c\x8c\x76\xa4\x79\x12\x31\xcf\xfe\x90\x55\x90\xf4\xec\x63\x17\xae\xb8\x0b\x06\x46\x03\xcc\xcb\x4c\xc8\x1f\x32\x2c\xa8\xff\x08\xd6\xce\x7f\x04\x4b\xfc\xaf\xb3\x62\x72\x38\x1e\x46\x3c\x12\xac\x23\x04\x74\x69\xde\xb8\x8c\x56\xcd\x7f\xaa\xf4\x6b\xde\x43\xd0\x11\x79\x4f\x40\xf7\xe3\x4f\x13\x2e\xd8\xde\x23\xa3\xfa\xa9\x3c\x55\xca\xa1\x3f\x1a\x99\x6c\x42\xf3\x32\x8d\x05\xe2\xb3\x1c\xb3\x55\x50\x5d\xa8\x0b\xbd\x8f\xcc\x72\x92\x2d\x40\x66\x9d\x16\x80\x86\xfc\x13\xf6\xaf\x89\xaa\xcd\xb9\x08\x90\xec\xa7\x7a\x51\x39\x28\xf8\x80\x0e\xb2\xb9\x4e\xce\x6b\x99\xbf\x2b\x9a\x74\x95\xbf\x13\x9f\x95\x19\xbd\x00\xc5\x38\xc0\x8d\xf9\x64\xc0\x85\x86\xe5\xeb\xc6\xe5\xb7\x78\xba\x28\xf5\xb4\x52\x12\x13\x3e\x65\xb9\x00\xef\x22\xa5\x2b\xe6\x64\x00\x89\xa8\xb5\xff\xe2\xdd\xde\x85\x02\x46\x58\x83\xf9\xb5\x0a\x1f\x1d\xaf\x57\x1f\x3c\xad\x3e\x78\x56\x7d\xf0\xbc\xfa\xe0\x45\x7d\x0d\x8c\x28\x87\x17\xa9\xf1\x1a\x5c\xac\xaa\x4f\xd7\x83\x4f\x9f\x06\x9f\x3e\x0b\x3e\x7d\x1e\x7c\xfa\xa2\x65\x5c\xec\x71\x88\xc5\xb4\x32\xe6\x22\x40\x37\xbe\x4a\xc7\x5c\x21\x1d\xa9\x74\x13\x2e\x92\x15\xd8\x81\x13\x4b\xf3\xc7\x7e\x95\xe3\xd7\x9f\xf8\x67\x80\xca\x85\xe2\x24\xde\x09\x32\xa0\xc0\x36\x5a\x70\x7c\x2e\x3e\x3b\xf5\x19\xbb\xcc\xa1\xeb\x0a\x1a\x60\x60\x93\x02\x15\x5c\xea\x69\xc1\x70\x93\xa0\xe1\x06\x72\x26\x51\x32\x64\x17\x6a\x6d\x54\xf6\x64\xc8\x9f\x6a\x9c\x34\xc6\x69\xe6\xc5\xd5\xfb\x9b\x68\x75\xd5\xde\x21\x12\x7e\x91\x83\xb6\xb2\x8b\x99\x12\x73\x9e\x33\x34\xcd\x70\xc1\x88\x32\xff\x12\x9a\x7b\xe0\x70\x07\x63\x85\x7a\xb9\x0b\x21\xa6\x6b\x68\x0d\x4a\x67\x39\xbf\x40\x3b\x95\xda\xc1\x18\xf1\xdb\x85\xf0\x5a\x9d\x45\xde\x05\x88\xf6\x23\x0a\xe2\x35\xcc\x33\x6a\x26\xfb\xcd\xc0\xdd\x5e\xf3\x27\xe5\xf4\x71\x83\x9b\xd9\x30\xcd\x13\xe5\x3e\xa2\x35\x58\x6f\x79\x81\x97\xfb\xca\xf5\xcc\xbd\xff\xe9\xed\xbf\x80\x23\x68\x45\x88\xbf\xd2\xda\x5e\x54\x79\x0a\xa6\x23\xff\x99\x63\x26\xaa\xd0\x36\x9a\x83\xfc\x87\xd5\x9c\x3a\xea\x69\x4a\x33\x3e\xaa\x3d\xac\x7d\x9c\x9e\x57\x9f\x54\xe9\xdf\x98\x8c\xaa\x8f\x47\xe1\x2d\xa9\x0c\x49\x95\x87\x68\x53\xaa\xef\xbf\xfa\xc3\xd0\xee\x05\xfb\x4e\xe5\x11\xcb\x67\x95\x47\x39\xad\x4e\xa6\xc6\x1d\xaa\x80\xb5\x8d\xa6\xf2\x54\x59\x64\xfc\xa7\xb3\x1a\xb0\xda\x34\xb5\x49\xaa\xbf\x40\xf4\x53\xd3\xac\xce\xfb\xf3\xa4\x3a\xb6\x3f\xec\x60\x59\xac\xc5\xa9\xb0\x66\x2f\xa9\x54\x18\x84\x56\x92\x5d\x5e\xde\x0c\x74\x96\x5e\x03\x38\xac\x16\xaa\x40\x49\xaa\x2c\x36\x09\x9c\x4b\xd7\x6a\x83\xaa\x07\x12\x2a\xe3\x16\xc3\xa9\xea\xe4\x2a\x30\xa8\xcf\xe9\x0f\xa7\x2c\x26\x02\x9c\xdc\xf9\x84\x29\x7f\xf2\x01\x9f\x95\x44\x02\x44\x3b\x37\x24\xa5\xe5\x43\x32\xa1\xc5\x19\x2b\x44\x57\xe5\x5b\x40\x5f\x6b\xe1\x42\x63\xbf\xcd\xd2\x73\x9a\x19\x7f\xf3\x54\xe9\x8c\x6a\xec\xb4\x49\x1d\x59\x19\x2c\xe8\x0b\x17\x4f\xd7\x57\x1b\x86\xb8\xb2\xe6\xd6\xd6\x34\xa1\xdc\xf6\x54\x4e\xfc\x15\x12\x76\x3f\xb1\xec\x17\xce\x33\xc8\xb6\x8a\xbf\xc0\xf1\x2e\xc4\x8e\x2b\xf6\x0a\xef\xcf\x90\xa1\xc2\xda\x29\xf0\x7c\x09\x7c\xa7\x55\xc5\xd5\xa6\x78\x44\x38\x9f\x19\x69\x09\xbe\x2a\xe9\xc8\xd1\x2a\x9b\x61\xd7\xe3\xec\xb5\x7b\xa2\x9e\xa3\x3e\xdf\xba\x10\xf3\x5c\xc1\x4a\x1f\xf3\x8b\x58\x70\xa9\x20\x53\x2a\x04\x4b\x34\x6a\xe8\x48\xe7\xe9\x18\x30\x80\x63\x03\x50\x6d\x0f\xbe\xf6\x49\xad\x16\x5a\x6b\xa0\x4f\xa3\xa0\x0c\xe9\x2d\x9d\xd5\x70\x04\xb8\xd7\x58\x83\xa4\xef\xe0\x60\xa3\x0a\x56\x63\x1e\x74\xac\x6e\x47\xe6\xe3\xc6\xd3\xd8\xe9\x94\x36\x19\x9a\x1c\x88\xfb\x45\x63\x5f\x97\x97\xd5\xe1\xd8\x84\x32\xf7\x1a\x80\x34\xb9\xa0\x9a\xce\xf5\x98\xb4\x51\x20\x08\x05\x69\xc2\x7c\xa2\x1c\xb0\x30\xd6\x6d\x81\x5f\x57\x5b\x47\xb5\x62\x2e\xe5\x22\x87\x50\x6a\x72\xcf\x1f\x2c\x79\x4c\x5a\x97\x2d\xf2\xd8\xae\xb2\x7e\xe0\x8e\xcd\x3c\x33\xde\x5f\xc4\x77\xbe\x3d\x56\x1d\x9c\x2c\xe1\x75\x6b\xda\x1a\x77\x5b\x33\xcc\x92\x8e\xb6\x53\x31\xcd\xe8\x7c\x0f\xf3\x55\xe9\x51\xd9\xf9\x43\x92\x29\x30\xa7\xab\x4d\xa7\x23\xe4\xed\x7e\xf1\x55\xa5\x7e\xe2\x8a\xde\x7f\x1f\xf6\xa2\x92\x89\xd2\xee\x2d\x2f\x34\xb6\x36\x82\xd6\x91\x71\x43\x36\x17\xde\x5a\x18\x64\xfd\xab\x8f\x66\x98\x8e\x1f\xb3\x13\xcb\x5f\x9b\xc6\x7d\x27\xaa\x6b\xce\x67\x4a\x22\xc6\x62\x36\xf9\x1c\x63\x24\x9d\xaf\x6c\x5d\x4d\x29\xec\xf3\x9c\xdc\x97\x8b\x04\x09\x38\xb3\x14\x45\xf1\x39\x9f\x15\x04\x3d\x46\xc0\xd3\x2e\x6a\x2d\xcc\x77\x51\x9f\xc3\xab\x2a\x5d\x7c\xef\xef\x7c\xb4\xba\x3a\xc4\xe4\xa7\x1c\x4b\xfd\xf5\xc1\xf6\x1e\xc5\x83\x86\x03\xc4\x1b\xc9\x05\xfd\xc5\x2b\x2b\x79\x5b\x24\xb0\xc7\x9b\xa4\x45\xb6\x92\x84\x50\xf2\x0a\x2e\x56\xdf\xcb\xe3\x0a\xe6\x09\xae\x84\x25\x57\xb9\x90\x74\xc4\x14\xf8\xc1\x69\xc7\x01\xa8\x66\x06\xc9\x62\xc1\xa1\xac\xe0\x17\x82\x15\x55\xa4\xd4\xfd\xbe\xeb\xdc\xb4\x1d\x45\x51\xa7\x4f\xbe\x11\x24\xa6\x79\xce\x4b\x42\xa7\x53\x26\xb7\xa6\x49\x02\x24\xd1\x0f\xee\xde\xdf\x08\xf9\x7f\x0c\x05\x70\xb0\xdb\x75\x77\x57\xb7\x42\x0c\x5d\x98\x6c\xd7\x6c\x36\x1d\x1f\xe9\x2f\xd7\x2d\x87\x99\x30\x11\xb3\x3c\xa1\x39\x48\x08\x80\x15\x35\xe0\xeb\x06\x5b\x1d\x96\xbd\x37\x69\xff\x17\xbc\x53\x61\xb9\xa5\x92\x13\xaa\xf2\x57\xb3\xcf\x53\x5e\x94\xc1\x53\x3b\x0a\x38\x1d\x98\x1c\xf6\x15\x57\x04\xdd\x17\x26\xe9\x82\xcf\xc3\x30\xed\x21\xb4\x9b\x43\x8a\x9d\xcf\x01\xdb\xd9\xbf\x81\x34\xe0\x88\x44\xc1\x73\xb5\x6a\x03\x7c\xf8\x90\xdc\x6b\x3e\x10\xeb\xb3\x56\x32\xd6\x55\x93\x47\x2f\x78\x7f\xd4\x1f\xdf\x95\x77\xb2\xe7\x51\x6f\xf2\x6a\x18\xaf\xeb\x0d\xa7\x91\x76\xaa\x37\xad\xac\x97\x3d\x36\x0b\xb9\xd4\x93\xcd\x06\x4f\x7b\xfc\xc4\x77\xae\x27\x9b\x35\x6f\x7b\x6c\x56\x75\xaf\xb7\x15\x16\x82\x10\xeb\xce\xf5\x0a\x72\xc8\xeb\xbe\xfe\xd9\x11\xd2\x6a\xdd\xf3\x1e\x9b\x86\xdc\xec\xc9\x66\x83\xf7\xbd\xf7\x49\x93\x7f\xbd\xfd\xba\xd9\x03\x7f\x31\x20\x7f\x0c\x0d\x5e\xf8\x1e\x88\x06\x47\x7b\x0b\xa4\xd1\x13\x7f\x21\x18\x7f\x20\x61\x6f\x7c\x77\x4d\xab\x4c\x27\xb4\x01\x42\xfc\x09\x61\x4c\x0b\x16\xd3\x78\xcc\x40\x02\x53\xb4\x59\x7b\xe6\x77\x08\x8f\x0f\x54\x45\xdc\xea\x23\xe0\x6f\x2b\x3a\x98\xb4\x39\xab\x92\x3c\x58\x9b\xe2\xf7\xe1\x48\x73\x82\x74\xdf\xd1\x6a\xe2\x2d\xc9\xc6\xde\xd1\x69\x34\x2d\x78\xc9\x65\x2b\x53\x0c\xd0\x16\x2d\xf2\xde\xcb\x5b\xf9\x8e\x14\x2e\xea\x70\x54\xf3\x43\x56\x06\x5e\x1e\xb2\x72\x61\x27\xde\xfb\x08\xfd\xe5\x17\x75\x71\xed\x88\x3a\x4e\x20\xac\x7b\x3c\x62\xba\xf8\x84\x4d\x59\x9e\x80\xbc\x24\x91\x42\xf3\x04\xc6\x3d\xd0\x29\x4d\x25\x60\x11\x55\x13\xb9\x4b\x71\x0c\x12\xae\x51\x3c\x28\xa7\x3c\x9b\x0f\x53\x88\x0a\x20\x3c\x4b\x58\xa1\x85\x09\x11\x81\xd5\xa0\xdf\xeb\x0d\x07\xd1\x84\x61\xce\xcd\x55\xdd\x5c\xb4\x6c\x48\x57\x9a\xff\x8a\xba\xa3\x07\x4f\x23\xfc\xad\x22\x91\x74\x0c\xc8\x8f\x5c\x94\x36\x7d\x7f\x38\x5c\xa9\xa3\x82\x30\x30\x75\xfc\x4e\x2e\xf7\x99\x4d\xbc\x89\xfc\x30\xc3\x6e\x24\xc1\x16\x13\x1d\xe4\xa6\x8a\x98\x83\xa2\xf3\x11\x39\x2a\x66\x4c\xa7\x5b\x94\x24\x95\xa5\x2c\x01\xe9\x09\x22\xd8\xa0\x4e\x90\x0a\x7e\x90\x7f\xdb\x9a\x3c\xf0\xf1\x7f\x80\x3b\x33\xf9\xf2\x7a\x7b\xff\x9d\xda\x9f\x57\xd8\xf0\x68\x0c\xa1\x7e\x09\x66\x50\xd3\xf0\x22\xf8\x48\x1d\x67\x5f\x06\x9c\x67\x8c\xe6\x57\xde\x18\x64\x53\xa7\x57\xff\x4b\xa8\x29\x94\xd3\x6c\x85\x3c\xea\xd9\xc0\xb8\x54\xc0\xa1\x68\x32\xbd\xb5\xe5\x07\x48\x0a\xaa\xab\x7b\xf7\xe0\x19\x54\xed\xca\x75\xd0\xdd\x11\x12\xe5\x26\xd9\xf9\x79\xe7\xdd\xce\xde\xd1\xe9\xde\xfe\xf6\x0e\xd4\xc8\xac\xb5\xd8\xde\x7f\xf3\x61\xd9\x26\x6f\xdf\x6f\xfd\xed\x9a\xb6\x6f\xf6\xdf\xd9\x16\x0f\x1f\xda\x16\x2a\x8f\x89\xa4\x69\x82\xe4\x03\xc9\x09\xd0\xc9\x78\x75\x96\x0b\xf4\x75\x68\x75\x3a\x7e\xa4\xf8\x88\x95\x40\x24\xef\x39\x2f\xd5\x3a\xa0\xd4\x83\xf8\x88\xf5\x2f\x44\x0a\x5c\x5a\x2b\xcf\xea\x7a\x97\x15\xd5\xd2\x34\x5c\x80\x92\x0a\x0c\xfb\x89\xb6\x0a\xaa\x41\x01\x60\x57\x92\xad\x7d\x60\xd3\x62\xd6\x03\x20\x51\x45\xa1\x78\xf9\xf6\x8c\x1d\xf1\x9f\xd9\x88\xc6\xf3\x1f\xd9\xac\x48\x45\x99\xc6\xd5\x89\x42\xba\x35\x8b\x12\xbc\x34\x2f\x87\xa8\x0d\x8f\x78\x5c\x20\x0f\x1f\xba\x30\x17\x50\x52\xa5\xe1\x98\x0a\x9b\x93\xe6\xfd\xfe\xfe\xd1\xe9\xd6\xd1\xd1\xfb\xdd\x1f\x3e\x1c\xed\x40\xce\x9f\xea\x9a\xe2\x6c\xb7\x66\x25\x7f\xcb\xe3\x99\xf0\x59\x82\x64\x55\xe1\x48\xcf\xf9\x94\xf9\xa1\x9e\x9e\xfa\xb1\x1e\xfd\xd9\x98\x79\x23\x10\xcf\xa9\xd0\x81\xc5\x7e\xa8\x1e\xd9\x86\x5f\x3d\x0a\x78\xae\x11\x28\xb7\xf7\xdf\xbd\x67\x79\xc2\x0a\x56\x90\x4d\xa4\xe9\xf7\xaa\xa4\x0b\x2b\xda\x72\x9c\x72\x49\x38\x2f\x71\x7e\x20\xa7\xf7\x1d\x31\xdd\x4b\xe1\xb8\x1b\x70\x36\xc6\xa3\x85\x40\x30\xf1\x13\x2b\x60\xe7\x4e\x76\xa6\xda\x3b\xb3\x64\x24\x08\xde\xac\xe9\x86\x67\xad\xd1\x4f\x2b\x26\x1b\x6f\x23\xf4\x83\x6f\x3c\x96\x60\x15\xa3\x5e\x25\x0b\x1c\xcf\x02\xae\xf3\xda\x35\xb2\x93\x3e\x69\xfd\x75\x58\xd0\x11\xfc\xe5\x26\x47\xd2\x34\xdf\x38\xb9\xc0\x96\xd4\xff\x73\x91\x06\x30\x5e\xc3\x3f\x91\x79\xfe\xe1\xfd\x2e\xe9\x83\xe6\x49\xee\x50\x9b\xe9\x4a\xa9\x1e\x5b\x5e\x9a\xa6\x4a\xe2\x6b\x7d\xc3\xae\x25\xc0\xae\x26\xee\x32\x9b\xb0\x8a\x0f\x8f\x6d\xbe\x6e\x98\x9e\x8d\xac\x26\xfd\x70\x93\x2a\xb6\x2a\xb9\xbc\x1c\x7e\xe7\x4e\x5b\x32\x72\xc7\x99\xd8\x59\x33\xfb\x41\x49\x47\xba\x18\x7f\x08\xa5\x75\xbc\xb9\x5d\x77\x01\xde\xf5\x18\xc4\xff\xba\xaa\x16\x93\x36\x13\xef\x93\x20\x1f\x05\xf3\xba\xcb\xc6\xa7\xf4\xda\x5b\xb6\x5a\x4e\x17\xac\x57\x1d\xdb\x6c\xf5\x2f\x76\x7a\x7d\xfb\xd3\xbf\x60\xf6\x2b\x3d\x5e\xb9\x3a\x41\x7d\xe6\xb8\x59\xd9\xae\xba\xc8\x14\x00\x55\x0d\x5c\x01\x17\xd9\x79\xa9\x90\xa7\xd0\xe2\x22\xa7\xd6\x74\x9b\x9d\x9b\x4b\xb7\xf3\xd8\xc3\xd1\xe2\x55\x0b\x81\x8c\xf2\x86\x75\xac\xe1\x7c\xbd\x01\xe9\x41\xa8\xee\x87\x08\x78\x89\x95\x38\x5d\x6e\x29\xd6\xfd\xb5\xb0\xc8\xaa\xa7\xcd\xab\xe1\x49\x75\xdb\x84\x9b\x10\x51\xeb\x75\x3d\x98\x0d\xb2\x34\xde\x35\xe1\x1c\x76\x55\xab\xb1\x24\x5a\xed\xe1\xec\x5b\x00\x32\x2d\x98\xec\xe6\x2d\x97\xc2\xf0\x24\xf5\x28\x43\x7f\x5b\x95\x8a\x53\xfd\x5b\xef\x86\x06\xe1\x78\xc4\xca\xc3\xc0\x1b\xfb\x55\xa9\xe1\xc0\x39\x67\x67\x06\x55\x70\xb6\x86\x25\x5b\x30\x28\x15\xeb\x6d\x3a\x68\x87\x06\xb1\x78\x7c\x96\x07\x39\x43\xf1\x26\xab\xbe\x0f\x5f\x0b\xd4\x60\x51\x7f\x12\x5a\x03\x47\xb0\xe8\x86\xd9\x67\x97\x8c\xdd\x7d\xa7\x45\x72\xfd\xfa\x47\x9a\x27\x99\x77\x42\xd7\x89\xca\x3d\x90\x1d\xcf\x72\xa5\x3f\x94\xd7\x2f\xbb\x01\x51\x89\x18\xc7\x90\xa4\x0b\xec\x58\x3a\x84\x3c\x1f\xb9\x19\x96\xc7\xd5\x1d\x3e\x0e\xed\xed\xfa\xe5\xbe\x6d\x37\x55\xb7\x02\x24\x0a\x18\x8d\xbc\xab\x35\x0a\x42\xa6\x3c\x40\x43\xfd\xdf\x50\xab\x40\x6e\x72\xb8\xb1\xc1\xc7\x44\x65\x22\xf7\x3f\xdc\x58\xa9\x1c\x5a\xd7\xab\x4b\xdb\x0b\xe6\x13\xe4\x26\x0d\x28\x42\xe4\xe0\xe0\xba\xd5\xae\x6b\xe9\xb5\xea\xeb\x3d\x6e\x60\x95\x55\xf6\x63\x93\x78\x54\x35\x81\x4b\xd1\x65\xa5\x63\x35\xb0\x9a\x3e\xa6\x1d\x26\xd9\x40\x09\x9b\xaa\x7a\xa6\x31\xcb\x88\xe2\x54\xf6\xb5\xd9\x69\x50\xfb\x32\x51\xfa\x47\xe0\x95\xf5\x73\xcc\xce\xc0\x49\x10\x45\x88\xff\x32\x42\x48\x00\x02\xad\x57\x96\xf7\x0c\xd3\x1c\xf2\x3a\xbb\xdd\x14\x2c\x77\x7b\xf2\xb2\xc4\x5c\x8b\x4b\xe3\xa8\x14\x50\x9d\xde\x14\x94\x87\xa1\xa5\x2f\x35\x55\x66\x8f\xe5\x1e\x17\xcf\x88\x67\x89\x29\x29\xab\x4b\xf3\x5c\xcf\xc2\x42\x42\xc3\x32\xcc\xc4\xab\x3b\xa0\xf2\xe0\x99\x4d\x0e\x69\xde\xf0\xa5\x1e\x95\x7d\xe9\xd5\x0e\xaf\x7e\xd9\x58\x44\x3c\xd8\x30\x54\x4d\xbc\xce\x48\x6a\x1f\xff\x9b\xf0\x12\x4f\x48\xf4\x35\xf3\xb7\x59\x7e\x4b\x5c\x26\xe5\xf2\x91\x2d\xc4\xd0\x70\x1a\x56\x84\x92\x52\x5f\x4a\xec\x3d\xf9\x1a\x96\x7f\xa3\x83\xa1\xd6\x2a\xd1\x99\xc6\xb3\xf9\xa1\xdc\x94\xb9\x4e\x03\x0f\xb1\x4b\x18\x00\x0e\xe6\xa3\x85\xad\xef\x69\x1d\xac\x2d\xce\xb0\xf0\x83\xe8\xf4\x74\x0c\xb9\xea\x9d\x09\x54\x90\xb7\xcd\xa6\x45\xca\x8b\xb4\x4c\xff\xc1\x0e\x67\x83\xb2\x60\x4d\xf2\x44\x05\x83\x5a\x8f\x80\x25\x70\x2a\xa2\x89\x5c\x8f\xa0\x78\x02\x32\xc7\xed\xe5\x92\x9b\x6e\xf6\x05\xa4\x8c\xdd\x5d\x2f\x39\xd8\x63\xae\x6c\x32\x64\x2d\x9a\xde\x8d\x4f\x33\xdd\x8b\xcf\x80\xf5\x53\x85\xef\x95\x15\x42\x72\x7e\xd1\x97\xff\x81\x50\xf2\xc9\xac\x04\x51\xb3\xaf\x75\x48\x20\xcc\x42\x56\xd7\xc5\xcc\xd7\xee\xb9\xc5\x98\x27\x5e\x11\x1c\x79\x08\x68\xd9\xfa\xaa\xeb\xf4\xb8\x98\xdf\x57\x8b\x8a\x37\xee\xff\xeb\xc6\xe2\x17\xbb\xc6\xd2\xf5\x63\x68\x43\x04\x37\x85\x5c\x95\x67\x72\x1a\x8f\x55\x13\xaa\xc2\x0c\x78\xce\x04\x38\x57\x5b\x70\xe0\x6a\xad\x03\x85\xb1\xe4\x29\x02\x2c\x84\x5f\xb7\xb9\x41\xac\xd0\x63\x77\xab\xe8\xf9\x55\xc8\xdd\xa4\xb0\x4a\x35\xee\x80\x5d\xae\x2c\x79\x13\xc6\xfc\xa5\x80\x3b\x4d\x03\x6b\x74\x84\xa5\xd0\xca\xba\xa5\x75\xac\x17\x88\xb7\xc4\x12\x70\x7d\x99\x4b\x67\xe7\xc3\x08\xd1\x6f\x2f\x67\x17\x47\xce\x61\x4d\x88\xdb\xce\xd5\x9d\xeb\x96\x5e\x87\x8e\xec\xb4\xb4\xf8\xb5\xa4\x00\x16\xea\xe3\x88\x9b\xed\xeb\x76\x67\x14\x45\xb5\x9e\x16\xe8\xd9\x5d\xa5\x97\x7b\xca\xdb\xe6\x4e\x2e\x41\xcc\xa6\xf8\x03\xd4\x19\xc6\x31\x76\x89\xaf\xd3\x26\x21\x07\x26\x0b\xab\x69\x8e\xe6\x44\xc6\xb9\xba\xfd\x5c\x8b\xd0\xae\x2a\x7c\xfc\x66\x21\x76\x43\x43\x77\xbf\xdb\xa8\xf7\xef\x68\xee\xeb\x43\xa9\x22\xbb\x61\x14\xbf\x27\xe6\xeb\xc3\x5f\x88\xfb\xa5\x41\xf8\x5b\x74\xc2\xcf\xd9\x2d\x29\xdb\x01\x12\xa2\x6c\xe7\xf5\xdb\x82\x4f\xfe\x49\xb4\xdd\x34\xc8\x85\x38\x5d\xf0\x91\x39\x94\xaf\xe0\xe0\x1b\x6b\x33\xba\x39\xf9\x68\xae\x4c\x4d\x8b\x74\x55\xde\x15\xc8\x9f\x74\x5a\x35\x27\x80\xf8\x55\x35\x36\xd6\xb5\xb5\xd0\xcc\xfb\x38\x90\x1e\xd4\x99\x6d\xc5\x70\x47\x9c\xab\xb8\xce\xba\x37\x86\x3c\xfd\x17\x64\xc0\x58\x4e\x0a\x4c\xd5\x2f\x8f\x11\x9a\x9b\x14\x6a\xee\x49\x12\x50\xbc\x59\xde\x6d\xd0\xd2\x24\xa3\x39\xa8\xf1\x38\x76\x25\x39\x2d\xfa\xd4\x86\x50\x74\xb4\xf3\x7f\xea\x34\xd1\xeb\x91\x1d\xc8\x56\x8b\x62\xa8\x2d\x1a\x05\xc9\xe6\xc0\xbb\x0f\x44\x5c\x38\xb6\x59\xc1\xc8\x05\x16\xc7\x62\x90\xf2\x0d\x12\xd1\x29\xf7\x40\x37\x4b\xfa\xed\xb0\x67\x9d\x3b\x97\xc1\xdc\x88\x95\x7b\xec\x73\x69\xbd\x62\x0e\xd3\x41\x06\xee\xd9\xcd\x2a\x50\x6b\xb0\x22\x2e\x4d\xb0\xcf\xa5\xfa\xd8\x4d\x4e\x70\x96\x4e\x49\xce\xf3\xd5\xb1\xe9\xc1\x4f\xa0\x7b\x31\x4e\x33\x46\x8c\x25\xdc\xb7\x4b\xd7\x68\x33\xd8\x22\xb8\x34\x6a\x78\xd8\xba\x3e\xb4\x2b\x1f\x37\xb9\x92\x3e\x5d\xbc\x40\xbe\x0a\x8b\x98\x6b\xd8\x59\x05\x39\xe8\xf1\x53\x61\x69\xbe\x1d\xf9\xa6\x18\x92\x20\xe5\xfc\xd9\xe7\xf2\x1a\x0c\xd5\x5a\x84\x31\x84\x63\xc4\xd6\xd7\x63\xa8\x2a\xbe\x8c\x6f\xc8\x87\xee\xe2\x86\x74\x93\xab\x46\xea\xdf\x51\x1c\x65\xee\x01\x17\x22\x1d\x64\x73\x92\xb0\x21\x2b\xd0\x2d\x74\x96\x97\x29\x14\xa4\x53\x72\x20\x99\x8e\xa9\x60\x2a\x78\x57\xd5\xaa\x53\xea\x6b\x0b\x6e\xc4\x4a\x42\xcb\x52\x8e\x27\x69\x94\xa3\x2d\x32\xfc\x14\xc0\xd7\x6b\xa1\x49\x45\x7f\xb2\xcc\x9d\xf0\xe6\x9a\xce\xda\x4a\x87\x7d\x02\x9b\x16\xb5\x66\x5b\x59\x74\x51\xf4\x49\x67\xd1\x7d\x7a\xd7\xe3\xd7\x77\x49\x17\x2e\xf4\xaa\xc5\xaa\xea\xdd\x18\x18\x8a\x3f\x93\x24\x4d\xf6\x78\xf9\x4e\xb2\x70\xfd\x9d\x99\x7b\xd3\xf4\x10\x63\x6f\xac\x6c\x12\xe8\xc4\xcc\xcb\x52\x40\xc8\x95\xb2\x79\x7c\x15\x89\x2c\x30\xce\xc5\xc3\x3b\xc2\x35\x86\xdf\x07\xee\x4a\xfb\xbd\x35\x0d\xdb\x2d\xb8\xe9\x00\x39\x6e\xf6\x1e\x3c\x41\xf5\x64\xe1\xd7\x32\xba\x83\x49\xab\xf9\xd6\x48\x72\xe1\x92\xd4\x8f\x3c\xbf\xc2\x59\x5d\x46\x90\xf2\xc3\x5a\xb0\x0c\x53\x93\xfb\xea\x82\x5e\x1d\xf3\x7a\xbd\xbc\xd5\x22\x7f\xd6\xe5\x60\x5e\x8b\xac\x5b\xd1\x45\x1d\x77\x77\x45\x0d\x77\x8c\xf9\xc0\x90\x6f\x8b\xf8\xc5\x20\x9b\xf1\xfe\x36\xcd\x1d\x80\x37\xa3\xd5\xa0\xac\x5f\xdb\x42\x0d\x9e\xcb\x8b\xc1\x2d\xd8\x56\x0d\x23\xbe\x11\xd3\xbb\xc1\x70\xc3\xc4\x7d\xdd\xde\xf7\x07\x79\x3b\x6e\xd7\x74\xa3\xba\x43\x36\xb7\x78\x8d\xc2\x63\x59\x7a\xf6\x77\xc2\xef\xff\xb0\xa9\x07\xf7\x54\x68\xb9\xcd\x5d\x59\xc8\xf3\x61\x96\xb1\x6d\x86\x65\xe0\xde\xd0\x2c\x1b\xd0\xf8\xac\x4f\x8a\xdd\x37\xd0\x62\x26\xd8\xe1\x3c\x8f\x0f\xb1\x21\x5c\x72\xee\x31\xf0\x45\xd8\x12\xde\xf3\x1f\xe6\xdb\xe8\x0f\xb6\x9b\x6b\x37\x67\xcc\x7d\x6f\x7d\xa4\x9f\xb9\x3e\xd2\x3f\xe0\xe1\x84\x7a\x43\xd1\x76\xdc\x0b\xa3\x81\xf7\x4a\xbb\x47\xcb\x49\xb3\x64\x6b\xc0\x67\x9a\xe3\x6e\x1d\xec\x92\x4d\xed\xa6\xe8\x96\xd7\x90\x70\x94\x09\x63\x37\x2f\xad\x0e\xcf\x6c\x06\x65\xa8\x54\x2a\x8e\x82\xe5\x8e\x76\xad\x8b\xe5\xc3\x54\x1f\x5d\x12\x2b\x9c\xe0\x02\xdc\xab\xf9\x28\x3b\xae\xaa\xaf\x21\xf6\xb3\x48\x69\x5e\x1a\x8f\xf5\x23\x5a\x48\x91\xd7\xfa\xc2\xa9\xd2\x60\x14\xd4\xbe\xda\x0d\xbb\xd5\x21\x7d\x23\xc7\x7a\x55\x60\xac\x0a\xe4\xb4\xd0\x0e\xaf\xa6\x73\x88\xb7\xab\xab\x64\xee\x35\xaa\x64\xb4\x48\xac\xe9\x83\x6c\xba\x8e\x9d\xd1\x50\x52\xbf\xf3\xfa\x63\x5a\x8e\xf7\xf8\x01\x2f\x4a\x9a\x89\xc5\x43\xd1\xa1\x51\x9e\x7b\x85\xdb\x55\x95\x80\xd3\x7c\xe4\xbd\x77\x1d\xfe\xe4\xf1\xe4\x2c\x48\x0b\x97\x54\x45\xc2\xed\x96\x24\xe3\xfc\x4c\xc5\x27\xc9\x3b\x06\x10\xdc\x2a\x36\x62\x09\x7c\xc9\x30\x22\x0e\xee\x29\xe0\xed\x6f\x17\xe0\x82\x0a\xa5\x09\xc3\x7c\x2a\x7c\x56\x12\xcc\x23\x0f\x70\x22\xd4\x15\xa8\x65\x82\x6f\xc5\x6c\x3a\xe5\x72\xa7\x41\xa8\x01\xe4\xe9\xc7\x4c\x44\xac\x28\x78\x21\x22\xb2\xab\x13\xfe\x4b\x62\xc1\x6f\xf4\x26\x88\x54\x05\x3f\x43\x74\x5b\x38\xc5\x92\xab\xa2\x3d\xd4\x59\xc1\x56\x6d\xa7\xae\xe8\x55\x4b\x85\x44\xb7\x5a\xa9\xe4\x87\xf9\x21\x9f\x30\x8c\x86\xd8\x24\xf7\xee\x2d\x5c\x1a\xeb\x30\x8b\x6e\xcc\x37\x75\x9f\x56\x64\x43\xc5\x1e\xcf\x71\x10\x34\xc6\x2b\x39\xf4\xad\x9c\xaa\x25\x2d\x42\xf9\x54\x5c\xce\xb7\x05\x9f\x60\xd0\x8c\x7a\xdf\xd1\x81\xcc\x7a\xf1\xef\x05\x21\x5e\x5e\x36\x4f\xb5\x4a\x09\xef\xd9\x34\xa3\xb1\x59\x39\x87\x02\xb4\x29\x56\xe5\xcb\xc9\xd9\x05\xfa\xc1\x2a\x52\x50\x4b\x11\x91\x5d\x88\xaf\x35\x45\x14\xe4\xaa\xcc\xac\x19\xc9\x80\xd1\x94\x94\x43\x06\x2b\x00\x22\x3f\x53\xa1\xf6\xaa\xdc\x03\x46\xf9\xc2\x9d\xf7\x33\xa6\x00\xb1\x00\x2c\xd0\xb4\x50\x05\x00\x01\x8a\xa4\x27\x1c\x35\x7c\x28\xc7\x69\x46\x27\x0c\x60\x3e\x04\xc2\x32\x13\x95\x64\x85\x5f\x01\xc5\x78\x58\x6d\x60\x07\x55\x6d\xe5\xbd\x9a\xb3\xab\x7c\x5a\x7b\x18\x95\xfc\xc3\x74\xea\x29\x34\x5b\x3f\xec\x6f\xff\xbd\x65\x97\x02\xd6\x41\xfe\x82\x09\xdb\xc1\x63\x30\x21\xe4\x03\x2b\x39\xd1\xce\xca\xd1\x80\x27\x73\xa2\x37\x65\x92\x8a\x98\xcf\x0a\x3a\x62\x49\x57\x25\x93\x4c\x4b\x61\xd1\x06\xd9\x8f\x86\x25\xcb\xc9\x84\xe6\xe9\x74\x96\xe9\xf8\xdf\x72\x9c\x16\xc9\xea\x94\x16\xa5\x8a\x05\xc6\xac\x6b\x02\x36\xa8\x0a\xe3\x21\xec\x73\xc9\x72\x91\xf2\x5c\xa8\x3d\x3d\xa1\x73\x92\x49\x84\x96\x9c\x88\xd9\xa0\xcc\xd4\x2a\x14\xca\x91\x3d\xa5\x2a\x0c\x45\xcc\x98\xfc\xa6\x98\xab\xc5\x81\xb4\xee\x18\x04\x6b\xf9\x88\x56\xb8\xa2\xe9\x37\x41\x50\x43\x5e\x60\x24\x33\x9d\x4e\x23\x1d\x29\xb4\xe2\x79\x73\x5f\xbb\x57\x21\xac\x43\x36\x76\x9d\xef\xbc\x98\x09\x79\xec\x39\x87\x94\x5c\xba\x9b\xc4\x54\xe0\xa6\xd6\xe9\x65\x55\x7d\x13\x0c\x4f\xd7\x84\x8b\x2c\xd4\x56\xa1\xbd\xe7\xc1\xf7\x0f\x14\x3c\x99\xed\x51\x6c\xdf\xc8\x49\x28\x15\x59\x4d\x4f\xa3\x54\x74\x7e\x13\x8b\x9b\x8c\x2a\xb5\x9f\x7b\x6e\xb8\x37\x0b\x18\x95\xea\x5a\x45\x68\x28\x38\xd7\x87\x72\xe8\x86\xd7\x87\x72\x78\x5d\x12\x3b\x55\x5b\x60\xac\x7a\xa6\xe9\x83\xdf\x6e\x0f\x25\x02\x80\x76\x75\x4c\x05\x24\x72\x99\x4d\x89\xe1\x56\x83\x39\x51\xec\x6d\x30\x2b\x95\xd2\x1b\xb9\x43\xc1\xc8\x2c\x2f\x18\x92\x3d\x26\x46\xa5\x82\x5c\xb0\x2c\xb3\xa7\xd4\x84\xcb\x25\xe4\x93\x09\xe4\xe1\x82\x73\xc9\x86\xc8\x43\x48\xfa\xaa\x76\xc0\x44\x71\x91\xd0\x02\xaa\x74\x62\x01\x34\xcb\x34\x71\x58\x51\xab\xa1\x44\xf3\xd5\x35\x56\x19\x07\xaf\x41\xef\x1f\x57\x08\xf6\x89\x19\x22\x9d\x5d\x72\x96\x0f\x82\xe2\x5e\x55\x86\x08\xc9\x83\xfe\xca\x64\xfc\xe2\x00\xdd\x5a\xe6\x2a\xac\xf2\xc1\x5a\x60\x89\xde\x84\xd9\x6b\xbb\x23\x59\x85\x52\xbd\x35\x20\x4c\x21\x5a\x0a\x05\x50\x6d\xf7\x82\x17\x67\xc8\x2f\x10\x1a\x39\x5f\x7b\x19\xa9\xa3\xca\x11\x57\xbc\x4e\xac\xd8\x00\x07\x96\x69\xa0\x7a\x6e\x77\x24\xd6\xe4\x89\x73\x41\x73\x55\xfd\x07\xec\x16\xa0\x47\xd5\x6e\x04\x4e\x41\xbb\x80\x20\x41\x8c\x96\xfd\xe2\x3d\xf2\x21\x57\xf0\x43\x1e\x16\x10\x00\xba\x3e\x63\xd1\x3e\x28\x4b\x70\x32\xb4\xe0\xcb\x47\x86\xdd\x28\x17\x44\x55\xa8\x57\x9d\x9e\xaa\x72\xac\x12\xfa\x91\xe3\xb8\x43\x9b\xe5\xfe\x7d\xa0\x5d\x77\xc7\xae\x7c\x00\xed\x9c\xb9\x18\x19\x5f\x8d\x47\x5f\xd3\xdc\x7b\x80\x16\xf2\x95\xa6\xb2\x53\x0b\x70\x5b\xae\x87\x62\x09\xf0\x4e\x88\x95\x0b\xd4\x78\xd4\xcb\x21\x6a\x29\x0a\x76\x55\x25\x9e\x0c\xd7\x0a\x85\xf2\x76\xe0\x02\x63\x43\xe6\xce\x20\x55\x0c\x2d\x46\x33\x2c\xba\x9b\xb1\x7c\x54\x8e\xc9\xf7\x64\x5d\x6e\x31\xf3\xfc\x78\x1d\xaf\x99\xa6\xf8\x37\x79\xed\xbf\xec\xeb\x50\xd3\x3f\xe6\xfe\xe3\x98\x1d\xa6\x54\x08\xb3\x1d\xc8\x14\xe6\x0c\xf9\x24\xe1\x33\x3c\xae\xa9\x40\x71\xc0\x8c\xd9\xe2\xd7\x45\xd5\x83\xb5\x10\xb2\xb4\xc3\xf8\x19\x94\xa6\x77\xd1\x6c\xe4\x63\x77\x33\x8c\xdd\xf3\xcf\x39\xd3\x97\xdc\x4b\x63\x67\x17\x49\x81\xb2\x61\xdf\x14\xb0\x69\xae\x56\xcc\x10\x9c\x78\x69\x25\x2d\xd6\xf2\x63\xe1\xb4\xbc\xbb\xaa\x33\xbe\xa6\xce\xe4\x40\x6e\x42\xd9\x88\x2c\x87\x9c\xaf\x36\x82\xa3\x54\x97\x1e\x7f\x98\x77\x3d\x38\x1c\x4c\xf3\xc0\xbc\x12\x91\xaa\xe6\x8b\x4b\x11\x7d\xef\x2f\x50\x77\xc8\x0b\xf0\xf6\xfe\x3b\x2c\x01\xe9\x3a\x45\xa8\xad\xbc\x5f\x54\x7c\xa5\x5c\x39\x88\x5f\xe0\xf2\xe1\x6d\x06\xaf\xc3\xfb\x17\xce\xdd\xd8\xbd\x1a\x63\x63\xed\xc7\x59\x75\xfb\x75\x0e\xb7\xf7\x6c\x28\x76\xf3\xf7\x7a\xd9\xe1\xbb\x08\xae\x10\xe0\x4d\x71\xda\xd0\x74\xa3\x76\xd9\x6e\x68\xd8\x25\xad\x6f\x40\x90\xa0\x71\xcc\x04\xdc\x83\x1d\x2c\x48\xa9\x21\x4d\x50\x2c\xd7\xc7\x55\xa4\xa5\x66\x75\x7a\xd9\x8c\x63\x94\x4c\x67\x05\xb3\x88\xd3\x6e\xa9\x58\x23\x5d\x8e\x39\x92\xd7\x77\xf5\x01\x40\xc1\x3a\xf5\xd8\xb7\x93\x04\x0f\x3c\xf6\x0a\xf6\xdb\x2c\x2d\x98\x90\x9f\x66\x8c\x24\xb4\xa4\x58\x04\x0f\x7d\xfc\xd8\x79\xca\x67\xc2\x1d\x4c\x97\x88\x59\x3c\x26\x70\xc1\x1f\x8a\x88\xbc\x33\x05\x6c\x33\x3e\x4a\x63\xac\xf3\xaa\x96\x72\x3b\x4d\xc0\x1b\x12\xc6\xe6\xdf\x0b\xb7\x53\x75\xd8\xe8\x1b\x58\xd4\xea\x42\x88\x94\x6e\x20\xaf\x46\xb8\x82\x1d\x29\x7b\xb7\xb6\x2c\x58\x57\x7c\x5a\x76\xad\x2a\x52\x8b\x7b\x64\xa3\x0a\xa8\x4a\x7d\xa4\x46\x36\x35\xef\x87\x45\x9f\x37\x0b\xc8\x35\x80\xf5\x8f\x37\x6a\x9a\x89\x5c\xa8\x88\xec\xd0\x3e\xd9\x30\xe3\x90\xed\x6a\xf0\x17\x69\x9f\xf0\x0b\xaf\x3f\xc7\x57\x3f\x30\x2d\xcd\x1b\x1b\x8a\xd7\xd7\x0f\xa7\x0f\xa0\xc9\x94\x64\x21\xfb\x46\x09\x9d\xab\xb2\x1a\xc0\xc0\x40\x9b\xa4\xb5\x05\xad\x70\x0a\xa7\x3a\x58\xbd\x4a\x98\xa9\x49\xe7\xa5\xce\x59\x0a\xd5\x12\x91\x3d\x98\x62\xb5\x39\x87\xe0\x6a\x20\x10\xf2\x13\x9b\x8b\x3e\x81\xec\x4d\xaa\x84\xed\x19\x9b\x8b\x10\x5e\xdd\xbc\x4d\x5d\xe3\xf6\xe4\x71\x2d\xa6\x7d\x46\x5d\x9f\x2e\x8f\x09\xbb\xd1\x5a\xe3\x82\x5f\x10\x8e\xac\x47\x97\x78\x96\xdb\x14\xf2\x97\x21\xf0\xd7\x2b\xce\xca\x2d\x50\xb3\x22\x33\x0e\x75\x2f\xc9\xbc\x2a\x0e\x61\xd0\x9d\x04\x76\xd3\xc1\xdf\x66\x24\x6a\xad\xea\x43\xd1\xc9\x19\x4e\x9b\xc1\x86\x8c\x34\x46\xd6\xab\x77\xa6\x6a\xc6\x57\x06\x7f\xaf\xfa\xa9\x4e\x0e\x29\x65\xb3\x31\x15\xd5\xd7\x9d\xb0\x7c\x55\x05\x32\x99\x09\xe5\x2c\x85\x79\x37\xf0\xb2\xf0\xc6\xb2\x27\x4f\xd0\x5a\x06\x87\x4b\xcf\x70\x01\x4a\x43\x2a\xd0\xa0\xd7\xa1\xc1\xce\x4d\xe5\xcc\x70\x1f\x4a\x51\xf8\x75\x4a\xf8\x25\x14\xf0\x21\x6b\xdc\x6d\x14\xad\xe6\x7b\xa3\xfc\xdc\x86\xf2\xaf\x2c\x2f\xb5\xb2\xd7\x6a\x5b\xef\x2d\x54\xb7\xd6\x05\x80\x7b\x4d\x50\xbb\xe4\x7e\x03\xfa\x24\xee\xc6\xe8\x5b\x25\xef\x9f\xad\x82\xc9\x4b\x27\x9b\x4c\x41\x4b\x54\x72\xbd\xb4\x98\xb7\x10\x35\xeb\x56\xab\x41\x73\x55\x1f\x96\x4f\xe7\x52\x16\x40\xfd\xba\x7b\x37\x55\x3f\x7a\x3d\xf2\x21\xbf\xf6\x56\xf8\x15\xf7\x42\x72\x3d\x73\x50\x92\x63\x8d\x33\x84\xc1\x91\xeb\x2f\xbd\x5e\x72\x81\x2b\x3b\x59\xd7\xa9\x4a\xe9\x9d\xe1\xde\xdf\x64\x20\xb8\x48\x41\x69\x43\x7e\x9b\xa5\xf1\x99\x14\x6c\x40\x3c\xe3\x79\x17\x56\x02\xca\xfd\x11\xeb\x53\xf5\x49\xb2\xd6\x4f\xf8\x55\x44\x8e\xc6\xb4\x6c\x09\x29\x7c\x61\x4d\x06\x79\xad\x7b\xed\x9f\xbc\x56\xe2\xa8\x9c\x67\x3e\x25\x9f\xde\x96\x94\x9b\xed\x06\xa7\xd7\x19\x0e\x4e\x2b\x96\x03\x35\xdd\x37\xba\x0e\x16\xba\x9e\x99\x3d\x5d\x0a\x96\x0d\x31\xe7\x10\x6e\x16\xb8\x5f\xb8\x5e\x9d\xda\x94\x62\x46\x6d\x26\xe4\xe7\x8b\xf0\xdc\x24\xe4\xf8\x9a\xb9\x91\x63\xb6\xc2\x9c\x7d\xf7\x82\x4e\xcf\xc1\xeb\x4d\x7d\x87\x86\x90\xf5\x7b\xed\x4e\xc4\x91\x94\x7e\x0d\x37\x2c\xf9\x74\x35\x63\xe7\x2c\x73\x90\x81\xd2\x48\x10\x67\xaf\x49\xeb\xef\x7c\x06\x6a\x75\xcc\x70\x1a\xc7\x69\x22\xef\xe5\x59\x36\x57\x89\x89\xb1\x60\x56\x65\x39\x8c\x61\x03\xc4\x6e\x3e\x44\xa5\xbf\xb5\x82\x91\x3e\x69\x19\x93\x9a\xb1\xaa\xa8\x42\x02\x46\x16\xd2\x46\x15\xf9\x31\x9a\x54\x8c\x24\x5f\x30\x25\x0a\xa6\x39\xe1\x05\x58\x57\xb8\xb2\xf9\xa9\xb4\xd8\x35\xa1\xce\xe1\x46\x7e\xfe\x1b\x47\xca\xd2\xe9\x31\xd9\x64\xca\x0b\x5a\xcc\x09\xcd\x52\x2a\x94\xe1\x02\x4a\x22\x14\x8c\x26\x73\x22\xc6\xe9\x74\xca\xf4\xd9\xbb\xf6\x82\xbc\x7f\x83\x96\xa8\x14\x34\xea\x46\xe6\x52\x23\x32\x9a\xc2\xb5\x97\x91\x2b\x80\x5c\x73\x57\x35\xed\x7c\x3e\xd8\x27\xfe\xdf\x7e\xdb\x44\x59\xfa\x4d\x63\x97\xa5\x56\x5e\xe2\x8d\x38\x9b\x89\xf1\xe1\x3c\x8f\xfd\xa6\xe6\x31\x34\x3a\x3d\x3d\xdc\x79\xf3\x7e\xe7\xe8\x74\x77\xef\x68\xe7\xfd\xde\xd6\xcf\x87\xa7\xdb\xfb\xa7\x7b\xfb\x47\xa7\x1f\x0e\x77\x4e\xf7\xdf\x9f\xfe\x7d\xff\xc3\xe9\xc7\xdd\x9f\x7f\x3e\xfd\x61\xe7\xf4\xed\xee\xfb\x9d\xed\xbe\x95\x3f\xdf\xf2\x82\x1c\xd1\xe9\xce\x39\xcb\xcb\x83\x6c\x36\x4a\x73\x15\xa2\x95\x0a\x32\xe5\xd3\x59\x46\x71\x1d\xa7\x2c\x57\x79\x70\xe1\x4b\xa7\xfd\x8f\xb3\x41\xbf\xf2\x77\x57\x43\xff\xa0\xd4\xe1\x25\x13\xe5\xea\xac\x4c\x33\x51\xfd\xfa\x3d\x1b\xa5\xa2\x2c\xe6\xfd\xd0\xc3\xae\xd3\xba\xe0\x53\x3a\xa2\x25\x2f\x44\xbf\xf6\x04\xdb\x29\xd1\x5e\x67\x7f\x33\xfb\xb5\xdf\xf8\xc6\xf9\x6e\x7b\xff\x9d\x79\x7c\x04\xd1\x97\xc1\xc7\xfe\x17\x30\x8e\x9f\x53\x51\x32\x90\x4b\x83\x8f\x31\xff\xd6\xc6\xca\x8a\x14\x67\xd0\x79\xe3\x0d\x10\xd3\x7b\x63\x63\x32\x1a\xe7\xd8\xbc\x70\x75\x37\xf6\xa9\xab\xcd\xc2\x22\x77\xc2\xb5\x52\x8d\x8d\x7d\x4a\xbd\x74\x85\x5a\xf5\x28\x32\x8d\x36\xdd\x7b\xaf\xf1\x99\xbe\x58\xac\x7a\xdb\xf0\xf2\x9c\x0e\xf9\x2c\x4f\xb6\xd9\xf9\x11\xe7\x99\xa8\x28\xe2\xd0\xdb\x44\x9e\xf9\xba\x01\xe4\xa9\x92\x57\x3d\x74\x41\x99\xbb\xb7\x4d\x4c\x87\x04\x85\x84\x6a\x67\x91\xc4\xf9\x60\x96\x27\x19\x1c\x0b\x7d\xb2\x26\x1f\x9c\xb3\x42\x40\x98\x09\x0c\xf7\x17\xfc\xcb\x5e\x66\x58\x71\x80\x59\x53\xf7\xe8\x84\xf5\x25\x4f\xa2\x71\xb9\x9a\xf0\x49\x0b\xfd\x62\x4c\x02\x37\x7f\x0a\x0f\x1f\x92\x9d\xcf\x2c\x9e\x49\x54\xed\xe4\xe7\x69\xc1\x73\x10\x4e\x63\x9a\x7f\x10\x4c\x8a\xab\x0f\x1f\x92\x8b\x34\x4f\xf8\x45\x54\xf2\x29\x20\x51\xfd\x29\x8f\x3f\xe7\x5e\xb7\xeb\x14\x8a\x7c\x33\x2e\xf8\x84\xc9\xeb\xdd\xdb\xb4\x60\x43\xfe\x19\x5c\xa1\xce\xd3\x44\x5e\x14\x12\x7e\x91\x43\x62\xc4\x2c\xcd\xe1\x5c\x95\x87\x01\xf8\xe2\x49\x52\xb5\x36\xc0\x9c\x9e\xa7\x40\xed\xd1\x4c\xb0\x62\x6b\x24\x87\xa5\x8b\xf9\xb4\xb0\x87\x56\x87\x7c\xaf\x4a\xc2\x2e\x6c\xbd\x93\x8c\x64\x5b\xac\xfb\x03\x29\x99\x16\xb5\x56\x63\x56\xc0\x7d\xe3\x23\xe8\x1c\x63\x2e\x05\x14\x85\x86\x8c\xc7\xa0\x18\x8e\xf4\x2b\x47\xee\xda\x86\x58\x12\xbc\xe2\xe6\x84\x7d\xe6\x65\x1a\xab\xf2\x33\xe0\x4d\x12\xc3\x2c\x56\x8d\xe5\xb8\xdf\xeb\x45\x8e\xd2\xae\xf7\xff\xda\x50\x4f\xea\xf5\xe5\x30\xcd\x58\xa7\xff\x40\x25\x21\xd7\x3d\x75\x2a\xc1\x4f\x82\x67\x2c\x4a\xf3\x21\x6f\xb7\xbe\x89\xb7\x35\x9a\x8d\x0d\x88\x98\x55\x37\xb6\x63\x4a\x06\xac\x2c\x59\x41\x12\x79\x0c\xf3\x29\xe8\x11\xd8\xe7\x29\x2b\x52\x06\x44\x0a\x2d\x75\x51\x2b\x37\x3f\x65\xc2\xce\x4b\x09\x4b\x36\x68\x5b\xac\x80\x2e\x24\xcd\x58\xbf\x25\x8f\xeb\xff\xce\xe1\xc0\x4e\x47\xe3\x92\xe4\x4c\x39\x3c\x08\x49\x04\x12\x6b\x19\xf9\xf1\xe8\xe8\x40\x1b\x92\xda\x8e\xfb\x01\x40\xe8\xf5\x3a\x4b\xf4\xbf\x3a\xa4\xbf\xc1\x09\xde\xea\x74\xe5\x9c\xf2\x72\xf5\x82\xc9\x0e\xfb\x03\x9e\x25\x21\xc3\x14\x24\x07\xf4\xb5\xb5\x0f\xd6\xc9\xa6\xd6\x80\x0c\x0b\xc6\xfe\xc1\xda\x5f\x56\xfe\xa2\x33\x8e\x11\xdf\xc3\xcc\xfb\xf0\x29\xd9\x24\x6d\x17\xce\xc3\x87\x56\x07\x0c\xda\x3a\xfb\xce\xcb\x7d\xcc\xe2\x14\xb5\x3f\x72\x79\xac\x20\x84\xe9\xae\xa1\x2a\x78\xb4\xa2\x03\x89\x20\x96\x28\x3e\x9b\x83\xc1\x76\x42\xcf\x98\x20\x69\x09\x96\x3f\x3c\xe7\x07\xbc\x1c\x93\xf7\x3c\xcb\x66\x98\x9d\xf4\x3f\x99\x28\x31\x4d\x32\xe0\x6a\x9b\x4f\xb4\x9a\x18\x86\x7c\xdc\x52\x33\x6b\x9d\x90\xd7\x0d\xcf\xfb\xce\xf3\x8d\x95\x95\x09\x4f\x66\x19\x8b\x70\x74\x42\x67\xe4\xdb\xe6\x90\xd3\xff\xaa\xd3\x46\x63\x46\xef\x11\xf9\xb8\xf3\xc3\xc1\xd6\x9b\x9f\xc8\x2f\x5b\xef\xc9\xee\xde\x7f\xee\xbc\x39\xda\xdd\xdf\x23\x8f\x7a\x57\x91\xbc\x7c\xb4\x15\x80\x2e\x39\x3d\xbd\x60\x83\x29\x8d\xcf\x4e\x95\xd6\xf5\xf4\xb4\xfd\xb4\xd3\xe9\x40\x7e\xd1\x47\x3d\x72\xd5\xe9\x4a\x70\xcf\x9e\x7c\x47\x1e\xf5\xd4\x33\x73\xe5\x6a\xe3\x70\xba\x64\x11\x38\xb9\x37\x56\xee\x4b\x6a\x13\x50\x7d\xf5\xfe\x86\x4e\x5d\xfa\x86\x4f\xe7\x05\xd0\x64\x3b\xee\x90\xf5\x27\x6b\x4f\x57\xa7\x05\x13\xa0\x63\x78\x4b\x63\x36\xe0\xfc\xac\x4b\x76\xf3\x58\xa7\x2b\x85\x45\x70\x72\xe2\xcb\x05\xc9\xd2\x98\xe5\xf2\xb0\x9f\x19\x77\x9a\x77\xbb\x47\xfa\x31\x1e\x14\xaa\x36\x9d\x04\xf1\xf3\xee\x9b\x9d\xbd\xc3\x1d\xa0\x6c\x5d\xb2\x0e\x04\x54\xf4\x5b\xe1\xc5\xdc\x78\xfd\xa8\x8e\xe4\x05\xd2\xe4\x4b\x2d\xe7\x53\x06\xb5\x55\x04\xa4\x30\x55\xe4\x3b\x9e\x4f\xc7\x2c\xc7\x03\x30\x84\xd0\x67\x6b\x4f\x34\xc1\x4e\xc4\x81\x94\xd5\xa1\x0c\x4a\xef\xff\x4d\xc4\x6a\xcf\xa6\x72\xfd\x51\x83\x81\x4c\xf4\x74\xc2\x32\xc9\xa2\x12\xf2\xe6\xf0\x10\xf4\xe9\xac\x28\xe7\x90\x59\x09\x7c\x15\x09\xfb\x4c\x27\xd3\x8c\xf5\xd5\xd8\x08\xf9\xde\x0e\xe4\xb0\x9c\x67\x70\x02\xb5\x5b\x03\x1a\x9f\x8d\xc0\xf4\xff\x86\x67\xbc\x68\x75\xb0\xf1\x2b\x72\xdf\xbe\x59\x8d\xe5\xab\xfb\x8b\xc0\xbc\xe3\xff\x38\x2a\x68\x2e\x52\xd4\xae\x1a\x20\xab\x13\xfe\x8f\xd5\xd2\xbc\x59\x08\x63\x22\x1a\x40\x88\x0a\x04\xf9\x6a\x4b\x90\x77\x3c\x61\x45\x9e\xfe\xa3\x20\x62\x36\x1a\x31\x51\x0a\xd2\x56\x29\x7a\x27\xfa\x55\x14\xf3\x49\x2f\xe1\xb1\xe8\xfd\x75\x5a\xb0\x61\xfa\x99\x25\x9d\x2e\xa1\x39\xf9\x34\x11\x9f\x08\x3e\x92\xe0\x40\xfa\xcf\xcf\xd1\x15\xa2\xe4\xe4\x93\xec\xf5\x53\x35\x11\x2e\x06\x27\x5e\xa9\x20\x45\x2f\xdb\xad\x7a\xe5\xa7\xae\x0d\xcc\x12\xdb\x79\xe9\x6b\x4d\x2b\xfd\x32\x2a\xd0\x2f\xa0\x6d\xc8\xa1\x4b\x5a\x72\x40\x2d\xdc\xc0\xb5\x6d\x5e\xef\x67\xa3\xba\x43\xd7\x9e\xdc\xe1\x0e\x5d\xf9\x1f\xb4\x47\x41\x9d\x31\x9b\x4e\x59\x21\xb7\x93\xb3\xfd\xda\xc7\x5b\xab\xff\xf7\xa4\xd3\x1b\x5d\xbf\x05\x75\xbe\x9b\xeb\xf6\xdd\x4d\xb7\x9b\x7c\x29\x2f\x42\x72\x8b\x43\x51\x51\xcc\x9c\xd6\x85\xd3\xf9\x53\x7d\xd5\x3f\x99\x3b\x34\xde\x95\xe4\xd9\x23\x14\x73\xc8\xe6\x12\x1a\xba\x3e\x66\x19\x39\x67\x79\xc2\x0b\xb5\x03\x18\xe4\xd2\x88\xb3\x59\x92\xe6\x23\xd8\x1a\x77\x46\xf9\x21\x82\xc7\x47\x86\xca\x6b\xd8\x97\xd4\xfe\x60\xad\xd5\xa9\xa6\xb9\x5c\x48\xfa\x75\x8a\x5f\xfb\xf3\x4c\x6a\x3c\x93\x80\x78\xd3\x7f\x34\x1f\x49\xeb\xe1\x23\x69\xd5\x3f\x93\xde\xe8\x3d\x20\x37\x84\x59\x8a\x9b\x9c\x49\x7a\x20\xc1\x23\x09\x77\x42\x70\x93\xbc\xf1\x8e\xa4\x00\x94\xca\xc9\xe3\x00\xf1\xce\xaa\xc5\x20\x44\x18\x82\x7b\x52\x39\x07\xd2\x56\x9e\xa4\xe4\x70\x22\xb7\x98\x3e\x91\xe4\x1b\x7d\x28\x5d\x5c\x5c\x44\x34\x4f\x52\x21\x5b\xc0\xc1\x34\xc8\xf8\xa8\xb7\xfe\x64\x6d\xbd\xf7\x64\xdd\x9e\x59\xab\xfa\xa4\xea\xa9\xa3\x6a\x75\xf1\x59\x95\xc9\x3d\x02\x29\x89\xef\x62\xe7\xd6\xf1\x10\xd8\xc1\xba\x51\xbb\xb2\x95\xdd\x03\x0b\xce\xab\x86\x5d\x5b\xeb\xa4\xbe\x7b\xd7\xff\x3c\xaf\x9a\xcf\x2b\xdc\x6a\xce\xc6\x5c\x6d\x47\xde\x49\xd5\xb4\x31\xaf\x39\xa9\xcc\xba\xde\x70\x13\xde\x05\xc1\x2d\x73\x52\x78\xf3\x76\xad\x31\xa7\x5d\x12\x8f\x69\x41\xe3\xb2\x96\xf2\xde\x3c\xf7\xdd\xd6\xf1\x4a\xb4\x98\x3c\xeb\x54\xf9\xf4\x4e\xcf\x94\xc6\x7b\x98\x85\x3d\x2d\x78\xcc\x04\xa8\xd3\x56\xd4\xd5\x17\xfd\xf1\x54\x40\xf9\xdc\x5e\xd6\xee\x9f\x9e\x32\xf1\x0e\xc6\x72\xbf\xab\xdc\xa9\xb2\x19\xeb\x83\x3a\xcd\x5e\x8a\x4f\x41\x8f\x91\x88\xf5\x26\xde\x5f\x6d\x28\x2f\xcf\xa7\x10\x04\xce\xa7\xef\xb1\x99\x8a\xea\x6a\x1b\x58\xe6\x1b\x7f\x70\x4d\x7d\xbc\x6c\x68\xbf\xa8\xab\x0a\x64\x03\x61\xc4\xca\x03\xed\x62\xb6\x3f\x6c\xe8\xf0\xdb\x86\xe6\xeb\x0b\x3a\xf4\x5b\x1a\x00\x71\x46\x85\x78\x43\xb3\x0c\x2c\x4e\x4d\x33\xfc\xae\xa1\xfd\xa2\x19\x56\x20\x5b\x08\xe8\x3b\x28\xdf\x36\x75\x67\xaf\x90\x6e\xeb\x85\x9d\x39\x40\xcd\xb7\x53\x4c\xe8\xc0\xde\xf0\x5c\x94\xc5\x4c\x72\x27\x2c\x94\xdc\xd8\xef\xda\xf5\xdf\x2e\x1a\x45\x73\x87\x06\x6e\x9a\x8f\x59\x91\x96\xcd\x53\xaf\x37\x5d\xd4\xa3\x01\x67\xbe\x2a\x94\x0d\x3d\x08\xdc\x6f\xb5\x88\x5c\xa0\x81\xc5\x46\xc1\xa7\x47\xf3\x29\xd4\x86\x0a\x01\x7e\x52\x6f\xb9\x08\xb8\x69\x64\x3e\x1b\xc8\x23\xbf\x69\xd8\xcf\x9e\xbd\xac\x34\x5c\x04\x1c\x5b\x98\x0f\xca\x31\x9b\x30\x6d\x26\x68\xc2\xcb\xcb\xf5\x70\xfb\x45\xfd\x78\x0d\x1d\x2e\x43\x63\x30\x9a\x34\xce\xe5\xdb\x7a\xdb\x45\xdd\x98\x46\x1d\x37\x00\xb4\xa1\x35\x1f\xfc\xda\x21\x5f\xf4\x59\xc1\x07\xbf\x82\x4d\x62\xf0\x6b\x64\x99\x29\x79\x0d\xcf\xfb\xe4\x8b\xa9\x6e\x00\x0f\xae\x36\xc8\x95\x2d\xb4\xe3\x19\x10\x21\xcd\xb5\x3c\x7a\x3f\xc1\x9c\x3f\x19\x61\x18\x0a\xdd\xec\x6a\xf5\xa0\x14\x05\x74\x0b\x7a\x4e\xd3\x0c\x1c\xcf\xa0\xfc\xba\x55\x07\x43\x9d\xc3\x72\x4c\xf3\x33\xf0\x19\xc3\x87\x31\x66\x21\x89\x02\x5d\x2b\x5f\x09\x29\x2f\xb2\x02\xec\xfc\x03\x46\x20\xfe\x83\x96\xe4\xd1\x23\x23\x7e\xe8\x2a\x92\xce\xa0\x0b\xc6\x1e\x3d\x8a\xe0\x78\x96\xe8\x7e\x37\x4b\x8f\xe4\xe0\x0e\xd0\x28\xe0\xfb\x17\x9f\xc2\x40\x1e\x58\x4f\x24\x38\x71\xda\x4f\xba\xce\x36\x8c\x14\xbe\x3a\xed\x2a\xa8\x2e\xa9\x7d\x0f\x96\x6f\x03\xbf\xfa\x41\x5b\x65\x49\x89\xfd\xb4\xbe\xd0\x5f\x85\xc3\xda\x5e\xa5\x50\xd5\xad\x81\xd2\x8e\x03\xbd\x1e\xf9\x1b\xc3\x72\xf4\x7c\x56\xa2\x24\x37\x61\xd6\x97\x34\xd6\xa9\x74\x62\x9a\xeb\xca\xb9\xc6\xa6\x75\x0a\x02\xdb\x26\x0e\xa0\x99\xf5\x55\xc7\x52\x43\x44\x74\x7a\x0a\x6a\xf9\xd3\x53\x72\x79\x89\xd0\x2a\x27\x54\x33\x12\x3b\x1d\x54\xd7\x22\xe8\x0a\x82\xf4\x2c\x61\xa0\xd1\xa0\xe0\x34\x51\x0c\x03\x3a\x51\x5c\xc1\x02\x57\x2a\x78\x6c\x3e\xcb\xc5\x6c\x20\xe2\x22\x1d\xb0\xdd\xc4\x73\x5f\xc1\xf7\x80\x2f\x18\xcb\x75\x2f\x2b\xdc\x41\xf7\x17\xa5\x18\xf5\xd1\xd6\xc3\x35\xe1\x20\xda\x7c\x8a\xe6\x7d\x5c\x12\xc1\x49\x5a\xea\x65\x40\xaf\x60\x1d\xf1\x67\xe3\x31\x43\xb3\x8d\x04\x2b\x0f\x4b\x5a\xb2\x36\xbe\x98\xb0\x62\xc4\xf6\xe5\xf8\x7e\xe6\x31\xcd\x60\x90\xea\x15\xa6\xab\x85\xfe\x3a\x7e\x52\x55\x78\x6f\x62\xf6\x90\xe2\x9c\x33\x76\x11\x91\x1f\x23\x95\x9e\xb1\x79\x9f\xb4\x74\x39\x05\x95\x41\xa8\xd5\x55\xc4\x04\x32\x9a\x5b\xec\xc9\x6d\xd5\xf6\x0d\x5b\xa7\x05\x1b\x6e\x54\x5c\x12\xe4\x33\x28\x9b\xdd\xc5\xc1\x55\x44\x2a\x3b\x3e\xd9\xb0\x5b\x59\x91\xe8\xcd\x8f\x5b\x7b\x7b\x3b\x3f\x77\x89\x8f\xb9\xce\x72\xc0\x5a\x93\xca\x9c\xf7\xd1\x9c\xdb\xea\x3a\x36\x2f\x31\x66\xac\x14\xef\x68\x4e\x47\xac\xe8\x13\x07\xdd\xde\x9b\xae\xf9\x20\x49\x05\x64\x50\x93\xb7\x43\xf1\x37\x2c\xf1\x0a\x46\x55\xe7\xd3\x86\x36\xc6\xaf\xaa\xab\x70\x65\x3d\x35\x88\xbb\x18\x35\x8f\xef\x86\xe5\xa8\xb5\xab\x2e\x88\x1c\xd2\xba\x8a\x57\xd8\x70\x5c\xd7\x0e\xf5\x06\xd2\xd6\x23\x87\xc7\x74\x49\x3a\x24\xea\xe2\xa9\xbe\x08\x6e\xbb\xa6\xcd\x63\x5a\xc1\xd6\x8f\x0c\xa3\xb2\xdc\xd9\xee\x41\xd7\xf8\x88\x83\xf5\x37\xa8\xfd\x63\xc3\x75\xa7\x7a\xcb\x8b\x0b\x5a\x24\xae\x8f\x0d\xee\x45\x1d\xb4\xcc\xeb\x9b\xcf\xe9\xa2\x69\x07\xae\x2f\xd8\x82\xeb\xa1\x3d\x68\x5d\xe4\x16\x2d\xe2\xc7\x34\xcb\xde\xb3\x98\xa5\xe7\x40\xaa\xe2\xba\xc5\xac\xb6\x87\x9c\x70\x07\x7e\x4a\x12\x8f\x17\x69\x53\xa8\x8b\x03\xc7\x04\x5c\xe5\x20\x18\xc2\xa1\x61\xaa\x19\x39\x0b\xd1\xc4\xa5\x9a\x99\x54\x15\x58\x30\x7b\x47\x33\x72\x94\x23\xe5\x32\x78\x51\x4d\xdb\x95\x0c\x25\x75\xfa\x0c\x85\xa9\x34\x51\xac\xf3\x65\x85\x66\xeb\x80\x83\x51\x8a\xbd\x1e\xf9\xc8\x4c\x56\x48\xcc\xcc\x60\x65\x24\xf4\xf4\x72\xfd\xba\x28\xb8\xec\xce\xf2\x9c\xc9\xd3\x82\x42\xd0\xb6\x8a\x8e\x5f\xa9\xe3\x2a\x84\xf2\x16\xba\x76\xe1\x66\x86\xe8\x32\x02\xcd\x6c\x75\xee\x8a\xe0\x40\x73\xdc\x2e\x0e\xa5\x04\xb1\x1d\x5c\xdf\xcc\xfc\xf4\x28\xf0\x88\x13\x95\x67\x02\x17\x09\x75\x8e\xa8\x30\x62\x13\xe6\xba\x21\xa8\x08\x08\x0b\xa8\x31\xe4\xc1\x9c\x1c\xb6\x6d\xbb\x72\x72\xd7\xfd\xdf\xc0\x2b\xa5\xda\x6a\x11\xc8\x26\x0f\x3a\x38\x56\xb4\x6a\xc1\x9e\x27\xf2\xf8\xaa\x80\xef\x3a\xd0\x9a\x99\x00\xae\x6a\x03\x65\x9b\x70\xa4\x4a\x84\x89\xb3\x61\xfd\xaa\x09\xd0\xc1\x89\x5b\x20\xb0\x7a\xaa\x6f\xac\x5c\xa9\xcb\x9e\x25\x6f\x4f\x8a\xad\x89\x78\xaa\x95\x2e\x0b\x2b\x87\xd2\x78\xc2\xa1\x9f\xf1\x4a\xed\xd0\x04\xe1\xf3\x6a\x63\x25\x00\xde\xbd\x6a\x2a\x75\x51\xc4\xf2\xf3\x68\x6f\x7f\x7b\xe7\x74\x67\xef\x17\xd8\xa8\xf7\xa7\x05\x4f\x66\x80\x94\xfb\xe4\x35\x8c\x01\x6e\x2e\x84\x3c\x22\x7f\x07\xa7\xe3\x9c\x40\xac\xb8\xf5\x00\x92\x7b\x2c\x33\x45\x41\xd1\x74\x04\xf3\xfe\x8f\xb5\xe7\x5d\x42\xd1\x69\xd3\x7d\xfa\x02\xc8\xf1\x51\x6f\x85\x98\x73\xa1\xef\xde\x6f\x0d\xba\xc0\xfb\x36\x15\xea\x2a\x96\x74\x43\x83\x51\x18\x82\x1d\x35\x32\x08\x52\x94\x8f\xd6\x30\x4c\xce\x8e\xaa\x53\x74\x23\xc3\x01\xc8\x0b\x96\x12\x16\x67\x82\x0d\x67\x19\x56\x16\x2a\x0b\x0a\xde\x59\x1e\xe7\x80\xdb\x15\x9f\x95\x10\xcf\xa6\x80\xff\x78\xf4\xee\x67\x04\x64\x13\x3d\x88\x92\x4d\xf5\x49\x8e\xae\x30\xaa\xaf\x9f\x59\xd9\x12\x44\xd0\x39\xf8\x6e\x43\x70\x3e\x74\x81\xfe\x2f\x74\xca\xb3\x8c\x43\x5e\x97\xcf\x65\x01\xae\xb5\x78\x89\x78\x04\x90\x7e\x9b\xb1\x22\x65\x82\x4c\x68\xc2\xb4\x3c\x0b\xf7\xd4\x21\x8d\x4d\xec\xb6\x1c\x5a\xe4\x23\x47\xa4\xa3\x3c\x1d\xa6\x31\xcd\xcb\x6c\x4e\xc4\x94\xb1\x84\xcc\xa6\x28\x31\xe3\x2c\x69\xe6\x20\xc7\xb9\x7d\xaa\xf5\x69\xa4\xbf\xd0\x72\x0d\x38\xcf\xbc\x35\x3a\x92\x48\x70\xe9\x93\xa4\x02\xaf\x98\x25\x27\x09\x4b\x66\xd3\x2c\x8d\x21\x38\x1e\x8c\x96\xd0\x94\x98\x94\x4f\x5a\x09\x3e\xa5\x23\x66\x16\xac\x25\x9c\x0f\x25\xfe\x2c\x8b\x6f\x2b\x99\x09\xd7\xbc\x43\x62\x3e\x9b\x66\xfa\xcb\x7d\x77\x49\xc0\x09\xde\x5e\x80\x35\x21\xe7\xec\xc2\x64\x91\x43\xcd\x37\x8d\xc7\x10\x47\x08\x1e\x38\x1a\x27\x95\x1d\x17\xc2\x04\x96\xe2\xf0\x70\xb1\xa5\xb8\x3f\xbe\xb2\xd0\xe0\x69\x03\x94\x9c\xed\x0f\xe5\xb3\xf6\xf1\x82\x4e\x82\x9f\x4a\xc6\x76\xd2\x71\xf6\xce\xca\x15\xe9\x93\x2f\x57\x21\xb6\x13\x3b\xd7\x08\xcd\x1f\x16\x30\xdf\xa6\xa3\x3b\x76\x20\x20\xe7\x6d\x90\xf9\x17\xa1\x0c\xd5\xcf\xf5\x21\xfa\xa3\x5b\x66\x08\xe8\x9e\xb5\x95\x24\x84\x92\x8b\x82\x4e\xa7\xcc\x53\x61\x70\xcd\x2c\xb0\x48\x3d\x19\xb3\x4c\xb6\x98\x48\x21\x60\xc4\x84\xa6\x3d\xc7\x91\x4e\x82\x63\x8e\x4f\x25\xfc\x2d\xb2\x34\x2f\x57\xd5\x2e\x59\x95\xc2\xd7\x6a\x96\xe6\x4c\x55\xc1\xef\xe5\x7c\x75\x32\x03\xdf\xe9\x55\xa5\x7e\x0f\x2a\x4c\x3e\xaa\xf1\x6d\x06\x0e\x11\xf0\xbb\x6d\x64\xd7\x2d\xcb\xae\xd5\xc1\xdd\x0c\xbb\x51\x67\xa2\x9a\xb4\x43\xf5\x59\xaa\x27\x98\x5f\x8f\xab\x7e\x93\x75\xea\x36\x6d\x34\x8f\xc6\x3b\x8b\x14\xad\x69\x8d\x5d\xf3\x3d\xd9\x7e\xd5\x25\xad\xea\x4b\xe5\xf3\xa2\xd0\xac\x81\x04\x50\xaa\x86\xb0\xd0\xae\xf2\xb5\xfe\x6d\x6b\xcf\x6e\x65\xf7\x09\x9b\xd8\x9f\x77\x36\xea\xa6\xa7\x50\xd3\xf5\xa7\x9d\x48\xd9\x7e\xa8\x90\xac\x5f\x59\x34\xdd\x01\x3e\xbf\xd5\x00\x7b\x3d\xb2\xf6\x5d\xb4\x16\x3d\x8d\xd6\x88\xd7\x53\xbb\x84\x20\xb9\xae\x32\x4d\x76\x80\xcc\x1f\x28\xf7\xc7\x86\xd1\x82\xea\x59\xb5\x69\xab\x7f\xa3\x43\xf2\x58\x7f\x17\xbd\xed\x92\x16\xf6\xd2\xea\x92\x2f\x04\x7b\xea\x37\x38\x22\xbc\xe8\xc0\x0d\xb0\x36\xe1\x17\x77\x69\x1f\xd6\xf3\x5f\xbf\x66\xfe\x5d\x12\x45\x11\x22\x61\xc4\xca\x9f\xd8\xbc\x69\xc9\xbe\xfd\xae\x83\x55\xda\x47\xfb\x07\x87\x4d\x3a\xf4\x17\xcf\x54\xa3\xe9\xee\x4e\xa3\x7d\xe5\x85\x6a\x53\x72\x1c\x58\x93\x45\xed\xa9\x6a\xb7\xbb\xb0\xd9\xda\xf3\x97\xaa\xdd\x03\x9c\xa0\xf5\xa8\x35\xa4\xd5\xeb\xe9\x23\xd4\xfa\xae\x8a\xf9\x64\xc0\x33\x15\xb2\x8f\x2f\x21\x04\x27\x61\x25\x2b\x26\x69\x0e\xc9\xa4\xac\xcb\x07\x5e\xc3\xda\xbf\x7c\x4b\x06\xb3\x51\xa7\x4e\xe5\xf7\x74\xef\x97\x97\xc1\x61\xbe\x58\xeb\xd4\x22\xf7\xe4\xa0\xb7\x40\xcf\xb5\xa1\xfe\xfa\xc1\xfc\xb5\x88\x65\xe7\x7c\x15\x72\x98\xa8\x8f\xe4\x6a\x1c\xc2\x6c\x50\xe5\x29\x9f\xfd\x44\x36\x49\x8b\x0e\xe2\x84\x0d\x47\xe3\xf4\xd7\xb3\x6c\x92\xf3\xe9\x6f\x85\xc0\xda\xcb\x5b\xc7\x87\x27\x64\x93\xbc\x94\xbf\x7f\x8a\xc4\x34\x4b\xcb\x76\xab\xd5\x89\x86\xbc\xd8\xa1\xf1\xd8\x19\xe8\x59\x87\x7c\x21\x3f\x1c\x9f\xc9\xe6\x67\x1b\x4a\x73\xa1\x18\xae\x9a\x31\x1c\xb5\x5b\x1d\x09\xf2\xde\x26\x79\x29\x11\xe0\xc6\x74\xbb\xad\x7e\xe8\x74\xa2\x5f\x79\x9a\xcb\xce\x64\xe3\x9f\x36\x56\xae\x3a\xe4\xb5\xe5\xf7\xe1\x2d\x4a\xbe\x04\xd0\x61\x31\x21\xc5\xb4\xd5\x73\x5a\x08\x35\xf7\x23\xb2\x69\x68\x4b\x81\x32\x78\xa1\x3f\xb3\x3c\x90\x2b\x46\xbf\x06\x57\x7c\xb2\x49\xd6\xf4\x83\x11\x2b\x0f\x15\xa1\x6c\x02\xe5\x47\x43\xd3\x56\xec\xe4\xb3\x89\xbc\xa1\xec\xee\xe0\x53\x95\xea\x0b\xfa\xf8\x1e\x61\xb9\x41\x23\x72\x9d\x14\x2d\xb7\x6d\xde\x19\x68\xf6\xf8\xf1\x89\x93\x82\xf0\x0c\x77\xa1\xd3\xf7\x6b\xbd\x39\xdb\x87\x1d\x29\x3b\xc4\xb4\x6c\xdb\xd7\xed\xc3\x4e\x07\xcb\x5c\xab\x26\x16\x94\x4a\x85\xb3\x09\x30\x9d\xc9\xe2\xdb\x5f\xc9\xa6\x5b\x67\xfc\x8c\xcd\xf1\x0f\x35\x11\x93\x47\xe7\xd7\x0e\x66\x36\x80\x19\xe3\x81\x73\xd8\x55\x69\x77\x24\xe0\xe3\x5f\xe5\x04\x3a\xe4\xe8\xf8\x8c\xcd\x25\xa9\x1c\xc2\x0f\x4c\x2e\xa4\xa8\xe5\x68\x03\x04\xbb\x07\x8d\xfc\xfe\xe5\x6d\xf9\x3d\x5c\x34\xc9\xea\xf7\x64\xab\x28\xe8\xfc\xaf\x2a\xac\x42\xbe\x81\x64\xb4\xee\x9b\x38\x9b\x25\x4c\x28\x2e\xb4\x98\xbf\x80\x59\x10\x1b\xfe\xac\x91\x19\xe6\x6b\xcf\x4c\xc3\xad\x81\xe0\xd9\xac\x64\xbb\x8a\x9c\xc2\xe7\xc0\xb7\xa1\xd3\xd2\x6e\xbd\xdd\xc3\xd3\xdd\xbd\x37\x3f\x7f\xd8\xde\x39\xf4\x3c\x48\x6c\x8b\x07\x68\x26\x61\x59\x17\x4c\x3c\xbb\x55\x82\xdb\x87\x8d\xa0\x49\x0e\x5a\x87\x48\x43\x4f\xac\xbd\xaf\x08\xc4\x69\xa4\x37\x44\x65\x4e\x6d\xd3\x5f\x97\xd4\xbe\x01\x8d\x85\xb1\x7e\xf8\x28\x97\x77\x2a\x41\x0e\xe9\x04\xcb\x5f\xfd\x5f\x56\x70\xc2\x7e\x9b\xd1\x2c\x2d\xe7\x84\x66\x23\x5e\xa4\xe5\x78\xa2\xbf\x5d\xc4\x01\x05\xcb\x86\xab\x52\x4c\xa6\x05\x33\xa1\x3b\x0e\xce\xc8\xc3\x87\x84\x65\x92\xcb\xb0\xac\x53\xa3\x68\x6f\x73\x2a\x25\x8b\x3c\x38\xcc\x76\x74\x82\x69\x6e\x34\x0a\x1c\x07\xc2\xbb\xb7\x89\x80\x3b\xf5\x58\x64\x07\x31\x40\xa5\x24\x1d\xe5\xbc\x60\x82\x8c\x79\x26\x85\xc6\x0a\xd6\x56\x49\xce\x4b\x37\x88\x59\xde\xf9\xda\x1b\xfe\x74\x36\x88\x1a\x7c\xa7\x86\x0b\x28\x5d\x23\x57\x32\xcd\xc9\xbe\xaf\x06\x55\x53\x3e\x01\xdd\x9a\x44\x95\x1a\x6b\xf0\xf3\xcb\x4b\xcd\x2f\xcc\xbe\xbe\x57\xc1\xf9\xea\x9a\x8e\x5c\x0b\xec\xf1\x6f\x6f\xb5\xc7\xd5\x76\xcd\x4b\x36\x6a\x36\xe3\xbf\x78\xa2\xb6\xe1\x84\x4a\xc2\x7d\x47\xcb\x71\x34\xa1\x9f\xd5\xb3\x34\x37\xcf\xd2\x7c\xe1\xf6\x4b\x3d\xea\x06\x94\xd9\xcd\xa0\xc6\x80\x8d\xdc\x33\x11\x9b\xbc\x22\x4f\xc8\x6b\x39\x00\x6c\x40\x1e\x2b\x30\x5d\xf2\x44\x32\xea\x49\x9a\x57\xc0\x87\xb1\x75\xbb\x10\x94\x20\xd3\x59\xd7\xd8\x79\xb0\x90\xe9\x59\xf9\x7c\x11\x8e\x2a\x6e\x5b\x69\x09\x67\x42\x97\x24\x4c\xc4\x1e\xcb\x7a\x10\xf6\xf3\xf2\x3f\x08\xe2\x60\xfd\x76\x4e\xfe\x4b\xca\xf6\x56\x58\x7e\x46\x7a\x64\xed\x79\xb4\x1e\x3d\x8d\x5e\x90\xf0\xa8\xf7\xbb\xe4\xa0\x4b\x4c\x3e\x4d\xd1\x59\x7c\x33\x20\x8f\xc8\xbd\xe0\xa5\xec\x65\xc7\xbf\x34\xf8\xdd\x84\x2f\x0f\x4f\xd7\x3b\xd1\x30\x78\x7b\x58\xbf\x9d\x6f\x78\x98\x58\xd6\xbf\xe2\x3e\xe7\xdb\xfa\x03\x03\xbd\x9d\x1b\xac\x5d\xaa\xef\x48\xb0\xc7\xf6\x7e\xe7\x46\xb7\x8b\x07\x4b\x79\xdb\xad\x3f\x03\xf7\xa6\xf0\xab\xb5\x4e\xbb\xe5\x43\x69\xd5\xf3\x6a\x54\x4f\xef\xca\xa8\xd3\xb2\xa2\xce\xa8\x8c\xab\x6d\x24\xda\x54\x25\x45\x92\x2c\x36\x44\x08\xb7\x73\xe8\xac\x2d\xf7\x17\x72\x5f\x69\x28\xee\x37\x5c\x68\xd7\x9f\x75\x24\x3c\xed\x5c\x84\xde\x99\x72\x78\xd5\x91\xdd\xbd\xca\x61\xed\x85\xbc\x4c\x86\x57\xe5\xe9\xb2\xc4\xbb\xf6\xe2\xbb\x4e\x34\x6c\xb7\xd2\x92\x15\xb4\xe4\xa0\x9f\xa9\x8d\xfd\x76\xda\x88\x9b\x9d\x5c\x3a\x3d\x65\xd3\x85\xf7\x3b\x64\x59\x46\xaa\x3d\x04\x9f\xe2\xbf\xd2\xd2\x93\x82\xd5\xd3\x98\x27\xec\x80\xa7\x79\xb9\x55\x2e\x3a\xee\x8e\xf6\x4f\x0f\x8f\xde\xef\xee\xfd\xad\x41\xd6\x2c\xc7\xb4\xec\x92\x29\xf7\xc2\xe0\x25\x08\xec\xa6\xad\xc6\x0c\xed\x3a\xae\x00\xe9\x9d\x97\xf2\x7b\x47\x02\x25\x9b\xa4\x7e\x29\xa1\x5d\x32\x70\xb2\xa9\xc1\x61\x2a\x05\x10\xf2\xfd\x26\xb1\xe2\x89\x19\x2f\x79\x4d\x5a\x2d\xd2\xb7\x59\x3d\xf1\x5b\x0a\xb0\xe3\x31\x2d\xde\xf0\x84\x6d\x95\xed\xd4\x77\x81\xa1\x12\xee\xe7\xe4\xdb\x27\x00\x9c\x92\xef\xe5\x5f\x83\xe1\x10\xbb\x7a\x4c\xd6\x40\x1e\xca\xc0\x85\x69\x50\x83\x25\x1b\x74\x3a\x08\x22\x46\x10\x03\x04\x31\x1c\x0e\x95\x70\xf5\xda\x1b\x23\x7e\x0f\xe3\x20\x7d\x42\x55\x9b\x7e\xa5\x8d\xc8\xd2\x98\xb5\xd3\x2e\x0c\x61\x5d\xb6\x6c\x53\xb2\xaa\x07\xfa\xea\x15\x59\x7b\xd2\x21\x8f\xe5\x88\x56\x55\xd7\xf2\xcf\x27\x9f\xd7\x9e\x3c\x79\xf2\xa4\x59\xee\x5a\xbf\x53\xd5\x12\x44\xdb\x80\x72\xb5\xf1\x2a\xf4\xad\xa1\x64\x4c\x58\xce\x9b\x88\xfe\x5b\xdd\x52\xb0\xf2\x88\x23\x2d\x1d\xd1\x51\x23\x60\xad\x84\xda\x55\x7b\xd5\x70\x48\xa5\x38\x91\x3b\x60\xfd\x39\xea\xbd\xa2\x35\xf2\x4d\xad\xdd\x37\xc7\xff\xf1\x1f\x7a\xa3\x9f\xb4\x3b\x41\xde\xf1\xfc\x49\xa7\x5d\xfb\xb0\x41\xb5\xfa\xa4\xe3\x32\x8e\x0a\xdb\x77\x6d\xb3\xa8\x3c\x59\xb4\x05\x1d\x5f\xbb\x2e\xd9\xdb\x7a\xb7\xd3\x05\x87\x0b\xdc\x70\xce\x4b\x9b\x7f\xd4\x14\xe4\x0e\x0d\xf7\x0b\x7c\xdd\x77\xd6\xa0\xbd\xa6\x21\xa2\x1e\xc7\xc7\x79\xbd\x7f\xf2\x98\xb4\x0c\xa6\x5b\x0d\x02\xda\xed\xae\xed\x40\x24\x07\x0d\xcb\xfd\x54\x5f\xbd\x69\xbe\xf0\x2c\x37\x8c\x73\x09\x0d\xe6\x72\x47\xc2\xd3\x97\x1d\xf2\x3a\x28\xff\xa5\x4c\x90\x7e\x83\x08\x9c\x32\x01\xd2\xa1\xf9\x0b\x97\x4e\x8f\xbe\xbd\x6f\xd4\x50\x56\xc3\x03\x1a\x1b\xe7\x0b\xdd\xa2\x49\x71\xa3\x79\xea\x13\xfd\xc7\x81\xa3\x79\xb2\xf7\xc1\x0e\x49\x0e\xa2\x21\x8c\x46\xeb\x68\xd2\xc7\x8f\x4f\xdc\xc1\x1d\x1f\x78\x4e\x01\xfb\xe1\xe5\xbd\xfd\x8d\x4d\x97\x44\x68\x42\xf5\x8b\x4e\xa4\x9b\x04\x0e\x6c\xf3\xf5\xc3\x87\xb6\xb8\x82\xfe\x61\x52\x75\xd6\x86\x7d\x97\xd1\xfb\x48\x82\x49\x72\xc4\x3f\xe4\x22\xe6\x53\x3a\xc8\x1a\x9d\xe0\x9f\x3d\xd5\xb4\x08\xe6\xf5\x26\x61\xf2\x59\x85\x8d\x35\x81\xfb\xee\x89\xd1\x29\x2d\xa1\xa5\x02\xe6\xb7\x0e\x46\x8f\x67\xa8\x41\x70\x52\x15\xb3\xbc\x2c\x24\x81\x76\x9c\x56\x6b\x4f\x6b\xcd\x40\x67\xeb\xb6\x59\xff\xae\xd6\x06\x94\x1a\x7e\xab\xa7\x4f\xaa\xad\x2a\x7c\x76\x49\x49\xec\x65\xa7\x0d\x70\xba\xa4\x05\xff\x7a\x82\x34\xc2\x63\x49\x97\x9c\xa5\xb9\x2a\x98\x80\x49\x95\x4b\x4f\xd3\xa5\xdb\x75\x36\x88\x14\x93\x40\x03\x6c\x9a\xe2\xe6\x21\xf5\xff\xf5\x7a\x58\xf6\x14\x6e\xe6\xa6\xf9\x99\xdc\x3e\x69\x9e\xd4\xbe\xe8\xf5\xe0\xb9\xc1\xc1\x73\x30\xb5\x7c\x03\xa3\xae\x9f\x3a\x50\x45\xb5\xdd\x59\xb9\xaa\x5f\x0c\x8c\xa6\x0e\x67\x62\x58\x44\x9a\x27\xe6\xe9\x59\x55\x41\xad\xe6\xf2\xf8\xb1\x29\xa4\xb1\x6f\xb5\x34\xdf\x6f\x12\xa3\xca\x53\xd2\x9a\x45\x53\x45\x4e\x32\x61\x69\x6c\x0a\xa1\x21\xe8\x2f\x24\x21\xe2\x00\x36\x49\x4b\x92\x44\xab\xe3\xb5\x7c\xd2\x25\x56\xf5\xe1\x35\x46\xda\xa8\x37\xd7\x6a\x26\x97\xe5\xe8\x77\xc7\x4a\x19\xa2\xdb\xc8\x46\x57\x5d\x0b\x0b\x29\xdb\xa8\xcc\x7f\x4e\x45\xe9\x52\x17\x49\x85\xc2\x3b\xe0\xfb\x14\x3f\xfb\x86\xb4\xbf\x8b\x9e\x45\xcf\xa2\x17\x5d\x82\x3f\x5e\x76\x56\xcc\x7e\x8b\xb6\x34\x34\xb2\x49\xdc\xa7\x05\x9d\x6f\xac\xac\x54\x77\x7b\x5b\x21\x61\x23\xf0\xc6\x8e\xb2\xfe\x4e\x6d\xba\xd0\x8d\xe2\xe9\x32\x9a\x8d\xf0\x95\xcc\x97\x31\x7a\x8f\x54\x85\x25\x09\x3c\xd0\xcf\xed\x14\x03\x5f\x71\x1f\x7c\xba\xbe\xdc\x7d\xf0\xe9\xed\x34\x01\xe1\xbe\x9f\x36\xde\x07\xbf\x6d\x78\xf3\xec\x69\xd3\x1d\xf2\xd9\xd3\x97\x37\x51\x80\xa0\x35\x26\xb0\x02\x77\x19\x62\x29\x77\xc2\xce\x9b\x77\x5b\x87\x20\xd3\x91\x17\xc6\x8e\x29\xc6\xe9\x04\x85\xa0\x8c\x0f\x68\xd6\x7c\xda\xe2\x81\x32\xa6\x4d\x53\x79\xa1\xa5\xae\xed\x9d\xc3\x37\xef\x77\x0f\x8e\xf6\xdf\x37\xd9\x7b\x9f\x1a\xd3\xeb\xf5\x3a\x36\xcc\x0a\x84\xbc\xa7\xf1\x5c\xd4\x5d\xbf\xdb\x39\xda\x6a\x8c\xd3\x7a\xd2\x89\x7e\xda\xf9\xbb\xea\x78\x48\xd3\xac\x71\x26\x6b\xfa\x2c\x1e\xd3\xa2\xf9\x3e\x6d\x26\x7c\xc3\x3b\xc8\x2c\x6d\x04\x09\x9e\x10\x90\xe0\xfe\xac\x51\xc4\x7c\x62\x9b\xec\x7c\x6e\xb4\x6e\xbf\xf8\xce\x36\xdb\x5e\x84\xbc\xb5\x97\x7a\xb6\x2c\x9f\x4d\x16\x88\xc1\xcf\x9e\x6a\xe9\x23\x15\xc0\xef\x1a\x57\xe3\xf9\x0d\xc5\xef\x1b\x98\xd2\x0e\x8a\x74\x92\x96\xe9\x79\xe3\x6c\x9e\x6b\x42\xc5\x0b\xce\x36\x13\xf1\x75\x57\xc8\xd3\x25\x2f\xa5\xa3\xfd\x83\xbd\x66\x8c\x3f\x7b\xaa\xa7\xfd\xe0\x6f\xfb\x07\xdb\x8d\xc8\x31\xa4\xbf\x7d\xed\xf5\xe5\xc1\xd9\x72\x6e\x15\xb2\x33\xe8\x34\x1a\x6e\xd8\x9b\xd1\x83\xed\x03\xfd\xb7\x1c\x39\xda\xa1\xe5\x04\xf4\xd3\x07\xc8\x78\xe4\x0b\xd8\xfa\x86\x11\xc1\xcb\xff\x3c\xdc\xdf\xb3\xaf\xe4\x5f\x0a\x5b\x18\x89\x9e\x0e\xe5\xfa\x63\xab\x87\x0f\xf1\x47\x64\x5e\x61\xd3\x83\xf7\xfb\x47\xfb\x47\x7f\x3f\xd8\x21\xe8\xc6\x85\x32\x4d\x0b\x5f\xfe\xb8\xbb\xbd\xbd\x23\x7b\xb8\x38\x13\xed\xd6\xe9\x38\x4d\x12\x96\xb7\xd4\xa4\x8e\xf6\x4f\x0f\xde\xef\xbe\xdb\x3d\xda\xfd\x65\x47\x37\x71\x16\xbf\x65\x08\x51\x99\xd2\xbf\x5c\x45\xda\xe3\x62\x17\x9e\x41\xbc\x1f\xc3\x56\x38\x2d\x9d\xb1\x92\x6c\xaa\x6d\xdd\x6e\x21\x0b\x5c\x2d\xd4\x1b\x0d\x75\x2b\xcb\xac\xed\xde\x6f\x2b\x74\x9b\xfd\x83\x7a\x13\x3e\x5d\xad\xb6\x02\xaa\x06\xe9\xc2\x78\x97\x1c\x1b\xac\x9c\x60\xa3\x0f\x87\x3b\xa7\x7b\x5b\x6a\xa6\xca\x75\xdd\x2c\x8d\xeb\xb6\x8e\xcd\xff\xcb\x6c\x15\xb5\x34\xff\xa5\x0d\x2e\x26\x7f\x1f\x30\x7e\x48\x93\x07\x5e\x7e\xff\x55\x12\xe4\xfa\x5d\xa2\x13\xd3\x8d\xd2\x72\x3c\x1b\x40\xe6\x8d\x7f\x64\x3c\x2d\x78\x7c\xd6\x8b\x79\xc1\x56\x7f\x15\x3d\x2c\xef\xd6\x5b\x7b\xf9\x54\x33\xb7\x12\x74\x8f\xf7\x74\xcf\x97\x97\xe6\xb7\x33\x99\x86\xc7\x50\xb5\x00\xc2\xb8\x36\xb4\xb1\x1d\xb2\x9f\x83\x25\x92\x67\x09\xd9\xca\x93\x82\xa7\x89\x1d\x5b\xcc\x13\x16\x8d\x38\x1f\x65\x0c\x06\x38\xed\x9d\x7f\xab\x07\x95\xb0\x92\xa6\xd9\xeb\x34\xd9\x7c\xf1\xed\x4b\x3d\x3c\xc4\x95\xda\xe9\xee\xe1\x23\xe9\x12\xf8\x7c\xcd\x83\x46\xbb\xfe\x29\x2d\x48\x72\x00\x6e\x26\x2d\x6a\x82\xb5\x46\xac\xec\x87\x75\x32\xc9\x81\x8a\x32\xc4\xd6\xda\xcf\xfe\x25\xb9\xea\x44\x74\x03\xbd\xe6\x3b\x9d\x88\x82\x53\x4b\xd5\x4f\xc5\x9a\xae\xb6\xad\x10\x0f\x3b\x43\x0d\x5f\xee\xe6\xb6\x43\x36\xba\xf2\x0e\x4a\xcb\xa6\x65\x87\x24\x50\x31\xda\xa5\x30\xe3\x3a\x91\x1c\xb8\xdd\xd4\xbe\x85\x7c\xcd\x25\xf8\x56\x3a\x5f\xcb\x8b\x7f\xad\xe3\xae\x1d\x5b\x07\xdd\x30\x92\x03\x5d\x6e\xb6\xa0\x53\x4f\xa4\x2c\xe9\xc8\x4e\x49\xcc\xe5\xae\xb4\x1b\xe9\xb8\xa4\xa3\x13\xc9\xc9\x14\xc2\x15\x7d\x3b\x74\x82\x8a\xa5\xf9\x04\x6f\x4e\x25\x1d\xb9\xf2\xfe\x7c\x62\x0b\xd6\xa4\xc2\xb0\x2d\x67\xe7\x3c\x7c\x58\xd9\x3a\x91\x16\xf3\x61\x0f\xe1\xbe\x6c\x55\x96\xc2\xa3\x05\xf5\x79\x5a\xba\x1f\xe0\xa4\x1b\xbf\x49\x4b\xe3\x4d\x6d\x7b\xb6\x43\x7d\xe0\x9b\xe6\x96\x31\x81\x2a\xb2\x00\x0d\x76\x09\xaa\x64\x6f\x8d\x1e\x54\x6d\x8a\x9a\x0d\x79\xcb\x6d\x14\x47\x29\x3a\x30\xa1\xc3\x8d\xc3\x3f\xdb\xd0\x18\xca\x26\x7b\xed\x2d\xb5\x8c\xa9\x68\xdb\xe5\x43\x2a\xec\x38\x65\x77\xef\x6d\x47\xcc\xb0\x59\xdf\x31\xe0\x9e\xfc\x56\x4e\x08\x39\x7c\xa7\xa3\x09\x12\xff\xee\x3a\x27\x73\x7b\xad\x4b\xbe\x5c\xd9\x08\xae\xb4\x3c\xc6\x46\x27\xda\x21\xa8\x31\x0b\xbb\x1e\xa4\xd3\x11\x12\xb6\x07\xa1\x13\x00\xe9\x55\x61\xdc\x76\x88\x72\x5b\x6e\x67\x3b\xab\xbe\x3b\xd0\x27\x2a\xef\x7d\xc7\x06\xe1\x19\xea\x74\x39\x50\x75\xe7\x5d\x39\x6c\xc3\x7b\x75\xb5\x11\x20\x91\x94\x35\xdb\xc9\x53\x86\x93\x3d\xa8\x28\x07\xd3\xb2\xaa\x1d\xd4\x72\x5c\xfb\xc0\xd3\x6e\x1c\x74\x3a\x41\x45\x60\x16\x56\x16\x2a\xa7\x2e\xad\x21\x44\xe5\x60\x95\xfe\xd4\x94\x2a\xaa\x42\x44\xbd\xeb\xdd\x50\xda\x09\x1b\x61\xab\x92\x3d\xd9\x9d\x9c\xfa\xec\x00\x36\x80\x5b\x76\xed\xd4\xb4\xed\x90\x7e\x1d\x79\x6d\xe7\xbd\x04\x66\x7b\x0d\x49\x07\xee\x18\x42\xef\xe5\x2e\xb1\x2c\x4d\x9e\xce\xae\x23\x1b\x1e\x02\x8b\xb6\x96\xd9\x4c\x18\x20\xef\xef\x65\x5d\xc5\xa4\xba\xc9\x20\x47\xbe\x7c\xe1\x6f\xed\x4e\xa7\x96\x76\x5d\xfd\x8d\xe5\x6a\xe5\x17\x66\x44\x1d\xf3\xa8\x06\xfd\xf2\x92\xd8\xa6\xce\xbe\x91\x0f\xfc\x8d\xf2\x9a\xec\x90\xbe\xda\x7f\x57\xd6\xe4\xbd\x7f\x91\xeb\xd5\xdf\x76\x8d\x34\xae\x7d\x3a\xd8\x46\xd3\x8a\x62\x70\x55\xcd\xdb\x52\x8c\x2a\xcc\x16\xbf\x16\x95\x9a\xd2\xb7\xf5\xb9\xab\x47\xa8\xbb\xda\x5e\x08\x79\x19\xf6\xd3\x21\x2e\x9f\x74\xf8\x99\x2e\xef\xd4\x84\xdb\x3d\x3a\xf1\x79\x41\xe0\xb5\x39\x8d\xe4\xf7\xb9\xfa\x40\xca\xf8\x6d\x0f\xb1\x66\xd7\x17\x4c\x60\xbc\xc0\xf1\x49\x90\x11\xf8\x3b\x1e\x00\x46\xae\x65\xc0\xe1\xfe\x01\xa4\x90\x4d\x1c\x03\x30\x01\x40\x86\x7c\x78\x6f\x53\x0b\xfa\xf6\x81\xbc\xa4\x77\xd4\x68\xa2\xe9\x4c\x8c\xdb\x1a\xe9\x57\xb6\xdc\x8e\x7c\xd9\x84\x1c\x2b\x7a\x37\xa0\x47\xfb\xb7\xba\x08\xda\x3d\x3c\xdd\x97\x0c\xb1\x4e\x3f\x1b\x21\x14\x62\xf3\xd7\x8e\xa0\xdf\x27\xbf\x37\x5a\x97\xc2\xaa\x19\x19\x50\x76\x55\x52\x54\x5b\xb6\xe3\xe3\xd7\x11\xc4\x0c\x6b\x0e\xe1\x5a\x79\xc9\x3c\x03\x1b\xa8\x72\x0d\x3f\xd6\x76\xc0\x94\xe7\x27\x1d\x88\xd5\xb9\x67\x05\x2f\x1c\xbe\xbd\x49\x9a\x05\xd1\x8e\xe5\xce\xf4\x80\x0d\xd6\xe5\xa5\x8e\xaa\xad\x75\x34\x9f\xb2\x9d\xa2\xe0\x45\xbb\xa5\xc0\x99\xba\x1b\xb1\xb5\x30\xde\x6b\x39\x8e\x00\x25\x68\x5b\x66\x69\xd2\x0e\x14\xf1\x7c\xe2\x95\xe9\x7c\x72\xe2\xda\xfa\x1d\x18\x0f\x04\xf3\xeb\x30\x2a\xd7\xcb\x6a\xc8\x77\x40\x18\x13\xac\xc4\xb3\xc0\x61\x30\xf8\xf5\x46\x45\x4a\xa9\xf1\x5b\xfd\x50\xb3\x8b\xae\x9c\x4b\xa7\xe3\xf3\x61\x25\x34\x7b\x02\x8b\x2f\x6d\x20\xdc\x92\x8e\xaa\x52\x15\x0e\x43\x8b\x2a\xd6\x2d\xa2\x72\x3d\xc2\xcb\x5d\xa7\x02\xd5\xa3\x2a\x00\xfe\x45\x2e\xc1\x30\x1d\xcd\x94\x64\x84\x75\xca\x84\xbc\x24\x01\xfe\xae\x7c\x27\x09\x79\x39\x80\x0b\x81\x89\x92\xd2\x1a\xbc\x80\xe4\xdf\x25\xad\x52\x69\xcf\x5c\xab\x8d\x7e\xd6\xae\xf8\x37\x39\x86\x8d\x2b\xcc\xec\xa2\x54\x1f\x64\xb3\xf9\x80\x92\xad\x41\x1f\x22\x1b\xf9\x32\xcc\x06\xd4\xe7\x08\x69\x6a\x5e\x74\xa0\xbd\xd1\x9a\xd4\x3b\x00\x36\xdc\x04\x60\x6d\x4d\x01\x08\x0a\x1f\x8d\x5f\xbd\x78\xd6\x09\x75\xa5\x08\x0c\x26\x1c\x58\xc8\xa0\xab\xe0\xda\x8b\x6f\x3b\x16\x7b\x6a\x01\xbc\xc5\x6d\x85\x86\xd6\xea\x86\x87\xec\x1c\xc4\x10\xc9\x8e\x0a\x48\x18\xac\xdd\x3d\x92\x5b\x55\x56\x0c\xa8\xe1\xe2\x4c\xe0\x3b\xa7\x40\x45\xd5\xff\xf1\x6f\x8e\xff\xe3\xc7\xaa\x2f\xa4\xe5\x39\x92\x1c\x11\x1d\x7d\xc3\x79\x80\x14\xc0\xb9\x19\x34\x99\xe2\x85\x3d\x23\xda\x18\x15\x03\x7c\x6d\x3d\x5a\xef\xea\x5f\x4f\xcd\xaf\x67\xe6\xd7\x0b\xf3\xeb\x5b\xf3\xeb\x3b\xf3\x6b\xed\x89\xfd\xb9\x66\x7f\x5a\x90\x6b\x16\xe6\xda\xb3\x15\x42\x5a\x63\x2a\x74\xad\x8c\x2e\x94\x08\x8a\x69\x79\x38\x2d\x18\x4d\x00\xa1\xfa\x8e\xda\x9d\xd0\x32\x1e\x77\x55\x72\xc7\xae\x60\xb4\x88\xc7\x5d\x31\x65\x71\xca\x44\x17\xe2\x6c\xba\x8e\x54\xd4\x2d\xad\xb6\xb9\x3b\xb3\x76\xa3\xd6\x4a\x47\x07\xe5\x74\x5b\x9d\xae\x0a\xd3\x70\xb0\x61\x99\xe3\xaf\x1b\x1d\xb9\x22\xf6\x15\x86\x62\xb8\x48\xbc\x60\x59\xf6\x53\xce\x2f\x72\x8b\x4a\x50\x48\xca\xa5\x8c\x44\xc9\x0b\xd6\xe9\x92\x33\xec\xa2\xda\xd6\x76\x74\xb6\xd1\xb1\x2a\xe8\x76\xb5\xdd\xf1\x99\xea\xf5\x5a\x57\x58\x77\xf9\xd5\xf9\xa0\x94\x35\x76\x6d\xf5\x99\x15\x0d\x79\x01\x32\x85\x5c\x82\x21\x2f\x5a\xee\x15\xde\x88\xa0\x36\xeb\x38\x15\x6d\x5f\x47\x88\x47\xef\xe3\x4d\xd2\x6a\x75\x8c\x57\x96\xdf\x04\x0e\x52\xe3\x8d\x15\x78\x27\xd1\xa5\x0e\x41\x23\xde\x74\xbd\xe1\x3e\xd7\xc3\x3d\x63\xf3\xb7\xbc\x68\x8b\xf9\xa4\x83\x42\xf0\x5b\xee\xd6\x50\x74\x5e\xbb\x32\x98\x56\x84\xc0\x8b\xfa\x21\x2a\xe6\x13\xf0\xc3\x31\x87\x28\xaa\x34\xcc\xf9\x69\xd6\x59\x4e\x35\xcd\x2b\x53\xc0\x50\x80\xe0\xb4\x36\x37\x09\x0c\x45\x61\x4f\x89\x37\x58\xc8\x50\xb0\x43\x38\x51\xaa\xba\x33\xa3\x44\x04\xf9\xd7\x36\x86\x64\x22\x8d\x8d\xf1\xe0\x23\x57\xe8\xaf\x7a\x33\x12\xb1\x0e\xd2\x06\xe7\x6b\x72\xfb\x6b\xe7\x1c\x75\x51\xdc\x27\xc7\xae\x6f\xcb\x49\xc7\xd4\x40\xee\xeb\xab\x6a\xd7\x03\xf0\x6c\x69\xef\x6e\x52\xf3\xcc\xae\x9c\x3c\x3e\xe0\xa7\x4d\x6e\x43\x15\xd7\xa0\x2a\xdc\x94\x89\xc0\x4d\xd8\x87\xfd\xc2\x71\x79\x0e\x5f\xce\x64\x1f\x12\x74\x53\x83\x7e\xf3\xd9\xea\x77\xf5\x32\xdc\x15\x5e\x58\xf6\xeb\x5d\xc0\x8b\x1a\x74\x78\xea\x03\xfe\x36\x0c\x58\x8b\xfa\x01\xd0\xea\x55\x0d\xb8\x7a\x8e\x54\xd5\xeb\x91\xf5\x67\xd1\xd3\x68\x9d\xf8\x16\x0c\x15\x8a\x73\xdc\x25\x8a\x2b\x17\xf2\xb7\x98\xd2\x98\x9d\x9c\x74\x56\xac\xe1\xe3\x1a\xaa\x74\x85\x65\x79\xfb\x6e\x50\x48\xeb\x38\xbf\x07\x6e\x40\x66\xaf\x47\xde\x1d\x92\x9d\x64\xc4\x74\x9a\x6b\xa1\x76\x31\xca\x77\x90\x05\x11\x06\x42\x05\xf9\x72\xb5\xa2\x72\x03\x0d\x7e\x4a\xcb\x25\x3e\x50\x49\xfc\x7a\x3d\xf2\xcb\xb7\xc8\x3d\x04\xe1\x39\x19\xf0\xcf\x2c\xd1\xd6\x61\x47\x55\x6e\x31\x73\x7c\x78\x02\x51\x98\xad\x63\x09\xe2\xa4\x05\xa1\xab\xf6\xf5\x17\x42\xfb\xe4\x90\x5c\x61\x9b\x2f\x57\xd5\xf7\xea\x0a\x75\xd8\x31\x0d\x36\x56\xae\x3a\x9d\x2e\x69\xc9\x91\xa9\x1d\x6b\x9a\x3b\xcc\xc1\x82\xb0\x4e\xef\x8e\x46\xc0\xea\x89\x2e\x2f\x8d\x96\x18\x6e\x6a\xfa\xbe\x0f\x55\x9f\x76\xbe\x55\x7f\x0a\x05\x50\x4e\xda\x7c\x6b\xbd\x89\x8b\x91\x3c\xf1\x8e\xd3\xf2\xc4\x77\x4a\x5e\xb3\x7f\x6a\xca\xe8\x92\x07\xfa\xa7\x17\x07\x19\xb8\x94\xa4\x1d\x80\x8c\xd7\x32\x27\x98\xd3\x06\x72\x1a\x72\x83\x68\x53\x71\xbc\x76\x62\xa5\x77\xa5\xa3\xb6\x4d\xfc\xac\x46\x0f\x9c\x6f\xfd\x01\xc9\x8f\xed\xdb\xcb\x4b\x72\x4f\xd9\x70\xdb\xfa\x21\x60\xc9\x7c\xed\x1d\x97\xfa\x36\xe1\x5d\x89\x0c\xb4\x8e\x09\x82\x33\x8f\x2a\x0a\xb2\xd0\xa5\xc8\x9e\x5e\xea\xa6\xa2\xe9\xcc\x09\x02\x54\xd7\x16\x85\x85\xda\x9c\x6a\x84\x19\xd1\xe9\x34\x9b\xb7\x61\x6b\x76\xe1\x33\x25\xab\xea\x8d\x0e\xe7\xee\xd3\xe8\x99\x3e\x77\x5d\x9f\x33\x47\xbc\x3a\x69\x8f\xd3\xbc\xec\xac\xd4\xaf\x2a\xc7\xae\x5d\xf2\xa4\x29\x64\xfb\xf9\x93\x4e\xf0\x9a\xe3\x7e\xdc\x25\xf5\x16\xe8\x1f\x07\xf9\x95\xed\x60\x9f\x87\x07\x6b\xe4\xbf\x93\x95\x8a\x37\xae\x82\x6b\xa5\x24\x04\xb7\xfe\x04\x5c\x9b\xbf\x83\x20\xb6\x6b\x40\xc8\x26\x5d\xd2\x92\xff\xb4\x8c\xd0\xaf\x19\xe5\x53\x60\x20\xd7\x40\x70\xac\xc6\x76\x5f\x2b\x40\x35\x37\x97\xdb\x85\x77\xf4\x7a\x50\xc5\xc3\xd1\xb2\x61\x9e\x15\xd0\x48\xeb\x62\x1e\x4c\x18\x8e\xb6\xa4\xbf\xef\xf9\x5d\x65\x2c\x58\x14\x2a\xe8\xa8\xa7\x8c\x16\x49\xfb\xf6\x3a\x7a\xfd\x86\x60\x72\xb9\x8f\xec\x2b\x2f\xbe\xc2\xb6\xb6\xc1\xde\x69\xe9\x86\x57\xd4\x82\xd0\x2b\x9a\xab\x70\x64\xb7\xa8\x8a\xf7\x69\x3d\xc2\xdb\xda\x04\x54\x6b\xe4\x6e\xcb\x6b\xfc\x6a\x04\x72\xeb\x8c\x1e\x9e\xd1\x79\x77\x67\x6d\x8d\x0c\x66\xa3\xd1\x7c\x81\xa8\xa2\xea\x91\x0e\x0b\xaa\xd2\xd9\x61\xf1\xbc\x9b\xb9\xab\x28\xb7\x8b\x66\xed\x82\xf6\x6a\xc1\x8d\x83\x7e\x0c\xfa\x2f\x6d\x67\x85\x7e\xb5\x3a\x58\x1d\x00\xf8\x10\xd8\x3f\x12\x7b\xcb\x56\x3d\x94\xbf\x9a\xe7\xb5\x42\xac\x7f\x7a\x48\x42\x43\x18\x1d\xd2\x07\x6d\xa6\xde\x2c\x1f\xbd\x41\xd4\x09\xb8\x2c\xe6\xfe\x95\x0a\x54\xa8\x8a\xe0\xae\x48\x2c\x6f\xb7\xa4\x5d\xd3\x0b\x58\xa8\x2a\x80\x45\xf3\xeb\x9a\xbb\xbd\xaf\x64\x58\xa4\x0b\xaf\xc3\x06\xf3\x86\x42\xaa\xa6\xd0\x0e\xe0\xee\x58\x71\x0a\x9c\xde\x49\x0b\xd3\x25\x38\x93\x55\x76\xa6\xa0\x4e\x3d\x44\xa8\xb7\x0b\x97\x69\xf2\xce\x6a\xb7\xa8\x98\xe7\xf1\xee\x82\x30\xb3\xa7\xb7\x8b\xa6\x68\xee\x99\x0f\x04\x2b\xce\x41\x2b\x14\xea\xf6\x76\x5e\xfe\x5f\xe3\x23\xfa\xdd\x92\x3e\xa2\xbf\x43\x0c\x34\x84\x72\xde\x34\xac\x55\x5c\x13\xd6\xfa\xec\x76\x81\xca\x4e\xba\x22\x13\xd7\x2a\x2a\x71\xad\xca\x8b\x63\xe9\x8c\x45\xb5\x2b\x8d\x1f\x6f\xec\x83\x6f\x58\xa7\x67\x6b\x9d\x48\x2b\x86\x6b\x53\xbe\x9d\x67\xb1\xbc\xe3\x40\x35\x2f\x60\xd1\x36\x69\x38\xcf\xb3\x79\x44\xf6\xb3\x84\x9c\x7f\x4b\x62\x0a\x85\x4c\x4d\xd6\x1e\xa8\xb1\x0b\x2d\x95\x78\x20\x22\x39\x16\x3f\x45\x03\xc9\xf9\x2a\xb6\x51\x69\xdf\x53\xb1\x90\xd1\x3f\x5f\xbb\xa1\xa3\x23\x54\xaf\xf1\x38\xa8\x59\x9c\x50\xc4\x8f\x12\x94\xd5\x33\xd5\xee\xe1\x43\x35\x0f\x9b\x74\xb6\xaa\xfa\xc1\xf7\x8f\xc9\xfd\xbe\xc2\x83\x5c\x09\x2a\x88\x11\x21\xef\xdd\x47\x06\x56\xdf\x80\x18\xdd\xd5\x0f\x93\x12\x04\x35\xb6\x0c\xc6\x5b\x24\xcd\xc9\x97\x2b\xf2\xba\x21\xcb\x0e\xaa\x99\xac\x83\x10\x13\x65\x17\x0f\x5e\x30\x1d\xd8\xfb\x84\x3d\x3e\x94\x85\xa3\x09\xdf\xdf\x75\xda\x6f\x15\x3c\xe0\xe4\xe1\xd8\xba\xf5\x67\x2f\x3b\xd1\x50\xdd\x33\xad\xdc\xdc\x25\xce\xd0\x81\x3a\xbb\x64\xdd\x29\xc6\x2f\x58\xa9\xc6\x78\x7c\xe2\x3c\x46\x49\x61\x93\xdc\x83\x97\xae\xfd\x0a\x2e\x50\x36\x3d\xac\x7b\xcc\x99\xaf\x94\xbe\xcb\x4f\xb9\x6a\x6f\xb4\x0d\x3b\xd5\xad\x92\x2b\x49\xc6\xbe\xb1\xe3\x92\xc4\x01\xbd\x74\xc8\xbe\x93\x3a\x7f\x13\x1b\xda\x76\xe0\x35\x23\xe7\x16\x80\x61\x43\xb8\xd4\x1c\xd4\xc5\x0b\xbc\xe1\x94\xbf\x8b\x6b\x35\xeb\xae\xa8\x01\xf5\xf1\x9f\xd0\x21\xf8\xec\x76\xde\xf9\x5f\x71\x26\x3c\x7b\xba\xdc\x99\xf0\xec\x76\xfe\xf4\xe1\xbe\x9f\xdd\x61\x5e\x0c\xa5\x93\x3c\x30\x6e\x60\x95\x34\x18\xee\xfb\xa0\x00\xf2\xec\x76\x57\xa9\x1b\x67\xbd\x58\xb7\x59\x2f\x9e\x5f\xab\x58\xbd\xe6\x58\xd1\x5a\xd7\x26\x1f\xec\xf0\x51\x72\xbb\xab\xc1\xad\xaa\x50\xfd\x5b\x16\x52\x33\x65\x0f\x21\xf4\x47\x33\xd3\x26\x97\x76\x7d\x11\x4e\xf3\x73\x5a\xa4\xb4\x31\x16\xf3\x5b\xed\xd4\x7e\x41\x8b\x1c\x6f\x32\xe1\x65\x34\x81\xb9\x3a\xe3\x5e\x10\xda\x0b\xaf\x6a\xf5\x81\x4e\x89\x79\xc8\xe2\xa2\xf1\x6c\x58\x7b\xfe\xdc\x3d\x64\x0f\xae\x29\x3a\xb4\xf6\xfc\xd9\xc2\xa8\xea\x76\x2a\x7e\xa1\x59\x9a\xa8\x48\xd1\x2e\x9e\xb1\xfb\xf9\x36\x20\x78\x2b\xd6\x95\xc8\x08\xe9\x3d\xd2\x91\x33\xca\x14\x09\x39\x6f\xc1\xe3\xe4\x68\xe7\xfd\xd6\xd1\xfe\xfb\xd3\xc3\xbf\xbf\xfb\x61\xff\x67\x7b\x7d\x33\xce\xdd\xae\xfa\x4e\x1e\xec\x15\xd7\x55\x7d\xff\x7f\xbb\xf5\xe1\xff\x9c\xd6\xa1\xb5\x6c\x2c\x5b\x0b\x74\x9b\x3f\xb0\x21\x2f\x98\x06\x2f\xa6\x2c\x86\x0c\xef\x26\x41\xef\x7b\xa5\xf7\x84\xdc\xca\xda\x3d\x76\xc2\xca\x31\x4f\xdc\x0c\xf8\x79\x49\x41\x8d\xaa\x72\x3c\x43\x4b\xab\x57\xc1\xbc\xbe\x08\xf0\x07\x46\xc4\xac\x80\x12\x08\x69\x7e\xce\xcf\x30\x47\xb5\x01\xa5\xd2\x2e\x3b\x20\xa8\xd0\x55\x59\xfa\x0e\x18\xa3\x7c\x50\x63\x7a\x9b\xa3\xe6\x62\xd7\xfc\xdd\x9e\x60\x6c\xe4\x20\x53\x6a\xc4\x47\xc4\x6a\x7f\x75\x23\x75\x6c\x3e\x52\x87\x9b\x0b\x11\xfc\x7e\x74\x3b\xbc\x04\x86\x21\x12\x12\x45\x91\xfd\xf3\xca\x19\xa5\xae\xea\xf7\x1a\xf1\x70\x45\x26\x74\x3e\x60\x1a\x88\x6a\xa3\xeb\xfb\xbd\xd6\x48\xb8\x32\x69\x90\xdd\xeb\xab\x3b\x33\x17\x8a\xab\xc4\xf1\xb0\xe1\xb5\x42\x37\xa0\x0a\x3d\x3c\x7c\xe8\x37\x3a\xae\x34\x00\x75\xa5\xdf\x22\x44\x57\x5a\xf4\x71\xd4\xcd\xee\x40\x1a\xf2\xe8\x1b\x3f\x4f\xdd\x72\xc3\xa6\x90\xf7\x48\xf0\x0d\xcf\x32\x95\xfb\x9a\x0f\x15\xed\x49\x82\xa4\x90\x0e\x9c\x5f\x90\x84\xc5\x19\x55\x19\xce\x69\x9e\x90\x73\xb9\x0b\x4d\xc2\x73\xc8\xbd\xab\x9a\x17\x0a\xe7\x62\x36\x9d\x66\x29\x66\xdc\xd6\x25\xa1\x54\x12\x64\x11\x91\x1d\x2c\xed\x48\x66\x82\x8e\x98\x4f\x74\x10\xa2\xa2\x32\xd1\x2b\xce\xd0\x6e\xf9\x2c\xa7\x65\x69\x03\xc2\xcb\xe6\x5b\x45\x99\xc6\xe0\xc9\x07\x0d\x23\xa7\xfc\x4d\xdb\xa1\x3e\x93\xc6\xb7\xef\xd3\x64\xaf\x47\xb6\x72\x95\xa1\x9d\x66\xda\x00\x21\x5b\x83\x9b\x57\x22\x65\x1d\xe3\x6d\x75\x3f\x72\x3f\x75\x5e\xf4\x71\xd8\xca\x58\xd5\xad\xec\x24\xec\x45\xcf\x28\x01\xcd\xa8\xd7\x45\x4c\x4b\x36\xe2\xc5\xdc\x87\xaf\x9f\x6a\xe0\x90\x9a\xbb\x7d\xdc\xda\x63\x17\xa2\xd5\x6d\x1d\x8c\x79\xc9\x45\xcb\xcb\xb8\xdd\xd0\xb3\x37\x9d\x94\x66\x7c\x74\x1f\x97\x4c\x0d\x49\x10\x9a\xdb\x2c\xe4\x7c\x48\xb6\xa1\x91\x3f\x5b\x78\xa4\xc7\xa2\x1b\xef\x0f\xdb\xd8\xd6\xcb\xfb\x6d\x77\x6b\xd7\xfe\xc6\x7c\xf5\xd6\x7a\x04\x96\xe5\x28\x8a\xd4\x96\xb6\xd5\x54\x4c\xf2\xf2\x89\xe4\x9d\x43\x5e\x4c\x28\xf2\x4e\xc8\x2a\xaf\x09\x6f\xcc\x2f\x24\x27\x13\xcc\xd0\x2c\xe6\xb7\x67\x89\x4f\x53\x90\x5d\xa3\xbf\x49\xa8\xbc\x1b\x5c\x0e\x38\xcf\x2e\xe5\x08\x2e\x91\x67\x5c\xe6\xb3\xc9\x80\x15\x97\xb8\x70\x97\x0a\xc5\x51\x14\x9d\x74\x2e\x9d\x39\x42\x66\x5d\x05\x50\xee\x07\x09\xd0\xa7\xcb\xe8\x8b\xec\xe8\xaa\xed\xa0\xa1\xf3\xda\x19\xc8\x0e\x8d\xc7\xb0\x7d\xd8\x39\x2b\xe6\xde\xa6\xc2\x74\xda\x50\x92\xad\xce\xa8\x05\x9d\x30\x48\xa9\x4f\xcb\x59\xc1\x22\x90\x55\x10\x22\xec\x4e\x3c\x3a\x80\xe6\x15\x5e\xe2\x99\x28\xf9\xc4\xdd\xa5\x1a\xa8\x88\xa0\x60\xb7\x2d\xad\x6a\xb1\x84\x5b\xe9\xe7\x34\x3f\xbb\x66\x1f\x35\x6c\xa3\xf0\x2e\xe2\x05\xf9\xf0\x7e\xd7\xa3\xbe\x71\xc1\x86\x1e\x95\xcb\x07\x0e\x4d\xa8\x42\x61\xf2\x9f\x3d\x28\xcd\x6c\x38\xc7\x9e\x75\x63\xd2\x24\xa9\x63\x75\xa6\xbf\x28\x7b\x17\x7c\x7d\xac\x3f\x3e\xf1\x4e\x11\x1d\x72\xa3\x1a\xdf\xc3\xab\xba\x13\xa6\xe2\xbe\xdb\x24\x2d\x9c\x83\x14\x02\x3c\x28\xf2\x7f\xf7\x1c\x38\xce\xed\xf3\xc3\xfb\xdd\x4e\x75\x84\x86\x11\xe7\xec\x82\xa0\x2e\xa0\x06\xae\xb5\xf3\x79\xca\xe2\x92\x25\x84\x3a\x98\xa3\x39\x20\x6f\xc8\x0b\xd2\x22\x8f\x0d\x46\xd0\x83\x24\x97\xcf\x6a\x80\x3c\x5c\x55\xde\xfa\x47\xaa\xdd\x73\xde\x6f\x67\xbb\x86\x76\x6b\x14\x45\xba\xad\xbf\x55\xff\x03\xea\x42\xe4\x34\x53\x47\xab\xce\x88\xbc\xb7\xbf\xf7\xf7\x77\xfb\x1f\x0e\xa5\x68\xf4\xea\x15\xcd\x79\x3e\x9f\xf0\x99\xf8\xfe\xfb\x16\x78\xcd\xf5\x7a\x64\x17\x72\xd6\xd3\xbc\xbc\x87\x7f\xff\xc4\xd8\x14\xc5\xe4\x2c\x85\xbb\x3d\x11\xf3\x3c\xc6\xed\x60\xd3\xce\x13\xa8\x95\x81\xd5\x1a\x3e\x45\xbd\x21\x05\x09\xfb\x63\x5a\x8e\x8f\xa4\x50\x98\xe6\xa3\xc3\x71\x3a\x11\xd1\xaf\x50\x72\x9a\xd4\x05\x57\xa5\x58\x21\xc8\x15\x74\x5c\x89\xb1\x37\xca\x36\x50\xaf\x8f\x15\xed\x16\x34\x69\x75\xb0\x86\x8b\xe4\x1f\x8b\x9b\xcb\x16\x8c\xe6\xfa\x03\x89\xbf\xc5\x1f\xd8\xc3\x1b\xbf\x40\x8e\xb4\xf8\x1b\x6c\xa3\xbf\x40\x56\xb6\xf8\x0b\x65\x95\x50\x5f\x20\x99\x2d\xfe\x42\x6d\x00\xfd\x85\x72\xef\x5b\xf8\x85\x32\x6f\x76\xb1\xaa\x0e\xcd\x0d\x66\xb7\xf2\xb9\xdb\x52\xc1\x04\xcc\xee\x0f\x4d\x23\xfc\xd3\x69\x88\xcd\x54\x91\x17\xdd\x4c\x5d\x00\x02\xf0\x2c\xc3\xd6\x6d\xb5\xab\x5f\x0d\x66\xce\x13\x13\x4e\xb4\xc7\x93\x2a\x24\xc4\x96\x85\xb3\xaf\xfe\xae\xc1\x81\x03\xc3\x8c\x2c\x9f\x4d\xc2\x2d\xe4\x53\xdd\xea\x43\x9e\xf2\xbc\xd6\x4c\x8c\xa9\x6d\x72\x28\xff\xa8\xe3\xe1\x33\xb5\xab\x7c\x08\x77\xe4\x50\xc3\xab\x0d\x4f\xbe\x4b\xf3\x0c\xee\x0e\x4a\x19\x90\x0a\x32\xe5\xd9\x7c\x98\x66\x99\x2d\x45\x85\x62\x80\x64\x3c\x31\xcf\xc5\x6c\xc2\x0a\xc8\x42\x00\x45\x5b\xd2\x82\xf0\x8b\x1c\x61\xe9\x80\x50\x55\xa1\x82\x15\xd1\x84\xff\x23\xcd\x32\x1a\xf1\x62\xd4\x63\xf9\xea\x87\xc3\x5e\xc2\x63\xd1\xfb\xc8\x06\xbd\xff\xa4\xe7\x14\xa3\x5c\x7b\xef\xd9\x90\x15\x2c\x8f\x59\xef\x6f\x70\x31\x3b\xc5\xc1\x88\x1e\xfe\xdb\x53\x47\x5a\x0f\xc6\x5d\xd7\x00\xbb\xa9\x79\x7d\xc1\x3d\x15\xed\xcf\x5d\x62\xdc\x07\x7b\x3d\x9b\x90\xb8\x92\x83\x58\x72\xff\xcf\x20\x2d\xcf\xbd\x22\x56\x87\x25\x9b\x0a\xb2\xb6\xfa\xbc\x4b\x5e\xae\xae\x3d\xa9\xbe\x78\x11\x0d\x56\x5f\x44\xac\x4f\x1e\x3f\x91\x47\xc6\xea\x13\x5f\xbc\xfe\x0c\x67\x05\x64\x8d\x5b\x23\x3d\x82\x1d\xc8\x5f\xf3\x60\x88\x9c\x02\x4b\x5e\x44\xb4\x4f\xf6\xe8\x1e\xd9\xdc\x94\xff\x84\x60\x7e\x96\x27\xd3\x1c\x7e\xce\x5d\xd1\xdd\xc1\x10\xcb\x1b\x10\xe4\x2e\xff\x47\x90\x89\xe4\x69\x02\xa7\xcf\x6a\x96\x9e\x19\x7b\xbc\x3c\x5b\x06\x34\x3e\x83\x62\x7a\xf0\x79\x99\x0e\x52\x4c\xe0\x2c\xc8\x94\x71\xa8\x2b\x46\xe7\x24\x36\x85\x81\x2c\x07\x45\xc5\x46\x36\x07\xa1\x26\xcd\xa5\x7c\x56\x6a\x7a\x99\x95\xd3\x59\x19\x91\x1f\xf9\x05\x83\xca\x37\x17\x8c\x24\x26\x0e\xba\x60\xea\x9c\xc0\x11\x49\xd9\x73\x2e\x25\xbd\x48\x8e\x15\x9b\xf9\xe0\x44\x49\xe3\x33\xd9\xea\x82\xce\xbb\xd0\x1d\xca\x3b\x58\x82\x67\xa2\xc8\x1c\x94\xe9\xe3\x74\x00\x6c\x29\x9b\x13\xf6\x79\xca\x72\x91\x9e\x33\xb9\xf4\xe5\x98\xcd\x41\x3e\xc4\xcd\x23\x6f\x26\x9c\xf0\x61\xc9\xf2\x2e\x11\x33\x29\x99\x09\x72\x31\xa6\xa5\x22\x73\x3a\x95\xdf\x42\xcd\x36\x53\x0e\xa7\x03\xe8\xa2\xf9\x1c\x25\xca\x01\xde\xec\xa1\xce\x5a\xce\x50\x9a\x06\x9f\x61\x96\x44\xf5\x0b\xa6\x46\x1b\x4a\x00\xaa\xe0\x8b\x97\xd1\x47\x3d\x93\x17\x4b\xfc\xb5\x61\xdf\x21\x02\x36\x49\xab\xa5\xb3\xfa\xf4\x7a\xe4\x1d\x3d\x63\xe4\x93\x23\x7e\x00\xec\x4f\x44\x94\x72\x6b\x83\x9d\x45\x0e\x18\x89\x4a\x5e\x3a\x00\xd9\x72\x6c\xde\x60\xbc\x14\x74\x95\x27\x7e\xd5\x5b\x25\x10\x8e\x69\x0a\x74\xe7\xf2\x5f\x25\x6c\x32\xd7\x07\xec\x06\xe5\x63\xb4\x28\x37\xa1\xf9\x8c\x66\x7a\x78\x50\x34\x97\xc6\x63\x66\x2a\x29\x84\xdb\x7d\x44\x0d\xd7\x1b\x3e\x03\x6d\xd8\x13\xbb\x5b\xdc\xc1\xcb\x91\xc2\x3a\x3a\x97\x25\xb2\x58\xda\xc4\x12\x6f\xf2\x73\x6c\xf2\x76\x96\x65\xf8\x5c\x80\xde\xcb\x0e\xde\xfb\x8c\x6c\x56\xfe\xbe\xbc\xb4\x92\x90\x9e\x86\x0b\x4f\x09\xae\xe6\xcf\xcb\x4b\x33\xa2\x0d\xb7\xc2\x1d\xf6\x0a\x38\x0c\xa9\xe1\x5c\x1b\x05\x86\xc8\x34\xe8\xc7\xf4\xff\x7a\x3d\xb2\xc7\x2e\xc8\x80\x8d\xe9\x79\xca\x0b\x2c\xb1\x26\x69\x66\x26\xe4\x01\xc0\x87\xe4\x93\x1c\xc7\xaa\x24\x05\xf1\x89\x4c\x69\x7c\x46\x47\xcc\x01\x60\x94\x90\xed\x15\x57\x0c\x35\x65\xe2\x1c\x11\x57\x2e\xa6\xdc\xb0\x96\x7f\x28\x9a\x91\x0c\xc0\xb0\x12\xe5\x19\xad\xaa\x0a\xda\x32\xba\xa1\x71\x44\x5a\x04\xb6\x9d\x7c\x10\x8c\x7c\xb2\x37\x32\x5f\xed\xd8\xee\x7c\x92\x07\x9e\x64\x65\xc0\x36\x02\xdf\xbf\x67\x34\xc1\x4b\x27\x2d\xe1\xac\xeb\xf7\x7a\xc3\x41\x34\x61\xbd\x99\x60\xab\x00\x6e\xd5\x8e\xa4\xb5\x52\x95\xae\x89\xc3\xf2\x97\xde\x02\xce\x0d\x44\x1e\xbe\x3c\x53\xf7\x0f\x63\xe3\x69\xd5\x56\x6d\x3f\x4b\xec\xaa\xc9\x05\x53\xac\x1a\xcb\x92\xe1\xf5\xcd\xcc\xdb\xf9\x14\x74\xb1\x72\x47\xfd\x04\xce\x40\x3e\x95\x3e\x26\xad\xbe\x7b\xd1\xd8\x70\x17\x7a\x48\xfc\x25\xbe\xd7\xb0\x55\x8f\x35\xf8\x13\x75\x6f\x72\x87\xbd\x05\xb2\x86\x98\xd2\xc9\x44\x97\x4f\xd3\x33\x1e\xb0\x98\xca\xb3\xc1\xf0\x69\xe0\xcd\xe8\x26\x0f\x68\x82\x93\x8e\x7d\x8e\xd9\x14\x8f\xad\x2c\x1d\x10\x3a\x2b\xc7\xbc\x10\x5e\x37\x0b\x58\xc3\x2b\xf2\xd4\x5d\x31\x0f\xa9\x44\xeb\xc9\xfd\x69\x06\x69\x99\x90\xd6\xdf\x55\x35\x3d\xec\x2d\xc3\x03\x52\xce\x89\x56\xb1\xef\xde\xc3\xab\xf4\x46\xac\xe2\x0e\xe6\x04\x94\xfe\x8d\xc0\x82\xec\x84\xe7\xf0\x07\xde\xf8\xe5\xce\x48\xd8\xb4\x60\x31\x9c\x5e\x01\x48\xe8\x11\x05\xb4\x5d\xf0\x0b\x6d\x82\x90\x87\x43\x42\x33\x79\x42\x2d\xb7\x87\xd4\xe4\xe4\xa1\x3f\x60\x44\x30\x86\x2b\x95\x0a\x63\x48\x48\x66\xa0\x5d\xa6\xf2\x69\x91\xac\x4e\x69\x51\xce\x9d\x6d\x1d\x00\x98\xa5\x83\x82\x16\xf3\x88\x1c\x32\x66\x44\x48\xdc\x57\x58\x88\x50\x81\x5e\x4d\x78\x5e\xae\x4a\x54\xc2\x2e\x2b\x35\x3c\x88\x18\x21\x98\x68\x44\x44\xad\xea\x6a\x78\xac\xb9\xf2\xae\x76\x23\xb6\xeb\xbf\xb1\x80\x6e\x42\xf4\xec\x66\x3e\x08\x7f\xe5\x52\x1b\xa6\xf3\xd3\xff\xbb\x5a\xa9\xfe\xba\x72\xf8\x7a\x45\x6b\x41\x02\xa5\x6b\xd1\xa3\xcf\x28\x96\x3c\xda\x0d\x83\xa8\xc3\x20\xbe\x32\xc2\x17\x49\x5a\x47\x63\x06\xb8\xd6\x47\x1e\xe8\x19\x3e\x69\x86\x60\xce\xa6\xc7\xa4\xf5\x49\x12\xe3\x84\x16\x67\x2c\x91\x62\x93\xd1\x6a\xca\xb6\xed\x96\xbc\x91\xcb\x5f\x35\xe6\xf2\xa9\x4b\x06\xb3\x92\xa4\xa5\x50\xee\xc9\xa9\x20\x9f\xe4\x18\x3f\x45\xad\x4e\x27\x8c\xad\xdf\x77\xc0\xa8\x45\x21\xed\xd6\x0d\x06\x6c\xb8\x72\x65\xd4\x76\xcc\x7a\xc4\xa6\xf0\x7c\xed\x16\x40\x1c\xcf\x6a\x10\x9b\xae\xd1\x7a\x35\xc9\x21\xb5\x5a\xc4\xf0\x0f\x1a\xdc\xc0\x5e\xf4\x46\x0b\x3d\x92\xd9\xeb\xdf\xd1\x20\xcd\x93\xb6\x1c\x9e\x76\x28\x40\x30\xd5\x6f\x1c\x45\x66\xd3\xe7\xda\x7d\xd8\x99\x52\x15\x8a\x09\x4d\xac\x88\x91\x41\x05\x02\x53\x7a\x30\xf9\x4c\x53\xae\xf9\xee\x96\xc8\xaa\x0b\x6d\xcb\x28\x0f\x9d\x66\x0a\x8f\x98\xcb\x1f\xfe\xb2\x5a\x40\xcf\x91\xde\x34\x96\xc7\x78\x68\x4a\x04\x8f\xc3\x4f\xe6\xf3\x4f\x64\x00\x7c\xd6\xd1\xc0\x77\x89\x90\x97\x1d\x39\xe1\x5e\xc1\x46\xec\xf3\xb4\x4b\xa6\x54\xa0\xba\x57\x2b\x73\x5c\x68\xb0\x40\x48\xb1\x17\x0c\x2b\xe6\x0e\x87\xac\x20\x14\x05\x1a\x79\x74\xa4\x82\xe1\x2d\x40\x5f\x31\xc8\x98\x15\x8c\x14\xb4\x1c\x83\x85\x9b\xe6\x2e\xc0\x16\x1f\xe2\x4d\xe7\x13\xf6\xf6\xa9\x15\x99\xd7\x88\x13\x80\xe8\xa2\xc5\x3c\xf0\x30\x53\xdb\x19\xf5\xbd\xbc\x9b\xc3\xea\x2e\xbd\x9f\xf5\xd0\x9c\xed\xeb\x0e\x07\xda\xb8\x46\xa8\xc6\x0d\xae\x97\x87\xb4\x3a\x16\x94\xbb\x66\xd0\xce\xdd\xea\x15\xc7\x21\xbb\xcd\xaf\xbc\x6d\xb0\xc4\x5d\xa9\x69\x6b\x54\x75\x65\xbe\x8b\xee\x02\xc8\x9e\x03\x41\x24\x6f\xa4\xca\xbc\xbc\x27\x4f\x82\xc6\xee\x6a\x5a\x37\xb0\x32\xaa\xdf\x77\xbd\x0d\x2b\x51\xfc\x28\xf7\x3a\xfd\xa1\xec\xbb\xa8\x2e\x78\x80\x7c\x4c\x3a\xa7\x66\x72\xb1\x55\x58\x1b\x68\x01\xd2\x68\xa6\x8a\x0e\x35\x7c\x29\x80\x22\x31\xa6\x39\x14\x61\x56\x1a\xcb\xa8\x55\xa3\x87\x25\xb9\x09\x38\x10\x62\x7e\x65\x1d\xef\x63\xf7\x8a\x3b\xdb\x1b\xb1\x9d\xdf\x7d\x6f\xa9\x71\x7c\xc5\xc6\xa2\x39\x22\x2d\xb4\x87\x4c\xc0\xab\xca\xe4\x9c\x92\x57\x16\x87\x3a\xf9\x11\x49\x1f\x3f\xae\x22\x06\xb9\xd8\xa6\x4b\x38\x16\x2b\x5d\x92\x2e\x49\x8c\x72\xac\xc7\x72\x06\xa9\xfc\x75\xd2\xea\x86\xef\xd5\xbe\x87\x1f\xf6\x5d\xd5\xbb\xf8\x82\x96\x5a\x0d\x68\x5a\x97\x11\x7e\x7f\x16\x12\x52\x91\xff\x6e\x1b\xf9\x26\x94\xef\xfb\xf0\xfc\x4f\x27\x7d\x5d\xa5\x1e\xa8\x4a\xcd\xf9\x8f\x3d\x4b\x02\xf6\x0f\x23\x65\x81\x69\xf7\xf7\xe5\xef\xf7\x6a\x17\x13\x67\xdf\xf8\xe3\xa8\x6d\x71\xf7\xad\xd2\x92\x79\xcf\xa2\xbc\x49\xb7\xa6\xc2\x45\xe3\x72\x46\x33\xf7\xf3\x11\x2b\xcd\x9f\xd5\x81\xfd\x51\xf4\x54\x1d\xd5\xd7\x8b\x2a\xae\xbb\x86\x27\xb6\xf8\xc0\xff\x58\x7a\xab\x58\xc0\x0c\xad\xc1\x9e\x15\x5e\xb2\x04\xff\x10\xac\x34\xb4\xd4\xb0\x9c\x0e\xed\xb5\xd1\xdf\xa0\xc2\x86\x98\xb5\xd2\x11\xbd\x1e\x92\x41\xab\xef\x1f\x52\x2e\x3a\xf5\x81\x45\xfa\x04\x54\x56\x4f\x36\x7c\xc4\x2d\x14\xb4\x36\xdc\xcb\xd8\x3f\x8d\xdb\x86\x8e\x56\x1f\xc7\x4d\xe7\x2b\xaa\x1a\xdc\xe3\xd4\xff\xee\x38\x3d\xe9\x04\x4f\x3b\xf7\xc6\xeb\x1e\x76\xce\xc0\x31\xe4\xdd\xc4\xd6\x55\xe2\xfb\x2b\x34\x50\x41\xfa\xdd\xec\x47\xbc\xc9\x9b\xf7\x88\x45\x78\x89\x9b\xf4\x66\x5b\x91\xe7\x40\x2f\xb2\x9d\x37\xb5\xc7\xa4\x65\xf7\xdd\x9d\x6d\xae\x80\x11\xfa\x4f\x51\xbd\x51\x54\xd7\x26\xfc\xaf\x97\xd5\x6f\x77\xf3\x37\x1e\x17\x4b\xe1\xe5\x9f\x2d\xaa\xe4\xda\x97\x78\x91\x98\xae\xf2\xd2\xd8\xc9\x57\xd8\x86\x95\xdd\xc7\x54\x38\xf1\xa0\x6d\x37\x57\xad\x73\xc4\x2f\x96\xe2\x21\x4f\xc1\xd2\x72\x7c\x24\xe7\x08\x9f\x5c\x23\xc3\x2f\x2f\xc5\x37\xc9\xf1\x8b\xf4\xb9\xbf\xdf\xd1\x5a\x75\x1b\x69\xd3\xda\xc5\x7d\xd1\x01\x1b\x6a\xfd\x47\x9c\xb2\x47\x10\xe7\xf5\x07\x9c\xb4\x81\x03\x2f\x30\xe7\xf0\xa9\x67\x82\x14\x54\x92\x8f\xda\x67\xc7\xa9\x77\x8f\xd1\xf6\xba\x6b\x19\x61\xc0\xaa\x54\xb3\x28\x2d\x89\xc4\x88\xec\x54\xef\xd4\x44\x8f\xc1\xba\x78\xa2\x06\xd0\x37\xc2\xb4\x0a\x16\xb3\xf4\x9c\x25\xe4\x1b\x41\xa8\x2a\x8b\x44\xbe\xa9\x98\x52\x24\x7b\xe3\xa2\x1c\xa6\x9f\xdf\xf2\xc2\x31\x67\xb4\xd5\x2c\x3b\x6e\xe3\xd4\xfc\xae\x0b\xce\x4b\xac\x59\x45\x65\x7d\xf7\x27\xd6\xad\xa8\xe1\x66\xf4\x80\x14\x11\x3b\xfc\xeb\x6b\x94\xd3\x61\x83\x7e\xd0\x8a\xb3\x9c\xb8\x75\x77\x47\x8d\x4b\x8d\x0b\xed\x25\xbf\x83\xc8\xe3\xb9\xe6\xfd\xbe\x57\xd5\x54\xc8\xce\x6a\xf7\xc2\xdf\xe7\xf8\x5e\x1a\xa7\x9e\x3a\x01\x88\x44\x8e\xf2\x8f\xbd\xd4\x55\x9d\x0c\xdb\x42\x3f\xf8\x1d\xd5\x07\xff\x83\x64\xb4\x80\x74\xf6\x35\x97\x0d\x6d\x87\x59\x46\x44\xab\xaf\x50\x9d\xad\xd9\x36\xa6\x4e\x85\xb3\x1d\x62\xff\x52\x81\xff\x8b\x79\x5e\xa6\xb9\x6b\x05\xbf\x0a\xea\x65\xe3\x3f\x4c\x9a\x33\xb2\xdc\xbf\x96\x02\x36\xec\x9d\xfb\xe7\xc6\xf9\x97\xdb\x38\x90\x9e\x8f\xe4\x0c\x61\xa1\x30\x45\xb3\x0c\x0b\x37\xa4\x39\x89\xa9\x60\x44\xf0\x09\x03\x7f\x1f\xe3\x3a\x20\x85\xac\x49\x2a\xc0\xdf\x6a\x58\xf0\x89\x85\x06\xe8\x8e\x1c\x24\xd3\x2c\x53\x99\xad\x30\xc4\x16\x22\xf9\x2b\x8b\xd2\x75\x37\x6c\x4d\x85\xa3\xf6\xb4\x02\x74\xa7\x1b\xba\x71\xcd\xbc\x6b\xd0\x8d\x17\x50\x8e\xf8\x93\xda\xc2\x4b\x5f\x47\xa3\x9a\x3f\xde\x7f\xe7\x3f\xd0\xc4\x44\x37\xc8\xaf\x2a\x1a\xa3\x1a\x1a\xd1\x2f\xa1\x45\x40\x49\x5a\x05\x06\xa6\x07\x58\x59\x04\x56\x85\xa6\x3c\xe4\x21\xa3\xae\xb3\x1e\x1e\x54\x07\x66\xd0\xfb\xe3\x7f\x06\x17\xbc\x3d\x1b\x74\xa4\x29\x4f\x55\x20\x2e\x52\x48\xc9\x51\x8d\xb9\x72\x7c\x69\xe5\x8e\xd3\x01\x2e\x7d\xef\xa1\x8a\x48\xf1\x1f\x5a\x3f\xc9\x7e\x95\x15\xb9\x0e\x5b\xd8\x58\x07\xe7\xd4\x9a\xde\x33\x23\xf1\x3f\x50\x7c\xae\xef\xa1\x7a\x19\xfb\xad\x81\x6c\x95\x22\x10\xf9\xd7\x46\xcc\x04\x89\xc7\x8f\x50\xd3\x3e\x5c\x98\x3c\x73\x09\xbb\x59\x70\xde\xce\x95\xe0\xda\x90\xee\x90\x75\x2d\x18\xd0\x1d\x00\x17\x88\xe7\x0e\x81\x53\xd9\xf0\x4a\x36\xad\x6a\x64\x9c\x71\xc9\x13\xc6\x41\x1b\x56\x5e\xad\x39\x6c\x62\xfe\xbb\x7b\x6d\x55\x9e\x59\x7f\xaf\xea\xf3\x76\xa2\x84\xe7\xac\xfa\x91\x2f\xeb\xcb\x2f\xa3\xf3\x00\x1e\x3d\x6c\x7a\xc9\xfe\xeb\x8b\x56\xfd\xab\xe6\xec\x45\xf0\x60\xd0\x78\x46\x2f\xcd\x69\xc1\xcf\xd3\x84\x11\x39\xb9\x39\x39\x3e\xeb\x9e\x9f\x90\x72\x36\xcd\x98\x70\xfd\x71\x94\x56\x39\xba\x8b\x89\x03\x67\xca\x55\xb9\x3d\x33\xf1\xea\xbc\x80\x93\xe4\x90\x6e\xba\x8e\x10\x17\x77\xd0\xe8\x78\xad\x6a\x0b\x58\x06\x77\x55\xec\x2d\xc4\xe6\xca\x02\xbc\x86\x3b\xb9\xaa\x79\x1c\xb9\xfb\x41\x65\xae\xa9\x31\x00\x07\xc8\x55\x80\x9b\xa9\xd4\xa8\x5a\x18\xe9\xd6\x39\x57\xaf\x47\xf6\x28\xd4\xc1\x54\x39\x23\x8c\x26\xce\x8a\x59\x4e\x1d\xb3\x5a\xa4\xbe\x53\x57\x6b\x45\x03\x5c\x36\xe3\x28\x42\x56\xd9\x45\xbd\x7e\x61\x88\xc7\x2d\xaf\x79\xcb\x6f\xbf\xd4\x48\xde\xba\xf9\x1a\x73\x9e\xaf\x8a\x29\x8b\xe1\x24\xcb\x20\x0b\x89\xce\x86\x79\x31\x4e\xe3\x31\xc8\x4a\x3a\xca\x4c\xc5\xc3\xb8\x7a\xb3\xc6\x6c\x1b\xd3\x50\x58\xad\xae\x49\x72\xdd\x28\xab\x0b\x79\xa5\x42\x4c\x77\x7e\x9b\xa5\xe7\x34\x63\x79\x09\xa6\x52\x1c\xc3\x27\xf4\x94\x4b\xcb\x31\x46\x96\xd3\x8c\x8c\x69\x9e\x80\x13\x37\xc4\xf9\x80\x7e\x8d\xe6\x09\x41\xef\xbb\xa8\x92\x2e\x22\x20\x2c\x3b\x89\x22\x1c\xc1\xba\x7a\xd0\xd9\x5c\x0e\xd7\x9f\x22\x6a\x46\x2a\x02\xd5\xbd\xa2\xf8\x27\x85\x83\xac\xf7\x6c\xb4\xf3\x79\xea\x45\xb8\xed\x67\x09\xb9\x60\x83\xb3\xb4\x14\xa4\x4d\x4b\x92\x31\x2a\x4a\x32\xcb\xcb\x34\xd3\xa5\x1e\xc9\xb3\xe8\x89\xc9\xf7\xeb\x2c\x49\xdd\x35\x10\x1c\x03\x55\x82\x4b\xf0\x59\xc7\xe9\x51\xd5\x71\x44\x3e\xb2\x56\xf6\xff\xd9\xfb\xf7\xf7\x26\x72\xa4\x51\x1c\xff\x79\xf2\x57\x88\xec\x2c\xb6\xc1\x97\x38\x37\x20\xd9\x2c\xc3\x84\xb0\xcb\x3b\x03\xe1\x21\xcc\xcc\x77\x4e\x26\x07\xda\x6e\x39\x6e\xd2\xee\xf6\xdb\x6a\x27\x64\x20\xdf\xbf\xfd\xf3\xa8\x4a\x97\x92\x5a\x6d\x3b\x24\xb0\xec\x79\x66\xce\x7b\x96\xb8\x55\x92\x4a\xa5\x92\x54\x2a\xd5\x25\x65\x19\x38\xed\x27\x7f\x72\xb4\x1d\x07\x3b\x43\x91\xa3\x97\x54\x6f\x90\x46\x3d\x22\x30\x47\x42\x70\x61\x2d\xc8\xbb\x24\xa8\x09\xa1\x81\xea\xd4\x27\xc2\xdc\x95\x59\xa5\xa4\x49\x22\xc8\xfc\xdb\x9e\xae\x4f\x39\x07\x2c\xef\x81\x2d\xb8\x40\x33\x4a\xb4\x49\x87\xad\xf9\x1d\xe1\x82\x77\x5d\x76\x98\xa5\x97\x10\x7d\x00\xc8\xe2\x98\x59\xc2\xfe\xdd\xeb\x81\xf9\xfb\xbb\x7a\xf3\xd7\x77\x55\x1e\x0b\x19\x54\xd2\xf4\x3d\xbe\xe3\xfa\x9e\xeb\x38\xa2\x3d\x89\x5c\x79\xa2\x4a\x15\xe7\x35\x94\xd2\xe6\x1a\x97\xc4\xea\x46\x57\xb9\x22\xd6\x32\xed\x53\xe2\x3a\x46\xf1\x92\xb2\x65\xc3\x33\xa2\x5e\x9a\xf3\x6d\x33\xb8\x82\x1b\xbe\xea\x79\xc1\xe4\xeb\xd0\x3c\xc6\x27\x1f\x98\x17\xdc\x67\x41\x4b\x8e\x77\x99\xc8\xf8\x45\x44\x83\x7c\x56\xe2\xfb\x06\x5e\x96\xe4\xec\xa8\x99\x27\x61\x17\xda\x6c\xd5\x4c\xd0\x2a\xcb\x0b\xb6\xaa\x6f\xbb\xb0\xca\x57\x7d\x1e\x08\xaa\xe4\xcf\xfd\x0d\xa7\x0c\x5a\xe1\xd2\x20\xdf\x54\xf0\xf6\x85\x6d\xdc\x5f\x76\xe6\x0b\xbe\x66\x33\x42\xab\xf9\x52\x91\x8b\xd5\xca\xd6\xf8\x15\xe6\xd0\xfd\xa4\xe6\x23\xd0\x74\xa5\xe5\xba\xd3\xda\xc2\x5c\x05\xa6\x6c\x98\x46\x42\x40\xc4\x09\x0c\xba\xa5\x1f\x83\xdb\x92\x7b\xa2\xec\xd2\x5f\x68\xae\x55\x50\x65\x99\xd9\xbb\x41\x97\xa4\xbd\x82\x98\xed\xc1\x92\x6e\xe6\x28\x64\x14\xca\x9e\x99\x52\x85\xff\xc2\xcd\x18\x8e\xf4\xa2\x8d\x54\x42\x6a\xb9\x1f\x76\xab\x35\x28\xb0\x5b\x04\x26\xda\x0a\x13\xbf\x04\x63\xf6\xd5\x46\x61\xbb\x42\x49\x7f\x5e\x58\xb7\xe6\x46\xab\xd5\xaa\x44\x89\xbb\x59\x5c\x5e\x3f\x4a\xdc\x5f\x61\xdf\xfc\xb0\x6f\xd7\x8e\xd3\x36\x27\xf0\x1a\xb2\xb2\x0d\x91\x39\x4e\x26\xb7\xe4\x84\x41\xbc\x5a\xf7\x16\x7a\xb5\xc2\x1d\x4a\xce\x11\x7a\x38\x8b\x68\xc4\xd9\xc5\x98\x67\xe0\x7c\x27\xcf\xdd\x22\x9f\x28\xf7\x3b\x67\xe5\x39\x22\x83\xef\xb1\xea\xbc\xc6\x7e\x61\x2f\x55\xf0\x4f\xad\x77\x4f\xad\xf5\x4e\xfd\x2c\xbf\x54\x9b\xe8\x4d\xce\x97\xeb\xcc\x23\xbf\xec\x7a\x7b\xe0\x91\x9c\x55\xcf\xd7\x40\xc3\x41\x33\x5f\x22\x58\x0b\x7d\x8a\x5d\x3a\x56\x8b\xc4\x8a\x06\x63\xb1\xbf\x31\xd6\x8a\xfd\xad\x23\xa9\xd8\x2f\x5a\x97\x68\xbf\xe8\x48\x28\xe4\x8b\x8a\x74\x82\x5f\xb0\xe7\xcc\xe9\xd7\xc4\x2d\x51\x74\xf3\xc2\x94\x58\x40\x1a\x90\xc4\x81\xc5\xf0\x23\x3e\x5e\x15\x30\x15\x5d\xa4\xfa\xed\x0d\xc4\x13\x71\xbe\xab\x00\x22\x2e\x4a\x18\x31\x44\x7d\x33\xb1\x41\x16\x9d\x25\xce\x96\x74\xab\x47\x89\x7f\x0c\xcc\x0d\x92\x6e\x37\x2b\xb5\x29\xbd\x7d\xbb\xec\x91\x10\xce\x08\x15\x6c\x70\xd5\xc6\xa9\x5d\x25\xd9\xe3\x31\x62\x6d\x6b\x77\xc5\x7b\xd9\xf9\xb1\xc8\xa3\x78\x28\x6f\x50\xcd\x24\x4b\xca\x24\x4a\x8f\x4a\x23\xbe\x42\xf2\xe6\x44\x94\x3c\xe3\x85\x30\x61\x0b\x60\xe3\x8e\x75\xa2\x1a\xf9\xeb\xad\x28\x31\xe3\x32\x6d\xc2\x8d\xb6\x20\xe7\x0c\x80\xfc\x45\x89\x75\x2b\x2a\x0a\x61\xe0\x45\x49\xc4\x69\xd3\x93\xc0\x2e\x18\x73\x12\x53\x53\x95\xb7\x41\x9c\x26\xa5\x70\x93\x4f\xa4\x3c\xab\xa6\xa6\x56\x2f\x15\x68\x64\x91\xf2\xcc\xb3\xa6\xe8\xf5\x40\xea\x32\x74\x91\x23\x13\x6c\x96\x89\xd9\x40\x0c\x8b\x64\xc0\x63\x16\xcf\x40\xc0\x36\x43\xb8\xe0\xec\xfd\x4c\x94\x4c\x9c\x25\x53\x96\x94\xe4\xfa\x60\x70\x3c\xc6\xec\xd6\x27\x27\x2d\xf6\x91\x55\xbf\x2a\x22\xec\x12\x61\x5f\x0b\x89\xa6\x5f\x7c\xf0\x89\xb2\x53\x08\x7f\x17\xdb\x6c\x96\x5c\xc3\x40\x38\xb3\xe7\xb1\x43\x66\x53\xdb\xe0\x12\xb8\x91\x99\xb1\xd6\x59\x06\xa1\x93\xb6\x8d\x09\xd6\x30\x35\x26\x72\xe0\x03\x4e\x62\xc1\x75\xd5\xab\x83\xbd\x92\x0d\x67\x45\xc1\xb3\xf2\xb9\xe4\xa9\x24\xc6\x39\xb0\x34\x30\xa5\x27\x6c\xcf\x7c\x56\x97\xb4\x98\xdd\x37\xf9\x92\xb4\x7e\x5f\x83\x13\x1a\x15\x7c\x92\x9f\xbb\x64\x90\x87\x1c\x7c\xd6\xae\xfb\x06\x63\x8d\x27\x25\x13\x99\x5e\xd6\x4c\x8c\xc3\xb2\x45\x32\x01\xec\xcc\x4d\xc8\x88\xb9\x3a\x5a\xa7\xe1\xff\x1d\xf3\x57\xdb\x30\xc8\x8e\xf9\xab\x6d\x27\x64\xc7\xfe\xd9\xa6\xfd\xef\x38\xc8\x5c\xad\x5c\x81\x40\x3b\x8e\x8a\x49\x9e\x5d\xea\x0b\x86\x12\x39\xd9\xbd\x5e\x68\xd7\x39\x36\xf1\xae\x25\xd2\x4d\x6f\x23\x08\x05\x41\xbe\x59\x16\x06\x77\x2f\x5b\xa9\xd9\xcd\x4c\x33\xde\x0e\x06\x7b\x8c\xd9\xc3\x20\xd5\x92\xce\xd9\xa1\x54\x5d\xc6\x08\xd7\x99\x01\x90\x1b\xdf\xba\x9d\xac\xd7\x25\x54\x69\x85\xe1\x37\x24\x3c\x04\x83\xcb\xa7\x4a\xe0\x78\x8a\xa4\x6b\xfa\x2d\x9b\x16\xce\xea\xf3\xfe\x6c\x6c\x38\x50\xeb\x73\x5a\x97\xe5\x06\x98\x7f\x28\x79\x16\x8b\x8d\x3a\x71\xda\x07\xdc\x9c\xd3\xb0\x6e\x4b\xd6\xd1\x74\xd4\x5c\xb3\x87\x27\xac\x1c\xd3\xee\x8a\x3d\x29\x6a\x9a\xca\x07\xef\xe5\x6e\xa5\x58\x3c\x1f\xbc\x67\x77\xef\xca\x7f\xba\x76\xfe\xd8\x63\xf8\xbe\xc3\x3e\x9a\xab\x2f\x7c\xb8\x92\x3b\xd9\x8a\x56\x49\x21\x23\x49\x39\x74\x10\x09\x0c\x0b\xac\xc3\x2a\x9c\x26\xe5\x78\x36\xe8\x0e\xf3\x49\x2f\x4a\x8a\x41\x36\xe8\x59\xc1\xb0\x03\xc8\xb2\x82\x4f\x73\x91\x48\x19\xac\x2b\x5b\x34\x41\x9a\x92\x8c\xe5\x05\x5c\x7a\x72\x56\xf0\x78\x36\xc4\xe8\x46\x28\x44\xc9\x6b\x4c\xcc\xa7\x3c\x8b\x79\x36\x4c\xd4\x8e\x09\x80\xb8\x53\xe4\x13\xce\xf8\x87\xb2\x88\x50\x2e\x07\x91\x42\xc8\xe6\x65\x13\x0a\xdf\x8b\x48\xc8\xa3\xe2\x8c\xc7\x5d\x24\x7f\x95\x1d\xeb\x19\xb5\x01\xc8\x83\x98\xbb\xc3\xfe\x98\xad\xaf\xad\xfd\xd8\xa0\x34\x37\x13\x61\xb4\x50\xc2\xbb\x94\x3c\xcf\x88\x8d\xaf\x9a\x84\xe6\x5a\xdb\x32\x81\x9e\xd6\x96\x79\xa2\x57\xcd\x00\x94\xc7\xe8\x2e\xb0\x87\x2f\x49\x9a\x8c\x37\x25\xaa\xab\x99\x65\x67\x59\x8e\xc6\xd1\x90\x0c\x57\x36\x0e\xdc\x6d\x9b\xc4\x3a\xdd\x51\x92\x96\xbc\x68\xba\x6d\x55\x14\x0b\x77\x0c\xa6\xbe\xd9\x35\x80\xab\xeb\x0f\x51\xd3\x51\x04\x48\x72\xee\x4a\xc3\xf2\x78\xb2\x16\x01\x21\x5a\x42\xd0\x18\x3d\x20\x15\x0a\x18\xae\xc8\xf8\xc0\xee\x74\xf4\x3e\x4f\xb2\x66\xa3\x8d\xee\x4b\x8d\x2e\x7b\x95\xf2\x08\xa2\x81\x01\x03\x49\x36\xa1\xed\x60\x8c\x7a\x63\xbb\xef\x68\x4b\xf4\x4b\xf5\x15\x24\xfd\xa9\xec\xbd\x5f\x20\xcf\xcc\xd6\xe7\xe4\x99\x91\x73\x5a\x3d\x1a\xb6\x6e\x27\xbb\xcc\x7a\xb7\xbf\xe9\x48\x6f\x87\x2d\x95\xb9\x6a\x7e\x22\xac\x0d\x9d\x1c\x61\xce\xae\x0b\xd9\xd6\x82\x84\x58\xdf\xec\xb7\x9a\x0d\x59\x95\xe6\x05\x6f\x3a\x4b\x8a\x26\xc9\x15\x24\x2f\xa4\xce\x9c\x00\x9f\x35\x9a\x26\x6d\xff\xd5\xee\x4a\x28\x9b\xc0\xd6\xcd\x12\xd3\x7c\x46\xea\x8a\xad\xf5\xe5\x52\x57\x6c\xdd\x2c\xa9\x46\x98\xba\x0f\x5b\xbb\xe1\xcc\x4f\xdb\xdb\x35\x25\xeb\x9b\x1b\x35\x25\x9b\x5b\xb5\x25\x90\xfd\x26\x5c\x52\x5f\x67\xeb\x3a\x4b\xe0\x45\x34\x0d\x4c\xe6\xcd\xb2\x7d\x78\x52\x11\xda\x11\x14\x79\x6d\x6e\x83\xcd\x2d\x9d\x09\x44\xdb\xa9\xd4\x21\x6c\x12\x15\xbc\x78\xf2\x4a\x1e\x35\x2f\xa2\x69\x43\x25\xa2\xdd\xe8\xf6\xd9\x8b\x68\xaa\x96\x9a\x58\x8e\x02\x9b\x5b\xdb\xad\xe6\x8b\x27\xaf\xe8\x1a\x39\xe5\x65\x78\x99\xbc\x88\xa6\x4d\x22\x16\x9c\xf2\x52\xe5\xe9\x0c\xe4\x2a\x5d\x63\x8f\xed\xe7\xe3\xb5\x13\x27\x15\xcc\x2e\x2c\x22\x93\x5e\x59\xa2\xde\xdd\xe8\x6e\xcb\x0e\xec\xc3\x71\x57\xb6\xaf\x12\x71\x9f\xf2\x72\xc7\xb9\x70\xd2\x4c\xdc\xae\xb9\x80\x24\xb3\xac\x7a\x20\xbf\x18\xbb\x1f\x85\xe8\x8b\x27\xaf\x5a\x60\xda\xd4\x72\x2e\x16\x58\xfb\xee\x5d\xfc\xa3\x7b\xbe\x4b\xf2\x6d\x2b\xe4\x1e\x79\xc8\x09\xc4\x41\xa7\x27\xd5\xa9\x8f\xe8\x25\x37\x90\xfe\x54\x6b\xab\x10\xcb\x98\x8f\x6a\x11\x04\x2d\xa3\x24\xe2\x1a\xdb\xf1\xf3\xa0\x5e\x49\xda\x61\x1b\xb5\x89\x31\xb7\x6e\x96\xcd\x25\xc0\xc1\xf1\xab\x3a\xd1\x77\xdd\x64\x23\xc4\xfb\x46\x6d\x06\x8f\x87\x8a\x79\x0b\x8e\x9c\xf0\x24\x4d\x6b\x53\x1c\x6a\x3d\xf2\xb0\xfc\x50\x9f\xd1\x49\x67\xd0\xd2\xce\xe3\xb5\xcb\x46\x27\xd1\x1a\xe5\xc5\xe1\xa8\x0e\xbf\x75\x0d\xf5\x7d\x52\xf2\x02\xb3\xce\xd7\xa6\xf0\xd4\xea\x6b\x65\xda\x12\x1e\x84\x5e\xd6\xf2\x12\x88\x09\xf9\x6b\xd7\xa1\x5e\xd8\x4f\x0f\x8e\xf6\x5f\x3f\x7f\xf5\xe6\xf0\x75\x5d\xfa\xd0\x0d\xdd\xf5\x28\x12\x25\xc6\xc7\x0b\xe7\xe0\x5b\x6b\x75\x15\xc8\x35\x37\x97\xa3\xe7\xff\xe7\x80\xed\x39\xa8\x3c\x66\x8d\xb7\xa2\xc1\x76\x58\x43\x24\x7f\xf2\x86\x4d\xef\x78\xa0\x56\x1e\xc9\xd5\x35\x8e\x30\x8b\x67\x4b\x2f\x70\x89\x05\xbc\xa8\x69\x15\x13\xb8\xf5\xec\xe9\x01\x98\x84\x9e\x66\x25\xef\xaa\x04\x66\x08\x08\xaa\x89\x67\x8d\x96\xd5\x7b\x44\x65\xf7\x6d\x72\x0c\xa5\x27\x4a\xe3\x3b\x2a\xf2\x3f\xb9\xf6\x0d\xd4\x9d\x81\xba\x47\xef\x0d\x58\x6d\xb4\xab\xba\x30\x7b\x06\x2e\xfa\x8c\x2a\x47\xf0\xd3\x19\xdb\xdb\xc3\x71\xd0\x7d\x62\xb7\x26\xcd\xa4\x52\xfe\x9e\xf2\x72\xdf\xbe\x8c\xd1\xf4\xf4\x17\x45\x34\x9d\xca\xeb\xcb\xcb\x27\x2f\x0e\xda\xec\xf9\xd1\x5b\xd8\x78\x9f\x3c\x7d\x7a\xf0\x9a\xee\x65\xfb\x6c\x8f\x29\xd8\xa6\x4f\xd5\xc4\xcb\xf5\xc1\x08\xf3\x2b\x90\x7d\xdd\x41\xe3\x6d\x62\x1d\x4a\x71\xf0\x52\xd8\x92\x85\xbb\xfa\x91\x12\xe2\x31\xd9\xb4\x1a\x72\x6b\x73\x2a\x24\x6c\x4f\x67\x96\x82\x07\x79\x48\x15\x03\x74\x77\xc0\x46\xce\xfd\x5c\xb5\x3b\x4a\x0a\x51\x22\xcd\x1c\xe0\x34\x04\x9c\x46\x01\xd8\x63\xc9\x88\x27\xe8\x17\x45\x10\x96\x1c\x48\x34\x6d\x26\x41\xcc\x1d\xd2\x6e\x0b\x97\xba\x29\xb4\xf4\x86\x86\x81\xe8\x27\xf8\xc3\xbb\x77\x90\xcd\xa9\xb9\x4f\x33\xc0\x11\x35\xa1\x3a\x14\xfa\xde\xa1\x30\x4c\x79\x54\x34\x5b\x0e\xdc\x3a\xe4\x87\x3f\xe2\x65\x2d\x1c\xfc\x22\x8c\xa2\x4a\x89\x79\x80\xb1\xaf\x86\x87\xfd\x3d\xe6\x1d\x1a\x72\x46\x5b\x10\x81\x2b\x32\x6c\x9e\xb4\xd9\x35\xf9\x1e\xff\xc3\x8f\x45\x20\x86\xa0\x5d\x17\xd3\x96\x02\x9b\x9a\x56\xa6\xdd\xcc\x57\x92\xe9\xff\x62\x9e\xf2\x92\x03\x76\xc7\x08\x4c\x3d\xd2\xac\xd5\x9c\xe5\xa4\x10\x9b\x38\x60\x84\x2f\xb4\xa5\x44\xbb\x32\x39\x1b\xde\xe4\x20\x1e\x5a\xa2\x70\x27\x68\xd3\x9b\x20\x05\x6b\xce\x76\xf9\x5f\x03\x3f\x36\x76\xdc\x04\xe7\xbe\x91\xfb\x9c\x29\x72\xa3\x7e\xe8\x69\x30\xb2\x8a\xdd\x37\x3d\x73\xe9\xaa\x91\xa3\xac\x9f\xf1\x0f\xa5\x9d\x45\xdf\x6e\x75\x5a\xf0\x73\x3b\x3b\x81\xf9\xd0\x9b\x68\x75\x4a\x16\x31\x81\x6c\xba\x05\x1d\xc0\xa4\x4b\x3c\x7c\x10\xf9\xad\x05\x25\xc0\x23\x12\xd6\x07\x31\xd3\xad\x90\x6c\x11\x06\x08\x35\x69\x98\xc2\x83\x4f\x03\xed\x5b\x1e\xe9\x74\x08\xab\x19\x35\xc4\x1d\xb3\x91\x07\x78\x67\x1d\x44\x51\x97\x1f\x46\x79\x71\x10\x0d\xc7\xcd\xa1\xb2\x2d\x1c\x65\x6d\x78\x4d\x7c\x52\x9c\x52\x2e\x6d\x55\x98\x70\xcb\x63\xc2\x6b\x36\xa4\xc0\x09\xcb\x55\x1b\x60\xbd\x7b\xac\xad\xd9\xce\xb4\xc0\xee\xf5\x5c\xce\x5c\xc4\x8e\x92\xee\xc3\xf2\x83\x83\x59\x40\xae\xef\x3b\x72\x7d\xdf\x91\xeb\xdb\x6c\x23\xc4\xe3\xf6\x93\xb2\x07\x76\x36\x20\xf6\x58\xb3\x30\xdb\xc1\x18\xe2\x6f\x47\x2e\xb3\x8f\xd4\xb6\x73\xae\xb6\xb4\xee\x19\xd2\xcc\xb1\xd5\x86\xa7\x80\x73\x5e\x94\xac\xcc\x51\xe9\x0f\x07\xca\x87\x44\x40\xf4\x75\x7a\xb2\x54\x30\x31\x82\x7f\xd1\xf2\x36\xc7\x69\xc0\x17\xa1\xba\xd3\x3c\xf0\x26\x79\x1c\x89\xf0\x36\xf3\xc0\x63\x2b\x09\xe8\xec\x31\xe3\x48\x90\xb9\xd6\xed\x54\x0d\xc5\xee\xdc\xa9\xbb\xe1\xa8\xb3\x80\xee\x22\x57\x15\xb5\x1a\x11\xec\x5a\x2c\x7e\xe5\x1e\x73\x28\xe0\xd9\xe3\xce\xbd\x7b\x35\x03\xd8\x84\x50\xc0\xe5\x17\x46\x41\x55\xdb\x37\xd7\xac\x98\x26\xd6\x21\x02\xa4\x77\x7b\x5a\x6a\xd7\xd4\x9b\x5f\x1b\xc5\x14\xfc\x08\x51\x27\xa3\xec\x94\x87\x38\x22\xb0\xc7\x2a\x86\xc3\x7d\x5c\xef\x80\xb2\x11\xbc\xdf\x64\xfc\x82\xd4\xf7\xcc\xbd\xed\xb6\xa4\x71\x25\xa1\x27\x76\x42\xb2\xaf\xba\xc4\xb5\x65\x0f\xff\xe8\x38\xe2\x15\x63\x67\xea\xfa\x57\xf3\x1f\x56\x39\xe3\x96\xb9\xcf\x77\x10\xe9\x9a\x2a\x58\x01\x20\x4c\x95\xe9\x8e\x3e\x2f\x14\xf2\xed\x40\x15\x09\x91\xe4\x33\xe1\xad\xa5\xcc\xd9\x00\x6a\xba\x83\xb3\xca\xad\x27\x25\x9e\x48\xd2\x6d\x1e\x9a\xa8\x72\x8d\x35\x17\x51\x27\xbf\x3b\xea\xb8\xa0\xe7\x86\xb3\xdd\x04\x8e\x2a\xa7\xdc\x1e\x12\x36\x02\x72\xaf\xc7\xa2\x38\xc6\x94\x84\x76\x12\x02\x37\x11\xf7\x0a\xe2\x36\x7d\x45\xef\x29\x86\xc7\x35\xc3\xee\x98\xbf\xda\xa8\x34\x38\x82\x8b\x3c\xe5\xff\x7d\xf7\x8a\x40\xcc\xf6\x25\x72\xa0\x44\x6d\x33\x74\x8a\x90\x7f\x28\xaf\x93\x36\x3b\xb6\x39\x1d\x4f\x74\x0d\xb5\x45\x6d\xb6\xf5\x5f\x0f\xcd\x5f\xfd\xbe\xfd\x73\xbd\xad\xf7\xa8\x2d\xf3\xd7\x43\xf3\x57\x7f\xcd\xfe\xd9\x87\x96\xc9\x0d\xd9\xa2\x4b\x73\xfb\x4b\x34\x24\x43\x9c\x25\x59\x4c\x1f\x93\xe5\xfe\xee\xc8\x47\x16\x14\x0f\x25\x89\x74\x19\x15\xa7\xbc\x74\xea\x9c\xb1\x3d\x68\x6b\xb7\x8e\x5b\x64\xa1\x53\xa3\x7a\xcd\xf0\x6a\x68\x86\xc6\x49\xab\x6a\x89\x99\x2b\xd1\xc9\x56\xa9\x4b\xaa\xec\xd0\xac\x98\x33\x5a\xe2\x0a\xde\x29\x61\xae\x65\x8f\xa8\xeb\x1e\x4f\xbd\x9e\xe4\xaa\xea\x32\x23\x0b\xa5\x04\x2b\xd0\x66\x75\x77\x0a\x9d\xc2\x50\x41\x2e\x2e\x2f\x10\x70\x5e\xb0\x51\x92\x25\x82\x64\xe6\x54\xef\xe9\x76\x4d\xe1\xfc\x06\x24\x77\xa3\xfc\xe2\xd3\x66\x3f\xe4\xde\x4a\x00\xd8\xe0\x92\xce\xa8\x1c\x07\xd2\x7b\x8f\xa1\x52\xbf\xe5\x34\xb7\x66\x44\x03\xc7\x11\xd8\x54\xc1\xb5\x52\x57\xe9\xdc\x0f\xe0\xa5\x8b\x8f\x8d\xbc\xa1\x00\x75\xf0\xbd\x2b\xbd\x36\xd9\x63\xd6\x50\xeb\x0f\x94\x23\xaa\xa3\x36\xbb\x63\xae\x9b\x24\xf2\xb4\x5a\xc1\xc7\x3f\xfc\x20\x50\x1b\x74\xa2\x56\xe0\x7a\x57\x2f\xc0\xf5\xee\x3a\x80\x5a\x8d\x51\xd3\x08\x6b\x57\x21\xc3\xa4\xad\xdb\xcc\x62\x8c\x4a\x1d\xcc\x48\x5b\xa3\x7c\xda\xd6\x7a\xb9\xbc\xa8\x55\x24\xe9\xa7\x9b\x79\x2a\xc3\x6b\x6b\xbb\x8e\x5e\x1d\xec\x3f\x3f\xa8\x05\x5b\x6b\x35\x1b\x8a\xaa\x8d\xb9\x46\xa2\xac\xf9\xd3\xc1\xef\xd6\x08\x6a\xdf\x7a\xbe\xc8\x21\x1d\xff\x74\xf0\x3b\xc4\xb5\x27\xbe\x25\x8f\x49\xc9\x8e\x22\x0f\xfc\xd2\x6a\x2a\x3a\x8a\xbb\x77\xd9\xbe\xfc\x9f\x3b\xfb\xc7\x0a\xe3\x13\x29\x63\x75\x47\x72\x9f\x54\x5f\xb4\x70\x35\xcc\xb3\x51\x72\x3a\x03\x05\x05\x3e\xdf\xa0\x70\x59\x15\xb9\xec\x91\x92\x08\x34\x15\xba\x0a\x67\xf1\xde\xba\x4d\x73\xe5\x6b\xb0\xc3\x12\xa9\xbf\x21\x1f\x0e\x07\x1d\x45\x9d\xbe\x52\xeb\x35\x93\xb4\x4e\x51\xba\xdd\x57\x40\xe3\x24\xae\xe3\x3f\xa3\xed\xbd\x8e\x9e\x79\x39\xcd\xf0\x35\x54\xcd\x89\x98\xfb\xbe\xb9\xd5\xb7\xba\xe1\x37\xd6\xe3\xad\x56\x77\xfe\x68\x89\x35\xa5\xd5\xf0\x3c\x1a\x8e\x6b\x15\xcd\x0f\x5a\xcd\xb5\xeb\xad\xbe\x79\x6b\x09\x4f\x7e\xa3\xda\x54\x09\x4e\xc1\x9e\x61\x92\x67\x56\xeb\xf6\xfc\xe8\xed\x6f\x07\x4f\x7e\xb2\xeb\xee\xc7\x48\x80\x1f\x08\xae\x26\xd9\xcc\xc9\x2e\x59\x92\xb2\x58\xff\x06\x65\x1d\xdb\x23\x5b\xae\xe0\x25\x6c\xb7\x51\x1c\x37\x34\x14\x5c\x61\xd8\x1e\xae\xbe\x7d\x9a\x1a\x0a\xcb\x0f\x8d\x95\x23\x9c\x8a\x74\xec\x9f\x3e\xe9\x2d\x60\x9f\xdd\x71\x96\x3e\x9c\x99\x0a\x77\xe5\xa3\x54\xe6\xfa\x16\x0f\xcb\x1c\x98\xb5\x59\x95\x1d\xe4\x1d\x61\xbf\xd9\xd2\xd2\x59\xb3\xa5\x9c\x5e\x95\x39\x00\x11\xea\xd4\xa5\x82\xa8\x61\x89\x6b\x05\x00\xed\x63\x0a\x9c\x49\x9e\x75\x5d\xf5\xf2\x7c\x9d\xf2\x02\x7d\xa6\x9a\x2b\x05\x26\x57\x66\xf7\xe5\xc1\xc1\x53\xa2\xf5\x71\x6e\x36\x35\x6a\x69\x10\xd5\x16\x29\xa6\x15\x10\x51\x4d\x0f\x89\x6a\x1a\x4a\xbb\x6f\x87\xa0\xf9\xb9\x80\xa9\x6f\x3a\xe7\xf8\x75\x35\xbc\xd0\xa0\xd5\xf1\xc2\x4f\x4f\xcb\x2b\x97\x48\x53\xf2\x4f\x1b\xd4\xad\x6d\xd4\x8a\xb5\xd5\xcc\xb6\x25\xba\xe3\x48\xb4\x05\x2f\xdb\x20\x6f\x2b\x69\x5b\xcb\xda\x65\xfe\x3f\x47\x87\x2f\x1b\x5d\x31\x4d\x93\xb2\xd9\x68\x37\x5a\xed\xd0\x01\xa3\x25\xc2\xe7\x47\x6f\x35\x13\xff\x74\xf0\x3b\x1c\x2f\x92\x75\x25\x47\xe9\xdf\x92\xa5\xe9\x98\xe5\x77\x8c\x60\x58\xe6\xc0\x68\x86\x0d\xef\xde\x35\x95\x00\xf7\x46\xab\x05\xbb\xa1\x3b\xbb\x3f\x1d\xfc\x4e\x51\x8a\xda\x6c\x40\x85\x39\xe7\xd9\x40\xde\xda\xf7\xa1\x8a\xa7\x7a\xbc\x63\x10\xbf\x7b\x97\x91\xfe\xef\xe8\xcd\xad\x19\xb5\x8c\x50\xa5\x91\x3a\x95\x8b\xf3\x31\x51\x45\xed\xf8\x7e\xcf\xb8\x37\x0b\xb4\x4b\x43\x69\x7d\x08\x07\x6a\x33\x72\xde\x3d\x01\xe9\x8a\x00\x69\x70\x7a\x8c\x16\xfd\x3b\xaa\x2d\x23\x51\x7a\x53\x4d\x96\xef\xcd\x75\x1d\x0a\xdb\xae\xac\x18\xd2\x6e\x80\x69\xa8\xbb\xa5\xeb\x0b\x12\x4a\x81\x87\xb8\xd7\xc9\x8d\x4a\xc2\xab\x73\xb3\xa9\xfe\xed\xfe\x8b\xdd\xd7\xdf\xba\xbf\x91\xbf\x9f\xb5\xd9\x21\x36\xa0\xe7\x05\xb7\x53\xb5\x2d\x98\x7b\x64\xe5\xf2\x48\xed\xdc\xf7\xc3\x22\xc3\x5c\xd3\xf6\x65\xec\x7c\xd6\x58\xe7\x9f\x0c\x9c\x83\xff\xa6\x16\x10\x58\xff\xd8\xaf\x93\x68\x0a\x36\x0a\x04\x0e\x0c\xc6\xe4\xc7\x0d\xfb\x51\xe4\x13\x2e\x3f\x6d\xda\x4f\x10\x89\x42\x7e\xdb\xa2\x75\xb3\x58\x7e\xda\x76\x3f\x3d\x87\x2b\xfb\x92\x6f\xc6\xcf\xe7\x1e\xce\xfd\x2d\x2d\xb0\x2c\x6b\xa5\x54\xe6\x3f\xa3\x8a\xb4\xee\xfc\xd6\x4f\xc1\x91\x18\xd6\x1e\xcd\x0f\x43\x86\x2b\x96\x1d\xdf\xfc\xfe\xea\xa0\xcd\xbe\xc7\xf3\xc2\x9e\xa4\xea\x58\xdc\x63\xb2\x5c\xae\x40\x63\xbc\xff\xfc\xe8\xed\xb3\xe7\x3f\xbf\x81\x7d\x47\x17\xae\x93\xc2\xa3\xc3\x17\x07\xa4\x68\x83\x14\x1d\xfc\x7a\xf0\xfa\x77\x52\xb6\xe9\xb4\xf9\xf2\xe9\xdb\xe7\x2f\x9f\x1e\xfc\xff\x08\xc0\xb6\x06\x78\x79\xf8\xf6\xdf\x87\x3f\x83\xa0\xae\xcb\xb6\xe4\xda\x73\x2a\x6a\x60\x63\x30\xa0\x46\x25\x01\x23\x31\xdc\x0d\x58\x9f\x34\xbf\xc7\x8d\xca\x55\x9d\x47\x25\xd5\x0e\xca\x33\xde\x18\x6c\x7d\x4f\x94\xc4\x28\x68\xa5\x52\xc0\x53\x33\xdf\x3c\x24\x45\x21\xe5\x37\x2a\x16\x37\x5a\x8e\x4f\x01\xce\xb0\x9e\xec\xa6\x6c\x52\xe9\xc6\xa9\x2b\x82\x52\xf1\x11\x77\x04\xb3\xdb\x19\x19\x46\xbd\xaa\xaa\x41\xa9\x36\xd8\x0e\x99\x33\x1f\x66\xad\x45\x95\xed\xb6\xed\xf3\x28\x6d\xcb\x0e\xa8\x87\x83\xd1\xd7\xa3\x12\x14\xff\xb9\x7f\xbf\x05\xbb\x87\x99\xa1\x4f\x9f\x14\xae\x49\x06\xd4\xa1\x87\x96\x94\x98\xe5\x37\xf2\xca\x8e\xdb\x20\xf0\x64\x13\x3a\x85\x22\xdc\x98\xec\x99\x21\x27\xdd\x0f\xb7\xab\x15\x59\x48\x06\xab\x35\x93\x58\xa3\x10\x24\x77\x08\x5d\xc3\x78\x4f\x17\x5c\xb4\x8c\x3b\xb0\xdf\xae\xf2\xd1\xdd\xd8\x71\xc2\x2c\x30\xfa\x5f\xaf\x07\xe6\xbe\x7e\x95\xad\x1d\xa2\xb9\xf6\x34\x43\xf0\x6e\x6d\xf4\x0e\xa6\xca\xb6\xa9\xa2\x08\x5a\xad\xf2\xdc\x51\xdb\xaa\x7a\xeb\xfa\x70\xea\x4e\x67\x62\x2c\xa9\xd6\xda\x75\xea\xc1\x2e\xa8\xbf\x10\xc7\x71\xbd\x04\x5b\x6e\xb0\x08\x59\x09\xb7\x44\xe7\xe8\x59\x71\x8f\x47\xb2\x40\x1f\xb3\x4e\x1f\xb9\x0a\x16\x3b\xae\x43\x5c\xdc\x8f\xed\x9f\xf4\x08\xbd\x0a\x1f\x12\x37\xf3\x13\xe8\xf5\xd8\xa3\xee\x66\x77\xbd\xbb\x81\x1b\xb6\xd2\x6d\xec\x23\x83\xe7\x45\x72\x9a\x64\x51\x0a\x45\x66\x31\x58\xc3\x6b\x2e\x88\xcc\x5b\xbb\x7b\x3e\x5a\x70\x55\xd1\xbd\xd8\xd5\x46\x8c\xdc\xa4\xe0\xd9\xac\x76\x66\x2a\xb5\x5a\x4d\xb3\xce\x43\xe4\xb9\x99\x29\xef\x75\xee\x8b\x2a\x0c\x47\xed\x85\x76\xeb\xd6\xf5\x25\x86\x06\x56\x69\x62\x0c\x74\x54\x4c\x10\x4b\x26\x72\x5b\xd0\x1f\xa9\xab\x38\x79\x4a\xc9\x85\xe8\x14\x3c\x4a\x27\x92\xb7\x61\xdb\x35\xcf\x31\xe6\x36\x56\x89\xbb\xd2\xdc\x07\x09\x11\x49\x00\xe1\xa6\x10\x01\x22\xd6\xc9\xcb\xd5\x7e\x55\x05\x89\xe8\xaa\xcd\x7f\x9f\x68\x36\x25\xac\x55\xd6\xd0\xad\x6c\x9f\x44\xa2\x08\xb4\x08\x6a\x18\x23\x5b\x01\xac\x15\x7a\x1f\x2b\x1c\x77\x6a\xa4\xae\xed\x1b\x5b\x57\x07\x1c\x29\x9e\x46\xe7\x49\xfc\x63\x31\x8b\xb2\xb2\xf7\x22\x9a\x76\xdc\xe7\x46\xbc\xb4\x2c\xab\xae\x59\xf1\x45\xd3\x57\x44\x1c\x7d\xdd\x46\xdb\xd3\x36\xfb\xc8\xb0\xd9\x1a\x23\xe5\xed\x7e\xab\x09\x90\x2d\x16\xb2\x9a\xde\xbe\x99\xd5\xf4\x0d\xa9\x00\xd1\x17\xf2\x3a\xad\xcf\xba\xb1\xca\x05\x7f\xed\x9a\x6d\x67\x7b\x7d\xbe\xd0\x06\x92\x7f\xd0\x9c\x16\x11\x69\x52\xbb\x33\x85\x10\x5c\xc9\x5a\xf2\xb6\x8b\xb5\xd1\x07\xcf\x3a\x38\xc8\xaf\xec\x3e\x5b\xfd\x1b\x36\xc1\x12\x91\x35\x4a\x76\xca\x33\x5e\x24\xc3\x55\xf7\x95\x55\xe2\xde\x34\x92\x50\x78\x73\xdf\xbe\x99\x85\xf8\x72\xea\xb3\x79\x44\x92\x77\xf8\x36\x7b\xfe\xe6\xe0\xf5\x93\x37\x87\xaf\xed\x3e\x63\xc4\xa6\x63\x58\x97\xf6\xc2\xaf\x12\x42\xb6\xe9\xe9\xaa\x7f\x90\x86\x88\x1c\xa9\x0f\xb8\xd0\xf0\x6f\x66\xed\x4d\x98\xb0\x1c\x6e\x3c\xea\x2a\x4e\x4c\x72\x70\x68\xca\x45\x94\x76\x04\x2f\x27\xd1\xb4\x93\x8f\xe4\x6c\xf4\xfe\x26\xf8\xb0\x33\x89\xa6\xdd\x7c\x54\x63\xc1\xbe\xa9\x17\x4d\x00\xd9\x5b\x35\xec\xbd\x36\xee\x4b\xef\x1e\x73\x66\x7b\xff\xf0\xe7\x9f\x31\x2e\x07\xce\xb4\xbf\xd1\x1c\xb5\x99\x05\x91\x3b\x4c\x4e\xcd\x03\xf2\x51\x93\x8a\xfc\x46\x28\xf7\x8d\x55\xac\x80\xfc\x84\xa9\x03\xa3\xe9\x88\xea\xea\x91\x0d\xbf\x75\x3a\x2d\xf6\xe4\x18\xff\x3e\xa1\xad\xe9\x6f\xce\xa2\x92\xd2\x82\x5c\x53\xcd\x27\xb8\xaa\xea\xb4\xf1\xdb\x37\x7b\x9c\xf9\x7c\xce\x82\x48\xaf\x61\xde\xda\x9e\xc3\x5b\xb7\xfa\x78\xf0\xc5\x78\x0b\xae\xd1\x0b\xe2\x90\xac\xdb\x87\xaa\xc5\xca\x80\x9b\x6d\x5e\xd7\x66\x67\x39\x58\x6a\xd2\x25\x77\x68\x15\x73\x05\x6c\xb9\x26\xd1\xf4\x19\xb1\x0b\xb3\x96\x5c\xf0\x82\x22\x0b\x1d\x06\xed\x9f\xec\xd2\xd2\x69\x92\x9d\xb6\xd9\x93\x36\xcb\xda\x6c\x38\xc0\x22\x43\xad\x26\xb9\x13\x2b\x58\xb6\xa7\xda\xbc\xb3\x17\x94\x99\x14\x58\x8b\x34\x02\xf0\xc4\x9e\x48\x21\xbf\xe7\x68\x67\xfd\xa5\xa2\xe0\x9f\x98\xdd\xdc\x6b\x5e\x8b\x63\x19\xb5\xeb\x1c\x0e\xd4\xcd\x5c\xd1\xc4\x8e\x7a\xfd\xa4\xcd\xd6\x69\x04\xe2\xc3\x91\xc2\xc3\x9c\x0d\x76\x8a\x32\xfe\xa1\x7c\x5e\xf2\x09\xbd\x3f\x3e\xc1\x2b\xd9\x70\x60\x4a\xdb\x2c\xbb\x7f\x9f\x04\x5e\xd6\x7a\x44\xd7\xbe\x27\xd8\xd5\x13\x75\x02\x3d\x09\x7a\x01\x2e\xbb\x5b\xdc\x4c\x11\xf7\x19\x2e\x64\xdb\x0f\x97\x73\x21\xdb\xbe\xd9\xed\x2f\xdc\xf7\xa3\x90\xe0\xd4\x59\xfb\xd0\x1f\xd1\xff\x02\x64\xba\xd9\x5d\xab\xd7\x63\xeb\x6b\xe8\x97\xb8\xc6\x5e\x82\xcb\x70\xf7\xc5\xf3\x97\x6f\x8f\x9e\x3c\x3b\x78\xfb\xfc\xe5\x9b\x83\x7f\x1d\xbc\xfe\x6c\x19\xf9\xa8\xcd\x1a\xd8\x26\x88\xc6\x7e\xbb\x3b\xd5\xf1\x05\xc5\xe2\x07\x37\xbb\x1c\x2c\x08\x3a\xb5\xbe\xd6\xdf\x6a\xb3\xdf\xa3\x71\x9e\xdf\xd1\x51\xa6\x6c\x71\x30\xb2\xd4\x4b\x7e\xc1\x7e\x3c\x7a\xca\x7e\xc6\x22\x4c\x90\x2f\x0b\xa2\xe1\x30\x9f\x4c\xa3\xec\x52\xee\x24\x4e\x8c\x29\x88\xb9\xc8\x8b\x89\xd0\x31\xa4\x20\x5e\xce\xc1\x93\xfd\x37\x6f\x8f\xde\x3c\x79\xf3\x7c\xff\xc8\x98\xc6\x0d\xc7\x49\x1a\xef\xe7\x59\xc9\x3f\x40\x26\x50\x41\x1f\xc3\x87\x35\xdf\x15\x6b\x83\xcb\xae\xf3\x3d\x11\xd3\x34\xba\x7c\x19\x4d\xfc\x37\xf5\xa7\x35\x35\x26\xc9\x87\x24\x73\xbe\x18\x3f\x65\xfa\xb1\x84\x48\x36\x18\xa9\x40\xbd\x8d\xff\xf4\xf2\xf0\xb7\x97\xde\x70\x32\xa7\x63\x94\x1e\xec\x6f\x73\x0f\xb1\x9f\x20\x28\x54\xe1\xfd\x26\xe5\x66\xcf\xa3\x9f\x92\xf2\xd2\xc3\xc5\xf5\xfa\xb6\x11\x53\xdc\xef\xbb\xda\x6f\x87\x78\x5f\x4b\x52\x91\x10\x2b\x81\xc2\x50\x2d\x1d\x47\xb5\xa6\x9e\x2a\x0e\xd5\x7c\xca\x31\x56\x07\xe8\x72\x82\x95\x2d\x84\xa9\xff\x4a\x13\x0e\x4e\x6a\x5b\x8b\x7c\x47\x58\xf4\x00\x32\x9f\x4d\x30\x48\x53\xfb\xee\x5d\xef\x8b\x0a\xa7\x3e\xff\x98\x1f\xe7\x89\x28\x5f\xe6\x19\xc4\x0a\x3a\x2a\xa3\x32\x19\x0a\xf5\xb0\xb9\xaf\xfd\xcd\xdb\x2a\x74\x1a\xf9\x30\x48\xa3\xe1\x59\x9a\x88\x32\x10\x7b\xc5\x03\x46\xeb\x42\x15\x39\xbc\xc5\x3e\xb2\x5e\x8f\xc5\xb9\xbc\xd9\x41\xdf\x2c\x3f\xe7\x85\x8e\xf0\xd8\x1c\x97\x93\xb4\x65\xa3\x06\x88\x15\x47\xdf\xea\xd1\xc0\x0f\x7c\x8c\x4a\xea\x31\x2f\x92\x92\xc7\xb6\x7f\x9f\x52\x4d\x0f\x41\xc7\xe0\x5a\x9b\x45\x56\x5a\xb9\x7b\x37\xd4\xb6\x1c\xdb\x02\xac\xe4\x7f\xcb\x51\xb9\xda\x3e\x25\xb4\x8b\x25\x4d\x80\xe6\x3c\x40\x2a\xb7\xf2\x00\xb7\x07\xc6\xed\x50\x37\xc8\xe8\xfe\x68\x54\xf3\x10\x81\x68\x98\x67\xc3\xa8\x0c\xd7\xab\x74\xe6\xc4\x5b\x37\x7f\x86\xd2\x44\xd1\xe8\x46\xec\xfe\xfd\x24\x34\xcd\xe0\x4a\xca\x54\xb0\xa1\xea\xfc\xdd\x71\x36\x64\x48\xc6\x00\xef\xbb\xce\xc6\x66\x3e\x37\xef\x18\x2a\x83\x65\x84\xf9\x05\x10\xc1\xf8\xda\xb8\x33\x91\xf5\x5e\xb7\xd0\x7d\x3a\xf8\x9e\x30\xfa\xbf\xb2\xb8\xc4\xa5\xf1\x04\xd2\xb0\x8d\xa2\x24\x9d\x15\x5c\xa0\x8e\xa6\xe0\x51\xdc\xc9\xb3\xf4\x92\x44\x66\xa8\xb4\xc0\xf0\xf0\xa0\x01\x6a\x2a\x1c\x06\x26\xd7\x16\xef\x00\x1e\x57\x6c\x18\xc1\xbb\x84\xe4\xe3\xba\xa8\xe0\x81\x00\xdf\x6e\x4f\x5a\x5a\x5c\x99\x07\x12\x10\x15\x1f\xdc\x4c\x6f\x76\xeb\x61\x7b\x30\x46\x4d\x26\xbe\x7f\x2f\xc4\xf7\x99\xf8\x5e\x8c\x39\x2f\x0f\xa7\x65\x92\xeb\xb2\x29\x89\xc4\x16\x92\xa7\xd6\x48\x2b\xb5\x0a\x39\x13\xcc\x07\x61\xdc\xe0\x35\xbf\x25\x69\x3c\x8c\x8a\xb8\xf9\x36\xb3\xf1\x75\x4c\xb7\x75\xf1\x81\x36\x1f\xac\x57\x81\xe7\x05\x07\xb2\x2d\xb6\x6e\x3d\x92\x4e\x43\x09\x35\x0d\x1a\x4b\xa7\xae\x0b\x33\x5e\xd5\x87\xda\xf8\xab\x1d\xb8\x08\xec\x9a\x0b\x8d\x72\x23\xbb\x38\x1c\xbc\x47\xdb\x28\xd3\xc4\x1d\x13\x7f\xb9\x92\xdb\x85\x74\xa6\xb8\xc6\xf1\x67\x21\x6b\x1b\x03\xae\xe6\x83\xf7\xb8\x94\x5b\xaa\x2b\xdc\x4d\xe0\x34\xc0\xe4\x2f\xf2\x42\xa4\xcb\x0c\x01\x14\xc4\x2e\xb9\x43\x1d\x22\xee\x0e\x45\x3c\x8e\xd5\x9d\x59\xc7\x11\xb4\x03\x76\x50\x0f\x33\xbb\xad\x6a\x02\xeb\x29\x37\x0a\x9e\xcd\x26\x9c\xda\x68\x86\xec\x36\xd9\x45\x91\x94\xf6\xb7\x94\xea\x2d\x9d\x73\x3b\x6a\xf4\x27\xb1\xcf\x06\x38\x21\x26\x5e\x93\x4b\x80\x66\x70\x45\xc1\x5c\x55\xc2\xfc\x84\x61\xdb\x2c\x13\xdd\xf7\x42\x6e\x05\x96\xb9\x49\x27\xb2\xac\x75\x9d\xb6\xec\xcf\xcc\x69\x54\xc5\x42\xbf\x7e\x5b\xe2\x35\x3f\x4d\x44\x59\x5c\xd6\xa2\x58\x28\x80\x6b\xb5\x3d\x89\xb2\xe8\x94\x17\x75\x38\x86\xea\xb5\x2a\xd7\xde\x07\x37\xd3\x8b\x7f\xa1\x5d\x76\xa9\x9d\x34\xc8\x4f\xb2\xcd\xf7\x42\xec\x60\x24\x27\x4b\x17\x08\xc8\xd9\x6a\xe2\xe9\x9d\xe3\xe4\xce\x07\x62\xca\x36\xe1\x5f\x3c\x03\xf7\x0d\x13\x97\x7a\x87\x56\x91\x24\x23\xf1\x5c\x95\x99\x14\xf9\xa2\x6e\x78\x2a\x11\xd9\x65\xca\x8f\xe4\x6c\xcc\x6b\xa3\xad\x4e\xca\x49\x7e\xbe\x64\x0d\xb0\xb7\x6c\xc3\x43\x00\xf2\xd1\xfc\x91\x45\x71\xbc\xb8\x7f\x9d\xa2\x62\x61\xbf\x2b\x55\x5d\xca\x83\x5b\x8d\x2d\x73\x5b\x4c\xa5\xae\x24\xc6\x16\x9e\x24\xbe\x58\xd5\x48\xae\xca\xa3\xc5\x29\xef\xda\x9c\x3a\x12\x10\xe3\xd1\xae\xb2\xc7\xf4\xf1\xd8\x39\x00\x55\x6d\x75\x0c\xed\xd4\xc2\xa9\x73\x6c\x11\x32\xf2\x9c\xa3\x81\xce\x25\x84\x02\xc6\x52\xb8\x77\xf8\x29\x49\xd8\x63\x8b\xea\x8e\x8b\x12\xce\xd6\x0a\xbb\xc7\x0e\x3e\x94\x45\x34\x2c\x31\xaa\xfe\x65\xca\x85\x0e\x2d\x01\x31\x83\x8d\x8c\x29\xd0\x3d\x68\x98\x67\x65\x94\x64\x4e\x92\x3c\x4c\x87\x73\xaf\x17\x5e\x8b\x76\xe4\xd8\xbc\x09\x96\xc1\x45\x9a\x64\x65\x27\x4e\x84\x3c\x4e\x3a\x19\xff\x50\x76\xd2\x24\xe3\x2c\xcb\x3b\x62\x1c\xc5\xf9\x05\x0d\x5f\xc9\x11\x4d\xa7\x11\xe5\xb6\x24\x0f\x0a\x0c\x40\xb6\xc2\x42\x89\x17\x9d\x1a\x24\xeb\x3d\x84\xd1\x91\x65\x4e\x6e\xb6\x73\x1b\xbb\x5f\x51\xec\x3c\x98\xc8\xe1\xb1\xf3\x6b\x47\x73\x96\x89\xf0\x4f\x9e\xd7\x4b\x93\x80\x21\x98\x91\x18\x9d\x97\xf2\x16\x8e\xe4\xe3\x15\x89\x01\x90\xbb\xc7\xa9\x56\xd8\x5a\xf3\x99\xd2\xcf\xed\x20\xf9\x01\x11\xbe\xa3\x93\x55\xc9\x7b\x8e\x9b\xd9\xa4\x9a\x60\x09\xac\xe9\x91\xc4\x10\x8f\x5a\x93\xfb\x3c\x90\x7b\xca\xc0\xb9\xf7\xa0\xfa\x61\xd0\x81\x98\xca\x01\x8f\xe3\xd0\x1d\x21\xdf\xf5\xe2\x90\x7a\x8c\xb0\x1b\xda\x79\x6e\xf5\xe9\xf0\xb6\x76\x1e\x95\xb5\x0d\x12\x21\xec\x79\x5e\x2f\xe6\x97\xd3\x49\xc2\x85\x31\x29\xd7\x31\x0b\x83\x17\xe4\x29\x89\x1b\xa8\x63\xfd\x56\x6f\xa4\x98\x9a\x2f\x39\xd9\x25\x9f\xbb\x56\xe8\x63\x7b\x35\xdf\x3f\x7d\xd2\x46\x59\xa4\x9c\x8a\x86\xda\x92\x1e\x58\x60\x15\x46\xbf\x2a\x57\x1e\xb9\x57\xd2\xaa\x5a\x82\x34\xd5\xc2\x04\xd6\x23\x27\x35\x2b\xb7\x55\x10\xa9\x2b\x06\x94\xc4\xae\xa9\x8d\x8a\xc8\x57\x18\x1b\x5f\x80\xa2\xe5\x95\x26\xa5\x4a\x5c\xa2\x8a\x5b\x55\xe2\x93\x86\xa8\x35\x35\xa9\x83\x63\x76\xda\x9d\xd7\x8a\x8b\x82\x11\xfa\x09\xc4\x2e\x5c\x86\x9a\x86\x6b\x74\x2e\x93\x9a\x47\xbb\x4d\x1f\x70\x5e\x40\x56\x05\xf2\xd5\xaf\x73\x60\xed\xb1\x1f\xa5\x29\x44\x96\x6f\xea\x10\xec\x6d\x3a\x6e\x3d\x1f\x77\x4c\x31\xcd\x24\x43\x01\x25\xa4\x0d\xd6\x6c\x8d\x45\x56\xf7\xa3\x2c\xcb\x4b\x0c\xd8\x1f\xa9\x8c\x23\x91\x20\x61\x9b\x57\x5b\xea\x5e\xa5\x8e\x3e\x10\xa9\xc4\x0b\x94\xa0\x31\xd5\xc4\x19\x67\x11\xfb\x8d\x47\x67\x2f\xa2\xa9\xca\x9c\x95\x08\xc9\x72\xc9\x69\xa6\x12\x92\xe6\xb3\xac\x64\x56\x24\x93\x0d\x69\x4c\x31\x06\x6b\x54\x96\xd1\x70\xdc\x8b\xb9\xfc\x87\x45\xb3\x32\x9f\xc8\x39\x8f\xd2\xf4\x12\xcf\x49\xb0\x5a\x73\xfa\xde\xab\x18\xe3\x9b\xdf\x0e\xa0\xb1\x08\xf0\x69\x8a\x96\xb3\x0e\xac\x3e\x83\xc0\x92\x1f\xaf\x20\xe4\x49\x12\xbe\x16\x7c\x54\xf9\xa6\xf4\x79\xf8\x0d\x36\x5e\xba\x73\x35\x9d\x2e\xda\xec\x18\xd1\x39\xe3\x97\x3b\xe8\x10\xd1\x56\xe7\x32\xec\x80\x75\x91\xec\x5c\xf3\x61\xd3\x6d\x17\xbe\x1c\x8e\x9a\x54\x23\x46\xfd\x11\x70\x14\x8e\xa5\x2e\xd8\xa6\x69\xc7\x06\x44\x23\x8a\xe3\x1a\x34\xa2\x38\xc6\x38\x04\xd0\x90\x8b\x8d\xa1\x10\xe9\x89\xe6\xd7\x57\xb4\x32\x74\xa3\x65\x8a\x66\x66\x20\xe6\xf4\xa7\xc3\xc4\x26\xcd\x18\x11\x05\x47\x4e\xb0\xbe\xf7\x9d\x7e\xcb\xb5\xc3\xd5\x60\xaa\x11\x78\xd1\xd5\x2d\x58\xfc\xf0\xfb\x9a\xf9\x06\x44\x85\x6f\x48\x51\x97\xa4\xaa\x2d\x65\x58\xd2\xd1\x41\xc8\x03\x14\xc5\x4b\x66\x0d\x51\xb1\xf0\x73\xa7\xd7\x90\xde\xa5\xbc\x67\x8d\x8d\x81\x71\x14\xe5\x8d\x59\xf5\xde\x1e\x5b\x6b\x61\xed\x2e\x2e\xba\x26\x89\x03\xe6\x42\xdb\xd8\x07\xca\x57\x5c\x21\xa5\x8a\x5b\x04\x4d\x31\x4d\x93\x21\x6f\x2a\xa3\xef\x35\x57\x41\x4b\x69\x57\x4b\xaf\x59\x36\x97\x62\xba\xf8\x73\x69\x66\x79\x65\x4f\xf1\x8a\xe3\xbc\xae\x04\xeb\xe4\x34\xcb\x0b\x4f\xae\x96\x77\x88\x3c\xb5\x86\xe2\x70\x41\xd4\x27\x07\x91\xdb\x5b\x4d\xf5\xde\xdf\x70\xd6\xfb\x0e\x1b\x46\xd9\x1f\x8d\x12\xec\xc0\xd5\xb4\x95\xb9\x19\x4f\xa3\xe2\xc3\xe4\x3b\xbf\x07\xe7\xd1\x09\x74\x5c\x9d\x39\x1a\xda\x68\x1e\x1f\x54\xb9\xa7\x8b\x5b\x70\xd3\x8f\x10\x53\x9d\x30\x74\x8f\xd2\xef\xa7\xde\xc6\x55\xcd\x73\x68\x66\x87\x5a\x60\x41\xb3\x27\x8e\x1f\x92\x43\xbc\xdd\x15\x3c\xd6\x83\xb7\x24\x0f\xd2\x17\x68\x6f\xd5\xf7\xfd\xaf\xab\xf4\x6d\x5f\xa5\x83\x53\x3a\x4c\xf3\x0c\x55\x37\x9a\x60\x89\x38\x1c\x08\x5e\x9c\x2b\xe1\x37\xa8\xfa\x07\xbf\xef\x2a\xf8\x3c\xb1\x8e\xc2\x7d\x25\xd9\xce\xb5\xcf\x77\x2e\x97\x34\x3d\x8b\xa1\x00\xde\xd6\xcc\xd5\xff\x08\xf3\x34\x61\x56\x1b\xa5\x42\x30\xa9\xdd\x67\x82\x17\x8c\x67\xb1\x60\xb3\x29\x2a\x21\xca\x31\x9f\xb0\xc1\x25\x8b\x86\xc3\x24\xe6\x19\x24\x93\x42\xb1\xfb\x32\x05\x6b\x2c\xd4\xe1\x9b\xa0\x16\x48\x72\xa7\x27\xf5\x9c\x8c\x37\x63\x79\x85\x3a\x4a\x26\xd3\x94\xbf\x9e\xa5\x5c\xa7\x38\xc2\xb7\xe0\x23\x6c\x53\x4f\xb1\xee\x62\xb9\xbb\x3f\x8e\xd2\x78\x2f\x3a\x2d\x92\x37\x6f\xed\x87\xed\x94\xa9\xf4\xda\xc1\xb2\x8a\xda\xc0\x1d\xaa\xcd\x12\xa2\x87\x8b\xb9\x52\xe5\x38\x9f\xe5\x59\xf9\x2c\x1a\x9a\x91\x52\x67\x06\x44\xd7\x25\x5c\x77\x12\x4d\x9b\x76\xe2\x5a\x3e\x21\x09\x07\xe3\x0d\xbc\xcb\xc8\x37\x01\x79\x66\x93\xc9\x64\x56\xa2\xab\xb2\xc8\xd9\x05\x57\xaf\xfb\x19\x07\x09\x7a\x45\x05\xe3\x9c\x5e\x62\x5a\x2d\x85\x14\x1c\x45\x0e\xcb\x3b\xe7\x51\x08\x57\xc0\x4d\xbd\xed\xe8\x79\x43\xbd\x83\xb9\x24\x43\xc6\x41\xad\x04\xa2\x5a\x23\x47\x03\x74\x2c\xc1\x88\xad\x5e\xf3\x06\x9a\x9f\x56\x4d\xaa\x4d\x8d\x23\xf6\xe5\xec\x0f\x9e\x96\x65\x98\x67\x65\x92\xb9\x69\x3f\x2b\xb5\x8d\x42\x88\xea\x46\x34\x54\x20\x06\xff\x83\x9b\x99\xbc\x2e\x17\x64\xfb\xc1\x83\x90\x8d\xd7\xcd\xac\xfd\x7c\x1b\xaf\xda\xc4\x87\xb6\x6d\x8c\xb5\xd0\x56\x49\x2e\xa0\x95\xdb\x7a\x92\xc8\x33\xc8\xa0\x5c\x4b\x80\x87\x15\xd0\x79\x3b\xb7\x86\xf9\x8a\xbb\x76\x91\xe7\xe5\x2e\xeb\xdd\xd3\xe1\x4e\x2e\x92\x2c\xce\x2f\xd0\x70\x8d\x9a\xec\xf0\x74\x84\x76\x3a\x96\xd5\x95\x77\x47\x9e\x97\xca\x65\x72\x77\xc5\xd3\x44\xe6\x23\xdd\xde\xbc\xaa\x08\x12\xaa\xac\x70\x9a\x57\x19\x41\xdc\xca\x85\x0e\x9d\xa7\x60\x70\xde\x0d\x0c\x29\x31\x96\xbd\x0d\x22\xca\x35\x5a\x4d\xcc\x5a\xe1\x78\x62\xe0\xdb\x89\x9e\x44\x67\x2f\x92\x8d\xd9\x14\x3e\xee\xa9\xaf\xdd\x2f\x6e\x98\xa1\x73\xb3\xdf\x0a\x17\xf4\x1f\x6c\xb6\xd4\xe2\x09\x24\xf1\x7c\xf0\x1f\xcd\x72\xf4\x5d\x4d\x92\x23\x97\x42\x28\x46\xd9\x7d\xfe\x95\xa2\x31\x11\x1c\xea\x40\x90\xf2\xd8\x53\x61\x48\x0d\x3f\xde\x6a\x81\x0f\xa6\xba\x8b\xbf\x76\x57\x56\xbe\x23\xec\xf5\x36\x98\xe5\x1c\xda\x03\x30\x55\xde\xcd\xad\x38\x05\x65\xdf\x19\xa6\xa8\x42\xec\xae\x7c\xf7\x9d\xe1\xb3\x00\x68\xb3\x61\x61\xe5\xfd\xe8\xbb\xef\xbe\xab\x36\x42\xf8\xe6\xbb\xef\xae\x56\x68\x83\xa6\xbd\xc6\x0f\x3f\x90\x96\x76\x57\xbe\xbb\x5a\x59\xf9\x2e\xe0\xf3\xe3\x31\xc4\xcd\x6c\x88\x3f\x63\xf3\x9d\x16\xf9\x90\x0b\x71\x9b\xbb\xee\x17\xd2\x81\x42\x95\xb9\x51\x9f\xfa\x0f\xb6\x3c\xc0\x79\x4d\x23\xc4\x57\xdc\xcb\xf7\x8f\xc0\xeb\x55\x61\x46\x4d\x09\xf6\x8f\x8e\x14\xde\x3c\x3b\x47\xd5\xbf\x9c\x94\x2e\xcf\xce\xbb\x2f\x0f\x9f\x1e\xbc\x3d\x78\xf9\x6b\xdd\xbd\x85\x3e\xd8\x15\x46\x64\xff\xcd\x93\xe2\x18\x17\xc3\x68\xca\x59\x52\xaa\xe8\x2d\x2a\xb5\x68\x9b\x0d\xf8\x30\x92\x6c\x73\xc1\x41\x18\xcc\xf2\x92\xcd\x84\x9c\x3e\x29\xd8\x37\x04\x36\x97\x64\xd3\x59\x09\x62\x9a\xe0\x29\xa4\xe5\x15\x6d\x5d\xe3\x14\xdf\xda\x21\x83\xb7\x29\x06\x13\xd0\x94\x97\x1c\x94\xa8\x2a\x96\xe9\x39\x2e\x65\xdb\x3b\x8d\x7c\x57\xd8\x28\x22\x92\x50\x9f\x3e\x31\xf9\x6f\x17\xf1\xd6\x72\xd9\x62\x05\xc8\xf1\xff\x1c\x1d\x9d\x30\x5b\x93\x4d\xf3\x14\x65\x80\x24\x63\x4f\x0f\x7e\x95\xa7\x0d\x24\xfe\x52\x6c\xa3\x72\x11\x27\x82\x0d\x8a\xfc\x42\xf0\xa2\x0d\x89\x97\x1a\x90\x7f\x8b\xe5\xb3\x32\xe4\xc9\x39\x89\xca\x71\x12\x89\xc1\x65\xc6\x33\xd1\xb3\x9d\x35\x5c\x1f\x47\x18\x94\x2b\xf2\x59\x58\x98\x2e\xd8\x03\xbe\x40\x76\xe8\x87\xb7\x69\xa8\xff\xd7\x93\xda\x5f\x4f\x6a\x7f\x3d\xa9\xfd\xbf\xf5\xa4\x26\x09\xf6\x2a\x9d\x9d\x26\x99\x31\x74\x9b\xf7\xaa\xe5\x81\x2e\x78\xd7\xf2\xa0\x9d\x97\xad\x71\x9e\x9f\x09\x12\x7c\x3a\xcf\x30\xd8\xc6\x6b\xf0\xf3\x3a\x3e\x69\x9b\xef\xaf\xf0\x10\xac\x2d\x80\xab\x73\xb8\x04\x6d\xaf\x68\xc9\x3e\x84\xd9\xfe\x15\xb7\x25\x5a\xf0\xcb\x34\x86\x7c\xa8\xc7\x27\xfa\xb9\x05\x5e\x1b\xf1\xbf\x7b\x4c\x0e\x8d\xbd\xa3\x48\xbe\x63\x38\x04\x92\xf0\x36\x32\xf9\x5d\x92\x91\xfa\x86\x39\xcd\x23\x80\xed\x9a\xe6\x7a\xa8\x22\x08\x3f\xd5\x79\x54\xf3\x1e\xeb\x28\x0a\x35\xef\x14\x14\xa4\x99\x41\xb2\xf8\x98\x0f\xd3\xb6\x36\x9d\x6b\x51\x5f\xc1\xca\x0e\x6a\x67\xa7\x4b\x1b\xf2\xf6\x54\xc7\x02\xa5\x98\xe1\x16\x16\xae\x79\x9c\x9c\x04\xb1\x70\x9f\x07\x0a\xb8\xf2\x6b\xc1\x78\x96\x72\xff\x0d\xc2\x4b\x59\x68\x2c\x4e\xcc\x34\xd9\x49\x22\x1c\xa3\x66\x49\x91\x5e\x5e\x97\x2b\x8f\x08\x0e\x7c\x2d\x49\x09\x8c\xc2\xf5\xe3\x8a\x8b\x7d\x37\x11\x0a\xc8\xba\x97\x86\x9e\xcb\x00\x56\x11\xa1\xab\x1e\xa4\x96\x9d\x0f\x82\x45\xdd\x84\xd4\xc1\xcb\x69\x28\xe0\xd8\x77\x1f\x20\x8d\x0f\x40\xaf\xc7\xbe\x7f\x96\xe6\x17\xcf\x92\x0f\x2f\xb8\x3f\x36\xa5\x88\x83\xc6\xdd\x95\x47\xca\xdb\xcc\xed\x40\xcf\x9c\x47\x1c\x27\x6f\xc7\xc2\x59\x84\x4e\xae\x33\x8d\x50\x61\xd1\x3c\x12\xf5\xb6\x8b\xb5\xf3\xae\x97\xf1\x0f\xa5\xd6\x50\x5a\xd5\xe5\x75\x66\x0a\x6a\xd7\x4d\x15\x6d\xbe\xb6\x32\x2c\x1f\x0d\xe8\x53\x58\xb7\x14\x9a\x3b\x45\x78\xa5\x0a\xb7\x9d\xf9\xaf\x6a\x8b\xe8\x2f\xbb\xba\x16\xfd\x65\x85\x85\xf4\x97\x40\x4d\x8f\xe4\x4b\x13\x15\x9e\x8e\xaf\xc1\xff\x50\x41\x12\xd2\x67\xfd\xf9\x14\xc0\x33\x61\xa9\xb1\x23\x68\xed\xa8\xb1\xb8\x19\x47\x65\x54\xc3\x6e\x0b\xc7\x8e\x4d\x2c\x35\x6a\x04\x95\xe3\xad\x76\xb8\xec\xd8\xc9\x41\xb9\x14\x01\x08\x7c\xfd\xb1\x64\x61\x9a\xca\x79\x41\x4a\xe2\x88\xa0\xbb\xf2\xa6\x7a\xb3\xf8\x55\x29\xfc\x1d\x4b\xca\xc5\xe7\x96\xed\xa9\x8e\x62\x95\x1e\xea\x1a\x90\x74\x74\x81\x1d\xb4\x6b\xce\x29\xb7\x46\xdd\x5e\x87\x87\x3c\x2f\x58\xc4\xa6\x70\xec\x6b\x22\xb3\xe7\x23\x4b\xb9\x44\xb0\x69\x24\xdb\x6a\xc3\xbd\x1d\x6c\x7e\xc7\x79\x51\x0e\xd5\x5d\xfc\xdd\x47\x67\xa7\xbf\x7a\x37\x6f\xaa\x66\xa2\xd6\xbe\x41\xf0\x26\x62\x11\x60\x4b\xfd\x22\xe3\x03\x90\xc7\x7d\xa0\x1d\xbe\x74\xb4\x98\xff\x05\xed\x59\xb0\xb6\x82\xd9\x05\x6d\xd9\xb2\x57\xf9\x5f\x54\x4e\x63\xd9\x26\x5b\xfd\xbb\x58\xed\x36\xda\x80\x55\xc8\x4c\xc0\x7d\xcf\xf7\x24\xaa\xb9\x2f\xfa\x15\x58\xff\x46\xfd\x4d\x7a\xb6\xd9\x67\xd1\xda\x07\xea\xad\x00\xf0\xbc\x2b\x92\x85\x32\x15\x7f\xe2\x97\xa3\x22\x9a\x70\x31\xb7\xa3\xed\x30\xfc\xbc\xbe\x1c\x40\x53\x7d\x3f\xcf\xe2\x44\x92\x37\x4a\xe7\x76\xf8\xa0\xae\xc6\xbc\x2e\x3d\x50\xd3\x04\x7d\x78\xad\xed\xf1\x61\x10\x7c\x5e\x77\x14\xce\x54\xfe\x35\xe1\x17\x72\xa2\xe7\xf6\xf5\x28\x08\x3e\xaf\x2f\x0a\xf7\x15\xd5\x9a\x70\x05\xe4\xfa\x4e\xd7\xf8\x61\x38\x8e\x0a\xc1\x25\x1c\xe5\x38\xb2\xda\xda\x00\x96\x4c\x24\xae\x8b\xa0\xe4\x42\x17\xd3\x68\xc8\x17\x01\x9e\x69\x56\x92\x80\x2e\x03\x56\x60\x27\x3c\x4e\x22\x09\xe7\xf3\x4d\x05\x52\xe0\x33\xba\x58\x0a\x78\x94\x67\x65\x67\xa4\x70\x75\x18\xa4\x02\x7a\xae\xa6\x4a\x42\x3a\xd3\x5b\x81\xec\x4c\x44\x67\x19\x68\x78\xf7\xc7\x03\xe6\x1e\xd3\xee\x4f\x6a\xd7\x16\xca\x34\xf6\x22\x49\x53\xe5\x6e\x24\x8f\x1e\xf9\x63\x96\x72\x3c\xe0\xef\xf5\x56\xae\x6a\x5e\x80\x68\x92\x74\x35\xd9\x2d\xb0\x3b\x08\x24\x1c\x24\xc1\x95\xde\x8b\x29\x2f\x46\xa0\x2f\x05\xfb\xae\x7c\xd4\x39\x17\x1d\x31\x1b\x88\xb2\x90\x7f\x15\xfc\x94\x7f\xe8\x44\x65\xa7\x1c\xf3\xce\x80\x9f\x26\x99\x3c\x0a\x3a\x1b\x26\xc6\x9a\x8a\xbb\xfe\x9a\x9f\x1e\x7c\x98\x36\x1b\xff\xb7\xc1\xee\x33\x9a\x92\x95\x5e\x36\xa9\xf2\x62\xd9\x7b\xb0\x79\x8d\xe9\x96\x5c\x94\x00\xd9\x62\x8f\xa1\x4f\x35\x4c\xf0\x82\x08\x37\xb1\x63\x93\xe8\x93\x68\x6e\x1f\x3d\x7d\x86\x83\xa2\xce\xd0\xee\x1d\x2c\xdf\xa4\x33\x1f\xdc\x18\xe6\xec\x4f\x90\xe6\xdc\x03\x9d\x7b\xaa\x68\x20\x4f\x19\x3c\xa7\x8b\xfe\x7a\x3f\x00\x3c\xaf\x13\x0b\x15\x34\xca\xfa\xef\xb6\xe1\xaa\xf5\x9c\x74\x39\xee\xda\xab\x00\x55\x8e\xf3\xad\x79\x64\x45\x6b\xcc\x43\x9c\xb7\x7a\x3d\xb6\x1f\x89\x92\xbd\x93\x10\xef\x58\x99\xb3\x77\xb6\x8d\x77\x6d\x26\x12\x50\x63\x96\x4a\x8e\x85\xd0\x3c\x60\x9f\x77\x3a\x8b\x8a\xb8\x6b\xcc\x7b\xe0\xb2\xfa\x3d\xe8\xdf\x87\xba\x6d\xa2\x61\x02\xf4\x08\x0f\x38\xc8\xe1\xd8\x3e\x5e\x51\x0d\x93\x46\xee\xcd\xe1\xd3\x43\x8b\xa8\xbc\xe1\x88\xb2\xe0\xd1\xa4\x2b\xb7\xa1\x61\x91\x0c\x78\xb3\xf5\x4e\x8d\x0b\xc4\x6b\xfc\x3c\xc5\xa7\x31\xdc\x35\xc5\x38\x9f\xa5\x31\x1b\x70\xb9\x18\xd3\x64\x98\x94\xe9\xa5\x6e\x73\x96\x99\x86\x62\x0c\xf5\x70\x31\xe6\x19\xbb\xe0\x4c\x0a\xad\xf8\xae\x84\xfa\x9f\x44\xb0\x2c\x67\x69\x9e\x9d\xf2\x02\x1e\xe5\xb8\x1a\x3e\x0e\x9d\x20\xe4\x79\xe0\x05\x64\x72\x79\x0b\xa9\x58\x49\x99\x8b\xbf\x2c\x6d\xe2\x45\x05\xad\xa5\xe4\xdf\x27\x81\xb4\x8b\xce\x26\xa8\x34\x6f\x90\x13\xce\xd3\xbd\x2e\xa1\x0d\x43\x26\x82\xd9\x22\x3a\x6b\xb2\x35\xd0\x19\x73\x95\x64\x66\xfa\xd5\x56\x60\x75\x80\xa6\x44\x6b\x61\x5e\x1b\xbd\x06\x61\x91\xb7\x69\x9e\x4f\xe9\xf6\x0f\x1f\x80\x00\x73\x9c\x08\x91\x28\x8e\x8d\xf9\x82\x35\xa0\xcd\xc5\x14\xc1\x1a\xda\xec\xcb\x64\xc7\x50\x09\x6c\x03\xcd\x43\x55\x32\xc3\xae\x26\x88\x10\x18\x52\xb1\xc8\xff\xf9\x95\xe6\x97\xc4\xff\x2c\x05\xc8\x04\x5b\xd8\x80\x7f\x9e\x8e\xf9\xe6\x3b\x5a\xd6\xb0\x0f\x10\xb3\x00\x55\x25\x21\xa1\xe3\xf1\x80\xc5\x90\xe1\x43\x8f\xbe\x15\xb0\x7f\xbb\x0a\x58\x36\x3c\xfc\x26\xdd\x8b\x25\x3d\x7f\x4e\x44\x5d\x30\xb5\x47\xfd\x0a\xe4\xbc\x53\x41\xc3\x7c\xc5\x53\xf4\x8c\x0f\xa2\xc1\x3e\xe6\x2c\x0a\x1a\x26\x3d\xdc\xac\xc2\xce\xeb\xc2\x00\x7d\xbd\x83\xfa\x2b\x1c\x9e\xbd\x1e\x7b\xa2\xcc\x94\x58\xc1\xa7\x69\x34\xe4\x13\xb0\x4c\x06\x15\x47\x7e\xc1\xf6\xd8\xd3\xa8\xe4\xdd\x2c\xbf\x68\xea\xe0\x9b\x19\x2c\x2c\xf1\x52\xde\x6c\x1a\xfa\x97\x94\x41\xb3\xfc\x42\x83\xc0\x84\x68\x08\x54\x40\xb3\xfb\xec\xfe\x7d\x00\xf9\xa2\x47\xb6\xb2\x91\x92\xe5\x68\x80\x47\x0c\xa4\x2a\x4f\x26\x37\x39\x4a\xf5\xb9\x72\x6c\x46\x7b\x62\xce\xe9\x85\x07\x88\x7a\xa3\x5b\x42\x0f\x4f\x8d\x7d\x47\x19\xf1\x48\x5e\x66\xdb\x5a\xb0\xb5\x3b\xe6\xc1\x3e\xb1\xdc\xed\x6b\xde\x36\x3e\xca\x8e\x81\x7a\x76\x1d\x39\xc4\x83\xed\xd2\x73\xfe\xbe\x32\xe4\x73\x4e\x36\x45\x4f\xcd\x60\x60\xc6\x93\x79\xa6\x23\x97\x0e\x3d\xf5\x33\xe5\x3c\xdd\x32\xc9\xdd\xf5\x5c\xa9\x0b\xe1\x7e\xa7\xa3\x00\xf0\x02\x3d\x26\x25\x45\x79\xf7\xb4\xcb\xbc\x1b\x6d\xd7\x30\x17\xc8\x11\x58\x97\x1e\xe7\x66\x0f\xa4\xe3\xb6\xde\x36\xa6\x52\x77\x66\x51\xf3\x3c\xb1\x28\x59\x3e\x53\x68\xa8\x92\xd4\x8c\x7a\x24\x25\xaf\x71\x74\xce\x59\x24\x99\x48\x79\x2a\x4c\xa2\xa9\x55\xa0\x42\x45\x70\x53\xa8\xc6\x44\x20\xa3\xa7\xb3\x33\x47\x02\xab\x07\xad\x0a\x63\x3e\x2c\x32\x17\x12\x29\xac\x9e\xaf\x0e\x92\xec\x3a\xaa\x80\x2c\xcb\x1a\x42\xa0\x08\xa5\x47\xdb\x06\x19\x9c\x67\x65\x52\x70\xec\x20\x11\x2c\xbe\xcc\xa2\x49\x32\x84\x37\x6d\x04\xc7\xf7\x6c\xdd\x1e\x28\x0e\x06\xdc\xbe\x6d\x83\xa8\x0b\x11\x26\x74\xbb\x96\x7c\x0a\x21\xcf\x5d\x53\xa1\xac\x0a\x5d\xd6\x30\x64\x7d\xbb\x84\x64\xfb\x96\x8a\xb6\x6f\x83\xb2\x6d\x9d\x08\xf2\x8d\xc5\x19\x40\x2d\xc7\xe9\xc1\x07\x29\xbe\xf6\x9a\xc7\x4f\x3a\xff\xe7\xa4\xd5\x3b\xd5\x05\x70\x4a\x51\xc1\x56\x7d\xb2\x76\x7e\x6a\xaf\x58\xed\xac\xb2\xfb\x12\xb3\x6e\x99\xff\x9c\x5f\xf0\x62\x5f\x65\xaa\xa3\xbe\x4e\x26\xe4\x6e\x8d\xcd\xa0\x35\x59\xeb\xea\x7e\x10\xb7\xb6\xee\x37\x18\xbb\xe1\xe1\x37\xe9\xea\xf6\x97\xa1\xd9\x5f\x86\x66\xdf\x8c\xa1\x19\x54\x31\xee\xea\x61\xbb\xe5\x6d\x0f\x70\x5e\xd3\x08\xf1\x15\xef\x18\xff\xad\x36\xd7\xdf\xb0\xf9\x9d\x8a\x68\xf1\x2f\x5e\x9a\x03\x7a\xaa\xc3\x13\x42\xcc\x09\xea\xd1\x8c\x27\xe6\x10\xd5\x2e\xb8\x3d\xe1\x9e\x0d\x31\x47\xa9\xd4\xa8\x60\x50\x47\xa2\xa2\x10\x43\xa3\xf8\xf6\xae\x2e\xf4\x34\x48\x68\x51\x50\xa9\xf1\x80\x4d\xa2\x4b\x35\xb6\x64\x64\x50\x92\x22\xc2\x0c\x9f\x61\xbb\xb4\xbb\x46\x03\x2d\xd9\x48\x88\x8e\xc5\x03\x12\xc1\x01\xd9\xc8\x88\xce\xb8\xdc\x01\x09\x3b\xa0\x26\xad\x74\x8b\x43\x32\x19\x41\xaf\xec\x99\x88\x46\x4b\xd6\x88\x5f\x62\xa4\x03\xdd\xc9\x8e\x8e\xde\xfc\xfe\xf3\xc1\xdb\xd7\xbf\xfc\x7c\xb0\xc3\xfa\x52\x5c\xff\xe9\xe0\xf7\x67\xaf\x9f\xbc\x38\x38\x52\x1f\x1f\x78\x8f\x33\x25\xc8\x60\xfb\x47\x47\x0c\xd6\xed\x19\xbf\xd4\x4f\x30\x2b\x57\xbb\xe7\x18\x57\xfa\x27\x1e\x32\xc8\x24\x71\x9f\x3c\x00\xfb\x55\x12\xf6\x0d\xff\xe0\x24\x20\x54\x99\x82\xfc\x5c\x24\xec\x9f\xac\x2f\xd7\x15\x4d\xda\xe0\xe6\x5b\x60\x8f\xdd\xc2\x1d\x9d\x03\xc1\x72\x9c\xec\xab\x8b\xcf\x3a\x4d\xd9\x4f\xdb\x7c\xd4\xc1\x10\x1a\x1f\x1b\x2d\xd6\x61\x7d\x9d\xea\x27\x94\x45\x51\xcd\xb4\x93\x75\x48\x4d\xbe\x09\x9a\x45\x69\xdf\xb5\x54\x6f\x55\xd8\x5f\x39\x21\x48\x24\x76\x97\x6c\xce\x9d\x33\xcf\x1c\x2c\x9a\xc8\xdd\x55\x37\x20\x7f\x3a\x6a\x31\x7c\x39\xd2\x8b\xc2\x3e\x45\x82\x27\x81\x03\xdd\xeb\xb1\x37\x63\x5e\x70\xa5\x0e\x2e\x74\x73\xe8\x84\x20\xaf\x66\x69\x9a\x5f\xc8\x43\x48\x79\x23\x88\x1d\x5b\xb3\x23\xb9\xf9\x11\xfd\x7d\x14\x8d\xa2\x22\x61\x0f\xba\xfd\xee\x43\xfa\xfd\x45\x3e\x48\x52\xae\x8b\x1f\x75\xd7\xba\x6b\x64\x38\x6a\x7a\xc8\x88\xd4\x17\x3f\xe2\x48\xe3\x07\x39\x80\x2a\x67\x05\x66\xd8\x3e\xbf\xb6\x5a\xae\xd1\x4b\x8f\x5e\x33\x85\xb3\xd8\xdc\x96\x29\x26\x26\x29\x54\xb3\xb5\xeb\x6c\x2e\x92\x48\x7a\x7a\x03\x1b\x8b\x2a\xb1\x7b\x0b\x65\x05\x9c\xd4\x10\x93\xa0\x83\x24\xe1\x19\x7c\xc9\x7c\x4d\xf6\x04\x39\xd1\x82\x97\x25\x2f\xd8\x45\x24\xc0\x4d\x46\xcc\x86\x43\x2e\xc4\x68\x96\x76\x11\x7e\x7f\x56\x14\x3c\x2b\xd3\x4b\x76\x91\x17\x67\xe8\x22\x3f\x2e\xf2\x09\x87\xb8\x7c\xdd\x95\xea\x3e\xed\xe0\xb0\xe7\x63\xe1\x1c\x14\x02\xc6\xfe\x6e\xcc\xa3\xf8\x1d\xe3\x29\xe8\xaf\xd8\x6c\x9a\x2b\xc6\x49\x0a\xa1\x4f\x9e\x2c\x66\xc3\x68\x38\x96\x97\xf7\xd2\x46\x30\x3a\xe5\xe5\xbf\x79\x14\xd7\x6c\x2a\x63\x2c\x82\xd8\xd5\x6b\xbb\xa1\x05\xea\xa8\xfa\x25\x78\x4b\x57\x8a\xf3\x21\x6c\x10\x5d\xf8\xfd\xe9\x93\xfd\x70\xca\xcb\x03\xc4\x54\xfc\x78\xf9\x26\x3a\x7d\x19\x4d\x78\xb3\x21\xc1\x1a\xad\xe3\x35\x37\x77\x91\xfc\x1a\x9a\x75\x18\x7a\x24\x2f\xf1\x2c\x1f\xe1\x8d\x15\x32\x5f\xb3\x0b\x58\x48\x72\xf0\x74\x53\x8f\x32\x36\xcb\xd0\xc3\x26\x86\x90\x82\x92\x1c\x70\x4c\x40\xe4\x27\xd9\xd4\x34\x2f\xe5\xfd\x37\x4a\xd3\x4b\xa6\x21\xf3\x8c\x43\xba\x09\x54\x9c\xcc\x04\x3a\x4d\x41\xf8\x82\x64\x74\x09\x7b\x35\xea\x43\x64\x73\xb2\xcf\x61\x5e\x14\x5c\x4c\x25\x6b\x67\xa7\xec\x7f\x74\x79\x97\x3d\x01\x1c\x54\xcd\x84\x17\xb2\x55\x79\x91\xd8\x3f\x3a\xb2\xa2\xda\x05\x67\x59\x5e\x4c\x00\x05\x79\x05\x7a\x47\x27\xfe\x5d\x97\xbd\x19\xe7\xb3\xd3\xb1\xa4\xb5\x4e\x56\x68\x3d\xab\x4a\xfe\x01\xa2\x58\x29\xad\x8e\x30\x63\x18\xe6\x31\x67\xd3\x3c\xc9\x4a\x81\xfa\x9d\x77\x3b\x59\x5e\x36\xff\xf6\xc7\x1f\xeb\x6b\xad\x77\x6d\x89\xc1\xe1\x0b\xbc\xcb\x0f\xf3\xc9\x54\xee\x10\x09\x04\x84\x51\x70\xac\xf5\x4e\xb6\x0b\x4a\x80\xdc\x0c\xb9\x21\x3c\xec\xd8\x05\x38\x96\x4d\xe0\xb8\xd5\x03\x77\x16\xa5\x6c\x45\x5b\x01\x5c\x5c\x5c\x74\x2f\x36\xba\x79\x71\xda\x7b\x2e\x05\xbd\x2c\xc2\x9d\xa0\xf7\xbf\x33\x2e\x40\xc7\xd8\xfb\xdf\xa8\x83\x43\x10\x7f\x1b\x0a\xa1\xfe\xa4\x7c\xfb\x8b\x9e\xd0\x9f\xf8\xa5\x78\x11\x4d\x6b\x78\x58\xeb\x18\x2c\x13\xab\xb8\x17\x10\x6b\x08\xec\x8f\xd5\xf1\x1e\xe2\x6f\x98\x3e\x2f\xa3\x11\x51\x43\x86\x53\xfa\x8d\xa2\x21\x1f\xe4\xf9\x59\x6f\x94\xe6\x17\xbd\x44\x88\x19\x17\xbd\xf5\xed\x47\xdb\x76\xa9\x28\x55\x86\x46\xce\xac\x0d\xbc\xa3\xaa\xe5\xd1\x6c\x40\xb9\xf6\x1f\x0b\x5d\x3c\x91\xbd\x82\x46\x8d\x44\xbd\x0b\x50\x24\xa4\xfe\x35\x75\x6c\xbe\x32\xf4\x3c\xb2\x1e\x7f\xda\x84\x5d\xff\xde\xb5\x27\xce\x61\x26\xf9\x58\xcd\x92\xad\x00\x99\x21\x90\xeb\x92\x91\xe4\x35\xc3\xb2\x11\x1b\x44\xc3\x33\x26\xd2\x48\x8c\xbb\xf4\x28\x35\x75\xef\xde\xb5\x2c\x65\x4e\x99\x3f\xfe\x68\xb4\x4c\xc0\x2d\x27\x88\xd2\xcf\xd1\x9f\x89\x5c\x4c\x18\x57\x0a\x5f\x61\xe9\x2b\xab\xa1\x85\x65\x07\xf7\x79\x4d\x6d\x8f\xcd\x56\x37\x9a\x4e\x79\x16\xef\x8f\x93\x34\x36\x11\x42\x2c\x9c\xc3\x4e\xd6\x9c\x9d\x39\xf1\xf5\x51\x5c\x95\x0b\x15\xb2\xc7\x64\xf4\x80\x61\xf7\x59\x83\x7d\xbc\x6a\xd8\x7a\x78\xef\xa3\x0f\x9d\x34\x58\x19\x33\x0e\x04\x6f\x95\x14\xec\xb8\x0e\x28\xb2\xb9\x46\xc5\xe4\xa4\x7f\x0d\xbb\x96\x0a\x67\xd6\xd5\x1f\x48\x75\x47\x38\x12\x2d\xc9\xf6\xc7\xfa\xd7\xf1\xda\x89\x73\x46\x9d\x68\x1e\x38\xe3\x97\xf5\x01\x41\x99\xc9\x6a\x5a\x25\xb5\x25\x33\xc6\x4a\x0e\x91\x39\xb4\x62\x99\x9f\xbc\x6a\x12\x4d\x43\xa7\xc5\xb3\xc4\x44\xf4\xe3\x3a\xe4\x15\x68\x7b\x23\x15\x9a\x8d\x8d\x93\xd3\x31\x64\x0f\x8a\xf0\xe4\x54\x96\x09\xea\x00\x20\xf2\xc4\x28\xc9\xe2\x7f\x03\x30\x1a\xad\x17\xc6\x31\xc7\x79\x8e\x09\xae\x55\x05\x1a\x5a\xae\x8e\x4b\x88\x82\x33\x0b\xd6\xcc\x65\xd7\x8c\x41\x2e\x04\xf8\xa2\x5d\x47\x70\x18\xff\x64\xee\xef\x00\x98\xe0\x85\xfc\xf3\x95\x3c\x11\x40\xba\x08\x17\x55\xe2\x65\xf9\xc1\xd2\x56\x3c\x27\x9c\xab\xc5\xd4\x96\x84\x05\x42\x8b\x12\xc9\x5e\x47\x5b\x51\x2e\x4f\x5c\x8f\xaa\x10\x02\x8f\x25\xec\x9f\x48\xf6\x4e\xe7\x16\x29\xfc\xb5\x48\x27\x0f\x62\x10\xe4\x80\x6a\xab\xef\x85\x58\x95\xfb\x74\x12\x87\x98\x71\x1f\x61\x5f\xe6\x31\x6f\x96\x46\x9e\x25\xd2\x9b\x59\x5c\xbb\x35\x7c\x29\xe1\xba\x90\xd5\x4a\x36\x12\x3c\x4d\xf0\x41\x34\x96\x5b\x91\x07\xed\x90\x50\x82\x74\xe5\xff\xbc\xd1\xb7\xa9\x87\x92\x8e\xe6\x33\x9a\xe0\x97\x45\x32\x69\x62\x84\x9d\x92\xdc\x48\x2d\x51\xf2\x98\x5f\x87\x5a\x80\xd8\x80\x8f\xf2\x82\x6b\x93\x46\xce\x86\xb0\xb4\xe5\xb4\xe0\xed\x00\xa6\xb2\x4a\xbd\x57\x05\x3f\x07\xd2\x39\x0c\xa6\x74\xf0\xda\x01\x52\xab\xdf\x42\x71\xfe\x77\x57\xb4\x83\xba\xcf\x88\x24\x22\x9e\xbc\xe0\x15\x97\x20\x3b\x22\x4a\x0a\x5b\x89\x59\x26\xa5\x7c\xb5\xfd\x68\x2c\x3d\x76\x5d\xbc\xe7\x78\x5c\xdc\x72\x38\xaf\x5b\xf0\x2c\xe6\x05\x2f\xba\xea\x82\x60\x9f\x84\x0e\xcb\x31\x2f\x2e\x12\xc1\x35\x62\xd1\xa8\x54\x49\xd4\xd2\x48\x94\x66\x15\x2b\xa3\x24\x1f\x9f\xfa\x75\x7a\x3d\x84\xba\x92\x08\x4a\xe8\x39\x4a\x06\x69\x92\x9d\xd2\x80\x58\x8a\x76\x23\x77\x71\xc0\xf3\xc3\x38\x4f\x63\x5e\xa0\x87\xa5\x9a\xaf\x44\x60\x48\x32\x1d\x12\xcc\x5f\xb7\x35\xab\xd6\x04\x1a\xf0\xe0\x6d\x34\xba\xc0\x06\x40\x12\x60\x99\x59\xd3\xf8\xed\x55\x96\xa7\xb7\x4d\x10\x25\x04\x02\x59\x95\x05\xfe\x06\xb2\x10\x7a\xe8\x57\x3c\x08\xae\x06\xe9\xd0\x47\x09\xc7\x8b\x85\x6e\x19\x25\x7d\x90\xd6\xa5\x64\x15\x49\x99\x7c\xc0\xd9\x28\x9f\x65\xb1\x56\x27\x68\x61\x93\x75\x74\x9b\x83\x28\xd6\xed\x0d\x13\xb8\x31\x09\x7c\x22\xbd\x64\x52\xee\x89\x0a\x9c\xff\x7a\xe7\x8c\x10\x69\xde\x0b\xd1\x30\xfe\x1a\xcf\x3d\x04\x57\xff\x2e\x56\xe1\xba\x0c\x98\x75\x1b\x6d\x16\x20\x8e\x13\x15\xcb\x5b\xfb\xd8\xa0\x12\xa0\xf5\xc5\x37\xc9\xca\x1c\x86\xf8\xf4\xf0\x85\xb7\xd8\xb1\x79\xc7\xc0\xa0\xb2\xe4\xaf\xc3\x29\xf8\xde\x8b\x9b\x87\x9a\xea\xca\x5e\x62\x58\x4a\x03\x52\x36\x99\x46\x85\xe2\x0b\x78\x19\x42\x80\xae\xfd\xaa\x16\x29\x54\x37\x1f\x5b\xa4\x9a\xc2\xea\x47\xd8\x4a\xf4\x98\x4c\x4f\xf4\x16\x4d\xd7\xd2\x6f\xa0\x83\x80\x83\x25\x51\xfa\x28\x08\x77\x9c\x5d\xe2\x3e\x5a\x82\xde\xeb\x7a\x4b\xc1\xdd\xf2\x75\x10\x3c\xb2\xf9\xe9\x3b\x92\x28\xa3\xe1\x99\x94\xff\xe5\xc5\x08\xae\x4a\xf6\xbe\xb7\xd9\xdf\x58\x7f\xf8\x60\xfd\x61\x6f\x94\x17\x43\xde\x19\x46\xa2\x4c\xb2\xd3\x4e\x92\x75\x24\xb0\x21\x9b\xdb\xb3\xda\x33\xd8\x1e\xf3\xa7\xc8\x88\xd0\x0e\x9d\x83\xb5\xc3\x44\x7f\x4b\xa9\xfe\x76\x01\xd9\xc3\xed\x92\xe5\x7b\x4d\xf7\x26\x7f\xb9\x24\xa8\x5b\x52\x0b\x58\x72\x77\x23\x3c\xc3\x56\x92\x5e\xc0\x1d\x4a\x71\xfd\x34\x9f\xbc\x56\x9b\xf1\x3c\x4f\x7f\x02\xe6\xde\x2a\xc2\xae\xfe\x04\xdc\x71\xf3\xd7\xcf\x16\x28\x95\x10\xff\x53\x0c\xfb\x6a\x4b\x45\xb8\xd4\xde\x39\xc9\xaf\x5d\xa7\x7d\x54\x80\xe3\x1f\x6e\x49\x40\x5f\x10\xf8\x4a\xea\x8c\x23\x81\xf3\xc0\x63\x7d\x5f\xb2\x9a\x82\x8a\xd6\x56\xc9\xb9\xf2\x8a\x29\xe7\x48\x1f\x71\x46\x71\x04\xca\xf6\x88\xc9\xdb\x76\x1c\xa5\x79\xc6\x99\xb9\x6e\x77\xfd\xc3\x32\x24\x70\x44\x71\xec\x86\x9b\xb6\xa1\x72\xf5\x45\x8e\xda\xbf\x16\x7c\xe4\x04\x63\x66\x8f\xc9\x0f\x2d\xd3\xb2\x1d\xf6\xf1\xca\x5e\x2b\xc1\x03\x46\xca\x3b\x05\x1f\x75\xe1\x07\x2d\x2b\x49\x51\x49\x4a\xb8\x59\x83\x50\xe8\xca\x18\xd0\xa7\x85\xd0\x7f\x51\x75\xe0\x3c\x95\x07\xad\xae\x54\xf4\xac\x21\x85\xc6\xde\x50\x88\x46\x00\x46\xf0\xf2\x49\x59\x16\xc9\x60\x56\xf2\x66\x23\x8e\xca\xa8\xa3\xce\xa1\x06\x39\x6f\x61\x6c\xad\x79\x35\xd1\x19\xa8\x8d\x24\x71\x6a\x96\xf3\x2b\x42\x97\x12\x0a\x2a\x1b\x73\x96\x05\xa9\x52\x20\x77\xad\x18\xe6\x05\xef\xc4\x51\x76\xaa\x82\x3b\xa3\xd4\x9d\x81\xbd\x47\x28\x40\x94\x7d\x79\x05\xa8\xb7\x6f\xa9\x24\x9e\x0d\xf9\x5c\x44\x01\xa2\xd1\xc6\x0e\xec\x71\x6b\x1e\xa4\xea\x0f\x58\x64\x6d\x56\x16\x9c\x9b\x17\x2a\x3c\x5c\xfe\xfd\xe6\xc5\xcf\xc0\xd5\x7a\x5f\xce\x38\x8f\x05\x1b\x25\x1f\x92\xec\xf4\x7a\x9a\xb2\x4a\x20\x0c\xb2\xa7\x78\x41\x30\x50\x48\xad\x8b\x16\xaf\x42\x8a\x9b\x4b\x86\x14\xa1\x70\x89\x42\xa0\x5a\xb0\x7b\xd2\xd8\xaa\x20\x50\xfc\x03\xa8\x24\x53\x2d\x46\x25\x82\x45\x69\xc1\xa3\xf8\x92\xee\xc0\x44\x3f\xe5\x90\x99\x1c\x38\x9f\x3e\xb1\x3b\x76\xd5\x79\xc6\x6a\x78\x1c\xcb\xfd\x42\xe9\x90\x0b\x2d\x85\xf3\x58\x05\xdb\x7a\x87\xbf\x31\x74\xc5\x93\x57\xcf\xdb\x4a\x3e\x7f\x87\xab\x58\x47\xc6\x36\x71\xd3\xdf\xd9\x86\xf5\x4b\x91\xca\x3e\xc5\xca\x71\x2e\x38\xf1\xec\xb2\x9e\x10\x0c\xcc\x48\x38\x44\xb5\x02\x85\x1c\x28\xe2\x66\xa7\x38\xfa\x91\x22\x00\x79\x14\x35\x72\x44\x54\xa0\x58\x29\x18\x70\x45\xcc\xa7\x69\x7e\x69\xaf\x5b\xfa\x96\x83\xd8\x41\x24\x30\x4c\x50\x24\x45\xe6\x0a\xf9\xfc\xdd\xb6\xe2\xcf\x8e\xcd\x37\x89\xde\x6d\xc1\x2e\xad\xf5\x4f\xba\x27\x22\x01\xd2\x09\x6b\x07\x36\xc6\x56\xbd\x8b\x36\x50\xd3\x5d\x15\x2a\x9b\xa7\xbb\x2a\x6a\x1c\xae\x71\xce\x6a\x98\x55\x4f\xa8\x19\x7a\x0d\x63\x39\x6a\x32\x0a\x53\x8b\xf7\xf3\x0c\x22\xd1\xec\x1f\x1d\xe9\x28\xca\xb0\x94\x75\xd3\x73\x11\x96\x64\xaf\x45\x18\xe7\xc4\x09\x7f\x12\x64\xf9\xc0\x78\x5c\x4d\x68\xe3\x8f\xac\xc1\xee\xd3\xb9\xd0\x79\xcb\x9a\x2d\x76\x1f\x8a\xeb\x07\x87\x77\x57\x65\xb9\xb8\xe4\xc0\xec\xda\xaa\x19\x9c\x05\x50\xa1\x52\x40\x67\x15\x48\x38\xa1\x0f\x5a\xb3\xd1\x5a\x7d\xcf\xb2\x1a\x57\x7c\xa9\x30\xda\x74\x3b\x74\x47\x65\xaf\x10\xd0\x09\x06\x74\x2b\x26\x82\x3d\x85\x05\x1b\x3e\xd7\x7e\x41\x4f\x82\x31\xa4\x60\xfa\x52\xdf\x25\x63\x15\x65\xa1\x87\x6a\xd6\x50\xc0\x8c\x82\x5d\x27\xf0\x5e\x94\x29\xf9\x15\x27\x2a\x03\x17\x29\x70\xa2\xe5\x31\xce\xda\x1f\xd9\x1f\xc5\xdf\xe5\x41\xed\x84\x51\xa8\x5a\x60\x30\xa2\x5a\xae\x5b\xff\xa8\x80\x77\x95\x4a\x46\x79\xed\xe6\x1d\xf1\x59\xe9\x29\xda\x79\x23\x2b\xcd\x5f\x16\x12\x70\x0e\xf7\x58\x00\xdf\x8a\x61\x31\xe7\x10\x30\x27\x99\x84\x7e\xf2\xd0\x0d\xd6\xe7\x92\x08\x91\x4d\x1f\x1a\x06\x2f\x77\x92\x1d\xbb\x96\x30\x75\xfe\xc5\x95\xe2\x96\xe5\x23\x16\x19\x5b\x95\xf9\xab\x0c\x50\xae\x5d\x62\xee\x80\x1c\x0a\x91\x55\x53\x25\x52\x75\x09\x59\x7b\x61\x4d\xb3\xb5\x5d\xfd\xf7\x3f\x2a\x6b\x45\x95\xb8\x51\x40\xc8\x9b\x07\x50\xd2\x30\xcd\x5b\x9d\x60\x44\x11\xe9\xad\x4a\xe8\xe2\xf2\xa3\x2a\xec\xf4\xeb\xe9\xa7\x3c\xb0\x23\x30\x12\xd3\x8f\xa9\x2a\x6a\x18\x9a\xf6\x82\x40\xf2\x21\x81\xdb\xaf\x7a\x7f\xa8\x25\xae\xaa\x33\x87\x0b\x09\x84\x35\x7f\xa8\x06\x58\x59\x8a\xcb\x30\x06\xd2\xc5\xbe\x26\x90\x86\x0e\xee\x92\xc1\x1d\x7f\x39\x0e\xb4\x7d\xcc\xe3\x43\xe3\xa8\xae\xf7\xfa\xb9\x21\x69\x4e\x39\xa0\x28\xea\x53\x1b\x41\x71\x4d\x9a\x90\x3a\xce\x63\xe1\x08\x23\x44\x54\x9d\x1b\x5d\xc4\x81\xf3\x4d\xa8\x6f\x16\xea\xfd\x2f\x13\xea\xbf\x4c\xa8\xbf\x05\x13\xea\x6f\xda\xda\xd6\xbb\x92\x23\xb4\xbc\xbc\x8f\xf3\x58\x74\x66\x82\x77\xc0\x55\x5b\x6e\x28\x4a\xeb\x8c\xcb\x15\x2c\xf1\xa2\xe1\x19\xcf\xc0\x1e\x28\xce\xa5\x70\x33\x46\xa1\x1a\x2e\x91\xef\x85\xb5\xb0\xfa\x35\x29\xca\x59\x94\x2e\xa3\x65\xf3\x40\x17\xc4\xd3\xf4\xa0\x5b\xe1\xf8\x91\x1e\x94\x77\x75\xd6\x7a\xb6\x9a\x6d\xd1\x58\xe5\x56\xb7\xc5\xc2\x71\xed\xad\x6c\xb6\xf3\x5a\x3d\xad\x6d\xb5\xd1\xa8\x6d\x93\x28\xfc\xe6\x20\xab\x2d\xfd\xae\x8d\xef\x4f\xbc\xee\x8a\x83\x85\xd7\xc2\x75\x49\x85\x44\xa0\xe6\x92\xb7\xc3\x60\xcd\xa5\xae\x69\x81\x9a\xd7\xb9\x07\x55\xa8\xe0\x19\x62\xdc\x40\x48\xbe\xde\x94\x5d\x4f\xf2\xb9\x26\xda\xd7\x10\x16\x82\xf4\x5c\x46\xe2\xad\xa0\xd4\xe9\xd7\xca\x13\xde\x1a\x9e\x2b\x53\x54\x60\x7d\xb9\xe2\x36\x13\xb9\xdc\x9a\x5c\xf1\x5e\x88\x37\x7c\x32\x4d\xa5\x6c\x5c\xe7\xb2\xfe\x30\x04\x3d\xcf\xad\x84\x80\xd1\xaa\xff\x9a\xe7\xb8\xb2\xf9\x68\xad\x0a\xbb\xa0\x93\x7f\x19\xf7\x15\x5d\xed\xe0\x43\x29\xcf\x86\xba\x2e\xfa\x55\xd8\x05\x5d\x20\x10\xad\xf6\x92\x0b\x4c\xf2\x1c\xee\x62\xb3\x0a\xbb\xa0\x0b\x04\xa2\xd5\xf6\xf3\xc9\x34\xaf\x8f\x21\xf0\x68\x2b\x00\xbc\xa0\x13\x05\xe5\x54\x8c\x26\x3c\x9d\x17\xab\xe0\xd1\x76\x10\x7c\x51\x4f\x1a\x8e\x56\x56\x00\xbf\x64\x49\x5d\x6c\x87\xcd\x47\x0f\x6a\x2a\x2c\xe8\x8f\x40\xba\xb3\x3b\x8d\xe6\x70\xc2\xa3\x2a\xec\x42\x4e\x90\x40\xb4\xda\xaf\x3c\x8b\xf3\xe2\x55\xc1\x47\xc9\x07\x90\x2f\x42\x5d\x6d\xad\xf5\xeb\xeb\x2c\xe8\xd2\x05\xa6\xcd\x80\x08\x78\x94\x17\x75\xd4\xdc\x5a\xdb\x0e\x82\x2f\xe8\xd0\xc0\xdd\xbe\x4b\x98\xda\x2a\x03\x21\x94\xba\xaa\xa8\xc6\x8c\x58\xbf\x98\x05\xdd\x65\xd6\x5c\x77\x99\xb5\x79\xee\x32\x6b\x27\xf0\xea\x46\xc3\x83\xc1\xbe\xaf\x82\xb2\xed\x30\x0c\x27\x40\xf7\x38\x8d\x5a\x4b\x5b\x16\x74\x4b\xbd\xaf\xb5\x99\x86\x56\x5b\x55\x15\x56\x79\xd7\x59\x48\xb5\xe3\x54\x21\x39\xee\x32\x16\x52\x6d\x1c\x55\xc8\x0c\x37\x0b\x0b\xa9\x97\x7f\x15\x74\xa8\x96\x3c\x81\x35\x4b\x38\x00\x6d\x96\xad\x85\xa7\x8b\xb0\x5a\x23\x26\x0b\x8f\x8e\x11\xd6\x52\x68\x8c\xb0\x7e\x2c\xa4\xb7\x14\xaa\x35\xce\x5d\xf6\xb7\x35\x2d\x3b\x57\x2b\x4d\x0d\x0b\x9f\x28\x7b\xd4\xea\x49\xfc\x1f\x4d\xf3\x54\x9b\x1c\x2d\x2a\xe6\x84\x8d\x79\xe4\xc2\xcd\x4d\x8b\x26\x01\xbe\x62\xc0\x49\x27\x0c\x95\x1b\xf8\x2f\x1c\x9f\x8a\xc4\x00\xa1\xa1\xb1\x03\x56\x5d\x4e\xe4\x6c\x4c\x29\x06\xa3\x77\xf3\x89\xd9\xc0\xe8\xbb\x26\xd4\xc0\x82\xdc\x3c\x8e\x93\xfd\x47\x3f\xc2\x96\x3b\xa2\x30\x0f\xdd\x66\x66\xa8\x6f\x3d\xd5\xd3\x57\x62\x24\xc1\x27\xc9\x6f\x49\x39\x7e\x29\x65\xc4\xde\xee\x1f\x59\xcf\x1a\x92\xbf\x8c\x92\x73\xf4\xd1\x04\x0e\x00\xbf\x16\xd6\xd1\x79\x35\x05\x78\x74\xa1\x4a\x77\x90\xc7\x97\xac\x99\xe5\x36\x35\x52\x0b\x61\x15\xd2\x02\xfa\x19\xe6\xa9\xbc\x12\x66\x31\xa8\x31\xc0\x1a\xc0\x5a\x60\x62\x64\x9a\x26\xff\x30\xe4\xd3\x92\xe5\x23\x34\xc9\x94\x40\xaa\xa9\x97\x39\xc3\x8d\x58\x29\x42\xd5\x93\x0a\xa8\x1e\x16\xb1\x9e\xe3\x0e\x4a\xfd\x64\xf0\x68\x82\x2f\xd3\x34\x51\xfe\x80\xe8\xcd\x29\x7f\x37\x2d\x79\x6a\x0d\x8a\x01\xb0\xce\x8c\x18\x62\x13\xed\x21\x0c\x18\x0f\xaf\x68\xcd\xfb\x1d\x08\x28\xe8\x79\x9b\xa0\x45\x65\x9a\x67\xcf\x95\x8a\x5a\x02\x59\xdf\x8f\x9d\x86\x63\x46\x69\xe1\x3c\x77\x90\xc5\x2f\x55\x2f\xa2\x74\x94\x17\x13\x1e\xd3\x47\xd2\xd5\xbf\x8b\xd5\x06\xc6\x5b\x9a\x9b\xd9\xd3\x44\x7f\x51\xf8\x29\xc7\xd7\xb5\x36\xc1\xbd\xa5\x0c\x9f\xed\xb8\x74\x80\x22\x5a\x85\x8c\xe1\x3e\xeb\xbb\x75\x48\xf4\x21\x37\x79\xa8\x1f\x20\xa8\xba\x51\x3c\xfa\x26\x53\x3f\xa1\xc0\x21\x6c\x34\xd9\x48\x88\xe4\x34\x03\x6d\xad\xe1\x54\xd4\xa1\x56\xd4\xc6\x7d\xe4\x35\x5f\x1a\x73\x54\xc7\x22\x9f\x15\x60\x3d\x63\xc5\xaf\xe4\x64\xd7\xb6\x73\xc6\xc1\xa2\x03\xc1\xb4\xf2\x51\xa1\x62\x74\xa5\xdd\x71\x24\x0e\x2f\x32\x3d\x4a\xcc\xbd\x85\x55\x30\xab\x3c\xe8\x22\x01\x49\x88\x0c\x2b\x99\x1b\x4a\xe1\x17\xaa\x77\x8d\x82\x17\xe1\x30\xe1\xf4\x5f\x1a\xf5\xbf\x34\xea\xd7\xd7\xa8\x07\xf7\x75\x23\xff\x93\xdb\x56\x5d\x60\xdb\xad\x87\xdf\xb8\x62\x5e\x6f\xa6\x68\xca\xd9\xf8\x01\x2f\x30\x8d\x5d\x55\x20\xe5\x70\xb7\x88\x35\xd4\xb0\x91\x06\xfb\x3a\xb0\x99\x2f\x09\xfa\xfa\xf6\x00\x78\x13\x98\x09\x93\x62\x57\x22\xec\x85\xf5\xf0\x81\x56\x1c\x13\x4d\x6d\xb6\x68\x86\x61\x8b\xce\x60\x18\x67\x8e\xa5\xaa\xbd\x68\xaa\xbf\x48\x59\xa1\x9e\xc3\x25\x69\xe5\x14\x77\x75\xec\xb5\xa6\xde\x4a\x9b\x24\x4c\x5f\xdb\x9c\x7e\x68\x39\xb4\x03\x8d\xe0\xa9\xd5\x6a\xf9\xf1\x3f\x8d\x27\xa2\x0e\xb4\x25\x3c\x33\x24\xb4\x1d\x03\x33\x54\x05\xaa\x09\x75\xac\x3f\x9c\xb4\xd9\x47\xd3\xd0\x8e\x6d\xf2\xca\xb5\x4b\x22\xcd\xa9\xc4\x18\xcd\x80\x01\x22\x86\x41\x31\x76\x18\xca\xca\xd0\x79\xdc\x08\x90\xde\x7b\xe0\x50\xba\xda\xf9\x9a\x5c\x15\xaa\x21\xf4\xf2\x8b\x58\x9e\x72\x15\x08\xbc\xee\x41\x1a\x23\x34\xaa\x77\x7c\x15\x49\xbd\x50\x6f\xed\x3a\x4b\xc6\xdc\xf7\xe9\x28\x8e\xe7\xe0\xa9\x4a\x55\x24\xc6\x90\xfb\x02\x0b\x24\xdf\xb2\x13\x16\xac\xe7\xbc\xd0\xeb\x7b\xab\x64\x2a\x8d\x6e\xe0\xe2\xe4\xbd\xd4\x17\x0b\xde\xe8\x89\xad\xc8\x22\x7b\x9a\xe5\xb4\xe6\xae\xe5\x42\x75\xa2\x1c\xb8\x45\x56\x18\x42\x99\xb0\x38\x06\x89\x41\xe4\xb4\x39\x56\x0d\x76\xc4\x50\xad\x1e\x35\xdf\xa4\x2b\xa0\xe7\x0f\xb0\xb3\xd6\xf5\xdb\xdd\x4d\x29\x22\xe2\xe5\x36\x37\x0a\x3d\x97\x7d\xe6\xed\x6d\xb4\x11\x67\x6b\x53\x21\x50\x30\x98\xc9\xa2\x1d\xcc\xf3\x1a\x97\x95\xb4\xd0\x6b\x36\x75\x25\xad\xb4\xbc\x3d\x8f\xb8\xe2\x48\x06\xb5\x81\x4a\xfd\xad\xa8\xcd\x96\xdf\x08\xb5\x05\x7b\x75\xbf\xb2\x5b\x64\xe8\x45\xb5\x4a\x13\x6f\xcf\x59\x96\x5b\x2a\x0b\xd8\x67\x9a\x6e\x05\x74\x01\xeb\x50\xa4\x28\xe7\x08\x3e\x8d\x8a\xa8\xcc\x8b\xd7\x26\xb0\xe0\x1f\xe2\x5e\xfb\x0f\x71\xaf\x77\x4a\x65\x81\x28\x8e\x8f\x86\xf9\xd4\x21\xab\xfc\x6d\x6f\x89\xd3\xa8\x80\x80\x65\xc6\x0b\x5f\x5f\x0a\x9d\x0e\x4c\x32\x06\xa8\x1d\xcb\xd3\xaf\x51\x77\x59\x84\x16\x43\x97\x45\x55\xf7\xfe\x1e\xfe\x05\x1e\xf2\x0d\x76\x1f\x2b\x1c\x27\x27\xce\xd5\x48\xb9\x49\xc9\x02\x79\x6f\x3a\x69\x91\xea\x8d\x36\x6b\xf8\xf7\x24\x28\x04\x2f\x18\x33\xf8\x71\x94\xc5\x29\x47\x95\x67\x48\x32\xb0\x7b\x8f\xab\x0f\xa6\x19\xfc\x0c\x4f\x91\x58\x9c\x24\x36\xb9\xde\xa1\x85\x13\x95\xf6\x27\x79\x4d\x30\x69\x8e\x55\xc4\x09\x62\x2a\x5e\xc9\xba\xe4\x04\xa5\x70\x72\x07\x76\xdd\x93\x02\xe3\x3e\x40\x7e\xa5\x45\x2b\xc3\xae\x02\xc3\x04\xb6\x0d\xe3\xee\xdf\xaa\x2c\x8d\x4a\x60\x5c\x1c\x4d\x95\xb0\x9a\x37\x91\xb4\xb7\x45\xd1\xf9\x71\x80\x95\x28\x3f\x25\xf7\x71\x85\xa2\xde\x68\x40\x51\xaf\xbe\x51\xd5\x43\x68\xc7\x32\x84\xa1\x4d\x7a\xed\xf9\xf4\xda\x9d\x33\x47\xde\xde\x85\x17\xfb\xe5\xe7\x29\xb4\x5b\xd5\x05\x2a\xa6\xd1\xd8\xf6\xf3\xec\x9c\x17\xa5\xab\x3a\x2a\x73\xbd\x49\xc8\x29\xd7\x2e\x03\x7c\x82\xb6\xed\x36\xdc\x0c\xc8\x7b\x3a\x9a\xcb\x0f\xb2\xc2\x84\x7d\x94\xa3\xb9\x82\x86\xe0\x6b\x34\x4d\xd8\x74\x36\x48\x93\xa1\xeb\x82\x69\x2e\x29\xfe\x51\x15\x88\x70\x5d\x23\x81\xeb\xb8\x5a\xa0\xdf\x31\xd3\xe6\xfb\x8f\xf3\x8b\xa0\x68\x1f\x6e\xd9\x91\x12\x74\xfb\xc7\x6b\x27\xa8\x09\xfe\xa1\x01\x0e\xec\xe4\xac\x02\x1e\xf2\x8e\x2b\x85\x8e\xfa\x3a\x07\xa1\xba\xe3\xb8\x0e\x1f\xeb\x28\x4a\x8e\x40\xfc\x80\x8e\xe7\xd4\x41\xd4\xb5\xc2\xc7\x6f\x36\xae\x99\xbe\x7f\xc8\x8b\xbb\x2a\x73\x1b\xac\x82\x52\xd3\x58\xf7\x35\xc9\x8b\x72\x72\xe5\xd3\xd0\x7b\x7b\xb2\x0b\xc0\x3d\xff\xdd\x6c\x13\x26\x75\xce\x8a\xcb\x1c\xf3\xd2\x4b\x14\x26\x76\xdb\x1d\x54\xdc\x83\xf3\x98\xeb\x68\xb3\xd4\xc6\xbe\x4b\x40\xeb\xb6\x2a\xdf\x27\x79\x5e\x5e\x9f\xf6\x62\x6d\x7e\x45\x47\xf7\x4d\x26\x93\x53\x4f\x24\x7b\xda\xf5\xf7\x08\xe3\xe5\x4b\x3e\x59\x35\x57\x77\xe2\x1a\x8c\xe5\xdd\xa4\xe4\x20\x10\x20\x20\x06\xd9\x5f\x65\x8f\x89\xbc\xea\xaa\xeb\x55\xed\x7c\xf0\x7e\x97\x5d\xb1\x9d\x5a\x38\xa5\xd6\x5f\x84\x4c\x3e\x78\xdf\x1d\x5a\xb5\x04\x40\x28\x60\x2c\x05\x7e\x51\xb8\x1a\x25\x0e\x7b\x6c\x51\xdd\x71\x51\x9a\xa3\x79\xc1\xf7\xd4\xaf\x11\x2f\x76\x89\xbc\x45\xfd\x07\x0f\xfe\x1b\xf2\x16\x61\x0c\x2e\x64\x51\x7a\x8b\xd1\xdf\x54\x1f\x76\xad\xa9\x5e\x9a\x76\x52\x70\xab\x32\x8f\xec\x0d\xf6\xd8\xf9\xb5\xa3\x59\x17\x9a\xc2\x2d\xba\x81\x01\xcc\x61\x4f\xbf\xf3\xa4\x28\xa2\xcb\x6e\x22\xe0\x5f\xec\x4f\x7e\x5e\x90\xf0\x45\xc2\x19\x05\x3b\x9a\x84\x0e\x67\x85\x48\xce\x79\x7a\xc9\xf0\xe4\x26\xa7\x24\x39\xfd\xb0\xac\x36\xc9\xb0\x32\xae\xd7\x0e\xd0\x01\x23\x83\x0d\xd7\xc8\x60\x63\x9e\x91\xc1\x86\x36\x32\x70\xdf\x39\x31\x54\x94\xc2\x32\xf4\xd2\x19\x88\x1a\x85\xb1\x50\x46\xea\xba\x89\x12\x8c\xd6\x9b\xd0\xf6\x1c\x67\x14\x55\xc1\xf7\xad\x30\xed\xec\xed\x29\x27\x84\x65\x3d\x88\x9e\xa0\x66\xa3\x2c\x12\x14\x56\xd4\x18\x92\x52\xf0\x74\xc4\xfe\x28\xfe\xc8\x88\xf3\x10\x57\x91\x19\x75\x7f\xde\x41\x57\x8d\x88\xa5\xe5\x1b\x13\x42\x3f\x58\x4f\x5d\xe4\x8b\xe8\xe2\x98\x0e\xfc\x84\x06\x02\x53\xb3\xec\x34\xe8\xcc\x76\xdb\xcc\x72\x28\x39\x8f\xbd\xde\x31\x33\x08\x97\x4f\x1d\x92\xeb\x91\xd8\x7b\x95\xf5\x7c\xd1\x8e\x2f\xb4\x82\xbd\x66\xf9\xbe\x2f\x94\x3b\x15\xb0\xf2\x94\x9a\x8f\x3d\xc1\xd5\x43\xc5\x11\xc8\x35\xc2\xae\x84\x02\x0f\x66\x92\x0b\xb1\xd4\x91\x37\x02\x08\xa9\x7f\x16\x91\x93\x90\xce\xec\x26\xce\xb8\x30\x3b\x80\xcf\x9b\x77\x74\x43\xaa\x9c\xb9\xbf\x49\xd0\xbf\x3a\x7a\x29\xf9\x3d\x88\x9d\x9f\x6e\x8b\x92\x8c\x41\xca\x27\xaf\xb3\x6a\xcb\xbe\xb0\x85\xff\x1f\x22\xa9\x4e\x2f\xd9\x20\x12\x4a\xea\xef\xae\x2c\xcc\x9d\x80\xf1\x2d\xaa\xe4\x77\x9f\x36\x1d\x0a\x1a\x04\x55\x72\x05\xb9\x19\xb9\xe4\xd5\x25\x61\xa6\x52\xa5\x75\xe4\x71\x52\x36\xd4\xce\x60\xb5\x0b\xaf\x01\xb6\xb7\xb0\x53\xb7\x8f\xfa\x76\x68\x03\x34\x1a\xd5\x0a\x15\xeb\x55\x90\x0a\x7b\xb9\xfa\x37\x08\x90\xec\x1d\x62\xf1\xce\x09\x77\xfd\x79\x57\x26\x94\x2e\xaa\x57\xa6\x25\x53\xd7\xd3\x87\x61\xbd\xf3\x3f\x9e\x77\x18\xed\x90\x2c\x33\x2b\x41\xeb\x14\x95\xbe\xc7\xfd\x1d\x96\x68\x6f\x33\x8b\x65\xef\x1e\xfb\xed\xe0\xc7\x57\x4f\xf6\x7f\x62\xbf\x3e\x79\xcd\x9e\xbf\xfc\x9f\x83\xfd\x37\xcf\x0f\x5f\xb2\x7b\x3d\xdb\xb6\xbe\x70\x7c\xec\xdd\x63\xea\xaa\x72\x91\x64\x71\x7e\x81\xef\x07\xd8\x75\x57\xf5\x5c\x6b\x96\xb9\xd1\x52\x0d\xc9\xcb\x92\xaa\xff\xe9\x13\x28\xe6\x30\xaa\x60\x2d\x26\x57\xf8\x3c\x3c\x6f\x68\xcd\xcd\x7e\xab\xd5\xaa\x90\xea\x76\x33\xa1\x55\x06\x6a\xdd\x24\x40\xbe\xb5\xe2\xcd\xab\x3c\xbb\x1c\x25\x69\xda\x2c\xf2\x1c\xb8\xe6\x3b\x3c\xf1\xc5\x2c\x2d\x77\xf1\x87\x96\xb2\x99\x04\xe9\xe2\xaf\xdd\x95\x95\xef\x88\x64\x41\x04\x71\x9a\x46\xe9\xe3\xca\x77\x00\xa5\x04\xed\xdc\x8a\x99\x50\xf4\x1d\x76\xc3\x8c\x24\x6e\x01\x76\x57\xbe\xfb\xce\xac\xd1\x2a\x64\xb3\x61\x41\x1b\x2d\x09\xfc\x5d\xa5\x09\x38\xc8\xd5\x30\xbe\xbb\x5a\xa1\xcd\x99\xd6\x1a\x3f\xfc\x40\x1a\xda\x5d\xf9\xee\x6a\x65\xe5\x3b\x93\x02\x16\x2b\x4b\x31\xca\x9f\xad\x6f\x2c\x69\xcc\x5f\xe6\x14\x21\x3b\x5e\x63\xc1\xfa\x5f\x65\x98\x16\x30\x51\x5e\xac\xc3\xb7\x8a\x22\x5b\x7c\xd7\x66\x0d\x1a\x91\x4a\xdf\x37\x8f\xff\xb8\xe8\x9c\xdc\x87\xa4\x42\xdf\x82\x52\x10\xe7\x48\x9d\x70\xbd\x9e\x7a\xf8\x25\xef\x25\x6c\xc0\x55\x0c\xa5\xbc\x60\xdf\x17\x7c\xe4\x66\xeb\x63\xee\x83\xae\xf2\xfb\xe1\xa3\xa6\xc9\x70\xe6\x1d\x86\x76\x31\x40\xb8\x6a\x64\xbb\xd0\x33\xaa\x69\xc0\xdc\x78\x74\xa6\x69\xaa\x7f\x6a\xd1\xe7\xd0\x4a\x20\x64\xe7\x86\x63\x0d\x85\xbd\x00\x09\x90\x4c\x16\xe2\xe1\x25\x2a\x94\x78\xc1\x47\xbc\xe0\xd9\x50\x07\x48\xf8\x3b\x44\x8e\xff\xbb\xe8\x36\x00\xdf\x36\x41\x4e\x5f\x53\x20\x46\xd3\xa7\x4f\xb6\xc4\x7f\xaf\x35\x96\x06\x57\xe6\x78\x87\x40\xa1\x91\x78\x92\x39\x31\xe0\xf1\x8b\xcd\x03\xe5\x64\x82\x32\xc6\x77\x77\x4d\xdc\xe5\x5d\x93\xc2\xc1\xf7\xbf\x7a\xa5\x98\x72\x24\x9a\xc8\x5b\xaf\x20\x45\x07\xf2\xea\x2b\x92\x8e\xd5\x72\xb0\xf6\xe2\x93\x1b\x99\x85\x9b\xf3\xd2\xa4\x6f\xcf\xb2\x79\x5a\xd9\x76\x58\x5b\x79\xc5\x5e\x71\xf5\x89\xd0\xf0\x2d\x23\xdc\xc7\x2a\x8a\x60\x7d\xe0\x6d\xa3\xb4\xf5\x6a\x58\x8b\x47\xd2\xc1\x7b\xec\xe0\x3d\xfb\x87\x3f\x08\xd3\xc1\x7b\x37\x50\x81\x1d\xaf\x19\xa6\xed\xe2\x3d\xb9\x91\xe2\x2d\x58\x0e\xad\xa5\x87\x48\x5e\xc4\xf0\x3f\xc8\x69\x80\xc1\x07\xa2\x34\x65\x77\xd9\xe0\x52\xc5\x40\x86\x31\xe4\xda\xe8\x86\xdd\xb5\x61\x7c\xd5\x8d\xd8\xb4\x61\xdb\x56\xac\xa3\x3c\x04\x20\x73\xba\xfc\xcb\xe4\x0f\xa3\xbb\x94\xe6\x03\x29\x75\xaa\xde\xf4\x2b\x5f\xa6\x36\x6e\xf7\xce\x43\x59\x51\x1f\xcf\xbe\xc2\xf8\x94\x97\x87\xb8\x20\x54\x40\x02\xb3\x1c\x2a\xcf\x09\xbd\x1e\x53\xa0\x12\x6d\x36\xe0\x3c\x33\x91\x9e\xf0\xc9\x37\x6e\x43\x22\xd0\x0b\x4c\xd6\xc0\x92\x4c\x7e\x86\x70\xa9\x18\xbe\xd8\xd5\x77\xdb\xf8\x10\xe1\x37\x1c\xac\xb6\xe3\x05\x69\xbe\xcf\xfa\x36\xf3\xb2\x9e\xd9\x24\x3b\xfd\x99\x9f\xf3\xd4\x7b\x0e\xeb\xd2\x32\x55\xc5\x03\x77\x7f\x7a\x2a\xa2\x3e\xdb\x71\x01\xee\xb3\xbe\xab\x85\x77\x50\x77\x5e\xe2\xc8\x65\xc9\x36\xe0\x36\xa7\x5f\xeb\xd4\x38\xed\x16\xe5\x1a\x70\xdc\x67\x7d\xf5\x6a\x35\x47\xdf\x5f\x9b\x0c\x74\xa1\xde\xdf\xde\x60\xb4\xfd\xb0\xce\x74\xe9\x11\x53\xbf\xa4\x68\x40\xfb\x04\x69\xb3\x05\xe8\xed\x41\x9f\x2a\x5e\xe1\x32\x89\x48\x13\xeb\xad\xa7\x56\x87\xc9\xb9\xe4\x83\x90\xac\x28\xca\x36\x93\x3c\x45\xb9\x01\x7e\x4c\xab\x77\xef\xb2\x3b\x81\xfa\x95\xe7\x4c\x46\xc6\xb7\xcc\x22\x71\xba\xd3\x1d\xf8\xbb\x10\xcd\x03\x50\xd9\xf1\x6d\x8a\xcb\xae\xf3\x5a\xc9\x48\x78\x7e\xbd\xd2\xf4\xa1\xa7\x9b\x29\x2c\x4b\xbc\x9f\x89\x92\x41\x1c\xbc\x91\xdb\x80\xdc\xae\x1c\x89\x45\xee\x4f\x2a\x44\x1b\x89\xa5\x2c\xff\x6b\xed\xe2\xeb\xba\x99\xc7\x96\x3b\xa7\x35\x92\x43\xdd\x26\x29\xa5\x10\x41\x5b\x17\x34\x36\xa5\xb2\x8d\xb0\x29\x13\x47\xaf\xdd\xac\x89\xb2\x7f\x12\x6d\xdf\xae\x93\xcf\x7b\x1b\x0e\xdb\xdc\x85\x35\x62\x01\x3e\xf9\x58\x45\x84\x8e\xfb\x15\x8c\x7a\x48\x38\xb3\x48\x4e\xc7\x34\x56\xb4\xda\xbb\x51\x45\x9b\x33\x9e\x89\x59\xc1\x15\x54\x5e\x60\xc4\x04\x4b\x2c\x33\x48\x95\xad\x7c\x96\x92\x64\xc6\xa6\x50\x67\x14\xf0\x28\x40\xc7\xea\x30\x96\x31\x32\x24\x21\xdf\xea\xb2\xf6\xba\x07\xc9\x2d\xea\x3b\xbe\xb1\xbc\x97\xc1\x2b\x91\x72\xd5\xfb\x6f\xbf\x13\x91\xf4\x4f\x7e\x96\x19\x7d\x05\x41\xfa\x5d\xd9\x9b\x8a\xb9\x8d\x28\x00\xb4\xae\xba\x42\x6b\xe4\x97\xd1\x44\x85\x00\x51\x16\x81\x00\xa9\xd9\xe1\xc7\x3c\x4f\x79\x94\x5d\xb1\x51\x1a\x9d\x42\x90\xa3\x64\x18\x41\x8c\x26\x33\xd2\x8b\x48\x90\xec\x4f\xa9\x14\x9c\xb2\xbc\x74\xaf\x3b\xda\x3a\x14\x4d\xc9\xd4\xd6\xab\x7b\x37\x37\xa0\xa3\xb3\x64\x0a\xd6\xf5\x97\x2a\x0d\xb1\x36\x0e\x22\xa0\x4e\x94\x04\x55\x0d\xfd\x7f\x58\x54\x14\xd1\x25\xcb\x47\x6a\x34\x19\x44\x79\x7e\xf7\x51\x79\x62\x8a\x1d\x76\xdc\x18\xe5\xb9\x14\x02\x07\x51\xd1\x38\xb9\x7a\xa7\x9a\x77\x5f\x1a\x6c\x5f\xcb\x3c\x33\x18\xe8\xfa\x37\x06\x3c\xe7\x8e\x78\x89\x47\xe1\x5c\x52\xa8\xc7\x07\x2f\xfc\x9d\xaa\x1c\x0a\x6f\xe6\x2e\x69\x6d\x9c\x70\xe5\x51\x46\x4c\xe5\x56\xa6\x2f\xb5\x71\x2d\x81\x24\x7d\x98\x24\x8e\xa1\x8d\x1d\x9f\xb9\xfe\xb0\x46\x8b\xfd\x93\x78\x19\x19\xb9\x74\xce\xb8\xd4\x45\x44\xd6\x6d\x39\x77\x30\x73\x61\x08\x0a\x28\x2b\x6e\xfe\x6e\x3e\x92\xdb\x6c\xc4\xd2\x7c\xa8\xb8\xba\xbb\xe2\xe3\x69\xe4\x86\xef\x9d\xe8\xf4\xf6\x29\x4f\x89\xf0\xfa\x66\x4b\x50\x44\x43\x97\xbe\xb1\x11\x57\x27\xa7\xf7\xa4\xb7\xd4\xc5\xf6\xb5\x77\x8b\x55\x81\xac\x95\x40\xda\xf5\x5f\xee\xdc\xeb\x6a\x75\x7a\xc3\x8f\x88\xd7\xc2\x68\xff\x72\x98\x26\x43\x86\x73\x9d\x28\xf7\x9a\x92\x0f\xcb\xcf\x40\x47\x91\x10\x48\xc7\xc5\xb1\x3e\xb2\x4e\xe0\x8e\xa5\x8d\x15\x1d\x08\xf5\xb0\x78\xa6\x4d\xfe\xc2\x1c\x1b\xe0\x81\x79\x9d\x98\xa9\xa3\x16\xa1\x26\x3f\xa5\xa7\xe1\x51\x4c\x6e\xd3\xa3\x49\x4e\x8a\xcd\xd1\x0e\x6d\x19\x6d\x8f\x01\xba\x5d\x8d\x8f\x3a\x82\x96\x7f\xd4\x70\xd2\xcc\xe1\x5b\x86\x5e\xac\x21\xa1\x3f\xb4\x04\xbd\x5a\x26\x2c\xb3\x8a\xe8\xaa\x0b\x1c\xba\x4c\x0b\x7e\x8e\x61\x8f\x47\x49\x96\x94\x9c\xa5\x79\x3e\xed\x56\xec\xec\x4c\xab\xbb\x35\x62\xc5\x0d\xa5\x8a\x6f\x2c\x14\x5c\x30\x79\xb8\x71\xdc\x9f\x93\xc1\xdc\x9a\x4c\x28\x41\x5a\xbb\x59\xaa\x6c\x4b\xc0\x64\x78\x26\xff\x4d\x09\xca\xdd\xd0\x71\x2d\xca\xc2\x39\x9b\xd5\x77\xff\xa4\xbd\x6e\x5e\xf4\xea\x52\x91\x63\x82\x30\xd1\xb1\x65\x0b\x3c\x2c\xca\x9c\xc5\x91\x18\xdb\xa3\xa4\x4e\xf6\x00\x2e\x70\xb0\x55\x25\x2e\xb6\x43\xec\x12\x70\x21\x37\x48\x75\x7b\x3d\xc7\xa0\xd0\x7b\xda\xa4\x63\xfe\xa5\xd3\x54\x00\x91\xb7\x36\x71\xfb\x89\x63\x84\x7c\x62\x36\x1f\x74\x5d\x93\x6c\x3d\x8a\xd2\x74\x10\x0d\xcf\x1c\xf3\xcb\x90\x39\x82\x05\x6c\xd9\xde\xed\x57\xf3\x9c\x6d\xbe\x74\x27\xd1\xb4\x49\xc6\xac\x6c\x36\xc2\x75\x2b\xb4\x21\xfd\xf9\x62\xbb\x69\x81\xce\xe7\x93\x34\xcd\x2f\xe6\xcd\xe6\xe0\x52\x57\x94\xdc\x08\x2a\x6e\xc8\x44\xa7\x66\x99\x17\xc9\x9f\xd5\x19\x76\xb6\x3b\x3a\x95\x7a\x25\x2c\xb3\xbd\x2d\xa0\x6c\xcb\x89\x5b\xae\x1e\x97\xf1\xaa\x9b\x26\x67\x9c\xfd\x30\xca\xb3\xb2\x33\x8a\x86\xbc\xad\x52\x1f\x0d\xa3\x8c\x8d\xa3\x73\xce\x26\xb3\xb4\x4c\xa6\xa9\xda\xa2\x40\x79\x1c\x65\x28\x1a\xfa\xfa\xc7\x5a\xab\x91\x5a\x51\x4e\xfb\x22\xa3\x94\x16\x9a\x23\x5f\x80\xf3\x62\xa4\x92\xcd\xda\x95\xdc\xaa\x0b\xe1\x76\x6e\x66\xdf\x64\xd8\xab\xbf\x6c\x2b\xe7\xda\x56\x92\xd0\x2e\x5f\xd9\x02\x12\x2a\x93\xee\xeb\x4d\x05\x1e\x06\xc1\xe7\xf5\x45\xe1\xbe\x92\xb5\xa5\x3e\xd7\xd2\x3c\xe3\x98\x31\x18\x0d\x21\x31\xf5\x4f\x1c\xcb\x4b\x45\x70\x7b\x3c\xe7\x85\x48\xf2\xcc\x33\x65\x8c\xe2\xd8\xc4\xf0\x89\x7f\x45\x10\x6b\xb0\xe9\x1d\xff\x9d\xe3\xa8\xf3\x27\x9e\xff\x8e\x2a\x95\x3e\x37\x55\xce\x6a\xfa\xde\x74\xdc\x3f\xe9\x96\xf9\x2f\xd3\xa9\x3d\xaa\xd5\x03\x96\xb2\x99\x3c\x1c\xbc\x37\xd6\x59\xfe\x5b\xb4\xc1\x8a\x29\x48\xfd\xa6\x9c\xab\x3f\x77\xbd\xb2\xb9\xc7\x25\xad\x74\xe5\x18\x02\x1d\x0e\xde\x9b\x9c\x3a\x33\xc5\x30\x41\x32\xb9\x6c\x42\x2d\x1e\x03\x26\xa5\x2c\xe6\x7c\xaa\x13\xe7\x47\x42\x50\x75\x83\x77\x1a\x19\x55\x06\x66\x9b\x36\x53\x48\x61\xd4\x5b\xfc\x27\x38\x60\x3e\xbd\x84\x34\x4d\x9f\xb0\x62\xeb\x8a\x4c\xba\xce\x8b\x5c\xd1\xa3\xe0\x8d\xc4\x91\x66\xe6\xb7\x89\x6f\x34\x12\x6d\xdd\x28\x4d\xc9\x05\xdb\x18\xa7\x49\xfb\xbd\x17\x1a\x10\xf7\x31\x9b\xbf\xa6\xb5\x8a\x7a\xe1\xcb\x46\xbf\xaa\x50\x1a\x6e\xb1\x72\xbd\x56\x9b\x8d\x0a\xb7\xb1\xa4\xd5\x30\x76\xbb\x4b\x0c\x68\x1d\x13\xe2\xfa\x83\x1b\x2b\xb6\x74\xe7\x0d\x38\x72\x1b\xd6\xa4\x6e\x81\x81\xb1\x5f\xdd\x31\x4f\x51\x27\xa1\xb8\x48\x20\x1c\xbf\x84\x31\x52\x5f\x24\xb8\xc1\x6e\x27\x68\x66\x69\xc4\x26\xc7\xd2\x92\x88\x01\x19\x2f\x5e\x29\x89\x52\x51\xdd\xb5\x94\x4d\x67\xf2\x5c\x57\x50\x72\x41\xe8\x29\x34\x1f\xdb\x15\xa8\xaa\xc3\x31\xcd\x89\x3b\x28\x78\x74\xe6\xcb\x08\x34\x92\xfb\x3c\x94\xb0\xab\xb7\x41\x8c\x60\xd4\xf7\x59\xa3\x23\x2f\xc8\x6f\x2b\xf8\xbd\x9d\x87\xa0\xc6\x83\x20\x87\xd4\xc5\xa9\xdc\xa9\xc8\x4f\xf6\x81\x18\x5a\x0f\x3f\x0b\x1b\x02\xfa\x68\x1a\x9a\x5d\x07\x15\x95\x64\x8d\x4e\x34\xf2\xb7\x3c\x7b\xd7\x3c\x9d\x7e\x60\x8d\xb0\xfb\xe6\xd5\x52\xd9\x9c\x7e\xfa\x84\x3b\x97\xfd\x69\x72\x26\x05\xf1\xd0\x3a\x59\xbf\x24\x28\x8e\xff\x8a\xeb\x92\xc8\xe4\x71\x0c\xdd\x49\x19\x1b\x82\x8a\x24\x43\xa5\xeb\xf4\x0e\x1b\xb2\x5f\x7e\xd1\x70\x7c\x7a\x47\x31\x3b\xf6\xa1\xed\x22\x78\xde\xd1\x57\xb2\x2f\xf1\x7a\xb9\xd4\xf3\xa2\x1b\x12\xc8\xe5\x2a\xe7\xdd\xa4\x32\xae\xd6\xe2\xa7\x10\xea\xa0\x37\x8e\xb2\x53\xcc\xdf\xda\x54\x3b\xf5\x94\x18\x6f\xa8\xea\xc1\x1d\x3d\xdc\xf3\x75\x24\xfa\xb6\x8b\xc0\x8e\xfb\x33\x2c\xef\x7f\x63\xc1\xf5\x14\xd7\xeb\xd0\x03\x31\x7b\x2f\x44\x47\xb1\x76\x07\xd6\x01\x04\x15\xd3\x47\x30\x2c\x44\x7d\xc2\x03\xa3\xe0\xc6\x0e\x4b\x23\x28\x2b\xcb\x4e\x1b\x51\x96\x4c\x20\x93\x7e\x27\xe6\xa9\xdc\xa9\x58\x63\x82\x51\x8c\x69\xd1\xac\x80\x3f\x68\xa9\x3c\x15\x4e\x21\x9b\x53\x47\x6b\x45\x65\xf1\xf4\x43\x6d\x71\xe7\xc3\x22\x80\xcb\x1a\x00\x91\xfc\xc9\x49\xd1\x00\x1e\x08\x29\x28\x7c\xe8\x0c\xf2\xb2\xcc\x27\x8d\xba\x82\x4e\xca\x47\x65\xa7\x88\xe2\x64\x26\xea\x81\xe0\x09\x72\x21\xd4\x45\x12\x97\xe3\x40\xb1\xec\xa2\xe6\x73\x6d\x9d\xda\xbe\x00\x95\xba\xef\xb5\xcd\x89\x69\x34\x4c\xb2\xd3\x40\x49\x99\x4f\xc3\x5f\x17\x50\x46\x42\x2c\x20\x8b\x04\xa9\x43\xa8\xee\x3b\x3c\x06\xd7\x96\x62\x26\xb0\xda\x62\x9e\xc5\xb5\x65\xe3\xbc\x48\xfe\xcc\xb3\x32\x4a\xe7\x10\x43\x94\x51\x51\x4f\x44\x50\xec\x0c\x83\x0d\x20\x07\x38\x55\x3e\x74\xc4\x38\x8a\xf3\x0b\xda\xd0\x30\x4f\x67\x93\xac\x73\x1a\x4d\x03\x5f\xe5\x6e\x5e\xf3\xb9\x8a\x92\x2a\xac\x7c\x1f\xa5\xfc\x43\x67\x10\x89\xc4\x99\x10\x50\xef\x78\x0b\xc6\x7e\x94\xab\xbc\x8c\x48\xd1\x98\xcb\x89\xb5\xbf\x25\x27\x90\x8a\x29\x2f\xcb\x30\x4f\xa5\xf9\x29\x10\x08\x1b\x08\x95\xf8\x08\x4f\xa2\xe2\x34\xc9\x08\x20\x7e\x40\x3e\x68\x54\xbf\x23\x07\x84\x0a\x2a\xeb\x5c\x15\xf8\xab\x4f\x7d\xae\xac\x23\xf5\xdd\x5b\x0f\x93\xe8\x43\x60\x34\xf2\x6b\x85\xf4\xaa\x01\x9e\xc5\x81\xaf\xc0\x59\xee\x77\x71\x56\xb3\x0b\xba\x45\x97\x95\x22\x7f\x22\x25\x36\xf5\x94\xa7\xa5\x55\x9c\x93\x2c\x54\x25\x09\x70\x96\xfc\x38\xa7\x17\x52\x5a\x99\xe3\x5c\x0e\x84\x02\xc3\x87\x4e\x3e\x1a\x09\x4e\x5b\xc9\x67\x65\x9a\x64\x9c\x40\xaa\x2f\x55\x50\x53\xe2\x77\x36\x8d\xe2\x38\xc9\x4e\x09\xa4\xfa\x12\xe0\x10\x5d\xe2\xb3\x88\xfe\x5e\xe1\x11\x5d\xe0\x31\x89\xfe\x5c\x61\x5a\xd3\x75\x85\x6b\x75\x89\xc7\x2d\xfa\x73\x85\x5d\xa6\xbc\x10\x53\x3e\x2c\x93\x73\xde\xc1\xf7\x33\xe4\x99\xbf\xd7\x16\x5f\xda\x62\x52\x6a\x9b\x2c\xdc\x35\xde\x10\xe3\x68\xca\x3b\xc8\xae\xa4\x67\xc9\x6c\x04\xaa\xe4\x1f\xca\x4e\x92\xc5\x3c\x73\xd0\x83\xcf\xa2\x2c\xf2\x33\x5e\xf3\xb9\x32\x51\x65\x3e\xa5\x90\x45\x94\x89\x51\x5e\x4c\x14\xfa\x64\x6c\x7e\x91\x33\xf0\x4a\xe1\xe5\xbc\xc2\x3f\xfd\xc2\x24\x2c\xe5\xd0\xb2\x80\x98\x63\x0e\x82\x28\x4d\x4e\x29\xb1\x60\x8c\x64\x54\x17\x79\x11\x07\xf6\xc9\x5e\x8f\xbd\xcc\x4b\x9b\x9e\x6b\x6a\xc2\xf9\x75\xb1\xf4\x17\xc1\x21\x25\x4c\x04\x26\x82\x2a\x8d\x3a\x18\xcd\x4a\x79\x0f\x63\x4f\x33\x50\xf3\x9d\x22\x76\x5d\xf7\xcc\xf1\xa4\x2a\xfb\xfd\xb2\xe6\xfb\x20\x9d\x15\x35\x45\x62\x5a\xf0\x28\xae\x1c\x1c\xb0\xf8\xaa\xfb\x00\xce\x78\x00\x09\x5a\x70\x59\x57\x40\xd0\x08\x05\x1f\xfd\x26\xa3\x14\xff\xa5\x7c\xf7\x94\xef\xae\x99\x18\x46\x50\xff\x4f\xe8\xdd\x21\x22\x69\x6d\x46\x81\xb5\xaf\x62\x5d\x66\x3b\xf0\xd8\x2c\x1f\xbc\x57\xfe\x17\x5a\x1d\x05\x37\x7a\x47\xdd\x5c\x13\xba\xd4\x56\xfd\xa8\x59\x52\x5d\x91\x6d\x58\x55\xe4\x52\x30\xc7\x35\x81\x54\xf5\x37\x1d\x21\x15\x7f\xb3\x2b\x88\x97\x89\x2e\x6d\x46\x33\x6d\x54\xa0\xd6\x47\x0a\xa7\xd9\x28\x5e\x5e\x44\x53\xa5\x68\x61\x83\x4b\x76\x9a\x9c\xf3\x0c\xf6\x31\xff\x79\x13\x94\x99\x57\xd6\x96\x4c\x1b\xa2\x55\x55\xce\xc6\x2c\x24\xa4\x73\xae\x00\x19\xfb\x10\xef\xf5\x9e\x4d\xa2\xe9\x94\xc7\xb6\x1f\xa2\x03\x9a\x44\x53\xb8\xea\x8b\x1f\x2f\x25\x35\xa9\x06\x82\x2a\x57\xa8\x8a\x18\x5e\x98\xed\x5a\x4b\x4a\x3e\xf1\x94\x15\x78\xa3\x7e\xa3\x43\xac\x49\x08\xa7\x49\xd0\x52\x04\xed\x02\x90\x26\x65\x6e\x23\x07\x7e\x09\xca\x19\x0b\x82\x31\x9f\xf0\x36\x68\x82\xc8\x23\x35\xb4\x2e\x50\x23\x24\x1b\x13\xcb\x19\x3e\xfa\x44\xb7\xc6\x05\xc6\xe6\x91\x3e\xf4\xc8\x4e\x0c\x85\x1c\xaa\x8b\x21\xa2\xe5\xc6\xd3\xc7\xaf\x5a\x1f\xb5\x07\xb6\xbd\xae\xea\xbe\xfb\x3e\x4f\xb2\x66\xa3\xdd\x30\xaa\x75\xaa\x32\x85\xed\x6c\xad\xe5\xe6\xd8\xaa\x51\xb1\x1f\xaf\x9d\xb4\x0c\x64\x00\xd3\xe3\xb5\x13\x17\x59\xd3\xa3\xa3\xe2\x97\xcd\x54\x83\x83\x54\x95\xf4\xd6\x9e\x8c\xf4\xee\x30\xd4\x62\x2e\xf5\xde\x8d\x28\x41\x58\x23\xc8\x6a\xea\x9d\xae\x96\xd7\xcc\x4c\x23\xdc\xcd\xb9\xad\xd6\x56\xd6\x18\xc0\x26\x82\xe9\x87\x04\x68\xe9\x33\xf8\xca\x5b\x7a\x15\x42\xb5\x59\x22\x9e\xa9\x3e\xc8\x4b\x10\xc6\x2c\xc0\xe4\x1a\x87\x83\xf7\x56\x51\xad\xbe\x0f\x67\xa2\xcc\x27\xaf\x68\x69\xcb\xe1\xa5\x15\xcf\xd7\xeb\xf8\x44\x9b\x56\x42\xd0\x4b\xd9\x0b\xc8\x76\x82\x45\xd9\x25\xcb\x72\xb8\xfe\x65\x71\x54\xd0\xf7\x34\x1b\x3d\x21\xdc\xa3\x31\xb6\x44\x6d\xbb\x05\x11\x72\xc0\x97\xa9\x51\xa0\xe2\x48\xeb\x5b\x72\xa8\x40\xad\x59\x5f\x45\x42\x40\x90\xe5\x19\x98\xe1\xa7\x29\x73\xd0\xd4\xd6\xc2\xea\x14\x3a\xe3\x97\x42\xbd\x2a\x99\x78\x65\x9e\x3d\xef\x20\x12\x5c\xbf\xb2\x84\x68\xec\xc6\xed\x40\xfe\xd7\x75\x4e\xfc\x40\x1a\xa1\xa5\x6a\x81\xdd\x27\x25\x9c\x89\xee\x74\x26\xc6\xcd\xd0\x12\x36\xf5\xda\x06\xc7\x36\xc5\x10\xfa\x78\x9e\x1d\x0e\xde\xb7\xe8\xf3\x12\x9e\x8a\xb4\x71\x1f\x8d\x5d\xc7\xe5\xc1\xc6\xbc\x20\xce\x03\xbd\x1e\x3c\x52\x68\xa1\x08\xe7\x13\x4c\xd4\x50\x40\xc1\x23\x9a\xe6\xb1\x0f\x91\xce\xf6\xc9\xee\xe8\xfd\xf0\xe3\x4a\x68\xfc\xf3\x6b\xb7\x42\xe1\x3f\x56\x3c\x67\xb8\xf9\x7b\x09\xb2\x18\xb9\xb4\x68\x39\x00\x76\x17\x30\x12\xc2\x5b\x2c\x5a\x40\x95\x39\x9a\xec\xc6\x49\xc1\x87\x65\x7a\xf9\x19\x3b\xcf\xd2\x06\xf8\x7a\x75\xb5\x59\x39\x8e\x4a\xed\x86\x02\xa1\x3e\x93\x28\xad\x62\x7e\xfd\x8d\x49\xa3\x82\xd3\x28\xaf\x64\xf9\x2c\x40\x12\x85\xc0\x45\x24\x8c\x23\x60\x14\xc7\x78\xa9\x0b\x98\x7a\x2d\x58\xdb\xa4\xbc\xba\xa5\x55\x9e\x76\x08\xb4\xe3\x14\x5b\xe4\xd3\x97\x18\x68\x97\x40\x68\xa3\x3d\x6d\xc6\xfa\x7c\x54\x79\xfa\x67\x71\xce\x45\xd6\x50\xf7\x55\x33\x1e\x15\x40\x94\x75\xe4\xc8\x20\x36\x61\x9e\x71\xf3\x34\x45\xdf\xca\xd5\x06\x7b\xc7\x7b\x31\xbf\x7b\x97\x35\xed\x60\xe4\xfe\x0b\x41\x4b\x81\x73\x9b\x1a\xdb\x56\xcb\x35\xfc\x97\xc2\x5d\x16\xdb\x47\x48\x60\xb8\xa7\x60\x78\x9d\x17\x4d\x5f\xca\xfe\x78\xd5\x36\xe3\x6e\x53\x64\x54\x80\xcd\xd6\xb1\x2e\xb5\xee\xb4\x6a\xbd\xa2\xb5\x84\x66\x5a\x3d\x5a\xc7\x93\xcd\xce\x83\x8d\x26\x6a\x6d\x0a\x6d\xd3\x6c\xcf\x45\x1b\x8d\x14\x6d\x9d\x39\x90\x2b\x76\xa9\xf6\x7a\x3a\xab\xbc\x3d\x14\x1d\xe3\x6b\xd0\x15\xc4\xf9\x0c\x52\xd0\x1a\x09\x8f\x5a\x19\x13\x02\xf8\x6f\x67\xe7\xfe\xc3\x2a\xd2\x54\x8e\x34\x52\xb4\xc8\x38\x8f\x85\x72\xa3\xb7\x16\x96\x0b\xed\x55\xbd\x82\xcf\x93\x07\x74\x6d\xd3\xef\x91\x6a\x9f\xac\x22\x97\x15\x9c\x98\x34\x0b\xd7\x8c\xf3\x1c\x4a\x73\xaa\x38\x96\xad\x0b\x2c\x35\x88\x89\x25\xca\x01\x6a\x32\x94\x8c\x6d\xe6\xa8\x40\xbb\x1c\xd4\xda\xe8\x26\xef\xd4\x8a\xa6\xee\xb1\xb8\xc8\x0c\x63\x19\x7b\x4c\x6b\x3f\x3b\xc7\x32\xd3\x3c\x0b\x13\x96\x36\x76\x9a\x01\x5a\x57\xc0\x34\xf1\xe5\x2d\xb3\x45\x83\x9b\x5d\x91\xbf\xfd\x63\x93\x1c\x9c\xfe\xab\xf4\x9c\x5b\x84\x7f\x94\xb7\x1c\xaf\xf4\x27\x40\x75\x70\x0f\x75\xb5\x6d\xa8\x52\xe3\x93\x69\x49\x1c\xa4\xc8\x94\x08\x1a\xc7\xab\xce\x09\xd0\x1c\xa5\xd6\x3b\xb2\x79\x03\x4b\xa1\xcf\xb9\x44\xb4\xea\x02\xa2\x85\x59\xc4\x9b\xae\x45\xd3\x59\x33\x8f\xb5\x02\x8f\x3b\x6b\xd7\x92\xd1\x77\x57\x6e\x30\x69\xcb\x4f\xd9\x95\x39\xee\x5e\x44\x97\x03\xce\x22\x70\xdb\x98\x95\x5a\x6d\x40\xec\xcd\xd0\xdc\x19\x7b\xd3\x57\x10\xc6\xec\x54\x3b\x83\x95\x24\x6f\xd4\x75\x4b\x77\x5b\xe1\xc7\xfb\x7a\x12\xc7\x82\x4d\x73\x21\x92\x41\x92\x26\xb8\xa1\x5f\x14\x49\xc9\x19\x2a\x7b\x79\x7c\x63\x67\x19\x54\xc4\xdd\xc4\x57\x46\x1e\xd1\xcb\x9b\x9c\x2c\x65\x8a\x0e\x57\x10\x34\x44\xcf\x33\xce\x06\x97\xf0\x0f\xe6\xbf\x18\xe5\xc5\x24\x2a\x41\x88\xfc\x02\x96\xe6\x01\x96\x77\xf6\xad\x6b\x5b\x9c\xd7\x1e\x3f\xb7\x62\x79\xbe\xb5\xf6\x8d\x65\xde\xd2\x8c\xab\x94\x22\xbe\x5e\x89\xac\x57\xb8\xeb\x18\x5d\x57\xc1\x4f\x67\xa9\xce\x13\xd7\x55\x6e\x15\x14\x3c\x4d\xc0\x11\x7f\xc0\xd3\xfc\x82\x5d\x24\x69\x2a\xe5\x0d\xf3\x92\xa3\xde\x45\xb4\xc7\x8f\x75\xc1\x1c\x5c\xa2\x57\xa6\xcd\x98\x6f\x4e\x03\x88\xe6\x87\xaa\x69\xfa\xed\x63\xd8\xa0\x04\x94\xa4\xf5\xc6\x2c\xba\x58\xdb\x9b\x58\x70\xcf\xde\xc4\x2f\x50\x8f\x8c\xfe\x67\x7c\x4a\xf4\xbf\xea\x97\xc7\xca\x77\x6d\x6b\x41\x0a\x88\xa1\x81\xfe\x3a\x4a\xf9\x07\xfb\x4b\xbf\xb1\xeb\xdf\xe6\x89\x54\x7f\x30\xef\xae\xa6\xd5\xc0\x73\x9c\x2e\x33\x45\xde\xa7\x04\x1f\x79\x91\x41\xac\x11\x72\x1d\x83\x58\xa1\xc8\xe1\x08\xc1\x92\x4c\x24\x31\x67\xf8\xb0\xc0\x87\x25\x6c\x79\xec\x59\x5e\x30\xde\x3d\xed\xee\xb0\xd5\x8f\x7a\x36\x76\xd8\xf1\x5a\x9b\xad\x9d\x5c\xad\xb2\xbd\x7f\xb2\xd5\xc0\x7c\xed\xb0\x35\xb6\xb6\xbb\x1a\xe0\x09\xb8\xec\x87\x18\x43\x17\x48\xee\xb0\xcd\xa0\xe6\xbc\xd7\x63\x81\x4e\xcc\x23\x29\xa8\xd3\x5d\x18\x59\x50\x4b\x8d\x69\x54\x80\x29\xb6\xdc\xee\x06\xb3\x24\x85\x3b\xf3\x30\x2f\xe4\x95\x43\x53\x03\x15\x05\xe8\xd7\x46\xe8\x61\x47\x53\x1d\x06\xc1\x5f\x4f\x34\xee\x82\xf0\xe2\xba\x86\xb1\x55\xd4\xeb\xaf\xfa\xa5\xcd\x57\xd4\x4f\xb4\xf7\x58\x83\x04\x36\x84\x7f\x6e\xd6\x8a\xa5\x8a\x6e\x29\x2a\xcb\x68\x38\x9e\x40\x26\x15\x88\xde\xa0\xdc\xce\xd2\xbc\xa0\x1f\x92\x49\x74\xca\xe9\x07\x3b\x2d\xf6\x5b\xc1\xa7\x3c\x52\xed\x98\x1e\xd5\x12\xc5\xde\xd4\xdb\xac\xad\x22\x70\xef\x0d\xf6\xac\x9b\x70\x57\xe9\x2d\x34\xa4\x17\xf6\x2d\x34\x65\x76\x9a\x5b\x68\x4b\x6d\x4e\x37\x68\xc9\xec\x21\x37\xc1\x46\xee\xfd\x1d\x94\x29\x0c\xbb\x5d\x4e\x17\x4e\x3e\xe1\x10\xdd\x14\xdd\x92\xb0\x21\x7d\x57\xa6\x15\xf5\xe3\x3e\xfd\xd6\x28\x93\x49\x92\x9d\x76\x4c\xf8\x49\x5a\x88\x65\xcf\x54\x91\x2a\x81\xf7\x7c\xce\x63\x15\x59\x0e\x2e\x79\xb8\x94\x27\x49\x1a\xa9\x78\xe4\xee\x13\x3e\x18\xb3\x76\x86\x91\xe0\xfa\x7e\x1e\x5d\xba\x03\x30\x86\x96\x1a\xff\x2c\x9a\xf0\x2f\x8a\xbb\xb9\x9f\x4a\x61\xf8\xfa\x88\x2b\x0c\xf0\x5d\x3b\xc9\xb3\xce\x30\x9f\x81\x91\x08\x99\x27\x5d\xb6\x2f\x8b\x6e\x09\x03\xd0\xd0\xf8\x74\x18\x25\x69\xda\x99\xe4\x31\x77\xfa\x97\x5f\x5f\xe4\x31\xbf\x9d\x9e\x1b\xd3\x34\xba\xec\x88\x32\x2a\xdd\x5e\xe4\xe7\x23\xf9\x15\x3f\xde\xa8\x97\xab\xea\x19\x8f\xdc\xf0\xc1\x6c\xb3\x97\x76\xff\x4d\x67\x85\xf9\x81\x66\x1b\xe6\x67\x75\x57\xcd\x04\xf7\xf6\x4b\x6a\x8a\xb1\x44\x47\xb5\x4b\x79\x99\xe3\x3f\xf4\x28\x92\x90\xd3\x1f\xc5\x53\xf7\xe4\x4f\xb2\x61\x3a\x8b\xb9\x2f\x0c\x59\x2d\x98\xaa\xac\xca\x1b\xa4\x15\x3c\x2f\x9d\xc7\x11\x72\x6a\xfa\xdf\x3f\x56\x0e\x0f\xec\x6a\xc7\xef\xba\xfe\x6c\x53\x66\x53\xbe\x78\xe9\xec\x57\xb4\x14\x3e\x99\xf6\x46\xb9\x5c\x1e\x1f\xe9\xc6\xa9\xcc\x35\x61\x6f\x6c\x6b\x35\x55\x12\x49\x38\x2c\x52\x3f\x55\xe1\x85\x36\xe1\x84\x32\xfc\xd5\xd0\x3b\x71\xc1\xcb\xe1\xd8\x36\x09\x3f\x75\x21\xe2\x6d\x0d\x46\xd5\xca\x89\x26\x49\x7a\xa9\x0b\xf0\x97\x2a\x92\xbb\xfe\xbf\x75\x6f\xd4\x2a\xe8\xc6\xeb\xcb\x33\x31\xa2\x3f\x0d\xa1\x40\xd0\x45\x42\x9d\x16\xf9\xc5\x8e\xb2\x80\x95\x7f\x2b\xfc\xc0\x18\x76\xc7\xb1\x8c\x6d\xfb\x3b\x07\x16\x9a\x0f\x9a\x86\x45\x34\xd5\x65\xf2\x6f\x4d\x8b\xd4\xf6\x23\xff\xd6\x94\x1b\x17\x49\x76\xa6\x0b\xf0\x97\xc1\x13\x0c\xc5\xcc\x8c\xf2\x74\xb4\xc3\x1a\xf0\xad\x23\x7f\x34\xcc\xf6\x38\x11\xa6\x00\x7e\x35\xf4\x02\xcb\x4a\x10\x93\x54\x99\xfa\xdd\xa0\xab\x8d\xde\x15\xbf\xb1\x0c\x30\x75\x19\x4f\x7e\xe5\x59\x9c\x17\x2a\x4d\x4e\x61\x52\x19\xeb\x82\x5a\xdb\x9d\x75\x6d\xe3\x73\x6e\xe0\x5c\xfb\x9d\xdf\x92\x34\x1e\x46\x45\xdc\xb4\x8d\xcd\x33\xf7\x31\xe0\xca\xee\x06\x42\x31\x86\x8c\x7d\x5c\x63\x20\x62\x37\xe3\xbb\x90\x9a\x26\xec\x63\x5d\x8d\x4f\xe9\xf2\xc1\x8d\xb5\xdd\x4f\xab\x55\xe7\x83\x0a\x21\x8d\x55\x99\x43\x6b\x40\xd6\xf5\x32\xc5\x1c\xb9\xc4\x8b\x4a\xd1\x52\xc5\xe8\x84\x4b\xb6\x13\xde\x80\x5d\x8c\x79\x06\x8f\x00\x0b\x62\x18\xcc\xd5\x42\xb9\x53\x5e\xab\x8d\x5a\x90\xa4\x09\x34\x6d\x67\xfc\x72\x54\x44\x13\x4e\x95\x9b\x3a\xaa\x0d\xc3\x9c\x5b\xf7\xd5\xa8\xba\x38\xaa\xee\x50\x08\x76\xdf\x00\xd9\x08\x45\x5e\x60\xfe\xff\x98\x1b\xd6\xfc\x97\x07\xe5\x59\x06\x2e\x4b\xaf\x30\x4b\x3c\x89\x25\xa4\xe2\x28\x62\x84\x2a\x0c\x57\xcb\xf6\xf4\xf8\x9d\xcf\xb0\x7c\x9d\xd0\x91\xa0\xc9\x74\x6a\xde\xbd\xeb\x35\xa5\x13\xdc\xb5\x5c\x04\x4c\xdc\x30\x17\x3d\xfd\x3c\x57\x8f\x9f\xf1\x22\xf4\x10\x44\xdf\x30\xa7\x6f\x6d\x23\x17\xc4\x16\xdb\xa1\xe8\xfe\x6a\xfc\x17\x95\x69\x9d\x8b\x92\x83\x31\x84\xba\xb2\xe3\xf9\xf4\x89\x02\xfb\x4f\x2f\x16\x70\xde\x6b\x80\xd6\x34\xba\xe4\xfb\xf4\x89\x99\x8c\x10\x2e\xa2\x9f\x3e\xd9\x14\xfc\xac\x26\x46\xed\x0d\xfd\xe9\xc2\x34\x9e\x7a\xa4\xad\x51\x51\x06\xd2\x8e\xb5\x6f\xdd\xd1\x6e\x6b\xed\x36\x53\x3c\xdc\x62\xc8\xc3\x0a\xbf\x56\x0a\x74\xeb\x8e\x16\x06\xf6\x50\xe2\x2b\x6a\x6d\x52\x55\x49\xd8\xf2\xf5\x61\xcb\x05\x9c\x67\xf3\x8a\x10\xa6\x42\x08\x9f\xf0\xe9\xb9\x51\x5f\x67\x5e\x7f\x15\xe0\x6a\x33\x9a\x46\xe1\x7e\xb7\x6a\x2a\x2c\xd5\xe9\xaf\x8a\x4d\xbf\x46\x98\x8b\x5a\xc7\x48\x24\xf9\x8e\x99\x1d\x02\x01\xae\x12\x3e\x85\x76\x42\x24\xae\xab\xa4\x96\x8a\x4f\x1c\x02\xbe\x72\xb5\x6b\xf2\x4f\xdf\x03\x47\xcf\x5f\x9d\x33\x1b\xe3\xcf\x81\xc1\x65\x46\x6c\x03\x46\x3c\x2a\x67\x05\x67\x25\x06\x58\xc6\x47\x67\xdd\xca\x0f\xc3\x7c\x7a\x89\x11\x56\x0f\x53\x7e\xca\x8e\xd2\x7c\x90\xc7\xe2\x2c\x4f\xd8\xfa\x5a\x7f\x4b\x43\x5d\xf0\x81\x48\x4a\xce\xc6\x65\x39\x15\x3b\xbd\xde\x69\x52\x8e\x67\x83\xee\x30\x9f\xf4\xde\x0b\x54\x55\xf6\x86\x42\x74\x70\xa7\xd1\xb5\xd2\x64\xc8\x33\xc1\xd9\x8b\xe7\x6f\xf0\x53\xcf\x1a\x89\xdb\x95\x50\x25\x66\x60\xf9\x51\xae\x9e\x4b\xd3\x39\x4b\x77\x0e\x69\xab\x22\xf4\xed\xe6\x51\xf9\x32\x22\x74\x85\x10\xd6\x6e\xfe\x79\xf6\x63\x91\x5f\x08\x5e\x27\x44\xf7\xd7\x37\x5a\x01\xe8\xf9\x46\xf6\x06\xac\xf5\xe5\xf7\x33\xb8\x0c\x26\x7f\xd6\x6f\x27\x9b\x15\xd0\x79\xad\x6b\x98\xaf\x98\x97\x10\xa2\xa8\xeb\x18\xdf\x18\x13\x60\x38\xe6\x3a\xfa\x1a\x18\xfa\x51\xca\xd3\xe8\x1d\xc0\x02\x50\x3f\xce\x87\x10\x61\x40\x25\x2b\x3f\x48\x21\x59\x45\xb3\x31\x6d\x60\xc4\x00\xb5\x1f\xdc\x63\xbf\xe1\x02\x67\xfc\x9c\x17\x97\x76\xf1\xe7\x99\x27\xd8\x2b\x12\xea\x94\x17\xec\x1e\x3b\xcc\x86\x58\x97\xc7\x6d\x6d\xd3\x9a\x08\xc4\x36\xee\xb2\xe7\x25\x58\xf7\x0b\x36\x13\x6c\x36\x95\x17\x83\x07\x6b\x7f\x67\x53\x5e\x8c\xd8\x20\xcf\x85\x6e\x45\xee\x0c\x3b\xbd\xde\x7b\x21\x4b\x60\x63\xe0\x88\x2b\xea\x2c\x3a\xa8\x8b\xe9\x44\x10\xd7\xb6\x73\x2e\x3a\xd3\x34\x4a\xb2\x8e\xf6\x47\x57\x3b\xd2\x3d\x06\x57\x83\x34\x55\xc4\x02\xdd\xc0\x59\x96\x5f\x64\x4c\xca\xee\x44\x51\x04\x0f\x47\xf1\x6c\xc8\x59\x34\xc9\x67\x59\xc9\xf2\x11\x36\x40\x2d\x05\xd0\x68\x49\xc2\xd2\x4d\x90\x45\x25\x2b\x66\x59\x99\x4c\xb8\x8b\x7c\x1c\x9d\x27\xf1\x45\x94\x8a\x31\xa4\xa4\xef\x21\xe5\x3a\x48\xb9\x15\xdc\xc0\x74\xc0\x18\x65\x2f\xb0\xa7\xf2\x3a\x75\x4f\x79\xb9\xaf\x3e\xe2\x65\xc1\xcc\x9c\xfe\x43\xcd\x5d\x5b\xc7\xc3\xf0\xef\x83\xba\x4d\xe7\xe1\x3d\x11\x2f\xa3\x97\x4d\xbc\xf5\x01\x49\x8e\x35\x18\x5c\xf9\x30\x66\x1a\xf9\xe0\x67\x69\x7e\x23\xc7\x0b\x46\x5c\x56\x4b\x26\xec\xc6\xd1\x56\x5c\x4e\x3e\x59\x40\x20\xbe\xde\xd1\xef\x69\x06\x4a\x46\x9a\x87\xe2\x2e\x7b\xad\x6a\xbf\x03\x41\xff\x9d\x2c\xcc\xf2\xd2\x36\xe6\x5f\x14\xa9\xa1\xa6\x17\xf9\x30\x60\xff\xfd\x49\x1b\x87\xcd\xbd\x55\xd6\xdc\x6d\x74\x10\xe4\x67\x79\xc1\x04\x2f\xce\x79\xd1\x01\xed\x60\xc1\x33\x1b\x49\x1c\x68\xcc\xad\x6f\x81\xac\xa9\x6d\xb9\x7f\xe3\x18\x01\x4f\x0e\x08\x97\x07\x64\xee\x42\xdc\x2f\x79\xd9\x66\x29\x2f\x05\x8b\x73\x88\x84\x25\x21\x74\x8b\x38\x51\x53\xd7\x5a\x57\x87\x32\xb1\x65\xc6\x68\x1c\xf7\x26\xad\x14\x33\xe4\x65\x03\x3e\x8c\xe4\x41\x72\xc1\xd9\x30\xca\x1a\x88\x06\x9b\x09\xb4\x42\xe9\xf5\x60\x4d\x88\xcb\xac\x8c\x3e\x00\x37\xf1\xee\x69\x57\x72\xd2\xb3\x67\xca\x8f\x50\xcf\x7e\x70\xee\x59\x24\x58\x22\x97\xba\x46\x1b\xec\x8c\xcc\x66\xea\x44\x13\x42\x8a\x26\x19\xe3\x69\xd7\x0d\x12\x49\x86\xba\xa7\xc8\x67\x32\x0a\xce\xef\x9e\xb0\x97\xe2\xad\xee\x0a\xb1\xac\x09\xc8\x05\xdd\xf7\xf2\xfa\x3e\x07\x4d\x0c\xd3\x53\x8b\xac\x8f\x6e\xa8\x0b\x54\x11\xe8\x81\x54\x12\xfc\xb9\x0d\xf8\xa1\x7c\x43\x73\x5c\xbd\xea\x7c\x63\x49\xbf\x82\xa2\x85\xa6\xaf\x1f\x86\xf5\xb8\xf3\x87\x38\xb9\xdf\xec\xb6\x1e\x87\xd2\x3e\xb9\x2b\x5a\xbb\x14\xc9\xfd\x97\x84\x85\xab\xdb\x13\x96\x0a\xc7\xaa\xf1\xaa\xc4\x63\x15\x65\x51\x89\xb9\xa6\xc2\xbd\xa1\x15\x3b\x49\x04\x05\x5f\x75\xd2\xa6\xa1\xd3\xcc\x90\x3d\x66\x43\x37\x4e\x1c\xdb\x01\xa7\x8f\xea\x3c\x7e\x9b\x51\xfa\x6b\x44\x44\x65\x4f\xfc\xff\x82\x7c\xf8\x95\xe4\x37\x2a\xae\x55\xe4\xb9\x05\xf2\xdb\x12\xb2\x9b\x09\xd2\x87\x27\xe8\x54\x25\x8b\x57\xfa\x3f\x79\x90\xa2\xaa\x35\x74\xc6\x2a\x18\xb1\xfc\x61\x5b\xe7\x4f\x69\x83\xf4\xdd\xe8\xe8\xb5\x1a\x25\x74\xbf\x20\x31\xd6\xae\x7b\x04\xdb\xd0\x7b\x24\x54\xbd\x32\xf7\xca\x0b\x16\x31\x0c\x59\x26\x4f\x2f\xf3\x1d\x82\xd8\x36\xfa\x8d\xae\x39\xb9\x2f\x22\x29\x12\x66\xe9\xa5\x22\x2c\x38\x1c\x2b\x3f\x95\x31\x2f\x78\x77\xa5\xea\xa7\xa0\xd5\xb7\x90\xca\x1a\xfc\x11\x50\xfa\x9a\x46\x85\xe0\xcf\xb3\x52\x6b\xd8\xfa\x6b\xad\x56\x5d\x20\x41\xc9\x33\x3f\x81\xfe\xd9\x1c\x7a\xf7\x09\x8c\x95\x0e\x34\x64\x9d\x84\x60\xca\x0d\x29\x0e\x20\x28\x2f\x3f\xe7\x19\x38\x6d\x5d\x80\x61\x6a\x51\xe4\x05\x26\x4b\x9c\x70\xd8\x5e\x45\xdb\x8a\x02\x3a\xaa\x38\x3c\x16\xb1\x3d\xcc\xd3\x00\xc6\x11\x97\x36\x73\x15\x1c\xd2\x38\x7e\x2a\x10\x30\x73\x7a\x1e\xeb\x91\x58\xaf\x60\xc8\xd6\x3c\x8c\x20\x78\x20\x2f\x0a\x57\x18\xb0\x23\x73\x0e\x48\x3f\xfa\xbd\xf6\x42\xfb\x55\xf3\x72\xbd\x60\x12\xc0\xe4\x8e\xb2\xb5\xad\xeb\x98\xe0\x49\xce\x6f\x77\xb8\x61\x01\xc4\xba\xdc\xd5\x8b\x07\x76\x42\x55\x40\xe5\x22\x1e\xe6\xb1\xba\x5d\xc8\xd3\x4e\x9d\x87\xab\xa3\x94\x7f\x58\x95\x5f\x56\x3b\x13\xd1\x91\xbf\x06\xf9\x87\x55\x98\xa1\xe7\x07\xfd\x35\x9b\xf9\x8b\x98\x8a\x6b\xc8\x46\xcb\x60\xd2\x20\xb5\x75\xfa\xa6\x79\xd3\xa3\x11\x0b\xd0\xb6\x6e\xd0\x0b\xe8\x3c\x8f\xc2\x2b\x26\xad\x88\x0b\x14\xaa\xa5\xa6\x7f\x45\xc5\xcc\x17\x5c\x59\xba\x29\x27\xd6\x95\x9a\x71\x29\xaf\xcb\xba\x15\x52\x3d\x9b\xbf\xd1\x58\xf7\xfe\x0b\x28\xf8\x60\x1d\xe5\x45\x69\x0c\x6a\xe5\x0f\xe5\x19\x38\xb8\x64\x68\xcf\xdc\xad\x3c\xa3\x99\x7a\xfe\x0b\x9a\x90\xdf\x64\xf5\x35\x7c\x09\xf0\xb3\x8a\x40\x91\xf6\x92\xee\x20\x88\xb6\x9a\xfe\xe2\xcf\x5f\xea\x95\x54\xa7\xc7\xd7\x89\xd0\xf5\x83\x18\xc9\x38\x0b\xce\xa6\x28\xbb\x77\x61\x48\xf2\x7f\x5a\x35\xa9\xd2\xa6\xd4\xd5\xcd\xcb\x81\xae\x1c\xdc\xdc\x20\xf5\xfa\x23\x75\xaf\xaa\x24\xe3\xbe\x0d\x9b\xed\x6f\x32\x5a\x38\xaa\x5c\x7e\x43\xd7\xc5\x57\x46\x5b\xb2\x5e\xa7\x69\x5b\x54\x71\x63\x8e\xd0\x56\xd7\x57\x2b\x18\x2e\x04\xe5\xa4\x37\x97\xd3\xfc\xb4\x88\xa6\xe3\x4b\x1b\x12\x9b\x4f\x27\xbc\x38\xad\x0d\x19\xb2\xbe\xd9\xaa\xc0\xce\x8f\x9d\xad\x80\xbe\x4e\x8a\xa9\x1e\xfb\x07\xeb\x9f\x0d\xd8\x34\xba\x4c\xf3\x28\x66\xf9\x39\x2f\xc6\x3c\x8a\xf1\x49\x3d\xcd\xe5\xb5\xa9\x87\x03\x4c\x04\xfb\x27\xdb\x38\x1b\x74\x09\x5e\x60\x21\xd4\x24\x22\x95\x42\xe5\x45\x54\x8e\xbb\xa4\x90\xdd\x63\x7d\xbe\xd5\x62\x3d\xf9\x8f\x7b\xe7\xf1\x29\xdb\x9c\x46\x10\xc5\xad\xcd\x4a\xf3\xcd\x46\x45\x7d\x5b\x70\x12\xd0\xc6\x42\x78\x79\xb9\xd9\x63\x52\xa6\x5b\x6c\x61\x60\x18\xf5\xb5\xad\xd6\xa4\x6c\xf1\xfb\x51\x9e\x95\xcf\xc0\x74\x48\x4e\x4d\xc1\x47\x5d\xfb\x45\x03\x56\x60\x9c\x5a\x5e\xf8\xd5\xc6\xea\xeb\x7c\x90\x97\xf9\x6a\x9b\xad\xfe\x9b\xa7\xe7\xbc\x4c\x86\x91\xfc\xf1\xa4\x48\xa2\x74\xb5\xcd\x44\x94\x89\x8e\xe0\x45\x32\x02\x47\x2b\xb7\xb9\x0a\x6e\x47\x4a\xdd\xac\x31\x93\xbf\x29\x5e\xa4\x9c\xc0\xfb\x99\x31\x37\x69\x4f\xb4\x09\xf3\xf1\x37\xb0\x61\xfa\x19\x1e\x5d\x48\x77\xe4\x33\xed\xb5\x0a\x5d\x6d\xc4\xc3\x61\x63\x6d\x8d\x22\x11\x68\xd8\x2b\x7b\x0d\x26\xf8\x55\x64\xf0\x7b\x51\x45\x47\x15\x54\x11\xd2\x2d\x79\x18\x6d\x86\x30\x42\xd8\x1a\x94\x5e\xf0\x38\x99\x4d\xaa\x28\xe1\xf7\x2a\x46\x0e\x7c\xa0\x1d\x0f\xa1\xad\x10\x42\x6e\xdb\x50\x38\x2e\x27\xe9\x33\x8f\x37\xe8\x37\x0d\x1c\x80\xf3\xea\xfa\x7c\xb2\xad\xfb\x0f\x35\x97\x97\x63\xb8\x9a\x83\xae\xab\x6e\xdf\xb5\x5e\x80\xb2\x9d\x36\xa4\x63\xd3\xcc\xdd\x68\xa3\xad\xde\x11\xd8\xf0\xe1\xdf\x84\x0f\xdc\x4f\x6a\x36\xdd\x8f\x48\x0c\xf9\x8d\x22\x88\x01\xe6\x89\x8c\x30\xfd\xf0\x26\x7f\xcd\x27\x4d\x27\xaa\x36\xbd\x1b\xb1\x9e\x4b\x9c\xfb\xac\x51\xf0\x49\xc3\x3f\x60\x61\xa4\x76\xf3\xb6\x63\x53\xd6\xdb\xd8\xcd\x8e\xfe\x43\x99\xe2\x99\xf1\xee\x30\x7f\x61\xeb\xd1\xef\x30\x77\x21\x7a\x94\xd8\xf1\x3f\xf8\x50\x8a\x38\x3b\xd5\x4f\x3e\x24\x52\x6c\xa7\xf2\x45\x9b\x1b\x8a\x69\x1a\x5d\x6e\xee\x18\x41\xc5\x62\xa8\x89\xd8\xef\xaf\xb7\xaa\xac\x5d\x83\xe2\xfc\xe1\x33\x86\x61\x3a\x8f\x30\xfa\xdc\x0e\x6b\x74\xba\x6b\x9b\x7c\xd2\x30\xc5\xc4\x6e\x13\x0f\x91\xfe\xfa\x43\x79\x76\xf4\xd7\x5b\x72\x92\x08\x28\x3a\x80\xfc\x8c\x51\x40\x3b\xdd\xb5\x6d\x52\xa6\x6c\x7f\xd5\xee\xdf\x2d\xf9\x87\xb2\x2b\xf8\x30\xcf\xe2\xa8\xc0\x0c\x31\x57\xce\xf8\x37\xe6\x8d\x7f\x6b\x7b\xc1\xf0\x03\x1b\xd2\xb5\x08\xb0\x3e\x97\x00\x0f\x36\x58\x8f\x6d\x6d\x2f\x1a\xfe\xe6\x0d\x86\xbf\x3e\x6f\xf8\x9b\x5b\xb7\x3a\xfc\xca\xf8\x36\xe5\xfc\x6e\x6e\x7d\xc9\xf1\xf5\xe7\x8d\x6f\x63\xf3\x0b\x8f\xaf\xcf\x7a\x6c\x63\xf3\x8b\x8c\x4f\xca\x6b\xd4\xc1\x25\x34\xbe\xf5\x2f\x3c\xbe\x8d\xf5\xee\x16\xeb\xb1\xf5\xca\x08\x43\xa3\x98\x16\xc9\xc4\x1b\x43\x99\x94\xe9\xfc\x01\xf4\x17\x0c\xa0\x7a\xfa\x5e\x07\xff\xf5\x4d\xc4\xbf\xff\x99\xf8\x8b\xd9\x40\x4e\x03\x71\x69\x0b\x6e\xa2\xb7\xbb\x89\x04\x46\x21\x77\xc9\xca\x2e\xb1\xe4\x18\x06\x79\x3c\x7f\x13\xe8\x2f\x62\xa2\x9b\xce\x81\xc4\xfe\x73\x39\x48\x62\x3f\x77\x89\x2f\xc4\xfe\xa6\xc4\x5f\x03\x16\xfa\xec\x01\x0c\xa3\x29\x75\xaa\x0a\x0e\x61\xd1\x19\x7c\xc3\x21\xf4\xb7\x71\x08\x95\x63\x76\xe9\xbd\x68\x30\x2b\xcb\xf9\x63\xd0\x5f\xcc\x48\x64\x63\x6f\xac\xe7\x6e\x63\x36\x9d\xf2\x62\x18\x09\xde\xb8\x39\xb3\x19\x2d\xca\x55\x1b\x05\x57\x9d\xe2\x7f\x98\xe6\x72\xc3\x04\x9d\x1f\x06\xbd\x35\xf6\x18\x50\x04\x79\x89\x9c\xf0\x88\x54\x79\x72\x9b\xa9\x17\x7a\xf7\xd8\x6f\x07\x3f\xbe\x7a\xb2\xff\x13\xfb\xf5\xc9\x6b\xf6\xfc\xe5\xff\x1c\xec\xbf\x79\x7e\xf8\x92\xdd\xeb\xd9\xb6\xa7\xa8\xcf\x81\xea\xb7\x97\x33\x3b\x2a\xce\x88\x69\x68\xaa\xee\x71\x15\xcb\xd0\x33\x7e\x59\x17\xac\x74\xc3\x3e\xc5\x49\xa8\x79\x8a\x0d\x59\xfe\x5f\xa3\xe8\x79\x85\x8c\xfe\x85\x33\x88\x7f\x05\x0d\x92\xca\x31\x14\x27\xa7\x79\x4d\xfb\xeb\x0f\xd6\x3c\xc0\xb9\x2f\xa9\x00\x61\xdf\x46\x93\xec\xac\xb6\xdd\xbe\x03\x36\xf7\x01\x35\xc9\xce\x0c\xf0\x69\xc1\xeb\x2c\x84\xfb\x0f\xd7\x1c\xb0\x79\x6d\xca\x72\x03\x5c\x80\x3d\x54\x18\xcd\x75\x0a\x35\xaf\xc5\x82\xc7\xd6\xb0\x2f\x9f\x4c\xf2\xac\x16\xcd\xbe\x07\x38\xd7\xfe\x0f\x20\x48\x85\x34\x2f\x5e\x44\x59\x32\x9d\xa5\x18\x85\xb9\x86\x2d\xb6\xbe\x61\x0d\xa1\x1c\x89\xde\x4f\xfc\xfd\x45\x6e\x49\x72\xcf\xb7\xde\xcf\x70\x14\xee\xb0\x46\x71\x3a\x88\xe4\x65\x5b\xfd\x5f\xf7\xe1\x83\x96\xf6\x60\xd3\x67\x4d\x00\x6a\x6b\xb3\x65\xdc\xe6\x44\x34\x48\x79\x1c\x00\xda\x78\xa8\x81\xc6\x09\x78\xab\xd5\x03\x24\x43\xf0\xbb\xab\x07\x88\x93\xf3\x04\x13\xba\xf8\x30\xfd\xf5\x96\x71\x3d\x3c\x1d\x97\x4f\x6b\x01\xd7\x1e\x6c\xb5\x8c\x07\x5e\x92\x4d\x67\x86\x1a\xe8\x3a\xff\x33\xe6\x1a\xf0\xab\x6d\x9a\xf6\xc7\x3c\x9d\xf2\xe2\x0d\x90\x71\x0e\x45\xd2\x68\xc0\xd3\x85\x50\x80\x40\x0d\x94\x9d\x83\x39\xd4\x95\x78\x19\x7f\xc2\x21\x95\x62\x22\x1d\xda\xff\xb3\x66\x6d\x7d\xbb\x35\xc7\x91\xd5\x70\x2b\xee\x05\x7a\x13\x3f\xde\x5a\x3b\x51\xee\xce\xd1\x54\x52\x5f\xaf\x41\x0d\xd0\xbd\x18\x27\xa5\x52\xb9\x44\xd3\xe9\x8f\x51\x51\x69\xa2\xbf\xa6\xdb\x50\x4f\xd4\xcf\x0a\xf0\x71\xf7\xc0\xd6\xd7\xd6\x4e\x34\x7e\xf4\x06\x26\x4a\x3e\xc5\xae\x5d\xf8\x4d\x05\x0f\x8e\x91\x72\x8d\x78\x47\xb0\xfa\xb9\x60\x85\xac\x6f\x6d\xb5\x99\xfd\x9f\x7e\xed\x22\xf1\x00\xd7\xba\xb5\x73\x59\x81\xdc\x0a\x2d\x97\x7a\x28\xba\x66\xea\xa1\xbc\x85\x53\x01\x9c\xbf\x7c\x2a\xe0\xd7\x59\x44\xf5\xa4\xa8\xae\xa4\x7a\xd8\xca\x72\xaa\x07\xad\xac\xa9\xba\x59\x5b\x66\x2a\x96\x59\x5b\x9f\xdd\xfe\xc6\x52\x6b\xac\xf1\xb7\x8d\x35\xf9\xff\x1a\xee\xd2\x72\xf9\xfb\xa1\x59\x36\x35\xeb\xea\xd1\x72\xeb\xea\x51\xcd\xba\xea\xf5\xd8\x9b\xc3\xa7\x87\x3b\xec\xb7\x71\x54\x32\x31\xce\x67\x69\x0c\x26\xae\xb0\x70\x4a\xf0\xe6\x07\xc3\xd8\x51\x5e\xe8\x45\x08\x0d\x3c\x86\xac\x16\x10\x10\x21\x36\xce\x8d\xec\x74\x96\xc4\x7c\xf9\x05\x6b\xce\x5a\x30\xa8\xce\xca\x22\x12\x30\xc3\x4d\x38\xb2\x6d\x14\x67\xb4\x02\xf5\x8e\xf1\x2e\xa9\xf4\x3a\x2a\x93\xbc\x85\xd5\xda\xd5\xed\x69\x90\x42\x34\xc8\x7f\xb0\x07\x9e\xd2\x5a\x8e\xd2\xb9\x3e\x7a\xd1\xb6\x61\xd5\x78\x00\xd5\xa7\x36\x25\xdb\xda\x57\x31\xf3\xb6\xa6\xbe\x7c\xaf\x2a\xb3\x3d\x73\xe1\x53\x5f\xf4\x65\xcb\x02\x54\xeb\x78\x8f\x09\x5a\xa6\x34\x22\xf6\x4e\xa5\x8e\x79\xd5\xd0\xdf\xcd\x46\x46\x30\x30\xdf\x34\x34\x05\x0a\xd5\xf4\xf1\x00\x19\x34\x84\x45\xa5\x65\x53\x82\x26\x4c\x16\x07\xf8\xad\xa1\x74\xa1\x0f\xed\xf7\x2b\x85\xca\x50\xb7\x4e\x63\xe6\xab\xca\x89\x6a\x2e\xda\x97\x53\xf3\xf0\xa2\x8a\x3c\x50\xff\xdd\x11\x78\xa0\x41\x3b\xa2\x6d\x5c\xf3\xf1\xc6\x3c\xc5\x1e\x37\xd4\x5c\x35\xda\xac\x61\x08\x26\x7f\xc0\x30\xe4\x1f\xb2\x1b\xfd\x04\x03\xee\xb4\xe3\x28\xe6\xf2\xde\xf8\x11\xf8\x76\x07\xfe\xb7\x8d\x3c\xba\xa3\x84\x43\x4c\x4a\xa9\x2e\xb7\x5d\x9e\x9d\x77\x5f\x1e\x3e\x3d\x78\x7b\xf0\xf2\x57\x30\xd8\x58\x9d\x16\x79\x3c\x53\x99\x41\x1e\x23\xd2\xfa\x86\x65\x91\x54\xe6\x80\x4d\xec\xf0\x58\xe2\x71\xd2\x6a\xb3\xc6\x8b\xa8\xe4\x45\x12\xa5\x9d\x5f\x9e\xef\xc0\x26\xa1\x46\x83\x84\x7c\xd7\x60\xf7\xf1\xaf\xfb\xac\xf1\xae\x6a\xb0\xd8\x68\xb1\x1d\x6b\x52\xa9\x2c\x41\xb0\x81\xc3\x59\x39\x9d\x95\x9a\x8a\xf5\x0f\x43\xb8\xae\xab\xf2\x87\xd2\x78\x42\xf4\x20\x3b\x39\xe6\x90\x77\x56\x05\x39\xd3\x3d\x3e\x05\xc2\xef\x30\xc2\x46\x72\xeb\xf2\x77\x30\xd5\x0a\x90\x66\x47\xfd\xab\xfa\x87\xb3\x89\x12\x0d\x76\x0e\x72\x7a\x79\xa5\xf0\xad\x6d\x4e\x1e\x39\x32\xa7\x1c\x3f\x2a\x35\x10\x39\x48\x1c\x20\x5b\xa0\x0f\x7a\xb9\xbb\x3b\x20\xf2\x93\x1a\x90\xbb\xcf\xee\xf8\x1f\x6e\xa8\xd7\x59\x51\x91\x8b\xcf\x99\x62\x2a\x1d\x56\xbe\x96\x21\x1b\x96\x21\x1b\x34\x24\x6f\x9c\x8c\x46\xbc\xe0\x99\x9b\xf3\xdb\x7e\x6d\x0e\x22\x01\x29\x4f\x26\xd3\xa8\xe0\x6e\x48\xd4\x3b\x95\xaf\x4c\x03\x12\x43\x24\x12\xc4\x94\xbe\x4a\x82\xd2\xc5\xf2\x9d\xec\xa6\xd5\x1d\x25\x69\xc9\x0b\x92\x1a\x64\xec\x3a\x8c\xab\x06\x74\xc7\xc7\xe3\x19\xb7\x01\x63\x75\xc0\x01\x62\x17\xa5\xd8\x7e\x5f\x1e\x57\x07\x6a\xd7\xb3\x8f\xac\x7e\x61\x33\x83\x88\xd6\x35\x23\x96\xed\x4d\x12\xcc\xf3\xbd\x57\x4f\xa1\x5d\x73\xd0\xdc\x68\x6b\x50\x3d\x39\xa9\x37\xe4\x66\xe6\x6c\x0d\x72\x23\x80\x28\x12\xf7\x59\x03\x15\x9d\x72\x37\xd0\x48\xca\x8d\x63\x94\xa7\x69\x7e\x21\x7f\x8d\x67\x72\x19\xc9\x1a\xba\x69\x93\xec\xa3\xcd\x1a\x47\x9c\xa3\x34\xa2\x76\x7b\x68\x4c\xb4\x19\x1e\x81\x6d\x96\x17\x4c\x9e\x42\x6d\x16\x09\x25\xf2\xf3\x18\xc3\xe8\x4d\x34\x42\xb3\xa4\x87\xb5\xba\x8d\x13\xd5\xf6\x1f\x59\xa3\x45\x37\x23\x3a\x3d\x55\xea\x93\x8d\xda\x3f\x7a\xdb\xee\x06\xa6\x0f\x75\x45\xec\x40\x53\x74\xa3\x77\xcf\x4f\xbf\x29\x03\x59\xdf\x98\x3e\x28\x9c\x03\xd1\x6f\x07\x80\xea\xdb\x90\x5b\xdb\xa2\x26\x94\xde\xc7\x7d\xc2\x77\x40\xa4\x50\x34\x47\xeb\x7a\x85\x31\x4d\xe6\xa9\x71\x9b\x1b\xad\x56\xab\xa2\x15\xfe\x26\x73\x80\xb9\xf5\xeb\x14\xac\x0f\x6a\xe0\xe7\xe9\x55\xbd\x96\x4d\x0b\xfc\x43\xc9\xb3\xb8\x56\x97\xbb\xe9\x03\xce\xeb\x43\xb7\x35\x4f\x57\xfb\x22\xf9\x90\x64\xe2\xab\xa6\xcc\xa2\x1d\x37\x21\x2d\xf8\x34\x4f\x32\x39\x2d\x2a\xa3\x5e\x9b\x4d\xa0\x90\x08\xd7\x65\x9e\xa7\x83\xa8\xd8\xf5\x0d\x4b\x34\x15\x7c\xe9\xe1\x74\x56\x96\xbc\x10\x24\x9d\x9a\xfa\x82\xc6\xa7\xc2\xcb\x90\x2d\xba\x2a\xa4\xe6\xcf\x7c\x24\x69\xa3\x10\xe9\x42\xe6\xe5\x7b\x6c\x7d\x37\x08\xfc\x5a\xe9\xe4\xe6\x43\x1f\x93\x21\x76\x67\xd3\x66\x43\x4c\x1a\x2d\x1d\x79\x40\x6d\xd4\xb6\xf3\x1d\xbf\xb5\x8d\xb6\x0f\xf6\x1a\x85\x40\x1f\x4e\x9f\x41\xbb\xee\x49\x87\x48\xec\xd2\x67\x26\x45\xcc\x1d\xd6\xd4\x74\x25\xd8\x4c\x92\x4c\x3f\x6b\x6d\x6d\xab\x5a\x5a\x56\x73\x98\x9b\x58\x29\xa9\x56\xda\xcc\x1f\xea\x07\xd1\x80\xc7\x30\x08\x5c\xd0\xcc\x8b\x84\x67\xa5\x0a\x6e\x98\x46\x59\x2c\x86\xd1\x94\xb7\x1a\xed\x50\xe7\x9b\x0f\xb1\xf3\xd6\xe7\xf7\x2e\x09\x1d\x6c\x7b\x7b\xd3\xb4\xad\x6b\xb7\x50\x1c\x52\x8c\x17\x78\xb6\xea\x7f\x63\x71\x9a\xf5\x2d\x21\xbf\xf8\x89\x5f\xfe\x32\x19\x14\xd1\xa1\x64\x08\x88\xa4\xb0\xd6\x5d\xf7\x00\x5e\xf1\x6c\xe6\xc3\xf4\x37\x29\xd0\x93\xc9\x40\xce\xce\x11\xfc\x70\xc0\xd6\x77\x2b\x8b\x17\xa1\x9a\x8e\xd5\xea\x71\xb3\x92\x6a\xff\x1f\x7b\x6c\x8d\x3d\x26\x57\xac\x1d\x27\xb3\x3e\xb0\xc6\xf4\x03\x48\x04\xc1\xca\xfd\xda\xca\xfd\xc5\x95\xd7\x6b\x2b\xaf\x2f\xae\xbc\x51\x5b\x79\xc3\x54\x76\xf5\xad\xb2\xa9\xf0\x7c\xdc\x67\x0d\xc9\xe3\xc1\x7e\x36\x6b\xfb\xd9\x5c\x8c\xe4\x56\x6d\xe5\xad\xc5\x95\xb7\x6b\x2b\x6f\x2f\xae\xfc\xa0\xb6\xf2\x83\x65\xc8\xe3\x73\xe3\x3c\x0a\x3d\xac\xed\xea\xe1\x62\x3c\x1f\xd5\x56\x7e\xb4\x04\xf7\xd5\xf3\x6e\x7f\x19\xe6\x9d\xc3\xbd\xfd\x85\x54\x0a\x2e\x47\xa0\xd3\x09\x4d\x91\xa7\x5c\x1a\xb1\x8e\x60\x7b\xec\xb8\x91\xe5\x19\x6f\xb4\xdd\x85\xba\xd6\x66\xfd\x36\xdb\xd0\xdd\xf4\xe1\xff\xf0\xef\x75\xf8\xbb\xd3\x6f\x05\xab\x6c\x11\xb0\x75\xfd\xf7\x06\x56\x59\x0f\x57\x79\x48\xc0\x36\xc9\xdf\x1b\x35\x55\xd6\x01\xac\x83\x08\x6d\x92\x2e\x25\x96\xf2\xaf\x40\x9d\x0d\x00\x53\x75\xb6\x48\x9f\xb2\xce\xe6\x12\x75\xb6\x55\xdb\xa6\xd2\xc3\x70\x25\xc4\xa7\x83\x43\x7f\x80\x95\xfa\x86\x6e\xb2\x95\x40\xa5\x2d\xac\x84\xe4\x7e\x48\x2b\x6d\x20\x7a\x21\x32\x6c\x01\x52\xaa\xd2\xa3\x36\xeb\xaf\xd3\x4a\xdb\xe1\x4a\xdb\xb4\x12\x74\xb3\xa9\x6b\x6d\xe2\xa0\x36\xc2\xb5\x1e\xb4\x59\x07\x27\xa7\x2f\x47\xbf\x45\x6a\xad\xaf\x85\x6b\x3d\x80\xb1\xe8\x5a\x12\xbb\x07\x9a\x27\xb6\xda\x6c\x5d\x4e\xe3\xc2\x5a\x72\x28\x8f\x68\xad\xcd\xda\x5a\x8f\x6c\x2d\x89\x54\x9f\xd6\xda\x0e\xd7\x7a\x88\xb5\x90\x81\xfa\x0a\xa9\x75\x3d\xdf\xeb\x0f\xdb\x6c\x2b\x5c\x4b\x52\x4e\x57\xdb\x46\xac\x4c\xb5\x8d\xb5\xfa\x6a\x7d\x5b\xed\x01\xa2\x65\xab\xad\x87\xab\x3d\x72\xab\x3d\x44\xbc\x0c\x7f\x6d\x6c\xb6\xd9\x76\x4d\xb5\xf5\x36\xeb\x6c\x63\x35\x49\xc3\x47\xb4\xda\x76\xb8\x5a\x5f\x11\x5d\xd5\x83\xa9\x35\x1b\x81\xe4\x8e\x87\x6d\xf6\x60\x89\x7a\xb2\xce\x06\xa9\xb7\xb9\x36\xa7\xde\xa6\xad\xb7\xde\x66\x1b\x5b\xb4\xde\x7a\x4d\x3d\xb5\x6e\x3b\x0f\xb0\xde\x06\x0e\xc9\x2c\x86\xcd\xcd\x36\x7b\x58\x57\x6f\xcb\xd6\xdb\xc4\x21\xd9\x7a\xdb\xb2\xde\x49\xf0\xfe\xa3\xf6\xcc\x4a\x84\xa8\xfe\xcd\x82\xac\x06\x2d\x70\xfa\xf2\x0e\x86\x4d\x74\x55\x0b\x75\x16\x15\x1b\xad\xee\x4b\x70\x84\xee\x82\x93\xb2\x94\x15\x3d\xfc\x6e\x16\x51\xaf\xd7\x63\xeb\x6b\xdd\x7e\x77\xbd\xbb\xc9\x68\x47\x4d\x74\xbf\x6e\xc1\x79\xf2\x3d\x36\x53\x6b\xf5\x21\x6f\x94\x0a\xa6\xa9\xfe\xed\x1e\xb5\x59\x03\x1b\x54\x02\x3d\x34\x4b\x6e\x60\x4e\x37\xf6\x4d\x8a\x8b\x34\xc9\xca\x8e\x7a\x69\xeb\x64\xfc\x03\x26\x21\x67\x59\x0e\x41\x74\x3b\x4a\xad\x45\xdf\x72\x94\xab\x38\x78\x58\xcb\xbf\x54\x74\x9c\x56\x80\x5a\xdf\x58\xbc\x2f\x98\x00\x15\x3c\x39\x12\xa0\xf0\xfa\xf3\x39\xa4\xba\xb9\xc8\x8b\x33\x15\x34\x39\x1a\x88\x3c\x9d\xe9\xc4\x6e\x02\x2d\x42\x14\x18\xde\xd4\x26\xf9\x20\x49\xf9\x91\x7e\x78\x7b\xb4\x06\x11\xbc\x27\x3c\x9b\xed\xb0\xfe\x1a\xfe\xd2\xaf\x88\xfd\x3e\xfe\x8e\x8b\xe8\x82\x17\x87\xe7\xbc\x80\xd8\xee\xfd\x75\xfc\x9c\x45\xe7\x4f\xa1\x64\x87\xf5\x37\x14\x64\x12\xa5\xf9\xa9\x85\xdc\xa4\x9f\x77\x58\x7f\x0b\x7f\xa7\xd1\xa5\xac\xb5\xae\xfa\x9b\xe6\xd3\xfc\x1c\x3e\xa8\x0e\x45\x16\x0d\xcf\xe0\xa2\xb9\xae\x10\x94\x97\xad\x32\x99\xee\xb0\x8d\xb5\xb5\xb5\x95\x70\x6e\x71\x1c\x67\x75\x59\x7e\x9b\xd1\x55\x08\xe2\x2a\x28\xc2\x93\x34\x05\x4d\x6c\x9e\x49\x59\x0f\x23\x44\x43\xd8\xdd\x8c\x3d\x8c\xa7\x4c\xfc\xef\x2c\x2a\x38\x68\x78\x81\xcb\x4f\x8b\x04\xd3\x0b\xe0\x94\xb6\x19\xe4\xf0\x2e\xdb\x70\x65\x8e\xb9\x38\x2b\x21\xf7\xb6\x6c\x59\x07\xe9\xd3\xfa\xce\x6e\x92\xf7\xe0\x15\x56\x36\x24\x7a\x69\x74\x99\xcf\xca\xde\x84\xcb\x51\x8a\xce\x19\xbf\x84\xef\xe0\xd6\xf4\x37\xff\x6b\x47\x23\xd0\x91\x08\x88\x15\xc6\x66\x59\x52\xee\xb0\x87\x81\xb0\xd3\xfd\xdb\x0c\x88\xf2\x1f\xb4\xd8\xf4\x54\x5f\xff\xe2\x19\x2f\xa2\x92\xef\xa7\x91\x10\x2f\xa3\xc9\x97\x36\x58\xfc\xe2\x1a\x36\x4c\xd5\x3b\xe0\xe9\xab\x74\x76\x9a\x64\xcf\xd2\xfc\xe2\x35\x8f\x86\xf0\x3a\xf9\xe6\x72\xca\x05\xa4\xd3\x2b\x2f\xa7\xfc\x2d\xf8\x36\x1f\x8d\x39\xaf\xdb\xe3\xfb\xeb\xeb\xad\xee\xf5\x1b\xfb\xf4\x29\xd8\xda\x5a\xab\x1b\x65\xda\xed\x77\xc9\x56\x4f\xfd\xe9\xa9\x3d\x8d\x36\x97\xc6\xb4\xda\xe6\x2d\x22\xfc\x7a\x96\xde\x06\x8e\xd0\xcc\x32\x68\xa9\xc1\xe4\x05\x64\xdd\x80\x97\xe9\xb5\x5d\x38\x5f\x74\x64\x99\xc8\x1e\xbe\x17\xe3\x64\x38\xd6\x55\xb8\x90\xab\xfd\x7f\x67\x9c\x0d\x25\x21\xe0\x01\x47\xc0\x96\x14\xb3\x3c\x63\x43\x6c\x4f\x74\x65\x5b\xbf\x61\x74\xf0\x0b\xdb\x1d\x3d\xd1\xd5\x52\x8a\x31\x7a\x80\xae\x89\xc1\xce\x04\x2f\xb1\x05\x1b\xad\x0f\x3e\xc2\xa1\xe7\x80\xcb\xed\xef\xe8\xe8\x35\x06\x38\x89\x86\x63\x88\x94\x06\x71\xd7\x7a\xbd\x15\x88\x16\xd3\x10\x72\xff\x4c\x26\xd3\x22\x3f\xe7\x31\x3b\xe7\x90\x67\x93\xe5\xa3\x15\xb2\x2f\x92\xe0\xa5\x43\x21\x92\xec\xbd\xe8\xbd\x17\xa2\x37\x48\xf3\x41\x6f\x93\x6f\x47\x6b\x5b\x71\xbc\x31\x7a\x30\xd8\xde\x7a\xb0\x3e\x8a\xe3\x8d\x68\xb0\xde\xdf\x7e\xb8\xdd\x8f\x1f\xf1\xcd\xcd\xed\xe1\xfa\xda\xc6\x46\xbf\x27\x8a\x61\x6f\x56\x26\xa9\xe8\xd5\xec\x12\xdd\xf7\xc2\x57\x87\x55\x60\x9a\x56\x75\x2d\x07\xea\x4e\xd0\x9c\x67\xd2\x3d\xef\x99\x54\xee\x00\xca\x5b\x1b\xc3\x11\xfa\xc9\x76\xb5\x1c\x55\xe1\x85\xfb\x7b\xac\x4f\x12\xf6\x55\xca\xff\xc9\xd6\x9d\x84\x7d\xf3\xa4\xb0\x61\x9e\x89\xdc\xe4\xc8\x55\xbf\xf0\xb5\xa9\xe9\x3d\x07\x5e\x28\x13\x22\x0c\x59\xcb\x63\x36\xc9\x0b\xce\xca\x71\xa4\x23\xcc\xab\xcc\x8f\x30\x77\xc0\x08\x96\x03\xed\x20\xba\x8d\x36\x6b\xfc\x9e\xcf\xb4\x91\x12\xc4\xfb\x91\xa7\x48\x9e\x85\x2b\x48\xae\xc5\xc6\x12\x9e\x95\x4c\x24\x31\x87\x36\x9e\x8f\xd8\x65\x3e\x63\x71\x8e\xef\xdc\x17\x89\xe0\x6d\xf8\x52\x46\x67\xf8\xda\x58\x24\xe2\x4c\x72\x26\x60\x3d\xcc\xb3\x51\x9a\x0c\x21\x91\x09\x5d\x19\x18\x8b\x42\x4d\x8a\xf7\xb6\xe8\x85\x98\xd7\xd1\x70\xcc\xf3\x31\xe6\xc2\x14\x72\x77\x34\x06\x49\x84\x25\x70\x9e\x6e\xe1\xb5\x96\x36\xfa\x0f\xd6\xe7\xfd\xea\x5b\xad\x1c\xf8\x04\xde\x2c\x60\xb4\x11\x9b\xf0\x49\x5e\x5c\xb2\x94\x47\x67\x40\xae\x37\x6a\x61\xee\xdb\x65\x6c\xec\x3a\x04\xae\xe0\xd3\x22\xbf\xc0\x1c\xd8\x93\xd9\x70\x6c\x69\xe1\xbe\xb2\x1a\xbe\x5b\x8a\xcb\x49\x98\x7f\x95\x8b\x7f\xd8\x50\xe1\xfc\x15\x26\x4e\x5e\x46\x08\x13\x0f\xa7\xcd\xdd\xbb\x48\xd8\x6e\x0e\xce\x3f\xa2\x3b\xe1\x65\xe4\x3d\x97\xf3\x32\x82\xcb\x9e\x0f\x46\x52\x92\x1e\x45\x59\x52\x26\x7f\x22\x43\xa8\xc8\x53\x91\x30\x39\x0a\x67\x02\xcd\xde\x62\x7e\xce\xd3\x7c\x3a\x91\x1c\x56\xe6\x26\xa1\xc2\xd8\xf0\x21\x8f\x6d\x9b\x96\x7d\x74\x32\x60\x85\x89\xfc\xc7\x04\xb4\x93\xfb\xea\x6b\x08\x6a\xd7\xec\x1d\xdf\x59\xfd\xdb\xf7\x7f\xbf\xdb\x68\xb6\xee\xdd\x6f\x77\x7b\x3b\xbb\xec\x1f\x7b\xff\x7c\xfc\xc3\xf1\x1f\x7f\xfc\x71\xf2\x7f\xdf\x7d\xfc\x74\xf5\xff\x3f\xe9\x9d\xb6\xda\xac\xd1\x51\x21\x62\x09\xc1\xa0\xed\xfb\x0c\xc3\x24\x9a\x5c\x09\xf4\x43\x88\x90\x3a\x37\xfc\x02\xf8\xab\x2f\xf4\xe4\xdb\xbf\xcd\x58\x3e\x5f\x5f\xac\xfc\x62\xee\x3d\x5f\xea\x09\xf8\xbf\xdc\x19\xe7\x1b\x75\xd6\x70\x0c\x5b\x41\x12\x16\xfb\xf2\x88\xd3\xb9\x62\xc5\x61\xa1\x7e\x7b\x11\x9d\x50\x74\x68\x82\xdd\x6d\x1b\x76\x0a\x6a\x14\xa5\xd2\x44\x9a\x60\x2d\x5e\x5b\xd5\x88\x2d\x1e\x00\xb6\x2b\xf7\x64\xaf\x80\x6c\xce\x77\x00\xa6\x2b\x87\x59\x24\x31\x17\x10\x1a\x2f\x53\x52\xb1\x5f\x78\x2c\x0b\x4e\x2a\x5b\xb5\xf3\xbc\x6c\xad\x9e\x6c\x9b\x7b\x2c\xd8\xd0\xae\x37\xd2\xdf\x92\x72\x7c\x48\x2a\xd5\xbd\xee\x5f\xb5\x55\x05\xbd\x07\x86\x2c\xb9\x4c\x5f\xad\xee\x28\x2f\x0e\xa2\xe1\x98\xd8\x73\x9d\xf1\x4b\x3b\x8a\x1b\x1e\xba\x01\xdc\x21\x5a\x73\xf0\xe8\x95\xd7\xfe\xb2\xb8\x04\xbb\xa8\xdc\x50\xc8\xa4\xe1\x87\x43\x35\xce\x39\x9e\xb9\xfc\x43\x22\xca\xae\x71\xe2\xec\xf5\xd8\xf7\xf2\xd2\xf0\x2c\xf9\xf0\x82\xb3\x0e\xe4\xaa\x62\x89\xc8\x1a\x25\x13\x93\xa8\x28\x19\xcf\xf2\xd9\xe9\x58\x41\x37\x9e\xa9\x83\x09\xec\x34\xd5\xd6\xfe\x0e\xfe\xc8\x47\xec\x9d\x37\x21\x5d\x6a\xc3\xf5\x6e\xbe\xe9\x14\x0b\x4d\x97\xce\x57\x54\x6b\xd1\x59\x4f\xa6\xdc\xf9\xad\x85\x29\x3d\xb7\x0e\x8f\x39\xd5\x2b\x61\xbc\xd0\x7e\x11\x96\xd4\x8e\xfa\x17\x69\xa7\xce\x7c\xeb\x54\x0b\xc9\xa0\x77\xec\xcb\x9c\x63\x19\x31\xe6\x93\x24\x3b\x3d\xc8\x94\xd1\xff\x52\x8b\x4f\x1f\x91\x01\x45\x83\xbf\x25\xcc\x3d\xa7\x3e\xfb\x1c\xfd\x0f\x47\x23\xab\x3b\x1a\x71\x16\xe0\x4e\x44\x6d\x1e\x9b\x90\x33\xcb\x98\x79\xd2\x6e\x12\x2e\x9a\x65\x54\x9c\xf2\xb2\x6d\x82\xbf\x91\xe4\xe0\x2a\x31\x38\xfb\x07\x16\xda\xa4\xe0\x90\x10\x1c\x6d\x49\xb9\x18\x16\xc9\x14\x3d\xff\x30\x24\x5c\x72\xb2\x4b\x3e\x77\x79\x36\x9b\xf0\x02\xc2\x86\xee\xd5\x7c\xff\xf4\x49\x85\x33\xa4\xe5\xf2\x6e\x90\x9c\xce\x74\x4d\xc8\x36\x04\xbb\xe8\x2a\x8c\x7e\x15\x25\x44\x0d\xde\xa2\x55\x2f\x8a\xa4\x74\xaa\x85\x49\xac\x47\x4e\x6a\x9e\xf1\x4b\xfa\xbb\x85\x99\xc0\x2a\x77\x8c\xfd\x3c\x13\x65\x31\x1b\x96\x79\x01\x84\x2b\x73\x88\x23\xd8\x06\x9f\x8d\x64\xf8\x4a\x93\x52\x49\xe4\xaa\xb8\x55\x25\x3e\x69\xc8\x26\x2d\xa3\x4d\xb6\x76\x55\x76\x7c\xd2\xee\xbc\x56\x5c\x14\x4c\xae\x32\x02\xb1\x0b\xa7\x6f\x93\xb8\x91\x46\xc3\x5a\xa5\x94\x0b\x35\xdf\xdd\x34\x1a\x96\x24\x0a\xb1\x52\xb3\xd4\x34\xbc\x56\x85\x9c\x1f\xb2\x58\x01\xd9\xcc\x37\xfa\xb8\x0e\x3e\xff\xd8\x70\xc8\x47\x49\xcc\x7f\x8c\x6a\x33\xe0\xf5\x2b\x90\xf3\xd0\x50\x20\xa6\xca\xbf\x79\x14\xd7\x06\x7e\xde\x7e\xb0\xe9\x01\xce\x6b\x1a\x21\x4c\x85\x17\x51\x52\xe7\xae\xbb\xfd\x60\xdb\x01\x9b\xd7\xaa\x2c\x37\xc0\xfb\xf3\x9c\x80\x1f\x7d\x1d\xff\x5c\xdb\x41\x99\x4b\x9e\x9c\x4d\xe4\x3a\x85\x7c\xe1\xcd\x08\xe2\xdf\x02\xbb\xc3\x87\x6e\x22\x6c\x41\x75\x63\x6a\xb3\xa8\x00\x92\x1a\x20\xb5\x3f\xb5\x70\xcb\xb2\x1f\xcc\x86\x25\x2b\x1c\x27\xf2\xe4\x8c\x8a\x02\xf6\x29\xb3\xb6\x65\x11\x49\x43\xa8\xbe\x22\x1e\xa3\x22\x9f\x00\x12\x2a\xd7\x9f\x1d\x04\x5c\x3a\xf7\xa3\x34\xdd\x1f\xf3\xe1\x59\x33\xc9\x44\x19\x65\x43\xde\xa6\xeb\x4d\x8f\xe9\x8e\x29\x66\xfa\x8f\x7c\xe4\x00\x4a\x48\x0c\x48\x2c\xaf\xa9\x92\xdf\xd1\x90\x78\x75\x3f\xca\xa4\x88\x22\x4f\x2b\x16\xa9\x9b\x6e\x44\xb5\x8d\xab\x55\xd4\xa6\xb9\x10\xc9\x40\xde\x2b\x4d\x07\xa8\xa5\x6c\x0a\x9e\x8e\xda\xd0\x98\x41\x4d\x7e\x72\x7b\x7f\xcd\x95\xa9\xbb\x42\x01\x12\x36\x8c\x23\x10\x80\x06\x9c\x67\x2c\x91\x57\xf8\x28\x4d\xe4\x5d\xbd\xc3\xc4\x6c\x0a\x49\x08\x29\x84\xec\x81\xc7\x88\x9a\x89\x37\x9b\xa6\x92\x65\x74\xb4\x68\xf8\x2d\x0f\xf7\x55\xf4\xee\x59\x95\x47\x41\xa5\xcc\x8e\x92\x3d\xc6\xcf\x3b\x90\xfa\xd3\xe3\xa8\x24\x1b\xf3\x22\x29\x45\x53\xcc\x06\x70\x08\xb6\x11\x2d\xf8\x5b\x0f\x55\x0b\x18\xa6\x00\x85\x4f\xd3\x85\x4a\x80\x47\x0b\x75\xda\xc9\xe0\xd4\x1c\x49\x58\x79\xe6\x17\x5c\x80\x86\x74\x32\x13\x25\xe3\x09\x78\x2e\x0d\x38\x26\x2e\x86\x68\xdb\xba\x8b\x36\x88\x9b\xab\xca\x9f\xc7\xc1\x05\x48\xa5\xb1\xb7\xe7\x81\x8d\xe6\xaa\xae\x30\x04\x41\x07\x5d\x7a\x84\x7c\x04\xbd\xa1\x9a\xf9\x1d\x38\xad\x41\x66\xb0\xc4\xb1\x07\xb0\xf2\x40\x69\x33\x7d\x70\xea\x3c\xfd\xf4\x0c\x56\x69\xf9\xaf\xa4\xb4\xa8\x33\x07\x1a\xe2\x2a\xfc\x04\x2f\x5f\x69\x14\x0e\x47\xec\x71\xf8\x7b\xcd\x04\x59\xdc\xba\x6f\xdf\xc2\x48\xde\xbe\xc5\xc0\xfb\x0a\x44\x52\xa7\xd7\x63\xfb\x26\xd1\xd6\xfa\x5a\xff\x01\x7b\x33\xe6\xec\x34\xef\x70\x49\x71\x3e\x9b\xb0\x27\xb3\x72\x9c\x17\x42\xde\x2e\xdf\x48\xa6\x1d\x25\x29\x5c\x1f\xa7\x52\x6a\x57\x3a\x50\x0a\x9f\x26\x83\x22\x2a\x2e\xb5\xea\xdb\x6f\x4e\x15\xcb\x16\x46\x05\xe7\x4c\xe4\xa3\xf2\x22\x2a\x38\x5e\x31\x86\x51\xc6\x0a\x1e\x27\x52\x9c\x1b\xcc\x4a\xce\x92\x92\x45\x59\xdc\x83\xe7\xc5\x38\x19\x5d\xca\x26\x93\x12\x84\xdf\x42\xa5\x37\x29\x26\x42\xe3\xf1\xaf\x97\xbf\xb0\x9f\xb9\x10\xbc\x60\xa8\xd2\x4e\xd9\x2b\x88\x0e\xcf\x7e\x56\x19\xbf\x22\x81\xf1\xe2\xc5\x98\xc7\x6c\x00\xcd\xc9\x8a\xcf\x24\x2a\x47\x0a\x15\xf6\x2c\x9f\x65\x71\x84\xcc\xa5\x58\x4f\x2b\xec\x37\x74\x57\xaa\xc1\x36\xcb\x0b\xd9\x48\x33\x2a\xe5\x00\x0a\x25\xae\xb7\x58\x94\x5d\xb2\x54\xde\xa0\x74\xd5\x25\x08\x62\xc7\x0d\xfa\x3a\xd9\xcd\x38\x9f\xaa\x9b\x55\x52\x52\x85\xde\x68\x96\xb6\x65\x6b\x83\x59\xc9\x7e\x7b\xfe\xe6\xdf\x87\xbf\xbc\x61\x4f\x5e\xfe\xce\x7e\x7b\xf2\xfa\xf5\x93\x97\x6f\x7e\xdf\x85\x87\xf8\x7c\x56\xea\xb8\xec\x9c\xfd\x7f\xec\x7d\x79\x73\x1b\x37\xb2\xf8\xff\xfe\x14\x70\x7e\xfb\x4c\x32\xa6\x48\x49\xbe\xe9\xf5\x66\x1d\xd9\xde\xe8\xc5\x57\x59\xf2\xe6\xa5\xf4\x54\x34\xc8\x01\x49\xac\x86\x83\x79\x33\x43\x49\x8c\xa3\xef\xfe\x2b\x74\xe3\x9c\x8b\x97\xa8\xd8\x89\x5d\x5b\x1b\x11\xd3\x68\x1c\xdd\xb8\xfa\xe4\xd3\x38\xe4\x2c\x20\x17\x34\x49\x68\x94\xcd\x95\xf2\xe1\xcd\xcb\x0f\x07\x3f\x3d\x7f\x7b\xfc\xfc\xc7\xc3\xd7\x87\xc7\xbf\xca\xc5\xf5\xea\xf0\xf8\xed\xcb\xa3\x23\xf2\xea\xdd\x07\xf2\x9c\xbc\x7f\xfe\xe1\xf8\xf0\xe0\xe3\xeb\xe7\x1f\xc8\xfb\x8f\x1f\xde\xbf\x3b\x7a\xd9\x21\xca\xd7\x45\xd6\x5f\x3c\xe7\xa8\x1c\x4e\x40\xa8\x4e\x79\x98\xea\x99\x70\x04\xe4\x20\xcf\x4d\xd8\x90\xf1\x73\x16\xc8\x3d\x59\xc4\xf3\xa5\x89\x2a\x71\xd1\x50\x44\x63\x34\x3e\xa8\x62\x48\x72\x08\x39\x80\xda\x24\x65\x8c\xfc\x5d\x65\x56\xba\xb8\xb8\xe8\x8c\xa3\x59\x47\x24\xe3\xae\xca\x0a\x97\x76\xff\xd1\x01\x61\x0a\xbe\x7c\xa0\xfb\x12\xe7\x0b\x9a\x4e\x06\x82\x26\x81\xd5\x8e\xa3\x61\x83\xb9\x3b\xd9\x60\xd7\x50\xa2\x45\x18\x9e\x17\xaf\x35\x9a\xa7\x71\xac\xfc\x9f\x6d\x19\x3c\xe9\x45\xca\x55\xf6\xe7\x84\x85\x34\xe3\xe7\x36\x16\x12\xfe\x53\x21\xed\x54\x4a\xe7\xdc\xc7\x0b\x1e\x64\x93\x1e\x69\xec\xed\xee\xfe\x57\xee\xd3\x44\x67\xc3\x2e\xf9\xe6\xfa\xec\xe1\xfb\x5a\x7b\xa1\xda\x2f\xfa\x61\x68\x2a\x5e\x69\x77\xa4\x2b\xd4\xdb\xd9\x29\xe2\x68\x1a\x32\xa5\x2a\x7f\x14\x4c\x57\x5b\x69\xf1\x30\xcd\x02\x42\x5c\x4c\x44\xc8\x48\x4c\xc7\xac\x4d\xa6\xf4\x8c\xa5\x72\x93\x8c\x54\xba\x40\x43\x4f\x4c\xd2\x00\x26\x05\x21\x4f\x33\x16\x21\x59\xa6\x2c\x4d\xe9\x98\x39\x8a\x3e\x20\x3a\xa4\x66\x90\x47\xea\x50\xc8\xd7\xb0\x06\x6b\x93\x59\x1c\x80\xf2\x10\xfd\x41\xc7\xac\x91\x6a\x4f\x74\x32\x14\x49\xc2\xd2\x58\x44\x01\x8f\xc6\xe1\xbc\x83\x97\x3c\x3b\x20\xf7\x01\x28\xaf\x7e\x38\x22\x4d\x5c\x7b\x58\x9a\x1a\x6d\xe2\x80\xe9\x34\xbb\x1a\x85\x81\x6a\xe6\x62\x84\x93\xc2\x25\x48\xde\x14\xda\xb6\x82\x15\x9d\x6b\xcf\x12\xb9\x29\x3f\xab\xbb\xa0\x20\x06\xdb\x33\xe7\x38\xf8\xfd\x77\x7d\xa4\x8c\xfd\x23\xc5\xb6\xd7\xc2\x57\x3d\x22\xc1\xde\xba\x7d\x80\xf6\x3b\x09\x53\x54\xcb\x3f\x94\x3d\x1e\x83\xc5\x82\x94\x7c\x06\x07\xff\x2f\x6c\x70\x24\x86\x67\x2c\x6b\x36\x55\xb6\xb2\x50\x0c\x61\xe3\xc5\xa3\x77\x28\xd4\x95\x05\x35\xa4\xdf\x91\x1f\xc8\x77\x17\x69\xda\xeb\x76\xbf\x23\x3d\xf9\xa7\xfc\xab\x45\xee\x92\x7c\xed\x89\x48\x33\x72\x97\x7c\xd7\xa5\x31\xff\xce\xed\x2e\x48\x80\xa0\x0b\x1d\x11\x29\xbe\xf0\xfa\x2c\xb7\xcb\x2c\xdf\x71\xdd\xf9\x69\x3a\x26\xcf\xc8\x7f\x1f\xbd\x7b\xdb\x81\xdc\x1b\x08\xdd\x09\x68\x46\x5b\x4f\x0b\x35\x4c\x34\x00\x7c\x29\x74\x78\xfa\x76\x16\x86\xef\x92\x8f\x5a\x72\xd3\x6a\x4e\xd3\x71\xab\xac\x31\x62\x36\x8c\x22\xda\xab\x42\x09\xd2\x00\x99\x1b\x50\xfa\x95\xae\xaa\xc6\x3f\x0c\x45\xca\x6a\x29\x86\xe0\xd9\x31\x9f\x32\x31\xcb\x9a\x39\x62\xb7\xc1\x0c\xaa\xd8\x5a\x59\xc3\x6e\x1f\xbd\x26\x65\x7f\x73\xad\x6a\x0d\x6d\x28\xc6\x25\xc3\x41\x4c\x29\xcb\x8e\x32\x39\x5e\x8b\x29\x4e\xd8\x39\x94\x55\x91\x0f\x62\xe8\x63\xfb\x27\xa7\xc5\x89\xd5\x9f\x3b\x78\x28\x7d\xd4\x7d\xfd\x7c\x55\x84\x85\x67\x53\x94\xb2\xc4\xe3\x78\x2c\x69\x82\xd4\x03\x4d\xdf\xda\x24\xe4\x53\x5e\xca\x50\x6e\x93\x5a\x02\x79\x72\xda\x19\x8a\x68\x48\xe5\x54\x17\x1e\x74\x66\x7c\x28\x6b\x6c\x97\x3d\xfa\xb0\xd5\x56\x09\x37\xca\x7f\x17\x13\x79\x79\x6b\x7a\xad\x6a\x8b\xff\x7f\xd4\xf7\xb4\xd0\xdb\x4e\x3a\xe1\xa3\xac\x59\xd1\x52\x91\x49\x2b\x67\x58\x8f\x1d\xf3\x5f\x17\x10\x15\x8b\xe4\x75\xeb\x03\x6b\xe9\x17\x93\xd1\x7b\x4a\x6a\x99\x13\x23\xa6\x69\x46\xe4\xc2\xec\x94\xae\xcb\xdb\x8b\x17\x66\x67\xc2\xd3\x4c\x24\xf3\xca\x05\x8a\xea\x59\xd0\x40\x3f\x33\xb8\x5e\x3c\x3f\x7e\xde\xff\xf9\xe5\xaf\x47\x1d\xfc\x54\x3e\x3d\xb2\x6a\x96\xd0\xd1\x88\x0f\x4b\xeb\xaa\x6f\xe5\x95\x0d\x19\xb0\x85\xd3\x0a\x76\xf6\x40\x15\xc2\x3a\xd8\x15\xa7\x45\x8d\xef\x88\x4e\xe3\x50\x72\xdc\x32\x7c\x63\x3b\x5c\x89\xa8\x33\xa5\xb1\xb3\xa6\x59\xc8\xa6\x75\xa8\x49\xce\x25\xbe\xba\xeb\x12\x53\x47\x05\x03\xff\x81\xec\x92\x1e\xb1\x25\xe5\x13\x42\x1c\x8f\xf8\xb2\x7f\xf9\xd5\xa4\x46\x67\x17\x94\xee\xcd\xeb\xc3\x37\x87\xc7\x6a\x98\x8b\x06\x53\xc0\x56\xbb\xcc\x48\xe5\x52\x23\x95\xcb\xcd\x12\xa1\x7c\xc5\x55\xe3\x5c\x95\x43\x14\xd3\xad\xc4\x22\x0e\xa3\x56\xa3\xfa\x8a\x99\x44\x8f\xaf\x8a\x4b\xd4\xf7\xa5\xd9\xc4\xe0\xbb\x76\x3e\x71\x28\xb1\x0a\xa3\x14\x4b\xba\x5d\x72\x88\x47\xa5\xdc\x98\xe5\xbd\x4f\xee\xcb\x24\x55\xb4\x5c\x7b\x7f\x56\x0b\xaa\x6a\xaa\xd4\x61\x5c\xb5\x31\xb7\xc9\xc9\xd2\x6d\xf8\x2c\x91\x2f\x3f\x6d\x97\xaf\xf4\x65\xae\x6e\xcb\x8e\x55\xb3\xc5\xca\x83\x55\x15\x97\x1b\xad\x02\x2e\x0e\xd7\xfb\x50\x18\xaf\xee\xdc\x75\x0e\x38\x14\xd5\x37\xe3\xca\xc1\x86\x62\x9c\xb6\xc9\x89\xaa\x5f\xe8\xa7\xc4\x59\xd6\xc7\x42\x91\x9b\x73\x89\x66\x39\xd6\x77\x57\x7b\xf1\x86\x3b\x9c\xd0\x68\x2c\x1f\x61\x2a\xb5\x9d\xdd\xa5\x30\x60\x5b\x7e\x4c\xeb\xdd\x66\x4d\xd2\x2c\x05\xd3\x41\xe4\x20\x5f\x55\x7f\xfe\x40\x3e\x9b\x18\x71\xaa\xe8\x8a\xf4\x0a\x97\xd9\xfa\xd1\x88\x98\x45\x56\xe5\x53\xfd\x4e\xc8\x8d\xe2\x33\x58\x30\x82\xf3\x06\x0a\x39\xeb\xa7\x4c\x3e\x43\x36\x6b\x05\x23\xfe\xd4\x37\x93\xaa\xab\xbf\x8f\x53\x4f\x91\xe6\x94\xe3\xe7\xff\x3a\xea\x4c\xc4\x94\x75\x78\xd0\x96\x5b\x97\x9a\xbb\x29\x8b\x66\xfe\x2b\xca\x1d\x21\x40\xc2\x50\x39\x0a\xad\xe4\xd7\x01\x05\x0b\x44\x39\x87\xc6\xb2\x0e\xff\xe1\x06\xd1\x23\x27\xa7\xbe\x10\x46\x2d\xa4\xe2\x07\xc9\xd8\xc5\x52\x77\xbb\x96\x94\x75\x07\x9f\xe3\x14\x98\x02\xcf\xca\xa5\xdb\xb5\x82\x99\x17\x3c\x78\x03\xb9\xca\xf1\x4e\xad\x45\x24\x2c\xcd\x28\xc8\x4a\xc1\x64\x50\x89\xe3\x46\x3c\x49\x33\x72\xc1\x06\x29\xbc\xdc\x5d\x71\x0d\x1d\x65\x4a\x2a\x6b\x30\xa3\x25\x75\x14\xb0\x84\x05\x9d\x5b\xd8\xb2\xab\x58\x77\xe5\x25\x27\x96\x32\x67\x6c\xde\x23\x8d\x42\xff\x1c\x99\x95\x12\xbf\x5b\x6b\xa4\x3c\x6c\x81\x7b\xfc\xb7\xab\x7b\x52\x3a\x3b\x40\xb7\x4b\xac\x2c\xc3\x8c\x9f\xa5\x84\x96\x0f\x39\x27\xa1\x6a\x7b\xe2\xa9\xbc\x00\x2a\x75\x9b\xa1\x51\x40\xb2\xc4\x64\x8c\xd7\x6d\xc2\x50\x0c\xfa\x50\xa4\xa9\x9e\x36\x55\x4f\x3d\xa1\x69\x44\xc3\xf9\x6f\x8a\x50\x45\x49\x97\xc4\xee\x4a\xbb\x86\x13\x9a\x64\x69\xa3\x46\xdc\xe5\xb6\x71\x8c\x35\xa2\x31\xd3\x54\x57\xab\x00\x42\x60\x6a\x63\x65\xbd\x64\x2d\xb1\x41\x40\x9d\x25\x7c\x3c\x66\x90\x10\x95\x5d\x28\xe2\x6b\x71\xf6\x1b\x4f\x1e\xd8\xb9\xa5\x6c\x57\x48\x9e\xf2\x58\xab\x86\xdc\x08\x50\xa0\xb1\xee\xbb\x64\x2d\x96\x7a\xf9\xbd\x79\xf4\x1f\xb4\xe8\x1e\x60\x02\x79\x94\xee\x36\x5b\x9d\x82\x88\x4a\xd7\x7e\x86\x2c\x83\xb6\x1a\xaa\xf0\xe9\x2d\xff\xb4\xd0\xcb\x0b\xf5\xf9\x26\x88\xa3\x9f\x58\xb7\xb0\x7d\x37\x02\x7e\x9e\x93\xbf\xca\x7f\x9f\xb1\xe9\xb7\x20\x14\x56\x0d\x76\xb4\x98\x58\x9b\xf8\xb8\xff\xea\x9b\xd5\x6a\x72\x1b\x2b\xa9\xfc\x38\xc5\x0d\xaa\x47\xec\x2e\xd9\x51\x9b\x5b\xb1\x45\x0d\xaf\xa0\x9d\xf3\xa1\x78\xae\xb6\x56\xee\xb0\xb6\x19\xb8\xee\x1e\xc3\x09\xa3\xc0\xdd\xd3\xa6\x02\xda\x3d\xc2\x75\x2d\xb7\xec\x3a\x86\x0a\xa6\x06\xd7\x3d\x4e\x7d\x98\x39\xf0\x58\x54\x0e\xae\x8f\x21\x07\x5c\xdd\x8d\x4b\xc1\xcd\xe9\xe4\xc0\xeb\xeb\x65\x69\x05\x3c\xb5\x1c\x68\xb8\x9f\x95\x82\xfa\x47\x99\x3b\x5e\xe7\x43\xc9\xbc\x7b\x45\xde\x96\x0e\xff\x7f\x9a\xb3\xc4\x33\xa7\xcd\xd3\x5b\x57\xca\xc6\xa6\xe3\x49\xe9\xad\x90\xdc\x35\xb9\xd1\xd1\x05\x61\x45\xf6\x5c\x23\x1b\x43\x5e\x54\xb8\x77\x78\xaa\x4c\x3c\x82\x0a\xef\x50\xb8\xfa\xaa\x30\x4c\x76\x1b\xd2\x26\x86\xad\xa6\x27\xe8\xcf\xd9\xc9\x5d\x67\xe2\x89\x6f\x76\x72\xdf\xec\xe4\xfe\x50\x3b\x39\x65\x1b\x6d\x8d\x31\x68\x9a\xf2\x71\x04\x44\x31\x03\xc6\xa9\x2a\x70\xc7\x9e\x36\x49\xf2\xa3\xd6\x78\x1c\x92\x8a\x59\x02\x11\x39\x6d\xd8\x1a\xc9\x21\x06\xcf\x19\x9b\x63\x7e\x72\x09\xa6\x27\x4d\x75\xc5\x4c\x49\x67\x42\xd3\x77\x17\x91\x26\x1d\xaa\xc2\xb0\x4a\x5b\x62\x40\x1b\x23\xe8\xa4\x16\x63\xe3\x57\xf8\x85\x54\x34\x74\x44\x38\x98\x87\x6f\x66\x17\xdf\xcc\x2e\xbe\x99\x5d\x94\x98\x5d\xfc\x05\x4c\x68\x31\x58\x45\xa5\xa3\xf5\x83\x1c\x60\x5d\x27\x10\xc2\x54\xd0\x71\x15\x3e\xf2\xaa\x5e\xdc\xb3\x36\xb4\xaf\x79\x5a\x39\xc7\x8f\x1f\x79\x60\x75\x5d\x90\xdf\xad\x49\xec\x84\x9d\x27\x22\x52\x41\x28\xcb\xad\x6d\xef\x95\x41\xd7\xb5\xe0\x80\x7d\xa1\xb6\xb7\xdf\xcc\x56\xbf\x99\xad\x7e\x33\x5b\xbd\x41\xb3\xd5\x32\xf3\xbc\x82\x34\x6a\x23\xe3\x3c\x8c\x35\xf4\x1e\xf3\x9c\xac\x6a\x9f\x57\x67\x67\xa7\xcc\xf3\x8c\xee\xe2\xc3\xf3\x5f\x5e\x7e\xe8\xff\x72\xf8\xe2\xf8\x27\xfb\x78\x6d\xe7\xfa\x81\x82\x9c\x9e\xb9\x34\x37\xfd\x1e\xd5\xda\x03\x42\xfc\x9e\xc3\x8c\x4d\xd3\x1e\x69\x0c\x99\xdc\x0b\x73\x10\xff\x99\xa5\x19\x1f\xcd\x8d\xc0\x03\xb0\xec\xb0\x28\xc8\xc1\xa9\xf0\xbd\x3d\xd2\xd8\x25\x8f\xe3\xcb\x86\xd3\x5f\x65\x32\x88\xd1\x67\x3b\x26\xa0\xed\xe7\xbc\x74\x3b\xc2\xa9\x7b\x31\x4b\xa8\x9f\xed\xd2\xfe\x83\x1e\x6a\x1b\x44\x5b\x25\xed\x04\xaa\x52\x07\x20\x78\x34\x3e\x1a\x26\x8c\x45\x45\x79\x02\xbb\xe4\x59\x2d\x82\x90\xd1\x73\x53\xdf\xd7\x86\xd8\x31\xa1\x68\xc1\xda\x36\x6a\xfe\xd2\xc6\x8b\xd4\xc8\xf8\x5d\x79\xa6\x64\xb9\x32\x55\x46\x9d\xc9\xa0\x16\x46\xd5\x19\x0c\x2a\x98\x65\xcd\x05\x1d\xcf\x1a\x0d\x08\x3e\xfd\x7c\x78\xf6\x0e\x04\xcc\x19\xe5\x51\x4a\x44\x74\x20\x8b\xe0\xb2\x9a\x99\xc6\xec\x9a\x9a\xb2\x68\x46\xb8\xe4\x9d\x8e\x8b\xe7\x10\x0e\x2e\x50\x14\x60\x68\x0b\x01\xa7\x1d\x8d\x02\x92\xb0\x59\x8a\xf6\x38\xe0\x00\xca\xa3\xb1\x83\x16\x83\x0e\x40\x5b\x20\x93\xb6\x91\x34\x5c\xec\x72\x6b\x75\x2d\xaa\xe0\x8c\x4c\x65\x1f\x93\x39\xc9\xf8\x54\xc5\xbd\x40\xb9\xf2\x94\x65\x13\x81\xe6\xa6\x28\x76\x66\x41\xc7\x11\x1a\xaf\x62\x1f\xa9\xe6\x6c\x19\xeb\x48\x3d\xbd\x4b\xd9\x46\xea\x59\x47\x43\x32\xbf\x73\xa1\x10\xb1\xcb\x27\x50\xe0\x7b\xf8\x5a\x68\x1e\x38\xb6\x42\xc7\xcf\xff\x75\x84\x76\x58\x3c\x28\xb3\x8f\x53\xad\x9e\xf0\xe0\x74\x39\xfb\x46\x34\x65\x54\xf4\xd1\x97\xa4\x12\x75\xa9\x6b\x9c\x87\x75\xf0\x5d\xdb\x39\x63\x65\x2a\xef\xbe\x2b\x43\x77\x85\xa8\x4d\x1e\x2c\x67\x39\x98\x7f\xb1\xbb\x33\x50\xd0\x10\x9a\xf9\xcb\x8b\x02\x49\x9d\x2e\xcc\xd3\x48\x99\xe5\x58\xd0\x47\xad\xab\x95\x30\x7c\xb8\xaf\x74\x0a\x39\x83\xcc\xaf\x44\x6b\xa1\x1f\x24\x7e\x76\x19\xf7\x5f\xb9\x14\x1b\x73\xdd\x34\x62\xf9\x20\x4f\x25\xe9\x4b\x54\x1f\xc4\x95\xaf\x7e\xd6\x09\xc6\xb4\x0e\xc4\x39\x8d\xcb\xd4\x20\xc4\x57\x4a\xe0\xd0\x4b\xd4\xae\xc4\x3f\x5b\xcd\xb8\x56\x9b\x06\x52\xad\xc0\x91\xff\xe4\x55\xaf\xfc\xcb\x1a\xed\x2c\x68\x8b\x54\x29\x8d\xdc\x6b\x43\xd5\x8c\x6d\xd0\x25\xa8\x6a\x5f\x9b\x9d\xc3\xa1\x88\x7e\x84\xdc\xcf\xd5\x4d\x61\x5f\xd5\x89\xd3\xf3\x99\x54\xa4\xa5\xea\xad\xe5\x7b\xea\xbd\x25\xad\x56\x05\xee\xec\x95\x68\xcb\xbf\x94\xa8\x72\x16\xb7\x5f\x3d\xc1\xf0\x7e\xae\x5e\x31\xfa\x5f\x35\xd7\xc8\x7f\xea\x14\x42\xe3\xde\xa6\xb7\x01\xe6\x4c\xe1\x32\x5a\xb0\xa6\xce\xff\x5b\x6f\xf1\x97\x0e\xac\x23\xff\x4f\xde\x2d\xeb\x69\x47\x80\xf4\x3a\x39\x38\xbe\x29\x60\x47\xcd\xe8\x18\xcc\x2c\x0c\x57\xe0\x2e\x69\x0e\x2f\xfc\x7e\xba\x88\x37\xc8\x62\xfe\xf0\x7a\x7b\xcc\x2e\x33\xf9\x34\x32\x49\xb7\x64\x3b\x19\xcf\x42\x96\xd7\x28\xe5\xff\xd5\x99\xd7\x55\xb0\x53\xa1\x74\x55\x9d\x95\x3a\x8f\xaa\x34\x56\xfa\xda\xb2\xa9\xbe\x4a\x47\x9b\x40\x8d\x63\x59\x95\x81\x10\x61\xa1\x82\x52\xad\x96\xc1\x4b\xae\x2c\xc2\xfb\xca\xd5\x25\xea\xad\xa9\x48\x73\xae\xc0\x39\x35\xda\x17\x96\xa9\x47\x0f\xcd\xbc\x54\x0b\x29\xd8\xb7\x1a\x50\xe9\xe6\x53\x04\x7d\x29\xe9\xdf\x31\x91\xb8\x2f\xab\x28\xef\xc2\xe3\x0a\xf0\xda\x0c\xe4\x1e\xa4\x55\x96\x7a\xcf\xb5\xaa\x31\x3f\xa9\x80\xaf\x1b\x6a\x0e\x73\x99\x7a\xb6\xaa\xb9\xbd\xdd\x32\xe8\xda\xc6\x1c\xa4\x56\x70\x5e\xf5\xc4\xaa\x6c\x77\x6f\x71\xdd\xba\x5e\x54\x37\xe8\x24\xb5\xc7\x57\x76\x65\x17\x8a\xa0\x75\x2d\x1a\x74\xdb\x8d\xf7\x01\xb4\xc4\xd8\x8d\x15\x7a\x82\x12\xd0\xda\x34\xf3\x06\xca\x06\xbb\x10\x01\x0d\x2b\x67\xe5\x91\x0f\x57\x1b\x15\x43\x02\xd8\xb8\x6b\x66\x2f\xae\x52\x01\x94\x80\xd6\x46\x69\xb3\x9b\xbb\x89\x2d\x12\xf2\xa0\x32\x54\xad\x93\x7e\x1f\xe0\x6a\x23\x90\x48\x00\x03\x8e\x0f\x8c\x8a\x5d\xe8\xbe\x0f\x56\x87\x15\x00\x0c\x38\xa6\x98\xae\x24\xa4\xc5\xeb\xc8\xaa\xaa\xa6\xee\xfe\x97\x16\x87\xf9\xad\xa8\x24\xc4\xde\xd2\x11\x83\x01\xc9\x82\x88\xc1\xdd\x2e\xf9\xa7\x5a\x7c\x2c\x30\x17\x20\x02\xbc\xb7\x52\x8f\x8f\x0b\x52\xc8\x2a\xca\xec\x2e\x3d\x80\x12\x9c\x8b\x02\x20\x7b\x51\xf7\x24\x17\xbe\xe0\x09\x1a\x7d\x36\x69\x34\x9c\xb8\x19\xa5\xf1\x37\x06\xed\x0a\xd9\x28\x6b\xe4\xa4\xd6\x0d\x30\x23\x68\x40\x48\x31\x0c\xb8\x92\xaf\x85\x00\xf9\x6a\x80\xab\xa6\x56\x26\xe2\x42\x9d\x40\x5c\x44\x0d\x13\xbc\x0c\x34\xf0\x4e\x0d\xcc\xbc\xde\x68\xd9\xb8\x66\x8d\x59\xdc\xb0\x59\x7e\xf4\xb6\x50\xb8\xf2\xd4\x08\xe7\x3d\xd1\x7c\x20\x86\x67\x2c\xb0\x62\xe3\x51\xc8\x2e\x41\x1e\xbd\x4b\xe8\x2c\x13\x0d\x65\x4f\x0a\xff\x89\x7d\xe1\xbd\x38\x67\xc9\x28\x14\x17\xbf\xf6\x48\x03\x60\xf5\x9b\xa2\x42\x7a\x2e\x7f\x18\x9a\x80\x31\x72\x38\x9b\x46\xe6\xb3\x2b\xe3\x3f\x9f\x78\xb5\x64\xa1\xee\x90\x2e\xc7\xa4\x00\x5a\x2a\x8d\xbf\x3a\x26\x73\x81\x86\xfa\x85\x0d\xce\x78\xf6\x4e\xf5\xf4\x68\x98\x88\x30\x44\x89\x7b\x26\x66\xc3\x49\x03\xcc\xcc\x9f\x07\x01\xe1\xef\x8e\xc8\x54\xc8\xa7\xcd\x6c\x4a\x52\x0d\xa7\x85\x42\xdd\x2e\xc9\xd8\x34\x16\x60\xe0\x00\x33\xaa\x3e\x38\xaa\x8b\x11\xbf\x64\x56\xc0\x9f\x89\xb8\x47\x76\x0b\xb3\xf7\x1c\x68\x8b\x69\xfd\xf4\x3c\x86\xf0\x6b\x57\xd7\x4c\xd4\x34\x94\x4f\x3f\x22\x50\x09\xff\x7c\x0c\x3e\x11\x14\x9a\xaa\x2e\x1c\xcb\xfe\x7d\xf6\x3a\xdb\x2e\xef\x0f\xb2\x60\x15\xfa\x02\xf5\x3c\xa8\x29\xbd\xfc\xc9\x27\x6b\x45\x77\x7e\x54\x8d\x78\x3d\xf2\x71\x55\x74\x2b\x3f\x6f\xd7\xd5\xa3\x17\xb0\x30\x7c\x4a\x0d\x44\x12\x30\x3d\xf9\x8d\xbd\xf8\x92\xa4\x22\xe4\x01\x24\xe9\xf2\x43\x3c\x40\xd2\xf8\x80\x9f\xf3\x80\x25\xb5\x0d\x78\x74\x40\xfc\x7a\x2e\xae\xa7\x81\x1c\xab\x60\x13\x38\xac\xeb\x69\x20\x4f\x3a\x6c\x01\xc6\xb5\x56\x03\x53\x79\x00\xf5\xc8\x67\x08\xa5\xf3\xdf\xb3\x34\x23\x10\x81\x22\x15\x24\x66\x22\x0e\x19\xd8\x56\x99\x58\x99\xe8\xa8\x3c\x0f\x21\xa8\xb2\xd2\x2d\xad\x70\x76\x3d\x57\x7b\x6d\xd5\xd1\x22\x22\xf6\x6e\xd4\x3c\xc1\x9d\xbd\x8d\x3b\x78\x5b\x6f\xff\x6d\xb3\x3f\x9f\xb6\x56\x6b\xf6\x58\xe5\x9e\xaf\x6f\x34\x66\xc9\x94\x46\x20\xde\xf5\x85\xbd\xa4\x61\x76\xa3\x95\x9b\x06\x7b\x42\x9d\x9b\xe4\xfb\xef\xe5\x94\x7f\x0f\x12\x11\xcc\x9c\x8c\xf1\x44\x20\xeb\x32\x5a\xd5\x80\xad\x16\x8d\x63\x46\x13\xd8\x0d\xbf\xef\xde\x22\x04\x8f\xa8\xde\xc6\xb3\xd6\xbe\xe5\xf6\x02\x44\xf6\x28\xc7\x30\x96\x70\xd8\x0b\xdb\xf2\x70\xc2\xc3\x20\x01\xc9\x34\x6a\xf9\x57\xba\x56\xe5\x43\xe4\xae\x50\xd9\x91\x9f\xac\x5f\xb1\xb7\x52\x77\x2b\xe7\x37\x9d\xd0\x98\x35\x57\x40\xd5\xf2\xa4\x46\xee\x9c\x7f\x04\x13\x3c\x92\x09\x82\x72\x0c\xbb\xa0\x24\xd1\xc1\xce\x2e\x13\x4e\xf6\x1a\x87\x12\x46\x18\x56\xc1\x04\x20\x28\xf0\x5b\xfb\x27\x1f\x47\x02\x13\x37\x59\x1c\x28\x68\xaf\x1a\x2a\x04\x5f\x2f\xf2\x09\x0b\xd9\xb9\x97\x35\x20\xcf\x28\x06\xa0\x12\x35\x26\x8a\x2a\xa2\xd6\x5a\x6d\xa3\xb4\xb5\xcf\x88\x36\xe1\x11\x99\xf2\x30\xe4\x98\xa1\x5b\x4d\x07\x58\x00\x4e\xe9\x9c\xa4\x31\x1b\xf2\xd1\x1c\x54\xd9\xd1\x38\x64\xa0\x5d\x15\xb3\x0c\x50\x51\x70\xe5\x31\x2f\x12\xc8\x5f\xce\x23\xd8\x01\x67\x34\x0c\xe7\x2a\xd3\x13\x3c\x30\xd8\x30\xb3\x43\x29\x53\xf3\xaf\xc6\xfd\x65\x57\xf4\x35\xd7\x42\x09\xaa\xeb\xe1\xd3\x22\xe2\xdc\xf6\x60\x85\x4d\x2e\x6b\x42\x50\x63\x78\xb4\x7c\x02\xd7\x72\xb0\x1a\xd0\x33\x07\xe5\xb0\xe3\xad\xc4\xa6\x07\x34\x0c\x07\x74\x78\x46\x46\xb0\x6a\x2f\x54\x1c\x24\xc7\x2f\x4b\xa5\x23\x01\x0d\xfc\x80\xa1\xcc\x16\xf5\xe4\x9a\xd3\x63\x9a\xd0\x29\xf9\x8c\xe8\xaf\x94\x41\x00\x70\x2e\xfc\xa5\x8c\xa9\x75\xca\x0b\xd5\xa0\xe9\xb8\x88\x3e\x60\x0b\x07\x4a\x1a\x5c\xde\x79\x49\x3f\xbf\xeb\x87\x23\xf2\x29\x4b\x66\xec\x53\xdb\xdd\xc4\x95\xd3\xa4\x9d\x18\x54\xee\x55\x60\x1d\x08\x11\x16\xd6\xad\x88\x9c\x75\x0b\x27\xf9\x82\x29\xad\xdc\x72\x6a\xe8\x08\xef\xb6\x12\x3a\x42\xf9\xea\x74\x94\xd3\x0d\x86\x5e\x62\x54\xd8\x1f\x50\x87\x7a\x3d\x27\xb0\xb9\x75\x18\x4b\x54\xc7\x4e\x05\xf8\xfd\x6f\x39\x6b\x15\x90\xb5\x1b\xf1\x98\x8d\x8b\xad\x5e\x2f\xa4\x50\x0b\x34\x18\x36\xda\x15\x80\x35\xdd\xf0\xf0\xfd\x84\x8d\x9e\xda\x70\xeb\x7d\xd9\xbf\x36\xaa\x7f\x20\xc3\x7f\xe6\x46\x47\xcf\xc9\x40\x6d\xfb\x2a\x36\x96\xb1\x82\x25\xae\xb9\x40\x3f\x64\x91\x6b\xfe\xaf\x9c\x04\xda\xb2\x24\x35\x71\x4e\x25\x54\x0b\x23\xb0\xa3\xdb\x09\xfc\xf5\x77\xa8\x8d\x3f\xc0\xa5\x40\xdd\x16\x65\xd5\x93\xbe\xb2\xf4\xb7\x8e\x05\x50\x52\x96\x9a\x42\x8e\x84\x3c\x23\x4d\x18\x1f\xfe\x81\xe6\x28\x30\xae\x6a\x99\x67\x7e\x88\x4d\x39\x5f\xe4\x99\x1a\xaa\x6f\xa2\x02\xa8\x72\x72\xe9\x3c\x89\x94\xa5\x4a\x47\x72\xf0\x1c\x90\xb5\xc9\x89\x44\x6d\xe2\x0d\xc9\x91\xb5\x5a\x2d\x45\x03\xfd\xdf\x82\xd3\x74\xb7\x4b\x5e\x33\xc8\x66\x94\xa6\xb3\xa9\xb2\x91\x87\xe8\x78\xee\xfd\x2b\xbc\xa0\xf3\x54\xee\x34\xda\xf5\x97\x88\x88\xcc\x52\x96\x40\xd2\x77\xe6\xbc\x53\x7f\x01\xb3\x7a\x44\x83\x6d\xc9\xc5\x9f\x80\x9b\x81\x20\xe9\x19\x8f\xd1\xfd\x14\x6e\x74\xce\xd1\x22\x8f\x3d\x08\x44\x3f\x61\x16\x99\x32\x46\x25\x53\xf0\x65\xd6\x9b\x95\xb5\xce\x52\x4f\x74\x9e\xa4\x19\xb8\x08\x2b\x25\x0c\xde\xe6\x91\x07\x75\xb6\xf6\x65\x48\xe3\x70\x6b\xcb\x88\x44\x90\x61\x1d\x21\x7a\x71\xb5\x28\xbb\x92\x9c\x8f\xf3\x2f\x3c\x0c\x3f\xa0\x29\x3e\x6c\x1d\xea\x0d\x58\xe9\xe7\x9c\x87\x77\xac\x4e\x72\x6e\xf2\x46\xc1\xe8\x8e\x1c\x4c\x3d\xd5\x97\x2b\x37\x09\x90\xb6\xda\x2b\x31\x79\x59\x68\xee\x62\xcc\xe7\x7d\x33\x14\x57\x7b\x8b\x77\x71\xd9\x63\x30\xca\x02\x03\x00\x2c\x73\xa1\xf4\xbd\xd9\xc2\xe8\x12\x0f\xca\x98\xbc\xf4\x3d\x73\x97\x02\x8c\xce\xbe\xe6\x40\xc9\x22\x17\xce\xde\xd0\x0c\x9c\x29\x72\xe1\x8a\xb7\x1b\x5b\xa1\xf8\xcd\xad\x69\x4f\x77\x5b\xc3\x96\xb9\x90\xfe\x71\x6a\xa1\xfd\x72\xaf\x46\xec\xce\x95\xfc\xe5\x7e\xb5\xe7\x91\x85\xb1\x65\xde\xe8\xe4\x49\xe9\x0c\x08\x72\x7b\xb8\xdf\xd5\x4b\x50\x7d\x9e\xc7\x7e\x2f\xc0\xdc\x59\x6d\x6e\x55\xca\x3a\x67\xfd\x20\x73\x90\x93\x06\x32\x80\x3c\xa7\x34\x99\xe1\x6f\xa4\xa6\xf9\x53\x92\x4c\xfe\x30\x74\x81\x83\xad\x30\xe7\xb2\xd4\xce\xab\xfc\xe5\xcf\x1b\x94\xc4\xd8\x84\x9d\x05\xc0\x25\x87\x0b\x7f\xcc\x63\x86\x4f\x55\x87\xb1\x93\x2c\x34\xc9\x40\x02\x2d\x18\x54\xf2\xd5\x2c\x6c\x3c\x75\x40\xb5\x4c\xd4\xe1\x76\xfd\x99\x8f\x48\x53\x62\xba\x73\x87\xd8\x17\x27\x3e\x35\x4f\x3b\x3c\x1a\x86\xb3\x80\xa5\x5a\x04\xec\x9a\x72\xe4\x70\x3a\xe2\x60\xf2\x83\xc6\x40\x7a\x8e\x54\x97\xb8\x91\x0d\xc0\x67\xd2\x38\x9e\x2c\x67\xfa\xa1\x14\x1d\x45\xe3\x95\xcf\x65\xeb\xa6\xa7\x98\x03\x24\xc7\xe6\xb6\x41\x7e\x70\x56\x96\x23\xee\x92\xff\x30\x93\xa8\x32\x08\x29\x5b\xb2\x3d\xe7\xf8\x47\x0d\x97\x65\x1e\x6d\xe9\x04\x02\x9e\xb6\xde\x0a\x4e\x1a\x8e\xc0\x07\x32\xdb\x4b\x04\x4a\x03\xd3\x19\xd2\x98\x67\x10\x31\xee\x95\xdc\x09\x5f\xb3\x2c\x63\x49\x4b\x4f\xf6\x69\x5b\x27\x00\xf1\x14\xdc\x7e\xee\x96\xb2\x76\x50\xb0\xb4\x7a\x6b\x30\x5f\xb7\xfd\xf9\x6a\x59\xeb\x10\xc7\xe8\x45\xaf\x0a\x55\x60\x6d\x4c\xb5\x2f\x83\x4a\x49\x66\xee\x7f\x2e\xe3\xac\x6a\xef\x53\xb0\x37\xab\x4a\x65\xb3\x1a\xa1\x50\x74\xdf\xb6\x95\x5a\xf2\xac\x81\x2d\xc3\x33\xb9\x42\x2e\x35\x05\xad\x52\x56\x4e\x43\x1e\xf0\x68\xfc\x62\x55\x8e\x46\x85\x60\x91\xa3\xab\x86\xe8\x4e\x0b\x8f\x1a\x3d\x92\xdf\x5a\x03\xab\x21\xa8\x54\xe4\x78\x1b\x28\xbe\xb0\x7b\x25\xe7\x88\x77\x4a\xc2\x7d\xa7\x47\x6e\x3b\x9e\xf0\xf6\xf4\x76\x58\xc4\xd9\xdb\x5b\x79\xaf\x81\xc5\xdc\xa2\x1f\x08\x5f\x31\xbb\x78\x9c\x50\xc3\x35\xdd\xae\xdd\x9f\xcc\x72\xbb\xb5\xce\x90\x95\x42\x7c\x2d\x26\xfa\x91\x0e\xcf\x82\x44\xc4\x45\xe9\xc1\x22\x8e\x58\x69\xf2\x40\x28\xed\xce\x9d\x37\x63\x13\x71\x51\x64\xe4\xfc\x13\xde\xff\xed\x72\x1c\xd0\xa0\xed\x5c\x67\x1c\xec\x65\xd4\x70\x2f\x97\x98\x21\x49\x07\x63\x00\x28\x6b\xd7\x66\x67\xde\x0f\xc9\x80\x6f\x1e\xf5\xcd\x15\x08\x6b\xb9\xae\x3a\x47\x7d\x31\xda\xde\xc3\x76\x85\x30\x0a\x09\xa2\xfc\x4c\xfa\x4b\xbb\x98\xa0\x5b\x49\x39\x7c\xde\xa3\x04\xf6\x6e\x94\x5a\xa0\x4f\x95\x79\xc2\xbb\x67\x63\xb7\x4b\xde\x40\xd2\x6c\xbc\x99\x77\xe4\xc3\xbc\xc2\xd0\xcd\x31\x95\xc8\xa7\xa5\x6a\x93\xcf\x64\x14\xf2\xd8\xba\x6f\xf1\x6c\x72\x8c\x22\x0f\xb4\xb5\x8c\x80\x6d\x1a\x6f\x66\x1c\xe7\xb2\x41\xae\xcc\xc3\xb0\x60\x1e\xb7\xbf\xfb\x55\x67\x35\x5c\x6c\x4d\x77\xf3\x06\x6f\x5b\xc8\xb1\xf8\x45\xd9\xd0\x6d\xd5\x3e\xf1\x9b\x81\xde\x37\x03\xbd\x2f\xcf\x40\x0f\x7e\xbd\x10\xd3\x2a\xdb\xa1\x27\x05\xc8\x85\xb8\x5f\x88\xe9\x8d\xda\xff\x6d\x33\x93\xea\x19\x9b\x0f\xab\x2d\xc3\x9c\x18\x07\x0a\x70\xc1\xbe\x27\x41\x1c\x2e\x78\xf1\xee\x4d\x95\x81\xdc\x03\x1f\xac\x0e\x2f\x00\xd8\x69\xd4\x3e\x91\x55\x5c\xf8\xb8\x00\x5a\x3b\xdf\x0a\xc6\x54\xc2\x38\x5c\xea\x32\x59\x19\xfc\xe1\x61\x39\x7c\x5d\x4b\x1e\xa0\xdd\xe6\x2f\x22\x26\x1f\xa6\xb3\x9a\xe6\xf6\x1c\x2e\xf5\xe0\xeb\x9a\xf3\x00\x6d\x6f\x83\xe0\xe5\x39\x8b\xb2\xd7\xf0\xa0\xa8\x89\x6e\xf1\xa8\xb2\x4a\xed\x18\x73\xb0\xab\xdb\x56\xbe\xa2\xd5\x06\xa3\x8f\x1e\x7b\x60\x75\x1d\x91\xdf\x6f\xd4\xd2\x15\x6e\xf2\x6f\x68\x44\xc7\xd5\x96\xa9\xfb\xf7\x4a\xc1\xeb\x5a\x72\xe1\x4c\x65\xfd\x38\xa9\x6c\xe7\x61\x01\xb4\xae\x0d\x0d\x63\xed\x66\x45\x92\x55\x5a\x1c\x3f\x70\x2c\x8e\x11\xb0\xd6\xc2\x16\x20\xbe\x34\x63\x58\xb5\x08\x6b\xcc\x65\x96\xb7\x89\x75\x71\x2d\xb2\x25\x5d\xbd\x8b\xd7\xd5\xbd\x85\x5d\x83\x27\x4e\x40\xc3\x94\x04\x22\x6a\x64\x28\xa8\x56\xf1\x43\x55\x2a\x98\x54\x80\xaa\x80\x5c\x00\xc0\x20\x61\xf4\x8c\x0c\x45\x34\x9c\x25\x09\x8b\x86\x10\xd1\x8a\x1c\x40\xb8\x22\x1a\xa6\x82\xc4\xb3\x0c\xe1\x31\x52\x2a\xd8\x65\xad\x67\xff\x6b\xf4\xe6\xd7\x68\xff\x6b\x70\x5e\x23\xcd\xbe\x10\x8b\x65\xd9\xe3\xdc\x76\x04\x4f\x53\x6f\xcf\xb1\x8f\x53\xbd\x9a\x37\x37\xfa\x4d\x84\x70\x4c\x02\x2b\xcc\x75\x4b\xd3\x5e\x95\x07\xe2\xa8\xb4\x82\x2d\x35\xd2\x0d\x38\x0d\xc5\xd8\x37\x94\xcd\x19\x79\xba\xf6\x80\x13\x1e\x04\xcc\x09\x6c\x71\xce\x53\x3e\xe0\x21\xcf\x64\x8f\xf1\x63\xc3\xca\x43\x56\xb6\x00\x2c\xb5\x87\x3b\x9e\x30\x72\x70\x74\xa4\x42\x02\x41\x26\x6c\xa5\xfc\x1c\xe8\x2d\xbd\x60\xa3\xa0\x77\xe7\x83\xb5\x6c\x9a\xde\x43\xec\x21\xc7\xc2\x04\x9b\xce\x04\x68\x73\x69\xea\x35\x5e\xd2\xa8\xae\xb7\xaa\x65\x90\xb7\xc3\xae\x69\x12\xe4\xe2\xb8\x1e\x5b\x20\x07\x63\xab\xd6\xbe\xc5\x90\x03\x3c\xfb\x81\x35\xd0\x14\xd4\x9f\x9e\x43\xfd\x69\x05\x9b\x97\x52\x53\x30\xd3\xde\x1f\x6d\x13\x56\x2b\xf7\xfc\xeb\xd9\x86\x3d\xd7\x93\x0b\x8a\x1d\x13\x94\xbb\xb0\x48\xd7\x35\x1f\x35\xa7\xfc\x66\x4b\xe4\x7a\x97\x47\xeb\xeb\x37\xe5\x7c\x8e\x86\x2d\x67\x8c\xc5\x2a\xaa\xba\x32\x53\x50\x61\x23\x5f\xbc\x7b\xd3\xd1\xcb\x91\x3b\x81\x3c\x86\x34\xb2\x01\x24\x25\xf0\xd1\xcb\x77\x24\xe5\xd9\x4c\xd9\x84\x26\x58\x09\x2c\xf7\xe6\x62\x46\x2e\x68\x94\xc9\xd1\x4f\xe9\x25\x9f\xea\x04\x57\x18\xaf\x3d\xe5\xe7\x2c\x62\xa9\xb1\x38\x86\xdb\x95\x9d\x1b\xd9\x35\xd0\x11\x81\x13\xf7\xb2\x9b\x47\xcd\x36\x15\xf0\x94\x0e\x42\x6d\x2d\x28\x9b\x50\x25\x7a\x49\xaf\xd7\x0c\x78\xf8\x2b\x03\x1e\xdb\x1e\x58\x0f\x45\x22\x03\x4b\x46\xb4\xb1\xf3\xf5\x10\x9f\x8c\xed\xa1\xed\x0f\x52\xd6\x9e\x67\x18\x48\x60\x8d\x3e\x4d\x78\x06\x01\x8b\x58\x3a\xa4\x31\xdb\xa4\x33\x2f\x01\xc3\xcf\x6c\xfe\x71\x95\xe9\xc9\xf3\xa8\x7b\xb1\x5a\xdf\x20\x34\xb5\x06\xa1\x2e\x5d\x81\x00\x60\x98\xe5\x98\x59\x46\xcb\xcd\x62\xd1\x8e\x33\x67\x82\x3a\x60\x23\xa1\xe6\x0c\x06\x21\x1b\xd4\x2a\x15\xb7\xb9\x97\x2a\xd6\xd7\x9a\x27\x80\xbd\xc0\x6f\x7c\x02\x18\x54\xd7\x7d\x02\x68\xc4\xad\xe5\x6c\x76\x17\x4f\x17\xf8\x83\x7d\x9b\xb1\xdc\x8c\x4d\xa8\x9a\x32\x77\xa7\x52\x33\x06\x11\xf4\xff\xe2\x13\xe6\xec\x02\x6a\x7b\x83\x68\x5a\xf2\x8c\x62\x69\xca\x02\x4c\x47\xe2\x32\x20\x97\xd7\xc8\xe1\x2c\xf5\xa6\x73\x89\x7d\x6d\xbd\xcd\xe1\x92\x67\x79\x66\xc7\x28\x7e\x7f\x71\xba\x95\x6e\x0d\xe5\x93\xf5\x6d\x63\xa8\xdc\x18\x2e\x79\x96\xdb\x17\xa0\xe4\xdb\x74\x7d\xd5\xde\x22\x6f\xf4\x82\x28\x3c\xa4\xd1\xc4\xa5\xe6\xe2\x95\x0f\x2f\x04\x4d\xe0\x23\x1a\xd9\xc6\xce\x46\x9c\x88\x73\x1e\x40\x06\x28\xf4\x0d\x1d\x99\x30\xf5\xf0\x26\xc6\x28\x96\xd1\x98\xa0\xa0\x28\x6d\x4b\x44\xb1\x88\xc5\x39\x4b\xf0\x85\x7c\x31\xa1\x19\x3b\x67\x09\x78\xd9\x77\x6e\x19\xd7\x41\x3b\xdf\x18\x51\x94\x67\x29\xf9\xa4\x9f\x14\x9f\x48\x24\x02\x06\xbb\x70\x22\xd0\x9a\x9d\xda\x0b\x9c\x6b\xd4\x6e\x7a\xae\xfd\x8a\xc4\x68\x84\x01\x4a\x47\xec\x82\x4c\x58\x18\xcb\x47\xc7\x88\xd1\x6c\x26\xcf\x01\xd9\x2f\x32\x93\xef\x4f\x08\xfc\x4a\x28\xf9\x84\xd2\xf4\x4f\x4e\x97\xe4\x69\x90\x8a\xa9\x7a\x90\xa5\x3d\xd9\xc4\x0e\xc1\xbb\x68\xaa\x46\x4a\xd2\x8c\xe2\x1d\x1e\x78\x48\x44\x6c\x87\x66\x3b\x74\x07\x42\x74\x02\x6a\x0e\x51\xa0\x59\x24\x66\xe3\x49\x07\x51\x1c\x80\x5a\x3a\x75\xc6\xd2\x86\x59\xc4\x47\x85\x44\x06\x62\x7c\x8a\x82\xc1\x01\x0b\xc5\x85\x5d\xcc\x0a\xc7\x61\xa6\x5e\x56\xe1\x9c\x4c\x55\x97\xe0\xa8\x7a\x4a\xa6\xe2\x1c\x1e\x15\xc2\xd9\x01\xd4\xeb\x1a\xe8\x42\x60\x64\xf2\x91\x04\x4d\x65\x2a\x5f\xfc\x2c\xca\x78\xe8\x6f\xb2\x86\xeb\x55\x8b\xea\xd5\x93\x5a\x6f\x7b\xcd\xdf\x31\x1d\x1b\x47\x50\x95\xee\x53\x79\x2f\xc9\xaa\xcf\x83\x20\xd5\x2e\x0c\x89\x88\x13\x08\x9a\xfa\xfc\xc3\xe1\x73\x92\x08\x89\x8e\x26\x0c\x22\x05\x4c\x69\xc6\xe5\x4a\x99\x5b\x8a\xca\x5e\x18\x8a\xa4\x13\x2a\xa9\x37\xa5\xd1\x1c\xa4\xe3\x2c\xce\x52\x14\xb7\x9c\x80\xf6\x78\x47\xd2\x35\xa4\xf3\xf4\xb4\x89\xc9\xd2\xbb\x5d\x2c\x1f\x08\x91\xa5\x59\x42\xe3\xce\x98\x67\x93\xd9\xa0\xc3\x45\xd7\xaf\xd1\xfd\x7f\x30\xea\xb4\x25\x9b\xee\x82\x34\x52\xc7\x86\x59\xd7\x31\xe8\x0d\x1a\xa0\x2d\xf0\x0b\x02\xa8\xad\xb9\x05\x99\xb0\x34\xe4\xcf\xee\x15\x84\x32\x80\x15\x9c\x82\x70\x6a\xd6\xf0\x09\xb2\xe1\xde\xdf\xa3\x2b\x05\x0d\xc3\xa6\xf5\x18\xda\xb2\x03\x8d\xe2\xaa\x6a\xff\x19\x37\x49\x60\xad\xe3\x4c\x3e\x43\x20\x84\xbf\x77\x42\x52\xca\x03\xc4\x35\x8a\xcd\x27\x9e\x64\xfa\xfe\xe0\x67\xb7\xbc\xb2\x92\x7d\xdf\x8d\xa6\x2a\x93\xe1\x2a\x59\x0c\xa1\x0f\x53\x94\xed\xe4\x72\xf2\x82\x61\xef\x82\xde\x4f\x68\x14\x84\xec\x68\x22\x2e\x9a\x2b\xf4\x77\x63\xaf\xa4\x88\x5d\x66\xef\xfd\xa0\xd5\xb2\xb7\xa6\x18\x3a\x4b\xee\xdc\x71\x73\x7e\xe1\xec\x2e\x33\xff\xf9\xbc\x9f\xcb\x0d\x08\xb3\x89\x2d\x33\x14\x84\xac\x1a\x44\x9e\x63\xe4\x30\xfc\x81\x15\xc6\x30\x94\x5b\xd5\x2b\x91\xbc\x92\xe7\xd5\x2a\x84\x78\xc1\x83\xe5\xba\x6d\x00\x21\x83\x6c\x59\xaf\x4d\xb9\x3f\xf7\x6b\xf1\x8e\x76\xe2\x93\xc7\xd8\x05\xe5\x18\xf0\x5b\x69\x1f\xf4\x35\xdb\xdc\x00\x41\xa0\x4b\x43\x79\x29\x97\xf8\x7e\xe2\x81\x72\x05\x5c\x48\xb0\x68\xba\xec\xca\x56\xa0\xb9\xb5\x9d\x27\xd4\xef\xbf\x7b\xa6\xf5\x15\x0c\x67\xbb\x59\x1c\x76\x6e\x35\x62\x1e\xb1\xca\xc1\xb8\x54\xaf\x1a\x85\xcf\x19\x5e\xf7\x95\x31\x93\xd9\x09\xf3\x1d\x0d\x69\x9a\x41\x3d\x7d\x86\xf8\xd6\x43\x9e\x52\x76\x01\xc3\x25\x2c\xcd\x44\xc2\x5e\x6b\x8c\x95\xae\x7f\x3e\x58\xd9\x7c\xdb\x5e\x69\x16\x33\x25\x1d\xb8\xaf\x55\x8f\x03\xbf\xbb\xe1\xc7\x0b\xe3\x74\xec\x7a\x17\x0c\xc9\x72\x6f\xc5\x60\x5c\xf6\xf6\x7c\x19\x03\x31\x34\xee\x6c\x9e\x81\x94\x73\x86\x19\xfb\x3e\x1b\xbf\x94\x47\xc1\x8b\x77\x6f\xde\x8a\x80\xc1\x44\xb4\xcc\x30\x1c\x36\x74\x85\xbb\x1d\x1a\x04\x08\xe9\x01\x8a\x48\xb7\x07\x12\x17\xc7\xb6\x0a\x69\x9c\x37\xa0\xb2\x9d\x0a\xc4\xb0\x4d\x1a\x67\x6c\x3e\x8b\x1b\x6d\x97\x97\x3d\x84\xf9\xd6\x60\x66\x57\x6e\x65\x84\x5c\xe2\xb6\xe2\x21\x6a\xc3\x49\xe5\xb7\xe5\x51\xb7\x84\x62\xa3\x1a\xce\x1b\xe5\xd8\x0d\x62\x9f\x83\xad\xc8\x72\x4b\x60\x73\x6a\xb6\x5c\x57\x3f\xa0\xa3\x4d\xf7\xad\xb6\x05\x79\x7b\xd6\x4c\x8f\x4f\x17\xc9\xba\x07\xf2\x6d\xe7\x56\x86\xb1\x1c\x46\xfa\xb6\xed\x0d\xe3\xce\x1d\x75\x15\xd2\xd6\x86\xb6\x97\x6e\x9b\x6d\xaf\x96\xef\xeb\xe3\xf5\xed\xce\x1d\x72\xdb\x6d\xcf\x5d\x7c\x70\x2c\xb8\xd0\x9d\x09\x4d\x9f\x67\x2a\x2b\x5a\xb3\x91\xd1\x01\x18\x43\x34\x72\x29\xd9\xbd\x2a\x29\xcb\xca\xaa\xb4\xc9\xce\x9e\x17\x36\x59\x99\xfb\x77\x58\x74\xde\x79\xfb\xee\xc5\xcb\xfe\xcb\xb7\xff\xc6\xf4\x3b\x71\x22\x82\x99\x4a\xc0\xf3\x83\xf2\x7b\x50\xb6\xa7\x76\xf0\xca\xc9\xa1\xf1\x46\x85\x1f\xdf\xf9\x78\xd8\x2b\xbe\xf6\xf0\xf5\x1c\x08\x96\x82\x0a\x87\x0e\xe5\x83\x49\x09\x34\x21\xba\x53\xe3\x95\xd6\x91\xb3\x88\x8d\x38\x3e\xb0\xd3\x94\xa7\x90\xe7\x38\x63\xc3\x49\x24\x42\x31\xe6\x2c\x6d\x23\x3c\x84\x56\x51\x83\xd2\x4f\x3f\x7c\xa2\xa7\x64\xc0\xe4\xb9\x97\x32\x50\xda\x7d\xb7\xb3\xf7\x5d\xa7\xd1\x22\x3d\x72\x2e\x78\x40\x76\x4b\xf3\x4c\x7b\x33\x37\x5a\xf2\x32\x60\xcf\xa3\xda\x8d\x0c\x0f\x2c\xff\xde\x58\xb2\xe9\x24\x6c\x2a\xce\x99\xbf\xef\x98\xbd\xbb\x62\xef\x69\xd5\xee\x4c\x1a\x65\x19\x3a\x6f\x4f\x68\x95\x6e\x39\x85\xea\x2a\x63\x77\xfe\xa4\x59\xe0\xac\xae\x75\x58\xb5\x4e\xeb\x1a\x28\xb7\x91\x68\x0f\xe6\xfc\xf3\x90\xfc\x83\xec\xca\x15\x64\x1f\x77\xbb\xa7\xc0\xb3\xe6\x14\x22\x3f\xf8\x1f\xdd\x4c\xfb\x4b\xb8\xc5\x17\x2c\x63\xac\x97\x75\xe1\x53\x69\xbd\xa2\x9b\x7b\xe1\x53\x59\xbd\x72\xdb\x32\x1f\x41\x11\xa6\x0c\x93\x31\x5a\x29\x22\x30\x9f\xf2\x6e\x68\x16\x54\xfe\xb2\xee\xd6\x2b\x3a\xe4\x81\xd5\xee\xf2\xfe\x78\xc6\xbb\x12\xbd\xa3\xd0\xb1\x53\x76\xa0\x6d\xdd\x33\x6b\xe6\xa7\xc4\x0d\xb1\xbe\xa3\x45\x02\x7a\x9b\x28\xb7\xd6\x3e\xb5\x13\xe6\x98\x2c\xd4\x92\xd6\x4f\xb1\x80\x5b\x82\xa7\xd7\xb5\xfb\x91\x76\x36\xbe\xd6\xf8\x0f\xa5\x89\x4e\xec\x12\xd8\xaf\x5c\x03\x39\xc3\x02\xc3\x1c\xfb\x9d\xdc\x97\xe5\x16\xce\xfe\xba\x2b\x67\x7f\xe3\xa5\xb3\xbf\xf1\xda\xd9\xaf\x5f\x3c\x25\x36\x0f\x4e\xd5\x92\xaf\xc5\xca\x8e\x2e\xaf\x50\xd5\xf9\x56\x1b\x95\x63\x7f\xa9\xb0\x1c\xfb\xcb\xc5\xe5\xd8\x2f\x0f\xcc\xe1\x58\xb4\x38\xa0\x4e\x69\x3b\x7f\x21\x51\x07\xdc\x7b\x9f\x87\xdc\x4f\xfe\x72\xa9\x9a\xc6\xdc\x17\xbf\x52\xf9\xf4\x79\xe5\x4b\x84\xf4\xd8\xaf\x8b\xe9\x81\xda\x6b\x1f\xbb\x2c\x29\x01\x52\x7e\x3c\x3e\x1c\x98\x2f\x15\x40\xbd\x69\x34\x65\x39\xc0\x4b\x9e\xf9\x50\x97\x3c\x2b\x82\x14\x5a\xc5\xb2\x22\x60\xbe\x4d\x28\xaa\x3c\x0c\xf6\xe1\x34\xd8\x38\xb0\xc8\x7e\x9b\x9c\x34\x72\x3b\x47\xa3\x4d\x1a\x85\x5d\xc1\x2b\x74\x03\x8d\x54\x2f\x62\xf7\xab\x59\xa0\xb2\xb0\x64\xe9\xd9\x62\x87\x37\x96\x8d\x75\xe2\xf0\xb9\xfc\xe9\x32\x31\x46\x36\x29\x34\xe5\xb1\x60\x45\xf4\x13\xa4\xba\xf3\x27\x8f\xc6\xce\x2f\x6c\x0b\xe9\x64\xff\xb2\x30\x40\x3e\xf9\xb7\xa4\x93\x17\x27\x05\x1e\x12\xee\x8a\x95\xaf\x8e\xa5\x24\x7c\xea\xc8\x8f\x66\x61\x58\x1a\xf1\x21\x2b\xe8\x35\x53\x27\x2c\x95\x63\x4c\x54\x58\x24\xae\xdd\x4c\xd9\xca\x70\xac\x44\x4a\x96\x83\x36\x44\xc8\xaf\x01\x47\xe7\x5e\xc2\xf8\x8e\x86\xd9\x1e\xc2\x96\x8d\xf0\xa3\x1e\xa6\x77\x48\xe2\xc3\x00\xcc\x42\x8b\x61\x2d\x0e\x14\xc7\x74\x44\x14\xce\x9b\x9a\x7f\xbc\xf7\x68\xdf\x22\xf8\x9b\xbe\x72\xda\xa2\xe2\xa1\x9b\x08\x3c\x75\xf2\xd5\x3a\xf2\x83\x17\xb9\x42\xbf\x7d\xca\x80\xf5\x47\x6f\x28\xd0\x3f\x63\xb0\x7e\xe5\x3d\x4d\xb1\x59\xf7\x02\xed\x32\x83\xad\xd9\x51\xfd\x2b\xc2\x93\x1f\x48\x23\x50\xaf\x90\x06\xe9\x01\x44\x81\x73\xe0\x01\x62\x3a\xbe\x44\x73\xce\x28\x9d\x7a\x98\xbf\xf5\x07\xb2\xb3\x47\x7a\xc4\x8e\xb5\x84\x4d\xb5\x56\x53\x0f\x5b\x3f\x01\xad\xb0\xf4\x10\xa2\xa7\x11\xcb\x0c\x24\xe4\x67\x8e\x3a\xb8\xf0\x7e\xb7\x74\xcb\x65\xa3\x6f\xca\x9b\xab\xf7\x22\x87\xfd\x11\xfc\xc8\x1d\x55\x51\x71\xe1\xb4\x3a\x23\x91\xbc\xa4\xc3\x89\x93\x38\xaa\x90\x73\xd0\x4e\x8a\xce\x6c\xef\x47\xb7\x41\x0d\xcd\x84\xca\xc9\x7c\xa5\xd0\x94\xb6\x06\xd5\xdb\x05\x26\x84\x62\x37\xfb\x91\x7d\xff\x62\x38\x7a\xdb\x99\xfc\xa4\x96\x34\x52\x4a\xf9\xb2\xe9\xb0\xc3\x6a\xa9\xb7\x9d\x3b\xec\xda\xd5\x37\x0c\x45\x64\x2e\xf5\x16\xb2\xed\x4c\x55\x31\xee\xc8\x8a\x4f\x19\xe5\xfa\x56\x1f\x73\x49\xe5\xba\xcb\x85\x4d\x4a\xd8\xc8\xbb\x9b\x8f\x9a\x91\x08\x58\x21\x43\x22\x66\xd8\x02\xc9\xb5\x4a\xde\x00\x52\x8c\x1f\xe0\x3f\x9d\x31\xcb\x5e\xd3\x39\x5c\xea\x7b\xde\x66\x4c\xfc\xec\xa8\xcb\xbe\x7d\x9c\xda\x4b\x07\x8a\xf1\xfa\xbb\x52\xdc\x93\x44\x88\xcc\x09\x7b\xb2\x42\x40\xa7\x0e\xba\xe6\xb4\x4b\x0e\x29\x37\x5f\x97\x0d\x7f\xe2\xf7\x72\xb9\xb9\x77\x66\x1f\x05\x7e\x12\x28\x97\x03\xd3\x6d\xcc\x0b\xdb\x72\x3b\xff\x3c\xba\x73\x27\x77\xd6\xfe\xfe\x3b\xa9\x53\x6e\xe8\x13\x38\x27\x00\xf1\x16\x57\xab\x70\x99\x06\x16\x37\x85\x65\x0f\x46\x2f\xa6\x0b\x88\x16\x17\x86\x74\x41\x85\x75\x49\x44\x97\x12\x07\x21\xeb\x6b\xea\x2e\x8a\x3a\x87\x92\x7b\xbb\xbb\xed\x72\x6f\x1a\x13\x8b\xc5\x33\x93\x37\xa5\x05\xcb\x76\xf3\xa5\xd4\xc6\x3c\xf7\xd5\x33\x8e\x34\xdf\x7c\x23\x6e\xf7\x97\x71\xfd\xca\x6b\xd5\xbd\x84\xb0\xb9\x6f\xea\xb1\x6d\x1e\xda\xf7\xdc\x87\x76\x49\xc4\x4e\x4f\x51\x7a\x4b\xe5\x58\x5d\xa0\x5d\xd0\xcb\xbe\x42\x2d\xe0\x7d\x2e\xd1\x80\xd5\x6b\x6a\x1c\x01\x79\x19\x2a\xbd\x25\xc1\x87\x5b\xa4\x52\xab\xe0\xd9\xa6\xe8\x75\x06\xb7\x4f\x9c\x16\xd3\x31\xb9\x18\x54\x51\x89\x0c\x94\xa7\xc7\x22\x46\x33\x14\x04\x72\x8e\x53\xe4\x68\xcf\x7e\xe3\x26\x75\x0d\xba\x3f\x6a\xa9\x95\xe8\x1a\xcc\x48\x95\xb6\xc1\xfd\xed\xea\x1b\xcc\xdc\xe4\xf5\x01\xde\xef\xdb\xcf\x8a\x0a\x88\xdb\x6b\x68\x20\xec\x04\x56\xcb\xb8\x95\xef\xa3\x4f\x5f\x8f\x1d\xab\x73\x16\x6f\x9d\xc8\xee\xcd\x01\x62\x53\xd8\x61\xab\x8e\x40\xcc\x3e\x96\x0e\x1b\x0b\x99\x05\x5f\xa2\xf7\x2c\xb1\x72\xf7\xef\x72\x39\xc2\xbd\x2a\x39\x42\x85\x14\xe1\x5e\xa5\x14\xa1\x5a\xd4\x73\xaf\x28\xea\xd1\xcf\x38\x39\x01\x5e\x07\xec\x30\xbd\x62\x35\x1d\x85\xc9\xcb\xf5\x52\xf2\x51\xa1\x2d\x17\xa5\x0b\x9d\xc3\x59\xc2\x26\x79\x69\x4d\x0d\x9b\xb8\xe9\xa9\x81\x68\x58\xa0\xd8\xf5\x18\xca\x97\x24\xe1\xfd\x1a\x12\x96\xcb\x8f\xee\x57\xcb\x8f\x2a\xc8\x78\x7f\x01\x19\xab\xda\x29\xf9\xea\x93\xd2\xfb\xe4\xce\xbc\xf7\x61\x65\x72\x56\xa2\x5d\x8d\xa0\xf9\x67\x71\xe5\xd6\xee\xad\x70\x0d\x5d\x16\x7c\xf8\x81\x79\x6f\x29\x51\xd0\x83\x1c\xf5\x5a\xa6\xba\xb6\x7e\x43\xb0\xb6\xd5\xe1\xf8\xf3\xa0\x2a\x2f\xb2\x00\x53\x60\x79\xbb\x11\xe5\xe6\x7d\x0d\xa1\xdd\x6c\x24\x37\xd8\xcf\x20\x90\x9b\xb6\x73\xac\x89\xb5\x76\x85\x86\x7a\x75\xc1\xdb\x9a\xf2\xa8\x29\xc4\x82\xdb\xfb\xb2\x52\xa5\x6e\x29\x00\xd0\x8d\xc4\x10\x01\xf5\x80\x69\x49\x44\x92\xb5\xaf\x9e\xde\xaa\x34\xef\xf1\xe1\x61\x21\x98\x95\xa0\xe5\x1e\x9d\x42\x60\x1c\xdd\x49\x5b\x51\xbe\x31\xda\xb8\xf3\xe1\x9b\x08\xb9\x33\x69\x93\x21\x8d\xb3\x59\xc2\xf2\x3b\x20\x3e\x04\xf3\x98\x9b\x35\x18\xe4\xf9\x0b\x0c\xaa\x17\xcd\x53\x93\x4f\xce\xf6\x34\xcb\xe8\x70\xf2\x12\xb7\xe8\xa5\x3b\x59\xd1\x37\x8b\xab\xd9\x10\x51\x83\xdc\x75\xab\x3a\x07\x82\xfb\x00\x93\xfb\x2c\xf4\xf4\x82\x47\x81\xb8\xe8\x40\x0d\xfb\xf8\x62\xfa\x9c\x78\x66\xff\xfc\xfd\x77\xc2\x3a\x69\x32\x54\x17\x3b\x17\xd8\x3b\x43\x0a\x2f\x39\xd5\x7b\x5c\x75\x6a\x6c\x56\x34\x60\x66\x49\x6e\x0d\x72\x87\xb8\x2a\xdb\x1b\x44\xf4\xf4\x16\xae\xb4\x8e\xfa\x68\x63\x68\x9c\x34\x14\x5c\xe3\xb4\x18\xbf\x71\xff\xdb\x9a\xbd\xb6\x35\x3b\x1a\x79\x8b\x76\x34\x5a\xb8\x6a\xfd\x1a\xde\xf9\x75\x03\xab\x16\x2d\x28\xbe\xd8\x85\x1b\xb0\xba\x85\xab\xab\x2e\xb7\x3c\x46\xa3\x35\xd7\xc7\xbd\xaf\x3a\xbe\xe9\xf6\x63\xf7\xf1\xf4\x17\xd8\x21\x2b\x03\x75\xdd\x2f\x80\xd6\xae\x58\x05\xf3\x47\x85\xa6\xdb\x4e\xb8\x40\xf4\x02\x1a\xd0\xe4\x88\xff\x56\x9d\x89\x78\xb7\x1c\xbe\xae\x19\x0f\xd0\xc6\x75\x83\xa7\xec\xf3\x84\xd3\x9f\x40\x4e\x59\x49\x9b\x07\x37\xb2\x37\x76\xbb\xe4\x98\x9e\xb1\x08\x93\xf0\x69\x7f\x23\xe5\x5f\x34\x14\xd3\xbc\xeb\x51\xde\xe1\x68\x10\x8a\x41\x77\x4a\xd3\x8c\x25\xdd\x34\x19\x76\xdf\xb8\xcf\xf5\xff\xa4\x7e\x76\xdc\xf7\x34\x08\x78\x34\x86\xcc\x90\x8e\x58\x55\xf5\x3e\xa6\x49\xca\x0e\x23\xfc\x82\xb1\xa5\x3a\xb1\x53\x43\x6e\x71\xbb\x6d\x02\x01\x54\xb1\xe7\x2f\x04\xb9\x60\x64\x42\xcf\x19\xa1\xca\x9b\x8b\x0c\x68\xf2\x83\x6d\x74\x20\x82\xf9\x61\xaa\xd3\xb0\xf2\x68\xec\x34\xbb\xa4\x59\x70\x84\x11\x2b\x11\xfe\x82\x47\x1a\xde\xac\x18\xcf\x8c\x16\xcd\x36\xd5\xac\x82\xeb\x35\x1d\x0e\x21\x89\x4d\x2c\x32\x16\x41\x52\x9b\x48\x44\xe4\x37\x96\x08\x32\xa5\xc9\x98\x9b\x20\x6a\xb2\xaf\x1d\xd5\x0e\x46\x4f\x79\xa6\x6f\x38\x63\x96\x1d\x88\x69\x3c\xcb\x58\x00\xef\x0b\xd9\x52\x47\xc2\x9b\x8e\x21\xaa\xd7\x6c\x24\xd7\xa1\x99\x49\x9c\x44\x74\x1e\x82\xfd\xe9\xdf\x72\x0f\x6a\x36\x10\x7a\x07\x53\x10\xab\x29\x75\xf1\xe0\x7c\x2f\x8f\x48\x65\x25\x56\x98\x2c\x49\x9d\x5e\xdd\x25\xba\xcf\x9d\x61\xc8\xc1\xc4\x3f\xc8\x26\xe4\xae\xd7\xe2\xdf\xe5\x80\x3b\x3c\x8a\x58\x02\x9f\x35\xa1\x75\x82\x46\xca\x23\x96\x90\x74\x22\x66\x61\x00\x21\xe6\x20\x12\x4b\xe0\x87\xa1\xc3\x18\x72\x8a\x28\x07\xa6\xd6\x33\x92\x3b\xe6\xc9\x0f\x7a\x7a\xcd\x09\x29\xbb\xa7\xec\xfd\xb4\x23\x29\xbc\x12\x95\x73\x22\x6c\x73\xa8\x36\x03\xd7\x08\x74\xb6\xeb\x86\x74\xce\x92\x14\xbc\x04\x8f\xf8\x34\x0e\xf9\x88\xb3\xa0\x4d\x06\xb3\x8c\xf0\x28\x8d\xd1\x55\x7e\x4e\xbc\x95\xd3\x48\x89\xbb\x54\x50\x79\xa1\xfc\x05\xff\x09\x6b\x3d\xa2\x21\xf9\x98\x62\x55\xeb\x23\x9b\x09\xc2\xa2\x54\x1e\xf8\xe8\x38\x89\x86\xb0\x4e\xff\xd0\xf3\xcf\xfa\x22\x80\x0e\xc7\x6d\xca\x95\x3b\xa3\xd3\xd9\xf5\x98\x48\x6a\x19\x87\x44\xfa\xb7\xa1\x3b\xed\x09\x1b\x75\x4c\x81\x06\xcb\x43\xb8\x55\x72\x4d\x15\x48\xd9\xcb\xd5\xf0\x9a\x9e\xf0\x80\x1d\x71\xf0\x40\x7d\x2b\x02\x34\x5e\x92\x3d\xc8\x97\x9b\xc8\x72\xe5\xf0\x25\x78\x72\xdd\x02\x79\x41\xaf\x1c\x18\x16\xc1\x86\xe6\xd1\x76\x42\x6e\x2b\xbd\x75\x9b\x34\xfe\x37\xf2\xac\xa5\xe7\x62\x06\x0e\x3b\x53\x91\x66\xa0\x7d\x0e\xe7\x84\xc9\x8b\x06\x3a\x32\xa3\x37\x78\xc0\x9c\x48\x0d\xff\x1b\x0d\x12\x71\x91\xb2\x04\xfc\xe9\x29\x19\x4e\x68\x34\x64\x92\xaf\x24\x7f\x62\x06\xd6\xbf\xcb\x75\xf0\x8f\xce\xff\x46\xef\x43\x46\x53\x89\xfd\x1c\xa3\x3c\xf0\xa9\xbc\xdd\x10\x95\x28\x8c\x45\x81\x36\x9f\x36\x35\x08\xf1\xec\xa5\x6f\x39\xe2\x6e\x39\xb3\x27\xa7\xa6\x2c\x4e\xd8\xb9\xde\x98\x1d\xf5\xba\xfd\xa8\x4e\x0b\xa7\x9a\xe1\x6a\x1a\x04\x28\xb8\x76\x3d\x4e\xa1\xe0\x30\xb8\xd4\x66\x12\x69\x87\x47\x01\xbb\x7c\x37\x52\xa0\x79\xf1\xb9\x04\x95\x33\xbb\xb3\x57\xb8\xe2\xea\xef\x9e\xe4\xa8\x88\x1f\x97\xcb\x53\xfb\x35\xed\xc4\xb3\x74\x52\x6c\x2f\xcf\x1e\xb6\x41\x8c\xbb\x98\xbb\x13\xb8\xbc\x9a\x3a\x8c\xa0\x54\xef\x56\xbf\x52\x14\xf1\x79\x3d\x03\x96\x75\x46\xd7\xed\x92\x23\x79\x58\x8a\x99\x51\x7e\x98\x64\xea\x24\x85\xc3\x74\x48\x23\x92\xb0\x73\x96\x64\xb6\x8e\x76\xf8\xe2\x19\xfa\x87\xd3\x30\xd4\x14\x95\xbc\x87\xfe\xd5\xb7\x15\x7c\x8e\xac\xa6\xef\xea\x40\xd7\xcd\x79\x26\x24\xc5\x53\xda\x54\xf3\x8c\x22\xf2\x5c\x91\xbf\x52\xd8\x5a\xa7\xf6\x05\x0f\xc7\x69\xee\x8e\x07\xb3\xee\x5f\xe4\x4a\x3c\xab\x48\xa1\xf7\xde\x75\xe4\x99\xd7\x1f\xb9\x0d\xde\xcd\x35\x74\x97\x34\xe2\xcb\xc6\xd3\x5b\x5e\x5f\x20\x50\xa5\xde\x69\xcc\xc9\xf3\x7f\x33\x96\xcc\x8f\x58\xc8\x86\x99\x48\x9e\x87\x61\xb3\xd1\x99\xce\xf8\x0e\x46\xb5\x74\x7a\x64\xbc\x9f\x39\x7a\x33\x73\xf2\x77\x07\xa3\xe6\x48\xc2\xc9\x5d\x8f\xf2\xba\xf1\xdc\x00\xf2\x13\x68\x31\x9d\xf0\xd3\x9c\xab\x87\x1d\x2a\x32\xb9\x8b\xca\x03\xf5\x90\x54\x4c\x9c\xfb\xb3\x6a\xd6\x34\xbe\xab\xbc\x21\x46\x15\x4f\x91\x67\x26\x2e\x67\x99\xaf\xb6\xbb\xa8\xaf\xbc\xed\x44\x79\x2b\x5c\xcb\x8e\xf2\x6c\xd5\x1d\x25\xed\xa4\x71\xc8\x87\xcc\xa0\x68\x93\xbd\x02\x66\x6f\x45\xef\x5a\xec\x35\x53\xe1\x2e\xc4\xa7\x15\xe0\xf5\xfc\xec\x99\x80\x6d\xc2\xb6\x6b\x33\xed\x32\xac\xe4\xf6\x99\x93\xbb\x64\xef\x34\xc7\x41\x86\x6f\x72\x5b\x53\xc1\xed\xb0\xe4\xd0\xb1\x7b\x54\xf5\x16\x5e\xb5\x89\xa7\x13\x71\xb1\xc2\x26\x6e\xbc\x85\x88\x91\xdc\x54\xb7\xd9\xed\xa2\xf5\xca\x05\x97\xc7\x33\x3d\x63\x04\xee\x84\xe0\xc9\xc4\x2e\x33\x92\x89\xd8\x06\xc0\xd0\x16\xe9\x99\x20\x94\x1c\x7d\xa8\x3d\x79\xa8\xf9\xd3\xf8\x67\x21\x03\x9e\xf8\x7c\xb8\x43\xf6\x4e\xab\xce\xa1\x85\xeb\xcd\x51\xe3\x7a\x6b\x4e\x55\xbc\x7d\xdb\x6f\x4b\xeb\xb7\xcb\xfa\x00\x0b\x62\x8a\xa6\x2a\xaa\x99\x92\xe8\xc6\x9f\xe5\x8d\xa1\x27\xff\xaf\xad\x16\x7b\x4f\xfd\xb7\xed\x74\xa6\xe7\xfc\xad\x94\x5b\xee\x50\x14\xba\x0a\x29\x56\xf1\xa2\xbd\x1d\x3d\xce\xfd\x2f\x4b\x26\x5c\x9c\x88\x31\xcb\xf0\x61\xfc\xd4\x7b\xfb\x63\x59\xf1\xd5\x1f\xe9\xfc\xf8\xf0\xea\xc7\x07\x99\x32\x61\x23\x3d\x2c\x94\xff\x67\xe2\x04\x3f\xd1\xf6\x6d\xaa\xc5\x7f\x73\x06\x76\x52\x50\x16\xd3\x04\x5e\x96\x80\xa4\xa7\x0d\x59\xae\xaa\xa5\x8b\xdf\x29\x2c\xdf\x95\x48\x17\x1f\x7c\x99\x33\x4d\x5d\xd1\x91\xfd\x61\x01\xdc\xcb\x23\x79\xe6\xbe\x6f\x52\x27\xa9\x92\xb3\x39\x91\x67\xc4\xfd\xf9\x54\xbe\xb8\xc9\x05\xa3\x67\x28\xb2\xfa\xf1\xf5\xf3\x83\x9f\x5f\x1f\x1e\x1d\xcb\x3d\x11\x92\x5e\x85\x10\xbc\x80\x34\xd2\x61\xc2\x63\xb0\x2b\x87\xad\x19\x44\xb4\xb0\xcd\xa7\x3f\xf1\x80\xa2\x13\x8c\xb3\xe8\x55\x21\x04\x28\xb1\x8f\x50\x4b\x5d\x7c\xa7\xe9\xdf\x26\x4e\x37\x1d\x6b\xe7\x12\xf9\x59\xfd\x7c\xea\x73\x90\x61\x8f\x3d\xb9\x5b\x98\x1e\x9b\xf3\x5a\xd5\xea\x64\xe2\xb5\xb8\x60\xc9\x01\x4d\x59\xb3\xd5\x52\x87\xb5\x0d\xdd\x9d\xda\x19\xb1\x21\xcd\x55\x99\xbf\x83\xcf\xc0\x5a\x66\x80\xc3\xc0\x2c\xc5\xf2\xc4\xd0\xf1\x56\xa0\xa4\xf5\x54\xee\xd3\x2c\x0d\x79\x94\xed\x28\x8b\xb4\x9d\x90\x47\x8c\x44\x62\x07\x02\x6f\xed\x24\x8c\xa6\x29\x1f\x47\xb7\x88\xac\xac\x6c\x79\x71\x6b\xb0\x67\xb5\xf1\xcc\xc9\x49\xeb\x5d\x8d\x04\x34\x68\x86\x8b\x5f\x71\x74\x72\x42\xec\xdc\xc3\x17\xe7\xfe\x30\xb0\xf2\x2d\xa5\xd4\x6f\xe1\x74\xd8\xb7\x96\x61\xb1\x26\x7a\xd6\xd9\xa6\xc1\x80\xc7\xed\x89\x35\xbc\xb8\x52\x9f\xdd\x20\x14\x28\xd7\xf3\x7c\x8b\x25\xf2\x1d\x75\x67\x83\x14\xb0\x33\x86\xd7\x06\xcf\x72\xd8\x51\x88\x54\xd4\x55\x41\x67\xae\x9c\x7e\xbb\x7c\x5f\xa0\xdd\x5b\xd3\xe9\x4a\xf2\xbe\x05\x7d\x48\xf9\x8c\x2b\xce\x73\xa6\x46\xa5\x67\xd3\x73\x79\x85\x32\x4a\xcb\x44\xce\xfa\xda\x7e\x67\xb4\x89\x41\xae\x37\xb9\xfd\xed\xe1\x57\xad\x3d\x59\x9c\x1d\x6e\xab\xb9\xcc\x6e\x3e\xf5\xdc\x17\x95\x27\x0e\x83\x7b\x6d\x2f\x29\xd7\x8d\x64\xcd\xda\x6e\xd2\x9f\x2f\x29\x9d\xcd\xdb\xea\x0c\x5e\xcb\x27\x8a\x01\x24\xcb\xa4\x16\xb9\xee\x3c\x21\x3a\x99\xc7\xce\xde\x75\xa6\x08\x29\xcd\xff\xd1\xb6\xef\xab\x0f\x70\xde\x90\x71\xc2\xe6\x64\xc2\xc7\x93\x50\x62\x57\x9f\x7f\x61\x83\x33\x9e\x1d\xd3\xf8\x27\xfd\xe1\x40\x84\x22\xd1\xf9\x46\x62\x1a\xb2\x2c\x63\x9d\xa1\x98\x4e\x45\x84\xc9\xe4\xf1\x6a\xaa\xf1\x0f\xe8\xf0\x6c\x9c\x88\x59\x14\xd4\x55\x04\xcc\x3f\x86\xd4\x5a\x1c\x5a\x7f\x19\x5d\xc5\x4d\x62\x8a\x6f\x90\x66\x43\xc4\x74\xc8\xb3\x79\xa3\x65\xe7\x2b\x0c\x0f\x26\x34\x1a\xb3\x1e\x31\x5f\xf5\x47\xf5\x3b\x97\xfd\xc4\xf1\x65\xff\xbc\x52\xa7\x9d\xd1\xba\x96\x82\xd7\x91\x1d\xe5\xc0\x04\xdf\x0f\x30\xd6\x24\x8f\xd2\x8c\x46\x43\xd6\x46\xf9\x75\x14\xb0\x84\x50\x02\xdd\x81\x8f\x3c\xc0\x37\x31\x3d\xa7\x19\x4d\x36\xcf\xc6\xf0\x56\x3f\x56\xd6\x09\x14\xfb\x16\x9f\x34\xd7\x11\x1a\x16\x6e\x0c\x5f\x7f\x12\x86\xd5\x72\xaa\xf0\xa5\x72\xa9\x00\xa3\x69\xe5\x9d\xea\x26\xd9\x21\x46\xa5\xe6\xc5\x5b\x75\x14\x65\xc6\x8b\x26\xb6\x71\xd6\x8c\xeb\x23\x7a\xca\xa3\xb9\x6a\xde\x4f\xde\xfa\xc8\xab\xef\xbe\x87\xbc\xeb\x1d\xef\x00\xb8\xbe\xf1\xdc\x89\x19\x80\x20\x3c\x1f\x29\x60\x45\xb7\x69\x34\x6c\x26\x27\x4b\x39\x26\x9b\xc6\x8c\xff\xaf\xeb\xfe\x08\x6e\xd4\xba\xe5\x25\x5c\xb6\x96\xf7\xd3\xb2\x83\xb4\x33\xd0\x72\x53\x5d\xbb\x12\x98\x25\x7c\xd3\x1c\xaf\xb4\x65\x12\x97\x7b\x03\x6c\x13\xef\x39\xd1\x53\x4f\x91\x7c\x84\x10\x27\x7b\x3f\x5e\xa9\x35\xd7\x80\x31\x32\x2c\x52\xa4\xe1\x72\x7a\x3f\xa5\x7f\xfd\xbc\xf4\x22\x74\x82\x1d\xb7\xff\x2c\xdb\xd8\xad\xab\x45\x4c\x83\x01\x4d\x1d\xfe\xad\x9d\xa3\xd6\x2a\xe8\xd4\x1a\xa8\xdd\xb3\x96\x45\xc8\x9d\xe8\x01\x35\x1b\x54\x0b\xc2\xa4\x8e\x5a\xca\xce\xc0\x70\x50\x89\x0f\x1d\xcf\xf9\xbb\x6d\x60\x7b\x6e\xcd\xcd\x4d\x00\x05\x72\xd5\x6a\x3a\x99\x1d\xb7\x21\xac\x7c\xf4\x55\x3f\x31\xbf\x65\xad\xfe\x96\xb5\xfa\x2f\x9a\xb5\xfa\xeb\x34\xf2\xfe\x22\x5f\xc3\x9b\xa6\x83\xd4\x61\x10\x33\x41\x62\x4c\xbb\xcb\x23\x22\x12\xf9\xd4\x91\x97\x7d\x4c\x01\x83\xd1\xeb\xc1\xa0\x43\x12\x0e\x04\xa6\x7f\xe6\xd7\x8e\x79\x39\xf8\xc9\xdb\x20\xd1\xd7\x80\x11\xed\x4d\xca\x23\x95\x3f\xc0\xa4\x73\x83\xac\x15\x10\x74\x61\xd1\x1b\x62\xe9\x27\x84\x24\xb2\x49\x88\xbc\x6e\x98\x7d\x44\xb0\x30\xce\x3e\x82\x6d\x2d\xd0\xbe\x4d\xc6\x4c\xfe\xec\x91\xf6\x71\xa8\xab\x84\xda\x57\x93\xb3\x46\xac\x7d\xe5\x47\x3f\x37\x4e\xf7\x37\x10\x61\x5f\x33\x54\x79\x88\xfd\x0d\x82\xd7\x77\xbb\xe4\x68\x16\x83\x1d\x20\x1c\x1b\xff\xdc\x7b\xd0\xb9\x6c\x9b\xa5\x87\x6a\x9a\x80\xd0\x0c\xd3\x8e\xc4\x82\x7b\x91\x70\x6e\x97\x38\xcb\xe3\x08\xd4\xfc\xe6\x23\x49\xa3\x58\x47\x85\x32\xd9\x6a\x94\xf5\xaf\x6e\x8c\x1b\x07\x54\x87\xc6\x67\x51\x49\xf3\x25\xcd\xea\x80\x32\x15\x4d\x39\xf1\x66\x8a\x91\xf5\x81\xf9\x4b\x82\x84\xe3\x92\x30\xe6\x44\xfe\xab\x1e\x1e\xf4\xc5\xc0\xe1\x73\x96\xe4\xb4\x88\x01\xcd\xe8\xce\x74\xc6\x77\xf0\x80\xf4\x35\x89\xb6\x2b\xbe\x99\xb7\x8d\x64\x9e\xeb\x1a\x21\x1e\xa0\x5c\xe9\x2c\x0a\x20\x02\x43\xd3\xa9\x51\x63\xa0\xa6\xb6\x2c\x0b\x5c\x39\xa7\xde\xdc\x57\x4c\x6c\x8e\x3e\xcb\xcc\xae\xeb\x00\xef\xf4\xeb\x06\xd9\xba\x04\x74\x86\xec\x67\x8e\xb6\xe7\x99\x89\xc4\x9d\x9b\x52\x2f\xf4\x93\x47\x0c\xb7\x09\x9f\x4a\xd8\xf9\x4a\x2a\x79\xc1\xfe\xdd\xad\x78\x41\xbc\xd4\x3a\xc2\x94\x93\x65\x89\x10\xc1\x85\xe8\x9b\xa5\xc1\x37\x21\xc1\xbe\x81\x90\xbf\xfc\xe8\x7c\xb2\xc4\x9d\x8f\x6e\x97\xfc\x38\x87\xac\x0c\x68\xfa\xcd\x53\x32\x65\xd9\x44\xc8\x6b\x50\xe9\x8e\x4e\xa3\xc0\xad\x5c\xb6\x23\xb6\xc9\x5c\xcc\x1a\x09\x23\x6c\x34\x62\x10\x1a\x25\x9c\xdb\x3c\x59\x94\x7c\x77\x21\x92\xe9\x44\x84\xec\x3b\x92\x4d\x68\xe6\xa2\x1b\xcd\xa2\x88\x85\x29\x81\x0b\x4d\x23\x25\x13\xce\x12\x9a\x0c\x27\x7c\x48\x43\x32\x03\xfc\x29\xc9\x26\x89\x98\x8d\x27\x68\x9a\xa6\x6f\xae\x44\x44\x84\x46\x2e\x2e\x16\x65\x3c\x91\x4d\x07\x7c\x34\x62\x70\xcd\x8d\x69\x92\xb9\x79\x9b\x3a\x06\x5e\x12\x00\x28\x6c\x72\x27\xaf\x1a\x7d\xaf\x82\x7d\xd3\x8c\x0e\x42\xd6\x47\xb2\x1f\xcd\x06\x59\xc2\xd8\x61\x94\x09\xe3\x98\xa0\xae\x18\x6e\xe3\x2a\x0c\x95\xdd\x1c\xab\x63\xa3\x55\x6f\xc6\xb5\x49\x1e\x56\x8e\xea\xbb\x20\x76\xef\x92\xa1\x61\x3d\xee\xdc\xd7\xec\xb9\xc1\x3e\xb3\xe6\x46\x53\x17\x6d\xb2\xdb\x25\x07\x54\xf9\x09\xe1\x5c\xb0\x40\x39\x09\xed\xa4\x26\x65\xc9\xc2\xc4\x1c\x65\x8b\x2d\x27\x98\xae\xec\x6a\xd3\x1a\xef\x54\x31\x82\x17\x4d\xbe\x9e\x09\x6e\x55\x8c\xb9\x18\xbd\x0b\x5b\x5f\x18\xbe\x4b\xdd\x82\x4b\x64\x8f\xf8\x48\x32\x62\x47\x05\xb8\x8e\x98\xfb\xf3\x9f\xe7\x09\xba\xd4\xdb\x51\x09\x76\x8b\x72\x5a\x4d\x93\x6d\x48\x5a\x1f\x7f\x99\xc6\x8a\x31\x4d\x53\x7e\xce\xde\xc5\x2a\xa8\xb6\x9d\x14\xe3\x3e\xee\x94\x3a\x0e\xea\x4e\x69\x89\x27\xbc\x5b\x27\xe7\x81\xef\x7c\x1a\xd2\xe8\x63\xca\x50\x90\x55\xb0\x0e\xf2\xc7\x56\xe9\x85\xfb\xa4\xce\xe2\x67\x29\x0b\x9e\x9b\x72\xe3\x3d\x74\x5c\x0d\x4b\xfc\x78\x47\x74\xc8\x06\x42\x9c\x75\x47\x83\xff\xf8\x6e\xbb\x72\xcc\x74\xcc\x52\xfc\x92\x26\xc3\xee\x50\x24\xac\xfb\xf2\x92\x0d\x67\x10\xcb\x27\x3a\xe7\x89\x88\xe0\xaa\xf5\x9f\x14\x26\xc3\x9d\xd9\xb2\xd9\xbe\x7d\xbb\xa9\xd6\xb9\x32\xe8\x85\x38\x5b\x86\x06\x0d\x39\xbc\x9c\xef\x65\x49\x91\xff\x1c\xd0\x84\xa8\x21\x78\xc9\x27\xdb\xab\x3b\x77\x48\x23\x0f\xd0\x90\x57\xa3\x0b\x65\xad\x2c\x91\xd7\xf3\x5a\xf9\x57\xbf\x89\x12\x18\xaf\x15\x20\xd5\xcb\xc7\x77\xf5\x09\x89\x63\x2a\x65\x7c\xbf\x34\x37\x12\xfb\xad\x30\x88\xf2\xc5\xe5\x97\xfa\xd8\x9c\x6f\x85\xce\xbe\xc7\x25\x4c\x04\xac\xe1\x74\x09\x56\x7b\x23\x02\x96\x44\xfc\xb7\xc4\xf9\xcb\x65\x38\x95\xc0\x74\x27\x60\x19\x1b\x66\x69\x37\x10\xd3\xae\xda\x28\x20\x86\x44\xa8\xe6\x2d\xd5\xec\x56\xb5\x8b\xe4\xcb\xf3\xc1\x3a\x90\x55\x87\x13\x2f\x0e\x61\x21\xf0\x85\x6b\x46\x8b\xd0\xda\xdf\xb2\xe0\xc5\x03\x9f\x0b\x71\xc5\x52\xa4\x64\xfa\x3e\xdf\x1d\x34\x3f\x07\xb8\x2c\x99\x1b\x64\x8a\xcd\x0b\x71\x79\x1a\x19\x4b\xb3\x46\x5b\x49\x88\x4a\x74\x8e\xfb\xbe\x22\xbd\xa1\xc6\xdf\x70\x63\x98\x8e\x59\xe6\x3f\xca\x9b\xfe\xb5\xa5\xaa\xb3\x6e\x12\x42\xe7\x49\xab\xaf\x29\x57\x64\x48\xb3\xe1\x04\x23\xf1\x5c\xd5\xd8\x35\xb3\x69\x9c\xcd\x71\xcc\x7a\xea\x4b\x9b\x7c\xea\x49\xf7\x2a\x40\x74\xd8\x10\xf9\x7f\xf9\x13\xef\xc9\x97\x75\xe2\xad\x70\xaa\xec\x39\x1a\x94\x4d\x4e\x95\xe2\x0d\xc3\x87\xb9\xa1\x83\x47\xb9\x0a\x98\xa6\x72\x73\x28\xda\x24\x6e\xcb\x1d\x2e\xf1\x0c\xfd\xea\xd9\xdb\xa9\x54\x62\xba\x7c\x6f\x77\x23\xda\xc3\x46\x2f\x44\x95\x4e\xee\xde\x93\x96\x15\xff\xff\x8b\x65\x98\xf4\x37\xe3\x53\x96\x66\x74\x1a\x9b\x8c\x51\xb3\xe9\x80\x25\xf2\xd7\x94\x87\x21\x4f\xd9\x50\x44\x90\x20\x98\x66\x18\x92\x82\x85\x34\x4e\xe5\x83\x83\x47\x43\x26\x71\xc9\x5a\x1f\x23\x7e\x49\x58\x2c\xe4\x52\xda\x23\xff\x4d\xa3\x19\x4d\xe6\x64\xef\xc9\xa3\x5d\xb2\xbb\xdb\x83\xff\x91\x8f\xc7\x07\x2d\x9d\x3b\xf8\x9f\x69\x46\x33\x3e\x84\x3f\xa7\x4c\xb6\xf8\x6e\x44\xfa\xf8\x45\xe2\x25\xfb\x9d\xfb\x9d\x5d\xf8\x3d\xa4\x19\x1b\x8b\x64\x4e\x5e\xd0\x0c\xda\xfb\x27\x4e\x75\x4a\x3e\x63\x5f\xaf\xc8\x07\x55\xe0\x0d\x08\x02\x17\xfc\x93\x5d\xd2\x69\x1c\x32\xd5\x6c\x5f\x92\x82\x25\x76\x72\x01\x12\x08\xf8\x3d\xfa\x11\xa6\x22\x64\x9d\x50\x8c\x9b\xfd\x4e\x04\xd9\xf6\x76\x08\xc2\x3c\x95\x20\x57\x6d\xa2\xca\xf1\x77\xb7\x4b\x9e\xfd\x83\xbc\x16\xe3\xb4\x6e\xee\x78\x46\x32\x21\xce\x4c\xda\x49\xe8\x43\x02\x7a\x9c\x73\x31\x84\x98\xc0\x56\xe5\x12\x81\x13\x9f\xe9\xa0\xc7\x5c\x92\xba\x1d\x39\x0d\xd8\x07\xb4\x3e\x2c\x38\x01\x45\x98\xa8\x28\xc7\x5b\x9b\x05\xca\x93\x3d\x3b\x9a\x4f\x07\x22\xac\x52\xdc\xdf\x53\xdc\x85\xc1\x1d\xe4\x50\x07\x33\x1e\x66\x3b\x3c\xd2\xe2\x9a\x84\x81\x8c\x63\xc8\xd2\x8e\x1e\x2c\x9a\xb6\x80\x5e\x82\x3c\x23\x6a\xb3\x8a\xb5\x9a\xc2\x45\x98\x09\xcc\x3f\xa9\xaa\xa4\xd0\x82\xb8\x88\x54\xbc\x88\x8c\x3b\x58\xfd\x20\xf4\xe4\x99\xdb\x4c\x2e\x42\xbd\x5d\x11\xba\x95\x84\xa5\x22\xc4\xb8\x00\xb2\xf8\xe4\x53\x26\x8e\xc0\x5e\xe6\x98\x8e\x3f\x61\xea\xea\x5e\xb7\xcb\x86\x53\xba\xa3\x34\x67\x72\x26\x69\xd8\x11\xc9\x18\x8b\xf7\x1f\xee\x77\x1f\x75\x76\xbb\xff\x2f\x65\xc3\x1d\x91\x1b\x53\x27\x13\xca\xfc\x46\x62\x17\x23\xdc\x70\x53\x87\xfe\x34\x93\x27\x05\x54\x3b\x56\x4d\xe7\x86\xa0\x7b\xa4\xe6\xe7\x47\x3d\xcf\x80\xaa\x6c\x9a\xd3\xf9\xf4\xd8\x8e\x82\x3c\xd3\xa4\xfc\x41\xfd\xd1\x71\xc6\x48\x7a\xde\xa3\x42\xcd\xce\x73\x92\xc6\x6c\xc8\x69\xc8\x7f\x63\x01\x39\x67\x49\x8a\xe1\xc6\xc8\xa7\x01\x4d\xd9\xbf\x58\x26\x67\x87\x5c\x4c\xf8\x70\xa2\x62\x81\xa6\xe4\x53\x11\xf9\x27\x67\xb8\xb0\x3c\xe3\x84\x9f\xeb\x65\xad\x72\xf6\x7f\x7f\xa5\x06\x72\x3c\x61\xea\xaf\x4c\x10\xf0\xc8\xed\xf8\xcb\x1f\x27\xd2\x5f\xfe\x09\xbd\x20\x1e\xc9\x72\xf6\x90\x63\x96\x7d\xa0\x17\xc7\x74\xdc\x04\xd4\xf6\x42\xc5\x25\x5b\x90\x67\x39\xe6\xc1\x77\x2b\x80\xb6\x73\xd3\xd8\x72\x3c\xb9\xc8\x33\xec\xe9\x89\x0f\x82\xae\xc6\xf6\x8e\x54\x0a\x53\x74\xd9\x95\xdd\x99\x45\x53\x9a\x9e\x79\x79\x94\xfd\xbb\x8a\x36\x68\x4c\x58\x8a\x87\x64\x19\xe3\x38\xdd\x87\x0b\x8f\xbc\x0b\x6a\xcc\xee\xfd\x10\x06\xef\xca\xd3\xca\xfb\x99\xd1\xb1\xbe\x36\x79\x42\xbe\x80\x85\x2c\x63\x55\x53\x60\x24\x39\xce\x46\x06\x9d\x86\x23\xb0\xb0\x7d\x19\x0a\x95\x6c\x62\xcb\x44\x0e\x84\xfd\x6a\x1b\x1b\xd1\x57\xbd\x4b\x48\x3c\x07\x22\x3a\x67\x72\x92\x3f\x01\xba\x4f\x28\x9e\xc6\x86\xc8\x2c\x95\xff\xff\x29\x3f\x74\x83\xe6\xd3\xea\x6b\x76\x88\xed\x2d\xb1\x6a\x15\xa4\xbc\x55\x20\xdf\xfa\x8b\x56\x78\xe3\x74\x57\xae\x16\x19\x2e\xe4\xfd\x32\x4e\xf3\xd1\x96\xb0\xdb\xd7\x1d\x88\x6f\xb1\x2b\xd9\x5f\xdc\xdb\x6b\xab\x9e\x74\x7f\x0a\x57\xb2\x2d\x06\x71\xfc\x0b\xb9\xa9\x29\x49\x9f\xf6\x06\xdf\xc8\x3e\xcf\xc5\xb5\x35\xa7\x35\xa8\x38\xa1\x81\xb8\x70\x12\x63\xa1\x57\x94\x2a\x2e\xc9\xcf\x84\x5f\xda\x04\x9c\xb5\xf5\x5d\x42\x81\x9f\x34\xf0\x8f\x06\xb9\x8b\xdf\x4f\x9d\xd4\x68\x03\x71\x79\x04\x5f\x7b\x0a\x1c\x6f\x0c\xda\xc3\x37\xf7\xb6\xae\x4a\xc7\xe3\xfb\xd6\x2d\xf0\xe9\xb2\x9f\x3b\x31\x8d\x59\x82\x2d\xb6\x15\x22\xb9\x4f\x06\x0e\x2e\xb0\x4a\xfc\x40\x03\x3e\x4b\x7b\x64\xdf\x55\x59\xaa\xe1\xb5\xae\xc7\x0f\xec\x6b\xf4\x75\x42\x53\x4e\x9d\xd9\x74\xa6\xaf\x5c\x70\x15\x17\x22\x73\x4c\x36\xc9\x4b\x0e\xde\x3e\xe6\xc6\x91\x09\x09\xaf\x14\xe4\x4c\x29\xb5\x85\x04\x70\x2d\x11\x75\xef\x6c\xbe\x9d\xd5\x54\x6d\xde\xe2\x5b\x53\xe3\xe6\xe2\xb8\x1e\xc5\x9b\x83\x31\x67\x02\x8a\x4b\x81\x04\x2c\xce\x26\x6d\x32\x14\x49\xc2\xd2\x18\x45\x30\x82\x7c\x0a\xe2\x4f\x84\xab\xa8\x90\x31\x1b\xaa\x99\xc5\x8c\x6d\x90\x41\x5c\x4e\x2c\x5e\x16\xc9\x80\x65\x17\x8c\x45\x64\x97\xd0\x28\x20\xfb\xf7\x09\x8f\x86\xe1\x2c\xe5\xe7\x8e\x0d\x2d\x0b\xd9\xb9\x4a\x4a\x54\x31\x2c\x94\x69\x54\x3a\xb8\xa9\xd5\x22\x3b\x1a\xb1\x04\x23\xa7\x29\xd9\x69\x60\x9b\x49\xff\x6f\x46\x93\x65\x1c\xdc\xac\x45\xa8\x5c\x96\x05\xa7\xb5\x25\x7d\xd2\x54\x62\xd5\x0a\xbf\x34\xa3\x29\xf6\xc1\xf2\x29\x78\xb1\xcf\xe6\x3b\xfe\xd4\x1f\xcd\xbc\x99\xef\xa6\x64\x63\xdf\xb6\x0a\x7f\xb6\xa1\x9b\x0d\x14\x7b\x23\xff\x32\xed\x1a\x37\xb7\x0d\xe3\x33\xda\xa1\xfd\xe3\x19\x06\xcc\xb4\x25\x7f\x27\xfb\x0f\x8a\x99\xed\x79\xea\x80\x7c\x82\x98\xd9\xe6\xe7\x5d\xd2\xf8\x44\x38\xe6\xb8\xe7\xd3\x18\xd9\x9e\x05\x9d\xb2\x70\x8a\xae\x4f\xe1\x4a\xa9\xd4\x98\x77\xc0\xe4\x47\xf0\x83\xd3\x9d\x1e\xd9\x6d\x9d\xae\xe2\xcd\xa7\xf8\xbb\x4d\x6e\xe3\x94\xbb\x9e\x7c\xef\xd1\xc3\x68\x59\x6f\x3e\x8f\xef\xda\x4b\x39\xf3\xd9\x19\x31\x1e\x7b\xf8\x96\x81\xe5\xf1\x07\x79\xe7\x7d\x21\x3b\xb1\xd3\xad\x8d\xeb\xf7\xbe\x8c\x93\x20\x37\xd3\xcb\x6e\xce\xb9\x6a\x4b\x6c\xb6\x4e\x8d\x3f\x8d\x9f\xa2\xbb\x3f\xfe\xd9\xae\x08\xcb\xce\x81\x3d\x0c\x2a\x27\x15\x59\x66\x59\x84\xe6\x9c\x59\xde\xf3\x13\xb7\xa6\x12\xd3\x2b\x67\xe3\x30\x3e\xcd\x0e\x8b\xef\xbb\xbc\x7b\x7d\x7e\xa1\xd0\x1d\x70\x0a\x85\xbf\xb6\xe3\x11\x7a\xaf\x36\x7c\x9d\xc5\xa2\x10\xf7\xfb\xcb\x4a\x8d\xca\x85\x40\xa5\x08\x73\x02\x21\x57\x1c\x04\xef\xa8\xee\xf7\x64\x42\x93\xa9\x88\xe6\x3a\xde\xf1\xf7\x5d\xb4\x9c\xec\xab\xe9\xe8\x1f\xbe\x79\xff\xee\xc3\xf1\xcb\x17\xfd\x37\xef\x5e\x7c\x7c\xfd\xb2\xbf\xdb\xef\x3f\x8f\xe3\x1f\x69\xd2\xef\x57\x66\x10\xb8\xbf\x31\xea\xbe\x25\x6d\x49\x13\x9d\xa8\xb9\x14\x16\xbf\x1b\x09\xc3\x99\x21\x4d\x8d\x1c\x12\x01\x44\x22\xda\x99\xd0\xa9\x48\xe6\x2d\xd9\xc5\xb2\xe6\x82\x8a\xd9\xc5\x76\xbe\x6b\x7b\xaa\x39\x73\xf0\xaf\x32\xce\x0e\x7d\xba\x2e\x41\xf6\xfa\xfd\xe7\x10\xf3\xa3\x92\x20\x0f\xee\x3d\xdc\x18\xf5\x06\x04\x71\xb0\x6c\x9d\x20\xd0\xce\xca\x04\x29\x19\xe7\x06\x04\xd9\xef\xf7\x7f\xa4\xc1\x98\xd5\xd0\xe3\xd1\xa6\x98\x37\x20\x87\x45\xb2\x6d\x6a\x40\x33\x2b\x13\xa3\x38\xc8\x0d\x68\x71\xaf\xdf\xff\x51\x64\x99\x98\xbe\xa5\xe7\x7c\x0c\xa7\x4a\x0d\x59\x9e\x5c\x63\x23\x1b\x50\xa8\x14\xdf\xd6\x89\x95\x6b\x71\x65\xba\xd5\xce\x42\x09\x09\xed\x10\x06\x3c\x0a\xe4\xa5\x4e\x76\x99\x8f\x9a\x65\xbd\x16\xab\x4e\x57\xc9\x88\x7e\x9c\x65\x99\x88\xbe\x6b\xb5\x36\x9a\x17\x85\xe5\x5a\x66\xe7\xa4\x0a\xfb\xe9\xda\x0c\x7f\xbf\xdf\x47\x1c\x35\xc7\xf3\x9a\xbb\x8f\x83\x7a\x03\xe6\x76\xb0\x6c\x9d\xa5\xd7\x23\x55\xc9\x38\x37\xd8\x81\x1e\x68\x6c\x3f\xd2\xb4\xfa\x48\xb8\xff\xe0\x5a\xb0\x6f\x40\x97\x1c\xa6\x9b\xa1\x8d\x6c\x6b\x65\xfa\x54\x8c\x79\x03\x1a\x3d\xec\xf7\x0f\x68\x12\x54\x9f\x0c\x0f\xd6\x24\x8f\x41\xbc\x01\x61\x0c\x8e\x6d\x93\x44\xb6\xb2\x32\x31\x0a\x23\xdc\xe6\x4e\x6f\x1a\x53\xbd\x7d\x0e\x1d\x4d\x57\xdd\xd2\xdd\xaa\x6b\x8f\xf7\xc4\x43\x53\xdc\xb0\xb7\x36\x68\x95\x9b\x7c\x9d\x41\xeb\xaa\x1b\x0e\x5a\xa3\xb9\xc1\x41\xff\xc4\x68\xc0\x92\x75\xc6\xac\x6a\x6e\x38\x64\x85\xe5\x06\x47\xfc\x86\x05\x9c\xae\x33\x60\xac\xb8\xe1\x78\x11\xc9\xfa\xd7\x90\x47\xfd\x3e\x84\xdd\x18\x88\xcb\xea\x5d\xf5\xe1\xde\x35\x20\xdf\x60\x67\xf5\xf0\x6c\x7d\x77\x55\x2d\xad\x4c\x99\xd2\xd1\x6e\x70\xd8\x3d\x96\xf8\x78\x5c\x4d\x96\x47\x6b\x92\xc5\x20\xde\x80\x24\x06\xc7\xf6\xc9\xc1\xe3\x95\x49\x51\x18\xe1\x06\x64\x78\xd2\xef\xcf\x32\x1e\xa6\x7d\x48\x44\xff\xfc\x82\xce\xb5\x73\x4c\xf5\xcd\xfd\xc9\xee\xf5\xb7\xb5\x01\xb1\xea\xd0\x6e\x9d\x7e\xf9\x26\x57\x26\xe6\x32\x93\xb2\x89\x58\x6e\xb7\xdf\x7f\xc1\x69\x28\xc6\x35\x2b\x6d\x4d\x41\xa9\x8b\x7b\x13\xc1\x9c\x83\x66\xdb\xf4\xc2\x76\x56\x97\xcc\x95\x8c\x74\x9b\x37\x4c\xb7\x3d\xd3\xeb\x35\xaf\x99\x7e\xe5\x4d\x46\x7e\x92\xc3\xb5\xc5\x6b\x48\xe9\x04\xac\x79\xe5\xf4\x2b\x5f\xc7\x04\xdc\xc0\xcd\xb3\x6e\x02\x8e\xd9\xe5\x66\x93\x00\x08\xae\x71\x22\x00\xdf\x4d\x4f\xc6\x31\xcf\x42\xb6\xde\x34\x60\xd5\xeb\x98\x00\xc4\x74\x73\x43\xbf\xe0\xd9\xe4\x8d\x18\xf0\x90\xa9\x9d\x6c\xc5\xf1\x17\xea\x6f\x36\x09\x05\x74\xeb\x5f\xd5\xf7\xf6\x24\xe2\x73\x1e\xd4\xdc\x3c\x1e\x3c\x5e\xf3\x4e\xe8\x21\xdf\xe4\xa8\x72\xf1\x6c\xff\xac\x82\x86\x56\x27\x51\xd9\x60\x37\xb9\x42\xec\xf7\xfb\x2f\x12\x7a\x51\x77\x25\x7c\xb4\xa6\x64\xca\xc5\xbd\x09\x5d\x1c\x34\x5b\x27\x0b\xb4\xb3\x3a\x55\x4a\x46\xba\x09\x51\xee\xf5\xfb\xaf\x44\x32\xad\xb9\xa5\xaf\xbb\x56\x0c\xe6\x4d\x08\x62\x90\x6c\x6b\x5f\x34\x0d\xb4\xc9\x77\xf2\x0f\x79\x14\x25\x22\x5c\x75\x43\x74\xab\xae\x4c\x52\xd3\x87\x13\x0f\xcf\x36\x8f\x83\xfc\xb0\xff\x95\x88\x59\xbc\xce\xa0\xb1\xe2\xa6\x43\x46\x2c\x37\x39\xe0\xd7\x74\xc0\xd6\xa2\x32\x56\xdc\x74\xc0\x88\xe5\x26\x07\xfc\x13\x64\xbf\x5f\xe7\xce\x97\xab\xbd\xe9\xd0\x1d\x54\x37\x39\x7e\xb5\xaa\xd6\xa6\xbb\x57\xff\x9a\x96\x78\x15\x17\x2c\xbd\xc7\xde\xef\xf7\x31\x73\x5c\xcd\xfe\xbd\xee\x91\xea\xe0\xde\x64\x07\x77\xd0\x6c\xfb\x48\xc5\x76\x56\x27\x4e\xc9\x48\x37\x39\x52\x1f\xf4\xfb\x87\xc3\x1a\x95\xf5\x93\x75\xe5\x24\x06\xf1\x26\xf4\x30\x48\xb6\x4d\x0d\xd9\xca\xea\xb4\x28\x8c\x71\x13\x4a\x3c\x44\x64\x0b\x4c\x08\xf6\xee\xad\x29\x88\xcc\xe3\xdf\x84\x2c\x39\x54\x37\x41\x9c\x35\x0d\x0a\xaa\x46\xbd\x09\xa1\x1e\xf5\xfb\x87\x51\x3c\xcb\x6a\x68\xb4\xee\x35\xd4\xa2\xde\x84\x3c\x16\xcb\xd6\x29\x23\x9b\x59\x9d\x28\xc5\x61\x6e\x55\xb0\x68\x9b\xd3\x5d\x5e\xeb\x60\x75\x6a\x6e\x30\xe2\x13\x17\xcf\x36\xef\x14\xc5\x51\x3f\x0f\x44\x02\x01\xf6\xd6\x1a\xb9\xad\xbd\xf9\xe8\x2d\xae\x0d\xee\x13\x8f\xfb\xfd\x7f\x25\xbc\xda\x74\x64\xff\xc9\x9a\xd6\x56\x16\xf3\x26\xab\xd0\x20\xd9\xf6\x22\x94\xad\xac\x4e\x93\xc2\x18\x37\xd9\x12\x9f\xf4\xfb\xaf\x79\x5a\xb3\x23\xae\x6b\xf8\x66\x31\x6f\x42\x0a\x83\x64\xdb\xa4\x90\xad\xac\x4e\x8a\xc2\x18\xb7\xba\x1b\x9a\xd6\x54\x7f\x0f\x33\x36\x5d\x75\x43\x30\xf5\xd6\x1f\xeb\x89\x45\xb2\xcd\x5d\xb0\x6c\xb4\xca\x54\x7d\xcd\x31\xaf\x6b\xe8\x5e\x32\x72\x85\xea\xa6\xc7\x0f\x97\xdd\x35\x47\xbf\xde\x45\xb9\x64\xec\x80\xe8\xa6\x47\x7e\x04\x21\xe0\x68\x32\x47\x75\xde\xba\x93\x90\x47\x73\x1d\xf3\x91\xc7\x79\xd3\x53\xb3\x8e\xb0\xc5\xab\x7b\x1d\x93\xb0\x75\x41\x4b\x7e\xe4\x47\xb3\xc1\x64\x2d\xfb\x36\xbf\xf2\xa6\x63\xb7\x98\xd6\xbf\x0f\xed\xef\xf6\xfb\x6f\x58\x34\xab\xb9\x0f\xad\xe9\x64\x61\x31\x6f\xe2\xfb\x62\x90\x6c\xfb\x10\x96\xad\xac\xee\xfa\x52\x18\xe3\x36\x0f\x61\xdb\x9a\xea\xef\x3a\x87\xb0\xa9\xb7\xfe\x58\x4f\x2c\x92\x2d\xae\xba\xc2\x68\xe1\x9a\xb4\xc6\x68\xd7\xba\x5e\xe5\x47\x0b\x48\x36\x58\x66\x7b\xfd\xfe\x1b\x11\xd0\xb0\xfa\xb2\xbb\xbf\xae\x8f\x99\x45\xbd\xc9\x42\xb3\x58\xb6\xbe\xd2\x64\x33\xab\x13\xa4\x38\xcc\x4d\x5c\xfe\xf6\xfb\x7d\x70\x25\xae\xd6\xa0\xaf\x29\xc2\x74\x30\x6f\x42\x0e\x8b\x65\xdb\xe4\x80\x66\x56\x27\x47\x71\x98\x9b\x90\xe3\x5e\xbf\xff\x5e\xc4\xe2\xbc\x86\x20\xf7\x76\xd7\x94\x8f\x79\xc8\x37\xa1\x89\x8b\x67\xeb\x54\xc1\x86\x56\xa7\x4b\xd9\x60\x37\xa1\xcc\xfd\x7e\xff\x7d\x22\xc6\x09\x4b\xd3\x4a\xd2\x3c\xdc\x5d\x77\xef\xf2\xb0\x6f\x42\x1b\x0f\xd1\xb6\x4e\x24\xaf\x91\x36\xf9\xee\x80\x27\xc3\x59\x48\x13\x5d\xb8\xb2\xf5\x7f\xbe\xfe\xca\xd4\xf6\x7a\x74\x52\x44\xb8\xcd\xf3\x39\x3f\x1b\xaf\x79\xc4\xd6\x9f\x8b\x5c\xed\x4d\x67\x22\x87\x6e\x83\x93\xfb\x41\xbf\xff\x81\x06\x5c\x54\x73\xff\xde\x9a\xca\x15\x07\xf5\x26\xac\x6f\xb1\x6c\x7b\x53\x82\x66\x56\x27\x4d\x71\x98\x5b\xbd\x25\xdb\xe6\x74\x97\xd7\x32\xfd\x70\x6a\x6e\x30\xe2\x13\x17\xcf\x06\x5c\xf8\xb0\xdf\x3f\x62\x21\x1b\x56\x4b\x4b\xef\xed\xde\xdb\x1c\xf7\x26\x7c\xe8\xa0\xd9\x36\x23\x62\x3b\xab\xd3\xa5\x64\xa4\x9b\x9c\x8d\x8f\xfa\xfd\xa3\x88\x0e\xcf\x06\x35\xb1\x3c\x1e\xee\xad\x7b\x36\x7a\xd8\x37\x21\x8c\x87\x68\xeb\xa4\x51\x2d\xad\x4e\x9c\xd2\xf1\x6e\x75\xa7\xf0\x5a\x74\xfa\xbe\xa6\xf9\x7c\xbe\xfa\x66\x33\x70\x52\xc0\xb7\xc1\xf6\xf1\xb8\xdf\x3f\xca\x58\x5c\xf7\xe0\x79\xb8\xb7\xae\xa0\xc7\x45\xbe\x09\x9f\xba\x78\xb6\xce\xa6\xd8\xd0\xea\x34\x2a\x1b\xec\x56\x99\xd4\x6d\x50\x75\x7c\x65\xc6\x94\x75\x36\x1a\xe9\x09\xe2\xd8\xe6\x75\xb2\x64\x9c\xeb\x05\x00\x71\x6a\x5e\xc3\x98\x2b\x03\x7c\x6c\x75\xe4\xeb\xee\x40\x4e\xd5\x6b\x18\xfb\x0d\x78\xef\x94\x0d\x7e\x2d\x3b\x0b\x5b\xf1\x1a\x06\xbe\xa9\xd5\xe2\xfe\x93\x7e\x1f\xe3\xd8\xd5\x78\x68\x6c\x8e\x7a\x93\xcd\xd6\x41\xb3\x2d\xd2\x3a\x4d\xb4\xc9\x77\x6f\x66\xfc\x78\xc2\x20\xe0\x2a\x7a\x6b\xac\x2a\xca\xcd\xd7\x5f\x99\xce\x4e\x7f\x4e\x8a\xe8\xb6\xc9\xe4\xfe\x4c\xd8\xb0\x87\xeb\x38\x25\xa9\x9a\x9b\x8d\xde\x41\x74\xb3\xe3\x86\x39\x5f\x67\xd8\x58\x71\xf3\x51\x23\x9e\x9b\x1b\x34\x86\x0f\xd6\xdc\xb6\xea\xc8\x73\xb5\x37\x1b\x7e\x0e\xd9\xfa\xdb\xdb\xbd\xdd\x7e\x7f\x28\x42\x91\xd4\x88\x04\xf7\xd7\x34\xca\x76\x71\x6f\x12\x92\xcd\x41\x53\x45\x68\x0c\xed\xa9\x32\xc8\xac\x7c\x83\x44\xec\xab\xc7\x15\x73\x3a\xb6\x3e\x01\xf6\xfa\xfd\xa3\xf3\x71\xad\x0d\xf6\xda\x04\x70\x71\x6f\x42\x01\x17\xcf\xd6\xaf\xf3\xd8\xd0\xea\xd4\x28\x1b\xec\x26\xe1\x0b\xf7\xfb\xfd\xa3\x0b\x9e\x0d\x27\xd5\x2b\xe3\xfe\x9a\x7a\x0c\x17\xf7\x26\x74\x71\xd0\x6c\x9d\x2c\xd0\xce\xea\x54\x29\x19\xe9\x26\x44\xb9\xd7\xef\x1f\xd3\x41\x58\x1d\xcd\xed\xe1\xfd\x35\x65\x67\x0e\xea\x4d\x48\x62\xb1\x6c\x9b\x22\xd0\xcc\xea\x04\x29\x0e\x73\xab\x01\x22\x6d\x73\xba\xcb\x3f\x8a\x60\xbe\xea\xe1\x69\x2b\x6e\x30\xde\x13\x07\xcd\x16\x6f\x0d\x25\x43\x3e\x60\xe1\xca\xaf\x20\x5b\x71\xf3\x21\x03\x9a\x9b\x1d\xf2\x2b\x21\xb2\xd5\x5f\x06\x6e\xd5\xcd\x87\xad\x10\xdd\xec\xc0\x7f\x62\x34\x58\x6b\xd8\x50\x71\xf3\x41\x03\x9a\x9b\x1d\xf2\x7b\x3a\xe6\x98\x51\x71\xad\x81\x3b\xd5\x37\x1f\xbe\x83\xec\x66\x27\xe1\x83\xb8\x58\x6b\xf4\xb2\xde\xe6\xc3\x96\x58\x6e\x76\xbc\x47\x22\x59\xcf\x8d\x26\x57\x7b\xf3\xb1\x5b\x5c\x1b\xbc\x83\xee\x03\xd6\x9a\x57\xd0\x83\x75\xef\x15\x06\xf3\x26\xd7\x0a\x83\xe4\x06\x6e\x15\x6b\xbc\x84\x0a\x63\xdc\xea\x9d\xc2\xb4\x86\xfd\x5d\x83\x01\x37\x18\x21\x30\xdd\x26\x9c\xf6\xa0\xdf\x3f\x9e\xc7\x62\x9c\xd0\x78\x32\xaf\x8e\x4a\xbc\xa6\x25\x42\x1e\xfd\x26\x4c\x97\x43\xb5\x75\xd6\x33\x6d\xad\x4e\x9e\x8a\x51\x6f\xf2\xd4\x78\xd8\xef\x1f\xb3\xcb\xec\x15\x67\x61\xb5\x8f\xd9\xc3\x87\xeb\x6e\x0b\x3e\xfa\x4d\xc8\xe4\x63\xda\x3a\x95\x74\x53\xab\x13\xa9\x7c\xc8\x9b\xd0\xe8\x51\xbf\x7f\x2c\x44\x58\xa7\xb5\xdf\x7b\xbc\xa6\x78\xde\x43\xbe\x09\x7d\x5c\x3c\x5b\xa7\x0e\x36\xb4\x3a\x6d\xca\x06\xbb\x09\x65\x1e\x23\xbe\xac\x26\xda\xe9\xc3\x87\xeb\xca\xb5\x5c\xe4\x9b\x50\xc6\xc5\x73\x13\x94\xc9\xd6\x08\x7c\x5a\x3a\xd8\x4d\x28\x63\x82\x6f\x5e\xf0\x6c\xf2\x0b\x0f\xb2\x6a\x01\xd7\xde\xba\xe9\x84\x4a\x1b\xd9\x84\x52\x65\xf8\xb6\x4d\x31\xd3\xd4\xea\x34\xab\x1b\xbe\xa6\xdd\x82\x7f\xdd\x2e\x61\x69\xc8\xa3\x6c\x47\xe5\xef\xdc\x89\xd8\x65\xb6\x13\xf2\x88\x29\x32\x74\x47\x3c\x49\xb3\x62\x45\x3f\x15\xd6\x83\x3f\x79\xd2\xf4\xad\x66\x0d\xff\x8b\x67\x64\x87\xa4\xe9\xdd\x2e\xf9\x27\x8f\x26\x2c\xe1\x19\x0b\x4c\xd2\x4c\xcc\x08\xfb\xd5\x67\x54\xdf\x6e\xd6\x73\xa8\x38\x81\x10\x52\x95\x83\xb0\x0c\x0a\x33\x5a\xe7\xc3\xe2\x80\xd5\xf5\x41\x27\xd6\xfb\xa2\x92\xae\xbf\x15\xc1\xe6\xd9\xd6\x01\xc9\xd6\xd2\xac\xab\x79\x28\xcb\x5f\x1e\xf0\x34\x0e\xe9\xbc\x47\x1a\xa3\x90\x5d\x36\x74\x4e\x61\xf9\xe3\x05\x4f\xd8\x10\x53\x26\x36\x86\x22\x9c\x4d\x23\xf3\xf9\x42\x6e\xfc\x3d\xd2\xd8\xdb\xdd\xfd\x2f\x53\x38\x10\x97\x47\xfc\x37\x1e\x8d\x7b\xa4\x81\xa9\xcc\x77\x06\xe2\xb2\xd1\x26\xdd\x2e\x79\x9f\xb0\x73\xb9\xb6\x62\x1a\xc8\x07\x32\xe1\x69\x3a\x63\x44\xf2\x14\xa4\x98\x06\xa7\x29\xc8\x1e\x3d\xe2\x97\x2c\x20\xb1\x48\xb9\x6c\x99\x05\x04\x93\xda\x75\x54\x1b\xbf\x1d\x46\x01\xbb\xd4\x59\xd6\xf1\x57\x87\x02\x88\xdb\xf5\xa3\x49\xc2\xa3\xb3\x1e\xd9\x75\xf3\xad\x6b\xa4\xaf\x64\x13\x76\x06\x74\xb1\x9c\x02\xf9\xc5\x8c\x27\x13\x71\x8f\xec\xea\x5f\x21\x1b\x65\x3d\xd2\xa0\xb3\x4c\x18\x88\x84\x8f\x27\x59\x45\x2b\xcf\x07\xa9\x08\x67\x19\x2b\x6d\x88\xaa\x8f\xd7\xd4\xd6\x51\x46\x33\x3e\x2c\x6d\x29\x85\x4f\x8d\x85\x93\x03\xea\xde\x17\x7a\x21\xac\x9e\xdd\xde\xa7\xc1\xb0\x0c\x7a\xcc\x32\x08\xb8\x46\x53\x08\x31\xdc\x5c\x80\xab\x55\xe8\xde\xfb\x84\x4f\x69\x32\x5f\xba\x7b\x31\xc2\x9f\x3c\xd8\xdd\x3d\xdd\xa0\x67\x2e\x9a\x62\xa7\x9e\x0f\x87\x90\x69\x74\xc9\x3e\xa5\xda\x19\xbe\xf3\x7c\x7f\x77\x77\x83\x5e\xf9\x88\x54\xbf\x6e\x11\x72\xf5\x14\xb2\x99\xae\xb0\x81\x41\x3f\x2b\x76\xb0\xdd\x56\x47\x44\xec\xdd\xa8\x79\xd2\x50\x27\x65\xa3\x4d\x1a\x6a\x46\xe4\x9f\x14\x86\x2f\xff\x52\xbb\x28\x66\x07\x5f\xa1\xf9\xf7\x8a\x59\x17\xf7\x40\xf3\xb2\x59\xa8\xce\x42\x5a\xb9\x55\x27\x5f\xac\x49\x37\x7f\x3c\x61\x64\x88\xf6\x84\x44\x8c\x60\x67\x32\xb9\x64\x6d\x8e\xf9\xe1\x84\x87\x41\xc2\xa2\x55\xd3\x52\xe3\x41\xb1\x66\xda\x5f\xa8\x7c\x3d\xf9\x7e\x25\xaa\x96\x9f\x67\xff\x63\xca\x46\xb3\x90\x64\x82\xe0\x45\x11\xf3\xfe\xcb\x73\x84\xd0\x38\x0e\x39\x0b\xe4\x37\x33\x17\xa9\x33\x19\x4b\x65\xf6\xf6\x5b\xfb\x27\x1f\x47\x22\x61\x3e\x0e\xcc\x43\x5e\x35\x3e\x48\xd0\xec\x63\x41\x62\x49\xd6\x2d\x90\x8a\x1c\x66\x8d\x94\xcc\x52\x79\xd2\xc8\x2f\xb0\x72\x88\x5a\x39\xe4\x62\xc2\x22\x92\x4d\x68\x46\xa6\xf4\x8c\xa5\x24\x65\x51\xca\x9c\x11\xe1\x5a\xbc\xb6\xd5\x50\xec\xb5\xde\x9e\xa1\x7b\xf3\xd8\x69\xdb\x6e\xdc\x1b\x2d\x05\xd8\x01\xec\x25\x09\x8f\x50\x4c\xfc\xdf\x52\x8f\x11\x7d\xb7\x94\xd3\x9e\xda\xc4\xf8\x8a\xb5\x31\xcd\x7b\x9c\x76\x74\x81\xd9\xa8\x90\xdc\xf6\x3b\xfe\xf6\x3e\xeb\x8c\xf5\x3e\x90\x2c\xf5\xb6\x3b\xfb\x59\xfe\x6a\xe7\x8e\x2e\xf3\x55\x17\x68\x00\x48\x4e\xaf\x93\x33\x57\x3d\x0d\x6c\xa6\x66\x40\xd2\x26\x27\x0d\x3d\x92\x86\x97\x61\xdc\xcb\x0e\xde\x80\x9e\x00\x49\x55\xa3\xb8\xad\xe8\xc9\x31\x39\xf2\x55\xeb\xce\xe5\xdc\x36\x68\xf3\xf9\x8b\xcc\x64\xf7\x3f\xb1\x18\xc9\x5d\xac\xac\x2e\xcf\x9d\x21\x8d\x79\x46\x43\xfe\x1b\x7b\x25\x1f\xbd\xaf\x25\x8b\x26\xad\xa6\x86\x6f\x9d\xb6\x49\xd3\x21\x95\xdc\xb2\x16\x27\x52\xb7\xf0\x4e\x17\x70\x74\x4b\xb6\x0f\xc0\xb2\x71\xa4\xd5\x6d\xb9\x6d\x69\x9e\x5f\x9c\xd3\xdb\x6d\xbf\x31\x9d\xf1\x1d\xcd\xa5\x96\xbc\xb0\x0f\x42\x69\xab\xed\xf2\x62\xab\xed\x73\x51\x0b\x98\x53\x0b\x26\xf0\xa5\xa5\x5b\xea\xa0\xb5\xa0\x4a\x60\xde\x04\x0e\x51\xaf\x08\x0d\x82\x6c\x03\xdd\xd5\xcf\x64\xdb\xcf\xcf\x26\x0d\xb8\x7c\x96\xb7\xbd\xc4\xe1\x18\xb5\xa4\xd1\x76\x33\x87\xdf\x6f\xbb\x7b\x95\xe5\x87\xab\x36\xb2\x65\x4b\xdd\x0b\x14\xab\xdd\x22\xa4\xf5\xf4\xd6\xd5\xad\x5b\xea\x0e\x1b\xeb\xbd\x18\x99\x7b\xc8\xd2\xb4\xc3\xa2\xf3\xce\xdb\x77\x2f\x5e\xf6\x5f\xbe\xfd\x37\xcc\xf2\x77\x71\x22\x82\x19\x46\xca\x21\x3f\x10\xc8\x8f\xae\xf3\x9a\x2f\xb5\xd7\xe6\x92\xf4\x5f\xf7\x76\x96\x43\x7f\x4d\x3b\x56\xbe\xd3\x7f\x86\x23\xf6\xd6\xe2\x75\x8a\xb9\xef\xed\x76\x54\x4b\xd8\x65\x53\xe9\xbb\x5b\x5a\xed\x79\xba\x34\x42\xb5\x2d\x5e\x1b\x0f\x2d\xdb\xb0\xd9\x34\x17\xb6\x5d\xcf\x5d\x72\x87\x49\xd8\xa8\x25\x5f\xfb\x57\x4f\xf5\x72\x54\xad\xb9\x37\x41\xb5\x58\x6c\xff\x6f\x95\xbc\x0f\xe1\x74\xd5\xcf\x6f\x2b\xf9\x85\x11\x39\xb2\x14\x3b\x1a\x7c\x90\xb7\xc9\x67\x12\xc1\xc6\xd1\x78\x33\xe3\xd8\x87\x06\xb9\x6a\x35\xf1\xcf\x56\xad\x10\xf2\xaa\x33\xa4\x61\xd8\xac\x93\x6a\x36\xef\xb5\x5a\xad\x82\x90\xf4\xe1\x35\x0a\x49\xaf\x41\xea\x89\x82\x1e\x8c\x0e\x57\x99\x4a\x18\x44\x7f\x0b\x9a\x32\xdc\x84\xed\xb0\x68\x36\x65\x09\x1d\x84\x7a\x2f\xbf\x45\xc8\x98\x65\x3d\x2b\x15\x19\xb3\xac\xd9\xd2\x22\x10\x75\x9a\x54\x88\x99\xb0\x7b\x2d\x4d\xc0\xa7\xf2\x55\x85\xbd\xdf\xba\xdc\x29\x47\xbd\x47\x5f\x22\xf5\x20\x91\x7a\x65\xba\xf3\xc7\x7f\x30\xf1\xa0\x77\x5f\x02\xed\x1e\x7f\x53\x4f\x7c\x53\x4f\x6c\xa0\x9e\x20\xdd\x2e\x21\x17\x8c\x9e\x7d\x53\x45\x5c\x8f\x2a\xe2\xaf\xab\x34\xf8\xf0\xfc\xc5\xe1\xc7\x23\xf2\x8c\xec\xed\x6f\x49\x8d\xe0\x5c\x92\x12\x16\xd2\x8c\x9f\x5b\xd9\xb6\x55\x31\xf0\x28\xe4\x11\xdb\x01\x4d\x83\x2b\x48\x1d\xc8\x3d\x7b\x65\x9d\x44\x22\x2e\xbc\x6f\xbf\x24\x34\xee\x91\xc6\x45\x42\x63\x53\xfe\x9f\x59\x9a\xf1\xd1\x5c\x39\x09\xf7\x48\x43\x5e\x46\xe5\xb3\x4e\x7d\xa7\x21\x1f\x47\xf5\x5f\x0f\x33\x36\x4d\x8b\xdf\x16\x4a\xf3\x77\x70\xd6\x73\xf2\xfb\x5c\xe9\x48\x44\xd9\x2b\x3a\xe5\xe1\x5c\x4b\x7f\x33\x63\xec\xd5\xb1\x1f\x5d\xf0\x5f\x18\x62\x2a\x05\xc7\x8f\x2e\xf8\x11\xff\x8d\x95\x00\xc7\x97\xc7\xe2\x03\x9b\x36\xb1\x3b\xad\x9c\x62\x47\x31\xcc\xf7\x64\x5f\x7f\x98\xa8\x56\x8b\x5f\x50\xd5\xf3\x81\x06\x7c\x26\xa7\xe9\x81\xab\x11\xaa\x97\x85\x7b\x82\x9f\x52\x11\x78\xc6\x2e\xb3\x03\x17\x4a\xeb\x7f\xf6\xe4\xee\xf8\x81\x45\x01\x4b\x40\xc2\x07\x1c\x44\x44\x24\xa7\x9e\x88\x11\x89\x85\xa4\x28\xa7\x21\x49\x78\x1c\x87\x0c\x25\x96\xdf\xb4\x09\xdb\xd7\x26\x2c\x14\xac\x27\x40\x35\x16\x80\xf6\x8f\x47\x96\x7c\x56\x0c\x0a\x3f\xcd\xaa\xbc\x61\x11\x80\x23\x8a\x58\xbf\x62\xef\x8f\x12\x3a\x78\x82\x94\x3c\x09\x70\x95\x5c\xf0\x30\x24\x03\x46\x68\x10\xb0\x80\xe8\xed\x9a\x64\x82\x64\x13\x9e\x92\x48\x0e\xe5\x8f\x57\x76\xfc\x49\xc9\xf0\x4d\xd3\xb2\xaa\xa6\xc5\xbe\x15\x4b\xc4\x4a\x05\x5d\x07\x3c\xff\xf2\xaa\x0e\x77\x3f\x31\x8a\x05\xb7\xf0\xc6\xd4\x1b\x0b\x15\x2c\xeb\xaa\x37\xdc\xd1\x2c\xa5\xe2\x30\xfa\x90\xd3\xd6\xd3\x8d\x35\x1c\x8e\xb0\xde\x9d\xf1\x95\xd0\x41\x95\x45\x82\xc1\xcf\x57\xd7\xa9\xd0\xd0\xac\xd5\x5a\x55\xc9\xd0\x08\xf8\x79\x63\x81\x6a\x61\x15\x4d\x01\xfe\x5a\xa2\x61\x42\x1a\x69\x4c\xad\x21\x8e\xd7\x4c\x6e\xd2\xaf\xec\x35\xcc\xf2\x06\x14\xb5\x8c\x66\x02\x96\xcb\x1f\xa3\x98\xf8\x76\xc8\x5f\xcf\xe9\xf2\xed\x8c\xde\x7c\x16\xff\x6a\xaa\x9a\x05\x67\x6a\x4e\x5f\x82\x9b\x44\x8d\xba\x44\xa3\xbb\x16\xcd\x08\xb4\x06\x8a\x11\x14\xe5\x6e\x47\x2f\xf2\xe4\x8b\x94\xac\x8b\x2c\x13\xd3\xb7\xf4\x9c\x8f\x69\x8d\x49\xd4\x03\x70\xa1\xfb\x43\x85\xec\xb9\x8e\x96\xc9\xdb\x4b\x47\x84\x91\xea\x2a\xc7\xb5\xb7\xcc\xb8\xca\x71\xde\xc4\x30\xb1\xa5\x2f\x40\xb9\x70\x7f\xf7\x4f\xae\x5c\xb8\x79\xf9\xff\x56\xd5\x19\xdf\x94\x0b\x5f\xa9\x72\xe1\xaf\xab\x33\xb8\x21\x47\x83\x45\x02\x7a\x2d\x77\x7e\xf0\x70\x49\xa1\xb2\x63\x47\x1e\x83\x23\xcf\x16\x45\x99\x5f\xa0\x8d\xf0\x9f\xe6\x4a\xfe\xf5\x8b\xcd\x0e\x68\x18\x4a\x6e\x24\x23\x98\x54\x25\x0c\x63\x78\x1a\x92\xe1\x84\x46\x63\xa5\x97\xd0\xcd\xc6\x34\xa1\x53\xf2\x19\xbb\x74\x45\xd0\x65\x46\x32\x1c\xfe\x95\x8a\x59\x32\x64\x86\xeb\x14\x7a\xbf\x2e\x8d\xe6\x57\xaa\x85\x5f\x98\xde\x70\x50\xb6\xcb\x08\x8f\x02\x76\x69\xea\x4b\x16\x35\x43\x14\xd1\x01\x74\xa8\x72\x84\x92\x1f\xfd\xf1\x1d\x8e\xc8\x27\x79\xa4\x7f\x6a\x13\x1a\x86\xe4\x53\xf9\x6d\xe9\x53\x8a\x02\xe7\x74\x22\x2e\x64\xbb\x3c\x21\xa1\xe4\x08\x35\x72\xf2\xe3\xdc\xf4\x52\x44\xe1\x1c\x09\x0b\xf1\xef\x59\x50\x89\xd3\x41\xc9\xb3\x14\x11\x5a\x92\xcb\x72\x08\x9b\x52\x4d\xf5\x81\x10\x61\x51\xc8\x89\xf3\xa6\xe7\x67\x96\x24\x2c\xca\xc2\xf9\xe2\xee\xd8\xa6\xd5\x4d\xc7\x6c\x91\xf0\x5b\x4b\xe9\xe4\x7f\x40\x4e\x68\x19\x55\xfe\xd4\x97\x51\x3e\x22\xcd\xdb\xea\x6e\x15\x27\x22\x13\x60\x1b\x3e\xa1\xe9\xbb\x8b\x48\xdf\x57\xf0\xb9\x93\xc3\xd7\x6a\x99\x5d\x36\x9b\x24\xe2\x82\x44\xec\x82\xbc\x4c\x12\x91\x34\x1b\x20\xa9\xfc\xd4\x20\x77\x0d\x34\xb9\x4b\x1a\x9f\xc8\x84\xa6\xb0\x35\x91\xff\x6d\xd0\x68\xfe\xbf\x8d\x36\x19\xcc\x32\x72\x41\x53\x12\x89\x4c\xc2\x9e\xf3\x00\x17\x15\x54\xf6\x3a\x0c\x18\x3a\xe4\x3d\x4d\x53\x7b\x73\x23\x22\x21\x34\x9a\x2b\x01\x26\x8c\xbb\xd3\x00\x79\xa0\xda\x7e\xf3\x82\xda\xdc\x54\xe6\x65\xb6\x7a\x07\xf5\x45\xad\x5b\x31\x47\xd7\xbc\x6f\x20\x74\x81\x06\xb0\x0c\x65\x40\x6c\x91\x06\x42\xe6\xd1\xdf\xe1\xd7\x4d\xd8\xac\xeb\xbe\xca\xbf\x6d\xa7\xe4\x2f\xe8\xc2\xf5\x58\xb0\xfb\xc6\xd8\x39\x4f\x81\xbc\xd8\xf2\x40\x7d\xea\x4c\x69\xdc\x74\xc9\x68\x9d\xcd\x09\x96\xb7\x11\x0d\xe8\x74\xbd\x55\x90\x47\xc9\xd3\x7f\xd3\x90\x07\x5a\x14\x0a\xb5\x5a\x2d\x7d\xdd\x88\x66\x61\x88\x8c\x66\x7a\xf6\x6f\x45\x0c\xf8\xd1\x71\x48\x22\xef\x3e\xb6\xd1\xa7\xde\x2b\x30\x2f\x7e\x0d\x45\xc4\xbc\x26\xdb\x66\x9d\xe9\x2d\xa1\xe7\x35\xf7\xec\x19\xf1\xe8\x6e\xe8\xd1\xf3\x3a\x62\x8a\x41\xae\x6a\x57\xd0\x0f\x15\x50\x3d\x52\xc1\x6d\x6e\xeb\x79\x66\xee\x99\xbf\x70\x09\xc2\x52\xbc\xfa\xa3\x05\xdd\x56\xf0\x9c\x5b\xfe\x7f\x8c\x0c\x7a\xc9\x93\xe2\x9b\xbc\xf5\x9b\xbc\xb5\x1c\xa1\xb3\xfb\xd6\xdc\x9b\x96\xc5\xe6\xed\xdf\x35\xfc\xb8\x2c\x3e\x3c\x01\xda\xeb\x5c\x47\x36\xbf\x8c\x7c\x89\x57\x91\xab\x5b\x57\x79\xd9\x76\x7e\x1f\x2a\x11\x73\xbb\xbb\xc4\x88\x86\x29\xbb\x1e\x39\x77\xae\x65\x14\x79\xe7\x05\xab\x5b\x91\x7e\xdf\xdf\xfb\xb2\xa4\xdf\xdf\x8c\x8d\xff\x48\x79\xe0\x98\xc9\x62\x5c\xe1\xef\x46\x15\x5d\x78\x5c\x01\x5e\x27\x4a\xf3\x21\x7d\x59\x9f\x7c\x1c\x1f\x4c\xd8\xf0\xac\x6a\xcc\x4f\x2a\xe0\xeb\x86\x9a\xc3\x6c\x31\xc0\xc5\x06\x34\xe3\x55\xcd\x41\x7e\xc4\x02\x74\x6d\x63\x0e\x52\x53\x37\x16\x69\xca\x07\x21\x3b\x10\x51\x9a\x25\xb3\x61\x26\x92\x0f\x70\xd9\xaa\x6c\x77\x6f\x71\xdd\xba\x5e\x54\x37\x68\xf0\x2a\xbf\xac\xea\xa1\x17\x41\xeb\x5a\x34\xe8\x7c\xb1\xf0\x37\xe1\x71\xb9\x65\x3a\x8a\x08\x7e\xa4\x69\x95\xec\xf6\xfe\x83\x12\xd8\xba\x46\x2c\x94\xa9\x78\x38\xac\x54\xaa\x3d\xb9\xef\x41\xd5\x21\x96\xdf\xbf\x34\xa1\xb7\x7a\x8d\x6c\x2c\xf7\xd6\x78\x16\x88\xbe\x2b\x42\x42\xd9\x29\xff\x0b\x49\xec\xb3\x84\x46\xda\xc6\x5d\xd9\x8f\x9b\x92\x54\x3d\x16\x9b\x27\x8e\xd3\x3c\xc6\xf6\xd9\xc9\x44\xdc\x38\xb5\x4f\x65\x42\x82\x59\x42\xab\xd0\xe8\x6f\xf2\xb9\x9b\x64\xaa\xca\x95\xb1\x47\x57\x38\x8f\x45\xdc\x23\x8f\x73\x85\x78\x57\xea\x91\xbd\xdd\xdc\x87\xd7\x10\x3e\x67\x6f\x3f\x57\xfc\x01\x35\x09\xb6\x7c\xca\xa3\x5f\xd0\xde\xfd\xb1\x41\x31\xa5\x97\xaa\x6c\xef\xe1\xe3\x85\xb6\xe9\xd6\x6e\xda\x75\x44\xe8\x91\xc6\x9e\xe7\xdf\x60\xa5\x05\x9f\x4b\xc6\xf5\xb0\xb6\x19\xd7\x5e\xbc\x0c\xa7\x5c\xb4\xef\xa2\x70\x5e\x8e\x1b\x71\xa5\x31\x1d\xf2\x68\xdc\x99\x45\x3c\x23\xdf\x93\x7d\x17\xcf\x45\x42\xe3\x98\x25\x65\x8a\x1a\xd7\x5d\x63\x19\x97\x88\x45\xba\x9c\xd2\xa8\x51\x15\x91\xa6\xdc\x2e\x86\x28\x42\xf9\xbc\xbe\xcf\xc4\x02\x27\x88\x52\x2c\xb2\x0e\xd9\x21\xfb\x86\x17\x85\x9c\xc5\x6c\xde\x23\x7b\xed\x92\x15\xd2\x90\x75\x76\x52\x59\x69\xb7\xb3\x9f\xb6\x35\x38\xfc\x6a\x14\x6b\xbc\x60\x38\xc9\xbb\x9d\xbd\xb4\x94\x59\x5e\x17\x47\xbd\xee\x30\x3c\x3f\x83\x09\x0f\x02\x16\xe5\xb0\x9b\xb1\xed\xd6\xf4\xd4\xef\x27\x1f\xca\x61\x17\xb9\x66\x10\x8a\xe1\x59\xc3\xae\xa7\x64\xcc\x23\x1d\xcc\xea\xba\x95\x71\x5f\xa3\x5a\xe8\x78\xc2\x60\xee\x08\xc3\x23\xa9\x43\x0e\x47\x84\x12\x04\x25\x3c\x35\x2f\xde\x36\xe1\x99\x31\xd6\x9f\xa5\x2c\x20\x34\x25\x14\x18\x81\x84\xf2\x7d\x38\x4b\x1c\x63\x6a\x24\x47\x9d\xdd\x97\x9c\xd0\xe6\x49\x7d\x4f\x57\x94\x68\x99\xd3\x79\x4d\xa1\x96\xae\x7f\x3d\x52\x26\x85\xad\x55\x16\x73\x07\xf6\x10\x33\xe5\x66\xd6\xd4\xd6\xf2\x15\x47\x99\xa8\x67\xd1\x35\xd4\x7a\x25\x28\x42\x3e\x3c\xdb\x00\x83\x3d\xfe\x96\xd6\xc6\x39\xba\x45\xb9\xa4\x2b\xcc\xc8\x96\xd3\x02\xae\xd0\xec\xaf\x62\x46\x86\x34\xd2\x4b\x90\xcc\xc5\x2c\x21\xe2\x42\x09\xce\x3a\xe4\x5d\x36\x61\xc9\x05\x4f\x59\x9b\x5c\x30\x32\xd2\x0a\x5e\xa5\x5e\x05\xb9\xb0\x0d\x71\x03\xda\xd6\x6f\xaa\xc1\x65\x55\x83\xf2\x2c\xa8\x34\x17\xb4\x8a\xa3\x3e\xac\x86\xbf\x99\xbb\x39\x0e\x10\x44\x6f\xe6\xf5\x6a\x05\x6f\xe5\x08\xdb\xa4\x80\x05\xf4\x22\x95\xca\x49\xac\x66\xcc\x06\x6d\x08\x59\xfb\x33\x63\xd3\xb8\x4d\xfa\xd9\x84\xa7\x20\x61\xcc\xd4\x47\xab\x67\xb3\x22\x0c\xdb\x3f\x04\xaf\xb0\x33\x54\x18\x46\x22\x21\x4d\x68\x23\x04\x7d\x1b\x4d\xc6\xb3\x29\x9c\x66\x21\x8b\xc6\xd9\xa4\x2d\x4b\xe4\xd1\xf8\x3c\x49\xe8\xbc\x29\xa1\x5a\x6d\xd2\x3f\x63\x73\xf2\x8c\xec\x3e\xc5\xbf\xfe\x0e\xb5\xf1\xc7\xdd\xbb\x96\x2b\x64\xd5\x13\x59\x78\xea\x62\xc6\x12\x4d\xa1\x9c\x92\x0c\x44\x9d\x30\x5e\xfc\x63\xc2\x53\x2d\xfc\xac\x16\x61\xe4\x87\xac\x55\x37\xe5\x43\xef\xf4\xfb\xc0\xe6\xfd\xbe\x7c\xf9\x00\xea\x9c\xd8\x69\x11\x89\x5b\x2d\x58\x0f\x1d\x79\x0d\x98\x2b\x79\xf8\x89\x6c\xfa\xb4\x33\x14\xd1\x90\x66\x4d\x39\xf2\x16\x98\x3a\xcb\x62\xfd\xdf\xce\x84\x46\x41\xc8\x8c\x42\xd8\x32\x1e\xd8\x60\xd8\x89\x43\xa2\x4f\x78\xfa\xb7\x58\xdd\x4c\xb0\x3e\x2e\x40\xf3\xf6\xf1\xb4\xcb\x0e\x7c\x41\xc7\x4c\x1c\x15\xb2\x0b\xe7\x29\x14\x15\x3e\xb9\x1f\x17\xd1\xc9\x52\xd4\xf5\xea\x2d\x43\xb7\xd1\x72\x1e\x63\xba\x0c\xc7\xd3\xc6\x36\xd5\x62\x34\xc4\x36\xd5\x25\xce\x5c\x6d\x59\xa4\x26\xc3\xd6\xc2\x7b\x21\xae\x02\xad\x9d\x58\x86\x19\x9c\xf5\xa2\x04\xf4\x7a\x31\xbb\x52\xb8\xc5\xeb\xf9\x04\xbb\x78\xc6\xe6\xe0\x81\x1e\x05\xe6\xd9\x91\xdf\x76\xf1\x63\x33\x47\x48\x37\x60\x99\xf3\x63\xff\xe9\x2d\x17\x4a\x53\xba\x9c\xd0\x78\xc5\x78\xa6\xc0\x3a\xf0\xd3\xfd\x2e\x6f\x68\xca\x10\x41\x81\xc8\x12\x17\xc2\x18\x9a\x18\x08\x5d\xe2\x42\x59\xa3\x87\x7e\xa9\xd5\x03\x29\xb1\x7c\xe8\x57\x98\x3e\x10\x57\x4b\xed\xc3\x9a\xe2\x2a\x66\x5e\x82\x8f\xab\x58\x78\x35\x7b\x88\xbe\x31\x88\x80\x39\x6d\xb4\x49\x43\xce\x1c\x58\x3c\xa8\xf9\xa9\xb3\x90\x30\x03\xc9\x9b\x4b\xf8\x06\x12\x9a\xca\xeb\x18\x49\x5c\x4b\x84\x3e\x4b\x6c\xc3\x08\xab\x45\xda\xcb\xe3\xd1\xa2\x81\x36\xb9\xed\xd3\xf8\xce\x1d\x72\xdb\x69\x62\x61\xf4\x3d\x3d\x35\x1c\xc5\x8c\x68\x6f\xe1\x6c\x14\x9a\xb3\xdd\x9d\x42\x96\x2f\x30\xe3\xb0\xd5\xee\xdc\xd1\x57\x70\xb3\x48\xc0\x41\x0f\x5f\x25\x0d\x17\x2f\xd1\xbd\xa8\x35\xd7\xd0\x68\xda\x5e\x4d\xef\xc9\xb6\x98\xb6\xb0\x3c\x4d\x8f\x3a\xb9\x25\xd4\x72\x10\x5f\x99\xad\x90\x90\x2b\xc2\xc2\x94\x2d\xd5\xe3\x32\xff\x3e\xfc\x87\xb2\x5a\x3f\x88\xa1\xfe\x27\xa7\xdf\x2f\xd1\x5d\x74\x0a\xdd\x0e\xe5\xf7\x76\x49\x4a\x58\x49\xab\x39\x68\xe2\x86\xe6\xf1\xfa\xfe\xaa\xcc\xbe\x5f\xe4\x52\xdc\x63\xd6\x62\x79\x07\x9b\x23\xd5\x58\x81\xdd\xf7\x5b\x96\xc1\x97\x37\x8a\x01\x02\x39\xb2\xfa\x22\x99\x56\xb2\x95\x69\x93\x91\x18\xce\xd2\x0f\x10\xa8\x02\xb5\xa2\xc6\x7c\xa6\x4d\x3e\xdb\x07\x58\xf1\x7e\x62\x05\xa5\x4b\x7a\x8f\x92\x82\x07\x29\xc9\x7b\x91\xea\x19\x55\x82\x41\xeb\x46\xaa\x39\xcd\xfd\xbd\x02\x4b\x17\x9b\xcd\x35\x9c\x63\xc9\x2b\x1f\x14\xbe\xba\x0c\x7e\x2b\xff\x97\xfb\xa2\x38\x85\x1f\x8a\xa4\xe5\x97\x86\xa7\xb7\xae\x0a\x1b\x94\xf7\x1e\xb8\x6e\x05\xbf\xf2\x53\x2a\x53\xf3\xdb\x0b\x7f\x4e\x51\xbf\xff\x4d\x51\xff\x4d\x51\xff\x4d\x51\xff\x4d\x51\xff\xe5\x2a\xea\xe1\xd7\x0b\x31\xad\x52\xd3\x3f\xb9\x51\x95\xfe\x19\x9b\x0f\xab\xb5\xae\x8f\x1e\xe4\x01\xeb\xd0\x2b\x90\x1b\x35\x17\x38\x63\xf3\x81\xa0\x49\xf0\x4a\x5e\x09\x2a\xfd\x64\xef\x19\xf8\x63\x31\x1b\x4e\xf0\xea\x50\x09\x7d\xbf\x0c\xba\xae\x5f\x0e\x58\x6e\xb1\x61\xe1\x4f\x70\x07\xa9\xcc\xe8\xf3\x20\xbf\xa0\xbd\x5a\xb5\x04\x2d\x82\x7f\x69\x06\x09\x37\xa5\xd3\xcf\x79\x68\xae\xa6\x02\x91\xa5\xd7\x65\x32\x01\xb8\xfe\x58\x8f\xc1\xeb\x56\x44\xd7\x45\x2b\x84\xb8\x72\x53\x71\xce\xc8\x38\x61\x73\x32\xe1\xe3\x49\xc8\xc7\x13\x6d\x9a\xf0\x0b\x1b\x9c\xf1\xec\x98\xc6\x3f\xe9\x0f\x15\xa1\xed\xa6\x53\x11\xa1\xa5\x43\x4c\x13\x27\xc4\x50\xc1\x7d\xb1\xe1\x00\x61\xb2\xa4\x0f\x2c\x65\x99\xf1\x8a\x82\x3b\x98\x56\xd3\xce\x32\x39\x13\x3d\xd2\x88\x44\xc4\x1a\x7e\x08\x3e\x47\x79\xeb\xc7\xe4\xb3\x81\xe1\x66\x49\x8a\xf1\xad\x05\xf7\x26\x64\x96\xb2\xe4\x08\x5e\x48\x79\xd4\xf2\x0d\x40\x13\x1a\x0d\x0b\x8d\x66\xec\x32\x7b\xc1\x86\x42\xdb\x76\xf8\x5f\xbb\x5d\x72\x24\xc8\x05\x23\x19\x3d\x63\x24\x4e\xd8\x90\x05\xe0\x32\x79\xae\x22\xf6\xa1\x96\x56\x8c\x08\x25\x11\x06\x20\xfb\x3b\x25\xdd\x7f\x78\x2a\x3a\x6b\x13\x61\x83\x8b\xab\xf2\xc6\x9d\x5e\x6f\x67\x2a\x7e\xdb\x81\xb7\xd3\x0e\x8f\x22\x96\x34\x7a\xce\xab\x1b\xa7\x00\x76\x57\xdd\x37\x87\xb6\xaf\x78\xc2\x46\xe2\x92\x04\x22\xcb\x58\xa0\xe7\xb5\x93\x93\x67\xde\x52\x6c\x48\x07\xa1\x9f\x31\x0a\x66\xef\xe5\x39\x8b\xb2\xd4\x0c\x5c\x62\x7f\x81\xb0\x24\xe4\xd1\x19\x01\x20\x0a\x8c\x9f\xe6\x09\x60\x22\x66\x90\xeb\x55\x88\xe7\xf4\x66\x2a\xf8\xa1\xd1\x22\xe3\x3a\x60\x41\xc7\x28\x46\xe7\xe4\x42\x44\x8d\x8c\xa4\x19\x4d\x32\x42\x33\xed\xfa\x96\x8a\xc4\x1d\x80\x59\x32\x8e\x06\x1d\x70\xe9\x57\xeb\x4a\x7e\x76\x5f\xb0\xff\xec\xb7\x1c\x3b\x45\x62\x69\x2b\x38\xb0\x41\x18\x09\x5c\xbf\x72\xaf\x76\x62\x05\x92\x97\x1c\x84\xba\xc6\x90\x21\x13\x12\x9e\x50\xf2\xe2\xdd\x1b\xbd\xa8\x41\x11\x98\x27\x37\x34\xe2\x6d\x76\x84\xa7\x84\x92\x4f\x83\xbc\x73\xa5\x93\x9e\x63\x2d\x33\x05\x3c\x15\x37\x33\x55\x00\x1c\xd7\x6a\xae\x20\x4b\x5b\xb5\xda\xef\x01\x4d\x19\x19\x38\x2a\xef\x01\x33\xbb\x92\x9d\x1d\xbb\x4f\xad\xab\x65\xc7\xdd\x82\xb0\xd1\x88\x0d\xb3\xc5\x2d\xad\xbc\xf4\x17\x0d\x6b\x42\xcf\x25\xc3\xe8\x2b\x30\x8a\xc5\x54\xaf\x14\xaf\x7c\xf2\xda\xfe\x44\xa6\xb3\x34\x23\x34\x4c\x85\xec\xe9\x27\x70\xce\x70\x18\xc6\x93\xab\xad\xb4\x43\x1d\x1c\x1d\xe1\x92\x31\x6b\xf3\x62\xc2\x43\xe6\x6f\x57\x92\x4f\xfd\xce\xba\xb3\xe4\xdd\xe4\x59\x70\xb0\xd6\x02\x2c\x1a\x63\xfc\x18\xce\xaa\x63\x26\xde\x84\x35\x87\x88\x60\x44\x2b\x60\xa8\x72\x84\xf7\x26\x52\xcd\x1f\xe6\x84\xb4\x4c\xa0\xe8\xfe\x0b\x23\x59\xc2\xc7\x63\xd8\x61\x3e\xa9\x2e\x7c\x32\x3e\xf0\x24\x13\xa2\xe3\xf4\xf0\x67\x77\xee\x37\x1a\xeb\xcf\x6c\xfe\x42\x5c\x54\x5b\x56\x2d\x89\xe3\x63\xbc\x11\x86\x37\x62\x96\xb2\x8d\xfb\x01\x58\x5e\x33\x7a\xbe\x99\x39\x10\xa0\xd9\x70\x40\xf0\xc2\x7c\x19\x55\x6f\x56\x4b\x23\x79\x23\x36\x1c\x0e\x60\x39\x92\xd7\x9f\x0d\xd0\x24\xa2\x66\x8b\x29\x5b\xd8\x1f\x53\x86\x91\x51\x63\x25\x73\x94\x07\x66\x0c\x1b\x0e\x49\xd8\xc8\xe5\x6c\x7b\xdc\x96\x5c\x94\x64\xf9\x07\x36\xda\xa0\xeb\x19\x1d\xa8\xa0\xda\x6b\x1b\x0f\x46\xb3\xe9\x80\x25\x0b\x5c\x2a\xf3\x56\x79\x85\x7e\xcc\xe3\x45\x53\xe8\x79\x90\x6a\x93\x21\xd7\xbf\x62\x6d\x33\x21\x83\x64\xb1\x69\x90\x01\xdd\x9e\x39\x90\xe7\xe0\x41\xfe\xf4\x26\x40\x66\xb8\x2b\x99\xfd\xd8\x49\x5a\xd7\xd4\x27\xcd\x68\xc6\xd4\x0b\x8a\x90\xc2\x89\xad\x9d\x3d\x89\xb6\x6d\x91\x75\x72\x67\x8b\x95\x84\x55\x1a\x0a\x61\xbd\x33\x3c\x47\x24\xa0\x44\xfa\xd4\xfb\x98\xb2\xec\x48\xf6\xa5\xf9\xb9\xd8\x07\x54\x07\xb6\x3c\x7d\xbb\x63\x69\x94\xef\x90\xab\x2a\xaf\x01\xab\x36\xe0\x91\x55\x12\x2d\x4f\x04\x55\x73\xf9\x08\x74\xf1\x40\x9b\xe8\xe5\x60\x6d\x5b\xc7\x7c\xca\xc4\x2c\xab\x03\x81\x75\x20\xe1\xc8\x33\xf2\x60\xb7\x14\xe4\x0d\xbd\x34\x50\x92\xd9\x1e\xf8\x06\x5b\x3f\xdb\xde\x6d\x6c\xb1\x65\xef\x25\xbe\x8d\x95\x29\x77\x81\x9d\x3b\x66\x0e\xdc\xf9\xe2\x9b\xd0\xd8\xbe\xfa\x16\x5c\xaa\x7c\x15\x63\x2f\x3b\x32\x5c\xeb\xb0\x66\xb4\x68\xdb\x2e\x16\x4d\x6d\x2b\x9c\x81\xb9\x94\xcc\x24\xeb\xc9\xf7\x56\x98\x30\x1a\xcc\x49\x20\x3b\x96\x09\x42\xcf\x05\x0f\x48\xc2\x62\x46\xb3\x94\x0c\x98\x7c\xd2\x0d\xc5\x2c\xca\xd0\x0c\x7d\x3a\x0b\x33\x2e\x87\x4c\x87\x19\xc7\xf4\x88\xa9\xc3\xa0\xee\xa4\xdc\xb9\x43\x6e\xfb\x1c\x74\xe7\x8e\xbb\x00\x3b\x39\x96\x97\x9f\x61\x30\x60\x00\x12\xd3\x21\x6b\x14\x99\xda\x32\xa3\x5c\x1f\xd6\xd6\x01\x06\xda\x89\x59\x92\xf2\x34\x6b\x3a\x46\x10\x2e\x63\x77\xd2\x4c\xc4\xda\xfe\xcd\xb2\x8b\x6f\x65\x92\xab\x40\x93\x2c\xb7\x66\x5c\xab\x8f\x9c\xd9\x9c\x22\xa4\x6f\x38\xa7\x0a\x0b\x2b\xcf\xd2\x44\xaf\x50\x42\x87\x43\x26\x77\x51\x1e\xf2\x6c\x0e\x9b\x7f\x04\xf6\xc4\x4a\x1c\x73\xce\xf4\x83\xda\x9d\x73\x1c\x7a\x46\x93\x31\x43\x83\x7c\x6f\x7d\xde\xb9\x63\x78\xe9\xce\x1d\x87\xc3\xbd\x1f\x60\x73\x43\x1b\x25\x85\x03\xa5\xbb\xbe\x73\x87\x34\x73\xc4\x91\x5b\xb5\x29\x42\x39\x6b\xcb\x1d\xb9\x22\x09\x26\x80\xd7\x12\x7b\x67\x16\x17\x9a\x14\x7a\x8b\xfc\x63\x5c\xb7\xc4\xf3\x9b\x63\x8e\x0f\x6b\x57\x87\x37\xa6\x7a\x16\xad\xe3\x47\x6f\x7b\xbf\x4e\x86\xd4\xa7\xaf\x5b\x2f\x9e\x85\xa9\x3c\x37\xea\x38\xb3\x7c\x66\xd4\xab\xa4\xf6\xb8\xf8\x18\x2f\x43\x14\xf3\x36\x31\x46\x44\x25\x3a\x9f\x82\xc5\x67\xc3\x54\x03\x13\x3d\xb9\xbe\x1a\xe5\x63\x1f\x86\x8c\x26\xea\x0c\x69\x56\x1f\x2f\xa6\x93\x9a\xc8\x16\x02\xd9\xe0\x67\x36\x7f\x9f\xb0\x54\x92\xaf\x09\x44\x32\x35\xec\xdc\x2c\x49\xed\xba\xf3\x1a\x50\x17\x08\x70\xd5\x2a\x99\x34\xe0\xe5\x55\xa7\xec\x63\x8c\x13\x26\xe2\x46\x19\x4e\x78\xde\xad\x81\x16\xea\x19\xcc\xed\x65\x96\xd8\xc2\xc9\xaa\x5f\xf9\xe5\x13\x63\x5f\x63\xab\x0d\xc2\xd6\xb3\xfc\x54\x86\xfa\x65\x14\xac\x81\xf8\x65\x14\x54\xcd\xba\x79\x84\x5e\x2f\xda\x1f\xc3\x59\xb2\x1a\x46\x59\xa3\x94\x80\x37\xb9\x94\x56\x5d\x1f\x79\xf2\x6b\xb5\xf7\xd2\x3b\xbc\x96\x4e\xba\x7c\x87\x3b\x65\xd9\x09\xfb\x8a\x5f\xc2\x71\x3a\xc9\xb2\x38\xed\x75\xbb\x63\x9e\x4d\x66\x03\x79\xb1\xeb\x8e\xe8\x90\x0d\x84\x38\xeb\x82\x3d\x43\x97\xa7\xe9\x8c\xa5\xdd\x47\x8f\x1e\x3e\x71\x5a\xbe\xed\x9e\xa9\xc5\x7d\xc1\xdc\x85\x91\xf3\x55\x04\xc1\x63\x38\x92\x0b\xdd\xa9\x38\x19\xd4\x5d\xce\xb9\x1b\x6b\x49\xc0\xb3\xda\x27\x48\x67\xc0\xa3\x40\x33\x83\xbf\x6d\x97\x90\x31\x60\x19\x1b\x66\xfe\xcb\xc1\x18\xe3\x3b\x63\x69\x97\xf7\xa5\xee\x39\xb2\xe0\x19\xb2\xe0\xf9\xb1\x6d\xff\x01\xe7\xa1\xef\xf9\x0c\x98\xfb\xce\x0b\x1e\xbc\x91\xf7\xdc\x0a\xf7\x81\x02\x5c\xd3\xf5\xb0\x72\x79\x00\x7a\xa1\x8d\x63\x3a\x23\x1e\x05\x2f\xde\xbd\x01\xbd\x10\xbc\x7f\xeb\xa8\x13\xf2\x34\x63\xd1\x2b\x91\xbc\x52\xab\x2d\x6d\x35\x5d\xeb\x46\x6d\xd5\x9c\xeb\xfa\x2f\x3c\x0c\x3f\xc6\x01\x35\x99\xe8\x2a\x3b\x6f\x21\x9b\x11\xbb\xc4\x60\x47\x6d\x22\xff\x84\x75\xeb\x2f\xb7\xea\xfb\x94\xa9\x50\x76\x87\xbf\x5d\x7f\xc5\xbf\x5d\x5c\xc4\xca\xe2\xc4\x61\x9d\xb2\xbb\x4e\x9e\x6b\x16\x4d\x48\x34\x5d\x86\x9c\x0e\x68\x25\x45\x6d\x9c\xc1\xdc\x56\xba\x68\x27\xbd\x92\x7b\xcf\xc7\x14\x35\x7c\x13\x16\xc6\x24\x4b\xe4\x8a\x3e\xb3\x17\x7e\xfd\x8a\x22\xea\x26\x79\xab\x38\x2c\xf4\x5c\xc1\x49\xaa\x75\x6e\x41\x90\xbc\x8b\x8b\xec\xe4\xbe\x72\x5e\xf1\x96\x6f\x25\x25\x2a\xc8\x54\xb2\xd7\x2e\xb0\x03\xf6\xec\x8e\x8c\xb5\xb4\x6f\x22\x1f\x45\x2c\x01\x41\xa6\x19\x8c\x2e\x6a\x46\x72\xd1\xe4\x0c\xf9\x71\x38\x8e\xa4\x42\x04\xce\xad\x9b\xf8\xd6\xc3\xa8\xaa\xee\x39\x7e\x3b\x1d\x57\x7b\x5d\xf7\xa0\x2b\x84\x98\x2c\xe1\xb7\x8d\xfc\x8d\x56\xf1\x30\x72\x3b\xed\x38\xf5\x38\xa5\x1e\xb4\x13\xa2\xb3\x3c\x7c\x2a\xd9\x82\x37\x91\x27\x3c\xa9\x91\x9b\x68\x66\xb2\x60\xba\xa4\x04\x2a\x3f\x64\xaf\xb8\x46\x1a\x53\x2b\x88\xa9\x52\xd0\xd9\x8a\x55\x10\xbe\x84\x46\x5d\xd5\x8c\x3f\x94\xfc\xed\x43\x18\x63\x3e\xef\x10\x2c\x08\x85\x7c\xc3\xbf\x52\xb9\x5d\xa5\x20\xa9\x56\x86\xa4\xdf\xcd\x7d\xef\x71\xe7\xc3\xb8\xcf\x38\x03\x67\x0a\x4b\x60\xf5\x4b\xc3\x07\x86\xd2\x12\x68\xbf\x7d\x55\xe4\xc3\x39\xf7\x73\x03\xa8\xcb\x4a\x20\xd5\x9d\xdb\x07\x95\x85\x25\xb0\xfa\x41\xe1\x03\x43\xa9\x0b\xad\x94\x29\x16\x50\x15\xb8\x30\x5a\x5d\x62\x81\x74\x89\x07\xa5\x0c\xf0\x14\xc4\x3c\xbe\x1e\xff\x37\x77\xa9\x7b\x49\xdc\x6a\x33\xbe\xa9\xd5\x27\x7f\xe8\x35\xe6\xfc\x6d\xb1\x39\xeb\x44\xfe\xac\xe2\x7e\x74\xa3\xd3\xcf\x0d\xc5\xcc\xf8\xa7\xc7\xab\xa6\x48\xbf\xf2\x15\xdf\xe1\x9f\xde\xfb\xdf\x65\x1e\xe7\xb7\x86\x75\x1f\x4b\x0e\xa1\x9d\x9f\xe6\xe5\xa7\x28\x26\xff\xd4\x74\x81\xbf\xe7\xf1\x97\xe4\xe9\x67\xb6\x3a\xb3\x0d\xae\xe6\xe9\x57\xb9\x75\xfd\xfe\x3b\x69\x34\xda\xa4\xe6\x7d\xbe\x82\xbb\x1f\x5e\x7c\x8c\x9d\xd9\x95\xf7\xd1\xe8\xc7\xd4\x99\x60\xd8\xcc\xbf\x5b\x78\x60\x79\xff\x40\x58\x07\x9d\x09\x84\xe3\x74\x8f\xf7\x3c\xee\x06\x6d\xd4\xfa\xd7\x15\xe0\x95\xb8\xb2\xc6\x07\x4e\x36\x9f\xab\xe6\xc8\x39\xdd\xee\x38\xb3\xd0\x51\xcb\x3a\x53\x26\xb1\xf9\x76\x6a\xb0\x2b\xd1\x6a\x15\xe2\x44\xc0\x81\x55\x28\x2a\x69\xc4\xaf\xe8\x1c\xa3\xfa\xcf\xaa\x3b\xcc\x92\xbe\x5a\x5e\xbf\x17\xbb\xb4\x15\x8e\x42\xcf\x4f\xad\xe2\x2c\xf4\x60\xaa\x0f\x36\x0f\xac\xfa\x64\xcb\x83\x55\x1e\x6d\x1e\xe0\xc2\xb3\xad\x08\x5d\x7d\xb8\x15\x61\xab\x4e\x37\x0f\x72\xc1\xf1\x56\x84\xad\x3b\xdf\x8a\xd0\x85\x03\xce\xea\xfa\x0d\xdf\xfc\x40\x76\xf6\x48\x8f\x94\x1d\x62\x65\xce\x8a\x76\x45\xb5\x5d\x3e\xb4\xee\x8a\x9e\xc4\x7a\xd4\xd3\x67\xaa\x73\xc7\xb6\x4d\x14\xef\xa3\xf8\xe0\xf3\x5e\x31\xea\x5b\xb5\x77\x9f\x79\xd2\x2f\xf4\xe8\x73\x34\xcd\x65\xd9\xec\x3c\x83\x56\x54\x72\xe6\x8d\xc8\x4c\x69\xce\x06\xce\x94\xdb\x19\x06\xab\x6b\x34\x6a\xd0\x4b\xf8\xd6\xd5\xd3\xcd\xbd\x0a\xcd\x18\xd0\x93\xd0\xb3\x15\xc8\x79\x0f\xde\xfb\x53\x64\x09\xcb\x89\x1c\xc9\x33\x92\x2b\x71\x27\xb5\x20\xd6\x92\x1b\x63\xb1\xd4\x56\x29\xca\x5a\xc8\x33\x52\x2c\xbc\x11\xff\x22\x9a\x44\x3c\x1a\x57\x39\x6e\xdc\xcf\x03\xd6\xba\x16\x21\x88\x75\xc4\x11\x51\x46\x79\x54\xe5\x52\xb4\xb7\xff\xb8\x00\x5a\xeb\xa8\xa3\x60\x4c\x25\x1a\x04\x60\x0f\xff\x1a\x66\xae\xd2\x37\x68\xff\xd1\xa3\xca\x2a\x75\xed\xe5\x61\x6f\x26\xe7\x9e\xe7\x81\x03\x8d\x44\x34\x54\xbb\x05\xb2\x08\x8f\xc6\xf9\xad\xc2\xf2\xa5\x1b\x2d\xdc\x74\x36\x07\xd3\x8c\x95\x20\xdd\x44\x5d\x57\xa6\xcd\xaa\x1c\x2f\x0e\xc6\xcd\xd6\x5c\x20\x74\x6f\x4a\x56\xc7\x8f\x42\x84\x8c\x46\x06\xb3\x91\x8b\xaa\x99\xa8\xaa\x0a\x79\x19\x4c\x3f\x4b\x16\x4d\x93\x47\x69\x46\xa3\xa1\xdc\x3c\xf0\xd6\xd0\x36\x76\x6a\x36\x71\x0b\xcd\x32\x36\x8d\xb3\x12\x2b\x25\xf2\x0f\x72\x4f\xd2\xc0\xda\x18\xdd\x3b\x2d\xa4\xc0\xf0\x3e\xf6\xc8\x1e\x5c\x27\x97\x4e\x08\x01\x5b\xa9\x5a\x1d\x76\x1f\xd5\xfd\xae\x30\x3a\x69\x93\xc6\x1b\x9a\xb1\x84\xd3\x70\xe7\xe3\x61\x8f\x4c\x79\x0a\x09\xcd\x17\x54\x6b\xb4\x48\x8f\x80\x99\xc4\xee\xd3\x6d\xf5\xd1\xb3\x7a\x59\xad\x9f\x5e\x55\xaf\xaf\x92\xd1\x4a\xab\x58\x4b\x9d\x94\x65\x5a\xb8\x59\x54\x24\x19\x0b\x0f\x87\x8d\x21\x86\x47\x33\x10\x43\x20\x5e\x07\xcd\x14\xdc\xf0\x80\xcc\x06\xe0\xc5\xb7\x96\xde\x65\x1c\x3d\xbc\x66\xaa\x72\x34\x2d\xc7\xac\x40\xb3\x9d\x11\x8b\xe3\xa3\x40\xf6\x4c\xf3\xdf\xdf\x97\x99\x17\x8b\x71\x45\x7e\x6f\x1b\x3e\xbf\x4b\xf6\x7c\xd9\xfc\x02\xb6\xc1\xfc\x27\x72\xa5\xbc\x7a\x77\xf0\xf1\xa8\xff\xf3\xcb\x5f\x8f\xc8\x33\x72\x22\xdf\xab\xf2\xa9\xaa\x5c\xd5\xb4\x29\x82\x2c\x49\x87\xf2\x3f\x33\x78\x0d\x07\xea\xc9\x1c\xb2\x11\x3e\x78\xf9\x78\x92\x35\x4e\xdd\x2d\x86\xa7\xfa\xd8\x72\xb5\x67\x6a\xf5\xdb\x46\x3b\x10\xa0\xee\xdd\xa8\x59\x6b\x16\xd1\x02\x1e\xde\xd9\xf3\x77\x87\xe2\x01\xa9\xb8\xa3\xdb\x25\x87\x59\x23\x25\x94\x48\xd6\x0c\x19\xe8\x90\x2e\x18\xe6\xf6\x8a\x18\x8a\xc0\xb1\x36\x11\x72\x92\xb0\xce\xf3\x30\x15\xf8\x6c\x25\xa1\x18\xf3\x21\xe1\x29\x19\x86\x1c\xb2\x9e\xf1\x00\xab\x03\x9e\x00\xbc\x95\x00\x11\x25\x19\xa3\x89\x9c\x8f\x8e\x4e\x58\x61\xb6\x36\xb3\x3b\x6b\x02\xc3\x18\x0b\x27\x8e\x1d\xec\x05\x8f\x02\x71\x81\x52\x8f\xd9\x42\x05\x78\x61\x86\xbd\x97\x6d\xf5\xd6\xec\x1a\x2b\x69\xfd\xf7\x53\x7f\x3f\x37\x3d\x77\xc0\xaf\x6e\x5d\x6d\x25\x0d\xc4\xfd\x2f\x3c\xba\x84\x2e\x78\xf1\xf2\xf5\xf3\x5f\xfb\x1f\x0e\xdf\xbf\x7f\xfd\xf2\xc6\x83\x4e\x7c\x51\x21\x20\x32\x71\x20\xa2\x74\x36\x95\x6f\x0f\xb0\xf5\xad\x8c\x15\xf0\xb8\xa6\x52\x5d\x17\x8a\x2d\x7c\x8b\x3f\xf1\x2d\xfe\xc4\x9f\x22\xfe\x84\x86\x5c\x88\xfb\x85\x98\xda\x90\x09\x26\x0e\xf6\xbf\x12\x31\x8b\xab\x5a\x79\xfc\xb0\xaa\x46\x6d\xa0\x05\x1f\xf4\x4f\x97\xfc\xa2\x3e\x30\xc5\x83\xbd\x1c\x60\x1d\x76\x1b\x8e\xe2\x86\xdf\x7d\x2f\x3e\x7e\x78\x0e\x07\xed\x33\xf2\xe0\xc1\xee\x53\x2c\xf3\x0f\xa4\x8a\x73\xea\xf1\xee\xd6\x23\x23\xf8\xc1\xd6\x9d\xb8\x06\x74\x90\x8a\x70\x96\x59\x87\x7c\x71\xce\x92\x51\x28\x2e\x7a\xa4\x81\xb1\xd2\x1a\xe5\xc1\x02\x0a\x9e\xf6\xa5\x51\xfb\x75\x5a\x66\xbf\x34\x84\xc4\x0b\x36\x84\xbc\x88\x9d\x5f\xe5\x5e\xf3\xea\xe3\x6f\x5a\x68\xa6\x2c\x81\xe0\x3f\x85\xd4\x04\x36\x02\x7f\x09\xd8\x6b\x46\xcf\xe1\x39\x5e\x1d\xd3\x9e\x46\x7c\xaa\xa3\x15\x4c\x67\x7c\x07\xad\x07\x76\xd8\x25\xcf\x48\x83\xdc\xb5\xa4\xbe\x4b\x1a\xd3\x14\x8a\x8a\x19\x2b\x18\x95\x37\x5b\xf9\x1f\x76\x18\xbd\x9b\x65\x25\x5d\x79\x0f\xa6\x2a\x5e\x67\xea\x48\x53\x3b\x6d\x55\xb4\x5e\x81\x2c\x15\xc3\x56\x06\x35\x64\xef\xc1\xee\xee\xd2\xa3\x95\x53\x43\xf6\xa1\x02\x8f\x46\x3c\xe2\xce\x38\x10\xef\xbf\x39\x9c\x33\x6e\x2c\x06\x4b\x89\xce\xbe\x7f\xfb\xc5\xaa\x8d\x7f\x9e\xb1\xf9\x28\x81\xfd\xce\xa5\x0b\xbc\x84\x2c\xa2\xc6\xee\x7f\x79\x21\x1e\xa0\x9f\x23\x91\x4c\x7b\xa4\x91\x0e\x69\xc8\x9a\xbb\xad\x86\xc6\x6f\x02\x45\xc0\x54\xd4\x57\xdb\xb3\xd5\x96\xe9\xd6\x25\xcf\x6a\x7a\x95\x63\xd2\xda\xae\xd8\x89\x59\xa1\x7d\x45\xb7\x95\x26\x66\xaf\x64\x62\x1e\x2c\x9e\xce\xce\x93\x6b\x9d\xd0\x44\x49\xcb\x3f\xfb\x3c\xfc\x60\x37\xcf\xbf\xb6\xa4\x76\x6d\x14\x57\x78\xdd\x32\xcb\xed\x73\x0f\x9c\x15\x62\x83\xb2\xf4\x48\x43\x99\x6d\x42\x78\x96\x46\xb1\xfb\x05\xfe\x76\xb8\xfb\x9e\x97\x3d\x23\x3f\x25\x8b\xb6\x21\xc9\xee\xd7\xb3\x0f\x21\xc6\x57\x34\x75\x0e\x0d\xd3\xea\x0b\x93\x8e\xa7\x01\x0b\xf9\x66\x82\x90\x60\x84\x91\xd4\x84\x18\xc1\xd1\xe6\x23\x80\x20\x82\x84\x82\x81\x44\x36\xa1\x91\x86\x87\xd3\x43\x82\x3b\x41\x49\xf2\xb1\x48\x56\xf0\xf1\xff\x3a\x82\x71\x00\x35\x00\x8b\xc1\x41\x76\xac\x20\xda\x75\x07\xfe\xbe\x0b\x64\xf3\xc3\x81\xad\xeb\x0e\xeb\x60\x59\xe8\x0f\xeb\xc0\x6e\xcd\x21\x36\x17\x8f\x8c\xfc\xd9\x3d\x62\x9d\xf1\xae\xe2\x12\xeb\x4e\xd3\x75\xf9\xc4\x46\xec\x32\xfb\x99\xb9\x5b\xac\x8a\x29\xd4\x23\x27\x3a\x1f\x95\xaa\x0a\x0c\xca\xa3\xb1\x6b\x49\xe6\xb9\x8a\xc2\x0e\x70\xcc\xa7\xa0\x1d\x72\x7d\x41\xed\x87\x03\x31\x9d\xf2\xbc\xab\xa8\xbe\xa8\x3c\x2b\x75\x6a\x70\x50\x34\x3f\x5f\xb5\xc9\x67\xa2\xe0\x1d\xdf\x59\xaf\x9f\xa9\x32\x06\x2b\x43\x26\x39\x0a\x24\x7a\xe5\xea\x8b\x5d\x5f\x7d\xb1\x5b\xa7\xbe\xd8\x3d\x55\x29\x66\x2d\x66\x11\xc3\xd6\x5d\x8e\x7b\xcf\xc7\xbd\x57\x87\x7b\xaf\x88\x7b\x38\xf0\x78\x75\xff\xd4\xfd\xd8\x57\x2d\xff\xcd\x4e\xa5\x2a\xd1\x93\xeb\xea\xfd\x2d\x50\xb1\x5e\xae\x4b\xe8\xcd\xd1\x2b\x00\x7a\x31\x82\xf5\x37\xb5\xe7\xdb\xb6\xb1\xa0\x68\xe1\xea\xb6\xac\x4b\x72\x0d\xf7\x0b\xb6\xbc\x72\x7d\xe4\x06\xe5\x76\xac\xd8\x96\xf9\x34\xa2\x67\x56\x55\x61\x70\x38\xa5\x9e\x85\xa9\x07\x5c\x8e\x63\xd1\x24\x39\xc0\x7e\xc2\x06\xe5\xc3\x69\xe2\x14\x4d\xe5\x52\x02\x89\xbf\xf5\x48\x2c\x2c\xb3\xa2\xaf\x45\xe5\x4a\xb4\x36\x44\x15\x3e\x32\x65\x9d\xc8\xe4\xb6\xa2\x3c\xaa\x96\x6a\xca\x97\x72\xbb\x2b\xcb\xcc\x9b\x3b\x5d\x3f\xc0\x62\x97\xf3\x63\x04\x34\xc6\x7c\xc3\x71\x9b\xc0\x4d\xd5\xf3\x93\x49\x18\x88\x93\x98\x41\xd4\xed\x92\xbf\xc9\xeb\xca\x2b\x7e\xf9\x46\x9b\xaa\xe8\x80\x72\x63\x96\xfd\x28\x6f\x78\x3c\x1a\x1f\x80\x66\xe1\x03\x1b\x66\x4d\xc8\x03\x6d\xc6\xa4\x2e\xa4\xbb\x96\xe0\xfa\x46\xea\x14\xe5\xae\xa4\xfa\x52\xaa\x07\xec\x7a\x59\xff\x8b\xe1\xed\x05\xd2\xc2\xa9\xbb\x4e\xe2\xda\x9c\xc3\x28\xa0\xe0\x7f\xc8\x33\x47\x99\xe8\x7f\xfb\xb5\xe6\x1b\xa4\xa9\x7b\xe6\xea\xf6\x34\x1d\xed\xb2\x50\xee\x48\x30\xea\xff\x01\xa2\xc2\x46\xe6\x16\xff\xaa\x8a\x7f\xff\x9d\xdc\xf6\xc1\xef\xdc\xd1\x25\xc0\x08\xcc\xf3\xed\xb1\x7d\x7f\x43\xb3\x49\x07\xae\xd0\x4d\x49\x96\x0e\x4c\x25\xe9\x92\x7d\xc7\x2d\xd5\x8e\x26\x0f\x8d\xd3\xec\x81\x17\xec\xfc\xd0\x64\x53\x8d\x21\x37\xa6\x1f\x72\xbf\x7b\xc4\xeb\xf2\xc9\xee\xa9\xfe\xf4\xb4\x04\xdf\xaf\x39\x7c\xbf\xe6\xf0\xfd\x5a\x8d\xef\xd7\xfc\xe8\x72\x73\xa1\x3b\xb4\x03\xcc\xda\x91\xbc\xb3\x68\x42\x74\x9b\xaa\x4a\x06\x66\x99\x25\xeb\x14\xe9\x5b\xa4\x86\xe2\x08\xc0\x98\xfe\x5f\x92\x35\x9b\xfb\xe4\x7b\xfc\x19\x8b\x0b\x87\x3a\x6d\xb2\xdf\x22\x77\x73\x5f\x90\x12\xf2\x53\x8b\x74\xc9\x3d\x6b\x11\x8a\x0e\x74\x22\x21\xa9\x98\x32\x92\x30\x9a\x0a\x0c\xe3\x64\x1e\x16\x84\xa7\x64\x90\x88\x33\x50\xed\x91\x37\x62\xc0\x43\x46\x0e\x26\x89\x84\xe7\x23\xbb\x10\xf8\x08\x66\xb3\x63\x10\xcb\xd1\x38\x7d\xff\x2f\xb2\x8f\xdc\x98\x73\x80\xb6\x10\x77\x9f\x91\xbd\x12\xe3\xce\x32\x8e\x91\x2d\x1a\x9a\x4c\xe9\x65\xd3\x1d\x4e\x61\xb3\x20\x08\x47\x07\x69\xb3\x69\xb7\x15\xbd\x85\x20\x65\x20\x3f\x28\xe9\xc9\xee\xed\x68\xa2\xb7\xda\xe6\x2f\xf2\x3d\xd9\x27\x77\xc9\xfe\xd3\x42\x37\x7e\xbd\xd6\x6e\xfc\x84\x4b\xc6\xeb\xc7\xaf\xa6\x1f\xbf\x96\xf4\xa3\x82\x3d\x0c\xfd\x61\xaa\xf2\x4c\x01\x1d\x07\x76\x28\x73\xa8\x84\x2b\x27\x23\x01\x3b\xe7\x43\x56\x12\x8d\xa0\xb8\x63\x74\xbb\xe4\x7d\xc2\x62\x9a\xb0\x62\xcc\xb9\x4e\xee\x70\x29\xb9\x17\xd6\x87\x6b\x80\x0a\x08\xdb\x74\xee\x81\xfa\x52\xa2\x69\xd4\xd3\x7f\x98\xd9\xd2\x25\xbf\xb6\x9d\x59\xea\x39\x7f\xb7\xc9\x70\xd0\x93\x97\x2c\x2f\xd5\xc7\x53\x77\x58\x2f\x58\x1c\xd2\x39\x8c\x8a\x5d\xb2\xe1\x0c\xba\xe9\x6d\xfa\x0b\x87\xb9\xc8\xf2\xa2\x6e\x72\xdc\xe0\x02\x35\x13\xe8\x3a\xb1\xc1\xa5\xd8\x15\x5a\xb7\x20\xec\xf0\x2f\x0c\x43\xf1\x65\x82\x4c\xe9\x19\x23\x94\x64\x09\x0d\x98\x18\x8d\x30\x3a\x1b\x3c\x6e\x30\x8d\x5b\xd5\xca\xfb\x03\xc8\x71\x55\x72\xcb\x2f\x61\x9b\x98\x26\x74\x9a\xfa\x37\x7e\x7b\xe1\xc5\xaf\x65\x97\x62\xbb\xbb\x2b\x18\xdd\xe7\x02\xcc\xaf\x79\x98\x5f\x8b\x30\x6a\x11\x7a\x60\x30\x2e\xf7\x2e\x3c\xb0\x10\xc3\x81\x67\x7c\xaf\xe3\xba\x3e\xf3\xa2\x54\xa8\x52\xf7\x02\xf2\x3c\x08\x08\xd5\xdc\xa7\x43\x89\xa9\xca\x54\xbe\x8c\xfd\x47\x1d\x79\x46\x4e\xcc\x0b\x11\x1e\x9b\x45\xdd\xb1\x7d\x6f\xaa\x4a\xad\x36\x39\x59\xe0\xff\x57\xe3\xfa\x07\x2e\x74\xee\x28\xd4\x8b\xd3\xb1\x12\x36\x12\x17\xf7\xce\x9f\xf7\x52\xcb\x70\xd1\xf4\xbc\x95\xc2\x2e\x79\xd6\x33\xe2\x34\x77\x72\x95\xc0\x48\x7f\x72\x16\x84\xf9\xb3\xc0\xaf\xf9\x93\xde\xf2\x6d\xfe\x40\xb7\xfc\x5b\xb2\xf9\xba\x7c\xac\x79\xb7\x75\x6a\x0f\xda\xbc\x0f\xbd\x41\x61\xde\xe2\x25\xd3\x45\xee\xda\xb4\xc4\xce\x1b\x5d\xfd\x71\xcb\xac\xf6\xe1\xa0\xf8\x1c\x16\x25\x31\x55\x00\xb2\x2e\x70\x80\xdd\x5a\x5a\xc5\x4b\xe9\x12\x9c\x79\x3c\x91\x0c\x39\x1b\x4e\xbc\x30\xc3\x62\x38\x9c\x25\x2c\x95\xac\xfa\x7f\x33\x3e\x3c\x0b\xe7\x1d\x5b\xe5\x17\x46\xd2\x8c\x87\x21\xb9\xa0\x51\x26\x41\x20\xf5\x67\x6e\x6b\x5d\xf4\x90\x61\x51\xe0\x87\x77\xf1\x36\xc8\x92\xf0\x15\x55\xa1\x5b\xea\xf6\xdf\x25\x77\xdf\xcd\xb6\x7f\x1b\x32\xc6\x10\x55\x11\x76\xb7\xb5\xf0\xa1\xb7\xa0\x87\xce\x2c\x6a\x8a\xde\xb9\xa3\x89\xab\x64\x16\x75\x71\x51\x0a\x1b\x9e\xe5\xc5\x4e\x1a\xf2\x21\x6b\xee\xb5\xdc\x1e\x3b\x23\xb8\xb9\x60\x00\x9e\x98\xb3\x3c\x1a\xc0\xc6\x1e\xe4\x45\x3f\xf1\xc2\xc2\x51\x34\x71\x5c\xc4\x47\x3c\x04\xe1\xf8\x2c\x23\x20\x01\x20\x6c\x3a\x0b\x69\xc6\x02\xe4\xc9\x54\x5e\xaf\xa7\x70\xbd\xee\x98\xba\xbf\x30\x15\x6f\x39\x03\x4e\xe2\x11\x01\x75\x87\x44\x07\xb6\x77\xb0\x56\xdc\xed\x1f\x02\x39\xc3\x02\xfc\x6e\x18\xf2\xe1\xd9\x77\x24\xe4\x67\x4c\xb5\xd0\x71\xd0\xa2\xc9\x9d\x5e\x73\x4a\x1f\xe9\xde\x6a\x2c\xa6\x74\x98\x88\x30\x34\x38\x6e\x99\xb5\xce\x53\xf9\x38\x90\x75\x26\x42\x9c\x81\x15\x25\x0b\xc0\x00\x10\xa5\xfb\x09\x3b\xe7\x62\x96\xea\x5d\x5c\x02\x43\x3c\xb2\x4e\xa5\x1f\xfc\x4a\xee\xd6\xcb\xb8\x55\xe7\x1d\xaa\xd7\x76\x92\x5e\xe0\x20\xbd\xa1\xf3\x67\xa5\xab\xa7\xeb\xdd\xb8\x62\x2e\xb3\xbc\xc5\xca\xf2\x09\xcd\xdc\xf1\xdb\xe8\xdc\xc5\x54\x5f\xda\x01\x3f\xf1\x13\x41\xe2\xf9\x9c\x2f\x5d\x29\x49\x1f\xba\x65\x96\x64\xe5\xd3\x29\xd4\x5a\x39\xef\x22\xef\x44\x52\x9f\x2a\x9d\x8b\x9c\x2d\x62\xa1\x77\x91\x2b\xb5\xaf\x74\x2f\x72\x7c\x02\xd6\xf3\x04\x1a\x85\x3c\xd6\x2e\x07\x8e\x5b\x90\xd3\x38\xf8\x05\xe5\x54\x26\x39\xc3\xcf\x07\x1b\x19\x7e\x22\x60\x47\xc1\xc9\xe1\x91\xef\x54\x4f\xbf\x2b\xd7\x68\x3d\xb8\xff\xb0\x25\xf1\x69\xfb\x1b\x2d\x9a\x2f\xf6\xec\xe1\x46\x3d\x2b\x35\x2c\x7b\xf8\xb0\xf5\xb4\xf4\xcb\x83\xfb\x8f\x5a\x4f\x8b\xa3\x29\xb5\xb7\xba\xd7\xea\xc0\xf5\xb7\x33\x4a\xc4\x54\x2e\xb4\x5c\xbf\x1f\x5d\xa7\x29\x2d\x48\xa6\xb2\xcb\x2a\xbb\xa9\x27\x2d\xb4\x42\xfa\x1b\xe2\xad\x74\xb5\x51\x60\x99\x40\xcb\xdc\x2a\x9f\xa5\x7b\x0a\x4e\x6e\xca\x55\xb8\xc0\x54\x0b\xbc\x60\x52\x98\x86\xc3\xac\xda\xc5\x07\xd2\xff\x60\xc3\xaf\x51\xb9\x51\x65\xd1\x78\x5f\xb7\x0c\xfb\x92\x36\x19\xae\xcc\x63\xf4\x58\x81\x8f\x59\x26\xdb\x7f\x15\x55\xf6\x00\xc4\x56\x6a\x7a\x9a\xea\xbf\x9d\x23\x72\x57\x4f\x59\xe7\x15\xf9\x9e\xdc\x2e\x6f\xe5\x49\xcb\xb9\x79\x71\x94\xb0\x11\x4b\x7b\x2c\x7a\x0a\x91\xab\x1a\x50\xdc\x68\x6b\xcb\xf7\xfd\xfd\xce\x5e\x67\xbf\xb3\xe7\x82\xc3\x2b\xeb\x35\x3f\x63\x6d\x32\xa5\xf1\x28\x72\xed\x97\xd1\xe2\xfd\x79\x32\x76\x0b\xe5\x0e\x26\x6b\x3a\x87\x9a\x8f\x88\x74\xbf\x27\xcb\x22\x23\xdf\x77\x5d\xa5\xec\x3b\x79\x06\x2a\x76\xb0\x08\xd5\xee\x07\x5e\xdd\xca\xbb\x19\xc4\x16\x3c\x25\xf9\x64\x09\x50\xd8\xc3\xf1\xd9\x5a\xf4\x75\xa9\x0e\xd6\x02\xe8\xce\x02\xe0\x3f\xc8\x5e\x51\x99\xe5\xd8\x74\x3b\x95\x62\xb4\x83\xc7\xea\x9e\x3a\xcc\x82\x71\x15\x8d\x61\xd7\x29\xd2\xdc\x61\x38\xa5\xf9\xce\x19\xa4\xd6\x10\x27\x2c\x85\xc7\x68\x9a\xb1\xb8\x0d\x95\x68\x26\x12\x65\x8f\x3f\x22\x4d\xd5\x81\x96\xe9\xfe\x30\xbb\x6c\xc2\xdf\x6d\x3d\x92\x7d\x6f\x24\xfb\xde\x48\xda\x46\x98\xdd\xed\x4a\x7c\x78\xd6\x13\x9e\xca\xeb\x14\xb4\x36\x08\x19\x11\xb2\xbb\x0d\xf5\x1a\x47\xf9\x8a\x3e\x10\x74\x8f\xc8\x0e\x5c\xed\x52\x3e\x95\xb7\xad\x21\x55\x31\x89\xc1\x11\x01\x47\x7a\xdb\x25\xf9\x9d\x3b\xe4\x76\xf3\x40\x92\x0e\xc8\x24\x7f\x3b\xab\x56\x55\x71\x9d\x69\x40\x97\x6e\x1a\x7b\xa6\xa6\x0f\x9d\x0a\xde\xb5\xf4\x3c\xc9\xb7\x01\xbb\x20\x07\xcd\xd6\x53\x72\xbb\x29\xe7\x4c\x81\xca\x5a\xf0\x0c\x6d\xb6\x5a\x9d\x40\x44\xec\x29\xd2\xc4\xd5\xa8\x93\xdc\x1a\x6f\xea\xb9\x07\xc8\xb6\xa1\xf5\x0f\xb0\x0b\x99\xce\x28\x36\x6f\x93\x13\xd9\x9e\x4a\x24\x8d\x75\x4e\xdb\x70\x86\xb4\x48\x8f\xd8\x6f\xf9\x47\x84\x2f\x96\x0a\xf5\x6e\xa4\x37\xa6\xe6\x3b\xfd\x94\x79\xea\x4e\x45\x6e\xbc\x1a\x84\x18\x55\x2d\x74\x60\xa3\x51\xc2\xb0\x9a\xef\x4e\xf4\x50\xe0\xbf\x72\x2c\xba\xa8\x24\xca\x15\x51\x84\xe8\x98\x71\x60\x3f\x6e\x39\x37\x3e\x84\x50\x3e\x23\xad\x92\x73\xea\xf1\x75\x9f\x53\x7f\xf3\xfd\x3d\x2a\xb6\xe4\x7b\xfb\xde\x56\xff\x82\xa5\xc3\x2a\xff\x01\x70\x20\x28\x1c\xca\x76\x4b\x56\x06\x36\x7a\x4e\x91\xee\xc6\x7b\x12\x77\x03\x1e\xa9\xd5\xd6\xca\xf7\xaf\x33\xca\x23\xb0\x3d\x92\xd7\x2f\x44\x07\xb3\x0f\xbc\x83\xc0\x8a\x28\xe4\x19\x7e\x47\x33\xa9\xfc\xd4\x3e\xd9\x68\x6a\xe5\xe4\x1c\x1e\xbf\xfc\xf0\xfc\xf8\xdd\x87\xaa\x49\xdc\x6d\x35\x1b\x7a\x69\x34\xd4\x84\x1e\x3d\x7f\xf5\xb2\x7f\xf0\xfa\xdd\xd1\xe1\xdb\x7f\x59\x35\xef\xad\x2c\x99\x1b\x8f\xcc\x84\xe3\x69\x7d\xf2\xe8\xf4\x44\x37\x71\x8a\xe2\x0a\xf8\x74\xd2\x40\xee\x69\x9c\xe6\x05\xec\x79\xec\xa0\xd9\x45\xb1\x77\xb7\x4b\x58\x1a\xf2\x28\xdb\x51\xae\xf0\x3b\x72\x0b\xd8\x09\x79\xc4\x48\x24\x76\xb2\x49\x22\x2e\x76\x42\xe8\x6d\x78\x8b\xb8\x27\x22\xb4\x99\x0b\x50\x49\x00\x9e\xec\x3f\x05\x81\xee\x15\x19\xd2\x6c\x38\x21\x4d\x49\x58\x79\xdc\xb1\x69\x9c\xcd\x89\x9c\xec\x5a\xd6\x60\x97\x6c\xd8\x26\xe9\x19\x8f\x0f\x42\x91\x1a\xef\x2f\x70\x0d\x73\x4a\x61\x87\x74\x47\xd6\xd2\xcb\xc7\x28\xc9\x41\x65\x43\x47\xcc\x55\x9c\xeb\x29\x55\x67\x5e\xa2\xa6\xd4\x3f\x76\xe0\x18\x4c\xf2\xd3\x4c\xe0\x1b\x6c\x92\x85\x29\xd6\x76\xde\xf2\x9d\xcd\x7a\xba\x55\x75\x3f\xd6\x2a\x06\x0f\x67\x15\x0a\xd9\x86\xa9\x21\xe7\x42\x1e\xf1\x28\x09\xa9\x99\x50\xb3\x77\xc8\x96\x4b\x39\xfb\xc1\xee\xb5\xfa\x89\xe9\x77\x8f\x63\x8e\xaf\x6d\x06\xf4\xa7\x31\xcb\x0e\x26\x3c\x0c\xde\x98\x2b\x40\xae\xc4\x82\x4e\x59\x32\x66\xee\x27\xc9\x12\xc5\xc2\xa5\x5d\x50\x94\xb9\xdd\xbf\xf8\x39\x8b\xc8\x27\x57\xe2\xac\x82\x55\x7c\x6a\xeb\x09\xa3\x7a\x97\x31\x1b\xfb\x19\x83\x3c\x1e\x00\xda\xb9\x45\xd0\x70\x0f\x44\xf8\xe4\xf3\xf7\x57\x36\x22\x5b\x29\x5e\x00\xd6\xdc\x80\x88\xaf\x88\x9e\x01\x31\xf2\x90\x83\xc1\x9f\x61\x82\xdc\xe4\x34\x4d\x5c\x0d\xd9\xb1\x57\x91\xf5\xcd\x9e\x62\x4a\x6f\x87\x7f\xb0\x04\x6b\xe8\x83\x4c\xf5\x01\xea\x9a\xb0\xd9\x30\x71\xb9\x0c\xfe\x2d\x5d\xef\x07\x04\xd6\x3f\x7b\xd8\xc9\xa7\xb7\xb4\x39\x04\x1a\x6b\xa8\x53\x55\xf9\x09\xe2\xbe\xdb\x8c\x66\x61\x08\x3c\x0a\x2a\x6d\xd5\xf1\x96\x6e\xef\x40\x15\x74\xa6\x34\x76\x86\x65\xd9\x7f\x98\xeb\xf4\x10\x1a\x6d\x75\x46\x22\x79\x49\x87\x13\xe7\x2a\xef\x0d\xb1\xdb\x25\xc9\x0c\xd5\xd7\x53\x1a\x5b\x7c\x13\x96\x30\x70\xe0\x65\x34\x20\xa9\xc0\x14\x2d\x12\x4a\x85\xc9\xd7\xc6\xaa\x33\xc8\x1a\x18\x31\xe7\x58\x3e\x41\xaa\x2b\xab\x41\x6f\x5e\xb1\x4f\x8e\x58\x41\x1f\xd3\x57\x86\xdf\x7e\x99\xb0\x88\xcc\xc5\xac\x91\x30\x42\x83\x00\x48\x2e\xe7\x6c\x2a\xce\x21\xf4\xbe\xe6\x1c\x50\xbe\x4f\xe9\x9c\x0c\x00\x4e\xf6\x42\x81\xb1\x40\x1e\x7b\xd9\x84\x49\x74\x29\x05\x1d\x7d\x14\xb0\x04\xb2\xca\x74\xc8\x2f\xcc\x17\x9b\x7f\x3f\x10\xd9\xe4\x7b\x92\xf2\x68\xc8\xc8\x85\xf3\x91\x4f\x67\x61\x46\x23\x26\x66\x69\x38\x97\xb8\x50\xbf\x6f\x63\xce\xcb\x66\x68\x04\x49\x13\x3b\x28\xda\x33\xd3\x97\xd1\x33\x96\x12\x6a\xe5\x79\x29\xcb\x14\xeb\xa6\x88\x2a\x20\x14\xae\x55\xce\x07\x28\x85\x15\x0b\xf3\x3b\xc5\x4b\x30\x87\xb4\x03\x69\x46\xc6\x33\x96\xa6\xd6\x50\x38\x49\xd8\x30\x93\xb8\x40\xbc\xc9\xa3\x71\x87\x1c\x22\x21\x47\xb3\x6c\x96\xc0\x58\xe4\xfc\xc8\xfd\x41\xee\x3b\x72\xbe\x54\xe5\x59\xc6\x43\x9e\x71\x26\x47\x20\x31\x80\x61\xeb\x9b\x59\x98\x71\x60\x33\xa3\xef\x84\x47\x0e\xa3\xe9\x1c\x42\xdc\xa8\xf8\xfb\x17\x08\x2e\xfb\xc5\xc2\x11\x09\x04\x4b\x49\x24\xa0\x27\x01\x97\x7d\x0a\xe7\x4a\x6b\x2a\x6b\x0f\x45\x34\x64\xb1\xc9\x70\x38\x8b\x94\x2e\x58\x4e\x8c\xe6\x69\x18\xb7\x3c\x12\x74\x01\x10\x0e\x92\x66\xc2\x4d\x1f\xb4\xfe\x3c\x03\x9e\xcc\x6f\x26\x7a\x7b\x90\xf8\xf0\xff\x0c\x87\xd0\x54\x71\x19\x0b\xe0\xe1\x28\xab\x7d\x82\xbe\x5b\x31\x9f\xbb\x5b\xe4\x37\xdb\x66\xeb\x53\xa7\xac\x29\x38\xbc\xe0\xff\xae\xbf\xa9\xfc\xae\x07\xf9\xbf\x80\x47\x60\x01\x9a\xe0\x25\x34\x0c\x91\x65\x78\x44\x3e\xc9\x61\x7f\x42\x96\x52\xc5\x12\x97\xfc\x22\x7b\xf9\x09\xd8\x54\xd9\xa9\xa8\x97\x56\xc0\x92\x8e\xbf\x73\x16\x0f\x8a\xa6\x44\x8b\xb1\x70\x71\xb3\x80\xd9\x7d\x86\xff\xf9\xfd\x77\x65\x75\xa9\x4e\x72\xf8\x8f\x2a\x74\x8d\xa2\xc7\x2c\xfb\xb7\xbc\x28\xbe\x12\xc9\xcf\x6c\xde\x3c\x63\xf3\xdc\x36\x05\xdb\x49\x84\xf5\x7f\x80\xff\x9c\xc0\xc6\xd1\x83\x76\x4e\xb4\xa1\x31\xa8\x06\x94\xd9\x0d\xa3\xc3\x09\xd4\x13\x23\x35\x42\x34\xaf\x0f\x79\x6a\x97\x52\x26\xe4\xee\xc5\x92\x8c\x0c\xd8\x48\x24\x2a\xc7\x14\xb6\x86\xa8\xd4\x0e\x36\x80\xa7\xa2\xac\xab\xb6\x67\xa5\x47\x4c\xdf\x33\x30\x91\xab\xda\xa7\x15\x74\x8c\x50\x2a\x5c\xce\x09\x74\xd6\x98\x64\xcb\x21\xfc\x8c\x03\x94\x7f\xba\x61\x23\x9c\x4f\x76\x86\xcd\x47\x8b\xb4\x44\xc5\x94\xeb\xe0\x89\x42\x25\x37\x5b\xa7\xa2\x55\x7c\x95\x75\xb1\xf2\x69\xe8\x36\x1d\xcf\xd2\x89\xee\xa8\x2b\x18\xd6\x63\xe7\x9e\x35\x1e\x3c\x6a\xfc\xbb\x0a\xb2\x88\x99\x0e\xad\xa1\xcd\x8d\x59\x8e\x38\x3f\x26\xf5\xfb\x34\xff\x36\x47\x9b\x75\x4e\xfe\x5e\x98\x05\x5d\x43\x8b\x5c\x08\xf7\x1f\xa4\x0e\xb1\xde\xaa\x7e\x3c\xab\x44\x72\xc2\x4f\xed\xfc\xb9\x83\x3a\xa9\xa9\x71\x8a\xb7\x33\x97\xdf\xfd\x06\x4b\x9f\xb2\x65\xd8\x4b\x30\x45\x0e\x0a\xb3\x18\x78\x44\xc3\x70\xde\x96\xe7\x9f\x3e\x9b\x53\x72\x31\xe1\xc3\x09\x09\x78\x10\x35\x32\x95\xb5\x58\xaf\x01\x1a\xcd\xf5\x82\xc3\x85\x73\xab\x38\xaf\x45\xde\xf3\xa6\xd2\xeb\xae\x03\x5b\x3b\x7e\x05\x50\x08\xc0\x33\xf4\x2e\xb2\x57\x85\xeb\xf6\xde\x97\x15\x96\xe1\x06\x62\x2c\xf8\x9d\xab\x6a\xe3\x51\x05\x7c\x5d\x53\x39\xcc\x5f\x66\x54\x87\x6f\x81\x15\xbe\x05\x56\xf8\xf2\x02\x2b\xdc\x44\x10\x02\x7b\x4f\xac\x5a\xf3\x65\x71\x15\x96\x0b\xa9\x70\x23\xb1\x02\x36\xf5\x95\xfc\x3a\x1c\x11\x97\x49\x1b\xad\xac\xe4\xd2\x36\xc9\xe6\x31\x1f\xca\x23\x9a\xf0\x28\xe0\x43\xf0\x84\xd7\x07\xb5\x9b\xd9\x19\x7d\xcd\xc4\x88\xd0\xc8\x4b\xfb\x0f\x5d\x33\xd6\x77\x4b\xfb\x74\xbe\xe0\x74\xca\x1c\xa7\x52\x37\x71\x34\xa4\x4a\x75\x2c\xf0\x6a\x13\x99\x3a\x69\x46\xfd\x16\x7e\x12\x09\xff\x4d\xbe\x45\x42\xe3\x68\x9c\x33\xf0\x45\x25\x7f\xbe\xcd\xff\x59\xb7\xc1\x7f\xcb\x93\x62\xb8\x6a\x73\xbf\x2e\xdf\xdc\xad\x2b\xb0\xf8\x55\xe1\x2e\x56\x72\x35\xdd\xd8\xcb\x74\x49\x07\xd3\x2d\xfb\x96\xfe\x85\xdc\x4a\x57\xf7\x28\xbd\x66\x67\xd2\x9c\x03\xbd\x89\x9b\x69\xbf\x99\x20\x1e\x25\xa9\x57\xc7\x2c\xc3\xfe\x1c\x15\xa2\xa7\x34\x41\x94\xea\x1b\x7d\xf9\x86\xd6\x18\x52\xbb\xd4\xce\xda\xb1\xec\x76\xa0\xaa\x0c\xbb\x1d\x90\x5f\x0b\x06\x57\x05\x4f\xb2\xb2\x16\xb5\x4b\x59\xd9\x37\x70\x25\xdb\x71\x9d\x61\xba\xe8\x8f\x51\xb0\x27\x46\x2f\xb4\x6a\xd0\xff\xd1\x8f\xae\x9c\xb9\x2f\x86\x87\x7e\xa9\x2c\xde\x6a\x1c\x6a\x8b\xb6\x9c\x39\xf2\xc1\x03\x41\x35\x92\x37\x2a\x56\xad\x5c\x56\xfa\x6c\x2c\x68\xc4\xf0\x41\x55\x23\x5b\x36\x0d\x2d\xb5\x0a\xdd\x28\xcf\x8b\x17\x77\x7f\x7f\xa5\xac\x2f\xd7\x9c\xa1\xc5\x71\xef\x45\xa8\x5a\x6f\x87\xfe\x12\x8b\xc2\x83\xa9\xf6\x76\xe8\xd7\xad\xc2\xf5\xcd\x22\x2b\xf2\x5e\xe8\x30\x29\x10\x23\x13\x3a\x6f\xff\xfc\xd5\xfe\x29\xfb\xd1\x38\xf5\x6c\xd8\xfb\x7a\xdf\xb2\x9b\x58\x71\x4c\x6a\x19\xc8\x61\xb9\x16\x85\xaa\xb8\x08\xaf\x38\x3a\x0f\xaf\x8a\x37\x49\x4c\xa1\x82\x0e\x5d\x57\x6e\x0a\x3f\x9c\x52\xdb\xef\xfe\x6a\x69\x2a\x72\x28\x4d\x58\xa4\xb6\xe6\xc1\x55\xb2\x51\x60\x3f\x0e\x56\xcb\xd9\xa1\x96\xb1\xdb\xad\xfd\x55\xa7\x66\xdf\x0e\xc4\xa7\xb1\xcf\x09\xab\x4c\x4d\x01\xe5\x2b\x9a\x66\x15\xb3\x02\x9e\x77\x9b\xda\xf5\xae\x60\xd2\x4b\x44\xf4\xd2\x49\x97\xe5\x9c\x17\x6d\xf9\x09\x2d\x76\x73\x7b\x7c\x89\xad\xed\x92\x7d\x24\x25\xc6\xc2\x9f\x4b\x33\x0f\xf8\x29\xbd\xea\xd1\x2b\x9c\x3e\xa6\x1c\x03\xb5\xf1\x99\xa5\x06\x93\xbb\x5c\x38\x49\xef\x5a\xe4\xca\x1a\x15\x2f\xcc\x46\xb0\xa4\xad\x70\xb5\x99\xb0\x79\xf7\xd4\xd8\x09\xeb\x46\xf2\x82\xc3\xfd\x2f\x4b\x70\x68\x7d\x24\x8a\x09\x4c\xdd\xd8\xca\xe7\x2c\xca\x90\x22\xe8\x05\x64\x7d\x8f\xb4\x59\x86\x51\xcf\x22\xcb\xc9\x0a\x7e\x58\x5e\x50\x1e\xbb\x0e\x4b\x03\x34\x5f\xcb\xb5\xe2\x7b\x5c\x58\x1f\x21\x43\x07\xf8\xe9\x66\xb8\xcb\x1b\x86\x78\x95\x4d\xa4\x67\x64\x2d\x47\x9b\xe1\x7f\x38\xc1\x71\x9d\x36\x2b\x3a\x61\xc0\xf1\x22\x70\xe7\x8e\xb6\xc1\xf4\x3f\x9c\x34\x44\xd4\x20\x77\xed\x84\x9d\xa2\x5f\x93\x31\xd0\x2c\xe9\x40\x45\xc5\xb2\x9e\xa8\xa1\x9a\xa0\xc3\x20\x9a\x2e\x32\x5f\x09\x31\x8b\x9c\xf8\xe7\xc8\x3c\x61\xc2\x34\xde\x6c\xc4\xe1\xbf\xb8\x34\x1c\x1f\xf7\x5f\xb7\x5c\xf3\x26\x82\xab\x4e\x58\x18\xb3\xa4\x72\x10\xf7\xbf\x34\xf9\xe7\xdb\xea\xbc\x29\x7b\xad\xce\x2a\x48\x7e\xff\xbd\x4a\xc0\x45\xa3\xf9\x96\x62\xae\xce\x52\x96\x1c\xb1\x90\x0d\x33\x1d\xbb\x54\x3d\x46\x51\x3f\x28\x42\x91\x3c\x1f\x0e\xc1\xfd\xc9\x1c\x42\xb2\xb0\xa7\x42\xf7\xc5\x34\x64\x59\xc6\x3a\x29\x1b\x8a\x28\xa0\xc9\xbc\xf3\x7c\x7f\x77\xb7\x04\x07\x86\xe6\xab\xc5\xa1\xc2\xdf\x61\x76\x84\x02\x8a\x03\x11\x65\x89\x17\xfa\xaf\x14\xc9\x98\x65\x1a\xf2\x98\x5d\x66\x4d\xff\x6b\x9c\xf0\x29\x4d\xe6\x27\x0f\x76\x77\x4f\x5b\x85\x26\x5e\xa8\xec\x51\xcb\xf5\x53\xe7\x9a\x2a\xa0\x79\x99\x24\x22\x59\x80\x83\x49\x18\xe8\x46\xa1\xfa\x7b\xec\xe3\x02\x04\xee\x48\xec\xa5\x6d\xe5\x48\x87\x10\x0e\xb2\x82\x7d\x77\x5b\x1d\x11\xb1\x77\xa3\xe6\x89\x8d\x9e\x4b\x1a\x14\xd8\x01\xff\x82\xe3\x19\x92\x31\xe2\x8c\xe7\x73\x31\xc2\x28\xe1\xd5\x8a\xbd\x45\x6f\xbe\x4d\x95\x0b\xc7\x13\x06\x2e\x62\x5a\x6a\xcc\x87\x90\x80\x26\xca\x48\xc8\xc7\x34\x9b\x25\x8e\x74\x5c\x1b\xf5\xf4\xf4\xdd\x63\xa5\x55\x9d\xf7\x13\x59\xa5\x72\xb5\xee\x61\x42\x63\xd6\x5c\x01\x55\xeb\x6b\x0c\xf2\xe8\x63\x39\x06\xf3\x1c\xc9\x6a\xf9\xd0\x98\x1d\x4c\xac\x31\x4b\xb5\x36\x05\xd8\x9c\x28\x36\x27\x17\x13\x16\xa1\xb5\xcf\x14\x8c\xf0\x52\x16\xa5\x2e\x79\x71\x69\xdc\x18\xf7\xa2\x1d\xb1\xd9\x6a\x0f\x87\x78\x47\xd3\x42\x5a\x63\x35\x83\xf9\x89\xcb\xd3\x13\x5b\xc1\x57\xa9\xdc\x2b\x2f\xf3\xaa\x10\x79\x0d\xd5\xc2\xd5\xb9\x88\x43\x61\x5c\x7b\x57\x94\x39\x59\x91\xd3\x52\x69\x57\x43\x91\x18\xa7\xdc\xe5\xa5\x3a\x8d\xa9\x4e\xf1\x23\x57\xab\xc4\x9b\x4b\x40\x5a\x2b\x63\xf8\x7c\x65\xe0\x4f\x54\x17\xc8\x5d\xac\xa3\xae\x0b\x9d\x21\x8d\x79\x46\x43\xfe\x1b\x7b\xc5\x93\x34\x7b\x2d\xb9\x27\x69\x35\x01\xb8\x75\xda\x56\xf3\x05\x69\xa7\x34\x3b\x94\x0b\x66\x96\x17\x46\xb8\x4f\xfc\x4a\xb1\x43\xd9\x9b\x5f\x72\x5f\xc2\xe9\x8e\x8a\x58\xde\x23\x0d\x79\x47\x6f\xe4\xe5\x0d\x43\x63\x40\x49\x30\xbb\x8e\x64\x37\x78\xfa\xc0\x26\x81\xc4\x5f\x2e\x39\x93\x52\x95\x7c\x5e\x7a\x13\xf0\x74\x77\x37\xbf\xce\xf2\xcd\xff\x19\x76\xf1\x5b\x8b\xa5\x73\xa0\x83\x72\xd6\x5e\x2d\x89\x16\x4b\xe6\x1c\x74\x6a\xfd\xd6\x6e\xd9\x4b\x23\x84\x05\x58\xdd\xbb\x6b\xe7\x86\x16\xa8\x38\x46\x2d\x15\x1d\x14\x96\x41\x99\x2b\x3a\x32\xa9\x69\x18\x36\x6b\x00\x9e\xce\xb8\xda\xa1\x1a\xf2\x77\xe3\x69\x99\x04\x60\xb5\x84\x95\x80\x87\x5c\xb5\x9a\xf2\x8f\x56\xed\x73\x7e\xdd\x44\x46\x0f\xae\x33\x91\xd1\x97\x28\x6e\xf8\x8b\x4b\x04\xb6\x2a\x6d\x01\x71\x43\xb7\x4b\xfe\xa9\x56\x03\x0b\x8c\xa4\xd6\xc9\x2d\xfb\x4d\x20\xb1\x58\x20\x01\xdb\xca\x1b\x1a\xf1\x78\x16\x2a\x57\xe2\x72\x6b\x37\xcb\x2d\x76\x82\xab\x68\x5b\x06\x5b\xd7\x2f\x3f\x21\xee\x5f\x57\xfe\xb1\x24\x3e\x75\x4f\x3b\xc6\xc4\xe6\x9b\xf5\xcd\xc5\x75\x93\x22\x9a\xaa\x2b\xe5\x55\x5b\xa7\x4d\x98\xc7\x62\x9c\xd0\x78\x32\xef\x60\x26\x66\x1b\x80\x2e\xe4\x11\xfb\xc9\x64\x4d\xe9\xdc\x67\xd3\x46\x1b\x92\x18\x4e\xe3\x44\x9c\x43\x9c\xd3\x80\x0e\x78\xc8\xb3\x39\x18\x07\x4d\x67\x61\xc6\xc1\xc9\x15\x31\xe9\xf0\x64\x03\x71\x79\xc4\x7f\x03\x93\x85\x06\x26\x9a\xd8\x19\x88\x4b\xa3\xd6\x9a\xf2\xe8\x17\xb4\x08\x79\xfc\xd8\x29\xd3\x2d\xdf\x7b\x68\x12\x58\xa0\xf3\x97\x16\x62\xa4\x31\x1d\xf2\x68\xdc\x99\x45\x1c\x52\xaf\xc4\x97\x4e\x36\x08\xef\x23\x46\xfb\x6c\xc4\x97\x15\xf9\x2e\xf6\xdb\x75\x42\x92\x8c\x5d\x66\x5a\x52\xe2\xe5\xb0\x50\xd9\x34\x8a\xe9\x27\x94\x5b\xc8\x49\xc3\xe6\xce\xd8\xd1\xf7\x9d\xc6\x40\x5c\xee\xa4\x13\x1a\x88\x8b\xc6\xa9\x1b\xec\x2f\x30\xa9\x27\x8a\x08\xf5\xb7\x4e\x3a\x11\x49\x66\x6c\x3e\xfe\x3f\x7b\xef\xde\xdd\xc6\x8d\x24\x8a\xff\xef\x4f\x81\xcc\x66\x4d\x32\x26\x29\x52\x96\xfc\x90\xc7\x93\x75\xe4\x64\xe2\xbd\xf1\x38\xc7\x72\x26\x77\x7f\xbe\x3e\x16\xd8\x0d\x92\x88\x9a\x8d\xde\xee\xa6\x44\x25\xf6\x77\xff\x1d\x14\xde\xe8\x07\x9b\x14\x29\x4b\x32\x67\xf7\xc4\x22\x1a\x28\xbc\x0a\x85\x42\x3d\x75\xda\x91\xfb\x47\x53\x76\xee\xe4\x83\x41\x88\x0f\xfb\x25\x09\x98\x4e\x68\xe1\x24\x15\x02\x6f\x81\xb7\x04\x5c\xcd\x62\x19\x49\xcb\x8d\x54\x6a\x67\xfe\x38\x16\xeb\x22\x93\x93\xba\x94\xac\x3f\xc6\x21\xe9\xb4\x6b\xd6\x0c\x0d\xfa\xc3\x7d\x4b\xfd\xd9\xfa\xaf\x19\x09\x29\x46\x6d\x18\xf4\x11\xe2\x03\xeb\xb4\xdc\xe8\x84\x85\xbe\x5b\xb0\x1e\x09\x4e\x39\x0f\xa8\x2b\x5a\x7a\xcf\xd6\xfd\x6f\x35\x07\xb8\x1e\xac\x7b\xf6\xbf\x6a\x75\x43\x12\x67\x56\x42\x93\x3a\x1c\xec\xa1\x61\x3d\x1e\xba\x38\x68\xf0\xfe\xd1\x41\x19\xde\x6b\xac\x1c\xb3\x38\x17\xa6\x99\x85\x23\x9b\x2c\xde\xb1\xb7\x64\xd6\x2e\x7c\x50\x6d\xf8\xa0\x1c\x19\x65\xc4\xe9\x55\x21\xcd\x8c\x9b\x14\xc9\xe4\x55\xf2\x13\x5e\xe1\x88\x4e\xe2\x57\x39\x99\x95\x65\xc3\xfa\x63\x9e\xe5\x74\x7c\x79\xcc\xe2\x5c\x84\xba\xd2\x3c\xb4\xd5\xff\x38\xc2\xf9\xea\xc2\xc9\x5a\x4c\xbf\x02\x9e\x3a\x7d\xf8\x78\xba\xfc\x84\x6c\x12\x93\x5d\xec\x33\x8b\xb5\x86\xe4\x7c\x5b\xab\xe5\xf5\x72\x33\xd7\x6b\xf3\x22\xfe\x6d\x2d\xe7\x2a\x43\xb8\x79\x6b\x0d\x53\x7c\x25\x4e\x78\x61\xad\x4b\x8f\x7e\x8a\x69\xb6\x54\x2f\x52\xbf\x28\x93\x94\x5c\xbe\x7f\x68\x6f\x4a\x61\x0a\x15\x0d\xba\x16\x33\x02\xb7\xaf\x26\xe1\xf0\x2b\x7b\xbf\x6f\x11\x99\x6f\x9d\xf4\xd4\xde\x85\x52\x09\xe1\xd1\x07\xb5\x4e\x16\xc6\x08\x45\x54\x33\x00\x4f\x4a\x00\x94\x5f\x6a\x95\x20\xcc\x44\x97\x2e\x0d\xdc\xd1\x21\x3d\xa7\x21\x49\x4b\x06\xde\x00\xd5\x8b\x4b\xdd\x7f\x31\x1c\x0c\xb6\x8e\xa5\x15\x5b\x7c\x45\xae\xa0\x7a\x75\x6c\xe3\xaa\xe5\x53\x6a\x36\xa9\x35\xa6\x65\x0e\x62\xc5\x91\xf4\xb0\xf6\x08\xfd\xe5\x9c\xbc\x66\xd7\xee\x1a\x84\x71\xc9\x4c\xd6\xbf\xc8\xcb\xe1\x3c\x1e\xd8\x58\x7e\x2d\x38\x56\x50\x94\x56\xee\x81\x58\xea\x46\x97\x76\xfd\x4a\xbb\x97\x6d\xd3\xb5\xbe\x0a\x23\x50\x09\xe9\xe0\xda\xcf\x74\x89\x25\xc0\x92\x15\xdf\xae\x66\x3f\xbc\xb2\x52\x7f\x8c\x47\xa6\x71\x4d\xba\x45\xfd\xc0\x18\x14\xdf\x09\xba\x48\x25\x87\xd4\x4f\x63\x9d\x1c\xf2\xd1\xd2\x7b\xee\xd1\x87\x35\x6f\xa7\xe1\xfe\x07\x77\xf9\xb7\x69\x2b\x20\x25\x15\xfc\xc1\x6c\xa9\x00\x94\x34\xdf\xd1\x06\x68\x1d\xc0\xc6\xec\x02\x02\xf1\x82\x51\x6a\x66\x4b\x9a\xf1\x65\xcd\x01\x2c\x85\xd6\xfa\x0d\x8f\xbe\x94\xea\xaa\xd2\x93\x6f\x67\x8b\xb0\xaa\x2d\xc2\x7a\xa7\xa3\x6c\x06\x4a\x9a\xcf\xf9\x05\x11\xac\x7c\x4a\x40\x74\x88\x62\x8e\x37\xa2\xea\x8f\x14\x8c\x01\x30\x12\x2b\xc1\x77\x43\xc4\x53\x7f\xf9\xe6\xb5\xce\x30\xc6\x78\x05\xdb\x17\x52\x75\xa2\x94\x63\xa0\xda\x41\x34\x43\x18\x9d\x8a\x23\x75\x6a\xcf\x5b\x47\xc8\x5e\xed\x50\x39\x42\xda\x35\xcf\x96\x0d\x63\x33\x08\x6f\x41\x2c\x1a\xde\xf0\x15\xc8\x66\x38\x8a\x48\xaa\x89\x7b\x17\xd1\x90\xe0\x48\x6e\x01\x84\x6a\x83\x90\xf3\x01\x4e\x43\x69\xfa\x6d\xe1\xbd\x14\x4a\x35\x76\xff\xf5\xbc\x92\xc5\xea\xa3\x0b\x1a\x45\x68\x44\xf4\xe5\x66\xc1\xd7\xd7\xdd\xba\x5d\xf8\xfe\xcc\xd2\x29\xb7\xbc\x4b\x74\x2a\x7f\x0b\xcb\xe9\x53\x34\x9b\x67\x39\xc2\x51\xc6\x78\x5d\x0e\xb5\x30\x34\x60\x71\x45\xf5\xf5\x07\xe9\xa4\xc7\x58\xbe\x1c\x57\xe9\x0e\x80\xf3\x43\x33\x8e\x98\x70\xfa\x96\x59\x3d\xe4\x5e\x70\x72\x47\xe3\x89\xe9\x13\xf8\x85\xc6\x3d\xf1\x73\xf6\xdb\xdb\x5f\xf8\xc9\x8c\x68\x7c\xc6\xff\x95\x84\x46\xef\x36\xcd\x10\xe4\x32\xd0\x8b\xfe\x6a\x8c\x74\x34\x5e\x1c\xa3\x53\x7c\xaa\xcf\xb2\x5a\x0a\xa0\x0a\x38\x2b\x23\x0a\x7c\x8c\xd3\x94\x8c\xaf\xe2\x1d\x6f\xe3\x21\x5f\x1b\xc1\xc9\x15\xd7\x42\x09\x0e\x1a\x2f\x87\x4f\xe3\xf9\x99\x6c\x92\x4f\xd8\xe8\xc4\x84\xaa\xcc\x37\xcb\xb2\x5c\x8f\x74\xb8\xa7\x2f\x6f\xaa\x05\xd4\x40\x7f\x82\x5f\x96\x24\x17\x70\xd9\x7c\x95\x05\x5e\x05\xeb\x38\xf9\x55\xad\x4f\x5a\x20\x8d\x47\xba\xd6\x18\x8f\xb4\x9b\xb2\xd8\x3e\xed\x08\x0c\x3f\xaf\xcf\x9e\xac\x8b\x5a\x30\x77\xdf\x16\xa4\x38\x0f\x5e\x3a\xc6\x23\x70\x74\x84\x41\x3a\xb6\x68\xe3\x08\xe7\xe8\x39\xfa\x46\x4e\xe7\xfe\x7d\xf4\xcd\x18\x8f\x9e\xad\x64\xa9\xb6\x19\x77\x43\x61\xd5\x06\xa1\x9c\xd7\x6b\x2f\x76\x40\x6d\xcc\xa7\x4f\x7c\xe7\xd6\x03\xc5\xb7\x79\xfd\xd6\xb6\xac\x50\x59\xd1\x3d\xf7\xac\xe8\xd6\x19\x94\xd1\x25\x74\xc5\xb6\xdd\xbf\x6f\x43\x57\x0c\xd1\xfa\xd0\xc5\x3b\xbe\x14\xb8\x64\xb1\xd6\x87\xad\xde\xa1\xa5\xd0\x35\xdb\x76\x95\x9d\xd7\x6b\xf3\xcd\xc6\x17\xc7\x16\x73\x94\xc3\xbf\xd2\xfa\xb8\x6f\xfa\xf2\x0e\xae\xb8\x44\x82\x4e\x0a\xe2\xb9\x26\x04\x45\x4b\x35\x99\x6d\xe2\xb3\xdb\xdc\x34\xd4\xb6\xea\x70\x7d\x54\x97\xa4\x9c\x29\x35\x17\xf5\x6e\x84\x23\xe4\x5f\x05\x63\x9b\xa5\xfa\xa6\x9a\xfa\x7b\x52\xc6\x63\xaf\x33\x92\xf5\xbd\x1a\x52\x0c\xe2\x98\xa5\x36\x72\x81\x75\xdd\x5f\x8b\x66\xb0\x24\xeb\x83\x3a\xd3\x08\x7c\x2d\x6b\x57\xe1\x90\x2a\x6c\x5e\xc5\x42\xde\x64\xab\xd7\xf5\x5e\x74\x5e\x57\xcb\x9f\x05\x7e\x83\x26\x7c\xbe\xd7\x66\x19\x63\x5a\xde\x45\x53\x7e\xdd\x6b\xdd\x80\xf3\x2b\xef\x6f\xf5\xae\x1a\xf0\x88\x37\xc5\xa0\xf8\xce\xc8\x81\xbe\x36\x6b\xe6\xf5\x4e\x79\xf3\x41\x48\x19\x4a\xab\x7b\xe7\x84\x28\x4d\xd7\x40\xbd\x00\x6a\xce\x7d\x63\x50\xe6\x0d\xb1\x39\x68\xee\x2b\x64\x73\x70\x37\x09\x52\x3c\x8d\x36\x00\x68\x9a\x92\xf1\xa6\x4e\x98\x7c\xa8\x6d\x64\x5c\x1c\xbb\x1a\x8c\xcb\x76\x17\x90\x1c\x44\x8d\xc3\x80\x3e\xdb\xe6\x22\xd6\x41\xbc\xcc\x3d\xab\x8b\xe0\x1a\xf5\x2b\x38\xb7\xa4\xfe\xa8\x2e\x41\xbf\x76\xa1\xa2\xb8\xc2\x5a\x42\xac\x22\x3c\x17\xae\xea\xa1\x20\xe6\x0d\x3e\x0a\xe2\xcf\x2d\x79\x29\x5c\x2d\xeb\xde\x96\xe2\xfa\x1e\xe3\x34\xac\x32\xea\x3f\x04\xa3\xf0\x25\x1d\x59\x04\x9f\xf7\x42\xe2\xf9\x4c\xa4\xb6\x32\x89\x1d\x27\x24\x3f\x72\x82\xa3\xb7\xbd\x70\xe8\x55\xc6\xdc\x7c\x70\x1d\xb5\x79\x56\x56\x23\x3d\x72\x69\x87\x57\x65\x37\x2f\x92\x09\x2d\x9b\x80\x05\x68\x5b\x93\x90\xe0\x6b\xe7\x22\x5c\xbf\xab\xec\xf3\x0f\x0f\x1f\x37\x9d\x8b\x04\xb4\xad\xb9\x48\xf0\xb5\x73\x79\x0d\xca\xf1\xaa\x99\x34\xde\x15\x00\xb3\xad\x79\x00\xf0\xda\x59\xfc\x4c\x70\x58\x99\xe7\xf0\x10\xf2\x30\x36\x9a\x86\x80\xb3\xad\x79\x08\xe8\x65\x13\xd9\xba\xf7\x83\x47\xe0\xae\x96\xbc\xf3\x4b\xbb\x61\x7d\x29\x57\xab\xad\x7a\x37\xdd\x28\x3f\xae\xad\x78\x4f\xfd\x8a\x93\xea\x33\x7a\xe0\x56\xab\x83\x0a\x15\xae\xe7\xd4\x94\x3b\x9b\xc1\x00\xae\x6e\xdc\xb1\x95\x18\xcf\xa0\xa2\xdd\x84\x0e\xcb\x53\x41\x71\xfa\xe5\x2b\xa0\xb6\xa2\x62\xf1\x74\x20\x8d\x04\x94\x12\x67\xb4\x58\xb2\xda\x77\x9d\x44\xe4\x5c\xba\xa0\xc8\xd1\x7f\x8f\x9e\xa0\x23\xb4\x6f\x44\x82\x42\x48\xc7\xe7\xbb\x9e\x88\xae\xde\xed\x7f\x2d\x31\x52\x53\xcc\xb8\xf7\xb9\xe9\xdb\x44\x3e\x24\x60\x96\x25\xcf\x08\x87\xc9\xaf\x60\xdd\x79\xdb\xed\xb0\xdf\x9b\x4c\xd1\xbc\x73\x12\xfe\xda\x6e\xae\x5d\x4c\xb2\x26\x2e\xc0\x30\xab\x9f\x6b\x03\x93\x3d\x7e\xf2\x75\x3b\xe6\x56\x7b\xbd\x02\x89\xb4\x82\x8e\x69\x83\xd7\x7d\x6d\xa0\x2b\x5d\xd6\xc6\x11\x51\x3e\x76\x8e\xb7\x9a\xc8\x07\x20\xbf\x68\x2b\xdb\xd6\x7e\xb2\x40\x07\xc9\xa2\x75\x4f\x5a\xea\x0a\xb3\x9c\x13\xe1\xb6\xa7\x7a\x9b\xe1\x74\x42\xe3\x23\xd4\x1a\xe8\xba\xab\xda\xbd\x36\x35\x36\xf5\x2c\xe8\x76\xe1\xa7\x6e\x8c\xc9\x67\x19\xdb\x27\x2d\xf3\x50\xc8\x50\xcc\x72\x91\xe4\x90\xa3\x16\x2f\xc5\x91\xc4\x9b\x82\x21\xd9\x0b\x17\xc7\x56\x63\x09\xa5\x88\xc1\xe7\x0c\xcb\x40\xfb\xa6\x3c\xce\x47\x5f\x65\x7a\x65\xfb\xa5\x6a\xdb\xa5\x75\x19\xd3\xb2\x61\x83\x6e\x64\x99\x4d\xd0\x4a\xac\x2c\x0c\xb2\x15\xd2\xf3\x15\xa2\x30\x35\x08\xaf\x0d\xb6\x3b\xba\x49\xc7\x57\x80\x97\xee\xd7\xf7\x66\x37\x8e\xac\xd4\xb2\x3f\xab\xf0\x54\x11\x8b\x89\xca\x88\xc9\x57\x50\xeb\xde\x3b\x56\x02\x58\x35\x02\x87\x92\x19\x5d\xb8\x85\x43\x5f\x46\x21\xbe\xf2\x21\xb8\x29\x6a\xd7\x5d\x1c\xa7\x6a\xfd\x93\x7f\x46\xeb\xb5\x34\xb6\x66\xc5\xc6\xc7\x92\x77\x51\x39\xb6\xd4\xbd\x92\x56\x53\x70\xd8\x42\x61\xf4\xb9\xd3\xb6\xa5\xb8\xdb\x79\x6b\x3d\xd9\xbd\xb5\x76\x6f\xad\xaf\xf9\xad\x85\xd3\x58\x66\xfb\x28\x1b\xfa\x81\x5f\xb1\xf6\x99\x25\xaa\x5c\xd7\x3b\xee\x26\xbd\xcc\x6e\x66\x74\x22\xff\x9d\x66\xfc\x3c\x45\x04\x93\x56\x00\x7e\xa8\x5d\xef\xe3\x5b\x92\x10\x2c\xa2\x47\xf7\x52\xf8\xbb\x50\xe5\x57\xa6\x02\xee\xa8\xa7\x9c\x7a\xb2\xf1\xfe\x40\x61\xa5\x3a\x75\x82\x9a\x38\x8f\x35\x70\x4c\xd5\x62\x65\x48\x7e\xdc\x3a\xa7\x21\x61\x60\x7c\x33\x0f\x29\xfc\x91\xd0\x20\x9f\xa7\x60\x26\x4e\xc7\xa9\x34\x32\xa7\xb3\x49\xeb\xc3\x06\xde\x7c\xb7\xf2\xe9\x33\xc3\x13\xc2\x87\x25\xdc\x63\xf8\x4b\x5b\x38\x86\x60\x6b\x83\x10\xe5\xb5\x5c\x97\xb1\x53\x28\x3b\x45\x2c\x45\xa7\x59\x1a\x9c\xc2\x0b\x41\xb8\xf7\x8c\x08\xca\x12\x12\xd0\x31\xd5\x1e\x29\xff\x62\xb9\xcc\xca\x1d\x48\xef\x28\x5e\x51\xd4\xba\x94\x4f\x7e\xc1\x44\x5f\xd0\x8c\x88\xb0\xcd\x30\x32\x90\xbe\xf3\x07\xd8\x88\xa0\x73\x91\x72\xc6\x2c\x1b\x54\x59\x69\xba\x2f\x62\x84\x23\x8a\x33\xf0\xc6\x52\x53\x48\xe4\xb5\x23\xc7\xfa\xe2\x1c\xd3\x48\xe4\x4e\x8f\xa3\x4b\x91\x97\x5f\xb8\x3d\xfb\x5b\x87\x5e\x7b\xc5\x47\xe8\x14\x70\xee\xb4\x8b\x4e\x01\xe7\xf8\x1f\x12\xe7\xf8\x9f\x02\xe7\xe0\xaf\xd9\xc4\xf2\x91\xcb\xd2\x60\xa5\x69\xf8\x7b\x2f\x73\xba\xac\x80\x3d\x46\x01\xc3\x57\x42\xa4\xf1\xe2\xa4\xdb\xda\xe9\x3b\xee\xbc\x57\xf2\x00\x87\xed\x6c\xe4\x19\x74\xe5\x87\xb3\xc0\x6e\xf5\x19\x7e\xa9\x4f\x82\x62\xa8\x4f\xf0\x4b\x7f\x4a\x03\xf3\x21\x0d\x54\xb1\xde\x4c\xd7\xd1\x48\x95\x5e\xd9\x51\xa7\xc2\x39\x07\x46\xcd\xff\x80\x31\xc2\x1f\x69\xd0\x72\xcc\x15\xd5\x73\x7d\x25\x85\x8f\xe2\x0e\xcc\x50\x7e\x60\x2c\x22\x38\x6e\x8b\x55\xfb\xf4\x89\x2f\x44\xa7\x8b\x5a\xaf\x55\xd4\xe8\xdf\x5e\x1d\x21\x52\x43\x98\xf8\xf1\x2e\x21\x4e\x2d\xfe\x54\x51\x59\xed\x55\xa2\xfb\xec\xb5\x73\x95\xa0\xe7\xfe\xdd\xd2\xa7\x71\x48\x16\x6f\xc6\x6d\x67\xdd\x3b\x30\x9f\xde\x50\xbb\x13\xf1\x8f\x19\x09\x4f\xe4\x76\x7e\x53\x00\x7c\xff\xbe\x44\x83\xef\xab\x25\x13\x86\x08\xbf\x12\xc4\xae\x35\x4f\xa3\x76\x0b\x3d\x90\x4d\x1f\xa0\x56\x07\x22\x43\xc3\x1e\xf0\xe9\xc0\x1f\xfe\x20\x9a\x25\x10\xdb\xa4\x6f\x53\x61\xba\x6b\xba\x8b\x28\x0e\xa0\x5b\xd8\x98\x6a\x97\x8c\x15\xdc\x31\x9c\x2d\xac\xd6\x75\xde\xf3\x9d\x2f\xfc\x75\x15\x67\x4c\xd2\x61\x67\xeb\xe5\x17\x4e\xe1\x0b\x18\xf0\x3d\xb2\x31\x1a\x1d\x99\x27\xd7\x3d\x54\xa6\x44\x85\xe6\x5f\xca\xd9\xe1\x66\xdc\x04\x6b\x59\xc8\x57\xb4\x6f\x6c\x28\xbf\xdd\x9b\xe8\x2e\x9a\xcd\xab\xbb\x61\x23\xc0\xc4\xb5\xb2\x19\x50\xf2\xaa\xda\xcc\xaa\xdd\x6d\xb3\x7c\x5f\x96\x27\xa8\x4f\xa9\xa1\xb4\xa6\x0d\x20\x6d\xdf\x98\xf8\x4e\x58\x42\x2a\xe1\x9d\x30\x5d\xdc\x8e\xe8\xee\xe9\x4e\x74\xb7\x13\xdd\x5d\x45\x74\x57\x61\xde\x66\x99\x41\xdf\x7a\xe9\xde\x35\x58\x52\xbc\xd3\x71\x6e\xab\xd0\x66\x50\x52\xb7\xae\x13\x53\x6b\x75\x13\x7a\xbf\x76\x5d\x3f\xb6\xbd\xfb\x0d\x93\x27\xde\x14\x4b\x8f\xf5\x52\xd0\x95\xda\x7f\x94\x5b\x80\xd8\x51\xd9\xf0\x39\xce\xb1\x95\x66\x8d\x37\x06\x33\x8f\x01\xc2\xf3\x9c\x99\x58\xcd\xa0\xc8\x7f\x2b\x6c\x4e\xca\x23\x8c\xdb\x60\x03\x15\x02\xd9\x83\x3b\x44\x43\x01\xd7\xae\x9c\xd3\x9c\x3f\x07\x54\xac\xc6\x6c\x3e\x9a\x82\xd5\x3a\x2f\x5a\x2b\xc4\x5a\xa5\xa9\xc9\x0b\x98\xad\x0e\xf3\x04\xee\x2d\xc2\x42\xde\xc8\x72\xd4\x8a\xdc\x62\xdd\xea\xed\x37\x35\x69\x66\x17\x64\x61\xca\x9d\xd9\xad\x92\x99\x03\x9a\xbe\xe3\x87\xc4\x4c\x5d\x9e\x99\x5b\x3c\xed\x12\xc1\xa2\x38\x8a\xbe\x64\x51\x1c\x48\x2d\xaf\x13\x3f\x37\x1b\x5b\x48\x23\x92\x11\x1b\xaa\x12\x9d\xf0\x80\x2f\xb8\xfe\x0c\xbf\xae\x2a\x30\x14\x33\xa9\x8b\xeb\xa3\x47\xc1\x7f\x40\x9f\x6b\x24\x8d\xab\x30\xc8\x31\x01\x39\xf6\xf6\xd0\x8b\xf0\x8f\x79\x96\xcf\x40\x25\x04\xfa\x87\x90\x24\x9c\x54\x30\x11\x41\x2b\x49\x49\x46\xe2\x00\x72\x45\xe2\x58\xee\x88\x1c\x04\x0c\x4b\x2a\xe1\xe4\x56\x7d\x8f\x5a\x23\x16\x5e\xee\xb7\xd0\x11\x6a\xf1\x09\x44\x34\x26\x2d\x25\x6c\xd3\x93\xaa\x69\xc4\xff\x1a\xb6\x56\x0d\x17\x62\xf3\x20\xcd\xe2\x85\x54\x25\x93\x77\x2c\x95\xe4\x00\xef\xdf\x6f\x18\xb4\xc3\x58\x52\x55\xc4\xec\x90\x00\x75\xd0\x0e\xbd\x9e\x08\xad\x14\x1d\x64\x69\x47\x8a\x90\xe8\x9e\x1a\x26\xde\xb7\x99\x46\x77\x21\x45\x57\xc2\xcf\x56\xef\x7c\xd7\x79\xda\xca\xf4\xfa\x25\xc3\x11\x67\xc8\x0a\x4e\x0d\x05\xf2\x57\x67\xb3\x63\xd4\x7f\x29\xaf\x60\x07\xed\xec\x80\xd6\xc5\xb1\x3b\x1f\x85\x73\xb3\x8e\xc7\xeb\x7e\x2d\xce\x51\x77\xa3\xab\x59\xf3\xf5\x3f\x76\xbc\x30\x2d\x86\x08\x7e\x19\xe9\xe5\x1d\xe0\x7d\xee\x8c\x68\xd0\xa6\xfd\xb7\x78\x3f\x1a\x87\x24\x80\xdb\xed\xb6\x4f\xd5\x96\x05\x6e\x42\xb2\x27\x9d\x83\x95\x68\x4f\x7a\xf3\x6e\x45\xb6\xf7\x68\x70\xc7\x65\x7b\x5b\x95\xb4\x7d\xe5\x49\x18\xef\x84\x59\xde\x35\x08\xee\xa6\xb5\xde\x4f\xfb\x07\x5f\xb7\x4c\xec\x56\x1b\xfe\x5d\x55\x6c\x37\x8a\x58\x70\xe6\xc9\xdb\x8e\xd0\xc0\x16\x94\xc9\xca\x07\x25\x79\xd0\xd4\x27\xa7\xe2\xc3\xea\x8a\x0f\x9d\x8a\xfb\xd5\x15\x5d\xf7\xb2\x61\x75\xc5\x61\x57\xfa\xa5\x89\xe7\x5e\x49\x45\xf5\xc9\x91\xfa\x15\x6a\x59\x4f\x6b\xc9\x02\x59\xe9\xe6\xac\x7a\xe6\xa3\x34\x94\xe4\x8f\xc7\x92\x7a\x50\x6e\xaa\x94\xcd\x00\xca\xa5\xe0\x12\x27\x4e\x0e\x42\x53\x49\x7e\x91\x90\x20\x14\x50\x19\x28\x91\x42\xd2\x78\xdf\xfd\x42\xc6\xd6\x76\xe7\x64\x91\xbf\xe0\xc5\x47\xa8\x15\x91\xb1\x9b\x1e\x0a\xea\x1f\x83\x8c\xb6\xbc\x45\x99\xfc\x96\x7f\x92\x62\xd9\xb2\x26\x29\xff\x54\x6c\xf1\xdf\x22\x53\x5d\x79\x1b\x99\xc6\xce\x69\x15\xb3\xdf\x53\x9c\x98\xfa\xec\x9c\xa4\xe3\x88\x5d\xf0\x07\xbe\xc8\xbf\xde\xb5\x20\xbd\x31\x5f\x49\x14\xd1\x24\xa3\x99\xfe\x7e\x31\xa5\x39\x39\x49\x70\x40\xc0\xda\xf5\x22\xc5\x89\xd3\xd3\x64\x9e\xe7\x24\xfd\x81\xe5\x39\x9b\x99\xfe\xc4\x79\x50\xa5\xad\x41\xff\xe1\x21\x99\x39\xed\x12\x9c\x62\xd8\x84\xaa\x46\x4d\xa4\xd6\xab\x66\xf4\x82\x6f\xab\x67\xf3\x2b\x80\x38\x51\xcf\xcb\x25\x40\x20\x29\x93\x7e\x8b\x16\xc0\xac\x9a\x2a\xef\x60\x30\x28\xc0\xf8\x31\x4d\x59\xba\x04\x04\x64\x17\xb7\x9a\xaf\x25\xa5\xaf\xa1\xdf\x76\xc4\x40\x49\xd8\x64\x20\x6b\xa0\x5d\xd6\xdf\xfb\xd6\xdf\x43\xfe\xb7\x16\x37\x59\x6f\x8a\x96\xa1\x15\x22\x01\x69\x28\xda\x09\x29\x13\x7f\xbc\x89\xb3\x0d\x65\x22\xde\xd7\x55\x52\xa9\x60\x71\x8e\x96\x4c\xcc\x8a\x7f\x08\x94\xa0\x6b\x3c\x74\xd5\xb1\xed\x9a\xb3\x28\x72\x4d\xdd\x09\xcf\xaf\xbb\xa2\x9d\xd8\x72\xe6\x90\x1f\x2e\x75\xe2\x90\x0b\x82\x66\x38\x11\xb9\x54\xf8\xa1\xc9\x19\xc2\x68\xc2\x58\xa8\x6b\x28\xac\x2f\xf5\x9e\xbe\x21\x26\x69\x5b\xcf\x2c\xf2\x65\x53\xd2\x94\xc7\x33\xb5\xe4\x86\x76\x70\x53\x20\xa0\x2d\x2b\x3e\x9e\x9f\x9c\xc6\xf3\xb5\xe6\x74\x5f\x18\xf9\x0b\x0f\x6b\x34\x82\x4b\xad\xe0\x5f\xed\x5e\x9e\x35\x3e\x88\x6e\x6f\xbf\x13\x84\x53\x82\xc8\x2c\xa1\x29\x0d\x70\x14\x5d\x72\x84\x4b\xf4\x6a\xf1\xdd\xd3\xf6\xc1\x80\x7d\x29\x8e\x27\xa0\x0e\x08\xe9\x78\x4c\x52\x8e\xc5\x36\x46\xf3\x16\x12\x8f\x7f\x62\x29\xa2\x71\x96\xe3\x38\x20\x5d\x34\x1d\xf2\xf6\xd3\x47\x7d\x3e\xc3\x4b\x36\x47\x17\x34\x9b\xc2\x09\x9f\x02\x44\xb9\x0b\xd0\x77\x17\x2a\x04\x38\xe6\x7d\x9f\xd3\x90\xf0\xdf\x29\x62\x17\xb1\x72\x41\x88\x72\x92\xc6\x38\xa7\xe7\x24\xba\x34\xb5\xe7\xd2\x35\xe2\x54\xef\xbf\xef\xbc\x00\xb9\x3b\xe4\x91\x79\x2d\x3a\x5b\x82\x9c\x7f\x7d\x6e\xba\x41\x31\xcb\x11\x67\x6a\xba\x9c\x49\x84\x99\x13\x2c\xc3\x23\xe5\xe9\x3c\x0e\x30\x47\x38\x9a\x4f\x11\x8e\x91\x62\x8e\xcc\xa8\x14\x9f\xd5\x78\xeb\xd6\x44\x14\x8b\x5b\x6a\xdc\xd5\x0b\xa0\xc7\x99\x75\x80\x0c\xe3\x2b\x5f\x3d\x96\x82\xb2\x2e\x9a\xf4\x17\xbf\xdc\x3d\xe5\xa3\x51\x25\x34\x71\x6b\x80\xfb\xdd\xe8\x23\xf9\xaf\x4d\xa7\x3a\x69\xe4\xa8\x50\x93\x11\xc5\xa6\x03\xba\x86\x5d\x68\xf2\xe6\x39\xa7\x40\xd7\xf5\xca\x55\x75\x81\x9e\xba\x96\xf8\xa9\x3e\x6a\x9c\xd2\xdf\x75\x89\x7e\x1c\x08\x9e\x4f\x2a\x51\x2d\x45\xcc\xda\x3a\x54\xbe\xfa\xf5\xa9\x51\x8c\xf1\xa9\xc9\x93\x62\x2f\x85\x8d\x58\x72\xba\xbc\x48\xcc\x0d\xc8\xb9\x9a\x45\x4b\x85\xce\xdd\x88\x12\x96\x64\xef\x39\xb0\x0f\x5d\xb4\x11\x87\x82\xf7\x72\x76\xe8\x81\x68\x3c\x55\x31\x13\x70\x42\x73\x1c\xd1\x3f\xc9\x4f\x34\xcd\xf2\x5f\xf8\x8d\x97\x76\xda\x50\xb9\xf3\x41\x25\x23\xf9\x86\xdf\xef\xea\x32\x5a\xcf\x07\x41\x22\x83\xc4\x91\xf5\x60\x38\x28\xea\x60\xf1\x7a\xf0\x0c\x02\x1a\xec\x5c\x0b\x92\xc2\xb4\x86\xab\x0b\x95\xf9\xea\x0a\x5a\xf1\x8d\x97\xea\x65\x69\x8e\x0c\x8e\x58\xb6\x6b\x8d\x4b\x11\x3e\x7d\x42\x6d\x73\xd8\xbe\x47\xad\xa4\x85\x8e\xfc\xa3\x2c\x90\xab\xc3\x2b\x0b\xb5\xe6\x1a\xde\x1e\x35\x51\xed\xea\x15\xe7\x42\x9d\x69\xc8\xea\x97\x51\x67\xae\x7c\xc5\xaf\x92\x11\xe1\x8b\xdf\x61\xbe\xee\x76\xf7\xea\xfc\x2a\xf4\xc2\x77\xdc\x9b\x62\x93\xd9\x26\xae\xfa\x24\x6b\x3a\x1c\x8f\x9b\xd8\x44\xe2\x80\x02\x3f\xb2\x8c\x74\x35\x85\xac\xd9\x9a\x0d\x8c\xd2\x66\x8c\xb6\x9e\x95\xe0\x8b\xd3\x5b\x4f\xbd\x6f\x5d\x6e\x25\xbe\x3e\x92\x1a\x1b\x14\xac\x48\x94\xe0\x3e\xd8\x75\x22\x83\xc2\xcd\xf5\x97\xa7\x00\x6a\x4d\x87\x2d\x5f\xd7\x53\x28\xdb\x2f\x29\x1b\xda\x65\x46\x59\x63\xca\xa4\x5e\xa6\x35\xdd\x6f\x15\xb5\x30\xad\xe9\xc3\x96\xa3\x6e\x69\xe1\x8c\x86\xa4\xe5\xe8\x57\x5a\x89\x8e\x4c\xa1\x9e\xb3\x7a\x62\xd6\xbb\xb3\x90\xb5\x01\x16\x7f\x23\x4e\x51\x66\x6f\xc0\x74\xc2\x71\x6e\xd8\x86\xe9\xc4\xf0\x46\x26\x6f\x98\x92\xe0\x6c\xc4\x16\x55\x06\x01\x8f\xf6\xbf\x74\x02\x07\x39\xc0\x1b\x10\x9d\xfe\xd1\xfe\x1d\x37\x7e\xd9\x39\xb6\xdd\x5e\xe3\x97\xeb\x30\x4c\x39\xb9\xa0\x79\x30\xfd\x01\x67\x95\x26\x15\x4f\x1e\x96\x54\xae\xeb\xc5\xd4\xd2\x0d\x5f\xc5\x21\xc9\x49\x3a\xa3\x31\xce\x09\x1c\xff\x1f\xaa\xe9\xd3\xe3\x41\x7d\xbb\xba\xbe\x4b\x1b\x7c\xdd\xc6\x35\x57\xb7\x5c\xd1\xb3\x5d\x57\x45\xcd\xf7\x81\x84\x6b\xea\xc9\x4d\x0a\xa9\xda\xe6\x22\xe8\xa7\x4e\x4d\x5a\xa6\x9f\x76\x70\x1d\x18\x0b\x0b\xa1\x0d\x63\x71\x05\x0d\x70\x65\xc8\x5c\x2d\xd2\xa1\x99\x5a\x0e\x3b\xcc\xb1\x5c\x9f\x3a\x0e\x98\xf7\xda\x7e\x5f\x27\xb3\xaf\x7f\x66\xfa\x8a\xa6\x77\x53\x82\x68\xc0\x62\x94\x33\xc5\x22\x9a\xcc\xe9\xd5\xe3\xe5\x33\xd3\x4a\x4d\x9a\x29\x0d\x4d\xd8\x45\xb4\x98\x3d\x1d\xa3\x31\x8b\x73\x14\xd1\x09\xce\xe7\x29\x29\xcc\xf8\x55\xc0\x6e\xb7\x70\xe1\xf6\xab\xb4\x7d\x28\xf2\x14\x1c\x2f\x41\xc9\xa5\xfa\xa8\x0c\x4e\x96\xc6\x08\x75\x2c\x0b\x11\xa1\xaf\xd0\x45\x2a\xb2\xb6\x93\xf1\x98\x04\xf9\xf2\x9e\x1a\x24\x46\x5d\xf7\x84\xcc\xe3\x2d\x9c\x11\x7a\xb7\x0e\x47\x25\x45\xc4\x49\x42\x70\x9a\x21\x6a\x5f\xdd\xd6\x32\xd8\xc5\x5b\xd9\xbd\x92\x8e\x37\xb4\x83\x36\xe0\x3b\x46\xeb\x0c\x3f\x6c\xd3\x36\xd0\xbe\xd3\x38\x99\xe7\xa7\xca\x24\xc0\x5e\x8e\x44\xf0\xd1\xab\xd1\xb9\xdf\x32\x69\x1d\x60\x1b\x22\x24\x38\xe3\x0b\x9f\x92\x31\x44\x4c\x1c\xe1\xe0\x4c\xf5\x2f\xec\x02\x44\x6f\x65\x66\x31\xf0\xe1\x2d\x19\x57\x0e\x82\xaf\xb5\x1c\x42\x39\x8d\x8c\x57\x25\xb2\xc7\x6a\x88\x63\x88\xab\xa4\xd1\x30\xcb\x71\x4e\xc4\x15\x8b\xe3\x89\x22\x1f\xb2\xd3\x04\xa7\x78\x86\xfe\x12\x4b\xf2\x19\x91\x73\x8e\xae\x1c\xab\xc5\x5f\x19\x9b\xa7\xc2\x31\x53\xc4\xe4\x17\x3d\xb8\x6d\x47\x22\x2e\xdc\x67\x75\xdf\x42\xf3\x53\xf9\xe3\x54\xbc\x26\x15\x04\x41\xb0\xf5\x1c\x59\x7c\x0c\x63\x6a\xb2\x4a\x15\xcb\x94\xe3\x11\x67\xc7\x17\x57\xe0\x6b\xe2\xf9\x6c\x44\xd2\x35\x38\x1b\x67\x6a\x25\x48\x20\x1f\xd2\xb5\x70\x7d\x47\x65\x29\xb5\xf0\x2d\x05\x2c\x5e\xc6\xca\x24\xa0\xcb\x74\x44\x43\xfb\x3b\xb5\x3f\xd8\x54\xc2\xd4\xb0\x4b\x4b\xab\x3a\x1d\x16\xbe\x5c\x39\xa8\xa1\x99\x01\xc4\x32\x54\xff\xda\xfd\x14\x0a\xa0\xf6\x4a\x29\x08\x0c\x03\xbe\x2c\xb8\x9c\xcd\x31\xba\x4b\xf6\x7d\xc9\xba\x1c\xa1\xc2\x16\xd0\xc6\x4d\x79\xcd\x92\x00\x73\x72\xff\xbf\x50\x7c\xb9\xeb\x7a\x23\xdc\x1d\xe6\xfc\xce\x68\xfe\x5c\x9e\xfc\x06\xe7\xf8\xde\x64\x2e\x6e\x49\x71\x6e\x31\xfe\x35\x9e\xa9\x47\x53\x37\xb1\x78\x05\xaa\xfc\x95\xac\xa4\xe2\x30\x37\x75\x96\x15\xb3\x58\x0d\x8f\x2f\x4f\x63\x1d\xec\x06\x89\x82\x62\xd0\x36\x33\x32\xc5\xab\x2d\x51\xc3\x6e\x82\x59\x6b\x3a\x24\x60\xd1\x56\x4c\x56\xaf\xef\xe8\x12\xcd\xac\xf7\x90\xd4\x5a\xc8\x92\x57\xda\x92\x0c\xa0\xe5\x52\x69\x93\x11\x34\x9e\x47\x51\x67\x33\x41\x1e\xe5\x7c\x84\x23\xb8\x52\x9b\x6d\x47\x97\xf9\xf0\x8e\x6b\xc2\x76\x6e\xe0\xdb\xd5\x84\xa1\xbd\x3d\x84\x2e\x08\x3e\xab\x8a\xf5\xf8\x03\x18\x54\x70\x5e\x7f\xe7\x31\xbe\x5c\x31\x67\x56\xab\x0a\x61\x0f\x4b\xea\xd6\x75\x62\x6a\xad\xe4\x96\x2e\x14\x71\xe2\xb1\x59\x56\xeb\xa9\x5b\xab\x56\x3b\x17\xb0\x98\x57\x2e\xed\xec\x70\x97\x2f\xb4\x89\x52\x8f\x1f\xb3\x1f\xe3\x6c\x9e\x12\x74\x7c\x72\xa2\x82\xf5\x07\x34\xbf\xbc\xb7\x1d\x4f\xf5\x12\x47\x64\x25\x5c\xa8\x0a\x1a\x39\x66\x71\x2e\xb2\xde\x14\xfc\xa4\x93\xc5\x3b\xf6\x96\xcc\x38\x6e\x69\xc7\x60\x91\xb4\xa6\xd4\x4d\xf7\x91\xf1\x57\xa8\x09\x41\xf9\xc8\x78\x22\xc8\xec\xa6\x03\x55\x32\x62\x69\x48\xd2\xb7\x38\xa4\xf3\xec\x08\xb5\x0e\x07\xff\xd9\xea\x36\x50\x23\xf2\x7f\xce\xb5\xdc\x25\x4f\x71\xac\x72\xf0\xc8\x19\xe9\x92\x4c\x72\x07\xed\x96\xc9\x45\xd0\x53\x76\x8a\x26\x1a\x55\x38\x4f\x71\x15\x00\xf5\xad\x9f\x4d\x59\x9a\x93\x2c\x97\xad\x3e\x77\xae\xec\xe8\xbb\x5f\xe2\xe8\x7b\xcc\xe2\x3c\xc5\xd9\x32\x28\x13\x92\xab\x9a\xef\xc8\x22\x6f\x57\x6b\x6b\x8b\xc3\xdc\x80\x67\xf4\x4a\xee\xd8\x57\xd1\x11\x0b\x08\x11\x3f\xa0\xa6\xb9\x93\x48\x49\xa1\x41\x93\x50\xab\xb6\xdd\x1f\xff\x9f\xb4\xa8\x3e\x56\x71\x51\x4b\x87\x2f\x44\x53\x85\xbe\xc9\xac\xe5\xa3\x3f\x14\xda\x4d\xcf\xc8\xe5\x88\xe1\x34\xfc\x89\x05\xf3\xcc\x5e\x00\x83\x8d\xc7\x95\xda\xfa\x90\x9e\x53\x15\x94\x6c\x83\x11\x57\xd7\x94\xd8\x0b\x83\xcb\x32\x69\xad\xf8\xd2\x50\x66\xef\xeb\x7f\x1c\x3d\xc4\x6a\x8a\x9d\x58\x40\xa8\x54\x62\xdf\x01\xf3\xf8\xdb\xaf\xc1\xfe\xb2\xde\xbf\xc6\x4c\xb2\xc2\xea\x3c\x90\x34\xd4\x32\x3a\x5f\xe2\xf3\x2b\xcf\xc1\x35\xa8\xce\x37\xaf\x33\x5f\xf5\xe8\x83\xdb\x7c\xc9\x89\xe7\xe5\xcb\xce\xbb\xd0\xcf\x40\xd7\xdf\xa1\xb7\x64\x4c\x52\x05\xf5\x3d\x67\x34\xb3\x0f\xed\x3d\x40\xdd\x3d\x7e\x88\xb3\x0e\xca\x88\xe0\x7e\x24\x9a\x84\x2c\x98\x73\xc2\x00\x57\x2f\x07\x91\x92\x09\x4e\x43\x85\x2b\x58\xa7\x39\x03\x1a\xc0\x12\x71\x57\xdf\xe3\xe3\xd3\x8c\x14\xef\x47\xb0\xd5\x4d\xfc\x47\x35\x19\xd3\x6a\x1b\x5d\xa2\x79\x92\xed\xe7\xa4\xae\xf1\x1e\x55\x78\xe0\xa7\xcf\x0e\x55\x05\xb9\x2d\xfa\xbb\xfc\x7d\x55\x65\x93\x5e\x86\x46\x39\xae\x6d\x7f\x4e\x4b\x8c\xdd\x92\x83\x59\x23\x07\xb6\xfd\x80\x6a\x16\x3f\xd6\x5f\xee\xe6\x89\xb1\xef\x86\xcf\xa7\x46\x0c\x8d\x33\x35\xe9\xa6\x34\xe6\xc1\xeb\x41\xd1\x14\x65\x46\x5e\xc2\xc5\x1c\x17\xc3\xab\x7a\x35\x7c\x8c\x3d\x42\x1e\x53\x27\x70\xd1\x70\xe0\x9a\xa0\x14\x8e\x5c\xca\x4b\xe5\x67\xd1\x78\xa5\x58\xbc\x4e\xe4\xd8\xd2\x60\xbc\xc0\x5a\x9a\x68\xb0\x92\x59\x30\x27\x9d\xef\x86\xb8\xd8\x38\x1f\xd0\x34\x0a\x2e\xbc\xb5\xcb\x62\xf4\x96\x8c\x00\x28\x98\x15\x8e\x56\xf5\x2d\x0b\x3a\xa8\x28\xf2\x54\xc9\xd6\xfb\x33\x9c\x58\x29\xd6\x35\xe5\x13\x65\x1d\xeb\x85\x43\xc7\xa8\x5d\xcc\xdc\x4e\xb3\xd7\x73\x2a\x47\x2f\x73\xb5\xf3\x13\xaf\xf4\xca\x27\xe7\x13\xa9\x34\xee\x38\xa1\x7b\xab\xce\x6e\xc4\x62\xbd\x16\x12\x98\xdd\x6c\xc5\x13\x09\x6a\x78\xb1\x1a\x7d\x8f\x5a\x76\x2c\xa8\x9f\x3b\xcf\xf4\xaf\xcf\xf7\xee\x79\x63\x84\xe6\xcf\xdc\x27\x9b\x89\xec\x6b\x6e\x88\x2f\xa3\x37\x6e\xca\x3a\xdf\x11\x76\xf6\xce\xe8\x7c\x1b\x7a\x3a\xae\xc7\x7e\xde\x19\x25\xb1\xba\xf2\x97\xe9\xc0\x6c\x1d\x91\x75\x22\x4b\x73\x75\x15\x7d\xf5\xcc\x25\xa3\x95\x46\x1e\x7f\xbc\xb9\xac\xfc\x66\x74\xa0\xf3\x31\x3f\xb7\xa4\xf5\x39\xb8\xe3\x5a\x9f\x9d\xff\xd3\xed\xf5\x7f\xba\x03\xaa\x9c\xaf\x51\x43\xb1\xed\x80\xb9\x34\x8e\x68\x4c\x7a\x6e\xdc\xdc\x31\x8d\xa2\x23\xd4\x0a\xe6\x69\x4a\xe2\xfc\x58\xdc\x9e\x9e\xf0\x74\xff\xc0\x53\x39\x98\x82\x79\x46\xd2\x13\x12\x91\x40\xa4\xe2\x8f\x89\xa3\xe3\x38\x99\xa6\x34\x3e\xb3\xb4\x0a\xcd\x14\x02\x7c\x4c\xeb\x2a\x01\x52\x4f\x07\xb0\x39\xe9\xac\x64\x9f\x33\x10\xcb\x90\x10\xd1\x58\x4a\x4d\x4e\xfe\xfd\x4f\x10\x68\xdc\x00\x09\xe7\x5a\x59\x6c\xfd\x86\x8d\xd3\xd7\x6e\x9a\x09\x75\x58\xf0\xdb\x2e\x5e\xfd\x55\x48\xc8\x33\x84\xd1\x74\x3e\xc3\x71\x2f\x25\x38\x04\xb9\x98\xc8\xea\xa2\x02\x60\xea\x08\x80\x53\x9c\x43\x22\x2b\x4c\xe3\x0c\x51\x25\x77\x9f\xe6\x79\x92\x1d\xed\xed\x5d\x5c\x5c\xf4\x2f\x1e\xf6\x59\x3a\xd9\x7b\xf7\x76\xef\xe4\xdf\xff\xec\x71\xae\x34\xcb\xf6\xfe\xe3\xc7\xff\x9d\xd3\x73\x1c\x91\x38\xbf\xe7\x24\xbb\x7a\x01\xdf\x57\x1a\xf3\x8b\x28\x62\x17\x19\xc4\x05\xcc\x19\x4a\x89\xb8\xaa\xd1\x05\x1f\x9a\x90\x10\xb3\x34\x04\xeb\x9d\x0c\x42\xf2\xb1\x79\x8e\xe6\x31\xcd\x33\x34\x23\x38\x46\x34\xce\x68\x48\x10\x8e\x51\x76\x3e\xf1\xf4\x07\x3f\xb1\x14\x91\x05\x9e\x25\x9c\x3f\xa2\x63\x7d\x70\xd4\xf4\x69\x86\x0e\x07\x03\xd4\x06\x0a\xd3\x41\xa3\x4b\xb4\xcf\x7f\x0a\x12\x24\x04\x0b\xdf\x21\x1c\x87\x30\x38\x10\x8c\x9e\x53\x72\xf1\x03\x5b\x3c\xff\xdb\x00\x0d\xd0\xe1\x00\xed\x0f\xfe\x26\xab\xe5\x53\x2a\x46\x24\x73\x33\xf9\x43\x97\xe3\x04\x24\x3a\x9f\x08\x69\xee\x84\xa1\x71\xca\x66\x42\xdc\xcd\x12\x14\x91\x31\xdf\x8e\x34\x26\x29\xe7\x44\x07\x1d\x09\x9a\xa9\x00\x81\x10\xfb\x07\xb5\x0f\x07\xdd\xfd\x41\x07\x46\x46\x70\x30\x85\xe5\xd0\xf2\xe1\x0b\x96\xe6\x53\x34\x1c\x24\x0b\xcb\x82\x5e\x0c\x7b\x35\x1b\x7a\xf9\xdc\x2f\x9a\xd0\x6f\x5d\xea\x69\xa1\x92\x9b\xcc\x4b\x94\xa9\x6a\x72\x56\xba\x8a\xfc\x7d\x75\x6b\xfa\xe5\x32\x4d\x6b\x34\xfc\xa7\xec\x79\x0d\x69\x66\x2b\x3b\x9f\xb4\xb6\x25\xbe\x2c\x4a\xf5\xc6\x2c\x98\x67\x22\x32\x44\x0b\xde\x41\x2d\x6f\x31\x8f\x90\xb7\x8a\x2d\x9c\x52\xdc\x93\xe1\xc3\x8f\x9c\xad\xf9\x5e\xc1\x40\x47\xa8\xc5\xd9\xfc\x96\x23\xcf\xeb\x58\xa1\x4a\x74\x8b\x66\x72\x3a\x19\x02\x46\xfe\x8c\xe7\x51\x54\x82\x1a\xf7\x94\x38\xcc\x7c\xb7\x64\x65\x42\xa2\x23\x71\xf8\x4b\xb9\x01\xec\x6e\xe4\xab\xdd\xc8\x77\x46\x42\xe4\xd2\x8b\x8d\x80\x54\x34\x67\x35\xa3\x5b\x75\x20\x4a\xa4\x29\x9a\x02\x80\x8d\xd0\xfe\x01\xda\x3f\x10\x81\x7e\x54\x9b\xd9\x9c\x4a\xba\xad\x45\xc1\x1b\x10\xa2\x28\x50\xe8\x73\xa7\x2d\xff\xde\x92\xf8\xe4\xf0\x26\x06\x00\xda\xca\x63\x3c\x99\xa7\x55\xaf\xc7\xfd\x27\x4e\xad\x3a\x98\xfc\xbb\x09\x27\x22\xb6\xa6\x0a\xea\xa1\x5f\xb1\x36\xe8\x88\xde\xe6\x6b\x09\x21\x74\xcf\xf0\xd7\xa8\x87\xa0\x9f\x18\x47\x8e\x26\xfb\xbb\x3d\x2d\x25\xe1\xe3\xae\xbd\xa4\x5a\x09\xce\xa7\xfc\xa9\x88\x42\x8e\xc1\xc3\xa7\xe8\xf0\x7c\x78\xf0\xf3\xe1\xbf\x0f\xa7\xc3\x83\xd9\xa0\xb7\xff\xf3\x61\xd0\x1b\xf6\x87\x68\xd0\xdb\x47\xfd\xa7\xbd\x7d\xb4\x7f\x3e\x3c\x08\x06\x68\xd8\x1f\xf6\x9f\xa2\x7d\xfe\x7f\xd3\xe1\x41\x00\x55\xd0\x7e\x8f\x97\xf5\xf6\xff\x7d\x18\x0c\x78\xab\x1e\x6f\xc1\xff\xef\xcf\x16\xd2\x58\xa2\xec\xd6\xdf\xcc\x73\xfe\x9c\xfe\x21\xc2\xf1\x99\xfd\x38\x2f\xfb\x6e\xf3\x6d\x2b\x68\x57\xd5\xf6\xb9\xda\x2a\xc1\x1c\x29\x4d\xdb\x58\xde\xaf\xd2\x86\xbf\x38\x30\xa0\x00\x80\x5e\xe6\xec\x97\x55\xed\x94\x43\x68\x4c\x69\xca\x1a\x3f\x2b\x9c\xfb\x47\x5f\x52\x6c\xaa\x06\x6d\xe1\xeb\x73\xa0\x01\xab\x11\x80\x8c\xe4\x2f\x85\x50\x45\x2e\x4c\xf9\xd9\x7e\x5a\xd1\xa0\xee\x34\xba\x35\x8d\x04\x2d\xc5\xc9\xf2\x2e\x1f\x1f\x54\x35\xa8\x95\xbb\xb9\x55\xaf\x85\x10\x98\x0e\xe0\x76\x3f\xc6\x51\x04\xe8\xd3\x36\x71\xef\x8f\x59\x9c\xe5\xe9\x3c\xc8\x59\xca\xfb\xa2\x63\xd4\xfe\x46\x7f\xd6\xf1\xf1\xd9\xd8\xa9\xc8\x6b\xe6\xd3\x94\x5d\xa0\x98\x5c\x20\xce\xd0\x40\x72\x96\xf6\xdf\x8e\x71\x1c\xb3\x1c\xac\x68\x10\x16\x1c\xa4\x8c\x40\x20\x47\xf2\xb7\xce\x33\xf4\xd9\x1d\x5a\xc2\xb2\x8c\x8e\x22\x62\x75\xf0\x16\x66\xdc\xce\x48\x34\xee\x02\x30\x3d\x34\x5e\xe4\xf6\x0e\x86\x35\x24\x0e\xd4\x10\xe0\x51\x3a\xc5\x59\xdc\xca\xd1\x88\x10\xfe\x5a\xa6\x39\xc5\x11\xcd\x48\x88\x7a\x28\x9b\x27\x24\x6d\x77\x9c\x1a\xbc\x07\x12\x8a\xa1\x29\xa5\x29\x9f\xc1\xfd\xfb\xa8\xad\xb4\xe1\xfc\x37\xe7\x4f\xff\x26\xb8\xaa\xbf\xa1\x4f\x9f\x50\xe1\x9b\x99\x25\xfa\x5e\x14\x1f\x21\x3e\x62\x6f\x33\xa4\x26\x2c\x6b\x67\xf3\x11\x98\x12\x74\xc5\xb0\xe0\x6f\x35\x55\x09\xdc\x7c\x10\xfc\xba\xee\x82\x8f\xce\xfb\x08\x7e\x3d\x55\x5b\x73\xc2\xeb\xf2\xa3\x9f\x92\x2c\xe3\xc3\x98\xcd\xb3\x1c\x11\x91\x06\x64\x44\xa0\xb1\x48\xf8\xa1\xba\xe8\x42\xca\x80\xbf\xa1\x07\xa8\x30\x16\x58\x2a\x35\x7a\xfe\xd2\xc8\x99\x8c\xa0\x2e\x59\x04\x29\x62\xb4\x06\xe8\x0c\xd7\x34\xe1\x77\x4a\x60\x76\x9e\x23\xb2\x64\x1a\xcc\xe2\xd8\xc1\xfd\x84\x86\x0b\x5d\xa4\x34\xb7\xa2\xfd\x71\x10\x63\x3a\x99\x5b\x11\x00\x39\x9a\x75\x9e\xc1\x52\xda\x8b\x2b\xc7\x97\x11\xce\x07\x8a\x21\xbc\x19\xa3\xef\xcb\xcb\x2b\x36\xc8\x8c\xad\xff\xf1\x23\xcc\xe4\xe3\x47\xf4\xdc\xaa\xa2\x25\xdf\xd9\x94\xcd\xa3\xf0\xb7\x24\x14\xae\xf3\x46\xb2\x6c\x95\xb7\x73\x92\xe5\xce\x9d\x65\x8c\x18\x7e\xc0\x19\xd1\x0e\x2a\xca\x02\x81\x03\x1e\x63\xbe\x5a\x97\xea\xde\x01\x82\x2a\x17\xfd\x27\xf1\xa9\xe3\x35\x7e\x76\x4f\x37\x3e\xa9\x18\x55\xfb\x63\xa1\x2f\x64\x61\xab\xdd\xac\x8b\x3e\x16\x40\x23\x03\xc9\xae\xda\xb6\x2d\x27\x7c\x42\xc4\x4f\x6b\xd7\xa9\x6e\xa0\x99\x3b\xbc\x9a\x44\x88\xf6\x66\x2c\x7d\x9c\x24\xd1\xa5\x2c\xc6\xe9\x04\x2c\xe8\xb2\x8e\x36\x90\xd0\xe6\x11\x76\x97\x06\x1b\xfb\x62\x63\x34\xb8\xaa\x9d\xf3\x2a\xb4\x63\xb2\x10\xef\x0a\x7b\xae\x72\xf4\x7c\x7b\x61\x40\x7d\x29\x6e\x31\x95\xf5\xa8\x9e\x2d\x19\x56\x4a\x62\x91\x04\x5e\x8f\x43\x94\xb4\x4b\xfa\x93\xa8\x61\x75\x59\xd2\x8f\xac\x6b\x77\x27\x2a\x7d\x96\x7c\x75\xbf\xb0\xbd\xfc\x24\x55\xca\x11\x5a\x46\x8e\xd0\x32\x63\x92\xbd\x00\x8a\x7a\x97\xb3\x61\x92\xc4\xd3\xc9\xbb\x48\xcd\x67\x07\x8b\xbb\xa8\x65\x1f\x9d\x56\xa7\xd3\xf6\x70\x47\x29\x23\x2a\xa7\x28\xb5\x14\x45\xc6\x2a\x73\x2a\x6e\xe3\x31\xf6\x78\xa3\x8f\xb1\x1a\x2e\x0b\x48\x0f\xc9\x4f\x72\x9c\xd3\xc0\xc1\x5e\x55\xd8\x3e\x23\x97\x5d\x41\x69\x57\x21\x3d\x7b\xdf\x21\x92\x45\x34\xce\x7b\xd2\xc0\x00\xc5\xac\x07\xc1\x5c\x7a\x29\xc1\x59\x46\x27\xb1\x90\xbe\x22\xe4\xb4\x7f\x7f\x46\x2e\x3f\xa0\xe7\xa2\xc3\x67\x1e\x28\x12\xd7\x43\x92\x43\x73\x00\xd6\xef\xa4\x9a\x65\x91\x2f\x7e\x72\x5d\x5b\x20\x39\xd2\x29\x8e\x22\x76\xf1\xe3\xff\xce\x71\x54\xc5\xef\x0e\x4d\xfc\x4a\xbb\x7a\x2d\xfb\x6a\xd5\xbb\x16\x46\xb2\xb8\xc6\xee\x58\x4d\xa0\x5c\x7f\xc1\x9f\xee\x04\x10\x3b\x01\xc4\x36\x04\x10\x0f\xa5\xc8\xa1\x5c\xe6\xf0\xc4\x15\x3a\x94\x4b\x1d\x9e\x28\xb1\xc3\xac\xf7\x14\x0d\x0f\xa2\xde\x61\xef\x10\x0d\xfb\x07\xc3\x1e\xff\xcf\x2f\xc3\x01\x1a\x1e\xf4\x87\x8f\xa3\xc7\xfd\xc3\xa7\x3d\xfe\x9f\x5f\x86\x4f\xd1\x93\xa8\xf7\x14\x3d\x2d\x93\x54\x94\x49\x27\xae\x55\x22\xb1\x44\x0a\x61\x49\x1e\x56\x96\x36\x14\x0e\xf6\xe3\x4d\x66\x65\xdf\x1d\xec\xdd\xc1\x2e\x1c\xec\xab\xca\x12\x67\xbd\x7d\x34\x1c\xfc\xfc\xf8\xbc\xb7\x3f\x1d\x0e\xce\x1d\xe1\x62\x55\xbc\x67\xe3\x38\x53\x56\xe1\x5a\x0e\x73\xd5\xd0\xca\x4e\x76\x55\x34\xe9\xd2\xf2\xc6\x67\xbe\xb4\x75\x91\x00\xdc\xd0\xdc\x02\x34\xa9\x8c\xdb\xfd\xe5\xf3\x0a\xd0\xe4\x06\xe4\x14\x78\xbc\xc9\x9c\x02\xbb\xd0\x28\xb7\x3c\x34\xca\xc4\x95\x84\x95\x0f\xe1\x49\x45\xf5\xba\x7b\xc9\xad\xe9\x5a\xc2\x6a\x01\x50\xd5\x9c\x9f\x56\xd4\xaf\x9b\xaa\x07\xd9\x40\x00\x9a\x0c\x82\xb9\xaa\xee\x86\x83\xb2\xda\xb5\x9d\x59\x40\x0d\x0f\x50\x25\xa7\xaa\xec\x77\xb8\xbc\x6d\xdd\x28\xaa\x3b\xd4\x70\x95\xf8\xae\x72\x08\xc5\xaa\x75\x3d\x6a\x70\xdb\xe5\xb9\xae\xc3\xb4\xfa\x8c\x5c\x06\xd5\x26\xc7\x8f\x0f\xfd\x8a\x75\xe0\x65\x95\x6b\x8d\xc0\x73\x8c\xe3\x80\x54\x89\x15\x0e\x1f\x3f\xf4\x2a\xd6\x41\x17\x35\xcc\x92\xb2\x88\xa5\xaf\x71\x4c\x93\x79\x84\x73\xf0\xc6\x2d\x47\x1d\xb3\x46\x2f\xce\x71\x8e\xab\x2a\xee\x3f\xf1\x2b\xd6\x0d\x46\xd4\xf8\xba\xad\xd3\x57\xcb\x51\x77\xe5\x71\x29\x38\x5b\x33\x9c\xe7\x0d\x85\x8d\x29\x7a\x8e\x1e\xee\x3f\x53\x1e\xe7\x6e\x10\x10\x9d\xa9\xd6\xc3\xbf\x3e\x99\x25\x53\x9c\xd1\x3f\x49\xc7\x0b\xf3\x62\x00\x98\xf0\x76\x83\x3e\xd0\x34\xd1\x43\x48\x22\x22\xc2\xe6\xd5\xf7\x30\xc6\x61\x01\x38\xc4\x20\x91\xbe\x6a\x1c\xec\xfe\xa3\x8e\x9d\xab\xb4\xcc\x0b\x60\xcc\xe2\xfc\x27\x3c\xa3\xd1\x65\x49\x6c\x21\xf3\x71\x85\x40\x44\xc3\x87\x9d\x55\xe2\xbb\x78\x11\x90\x0a\xe1\x5d\xbc\xef\xca\xf5\x40\xfc\x5b\x1b\x79\xc8\x8f\xb7\xe3\xed\x9d\x1e\x65\x21\xb0\x8b\x57\x50\x1e\xf9\x48\x22\xc7\x1e\xda\xd7\x3e\x10\x53\x9a\x93\x93\x04\x07\x04\x5c\x1e\x2e\x20\x3b\xa0\xeb\x1f\xd1\x1a\xd3\xbc\x17\x88\xb9\xb5\x56\xf2\x7d\xd0\xa3\xdd\xdb\x13\xa1\x75\x84\x2d\xb1\xbc\xdd\x84\x65\x33\xd8\x29\x0b\xab\xd2\x7c\x4a\x62\x74\x1a\x44\x34\x38\xe3\x6f\x81\x53\xa9\xda\x66\xe7\x24\x4d\xc1\xf8\x5c\x34\x60\x29\x1a\xb1\x7c\xaa\x56\x71\x9e\x66\x05\x5f\x3d\xfe\x3f\x26\x4c\x37\xb4\x27\x07\x1f\xc4\xbf\x98\x2a\x46\x10\xd1\x05\xbc\xc8\x8d\xd5\x76\x8c\x8e\xa7\x29\x9b\x11\xd4\xc6\x19\xca\x53\x3a\x99\x90\x94\x84\x68\x74\xa9\xa3\x98\xc3\x83\xb2\xe3\xac\xad\xd3\xc1\x5b\x32\x63\xe7\x04\x9d\x0a\x87\xdb\x53\x59\x45\xd6\x37\x71\xa9\xca\xaa\xca\xaf\xd2\xd2\x55\x58\x9d\xaa\xa5\x30\xa8\x6f\x1a\x4e\x52\x72\x89\xa6\x74\x32\x8d\xf8\x9e\xca\xcf\xbf\x93\xd1\x19\xcd\xdf\xe1\xe4\x67\xf5\xa1\x34\xee\x4f\xc0\x66\x33\x16\x8b\x2d\x4b\x70\x6a\x67\x15\x57\xcb\x99\x30\xea\xe0\x70\xeb\xfe\xd1\x94\xef\x44\x17\xdd\x3f\x82\x85\x6b\x1d\x59\x5a\xb1\x02\x3a\x2e\xa5\x30\x3e\xbe\xa2\x41\x7f\xf0\x44\xad\xec\x67\xab\x57\x11\x84\xcb\xed\x8d\x2d\x4e\xa6\x38\x64\x17\x3a\x12\x18\xfc\xca\xde\x0f\x3f\x74\x37\x3b\xa4\xe1\xbe\x1e\x92\xbd\x31\x40\xef\xdc\x8d\x69\x5d\xc7\xb2\xd8\x63\xc0\x70\x81\x9b\xde\x44\x8e\xff\xb7\x82\xd2\xf4\x7c\x27\xa7\x87\xfb\x3e\x31\x32\x25\x4d\xe8\xe3\xa3\x4e\xb1\xef\x63\x6d\x86\xec\x05\xad\x1a\x3e\xf5\x3b\x1b\x3e\xb5\x9b\x7b\x61\xb6\xd6\xa0\xb8\xf2\xb0\xfc\x42\xc6\x1c\xf8\xbe\x57\x2c\x17\xc1\x94\x57\x3b\x76\xd5\xd1\x3f\x7d\x16\x4a\x83\x8d\xe9\x2b\xef\x1a\x0f\xa7\xa8\xee\xdd\xb6\x4b\x8f\xae\x0e\x1b\xe6\x84\xe7\x13\xf8\x02\x46\xb9\x07\xc9\x02\x0d\x50\xef\x49\xb2\x28\x1c\x77\x07\x9d\x83\x3a\x24\x16\x77\xbb\x3f\x36\x34\xe8\x1f\x78\xe8\xbb\x39\x27\x36\xc9\x0e\x17\x72\x8c\xa8\xa3\xb1\x56\x82\xe4\xab\x26\x47\xde\x6c\x62\xe4\x3b\x10\x9a\xeb\x78\x9e\xe5\x6c\x26\xb1\x16\xe2\x28\xf5\xd1\xef\xd2\xa7\x28\x9b\xb2\x8b\x18\xb1\x38\xba\x44\x74\x8c\x4e\x59\xcc\xdf\x1e\x24\xcb\x5f\x42\xe5\x53\x44\x33\x94\x11\x6b\x67\xed\x53\x77\xf7\x76\x57\x04\x31\x03\x46\x4b\xc5\xa7\x02\x52\x69\xe6\x2f\x29\xe7\x2d\x8e\xcd\x51\x8f\x61\x2c\x3e\xe6\x3c\xcf\x15\xf2\xcd\xb0\xf8\xff\x90\xcb\x97\xec\xa2\x3a\x19\x7e\x11\x86\xc9\xcc\xa3\xde\x56\x5e\x8a\x1e\x0b\x77\x21\x51\x0f\x1f\xa3\x9d\xe7\x2b\x23\x82\x7d\x75\x2a\x5e\xd8\x38\xde\xb7\x06\xe8\xe0\xf8\xad\x48\xad\x03\xd4\x5a\xaa\xa5\x8e\xa7\x34\xc9\x50\x4a\x92\x94\x64\x1c\x51\x39\xb1\x89\xc8\x02\x91\x38\xa7\x90\x09\x8a\xc6\x28\x9b\x61\x3e\xf7\x88\x05\x67\x60\xd5\x17\x4c\x85\x81\x2a\x78\x84\x06\x96\xf6\x4a\x6a\x12\x2c\xe3\x38\x40\x9e\x6f\x3d\x9b\x18\xb8\x71\xb4\xe0\xcc\x56\xba\xd2\xa4\x8b\x0a\x6d\xe0\xfd\x68\x69\x89\x69\xd2\xb6\xcd\xfa\x64\xc8\x02\xfd\x33\x27\x33\x0e\x45\x5a\xb9\xa5\x24\x97\x1f\x8d\x37\x9c\x91\x8c\x9a\xbe\x45\x75\xd0\x36\xc8\xfa\xfc\x65\xd2\x06\x88\x11\x78\x31\x6a\xcb\xb8\x7e\x44\xe2\x49\x3e\x05\x5b\x39\x7e\x89\xbd\x48\x53\x7c\xd9\xe6\xb5\x3a\x5d\x10\x7c\xa1\xe7\x68\xf0\x4c\xfc\xf5\x77\x68\x2d\x7e\x3c\x78\x60\xac\xbc\x78\xd3\xf7\x1f\xa5\x85\x8f\x86\x2c\x4a\x94\x41\x96\xa3\x1e\x49\x09\xb8\xcc\xc0\xec\xc4\x1f\xfc\xf5\xa4\x54\x5c\x95\x72\x50\x7f\x82\xca\x59\x8d\x4f\xd4\x32\xc4\xfc\xf4\x49\x00\xf2\x24\xd5\xee\xd6\x74\x3a\x60\xc4\x25\xcd\x05\x85\x7b\xd1\x7b\x0e\xf6\x43\x3f\x60\x71\x80\xf3\x36\x9f\x55\x07\x72\xab\xf3\x62\xf5\x6f\x3f\x98\xd2\x44\x44\x98\x03\x17\x3c\x59\x3a\xc5\x71\x18\x91\x97\x86\xc3\xe0\xc7\xd0\xc1\x1e\x48\x8a\xd5\xb1\xf9\xb1\x93\x9c\x25\xc2\x33\x19\xf2\x65\xc1\x6b\x73\x34\x1f\x8d\x22\x1a\x4f\xd0\x3c\xd1\xe9\xca\xf8\x70\x4f\x65\x33\xa8\xda\xcf\x72\x96\x70\x22\x86\x27\xe0\x91\xdf\xd6\xf6\x7d\x7c\x87\xbd\x43\x8c\x9e\xcb\x21\x0a\x7f\x51\xef\xab\xb6\x07\xa4\x63\xd4\xf6\xbe\xd9\xa6\x85\xde\x27\x39\x9b\x67\x1e\xf3\xef\x2c\x86\xa4\x75\x75\x8b\x20\x50\x7c\x4a\xb3\x6f\x13\xc9\x43\x59\x43\x35\xcf\x25\x4d\x7b\x55\x85\x6f\xd5\x5c\xa0\xd4\xad\x58\x3a\xf9\x6f\x4b\x27\xef\x36\x34\xe3\x75\x9b\xc8\x72\xbd\x52\x7c\xd0\xe2\x5c\x00\x96\x29\xd9\xb0\x41\x2f\xb5\x36\xce\xca\x8a\xf1\xdf\xbf\x8f\xda\xd0\x16\x42\xaa\x71\xd6\xbe\xc5\xd1\x55\x17\x89\x97\x84\x13\x6a\x4c\xec\x78\x92\xc2\xbf\x4a\xee\x69\xc5\xfb\x92\xa0\xfd\x1d\x41\x24\xca\x48\xd9\xae\xf2\x31\xe8\xfe\xf8\xcd\x22\x86\xb1\x5a\x97\xb5\xc8\x60\xba\x36\xf3\xca\x82\x95\x7a\xe0\x8d\x9d\xe3\xe6\x06\x5f\x73\x3e\xf5\x47\xd1\x3c\x6d\x3b\x11\xd0\xd4\xbf\xce\x0e\xc8\x7d\x74\xb1\x5a\x16\x56\xe3\x33\x99\x25\xca\x39\xb1\x09\x61\xb2\x28\x75\x47\x28\x78\xd5\x15\x61\xab\x95\xfc\x5b\xe2\xbd\x18\xd2\x19\xe1\x0f\x4d\x61\xd8\x2b\x5f\x3b\x52\x55\x5a\x6d\xf5\xab\x8f\xd0\x3e\x7a\x0e\x42\x28\x07\x4f\x3f\xaa\x73\x55\x7e\xac\xc4\x63\x84\x53\x12\x8e\xf5\x02\xe1\x45\x99\x5d\xcb\xf8\xb6\x7f\x2c\x75\x6e\x47\xb6\xa3\xb6\x0b\xac\xe0\xe5\x8e\xd4\x13\xdb\xd4\x81\x9f\x15\x87\xbd\xe6\x9c\x5b\xc7\xd5\x3b\xa9\x4b\xe8\xc1\x52\x52\x60\x18\x79\x77\x32\xa6\xdc\xae\xad\x38\x1d\xb7\xae\x2a\x75\xc6\xb2\x9a\x6f\xfe\x47\xed\x9c\x2f\xb6\xa4\xce\x35\x1f\xd6\xb0\x25\x92\xee\xf0\xa5\x12\x7f\xca\xf5\x10\x3f\x9c\xe9\x42\x64\x52\x3d\x9d\x96\x9d\x5f\x47\xb9\xf3\x2b\x14\xb2\x43\x17\x34\x0e\x21\x5a\xeb\xcb\xfb\xd7\x67\x13\xa6\x53\x8b\x11\xbb\x6a\xdb\x97\xba\x02\xdb\xcd\xb5\xb0\xab\xeb\xef\xb4\x1d\xdf\x93\x03\xe9\x38\xe7\xc2\xcc\x5d\xde\xe3\xcf\xaa\xaf\x41\x4e\x30\x3d\x94\xb8\x7f\xbf\x60\xf7\x43\xb3\x7f\xe3\x88\x86\xca\xf0\xc7\x6d\xe0\x10\x74\xa7\xef\xda\xf8\x91\x2e\x10\x37\x90\xa4\x7e\x8d\x54\xb3\x1f\xa5\xe7\xb3\x49\x20\x05\x0b\xd1\xbd\x99\x57\x07\xa1\xfc\xdc\xe0\xea\x69\xbe\x0a\x6e\x3a\x23\xa9\xbe\x34\x0a\x9e\xd2\x18\xa2\xf6\xa8\x1b\xac\x8e\x3d\x62\x1b\x35\xb0\xd2\x63\xfa\x68\x61\x11\xcb\xe5\xfb\x6f\x2a\x3b\x7b\xbf\xb7\x87\xbe\xe5\xcf\xd0\x9f\xe8\xe2\x35\x41\x3d\xa1\x35\x88\x18\x3b\xcb\xa4\x41\x4d\x74\x89\x02\x96\xa6\x24\xc8\x85\xf3\x15\xa4\xd1\xb8\x98\x5e\x22\x9a\x23\x92\xa6\x2c\x15\x62\x13\x8b\x7a\x2f\x43\x22\x33\x12\x17\x81\x56\xc2\x08\x79\x29\x58\x17\x46\x01\x13\x1c\x6c\x93\xd2\xd7\xe3\xd5\xfb\x38\xd6\x91\x5c\x8b\x7d\xf9\x50\x4b\xb1\xcf\xde\x4b\xad\x1a\x79\xee\x90\x69\x87\x35\xfb\x46\x7d\xb1\xf7\xc9\x6a\xa8\xd0\xe5\xd3\xa7\xc2\x65\xf2\x3d\x1a\xa0\x23\xd4\x1b\x16\xfa\x6e\x6e\x1b\xc8\xff\xd7\x0a\xe9\x79\xcb\x2c\xdf\x92\x90\x28\x00\x9f\x41\x30\x13\xa1\x9e\x69\x55\x9c\xf3\xd2\xbb\xd7\xbc\xcb\x4b\x6f\x28\x75\x6c\xea\x6e\x5c\xe7\x50\xc9\x32\xb3\x11\x85\xb8\xc6\x48\x45\x30\xb6\x78\x98\x71\x3b\x66\x21\xe9\x78\x91\x71\x05\x1b\x63\x3f\xb0\x58\x48\x9e\x59\x55\x3e\x5b\xfb\xdd\xf5\x8e\x81\xf9\xdd\x70\xd5\xfd\xc8\xc8\xa8\x61\x74\x64\xa4\x38\x18\xfd\xdb\x1a\x8b\xa1\x41\xb2\xc8\x72\x48\xfa\xfc\x01\x7e\x48\xdc\xe0\x8c\xdf\xb3\x7b\xca\xd9\xca\x0a\x6b\x6c\x4b\x0a\xae\x9e\x9d\x8d\x26\x32\x33\x9b\x10\x05\x78\x76\x80\x9b\xcc\xa8\xb6\x33\xe1\xde\x99\x70\x4b\x13\xee\x7d\xb4\x7f\xfc\xa8\x7f\xf0\x18\x4c\xb5\xe5\x1f\xc3\xfd\xec\x80\xff\x35\x1c\xe8\xff\xef\xc9\x82\xde\x70\x70\x32\x7c\xdc\x3f\x7c\x08\xd5\xd0\xfe\x9f\xb3\x43\x34\x7c\x08\xde\x16\x87\xfd\xc3\xa7\x68\xf8\x98\x17\x0f\x1f\xf6\x0f\x86\xe8\x09\xff\xcf\xf0\x31\x7a\x8c\xe4\xb7\x01\xfc\x77\x1f\x3d\x16\x9f\xe0\x3f\xa2\xbe\xf8\x02\xb5\x1e\xf3\x26\xa2\x29\x40\xe1\x9f\x25\x04\xc7\x8f\x43\xd9\x53\x19\xf9\x1c\x94\x5c\x8f\x0f\x87\xea\xbc\xd4\x83\x43\x99\x67\x89\x3f\x9a\x7b\x6f\x40\xf5\xe2\xc1\xdf\x64\x50\xdd\x8d\x1d\xfc\x97\x14\x47\x6c\x52\x69\xce\x76\xf8\x85\x8d\xb7\xc5\xf0\xca\xcc\xb7\xad\xd1\xbf\x00\xb0\x55\x36\x7f\x87\x8f\x1f\x35\x99\x84\x03\x6a\x7b\x53\x91\x1d\x2c\x99\xd1\x3b\x08\xa2\x58\x35\x9f\xc7\xcd\xe7\xf3\x4e\xc4\x37\xdb\xd6\x6c\x00\xfc\x92\xb9\x48\x2b\xa8\xca\xd9\x3c\x69\x3e\x9b\x63\x65\x74\xb4\xad\xf9\xc8\x0e\x9a\xcd\xe8\x1d\x59\x54\xcf\xea\xe9\xca\xb3\xe2\xe0\xb6\x3e\x33\xde\x49\xe5\xec\x38\x8b\xf3\x9a\x8d\x68\x44\xea\xa9\xc2\x93\x41\x93\xc9\xf9\xd0\xb6\x31\x37\xbf\x8f\x9b\xe0\xe7\xb1\xc9\xe0\x5f\x37\x31\x76\xfa\xce\x2d\x64\xcb\xb1\xd3\x2b\x12\xe5\xbe\x66\x21\x8e\x6e\xbb\xf5\xff\x75\x58\xe8\x37\x4e\x5f\x0b\x2b\x5a\x69\x65\xff\xd8\xad\x57\x37\x08\xa8\xa0\xab\xff\x84\x2b\x6d\xd6\xf7\x1f\x3f\x71\xaa\xd5\x01\xe5\xdf\x75\x65\xcb\x98\xb6\x6a\xe1\xcc\xbc\x7e\xc5\x09\xa9\x72\x0a\x38\xf4\xaa\xd5\x8d\x00\x2a\xec\x3c\x02\x1a\xc0\xd3\xa7\xf4\x9d\x88\xc7\x54\x63\xc2\xb1\x1a\xe0\x77\x7a\xdf\xb5\x4d\x4a\x05\x66\x0d\x1a\x4f\xbe\x04\xe6\x06\x97\xc2\x40\x7f\x29\x63\xd7\x6f\x72\xc4\x1a\xe6\x97\x48\x36\xb0\xcc\xac\xbf\xcc\x40\x55\x2a\x35\xc5\x2b\x94\x9f\xa7\xa5\x66\xae\xca\x0e\xb3\x34\xa7\xf1\x81\x9d\x80\xe0\x25\x4d\x45\xf2\xc2\x23\xc8\x0c\x34\x9f\xc5\xc5\x1c\xcc\x43\x37\x07\x73\xc2\x94\x91\x7e\x2b\x25\x11\x64\x58\xb5\x3a\x5e\xfc\xac\x2c\x43\x9f\x0e\xce\xa7\xc6\x72\xfe\x9c\xa4\xe3\x88\x5d\xfc\x8f\x36\x19\x45\x7b\x7b\xe8\x27\xba\x40\xaf\x7e\x1c\x0e\x11\xcd\xb2\x39\xe9\x8a\x98\xea\x60\xec\x8a\x73\x94\xb1\x19\x41\x60\x77\xaa\x44\xe7\xa5\xf6\xd0\x9e\x4d\xbe\xa7\x09\x36\x8b\xf6\x3b\x0d\xf3\xe9\xff\xcd\x6c\xe3\xe6\xc5\xef\x76\x82\xe8\x51\x4a\xf0\x19\xf4\x97\xf5\x81\xa5\xc9\xfa\x8b\xac\x1c\xcc\xc9\x6c\x25\x30\xd9\xac\x1c\xcc\xeb\x70\x25\x30\x33\x27\xaf\xf0\x78\x1e\x45\xb2\x45\x69\x6e\x61\xbf\xee\x49\x90\x12\xdb\xae\x5a\xe1\xc8\xc0\x77\xcd\x70\x32\x13\x9b\x61\xb9\xe5\x26\x6d\xb0\x57\xfb\xe7\xd2\x0f\xae\xcb\xc8\xc0\xc8\x56\x37\x63\xb4\x2b\xdf\x1a\x26\x9b\xdc\x3c\x9b\xe3\x28\xba\x04\x3b\x1c\x1a\x07\xd1\x3c\x24\x21\xca\xe6\xa3\x5e\xa9\x19\xeb\x5d\xc8\x4f\x76\xfb\x6d\x7a\xad\x4c\xb2\x56\x86\x00\x8e\xba\xbd\x0c\x70\x57\xc3\xb7\xd1\x79\x9d\x44\xb5\xa0\xbc\x56\xe9\x58\xf9\xe5\x15\xa6\x2c\x11\x3d\xc6\x2c\x07\x43\x4d\x61\xc1\xa5\x15\x47\xc7\x11\xcb\xc8\xa9\x4e\x32\x6b\x96\x4b\xcc\xfc\x07\x09\xa3\xde\xd0\xb4\x76\x4c\x53\x9a\xe7\x7c\x48\x24\x0b\x70\x42\xae\x32\x98\x1f\x01\xc2\xff\x21\x97\xbf\x25\x2b\x0c\xe5\xdd\x94\xe8\x2c\x32\x3a\xf5\x86\x61\x19\xbb\x88\xc6\x68\x46\xa3\x88\x8a\x1c\xf0\x12\x63\xd0\xff\xb0\x39\x9a\xe1\x4b\x94\x25\x24\xa0\xe3\x4b\x84\x51\x46\xe3\x09\xe4\xf0\x98\x11\x36\xcf\x01\x14\x8e\x22\x0b\x54\xd6\x45\x2c\x45\x34\x86\x1c\xe1\xe2\x98\x72\x0e\x1c\x61\x60\xfb\x48\x60\x99\x66\xe7\x85\x4b\x7b\xd5\x33\x5a\xc6\x4a\xac\x79\x62\x4b\x40\x6d\xe6\xfc\x16\x01\x7b\xa7\xf9\xa5\x8c\xea\x21\x10\x61\x86\x17\x82\x56\xeb\x7c\xc3\x40\xfd\xfa\xd6\x3e\x0a\x72\x28\x2a\x4d\x52\x76\x21\x92\x91\x08\x22\x40\xff\x24\xaa\xa1\x38\x56\x5d\xa1\xcd\xd6\x79\x95\x69\x86\xe6\x40\x3e\x04\x40\xa6\xcc\x95\xb3\xb3\x9c\x9f\x92\x29\x49\x09\xe4\x18\x99\x81\xdf\x5f\x4c\x38\x65\xe5\x57\x75\xc0\xf8\xa7\x38\x47\x21\x1d\x8f\xc5\x5f\x62\x04\xd0\x25\x0e\x52\x96\x41\xe6\x94\x54\xc0\x05\x3a\x14\x88\xcc\x44\x7a\xc3\xcd\x75\xb3\x24\x3d\xe1\x02\x6c\x69\xb2\x19\xff\xef\x2c\x2c\x4b\x7c\x2d\x30\x92\x92\xb0\x8b\xb2\x3c\x25\x79\x30\x25\x99\x5a\x99\x9c\x99\x55\xec\x3b\x64\xa5\xbe\xf7\xe2\xb1\x31\x66\xde\xae\x75\xb7\xa6\x2a\xbe\x69\xb7\x30\xd7\x6e\x46\x30\xea\xac\xca\xa1\xbb\x11\x19\x33\x49\x1e\xe4\xcc\x80\x63\xcc\xec\xae\x7e\xe4\x25\xeb\x1f\x1b\xf3\x66\xb8\xf2\xb1\xd1\xa0\x36\x7d\x6c\x14\xe0\x4e\xb3\xbd\x91\x4b\x45\x33\xb1\x5a\x9c\x35\xf6\xd7\x0b\x5c\x2a\x77\x4b\xe6\x2f\xd9\x14\xcb\x35\x73\xb1\xf9\x47\x51\xb4\x5b\xb1\xcc\xac\x98\xbc\xc7\xcf\x08\x10\xd4\x94\x44\x04\x67\x24\x84\x34\x48\x40\xc4\x41\x6e\x44\xc1\xb3\x01\xde\x34\xce\x7a\x36\xb8\xc1\xd7\xa1\x0d\x0b\x9a\xbb\xfd\x2c\x68\xbe\xdb\xb4\x72\xca\xb0\xa0\xb9\x4f\x18\x44\xd1\x6e\xc1\x2a\xe8\xc2\x82\xe6\x1e\x59\x80\x92\xdd\x7a\x59\xeb\xa5\x5f\x5c\x28\x15\xbc\x7c\x06\x09\xd3\x08\x0a\x38\x4f\x2f\x57\x4f\x3e\xaa\x20\xa6\x2e\xfa\x4b\xf0\xc4\x9f\xa5\xb3\xc9\x3b\xed\x76\x92\xb1\x79\x1a\x68\x56\x4e\x3d\x06\xee\x15\x5c\xc2\xe0\xb5\xb0\x02\x19\xb1\xde\x24\x1c\xf0\x4b\x7d\x24\x58\x42\x6c\x97\xb3\x64\xa5\xd7\x97\x59\x31\xc7\x5a\xa5\xc0\xe7\xaf\x8a\x2d\x9e\xd4\x74\x4d\x44\x71\xa1\x6c\x06\x47\x1c\x98\xc2\xdb\x4d\x99\xf0\x88\x35\xcd\x10\x4e\x09\x08\xc6\x22\x4c\x43\x79\x23\x80\x70\x08\x8d\xe0\xae\x30\xcf\x73\xf9\x40\xd2\x5c\xa5\xb0\xf3\xd1\x12\x48\x01\xcf\xcf\x7d\xf7\x51\x3f\xc3\x85\x6f\xc1\xf9\xf5\xe4\xc3\x33\x8f\x73\x5d\xc7\x14\xa9\x4a\x25\xcf\x66\x5d\xbb\xe4\x9b\xdb\xcc\xba\x1e\xbd\x46\xd6\x97\x62\x50\x11\x4b\x96\x2c\x6d\xfd\x0b\x9f\x7c\xa9\x97\xae\xaa\x0a\xec\x49\xba\x35\x74\x89\x96\x78\x26\xd6\x0a\xf0\x1f\xfa\x43\x5c\x3e\x6f\xaf\xdc\x54\x2f\x9b\xaf\x53\x6a\x55\xe5\x9c\x98\x5d\x89\xff\xf6\x3e\xd3\x78\xe2\xd7\x00\x59\x8c\x53\x89\x84\x7e\x1d\x91\x26\x4e\x56\x59\xd0\xdc\xfe\xbe\xa0\xb9\xfb\xd1\xeb\x43\x94\xb8\x55\xdc\x1e\xa0\xc0\x54\xb0\x69\x97\x55\xcd\x2e\x56\x95\x0d\x65\x91\x9e\x1c\xfe\xe6\x5e\x47\x8a\x45\x83\xe1\x90\x30\xbf\x88\xc1\xa6\xd8\xda\x37\xf0\xdf\x28\x20\x21\x3c\x69\x25\xbe\x29\xd8\xfa\x07\x47\x24\xe1\x17\x52\x00\xef\xa0\x84\x2c\x10\xba\x05\xfd\x27\x8d\x27\xd6\x2f\x48\xbf\xdf\x12\x8b\x6f\xfe\x32\x75\x60\x4f\x1c\x27\x14\x58\x78\x77\xd4\x6b\xa4\x91\x94\xca\x50\xd7\xbc\xee\x3a\x12\x4a\xaa\x25\x2b\x0a\x5c\x8e\x4a\xe8\x44\x0d\xad\x3a\x2a\x2b\xac\x24\x52\x47\xc5\xa2\x0a\x5a\x70\xe4\x17\x94\x12\x81\x23\x54\x71\xfa\xdd\x1b\xbf\xfc\xb8\x64\x53\x76\x71\x04\xc4\x49\x2a\x08\x9c\xfc\x97\x8d\x6c\xb0\xdd\x13\xa7\x00\x1b\x8d\x0c\x4e\x12\x02\xa1\x32\xa4\x69\x8e\xf8\x5f\x8b\xc6\x2d\xd1\xb1\x29\x93\x42\xc2\xba\xd5\xb7\x44\x18\x1e\x39\x73\x1f\xeb\x45\x4a\xe6\xbc\x4c\x0b\x44\xcc\xbc\x7f\x5c\xfa\xe5\x70\xfa\x05\xd2\x65\xb3\xb5\xea\x2f\xa5\x71\x52\x75\x1a\xda\xb1\x4b\xdd\xb9\x7b\x0a\xdc\x85\x44\x88\x44\xe4\x5c\x22\xa8\x49\x29\xbe\xf2\x79\x00\xa6\x42\x3b\x5f\xbd\x6f\x19\x0d\x54\x0b\x3d\x10\xed\xa5\xc1\x43\x3f\xc0\x09\xcd\x71\x44\xff\x24\x3f\xd1\x34\xcb\x7f\x21\x79\x4e\xd2\x4e\x5b\xd1\xa3\xce\x87\x2e\x6a\x5b\x8c\x05\x7a\x8e\xfe\x5a\x9e\xf6\xd2\xd4\x37\x1e\x60\x16\x4f\x60\xb1\x0c\xcb\xf3\x49\x56\xc1\x12\x77\xaf\xb9\x98\x3b\x5d\x9b\x01\xea\x58\x2e\x27\x66\x19\xad\x0c\xac\xfc\x7f\xa2\x4e\x47\xe7\x63\x15\x6c\xd5\x97\x49\xc7\x7a\xa3\x38\xe2\xb5\x52\xb4\x56\x42\x68\x9c\xab\x75\xfb\x5c\xf9\x4d\xc9\x81\xbb\x49\x45\xe0\x9d\x49\x43\xeb\xf0\x54\x35\x0f\xcd\xa6\xf0\xca\xb9\xb2\x8d\x01\x76\x99\xaf\x0d\x80\x2d\xe5\x0c\xbf\x0a\xed\x57\xd3\x15\xb2\xb8\xe4\x55\xd5\x45\xab\x20\xe1\x92\x3e\x56\xd9\xd3\x22\xdb\x5e\x23\x97\x69\x0e\x54\xf1\xf9\x5f\x85\xa4\x6d\xc5\x65\x11\xef\x99\xdd\xca\x14\x57\x06\x1e\x77\xbb\x85\x71\x17\xa6\x09\x15\x5f\xf1\x70\x8a\xe7\xf5\x6e\xa1\x0b\xab\xb2\x3b\x9a\x15\x0b\xb3\x3b\x99\xc5\x75\xf1\x44\x50\x9b\x38\x9a\xc9\xa6\x58\x4b\x4b\x1c\xb6\xea\xbe\xdd\x16\x05\x46\x07\x82\x23\x8d\x3b\xe8\x08\xfd\xf5\xf9\x99\x7a\x1b\xcb\x85\xb0\x8d\x32\x6d\xe3\x3c\x91\xf3\xb7\xca\x4c\xce\xfb\xea\x48\xb8\xf4\xb7\x32\x13\x30\x21\x21\x21\x42\x2a\x64\xfb\x35\xf4\x95\x05\x5b\x5f\x59\x76\xd8\x6a\x07\x02\xe2\x9e\xf2\xfa\x11\xc1\xe7\xba\xfa\x3d\x29\x25\xb0\x8c\x5f\x39\xeb\xe8\x9a\x08\xe9\x11\x0a\x4d\x58\xc9\x80\x8f\xa4\x83\x86\x5a\xa5\x8a\xa4\x97\xab\x85\x06\x90\x8e\x70\xe8\x73\xa7\x2d\xfd\xd5\xb6\x92\xf2\xf4\xf1\x17\xcd\x43\x7f\x0d\x2e\x68\xd7\xef\x25\xb6\x55\xa7\xb7\x9b\xe7\x82\xb6\xf3\x32\xab\xf3\x32\x2b\x0f\x68\xf1\xf8\xeb\xf5\x94\xda\xdb\x43\x27\x0c\x5d\x10\x14\xb2\xb8\x95\xa3\x29\x3e\x27\x08\xc7\x97\x3a\x53\x03\x4a\x52\xca\x52\x0a\xf6\xa9\xd9\x9c\xf4\xb7\xe3\x9e\x53\xe1\x4f\x53\xf0\xda\xe1\x5f\x7b\x24\x0e\x1b\x05\x96\xaf\xf1\xc6\x79\x80\x5a\xc9\x02\xb5\xd0\x83\xb2\x8f\x7b\x68\x5f\x54\x28\xba\xe4\x0c\x84\x4b\x8e\xed\xe3\x81\x03\xfb\x72\x74\x62\xb1\x2f\x85\x6f\xc3\x11\xc1\x89\x2c\x38\x34\x96\x37\xde\xa3\x83\x4d\xfb\x6d\x94\x04\xa7\x2e\xb1\x0e\xb9\x13\x62\xd9\xdb\xe8\x9f\x21\x8c\x56\x3c\x33\x13\x19\x7d\xc2\xb7\x36\xb9\x06\xcb\x92\xad\x29\xf0\x57\x57\x61\x5b\xa1\xbf\xaa\x14\xd7\x57\x53\x59\x2f\x53\xcc\xaa\x70\x6b\xfd\x19\x4e\xda\xc6\xef\xc9\x44\xec\x15\xc7\xb8\x90\xd1\x7f\x49\xf8\x3b\xd5\xaa\x24\x50\x5e\xb3\x20\x68\xa5\x91\xb8\x04\x69\xb2\x35\x6f\xb5\x91\xef\xc4\x20\xae\x10\xf5\x4e\x01\x10\xff\xd6\xc5\x3e\x54\x9a\x3f\x19\xed\xcb\xd7\xfd\x49\x5c\xff\x32\x2a\xc0\x3b\x41\xf6\x6e\x83\x36\xca\x7e\xd7\x6e\xe6\x79\xa6\x42\x00\x99\x57\x9a\x8a\xd9\xb3\x9d\xc7\xda\xe3\xdd\x63\x6d\xf7\x58\xdb\x3d\xd6\xb6\x1a\x12\xe4\x9d\xce\x60\x55\x85\x13\x83\x92\xba\x75\x9d\x98\x5a\x5f\xef\xb3\x6f\x1b\x8f\xb8\x82\x67\xbb\x4e\x92\x57\x1a\x0f\xe1\x61\xfd\x2b\xcc\x54\x10\xff\xdb\x1f\x34\xa8\xbb\xe4\xc5\xb6\x7b\x41\x7d\x25\x2f\xa8\x5a\xd7\x0a\xfd\x64\xba\x00\x91\xc7\x88\xa0\x8b\x14\x27\x89\xc8\x0e\x89\x91\x49\x99\xe7\x6f\x29\xfa\x09\x1c\xa8\xb3\x1c\xc7\x01\xe1\xb0\x70\x8e\x02\x1c\x73\x08\x73\xbd\x2c\xbc\x40\x64\x1d\x40\x38\x46\xd3\x03\x68\x40\x70\xc8\xd1\x04\xeb\x89\x84\x34\xc3\xa3\x88\x18\x52\x54\xeb\xd3\x51\xfa\x20\x84\x00\x7e\x5f\xe0\x39\x58\x18\xba\xae\x5a\xf8\x72\x1d\x26\xe0\x85\x4e\x6f\xc3\xb3\xb2\xb8\x86\xdf\x9b\xad\x3b\x6a\xf6\x06\xb4\x6f\x3b\xdf\x9a\xf5\x2f\x20\x38\x47\xa8\x95\x43\x10\x49\xf3\x04\x74\x4c\x2f\xfd\x67\x17\x60\xd4\xee\xd1\x75\xa7\x1f\x5d\x8d\x00\x16\xcf\xd4\x32\x75\x6d\x51\x47\x29\x90\xa9\x44\x51\x59\x42\xfa\x40\x89\xb7\x41\x35\xdd\x3b\x89\xf5\xea\x15\x28\x62\x9d\x6e\xe7\x0d\xf8\x64\xf7\x06\xdc\xbd\x01\x77\x6f\xc0\x6d\xbd\x01\x77\xcf\xb3\x95\x9e\x67\xd0\x50\x3c\x8d\x20\x8b\x55\xd9\x53\xe9\xd9\x92\x8c\xfc\xe2\xe9\x34\xf4\xe3\xcf\x15\x43\xc9\xf9\xcf\x3c\xa9\xf2\x52\xfd\x9b\xe7\xdd\x92\x12\x3b\x53\xf1\x98\xa6\x59\xde\x03\x76\xc0\x09\x37\x27\x3b\x79\xc7\x92\x23\xd5\x58\x39\x00\xed\xde\x76\x5f\xd5\xdb\xae\xf4\x31\x24\x55\xc4\x85\xe7\xd0\x92\xd7\x4e\xa3\xd7\xd2\x96\xb4\x63\xd6\x7b\xc6\x7f\xe6\xdc\x16\xed\x98\xf5\x9a\xb0\xdf\x11\x72\x33\x76\x2f\x89\x3b\xfd\x92\xd8\xbc\xfa\x46\xe5\x08\x30\x8c\xbb\x0a\xea\xbf\x1d\xd6\xfd\xe9\x8e\x75\xbf\xcb\x11\xd9\xb7\xfa\x8e\xd8\xb1\xee\x3b\xd6\x7d\xeb\x9a\x95\xaa\x5b\xfc\x73\x57\xb2\xf6\x46\x56\xdd\xcf\xe6\xa3\x29\xc1\x9c\x47\x36\x16\x1c\x01\x8b\x58\xaa\xd4\x2f\x09\x8e\x48\x9e\x93\x7e\x4e\x16\x79\x5f\x44\x13\xc5\xe9\xa5\x6f\x2c\x37\x30\x16\x19\x3b\x76\xfa\x6b\x67\xa7\xdf\x91\x45\x91\xa5\xfe\xba\x0c\xce\x92\x1b\xc4\x50\xf3\xed\xd8\x31\xd5\x3b\xa6\x7a\x1d\xa6\x1a\x52\x54\x15\x18\x6b\xc8\x29\xb5\x15\xe6\xfa\xc9\xe0\x56\x33\xd7\xd7\xc2\x41\x6e\x81\x6d\xbc\x48\x71\xf2\x52\x18\xd3\x4b\x1a\x5b\xca\xf2\x1f\x54\x35\xa8\xe5\xee\xdc\xaa\x0e\x6f\xa8\x82\xb2\x95\x4e\xe6\xc9\x41\xb1\xee\x32\x36\x52\x04\x93\xb9\x61\x5c\xe4\xcf\x74\x32\x25\xe9\x9b\x34\x24\xa9\x49\xee\x54\x95\x84\xe8\x51\x63\xbe\xb2\x14\xec\x06\xf3\xba\xfc\xa0\x73\x5a\x54\x21\xf2\x7e\xe3\xb1\x5a\xb0\x36\x38\xc2\x57\x31\x3f\xaf\x24\x2c\x65\x20\x5f\x8d\x11\xcd\x00\x1f\x5e\xb2\x8b\xb8\xcd\x12\x61\x1c\x6c\x32\x75\x74\xba\x6a\xfb\xf9\xf9\x75\x03\x8b\x37\xc8\x57\x60\xdd\x75\x25\xe1\x22\x45\x4a\x80\x94\x64\x09\x8b\x33\x7a\x4e\xa2\x4b\x95\x1e\x41\xc6\x71\x47\xdf\xe1\x1c\xb1\x14\x8d\x48\xc4\x2e\xbe\x03\x26\x6f\x42\xcf\x49\x8c\xcc\x00\x39\xb4\xb6\x44\x3d\x88\x3c\xda\xca\x66\x2d\x08\xd1\x3f\x83\x0c\x78\x28\x24\xe7\x34\x20\x59\xa7\xcf\x6b\xfe\x8b\xe5\x34\x20\xc2\xbc\x04\x42\xc4\x0b\xfc\xe8\x41\x2e\x0f\x64\x30\x04\xa2\x18\x73\xf6\x11\xe7\x74\x14\x11\x11\xac\x32\x23\xe9\x39\x49\x51\x46\x43\x22\xcd\x50\x44\x38\x5d\x99\x9f\xb6\x24\x4f\xa0\x3e\x60\xfe\xb7\xb6\x61\xfa\xe4\x9a\xa3\xe7\x08\xa7\x93\xf9\x0c\xb8\xd5\x88\xc4\x93\x7c\x8a\xfe\x81\x06\xfc\xc4\xe9\xf2\xf7\x83\x0f\xc0\x82\x68\x69\x04\xfa\xde\xfd\xc8\x8f\xa1\x59\x1a\xe1\xe3\xc9\xdf\x1a\x9a\x2d\x33\xc6\xf4\x26\xb9\xb3\x7c\xd2\x00\x4a\xd9\xd8\x5c\x44\x06\xc1\xe1\x21\x03\xe5\x77\x7f\x5a\x16\x43\x8b\x9a\x26\x1f\xd7\x23\xe9\x56\x73\x82\x36\xba\xe9\x9b\x1a\xf0\xb6\x6f\xe1\x6f\xa7\x6d\xc6\xda\x95\x1c\x30\x04\xc4\x07\x66\x50\x8c\x4d\x67\xc1\x86\x7f\xfc\x09\xac\xc5\x02\x7a\xb9\x6a\x6a\xf9\x10\xfb\x40\xc0\x38\x24\x43\x82\x64\x0a\xf8\xca\x3e\x5b\xa6\xcf\x96\x59\xe0\xc2\xf8\x43\xe7\x82\x12\x4b\xe5\x5d\x43\x56\x2a\x5f\xb3\xf2\xc5\xbc\x94\xee\x42\xc9\x9d\x74\xd7\xde\x02\xd5\x69\xfb\x43\x81\xf6\xf2\x9d\x5b\x64\xb7\xfc\xee\xb6\xc3\x28\x0d\x6f\x66\x6e\xe1\x73\x1a\x56\x67\xa2\x7b\xb2\xff\xc5\x93\x0b\xc3\xf8\x6e\x40\xd2\xd0\x27\xfb\xb7\x9a\xd1\xdd\x25\x0d\xdd\x19\x80\xec\xa4\xc8\x9b\x36\x85\x57\x69\xda\x86\x05\xf1\x2a\xe4\xdf\x7b\x4b\x32\x92\xa3\x51\xca\x2e\x32\x92\xaa\x31\x89\x1e\x54\xce\x3d\x91\xb9\x4d\x65\xd7\xb3\xcd\xda\x4f\xa6\x29\x8d\xcf\xb4\xa4\x56\x1a\x94\xaa\x79\xa9\x11\x8c\x70\x70\x36\x49\xd9\x3c\x0e\x8f\x2b\x85\xc0\xa1\x20\xa2\x36\x1c\x1a\x67\xa4\x60\xd2\xff\x0b\x19\xe7\x47\xe8\xf1\xbe\x5d\x31\x12\x13\x5c\xa5\x3b\x68\xf2\xb2\xd8\x27\x1e\x65\x2c\x9a\xe7\xc4\x40\xb3\x52\x1d\xaa\x8f\x56\x4a\xbb\x3c\x67\x33\xcb\xcb\x20\x82\xd1\x95\xa7\xd3\xdb\x90\x69\x88\x19\x61\xe3\xc0\xfb\xb7\x43\xf8\x5b\x6b\x27\x2f\xd1\x43\xa7\x84\xa3\x71\x48\x62\x27\xd7\x84\xc4\x96\xc6\x8b\x52\xd7\x81\x88\x3c\x20\xf0\x8a\xa4\x42\x75\x61\x7a\x92\xe8\xb6\x8a\x8d\x3c\xc0\x6e\x12\x9c\x5f\xed\xae\x16\x48\xab\x82\x55\x25\xda\xbf\xda\x81\xd0\x0b\x52\x6d\x58\x2c\x13\x38\x9f\xff\xd2\x28\x0c\x29\xbd\xd4\x27\xf8\x75\x55\x59\xb8\x39\x37\xd5\xa6\xf3\x30\x06\xfe\x07\xf4\xa8\xa5\xe3\xda\x70\xc6\x66\xd0\x1b\x88\xb5\x37\x13\xa0\x58\x2f\xbe\xde\x97\xf5\x82\x13\x8b\x05\x16\xab\xbe\x1a\x04\xb1\x1b\xdf\x6b\x48\xe2\xb7\x71\xab\x56\xb6\xf6\xc0\x44\x79\xf1\x8e\xbb\x2e\x36\x74\x9e\x35\x56\x37\xb4\xa6\x69\xab\xe6\x71\xe9\xbb\x77\xc3\xde\x68\xed\x81\x52\x16\x00\xce\x7f\x19\x15\x41\x23\x1a\x79\x1b\x44\xf0\xcd\x62\xcf\xca\xa3\xb3\x81\x20\x66\xe2\xf0\xad\x66\x60\x2f\xf6\xb9\xc4\xb8\xde\xec\x82\x89\xf2\x25\x88\xb4\xfe\x2d\x49\xe9\x26\x6d\xee\x61\x38\x52\xbb\x20\xde\x65\xdb\x79\x2a\x3f\xdc\x3d\xb5\x76\x4f\xad\x1b\xfa\xd4\xb2\x89\x6e\xf9\x51\x2e\xd4\xac\x03\xae\x2b\xed\xde\x72\x77\xc1\x22\xa8\x21\x3c\xc9\x0c\x88\x98\x94\x57\x1c\x9b\x0d\x6b\xab\xfe\x06\x90\x47\x11\x9e\x7d\xda\xe5\x40\xbd\xfb\x92\x94\xce\x70\x7a\xf9\xde\x7b\x0d\xea\x90\x9b\xe2\xee\x43\xdf\xa3\xd6\x8b\xc7\x83\x41\x0b\x1d\xa1\xd6\x8b\xfd\xc1\xa0\xf5\x61\x99\x8f\x02\x8b\xf3\x9f\xf0\x8c\x46\x97\x47\x45\x4b\x28\xf3\xb1\x5b\x67\x07\x45\xe3\x64\x9e\xf7\x23\xbe\x98\xef\xc8\x42\x33\xdc\xbc\xf5\x09\xfd\x93\x94\x00\x4e\x16\xef\xd8\x5b\x32\x6b\x0f\x1f\x75\x0c\xe7\x1e\x93\x9f\xfd\xc7\xbe\x76\x88\x70\x9e\xe8\xb0\x4c\xc4\x4a\x3d\x2f\x47\x65\x96\xcf\xae\x4d\xd2\x94\x7f\xac\xb5\xe4\x82\x3a\xfd\x17\x07\x03\x57\x14\x20\xfc\xeb\x8a\x1d\x95\x4d\x5f\x55\xde\xf9\x50\x7c\x55\x46\x5f\xc5\x1c\xe4\x26\x43\x22\x47\x52\x9d\x89\x9c\x1f\x3b\x14\xb3\x50\x6a\x55\xd1\x8f\x14\xde\xa3\x18\x09\x38\x7c\x2e\x9c\xab\xc2\xe8\xe5\x9b\xd7\x88\x08\x8a\x83\x18\xaf\x50\xb6\xdd\xaa\x68\xd5\xfd\x76\xc8\xe2\x9a\xdb\x6e\xc3\xd8\xcc\xee\x5b\x10\x8b\x69\xb0\x6d\x39\x07\xd0\x18\x94\x4d\xd9\x3c\x0a\xd1\x88\xa8\x68\x87\x24\x44\x34\x46\x58\x1f\x58\x94\xe5\x38\xb7\xd4\xd7\xe6\x20\xaf\x2b\x60\xa9\xef\x38\x16\x44\xc6\xef\x56\x52\x9e\x75\xfb\x04\xba\x22\xce\x3c\xcd\xe4\x08\x68\xa6\xa8\x1f\x6a\xc3\x7f\x47\x97\xe8\xf4\x27\x96\xce\xfe\x99\xb2\x79\x72\x6a\x1d\x87\x8e\xa5\xbd\x57\xf4\xf2\x6a\xb3\x07\xe1\x12\x8d\x43\x1a\xe0\x5c\x2b\xd5\xd5\x30\x21\x45\xb0\x78\xc3\x9a\x8e\x55\xc9\x2a\xe2\x26\x3e\x99\x5f\x78\x7f\x4a\x02\x03\xc4\x6f\x91\x5f\x53\x5a\xc8\x7a\xc9\x93\x6d\xab\x22\xab\x68\xa5\xaa\xac\xa2\x70\xcd\x01\xa4\x0a\x55\x25\xc0\x0c\xa7\x06\x94\x98\x9b\x13\x36\xcc\xa9\x20\xcb\xba\x5a\xd7\x2e\x96\xd6\xa9\x93\x5a\x52\x84\xab\x88\xbc\x9a\x44\x8b\xd0\x13\xb7\x42\x47\x40\xae\x3d\x98\x09\xa4\xfd\x13\x23\xe6\x7f\xaa\x81\x81\x64\x4c\xec\xd8\x6c\x4e\xf9\x56\x1f\xb3\x38\x4f\x59\x84\x9e\xab\x7d\xee\xbb\x1f\x8c\x20\x4d\xc1\x40\xcf\x9d\xc9\x3f\xb3\x79\x27\xf8\x6a\xad\x9e\xfa\xa8\x09\xc3\x73\x67\x7f\xd4\x67\x71\x7a\x9f\x9b\x6d\x01\xbc\xa2\x63\xd4\x76\x07\xa3\x54\xaa\xfc\x8b\xa4\xbb\x66\x54\x9c\x9a\xea\x77\x68\xcb\xb6\x8a\xd0\xe3\x76\xa1\xe9\xed\x7a\xa6\x79\x06\x07\xb4\x9e\x51\x15\x64\x33\x65\x0f\xb0\xfc\x50\x01\xd7\x2c\x46\x15\x60\x6b\xb9\x3c\xc8\xea\x4b\x05\x68\xb9\x90\x55\x70\xd5\x3a\x7b\x40\xa1\xd8\x40\xfc\xfc\xe5\x45\xa7\xea\xb0\xa9\x25\x5e\x4f\x70\xaa\x4f\xbd\x5e\xd0\xf5\xe0\x08\xda\x20\x56\xaf\x89\x94\x14\x44\xf1\x59\x4e\x52\x9a\x9d\x1d\x37\x5a\xc3\xfa\x41\xf1\x45\x2c\x1d\xcb\x0a\x42\xd9\x7b\x0e\xf9\x6c\x6e\x09\x5e\x22\xa2\x75\x0d\xbc\xbb\xf7\x9c\x43\xd6\x34\xee\x67\x2b\x4b\x70\xdc\x32\x51\x5e\xac\x2e\x8b\x4b\xa7\x83\xbe\xb4\xfe\xdf\x7c\x7f\x30\x78\xfa\x9d\x50\x87\x99\xa8\x2f\xfa\xd2\xfa\x42\x46\xe5\x37\x84\x1d\x5c\x2b\xcd\x5e\x45\xfb\xc6\x49\xf6\xb6\xcb\x8e\xee\xcc\xf7\x6f\xb0\xee\xc0\xe6\x41\xee\xda\x3b\x68\xc5\x08\x43\xe1\x66\x54\x28\x8a\x79\xdb\x00\x28\xc3\xfe\x6d\x00\x98\x66\x20\x57\xd1\xee\x18\xaa\x5c\xa2\xdf\xb1\x68\x66\x0b\xde\x37\x2d\x78\x88\x98\x36\x92\x1f\x55\xc4\x9c\xb7\x71\xf9\x96\x23\x5b\x00\xad\x6f\x1b\x71\x24\x36\xa2\x0e\xd2\x63\x01\x85\x90\xfe\xb5\x25\x95\xd0\xc1\xcd\xb2\x9e\xfc\xc2\x3a\x9e\x1b\xa5\x71\x99\x10\x5e\x9c\x33\x4e\x24\xde\x8c\x2b\x86\xf0\xa4\xa2\x7a\x9d\x52\xc1\xad\xe9\x6a\x3d\x8e\x71\x14\x1d\x4f\x49\x70\x56\x35\xe7\xa7\x15\xf5\xeb\xa6\xea\x41\x36\x10\x80\x47\x03\x8e\xab\xaa\xbb\xe1\xa0\xac\x76\x6d\x67\x16\x50\xa3\x33\x62\x59\x46\x47\x11\x39\x66\x71\x96\xa7\xf3\x20\x67\xe9\x5b\x60\x60\x2b\xfb\x1d\x2e\x6f\x5b\x37\x8a\xea\x0e\x35\x5c\x1a\x4f\x49\x4a\xf3\xea\xa9\x17\xab\xd6\xf5\xa8\xc1\x6d\xd7\x43\xea\x3a\xd4\x68\x21\x19\xb1\x79\x1c\x54\xe9\x70\x0e\xf7\x0b\x35\xeb\x3a\x50\x75\xdc\x19\xff\x78\x4e\xe2\xfc\x17\x9a\xe5\x24\xae\xb4\xd3\x3e\x78\x58\xd3\x66\xe9\x92\x39\xb5\xef\x94\x8a\x30\x65\x17\x99\xd0\xda\xa0\xe7\x68\xff\x60\xa9\x02\x0c\xac\x3d\x2d\x05\x94\x65\x9f\x98\x92\x08\xe7\xf4\x9c\x33\x87\x7b\x7b\x68\x44\x02\xcc\xaf\x14\x10\xfa\x4f\x71\xc8\x2e\xd0\x14\x67\x35\xf6\x8c\xbe\xb5\x22\xbc\xd9\xf8\x05\x8e\x53\x82\x55\x77\x4e\x25\xd1\x4e\x19\x98\xda\x65\x29\xc9\x40\x6f\x65\x9b\x8c\x8e\x19\xb0\x0a\xf2\x6c\xc9\x42\xa3\x9f\x92\x8f\xd2\x79\x9a\xb1\xb4\x50\x6d\xc4\x16\x27\xf4\x4f\x11\xd9\x4b\x98\xa3\xf6\x46\x4c\x05\xeb\xb2\x15\x5f\x85\x76\x45\xd3\x55\x36\xcf\x79\x0b\xb7\xd0\x18\x8d\x1e\xc9\x5c\x7e\x09\x4e\x39\x5f\xac\x16\x42\x2c\xe1\x91\x76\x09\x28\xce\x6f\x6f\x0f\xbd\x91\x71\xc9\x10\x8e\x32\x86\x62\x42\x42\xa1\x63\x99\x92\x94\xf0\x7f\x53\x32\x63\xe7\x62\x4b\xc8\x22\x4f\x31\xdf\x7d\xd5\x16\x87\xb2\xb2\x5a\xf2\x0c\xd1\x18\xfd\x44\x53\x32\x66\x0b\x61\x8a\xab\xc2\x9e\x1d\xa1\xd6\x94\x86\x21\x89\x4d\xcf\xff\xa6\x19\x1d\xd1\x88\xe6\x97\x76\xb7\x34\xb4\x3b\xe3\x80\x11\x87\x8c\x58\x8c\x68\x82\xc3\x4c\x38\x32\xe9\xa6\x3e\xdc\x6a\x5c\xd1\x7b\x6e\x45\x5f\xbb\x98\xd2\x9c\x9c\x24\x38\xe0\xeb\x92\xa4\xa4\x77\x91\xe2\xa4\x25\x9c\x21\x36\xa0\xc6\xbb\x8d\xda\x2c\x1f\x8a\xa4\x01\xff\x16\x9c\x5a\xd5\x70\x62\xf2\x66\xcc\x57\xa4\xfd\xbe\xbe\xab\x2a\x00\xf1\x7c\x36\x22\xe9\x87\xce\x92\xb1\xac\xae\xd2\xf1\x41\xb0\xf8\x78\x8a\xe3\x49\xf5\x54\x38\x05\x75\x41\xfc\x0b\xc6\x86\xd8\x18\x08\x1f\xdf\x31\xa9\x08\x42\x17\x53\x12\xa3\xd9\x3c\xca\x29\x3f\x9d\xd2\x9b\x0e\xd1\x0c\x65\x24\x87\x63\xe1\xf8\x53\xf2\xd6\xd7\xbd\x82\xaf\xf1\x82\xce\xe6\x33\x14\x6f\x70\x0e\xaf\xf1\xe2\xba\xa7\xf1\x5b\x26\x75\x4f\x89\x7c\x54\xf0\x91\x25\x38\xcb\x10\x46\x29\x19\xa3\x40\x65\x7c\xe5\x03\x9e\x12\x14\xc3\xa5\xa2\xc9\x92\x52\xad\x9a\x79\xa8\x2f\x6f\xc9\x78\x05\x4c\xf0\x91\xe9\xfc\x7a\x0e\x05\xd0\x22\xe9\x55\x2b\x87\x80\x7a\x08\x2e\xf8\x18\x47\x8e\xaa\x58\xfa\xa9\xbe\x53\x13\xb7\xac\x4f\xda\x1f\x81\x76\x7d\xeb\x79\x85\xc2\xeb\x54\x33\x98\xe6\x6d\xaa\x40\x74\x51\xa1\x1d\x08\x80\x35\x5c\x55\xb1\x6d\x7b\x99\x4a\x7b\x31\xfd\x33\x27\xb3\xa4\x8b\x3e\xe6\x53\x9a\xc1\x73\x3d\x97\x1f\x8d\x74\xda\xbc\x24\xcc\x18\x44\x75\xd5\x41\x47\xb6\x19\xb3\x14\xb5\x01\x6a\x04\xba\x3f\xdf\xa7\xb6\xcb\x4b\x38\x2d\x7e\x91\xa6\xf8\xb2\xcd\x6b\x75\xba\xe8\xe3\x19\xb9\x44\xcf\xd1\xe0\x99\xf8\xeb\xef\xd0\x5a\xfc\x78\xf0\xc0\x68\x2b\x78\xd3\xf7\xbc\xf0\x83\x0d\x59\x94\x94\x79\x4b\xf2\xb9\xf0\x37\x3e\xcc\x50\xfc\x31\xa5\x99\x7a\xf5\x57\xbf\x1d\xfc\x49\x2a\x71\xb0\x9a\x6c\xff\x23\xbf\x5b\x72\xf6\xf1\x23\xfa\xf4\x49\x00\xf3\x5e\x78\xc5\xad\xea\x74\x40\x0c\xd0\xe7\x77\xcb\xa5\x14\xa2\xbc\xe7\xe0\x3f\xf4\x03\x16\x07\x38\x6f\xf3\xd9\x75\x20\x29\x2e\x2f\x56\xff\xf6\x41\x85\x2d\x2f\x2f\xfb\xaa\x8c\xe7\x51\x24\x6d\x63\x64\xcd\x29\x8e\xc3\x88\xbc\x05\x56\x42\x4d\x52\x33\xe1\x66\x44\x06\xe9\xc8\xb9\xe5\x7f\x8c\x54\x7f\x97\x71\x20\xb8\x1f\xfe\xfe\x3d\x01\x36\x45\xd6\x7c\xa6\xfa\x1b\x3e\x7a\xd4\xf1\x7b\x1d\xbf\x02\xb5\xb3\x8d\xd4\x31\x0b\x89\x0f\x9e\xca\x5a\xfc\xdb\x33\xe5\x3e\x30\x96\x5b\x23\xf3\x6a\x59\x04\xa0\x63\xc5\x49\xad\xa8\x22\xba\x51\xb0\x3e\x97\xaf\xc9\xf8\x84\xc6\x93\x88\x70\x32\x2a\xa6\xb4\x74\xa0\x59\xb1\x81\x19\x73\x09\xfc\x86\x50\x97\xc2\x12\x57\xa0\x03\xa8\x74\x9f\x80\xbe\x71\x8e\x9e\x7f\xec\xe7\x38\x9d\x90\x5c\x14\xca\xa3\xe8\xe8\x01\xed\xb5\x93\x2d\x5d\x9d\x20\xe8\x69\xac\x21\xda\x0b\xbf\xb7\xe7\xd9\xd1\xd0\x0c\xc5\x2c\x07\x05\x71\xca\x22\x50\xa8\x5d\x10\x60\x14\xc1\x6a\x26\x09\x85\x3d\x02\x3c\x14\x22\xce\xbf\x42\x97\x7d\x6f\x27\x45\x47\x7a\x22\xd6\xb4\x9e\xf9\x35\x97\xe1\xa4\x3e\xf9\x45\x64\x52\x4c\x45\x15\x26\xa9\xef\x05\x78\x7a\x6f\xc8\x2c\x51\x52\xd1\x26\x34\xc3\x22\xa4\xc2\x07\xfb\x9e\xa2\xe4\xb6\x94\xa4\x8c\x98\xbf\x17\x23\x3c\x23\x9c\x73\xd6\xab\xfd\x3b\x8d\xa2\xd7\x6c\x1e\xab\x37\x88\xbc\xd8\x34\x7a\x14\x2b\xb6\xcd\x5c\xf7\xf6\xd0\xdf\xe1\x60\xfe\x83\x3f\xfd\x48\x90\x67\xae\xc1\x5a\x86\x68\x2e\x83\x29\x64\xe2\x45\x91\x25\x2c\x86\x6d\x6c\x41\x47\x2d\x03\x28\x63\xe2\x9e\xa7\x22\x35\x48\xc0\x2f\x04\xce\xa2\x80\x4d\x43\x3e\x25\x97\xfc\x31\x80\x42\x9a\xe6\x97\xb2\x91\x83\xa8\x05\x0c\xfc\xf4\xc9\x2e\xb3\x79\x59\xfe\xa9\xd5\x7a\x66\x43\xc9\x48\x7e\xc2\x29\x61\xdb\xec\xa2\xa2\x84\x82\x07\x6c\x5b\xb0\x38\x27\xd4\x41\xdf\x59\x8f\x61\xb5\xab\x1d\x4b\xab\xad\x82\xc9\x79\xeb\xfd\x92\x86\x8d\x96\x5b\xd5\xb3\x56\xbb\x1a\x59\x39\xb5\x6e\xd0\x37\xdf\xc2\xb7\x24\x20\xf4\x1c\x44\xb4\x59\x93\x2d\xb7\xeb\xb7\x63\xb2\x10\x42\x75\x33\x28\x7e\x20\x74\xb1\x5c\xfa\x6f\x9e\x97\xef\x87\x5c\x4a\x53\x5d\xf2\x94\x1d\x68\x51\xbe\xd0\xfc\xb3\x7d\xb8\xea\x17\xa1\x8b\xcc\x10\xbd\xb3\xb6\x64\x5d\x7e\x8b\x67\x4d\x4f\x81\xac\xea\xef\x8c\x7d\x41\xf6\x03\x1c\x07\x24\x6a\x57\x6f\x4a\xd9\x14\x2a\x3a\xaf\xa1\x4f\x7a\x04\x9c\x29\x4a\xe4\x43\xb4\x24\xd2\xc8\xd0\x8d\x34\x32\xac\x8b\x34\x32\xfc\x80\x8e\xac\xed\x73\xe9\xbd\x75\xcb\xdc\xbf\x8f\x4a\xaf\xb2\x65\xb4\x7d\x6d\xba\x6e\x5d\x38\x05\xec\xfa\xa6\xca\x06\xc5\xe0\x8c\x7b\x1f\xb8\x97\x15\xf0\x3b\xe8\x7b\xd4\x6a\xa1\x23\x74\x02\xbc\x79\xdb\xaa\xd1\x31\x57\x86\xbe\x09\xc4\x9a\x1b\x69\x8e\xa2\x41\xfe\x72\xf4\xb3\x80\xcf\x56\x54\x7a\xe6\x34\x8e\xc9\x85\xd7\xb6\xac\x85\xbd\x98\xff\x9c\xe3\x34\xa4\xf1\x04\x38\xe1\x3f\xb2\x90\xcd\xba\x9c\x46\xa6\x04\xd9\x6d\x10\xcd\xe2\x16\x7f\x31\x91\x4c\x3d\x7d\x14\x80\x13\x42\xd0\x34\xcf\x93\xec\x68\x6f\x6f\x42\xf3\xe9\x7c\xd4\x0f\xd8\x6c\x2f\x9f\x25\xe7\x38\xdd\x03\x88\x7b\x90\xaf\x3a\xdb\x1b\x0e\x86\x0f\x9d\xb5\xb7\x86\x6b\x23\x8f\xbb\xd6\x82\x39\x2e\x5d\x2f\x0e\x43\x1e\x72\xf7\x7c\xa3\x7f\xe8\xd3\x6f\x51\x58\x17\xae\xbd\x56\xaf\x71\x3e\xed\xcf\x68\x5c\x01\xed\x3b\x6b\x57\xba\xa6\x61\xf9\x26\x16\xe1\xe2\x85\x99\x69\xd7\x02\xd5\x79\xe6\x4e\xc5\xf0\xcf\x7d\x71\x57\x00\x12\x9a\xee\x4a\x50\xb0\x78\xcb\x20\x9b\xe7\x56\x4d\xad\xaf\x9f\x9d\x51\xdb\xff\x96\xd0\x14\x71\xd3\x56\x50\x11\xf1\xb1\xed\x92\x8c\x8f\x8a\x66\x98\x03\xd5\xb5\x7a\x37\x56\x94\x1f\x4b\xcd\x28\x91\x17\x96\xf2\x63\x85\x1d\x25\x42\xae\x34\xc9\x54\xb5\x4b\xed\xda\x8a\x6f\x32\x35\x55\x89\x5d\x0b\x24\x1a\xba\x06\xff\xe5\x7f\x7d\x8d\x17\x6e\x85\xd7\x78\x61\xd7\xb1\x38\x7d\x53\xcf\x2a\xb4\xeb\x9e\xbb\x43\x3f\x2f\x8c\x79\x35\xf3\xcb\x8f\xa5\x11\xed\x9d\x0c\x5d\xd6\xe2\xf0\xdf\x6a\x09\xc0\xc4\x92\x5d\x64\xea\xdf\xd7\x78\xc1\xff\xb4\x86\xcd\x7f\x0a\x06\x4b\xf9\x26\xa3\xa6\x01\x9b\xf4\x84\x9a\x24\x4a\x16\x46\x78\x20\xd7\x3c\x42\x7f\x69\x4c\x2e\x1e\x8d\xcf\xb5\xc9\x94\x9d\x01\x94\x69\x5c\x8c\xeb\xf0\x5f\x48\x3c\x46\x8e\x50\xeb\x82\xc6\x70\x69\x22\x16\xbf\x95\x12\xee\xe2\x4b\xf5\x73\xa7\x69\xbf\x7a\xfd\x5a\x5d\x8f\xa2\x8d\x3d\xc0\x85\xe7\x5e\xe9\x79\x68\x12\xd6\x54\x10\x7c\x63\x6e\xa7\x86\xd0\x71\x70\x14\x8f\x5e\xc5\x21\x59\x1c\xa1\xde\xd0\xc7\xef\x23\xd4\x1a\xb6\x9c\x42\x82\xc3\x37\x31\xb8\xf7\xa4\x2e\x7a\xb6\x70\x4a\x71\x4f\x8a\xcc\x41\x6f\x30\x27\xad\x02\x7e\x1f\xa1\x56\xcb\x50\x9c\xad\x2c\xde\x17\x5f\x32\x9f\x50\x2c\x5d\x99\xea\x45\x75\x65\xe4\x55\xd4\x4c\xae\x2c\xfc\x73\xc5\xc5\xad\x32\xa2\x5c\x3a\xc9\x95\x16\x39\xd7\xaf\x46\x13\x72\xf7\x6a\xd3\x2e\x23\xee\x0e\x66\x88\x22\xb3\x3a\xd2\xfc\x73\x29\x3a\xc1\xfb\xd3\x5a\x54\x3f\x45\x3a\xbf\x26\x85\x19\xba\x24\x7f\xea\x45\xfc\xec\xde\xe7\x76\x21\x4b\xbd\x2d\xe9\xd4\x02\xb9\x12\x73\x22\xb1\xc6\xc3\x7b\x1b\x88\x36\xab\xba\x01\xab\x1f\x5b\xe2\xe9\x19\xec\x1c\xee\x7c\xb8\x77\x3e\xdc\x57\xf1\xe1\xde\xfb\x0e\x91\x2c\xa2\x71\xde\x93\xda\x34\xf4\x47\xb6\xe8\xe1\xe1\xf0\x72\x0f\x2c\xe2\x7a\x53\x9c\xf5\xf8\xc3\xe2\xbb\xbd\x9d\xbf\xf7\x2e\x81\xf7\xb5\x3a\x95\xcb\xab\x6e\x53\xbe\xdb\x9b\x74\x2d\xbf\x9d\x19\x30\x2c\xdf\x9e\x24\xc2\x97\x60\x6b\xc2\x19\xd6\xde\x38\x22\x26\x6f\x1c\x8e\xe8\x24\x7e\x95\x93\x19\x67\x24\x03\xc2\xd1\x40\x7f\xd3\xc6\x2d\x10\x71\xd5\xfa\x00\x71\xd8\xc0\x34\x64\x92\x92\x4b\x34\xa5\x93\x69\x64\x3d\x5b\x7f\x27\xa3\x33\x9a\xbf\xc3\xc9\xcf\xea\x43\x69\x64\xb3\x80\xcd\x66\x2c\xee\x5b\xd6\x2b\x6e\xc8\x37\x11\x3b\xad\x37\x3c\x70\x8b\xdf\xaa\x17\x46\x49\x82\xbe\x7d\x3e\x34\xed\x85\x9b\xb2\x0b\x25\x02\xc1\xb0\x6e\x6c\x8c\x52\x1c\x52\xb6\x07\xb2\xe5\x11\x5b\x48\x21\xfc\x3d\xd4\xdc\xf9\x5b\x86\x7f\x73\xdd\xfb\xf4\x4a\xa9\xb8\x9d\x36\x60\x20\xad\x06\xea\x3c\x23\xe9\x09\x89\x48\x90\x2b\x7b\x1c\xc3\xa6\x6c\xc6\x83\xdc\x4f\xda\xad\x65\x6f\x38\x49\x08\x4e\x33\x94\x41\xf7\xb6\xe3\x26\x2c\x48\x8d\x71\xc5\x72\x7d\x36\x98\x5f\xd4\x1b\x9b\x94\x68\xf6\x6f\x9d\x89\xcc\x0b\x25\xbd\xd4\x76\x05\x5e\x6a\x73\xaa\x13\x9b\x8f\x08\xc2\xe8\xf4\x2d\x47\xb8\xd3\x2e\xff\xf3\xe4\x82\xe6\xc1\xf4\x54\x38\x79\x9f\x1e\x4b\x1c\x3c\xb5\xbd\xbc\xa5\x9d\xf9\x5a\xbe\x0d\x57\xf5\x6b\xb8\x8a\x33\xcf\x55\x1c\x79\x36\xeb\x4b\xe1\x3a\xf0\xd4\x1e\x0b\xb1\x8f\x2a\x46\x9f\x3a\xd3\x57\xf2\x22\x5f\xd3\x58\x45\x68\xad\x4b\xfc\xfe\xe1\xc3\x6a\x86\x2a\xef\xa6\xc2\xf8\x85\x77\x21\xd2\xeb\x6b\x9f\xf5\x38\x88\x58\x46\xe3\x89\xf4\xef\x2e\x58\xc6\x48\x4a\x75\xcd\x9e\x4e\x6b\xe1\x9d\xdf\xb0\x31\xd2\x6d\xda\xb7\xaa\x88\x6e\xe5\xe4\x26\x5e\x95\xd2\x1c\x2b\x54\x19\xc3\x04\xc1\x56\x4b\x10\x48\x9c\x13\x50\xa3\xc0\x7b\x59\xe2\xab\xec\x34\xc1\x29\x9e\xa1\xbf\x04\xfd\xfb\x2c\x94\xf7\x80\x11\xe2\xaf\x8c\xcd\xd3\x80\xe8\xb0\x22\xb2\x07\xb7\x2d\x47\x6a\x82\xe3\xcf\xea\x4e\x80\xe6\xa7\xf2\xc7\xa9\x94\x81\x4a\x08\x19\x50\xb4\x7b\x57\x30\xb0\xe3\xc0\x1d\x90\x25\x87\xa0\xde\xd4\xca\xce\xc5\xa4\xd2\x0f\xa4\x2c\xe1\x38\x9f\x92\x24\xc2\x81\x8c\xac\x21\xc0\x6b\x7a\xac\xa9\x31\x8e\x43\x8b\x18\xbb\x16\x55\xf2\x3c\x83\xce\x4a\x2b\xb0\xc6\xe8\x92\xcd\xd1\x05\x8e\x73\xdb\x96\x8e\x9f\x2f\x30\x5b\x85\x43\x24\xcc\xb1\x9c\x18\x07\xd2\x89\xa8\x3e\xd4\x81\x5a\x73\x13\xd5\x00\x7e\x6f\x36\xa8\x41\xa0\x5d\xf0\x55\x48\x03\xf8\xbd\x52\x40\x03\x45\x98\xac\xa8\x9c\xa2\x40\x87\xf7\x01\x12\xa3\x03\x73\xf2\x5f\xea\x53\x6c\xa7\xb0\x8a\xed\xec\x55\x46\xe6\x5f\x2e\xf2\x2f\xd1\xdd\x5d\x3d\xf4\x01\xac\x70\x7d\xe4\x03\x58\x1f\x3f\xee\x81\x9a\x31\x84\x01\x05\xaf\xad\x2e\x6a\xc5\xb2\x8d\x2d\xa9\x37\x72\xf8\x55\x23\x21\x2c\x09\x66\x70\xcf\x51\x89\xca\x61\xf6\xdd\x0d\xab\x52\x8c\xae\x1b\x1f\xa0\xbc\x17\xcf\x99\xbf\x51\x24\x85\xcd\x86\x25\xb8\x5a\x10\x81\xc6\xee\xf0\xa5\x2e\xfe\xeb\x06\x2e\x85\xc1\x2b\xdc\x81\x1f\x57\xf2\x90\x2f\x74\x16\xb1\x58\xf7\xa5\x0e\x79\x61\x71\x8f\x50\xe1\x35\xa3\x1e\x03\xa5\x88\xa5\x49\x94\x67\xe0\xf5\xbd\x26\x5e\x47\xe5\x2d\xec\xe3\xef\x57\x01\x92\xf0\xe9\x13\x2a\xa3\x06\x7e\x5d\x4d\x25\x3e\x7d\x42\xa5\x04\xc2\x6f\xa0\xcd\x4f\x1c\x82\x61\x58\x2b\xb7\xb6\xa6\x6c\x9f\x3e\xe9\x3a\x02\xcb\xaa\x96\xb9\x4c\x7b\x66\xcb\x63\xb4\xee\x4a\x7e\x2b\x55\xa4\x09\x7a\xf9\xd9\x21\x9f\xf0\xb7\x1b\x74\xc0\xbe\x45\xbe\x54\x42\xbb\x6b\x79\x2a\xde\x21\x9f\x75\x75\x7b\xec\x5e\x75\x1b\x79\xd5\x7d\x19\x47\x79\xeb\xb6\xaf\x61\x6e\x1b\x47\x2e\x96\xfc\xc2\xee\xa9\xb5\xde\x53\xab\xe9\x3a\xc7\x1b\x3c\xc8\x16\x4b\xb7\x01\x0c\x38\x97\x36\x1d\xcb\x86\xe6\xc7\x37\x70\x2e\x80\x9b\x11\xb2\xc0\x1e\x92\x8e\x5c\x60\x17\x6e\x29\x80\xc1\xa3\x5b\xad\x0f\xbd\x91\x4a\xc2\x2d\x68\xfb\x7e\x06\xab\x8a\xff\xae\x54\xc5\x3d\x7d\x54\xa8\x5a\x07\x5c\xd5\xf1\x1a\x1d\x67\x55\x1d\x1c\x3e\x79\x5a\xac\xbb\xbc\x87\xe3\x6c\x17\x77\xf9\x6e\x64\xc8\xbc\x8d\x51\x76\xef\xcc\x45\xbd\x0d\x1d\xcc\xcf\xca\x4f\xdc\x4f\x16\xda\xb6\x83\xa0\x32\x30\xd7\x5a\xfe\x48\x59\x6d\x67\x6d\x74\x5f\x73\x7f\x2d\x10\x9b\x59\xf3\x1f\xec\x74\xae\x55\xa7\x26\x4d\xf1\xe5\x9b\x71\xfb\x4e\xcd\xb6\xe3\x6b\x14\x5f\x8d\x85\x7d\x9e\xcc\x2f\x9b\x09\xd9\x2d\x98\x81\xe2\x38\x44\xf3\x44\x6b\x7b\x84\xad\x9f\xc1\x96\x45\xf6\x5b\xb2\x5a\xbc\xdc\x35\x3b\xca\x66\xd7\xd4\xd1\x2c\xbc\xa6\x8e\xa2\xc9\x35\x75\xb4\x88\x36\xd9\x51\xc8\x2e\xe2\x1a\x74\x78\xc9\x2e\xea\x73\x1f\x6f\xae\xb3\x6c\x76\x8d\x9d\xcd\xc2\x6b\xec\x2c\x9a\x5c\x63\x67\x8b\x68\xc5\xce\x4e\x12\x12\xd0\xf1\x25\xba\x98\xd2\x60\x8a\xe8\x2c\x11\xb2\x06\x61\x2b\x22\xc2\xb3\xf7\x11\x6a\xfd\x91\xb5\x10\x15\x7e\x8d\xda\x08\xbd\x15\x64\x59\x0b\x5d\xb0\xf4\x2c\x43\x23\x92\xe7\x24\x05\x8b\x13\x91\x42\x5a\x40\x2f\xe4\x91\x56\x2a\x5d\xa7\x9f\xfa\x1b\xaa\xfd\x9e\xf7\x2e\xbb\xf3\x89\xdd\xff\xb0\x39\x98\x1a\xcc\x95\x8e\x4a\xeb\x9c\x41\x57\x18\x4c\x99\x50\xf6\x82\xda\xeb\x8f\xec\xd4\x9f\x61\x6d\xd2\x6b\xad\x52\x7c\x91\xa1\x53\x61\x67\xdf\xa7\x71\x4c\x52\xc8\x0c\x7c\xca\x17\x64\x1e\xe3\x73\x4c\x23\xb0\x23\x64\x52\x37\x09\xd0\xba\xa2\xe5\x85\x5e\x2f\xe1\xf9\x29\x81\x83\xa6\x6c\x96\xe4\x97\x9a\xe1\xe2\x3c\x58\x38\x4f\xd5\x58\xc7\x34\xcd\x72\x04\x1e\x76\x32\x74\xfe\xab\x18\x65\x6c\x46\x50\x46\xf3\xb9\x18\xfb\x25\x9b\xa3\x19\xf8\x15\x28\x3d\x1c\xc4\xd2\x8f\xd1\x94\xa4\x34\xcb\x69\xc0\x8b\x70\x92\xa4\x6c\x41\x67\x38\x17\x1c\x87\x18\xa2\xc8\x3c\x0e\x81\x81\x34\xe7\x17\x51\x3e\x06\x95\x55\xd2\xae\x62\x2f\x85\x6b\xe8\xc1\x87\x10\xa8\xf0\xf0\x73\xbd\xd2\xf3\x8c\xa4\x3d\x3c\x91\xc1\xfc\x0d\xf4\xde\x94\x6a\x13\x16\x70\xc0\x3a\xda\xdb\x0b\x70\x4c\x39\x92\x05\x6c\xb6\xf7\x1f\x19\xc1\x69\x30\x7d\x2e\x6a\xff\xe7\xfe\x60\x0a\xd9\xcf\xb5\x1d\x00\xcd\x29\x8e\x7e\xaf\x4d\x41\x2d\x62\x46\x38\x9a\xd0\xb7\x76\xf2\xf5\x29\x0d\x49\x66\x22\xa7\x8f\x70\x46\x42\xb3\x73\xc2\x24\xc8\x43\x12\x4f\x8f\x29\x9e\x46\x7e\x66\x40\x0f\xaf\xb4\x46\xd0\x29\xbe\xaa\x9e\xce\x85\xa6\xbd\x5a\xe8\x18\xb5\xfd\xfe\x39\xa7\xf2\x47\xd6\xf2\xf3\x21\xd7\xfb\x9c\xe8\xb7\xa7\xf1\x34\x11\xba\x15\xed\x63\xbd\x0a\x1c\xfe\xc4\x2c\x02\xfa\x7c\xef\x9e\xf8\xbc\x96\xe4\x7e\xa5\xe7\x8e\x10\x18\xc9\xde\x4a\xcc\xd7\x7d\x2a\x04\x74\x46\xf3\x41\x3a\xe3\x99\xe0\x56\xf4\x4f\xc1\x53\x98\x7c\x68\x13\xe7\xa7\xb8\x9f\xcd\x4f\x79\x87\x5a\xc0\xbc\x02\x75\x17\x59\x00\xbd\x02\x45\xd3\xeb\x52\xae\x89\x49\x6e\x47\xc4\xf4\xf8\x4a\x22\x26\x51\xb1\x2f\xeb\xf1\x95\x47\x7f\x93\xe3\xfe\x5b\xf9\x29\x3e\x7c\xf2\x04\x78\x78\x25\x3b\x10\xf2\x22\xf4\xb9\xe8\x0c\xf0\xe4\x4a\x23\x03\x45\x29\x4b\xab\xc4\x09\xfb\x0f\x3b\xcf\xa0\xce\xb7\xff\x7d\xf2\xe6\x5f\xa0\xf5\x4d\x49\x1f\xfe\xfe\xf4\x09\xb5\xcd\x2f\x3e\x25\xf1\x44\xa3\xe3\xcb\x23\xc4\xcb\xfa\xfa\x37\xf8\x2e\x16\xd6\xc0\xb2\x62\x95\xf5\xda\x34\xef\xa0\xbf\xd0\xde\x9e\x67\x9d\xde\x83\xa8\x44\x31\xeb\xcd\xe3\x79\x46\xc2\xde\x39\x4e\x33\x73\x0e\xbf\x75\x3b\x93\x91\x4f\xa0\xb4\x6b\x9c\x99\x3b\xcf\x34\x3d\xb4\x57\xef\xe9\x1d\x10\x1d\x9e\x91\xcb\x2a\x99\xd7\xc3\x87\x4e\xad\x3a\x69\x17\xff\x7e\x33\xa5\x91\xd7\xef\xb1\xb1\x55\x07\x94\xad\x08\x57\x2f\x70\x1a\x73\xce\xa3\x02\xec\x81\x5f\xb1\xd6\x01\x41\x54\xf1\x82\xae\x9a\xe7\x76\x15\xb2\x1d\x98\x39\x4e\x49\x94\x90\xb4\x52\xd4\x7b\x70\xa7\x42\x61\xde\x30\xa9\x2d\x2a\x7a\xf7\x8c\x23\x76\xc1\x9b\xef\xc9\xca\xbd\x73\x1c\xd1\xb0\x37\xa6\x11\xe9\xe1\x38\x66\x92\x61\x52\xde\x3e\x0d\xc7\x22\xee\x5b\xc5\x4c\x94\xce\xeb\xc9\xa3\xc6\x33\xb3\xa1\x6d\x41\xe8\x5b\x65\x50\xf3\xb9\xbb\xd6\x74\x9f\x57\x79\x2c\xf1\x11\xa2\xef\xd1\x5f\x9f\x9b\x4b\x5d\x2d\xc0\xdd\x9d\x70\xfa\xcb\x0b\xa7\xb7\xed\x8e\x60\x75\x2c\x6e\x71\x43\xa6\x26\x24\x26\x29\xce\xc9\x49\x69\x96\x48\x21\xe8\xd0\x31\xda\x8c\x43\x8f\xf2\x1e\xf9\xec\x98\x9c\x15\xe8\x76\x9f\xdf\xf1\xfd\x94\x84\xf3\x80\x58\xe1\xd9\x94\x3a\xf7\x8c\x5c\xaa\xa7\x92\x28\x7a\xdf\x62\x71\x74\xd9\x42\x0f\xc4\xe9\x91\x44\xbd\x1f\xe0\x84\xe6\x38\xa2\x7f\x92\x9f\xf8\x0b\xfd\x17\x10\x7b\x74\xda\xbc\xf9\x07\x13\x0f\xae\xc6\x86\x4e\x38\xd2\x8c\xac\x81\xf1\x7e\x00\x40\x57\x4e\x52\xfa\xec\xca\x71\x9c\x91\x4b\xf4\x00\xb5\x7e\x4b\x5a\xeb\x76\x30\x4f\x96\x83\xe7\x2f\x8c\xb5\x3b\x08\xd9\x45\xec\x77\x61\xbf\x3a\x45\x57\xcf\x64\xa8\x8e\xcf\xe2\x11\xe8\xb8\x79\x2d\xf7\xea\x2a\xc5\x8e\x67\xab\x45\x86\xf4\x9e\xf0\xc7\x59\xe6\xbf\xe2\xaf\x9a\x51\x8d\xef\xa5\x65\xb8\x6b\x52\x88\xf2\x27\xa5\xfe\xc0\x7f\xa8\x0f\xfc\x71\xa9\x3f\xf0\x1f\xda\xd1\x2b\xb4\x3e\xf0\x1f\xda\x2a\x6e\x62\x7d\xe0\x3f\x74\x1f\x91\xdd\x47\x64\x7d\x80\x47\xa8\xd5\x3d\xff\x69\x06\xe0\x7c\x14\x3f\xcd\x20\x9c\x8f\xe2\xa7\x19\x88\xf3\x51\xfc\x34\x83\x71\xfb\x8c\xec\x8f\x1b\x4e\xd1\x06\x27\xb5\x8b\x5a\x7c\x5d\xf9\xbf\x7c\x19\xf9\xbf\x7c\xd5\xc0\x30\x79\x22\xfe\xe5\x6b\x22\xea\x01\xba\x43\x4d\xf5\x97\x98\x9a\xa8\xad\xfe\x12\x83\xd6\x62\x96\xc6\xd6\x85\x60\x3c\x22\x79\x4d\x2f\xdd\x14\xbc\x44\x4c\x99\x10\x8a\xa8\x08\x55\xfc\x3e\x1a\xe8\x70\x97\x4b\xab\x42\x38\x2b\x28\xee\x4f\x71\xf6\xe6\x22\xd6\xcf\xa8\x56\x4a\xc6\xad\x4e\x17\xb5\x5e\xe3\x9c\xa4\x14\x47\xbd\xdf\x5e\x1d\xa1\x79\x9c\xcd\x13\xfe\xbe\x22\xa1\x12\x93\x52\x92\xa1\x54\xc4\x36\x0b\x91\x26\x76\xe5\x3d\xff\xc1\x68\xdc\xe6\xcb\xd2\xe1\x04\x03\x72\x30\xfe\x5d\x1c\x24\xb4\xf7\x8f\xd3\x7e\xab\x83\x8e\xd0\x39\xa3\x21\x1a\x3c\x2b\x33\x43\x7e\xff\x41\x84\x4d\x55\xc1\x4b\xa9\x08\x46\x4a\xd1\xdf\x2b\xa9\xb5\x98\x2b\xaf\xf3\xe0\x39\x1a\xda\xe1\x55\x47\x8e\xc2\xbd\xbc\xf9\x7b\x2a\x03\x96\xba\x0d\xcc\x19\x79\x6f\x41\x91\x14\xb6\xac\x81\x8d\xc7\x5e\x13\x81\x1e\x92\xd8\xd1\x31\x6a\xdb\xdd\x18\x13\x6e\xbd\x0c\xfd\x64\x9e\x4d\x95\xd9\x75\x49\xf7\x1d\x3f\xc3\x9c\x3b\x8a\x15\x21\x6a\xe4\x2d\x98\xa5\xf3\x03\xa3\x80\x55\x80\x5a\xe9\xfa\x03\x78\x1f\x56\x94\x12\x0a\xc3\x6f\x2b\x23\x59\xa5\x81\xb7\x18\xa7\x3c\xfb\xda\x12\x58\x13\xf1\xeb\x12\x24\x5e\xd5\x4c\x4c\x0f\x18\xec\xc3\x6c\x0b\x9b\x2d\x48\xed\x9e\x0e\x6e\xb5\x74\x67\x17\x28\xe3\x8b\x07\xca\xb8\xe5\x49\x54\xb6\x1d\x37\xe2\x6b\x13\xe1\x38\xc9\xe3\x36\x13\x9f\x02\x60\xed\x62\x54\xc8\x3b\x5d\xd8\xc3\xa3\x07\x28\xa4\xe7\xe8\x1f\xe8\x7e\xeb\xc8\x0a\xfa\x24\xc2\x3e\xbc\x63\xc9\x11\xea\x95\x47\x7d\x90\x55\x55\x4c\x65\xf8\x47\x25\x03\x39\xc9\x71\x6a\xf5\xb4\x24\x86\x44\x19\x84\x1f\xe3\xd0\x6f\x2f\x42\x53\x54\x35\xdf\x5c\x24\x87\x3a\x41\x50\x17\xc5\x2c\x9d\xe1\x28\x02\xdf\xd3\xd3\x57\x01\x8b\x7f\x98\xe7\x39\x8b\x21\xc0\x80\xd0\x8b\xdc\x00\x61\xd1\x26\x45\x37\xb7\x3f\x7c\x84\x1b\x0b\x57\x47\x2a\xe1\x23\xe7\x27\x02\xc2\xb6\x4b\x1b\x81\x1f\x29\xbc\x14\xb1\xdc\x4a\x6d\xe3\x80\x5e\xbe\x79\xad\x5c\xf7\x45\x28\x89\x32\xd9\xe0\x0d\x49\x10\xbb\x85\x3c\x99\x05\x83\x21\x2d\xb8\xa0\x99\xb5\x5a\x53\x12\x2b\xc7\x46\x74\x91\xe2\x24\xe1\xa5\x34\x46\x18\x59\xb7\x63\xc9\xca\xc9\x36\xa6\xd2\x0a\x06\x45\x7c\x77\x15\xd5\x10\x26\x39\x38\x64\x69\x0c\x3b\x95\x4d\xc1\x56\x44\x84\x60\x41\x2a\xf7\x95\x8a\x03\x71\x0a\x41\xec\xac\x50\x20\x26\x97\xd1\x12\xfb\xa0\x8c\xd3\x37\x48\xc3\x1e\x87\xad\x0f\x1d\x47\xc8\xe8\xc8\x18\xa1\x87\x17\x6a\x3c\xbe\xf4\x67\xad\x1c\xfb\x0d\xb2\xe3\x37\xf5\x58\xaf\xf6\x56\x2f\x6c\x88\xef\x93\x6e\xbe\xa8\x26\x7a\x0f\x54\x4d\x55\xb0\x51\x21\x8c\x9d\x0f\xbf\x32\x80\xab\x3f\x44\x5e\xa8\x46\xa3\xa5\x2b\x1b\x4f\xa8\xed\xaf\x6e\x93\x88\x8f\x9b\x4c\xa7\xee\x5c\xbe\x5d\x6b\x3f\x38\x45\x11\x18\xbb\x5e\x66\x74\xeb\x4e\xf6\xc1\x72\xfc\xaf\x4e\x96\xde\x91\x37\xbb\xe3\x30\xad\xfc\x9b\x35\x9e\x8b\xe1\x71\x02\x02\x09\x2b\xbe\x29\xe2\xde\xf7\x1b\x71\xff\x15\x81\xa5\x5a\x19\x09\x58\x1c\xe2\xf4\xb2\x65\x1c\x7f\xad\xb7\x3e\x42\x1d\x74\x54\x7c\xfc\xbb\x07\x79\x97\x80\x7c\x5d\xef\xd6\xdb\x91\x80\x7c\xb5\xfb\x68\x97\xbd\xfc\x46\x7b\x82\xef\xb2\x97\x97\x5d\x88\x1b\xf0\xce\xd6\x57\x6a\xf5\xde\x2f\xe5\x97\x3c\x67\x5b\x8f\xcc\x2e\xc9\x28\xae\x42\xa5\x97\x1c\xd7\x3a\xdb\xc5\xd5\xa4\xa8\xee\x90\x40\x94\xea\x16\x6d\x49\x9e\x3a\xdc\xc9\x53\x77\xf2\xd4\x1b\x2a\x4f\x4d\x76\xc1\x84\x9b\x05\x13\xfe\x89\xa5\xb3\x4a\x1f\xec\xe1\x4d\x13\xb9\xde\x6e\x79\x26\xc4\xb4\x1d\xb3\x74\xf6\x26\xa5\x13\x1a\x1f\xa1\x56\xce\x12\x14\x91\xb1\x1b\x19\x76\x6c\x07\x6a\xf8\xcb\x7b\xbc\x16\xb3\x18\x23\x80\xa0\x73\x4f\x23\x94\xb3\xc4\xfa\xb5\xb7\x87\x32\x88\xb6\x8b\x70\x94\x93\x54\xbb\x31\x65\x09\x09\x90\x94\x52\xf2\xdf\x33\x9c\x07\x53\x74\x4e\xb3\x39\x8e\xc4\xc7\x94\x64\xf3\x28\xf7\xc7\xae\x32\x4b\x47\x38\x27\xfc\x9e\x02\x8d\x68\xa9\x00\xf6\x21\xea\xa1\x21\xa8\xc6\x93\x45\x07\x65\x01\x8e\x48\x7b\xd8\x29\x06\xc1\x7d\x49\xe2\x8c\x1c\xd9\xc9\xe3\xf8\x7b\x96\xc4\x99\x18\xab\x92\x84\x09\x61\x88\x08\xc4\x04\x4d\x4e\xc5\xea\xf7\xd7\x1f\xe1\x7e\xff\x10\x3d\x58\x36\xc6\x6c\x9a\xd2\xf8\xac\x64\x17\xfd\x7e\x86\xfd\x43\x03\x64\xd0\x7f\x7c\xd8\xd1\x3b\xd4\x70\xe7\x71\x0c\x6e\x49\xa1\xd7\x99\xdc\x78\x31\x05\x53\x92\xc9\x47\x66\xbb\xa5\xc1\x3b\x59\x36\xc2\x79\x8a\xab\x5a\xaa\x6f\xfd\x6c\xca\xd2\x5c\x3a\x67\xc1\xff\x08\xce\x20\x43\x79\xb1\x8d\xf8\xc2\xff\x21\x6f\xe6\x26\xb7\x9d\x3d\x81\x86\xd1\x92\x61\x0f\x75\xd0\xb4\x2d\x8a\xc7\x33\x1d\xe0\x11\x90\x07\xc2\x8e\x9c\xee\xc4\xdf\x37\x4c\xfc\xed\x85\xe0\x35\x38\x27\x0f\x84\x4c\x3f\x5d\x19\x8a\xf7\x85\xaa\xb5\x9a\x4b\xa9\xea\x13\x5c\x44\x4c\x54\x41\x98\xc3\x95\xc2\xfd\x7a\xf3\x11\x5a\x2c\x2b\xa0\x70\x12\xe1\x4b\x13\x7e\x37\x4d\x41\x31\x83\x73\x2b\xa9\x36\x14\xae\xd0\xe3\xa9\xdc\xbc\x53\xe3\xed\x69\xed\x36\x1c\x00\x2b\xfa\xce\x69\x31\xc6\xaf\xf5\xf5\x78\x0d\x3c\xf0\x66\x2c\x02\x17\xcb\x7c\x7c\x72\xfe\x34\x43\x63\x16\xcc\x33\x7b\xff\x64\xc1\x8a\x4b\x1b\x02\xf1\xef\x8a\x15\xc5\xe1\x1f\xf3\x2c\x47\xe7\x9c\xc1\x0c\xe0\xe6\x12\x14\x1e\xbd\xe3\x5d\x43\xca\x58\xa9\x0e\x63\xa3\x1c\x43\x52\xc3\x73\x8a\x55\x6c\x4d\x34\x4e\xd9\x4c\xbb\x71\xea\x38\x92\x7a\x80\x42\xaf\xb7\x54\xda\x0e\x23\x2a\x78\xe2\xd2\x4a\x34\xa0\x71\x48\x03\x91\xd5\x10\xe7\xd6\x8a\xd1\x0c\x49\xf8\xd6\x22\xa9\x92\xab\x22\x20\xcd\xf8\x55\x36\x8f\xcf\x2c\x17\x73\x79\xb5\xd5\x00\x2e\x53\x17\xd4\x07\xab\x2d\xd3\x19\x58\x21\x3b\xcb\x03\xc7\xfa\x27\xd9\xaf\xa8\x3f\xf8\x02\xd1\x75\xed\x52\x1b\x06\xc5\x2d\x9e\x0b\x5d\xb7\xf8\x49\x1b\x90\xc2\xb2\x3a\x80\x45\x91\x9b\xb2\xc0\xa9\x20\x8a\xae\xaa\x89\xb0\x03\xd1\xfa\x2b\x07\x5a\x88\x72\x73\x51\x47\x39\x51\x9c\x17\xd8\x85\xc2\x04\xc0\x2e\x14\x46\x7a\x85\xc0\xb5\x02\x14\x7a\x6e\xad\x93\x1f\xb4\x56\x55\x29\x66\x8b\x2e\x8f\x1f\xab\x41\x16\x02\xc2\x72\x52\xf8\xe9\x93\x5f\x2e\x09\x4f\xc9\x17\x50\xcd\x91\x10\x54\x14\xcf\xec\x00\xb2\x62\xda\xbc\x0b\xbd\x79\xcf\xdc\x41\xab\x1a\x4d\x07\x6d\x20\xba\x43\x10\xe5\xcf\xae\x1c\xbd\x76\x23\x3a\x1b\xeb\x31\xd2\xf5\xe7\xb1\x16\x40\xc5\xe3\x76\xb5\x1e\x45\x63\xe8\x7a\x00\xe5\xd1\x92\x38\xb0\x1e\x8c\xd2\xf8\xbd\x6b\xc0\x31\xef\x99\xae\x83\x0e\xe2\x82\xa8\xd6\x43\xfd\xba\x46\x84\x60\x78\xba\x03\x15\xfa\xc5\x84\xd1\xae\x8c\x14\xdc\x0a\x71\x8e\x7b\xf2\x14\x1f\x21\xb5\x68\x65\xf6\xa5\x5d\xc3\x0a\x96\x90\x3f\x4f\x59\x56\xae\x87\xfa\x82\x81\x68\x1b\xf1\x6b\xe5\x6d\x9a\xf1\x91\x3b\x65\xca\x0d\x56\xa6\x94\x5c\x7a\x1b\xd0\x23\x6c\x36\x66\x2c\x30\xf7\x9b\x01\x55\x7a\x57\x6f\x64\x67\xe4\x0d\xb9\x99\x61\x4a\x96\x61\xa9\x16\x46\xf1\xd1\x4d\xe1\x2a\xd6\x78\x33\xa3\xd4\x2c\x4e\x3d\xac\x82\x36\x48\x10\xbb\x12\x4d\x90\x21\x45\x3a\x72\x45\x91\xd2\x18\x3d\x90\x05\xec\xcb\x47\x70\x35\x83\x31\x0a\xa5\x2d\x46\x6d\x7d\xba\x7f\xc7\x95\x49\x37\x4a\xfb\x72\xc7\x34\x5b\x22\x8b\xe5\x1e\x7a\x81\x26\x29\x0d\x1d\x4b\x4a\x1d\x3d\x8a\x45\x11\xbb\x80\x24\x47\x74\x94\x21\x9c\x21\x1a\x67\x09\x95\x42\xd0\x7b\x7b\x7b\xbc\xfd\x4f\x52\xd2\xec\x45\xc1\xe1\x9f\x7a\x2a\x38\xd3\xf9\x41\x0f\x47\xc9\x14\xf7\x27\x24\x1f\x31\x96\x67\x79\x8a\x13\x08\xd5\x14\xe1\x4b\x36\xcf\xf7\xc6\x11\x59\x8c\xd8\xa2\xc7\x87\xb2\x67\x9a\x7a\x89\xf5\xcf\x52\x9a\xe5\x6c\x4c\xd2\x3f\x58\x46\x92\xa9\x6a\x05\x8d\x46\x11\x1b\xed\xcd\x70\x96\x93\x74\x2f\x4b\x83\xbd\x20\xcb\xec\xef\xfd\x20\xcb\x2a\xe1\xa6\xec\x32\x22\x64\xf0\x78\x70\xb0\x07\x1c\x64\xcf\x1e\x8e\xdb\x6a\x26\x3d\xe1\xfa\x38\x9e\xcc\x23\x9c\xfe\x91\xf5\x59\x3a\xd9\x8b\x70\x4e\xb2\x5c\xcd\x86\x72\x6a\x23\xd9\x33\xbd\x4a\x7c\x29\x85\x68\x47\x42\x47\xff\x9c\x43\xf0\x4d\xa6\xa2\x9e\x71\xf4\x4f\xb3\x1c\x4b\xf9\x23\xfc\x8c\x2e\xf9\xf2\xcf\x58\x48\xa2\x23\x77\x24\x41\x96\xf5\xf8\xd9\x3d\x03\x4b\xc1\xbd\x2c\xa6\x49\x42\xf2\x0c\x26\x8e\x7b\x13\x0e\xbb\x97\x33\x35\x95\xad\x26\x21\xbd\x2b\x6a\xbd\x35\xa2\x74\xc8\x42\x7e\xbc\x7e\xc2\x41\xce\xd2\x2a\x37\x91\xc3\xa7\x0f\x6b\x1a\xd5\xaf\xb5\x5f\xdb\x8b\xc1\x5c\xa9\x89\x3c\xf4\x2a\x2e\x8f\xd4\xfc\x75\xab\x2e\xef\x8e\x0b\xcb\x97\x8d\x2b\xf2\xcf\xdf\xde\xbd\xfb\xf1\xed\x09\x7a\x8e\xde\x0f\xba\xe8\x49\x17\x0d\x1f\x75\xd1\xfe\x41\x17\x1d\x0c\x3e\x88\x58\x58\xff\x7c\xfb\xea\xe5\xc7\x93\x57\xff\xdf\x8f\x50\x49\x84\xa9\x1c\x76\xd1\x7e\x17\x3d\xec\xa2\x83\x2e\x3a\xec\xa2\x47\x5d\xf4\x18\x1a\x3f\xed\xa2\xe1\xa0\x8b\x86\xc3\x2e\x1a\xee\x7f\x78\x56\x12\xea\xe1\x9f\x29\x0d\xdb\x93\x88\x8d\x70\x74\x22\xb9\x32\x50\x9d\x75\x2d\xf7\x5b\x21\x3f\xb2\xee\x2b\x3c\xcf\x19\x12\x04\x9b\xc6\x13\x25\x65\x53\x14\x66\x79\xfc\x82\x16\xbf\x1c\x7a\x2d\xf4\xc0\xea\x44\x29\x12\x39\xd1\xfd\x01\x67\x34\xd3\x2a\x65\x5e\xf2\xcf\x94\x5d\x1c\x21\x99\x42\x7f\x86\x17\x32\x02\x61\x6b\x38\x18\xfc\x27\x84\x9e\x10\xc2\x0c\xb3\x36\xfd\x31\x4b\x7f\xc4\xc1\xd4\x0e\x34\x41\xff\x24\x25\xf9\x9f\x20\xaa\x27\xbc\x8b\x65\xca\x39\x2b\xf3\xd3\xde\x1e\x3a\x39\xa3\x89\x15\x0f\x92\xc5\x84\x5f\xe6\x22\xeb\x3b\xc2\x23\x76\xae\xf5\xc1\xe2\x54\x2b\x5f\xdf\x7b\xb2\xfd\x9b\x38\xba\x44\x67\x84\x24\xe8\x11\xca\xe8\x24\xa6\x63\x1a\xe0\x38\x47\x22\x4a\xa2\xd0\xfb\xc0\xfa\x89\x50\x90\xcf\xd1\x6b\x9c\x4f\xfb\x29\x9b\xc7\x21\x8c\x18\xed\xa1\xe1\x3e\xfa\x4e\x14\x27\xec\xa2\xcd\x37\xf4\x51\xa7\x83\xf6\xdc\xa2\x03\x50\x2a\xff\x67\x4b\xba\x42\x17\xa3\xf0\xcc\xf0\xa2\x17\x91\x58\x08\xe2\x85\xd6\x3b\x62\x99\x36\xfd\xd7\xbc\x45\x81\x1b\x91\xb5\x4b\x2e\xff\xfc\x62\x94\xed\xe9\x86\x82\x8f\x18\x0d\x0e\x07\x4f\xf0\xd3\xc7\x87\xe1\xe3\xe1\x30\x7c\x34\xda\x3f\x08\x06\xc3\xf1\xe1\xe3\x30\x3c\x3c\x38\x38\x0c\xf6\xf7\x1f\x3d\x7d\x3a\xc6\xc1\xc1\x5e\xc6\x6f\xdb\x19\x5d\xd0\x38\xdb\xfb\x08\x7c\x06\x2f\xf9\x8f\x5f\x1e\x3d\xf5\x26\x40\xe2\xb2\xf1\xab\x18\x21\x25\xa8\xc4\x17\x02\x8a\xf8\xfa\x7d\xd0\x01\x4b\x1c\xdc\x82\xd5\x36\xe2\x71\x85\x50\x50\x2c\x76\xf0\x99\x41\xab\xbd\x3d\xf4\x2f\x86\x62\x22\xdd\x64\x30\x9a\x91\x90\x62\xf4\xbf\x73\x92\x5e\x6a\x73\x01\x81\x1f\xbc\xcb\xfe\x3d\xdf\x75\x5c\xe0\xd7\xc2\x04\x83\xac\x10\x9b\xb9\x07\x31\x53\x57\x2c\x42\x9f\x11\x89\x32\x22\x1b\xdb\xb5\xde\x97\x06\x1b\xb1\xce\x2e\x9f\xbf\x15\xfd\xe3\xde\xe7\x32\x22\x30\xe7\x4c\x54\xbb\xe2\xe0\x3b\x87\xfb\x2f\x11\xe4\x45\x92\xa9\xb2\x53\x26\xf4\x61\x5d\x44\xe3\x90\x2c\xec\xf3\x06\x05\x22\xc2\x42\xf9\x09\x53\x4f\x47\xc7\xca\xa2\xe4\x54\xa9\xad\x97\x5d\x55\xee\xbe\xf8\x6c\x23\x80\x52\xaf\xf5\x94\x1d\xca\x1e\xda\x57\x48\x70\x21\x49\x4a\x80\xa3\xa0\xcd\xe9\x0a\xc4\x58\xd0\x60\xa4\xc9\x86\xb6\xb0\x68\xdd\x47\xff\x40\xdf\x72\x1a\xf2\x2a\x27\x33\xc7\x53\x30\xc1\x61\x08\x26\x0d\x56\x2f\xae\x6f\xa0\x85\x5b\x5e\x80\x96\xcf\xf7\x38\xab\x2a\xf9\x05\x74\x7c\x72\x22\x9e\x7e\xc0\x80\x73\xf4\x3d\x42\xad\x01\x1a\x02\x05\x6e\x75\x55\xe1\x4b\x9a\x92\x40\x1a\xeb\xa4\xec\x42\x7c\x70\x52\x6a\xf3\x5a\x3d\x69\x73\xaa\x5a\xfd\x9e\xe2\x04\xa2\xf7\x5c\xa4\x38\x11\xc5\x7f\xcc\xb3\x9c\x8e\x2f\x8f\x85\x31\x83\xdf\xee\xaa\x26\x4a\xb5\x6e\x22\x7c\x25\x79\xbf\x98\xc6\x24\x35\xab\x39\x62\x8b\x13\xfa\x27\xac\x66\x6b\xc4\xd2\x90\xa4\xbd\x11\x33\x79\xc3\x4d\x10\x22\x27\x9d\xb8\x35\x3d\x39\x39\x77\x8f\xd5\xb5\xa1\xed\x48\xd4\x3e\x36\xee\x58\xef\xc5\x40\xed\x85\x8b\x61\xad\x41\x4b\xdd\x98\x76\x52\xe6\x56\x86\xe6\xc2\x60\x02\x82\x23\x83\x4e\x08\x02\x20\x63\x74\x3a\xa6\x93\x79\x4a\x5c\x5d\xb9\x1a\x5f\x2b\x54\x5b\xdc\x5b\x64\xbd\x80\x45\xf3\x59\x6c\xe1\x9c\x8f\x04\xb2\xc2\x32\x08\xbd\x94\x9c\x93\x34\x23\x4b\x21\xe9\x8a\xd5\x10\x53\x76\xd1\x00\x9c\x5d\xcb\x81\xc5\xb7\x89\x83\x91\xd8\xe8\x42\x70\x31\xb5\xb4\x1d\xfc\x5b\xde\xbf\x85\x08\xe5\x7d\xc3\x49\xe9\x51\x7e\x54\x60\x6d\x44\xfa\x79\x03\xa4\x2c\x39\x7d\x1d\x00\xeb\xd0\x54\x00\xb1\x6a\x2c\x05\x44\xe2\xb0\x16\x0c\xff\x5e\x07\x64\x84\x33\x12\xd1\x98\x54\x01\xd1\xdf\x4b\x80\x48\xab\xa6\xea\x55\x31\x94\xa2\x7a\x5d\x2c\x20\xd5\x2b\x53\x4a\x72\x1a\x00\x2b\x59\x1d\x0f\x54\xc5\xfa\x58\x80\x38\x99\x26\xbd\x11\xc9\x2f\x08\x89\xab\xa1\xb9\xd5\x9a\x80\xc4\xc0\xc6\x2d\x83\x28\x6b\x39\x00\x25\x21\x2e\x5d\xf8\x02\x91\x2e\x5b\x7a\x0b\x40\xc9\x3a\x95\xd3\xf9\xc2\x4a\x59\x40\xaa\xd6\xa8\x00\xa9\x66\x95\x0a\xe0\x0a\xeb\x53\x01\xcd\x59\x21\x11\xc3\xac\x9c\x75\x01\x16\xab\xdb\x3c\xf6\x1c\x0e\x82\xf9\x6c\x1e\xe1\x9c\xa5\x4e\x00\xba\xbd\x3d\x48\xb9\x0c\xe1\xe8\xc9\x78\x4c\x82\x1c\xb1\x73\x92\x22\x3a\x9b\xcd\x73\x3c\xa2\x11\xcd\x05\xe3\x27\xc5\x4f\x09\x49\xc7\x2c\x9d\x71\x2a\x2f\xc8\xb6\xf3\xbc\x72\x7a\x91\x23\xe5\x9d\x09\xa6\x46\x5e\x8e\x56\x25\x13\xa6\xad\xb3\xb2\x81\x22\xef\xf0\x84\xfe\x59\x63\x87\x7e\xd5\xcc\x98\x52\x77\x32\xfc\x50\x9d\xe5\x45\x56\xd9\x5f\x5e\xe5\xe1\xf2\x2a\x07\xcb\xab\x1c\x2e\xaf\xf2\x68\x79\x95\xc7\xcb\xab\x3c\x59\x5e\xe5\xe9\xf2\x2a\xc3\x41\x83\x3a\x0d\xd6\x77\xb8\xff\x01\x42\x3e\xdd\xf5\x2c\x54\x3b\xe3\xd5\x5d\xec\x86\xed\xc6\x6e\xb0\x8d\x17\xcd\xda\x82\xe9\xe4\x14\x9f\x8b\x2c\x5f\xfc\x8a\x44\xdf\x05\xea\x89\xf2\x1d\x1a\x91\x29\x3e\xa7\x2c\x95\x8b\xfd\x3f\x6c\xae\xa2\x2b\x8c\xac\x58\x0f\xdf\x01\x23\xf6\x9d\xe2\xf2\x2d\x00\xf6\x52\xeb\x77\xcf\xba\x26\x97\xf5\xa3\xe6\x63\xd8\xe4\x80\x29\x3c\x95\x1a\x8f\xf5\x25\x08\x03\x45\xee\x9a\x53\x87\x57\x92\x2e\x15\xda\x8a\x58\x65\x5a\xe1\x0f\x25\x75\x02\x41\xe4\x12\x45\x2a\x1f\x4a\xc6\x6f\x37\x33\x14\x97\xa5\x5a\xea\x75\x99\x92\x3c\x98\x82\x09\xa2\x60\x9a\xba\xee\x1b\xd7\xe2\x84\xba\x3e\x2f\xd3\xf5\xd8\x11\xdf\xfc\xb6\x64\x96\xb0\x94\x1b\x9a\xa3\xe4\xd7\x97\xcc\xd0\x9d\x8c\x37\x49\x35\x2d\xb3\x0a\x9a\xf9\xaf\x9d\x0c\x34\xd6\xaf\xbd\xca\xf9\x40\xe4\x93\x46\x13\x0a\xcd\x93\x70\xc9\x7c\x40\x9c\xe1\xbe\x1b\xbb\xfa\x7d\xdb\x2d\xbc\x4f\xeb\xa6\x01\x9b\x87\xe4\x6e\x0a\xc3\x7f\x4e\x5e\x4e\xf9\x26\x9d\xfa\x14\x90\x4f\x27\xc0\xb1\x08\x27\x0b\x99\x75\x44\x92\x1a\x2c\x1b\xe9\x53\x51\x68\x09\x76\xce\x42\xf0\xb3\x6c\x76\x05\x09\x7f\x91\x32\x25\x29\x3b\xa7\x21\x09\xa5\xf5\x39\x3f\xa5\xe2\x64\xbe\x17\x9a\x85\x0f\xed\x3d\x9c\xd0\x3d\x19\xf4\xd7\x22\x03\x38\x0e\x65\x62\x42\x13\x68\xd4\x0c\x50\xd4\x5f\x95\xb2\xfb\x31\xc8\xd7\xa1\xec\x36\x8c\xcd\x50\x76\x0b\x62\x1d\x12\xab\xd7\xc7\x32\xca\xd3\x1c\x8b\x25\xc4\xcd\x9c\xc9\xf5\x49\x0d\x80\xe1\x88\x71\x75\x42\x73\x01\xa2\x92\x25\xd3\x51\x02\x43\x25\x5b\xf3\x44\x2b\x75\x63\x15\x4a\x0f\xce\x63\x4e\x52\x1a\x66\xde\xcd\x45\x33\x34\x61\x86\x4f\xa9\x1b\xbe\x95\x42\x0b\xa6\x20\xce\x04\xf8\x1e\xb0\x0b\x92\xe5\x28\x49\x29\x4b\xa9\x5a\x03\x91\x4b\xaf\x49\x1a\xce\xdd\x8b\xe8\xf6\xbf\x88\xb6\x8c\x7f\x70\xe8\xb2\xd9\xa9\xad\x73\xe0\xd4\xf6\x82\x86\x3a\x6b\x5b\x86\xe8\x18\xc5\x4c\x88\x0d\xd2\x42\xa2\xc5\x1d\x26\xee\x30\x71\x53\x98\x38\x0b\xd7\xc7\xc4\x59\xb5\xd5\xfa\x0e\x13\x77\x98\xb8\x22\x26\x46\x93\xf5\x31\x31\x5a\xc2\x2c\xef\x30\x71\x87\x89\xcd\x31\x71\x11\xd5\x63\xa2\x9d\xad\x77\x87\x77\x5f\x07\xde\x79\x8e\xc5\xa0\x99\x69\x12\x7d\x74\x23\x6e\xbd\x3a\x60\xa6\x5b\xad\x10\xa6\x54\x49\x15\xac\x2a\xb2\x44\x55\xa1\x39\x99\x99\xdc\xb6\x39\x99\x75\x4b\x74\x8b\xba\x82\x5d\xd8\x2d\x68\x7f\xdd\x6a\x50\x64\x0c\x2b\xa4\x84\xc6\x72\x8c\x96\x25\xda\xeb\x58\x5a\xb7\x68\x97\x63\x69\xf9\x23\x3f\xeb\x74\x51\xe2\xab\xf8\xd9\x75\x15\x7d\xfa\xab\xfc\xad\xed\x34\x52\x6c\x56\x89\xff\x30\x79\x74\xac\x1c\x3a\x26\x7f\x8e\x95\x3b\xc7\xe4\xcd\xb1\x72\xe6\x98\x7c\x39\x56\xae\x1c\x93\x27\xc7\xca\x91\x73\xe5\xd0\xac\x15\x4e\xce\x6e\x98\x56\xb5\xa9\xfc\x07\xdf\x43\xfe\xaf\xbd\x55\xfa\x37\xec\x89\x70\xae\x96\xab\xaf\x64\x03\x34\x9e\xf0\x3f\xc5\xb2\xf2\xbf\xe4\x12\xda\xef\xf2\x85\xf0\xa4\x9e\x89\xec\x3a\x22\xb3\x8e\xc8\xaa\xa3\x63\xbe\x36\x77\xf6\xdd\x8c\x7b\xaf\x63\xe6\xd3\x35\x08\xbf\x9e\xfb\xab\x32\xdb\xe9\xc2\xb1\x58\x0b\x86\x31\x23\x5b\x64\x60\x36\x76\x02\xba\x12\x65\xc7\xd6\xf9\x60\x0d\x12\xdd\xbf\xaf\xb1\xfe\x1b\xb0\x63\x5b\xaf\x47\xc7\x70\xc6\xea\x53\x97\xf3\x5e\xcd\x09\xe4\x5d\x71\x72\xe5\xb8\x7c\x99\xf3\xb8\xe6\x20\x94\xe5\x8c\xd5\x3f\x2f\xe2\x5d\xc3\xf1\x2b\xef\x15\xaa\xac\xd7\xa1\x67\x97\x62\xf5\x6b\x50\x9d\xf7\x6e\xd1\xa7\xf2\x31\x58\xd5\xaf\x32\x12\xcb\x5c\xc3\x1f\x8b\x3c\x86\x7a\x34\x8a\xac\xd6\x8c\x47\x35\x59\x6f\x44\x96\x69\x84\x35\x16\x59\xca\x87\xa1\x08\x66\xf9\x08\x54\xc5\xf5\x3a\x07\x13\xda\x45\xd6\xfa\xd0\x05\xfa\xfa\xfc\x39\xf8\x99\x5d\x0d\x98\x3d\x8d\x05\x6c\xeb\x22\xe3\xc7\x67\x21\x36\xf5\xaa\x1d\x64\x33\x3e\x5a\x4e\xf8\x37\x02\xcc\x39\xf8\xb3\x8e\x00\xcd\x0f\xfb\x6c\x23\xa3\x9d\x85\x7c\xb4\xfc\x46\xda\x08\x30\x7b\xb4\xb3\xb0\x23\x40\xdf\xbf\xcf\xff\xbb\x89\xd1\x46\x13\x3e\x5a\x7e\x55\x6e\x04\x98\x3d\xda\x08\xe8\x69\x34\xe1\xa3\x8d\x26\x1b\x19\x2d\xbf\xcb\xba\x70\x87\x6f\x04\x98\x83\xb7\x51\x47\x80\xe6\x78\x1b\xd9\xa3\xad\x8f\xaa\x20\x6e\x55\x0e\xf0\xd7\x25\xe9\x5f\xab\xd2\x6d\xe9\x54\xfd\xd2\x92\x5c\xa9\x77\xfe\xb2\x2d\x86\x9a\x45\x00\x97\xee\x4b\x7e\xf4\x6f\x97\x1d\xab\x07\xe5\x30\xaf\x5d\x33\x31\x11\x89\x6d\xc5\x9c\x63\x95\xc0\xc0\xf6\x19\x48\xdb\x2e\x94\xb8\x18\xd6\x1d\x0d\x25\x7e\x27\xec\x88\xee\x4c\x00\x8b\x5d\x34\x70\xf7\x3d\xb6\x81\xb8\x0e\xf2\x45\xb7\x01\x48\xde\x9b\xf0\x7a\xad\x5b\x56\x1a\xa4\x7a\xa8\x6e\xcd\x3c\xa5\x79\xe8\x14\xf3\x50\xde\xb4\x6d\x49\xe3\xc0\x1e\xfa\x7d\xbe\xaa\xfd\x47\xd3\x1e\xf4\xb3\xff\xae\x19\x70\x34\x5d\x00\x23\xed\xb8\x06\xe3\x8b\xa6\x83\x92\x72\x97\xab\xda\x4f\x34\xed\x6e\xb1\xec\xc0\xed\x84\xd7\x77\x45\x78\xdd\x98\xf2\xd4\x5c\x3c\x3b\x94\xf8\x2a\x51\x62\x56\x13\xad\x6a\x87\x12\x5f\x25\x4a\x44\xcb\x58\x93\x1d\x4a\x7c\x6d\x28\xb1\x88\x76\x28\xf1\xf5\xa0\x84\x1d\x52\xb0\xa0\x4d\x90\x52\x34\xdf\x57\x55\xbd\xca\x3c\x7f\x04\xe7\x43\x59\x2a\x2a\xcb\xb9\xc5\x8a\x4a\xe8\x07\x2c\x30\x26\xe9\x3a\x92\x5d\x57\x3b\x9a\xe8\x76\xda\xe2\xda\x0d\x4c\x60\x19\xdc\x0f\x1f\x75\xb5\x1d\xb3\xe0\xaf\x41\xef\xbf\xb7\x87\x5e\x84\x21\xc2\xc2\xcd\x85\xa4\x96\x5d\x49\xce\xb4\xb7\x26\xca\xd8\x8c\xa0\x29\x89\x78\x8d\x19\xc9\x32\x3c\x21\x19\xa2\xb1\x8c\x4e\x71\x4e\x22\x96\xcc\x48\x9c\x73\x70\x24\x3e\xa7\x29\x13\x49\xb9\xe0\xb7\x13\x6d\xa5\x17\x93\x45\xde\xe3\x4f\x57\x44\x67\x09\x4b\xf3\xbd\x98\xf5\xc0\x77\x34\x22\x3d\x19\x3a\x41\x44\xf3\x49\x69\xf8\xbb\x1c\x93\xd0\xec\x3c\xbb\x77\x8f\x8e\x51\xbb\x52\xf0\xd9\x32\x82\xcf\x96\x31\x5d\x90\xdb\x2d\xcd\x0b\xe0\xc8\x5b\x45\x2a\x54\x96\x39\xf6\x2d\xde\x55\x4b\x46\xcd\x71\xc6\xe0\x58\x48\xc8\x62\xdb\x50\xa2\xa1\x9c\x97\xb7\xee\x0a\xb5\xba\x90\x10\xab\x48\x2a\xdf\xf2\xa7\xe0\x4f\x74\xf1\x9a\xa0\x1e\x0a\x70\x1c\xb3\x1c\xcd\xe8\x02\x45\x64\x82\x83\x4b\x64\x84\xbf\x60\xd2\x1d\xcc\xd3\x94\xef\xd2\xcf\x6f\x8e\x51\x82\xf3\x9c\xa4\x71\x79\x20\xba\x31\x0e\xc8\x88\xb1\xb3\xbd\x71\xc4\x2e\xf6\x68\x96\xcd\x49\xb6\x77\xf0\xe8\xe0\xe0\x3f\xe0\xef\x80\xcd\xf8\xb0\x7a\x0f\x1f\xee\x1f\x3e\x1c\x3c\x1d\x3c\x75\xe7\xed\xc8\x9c\xc5\x2c\x5d\xfc\xb7\x16\xb3\x6d\xc9\x8b\x64\x50\x62\xfb\x40\xd4\xd7\xb4\x30\xbf\xbe\xa2\x46\xf5\xfa\x6a\xd1\xc4\xab\x01\xc2\x27\xf9\x71\x16\xd6\x7c\xcc\x66\x75\x1f\xd5\x79\xaa\xef\x5d\x9c\xb3\xfa\x3a\x0b\x7f\x4d\x44\x3f\x32\xfd\xca\xd5\x03\x87\x02\x22\xa3\xcf\x9d\xb6\xb5\x9d\x5b\x8a\x19\xfa\x70\x83\x31\x43\x37\x10\x04\x74\x6f\x0f\xa1\x0b\x82\xcf\x84\x03\x70\xf1\xb8\xdb\x87\xb9\xf8\xb5\xad\x49\xe0\xbf\xf0\x8c\xbc\x8a\x7f\x4c\x53\x96\x56\x11\x94\x32\x38\x6d\xf9\x37\xe8\x6f\x3c\xda\x60\x5c\xec\xa5\x65\x0c\xff\x47\xc6\xfa\xb6\xbb\xed\xa2\x88\x05\x22\xcf\x02\x54\xf9\x69\x1e\x45\x90\x27\x57\x87\x04\xe0\x63\xb1\xbf\x9c\xe0\xb1\xca\xd2\xac\x8a\xd0\xa7\x4f\x1a\xbe\x0c\x7f\xe5\x44\xf8\x82\x21\xbc\x57\x35\x3e\x08\x2a\xea\x06\xcc\xff\x46\xd4\xb1\x67\xf4\xa1\x63\x85\xf4\x91\xd3\x8a\xc9\x05\x82\x75\x6a\xb7\x20\xc9\xb6\xca\x7d\x72\xda\x42\x0f\x8a\xa3\x7c\x80\x5a\xa7\x88\x8d\x45\x3e\xa8\x16\xd4\x29\x5b\x73\x51\x6f\x36\xcf\x72\xdb\xd1\x0c\xaa\xdb\xe3\x81\x6a\xfd\x56\x47\x86\x0d\xd0\xd1\x90\xcc\xe0\xe6\x51\x24\xe3\x24\x49\x82\xab\x3f\x59\xbb\xf6\xac\x22\x5a\x6f\x11\x41\x9e\x15\xf0\xff\xe0\x66\xe1\xff\x2e\xa3\xe2\x97\x8c\xe9\x3b\x21\xbc\x38\x67\xfc\x90\xbd\x19\x57\x0c\xe1\x49\x45\xf5\xba\x70\x9a\x6e\x4d\x37\xfc\xe9\x31\x8e\xa2\xe3\x29\x09\xce\xaa\xe6\xfc\xb4\xa2\x7e\xdd\x54\x3d\xc8\x5e\x4c\x53\x88\x73\x5e\xd5\xdd\x70\x50\x56\xbb\xb6\x33\x0b\xa8\xc9\x09\xc9\xb2\x8c\x8e\x22\x72\xcc\xe2\x2c\x4f\xe7\xfc\xf8\xbd\x85\x93\x5b\xd9\xef\x70\x79\xdb\xba\x51\x54\x77\xa8\xe1\xd2\x78\x4a\x52\x9a\x57\x4f\xbd\x58\xb5\xae\x47\x0d\xae\xb3\xcb\xc3\x59\xc4\xbe\x6b\x0d\xd8\xbb\x8b\x52\x7b\x83\xa3\xd4\x6e\x3a\x07\xa8\x0c\x54\x37\x34\x41\x03\xa5\x29\x34\xcd\x72\x40\x09\x08\xac\x16\x93\x42\x04\x3b\x9d\xd0\x53\x87\x33\x34\x25\x26\x37\x68\x4a\x22\x9c\xd3\x73\x37\x7a\x98\x6e\xf1\x97\x0b\xe2\x1d\x4b\x54\x66\x46\x3b\x31\xa6\xd7\xd1\x0f\x2c\xcf\xd9\xac\xac\xa2\xdd\x47\xe8\x26\xf1\xac\xef\xc1\x8e\xf3\xb8\xb4\x17\x1d\xae\x51\xe5\xe3\x9c\x8f\xa6\x04\x87\x76\x54\x42\xbb\xb7\x81\x09\x4b\xb5\xf1\x74\x92\xbb\x68\x3c\xbb\x68\x3c\x5f\x6f\x34\x1e\x3e\x67\xce\x22\xe8\x5c\x8b\xf2\xd8\xa1\x90\x64\x74\x12\xcb\xa5\x3e\x23\x97\x23\x86\xd3\x10\xbc\xbc\x66\x8c\x2f\xa9\x48\x6e\xa8\x12\x60\xaa\x4d\x11\xf0\x21\x46\x00\xcd\x84\x53\x18\xfc\x01\x16\xe9\x7d\xe4\x3c\xe8\x68\x86\xf0\x39\xa6\x11\x44\x1e\xce\x19\xef\x31\x20\x71\x88\xe3\xdc\xc2\x3f\x84\xc1\x47\x4d\xc0\x95\x59\x22\x75\x2e\x3a\x13\xeb\x44\x10\xaa\x3a\xc9\x79\xd5\x02\x14\x26\xae\xa6\x94\x92\x19\x3b\xe7\xb3\x4a\xd9\x4c\xcf\xa8\x90\x42\xf4\x57\x45\x86\x1b\xf7\xfd\x5b\x26\x53\x44\xea\x85\xc8\x19\x4a\x70\x96\x21\x8c\x52\x32\x46\x01\x8e\xa2\x11\x0e\xce\x54\xd0\x68\x40\xf1\x12\x6c\xe5\xe5\x6f\xc9\xb8\xb2\x67\x8e\x83\x65\xe7\xa8\x9c\xe8\x75\x4d\x4e\xcd\xd3\x5f\x68\x96\xbf\xca\xc9\xcc\x4a\xaa\x6b\xd1\xe7\x5b\x4c\x0a\xf5\xd5\xc1\x67\x68\xdf\xf6\xed\x8f\xd0\xee\x5b\x6d\x38\x2b\xae\x7c\x10\x92\x69\xc6\xdb\x88\xc8\x78\xf3\x2e\x2a\xb4\x01\xb9\x88\x86\xc9\x2b\xb5\x9d\x58\xd4\xde\x6b\xc9\xc0\xcb\xa7\x34\xeb\x42\x03\x37\x5e\x21\xb4\xaa\x7e\x7b\xf8\x00\x60\x5c\xfd\x8f\x7c\xd2\x39\xfb\xf8\x91\xb3\x42\x00\xc1\x7b\x16\xba\xf3\xe8\x74\xfa\x90\x2b\x57\xc2\xc0\xe9\x64\xce\xa9\x46\xd6\x31\x36\xc7\x62\xf0\xd6\xd3\xcb\x5f\x89\xf7\x62\x92\x67\xe4\xf2\x08\xb5\x26\x24\x3f\xe6\xf7\xe6\xb1\x38\xa4\x92\xe7\x91\x72\x05\x2b\x2c\xb6\x53\xab\x6d\x04\x41\x0e\x9f\x65\x71\x21\x7c\x7c\x7d\xe9\x26\xc7\x4b\x94\x84\xe6\x99\xe1\x0d\x54\x7c\x7b\x31\x90\x94\xc4\x21\x49\x2b\xfa\x17\x1f\xdb\xae\x0c\xcc\xf7\x4d\xd4\xe5\x89\xe4\x21\xcc\x18\x4c\x6e\x6d\x3b\x2b\xe9\xc7\x52\xff\x45\x54\xe2\xc3\xf8\xb1\xc2\x89\x11\x95\x38\x32\x7e\xac\xf0\x64\x44\xc8\x27\x43\xa6\xb2\x5b\xee\x8c\xc4\x24\x59\xfd\x58\x9e\x65\x55\x2f\xba\x05\x0e\xd2\x1f\x5a\xdf\x35\x41\x30\x75\x74\x91\x5d\x4f\x52\x29\x53\x4b\x16\xd8\x75\x56\xf4\x03\xfc\xb8\x9a\x23\xa0\xbb\x12\x7e\xc2\x54\x91\x9d\xac\x8b\x5a\x7a\xf4\xc2\x5c\x11\x06\x29\x3c\xf8\x0c\x1e\x7c\xb9\x8c\x9d\x62\xfd\xe5\xae\xdc\xbf\xaf\xd3\x6c\xca\x59\xad\xe7\xd9\x27\x6f\xbc\xee\x66\xa0\x99\xed\x37\xc8\xd1\x24\x39\x26\x5a\xd1\xdb\xc2\x3b\x1f\x06\x91\xd6\x73\x00\xe9\xc2\x2b\x7c\x7c\xa4\x31\xf5\x73\xc7\x80\x2c\x41\x69\x2b\x37\x26\x52\x9e\x19\x92\xfc\x88\xec\xb9\x72\x2e\x9c\x32\x3e\xbb\xf7\xb9\xed\xcf\xc9\xb9\x2e\x80\x60\x97\xe8\x85\x6d\x1d\xef\x3c\x02\x12\x26\xa9\xa0\x9f\x74\x4e\xf3\x1f\x26\xe5\x9c\x80\x1a\x58\xd4\xd5\x56\xba\x29\x56\xa9\x24\xd3\x9c\x4e\x0d\x7d\x55\x75\x11\x1f\x00\xa8\x8b\xe4\x95\xe6\xcb\xb8\x0f\xef\x78\x5e\xb8\xeb\x97\x5a\x6f\x55\x08\x7f\xa3\x44\xe2\x3b\x89\x66\xa5\x44\x13\xa7\xb1\xe4\x01\xca\xd6\xe6\xc0\xaf\x58\x2b\xcc\x14\x55\xbe\x46\x69\xa9\xbc\x6e\x36\x25\x94\xfc\x22\x02\x49\x99\x83\xe3\xe1\x23\xed\x8a\x48\xe8\x64\x9a\xdb\x25\x63\x16\xe7\x27\xf4\x4f\xa2\xa4\x73\xf9\x65\xc2\x26\x29\x4e\xa6\x97\xfd\x64\xf1\x8e\xbd\x25\xb3\xf6\xf0\x49\xc7\x15\x58\xbe\x15\x40\x0e\x6c\xc9\x1d\x0d\x58\x5c\xe8\x78\x7f\xe0\x77\x6c\x4a\x1a\x74\xbc\x3f\xe8\x5c\xa7\xc0\xcf\x7e\xfb\xbe\x38\xc7\x39\x4e\x4f\xaf\x2e\x03\xd4\x68\x74\x35\x79\xd0\x55\x5c\x15\xaf\xe2\xa6\xb8\x59\x19\x94\xeb\x9e\x78\xfb\xe4\x91\x82\xaf\x02\x30\x2a\x1c\x12\xca\x20\x87\x97\x36\x76\xcb\x19\x0c\xf8\x52\x04\x47\x92\x82\xaa\x19\x0b\x89\x3a\xdc\x39\xb3\xb1\xeb\xbb\xbd\x7b\x8e\xa4\xe0\x55\x4e\x66\xe2\xab\xb2\xe6\x90\x42\x2e\x71\xd6\xe9\x18\xb5\x95\xd4\x4b\x3e\xcd\x9e\x5b\x8c\x87\x7a\xc6\x36\xf6\xe4\x05\x76\x4e\x5e\x03\x86\x97\x13\xcc\x25\x6a\xbd\x96\x59\x44\x7b\xbf\xbd\x3a\x42\x7f\x77\x87\xf7\x0f\x90\xdb\xd5\xce\x5e\x0c\x50\x4c\xfb\xff\xc5\xe2\xd4\xe7\x0c\xfd\x5d\x02\xe8\x43\x54\xec\x90\x41\x9c\x32\x48\xf8\x45\x73\x34\x8f\x23\x92\x65\xe8\x92\xcd\x11\x4e\xc5\x51\x4d\x59\x14\xa9\x54\xaf\x30\x88\x7f\x48\xc8\x3a\xf6\x6a\xab\x83\x8e\xd0\x39\xa3\x21\x1a\x38\x72\x13\xf7\x59\xab\xe5\x18\xf0\x84\x33\xaf\xdf\xf2\xc7\xef\x66\x62\x11\xad\x1d\xda\xc6\x7a\x9a\x96\xbe\x6e\x55\x4c\x99\xaa\x17\x53\xc4\x62\xfd\x60\xd2\x53\xab\xcf\x0a\x65\x1d\x82\x9a\xc8\x34\x4b\x13\x0e\xba\xcf\x5e\x07\x59\xfd\x87\x5f\x57\x6f\x43\xdf\x5b\x3f\x79\xe1\xa8\xcf\xc7\x9b\x1d\x1a\xbf\xab\x4a\x86\xe6\x8d\xc5\xef\xbb\x23\x44\x4b\x22\x5c\x80\x70\xa1\x77\x8f\x44\x59\x66\xef\x26\xcf\x2c\x0f\xca\x6c\x4e\xa5\x6c\xa1\xe5\x7e\x69\x6d\xe8\x49\x66\x41\x54\x8f\x33\x53\xb4\x25\x73\xbe\x47\x77\xfc\xa9\xb7\xb3\x7e\xda\xe6\x53\x6f\xfc\x0c\xb9\x06\x98\xbb\xe7\xdf\x17\xcd\x40\xfd\x4e\xf3\xea\x55\xf8\x3e\x28\xa9\x5b\xd7\x89\xa9\x75\xd3\xde\x81\xd7\x6b\x35\x73\x5d\x26\x29\xda\x6c\xa4\x35\x40\xc3\x47\xc9\xc2\xca\xb5\x79\x04\xd9\x55\x7b\x70\xff\x95\xe5\xda\xfc\x85\x8c\x73\x65\x8a\xa1\xb3\x6c\xca\x47\x60\x9c\x11\xab\xf3\xa6\xb0\x4a\xec\x42\xbe\x43\x8f\xcb\x3a\xf0\x2c\x51\x9a\x3c\x5e\x1f\x76\x6c\x00\xfc\x7e\x3e\x02\xe9\xfb\xde\x1e\xfa\x35\x25\x99\x74\x4b\xc1\x90\xf7\x9e\x53\xde\x34\xc6\x11\x0a\xe6\x59\xce\x66\xf4\x4f\x30\x97\xd6\x0d\x5f\x56\xf5\xde\x92\xca\xc1\xd6\xa6\x9f\xab\xb7\xe3\x59\x54\x9f\x2d\x47\x71\xda\x17\x2c\x6e\xe5\x3a\xfd\x0d\x09\xd1\xe8\x52\xa4\xf8\x50\xa4\xc4\x4f\x0b\xe2\x26\xf4\x04\x5d\x79\x80\x63\x69\x66\x20\x97\x85\x17\x08\x1d\x1e\xc2\x31\x9a\x1e\x40\x03\x82\x43\xfe\xb8\xc7\xbe\x92\xde\x10\x99\x2b\x24\xff\xd1\xd3\x91\xf6\x01\x34\x0e\x49\x9c\x93\xb0\xaf\x04\x0c\x34\xb3\x52\xfd\x80\x41\x04\x05\x41\x43\x4a\xf8\x93\x29\x66\x28\x22\xe3\x1c\x61\xe0\xb6\x10\x4b\xc5\x4f\xce\x92\x5a\x39\x7f\xc4\x39\xaa\x1d\x23\x7f\xe5\xd1\x19\x4e\x2f\x6f\xb5\x2a\x1e\x1c\xca\x48\xc0\xe2\xf0\xb6\xcf\xc4\x8b\x79\xab\xb8\xea\x77\x64\x91\x97\x3e\xe5\xb7\x1b\x04\xb7\x80\xf1\x56\x6c\x59\xef\x8b\xbe\x12\x04\x3a\xe9\x8a\xf2\xb7\x8e\xfc\xaa\x76\xc9\x04\x80\x55\x25\x3a\x5e\x2e\x47\x5b\x13\x30\x97\xff\xda\x56\x8c\xd7\xc2\x2c\x78\xa1\x1c\x31\xa8\x71\xd5\xd8\x20\xec\x2b\x1f\x49\xeb\x83\x0e\x17\xa7\x94\xda\xce\x0b\xf0\xd9\x6a\x21\x5a\xb7\xad\xdd\x5d\x4f\xf9\x2a\xd6\x5c\x6c\x44\x13\xa5\x6b\x73\x85\xab\xf6\x31\x5d\x57\xc1\x2a\x9f\xf4\x0a\xcb\xee\xdf\x47\xed\x22\x92\x7e\xaf\xbf\x1f\x35\x8c\xb9\x67\xb1\x97\x7e\xdc\x3d\xc3\x6d\xf0\x53\x7a\xa4\x75\xfb\xa0\xfe\x37\x8a\xdc\x26\xb2\x05\x1d\x04\x97\x2c\xf2\x65\x1b\x63\x4b\x1a\x34\xd7\xa0\x76\xb5\xa3\xb8\x1a\xef\xd4\xc1\xaf\x8e\xf2\x08\xd4\x47\xad\x6a\x95\x4c\x8d\x8d\xae\x53\xc0\x22\x96\x1e\x39\xa7\xc7\x5f\xc3\x11\x0b\x2f\x87\x37\x67\xf9\xf4\x48\xe5\x02\xde\x03\x55\xbc\x25\x9a\xe1\xf4\xf7\xfa\xa3\x1c\xde\x99\x90\x75\x65\x74\xb6\x86\x2d\x69\x1c\xb6\x0d\x28\xf2\x46\x40\x19\xa2\x7f\x8b\x99\x87\xc6\x31\x87\xac\x6b\xed\x76\x4f\xd7\x0e\x8b\xe0\x9c\xd5\x12\x33\x98\x12\xf6\x5d\xdb\xbf\x68\x26\x58\x97\x58\xec\xa4\x2e\x93\x0c\xb5\x31\x8e\x71\xba\x5c\x53\x6e\xbb\x29\x59\x2c\x1f\x83\x23\x89\xe5\x05\x5b\x92\xc3\x3e\xde\xb9\x95\x7e\x55\x16\x2d\x77\x40\xe2\x78\x93\x84\x81\x77\xc1\x28\x44\x9b\x62\x1c\x94\x5a\x75\x94\x0a\xe3\xb4\x47\x97\x32\xec\x38\x30\x69\x54\x80\x65\x14\xad\x12\x1c\x91\x3c\x27\x7d\x0c\xc3\x82\x7f\xce\xf5\x93\x74\x1c\x91\xc5\xc9\x34\xa5\xf1\xd9\x35\x3b\x72\xd9\x76\x1d\xaf\x02\x16\x9f\x76\xd1\xe9\xc9\xf9\x44\xfc\x29\x9a\x83\x2b\xd0\xe9\x4c\xe9\xbb\xe7\xb4\x47\x03\x16\x67\xa7\xe8\xe4\xdf\xff\x04\xd9\xcc\x26\xdd\xc2\x76\x26\x21\x77\xd5\x24\xe4\x45\xa5\x3d\x04\x38\xd3\x9c\x5a\x36\x20\x38\x96\xc8\xc8\x71\x4f\xa3\x63\x85\x45\x08\xff\xe6\x27\x50\xda\x59\x30\xac\x67\xc1\xe0\xd9\x27\x34\xb4\x47\x28\xea\xfe\x37\xc5\xfd\xf1\xbd\x75\xb8\x3f\x5e\x50\x62\x2c\xfd\xe4\x8e\x6b\xd0\xaf\x5f\xc9\x7d\x6d\x7a\xe5\x1d\x13\xb6\xd3\xc8\x1a\x7f\x76\xe3\xd0\x8f\x47\x19\x8b\xe6\xb9\x89\x07\x90\x4a\xc3\x5a\xf5\x3b\x67\xc9\x11\x6a\x1d\x0e\xfe\xd3\x8b\x18\x00\xce\xf0\xbd\x52\x4e\xed\xe1\x17\xe2\xac\xd4\x7d\xf6\xc3\x3c\xcf\xe5\xad\x96\x91\x48\x66\xd5\x92\x66\x7c\x3b\x8f\xfa\x1b\xc2\xae\x14\x18\x8c\x13\x25\x33\x79\xa1\x69\xff\x56\x78\x8d\x22\x9f\x51\xcf\x04\xd4\xea\x21\xfe\xba\xd2\x85\xdf\x51\x42\x64\xcb\x93\xcb\x15\x1d\x7b\x8b\xf2\x85\x72\xe5\xdc\x85\x93\x72\x1b\xc4\xe1\x65\x02\x49\x1f\x03\x4a\x4c\x33\xbd\x2a\x9b\xb4\xd1\xf4\x41\xdb\x4c\xa2\xf7\x6d\x4b\xd2\xc2\xa7\x77\x9c\xe7\xdc\x59\x6d\xde\x01\xab\xcd\x3b\xc0\x5d\x43\x43\x11\x0b\xb9\x72\x12\x07\x37\x8d\x0d\xff\x92\x91\xbb\xbe\x8a\x97\xc2\x88\x2d\x4e\xe8\x9f\xc2\x4a\x73\xc4\xd2\x90\xa4\xbd\x11\x5b\x58\x51\xc5\x62\xf2\xb3\x94\xe5\xb6\x0e\x9e\x24\x8b\xe5\xf1\xc6\x96\x5b\x5d\xfa\xa1\xbb\x1a\x09\x85\x4b\x65\xc0\x60\x59\x53\x30\x11\x1a\xb3\x38\xff\x09\xcf\x68\x74\x59\x62\xb3\x69\x3e\xda\xd5\x7f\x27\xf6\x18\xbc\xea\xe2\xe3\x6b\x12\xd2\xf9\x6c\x05\xcf\xc2\x52\x58\xbc\x8d\x63\x2c\x0a\xf3\xfa\x55\x29\x18\xff\xaa\x9b\xad\x54\x43\xbe\x3f\x1c\x0c\x3e\x14\x40\xbc\x12\xd6\xa1\x05\x10\x9e\xd9\x68\xa9\x0d\xed\xf2\x2d\x7b\x6a\xb7\xce\x72\x1a\x9c\x5d\x96\xbe\x36\xc5\xa7\x96\xf3\xb6\xd4\xde\x98\x7f\xbe\x8a\x43\xb2\x38\x42\x43\x55\x30\xc2\xc1\xd9\x04\x92\x32\x1d\x97\x0e\x76\x17\x83\xed\x2b\x79\x31\x5e\x7f\x0c\x36\xe8\x44\x31\xcf\xc0\xd4\x09\x5f\xc3\xd3\x91\x90\x2d\x7c\x85\x91\xda\xc4\xb2\x47\x2c\x2d\x9e\x10\xe1\x87\x3a\xcf\x94\x8b\x24\xd0\x08\x24\xe9\x12\xba\x98\x92\x58\x98\x4e\xcf\xf0\x19\xc9\x50\x46\xe2\x8c\xd8\x0b\x08\x67\xbb\x3e\x95\x45\x4b\xee\x85\x67\x62\xa9\xe8\xc1\x87\xea\xa8\x72\x7c\x3c\x10\x63\xeb\x44\x87\x09\x02\xb3\xe9\x98\xe5\x82\x52\xa9\xe0\x66\x39\x4b\x50\x38\x07\x34\xc9\x82\x94\x45\x51\x21\xc0\xda\x89\x24\x6c\xeb\xda\x6d\x97\x0d\xa3\x60\xbd\xdd\xcc\xf6\xba\x44\x86\xa2\x01\xfb\x92\x93\x52\x0b\xdf\xeb\xd1\xdc\xf8\xe1\xa3\x2a\xa2\x47\x09\xb4\x32\x9f\x23\x96\x7a\x46\xc4\x62\xe9\x7d\x03\x62\x51\xba\x4d\xd3\xdf\x65\x1a\x24\x3f\xc2\x13\x8c\xdd\x32\x0e\x3e\x91\x17\x9e\x6d\x00\xfc\xa5\x6d\x7c\xdf\xcb\x51\xa2\x07\xa2\xb1\x64\xfa\xfb\x01\x4e\x68\x8e\x23\xfa\x27\xf9\x89\xa6\x59\xfe\x0b\x3f\xbc\x69\xa7\x0d\x95\x3b\x1f\xba\x72\x97\x20\x9a\xbe\x3a\x8d\x1b\xb1\x10\x5e\x27\xc0\x93\xd8\x78\x1d\x2d\x4a\x2c\xf3\x66\xad\x8d\x4b\x42\x3b\x5d\xc9\xea\xb8\x54\xc6\xa7\x0f\xed\x2e\x0b\xf6\xba\x76\x04\xbb\x2c\xd8\x3b\x19\xea\x2e\x0b\xf6\x3a\x59\xb0\xc5\x55\x75\x45\xc6\x6b\x45\x2b\x6e\x7d\x21\x5e\x9b\x05\xb7\x2f\x54\x37\x24\x77\x49\xb4\xbb\x88\xca\x84\x66\xe2\xed\xa9\x17\xa2\xc8\x10\xd6\xdb\xf8\x9a\x0e\x3d\xd9\xbd\xfe\xb0\x29\x89\xbd\x01\xa8\xe4\xf4\xba\x64\x2b\xd2\xf9\x47\x83\xc1\x4e\x3a\x7f\x47\x4c\x7f\x77\xf9\x5d\x76\xf9\x5d\x6e\x5e\x7e\x17\xf8\xf5\x92\xcd\xaa\x34\x12\x4f\x0b\x35\x97\xc2\x7e\xc9\x66\xd7\x12\xa7\x50\x66\xc6\xab\x52\xa6\x0c\xf7\x9f\x14\xaa\xd6\x6a\x84\x64\x1d\x4b\x57\x37\x62\xf3\x38\xa8\x52\x2e\x1c\xee\x17\x6a\xd6\x81\x57\x75\xdc\xf5\xfc\xf1\x9c\xc4\x39\xbf\x47\x48\x2c\xc2\x2b\x97\xd1\xc0\x87\x35\x6d\x96\xee\x86\x53\xfb\x5a\x75\x5d\xaf\x59\x88\xa3\xca\xcd\x79\xec\xd6\xab\x83\x0d\x15\x74\xf5\x7f\xa6\xec\xa2\x6a\xd0\x83\xa1\x53\xad\x0e\x28\xff\xae\x2b\xff\x8a\x93\xca\xe5\x3f\x3c\x70\xab\xd5\x01\x85\x0a\x37\x4d\x87\x77\x6d\x0a\xb2\xbd\x3d\xf4\x5f\x92\x6c\x91\x50\xbf\xee\x11\x6c\xdf\x4a\x23\x7e\x97\xe2\x58\xa8\x34\x8e\xb5\x94\xac\x94\x3a\x0d\x1a\x8f\xbf\x08\x72\x83\x2a\x48\x0b\xb8\x4a\xe8\xb0\xc9\x01\x2b\x98\xcb\x46\x6c\x07\xdc\x7f\x33\x1e\x67\x24\x7f\x07\x59\x25\x83\xdc\xa4\xbe\x30\x52\x4b\x06\x35\xd0\x73\x34\x00\xb9\x8d\x95\xdf\x51\xa7\xc9\x80\xf7\x57\x3c\x9f\x8d\x48\xda\x52\x61\x07\x75\x33\x55\x0b\x42\xee\x21\x12\x65\x04\x60\xb8\x8d\x03\xc2\xd1\xbf\xd8\x98\x0f\xaa\x2f\x9c\x54\xd0\x1e\xda\xaf\x85\x31\x82\xcc\x42\xb5\x30\x74\xd8\x3f\x75\xa0\xa0\x0e\x08\x81\x8a\x8b\xf2\x0b\x19\xe7\x72\x55\xa6\x2c\xa5\x7f\x72\xba\xdf\x68\x5d\x4c\xed\xfa\x95\x31\xf5\xbc\x79\xf9\x00\x6a\x57\x07\xbc\x70\x4a\x16\xc7\x07\x02\xf6\xa4\x75\x30\x1a\x2e\x0e\x20\xdc\x98\xa5\xb3\x37\x29\x9d\xd0\xf8\xdf\x9c\x95\x6f\xe7\x6e\xa1\xa3\xce\x7e\xef\x7d\xec\x9b\x91\x75\x91\xff\x4d\x6d\xe9\x87\xfe\x0c\x27\x6d\x93\x8c\x23\xf6\x12\x9d\xca\xa5\x8e\x9d\x15\x46\xdf\xa3\x18\x3d\x40\xad\x64\xd1\x42\x47\x48\x04\x79\xec\xf4\xff\x60\x34\x6e\xb7\x50\x4b\x08\xfb\xf6\xf6\xd0\xc9\x5c\x24\x6f\x11\xda\x85\x77\x2c\x41\x23\x92\x5f\x10\x12\xa3\xfc\x82\x29\x6d\x54\xd6\x77\x66\x7d\x02\x75\x7f\xc5\x29\x89\xf3\x76\x02\xff\x48\x0f\x01\x83\x11\x44\x3b\x84\xc1\x07\x15\x61\xc2\x74\xa3\x70\xe5\x62\x4a\x23\x82\xda\xaa\xfe\xfd\xfb\xba\xe9\x37\xcf\x9f\x23\x01\x5d\xcd\xd7\x00\x95\x7f\xf5\xc5\x77\x4e\x68\x45\x80\x4b\x03\xff\x81\xa9\xa4\x0b\xc5\xae\xea\x75\xb3\xca\x3f\x2f\xb3\x54\xe0\x03\x48\xf8\x4d\xa5\x54\xc8\xd5\xe6\xca\xec\x9c\xa4\xe3\x88\x5d\xfc\x0f\xff\x64\x62\x4b\xa9\xe2\xff\x7b\x84\x5a\x22\xcf\xb8\xfc\xc0\x77\x81\xa1\x0b\x82\x32\x02\x5a\x2a\x94\xb0\x84\x57\x16\x3a\x2a\x9a\xb7\x32\x44\x66\x49\x7e\xd9\x57\xb5\x41\xb1\x35\x63\x59\x8e\x22\x7a\x46\xa2\x4b\xc4\x62\x04\x09\xa6\xf9\x1f\xf3\x8c\xa4\x11\x8e\x85\xe2\x06\xcd\x68\xfc\xbb\xf0\x4c\x1b\xca\xc8\xc6\x33\x1a\x2b\xe3\x08\x5d\x84\x17\xb2\x52\x2b\xc0\x51\xd0\x1e\x0e\x06\xe7\x17\xa8\x87\x1e\xee\x27\x8b\x4e\x4b\xd7\xd1\x36\x15\xba\xd2\xd4\xab\xd4\xba\x7f\x34\x66\xc1\x3c\xb3\x22\x5a\xb1\x79\x1e\xd1\x58\x1b\x5c\x18\x1d\xf9\xaa\x2a\x72\x71\x26\xe4\x4e\x98\x53\x53\xaf\xa3\xe3\x30\xda\xef\x97\x08\x93\x22\x32\x06\x65\xdd\x32\xa1\x93\xa4\x3c\x0d\x6a\x0a\xf2\x52\x53\x51\x9c\xd1\x0f\xbe\x3c\x56\x1d\xf8\x0d\x4c\x2a\x67\xc9\x66\xe7\x24\x6f\x94\xd5\x26\xc5\x37\x79\x15\x33\x08\x79\xa6\xe4\x2e\x83\x25\x46\x6d\x67\xde\xfa\x45\x60\x0c\xd2\xb4\xc5\xaa\x83\x2b\xb7\xd1\xa0\x19\xa2\x90\x82\xcb\x51\xdf\x4b\xcd\xf2\xa5\x0a\x75\x25\x6a\xe7\x0c\xf1\x8b\x46\x9c\x71\x39\x55\xa9\xb7\x96\x67\xde\xa8\x5b\x71\x1c\x4c\x59\xfa\x63\xa4\x65\xf3\x3f\xbf\x7b\xfd\x4b\xa5\x87\x64\xc5\x9c\x55\x94\xb0\x37\xe3\xb6\xd5\xbc\x53\x2d\xe0\xc5\xf1\xa5\xaf\x60\x37\x13\xd4\x63\xbe\xda\xec\xa4\xd2\x9e\xa5\x21\x8d\x71\x4e\x32\x08\x68\xac\x72\x38\xa2\x9c\xdd\xd3\x39\xd2\xc0\xda\x43\xa4\xe6\x6e\x65\x28\x88\x28\x9f\x3b\x4e\x09\xf6\x97\xe9\x57\x4d\x8c\x6b\x05\xd7\x82\x28\xad\x8c\x56\x2b\x23\x16\x02\x59\x24\x2c\xa3\xb5\x8a\x21\xc9\x49\x3a\xa3\x31\xc9\xf8\xa5\x17\x4c\xe5\xd8\x41\x35\xcc\x17\x2f\x25\x63\xe1\x19\x29\x16\xd2\x2c\x43\x43\x5c\x79\xcb\xdb\x93\x38\xa8\x36\x5c\x51\x67\x59\xe1\x56\xab\x8b\x5a\xee\x02\x16\x8c\x16\xdc\xfd\xa7\x71\x8e\x60\xff\x89\x1a\xfc\x05\xc4\x6f\xb3\x46\xd5\xca\x44\xc3\x53\xd5\xc9\xa9\xb0\x29\xc0\x79\x8e\x83\x29\xca\x59\x5f\xc3\x8c\x99\xb4\x94\x91\xc6\x18\x32\x8b\x9d\x37\x1b\x5e\xd3\x1f\xa5\x98\xba\xa8\xfe\x26\xe1\x45\xd9\x91\xf8\x65\x48\xe8\xfb\x1c\x1c\x17\x81\xc0\x75\x91\x20\x5f\x1f\x9e\x89\x5a\xf6\xfd\xf1\x9e\x6f\xae\xa9\x08\xb4\xfb\x83\xbf\xb6\xe2\xf6\x69\x84\x5e\x77\xf4\x6e\xba\x8b\xb7\x93\x75\x4e\x6f\x87\xcd\xdd\x5a\x2a\x69\xbf\x61\x63\x5d\xf4\xa6\x35\xb5\x37\xc4\xa3\x9d\xef\x31\x89\xc8\x39\xae\xa5\xa9\xba\xc6\x12\xba\x5f\x42\x2e\xf5\x5b\x89\x66\x90\xad\x92\x84\x88\xc6\x08\x0c\x95\x05\x9d\xcf\x53\x4a\xce\x89\xc4\x2e\x81\x6c\x92\x9c\xaa\x27\x8b\x34\xd5\xe2\x8c\x3e\xaf\xc5\x12\xb8\x03\x88\x1a\xad\x45\x5c\x75\xb0\xff\x22\x02\xbb\x30\xad\xe0\x9b\x38\xd6\x85\x34\xce\x68\x48\x4a\x2e\x69\x69\x3d\xa7\x96\x3e\xe5\x6f\xe3\xe8\x52\xbe\x99\x20\x71\x69\xf3\xcb\x5e\xd5\x00\x33\xb6\x3c\xc5\x39\x99\x5c\x22\xbe\x08\xe0\xf1\x3f\xc3\x67\x75\x6b\x81\xfe\x98\x67\x39\xc2\x23\x26\x56\xcc\xbe\x23\xdc\xe5\xe2\xbb\x36\x21\xf9\xb1\x80\xf2\x42\xf3\x4f\x15\xdb\x57\xcc\xff\x79\x92\x90\x80\x8e\xf9\xa8\xa6\xec\x02\x05\x11\xcb\x88\xb2\xc3\x23\xe1\x44\x2f\xfe\x05\x8d\x43\x76\xe1\xbc\xd4\x02\x1c\x73\x4c\x25\xd8\x42\x20\xe9\x91\x3a\x4d\x49\x36\x65\x51\xb8\x12\x1a\x69\xf1\xd5\x18\x4e\xec\x88\x8c\x59\x4a\x5c\x6a\xc4\x91\x0b\xc8\x23\x8d\x27\xa6\x53\x16\xff\xc8\xcb\x56\x25\x4c\x65\xc2\xb8\x35\xc9\x54\x09\xa8\xcd\x90\x90\x22\xe0\x4e\xed\xa2\x29\xa6\xa2\xe1\x92\x81\x3b\xc1\x6e\xd5\x4a\x56\x6d\x8a\xe5\xb2\xd9\xd6\xa0\x72\xd5\x48\xb8\x5b\xb4\x9a\xf3\xb9\xa0\xb9\x8f\x6b\x0b\xba\xb2\x5d\xdb\x5d\x5c\xb2\x8a\xd3\x59\xbe\x60\xbb\xb3\x59\x7b\x36\x17\x34\xf7\x8e\x26\x94\xec\x96\xac\x74\xc9\x78\xe7\x24\xcb\x81\xf5\x18\x11\x71\xcd\x87\xf6\x83\xf2\xbf\x12\x9c\xe2\x19\xfa\x4b\xf0\x8e\x9f\x11\x39\xe7\xcd\x80\x6b\x84\xbf\x32\x36\x4f\x03\xcd\x0d\xa8\x74\xe4\xf6\xfa\xbf\x15\x5d\x1c\x73\xd0\x2b\xf0\x1f\x9e\x65\xbe\x62\x2e\x68\x86\xce\x29\x58\x52\x58\x7d\x24\xa4\x9a\x31\x1d\x31\x16\x55\xf2\xda\xc6\xcc\xc6\xe6\xad\x81\xa9\x04\x4d\xec\x69\x91\xa9\x82\x72\x10\x7f\x5d\xc9\xb1\x26\x65\xd1\xaa\x3e\x35\x15\xb2\x07\x23\x20\xa7\xc1\x54\xd4\x75\x65\x0c\x96\x84\xa2\x95\x21\x26\xd4\x29\x6b\xca\x0c\xba\x68\xd1\x4e\x16\x9d\xa6\xa2\x03\x55\xdd\x2c\x9f\xa7\xd6\xd9\x09\x11\xbe\x06\x21\x02\x8e\xe9\x4c\x3c\x30\x2d\xe7\x08\xef\xc0\x19\x9a\x84\x33\x44\x73\xc1\x64\x71\x74\x05\x92\x9e\xd9\x89\x13\xd4\x2b\x4f\x38\x7c\x85\x94\xbf\xc6\xd0\x88\xc6\xa1\x74\x20\x7b\x7f\x7a\x7c\x72\x62\x88\xa3\x71\x7a\xc9\x4e\x3f\xb4\xa7\x79\x9e\x64\x47\x7b\x7b\x60\xdb\x12\xb0\xd9\x6c\x1e\xd3\xfc\xb2\xcf\xd2\x89\x28\xea\xe5\xba\x61\x6f\x92\xb2\x79\xb2\xf7\x1f\x0e\xb4\x1e\xef\xbd\x67\x39\x31\x78\xb8\x6d\x9b\x08\x5c\xe1\xd2\x51\x66\x0b\x57\xbf\x73\x24\xa4\x8d\x5f\x39\x02\xae\xb7\xdb\x27\x04\x12\xa5\x08\x55\x1f\x44\xb0\x9b\xe7\x8c\xef\x7d\x00\xf1\x7f\x02\x1c\x05\xf3\x08\xe7\xc4\x5a\x2b\x94\xd3\x19\x41\x23\xcc\x5f\xd7\x2c\x96\x81\x27\xcb\x16\xf5\xe5\x3c\xad\x97\x41\x2c\x3f\x2d\xf2\x79\xd9\x84\xe8\x10\xf1\x74\x5c\xf2\x4e\x85\x9a\xc0\xc5\xd6\x56\x14\xe7\x62\xa9\x24\x9a\x2f\xda\x87\xce\x87\x8e\x56\x07\xfe\x2a\x69\xbb\xe5\x1c\xde\xfe\x08\x7b\xf3\xad\x49\x0d\x0e\x4a\x18\x30\x45\xd6\x66\x81\xc6\x10\x59\x42\xe8\xa2\x42\x33\x50\x38\x6b\xb0\xb2\x5e\x5b\x69\x97\x75\x74\x86\x7b\xe6\x67\x4e\x66\x49\x17\x7d\xcc\xa7\x34\x03\xa3\xed\x5c\x7e\x34\xbe\x51\xc6\xfa\xd3\x8c\x40\x54\x97\xf0\x55\x16\xf7\x31\x4b\x51\x1b\x80\x46\xe0\xe2\x86\xd3\xc9\x5c\x28\xd7\x23\x12\x4f\xf2\x69\x97\x97\x64\xe8\x39\x7a\x91\xa6\xf8\xb2\xcd\x6b\xf1\xf5\x3b\x23\x97\xa0\x2b\x17\x7f\xfd\x1d\x5a\x8b\x1f\x0f\x1e\x74\xb4\x9a\x95\x37\x7d\xcf\x0b\x3f\xd8\x90\x45\x89\xca\xc0\x6e\x9b\x0c\xf0\xa9\xa0\xe7\xa8\x0d\x13\x14\x7f\x70\x32\x23\xed\xbb\xab\xcd\x3d\xfd\x39\x2a\x67\x1f\x39\xd7\xfe\x47\x7e\x6e\x72\xf6\xf1\x23\xfa\xf4\x49\xc0\xf2\x6c\x72\x0b\xdb\xd4\xe9\x80\x99\x77\x1f\xc2\x41\x4a\x23\xfa\xf7\x1c\xf8\x87\x7e\xc0\xe2\x00\xe7\x6d\x3e\xb7\x0e\x84\xc6\xe6\xc5\xea\x5f\xe3\xb0\xf7\x3b\x8d\xa2\xdf\xe2\x19\x9b\x83\x65\x80\xc1\x1a\xb3\x3a\xa2\xc1\x14\xc7\x61\x44\xde\x92\x8c\xfe\x49\xfa\x01\x8e\x03\x12\xb5\x55\x7a\x7a\x05\x34\x23\xf9\xaf\x46\x58\x75\x52\x88\x53\xa0\xec\x14\x0c\x6c\x3a\x2e\x33\x5e\x10\x86\x03\x1d\x2b\x85\x00\xdf\x79\x5b\x0e\xf6\x5c\xf6\x38\x29\xf6\xa8\x3b\xd1\xf9\xff\x91\x0b\xb7\x9f\x0b\xc7\x45\xd3\x8e\x97\x3c\xab\xa8\x0c\x79\x74\xdc\xda\xbc\xa8\xaa\xba\xc7\xae\xf8\xfd\xb8\x5f\x15\x90\xcf\xee\x32\xfe\xff\xec\xbd\xfd\x7f\xdb\x36\xf2\x20\xfc\xbb\xff\x0a\xb4\xcf\x6e\x28\x35\x92\xac\x57\xbf\xc8\x75\x7b\x49\xda\xee\xe6\x73\xed\xa6\x4f\x92\xdd\xbd\x7b\xb2\xb9\x18\x22\x41\x9b\x1b\x8a\xd4\x91\x94\x5f\x9a\xf8\x7f\x7f\x3e\x18\xbc\x83\x20\x45\xc9\x52\xe2\x26\xee\x7d\x6f\x63\x81\x83\xc1\x00\x18\x00\x83\x99\xc1\x8c\xa3\x53\xf5\xa3\x48\x47\xc7\x52\x98\xc9\x11\x62\x4f\x27\xad\xaf\x72\x68\xf6\xf7\x11\x2c\x3f\x9e\x4c\x88\x7b\x8c\xc0\xc5\x88\x4b\xfa\x24\xe0\xa2\x20\x1d\xf6\x34\x41\x38\x41\x51\x92\x90\x4c\xea\x1b\x93\x34\x20\x7b\x1a\x21\xbe\xae\x41\x7c\x21\x9c\x83\x64\xcf\x9e\x95\x3f\x6b\x33\x26\xa9\xfa\x1b\x57\x8f\x72\xef\xa2\x34\x14\x37\x06\x45\x0c\xaf\xa5\x35\x8d\x2b\xda\x34\x1a\x73\xd0\xa7\x58\x45\x38\xdf\xbc\x24\xe0\xf8\xac\x18\x90\x47\x28\x16\x93\xcd\xac\xa9\xe0\xf7\xa1\x92\x56\x88\x10\xc8\x26\x10\x73\xfc\x10\x33\xed\xe8\xa2\x64\x0a\x2e\x6a\x9b\xd2\xba\x54\x35\x17\x39\x89\x43\x8d\xcc\x32\xa7\xc9\xfe\x5a\x8e\x55\x2d\xd1\xa3\x8e\x6b\x72\xda\x06\x33\xc8\xf3\x56\xb4\xab\xb1\xaf\xde\x38\x2c\x21\x7d\xbc\x61\x55\x75\x2b\xbd\xb0\x4e\xb4\xca\x7c\x49\x19\xb5\xa1\xac\x5c\xdd\x74\x6c\x13\x08\x98\xa8\x89\x4e\x81\x8c\xc7\x72\xc2\x34\xd7\x3c\x01\x09\xa2\x36\x3a\x65\x4d\x6a\x90\xdc\x4d\x4d\x75\xfc\xdf\x42\x2d\xcd\x57\x48\x8e\x0a\xfc\x9e\x72\x59\x26\x0c\x3f\x6c\x09\xa1\x28\xa1\x42\x8a\xef\xd3\x0d\x53\x6b\x88\x35\xad\x2f\x3f\xa6\xe8\xee\xc1\x62\x61\x3c\x80\xba\xf6\x2a\xd5\x49\x05\x92\xaa\x10\x00\xa7\xb9\xea\x57\xac\x63\xe9\xcf\x88\xaf\xa3\x1c\xd2\x20\xe7\x28\xbf\x88\xc2\x42\x4d\x23\xb8\x19\xa6\x0b\xf4\xbd\x8d\xd4\xde\x77\x83\x28\x0c\xf9\x58\x57\x76\x00\xb1\xcf\xa7\x00\xac\x15\x56\x70\x03\x7a\x6c\x42\x6a\xce\x86\x7c\x6e\x7f\xb0\x47\xd4\xa6\xea\x1d\x27\x8b\xc3\x77\x6d\xf8\x12\x65\xef\x9a\x93\x66\x80\xde\x8a\x31\xbe\x63\xfa\x6b\x8b\x4b\xd1\xf7\x25\x9e\xf9\xf8\x11\x7d\x63\x43\xd1\x32\x0b\xae\x83\xde\x98\x39\xb4\x0d\x5b\x8a\xae\x10\x2c\xd2\x14\x15\x54\x3c\xf0\x3a\xc8\x7b\x95\x42\x00\x87\x0c\x36\xd3\x88\x25\xbd\x4b\x52\x48\x9d\x97\x13\x92\x88\xfd\x26\xf7\x33\xfa\xab\x05\x6f\xc9\x6d\x6a\x4a\xa3\xdc\x66\x4e\x92\x6d\x68\xe1\xf7\x98\xe0\x1c\x0c\x51\x79\x04\xa9\xf3\x20\xc6\x0c\x0b\x81\x7e\xdd\x65\x35\xcf\xa8\x8c\x1f\xcd\x17\x19\x37\x48\x81\xc7\x5d\x97\x5c\x2f\x48\x16\x91\xc4\x27\x3d\xef\x2d\x77\xb3\xfc\x4f\xe2\xb5\xf5\x0c\xdc\x15\x9c\xae\x39\xa7\xd6\xf3\x3a\x6c\x01\x2b\x99\x1d\xa6\x7e\x28\x76\x8c\x1a\x7e\x67\xdf\x39\xaf\x0c\xab\xf9\x4a\xa3\xef\xb1\x0d\xad\xb1\x3d\xdb\xa8\x7e\xb0\x76\x01\x27\x75\x23\x74\xca\xf7\xb5\xae\x05\x5e\x41\xdd\x68\x2d\xea\x46\x25\xc6\x37\x82\x49\x21\xe1\x03\xc4\xf6\x5e\x4f\x0b\x10\x25\x3c\x7d\xf8\x66\x6b\x7e\x2a\xe9\x71\x9a\x3a\x00\x9b\x27\xa7\x14\x92\xd4\x35\xef\xe7\x58\x7f\xe6\xd7\x31\xe4\xd5\xbf\x69\x7e\xe9\xe8\xd4\x70\x53\xaf\x00\xfc\x95\x1d\x4e\x86\xef\xb6\x09\x0a\xa6\x9b\xd5\x62\xad\x2e\x7e\x71\x7b\x8f\x3e\x9d\x8e\xcf\x25\x39\x48\xce\x40\xb5\x78\x6d\xd5\xb9\xed\x38\xc4\x75\x71\x31\x91\x8f\x86\xb4\x9c\xfc\x0e\x79\xdf\x74\x40\x56\xaf\xb0\x64\x64\x85\x30\x4a\x82\x9f\x5e\xfc\xf6\x8f\x34\x20\xad\xf2\x64\x48\xea\xd7\x21\x7a\x70\x70\x00\x57\x13\x32\x5f\x88\xa7\xc2\x4d\xae\x51\xda\xd5\xb2\x2d\x9d\xce\xd9\xed\x52\x7b\xeb\xe7\xb8\xdc\xbe\x61\x9d\x7d\x4f\x6e\xa6\xc8\xb3\x24\x44\xaf\xb3\xc7\xc6\x7d\x7f\x1f\xb1\x16\x73\x11\x4d\x66\x1f\x58\x5b\xc9\xa4\xba\x01\x5f\x54\xa1\xe2\x81\xd4\xa4\x9a\xee\x5e\x62\x54\x5b\x29\x95\x61\x82\x1b\xca\x27\x49\x9a\x80\x93\x16\xdd\x11\xa3\x80\x04\x6d\x7e\x7d\x86\x67\xad\xba\xdf\xf8\x4a\x21\x56\x4e\xe0\xfe\x3e\xfa\xcb\x2f\x71\x7a\xf5\x4b\x74\xfd\x1b\xd1\x26\x15\xb4\x32\xf4\x42\xa6\x58\x4f\xad\x4f\xe5\x33\x49\x27\x9d\xf1\xa5\x28\x29\x43\x29\x99\x53\x87\x64\xa5\x65\x68\xe5\x8d\x66\x55\x90\x1f\xca\x75\x34\x6f\x56\xa3\x8a\x28\x3f\xd9\xdb\xd3\x16\x5b\xa9\x9d\xd3\xd3\x92\xdb\x9b\xbe\xfa\xf8\x96\x66\xa3\xb4\x96\x9d\xba\x53\xa8\x0c\x2d\x72\x94\x3e\x7e\x44\x41\xea\x83\xaa\xa0\x47\x27\xf3\xa4\x54\x89\x5f\x22\x0c\x0c\x54\x3c\x7f\x9a\x2e\x41\xf5\xf8\x0c\xee\x07\x14\xaa\xd5\x2e\xd7\xfe\x97\x7c\x92\xe2\xbe\x52\x9d\x9e\xa2\x3e\xfa\xd1\x98\x0f\x25\xc4\x4c\xe5\x53\x8f\x93\xfa\x5d\x5c\x51\xda\x63\x1b\x7a\xc5\xe6\xd9\x52\x80\x1d\x8b\xc0\xb6\xbd\xff\x6b\x38\xf9\x51\x50\xb5\xd1\x3a\xb0\x96\x0e\x26\xfb\x00\x70\xae\x4d\xd9\x71\xb5\x36\xcd\x5b\x2a\xe4\xc6\x80\x45\x68\x5d\xb9\x12\xca\x3f\x62\xf1\xed\xb1\x84\x0c\xd6\xe6\xe0\xb8\xb2\xf2\x83\xcd\xb1\x4c\xeb\xee\xb7\xc6\x16\xcb\xb8\x7a\x58\xb9\x1c\xcb\xce\x38\x72\x29\x0c\x4b\x17\x69\xd7\x1a\x2d\xaf\xba\xa1\xbd\xec\x4e\x56\x5f\xdc\x95\xe4\x45\xd7\x99\x83\xa8\x47\x8f\xca\xed\xa9\xd5\xf7\x73\xec\xd9\x42\x8c\x5f\xea\x55\x19\xab\x4b\x89\x43\xdb\xb7\xeb\x3e\x7a\xc4\xb7\x7b\xf1\xdc\xd6\x94\xb7\xd9\xdb\x1a\xb3\x4e\x5b\xa7\xa7\xfc\xae\xc6\x7e\xa1\x53\x89\xe6\x44\x43\xe2\x1e\x3a\xab\x46\x2f\x95\x92\xc8\xe3\xd2\x37\x5d\x57\x80\xf6\xd1\x10\x75\x35\xaa\x3e\x7e\xa4\xd3\x20\x1a\xbb\x55\x43\xb2\xbf\x8f\xbe\x39\x05\x8e\x36\x02\xdb\xc9\xef\x77\xbc\xb2\x68\x22\x8a\x7b\x9b\x81\x89\x2e\xd2\x85\x57\xba\x93\xdc\xa4\x4b\x79\xc3\xf0\x2f\x70\x72\x4e\x0c\x32\xcf\x9c\xf8\xce\x78\x5c\x3e\xb0\x3b\xe3\x38\x4f\x11\x8b\x51\x42\x17\xa7\x08\x44\x77\x56\x66\x16\xe5\xc6\x27\x6c\x43\xa5\xdb\x10\xdc\x4f\x5e\x24\xf1\x0d\x04\x0b\xa4\x47\x2e\x3f\xbd\x8b\xab\x54\xd4\x8e\x58\x24\xb0\x57\xa4\x70\x37\x52\xa4\x28\x59\xc6\xb1\x4c\xae\x5d\xd5\x87\x65\xc2\x3a\x1c\x88\xab\x8c\x71\x8d\xb1\xe6\x90\xef\xca\x0e\x06\x72\x6f\x77\x40\xf4\x8c\x5e\xb3\x4a\x6a\x23\x15\xac\x4f\xd7\x8c\xed\xef\x83\xbb\x21\xd7\x66\x38\x1c\x05\xf9\x8e\xa9\xeb\x35\xe8\x52\x03\x84\xc4\xbd\x21\x5a\x72\x7b\xf5\x66\x58\xa5\x88\x32\x77\x42\xf7\xea\xb1\x35\xfc\xe8\x07\x34\x80\xcd\x46\xea\xe7\x07\x6f\x81\x97\xa5\xe8\x4f\x4f\x43\xfd\xe3\x54\x8d\xb7\x5b\x61\xa6\xf1\x77\x49\x33\x5b\x75\x6a\x2a\x13\x6c\xd5\x49\xa9\xb4\x6d\x55\x3a\x86\xb6\xbd\x01\xb0\xca\x9a\x26\x51\x33\x60\x57\x9e\x9d\xd5\xed\xd4\x1c\x9e\xa5\xe9\x64\x69\xee\x2b\xa6\x90\x7d\xb4\xee\x06\x20\x74\x8b\x73\xcb\x38\x41\xd8\x29\x33\x6a\x2e\x61\x8e\x6a\x44\xcc\xf2\xf1\x35\xda\x40\x6a\x1c\x59\x62\xe3\x4a\x51\x76\x54\x29\xcb\x6a\x01\x16\x05\xa8\x1d\x62\x11\x19\x61\x16\x25\x94\x19\x68\x11\x21\xcd\x3f\x5a\x03\x93\x65\x0d\xa5\x80\xd1\x0a\x29\xc0\x61\x11\xe0\xf5\xac\x2f\x7a\x25\x7e\x15\xd5\x80\x79\x89\x03\x88\x1b\x62\x4c\x38\xf0\x43\x29\x81\x92\xa0\x0c\x49\xec\x86\xaf\xa3\xc2\x84\xba\x8e\x8a\x32\x48\xa9\x55\x56\x56\x06\xb4\xdb\x84\x22\x03\x6c\x61\x4c\x26\xfd\xa9\x7f\x56\x8e\x3b\x1a\x90\x2a\xd4\x41\xb3\x34\xd6\xd9\x94\xfe\xd4\x3f\x3b\x54\xf5\x1c\xd2\xfa\x52\xaa\x64\x87\x24\xd0\xab\xe9\xdf\xdc\x15\x85\x01\xdc\x59\x53\x7c\x34\x46\x64\xbd\xa0\x9a\x1c\x29\x3d\xfc\xcb\x8f\xa2\xe4\x2a\x75\xbc\x93\x92\x25\xe2\x00\x41\x55\x71\x39\xe5\xa2\xa0\x3f\xca\xfc\x4e\x4b\x2d\x6e\xa6\x45\x9c\xc3\xb4\x3f\x21\x3b\xbb\xfc\x45\x04\xd4\x75\x54\xa8\xbf\x14\x0c\xb0\x0a\xfc\xbd\x60\x14\xa9\x69\xa7\xbf\xe8\xfc\xd2\x7f\x0b\xfb\x1c\xe4\x45\xfa\xcc\x98\x85\x62\xd0\x65\x9e\x3a\x84\xd6\x09\x60\x49\xff\xe3\xd1\x4b\xec\x74\xeb\x35\xa1\x2c\xf3\x8b\xf4\x6a\x0a\xdc\xde\x41\x4f\xb1\xff\x3e\xc8\xd2\xc5\xf3\x84\x7b\xc5\xb1\xd8\x59\x76\x64\x4b\x68\xa8\x19\x3d\x88\x47\x3e\x29\x13\x84\x0c\x41\x1b\x71\x1f\x7f\xd6\x60\xc7\xf8\xe2\x45\x89\xc7\x29\x34\xca\x95\x43\xbe\xa5\x7e\x73\x82\x81\xa3\xab\x7b\x1b\x32\x5c\xae\x9d\xfb\x8f\x72\x2f\x2e\x6f\x3c\x86\x27\xad\x73\xc7\xd1\xfd\x46\x5d\x5b\x8d\xf0\xdf\xb3\x77\x06\xb7\x0f\x50\xdd\xea\x46\xe0\xfe\x92\x2e\x8b\xa9\x63\xa1\xdb\x4d\xa6\xc5\x4b\x12\xea\xe7\x39\x2b\x69\x25\x69\x40\xda\xd6\xec\x70\x85\xdd\xd0\xd6\xac\x26\x32\x3c\x80\xf8\xef\x56\xfb\x75\xab\x37\xd9\x98\x63\x90\x88\x6c\xe3\x62\x9a\x6a\x4e\xb6\xe8\xb5\x43\xb4\x92\xbc\x07\x41\x06\x3a\x16\x9c\xf6\x18\x49\xfe\x69\x76\xa8\xa3\x6d\xf6\x6d\xb3\x7a\x7d\x9f\x5c\xf1\x91\x64\x9f\xd0\x07\x54\xe0\xec\x9c\x14\x53\xe4\x31\x63\x9e\xd7\x01\xff\xd6\x9c\xa7\x11\xb0\xf5\xb4\xb7\x56\xdb\x5a\x7c\x59\xf1\x5f\x7b\xcf\xfe\xab\xad\x89\x76\x6f\xe1\x07\xdf\x4f\xb8\xb2\xf3\x64\xef\xb6\x65\x77\xc2\x70\xea\x11\xde\x27\x8e\xd8\x89\xa5\xa7\xb1\xda\x3e\x5f\x7a\xdd\xc9\xfd\x80\xa4\x7c\xcc\x2e\x86\x50\xa8\xcb\xb3\xcc\xa1\x72\x8f\xb3\x4e\xc9\x2c\xb0\x39\x16\xcb\xe7\x4b\x45\x8f\xd0\xe6\xff\xa8\xe3\x7a\x5b\x34\x38\xd8\xbb\x3d\xb9\x73\xb8\x46\x3e\x8e\x10\xa8\x51\x79\x2f\xed\x22\x44\xe3\xe0\x7e\xa5\x5b\x7f\x88\xab\xf8\x10\x57\xf1\x21\xae\x62\xb3\xb8\x8a\x62\x93\x01\x35\x23\x86\x5b\x83\xf8\x73\xa7\x51\x17\x0d\x97\xe4\xca\x60\x76\x43\x37\x7c\x5d\x33\x06\xa0\x11\xc2\xef\x35\xa4\x8c\xa8\x60\xd6\x61\x19\x74\x55\xb0\x3f\x00\xba\x6f\xa1\xee\x3e\x71\xea\xfe\x8a\x80\x77\xc6\x24\x40\x64\x2a\xd0\x75\x32\x66\x13\xc9\x54\x48\x5e\xe4\xbd\x87\xa0\x78\x9f\x34\x28\x1e\x2c\xec\x16\x1c\x98\x46\x24\x33\x2f\x87\x0f\x1e\x7a\xcc\x55\xde\x8f\x41\xd5\x8d\x1e\xa3\xdf\x70\x71\xd1\x5b\xa4\x57\xac\x52\x07\x0d\xc1\xc5\xa6\xed\xc9\x28\x5b\x6b\x13\xae\x6b\x01\x76\xee\x07\xdf\xd4\x0b\xbe\x89\x0f\xfc\x3a\x1e\xf0\x5b\xc8\x18\x65\xbf\xb8\x12\xd7\xd5\xc6\xb9\x61\x9e\xa0\x3c\x4a\xce\x63\xc2\xe4\x76\xa9\x67\x2f\xbd\x08\xdb\x34\x00\x46\x65\xfc\xa2\xf5\xea\xdf\x25\x33\xc3\x5d\xb2\x32\x6c\x37\x30\x7e\x75\x3c\x0c\xed\x21\x60\x7e\xc1\x43\x0d\x48\x43\xd0\x09\x2a\xb2\xe8\xfc\x9c\x64\xcc\x6e\x0c\xec\x2a\xde\x0c\xa9\x67\x47\x7a\xde\x9e\xcd\x1e\x0a\xda\xcc\xf4\x35\x87\x16\xa8\x18\x8b\xaf\xf5\x5d\x72\xc5\x70\x7c\xa5\x4f\x8e\x1d\xa3\xf1\xb5\x3e\xf2\x77\x0f\xc5\xc3\x32\x79\x78\x98\x8f\xfe\x99\x13\x16\x37\x50\xf7\x74\x58\xe0\x3c\x47\x18\x65\x24\x94\xef\xe8\x85\x03\x04\x64\x4d\x74\xc4\xde\x92\x2a\xe1\xc6\xcf\xea\xed\x69\xc8\x59\x06\xd8\x35\x23\x46\x3d\x3c\xe8\xfd\x5a\x1e\xf4\xda\xfc\x02\x89\x23\xd7\xe6\x97\x40\xdc\x59\x42\xdd\x63\x8f\x59\xf0\x51\x94\xa0\x79\x14\xc7\x11\x4b\x03\x2c\x18\xe3\x7f\xa7\x4b\x88\xaa\x99\x43\x1c\xaa\x1b\x84\x85\x34\xce\xed\x25\x80\x0a\xc7\xb1\x86\x2a\xef\x50\xee\xa2\x6c\x73\x19\x05\x4b\x78\x70\x7c\x15\x15\x17\x08\x83\xd6\x80\xf8\x85\x1e\xf5\x60\x07\x2f\x95\x85\x21\xe7\xab\x78\x9e\x0c\xf3\xcb\x66\x17\x12\x2a\x68\xc3\x14\xf1\x58\x69\xb3\x1b\x98\xeb\xdf\x4b\xde\x5b\x7b\x2a\xa4\x1a\x5d\xe1\x6f\xdc\xeb\x54\x2d\xed\xf3\xa8\xb8\x58\xce\x7a\x7e\x3a\x67\x4b\xfa\xbf\x79\xc5\xd2\x6e\x23\x50\x21\x25\x74\x0a\x69\x2b\xfb\x70\x8b\xe4\x09\x1f\x36\x7d\x42\x4d\xab\xaf\x7c\x3f\x4d\x81\x76\xf6\x78\x5a\xa4\x9a\x40\x5f\xfa\xcb\x69\xda\xd1\x75\x9e\x4d\xc3\xc0\x6c\xfa\x66\x9a\xf2\xf3\x6b\xbe\x99\x54\xbe\x38\x29\xbf\x0e\x31\x8d\xad\x90\xca\x98\xbd\x15\x4e\x17\xd8\x8f\x0a\x3a\xcc\x5e\xdf\x3b\x29\x7f\x57\x1e\x7e\x4a\x49\xdc\xea\xf7\x0e\x27\x6d\xc3\x27\x77\x83\x87\x26\x40\x52\xc5\xeb\x63\xad\x1b\xcc\xd5\xa6\xaa\x27\xd2\x17\xec\x2f\xe2\x5d\xc1\x3b\xb7\xdb\x57\x21\x14\xc1\x0a\xb8\x07\x65\x06\x90\x1c\x58\x03\x8c\x95\x1a\x5e\x66\x81\xd2\x67\x99\xce\xc9\x12\x05\xb8\x1f\xd3\xcd\x47\x1f\x07\xad\x1a\xcf\xd3\xae\xce\x01\x78\x24\xbc\x2c\x52\xe6\x7f\x2b\x14\x66\xd0\x5f\xc3\x33\x57\x73\xfa\x75\xb1\x84\x68\xc2\xf1\xbe\x8b\x8b\x01\x06\x89\x56\x36\x07\x9b\x48\xd1\xf5\x32\x2e\xf6\xa5\xbe\x5e\x0f\x36\x7c\xab\xb6\xaa\xb0\xbf\xcf\x62\x4b\xf2\x03\x9e\x45\x00\xba\xc2\x59\x42\x4f\x57\x58\x93\x3e\xe6\x29\x9d\x75\x77\x55\x9b\x3b\x85\x39\xe1\x4d\x79\x48\x99\xb9\xa7\xe5\x71\x2e\xf7\x3a\x0e\x72\xa7\xf2\x2f\xd1\x50\xbb\xe3\x98\x1d\x81\x4a\x2e\x88\x15\xc8\xd0\x77\xa8\xdf\x3b\x38\x38\x90\x48\xc5\x9b\xc2\x8e\xa7\x96\x8e\x7b\x21\x0e\x1a\x2f\xc4\xc1\xca\x55\x18\x25\xe7\x2b\x16\x62\x94\x9c\x37\x59\x8b\xcc\x31\xae\xe1\x3a\x1c\xae\xb5\x10\x87\x0d\x57\xe2\xf0\x61\x29\xde\x61\x29\x5e\x47\x76\xe5\xaf\x6c\x25\x2a\xfe\x0a\x48\x8c\x6f\x2c\x80\xd1\x68\xb4\xc1\x52\xdd\xe2\x99\x79\x1d\x15\x35\x2b\xf5\x3a\x2a\x6a\x57\x29\x0e\x82\x9f\x93\x40\xcb\xa9\x66\xae\xd4\x0e\x4a\xc8\xb5\xe5\xf2\xae\xd6\x98\xf5\xbc\xd9\x26\xae\x7e\x21\x59\x4b\xd5\x58\x03\xfa\xa3\x91\x12\xd3\xd9\x15\xad\xd3\xd6\xe2\xb5\x9c\x14\x1c\x6b\x8b\x76\xa5\x23\xaa\xeb\x8f\x4e\x77\xfc\x72\x93\xc9\xd4\x6f\xee\xe8\xb9\xbe\xe2\x01\x24\x18\x7c\xb4\x07\x87\xf0\xbb\xd6\x05\xdc\xe9\x01\x6e\xfb\x50\x37\x74\xa1\xae\xf6\xa0\xd6\x1d\xa3\x1d\x7e\xd1\x5c\xa9\xa3\x40\x78\x81\x0e\x03\xab\x83\xa7\xec\xe7\x50\x50\xd4\xcc\xe3\x78\x85\xc3\xb1\x62\x26\x83\x8f\x9c\x47\x4f\x85\xf8\xb7\x91\xe7\x31\x38\x1e\xc3\x24\xd9\x1e\xc4\x75\x0e\xc0\xdc\xe7\x97\x0f\x12\xfd\x13\x46\xa2\xda\x7b\x97\xf5\x06\xfe\xa4\x64\x1b\xbe\xbb\x32\xef\x91\xa0\xdd\xe1\xb6\x78\xdb\x91\x8c\xd3\xd3\x87\x5e\x4d\x8a\x11\x83\xe5\x97\x34\x43\x39\xc9\xe8\x0d\x18\xa2\x8b\x33\x56\x16\x81\x5d\xf9\x1e\xf1\x8d\xb6\x6c\xa3\x84\x2e\x76\x36\x10\xfa\xee\x50\xb3\x63\xda\xef\x8f\x9a\xfa\x1e\x9b\x6e\x21\xcd\x7d\x90\xf5\x35\x24\x15\x67\x2b\x3c\x5d\x1b\x39\xff\x1a\xb6\xa4\xf2\xf5\xa5\xbc\x90\x4c\x30\x6b\x25\x99\x3b\x39\x07\x35\x0b\xcb\x1b\xc6\x14\x95\x37\x0a\xae\x25\x85\x7f\x64\xb1\xf0\xb1\xee\x18\x9e\xb7\x19\x09\xa7\x62\x09\x2b\x50\xcd\x13\xd4\xf2\x02\xad\xf4\xf7\xa4\x5b\xe4\x4a\x67\x4f\xb8\x30\xbb\x3c\x3d\x2d\xdf\x6c\xa9\x9b\x52\x6e\x94\x0e\xe5\xe6\x87\xdb\x15\x8e\x93\xcc\xb1\x47\x31\x02\xbf\x81\x9f\x94\x5c\x1a\x87\x9f\x33\xeb\xb4\xe8\x80\xe6\x1f\x74\x0a\x23\x61\xb9\x2c\xa2\x53\xc4\x9d\x25\x71\x9e\x47\xe7\xb0\xec\xd4\x59\xcf\x7c\x7d\xdb\xe8\x83\x52\xb9\x44\xe8\x14\x0d\x4e\x50\x84\xbe\x2f\xa9\x5d\x4e\x50\x04\x8a\x14\xb6\x83\xb0\xa0\xb8\xba\x0a\x25\x7a\x7b\xa2\xf0\xbc\x27\x37\x54\x1a\x64\x60\xb4\x12\xdd\x02\x38\x29\x0b\xa1\xe8\xe8\x5d\xe0\xfc\xc5\x55\x22\x3c\x38\x99\x73\x29\xab\xd2\xa1\x18\xda\x6d\xe9\x90\xfc\x86\x6b\x6c\xd8\x57\xf8\x75\x82\x6e\xe1\xff\x89\xac\x78\x00\x77\x82\x6e\xa5\xb3\x9d\x50\x05\x57\xba\x91\x88\x10\x84\x3a\xa0\xe9\xa0\xf5\xef\x28\x0e\x7c\x9c\x05\x2d\x85\x4d\xba\x81\xe1\x20\x00\xb6\xaa\xf4\x4d\x1b\x95\x40\xeb\x1c\xc6\x04\x8c\xe6\x2f\x37\x4f\x2f\x49\x7d\x13\x13\x17\x74\xbd\x8f\x9d\x04\xdb\x6d\xd2\xe4\x95\xbe\x7b\x87\x07\x0e\xd8\x3a\xfc\x0e\xa7\xbd\xdf\x57\x4c\xf1\xf0\xf0\xf8\x93\xb8\xdf\x55\x35\x20\xd9\x87\xb7\x40\x17\x81\x13\xbd\xd9\xfc\x89\x14\x7f\x61\xad\x25\xe4\xea\xc5\xec\xbf\x74\xdb\xbb\x3d\x91\x28\xbe\x39\x85\xb7\xbd\xc6\xe2\xe5\x8b\x4e\x6b\xac\xd1\x8a\x4b\x67\xff\x15\xcb\x8d\x35\x25\x16\x5b\xca\xff\x64\x2b\x8d\x7d\xd3\xf6\x4c\xa0\x94\x53\xcd\x3e\x02\xa0\x3e\x1c\xa6\xd6\xb7\x25\xf2\x93\x75\x90\x26\x69\x0b\x5a\xbf\x91\x9f\x91\xf8\x23\x0d\x0d\x40\xd8\x0e\x2e\xb2\xf4\x8a\x36\x87\xe8\xc4\xff\x9c\x65\x69\xd6\xfa\xf6\x19\x4e\xe0\xd9\x36\x8e\x63\x84\xd9\x79\x8d\x70\x8e\xb0\xdc\xeb\xbe\x6d\x97\x48\xab\x94\xf9\x5b\x39\x89\xc3\x0e\x20\x93\xa4\xd1\x22\xb3\x75\xf9\xc4\x80\x93\x00\xf7\xde\x0b\x9c\x27\x5e\x81\x66\x84\xd0\xbb\x70\x54\x44\x38\x8e\x72\x12\xa0\x2e\xca\x97\x0b\x10\xee\x75\x08\x96\x2b\x86\x91\x26\x5e\x55\xd3\x1e\x3c\x7a\x24\xaf\xfc\xf0\x9b\xde\xa4\xbe\x65\x12\xe6\xb7\x74\x03\x2f\x7d\x53\xbd\x44\x3f\xb2\xe2\x29\xa2\x14\x97\x78\x93\x29\xfe\x5b\xf9\x72\x06\x3b\x40\x87\x91\xc5\x76\x03\xde\x55\x8e\x5c\x7d\x60\xaf\xef\x65\x13\x94\x3a\xeb\xa3\xe0\x43\xe7\xd4\xbc\xa2\xb0\xf4\x3c\xcc\x48\x9e\x53\x32\xe6\xcb\xbc\x40\x24\x02\xe9\x79\x46\xe4\x03\x75\x35\x57\x1d\x78\x82\xff\x2d\x7a\x8c\x4a\xb4\xc0\x50\x09\xea\x15\x57\xab\x53\x8e\xdf\xf6\x35\x02\x0d\x72\x55\x95\x0e\xfa\x00\x61\xbf\xf8\xcc\x4f\x61\xa9\xc1\x85\x4c\x0d\x0e\x49\x96\x73\x92\x61\x78\x72\x16\xe2\x38\x27\x1d\x74\x95\x45\x05\x96\x6f\xd0\x20\xc4\x42\x18\x9d\x2f\x33\xac\xbd\x4b\x43\xb7\x6d\xb6\x4c\xf5\xc1\xe5\xf4\xe5\xa6\x23\xfe\x8f\xee\xf2\x8a\x09\x52\xb4\x69\x06\x84\x53\x0d\x44\xba\x02\x6b\x47\x93\x9c\x7e\x51\xc6\x6f\xf8\xfc\xfd\x91\xe1\xe3\x29\x1e\x02\x3f\x7a\x24\x9f\x27\xe5\x8b\x38\x2a\x20\x83\x6c\x2f\x4c\xb3\x9f\xb1\x7f\xa1\x45\x60\xf2\xad\xc4\xb4\x20\x44\xc9\xb3\x4e\xc9\x50\xbc\x45\x76\x6d\x6e\x9f\x88\x44\x8c\xe6\x01\xa7\x5d\x84\x65\xf1\xae\x69\xd5\x0f\xcd\x5a\x72\x81\x5e\x43\xa0\xe0\x02\x16\xdc\x95\xde\x39\x6e\x18\x3d\x09\x4d\x85\xe7\xdd\x79\x17\x48\x17\xce\x04\xcf\x09\x04\xb0\x98\x11\x19\x1d\x06\x02\x29\x44\x05\xd3\xd0\xcd\x08\xca\x97\x61\x18\x5d\x73\xf7\x6a\x82\xfd\x0b\x94\x17\xf8\x9c\x4c\x11\xe9\x9d\xeb\x96\xe3\x33\x45\xd5\xe9\xb7\x21\x0e\xc8\xb7\x67\x9c\xba\x1c\x9d\xd1\xdf\x5d\x20\xe6\xac\xa3\xff\xea\x62\xbf\x88\x2e\xc9\x59\x87\xe3\x60\x5f\xae\xa3\x42\x81\x5d\x47\x85\x84\xe2\x65\x4c\x8c\x3f\xeb\x00\xa9\x7a\x91\x00\xe4\xfd\xa4\xd3\xa9\x19\xbe\xf5\x71\x83\x6c\x4c\x71\x0e\xe9\x1d\x72\x9e\xd3\x29\xa0\xb0\x64\x41\x2f\xa2\x49\x11\xdf\x40\xe6\xdc\xa9\xde\xc3\xb3\xb3\xff\xf2\xcc\x85\x5a\x5f\x3f\x7c\x60\x45\xf2\x72\xe1\xcd\x6f\xba\xe2\xbe\x6e\x7c\x7a\x02\xc4\x71\x00\xf8\xdb\x86\xe3\xe6\x6b\x0a\xc0\xe2\x1a\x19\x1f\x1c\xf5\x2d\x28\xb8\xf9\x41\x6d\xb8\xfe\x6b\xc5\xae\xba\x1a\xcc\xed\xad\xec\xa2\xd6\xe1\xff\x01\x1b\xe5\x07\x96\x77\x01\x7d\x44\x66\x4f\x7f\x9c\x22\x91\x91\xa1\xdc\xcb\xd2\x47\xa0\xd4\x5d\x5a\x55\xe3\x3a\x2a\x9c\x85\x6e\x78\xde\x05\x99\xf1\x8d\x5f\xbe\x95\xbc\xa7\xf9\xc7\xbc\xba\xc0\x0b\x62\xbb\x35\x9f\x7d\xaf\x96\xe4\x0f\x67\xca\xd9\x88\x65\x09\x89\xe6\x73\x12\x44\xb8\x20\xf1\x0d\xc2\x61\x41\x98\xc3\x86\xc7\x26\x80\x2e\x30\xa1\xa3\xe1\xa2\x44\xc4\x39\x85\x2f\xd0\x5e\x69\x58\x7f\x11\x77\x34\xba\x75\x4c\xd1\xdf\x8b\x79\xfc\xb3\x88\xc2\x13\xe5\x4f\x00\x19\x5c\xf8\x67\x69\xca\x22\x5c\x98\x2e\xb6\xaa\x5f\x65\x77\xa6\xbb\x74\x86\xb3\x07\xed\x13\x43\xe6\x19\x6b\x4b\xf5\x6f\x57\x5d\x83\x2f\xbb\xea\x5d\xa9\x5b\x9e\x3c\x15\x70\x46\xd0\x77\xdf\xb1\xed\x3d\xf8\xee\x3b\x14\x66\xe9\x5c\x26\xed\x05\xe5\xfb\x96\x3b\x4a\x82\xdd\xf4\x93\xae\xeb\xbb\x73\xa1\x41\x2e\x6c\x2c\x3b\xa2\x55\x32\xd6\x66\x2c\xb5\xe7\x70\x24\xdd\xed\xa8\x12\x31\xa8\xdb\x64\x18\x7b\xb8\xcb\xcc\xc1\x5e\xa1\x72\x07\xa3\x27\xe8\x4c\x75\xe2\x4c\x3b\xf7\x99\xef\xd0\xb3\x57\xaf\x74\x0f\x30\x38\x28\xa5\xfc\x90\x2b\x4f\xa3\x28\xc9\x17\x2c\x3d\x19\x73\x4a\x22\xd7\x3e\x89\x63\x8a\xe7\x4d\x72\xde\x65\x35\x08\xf3\x38\x9a\xee\xef\x5f\x5d\x5d\xf5\x92\x73\x5e\x0a\xae\x84\x6d\x14\x47\xb3\x0c\x67\xe0\x56\x44\xb1\x9a\x2e\x89\x4a\x02\xc0\x68\x81\xa3\x0c\xd1\x2b\x08\x30\x66\x02\xa7\x70\xb0\xcc\x64\xc4\x2b\x79\xa8\x9f\x71\x39\x61\x0f\x72\x38\x06\xe8\x0c\xe4\x01\x26\x75\xe4\x32\xa2\x95\x72\x7b\x04\xe1\x28\x8c\xb2\xbc\x28\x6d\x4d\x2c\x28\x14\xc4\xd9\xa2\xd8\x98\x2b\x1d\xfa\x96\x31\xdc\xb7\x02\x5c\xcb\xbb\x09\x5f\xc0\xbd\x8d\x0a\x53\xf4\x46\xa8\x3d\x96\x80\x0e\xfe\x5b\x64\x8b\x3a\x8b\x12\x16\x92\x8b\xc5\x20\x3e\x3f\x8f\x99\x18\xc6\x5e\x65\x00\x88\x7a\xba\x06\xc2\xd4\x39\x29\xf6\x78\xba\xe6\x33\x72\x8d\xe7\x8b\x58\xc8\x44\x30\x5f\xfc\x0a\xca\x53\x9b\x9a\x10\x42\xb0\x51\x80\x30\x3a\x41\xc0\xf2\x86\xd2\x0a\x09\xb9\x2e\x50\x11\xf9\xef\x55\xf2\x64\x4c\xef\x1a\x97\x24\x01\xa1\x51\x3a\xe8\x01\x76\xcd\x57\x14\x3a\x21\xe7\x8f\xc9\x38\xdf\xa1\x68\xbe\x48\x33\xeb\xcd\x1d\xe3\x70\xaf\xc2\x7f\xd4\x00\xf5\x4e\x38\x42\xb8\x30\xa1\x5f\x70\x00\xb6\x83\x0f\x52\xcf\xdb\x41\xbd\x1e\xd3\xec\xa3\xdb\x36\x3a\xfd\x01\xb5\x28\x34\xfa\xde\x7c\xe4\x47\x8b\x10\xfa\x20\x40\x6f\x79\x01\xd7\xdb\x9e\x7e\x98\xf4\xfb\xa2\xac\x24\x7e\x42\xf9\x0f\xec\xeb\x07\xd1\x2c\x83\xfe\xde\x24\x16\x80\xda\x92\x62\x98\x07\x4a\xf1\xf3\xe4\x49\x12\xbc\x58\x16\x48\x68\x46\xc1\xd9\x4d\xa9\x9a\xa9\x40\xf4\x1d\x0b\x8c\x27\x2e\x85\xad\x5e\xaf\x07\x8e\x55\xe2\x1b\xe2\xd7\x78\x51\x7e\x22\x8a\x59\xdc\xd8\x02\x17\xe4\x14\x89\xe8\x25\x70\x63\x44\xb7\x9c\x10\xc4\x8c\x92\xcf\x29\x03\x5c\xe2\xb8\xd5\x82\x71\x92\x78\x05\x0a\x52\xbc\xa2\x58\x64\x08\x94\x6f\x14\xe6\x1e\x3c\x0d\xba\x6d\x8b\x2a\xb7\x1d\x34\xe9\xf7\xfb\xfc\x37\x1f\x39\xdd\x88\xf8\x9d\x6e\x2e\x69\xa9\x96\xbe\x87\x09\x8c\x92\xd3\x0f\x16\xf2\xdb\x1f\x14\x10\x42\xdf\x07\xd1\xe5\x0f\x7f\x27\x71\x9c\xa2\xab\x34\x8b\x83\xef\xf7\x69\x81\x86\x66\x9f\xe2\x91\x05\x3a\x1d\xb7\x7b\x42\xfc\x64\xfb\x1b\x5f\x06\x7e\x9a\x66\x19\xc9\x17\x29\xf3\x7a\xa6\xec\x2f\x9c\x65\xcf\x80\xa8\x1f\xb4\xcd\x6f\xaa\x98\xd8\x67\x2b\xa4\xa7\xae\x1a\xa2\x7b\xdc\x52\x34\x45\xfd\x5e\x7f\x70\x22\x9a\xb6\x80\x7b\xa5\x2b\x4a\xa9\xfa\x80\xcf\xa4\x5a\x07\x53\xf1\x91\x0e\xf2\x3c\x47\x04\xe7\xa4\x0b\xf9\x2f\x4a\x6d\x5c\x47\x45\x05\xc2\x32\x60\xcf\xbe\x07\x55\xf7\xc4\x4d\xcd\xc8\x49\x0d\x1f\xec\x7d\x76\x4f\xb5\x5f\x4e\xaf\xf2\x0a\x55\x8a\x21\xa3\xe6\x4a\x87\x50\x03\xda\xf4\x0c\xad\x72\x05\xb5\x15\x82\x0c\xa0\xf4\x22\x1b\xfd\x69\xbc\x40\x6b\xd4\x88\xbc\xf3\xd6\x18\x1a\x9e\x9c\xd6\xb7\x86\x5e\x9d\xca\x5a\x6f\xbb\x6d\x60\x21\xa5\xba\x7c\xad\xce\x49\xf1\x4c\x5d\x9a\xf5\x04\x27\xb2\xb4\x25\x11\xa0\x1f\x95\x50\x3d\x15\xf2\x76\xbb\x14\x35\x8e\xd6\x92\x6e\x57\x06\x2a\x75\x43\x3b\x31\x63\x82\x6b\x3a\x17\x22\x14\x3c\x4c\x22\x93\xde\x2a\x2e\x55\x15\xc5\xb4\x53\x2f\x52\xc3\xbf\x61\xf3\x81\x1d\xde\x7d\x64\xd9\xce\xf0\xac\x7e\x7c\x87\x3d\x0b\xac\x34\xcc\x61\x9c\x5e\x3d\x49\x82\x27\xe6\x60\x5a\xb5\x3e\x81\x4b\xa0\x1e\x50\xaf\xc1\xb8\x56\x73\xc9\x8a\x21\x5c\xd5\x13\x12\xac\xe8\x08\x09\x56\xf5\xa3\xa9\x5b\xa3\x31\x53\xa3\x0a\x8e\xe0\x4c\xbf\xc6\x9a\x1a\xad\xb7\xa8\xf8\x10\x59\xe1\xed\xdd\xeb\x4f\x0c\xe1\x1d\x16\xe0\xdd\x5c\xd2\xf4\x50\x89\x6b\x0e\xf0\xb8\xf9\x00\x37\x5a\x5a\xe3\x4f\xb0\xb4\x58\x5f\xeb\xc7\xab\xc1\xc2\x12\x41\x23\xab\x46\xac\xc1\x96\x5b\x4b\x63\xed\x9a\x81\xef\xb5\x14\xda\x47\x8e\xe6\x7a\x70\xb3\xb0\x26\xd6\x2f\x9f\x4d\xdc\x61\x4d\x7e\x30\x9d\x98\xf4\xc5\x22\x4c\x62\x0a\xc7\x37\xa7\xa7\xc8\x63\x4a\x45\x0f\xfd\xa8\x7d\x79\x43\x61\xdf\xa2\xa9\x0e\xfc\x18\x79\x5d\x8f\x1b\x9c\x0c\x77\xe1\x32\xbf\xac\xdb\x12\xc5\xcd\x94\x9c\x9e\xd1\x28\xb4\xc9\xb5\x25\xa5\xd8\xbd\xa5\x40\x71\xf4\xcf\x12\x83\x4d\x4b\xe4\xdd\x96\xdc\x1b\x6b\xe4\x13\xa7\x43\xa3\xf9\x0a\x51\xd9\x8d\x0d\x16\xaa\xb0\xd6\x48\xde\xd2\x27\x57\x04\x94\x32\xf8\xc0\xb1\x58\xa1\x8e\xe6\x42\xa4\x2f\xd1\x0a\xc1\x42\x41\x3b\x96\xb5\x59\xc7\xbd\xa0\x55\x23\x8f\x1e\x55\x99\x9d\xf8\x4a\x76\xb5\xe2\xac\x54\xde\x04\x20\x96\x71\xed\xd0\x5a\xdb\x89\x39\xbc\xee\xbd\x46\xd1\xc6\xc7\x19\x9c\xb2\x99\xaa\x00\x2e\x55\x29\xfd\xc7\x27\xf0\xda\x76\x81\xa3\x84\x7b\x8d\xed\xef\xb3\x2c\xca\x08\x12\x0f\xf9\x24\xcf\x71\x76\x63\xa8\x4d\x34\xdf\x6c\x16\x33\x8e\x07\x37\x17\xa9\x91\x94\xce\x87\x79\xf7\xed\x7f\x87\x48\x1e\x47\x49\xd1\x0d\xa2\x1c\xcf\x62\x82\x92\xb4\xbb\x4c\x96\x39\x09\xba\xca\xec\x9b\x33\x7d\x98\xf0\x7c\x16\x81\xe2\x4f\x2c\x14\x24\x59\x8d\xa1\xe6\x70\x5a\x3d\xd4\xf4\x7a\x6c\x8e\xaf\xe1\x75\x2b\xcc\x7c\x25\x13\x9f\xda\x8f\xc4\x96\x19\x90\x98\x14\xcc\x0b\xde\xda\xa3\x50\x53\x2f\x45\x97\xdd\xb0\x63\xb6\xcb\xbd\x46\xc5\x46\x69\x7a\x18\x5a\x5e\xba\x7a\x58\x06\x43\xf0\xb2\x00\x94\xeb\x61\xd9\x7f\xd7\x70\x39\x34\x1d\x77\xf5\xc7\xfd\xc6\x89\x6d\x02\xe8\xcd\xc3\x4f\xb6\x25\xb5\xb5\xe9\xe1\x83\x63\xcc\xd2\x4a\x3f\xc0\xd2\x9c\x4a\x5b\x6c\xd3\x9c\x01\xaa\xce\x14\x7d\xb8\xd5\x42\x9b\x29\x97\x16\x8b\x24\xe6\xce\xd7\xe3\x70\xe8\x54\xf8\xf5\xbd\xf1\x78\x15\xef\xed\x6e\xe2\x25\x8e\xee\x57\xbc\xc4\xf2\x40\x89\x45\x28\x3c\xb1\x2e\x70\x5e\xef\xa9\xa6\xa2\x29\x0a\xd0\x3a\x5f\x2f\x01\xf3\x69\xbd\xb7\xe4\xce\xa2\x52\x68\x98\xdb\xac\x96\xfc\x95\x2d\xf9\x5f\xa3\xbc\x68\xa3\x52\x51\x0f\x07\x41\x4b\xdb\x98\xe4\xeb\x9b\x6f\xc0\xed\x40\x8e\x40\x29\xf7\x47\xdb\x42\xc6\x4f\xb3\x72\xd9\x63\xe4\x41\xf0\x2d\xed\x42\x70\xdb\x8c\x5d\x6d\x56\x1b\xdf\x77\x56\x13\xa3\x75\xa2\x26\x4a\x14\xad\x3b\x51\x9c\x47\xbe\xf9\xc6\x38\xf9\xcb\xd3\x27\x92\xb3\x94\xe6\x50\x68\x53\xbf\x05\xff\x24\xd7\xb4\x7c\x8b\xbe\x6d\xf7\xa2\x24\x20\xd7\x2f\x42\x0e\x66\x7f\x86\xbd\xa9\x3b\xa8\x9d\xb1\x6f\x79\xff\xbf\x75\xcc\xd8\x64\xab\x33\x56\x22\xc1\xe9\x88\x73\xe7\x15\xc1\x90\x95\x06\xb4\x11\xb7\xf7\x32\xb2\x88\xb1\x4f\x5a\xcc\xf1\xee\xfc\xe7\xeb\x45\xcb\x6b\xfd\x9f\x8f\xff\xf9\x4f\xde\xf6\xac\x01\xf6\x5a\x3f\x4e\xff\xf3\x9f\xfc\xe3\x5f\xda\x10\x7f\xdd\x6b\x77\x90\xf7\x97\x81\xd7\x96\x38\xf6\xff\x93\x3f\xde\x3f\xef\x20\xf0\x13\x92\x85\xff\xe7\x3f\xf9\x77\x1f\xff\x93\x7f\xf7\x17\xf8\xe4\x71\xaf\x1f\x6b\xe0\x0f\x3e\xa7\xcb\xf7\xd6\x56\x56\x2e\xb2\x5c\xcb\xf7\xe0\x62\x67\x36\x71\x57\x05\x13\x3d\x6c\xbb\xe1\xeb\x22\x8a\x5a\x98\xef\x67\x94\xdc\x9d\xc6\x03\x86\x58\x09\x15\xc1\x30\xe9\x02\x79\x5e\x90\xf9\x2e\xfd\xb1\x61\x8d\x24\xe2\x7a\xed\xf2\x95\x76\x80\xd6\xa1\x57\x50\x46\x60\x54\x99\x43\xdd\x29\x06\x38\x40\x57\x05\x51\x65\x50\xb2\xa2\x18\xab\xaa\x5e\x1c\x1f\x95\x40\xeb\x5a\x10\x30\xf7\x2d\x4a\xeb\x3f\xd2\xa0\x2a\x12\x6d\xf3\x10\xad\x80\x64\x8b\xe1\x4a\xf9\xbd\xe5\x35\x73\xb9\xdd\x4a\xf8\x58\xc0\xd5\x84\x44\xb9\x6b\x95\xb6\x31\x39\x6d\xac\xa4\x05\x4f\xde\x0c\x5f\x51\xee\xf8\x99\xa6\xc5\xb4\xee\xc9\x1b\x7f\x3c\x7c\xb3\x48\xcf\x33\xbc\xb8\xb8\xe9\xe5\xcb\xd9\x05\xc1\xf4\xde\xab\x6e\x60\x22\x65\xfa\x70\x2c\xae\x3d\xb3\xf4\xfa\x55\xf4\x07\xdc\x8b\x3c\x1e\x41\xb3\x3b\x4b\x55\x26\xd9\x19\xf6\xdf\x9f\x67\xe9\x32\x09\xa6\xc8\x4b\xd2\x84\xc8\x2f\xe9\x25\xc9\xe8\xf5\x7e\x8a\xbc\x8b\x28\x08\x48\x22\xbf\x14\xe4\xba\x78\xa1\xbe\x92\x38\x8e\x16\x79\x94\xcb\xef\x57\x17\x51\x41\x5e\x2d\x30\x44\xb8\x4f\xd2\xab\x0c\x2f\xe4\x37\xef\xd1\x34\x4c\xfd\x65\xee\x4d\x35\xd5\x9d\x4e\x04\xeb\xe7\x02\xc7\xa4\x28\x48\x8f\x36\xd5\x03\xb7\x4a\x88\x92\x83\xf4\x14\x09\xde\xa3\xe9\x05\x44\x88\x77\xa3\x7a\x96\xc6\x69\xd6\x04\x1f\xbf\x02\x32\xb4\x39\x89\x89\x0f\xd7\xc4\x0f\xa5\x11\x6a\x86\xf1\x96\xdd\x24\x6f\xb7\x10\x42\xf5\x37\x92\x2c\x51\x44\xf7\x13\x3e\x75\xf9\xdd\xa3\x9e\xb2\xb5\xbb\x61\x14\x2c\xa8\xbc\x9d\xc0\x57\x14\x55\x39\x2a\x5b\xb8\x8c\x51\x91\x72\x37\x08\x96\x40\x1b\x5e\x83\x6a\xde\xc7\xd2\x08\xaf\x0f\x46\xcc\x5f\xd0\xad\x11\x17\xcb\x8e\xac\xa5\x69\x35\xab\xfa\xc7\xbd\x40\x6d\x7f\x69\xdd\x27\x4a\x44\x87\x16\x41\xe3\x94\x77\x16\xfa\x99\x3d\x2b\xc0\xdc\x9b\x94\xf6\x85\x0a\x5d\x18\xbc\xb8\x44\x2e\x5b\x78\x6c\xe0\x88\x34\xa7\x5c\x0f\x36\x8b\x72\xcb\xb6\xc5\xbb\x45\xba\x05\x1c\x5b\x8d\x3a\xfb\x9a\xe9\x55\xeb\xa6\x85\x25\x7a\x59\x63\x46\x20\xb6\x5f\x0a\x1c\x73\x23\x97\x33\xb0\x91\x78\xf3\xcb\x02\xef\xc9\x85\x5e\x13\x8f\x16\x56\xb1\x3a\x7a\xe9\x7a\xa4\xe7\x71\x8b\xe9\xda\xb8\x20\x9b\x69\x39\xca\x34\x85\x9b\x7a\x7d\x2b\x39\x8b\x3f\x18\xb7\xb4\x72\x12\x4c\xb2\x91\x04\x91\xb6\x77\x0e\x22\xbb\x23\x20\x44\x81\x00\xe0\x99\xb3\xc4\xbb\x75\xf5\x20\x7d\xcd\x07\xe1\xf2\x3d\xb8\x96\x3b\x4a\x12\x0c\x3f\x04\x69\xf0\xe0\x9b\x53\x21\x93\x39\x89\x27\xdd\xb6\x25\x44\x05\xdb\x62\x12\x9c\x6a\x50\x3c\x93\xa0\x8b\xa6\x23\xf2\x6b\x1b\x02\xbc\xf5\x02\x9c\xc3\xcb\x01\x90\x63\xd3\xee\x98\x03\xde\xd6\xb5\x7a\x2b\x54\x9e\x52\x28\x53\x0a\xcf\xda\x27\xd8\xb3\x65\x51\xa4\x89\x9e\x82\xc9\xce\x4b\x54\xe0\xd9\x73\x7a\xdf\x9e\xa2\xee\xa0\x63\xea\xf5\x75\xeb\xc9\x9e\xc1\x00\x53\xf5\xe7\x9e\x7a\xe7\xdc\x6e\x43\xd0\x72\xc1\x84\x1b\x69\x19\x45\xa0\xaf\x0f\x8d\x37\x4d\x23\x24\x73\xa3\xe5\x68\xd5\x68\xb4\xd0\xac\x3a\x5f\xc4\xe1\xb6\x77\xbb\x8a\x91\x59\xb0\x34\x6d\x8d\xd5\xce\x44\x7b\x1d\x74\x7c\x9d\xd6\x4e\x54\x63\x84\xda\x5a\xff\xd2\x0e\x9f\xa6\x63\xc0\x73\xd4\x6d\x65\x3c\xb5\xed\xb2\x66\x49\xb4\xc1\xfa\x19\xb6\xb9\x3d\x40\x2e\x7b\x47\xb4\x01\xb6\x28\xbd\x39\x49\x96\x54\x5a\xf4\xcc\x65\x07\xbe\x9e\x7b\x6e\x93\xc2\x7a\x29\x99\x04\x0d\x90\x93\x49\xfc\xd8\x51\x52\xa6\xc3\xfb\xa5\xf9\xe5\x69\x5c\xa2\xcc\x5f\xc6\x38\xfb\x3d\x4b\xcf\x33\x52\x63\x50\x80\x7b\xfe\x8a\x46\x3d\x1b\x1b\x0f\xfe\xa4\xbf\xec\x14\x07\x0b\x64\x3d\xd3\x33\x61\xb4\xac\x17\x83\x95\xf9\x64\xac\x36\xda\x62\x86\x99\x51\xfd\x56\xd3\x47\x24\xa4\x41\xc7\x8e\x9b\x74\xcc\xc4\xb5\x8b\x6e\x99\x2d\xb8\x3a\xb5\x73\x7d\x89\xc5\xaf\x47\x0f\xea\xd7\x2d\xab\x5f\xbf\x9e\x0c\x68\x2c\x54\xed\x83\x7a\xb5\x46\xbd\xfa\x49\xd4\x9f\xaf\x9e\xff\x7f\x3f\xa3\x53\x34\xe9\x5b\x69\x87\x5e\x92\x18\x17\xd1\x25\xf9\x17\x5d\x35\x22\x93\xd0\x3c\x4a\x3a\x68\x8e\xaf\x8d\x6b\xe0\x7c\x41\x02\x80\x42\xa7\x2c\xf5\xd0\x3c\x4a\x5a\xec\x0f\x7c\xdd\x82\x2a\x2c\x7b\x11\xab\xaa\x85\x1b\x6a\x19\xb5\xbb\x14\x7d\x1b\xed\xa3\xd6\x1c\x5f\xf3\x5f\x32\x65\xd1\xb6\xb4\x8d\x42\xc3\x15\x44\xf9\x02\xa2\x08\x7a\x51\x12\x47\x09\xe9\xce\xe2\xd4\x7f\xef\xed\x69\xda\xb6\x45\x16\xcd\x71\x76\xc3\x35\x60\x1f\xe4\x8d\xd5\xa1\x10\xe3\xa0\x6f\x26\xfd\xfe\x5b\x1d\x05\xf6\x7d\x92\x14\x4d\x30\xb0\xd7\x53\x38\xbb\xe9\x3d\x19\xf6\xfb\x3a\x8e\xfc\xf2\x9c\xde\xa6\x0a\x92\xcd\xa3\x04\x17\x44\x21\x92\xcf\xa7\xa8\x1c\xb4\x8c\xba\x0b\x7e\x34\x74\x7d\x7e\x00\x76\xb3\xb4\xc0\x05\x41\x83\xde\x38\x47\x31\x1c\x1f\x28\x4a\xc2\x28\x89\x0a\xe2\x59\x6d\xfc\xe4\x6a\x41\x86\x42\x9c\x52\x69\x10\x1e\xc2\x74\x8f\xfb\x01\x39\x6f\x1b\xd5\x69\x7b\xb1\x56\x2d\x2f\xb2\xf4\x3d\x95\x9f\xfc\x65\x96\x89\x01\x90\xea\x50\xf6\x95\x9e\x66\x3e\x5e\x00\xe2\x65\x12\x38\xf0\x6d\xdc\xeb\x00\xe7\x17\xac\xcf\xfc\x59\x46\x37\x5d\x16\xaa\xe3\x82\x8e\xfd\x7d\xf4\x2a\x9d\x13\xb1\x30\x78\x16\x2d\x48\x91\x10\xa7\xe9\xfb\x1c\xd1\x2d\x1a\x5d\x61\xe6\x04\x2b\x34\x5c\x2a\x50\x40\x91\xa2\xf7\x91\xff\x3e\x47\x51\xd2\x33\xba\xf6\x13\xce\x2f\x70\x96\x01\x77\x1d\xf5\x3b\xc3\x7e\xdf\xea\x3b\x05\x48\x21\x0b\xff\x14\x19\x73\xed\xfd\x8f\xf7\xe4\x26\xcc\x60\xd7\xaa\x9b\x51\x4d\xfd\xeb\x0d\xfa\xfd\xbf\x1a\xea\x60\xc7\xa4\x8d\x0e\xb4\x49\x53\x4e\xa1\x0d\xdb\xa4\xe3\xa9\xb7\x68\xb5\x57\xee\xf4\xc0\xe8\x73\x75\xaf\x75\xc5\xf6\x64\x35\xd6\x7e\x7f\x25\xde\xee\x60\x52\xc2\x5c\x1a\xa0\x4d\x51\x0f\xfb\xe6\xf8\x6d\xa4\xf4\x86\xb5\xb0\x22\x8f\x5a\xeb\x8d\xc7\x77\x14\x48\x73\x0e\x9b\x08\xfd\x8b\x5b\x2a\xbd\x75\x73\x95\xfd\x56\x6d\xbb\xd2\x9a\xd4\x56\x1b\x6b\x4c\x2f\xd8\x4a\x7a\xb4\x3f\xaf\xb2\x9b\xce\x19\x7f\x1c\xab\x14\xd5\x7a\x3e\x01\x78\x36\x0b\x01\x2a\xf9\x8e\xce\x9c\x34\x61\x37\x99\xe3\xf7\x24\x47\x39\x49\x78\x0c\x5e\xae\xdc\x86\x53\xe0\x6e\x6c\x50\x26\x95\x1e\x9d\x6c\x23\x4b\x43\x24\x96\x32\x8a\x12\xa4\x4d\x26\x9a\x4b\x05\xfd\x3e\xe4\x32\xbe\x5e\x99\xd4\xa1\xd4\x4c\x94\xac\xdd\x4c\x4d\x1e\xb4\xca\x66\x28\xe3\xa6\x21\x4b\xc2\x76\x93\x2e\x33\xd9\x56\x0f\x19\xc7\x03\xab\x42\xf7\x68\x3e\xec\x24\x23\xe0\x51\x9b\x72\x32\xe9\x27\x59\x97\x41\x6b\x27\x1e\x7c\xf6\xd3\xa4\xc8\xd2\x38\x26\x81\xea\x11\x54\xd6\xfa\x00\x0f\xcb\xef\xb6\x8e\xca\xbd\x84\xc4\xdd\x82\xbb\xe0\xe8\xd3\x54\xf6\x90\xe7\x7b\x8d\x61\xdb\x4e\xb2\x9d\xe2\x22\xf2\xdf\x27\x74\x04\x2a\xe8\x92\x00\x6b\xcf\xe9\x9a\x6c\xc3\x6f\x6d\x2b\xd2\x3c\x1a\x26\x0b\xfb\xfe\x6f\x9b\x2e\xde\x59\xce\xc1\xeb\x98\x33\xea\x4c\x19\x6c\x63\x17\x66\x8c\x38\x95\x7e\xc0\x30\xc1\xd2\x7c\x11\xfd\x41\x94\x38\x70\xa3\xd9\x2e\x8c\x68\xba\x6a\x06\xc4\x67\x59\x22\x40\xe6\x6c\x5b\x67\x5f\xe9\x0f\xf1\xe1\x92\x4b\xe3\xec\x0b\x93\xdd\x45\x9d\x28\x51\x55\x22\x19\x73\x98\x6e\x1b\xb2\x18\x5f\xef\xce\x82\x02\x82\x20\xf2\xe8\x20\x98\x61\x73\x45\xe7\xe8\x0f\xda\x17\xfa\x2f\x50\x0e\x05\x11\x84\xe4\x9d\xe3\x6b\xc3\xcc\x42\x45\x7a\x79\xd0\xdc\xaa\xb9\x04\x5e\x7d\xc5\xc7\xf6\x03\xbc\xc1\x88\x42\xd4\x9a\x4b\x4d\xb9\xbe\x22\x75\x4f\xf3\x8c\xc4\xff\xc2\x31\x8b\xfb\xbd\xe2\x02\xf4\x1d\x1a\xf4\x79\x70\x6c\xd1\xe6\x72\xce\x23\xd0\xa1\x53\x34\x44\xdf\xb1\xcb\xd0\xef\xcf\xd1\x77\xa8\x05\xb7\xac\x7d\x34\x44\x5d\x24\xc3\x88\x6b\x64\xf6\x6c\x71\x43\x5c\xa5\x40\x36\x6e\xb5\x06\xfd\x3e\xea\x72\xea\xe8\x0d\x89\xfe\xfe\xce\x6a\x13\x08\xea\xf3\xaf\x7d\xf4\x18\x79\x8b\x6b\x1e\xac\xd7\xdd\x12\x08\x3f\x66\x43\x75\x18\x85\x1f\xbd\x18\xf3\x37\x1e\xce\x22\xdc\x85\x81\x49\xd2\x2b\xef\x2d\x3a\x65\x8c\x77\x52\x0d\x47\xe7\x91\xc2\xcd\xa3\xa4\x0e\x8a\x4e\x33\x85\xc2\xd7\xf2\x19\x4c\xf3\x20\xc3\x5e\x10\x5d\x72\x41\x6e\x45\x28\x61\x4d\x20\x68\x6a\xa4\x63\x8b\x1c\x1e\x18\x89\x53\x58\x0b\x78\xf6\x86\x7d\x7e\x8c\x3c\x76\xe3\x79\xab\x7b\x67\x1a\x6b\xbe\xda\xed\x05\x5d\x45\x41\x71\x31\x85\x3d\xa3\x23\x9d\x5b\x60\x07\xb9\xe5\xe1\x9e\xdb\xba\xe5\x73\x8a\x3c\xb1\x91\xce\x70\x26\xae\x51\x6a\x60\x85\x21\x8d\xd5\x69\x14\xa4\xd9\xcb\x2f\xcf\xa5\x28\xac\xc4\xe6\x46\xc3\xd5\x7a\x67\x3c\x1b\xfb\xb0\xda\x1e\xa4\xe0\x35\x0b\xa7\x75\xe7\xed\x20\xb5\x76\xcd\xf3\x74\xb5\xfd\xa1\x02\xff\x4f\x6e\xec\x16\x6e\xad\x76\x5b\x7b\x0c\x75\x19\x91\xab\xa7\xe9\xf5\x14\x79\x7d\xd4\x07\xb7\x6f\x58\xe0\xc2\x07\x9c\xfe\xb0\xaf\x21\xf5\x23\xef\xb1\x25\x6a\xa4\x42\x58\x8b\x3d\x59\xfd\x75\xac\xc8\x8e\x4b\x76\xcd\x30\xb7\xf5\xab\x11\x30\xb0\xb6\xa9\x68\xaf\xc4\xae\xa7\x48\xec\x75\x5a\xe9\x8d\xab\x34\x53\x85\x74\x5b\x54\x1f\xc2\x28\x8e\x6d\xcf\x2c\x71\x23\xfb\x37\x5b\x1d\xf2\xb8\x10\xc3\x0c\x11\x7e\x10\xfd\x5f\xa6\x33\xb2\x65\x80\xcf\x63\x39\xde\x8a\x90\x6f\xdb\x96\x57\x4b\x84\x56\x8d\x6d\x48\xad\x16\xca\x26\x52\x99\x4d\xc5\x4a\xf9\xdf\xae\xb0\xf2\x5e\xa2\x55\xf8\x82\x0c\xcf\x4c\x44\xba\x1b\xcf\x34\x6d\x8d\x1e\xb5\x95\x6d\xb1\x41\x6e\x8c\x0a\x64\xb4\xed\xa0\x62\xf2\xdf\xdd\x38\xb6\xb1\x65\x9a\x89\xa2\x5b\x21\x5c\x88\xb3\x5b\x61\x2d\x5d\x24\xde\x0a\x75\x42\x9c\x5e\x85\x4c\x37\xc1\x97\xf6\x51\x87\x29\x9e\xef\x72\x8a\x27\xe5\x2e\x35\xee\x77\xcc\xbb\xe2\xa8\x77\xa0\x76\x24\x6b\xca\xb4\x7d\xa5\x2f\x37\x8c\xbe\xdc\x09\x06\xfd\xfe\x56\x0c\xfa\x25\x0b\x34\xba\x6d\xb7\x4a\x26\xe3\xdd\x18\xf8\x8f\xbf\x70\x83\xe9\x4e\xcd\x97\x5f\xf9\x63\x98\x2f\xc2\x60\x8a\xb3\x84\xe7\x2b\x72\x91\x3e\xb6\x01\x6b\x6d\xa5\x0c\xe4\x8b\x32\xc6\xbe\x7e\xf9\xe4\x1f\xaf\x9e\xd3\x55\xfc\xee\xa7\x7f\xbe\x7c\x02\xcb\xf9\x14\x8d\x4f\xd0\xfe\x3e\x1a\xf7\xfb\xf3\x7c\x37\xc6\xd0\x45\x2a\xa2\x9a\x79\x19\xd7\x7a\x34\x78\x12\x21\xee\xa6\x93\xd5\x46\xd3\x15\xef\x09\x84\xf9\x74\x60\x99\x4f\x75\x64\x4f\xf1\xfa\xf8\x6c\x73\x2c\x2f\xff\x09\xe7\x17\xee\xd7\x0e\x74\x00\x70\x10\xe1\xb8\x7b\x4e\xff\x85\x9b\x19\x7a\x5c\x43\x2d\x5c\xf9\xfa\x7f\xed\xa0\x06\x60\x83\x83\xbf\x76\x98\x71\x6e\x81\x33\x92\x14\x68\x3c\xfc\x6b\xdb\xf1\x28\xe5\x15\x1c\x9d\xde\xa0\xbf\xb8\x46\xf4\x7f\x1c\x20\xbf\xab\x09\xa3\x50\xdd\xe1\x68\x71\xed\xad\x34\x3c\xaf\x18\x35\xcd\x04\x3d\x30\x4d\xd0\x1a\xb6\x75\xa6\x41\x43\x38\x76\x21\xbc\xe3\x3c\x98\xf4\xd6\xcc\x84\x03\xf0\x53\xce\xc5\x4c\x1f\x32\xae\xdd\x61\x46\xc9\x4e\x79\xfd\xe1\x59\x9e\xc6\x4b\xcd\x4a\x1d\x93\xb0\xe0\x62\x10\x20\x4b\x8b\x22\x9d\x6b\x05\x45\xba\xd0\x7f\x69\x11\x0a\x55\x86\x45\xd4\xef\x0d\x85\x03\x80\xd7\xb1\x6d\xfb\x2f\xb2\xe8\x9c\x8a\x5a\x1e\x6d\xca\xa0\x3c\xb0\x26\xa8\x8e\xce\x39\xce\xce\xa3\xe4\xb5\x41\x8d\xd8\x21\xcc\xde\x3a\x87\x40\xb7\xea\xcf\x96\x61\x48\x32\x34\xca\xa5\xcd\x5e\xd0\x6e\x0c\x2b\x40\x3d\xc5\xd9\xd0\xf2\x57\x28\x77\xbf\x47\x79\xc2\xb5\xb7\x3e\x46\x5e\xee\xc2\x4d\xb7\xc7\xa7\x80\xbf\x86\xd9\x3d\x8d\x7f\x4a\xb5\xff\xdf\x25\xc9\x6e\x6a\x1d\x29\x06\x47\x65\x47\x0a\x43\x20\x7e\x8a\xb3\x41\x99\x71\x64\x2e\x2d\x56\x18\xc7\xcf\x2e\x70\x72\x4e\xf8\xf4\x75\x50\x46\x87\xdc\x39\xac\xf3\x65\xd4\x35\x1a\x18\xa0\x61\x6f\x90\x23\x7f\x39\x8b\xfc\xee\x8c\xfc\x11\x91\xac\xd5\xef\x1d\x4c\x3a\xa8\xdf\x3b\x1a\xc0\x3f\x87\x23\xf8\x67\x74\x3c\x69\xbb\x3d\x47\x6c\x8a\x87\x3b\xa5\x78\xe8\xa4\x78\xc0\x49\x1e\xd3\xff\x1d\x8f\x3b\x68\xd0\x2e\x7b\x7b\x48\xbc\x3f\xb1\xec\xa1\xde\xa0\x37\x98\xe4\x26\xbb\x57\x8f\xbd\x46\xb4\x96\xb7\x74\xcb\x5c\x27\x39\x5a\x6b\xfa\x0f\xfe\x92\x62\xb0\xb3\xc6\x86\xbf\xb3\x83\x6a\x3b\xab\xa8\xbc\x3f\xae\x75\xe2\x2b\xaa\x9e\xc0\x11\xf1\x49\x89\xaa\x3e\x00\xf7\xf7\xd1\xaf\xe4\x9c\x5e\x47\xa6\xe2\xf7\xc7\x8f\x28\x23\x8b\x8c\xe4\x24\x29\x72\x30\x91\x5e\x46\xe4\x8a\x8a\x63\x02\xa2\x8b\x74\x08\x8c\x62\xca\xe7\x1a\x0d\x02\xee\xda\x82\x0b\x70\xf6\xde\x06\xb3\x9d\x74\xcc\x75\xac\x79\xb7\xec\xef\x23\xf4\xb1\x4b\xff\xa3\xff\x7b\xdd\xfd\xc8\x7f\xf0\x7f\x84\x86\xdf\xf2\x88\x61\x87\x8c\xd7\x1d\x4d\xfe\xaa\x69\x5c\x33\x7d\xf7\xb6\xf5\xd9\x66\x43\xaa\x85\x8f\xd7\xd7\xd7\xd7\xaa\xa1\x03\x77\x4b\xc6\xde\xaf\x5a\xea\x1e\x3b\x5a\x2a\x3b\xf0\xac\x81\x44\x9f\xc5\xda\x41\x1c\xda\x83\x48\xfb\x71\xcd\xff\x77\xad\x41\x1c\xba\xc9\x5a\x6f\x14\xbb\xd7\x46\x53\x95\xc3\x78\xe8\x1c\x81\xa3\xb5\x46\x71\x25\x8e\xaa\x41\x64\xab\xb5\xc6\x35\x4c\x85\x5f\x56\x0d\x34\x91\x9c\xea\x1c\xc3\x54\x60\xe6\xcd\x71\x96\xc6\xa2\x31\xa1\x74\x76\x4b\x78\xf7\xd0\x76\xdf\x40\x3f\xf8\x49\xdd\xdd\x4f\xca\xe9\x1c\x55\xe9\x4e\xd4\x31\x05\x99\xbd\xf5\xdd\x89\xb6\xe3\x1e\xd4\x11\xd2\x2f\xfd\xeb\xff\x52\x19\xd2\xd9\x91\x92\x0f\x4d\x07\xa5\x49\x7c\x83\xae\xd2\xec\x7d\xc9\x9f\x06\x27\x01\x5f\xa9\x9a\x6b\x0d\x62\x3e\xd7\x33\x52\x5c\x11\x92\xa0\x3e\x40\x0d\xfa\xfd\xf5\x1c\x6f\x6a\x28\x63\x2d\xda\x74\x6d\x4a\x87\x10\xc6\xd7\x71\x03\x32\xdf\xcb\xd4\x38\x01\x19\x66\xde\xa1\xf1\x6b\x64\xfc\x1a\x7f\x1a\x77\xa1\x4d\xfc\x7a\xb4\x51\x32\x01\x58\xd9\xce\x1d\x7a\x4a\x2e\x3b\x5a\xe3\x86\xcf\x0e\xbb\x53\x8a\xd0\x74\xab\x0d\xdb\x0c\xbe\x83\xb6\xe3\x58\x60\x68\x80\x84\x3b\x07\xd8\xbb\xc5\x0e\xb2\x99\x43\x81\xae\xd0\x30\xd0\xf2\xdd\xc8\x76\x25\x38\xd1\x5d\x98\x9e\x6d\xf2\x5a\x5c\x67\xd9\x75\xc7\x63\x58\x1a\x10\x90\x87\xef\x3c\x1e\x43\x7b\x40\xca\x68\xd5\x78\x6c\x82\x55\xdd\xcb\x75\x57\x05\xbe\x63\xde\x01\x27\xdc\xd6\x75\x94\x6c\xeb\x35\x67\x6d\xd8\xb6\x63\x9b\xb2\xe0\xa4\x6c\x00\xd7\x9a\xc3\x19\xce\xcc\x29\x1c\xad\x3b\x85\x23\xf7\x14\x3e\xc5\x77\x9f\xc5\x91\x73\x16\x6d\xcc\x1b\x4c\xa4\x86\xb8\xa4\xe8\xa8\x76\x3d\xa1\x37\x2d\xc7\xc4\x6c\xd2\x6a\x4d\x9b\x9b\xfa\x14\x69\xd8\xd5\xf5\xdd\xcd\x9c\x7a\xad\xb6\xe4\x1f\x79\xe9\xbc\x23\x07\x8d\xd7\xe5\xa0\xb1\x83\xf2\xe1\x1d\x97\xd5\x78\x3d\xae\x44\x8f\x1e\xb1\xf6\xbe\xd9\x6e\x7b\xf5\x8d\x6d\xa1\x73\xab\xd7\xc5\x36\xbb\xb6\x62\x2f\xdd\x66\xc7\x4a\xea\xbc\xb5\xd7\xa5\x8e\x57\x71\x39\x7b\x64\x27\xcd\x73\x1f\xc4\xb6\x39\x05\x9e\x95\x6b\x80\xfe\x64\x31\xd3\x2b\xdc\x7b\x57\xbb\xf1\x52\x08\x26\x27\xd1\x91\x97\x16\x6a\x15\xda\x5e\x27\x45\x70\x4d\x4f\x29\x94\x4e\x91\x97\xfb\x38\x26\xff\x0b\x2c\x0e\x0c\x13\x73\xb8\x7d\x8c\xbc\xb6\x27\xe2\xea\xd7\xba\xc1\x6a\x1e\xb5\xec\xe5\x23\x8f\x02\xcf\x73\x88\x0b\x6d\x7a\x53\x2f\x34\x70\x6f\xe0\x06\x51\x35\x81\x3c\x01\xb2\xf7\x1b\x2e\x48\x16\xe1\xb8\xfb\xcf\xe7\x53\x7a\xa9\x41\x09\x61\xf7\x43\x9e\x73\x16\x61\xde\x8b\x05\x67\x02\xb0\x90\x78\x70\xb1\xb1\x1e\xc0\x47\x6e\x5f\x7c\xaf\x8d\xa6\xe8\x32\x8d\x02\xd4\x3f\x51\x57\x5d\x24\x63\xe8\x96\x99\xef\xd3\xce\x85\x81\x45\x29\xf1\xaa\xf0\xb4\x74\x59\xf9\xe3\x47\x24\x3c\x9c\x75\xa4\xf7\x65\xaa\xaa\x67\x49\xbf\x49\xb9\x27\x68\xeb\x6e\xd3\xba\x66\xc0\x94\x5b\xab\x1d\x8e\x4b\xbc\x81\x7e\x5c\xe5\x0a\x0b\x84\x98\x29\x17\xf4\x4b\xc3\x2d\xed\x6c\xb2\x8c\xe3\x26\x1e\xcd\x2e\x64\xb6\xc4\xd6\x11\x1e\xad\x2e\x6e\x94\x41\xf2\xdc\xbb\x0e\xfa\x91\xe5\x4b\x9f\x6e\x40\x47\xf9\xe4\x77\x53\x22\xe1\x98\x97\x2b\xf3\x6f\x35\x79\xe2\xd3\x7b\xb7\x3e\xf8\x5b\xae\xe1\x64\x79\x77\x77\x46\xa7\x5e\x68\xdb\x7e\x7f\xcd\x91\x3d\x15\xb4\xac\xe3\x4a\x68\xb1\x6c\x43\x47\x42\xa7\xab\xe0\x56\x1c\x01\xad\x88\x2d\xe8\xb6\xdd\xb2\x42\xac\xec\xc4\x09\x70\xd0\xbf\x8f\x51\x7e\x5e\xe2\x20\x4a\xab\x1c\xa7\x06\x83\x26\x11\x70\x44\x48\xfb\x1d\x84\xbe\x01\xea\x2a\xc3\xf8\xc0\xd7\xbf\x65\xe9\x72\x51\xd9\x81\x71\x93\x0e\x28\x3c\x3b\xeb\x03\x60\xbf\x07\xa1\x7b\x06\x83\x2f\xc2\x13\x15\xc6\xf4\xa7\xd4\x77\xfa\xc2\xdd\x83\x70\x3e\x19\x09\x87\xe0\xbc\x87\xae\x08\x7e\xbf\x4b\xef\xcd\x4f\x11\xe9\xfb\xd5\x55\x54\xf8\x17\x4f\x71\x5e\x19\x6c\xfa\x68\xe4\x00\xae\x6b\x45\x41\x99\xab\xf9\x29\x04\x99\x84\x94\xa4\x10\xf9\xd3\xbd\xaa\x87\x35\x95\xea\x5a\x2d\x43\xbb\x10\xfd\x33\xf1\x57\xb4\x3f\xaa\xad\xd6\x90\x02\x09\xff\x75\x47\x3c\xbf\xbb\x4f\xab\xec\x6d\x6d\xa0\x1d\x88\x5d\x2d\x45\x6a\xdd\xb2\xcd\xa7\x61\xc3\x50\x3f\x3c\xd7\xd6\xaa\xea\x18\xba\xd2\x13\xd0\x2e\xcb\xb1\x38\x8a\xd7\x93\x66\xa0\x16\x08\x31\x50\x4f\x5b\x7e\xe6\xc3\xd7\x28\x59\x2c\x21\x0c\x24\xf7\xb1\x64\xae\x59\x1c\xe4\xb9\x9f\x26\xab\xae\x32\x6e\x5e\x57\xc1\x63\xe9\x7d\xa8\xad\xe1\xe4\x2b\x6c\x5d\xd4\xcf\xdc\x88\xf7\x20\x6f\xd5\x1e\x00\xf6\x78\x10\x27\xae\x34\x65\xe7\xb7\xe7\x94\x0c\xe1\xd3\xc9\x9d\x0d\xf3\xcf\x43\x9e\x81\xbe\x63\x9a\xb8\xe9\x9d\x9c\x8f\x84\x1e\xad\x9c\xf3\x53\x9d\xe0\x4f\x5b\x6d\xbd\xa9\x09\x89\xb9\xe2\x9a\xe3\xb2\x0e\x47\x3e\x8b\x4e\xc4\x87\x47\xda\xb0\x6b\xe8\xa5\x3d\x93\x41\xba\xa3\x5c\x28\x24\x82\x0e\x8a\x78\x7e\xfd\x19\x61\x91\xbe\x71\x8e\x30\x0a\xd3\xa4\x40\x71\x74\x8e\x8b\x65\x46\x4a\x3d\x66\x53\xfd\x27\x8e\x62\xfb\xe7\x0f\xd1\x6e\x63\x31\xd7\x62\x6d\x58\x62\x13\x91\xc5\xf1\x39\x6c\x2b\x92\x23\xc4\x36\xa6\xba\xac\xb6\xc1\x4d\x9b\xc8\xa2\xc5\x22\x26\x88\x84\x21\xf1\x8b\xd5\x2d\xbd\x04\xf0\x35\x9a\x6b\xbe\x42\x96\xc9\x0e\xd6\x48\xf4\x65\x2d\x0e\xe5\x36\xa0\x2f\x06\x3a\x94\x67\x70\xd2\x9c\xc9\xe4\x51\x6a\x04\x68\x39\x6c\xaf\x6b\x2d\x0c\x88\x71\x7f\x81\x0b\xa5\x1c\x2d\x52\xb4\xc0\x79\x0e\x19\x35\x43\x44\x6f\xe3\x33\xec\xbf\x17\xed\x27\xf0\x8e\x85\xb5\xe6\xca\x2e\x00\x1f\x5e\x92\xb0\x92\x08\x3a\xd6\x9c\x04\xf7\xa2\x4a\xd6\x5d\x95\xcf\x04\x89\x61\x94\x91\x40\x71\x5d\x0e\x51\xfa\x60\x4f\xc6\xc9\xb9\xe0\x37\xde\xe8\x02\x67\x78\x8e\x3e\xb0\x21\xb9\x45\xe4\x92\x72\x27\x65\x62\xf6\x57\x9e\x2e\x33\x5f\x85\x0f\xe2\x2d\x98\x75\xe9\x22\x20\x38\xb9\x15\x1b\x34\x54\x3f\xe3\x3f\xce\x94\xcf\x8e\x5a\xe1\xb2\x8f\xf4\x20\x66\x8e\xcf\xab\x47\xa9\x62\x98\x54\x38\xf8\x8d\x0f\x42\xee\x6d\xb4\xfe\x51\x68\x74\xcd\xc1\x04\xf5\x4e\x4e\x0c\xaf\x14\xcc\xb8\xbe\x74\x85\xa6\x37\x5f\xe0\xc4\xe3\xd2\xca\xc9\xde\x9e\x96\x06\x16\xbc\xc8\xf2\x34\x26\xf1\x0d\xcb\xeb\x1a\x9d\x9f\x93\x0c\xe1\x45\x84\x82\xd4\x47\xe7\x24\x21\x19\xb8\xa8\xd3\x4a\x66\x0a\xd7\x6e\x42\xae\x8b\x6e\x1c\x25\x7a\x2a\xd6\x4b\x9c\xe5\x4a\x62\xb4\xae\xc1\x7a\x99\x94\xa0\x65\xa1\xee\x0d\xa5\x6c\x04\x21\x08\xa1\x12\x68\x73\xad\xf2\xf0\x4e\x41\x13\x3e\x95\xdc\xf4\xe5\x08\x2c\xcd\xb4\xf1\xc3\x2d\xab\xe3\x87\x5b\xd7\xc7\x0f\x95\x1a\x91\x8b\x2a\x2b\xe3\xc5\x37\x44\xca\xc5\x87\xed\xa2\x63\xb2\xc7\x96\x70\x52\xc1\x60\xed\x64\x03\xf7\x8a\x0b\x9b\x77\x55\x4a\x00\x5b\xe3\x43\x71\x9a\x57\x23\xa4\x03\xd4\x18\x5d\xb2\x4d\x8e\x16\x67\xe8\x96\x68\x13\xe7\xe9\x0a\x93\xd2\x36\x0e\xd4\xc6\x34\xad\x30\x31\xc9\x01\x03\x78\x61\x10\xda\x85\x71\x65\x78\x1f\x8d\x2b\x3b\xd1\xf8\x2e\x96\x59\x95\x7a\x6e\x78\x64\x40\xd5\xe1\xa4\xdf\x95\xce\xf6\xf2\x9c\x1e\x85\x55\x58\x27\x36\x60\xad\x66\x97\x81\x7c\x2a\xdb\xc6\x9e\x12\x3c\x51\x17\x41\x3b\x09\x8e\x0d\x91\xef\xbb\xfd\x35\xa4\xb8\x05\x2e\x2e\xc0\x60\x1f\x4c\x91\xf7\xdb\x60\x88\x0e\xfd\xee\xb0\x77\x78\x80\xfa\xdd\x09\x1a\xf6\x86\xe3\xee\x04\x4d\x72\xfa\x07\x9a\xb0\xff\xd7\x65\x3f\xba\xec\x8f\x2e\xfd\x63\xf2\xc7\xbc\xdf\x9d\x3c\x3b\xe8\x8d\x8f\xd0\x10\x0d\x11\xff\x63\x30\xcc\xc7\xf4\xaf\x41\x5f\xfe\x5f\x97\x17\x74\x07\xfd\x57\x83\xc3\xde\x64\x08\x60\x68\xf8\xc7\xbc\x8f\x06\x47\x3e\xfd\x3c\x44\xfd\xee\x51\x77\xd4\x9b\x1c\x75\x8f\xba\x47\x39\xfb\x03\xc1\xff\x47\xf4\x07\xa2\x3f\xd8\x1f\xb4\xec\x0f\x0f\x49\x06\x74\xaa\xd4\x4d\xa1\xd0\xf8\xea\x96\x0e\x57\x79\x90\x48\xae\x90\x2a\xbb\x3d\xee\x3b\xb3\xc8\xa5\xaf\x46\xc8\x3d\x18\xb8\x98\x69\x13\x05\xbb\x0d\xf0\xac\xda\x63\x9c\xda\xfa\x72\x61\x6f\xbe\x8c\x84\x26\x90\x53\x52\xa3\x0b\x34\xaa\x96\x12\x0b\x0f\xee\x59\xba\xf7\x87\x6d\xe4\x4b\xd9\x46\x86\xf7\x6a\x37\xd0\x4d\x5c\xae\xfd\x40\x7e\xff\xd4\x3b\x82\x4e\xd8\x8a\x3d\x41\xb7\x9f\xb9\x8a\x37\xd9\x17\x64\xe5\xf2\xce\xb0\xcd\xec\xfc\x9f\xde\x70\xfe\xb5\x65\x99\x39\x27\xb4\xb8\x48\xe9\x25\xe5\x45\x58\x41\xc2\x51\x05\x78\xdd\xbe\x64\x42\x9a\x91\x91\x9e\xe1\x38\x86\x93\xa5\xaa\xcf\xc7\x15\xf0\x75\x5d\xb5\x30\x2b\x0c\xb0\xec\xc0\x85\xb0\xaa\xb9\x41\xdf\x05\x5d\xdb\x98\x86\x54\x9d\x01\x69\x9e\x47\xb3\x98\x3c\x4b\x93\xbc\xc8\x96\x7e\x91\x66\x2f\x61\x2b\xa8\x6c\x77\xb0\xba\x6e\x1d\x15\xd5\x0d\x4a\xbc\x3c\xe2\x61\x75\xd7\xcb\xa0\x75\x2d\x4a\x74\xbb\x3d\x73\x7f\x49\xb3\x79\x9d\xbf\xd2\xf0\x78\x58\x86\xad\x43\x2f\x81\x64\xb5\x0b\x12\x2f\x48\x56\x19\xca\x6b\xfc\xd5\x3a\x1b\x54\x64\xfc\x97\x23\x78\xf7\xd7\xdb\xec\x25\x34\xe4\xae\xae\xd1\x3c\x7f\x11\xe9\x3e\xcb\x0a\xf7\x84\x9e\xb4\x60\x04\x2b\x52\x94\x11\x11\x4a\xbc\x28\xeb\xe2\x21\xd9\x42\x6f\x73\x63\x8a\x6d\x66\x48\x93\xa7\xf1\xb2\xfa\x89\x70\xd9\x4e\xe1\xb2\xc6\x60\x04\x3e\x11\x3c\xc9\x2d\x8a\x72\x99\x53\x72\xdb\x36\x19\xd6\xa5\x5b\x3e\x2a\x60\x90\x81\x3f\xcf\xa4\x21\x46\xe4\x3d\xd6\x29\xda\xa6\x5d\x26\x4d\xfe\x27\xb9\xf9\x29\xbd\xaa\x0e\xcb\x5b\xc6\xf1\x2f\xc3\x54\xe4\xa2\x70\x43\xdb\x8a\xe1\xc3\x29\x37\xa6\xd6\x3b\x60\xbf\xbf\xc8\x75\xca\x24\x50\x90\x08\xe5\x7e\x6e\x49\x85\x80\xa4\x83\x4a\x35\xe1\xfd\x90\x29\xe4\x02\x68\x4b\x4f\x00\xc0\xa3\x2c\xca\x9f\x05\x99\x53\x5c\xc5\x45\x94\x83\xf2\xaa\xe0\x1f\xd5\x03\x3d\x75\x78\x2b\x3a\x18\xb8\xe6\xf0\xc9\x6b\x85\x69\x86\x5a\x80\x37\x26\xf4\x7a\x84\xb3\xf3\xe5\x1c\x5c\x06\x62\x92\x9c\x17\x17\x1d\x5a\x42\xf7\x93\x27\x59\x86\x6f\x5a\x14\xaa\xdd\x41\xef\xde\x93\x1b\x74\x8a\xfa\x27\xec\xaf\xef\xa1\x36\xfb\xf1\xf8\xb1\x7a\x4b\x43\xab\xbe\xa1\x85\x6f\x75\xcc\xac\x44\xbc\x0a\x31\xfc\x54\x33\x48\x33\xd0\x82\x3e\xb2\x3f\x2e\x22\xf9\x26\xbb\xfa\xc0\xb6\xbb\x29\x9e\x11\xa8\xee\xf6\xde\xd1\x6d\xa2\x48\xdf\xbd\xa3\x9b\x31\xa0\xb3\x04\x2b\xd7\x94\xb5\xdb\xa0\xf3\xeb\x41\x12\x73\xee\x6d\xfe\x86\x36\xf1\xb6\xe7\xa7\x89\x8f\x8b\x16\xed\x61\xbb\xdd\xe6\xf3\x21\xfe\xed\x01\xf7\x51\xc2\xdf\xbc\x15\x45\x61\xea\x2f\x0d\xc3\x57\x4b\x7b\x73\x14\xa2\xd6\x37\x46\xcd\x8f\x1f\x91\x51\xc0\x67\xa3\xad\xc5\x07\x61\x63\x76\x22\x03\x7e\xc8\x57\xf7\x19\x82\xb6\x5e\x0a\x1a\x0c\x3c\x61\x14\x17\x24\x6b\x29\x2a\x92\x32\x4e\xf4\x8d\xf2\x06\x93\xf8\x05\xc3\x70\x6a\xb5\x26\xd6\xa3\x4d\xac\x50\xc3\xa5\x8c\x8b\x06\xbd\x30\x4a\x82\x76\x4b\xc3\xdd\x41\xf5\x94\x26\x3d\x79\x2b\x72\xd2\x69\xb4\xa6\xd7\x37\x3e\xb0\xc9\x69\xb5\x4f\x56\x75\x40\xa3\xec\x4d\xff\xad\x59\xed\x56\xcc\xf4\x05\x4e\x82\x98\x00\x14\xdb\x10\x8d\x59\x87\xed\xb8\x23\xcc\x7c\x26\x0f\x88\x0b\xe6\xa3\x47\x1c\x15\x0b\x9a\x20\x36\x56\x9d\x7e\xd7\x77\x81\x1b\xfe\xe9\x15\x38\x3b\x27\x45\x4f\x7f\xed\xa7\xe2\xe6\xb0\x6d\x44\xe8\xd2\x9b\xac\x2c\x6d\xc3\x69\xcb\x14\x18\x6c\xcf\xd1\x04\x78\xf7\xc6\xf7\x86\xd1\xfd\x9e\xdc\x40\x38\xcf\x24\x20\x22\x00\x16\xdf\x90\xe5\xf0\xb0\x8f\xda\xd2\x60\x5b\xde\x45\x04\xe2\x34\xfd\xf7\x44\x67\x26\x38\xfb\x73\xfe\xa5\xa7\x5d\xe2\xb9\xbb\x23\x17\x68\xe8\x22\xe0\x41\x2d\x78\x89\x0e\x95\xb0\x9b\x38\x87\x48\xb4\x80\x18\x48\x0b\x70\xf1\xce\x11\xe1\x82\xfe\x27\x06\x5f\x81\x88\x12\x03\x6a\xbd\x20\x17\xef\x54\x94\x0b\x4e\xb0\xa7\x2c\x40\x2a\xa0\x85\xb4\xe2\x88\x68\x16\x88\x65\xe9\x31\x36\x20\x39\x60\xcd\x95\x24\xc0\x60\x4a\xca\x37\x55\x25\xa8\xee\x39\x1e\x4f\xff\x01\xcd\x9f\xc3\xb3\x05\x95\x37\x5f\x55\xb7\x49\x78\xc6\x3b\xd9\x9b\xe3\x45\x4b\x4e\x91\xb6\x68\xa0\x8c\x05\xc4\xb9\xd6\x57\x81\xd8\x3a\x2d\x7c\x51\xfe\x2f\x1c\x47\x81\xe8\x13\xd4\x6e\x9b\xf5\xd4\x0e\xb2\x8c\xe3\x13\xed\x83\x5c\xeb\x75\x43\x16\xa7\x09\x31\xb0\x77\x2c\xe4\xc0\xea\x40\x6e\xc7\x28\x67\x22\xa5\xcd\x63\xba\xe7\x8f\xec\xb4\x28\x6a\x25\x54\xac\xb5\xf0\xb3\x8e\xbb\xbf\xf0\xcd\x61\x28\xb6\xfc\xc5\x32\xbf\x60\xa0\x27\x16\xe4\xad\xf1\xfb\xd6\x24\x49\xfa\x3c\xf0\x15\x70\x7a\xca\xd6\x53\xaf\x62\x21\x18\x02\x20\x23\xa0\xb4\x13\xea\xe3\xac\x51\xc3\x53\x65\x80\xd2\x4d\xd0\x75\xfb\x56\x4f\xcb\xaa\x76\x93\x93\xbd\xdb\x56\x89\x7f\x74\x89\x4a\x3b\xf4\x37\x71\x16\xf9\xf0\xe5\x5c\x84\x1a\xde\x60\x1a\xde\x53\x1a\x0b\xf8\xcd\xc5\xf8\xa6\x02\x39\x37\xce\x56\xe8\x47\x39\x5b\xec\xc2\x74\x3b\xf9\x02\x34\xab\x5f\x79\x8c\xfa\x9d\x2a\x96\x8b\x94\x8a\x4c\xcb\x39\x15\x95\xe1\x82\x54\xa9\xf4\x3b\xaa\xa9\x54\xd7\x64\xb9\x85\x07\x45\xf2\x83\x22\xf9\x1e\x2b\x92\x3f\x45\xce\x86\xf7\xe4\xc6\xaf\x56\xce\x1e\x4e\x6c\xc0\x3a\xf4\x1c\xe4\x93\xe4\x83\xf8\x8d\x24\xcb\x0a\xc4\xa3\x7e\xdf\x00\xab\x43\x4b\xbf\x4b\xe0\xe7\xe0\x4c\x5e\xb5\xeb\xa8\xa1\x78\x92\x65\xe9\xd5\x4f\x59\xba\xa0\xe7\x72\xe5\xf3\xc1\x03\x37\x7c\x1d\x35\x06\xe0\x57\xab\xc3\x5f\x87\x28\x7e\x73\xb8\x33\x5d\x02\xcf\x16\x49\xab\x7a\x62\x06\x4f\xcd\x41\xc3\x0a\x21\xd4\x85\xba\x75\x91\x2e\xd2\x4b\x92\xb1\xa7\x26\x78\x59\xa4\x73\x5c\x44\x54\xd6\xba\x41\x33\x82\x72\x52\x20\xec\xfb\x69\x16\x40\x98\x55\xf6\x06\x22\x2a\xc8\x3c\x47\x51\x92\x47\x01\xe8\xe0\x59\x13\x73\x92\x2c\xf9\x3d\xf1\x2a\xca\x89\xfe\x7c\x05\x17\x28\x26\x38\x2f\xca\xad\x33\x1d\x0e\xbb\x28\x29\x1d\x2f\x25\x83\xa7\xe4\xab\xf1\x81\x35\x1c\xbc\x6d\x8b\x41\xba\x00\xfe\xe5\xcf\x44\x72\x78\xd5\x91\x2e\x96\x31\x2e\x88\xde\xf0\x55\x54\x5c\xf4\x84\xe2\x3e\x81\x1e\xa7\x73\x82\xce\xe8\xfa\x7c\x5e\x90\xf9\x19\x53\xe0\x9f\xb1\x67\x1f\x67\x28\xca\x11\x84\xdd\x81\x80\xa2\x67\xac\x11\x07\x0c\x1d\xeb\x7b\x60\x94\xd1\x46\x68\xf3\x8a\xd3\xcf\x75\xfb\xa9\x9c\xdf\x4f\xfb\x74\x8e\x72\xd3\xb3\x57\xaf\x58\x5d\xa6\x69\x32\x99\xb7\xf4\x14\x69\xb3\xc7\x75\xf6\x9b\x38\xc1\xa0\xbb\x7b\x13\x27\x2d\x2d\x74\x41\x53\xb6\xe5\x0f\xd7\x48\x00\xfa\x47\x14\x85\x28\x2a\x78\xb6\x72\xfa\x99\xcc\x17\xc5\x0d\x5f\x2d\xff\x3b\x5d\x22\x1f\x27\x2c\x10\xef\x92\x2f\x77\xf1\xf2\x48\x2e\x05\xf9\xa8\x2a\xca\xd1\x19\x2c\x9c\x33\xd4\x12\xba\x26\xa3\x2b\xb4\xdd\x9f\x29\xfe\xcd\x96\x7c\xe5\x13\x5a\xf5\x82\x8e\x6e\x60\x58\xbc\xdf\x3a\x63\x7d\x77\xbc\x23\x63\x00\x1b\x53\xc1\x76\x59\x61\x74\x9b\x2f\xf3\x02\x36\xc0\x04\xb1\xbc\xc8\x98\x73\x2b\xdd\x2c\x19\x6d\xf9\x72\x41\x6f\x83\x68\xbe\x8c\x8b\x68\x11\x8b\x59\x89\xd2\x24\xdf\xc5\x50\x8b\x66\x36\xeb\x60\xcd\xbb\x3c\xba\x63\x3a\x86\x93\x16\xaf\xff\x2a\x0f\x3c\xab\x70\x51\x64\xd1\x6c\x59\xc8\xf5\x26\x27\x2d\xcd\x10\xcb\x1a\x55\xfd\x1c\xf0\x73\x1a\x7e\x85\xf0\x64\x58\x80\x61\xc6\xc5\x42\xdb\x95\xf9\x57\xd4\x85\x13\x07\xea\xb2\x0b\x02\x1f\x1e\xf6\xd2\xf1\x0a\x2b\x02\xb6\x6b\xf9\xfd\x25\xf5\x97\xd5\x13\xbd\x1a\x43\x46\x70\xf0\x22\x89\xeb\xf7\x00\x13\xc5\x4b\xb0\x36\x98\xdb\x19\x2c\xbe\x5d\x2c\x1e\x66\xda\xf8\x57\xad\xc2\xab\xdc\xcb\x0d\x9f\x98\x56\x9d\x2e\xac\xbc\xe1\x13\xd3\x95\x8f\x16\x3b\x28\x13\x07\x7d\x98\x66\x08\x0b\x17\x8a\x98\x04\xeb\xbf\x6c\x5c\xfd\x42\x84\xaf\xbc\x15\xf1\xdf\x85\x9c\xf4\x97\x97\x9c\x21\x9e\xb0\xa4\xf2\xb6\x28\x54\x81\x25\x4a\xf2\x02\x27\x3e\x79\x11\xb6\x4c\x0c\xed\x6a\xf1\x04\x27\x37\x6f\xdb\xe0\x37\xb0\x96\xbf\xee\x2b\x98\x0c\x71\x81\xdb\xd4\xc3\x40\xc3\xb2\xd2\xc5\x40\x83\xdd\x99\x8f\x81\xd6\xc6\x57\xe1\x64\xa0\xf5\x77\x1d\x2f\x03\x7d\x98\x36\x75\x33\x60\x8f\xb4\x4f\xd5\x50\x24\xfe\x45\x9a\xfd\x1c\xeb\xc1\x28\x11\x4a\x17\xf4\xf6\x00\x1b\x93\x69\xa8\x66\x4c\xfa\x0f\x72\x5d\xd0\xd3\x8a\xb2\x20\x0b\x0a\xaa\x9b\xb1\x9f\xc5\x91\xff\xbe\x6c\xc0\x6e\xeb\x89\x69\x5e\x2c\x48\x22\x12\x69\xb0\x93\x2a\x47\xe7\x29\xbf\xf3\xcd\x28\xea\xe2\x82\xf4\xd0\x73\x25\x50\x81\xe1\x9c\x04\x90\xcf\x84\xed\xa8\x7e\x9c\xe6\xfc\x48\x93\xd6\xed\x12\x7d\x54\x3e\x3a\x31\x40\x72\x52\xbc\x82\xd4\x65\x7a\xde\x14\xb8\x2c\x65\xba\x75\x4a\x0d\x0c\xb3\x8d\xfb\xcb\x2c\x23\x49\xf1\x1a\x4c\xe4\x7b\xa6\x41\xca\xb6\xe3\x93\xff\xbb\x24\x79\xf1\x8c\xd2\x57\xe1\xbe\xb1\x82\x14\x35\xf2\x95\x8d\xd0\xdb\x62\x79\xa4\x99\xdd\x52\x36\xc3\xf9\xb7\x72\x26\x0c\x3f\x12\x9e\xa9\x81\x0b\x6c\xa6\x91\xb0\x92\x5e\x37\xcd\x25\x6b\xdd\x9e\xd1\xe0\x2a\x4f\x05\xbe\xa5\xe8\x76\x72\x47\x8d\x93\x3d\xbb\x82\x30\xbc\xeb\x41\x64\xb5\xcf\xcc\xbd\x41\xfb\x6e\x19\x85\x75\x27\x08\xdb\x46\xaa\x2a\xeb\x50\x95\x56\x60\xbb\x97\xee\x51\x45\x8a\x64\xd8\xc6\x7a\x51\xce\xb7\x33\xad\x2a\xf3\xc6\x40\x3f\xa2\x37\x72\x6d\xc3\x36\x51\xb6\x09\x58\x9e\x17\x46\x7d\x7a\x14\xbd\x79\x6b\x5a\x73\x21\xa4\x75\x41\xe6\xf0\x0e\x93\x0e\x32\x13\x64\xc0\x06\xfd\x22\x6c\x95\x4c\xb7\x96\x31\x98\xf6\x51\xab\x7e\x7a\x8a\xba\x83\xb2\x69\x99\x23\x05\x8b\xf2\x2a\x8c\x56\xbc\x62\x0b\x45\xbe\x88\x23\x9f\xa8\x26\x3b\x68\x60\xd7\xdf\x5b\x81\x4b\x0e\x77\x89\x92\xca\x99\x64\xd3\xbd\x20\x59\x1e\xe5\x45\xcb\x68\x50\xe7\x04\x71\x18\x38\x3c\x1c\x60\xe1\x02\x50\x07\x7d\x90\x12\x0d\xa3\x44\xf3\x3d\x02\xfa\x6c\xbf\x1c\xb6\x9e\xf5\x85\xc4\xff\x75\xee\x09\x62\x4f\xae\x5a\xee\x8a\x2b\xed\x7d\xf2\x94\xed\x94\xfa\xf4\x41\xc8\x07\x82\x78\x66\x51\xa5\xdd\x40\x38\xa3\x62\x7e\x7c\x43\x77\xeb\x94\x09\xb6\xb3\xe5\x6c\x16\xc3\x6f\x26\xee\xb1\x91\xd9\x33\x07\x2a\x2f\xd2\x05\xbd\x9a\xe1\x73\x08\x0f\xa1\x8f\x65\xdd\xe1\xb2\xd2\xc3\xaa\xbc\xa3\xd0\xea\xd5\x9e\x4f\xf4\x2b\x1f\x19\x87\x8f\x93\x1a\x4d\x6e\x90\x6e\x36\xa0\x0c\xb9\xb8\x50\x34\x70\x6c\xa3\x55\xdf\x78\xf9\x02\xfb\xe0\x97\x03\xd1\x3a\xbd\x20\xbd\x4a\xbc\xb7\xbd\x28\xf1\xe3\x65\x40\x72\xb6\xd0\x85\x45\x42\xb1\x14\xa3\xc2\x70\x4f\xe1\x6c\x9a\xc1\xbf\x42\x6d\xae\x8d\xf0\x4e\xce\xdc\x46\xa7\x6e\xed\xe1\xe1\x3a\x79\x9b\x9d\xbd\xfa\x01\xe3\x9c\xbe\x57\xe2\xde\x62\x4c\xa0\xe9\xff\x52\x3a\xfd\xe4\x65\xa7\xc1\x0c\x3a\xeb\x69\xbd\x4b\x20\xe6\x6f\xa2\x65\x3e\x82\x69\x78\x7a\xc3\x2e\x63\xa5\xe8\x3e\x38\x47\x57\x04\x5c\x04\x72\x42\xaf\x6a\x91\x7f\x81\xd8\x05\x1b\xb5\x40\x9b\xd3\x56\xe3\x2e\x76\x11\x7b\x9f\x77\xc9\x0c\x3b\xf6\xda\x33\x2e\x13\x9f\xcb\x6d\x4f\x6a\xf0\x95\x4f\x9d\x2c\x5a\xdf\xbd\x4f\x2a\x54\xe9\x76\xa5\x81\xda\xd9\xaf\x24\x2c\xb3\x5c\x3a\x93\x68\x21\x2d\xaa\xa2\x02\x12\x25\x16\x94\xd4\x4a\x1a\x90\xb2\xb4\xb9\x0b\x22\x67\x2c\xed\x3b\xfd\xad\x43\x48\xfd\x9f\x84\x11\x25\x3a\x14\xfb\xf4\x17\xa9\x55\x53\xd0\xb2\x48\x07\x2f\xc3\xe9\x55\xf5\xec\x09\xe8\x47\xf4\xe1\x96\x5e\x8f\x2d\x28\xd3\x4f\x92\x6f\x27\xef\xf4\xad\x7b\x03\x4f\x4a\xa6\x28\xd2\x81\xa0\x40\x87\x11\x3b\xb7\x02\x12\x25\x26\x94\x54\xc8\xe8\x80\xb2\x50\x87\xcd\xb5\xfd\xe7\x9d\xb5\x4b\xac\xe5\x2d\xba\xa9\x1f\xa8\x5c\x00\x90\xe2\x4c\x73\x0a\x35\x73\x9f\xa9\x9c\x68\x5a\x78\x19\x4f\x67\x3b\xdd\x91\x34\xe1\x79\xf5\x91\x27\xd8\x85\xfe\x2d\xa7\x8f\xb9\x98\xd2\x69\xf2\xcc\x90\x21\x1e\x1f\x73\xfa\xa7\x18\x59\xf6\xb7\x1c\x3c\xfa\x53\x8e\x90\x72\x5a\xd5\x1d\x55\xc1\x83\x11\x28\xd0\xf7\xe7\x3b\xe6\xb5\x50\x2b\xe1\x54\xde\x67\xcb\x49\x2e\x7c\x9c\xa0\x24\x2d\x40\xa7\x67\xe8\xf2\xc0\x32\x27\x70\x48\xd5\x5e\x44\x72\x96\xa1\x04\x33\x2b\x64\x4e\x97\x6b\x11\xcd\x09\x15\x99\x30\x3a\x7b\xc5\x55\xcb\x4a\xc7\x53\x4a\x7f\xb1\x85\xae\x7d\xa3\xf3\xa6\xd5\x29\xe8\x84\xf6\xdd\xd4\x4a\xf2\xae\x06\x68\x76\x63\x9c\x54\xf3\x05\xd3\x0f\x82\x08\xb7\x1b\x9a\x8d\x1d\xcf\x45\xb4\x0e\x70\x67\xaa\xad\x53\xbe\xa9\xaf\xb3\x91\x6a\x84\xfd\x67\xa4\xc5\xd0\xf3\xb2\x99\x6e\xb2\x8d\x1b\x40\x62\x39\x78\xa6\xcf\x6c\xd5\x3d\xc3\xba\x35\x69\xc4\xac\x4e\xc4\xc5\x1a\x5a\x15\x27\x87\x5e\x65\x64\x16\x32\x71\x82\xc9\xd3\x4d\x4f\x2c\x47\x2b\xb7\x3b\x16\x45\x55\x9e\xcc\xba\x6d\xd1\x75\x30\x22\xa4\xcc\x23\xe5\x33\x00\x19\x6e\xc4\xae\xfd\x1f\x21\xcd\x58\xe0\xd8\xfb\x91\x12\x4f\x1c\x2e\xca\xba\x99\x40\xfc\x65\xde\x3a\xb9\x17\x82\xed\xd0\x4d\x2b\x86\x53\x75\x0e\x98\x95\xda\xb6\xeb\x34\xdb\x9f\xb5\xc2\x76\x73\xae\xb1\x5c\x6f\x54\xb4\x61\x27\x4f\x42\xdc\x50\xe9\x40\x2d\x5d\xa8\xad\xcb\x89\xf2\xe1\x76\xa4\x3c\x42\xa8\xb8\xc8\xd2\x2b\x94\x90\x2b\xf4\x73\x96\xa5\x59\xcb\xb1\x4e\x2f\xcb\xdb\x8a\x54\xfe\xab\xec\x4d\x2a\xa3\x6e\x79\x53\x04\x7f\x09\xb1\xd5\x9e\x32\x43\x49\xcf\x2b\xd3\x0b\x29\x39\x79\x14\x54\x5b\xfd\xa3\x7d\x7b\x15\x25\xe7\x20\xf1\x78\x9e\xe3\xeb\x6f\x4a\x22\x52\x9a\x12\x48\x93\x9a\xce\x17\xcb\x82\xfc\x24\x1b\xe0\xf7\x52\x0e\xb2\xbf\x8f\xfe\x91\xca\x24\x48\x82\x0c\x9c\xdc\x08\x4b\x36\xbb\x13\x87\x11\x89\x03\xd3\xac\xcd\x47\x1a\x16\x1d\xd3\x06\x47\xf9\x4f\x51\x56\xdc\x30\x85\x71\x8f\x87\xab\xf8\xf8\xd1\x90\x0d\x6d\xf5\x9d\xb6\x87\x9b\xea\x17\x35\x22\x1a\x48\xcb\x56\xbc\x38\x14\x25\xa5\x0e\x9b\xf7\xb9\x5b\xd7\xf0\x33\x27\x9d\x72\x28\x91\x66\x0f\x35\xca\x2a\xc9\xf5\xdf\x67\x38\x5f\x67\xdc\x6a\x57\x26\xf5\x92\xcc\xa5\x03\x84\x1c\x60\x4e\x35\x1d\x10\x64\x2a\xe8\x84\x52\xcd\x5c\xf1\x1b\xac\x89\x92\xc5\x7e\xad\x85\x21\xc5\x0e\x6d\x51\x20\x5b\x83\xa5\x77\x7a\x85\x82\x0f\x8e\xe9\xee\xe0\xc4\xea\xbc\xc4\xf0\xe8\x91\xc5\x1b\xf6\x08\x58\x4b\xa9\xac\xf6\x13\x1c\x60\x91\x5b\xc3\x8c\x36\xf9\xee\x67\x25\x77\x26\x59\xee\x0d\x2e\x6a\x2b\x88\x5d\x2d\x3c\xac\x78\xf5\xc3\xdf\x3e\x31\xbf\x2e\xaf\x7c\x7b\xa0\x27\xa2\xf8\xcb\xba\xf7\xc4\x91\xff\xde\x7a\x35\x23\x4d\x02\x7c\x79\xb8\x34\x25\xe6\x5b\xc7\xea\x91\x51\x7b\x87\x14\x8f\x7f\x2c\xcd\xee\x7f\xd3\x28\x69\x51\x49\x9d\x0a\x54\xc6\x38\x3a\x77\xe8\x79\x94\x44\xf3\xe5\x9c\x5e\x16\xc4\x5d\x5d\xd9\xa4\x7a\x42\xe9\x83\xbe\x39\x65\xd9\xc8\x1e\x3d\x42\xdf\xa8\x7b\xfd\x8f\x2e\xd8\x9e\x1f\x47\x24\x29\x18\xc4\xd4\xc8\x95\x52\x3f\x2f\x6e\x99\xcb\x12\xe9\x1a\x09\x74\x77\x90\x17\x4d\x01\x60\x13\x71\xcd\xfc\xfd\x1b\x78\x44\x6e\x59\x84\x33\x05\x52\xc8\x12\xb9\xc8\x48\x9e\x93\xc0\x9b\xea\x53\x92\x2e\x48\x82\x7e\x44\x1e\x3d\x2a\x3c\x34\x45\x1e\x1c\x92\x96\xe8\xaa\x82\x28\x4b\x95\x88\x4c\x3d\xd7\x37\x41\xf9\xd2\x60\xcf\xf1\x2d\x34\x8c\x8c\xf4\x2a\xc9\xdd\x34\xcc\x49\xb2\xec\x42\x92\x44\xd0\x92\x7c\xfc\x88\x3c\xcf\xcc\xb7\x67\x62\xba\xc0\xf9\x22\x5d\x2c\x17\xde\x94\xd3\x6f\x3f\x52\x93\x6f\x93\xca\xea\x61\x1b\x94\x89\xa9\x96\x52\xbe\xf4\xe8\x8d\xad\x5e\x39\x08\x1f\x3f\x2a\x05\x84\x1c\x10\xdb\xa4\x6a\x23\x31\x05\x5a\x7d\x87\x72\x68\x95\x94\xb0\xd7\x94\x75\x59\x30\x52\xaf\xd3\xe4\xbe\xc1\xa5\x67\xd7\x19\x89\x7e\xe4\xa7\x0e\xdf\x2c\xd8\xe5\xcb\x16\xb3\xdd\x57\x83\x1a\xc1\xdb\x2d\x74\x83\xc0\xed\xd2\x01\xeb\x58\x0b\x96\x36\x84\x79\x74\x79\xda\x26\xd9\x78\x68\x36\x12\xb7\x37\xd8\x32\x98\x5b\x7f\xf9\x2d\x6d\xc3\x3b\x60\x14\x4c\x2b\xd6\x82\xc9\x4a\x4a\xdd\xee\xd8\x62\x2d\xae\x63\xfa\x7a\x73\xc9\xd9\x8c\xa9\xdb\xbf\x8d\xe9\xd0\x3f\x18\xfc\xaa\x14\x87\xf6\x25\x8a\x7e\xf8\x35\xca\x45\xa4\xfd\x1a\x1b\x9b\x44\xd1\x33\xea\x38\x6e\x65\x6c\x67\x89\xa3\xbc\x98\xa5\xd7\x5e\xed\xb5\xec\x77\xbc\x20\xd9\x3a\x6d\xab\x0a\xe5\x86\x79\x5a\xcc\x86\xf7\x77\x44\xcf\x4b\xee\x95\x6e\x9f\x9c\x16\x68\x05\x05\xf2\x24\xfd\xd1\xf9\x99\xe5\x26\xe2\xdb\x62\xdb\x1a\x86\xbd\xaa\x31\x01\x39\x5f\xed\x26\xfc\xaf\xca\x57\xb8\x9a\x75\x60\xe5\x33\x5c\xdd\x2d\x46\x0f\x77\xa7\x8a\x3d\xd7\x8b\x4e\xa3\x89\x5d\x3c\xe9\x3c\x78\x08\xa3\xf9\x10\x46\x73\xeb\x61\x34\x0f\xd1\xa0\x1f\xb3\x98\xbb\x13\x3d\xb0\xa5\xfd\xea\x4a\xf6\xd4\xf8\xf0\x49\x42\x59\xee\xd9\xb4\xb8\x82\x58\xda\x8f\xb9\x8c\xdf\x8d\xc3\x56\x1a\xb5\xca\xf1\x2a\x0f\xef\xe3\x12\x7c\x95\x60\xff\xfd\x0c\x67\x95\x4f\xe3\x8e\x3e\x73\xc2\x51\x41\x60\x65\xce\x51\x01\xf0\x8c\x07\x7a\xab\x7a\x68\x38\x69\xd2\x11\x0b\xd9\x2e\x3b\xc4\x9b\xb8\x0f\x29\x48\x8f\xee\x17\x67\xae\xce\x1f\xfa\x10\x36\xf5\xe1\xb5\xfb\xc3\x6b\xf7\x46\xaf\xdd\x3f\x47\xaa\xdd\x3f\xe9\xfb\x7a\x68\xf1\xe7\x4b\x92\x14\xf4\xe6\x45\x12\x52\x75\x2a\x8e\x47\x35\x75\x56\xf6\xc9\x80\xfe\xa4\x69\x83\x8b\x0c\x27\x79\x04\xef\xe4\xaa\x1a\x51\x5b\x27\xe8\x6b\x9e\x5c\xe1\x9b\x15\x83\x31\x3c\xee\x57\xd7\xa9\x23\xb0\x04\xbc\x56\xc8\x5c\x76\xf6\xc7\x51\xe5\x43\xf7\xe1\xd1\xc0\x84\xab\x95\xca\x29\xc0\x66\x22\x85\xab\x46\x6d\x53\xd6\xf9\xff\x10\x3a\xe0\x4f\x1d\x3a\x40\xde\xfe\x69\x79\x05\x81\xfc\x7d\xd9\x7a\x88\x5f\xcb\xc5\x2a\x5f\x49\x56\x30\x7a\xbf\x71\xff\x1d\x38\xb7\x38\x14\x0a\xfb\x4f\x4b\x96\x3e\x6f\x9b\x14\x4b\x9c\x3b\xcb\x61\x4d\x2b\x9e\x2f\x8b\x02\xb6\x3a\x96\x2c\x3a\x5f\x60\x3f\x4a\xce\x7b\xcb\x24\x2a\xd0\x77\x68\x74\xc2\xc1\x0a\xf0\xa9\xfc\x40\xff\x9d\xa2\x3e\x73\x65\x87\x91\x4a\x8b\x22\x9d\xc3\x27\xf6\xa7\xf1\x35\x8b\xce\x2f\x0a\xf8\xf8\xdf\x65\x5e\x44\xe1\x0d\xdf\x03\xa6\xc8\x0b\x63\x72\xdd\x25\x49\xe0\x29\xe8\x98\x84\x75\xc0\x79\x81\xb3\x42\x03\x2f\xd2\xc5\xab\x05\xf6\x89\xa2\x8b\xf7\xc5\x22\x4e\x01\x09\x0a\x6d\x38\x20\x53\x81\xc1\xcf\x32\x14\x25\x4f\x01\xd1\x5f\x65\x18\x9f\x24\x6c\x34\xd9\xcd\x88\x01\x79\x93\xfe\x5f\xb9\x75\x82\xa3\x06\x37\x3f\x5e\x04\x67\x54\x98\x66\x73\xb0\x63\xe0\x24\x8f\x71\x41\xfe\x57\xab\x3b\xe9\xff\xb5\xed\xb1\xf4\xdc\x76\xba\xf1\x2c\x4d\xb5\x5c\xe3\x7f\x70\xeb\x0c\x9b\x40\xf6\xab\x97\xf3\x4d\x57\x68\x01\x17\x29\x63\x2a\x3a\x98\xd1\x35\x09\xa4\xb5\x84\x9b\x1a\xf8\x20\xcb\x62\x46\xb9\x34\xef\x70\xba\xe5\xef\xd2\x0c\xb1\x8e\xcb\xea\x38\x8e\xce\x93\xe7\x05\x99\xe7\xea\x1b\x53\x36\x32\x08\xa6\xa8\x7e\x9d\x2e\x9e\xc1\xb7\xe9\x2a\x03\x18\x47\xcb\xae\x2e\x53\xf4\xa6\x48\x17\x22\x05\x3a\xef\xf7\x2c\x23\xf8\xfd\x22\x8d\x92\x22\xef\x2d\x17\x2d\x6f\x1e\x78\x6d\xa5\xcd\x95\x15\x19\x2d\xbc\x6e\x5b\x27\xe6\x29\x30\xc7\x86\xf4\x30\xce\xda\x36\x49\xaf\xd3\xc5\x4b\x36\xf0\xeb\x0f\x4f\x87\xcd\xd9\x5a\x24\x71\x76\xd5\x98\xd3\xc4\x09\xdc\xdf\xd1\x96\x4b\xf5\x38\x6e\x46\x37\x1b\xc6\xad\x93\xae\xed\x03\xab\xa8\x7f\x9d\x2e\x7e\x05\x54\x9b\x8c\x38\x25\x62\x2d\xaa\x1d\xdb\x81\x73\xc4\xe5\xd6\x53\x3d\xe0\x1b\x51\x2d\xc6\x7b\xcb\x84\x1b\xe3\x5d\xa2\x9d\xed\x69\xb7\xeb\x1d\xb5\x2f\xb2\xe8\x3c\x4a\xf8\xc6\x7a\x91\x66\xd1\x1f\x69\x52\xe0\xf8\x0e\xaf\xcc\x01\xa2\xf5\xc6\xa3\xf4\x79\x6f\xdb\xf5\x19\x0d\x5b\x6f\xc4\x2e\xd6\x00\x12\x06\xa7\x0e\x90\xbd\x60\x67\x79\x60\x2f\x49\x06\xa1\x94\xb6\xd0\x93\x22\x5d\x6c\xb7\x23\x6c\x1e\x9b\xf4\x84\x4e\xe7\x36\x92\x57\x60\x26\xaa\x28\x97\x3c\x2d\xde\x93\xcf\xce\xaf\x3f\x75\xa8\xd6\x52\x7f\x61\x05\xcb\xd8\x25\xe2\xaa\x74\xa6\x75\x1b\x20\x18\xfb\xaf\x20\x85\x2d\xce\x2f\x69\x71\x7c\x31\xcb\x83\xed\xd9\xa5\x8c\x25\xf0\x99\xce\xfe\x3c\x8a\xe3\x28\x27\x7e\x9a\x04\x10\x86\xec\x0a\x47\x05\x9a\x91\x30\xcd\x88\x15\x6f\x2d\x88\xf2\x79\x94\xe7\x54\x46\x17\x88\xa2\x1c\xcd\xc8\x05\xbe\x8c\xd2\x8c\x07\x68\x62\x0e\x2a\xb3\x1b\x71\x35\x66\x9e\x87\xec\x05\xc4\x32\x8e\xcf\xf4\xe8\x27\x22\x96\xda\xdf\xa3\x80\x88\x2b\x47\xe5\x68\xf3\xd8\x1b\x1b\xf6\x44\xd1\x8e\x70\x48\xe5\xe4\x65\x4e\x32\x66\xa3\x63\xab\x9b\x77\xe9\x79\x88\xce\x6c\x92\x0c\x97\xe4\xc4\x2b\x50\xbe\x20\x7e\x14\x46\x24\xe8\xa0\xa8\x40\x41\x4a\xe0\x25\xc1\x85\x1a\x98\x95\x58\x14\x0a\x34\x5b\x16\xe8\x2c\x23\xf9\x72\x4e\x4c\x70\x68\xab\xc3\x10\x5e\x11\x39\x9e\x45\x5a\xc6\x8d\xf6\xd1\xf0\x0c\xcd\x73\x3d\x14\x8c\x8d\x70\xad\x81\x7d\x1e\xc2\x23\x96\xab\x28\x67\x73\x57\xe0\xf7\x32\x7b\x0d\x82\x78\x7c\x10\xa5\x45\xbc\x8e\xb3\xa3\xb6\xc8\x17\x30\x4b\x3b\xb6\x0c\x1f\xa0\x7f\x2b\x87\xd5\xa8\xe8\xa0\x24\x55\x1b\x10\x17\xec\xcf\x1c\x41\xb2\x98\x5b\xb2\x1e\x64\x6c\xd3\xd0\x75\x52\xc9\xb1\xe1\xf6\x2c\xea\x6f\x67\x87\xe6\xd8\xda\x9f\x33\x8c\x9c\x1d\xeb\x68\xb3\x20\x71\x30\xaf\xfc\xfc\xa4\x93\x2b\x9d\x41\xfd\x34\xc9\x89\xbf\x84\xe7\x35\x62\xa6\x73\x14\x66\xe9\x1c\x61\xf1\x66\x9c\x4d\x2f\x8b\x83\x96\x83\x5b\x28\x43\xfa\xbd\xa8\xb0\xff\x43\x07\xe1\x80\x0d\xc4\x7b\x72\x63\x04\x2c\x22\x49\xbe\xcc\x08\x04\xc4\x5f\x50\x3c\x49\x81\x8a\x8c\xe0\x62\xce\x13\x52\x11\xec\x5f\xa0\x39\xc9\x73\x7c\x2e\x62\x2f\x91\xde\x79\x4f\x21\xa7\x18\x4f\x3f\x70\x88\x5b\x44\xdb\x92\xc1\x22\x3b\xfc\x11\x34\x7c\x43\x73\x7c\x83\x96\x8b\x00\x17\xa4\x1b\x25\xdd\x45\x4c\xef\xe5\x38\x61\xb1\xaa\x50\x48\x70\xb1\xcc\x48\x8e\xf2\xa5\x7f\x81\x70\x5e\xda\xe0\xa0\xfa\x8c\xd0\xe5\xe1\x13\x23\x62\x1e\xbc\x82\x95\x3a\x93\xf7\xe4\xa6\xc5\xdf\xe6\xd1\x7f\xe0\x1d\xa9\x9a\x6d\xfa\x53\x18\x41\xc1\xdf\x9c\x5b\x02\x17\xc2\xce\xd4\xbb\xc0\xf9\x8b\xab\x44\x88\xe2\xcc\x97\xc5\xc2\xa7\x39\xa4\x97\x5c\xd1\xe1\x29\xeb\x99\x87\x1e\x4b\x68\xf4\x18\x79\x67\xe8\x02\xe7\xb0\xd6\xd0\x7f\x3c\x9c\xdc\xfc\xc7\xeb\xc0\x06\x76\x85\xd9\x63\xaa\x45\x96\x5e\x46\x01\xe3\x4c\xa8\x6c\x10\x0c\x18\x7a\xe8\x77\x9c\xe7\xda\xcb\xce\x34\x83\xc7\x0f\xec\xdd\x22\x3b\x1d\x3c\xdd\x3f\xa8\xbc\xe5\x8b\x89\x70\xc9\x6a\xfc\xdb\x17\x24\xac\x59\x19\xbb\xf8\x81\x06\xbb\xb2\x54\xd8\xc1\x3b\x11\x7a\x98\xc9\x33\x88\x45\x3c\xfb\x99\xa9\x14\xd6\x1b\x0b\x97\x36\x74\xc3\x91\x71\xa0\xda\xce\x38\x95\x11\xd7\x8f\x9a\x8c\xa9\xd6\x70\xcc\xa2\xe4\xfc\x61\xd8\xdc\xc3\x46\x77\x00\x18\x37\x7d\xef\xe2\xc3\x46\x82\x87\x51\xab\x5b\xa2\xd7\x51\x61\x73\xdb\x75\x54\x3c\x8c\x59\xf5\x02\x75\x8f\xd8\xc3\xf2\xac\x5f\x9e\xd7\x51\x61\xad\x4e\x28\xf9\x2a\xc7\xac\x1c\x07\xf4\xb7\x74\x99\x13\x7e\x34\xde\x21\x9c\x28\xa0\xf9\x95\xe0\x9a\x70\xbc\xcd\xf2\x6f\x9a\x77\xa7\x8c\x79\xbd\xc3\x15\x96\xca\x89\x2a\x84\x8e\x10\x81\x6e\x16\xfc\x46\x7e\x66\x3a\xcf\x43\x6c\x6f\x91\x86\x34\x27\x05\x62\xd1\xfb\x22\xd6\x82\x1d\x99\x49\x5c\x2d\x2f\x22\xff\x42\xaf\x28\xae\x79\xa6\x5a\x08\x9d\xa5\x0b\xc2\x2f\xb1\x06\x31\x2c\x2c\x00\xce\xe1\x86\x8b\x33\x3c\x27\xf4\x7a\x0d\x31\x4d\xe1\x99\x9a\x08\xd5\xee\x42\x9f\x91\x7c\x41\x2f\x06\x20\x2e\x5a\x7d\xe1\xe4\x85\x69\x86\xc8\x35\x9e\xd3\x4b\x04\xcc\x00\xbd\x1f\x9c\xf9\x71\xe4\xbf\xc7\x57\xf8\xe6\x6c\x57\x19\x4a\x59\x97\x78\xd4\xf5\xe9\xd9\xb7\x45\x34\x27\xe9\xb2\xf8\xf6\x0c\xb5\x1c\x57\x7b\x72\xbd\xa0\xd3\xd9\x46\x69\x36\x45\x67\xdf\x4a\xf2\xbe\x3d\xd3\xf8\xc5\x7c\xe7\xd0\x98\x63\x54\xd4\x66\x35\x19\x51\x0e\x4f\x2b\xb4\x15\x0e\x0f\x2d\xb6\x1c\x33\xb9\x74\x25\x2f\x05\x7b\xb5\x20\xd6\x8f\xa4\xac\x56\xaf\x2b\x9c\xab\xda\xd6\xd6\xdd\xb9\x2c\x57\x81\x0d\x37\x2d\x13\xcb\x76\xf6\x2b\x03\xa7\x43\x33\x17\x88\x7b\x22\xe5\x7c\x73\x6f\xef\xd0\xa5\xac\x6b\xb9\xb4\x20\xc2\xf4\x56\xc9\x94\x4a\x37\xf2\xfa\x8c\x38\xd3\xb2\xd0\xb9\x71\xac\xa1\xca\x3b\xf4\xde\x15\x25\x41\x74\x19\x05\x4b\x58\xa3\xa0\xa8\xc3\x09\x8f\x21\xe5\x9a\x04\xa5\x4a\xda\xf4\x18\x51\xce\x0a\x77\x3e\x46\x24\xaa\x6d\x1f\x23\x02\x71\x5b\x1a\x8a\x34\xc7\xed\x8d\x43\xe8\x0a\xa3\xf8\xca\xf8\xb9\x1c\x70\x77\xc1\x73\x85\x93\xf7\x57\x11\x39\x97\x77\x76\xad\xb0\xb9\x62\x80\xb6\x15\x33\x77\x7f\x1f\xfd\x93\x1f\x7e\x10\xe6\x9b\xe9\xb9\xc0\xaa\x74\x49\x90\x70\x97\xc8\x7b\xd2\x96\xc9\x44\x35\x47\x38\x5d\xba\x9e\xb3\x27\xfc\xf4\x41\xec\xb5\x96\x19\xc5\x4e\x89\x36\xeb\xc4\x21\xd4\x45\xa2\xea\x40\x88\x0a\xc6\x19\x0e\x11\x19\x84\xfc\x8e\x97\x39\xa9\x48\x5c\xab\x04\xa7\x0d\x88\x84\x7a\x2b\x88\x04\x98\x06\x44\xbe\x04\x2d\x79\x05\x95\xd2\x67\x72\x3d\x22\xf5\x53\xbe\x9a\x4c\x1d\x4a\x04\xef\xf4\xa4\xd8\xe0\xd5\x87\x2a\x84\xb1\xad\x88\x14\xec\xc7\x04\x67\xaf\xd9\xbe\xdf\x72\x70\x4d\x55\x08\x62\x3a\x10\x35\xb9\xa3\x75\xea\x4b\x1a\x4d\xfe\x6e\xd0\x0e\xca\x61\x46\xba\xb4\xed\x11\x10\x3b\xc2\x19\x2a\x46\x8b\x00\x29\xa8\xa6\x1d\xca\x56\x20\x34\x42\x44\x98\x31\x18\xf5\x28\x0c\x15\xb8\xeb\x7b\xf8\xf1\x23\xea\xb7\xd1\x77\xa8\xdf\x9b\xd4\x4f\x8d\x3a\x46\xd8\x8d\xab\x61\x3c\x67\xb9\xe8\xa9\xa4\xf7\x69\xc3\x31\xca\x83\xc9\x88\xc5\x28\x85\xb1\x7f\x47\x71\xfc\x5b\xba\x4c\x8a\x8a\xb8\x8c\x65\x40\x3b\xeb\xb8\xce\xf7\x0b\x92\x98\x41\x81\x1a\x8c\x82\x1c\x69\x50\x06\x23\x27\x95\x3f\x45\x41\x23\x22\x05\x9c\x45\x63\x03\x12\x4d\x6e\x59\x83\x34\x3a\x2e\x2f\x89\x4f\xa2\x4b\xc2\x43\xde\xad\x1e\x47\x1d\xbe\x95\x90\x6b\x26\x58\x9b\x34\xcb\x62\x16\xc6\xe0\xd1\x23\xfd\x99\x35\x1b\xc8\x26\x43\xcd\xd2\x45\xad\x39\xd6\xff\x04\xeb\x47\x83\xc1\x66\x80\xad\x45\x46\x2e\x1d\x5d\x90\xc5\xac\x0b\x74\x43\xa8\x99\x89\x15\x13\xb5\x72\xaa\xdc\xa1\x8b\xf4\xed\xb2\x72\xb7\x44\x46\x14\xa3\x26\x33\xfe\xcf\x64\xde\x74\xd1\x70\xd0\xaa\x3d\xbc\x7a\x0b\x67\x92\xd3\xfe\x3e\x82\x8e\x32\x3b\x2b\xbf\x5d\xe7\x28\x20\x31\xd8\x99\x40\x13\x29\x64\x0c\x30\x46\xa1\x8b\x28\x20\xf9\x5e\xb9\x03\xf6\xd0\x55\x10\x5f\x1e\xe1\x86\x31\x59\x4b\xbb\x6a\x59\xd8\x44\x3f\xa0\x3e\x65\x65\x25\x2a\xf6\xdf\x9a\x07\x05\xfa\xd1\xfc\x38\xe5\x01\x9c\xaa\x76\x1c\xe3\xa4\xa5\xfb\x78\xdd\x36\x7f\x5a\x3e\xc8\x2a\x82\xf9\x36\xe5\x1b\xa7\xd8\x96\x93\x42\x54\x75\x1d\x0e\x7a\x9c\xe1\x61\x65\x3f\x8c\xcf\x4d\x7a\xe2\x3a\x14\xcd\x53\xd1\xdd\x58\x8b\x49\x99\x1e\xbf\x4c\x6a\xb2\x49\xa7\x3c\xa5\x2b\x06\x18\xce\x51\x9b\x7d\x99\x38\x03\x57\x5d\x60\x64\xa9\x13\x63\x3e\x1a\xb9\x72\xd3\x48\xce\x95\x3b\x89\x38\xb8\x04\x96\xd4\xae\x78\xc1\xd3\xff\xa1\xab\x28\x09\xd2\xab\xde\x9e\x6c\xf0\x25\x01\x87\xee\xba\x26\x93\x14\xc5\x69\x72\xae\xfb\x88\x34\x6d\x9c\x35\x07\x4e\x1e\x17\xe9\x55\x02\xd1\xb0\x7b\x8e\xe5\xb6\x41\xb8\xe3\x15\x41\x8d\x7d\xf1\x0e\x80\x8f\x3e\xfc\x76\x84\xe7\xd5\x1d\xbb\x34\x70\xad\xd4\x08\x38\xcb\xfd\xa0\x54\x8c\x5e\x1d\xb2\x27\x3e\xeb\x55\x94\x23\x58\x45\x25\x05\x60\x47\x65\xb6\x36\x88\x77\x6e\x46\x32\xa3\xbe\x94\x44\x4b\x2d\xd6\xae\xfd\x6d\xc3\xe8\xce\x2b\x22\x36\x4b\x6f\x89\x15\xd1\x9f\xcb\xba\x14\x55\xa1\xfc\xcd\x88\xbf\xcc\x6d\xde\x2a\xfc\x32\x2b\x30\xc3\x7c\x89\x9b\x9f\x0c\x5c\x0c\x05\x0e\x18\x9e\x7f\xd6\x00\xe3\xa9\xda\x2d\x48\x3d\x0c\xb5\x2c\xb2\xe0\xae\xa3\xc2\x00\xba\x8e\x8a\x32\x84\xdd\x24\x2b\x2a\xc3\x59\x0d\x42\x89\x09\x65\x5c\x72\xdf\x95\xaf\xa7\x0e\x68\x71\xdb\x7c\x57\xbe\x27\x9a\xd0\x56\x32\x96\x77\xae\x1d\xd1\xa8\xb1\xd0\xf9\xc7\x0e\x6f\xe3\xd2\x8f\x2a\x68\xd7\x57\xbd\xb6\xba\x4c\x98\x81\xc5\x35\x8d\xa0\x4e\xc9\xc6\x81\x9f\x99\x12\xae\x83\x3c\x7d\x8d\xc2\x6f\x6b\xd9\xb1\x08\xcc\xf6\x92\x72\xc6\x8b\x66\x21\xa2\x8d\xd0\xd1\x65\x06\x87\xb8\xd0\x8c\x8f\x59\xcc\xe7\x9f\xd9\x53\x0e\xf9\x67\x94\x9c\x6b\xbf\x58\xa8\x69\xc6\x13\xea\x2f\x05\x03\xac\xc2\xfe\x56\xcc\xa0\xfd\x86\xe9\x66\xbf\xf5\xe9\x84\x92\x05\xa3\xdd\x35\x25\x26\xed\xa5\x00\xd3\xdf\x34\x92\xbf\x1d\xd1\x26\x8d\x60\x77\x85\x31\xd7\xb9\xa6\x3e\x42\x28\x4a\xa6\xc8\xe4\x2c\xbc\x58\x10\x9c\xd9\x99\x10\xf8\x09\x3d\x75\x6c\x33\x0a\x48\x3a\x85\x94\x36\x07\xdd\xf5\xc1\xb5\x25\x68\x36\x7e\xc7\x46\x20\x4c\xd9\xf6\xf2\xd7\x0c\xb6\x8e\x45\xaf\x2c\x93\xc0\xb6\xfc\x35\x2a\x8f\x45\xf2\xec\x02\x53\x91\xef\x17\x7e\x28\xf2\x28\xa7\xee\x8b\x76\x47\xa2\x12\x31\x86\x6e\x4f\x9c\xc3\xab\x1e\x9a\xca\xed\x9f\x4a\x53\xf5\x01\xbc\xec\x37\xa7\x2a\x84\x57\x55\x74\x26\xe5\x88\x24\x36\x6a\xe9\x46\xce\xcf\xe9\xdb\x8e\x73\x7b\x68\xb7\x4f\xdc\x7c\x51\x8a\x54\x4b\x99\xcf\xdc\x22\x8c\x0b\x9f\x5e\xb1\x71\x08\x31\x13\x9f\xfb\xe8\x2a\xed\x53\xa5\xc1\x95\xdf\x94\xac\x68\x5f\xbd\x36\x23\x8f\xbf\x2e\x5e\x27\xc4\x19\x0a\xa2\x8c\xf0\x91\x57\xa2\xcc\xe9\x29\x02\xaf\x6c\xf4\x23\xcf\xa2\x82\xa6\x90\x54\x05\x5e\xa1\x98\x3d\x6d\xaf\xdb\xd5\xcd\x82\x49\xba\x9e\xb7\x97\xfb\xf9\x01\xb1\xd4\x40\x53\xe4\x31\x39\xd3\xeb\xa8\xd0\x7e\x25\x85\x5e\xc7\x15\x60\x90\x89\xdb\x9b\x84\xa4\x74\xbc\x39\x77\xcd\xc4\x07\x11\xb1\x90\x42\x96\xe3\x12\x82\x4a\x75\xe3\x10\xe7\x76\x54\xcc\xdd\xc4\x37\xcf\xd2\x54\x85\xcb\x7c\xc3\xcf\x45\x88\x8a\x67\xec\x52\x78\x11\x15\x38\x8e\xfe\x20\xbf\x44\x59\x5e\xfc\x4a\x8a\x82\x64\xed\x96\xe0\xb2\x76\x43\x78\x25\x0c\xb7\xdf\x6a\x01\x35\x4b\xf1\xd0\x4d\xc7\x05\xa7\xd2\xbf\xa2\x0a\x77\x52\x70\xaa\xe0\x8d\x1a\x22\x4c\xa2\xd5\xb6\xe2\x7a\xad\x58\x0b\x08\xbe\x67\x2c\x01\x47\x54\x37\xbe\xcf\xad\x0e\xe9\x26\xec\x35\xfc\xab\x7e\x16\x9a\xcf\x51\x3e\x68\xef\x33\xc4\x73\x88\x8e\xf1\x02\x45\x3c\xa7\x60\xbc\xe6\xb2\x62\x32\x16\xe1\xcf\x2e\xf5\x88\x0d\x3d\x61\x84\xed\x09\x07\xc1\x57\x7e\x46\xc4\x01\x4c\xe0\x9c\x73\xc3\xc7\x04\x5f\x4a\x70\x16\x65\xc8\x15\x83\x8e\xe5\x32\x50\xb1\x25\x14\x07\xb2\xa7\xd2\x1d\xf4\x01\x85\x71\xb4\x98\x8a\x04\x13\x2c\xe0\xa5\xf7\xdb\x32\x12\x43\xe4\xa1\x5b\xcd\x56\x55\x0e\x81\x75\x7c\xbf\x02\x0d\xf1\xd8\x0d\x05\x59\x2c\x2a\xc3\x5b\x1c\x1e\x7f\xee\x00\x58\x8c\xbc\xea\xf8\x57\x05\x59\x54\x46\xa8\x38\x68\x14\xf4\xaa\x20\x8b\x5d\x51\x5e\x4b\xf6\x53\x08\x8c\x5b\x15\xd5\x61\x34\x6c\x4a\xfc\x53\x1e\x60\x77\x37\x5d\x60\xd8\x6b\x3b\x52\x1f\x28\xe4\x80\x45\x2c\x69\xd2\x93\x5d\xc6\x1d\x53\xe8\x6b\xfb\xf2\x2b\x9e\x91\xb8\x92\xa1\x0e\x9b\xf6\x04\xd0\xec\xaa\x1f\x80\xfc\x1e\x44\x4e\x1b\xf6\xb7\xb8\xa1\xd5\x84\xfd\x54\xb8\x79\x62\x1a\xa8\xfe\x67\x0f\xb4\xf6\xe9\x43\x53\xdd\xab\xd0\x6e\xcc\x7f\xe6\xcf\x1d\x32\x6b\xc7\x51\xab\xee\x53\x60\xa4\x17\x59\x24\xb2\x2f\x55\x8b\x0a\x4d\xc3\xda\xe8\xc8\x76\x16\xcf\xa6\x26\x48\x4a\x18\x93\xeb\x29\xf2\x06\x68\x00\x0a\x6e\x23\x18\x49\x1c\x25\x44\x41\xaa\x80\x28\xb3\x38\xf5\xdf\xcb\x7b\xce\x2c\xcd\x02\x92\x3d\x4b\xe3\x34\x13\xb1\x56\x16\x38\xa6\xb7\x87\x1e\x45\xd0\xcb\x99\xd8\xa2\x23\xa6\x24\xfc\x4b\x0a\xc8\xa2\x81\x39\xce\xce\xa3\x84\xc5\x6b\x18\x0c\x3b\x68\x7f\x1f\x5d\xe0\x38\x44\x91\x2f\x25\xfb\x05\x0e\x02\x50\xd6\x78\x7d\xd4\x87\xec\x22\x8e\xe8\x3c\x8f\x91\xb7\xb8\x2e\x75\xe4\xef\x9a\xf0\xfd\xc1\x20\xfd\x75\xba\x78\xc5\x82\x59\x7b\x79\x1a\x47\x81\xd5\xb3\xd7\xe9\x82\x07\xae\x1e\xd8\x38\xcb\x7d\x60\x55\x68\x1f\xea\x50\xd2\xef\x02\xa7\xf8\x32\x8f\x92\xbf\x13\x16\x3d\x62\x38\xd6\x1b\xc2\x31\x84\xea\x2d\xa2\x4b\x02\xa7\xdd\x4b\x63\xfe\xb4\xf8\x35\x78\x96\xa7\xf1\xb2\x50\x01\xff\x21\xf6\x8f\x73\x80\xc6\x66\x38\x1b\xcf\xc7\xb1\xdf\x9a\xf4\xff\x8a\x1e\xa3\x61\x7f\x71\xdd\xf6\xac\xf8\x36\x0c\xa0\xab\x43\xd4\x91\xf8\xab\xc1\x38\xfa\xbc\xf6\xd5\x1d\x6c\xed\x50\x17\xce\xe0\x08\xba\xe3\x3b\x7a\x45\x0a\x19\xd9\x38\xbe\x41\xb3\x1b\x04\x32\x31\x18\xbf\xa2\xc2\xcb\x51\xbe\xe4\x4e\xc4\xd2\x56\x66\x93\x6e\xbd\x05\x86\x47\xe0\x16\x48\xad\x27\xf3\x26\xaf\x64\x0d\x0f\xfb\xfb\xf0\x50\xb6\xf4\x9a\x40\x6d\x52\xeb\x7a\xd7\x1a\x9b\xe5\x86\x6e\xb5\x3a\x8e\xed\xf8\xd3\x6a\x18\x99\x23\x6d\xf3\x08\xd9\xca\x17\x96\x89\xd1\x09\xf1\x8b\x34\xd3\x23\x58\xab\x83\x94\x0e\x7c\xde\xd1\x7f\x0c\x41\x7d\x0a\xfe\x06\x36\xe3\x9d\x22\x6e\x4d\xb4\x3e\x88\xa5\x68\xe7\x71\xad\x30\xe4\x29\x83\xa0\xd3\x1e\x98\x1a\x87\x17\xb7\x0b\xa9\x32\x09\xb6\x9e\xb9\x46\x59\x6b\x2c\xe2\xeb\x32\x74\x6a\xcd\x4a\xb3\x05\xc4\x0a\xd3\xcc\x95\xd5\xca\xb0\x96\x36\xaa\x74\x53\xb8\x5d\x95\x2c\xc6\x98\x12\x53\x95\xf6\x8d\x4d\x76\x7b\x63\x64\xe2\x48\xe8\x98\x23\x4d\x39\x5f\xa8\x84\xbc\xcd\xb0\xbb\xce\x81\x4e\x89\x8d\xda\x06\xbb\x95\x52\xe0\xc8\x98\x6d\x51\xc2\x9c\xed\x56\x8e\xb3\x68\x9e\xd6\xe8\x20\x9d\xb4\xe1\xba\xc3\x3e\x54\x9d\x31\x4f\x64\xc7\x60\x29\x5d\xd9\x5a\xc3\x65\x35\xb1\xed\xd9\x18\x56\x4f\xc7\xaf\x30\x3e\xf5\xd3\x31\xe4\xe6\x93\xe6\xba\x77\x4d\xa3\x5c\x69\x42\xb0\xb3\xb4\xc0\x94\x5a\xba\xd2\x15\xc1\xfc\xf3\x05\x06\xad\x89\x8e\xcb\x64\x11\x08\x4f\xd5\x3e\xd9\xbb\xdd\xdb\x33\x36\x3e\x70\xf4\x80\xdd\x95\x6d\x27\xcd\x92\xa5\x72\x07\xf8\x0f\xeb\x9e\xae\xc6\x3b\xa1\xa6\x27\xa4\x55\xe9\xfe\x1c\x66\x1a\x61\x77\xae\x3f\xbd\x1f\x87\xa9\x46\xd2\xde\xea\xad\x01\x5e\x2d\xb8\xce\x8c\x1a\x16\x58\xbd\x5c\x19\x56\x75\xd0\xd4\x32\xc7\x5a\xe8\xf8\x21\x56\x2b\x49\x35\x45\xa8\x9f\x7e\x9d\x2f\x4e\xa8\x6a\x83\x93\x77\xd8\xa6\xd7\xed\xdb\x13\x6b\xcb\x70\x99\x4f\x4a\xbb\x00\x33\x2d\xd8\xeb\x55\x3f\x17\x40\x70\x5b\xdf\x7a\xd1\x6e\x19\xd4\xb4\x77\x92\x66\x67\x38\xf8\xc2\xf5\x81\x9f\x23\x9a\xfc\x9f\x5f\x4b\x06\x8f\xde\x9e\x45\x99\x1f\x57\x45\x88\x3e\x18\x0e\x5d\xd0\xb5\xe1\xd3\x15\xd8\x27\x0d\x22\x4f\x97\xd1\xef\x5c\xfd\x50\x93\x15\xe9\x60\x38\xaa\xac\x52\x1b\x1e\xdd\x82\xbd\x6f\x6a\xc0\x9a\x2e\x0f\x46\xc3\xc6\x0a\x40\x40\xf3\x39\x34\x7f\xb6\x3e\x4f\x57\xe8\xd0\x3b\x6f\x4c\xc0\xf3\x49\x2a\x0a\xa3\x38\xb6\xf5\x7b\x8b\x2c\x9a\xe3\xec\xe6\xcd\xa4\xdf\x7f\xbb\x6d\xc5\xce\xbf\x2f\x08\xdc\x41\xe1\x89\x65\x5e\x90\x05\x8a\x72\xfe\x2a\xd1\x8c\x7d\x59\x13\xe0\xa0\xac\x90\x01\x81\x96\x5e\x8f\xc3\x34\xd3\xa2\x1a\x30\x95\x8c\xbf\xcc\x8b\x74\x1e\xfd\x81\x99\xd9\xfc\x4e\x8a\x98\xdf\x70\xf6\x9e\x6b\x7b\xc8\x02\xe1\x5c\x0d\x69\x0f\x3d\xcf\xd1\x82\x62\x64\x11\x07\x2e\xa2\x38\x70\x07\x4a\x53\x93\xd0\xb8\x7f\xaf\x2f\x08\xe8\x4b\xc5\xec\xb2\x68\x87\x92\x8e\x98\x4e\x88\x6a\x81\x42\xae\x2b\x03\x33\xb6\xdf\x50\xe8\x80\xca\xdb\x91\x36\x60\x4b\xb8\x8b\xee\x86\x22\xb0\xd5\x36\x72\xc8\x95\xfa\x44\x94\x08\xcd\x48\xe4\x6b\x9a\x13\xfa\x43\x86\xf6\x66\x2f\x66\xa5\x1a\x07\x7e\xae\xd0\xca\x30\xa5\x07\xbc\x1d\x62\x93\x10\xc9\xd1\x65\x81\x0f\x3d\x78\xb3\x60\x7f\x63\x92\xa6\xa7\x87\x58\x93\x74\x2a\x2f\xbb\x46\xb7\x4c\xe3\x90\xa9\xc8\xfd\xb9\xa6\x47\x52\x4f\xa3\xe5\x56\xf3\xba\x69\x4a\x51\xe9\x90\x58\x91\x92\x94\x35\xae\x14\xe1\x30\x29\x72\x6b\xe0\xd3\x72\xab\xde\x1b\x72\x2a\x28\x98\xbc\xcf\xd2\x76\xee\x7c\x95\xdd\xe8\x3a\xda\x60\x0b\x6b\x7c\x93\xda\xf6\x9d\x47\xcc\xe3\x76\x6e\x64\x74\xc0\xd7\xbe\xea\xdc\xab\xed\xc6\xba\xd5\x6c\x7a\xf7\xe0\xd2\xcc\x2e\xae\x1d\xc3\xfb\xe8\x57\xf5\x90\xdd\xf3\x4f\x9e\xdd\x73\x30\x44\xc3\x67\x07\xbd\xf1\x11\x1a\xa2\x21\xe2\x7f\x0c\x86\xf9\x98\xfe\x35\xe8\xcb\xff\xeb\xf2\x82\xee\xa0\xff\x6a\x70\xd8\x9b\x0c\x01\x0c\x0d\xff\x98\x77\x87\x68\x30\x89\xbb\x93\xee\x04\x0d\x7a\xe3\x41\x97\xfe\xcf\xaf\xb4\xce\xb8\x37\x38\x8c\x0f\x7b\x93\xe3\x2e\xfd\x9f\x5f\x07\xc7\xe8\x28\xee\x1e\xa3\x63\x3d\x89\xa8\x79\x6b\x92\xc3\xa9\x15\x7f\x92\x04\xa2\x26\x19\xae\xec\xa1\xe6\x4d\x4c\xfb\xd5\x38\x73\xa8\x56\xa7\xe4\x34\x39\x1c\x3d\xe8\x14\xb6\xaf\x53\x18\xfe\xe9\x95\x0a\x9f\xe4\xae\xff\x27\xdd\x1a\xbf\xa2\xfb\xbc\xeb\x82\xce\xa3\xc7\x8b\xc8\xf7\x86\xcf\x06\x97\x3b\xd7\xbb\xdf\xf3\xd4\x4c\xe4\x7a\x45\xc3\xe7\xa4\x78\x96\x26\x45\x86\xf3\xe2\x35\xb9\x2e\x5a\xd5\x78\xa5\x33\x7f\x98\x26\xc5\xab\xe8\x0f\x22\x50\x15\x37\x8b\xf4\x3c\xc3\x8b\x8b\x9b\x9e\x8f\x21\x58\x5f\x4f\x80\xe8\x55\x7e\xc1\xf3\x28\xbe\x71\x54\x52\x1f\x1f\x54\x13\x3b\xf0\x11\x79\x2d\x74\x0a\xe2\xe2\x05\xe1\xc4\x79\xc2\x03\x45\xa0\xba\x96\xfd\x89\xe5\x7e\xc9\x35\xcd\x84\x27\x1f\xce\x6f\x66\x4f\x05\xe7\xba\xa1\xd7\x41\xfe\x8d\xf8\x2b\xa3\x7f\xf4\xb9\x7c\xb3\x99\xee\x42\xbf\x1e\xdb\x3a\x0c\x39\x1f\x42\xd7\x20\x0a\x1a\x7a\x88\x34\xf4\x33\x71\xaa\x3b\x4e\xd6\xf3\xe1\x30\x6f\xf0\x2b\x72\x34\xdd\x6a\xb6\x77\xa6\x5b\xe1\x34\x38\x9c\x1c\xb6\x21\x06\x56\x1a\xd6\xa5\x64\xd8\xc4\xb4\xce\x47\xcb\xa3\x5b\xa6\xf4\xaa\x73\xaa\x31\x28\x44\x07\x49\x7e\x01\x76\x39\xa0\xf7\x65\x72\x5d\x3c\x81\xd7\x45\x53\xe4\xcd\xa3\x20\x88\x89\xa7\x5e\xa8\x89\xc9\x85\x9f\xa6\x8d\x5e\x67\x92\xcd\x75\x1b\xc3\x7b\xa1\xdc\x18\x6e\x59\xbb\x31\xdc\xba\x49\x97\x62\x14\x93\xf1\x45\x68\x39\x86\x77\x55\x73\x58\xc6\x9b\x5d\xa8\x3b\xc6\x5f\xf8\x8d\xe8\xe1\xd5\xc5\x9f\xf7\xd5\xc5\x15\xce\x12\x1e\x55\xc4\x85\x76\x6c\x03\xd6\xde\xc8\x18\xc8\xa7\xb5\x55\xa7\x71\x8c\x17\x79\x95\x92\x6d\xd4\x3f\x2a\x81\xd6\x5a\xa9\x39\xcc\xd7\xf8\x62\xe4\x5e\xa6\xd2\x6e\x9c\xa4\x99\xce\xf4\x8e\xb3\x34\x7f\x8d\x2f\x6f\xd8\xb3\x88\xd7\xee\x37\x1a\x9d\xb5\xdf\xc4\x30\x18\xe7\x6b\x0f\x5e\x91\xe1\x42\x8f\xab\x30\xf0\xd4\xb4\xd5\xc4\xa8\xc7\x2b\x54\x36\x5d\x5c\x23\x78\xdb\xa2\x3d\xc3\x59\xf5\xee\x27\xc6\x79\xe1\x7a\x2b\x33\x45\x5e\x92\x26\xc4\x70\x41\xd0\xa3\xab\x7f\xd8\xd5\x83\x91\x9f\xaf\x17\x18\xf2\xf1\x5d\xb0\x04\x72\xc6\xfb\x8b\xb5\x6f\xf0\xf7\xfb\x2d\x0a\x34\x5f\xea\xe4\xa6\x39\xea\xee\x9c\x92\x6a\x23\xe7\x57\xbb\x62\x63\xaf\xd7\x6d\x27\xc1\xaa\x4c\x58\xe0\x54\xae\xdc\x8b\x47\x3c\x9b\xb8\x93\xd8\x38\xd8\x02\xfe\x64\x0b\x42\xe4\xe8\x70\x2c\x04\xf1\xe9\x0e\x9d\xb9\x3f\x8e\xe0\x3b\x70\xc0\xb5\x74\x8b\x42\x96\x5b\x91\xc6\xa2\x71\xda\x8f\x27\xc1\x7f\x97\x39\x8b\x51\x29\x53\x42\xc8\x3c\x9b\x2c\x04\x02\x81\xbd\x55\x43\xcf\xf3\x41\xfc\xce\x5c\x9f\x40\x5b\xb8\xd0\x72\x24\x5a\x99\x82\x6a\x29\xbd\x97\xb9\x1e\x36\xda\xd1\xea\xd1\x34\xde\xdf\x3e\x65\xe6\x09\xc3\xc7\xff\x64\x6f\xaf\xf4\x24\x8e\x4e\xbf\xad\x95\xac\xf5\x8e\x5a\xff\x2d\x9c\x8a\x8d\xe9\x0e\x8d\xb9\x9d\xc7\x72\x0d\xdc\xc1\xe8\x8e\x28\xbf\xd2\x1f\xe2\xc3\x6b\x3d\x84\x58\x55\x64\x44\x67\xc4\xcd\x55\x01\x37\x9b\x3e\xe1\x13\x9b\xa7\x84\xe1\x05\x77\x7e\xe3\x07\x73\xe7\xb9\x5f\x6e\x94\x63\x2d\x3a\x5e\xfe\xe9\x8e\x45\x1e\x1d\x34\x2b\x88\x61\x65\x38\x46\xf3\xd1\x84\x27\x7a\x24\x9f\x0f\x36\xd6\x6c\x82\x02\x8b\xdf\xbb\x55\x17\xab\x1f\x89\x75\x90\xf7\x1b\x2e\x48\x16\xe1\xb8\xfb\xcf\xe7\x53\xf4\xbd\x1e\xec\x65\xff\x07\x48\x79\x94\xc4\x37\x28\x20\x79\x74\x9e\x90\x00\x8c\x38\xcb\x9c\xa8\xb3\x4c\x46\x77\xe3\x72\x71\xcf\x6b\xa3\xa9\x8c\x99\xf7\x49\xd4\xe6\xc0\x9e\xc0\xb1\x77\x55\x99\x7f\x9a\x67\x69\xa5\x95\x24\xf5\xe7\xfc\x5f\x84\xbc\x28\xf1\x84\x8f\x9f\x8a\x0a\xe6\xd2\xae\x3b\xa2\x92\x3a\xcf\x93\x9a\xe0\x94\x4b\x16\x0b\xfd\x85\x48\x8b\x98\x2d\x45\x7c\xb2\x5b\x7b\x63\x72\xa8\xe3\x39\xb7\x7c\x1e\x2f\xc3\x86\x87\x7c\x65\xad\x87\x03\xf7\x7e\x1c\xb8\x0d\x8d\x2a\x9d\xf5\xaf\x8a\x0f\x57\xc1\xbb\x5f\x05\x3f\x9b\xa3\xee\xb6\x1f\x27\x6e\xd9\xf3\x97\x1f\xf1\x5b\xc0\x24\x4f\xfc\xed\x60\xfb\xd2\xdf\x60\x36\x1a\x05\x43\xf0\xaa\x39\x1c\xd6\xc7\xa7\x89\x6e\x0f\xc7\xc6\xe7\x3c\x36\xdc\xcf\x71\x41\x1c\x71\x3c\xc6\x35\x84\x05\x69\xdb\xd1\xbd\x23\x5c\x82\x81\xc7\xe2\x47\xdd\xf1\x51\x6e\xc1\x62\xad\xee\xc2\x58\x3c\xb9\x8f\xbe\xf1\x7e\x3a\x9f\x57\xfb\x1d\x1e\x0d\x9a\x44\x59\x64\x38\x76\x11\x62\x91\x61\xae\x8c\x12\xc9\xd3\x2f\xb8\xec\x8f\x87\x8d\x62\x76\xb2\xa0\xf9\x5b\x27\x9b\x72\x7c\x15\xcd\x8b\x28\x79\x5f\x49\x74\xa3\xe1\xa6\x18\x76\x41\x35\xc5\x5b\x4d\xf6\x32\x5b\xd4\x3c\x1a\x6e\x14\xde\x95\xe1\xd8\x09\xe9\x80\xb9\x92\xf8\x80\x90\xc5\xef\xf5\x1d\x68\x14\x4e\x54\xe1\xd9\x45\x27\x14\xf6\xca\x8e\x44\x49\x10\x9d\xa7\x95\xec\xd3\x6f\xd2\x09\x86\x63\x17\x1d\x60\x98\x2b\x89\x9f\xc5\xcb\xea\xf1\x3f\x6a\x42\x3a\xc5\xb0\x0b\xc2\x29\xde\x4a\xb2\xe3\xe8\xfc\xa2\x78\x5a\x47\x7b\xa3\xc0\xcc\x12\xcd\x2e\x3a\x20\x91\x57\xf6\xc2\xbf\xc1\x95\x0f\xe4\x47\x8d\xf8\x86\x62\xd8\xc9\x1e\x7f\x83\xab\x77\xf8\x82\xe0\xaa\x10\xc0\x07\xa3\x46\xbb\x25\xc5\xb0\x0b\xb2\x29\xde\x4a\xb2\xcf\x33\x42\xaa\x87\xbb\xd1\xd1\x04\x28\x76\x41\x38\x20\xae\xe7\xf6\xbf\xd5\x92\x3f\x6a\xcc\xee\x7f\xdb\x55\x1f\x14\xf6\x9a\x8e\xcc\x2b\x57\xec\xa8\x51\x18\x6c\x8a\x61\x37\xc4\xcf\xab\xd7\xe9\x0d\x89\xe3\xf4\xaa\x92\xf0\x49\x13\xc2\x19\x8e\x5d\x90\xce\x30\x57\x12\x8f\xe7\xb3\xca\xf0\xf5\x07\xa3\x46\x32\x02\xa0\xd8\x05\xe9\x80\xb8\x92\xf2\x34\xc3\xc9\x79\x35\xbf\x34\x92\x0e\x18\x8e\x5d\xd0\xce\x30\xd7\x8a\x37\x2f\xea\x3b\xd0\xe8\x78\x55\x78\x76\x25\xde\xbc\xa8\xef\xc8\x2c\x4b\xaf\xaa\xf7\x9d\x46\xc7\x2c\xa0\xd8\x89\x8c\x40\x11\xd7\x6d\xf8\x37\x95\x97\xa8\x46\xc7\x2b\xc5\xb0\xa3\xed\xfe\xa6\x56\x24\xfb\x5b\x35\xe9\x07\xe3\x46\xa4\x0b\x2c\xbb\x12\xcd\xfe\x56\xd1\x85\x4f\x1d\x63\xff\xe0\x7e\x5d\xe0\xf7\xf7\xd1\xbf\x71\x54\xa0\x8b\xa2\x58\xe4\xd3\xfd\xfd\xf3\xa8\xb8\x58\xce\x7a\x7e\x3a\xdf\x0f\xb1\x4f\x66\x69\xfa\x7e\x3f\x8c\xd3\xab\xfd\x28\xcf\x97\x24\xdf\x1f\x1d\xf5\x51\x91\xa2\x19\x41\x61\x74\x4d\x02\xda\x27\x92\xc7\x51\x52\x74\xf9\xfb\x3c\x44\xa1\x8b\x9b\x05\xd9\xe7\x94\x77\x2f\x71\x1c\x05\xdd\x30\x8a\x49\x17\x27\x49\xca\x55\x85\xdf\xed\x33\xf6\x91\x77\x42\x4a\xdd\xa4\x3f\x45\xde\xff\x13\x8e\xc8\x24\x9c\x80\x69\x6e\xd0\x87\x12\x32\x98\x11\x72\x08\x25\x43\x56\xe2\x93\xe3\x51\x70\x04\x25\x23\x56\x32\xc3\x07\x47\x3e\x2b\x19\xb3\x12\x3c\x1b\x1f\xce\x7c\x28\x99\xb0\x92\x63\x7f\x78\x38\xeb\x43\xc9\x01\x2b\x39\x22\xc3\x31\xc6\x50\x72\xc8\x4a\x0e\x67\x83\x10\x0f\xa1\xe4\x88\x95\x1c\xe0\xc1\xec\x98\xc1\x1c\xb3\x92\x31\x1e\x8c\x8f\x18\xe6\x27\x82\x44\x7c\xd4\x0f\x79\x11\xa7\x91\xf4\xc7\xfd\x70\xc6\x8a\x38\x49\xc1\xa4\xdf\x0f\x8f\x59\x11\x6f\x0f\xe3\x7e\x3f\x0c\xa1\xc8\xe7\xaf\x0d\x39\xef\xf1\x70\xe4\x4c\x0c\xaa\x52\x4a\xb1\xf1\x2b\xbf\xb3\x3e\x7c\xe0\x33\x83\xcf\x8c\xeb\xbb\xe2\x35\x12\x90\xc3\xf0\x40\xe7\xb5\x60\xe0\x8f\xc9\xb1\xce\x6b\xb3\xd1\x71\x10\xcc\x74\x5e\x3b\x9e\x1c\x4e\xfc\x40\xe7\xb5\x43\x32\x39\xf4\x87\x3a\xaf\x1d\x1c\x8e\xf0\xec\x50\xe7\xb5\x09\x19\x4d\x66\x03\x9d\xd7\x26\x83\x61\x80\x8f\x74\x5e\x1b\x4f\x86\x87\xb8\xaf\xf3\xda\x68\x30\x98\x1d\x0f\x0d\x5e\x9b\x8d\x8e\x8e\x38\xcb\x08\x5e\x3b\xf4\xc7\x81\x28\xe2\x24\x1d\x4c\x06\xa1\x28\xe2\xed\x1d\x0c\xfb\x7d\x82\x37\xe6\x35\x35\x86\x65\x7e\x3b\x7a\xe0\x37\x83\xdf\xb8\xa2\x42\xe3\xb4\x51\x38\x0c\x03\x9d\xd3\x66\xb3\x80\xf0\xfd\x81\xcf\xe2\x71\xdf\xc7\x7c\x7b\xe0\x9c\x76\x30\x9e\x4d\x38\x7f\xf2\x69\x1d\x0f\xb1\xd8\x1d\x39\xa7\x0d\x07\xc7\x07\xe1\x48\xe7\xb4\x01\x39\x3a\x22\x13\x9d\xd3\x06\xc7\x87\x07\x81\xb1\xab\x0d\x26\x07\x13\xdf\xe0\xb4\x7e\x30\x3e\xc4\x03\x83\xd3\x8e\x86\xb3\x81\xc5\x69\xe3\xf1\x11\xb6\x38\x6d\x78\x7c\x78\x6c\x71\xda\xf0\xf8\x60\x78\x87\x5d\x8d\x8e\x5e\x99\xc7\xee\x59\xc2\xad\xcf\xce\x63\xba\x56\x49\x63\xb4\x41\x38\x09\x89\xc1\x68\xf4\x40\xf5\x75\x46\x3b\x1a\x04\xe3\x10\xeb\x8c\x36\x0e\xfd\x51\x78\xa8\x33\xda\xf0\x78\x76\xc0\x59\x8f\x33\x5a\x7f\x84\x8f\xc3\xb1\xce\x68\xfd\xd1\xf1\xcc\x64\xb4\xfe\xf0\xe8\x28\x18\xe8\x8c\xd6\x1f\x1e\x1e\xce\x02\x83\xd1\x06\x93\xc3\xe3\x99\xc9\x68\xfd\xc0\xde\xd2\xc6\x7d\x7f\x6c\x31\x5a\xbf\x3f\xeb\x5b\x8c\xd6\xef\x1f\x0f\xea\xb7\xb4\x00\x67\xef\xab\xf8\x4c\x8e\x60\x89\xd9\x46\xdb\x4c\x86\xf4\x25\x30\x1b\x57\xfe\x69\x7c\xd6\x0f\x0f\x39\x0f\x09\x3e\x1b\x92\x59\x38\x34\xf8\xac\x1f\x10\x62\xf2\x59\x10\xf4\xc9\xc0\xe0\xb3\x03\xff\x20\xc0\x06\x9f\xf5\x67\x7e\x60\xf2\x59\x1f\xfb\xbe\x71\x74\xf6\xfb\xc7\x87\xf8\xd0\xe0\xb3\xfe\xd1\xe8\x28\x34\xf8\xac\x7f\xd0\x3f\x18\x9b\x7c\x36\x0e\x43\x8b\xcf\x06\x47\xaa\x48\xf2\x19\x99\x94\xf8\x6c\x76\xc4\x69\xda\x80\xcf\xe8\xe0\x95\x59\x6c\x9b\xf1\x75\xbf\x04\x16\xe3\x8a\x5a\x83\xc5\x86\xe1\xc0\x64\xb1\x20\x0c\x66\x26\x8b\xf9\x33\x7f\x6c\xb2\xd8\xec\x00\xfb\x26\x8b\xe1\x83\x63\x8b\xc5\x8e\x0f\x8e\x8e\x4c\x16\x3b\x3a\x3e\x9c\x99\x2c\x76\x78\x7c\x30\x33\x59\xec\xe0\x78\xe2\x9b\x2c\x36\x0e\xc6\x7d\x83\xc5\xf0\x61\x18\x92\x99\xc1\x62\x07\xe3\x30\xe4\x2c\x2e\x58\x6c\x10\x90\xe3\xd9\x81\xcd\x62\x21\x9e\x6c\xca\x62\x74\xf0\xca\x2c\x76\xcf\x62\xa9\x7d\x76\x16\x13\x4a\x75\x8d\xc7\x8e\xc2\x09\x97\xf7\xf9\x04\xfa\x47\xe4\xc0\x37\x6e\x00\x78\x12\x1c\xf0\xcd\x66\x24\x0e\x50\xff\xf0\x68\xac\xf3\xd8\xc1\xc1\x6c\x76\x60\xf0\xd8\xd8\xc7\xe1\xc4\xb8\x6d\x8e\x47\xb8\x3f\x3e\xd4\x79\x6c\x74\x74\x44\x46\xbe\xce\x63\x43\x72\x18\x8c\x86\x3a\x8f\x0d\x66\x13\x32\x34\x79\x6c\x76\x1c\x1e\xf8\xd8\xe4\xb1\xe3\xb0\x8f\x89\xbd\x8d\x1d\x1c\xda\x3c\xe6\x1f\x4d\x46\x9b\xf2\x18\x8c\x5e\x99\xc9\xb6\x19\xd3\xeb\x4b\x60\x32\xc3\xfe\xa1\xe9\x35\x06\xe1\x91\xc9\x69\x81\x4f\x02\xae\xb3\x10\x7a\x8d\x09\x19\xf0\x3d\x80\x73\x1a\x26\xc1\xe4\xc8\x38\x30\x8f\x7d\xdf\x3f\x30\x6e\x00\x47\x33\x7f\x34\xc6\x3a\xa7\x1d\xfa\xb3\xd1\x78\xa8\x73\xda\xc1\xd1\x71\x38\x32\xee\x9a\x93\xc9\xd1\x6c\x68\x1c\x98\xa3\xd1\xc1\xf1\x80\x18\x9c\xe6\xfb\x61\x78\xdc\x37\x38\x6d\x36\x0c\xc3\xc9\xb1\xc1\x69\x87\x07\x61\xd8\x1f\x99\x77\xcd\x71\x10\x0c\x0e\xef\x24\x98\xfd\xcd\xcd\x6e\xdb\x0c\x98\xf0\x65\xb0\xdb\xdc\x52\xa0\x1d\x87\x33\xae\x2e\xe3\xb3\x18\xf6\xc3\xb1\x3f\xd2\x19\x8d\x1c\x10\x72\xec\xeb\x8c\x16\xf8\xe4\xf0\x70\xa2\x33\x5a\x30\x26\x83\xc9\xa1\xce\x68\x7e\x10\xf8\xa3\x63\x9d\xd1\xfc\xbe\x8f\x47\x23\x9d\xd1\x70\x38\x1b\x0f\x8d\x63\xf3\x98\x1c\x07\xc3\xb1\xce\x68\x47\xc3\xc3\x43\xce\x1c\x82\xd1\xc2\x71\x18\x72\x3e\x97\x0a\x34\x12\x86\xe3\x81\xc1\x68\x3e\x65\xb4\xbe\xa9\x40\x23\x04\xf3\xa2\x8d\x18\x6d\xee\x10\xfe\xef\x99\x9b\xd5\x67\x67\x31\x69\x51\xd4\x98\x2c\x0c\x03\x8b\xc9\xc2\xf0\x98\x4b\x62\x43\x59\x32\x39\x0e\x74\x26\x0b\xc3\x70\x70\x68\xe8\x33\xc2\x90\x90\xc9\x91\xce\x64\x54\x7c\x1a\xcd\x74\x26\x0b\x83\xe0\x68\x64\x5c\x33\xc3\x99\xdf\x1f\x06\x3a\x93\x85\xc7\xf8\x68\x38\xd1\x99\x2c\x9c\x1c\x86\x36\x93\x85\x61\x78\x14\x18\x4c\x46\x8b\x04\x47\x29\x92\xb0\xc5\x64\x61\x18\x1c\x6c\xce\x64\x6c\xf8\xca\x6c\xf6\x60\x0c\x30\xd9\x4c\xd8\x7e\x0d\x2e\x3b\x22\x03\x93\xcb\x88\x3f\x1b\x99\x5c\x46\xfa\x47\x43\x93\xcb\x82\xc9\x38\x34\xb9\xcc\xc7\x43\x8b\xcb\xfc\x41\xdf\xd0\xcf\x86\xe1\x6c\xc4\xe7\x58\xce\x3a\xee\xf3\x12\xc1\x65\xe1\x91\xe0\x16\xc1\x65\xe1\x81\xe4\x1f\x45\xe2\xe4\x30\xb4\xb8\x2c\x38\x1c\xdb\x5c\xe6\x8f\x4b\x5c\x86\x67\x9b\x73\x19\x8c\x5e\x99\xc9\x1e\x2c\x01\x26\x93\x49\x33\xbd\xc1\x65\x23\xd2\xb7\xb8\xac\x3f\x1b\x9a\x5c\xe6\xfb\x47\x7d\x93\xcb\x66\x87\xe3\xc0\xe4\x32\x7c\x38\x3c\x30\xb9\xec\xf8\xa8\x6f\xdc\x01\xc2\xd9\x91\x6f\x71\xd9\xe4\xd0\x37\xb9\x8c\x84\x07\xbe\xc9\x65\xe4\x60\x32\x28\x71\x59\x30\x38\xea\x5b\x5c\x86\x67\x25\x2e\x3b\x1e\x94\xb8\xec\x20\xd8\x9c\xcb\xd8\xf0\x95\xd9\xec\xc1\x00\x50\x36\x38\xbd\x70\xb0\xda\x8c\x1c\xdb\xc7\xa6\xef\xcf\x7c\x93\xd5\xf0\xec\x78\x60\xb2\xda\x11\x3e\x98\x98\xac\x76\xd8\x1f\x8f\x4c\x56\x9b\x1c\x0e\x87\x06\xab\x8d\x27\x03\x2e\xce\x1f\x0a\x36\x1a\xe3\xc1\xb1\xce\x6a\xc1\xd1\x78\x34\x30\x8e\xcd\x59\x38\x3a\xe8\xfb\x16\xab\x1d\x93\x12\xab\x1d\x90\x12\xab\x8d\x02\x8b\xd5\x82\x60\xe8\xd7\xb3\xda\x4a\x83\xd3\x8b\x0a\x7e\x7b\x30\x06\x58\x06\x27\xee\xf7\xa2\x69\x36\x42\x32\xb3\xee\x9b\x87\xbe\x6f\xde\x37\x67\x3e\xc6\xd8\xd0\x9e\xe1\xc1\xd1\xd1\xa1\x71\x76\x1e\x05\x07\xe4\xc0\x60\xb5\xc3\xe3\xc9\x64\x6c\x68\xcf\x0e\x82\xb1\x3f\x36\x6d\x9b\xc1\xb8\x3f\x32\x14\xb4\x63\x32\x1a\x0f\x89\x71\xdf\x24\xc3\xc3\xe1\xc8\x60\x35\x8d\xc4\x27\x65\x1a\x9f\x94\x49\x7a\x52\x6e\x6f\x23\x8b\x13\x1d\xbe\x12\x97\x8d\x1f\xac\x00\x65\xb3\x26\x77\xf6\xd1\x18\xcd\x27\xa1\xa9\xa6\xf5\xc3\xe0\x28\x30\xf6\xb4\x59\x7f\x46\x7c\x43\xb1\x71\xdc\xc7\x63\xae\xb0\x12\x5a\x84\xa3\xe3\xfe\xb1\xe1\xb0\x71\xd0\x3f\x0c\x8e\x8c\xab\xc0\x64\x7c\x40\x0e\x0d\x87\x8d\xf1\x64\x82\xb9\x96\x9f\x33\xda\xe8\x70\x7c\x38\x36\x14\x1b\xc3\x83\xd1\x90\x2b\x3f\x9e\x94\x49\x7c\x52\xa6\xf1\x49\x99\xa4\x27\xe5\xf6\x36\x35\x6d\xd2\x11\x2c\xf3\xda\x3d\x33\x07\xf0\x58\xe8\x57\x51\xe1\x5f\x54\xfa\x76\x35\x72\x43\xe6\x9d\xdf\x85\x6b\x17\x23\xef\x1e\x38\x76\x8d\xb7\xa9\x69\xbf\x8f\x61\x3c\x3f\x7d\xa4\xcd\x9d\x06\x0e\xbd\x77\x61\x3c\xd1\xfe\x3e\x42\x57\x04\xbf\x7f\x48\xe5\x60\xb5\xe1\x4a\xe5\x00\xcb\xfe\x29\xae\x8c\xec\x39\x38\x1a\x39\x80\x6b\x33\x3a\x48\xa8\xaf\x3b\xf2\xe6\xee\x52\x34\x46\x49\x1c\x25\xa4\x1b\xc6\xe4\x1a\x4e\x4f\xfa\xdf\x55\x14\x14\x17\x53\x74\x30\xec\x58\xb1\xc0\xa7\xc8\xcb\x48\x8c\x59\x94\x1e\x91\x2a\x21\x26\xd7\xaf\x2e\xb2\x28\x79\x3f\x45\x7d\x3d\xce\xe2\x0c\x67\x76\x48\xc6\x97\x38\x88\x96\xf9\x14\x1d\x76\x4a\x74\xb0\x54\x91\x8e\x06\xf1\x2c\x4f\xe3\x65\x41\x6c\xea\x46\x63\x51\x70\x41\x58\x7c\xc9\x81\x2c\x29\xd2\xc5\x14\x79\x93\xfe\x5f\x65\x25\x2d\x26\x66\x57\xb6\x1e\xb3\x08\x91\x65\x38\x16\x3a\xb2\x3b\x90\x90\xfa\xc3\x65\x9e\x0f\x42\x96\xe4\x3c\xb8\x4c\xeb\x8d\x97\x2e\xb0\x1f\x15\x37\x5e\x07\x79\x33\xec\xbf\x3f\xcf\xd2\x65\x12\x74\x7d\x2a\x81\x78\x6f\x3b\x5a\x74\x99\x40\x45\x3d\x29\x61\x13\xdf\x7a\xf9\x45\x9a\x15\x24\x2f\x44\x28\x18\x99\xd0\x42\xe1\xe6\xc2\x8d\x19\x24\x93\xb2\x16\x7b\xd5\xce\x64\x1e\xf4\x23\xd8\x18\xfb\x1e\xe2\x6a\x15\xd9\x5b\x4e\x6f\x03\x04\xfd\xde\xe8\x08\x4d\xe9\x3f\xfa\x14\xb3\x34\x8f\x6a\x8e\xaf\x5f\x5d\xe0\x20\xbd\x92\xa1\x3e\xe1\x57\xfe\x66\xf0\xb6\x92\x72\xcf\x5f\x66\x19\x49\x98\x94\x66\x4f\xf1\xb0\x6f\x4f\xb1\x2a\x31\x19\x0a\xe6\x50\xa7\x6c\x7f\x1f\xfd\x92\x66\x48\xed\x1f\x50\x2a\x97\xbc\x20\xf9\x8f\xe7\x49\x40\xae\xa7\x68\xd0\x91\x81\xb9\x9a\x0d\xa8\x95\x94\x24\x23\x37\x6f\x26\xfd\xb7\xa8\x94\xad\x84\x7e\x18\xf7\xfb\x6f\xd7\x62\x24\x16\xe8\x20\x4c\xb3\xb9\x77\x77\xa6\xd1\x47\xc5\xbf\x20\xfe\x7b\x3d\xf7\xaa\xb3\xbb\x7a\x12\x15\x83\x6e\x4a\xd1\x94\x87\x61\x88\x71\x41\xfe\x57\x6b\x30\x5e\x5c\xb7\xe5\xb4\x79\x8f\xd0\x63\xf4\x97\x19\xce\xbc\xa9\x46\xf6\x0a\x6e\x75\xb5\xa6\x71\x66\xbf\x37\x11\x5d\xd1\x7b\x22\x12\xcf\xac\xe8\x4a\xb3\x99\xa3\x13\xe4\x9e\xba\x23\x8d\xa8\x8d\x7a\xd7\x7c\x2d\xae\xb7\x1a\x07\x43\x58\x8d\x03\x73\x6c\xcc\x60\xb6\xc6\x79\x0c\x71\x12\xb4\x43\x57\xc5\x49\x68\x6f\x21\xf6\xed\xf3\x10\x9d\x51\xb1\xf5\xac\xc3\x23\x35\x8a\x24\x33\x51\x2e\x98\x4e\x8f\x0c\xcb\xb9\xb0\x2a\x44\x4d\x42\x5e\x84\xb4\xd5\xd6\x9b\xba\xc0\x42\xf5\x01\x69\xde\xb6\x2b\xf2\xd7\x16\xa9\x38\x75\x58\x84\xd0\x7a\x7a\x69\xcf\x30\x62\x28\xe9\xc7\x45\x96\x5e\x46\x01\x09\x3a\x28\x2a\xd0\x55\x14\xc7\xf4\x1a\xbf\x94\x61\x27\xc3\x34\x29\x50\x1c\x9d\xe3\x62\x99\x91\x52\x8f\x9f\x6f\x90\x15\xf7\xce\x31\x90\xb6\x19\x91\xc8\x1c\xd2\x7f\xe6\x24\x5c\xc6\x74\x40\x99\x20\xcf\xb3\x01\xdf\xc4\x04\x61\x1e\x70\xb5\x48\xdd\x09\x88\xef\x4d\xec\x5a\xbe\x0a\x9e\xad\x60\xc9\x72\xcc\x57\x8b\xe3\x73\x76\x23\x17\x1c\x21\xb6\x27\xd5\x65\xb5\x61\x6d\xda\x44\x16\x2d\x16\x31\x41\x24\x0c\x89\x5f\xac\x6e\xe9\x25\x80\x6f\x92\xe1\x79\xe5\x0a\x59\x26\x3b\x58\x23\x9b\xa4\x8c\xbe\xc7\x8b\x43\xdd\x28\xf5\xc5\x40\x87\xf2\x2c\x4a\x16\xcb\xe2\x0c\x11\x16\x8c\x50\x1b\x01\x5a\x0e\xdb\xeb\x5a\x0b\xe3\x9f\x39\x41\xc5\x05\x2e\x8c\x98\xb7\x0b\x9c\xd3\xb1\xce\x48\x88\x7c\x1c\xc7\xf4\x94\x12\xed\xb3\xc8\x6d\xac\x35\x57\x30\x5c\xf8\xf0\x92\x84\x4d\x82\xf6\xba\x17\x55\xb2\xee\xaa\x7c\x26\x48\x0c\x21\xe8\x91\xe4\xba\xbc\xc0\x05\x61\x7b\x32\x4e\xce\x05\xbf\xf1\x46\x17\x38\xc3\x73\xf4\x81\x0d\xc9\x2d\x22\x97\x94\x3b\x29\x13\xb3\xbf\xf2\x74\x99\xf9\x44\xc6\x0e\xe6\x2d\x98\x75\xe9\x22\x20\x38\xb9\x15\x1b\x34\x54\x3f\xe3\x3f\xce\x98\x3e\x46\x60\x60\x2b\x5c\xf6\x31\x4d\x9e\x01\x4d\x6b\x84\x36\xb6\x87\xa9\xc0\x33\x2e\x7e\x6e\x7c\x10\xb2\xa4\x68\x1b\x1c\x85\x46\xd7\x1c\x4c\xc0\x55\x51\xb5\x78\xed\x18\xbd\x30\x40\xa5\xc4\xe7\x0d\x73\x82\x55\x87\xd2\xdd\x34\x9a\xac\x1e\x16\x56\x86\xb1\x7b\xdb\x96\x21\x51\x79\xbe\xf5\x15\x29\xd7\x20\x1e\xa9\x3b\xaf\x16\x20\xb8\xbd\x43\x84\xd3\xcd\x73\xa1\xd3\x2a\x6d\x2d\x63\x58\x4d\xa3\x4a\xe6\xeb\x54\x86\x54\xe5\x23\xcd\xb6\x60\x3d\xf5\xbc\x3c\xa8\xb5\x5b\x88\xb8\x43\x09\xb2\x8c\xdc\x66\xc6\x2d\x43\xa6\x6d\x67\x05\x0a\x42\x1d\x86\x12\x89\x9e\x48\xd2\x08\x7b\xaa\x49\x4e\x32\xb3\x84\x0c\xf6\xda\x28\xda\x6b\xdd\x1c\xce\x70\xc6\xee\x48\x3c\x9c\x2a\x0c\xd6\xe7\x89\xa4\xfa\xc9\xc4\xe2\x2f\x47\x1e\xfd\x62\xc2\x62\x9a\x62\xe8\x76\x62\x50\x8a\x25\xb5\x55\x6c\x4c\xaa\xfc\x8c\x69\xfb\xef\x15\xff\x35\xee\xa9\x94\xec\xb6\xc5\x81\x42\x48\xdb\x4e\x60\xcd\x64\x8b\xac\x2c\x04\xa3\x2d\x85\xfc\xe4\x32\x52\xcd\xb8\x6d\x4b\x48\x6a\x4a\x12\x88\x46\x0d\x46\x4b\x8f\x8b\xb9\x7e\xdc\x4a\x7a\x5e\x31\x39\xda\xfb\x6d\x19\xb1\x73\xc9\x43\xb7\x6d\x7e\x9e\xef\x26\x92\xe5\xf8\x9e\x3d\x1a\x61\xa6\xa2\xd7\xe0\x13\x51\x65\xec\x6e\x14\xf1\x69\x87\xc6\x6e\xa0\xae\x32\x0e\x0b\x7c\x7d\x9a\x06\xd5\x81\x58\x1a\x05\x7e\x92\x68\x76\xd6\x03\x8a\xbc\xbe\x17\xcf\x48\x5c\x15\xb1\x6d\xd4\x6f\x14\xc2\x47\xa2\xd9\x59\x2f\x28\xf2\xfa\x5e\xfc\x92\xa6\x45\x75\x28\xab\x71\xa3\x50\x56\x1a\xa2\x9d\xf5\x84\xa1\xaf\xef\xcb\xdf\x09\xae\x0a\x93\x7a\x30\x6e\x14\xd9\x4a\xa2\xd9\x59\x3f\x28\xf2\xfa\x5e\xfc\x8e\xcf\xa3\xa4\x2e\xf5\xde\xc1\xb8\x51\x90\x2b\x0b\xd9\xce\x7a\xa4\x9a\xa8\xef\xd7\xcb\xea\x68\x6f\x93\x46\xd1\x97\x04\x96\x9d\xf5\xe4\x65\x4d\xc4\x37\x00\x78\x95\x66\x85\xc8\x9b\xe3\xee\x48\xa3\x48\x8d\x26\xae\x9d\x75\x47\xb6\x70\x1f\x3c\x8f\xee\xd9\x7b\xb8\xcf\x9c\x11\xf8\x5e\x39\xf6\x9c\x13\x5a\x5c\xa4\x54\x8e\x7f\x11\x56\x90\x70\x54\x01\x5e\xe7\xad\x62\x42\x9a\x4e\x3b\xcf\x70\x1c\xc3\xf5\xae\xaa\xcf\xc7\x15\xf0\x75\x5d\xb5\x30\x2b\x0c\xa0\xff\x78\x46\xbf\x56\x35\x37\xe8\xbb\xa0\x6b\x1b\xd3\x90\xaa\xe8\xd1\x69\x9e\x47\xf4\xe0\x4d\x93\xbc\xc8\x96\x7e\x91\x66\x2f\x61\x09\x55\xb6\x3b\x58\x5d\xb7\x8e\x8a\xea\x06\xb5\x58\xca\x17\x24\x8b\x8a\xea\xae\x97\x41\xeb\x5a\x94\xe8\xda\x3b\xcd\xea\xac\xeb\x9c\xdc\x57\x8b\x12\x64\x1d\x72\x09\xf4\x25\xb9\x99\x7d\xbd\x0e\x60\x0d\xf1\x71\x95\xe7\x6b\x70\x19\xb8\x23\x6d\x3a\xae\xcf\xe1\xa3\x16\xa6\x49\xf1\x0b\x9e\x47\xb1\xf4\x88\x28\x6e\x16\xe9\x79\x86\x17\x17\x37\x3d\xf5\xd1\xf2\x19\xf2\x06\x7d\xcd\x9d\x8b\x79\x09\x89\x4c\x13\x53\xe4\xf9\xfc\x4f\x0b\xe2\x15\x4b\x4a\x3c\x45\xd2\xbf\x28\xbd\x24\x59\x18\xa7\x57\x53\xe4\x5d\x44\x41\x40\x12\xcf\xe5\x62\x71\x17\x9f\x89\xd7\x5a\x4a\x4b\x6e\x88\x29\xa8\x18\xd3\x41\x49\x9a\xcd\x21\x95\xe9\x99\x14\xa1\x49\x76\x86\x70\x12\xf0\x12\x7a\x59\x3b\xbb\x07\xa9\x76\x1f\x7c\x0b\xca\x13\x2a\xec\xe4\x60\xf0\x0e\xd3\x8c\xd9\xee\xd3\xb4\x40\x49\x1a\x70\x7b\x37\xfa\x39\x02\xa3\x96\xb4\x9a\x17\x29\xe4\xf4\xc3\xe8\xa7\x17\xbf\x09\xc3\x30\x4a\x29\x80\xc3\x36\x27\x8b\xd6\x9d\x6f\x63\x77\xd8\x70\xda\x75\x1c\xdb\x99\x7d\x0d\x63\x5b\x2e\x2c\xa1\xf3\x91\x5b\x47\xeb\x1d\xd4\xff\xcb\x33\xd1\x79\xb6\x7f\x80\x1a\x4d\x9e\xe2\x4a\x89\xf6\x9a\xad\xa4\x52\x25\x30\xd6\x49\xa4\x00\x25\xef\x18\xca\x02\xa7\x84\x2f\x85\xb1\xb8\x88\xf2\x0e\xab\xd1\x3e\xd1\xef\x24\x50\xad\x5a\x96\xb1\x31\x30\xd2\x7a\xef\xe8\x00\x14\xe9\xbb\x77\x74\x6f\x05\x14\x96\x9c\x69\xf5\xa5\xdd\xee\x51\xc6\xbf\xe1\x58\x70\x76\xbe\xa4\xa3\x96\xb7\xdb\xec\x92\x23\xc6\x42\x17\xe6\x4a\xc3\xf1\x86\x75\xf4\x3d\xb9\x99\x22\xef\x9c\x14\xcf\xe8\xc6\x01\xb9\x71\xae\x0b\xbe\x23\xf2\x8b\x83\x7e\x09\xd3\xa1\xe4\x60\x81\x8b\xa5\xf9\x6c\xa9\x1b\x47\x09\x61\x6b\xa7\x3b\x27\xc5\x45\x1a\xe4\xdd\x65\x4e\xba\x94\x62\x5e\xc7\xd8\xee\xc1\xaf\x90\x5d\x00\x3f\xdc\x0a\xc3\xdf\x89\xda\x66\x85\xef\x23\x23\x37\x23\x49\x40\xb2\x0a\x2a\xd9\x47\x8d\x38\x29\x28\xd1\x6d\x97\x12\xd0\x63\x76\x61\xd9\xb0\x9e\xa2\xf5\x9d\xd3\x34\x8d\x1c\xd9\x5e\xdf\x55\xd8\xa8\x91\x99\x3a\xf6\x9d\x3b\x77\x2c\xfd\x4f\xb2\xa2\x85\x51\x14\xeb\xb0\x6b\x5a\xbe\xdf\xd5\x9b\xbe\xed\x14\xaa\xa2\x45\x61\x13\x17\xc3\xb6\x49\xaa\x50\x47\xce\x4f\xfd\xd6\xde\x24\x19\xa7\x35\x34\x6a\x1c\xee\x94\x07\x14\xd9\xa9\x33\xc1\xd2\x2b\x59\xec\x2d\xfc\xe0\x64\xc2\x22\x39\xd9\xbb\x6d\xd9\xf4\x1a\xdb\x07\x5b\xbe\x8e\xe4\x56\xda\xb6\xec\x01\x5b\xb3\xc7\x66\xbc\x82\xaf\x2d\x22\x21\xe6\x7f\xd8\x93\x0b\x40\x13\xea\x65\xb3\x6c\xc6\x37\xcc\x7b\x65\xda\x0f\x80\x06\x30\x1f\x88\x0d\xcc\xd6\x57\xdc\xb3\xe0\x2a\x0f\xfa\x8a\x07\x7d\xc5\x83\xbe\xe2\x41\x5f\xf1\xa0\xaf\x78\xd0\x57\xfc\x89\xf4\x15\xaf\xa2\x3f\x88\x43\x5b\xb1\xb8\x7e\x9d\xbe\x24\xf3\xd6\x60\xd4\xae\x7f\x68\x44\xae\x0b\xf1\x20\xe6\x13\xa8\x1b\x94\xd0\x69\xab\x1c\x5e\xa6\x57\x0f\xfa\x85\x07\xfd\xc2\x17\xae\x5f\xe0\x7e\x19\x77\xd2\x31\x50\x1c\xcd\xf4\x0c\x14\x72\x7d\x5d\x03\xf8\x65\xdc\x5d\xdf\x40\xd1\xac\xad\x73\x80\xb6\xef\xae\x77\x60\x43\x74\x7f\x75\x0f\xda\x8d\x7b\x96\x06\x37\xfc\x16\x22\x8a\x1e\x34\x13\x0f\x9a\x89\x7b\xa1\x99\xa0\xcb\xa8\x99\x76\x02\x16\xfb\x2a\x0d\x05\x65\x75\x5d\x43\x01\x95\xee\x81\x96\x02\xbc\xdc\xa4\xa6\x82\x6f\x7f\xb6\xb6\xe2\x9e\xc5\xe8\x7c\xd0\x56\x3c\x68\x2b\x1e\xb4\x15\x0f\xda\x8a\x07\x6d\xc5\x83\xb6\xe2\x0b\xd2\x56\x0c\x1b\x68\x2b\x72\xe2\xa7\x49\xf0\xa0\xaf\x78\xd0\x57\x3c\xe8\x2b\x76\xad\xaf\x90\x6f\x17\xee\xa4\xb1\x60\x58\x9a\xe9\x2c\x18\xec\xfa\x5a\x0b\xfe\x7a\xe1\xee\x7a\x0b\x86\x68\x6d\xcd\x05\x6f\xff\xee\xba\x0b\x31\x58\x7f\x0a\xed\x45\x08\xc4\x3e\xe8\x2f\xee\x97\xfe\xe2\x53\x6b\x1c\x36\xd3\x8c\xdc\x59\x3d\xc1\x56\x4a\x33\x05\x05\x5f\xd5\xab\x54\x14\x94\x9f\x75\x15\x05\xaf\x76\x0f\x94\x14\xfc\xf1\x97\x54\x53\xc8\xfd\xce\x56\x54\xdc\xb3\x3c\x0f\x0f\x8a\x8a\x07\x45\xc5\x83\xa2\xe2\x41\x51\xf1\xa0\xa8\x78\x50\x54\x7c\x91\x8a\x0a\x0a\xfd\x6f\x1e\x2c\xd6\xf9\x68\x84\x7d\xfc\x8d\x04\xd1\x72\xfe\xa0\xdd\x78\xd0\x6e\x3c\x68\x37\xee\x8b\x76\x83\x47\x33\xb8\x93\x6e\x83\xe2\x68\xa6\xd9\xa0\x90\xeb\xeb\x35\x20\x9a\xc1\xdd\xb5\x1a\x14\xcd\xda\x3a\x0d\x68\xfb\xee\x1a\x0d\x36\x44\x7f\x0a\x7d\xc6\x05\xc1\xc1\x83\x36\xe3\x7e\x69\x33\xd4\xb0\x7d\xdd\xde\x18\x74\x19\x35\x53\x76\xc0\x62\x5f\xa5\xea\xa0\xac\xae\xab\x3a\xa0\xd2\x3d\x50\x74\x40\x6c\x18\xa9\xe6\xe0\xdb\x9f\xad\xe4\xb8\x67\x59\x06\x1f\x94\x1c\x0f\x4a\x8e\x07\x25\xc7\x7d\x56\x72\x7c\x8a\x6c\x44\xcf\xfd\x34\x79\xba\x2c\x8a\xca\xb0\x52\x83\x51\xdf\x01\x5c\xd7\x8a\x82\x52\x15\x21\x8a\x76\x55\x03\x03\x13\xae\x16\x37\x05\x90\xe0\xbf\x91\x64\x59\xa5\x9e\x39\x56\xab\xe7\x15\x89\x49\xe5\xec\x8c\xfa\x23\x0b\xb0\x36\xd3\x12\x40\xc8\x0a\x0d\x23\xbe\x99\xb0\x75\xf8\x55\x78\x36\x59\x2d\x4d\xe3\x19\xae\x0a\xc5\x36\x38\x3a\xb2\x21\x6b\xd1\x33\x10\x55\x45\xde\xfa\xab\xf6\xf8\xbe\x03\xb6\xb6\x05\x09\x25\x2b\xfe\x4f\x72\x33\x4b\x71\x16\x3c\xc9\xb2\xf4\xea\x57\x12\x56\xce\x84\xb6\x01\x95\xea\xd4\xb5\x59\x02\x76\xa3\x79\x19\x9d\x5f\x54\xb7\x3d\xa8\xa9\xd4\xb8\x71\x80\xfe\x6a\x75\x6f\xfb\xfb\xe8\x7f\xf0\xad\x91\x04\x52\xc2\x43\x92\xa7\xbf\x5a\xe5\xdc\xfe\x3e\x7a\x9e\xd0\xc3\x12\x72\x10\x10\x94\x2f\x88\x1f\x85\x91\x1f\xb1\x2c\x04\xe9\x25\xc9\xb2\x28\x20\x6a\xa4\x7a\xbc\xa2\xf7\x68\x1a\xe3\xbc\xe8\x82\x88\x6b\x24\xd4\x59\xe0\x20\x60\xa1\x58\xf6\xf4\x2b\x1f\x8f\x08\x5e\xb0\x75\xae\x2a\x88\xcc\x50\x93\x03\x99\xc2\x2b\x4a\xfe\x5e\x2a\xe4\x58\x5f\xf2\x34\x52\x3a\xca\x7c\x81\x7d\xa2\x61\x0c\x63\x72\x3d\x45\xde\x00\x0d\x10\xc4\x92\xd1\x61\x7d\xbc\x60\x19\x98\x74\x60\x67\xf6\x33\x08\xd0\xeb\xd2\x62\x7a\x9c\x91\x0c\xbc\x39\xec\xbe\x2f\x8d\xb1\x65\xa9\xc8\x5e\xea\xba\xcc\x9c\x85\xa9\xe9\x2d\x93\xa8\x40\xdf\xa1\x71\x19\x85\x5d\x9d\x65\x32\x2b\xd7\xae\x4c\xa6\x46\xef\x1a\x4f\xe2\xe8\x1c\x72\xbd\x41\xbe\xa1\x8a\x21\x1c\xae\xa1\x3d\xb5\xd3\x78\x8d\x64\xe5\x38\x4a\x88\x98\x2d\x6f\x34\x5c\x5c\x1b\xc3\x82\x81\x25\xf3\x8a\xe1\xde\x80\x80\xfa\x41\x41\xdf\xa1\x21\x4f\x37\xb5\x99\xaa\x17\xa2\x0f\xfe\xc4\x72\xa7\x90\xe0\x65\x7a\x95\x3f\xc9\xce\xc5\xad\x2d\xcc\xd2\x79\xa5\x0e\x8d\xc5\x28\xb6\x22\xc2\x17\xe9\x7a\xf0\x7e\xba\xa4\xb7\xc9\x75\xaa\x2c\x70\x4d\x0a\x8b\x52\x0d\x3a\x1e\x77\xd5\x7c\x7f\x5a\x5d\xef\x83\x96\xf6\xce\x5a\xda\x15\xca\xf3\x34\x7e\xb5\xc0\xc9\x0a\x1e\x2a\x4f\x4a\x91\x16\x38\x46\xec\x2b\x4a\x43\x94\xa5\x57\xfa\x54\xaf\xcb\xc9\x6e\x0e\xf3\x97\x79\x91\xce\xa3\x3f\xd8\xe1\x14\x88\x85\x09\x8d\xa1\x98\x0e\x85\x6a\x32\x2e\xad\xdd\x35\x52\xbb\x54\x35\x09\x0d\x2d\x48\x06\xeb\x8c\xb7\x88\x9e\x27\x97\xe9\x7b\x12\x20\x7a\x69\x41\x18\x9d\x7d\x80\xad\xa1\x83\x8a\xb4\xc3\x3a\xde\x61\xe0\xb7\x67\x0c\x39\xcf\x16\x61\x52\x4a\x09\xfc\x9d\x64\xbf\xc3\xfa\xfd\x62\x0c\x41\x55\x89\x80\x60\x3c\xb4\x3c\x40\xe6\x18\x16\x57\xa9\x52\x85\xc3\xc6\xce\x73\x00\x61\xb6\xbd\x30\xdc\x80\xa3\x48\x51\x7e\x91\x5e\xa9\xc1\x14\xe1\xea\x7f\xaf\xdb\x08\xe9\x38\x55\xb2\x5b\x15\xcd\x26\x6f\x2b\x2e\x58\xa3\x1b\xac\x01\xe8\x4b\x99\x62\x83\x03\x36\x21\x9c\x2e\xc3\x3f\x48\x96\x76\x67\x98\xee\x8b\x51\x12\x90\x6b\x69\x8c\x64\x69\x39\x81\x62\xd5\xf4\x7a\xa7\x45\xb9\xb5\x8a\x21\x51\x0d\x64\x0d\xfa\xb4\xa2\x9d\x67\x62\x01\xe6\xd0\x91\x14\x04\xb6\x5c\xf4\xcb\x9c\x0a\x26\x33\xa1\x30\x22\x71\xe0\x24\xe2\xc5\x82\x0b\x20\x55\x92\x75\x96\xe1\x9b\x17\x61\xab\x96\xd4\x15\x3b\x28\xc8\x21\x2b\x0e\x35\x29\x88\xbc\xcb\x48\x08\x0a\x9c\x5a\x55\x39\x57\x37\xc8\xd4\x3c\xf4\xa6\xc5\x2c\x33\xff\x4c\x02\x92\x51\xa1\x8b\xe9\x4b\xd1\xad\xa6\xc2\x09\xc7\xab\x11\x3b\xae\x90\xaa\x95\x64\xa9\x5d\xef\x33\x12\x4e\xd6\xc4\x07\xd7\xe1\x6a\x74\x07\xdb\x45\x77\xb8\xa5\xde\xc2\xc4\x7e\x87\x9e\x68\xc6\x7a\xc4\x56\x94\x12\x3c\xa8\xcc\xb1\x88\x41\xd2\x44\x51\x92\xd3\x2b\xd1\x99\xe6\x38\x78\xc6\x00\x64\x60\xf1\xde\x1e\x65\x0d\x69\x19\x35\x22\xa4\xdf\xc9\x3e\xaa\x30\x35\xb3\x92\x2a\x78\x69\x33\x13\xc3\xc7\x8d\x37\xf0\xb3\x20\xf3\x45\x07\xbd\x63\x46\xc9\x77\x19\x29\xf8\xc7\xc6\x76\x55\x2d\xa6\x3a\xaf\x4a\x07\xa4\x05\xc8\x63\x30\x95\xc9\x8d\xb1\x17\x93\xe4\xbc\xb8\x00\xe3\x27\x15\x2e\x9f\xd0\x25\xd8\xa2\x50\xed\x0e\x7a\xf7\x9e\xdc\xa0\x53\xd4\x3f\x61\x7f\x7d\x0f\xb5\xd9\x8f\xc7\x8f\x95\xd5\x8f\x56\x7d\x43\x0b\xdf\xea\x98\x59\x89\xb0\xfa\xec\x99\x86\x29\xb0\x9f\x40\x47\xd9\x1f\x17\x51\x2e\x2c\x2a\x6b\x58\x7f\x79\x8e\x28\xab\xcf\x6b\x9b\x82\xb5\xe1\x6a\x43\xaa\x0f\x6e\x15\x66\x19\x4a\xde\xd0\xc6\xde\xf6\xfc\x34\xf1\x71\xd1\xa2\x7d\x6d\xb7\xdb\x7c\x7a\xc4\xbf\xbd\x0b\x9c\x04\x31\x79\x8a\xfd\xf7\x4c\xa3\xf9\x2c\x8e\xfc\xf7\x06\x7b\xc1\xb1\xa3\xc6\xec\x9d\xb2\x8e\xf6\xf4\x43\x93\xc1\x75\x8c\xef\xb0\xb9\x76\xd1\x40\x98\xd0\xcc\x46\xff\x41\xae\x8b\x5d\x35\xfa\xd8\x6c\x94\xcc\x17\x22\xad\x4b\x93\x59\xd2\x38\xb8\xb9\x41\x5d\x5f\x53\x86\x59\x5d\x2e\xff\x7f\x47\x71\xfc\x92\xf8\x24\xba\x24\x3c\x09\x90\xd3\x38\x5d\x09\x0f\xf3\x3a\x34\x8d\xd6\x20\x28\xb2\x1d\x2c\x1c\xf6\x98\xd8\xa8\x9b\x84\xb5\xc1\x92\x50\x7a\xa1\x0e\xac\x1d\x78\x12\x56\x2b\x33\xac\xbe\x09\xb9\xfa\x15\xe7\x05\x87\xfd\x0d\x17\x17\xbd\x39\xbe\xa6\x63\x04\x7f\xfb\x24\x8a\x5b\x8c\xb6\x7d\x1d\x6f\x5b\x63\x07\x84\xa2\x10\xb5\xec\x99\xfb\x41\x47\xdd\xd6\x14\x42\xc6\xbc\xd3\x4d\xb7\x63\x40\x9e\x98\x6a\xa2\x7b\xe2\x10\xa0\x94\x84\xf5\xa6\x7b\x7e\x7d\xb2\x8d\xfc\x50\x68\xc2\x2d\x4d\x5c\xd6\x7c\x97\x6f\x2f\x0a\xb8\xfc\xad\x54\xf3\xa5\xc9\x01\x5a\x3d\xed\x4b\x1d\x7f\x95\x97\xa8\x0b\xda\xd9\x8c\xe3\xa3\x5e\x77\x61\x00\x2f\xea\x59\x97\x01\x65\x6e\x4c\x65\xb9\xce\x59\x85\x7f\xd3\x6b\x82\x88\xa6\x80\xe1\xe7\xd6\x1d\x30\xa4\x9f\x05\xfc\x00\x0e\x60\x7f\x2e\x59\x59\x79\x1a\x65\xa9\x36\x74\x9e\x96\x82\xcb\xfe\x6d\x81\x2d\xf8\xbf\x99\x59\x5c\x1e\x0a\x5a\x0a\x7d\x36\x1e\xb4\xb0\x5d\x08\xe8\x44\xa7\xe8\x32\x8d\x02\xd4\x97\x5b\x05\x5d\xe1\xda\x1a\x38\x3d\xd5\xcd\x44\xd2\x25\xe1\xe3\x47\x64\x02\x79\x45\xe0\xe9\x6b\x5f\xe1\xd7\x17\xca\xc7\x8f\x68\xd0\xef\xf7\x4f\xd0\xfe\x3e\x2d\xef\xe6\x14\x24\xbd\x24\x19\xbd\x2a\x65\x37\xc5\x45\x94\x9c\xcb\x5d\xe1\x6e\x2e\x26\x1b\xb8\x97\x28\x67\x17\xa1\x1a\x11\xbd\x70\xf8\x9c\x34\xa4\x07\x29\x23\x58\x39\xdf\x26\x72\xa7\xb6\xe4\xaa\x72\x95\x4b\x73\x75\x7b\x75\x99\x32\x99\x9a\x1c\x9c\x3e\x9a\xa2\xd3\x00\x91\x61\x66\x73\xf5\x81\xf6\x82\x4a\x3b\xf4\xe0\x64\x5a\x76\xaf\xe3\xa2\x83\x7f\x34\xbb\x55\xde\xc6\xb4\x8f\x1b\x53\xcc\xad\xa6\x15\xd4\x1a\xbf\xf4\x54\xa9\xdc\x46\x22\x07\x4e\xea\xf6\x3b\x52\x49\x6f\x7e\xb3\xfb\x82\x10\xdc\xdf\x9e\xc5\xa5\xe4\xab\xe2\x3f\xb3\x05\xb0\x35\x58\x30\x25\x94\xdc\x20\x01\x17\x48\xfb\x1b\x3f\x15\x2b\xf6\x4d\x84\xf4\x74\xc7\x8e\xcd\x64\xaf\xa6\xe1\xf2\x6e\xd2\x9b\xe3\x45\x4b\x49\x7c\x25\x80\x76\xa9\xbf\xeb\xad\x5d\xf1\x1f\x18\xd1\x7b\xf4\x7f\x9e\x17\x64\x6e\x77\x88\xb2\x1b\xc8\x07\xa5\xf6\x3b\x8e\xe1\x78\xe1\xe4\x39\x67\xff\x2c\x08\x29\x9f\xf0\xd1\x69\x6f\x83\x31\x3f\xc1\x52\x32\x0e\x9a\x96\x3d\x23\xcc\x96\xc1\x85\x92\xd3\x53\xd4\x47\x3f\xa2\x3e\x9a\xb2\xc3\xfa\x3b\xe3\x54\x7e\x8c\x06\xf6\xa8\x15\xe9\x94\x4b\x8e\x51\xd2\xe2\x1a\xcf\x96\x14\xdf\xcd\xfa\x6d\xbb\x32\x57\x0d\x97\x24\x20\x84\x84\x7e\x6a\x51\x62\xc9\x6d\x0c\xba\x96\xb7\x59\x8d\xb2\x63\x50\xb9\xcd\xca\x1e\xd4\xb5\x98\x57\xf7\x47\x71\x4f\x30\x6d\x9c\xdf\x9f\xa6\xa8\xfa\x42\xd7\xd1\x52\x2d\x33\x41\x0a\x26\xab\xc4\xc7\xcc\x16\x16\x44\x19\x61\xab\x12\xce\xe2\xac\x88\x3d\xf4\x23\xd7\x0c\xb1\x9d\x63\x62\xd4\x6b\xef\xba\x8b\xa5\xd5\xe6\xea\xb2\x75\x9d\x2c\x2f\x51\x6b\x08\x7e\x38\x6d\x70\x55\x59\xb5\x9b\xae\x1a\xb0\x03\x3e\x60\x87\xe6\x80\xed\xb9\xfe\x16\x7f\xd5\x3b\x9c\xaa\x6b\x66\x33\xb7\x53\x4d\xbd\x50\xef\x7c\xea\x10\xcc\x3a\x4e\x2b\x83\xf7\x52\x57\x9e\x4e\xbd\x4e\x85\xd5\x44\xee\xed\x8e\x8d\x84\x8e\xc9\x91\xae\x4a\xa2\x3b\x09\xbf\x74\x1e\xf5\xc0\x0e\x22\xc7\xa5\x48\xe5\x87\x22\xd5\xdc\x74\xb5\x9b\xef\x11\xbb\x09\x19\x1e\xf9\x80\xf1\x31\xf2\xba\x1e\x7a\x4c\x71\x3c\x46\x1e\x4a\x43\x44\x7f\x49\x60\x98\x4f\x97\x9e\xf7\xcd\xa4\x83\x06\xfd\x0e\x1a\x4e\xde\xee\x6d\x9c\xb7\x95\x7e\x7e\xcd\xb4\xba\x90\xd9\xce\x76\xaa\xd5\x92\x14\x4a\xd7\x5a\x53\x03\x66\x39\xd8\x1e\x6f\xd1\xc1\xb6\x26\x6d\xac\xc2\xcd\x93\x9e\x43\xf5\x4f\xe0\x8f\x6b\xe2\xae\xf2\x65\x3c\x6c\xbb\xe1\xeb\x1c\x1a\x2d\xcc\xf7\xd3\x49\x77\xa7\xee\xc8\x19\x09\xe1\xa2\x84\xae\x08\x7e\xbf\x4b\xa7\xce\x87\x87\xa5\x7f\x4e\xe7\xb6\xad\x3a\x86\x55\xdd\x92\xf9\xee\xbd\x48\xf3\x88\x39\x50\x79\x19\x89\x71\x11\x5d\xaa\x4c\x5c\xdc\x3c\x3f\x45\x5e\x18\x93\x6b\x59\x8c\xe3\xe8\x3c\xa1\x12\x7c\x4e\xc5\x59\x42\xe7\x45\xf8\x08\xf1\x53\x78\x1e\x5d\x47\x89\xbc\xef\x72\xa1\xe4\x7c\x59\x14\x24\xcb\xa7\x26\x0c\x2f\x6d\x7d\x00\x91\x70\x4b\x6f\x39\x3f\xb1\x47\x0b\xbf\xd6\xcb\x47\x43\x68\x99\x2f\xe1\xb1\x28\x46\xf3\xe8\xba\x58\x66\x84\x1e\x77\x67\x4a\xbe\x3a\xeb\xa0\x33\xfe\x17\xcf\x21\x26\xaf\x0f\x5f\xf6\xb3\xd2\xed\x3c\xf4\x7c\x1e\xa2\x33\x7a\x96\x9d\x49\x61\x3a\xe7\xdc\x25\x5c\xe2\xd4\x20\x72\x80\xbf\x09\xe6\xab\x68\x66\x96\xa6\x31\x7b\xec\xa3\xcc\x6d\x6c\x5a\x5b\xa0\x1a\x6c\xf3\x73\x34\xd3\x1f\x8b\xb9\xdf\x8a\x29\x65\xb4\x53\x17\x6d\x3f\x4c\xab\x78\x97\x66\xd2\x2d\xe1\xcc\x62\x99\x1a\x6f\x3d\x6d\xa7\x52\x76\xea\xaf\xca\x2a\x5e\x9e\x99\x2d\x4a\x7d\xe3\xa6\xef\xcd\xea\x13\xfa\x7f\xb8\xed\xc8\x6b\x1b\xdf\x19\x3a\xe8\x1b\x93\x84\xb6\xf3\xd1\x5a\x73\x8d\x84\x76\x6d\xbc\xd3\x03\x35\xed\x71\x5a\xfb\x64\xef\x76\x6f\x8f\x33\x4c\x4f\x0f\x18\xc1\xc5\xb6\x1e\x49\x2e\x7b\xff\x78\xf1\xd3\xcf\xef\x7e\xfe\xc7\xbf\xd0\x37\xa7\xa7\xe8\xdb\x45\x96\x06\x4b\xe0\xb4\x6f\xd1\x8f\xd2\x0e\xf9\xa1\xf1\x1e\x64\x38\x01\xae\x1a\x57\x66\x86\xd4\xe6\xb8\x16\x75\xbb\x29\x3a\xc5\x3e\x7f\xe2\x1d\xaa\x71\x6f\xb5\x55\x51\xbb\x59\x35\x45\x68\xad\xac\x4a\xac\x74\x6f\x6a\x83\x0d\x34\x6c\x53\x31\xe6\xf6\x44\xb2\x9a\xe3\x1e\x69\x6f\x78\x21\x8e\x73\xb2\x9d\xe7\x87\xac\x51\x76\x43\x92\xaf\x3b\x6a\x6e\x2f\xb7\x60\x09\x6f\xd5\x5d\x87\x5a\xa3\x76\xbb\x6d\xdf\xae\x26\xfd\x2f\xfc\x76\xb5\xd3\xeb\xc5\x57\x7e\x75\x63\x8e\x30\x0f\xe1\x80\x1e\x6e\x6d\x9f\xff\x71\xcf\x17\x7d\xb1\x14\x37\x48\xfe\xd8\x43\xbe\xa2\x29\xdf\x1e\xe1\x75\x7c\x37\x4b\xaf\x3c\xfb\xd9\xc9\xf8\x48\x94\x78\x8f\xa6\x61\xea\x2f\x73\xe3\xe5\x51\xba\x2c\x98\x67\xa4\x97\xa4\x09\xf1\xf6\x2c\xd5\xef\x25\x5d\xfb\x3e\x8e\xc5\xeb\x98\x79\x14\x04\x31\x31\xde\xab\xb0\x80\x15\xe5\xa7\x49\x3a\x8c\x08\xd2\x59\x0f\x75\x91\x5e\xea\x40\xde\xa3\x29\x94\x18\xf4\xce\xb0\xff\xfe\x3c\x4b\x97\x49\x60\x3f\x7e\x51\x5f\x7a\x3c\xc8\xd0\x2f\x19\x9e\x13\xd3\x53\x46\x7f\x36\x44\x34\xb2\x1b\xa1\xc5\x8b\xc5\x53\x9c\x29\x7d\xf5\xda\x37\x69\x1e\xd6\xc0\x8a\x68\xd0\x58\x04\xbd\xfb\x3b\x94\x57\x17\xe9\x32\x0e\xd0\x8c\xd0\x13\x35\x0a\xd0\xd9\xf7\x45\xf6\xc3\x99\xba\x70\xe5\x4b\xff\x02\xe1\x9c\xfb\x69\x3e\x23\x71\xfc\x65\x5f\x96\x1f\x62\x30\x3d\xbc\xee\xd1\x75\x1d\x32\x1f\x3d\xca\xd2\x2b\x74\x15\xc5\x31\xca\x2f\x70\x40\x50\x9a\xb0\xdd\x49\x0d\x0f\xdf\xac\x6a\x2e\x14\xeb\xb4\x72\x81\x2f\xf9\x63\x52\xbe\x35\x41\xbb\x86\x9a\x45\x6d\x5a\x2b\x15\x2c\xdc\x3b\xfb\xdf\x14\x33\x5e\x16\xe9\x1c\xc3\x26\x1e\xdf\xa0\x9c\x14\x28\xb8\x49\xf0\x3c\xf2\xa1\x71\xb6\x11\x53\x60\xe6\xbd\x9d\xb2\x67\x1c\x73\x5c\x90\x2c\xc2\x31\x27\x53\xb0\xca\x02\xc3\xfb\x88\xd6\x05\x84\x53\x9a\x41\x8a\x2b\x52\xf8\x6d\xe6\xba\x6d\x7a\x51\xbf\x4c\xaf\x84\x16\xc4\x67\xdb\x9e\x52\xf0\xbc\x93\x9c\x9f\x9f\x18\x9a\x8e\x3b\xeb\x74\x56\xaa\x8e\x74\x1f\xc5\x0a\x17\x45\x98\x59\xf9\x19\x7e\x89\x4f\x72\x76\xc4\x57\x51\x70\x67\x35\xd1\x5a\x41\x89\x3a\xc8\x63\x27\x63\x07\x79\x82\x02\x8f\x59\x4f\xe9\x50\x16\x3c\x8f\x3c\x1f\xf7\x5e\xc1\x72\x3c\xdf\x49\xa7\xa4\x4d\x19\x3d\x54\x56\xab\x43\x14\xbc\xd2\x37\x31\xbe\x61\xe4\x3d\x7a\xc4\xfe\x80\xc2\xd5\xf7\x79\x17\xba\x90\xc7\x29\xb7\x10\xb2\xe2\xcd\x50\xb2\xd9\x56\x18\xe1\xf7\x66\xa8\x24\x6b\x28\x6c\xa2\xa8\xdd\xd1\x97\xc0\x5d\xb5\x6d\x96\xdf\xde\x96\x35\x6e\x7c\x2d\x7f\x7a\x95\x5b\xe7\x1e\x9d\x41\x1a\x59\x77\xae\x3f\xbd\x1f\x67\xa0\x35\xd2\xab\x8f\x33\xab\x42\xa3\xe3\xc8\x9e\xce\x2f\x41\x82\xfc\x6c\xaa\xe0\x6d\x2b\x47\xf5\xf3\xe4\x4b\x93\xf0\x9a\x8e\x81\x38\x46\xeb\xf5\xc2\x8d\x50\xc9\x83\x78\x2d\x2d\xb3\xd8\x5e\x1d\x6a\x66\xbe\x24\x41\xbb\x6c\xae\x38\x59\x64\x84\xd3\xcb\x58\x2c\x3d\x89\xd2\xff\xac\x41\xf4\x5e\xa6\x57\xca\xd1\xe7\x65\x7a\xb5\x23\x3d\xf6\xe0\x41\x8f\xfd\xa0\xc7\xbe\x8b\x1e\xbb\x22\xcc\x11\xf3\x1d\x78\x8a\x73\xf2\xe0\x3e\x54\xab\x88\x86\x8a\x6a\xb4\xaa\xf8\x74\xe2\x80\xad\x6b\x44\x41\xc9\x8a\xf0\x20\xf9\xa7\xf4\x2a\xb9\xc2\x59\x50\xd5\x97\xc9\xd0\x0d\x5f\xd7\x96\x01\x78\xdf\x94\xeb\x7f\x72\xcd\xf5\x32\xcb\x41\x75\xbd\x48\x61\x28\x1d\xaa\xeb\x28\x89\xa3\x84\x74\x0d\xff\xa7\xff\x2e\xf3\x22\x0a\x6f\x9e\x31\x3d\x2e\xf7\x8e\xea\xe6\x05\xce\x94\xf2\x9b\x16\xfd\x24\x7c\x91\x1d\xca\x71\x97\x0f\x55\xa7\x4e\xb5\x5c\x1d\x52\x69\x91\x45\x73\x11\x0f\x5f\x53\x8e\x3b\x15\xea\x8d\xb1\xe8\x0a\x69\xec\x17\xd1\x25\x29\x29\xfc\xab\x91\x28\x12\xd0\x5f\x22\x3f\x4d\x4c\x9d\xfe\x02\xfb\x51\x71\x33\x95\x1e\xdd\x46\x5b\x14\xbc\xac\x89\x1f\x1c\x98\xe1\xa2\x78\xc4\xab\xb1\x2b\x88\x94\x2c\x94\x0d\xc9\xb0\x54\x45\x86\x13\xe1\xed\xc6\x53\x11\xc8\x92\x9c\x5f\x5e\x5b\x6f\x3c\x5e\x11\xde\xd8\xd1\xef\x61\x9a\xcd\xbd\xb7\x1d\xad\x0f\xc1\x32\xc3\x55\x68\xc4\xb7\x5e\x7e\x91\x66\x05\xc9\x44\x2f\xa5\x6b\xfe\x32\x27\xd9\x2b\xfe\xea\x88\xd9\x35\xac\xd0\x5f\x03\xc3\xee\x10\x90\xdc\x57\x23\x22\x09\x9a\x22\x2f\x4b\x0b\x4a\x70\x3f\x20\xe7\x6d\x33\x48\xd7\x8a\x1a\x83\x23\xbd\xce\x46\xc6\x82\x9f\x94\x9f\x7d\xe5\x05\x22\x21\x2f\xc2\xd6\x1b\x0f\xe7\x3e\xf8\x11\x91\xdc\x67\xde\x43\x77\xb5\x13\x58\xca\x4a\xf0\x69\xb7\x14\x95\x8c\x65\x61\x37\x88\x92\x73\xd4\xca\xa5\x69\x01\x62\x6c\x08\x95\x74\x4e\x67\x28\xa0\x0c\xbd\x9c\x27\x6d\xa5\xcd\x14\x1c\xdf\x58\x7f\x0a\x61\xc6\x44\xfa\x88\x9c\xd1\x85\x33\xa9\x40\x9d\x81\xc6\x9e\x24\x01\x09\x4c\x95\xe7\x83\xfd\xe2\x3e\xda\x2f\x78\xa4\x1d\xca\x1d\x48\x3e\x28\xd1\x5d\x0a\xe5\xbe\xbe\x16\xeb\x1b\xea\xef\x27\x68\xc6\x42\xe1\x32\xd5\x36\x63\xe2\xca\xa0\x24\x60\xec\x82\xcf\x8c\x57\x81\x36\xa6\x80\x2f\xe9\xb6\x5f\xa5\x59\x01\xfc\x68\x7b\x2e\xf2\x45\x21\xb4\xc3\xec\xe7\x76\xbd\x16\x57\x6a\xb8\xb5\xf7\x39\xd2\xa3\x91\x97\xdc\x55\x4b\xcd\xfa\x53\xe7\xca\xa8\xeb\xab\x65\xb3\x22\x88\xfe\xee\x1d\x1a\xf9\x80\xf3\x79\x70\x2b\x56\x29\x15\xf4\x0c\x7c\xb6\x16\x25\xb4\xc6\x1a\x94\xbc\x91\x9d\x7f\xdb\x41\xdf\x7c\x23\x7f\xb5\xd7\x55\xee\xea\xe2\xb2\xf9\x64\x6c\x2d\x3d\x6f\xc7\x50\x15\xe4\xec\x99\x3d\xf7\x63\x7b\x19\x2d\x16\xb1\x8c\x8d\xe4\xd6\x07\xb3\x5f\x2b\x22\x07\xfd\xff\xec\xfd\x7b\x73\x1b\x37\xb2\x00\x8a\xff\x6d\x55\xed\x77\x80\xf3\xdb\x9f\x49\xc6\x24\xf5\x70\xec\x64\xa5\xd5\xfa\xc8\xb6\xbc\xd6\x3d\xb6\xe5\x92\x94\x64\xf7\xfa\xa8\x22\x90\x04\xc5\x59\x0f\x07\x3c\x33\x43\x51\x8a\xad\xef\x7e\x0b\xdd\x78\x34\x30\x18\x3e\x24\xd9\x71\x4e\x92\xaa\x5d\x8b\x03\xa0\xf1\x6a\x34\x1a\xfd\xf4\x19\x6e\x1a\x88\x89\x0c\xc9\x5f\x7a\x30\x49\x27\x92\x66\x7b\xb2\x6e\x2d\x6f\x5e\xe2\x82\x09\xa5\x93\x37\x91\x50\xdf\x94\x52\xdd\xc4\xb6\xd4\x1e\xbf\x3b\x90\x56\xfd\x01\x0d\x4b\xbf\x62\x51\xac\x23\x95\xf5\x23\x8c\xa2\x51\x4c\x9c\xe8\xce\x50\x44\xa8\x68\x8e\x85\x15\x21\x12\x04\x46\xa0\x77\x27\x02\xb4\x03\x71\x82\x40\xfb\xe9\x33\x89\x03\xb7\xbe\xae\xac\x1c\x9f\xd3\x48\x72\x9a\xd7\xc9\x05\xb6\x7e\xf0\x6a\xcd\xb5\x8d\x9c\xe6\x4e\xc0\x72\x7c\x71\x7e\xd0\xaf\x7d\x6f\x6c\x3d\x0e\x2b\xce\x0d\xad\x8f\x55\xbe\x88\x34\x45\xf3\x7b\x9a\x3d\x65\x1d\x06\xfd\x64\x3c\xf5\xcc\x5a\x74\x70\x39\x7d\x45\x2c\x88\x09\x32\xe1\xe5\x08\x82\x82\x0c\x14\x3e\x6f\x6d\xb0\xcd\xad\xb4\xb3\xd9\xfd\x6e\x13\xfe\xef\xf5\xe6\x23\xb6\xf9\xa4\xbb\xf9\xfd\x4f\xdf\x8d\x3a\x5b\x17\x9b\x5b\xdd\xcd\xef\xd3\xce\xe3\xee\xe3\x1f\xd4\xff\xfd\xed\xf5\x77\xaa\xfa\x0f\xec\x07\xf6\x43\xe7\x87\x5f\x1b\x2e\xde\x60\x28\xc1\xb2\x2b\xe3\x15\x50\xa6\x72\x05\x46\xc1\x6c\x8a\xcf\x25\x90\x40\x4e\x6a\xe6\xfa\xb6\xdd\x59\x5b\x0b\xc7\x82\xf1\xc2\x14\xba\xb8\x93\x1d\x0a\xc6\xbc\xdf\xdd\xf1\x34\xd1\xec\x53\x43\xf7\xdd\x88\x52\x0e\xaf\x55\xc5\xcf\xf7\xf1\xa3\xaf\xf1\xc8\x9e\xf0\x5e\xad\xb8\xf4\x31\x08\xdd\x17\x74\xd4\xd0\xf3\x6f\x60\x2f\x22\x9b\x8e\x45\x8e\xda\x17\x70\x8f\x5e\x63\xec\x5c\x94\x7e\xa6\x31\x1b\x91\xcb\xec\x7a\x7d\x5a\x89\xa2\x65\x16\x18\x43\xb6\x79\x23\xaf\x1b\xf8\x93\xad\x65\x06\x7e\xc2\x7b\x9f\x69\xd0\xb1\x31\x7f\x09\xe2\x40\xb1\xed\xbb\x3f\xf5\x45\xff\x47\xb2\x3c\x25\xc5\x5b\x5e\x7b\x57\x7d\xff\xc8\xaf\x37\xef\xaa\x82\x0a\x7f\x26\x8f\xfa\x33\x79\xd4\xdd\x24\x8f\xfa\xf2\x4a\xd5\xcf\x93\xae\x8a\xe7\x59\x92\x9d\xd7\x81\xfd\x2e\xac\x38\x57\x63\x88\x55\xbe\xa8\xda\x13\x66\xb3\x7f\x21\xb2\xf2\x75\x52\x94\x22\x13\x75\x49\x97\xbe\x7b\x34\xa7\xcd\xc2\xf5\xf2\x6a\x93\x3d\xed\xc9\x69\xd6\xaf\x63\xd0\x1f\x6f\x55\x6a\xce\xeb\xc8\xd4\xf1\xc7\x79\xdc\xcf\x65\x9a\xf6\x78\x7e\x9c\xfc\x5a\xd7\xd1\x93\xc7\x8f\xe7\x34\x5a\x38\x39\xaf\xb6\x05\x84\x89\x9a\x93\x5f\x05\x16\xcf\xc9\x01\xf5\xe4\xb1\x43\xf3\x02\x2a\xd7\x56\xfc\x21\xa8\x38\x6f\x6c\x58\xe3\x8b\x2a\xb8\x4f\x78\xef\x20\x1b\x24\x7d\x5e\xca\x3a\x3c\x7a\xb4\xf9\x28\x5a\x7d\x41\x82\x30\x5b\x8f\x36\xc6\x95\x9d\x9b\xc9\xed\xc9\x93\xcd\xba\x16\x0b\x7a\xa4\x55\xbf\x36\x6d\xb7\x35\xc0\x98\xe3\x4c\xa6\x43\xfc\x7f\xcd\x0e\x60\x4b\xc2\xb3\x7b\x0f\xd8\x36\x07\xaf\x96\x1d\x60\x00\xf0\xb7\xd0\xf8\xcb\x0b\x91\x0f\x53\x39\xdb\x66\x8d\x51\x32\x18\x88\xcc\xea\x5e\x49\x8e\x2a\xe7\x94\xf6\xb3\xe8\x7d\x48\xca\x43\xdd\x08\x51\x13\x32\x61\x35\x4a\x39\xed\x8f\x1a\x6c\x7d\x9d\xed\x0d\x06\x2c\x39\x3c\x66\x63\xa9\x9e\xbb\xd3\x31\x2b\x4c\xb5\xae\xe7\x64\x96\x8a\xcb\xe7\x32\x2b\x79\x92\x51\x37\xb2\x20\xc4\x8a\xe7\x07\x66\xe0\x44\x9a\x2d\x17\xb5\x45\x1b\x2f\xf4\x52\xd9\xff\xe0\x59\x26\xe8\x64\x5a\x7c\x5a\x4a\xa7\x7c\x1e\x25\xa5\x38\x9e\xf0\x3e\xba\xdb\xcd\x72\x3e\xf1\x86\x33\x4c\x2e\xa9\x4f\x9a\x59\xc9\x7f\x55\x97\x52\xab\xb1\x1b\x95\x5c\x5d\x38\x23\x3f\xab\x34\x85\x83\xe5\x7e\x7a\x2f\x30\x8d\xa0\x1d\x57\xac\x2f\xfc\x08\x34\xf0\x0f\xaa\xd6\xf6\xa6\xa5\xdc\x5e\x42\x2b\x82\x3a\xfc\x5e\x2e\xf8\x07\x30\x04\x29\xba\x03\x39\xcb\x9a\x8d\x62\xdc\x68\xb5\x23\x3b\xe5\x7c\x11\xef\x32\x66\xcd\xc9\x48\xb0\xe7\xc7\xc7\x28\xe8\x07\x61\xa5\xc9\x90\xa1\x2f\x27\xad\x2f\xd4\xee\x2e\x44\x5b\xda\xd3\xa1\xf6\x6e\x19\x4a\x45\x3b\xfe\x14\x56\x65\x6d\xd6\xbe\x6b\x06\x98\x14\x20\xb1\x51\x4b\xc8\x92\x02\x04\x59\xa0\xd2\x1e\xca\x9c\xa5\x3c\x3f\x17\xec\x22\x11\x5e\xd2\x20\xbb\x7b\x4b\x6b\xd2\xd1\x81\x0c\xf6\xd6\x66\x3e\x89\xb8\x7f\xfd\xa9\x2d\xff\x1a\xb4\xe5\xb5\xd8\x73\x9e\xcb\x99\x75\xe8\x4b\x53\xb4\x87\xb8\xe0\x09\x1c\x7e\xcc\xef\xb7\x14\x56\x15\x63\xd5\x1a\xb0\xaa\xcd\xd2\xe4\x03\xf8\xba\x8d\x65\x2f\x49\x49\x8a\x9a\xe1\x34\x4d\x7f\x46\x9a\xb3\x12\x9a\xc5\x4f\x5b\x62\x39\x29\x7d\xd2\x5c\x47\xb6\xe8\x66\x67\xed\x85\x28\x45\x3e\x4e\x32\x9d\x07\x07\xcc\xa8\x2a\xbd\xc6\x7a\x43\x7b\xab\x79\xaa\x17\x85\x5e\xcd\xf7\x8b\x94\x33\xfd\x3e\x26\x8d\x5f\xa8\xc6\xd1\x76\x5c\xf3\xaa\xe2\x04\x4f\x97\xcc\x16\x05\xa2\x22\x9d\x64\x49\x63\xae\xc6\xc3\x09\xcf\xf9\x98\x7d\x44\x1c\xbd\xd6\x59\xa2\x4e\x6c\xbe\xa8\x42\x4e\xf3\xbe\xdd\x9b\xbe\x06\xef\xb7\xc5\x9c\x3e\xd7\xba\x93\x9f\x85\xe1\xf2\x14\x02\xea\xb5\x25\x69\x94\x14\xe5\x58\x0b\x33\x37\xdd\x30\x5d\x53\x3e\x55\xd0\x2f\xe4\x07\x51\xb8\xeb\xda\x60\x73\x22\x0a\x08\xee\xc5\xd3\x54\xce\x00\x9b\x47\x32\x4f\x7e\x55\x97\x39\x38\x3b\x9a\xfa\x08\xab\xa9\xb0\x7d\x96\x4c\xd4\x4b\xd4\x1c\x26\xd6\xe3\x04\x1f\xe8\xed\xb9\x34\x9e\x5b\x9c\x63\x3d\x31\xe2\x17\x09\x62\x9c\x77\xa3\x14\x7a\x9b\xd4\xe1\xe5\xb9\x00\x2f\xcc\x52\xea\x3a\x08\xe5\x4c\x71\x0a\x67\x78\xb4\x65\x96\x5e\xb1\x49\x2e\x0a\xb5\x3d\xea\xea\x84\x23\x29\x06\xc9\x74\x0c\xd3\x85\x8b\x20\x87\x33\x0b\x2c\x9b\x86\x20\x33\xdd\x9e\xa7\x33\x7e\x55\x78\x10\x4c\x95\xe1\x50\xd7\xc9\xc4\x85\xc8\xab\x55\xdc\x2a\xe0\xfb\x60\x0e\xc9\x33\x28\x0f\x1c\x0e\x6b\x80\xee\xb2\x21\x87\xc3\x46\x88\xb1\x11\x87\xe5\x52\xea\x24\x14\xd5\xdb\x97\x50\xdd\xe0\xad\xb2\xea\x4d\x14\xbc\x25\x6e\x78\x25\xf9\x50\xee\xe6\x6e\xf2\x60\xb6\x96\x27\x61\x67\x27\xbc\x47\x1c\xf2\x4b\x71\x59\x2e\x41\xb9\x1c\x5d\x6a\x33\x4b\x77\xda\xce\x60\x36\xdc\xaf\x9b\xe4\xea\xaa\xee\x38\x92\x0a\x3f\xb3\x1a\x38\x20\x6b\x0f\x5a\x32\x17\x75\xc9\x5d\xc9\x29\x1b\xc8\xac\x51\xb2\x19\x87\x24\x76\x61\xd5\x36\x54\xe9\xf3\x0c\x4f\x8f\x77\xa7\x95\x92\x9d\x81\x42\x9b\x2c\x4e\x98\xf4\x04\x7e\x1b\x53\x26\xf5\x4f\x60\x16\xa3\x7e\x1a\x55\x46\x32\x64\xcd\xfb\x5a\x58\x3f\x31\x32\xdb\xee\x88\x17\x87\xb3\xcc\x70\xb8\xa8\xa1\x0e\xe0\xb5\x5c\x1c\xf7\x72\xa4\x2e\xe8\x4c\xcc\xd8\x7e\x9e\xcb\xbc\xd9\x00\xb3\xae\xb3\x06\x7b\x68\x6b\xb3\x87\xac\x71\xc6\x46\xbc\x00\xc4\x66\xff\xd3\xe0\xd9\xd5\xff\x34\xda\xea\x20\xb0\x19\x2f\x58\x26\x4b\x55\xf7\x22\x19\xe0\x91\x39\xc3\x70\xbe\x64\xc0\x00\xa1\xcb\xde\xa9\x1b\xd6\xaa\x02\xc0\xa3\x3f\xbb\xd2\x56\x5e\x30\xef\x6e\x83\xc6\x59\x5e\x31\x92\xc4\x09\xef\x15\x6f\x44\xc9\xad\x23\x67\x02\xe9\x7a\xe6\x71\x03\xd1\xb4\xab\x85\x15\x17\xdd\xb4\xdd\x5b\x23\x79\xaa\x67\x77\xe7\x40\x58\x79\xc8\x6b\x90\xeb\xf9\x39\xcc\xf7\x48\xf4\xcb\x35\xc6\xd2\x95\x47\x9f\xe3\x8b\x77\xd9\x26\xf6\xa1\xa3\x35\x90\xb7\xc8\x7c\x56\x2c\x93\xee\xac\xf8\x9c\x39\xce\x8a\x3f\x4a\x62\xb3\x62\xc5\x6c\x66\xc5\x8d\x53\x98\x15\x25\x2f\x85\x3e\x89\x40\xaa\x3c\x89\x0f\xf5\x02\x40\x54\xdd\x70\x31\xc4\xb5\xd0\xc0\xa6\x18\xb7\x41\x0d\xe0\x74\x88\x2a\x04\xb4\xf9\x7f\x26\xcb\x52\x8e\x63\xed\x46\x98\x6e\x10\xef\x68\x62\x52\x64\x0a\xc1\x87\x20\x5a\x3a\x96\xd3\xcc\x79\x32\x6a\xb9\x82\x9e\xe1\xb9\x28\x9f\xcb\x6c\x00\xc2\x17\x9e\x6a\x1b\x07\xff\x28\x04\x99\xab\x54\xb3\xbf\x9a\xf4\x55\xbf\x2c\xcc\x5f\xe5\xaa\xc7\x92\x58\x05\x4f\xfd\xa0\x41\x50\x4a\x1b\x3a\xe6\x31\x68\xe3\x0a\xaa\xd5\x35\x97\x15\x6d\xa1\xcb\x68\xa3\x80\x23\xd2\x96\xc2\xb4\x69\x50\x23\x9a\xd0\x89\x54\x87\x6f\x3b\x7e\x76\xa3\xd8\xda\x7f\xbc\x36\x29\x3d\x22\xe5\x7a\xbc\x5a\x4f\x40\xd4\x2d\x64\x49\x9e\x2e\x32\x1e\x8d\xa8\x27\x88\x05\xa9\x9d\x86\xcc\x5e\x4b\xae\xc8\x3f\x49\x86\xe0\xb5\xc2\xd7\x46\x9b\x34\xb0\xef\x8f\xf9\x4d\x0c\x7a\xb7\xd8\x36\xa4\xb9\xf4\x56\x45\xa1\xf3\x71\xb0\x63\x64\x76\x0f\x1e\xb0\x66\xb0\xa1\x8a\xdd\x04\xde\x58\x11\x84\x48\x99\xcc\x1a\x2d\xdb\x45\xfd\xa2\x62\x1b\xad\x63\xa9\x8e\x62\xd1\xb2\x46\x10\xc6\xf3\xb2\x71\xc6\x7f\xf3\x92\x3b\xe8\xa4\xf8\x6c\x9b\x35\x14\x55\x69\x78\xab\x8b\xb9\x29\xe8\xe2\x3a\xa2\x10\x24\xa7\xb8\x48\x80\xb4\x6e\x53\x5a\xd6\xf5\xc9\x08\x49\x79\xe0\x24\x00\xf5\xe6\xd9\xcb\x9b\x86\x3b\x81\x65\x3b\xb6\x1d\xb0\x55\xad\x76\x78\xfc\x5b\xb5\x58\xb1\x68\xcb\x80\xf8\xfd\x96\x7b\x06\x3b\xa5\xb6\x0c\x37\x6f\xc1\x9e\x11\x5a\xbd\xec\xa6\x91\x26\xbf\x9b\x5d\xd3\x2c\x40\x64\xf3\x76\x2a\xb7\x10\xe1\x7b\xdd\xd5\x03\xec\x74\xdb\x6d\x82\x7f\x15\x95\xae\x89\xc9\x0d\x87\x85\xea\x45\x81\x80\x55\x15\x9a\xed\x49\x35\x53\xb0\xec\xd5\xa5\x2a\xa8\xee\x9f\xc9\x69\x36\x48\xb2\x73\xc7\x7f\x36\x49\x5e\xa5\xf5\x75\x86\x58\xc3\x38\x3c\x32\xf0\x19\x86\x39\xb5\x5d\x0b\x2d\x7c\xc3\xbb\xf1\x21\xe1\xa4\x2d\x9c\xd2\x67\xee\xdd\x36\x52\x26\xdf\x8e\x4b\xe1\xae\x1b\x24\xa9\xc4\x3c\x4e\x23\xe0\xf5\x6b\x9a\xbb\x3a\xf5\xad\x3d\x8e\x9f\xc2\x01\x14\x8a\x68\xa2\xd5\xca\xb9\x46\xee\x7b\x8b\x2c\xbf\xb7\x7d\xd1\xae\x17\x4c\x9c\x54\x0a\xdb\x23\xd7\xa5\xa0\x77\xd5\x9f\xb4\x48\xbf\x04\xa0\x2c\xc7\xb0\x5b\xfa\xbf\x6b\x97\xcf\xd3\x47\xa6\x25\x70\x49\xdd\x3d\xf8\xd6\xbe\xbf\xbb\x8b\xfc\x54\x88\x5e\xbf\x10\x9f\x21\xba\x7d\xfa\xeb\xfb\x8d\x53\xfb\xb7\x3d\x28\xba\x1b\xf3\x5d\xf3\xe9\xec\x1f\x6c\xc3\x4f\x55\xa6\x07\xaa\x20\x5b\x78\xd8\x07\x0c\xea\x44\x1e\x64\x03\x71\xf9\x1e\x7e\x9c\x9e\xd2\xbc\x60\x4b\x3b\x75\x80\xe1\xb9\x36\x32\x71\x54\xe2\x99\x94\xa9\xe0\x59\xb3\xe4\xbd\x56\x9b\x35\xde\xe8\x88\x65\x9d\x1f\x0f\xb6\x89\x3c\xd4\x3e\x9f\xe1\xed\x8c\xdf\xe0\xd5\x0d\x62\x70\x08\x82\xd8\x50\x38\xe0\xaf\xb0\x3e\x18\x7a\xf5\xd5\xf4\x9e\xaa\xff\xaf\x3b\x95\x96\xc8\xd8\xfd\x5c\xf3\xff\x35\xea\x52\x7b\xda\xb6\xed\x5f\x6d\xd3\xd1\xb6\xed\xf1\x3a\x20\x45\x25\xbe\x04\xed\xfb\xde\x7c\xa7\x0b\xac\x63\x72\x79\x14\x5d\x14\x68\x18\xa2\xa9\xad\xb6\x33\x71\x2b\x18\xe3\xa7\x11\xc0\x74\x32\xe0\xa5\x20\xca\x64\x5e\x8a\x26\x61\xac\x2d\x1d\xa2\xd5\xe9\x9d\x85\x2d\x5c\x52\xe2\xcd\x27\x4f\x82\x24\xcc\x01\x8f\x50\xc3\xde\xd7\x93\x4d\xfc\x3a\x96\x17\x42\x91\x69\x84\xd4\xec\xc4\x89\x53\x98\x2e\xb7\x3d\xf7\xe6\xbb\x9b\xa1\xdc\x64\x24\x11\xa6\xd4\x97\x00\x54\x33\x22\x5b\xce\x1b\x35\xeb\x36\x93\x71\xf0\xdd\x1e\x6b\x7d\x87\x8b\x12\x77\xc8\x4d\xa2\xf6\x11\x18\x3e\x03\x3b\x01\xe8\x2a\xd2\xc7\x13\x60\xbb\xb5\xb9\x05\x4a\x2e\x8b\x63\xfe\x66\x78\x8b\x38\x10\x69\xc9\x83\x5b\x9b\x3e\x8c\xba\xfe\xc3\x68\xa9\xfb\x7b\x3c\x4d\xcb\x64\x92\x26\xf0\xe8\x99\xc7\x94\x75\x36\xd9\x36\xdb\xdc\xf1\x1a\x67\xe2\xb2\xf4\x2d\xa9\xa2\x57\xe4\x43\x06\x23\x67\xdf\x92\xde\x3c\x76\xe0\x65\x72\x09\x72\x96\xfd\x01\xc9\x04\x08\xce\x8e\xd9\x85\xc8\xcb\xb9\x23\x53\xef\x97\xba\x0b\x75\x20\x4a\x61\x5e\x66\x20\xaf\x6e\xb6\x74\x4b\x71\x21\xf2\x42\xc4\xe6\x65\x8c\xb8\x2c\x87\xab\xee\x42\xef\x06\xd6\x83\xfa\x36\x98\x7e\xdd\x01\x41\x78\xc7\x5a\x22\x7c\x90\x95\xf2\xa7\x44\xcc\x96\x13\x0a\x6c\xd5\x4b\x05\x22\x4f\xe2\xad\x6a\xa6\x63\xbc\x36\x82\x5a\xf0\xd1\x7b\x23\x62\xb1\xcf\x38\x56\x98\x49\xc3\x40\x06\x7b\xe1\x65\x15\x2c\x83\xf6\x14\x66\xd7\x5e\x1c\xd1\xbb\x2a\x5a\x5f\xfd\xeb\x25\x29\xbe\x6f\x1a\x7c\xfa\xc4\xee\x1b\x80\x14\xa9\xf1\xc2\xaa\x70\x25\x90\xc2\x1c\x9b\xc2\x8e\xb2\xbf\xdb\xb1\xc2\x6f\x0a\x62\x7d\x1d\x78\x21\x06\x2e\xd6\x72\x68\x6c\x2b\x92\x82\xc9\x29\xd8\x1d\x5c\x24\x62\x36\xff\x20\x58\xd8\xde\x31\xf0\x47\xd0\x09\x46\xb0\x0a\x0e\xd6\xa1\x1e\x13\x69\x21\xbc\xc9\x02\xbb\xc6\xfe\xe1\xfa\x82\x0f\xc1\x74\xb1\xd2\xf2\xf3\xfd\x65\xd5\x09\x63\x07\x9d\x70\x14\xab\x4c\xf9\x97\xe5\x8e\x5b\x0d\xb5\x5d\xee\xbc\x3d\xaa\x3f\x6f\x75\x32\xb2\x47\xab\x0b\xc9\x1e\xd5\x4b\xc9\x22\xa7\xfa\xd1\x7c\x82\x0e\xc1\x39\x3d\x71\x8e\xdf\xf3\x7d\x90\xd8\x0c\x87\x8d\x0a\x6b\x0d\x5d\x68\x0e\x8d\x2c\x34\x19\x8d\xdd\x16\x7c\x2f\xec\x92\x36\xf4\x21\x11\x34\xa1\x6f\x2b\xaf\x09\x29\x20\xcc\x3a\xb1\x9c\xd5\xb8\x74\xbb\x07\x52\x48\x9e\x2a\x5d\x79\x42\x9b\x05\xb7\x9e\x37\xff\x7f\xf8\x73\x7b\xe8\x0d\x7b\xdb\xfb\xf5\x0f\x92\x5b\x9d\xf4\x4b\x18\xb6\xe5\x3a\x36\xc0\x1c\xf8\xc5\x43\x09\x1f\x42\xc1\x84\x15\x42\xd4\x0b\xb1\xc0\xf0\x32\x1c\x6a\xac\x09\x29\xf7\x9f\x55\x21\x9f\x56\x11\xb6\x07\x03\x6a\x57\x05\xee\x95\x01\x5c\xb7\xea\x5e\x28\x70\xee\xc5\x78\x62\xdc\x95\x97\xd1\x81\x10\xa5\x50\x0b\xfd\xb9\x8c\x36\x8a\x7a\x8c\x84\x0a\xa9\xf7\x38\x49\x48\x42\xed\x02\x50\xbe\x48\x06\x6f\x30\xe3\xff\x1a\x63\x55\xd5\x6d\xa5\x1e\xa1\x3d\xeb\xeb\x4c\x14\x69\x92\x95\x1d\x1d\xcd\xa0\xa3\x28\x5c\x27\x4d\x32\xc1\x40\xca\xb6\x9e\xc9\xce\x20\x19\x74\x40\xe5\xd0\x29\x44\xd9\x81\xe5\x5f\x33\xa4\xc2\x5f\x66\xab\x98\xc0\x60\x08\x76\xc5\xea\x9f\x45\x91\x57\xd1\x52\x0c\x2b\x24\x64\x65\x75\xcb\xf1\x23\xb4\x5e\x62\x3d\xb0\x62\x73\x92\x8b\x8b\x77\x46\x17\x2d\x2e\xa0\x2b\xaa\x8b\x9e\x3f\x20\xb7\x96\x27\xd6\x98\x67\x0c\x97\x0d\x84\xfb\x41\xa3\xa2\x01\xe3\x25\x9a\x6b\xf0\xb1\x60\x65\x32\x46\xfb\x30\x6c\xf7\xb3\x60\x99\xd0\xf6\x73\x23\xd1\xff\xc0\xf8\x39\x4f\xd0\x30\x09\x6f\x2d\x67\xf3\x65\x0c\x6b\xbb\xab\x2d\x2d\x65\x41\xdc\x21\xf2\xd5\x5f\x70\xc6\xec\xfc\x83\x42\x7a\xc0\xe6\xf0\x94\xcd\xf0\x4e\x9c\xb3\x51\x3f\x27\x69\xfa\x63\x36\x5e\x06\x75\x49\xd5\x66\xb0\x31\xf4\xb9\xde\xed\xf3\xac\x2f\xd2\xa6\x8f\x4b\xe1\x0b\x2a\xa8\x15\x19\x62\x6c\x3d\x6b\x86\x18\x5d\x7a\xe2\x82\xcc\x82\x57\x12\x79\x1f\xc5\x98\x64\x2c\x8e\x70\xc7\x3e\x63\x7c\x5b\xbe\x78\x05\x96\x78\x1e\x37\xac\x46\x96\xe2\x85\xb9\xb1\x13\x61\x73\x75\x54\xf1\x0a\x83\x8c\x9a\xb2\xdc\x45\xda\x99\x77\x0d\x45\xd8\x3a\x77\x03\xb3\x87\xae\x9c\xde\x46\x9d\xb0\x99\x11\x37\x46\xa0\x39\xba\x9e\x5a\x46\xb2\x96\x45\x06\x1b\x12\x33\xf2\xa8\xe0\x31\x09\xdd\x12\x42\xa5\xb2\x2f\xd9\x5c\x5f\x67\x6f\xf8\x15\xeb\x09\x36\xcb\x65\x76\xce\xa6\x59\x99\xa0\x3d\xea\x50\x66\xa5\xe2\x80\x53\xc9\x07\xda\xc8\x19\xfe\xd3\x9a\x68\xb3\xc6\x4f\xed\x78\x67\x46\xa4\x6a\x86\xe5\xed\x49\xd3\x1f\x18\xce\x46\x1d\xf9\x5a\x82\x80\x55\x3e\x7d\x0a\xa6\xa4\xfb\x99\xdf\x14\xea\xb4\x14\x02\xdc\x47\x23\x0b\xf0\x23\x75\x17\x5a\xa4\xa7\xe5\x6b\x23\xf0\x2a\x49\x72\x37\x51\xa8\xd8\x0f\x36\xe5\x7a\x31\x99\x42\x0b\xbb\x9a\x53\x8f\x85\x21\x13\xef\x82\xd2\x3f\x6a\x87\xdc\xc8\x96\x3e\xb5\xfe\xa9\x36\x6a\xf7\x38\xbf\x1f\x51\xa6\x2f\xd4\xa3\x1b\x8b\x76\x57\xd9\x7c\xa9\xd1\xe7\xd7\xaa\xf2\x8d\x40\xda\xa8\xc9\xe3\xf1\xb2\x58\x24\xf6\xd6\x2f\x35\xc1\xb7\xd4\x7f\xd6\x16\xda\xd5\xb3\x9f\x68\xbd\xaa\x29\xb3\x6b\x50\x2d\x8b\xb7\x04\xe3\xbf\x48\x2b\xf5\x9d\xb6\x30\x4a\x6e\x57\xd7\x7c\xa9\x7f\x7d\xad\x64\x9c\x70\x33\xbb\x84\xc5\x26\x09\xc6\x82\xd1\xd5\xb6\x9f\xa2\x2f\xba\x05\x97\xcf\x2f\xe4\xf6\xf1\xd6\x67\xb5\x80\x67\xbf\xd8\x88\x67\x01\x9e\x42\x88\x33\x8d\x8d\x61\x18\xb4\x30\xd1\xab\xa9\x6f\x91\x03\x6d\x2e\xc3\x8d\xf7\xbf\xaa\x89\xa3\x35\x2d\x6e\x1f\x64\xf8\xb0\x5b\xe4\x7e\xe9\x3d\x68\x60\xbc\x06\xba\xbc\x10\x53\xd3\xac\x21\xfc\x50\x8b\xa5\xfe\x80\x55\xb1\xd9\x65\xcd\x09\xbe\x49\x40\xb6\x30\xaa\x9a\x83\x66\xc4\xc8\xab\x05\x57\xab\xfa\x61\xf9\x19\x47\x1e\xad\x9a\x72\xe4\x11\x49\x12\x92\x5c\x8a\x41\x9b\xdd\x77\xab\xb8\x4a\x3a\x0f\x02\x88\x9c\x14\xe6\x01\xa3\xd5\x5b\xde\x6a\x94\xbc\x77\x50\x8a\xb1\x9d\xd5\x6a\xab\xe2\xf9\xb3\xad\x12\x05\xcf\xd2\x4b\x47\x4b\xd5\xbd\x44\x06\xdd\xda\x89\xde\xf7\x0b\xe3\xe2\xf8\x8e\xad\x31\xfb\x9c\x02\x6f\xab\xda\x6b\x35\x6a\x29\x30\x8f\x1c\xea\x50\xb8\xfe\x11\x21\xaa\x06\xca\x27\x57\x34\x62\x74\x33\xe0\x80\x9a\xa2\x8d\x4a\x89\x56\x8f\x06\xd3\x7f\x6e\xf4\x9f\x63\x3e\x69\xd2\xfb\xa4\x4d\x24\x61\xf0\x9d\xde\xe5\x20\x63\x0d\x41\x25\xc5\x4f\x3c\x4d\x06\x66\x29\xb1\x91\xff\xea\xd7\x7a\xc2\x50\x99\xe8\x73\x9d\xaa\xdd\x4f\x9a\xde\xc1\x8f\x2e\x21\x7a\x8a\xd7\x71\x13\x25\x92\x41\xb8\xc1\x7d\x9d\xac\x83\x74\x6a\x40\x05\xad\xe0\x44\xbb\x94\x47\xb4\xeb\xdd\x5d\xe6\xf3\xf8\x8c\x2e\xf0\xc3\x5d\xaa\x0d\xa8\x0b\x62\x94\xca\x4c\x78\xcb\xd1\xf6\x56\x83\x38\x1d\xcd\xbf\x60\xb7\xdd\x20\x15\x9e\xeb\xb9\x22\xf6\xe9\x07\xbd\x2a\xb0\xf5\xbd\x9b\xce\x26\x55\x08\x53\x39\x31\xcf\x78\x2c\x76\x9f\x12\xfb\xfb\xe8\xad\xa5\x79\x2e\xb7\x6c\x6e\x4f\x1d\xf7\xd6\x5a\xc2\xfa\x6e\x8e\x5d\x24\x79\xbe\x2f\x1f\x2b\x8a\xf9\x39\xba\xd9\x6d\xb3\x06\xb1\xc5\xb1\x21\x23\xa1\x15\x68\x80\xc8\x92\xe7\x10\x59\xa8\x31\x4b\xb2\x81\x9c\x35\xda\x4c\x66\xf8\x22\xde\xae\x3e\x92\x49\xa4\xe7\x15\xec\x11\x97\x1d\x2a\xd9\xc0\x60\x8d\x18\xab\x2e\x47\x48\xa7\x9d\x79\xec\xfc\xc1\x39\xbb\x3e\x8f\xd1\x5e\x76\x64\x91\xb1\x31\xef\xf0\x30\x9f\xc2\x56\xee\xe5\x76\x50\xb7\x4a\xb7\x3d\x8d\x70\x58\x3d\x17\x43\xef\x31\x31\x6c\x66\x72\x20\x5a\x95\x21\x58\xca\xa3\x45\xe4\xaa\xd6\x4e\x50\xe7\xba\x02\x5c\xaa\xa1\x40\x4e\xd3\xa4\x28\x1b\x61\xb1\xcc\x8c\x88\x33\x2a\x1c\x59\x9b\x03\x7b\x85\xf5\x8d\xae\x70\x80\x01\xf5\xf7\x7b\x65\x4e\x24\xb1\x96\xfb\xaf\xe5\xd7\x22\x8b\x1f\x23\x5b\x6b\x35\x0d\x97\xb2\x44\xb4\xf5\x8d\x6d\x1c\x95\x1d\x61\xea\x38\x4d\x3f\xd4\x4a\xee\xac\x5d\x37\x2b\x57\x21\x75\x22\x00\x9b\xf7\x48\x78\x49\xe7\x8e\x6c\xed\xbd\x29\x19\x37\xdf\x42\xc7\x4b\xeb\xa0\x14\x38\xe1\xb9\xdc\x37\x94\xeb\xdd\xd6\x86\x7f\xed\x98\x8f\x58\x25\x18\x06\x8d\x87\x47\x28\xb6\x75\x7f\x5a\xbb\xde\xb9\x61\xb8\x4b\x55\x7c\x82\xce\x51\x10\x1e\xcd\x8f\x7f\x59\x98\xa8\x97\xc5\x67\x8a\x75\xf9\xf8\x6b\x0c\x9c\xb7\x5c\x54\x9a\x27\xf1\xfa\x73\x03\x4a\xd2\x8a\x5f\x24\x6c\x49\x15\x29\x7e\x89\xdb\xa7\x57\x63\x1a\x3e\xf9\x2d\xb7\xe6\x5e\x7c\x67\xfe\x0c\x6c\xf6\x67\x60\xb3\x5b\x05\x36\xfb\x7d\xe6\xfa\xff\x4d\xe3\x80\x95\xa3\x5c\x96\xe5\x9c\xd0\x3e\x5b\x95\xaa\xf3\x7a\x32\x75\xbe\x58\xd4\x26\x1b\x0b\xe8\xe3\xda\x3d\x12\x73\x66\x72\xd9\x68\xaf\xdd\x33\xa9\x63\xdc\x17\x12\x33\x87\xf7\x0a\x99\x4e\x41\xe9\x74\xaf\x94\x93\x6d\xd6\xe8\x6c\x6e\xa8\xff\xb0\x26\x89\x12\xa4\x43\xd2\xb4\xd7\xee\x8d\x0b\x1b\x07\x08\xb9\xd1\x86\x65\xe4\x1b\xd6\x2f\x32\xbc\x60\x88\x79\xa4\xe7\x1a\x79\xaf\xce\x33\xd2\x03\xd0\x66\xbf\x78\x7c\xcd\x3d\x0b\xce\xab\x06\x72\xf2\x7b\xf7\x88\x8b\xa4\xfe\x11\x73\x90\xbc\x77\x6f\x19\xf7\xc8\xca\x7d\x76\xef\xde\x67\xf2\x92\xbc\x77\xef\xde\x7c\x17\xc9\x7b\xf7\xae\x55\xf7\x9f\xc9\x3d\xd2\x9b\xe8\x2a\x7e\x92\xfe\x0a\xdd\xd8\x61\x52\x94\x6f\x04\x2f\xa6\x79\x8d\x1f\xe1\xbd\x7b\xf7\xa8\x89\xa1\x67\x4a\x0b\xdf\x21\x9f\xba\x1c\x0e\x0b\x51\xea\x92\x0e\x2d\x41\x9d\x9d\x31\xb3\xad\x42\xf3\x4c\x78\x28\x30\xa3\xe6\xab\xc0\xd2\xb6\x3d\xf7\xee\xcd\x35\xe8\xb6\xf4\xa2\xce\x7a\xf6\x1e\xa2\x28\x55\x0d\x10\xfb\x56\xf3\x59\xf1\x17\xba\xe6\x24\x17\x17\xc1\xdc\x2b\x66\xc4\xa4\xaa\x3f\x31\x7f\xbe\x74\x21\xfc\xf5\x6f\xb6\xa0\x2c\x19\xb2\x26\xe9\x8f\xd8\xc6\x04\xbb\xf0\xe9\x13\xe9\x2c\x52\x0d\xcd\xaa\x71\xba\xf7\xcc\xa4\x9a\x1f\x43\xc3\xe8\xed\x38\xf8\x36\xf3\x01\x55\xaa\x61\xbf\xd7\x38\xe8\x6b\xdc\x13\x63\x68\x7c\x2b\x83\x19\x38\x72\x73\xcc\x65\x02\x2a\xf5\x5e\x4d\xb0\xde\x6a\xe6\xde\xbd\xe5\x6c\x66\x2c\x4e\xbc\x96\x7c\xe0\x69\xed\xba\xf8\x4d\xa3\x83\xda\x1e\xfc\x60\x96\x76\xce\x5e\xde\xc3\x9a\xb1\x45\x5f\x6e\xcd\x17\x2d\xf9\xda\x3d\xd0\x6c\x56\x16\xc0\x37\xbf\x98\xb3\x06\xa1\xf1\x85\x99\x4f\x8d\xe5\x45\xb5\x4b\xab\x4a\xbd\x77\x6f\x7d\x9d\x3d\x97\x79\x2e\x8a\x89\xcc\x06\x05\x2b\x25\xdb\xdc\x60\xc3\x1c\x82\x99\xf2\x92\x3d\xd9\x60\xaf\x7e\xed\xae\x45\x46\x43\x34\xae\xf7\xcc\xed\xe1\xab\x55\xab\x27\xb6\xfe\xc0\x2e\x27\xec\x53\xbb\xa3\xc5\x18\xea\xcf\x6c\x9a\xa6\x6d\xef\xa4\x2c\xe9\x97\x7b\x77\x82\x3b\xed\x2b\x83\xa3\x58\x10\x84\x1f\x06\xae\xf1\xef\x9e\x16\x50\xe9\xd7\x37\x7e\xab\x97\x42\x41\xf1\x3d\x2d\x7b\xca\x30\xf6\x23\xca\x9e\xa0\xe0\x1a\xfe\xb9\x6e\xa9\x7f\xec\x86\x9f\xaa\xbf\xf4\xba\x7a\xc7\xcf\x49\x43\x7c\x21\x88\x7f\xb3\x55\xa4\x21\xf7\x8c\xaf\xb2\x9e\xb0\x13\x26\xab\x0f\x71\xb1\x43\xd0\x6f\xf8\xae\xfc\xfe\x0e\xdf\x95\x7f\x59\xf1\x5d\x49\x1f\xfc\xea\x78\xfe\x65\x6d\x7d\x9d\x3d\x83\xd4\x5a\x32\x63\xa3\xb2\x9c\x14\xdb\xeb\xeb\xe7\x49\x39\x9a\xf6\xba\x7d\x39\x5e\x87\x15\xeb\xf4\xa4\x2c\x8b\x32\xe7\x93\xf5\x81\x1c\x77\x46\x22\x9d\x88\xbc\x58\xef\xa5\xb2\xb7\x3e\xe6\x45\x29\xf2\xf5\x22\xef\xaf\x4f\xcb\x24\x5d\x4f\xb2\x17\x87\x6f\xba\xff\x29\xfe\xb2\x86\x5a\xa9\x17\x87\x6f\xd8\x2e\xbb\x7f\xbf\xa9\xe3\xfe\x20\x8a\xa1\x31\xae\xf5\x86\x02\xe7\x05\x2c\xe9\x0e\x64\x1f\x38\x9b\xc8\x27\x1f\xb7\xd4\xe8\x41\xdc\xce\xfb\x23\x31\x50\x0f\x86\x9d\xbf\x10\x8e\xba\x10\xc4\xdf\x01\x7a\x6f\xb1\x8f\x7f\x01\x79\x99\x6b\xa1\x8e\x27\x36\xbc\xfe\x8b\xdd\x49\xbf\xa9\xba\x1d\xbd\x0f\xc1\xa2\x95\x23\xc1\xfe\xf3\xbf\x53\x91\x5f\xb1\x09\x84\x61\x89\x2d\xa3\x2c\x47\xb9\x10\xeb\x58\xaf\x9b\x97\xa9\xf6\xc0\xe9\xa8\xde\xc9\xa8\x43\x3f\x8d\xa6\x1d\xb3\xa2\xe6\x6e\xdc\xf6\x33\x23\xfe\xb0\x74\x1d\x40\x2c\xe8\x5a\xde\xc7\x8d\xf8\xf4\x89\xdd\x0f\xd7\xb4\x27\x07\x57\x31\x70\x8d\x24\x1b\xe8\x30\x46\xbc\x14\x0d\x1f\xa6\x5a\xf7\xc1\x74\x3c\x56\x4c\xeb\xdc\x4d\x42\x02\xd0\xd2\xad\xa1\x49\x17\x73\xfc\x81\x56\xae\x19\xb4\x3a\x11\x97\xe5\x5b\x39\x10\xcd\xc6\xde\xb3\xe7\x2f\x1a\x2d\xbf\xe1\x20\x51\xef\x3e\xb0\xc8\xf2\xbe\x03\x3d\xe9\x0e\x65\x56\xea\xf7\x44\x63\xf3\xbb\xc9\x65\xac\xce\x4c\xf3\x3b\x8d\x9a\xf2\x91\x61\x9d\x1a\x9b\xf1\x0a\xe6\x75\xa4\xaa\xd8\xe7\x51\xa4\x5e\x09\xc6\x13\xf8\x5e\x8a\x43\x32\xaf\x27\x55\x4d\x3f\x9f\x4c\x2d\xba\x35\xfe\x6a\xa9\xf6\x66\x4d\x3c\x2c\xb6\x8e\x3c\x3b\x6e\xd3\x75\x6f\x9e\xf9\xb4\xb7\xd3\x3e\x04\x93\xec\xc2\xdf\x69\x70\xa3\x20\x6d\x2a\x40\x77\xd9\xe6\xce\x5f\x3c\xad\x69\xb5\xca\xee\x6e\xd0\x73\xb5\xf7\x4c\x9c\x63\x7c\x56\x02\xec\xda\x1b\x89\xbf\x2c\xb9\x18\xcb\x0b\x11\x59\x96\xd8\x69\x20\x87\x3b\x3c\x61\x6c\xb7\x72\xe8\x6a\xa8\x62\x51\xf2\xfe\x07\xb3\x6b\x70\xaa\xf9\xfa\xd6\x77\x8f\xfe\xf6\xdd\xa3\xef\x9f\x90\x23\x5c\x63\x9a\xdf\xd4\x61\x12\x7d\xb7\x73\x77\x9a\xbc\x15\x35\x21\x15\x89\x75\x20\xd6\x5c\x5f\x67\xef\x44\x3e\x94\xf9\xd8\x04\xfa\xeb\x4f\x53\xc8\xa3\x5a\x60\xc4\x39\x88\x51\xe7\x2c\x18\x93\x82\xe5\x25\x44\xcb\xe4\xe0\x1d\x3b\x16\x45\x91\x64\xe7\x6c\x3a\xc1\x9c\xa0\x65\xce\x7a\x1c\x03\xde\x11\xbc\xb1\xcd\xef\x1b\x03\xc8\x18\x81\xa8\x0c\x8e\xd0\x86\x32\xbe\xb2\xcd\x16\x41\xcf\xd2\x46\x74\xf3\x29\x4d\xac\xaf\xb7\x18\x62\xe9\x2d\x7f\xeb\xf7\x55\xcc\x92\xb2\x3f\x62\x3e\x79\x47\xe4\x2a\x04\x41\xaa\x6d\x1f\xf5\x34\x54\x7f\x99\xcd\x5b\xce\x7c\xf5\xdd\x0a\x2a\xb3\x75\xbd\x98\xa3\x77\xdb\x4e\x3a\xb5\x4b\x1a\x5b\x71\x82\xd3\x35\x28\xc7\x76\xeb\x90\x91\x5e\x94\xc5\x22\x7c\x75\xbd\xc6\x70\xf7\xab\xc0\xc8\xea\x79\xb1\xa1\x5d\x82\x1d\xd3\x4e\x71\x9f\x1b\x61\xef\x04\x4b\xa3\xb3\x8a\x23\x4e\x0c\xc9\x6a\x70\x56\xfd\x07\x41\x9c\x97\xc5\xe3\xb9\xc3\xb8\x11\x56\xd7\x0d\xc3\x08\x30\x97\xe8\x7f\x29\x98\xd7\xde\x29\xa9\x41\x74\x05\xac\xf6\x94\x54\x98\xf7\x1f\x6e\xc5\xbc\x43\x9c\x10\x5e\xa7\xb7\x79\xf2\xf8\x6f\x2d\x22\x13\xd6\x11\x35\xc1\x8c\xbf\xcd\xec\x71\x2c\x65\x9b\xc9\x09\x1c\xb0\xb6\x8d\xf4\xea\xb2\xd7\x42\x7e\x75\xb6\xcb\x1e\x66\x62\xc6\x5e\xa0\x93\x8c\xfa\x3e\xcc\xe5\xd8\xed\xdb\x7b\x05\xf4\xd4\xa4\x73\x85\x47\x73\x0a\xe6\x41\x18\xcb\x4b\x17\x08\x85\x16\xbb\x2c\xc9\x0e\xa7\xe5\x71\x92\x19\x50\x26\x75\x37\xdb\x65\x8f\x1e\x6f\xa8\xca\xe6\x74\xc8\xa1\x19\x5a\x10\xaa\xd3\x18\x15\x98\xf1\xb2\x5d\x53\x71\x0d\xd5\xd7\xc8\x66\x40\x1d\x0b\xc1\xfe\xf5\xe9\x13\xfb\x88\x16\xd2\x7a\x44\xba\xa0\x0b\x3f\x3f\x7d\x82\xcf\x9a\xc1\xb2\x43\x33\x75\xec\xa7\x4f\x9f\x6c\x71\x38\x16\xfb\xe7\xa7\x4f\xbe\x64\xf1\xda\x38\x45\xa9\x19\xe2\x12\xee\xee\xb2\x52\x06\xf9\xb2\x4c\x7b\x63\x7d\x40\x22\x46\x6a\x3e\x98\xf1\x34\x17\x7c\x70\x05\xfe\x37\xf0\xdc\x36\xfb\x6b\x38\xca\x86\xb5\x07\x08\xf7\x08\xf5\xfd\xd7\x5e\xd4\x3f\xdc\x33\xe7\xc0\x49\xf7\x10\x74\x86\x61\x03\x9e\x25\x63\x5e\x0a\xd6\x2c\x93\xb1\x28\x4a\x3e\x9e\xd0\x40\x99\xb6\xb9\xb3\xfe\xa8\x99\x9a\x37\x39\xed\x94\x66\x5b\x37\x88\x4d\x43\x75\x16\xc6\x6e\xe1\xda\x05\x27\xcc\x80\xff\xa5\xb8\xaa\xc9\x71\x02\xf6\x95\x6f\x78\x39\xea\x8e\x93\xac\xb9\xd9\x66\xcd\xa6\xaa\xdc\x41\x04\x6f\xb1\x75\xbb\x99\xad\x96\x6d\x26\x80\x67\xdb\x85\x7f\x61\xa2\xad\xb5\xb5\xca\x58\xd8\x2e\x6b\x62\xc5\x6f\x59\xb3\x94\xac\x03\x67\xa3\xd5\x62\x0f\xe1\x0f\x6c\x01\x03\xf8\x3b\xdb\x64\x4f\xd5\x81\x6d\xea\xd5\x6b\xb1\x6d\xf8\x19\x73\xa0\xb5\x0b\x05\x92\x02\xbf\x4b\x3d\x6f\xbb\x8d\x14\x24\x49\x25\x8c\xeb\xb8\x76\x4d\x88\x80\x3d\x7b\xac\x99\x79\x69\x1b\xba\x8f\xd5\xf0\x37\x59\x07\x17\xa9\x2f\x8b\x26\xfc\xf1\xee\x80\x7d\xcb\xd4\x9a\x5c\xaf\xad\x21\x5d\xea\x6a\xb2\xa4\xad\x3b\x40\x91\xe3\x26\xb0\x0c\x5d\x09\x18\x90\xa6\x7e\xaf\x9c\xc8\x49\x63\x21\x61\x5a\xd3\xf6\x3b\xe8\x74\x72\x27\xfd\xbe\x86\xf0\x65\xcb\x74\xac\x16\x21\xa4\xe0\x7f\xbb\x35\x05\x3f\x4f\x65\x8f\xd7\x66\xc1\x79\xb2\xd1\xb2\xd9\x2c\xcf\xd4\x77\x51\x94\x7b\xb0\xd7\x89\xcc\x5e\xe6\x7c\x2c\x9a\xad\x33\xc8\x64\x89\xd7\x01\xd6\x50\xbc\x1a\x80\xed\x46\x9b\xac\x31\x45\x9a\x74\x8d\x19\xa4\xdb\x38\x5a\x58\x6f\x2c\x7f\x9d\x53\x69\x68\x82\x84\xaf\x19\x65\x80\x77\x12\xed\x4e\x99\x7a\xac\x39\xcc\xdc\x35\xd3\x9f\xe6\x79\xe4\x96\x19\x17\xf6\xd4\xf2\xcb\xe6\x46\x9b\x6d\x3e\x61\x1d\xd6\x84\xda\x1d\xe8\x04\x4e\xab\x9e\x38\x5e\xbd\x27\xc9\x58\xc8\x69\xd9\x1c\x66\x6d\x36\x2e\x5a\x0e\xc5\xf5\x98\x54\xe3\xb6\xaa\xbe\xe6\xd2\x84\x9e\xe1\x51\x99\xb3\xae\x9a\x40\xda\x65\x8d\x35\x88\xac\xea\xf3\x45\xd5\xc6\xf2\xd7\xfa\x3a\xfd\x54\xf0\x5c\xcf\x67\x6d\x4d\x11\xd6\x97\x7a\x19\x49\x08\xe2\x5e\x92\x0d\xcc\x51\x36\x7b\xaf\xff\x82\xb2\x26\xf6\xa4\x16\xc2\x4e\x02\xff\xf0\x8b\x9d\x75\x0b\xdb\x65\x95\xa3\xae\x21\x5a\xee\x27\x00\x55\x39\x17\x4f\x36\x6e\x75\x2e\x96\x4a\xa3\xa8\x47\xce\x3e\xaa\x0d\x9a\x25\xd9\x0e\xae\x51\x55\x32\xf8\x8d\x95\x0c\x7e\x63\x28\xc1\x2c\xc9\xac\xac\x69\x67\x8d\x86\x77\xc0\xd6\xfa\x50\xce\x6d\x8d\x75\x62\xad\x0b\x91\x0e\x2b\x6d\x69\x53\x55\xc1\x36\xa4\x05\x1f\xaf\x77\xa2\xa4\x16\xa7\x77\x4b\x93\xb1\xef\x36\x23\x36\x63\x4f\x36\xff\x8f\xa7\xbf\xfc\xf2\xc9\xf7\xfe\x38\x09\x37\x73\x31\x7c\xb4\xa3\x1e\xed\x6c\x26\xf8\x87\xcf\x69\x14\xf4\x25\xf2\x03\x7e\x89\xac\x71\x68\x81\xfa\x0c\x1f\x1e\x51\xec\x78\x1c\xa9\x3b\xaf\x13\x57\xcb\x36\xfc\x6f\x71\xd5\x93\x3c\x1f\x40\x9a\xe5\x39\xc9\xf8\x1e\x11\xdb\xb7\x4a\x9b\x79\x7d\x56\x2a\xc7\xc1\x98\x80\xa7\xf1\xbe\x37\xe7\x34\x5a\xba\xf3\x23\x1d\xef\xe6\x0b\x1b\x3f\xdd\x51\x66\xb4\x7e\x60\x78\x1c\xa4\x0b\xdb\x60\x1b\xac\xc1\x1e\x6a\x4f\xf2\x62\xc2\xfb\x49\x76\xde\x9d\x66\x49\xc9\xbe\x65\xdf\xb3\x87\xac\x31\x31\xd9\xcb\xee\x2e\x25\xd6\xef\x31\x25\xd2\xcf\xa3\xa4\x3f\x22\x62\xc1\x62\x24\xa7\x29\x8e\xdc\x04\x5d\x42\xf3\x72\xf1\xd4\xf6\x44\x82\xe6\x2e\x48\x95\x81\x01\x8e\x4d\xd4\xdc\xd3\x56\x6d\x6a\x1a\x9b\x88\x07\x16\x4f\xf4\xa7\xa5\x80\xf8\x6b\x7a\x0c\x93\x5c\x14\x64\xb9\x5c\xd0\xdd\xfa\x2c\x38\x3e\xfc\xe3\xca\xb4\x7a\xc2\x26\x6c\x91\x39\x64\x69\x63\x7d\x99\x15\xd3\xb1\x97\xef\x09\x92\x5f\xd8\x98\xbd\xf5\x59\x6c\x2c\xfe\x2c\x95\x11\x3f\x42\x32\x9c\x19\x80\x7a\xb6\xd2\x6b\x62\x6b\x45\x70\x48\x05\xaa\xf0\x96\x4e\xec\x4f\x33\x1a\x50\xe3\x7f\x1a\xc7\xc2\x3a\xbb\xc2\x11\x8e\x3a\x8d\x87\x6e\xe0\x35\x5e\xe0\x24\xca\x83\xae\x62\xbf\x98\x2a\x7a\xbb\x6d\x05\xfd\xdb\x14\xeb\xfd\x71\xe1\x32\xf0\xb7\x6d\xbd\x9a\xbb\xb2\xf5\x56\xa6\xee\xc8\xd4\xbf\xd8\x0e\x4f\xbb\x16\xab\xa1\x80\x47\x30\x76\x6b\x7d\x82\xef\xca\x1f\x58\x0b\xbd\xee\x6b\xf8\x61\x86\xf8\xa5\xac\x3e\x6a\x1c\xcf\x5c\xac\xa1\xe5\xdd\xdd\xe8\xdd\x4a\xbd\x41\x56\xf4\x7a\x6b\xbb\x43\x6c\xb6\x13\x3c\x80\xb2\x81\xa2\xdf\x9d\xcd\xd0\x2b\x2e\x08\x06\x82\xf1\xb8\x9f\xe2\x71\xdb\xc6\x73\xb2\x06\x7e\x38\xd7\xe0\x4f\x43\xf1\xb6\x4b\xcd\xa2\x97\x0e\x94\x0b\x1c\x9a\xcd\xd2\xb2\x0c\x79\xf6\x12\x8f\x2c\x74\x8b\x56\xe0\x3d\xa7\xf7\xb9\xb0\x17\xbb\x59\x53\x78\x1a\x55\xe7\x5e\x03\x4b\x43\xa4\xf8\x7e\x73\x72\xbf\x74\x77\xee\x44\xcd\x21\xee\x4b\x43\x33\x87\xb2\x16\x9a\x22\xde\xad\x36\xf2\xe3\x2d\xc5\xc0\x5c\xef\x54\xf0\x27\xe2\x9a\x65\xef\x04\x7c\x4e\xed\xc4\x1c\x5c\x96\xf1\x7a\xf2\x9c\x9c\xbc\xc8\x03\xda\xdf\x29\xc8\x2f\xfc\x19\x5c\x9f\x9e\x6c\x7d\x5d\xae\x4f\x8b\xdf\xa5\x1f\xc4\x55\xdd\x3b\xe3\x91\xf3\x3b\x50\xb5\xe6\x31\xc3\xaa\xfc\xeb\x7c\x1b\xfe\xe9\x5c\xf4\xa7\x73\xd1\xad\x9c\x8b\x7e\x33\xc1\xcd\xa3\x65\x05\x37\xdf\x2d\x16\xdc\x3c\xfa\xbc\xbe\x52\x7f\x8a\x45\x56\x10\x8b\x68\x4b\xd3\xba\x95\x72\xdb\x7b\xd0\xaf\xcd\xb1\xff\x37\xbf\xd6\xbc\x11\xa8\xf2\xaf\x2d\x99\xbe\xd1\x1f\xdf\x36\xed\xbd\x81\xb3\x20\x9d\xfc\xfa\x3a\xfb\x2f\x7d\xb0\xc5\xc0\x1a\x4a\x33\xb7\x37\x77\x2b\x56\xa1\xbc\xfb\x77\xb1\x74\xe3\xe5\xd5\x44\x9e\xe7\x7c\x32\xba\xd2\xe1\xc6\x16\xc6\xd0\xd1\xcf\xaf\x31\xbf\xd4\x9e\x09\x5b\x4f\xbe\x33\x6f\xb2\x79\xf9\xe0\xc7\x49\xa6\x1b\x7c\xbf\x65\xeb\xf3\xc1\x00\x12\xd9\xdb\xf4\x20\xa3\x4a\xf2\x7b\x2d\xf9\x81\x6c\xe7\xf6\xed\x57\xc9\x9f\x8f\x32\x9f\x58\x12\xf5\xe9\xa4\xd9\x18\x0f\x68\x0a\x75\x37\x92\xcd\x27\x1b\x5a\x73\xac\x9f\x23\x6a\xd5\x5e\xab\x0d\x57\xa8\xea\xa4\x52\x66\x54\xdf\x6f\xe9\x7e\x6c\xe5\x3d\xf0\xc9\xaf\xc8\xaf\x70\x18\x13\x9e\x8a\xb2\x14\x10\xae\xab\x5b\x88\xbe\xcc\x06\x3c\xbf\x8a\x83\x38\xb6\x31\x56\xe6\x82\xb2\x50\xba\x7b\x5b\x1b\x1b\x71\x50\x2f\x30\xc8\xeb\x22\x50\x30\x2a\x1d\x10\x76\x10\x42\x7a\x87\x29\x50\x6f\x35\x31\x0d\x63\xc9\x99\xe9\xa4\xab\xef\x1f\x6f\x6c\x9c\xd6\x40\xba\x8b\x89\x1d\xe0\xe1\x5b\x2c\x71\x94\x13\xde\x4f\xca\xab\x6d\xb6\xd1\xfd\xbe\x06\x48\x75\x66\xb6\xd1\x66\x4d\x93\xea\x14\x48\x3f\xdf\xd1\x46\x24\x24\xc4\x47\x72\x14\xfe\x99\x2b\xb4\xf7\xc0\xcf\x72\x3e\x99\x88\xdc\xd5\x1b\x24\xc5\x24\xe5\x57\x30\xa9\x34\xc9\x44\x47\x35\xb4\x13\xe3\x69\x72\x9e\x1d\x94\x62\x5c\x6c\x9b\x40\x6d\xb6\xec\x3f\xd3\xa2\x4c\x86\x57\xcf\x31\xf3\x7d\xb5\x9c\xf8\xb7\xfe\xff\x3d\xd9\xec\x0b\x27\x3b\x6c\xf4\x65\x3a\x1d\xdb\x23\x09\xff\xa4\xea\x4c\xd9\x10\x20\xdb\x4b\xd2\x18\x4d\x1e\x4e\xe4\x64\x9b\x3d\x09\x68\x86\x49\xb5\x11\x7e\xc7\x74\x4a\x9b\x21\x89\x39\xc2\x03\xbc\xb9\xb5\x0a\xa1\xf0\x40\x46\x45\xce\x8f\xe2\xdd\xc4\xeb\x6a\x52\x43\x56\x64\xd9\x85\x30\xa6\xf7\xdb\x55\xaa\x3d\xb9\x3c\x91\x47\x62\xdc\xac\x14\x98\x36\xd6\x64\x68\x36\x4a\x4a\x71\x3c\xe1\x7d\x01\xe4\x34\x1f\xf3\x74\x25\xb2\x79\x9b\x41\xb0\x0e\xdb\x6c\x55\xe7\xff\x33\x60\xee\x60\xe1\x32\x44\x47\x38\x90\xb3\xec\x8e\xc7\xb8\x45\x0d\x89\xfe\xb8\xca\x83\x83\x21\x3b\x53\xef\xf6\xb3\xb6\x4d\x01\x0f\xf9\xd0\x7b\x82\x19\xb2\xda\x25\x5a\x03\x43\xd1\x96\xce\x06\x1f\x8e\x92\x90\xba\xa5\x61\x40\x10\x6e\xc5\x95\x1a\xf3\x55\x35\x6a\xce\x70\x3a\x0c\x13\x5f\x43\x56\xab\x36\x4b\x4a\x3b\x7c\x48\xac\xce\x0b\xc6\x31\xec\x6e\x9a\x9c\xf3\x72\x9a\x13\xa5\x40\xd2\x5f\xa4\xfe\x00\xb3\xe5\xf7\xf3\x57\x73\xc5\x24\xec\x96\x07\xbd\x61\xfa\x75\xd3\xfe\x6e\x12\xaf\x1b\xf7\xaf\x79\x29\xcf\xd9\x4b\x99\xb3\x42\xe4\x17\x22\xc7\x64\x1e\xe8\xb8\xa9\x96\xbe\x2f\x33\xf5\x05\x6d\x07\xdb\x6c\x26\x58\x2a\x74\x4c\x74\x13\x80\xae\xe4\x3d\x84\x42\xf2\xdb\xdb\x68\x47\x64\x2f\x5c\xec\xba\x3f\x37\x24\xb2\x21\xea\x08\x00\x19\xb5\x67\xc0\x2e\x9d\xbe\x5d\xfe\x5c\xb6\x05\x78\xac\xb5\x8e\x26\xf9\xed\xb2\x6a\xc7\x08\x88\x15\x15\x97\x21\x04\x17\x62\xf1\xc6\x54\x54\x3b\xff\xde\xe2\xb6\x20\x91\xbf\x6e\x8c\x39\x46\x67\xa0\x83\x95\x9d\xb6\x16\x6a\x17\x34\xe3\xbf\x4c\x55\xc3\xa3\xcf\xa9\x8a\x98\x1b\xee\xf9\xbf\xe5\x94\xf5\x79\x66\x2e\x05\x76\x25\xa7\x39\x93\xb3\x4c\x67\xfe\x67\x87\xe5\x48\xe4\xb3\xa4\x10\x40\xb0\x86\x44\x6b\x0d\x4e\x37\xa3\x24\x1d\xd8\xc7\x2d\xe6\x7e\x20\x7a\xe4\xc0\x87\x1d\x7e\x1b\x7d\xa3\xfa\x07\xf5\x62\xf6\x8a\x87\xe4\xab\xc4\x36\xfc\xbe\x16\xad\x3b\x0b\xc6\x11\x2f\x0e\x67\x99\x61\x84\x50\xfe\x1f\xc0\x6b\xd1\xfc\x08\xb9\x9c\x51\xab\x71\x50\xcc\x42\x2e\x47\x53\x1b\xd3\x39\x8e\x78\x81\x7e\x38\xff\xd3\xe0\xd9\xd5\xff\x34\x20\x25\x2c\x9b\xf1\x82\x65\xb2\x74\x59\x20\x4b\x89\x8d\xbd\x01\x03\x84\x2e\x7b\xc7\x8b\xc2\x09\xee\x99\xcc\x19\xcf\xae\xb4\x2a\x16\x97\xb2\x41\x63\xe6\xd1\x44\xfd\xb7\xcb\xd3\xbf\x4c\x9a\xfe\xcf\x99\xa5\xff\x8f\x92\xa4\x7f\xc5\x1c\xfd\x77\x96\xa2\x1f\xdf\xb0\x83\x13\x71\x59\x46\x13\xde\x63\x84\x84\x48\xbe\x47\x71\x61\xd1\x87\xad\x92\xeb\x3e\x0c\xf9\xf2\xd7\xfa\x90\xf0\x91\xd4\x76\x91\xe8\xe9\xd6\x98\x21\x00\xa7\xbe\xfa\x29\xb5\x4c\x1f\x2d\x2f\x65\xbb\x8e\xca\x02\xf3\x69\x63\x9f\xad\x68\x72\x39\x0d\x33\x68\xad\x3e\xe9\xc5\xa8\xc9\x57\x86\xac\x42\x24\x47\x2a\x24\xa3\x51\x2b\xaf\x9e\x63\x0b\x33\x7b\x02\x98\x4a\x8a\x2f\xb2\x7f\x76\xcd\xa1\x26\x84\xe4\xb5\x79\x60\x8b\x66\xcb\x65\xc9\x25\xd1\x8f\x1d\x78\x0c\xed\x49\xc1\x41\x40\x1b\xf2\x61\x41\x12\x28\x0f\x93\xbc\x71\xfd\xe6\xb9\x9d\x3e\x43\x6a\xa7\xea\x06\xfe\x26\xc9\x93\x82\x8c\x43\x1e\x36\x78\xe9\x86\x6a\xf6\x51\x5f\xd4\xf8\xdf\xb7\x6c\xaf\x64\x7d\x91\x97\x90\x1d\x49\xc1\xe0\x19\x3c\x1a\x18\xa2\x4e\xd1\x66\x9c\xa5\x3c\x3f\x17\x39\x3e\xe3\x20\x6c\xca\x98\x5f\xc1\xde\xc3\xa5\x3d\x93\x2c\x4d\x32\x51\xb0\xd9\x28\x49\x05\xbe\x3e\xc6\x3c\x4d\x45\x4e\xbb\x71\x8d\x8b\x52\x3d\x10\xc1\x9f\x56\x73\x13\x05\x93\x99\x00\x20\x5d\xc6\x4e\x14\x59\xc5\x9c\x4d\xf0\x92\x54\xf3\x01\xa7\x33\xc5\x0c\x0c\x93\x2c\x29\xcd\x0b\x88\xa5\x52\x4e\xbc\x3e\x72\x99\x31\xd9\xef\x4f\x73\x7c\x98\x66\xac\x1c\xf1\x92\x15\x7d\x91\xf1\x3c\x91\x5d\x52\x77\xdd\xfe\x5d\xbf\xab\x77\x9b\xca\x84\xc6\xd6\xf1\x42\x2c\xbb\x68\xfd\x5b\xab\xa4\x32\x59\x2a\xe1\xc8\x0a\x69\x44\x8c\x6c\xc1\x55\x33\x5f\x6e\x94\x6c\xa4\x1f\x66\xdd\x50\x5f\xa2\xd1\xd2\x23\xf9\x44\xbc\x04\xe6\xf0\x02\xf1\x40\xc1\xa7\x1b\xa4\x1b\x71\x91\xe3\x4d\xfe\x90\x48\x88\x75\x60\xed\xfd\xfe\x8a\x30\xe2\xf4\xb2\x69\x42\x3e\x5b\x1a\x90\x7a\xc3\x3a\xdc\xb2\x6a\x9e\x8f\x3e\x1a\xdb\xd9\x25\x56\x3f\x60\x1d\x2b\xd9\x3d\xf4\x9a\xc0\xdf\x6a\xe2\x95\x04\x1e\xf1\xbc\x1d\x09\xaa\x2d\x4d\xe2\x72\x42\xac\x2c\x2e\xa8\xdb\xc5\xde\x88\x5e\x7e\x02\xad\xf2\x9c\x9f\xa1\xc0\xc0\x69\xb1\xa7\x0e\xbf\xb6\x97\x8f\xa1\x8d\x3a\x53\xdf\xe0\x0e\xff\xc3\x80\x48\x55\xec\xb5\x9f\xaa\xdc\x81\x9a\xb2\xb9\xe5\x23\x73\x76\x58\x5b\x3b\x69\xd3\xfa\x8e\xa3\xbf\xfb\xe2\x7f\x3f\xf0\xf7\x2a\xe1\xdc\x8b\x09\xcf\x96\x8f\xe7\xbe\xd8\x32\x13\x0f\xed\x0a\x59\x43\xa8\xd4\xba\xcd\xe2\x37\x5e\xab\x75\xeb\x40\xf0\x66\x1b\xa2\x91\xe0\xbd\xdf\x41\x0c\x75\xbb\xc5\xe4\x6b\x6b\x01\xc6\xdc\xc4\x98\x95\xa6\x7f\xd9\x5a\x35\xf1\xcc\x96\x5d\xcf\xf7\x0d\x05\x4e\x3d\x36\xa1\xb1\x36\x47\xe8\xf6\xf9\x24\x29\x21\x5a\xc0\xcb\x24\x2f\xca\xd7\xa2\x2c\x45\xde\x6a\xda\x03\xdf\x3a\x6d\x83\x5d\xd9\x2a\x49\x6a\x6e\xdf\xa9\x7a\x02\x1b\xf5\x5d\xe3\xb4\x6d\x2f\xa7\x2f\x3f\x0a\xa3\x77\x54\xa3\x30\xa4\xf1\x66\xa3\xe8\x7a\x0a\xef\x36\x12\xbd\x07\x0f\x10\x8f\x6e\x08\xd2\xdd\xbd\xee\x66\xf6\x33\x00\x6d\xb5\xa2\xe6\xd0\x06\x21\x0b\x93\x51\xcf\xcf\x6c\xe7\x2e\x38\x08\x52\xa2\x05\x4c\x90\x7c\xd0\x2f\x31\x52\xa2\x56\x98\x72\xa7\xdb\xd7\xf7\xa3\x6d\x50\x39\x10\xa6\x6f\x98\x38\x98\x1a\x06\xe6\x9d\xe4\xfd\xb2\xc1\x9e\xce\x33\xb0\xc0\x1b\xda\xdd\xdd\x2d\xb6\xed\x7e\xdc\x30\x21\x49\xbd\x95\x36\x0b\x2c\xb5\xbf\xab\x6a\x11\x19\xc8\x2f\xfa\xd3\xe2\x28\x99\x4c\x8c\x91\x6b\x94\x35\xa3\x06\xdd\x21\x1b\xa2\x27\x41\xbf\xbb\x5c\x14\x1e\x71\x6e\xf0\x3c\xe1\x1d\x7b\x77\xc7\xb3\xc7\x38\xf5\x91\xa7\xb1\x47\xda\x86\xcc\x88\x9f\xf1\xc6\xca\x5a\x2b\x72\x01\xd7\x70\xe9\x94\x2b\x74\xb4\x95\xcb\x25\x7a\x95\x69\x65\xbb\x4f\x78\x43\x3e\x12\x8e\x8f\x23\xbb\xae\x28\xcc\x53\x31\x2f\xc1\xc4\x32\xf9\x25\x62\x36\xcc\x6e\x45\x51\x8e\x72\xe3\xd4\x0d\x9e\x11\xb3\x31\x5c\x6e\x55\x02\x2e\x3e\x79\xf4\x75\x19\x1a\xa3\x2d\x9a\xba\x89\x5f\x26\x22\x1d\xd4\xc6\x11\x00\xbb\xb5\x05\xbd\xd9\xa0\x6d\xd8\x95\xc8\xa6\x63\x91\xf3\x1e\x3d\x3c\x10\xd9\x93\x46\x27\x6b\x86\xae\x1c\x35\xd6\x70\x76\x84\x2d\x97\x23\x01\x64\xa6\x5f\xc4\x44\x2e\xd8\xc3\xef\x7e\xd7\x3e\xcf\x7f\x3c\x2f\xe3\xcf\x60\x39\x3b\xe3\x79\x96\x64\xe7\x75\x60\xbf\x0b\x2b\xce\x35\x68\xc5\x2a\xce\x32\x34\x9b\x4c\x6b\x07\xfc\x68\xd3\xaf\x37\xd7\x84\x54\x55\xb0\xd5\x5f\xca\x1c\x12\x0b\xe5\xb2\x2e\x5c\xc8\xd6\xdf\x1e\xc5\x6a\xcf\xeb\x82\x54\xf3\x9a\xbe\x02\x16\xcd\x48\x38\xa3\x7d\x7d\x57\xd3\x60\x51\x77\xae\xa6\xcb\xf9\x02\x77\x65\x9d\x3b\xc4\xc6\x77\x41\xc5\xb9\x59\x61\xa0\xc6\x97\xa1\x2a\x71\xf3\x56\xb2\xa4\x2b\x59\xd4\xbc\xc5\xa0\xc4\xb7\xb3\xcc\x05\x20\x0b\xcc\x72\x57\x19\x94\x49\x77\x08\x1a\x9e\x5b\x8f\xce\x87\x76\x87\xc3\x8c\x5a\x23\x81\x20\x73\xa2\x29\x2c\x53\x8f\x8e\x82\x4d\x0b\x91\x43\x8c\xee\x61\x92\xa6\x6c\x28\xf3\x71\xc1\x86\x10\x75\xb8\xcd\x44\x31\x11\xfd\x84\xa7\xe9\x15\x93\x19\x1b\xcb\x5e\x92\x0a\x36\x10\x17\x49\x5f\x68\x4b\x25\xb0\x42\x50\x9c\x02\xe8\x57\x7b\x82\xf5\x65\x36\x9c\x16\x60\xfb\x91\x94\x8d\x82\x8d\x65\x2e\x58\x9a\x7c\x10\x8c\x67\x8c\x4f\x4b\xa9\xba\xe9\xfa\x6a\xd9\x54\xf0\x3c\x63\xbc\x27\xa7\x25\x5a\xeb\x94\x23\x14\x93\xf2\xbc\x4c\xfa\xa9\xb6\x39\x31\x81\x42\x07\xe2\x42\xa4\x12\x9e\x4b\xe7\x52\x9e\x03\x5f\x3f\x5e\x9f\x89\xde\x3a\xa6\x69\x2f\xd6\xb7\x36\x36\x1f\xaf\x6f\x3c\x59\x07\x11\xaa\x9c\x96\x1d\x9c\x4f\x47\x01\xee\x98\x31\x58\x05\xae\xfa\xa0\x70\x35\x15\xe5\xad\xec\xa4\x12\x20\x72\xc6\xd4\x08\x38\x6d\x31\x60\x83\x29\x08\x7e\x21\xd5\xb7\x7a\xd2\x31\x08\xb1\xde\xf5\x7a\x7f\xa9\xea\xde\x42\xf5\x6f\x12\xa7\x6d\xaf\x68\xb0\x11\xa0\xf2\x0d\xcd\x36\x7c\x28\x77\x63\xbc\xe1\xc1\x5c\x60\xc0\x71\x33\x23\x37\x85\xb7\x86\x1f\x46\x99\xa8\x1c\xc2\x2e\x9d\xc1\x1d\x73\x56\x35\xaa\xd1\xb5\x7f\x42\xe6\xe3\xae\xf0\xe4\x4e\x2c\xea\x82\x1e\x50\x7e\x44\x7a\x98\xa4\xfc\x4a\x0c\x58\x92\xa9\x43\x28\xf2\x5c\x42\x20\xc3\x92\x18\xbe\xc1\xc7\x15\x7a\x74\x6c\x09\xb5\x63\x84\xf5\xf3\x6f\xb4\xc8\x42\xfa\x15\x80\x50\xad\x64\xb7\x52\xbf\x9e\x25\xff\x20\x4c\xa8\xd3\xe1\x34\x4d\xd1\x60\x59\xed\x6c\x52\x16\x8a\x34\xa1\x04\xd2\x0d\xe5\xa6\xa6\x87\x28\xaf\x41\xed\x54\x1f\xad\xa5\x1d\xd0\x91\x9d\xdb\xaa\x07\x12\x2f\xbc\x1b\x9e\x43\x68\x7c\x37\xc7\x4f\x81\x8a\x58\x9b\x3d\x3f\x3e\xc6\xd3\x86\x14\x5f\x1f\x18\xba\x16\x95\xbd\x76\x6b\xf1\xfc\xc6\xc7\x34\x19\xd8\xb3\x99\xd4\x9c\xcd\xa4\xfe\xb4\xd4\x41\x8d\x4f\xa6\xbe\x07\xf5\xfd\xe6\x73\xa8\xe9\xad\x8e\xd6\x1c\xdc\xbc\xb7\x39\x27\x13\xa0\x82\xb8\xaf\xae\xcb\xd7\x46\x80\xbc\xda\x89\x9c\xd3\xe7\xdc\xf5\xbc\xd3\x9e\xe6\xae\xe5\xea\x3d\xfd\x58\x08\x64\x42\x2c\xbf\x54\x4a\x36\x51\x3b\xc8\x59\x2e\x86\x2e\xa8\xa9\xee\x3f\x03\x7f\x27\x4d\x8d\x68\xec\x0d\x3a\xe1\x23\x31\x5c\xc1\x4a\xd0\x59\x78\x56\x68\x8c\xb6\xf0\xfc\x03\x90\x97\x79\x26\xae\x37\x3b\x21\xe4\xfe\xe0\x40\xb6\x78\x2e\xb8\xe9\xc1\x5e\x9b\xa8\x32\x87\x5b\xb3\x28\x05\x07\x1a\x04\x0a\xff\xc9\x94\x0c\x63\x3c\x4d\xcb\x24\x4d\xb2\xf9\x71\x64\xfc\xfe\x41\xd9\xc2\xcb\x32\x4f\x7a\xd3\x72\x31\xe5\xc9\x56\x9d\x9f\x8d\xba\x33\x4c\xd4\xf8\x21\x42\xb8\xea\x01\xd9\x1c\x30\x65\xe0\xd9\xb9\x61\x39\x34\x53\x35\xe1\x39\x1f\xb3\x8f\x78\x12\xae\x19\x1a\x38\xa8\x5d\xc1\xbf\x0a\x39\xcd\xfb\x76\xac\x06\xf7\xd7\x6e\x61\x44\xab\x60\x17\x23\x99\x97\x6c\x94\x64\xa5\xcf\xa5\xb8\x6b\xbd\x27\x86\xea\x01\xa1\x3e\xa8\x87\x0a\x03\x7f\x24\x75\x04\xd1\xdc\xd0\x0e\x60\x92\xf2\xbe\x18\xc9\x74\x20\xea\xb9\x98\x25\x78\x33\x44\xb6\xa4\x20\xc3\xe1\x85\xb1\x09\x21\x3c\x9a\xf9\xb2\xc2\xae\xaf\x4a\x4f\x72\x29\xa3\x74\x44\x7d\x5f\x8d\x8c\x60\x74\x7f\xb5\x77\xb9\x9c\xc1\x53\x4f\xcf\x0e\x51\xc3\xa2\xb0\x8e\xf2\xaa\xa6\x5f\x88\x12\xc6\x91\xd3\x35\x56\xad\xef\xc0\xa8\xbc\xa6\x38\x83\x51\x86\x96\xbb\x6f\xf8\x65\x32\x9e\x8e\x59\x76\x87\x73\x78\xc3\x2f\xbf\xf4\x34\x8e\xd0\x3a\x88\xb3\x33\x94\xc6\x9c\x39\x72\x03\x16\x4a\x0a\x0f\xcc\x33\x31\xb8\xc8\xc0\x20\xd7\xb4\xe2\x85\xa5\x13\x70\x60\x45\x69\xb8\x59\x85\xc9\x60\xfe\xe9\x2f\xc0\x95\x9c\xb2\xf1\xb4\x28\x11\xd3\x14\x78\x13\xf5\x5b\x1f\x65\x54\xca\x28\xc0\xe6\x15\xe9\x16\x0b\xcb\xee\xe6\x55\x10\xcc\xdb\x75\x82\x05\xab\xdf\xcf\x90\x5d\xa4\x4a\x45\x03\x2e\x80\x1d\x94\x26\xf8\x59\x4f\x20\xd9\x48\x06\xec\xd5\xc9\x9b\xd7\x8f\x35\x85\x01\x93\x6b\x3b\x1a\xf5\x6b\x65\xe6\x6e\xde\xfb\xb1\x6d\x69\x05\x18\x0f\x73\xb8\xca\x21\x6b\xfc\x20\x76\xba\x2f\xe6\xbe\x2e\x3f\x13\x76\x2a\x22\x38\x10\x59\x21\xce\x98\xcc\xd9\x19\x3a\x07\x9e\xb5\xf1\x2a\xe4\x03\x88\xa2\x76\xa1\xf6\xb5\xcf\x53\xa6\xdd\x1a\x71\xba\x49\x01\xc6\x79\xe6\x65\x35\x88\x7a\xb2\x8d\x79\x7e\x9e\x2c\x8e\x2a\x87\x2e\xde\xac\x01\x23\x51\x7f\x68\x27\xc5\xd3\x16\xd8\x91\x93\x00\x66\x46\x73\x12\x86\x2e\xa3\x92\x1c\x1b\x37\x8c\x7e\xb4\x3e\xb0\x46\xe8\xe2\xd5\x82\x2f\x36\xce\x99\x3e\x0d\x2e\xc4\x99\xfe\x50\x09\x84\x36\x27\x08\x1a\x91\x18\xb8\x38\x68\xe4\xa3\x8b\x96\x66\x0d\xdd\xe2\x76\x6e\xf8\x66\x37\xa5\xf0\xcb\x14\x25\xae\x55\x62\xeb\xfb\xaf\x15\x57\xc1\xfb\x6c\x2a\x1f\xc4\x2b\x1f\x44\x2b\x3b\xbe\xdd\x0b\x00\xe7\x3e\x7b\x50\x8d\x14\x92\x40\xf4\x2a\x19\xa6\xd8\x87\x73\x24\x86\xa6\x82\x31\x85\x89\x58\xd9\xf9\x1c\xa0\x5f\x27\x3e\x47\xf7\xba\xf1\x87\xe4\xbe\xbb\x38\x04\x44\xd8\x8f\x35\xdd\xa7\x6a\xa5\xea\x28\x22\x65\xa6\x59\x44\xfc\x61\x9b\x45\xca\xac\x9b\x35\x31\x73\xac\xb1\x72\xb4\x94\xc6\xd4\x30\x1f\x4c\x05\x9d\x86\x45\x9b\x07\x5e\x4d\xec\x98\xdc\xfd\x69\x4a\xed\x17\x53\x25\xa3\xd3\xcb\xc8\x7c\x88\xa5\x63\xdc\xd0\x91\xf0\x66\xb6\x0e\xf9\x66\x47\x8f\x8c\x8d\x1b\x3c\xfe\x76\xc5\xb3\x82\x94\xcd\x0a\x5a\xf0\x86\x5f\x7a\x65\x6f\xf8\xa5\x29\x2e\x8c\x26\x85\xda\x57\x9a\x42\x72\xf9\xd8\x1a\xe4\x9b\x8d\x45\xe8\x9d\x60\xcf\x66\xf2\xa6\x71\x08\x29\x59\x52\xc4\xce\x12\x20\x30\xa0\xd4\xb4\xa6\x6a\x4c\x49\x88\x47\x68\x5c\x09\x54\x01\x0c\x2a\x07\x68\x56\x49\x8f\xaf\xfa\x72\x50\xf9\xe2\x4e\xad\x2d\xb7\xbf\xcc\x49\xf4\xac\x32\xfd\xc3\x65\x1b\xb9\x03\xa4\x3e\x39\xdc\xf7\x7f\x79\xed\x22\x98\x5e\xb1\x10\x35\xe8\x0b\xe6\x9e\x57\x13\x68\x67\xf1\x12\x6e\x08\x0d\x8c\x1a\x8b\x12\xcc\x02\x18\x88\x45\xf8\xe7\xac\x30\xff\xbe\xe1\x97\xce\xb2\x54\xfd\x45\x76\xbd\x6a\x50\x8a\xb9\x16\x09\x3d\xf3\xa9\xa0\x8d\xe6\xe8\xaf\xb9\xf5\xf2\xa2\x2d\xeb\xc2\x29\x86\xb7\xca\x76\x40\xc3\xd1\x50\xa4\x4d\x80\x39\xb7\x83\xa5\xa3\x1f\x82\xd5\x87\x56\xdf\xba\xbe\xef\xeb\x23\xf2\xe9\x13\x7b\x26\x65\x2a\x78\xd6\x34\x08\xd8\x6a\xb3\xc6\x1b\x5e\x8a\x3c\xe1\x69\xe7\xc7\x83\x6d\x76\x66\x4a\xce\x90\xad\xec\x21\xef\x6a\x9e\x99\x53\xc7\xc5\xda\x5b\xfa\xcc\x31\x05\xa8\xda\x39\xc3\xfe\xce\xba\x8d\x16\xdb\xa6\x96\xaa\x6a\x99\x11\x49\x6d\x83\x85\x41\x52\x51\x65\xec\xe2\xa2\xce\x5d\x5f\x5f\xd5\x53\xe5\x0c\x88\x32\x26\x60\x08\xc8\xbe\xc4\xee\x45\x5f\x37\x50\xbd\xe2\xab\x66\x4e\xf8\x9d\x88\x0f\x02\x82\x8b\xaf\x7e\x47\x67\xf1\xf1\xe5\xe8\x9e\x7d\xc8\x78\xe4\x0e\xd9\x57\x47\xd9\x35\x3b\x49\x28\x56\x32\xd8\x66\x86\x4f\xa0\x32\xb8\xf0\x02\x77\xe2\x2a\xff\x4a\x76\x2f\x7d\x9f\xcc\x7b\x0f\x70\xf2\x03\x1d\x15\x1c\x69\x69\xa1\xb1\xdf\x0a\x91\x49\xa9\xde\x7e\xb9\xd0\xa4\xe1\x8d\xb9\xcd\x2a\x57\xe5\x3c\x5b\x37\xad\x0b\xf1\xb8\x2c\xf7\xe0\x37\x7f\x99\x03\x19\xd8\xa8\x81\xb1\xaf\x26\x3a\x58\x85\x46\xbc\x60\x0f\x1e\x2c\x67\x92\x86\x78\x4d\xd8\x13\x33\x90\xda\x70\xac\xa3\x72\x9c\xbe\x54\xe3\x4e\x06\x6d\x3a\xbd\x80\x4d\x32\x9b\xe1\x48\x76\xcb\x63\xa8\xe0\x6f\xfd\x49\xd3\x85\x45\xf9\x8f\xcd\x90\xb5\x29\x42\x68\x98\x58\x3b\x62\x40\xac\xed\xf0\xc4\x5f\xb7\xe9\xad\xdc\x0a\xf9\x71\x1c\x1f\x0b\x9b\x61\x35\xc2\xb6\x2d\xbd\xd0\x81\xa9\xc6\xd2\xa3\x27\x4b\x1c\x63\x04\xaf\xdb\x31\x46\xaf\x55\xe5\x1d\x71\x42\x2e\xca\xad\x21\x9b\x37\x8a\x6f\xbb\x92\x71\x80\x0e\x8b\x6a\x3b\x8c\x18\x13\x3a\xb4\x07\x63\xc2\x36\x11\x0a\x58\xeb\xc2\x88\x79\xa1\x85\xf9\x79\x42\x9b\x3e\xfe\x2a\x2d\x0e\xa5\x4c\xcb\x64\x52\x6b\x6f\xf8\xe4\xb7\xb6\x37\xc4\xf1\x7d\x0d\xd6\x86\x4f\x7e\xd7\xd6\x86\x8b\x23\xd9\xfe\x71\x2c\x11\xbf\x7c\x48\xd2\x3f\xa3\xe8\xfe\x19\x45\xf7\x56\x51\x74\x3f\x8b\xf1\x2c\xfc\x7a\x01\x29\x40\xe3\xa6\xa1\x7e\xcd\xfd\x0b\x91\x95\xaf\x93\xa2\x14\x19\x08\x0f\xa2\x54\xe2\xd1\x9c\x36\x0b\x47\xe6\xd5\x26\xc7\xaf\x27\xa7\x59\xbf\xce\xa8\xf2\xf1\x56\xa5\xe6\xbc\x8e\x4c\x9d\x2f\x62\x42\xfc\x25\x02\xfb\xc2\xca\xbd\x93\xe0\xe0\x51\x77\x8d\x7f\xbf\x7a\xf4\xdc\xbe\x1c\x8f\x6b\xe3\xe7\x6e\xfe\xb0\x19\x54\x9c\x3b\x68\xa8\xe1\xa8\x5b\x2e\x6a\x4d\x50\x7f\xd8\xf0\xaa\xcd\x25\x7d\xb9\xb8\xfa\x52\xd1\x8d\xbf\xa6\xe0\xbf\x5f\xca\xbe\x98\xad\x7f\xcb\x44\x91\x26\x59\xd9\xd1\xcf\x7f\x06\xa8\xb6\x9e\xc9\x0e\x3c\xfb\x3b\x7d\x39\x9e\xb4\x59\x26\x3b\x8a\x97\xc8\x8b\xbe\xcc\x45\x67\xc0\xb3\xf3\x54\x40\xc6\xc5\xaf\x38\xa2\xf1\xda\xfa\x3a\xa8\xb6\xb9\x36\xdd\x70\xb2\x9e\x42\xb2\x19\x9a\x05\x9f\x8b\x12\x95\xdc\x22\x17\x59\x5f\x74\x75\x4c\xa0\xfc\x5c\x94\xcf\x9d\x9a\xe5\xe6\xe1\x81\x28\xa0\x25\x22\x05\xd1\xea\x96\x7b\x5e\x2e\x10\x10\x6d\xaa\x9d\xb7\x34\xa6\xae\x1a\x73\xc7\x87\xb5\x5a\xdc\x1d\x6f\x14\x2d\x1d\x7d\x07\xe1\xda\xb0\x41\xad\x25\xa3\x92\xf8\x6b\xf7\xfe\xe6\x11\x25\xf4\x3a\xb8\xc8\x10\x5d\xad\x01\xad\xf7\x71\xa3\x7d\x2f\x74\x77\xfb\x1c\xe9\xc6\xc2\x48\xb9\xb5\x31\x6d\x8d\x4f\x29\x5b\x5f\x67\x6f\xf8\x07\x81\xaa\x74\xe3\x0c\x08\x36\xee\x65\xce\xb3\x62\xc2\x73\xa3\xce\x35\x2e\x82\x13\xe9\x47\xe7\xfd\x55\x27\xc3\xc1\x40\xa4\xf8\xab\x5b\xe2\xe3\xac\xda\xee\x79\x2a\x0b\xe1\x1a\x43\xec\x53\x91\xc3\xed\x5e\x98\xb0\xd8\xb4\x95\x06\xb4\x6c\x64\xd9\x1e\xef\x7f\x38\xcf\xe5\x34\x1b\x6c\xeb\x6b\xc2\xd4\x79\xff\xfd\xc6\xc6\xa9\x59\x8e\x9e\xcc\x07\x22\x3f\xe2\x83\x64\x5a\x6c\x33\x1b\x5c\x57\xc7\x4e\x36\xf7\x96\xdd\x37\x90\xb6\x8d\x12\xa7\x6f\x1d\xca\xac\x7c\xc9\xc7\x49\x7a\x15\x89\xcc\xea\x0a\x69\xf5\x05\x61\x5c\x37\xbf\xb3\xa2\x94\x71\x92\xbd\x12\x73\x02\xef\xda\xf0\xe4\x6a\x87\x4d\xcd\xc6\xa3\xad\xc9\x65\x24\xd8\x73\x10\xd0\x17\x72\xce\xd5\x64\x9c\xc3\x6c\x73\x56\xb5\xa6\xb6\x7f\x28\xf3\xf1\x36\x6b\x14\x7d\x9e\x8a\xe6\x46\xcb\x2f\xd4\xa1\xd1\xf5\x94\xec\x97\x42\xcb\xa5\x9a\xef\x1b\x7a\x18\xa0\xee\x30\xe0\x1a\xa7\xd4\xff\xd5\x24\xe5\x8e\x81\x31\x65\x5d\xb0\xaa\x12\x45\xa9\x5b\x5d\xb7\x8c\xa8\x32\x1e\xe6\xb7\x18\x07\xd1\xd1\xcd\x1a\x6d\x6d\x45\x57\x6e\x8b\xae\xdc\xca\xeb\xb4\xcc\xde\x6e\xf8\xb1\x82\x35\x4e\x63\x1c\xe6\xe5\xf0\xda\x2e\xdf\x61\x9e\x80\xed\x01\x26\x2f\x62\x41\x3c\x6b\x63\x99\x50\x3f\xf8\x6f\xd9\x23\x2f\xad\xe0\x92\x8b\xe8\xe0\x6e\x7e\x67\xdb\xfa\xd3\xd1\xb1\xa2\x6f\x3a\x9f\x54\x0c\xbf\xaa\xe9\x40\x94\xee\x9b\x4e\x06\xe7\xc1\x7a\x10\xd4\xbb\x32\x9d\x79\xf3\x60\x1b\x37\x9b\x89\x9a\x87\x6d\xeb\xcf\xc4\x84\x16\xbf\xe5\x64\x4a\x39\xf9\xad\x67\x72\x38\x11\x59\x34\xd2\xfc\xdf\xea\xa9\xd6\x66\xeb\x56\x09\x34\x53\xde\x9f\xc7\x7e\x12\x73\x1f\xdc\xec\x8e\xc8\x40\xbd\xab\x7f\x15\x25\xcf\x4b\xf7\x1b\x54\xce\x62\x58\x9a\x5a\xf0\xb7\xad\xe3\xe5\x25\x33\x55\xf0\x87\xad\x83\x39\xcb\x14\x41\x95\x13\x53\x45\xfd\x69\x2b\xa8\x6d\x3a\xf5\x1e\x26\xc3\x34\x99\xd8\x79\x34\x27\xe6\x2f\x64\x26\x8a\x59\x52\xf6\x47\x2c\xfc\xcc\x58\x9f\x17\x82\xd1\x49\x6d\xfb\x7c\x91\x3f\xc3\x9d\x6a\x1b\x2c\xa8\x69\xa5\x00\xd2\x36\x66\x36\x61\x75\x37\xb5\xb0\x76\x1c\xbc\x81\xb3\x43\xb5\x98\x41\x25\x3b\xd5\x1d\x93\xf3\xff\xd6\x6e\x88\x5a\x54\x6e\x5f\x04\x31\x4b\xb8\x9b\x3a\xb5\xdd\x51\x14\x62\x92\xe4\xee\x56\x6d\xb7\x7f\xdb\xe8\xc7\xb5\xa9\x59\x7f\x8f\x81\xe9\x5f\x48\x08\x55\x9b\x8b\x62\x22\x33\x18\x1f\x78\x59\xa2\x89\x7a\x51\xf1\xa0\x3b\xc9\x93\xf3\x73\x91\xaf\xea\x5d\x59\xed\x65\x24\x2f\x44\xbe\xa0\x97\x57\xaa\xce\xad\x7a\x49\x65\x76\x8e\x29\x71\x59\x29\xa7\xfd\xd1\x82\x0e\x4f\x54\x9d\x15\xdd\xd6\x30\x2b\x8f\xcc\x8a\x51\x32\x61\x3d\x51\xce\x84\x76\x0d\xd0\x17\x06\x46\x5a\x24\x2f\x1b\xdc\xff\x4c\x94\x2c\xc1\x30\xc1\xfd\x54\xf0\x9c\x0d\x73\x39\x86\x7a\x2f\x0e\xdf\x68\xf3\xe3\x67\x57\x3a\x84\x70\x02\x20\x88\x9f\x71\xdb\x88\x01\xa6\x85\x60\x10\x13\x66\x20\x8a\x7e\x9e\xf4\xc4\xa0\x07\x46\xf0\x85\x4c\x2f\xd0\xc4\x9f\xf7\xfb\x42\xbd\xa0\x93\x34\x29\xaf\x58\x52\x14\xd4\x74\x7b\x45\x1f\xaf\x3a\x2f\x88\xd2\x12\x9f\xff\x9d\x8a\xa2\x04\x5b\xf2\x9e\x60\x7d\xf5\xd0\xba\x5b\x97\x88\x23\xec\x41\x3f\xe1\x96\x36\xd7\x5f\x71\xe0\x72\x62\x4c\xb6\xef\x76\xd8\xc8\x3c\x2c\x3d\xea\x30\x69\x84\x1e\x6c\x52\xb0\x62\x24\x67\xc4\xa8\x5c\xce\x83\x1b\x41\x5b\x0d\xa8\x4c\xca\x94\xda\x69\xab\x9f\x5f\xdc\xff\xe9\x46\x97\x42\xd8\x70\xe9\x1b\xe1\xae\x3d\xae\x6a\xef\x02\xf0\xe1\xb7\x0e\x16\xe3\x24\x4d\x13\xcc\xea\x04\x38\x36\xe3\x89\xf5\xc3\x51\x7b\x69\x2c\xbc\xf4\x16\x13\x1f\x62\xc5\xf7\xbe\x10\x20\x50\x99\x6b\x7f\x7e\xd3\xde\x47\x09\x3c\x36\xe3\xbd\xa7\x82\x5f\x88\x1b\xf4\xae\xf1\xcb\x72\x39\x6b\x9e\x4b\xd1\x18\xf2\x20\xfd\x9e\x58\xd9\xa5\x3d\x32\x50\xd1\x11\xf1\xc8\xc0\x82\xd5\x3d\x32\x2a\xf9\x04\xd4\x33\x66\x01\x04\x17\x22\xde\x9a\x4f\xd4\xcb\x81\xb7\x16\x08\x82\x11\x44\x55\x02\xbc\x15\x8a\x80\xb1\xe2\xb2\x01\xe3\xb7\x56\x8f\x18\xaf\x6d\x2d\x7e\x3f\x51\xe3\xb7\x6e\x11\x36\x5e\x9f\xc4\x55\x44\xd8\x7a\x7d\x56\x0c\x1f\xbf\x65\xff\x70\x01\xe4\xaf\xed\x27\x20\x3f\x27\xc9\x18\x94\x77\x10\x3e\xd5\xc6\xd3\x54\xa4\x21\x5a\x02\x8c\x56\xb4\x24\x29\x9e\x3b\x47\x9d\xa0\x6c\x62\x54\x84\xde\x57\xe2\x31\xe2\x43\x82\x53\xf1\x56\x66\xc0\xb1\xa1\xe8\x56\xa1\x39\x18\x54\x99\x4a\x18\xc8\xee\x48\x40\x38\xea\x5d\x23\x7b\xd0\x3a\x58\xb7\x70\x73\x63\xb3\x9b\x81\xd1\xc0\x87\x5e\x41\xf7\x17\xfd\x6f\xd1\x1f\x89\xc1\x34\x15\x3a\xb8\x77\x35\x64\xfc\xe6\x93\x27\xad\xca\xd8\x2c\x5b\xb0\x28\x02\x3f\x59\x09\xd3\xbf\xe7\x42\xe3\xc7\x75\xc4\x2b\xdc\xb6\x81\x18\x8e\xc8\xd0\x35\xc2\x38\xf3\xa6\x92\x79\x55\xa2\xc2\xa0\x6b\xb5\x28\x32\x4b\xaf\x9c\xed\x32\xf6\x6a\x3b\xc3\xee\x60\xb8\x5d\x74\x84\x00\x4e\x00\x6c\xee\xd9\x83\x07\x3e\xf0\xae\xcc\xe0\xdd\xe0\x47\x69\x8d\x56\x09\xc2\xee\x93\x68\x92\xf1\x1e\xc7\x72\x5a\x08\xf5\x5a\x88\xf6\xfa\x46\x95\x1e\x5e\xf8\xbb\x58\xed\xd9\x56\x8b\xf4\x1e\x8c\x82\xe0\x47\x14\x15\x1f\x3c\x60\x64\x88\xb0\xfc\x70\x2c\xf0\x5e\xa1\xc3\x40\x0a\x52\x09\x9a\x09\x6f\x02\x75\x88\xe4\xb4\x6c\x56\x8e\x9c\x1d\x1a\xc5\x53\xd4\x0f\x59\x7e\x81\xfd\x83\x6d\x44\xb0\xd6\x3b\xb7\x85\x28\x4d\x1f\xb1\x53\x40\x9a\xe5\x0e\x53\xab\xab\xd3\x66\x35\x63\x70\x87\x80\x89\xb4\x10\xd5\xd1\xd4\x83\xf5\x33\x2d\x78\x35\xe7\x1d\x15\xc8\xfe\x12\x21\x37\x91\x95\x20\x09\x0e\x90\x7f\x56\xac\x36\xc9\x68\x10\xdb\x6c\xe3\x8c\x43\x0e\x6e\x8c\x32\x54\x6b\x99\x24\x14\x10\x63\xb7\x6e\x8e\x1e\x51\x80\x27\xce\xff\x25\xaa\xd0\x4b\xa7\xf1\xe3\xf9\x2c\x9d\x2e\x38\x99\xaa\xc6\x8d\x48\x02\x60\x7b\x3d\x4d\x78\xad\x8a\x97\x20\x0a\x50\x6f\x31\x55\xb8\xe9\xa1\x75\x6c\xf6\x9d\x1f\x58\xc0\xa2\x85\x27\x96\x0c\x60\xc9\x13\x1b\x83\x5b\x73\x64\x17\x22\xf2\x12\x77\xba\x87\xc7\x37\x3d\xdf\x00\x69\xb5\x03\x0e\x63\x5f\x7c\xc2\xc9\x6a\xb4\xb1\x9b\x05\x67\x1c\xa6\x78\xac\x2e\x83\x9b\x2f\x8c\x22\x25\x3b\xbf\x13\x5a\x10\x9e\x2a\x37\xff\xf9\xa7\xcf\xd5\xbb\xd9\xe9\x73\xbc\xa8\x6d\x89\x74\x62\x22\xf2\x22\x29\x4a\xc7\xa6\xc5\x98\xd7\x85\xa7\xad\x8e\x99\x0b\x0f\x46\x9b\x6d\x8a\x47\x26\x30\x71\x0c\x15\xf6\xb3\xc1\xef\x99\xd4\x47\xb7\x6d\x3f\x1b\x2c\xb1\xb9\xfb\xd9\xe0\xce\xb6\x76\x49\xfa\x3b\x1f\x03\x56\xa3\xb7\x4b\x50\xc5\x36\xdb\x7c\xbc\xb1\xc1\x1e\x2e\x20\xb9\x37\x4e\x98\xb4\xb5\x4a\xc6\x24\xf3\x9c\x8f\x67\x4d\xfa\x39\x49\xd3\xa5\xd2\x26\xd9\x8a\x41\xfa\x9b\x6a\x2e\x1b\x97\x3d\x04\xbe\x05\x4f\x40\x4d\x47\x27\x1a\x45\xa9\xd5\xbf\xc3\xae\xfb\x95\x96\x5e\x9e\xa3\x75\x14\xa2\xdb\xc2\x36\x08\xc5\xc1\xa6\x27\xe3\x29\x06\xe5\xb3\xb5\x83\xd4\x56\x04\x3b\xc9\x1d\xe1\x10\x71\x71\x8a\xa0\xbb\xc8\x38\x75\x5b\x5f\x53\x9d\xdb\x48\x9f\xf5\x4f\x9f\x98\xff\xc5\x46\x3e\x60\x9f\x3e\xad\xd9\x45\xfb\xeb\xcb\x54\xce\x5e\x26\x97\x6f\xcc\x74\x83\x46\x25\x3f\x7f\xcb\xc7\xa2\x5b\xca\xd7\x72\x26\xf2\xe7\xbc\x10\xcd\x96\xe6\xe4\x20\x62\x7e\xa3\xcd\xde\xfb\x8e\xac\x57\x72\xca\x78\x2e\xac\xd2\xe2\x9c\x71\x17\x86\x01\x1b\x39\x92\xa4\x45\x66\x46\x46\xe5\xb4\x95\x8d\x36\x6b\xec\xb9\x76\x26\x64\xcb\x00\x95\x3b\xc3\x24\x17\x46\x8b\xa3\x6a\x3e\x9b\x96\x1e\x9c\x4c\x08\x14\x72\xa6\x60\xa8\xed\xe5\x9b\x54\xdd\x1a\x70\x08\x82\x06\xbd\x01\x09\x28\x48\xc4\x15\x5c\xf5\x3f\xd0\x58\x33\xce\xce\x06\xc9\xc5\x19\x03\x85\x55\x29\x27\x46\xcc\x6f\x64\x7c\x8d\xd3\xee\x7f\x64\x92\x35\x1b\xff\x93\x35\x5a\xd4\xfb\x76\x11\xc6\xa8\x43\xf4\x63\x36\x5e\xf6\xbc\xe9\xaa\x04\x6f\x3c\x7a\x07\xbb\xe7\xe4\x35\x71\xa2\x88\x49\xe4\xaa\x24\x91\x04\xfe\x47\x79\x49\xb7\xcf\xb3\xbe\x48\xe7\x64\x3e\xbb\x61\x6e\xac\x47\x9a\x3a\xac\x94\x03\x8b\x5c\x1c\x24\xbd\x55\x10\x3c\x84\xad\x9a\x2d\x6b\xb9\x4c\x59\x54\xe3\x59\x49\x9a\x45\x0b\xeb\xdb\x82\x1e\xb3\xae\x2d\x14\xd6\xb7\x85\x4b\xb2\xae\x2d\x14\xd2\xb6\xe4\xf9\x6f\x9b\xb8\x6f\x5e\x7e\x05\x92\x1f\x2b\xf1\xd2\x47\xb8\x9b\x89\xa4\xe2\xb2\xdf\xda\x01\xc9\xf4\xf7\x44\x7d\xf1\x6a\x64\xc1\x6b\xf6\x97\x18\xe7\x1c\x6d\xa1\x5f\xfa\x61\x83\xc3\xa0\x07\x10\x88\x93\xfc\x5c\xea\xa7\x57\xae\x4e\x34\x29\x57\x3f\xbd\x44\x1b\x7c\xe6\x19\xd8\x90\x50\x1a\x63\xeb\x03\x8b\xff\x61\xd9\x5f\x89\x28\xdf\x35\x20\x1f\x2d\x3f\x51\x5f\xdd\xff\x48\x2f\x3e\xf6\x94\x7d\xbc\x66\xdb\x91\x7a\x94\xd5\x7f\xa7\xed\x58\x43\x44\xa6\xf5\xbb\x41\x25\x3a\x13\x2c\x3a\xbc\x49\x5a\x32\xda\x85\xba\x00\x82\x5e\x40\x59\x42\x76\xf3\xc6\x99\xcf\xc2\x68\x1d\xf5\x59\xd0\xe8\x19\xac\x7e\x86\xe3\x55\xfd\x0c\x27\x07\x22\x7c\xd8\xd3\xe1\xc2\x7c\x38\x6c\x87\x40\x18\x13\x1c\x86\x8f\xb3\xde\x97\x43\x5d\x05\xb0\x0f\xfe\x50\x68\x66\x23\x67\x28\x44\x82\xfb\xc4\x2d\x5d\x25\xaf\xda\x84\x20\x21\xda\xaa\x0d\x8c\xad\x34\x5e\xba\x79\x99\x36\xd8\xd3\xc0\x92\x8a\x62\xaf\xba\x7a\xe8\x6f\x8a\x30\x12\x0f\x53\x95\x05\x7b\xea\x0e\xf1\x36\x4d\xbe\xa5\xbe\xc6\x1e\x97\xd6\xf6\xc8\x25\x12\xf2\x8a\xde\x37\x42\x6b\x84\xc6\x29\xdb\x65\x49\xc0\xd1\x45\x36\x83\xf2\x74\xf5\xcf\x40\x33\x89\xf0\x19\xbd\x33\xbf\x2d\xbe\xaf\xc2\x96\xfb\xd9\x20\x2a\x0b\xb8\x1f\x41\xa1\x79\xc3\xb3\x82\x63\xbf\x0f\x82\x1c\xf5\xc3\x73\xf2\xa5\x68\x63\xc0\xb5\x65\x06\x59\x91\xac\x47\xe5\xea\x37\x18\xe0\xb3\x74\x1a\x9f\x57\xfd\xd0\x82\xd7\xe7\x3b\x93\x1f\xcf\xbc\x40\x43\x79\x5c\x97\xc4\x1c\xc3\xff\x6e\xcb\x11\x57\xa1\x6b\xca\x1f\x63\x59\x47\x6a\xf1\x7b\x42\x64\x1e\xe3\x7a\x06\x0d\xce\xbc\xd0\x92\x2e\x73\xb9\x1c\xb2\xbf\x1b\x96\x73\xfd\x1f\xc0\x31\x1e\x89\xb1\x04\x9b\x9b\xa4\xd0\xb7\x8e\x6d\x8a\xc9\xbf\x6b\xc6\x84\x99\xc4\x65\x5e\xc7\x0e\xcf\x63\x2f\xc9\xc2\xaf\x98\xf5\x2a\xe2\xff\x58\xcd\x7e\xf5\x91\x95\xe0\x50\xb2\xcd\x1a\xb3\x24\x1b\xc8\x59\xa3\x0d\x17\x74\xa1\x8d\xcd\x03\xa6\x91\x66\x70\x5a\x3e\x5d\x23\xf1\x10\xec\xbe\xe1\x19\x3f\xf7\xd9\xa1\x65\x82\x45\x2c\x9b\x63\xaf\xef\xc2\x08\x99\x28\x23\xde\x75\xb5\x42\xe2\x44\x6f\xd8\xe8\x76\xd3\xf6\x2a\x84\xc9\x26\x19\x55\xc2\xe7\x62\xb8\x55\x4d\x56\xa8\x08\x2d\x2e\x38\x91\xc5\x0c\xb7\xba\xe4\x5b\x98\xba\x70\xa9\x5d\x0f\x3d\x92\xaa\x49\x12\xf5\x5b\xc6\x1a\xff\xd4\x1f\xdd\x48\xe0\x92\x54\x66\xb6\x2b\xda\xb0\xed\xd3\x12\x85\xbb\x5e\x71\x65\x14\xcb\x27\x75\xd4\x82\x97\x47\x54\x41\x0c\x48\x60\x9c\x86\xbb\xc3\x24\x1b\xbc\x38\x7c\x03\x46\x3a\x08\x26\x5c\x3a\xf5\x1f\x59\xd9\xae\xea\x2f\x80\x1a\x69\x73\x1d\x7c\xb9\x0e\xea\xd0\xf2\x3b\xc1\x2d\xfc\xc7\x5f\xac\x05\x41\x7a\xcc\x7f\xc4\xda\x26\xca\xd0\x32\x23\x0c\x2b\xf6\x33\x1d\x4a\x29\x64\xe0\xd9\xaa\xf9\x3f\x51\x1b\xbe\x4a\x02\x50\xe2\x94\xd5\x66\xf7\xd5\x00\x5a\xed\x90\xc3\x6d\xf9\x6b\xdc\xa6\x1c\x6c\x15\x9f\x57\x4c\x0e\xfa\x88\x18\x1f\x2c\xce\x0e\x1a\xa4\x22\x5d\x61\x5b\x23\xa9\x5d\x59\x24\xdd\xaa\x1f\x4f\xca\x9b\x97\x4e\x0a\x88\x77\x44\x05\x90\x49\x0f\x38\x4a\x06\x03\x91\x35\xb6\x71\x31\xab\xb5\x56\xda\xcf\xd2\x48\x0c\x97\xdf\x50\xe2\x29\xd1\x66\x7a\x3f\x6d\x8a\x4e\x33\xf8\x25\xb3\x74\x5a\xbc\xed\x16\x93\x34\x29\x9b\x8d\x4e\xa3\xf5\x7e\xe3\xb4\x75\xda\x0a\x77\x29\x9c\x27\xdc\xad\xde\x37\xda\x84\x64\x70\xd5\x7f\xd5\xe7\x0d\xc4\x11\x2f\xce\x1d\xa8\x6d\x76\xea\xf3\x07\xfa\xc6\xd3\x36\xfa\x4f\xd4\xe8\xb9\xa6\x54\x5b\x28\xdb\x52\x6a\x1f\x08\x8e\x76\xd4\x64\x0f\x3e\x10\x22\x60\xcc\xe6\xee\x24\x7f\xa1\x41\x42\x88\x3f\x77\x82\x66\x69\x5a\x83\xde\x74\xb6\x5a\x9f\x23\x54\xd1\xf7\x5f\x57\xa8\x22\xb3\x92\x7b\x79\x2e\x67\xc4\x8f\xd6\x06\x3d\x30\x1f\xf0\x1a\x26\x1f\x34\xb7\x13\x0b\x77\xa3\x8b\xea\x22\x76\x3c\x79\xe2\xc2\xb1\xe8\xaa\xf3\x22\x76\x18\x68\x2e\xb0\x12\x0c\xa5\x1e\xfa\xdf\x82\x9a\xf3\x80\x6b\x58\xb6\x05\xce\xbb\x16\xf6\xf7\x1b\x41\xcd\x79\xb0\x35\x2c\xdb\x02\xd6\xb8\x1e\x74\x50\x71\x1e\x64\x84\xf4\x45\xa2\x27\x54\xb7\xdb\xee\x99\x0b\x1c\x55\x41\x12\xb3\xf2\xd5\x2a\x2e\x9a\x86\x5e\xc0\x6a\x15\x83\x8b\x7a\x1d\x5c\x85\xf0\x2c\xfd\xf0\x75\x9d\xa5\x4a\xfc\x1d\x4f\x2b\xaa\xb6\xc1\xfe\xf2\x3a\x49\x44\xd1\x44\x5e\xae\xcd\xcc\x63\xd2\x99\x88\x26\x68\xf2\x99\xb0\xbf\x9b\x78\xc6\x60\x22\xba\xc3\x12\x30\xfa\x04\xbe\x1b\x25\x16\x93\xd2\x85\x84\x7e\x9f\x9c\xee\x90\xcf\x5d\x17\x39\x8c\xed\xd6\x7c\xff\xf4\x49\x9b\x2b\xd0\xf2\xbe\xcc\x86\xc9\xf9\xd4\xb4\x04\xb5\x3d\x3c\x93\xbf\x81\xd9\x7f\xc3\x92\x8c\x54\x6f\xd1\xa6\xb3\x3c\x29\xbd\x66\xf1\x05\x36\x33\x27\x2d\x3f\x88\x2b\xfa\xbb\xb5\xc3\xae\xd9\xb5\xc1\x61\xb7\xa2\x44\xb9\x08\x0b\x57\x4a\x2d\xd8\x2b\x4a\x5e\x26\xfd\x77\x66\x29\xd5\x70\x5d\x71\xab\xba\xf8\x04\x50\x77\x62\xec\x53\x29\xc8\x16\xce\xd9\x83\x3b\x0f\x8a\x3f\x84\x1d\x33\x74\x52\x63\x07\x8e\x57\xf3\xf3\x06\x21\xa2\x01\x03\xe3\x46\xd7\x95\x9a\xf3\x80\xdb\x4a\x5f\x84\xf0\xb8\x0e\x6a\x44\xaf\xaa\x8b\x36\xfb\x20\xae\x0a\x73\x0c\x4a\x43\x7e\x3e\x5e\xef\xd0\x03\x94\xc0\x00\x0c\x2a\xa8\x16\xdd\x24\x1b\x88\xcb\xc3\x61\x33\x69\xb1\x7f\xec\xb2\x8d\x16\xa8\x60\x93\xcc\x60\xf7\x7d\x8d\xab\x16\x1b\xba\x23\x5e\x1c\xce\x32\x83\xb5\x78\xfb\xc3\x00\x92\x16\x6d\x8c\x43\x78\x9f\x9c\xb2\x5d\xd5\x27\x1c\x43\x8b\xba\x58\x18\xcc\xce\xb7\x1c\x6f\x26\x59\x51\xf2\xac\x2f\xda\x14\x5b\xcc\xd0\xef\xdb\x62\x66\xfe\x90\x43\xaf\xa2\xaa\x59\x8e\x14\xfd\xcc\xc4\x0c\x52\x22\xec\xe7\xb9\xcc\x9b\xdf\x3c\xe7\x19\x68\x9a\x79\x9a\xda\xd0\x2c\xbc\x60\xdc\x9e\xa7\x6f\xf0\x98\xd1\xa1\xd5\x6a\xf1\x9b\x85\x48\x87\x6d\x00\x66\x87\xa6\x3e\xf9\xbd\x1f\x19\x6f\x4e\x3d\x04\x10\x2e\x8d\x78\x91\x35\x4a\x94\x58\x25\x59\x52\x26\x3c\x4d\x0a\x31\x60\x1d\x56\x4c\x27\xa0\x75\xa3\x35\x54\x0f\x62\x80\x43\xd3\x8b\x08\x33\x78\xf0\xc0\x09\xea\xd4\xef\xdd\xdd\x5d\xf6\x0d\xe2\xc9\x37\x8a\x90\x55\xca\xdc\x2c\xd9\x53\xfc\x0c\xe9\xc7\x87\xc1\x66\x18\x27\x82\x66\x31\xed\x01\x09\x6f\xe3\xb0\xe0\x6f\x33\x55\x0d\xdc\x15\xa0\x70\xcf\x76\xa1\x46\x17\x14\x66\x53\x5c\xa9\xe8\xd6\x1c\xab\xba\xea\xbe\xca\x45\x51\xa8\x61\x40\x20\x65\x91\x80\xfa\xa1\x27\xa0\x31\x83\x54\x11\xa6\x8b\x36\x68\x93\xbf\x61\x0f\x59\x65\x2c\xb0\x54\x66\xf4\x0e\x7f\xd9\xae\x21\xbf\x3a\xb8\x04\x19\xa0\x37\x5c\x4a\x00\x3f\x2a\xc4\x36\x3b\xbf\x0d\x87\x0c\x6e\x3c\xb7\x38\x34\x20\xa5\xb6\x5f\x37\x64\x5f\x47\xa8\x64\xf4\x06\x31\x4c\x36\xbb\x36\x14\x95\x2c\xae\x1e\x5f\xe1\xc7\xf3\x7b\x1a\xff\x5e\xb3\x41\x6e\x6c\xc4\xfb\x60\x97\x54\xb1\x11\xa1\x1c\x3f\x43\x24\x5b\x41\x80\x21\x87\x0e\x46\xb4\xc7\x7e\xa9\x8b\x22\xa4\x6b\x2c\xeb\x42\xe2\x79\x90\x84\x34\x00\x2b\x68\x88\xbf\x23\x9f\x11\x50\xe5\xd5\xd2\x0c\xdf\x49\x44\xcf\xce\x77\x12\xd1\x5b\xed\xbb\x89\x98\xc5\x5f\xd5\x39\xc4\xfc\xdb\xfd\xa5\x10\x25\xf2\xa3\x3a\xbe\x97\xdb\x71\x5f\xb4\xa2\xab\x97\xb4\xae\x13\xaa\x5c\x5b\x78\xe7\xb5\xf0\x2a\xd1\x8f\x2a\x20\x2b\xf6\x52\x73\x56\x8c\x60\x8a\x33\x90\xa2\x0c\xa6\xc3\x4b\xcf\x24\xca\xc8\x4b\x9f\xcb\xac\x84\xa0\xfb\x51\x33\x87\xa0\x56\x75\xec\x44\xa3\x01\xac\xba\xee\x6c\xdb\x13\xfa\x78\x6b\xab\xc5\xea\xfe\x82\x53\xd9\xc6\x79\xac\xb6\xf7\xd1\x99\x2f\x19\x1d\xc1\x5d\x1a\x71\xcc\x37\xd5\x28\xf9\x39\x51\xb6\xf3\xf3\x98\x19\xc7\x7c\x13\x8e\x5c\x14\x4e\xfc\x5d\xc7\xb7\x38\x45\x71\xc9\xcf\xbd\xec\x0e\xa7\x2d\xdf\x10\x92\x9f\xc3\xed\x81\x46\xb9\x15\xbf\x0b\x22\x34\xf6\x25\x77\x2d\xd5\xb2\xed\x06\xe3\x64\xd9\xf5\x16\xd2\xe6\x76\xb5\x06\x99\x74\x17\xac\x5c\xc9\x09\x96\x34\x32\x38\xc1\x92\x2f\x4f\x32\xc7\xbb\x4f\x30\xcc\xb0\xa2\xaa\xd3\x00\xa3\x08\x03\x6a\xe5\x53\xb8\x7c\xc4\x47\x75\xed\x7a\xc7\xc2\xa5\xac\xad\x82\x57\xf2\xf3\x1a\x28\x24\x43\x52\xa4\xd8\xa6\x47\x8a\x94\xf5\xa4\x4c\x31\xd7\x90\xe9\x35\x22\x1d\x83\x8e\x41\x34\x1a\x17\x4c\xd9\x75\x0a\x1f\xaf\x7f\xfb\x1a\x1f\xaf\x5a\x2c\xef\xb8\x05\x5e\x14\xc9\x39\x98\xe5\x39\x22\x87\xc4\xac\xf2\x48\xdd\xc4\x47\x6a\x78\x2f\x79\x0f\x55\xed\x6b\x4e\xef\x18\xc5\x21\x5b\x38\xea\x8e\x4a\x32\x5d\xcd\xf0\x5b\x4b\xf1\xe2\xd8\x04\xde\x03\xc8\x04\x23\x23\xae\xaf\x34\x2c\x85\x5f\xf8\x98\xac\xf2\xe4\x7f\xbe\xc4\xfe\x98\x2f\x31\x17\x7a\x92\xde\xe4\xf8\xc5\x64\xe7\xe9\x23\x01\x73\x89\xc5\xb4\x39\x51\x9f\xa4\x25\xd1\x97\x82\x9f\x7f\x80\x31\x5a\xa5\xda\x2a\xb0\x9e\x02\x3a\xe2\x0c\xa8\x2a\xc0\x92\x2c\x13\xb9\x9f\x1d\x0b\x3f\x84\x49\x11\x6a\x93\x94\x2d\x75\x41\x39\x43\x26\x33\x00\xcc\xff\x83\x7d\xc5\x6e\x2c\x30\x02\xa2\x24\x9d\xed\x9a\x45\xeb\x7a\xdf\x6d\x6d\xdc\x01\x9c\x8b\x5d\x75\xfb\xd1\x63\xcc\x3c\x00\x5d\x8f\xb7\xa0\xca\x51\xf2\x34\x73\xeb\xe4\xc5\x76\x20\x9e\x76\xba\x02\x6d\xaf\x03\x5c\xad\xc5\x9d\x10\xe2\x90\xaa\x4a\xef\x8f\xa8\xc0\x73\xd3\xbb\xf6\xa2\x82\x1a\x78\xcd\x8f\xb4\xdd\x36\xfd\x41\x2e\xee\x6d\xb2\x5f\xd7\x8e\x05\x04\x9b\x26\xb3\x35\x76\x37\x35\xed\x06\x6d\x96\x6d\xd6\xaa\x4c\xc8\x43\xbe\xd0\xad\xc2\x87\xda\x45\x56\xdd\xce\x05\x06\x40\x19\x87\xa0\x3a\x41\x4f\xbf\x0d\xe1\x1b\xea\x79\x16\x87\xed\x01\x5c\x8f\x7d\x51\x3b\x84\xfb\xdf\xed\xdf\x1d\x5b\x61\x40\x86\x6c\x85\x1d\xc8\x8d\x98\x0b\x85\x5c\x71\xd6\x42\x21\x12\x1a\x1b\x9a\x35\x8b\x77\x80\x61\x55\x68\xec\xab\xcf\x30\x8c\xba\x9c\x1d\x48\x23\x43\xc6\xe5\xfb\x8d\x3f\x19\x97\xaf\x92\x71\xf9\x53\xf1\xf0\xa7\xe2\xe1\x0f\xa0\x78\xd0\xc9\x26\xe6\xc5\xe4\xff\x7e\x33\xa8\x38\x17\x38\x86\xc8\xf8\xb2\x8c\x74\x80\x8a\x86\x7f\x6e\x23\x75\x23\xfc\x31\xe1\x98\xe3\x58\xec\x9a\x7e\xf4\x93\xbb\x55\x93\x05\x45\x44\xb1\xa1\xb8\x16\x04\xb3\xe6\x8a\x07\xb6\x59\xd3\x21\x80\x49\x18\x68\xd9\xfb\xcf\x1f\xe0\x6d\xf0\xa7\x96\xe6\x4f\x2d\xcd\x9f\x5a\x9a\xdf\x50\x4b\x93\x49\xe9\x45\x00\x53\xbf\x9b\x5e\x14\x7f\xb5\xec\x2e\x2a\xb1\xb5\x2e\x59\x46\xa9\xa3\x8d\x53\xeb\x75\x3a\x58\xe1\x0e\x55\x3a\xef\xec\x5d\xf3\x7f\x50\xa3\xa3\x4d\x7e\x97\x50\xe8\xe8\x65\xb8\xa9\x3e\xa7\x12\xea\x0b\x14\x0e\x60\x2c\xb4\x9c\x82\x87\x93\xaa\x77\xa2\xdf\x89\x8a\x3a\xba\x1e\x98\x66\x2b\xd2\xcb\xe1\x70\x58\x88\xd2\x67\xd7\x07\xbc\xe4\x95\x6e\xf4\x3a\xaa\x4b\x11\x2a\x74\x25\xb6\x6c\x75\xc7\x7c\x42\xbc\xfb\xd5\x23\xa2\x2a\xd4\xa7\x2d\xde\x3b\x04\x70\xf6\xdf\x6e\x50\x49\xf1\x82\x97\xfc\x45\x92\x97\x57\x73\x46\x65\x63\x8e\x68\x87\x2b\xbf\xd4\xf6\xfb\xff\x1c\x1f\xbe\xd5\x12\xf6\x64\x78\xd5\xac\xcc\xbb\x0a\xa3\x05\x74\x78\x61\x3b\xac\xbb\x48\x97\x41\x63\x8c\x5c\x07\xf3\x9c\x42\xa0\x33\x70\xa4\x7f\x23\x07\xc9\x30\x01\xaa\x61\x40\x08\x63\x51\x6e\x92\x2c\xaa\xff\x20\xe5\xc5\x36\xfb\xdb\x86\xcd\x09\x31\xcc\x88\xc2\x69\x98\x35\xc3\x65\x70\xcb\x44\xd7\x55\x8f\xbe\x1a\xf7\x86\x06\x7d\x51\x75\xb6\xe1\xff\x3d\x23\xfd\xeb\xd8\xd6\xd6\xcd\x51\x9d\x3a\x40\x48\xb0\x89\xad\xc1\x63\x78\xc5\xa9\x6e\x76\x59\xb8\x1b\x56\x17\xb5\xbe\xce\x0e\x86\x86\xb6\x26\x70\xef\x23\x63\x53\x26\xbc\x14\x83\x36\x1b\x25\x03\x8c\xd7\x8b\x07\x40\x8b\x74\x5c\xeb\x52\x32\x0e\x9e\x3f\xc3\x94\x17\x23\x26\x87\x6c\x9a\x81\x5d\xee\x00\xa5\x84\x59\x59\x0d\x91\x63\x62\xd3\x41\x48\x80\x1a\x04\xa3\x4b\x38\x91\x26\xa1\x46\x83\xf7\x0a\x99\x4e\x4b\xe1\x19\x99\x47\x33\xa5\xf8\x0e\xc1\x26\x1c\xbe\x5b\xee\x8a\xa3\x12\xe6\x42\xe3\x25\xff\xab\x3e\x4f\x7f\xb5\x4f\x11\x7a\xca\x8c\x27\x01\x55\x2e\xa2\xab\x71\xa4\x6d\xb7\xf4\xfd\x49\x20\x93\x43\x4d\x55\x55\xd6\x8e\xcc\xba\xae\xbe\x29\x77\xfe\x9a\x86\x70\x59\x71\xe1\x5a\x75\x05\xcd\x5f\x66\xf6\x6d\x9c\x5c\x61\x92\x76\xd5\xe0\x19\xf5\x45\x9e\x43\x33\xef\xdf\x0f\x31\x8d\x3d\xad\x20\x9f\xf3\x62\x66\xdb\xd4\xc2\xb8\xa6\xeb\x57\xc9\x22\x4a\x1d\xe9\xf5\xc1\x83\x6a\xb7\x80\xca\x4f\x59\xa3\xb1\xa0\x5b\xb8\x6e\xe6\x1d\x2c\x82\xc9\xa4\x4b\x85\xcc\x95\x3e\x0d\xd2\xc0\xbd\x14\x43\xf3\xeb\x5a\x52\x67\x43\x13\xfc\x15\xe0\xfd\xd5\xe2\x40\xe4\x3c\xfb\xfd\xf8\x2e\x07\x1a\x3b\x63\x90\x42\xf4\x74\x08\x1a\xad\xad\x0a\x49\x84\x1d\x33\x05\xd5\xc3\xb6\xfa\xbf\x36\x34\xdf\x46\x20\xd7\x11\xda\x75\x07\x66\x11\x86\xb3\xfb\x12\x56\x11\x15\x73\x08\xcb\x88\x10\x6b\x08\xfb\x2d\x30\x86\x70\x58\x44\x8c\x21\xdc\xc7\x15\x8c\x21\xee\x22\x94\x0b\xbd\x1a\x0d\xef\xbb\x54\x87\x18\x36\x74\x89\x1e\x75\x7c\xd1\x94\x1b\xf5\x84\x77\x5c\xec\x67\x72\xf8\x15\x3f\xe0\xac\x35\x48\xc1\xa7\x4f\xcc\xd5\xf7\x1c\xc1\xc2\x36\x5e\x21\x3d\x5e\xf5\xf3\x0d\x7d\x82\xe9\x7d\xf4\xe0\x01\xe9\xd8\x0b\x52\x45\xfa\xb4\x1a\x8b\x4a\x77\xcb\x45\x5c\xfd\x9c\x91\x57\x70\x1c\x03\x51\x94\xb9\xbc\x5a\xb8\xcf\xde\xfa\xd4\x74\x18\xac\xe1\x32\x3d\xd1\x85\x0d\x1d\xdc\xf0\x2b\x1e\xe8\xea\xbe\xd4\x8d\x93\xd6\xaf\x1b\xa7\x0f\x73\x15\xdb\xa0\xc9\x92\x71\x36\x7c\x4c\x74\x71\x4c\xe8\x67\x2f\x7c\xcc\x58\xb3\x9f\x15\x1d\x1e\xc1\x26\x5b\x87\xba\x0b\xc2\xbb\x49\xd3\x8e\x8f\x8e\x65\xd5\x81\x02\xdd\x98\x08\xab\xbb\xcd\x6a\xb9\x5f\xf2\x22\xa8\xec\x8f\x7d\x2f\xd1\x4d\xb2\x63\xc2\xeb\x84\x70\xcf\xcc\xf3\xc9\xf5\x21\xcc\x61\xad\xbc\x43\xb6\x0b\xe2\x17\x23\xbe\x35\x5a\xa9\x66\xe4\x7d\xd6\x6c\xe9\xa5\xfa\x05\xf5\x5c\x84\x3e\xcf\xf5\x20\x0d\x7c\x47\xbd\x9f\xed\xea\x2c\xb7\xdd\x9f\xd5\xa5\x5a\x5f\x67\xe6\x3c\x33\x9e\xe9\x15\x57\x5c\xef\x98\x7f\x10\xac\x98\x62\xd4\xa7\xfc\xaa\x1c\x25\xd9\xb9\xa2\xfb\x85\x65\xb1\x80\x05\xce\x73\xd1\x27\xec\x32\x1f\x42\xf2\x2b\xa1\x2a\x53\x46\x3b\xb2\x50\x35\x74\x24\x76\x3e\xbc\x63\x58\x77\x40\x82\xb3\xea\x91\x67\xda\x6f\x2d\x5d\xd3\x00\x96\x38\xb0\x37\x8c\xc1\xb4\x55\x1f\x83\x69\xab\x3e\x08\x53\xc5\x0a\x63\xab\x6a\xaa\xc1\x7c\x0b\x0b\x53\x2f\xb4\xb1\x88\x53\x83\xad\x55\xc8\xc1\x56\xb7\x06\xdd\x98\x4f\x0e\x74\x65\x77\xfc\xe9\x94\x42\x83\xc4\xad\xdb\x5a\x24\x6e\xcd\x35\xf9\xf0\x82\xc1\x78\xc3\x57\x1f\xec\x10\xeb\xec\x19\x9d\x85\x48\x60\xf3\x61\x3f\x56\xfc\x9c\x75\xc8\x41\x38\xd7\x15\xf7\xe6\x55\xac\x3d\x58\x8d\xc5\x07\xab\x72\x56\x74\xa0\x86\xbb\x8f\xbd\xa6\x1d\x7e\xbb\xfa\xef\xbc\x28\x38\xf1\x97\x51\xac\x9d\x7e\xbb\x44\x5e\x34\xcd\xd6\xdc\xc0\x98\xf5\xf3\x25\xba\xaf\x77\x41\xc8\x4b\x32\x5e\x8d\x16\xcd\x5f\xfc\xdf\x1f\x3d\xf4\x19\x6e\xbb\x2d\xa2\x88\x55\xe0\xcd\x43\x96\xca\xad\x69\xc5\xd9\xda\xeb\xa2\xcd\x1a\xea\xb9\xd0\xa1\x18\x15\xac\x60\x6b\x39\x08\x97\x1d\x39\x2d\x3b\x72\xd8\xe9\xc9\x69\x36\xe0\x79\x02\x81\x96\xdc\xaa\xe2\x3b\xc2\x36\x23\xdb\x5e\x31\xc7\xf1\xde\xd4\x24\xdd\x05\xed\x35\x76\xac\x88\x89\x8e\xb7\x3a\x1e\x59\xde\x66\x21\x07\x39\x87\x86\xbb\x65\xac\x32\xa3\x2b\x58\xfe\xd0\x9b\x50\xef\x55\xbc\x22\x3e\xeb\xdb\x74\x27\x49\x98\x80\x70\xab\xb6\xc3\xad\x0a\xab\xc6\xf6\x64\x9b\xec\x49\x0d\xa3\xb1\x8c\x75\x12\xab\xb3\x50\xb2\x08\x5a\xfb\x4e\xae\xb7\x54\xaa\xb6\x0d\x24\x25\xb7\xb5\x58\x62\x71\x03\x6a\x3c\xe5\x75\xf6\xd3\x5a\x98\x7e\x87\x26\x4e\x06\xe2\x5c\x83\xec\xd5\xe1\x7d\xad\x16\x53\x34\x59\x4f\xdd\x38\x9a\x21\x7f\xe9\xee\xf0\x02\xba\x0a\x78\xc4\x3a\x23\x71\x55\x95\x30\x8a\xf5\x4b\xf8\x45\x4c\xb9\xde\x19\x46\xac\x62\xab\x4e\xf6\xc6\x06\xf3\x88\x44\x58\x88\xcc\xdc\xc8\xc1\xc9\x2c\x3f\x5e\xc7\x0d\xde\x0d\x5e\x87\x66\x63\x9b\xf3\xcc\xc6\x9c\x19\x87\x06\xf8\xcb\x2f\xcb\x9a\x90\xc5\xcd\x22\xa2\x00\x03\x63\x32\x6a\x4a\x06\xf4\x68\x4e\xbc\x07\x37\xe4\xf3\x54\xf6\x78\xda\x62\x1f\xd7\xbf\xfd\xf6\xfe\x1a\xfb\x96\xfd\xd7\x30\x49\x21\x80\xda\x45\x22\x66\xec\xbf\x93\xfe\x07\x5e\x14\x2c\x4d\x7a\x39\xcf\x21\xf0\x16\x52\x0d\x48\xa5\x07\xab\xad\xcf\x5a\xc1\x32\xc1\x21\x70\x56\x92\x93\xcc\x97\xfa\xe5\x54\x74\x01\xf6\x85\xc8\x41\xd9\xbc\xd9\xdd\xdc\xea\xfe\x00\x9f\xd2\xa4\x2f\xb2\x42\xa8\xbf\x9f\xcb\xc9\x15\xe6\x31\x6e\xf6\x5b\x6c\x6b\x63\xf3\x09\x7b\x29\x06\x22\x4f\xfa\x92\xfd\xbf\xc9\x85\x4c\x25\xf4\x0a\xe1\x85\x93\xde\xb4\x94\xea\xf1\xf2\xad\x6a\xf9\x4e\xe4\xe3\x04\xf5\xd8\x49\xc1\x46\x22\x17\xbd\x2b\x76\x9e\xf3\x0c\xe4\xf9\xc3\x5c\x40\x42\xb8\xfe\x48\x3d\xb3\xda\x20\xbf\xcf\xae\x98\x1a\xb4\xcc\x98\xec\x95\x3c\xc9\x30\xd0\x58\x5f\x4e\xae\x14\x3c\x08\x2b\x9b\x14\xac\x90\xc3\x72\xc6\x73\x9c\x2d\x2f\x0a\xd9\x87\x97\x0b\x1b\xc8\x3e\x68\x20\x39\xea\x4a\x92\x54\x14\xea\x41\x21\xd8\x37\xc7\xba\xc5\x37\x2d\xe8\x67\x20\x78\xaa\x00\x26\x98\xe3\xce\x94\x42\xa0\x0e\x39\x85\xfc\x88\xb0\xf3\xa0\x5f\x4f\xb2\x7e\x3a\x85\x90\x67\xa6\x38\x4d\xc6\x89\xee\x44\x35\x87\xc5\x51\x73\x56\xa0\xa7\x05\x28\xba\x27\x57\x6d\xc4\x63\xf5\xaf\x80\xf9\x4d\xa6\xbd\x34\x29\x46\x6d\x36\x48\x0a\x5c\x29\xd1\x66\x85\xfa\x08\x4b\xdd\x56\xb3\x59\x97\x39\x2b\x44\x0a\x83\xeb\xcb\x49\x22\x0a\x13\x4b\xd7\x8c\xb1\x8d\xd9\x12\xa5\x5a\xa7\x71\x52\xea\xe5\xc2\xa4\x65\x23\x9d\x1f\xd1\xce\x27\x81\x51\x0d\xa7\x79\x96\x14\x23\x4c\xc2\x35\x90\xac\x90\xd0\xaf\xc2\x68\x13\xb2\x6d\x28\xd3\x14\x73\xac\xf5\x65\x36\xc0\xd4\xde\xdb\x7a\x17\x4f\x46\x82\xf1\x9e\xbc\x10\x30\x2d\xc4\x84\x4c\x96\x49\x5f\xe8\xc4\x8d\x49\x81\x83\xc1\x9d\xd6\x45\xc5\x88\xa7\x29\xeb\x09\xbd\x7c\x62\xa0\x16\x9b\xfb\x33\xcb\xd5\x30\xf4\xcb\x33\x65\xea\x04\xa9\x7e\xc3\x19\x77\xcd\x38\x5e\xed\xb3\xe3\xc3\x97\x27\x3f\xef\x1d\xed\xb3\x83\x63\xf6\xee\xe8\xf0\xa7\x83\x17\xfb\x2f\xd8\x37\x7b\xc7\xec\xe0\xf8\x9b\x36\xfb\xf9\xe0\xe4\xd5\xe1\x8f\x27\xec\xe7\xbd\xa3\xa3\xbd\xb7\x27\xff\x66\x87\x2f\xd9\xde\xdb\x7f\xb3\xff\x3e\x78\xfb\xa2\xcd\xf6\xff\xf5\xee\x68\xff\xf8\x98\x1d\x1e\x29\x68\x07\x6f\xde\xbd\x3e\xd8\x7f\xd1\x66\x07\x6f\x9f\xbf\xfe\xf1\xc5\xc1\xdb\x7f\xb2\x67\x3f\x9e\xb0\xb7\x87\x27\xec\xf5\xc1\x9b\x83\x93\xfd\x17\xec\xe4\x10\xfa\xd4\xd0\x0e\xf6\x8f\x15\xbc\x37\xfb\x47\xcf\x5f\xed\xbd\x3d\xd9\x7b\x76\xf0\xfa\xe0\xe4\xdf\x6d\x05\xeb\xe5\xc1\xc9\x5b\x05\xf9\xe5\xe1\x11\xdb\x63\xef\xf6\x8e\x4e\x0e\x9e\xff\xf8\x7a\xef\x88\xbd\xfb\xf1\xe8\xdd\xe1\xf1\x3e\xdb\x7b\xfb\x82\xbd\x3d\x7c\x7b\xf0\xf6\xe5\xd1\xc1\xdb\x7f\xee\xbf\xd9\x7f\x7b\xd2\x65\x07\x6f\xd9\xdb\x43\xb6\xff\xd3\xfe\xdb\x13\x76\xfc\x6a\xef\xf5\x6b\xd5\x9b\x02\xb7\xf7\xe3\xc9\xab\xc3\x23\x35\x50\xf6\xfc\xf0\xdd\xbf\x8f\x0e\xfe\xf9\xea\x84\xbd\x3a\x7c\xfd\x62\xff\xe8\x98\x3d\xdb\x67\xaf\x0f\xf6\x9e\xbd\xde\xc7\xde\xde\xfe\x9b\x3d\x7f\xbd\x77\xf0\xa6\xcd\x5e\xec\xbd\xd9\xfb\xe7\x3e\xb4\x3a\x3c\x79\xb5\x0f\x93\x54\x35\x71\x98\xec\xe7\x57\xfb\xea\xab\xea\x75\xef\x2d\xdb\x43\x92\x73\xf8\x92\x3d\x3f\x7c\x7b\x72\xb4\xf7\xfc\xa4\xcd\x4e\x0e\x8f\x4e\x6c\xeb\x9f\x0f\x8e\xf7\xdb\x6c\xef\xe8\xe0\x58\xad\xcc\xcb\xa3\xc3\x37\x30\x53\xb5\xba\x87\x2f\x55\xad\x83\xb7\xaa\xe9\x5b\x4d\xbb\xd4\xca\xfb\x1b\x74\x78\x04\xbf\x7f\x3c\xde\xb7\x30\xd9\x8b\xfd\xbd\xd7\x07\x6f\xff\x79\xac\x1a\xeb\xb9\x9a\xfa\x6a\x93\xd7\xc1\xba\x22\x29\x9e\xe5\x72\x56\x60\xa8\x48\x64\xd8\x30\xb2\x1e\x46\x59\xb3\xea\x12\x88\x91\xa8\x2b\x98\x83\x1f\x56\xd9\x01\x88\xa9\xcc\xce\x85\x09\xf0\xac\x81\xab\xdb\xea\x7d\x63\x7f\x70\x0e\x31\x48\x4f\xf2\x64\xa0\x1f\x9d\x2f\x93\x5c\x0c\xe5\x65\xe3\x14\xdb\x96\xd8\xea\x85\xce\x72\x0f\x36\x11\x6b\x31\xeb\xd5\x68\x27\xce\x9a\x95\x3d\xdc\x65\x9b\xc8\x62\x2a\x4e\xd4\x4d\xf2\xc1\x03\x96\xf1\x8b\xe4\x9c\x97\x32\xef\x4e\x0b\x91\xef\x9d\x43\x2e\x5f\x6d\x94\x16\x05\xfb\x3e\x39\x35\xb6\x6a\xc8\x7c\x56\x47\xb9\x89\x2c\x21\x64\xf3\xb6\x19\x94\xed\x73\x78\x9c\xf4\x73\x59\xf2\xe2\xc3\x0b\x9d\xec\xab\x39\xcc\x9c\xdf\x09\x5a\x5a\xb9\xc4\x22\xac\x6a\x9c\x6a\x3a\x86\xd4\x06\xdc\x0f\x38\x4f\xf3\x35\xe1\xc3\xd7\x02\x74\xca\x72\xdc\xd2\xee\xbb\x5c\x8e\x93\x42\x74\x73\x01\xe9\x58\x9b\xad\x6e\x39\x12\x59\x34\x93\x40\x75\x54\x0c\xb4\xe3\x56\x1a\x85\x6a\x9a\x1d\x6f\xa2\xb5\x73\x34\xaf\xa1\xe5\xa7\x79\xdf\x36\x71\x63\xa2\x50\xa8\x21\xc0\xc2\xa4\x08\xd1\xee\xc3\x19\x61\x56\x76\x7f\x6b\x7d\x37\x12\x6d\xc0\x54\x4c\x27\xc0\x7e\xbc\x51\xdb\x7a\xc2\x8b\x0f\x0a\xbb\x3d\x14\xf3\x97\x1b\xf9\xa6\xb5\x6f\xd9\x73\xcd\x34\x30\x93\xf4\x6d\xc0\x0c\x2f\x20\x87\x8c\xb3\xb1\x28\x47\x72\xd0\x66\xe5\x88\x97\x8d\x82\xf1\xe2\x2a\xeb\x8f\x72\x99\xc9\x69\x91\x5e\xb1\x81\x62\x27\x14\xa3\xfe\x2d\xeb\x4d\x4b\xb3\x41\xfa\x4e\x1d\x27\x59\x32\x9e\x8e\x61\xfc\xcc\xa8\xd9\xba\x6b\xaa\xd7\xff\x42\xb0\xf8\xd7\xb8\x27\x72\x69\xf4\xfe\xdd\x1f\xcb\x24\x2d\x54\x81\x31\x26\x62\x1f\x5f\xea\x05\xbc\x66\xc3\x4c\x95\xe0\x26\x15\xa4\x60\x4d\x53\x0e\x33\x09\xb4\xf2\x0a\x57\xe4\x69\x15\xeb\xd9\xb6\x87\x20\x7a\x59\x14\xcb\x33\x12\xfd\x0f\x6a\xd7\xd5\x4c\xce\x93\x0b\x91\x29\xa4\x49\xc0\xde\x3b\xa1\x96\x92\xc0\x2b\xe9\xe9\xb0\xda\xf9\x30\x6f\x42\x7b\xd9\xd5\xb5\x05\x70\x22\xb1\xaf\x8e\xeb\x40\x31\x73\xea\x1b\x34\xb3\xb3\x7d\x26\x65\x2a\x78\x76\xcd\x78\x56\xcc\x20\xcc\xfe\xb6\x3f\x94\xa7\x40\x41\x2d\xba\x25\x85\x59\x9f\x66\xd0\x97\x3b\x04\xe7\x02\x5e\x67\x3a\x58\x71\x05\xff\xcd\xd8\x1e\x3c\x30\x35\xbb\xa5\x3c\x86\xd7\x32\x1a\xbd\x56\x00\xc3\x7b\xfa\x3d\x3e\x43\x98\xe9\xff\xb4\x01\x88\xaa\x97\xf6\x9f\xa2\x64\xcf\x8f\x8f\xe1\x99\x30\x55\x4c\x9b\x0d\x01\x2b\xe9\x72\x0b\x63\xdd\xb1\xfa\xfa\xee\x43\xcb\x6b\x0f\x84\x2b\xc5\xf1\x5f\xdb\x6e\xfd\x55\x3b\x17\x25\xc8\x26\x9e\xeb\xd1\x39\x5f\x11\x04\xd6\xb6\xed\x1c\x2d\x37\x59\x0e\xd4\xb3\xe9\xc4\x24\xb3\xdb\x34\xa7\x5d\xaf\xe9\xfb\x53\xa4\xc2\x20\x7a\x7f\x7b\x78\xb2\xbf\xcd\x36\xd9\x8b\xc3\x37\x3a\xf9\x34\x30\xc7\x86\xfc\x82\x6b\xc5\xb9\x28\xcd\x20\x50\x16\x68\x47\x00\x06\xa4\x64\xbb\xec\x02\x3e\x55\x4d\xdf\x9b\x9f\xa7\x6c\x5b\xfd\xa6\x6b\x7f\xa4\x91\x09\x8c\x68\x78\x2e\x32\xb4\x3d\xd3\x81\x75\x47\xb2\x28\x83\xcc\x0d\x37\x5a\xfe\x34\xb2\xfe\x16\x8d\x6d\x29\xf6\x5f\x59\xfd\x77\x76\x58\x66\xc2\xf1\x85\xc6\xa0\xee\x0a\xdd\x5e\x9d\xbc\x79\xdd\x08\x56\x5b\xd7\x34\x4b\xee\x7f\xed\x92\xa9\x7f\xfa\x64\xbf\xaa\xe9\xd7\x2d\x56\xd1\xcf\x65\x9a\x2a\xf6\x18\xdb\xde\x1d\xae\x2e\xb7\x58\xd8\x7f\xdd\x9a\x1d\x43\x29\xae\x9c\xbf\x6a\xeb\xeb\x7a\x1a\xac\x27\x07\x57\x6d\x76\x66\x6b\x9f\xb1\x59\x92\xa6\xac\xe4\x1f\x04\xeb\xab\xa7\x42\x29\x15\x28\x8c\xdf\x8c\xaa\x22\x76\x86\xdd\x9e\xc8\xc9\x19\xe6\x5e\x4f\x4a\xbd\x13\xf7\xbd\x5e\x9c\x9d\x98\x66\xc3\xba\xaa\x37\x6b\x34\x51\xcc\x92\xb2\x3f\xaa\x6e\x9f\x75\x07\xe4\x85\xd0\xdb\xb8\x4d\x3e\x3c\x3b\x7c\xf1\x6f\xfd\xa1\xb2\x83\x72\x96\x89\xfc\x45\xd8\x9b\x69\xf9\xff\x33\xe3\xa8\x6b\xee\x0d\x6f\x7d\x9d\x69\x9e\x8f\xcd\x78\x56\xb2\x69\x61\x29\x30\x3b\xeb\x5c\x9e\xc1\x23\xe7\xac\x73\x75\x86\x14\x1a\x9f\x28\xbc\x60\x33\xf5\x4c\x33\x9e\xba\x31\xba\x81\x87\x78\x2e\x39\xb1\x22\x50\x79\x21\xf2\x61\x8a\x01\xe9\x62\x8d\xba\xa6\x42\xd8\xe0\x5f\x0b\x5b\xfc\x2b\x6c\xf2\xef\x85\x4d\xfe\x6d\xfd\x39\xd7\x9b\x7c\x5a\xca\x4f\x88\x08\xad\xf5\x6e\x29\x8a\xb2\x69\x07\xfb\x90\xc0\x74\x7f\xff\xab\x35\xef\x34\xba\xe3\x18\x62\x6e\xfc\xf4\xb7\xea\xce\x24\xda\x19\xfd\x46\x07\xd2\xeb\xbc\x72\x20\xd1\x82\xb4\xe6\x40\xce\x27\xfe\x92\x34\x65\xbb\x36\x17\xcf\x83\x07\x0e\xf7\x49\x8d\x1d\xdd\xca\x51\x44\x1f\xc0\x83\x07\xde\x6f\x7b\xf4\xec\xfe\xde\xb7\x2d\x3f\x7d\x62\x3e\x5d\x85\xf3\x57\xfd\xec\x91\x5b\x42\x95\x2b\x26\x4c\xf1\xb3\x6a\x8e\xe6\x7e\x4a\x32\x30\xf8\x46\xe2\x83\x39\x75\xcd\x89\xf5\x56\x01\x49\x99\xb1\xc7\x55\x04\x2c\x95\x85\x28\x4a\x76\xf2\x42\xdd\x6d\x27\xf0\x5a\x4e\x32\xa0\x0e\x6b\x3a\x1d\x96\xbf\x4e\x49\xc1\x26\xb9\x28\xe0\x7a\x3d\x60\x23\xd0\xab\x8f\x92\x82\xfd\x47\xf6\xba\xdd\xae\x5e\xab\xf7\x8d\x93\x17\xf0\x58\x54\xf0\x1a\xa7\xf6\x89\x16\x5d\x61\xb4\x31\xee\x6c\x6a\xe6\x29\x4e\x05\x68\xcb\x36\x6b\x18\x6d\x7d\xa3\x65\x14\x13\xbc\x4c\xfa\xe1\xdd\x16\xe2\x17\x05\xd2\x0a\xcf\x98\x8f\x2c\xf4\x65\x94\x14\x08\xe5\xb9\xcc\x4a\x9e\x64\x22\xf7\x37\x32\xc0\xaa\x90\x76\x5b\x04\x8a\xe0\x4c\x30\x5e\xfb\xbc\x21\x37\x71\x04\xa5\x14\xa6\xd5\x1c\x9d\xee\x30\xc9\x0b\x83\x05\x60\x37\x87\x0b\x64\xe9\x8a\x23\x10\x2f\x13\x48\xe0\x3f\x12\x2c\x97\xb2\x84\x7e\x58\xd3\xe0\x51\x9b\x15\x23\x3e\x90\x33\x75\xf2\x54\x71\xeb\xee\xa9\x46\x06\xd6\x27\x51\x92\x61\x07\x54\x21\x17\x47\x52\x96\x44\x2f\x6d\x96\x95\xf2\x29\xc4\x71\x28\xc0\x05\xdb\x98\x54\xaf\xa0\x01\x6a\xb5\x63\xcb\xe4\x53\xd1\xbe\x1c\x8f\xa5\xcd\x08\x56\xce\xa4\xce\xf7\x20\x06\x00\xa2\xb8\x0b\x8a\xba\xb9\xa0\x7c\xab\x66\xfd\xf4\xd8\xe6\x50\xde\x61\x92\x0d\x9e\x43\xad\x18\x16\x6d\xb6\x6d\x0f\x96\x16\x9f\xa8\x43\x8e\x57\x7d\x52\x40\x62\x34\x14\x92\xa2\x1d\xb9\xc8\x73\x99\x17\x86\x72\x30\x99\x89\x80\x3d\x2e\xb4\x9d\xba\x89\xad\x31\x94\x39\x88\xb0\x73\xc1\x0b\xb0\x6b\xa6\xbc\xd2\x26\x98\xe5\x9a\x1f\xee\xb5\x40\xbe\x6e\x79\x3f\x6c\x95\x3a\x2e\x6b\x0e\x7d\x7c\x25\x72\xc1\x66\x82\x98\x06\x29\xfe\x2e\xb9\x10\x8a\x73\xf9\x06\x72\x6c\x7f\x43\x67\x02\x2f\x7c\xb5\xc4\xa2\x60\x70\xda\xcc\x33\xfe\xc5\xe1\x1b\x73\x33\xe5\x03\x8c\xd5\x6c\x66\xa0\x5e\x70\x3c\x17\x86\xb4\xbf\xd3\xd4\xab\xe9\x56\xf9\x01\x53\xd8\xd8\x7d\x71\xf8\xfc\xc7\x37\xfb\x6f\x4f\x7e\x79\x77\x78\x7c\x70\x72\x70\xf8\xf6\x97\x97\x87\xaf\x5f\x1f\xfe\x7c\xf0\xf6\x9f\xe6\x02\x2b\x74\xe6\x1a\xec\xe4\xa9\xed\x84\x6d\xdb\x4d\x33\x55\x05\x24\xaa\x09\x2a\x6e\xb9\x8a\x9b\x3b\x7a\x0d\xd4\x4b\x53\x23\x0d\xcf\xfa\xa2\x28\x65\x0e\x4a\x0a\xa0\x76\x1a\x58\xce\xb3\x73\xf0\x19\x37\x6b\x8a\x6a\x94\x23\xf5\x19\xc5\x30\x50\x43\x3b\x4d\xe4\x65\x13\x06\xda\x66\x1b\x7e\x19\xa4\xe8\xcc\x06\xe6\xbb\x56\xa0\x8f\x65\xb6\xa7\x3b\xb6\x54\x96\xed\xea\x56\x35\xe5\x66\xf0\xcf\x64\x39\xc2\x33\x07\xf9\x02\x93\xac\x48\x06\x82\x59\xce\x76\xcd\x7f\x12\x6d\x02\x81\xa8\xeb\xd2\x31\x0f\x5b\x73\xeb\x7d\xfa\x84\xfb\xd0\xd5\xab\x54\xa8\x39\xb5\xe8\x5d\x5f\xbd\x34\x6a\x60\xb5\x2a\xec\x40\xed\x7c\xab\x0c\x40\x78\x0d\xd4\xf5\x41\x11\x9e\x1c\x4e\x5c\xb5\xa4\x30\x8b\x66\x89\x7e\x1b\x28\x04\x9b\x8d\x92\xfe\x48\x35\x30\x08\xa5\xd7\x10\x08\xf4\xae\xa5\xa9\xe6\x33\x74\x43\xd7\x5a\xd5\x83\xd7\x62\x78\xd1\xcd\x27\x3f\xb6\x19\xa1\x43\x95\x58\x27\xcb\x81\x6a\x87\x83\xdc\x6a\xe1\x80\xac\xa4\xd7\x09\x5b\xe8\x03\x16\x75\x91\xd1\x5b\xcf\x9c\x77\xfc\x08\xeb\xd6\x2c\xe5\x04\x1e\x3f\xa9\x18\x96\xad\x3b\x63\xa6\xab\xa2\x18\xe8\xed\xac\x54\xcf\x4c\x99\xb3\x33\xd5\xdd\x99\x7f\x09\x64\x53\xd5\xd9\x35\xe3\x60\x65\xac\x26\x80\x13\x12\x03\x36\x49\x2e\x05\x74\x1c\x7b\x13\x57\x79\x9a\x02\xcd\xa0\x42\x2f\x48\xf6\x0f\x06\xac\x9a\xf3\x61\xdc\x3c\xf5\xf3\xad\xb2\xa7\x7e\x21\x64\x99\x98\x34\x6c\xa8\xa1\x29\xd8\xb5\x20\x74\xec\x44\xb1\x36\xaa\x0a\x7b\xca\x1a\xf6\x25\xdd\x50\x0d\xf1\xd7\x6b\x31\x2c\x1b\x11\x0e\x7e\x15\x5e\x6b\x01\x7f\xae\x20\x8f\xca\x71\x4a\xa0\x2e\xc1\x8e\xa3\x7c\x5c\x4b\x3c\x74\x49\x2d\x84\x4a\xc5\x4f\x9f\xa0\x4b\x2f\x20\x51\x58\xe9\xbd\x5d\xad\xd3\x90\x55\x11\x91\x1a\x80\xd0\xa0\x2d\x9a\x8e\xb5\xd6\xb0\xcc\x79\xbf\xf4\x6e\x30\x8a\xe2\x05\x6b\x82\xe7\x07\xaa\x4a\x27\x2d\x14\x5f\x70\x8d\xdd\x20\xdc\x40\x21\xe5\xf2\x58\x3d\xe1\x39\x1f\xb3\x8f\x68\x08\x70\x8d\x30\x3a\xec\xc8\x81\x82\x44\x59\x20\x41\x00\xf1\x81\x22\xf2\xb4\xa1\xda\x97\xf0\x3c\xb0\x0e\x28\x57\xcd\x2f\x18\x24\x68\x63\x9d\x81\x2a\x1f\x54\x0f\xb0\x37\x20\x2b\x17\xb6\x8b\xd2\x61\x8a\x41\x52\x3c\x5c\x3e\x15\x0a\x71\xe8\xc0\xbc\xa5\xab\x02\x35\xee\x27\xc1\x34\xd5\x28\x8d\x55\x46\xb0\x7c\x54\xe4\x8c\x9a\x5e\x7d\xf4\x54\x35\x4b\xea\xc8\x01\x34\x03\x88\x1e\xc2\x2d\xff\x10\x6e\xcd\x3b\x84\x5b\xea\x10\xba\xdc\xf7\x0e\x6b\x4f\xac\xec\xc5\x23\x02\x6d\x3c\x8e\xf6\x86\x76\xa7\xb0\xa6\xb6\x42\x21\x57\x7d\xec\x3c\x38\xed\x1c\x9e\xaa\x17\xde\x36\x2a\xdb\xd4\x7c\xbb\x8a\x64\x3e\xdc\x25\xe3\xf8\xd6\xb6\xb3\x75\xd0\x00\x66\x61\x35\x40\x60\x5b\x09\x86\x19\xa9\x85\xea\xf8\xf9\xd5\x60\x4b\x55\x6d\x72\x92\x5e\x41\x52\x19\xb4\x85\x28\xd5\x86\xf6\x80\xa3\x2a\x50\xef\x73\xc3\x07\x91\x46\xc9\xe7\xc7\xc7\xf0\xde\x7d\x21\xfa\x29\x47\xb5\xd5\x35\x5a\x07\x16\x28\xc4\x29\xa6\x29\x10\xf1\xb3\xba\x97\xf1\x19\x93\x59\xcd\xcb\x4c\xf7\x61\xee\x0e\x7e\x99\x14\xac\xc3\xce\x2e\xf1\xee\xb8\x3a\xf3\xd0\xd8\xdc\x1b\x66\x72\x88\xc9\xe6\x17\x24\x64\xf3\x2e\x43\x05\x0d\x70\xda\xbb\x4b\x9e\x61\xfd\xe3\xe4\x57\x61\x13\xbd\xa8\x9a\xfe\xad\xb2\xa7\x30\x5a\x8d\x06\xc8\xf0\x25\x90\x7d\x20\xf1\x8a\xe2\x9f\xc0\x55\xe1\x2a\x3f\xd3\xb7\xc4\x1e\xd6\xc6\x7a\x4f\x59\xe3\x48\x6d\x27\xb4\x78\x86\x66\x52\xd4\x98\x6f\xc2\xf3\x42\xbc\x4c\x25\x2f\xf5\x30\xde\x37\x70\x2a\x0d\xf6\x50\x43\x7b\xc8\x1a\x3f\x27\x83\x72\xd4\x38\x6d\xb3\xcd\x8d\x16\x7b\xb8\xb8\xd1\xb3\xb0\x11\x7d\x28\x9e\x88\x34\x2d\x0c\x0d\x51\x8c\x68\x3e\xcd\xc0\x28\xe7\x00\x92\x87\x8b\x92\xed\x5f\x4e\x52\x99\x8b\x9c\x6d\x6e\x2c\x8f\x28\x55\xad\x56\x52\x1c\xec\x03\x04\x63\x04\xa0\x7e\x46\xd2\xbe\x60\xc1\x5f\x37\x23\xfe\x90\xc8\xa0\x62\x3b\x4a\x34\x2c\x03\x6b\x60\x3a\x7d\x3b\x9f\x4c\x7e\x42\x7d\xa7\x95\xe6\x34\xde\x1c\x1f\xec\xb3\xcd\x8d\x86\x91\xe0\x04\xa2\x0b\x84\x82\xc1\x20\x3c\x86\x43\x61\x87\xda\xff\xb6\x96\xb5\xab\x4b\xb0\x6d\xd5\x5c\x68\xf1\x4a\x63\x4a\xbc\xe1\xe5\xa8\x3b\xe6\x97\x4d\x55\xfd\x7d\x03\xdf\xb5\x6a\x53\x14\x90\x53\x84\xf2\x5e\xb3\x0a\xe4\xb3\x02\xfb\xbe\xd1\x4f\x13\x91\x95\x95\xcf\x15\x20\xf8\xb9\x02\xc4\xac\x62\xb3\xc5\x9e\xc6\x9b\xb2\x87\xfe\xd0\xdf\x37\xc6\x3c\x3f\x4f\x32\xc8\x4a\xe5\xd0\xfc\x95\x40\x84\x7d\x8a\x28\xae\x10\x17\x70\xb9\x75\x03\x00\x1a\xe3\x15\x0c\x3c\x06\x2d\x45\xe0\x35\x3e\xd2\xa5\xfe\x19\x94\xd9\x6a\xc1\x8b\xa6\x3b\x83\x6a\xbd\xe8\x4b\xce\x08\xf9\x09\x0f\x34\xef\xe5\x6c\x8c\x9e\xed\x80\x41\x85\x6e\x97\x09\xc5\x78\xbe\x46\x4e\x41\xf5\xac\x6d\x11\xcf\x46\x30\xa5\x6d\x8b\x14\x66\x8e\xf3\x10\xa3\xad\x8d\x22\x06\xe5\x88\x34\xc4\x53\x39\xaf\x9d\x67\x06\xe0\x47\x03\xf1\x4e\x48\x5d\x28\x21\x23\xa3\x58\x26\x98\x10\x5a\x9a\xdc\x34\xa0\x10\xbe\x4c\xf4\x29\x9e\x13\x45\x8e\x86\x46\x59\x18\x47\x0e\x86\xb4\x6c\x2c\x39\x62\xdd\x1e\x8f\x28\xa7\x2b\xdc\x30\xae\x5c\xb5\x75\x2c\xba\x1c\xb1\x46\x5f\x3d\xc6\x9c\x6e\x7c\xf3\x48\x73\xce\x76\x64\x2d\x66\xee\xb2\x64\xc8\x39\x2b\x0e\xb8\x6d\xd8\x39\x0b\xe8\xa6\xa1\xe7\xe8\x1b\x83\x86\x9f\xd3\xc7\x02\x3c\x5b\xd4\x7f\xb8\xe7\x74\xb9\x3c\xb4\xab\x46\x46\xd3\xe7\xc2\x8b\x8d\xb6\x56\xbf\xf6\x24\x3e\x9a\xc5\x32\x12\x25\x4d\x7f\xab\xc4\x4a\x33\x96\x4d\xd5\x88\x69\xba\xc4\x0f\xa0\x44\xcd\x9c\xa8\xd0\xa0\x12\x41\x2d\x54\x02\xf4\xfe\xe3\x82\x17\xad\x18\xc4\x72\x8d\xad\x14\xc6\xd2\xbd\x1f\xa3\xa1\x2c\x83\x90\x44\x61\x3c\x4b\x72\x38\x6e\x12\xd5\xd2\xf9\x0a\xd6\x46\xb7\xac\xba\x0b\x92\x75\xd2\x31\xd9\x60\xa9\x8c\x00\xc5\x93\x91\xe8\xd0\x06\x6d\x76\x2e\x32\x91\xa3\xb9\x35\x93\xd3\x72\x32\x2d\x59\x91\x8c\x93\x94\xe7\x5a\x8f\xfe\x4c\x4e\xb3\x41\x92\x9d\x3f\x87\x7b\xfa\x68\xa5\x97\xa6\x13\x90\x98\x57\x98\xee\xd7\x67\x9d\x4c\xa1\xeb\x82\xa5\xc9\x07\xa1\xc7\x53\x11\x88\xb8\x6a\x4d\x13\xd6\x87\x72\x23\x9e\xd7\x8e\x9d\xa7\x16\x4a\xe1\x7d\x66\x02\x3b\xe0\xc3\xc4\xfe\x84\x4b\x0b\x11\x16\x5f\x36\xae\x26\xbc\x86\xec\x2f\xbc\x17\xd7\x10\x85\x7d\x83\xa0\x9e\x5e\x2e\x86\x7c\x8d\x7e\x62\x0e\x6f\xf9\x0e\x89\x3d\xb9\xa3\xaf\x5c\xd2\x6b\x65\xdd\xaa\x3b\x59\x15\x2a\xc1\x70\x6d\xc6\xf7\xf5\x75\x06\x8c\xe6\xe6\x06\x7b\x79\xf0\xaf\x6d\xf6\x2e\x15\xbc\x10\x6d\x36\x90\x59\xa3\x64\xbc\xf8\xd0\xf6\xe4\x16\xa0\x42\xc0\x66\x7d\x09\x12\xcb\x1c\xad\xe8\x5e\x1c\xbe\xc1\xd3\x31\x16\xac\x9f\xe4\xfd\xe9\x18\x6f\xe6\x02\x55\x92\x46\x7d\x81\x2a\x88\x5c\x60\xda\xef\x04\x4c\xd4\x32\x1c\x01\x48\xe8\xcb\xa4\x97\xa4\x49\x79\xa5\x1e\x85\xf0\xdc\x39\xd8\xdf\xdc\xf4\xd8\x65\xc5\xe0\xd8\xfb\x3d\xbf\x22\x92\xdb\x3e\x95\xfb\xc4\x17\xc3\x73\x35\x5c\xfa\xfd\xed\x37\x58\xea\x0d\x6e\x46\x54\x79\x63\x7b\x85\xd5\x57\xb3\x57\x1c\x79\x7b\x7b\xe5\x91\xe7\xb4\xbe\x34\x59\x9f\xa3\x15\x4b\xae\xf8\xa6\xeb\xaa\xe0\x76\xd9\xb5\xb2\xc1\xb5\x73\x7c\x07\x1b\x57\x48\x0c\x58\x62\x27\x81\x27\x0a\xe2\x99\x98\x59\x7b\x4c\x22\x19\x6e\x27\x6c\x65\x38\x50\x3a\xe5\x8e\x05\x63\x23\x90\xaf\xaf\x3b\x49\x06\xce\xb7\x07\xcf\xd3\x5f\x05\x8a\xa2\xd4\x5f\x85\x7d\xb4\xfe\x0a\xde\x57\x73\x6c\xb0\xd8\xd3\x2a\x73\xbe\xad\x2d\x0b\x15\x08\x18\x38\xbc\x7b\x7f\x15\x9a\x6c\x50\xfb\x2b\x3c\x84\x3f\x9b\xcf\xb8\x3a\x64\x86\xf0\x33\xd5\x1b\x02\x4c\x3d\xcc\xd2\x02\xd4\x3f\x2b\x10\x5f\xd9\xef\x1a\x06\x59\x10\xf8\x5d\x2a\x1c\x30\x30\x65\x9e\xfc\x7a\x6c\xd7\x62\x37\xb0\xba\xc0\xd1\x75\x70\x2a\x66\x1c\x17\x22\x2f\xeb\x9b\xe8\xee\x3b\x7a\xb8\x66\xe1\x93\xa1\xba\x3b\x46\x57\x13\x59\x8e\x44\x99\xf4\x79\x4a\xb6\x20\x29\xb4\x54\x46\x0c\xda\xa0\xc5\x9b\x16\x25\xeb\x69\x45\x5e\x52\x36\x0a\x88\xf9\xc8\xd9\x19\xbe\xe4\xcf\x10\xa4\x51\xf7\x95\x4e\xa9\x69\x9d\x39\x78\x0a\xb7\xee\x44\xe4\x43\x99\x8f\x81\xd1\x47\x25\x65\xa1\x29\x41\x30\xf1\x4f\x9f\xfc\x69\x79\x57\x3b\x88\x11\x96\xb1\x6e\xc2\xa3\x13\x80\xee\xec\xd6\xc9\x54\x1a\x97\xe6\xa4\xfb\x4b\x3a\xa7\xc5\x55\xc3\x78\x78\xea\xcd\x44\xb4\xea\xec\x06\xbd\xee\xd0\x3a\x1a\x53\x3a\xbb\x7e\x3f\x11\xfb\x24\x72\x76\xb1\x6d\xf5\x31\x8a\x0a\x1a\x55\xe5\x48\xa4\xbc\x4c\x2e\xc4\x89\xdc\xcb\x7b\x49\x99\xf3\xfc\x0a\x2c\x99\xac\xc3\xbc\x56\x5a\xbb\x7b\xc3\x4a\x24\x1c\x1d\xde\xb1\x45\xea\x4c\xa9\xd7\x89\x6f\x57\x42\xce\x9b\x7d\xb5\x6a\xf8\x47\x48\x82\xe2\xa4\xc7\x73\x15\x05\xef\x6c\x80\x3b\xb7\xcd\xc4\xd9\x94\x38\x5a\x6d\x4d\x93\x42\xf3\x2d\xd2\xc3\xda\xb2\x88\x12\xf4\x80\xe8\x7c\x22\x27\x3f\x6b\x52\x51\x11\x5e\x75\xfd\x2a\x5a\x5e\x45\x5b\x2b\x92\xbd\xa8\xb9\xad\xa3\xdb\x7b\xb6\x57\xc6\xf8\xd6\xad\xc3\x47\x47\x8a\xe9\x5a\xc3\x45\xd4\x21\x0b\xa9\x3f\x04\x43\x24\xc4\xdd\x6b\x0d\x37\x95\xd7\x5c\x7f\x09\xc7\x48\xa9\xbe\x07\x81\x70\x5e\x86\xe2\x7b\xe5\x1e\xc3\xc5\x2c\x1f\x86\x72\x18\xbc\xa4\x37\xaa\x05\xfa\x32\xde\x30\x94\xea\xd8\x5c\x11\x58\x0c\x12\xe2\x40\x7e\x62\x4d\x24\x80\x36\x61\x48\x91\x69\x21\x06\x8c\x17\xd6\x50\x43\x53\xa8\x81\x44\xfa\x24\xb3\xf4\x8a\xc9\x8c\x01\x96\xf7\x44\x9f\x4f\x4d\x73\xb0\x4a\x51\xa5\x9e\x69\x42\x4f\x8c\xf8\x05\xdc\x46\xeb\xeb\x6c\x90\x0c\xc1\x91\xb1\x4c\xaf\xd8\x6c\x24\x32\x3b\x34\xf0\x09\x9c\x4c\xd2\x04\xcd\x38\x92\xb2\x8b\xaa\x0b\x52\x4c\xdc\xd1\x10\x58\x09\x12\xe1\x4b\x23\x08\x0e\xa6\xd6\x36\x8a\x51\x09\x21\x78\xd5\x2c\x81\xfa\x1a\xa3\xb0\xfb\xfa\x0c\x3f\x78\xa0\x8f\x2c\xa5\x94\x74\xa5\xab\xb8\x68\x4b\x2d\x16\xd3\x56\x7a\x1b\xea\x9a\xa9\x62\x87\xbd\xcc\x63\xb9\x3b\xbb\xe1\x49\xea\xb8\xa1\xec\x78\xd5\xcd\x5d\xb8\x7c\x0b\x44\xd2\xdd\xca\x69\xeb\x90\x71\xfb\x2d\x72\x43\x6d\xe7\x37\x81\x36\xeb\xeb\x6c\xaf\x2c\x79\x7f\x44\xd6\x8e\x67\x03\xba\x26\x16\x59\x62\xac\x31\x5e\x82\x57\x60\xca\xa3\xb6\x6d\xec\x8d\x84\xee\x47\xcd\xf4\xbc\xc5\xf7\x67\x74\xbd\xe6\x0b\x99\x9f\x1a\xda\x6c\xcd\x25\x28\x85\x54\xbc\x8f\xb6\xaa\x52\x24\xdb\x23\x9e\x0f\x1e\x78\xbf\x1d\x71\xbf\x5f\x31\xa2\x73\x34\xc9\xd7\xae\xd9\x27\xda\x64\x9e\xe1\x5f\x51\xb9\xae\x7e\x4a\xc4\x6c\x22\xf3\x9a\x6b\xab\xa4\xf7\x56\xe5\x99\xb3\xaa\x26\x19\x99\x5c\x84\x8e\xfd\x21\x69\x5d\x7c\x65\x5a\xfe\x5f\x8b\x58\x7d\x06\xd2\x4a\xce\x55\x29\xe5\x1b\xdb\xc6\xcf\x09\xbc\xf7\x2d\x2b\xe9\xae\x08\xcb\x32\xc6\x40\x20\xa7\xe6\xc3\x70\xcc\x23\xb9\x27\xe2\xaf\x1c\x6f\xa8\x35\xef\x1a\x14\xe1\xda\x47\x8d\x77\xef\xd8\x87\x00\x5c\x34\xae\x8f\x4e\xb0\x86\xfa\x55\x1d\x7c\x74\xc4\x84\xdc\x37\x64\x14\x15\x28\xfa\x15\x1f\x05\xf3\xda\xbe\x24\xf4\xb5\x13\xb9\x69\xdc\xe5\xb2\x53\xcb\x33\xe1\xc4\xbc\xd7\x7e\xc4\xb3\xca\x3d\x84\xd9\x30\xb9\x14\x03\x26\x73\x62\xbd\xc3\xf5\x47\x6b\xf0\x77\xd7\x56\x28\xce\xc0\x70\x5a\x94\x72\xfc\xdc\x59\x88\xcd\x77\xbf\x62\xdf\x24\xc5\x4b\x35\xb4\xa7\xdf\x54\x3c\xaf\xd4\xe7\x15\xed\x69\x6f\x6a\xe2\x11\xb3\xb2\x55\x90\x16\x7b\x32\x55\xec\x8d\x61\xa1\x43\xc0\x46\xf0\xec\xa9\xc0\x70\x82\x4b\x18\xec\x9b\xde\xf5\x2d\x6b\x62\xb5\xa0\x07\x7d\x01\xa4\xdd\xd9\x6d\x8f\x6f\x27\xe1\xc1\x80\x07\xb5\xc5\x36\xf8\x01\xad\x61\x14\xc4\x13\x3e\x50\xcc\x6f\x6d\x63\x37\xf4\x7d\x6b\xba\x61\xfe\x02\x4e\x07\x14\xe9\xc3\x24\x13\xc1\x4c\x6b\x64\x76\x52\xe6\x83\x24\xe3\xa5\xf3\xef\xf7\x9a\x44\x44\x50\x50\xd4\xd4\x11\x7f\xdd\x64\xda\x66\xe8\xed\xea\x18\x97\x74\x39\x20\xdb\xb2\x6b\x42\xa8\x6e\x98\x00\xaa\x1b\xcc\xbe\xdf\x03\xd7\x84\x1a\x1b\xb5\xca\x08\x5b\x86\x91\x7c\xc5\xb3\x41\x2a\xd8\x85\xbe\x81\x8c\x39\xbe\x42\xd6\xea\xf2\x02\x42\x9a\xaa\x16\x27\xbd\xa1\xae\x76\x9b\x55\xcd\xe4\xa9\xf8\xc6\x0d\x8f\xf2\x79\x3d\xae\xb6\x56\xa2\x28\x4e\xd0\xed\xe6\x85\xb7\x61\x2c\x5c\x49\x1d\xd3\x1d\xcc\x88\x37\x9c\x9e\xa3\x66\x9e\x94\x19\x20\x71\x88\x2a\xe0\xe6\x7b\xcc\xb8\x15\xf7\xa2\x5f\xfa\x50\xba\x73\x0c\xf6\xa3\x7d\xea\xe8\x51\x4b\x98\x8d\x59\xb1\x3a\x2e\xec\x9c\xf9\xe2\x0d\x3b\x6f\xa6\xcb\xf7\x1a\x04\x61\xaa\x40\xaa\x0c\xc1\xb3\x38\xad\x3c\xfb\x16\xf3\x26\x7e\x0f\x6d\x16\x20\x96\x41\xa7\x03\x63\x35\x3e\x84\x37\x0e\xc8\x71\x80\x2b\xe5\xee\xf9\xa2\x95\xb9\xdc\x46\xc1\x5e\xb8\x5f\x28\x68\x7b\xf0\x80\xdd\x37\x44\xd8\xeb\x3e\x88\x64\xe8\x8b\xe3\x70\x82\x9e\x7c\x8e\x06\x13\xb3\xbc\x51\xd0\x4c\x3f\x23\x69\x55\xc3\x88\x85\x35\xb5\x58\xac\xb2\x15\x46\x64\xeb\x3d\x52\xaa\x5c\xf9\x4e\xb5\xa1\x7e\x9f\xec\x9a\xd1\x3d\xa4\x30\x22\xf5\x8d\xf8\xd7\x7f\xad\x44\xb8\xfb\x48\xdb\x5c\xcf\x1f\x67\xf7\xd0\x83\x11\xc5\xb5\xf5\x75\xb4\xf8\x4f\x53\xf2\x42\x24\xa4\xa2\x68\x9b\xb7\x2e\x78\x8d\x9f\x4b\x39\xa8\xf4\x6a\x3d\xb6\x8a\x40\x39\xab\x5e\x42\x83\x81\xa1\xee\x8a\xc6\x44\xa6\xa9\x4b\x77\xd6\x62\xab\x1d\x2f\xb4\xaf\xb1\x78\xb1\x7b\x10\xda\x72\x77\xf1\xbb\x7a\x95\x77\xc5\x5e\x2e\x38\xa4\xd7\x70\xec\x8e\xc5\x92\x5c\x0c\xa9\xac\x82\xa2\x9a\x2a\x22\x82\x51\xdd\x0f\xb6\xfc\xd6\x8a\x4c\x1d\x3f\xa1\x38\x80\xa4\xbc\xb2\x77\x6e\x99\xf3\xac\x18\xca\x1c\xed\x26\xcf\xf8\xb4\x94\x67\x24\x6e\xa6\x76\x64\x71\x1f\x66\x49\x39\x62\x63\x99\x03\x13\xc0\x2f\x78\x92\x82\x7e\xbd\x98\xf0\xbe\xe8\xde\x46\x45\x07\x71\xd7\xd1\xbc\x0c\xfe\xd4\x36\xa1\x46\x51\x38\x60\xbd\x2b\x13\xb1\x95\xf4\x10\x51\xf5\x4d\xd0\xc1\xb4\xc3\xde\xd8\x18\x9d\x56\x3f\x0c\x8b\xad\x78\x26\x5d\x2b\xce\x5c\x04\x63\x30\x2e\xeb\xe9\x95\x31\x0b\x1c\xf8\x1c\x86\xb6\x28\xd9\x9b\x96\xd2\x45\x90\x74\x71\x46\xd5\x4d\x7e\x84\x70\xaa\xcc\x47\x0d\xcf\x81\x02\x46\xc0\x9f\xb8\x9d\xe7\x63\xdf\xce\xf3\xf1\x3c\x3b\xcf\xc7\x60\x06\x64\xad\xa0\xed\xc8\x9c\xc9\x96\xda\x76\xcd\xc4\x76\x42\xc7\x7b\x5b\xdd\xd3\xbd\x84\x8c\xc4\x8d\x59\xac\x9d\x35\xa2\x03\x2c\xfc\x37\x9c\xa1\x13\xfa\x11\x45\x4e\x59\xe4\x34\x6c\x9b\x75\xb6\x52\x44\x7a\x9e\x91\x36\xb4\xa9\x3a\xb6\x1e\xba\xd3\x99\x20\xc0\x9c\xd2\x6f\xd3\x1b\xa9\x6f\x9f\x72\xb6\x0b\xa3\xc8\x5d\x71\x06\x11\x3a\x62\x07\x81\x1f\x68\x27\xc8\x60\x06\x5d\x98\xea\x56\x16\xea\xd1\xbc\x25\x27\x61\x5f\xa5\x68\x89\x90\x97\x62\xa0\xe8\x13\xb1\x79\x80\x1c\x37\xb0\x65\x73\x92\xdb\xd4\x25\xb1\x80\xc8\xc2\x1f\xc4\x95\x9e\x0c\x6e\x3d\xd8\x17\x38\xfb\x0f\x9e\x0b\xbe\x6d\x09\xa3\xab\xd1\xa2\x46\x1c\xad\xae\x1a\x1c\xe9\x9c\xb7\x59\x2f\xe8\xbd\xd7\x55\xa0\x58\x87\x71\xf8\x63\x67\xcd\x46\xb5\x54\x93\x1b\x26\x69\x29\x72\x37\x3d\x32\xd9\x2e\x96\x11\xe8\x8a\xda\x6e\x51\xf9\x24\xa5\xd0\x5b\xfe\x96\x06\x44\x7a\xcb\x52\x69\x32\x34\x6c\xfe\x0f\xcb\xad\x51\x0d\xde\x83\x07\x06\x40\x58\xfe\xca\x02\x22\xf3\x30\x56\x6d\x5e\x72\x0f\x3a\x37\x47\x3a\x36\xd8\x53\xbf\xe8\xfd\xc6\xa9\xda\x4f\xb6\x4d\x67\xaf\x3f\xda\x0e\xac\xef\xbe\x62\x2e\x2d\x05\x29\x26\x69\x52\x36\x1b\x9d\x46\xeb\xfd\xe6\x29\xbd\x81\xaa\xe3\x79\x08\x26\x2b\x1a\xc6\x53\xd6\xe8\x34\xd8\x43\x02\x75\x9b\x35\x1a\x15\xb3\x06\xc3\x59\xea\x6b\xa8\x12\x7e\xef\xc6\xde\x07\x90\x0e\x83\x16\x04\x8f\x60\xd6\x21\x89\x72\x62\xe6\xd3\xd5\x57\xb1\x6e\x52\x19\x23\x06\xd0\xd3\x90\xc0\xd1\xba\x27\xac\xd4\x08\x67\x96\x14\xad\xf8\x4d\xb4\x97\x99\x7b\x50\x8b\x48\xd5\x7d\xe0\xbc\x4e\x0b\xed\x8a\x65\xa0\x12\xc9\xbd\xeb\xb3\xea\x2d\x6b\x46\x68\xf2\x34\xc1\x62\x44\x6e\x27\x12\xd0\xaa\xf2\x4c\x5d\xed\xfd\x5a\xf5\x4c\x9b\xf7\x40\x20\x17\x47\xb5\xe3\x0a\x8e\xc0\x72\x4c\x4b\x61\x54\xec\x51\xe7\x2c\xcd\xe5\xa3\x6e\xfe\xa1\xd1\x67\xdc\x9d\x4f\x56\x65\xe7\xaa\xdb\x86\x87\x5d\x31\x1f\xfa\x5c\x4f\xac\x81\x5e\x35\xfe\x81\x9a\x0f\x3e\x31\xaa\xfe\x1f\x44\x29\x18\x0d\x70\x63\x65\xa8\x97\xf3\xb5\x26\x51\xe3\x76\x5d\x8c\xa6\xc4\x16\xd2\xd5\x02\x45\xca\x3c\x50\x60\x8a\xdc\xda\x89\xdb\x6c\xe8\x4b\x2b\x66\x24\xf0\x90\x5d\xf9\x02\xd3\xa8\x59\xc0\x43\x76\xb9\xa6\xc3\x82\x5b\x3f\x0d\xd5\x43\x14\x4b\x26\x20\xb0\xa3\xec\xac\x87\x2c\xe0\xd1\xb8\x3a\x42\xd8\x80\x48\x06\xaa\x8f\x11\xa6\x78\x98\x26\x93\x89\x18\x78\xd5\x82\x5d\xd7\xe3\x8b\x30\x91\x44\x87\xc0\x8b\x11\x88\x99\xf0\xf6\x6f\xe4\xda\x34\x5a\x33\x35\x28\x1a\x6f\x5b\x06\x04\x2c\x86\xda\xc8\x4e\x99\xc8\xb1\xde\x72\x39\x5a\x9e\x0b\xf8\xbb\xb9\xae\x40\x7c\x02\x78\x9f\xb0\xc5\xa7\x52\x4e\xd6\xcf\xdb\xc4\xbc\x71\xcc\xcb\xfe\xc8\x79\x06\x68\x58\x6a\x6c\xef\x75\xd1\xe9\x4e\xd4\x50\x2d\xa0\xe8\x44\xe4\x78\x13\x32\x6e\xf3\x6a\x75\x20\x24\x96\xfd\xa9\x40\xbf\x23\x14\xf7\x5c\x94\x86\x38\x2e\x90\x7e\x2e\x24\xfc\xce\xb1\xcb\xa7\xa2\x15\xf2\x6f\x66\xba\x3c\xf9\x0f\x3c\x73\x1c\x96\x76\xa8\x77\xee\x05\x4f\x93\x01\x45\xe1\x79\x4f\x19\xec\xd7\x0d\xf1\xb3\x5c\x28\xef\x68\x27\x55\xfa\x7f\x68\x35\x6d\x3e\x36\xd3\xec\x0c\x51\x8e\x62\xe3\x94\x7a\xa2\xeb\x25\x84\x88\x14\xd4\xb0\xca\x44\x06\x37\x76\x18\x84\x76\x4e\x48\x22\x4f\x23\x0e\xd0\x28\xd2\xae\xd2\xe3\x52\x32\x39\x75\xd2\x2c\xe3\xa0\x47\x3a\x71\x89\x20\x3d\xea\xe5\x46\x10\xb3\x28\x20\xa5\x81\xca\x67\x7d\x9d\x0d\xc4\x44\xa0\xe1\x66\xef\x8a\x22\x1e\x79\x70\x0b\x36\xe2\x88\x29\x9a\xa7\x62\x89\x1a\x9d\x1e\x4a\x91\x2a\x90\xe9\x15\x55\xe9\x3b\x0b\x18\x99\x27\xbf\x42\x9c\x4e\x43\x25\x90\x3c\xb8\xd0\x2b\x64\x4b\x9c\xb3\x0e\xea\xd0\x93\x4c\x3b\xe3\x1a\x38\x4f\xb5\x37\xae\x21\x32\x56\x55\x27\xfa\x52\x3d\x22\xae\xaa\xf5\x53\xe3\xbe\x55\x12\xf7\xad\xb1\xe0\xc5\x34\x37\x3b\x4f\x6a\x8f\x84\x75\xde\x82\x75\xac\xf6\xf0\xc6\x6b\x7a\x7f\x7e\x5b\x1b\x2e\x5d\x6f\xdb\x7b\x33\xa7\x53\xb6\x5b\xc1\x4e\x52\xf8\x30\x52\xe8\xfa\x3d\x65\xeb\x6c\x8b\x75\xc8\xb6\x56\x4a\x77\xc2\x87\x36\x2a\xb0\xe9\x32\x19\xc2\xe9\x0f\xd0\xab\x12\x1d\x65\x50\xc3\x1b\x46\x6c\x95\x4e\x2b\x82\xfa\x55\x7b\x8c\xde\x4b\xfe\x5c\x2a\x2e\xc8\x5e\x1f\xf4\x06\x78\x93\x8c\x93\x3e\x5a\xa8\x9c\x29\xf6\xf1\x4c\xcb\x72\x14\x6d\x83\xf4\xb9\x37\x0a\x07\xa9\x1a\x5e\x33\x9e\xe7\x7e\x81\xe2\xaf\xfc\x2f\x60\xdc\xef\x11\x4a\x38\x07\x4c\xe6\xac\xb3\x59\x0d\x85\xd2\xe4\x79\xde\x46\x43\x40\xab\x09\x9a\x16\x82\x65\x48\xbb\x21\x16\x42\x32\x34\xa1\x32\x21\xf1\x8f\xda\x76\x18\x0f\x31\xbc\x57\xf5\x82\x8b\x92\xe7\x39\x7c\x6e\x22\x70\x1a\x87\x41\x75\x70\x86\xcf\xb3\x33\x20\x49\x10\xc6\x1b\xbd\x8d\xf9\x58\xa0\x1d\x4f\x22\x73\x70\xff\x84\x35\x5c\x0b\xc0\xc2\xa3\x15\x01\x03\x09\x0d\xa3\x7f\x01\x2c\x3d\x71\xbc\x52\xe0\xca\x56\x44\x68\x55\x9f\xee\x2f\xb0\x09\x07\xaa\x10\x77\x42\xc1\xf2\x3c\x4c\xaa\xfb\x01\xb5\x97\xdd\x14\xa8\x5c\xb3\x33\xd8\xad\x63\x78\xfa\xd3\xbc\x1a\x91\x63\x9a\x43\xb0\xc8\x53\x38\xdf\xd6\x73\xc4\x4a\x27\xfc\x1d\x55\xd8\xfe\x90\x9d\x69\xca\x7b\xa6\x46\x75\x66\x7b\x3a\xd3\x56\xe8\x74\xd8\x48\x86\xcb\xfe\x48\xbf\xb5\x70\x11\x3c\xa7\x9b\x60\xf0\xb2\xf7\x9f\xd8\x80\xae\xe9\x0b\x4c\x4d\xd0\x50\x7f\x80\xee\xb1\x68\xaf\xa5\x9c\xb0\x32\x97\xd3\xf3\x11\x60\x46\x9a\x60\x48\x4b\x97\xef\x08\x34\xce\x53\x54\x37\x83\x6b\x4f\x3e\x80\x0c\xaa\xdf\x32\xc1\xfb\x23\x8d\x51\x63\x1d\x1c\x71\xa4\x9e\x60\x83\x04\xd9\x6f\x22\x52\x5d\x41\x52\xac\x99\x22\xd5\x98\x8a\x8a\x69\x99\xc6\x3d\x92\xf9\xab\xca\x4c\x81\xc7\x4e\x87\x1d\x4e\xb4\x31\xaf\x75\x46\xcf\xd4\xa1\x32\x2a\xc9\xa2\x74\xfc\xa8\xe5\xa5\x48\xd7\x3e\x7a\xe6\xd3\xcc\xca\x98\x9b\x24\xf9\x9b\x6a\xd0\x86\x1e\x1d\xdb\x6e\x8b\x4f\xe4\xd1\x34\x63\xbb\x38\xa0\xdd\x40\x66\xeb\x96\x99\x24\x32\xeb\x16\x69\xd2\x17\xcd\x8d\x36\x39\x0f\xa4\xb7\x86\x9a\x41\x43\xf7\x87\xbc\x8e\xdf\x59\x77\x28\xf3\x7d\xde\x1f\x11\x6c\x36\x15\xa8\x2f\x9a\xf9\xf6\xde\xe5\x2a\x3a\x6d\x51\x55\x8d\x28\xd2\x24\x2b\x3b\x83\xa4\xe0\xbd\x54\x74\xd2\x24\x13\x6c\x20\xcb\x4e\x26\x89\x02\x0e\x9c\xb1\x0a\x99\x8a\xee\x8c\xe7\x59\xb3\x71\x66\xc0\x76\x0d\xd4\x33\xb4\xce\x9e\xe4\xa2\x8f\x69\x89\xe1\x7c\xb8\x6a\xd9\xd9\xfd\x06\x71\xb4\xd3\x62\x3a\xb5\x64\xb1\x11\xb2\x4f\x9f\x18\x69\xbb\xb3\xf4\x40\xe9\x94\xbb\x3a\x2d\x1f\x1a\x21\xba\xb0\xbf\x59\xcb\x5b\x00\xe0\x1f\xed\xa3\x1d\x88\xb3\x7b\xcd\x68\xcb\x71\x31\x86\x74\x0b\xe3\x49\x2a\x4a\xa1\xfd\x62\x8e\x68\xbc\x07\x03\x8c\x98\x72\xf6\xc4\x50\xe6\x02\xcf\x8f\xc5\x4b\x2f\x2d\x1d\x70\x86\xb9\xb8\x48\xe4\x14\xb5\x61\x03\x29\xb4\xd7\x8b\x06\x37\x16\x45\x81\xca\x99\x72\x24\x0a\x61\x43\x52\xc0\x7f\x91\x9c\xc7\x15\x1b\xdd\x48\x1d\xab\x05\xf7\xca\xdc\x0b\x67\x2e\x88\xc0\x7c\xc1\x80\x51\xb4\x0c\x53\x70\xb7\xed\x5c\xa9\x5b\xa5\xe7\x0e\x8c\xe9\xad\x89\xf2\x0a\xf4\x3f\x3a\xfc\xae\x79\xeb\xe9\x3b\xcc\x3c\x3b\x90\x49\x36\xcf\x9a\x4c\xcc\xec\x26\x41\xae\x8b\xc9\x24\xbd\xd2\x76\x2a\xa6\x1c\xa4\x15\xdd\xbf\xf7\x72\xb6\xfe\x0f\xf5\xfd\x1d\x0c\x9d\x9d\xf9\xf9\x9e\xce\x20\x3c\x27\x3b\x9b\xea\x5f\xc6\x8a\x52\x0e\x63\x4e\x01\x8b\x08\x9c\x4f\x48\xa6\x3a\x2b\xa0\xb9\xd4\x92\xa1\x79\x07\xc0\x51\x81\x54\x7d\xea\xa4\xa0\x03\x94\xee\x0e\x02\xa5\x0d\xa7\x39\x28\x4d\xa7\x26\x27\x95\xcd\x00\x88\x09\x85\x93\xe2\x85\x69\xee\xdf\x15\x9e\x32\x47\x6f\x8c\xa6\x05\xda\x7f\x19\xb3\x61\xe1\x5b\x06\x05\x3a\xdb\xec\xa3\xd6\x3c\x70\x9b\xfb\x96\x7e\x2c\x75\x52\x0e\xf2\x4d\x0b\x3d\x74\x98\x91\x36\xb5\xc8\xdc\xd6\x4e\x40\xe6\x29\x64\x5e\x37\x55\x01\xaa\xf5\xde\x9b\x8b\x88\x15\xb1\xa6\x5b\x06\x93\xa5\x53\xa3\x08\xfc\xa8\x9a\xd7\x98\x01\xf0\x69\x29\x49\x2a\x4a\x75\x29\xe4\x54\x66\xa4\xed\xea\x82\x2b\xad\x8d\x40\x1c\x05\xb7\x6f\x68\x1d\x92\x1c\xee\xc1\x33\x0b\x06\x18\x00\x0c\x98\x87\x2d\xd1\x94\x6b\x88\x47\x5f\xe6\xc9\x79\x92\xf1\xf4\x1d\xd5\xc4\x7e\xc8\xe4\x0c\x1f\xeb\xba\xd4\xf0\x52\x2c\x48\xc5\xbd\x1b\x57\x49\xc2\xbc\xb5\xb8\x80\xe4\x41\xac\x59\xd5\xb9\x8b\xa6\x7f\x1b\x60\xee\xae\x52\x1b\xde\xad\x68\xf9\xe6\x57\xd7\xda\x41\xbb\x11\xb8\xe0\x18\x48\xd9\xc4\x38\x0f\x57\xff\xac\xb2\x42\x67\x16\x3f\x2a\x6b\xb7\x1b\x2c\x50\xb8\xe3\xe4\xe1\x5d\x83\x6b\x94\x68\xfa\xe2\x0e\x6f\x91\xea\x56\xd2\xef\x1e\xe8\x5d\x04\x7c\x97\xa4\x89\x77\xd9\xf1\xcd\x60\x35\xd3\xe5\x25\x38\xd5\x07\xd7\x63\x44\x60\x40\x01\x37\x62\x97\x16\x82\x23\x41\x78\x42\x4b\xc8\x00\x4f\x21\xf2\xc0\x99\xcc\x30\x9f\xc1\x19\xfc\xee\xf1\xfe\x07\xd7\x0a\x8d\x33\x64\x26\x0a\xbf\x85\xa1\x8e\xa4\x05\x98\xf5\x7b\x44\x08\xc1\x0e\x5c\x0c\x84\x6a\x99\xe7\xa2\xef\x61\x8b\x19\x55\x53\xcf\x24\x78\xd0\x06\x75\x75\x86\x55\x57\x97\xdc\x1f\x3a\x66\x8f\xb1\x7d\x80\xf3\xe4\x59\xd2\xda\xdb\x37\x29\x4c\xaa\xde\x15\x58\xd5\x8a\xad\x6b\x68\xd6\x6a\x36\x49\x27\xec\xa2\x5c\x9c\xf9\xd3\xc5\xf5\xd6\x77\x20\x61\x03\xe5\x58\x04\xca\x48\xaa\x8b\xcc\xd0\x30\x16\x2c\x42\xd4\xdf\x24\x87\xae\xcb\x6b\xaa\x0a\x85\x49\x6f\x4c\x5e\x0e\x84\x01\xca\x8c\xad\x14\x1d\x52\x5c\x98\xab\xd9\x12\xb4\x2f\xb6\x4f\x17\x17\x4f\x5f\x81\xba\x95\x44\xdd\x00\x6a\xf6\xf9\x58\xa4\xcf\x79\x21\x5a\x71\xe1\xba\x1d\x45\xa4\x89\x7a\x59\xbe\xe3\x45\x9f\xc3\xaf\x36\x91\xb9\x69\x49\xf1\x85\xc8\x06\x32\xd7\x30\x5a\xd5\x48\x78\x66\x62\xc6\x02\x58\x2d\x48\xd3\x4f\x63\x00\x32\x42\x1c\x03\x24\xc6\xc1\xeb\x8e\x35\xc6\x90\x69\xf5\x67\xd1\xfb\x90\x80\xf8\xed\x8d\xfc\x55\xfd\x73\xd8\x38\xdd\xa1\x61\xef\x74\xb4\xf3\x89\x75\xce\x1f\xf1\x7c\xaf\x6c\x6e\xb4\xba\xa5\xfc\x51\x55\x50\x23\x6f\x82\x96\xc5\x54\xc1\x47\xc1\x26\x9e\xec\x78\x04\x0f\x1c\x8e\x51\xfc\x76\x20\xf4\x80\x1f\x64\x00\xeb\x40\xcf\x58\xd9\x46\xf1\x80\xd4\x3d\xd2\xc4\x41\xd1\xf5\x9e\xb2\x46\x03\xc6\x00\xbf\x1e\x92\xb1\x6f\xdb\x81\x39\x5b\xcd\x20\xb5\x10\xc4\x93\xc1\x2c\x96\xef\x35\xe4\xd3\x30\xdd\x50\xe5\x89\xad\x2b\x52\xd3\x2e\x17\x93\x77\x9a\xa6\x14\x23\x35\xa7\xb3\xbc\x5e\xc1\xdf\x69\x9b\x12\x19\xc6\x10\xe7\xa1\x2c\x91\xd2\x74\x51\x4e\xfb\x23\x30\x58\x03\x7f\x2b\xf5\xa2\x77\xe9\xbe\xcf\x62\xd4\xc4\x3a\xc0\x84\xa4\x20\xa4\xda\x0d\x07\xa8\xd1\xf2\xe8\xa6\xbe\x2b\x72\x31\x96\x17\x62\xcf\xf0\x5c\xcd\xc6\x25\x49\xff\xd9\xda\xa9\xd4\x47\x2e\x37\x45\x87\x8a\x46\xa3\xae\x02\xbd\x82\x6a\x2b\x95\x80\xad\xb5\xe5\xef\x6b\x0f\x4d\xc3\x9a\x9b\x35\x5a\xa7\x16\x04\xf0\xa1\x00\x45\x3f\xd9\xf6\x2f\x44\x56\xbe\x4e\x8a\x52\x64\xea\x46\xb3\xb7\x17\xce\x99\x5e\xd7\xc9\x50\x51\xf3\x9c\x89\xcb\x49\x9a\xf4\x93\xf2\x8a\xf1\xe2\x83\x0e\x24\x0c\x0c\x9a\x48\x05\xbe\x12\xec\x06\x6b\xc1\xbb\x04\x17\x60\x78\x7b\x22\x58\xc7\xd2\x1f\xec\x6f\x6e\x9a\x17\x96\x21\x6b\x2e\x75\x83\x77\xdf\x60\xd3\xc3\x4c\x63\x48\x6c\xa3\x5c\x54\x69\x5d\x1b\x02\x70\x53\xbe\xa1\x15\xb8\x07\x60\xde\xec\x2a\xa9\xd5\x59\xbc\x48\xbe\x3e\xf3\xe0\x5b\xe4\x99\x11\x55\x55\xa3\xe1\xe9\x75\x85\xde\xe1\xf7\xaa\xe2\xd9\xb3\x25\xae\x73\x63\x22\x92\x26\xbf\xfe\x53\x16\xd8\x22\x63\x2a\xca\x9f\x12\x31\x63\xdb\x7a\x6a\xbe\x51\x24\x07\x3f\xb6\x13\x49\x2d\xb6\x7d\x17\xb1\x36\x26\xc0\x6c\x5b\xe6\xa3\xed\xb9\x85\x15\xd4\x51\xf8\x19\x46\xb7\x8a\xbb\x8d\x39\x53\x6e\x43\x96\x31\x94\x09\x66\x81\x52\x2d\x9f\xfa\x2d\xe7\xcd\x85\x56\x54\xe0\x10\x54\x97\x0f\x06\x1e\x5e\x37\x2b\x63\xff\xc8\x26\xbc\x28\x92\x0b\x9a\xec\xd2\x79\x49\xaa\x61\x18\xfc\x8a\x2f\x4d\x68\xdd\xae\x3b\x26\x61\xcd\x17\x2e\x98\xc1\x44\xef\x6b\x77\x32\x2d\x46\x26\xa2\x0d\x45\xcc\x63\x51\x4e\x27\x26\xea\x37\x40\x06\x81\x21\x9c\x5a\xcb\x65\x99\x34\xfb\x44\xb9\xa5\x69\xcc\x0a\x42\xc0\x3c\xb9\x40\x83\x1d\x82\xaa\x85\xea\x3d\x20\x15\x84\xe7\xd6\x47\x14\x03\x1e\x89\xb6\x1e\x07\xd8\x29\x92\xdc\x2e\x60\x10\xe2\x0f\x5d\xd1\x0a\xc4\x47\xb5\x10\x70\x05\x90\xb6\x6c\x97\x42\x52\xeb\xe5\x8e\x8c\x7b\x53\x56\x77\xbb\x91\x43\x5f\x8d\x76\x15\x64\xed\xce\xaf\xaf\x33\xdc\xd0\xc8\x08\xbd\x8c\x36\x85\xe7\x35\xe7\x22\xce\x86\x18\xe1\xdb\xe4\xcc\x3b\x60\xf6\xe1\x66\x62\xdf\x45\xc7\x8d\x9f\xaa\x28\x44\xbf\xbb\xd1\x78\xbf\x5d\xb5\x30\xf9\xbe\xbd\x61\x4d\xec\x5b\x55\x8b\xa2\xdd\x81\x4e\x58\xc1\x07\xea\xc5\xac\x56\x75\xbd\x20\xcb\x84\x92\x1e\x0c\x88\x9e\x8b\x3e\x4f\xfb\xd3\x94\x97\x5a\xe8\x13\x17\x1b\x59\x51\x03\x38\x43\x97\x23\x71\x05\xae\xce\x65\x9e\x9c\x9f\x8b\x7c\xf1\x23\xc0\x47\x4c\xbc\xeb\xc3\x4b\xcc\xc5\x8a\x23\xbc\x85\x37\xf7\xea\xf3\x48\x2d\x5a\x04\xcb\xe7\xbd\xc5\xdb\xac\x22\xf7\xf0\x05\x59\x95\x57\xd1\x11\xde\xaa\x5f\xfc\xfc\xe2\x6d\x58\x7f\x80\x61\x0a\xe4\xa8\xc2\x28\xf3\x85\x27\x36\x7a\x1c\x23\x7d\xcd\x3b\x91\xf6\xf8\xe9\x5e\x8b\xa5\x4f\x61\xe4\x44\x44\xe4\xef\x34\x3a\x98\xbd\x20\xa2\x63\xac\x3f\x7d\x2d\x62\x01\x8a\xa4\x4c\x94\xc6\xae\x31\x4a\xb6\x90\x5f\x8e\x0e\x51\x3d\x59\x4e\xeb\x0f\xae\xdf\x32\x3c\xaf\x61\xf6\xc7\xda\xf3\x9a\xd3\x2d\x8c\x1c\xd9\x99\xc4\x40\x4c\xe6\xc8\x46\x11\xae\xee\x84\xaa\x5e\x78\x5a\x48\x0d\x45\x17\x30\x23\x10\xb0\x37\x1e\xe3\xd9\xd5\x58\xe6\x02\x54\x56\xd3\x2c\x15\x45\x01\xb1\x59\x51\x9e\x61\x84\x22\x5a\x2d\x3d\xe6\xd9\x94\xa7\xe9\xd5\x6a\xe7\xbf\x86\x8b\xb5\x04\x60\xd1\xf9\xef\xf3\xac\x2f\xd2\xbd\x2c\x19\x83\xba\xe2\x65\xae\x58\xe7\xba\x93\x1c\x90\x8b\xe8\xa1\x8a\xd2\x0b\x3c\x5e\x21\x31\xb0\xf1\x6a\x4d\x0c\xe3\x24\x9b\x4c\x4b\x4c\x94\x88\xbe\x9e\x2b\xab\xee\xbe\xbd\xd6\x40\x22\x79\x19\xeb\x65\x25\x6f\xa7\x63\x91\x27\xfd\x66\xe6\x49\x43\x32\x7c\x31\x1a\x0f\xae\xb7\xfc\x6d\x93\xd8\x1d\x66\xad\x96\x56\xe1\x24\x59\x52\x8a\x66\x16\x72\x2b\xa8\x46\x87\xe0\xa4\xda\xa4\x09\x27\xb9\xaa\x19\x5a\x3d\x8b\x4d\xdc\x5a\x4b\x89\xea\x06\xaf\xd3\x1a\xaf\x15\x17\xdc\x19\xbf\x20\x67\xcf\xad\xfe\x95\xa8\x9d\xd4\x49\xd1\x31\xda\xe7\x1a\x6b\x39\x9e\xdf\xe7\x99\x50\x6c\xef\xbc\x98\xb1\x6b\x5c\x65\x6a\xdc\xaf\xbf\x47\xa8\x97\x1a\x0c\x95\x22\x4c\xb3\x84\x3e\x2a\xd7\xd7\xe1\x66\x86\xaf\x89\xb5\x59\x9b\x82\x0b\x57\x86\xbb\x0a\x93\xd0\x8e\x5d\xfa\x22\xb6\x09\xb4\xad\xfc\xe0\xbd\xb6\xe4\x69\x5b\xeb\x9e\xb6\x31\x67\x74\xf6\x4c\x26\x19\x7e\xd5\xb2\x09\x06\xe9\x72\x48\x39\x8c\xd2\x51\x9c\x41\x51\x4e\x14\x7c\x66\x16\x93\xcb\x06\xd5\x3e\x9a\x57\x0e\xbe\x6c\xb5\x76\x9d\x51\x18\xec\x21\xb4\xad\x8a\xc8\x0c\xc2\x39\xc5\xc8\x97\xc6\x3a\xaf\xe7\xdf\x1e\xf5\xac\xb4\x82\xa0\x9f\x1b\x62\x15\x05\x49\xd9\x12\x68\x88\x48\xb6\x4b\x20\xe2\xfe\x38\x89\x14\xd6\x50\x38\x01\x77\x96\xdb\x7b\xbb\xc9\x64\x8c\x4d\x34\x37\x09\xa1\xb5\xa2\x9e\x8c\x06\x40\x28\x95\x81\x31\xfa\xea\x4d\x87\x1f\xff\x15\x24\xc1\xd5\xfb\xfe\xc6\xb3\x63\xb8\x99\xa7\x5c\x70\x91\xcd\x81\xd4\xd5\xf6\xe4\x1d\xf6\x5a\x6f\x38\x92\x2a\xb2\xed\x1d\xb3\xe9\x0e\xb7\x64\xcc\x42\xb6\xa6\x03\x82\x84\xae\x13\xfb\xf1\x6e\x3a\xba\x23\xaf\x3f\xb0\xb0\x22\x8b\xea\x63\xb0\x13\xc9\xa1\x7a\xc1\xb0\xa6\x3c\xbb\x72\x72\x67\x9d\x06\x8f\x25\x19\x3b\x23\xeb\x7b\x36\xdf\xa6\x56\x6b\x0f\x13\x14\xfe\xb0\x19\xbf\x62\x33\xc5\xb3\x64\xd6\xae\x80\x3d\xca\x21\x86\x47\x79\x45\x8d\x71\x06\x03\x1d\x75\xc3\xb8\x05\x40\xd0\x26\x9d\x01\x49\x30\x3e\xe3\xb9\x68\x93\x06\x7d\x39\x4d\x07\xa0\xc9\xce\x8d\x0e\x93\xac\xbf\x31\x44\xd1\xf6\x66\xc6\xe2\x00\xc1\xa5\x49\x66\xbc\x2b\x92\xc2\x82\xbc\xbf\xc6\xc8\xa5\x02\x13\x36\x0a\x64\x5f\x2b\xa6\xaf\x13\xc3\xae\xce\x5f\x33\x87\x32\xcb\xad\x1b\xf0\x83\xa6\xa2\xe2\x83\x79\x81\x81\xb1\x08\xee\x85\x89\x79\x03\x82\x34\x67\xe8\x84\x0c\xd1\xe8\x83\x79\x2e\x67\xfb\x2e\xf4\x8a\x59\x3c\x30\x33\x70\xfa\x71\x36\xe2\x05\xc6\x59\xa2\xfe\x1e\x40\x8e\x10\x38\x05\xf3\xe0\x81\x47\xff\x5c\x85\x63\x7d\x19\xa3\x2c\xdf\x10\xae\x60\xe1\x29\x28\x33\x74\xd2\x38\xb4\xd2\x0c\xad\x2b\xcc\x75\x45\x04\xc9\xe4\x98\x1a\x23\x95\x0b\x91\x5f\x95\x60\x2c\x08\x04\xd0\x45\x1e\xd3\xb8\xd5\x43\x6b\x2a\x30\xb0\x90\x80\xa0\x26\x78\x98\xb7\x71\xf6\x6b\x26\xc4\x00\xca\x7a\xc0\xa3\x23\xe3\x3f\x20\xd9\x74\x15\x24\x93\x50\xd7\x57\xd2\x2e\x54\xcd\x45\x2d\xc2\xe2\x31\x4d\x34\x41\xad\x1a\x1f\x98\x67\xb0\xe7\x5b\xb0\x20\x52\x8a\x75\x25\x50\x20\x01\x0f\xc3\xd8\x17\x5a\x36\x1c\x73\x2c\x70\xa4\x4c\xcf\xe2\x3f\x05\x21\x5c\x51\x72\x74\x98\xbd\x96\x7c\x40\xdf\xce\x06\x7f\xad\x50\xc0\x2c\xc5\xa1\x27\x15\xb3\x24\x6c\x19\xe3\x0b\x74\xdf\x09\xbc\x1e\xe2\xa6\x17\xb5\x1e\x65\xff\x07\x6c\x2d\x40\x6f\xb6\xc8\xd4\x22\x62\x65\x11\xf1\x87\xa8\x3a\x4a\x2f\x6f\x50\xb1\x8c\x2d\x85\x51\xca\x50\xae\xc6\xd3\x13\x51\x9f\x0c\xeb\x25\x01\x17\xef\x99\xc1\xf7\x33\x72\x07\x6b\x1a\xc0\xb3\x08\x05\xd0\x01\x0a\x93\x72\x24\xa7\xa5\x6f\xa1\x65\x28\x37\xde\x68\x8d\x92\x9d\x4f\x79\xce\xb3\x52\xb8\x4c\xd9\x24\x8e\x47\xe1\xdd\x28\x66\x8d\x3e\x5a\x70\xdb\xc4\x36\x22\xb0\x17\xd3\x6b\xf2\x55\xf1\x58\xbf\x5d\x3c\x02\xc7\xa9\x58\x6c\x71\x0a\x91\x4b\xb6\x6b\x51\xe8\xd2\x98\x0a\x5c\x91\x8f\x36\xf5\x87\x35\x7d\x89\x58\xac\x04\x62\x32\xe0\x0c\x52\x71\xce\xfb\x57\x4e\x6f\x96\x11\x3a\x76\xb1\x65\x4c\xce\xb0\xd6\x3f\x27\xd3\xbd\x7e\x5f\xa4\x02\x97\x02\x89\x93\x31\x77\xf6\x6f\x64\xa2\x1b\xad\xb7\x63\x0d\x6c\x26\xba\xd6\x96\x81\xaa\x53\xb5\xe7\xf8\xb9\xdf\xb7\x71\xda\x98\x37\xb0\xfb\xb1\xac\x38\xbe\xbd\xeb\xcf\x7b\x47\x6f\x0f\xde\xfe\x73\x9b\x9d\x05\xf0\xcf\xf4\xca\x32\xb5\x52\x70\xa3\x9c\xd1\x7d\x22\xda\x62\x10\x85\x29\x82\x96\x49\x1d\xb4\xd8\x18\x56\x24\x19\x1b\x4e\xcb\x69\x2e\xd8\x05\x26\xdd\x01\xae\xc6\x2e\xaf\xb6\x9b\xbd\xd6\x4b\x1c\x0c\x80\xed\xce\x5d\xf4\x30\x7c\xc4\xbc\xba\xdb\x16\x4b\x2a\x8b\x18\x0f\x75\x15\x26\xa4\x8c\x31\x5b\xad\x58\x98\xac\xb9\xe1\x75\xab\x81\x83\xd6\xd7\xd9\xb1\x7e\xce\xfa\xbe\xb2\xc6\xf7\xc5\x90\x90\xc0\xe0\x8a\xda\x21\x0e\x53\x29\x31\xc7\x54\xe1\x32\xd9\xf6\xd2\x69\x9e\x5f\xb1\x52\x5c\x96\x95\x58\xb7\x34\xfa\x38\x84\x45\x04\x08\x9a\x72\x81\xc6\xbd\x45\x62\x91\x57\x6b\x94\x72\xd2\xf2\xa3\x46\x54\xeb\x60\x49\xcb\x8b\x5f\x51\xad\x05\x05\x2d\x3f\x78\x83\x4e\xac\x75\x89\xc7\xc0\x78\x80\x12\x5f\xae\x9e\xc9\x93\xe5\x27\xd7\xba\xc2\x06\xb9\xcd\x2e\x64\x7d\xb9\xf0\x13\xe1\x84\x43\x44\x4b\x0a\x93\x40\xef\xac\xcc\xa7\xe2\x0c\xb3\x08\xda\x40\x33\xaa\xd8\xa0\xb4\xbe\xc9\xd5\xd5\x00\xaa\x78\xa8\xa5\x38\xc0\x47\x83\x33\x5f\x94\xe1\xf8\x2f\x8f\x8d\x9c\xe9\x8b\x47\x31\x12\x63\x0e\x71\xc0\x53\x88\x6e\x83\x52\x37\x62\x93\xa4\x0d\x84\xf4\xc9\xf1\x38\x02\x62\xbd\x33\x20\xf9\x4d\x96\x32\x63\x30\xeb\x90\xc9\x59\x9b\xa5\xa2\x6c\x14\xf8\x64\xe3\xac\x28\xc5\x84\x69\x91\xf3\x80\xa5\x52\x7e\x60\xbc\xd4\xc1\xc5\xe5\x40\x27\x59\x4f\xaf\x58\x73\x56\x0e\x9f\xb6\x74\xde\x83\xa1\xb6\x7b\xcc\x4a\xe2\x9e\xac\xe7\x7a\x9e\xcb\x59\xc1\x24\x24\x19\xc2\x38\xc1\x20\x44\xc2\x75\x11\x83\xb6\x7d\xf9\x8d\xf9\x15\x1b\xf1\xc9\x04\x24\xe5\xbc\xf4\x60\x28\x9c\x1d\x27\x05\xdc\xfb\x03\x6a\xc5\x6c\xcc\xa1\x75\xdf\x3a\x2b\xec\x85\xc8\x87\x28\x97\x03\xb7\xc3\x48\x04\x06\xc8\xa3\x60\xce\x09\xcc\x6e\x92\xcb\x5e\x2a\xc6\x10\xb1\x4b\xa7\xbf\x86\x54\xd8\xe6\x2a\x6c\x5e\xc2\x8a\x5c\xb5\xda\x5a\x8c\xc4\xd3\x14\x54\x37\xda\xd4\x50\x51\xd4\xe9\xd8\x24\xd7\xb3\x31\x01\xb5\x0b\x3f\x32\x64\x5d\xbb\x5e\x33\xca\x69\xd8\x17\x82\xc2\x93\x09\xe6\xe2\xab\x8c\xb9\x6d\xde\xd6\x85\xd0\xe3\x3f\xbb\x3c\x43\x74\x95\x93\x33\x6a\xcc\x4f\x57\x9e\x95\x72\xc6\xf3\x41\x01\xeb\xa0\x80\x2b\xfa\x25\xf8\x80\xc9\xa1\x3e\x09\x65\xa1\x4f\x70\xd7\x5e\x72\x60\x6d\x83\x41\xec\xcc\x25\x8b\xc6\x33\x2e\xb0\x1d\xa4\xef\x71\x99\xec\xf4\x71\x6c\xb9\x38\x38\x6c\x97\x75\x42\x9a\xd8\xad\x84\xf3\xc2\x76\x55\xeb\x48\x68\x1f\xc4\xfc\xba\x26\xdd\x3e\xa3\xe7\xbc\x45\x88\x59\xb4\xdb\x30\xb4\x57\x6e\x43\x91\xd0\x4e\x75\xf3\x30\xfe\x97\x8d\xac\x19\xd0\x8b\x07\x0f\x2a\xa7\xcf\xbe\x70\x8d\x9c\xd5\x2f\x06\xdb\x21\x42\x2b\x9a\x0d\xf6\x90\xe9\x80\xac\x8d\xc9\x65\x9b\xa9\xdf\x18\xe6\x15\x7e\x6e\xb4\xb4\x4c\x57\xc3\x83\xf5\x3e\x35\xe1\xbb\xbd\xcf\xcf\x2a\x9f\xbb\xea\x32\x7e\x3e\xd2\x89\xae\xc9\xd9\x8f\x05\x41\x94\xe5\x68\x26\xf2\xa4\x10\x6d\x43\xd3\x50\xfa\xcf\x15\xff\x3e\x40\x0c\x6b\xeb\x14\xbd\x6d\x76\x86\xbb\x86\x14\xf2\x0c\x16\xf3\xcc\x97\x13\x68\xf3\x95\xec\x42\xe4\x25\x06\xcc\xad\xe2\x8a\x97\x45\x93\x36\xd0\xe1\x73\x2b\xdb\x1c\x34\x08\x17\xa5\x84\x7c\x9a\xb6\xcf\xf8\x12\xa5\x98\x28\xd3\x75\x54\xbf\x64\x36\xb3\x22\xee\x0b\x80\xa0\x0e\x72\x4e\x0a\xa3\xcf\x0d\x91\xda\x98\xeb\xd5\x7b\xb6\x6c\x07\x06\xd5\xf4\xfa\xd6\xea\x3e\x90\x23\x9d\x11\x48\x46\xd1\x11\xca\x67\x8c\x29\xb6\xd7\xa7\x97\xcc\x87\xc2\xa8\xca\x83\x98\x27\x45\x0d\x9a\x9a\x34\x0b\xbe\x04\x8c\x55\x64\x33\x61\x3b\x8f\xd5\x86\x7a\x51\x79\x4e\xbd\x2c\x67\x79\x4b\x67\xb4\x86\x2d\x74\x82\xdf\xcc\x9a\x79\x13\x87\x98\x83\x12\xf5\x76\x85\x01\xa1\x2d\x7e\xa8\x7d\x23\x28\xc5\x51\xf8\xb5\xba\xe1\x74\x8d\x1f\x1f\xeb\x54\xfd\x0f\x63\xbe\x7d\xb9\xf8\xdf\xa9\x28\xca\x24\x3b\x07\x63\xae\x0e\x9a\x30\xcb\x21\x29\xb0\x00\xe6\xb4\x17\x83\x78\x73\x32\xd3\xd5\xcc\xbc\x8f\xc4\xff\x4e\x93\xdc\xb7\xf3\xf6\xc7\xda\xf6\xfb\xa6\x09\x91\xec\xc8\xf5\x6b\x28\xfa\xfe\x59\x64\x03\xee\xd9\x78\xdb\xc7\x90\x3f\x86\x20\x90\x54\x52\x98\x61\xb3\x5d\x76\xff\x3e\x19\xc8\x83\x07\xf5\xc6\xe8\x4b\x3f\xc4\xfc\xb5\x26\x20\xa9\x0f\x9e\xfd\x06\xce\xa5\xec\xef\x64\xc4\xf8\x89\x8c\x59\x5b\xc7\x99\x41\xd3\xd5\xf8\xc5\x5b\xc5\xc6\x59\x03\x5c\xfb\x3d\x5c\x79\xa8\x3e\x3b\xb2\xe9\x76\x3c\xa8\xaf\xc7\x4b\xaa\x7b\xcf\x3e\xd7\xee\x21\x6b\x78\xe7\x22\x37\x8b\xd9\xbb\x02\xe2\x47\xc7\xe4\xd7\xd5\xae\xb4\xea\xb8\xce\x64\xfe\xa1\x6d\xf3\xd5\x94\xd2\x84\xae\x67\x49\x69\x64\x30\x11\x58\xe4\xf9\x67\xe3\x4c\x9b\x65\xf9\x42\x22\x91\xaf\x34\x40\x23\x50\xcd\x3a\x49\xc8\x2f\xea\xfb\x5f\x35\xb1\xfd\x2b\x54\xb5\x4a\x0a\xf5\xc3\x52\x48\x99\xb1\x0f\x42\x4c\x4e\xe4\xb9\x00\x22\x19\xee\x98\x43\xc6\x0a\x01\xa8\x15\x65\x34\xa0\x0b\x75\x31\x52\xd0\xce\xe2\xdb\x23\xef\xc4\x63\xcf\xd3\x1a\x38\xa1\x8d\x48\x3d\xff\xa6\x88\x96\x42\x3d\x4b\x72\x08\xc5\x08\x6f\x23\x93\x33\x84\x43\xfc\x9c\x42\xa4\xa2\x5f\xca\x7c\xcd\x33\xe0\xf7\xfb\x82\x70\xcb\x00\xc2\x72\x8b\xc1\x60\x62\x8f\xfb\xee\xff\x4e\x45\x7e\x75\xac\xe1\x37\x69\x0b\x12\xf2\x37\x32\xde\x4c\x96\x6c\x88\xc6\x86\xe8\xfd\x18\xba\x41\x59\xe5\xee\x7d\x0f\x68\xe8\x48\x60\x56\x50\xeb\x61\x03\xae\x4d\xdf\x6b\x41\xe7\x90\x6d\x8e\xc1\xc8\xed\xd2\xd8\x6c\x52\x98\x1f\xca\x3c\xaf\x0c\x20\xfd\xdc\x19\x80\x53\x00\x84\xaa\x81\x54\x52\x49\x0a\x21\x2e\xd4\x0b\x81\x84\xb1\x71\x43\x8f\x2e\x99\xcd\x8a\xe1\x4d\xcc\xcd\xac\x4e\xf0\x04\xd5\x0d\x2a\x9c\xd9\xdc\x57\xb1\x51\xe8\x4a\xf7\x69\x82\xb8\xd8\x72\xad\x45\xe4\xde\x3e\x0b\x16\xc6\xed\x89\x9c\xad\x40\x84\x68\xde\x43\x56\xbe\xe8\x55\xee\x3a\xfd\x1e\x0e\xcb\xf9\x7a\xfa\xf5\x6c\x09\xb9\xc1\x7e\x52\xec\x73\x9f\xa7\x10\xfa\x46\x07\xc4\xd2\xac\xef\xdc\xd0\x37\xf6\xd9\x96\x81\xe1\xb7\x05\x33\x37\x36\x4d\x32\x10\xcf\xf9\x24\x29\x79\x9a\xfc\x0a\x17\x87\xdf\xd0\xcb\xea\x4c\x1b\x69\xc6\x98\xb4\xed\x96\xf2\xb5\x9c\x19\x67\x1f\x53\x97\xa7\xa5\x0d\xac\x43\x01\x47\x63\xeb\xc8\x49\xb4\x6e\xcf\x65\x86\x36\xd2\x9b\x2a\x1d\x39\x4e\x7e\x15\x95\x10\x4a\x1e\xee\xbd\x4f\x45\x66\x62\x32\x21\x85\x31\xb9\x50\x3d\xc2\x68\x43\x94\x8c\xf9\x07\x75\x37\x39\x17\x76\xdc\x6a\x30\xfe\x29\x0b\xe3\xd3\x61\x76\x16\xc2\x1c\x89\x0c\x62\x4f\x4c\x92\x4b\x91\x16\x90\x16\x49\x66\xff\x99\xea\xeb\x4a\x75\x6b\x3c\x6f\x26\x10\xa6\x0c\x96\x50\x93\x2b\x0b\xe9\x3d\xae\xc2\x29\xeb\x54\xe7\xf7\x77\x3d\x08\x78\xc8\xd8\xf8\x06\x11\xd1\x36\x56\x80\x38\xce\xde\xef\xe5\xfa\xb1\x37\xf1\xfa\xba\x96\x09\xac\x63\x50\xd9\xe8\x78\x0b\x1d\x77\xa8\x32\xda\x7f\x98\xce\x75\x4f\x8b\xc7\xfb\x90\x84\xf0\xa9\x87\xdb\x09\xe0\x9a\xd1\xde\x3c\x50\x80\xaf\xd6\xeb\x8b\xac\x04\x3d\xad\xa7\x2d\xc5\x50\x92\x58\x14\x1b\xa6\xfb\xa2\xf0\x4c\xc7\x59\xaa\x8c\x1d\x02\x2c\x61\x77\xcf\x89\xff\xae\x02\xf2\x13\xd8\xf7\x4c\x0b\xe3\xfd\x8f\xec\xc8\xa0\xea\xdb\xab\x30\x88\x7f\x08\x74\xd1\x0a\xdb\x78\xbf\x2f\xa7\x99\xcb\x91\x04\x51\x1a\xd4\x3d\x80\x31\xb8\x20\x5d\x68\x36\x94\x2e\xf2\xb5\x99\x55\x31\x37\x4d\xdb\x5c\x79\x37\xfe\x7c\x03\x63\xd0\xa7\x97\xd8\x34\xf6\x8b\x82\x66\x7e\x0f\x48\xc6\xa9\x97\xc0\x0d\x21\x61\x9e\xbf\x1a\x48\x98\x42\x2a\x02\x49\x71\x90\x98\x2e\xdd\x87\xe9\xd6\x75\xd7\xec\x5d\x67\xde\x79\xa9\x4e\xa7\x53\x19\x97\xd9\xbf\x49\x8e\x16\xd5\xde\xbd\x0b\x0f\x51\x4c\x81\xa6\x85\x94\x90\x1a\x5d\x66\x65\x72\x3e\x95\xd3\x02\xad\x82\xdc\x25\xb6\xc6\xbc\x31\xda\xc4\x44\xf8\x47\x92\x69\xe1\x38\xe2\x54\x15\x9f\xda\xae\x75\xab\x6d\x92\x14\x55\x2d\x33\x76\xbd\x86\x15\x07\x6e\xe4\x14\x77\x59\x33\xc2\x4d\x42\x62\xdb\x76\x90\x3e\x3b\x56\x11\x87\xd2\xc6\x29\xe4\x8a\xe9\x69\xba\xb1\xb5\x96\x83\xa0\x6f\x8b\x36\x6b\x34\x5a\xed\x18\x6f\x3b\x57\x6c\x30\x27\x52\xa6\x8b\xd4\xfb\x59\x62\x66\x3a\xf8\x4b\x46\xcf\xf4\x1a\xc4\xe3\x68\xfe\x64\x6a\xb8\xc0\xc3\xce\x08\x9b\xc4\x33\x56\x2c\xad\xc8\x2a\x89\x7b\x1a\xe0\x42\x42\xa5\x7c\x91\x76\xff\x1f\x7b\x6f\xbb\xde\xc6\xad\x24\x0c\xfe\xd7\x55\x94\x3d\xe7\x98\xa4\xd4\xfc\x94\x3f\xa9\xc8\x1e\xc5\x56\x12\xcf\xd8\x96\x5f\xdb\x49\x4e\x46\xd1\x4a\x50\x13\x14\x3b\x6e\x76\xf3\x74\x37\x25\x32\xb6\xf6\x99\xbf\xfb\x7f\xff\xbc\x17\xb0\x7b\x61\x73\x25\xfb\xa0\x0a\x9f\xfd\x41\x91\x22\x9d\x78\x76\xe2\x79\x26\x47\x44\x03\x85\x42\xa1\x50\x28\x14\x0a\x55\x54\x27\xdf\x52\x40\xcb\x9d\xc5\x74\x3b\x27\xdc\x92\xf2\x86\xf3\x7d\x3e\x71\xe2\x1c\xe0\xdd\x93\x90\x40\x2c\x55\x4e\x71\x92\xee\xb6\x5b\x03\xe9\xfd\x96\xa9\xe6\x27\x37\x38\x24\x66\xec\xeb\x8b\x0f\x4d\x19\xdb\x5f\xfe\x9d\xc5\x13\xf5\x27\x59\x1d\xe5\x0f\x69\x8f\x94\xbf\xd0\x4a\xb9\x05\x88\xea\x21\xf3\x47\x16\xf5\x7d\x16\x91\x4c\x64\x16\x67\xe0\xd2\xa5\x4b\xe0\x20\xcd\x54\xbf\x4d\xa4\x91\x82\xd9\xe4\x18\xb2\x6c\x9b\xb0\x95\x2d\x55\x66\xc1\x8c\x27\x93\x84\x0b\x42\x70\x96\x06\xf4\xa4\x76\x1e\x4f\x05\xcc\xe8\xa3\x8e\x2d\xc5\x28\x02\x0c\xee\xff\x59\x4c\xd7\x61\xf8\x34\x20\x09\xb2\x8c\x47\x10\xb2\xe8\x62\xca\x2e\x78\xda\x02\x8c\x0f\x28\xf4\xe8\x30\x9c\x43\x9d\xec\xfb\x68\x6b\x95\x03\x6d\x78\x70\x46\xe8\xa1\x11\x4b\x40\xc4\xcf\x12\x49\x3c\xc1\x0b\xf0\x36\x89\xa5\x5e\x85\x00\x91\x42\xb6\xf5\xd6\x05\x98\xc9\xec\x7b\x08\x4f\x14\xe8\xfb\x01\xf2\xb8\x8a\xc7\x2a\x9e\x27\x9f\xb1\xf1\x04\xcd\x93\x66\xc2\xb2\x78\x82\xd4\x82\xba\xb9\xce\xb0\x7c\x45\x48\xa1\x60\x61\x70\x11\xf1\x41\xc3\x9e\x4d\x49\x71\x6c\x47\xb5\xdc\x96\x88\x96\xdb\x4e\x19\xa2\x45\x13\xfa\xdb\x93\xe2\xde\xd4\x11\x0c\xd4\x94\x46\xea\xba\xf4\x84\x42\x4d\x56\x27\x85\xa0\x3c\x10\x66\x77\xf4\xa8\x1b\xe4\x18\x75\x8c\x3e\x9f\x5b\x4e\x27\x92\x10\xff\x9a\x66\x2c\x0b\x7c\xfc\x53\x9c\x3a\x95\x2d\x10\x0b\x78\x34\x35\xc6\x3a\x29\x1d\xd8\x20\x8e\x42\x3b\x5a\xa0\xc5\xf3\x95\x0f\x34\x9c\x13\x0c\xbe\x79\xc1\xc4\x07\x44\x2d\x71\x44\xc0\x34\x08\xf2\x7f\x05\xe5\xa5\xc3\xb9\xa9\x20\xbd\xcf\xe5\xc4\xe8\x53\x85\xa9\xa0\xfd\xd2\xa9\x5c\x56\x22\x82\xba\xbf\xac\x72\xdd\x5a\x70\x93\xaa\xa5\x8e\x2d\x58\x46\x35\x84\xea\x2d\x83\xa1\x26\x01\x1e\xe5\x64\xbe\x8e\x33\x33\x0c\xc9\x8c\x6a\x04\x67\x5b\xd2\x33\x3a\x30\x91\xd8\x53\x3b\xde\xaa\x8a\x2e\xb6\xdb\xc8\xe7\xec\x67\x42\x21\x0a\xb2\x80\x85\xe0\x78\x31\x91\x60\x56\x39\x5b\xd2\xe9\x79\xca\xff\x39\xc5\x50\x7f\xce\x0c\xf8\x61\xec\x7f\xbc\x0a\x52\x0e\xf5\x38\x01\xd4\xaa\x78\xd2\xd4\xa5\x0d\xb5\x06\xd6\xdf\x39\x9a\x70\x50\x08\x8a\x5b\x0f\x32\x29\x54\x53\x23\x9f\x64\x98\x5d\x03\x4b\xe7\xa4\x93\xe8\x41\x93\x9c\x20\x63\x7a\x85\x99\xc5\x70\xc5\xc2\x8f\x6e\x06\x94\x54\x55\xd6\x43\x71\x37\x2c\x69\xc4\xb6\xea\x93\xf1\x4e\xea\xa4\x81\x15\x49\x3f\xe7\xcf\xa7\x01\x96\x85\x7d\x56\x18\x96\x26\x03\xe9\xba\xc9\x40\xba\x8b\x92\x81\x74\x4f\xa0\xaf\x9e\x6c\xa9\x03\x33\x06\x4d\xdc\xcf\xb3\x49\xc9\x49\xd9\x3a\x36\x96\xd4\x27\x4e\x22\x68\x3b\xd0\x6d\xb4\xfc\x38\xf2\x59\x56\x2f\xaf\xd7\xf1\xa8\xe3\x86\x1d\x9d\x50\x0d\xf3\x19\xc6\x29\x14\xea\x61\x82\x81\x2f\xfa\xe2\x37\xee\x9c\xa2\xfb\x6f\x0f\x7f\x38\xf8\xe9\xe5\xd1\xbb\xf7\xf2\x7a\xe8\xbb\x57\x2f\xdf\xf6\xa1\x26\x74\x84\x9a\xb7\x05\xf0\xfc\xd5\xd1\xf3\x7f\xff\xf9\xe5\xfb\xc3\x3e\xd4\x34\x55\xe9\xcb\xd1\x8f\x6f\x3e\x1c\xbe\x73\x2a\xe4\xa6\xb3\xb6\x75\xbd\xf7\x3f\xd8\x56\x2a\x88\x58\x66\x2a\x25\x2b\xd9\x19\x26\xf5\x2c\x0d\x6d\xe1\x19\xff\x3e\x75\xed\x79\x26\x80\x9d\xd9\xa6\xba\xf2\xe0\x17\xd5\xe6\x51\xec\x6e\xb1\x39\x54\x7b\x52\x2b\x15\xf1\xde\xbd\x42\x3c\xac\xfd\xfd\x8a\xd0\x50\x0d\x63\x03\x4c\x39\x1f\x0b\xc5\xe5\x23\x47\x1a\xe0\xf6\x9d\xcc\x71\xd9\xc6\x10\xc6\xf1\x04\x49\x77\xce\xce\xc9\x21\x25\xe1\x32\x8b\xbc\xb4\x58\xd0\xce\x87\x33\x32\xd7\x6f\x9a\x04\x46\x94\x1f\x29\x18\xc8\xeb\xdc\x2a\x8b\xee\x82\x84\x3a\x0b\x5c\xd3\x75\x69\x89\x0f\xa9\x4e\xba\xa3\x0a\x16\x24\xdf\x59\xd5\xb0\xa7\x3f\x2b\x5d\x5b\x1a\x8e\x16\x44\xb0\xdf\x2b\x49\x24\x52\xdd\x55\x17\x23\x3b\xd6\x6a\x26\x51\x4b\x18\x4c\x8e\xd0\xdc\x4e\x6f\x55\xc5\xb1\xef\x2a\xc8\xfc\x11\x68\x67\x5b\x65\x77\x32\xef\x28\x53\x6e\x64\x45\x0b\xa5\x84\xb4\x27\x3a\xd0\xac\xed\xad\x30\xae\x13\x9d\xe7\x2c\xe1\x4c\xc6\xa1\xc9\xc1\x35\xc2\xa4\x04\x78\x99\x50\x5f\x02\x64\x5e\x4c\x2d\x07\xd9\xc3\x7d\xab\x0c\xbe\x8c\x50\x51\x06\x27\x4f\x3d\xcd\x95\xba\x52\xc9\xdb\xab\x34\xe3\x13\x25\xbf\xad\x18\xa2\x86\x8d\xc4\x06\x84\x0e\x50\x9f\x3f\x5b\x80\xe4\x8e\x25\xd6\xa3\xd9\x26\x16\x99\xea\xc9\x6d\x6f\x05\xe6\x84\xdb\xb1\xa6\x89\x88\x94\x0b\xf4\x5e\xea\xf4\x6a\xae\x0b\x87\x15\x35\x5d\xab\xb4\x0c\x03\x2c\x64\x09\x79\x17\x2a\xf3\x52\x79\xc6\x80\x31\x9b\xab\xf0\xfc\x30\xe0\x7e\x30\x66\x21\xe6\xe5\x16\x67\x24\x21\x71\x2e\x62\x29\x95\xfc\x18\xdd\xe3\x13\x95\x8c\x54\xad\x14\xd1\xc5\xbe\xe5\x1f\x68\x30\x8e\x2f\x79\x12\xb2\x49\xfa\x8e\x0f\x6d\x2d\x90\xce\xb2\x64\x51\xbe\x77\x0f\x6c\xa7\xc2\x23\xdb\xd3\xa7\x01\x4f\xe5\x47\x33\x74\xf2\x70\x14\xf3\x9c\x03\x27\x7d\x4d\x2a\xe0\x51\xab\x6f\x8a\xe0\x64\x47\x45\x78\xe8\xb0\x58\x01\x4d\xfa\x47\x96\xa1\x97\xc5\x93\x32\x68\xca\x24\x5e\x01\x10\x5b\x95\x60\x77\xae\x12\xa3\x38\x24\x1d\x86\xf1\x55\x2a\xbd\x6d\x6e\x1e\x6c\x2e\x27\x57\x63\xaf\x08\xeb\x9d\x4c\x1d\xb5\xc4\x4c\xe4\xf3\x96\x95\x81\x23\xcf\xa1\x1b\xc7\xe9\xa6\x4c\x2b\x03\xf4\xad\x4a\x27\xb9\xcc\x24\x14\xb2\x99\x95\x92\xed\x5b\x7b\xe3\xab\xe2\x48\x97\xc8\x8b\x78\x2d\x47\xc2\x6a\x36\x72\x88\xb3\x90\x3f\x72\xa3\x37\x4b\x1a\xf5\x04\x7a\xdf\xac\xf6\xb4\x60\xa8\xaf\xfc\x8d\x33\x96\x7b\x21\x25\x0f\x91\xb2\x83\x1b\x72\x31\x98\xcd\x6f\xc2\x07\x3f\x59\x5b\xe7\x9d\x3b\x4a\x70\x8b\x8f\x96\x25\xe5\xde\x3d\xa1\x62\xe9\x1e\xef\xdd\x83\x52\x93\x55\x29\x55\x17\xb6\x13\x07\xd3\x72\x0a\xdf\x59\xb5\x3f\x49\xf2\xc5\xed\x0a\xfd\x7d\xeb\x30\x91\xd8\x6f\x6c\x71\xf6\xf9\x73\x29\x4f\xc9\xfd\xc7\xa6\x9e\x13\xd4\x99\x22\x30\xd3\x41\x90\x1c\x4e\x33\xa1\xaa\x63\x70\x5d\x31\xbd\x42\xf3\xb3\xc3\x20\x2b\x2d\xd3\x8a\x53\xb3\x3c\x36\x76\xa2\x60\x7b\x57\xd3\x3b\xe4\xb1\xde\x16\xb5\xe2\x71\x6d\x77\x51\x3d\x14\x70\x14\xab\x1b\xac\xa0\x05\xd8\x85\x00\xb2\x93\x15\xf3\xb6\xe5\x08\xea\x26\x99\x49\xad\xe7\x44\x78\x4c\xb8\x62\xf4\xca\x0a\x1f\x7e\x26\x97\xe8\xd8\xc2\xc2\x18\xb3\x64\x65\x23\x03\x4b\xcc\x82\xd0\x62\x33\x0a\xda\xae\x1f\x8c\x5e\x71\xdc\x24\xd9\x40\xbf\x55\xa5\x77\x11\xf6\x68\x0a\xd7\x58\xd5\x1e\x76\x4a\xa5\x2e\x04\x77\x5d\xa0\x79\xdf\x1c\xe5\xb5\x10\xf8\xda\x09\xd3\x5a\x79\xe6\xa1\xb3\x17\x1d\x66\x73\x4f\xc7\x2b\xed\xf6\xff\xf3\x8e\xa9\xf6\x85\xb3\xf5\x1a\xfb\x4f\x73\x3a\x58\xf5\x00\x55\xae\xa4\xad\xbb\x5b\x58\xbe\x05\xae\x03\x40\xa2\xbd\x17\x72\xcf\x3d\x2a\x1c\x06\x96\x4a\xdc\x63\x37\x20\xa7\x08\xd1\x42\x7a\x4a\x98\x74\xb3\xf6\xf5\xa0\xa5\x51\xb9\x77\xe8\x8d\x45\x57\xdb\xea\x9e\x7d\xbf\xb2\xb5\xb9\xd1\x1e\xe7\x93\xdf\xb8\x68\x28\x50\x4f\x0b\xa0\xd2\x35\xd0\xa0\xb6\x37\x3d\xb0\x7e\x1e\xa3\xb3\xb4\x71\xc2\xb2\x93\x70\x51\x6c\x8a\x1d\x19\x36\x25\xca\x62\x60\x30\x99\xc9\x62\x2b\xf2\x4e\xf9\x4a\xff\xa4\x05\xc8\xff\x49\x48\x5f\xe7\xe2\x6e\x95\x99\x50\xd3\x2c\x81\x26\xfc\x64\x77\x4c\x78\x55\xd4\xb7\xe7\xbf\x09\x67\x34\xd1\x67\x10\x27\x70\x86\xd3\x7f\x56\x21\x1e\x1c\x2d\xb1\xa2\x4e\xfe\x75\xac\x2b\x25\xde\xe0\xf8\x3f\x5b\x77\x00\x84\x75\x10\x49\x4f\x11\x4f\x60\xa1\x9f\xea\x4a\xea\x06\x43\x88\x62\x1d\xb0\x84\x27\x1c\xf8\x2c\x4b\x98\x9f\xe5\x85\x49\x16\x23\xb8\x7a\x9a\x25\x9e\x3d\x4a\xcf\x45\xbd\xf8\x86\x57\x9b\xc6\x52\x3e\x61\x42\x64\xca\xf9\xc2\x8b\x30\x41\x50\xb5\x26\x85\x08\xc0\xb0\x31\x49\x0b\x93\xae\xd4\xdb\xf5\xfa\xb3\xfe\xaf\xcd\xcf\xbf\xee\x34\x9e\xfd\x3a\xd8\xfe\xb5\x25\xfe\xdb\xa8\xb7\xb6\x1b\x6d\xcb\x52\x42\x57\xda\x3b\xd8\xfc\xb8\x6b\x62\x06\x53\xa8\x1a\x2a\xee\xe9\x2c\x69\x2f\x87\xe4\xcc\x27\xce\x88\x2a\x5a\x93\x74\xef\x8b\x40\x48\x53\x96\xc5\x89\x07\x2f\xe1\x62\xca\x53\x15\x84\xe0\x8e\x95\x4f\xc7\x0a\xe1\x95\x38\xf6\x35\xd1\xa1\xc9\x16\xfd\x77\x99\x2a\xba\x63\x3b\xdb\x72\x7d\x51\x6e\x9e\xb6\x18\x13\x8d\x00\x60\x79\xae\xb1\x94\x43\xed\xef\x93\x5a\x5f\x2b\x2f\xa6\x79\x2e\x79\x94\xaa\x60\x19\x33\x34\x00\xdd\x5e\xfe\x4e\x74\x41\xce\xde\x61\xc3\xcf\xcf\xa1\x63\x6a\x50\x89\xa8\x0b\x5e\x2f\x76\x6e\x4d\x2b\xd5\x64\x31\xfb\x57\xb7\xd3\x81\x6d\x2b\xf7\x8e\xb9\x39\xa6\x59\x13\x9a\xed\xe5\xa8\x26\x14\x44\xab\xe0\xaa\xd6\x70\xbc\x11\xd1\x53\xf3\x72\x24\xb8\xfa\xf2\x4a\x5a\x56\x55\x50\x34\xba\x76\xfb\x9d\xc3\x39\x4b\xf9\x40\x07\xb1\x0e\xf8\xd5\x24\x4e\x32\x3d\x8c\x94\xdc\xb9\xec\xd9\x28\x60\x61\xa6\x44\xd6\xd6\xde\x13\x3a\x6a\xb3\xfa\x43\x9a\x0c\x9d\x1c\xc4\x9e\x8c\xba\xd7\x42\x33\xad\xcc\xc8\xf9\xf9\x33\x74\xca\x83\xe4\xac\xd8\x07\x7a\xa3\xb8\x5d\x50\x66\x50\xbb\x07\x87\x6b\xc9\x3d\xa8\x7c\x06\xf2\xd4\x8d\x74\xcc\x60\x12\x21\x38\x1b\x48\xe9\x0b\x73\xbf\x86\x4e\x44\x82\x60\x42\x7f\x11\x2a\x87\x89\x66\x55\x00\x17\x8c\x25\x38\x02\x84\xeb\x6e\x32\xf3\xe8\x39\x2f\x57\x38\xfe\x36\x4d\xb3\x1c\x10\xed\x20\xa0\x10\xb6\xb6\x8c\xb7\x2c\x49\xb9\x80\x7e\x46\x62\xfd\x4c\xc9\xb6\x2c\x26\x61\x36\x89\x91\x27\xce\x66\xf2\xe2\x6f\x7e\xa6\x63\x6c\x39\x51\x32\x36\xb8\x6d\x50\xcd\x4d\xcb\xfa\x62\x3f\x82\xbd\xdf\x96\xe7\x54\x55\xd9\xc6\xf0\x59\xa1\x8f\x21\xeb\x98\x28\xa2\x9b\x68\xf9\xbc\x50\xdb\xd3\x82\x48\x0a\xc3\xdc\x85\x1b\xfa\x46\x11\x0e\xf2\x2d\xf1\x8d\x02\xdf\x73\xb1\xb2\x82\x23\x6b\x75\xf3\xb8\xe3\x81\xc9\x5c\xf9\x63\xca\x55\x7e\xc9\x60\x68\x07\xb6\x90\xde\x06\x71\xa2\xee\xf1\xa3\x81\xb4\x89\x06\x29\x74\x28\xdd\x02\x5e\x9f\xa2\x1b\x9a\xe0\xfb\x62\x88\x20\x93\xcd\x41\xbe\x8d\xc4\x67\xe3\x53\xe2\x18\x36\x0b\xe8\xb1\x13\xca\x0b\x4c\xd8\x47\xde\x3a\x14\xa7\x41\x56\x74\x52\x3b\xa8\xed\x25\xe5\x3f\xa8\xdc\xe5\xd5\xa9\x23\x73\x84\xb0\x7c\x68\xdb\x6d\x78\x8f\x1b\x9e\xf5\x6a\xd3\xb0\xad\x4c\x68\x67\x02\x8c\xc9\x0d\x9a\x8e\x08\x3c\x61\xd1\x40\xba\xe8\x51\x40\x96\x0b\x3e\x13\x07\xbd\x84\xa7\x29\xd7\xbe\x30\x3a\xf0\xf5\x24\x9c\xa6\x82\x88\xe3\x20\x9a\xa6\x90\x06\x17\xe8\xc6\x37\x4c\xe2\x28\x83\xfa\x4e\xb7\xe3\x41\xb3\xd7\xf1\x80\x67\x7e\x43\x69\xde\x09\xbb\x50\xd7\xe0\x84\x9c\xd4\xd0\xdb\xf5\x5f\x77\x3e\xff\xda\x6c\xb4\xf3\x19\xed\x45\x8b\xdc\x06\x29\x8a\x5a\x59\x12\x8c\xeb\xb9\x30\x9c\x2f\xc8\x7c\x20\x1d\xca\xdd\xc1\xeb\xd3\x30\x83\x09\x0b\x12\x6b\xec\x71\x22\x74\xc2\x20\xba\x08\xb9\x99\x23\x0c\x6a\xa4\x83\xea\x28\x0d\x03\x0f\x65\x7e\x3c\x1e\x33\xd1\x0a\x6f\x9d\x54\x16\x9f\xe0\x32\x20\x93\xbe\x1e\xa2\x9e\x2c\x7c\x42\xa4\x8b\xed\x27\x44\x55\x83\x4b\x39\x4b\x84\x9e\xe2\x7d\xfe\x35\x6d\xdb\x67\x8c\xeb\x86\x79\x78\xa3\x21\x1e\xcb\xce\x4f\xd0\x9e\x5a\x28\x35\xba\x83\x27\x75\x87\x66\xb7\x3c\x7e\x82\xb2\xa7\x3b\xc3\xbd\x1a\x05\x99\xf4\x2d\xa9\xa7\x0d\xb4\x83\xe7\x13\x88\x31\x49\x93\xba\xd7\x50\x0f\x73\x5b\x35\x27\x0d\xdf\xcb\xa1\xa6\x50\x90\xaa\x37\x05\x57\x5c\x16\x3a\xd9\xee\x4a\x38\x12\x4d\x43\x58\x53\x4f\xce\x58\xa0\x16\xe3\x04\xff\x03\xeb\xfe\xd2\xb2\xd5\xbd\x77\xc8\xb9\xfb\xd0\xfe\x35\xdd\xf6\x7e\x4d\xb7\x3f\xff\x9a\xee\xb4\xcd\xb1\x0b\x4f\xa6\x12\x1f\x19\xa5\xf0\x19\x1c\x9b\x99\xd3\x97\xe4\xb2\x92\xbe\x4d\x3f\x2e\x21\x2f\x31\xb0\xe9\x56\x9c\x34\x4f\x1a\x1e\x2c\x57\xb7\x7b\x72\xa2\x80\xe7\xfb\x57\x18\xee\x40\xb7\xd1\x38\x81\xbe\x05\xf1\xc4\x78\xe1\xe2\xb1\xc6\xec\x6a\x72\x79\x8a\x7d\x90\x42\x28\xc8\x70\x2d\xca\xab\x5b\x14\x85\x61\x7c\x85\xe9\x76\x73\x91\x5f\x88\x30\xf1\x24\xcd\xad\xc1\x38\x7f\xdd\xd4\x6e\xc3\xeb\x38\xcd\xec\x5d\x3a\x85\x84\x87\x73\xa5\x10\xc5\x89\x50\x22\x1c\x97\x45\xed\x30\x5a\x76\x9e\x95\x8e\x0b\x82\x39\xc5\x54\xdc\x31\x52\xb0\x6f\x24\x62\xa3\xf2\x2d\x80\x02\x99\x5c\xf0\x9f\x83\x6c\xf4\x56\x65\x6b\xb3\xe2\xe3\x5a\x71\x6a\xd4\x10\x3e\x08\x51\xce\x2e\x2e\x12\x7e\x81\x99\xcd\x58\x34\x87\xb3\x1d\x3a\x53\x35\xcf\x48\x9e\xe1\x1b\x13\x96\xf0\xa8\x96\xe9\x1b\x1f\x3e\xd0\x0a\x7d\xaa\x60\xf1\xd6\x45\xab\x0f\xdd\x0e\xec\xc0\xce\x03\xd8\x7f\x0a\xc7\x42\xfc\xed\x78\xb0\xf3\xe0\x04\xeb\xb4\x12\x3e\x98\xfa\xf6\xb3\x3d\xe6\xc1\xb9\xd1\x01\xc5\x8a\x66\xc7\xcc\x4a\x18\x42\x89\x24\x29\xdc\xea\x71\x6d\x47\xec\x02\x4d\x7b\x0b\x50\x72\xc1\x36\x43\x16\x20\xc0\xb9\xd1\xe2\xcb\xe8\x63\xd2\xfe\x58\x24\x62\xda\x44\x69\x14\xe8\x42\xe3\x45\xdd\xee\xdc\xd8\xaf\x35\x2f\x0b\x3a\xfe\x54\xa8\xa0\xd6\xca\xb9\x65\x46\xc5\xff\x7a\x70\x7c\xd2\x50\xb3\xf1\x83\x38\x6f\x5e\x61\x30\x03\xbd\x3a\xe4\x3e\x20\x17\x09\x1e\xf2\xe5\x29\x4d\x16\xd5\xc5\x81\x76\x46\x30\x72\x0b\x20\xcd\x8a\x09\x48\x6f\x7f\x6e\x95\xda\x73\x6e\xf3\xca\x67\xff\xd4\x99\xf3\x84\x6e\x45\xf2\x90\xcf\xb8\xaf\x5c\xee\x89\x03\xcd\xc2\x2d\xb9\x27\x2e\x2c\xdb\x78\x52\x52\x4b\xc8\x14\x59\xaf\xe7\xb2\xa3\x89\xda\x8a\xfb\x94\x3d\xe1\x12\x39\xb2\x98\xe3\x7c\x8b\x2a\xb0\x2d\x3a\xa5\xc2\x9e\xc5\xc2\x4d\xf3\xe8\x3d\x3f\x6d\x9a\x08\x66\x7d\x16\x33\x17\xff\xb7\xb3\xb0\x1a\x18\xae\xf1\x44\xdf\xf7\xd3\x20\xf7\x3b\x18\xf5\xd9\xe8\x2a\x64\x74\x60\x98\x77\xd0\x4f\x82\x73\x13\x0e\xd2\x7a\x32\x2e\xbe\x4c\x8a\xce\xda\xb7\x35\xe6\x52\xd7\xd2\xeb\xc8\xbc\x69\x36\x7a\xb5\x7a\xd3\x4c\xbf\x0a\x4e\x28\x05\x9b\xab\xb2\xe0\xfe\x29\xa6\x60\x47\x31\xbe\x21\xb7\xbd\x7b\x74\x70\x83\x82\x18\xde\xdf\xa1\x2a\x9a\xfd\xad\xc3\xc6\x8e\x3a\xb8\x74\x8a\xa9\xbe\x4d\xb5\xea\x93\x8e\x13\x7d\xce\x55\xe9\x1d\x0b\x50\x6e\x50\xfa\x72\xd6\x4d\x64\x8e\x99\x81\x76\x74\xe4\x0f\xe3\x93\x61\x62\x21\x41\xd3\x7c\xee\x9e\xe4\x4c\x24\x25\xbd\xb8\x81\x49\x96\xef\x66\x67\xb5\x6e\xb2\x78\x92\xef\x24\x0f\x26\xd7\x8b\xc0\x61\xc5\xb1\xe4\x62\xbb\x2c\xdf\x4f\x71\x30\xfa\x95\x8a\x66\x5f\xe3\x9c\xf2\xc7\x5f\x12\x7d\xb5\xa1\xf0\xe4\x0b\xa3\x23\x79\x15\x5b\xf5\x06\xbc\xe0\x19\x67\xfb\x45\x15\xbe\x7d\xfe\xbc\x6c\x40\x33\x7d\xf2\x70\xe2\xa1\x05\x69\xce\xf1\xc7\x8e\x4b\x94\x70\x7c\x5a\x20\x6f\x48\x09\xc0\x45\x8c\x91\xd2\xd1\x9f\x6a\x4a\x2f\x0a\xd4\xd9\x3d\xe2\xb3\xcc\x85\xce\xec\x28\x4d\x0a\x82\x8c\xce\xa4\x23\x1b\x59\x11\x7c\x75\xb6\x62\x8a\x9b\x85\x09\x11\x74\xc0\x2a\x74\x87\x3c\x4f\xe2\x8f\x3c\xb2\x5d\x2d\x8b\x6e\x87\xc8\xe0\x45\x07\x43\xc9\xe9\x65\xf4\xcd\x93\xb0\xcc\x3b\xf1\x8f\xf1\x8f\x2c\xef\xb9\x38\xff\x60\x8f\xd0\x88\xef\x9c\x1f\xdd\x24\x09\xe2\x24\xc8\x96\x8f\x9f\x88\xee\xdd\x32\xd1\x9e\x14\x0c\x49\x30\x66\xc9\xbc\x0f\x16\x1f\x63\x49\xde\x33\x1c\x72\xa1\xcf\xe5\x45\x95\xae\xa5\x9d\x08\xac\x1b\x30\xf3\x11\xbe\xb1\xc6\x63\x97\xdf\xbb\x07\xda\xbb\x84\xa7\x3e\x9b\xa0\xea\xac\xa3\xbc\xba\x4e\x07\xb9\x67\x77\x85\x5e\xbc\xf2\x4e\x72\x5a\x98\x91\x5a\xee\x23\xb7\x4f\xd7\x9e\xfd\xfc\x80\x2e\x2b\xa4\xf6\x2a\x73\x13\xa3\x69\xcb\x25\x97\x2e\xab\x22\xd8\x98\x99\xb7\x96\xa5\x9e\x44\x65\x77\xa0\x15\xd4\x56\xb0\x6e\x20\xf6\xd3\x4d\x13\xdb\x3c\x6d\xd4\x18\x54\xd0\x1a\x9a\xb6\x6b\xa6\x3b\x4c\xb9\xcb\x50\x60\x2f\x1d\x18\x91\x8e\xb8\x8d\x15\x26\x49\xe1\x90\x9b\x23\x1d\x9a\x29\xae\xf0\x24\x2d\x4c\x90\x75\x87\x6d\x1e\xef\x8b\x29\x58\x70\xf7\x2d\xa6\x4b\x2e\x11\x9c\x31\x3d\xff\x35\x7b\x2b\xcd\xfb\x80\x28\x49\x81\x8b\x8f\xee\x70\xeb\x8e\xfb\x86\x3e\x1b\x95\x3b\x94\x58\x6b\xf8\xaf\x2d\xd7\xac\xbd\x51\x30\xcc\x72\x2e\x19\xd5\x9a\xfa\xde\xaa\x4a\xb3\x64\x10\xd1\x89\xed\xf0\x54\xe1\x44\x6e\x45\x42\xc1\x26\xf9\x86\x41\x0a\xe9\x84\xfb\x38\x0c\xaf\x2c\xb6\x08\x86\xc9\x73\xda\x38\x11\x86\x96\x38\x5f\x2c\x75\x78\x30\x95\x17\x1e\x47\x2c\xff\xc9\x9c\x9b\x88\x79\x54\xe6\x2e\x95\x0a\x2b\x7d\x6e\xa1\xdd\xe0\xfc\x71\x5b\xf7\x0f\x6b\xae\x8e\x72\xe1\x52\x81\x12\xb4\xf5\xcb\x44\x09\xbd\x82\xce\x7b\x57\x28\x12\xf1\x68\xb0\x7c\x2b\x27\xaa\x80\x73\x53\x5b\xea\x30\x42\x96\x97\x6b\x89\xfc\x12\x6e\x64\x4a\x84\xd8\x63\x3c\x76\xf9\xe5\x66\xbf\x90\xff\x76\xb6\x85\xb5\x65\xc4\x28\x18\xd8\x39\x34\x56\x0f\x9b\x24\x00\x08\x66\xcf\xe9\xf7\x37\x07\x4e\x4a\xf8\x50\xc6\x14\xae\xf2\xd7\xb7\xd4\xcd\x2f\x12\x89\x3a\x8f\x32\x6d\x33\xad\x9c\x66\x29\x03\x84\x60\xd0\x4d\x5a\xdb\x4a\x5b\xc3\x03\xe1\xe7\xcf\x6a\x24\x74\x7c\x94\xca\x05\x79\x80\xdb\x5f\x45\x65\xf5\x51\xc2\xb1\xbe\x52\x75\x05\x98\xbc\xd4\xb5\x79\xfd\x00\xcf\x0c\xd3\x28\xe2\x3e\x4f\x53\x96\xcc\x31\xa8\x11\xf3\xc5\x2f\x81\xdf\x65\x90\x06\xe7\x41\x18\x64\x73\x18\x31\x0c\x96\xe4\x63\xc4\xc7\x81\xf6\x35\x40\xba\x8d\x50\xc4\xec\x93\x9d\xf7\xe6\xc7\x1e\x56\x1b\xcb\x32\x9c\x8b\xbb\x78\x5c\x9b\x35\xe3\x69\xd6\x8c\x87\x4d\x43\xb7\x9a\x95\x51\x38\x77\xe7\xbf\xe9\xa1\xe4\xd2\x07\x2d\x33\x16\xcb\xda\xbc\xf4\x60\x74\x9b\x3f\x49\x7a\x7c\xb5\x3a\x06\x3a\x83\x7c\x69\x1d\xe3\x4f\x0a\x5e\x85\x21\x0b\x16\x46\xae\xaa\xbe\x79\xc7\xed\x76\x7a\x8e\x4e\x6e\xaf\xe4\x5b\x2b\xe3\x43\xba\xf8\x02\x7f\xdf\x80\x91\x3b\xa3\xc2\x25\xaf\x12\x9c\x38\xd1\x7b\x1c\x30\x78\xd4\xc8\x61\xf0\xac\x04\x5e\x41\x5f\x38\x81\xbe\x13\x7c\xc5\x9e\xcd\x25\x1e\x16\x2e\x13\xb8\xc8\xb6\xca\x54\xac\x25\xc5\xc0\x5a\xb0\x7b\xc0\x99\x3f\xb2\x6c\x25\x26\xec\x85\x65\xbd\x26\x83\x0a\x06\x2e\x60\x69\x8a\x71\x15\x64\xfe\x9b\x20\x4b\xe1\x6c\x18\x9d\x99\xbc\xfd\x26\x90\xc4\x87\x11\x4f\xb9\x06\x63\x92\x98\xf8\x2c\x0c\xc9\xaf\x0b\xfb\xa6\x35\xe8\x49\xa3\x0d\x67\x51\x4a\x37\x82\xf3\x78\x8a\xb1\xdd\x04\x28\xb4\xea\xa8\x30\x5b\x94\x19\x73\xc2\x93\x61\x9c\x8c\x59\xa4\x5f\xa8\xea\x60\xf6\xfa\x93\xcf\x31\xd6\x43\xc8\x23\xee\x7f\x4c\xf5\x8b\x7c\x3d\x32\x45\x8e\xef\xa2\xdc\xd2\x17\x74\xfb\xaa\x04\x89\x8d\xd0\x92\xc2\x24\x3f\xe7\x14\x83\x64\x12\x4e\x31\x2d\x91\x8a\x9c\xcb\xc2\x8c\x53\x2a\x79\x1d\xd5\x2c\xc6\x98\x24\xca\xb0\x93\x5a\x33\x6a\x12\x5d\x4c\x53\x8e\x6e\xbe\x1c\x2f\xa8\x9f\x58\x31\x6d\xf1\xd5\x03\xc5\x44\x57\x31\x14\xce\x59\x1a\xf8\x9a\x11\x58\x18\x50\xec\xe7\x6d\x15\x67\xf7\x7c\x2e\xbd\x13\xce\x13\x96\xcc\xd5\x34\xfd\x98\x62\x6a\x52\xe4\x03\x8a\x51\xa5\x5e\x55\x38\xe9\xbd\xce\xf0\xe0\x7d\xe6\x11\x1b\xa2\x8f\x58\x8c\xe9\x82\x88\x27\xc9\x3d\xec\x40\x62\x42\x9e\x40\x76\xc6\xbf\x84\xbb\x53\x20\x99\x4f\xbb\xa5\x64\x57\x9c\x7d\x54\xc1\x7e\x85\x92\x43\xef\xa0\xed\x78\xbd\x14\x78\xc3\x50\x80\x8e\x00\x48\x7d\xb0\xd7\x9c\x22\x39\x1d\xd4\xac\x78\x71\x2a\xd4\x08\x66\x74\x8e\x13\x71\x02\x50\x71\x0c\xb5\x18\x22\x58\x2a\x0d\x9f\x9a\x12\x70\xb2\xcf\xb2\x41\xee\xb1\x56\x49\x44\x9d\xc2\x3a\x95\x20\xc4\xc2\x3f\x47\xe7\x1c\xe0\x01\x52\x89\x22\xd9\xd0\x4d\x3d\x85\xde\x68\x51\x6d\xb3\x07\x5b\x54\xc0\x0f\xb8\x6d\xe1\xdf\xed\x2d\xa0\x71\xf6\x95\x92\xb2\x8d\x7e\x77\xf1\x04\x3e\xd1\x95\xf0\x35\x59\x4c\xf6\xbb\x9d\x0e\x34\xe1\x25\xfa\x26\x28\x0a\xd9\x41\xf1\xd1\xfa\x18\x0f\xe5\xc5\xac\x18\x15\x02\x97\x06\x97\x3e\x74\x3b\x32\xf2\xbc\xd5\x83\x8e\x7b\x21\x9f\xee\xef\x63\xb8\x8b\x26\xfc\x3c\xa2\x00\x7e\xce\x6d\x9f\x79\xe1\x2f\xc6\x1a\xc5\x99\xea\x40\x96\x52\xca\xf2\x42\x1f\x46\x76\x5c\xab\x06\xc3\xa8\x4f\x83\xde\x42\xe3\x9d\xcd\x04\x1f\x90\x53\xa5\x8b\xa3\x23\x6d\x89\x1b\xac\x05\x07\x14\xa1\x66\x84\xf3\xcf\x66\x41\x4a\x64\xd7\x33\xa5\xc2\x7e\x38\x49\x45\xc9\x3f\xa4\x4f\x95\x9a\x70\x36\x99\xe1\xcc\x89\xd2\x90\xa7\xa9\xe7\xc4\x1e\x62\xa9\xf4\x54\xd1\xd5\xff\x4e\xf3\xfc\x77\xb1\x8e\x26\x3c\xf1\x79\x94\xb1\x0b\x0e\x09\x0f\x59\x16\x5c\xea\x64\xb2\xd2\xff\x40\xb2\x55\x59\xae\x04\x09\x6e\xb2\x0a\x9c\x7c\x02\x44\x09\xe4\xf2\xea\xcc\xc3\xa8\xad\xca\xf3\x97\xbc\x04\x95\xdb\xb9\xac\x34\xca\x57\x92\xce\x88\xba\x16\x55\xfd\x2e\x4e\x54\xaf\x18\xe2\x4e\x9c\x70\x39\x2d\x97\x31\x7a\xeb\xcd\x30\x96\xb1\x8b\xa6\xd9\xa3\x1d\x4c\x9d\xa5\xf3\x21\xb7\x6b\x49\xc7\x38\xc7\x11\x92\xc2\x32\x09\x02\xcb\x28\x44\x9e\x4d\x05\xb5\x2d\xca\x28\xab\xdb\xea\xb1\x41\x0b\x5e\x46\xe4\xf8\x1d\x0f\x65\xa8\x2a\x84\x41\x01\x8a\x3c\x08\x32\xbb\xa9\x1c\xb7\xcd\x2b\xbf\x60\xd6\xe7\xc8\x88\x63\xe5\x81\x47\x66\xd6\x3a\x4b\xe1\x8c\xee\xce\x09\x30\x5d\xa0\x9f\x35\x3c\x72\xd7\x73\x5d\xf8\x08\xa4\x68\x22\xab\x49\xbf\x2d\x94\xde\xcc\x38\xec\x09\x01\x52\x8f\x13\x8c\x96\xd4\xb0\x1d\xdb\xd2\x1c\xd9\x38\x84\x2c\xcb\x68\xfd\x31\xcb\xdd\x4d\xa5\xa6\xb6\x12\xef\x85\x9c\x91\x83\x9a\x90\xd4\xd3\x54\x6d\x94\x72\xf4\x04\x90\x12\x93\xe2\x5d\xfe\x65\xcf\xe9\xea\x40\xbf\xaf\x0b\xe7\x48\x35\xb5\x80\xd4\xc3\x3b\x99\x4f\x5f\x2a\x75\x58\x70\xce\xb3\x2b\xce\x23\x18\x04\x43\xe4\x71\xe2\x27\xb9\x12\xe1\x4d\x8c\x0e\x22\x2c\x83\xf1\x34\xcc\x82\x49\x18\xf8\xcc\x00\x12\x74\x49\x55\xcc\x2f\xb1\x6d\xe9\x24\x2d\xf6\xe4\xfc\x54\x16\x15\x0b\x67\xff\xec\x8c\xfe\xe8\x76\xe8\x7f\x6b\xdd\xce\xdf\x6b\xfa\x4f\x0f\xba\x1d\xf3\xeb\xef\xee\x4f\xd8\x01\xa7\x32\x34\xe1\xc1\xe5\x08\x76\x60\x57\x17\x36\xbb\x9d\xc9\x0c\x76\x44\xb9\x07\x0f\x26\x33\x68\xc2\x43\xf5\x51\x77\xfd\x14\xb6\xb7\xdf\x7c\xbb\xbd\xdd\x87\x97\x14\x9f\x6c\xc0\xd3\x80\x22\x75\x53\xc2\x1a\x75\x68\xc8\x62\x47\x55\xc0\x08\x93\xd2\x73\x57\x50\x87\xcd\x75\xa6\x91\xb1\x7a\x9a\xaf\x7a\x50\x1e\xae\x41\x52\x76\x51\x38\x8d\x86\x71\x92\x4d\x23\x96\x71\x31\x6b\x02\x07\x9c\x6e\x0a\x53\x19\xab\x14\xe4\x65\x51\x58\x5a\xaa\x87\xd7\x71\xc2\x69\x6f\x0d\x52\x38\x16\xdb\x23\xc5\x28\x12\x02\x20\x4d\xa7\xfc\xa4\x3e\xca\xb2\x49\xda\x6f\xb7\x2f\x82\x6c\x34\x3d\x6f\xf9\xf1\xb8\xfd\x1d\xff\xfd\xa7\x84\xa5\x19\x6b\x4f\x94\xb2\xd3\xc6\xda\x69\x7b\xf7\xd1\x6e\xc3\x9a\xc1\x65\xb7\x41\xa2\xd5\x8d\xfb\x60\x6f\xcd\x7d\xb0\xf7\x75\xed\x83\xd2\x0b\x23\x5f\x3b\xef\xab\xa3\x7d\x74\x40\x8b\x85\x5b\xfa\xe9\x80\xa2\xb7\xa1\x78\xa7\xb8\x0f\x17\x94\x31\x15\xa2\xd3\xda\x88\xec\x00\x9d\x3a\xf9\x10\xc4\xd3\x4c\xa7\x6a\x94\x66\x8c\xb9\xbd\xa0\x0f\x22\x48\x7d\x1e\xb1\x24\x88\x81\xcf\x82\x34\x4b\xe1\x6a\xc4\x93\x7c\x0c\x8c\x20\x4b\x79\x38\x54\x91\xbf\xc5\x22\x90\xa3\xb2\x82\x09\xd8\xd2\xeb\x67\x99\xc9\x87\xcd\x85\xe8\x1a\xb1\x14\xee\xd2\x25\xda\x20\xd7\xea\x2e\xfc\xd7\x7f\xfe\xdf\x62\xe6\xf0\x05\x86\xaa\x74\xd7\xd5\xf3\xe4\x62\xc0\x5d\xe5\x8a\xf2\x5c\x10\x9f\xf9\x18\xe6\xce\x62\x0b\x49\x8b\x74\x84\x8a\x30\xa9\x84\x7d\x6b\xb8\x4d\x18\xf0\x4c\x1c\xdf\x64\x4c\x44\x7b\x8c\x94\x7d\x12\xf7\xd5\xbb\x59\xc2\x26\x02\x0f\x28\x0c\x53\x6c\x33\x0a\x56\x20\xb4\x5d\xd5\x59\x70\x11\xc5\x89\x4b\x68\x04\x29\xc7\x44\x92\xc3\x51\x8e\xef\x5a\x88\xfd\x3c\xe2\x11\x9c\x95\x5c\x34\x9e\x99\xbc\x5d\x56\xda\x2e\x6b\x66\x52\xcb\x53\x80\x60\xa9\x39\xa7\xcc\x47\x06\x71\x3b\x3f\x97\x90\x4a\xea\x25\xbc\x0c\x05\xa7\xdd\x0d\x42\xce\x2e\x39\xc9\x8c\xdc\xe0\x9d\xe0\xfa\x92\x56\x2c\x13\x04\xb5\xb2\x8c\x0f\x2e\x78\x41\xd7\x6a\xdd\x42\x02\xe5\x2c\xb2\x37\x8a\xa2\xdd\x35\x45\xd1\xee\xd7\x25\x8a\x72\xc3\xd7\xcd\x94\xd0\x91\xad\xe5\x9b\x9b\x63\xe5\xdf\xb0\xaf\x0c\x54\xea\x85\x08\x99\x99\xf4\x4b\xe5\x13\xd5\xfe\xad\xc5\x09\x59\x32\xb7\xa5\x8a\x66\x0c\xa3\xa8\x67\x68\x15\x91\x9d\x08\x4e\x38\x9f\xab\xd7\x7c\x9e\x82\x98\x8d\x78\xe4\x99\x94\xc3\x1a\x8a\x3c\x28\xea\x30\x9e\x26\x6c\x26\xee\x83\x05\x3f\x8f\x33\x47\x2c\xaa\x81\xf5\x0b\xa6\x37\x13\xf9\x51\x0d\xae\x8a\x48\x8a\x51\xa4\x6f\xc9\xfe\x03\xf5\xfd\x60\x8c\x71\xa5\xe3\xa1\x7a\x6d\xe6\xf2\x0d\x83\x71\x10\x05\xe3\xe9\x58\xec\xdc\x19\x59\x66\xa4\x8e\xe5\x2e\x0c\x05\x4f\x3d\xec\x91\xcb\x8c\x8c\x43\xec\x23\x4f\x0b\xd1\xd6\x85\x4c\x64\xe1\x15\x3a\xf0\x42\x18\x64\x59\xc8\x15\x7a\x0a\x98\xdd\x95\x58\x55\xa9\x3a\x5e\xcb\x17\x2b\xd2\x67\x5e\x13\x8a\x5a\xf7\xe1\x41\x15\x19\x68\xff\xfa\xec\x24\x45\x2e\x50\x7f\xbf\x96\xfa\x49\x1c\x86\xe4\xff\x53\x53\x20\xac\xd8\x1d\x48\x24\x69\xfd\x50\xcc\xef\xa9\xa3\xf8\x99\xdd\xfa\xcc\x13\xc7\x82\x68\x10\x5f\x9d\x69\x2e\x39\x53\x67\x1e\x54\xdf\x59\x44\x46\x7f\x65\x22\x70\x46\x54\xc0\xad\x0f\x05\xe4\x6e\xda\x29\x1d\x1b\x5c\x4e\xda\x5b\x29\x17\xd2\x8c\xcd\x21\xe2\x2c\x41\xeb\x1e\x1a\x5c\xa4\x54\x52\xb9\x73\x85\x54\x14\x2b\x41\x60\x7c\xc1\x26\xce\xec\x64\x57\x71\x0b\x0e\x67\x13\xee\x07\x2a\xd1\xe1\x70\x1a\x8a\x9d\x29\x32\x19\x2c\x20\x90\x10\x95\x90\xc0\xe7\x70\x42\x45\x94\x06\x22\x96\x22\x9e\x01\xc5\xe0\x88\x03\x2a\x2d\xcd\xef\xd7\xb2\x2c\x20\x89\x60\x8c\x28\x9c\x03\x3b\x57\x39\x7e\xe9\xf5\x99\x38\x1d\x92\x12\x8a\x7b\x71\xa6\x35\x51\xa5\xf7\x52\x80\x58\x0c\x09\xbe\x55\xe0\x38\x37\x2b\x40\x25\x0a\xcb\x4a\x73\x3b\x32\xc4\x8d\xa2\xfc\xfe\x9a\xa2\xfc\xfe\xd7\x25\xca\xed\xb1\x97\x19\x59\x6c\xb7\xbf\xc0\x18\x39\x65\xf2\x5e\x2e\x73\x87\x28\xe9\x98\x33\x40\x48\x1e\x27\x58\x8a\x81\x82\xd4\x56\x02\xed\x69\x2d\xa6\x12\xcf\xad\x84\x02\x87\xb9\x66\xba\x78\x2a\x4e\xbf\xf8\xa6\x57\x09\x70\x17\x3b\x4c\xaf\x62\x22\xf6\x8c\xe2\x2b\x18\xb3\x48\xaa\x26\xf2\xa9\x51\x3c\xb4\x12\x48\x50\x00\x35\xb4\xa9\xe6\x6c\x46\x42\x46\x46\x31\xf0\xe1\x50\x3e\xde\x8b\xe2\x7c\x6f\x94\xd7\x12\x8f\xf4\x2b\x32\x24\xc2\xb9\x91\x13\x1f\xac\xc9\x89\x0f\xbe\x2e\x4e\xa4\x70\xf4\xf9\xca\x65\xfb\x02\x57\xbb\xc1\xf1\xac\x89\xad\x4e\x6a\x18\x87\x57\xe6\xdb\x89\x29\x57\x8e\xce\x9c\x4f\x12\x4e\xa1\xa6\xa5\xb5\x69\xbc\x84\xa8\xd6\x71\xbb\x88\x13\x6b\xa9\x65\x8f\x42\x51\x8a\x91\x30\x58\x42\x27\x78\x79\x30\x97\x29\x4b\xd0\x96\x52\x2a\xa1\xe8\xa3\x74\x5e\x48\xa5\x65\xd9\xd5\xad\x2c\xdb\xa6\xcc\xe3\x85\xc1\x3e\xdc\x3c\x52\x36\xb4\xed\xed\x37\x47\x1f\x0e\xfb\xdb\xdb\x39\x9f\x5d\x5c\x2a\x68\xb3\x4c\xa6\x13\x12\xc5\xfe\x34\x21\x4b\x0c\xb9\x7c\xf8\x73\x3f\xe4\xda\x0e\xa4\x10\x27\x1b\x7a\x90\xc9\x13\x05\x2d\x9d\x54\x27\xf5\x73\x89\xa3\xaf\x47\x57\xe3\x77\x01\xe0\x46\x76\x7f\xb8\x26\xbb\x3f\xfc\xba\xd8\x5d\x8c\xf9\x06\x65\x48\xea\xcf\xea\x1a\x69\x9f\x22\x3c\xd9\x27\x7b\x7d\xc3\xa4\x08\x42\x4e\x08\x15\x9c\xda\xca\x5d\x4b\x60\x1a\x5a\x52\x7c\xd0\xe0\xe3\xc1\x99\x0e\x11\x8a\x3f\x72\x71\x8e\xa5\x56\x64\x3f\x9c\x77\xde\x64\x07\x03\x05\xcf\x8a\x65\x5d\xc7\x7a\x74\x05\xc7\x42\x3b\xb4\x76\x4e\xa1\x92\x43\xb1\xa3\x32\xaf\xa4\x2f\x7f\xc8\x1d\x21\x29\x24\x2f\x32\xed\x28\x90\x1c\xab\x55\xd5\xa5\xb4\xfb\x4d\x29\xad\x4a\xab\x74\xa6\x4e\x6d\x71\x94\xcf\x18\x31\xb6\xb8\xd9\x3a\xd7\xba\x5b\xaa\xda\x3a\xed\x93\x8d\x33\xec\x88\x5f\xa2\xac\x50\xa9\x50\xd4\x89\x5b\x82\x51\x01\xbe\x8b\xe7\x83\x3a\x9f\xf9\x7c\x82\xeb\xdc\x4d\x5a\xa7\xd9\xbe\x71\xa3\x06\x6c\x8f\x74\x29\xed\xd7\x36\x12\x85\x3a\x63\x32\x16\xa3\x88\xa8\xbc\x19\x91\x12\xe6\x5b\x73\xd4\x53\x2a\x6d\x4e\x63\x91\x76\xcd\x41\xd1\xc6\x50\xa0\x91\x31\x2b\xac\xab\x51\xe2\xaf\x1b\x25\xda\xa3\x35\x25\xda\xa3\x65\x24\x1a\x7a\x04\xdd\x5e\xa4\x61\xf3\x65\x65\x9a\x22\xc2\x4d\x53\x3f\x52\x66\x3f\x35\x1d\xb4\x83\x96\x68\xf2\x02\x43\x97\x83\xa5\xb2\x46\x0d\x2d\x13\x9f\x56\x07\x53\x9e\x01\x83\xb3\x12\x0f\x29\x2b\xb9\xaf\x5c\x76\x3e\xd3\xa7\x0b\x17\x39\x29\xdc\xec\x14\x87\x37\x20\xac\x4e\x50\xe2\x9c\x13\x0f\x6d\xcc\xbe\xc0\x56\xbf\x34\x23\x8a\xc1\xdc\xc8\x87\x8f\xd7\xe4\xc3\xc7\x5f\xd7\xce\x3a\xa2\xa5\x9c\x63\x42\x99\x61\x2b\x95\x8e\x01\xf3\x50\x5e\x38\x29\x51\xc0\x26\x93\x30\x30\xa6\x42\xf7\xc4\x21\x4a\x2f\xb8\xd2\xe6\xb4\x77\x88\x39\xc7\xd8\x93\x6c\x2e\xb3\x4a\x34\x30\x31\xb8\x2c\x9e\xfa\xf4\x5c\xfa\xc5\xd1\x6b\xb4\x4a\xa1\x85\x79\x92\xf0\x09\x4b\x6c\x0c\x65\x7f\x69\x4c\xe0\xce\xf0\xaa\x08\xf3\x85\xe5\xae\xbc\xe9\x0e\x29\xc8\x5a\x74\x62\x93\xa1\x30\xa4\xbb\x3a\x9d\xf8\x09\x54\x20\x2f\x40\xc5\xc9\x5b\xa9\x6f\x09\x47\x31\xe8\x82\x97\x0b\xc0\x9f\xa6\x59\x3c\xc6\x48\x45\x48\x08\x04\x6a\x0f\xd6\x3d\x21\x8a\x53\xd1\xd9\xe3\x07\x9d\x33\xbc\xd7\x24\x3f\x12\x79\xef\x80\x12\x3f\xa0\x10\xd5\xe7\xcc\xff\x88\x72\xde\x8f\xc7\x13\x96\x49\x47\x4a\x63\xd3\x40\x6b\x1f\xbe\xb9\xbf\xe4\x09\xdd\xfc\x99\x14\x1f\xbf\xa5\xd2\x9e\x91\x39\x4c\x94\x12\x37\x62\xe6\x66\xe9\x32\x04\xe4\x51\x25\x75\xa2\x20\x92\x21\x3f\x61\xcc\x7e\x8b\x13\x07\xb4\xeb\x2c\xb3\xb2\x39\x58\x26\xb1\x43\xd2\xdd\xbc\xda\x1e\xac\xb9\xda\x1e\x7c\x55\xab\xcd\x1e\x7b\x95\x9e\xa4\xd1\xcb\xe5\xf1\x47\x34\x55\xdd\x97\x43\xea\x57\xac\x07\x74\x86\x12\x48\x0b\x01\xbc\x3b\x00\x9d\x41\x9f\xc9\xe8\x7b\x7a\xe9\xd9\x5e\x04\x0a\xd2\x91\x8a\x84\x64\xae\xf4\x75\x7e\x09\x93\xcf\x89\xee\xff\x8d\xe7\x92\xab\x8e\xe6\x30\xcd\xd1\x24\x37\xbe\x54\x5e\xbe\x1d\xcf\xf6\xb5\xbd\x57\x55\xf9\x99\xae\xac\x62\x60\x91\x3f\x92\xbb\xc8\x3f\xc8\x3b\xa2\xae\x73\x28\xc5\x09\x61\xd6\x68\xc1\xc1\xbf\x1f\xc0\x3f\xd4\x95\x1d\xc5\x27\xd4\x03\x7b\xae\xb4\xfb\x20\x95\x79\xae\x92\xdc\xb5\xd2\x05\x1a\xf3\x22\x60\x30\x08\x12\x4e\x36\x0c\x73\xe5\x8e\x37\x4b\x26\x63\x97\x35\xdc\x99\x89\xf3\xb9\xcc\x20\xc9\x2f\x74\xd1\x10\x7f\x51\x43\xcc\xbb\x59\xc8\x21\xfe\xf2\x45\x87\xa8\x32\x94\x59\x23\x9c\xeb\x4c\xa6\xc5\xbd\xe1\x00\x65\x3f\x71\x9c\xe4\xe7\x81\x4a\xfe\x5f\xba\x1f\x38\xd7\x94\xd2\x13\xee\xc5\xd1\x6b\x18\xb3\x28\x98\x4c\x43\x2b\x43\x59\x18\x8c\x83\x4c\x6d\x2b\x96\xa8\x94\x92\x5a\x8b\x67\x25\x99\x09\xa6\x6d\x7a\x15\x67\xf6\x0b\x8c\x14\x69\x9c\x05\x03\x8c\xe9\x02\x0c\x86\x09\x1b\x73\xa1\x17\x60\xdc\xbf\x80\x5f\x29\x31\xa6\x2c\xb8\x52\xa8\x4a\x58\x03\x1e\x62\xd8\x18\xed\x48\x58\x44\x1a\xcd\xba\xe5\xdb\x99\x4c\xad\x66\x3c\x05\xac\xf1\x78\xda\xbb\x34\x67\xd6\x2e\xf3\x45\x12\xdb\x04\x99\xf5\xe4\x22\xa6\x4b\x44\x38\x53\x71\x7f\xce\x94\x06\x64\x86\x2c\xb6\xb9\x01\x99\x9c\xc5\x78\xef\x58\x18\xfe\x9b\xe8\xb5\x14\x2b\x72\x1f\x21\xe1\x2a\xf0\x8b\xaf\x50\x78\x30\x7f\x14\x70\x69\xc0\x24\x47\x8c\x81\xb4\xe4\xdd\x46\xfa\x9b\x6d\xf3\x46\xd9\xff\x64\x4d\x4d\xeb\xc9\xd7\xa5\x69\x99\x91\x17\x5a\x7c\x27\x7d\x53\x75\x7d\x72\x21\xb5\xdb\x1c\x61\x49\x51\xdc\x58\x9e\x4b\x69\x20\x54\x6b\xb9\x53\x43\xb7\xd5\xed\xb4\x3a\xf2\x20\xa7\x02\x7b\x93\x93\x92\x60\x1e\x7b\x27\x3a\x73\xb3\x7d\xff\xff\x6b\x2b\xd2\x69\xba\x28\xf4\xa3\xc9\x3d\x85\x3e\x91\xc6\xb1\xf9\x4c\xc6\x99\x74\x43\xab\xe3\x45\x91\x5c\xfe\x41\xa4\x47\x62\xee\xce\xf4\x9a\x43\x8f\x74\x2b\x36\xfb\x05\xcf\x60\xc2\x52\x7d\x05\xa0\xbd\xa0\x23\xad\x36\x9f\xc5\xd1\xf3\x84\xa3\xe3\xb6\x74\x1c\xfe\x51\xfa\x71\xfb\x2c\x0c\x85\xde\x97\x1a\xc7\x5f\x30\xa8\x6e\xa9\x19\xc2\x39\x75\x9e\x9c\xe8\x67\x54\x38\x3c\x47\x06\x62\x71\xae\xa9\x72\x84\xc9\xbd\x09\x30\xaf\x38\x2c\x45\x5f\x45\xf7\xaa\x06\x50\x48\xff\x64\x01\x52\xdf\xc2\xb9\xb6\xaa\xc4\x94\x01\x2f\x07\x51\xf3\x9c\x93\x0e\xe0\x83\x58\xa6\xc1\xd0\xbe\x74\x3d\xe7\x3c\xd2\x79\x4b\xcf\x65\x3a\x01\xc3\xc8\x0b\x80\xe2\xa1\x55\x41\x2c\xbf\x4b\xa1\x93\xb4\x7b\x36\xf5\xd4\xee\x93\xc5\xf0\x31\x8a\xaf\xa4\x0d\xa5\x70\x42\x6f\xe5\x3a\x77\x2c\x5e\xc5\xd4\xb7\x6f\x8a\xe6\xf7\xf3\xb9\xfc\xa3\x62\x38\xce\x8c\xcb\xad\xf7\x20\x9a\xe3\xaa\xd3\xb5\x14\x99\x51\xdf\x58\x78\x70\xc3\xe5\xc6\xf1\x94\x40\xab\xf7\xdf\xd8\x25\x7b\x8f\xbe\x4d\x10\xc5\x63\x1e\xf9\x21\xc3\xb3\x40\x9d\x5f\xb4\xe0\x8c\x2e\x1a\xbf\x95\x19\x3e\x17\xa1\x86\x83\x78\xbf\x36\x7e\xf2\xb6\xe3\x4b\x61\x69\x99\x0f\xd5\x33\x5a\xd7\x8c\x68\x9b\xff\xaa\xc1\x28\xa7\x44\xb1\xf0\xac\x47\xaf\x08\xac\x10\x0c\x08\x17\x3c\xcd\xb1\x64\xb9\x34\xcf\x36\x65\xc0\xd5\xdb\x1b\x14\x87\x9e\x94\x85\x9e\x72\xd9\xf5\x4c\xd0\x70\xe5\x35\x7b\x33\x44\x83\xd2\x06\x81\xd2\x5d\x51\x51\x6a\xab\xe7\x5d\x74\xcf\x4d\x66\x75\x72\xcf\x54\x0c\x90\x53\x4e\x3b\xce\x5b\x92\x17\x64\xbd\xd4\x2f\x59\xd4\x8d\xa1\x60\x17\x4b\xf9\x89\xa3\x34\x4b\xa6\x7e\x16\x27\x85\xe7\x40\xca\xa0\x2f\x9f\x70\x44\x56\x36\xf3\x33\x09\xf5\x4c\x67\x73\x74\xcf\xd1\x16\x28\xeb\x0d\x08\x86\xfe\xa6\xa7\x4c\xa9\x38\xf8\xcf\x51\xe8\x8b\xa5\xbc\x9b\x0c\x0c\x24\xb3\xb1\xe8\xd0\xaa\x29\x1b\xa3\x38\x26\x5c\x05\xe3\xaa\x97\x4e\xea\x61\x8d\x74\xcf\xc5\x7c\xb5\xe8\x1c\xbb\x0d\x11\xbf\x92\x28\xd5\x13\x3e\xc4\x07\xd2\x9e\xd0\xa3\xb6\x01\xcc\x1e\xd3\x57\x25\x65\xbe\x57\x39\x6b\x25\x5c\x53\x55\xfc\x9f\xeb\x86\xd5\x95\xcc\x14\x2b\xe7\x37\x9f\x46\xb6\x2a\x01\xac\x9c\xa2\xc2\x33\x94\xb7\x85\x0b\x96\x2d\x5b\xd3\x90\x64\x36\x57\x21\x56\x8a\x4f\x7d\x4c\xd4\x4a\xa4\xfe\x64\x1f\xc4\xec\xde\x94\x3a\x87\x83\x4f\xa1\x9e\xf0\x94\x72\x91\xa3\xd3\x49\x43\xa6\x43\xc6\xec\xab\xe1\x5c\x51\x64\xab\x54\xf5\x21\x10\x87\x96\xba\xa8\xd1\x70\x3e\x29\x65\xd0\x46\xc3\xce\x76\x2a\xcf\x03\xda\x47\x64\x9a\xc5\x42\x97\xa0\x4c\xc7\xe4\x3e\x9e\x37\x9a\x9a\xe3\x8d\xaf\x74\x90\xb3\x01\x4f\xb3\x24\x9e\xab\xa7\x5e\xad\x72\xa4\x09\xde\x51\xf4\x82\x6a\x93\x5d\x5b\xe3\x9d\xfb\xaa\xed\xd6\x8e\x05\x50\x6a\x20\xea\xb9\x9c\x76\x81\x91\xf8\x05\x29\xf8\xa8\xbb\x0c\x1c\x17\x4f\xfb\x8a\x41\xfb\x3b\x42\x14\x37\xe3\x89\xeb\x15\x4f\x6f\x83\x8b\x0a\x0a\xad\x8f\x33\x47\x97\x39\x73\x47\xa9\xb4\xa6\x6b\x3d\x20\x55\x62\x85\xa8\x51\x45\xf5\x06\x7c\xca\x1b\x37\x6f\x1e\x1a\x5d\xf2\x0e\x3c\xe5\xaf\x2a\x1b\x48\xb7\x59\x6a\x27\x2d\xd8\x91\xd4\x0d\x91\x99\x82\xdf\x51\x3d\x6c\x23\x69\x0a\x91\x51\x3d\x38\x17\x3a\x05\x89\x3e\x2b\xb5\x2f\x41\xa2\x3e\xd3\x3f\x81\x9c\xa4\x75\xda\xe4\xa4\x12\x87\x9c\x54\x54\x42\x4e\x95\x64\xdd\xa8\xb8\x53\x5b\xe9\x25\xf7\x32\xb5\x39\xca\x93\xaa\x7e\x46\x59\xba\xdf\xb7\x94\xb5\x94\xcf\xf5\xeb\x91\xb1\x15\x8c\x36\xf7\x94\xcf\x11\xd3\xce\xd0\x34\x4a\x66\x6c\x96\x90\x34\x07\x55\x3b\x23\xad\x9e\x6c\xc5\x41\xb4\xdf\xb1\x84\x8d\x8b\x0f\x33\x9d\xdd\xc9\x6e\x4a\xd4\x5a\xa2\x69\x1b\x28\x0b\x73\xbb\x0d\xaf\x71\x45\xa7\x28\x46\xdf\xaa\x37\xb6\x26\x04\x42\xc3\x15\xa8\x84\x1c\x30\x6b\x4b\x70\x15\x7d\xa4\x83\x1f\x32\xcd\x17\x8a\x34\x84\x8f\xa5\x95\x7e\x36\xf1\x4b\xf3\x21\xe4\xe5\xcb\xd3\xa2\x82\xac\x1d\xd8\x8b\xe7\xb9\xca\x7e\x54\xf8\x7a\x09\x54\x7c\x71\xe1\xb1\xd4\xe5\x00\x05\xa3\xf8\x82\xf5\x17\x8c\x6d\x4c\xf6\x76\x55\x9a\x7f\x9a\x19\x47\x3c\xd5\x5a\x66\x10\xc1\xb1\xda\x9b\x4e\xea\xff\x22\x57\x55\x2a\xbd\xa3\xe5\x4b\x57\xd3\x93\x5e\x3f\x84\xaa\x79\x6d\x5b\x41\x69\x74\xcc\x50\x53\x65\x36\x68\x15\x13\x4d\xbe\x8d\xb6\x43\xdb\xa0\x64\xd9\x47\x01\x63\xa7\xed\x93\x63\x29\xcd\x43\xdd\x73\xf3\x50\xf7\x16\xe5\xa1\xee\x9d\x40\x1f\x3e\x5d\xcb\xf4\xa7\x82\x0b\x84\xd8\x7b\x3e\xe2\xfe\xc7\xba\xe8\xd3\x93\x58\xaa\x2c\x5a\xa2\xac\x95\xfa\x23\x3e\x98\x86\x9c\xb8\xb7\x84\xfb\xc0\x4e\xce\xf1\xcf\x29\x4f\xb3\x83\x28\xa0\x23\xf1\x77\x09\x1b\xf3\x3a\x0e\xab\x45\xa2\x4c\xc5\xa8\x32\x09\xfd\xd0\xd8\x35\x55\x82\x64\xc0\x85\x62\xed\x0b\x31\xab\x2e\x6d\x02\x29\x1e\x93\x69\x94\x02\xcb\xe4\xaa\x8f\x7c\xde\x9c\xf0\xa4\x99\x05\xfe\x47\x83\xec\x54\x21\xa9\xe0\xd4\xad\xe2\xd6\x79\x10\x0d\xb0\x40\xe7\x09\xc3\xb0\xfc\xd9\x08\x3e\x5d\x63\xdc\x60\x7b\xf9\xe4\x55\x33\x35\x0b\xd2\x72\x48\x4f\xf9\xa8\x57\x33\x41\x4e\xa0\x1a\xc9\x16\x8a\xc3\x4c\x0c\x44\xd3\x79\x40\x09\x80\x50\x2c\x68\x82\x67\x34\x04\x1d\x93\x37\x95\x7b\x72\xee\x36\x59\x7c\xa1\x05\x9f\x2f\xb7\xdd\x68\xd3\x3e\x1c\x9f\xe4\x69\x8e\xe9\x36\x9c\x63\x87\x6b\x64\x4c\xa1\x4e\xd1\xc2\x7f\xfb\x5f\x53\x9e\xcc\xe1\x0a\x5f\x4c\x24\xb4\x32\x08\x4b\x3b\xc0\x82\xf9\xfb\xde\x3d\xeb\x59\xc0\x6f\xff\xc4\xc6\xcf\xac\xc0\x05\x1d\xc1\x81\x4e\xe0\x17\x09\x2e\x17\xe0\x4b\x00\x52\x8f\x9d\x14\x14\x19\xd1\x00\x41\x38\xa1\x99\x30\x05\x00\x9f\x50\xc0\x69\xfb\x3a\x4b\xbd\x5a\xcf\xcd\x53\xcb\x79\x17\x2d\x97\x03\x2d\xf2\xd6\x47\x3e\x4f\xeb\x8b\x66\xd1\x0e\x45\x53\x80\xd7\x68\x94\x44\x5b\x8b\xd8\xd8\x8a\x5b\x72\x5a\x8e\xc9\xb1\xa8\x75\x72\x03\x07\x15\xaa\x7f\xfe\x2c\x76\xde\x22\x1e\xf0\xac\x58\x26\x9b\x08\x01\x60\x85\xa2\x56\x04\x7c\xc7\x87\x4c\x1c\x8e\xf0\xf6\x4f\x35\xa9\x91\x6f\x52\x9d\x68\x03\xfb\x4f\x01\x1d\xaa\x2c\x2e\xb0\x29\x69\x53\xb0\x7c\x90\xf9\x24\x0f\x2e\x65\xa4\x0c\x31\x04\x90\xe5\x00\xa2\x5e\x1f\xff\x2b\x8b\xae\xbd\xc5\x74\xd4\x03\x54\xc3\x4b\xe3\x24\x7f\xd9\x79\x3e\x27\x9b\x30\x56\x69\x89\x0a\x95\x41\xda\x75\x14\x72\x32\x2f\x37\xe1\x9c\xfe\x2a\x92\xd1\x80\xa7\x57\x81\x23\x0e\x4c\x06\xb9\xc1\xec\x31\x14\xc8\x9b\x25\xe7\x41\x86\x77\x0c\x7e\x4c\x6f\x9c\x22\x6b\x0f\x11\x8b\x53\xc8\x05\x19\x09\x47\x60\x3f\xf5\x47\x54\x35\x48\x15\x10\xfd\xf4\x4c\x1c\x19\x8d\xdd\x3b\xc8\x52\xd7\x70\xeb\x26\xb5\x60\x83\x01\x0a\x37\x2b\xdc\x00\x69\x59\x81\xd9\x66\x9c\xd8\x03\x0a\xc6\xb7\x87\x70\xf0\xf3\xc1\xbb\xc3\xbe\x8c\x7b\x20\x00\x59\x7b\xec\x59\x61\x22\x30\xfa\xd2\x19\x2a\xb7\xe2\xbb\x2a\x3f\x92\xe7\xe9\x3b\x25\x3c\x54\xb2\x76\x72\xcd\xdc\x40\xe5\xb9\x8f\x2d\x65\x97\xbf\x77\x0f\x82\x54\x99\xcf\x0b\xb5\xc8\x8c\xee\x84\x35\x2f\xaf\x22\xf7\x2d\x6b\xc7\x3e\xb5\x44\x55\x8e\x03\xbd\x3c\x10\xf5\x1d\xa5\x79\x49\xf8\x73\x45\xd8\x61\x20\xaf\x79\xc8\xad\x5f\x6e\x60\xe5\x4a\x94\x9a\x72\x0a\x21\x85\x07\xde\xfc\xd6\x57\xb7\xf3\xfd\x3a\x67\x51\xa9\x57\xe8\x25\xe3\x7c\x34\xb9\xaa\x9c\x62\x27\x6b\x6b\xca\xb3\xe9\x84\x60\xa2\x5c\x10\xea\x0f\x3d\x3c\x9b\xcb\x87\x46\x62\x27\xf7\x19\x19\x2d\xd4\x40\x10\x79\x39\x92\x20\x52\x91\xff\x7c\x48\x83\x6c\xca\x8c\x7c\x96\x83\xa0\x29\x3c\x14\x7d\xbc\x52\x5d\xd4\x1b\x4e\x80\x27\x43\xd5\x56\x7e\x7c\x85\x21\xa9\x3c\x24\xf4\x62\xb1\x86\x1a\x25\x29\x3e\xf6\x0a\xb0\x32\x83\xcf\x25\x7b\x8b\x35\x88\x63\x54\xcb\x8c\xe0\xe8\xa6\x59\x4c\x91\x67\xa2\x01\x25\x49\x83\x34\x9b\x0e\x87\x14\xba\xf7\x7d\x10\x89\x93\x5c\x36\x3d\x4f\xb7\x44\xff\xa4\x55\x3c\x17\x4d\xeb\x6f\x25\xef\x1c\x13\x5d\x3f\xf2\x79\x1f\x6a\x44\x2a\x79\x6d\x8c\xf6\x34\xeb\x90\x45\x1f\xff\xf6\xb7\x6e\x51\xdb\x92\x5a\x8d\x38\x61\x90\x56\x63\xc5\xff\xf4\xc0\xee\x41\x1a\x08\x2a\xba\x90\x5f\x4b\xfb\x90\xdf\x96\xe9\xa4\x6c\xee\x2a\x7a\x2c\xab\x5a\xda\x7d\x59\xc5\xa5\x06\x4c\x77\x99\x4b\x21\x53\x5a\xb7\x9c\x18\x65\x35\x4b\xd0\xc9\x5f\xc8\xbd\x97\x2a\x34\xb0\x48\x87\x16\x52\x97\x59\xc9\x34\x52\xf6\x02\x8c\x2b\xfd\xe3\x4b\xb5\x74\xd8\x25\x0b\x42\xd1\x9f\xbe\x80\x93\x61\x08\x5c\x8d\xdc\xfa\x9a\xb3\xbe\xc9\x1b\xb0\x02\x3a\xcf\xe3\x30\xe4\x3a\x8e\xd2\x34\x0b\xe4\x91\xd9\x7e\xd8\x74\x95\x04\x19\xe6\x4f\xa2\xe3\x94\x91\xd1\x7a\x4c\x19\x4b\xb0\x06\x9a\x64\xcd\x05\xe3\x23\x1d\x35\x09\x71\x0d\x52\x33\x0e\x52\xe3\xc9\xe6\xa5\xc0\x04\x91\x1f\x4e\x07\x1c\xce\x48\xc2\x35\x05\x36\x69\xeb\xb7\x54\xdf\x5f\x9f\xe9\x37\xef\x67\xaa\x6f\xd5\x76\x7b\xfb\xc5\xe1\xdb\x77\x87\xcf\x0f\x3e\xbc\x3c\x7a\xb3\xbd\xdd\x27\x87\x00\x7c\xea\x1f\xab\x40\x73\x44\x0b\x3c\x4e\xa3\x2f\xab\xbe\x19\x55\x40\xac\xa8\x0d\x6e\xc0\x86\x3b\x98\x47\x2c\xd3\x37\x66\x04\x63\x1c\xe3\x44\x92\xe3\x84\x18\x8d\xcc\x7b\xa4\xc0\xbd\x98\xea\x50\x1d\xa3\xe0\x62\x44\x07\x42\xa9\x01\x48\x4b\x05\x51\xc6\x3c\xf4\xc3\xfe\x10\xba\x4c\x3a\x18\xd5\x32\x05\xee\x62\xca\x12\x16\x65\x5c\xc6\x2b\xc8\x62\xf9\x6a\x13\x52\x3e\xbe\xe4\x49\x4b\xe1\x38\x06\x26\x03\xb6\xc4\x57\x11\x24\x41\x4a\xd7\xfb\x60\x1b\x68\x41\x59\x41\x64\xa2\x39\xf9\x3b\x67\xd1\x85\x1b\xaf\x90\x1f\xe7\x38\x4e\x1a\x2b\x6e\x64\x43\x80\xeb\x13\x3b\xe3\xc7\x5b\xa9\xc3\x5f\xe3\x9e\x65\x5f\xc0\xe6\x4c\x0f\xb9\x5b\x58\x3c\x14\x4a\x13\x10\x65\x01\x8c\x32\x9e\x0c\x99\xcf\xb5\x37\x5c\x28\x6d\x5c\xce\x45\x2c\x06\x58\xe7\x59\x8a\xc6\x53\x19\xc6\x03\x03\xb7\x3b\x31\x55\x18\x46\x83\x47\xb7\x8e\x28\x1e\x70\xcb\xc2\xaf\x62\x97\xd0\x56\x61\x58\xdc\xde\xab\x99\xda\xa9\x55\xdc\x96\x90\x98\x51\x45\xa5\xf2\xe3\x38\x19\x04\x11\xcb\xe8\xca\xc4\x76\x26\xa4\x8d\x47\x06\x3a\x53\xdd\x8b\xc6\x98\x6a\x2b\x75\x9e\x5b\x6f\x57\x5a\xff\x6d\xba\x29\x13\xc3\x9b\x78\x80\x1a\x88\x6a\x22\xfe\x7a\xf3\xad\x5c\x2e\x43\x4e\x17\x64\x41\xea\xc4\x05\x11\xa8\xbd\x14\x74\x8d\x78\x06\x87\xb3\x49\x18\x27\x3c\xc1\xf8\x1f\xea\xea\x39\xd7\x59\xee\x06\xc8\x78\x2f\xa0\x99\x51\x05\x8f\x0f\xa2\x0b\x13\x1d\x0e\xa3\x60\x19\x39\x8c\xf3\xaa\xa2\x8b\x95\x51\xac\x30\xbd\x28\x34\x29\x3c\xce\x59\x69\x0f\x96\x45\xdc\xc1\x4e\xf9\x94\x20\x6e\x56\xe6\xcb\x2d\x0a\x9a\x70\xf8\xfe\xa1\xd0\x00\x28\x0a\x19\xd3\x8f\xe4\x28\xff\xcf\x48\xa6\x06\x54\xcb\xf9\x32\x48\xb2\x29\x0b\x4b\x3d\xde\x6f\xea\x94\x12\x5c\x2d\xd9\xab\x8c\x22\xb4\x4c\xb7\x42\xe8\x4b\xde\x27\xb1\xb5\x0f\x75\xb1\xce\xe3\xa1\x4c\xed\x89\x46\xa2\x9a\xb6\x12\xd5\xe0\x99\xfa\xd0\x87\x8b\x30\x3e\x67\x61\xa3\x65\x89\xbd\xbd\xad\xc2\x5d\x8c\x1d\xcb\xd1\x7c\xb7\x6e\x7a\xd4\x9f\xb8\xb6\x61\xc4\x92\x71\x1c\x69\xcb\x35\xf0\x19\x46\x46\xda\x6e\xc3\xe9\xe9\x15\x3f\x9f\x30\xff\xe3\x29\x95\xa5\xa7\xa7\xc7\x77\x65\xb5\xbb\xe2\x44\x5c\xd7\x46\xa9\x76\xfb\x5f\x20\x8d\xa7\x89\xcf\x5f\xb3\xc9\x24\x88\x2e\x7e\x7c\xf7\x6a\x5f\xef\x0f\xe2\x70\x89\x7d\xfd\x7c\xf8\xed\xdb\x83\xe7\xff\x0e\x3f\x1d\xbc\x83\x97\x6f\xfe\xed\xf0\xb9\xd8\x1f\x60\xbb\x7d\x4d\x5b\x75\x49\x87\x9e\x85\x45\x42\x1e\xe6\xa7\xa7\xf5\xfb\xdd\x46\xa3\x81\x92\x69\xbb\x0d\xd7\x0d\x4f\xc0\x7e\xf8\xa8\x27\xc8\x4b\x65\xfa\xa0\x52\xa7\x6d\xc1\x93\xc3\x4a\x4b\xe1\x09\x75\x62\xeb\xae\x58\xcd\x69\x96\x04\x7e\x76\x77\x6f\x6b\x6b\x4b\x1e\x9a\x73\xb1\x95\x35\x98\xbb\xa7\xa7\x3c\x7d\x8d\xc0\xef\x7a\x32\xec\x26\x6a\x2f\x78\xe7\x84\xe7\x08\x34\x1c\xca\x33\xb3\x39\x85\x53\x4c\x44\xf8\xfc\xd9\x32\xd7\x65\x2c\xb9\xe0\x59\x03\x3e\xc1\x30\x4e\xa0\x8e\xa1\x2f\x61\x1f\xba\x7b\x10\xc0\x37\x05\xdb\xe2\x1e\x04\x3b\x3b\xa2\x32\x06\xb8\x44\xaa\xdb\x16\xc8\xe3\xe0\x64\xcf\xc0\xf9\xc8\xe7\xa8\xdd\x63\x35\xd1\x48\x1c\x25\x24\x2a\x5a\x5d\x6e\x8d\x58\x7a\x74\x15\xa9\x51\xd2\x6c\x50\x13\x4f\x40\x10\x67\x32\x20\x24\x8f\x3f\xf2\xb9\x98\x7b\xfa\x8a\xbf\xf6\xe0\x1a\xff\x4f\xad\x08\xac\xb7\x87\x56\x2d\x24\x41\xc2\x19\xc6\x18\x2e\x9b\xc9\x6e\xc3\xa9\xd5\x13\xd5\x70\xd7\x88\x27\xf2\x41\x81\xe4\xd6\x3a\x55\xd0\xd5\xc5\xea\xfd\x30\x9f\x60\x1e\x8a\x32\xc0\x9d\x62\xcd\x45\xc0\x75\x25\xd1\x4c\x4f\x4c\x45\xed\xf8\xfc\x37\x41\x10\x95\x1f\xeb\xfc\x37\x71\xb0\x8d\xcf\x7f\x6b\x19\x9e\x80\x67\x58\xde\x87\x4f\x3a\xfb\x32\x16\x5c\xef\x09\x2d\xd4\x74\x40\x3b\xe7\xcf\xf4\xd8\xfd\xad\x3e\xf9\x88\x2e\x90\xf2\xa9\x9a\x67\xa2\x2a\x99\xc5\x6c\x2e\x09\x10\x01\x35\xb1\xa2\x85\x0e\x69\x1a\x34\xe0\x29\xe6\xa5\x16\xfa\x4c\x10\x4d\xf9\x1e\xc5\x96\x5e\x6a\xf6\x11\x81\xa0\x61\x37\x96\x0c\x10\x88\xe9\x8f\xcf\x7f\x43\x3e\x2b\xce\x3a\x51\xfd\x00\x9d\x25\x2c\x93\x34\x16\xd4\x31\xc8\xa2\x87\x30\xf9\xcc\x4a\x18\x8b\xf4\x4f\xff\x26\xb6\x91\x38\x92\xf1\x68\x31\x1e\xa3\x2e\x51\x16\x54\xbb\x4a\xb1\x55\xce\xc0\x5e\x4b\x27\x2c\xaa\x41\xbf\x50\x53\xdb\x69\xa3\x88\x27\xef\xf8\x50\xf7\xa7\x0a\x74\x77\xa3\x20\x1c\x24\x3c\x32\x08\xc9\x02\x13\xce\x36\xc5\x79\x43\x3e\xac\x9a\x4d\x39\xec\xe3\x9a\x46\xa0\xe6\x41\x4d\xf5\x25\xfe\x56\x60\x6b\x27\x0d\x1d\xbb\x56\x5b\x5e\x25\xb9\xf2\x69\x52\xd0\x6d\x83\x90\xd7\x64\x56\x65\x75\xa1\xa3\xe4\x52\x2b\xa5\x3c\xc3\x59\x10\x5a\x07\x7d\x37\xc6\x05\xb9\x07\x19\x7a\x88\x5d\x48\x41\xb5\x32\x63\xab\x0a\x76\x7b\x99\xd6\xc2\x42\x0a\x9d\x88\xb4\xc9\x58\xe8\x18\x07\xba\xb8\x6e\x12\xa6\xca\x4e\x0d\x8d\x4b\x3b\xd5\x50\x15\x99\xcd\xd9\x6f\xd8\xd7\x03\xd6\x16\x76\x72\x56\x35\x68\x28\x0b\xbb\x75\x5a\x54\x1d\xd6\x3f\x59\x80\xfb\xd6\xdf\x9e\x99\xd6\xbe\x35\xc3\xd7\x6e\x12\x1e\x3d\x99\x7a\xfe\x6d\x0b\xb1\x6e\xa6\xce\xbf\x12\x33\xa7\x92\x41\xd3\x6a\x40\x3e\x62\x0d\x93\x70\xc3\xa6\x95\xc3\xeb\x35\x72\x5c\xaf\x99\xec\xb1\x36\x46\xad\x04\x79\x43\x51\xa8\x10\x0a\x3c\x57\xdb\x5a\x0b\x4e\x13\x2b\x42\x70\xbd\xe3\x49\x41\xdd\x22\xdb\x89\x4a\x11\x54\x37\x2b\x2b\x07\xd6\xd3\xd4\x6e\xec\xe1\xcd\x2d\x72\x42\x4b\xb2\xb4\x92\xe0\x9f\x74\x9c\xe5\xbe\x2d\xb0\x5b\x52\x76\xb6\x68\x61\xb5\x82\x54\x45\xc3\xb7\x40\xd9\x3b\xc1\xa7\x2d\x6b\x58\x15\xa0\x22\x7e\x34\x14\x65\xf5\xe3\xb2\xcf\x82\xaf\xbd\xd2\x86\x82\x31\x29\xf1\x82\xa2\x54\x79\x07\xa2\x9e\xa8\xa5\xc6\xfd\x45\xd0\xc0\xf1\x4b\x65\x44\x7d\x82\x7d\x92\xb2\x7b\x05\xcd\x68\x77\x83\x9a\xd1\x02\x35\xce\xc0\x96\x9a\xaa\x68\xbd\x21\x3d\xea\xcb\x28\x11\xe2\x7c\x55\x0e\xb3\xf7\xd8\xa9\xb5\x50\x77\x98\x26\x5c\x57\x7e\x7f\x79\xf1\xd2\xc7\x24\x2c\xa5\x50\x1f\xe4\x2b\x2e\x02\x2c\xab\xfc\x21\x2a\x89\xc0\x49\xf6\xf7\x9c\x2c\x4b\xfb\xf2\xbc\xd1\x3a\x3d\x7d\xfd\xe3\x4b\x85\xcc\xe9\xa9\x50\x5d\x35\xf6\x8a\xf7\xcc\x04\x0c\x29\x3d\xa5\x98\x07\xcd\xb3\x8e\xb0\xa8\xd7\x26\x2c\x1b\xd5\x3c\x81\x47\x1f\x6a\xaf\xbb\x0f\x5a\xf7\xbb\xf0\xa8\x75\xbf\xfb\xaa\x7b\x1f\x1e\x86\xcd\x87\x40\xff\xd7\x6d\xdd\xef\x36\xbb\x58\xde\x69\x3d\xde\x85\x6e\xef\xf7\x1a\x68\x8e\x78\x3e\xe2\x97\x49\x1c\xbd\xe2\xc3\xcc\xde\x00\xad\x62\xda\x76\x49\x36\xaa\x2b\xac\x85\x88\xa1\x54\x74\x88\x40\xbb\x0a\x6d\xdf\xf8\xa7\x18\xe0\x16\x80\x94\x65\x2e\x0e\x28\x1d\x91\x59\x14\xfc\x46\xdd\xaa\xd1\xd8\xb3\xeb\xb7\xc6\xd3\xe0\x0d\xa6\xc1\x80\x9a\xec\xb2\x56\xba\xa4\xad\x36\x0b\x17\x9f\x3c\x43\x2d\x5a\xcd\x15\xe7\xa6\xfb\x7f\xee\xb9\xa9\x6a\xc5\x5b\xd6\xf9\xbc\x6f\x83\x6d\x21\xb7\xba\x11\xaa\x16\xe9\xa1\x14\xe6\x3c\x2d\x9c\xa8\x3a\x74\xa2\x22\x55\xae\xe4\x34\xa5\x82\x44\xc6\x89\x52\xf8\x50\xcb\x35\xc5\x2d\x1e\x4d\xc7\x3c\x41\xa3\xe9\x7e\x45\xb9\x38\xda\x61\xae\x0a\xfb\xbb\xbe\xbb\xa3\x96\x98\xcc\x03\x37\xf6\xbb\x38\x7a\x0c\x79\x68\xaa\x37\xec\xa6\x57\x49\x90\x39\xcd\xca\x49\xac\x46\x6e\xb5\xfc\xc8\xe7\xf6\xef\xc6\x9e\x7d\x4e\x33\x14\x7d\x6e\x5c\x70\x3d\xba\x43\x91\x5b\x37\x19\x28\xdf\x2a\x52\x62\x2a\x37\xfd\xb9\x51\x24\xbe\x05\xc8\x1c\x2f\x6c\x90\x0d\x1a\xb3\x03\x77\x11\x14\x17\x85\x3d\x85\xba\x55\x63\x0f\xe5\x57\xfd\x0b\xef\x13\x5f\xf0\xb0\x49\xbc\x2e\xb8\x1c\x03\xc6\x57\x6d\x1c\x25\x55\x17\x75\x61\x6a\xe9\x86\xf2\xe5\x41\x39\xfc\x07\x66\xbb\x3b\x98\x4c\xbe\x65\x49\xe5\xb6\x78\x3f\x57\x71\x11\x16\x54\x43\x37\xf8\x10\xc7\xe1\x79\x25\xe8\xee\xe3\xc7\xf9\x9a\x8b\x60\xcb\x2a\xa6\xc9\x7c\x12\x5f\x24\x6c\x32\x9a\x57\xc0\xbf\xdf\x29\xa9\xbb\xb0\x07\x5d\x4b\x37\x14\x62\xfa\xdb\x69\x96\x55\x6e\xf0\xdd\xdd\x4e\x49\xe5\x45\xbd\x98\x5a\xba\xe1\x6b\x1e\x4d\x2b\xe0\x3f\x7c\xf4\xc0\xa9\xb6\x08\xb2\xf8\xae\x2b\x3f\x8f\xc7\xe3\x4a\xac\x9f\x3c\xf8\x83\xcd\x1e\x39\x17\x37\xe5\x9c\xe7\xd9\x2b\x5b\x49\x9c\x3b\xfa\xb3\x76\xe2\x8b\x87\x4e\x45\xb4\x4e\x8d\x92\xf8\x0a\x4d\xee\x62\x65\x1d\x26\x49\x9c\xd4\xef\x3e\x67\x91\xf2\x00\x06\x26\xef\x88\x59\x6a\xa5\x2b\xb9\x4b\x22\xd1\x46\x6d\x12\xa7\x69\x70\x1e\x72\xab\x83\x77\x38\xe2\x7a\xca\xc3\xa1\x87\xc0\x34\x6a\xa2\xc8\xed\x5d\x47\x90\x95\x28\xe0\x7d\x84\x4c\xa3\x84\x6f\xa0\x94\xef\x71\xca\x07\xd0\x84\x74\x3a\xe1\x49\xbd\xe1\xd4\x20\x87\x65\x42\x4d\x9d\x58\xc5\x08\xee\xdd\x33\xc7\x40\xf1\x5b\x9c\x00\xef\xd2\xc9\xe8\xae\xd8\x74\x0a\xdf\xcc\x28\xe1\x19\x15\xf7\x41\x60\x9c\x9b\x8c\x20\x1a\xf1\x24\xc8\xd2\x7a\x3a\x3d\xc7\xed\xd6\x23\xb4\xf0\x6f\x35\x54\x09\xdc\x7c\x40\x43\xb5\xe9\x42\x60\x97\xfb\x18\x4d\x89\x52\xa5\x53\xf3\x7e\x8a\x5e\x6d\xb3\x49\xc2\x53\xbc\xbe\xc2\xf7\xb5\x32\x9b\xc4\x39\xc7\xc6\x14\x5a\xde\x64\x9f\x11\x73\x79\x17\x76\xa0\x80\x0b\x92\x4a\x61\x6f\x76\x1e\x63\x74\x25\x5d\xa2\x6e\x21\xe8\xa0\x6b\x6f\x56\x9f\xec\x17\x29\x7d\xd4\x0b\x50\x3b\x31\xc4\x31\x5b\xbd\xf2\xee\x03\xb5\x45\xcb\x67\x05\x60\xef\xf6\x54\x26\xd8\x4c\xed\x7e\x16\x71\x25\x7e\x29\x17\xa7\x65\x42\xe1\x68\x08\xcf\xca\xcb\x2b\x26\xc8\xe0\xd6\x3a\x3d\xc5\x91\x9c\x9e\xc2\xbe\x55\x45\x50\xa7\xdd\x86\xe7\xf1\x64\x4e\x0e\x2a\xbd\x4e\xf7\x11\x79\xca\xc6\x4d\x7c\x7a\xc1\xa7\x63\x38\x98\x66\xa3\x38\x41\xdf\x66\xba\x7f\x0a\x42\x74\x6b\x9a\x60\xa2\x11\xba\xdb\xb0\xeb\xeb\xa0\x12\xed\x36\xb5\x29\xfd\x2c\x20\x0c\x13\xce\x21\x8d\x87\xd9\x15\x4b\x78\x5f\x87\xc6\x4c\xf8\x20\x48\x55\xd0\x9a\x00\x23\x22\xb6\x63\x99\x1b\x65\x2e\x40\x06\x19\x5a\xf3\xe8\x9d\x6f\xc6\x93\xb1\x7e\xea\xf5\xfd\x9b\x1f\xe1\x15\x4f\x53\x9e\xc0\xf7\xe8\xec\x1b\xc2\xdb\xe9\x79\x18\xf8\xf0\x2a\xf0\x79\x44\xf7\x72\x13\x51\x92\x8e\xf0\xbd\xe1\x16\x79\x5b\xc1\x77\x02\x95\xf7\x12\x15\xf8\x0e\x9f\x8a\xc9\xd4\x46\xc4\x7a\xea\x36\x75\x57\x75\x25\x01\x62\x00\xea\x76\x1b\xea\xfa\x3a\x17\xbd\x75\x1a\x18\x98\x34\x64\x99\x69\xba\x04\x41\xcc\xb8\xb5\xb3\xd8\x28\x9e\x70\xed\x55\xab\xae\xbd\xe9\xde\xdf\x13\xd0\xce\xa7\x19\xfc\xfc\xf2\xc3\x0f\x47\x3f\x7e\x80\x83\x37\xbf\xc0\xcf\x07\xef\xde\x1d\xbc\xf9\xf0\xcb\x9e\x8e\x94\xca\x2f\xe5\xc3\x88\x60\x4c\x5e\xfa\x57\x2c\x49\x58\x84\xd7\xdb\xe8\xb0\x7e\xf8\xee\xf9\x0f\x07\x6f\x3e\x1c\x7c\xfb\xf2\xd5\xcb\x0f\xbf\x88\xc5\xf5\xdd\xcb\x0f\x6f\x0e\xdf\xbf\x87\xef\x8e\xde\xc1\x01\xbc\x3d\x78\xf7\xe1\xe5\xf3\x1f\x5f\x1d\xbc\x83\xb7\x3f\xbe\x7b\x7b\xf4\xfe\xb0\x05\xef\xe9\x82\x5b\xb4\xbf\x99\xe6\x43\x99\xca\x01\xa3\x7d\x07\x61\xaa\x28\xf1\x4b\x3c\x55\x11\x0e\xf0\x16\x35\xe1\x3e\x0f\x2e\xf9\x00\x53\x41\x4c\xe6\x4b\x4f\xaa\x80\xc5\xc2\x38\xba\x30\x97\x8c\x65\x0c\x09\x2f\x87\x42\x54\x78\x90\x72\x0e\xdf\x8c\xb2\x6c\xd2\x6f\xb7\xaf\xae\xae\x5a\x17\xd1\xb4\x15\x27\x17\xed\x90\xc0\xa5\xed\xa7\x2d\xf4\xe9\x97\x6f\x1e\x87\x32\xbe\xc3\x0f\x9c\x0d\xb8\x65\xde\x6b\xe1\x0e\xaa\xd5\x27\x93\xdb\x15\x4b\xea\xd9\x88\x1b\x67\x49\xe5\x99\xae\x3d\xd8\x18\xaa\x40\x7d\xab\x84\x2c\xb2\x74\x2d\xdd\x87\x9a\x8a\x0b\x50\xf3\x9c\x1a\xf8\x16\x5b\xd6\xc1\x1e\x5a\xa6\x24\x55\xf2\xec\xb8\x46\xef\x26\x6b\x9e\x4a\x22\x76\xe2\xe5\x7a\x12\xff\x38\x4b\x31\xd8\x5b\x11\x0e\x7d\x69\xa5\x23\x96\x4c\xbc\x42\xbb\xc1\x54\x47\x08\x29\xb4\x54\xdf\x5a\x32\x40\xef\x7b\x3f\xe1\x3c\x72\x40\x48\x27\x4f\x30\xd9\xa9\x0d\x41\xde\xdb\xe9\x7e\xd4\x3f\x1a\x8c\x38\xe9\xf6\x95\xc2\xd2\x7a\xf1\xee\xe0\xe7\xc3\x77\xa7\x3f\xbf\x7c\xf1\xe1\x07\x17\x43\x1c\x70\x1f\x6a\x3e\x0b\xfd\x7a\xb7\xd3\xf9\x3b\x34\xa1\x06\x3b\xa5\x2d\x61\x07\x6a\x93\x59\xe3\xcf\xa4\x31\x67\x29\x3f\x9a\x66\xb7\xa4\x32\x17\x1a\xd9\x2a\x64\x1e\xf3\x68\x4a\x6a\xe5\x22\x2a\x77\x7b\x5e\xc9\xb7\x77\x62\x93\xe8\x43\xaf\x53\x06\xd8\x0e\xbb\xa5\x87\x10\xa4\x93\x90\xcd\xfb\x50\x8b\xe2\x88\xd7\x4c\x33\x65\x7c\xc7\x27\x3b\x6d\xb5\xb2\x12\x2e\xa4\xba\xd0\xc3\x46\x58\xe0\xa9\x90\x65\xe4\x77\x83\x3e\x06\xc1\x80\x9f\xe3\x0b\x0b\x21\x09\x20\xf0\xe3\x48\xbd\xfc\x62\xf8\xde\xdb\x0f\xe3\x94\x0f\x5a\xa4\xdd\x4a\xb8\xb6\x95\x40\x70\x01\x2d\x5f\xb5\x34\x8d\x9e\xf3\x83\xec\xd5\xaa\x23\x7d\x33\x75\x7b\xaa\x52\xb7\x7d\x51\xf3\x4a\x2b\xbd\xcb\xa0\x8a\xaa\x3d\x58\xde\xd2\xd5\x8a\x24\xb5\x94\x68\x58\x7b\xf6\xe7\xcf\x6a\xdf\xbf\x70\xf7\x7d\xd9\x49\xa3\x85\x11\x26\x64\x7b\x7d\xe1\xdb\x70\xdd\xdb\x6c\xc3\x89\x1e\xea\xb1\x19\x07\xf9\xe1\xd1\x1c\x58\x0b\x22\xef\x7c\x47\x15\x1c\x0a\x00\xb9\x9b\x8a\x8d\x0d\x69\xc1\x53\xf3\x3e\x1c\x13\x25\x09\xdc\xe9\x79\xbf\x10\xd0\x24\x56\xeb\x2a\x18\xa6\xee\x27\xd1\xad\xa5\xe3\xab\xbc\x59\xa3\xc2\xbd\xad\x2d\xa7\xfe\xf2\x96\x3b\xfb\x9f\x3a\x9c\xb6\xdc\x68\xf9\xd6\xbf\x4f\x84\xc5\x1b\xf4\x60\x47\xd3\x9d\x75\xb2\x36\x06\x3c\x89\x55\x8b\xc4\x96\x67\x23\x8c\xbc\x89\x4e\xcd\x6e\x25\x94\x6d\x0d\x7b\xcd\x68\xac\x56\x1b\x04\x36\x51\x47\xe1\xea\x91\xd0\x68\xa4\x0b\xe4\xf7\xd3\x2c\xc3\xf7\x72\x77\x8a\x98\x96\x60\x74\x4b\xac\xb0\x99\x75\xbe\x5d\x8c\x1c\x22\x58\xf9\x05\xf0\x2a\x2a\xc4\xf0\xa8\x42\x02\x24\x2c\xcd\x6a\xd5\x80\xc4\xbf\x1a\x4b\x02\xd6\x0c\xd9\x39\x0f\x6b\x7d\xa8\x89\xe1\xc1\x20\x61\x57\x0e\x43\x97\xfd\x8b\xa3\xe7\x61\xe0\x7f\xec\xe7\xa7\x71\x71\xab\x95\x18\xc5\x08\xde\x1b\x98\x45\x08\xd2\x46\x65\xbf\x15\x73\x05\x37\xce\x17\x99\x05\xf4\x84\xd0\x29\xac\x14\x56\x63\xb3\xec\x60\x19\x55\x96\x60\x07\x3c\xc4\xf5\xa1\x96\x05\x59\xc8\x6b\x9e\xe6\x00\x29\xa4\x6b\xe2\xb4\xf7\x73\xc2\x26\xea\xf4\x54\x0d\xaa\xf6\x7d\x0c\x87\x4a\x07\x7c\xc1\xd2\xd1\x79\xcc\x92\x41\xad\x7c\xc8\x85\x52\xb7\x44\x3f\x07\xd0\x7b\xd7\x89\x12\xed\x52\x0e\x91\x40\xdd\xdb\xba\x96\x36\xc2\x96\xb3\x87\x48\x91\x9e\xbf\x92\x04\x35\xe9\x4b\xde\x6e\xd2\x60\x89\x65\xca\x9b\x9c\xc7\x71\x58\xda\xa0\xfa\x4e\x32\x7f\x7b\x5a\xbc\x6a\x40\xe6\x26\xad\xb6\x65\x04\x78\xa3\x9e\xca\xff\x35\x7b\x5d\xee\x06\xe1\xc1\x5f\xf7\x8b\x7f\xdd\x2f\x7e\xad\xf7\x8b\xbb\xd0\x7d\x3c\xea\x3e\xbe\x6c\xf6\x7e\xd8\xbd\xec\xfd\x3e\xee\x34\x1f\xb8\x3f\x1f\x5d\xf6\x46\xdd\xc7\x3f\x3d\xfc\x61\xd7\xbe\x5f\x94\x46\x58\x93\xfe\x97\x47\xd3\x2f\x7f\xa3\x28\x7b\x2d\xbb\x4a\x94\xe6\x5c\xf1\x3f\x4b\x5f\x1e\x8a\xca\x5f\xe8\xd6\xf0\xe1\x5f\xb7\x86\x7f\xdd\x1a\xfe\x75\x6b\xf8\xd7\xad\xe1\xd2\xf7\x4b\x58\xef\x87\x78\x5c\xb5\x25\x3e\x7c\xf4\xc8\xa9\xb6\x08\x53\xf1\xfd\x0f\xbe\xb3\xca\x2d\x1c\xe5\xa1\xeb\x91\x20\xb2\x3c\x70\x2d\x9f\xdc\xf2\x35\x67\x9a\xea\xdb\x05\xfc\x1f\xf7\x6a\xa1\xea\x26\x21\x7f\xdb\x80\xf7\x0a\xca\xb1\x0f\x1d\x73\xa5\x8b\x36\xc2\xb4\x2e\x91\xe2\xf3\xdf\xfe\xba\x86\xfb\xeb\x1a\xee\xaf\x6b\xb8\xbf\xae\xe1\xfe\xba\x86\xfb\xeb\x1a\xee\xab\xbb\x86\x7b\x1e\x47\x19\x8f\xb2\xf7\x57\x41\xe6\x8f\xc0\x1f\xc5\x71\xca\x53\x99\x77\x97\x2e\x0c\x4c\x74\x64\x98\xb0\x0b\x4e\x0f\x23\xd4\x05\x9d\xdb\x7c\xd9\xbb\x00\xa7\xd5\xc2\x2b\x01\xa7\xe6\x12\x37\x03\x4e\xfd\x5b\x5d\x10\x38\x10\x96\xb9\x27\x70\xbb\xbc\xc5\x75\x41\x8e\x1a\x1b\xbb\x35\x48\x69\x52\xea\x96\x41\x94\xf9\x59\x70\xc9\xf3\x15\xd1\x56\xc6\x52\xae\x6f\xf1\x3e\x1c\x7c\xff\xbe\x35\x8a\xc7\xbc\x15\x0c\xfa\xa5\x36\xbd\xa5\x0e\xe2\xa4\x50\x1a\xab\xe8\x27\x18\xf3\x71\x9c\xcc\x1d\x4b\x30\x15\x79\x90\x25\x6c\x38\x0c\x7c\xe7\x9b\x2c\xf3\xe4\x0a\x52\x21\xf7\xac\x1a\xf6\x07\xb8\xb6\x2c\x89\xd5\xe3\xf2\x47\x2c\x88\x6e\x1a\x98\xd8\x82\x97\x01\x86\xf7\x86\xcc\xa7\x8b\xc3\x0d\xc1\x8c\x78\x86\x99\x79\xaa\xc0\xb5\xdb\x70\x14\x85\x73\xba\x3a\xe7\x69\x16\x44\x17\xad\x4d\xf4\x9b\xce\xd3\x8c\x8f\x37\x35\x8a\x30\xbe\xb8\x91\x22\xb7\xb4\x7a\xd7\x06\xc1\xe5\x82\x3b\x07\x81\x61\xf5\x57\x8b\x79\x10\x45\x37\x06\x53\x18\x5f\x78\x80\x6f\xf9\xca\x16\xc9\xe6\x86\xb0\xe4\x50\xd4\xbf\x4f\x24\x0a\x10\xb1\x45\x66\x79\xf5\x2f\x8c\x2f\x16\xd6\x29\x59\x28\xea\xdf\x75\xc5\xbd\x85\xdb\xe2\xba\xec\xba\xd0\x65\x8d\x0a\x5b\xbe\x23\xed\xaa\x4c\xfa\xae\x10\x2e\x5a\xf6\x49\x8e\x95\x9b\xdd\xe9\x79\x56\xc1\x4e\xef\x8a\x90\xe5\xdf\x3b\xb5\xdb\xca\x0b\x45\xdf\x94\x9b\x7c\x4a\xda\x7d\xe5\x35\x0b\xa2\x0d\x39\xaf\xc8\xfd\xb5\x5f\x38\xfc\x7e\x2a\xf5\xc4\xe8\x76\x3a\x7f\xaf\x95\x39\x14\x90\xb3\x41\xf3\x66\x9f\x8e\x61\xc8\x67\xdf\x63\x82\xd8\xae\xfb\xe1\x9c\xf9\x1f\x2f\x12\xa1\x27\x3e\xa7\x8b\x22\xf2\x95\x98\xb0\x90\x67\x19\x6f\x99\xcf\xe5\x57\x4f\x3a\xdf\x21\x35\x4b\x27\xcc\x17\x13\x33\x8d\x82\x0c\xb6\x61\xf7\x16\x6e\x21\xc6\x2b\xe4\x2b\xf2\xb7\x29\xa3\xfd\x87\x78\xd2\x87\x07\x0f\xdd\x4f\xb1\x8e\x30\x5d\x63\xd3\x2c\xb6\x3c\x36\x3c\xd9\x37\x06\x4f\xc2\x6c\xd8\x69\x6b\x3a\xa9\xd7\xd2\x71\xad\x91\x1f\xab\x66\x8f\x22\x09\x28\x24\x42\xce\x3b\xe7\xe1\xfd\xa2\x0f\x4e\x0e\xd1\x87\xf7\x2b\xd6\xb6\x3d\x38\xd9\xef\x8d\x3e\x44\x9d\x3f\x7a\x5e\xff\x10\x1f\x9f\x9c\x4f\x0d\x2e\x77\xe3\x51\x63\x1e\x88\x2a\x79\xe0\x6a\xca\x74\xb7\x21\xda\x94\x6b\xc8\xbd\xa2\x8a\x2c\x6a\xdb\x9a\x71\xaf\xa0\x1a\x8b\x1a\x4b\x68\xc4\xa2\xda\xad\x14\x61\xd1\x70\x19\xfd\x17\x3b\xb8\x85\xda\x4b\x23\xfc\x9f\xe6\x23\x53\x1b\x33\xc1\xe8\xeb\x7a\xc6\x48\xd6\xba\xc1\xdb\xc1\x5e\xb3\xb7\xf0\x8d\xc9\x1d\x4c\xca\xf5\x21\xb5\x15\x17\x4e\x19\xe5\x5a\x4a\xf5\x09\xa0\xb4\xfa\xa2\x53\x41\x69\x03\xa1\xd3\xf5\xf3\x4a\x5e\x79\xd5\xa5\x0e\x15\x85\x96\xd7\xab\x3a\x2f\x08\x3e\xaf\xd2\x73\x70\x8d\xfd\x49\x8e\x0b\x7f\xa0\x0e\xb5\xba\xd7\x83\x92\x5a\xb9\xfb\xcf\x47\x7f\xdd\x7f\xfe\x75\xff\xf9\xd7\xfd\xe7\x9f\x79\xff\xf9\x7d\x12\x0c\xaa\x6e\x3e\x9f\x3c\x72\xaa\x2d\x02\x2c\xbe\x5b\x63\xf4\x47\x2c\xc9\xaa\x70\x7e\xf8\xe8\xf1\x97\xb8\x1a\xfd\xeb\xe9\xdd\x5f\x77\x7e\x7f\xdd\xf9\xfd\x75\xe7\xf7\xd7\x9d\xdf\x5f\x77\x7e\xff\xb3\xee\xfc\xc4\x66\x8b\xfb\xb8\x31\x61\x5c\x88\x9f\x2a\x06\x6f\x82\x43\x4b\x78\x3a\x89\xa3\x34\xb8\xe4\x40\xdb\x73\x4b\x4d\xb3\x0e\x1e\x26\x98\xea\x9d\xda\xbc\xb5\x15\x24\x05\x0a\xb7\x25\xe6\x44\x21\xfe\x5a\xb0\x4c\xc0\xc2\xe6\x8f\x2f\x6b\x29\xcc\xcc\x01\x5d\xde\x23\x6a\x94\x96\xbe\x43\x54\x2d\x16\xdf\x1f\xaa\x5a\xcb\xdc\x1d\xaa\xba\xb7\xbb\x37\x54\xad\x97\xba\x33\xd4\x5d\xdd\xe6\xbe\xd0\x8c\x7c\x63\xd6\x93\x5b\x3e\xf8\x41\x2d\x6f\xe1\x73\x1f\xc5\x51\x6a\xa7\x90\x56\x60\xf7\xbc\x4d\x65\xcb\x18\x28\x9e\x4b\xce\xc3\x6b\x1b\xdb\x46\xa3\x22\x04\x5a\xdc\x83\x65\x55\xd7\x38\xeb\x5d\xdf\xdc\x34\x70\x43\x80\x20\xe3\x63\x35\xf6\x59\xda\xa7\xa5\x23\x91\x9e\xa5\xb7\x7f\x71\xb2\xf0\x7a\x47\x2b\xd4\xad\x77\x7a\x0d\x3f\x57\x33\xb1\xf8\xf6\xe8\x53\xee\x62\x41\x1b\x95\x6d\xc4\x65\xec\xdd\x1b\x2e\xa2\x0a\x03\x08\xe3\x48\xe3\x8f\xe0\xd0\x5d\x9c\x65\xcc\x85\x4e\x39\x34\x73\x17\x73\xca\xdf\xef\xc6\xab\x2f\xb0\xee\x54\x1c\x47\x3f\x15\x8f\x70\xd1\xbf\xeb\x46\xd5\xfd\x17\x94\x3e\x64\x81\xf2\xbb\xb4\x95\x6d\x44\x7a\x49\x57\x5e\x88\x69\xe9\x52\xb4\x16\xe9\x25\x55\x1a\xd3\x0e\xc3\x2c\x97\x5c\x6a\xa1\x4f\xa8\xed\xe3\x31\x12\x05\xd6\x15\x16\x3d\xf2\x24\xcf\xd1\x25\x8d\xd6\xa2\xf6\x62\xa3\xb5\xa8\xb1\xcc\x03\x4f\xe9\x69\x9a\x9b\xd0\x25\x9e\x77\xc6\x63\xbe\xd4\xe3\x4e\xd1\xc1\x6d\x9e\x76\xe2\x08\x0b\x62\x97\x76\x7b\x3d\xee\x1f\xed\x14\x16\x50\x22\x85\x4b\xeb\xd7\x23\x3e\xcb\xde\x9a\xc7\x0e\xe6\x9f\x1c\xfe\x1d\xb4\x9a\xc9\xfb\xbc\x20\x7d\x33\x0d\xc3\xa3\xe4\x47\x15\x7a\xb5\x61\xda\x3b\x16\xcc\x63\x7d\x03\x78\xf0\xe1\xe0\xf4\xdf\x0f\x7f\x79\x2f\x2d\xae\x27\x0d\x41\x9f\x8d\x01\x95\x66\xd9\x93\x22\xb7\xdb\xa6\xe3\xf5\xb6\x29\x0c\xca\x3b\xe2\xc8\x93\xb6\x45\x58\x14\xed\x6d\x15\xaa\xd2\x38\xf1\xf2\x12\x1b\xd8\xb7\x97\x93\x24\x18\xb3\x64\x7e\xbc\xdb\xe9\x9c\xec\x15\x3b\xa1\xc1\x94\x37\x4d\xb9\x1f\x47\x03\xd3\x78\x03\x3b\xa9\xd9\xd3\x4b\x36\x51\xbd\xc0\x7b\xf7\x37\xf5\xc0\x55\x6f\x10\x07\x09\x67\xd8\x79\xd5\x13\x57\xb1\x69\x3d\x34\xdb\xc0\x6e\xa7\x23\x9d\xaf\xd3\x12\x23\xfe\xed\x5e\xbb\x1a\x6c\x7e\x39\x98\x89\xa5\x88\x27\xe9\xf5\x20\x89\x71\x79\xe6\xc5\xe3\x38\x8e\xe2\x2c\x8e\x78\xcd\xc3\x0d\xe7\xdf\x91\x0b\x71\x18\x35\x0f\xd2\x2c\x89\x3f\xf2\xbe\xcd\x2e\x9e\x38\x0e\x86\x4e\x51\xd9\xce\x50\x82\xe4\x5a\xb3\xf1\x2a\x88\xf8\x26\x66\x43\xb2\xef\xba\xd3\x21\xd0\x59\x95\x88\xf6\xca\xf1\x60\x10\x67\x3a\x8b\xf2\x7f\x1f\xf2\x7d\x6d\xcc\xfc\x9c\x25\x19\x4f\x03\x16\x91\xd6\xff\x49\x13\xbb\xf6\x2f\x9c\x1b\xe2\xbf\x60\xe9\x48\x9c\x81\xc5\xb4\x3c\x80\x07\xb5\x82\x73\xc2\x1f\x31\xff\xce\x22\xfa\x63\xa7\x7f\x53\xb2\x6c\x43\xab\xe7\x96\xb3\xe6\xc1\x25\x4f\x30\xeb\xb5\x21\xdd\x1f\x2f\x0b\xdd\x65\x4c\xc2\xd0\xd9\x14\xcb\xe6\x73\x45\xad\x57\x28\x53\x95\x8f\xba\x85\x22\x57\xd4\x75\x71\x23\x5e\xe9\x5e\xf4\xcb\xdd\x59\x7e\x40\x37\xae\x7a\xa3\xae\xb4\xd5\xdc\x65\xe5\xe3\x45\x97\x95\xcb\xa6\xdd\x28\xb9\xb8\x2c\xbf\x53\x2b\x05\x98\xbb\xc2\xb4\xaf\x2f\xd1\x5b\xd6\x4a\x45\x12\x8c\x55\x0a\x12\xbc\x3f\x39\x95\x8f\x57\x4f\x5f\xbe\x7e\x7b\xf4\xee\xc3\xe1\x8b\xd3\xd7\x47\x2f\x7e\x7c\x75\x78\xda\x39\x3d\x9d\xc4\xe1\x5c\x70\x04\x9a\x5d\xcb\x2f\x6c\x9e\xdc\x0e\x78\xf7\xf4\x54\x5b\x0c\x4e\xdf\x4f\x31\x8d\x51\x65\x2f\x4f\x1e\xba\x9d\x24\x5c\xa6\x51\xa9\x9f\x07\x98\xf9\xa6\xe1\x26\x54\xd1\x2d\x5b\x83\x0a\x6a\xc9\x1e\xef\x1a\x2b\x42\xdd\xba\x01\x5a\x15\xed\xe3\xbb\xec\xee\xc9\xde\x6d\xe9\xdc\xb3\x61\xbe\x62\x73\x9e\x54\x12\xa2\xfb\x64\xd3\x84\xc0\xfe\x56\x26\x43\x19\xca\xeb\x11\x61\x57\x40\x94\x52\xe1\xf4\x15\xbf\xe0\xd1\x60\x01\x15\x1e\x6d\x9c\x0c\xd8\xe3\xca\x74\x28\xc5\x7a\x3d\x42\xdc\xb7\x41\x7e\x88\xe3\x30\x0b\x26\xd5\x94\xd8\x7d\xbc\x69\x4a\xc8\x2e\x57\x26\x45\x39\xde\xeb\xd1\xe2\x81\x0d\xb3\xc4\xc0\x55\x49\x97\xc7\xbb\x1b\xe7\x90\x92\xee\x57\xa6\xd1\xcd\xe3\x59\x8f\x5e\x0f\x6d\xf8\xcf\xf9\x02\xb9\xdd\xed\xec\x6e\x9a\x40\xa2\xbf\x95\x29\x52\x82\xf1\x7a\x24\x78\xe4\xb0\x21\x9f\x65\xd5\x5b\xd7\xe6\x97\x0e\x9f\x65\x2b\x53\xa0\x04\xe1\xf5\x28\xf0\xd8\x91\x49\xec\x9c\x57\x73\xc1\x83\x07\x9b\xdf\x4e\xce\xf9\xea\x5c\x50\x86\xf2\x7a\x44\x78\x52\x80\xf8\x2a\x48\xab\x79\xe1\x51\xf7\x8b\x10\x42\xf4\xb9\x32\x31\xaa\x50\x5f\x8f\x20\xdd\xce\xe9\x69\x3a\x62\x13\x7e\xfa\x9e\xfb\x59\xbc\x40\xc5\x78\xd0\xd9\xb8\xb2\x85\x3d\xae\xae\x6b\x15\x50\x5e\x93\x04\x5d\x05\xef\xf9\x34\xb9\xac\xd6\x36\x1f\x6f\x5e\x34\x8a\xfe\x56\x1f\x7f\x1e\xdf\x35\x87\xdf\x53\xe0\xde\x71\x3f\x63\xd1\x45\xb8\x80\x04\xbd\xcd\x6f\x9f\xb2\xcf\xd5\xc9\x50\x86\xf7\x9a\xa4\xd8\x55\x20\xdf\xc6\xe1\xfc\x02\xc3\x22\x55\x38\xba\xf5\x36\x2e\x22\x65\x97\xab\xd3\xa1\x88\xf4\x9a\x54\xb8\xaf\x00\xbe\x88\x17\x88\xc6\x8d\x8b\x83\x17\xf1\xea\x42\x31\x87\xeb\x9a\x03\x7f\xa0\x17\x56\x12\xa7\x69\xe5\xd0\x77\x9f\xdc\xdf\xb8\x24\x10\x1d\xae\x3e\xfa\x3c\xc2\x6b\x8e\xff\xa1\x16\xac\xf3\xf1\x79\x1c\x56\x53\xa0\xfb\x64\xe3\x4a\x92\xec\x72\x75\x1a\x14\x91\x5e\x93\x0a\x8f\xd0\xbe\xc1\x12\xb1\x9e\x58\xf2\x7d\x12\x54\x9f\x38\x9f\x6c\xfe\x3c\xa1\x3b\x5d\x9d\x12\x65\x88\xaf\x49\x8b\xc7\x0e\xc8\x77\x6c\x10\x4c\xd3\x83\x59\xb0\x80\x33\x1e\x6c\x5c\x65\xca\x75\xbd\x3a\x5d\xaa\x07\xb1\x26\x75\x9e\x38\x80\x0f\xc4\x16\x74\x03\x71\x36\xbe\x7f\xba\x3d\xaf\x4e\x9b\xca\x21\xac\x69\xbb\xea\x68\xb8\x41\xb5\x3a\xb1\xbb\x79\x03\xde\xdb\x60\x75\x4d\x22\x87\xec\x9a\x23\xef\x2a\x60\xef\xd8\x80\x55\xeb\xd3\xbb\x9b\x37\x56\x61\x87\xab\x8f\x3e\x8f\xf0\x9a\xe3\xef\x59\xe0\x02\x16\x7e\xbb\x90\x06\x1b\xdf\x46\x74\xa7\xab\xd3\xa1\x0c\xf1\x35\x69\xb1\x7b\x7a\xea\xab\x3b\xa0\xd3\x6f\x93\x69\x3a\x5a\x40\x8b\x8d\xdb\x70\xb1\xc3\xd5\xe9\x50\x86\xf4\x9a\x74\xb8\x6f\x83\xd4\x0f\x06\x5e\x05\xd1\x22\xd9\xf0\x05\xce\x1a\x56\xc7\xab\xd3\x65\xd1\x20\xd6\xa4\xcf\x83\x52\xd0\x8b\xd4\xef\xdd\x27\x1b\xdf\x67\xed\x7e\x57\xa7\xce\x82\x21\xac\x49\x9c\x87\xa5\x90\x0f\x12\xce\x16\x50\x67\xe3\x67\x75\xa7\xe3\xd5\xc9\xb3\x68\x10\x6b\xd2\xe7\x91\x0d\x5a\x5f\x39\x2f\x54\x44\xee\x77\x36\xce\x3d\x4e\xc7\xab\xd3\x67\xd1\x20\xd6\xa4\xcf\xe3\x52\xd0\x8b\xf5\xfa\xfb\x1b\x17\x3e\x4e\xc7\xab\xd3\x67\xd1\x20\xd6\xa4\xcf\x13\x1b\xf4\x42\x99\xdc\xeb\x6d\x5c\x5f\xbb\x9d\x28\x2e\x41\x79\xcd\x6b\xc6\x8e\x0d\x71\xa1\x6c\xe9\xf5\x36\xae\xb8\xdd\x4a\xa4\x94\xa1\xbc\x26\x11\xba\xce\xce\xbf\x40\x71\xeb\xf5\x36\xae\xb8\xdd\x46\x65\x2b\x41\x78\x4d\x0a\xf4\x6c\x80\xef\x7d\x96\x65\x0b\x6e\x13\x7b\xbd\x8d\xab\x6c\xb2\xcb\xd5\x29\x51\x8e\xf8\x9a\xd4\x70\x34\xc1\x7f\x2c\xdc\x51\x1e\x6f\xdc\x24\xf6\x8f\x5b\x6d\x24\xa5\x38\xaf\x49\x06\x47\xf1\xfb\x65\x31\x19\x36\x6e\x16\xfe\xe5\x76\x64\x28\xc3\x79\x4d\x32\x38\x1a\xde\x7f\xdc\x60\xe8\xd8\xb8\xfe\xf5\x1f\xb7\xa3\x43\x19\xd2\x6b\xd2\xc1\x51\xe5\xf0\x71\xef\x22\x51\xd9\xed\x6c\x5c\x48\xa8\x3e\x57\xa7\x46\x05\xea\x6b\x12\x44\xe8\x6e\x23\x96\x64\xa7\xda\xfb\x76\x81\x62\xb5\x71\xc6\xd0\x9d\xae\x4e\x8e\x32\xc4\xd7\xa4\xc5\x63\x05\xf2\x5b\x96\xdc\x44\x8a\x8d\x2b\x53\xaa\xcf\xd5\x29\x51\x82\xf6\x9a\x84\x78\xa2\x20\xbe\x0d\x6e\xe4\x89\xcd\x1b\xd1\x83\xdb\xb2\x44\x09\xda\x6b\xfa\x6d\x75\x14\xc4\x0f\x09\xe7\x63\x56\xed\xb4\xf5\xe4\xfe\xe6\x3d\x4f\xa8\xcb\xd5\x9d\xb6\x8a\x48\xaf\x49\x85\xae\x02\xf8\x9e\x45\x1f\xf9\x7c\x01\x11\x36\xaf\x53\x61\x8f\xab\xd3\xa0\x80\xf2\x9a\x24\xe8\x29\x78\x68\x67\xbd\x61\x4d\x6c\xfe\xa6\xc0\xf4\xba\x3a\x29\x4a\x51\x5f\x93\x1c\xbb\x9a\xbc\xa4\xad\xde\x44\x90\x8d\x6f\x1c\x76\xbf\xab\x93\xa4\x02\xfd\x35\x89\x72\x5f\x41\xd5\x2f\x19\x16\x50\x64\xe3\x2a\xb7\xee\x74\x75\x72\x94\x21\xbe\x26\x2d\x1e\x58\x4c\x47\xf6\xf8\x9b\x08\xb2\x71\xe5\xdb\xed\x79\x75\xaa\x54\x0e\x61\x4d\xd2\x3c\x54\x70\xf1\xc5\x44\xca\x07\x37\x51\x66\xe3\xaa\x86\xd3\xf1\xea\x84\xa9\x1a\x80\x45\x97\x2f\xfc\x2f\xf7\x54\xe3\xc9\x17\x7a\xaa\x71\xab\xf7\x15\x7e\x9c\xf0\xd3\xdf\xd2\x53\x9e\x3e\x3c\x1d\xb3\xac\xfa\xd2\xe8\xe1\xe3\xce\x6d\xdf\x70\x14\xfb\x38\x35\x0f\x5d\xca\x38\x21\xaa\xaf\x06\x8e\xde\xc3\x00\x4f\xc3\x20\xca\x20\x8a\x9b\xf8\x24\xbb\x0f\x1d\x41\x69\x7c\x61\xcb\xd3\x8c\x5e\xb2\xc0\x3e\x7c\xba\xde\xdb\xda\xa2\xe0\x57\xe5\x11\x82\x3e\x7f\xb6\x1a\x98\x07\xde\x8d\x86\xcc\x2e\x98\x40\xc4\xb2\xe0\x92\x7f\xef\x36\xdb\x2f\x7f\xfe\x8d\xcf\x90\x4a\xbf\x38\x6f\xdd\xe9\x61\x90\x7a\x83\x2c\xd0\x8b\xf3\xfd\xeb\xf7\xc9\x26\x4a\x98\x53\xc1\x79\x49\xae\xc2\x64\x97\x60\x4a\x19\xe1\x08\x25\x4f\x42\xc1\x07\x54\xd7\x7b\x5b\xd7\x79\x76\x7d\xdc\x59\x2b\x0c\x62\x39\x2b\x75\x1b\x7b\xe5\x5f\xf0\x32\xa5\xfc\xcb\xfd\xca\x2f\x0f\x2a\xbf\x3c\xac\xfc\xf2\xa8\xf2\xcb\xe3\xca\x2f\x4f\x2a\xbe\x3c\xea\x54\x8d\xe7\x51\xa7\x57\xf9\xa5\x6a\xa4\x8f\x3a\x55\x23\x7d\xd4\xa9\x1a\xe9\xa3\x4e\xd5\x48\x1f\x75\xaa\x46\xfa\xa8\x53\x35\xd2\x47\x68\x47\xa0\x29\x6e\xc9\x19\xae\xf4\xce\xea\x34\x5a\xaf\x59\x36\xda\x2b\xc8\xb9\xc7\xdd\xb5\x18\xa7\xdd\x86\x5e\xa7\xd5\x6b\xf5\x5a\xbb\x20\x3a\x68\x31\x3f\x4e\x47\xf5\x59\x03\x17\xf4\xdf\xe4\xa6\x52\x61\x2d\x15\xf3\x21\xaa\x85\xf1\x45\x77\x52\x75\x71\xd7\x7d\x20\x6b\xa5\xff\x44\x48\xd8\x8b\xf8\x9b\x4a\xff\x86\x1d\xaa\x72\xfc\xb1\xb7\xb5\x25\x3b\xae\xcb\xff\x6d\xbd\x87\x1d\x85\x4c\xeb\x3b\xd8\x86\x3b\x75\x6a\xb7\x85\x41\x82\x7f\x7a\x0c\xe7\xd3\x8b\x3e\x8c\xb2\x6c\x92\xf6\xdb\x6d\x3f\x1e\xf0\xd6\x45\x1c\x5f\x84\xbc\xe5\xc7\xe3\xf6\xa4\x7d\xf9\xb8\x1d\xa4\xe9\x94\xa7\x6d\x8a\xeb\xf4\x2c\x18\xec\xef\x3e\xe8\x3c\xd9\x02\xb8\x77\x8f\xba\x1e\x86\x71\x9c\x48\xb0\xf5\x37\x14\x62\xe3\xf5\xc1\x3f\x4e\x7f\x3a\x78\xf5\xe3\x61\xa3\x01\xfb\xfb\xf0\xa8\xdb\xa1\x0e\x3f\xc4\x09\x7c\x9b\xc4\x57\x29\x4f\xa8\x67\x8b\x74\x2f\xa3\x61\x10\x05\xd9\xbc\x01\xcd\xa7\xf0\x86\xbd\xa1\x2e\xfe\x96\xff\xb8\xbf\x0f\xea\xc7\x56\xc3\x83\xda\x6b\x99\x6b\x73\x0b\x00\xab\x5a\x81\x13\xd4\x94\xb8\xd1\xe5\xeb\x33\xd8\x87\x9d\x59\x03\xbe\x81\x2e\x3c\x13\x3d\x41\x1f\x66\xf0\x14\x9e\xdc\x7f\xd2\x79\xd8\x7b\xf8\xa0\xf5\xb0\x77\xbf\xf7\xa0\xfb\xe0\xa1\x14\x67\xcf\x08\xcb\x30\xbe\x10\xb0\x76\xe8\xd7\xab\x37\x3d\xf9\xb9\x4f\xd3\x58\x9f\x41\x13\xba\xb0\x83\xd3\x45\x3f\x1a\xb0\xad\x7e\xed\x40\x97\x42\x69\x5c\x53\xa8\xd4\x3c\x33\xf6\xd6\x62\x46\xc1\x0f\x2c\xd2\x3b\x48\xb9\x50\xdb\x95\xec\xf4\xf2\xf0\xf1\xe9\x8b\xa3\xd7\xa7\x2f\x0e\xbf\x7b\xf9\xe6\xb0\xb2\xfa\x7d\x59\x3d\x8b\xdf\x26\xc1\x38\x10\x62\xba\xb2\xee\x43\x59\x77\xf0\xd6\xec\x32\xee\x93\x4c\xeb\x11\xe9\xb0\x72\xad\xf6\x1a\x26\xfa\x9d\xdb\x1c\xfa\x15\xb1\x63\xe7\xf5\x23\x0f\xde\x7a\x70\x90\xc9\xa0\x6a\x32\x5e\x88\xa2\x46\xfd\x08\xa9\x2e\xf0\xb2\x06\x52\x7f\xeb\xe1\xbb\x4f\xfc\xa6\xab\x5a\x30\x44\xb9\xd8\xe3\x5c\x5a\x35\x20\x4b\xe6\x2e\x33\x0d\xde\x16\x11\xc0\x69\x06\x9f\x61\xc2\x19\xcc\xcb\x27\x36\xff\xf1\x24\x9b\x0b\x6d\xe4\x5a\x82\xae\x5d\xf0\xac\x06\x41\x64\xb5\x14\x3b\x7b\x2d\x2d\x14\x37\x64\x14\x45\x13\x41\xb1\x76\xe0\xfb\x3c\x4d\xe3\x24\xc5\xb8\x88\xe9\x74\x22\x48\xcb\x07\x77\x6a\x1a\x73\xf9\x88\x39\x0f\xe9\xe8\xf8\xed\x09\xec\x5b\x45\x14\x61\x68\xcf\xe4\x93\x3d\xa2\xc0\xee\x79\x06\xdd\x5d\x9b\x41\x83\x74\x21\x83\x76\xd1\x8d\xa3\x20\xd5\x8d\x06\x12\x48\xed\x03\x55\x23\x05\x4c\x94\x16\xe9\x13\x64\xb0\x03\x35\x08\x88\x3c\x4c\xa9\x22\x92\x3c\x72\xa0\x41\x56\x3e\xd2\xfb\x6b\x8d\xb4\x30\x80\x3b\x95\xbc\x7e\xef\x5e\xc5\xc7\xdd\xdd\x46\xdd\x09\x9c\x6c\xcd\xce\x0d\xef\x9d\xed\x55\xf9\xa0\x51\xc7\x94\x2a\x42\x4a\x32\x4c\x47\x7c\xc1\xb3\x7e\x2e\x24\xb3\x84\xfb\x08\x63\xa1\x36\x5a\x0c\xee\xec\xc3\xa3\xbd\x72\x21\xb5\x5e\x96\xed\xa5\x79\x00\x25\x49\xec\x63\x00\xa2\xaa\x8a\x8f\x9f\x34\x5a\xaa\xce\x1e\x06\x78\xa4\xb8\xa0\xaa\xcc\x7d\xff\x2f\x38\xa1\x46\x3c\x80\x2b\x22\x0e\x07\xf0\xf2\x50\x62\x04\xfb\x1a\xad\xba\x6a\x8e\x93\x53\x28\x75\x81\x2e\xc7\xad\x8a\xd9\x52\x78\x56\x81\x1c\x56\xed\xa3\xda\x5f\xc6\x8e\xeb\xa5\x39\x6e\xb7\xe1\x51\xab\xdb\xea\xc2\x07\x4b\xfa\x05\xd1\x64\x9a\xc1\xb1\x07\x6f\x13\x3e\xe4\x49\xc2\x07\x62\xe9\x9c\x34\x96\x9f\xa2\x76\x1b\xe3\xf1\x72\x36\x50\x01\x1c\x0f\xdf\x3f\x84\x74\xc2\x7d\x15\x09\xd3\x83\x2b\x0e\x83\x60\x10\xd5\x32\x0c\x4a\x49\xf3\xf0\xaf\xff\x6a\x6f\x27\x3e\x93\x71\x1d\xa3\x01\xe5\x91\xc1\x58\x42\x3a\xf8\x14\x34\x61\x18\xb2\x0b\x68\xc2\x44\xe1\x89\xd3\x2c\x88\xc9\x80\xc2\xb2\x2f\x9e\x02\x0f\xde\x57\xca\x0c\x4b\x0a\xd0\xa1\x69\x18\x61\x00\x0c\x25\x40\xdf\x0b\x16\x90\x5c\x55\x1f\x46\x82\x4b\xb2\x56\x16\xbf\xc7\x6e\x51\x0d\xa9\xa9\xae\x6a\xb8\x94\x35\xf8\x4b\x16\x0a\x3c\x22\x3a\xc7\x88\xce\x74\x6f\x16\xfc\x3c\x68\x94\xc3\x47\xc3\x0d\x40\xbe\xf3\x25\x51\xcf\x8b\xda\xbb\xcf\x99\x98\x62\x3f\x8e\x2e\x79\x92\x49\x41\x0b\x59\x0c\x13\x3d\xcd\x14\x29\xbd\x51\xce\xde\xcb\x44\xb1\x2f\x17\xac\x66\xa2\xcf\x83\x6c\xcc\x26\x26\x0f\xee\x56\x2e\x93\x90\x1d\xb4\xf7\x8e\xac\x0d\xf7\xa0\x2b\x43\x89\xb8\x01\x7b\xad\x0a\x3d\x59\xc1\x44\xf8\xb5\x3e\xde\x97\x1f\xed\xb0\x7a\x5b\x3a\x2f\x4a\x7e\x98\x0b\xe3\x5f\x2c\x25\x3a\x29\x57\xfd\x02\x79\x48\x82\x73\x14\x0c\xaa\xf4\xb4\xdd\xae\xd2\xe9\x46\xac\x32\xbc\xb8\x06\xf4\xfe\xdd\xf3\xaa\x3a\x4f\x3a\x8d\x7a\x2d\x4d\xfc\x9a\xac\xfa\xe1\xe8\xf4\xfd\x87\x77\x2f\xdf\x7c\x0f\xfb\x50\x53\x7c\x56\x93\xc7\x14\xf5\x1b\xf6\xe1\x3b\x39\xf0\x63\xdd\xe0\x44\x02\x78\xfb\x0a\xf6\xa1\x5e\xab\x89\xd3\x8a\x66\xd4\x56\x3a\x09\x83\xac\xae\x2b\x8b\x2d\xa9\xf2\x90\x17\x44\x42\xfa\x64\xef\xe3\x69\xe2\xf3\x45\x92\x58\xc3\xd7\x3c\x4e\x33\x56\x5f\xc0\x60\x47\x26\xd1\xb2\x07\x29\x1b\x72\x63\x6a\x09\x52\x35\x2a\xa1\x62\xd2\x9a\xc3\x55\x64\x2f\x32\xb5\x32\x4d\x65\x8c\xfa\x5d\x47\x78\xb5\x88\x8d\x79\x0d\xe3\xcf\x89\xc9\xb3\x0b\xb1\x5b\xad\xd2\x1d\xc9\xbc\xca\xfb\x98\x59\x59\x2d\xcc\x85\xb0\xdf\xbf\x7b\x9e\x03\xfc\xfe\xdd\x73\x0f\x24\xa4\x67\x80\x14\x97\xbf\xfa\x62\x1a\x5a\xbf\xc5\x41\x54\x27\x02\xd5\x45\xe7\x0d\xd3\x3d\xf6\x4c\x6c\xa8\x8e\x54\x47\x56\xaa\x67\x52\x7b\x31\x0b\x34\xc5\x47\xd7\x74\x02\x18\xf0\x90\x67\x5c\x56\x27\x3b\x10\xa2\x64\x11\xb6\x91\x6b\x4f\x75\x6f\xe8\xe8\xd3\x02\x50\xb8\xb3\x0c\x06\x30\x64\x1f\xb9\x66\xbd\x7f\xd1\xec\x38\x8c\x13\xf0\xe3\x24\x11\xe2\xea\x2a\x4e\x3e\xc2\x55\xc2\x26\x13\x3e\x80\x31\xcf\x46\xf1\x20\x85\xb6\x1d\x0c\x3c\xa5\xe8\xbd\xea\x5b\x18\x7c\xe4\xf0\x2a\x7e\xc1\xd2\x11\x04\xe9\x1b\x34\x62\x6d\x5d\x37\xea\xaa\x1b\x3b\xa8\xb8\xe6\x5f\x2b\x1e\xab\xc2\xc2\x55\xee\x24\xfb\x60\xd8\xf8\x82\x90\x16\xa5\xc7\xef\xdf\x3d\x3f\x11\xf3\x99\x63\x62\xf1\xad\x51\xa1\xb4\x2d\x34\xe7\xda\x02\x56\x0a\x86\xa3\xab\x48\x9f\xba\xf6\xe1\xd3\x75\xcb\x2d\xbb\x41\xe9\x21\x8e\xb5\x07\xe5\x36\x57\x8b\x4e\x71\x76\x89\xac\x7c\xb2\x8c\x45\xcf\x68\x94\x03\xcc\x0f\x82\x7f\x4f\x66\xca\x1c\x92\xb0\x68\x10\x8f\xeb\x8b\x55\xb4\x3c\xa6\x35\x7a\x36\x57\xaf\xb5\xfc\x38\xf2\x59\x86\xa9\xd4\x05\xcf\x4f\x55\x04\x48\x5a\x31\x7d\x62\xb4\x5a\xe3\xb4\xe6\x41\x7d\x67\x27\x18\xc0\x0e\x4c\x66\x0d\xbd\xc5\xd6\x77\x1f\x36\x2a\xc6\xb6\xb6\xd1\x89\x42\x8f\xb3\x10\xda\x90\xa2\x5e\x45\x99\xb5\x66\x19\xc8\xfb\x0b\x32\x06\x58\x42\xa9\x5c\x84\xf7\x16\xd3\x46\x28\x43\xd9\x88\x65\x1e\x50\xba\x15\x79\xaa\x56\x60\xeb\xc3\x48\xcb\x05\x0c\x5c\xee\x90\x49\xeb\x0c\x43\x94\x4e\x2a\xf7\xaa\x0d\x49\x66\xc9\xec\xf6\x8b\x69\x4d\x58\xc1\x90\xac\xf4\x11\x42\x88\xa9\x90\xa4\x7b\x06\x4e\xaf\x0c\x8e\x07\xe7\x37\x81\x12\x55\x8a\xd0\x76\x2b\xa0\x79\xe0\x2f\x01\x50\xd4\xb2\x60\x5e\x1b\x06\x33\xd0\xda\xdb\xd0\x6a\xb5\x58\x72\x91\xc2\x76\x3b\x67\x9f\x1a\x46\x3a\x14\x2b\x82\xd4\xa1\x58\xf7\x2a\xd5\x8b\x27\xcb\x98\x8f\x6e\xd2\xa2\xec\xf3\xb5\x94\x44\x41\x26\x8e\x83\x46\x0e\xdd\x78\xd2\xd6\xe0\x96\x3a\x6a\x3f\x59\xcf\xa8\x60\x4c\xb0\x0f\xa4\x1d\x31\x0d\xa2\x55\x4d\xb0\x7f\xc3\x46\xda\x8c\x2a\x7e\xd8\xe9\x50\x14\x48\x5b\x4e\xdc\x09\xd2\xef\x82\x28\xc8\xb8\xb6\x24\x7e\xfe\x0c\x33\x21\xb1\x3b\xf0\x0c\x66\x68\x4d\xfc\x06\xff\x6e\x52\xf3\xe6\x4c\x1c\xf0\x8c\x11\x51\xd9\x10\xa5\x6d\x70\x1b\xb4\x7d\xf0\x1a\x47\x55\x61\x25\x45\x58\x1d\x34\x8f\x36\x3b\x4b\x59\x7a\x71\x68\xf7\xee\x41\x17\xda\x72\xa0\xa2\xfd\x53\xe8\xd8\x86\x53\x1a\x63\x9f\xfe\x07\xca\xf6\x90\x27\xeb\x99\x44\xcc\x3c\x3d\x92\x23\xc9\xd8\x2d\xe6\x49\x34\xd2\xf3\x24\x7e\xec\x2d\x22\x16\x76\xd1\x24\x6a\x2d\x47\x2c\x84\xaf\x89\xa5\xdb\x7f\xe3\x52\x4b\x48\x41\xf1\xcd\x36\x33\xcb\xe1\x54\x98\x99\x2d\xbe\xd0\x2c\x50\xef\xc2\x0e\xcc\x1a\xd0\x86\x7a\x17\x9a\x30\x6b\x88\x3f\x7b\xd5\xf6\xe1\x27\xeb\x99\x5e\xcc\x0c\x3c\x21\x1c\xfc\x73\xc1\x79\x2b\x4d\x40\x1a\x5c\x54\xed\x26\x5d\xbc\x16\x2b\x12\xd9\x25\x9b\xe8\xd3\xa2\x9a\x44\xc1\x25\x9a\xe8\x44\x13\x6e\x9b\x70\x9d\xc4\x57\x75\x9a\xd3\xf3\xb4\x3e\x6b\x78\x38\x41\xbb\x0b\x8c\xe9\x4f\xd6\x36\x99\x48\x62\x75\xbb\x92\x5a\xe1\xef\xbb\xbd\x15\xc8\x75\x23\x25\x04\x3c\x9b\x14\x12\x7e\x81\x81\x9e\x3e\x7d\xba\x0f\x9d\x06\x3c\x83\x5d\xc1\x26\xd6\x75\x8b\x23\x4c\x3a\xad\x07\x9a\x5a\xaf\x8e\xbe\xef\x1d\x0a\x71\xb3\xbb\x88\x9d\xd6\xcb\x1d\x67\x51\xa8\x27\x29\xb4\xfa\xdd\x17\x9f\x4d\xd4\x6a\xe6\xb3\xc9\x12\x44\x73\xef\x76\xca\xaf\x76\xf8\x6c\xa2\xd9\x67\x47\x74\x21\x64\xef\x4d\x6b\x6b\xbd\xb3\xb9\x45\x8c\xfb\x7a\x38\xe3\xee\xaa\xe2\x0d\x1b\x55\xae\xaf\xfb\xa5\x5c\x95\x13\x62\x75\x09\xe4\xce\xbe\x85\x87\x23\xe9\xb1\xa4\xaf\x3a\x2b\x25\xc6\x32\xc7\x85\xa5\x88\xf1\x50\xb2\x2b\x26\x45\xde\xd4\xe2\x01\x02\xd7\xaf\x88\xc3\xd2\x69\x94\x0d\xea\x51\x67\x3d\x1f\x81\x9b\x06\x75\xa3\x64\xc4\xb3\x49\x7c\xa5\xd8\x7d\x12\x5f\x51\xd9\xe1\xdb\xf7\x2f\x5f\x1d\xbd\x81\x7d\xf1\xb5\xde\xf3\xa0\x89\xbe\x8e\xd6\xa7\xdd\x9e\xf5\xb1\xa7\x60\xbd\x3e\xf8\x87\xfd\xa1\xdb\x7b\x24\x96\x7f\xbd\x07\x4d\xd3\x4e\x55\x7d\xe9\xc2\xe8\xe2\xbb\x35\xfc\x84\x63\xf8\x10\xf0\xf4\x43\x7c\x78\xc9\xdd\x74\xbc\x91\xa3\xf0\x44\x42\x3d\x81\xb6\xc6\xb7\x69\xff\x22\xcd\xae\xa0\x57\x5a\x74\xc2\xcc\x8a\x0a\xb4\x26\x9d\xb6\xa0\xfc\x8d\x9d\xeb\x06\x24\xe2\x95\x45\xf6\x6f\x92\xb2\xb4\x2b\xe8\x62\xe6\x41\xc2\xd3\x69\x98\xa9\x13\x08\x42\xf8\x86\xc6\xaa\xcf\x1e\xd4\x78\x3b\x3f\x4c\xaa\xdc\x96\x84\x69\x5b\x04\x13\x12\x14\x0b\xb7\x4d\x21\xde\x0f\xc2\x3e\xe0\x7e\x6d\xe6\x44\x37\x13\x8d\x04\x40\xd2\x75\x53\x72\x19\x62\xd0\x84\xba\xf8\x8f\xf8\x82\x58\xb7\xdb\xd2\xf9\xa7\x39\x08\x52\x76\x1e\xf2\x66\xc4\x67\x59\x33\x0c\x22\x0e\x51\xdc\x4c\x79\x38\x6c\xfa\xf1\x78\xc2\x12\x2e\x87\x24\x81\x3d\x95\x73\xfd\xf9\xb3\x02\x7f\x67\x5f\xfe\x55\x18\xa8\xba\x15\xb7\xf4\x6e\x4d\x03\x49\xae\xa2\x0e\xfe\xa8\xb3\x29\x37\x88\xae\x54\xee\x46\xf3\x49\x9c\xd5\x8f\xd1\x1e\xda\x3d\x96\x46\xd9\xde\xb1\x07\xff\xf5\x9f\xff\x2f\x9c\x9c\x9c\xac\x24\x16\x5d\xd6\xb8\x79\x93\xc0\xce\xad\x5d\x82\x90\x21\x5c\x14\x2a\x78\x21\x5b\x98\x10\x35\x17\xd3\x68\x9a\xf2\x41\xf3\x92\x25\xa9\x34\xef\x26\x90\x4e\xc7\x64\x64\x50\x05\x81\xfb\x93\xbd\xc2\xe5\xa3\x4f\x6a\x2a\x45\xa9\xae\x10\xb2\xe4\x22\xd7\x24\xb9\xf0\x60\x10\x5c\x52\xc9\xd5\x28\x08\x39\xd4\x03\xf8\x06\x61\x99\x43\x26\xb5\x13\xab\x42\x03\x3f\x0e\x76\x76\x4c\x5e\x09\xc1\x2b\x08\xfd\x1b\x51\xd7\x4e\x11\x31\x08\x2e\x61\x9f\x7a\x6e\x8b\x6f\x26\x02\x35\x0d\x47\xfc\x77\x1b\x6b\xd1\x7f\x77\xa0\x6b\xaa\x48\x84\xad\x66\x96\x65\x4e\x7c\x13\x67\x88\x42\x67\xd4\x57\x58\xe8\x6c\x67\xdf\xf4\x93\x83\x27\x3f\xeb\x26\xd7\xf6\x76\x4e\x58\x58\x0e\x1f\xf0\xcc\xfc\xd9\xa7\xcf\xdb\xd6\x51\x2a\x9d\x8e\xab\xd5\xc2\x47\x9d\xf5\x7c\x2c\x2c\x4e\x7f\x4c\x7d\x06\xe3\x69\x58\x9f\x79\x30\x5f\x6d\xa7\x17\xcd\x14\x53\x8b\xbf\xe9\x18\x93\xc6\x63\x0e\x3f\xf3\xf3\x7f\x0f\x32\x75\x85\x96\xc2\x90\x05\xa1\xb4\x3c\x9e\x07\x17\x40\xf9\x6b\x52\x8f\x2a\x8f\x58\x0a\x57\x49\x1c\x5d\x00\x4b\x82\x6c\x7e\xa3\x7a\xb0\xea\x55\x33\x22\x5a\xef\xcc\x86\xf2\x9f\x07\x0f\x1a\x42\xfc\x34\x1f\xa0\x05\x52\x7c\x95\x8c\x2e\x4a\x7b\x7b\x5b\xd7\xb9\x73\x92\xa8\x61\xad\x45\x43\x2e\x9d\x3f\x38\x81\x1f\x5f\xbe\xf9\xd0\x7d\x28\xd6\x06\xf6\x63\x16\xc8\x2c\x42\x35\xce\x14\xcc\xb1\x60\x6e\xd5\x10\x54\x94\xed\xef\xc1\x2c\xb2\xaa\x3a\x5f\xe6\xf2\x8b\x1c\x56\x07\x3e\x8b\xa6\xdb\xa2\xd6\x0e\xd4\xeb\x16\x04\xa1\x6f\x43\xf7\x61\x43\x7d\xc4\x6a\x75\x0b\x90\xae\xf0\xcd\x37\xd0\x7d\x88\xbf\x3a\x8b\x38\x6e\x53\xf6\x8d\x5e\x57\x1f\x1d\xbb\x9d\x0d\x1e\x44\x10\x9e\x35\x45\x0a\xbe\xab\x55\xdb\xde\x4f\xe6\x94\xd1\xed\x1c\x2e\x18\xf9\xa6\x2c\x06\xbd\x8e\x19\xf9\x64\x63\x5a\x24\x42\x2b\x57\x22\x77\xbb\x0f\x2a\x94\xc8\x4d\x1d\xc1\x7b\x3d\x3d\xa4\x4d\x1e\x2a\x05\x38\x77\x2a\x8b\x47\x4a\x7b\x26\xdb\xda\x8f\x6d\xc1\x34\x6e\xea\x24\xdd\x93\x22\x53\x6a\x72\x9b\x99\x45\x01\xac\x7c\x12\x85\xda\x5d\x3e\x89\x9b\x3a\xf8\xee\x76\xd4\x80\x56\xb6\x64\xdd\x7c\xd2\x2b\x3d\x1e\x93\xbb\x66\xc4\x31\x41\x64\x12\x8f\x83\xe9\x18\x76\x1f\xe3\x2e\xc0\x60\x92\xc4\xe7\x21\x1f\xd3\x56\x71\xc9\x93\x39\xa4\x63\x16\x86\x6a\xc7\xd8\xf8\xde\x70\xc7\x0c\xbe\xd9\xe3\xcd\xee\x23\xda\x19\xf0\xcf\xe2\x46\x40\xf6\x45\x93\xf0\x2b\x28\x31\x97\x19\xf5\xdf\x78\x67\x6a\xff\xcb\xba\x3a\x52\x43\x93\xc8\xa7\x8f\xf5\xda\x07\x53\x1e\xfd\xd1\xeb\xb2\x29\x4f\xfe\xf8\x0b\x8f\x46\x08\xfd\x50\x34\x58\x24\xae\x37\x65\x08\xd8\x95\x2e\xc1\xb7\x30\x73\xde\x92\x39\x6e\x90\x0d\x39\x83\xa5\x6b\xaf\x44\x75\x14\xf6\x25\x61\x25\xf9\xcd\x66\x7a\xae\x3f\x35\x55\xb1\x9c\x32\x06\xae\x6a\xd6\x85\xbe\xa8\xed\x94\x35\x45\x21\x1e\x86\xce\xd1\xda\x89\xb3\x64\xdb\x66\x16\x4c\xc7\xa6\x4c\x11\xbb\xd2\x2e\x93\x25\xd3\xc8\xdf\xa0\xc4\x45\x78\x36\x59\x11\x7e\x90\xe5\x8d\x52\x81\x38\xc7\x75\x94\x1b\x31\xda\xef\x94\x2d\xd8\xe7\x41\xd8\x20\x1f\x84\x2a\x32\x74\xd7\x33\x5e\x90\x8f\x02\xb9\x65\x57\xf2\xd5\x43\x99\xb1\x65\x0b\xb6\x01\x53\x0f\xa6\x42\xd1\x3f\xc3\xf3\xd2\x19\x04\x29\x9c\xbd\x61\x6f\xce\x5a\x5b\x80\x35\xb6\xb7\xdf\xc4\x19\xef\x6f\x6f\x53\xae\x68\xba\x13\x17\xb5\xce\x59\xca\x07\x10\x47\xa2\xd2\xf1\xd9\x1b\x95\x6d\x51\xb4\x3d\xa9\x2b\x1f\xf3\xf1\x20\x6a\x05\x71\x9b\xbe\xb6\xf1\x6b\x03\x3d\xc0\xe4\x1d\x12\x3a\x82\xb1\x31\x07\x96\x0a\x38\xd2\xed\xe5\xf8\xac\x02\x8e\x04\x70\x35\x0a\xfc\x91\xa4\x78\x0a\x67\x59\x22\x10\x1f\xc6\x89\x00\x71\xa6\x2f\x26\xcf\xb0\xa3\x18\x93\x3d\x47\x71\xd4\x24\xf1\x28\xd3\x1e\xa9\xe1\xfd\x6b\x9a\xb1\x2c\xf0\xf1\xcf\x31\x17\x15\x8e\x86\x70\x4a\x5f\x82\xc8\xe7\xd0\x69\x75\x5b\x1d\xfc\xed\xb3\x8c\x5f\xc4\xc9\x1c\x5e\xb1\xe8\x02\x4b\x26\x2c\x61\x63\xf8\xb4\x7d\x2d\xf3\x6c\x7e\x18\x49\xff\x27\xc8\x62\xf0\x05\x69\x5b\x58\x4f\x61\xfa\xe9\x3c\x8e\x43\xce\xa2\x6b\x78\xe7\xe2\x5e\x42\x7f\x8f\x8e\x4c\x67\x98\x08\xe9\x8c\xe0\xf0\x19\x1b\x4f\x42\x2e\x51\x3f\x25\x6a\xd7\x05\x49\xf6\x44\x41\xbb\x0d\xfb\x4f\xd1\xd5\x39\x57\x23\xe2\x57\x40\x53\x80\x95\x2b\x6a\x53\x5d\x73\xaf\xbb\x18\x66\x69\x3d\x44\x76\x4b\xb0\xb0\x39\x08\x60\x6d\xcb\x59\xab\xdd\x86\x83\x88\xc6\x68\xb9\x8d\x05\x94\x8a\x33\x8e\xc2\xb9\x22\x21\xa6\xc8\x26\x36\xe1\xff\x9c\xb2\x50\x10\x35\xc8\x52\x1e\x0e\x5b\x04\xe6\x2d\x4f\x86\x71\x32\xc6\x86\x67\xea\x3a\xfe\x03\xbb\x38\x23\xda\xc3\x30\x48\x52\xf4\x4e\x63\x97\x71\x30\x00\x9e\x24\xda\xb5\x43\x9c\xa9\x24\x2e\xbe\xe8\xff\x1f\xd2\x97\x2d\x85\x20\x82\x97\x87\x2d\xdb\x97\x53\x52\x4e\x0e\xe1\xde\x3d\x89\xdf\x9d\x7d\xd8\x91\xee\xd4\xd7\x25\x26\x31\x1c\x77\xc9\x02\x5f\x68\x81\xf9\xa3\x1f\xdc\x61\xfa\xa9\xea\x10\x1e\xb7\x7d\x63\x27\xc1\xae\xf5\xb0\x4e\xc2\xb8\x6d\x36\xa5\x49\x12\x4f\x4e\xb3\xf9\x84\x57\x07\x6b\xb9\xe5\x13\x42\x17\xf6\x1a\x63\x74\x01\xdd\x36\x57\x12\x66\x91\x8d\xd8\x78\xc1\x40\x7b\x9b\x80\xbd\xc6\x40\x5d\x40\xb7\xce\x87\x34\xcd\x82\xf0\xf4\xed\x34\xe1\xef\x30\x45\xea\x82\x20\x3c\x6b\x64\x1a\xba\x6d\x0a\xae\x15\x52\xf8\xdc\x32\xd4\xf8\x0a\x49\x6f\x90\x52\xef\xc4\x02\xfa\x31\x0b\x16\xf5\xa1\xee\x18\x4e\x29\x6d\x7d\x6a\x1e\xf4\xb0\x14\xad\xc9\xb6\x31\xbf\x9e\xb1\xe4\x82\x0b\x85\x07\xdd\xe9\xea\xca\x36\xda\xdd\x83\x80\x2c\x92\xae\x41\x14\x82\x9d\x9d\x06\xa6\x5e\x4b\x20\x55\x9e\x9a\x96\x65\xf3\x64\xcf\xc0\xf9\xc8\xe7\x42\xf2\x52\x35\xd1\x08\x9d\x02\x09\x15\xed\x5d\xd7\x2a\xf3\x2e\xa3\x26\xe4\x61\x26\x1a\x12\x92\xca\x81\x90\xbe\x92\x23\x22\x5c\xe3\xff\x29\xf7\x3b\xac\xb7\x07\xd7\xf2\x82\xc4\x4e\x76\xec\xdc\x8e\xe0\x78\x4b\x9f\x23\x05\x3c\x95\x34\xf1\x30\xa9\x7f\x5a\x20\x4d\x87\x48\x43\xc9\x15\x4b\xc8\x32\xe0\xa9\x9f\x04\x93\x0c\x53\xed\x62\x2d\x24\x8b\x29\x6e\x19\x6f\x66\xd8\xaf\x28\x17\x73\x24\xf6\x5d\xa7\x9d\xed\xe6\x0c\xfb\xb8\x81\xef\x21\x51\xef\x92\x83\xb6\xa0\xb6\xa9\xde\xb0\x9b\x2a\x07\x68\xdd\xac\xfc\x19\x8a\x1a\xb9\xd5\x12\x3d\xe5\x2c\xa8\x7b\x36\xc1\x0d\x45\xad\x1c\xd6\x48\xb8\x2c\xc6\x34\xcb\x1e\x90\x2e\xa6\x12\x41\x23\xba\xe6\x73\xa3\x48\x7c\x0b\x90\xed\x83\x69\xb5\xa1\x31\x3b\x70\x17\x41\x71\x51\xd8\xd3\x49\xca\x4d\x0d\xc1\x30\x70\x5d\x6f\x68\xae\x11\xfc\xe2\xc9\xff\xed\x79\x70\x9a\xf1\xf1\xc4\xf6\x29\x3a\xcd\x91\x2d\x3e\xff\xcd\xf8\xae\x4e\x35\xaf\xcb\x05\x10\x9f\xff\x26\x4a\xca\x29\x6e\x9a\xba\xf9\xdd\x3d\xc7\xe7\x9d\x32\xee\xbb\x6e\xee\x54\x66\x3c\xdb\x55\x1a\x44\xed\x59\x2b\x3a\xb6\x9c\x6e\xc5\xac\x5f\x5b\x2f\xbb\xf7\xe0\xda\x1e\x52\x2e\x73\x79\x10\xa5\x19\x8b\xc4\x22\xb4\x08\xa5\x06\x76\x47\x7f\x06\xf5\x47\x3c\x74\x2a\xe2\xaa\x45\x4f\x33\xa1\xa7\xba\x8f\x0d\x84\xf2\x27\x96\x39\x30\xc0\x4e\x01\x0d\x20\x0a\x93\xbb\xc4\x61\x36\x6a\xd5\x79\xd2\x85\xe2\xe8\x21\x30\x8d\x9a\x28\x72\x7b\xd7\x11\x6a\x25\x0a\xe8\x9d\x3b\x62\x69\x54\xcb\xe0\x9c\xf3\x08\xc4\x51\x37\x60\x61\x20\xce\x3e\x4d\x48\xa7\x13\xcc\xd5\x6d\xd7\x10\x3d\xf0\x01\xa1\x26\x29\x88\x23\xb8\x77\x4f\x7b\xda\xe1\xef\xfd\xfd\x7d\xb8\x4b\x5a\xe7\x5d\x7c\xe5\x9f\xff\x66\x46\x09\xcf\xa8\xb8\x0f\x02\xe3\xdc\x64\xe8\x1c\xf4\xe9\xf4\xfc\x39\x71\x23\xa2\x85\x7f\xab\xa1\x4a\xe0\xe6\x03\xdc\x71\xba\x10\xd8\xe5\x3e\x62\xf6\xde\xaa\xa9\x79\x2f\xea\x8a\xf3\x68\xc2\xd3\x54\xa0\x31\x9e\xa6\x19\xf0\x00\x0f\x5b\xe7\x1c\x1b\x43\x9c\x58\x73\xe5\xa1\x22\x7f\x17\x76\xa0\x80\x0b\x92\x4a\x61\x6f\x16\xb2\xd9\x8c\x48\x34\xd7\x2d\x04\x1d\x74\xed\xb5\xff\xc9\xf6\xe3\xee\x9b\x85\x62\x88\x63\xaf\x15\x94\x9b\xf9\x85\x51\xb6\x78\xf0\xbd\x9c\x14\x26\x16\x71\xcb\x43\x36\x3c\x2b\x2f\xaf\x98\x20\x83\x9b\x95\xbe\x7f\xdf\xaa\x82\xf3\x2d\xcf\xeb\xff\x3a\x0c\x42\x7e\x74\xc9\x93\xcb\x80\x5f\xc1\x0b\xa9\x92\x51\xa6\x45\xb1\xa8\x32\x1e\x65\x78\xfe\x52\xff\xf0\x71\xc7\xcb\xff\x38\x84\x7d\xf4\x11\xc2\x27\xc1\xcf\x8f\xde\x9c\x7e\xf8\xe5\xed\xe1\x7b\x54\x0b\x56\xd1\x23\x8e\xef\x9e\xdf\x85\xf6\x36\xbc\x3a\xfc\xfe\xf0\xcd\x0b\x09\x64\xbb\x7d\xd2\x1a\x06\x61\xc6\x13\xcb\x80\x28\x86\x5c\x70\x77\x47\xbe\xaa\x45\x71\xc4\x6b\xd2\x7f\x5d\xe0\x23\x47\x41\x83\x90\x63\xd0\x73\xbf\x40\xad\x2c\x53\x09\x8f\xef\x32\x44\x50\x29\xab\xdb\xed\x93\x46\x9d\xe4\x15\xec\x43\x1d\xa5\xb3\x18\x35\x89\x6b\x67\x9f\x3f\x35\x59\x78\x11\x6f\xb3\xb0\xca\x10\xf4\xe0\xd4\xc9\xda\x0b\x06\x52\x59\x75\x9d\xcf\x3f\x2f\x3b\x85\x80\xf1\x4a\x9b\xe4\x52\x06\x2f\x90\x6c\x04\xa3\x14\x4d\x8b\xa5\x3e\x7f\x2e\x0f\xfc\x51\xda\xae\xd1\xd0\x6e\xc9\x02\xb6\x71\x4b\x96\xb6\x2b\x41\x1f\x4b\x61\xaa\x20\xd1\x31\x8d\xf9\x23\xe6\x59\x4e\x70\x8a\x5e\xfa\x71\x54\xf3\xb6\x68\x68\xc8\xd4\xe2\xdf\x36\xd0\x04\xe2\x51\x7e\xc2\xb2\x11\xc4\x43\x08\xfc\x38\x52\x9f\x95\xa9\x85\x46\x70\x8d\xe9\x9b\xe1\x85\xf8\x4f\x3c\x04\xce\xfc\x11\x84\xb4\x06\x82\x8c\x8f\x75\x23\xf5\x2e\x8c\x2c\x03\xd7\xf0\x56\x40\xe6\xf4\x3a\x51\x56\x6a\xdb\xcf\xba\xf4\x14\x1a\x5c\xeb\xa2\x27\x73\xf9\x8d\x8a\x5d\xc4\xd0\x66\x40\xd9\xa0\xf7\xed\xfc\xd9\xce\x27\x39\x7f\xd4\x68\xc4\xc2\xe1\xfb\xe0\x77\x21\xd4\x70\x39\x4a\x27\x35\xed\x74\x10\xcc\xb2\x91\xfb\xfd\xa1\xfd\x3d\x1b\x05\xc9\xc0\xfd\xbe\x6b\x7f\xf7\x25\x2e\x02\x5b\x8d\x05\x3c\xcb\xe1\xda\xa7\xef\xbe\x83\x9d\x90\x69\x58\x4c\x32\x57\xac\xd0\x30\x88\x78\xcd\xbe\xf1\xbf\x31\xb0\x51\xe1\xcc\xdf\x62\xb9\x77\xaf\xb5\x89\xb1\xa5\x6a\x77\x01\x4c\xb9\xfd\x73\x30\xc8\x46\x7d\xb8\x6f\xa7\xfa\xa6\xb4\xdb\x24\x2a\xbc\x42\x8b\x3e\x8d\xd7\xfe\x30\xe8\x43\xed\x75\xc7\xab\xc1\x8e\x21\xf5\x0e\xd4\x46\xa2\xc0\x10\x6f\x07\x6a\xbf\x46\x60\xfd\x3b\x10\xdf\x0d\xf1\x77\xa0\xe6\x15\x4b\x3a\x5e\xd7\xeb\x62\x79\x0f\xb6\x5d\x68\x85\x0e\x5d\xf0\x3f\x88\xcf\x38\x5f\x3b\x50\x7b\x7d\x1b\x08\x2b\x22\x58\x0d\xda\x26\x16\xca\xa0\x37\x6c\xcc\x71\x59\x52\xae\xf4\x26\x2d\xa0\xa6\x58\x75\x35\x93\xbf\xbc\x51\xe2\x12\x92\xe3\x96\x84\xfb\xd9\x1f\xc7\x2d\x65\x5c\x41\xdc\xb2\x88\x27\xe4\x9a\x79\xac\x79\x42\x4d\xca\xa5\xfe\xb1\x0d\xbb\xd0\x86\xfb\xba\x46\x53\x55\xf9\xbd\xb6\x36\xed\xb6\xb6\x36\x46\x99\x55\x4c\x0b\x25\xbb\xa1\x4d\xd2\x52\xb2\xf9\xb3\x7e\x09\xcf\xf8\xf3\xb2\xd2\x34\xf8\x9d\xf7\x91\x7a\x6e\xd9\x07\x4a\xb7\x3f\x08\xd8\x98\x67\x3c\xb1\xe8\x47\x89\xf8\x35\x03\x6d\xb9\x94\xba\x2e\x6c\x0b\x2f\x12\x76\x85\x32\x3d\x15\x82\x9e\xc8\x5c\x10\xef\xa8\xa1\x48\xfa\x5c\xc3\x4b\x51\x5b\x4b\x77\xb1\x5b\xa9\x31\x3b\xfb\x90\xa8\x55\xf3\x16\x49\x7f\x51\xa3\xee\x8a\xfe\x53\x21\xeb\x7b\x52\xe6\x3b\xf2\x1d\x6d\x79\xa9\xb3\x1b\xd8\x5c\x33\x61\xf3\x30\x66\x03\xa1\x7a\xd0\x4e\x21\x0b\xec\x3a\x82\x7b\xa4\x88\x97\x95\x54\x89\x5d\x2b\x64\xf3\x78\x9a\x99\x3a\xf4\xdb\x59\x0d\x71\x32\xc6\xd0\x8c\xa6\x92\x2e\x72\x70\x16\x3a\xe4\xb7\xf1\x0c\xf6\xe1\x13\xcc\xfa\xd0\xf1\x60\x8e\xff\xbd\x22\x81\x8c\xf3\x0a\x23\x1e\x5c\x8c\x32\xfa\xa5\xde\x4d\xc9\x7d\x30\xe3\xe3\xf7\xd9\x1c\x0d\x05\xb6\x73\x58\x3a\x09\xd9\xbc\xaf\x11\x15\x22\x62\x14\x27\xc1\xef\x71\x94\xb1\xb0\x06\xcf\xa0\x16\x44\x62\x87\x69\x9e\x87\xb1\xff\xb1\x06\x7d\xa8\xd1\x5f\x66\x10\x63\x96\x5c\x04\xd1\x3b\xea\x19\xc3\x09\x81\x79\xb5\x25\x77\xcc\xcb\x0b\xdd\xb9\xe9\xd4\x05\xed\xc1\xa5\x38\xe3\xfb\x2c\x3c\x08\xd1\x7d\xa0\x36\x0e\x06\x83\x90\xd7\x3c\xb7\x87\xfb\x68\x05\x72\x96\xa8\x9c\x9f\xd6\x98\x4d\x2c\xad\x96\x47\x59\x32\xf7\x20\xb0\xa5\x9d\x31\x03\x08\xa9\x60\xb8\x42\xc6\x19\x08\x22\x16\x7e\x67\xcd\x08\x82\x30\x13\x82\xd6\x1b\x33\x3b\x76\x53\x0d\x73\xa1\x9a\x5e\x6e\xa5\xad\x37\xea\x75\x0b\x29\x67\x86\xa0\x44\x70\x65\x7c\x5c\xeb\xcb\x6b\x1e\xf9\xef\xda\x2b\xd8\x2e\x2c\x88\x1e\xd4\xac\xb6\x4d\x21\x30\x03\x19\x66\xe7\xa6\x76\x4a\x27\xa9\x79\x92\x18\xaa\xa0\xe1\xd9\x84\x6c\x34\x2c\x52\x8a\x6d\x87\x2a\x9b\x7d\x07\xb7\x81\x86\x33\x30\xe5\xc2\x3c\x0d\x43\x43\xcb\xeb\xad\x4d\xee\x4c\x36\x19\xc3\xc0\xd9\x1a\x94\x15\xb5\x6e\xa3\xe4\xec\x18\xfa\x4f\xcf\xa9\x91\x0a\x46\xee\x9b\x05\xe5\x7e\x25\xb1\x55\xa0\xb6\x55\xe7\xda\xbb\xf9\xb4\x54\x7e\x9c\x1b\xe2\xfe\x40\xa7\xb7\xc3\x4b\xa1\xe1\x1f\x0d\x9f\x8f\x82\x70\x20\x4f\x4e\x28\xef\xa4\x38\x03\xcd\xfd\x0d\x67\xd4\x9b\x21\xe6\x22\x40\xe5\x96\xf9\xb2\xdd\xcd\x01\xf8\x49\x49\x32\x2d\x47\xb5\x34\x33\x25\x52\x08\xf6\xd5\x1f\x9e\x9a\x0d\x2d\x60\xae\x5d\xa8\x92\x26\xd6\x11\x01\xe9\xd2\xb0\x2a\x7d\x19\xfa\xd4\xd2\x09\x8b\x6a\xf9\x21\x2e\xd4\x47\x04\xb3\x64\x7c\x96\xd5\xf2\x83\xc8\x89\xa5\x67\xb9\x02\xb9\xd6\xb4\x75\x51\x49\xbd\x3e\x58\x1f\xec\x01\xeb\xbf\x8d\xce\xd3\x30\x3e\xbe\xa5\x3b\xf0\xc2\xcd\x37\xbf\xef\x22\x07\xf6\x96\xde\x5e\x7b\x65\xfb\x6b\x6e\xe7\xec\x95\x6c\x9d\x2c\x94\xaf\x3b\x64\x0d\xfc\xbd\xb7\x65\x1f\x95\xee\xa8\xbe\x3e\x7f\x06\xf5\x77\xcb\x7d\xec\x0c\xe5\x92\xe8\xda\xde\x7b\x91\xde\xc5\xdd\x73\xc2\x06\x83\x20\xba\x10\xdb\x70\x6e\x33\x74\x8a\xc4\x9c\xca\x2d\xad\x7a\x9b\xa5\xc1\xa0\xe8\x18\x66\x35\xb3\x87\x6e\x4e\x17\xd5\xf8\xd4\xa6\xa1\xc5\x98\x15\x4c\x29\xa1\x48\xe6\xac\xe9\x85\x66\x91\xc2\xe2\x52\x9c\x68\x47\x13\xdb\x72\x38\x0c\xf9\xea\x84\xf6\x08\x39\x94\x32\x23\xc4\xde\xd6\xf5\x32\xd7\xcc\xc7\x77\xb5\x35\xe7\xee\x89\xde\x87\x7a\x2d\xa9\x58\xc8\x5d\xb8\xf6\x4a\xa1\xae\xbe\x0b\x3e\x11\xda\xae\xda\x61\x7d\xea\xb5\xbf\xf2\xfd\x71\x8b\xb5\xa4\x61\x42\x90\x40\x89\xa7\x5b\xc1\x21\x3f\x17\x05\x86\x74\xf1\x5b\x80\x89\x23\x7e\x34\xac\x1b\x63\x21\x0a\x35\xe2\xb6\x35\xe0\x1d\xdb\x4c\xea\x41\x4d\x29\x68\xb5\x13\x84\xcf\x42\xe9\xe6\x79\x6b\xf0\x3e\x8f\xf0\xc8\x21\xd9\xde\x83\x5a\x22\x44\xbe\x84\x9f\xd3\x07\xd7\xe8\x27\x8b\x27\x02\xf8\x79\x9c\x65\xf1\x58\xfc\x25\x55\x4b\xea\x47\x0a\x86\x5b\xf5\xc0\x92\x84\xcd\x8f\x86\x4b\x7b\x0e\x58\x4d\xf1\xfc\x57\xff\x64\x0b\xd6\xdb\x20\x10\xcd\x69\x1d\x06\xb7\x1c\x80\x6a\x9f\xad\xc7\x7b\x9b\xb1\x4d\x0b\xb9\x71\x4d\x2a\x8b\x63\x0d\xbb\x15\x62\x14\x87\x4c\xc0\xd2\x4a\xfb\xad\xe0\x88\xed\x4e\x40\x89\xa3\xd7\xf1\x34\xe5\x87\xd1\x86\x00\xbd\xe2\xec\xf2\x76\x24\x37\x80\x9e\x87\x81\xff\xf1\xd6\x30\xb6\xae\x2d\xe9\x49\x5f\xde\xca\xa3\xf1\x27\x47\xb2\x75\xef\xdb\x02\xc5\x11\x0b\x46\x10\xe8\xe5\x5c\x5c\xbb\xfa\x2c\x57\x9c\xd8\xda\xbf\xf8\xbe\x5f\x43\x4c\x32\x3e\x9e\x34\x30\x66\x03\x21\x45\xc1\xb9\x95\x4f\x85\x52\x1d\xa5\x7b\xa8\x13\x0b\x5e\x7b\x60\x61\x6c\x76\xd8\x2f\x37\xb0\x4b\x5f\x4a\xdb\xc3\x6b\xe1\xcb\xa3\x3f\xda\xc3\x6b\xb0\x7b\x3a\x59\x14\x49\x3d\x9f\x8d\x79\x79\x2f\xa8\x53\xbc\x68\x63\x51\xb5\xff\xd8\xc3\x5b\xfa\xc8\xf4\x4e\x17\x47\x7f\x47\xcf\x18\xf1\xcf\x04\x65\x48\xfc\x97\x51\xc4\x65\x8e\xf3\xfa\xc0\xb9\x79\x1a\xb4\x02\xf3\x0d\x9d\xf5\xec\x76\x47\xd3\xac\xb2\x5d\x6c\xbe\x15\xda\xbd\xcf\x58\x92\x61\xde\xf0\x42\xb3\x54\x7f\x2a\xb4\x3a\x8c\x06\xe5\x6d\xb8\xfc\x50\x68\xf1\x96\x95\xb7\x80\x7b\xf7\x60\xd0\x9a\xc8\xaf\x7b\xd0\x6e\x03\x3a\xea\xea\x98\x41\x77\x1c\x48\x81\x58\x46\xa9\x38\x22\xce\x3a\x1e\xcc\x3b\x1e\xcc\xba\x1e\xcc\xbb\x1e\xcc\x7a\x1e\xcc\x7b\x1e\xcc\x76\x3d\x98\xef\x9a\x97\xba\xb3\x6e\x07\xf6\x61\x86\x11\x2b\x44\x13\xfc\x39\x17\x3f\xe7\x5a\x13\x9d\xe1\x73\xe3\xd9\xae\xa8\x23\xc0\xe0\xcf\xb9\xf8\x39\xef\xa9\x3a\x42\xe3\xae\xcf\xf0\xa5\x6d\x7d\xde\xc1\x4f\x0d\xf1\x5f\x2a\x99\x75\xb0\x2d\xfa\xf7\xd7\xa9\x4c\x74\xdc\x04\x6a\x31\xef\x76\xec\xd0\x32\xc7\xb3\x0e\xec\x40\x46\x95\xc4\x30\xe4\xaf\x79\xb7\x73\xa2\xe2\xa9\x08\x45\x6e\x9a\x71\x98\xf0\x64\xc2\xa3\x41\xe0\x4f\x43\x96\x40\x3c\x1c\xa6\x3c\x03\x7c\xf8\x89\x96\x44\x7c\xca\x96\xf8\x2d\xd1\x64\x94\x65\x93\x7e\xbb\x2d\x98\xee\x2a\x4e\xc2\x41\xeb\x2a\x0e\x87\x09\x1b\x63\x58\xec\xe7\x41\xe2\x87\xbc\xf9\x2a\x88\xf8\x4b\x45\xc4\x20\x8e\x5a\xa3\x6c\x1c\x6e\x59\x11\x0a\x92\x88\x27\x1f\x58\x74\x21\x0e\xd1\x05\x22\x27\xe2\xff\x7d\x0f\xfc\x2b\x8b\xc0\x9d\xae\x20\x1e\x0e\xb6\xab\xa8\x35\xc7\x42\xa2\x93\x2e\x0c\x63\x41\x43\xff\x0a\x9e\x41\xe2\x43\x1f\x9a\x89\x2f\xe8\x75\xe3\x99\x5f\x2f\xa4\xe3\xbb\x21\xee\x8d\x18\x5c\x1c\x4f\xf6\xa2\xf3\x6d\x44\x61\x07\xfb\xdc\x16\xff\xd5\xe7\x56\x34\x0a\x86\x31\x95\xea\xc2\x39\xec\x43\x13\x4b\x67\xa6\x74\xd6\x95\xa3\xd8\x81\x78\xa6\x47\xd1\x95\xa3\xd8\x81\x78\x6e\x6a\x4a\x86\x72\x6b\x4a\xb6\x72\x6a\x76\x3a\xc8\x34\x5d\x0c\x9c\xd2\xed\xe0\xe3\x0f\x43\x21\xfc\x38\xc7\x8f\xf3\xdc\xc7\xc1\x0c\xbb\x20\x9a\x6a\x1c\x07\x73\xec\x83\x88\x6a\x4a\x05\xb3\x0e\x66\xb0\x2d\xfe\xb3\x23\x2a\x6d\xc3\x40\xe3\x90\xc0\x3e\x24\x82\xdb\x13\x5f\x15\xbd\x40\xd8\x5d\xe2\x37\xec\xa1\x83\x7f\x1b\x88\x02\xb1\xc1\x5c\xc5\x03\xea\x42\x9f\xc2\x82\xaf\x33\x51\xab\xb4\x1d\x61\xdb\x31\x9b\x51\xd3\x8e\x07\x09\x6c\xe3\xff\x0f\x7a\xd0\x84\x17\xb0\x0d\x2f\x8c\xf1\xc6\x9f\x21\x21\x5f\xe0\xb0\xa1\x29\x49\x21\xc8\x39\xd0\xf4\xf4\xe7\x58\xa7\xf9\x82\xa8\xd4\x94\x54\xca\x55\x9a\x75\x2d\x40\x3b\x15\x80\xba\x36\xa0\x9d\x52\x40\x03\xc4\xc8\xa7\x25\xd1\xe9\x98\xe9\xc3\x62\x5a\x14\x56\x31\x76\xeb\x4b\x09\x65\xd5\xc6\x62\x29\xa9\x3a\x78\x40\x6c\xb7\xe1\x6d\xe0\x7f\xc4\xeb\x65\x3f\x8c\x53\x9e\xa8\x48\xb6\xd9\x55\x6c\x64\xa3\x58\xc8\x93\x38\x88\xb2\x54\x7a\x98\x7f\x38\x7a\x71\x04\x2f\xd1\x35\x3d\xe1\xc0\x60\xc8\xd2\x8c\x27\x70\xc5\xe6\x90\xc5\x30\xe0\x19\x4f\xc6\x42\xa2\xd0\x83\x04\x07\x4e\x16\xc3\x34\xe5\xcf\xe4\x0b\x7f\x31\xb2\x6d\x1c\xdf\x0e\x0e\x67\x1b\xff\xfb\x14\xc7\xb0\x8d\xff\xdd\x41\xc4\x45\x79\xb7\x21\xa7\xc6\x17\xd2\xc3\x97\x83\xef\xda\x27\x5d\x19\x54\x6d\xd6\x17\x35\x65\x5c\xd3\x79\x5f\xd4\xa5\x1f\xb3\x4e\xb7\x0f\x4d\xb5\xca\xe6\xf4\x4b\xb2\xf6\xac\xdb\xc5\x66\x42\xfa\x26\x5d\x68\x43\x82\x2f\xa7\x64\x55\xfc\x38\xcf\x7f\xb4\xd2\x71\x00\xbd\x99\x5f\xa0\x42\xe1\xe6\x4e\xb5\xf4\xe6\x2d\x6b\x9d\xea\x77\x38\x75\x3b\x71\x8e\x8a\xae\x69\xb6\x69\xf4\x14\xb5\xf7\x74\x2d\x84\xcc\x96\x4c\x75\xac\xfd\x5b\xf3\x1a\xca\x62\x5d\xe9\xc6\x15\xe4\xe8\x32\xa5\x1e\x24\x1d\xbd\x68\x26\x6c\xa0\x01\x47\xd3\x30\x54\xe5\x66\xcf\x27\xb4\x8c\x7a\xa0\x6a\xa8\x1d\x9e\xbe\x2b\x45\xc0\x82\x6b\x7d\x55\x9b\xbe\x19\x11\x45\xfd\xdb\x97\x06\x25\xdb\xdd\x84\x25\x7e\xdd\x7e\xdd\x75\x3e\x1d\x0e\xb9\x75\xa1\x67\xff\x29\x58\x69\xc7\x22\x73\x85\x93\x87\xd5\x42\xac\xa5\x1d\x8b\xe8\x37\xb6\x60\xa2\x0f\x43\x8d\x8a\xfa\xd0\x5c\x46\xff\x3b\xbe\x7b\x81\x73\x31\x62\xe1\xf0\x6d\xe0\x1a\x78\x59\x17\x2f\x53\x06\x5f\xb6\x97\x01\x5b\x86\x81\x2c\x50\xc4\x3c\xec\x3c\x25\xc6\x61\x42\x0a\xb1\x8e\x45\x1f\xff\x4a\x4c\x71\x17\x9e\x02\xeb\x48\x5b\x1c\x9a\x15\xe5\x14\x37\xac\xb9\xa6\x99\x5c\x06\x01\x4b\xcf\x57\x28\xa0\x17\x0d\xe2\xa0\xee\x51\xda\x6d\x38\x8c\xd2\x69\x22\x9f\xd6\xe0\x73\x1b\x31\xb1\x90\x10\x43\x07\x29\xb0\xf0\x8a\xcd\x53\x8c\xb5\x80\xce\x38\x2c\xc2\x6a\xc8\x31\xb2\x5a\x4b\xa3\x9c\x74\xe1\x1b\x48\x3a\x0d\xb9\x55\x7a\xc4\x2c\x89\xd8\x75\x04\x0f\x24\xa6\xdb\x97\x29\x04\x19\x30\x92\xad\xcf\xcc\x98\x05\x88\xa7\xcb\x4d\x11\x5d\x54\xf0\x49\x1a\x84\x71\x84\xe3\xd2\x94\x6a\x8d\xe3\x4b\xfe\x21\x16\xdb\x5d\xc7\x1a\xeb\x11\x86\x7b\xc7\x7e\x7d\x54\xe1\xd0\x1f\x31\x8a\xa6\xe1\x34\x25\x1c\x2c\x87\x86\x65\xd1\x18\x23\x1a\x19\x9b\x0a\x14\x96\x65\xaf\x22\xee\xda\xe2\x9b\x1b\x42\xd2\x5d\x51\x5b\xe0\x08\xda\x8f\x15\xbb\x75\x1a\x38\x0d\xab\x01\xf9\x48\x2a\x47\x10\x69\x20\xda\x8a\xaf\xf0\x13\x42\x46\xd0\x97\x34\x59\xd6\xf1\x80\x75\x3d\xb8\xe3\x5f\x39\xb1\x49\x92\xce\xed\xa7\xd3\x32\x82\xe7\x89\xd2\x59\x93\x28\xdd\x06\xb2\xe4\x7a\x44\xe9\x1a\xa2\x94\x92\x45\x92\x44\x90\xc6\xa2\xca\xb5\xb4\x55\x57\x30\x25\x1d\x4d\x24\x5b\xb2\x04\x84\xf2\x10\x27\x16\x77\xda\x97\x20\x0c\x8f\x06\xac\xe3\x5c\x58\xa0\xa2\xcd\xba\x4e\x19\x2a\xc8\xf9\x7a\x9d\x42\xbd\x01\x8a\xea\x01\x73\xcb\xba\x85\x32\x36\x81\x7d\xbd\x3f\x55\x49\x5a\x4b\x07\xc7\x7d\x43\xb4\xa9\xb3\xc9\x1a\xfc\x70\xef\x1e\xd4\xcd\x6e\xfb\x0c\x76\xf4\x8f\x2a\x1c\xfa\x6b\x29\xda\xc8\x21\x89\x50\xd0\x70\x01\x25\x5d\xf7\x9a\x33\xf1\x57\xdc\x09\x02\x52\xc6\x15\x03\xad\xb1\x89\xd0\x31\x44\x1e\x74\x60\xc7\x56\x6f\xaa\xbc\x34\x5d\xcc\x51\x1c\xfb\x6e\x59\xb7\x50\x96\x39\x1c\x93\x75\xf5\x4d\x51\xbb\x0d\x07\xa2\x1b\x75\x3b\xf5\x0c\x2d\x0d\xb4\x8b\xd0\x23\xd9\xa4\x0b\xff\xf5\x7f\xfd\x3f\xb8\x08\x04\x07\x89\xbf\x07\xac\xd3\xb2\x45\xc3\x3a\xac\xe0\x3a\x5b\x4c\x3a\x2b\xce\x84\x4f\xe4\xd4\x6b\x39\x99\x08\xc5\x76\x5d\x81\x30\x71\xa9\x0c\x30\xe9\x6e\x04\xaf\x75\xa5\xf7\xc4\x16\x54\x82\xf4\x75\xb1\xd0\x9b\xfb\x82\x6e\xdb\xd0\x6b\xac\x31\x0f\x02\x82\x32\x44\x88\xc3\x6d\x53\x48\x56\x21\x6e\x76\x04\x74\x0f\xa5\x0c\x76\x64\x10\x40\x29\x46\x92\xa6\xe3\x29\xd1\x84\xc2\xa8\xce\xc4\x5a\x63\xdd\x86\xed\x0b\xab\x31\xee\x22\xa0\xee\xda\x18\x77\x4b\x31\xee\x22\xc6\x42\x5c\x77\x65\x47\x05\x8c\xbb\x0a\x63\x12\xb0\xdd\x2a\x8c\x9d\x5b\x5d\x32\xe9\xac\xbf\x8b\x77\x1d\xd6\x9a\xdf\x0e\x6a\x61\x5b\x77\xa1\x92\x39\x66\xfd\xcd\xb5\xe3\xe2\x7a\x3b\xa8\x85\xdd\xb6\xd3\x28\x8a\x1f\x0c\xee\xc7\x07\xf2\x7c\x27\x95\x38\x29\x5e\xfc\x8d\x89\x17\x32\x68\xad\x3d\x87\xdd\x6e\x4e\x3c\xcc\x6f\x07\xb7\x40\x99\x3c\x5c\x32\x96\xad\x3d\x8f\x9d\x4e\x1e\xdf\xdb\xc1\x2d\x70\x5d\xc7\xf6\xe3\x6a\xb7\xe1\x1d\xa7\x1b\x0d\x32\xc6\xe0\x54\xaa\x13\x08\xf3\xfd\x38\x11\x3b\x0c\x64\xb1\xca\x11\x94\xa1\x7a\x24\x34\x0f\x47\x44\x0c\x18\x7c\xb3\xdc\x84\xff\x46\xc7\xa1\x20\x3f\xd7\x34\xdb\xb1\x8f\xfa\xce\xed\x15\x57\x74\xb2\x37\xb6\xf5\xae\x87\x26\x53\x34\x48\xa1\xb1\x0a\xed\x90\x68\x24\x94\x36\xeb\x6e\x47\x68\x2a\xc7\xea\x47\xce\x67\x09\x80\xa1\x09\xb3\x23\xf6\xfc\xd8\x3f\x2e\xf9\x8e\xc6\x4c\xf5\xbd\x5b\xf8\x7e\x3e\x93\x66\xca\x8a\xf6\xe7\x64\x0c\xad\x6c\xff\x51\x50\xa4\xbb\xa2\x79\x39\x37\xeb\xab\x34\xa5\x5b\x5b\xa6\x39\xb1\xce\x66\xb0\x2d\x46\xb1\x23\x86\xba\x0d\xe7\x73\xbc\x1b\x58\x47\xb5\x43\x88\x4c\x43\x64\xf3\x75\x8d\xb2\xe7\x1a\xc5\x73\x89\x22\x05\x28\x6a\xe4\x89\x19\xae\xaa\x35\xe6\x7b\xc2\x29\x84\x6d\x9a\x4a\xd8\xa1\x29\xa3\xdf\xdd\x13\x6b\xa3\x57\x6a\xde\x1a\x1a\x6a\xe2\x7b\x78\x84\x6b\x42\x88\xd7\x0b\xf5\x8f\x3e\xc5\x54\xda\x2b\x28\x8e\x6b\xf7\xd2\x75\x7a\xd9\x71\x7b\xb9\xce\x6f\xad\x64\x42\xb0\x04\x82\x1f\x87\x21\x9b\xa4\x7c\x80\xd1\x3d\xf0\x56\xc7\xde\x0d\xee\xa0\x02\xb1\x39\xcb\x82\x5a\xd6\xce\x9e\xf4\x22\xe6\x36\x4e\xff\xf5\x9f\xff\x3b\x55\xf6\x14\x21\xc1\x46\xec\x92\x57\xed\x58\xda\xf0\x20\xa8\xb9\x89\x7d\x2b\x43\x1b\x71\xfe\x0a\x4a\x4b\x20\x2d\x95\xe8\x1a\xaa\xeb\x1c\x51\x85\xaa\x5f\xd2\xba\x20\xb5\xf2\xad\xab\x8e\xeb\x59\xa7\xe5\x8b\x95\x91\x75\x5a\xd8\xb1\xf8\x3d\xa7\xdf\x0e\x09\x91\x88\x3f\x08\x2a\x99\x8d\x20\x85\x31\x4f\x2e\xf8\xe0\x99\x23\xeb\x05\x95\xbe\x81\xc4\x6f\x38\xe7\x6e\xec\x47\x82\x97\x78\xad\xc2\x96\x03\x12\x3b\x19\x8b\x7a\xc4\x98\x84\x9f\x27\xf1\x6e\xac\x0b\xad\x2b\xa1\x75\x25\xb4\x3b\x2e\xd1\xda\x6d\x38\xca\x46\x3c\xb9\x0a\x52\xee\xc1\x20\x61\x57\xfa\x3a\x42\x91\x42\x25\xca\xc3\xcc\x3f\xae\x7a\x6a\xef\x62\xff\x8d\x68\xd2\x69\x21\x47\x09\x68\x5d\x43\x93\xf2\xa1\x18\x6b\xd3\xba\x7d\x6a\xee\x93\x7d\x6b\xee\xec\x6e\x62\x96\x09\x7a\x57\x42\xef\x4a\xe8\xdd\x25\x46\x88\x95\xa9\xcd\x66\x26\xcb\x20\xb1\x99\xa1\x95\x31\xf0\x22\x19\x4d\xc6\x2d\xcb\xae\x2c\xe4\xe0\x6f\xd3\xd4\xb1\x76\xb1\xc4\x77\xc4\x60\x95\xa8\xf5\x2a\x6d\x8f\x74\x6c\xcb\xad\x28\xbd\x45\x24\x1c\xa2\x58\x59\xac\x83\xe8\xc2\xa3\x70\x63\x19\xca\x67\x0b\x0f\xdb\xd4\xa6\xb0\x9f\xf0\x64\xc4\x26\xa9\xae\x1d\xe5\x0c\x73\xd6\xbe\x33\xa0\x20\x5f\xca\x22\xe2\x6c\x3e\x6b\x99\x41\x3f\x7f\x86\x3b\xf5\x75\x14\x52\x6b\xfb\x12\xfb\xa2\xa0\xa9\xd2\x3b\x6f\xda\xbe\x0c\xd5\xa0\x1e\x27\x64\xae\x6f\x2c\xbb\x93\x6d\xc6\xf6\x5b\xba\x93\xe9\x1d\xc8\xec\x4a\x49\xc7\x83\x66\xe2\x77\x96\xd9\xca\x4a\x94\xf2\x5c\xf3\xc2\x5e\x26\x29\xf7\x25\xf6\xb2\xce\x12\x7b\x59\xe7\xeb\x92\xdb\x5f\xc5\x5e\xf6\x95\xd1\xe4\x16\x7b\xd9\x06\x46\xf0\x67\xee\x65\x2b\x6c\x65\x6b\x8f\xf4\xeb\xd9\xca\x2c\x99\xb8\xec\x56\x96\xbf\x15\x22\xc3\xa7\x45\x40\xd9\x93\xaa\x8f\x1e\x29\x6f\x59\x36\xd2\x57\xb5\x42\x52\xd0\xed\xaf\x4e\xfc\xe0\xba\x00\x78\xea\x72\x78\x07\xee\x62\xf4\x18\xf5\xd0\x04\x41\xb3\xc4\x6f\xf9\x3c\xca\x92\x18\x13\x26\xe6\x5c\x2d\xc8\xf0\x91\xc0\x3e\xd4\x97\xf0\x05\x80\x9d\x65\xee\xff\x73\x17\x40\x98\x45\x63\xe7\x66\x2f\x80\x1d\xd8\xb9\xe1\x0a\x1f\x01\x2f\x7b\xd1\x6a\x9b\x7a\x8c\x8d\x56\xf9\x0e\xae\x63\x1d\x6b\xc0\x36\x24\xab\xb1\x61\xde\x10\x86\x20\x4e\x64\x5a\x3f\x39\x49\xae\xc7\x8b\x9e\xa7\xd3\x5c\x50\xd9\x7c\x68\x35\x78\x06\x75\xb7\xa9\x8c\xa9\x73\x9a\x8b\x1c\x04\xcf\xe0\x74\x99\x6b\xb1\x9b\x3d\x60\x76\x4e\x1b\x62\x5a\xfc\x06\xf4\xc1\x71\xa7\xb5\x87\xe3\x3a\xe7\xac\x34\x1c\xb7\xe9\x1f\x3a\x1c\xc7\xcb\xd7\x1e\x4e\xce\x8f\x68\xa5\xf1\xe4\xda\xfe\xa1\x03\xb2\xfb\x76\x47\x64\x7b\x2f\xad\x34\x1c\xbb\xa1\x18\x04\x05\x78\x7a\x46\xff\xd3\xff\x63\x87\xa7\x71\x71\xc7\xe6\x78\x60\xad\x34\x38\xa7\xe5\x1f\x3a\x14\xdb\x53\xdc\x1e\x8b\xe5\x2b\xb6\xd2\x48\xac\x76\x7f\xe8\x38\x8c\xf7\x7a\x8e\xdb\x6e\x35\x0a\xab\xdd\x1f\xcd\x58\x25\xa3\x30\x1b\xef\x4a\x83\xa8\x9b\x76\x25\x0b\xc6\x59\xad\x58\xcf\x74\xaa\x81\xfa\xa5\x49\x9e\x1f\x75\x17\x26\x1a\x59\xe3\x81\x09\x5e\xae\x07\x2a\xd6\xfc\xdb\x97\xf2\x11\x17\x9b\xc2\x3e\xc6\xad\x99\x04\x54\xa2\x8e\x6e\xfb\xd0\xe5\xcd\x87\xba\xd6\xa1\x2e\x16\x4d\x9a\xaa\x9a\x1d\x0c\x91\x94\x1c\x8a\xa7\x3e\x0a\xd2\xd6\x29\xfa\xb9\xd2\x9f\xe8\xe7\xda\x6e\xd3\x9a\x80\x78\x08\xfe\x34\x49\x78\x94\x41\x3a\x3d\x9f\xb0\x6c\x64\xda\x74\x4d\x9b\xae\x72\x89\xc4\x24\x4f\xd1\x60\x51\x3b\xd8\x87\xbb\x77\xdd\xf7\x15\x13\x83\x8f\x7a\xb0\xcb\xaf\x10\x4b\xac\xf7\x16\x13\xb8\x59\xf1\xe8\x26\xf9\x02\xf9\xe6\xd3\x04\x9c\x13\x4d\x04\x45\xc8\x9c\x61\xde\x35\x3b\xb9\x70\x24\x3e\x3b\xfb\x70\xf7\xf5\x5d\xd8\x81\x7a\x81\x18\x38\x46\xca\x6b\x78\xd7\xb3\xaa\xcc\x3b\xee\xd8\x77\x28\x61\x3c\xbe\x9b\xd5\x6a\x64\xbf\xa8\xf1\x51\xea\x66\x09\xd9\x8a\xee\x27\x35\xb6\x02\x61\x67\x1d\xcf\xee\x46\x75\xbe\xe7\xd4\xc7\x01\xfc\xc7\x5d\xfb\x9d\xf7\x16\x00\x1d\x9d\x6f\x1e\xf9\x2b\x7b\xe4\x55\xc3\xcd\x8f\xf1\x9f\x53\x36\x48\x58\x16\xf8\xcf\xa7\x49\x9e\xc0\xea\x3d\x4b\x79\x77\xff\x0b\xc1\xee\xcc\xba\x56\x27\x3b\xf3\x6e\xa1\xcb\xa5\x51\x39\xe7\xbf\x07\x3c\x59\x80\x87\x7a\x57\x53\x8e\xcf\xf3\x1b\xf1\xd9\x99\xf5\x9c\x6f\xbd\xdb\xe3\xca\x12\x7f\x21\x8e\x89\x42\x50\x42\xc4\xcf\x08\x03\x2b\x61\x19\x56\xc5\x32\xd1\x40\xfc\x91\x58\xe9\x99\x6c\xd6\x35\xe7\x00\x87\x5d\x4d\xf1\xac\x87\x6f\x46\x7a\xce\xcb\x17\x80\x39\x16\xcf\x7b\xce\xdb\x17\x28\x7f\x27\x53\xf1\x52\x06\x20\xec\x74\x4f\x7b\xf2\x06\xb5\xf0\xc0\xc5\x71\x49\x45\x7b\x04\x29\x35\x11\xbf\xc0\xac\xfe\xcf\x00\xe3\x5b\x5a\x3e\xae\x98\x11\xd8\x8a\x81\x29\xe3\x5f\xaa\x06\x12\x40\x1f\x03\x5b\x26\x8d\x1c\xfc\x20\x25\x37\x5c\x3e\x9e\x64\xf3\x67\xf0\x3a\xbe\x44\xa3\xa1\x20\xff\xbc\xdb\x68\x15\x57\xe6\x7e\xc5\xca\x2c\x8a\x0a\x24\x49\x91\x7b\x71\xd6\xe6\xdd\x5c\x3c\x25\x71\x9e\xf5\xc4\x81\x56\xf6\x0c\x7e\x1c\x44\x7e\x30\x10\x52\x12\xc3\xe1\xd7\x67\x1d\x6f\xde\x69\x3c\x83\x17\x31\x44\x71\x36\xd2\x56\x1a\x6d\xdf\xbb\x53\x27\xc2\x3e\x55\x62\xbd\xd1\x80\x4f\x2e\x7c\x96\x70\x05\xc8\xd3\x3d\xb1\x68\x00\xf5\x59\xcf\x13\xdc\xeb\xc7\xa1\x10\x0e\x4c\x5a\x5d\xdb\x6d\x38\xfc\xe7\x34\xb8\x64\x21\x8f\xb2\x70\x7e\x03\x82\x08\xe2\x59\x6e\x3c\xd6\x14\xfe\xce\x93\xf8\x19\xbc\x0a\xa2\x22\x89\xad\x41\xe8\xc4\x33\xc4\x12\x82\x11\x9b\xc8\x77\xc8\x2a\x0d\x6b\x78\x68\x88\x4d\x4a\x27\xa2\x20\xb9\x56\x99\x88\x9c\xa1\x8c\xe1\x46\x7f\x67\xab\x60\x0e\xc3\x55\xd5\xeb\xe8\x75\xe2\x38\xe7\xcd\xf1\x03\xad\x14\xe7\x43\xd8\x93\xdc\xdf\x53\xc3\xdb\x91\xc3\x9b\xf7\xba\x6e\xc5\x8e\xac\xd8\xc1\x8a\x1d\xac\x88\xef\x99\x7a\x79\x88\x4a\x23\xc0\xb4\x7b\xd8\x83\x73\xcf\x1d\x76\x72\x35\x3a\x85\x1a\xb0\x8f\xaf\x90\x54\x9e\x9c\x7a\x7d\x12\xa8\x0c\xc7\xcc\x8f\xd3\x3a\x41\x85\x1d\xb9\x7a\x9b\x84\x1e\x5e\x0f\x0b\xc5\x23\xc4\x11\x84\x9d\x6e\xd9\x35\x7b\x86\xdd\x87\xd0\x16\x15\x9c\x0f\x3d\xfd\xa1\xe7\x38\x33\xbe\xa4\xa7\x3f\xa4\x68\x64\x64\x26\x56\x99\x26\x2a\x56\x86\x47\x2f\x07\xb3\xd8\xf6\x69\xd4\xcc\x94\xa1\x37\x86\xcb\x3e\x96\x49\x3b\xcf\x39\xf8\xda\x27\xeb\x68\xa6\xd3\xac\x33\x37\x1f\xc8\xbc\x4c\x00\xb4\x61\xca\x82\x74\x80\x02\x47\x37\xa5\xbf\x3a\x5e\x47\x6e\x16\x9a\xbf\x3b\xf0\x54\x8a\xc2\x79\xaf\xd3\x28\xdf\x41\x08\x1f\xc5\x31\x55\xac\xac\xeb\xcc\x7b\xdd\x46\x6e\xcf\x67\x89\x9f\xdb\xf0\x3d\x48\x8c\x9f\xb8\xaf\x9e\x3d\x02\x50\xc6\x21\x0f\xe6\xb8\x93\x14\x37\x12\x7c\xc0\xa7\x79\x45\xf0\x86\xf3\x7a\x02\x5f\xf2\xe9\xcf\x69\x10\xb9\x9f\x71\x1b\xc2\xd7\x65\xb3\xdc\x26\x84\xef\xd2\xe6\xb9\x67\x18\x5d\xf8\x3f\x04\x6e\xb9\xe7\x1e\x3e\x7a\x0b\x32\xb1\xb1\xb0\x2e\xf4\x41\xbe\xe1\xf8\x5a\xf6\x0e\xe4\xc7\x5b\xed\x1d\xf8\xfa\x8c\xa6\x56\xa9\x72\x25\x3b\x04\xc2\x2f\x5d\x0b\x18\x9c\x35\xe1\x97\x41\x3c\x4d\xe5\x5b\x0e\x4b\xe0\x5a\x78\x69\x81\x6b\x56\x88\xc2\x52\x48\x32\x6b\x9d\x08\x29\x9b\xab\x24\x1f\xee\x95\x2e\xa6\xfc\x52\x5a\x38\x22\x45\x46\x96\xf8\x8a\x8a\x3f\xf3\xff\xfa\xcf\xff\x9d\x70\x18\xc4\x11\x37\x24\xbc\xa3\xad\xac\x66\x0e\xf4\xf5\x18\xfa\x9e\xc1\x05\xf9\xa3\x51\x06\xce\x2b\x36\x7f\x06\xdf\x85\xc1\x04\xcb\x06\x41\x22\x5f\x04\x6b\x80\xe8\x9c\xd6\x69\x10\x3b\x0d\x18\xfc\x1d\x4f\x44\x3b\xe2\xbf\xc5\x59\x66\xe0\xc7\xe3\x49\xc8\x33\x2e\xdf\xa9\x3c\xa3\xa8\x87\xd9\x55\x2c\x50\x4f\x31\x97\x90\xaa\x81\xd7\x4b\x58\xcb\xe9\xed\xa9\x75\xfe\x2a\xa5\x56\x85\xb8\xe8\xe2\x2f\xff\xca\x2c\x79\x7c\xe3\x69\x6b\x94\xf8\x32\x74\x8e\x05\x4b\x03\xb1\x65\x4b\xa7\x42\x9e\x74\x0a\x5b\xa3\x3d\x5f\x51\x1c\x35\xe5\x9c\xbd\x28\xdd\x26\xf5\xc0\x17\xf1\x48\x05\xc2\x52\x44\x8a\xe6\xfb\x30\x09\x2c\xa9\x58\x35\x08\x6c\x6c\xcb\xa4\x6e\x51\x94\xd2\xb0\xec\x9a\x28\x9e\xb4\x67\x93\x16\x96\x82\x5d\x0a\xd2\xf2\xca\x83\xd1\x17\x39\x1e\x8a\x2a\x23\x1a\xf1\x15\xfe\xb8\xa4\x1f\x23\xeb\x4b\x93\xbe\xd0\x51\x0e\x71\x54\xd9\x94\x4a\x8e\x92\x2a\x9e\x37\xf6\x22\x33\x99\xad\x13\x55\x43\x48\xb9\x32\x2b\xc7\xc2\xa4\xa2\x7f\x74\x18\x8d\x2f\x17\xec\xa2\x7b\x7a\x3a\xe0\xa9\xcf\xa3\x41\x10\x5d\x54\x42\x7f\x74\xdb\xa4\x36\xbd\xd3\x53\x94\xe0\x41\x36\x5f\x00\xfc\x96\xb8\xef\x2e\x1b\xa8\xe3\xcb\xbe\x1b\xa6\x7c\x5c\x8b\x83\x64\x5a\x54\x58\x10\x37\x30\x8d\x93\xec\x27\xcc\x0f\xb7\x10\x5c\x6e\xce\x6e\x00\xb8\xe8\xa5\xf0\x12\x2f\x3b\x97\x7f\x9b\x6c\x59\x7f\x37\x00\x77\x89\x69\xcf\xbd\x87\x6c\x94\x3c\x66\xde\xc8\x00\xdd\x07\xcf\x93\x80\x3b\x51\xd9\xf1\xe9\xb8\xd1\xe1\x22\x15\x06\x9d\x6c\xb1\xe6\xc3\x6f\xe6\xcf\x8f\xe6\x4f\x99\xee\xdd\x14\x04\xd1\x80\x0b\x25\x54\x68\x6c\x07\x49\xc2\xe6\xf5\xc8\x7e\xde\x2c\x76\xe4\xca\x8f\xf8\xbe\xfa\xc6\x6b\xcf\x9c\xbe\x89\x7b\xc5\x38\x58\x94\x41\xab\x8a\xe2\x9e\x6c\xcc\x66\xf5\xe6\x6d\x5a\xdf\xfc\x7e\x9a\x75\xec\x67\x4e\xf6\x03\xc2\x89\x8d\xba\xd6\xe1\x06\x4c\x9c\xd0\x22\xef\xa6\x07\x83\x16\xd0\x89\x20\xc2\x04\xb6\x95\xde\x64\x42\x67\x98\x3a\x97\x52\x6f\xc2\xec\x4a\x56\x66\xa5\x68\x0f\x76\x76\xac\x70\xbc\xf8\x7a\x88\xb2\xd3\xfb\xe9\x31\x4e\xe5\x71\x20\xb6\x19\xfc\x0f\xe5\xeb\x43\xe6\x39\x0e\x4e\x3c\x08\x3c\xe4\x94\x46\x23\x9f\xe1\x5e\x26\xaa\xbf\xac\x7c\xc6\x29\x63\xec\x84\x73\x5a\xe1\xa8\x28\x0a\xce\x38\x9f\x6b\x0d\x39\x9c\x37\x7d\x0a\x45\x33\x90\x39\x27\x21\x4e\x44\x05\x64\x4e\xad\xbd\x59\x22\xe7\x8e\x52\xe0\x11\xef\x96\xf8\x62\xc4\x5d\xe0\x01\xa6\x06\x92\xdb\xaf\x69\x56\xa7\xa1\x9e\x78\x34\xe6\xdf\x4e\x1a\x7b\x3a\xf8\xa6\x56\x95\x10\xcb\x55\xe1\x1b\x42\xe1\x1f\x1a\xb2\xa2\x82\x8a\xb4\xa3\x46\x7f\x07\x3e\x8c\xf8\x1c\xed\x40\x69\x16\x27\x7c\x00\x01\xbd\x1f\x8f\x93\xe0\x22\x88\x58\x88\x70\x6a\x82\x0e\x03\x2e\x0f\x4a\x66\x42\x3d\xf8\x88\x69\x4f\xc6\xf0\x0c\x39\xa1\x09\x11\x6c\xc3\x04\xf9\x49\x94\xf6\xdd\x39\xf7\x68\xb5\xb1\xae\x99\xb7\xdf\xc4\x3c\xcb\x29\xf7\x40\x73\xc1\x6f\x82\x34\xf4\x74\x56\x28\x3b\x97\x32\x3f\xeb\x25\x6c\xc3\x47\x01\x55\xe8\x3e\x13\xa6\xc9\xe7\x46\xb3\x66\x19\xeb\xab\xe1\xe7\x64\x44\xdf\x96\x3a\x2a\x1f\x93\x25\x58\xb4\x18\xe8\x3b\x8f\x71\xd5\x9a\xeb\xbb\xab\x89\xa9\xd2\x89\xe2\x39\x47\x3f\x36\x97\x42\xa9\x76\xf3\x98\x04\xbc\xa5\xf6\xbe\x95\xee\xa6\x54\xa3\x35\x6f\xd7\x6e\x16\xdd\x78\xbb\x36\x09\x78\x03\x64\xaa\x2a\x73\xcb\x25\x90\x77\xb6\xdb\xd5\xae\x6c\x9d\x8d\xda\x73\xf6\x59\xd5\xa1\xa9\x53\xec\xf5\x36\xfd\x99\x9e\x74\xcf\x85\xfe\x72\x3d\x7d\x15\x57\xd2\xab\x4d\x53\xd9\x95\xb4\x18\xcb\x9f\x7f\x25\xbd\xda\x38\x8a\x57\xd2\x62\x14\x7f\xfe\x95\xf4\x6a\xa3\x28\x5e\x49\xab\xf8\xf4\x01\xaf\xb8\x1d\x7e\xf0\xe5\xcf\x4d\xab\x1d\xf0\x34\x12\xcc\x83\x73\xe7\xb2\xf5\x1c\xbe\x01\xa6\xb6\xfb\x73\x78\x8a\x3f\xe4\xdf\xfb\xf8\xa3\x03\x7d\xc0\x3c\xba\xa5\x43\x7d\xf8\xd5\x0e\x35\x17\xac\xaf\x02\xff\x47\x5f\xd7\x11\x77\x9a\x5c\xf2\xd3\x84\x0d\x02\x16\x56\x1e\xe9\x76\xbb\xb7\x0f\x18\xc9\x12\xce\x16\x00\xbe\x7d\xb4\xc8\x30\x88\xf8\xbb\x9b\xf0\x56\x67\xd1\x2f\x7a\x14\x5d\x2a\x5c\x90\x26\x45\xe9\xf2\x6f\xb4\x70\x22\x6e\x10\x21\xce\x5c\x29\x38\x58\x4a\x84\x78\x85\x17\x6d\xce\xa9\xcc\x17\x2a\x10\x01\x37\x81\xf6\xb0\x4c\xd0\xef\x1f\x26\xa8\x63\xd7\x14\x5a\x71\x09\x75\xe1\x2f\x1d\x13\xbc\xcf\x14\xd2\x0d\x0b\x6b\x31\x15\xc5\xaa\x35\xf3\x60\xc0\xd1\x6a\xc9\x5a\xb3\x3d\xfc\xe8\x46\xc9\x6a\xcd\x3a\x76\x95\x0e\xd5\xb1\xe3\x64\xb5\x66\x5d\xbb\x46\x97\x6a\x24\x3a\xfc\x57\x6b\x6e\x7d\x9e\xd3\xd7\x5c\x14\xb1\xd6\xdc\xee\x64\x2e\x3b\xc9\x85\x11\x6b\xcd\xed\x7e\xe6\xb2\x1f\x31\xae\xf7\xa5\x5b\xb8\xa5\x28\x2f\xe3\x12\x6a\xf3\xa7\x9a\x2b\x53\xa6\x02\x32\xd6\x1b\x42\xbf\xb6\xf0\xa0\x69\x31\xb8\x1c\x96\x6c\xc1\x5f\x02\x93\x6e\x39\x26\x16\x55\x5e\x96\xfb\xad\x7e\x01\x64\xe6\xe5\x64\xf9\xc5\x22\xcb\x51\xb9\xd7\xe9\x97\x40\xa6\x9c\x32\x9a\xf7\x71\x6d\xad\xa8\x5a\xf8\x37\xbf\x6c\x2e\x59\xef\xe7\x25\xf6\x9a\x06\x7a\x93\xd5\x1b\x2d\xaa\x5d\x74\x28\xab\xd8\x85\x1e\x7f\xb9\x5d\x28\x27\x68\xa5\xe8\x0c\x83\xe8\xe3\x0f\x3a\xdc\x33\xf5\xbe\xa0\xea\x4f\x32\xee\xf3\x8d\x15\xf5\x54\x7d\x75\xa1\x92\x31\xa4\x7b\xf5\xde\xd4\xbb\x65\x2a\xfa\xde\x17\xb4\x4b\xef\x9e\x9e\xe2\x15\x5f\x75\x56\x79\xbc\xa1\xbe\x5d\x9e\x75\x84\x7c\xe3\x8e\xfd\x44\x59\x8f\x8d\xc3\x9e\x98\xe6\xf7\x98\xd3\xbb\x18\x75\x19\x8b\x5d\xff\x3e\x51\xfd\x03\xe6\xa9\x2e\x54\x97\xf9\xbf\x0b\xd5\xeb\xb8\x78\xcc\x8e\xae\x33\x97\x9b\xae\x75\x64\x63\x04\x21\x3f\x51\x37\x7a\x0f\x5d\x68\x3f\x36\xb4\x55\x92\x66\x66\x1b\x8d\xe7\x4b\x37\x26\x31\x30\xb7\x1b\x2f\x0a\x15\x89\xe3\x2b\x89\x15\x29\xe4\xd2\xe5\x4d\x16\x6f\xc9\xc3\x0a\xe3\x34\x0c\x7c\x8e\xb9\x5f\x31\x0d\xbb\x65\xdd\x84\x54\x27\x5e\xcf\x1b\xff\x2e\x1b\x1e\xc6\x83\x26\xca\x15\xbf\xee\x99\x3b\xd9\x2f\x1a\x0f\x11\x09\x85\x5a\x96\x84\xee\xc1\xce\xcc\x41\x47\x0c\xe8\xf2\xb8\x83\x39\xe4\x25\x72\x0d\x0f\x76\xe6\x65\x23\xaa\x6e\x9a\x2d\x6e\x6a\x8d\x77\x8d\xd7\x3e\x62\x56\x5b\x9a\x4d\x57\x34\x6b\xc8\x56\xa7\xe8\xe0\xf2\x91\xcc\x18\xb4\x8e\xd4\xee\x81\xe0\x35\xab\xaf\x04\x5e\xb7\xb2\xc0\xab\x75\xe7\x80\x9f\xad\x0a\x79\xb6\xfe\x41\xbc\xb7\xdc\x41\x5c\xe1\x3d\xcb\xa1\x3c\x5f\x15\xe5\xf9\x1f\x8e\xf2\x3c\x87\xf2\x17\xf3\x64\x57\x1d\x56\xb9\xb2\x8b\xef\xae\xa4\xc5\xc5\x67\x74\x00\xb3\x0c\xdd\xc0\xe9\x0d\x93\x54\xc7\x7e\x22\xee\x29\xf7\x01\xf5\xc5\xf1\xc5\xad\x53\x5c\x6b\xf4\x0d\x99\x75\x65\xd4\x3c\x84\xd9\x91\x5e\xaf\x04\xbb\x04\x23\xa5\x6a\x6c\x1a\x1f\x8f\xce\x4f\x75\x8c\x88\x3e\x57\x38\x21\xcc\xce\x22\x7c\x68\x8b\x5c\x8c\xcd\xf2\x21\xf1\xf2\x1b\x6f\x29\x07\xc9\xd1\xe8\xab\xbc\xa5\xc2\xbd\xac\x00\x39\x4f\x06\xd3\x53\x6f\x73\x3d\x75\xdd\x31\xec\x6e\x16\x72\xd7\x99\x6b\xc9\x05\x93\xce\x71\xe7\xc4\x83\x49\x47\xc5\xe5\x29\xe7\x85\x49\x97\xaa\x75\x8f\xbb\xe2\x7f\x7a\xf4\xab\x47\xbf\x76\xe9\xd7\x2e\x81\xc8\x6b\x26\xd6\x72\x71\x74\x19\xa3\xb5\x98\x1a\x25\xcd\x35\x6f\x57\x34\x56\xdf\x4b\x9a\x4a\x36\x34\xfc\x16\x4a\xa5\xa7\x6e\x71\x29\x0e\x3a\xd4\xe7\xff\xd0\x3a\xff\x87\x74\xfe\x0f\xcd\xc9\x3d\xb4\x4e\xee\xff\x1f\x7b\x6f\xbf\xde\x44\xae\x24\x0e\xff\xcf\x55\x08\xce\xf9\xc5\x6d\x70\x1c\xdb\x01\x86\x49\xc6\x93\x65\x02\x33\xc3\xee\xf0\xf1\x10\xe6\xcc\xee\x06\x1f\xa7\x63\x2b\x71\x13\xbb\xdb\xdb\xdd\x06\x3c\x24\xef\xfd\xbc\xd7\xf1\xde\xd8\xfb\xa8\x4a\x1f\x25\xb5\xba\xdd\x8e\x03\x87\xf9\x2d\xb3\xcf\x1e\xe2\x96\x54\x2a\x95\x4a\xa5\x52\xa9\x54\x35\xc5\x93\xbb\x42\x08\xba\x77\xcf\x28\xdf\x7f\xe9\x33\x4a\x86\x39\x74\xbf\xc6\xc3\x04\xa2\x36\x44\x37\xb0\x8a\x43\xc5\x35\xd5\xf3\x9e\xe9\x21\x4d\xb2\xac\xa2\x83\xde\xb5\x4f\x16\xb2\x83\x71\x14\xce\x92\x78\x5c\xd1\xc5\xee\xb5\x8f\x18\xb2\x8b\x2c\x0f\xd3\x0a\xf8\xf7\xaf\x07\xff\x81\x81\xff\x3f\x8b\x30\xad\x9a\x85\x6b\xfa\xed\x3c\xd4\x3d\xe4\x69\x04\x6b\xaa\xa2\x8f\x6b\x1e\xf1\xbe\xd3\x7d\x7c\x58\x56\x81\xbf\x26\xab\x3e\xaa\x7b\x3a\x35\xff\xc1\x81\x4b\xae\xbc\x3e\x3b\xbe\x55\x95\x3d\xb3\xb8\x12\x4a\xfc\x70\xd6\x60\xf5\xb5\x21\x78\x78\x79\x6d\x18\x45\x66\x5a\x1b\x84\xcb\xef\x6b\x03\xf0\xb1\xdb\xda\x40\x1c\x7e\xf2\xb4\xbf\x35\xd8\xc4\x53\xd0\x63\x6f\x97\xcf\xf0\x56\x6e\xee\x8f\x36\x70\x77\xaa\xc5\x68\x5a\xd9\xc8\x30\x83\xf7\x0d\x60\xf4\xf0\x7e\xb3\xce\xa1\x1e\x71\xf3\x1c\xeb\xbf\xe4\x61\x5a\xcc\x43\x89\xa7\x4f\x7b\x9c\x86\x1f\xc8\x39\x5b\x10\xa8\xcc\x29\xe8\x46\xce\xc3\x48\x10\x99\x28\x7a\xcd\x03\x2b\xb6\xd9\xf0\x98\x56\x83\xd9\x9a\x2d\x89\x66\x53\xbe\x9e\x37\x67\x26\x89\xbe\xe4\xa3\xf5\x8e\xf3\xd8\xe6\xb3\xa3\x7f\xcf\xc6\x5f\x74\x5b\xc0\xff\x9a\x87\xcd\xea\xb3\x26\xed\xb5\xec\xb0\x89\x35\xfc\xb6\xee\x5e\xe7\xab\xba\x71\x8d\x93\x64\x5e\xba\x35\x76\x77\xaf\xa9\x3a\x74\x87\xc3\xd3\x30\x8b\xca\x35\xb7\xee\xae\xdc\x75\xb5\x0c\xf9\x49\xd4\x3f\x9c\x26\x19\x1f\x07\x5a\x56\x98\x57\xda\x66\x52\x34\xd1\xaf\x6e\xdd\x22\x8d\x0a\x6f\xa2\xc3\x94\x87\x70\x75\x56\x95\x47\x52\x53\xa0\x64\xa7\x11\x40\x9e\xc6\x95\x39\x48\x57\x81\xd0\x57\x78\x1e\x47\x76\xbf\x57\xbd\xfc\xb3\x67\xfe\xdc\x35\x7f\xde\x67\x7d\xd2\xd4\xf5\xb6\x97\x7f\x9a\xa6\x4b\xd3\x74\x79\x9f\xf5\xd1\x93\xc1\xb4\x87\xe3\x26\xf8\x32\xd2\xb7\xd3\x30\xe2\x02\xb2\xd9\x87\x28\x1f\x4d\x94\x9f\xbf\x8c\xcc\xa6\xb3\x88\x84\x19\x67\xdd\xbd\xc2\x9b\x33\x37\x32\xa7\x1c\x9a\x7e\xda\xdd\xa3\x91\xd3\xac\x16\x56\x48\x22\x55\xe5\x34\xe5\xe1\x85\xed\x12\x29\xfb\xee\xad\xec\x5b\x77\xce\xee\x41\x2c\x01\x45\xdb\x26\xdb\x61\xbb\x2d\xfd\x7e\xc1\x2e\x5e\x62\x71\x29\x96\x32\x4a\x5b\xa0\x27\xca\x82\xdd\x73\x60\xdb\xc5\xcb\x5e\x35\xec\x35\x29\xb0\x5b\xa0\x00\xcc\x51\x0d\x9a\x5b\xf5\x76\x5b\x66\xe8\x55\xf5\xee\xeb\x7a\xf7\xab\xd1\xd3\xaf\x4e\xa0\x79\xc9\xab\x7c\xfb\x51\xde\x7e\x4d\x86\xeb\xec\x39\x7c\xdc\xdd\xa7\xab\xe7\x63\x8b\x2e\x88\xe5\xbe\x8d\x9d\x62\x59\x1b\x42\x6f\x9f\x2e\x3a\x03\x61\xb7\x0c\x42\xcf\x85\xb0\xbb\x4f\xd6\x2a\x81\x70\x1f\x21\x54\xf2\x66\x87\xdd\x63\xf7\x0d\xff\x40\xf2\x41\xc1\x24\x0f\x5b\xe4\x7d\x0d\xad\x02\x8f\x22\x21\x3c\xf5\xc3\xa6\x83\x9d\x94\x43\xf5\x62\x94\x48\x71\xad\x32\x42\xe0\x58\x30\x74\x19\x68\x48\x30\x57\x56\x07\x57\x65\x12\xac\x45\x65\xd9\xc7\xfd\x32\x69\x65\x45\x77\x58\xde\xc0\x2b\x1e\xcd\x57\xd6\xf6\x41\x82\x6a\xf8\xb6\x98\x92\x4d\xba\xfb\x55\x6d\xd2\xf5\xf6\x52\x7b\x2b\x7d\x39\xe7\xf1\x9a\x1b\xa9\x68\x52\xb5\x8d\x96\x6c\x5f\xf0\x2c\x99\x6e\x21\x7a\xd3\xac\x6e\x20\xb7\xa2\xab\x6b\x6d\x92\x15\x7b\xe0\x06\x5b\x9c\x79\xcd\x0a\x38\x5e\x5e\x5a\x3f\x6f\xf7\xfb\xac\xc3\xb6\xb6\x6c\xc0\xfd\x3e\xdb\x6d\x36\x57\x89\x6e\x6b\xe4\x5d\xb6\x4d\x3e\xec\x7f\x59\xf9\x58\x4f\x06\xd6\x93\x73\x3a\xee\x46\x0d\xf9\xb5\x24\xf5\xca\x85\xd8\x3e\xa5\xd4\x81\x7f\xb3\x95\xf7\x03\x6c\xcf\x2f\x4b\xd5\x65\x88\x67\x0c\xbb\xee\x18\xee\x43\xd4\x9e\x79\x9a\x8c\x38\x1f\xaf\x2d\x37\x3b\xff\x8b\xe4\xa6\x25\x4f\x4a\xa4\xe6\x57\x95\x76\x7c\x6d\xa9\xb9\x88\xc7\x53\x72\x1b\x7f\xca\xd5\xfb\x2e\xa4\x37\x80\x93\xef\xae\xea\xb1\x04\x1e\x07\x80\x7a\x82\x25\x08\xf5\x34\x4c\x9e\x87\xac\x0f\x5d\xa1\x18\x06\x1c\x0a\x32\xb8\x86\x74\x64\x7d\x76\x3c\xb0\x78\xa6\xf0\x05\xf0\x32\x1e\x85\x41\xb3\x86\x40\x84\x05\x6e\x78\x94\x44\x34\x30\x1c\x49\x9e\xb7\x09\xc6\x55\x27\xe9\x6d\xd6\x25\xa1\x44\xdf\xd9\xef\x9b\xb4\xe0\xf8\xe8\xa4\x07\xc1\x48\x09\xce\x47\x4c\xa9\x7c\xfc\x6e\x50\x88\x42\x82\x69\x95\xb1\xc4\x0e\x43\x12\xb1\x3e\xdb\xb6\x83\x71\xe8\x00\x1c\x1f\x26\xd1\x94\xb3\xe0\xde\xbd\x88\xfd\xd0\x87\x37\x47\x46\xcf\x65\x7d\x16\xb1\x1d\xf6\xce\x55\xca\x91\x7a\xa8\x01\x53\xa0\x66\x1e\xef\x32\x78\xe8\x75\x8f\x05\x46\xbe\x23\x13\xdd\x95\x57\xc1\x39\x24\xda\xb5\x43\x87\xd0\xf6\xcb\xf2\xf6\x3a\xcf\xf8\x78\xd9\xd4\xcd\xfd\x39\xfe\x0c\x47\x18\x4e\x50\xd6\xa9\x22\x2f\x3c\x8d\xc7\x84\x13\xaa\xb6\x20\x09\xb7\x3d\x5f\x64\x93\xe0\xde\x47\x6b\x63\x5b\xca\xaf\x32\xe0\x93\x12\x48\x37\xe4\xe5\x1c\x90\x2b\xe9\x2c\x4f\x66\x81\x5a\x9b\xd4\x08\x79\x6a\xad\x5f\xc7\xce\x83\x0b\xad\x2f\xb6\xde\x83\x1b\x58\xc1\x6c\x0f\x05\xa3\x4f\x64\x68\x23\x20\x22\xd4\x96\x6b\x5c\x93\xd4\xc8\x15\x8d\x9d\x1c\xd5\x3d\xd3\x9e\x5a\x93\x10\x8e\x10\xb9\x41\xa7\xfd\xe8\x41\xd3\x27\x79\x3f\x57\x3c\xbe\x6b\xba\xf1\x87\xe9\x38\x8a\xc3\x29\xea\xda\x15\xd7\x3a\x8f\xae\x6d\x5e\xfa\x3c\x76\xab\x9e\xc0\x3d\x9f\x2d\xa6\xd3\xd7\xc9\xac\xc2\xed\xb0\x27\xaf\x8c\x34\xf3\x1d\xea\x56\xf6\xf9\xa2\xc5\xc2\xe9\x7c\x12\xae\x50\xc0\x55\x11\xd4\x65\x7d\x6c\x03\x1b\x82\x0b\xf7\x7a\x56\xae\xee\xe6\x56\xae\x55\x20\x6e\xde\xca\xa5\xfe\x7c\xb0\x99\xc1\x4b\xfe\xf9\xa0\x78\x30\x98\x76\xba\xc3\x50\xd7\x98\x76\x7b\xf4\x57\x6f\x57\xfc\x72\x6a\xf7\xec\xea\x3d\xbb\x7e\xcf\x6e\xf0\x2f\x32\xad\x55\x98\x6f\x3e\x83\x69\x4d\x25\x29\xf8\x6c\x7d\xaf\x30\x6a\x6d\x66\xac\x2a\xd6\x7b\xa0\xeb\x3d\xf8\x0c\x46\x2d\xe7\x8c\xe9\xcc\x33\x86\x5b\xdb\xa5\x4b\x63\x9b\x7d\xb4\x63\xae\xed\x52\x96\xdf\x66\x4b\x3b\x1a\xa6\xe4\x5a\x12\x08\xcd\xe6\x4e\x2c\x98\x27\x1f\x02\xd1\xcf\x5d\xe8\xed\x1e\x40\xbd\x2b\xfe\xb7\x45\xc5\x50\xd3\x0e\x8e\xb3\x91\x2d\xae\xa6\x25\xad\xdc\x16\xe7\x67\x75\x8f\x79\xcd\x7b\xea\xab\xb0\xd0\x3d\xb0\x40\x3c\xf0\x60\x56\xff\x34\xe8\x6c\x1e\xfa\xa2\xb2\xce\x91\xb0\x5a\x2c\xb5\xca\x65\x94\x2b\xd0\x0a\x22\xaa\x55\x25\xb0\xf6\x6b\x9d\x45\x15\x3b\xb6\x2c\xdb\x6a\xbd\x03\xaa\x62\x56\xc7\x12\xfb\x25\x94\x44\xbd\xf3\x52\x2d\xd1\xcc\x50\x89\xa6\x88\x7b\x30\x2a\x89\x2b\x77\xf5\xbd\xd5\xba\xa4\xab\x0b\x29\xb6\x38\xb4\xbe\x53\xed\x12\x73\xc8\x4b\xae\x30\xf8\xb6\x95\x76\x60\x1e\xb3\x1a\xd5\xa2\xa0\x4a\x62\x59\x41\x97\x34\xe0\xa4\x3e\xe9\x57\x27\xbf\xb2\xc0\x47\x92\x54\x2f\xe7\x3c\xae\x50\x26\xbf\xbf\xb6\x32\xb9\x8e\xce\xe7\x51\xf9\xa8\x69\xe4\xe6\x14\xbe\xbf\x92\x35\x96\x08\x86\x7a\xba\xda\xd7\xab\x8a\xfd\x75\x4c\xc0\xff\xeb\xb4\x89\x9b\xb4\x5c\x93\xc9\x28\xb1\x32\xbb\xbb\xde\xb2\x57\x6a\x71\xf6\x54\xfd\x02\xd6\xe7\xee\x37\x7d\xe3\xff\x5a\x7d\xc3\xbb\xa5\xac\xa1\x6d\xe0\x56\xe9\xea\x1a\xe2\xeb\x57\xa6\x69\x7c\x81\x50\x21\x37\xeb\x0d\x45\x34\x00\x0c\x70\xb0\xae\xcf\x12\x6d\xf5\x17\x76\x5a\xba\xde\x9e\x2a\x45\x7d\xe5\x4e\x79\xad\xbb\xd0\x15\x5d\xa8\x9b\x43\x10\x85\xd0\x00\xe2\x92\x39\x5b\x4c\xcb\x2f\xde\x75\xab\xcf\x7d\xd1\xe6\x65\xa8\x92\xbb\xb6\x2f\x10\x78\x46\x8e\x2a\x88\x66\xb3\x45\x1e\x9e\x4e\x79\x73\xc5\x08\x67\x49\x9c\xe4\x49\xcc\xff\xf3\xba\x60\x4e\x2d\x30\xff\xb5\x6f\xd6\x5a\x16\x9d\xc7\xc1\x47\x8b\x62\x1f\xad\x48\x7d\xb0\xb6\x76\x76\xd8\x61\x38\x1d\x2d\xa6\xa1\x8c\x09\x97\x4d\x93\x39\xcf\x58\x82\xe1\xd6\x65\xa0\xf5\x8c\x05\xbf\xf2\x74\x16\xe5\x7c\x1b\x96\x1e\x24\xcf\x9f\x27\xd3\x50\xf4\xd4\x64\xa7\xa1\xd8\x1e\x92\x58\x40\x13\xad\xce\x92\xe9\x34\xf9\x10\xc5\xe7\x6c\x1e\xce\x79\xba\xc7\x8e\x72\x7e\x76\xc6\xe3\x16\x7b\xde\x66\xdd\xef\xbf\xef\xb4\xd9\x63\x76\x14\xcd\xe6\x53\xce\x9e\xf3\x7c\x92\x8c\x21\xa4\xdc\x73\x1c\x45\x34\x12\x70\x9e\xd1\x2e\x58\x14\xb3\x97\x31\x67\x4f\xa2\x19\x8f\xb3\x28\x89\xdb\xec\x71\x96\xa7\x49\x9c\xcc\x96\x90\xad\x00\x7e\xcd\x27\xcb\x2c\x1a\x65\x2d\xf6\x8f\x64\xda\x66\xbd\xdd\xef\x5b\xec\xc5\xcb\xb6\x00\xf6\xe2\xe5\x3f\x82\x67\xcf\x9a\x2d\xf6\xaa\xcd\xee\xdf\xdf\x6d\x21\x12\x84\x56\x62\xd0\xbb\x41\x3e\x09\x73\x95\x5f\xc3\xb8\xab\x4f\x70\xeb\x0c\x73\x19\x0b\x5b\xfe\xa9\xef\xce\x26\x3a\x2f\x86\xaa\xa4\xdd\xca\xe5\x05\xbe\xf8\xba\x34\x4d\x97\x1d\x08\x92\x3f\xe9\x08\x5d\x79\xd2\x85\x49\xd9\xda\x62\xdb\xe6\xf1\x5b\xd6\x85\x17\x77\x06\x26\xbe\xbb\x0b\x26\x5d\x68\xd2\xf1\x34\x99\x8b\x16\x59\x87\xdd\x15\x10\xef\x09\x08\x77\xd9\x44\x77\x74\x8f\x4d\xf0\x01\x9c\xe4\x84\x00\xb8\x23\x83\x30\x7a\xf8\x67\xb7\xd9\x54\x21\x90\xad\xd8\x90\x59\xa7\xd9\x32\xd1\xbe\xb3\x6e\xb3\xc5\x3a\xed\x07\xaa\xaa\xf8\x36\x6f\x42\xde\x85\x4e\x91\x9f\x42\x96\xc4\x7c\x3b\x8b\xc6\x7c\x8c\x24\x76\x49\xde\x93\x24\xcf\x09\xb5\xfd\xc4\x26\xb8\x83\xcb\xb1\x50\x99\xcb\x28\x3b\x11\xbf\x31\x07\xe1\x1e\xcb\x15\x5a\x8f\x47\xa3\x44\x6c\xea\xe7\x2c\x4f\xd8\x24\xcf\xe7\xd9\xde\xce\x0e\x8f\xdb\x1f\xa2\x8b\x68\xce\xc7\x51\xd8\x4e\xd2\xf3\x1d\xf1\x6b\xe7\x70\x71\x1a\x8d\x86\x92\xe3\x87\xd9\x5c\xc8\xc2\xbf\xbd\xe6\xf3\x94\x67\x3c\xce\x81\x23\x33\x01\xf2\xce\x32\x59\xb0\x51\x18\x8b\x05\x9b\xf2\x2c\x63\x23\xd1\x90\xc9\x86\xf6\x2a\x81\xb0\x8a\x3c\x9d\x65\x98\xed\x48\xd4\xfb\xe9\xff\xfb\x7f\xff\x8c\x78\x8a\xaf\x46\x01\x20\x44\x6c\x4f\x79\x36\xe7\xa3\x5c\xa0\x89\x8b\x69\x91\xaa\x58\x94\xf3\x4e\x8b\xcd\xc5\x6c\xce\x3a\xe8\x26\x39\x17\x63\x9f\x75\xd5\x8f\x3b\x84\xc0\xca\x4a\x0b\xf4\xed\xb4\x58\x4e\x9e\x9e\x7e\x24\x2c\xdd\xb1\xa2\x05\x29\x3a\x5a\x71\x85\x5c\xbe\x5e\x9a\x8f\x26\x8b\x0b\x5c\x39\x07\x3a\x5a\xfc\x0e\xdb\xc5\x53\xbb\xa8\x55\xfa\xe4\x17\x82\xfe\xb3\x25\xfe\xc1\xee\x02\xa2\x00\x02\x3e\xe3\x1f\xe2\x73\xd9\x03\xe0\xe7\x4a\x7e\xd6\xd7\x26\x74\x93\xbf\x8a\xa9\xa0\xdc\x3e\x40\x4a\x20\x05\xf3\x67\x75\x55\xee\xb9\x47\x39\xfb\xd4\x47\x0e\x15\x65\x47\x39\x73\x6f\xd0\xd2\x58\xb7\x8c\x20\xa0\x9f\x9b\x3e\x0f\xa0\x6b\x1a\x1a\xba\x9f\xdf\xd0\x00\xaf\x9a\xb4\x27\x5d\xa5\xca\xf5\x11\x70\xd2\xb3\xbb\xb5\x25\x6a\xf4\xcd\xac\xea\xac\x06\x10\x5d\xff\x3c\x4e\x52\x4e\x73\x3a\x00\x16\x59\x7b\xe3\x1b\x86\x4a\x6f\x31\x18\x59\x99\xaf\x58\xe1\x6c\xbc\xb1\x65\x81\xf2\x85\xcd\x0d\x82\xa4\x7a\x6f\xd6\x27\xf3\x26\x08\xb3\xb2\x5b\x07\x3f\x97\x95\x81\x2a\x3f\xe5\xdf\x8c\xa7\x99\xb5\x3e\xf3\xae\xd4\x89\x3d\x12\xec\xbf\xaa\x25\x98\x50\x76\x5f\xf3\xb3\x29\x1f\xe5\x87\xf8\x91\xaa\xbb\xb7\x6e\x05\x1a\x8e\x25\xd6\xd0\x24\xd2\x1e\xa5\x3c\xcc\x79\xe0\x11\x7d\xcd\x66\x5b\xcd\x84\x87\xb3\x3d\x0d\xb0\x3a\xc6\x8f\x41\x42\x2e\x5b\xec\xa3\x40\x82\xe6\x0c\x2c\x41\x75\xa5\x70\xb6\xdb\x15\x24\x74\x59\x82\x3e\x3f\xab\x22\x62\x95\x79\xf6\x2a\x04\x43\x75\x62\x3c\xff\xca\xa1\x3d\xae\x99\x6a\xce\x01\x68\xef\x94\x3a\x00\x46\x4f\xb6\x93\xfd\xd8\x44\x9f\xf9\x37\x43\x72\x5c\x2a\x6e\x97\xf6\x76\x3a\xf3\x33\xa3\x07\xc2\x7f\xd9\x10\xdc\xb3\xd6\xe7\x0a\x92\xa9\x31\x7d\x11\xe6\x8b\xd4\x44\xd9\x58\xcd\x59\xb2\xc1\xd7\xbb\xe9\x57\xf8\x23\xde\xa8\xcb\x61\x4c\x5c\x0e\x89\x49\xbc\x90\x8c\xa5\x72\x87\x80\x98\x17\xcb\xe3\xce\xa0\x7c\x9f\x30\x55\x94\x88\x86\x6e\x60\xb3\xeb\x35\x57\xf9\x47\x7c\x84\xe0\x1a\x4b\x15\x97\x03\xa4\xb3\x9d\x6b\x4d\x06\x51\xf9\x28\xe7\x39\x4d\xa6\xaf\x60\x6f\x0c\x6c\x77\x41\xc6\xe6\xcb\x42\x95\x25\x71\x55\x80\x60\xe6\x90\x8e\xa0\x83\x11\xcd\xa3\x2e\x6e\x94\x51\x57\xc7\x2d\xef\xb4\xc4\xff\x76\x29\xd6\x2e\xde\x4e\xc4\x10\x31\xfc\xe3\x08\x22\x83\x2c\xcd\x9f\x62\x54\xfa\xab\xfa\xf3\xe3\x71\x84\x63\x8d\xc8\x60\x69\x86\x7b\xb2\x35\xd5\x54\x81\xe2\x1b\x52\x7c\xaa\x5d\x23\x6f\xde\xff\x71\x87\x1d\x71\xae\x0f\x67\x1f\x3e\x7c\x68\xcf\xc3\x34\x8f\x46\x53\x1e\xc5\x23\x3e\x9d\xb6\x47\xc9\x6c\xa7\xd7\xe9\xf6\x76\x90\xdc\xdb\x78\x36\xcb\x76\x60\x16\xc7\x3c\x8d\xde\xc3\x61\x8b\x1c\x83\x5c\xde\xd0\x67\x20\x1d\x07\x3e\x76\x7c\x70\xd5\xf7\x99\xfa\x23\x2c\xc9\x1d\x71\x5a\xf2\x3d\x75\xbe\x8b\x01\x86\x18\x5b\xac\xd3\x62\xa7\xf8\x57\xaf\xc5\x52\xfc\x4b\xb0\x8a\x7c\xe5\x26\xf8\x43\xd4\xd6\x01\xf6\xbb\x32\x7a\x3e\xf8\x06\x63\xd6\x84\x10\x73\x23\x74\x05\x24\xf8\xeb\xbe\x80\x84\x7f\x19\x8f\x5a\x84\x16\xb1\x7b\x0c\x21\x86\xc7\x00\x43\xf6\x7c\x6a\x7e\x7d\x27\x5a\xeb\x5f\x8f\xa0\x99\xfc\x79\x4f\xfc\xe9\xc7\x47\xe2\x32\x63\x7d\xc4\x67\x47\x20\x03\xad\x24\x5a\xdb\x7d\x36\x93\x78\x89\x3f\xd9\x5d\xf1\x37\x54\x70\xb0\xd1\x9d\xef\x68\xac\xac\x1e\xc5\xa7\x9e\xe8\xf5\x47\xc8\x1f\xb1\xbd\x6d\x48\x10\x20\x78\xf1\x13\xc6\xd9\x44\x34\xa0\x3d\x19\x61\x20\x46\xc1\xee\xe9\x4e\xc1\x32\x60\xf5\xd1\x29\x52\x59\xd2\x96\x92\x91\xf4\x44\xac\x11\xc7\x61\x8b\x9d\x0e\xd0\xc8\xf0\xd9\xcc\x9c\xee\x6e\x57\x62\xe1\xfc\x8c\x41\x41\xaf\x61\x9a\x1c\xc1\xe0\xb2\x9c\xcf\x7f\xe2\x67\x49\xca\x37\x33\x71\x0a\x38\x8f\xcf\x72\x9e\x12\x25\xe0\x28\xe7\x73\x73\x33\xb3\x4a\x09\xd0\xaa\xb8\x10\x66\x30\x61\xa2\xfd\x57\xad\x10\x18\x99\xbb\xe1\x13\xad\x0e\xfb\x41\x8f\x5e\x1f\x91\x73\xf6\x03\xeb\xfa\x4e\xcc\xbd\x92\xcb\x00\xa5\x60\x28\xbc\x9a\xee\x4d\xc2\x4d\x9f\xcb\x1d\xc8\x42\x04\x34\xc9\x2c\x9a\x0d\x2b\x6f\xdd\xb8\xb3\xc0\x5f\xe3\x84\x5d\x7e\x1b\x6e\x54\x15\x43\xc5\x9c\xfd\xd0\xb7\x93\xe6\x54\xbb\xa7\x9a\xcb\x9f\x2a\x55\xcd\xae\x55\x50\xd3\xa4\x82\x4a\xee\xa9\xd9\x5d\xfa\x62\x23\x6f\x8a\x9d\x46\x3f\x6d\xcb\x57\x77\xd8\x75\x39\x70\x45\xe5\xa5\x47\xad\x2a\xf5\x51\xa5\xeb\xcf\xb0\xfa\x97\x7a\x39\x66\x8b\xb4\x4e\xfb\x81\x92\xf5\xc6\x70\xae\x05\x6a\x5d\x20\xce\x21\x4f\x4b\xd2\x9a\xed\xbb\xfe\x23\xde\x67\x8c\xee\x76\x8d\x7b\xe8\xcf\x14\xac\xb9\xfb\x19\x83\x35\xf7\x86\xc3\xe4\xec\x2c\xe3\xf9\x30\x4e\xe2\xf2\x50\x5e\xdf\x5f\xd3\x4b\x6f\x77\x38\x84\x94\x4d\xd5\xd0\xbb\x9d\x8e\x0a\xe6\x45\x18\x24\x1c\x5d\xfc\x03\xb3\x6e\xb5\xd8\x05\x5f\xda\x51\x98\x8f\x2f\xf8\xf2\xa6\x14\x1e\xa3\x8e\x5f\xf0\x65\x56\x33\x0f\xc3\x8a\x40\x37\xc7\x26\xae\x13\x10\x60\x55\x60\x66\x4a\xa5\x8a\xac\x80\x38\x57\xab\x32\x16\x5a\x33\x5a\x01\x4d\x65\x73\x32\xb4\x76\x02\x44\x89\xef\x85\x8c\x79\x17\x7f\xb2\x3e\x50\x6a\x65\x92\x3a\x92\xe5\x6a\x56\x96\x5b\x4f\x1c\x7c\x2e\xfe\x2c\x7c\xce\xfe\x2c\xcd\x95\x97\xfc\x59\x33\xa5\x9b\x3e\x54\x5f\x44\xd0\x09\x24\xf7\xca\xc4\xdf\xd9\x9f\xa8\x59\x9b\x0e\x66\xcd\x16\xbc\x83\xec\x88\x1a\xef\xf6\xd9\x3b\xf6\x03\x9b\x09\x78\xd6\x33\xc3\x2c\xc2\x34\x5f\x59\x24\xea\x1e\x8b\x13\x39\x49\x0c\xf7\x6e\xd0\x62\x17\x51\x8b\xbd\x93\xc9\xe1\x06\xfb\xa4\xe1\xbb\xb6\xf8\x26\xa9\x70\xfc\x6e\xe0\x3e\x9b\xc8\xa2\xf6\x05\x17\x12\xfe\x22\xb2\xec\xc0\x34\xcd\x59\x22\x88\x02\x9c\x12\x64\x7f\x36\xfd\x83\xce\xfe\x3c\x4e\xc4\xe8\x06\x6d\x95\x8e\xd0\x86\x87\xbc\x11\x64\x7f\x0a\x70\x72\x4b\x52\xf1\x8f\xfe\xd4\x5e\x45\x30\xf3\x6d\xb9\x1c\xd6\x0a\xc3\x24\xdb\x6c\x18\x49\x6a\xf5\x02\xab\x23\x88\x4b\x22\x8e\x0f\x9b\xcd\x16\x8e\x50\xa8\x3f\x02\x61\xe3\x06\x85\x03\xff\x57\xe6\x46\x5b\x3d\x74\x0c\xa2\xa5\xf0\x77\xb2\xa3\xe1\x00\x94\xcc\x59\x6b\x00\x5a\x50\x91\xf8\x59\x9b\x08\x2d\x19\xa0\xec\xaf\xc1\x06\x30\x96\x02\x19\x95\xb8\x5d\x8f\x8e\x5a\x48\xd7\x22\x64\x0d\x81\x2d\x23\x98\x69\x5c\xa1\x7a\xc1\x77\x0f\xca\xfd\xa7\xf2\xdd\xaf\x2d\x7c\xd9\x2a\x5d\xe3\x26\xf6\xf5\x8c\xa7\x11\xcf\x5a\x38\xb5\x38\x6f\x10\xd3\x30\x08\xc4\xa6\x83\xa5\x72\xda\x30\x8f\xa7\x49\xe6\x4e\x2d\xb2\x2d\x16\xeb\xbd\x61\xa6\x1b\x1e\x77\x06\x6a\xd3\x62\x4b\xdf\x7e\x01\x00\x96\xf0\x2e\xbd\xb0\x43\x2d\xd9\x3d\x0d\x27\x1a\x1c\xbf\x1b\x1c\x77\x07\xd2\x7d\x45\x9d\x95\x96\xcd\xd2\xfd\xcd\x6d\xb8\xa3\x8f\x05\xac\x56\xf0\x8b\x52\x36\x6b\x3a\x24\x2b\xe1\xa5\xcf\x18\x65\xe7\xa6\xf3\x6b\xad\xc9\x02\xdd\x52\x16\x90\xf3\x3f\x6e\xb1\xf1\xb2\xc5\x96\xf3\x16\x5b\xc6\xc0\x18\x84\x23\xa0\x93\xe3\xce\x40\x31\x46\x39\x57\xcc\xc5\x49\x2e\x96\x96\xfe\x15\x39\x69\x21\x56\x42\x30\x76\xbb\x89\x06\x62\xfa\x9b\xc7\x60\x12\x1c\xc3\x25\xc8\x8f\xce\xb1\x7a\x8c\xa6\x5d\x81\xec\xf8\xb8\x8b\x7f\x0a\xc6\x1b\x2f\x9d\xdb\x0c\x48\x89\xbf\x64\x3f\xb8\xcd\xb1\x4d\xdc\xd2\x90\x62\x6f\x73\x4f\x8f\x9e\x57\x97\x7e\x5e\xfa\xba\x62\x8f\xfc\x95\xe4\x92\xd2\x56\x3b\x1e\x06\x34\x9c\xd9\x59\xc5\x8b\xc0\xdf\x08\x6a\xb9\xb6\xa0\xca\x3a\xf2\x93\xa8\x05\x7f\xc3\xfc\x6f\x2f\x95\x75\xfb\x4b\x89\xa4\xaf\x2b\x90\xc2\x57\xca\x46\x62\xe2\x6e\x07\xc1\x4c\x3a\x69\x16\xd9\xa6\xb9\x9a\xeb\x96\xc8\x2a\xef\xf0\xf2\x27\x13\x5b\x62\x4b\x70\xcb\x6a\xee\x02\x77\x52\xf1\x6f\xaf\x5c\xe0\x41\x14\xef\xc8\x23\xea\xe8\x65\x6a\x16\xbd\x03\xe4\x23\xc2\x8e\x4e\x79\x57\x96\xc3\x55\x8b\xb7\xce\x2e\x10\x41\x40\xda\x86\x06\xfa\x3e\xc6\x3e\x38\x22\xaa\x17\xec\x07\x16\x09\x54\x2f\x9a\xce\xcd\x6f\x76\xe1\x22\x7b\x61\x23\xcb\x58\x76\x81\xe8\x5e\x94\xa0\x0b\x35\xba\xb2\x86\x85\x30\x39\x3e\xee\xc2\x0a\xbb\x40\x74\x2f\xde\x75\x0b\xa7\xc7\x2e\x54\x88\xde\x21\x81\xc5\xdf\xbb\xec\x2e\x7c\xa0\xce\x6b\x62\x8d\xea\x2e\xe4\x9a\xc5\xdf\x28\xb7\x8d\xfa\x91\x75\xc5\xe2\xdf\xee\x0b\x68\x3b\x2c\xeb\xaa\xc5\x5c\x07\xc2\x97\x58\xf0\x5f\xd7\x53\xd7\x30\x1b\xf1\x78\x1c\xc5\xe7\x15\x0f\x51\x77\xd5\xb2\xff\x3c\x3a\x8e\x65\x1e\xab\x33\x03\x04\xe7\x8a\x69\x68\xb6\x53\xfe\x9e\xa7\x19\x0f\xca\x66\xe2\x6b\x7b\x0a\xb4\xd2\xce\x78\xcd\x44\x7c\xb5\xa7\xf8\x73\xcf\xb1\x68\x5a\x90\xf0\x4a\xa2\x68\x93\xdb\x3b\xed\xc6\xbf\x98\x65\xa6\xf6\x2c\x9c\xaf\xc8\x2f\x4b\xd9\x02\xb3\xc4\x65\x8b\x99\x15\xa8\x5e\xd9\x09\x6e\x64\x9d\x37\x21\xab\x7a\x21\xd5\xb3\x3e\xd3\x2e\x66\xd9\xf1\xa9\xd0\x71\xe1\xaf\x70\xb0\x0f\x9c\x87\x88\xe4\xc9\x1c\xf6\x14\xe5\x0a\x91\xe4\x79\x32\xa3\x5f\xf2\x64\x0e\xe9\x20\x06\x76\x95\x4c\x3a\x35\xf9\xae\xdf\xad\x1d\xe9\x9d\xb2\xb7\xc9\x0b\x7d\x79\x8d\x95\xcc\xd9\x0f\x12\x14\x71\x58\x4a\x40\xb9\x06\x34\x8d\x79\x4f\x60\x80\x4e\x26\xef\xd4\x5b\x5a\x5b\x69\x96\x48\x17\x5b\x4a\x54\x9d\xc6\xca\x40\xa7\x82\x4c\xc9\x4a\x7a\x91\xb6\x47\x49\x3c\x0a\x73\x81\x63\x56\xb6\x62\xbf\xc0\x1b\xa4\x9b\x5d\xb1\x5f\x93\xd8\xac\xc1\xd0\xab\x24\x66\xa5\x5f\xa2\xa4\x7a\x39\xcd\xc5\x30\x8f\xf2\x70\x74\x51\x76\xcd\xb4\xdb\x95\x0b\x84\xff\xcf\x22\x9c\x82\x79\x3b\x2b\xad\xbb\x4b\xeb\xfe\xb4\x7c\x13\x9e\x97\x54\xfd\xee\xe1\x77\xb4\x2a\x92\xaa\x0c\xee\x77\xdf\x29\x1c\xce\x79\x5e\x01\xf3\xd1\x03\x59\x2d\xca\x00\xcf\x32\x2e\x78\xa4\xab\xfd\xa4\x92\x4f\xf8\x87\x63\x2a\xbe\x59\xce\xf9\xb8\x0a\xe8\xee\x2e\x28\xe2\x3b\x77\xef\xb2\xdf\x05\x63\xe5\x09\x1b\x25\xb3\x79\x92\x71\x76\x1a\xe5\xb3\x30\xbb\xc8\x40\x3a\xa0\x59\x57\x14\x85\x69\x94\x25\x71\xd6\x16\xd3\x27\x66\xe1\xf0\xe5\xf3\x57\x8f\x5f\x3f\x1d\xbe\x7a\xfc\xfa\xcd\xb3\xc7\xbf\x0d\x7f\xfe\xed\xf1\x2f\x70\xf9\x8e\x50\x4f\x90\x46\x7f\xcb\x93\xa3\x3c\x8d\xe2\xf3\x13\x96\xf2\x4c\x30\x4b\xca\xcf\x78\xca\xe3\x11\x37\xa0\xc2\xf4\x3c\x43\x3a\x35\x8e\x13\x68\xc6\x1e\x2b\xcb\xe2\xa0\x81\x63\x02\x6b\x66\xa1\x52\x1a\x2e\x55\x05\xfc\xe6\xd4\x40\x24\x06\x0d\x3a\x54\x31\xac\xd3\x45\x34\xcd\xb7\xa3\x98\xcd\xf0\xed\x9b\x07\x29\x84\xf0\x2a\x4d\xf2\xc4\x78\x71\x6b\x4f\x15\x97\x76\x13\x3e\xba\x90\x4d\x90\x70\xc9\x87\x98\xcd\xd3\x64\xce\xd3\x3c\x22\x50\x27\x61\xf6\xf2\x43\xfc\x0a\x0b\xc4\xe4\x90\x6e\xda\x76\x21\x76\x71\x8b\xdd\x65\x8f\x59\x36\xe7\xa3\x28\x9c\x46\x7f\xf2\x31\x13\xcb\x2b\x4a\x62\x96\x9c\xb1\x93\xd3\x30\xe3\xcf\xb2\xa7\x82\x27\x4f\xa0\xdb\x10\x19\x3e\x8c\xc7\x1a\x9b\x0f\x93\x68\x34\x61\x73\x9e\x9e\x25\xe9\x2c\x13\xf0\xc6\x9c\xcf\xe9\x9c\x42\xf5\x3c\x0d\x47\x17\x99\xf8\x07\xd6\xaf\x69\xcf\xe3\xf0\x74\x1a\xc5\xe7\x06\x60\x94\x4f\xd8\x28\x4a\x47\x8b\x69\x98\x0a\x78\x86\x7a\x82\x16\xa7\x8a\x5f\xf8\xb8\x7d\x8b\xc1\x00\xfe\x6d\x0e\x6e\x81\x1c\xff\x0e\xd3\x70\xc6\x3e\x21\x45\xaf\x24\x54\xf6\x66\xc2\xd5\x9f\x92\x17\xc3\x94\xb7\xbd\x0d\xf2\x09\x4f\xb1\x3e\xfc\x55\xdd\x2a\x5e\xcc\x4e\x79\x7a\xa5\xb8\x1a\xda\xa9\xbf\xcf\xa6\xe1\x79\xd6\x06\x87\xc7\x22\x25\x67\x49\xca\xd9\x98\xe7\x61\x34\xcd\x2c\x88\x3f\x4b\xa1\x75\x25\x5f\x93\x47\x7f\x4a\x74\xf4\xcd\xa1\x40\x45\x15\x59\x6b\xc7\x0f\x06\x44\x8a\xf8\x59\x80\x32\xe6\x39\x4f\x67\x51\xcc\x45\x9d\xe8\x7d\x38\x85\x87\xa0\xc9\x99\x7c\x8c\xe6\x25\xcf\x31\x18\xc2\x07\xec\x8d\x3b\x9f\x27\x48\xa8\x13\x98\xed\x13\xa0\xdd\x89\x9a\x53\x84\x84\x1b\x41\xc6\x3e\x9d\x26\xc9\x94\x87\xf1\x15\x7b\x2d\xbf\x9c\xe4\xe9\x82\x9f\x88\xfd\x3f\xd7\xf3\x94\xb1\x30\xa5\x88\xb5\x70\x6b\x3f\x39\x0b\xa7\x19\x3f\x11\x10\x77\xcc\x85\x36\x21\xef\x13\xce\xe7\x01\x82\x68\xe1\x14\xb6\xd4\x8c\xb4\x08\x49\x5b\x86\x2e\xda\xf8\xaf\x14\xc0\xe4\xf4\xdd\x33\x21\x33\x59\x5f\xc9\x4e\x09\xd0\x68\x69\xf9\xa4\x50\x43\x74\x65\x2a\x9c\xbe\x43\x59\xa1\x61\x1d\x18\x19\xb3\x27\x25\xb7\x07\xaa\x6c\xa4\xc0\x7b\x1b\x41\x47\xa0\x60\xd1\x5e\xe0\x8f\xbe\x16\x76\x07\x44\x62\xed\xc9\x72\xa1\xe6\xd0\x3e\xaa\x9b\x40\x39\x74\xa3\x69\xf2\xf2\xf4\x9d\xd5\x99\xae\x6f\xd1\x45\xd6\xd2\xf0\x0b\xb5\xa2\xec\x28\x9c\x71\x17\x73\xd2\xa1\x50\x04\x4d\xa5\xad\x2d\xbd\x37\x29\x8a\x51\xcf\xb7\xdb\xa6\x10\x28\x63\xb4\x46\xa9\x79\x00\xc7\xd0\x93\x3a\x99\x5f\xc1\x78\xfb\xe6\x23\xa2\xae\x1b\x5c\xf9\x70\xb9\xad\x6a\xea\x97\x75\xa0\x30\x5c\x5e\xb2\x20\x93\xaa\x03\xba\xd8\x08\x9e\xb2\xee\x80\x03\xdd\xf1\xe5\xa5\xb5\x8b\xea\x61\x49\xc4\x0f\xa8\x7a\x71\x3d\x66\x96\x90\xf6\x88\xf2\xe1\x02\x42\xd2\xd7\x05\x48\xe9\x71\x3b\x50\x32\x6e\xcb\xbb\x51\x37\xa9\x4b\x03\x0c\xfa\x8f\x34\x9c\xcf\xf9\x58\x2d\x08\x41\xe7\xad\x2d\x67\xbb\xc2\x9b\x43\x85\x64\x63\x38\xfc\x80\x8d\x86\xc3\x06\xf5\x50\x10\x2c\x46\xc0\x29\x8e\x2b\x03\x87\x63\xb5\xa1\x91\x57\x11\x16\x76\x97\x97\x16\x78\xdb\x76\x96\x9c\xbe\xfb\x3d\xfe\x60\x8f\x43\x35\x54\x4b\x07\x2f\xb7\x83\x26\x2e\x39\x31\x0e\x62\x8c\x4a\xf2\x89\x05\x80\x0e\xe4\x00\x27\x85\xb6\x17\xbf\x75\x78\xe6\xd5\x3c\xa6\xb9\x4c\xcf\x5c\x40\x31\x6e\x59\xdd\x97\x4c\x7a\x46\xe0\x5d\xd1\xf9\xd6\x0b\xc0\xb9\xa1\xb5\x56\xca\x2a\x1c\x29\x7e\x52\xc5\xbd\x1e\x6f\x83\x6b\x12\xea\xf4\x6d\xa9\xd2\xb3\xbe\xbb\x07\x78\xce\x06\x95\xde\xd3\x12\x10\x1c\x03\xa4\x62\xf4\x9a\xcf\x92\xf7\x3c\x63\xe1\x74\xca\x2e\xf8\x72\x1b\xb5\x55\x1e\xe7\xe2\x28\xc2\xce\xd2\x64\x06\xfb\xd5\x34\xca\x72\x36\x0a\x47\x13\xee\x55\x48\xe2\x70\xc6\xd9\x68\xca\x51\x99\xf9\xb7\x19\x17\x1a\xc3\xcb\x33\xf6\x5b\x94\xe5\x87\xa2\x95\xbd\x95\x4d\xd5\xe7\x43\xd1\x24\xa0\x2e\xcf\xc3\x71\x98\x87\x70\x9c\xc3\x57\x43\xf0\x55\x66\x17\xeb\xf8\x89\x62\x43\xf3\xd0\xa4\xd2\xc9\xaf\xd6\x79\x29\xcc\xb2\x64\xf4\x2c\x1e\xf3\x8f\x2f\xcf\xca\xce\x18\xf7\x3b\xcd\x6b\xe8\xc8\xb0\xf7\x29\x15\x19\x84\x61\x41\x43\xfe\x49\x41\xc1\xb9\xf1\x00\xc9\xe6\xe0\x99\xd0\x27\xd0\xda\xf8\x6d\xbf\x30\xd1\x27\x17\x7c\x89\x0a\x4c\x94\x67\x12\xe4\x5a\xd3\x8c\xb9\x73\xcb\xe7\x59\xab\x53\x19\x9c\x5a\xae\x04\x5b\x81\x5a\x26\xfe\x95\x11\x39\xb0\xdb\x3c\x61\x29\x60\xb5\x9e\xee\x24\x98\x73\xc9\x3e\x84\x99\x6c\x3d\xae\x54\x9b\x34\x77\x3c\x01\xbc\x03\xed\x09\x28\x08\x27\x5d\xaa\x2c\xd6\xd3\x3b\xb8\x74\x7f\xa2\x73\x0f\x7e\x5a\xe8\x4d\x68\x36\x71\xa8\x47\xee\x3e\x7d\x72\x03\x52\x17\x87\x59\xfe\x4c\x02\x25\xae\x6c\x18\x31\x9f\xc2\xea\xf7\x4d\x5d\x05\x14\x1a\xcc\x93\xb9\x8c\x95\x43\x6d\x40\x38\xd3\xb8\x15\x20\x7e\x00\x06\x7d\x5e\xb1\xfb\xed\x6d\xbd\x8e\x88\x94\x42\xc5\xa0\x72\x49\x21\xd1\x8a\x6b\xea\x7e\xa5\x3f\xc8\xcd\xaf\x29\xc1\x20\xbf\xf0\x3c\x73\xb8\x54\xf1\x6f\x92\x22\x5f\x97\x73\xed\x39\xcf\x6f\x88\x65\xcf\x79\xee\xf0\xeb\x5d\xc3\xa9\x86\x3f\xa1\x7e\x19\x2f\xfe\xc2\xf3\x9b\x65\x44\x39\xa3\x9a\x17\xd9\x01\x5b\xc4\x63\x7e\x16\xc5\x7c\xcc\xf6\xd0\x67\x10\x0a\x07\xf0\x38\xab\x72\xce\x7f\xe1\xb9\x67\xc2\x2b\x9d\x36\x3e\xcf\x84\x1f\x4e\xb8\x38\x7f\x45\x67\x2c\xac\x98\x73\xc6\x3f\x46\x19\x9e\xbf\xfc\x53\x3f\x09\xb3\xcd\xa6\x1e\x27\x54\xd9\x28\xea\x0b\xab\x30\x96\x4d\x5d\x5c\xeb\x09\xac\x5f\xc3\x2c\x70\xfd\x96\x2d\x1e\xb0\xb9\x05\x7d\x9c\x7f\x64\xdb\xdd\x15\xf3\xfb\x6b\x98\x79\xe6\xb7\xd2\x91\xe2\xf3\xcc\xef\x91\x67\x41\x23\x99\xf2\x84\x9d\xc0\x34\x57\xac\xe8\xec\xc6\x56\x74\xa6\x56\xb4\x6c\x73\xf7\x4a\x96\xbd\xf1\xd6\xd2\x53\xaf\xec\x05\x74\xf1\x93\xa1\x44\xe0\x78\x38\x2a\x15\x02\x47\x28\x04\x5a\xd8\xc5\x67\xde\x94\xee\xdd\xb3\x76\x00\xb5\xa1\x2c\xb2\x49\x70\x6c\x90\x18\x14\x77\x17\x5b\x74\xb0\x3e\xf1\x17\x25\x3b\xc9\x24\xca\x56\x70\xdd\x91\x57\xaa\x54\xfa\x5d\xd4\xe2\x3a\x3d\xeb\xa5\xe1\xfb\xbe\x6f\x16\xb5\xa0\x15\xea\x2e\x7a\x6f\xae\xa3\xe9\xc2\x11\xc0\x9e\x68\x00\x52\xa5\xe1\x62\xec\x37\x89\x7e\x4d\x65\xd7\x00\xf5\x50\xb3\xf2\x52\xbb\x42\xf9\xaf\xd4\x09\x57\xd0\xc2\xa7\x0e\x2a\x62\x7c\x65\xaa\x20\x8c\x64\x5d\x35\x50\xda\xdc\xa5\xdf\x7d\x03\x87\xdb\x18\x04\x7a\xb9\xd1\x49\x83\x45\xe5\x68\x59\x08\xa0\x62\x36\x4b\x75\xac\xca\x9b\x71\xcf\x74\x6a\x05\x09\xcf\xa6\xd7\xd7\x8d\xae\x35\x7f\x1b\xe8\x45\x80\xaf\xa5\x13\x11\xb9\xa2\x67\xa4\x7d\x2e\x6b\x54\xd0\xd2\xaf\xbb\x54\x5e\x58\x7a\x08\x49\x15\x0f\x2f\x2d\xd7\xd7\x39\xd6\x21\xe9\x97\xd5\x37\x60\x80\x3e\x5d\xc3\x26\xfe\x44\xd6\xa8\x20\xbe\x5f\xb1\xd8\xfc\xb6\xb2\x8e\x88\xc7\xe5\xfa\x3c\x9c\x97\x3a\x57\x3c\x34\x75\xaa\x80\xf5\x3a\xdf\x59\xe7\xf8\x50\x2e\x29\xb1\xc0\xf3\x04\xaf\x72\x38\x9b\x86\xe9\x39\xc7\xe3\x36\x4b\xe6\x79\x34\x8b\xfe\xc4\x88\x7a\xfa\x4c\xfe\xdb\xe3\xd7\xbf\x3c\x1d\x3e\x7e\xfd\xfa\xf1\x7f\x0d\x8f\x9e\xfd\xf7\x53\xd6\x67\xbd\x4e\xc7\xa3\xfc\x20\x83\x6d\xa0\xf7\x5c\x6b\xb5\xde\xa4\xce\x83\x23\xa8\x54\x7a\xa0\xca\x3a\x0a\x8f\x3a\x11\x43\x99\x02\x9a\x10\x25\x8f\x9a\x5f\xe7\x61\x94\x66\x4a\xfc\x52\x08\xd2\xb4\x27\xd8\xe2\xf2\x92\x05\x50\x4f\x1d\xbb\x7f\x28\x4e\xd1\x36\x38\x70\x2b\x83\x28\xd6\xf6\xab\x48\x8c\xd9\x82\xff\xde\x3d\x4b\xf4\x13\x33\x00\xaa\x46\xc6\x30\xef\x1b\xac\xd4\x05\x14\x67\x22\x9e\xfa\xf0\x8e\x90\x6d\xda\xb9\xda\x82\x6f\xe3\x29\x57\xca\xd4\x6c\x78\x56\x6b\x1d\xfb\x61\xf5\x6a\x8d\x32\x75\x2f\x57\xb6\x5c\x1f\xea\x4b\xf6\xe7\x61\x76\x01\x86\x62\xef\xed\xfe\xfd\xef\x75\x45\x64\xbb\xb2\x9b\x78\x75\x6b\x9f\x27\x47\xc9\x22\x1d\x95\x2d\xed\xdd\xdd\x1e\x51\x05\xd5\xc5\xf3\x2c\xcc\x47\x13\x76\xf2\x9a\x9f\x3f\xfd\x38\x3f\x11\x25\xc7\xd9\x32\xce\xc3\x8f\x6c\x34\x09\xd3\x70\x94\xf3\x34\x1b\x04\x93\x3c\x9f\xef\xed\xec\xf0\xd1\x2c\xdc\x86\x90\x98\x31\xac\xf7\x70\x0a\x01\x37\xe1\x73\xef\x61\x6f\xe7\xbb\x76\x67\xe7\x6f\x19\x1f\x6d\xcf\xc3\x5c\x54\xca\x9a\xb8\x10\x04\x61\x52\x8e\x7d\x1c\x4e\xc2\x94\xf5\xd9\xce\xf1\xdb\xb7\xff\xfc\x7b\xfb\xee\xbd\x83\xa0\x79\xfc\x76\xf0\xe9\xea\x72\xb0\x73\xee\x5c\x8a\x8f\x79\x2e\x86\x3d\x49\xc4\xa1\x22\x89\xb3\x3c\x5d\x8c\xf2\x24\xcd\x58\x70\x14\x9e\x85\x69\xd4\x6c\x1b\xe0\xcf\xb2\x5f\x93\x2c\x3f\xcc\x13\x00\xfe\xcf\xb7\xea\x02\xbf\x7d\xef\xe0\xd0\x34\x7d\x3b\xf8\xfb\xce\x35\xcc\x94\x82\x15\x94\x95\x52\x4d\xaf\x31\x54\x52\xf7\x81\x9a\xd7\xfd\x29\xcf\x92\xe9\x7b\x8c\xd6\x3b\xe6\xa3\x64\x36\x8f\xa6\x7c\xcc\x32\x9c\xbf\xe4\x4c\x5f\xe2\xda\x38\xbc\x91\xbe\x10\xf2\x49\x15\x9a\x3a\x95\x83\xc4\x17\xf3\x28\x70\xe7\x07\x14\x05\x49\xbc\x28\x63\x82\x35\xde\x73\x6b\x6a\x5e\xc0\x27\xd6\x67\xc8\x02\x41\xe3\x9f\x0d\x76\x4f\x3e\x95\x55\x63\x42\x0b\x9e\xdd\x5f\xb3\x9d\xf2\xf9\x34\x1c\xf1\x80\x72\x4f\x8b\x35\xde\xbe\xfd\xfb\x56\xa3\x79\x8b\x31\x5d\x61\xc7\x6e\x79\xa9\x97\x6f\xb3\x7d\xf7\x20\x38\xe8\xbf\x7d\xfb\x36\x68\x5e\x02\x1d\xda\xf7\xe4\x87\x41\x73\xe7\xbc\xc5\x1a\x7f\xef\xb6\xef\x1e\x34\x9a\xec\x1e\x6b\xfc\xbd\x71\x8b\xac\x11\xb8\xea\x0f\x33\xce\x20\xcc\xf1\x4c\xc5\x8d\x05\xc7\x89\x61\x3b\x92\xc3\x3a\x01\x7f\x86\x64\x91\xb3\xd3\x70\xcc\xb2\x49\x34\x43\xda\xfb\xf5\xa3\xca\x0d\x67\x4d\x8d\x47\x6e\x96\x82\xe8\xa1\x24\xbb\x66\x9c\x96\x80\xb2\xfa\x42\x1d\x87\x10\x90\x2d\x49\xde\x06\x49\x67\x2e\x59\x00\xb7\x99\x28\xae\xe4\xa7\x55\xe6\x5e\x29\x01\xe0\xfa\x5c\x2d\x19\x05\xed\x80\x32\xc5\x9e\xb5\x78\x89\x00\x97\x10\xda\x39\xcf\xf2\x40\xc9\x36\xd5\x7b\xd5\x05\x11\x02\xf6\x48\xf7\xcd\x6f\x42\x46\x49\xca\xff\x3d\x7b\x82\x9b\x98\x57\x6a\x3f\xe8\xb8\x6e\x51\x72\x95\xe0\x02\xc9\xd8\x2c\xcc\xfe\x67\xc1\xd3\x10\xc2\x18\x87\x85\xe5\x32\x0b\xb3\x8b\xa3\x74\xf4\x1f\xf0\x98\xd9\xf7\xc8\x7e\x11\x8d\x41\x7c\xfe\xb3\x3d\xb8\xf7\xf7\x9d\x36\xff\xc8\x47\x01\x41\x6b\x6b\x8b\x20\x89\x4f\x90\x8b\x9f\xda\xcf\x9e\x0e\x5f\xbd\x7e\xf9\xe6\xa5\x98\xd8\x46\x83\xde\xdd\x09\xf0\x07\x2c\x68\x1c\x2d\x67\xa7\xc9\x34\xc8\xd2\x51\x73\xd8\x6d\x37\xd8\x3d\x51\xd2\x64\x7b\xac\xd1\xd8\xbf\x75\x15\x34\xbd\x86\xca\x13\x81\xef\x89\x90\x28\x70\x94\x96\xe2\x6c\x06\x7c\x53\xb5\x1a\x8c\x2b\xcb\x99\xcf\x8b\x65\xdd\x65\x81\x58\x44\x99\xec\xb9\x52\xff\xd7\x6c\x2d\xbe\x58\x07\x80\xdb\xb7\xc9\x5c\x6c\x6d\xb1\x80\xfc\x8c\x62\x40\xb0\x84\x0d\x15\xcc\x22\x0b\x3e\xd8\xfc\xe2\x20\x4d\x92\x52\x4d\xa0\xe0\x92\x27\x79\x2f\x79\xcf\xd3\x94\x87\xa3\x89\xe0\x39\xc1\x0b\xdb\xef\x32\x90\x54\x66\x17\xb0\x38\x5b\xf4\x71\xdc\x18\x0e\x65\xd5\x61\x36\x09\x53\xb8\x57\x1f\xec\x7b\x86\x6b\x9a\x7a\x06\x5c\xc7\x70\xee\x3d\xc5\xa3\x50\x0c\x73\x79\x36\x10\x32\x57\xfa\x1f\xd5\x71\x0a\x93\xdb\xff\xc0\x71\x0b\x13\x2b\x6f\xd9\xae\x79\x5a\x98\xab\x2d\xb1\xce\xf1\x5e\x57\xf6\x9d\xf0\xcf\x79\x8e\xb1\x38\xd4\x65\xb8\x7b\xd8\x94\x18\x9a\xf7\xce\xf4\xfa\x02\x0b\x4d\xc8\x8e\xc2\x04\x28\xf0\x1e\xf2\x6f\x6e\xd7\xfe\x35\xcc\x26\xa5\xc2\x4e\xf9\xbf\xde\xd4\x19\x75\x6d\x53\xe5\x2c\x9c\xaf\x65\xa8\x54\x87\x0c\x7b\x7e\x66\xf2\x6b\xc1\x5c\x69\xac\x91\x45\xfb\x25\xee\x7f\x8d\x49\x98\x4d\x1a\x98\xa4\x46\x90\x0a\x47\xd9\x98\x85\x73\xf9\x31\x90\xc7\x2f\x73\x74\x93\x55\x90\xf3\x48\x53\x7c\x90\xee\x9b\x60\x0b\x3f\xcf\x2c\x6f\x6e\x47\x16\xa3\x00\xe8\xa5\x53\x7d\x5f\xe2\x2d\x6a\xa2\xcd\xae\xb4\xea\x03\x52\xf5\x17\x5e\x26\xad\xbe\x7b\xf0\x90\xd4\xfb\x35\x2c\xf5\x86\x7e\xf0\x1d\xa9\x77\x54\x01\xef\x11\xdd\x94\x20\x5c\xb2\x50\x8c\x44\x2b\xe5\xbc\xe3\x63\x15\x72\xb2\xa0\x82\x01\xbc\x11\xae\xd8\xb1\x64\xb9\x81\x92\x0e\x92\x13\xf1\xd0\x2d\x36\x27\xe5\x2f\x40\xf8\x49\xcc\x66\x20\x1b\x92\x68\x95\xf2\xf6\xc2\x24\x68\x97\x67\xf1\xbe\xe6\x6b\x23\x00\x3a\x6c\x4f\x7d\xa5\x81\x5e\x81\x09\x47\xc8\xa6\x82\x29\x4d\x52\x77\x79\xe5\xa1\x9e\x20\x1a\xf3\x00\x1a\xc5\x74\x1f\xf2\x36\x83\x44\xa2\x13\x87\x6b\xa8\x04\xe1\x5e\xf1\x2f\x19\xc6\xf4\x4a\x25\x5e\x18\x8f\xb5\x02\x93\x27\xec\x44\x0c\xf0\xa4\x7d\x4b\xfc\x43\xc2\x4a\x8f\x24\x03\x69\x66\xda\x77\x6a\x18\x03\xb2\xac\xa5\x8c\xbf\x0e\xa0\x73\x98\x64\xc9\x3e\x85\xd2\x09\xb0\x8a\x64\x9a\x42\x69\xa6\xdb\xe2\x11\xbf\xb0\x98\x44\x7d\xcf\x1a\xaa\x73\x7b\x50\xbd\x86\x50\x93\x43\xc6\x2b\xbd\x01\xec\xae\x2f\xe3\xc4\x58\xd6\x12\x72\x28\x4c\x28\x43\xea\x19\x29\xbb\x8b\xa1\xa8\x1f\x58\x3f\x03\xc1\x90\x42\xf1\xfb\x74\x55\xf3\x92\x86\x4c\x7f\x81\xca\xeb\x1a\xf5\x6b\xdd\xd1\x54\x13\xc8\x77\x45\x23\x29\x54\x50\x1b\x40\x56\xbc\x91\x20\xc1\x3c\x92\x8c\xa3\xb3\xda\x1a\xc3\x17\xbc\xcd\x31\xab\xc7\xbe\xcc\xd1\x17\x36\x30\x51\xca\x6c\x2d\xf4\x57\xa4\x83\x3d\xf5\x52\xa9\xa0\xd3\xba\xdd\x57\x30\x0e\x58\x97\xed\xb1\x4e\xcd\xcb\x1c\xba\x9c\x0b\xd3\x5e\xe7\x0a\xe2\x06\x17\x97\xd6\x7f\xb3\x3c\x8c\xc7\xdb\x42\x5b\x4f\x52\x76\xa2\x95\xaa\x13\x9c\x5f\xe9\x04\xaf\x54\xe0\x5f\x1f\x1f\xfd\x3a\xfc\xfd\xc5\x93\xa7\x3f\x3f\x7b\xf1\xf4\x09\xeb\xb3\xc6\x70\x38\x4d\xc6\x61\x36\x19\x8a\xea\x43\xdd\x7c\x38\xfc\x8b\xbf\x07\xd1\x4a\xb6\x21\xc3\xb5\x6e\xca\xdc\x65\xf4\x99\x2f\xca\xe4\x86\xb0\xfa\xf6\x52\x99\xcf\x29\xd3\xd0\x2d\xd1\xbe\xd5\x54\x6b\xc0\x61\x73\x08\xba\xe4\xf0\x84\xad\x98\xab\xe5\x60\x39\x03\xf8\x5c\x94\x8d\x8b\x02\x3b\x30\x7d\xb2\x3d\x03\xad\x7c\x4d\x79\xef\xf4\x1e\x6c\x7e\xad\x74\x8d\x05\xf5\xd7\x63\x74\x7a\x95\xe9\xe3\xf5\xf5\x6f\x32\xd7\x60\xf9\x2f\x7b\x91\x29\xf5\xa1\x7a\x8b\x43\x05\x0a\xb5\xb7\xfd\xc0\xb0\xe6\xed\x7e\xdf\x30\xa7\xd8\xfd\xab\xd9\xba\x9c\x7d\xbd\xb7\xa2\x0f\x36\xbf\x67\xf9\x2a\xf7\x03\xeb\x66\x13\x40\x6e\x70\xb1\x79\x1d\xe1\x7a\x93\xf7\x9a\x80\x7f\xc9\x85\xa6\x54\xaf\xd7\xba\xcf\x34\x2a\xc6\x3d\x57\x3b\xc1\xe3\x0e\xf8\x01\x1b\x16\xec\xdb\xf2\x5b\xa8\x30\x32\x46\xa0\xcd\x9b\x07\xee\x44\x91\xa0\x7e\x2b\xef\x02\xcd\x39\xc1\x65\xd1\xcd\x8d\xc5\xe7\x3c\x7f\x1e\xce\x2b\x8c\xc5\xdd\xfb\x3d\xcf\x69\xa0\x52\xd5\xad\xb4\x77\xf8\x34\x5d\x62\xf0\xf8\xca\x34\x58\x65\xd4\xa8\xd4\x62\x0d\x0d\x65\xa0\x54\x51\xad\xe0\x87\x74\x13\xfa\xab\x8d\x4e\x91\x21\x1e\xd6\x31\xdd\xfa\xdd\x68\xc8\x3d\x4d\xb6\x88\x20\x54\x3e\x08\xa0\x45\xc6\x59\x98\xb1\x45\x1c\xfd\xcf\x42\x5b\x29\x2f\xf8\xf2\x4b\x5e\x1c\x29\x84\x56\x18\xc9\xff\x83\x2f\x45\xad\xc0\x59\xeb\x32\xe6\xbe\x8c\x53\xe9\x2e\xbb\x00\x8b\xfb\xda\xd6\xc5\x2e\x2f\x99\xfe\x86\x0f\x6b\xed\x6f\x19\xdc\x3a\xd8\xdf\xe4\x38\x1a\xf8\xe0\x4d\x47\x0a\x15\x3b\x54\x63\x38\x04\xbd\x62\x38\x94\xa5\x7b\x3a\x8e\xa8\xb4\xa4\x94\x5a\xe8\xe5\x80\x3c\xf3\xbc\xb9\xab\xf7\x9a\x0b\x5f\x6b\xe3\xb3\x70\xbe\x81\x32\x7e\xdd\x95\xbe\x81\x42\xae\xd6\x8c\xcf\x79\xcd\xbb\x72\x57\x38\xb1\x11\x78\x9e\x89\xd9\xdc\x96\xbd\xe6\xc4\x50\xed\xd1\x33\x37\xeb\x2b\x8f\x6b\x4e\xd1\x97\x55\x20\x15\xf1\x7d\xce\x70\xfe\xc9\xac\x76\x8a\x23\xf0\x3c\x93\xb9\xb9\xc9\x7a\xcd\xc9\x3c\xa2\xab\x6c\x03\xb5\xec\xba\xcb\xec\x26\x55\x33\x31\x84\x4a\x87\x33\x45\xfb\x15\x3a\x9a\x77\x5a\x75\xe4\xa3\x82\x6f\x55\x2d\x6f\xac\x7b\xa4\x89\x90\xdf\xf0\x2f\x51\xf0\x56\xaa\x64\x04\x77\x0f\xdf\xac\xe3\xe4\xfd\x25\xd5\xfe\xc7\xe3\x71\xa6\xf7\x55\x99\xf6\x17\x1d\x24\x57\x3c\x28\x0c\xc7\x63\xc7\xa1\x91\x93\x77\x1c\xe1\x34\x0a\x33\x36\x5f\xd8\x47\x81\x12\x25\x40\x75\xb4\x82\x7b\xaa\x5d\x15\x65\xef\x8f\xc7\x63\xba\xd9\xdb\xde\xb0\x82\x01\xa0\xb0\xe5\x50\xab\x59\xcf\x01\xcf\xf4\xe1\x99\xe1\x75\x4d\xc4\x5e\x3d\x2b\x8a\xeb\xcf\x40\xd1\x5b\x99\x17\x5f\xd2\x94\x2d\xd7\x30\x1d\x4d\x04\x5b\x39\x74\x57\x51\x43\x2a\x75\xaf\xb3\x64\x11\xaf\xf0\xd9\xe7\xe6\x31\x14\x99\x8d\x52\x17\x65\xb5\x20\xab\xa8\xee\x97\xc7\xeb\x3a\x89\x97\x87\x94\x19\xb6\xb3\x64\xc6\xad\x68\x32\xca\x41\x2a\x5b\xcc\x21\x90\x94\x28\x8a\x72\x9e\x86\x39\x07\x22\x67\x93\x24\xcd\x27\x61\x3c\xae\xf4\x99\x52\x37\x72\x00\x14\xef\xe3\x70\x7e\xf3\x44\x41\x03\x4f\x87\x92\x28\x29\xf3\x94\x8f\xa3\x91\xa8\x64\xf9\x97\x44\xf1\xfb\xe4\x82\x8f\xd9\x9c\x2b\x9c\x20\xf9\x5c\xfd\xbd\x76\xc9\x38\x3a\x87\xb1\x79\x98\x65\x5c\xb9\x03\xa8\xce\x60\xef\x5e\xe9\x8d\x05\x03\x39\x4a\x66\x3c\x80\xbf\x5a\x06\x40\xad\xfb\x43\xa4\x83\x7d\x7b\x08\xdf\xe8\xdd\xe1\x8a\xbb\xc2\xe8\x8c\x05\xba\x57\x44\x43\xde\x15\xea\x27\xb5\xf0\xb1\x18\x7e\xc3\x84\xd8\xb8\xb2\x6d\xa1\xd2\x2b\xcc\xc7\x8d\x7a\xc0\x1e\x5e\xbc\x81\x08\x5f\x70\x8e\x28\x0b\x21\xab\xbc\x16\x7e\x8f\xe2\xfc\x51\x55\x90\xab\xef\x1e\x3e\xd2\x51\xbb\x4a\xbd\x16\x1e\x5c\x23\x5e\xd8\x2c\x9c\xbf\x49\xaa\x7b\x56\x0e\x13\x19\xcf\x57\x54\xfd\xae\xe0\x72\x76\x43\x91\xb8\x10\x01\x55\xfa\xfb\x8b\x97\xaf\x9f\x3c\x7d\xfd\xf4\x89\x2a\xef\x5d\x23\x52\x97\x58\x49\x4e\x88\xad\x9f\x70\x71\xa9\x30\x5c\xe3\x30\xe7\x4e\x8d\x27\x61\xce\x55\x31\x4f\xd3\x24\x75\xca\x9f\x8a\x6f\xaa\x82\x20\xad\x5d\xfc\x3c\x9c\xab\x42\x14\xcb\x4e\xf9\x0b\xf8\xa8\xaa\xa4\xfc\x9c\x7f\x74\x41\xa0\xf3\xa9\xaa\x92\x71\x37\x4c\xd8\x11\xcf\x75\x21\xd0\xc0\x2d\x87\x8f\xba\x0a\x70\xa7\x5b\x05\x3e\x42\xa4\x31\x1d\x19\x01\xa3\xde\xf8\x82\x96\x61\x09\xa1\x59\xf8\x8f\x88\x7f\x28\xd2\x0d\x3e\xdb\xe1\xcb\x80\x3f\xe2\xf7\x3c\xcd\x25\x22\x70\xa5\x3f\x4f\xa3\x59\x94\x47\x70\x1d\x1d\x8f\xe5\x28\x48\x8c\x05\xa8\xa9\x6c\xfa\x72\x79\x1d\xc8\x3f\x48\xfe\x3d\x72\xa5\x41\xc7\x0a\xee\x49\xf0\x2e\x96\x02\x3a\xa0\xbf\x30\x30\xca\xcb\x33\xfb\x56\x64\xad\x08\x66\x4f\x38\x9f\xe3\xbe\x23\xb9\x9c\xc4\x1c\x4b\xce\x6e\x41\x7a\x32\xce\x32\xb1\xe7\x9f\x28\x66\x7d\x13\x9e\x6b\xed\xff\xee\xdd\x17\x49\xce\xf7\xee\xde\x65\x6f\x26\x62\x7b\x56\xc2\x39\x89\xa7\x4b\xb5\x77\x65\x04\x36\x2a\x8e\x18\xce\x2c\x0f\xcf\x55\x27\x27\x92\xa3\x4f\x5a\xec\x44\xb0\xae\xf8\x17\x58\x54\xfc\x81\xcc\x26\xfe\x92\x2e\xf7\x2d\x26\x74\x52\xb9\x72\xbe\x82\x78\x67\xea\x2c\x93\x87\xe7\xd0\xc6\xa2\x94\x3a\xd5\x28\xaa\x7e\x8b\x99\x86\x24\xc6\x37\x40\x5f\x57\xc4\xb4\xf2\xb0\x50\x79\xfd\x98\x50\xb0\xd5\xeb\x14\x8a\x26\x3a\x10\x24\x33\x24\x62\x67\x4f\xbd\xd0\x3e\x63\x81\xec\xae\x7d\xba\xcc\xf9\x6f\xa8\xa1\xdc\xee\xcb\xe8\x47\xe6\x5b\x93\x5d\x5e\x92\xd0\x49\xb4\xd1\x4b\xcc\x00\x63\x35\xc2\x6f\x4d\x1a\x41\xbc\x18\xfc\xcb\x44\xf4\x56\x0e\x95\xca\xf1\xeb\x14\xe4\xe5\xbe\x09\x62\x06\x51\x30\x25\x78\x59\x66\x06\x66\x0b\xdf\x8d\xc7\x76\xdb\x04\x6c\x8a\xf9\x07\xa2\x76\xe8\xf0\x70\xcc\xfd\x8e\x71\xce\xea\x8e\xd6\xd2\xc3\xcc\x30\xe4\x66\xbb\x67\xcd\x18\xb7\xbf\xe8\x1d\x51\x8d\x72\x67\x87\x1d\x26\x3c\x1d\x61\x73\x1e\xc6\xe8\xf1\xd5\x3d\x01\x39\xd5\x41\x5e\x1e\x83\x6f\x5d\x9e\xb0\x59\x34\x9d\x46\x19\x1f\x25\xa8\xbb\x2b\x08\xcf\xe2\xf7\xe1\x34\x52\xf5\x04\xd3\x8e\x00\x26\xec\x3e\x27\x2f\xc2\x17\x27\x6d\x37\xa4\x55\x70\x4f\x71\xe9\x3d\x12\xff\x4e\x62\xa9\x76\xfd\x3d\xbb\x95\x9c\x0c\x38\xc5\xf5\xd5\x34\xc0\xaf\xad\x2d\x55\x38\xe3\x59\x16\x9e\x93\x72\xf9\x81\x82\xd7\x7b\x3e\x21\x8c\xde\xc7\x8b\x84\x81\xea\x38\x7e\xb9\x4f\xca\x00\x98\x3c\xcc\xd5\x97\x96\xbb\xa3\xca\x15\xdc\x32\xd0\xc2\x0c\xd7\x5b\x5b\x67\xcc\x96\x09\xb3\x6b\x3f\xb3\x42\xbc\x89\xf3\x5b\x9e\x60\xf7\xa6\x13\x8f\x54\x2d\x52\x50\x10\x07\x79\x8e\xdd\xc3\xf7\x00\x86\x0e\xa8\x4f\xed\x91\x30\x69\x4a\x7b\xe8\x13\x35\x96\xb6\x40\xf5\x88\xb6\x88\xb2\x57\x61\x9a\x47\xa1\xd0\xc8\xab\xe3\xca\xe9\x64\xa9\xb2\x8f\xcb\x4b\x16\x98\xfe\x8c\x2e\xdc\xd4\x71\xd3\x64\x88\x37\x31\xd5\x60\x6a\xd2\xcb\x11\x7e\x6d\x6d\xb1\xdb\xba\xf7\xba\xcb\x69\x67\x87\x3d\xce\xb2\xc5\x8c\xb3\xd1\x72\x34\x8d\x46\x6a\xa3\x97\xc2\x37\x9c\xb6\xc9\xd8\x40\x4e\xc2\x2b\x3e\x0c\x15\x70\xce\x73\xb5\xac\x69\xd2\x7c\x59\xcd\x83\x82\x06\xd0\x57\x11\xe1\x6c\x6c\x14\xc1\x2e\xfb\x25\xaa\xb8\x26\xc5\xce\x0e\x7b\xcd\x47\x8b\x34\x8b\xde\xf3\xe9\x52\xed\xcc\x7a\xef\x08\xb2\x45\x36\xe2\xf3\x3c\x3a\x9d\x4a\x7b\xd1\x74\x2a\x77\xae\xa9\x60\x55\x78\xad\xc7\x98\x8a\x45\x07\x56\x1e\x6b\xe7\xd0\x03\xb2\xae\xe8\x68\x20\x43\x39\x55\x46\xae\xe9\x0f\x18\x3b\x73\x8d\x48\x84\x1a\x0f\x72\xdb\xe7\xd0\xd5\xb9\xd5\x23\x1c\xa8\x14\x6c\x2a\xba\x2d\x4d\xd4\x37\x0f\xb4\x9c\x46\x2a\x6c\x82\x19\xd3\x53\x6a\xd1\xa4\xfe\xd1\xd7\x6c\xcc\x9e\xb3\xef\xe6\x9e\x11\xb5\x1e\x88\xac\x8e\xaa\x66\x1d\x8e\x05\xcc\xb6\xf9\xe2\x73\xab\xb5\x4a\xdd\x51\xd5\xb9\x4c\xb7\x6c\x7a\xc8\x36\x19\x3b\x99\x85\xf3\x13\x34\xf0\x64\xae\xf7\x75\x1d\x65\x79\x16\xce\x41\xc1\x13\xff\x9a\x83\x8f\xa3\x7b\x49\xc3\x12\xb5\x91\x7a\xba\xb2\xcd\xeb\x52\x0e\x05\xb3\x70\x5e\x65\xa1\xd1\xab\x44\xd7\x06\xb9\x84\xe2\x4b\xfc\x3a\x4b\xd2\xa7\xe1\x68\x62\xa8\x22\xed\xaa\xfa\x06\x46\xc1\x38\x96\x76\x9b\x01\xeb\x33\xfa\x20\x1b\xdc\xcf\x9a\xf5\x2f\xb9\x8d\xc0\x76\x26\xe9\xbb\xb5\x2f\xb8\xf5\x24\x65\x3c\x87\x49\x0a\x63\x15\x14\xe0\xcc\x38\x2f\xd4\x9a\x27\xa1\xef\x89\x79\x12\xff\xae\x33\x4f\xa6\x07\xdb\x6a\xaa\xa6\x47\xe8\x8c\xf5\xa7\x27\xe3\x39\x99\x1e\xf1\xcb\x3f\x3d\xe5\x33\x63\xc2\x03\xd5\x9d\x12\x83\xac\x67\x4a\x6e\xe4\x2e\xfa\xf1\x74\xfa\x1f\xbc\xd4\x28\xf5\xdd\x77\xbd\xcf\x1b\xc8\xfd\x2f\xea\x3a\xb8\xa6\xc5\xc1\x8a\x6d\x4e\xec\xdc\x02\xd4\x5c\x2a\x3f\x6e\xd8\xf4\xaf\xe0\xb4\xff\xed\xa4\xfe\xb5\x9c\xd4\x37\x8a\x97\x6b\x44\x5c\x6d\x4d\x9b\xc4\x31\x17\xcc\x2f\xdf\x11\x4a\x59\x51\x88\x5b\x7e\xfa\xee\x37\x75\xd7\xa0\x1a\x38\xa9\x73\x92\x7c\xe2\x83\x63\xc7\x4c\xcf\x27\x06\x8c\xac\x4f\x6f\x28\xa4\x2e\x6f\x1d\xac\xe5\x0f\xaf\x22\x5f\xf6\xf8\x5c\x09\x7a\x0d\x8b\x3c\x95\x82\xb2\xed\x6d\x2b\x25\x37\x5f\x92\x71\x59\x0f\xa4\x30\x16\xb6\xa1\xea\x01\x54\x8e\x62\xb9\xb8\xfc\x7e\xb1\x72\xea\xc4\x16\xbe\x32\x56\xb9\xf8\xff\x5a\xe7\x8d\x1a\x67\x0d\x72\xce\x10\xf4\x22\x75\xac\xb0\xe9\x15\xe7\x8e\xab\xc2\x2b\x12\x79\xb5\x53\x75\x22\x20\x65\x3a\xec\x38\xa2\xa4\xd0\xbe\x88\xe6\x32\x32\x87\xa6\xa4\xf7\xf1\x9a\x9e\x2f\x85\x6a\xc5\xcc\xc8\xed\xe2\x1f\x32\x6d\x34\x79\x24\x6b\x45\x12\xd7\xe5\x02\x35\xe9\xea\xaf\x67\xd6\xac\x29\x3b\x10\xb8\x4a\x3f\x41\x11\xd6\x40\x0f\xc8\x52\x0c\x54\x0f\x2d\x8d\x0b\xcc\x3b\x8d\xc0\x0e\xd4\xb2\x42\xb6\x33\xb6\x67\xc1\xd0\x2d\x0d\x34\x84\x61\x8b\x02\x37\x76\xf7\x8d\x1d\xf8\x90\xc9\xcd\xa0\xa9\x7f\x2d\x31\x63\x1d\xb0\xc0\x10\x1c\xb9\x06\x7f\x5c\x5e\xda\x21\xc9\x0b\xa3\xa9\x08\x45\xde\x24\x1d\xec\x69\xc2\xeb\x8f\xd6\xfa\x91\x3c\x69\x9d\xd9\x4f\x53\x1e\x5e\x58\x49\xfa\x14\xb3\x41\x98\x72\xc3\x79\xc0\x4a\x7d\xd6\x20\xcf\x3d\x1b\x56\xc8\x7b\x09\x5f\x08\x1a\xd5\xcc\x09\x72\x2f\x21\x49\x6b\x03\x01\x64\x71\x9c\xaa\x05\x46\x08\x52\x49\xf2\xdd\xce\x0e\x7b\x91\xc4\xea\xd2\x4c\x6d\x32\xda\x1d\x43\x6a\x10\xe3\xe8\x0c\x94\x23\x27\xf0\x8d\x98\xdd\x38\xc9\xa9\x15\x42\xca\x4c\xe8\x15\x25\x26\xfc\xb9\xb5\xa5\x71\x0a\xac\x31\x83\xf0\xc2\x3e\xb7\xb6\x58\xb1\x08\x96\x35\x6d\x7e\x3b\x90\xee\x9d\x9a\x02\x7d\xd6\x50\x7b\x57\x43\x5a\xda\xa0\x80\x04\xaa\x52\x9f\x08\x1c\xa6\xdc\x44\x35\x8d\x0a\x70\x64\x01\x85\x83\x9f\x56\xb0\xc1\x15\x8d\x4f\xef\xb7\x17\x14\x8a\xb4\xf8\xaa\xa1\xa3\xd3\x0d\xda\xa3\xa5\x6f\xee\x98\x28\xd4\xab\x5f\x56\x6b\xea\xbb\x26\x2d\xd4\x91\xbc\xba\x2b\xab\xaa\x9e\x6b\x5f\x94\xc3\xeb\x75\xbc\x0f\xa6\xc9\x19\x4e\xe8\xd3\x3c\x5e\xcc\x78\x0a\x3e\xcb\x3a\xc6\x41\x1c\xce\xd4\x3d\xa1\x44\x63\xcd\xf0\x0c\x5e\xad\x96\x04\x67\xa8\x3a\xf2\x69\xec\xca\xd1\x29\x86\x5f\x70\xf4\x1a\xea\x45\x63\xd3\x9e\x86\x68\xc8\x5a\x84\xd2\x25\x5e\x35\x06\xb6\x87\x31\x36\x77\x72\xc4\x90\xf6\x8b\xd2\x10\x0c\xbb\xbb\x0f\xeb\xe6\x00\xab\x17\xd7\xc8\x8c\x47\xea\xc2\xe6\xc3\xb3\xf8\x44\xe6\x82\x5a\x64\x1c\x5c\xa6\x4e\x04\x91\x7e\x86\x68\x2b\x50\x57\x92\x1f\xbf\xa0\x6b\xb1\x74\x64\xad\xe0\x21\x70\x00\xfa\x3c\x6c\x54\x38\x4b\x28\x7c\x0b\x47\x09\x85\x29\x2c\x17\x07\x0b\x0f\x1c\x32\xd0\x52\x50\x25\x63\xba\x69\xe6\xae\x60\x5f\x79\x42\x30\xb8\x7a\x1e\x58\xa8\x7a\x54\x56\xaa\x70\xea\x76\x66\x24\x08\xdb\x04\xad\xf6\x0c\x5b\xca\x5d\xd3\xea\x45\xe7\xba\x29\x0f\xd2\xf4\x4b\xd5\xaa\xd9\xfc\x25\x3e\xa0\xf7\x73\x34\xcd\x2b\x72\xdd\xa9\xa0\x12\x59\xbe\x38\xad\x76\xaf\x79\xf0\xd9\x1e\x41\xae\xb6\xc2\x2a\x36\x78\x96\x3d\x35\x6b\xc8\x36\x60\xf8\xaa\x00\x7c\x03\xbe\x80\x26\x8c\x22\x9f\x24\x19\x97\xde\x0b\xca\x2f\x02\x5d\x52\x33\x79\xbc\x39\x41\xbf\xd7\x13\x15\xfb\x41\xa3\x85\x0f\xb3\x7e\xa1\xdb\x90\x1c\xe2\x39\xcf\xc9\x79\x48\x16\x57\xef\x32\x70\x6a\xb6\x77\x9a\x7f\xe5\xb6\x62\x2d\x33\x69\x42\x33\xc3\xbc\x5d\x18\xfa\x01\x61\xa1\x3d\x2d\x09\xac\x9d\xc6\xdc\x51\x29\x1f\x3d\xe7\x2c\x86\xd9\x5e\xae\x6e\x91\x8b\x6b\x19\x80\xad\xb8\x2c\x09\x73\x07\x2e\x32\xe6\xe2\xc5\x24\xea\x84\x12\xa7\x3f\x1f\xcf\xd8\xc9\x99\x64\x33\x65\xca\xbc\xf2\x99\xfc\x0d\x61\x3c\xab\x78\x5d\x37\x5e\x70\xb9\xd1\x8c\x8a\xf3\x12\xc2\xbd\x38\x9f\xcd\xf3\xa5\x74\x67\x54\x4c\x90\x89\x2d\x6b\x64\xbb\xed\x0e\xb1\x24\x8a\x47\x9c\xdd\x6f\x77\x77\xdb\x1d\xf8\x30\x0a\x73\x7e\x9e\xa4\x4b\xf6\x7b\x1e\x4d\x57\xb2\x81\xa7\x43\xf6\x6f\xfc\x63\x28\x76\x4a\xd9\xb9\x96\x30\xa0\x58\xb5\xf3\x68\xc6\xb3\xa0\xd7\x62\xc3\xb6\x66\x04\x41\x37\xa8\x2b\xd4\xeb\x64\xca\xdb\xd3\xe4\x1c\x5d\x2a\x21\xb0\xe9\x5d\x71\x0a\xe8\xff\xc8\x8e\x8f\x07\x2d\x76\x3c\x18\x94\x56\x86\xb4\xe0\x7d\xe9\x2d\x99\xc9\xa8\x2c\xaa\x35\x28\xc0\x6e\xa0\x59\x89\x40\x60\xa9\x38\xc7\x25\x81\xa3\x74\x75\xcf\xfc\x6d\x1e\xb2\x41\x08\xfa\x37\x82\x38\xa5\x92\xf5\x3b\xa2\xbb\xc8\x74\x9d\xa5\xba\xea\xf7\x9f\x2d\xd7\xa9\xca\x4a\xe3\xed\xb7\xdb\xb9\x7e\x4e\xd4\xbf\x9e\xd1\xbb\x4c\x3c\x97\x2b\x70\xb2\x02\xd4\xde\x9e\x46\x17\xbc\xf2\x49\x4d\xa5\x33\x7d\x51\x71\xd3\xa6\xd6\x28\x9e\xf0\x34\xca\xf9\x98\x1d\xcd\xf9\x28\x3a\x5b\x4a\xce\x8e\xe2\x73\x52\x66\xa3\x76\x6d\x65\xcb\xe7\x9a\xfd\x5b\x74\xc1\x41\xbf\x92\xd7\x73\xba\x53\x6a\x7a\xb5\xd3\x45\xe2\x4d\x91\xc9\x88\xf8\x38\x3d\x17\xfb\x07\x56\x83\x8c\x87\x9a\xe9\x0b\x75\x05\xef\x5a\x95\x6f\x63\x7b\x9a\x28\xd1\x6d\xf3\x06\xdf\x62\xfa\xda\xc8\x04\x8a\xd8\x9c\x24\x25\xb4\x41\x64\x17\xd1\x1c\xd6\x02\xcf\xd4\x30\x30\xf0\xa7\x80\x02\x7f\x00\x10\x9d\xd9\xb0\x70\x89\x46\x01\x1c\x98\xe5\x8f\xdd\x28\x73\xb1\xf4\x85\x6d\xb2\x3d\x92\x58\x5c\x3b\xb2\x23\x2c\x6a\x13\x86\x14\xe3\xca\x4a\xab\x54\x25\xea\xb3\x1e\x18\x06\xb8\xbc\xf4\xda\x63\xc9\x95\xaa\x63\xd9\xa0\x18\x6f\x6d\xb1\x80\x18\x2b\x84\x90\xc5\x30\xc3\xec\x7b\x88\x68\x49\xd6\xc0\x49\xa8\x66\x4e\x62\x7a\x22\x30\xc3\x4c\xde\x6c\x96\x8c\x79\x9b\x02\x52\x96\x27\xac\xda\xb0\x7d\xc3\xd0\x1e\x34\xe6\xed\x77\x19\xeb\xb4\xbb\x1d\xb7\xab\x38\x89\xb7\xd1\x3c\x6a\xd6\x38\x13\x6a\x3f\x30\x41\x66\x75\x14\x98\x69\x0e\x54\xa7\x09\xf8\xcd\xc1\x8b\x5a\xf5\x69\x1e\xa6\x3c\xce\x1b\xcd\x66\x11\x93\x57\x93\x30\xce\x93\xd9\xbf\x1f\xb1\x5e\x5d\x44\x84\x8c\x1a\xcb\x0d\xca\xc5\x06\x58\x92\x62\x83\x58\x5b\xd8\x18\xaf\xb9\xc2\x67\xf4\xf9\xf3\x22\x7a\x74\x11\xcd\x99\x8b\x8e\xd5\xbd\x94\xeb\xf8\x50\x4d\xbe\x74\x20\x66\x45\xd7\xa0\x84\x91\xce\xd5\x73\xf2\x82\x3b\x47\x95\x75\xc8\x12\x10\x9e\x9d\xb4\xce\x73\x06\x5b\x13\xaa\x0a\x3b\x0c\xea\xc6\x49\xe5\x93\x1a\xf2\x9e\x46\xc0\x4b\x52\x36\x0b\x3f\x4a\x69\x27\x57\xda\xea\x08\xc5\xea\x66\x30\x06\x7c\xf0\x17\x48\x7b\xd8\xd1\xf3\x44\x3e\x9c\x61\x27\xaa\xd7\xb2\xb3\xb2\xc6\x6a\xed\x67\x37\x55\x22\x1b\x27\xc4\x77\x18\x46\x99\x13\xb7\x74\xc7\x6b\x38\x00\xc4\x4d\xff\x4b\x99\xd8\xb9\xf1\xd7\xf7\xfd\xaa\x0f\xbc\x56\x6a\xee\xd7\xe7\x1a\x8d\xaa\x87\x63\x36\x77\x02\x92\x87\xec\xf2\xe4\xf1\x3a\x74\xa7\x0a\xf5\x2c\x18\xb8\xa4\xee\xfd\xfb\xcd\x1b\x4f\xca\x5e\x3f\xca\xb6\x6e\x74\x0d\x95\x62\x83\x80\xda\x31\x91\xf2\x27\x26\xd7\x6b\x31\x84\xb6\xbb\x8b\x53\xc5\x9b\x12\x57\x15\x6f\x6d\x91\xd9\x51\x1f\x4d\x92\xe6\xaa\xc8\xd6\xba\x2b\x0f\xcf\xac\xeb\x62\xe5\x3b\x6f\x91\xeb\xe9\x1b\x3c\x65\x15\x09\x6e\xba\x71\xcf\x56\x85\xe3\xd4\xcf\xa2\xaa\x75\x66\x82\xc6\x2d\x3c\xfd\x0c\x8a\xc7\x1f\x68\x60\x1f\x7f\x2a\x7c\xf1\x74\x8b\x22\x45\x1f\x6d\x1e\xab\x79\x9d\x55\xa8\x2f\xc6\xfd\xc7\x90\xee\xbf\x76\xb9\x62\xe7\x3a\x55\xb9\xfb\x1c\x49\x55\xf8\xfc\xcf\xbb\x20\x65\x80\x5d\xae\xb6\x9a\x9b\x7a\x01\x66\x72\xa4\x93\x2a\x48\xc9\x2f\xf8\x48\xec\x03\x0f\x2f\x9e\x17\x46\xf2\x07\x7e\xfd\x4c\xcf\xc4\x24\x89\xa7\x49\x98\xef\xf6\x5c\x2a\xe3\x57\x6b\xba\xa1\xe6\xc3\xfb\xbe\x9a\x0f\xef\x5b\x35\xa3\x38\x7f\xe4\x54\x7b\xa6\xfc\x45\x49\x9d\xee\xc3\x62\xa5\xee\x43\xb7\x56\x01\xb7\x67\xb1\x8b\xd9\xc2\xd3\xa1\xf1\x50\xb5\x6a\x1d\x4e\xc3\xd9\x9c\x8f\x7d\x95\x65\x51\xa1\x4d\x01\xcd\xdf\xa3\x02\x9e\x0b\x1f\xa2\xbf\x47\x04\x53\xe7\x64\x1f\x8d\x79\x9c\x8b\xa3\xad\xfd\xe2\x4a\xfa\x82\x08\xcd\x8b\x6a\xda\x6a\xd9\xe6\xfa\x34\xf7\x26\x3c\x17\x12\xed\xd3\xd5\xfe\x2d\xfb\xe3\xb1\x99\xd0\x81\x0c\xd6\xe3\x16\xc2\x1c\x0e\x58\xdf\x6d\x29\xa9\xe8\x69\xa6\xa8\xe0\x6f\x54\xd6\xd9\xc2\x00\x74\x5b\x39\x73\x51\xd2\xb8\xac\xcf\x85\xd5\x29\x38\xad\x38\x35\xa4\x7c\xf3\xc0\x55\x52\xcd\x03\xd6\x5e\x5e\x9e\xb6\x52\xe0\x79\x9a\x92\xc5\xe6\x69\x27\xc5\xa0\xa7\x9d\x92\x80\xbe\xa9\x42\xd9\xe7\x69\x84\x22\xcf\xd3\x44\x8b\x3b\x4f\x23\x2d\xe7\x3c\xed\xb4\x80\xf3\xb4\x43\xc9\xe6\x69\xa4\xa5\x9a\xa7\x91\x11\x67\x03\x73\x77\x5f\x57\x05\x34\x26\x0b\x73\xf0\x51\x87\x66\x3b\xff\xd8\x17\x4d\xb9\x42\x16\x64\xa5\x7f\x1f\x2a\x6f\x05\xbb\xcb\x6a\x45\xd1\x52\x0d\x2c\x33\x0a\xa8\x91\xb7\x6f\xbb\xdc\xe8\xea\x95\x25\x76\x5f\x17\x21\x8f\xf2\xb3\x99\xe7\xf1\xce\x5d\xf6\xc7\xd3\x9f\x5e\x3d\x3e\xfc\x0f\xf6\x8f\xc7\xaf\xd9\xb3\x17\xff\xfe\xf4\xf0\xcd\xb3\x97\x2f\xd8\xdd\x1d\x17\x5a\x93\x7d\x82\xf4\x46\x29\xe7\xbf\x4c\x93\xd3\xb0\xec\xd5\x7e\xef\x91\xf6\x53\x7e\x82\x59\x2d\x44\x13\x71\xac\x8b\xd0\x26\x23\x91\x3a\x31\x19\x93\x52\xce\x9f\xea\x31\x4b\xe7\x13\x4d\x84\x3e\x6b\xe0\x02\x00\xd7\x13\xf5\x59\x50\x55\xfe\xdd\x8e\x93\x31\x57\x16\x0c\xf9\xad\x12\x01\x1c\x8f\xdd\xff\x73\xf8\x26\x38\x9e\x20\xb3\xb5\xa5\xb0\x99\xc9\x62\x1b\x19\xf9\x55\xe0\x22\xa7\x8e\xa2\x82\x9f\x6c\x4c\x20\xe4\x44\x32\x5f\x4c\xc3\x94\x1d\x26\xb3\x59\x12\xff\xfb\x11\xe3\x1f\x73\x1e\x83\xd7\xf2\x89\xcd\x01\x06\x45\xfc\x6e\x88\x44\x50\xde\xda\x22\xbf\x0c\xef\xf4\xad\xa1\x54\xd2\x63\x9e\x26\x23\x9e\x65\x27\x18\xbd\x50\xae\x57\x8b\x3a\xaf\xb0\x06\xeb\x3b\x88\xc8\xbe\x91\x1f\xda\x12\x8e\xb3\x5d\x86\x23\x68\x7a\x16\x66\x39\x4f\xb5\x34\x98\xf0\xe9\x9c\xa7\xe4\xa2\x32\x19\x73\x71\x22\xf1\x24\xd3\xc9\xd3\xa5\xe3\x46\x4a\x30\x92\x18\xc8\x9f\xed\xd3\x28\x86\x7c\x3d\xfe\xcf\x41\x63\x91\x47\x53\xe9\x4d\xc6\x46\x90\x51\x2d\x10\x8c\x7d\xa5\x32\xe5\x14\x56\xa0\xc2\x6b\xbf\x72\xad\x5c\xa1\xfd\xb2\x6a\xb9\x05\xdd\xef\xee\x37\xd5\x52\x6a\x36\x0b\xeb\x78\x73\xdf\xa4\x28\x7b\xa5\x9f\xf7\x97\x5c\xe4\x3c\x52\xc7\x18\xbc\x8f\xac\xf2\x61\x7a\x74\xff\x2f\x7e\x45\x52\xbd\x57\x5d\x80\xe3\x0c\x7a\xc9\x8c\x13\x9e\xc5\x8d\x5c\xbd\x0b\x9d\x87\xa9\x7a\x5a\x9c\xb1\x30\x63\x63\x1e\x67\xfe\xa8\x44\x9f\xdf\x59\xca\xb3\x41\x15\xdc\xa3\x64\x22\x30\x3d\xf9\xda\xad\xc3\x5e\x35\x66\xca\xe9\x5d\x75\xc1\x91\x18\x6f\xb8\x5d\x63\xbe\x7d\xc9\x4d\xad\xfa\x5e\xbf\x6a\xe3\xdb\x02\xfb\x9f\x00\x72\xdb\x75\xe9\xbc\x39\xbb\xae\xa2\x8a\x67\x77\xac\xe3\xd8\x65\x47\x21\xbb\x41\x46\x2f\x0d\x7a\x35\x8d\x2e\xf8\x74\xc9\x42\x66\xe2\x71\x48\x5f\xd5\x2f\xaa\x16\x99\xc4\x88\xd5\x31\x45\x0d\x67\x39\xd1\xe9\xa4\x07\x2d\x22\xa3\xc2\xfe\xfa\xfc\x6d\xe7\x92\x4e\xca\x43\xd5\xef\x56\x2a\xbe\x1a\x1a\x42\x32\x3b\x42\x66\x30\xf8\x4a\x6e\x30\xb1\x43\xe7\x58\xe4\x8f\x1d\xfa\x8a\xcc\x87\xcb\x19\x9b\x3b\x2f\x25\xef\x79\x8a\x77\x85\xde\x3b\xe6\xfb\x32\xda\xcf\x67\xf7\xee\x91\x52\x5c\xa2\x13\x48\x5e\x44\xb7\xc8\x97\xda\xc3\xbf\xb8\xb3\xe9\xc6\x1e\xea\xd4\x71\x0a\xa9\xa6\x8e\x32\x56\x94\xee\x2f\x0f\xd7\x48\x86\xfc\x2a\x4d\x66\x51\x56\xbe\xad\x29\xff\x84\x8a\xa4\x43\x8f\x94\x1f\x81\xb4\xcc\x94\xd6\x53\xfe\x0b\xf5\x6d\x82\xb5\xf3\xb9\xae\x65\xe7\xab\xb4\x8e\xd5\x30\x7d\xcd\x91\x66\x4e\x1d\x49\xc9\x5a\xc6\xaf\x7a\x96\xad\x75\x63\x1a\xa9\x34\x8b\xe1\x3c\x6b\x89\xfe\xb3\x16\x38\x4d\x8a\xce\xc4\x37\x3d\x7e\x05\x57\x48\x05\x9d\x4d\x55\xa7\x97\x54\xe0\x4d\x9c\x2e\x7f\xbd\xe7\xe1\xbc\x69\xd1\xc3\x5f\x4d\x92\xc5\x84\xf2\xf2\x57\x3b\xe2\xea\xa9\x95\xa4\x8d\xbf\x9a\x24\x91\x2f\x74\x70\x21\x4a\xcf\x4d\x78\x61\x68\xc9\xaf\x62\x02\x51\xcd\xa2\x10\x41\x49\x3b\xcb\xe1\x8c\x19\x3e\xdf\x87\x14\x52\x3f\x87\xd3\xe9\x69\x38\xba\x00\xe1\x04\xf1\x47\xdf\x47\xfc\x43\xd6\xf2\xce\x18\x7c\x14\x0a\xc2\xb3\xa7\xac\xdb\x85\xcf\x92\xce\xf0\x55\x69\xfb\x3f\xb0\x87\xed\x5b\xe0\x03\xa0\xc5\xc2\xd6\x96\x44\x01\x42\xad\xa8\xcf\xf0\x83\x58\x44\x83\x6e\xb3\xd9\x14\xba\x03\xe1\x32\x7d\xcb\x0c\x19\xdb\x6c\x38\x82\xea\xa2\x3a\x2e\x1e\x53\x53\x09\x10\x53\x5b\x7e\x69\xcb\x0c\xbf\x01\x76\x63\x16\x8d\x69\x2b\x84\x8a\xdd\x8b\x60\x03\x51\x1b\x57\x8f\xa9\xa9\x44\x8b\x5d\x5b\x71\x83\x68\x61\x96\x94\x54\xa2\xf4\x34\xf8\x1f\x2e\x5b\xaa\x59\xc1\x6a\x60\x9e\xb3\xc8\x9d\x58\x27\x44\x21\x02\xe2\xa0\xb8\x2d\x17\xa3\x7f\x89\xff\x46\x94\x97\x01\xe0\x81\x61\x69\x7c\x65\x83\x59\x45\xcd\xb3\x2c\xdd\xc2\x68\x73\x2a\x06\x91\xaf\xcc\x09\x47\x64\x16\xcf\x9e\xda\xd8\xc9\x34\xef\xdb\x8d\xac\x15\xae\xeb\xe3\x3c\x3b\x55\x0b\x2b\x7d\x8f\xb8\x53\xca\xe9\x75\x9a\x58\x2b\x5e\x57\xcf\xe4\xb2\xb0\xaa\x16\x56\xbe\xae\x6e\x26\xd7\x0e\x0d\x72\x45\xd5\x70\x92\x8b\xa6\xf4\xa1\x82\x37\xe2\xc4\xa3\xcd\x1d\xfd\xce\x79\xae\x33\x3c\xfb\x76\xaa\x87\x6a\x1f\xad\x11\x9a\xa2\x4a\xad\xc9\x27\x61\x0e\x4f\xa0\xde\xf3\x34\x3a\x8b\x50\xee\x9f\x72\x37\x85\x2e\x51\x11\x34\x66\x81\xe8\xba\xc5\x1a\xaa\xac\xe1\xd5\x5d\x54\xa9\x87\x4a\x9b\xc7\xa4\xfc\xca\xa8\x64\x74\x9f\x02\x91\x64\x91\x9f\x46\xb2\xd0\x43\xa2\xcd\xbd\x16\xbe\x32\x12\xa1\xda\x57\x20\xcf\x11\xcf\xfd\xa4\xf1\x46\xac\x7e\x74\x23\x89\x44\xbe\x26\xb2\x18\x4d\xb7\x40\x1a\x59\xe4\x27\x8f\x2c\x2c\x92\xe8\xfb\xcd\x6e\xda\xef\x2c\x64\xb8\xae\x51\x7e\x47\x00\x97\x27\x15\xdc\x88\x94\x05\xc1\x18\xd1\xee\x0c\x87\x3c\x43\xb3\xe6\x9d\x96\x3c\x73\x4e\x17\x7c\x0f\xae\x8d\x6e\x5d\x35\xa5\xfe\x39\x94\x67\x4a\x6d\x39\x56\x31\x65\xfb\x7d\x76\x47\x21\x79\x87\xd8\x72\x65\x2c\x4c\xf4\x08\x82\x73\x68\x9f\xdd\x41\x37\xfa\x3b\xec\xc0\x78\x3e\x05\xc9\xe9\xbb\x26\xfb\xa4\x83\xb6\xe9\xc7\x95\xfb\xec\x8a\x3c\x20\x70\xeb\x25\xa7\xef\x0a\x9d\x79\x90\x49\x4e\xdf\x59\x5b\xb2\xa8\x21\x2b\x63\x29\x24\xce\x28\xc4\xed\x3c\x30\xa8\xee\xd9\x28\xed\xdf\xba\xa5\x0c\xe2\x63\x7e\x16\xa2\xca\x30\x02\x3f\xe1\xc7\x71\x34\x0b\x73\xfe\x3c\x8c\xc3\x73\x08\xa0\x07\x74\xcb\x78\xfe\x3a\x3c\x7b\x13\xcd\x78\xb2\x28\x3d\x36\x7d\xdf\x6d\x7a\xeb\xf7\x44\x03\x08\x7d\x96\xcc\x5f\x63\xf5\x27\xd8\x6b\x60\x57\x14\xcd\x35\xa9\x4a\x5a\x78\x09\x28\x08\x64\x38\x80\x1d\xc0\xf7\x3d\xf6\x89\xc9\xd1\x41\xbe\x65\x76\xb5\xcf\xae\x68\x07\xb9\x8c\x27\x13\xa6\x29\x01\x09\xdf\xda\xca\xe1\x17\xca\x0e\x58\x98\x0a\x45\x08\x8b\xce\xd2\x64\x06\xdf\x6d\x70\x3e\xf2\x91\x14\xef\xa3\x45\x9a\x1e\xe5\x4b\xb8\x37\xc0\xac\x9b\x68\xad\x8c\xc7\x53\x7e\x38\x09\xe3\x73\x4e\x14\x3b\xeb\x7b\xe0\x1a\xe7\x16\xd3\xa9\xd4\x09\xe4\x53\xfc\x49\xb2\x98\x8e\x8f\xf2\x64\x4e\x6e\xe1\x64\x11\xcf\x55\xa7\x34\x92\x0e\x7c\x0b\x86\x99\xf8\x87\x1a\xe8\x0c\x24\x37\xc4\x81\x32\xb4\xe9\xaa\x36\x99\x24\x28\xd3\x0a\x0c\x8d\xf8\xb5\x6d\x87\xa4\x76\x61\x6a\xa8\x2a\x1c\xc2\x72\x8a\xaf\x0b\xe0\xaf\x7d\x5a\x36\x34\x85\x6a\xee\xf0\x0b\xd1\x6e\x19\x50\x5a\xb7\xcf\x8e\x3b\x03\x5a\x98\xf2\x0c\x47\x6f\xba\xc8\xda\xd9\x34\x1a\xf1\xa0\x6b\xc7\x9f\x93\x0b\x06\xa1\x91\xdc\x36\x74\x1c\x41\xa7\xe5\xf2\xba\x5a\x50\xcd\x40\xd1\x19\x6e\x14\x20\xe3\x6a\x8b\x74\xdf\x6c\x01\x68\xd3\x67\x29\x55\xf4\x7c\xc9\xfa\x9b\x77\xed\x04\x5b\x2b\xcc\xad\x1a\x3b\xd2\x07\x47\xaf\x0f\x01\x0d\x76\x60\xfd\xda\x53\x52\xd5\x30\x41\x9f\xdc\x7d\x19\x72\xd1\x15\xa0\x26\x17\x4b\x2c\x6e\xd7\xd5\x9a\x05\xbc\x3c\x68\x69\xa3\xa0\xe9\x07\x8b\x03\x6a\x1b\xa6\xf6\xc0\x4f\xd2\x59\x27\x99\x13\xb9\x2c\x7e\x06\xe4\x60\x42\x57\x14\x89\x84\xae\x1c\x7d\xc2\x34\xb7\x1a\x87\x69\x1e\x58\x8b\x89\x79\x17\xa5\x33\x9f\x19\x1d\xa5\x04\xbd\x38\xcd\x46\x69\x74\xca\x29\x78\xf5\x2d\x18\x52\x42\x99\xae\x1c\x21\x62\xd5\xd2\xec\xa5\xee\xc3\xf4\x4e\x44\xf9\x78\x2d\x31\x64\xc1\x53\xc2\x48\xf2\xac\x66\x5e\x8b\xf8\x57\x05\xe5\x60\xb3\x9b\xe8\x1b\x57\x0e\x8a\x9b\xa1\xb5\xb2\xd4\xae\x96\x86\x67\xa5\x16\x5c\xb3\xf7\xa5\xe1\x59\xd5\x8e\x97\x86\x67\x5f\x76\x9f\xb3\x86\x12\x8c\xa4\xc9\x86\xe4\xfb\xd2\xbb\xba\xfb\x02\x82\xfd\xc8\xba\xa2\x5b\xfd\xfd\xb8\xeb\x64\x91\x84\xad\x91\x14\x42\x6a\x36\xb2\xe3\x89\x5e\xc1\x37\xdb\xec\x48\xb0\x2e\x7e\x9f\x8f\x31\xc7\xa3\xc1\x92\x7c\x0f\xe2\xe4\x03\xdd\x96\x34\xa4\x1f\x58\xc7\x96\x27\x12\x7e\x9c\x7c\x28\x08\x8b\x38\xf9\xc0\xb6\x4d\xa5\x1f\xd5\x38\x09\x00\x49\x0a\xe8\x6e\xbf\x08\x75\xbb\x2b\x81\xe2\x95\xc7\x27\x2a\x79\xc5\x24\x13\x79\x4b\x90\x2f\xc8\x9d\xd5\xf5\x8b\xeb\x63\xb3\x1b\xde\x5a\x9e\x1a\xf2\x06\xbe\xc9\x3e\xed\xec\xb0\x5f\x78\x0c\x3e\xef\x63\x76\xba\x64\x87\xc9\xd9\x19\xe7\x47\xa3\x34\x9a\xe7\xac\xdb\xee\xf6\xda\xbd\x5b\xee\x45\xbb\x3e\xc2\xc4\xc9\x11\x46\x0a\x6e\xb1\x49\x2a\x48\xdc\x62\xd3\x24\x1c\xbf\x81\xbf\x10\xe3\xdf\xf4\xef\x38\x19\x93\x5f\x8b\xb9\xf8\x57\x07\x89\x52\xe2\x7d\xce\xd3\xb3\x24\x9d\x85\xf1\x08\x13\xc2\xdd\xd1\xdc\x06\xca\xb0\x5b\x8c\x2f\x6f\xed\x82\x36\x61\xa0\xc2\x91\xc5\x19\x09\x11\x66\x0e\x04\xbd\x85\xa0\x0f\x00\x30\x81\x85\xa8\xf4\x2b\xf0\x21\x49\x8a\x0c\x82\xd2\xc3\x00\xe9\x74\x0d\xfc\x02\x9b\xe2\x41\x93\x6d\x5b\x24\x6d\xb2\x1d\xd6\xe5\x0f\x09\xd6\x4c\x4e\x0a\xeb\x3b\xbd\x63\xa1\x0d\xcf\xdf\x37\xa8\xa9\x3a\x80\xed\x44\xa8\x56\x08\x22\x70\x63\xb6\x4e\xd2\xe3\xce\x80\xdd\x65\x5d\xfe\x3d\xbb\x27\x7e\x75\x07\x16\x2a\x36\x37\xa8\xa3\x26\x19\x0e\x56\x43\xb6\x20\x18\x2f\xe6\xd8\x1d\x82\xc6\x4a\x74\xd8\xda\xd5\x44\x7f\xd8\xd6\xbc\x65\x4d\xdc\x93\x30\xbf\x2e\x6b\xa8\xa6\x40\x73\xc5\xe0\xd6\xe8\xa6\x06\x1b\x53\x99\x20\xb0\x76\x97\xd2\xd6\xcd\x03\xc8\xb0\xf7\x06\x49\xb0\xba\x73\x5f\x33\xbc\xbd\xbf\x75\xd5\xc4\x3b\xf7\x7c\x12\x65\x60\x39\xd8\xf9\x1b\xcb\xc0\x66\xfb\x3c\x9c\xcf\xa3\xf8\xfc\xf7\xd7\xbf\xf5\xc9\x22\xd8\x8e\x93\x0f\xed\x77\x59\x7b\x16\xce\x37\x76\x69\xd9\xf5\x38\xb2\x7c\xbf\x59\x2c\x95\xcf\xa6\x06\x64\x93\x70\x3a\x4d\x3e\x40\x64\x44\xd6\xb7\x52\x57\xc0\x0e\x1f\x65\xaf\xa6\x61\x14\x63\x7f\xbd\x52\x95\xa0\xd7\xf4\x36\xd8\xad\x50\x0e\x6c\xc8\xa4\x3d\xe0\x52\xd6\xd5\xfd\x87\x6e\xcd\xea\x3e\x10\x18\x69\x03\x67\xa9\x32\xe8\x18\x66\x86\xd6\xac\x86\x8e\xc0\xbe\x99\x5c\x0a\x26\x97\x2f\xa8\xf2\x11\x06\x16\x60\x1f\x43\xdc\xb9\x9f\xac\xc0\x15\x8f\x31\xde\x9b\xfe\x5c\xc8\xfc\x74\xe5\x6e\xcc\xba\x51\x9d\xc3\xa0\xa8\x0c\xf7\x64\xc4\x0d\x12\x9d\x34\x1e\xeb\x44\xae\x10\xce\xcd\x00\xff\x69\x1d\xe0\x3f\xf9\x81\xff\x64\xb2\xc4\x96\xc6\x93\xbc\xa5\x23\x44\x66\x8f\x8d\x43\xce\x85\xf4\x76\x7a\xdc\xdc\x27\x15\x7e\x2a\x56\xf8\xa9\xa9\x55\x16\x00\xa1\x94\x65\x81\x0d\x34\x71\x0c\x1e\xa5\x08\x9c\xfe\xea\xfa\xaa\x39\x0e\x52\x70\x7a\x97\x3d\x12\x3f\xab\x88\xf5\x59\x67\x9f\x45\xec\x07\x46\x11\xd8\x67\xd1\xbd\x7b\x4e\x08\xcc\xc7\x32\x1a\xd0\xe3\xe3\x88\xc6\x48\x14\xc3\x3c\x16\xc5\x03\xcd\x04\xf8\x93\x28\xc7\x49\x9c\x47\xb1\xc9\x01\x06\xff\xec\xec\xa8\x00\xba\x10\xcc\x0e\x3d\x51\x30\x7a\x42\x92\x4a\x3a\x19\x2b\x82\xd0\x7b\x95\xc4\x30\xba\xaf\xe9\xdb\x35\x17\x95\x37\xd0\xd8\x49\x0e\xc2\x9f\x94\xf0\xa6\x52\xa9\xb9\xc9\xc9\x0b\x60\xd4\x02\xd5\x31\x4a\x4e\x1f\xa6\x2d\x4a\xa2\x7a\x19\x07\xa8\xbe\x88\xe0\xe9\x16\xb0\x06\x39\x4a\x9b\x51\xa2\x7c\xee\x21\xdc\x76\x78\x35\x50\x4c\x65\x4d\x09\x7c\x19\x58\xf3\x81\x9f\x56\x07\x4c\xbd\xe5\x88\x1f\x8f\x34\x3b\xc4\x38\x92\x81\x8a\x24\xd8\x62\x31\xff\x98\x43\x10\x51\xfc\xf3\x28\xd7\xa9\xf5\x24\xac\xdb\x96\x20\xd4\xd9\x31\xe7\xa6\x0d\x34\x47\x12\xfa\xeb\x66\x02\x28\x85\xef\xe2\x26\x4e\x72\x02\xb5\x24\xe6\x71\xae\xce\xaf\xab\x10\x73\x86\x84\x89\x5a\xbd\xad\x44\x77\x3b\x77\x19\xcf\xa6\x51\x9c\x6f\x8f\xa3\x4c\x3e\xdc\xdf\x06\x87\x8f\xed\x94\x87\x59\x16\x9d\xc7\x96\x1b\xde\x7c\x91\xf2\xd7\x3c\x1e\xf3\xf4\x09\x1f\x25\xb0\x8d\x42\x24\x50\x40\x11\xf1\xd0\x3f\x49\xa2\x11\xef\x58\x58\xdf\x3f\x46\x81\x57\x89\xbe\x44\x7f\xfa\x6c\x2b\x1e\xf4\xf6\x0b\xaa\xe1\x17\xf3\xb9\xab\x13\xb1\xeb\x9c\xe7\xd4\x5f\xda\x71\x9f\xa3\xa5\x2f\xcf\x2a\x1d\xe9\x68\x55\xcf\x9d\xd9\xe6\xae\x74\xe0\x1b\x5c\xee\xb2\xd6\xbd\x7f\x9f\xb8\xac\x3d\x13\x6a\x48\xc6\x91\x69\xca\x2e\x75\x1e\x92\x06\xaf\x79\x56\x7a\x17\xa9\x21\x8f\xc2\x2c\x7f\xac\xc2\x27\xbc\x54\xa1\xaf\x7c\x6d\x1e\x75\x3b\x2b\x82\x55\xca\x34\xfa\xf2\xbd\x9c\xbe\xcb\x8c\xe2\xd1\x74\x31\xe6\x63\x16\xc5\x2c\x9c\x4e\xd9\x79\xf4\x9e\xcb\x56\x10\x1d\x61\x91\x45\xf1\x39\x3b\x3e\x39\x0a\x67\x1c\xc2\xd5\xfe\x37\x4f\x93\x93\x41\x20\xf3\xf1\xd4\xce\xc5\x93\x85\x33\x0e\x7d\xff\xc9\xd3\xa4\x29\x20\x8b\x4d\x18\x22\x87\x46\xf9\xd2\x0e\x9c\x0f\xae\xdc\xe9\x98\xa7\xe0\xd9\x44\x6e\x60\x75\x60\x03\x12\x02\x5a\x80\xd2\x91\xce\xc1\xe8\x92\x4f\x38\x3b\x8b\xd2\x2c\x5f\x33\x28\x56\xa7\xdd\x75\x5f\x6b\x03\xf1\xa9\x53\x58\xbb\xdd\xb6\xf2\xac\x66\x24\xd1\xaa\x0c\xfb\x20\xb6\xf5\x1a\xa9\x19\xc4\xe1\xd2\x64\x83\xd0\xec\xa3\xf3\xe6\xf9\x9f\x7f\x47\x84\xcf\x82\xe3\x5e\x8b\x75\x07\x2d\x26\xfe\xdd\xb5\x62\x5f\x1d\xf7\x06\xda\xe5\x2c\xb2\x59\x53\x31\x9f\x59\x15\x32\xf0\x96\x36\x46\xcd\xc2\xf9\x1c\x82\x3b\xab\x15\x20\x6b\xb4\x7c\xfc\x48\x43\xaf\x05\xd8\x52\x29\x13\x5b\x5b\x12\x94\x13\xa6\xab\x33\xc0\x48\x23\x07\x85\x95\x23\x01\x60\xf1\x1e\xc6\xe5\xf2\x2e\x7e\x3a\x26\xcf\xe2\xdf\xdc\x67\x47\xe5\x38\x2e\x75\x2e\x55\x4b\x14\xc6\xf4\x0c\x17\x51\xe9\xab\x8e\xef\xbf\xf3\xd5\xfe\x23\x2a\x7d\xd0\xfe\xa8\xd3\xa3\x2d\xea\x4a\xa1\xdf\xe3\x30\x2d\x8b\xbe\xd5\xeb\xf6\xb4\x54\xc1\x34\xc7\xa5\x63\x7b\xf0\x85\x5c\xa8\x9f\x47\x82\x21\x9f\x87\xf9\xa4\x3d\x8b\xe2\x5a\x6f\x48\x24\x20\x86\xa1\xb4\xec\xf5\x70\xd2\x72\xc3\xbe\x28\x31\xe3\x89\xfc\xd2\x92\x22\x70\x34\xe2\xf3\xdc\x96\x94\xde\xc5\xbc\x22\xeb\xb2\x6c\x53\x21\x0b\x0a\x81\x5f\x8e\x15\x56\x28\x42\x34\x8e\x34\xf4\x8b\x4c\x9d\x5c\x06\x01\xa5\xa6\xd8\xf5\x11\x86\xf9\x5d\x0e\xa5\xb6\x4c\xca\x26\x10\xee\xdc\x9b\x42\xa6\xb0\x70\x95\x84\x50\xa3\x68\x11\x5c\x68\x80\x19\xbd\x4e\x08\xaa\x07\x9e\x65\xb1\x67\x7f\xf3\x67\x74\x16\xa2\xa4\x98\x66\xe1\x37\xbb\x4e\xb1\x82\x0a\x68\xa7\xeb\xb6\xf4\x2d\xc6\x68\x02\xc8\xe9\x2c\x83\x32\xdc\xbe\xaa\x30\x0b\x3f\x6a\xe8\xcf\xe2\xb3\x28\x8e\xf2\x65\x21\x54\xce\xf1\x80\x06\xc9\x51\xfd\xd9\x29\x15\x64\x42\x6a\x35\x0c\x55\x89\x64\x55\xd0\x78\x6e\x6d\x39\x91\x7a\xb4\x54\x28\x48\xe8\x96\x11\x02\x81\x6e\x63\x45\xc4\xa7\x03\xd0\x6b\x30\xa0\xa9\xb0\x5b\xa6\x8e\x6c\x89\x54\x31\x38\xb2\x3e\xbb\x4d\x66\x6f\x6b\x8b\xe9\xce\xc0\x0a\xa1\x2e\xbc\xfa\xac\xdb\xeb\xe0\x9d\x97\x01\x2f\x3f\xeb\xb8\xf6\x07\x4c\x7a\xf6\x82\xb4\xb5\x46\x8d\xd9\xb4\x65\x3d\x2b\xeb\x2d\x8e\xc6\xa1\x61\x67\xa0\x2f\xc6\x8a\x71\x8c\x32\xce\x85\xa8\x91\x43\x91\x55\x93\x45\xce\xd3\xbd\xf2\xcc\xdf\x02\x09\x2b\xe0\x1a\xfb\x81\x10\x87\xcc\xa6\x7c\x17\xc3\xac\xa4\xe0\xfa\x54\x28\x68\xb5\xc8\x31\x5b\x82\xa2\xd3\x81\x89\x8c\x24\x1d\x8f\xf7\x54\x6e\x24\x09\x15\x21\x06\x84\xd0\x97\x97\xf2\xb3\x38\x14\x76\x9a\xca\xc3\x18\x2f\x0a\xcd\x51\x57\x0c\x95\x5c\x2e\x1f\x68\x71\x0f\x25\x2d\x8d\x8e\x9d\x59\x40\xad\x4c\x1d\xb0\x58\x55\xb3\x16\xb2\x6e\x42\x8e\xbd\xbe\x05\xa5\x0e\xbf\x92\xb0\xdb\xdb\xaa\x12\x3d\x2d\xc3\xc5\xa6\xdc\x63\x5d\x1e\x33\xf7\xe0\x32\xf9\x82\x28\x27\x08\x3b\x23\x83\x3f\xfc\x43\x73\x86\xe7\x2e\xb8\x92\x81\xda\x10\xec\xeb\x7a\x65\xce\x41\xfe\x21\x37\xf6\xb7\xec\x7f\xc1\x0b\x88\xf3\x98\xb6\x16\xbf\xf1\xc9\x9d\xc6\xb5\x98\xac\xd4\xbc\xcb\x43\xde\xb8\xd6\xcb\xbc\x67\xd5\x1a\xd2\xe6\xfe\xba\xd8\xc9\x98\x7f\x7c\x59\x76\x93\xff\xdd\xf7\x34\xaa\x7a\x79\xc2\x28\xb1\x8b\xe3\xf4\x60\xee\x24\xb9\x81\x7a\x42\xb8\x41\x2c\x74\x8c\x70\x29\x14\xe5\x30\x96\x4b\x3d\x4f\x58\xc6\xc3\x74\x34\x81\xb7\xd4\x35\xb6\x6b\x54\xde\x89\xee\x5e\xb6\x5d\xdf\xbd\x62\x79\x98\x9e\xcb\xf4\x6b\xfa\x15\x88\xea\x2d\x49\xd7\x78\x04\x88\x80\xe0\x15\xe0\x59\xb2\x88\xc7\x95\xef\xff\xac\xed\x4f\x89\x77\xe7\x21\xa0\xbd\x1b\xaa\xd8\xc9\xec\x80\x75\xd4\xfe\xa9\x23\x45\x1a\x3b\xce\x6d\x23\xdc\xc8\x14\x5a\x3d\xb4\x84\x78\xf9\x11\x2e\xed\x4b\x03\xfa\x29\xd4\x3c\xbc\x75\x33\xe1\xd9\x7e\x8e\xe2\x71\x55\xe8\xd9\xef\xbe\xa7\x4f\xc6\x9e\x65\x2f\xc2\x17\xa5\xca\x74\xa7\x69\xe2\x0a\x8d\xf2\x6a\xae\x7d\xd4\xe9\xd6\xcc\x05\x20\xf8\x16\x20\x99\xa8\x1b\x27\x82\xff\x00\xfe\x09\x3b\x15\x73\x9c\xd5\x08\x25\x48\x55\xc8\x5a\x1c\xe9\x79\x96\xe4\x32\xa4\x13\xa5\x50\xa3\x85\xaa\x66\xc9\xa2\x21\x7c\xac\x1a\x52\xed\x10\x9b\xc9\x88\xb6\xb3\x30\x1f\x4d\x94\x7a\xa8\x38\x79\xbb\xeb\x8d\xed\xe1\x65\x31\x8d\x92\x65\xcd\x33\x4f\x4c\xe1\x2f\x79\x4e\xb4\xe6\xad\x14\x8e\x3c\x35\x5a\xcc\x43\x15\x23\xe0\x11\xda\xa0\x4a\x7a\x42\x57\x1e\xe6\x5e\x3f\x8e\x5c\x15\x03\x9d\x29\x3c\x65\x86\x08\xfc\xf2\x5b\x98\xe5\xf2\xab\x64\x2c\x10\x7c\xd5\xa1\x2c\x6f\x8e\xc3\xcc\x01\x63\x9e\xf2\x71\x34\x0a\xf3\xfa\xc1\x29\xaf\xc9\x77\x6e\x40\xe3\x63\x51\xf4\x3a\x3a\x9f\xe4\x03\x1d\xd2\x58\xf6\x14\x9f\x63\xc0\x8c\x54\x94\x0a\x60\x53\x7e\xe6\x1e\x6d\x6e\x92\x7b\x0b\xac\xa4\x89\x42\x58\x09\xff\x04\x84\xcb\xc4\xb3\x73\x0e\x51\x3a\xaa\xa1\xd0\x3d\x16\x68\x20\xec\x80\x75\xd9\x1e\xdb\xee\x5a\x01\x37\xad\x72\x99\xa8\x8d\xed\x31\x57\x6f\xb5\x02\x05\x68\x6c\x03\x4b\x3b\xc5\xe6\x2d\xa9\x64\x17\x2e\x15\xa0\xd4\xab\x77\x94\x6d\x0a\x16\xa9\x0a\xeb\xe6\x51\x67\xdd\xec\xa9\xab\x62\x1e\xbd\x08\x5f\xf8\xa3\xbc\xaa\x50\xac\x18\xdf\xe2\x4b\x3e\xed\x87\xc4\xed\x35\x22\x1d\xbd\x08\x5f\x78\x42\x1c\x19\xdd\x5e\x1e\x04\xca\x23\x13\xbd\x08\x5f\x78\x28\x5c\xc7\x11\x94\x52\xb8\x5a\x21\x53\x1b\x1b\x84\xea\x90\x8e\x2c\x99\x8a\xe1\xac\xcc\xb6\x18\x95\x5f\x5b\x6e\x4d\x6e\xc9\x16\x8b\xda\xbc\xcd\x4e\xfa\xfd\x7e\xe5\x1b\xdb\xff\x9b\xb7\xbe\x7a\x9b\x56\x21\xf8\xae\xc1\x77\x9b\x75\xfd\x76\x0f\x1a\xff\xbb\xe4\xec\x4a\x45\x00\x5d\xf8\x66\x6b\xbd\x81\x35\x6f\x8d\xd0\xc3\x91\x75\x5c\x2f\x0b\x31\x57\x49\x04\x0c\x69\xe5\xb3\xf4\xcd\x13\xc6\x3f\x8e\xf8\x3c\x47\xf3\x5d\x44\x2c\x78\xe4\xfc\xf6\x2f\x38\x01\x14\xd3\xbb\x9a\x93\xfb\xda\xa6\xb9\xcf\x73\x8a\xf8\x23\xca\x27\x0e\x1f\xfa\x8d\x74\xae\xf5\x64\x8d\x73\x46\x3d\x8e\x34\xdd\xaa\xe0\xf3\x94\x47\x8b\xdb\x11\x79\x37\x50\x3b\x8d\x7c\x61\xe8\x1e\x06\xbd\x81\x04\x64\xf3\xf9\xb4\xcc\xe2\xfe\xa8\x73\xff\x4b\x19\xd2\xc3\x8f\xda\x90\x1e\x7e\xac\x9b\xa4\xf9\x35\xcf\x72\x25\xe1\xf3\x34\x8c\x33\x94\xf1\x02\x85\x94\x17\x6e\xcf\x3c\x4b\xc9\x30\xfb\x99\x2f\xd3\x17\xd2\x26\x44\x60\xd0\x84\xe7\x3c\x65\x79\xe2\x95\xd3\xc7\xf0\xf6\xa3\x2f\x00\x48\x6e\xda\xee\xe2\xf2\x84\x02\x36\x4f\xb2\x48\x69\x00\x1a\x45\x0d\xb5\x64\x11\xea\x61\x01\x20\x33\x2a\x53\xe0\xac\x3c\xd3\xd4\xb5\x8b\xab\x91\x39\x2b\x2c\x79\xcf\x53\x7d\x9d\xd6\x42\x5c\x5b\x06\x3c\xb2\x32\x8e\xa0\x6f\x66\x2b\x90\x5f\x9c\x07\x00\x01\x19\xbd\x10\xff\x4d\xb6\xa7\x20\x76\xe8\x45\x5b\xc1\xd3\x55\x45\x28\xa6\x2f\x0f\x8c\x05\xb2\xb8\xa2\xc9\x9a\x36\x38\x09\x00\xa6\x73\xdd\xaf\x69\xa3\x2c\xae\x68\x1e\x9f\x2a\x23\xf1\x2d\x62\xea\x2b\x5b\xf5\x8c\xd9\xbb\x10\x60\x8b\x53\xce\xee\x31\x9a\xb8\x16\xed\x60\x06\x65\x92\xce\x56\x2c\x85\xc7\x38\x4a\xf5\x64\x0d\xdb\x77\xa5\x8d\xac\x80\x04\x54\xb0\x6c\x95\x08\xc1\xc1\xa3\xd8\xbf\xa9\x09\x20\x30\x6c\xaa\x9c\x53\x94\xa1\xb2\x4b\x95\x75\x4a\xf0\xba\xe4\x01\x74\x41\xd1\x10\x9a\x15\x51\x07\x14\xf7\x78\x64\x53\x1d\xaf\x0d\x5b\x9d\x93\xb1\xfe\xc2\xa9\xbc\x8d\x7f\x0f\x1b\xd5\x89\x62\xe9\xbf\x01\x8e\x27\x88\x9f\x7b\x98\xcb\xd8\x89\xf8\x72\x22\x20\x69\x41\x74\x22\x6a\x9e\x30\x15\xdd\x4f\xc8\x0d\xf1\xe5\x71\x7a\x8e\xc7\x55\x8c\xa0\xa6\x32\x13\x89\x62\x41\xcd\x4a\x85\x6f\x85\xc8\x40\x64\x0a\xfb\x2f\x76\x0a\xb5\x3d\x38\x01\xe2\x6d\xaf\x5a\x79\xae\xae\xe4\x14\x92\x24\x31\x03\x34\x83\xc1\x3a\x32\xe0\xae\xbd\xf8\xe5\xc5\x8e\xd5\x13\xdd\x62\x9d\x99\x7f\x9c\x9e\xb7\xa0\x67\xb9\xf4\x65\x60\x0e\xb2\xb8\x14\x3f\x42\x5c\x8b\xce\x1e\x5d\xd4\xc6\xa9\xfc\x71\x7a\xae\xef\x5f\x32\xce\xba\xe5\xd5\xb0\xb7\xe3\xce\x80\xd6\xef\xd5\xa8\x2f\xff\xe8\x5a\x0d\x77\xd7\x69\x28\xff\xe8\x0d\xdc\xcc\x0e\xd0\x16\x29\x63\xd3\xa4\x64\xaf\x16\x35\x3d\x6b\x60\x73\x27\x1e\xb1\xcf\x1d\xf1\xfc\x4d\xa2\x43\xac\xf8\x77\x6a\xe5\x9a\x03\xf6\x94\x97\xa5\x0f\xb3\x1f\x75\xbe\x27\xc6\xc1\xa3\x42\x78\x21\xb5\x41\x1b\x6e\x11\x1c\x27\x89\x72\x82\x71\x82\x36\x59\x1f\xb3\x64\x1c\x9d\x95\x65\xef\x44\xf0\x72\x95\x38\xa1\xae\x56\x6e\x73\x94\xb7\xe5\x73\x67\x42\x34\x45\x96\xc0\xa1\xa7\xd7\x39\x83\x34\xf5\xcc\xe9\xe6\xbe\x19\xe0\x4c\x1e\xc6\xe5\x73\xa4\xbc\x2d\xec\xe7\x0b\xa5\xd5\x75\xaa\x33\x88\x30\x5e\x51\xb1\xa6\x5d\x98\x8c\xdf\x6f\xa2\x98\x24\x39\x9b\x26\xc9\x1c\xc9\x1a\xc5\xe7\x7f\x09\x8e\x28\x2e\xa5\xdb\x0e\x81\x0f\x0c\x09\x49\xa6\x47\xa5\x18\x99\xa0\x44\x2a\xea\x90\xfd\xba\x04\xeb\x35\x14\x9e\x8d\x96\x14\x93\x8d\x51\x12\x9f\x45\xe7\x0b\xc8\xb3\xd4\xc0\x37\x26\x38\x61\x0d\x93\x7f\xa9\xb1\x87\x67\x01\x59\x00\xa7\x8a\xc6\x9e\x66\x95\x40\x76\x2f\x8b\x3f\xa4\x51\x4e\xa0\x55\x25\x71\x74\x46\xed\x61\xe8\x75\xf3\x17\x69\xe7\x3c\x32\x8f\xe2\x2c\xab\xb3\x8c\x38\xa1\xc9\x56\xb9\xad\xf5\xda\xf7\x4b\x93\x8c\x54\x1a\x4e\x74\x5c\xdf\x64\xe6\xd5\x72\x6b\xa9\xc5\x7a\x31\xda\x2d\x8b\x29\x21\x55\xc0\x59\x27\x27\xa4\x9e\xa1\x4f\xac\x11\x36\xf6\x58\x97\x5d\x35\xbd\xe9\x21\x65\x7b\xcb\xcb\xcd\xb4\x69\x31\xf3\xb7\x2f\x5f\xa4\x6c\xad\x3c\xd1\xd4\x4f\x3b\x63\x24\xf2\x02\xdd\xdc\x35\x76\x45\x7b\x5d\x41\x07\xa7\x76\xbc\x0a\x95\x4f\x81\xf4\x70\xd2\x17\x89\x10\xa4\xe2\x07\xba\xb2\xb1\x3c\xfe\x33\x84\xa3\x16\xb2\x87\x46\xb4\x79\x29\x83\xcd\x36\x6c\x40\x0d\xa9\x4b\x88\xfa\xc1\xa7\xab\x16\x6b\x88\x75\x7c\x65\x2b\xcb\xa2\x70\x8d\x60\xd0\x76\x0f\x1e\xba\xad\x73\x27\xe3\x06\x44\x14\xb2\x58\xb5\xc9\xd8\xe9\x92\xa4\xf2\x12\xba\x0f\x5e\x43\x47\x31\x0b\x59\x36\x0f\xd1\x05\x2d\x9a\x4e\xa3\x0c\x1f\x5a\xea\x73\xf8\xaf\x2f\xdf\x0c\x0f\x5f\xfe\xfe\xe2\x0d\xeb\xb3\x47\x9d\x0e\xca\x19\xf1\xf1\xe8\xd5\xe3\x17\xac\xcf\xba\x0f\xbf\x8c\x25\xe0\x45\xf2\x81\xbc\x9a\xf4\x78\x04\xdb\x42\xa7\x31\x9d\xe2\x26\xc4\xc4\x1e\x25\x74\x7a\x9d\xb6\x4c\x4a\xf2\x13\x16\xc5\x59\xce\x43\xc8\x43\x6e\xb4\x9a\x0f\x13\x1e\xb3\x28\x6f\x64\x40\x25\x3e\x66\x27\x9a\x02\x27\x90\x51\x2d\x49\xb9\xcc\x85\x16\xc5\x58\x28\x28\x01\xe7\x0b\x8b\x80\xd7\xdf\xf9\xc4\x69\x3e\x8d\x0a\xae\xb6\xe5\xa2\x0a\x06\x0a\x3e\xff\x25\x67\x79\xad\xe5\x9c\x59\xc9\xc0\x47\xc9\x02\x94\x8d\x8e\xb6\x87\x85\x59\x7e\x88\xc3\xee\xcb\x57\xfa\x55\x07\xf3\x2c\x0f\x67\x73\x7d\xd2\x7e\x91\x7c\x08\xc8\x99\x3a\xe5\xb3\x30\x8a\x71\x3f\xd5\xfc\xb2\xcd\x02\x6c\xb4\x4d\xfa\x52\x27\x6d\xab\x77\xa8\x66\xdc\x7f\x0c\xb4\x1f\xe9\xfb\x7e\x51\x74\xef\x1e\x8e\xe3\xc7\xbe\x61\x56\xcf\xe3\x15\x13\x83\xa0\x33\xf0\xbe\x61\x31\xaf\x9a\x24\x55\xe8\xb1\xb9\xa8\xfe\x9b\x88\x87\x06\x74\xd5\x89\x58\xcd\x41\x71\x99\x77\x37\x4f\x38\x25\x5f\x44\xd5\xf0\xa6\xa7\x3e\x00\x87\x61\x96\xeb\x6d\x19\x0c\x5b\x31\xcd\x81\x2c\xa8\x0b\x2b\x21\x4e\x72\xe3\x47\x0a\xa6\xeb\xeb\x86\x97\xae\x70\x22\xbf\x54\x61\xcf\x29\x77\x8f\x42\x65\xd8\xda\x76\xfa\xa5\x7b\x59\xd1\x79\xdb\x9b\x69\xa3\xa4\x8e\x71\x37\x2b\x4b\x97\xec\xe9\xc0\x33\x8b\x9b\xc5\x2b\x71\x66\xb1\xcc\x2b\xba\x73\x9d\x7c\x60\x6e\xda\xb7\x88\xb8\x19\x9b\x2e\x8b\x17\x10\xd3\x4c\xde\x1a\xd2\x80\xe3\x02\x18\xe6\xc9\x73\x98\x60\x75\xd2\xb8\x8e\xab\xce\xfd\x16\xc6\xe7\x9f\x35\x26\x79\x5c\x64\x9e\x96\x00\x54\xb8\x5a\xf0\x3c\x48\x28\xf0\xcb\x71\xb7\xc5\x0a\x0f\x12\xa4\x6a\x55\xd6\x66\x9c\x8c\x40\x34\xb4\x4f\x93\xf1\xb2\x3d\x9a\x44\xd3\x71\xca\xe3\x35\x00\x34\xc2\xd3\x51\xc3\x97\xfd\xbb\xac\xc1\xb0\x1d\x27\xc9\x7c\x45\xbe\xf0\xd2\xc5\xb0\x3a\x87\x21\x69\xaa\xdd\xf8\xfc\xe1\xd2\x57\x2f\x99\xcd\x42\x98\x7c\xa6\xf8\x7f\x67\x90\x62\xbf\xec\xa5\xfb\xa3\xee\xae\x53\xb3\xea\xa5\xbb\x84\xa5\x5b\x40\x6a\x16\x88\xa2\x21\x91\x95\x2f\xf3\x2e\x2f\xc9\x63\x74\xbc\x08\x6b\xb2\x4f\xf6\x73\xde\x2e\x3e\xe7\x75\x03\xf0\xa8\x27\xbd\xb8\x23\xab\xc0\xe1\x66\xb7\x8b\x06\xfb\x85\xf4\x0b\x58\x4d\x34\x12\x1b\xa8\x9b\x6d\xa0\xed\xcb\xc1\x80\x4d\x54\x32\xe5\x4f\xf2\xea\xf0\xf8\x82\x2f\x07\x62\x73\x83\x52\xf8\xb5\xcf\xae\xe0\xff\xd4\x0d\x17\xd4\xc3\xc7\xed\x18\x9f\x6d\x1a\x8d\xf8\xf8\x4d\xa2\x12\xaa\x5b\xd1\xa6\x48\xac\x1f\x51\xed\x99\x7c\xe0\x1f\x84\x69\xda\x62\x91\x1a\xe5\x30\x84\xe8\x6d\xc7\x83\x7d\xfc\x19\xab\x08\x5c\xf8\x73\xac\xa3\x69\xe1\x6f\x6e\xc5\x67\x40\xfd\xdf\x90\x64\x18\xe1\x9d\xda\xb1\x13\x54\x60\x10\x34\x5b\x6c\x98\xed\xb3\xdb\x01\x74\x10\x0c\xe1\x88\x17\xb5\x63\xfe\x31\x0f\x9a\xcd\xf6\x38\x89\x79\x73\xdf\xf4\x2e\xb0\x13\x98\xa1\x87\xeb\x30\x6b\xcb\xd5\x01\x34\x8e\xc4\xd2\x81\x52\x75\x3f\xd1\xef\x8b\x01\x9d\xa6\x3c\xbc\x40\x92\xa9\x23\x03\x46\x1a\x84\x51\xe0\xa0\x60\x00\x3c\x4d\x45\xb5\xb3\x28\x0e\xa7\x53\x31\x00\x1c\x06\xc6\xd0\x8b\x01\x7a\x74\x7c\x07\x89\x7e\x67\xd0\xb4\x7e\x05\x4d\xbb\xa9\x68\x34\x1c\x37\x59\x3e\x49\x93\x0f\x6c\xc8\xf7\xe9\x84\x09\x24\xf7\xcd\x4f\x33\x3d\x66\x0e\x8a\xb1\xfd\xc2\x34\x6d\x92\xb8\x04\x12\x84\x7e\x1a\xec\xc6\x6b\x30\x19\x40\x9c\x86\xde\x59\xd7\xa0\x3e\x49\x8c\x85\xce\xfb\x66\x39\xe7\x90\x20\x32\xb8\xf3\x2c\x7e\x1f\x4e\xa3\x31\x0b\xf3\x5c\x68\x2f\x78\x06\xc2\xa8\x0c\x8b\x54\x26\xb0\xce\x65\x36\x6b\xf5\x66\xf7\x0e\x40\xbd\xda\x67\x57\x41\xf3\x73\x84\xee\x82\xaa\x0b\x4c\x40\xe4\x7f\xde\xb4\xfb\xc5\x23\x59\x1e\x26\x71\xb6\x98\x09\x32\x58\x31\x2d\xcb\x67\xd3\x8e\x26\x00\x77\xd9\x3d\x7d\x45\x65\x78\xb9\xa9\x04\x53\xea\x8a\x24\xd1\xe0\x38\x1a\xc8\x05\x16\x0d\x08\x5f\x89\x22\x32\xb1\x56\x60\x4d\x1a\x3d\xd3\x1e\x84\x23\xdb\x93\xd3\x77\x20\x91\x8c\x03\xb1\x0a\xb9\x20\x58\x4c\x12\xcf\xbf\x2d\x98\xa6\x9f\xd4\x3e\xa0\xdc\x5e\xb4\xed\x4d\x9a\xe4\x18\xb5\xd3\xa9\x6f\xca\xd2\x86\xbf\xd9\x15\xe5\xd2\xe4\xf4\x9d\x12\x8c\x68\x34\x31\xc3\xc6\x40\x1f\xf2\x8a\x7d\x3a\x9f\x84\x54\x02\xc2\x87\xe0\x94\x9f\x47\xb1\x40\x63\xdc\x62\x17\xd6\x8e\x0c\x25\xec\x1e\x0b\x78\x3c\x66\xdb\xf8\xb3\xc9\xee\xb2\x0b\x30\xf1\xc1\x59\x99\xf3\xf1\xa1\x72\xe3\x27\x90\xe9\xf7\x60\x98\xf2\x33\x73\x08\x04\x2b\x59\x9f\x89\x8f\x40\x78\x75\x82\x83\x04\x2b\xf0\x35\x4f\xe8\x0d\xad\xa8\x7e\xbb\xdf\x67\x90\x26\x05\xf4\x4b\x50\x9f\xc6\x3c\x83\x60\x60\x51\x12\xef\x89\xa3\x33\x1a\xdd\x44\x65\xd4\xe3\xc4\x11\xfc\x3d\x9f\x26\xa3\x28\x87\xc9\xe1\xe1\x68\xc2\xb2\x9c\xcf\xe7\x3c\x25\xaa\x9d\x60\xe3\x63\x08\x7a\xa8\x66\x6a\x20\x3e\x01\x62\x2c\x4f\x5a\x06\x86\xe0\x0c\x65\x22\x18\x85\xd3\x23\x04\xf5\x8f\x70\x4a\x23\x26\x39\x25\x01\x0f\xb3\x28\x3e\x07\x57\x47\xf1\xbb\x05\x18\x90\x17\xa2\xf8\xa6\x9e\xcf\x25\x18\x88\x98\x20\x56\x71\x7b\x16\xce\xe5\xb3\xd0\xc0\x48\x44\xc5\x79\xd4\x03\xc4\xa2\xb4\x28\xb3\xa3\x64\x0d\x11\x03\x21\xd0\xe1\x0f\x51\x05\xc9\x2e\x00\xb5\x61\x84\xe1\xb4\xad\x46\x69\x05\x2d\x95\x6d\x41\xfa\x58\xbb\x68\x30\x54\xe3\xea\x59\x0d\x62\xfe\xe1\x3f\x45\x65\xd9\xce\x09\x73\x1a\xf3\x0f\xff\xa0\xa5\xdd\x81\x1b\x08\x52\xa9\x2b\x60\xef\x7a\x1f\x4e\x5b\xe4\x54\x2d\x70\xde\x83\x1e\x0c\x4c\x85\x35\x7c\xff\x87\x3a\x63\xdb\x31\x3a\x8d\x31\x11\xce\xca\x7a\x2a\x4c\xc0\x14\x98\x12\xf6\x03\xeb\x3a\xf6\xc7\x35\x27\x63\xe5\x74\xd4\x1a\x26\x1d\x14\x2e\x4f\x3a\x3d\x2d\x8b\x61\x60\xcd\x93\x32\xe4\x2d\x4a\x72\x24\x9a\x81\x83\x13\x5f\x84\x81\xdf\xb1\xbd\x79\x86\xd3\x2c\x84\x7d\xb5\x89\xe9\x90\xd3\x0e\x99\x51\xb2\x10\x68\xdf\xb2\x47\xf0\xcf\x90\x6b\x7b\x47\xcb\x3e\xce\x16\x18\xeb\x41\x51\xdc\x17\x1e\xda\xcc\x86\x59\xb0\xaa\xa7\xf1\x02\xdd\xa9\x5b\x2c\x85\xb8\x0e\xd4\x2f\x2b\xe7\xa9\xcc\x3a\x64\x26\xf9\x9c\xe7\xf4\xa9\x8f\x28\x6f\x6a\xb0\x3a\xfe\x4e\x1e\xcd\xa2\xf8\x5c\x85\x8c\xd5\x90\xda\x29\x1f\x2f\x46\x9c\xb0\x47\xca\x33\x99\x40\xcc\x62\x2a\x6b\xee\xa1\x8e\xbb\xc7\x88\x02\xe0\x2d\x70\xdd\x86\xf9\x11\x18\xc0\x1f\x03\x7c\x84\x78\x25\x2d\xc1\x2a\x7c\x25\xd2\xf9\x8b\x20\xa5\x38\x15\x39\xcb\x60\x78\xcb\x65\xde\x8e\x91\xeb\x7b\x0a\x7d\xe4\x19\x7b\x0c\xea\xf9\xda\xd9\xb3\xb1\xf6\x52\x11\x5f\xe6\x29\x97\xc1\xe3\xde\x27\xd1\x18\x8d\x63\x70\x79\x26\x36\x21\x6f\xc9\xa2\x10\xbf\x13\xbf\x54\xc4\xaa\x36\x41\x23\x0f\x49\x20\x60\xdd\x9e\x7e\x77\xa1\xac\x2d\x1d\xcc\xda\x81\xe5\xa6\x17\x10\x9d\xbd\x66\x49\x0c\x6d\x8c\xe0\x8d\x61\x07\x9c\x30\x2f\x56\xb1\x8b\x24\x86\xe0\x91\xc7\x46\x12\xea\x93\x74\xd9\xb2\xf6\xea\x26\x79\xe7\x84\xf4\xd9\xd9\x51\x18\x4a\xde\x37\x08\x80\x91\x23\x9b\xa7\x51\x7c\x6e\x73\xa2\x27\x92\x2a\x2d\x70\x43\xa9\xde\x96\x73\x6d\x68\x65\x26\x9f\x44\x51\x55\x5b\xda\x98\x4f\xf3\xd0\x14\xb3\x6d\x55\x7d\x9f\x18\x8a\x85\x5c\xe9\x93\xaa\x3b\x52\x2e\xb4\xc7\xb9\xdc\x75\x9c\x55\x53\x22\xaf\x6c\x52\xa1\x84\xc4\x7e\x76\x76\x04\x7f\xb0\x45\x2c\xe3\xd9\x82\xc6\x11\x8e\xc7\xe8\x0a\x9a\x47\x42\xfb\x9f\xa7\xfc\x2c\xfa\x28\x67\x44\x08\xa1\xc0\x5a\x6a\x46\x68\x59\x9c\x66\x71\x44\x53\x59\xab\x1d\x9a\x18\xea\x79\xf9\x80\x46\x94\xc5\xa5\xe5\x09\xf9\xba\xf0\x07\x87\xdd\xd9\x61\x39\xeb\xff\x28\x58\xd5\x3f\xe7\xa3\xc5\x69\x34\xda\x3e\xe5\x7f\x46\x42\x97\x22\x72\xb1\x38\xf1\xf4\x7b\x61\xde\xf5\x5a\x36\xd8\xd2\xe5\xed\x46\xd0\x85\x7e\xc4\x48\x70\xd6\x49\xeb\x1d\x2d\xed\x0d\x0f\xd0\xd0\xde\xd7\x5d\xac\xb0\x73\x16\xed\xef\x9e\xb3\x8d\x68\xdd\x1e\x25\xf1\x28\xcc\x83\x63\xa9\x6a\xe5\xcd\x81\x7e\x34\xde\xa2\x3b\x87\x9a\xd2\x1b\x65\x21\x13\xa3\xbc\x49\xb8\x23\xa7\x8a\xcd\x1a\xcc\x60\x5f\x51\x80\xde\x2e\x8e\xf3\xd7\x26\xe8\x0d\x91\xb4\x6b\x48\x5a\x46\xd4\x55\x74\x32\xe3\x68\x16\x38\x5f\x6f\x21\x52\x58\x44\x99\x94\x09\xf0\x74\x8e\xca\xb6\x3d\x8b\xb3\xd5\xb2\x51\x56\x05\xf0\xa6\x0c\xb5\xd0\x46\x33\x78\xf1\x72\xcb\x04\x3c\xaf\x9a\x0f\xc5\x2a\x1a\x78\x32\xf7\xc1\xae\x0c\xa7\xae\xe0\xb7\x47\x61\x3c\xe2\xd3\x66\x00\x8c\x60\xc5\x12\x56\xa7\x2b\xcb\x60\x7a\x03\x7e\xdd\x62\x2e\x7f\x86\x1d\xa8\x34\x4c\xca\x77\xe4\xfd\x69\x65\xd5\x47\x5d\x2b\x54\x94\x7a\xbb\x57\x76\x77\xd1\xd3\x77\x17\xca\xf8\x57\x1e\x4b\x54\x5e\x5b\x48\x98\x19\x38\x94\xaa\x47\x05\xe8\x92\x39\x4a\xa6\x53\x1d\x1f\x05\x69\x2d\xdf\x4e\x9b\x80\x27\xd3\xa9\x6e\x23\xa0\x9d\xe8\x47\x63\x27\xda\x2b\x25\x4f\x17\xf9\x64\x09\xef\x1d\xe0\xda\xc1\x3c\x0d\x8c\x32\xfd\xa2\x41\x5e\x5c\xa7\x1c\xee\xb8\xb4\x71\x75\x8f\x29\x37\x7f\x70\xb4\xbd\x84\x75\x66\xf0\x6a\xaa\xbb\x91\xbb\x77\x5f\x24\x39\xdf\xbb\x7b\x97\xfd\x1e\xab\x9b\x97\x94\xcf\x92\xf7\x5c\x79\xad\xea\x5b\x73\x44\x2a\x34\x11\x4b\x36\x89\xf2\x74\xa8\x51\x29\x38\x91\xea\xeb\x36\x83\xae\x7c\xce\xa1\x7f\xe6\x89\x7a\x8e\x09\xd4\x2f\x8b\xd5\xa2\x09\xd6\x1f\xb6\xd5\xe5\xfa\xa0\xf6\xbb\xca\x55\x51\x5b\x50\x59\x52\xe9\xf6\xb1\x4d\xc6\x39\x13\x04\xc4\x50\x92\x5e\xa7\x9c\x45\xc6\x53\xa1\x71\x1c\xc3\x6d\x0f\xfb\xc4\x1a\xe2\x4b\x63\x8f\x35\x4e\xc3\x34\xe6\xcb\x46\x8b\x35\xc2\x73\xde\xd8\x63\xbb\x0f\xc5\x9f\xa3\x3c\x7a\xaf\xbc\xa6\x20\xd1\x82\xd3\xea\x2c\xe5\xe3\x46\x8b\x31\xd5\xea\x7e\x87\xb6\x02\x6b\x33\xd8\x23\xd8\x60\x5f\xdf\xcd\x20\xea\x01\xa0\xd2\x32\x37\xe8\x09\xb1\xe8\xdd\x4e\xda\x08\x64\x1f\x8f\x77\xea\xca\x86\x26\xb1\x3e\xc6\xce\x95\xf3\xcf\xce\x0e\xba\xbd\x0d\xdb\xf8\x5c\x2b\x3b\xf1\x3c\x9a\x6d\xfb\x30\xf8\x54\x35\xe4\xf2\xde\x25\xc1\x4a\xfb\x57\x87\x92\xda\x78\x1c\xab\xbe\x5b\x48\xb8\xc1\xda\x23\x9f\xaf\xdb\xa5\xea\xb1\xd6\x28\xc9\x3d\x99\x84\x62\x16\x05\x79\x25\x4b\x4c\x68\xe8\x43\xa4\xcc\xa7\x44\x00\xa8\x10\x40\x52\x8a\xee\x11\x91\xea\xbc\x7a\xb0\xfa\xa0\xd2\x34\x20\xcf\x72\x77\x9b\x25\x97\x6d\x67\x12\x64\x61\xc3\xd8\x3c\x44\xa2\xc0\xe5\x69\x38\x2a\x0b\xe8\xb5\x7b\xff\x41\xed\xa8\x02\x88\xa5\xdf\x75\xf4\x3a\x0f\xbf\x6f\x4c\x86\xad\xff\x1c\x7c\x7d\xb1\x55\x78\x7d\x5d\x87\xb3\x9c\x34\xea\x6a\x2e\xac\x66\x7a\x5a\xe9\x56\x64\x6d\x43\xde\x57\xd3\xa5\xb5\x9b\xde\x4c\xea\x85\x88\x2d\xf4\xd9\xce\xaa\x98\x2d\x3f\x97\xb1\xe7\xcd\xf8\xc1\xff\x9c\x94\x2b\x28\xca\xff\xfd\x02\xed\x4b\xfe\xbc\xd0\x8f\xea\xb3\x70\x92\xbe\xfc\x10\xdf\x08\x0b\x57\xa6\xf9\xaf\xc1\xb4\xba\xbb\xb5\x79\xd6\xf5\xb4\x39\xc1\x7e\xbd\x41\x02\x60\xbc\x3a\x03\xbf\x1d\xb0\xcb\xdc\x69\x08\xac\x65\xdc\x95\x9f\x93\xb4\x50\x1d\x8c\x55\x65\x6f\x24\x4c\x37\x1e\x06\xb9\x01\xa7\x7a\x70\x10\xfc\x69\x05\x9b\x7c\x57\x93\x03\x0c\xb2\xea\x81\x61\x64\x69\xa8\x8a\x94\x02\x8e\xdc\xa5\x22\x9e\x49\x4a\x61\x14\xcf\x13\x41\x8b\x9f\xc1\xd9\xd0\xf8\x25\x66\xec\x44\x11\x0b\x63\x05\xc1\xfd\x88\xda\xe7\xda\x44\x15\xe6\xc4\xab\x73\x16\x2e\x19\xff\x18\xe5\x66\xa6\x19\x0f\xd3\xe9\x52\x74\xc3\x3f\xce\xa7\xd1\x28\xca\xa7\x4b\xa2\x1c\x13\x8f\x97\xaf\x86\x2d\x0b\x10\x14\x7d\x0a\x8e\x91\xe2\x70\x2e\x04\x2c\xac\x65\x31\x1b\x84\x6f\x6b\xb3\xb7\x2d\x34\x2c\xee\x08\xbc\x5e\xba\xb2\xb2\x87\x39\xaf\xef\x20\x0f\xec\x65\xb4\x8c\x24\x2d\xc4\x7f\x3c\x4b\xd2\x67\xb1\x09\x9e\x82\x2c\x57\x35\x6f\x37\x15\x62\xa4\xdc\xcd\xd4\x42\xda\xf5\xc1\xb3\xe8\xe8\xc4\x0c\x71\x7d\x48\xfd\xe2\xe1\x67\xed\x9b\x5a\xf6\x5c\x9b\x31\x7d\x8f\xaf\x1c\x68\x24\x2c\x72\xcb\x02\x81\xbb\x65\x48\x7b\x01\xb2\x58\x43\xbf\x10\x85\xaa\xf4\x85\xb7\x7e\x68\x29\xdf\xe9\x6e\xdb\x97\x77\x17\x7c\xa9\x5a\x1d\xd3\x88\x25\x12\xa0\x0e\x58\xa2\xfd\x4b\xc1\xf3\x43\xe9\x71\x0a\x77\x79\x85\x00\x67\x45\xf5\x0d\xf3\xe1\xc1\xe2\xa4\x36\x1a\xf4\x0e\xb1\x9d\x55\xa9\x69\x21\x91\x8e\x55\xe5\x3e\xf9\x74\x5a\x3c\x1c\xbc\xb9\x63\x7e\x3d\x9f\x45\x9f\xbf\xf6\x89\xd2\x66\xc0\xaf\x5a\xff\x02\xa2\x9e\x58\x7c\xb6\xda\x8f\x5a\x48\x4b\xaf\xc8\xa0\x02\x0b\x22\x29\x28\x35\xe7\xb3\x84\xe7\xd9\x74\xed\x80\x6e\xa7\xc6\x52\x08\xbd\xe3\x2e\x23\xaa\x04\xba\x91\x34\x31\x18\x81\x56\x83\x9d\x7c\x17\xe6\x56\x50\x57\xb1\xde\x28\x9f\xb1\xe0\x36\xf5\xf3\x2b\xd1\x0e\x01\x84\x42\xd7\x8f\x8e\x7b\x59\xa0\xd7\x1e\x99\x09\x3b\x7e\x90\x1d\x41\xa8\xb0\xc4\xaa\xa5\x01\x41\xd4\x5e\xd0\xeb\x46\x18\x2a\x5b\xbb\x4e\x94\xa1\x0d\xd7\xaf\x4d\xfe\x95\x6b\x58\xb0\x87\x67\x11\x6f\x9e\x68\x1a\xa3\xef\x3c\x07\x07\xb4\x12\x0d\xa9\xa7\xde\xcb\x9f\xf3\x1c\x2a\x3e\x09\xf3\xb0\xb4\xb2\xf2\x52\x96\x26\x82\x23\x70\xd2\xc4\x4c\x06\x72\xc2\xfc\x67\xc9\xba\x6a\x18\x31\x7e\xa0\x16\x36\x4e\x78\x16\x37\x72\x36\x9a\x26\x31\x67\x27\xe8\x8f\x58\x4b\xcf\x91\x2e\x93\x44\xcf\xc1\xb4\x6d\xf8\x7c\x48\x45\x95\x4f\x70\x28\xf5\x9f\x64\xcc\xf9\xa8\x6c\xbd\x8b\x41\x3d\x47\xf4\x03\xed\x89\xa9\x43\x94\x1b\xd2\x52\x4a\xab\x8a\xfb\xd2\x49\x42\xd7\x33\xfe\x84\x98\x87\x51\x17\x1c\x77\x06\xc7\xbd\x81\x73\x01\x59\x32\x1f\x81\xd5\xaa\x33\x68\xd9\x60\xba\xde\x67\xd0\x64\x2b\x77\x7a\x91\x74\x14\x4b\x42\x52\xf7\xf2\x92\xf2\x98\x56\x00\x94\x53\xa9\xee\xad\xea\x01\x05\x21\x5b\x71\x11\xf4\x36\x7f\x43\x71\x94\x87\xa3\x8b\x52\x9b\x78\xd7\x8a\xc9\xa8\xd2\x58\xf8\x8f\x93\xca\xef\x5e\x3f\xc9\x82\x4c\x1a\x19\x67\xa7\x51\x3e\x0b\xb3\x0b\xb4\x39\xa1\x5f\x94\x95\x1f\x40\xaa\xa7\x87\x2f\x9f\xbf\x7a\xfc\xfa\xe9\xf0\xd5\xe3\xd7\x6f\x9e\x3d\xfe\x6d\xf8\xf3\x6f\x8f\x7f\x61\x7d\x15\x34\x49\x95\xfe\xfe\xe2\xe5\xeb\x27\x4f\x5f\x3f\x7d\xa2\xca\x7b\xb5\xa3\x3b\xe2\x34\x7c\x81\x53\xac\x27\xec\xd0\x06\xeb\xce\x0e\x82\x60\x96\x0a\x9a\xed\x65\xcb\x38\x9c\xf1\xac\xa5\xc3\x75\x09\x05\x1a\x69\xcc\xd9\xd9\x34\x3c\x2f\x81\x49\x63\x8f\x2f\xb2\x3c\x99\x45\x7f\xf2\x74\x50\x50\x27\x74\x99\x35\x6f\xf5\x9f\x26\xc8\x93\x08\xbc\x4d\x40\x2c\x6a\x84\x55\x5b\xb1\x66\x5a\x06\x2b\x4f\xb0\x23\x57\x50\x14\x42\x1f\xe1\x4e\x26\xbf\xc6\xc9\xa1\x86\x05\xe1\xb0\xf5\x2f\xed\x9e\xa5\x17\xb7\x2f\x83\xd6\x6d\xe2\xae\x70\x8b\x69\x41\xe0\x28\xeb\xfb\x26\x98\x52\x54\x0c\x21\x3e\x46\xe9\x67\x24\x50\xe4\x44\x10\x0f\x2c\x2c\xb7\xb6\xa0\x85\x90\x75\xc4\xd3\xea\x00\x3f\x76\x75\xa6\x21\x3e\xca\x8f\xc7\x28\xcf\x06\xa4\xde\x1e\xbb\x1d\xc8\xcf\xd2\x65\x54\x20\xa8\x2b\xac\x4e\x4a\xb4\x32\x40\x4c\xe5\x70\xcc\xa9\x42\x22\x61\x94\x9b\xe4\xf4\xdd\x3f\x64\xb0\x6c\x89\x3e\x75\xec\x61\x2c\x4b\x47\xaa\x5c\x0e\x75\x9f\x26\xb6\xf5\x53\xc8\xd2\x6e\x4c\x0f\x56\xb4\x9e\xad\x2d\x76\x9b\xb8\xd0\x0a\x7a\xac\x95\x0b\x8a\x9e\x98\x32\x29\x53\x21\x16\xba\xf8\x9b\x9e\x8c\x5c\xb6\x35\xcd\xb4\xd9\xd3\x54\xd1\xd8\xb6\xf4\xc8\xe5\x19\xca\x5d\x18\xd0\x67\x21\xfa\x34\x86\xdb\x56\x80\xe9\x80\x09\x37\xe8\xd4\x1d\x28\xe0\x03\xd3\x93\xe9\xdd\x2b\x9c\x2f\x4b\xa4\x32\x5d\x9b\x0a\x33\xab\xbf\x3d\x39\x56\xf2\xb1\x2e\xb5\xed\x1d\x59\xa7\xc4\x2a\x09\xad\x08\x42\xc4\xb3\x6f\xde\xc4\xab\xb5\xda\xea\xdd\xda\xc6\xd8\x5f\x54\x20\x92\xfa\xe2\xdd\xb1\x0b\x5d\x6b\xdf\xfa\x9f\x05\x4f\x97\xab\x0d\xfd\xb0\xa6\x71\x81\x3b\xbd\x12\x19\x6e\x69\x71\x54\x5d\xb2\x18\x5d\x25\x0e\xa4\x96\x0a\x2d\xa2\xad\x58\xfd\x34\x14\x9d\x6b\xa6\x30\xe2\x04\x9b\x1c\x63\x05\x22\x35\xde\x17\x45\xca\xbe\x72\xcc\xa5\x2d\x58\x9f\x1d\x1b\xc7\xfa\x96\x67\x92\xe5\x8d\xc0\x60\xbf\x7e\xf8\x76\x4a\x0a\x0f\x2b\x6e\xf6\x1a\xcc\x9c\x63\x56\x29\x67\xfa\x1c\x53\xca\xa7\x2a\x70\xca\x24\xcc\x9e\x95\x65\xbd\x7a\xd4\xd3\xe1\x55\xb2\xff\xe0\xe5\xc9\x69\x76\x75\xad\xb5\x97\xc9\xfa\xa7\x27\x6c\x97\x27\xe5\x08\x75\xf5\x7d\xdd\xd7\xaa\x9d\x16\xae\x95\xfd\x27\x3c\x29\x9a\x2b\x17\x39\x06\x47\xb9\x62\xf3\x30\x9f\xa0\x96\x28\xfe\x90\x71\xf6\xb4\x48\x41\xcb\xb2\x1b\x9b\x4b\xef\xaf\xd6\x5b\xd4\xcf\x72\x0a\xd4\x6e\xbd\x02\x3d\xb3\xbf\x35\x75\x2a\x56\xe0\x30\x28\x95\x4f\x30\x0b\x8b\x51\xb7\xa9\x79\xe0\x03\x16\x41\x88\xa4\xc3\x7a\xa7\x3c\x19\xf4\x44\x69\x1f\xe7\x3c\xd7\xca\x29\x00\xb4\x42\x62\x54\x68\x19\x56\x89\xc6\xe1\x96\xda\x88\x61\xf1\xd9\x90\x6f\xa9\x4d\xf3\x46\x37\xe9\x9a\x87\xce\xf2\x38\x1d\xbd\xcd\xdd\xb2\x66\x7c\x96\x44\x7f\xf2\x43\x95\xa1\xcc\x2f\x71\x0a\x07\x4b\xdc\x81\xec\xcd\x51\x05\xf6\xd0\x5f\x05\xe9\xcc\xf2\x4d\xf9\x6f\x3c\x1c\x47\xf1\xf9\x93\x44\x08\xc0\x9d\x7f\xbe\x6d\xef\xb4\xe4\x8c\x89\x21\xbe\x08\xc1\xd9\x73\xe7\xf8\x9f\xed\xe3\xb7\x83\xc1\xbd\xcb\xb7\xc7\xc1\xc1\x5e\xb0\x7d\xf0\x76\x7c\x2f\x38\xd8\x7b\xdb\x7e\x3b\xbe\xd7\x3c\x68\x5e\x06\xc7\x77\x1a\x83\x66\x20\xca\x0e\x6e\xbf\xed\x35\x8f\xff\xf9\xf6\xed\xe0\xf2\xed\xdb\x76\xf3\xee\x41\xf3\x6d\xaf\xf9\x76\x70\x19\x1c\xf4\xa1\xc5\xe5\xdb\xe3\xb7\x83\xa6\xf9\xf3\xf2\xef\xcd\xe6\xce\xb9\x77\x28\xa7\xe1\xe8\x22\x9b\x86\xd9\x04\xe3\x6b\x94\x8e\xe1\x69\x36\x0a\xe7\xfc\x70\x12\x8a\x63\xca\xce\xdb\xb7\xc1\xdb\xb7\xcd\x03\x05\x13\xec\xcc\x49\xfc\x9e\x8b\x39\x54\xc1\xc9\x20\xbe\x81\x0d\x70\x75\x20\x50\x25\x40\x48\xbc\x29\xf9\x27\xc8\x4d\xe8\x62\xb5\x9e\x50\xd2\xa9\x8c\x47\x06\xf0\xde\x24\xaf\x42\xd8\xeb\x2d\x46\x30\xcc\x44\xa3\x4c\x79\x1c\x03\x30\x44\x86\x99\xd8\x76\xce\x33\x1d\x1b\xca\x88\x04\x73\x9d\xdf\x68\xe8\xc5\x8e\xb5\xda\x29\x9f\x4f\xc3\x11\x0f\x0c\x17\x10\xd7\x02\x79\x54\xc5\x10\x32\x2d\xf6\x3f\x8b\x24\xe7\x76\xe8\x2b\x1b\x3c\x54\x90\xf9\x0d\x2c\xd8\x66\xde\x5a\xac\xf1\xf7\x6e\xa3\xc9\xf6\x58\x20\x23\xd3\x5c\x5e\x22\x13\xc8\x07\x09\x5e\x07\x03\x7f\x5c\x36\x42\x42\xcf\xea\xdc\xdc\x07\x46\x4e\x4a\xe9\xba\xb4\xb7\xd4\x50\x69\x87\x1f\xa3\xd9\x62\xa6\x1b\x63\x4a\xa0\x2c\xfa\x93\x6b\x3e\x7e\xfe\xf8\x3f\x87\xcf\x9f\x3e\x7f\xf9\xec\xbf\x9f\x0e\x8f\x9e\xfd\xf7\x53\xd6\x67\x0f\x3a\x9d\x7a\xa9\x65\x24\x58\xb5\x3d\x8e\xa6\x3c\x4c\x65\xc7\x58\x32\xd6\xd3\xd7\x00\xe7\x47\xec\x5f\xc6\xb7\x81\x58\x0f\x7c\x9c\xb1\x13\x17\x87\x4d\xa2\xf8\x4d\xc2\xf7\x9c\x45\x79\xc6\x92\x45\x3e\x5f\xe4\x1a\x93\xda\x1b\x66\x01\x75\x67\xd3\x2c\xae\x0e\xcf\x92\x90\x95\x64\xdc\x35\x3d\xe3\xe4\x9d\x0d\x9c\x3e\x05\x39\xda\x19\x4c\x6b\xbf\x5f\x98\x0a\xea\xa3\x2d\x2a\x02\x7d\x83\xa6\x27\x26\xcc\x05\x5f\x2a\x7e\xbd\x65\x27\x7f\x92\x2b\x02\x7e\xd6\xf4\x96\xb1\x06\xe8\xe1\xe5\xcd\x1d\x66\x9e\x87\xf3\xaa\x04\x90\xbd\x8e\xb2\xc1\x33\x78\x5e\xcd\x66\x3c\xcb\xc2\x73\xae\xc3\x7b\x19\x29\xfc\xf3\xef\x2f\x0e\x87\x4f\x5f\xbf\x7e\xf9\x7a\xf8\xe6\xe9\x7f\xbe\x61\x7d\xd6\x78\xfa\x71\xce\x47\xb9\x58\x03\x86\xf9\x56\xc6\x6a\x52\x83\x2e\x89\x4a\xca\x9e\x9d\xb1\x93\x94\x67\xc9\xf4\x3d\x4f\x4f\x58\x94\x49\xdf\x8a\xf7\xd1\x98\x8f\x5b\x82\x97\x75\x96\x54\x15\x34\x66\x84\x4e\x02\xa0\xc8\x66\x79\x82\x02\xdb\xc0\x16\x9b\xfa\x98\x41\xef\xb6\x3f\xaf\x06\x2b\x98\xd9\xbb\x94\xda\xec\xa7\xa5\x7a\x67\xdd\xb2\x12\xb2\x22\x08\x8a\x5b\x29\x10\x16\x65\x6c\x61\x49\x8a\xb9\x41\x1a\xbd\x90\x4d\xd0\xda\xa2\x17\xb2\x2f\x56\xac\x1f\xd9\x82\xfb\xf1\x1b\x4d\x9e\x28\x03\x76\x21\x58\x9c\x40\xc1\x89\xd9\xad\x90\x40\x1a\xac\x80\x64\xc8\xf0\x2c\xcf\xf0\x66\x0a\x96\x65\xb8\x64\xa7\xdc\xd8\x3a\xc0\xcf\x05\x85\xbe\x22\xbd\x91\x58\x6d\x60\xbf\x13\x15\xc8\x0e\xde\xe9\x27\x29\x0e\x4e\xa8\xf6\x1f\x20\x54\x98\x7a\xa8\x9f\x99\x43\x82\x9a\xae\xe3\x93\xe7\xe1\xfc\x1a\x99\x7a\x8d\x3f\xce\x76\x72\xb6\x9d\x4f\xf8\xf6\x2c\x9c\x6f\xeb\xb0\x17\xdb\xda\xf8\x77\x57\x07\xca\x11\x50\xcf\xc2\x11\x47\x87\x73\x21\x02\x4e\x5a\xec\x64\xcc\xa7\x3c\xe7\xe2\xaf\x73\x9e\x8b\x7f\x26\x61\x76\x82\xb6\x88\x93\x8c\xe7\xf5\x23\x1c\x7a\x5c\xb6\x95\x6c\xbc\x31\xa9\x5b\x34\x70\xab\xb5\x54\x34\x6f\xcb\x12\x7b\x15\x6d\x26\xbc\xcb\x23\x26\xb2\xbe\x0e\x6d\xd8\x62\x8d\xd3\xc6\x1e\xeb\xc1\xd3\x87\xbb\x26\x26\x36\x56\x19\x35\xf6\xd8\x6e\x8b\x35\xc6\x8d\x3d\x76\x1f\xab\xa8\x5a\xf2\x9a\xa0\xcf\x34\x77\x05\x43\x8c\xbb\x21\xe3\x29\xe2\xdf\xc4\xf0\xac\x43\x2c\x76\x5b\xac\x37\xd0\xa0\xb0\x96\xe8\xd3\xaa\xb4\xdb\x62\xf7\x55\x25\x19\xee\x28\xc4\xb3\x6c\x6d\xd8\x3b\x3b\xec\x39\x84\x32\xa5\x12\x08\xf7\x14\x03\xa4\x2d\x77\x23\x72\x94\x3a\x6e\x84\x0d\xa0\xcb\x60\xd5\x48\x74\x45\xd3\xe3\x6b\x54\xb8\x8a\xab\x4e\x7a\x47\x5b\x1f\x59\x9f\xfd\xc1\xc3\x8b\xe7\xe1\x7c\xdf\xbb\xdb\xca\x8d\x54\xb1\x8d\x39\x96\x8a\x55\x93\x9c\x21\x53\xde\xee\xb3\x86\x16\xf9\x90\x2e\x53\xd5\x17\x45\x90\x56\x61\x6b\x8b\xc9\x16\xb4\xc8\xb4\xd2\x8a\xaa\x2f\xca\x87\xb3\xd9\x68\xed\x95\xa8\x67\x63\xf2\xd0\xad\x66\x00\x79\x6d\x2c\x43\x74\x0e\xf4\x9f\x24\xc6\xb3\x0a\x7a\xbd\xa7\xa3\x44\xeb\xe6\x6a\xa3\xd7\x2b\x4e\x6e\xf5\x8e\x92\x31\x09\xb3\x40\xc6\xcd\x71\xdc\x2f\xa0\x58\x1c\xa0\x45\xb1\xeb\x2b\xa1\x15\x9a\x33\x3b\xe8\xb4\x8e\x38\x0d\x36\x22\xab\x6b\x95\x71\x12\x38\x09\xec\x77\x08\xa4\x29\x66\x44\xeb\x21\x05\x4d\x44\xbe\x39\x2a\xc0\x12\x53\x10\xd8\xbc\x72\x79\xa9\x35\x08\xaa\xa0\xab\xa6\xa0\xd5\xec\xec\xb0\xa7\xb0\xb7\xb0\x13\x55\xf7\xa4\x7d\xcb\xe5\x39\x55\xe4\xd3\xe8\x65\x5d\x8f\x02\xb4\xb9\x43\xa8\xd8\xfd\x57\x85\xcd\xee\x51\x47\x04\x73\x94\x24\x91\xf2\xd4\xd1\x86\x3d\x56\x31\xf3\xe4\xc1\x30\x22\xde\x9e\x42\xff\x38\x11\xbc\x0f\xbb\x1d\xec\x0f\xda\x02\x72\xa2\x96\x3e\x9e\x2a\xa3\x73\x54\xec\xb7\x3b\x70\x3b\x38\x4f\x79\xc6\xd3\xf7\x28\xc4\x6b\xed\x25\xd7\x0f\xaf\xe6\x3d\xc6\xaa\x93\xaf\x15\x8d\x0f\x6b\xf2\xb1\x1a\xbc\x47\xbe\x0f\xdb\x2a\xce\x71\x00\xf7\x83\x44\x50\x35\x1a\xc5\x3a\xdb\x1d\xab\xc6\x76\xc7\x53\xc7\x1b\x77\xad\xd1\x6d\xf5\x5a\xbb\x0d\x5b\x60\xe9\x26\x65\x59\xa8\x4c\x86\x97\x46\x43\x9a\x91\xde\xd8\x6d\xfc\x6a\x79\x5e\x1a\x25\xb9\xb7\x79\xc2\x51\x8c\x8e\x54\xc2\x8a\xdf\xef\xae\x9b\x2f\x7d\xe5\xeb\x3a\x6d\x8f\xae\xea\xf7\xbb\xef\xdc\x33\xad\x13\xd1\xf5\x7d\x98\x46\xc9\x22\x63\x27\x2f\xe0\xf4\x7e\xe2\x39\x20\x3c\x7b\xf1\xf3\xb3\x17\xcf\xde\xfc\x17\xeb\xb3\x2e\xdb\x61\x9d\x82\xdd\x19\xd8\x89\x65\x80\x07\x5c\xcc\xcf\xd3\x68\x16\xe5\xd1\x7b\x71\x48\x88\x15\x9b\x19\x80\x58\xf3\x95\xd0\xd8\x58\x5f\xd1\xed\x40\xfe\x61\x02\x98\xd1\xa4\xca\x32\xfa\x3d\xd4\xa0\x71\xdf\x09\xa4\x03\xfa\x4b\xb3\x9d\x9d\x99\xb9\x9e\xe9\xda\x84\x22\x77\x6c\xd6\x72\xa4\x82\xf7\xa2\x6c\x62\xb6\x73\x31\x66\x2a\x3d\xae\x91\xd6\x6d\x9e\x26\x23\x9e\xb9\x4e\x08\xbe\xe5\x6b\x16\xad\x63\x86\x7e\xe3\x59\x36\x20\xc3\xa3\x5c\xfa\x93\xe3\x41\x0a\x30\x04\xe9\x07\x91\x1e\x42\x95\x3e\x4d\xe8\xe9\x6c\x12\xe5\x18\x5a\x6e\xc6\x19\x8f\xdf\x47\x69\x12\x63\x98\x3a\x5b\x59\xd0\xeb\xb0\x81\xf0\x1a\xa5\x51\xa6\xb5\xed\x5b\x3f\x3f\x26\xe6\x6d\xd0\x71\x46\x8b\x34\x8b\xde\xf3\xe9\x52\x13\x58\x52\x35\xc8\x16\xd9\x88\xcf\xf1\xc5\xb6\xe0\xb4\x70\x3a\x95\x77\xd1\x53\xc1\x60\x59\xb3\x4d\xfb\xd4\xc9\xc6\xe5\x65\x17\xa5\x49\x93\xdd\x63\x8d\x86\x8d\x10\xf2\x9b\x83\x91\x7a\x0e\x6c\x73\xda\x81\xf3\x01\x83\xe9\xe9\xd4\xd8\x06\xb2\xb5\xe1\x63\x05\xe8\x99\x6e\xb2\xe6\xfa\x9a\x35\x3a\x0d\x48\x50\x2e\xd6\x95\x84\xd6\xef\xb3\x6d\xb5\xe2\x9a\x42\xc2\x6d\x77\x1a\xfa\x7e\xb9\xdc\xba\x5d\x1e\x00\xbe\x77\x33\xf9\x6e\x7f\xad\xbc\x44\xfb\xde\x5c\xb5\x49\x0b\xa8\xb7\xde\x2e\xcd\x51\x70\x68\x62\x92\xce\xc3\x7c\x22\xdd\x69\xc6\x51\x0a\x5e\x44\x29\x8b\xe2\x09\x4f\x23\xb1\x4f\x99\xb3\xac\xe7\x56\xf8\x1a\x3b\x2a\xde\x1a\x5f\xe7\x1e\xd9\x7a\xb7\xe6\xbf\x97\xba\x46\xa8\x53\x1c\x3e\xff\x18\x65\x62\x26\x56\x05\x35\xb5\xce\x5e\xc3\x36\x3a\x96\xaa\xf8\xf4\xf4\xb7\x3c\x8c\x35\xe5\xb3\x50\xdc\x8f\xed\xfb\x98\x46\xd8\x28\x8d\x62\xea\xd6\x6c\x9f\xd6\xad\xeb\x1e\x7a\x56\x03\x3f\xf5\x06\x47\x25\x02\xce\x73\x8d\xe4\x79\xbc\x44\xce\x28\x92\x13\xad\x26\x2d\xc3\xc9\x25\x1a\x02\x74\xe3\x59\x43\x37\x9b\x56\x17\x7a\xf1\xfb\xed\x8d\x39\x9f\xcb\x6b\x92\x1a\x6e\x0f\xc7\x38\xba\xc1\x9a\x0c\x2b\xce\x4b\x6f\xa4\x71\xed\x1a\xec\x7a\xc1\x97\xe5\xdc\xea\x6c\x4a\xbf\x5a\xf3\xa6\x8d\xb7\xa5\xd3\x26\x3d\x96\x5c\x4f\xb3\x32\xb1\xf7\xab\x7f\xbe\x76\x37\xf7\x23\x1d\x85\x59\x5e\x21\xca\x76\x1f\x74\x88\xa2\xa6\x0c\x8f\x65\xc6\xd8\xef\xd7\x55\xea\xaa\x32\x8b\xf7\xba\xa6\xeb\xdf\x94\x73\x89\xbf\x62\x77\x2d\x57\x02\xaf\x50\xc6\x79\x66\x49\x7c\xa3\xfe\x38\x6b\xcb\xd1\x82\xfd\x6b\x12\xfa\x5f\x97\x41\x1b\xf2\x68\xef\xc6\xc4\xb0\x2d\x8c\x3c\xb2\x45\x62\x84\x0c\x3e\x47\xd6\x51\x5c\x24\x7d\x02\x34\x3f\xaf\xce\x65\x29\x1a\x38\xce\x9e\xc6\x92\x80\x7e\x64\xab\xbd\x16\x8d\x27\x91\xf1\x14\x50\x59\x2c\x8d\x27\xa6\x71\xa8\xf3\xcb\x51\xf2\xfe\x4a\x46\x0e\x26\x91\x85\xcc\xdb\x08\x99\x99\x4e\xed\x4c\x96\x6f\x92\xd1\xbb\x64\x57\x97\x97\xfa\xd5\xc6\xed\xbe\x83\x75\xd1\xac\x71\x8b\x10\xc6\xf6\x5c\x95\x59\x3e\xa5\x55\xcf\xf8\xad\x2a\x4f\x56\xe9\xca\x8a\xfe\x16\xb8\x5a\x54\x66\x40\xfc\x86\xb9\xb3\xc1\xc8\x62\xbe\x03\x1a\x5a\x67\x55\x7e\x13\x97\x97\x74\xb1\xab\xcf\xe5\x3b\x89\xff\x22\x73\x77\x73\x5f\x3d\x21\xf9\x56\xa5\x8d\xda\xed\x11\x57\x77\x55\xf9\x89\xd8\x5d\xca\x1a\xec\xae\xe5\x08\xb5\x86\x48\x59\x91\x50\x28\xd7\xe7\xa0\x30\x57\x8b\x30\x39\x63\x21\x3b\x8f\xde\xf3\xb5\xe3\xd3\xd7\x48\x37\x54\x25\x75\xaa\xbc\x8a\x6a\x18\xcf\xc3\x91\x38\xc5\x25\xe9\x1a\xe9\x86\x4c\x6c\x13\xa1\xbf\x19\xb5\x8d\xc6\x2f\x21\x25\x5d\x19\x32\x95\x86\x28\x99\x85\x73\x95\x41\xa8\xc5\x4c\x5c\x8d\x00\x75\x36\xcb\xca\xdc\x6b\xb1\xee\xc0\x6a\x38\x6c\x67\x49\x9a\xff\xb4\xf4\x42\x20\x9a\x5c\xd3\xa3\x03\x6a\x13\x39\x11\x8e\x73\xea\x06\xe5\x84\xa2\x37\xfe\x4f\x07\x16\x5f\x52\x47\xa6\xa6\xb4\xe8\x50\x9e\x0d\xa4\x47\x92\x6f\xa1\xcd\x4b\x1d\x7a\x76\xd7\x4f\xf0\x5c\xa5\xb5\x99\x70\x25\xd7\x57\xdc\x7c\x1a\xd8\xe7\x60\x39\x47\x0b\xd3\x74\x76\x15\xb0\x9a\x2f\x80\x94\xa8\x35\x8e\x5f\x7b\x05\xf9\x5e\xae\xa4\x95\xbb\x5c\xed\x6e\xee\x72\x25\x3a\xf8\xa5\xc2\x09\x94\x26\x44\xac\xce\x37\xec\xba\x2a\xca\xd9\xcd\x6a\x4e\xed\x97\x96\x2a\x25\x53\x6c\x96\x4b\xfd\x79\x96\x34\x2c\xfa\xff\xd5\x98\x54\xd1\x9f\x67\x62\x37\xf3\xd6\xf9\x4c\x39\x21\xf0\x68\x7c\x38\x0d\xb3\xac\x3c\x65\x81\xd5\x49\xc4\x33\x99\xc8\xa1\x85\x2f\xc6\x8b\x01\xd5\x31\x6c\xba\xf5\x08\x9d\xe6\x72\x50\x11\xb5\x21\x4e\x01\x3e\x3a\x8f\x06\xfb\xe4\x73\xdb\x44\x2a\x87\xd8\x9a\xbe\xef\x97\x97\x2a\x15\x02\x29\xa7\xf1\xcc\x75\x96\x01\xa1\x62\xdd\x81\xd1\xdf\x11\xe7\x28\x53\xbd\x49\x9b\xaa\xb0\xe7\xba\x99\x9f\xc0\x6a\xe4\xa4\x25\x28\x4a\x04\xaa\x95\x74\xc0\x50\xf4\xd0\xb8\x04\x00\xe1\xf2\x44\x00\x85\xd8\xc4\x62\xfb\x7e\xa5\x48\x89\xc1\x6c\x54\x71\xb3\x48\x7c\x02\xc8\x58\x86\x29\x48\x99\x99\xc1\x82\x5b\x05\xc5\x46\x61\x5f\xa1\x4e\x6a\xec\x3b\x09\x05\x46\x82\x5f\x5a\x6c\x98\xf3\xd9\x5c\xa7\x0f\xe0\x61\x69\x76\x26\x92\x64\x40\xd4\xaa\x4c\x33\x20\x2a\xe8\xea\x6f\xd2\x30\xc6\x24\xe2\xbf\xa4\xc9\xa2\x4c\x51\xeb\x3d\x7a\x58\xd6\xa2\xaa\x2b\xa7\xaa\x06\x21\x58\xf2\xcd\x72\xce\xcb\x0e\xaf\x9d\x62\xcd\xaa\x6e\x74\x25\xdd\x0c\xc3\xa7\x72\xe8\xf5\x70\x12\x4d\x4b\xfd\x62\x77\x1f\x94\xb7\xa9\xea\xb2\x50\xf9\x0b\xa7\x64\x00\xfe\x38\x0c\xa7\x53\x38\x3b\x07\xca\xe5\xa5\x45\x79\x4a\xf1\xfa\x6d\x5d\xac\x5d\x63\x92\x33\xab\x62\xb3\x2c\x3f\xc6\x61\x18\xc7\x49\x8e\x46\xf0\x90\x41\xa7\x2c\xa4\x5a\xf5\x9d\x62\xa2\x85\x79\x92\x65\xd1\xe9\x94\x93\x0e\x70\x6f\x09\x32\x3e\x3d\x6b\x01\x30\x8d\x9a\xf8\x64\xf7\xfe\x5a\xdd\x15\x49\x14\x20\xc6\xe1\x24\x84\xcb\x90\x53\xce\x63\x16\xc5\x51\x2e\xb6\xd3\x8c\x8f\xd9\xb6\xd8\x30\x79\x1a\x34\xad\x1a\x98\x7e\x0f\x51\x33\x31\xcc\xe1\x64\xa9\xee\x12\xe0\x77\xbf\xdf\x67\x77\x70\xff\xb9\x23\xc4\x5d\xa1\xcc\x8c\x92\x1d\xe0\xe7\x3d\x26\x30\x76\x26\x43\x1a\x8d\xb3\x20\x5b\x9c\x1e\xe2\xc2\x05\xb4\xe0\x6f\x35\x54\x09\xdc\x14\xc0\xf3\x42\xd3\x85\xc0\xce\x29\x94\xaf\x24\xfd\x53\x73\x24\xea\x8a\x5d\x2d\xe5\x19\xa8\x14\xb3\x45\x96\x33\x1e\x81\xf3\xcb\x29\x47\xed\x29\x49\xc9\x5c\xb5\x20\x1b\xdb\x1d\x76\x8f\x15\x70\x01\x52\x29\xec\xc9\x6d\x98\x4e\x36\x24\x0d\xbc\x04\x41\x0b\x5d\x2a\x26\x3f\x51\xdf\xac\x3d\x93\x23\xc3\x10\x87\xa6\xc9\xc0\x0c\xb5\x4e\x4e\x0c\x5f\xde\x0c\xc1\x66\x4a\xee\x12\xe2\x4a\xfc\x32\x9e\xbf\x52\x28\xbc\x3c\x63\x07\xfe\xef\x25\x13\x64\x70\x6b\x0f\x87\x30\x92\xe1\x90\xf5\x49\x15\x9d\x77\x83\x2e\x7b\x48\xec\x23\xe4\xb3\x10\x13\xa3\xc2\xfe\x3e\x3c\x4c\x66\xf3\x24\xe6\xb1\x54\x7c\x0c\x97\x50\x20\x2d\x46\xea\x81\x75\x45\x43\xa0\xd5\xb4\x4f\x8a\xbb\xf0\xd1\xa9\x83\x56\x6d\xee\x5b\xd9\x12\x2a\x96\x23\xb6\xb5\xd0\x21\xe3\xbf\xbc\x54\x34\x3c\xb7\x69\x68\x75\xd6\x74\x9d\x4b\x64\x36\x43\x93\x44\x80\x2a\x40\xce\xd0\x8f\x3f\xa9\x27\x7d\x7b\xac\x81\xa1\x7e\x1b\xad\x5b\xfa\xad\x99\xc9\x97\xac\xe2\x00\x3b\x09\x31\x54\xbc\x1e\xd1\x39\x9c\x94\x32\x9a\x31\x61\xa4\xe8\x2a\xe6\x07\x55\x25\xfd\xc9\xaa\x27\x33\xab\x91\x6a\xf2\x0b\xad\x15\xce\xe7\x1c\x5e\x0c\xc8\x3a\xf8\x9b\xd6\xe0\xb1\x8c\x76\x8b\x15\xe0\x27\x2d\x9f\xf2\x10\x73\xd0\x2a\xb5\x2d\x7c\x0f\x5e\x2a\x96\x5b\x8f\xdc\xbe\x55\xec\x60\xb9\xee\x9e\xe2\xc1\x30\xd0\xd0\x0a\x9b\xb0\x6a\x60\x3a\xfc\x64\x08\xb0\x47\x68\x71\x65\x6a\x60\x5f\xed\x43\x39\x5a\x38\x98\xeb\xa1\x13\x4e\x86\x6f\x32\x6e\x49\xd3\x4a\x70\xb1\x1e\xd2\xd0\x67\x71\x97\x2d\xa2\x0e\xe8\x5b\xbf\x14\xfd\x5f\x42\x96\x98\x6c\x8f\x15\xc9\xaf\xa7\x40\xd7\x29\xcc\x80\x9e\x05\x5d\x05\x7e\xb9\x55\x90\x1f\x61\xd4\xdb\x0d\x76\x0f\x07\x6e\xd5\xb9\xb2\x9b\x40\x55\xfa\x0c\x77\x5f\xff\xb8\x52\x0f\x8f\x68\xfc\xc3\x41\x93\xe6\x47\xa5\x14\xd9\xbf\x75\x15\xa8\x69\xd1\x62\xa1\x25\x57\x7d\x9b\xaa\x4d\x82\x3e\x48\x84\x3d\xaa\x25\xe9\x39\xd0\x19\x0b\x91\x0c\xab\x2a\x01\x21\xaa\x2b\xdd\x32\x4b\xa5\xa4\x62\xcc\x5f\x9e\x89\x6f\xc1\xb1\xaf\x18\xae\xca\x5b\xde\x96\x32\xd0\xf2\x00\xcc\x7c\x84\x6d\xbd\x60\xe2\xe5\xad\x2b\x4d\x12\xf9\xf5\x95\x94\x04\x9f\xec\xf6\x8d\x6c\x1e\xc6\x0d\xa8\x2e\x04\x75\x73\xdf\x93\x78\xc4\x26\xbf\x7b\xa4\xdc\xcc\x69\xfe\x33\x1d\x29\xa3\x0c\x1d\x67\xca\x12\x0d\x76\xbf\x7f\x58\xa8\x5b\x95\x6a\x50\xc3\xfb\x96\x6c\xd0\x24\x1b\xfc\x76\x6e\xff\x76\x6e\xdf\xec\xdc\xde\xfb\x42\x07\xf7\x32\x37\x3c\xdf\x91\xbd\xde\x69\xfd\x8b\x1f\xd4\x4b\x63\x27\x75\xdc\x9a\x35\x0e\xe5\x5f\xf8\x28\x8e\xfb\xe3\x1f\x68\x9e\x27\x7c\xa4\xd2\x04\x66\x6a\x75\xe3\x0a\x11\xbb\xd4\xd5\x3e\x95\x0b\x26\xdf\xa0\xcc\x40\x98\xb5\x41\xe5\x78\x79\x16\x44\x4d\xf6\x63\x9f\x75\x9a\xe2\x3c\x04\x59\x7d\x90\x81\x6f\xd7\x12\x85\x80\x40\xd4\xa4\x8d\xa5\x34\x84\xbc\x8a\xc9\xe9\x3b\x3b\xaf\xa2\x16\x81\xdf\x0c\x0d\xdf\x0c\x0d\xdf\x0c\x0d\xff\x52\x43\xc3\x3c\x4c\x33\xfe\x44\x66\x42\x7a\x79\x76\x14\xc5\xe7\x53\x6e\x89\x7c\x73\xf7\x59\x5d\x35\x30\xcf\x5c\x13\x3c\xf6\x50\xb5\x4b\xc5\x00\xfc\x91\x75\x04\xa1\x8d\x3a\xd6\xc1\xf0\x57\xe6\xf2\xed\xc0\x2e\xdc\x13\x52\xec\x96\x9d\xa3\x4b\xc2\x6f\xc3\x6f\x75\x44\x52\xe9\x9c\x48\xb9\xc9\xf0\x64\x27\x6e\x14\x33\x2d\xfe\x68\x7b\x5d\x33\xb0\xc8\x97\x08\x0f\x1e\x54\xf2\x38\x4f\x97\x85\x67\x32\xd2\xf3\xe3\x1e\x0b\x20\x6f\x8e\xd6\x86\x4d\x72\x1e\x68\xa7\x51\x02\x07\x0d\xfb\x13\xd0\xe6\xc0\xfd\xb8\xc7\x3a\x26\x21\x54\xc7\x98\x3b\x20\xca\x58\x49\x57\xba\x13\x67\x64\x34\xe3\x15\x4d\xbc\xd8\xc1\x44\x3e\xae\xe1\x49\x19\xb4\xd1\xfa\xd4\xdb\xc4\xfc\x74\x88\x47\xfb\x5a\x36\x28\xa8\x6b\x3d\x8e\x1a\xa6\xfc\x6c\xdf\x24\xf4\x02\x74\x84\xee\x03\xb6\xa0\x61\xca\x55\x7e\xb6\xd5\x46\x2b\x6d\x42\x17\xd5\x4d\x7e\xed\x29\x58\x65\x5c\x66\x6d\xa9\x57\x59\x32\x83\xe9\x94\xc7\xe2\x8c\x8c\x3e\x47\x9d\x7d\xfc\xeb\x07\x68\x8d\x3f\x40\xc1\x96\x7c\x01\x0f\xb1\x86\xf2\x38\x60\x38\x7a\xa8\xae\x94\xdd\x6c\xa3\x62\x18\xd4\xd2\x17\xc0\xf0\xc0\x8c\xb3\xca\xb0\x26\xc8\xe3\x1c\x30\x61\x9c\xeb\x1a\xd9\x90\x38\x4d\xd8\xd4\xa5\xb9\x4d\x80\x6e\xb1\x63\xd1\xd1\x40\x25\xd6\x82\x97\x5d\xcd\xa6\x9c\x00\xf5\x6f\x5b\x68\xb0\x5c\x1e\x8d\x19\xba\x03\x42\x42\x93\x3d\xe5\xf1\x8a\x2c\x8c\x95\x27\x61\x3c\x9e\xf2\xa7\xd2\x92\x65\xb8\x29\x4e\xc6\x10\xc9\xe9\x31\x58\x1c\x48\xe4\x06\x35\xf3\x93\x28\xfb\xbb\x32\xc7\x0d\xfd\xf6\x38\xcb\x82\xa3\xaa\xfd\x9d\x5a\xd3\x64\x59\xc1\xa8\xe6\x6f\x43\x8b\x8c\x1d\x8d\x8e\x03\x52\x83\xe1\x68\x03\x82\xbb\x10\x65\x16\x2e\x7b\x56\x37\x66\x59\x5b\x34\xf9\x18\xe5\xee\x39\x70\x45\x97\x84\x0e\x6d\x6a\x76\xa2\x1d\xf0\xd9\x5c\xcc\x54\x39\x2f\x91\xd5\x54\xc3\xa6\x2a\xd7\xb3\x65\x58\x2d\x20\x56\x62\x63\x2d\x0e\x00\x92\x29\xdb\x81\xff\x9c\x4f\x72\x5f\x89\x75\xba\xc2\xa7\xf1\x18\xa2\x6a\x2c\xa7\xbc\xed\x7c\x3e\xf0\x12\x8f\x41\xfe\xc6\x62\xf5\x80\x1a\xd1\xd8\x9e\x4c\xf5\xa9\x3f\x21\x6b\xf3\xfc\x48\x70\xb7\x9d\x1f\x2e\xc3\x04\x8f\xb4\x03\x1b\xf4\x9e\xf3\x9b\xf2\x9b\x59\x1d\xe8\x39\xae\xcd\x78\x4d\x4f\x08\x3d\xd5\x09\xd2\x19\xf6\xe1\x37\xd1\x8c\x27\x8b\xbc\x84\xc4\xb4\xca\x7a\xc6\xec\xc2\xe2\x59\x73\xdd\x14\x97\x4c\xc1\x34\x5d\xa8\x4d\xbf\x16\x0c\xd5\xab\xb4\x0e\x0b\xb3\x26\xbb\xb7\xb2\x81\xb5\x04\x6b\xd4\xf7\xad\xa8\xe2\xa4\x5c\xe3\x56\x41\x4c\x40\x4f\x4e\x84\xe6\x38\x33\x45\xbd\xf2\x0b\x07\xf7\x22\xa1\x57\x71\x93\xe0\x52\xbb\xb7\xe6\x5c\xf6\xd6\x9b\xcc\x9e\x35\x9b\xb4\xba\x96\xda\x65\xe7\x58\x09\xa0\xc5\x8e\x1b\x6a\x38\x90\x02\x8d\xa2\x2b\x3e\x50\x7c\xc4\x6f\xda\x61\x63\xd0\x2c\x64\x08\x5f\xfb\xa6\xc3\x73\x53\x60\x2d\x7c\x9c\x10\x67\xe1\x3f\x45\xeb\xb7\xbb\xbb\xb5\xec\x4a\x1f\xa3\xdc\xae\xf3\x31\xb2\xee\x23\x72\x5c\xb3\xb2\x8e\xbd\x8c\x89\x90\x30\x4d\x88\x95\x54\xe3\x0f\xb2\xea\xa6\x2e\x50\x4a\xae\x4d\x90\x7b\x71\xd3\x77\x4a\x9c\xdb\x9e\x24\x9e\x2e\xf5\x75\x4f\xb3\xe4\xf6\x62\xad\xcb\x0b\x00\x7d\x9d\x1b\x0c\x7d\x1d\x53\xe3\x22\xa3\x66\x5d\xfb\x9a\xa7\xba\x6e\xf5\xad\x86\xbc\x9b\xd0\x97\x08\xbd\x95\xb7\x08\x92\x0e\xee\x55\x42\xe5\xf3\x73\x63\xfd\x92\xb0\x87\xc3\xba\xd7\x0a\x3b\x77\xd9\x24\x4c\x67\x49\xbc\x64\xd1\x0c\x5c\x43\xef\xee\xa0\xbc\x1a\xfe\xf1\xf4\xa7\x57\x8f\x0f\xff\x63\xf8\xec\xf9\xab\x97\xaf\xdf\x3c\x7d\x32\x7c\xfe\xf2\xc9\xef\xbf\x3d\x1d\x76\x86\xd3\x64\x1c\x66\x93\xa1\xf4\x36\x87\x53\x68\x69\x42\xcd\x1b\xe9\x60\x68\x68\xe5\xe9\xa8\x1d\x07\xeb\x00\xbb\x1e\x52\x5d\xe4\xcb\xf2\xc1\x6e\x08\x76\x83\x21\x6a\x18\xd7\x43\xa1\x07\x8c\x3b\x14\x67\x87\xac\x74\x78\x9d\x9b\x80\xbd\xc1\x18\x6d\x40\xd7\x43\x66\x77\x08\xa9\x8a\x87\xaf\x16\x29\x7f\x0d\xbb\x77\xf9\x6c\x3e\xb8\x5e\x17\xf7\x65\x17\x4f\xc2\x3c\xfc\x3d\x8f\xa6\xe5\x04\x85\xcc\x5f\x0c\xdc\x7c\x6b\xfe\x77\x97\xfd\xdb\x59\x34\xe5\x2f\xdf\xf3\xf4\x7d\xc4\x3f\x30\x69\x8d\x66\x6f\x92\x64\x9a\x47\x73\x76\x98\xc4\x39\x44\x82\xaa\x0b\x6f\xe7\xdb\x7d\xdd\xb7\xfb\xba\x6f\xf7\x75\x9b\xdf\xd7\xc1\xbf\x3d\xe3\x70\xfb\xed\x02\xe4\xdb\x05\xc8\xb7\x0b\x90\x7f\xd1\x05\x08\xfc\x87\xf2\x15\xf6\xc7\x9f\x93\x74\x16\xe6\x8e\x4d\xd2\x2d\xf3\x04\xee\xb9\x8e\x7e\x1a\x34\x15\xa0\xad\x2d\xf5\x22\x7c\x2d\x65\xe1\xf8\x0e\xbf\xc3\x76\xee\x32\xb0\xff\xbf\x4c\x8f\xf2\x94\xdd\xdd\x19\x48\xa8\xc7\x9d\xc1\x67\x02\xdc\x1d\x88\x95\x03\x7f\xb7\xdf\x25\x51\x1c\x34\xd8\xff\xc3\x20\x46\xae\x0c\x8b\xa2\x36\x4a\xa9\x73\x48\x95\x43\x6a\x1c\x26\xcf\xca\x7a\xba\xd7\xf1\x9d\x10\x70\x52\x5a\x21\x20\xa4\x6f\x23\x1c\xf7\xd8\x5e\xcd\x0b\x0a\x2f\x86\x15\x97\x14\xde\xfa\x2b\x3c\x66\xbd\x6d\xd6\x76\x9d\xf5\x42\xa9\x63\xde\xf7\x77\xbf\xa6\x33\x6d\x09\x9d\x3c\x5e\xb5\xb2\xac\xd2\x0c\xe6\xd2\xad\x96\x59\x72\x1e\x2e\xa7\x49\x38\x36\x36\x43\xf9\x81\xd6\xc9\xf8\x3c\x4c\x43\xd4\x91\x64\x2d\xfd\x89\xd6\x3b\x23\xab\x5c\xd6\xd3\x9f\x2c\x13\x6d\xce\x67\x60\xa5\x36\xf5\xf4\xa7\x42\xbd\x24\xb5\x00\x9a\x6f\xc6\xa0\x09\x6a\x8a\x1c\xc7\xd6\x96\x1a\x92\x73\x07\xa9\xe8\x31\x8d\xb2\x5c\x75\xfe\x89\xcd\xc3\xf1\x38\x8a\xcf\xf7\x58\xa7\xc5\x66\x61\x7a\x1e\xc5\x7b\xac\x03\x2a\x29\x6d\x23\x3a\x85\x47\xa3\x12\x72\x96\xa4\x79\x60\x30\x69\x82\xe3\xad\x59\x18\x70\xd1\xd8\x62\x91\x6d\x29\x82\x64\xf1\x51\x1c\x4e\x9f\xd1\xe1\x6b\xf3\x97\x75\x64\x18\x47\xd9\x7c\x1a\x8a\xe9\x3f\x9d\x26\xa3\x8b\x86\x6d\x08\x92\x48\xbf\x49\xe6\x7b\xec\xbe\xb7\xe8\xa7\x24\xcf\x93\x59\xa1\x74\x94\x4c\xc5\x36\x83\x17\xa1\xf0\x43\x30\x78\xe3\x6f\x9d\x4e\xa7\x41\x2a\x5e\xb5\xcc\x14\x11\x5b\x12\x0e\x61\x12\x66\x32\x4a\xfc\x4d\x8a\x40\x44\x29\x0e\x67\xc5\x0e\x81\x66\x74\x03\xc1\xba\x86\xd9\x84\xfa\x4d\x7f\xb8\xfb\x0a\x99\xcc\x1a\x1b\x4b\xc1\x18\xd0\x0e\xab\xac\x79\x8d\x69\xe4\xcc\xce\x27\xd4\xfd\x04\x91\x60\xf9\x8e\x26\x61\x9a\x67\xdb\x39\x2e\xf2\x6d\x41\xd9\x46\x4b\x2e\x6e\xfa\x11\x3d\x95\xe5\xed\xc7\x9e\xcb\x2a\x8e\xc3\xb2\x9a\x85\x83\x9b\x1b\x09\x93\xce\xb6\xae\x33\x75\x8d\xf1\x6c\x8b\x89\x6b\xb8\x38\x32\x66\x66\xd5\x2a\x68\xca\xdb\xa0\xaf\x7a\x48\x5a\xc2\x79\xc6\xa5\xcb\x6a\x0c\xeb\xab\x18\x0c\x6c\x18\x9e\x81\x38\x6b\xeb\xc0\xf9\x20\x97\xa5\x8c\x8c\x66\x66\x53\xfe\x0d\x22\x4e\x89\x13\xa8\x64\xd3\xe3\x2b\x24\xc4\x22\x8e\xf2\x52\x46\x15\x85\x20\x10\x1b\xf6\x38\xca\x1e\x06\x10\xc1\x72\xb3\x62\xa5\xb1\x98\x5a\xa3\xab\x33\x32\xb1\xaf\x35\xb4\xf4\x30\xbb\xdc\x95\xbb\xa3\x66\xb7\x0a\x83\xb9\x72\x6e\x76\xf0\xaa\x96\xdd\xd8\x85\xdc\x8a\x6b\xb7\x69\x78\xca\xa7\xb6\x42\xd0\x6b\x9b\x8f\x85\xaa\x6e\xad\x42\x85\x9f\x0b\x8a\x88\xac\xf9\xb3\x4f\x1d\xf9\x90\x86\xf3\x39\x4f\x5d\x04\xe8\x67\xeb\x16\x11\xd6\x48\xc5\x06\xae\xf5\x08\x92\x97\x5c\xa9\x19\x5d\xf2\xf1\x34\x1c\x5d\x9c\xa7\xc9\x22\x1e\x1f\xe2\xbe\xdc\xf8\xdb\xd9\xd9\x19\x99\xf8\xd3\x24\x1d\x73\xf1\xbd\x3b\xff\xc8\xb2\x64\x1a\x8d\xd9\xdf\x46\xa3\x11\xa9\xf1\x61\x12\xe5\xfc\x68\x1e\x8e\x04\x5f\xc4\x89\x40\x59\xf1\xee\x55\xcb\x1a\x98\x9e\x6b\x3d\x82\xdf\x2c\xaa\x57\x0c\xc3\x00\x34\x73\x62\x81\x9b\x84\xd9\x6f\x72\x5e\x6e\x52\x27\x80\xde\x4a\xf0\xc6\x50\x39\xf8\xe7\x81\xe4\x0a\x8c\xa8\x48\x74\x42\x5d\x63\x6b\xcb\xe1\x0b\xaa\x99\x59\x40\xed\x6a\x0e\x0a\xee\x32\xb9\x91\xd5\xde\x18\x47\xef\x1b\xd6\xa3\x2f\xdf\x52\x97\x60\xd4\x92\x6f\xd8\x6a\x42\x61\xa5\xdf\x94\x1c\x9a\xaf\x23\x86\x80\x58\x0e\x66\x84\xc9\x2c\x41\x64\x0a\x8d\x34\x6a\xd9\xbe\x21\xce\xa1\x66\xe5\x45\xa6\xf7\x30\x05\x97\x99\xab\x89\x71\x7c\x47\x1f\x4d\xef\x0c\xf4\x65\x67\xaf\x2d\xf5\x70\xa9\xf0\x36\xbc\x5d\x34\x4c\x75\xf7\x72\x54\xeb\x09\x7b\x6b\x5f\xcf\xb4\xc3\x36\x06\x05\x11\x54\xd1\xea\xed\xb5\xe0\x40\x04\xf7\x5b\xb6\x9c\xbb\x16\x20\x73\xe1\xaa\x8f\x07\x1b\xc2\x31\x02\xe5\x26\x00\xfd\x7c\x23\x64\x02\x50\xd7\x82\x10\xc6\xcb\xd6\x2d\x7d\xa4\xbe\x1e\x88\x34\x0d\x97\x2f\xcf\x6a\x5f\xc2\x51\x76\x99\x84\x73\x2e\xe5\x77\x0c\x4b\xf4\xfa\x43\xd0\x1b\xfb\x75\x26\x85\x3c\x22\x5c\xbf\xb5\xca\x32\x75\xfd\xf5\x72\x6d\xb2\x0f\xa4\x04\x12\x6a\xe0\x75\x89\x07\xb9\x80\x9a\x7a\x89\x80\x79\xe0\xda\xdc\x68\x5e\x49\xf6\x7c\xcf\x24\x89\x74\x69\x88\xcd\xcf\x59\x98\x9f\xae\xdc\x15\xf6\xe9\xca\x3c\xa4\x84\xb8\x74\x08\x1c\x1c\x1d\xf4\x2d\xab\x32\x04\xa2\x17\x03\xbb\xbb\xe3\xf3\x6c\x38\xbe\x13\xde\x19\xb0\x7e\x89\xfd\xac\x59\x74\x9d\xa8\x0c\x94\xfe\x2f\x72\x9d\x18\xf3\xd3\x64\x11\x8f\x78\xe9\xf5\xf0\x83\xde\x86\xbe\x13\xa6\x87\x9b\x70\x9e\x30\xd0\xbe\x79\x4f\xfc\xaf\xf5\x9e\x80\x15\x0b\xa9\x1e\x4b\x07\x7a\x4d\xae\xb5\x61\x6f\x30\x50\x1b\xd0\x75\x7d\x38\x90\x21\x52\x9e\x45\x7f\xf2\xe1\x98\xe7\x7c\x94\x27\xe5\xbe\x22\x8f\x76\xaf\xe9\xe7\x54\xda\xd1\x06\x04\x28\x85\x79\x3d\x14\x1f\xac\xe7\xcf\x72\x8d\x1e\x1e\xca\x1e\x7e\x4b\xce\xab\x3b\xd8\x7d\x00\xaf\x5d\xbf\xf9\x6b\x7c\xf3\xd7\xb8\xa1\xb8\x68\xdf\xdc\x34\xbe\xb9\x69\x7c\x73\xd3\xf8\x17\xb9\x69\xc8\x00\xa7\xb6\x4b\xe3\x1f\x68\x26\x20\x11\x87\x20\x41\xf3\x05\x67\x68\xef\x61\xe1\x38\x9c\xe7\x2a\xbf\x25\xe4\x50\x4d\xce\xd8\x3c\x4c\x45\xd5\xbb\xec\xc9\xcb\xe7\x10\x66\xf4\x16\xf1\x02\x79\xcd\xb3\x79\x12\x67\xd1\x7b\xb1\x82\xf2\x30\x8a\xc1\x32\x7b\xbd\xd8\x5b\x1e\x58\x15\x9e\x05\x9e\xda\x81\xda\x79\x2a\x9c\x0b\x3c\xcd\x9a\xd6\x3b\xc9\xba\x2f\x08\x3d\x80\xea\x78\x17\xf8\xfa\xc7\xe7\x83\x12\x30\x8e\x41\xe1\x84\xef\xd4\x16\xf3\x71\x98\xf3\x27\xd1\x8c\xc7\x62\xf5\x64\xcf\x66\x33\x3e\x8e\xf0\xed\xa0\xef\xe1\x16\x48\x2b\x6c\x3a\x4b\x16\x71\xce\xc7\xd4\x2c\x8a\x52\xa6\x60\xfa\x14\xc3\x8f\xf9\x87\x23\x99\x11\x19\x5a\x9f\xf3\x5c\xa3\x29\x0a\x82\xa6\x65\x86\x95\xd5\xdd\x8b\x78\x7c\x09\xa8\x1e\x37\x92\xa7\x8e\xf6\xe5\x4c\x32\x1d\xff\x11\x8d\x31\x5b\x81\x69\x21\xb6\x6b\xec\x10\x0a\x0b\x4d\x7e\xe5\xd1\xf9\x24\x2f\x6b\x83\xa5\xfb\x16\x3a\x36\x40\xcc\x7f\x27\xd0\xae\xec\xc9\x81\xe8\x6b\xa5\xfa\x32\x77\x45\x90\x1b\xd0\xee\x4d\x88\x46\x3d\xd0\xcb\xcb\x02\x5c\x59\x8e\xbf\x6c\xb7\x82\xa1\xfd\x90\xee\x93\x33\x90\x3d\xe7\x77\xcb\x85\xbd\x57\xe8\xec\xca\xf3\x7e\x44\xbe\x99\xb3\xf8\xcd\x7d\x97\xea\x76\x6c\xd2\x13\x14\xba\xdc\xee\x7a\xe0\xe1\xc3\x9d\xd7\x1c\xd3\x32\x4b\x1d\x50\x1d\x7a\xe5\x1b\xee\x6b\x1d\xba\x83\x66\xb0\x62\x85\xb4\x9c\xde\x84\x00\x5d\xd1\xc4\xca\xa5\x38\xc4\xa7\x66\x72\x9d\xec\xdc\x65\x3c\x9b\x46\x71\xbe\x3d\x8e\x32\x50\x0c\x19\x1c\x08\x76\xe2\x64\x7b\x1c\x8d\xb7\x61\xb5\x6d\x67\x3c\xdf\x46\x12\x82\xb4\x74\x5c\x83\xbc\x62\xce\x72\x0c\xd2\xf2\xf9\x49\x34\x7e\x2e\x20\x96\x5c\xc9\x15\xea\x11\x11\x40\x17\xbf\xd2\x5e\xe9\x4a\x97\x53\x51\x67\x95\x67\xce\x12\xb7\xd9\x12\x4a\x57\x3e\xc0\xd4\xa8\xfe\x11\x4d\xa7\xbf\xc7\xb3\x3a\xa3\x22\x55\xcb\x07\x26\x53\x5f\x94\x74\xeb\x8e\xac\xa4\xcb\x22\x01\x6c\x51\x0a\x7d\x6a\x56\x2f\xca\x52\x72\xad\x5a\xbc\x4b\x32\x95\xdd\x65\x64\x83\x6d\x8f\xa6\x11\x8c\xda\x92\x45\x85\x05\xe6\x6d\x84\x85\x0a\x81\x15\x17\xbc\x87\x62\xb3\xaf\xf6\x37\x13\x35\xdc\xab\x5e\x25\x14\xfc\xe2\xbc\x20\x64\x87\xab\xa4\x79\x51\xc2\xba\x4d\x5c\x01\xeb\x11\xaf\x3f\xb0\x8e\x4f\xaa\xfe\xc0\x3a\x75\x67\xa9\xce\x03\xdf\x6c\x2e\x93\x6b\xc9\x97\xbd\xf0\xdb\xba\x68\x56\x83\xc6\x0a\x1f\xdc\xb1\x4e\xf4\x10\xb1\x02\xfe\xa6\x35\x66\x51\xfc\x87\x0d\x44\x7d\x71\x6a\xfd\xea\x80\xd2\x9f\xac\x7a\xe1\xc7\x42\x3d\xf5\xa9\x5e\x7c\x4d\x43\xf5\x95\x17\xbf\x45\x1b\x83\x72\x3d\xfd\x10\xa6\x31\xde\xf8\xae\x04\xe2\x31\x85\x1c\xdf\x39\x97\xb7\xc7\xaf\x78\x3a\x02\x1d\x54\x80\x02\xe2\x36\x8d\x86\x75\x23\x40\x71\x42\x9a\x2d\xd6\x78\x33\xe1\x38\x9d\xc1\xff\xc9\x9a\x90\xae\x12\xcb\xf0\x67\xca\xd9\x69\x92\x4f\xd8\x59\xf4\x91\x8f\x19\x5e\x69\x64\xad\xb7\xb1\xa6\xfb\xf2\x94\xb3\x65\xb2\x60\xe3\x24\x7e\xdb\xc8\x59\xcc\x31\x29\xe6\x22\xe3\x2c\xf4\x29\x9f\xed\x46\x0b\xbb\x6b\xc9\x7e\x8c\xec\xbd\x11\xc2\xdf\x96\xcc\x7b\x79\xa9\xd8\xf8\x47\xd6\x91\xc3\xc4\x0f\x30\x30\x38\x8f\x9d\x72\x76\x0e\x1b\x55\xca\xf2\x49\x18\xb3\x3f\x79\x9a\x08\xfc\xb0\x5e\xd3\xda\x3f\x46\xe1\x74\xb4\x98\x86\x39\xd7\x3a\xdc\xcd\x4f\xf1\x81\x2b\x55\xf6\x90\x54\xfb\x5e\x3c\x34\xc3\xdf\x3c\x5b\x50\x4c\x64\x37\x7b\x72\xba\xac\x9d\x52\x52\x78\x6b\x8b\xd0\x9a\xca\xa1\x9d\x1d\xf6\x4a\x66\x00\x86\x23\xd6\x98\x67\x51\x0a\x69\x58\xa1\x36\xbc\xa7\x37\x92\xbf\x38\x32\x97\xe8\x3b\xb2\xe5\x3e\xed\x21\x3a\x23\xcb\x3f\xca\x58\xc6\xf3\x16\x4b\xde\xf3\x54\x1c\x5b\xb9\x28\x2e\x40\x8e\x32\x7b\xe2\x75\x7b\x4b\xb3\x35\x50\xb7\xb6\x8a\x30\x7e\x34\xad\x6c\x35\xd6\x33\x0e\x5d\xd3\xa7\x8e\xde\x24\xf7\xbb\x04\xfb\x51\x6e\x17\x45\xe4\x3b\xab\x96\x7e\x72\x86\xa7\x64\x96\x4d\x92\xc5\x74\x5c\x58\x2c\x1d\x23\x05\xe6\x53\x1e\x66\x5c\x66\x1e\xc3\x14\xad\xcb\x29\x9c\xa5\x47\x46\xe3\x4b\x52\x9d\x02\x24\x2b\xed\xd5\xc0\x4c\x52\x16\x8e\xc7\x2c\xd4\x1b\x05\x22\x95\x9a\x2d\x41\x7d\x00\x51\x63\x56\x36\x66\xe4\xcd\xd3\x64\x2a\xfa\xd3\xf0\xe4\x8e\x24\xba\x83\xce\xc5\x3a\x77\xa8\xd5\x2a\xd0\xc9\x11\x55\x2d\x8d\x4c\xcb\xa0\x51\x14\x17\xd7\xf3\xa9\x99\x26\xb1\x76\x5c\x31\x91\x8f\x0d\x63\x7d\x90\x67\x20\x07\xe7\x5b\xf6\x96\xbb\x57\x18\x83\xe2\xb3\xaf\x23\x2e\x45\x61\xdb\xef\xd5\xdc\xf7\x7b\xfe\x8d\xff\x83\x03\x6c\x95\x26\xd2\xf3\xa9\x22\x05\xe5\xa1\xe7\xd7\x1e\xa2\x31\xa9\x11\x59\x0f\x0b\xb4\x3b\x11\x0d\xb8\xa1\xbe\xd9\x07\x11\xed\xb1\x2f\x67\xd4\x62\xb1\xbd\x02\xab\xed\xf9\x98\x6e\x8f\xf2\x9f\xc6\x75\x8f\x0c\xe5\x6a\x43\x76\xac\xe7\xe2\x65\x11\x67\x8f\x95\xd0\xa4\xca\x6d\xc0\x7f\x57\x17\x34\x03\xe3\x95\x95\x6a\x2d\x62\x5b\xcb\x13\xb1\x7a\x15\x78\xcb\x3b\x57\xba\x6c\x65\xae\xbb\x65\xca\xcf\x2c\xae\x3e\x83\x38\x52\x4d\x27\xb6\xb7\x0c\x59\x31\x22\xb6\x3d\x51\x8d\x3a\xf2\x5f\x19\x11\xee\x77\xf3\xc2\xb3\xc4\xcd\x78\xb0\x6d\x70\xdb\xd7\x0e\x5b\xec\x93\x0c\xa4\xa4\xce\x5f\x60\xbd\xc5\x4f\xfa\x78\x05\xdf\x92\x18\x8d\x15\x56\xe0\x11\x69\xbf\xa8\x11\x36\xdc\xa3\xe7\x6d\xe4\xae\xe6\x7a\xab\x79\xe0\x37\xca\xe3\x78\x80\x38\xbe\x96\xab\x8a\x74\xd9\xb9\xa5\xa5\xed\x17\x77\x1a\xda\xc0\xf3\x07\x91\x47\xd7\x1f\x25\x4c\xfe\xaa\xf8\x13\x41\xf7\x17\x1e\xc2\x1f\x7f\x6d\x26\x22\xfb\xca\x5f\x75\x08\x24\x9c\xce\x35\x00\x25\x63\xde\x8e\x32\x19\xad\x19\xb6\x36\x65\x55\xdd\x50\xba\x44\xd7\x73\xa9\xfc\x3a\x48\x5a\x67\x57\xff\x7a\x87\x50\x9d\xaf\x41\x8a\xfd\x46\xb7\xd3\xf9\x3f\x0d\x2a\x48\xcd\x17\xc3\x02\x1d\x9a\xcc\x61\x03\xcf\xc3\x92\x2b\x3a\xc7\xef\xf0\xd1\xd7\x98\xfd\x01\x55\x84\x27\x52\xf9\x28\xf5\x68\xfa\xbe\xa4\x41\x55\x00\x75\xbb\xe6\x17\x89\xa3\x5e\x0c\xa5\xe5\xe2\xab\x8a\x8a\xd3\x53\x27\x41\xfe\x17\x9f\x9e\x6f\xa1\x78\x86\xd9\x34\x1a\xf1\xf1\x9b\x44\xe5\x9d\x2f\x71\xee\x82\x6a\xcf\x72\x0e\x5e\xc8\x41\x98\xa6\xf8\xe8\x19\xcf\xb4\x61\x2a\x58\xfb\x78\xb0\x8f\x3f\x63\xed\x1d\x05\x3f\xcd\xad\x0c\xfe\x16\xf4\xd0\xa1\xaa\xf7\x59\x9e\x2e\x29\x69\x87\x11\x90\x2b\x3d\x3e\x5a\xce\x4e\x93\x69\x3b\x92\x7d\x0e\x02\xa1\xfd\x66\xfb\xec\x76\x00\x1d\x04\x43\xb8\x96\x8f\xda\x31\xff\x98\x07\xcd\x66\x7b\x9c\xc4\xbc\xb9\x6f\x7a\x17\xd8\x09\xcc\xda\xf3\x45\x36\x09\x86\x19\x3e\x5b\x94\x4e\x18\x91\x60\x7d\x28\x55\x69\xc3\xfb\x7d\x31\x20\xcc\x56\x0e\x04\x1b\x85\xf9\x68\xc2\x02\x9e\x82\x2b\xd2\x50\x5f\x9a\xe1\x00\x78\x9a\x8a\x6a\xf0\xb8\x65\x2a\x06\x80\xc3\xc0\x8b\xf6\x18\xa0\x47\xc7\x77\x90\xe8\x77\x06\x4d\xeb\x57\xd0\xb4\x9b\x8a\x46\xc3\x71\x53\x7a\xca\x0c\xb9\xe5\x1a\x26\x90\xdc\xf7\x79\x8a\x99\x39\x10\xed\x61\xfa\xda\x2a\x21\x79\x98\xa2\x5b\x94\x6c\x24\x41\x40\xc2\x7a\x51\xd9\x21\xad\x60\x41\x69\x5d\x73\x1a\x7a\x67\x5d\x83\x2a\xf1\xed\x79\x16\xbf\x0f\xa7\xd1\x98\x85\xb9\x10\xfd\xe0\x3e\x32\xe6\xe8\x33\xb1\x48\x39\x8b\x93\x78\x1b\x7a\x3e\x9d\x1a\x97\x2e\xe9\x89\x65\xbb\x8f\x7d\x73\x3a\xfc\xe6\x74\xb8\xb6\xd3\xe1\x67\xc9\xdf\xf2\xd9\x53\xab\xa4\xd6\x36\x0a\x8f\x38\xca\xfa\x7a\x74\xbf\xf3\x2d\x7f\xe9\x37\x77\xcd\x6f\xee\x9a\xff\x37\xbb\x6b\x4a\x57\x4a\xfb\xec\x50\xd3\x67\x92\x34\xaa\x76\x97\x24\x15\x57\x44\x60\x2a\x9e\x35\xd8\x75\xfc\x23\x09\x8c\x9a\xae\x91\xb4\x57\xe2\x15\xe9\xb8\x43\xba\xee\x69\xfc\xe3\x3c\x8c\xc7\x10\xda\x57\x19\x68\xf4\x63\x7c\x52\x26\xcd\x4f\x4e\xd1\xd1\x28\x4d\xa6\xd3\xdf\xf8\x59\xb1\x15\x16\x41\x30\x1e\x5d\x92\x4d\xd2\x28\xbe\x58\x55\xe2\x80\x9b\x86\x59\xee\xf6\x2e\xbe\x69\x6c\x3d\x3e\x73\x29\xcf\xb8\x76\x73\xc4\x5f\xed\xd3\x28\x1e\xff\xff\xec\xfd\x7b\x97\x1b\xc9\x71\x20\x8a\xff\xcd\x3e\x67\xbe\x43\x10\xbf\x15\x51\xd5\x28\x00\x55\xe8\x37\x9a\x20\x3d\xe2\x70\x24\xfe\xa4\x99\xe1\x1d\x8e\x5e\x8b\x69\x37\x0b\x40\x02\x28\x36\x50\x85\xa9\x2a\x74\xa3\x39\xec\x7b\xb4\x5e\xc9\x6b\xef\xca\x2b\x9d\xb5\xe5\x87\xec\x6b\xdf\xdd\xb5\xd7\x7b\xbc\x6b\x49\xbb\xf6\xda\x1a\x59\xb2\xbe\xcb\x9e\x21\x67\xf4\x97\xbf\xc2\x3d\x19\xf9\xae\x07\x1a\xdd\x6c\xf2\x52\xbe\xd3\x73\x86\xa8\xca\xca\x8c\x8c\x8c\x8c\x8c\x8c\x8c\x8c\x8c\x64\x0e\x6f\xdc\xf6\x6c\x5c\x6f\x80\x35\xcb\x12\x7a\x62\xbe\x60\xa1\x77\x5b\xd6\x4d\xcd\xe0\xac\x62\x0f\xb5\xaf\x05\x93\xc9\x4a\x2e\x6a\x32\x63\xd6\x95\x6b\x18\xc5\x7d\xf2\x15\xf4\xc5\xb3\xca\xf7\xe4\xae\xc2\x25\x8e\x69\x99\xba\x9f\x97\xd8\x96\xeb\x9b\xce\x5f\xfa\x3e\x89\x59\x00\x67\x79\x63\x09\x65\x99\x19\x1c\x68\xd9\x85\xfb\x71\x26\x98\xae\x7b\x50\xbc\x29\x97\xc9\xe6\x1d\xc8\x6d\x2b\xc5\x06\x56\xd6\x5f\x44\xcb\xc0\x34\x5d\xb1\x7d\x51\x98\xb3\x80\xba\x6c\x4b\x5b\x8a\x0e\xd6\x1b\x25\x14\x2e\xcc\x6b\xd1\x55\x19\x57\x22\xe9\x63\x26\x9c\xba\x58\x8c\x4a\x0c\xd9\x14\x24\xca\xe0\xfc\xa8\x06\xb6\xf8\x86\x40\x56\xe2\x88\xa5\x08\xe7\x33\x66\x59\x90\x8d\xf6\x46\x22\x87\xae\xe0\x0b\xe3\xc3\xd7\x74\xd7\x93\xfc\xe7\xf7\xa2\x59\x61\xb1\x2f\x9a\x6e\x22\xac\x9d\x28\x2a\x0a\x2a\x34\x3e\xe4\x2b\x34\x3e\x6b\x15\x1a\xe9\xba\x67\x45\x21\xdd\xce\xf7\x87\xec\x97\x38\x43\xf2\x7e\xec\x6a\xac\xa6\x6d\xa8\xd1\x69\x3b\xe3\x9d\xc8\xce\x0e\xf0\xdd\xbb\x46\x34\x1c\x26\x84\x3b\x38\x42\x0e\x86\xf2\x2d\x59\x01\x08\xcb\x7c\xb0\x64\x0f\x3f\x21\xe5\x3e\x8e\x74\x10\x9d\xe3\x3c\x6d\x7a\x80\x72\xa5\xe6\x24\x08\x07\xd1\x09\xea\x6f\x55\x69\xd2\xa8\xae\xe8\x5b\xcf\xcf\x51\x64\x45\x8e\xd9\x3c\x63\x6b\x7c\x16\xc9\x1b\xc5\xaa\x6c\x5d\x54\xdd\xd7\x90\x62\x05\x1b\xfd\x79\x4c\x7f\x1f\x64\x6f\x7f\xd1\x4a\x17\xe4\x6c\x88\xcf\x12\x57\x65\x2f\x60\xcd\x64\x6e\xc1\xd3\xd9\x3c\x25\x83\x65\xc0\x4b\x72\x73\xf4\xec\x7c\x45\x7a\x13\x24\x98\x8e\x6a\xa3\x51\x0f\xc3\x3c\x31\x50\xa6\xf4\x88\xc9\xc4\xc7\x0b\x73\x72\xb4\xce\x78\xcd\x4b\x50\x05\x5a\x82\x3e\x5a\x75\xbe\x82\x9a\x11\xce\x27\xaf\x43\xe4\x0b\xb2\x11\x60\x96\xd3\xa6\xfd\x32\x37\x58\x5d\x0b\xc8\x70\xe0\xf9\x8e\x2a\xfa\x14\xbf\xfc\xe2\x20\xcc\x62\x91\xab\x65\x6a\xd2\x98\xc5\xe4\x98\x0a\x56\xe1\xa4\xb0\x2f\xbf\x24\x69\x34\xa3\xb2\xdd\x1f\xe1\x1d\x31\x96\x9d\xf1\xf9\xc8\xba\x12\x9b\x4e\x33\x86\xfc\xd9\xb8\xf0\x2c\xbd\x79\xde\x2c\xbd\xb1\xda\x34\xbd\xb9\xda\x34\xbd\xa9\x4f\xd3\x6c\xfc\x88\x93\x1f\xcc\xa1\x59\xf2\x01\x9d\xe8\xc6\xea\xdc\x87\xfa\x9a\xf7\x9b\x5b\x75\x36\xcf\x32\x7e\xb9\x86\xf0\x82\x3d\x9d\x0a\xfb\x54\xfb\xce\x55\xea\x5c\x54\xaa\x33\xa7\xd8\x1c\xd2\xd0\x46\xdd\x83\xec\xb5\x51\x7c\x5f\x8a\x11\x30\x3b\x3c\xf3\x3e\x60\xb9\x7c\xb9\x11\x96\xf1\x0d\x5a\xed\xce\x97\x5c\x80\x27\xee\x6c\x53\xdc\x1e\x26\xca\x78\x53\xf2\xee\x37\xab\xf8\xde\x98\x8e\x37\x46\x58\xa8\x55\x6f\xa9\xc9\xe0\x7c\x31\xac\xa3\x90\x49\x12\xc3\x2d\x86\x25\xad\xd4\x24\xd9\x28\xd6\x15\xd9\x16\x65\xda\x74\x5e\xab\x58\x53\x54\x03\x74\x0e\x3b\x53\xa1\xfd\xec\x5f\x59\x2a\x31\xb5\xee\x8a\xa9\x54\xdc\x00\x56\x95\x1a\x6c\x06\x01\x57\xf1\x77\xd2\x40\x16\x5e\x33\xb4\x5f\xb4\x9d\x98\x2d\xb7\xb6\x96\xb1\x1a\x64\x7d\x99\x0c\xf7\xad\xa2\x1b\x81\x7a\x51\x84\x41\x03\x4d\xa7\xae\x65\x39\x95\xab\x57\x51\x2e\x16\xac\x67\x3f\x87\x58\xc1\x5e\xb9\x81\x1b\x33\x3d\xe5\x10\x91\xc9\xaa\x56\xc9\x0b\x52\xcc\x93\xcc\x15\xa4\x84\x2d\xd0\xcf\x72\x9b\xac\x9b\xee\xab\xb5\xc9\xaa\xb4\x5c\x21\xe6\x45\x97\x9b\xa9\xb4\xac\xd0\xe5\xda\x50\xf5\x7b\x49\x34\x99\xf3\xf5\xdb\x44\x59\x4e\x52\x69\x5e\x89\x35\xa3\x4e\x8f\x07\x40\xc6\x97\xe8\x98\xc4\xc3\x49\x74\x42\x95\xa1\x60\x30\x20\x2c\x74\xe8\xe3\x7b\xe1\x80\x2c\xc4\x31\xc5\xe3\x20\x09\x7a\xc1\x24\x48\x4f\x55\x2e\x19\x71\x3d\xc7\xf7\x0a\xe7\x82\x4f\x17\x46\x5c\xf8\x4f\xb4\x72\xfe\x13\x98\x22\xd1\xc8\xce\x75\x1a\x1a\x05\x9f\x2e\x8d\x46\x89\x1b\x47\x11\x6b\x79\xcf\xc5\x5a\xfc\xf8\x39\xdf\x77\x18\x90\x19\xd5\x25\xc2\x7e\x40\x12\x3c\x41\x4e\x9b\xdc\xf3\x27\x7e\xd8\xc7\x33\x7c\xc5\xdb\x1e\x2d\x1b\xf3\xb1\x4b\x85\xdf\xe4\x28\xdc\xf1\x99\x89\xab\xb0\xc4\x06\x2b\x31\x25\x8b\x59\x69\x9e\x2d\x5b\x62\x87\xa6\x4b\x3f\x4c\x35\xa4\xde\x7a\xfd\xeb\x87\x0f\xde\x7b\xfd\xce\x97\xa0\x03\x9e\xeb\x42\xb3\xa9\xb9\xfb\x93\x30\x9a\x8f\xc6\xb8\xc1\xe8\x43\x82\x77\x1e\xa2\x77\xb9\x65\x37\x1a\x0d\x2c\xfe\xf6\xdd\x07\xef\xdd\x7d\xe3\xf0\xce\xeb\x5f\xbe\x73\xf8\xee\x5d\xe8\x40\xd3\x7a\xbf\xf6\xe4\xfd\xfa\x93\xf7\xd7\x9f\xbc\xff\xfe\x93\xee\xaf\xfb\xf5\xc7\x07\x4f\x6c\xeb\xfd\x64\xdd\xb6\xde\xb7\xec\xe6\x48\x22\xf3\x85\x49\xd4\xf3\x27\x54\x53\x0a\xfc\xde\x44\x43\x29\x49\xfd\xfe\x91\xcc\x76\x77\x31\x8b\x12\xc2\x89\x72\xe7\xc1\x83\x3b\xfe\xa4\x0f\xb3\xc9\x7c\x14\x84\x6b\xc0\x8e\xfc\xa3\x71\xfd\x43\x41\xb0\x33\x04\xc4\x3a\xae\xc1\xfb\x0d\x3a\x26\x00\x09\xfd\x5d\x4c\x85\x3b\x0f\x1e\xf0\x86\x41\x10\xd2\xb6\x72\x37\xa3\x93\x31\x09\xc9\x31\x89\x21\x48\xab\x09\x08\x0b\xb0\xa8\x77\xe6\xc7\xfe\x14\x3e\x7c\x80\x99\xcf\x98\x70\x80\x7e\x92\x40\x10\xce\xe6\x29\xa2\xa1\xcd\x7b\x5a\xf5\x16\x8f\x42\x3c\x20\xfd\x60\xea\x4f\xee\xc7\xa4\x1f\x24\x78\xdf\x33\xc6\x42\xa3\xed\x87\x0e\xda\x48\xb3\x39\xa0\x03\x6f\xf9\xe9\xb8\x31\x8b\x4e\x2c\xcf\xcd\x43\xc0\x45\x8d\x7e\x4d\xf6\x16\xb4\xf3\xd5\xe0\xc1\xde\x26\xbc\x3e\x99\x44\x27\xa2\xdd\xb8\xe7\x31\x49\x83\xd9\x84\xc0\x24\x08\x69\x7f\xf0\x16\x75\xf8\x45\x0e\x31\x99\x4d\xfc\x3e\xb1\x9a\xef\x87\xb5\xe6\xc8\x81\x0a\x54\x18\x24\x76\xe7\xd4\x3a\xdc\xa5\xf9\xfc\x94\x24\xe0\x87\xda\x5e\x0a\x7e\x64\x39\xb2\x24\xcb\x64\x82\x5f\x63\x13\x40\x22\x73\xac\xb1\x7b\xa5\x34\xb3\x3e\xe1\x95\xdc\x55\x7b\x35\x96\x02\xe3\xc8\x8c\xf7\x06\x24\x4c\x83\x61\x40\x62\xb9\x49\x86\x53\x0c\xdf\x9d\xed\x1f\xd5\x6a\x70\x4b\xb1\xbf\x52\x49\x74\xf2\x03\x2e\x32\xc4\x7e\x91\xdc\xc6\x9b\x4c\x78\x2e\x21\x8d\x71\x88\x54\xa0\xc6\x6a\xe2\x4a\x83\xac\x4e\xdb\x56\xc2\x8d\xb0\x8a\x6e\x8d\x33\x81\xe7\xb1\x87\x1a\x54\x2c\xbb\x0d\x55\x01\x9e\x26\x54\xd9\xfe\x14\xd7\x94\xc1\x47\x9f\x03\x0c\xa0\x9b\xcc\xfc\x3e\xe1\xfc\x5b\x31\x30\xd1\xb1\x90\x54\x7c\x9b\x24\x29\x19\x28\x5a\x1a\xa4\x64\x8d\x91\x3b\x21\xf3\x30\xc0\x91\x34\x22\xe9\x57\xe8\xe3\xbd\xb0\xb0\x1c\x2f\xd1\x6c\xc2\xbd\x21\x1e\xf8\xd1\x2a\xe6\x08\x27\x8a\xd5\x18\xd0\x28\xc6\x21\x28\x65\x81\x23\x40\xa4\x63\x12\xc2\x84\xa4\x59\x40\x3d\x02\x56\xd0\x20\x0d\xe8\xc5\xd1\x49\x42\x62\xce\xc5\xb6\xa4\x39\xc2\x55\xf7\xc9\x7b\x74\x21\xaa\xca\x37\x02\x3a\x5f\xbe\x33\xb4\x2a\xc7\x7e\x6c\x55\x6c\xb8\x05\x75\x2f\x67\xf5\x2b\xe9\x0c\xda\x11\x1a\x2a\x35\xa8\xd8\x15\x9d\xd0\x82\x56\xe8\x05\x14\xb0\x0b\xea\x9f\x3c\x81\x4a\x65\xcd\xc0\x8e\xf1\xc2\xe7\x34\x66\x68\x36\xa9\x84\x3e\x26\x71\x0a\x33\x76\x26\xcf\x1f\x91\x04\xd2\x48\x1e\xbb\xa4\xcf\x4c\xbf\xd2\x30\x48\x60\x12\x1c\x91\x36\x6c\xb9\x9f\x83\x75\xfc\xd7\x3a\x09\x26\x13\xe8\x91\x7e\x34\x25\x6d\x68\x6d\x7d\xce\x6e\xab\x2a\xfa\x51\x98\x44\x13\xd2\x98\x44\x23\xa3\xd7\x58\x06\x93\x4b\x14\xc1\xd4\xe0\xef\x75\xdd\xfa\xde\xfb\x8d\x83\xda\xe7\xa8\x10\x90\x33\x25\xc7\xb8\xe0\x10\x32\x5e\x50\xfa\xe6\x24\xf2\x53\x91\xa9\x81\xa6\x0a\xcb\x75\x28\xd5\x6d\x58\x07\xb7\xe1\x7a\x72\x6d\xaa\xd3\xb2\xd9\x84\x77\xc9\x34\x3a\x16\x8c\x12\xe8\x82\xa5\x2d\xc9\x9d\x46\x42\xf6\x14\x63\xcd\xb6\xc2\x47\x77\x17\x33\x24\xbd\x03\x95\x51\x50\xb1\x1d\x3a\x14\x25\x0c\x76\x39\x3f\xab\x16\x7d\x9d\x24\x33\x24\x4c\x77\xa7\xb3\x6c\x83\x0e\x1c\x4b\x55\x67\xcb\x05\x02\x48\x7f\xaa\xab\xe2\xa3\x66\x13\xf0\xba\xd9\x61\x14\x4f\x31\xc0\x36\xed\x7d\x5f\x63\x0d\x8e\x5a\xfb\x1c\xb6\xe2\x0d\x58\xc7\x09\x3e\x53\x81\x3f\x78\x44\x05\x09\x46\xee\x0e\xc2\x11\x24\xe3\x20\x15\xdf\x2c\xb7\xe1\x61\xdf\xb4\x10\xa6\xdb\x70\x5b\xae\xf9\xb7\xa9\xc6\x5b\xbe\x8d\x62\xf0\x3d\x79\x02\x4b\xf1\xe2\x33\x1a\xa2\x60\x09\x5c\x0b\xa6\xc6\x66\x2e\x2d\xd3\x96\xd7\x07\x03\xac\x69\x4d\x03\x5e\x63\x63\xd0\xb8\x49\x87\x77\xb4\x0c\x70\x91\x9b\xbd\x42\x14\x8a\xfa\x08\x7b\x31\x53\xd8\xf9\xc2\x97\xd3\x4a\x8d\x02\x2a\x06\xfb\xa8\x01\xf9\x71\x0a\xc3\x38\x9a\x16\x60\x4b\xf9\x84\x84\xc9\x3c\x26\xa2\x74\x8f\x60\x04\x79\x29\x2c\xa3\xe9\xcc\x4f\xf9\x1a\xa1\x60\x72\x28\x18\xf6\x96\x75\xbb\xfd\x7e\xbd\x4b\xd5\xb9\xda\xfb\x75\xfb\x36\x45\xc2\x46\x2d\x40\x1b\x42\xa2\x61\x83\xfb\x14\x3b\x3a\xd3\xc9\x4f\x61\x14\xde\xcd\x7c\x35\x29\x87\xb9\xa6\x74\x08\x11\x16\xd5\xff\x64\x1c\x4c\x08\x58\x16\x4f\x83\x4e\x46\xd9\x6c\x90\x05\xe9\x5b\x59\xb8\xb6\x6d\x9a\x7c\x79\xe9\xae\x7b\xc0\x64\x7e\xf6\x80\xb2\x89\x72\xad\x93\x43\xb4\x91\xcc\x7b\x6c\x3a\xb5\xf0\x5e\x1d\x13\x9c\x5d\xb4\xef\x21\x14\x7d\xda\xb3\xd0\x91\xaf\x56\xc5\xaa\x38\x74\x90\x3b\xcb\x2a\x51\xa0\x6d\xad\x19\x3a\xc8\x46\x2f\x1a\x9c\xe6\x34\x89\x02\x45\xa5\x9a\x97\x30\x17\x52\x1c\x32\xcd\x92\xa4\xd2\xf4\x07\x8d\x79\x73\x28\x52\xde\x30\x94\x88\x02\x6a\x1b\x85\x66\x31\xa1\x08\x8b\x3c\xbc\x4c\x01\xe7\x98\xa5\xa2\x24\xd5\x25\x81\xb0\x21\x98\x55\xe5\xc0\x88\xf1\x2f\x85\x42\x76\xd1\x25\x94\xf4\x62\xd6\x7f\xdf\x6a\x3a\x05\x54\xb0\xd7\x54\x28\x32\xf4\x2f\x49\xe0\x64\xec\xa7\x7c\xf6\xf2\x63\x02\xf3\x84\x0c\x70\x91\x61\xaa\xc8\x85\x2b\x0a\x23\x83\x26\x59\xd0\xc2\xcf\xd6\x39\x6b\x7a\x48\x97\xa5\x6a\x19\x37\x60\xa0\x6e\xf2\xc1\x9c\x7c\x85\x6b\x73\xdd\x03\x23\xf9\xcb\xd1\x09\x89\xef\xf8\x49\xe1\xf7\x14\xe7\x50\xba\xca\xeb\xbe\xdf\x70\xeb\x7b\x07\x56\xf7\x73\x48\x16\xbb\x39\x0a\xd6\x8c\x21\xcc\x95\x1f\x2c\xc0\x46\x6a\x46\x43\xe4\xc3\x9b\x67\xd7\xb5\xf3\xeb\x02\xc4\x93\x27\x20\x9e\xf1\x46\x39\x3d\x38\x53\x10\xf2\x1b\x5a\xce\x0c\xad\x2a\xd7\x02\xa9\xe9\x29\x40\x8d\x34\x92\x79\x2c\xdb\xc6\x91\xa4\x6b\x7f\x1a\x7d\x98\x6b\xb5\x86\x83\x91\x25\x53\x53\x26\x6f\xa6\x1a\x1d\xd9\x95\x68\x64\xf2\xa7\x86\x14\x65\xb1\xac\xf1\xa2\xb5\x82\xf1\x02\xed\x14\xb9\x75\xb1\x18\x4b\xfb\x8a\x93\xa4\xc0\xf2\x1d\xe8\x39\x54\x26\x30\xe2\x60\xc0\x07\xdd\xeb\x91\xa9\x54\x36\xf8\x18\xe1\xe0\xb4\x47\xde\xa2\x0d\xa3\xc5\x68\x99\x7d\x5e\xa4\x57\x54\xa4\x67\x16\xe9\x89\x22\x9c\x8b\xa8\xdc\x8c\xfd\x70\x44\x34\x1c\x74\xfb\x6b\x0c\x37\x6e\xf0\x0e\x4b\x52\x3f\x4e\xdb\x10\xcb\xad\x2b\x12\x0e\xe8\xab\xc7\x5f\x67\x31\x9e\x06\x8e\x95\xd2\x49\xb3\x72\x1b\x39\x95\x53\xfa\x57\xfa\x09\x6a\xe0\x73\xe5\xc5\x41\x38\x3c\x2f\x15\x34\x66\x5e\x8f\xe6\xed\x89\xcb\xd9\xd6\xd0\xa1\x49\xf7\x65\xd4\x1a\x18\x93\x91\x46\x49\x1c\x28\xd0\x41\x60\x53\xf1\x1d\x09\xc6\xdb\x37\x85\xdb\x30\xa5\xb8\xb4\x79\x0c\x9f\xb3\xb5\x35\xd1\x2d\x0d\x24\x8c\x20\x90\xd6\x6f\x59\x82\xc9\xaa\x7a\x64\x94\x38\xf4\x5f\x07\xad\x65\x0e\x33\x2f\x3a\x5c\x13\xda\xe7\xb9\xfc\x80\x63\x24\x86\x8c\x6f\x8b\x4f\xbd\xec\xa7\x9e\x43\xb3\xd7\xc0\x93\x59\xf0\x54\x43\x80\x7d\x84\x7c\x12\xc0\xad\x0e\xb8\xb4\x9b\x7a\x81\x3e\xe9\x52\x5c\xd8\x59\x0a\x7c\x9d\x30\x5f\x10\x0a\x9b\x7b\xab\xaf\xe9\xb3\xbf\x82\x72\x9d\x21\x6b\xce\xee\x01\x74\x68\xad\xfa\x2c\x48\xe1\xb3\xa1\x18\x68\xb1\xdf\xf2\x6d\x73\x40\xe1\x0f\xa6\x37\x00\x82\x90\xc7\x26\xc0\x33\xd7\x34\x5c\x69\xed\xf2\x9a\xa2\x99\x65\x3b\xb4\x8d\x07\x19\x48\x06\x4a\x74\xa0\xc9\xec\x0a\x2d\x5e\x1b\xdc\x44\x3a\x98\xdb\x22\x9c\x32\x3d\x32\xd2\xf7\x42\x62\xbe\x21\xdb\x0b\xf4\x48\x22\xaa\xaa\x82\x8e\xca\xb4\x53\xee\xdb\x62\x87\xc1\x4d\x5a\xe6\xc6\x0d\x10\x1d\x76\x9b\x3e\xb5\x25\x7c\x4d\xbc\x6a\x64\x29\x50\xe2\xbb\x3a\x6b\x81\xee\xa7\x62\xcc\xb2\x8c\xe1\x0a\x24\xd8\xc6\x73\x9a\x5f\x9f\xdb\xfa\xba\x69\x67\x6d\x8e\x0f\xf3\x4a\xc1\xc3\x4b\xd8\x1c\xf5\xf2\xb2\x8a\xaf\xf9\x93\x23\xaa\xb0\xcd\x47\x63\xf0\x27\x13\x5d\x7d\x57\x7a\x05\x55\xf7\xa7\x18\xb1\x24\x08\x13\x12\xa7\xec\x3d\x08\x79\xbc\xd2\x01\xe9\x4f\x7c\x0c\xa1\x93\x55\x20\x98\x82\x60\xae\x60\xd4\x57\xb6\xed\x71\x96\x29\xaf\xeb\x12\x05\xda\x90\x30\x89\x8a\x3c\xef\xde\x65\xba\x1d\x5d\x98\x2a\x49\xc3\xbc\xbd\xb9\x1a\xa9\xfa\x7d\x44\x52\x1d\x58\x52\x00\xcd\x6e\xb0\x4a\x55\xe7\x8b\x3c\xcc\xd1\x5f\xd7\xed\xd8\x17\xb9\x38\x89\x7a\x8f\x1a\x4b\xd6\xd8\xf4\x33\x9f\x71\x99\xea\x5c\x63\x4a\x38\xa5\xb2\xd1\xc4\x6c\x46\xac\xba\x00\xb2\x6a\x38\x7b\x32\x9a\x61\x33\xa7\x03\x86\xa2\xae\x0e\xde\xf7\xe3\x84\x24\xc6\x3a\x0d\x35\x70\x7e\xd9\x5c\xb9\x49\xb9\x44\xf7\x83\x5f\xf3\x67\x01\xcc\xe2\xe0\xd8\x4f\x49\x5e\x17\x34\xe9\x9d\x43\x53\xf6\x98\x8e\x0f\x6a\x7b\x3c\x7d\x18\xa2\x3d\x9f\xbb\xcc\xa8\x92\x6c\xe1\xc1\xd7\x09\x70\x1b\x34\xd3\x4a\xe5\xfd\xf7\x7b\x48\x71\x2d\x37\xa5\xf5\xfb\xef\x5b\x15\x1b\xda\x5a\xf2\x1a\xc0\x20\xe2\x7d\x8a\x26\x7f\xe2\xc7\xfd\x31\xce\x94\xd0\xc1\xaa\x99\x3e\xa4\xcc\xa9\xfc\x7c\x83\xcc\x96\x33\xb2\x64\x56\xeb\xdc\x26\x83\xd6\x5e\x55\x8a\xce\xd8\x86\x85\xbc\xdc\x12\x5b\x79\x2b\x48\x92\x20\x1c\xe1\x48\x1b\x06\x31\xae\x9a\xe6\xb3\x89\x16\x21\x78\x4c\x92\x00\x17\xdb\x23\x6e\xa0\x94\xf4\x0f\x14\x17\x06\x21\x98\x24\xd1\x4d\x46\x8c\xd0\x74\xc0\x18\x38\x2a\xba\x50\xdd\x06\xf7\xf6\xcc\x3c\x4c\xbc\x67\x97\xcd\xc5\x6b\x4d\x4a\x43\x6d\x7d\xa9\x40\xda\xf6\x5a\xa1\xce\x2d\x86\x00\xe6\x64\x6e\x3b\x1a\x76\xee\x81\x98\x1a\xeb\xfa\xcc\xa8\xc8\xf7\xe0\x34\x4c\xfd\x05\x37\x67\x87\xc2\x7c\x3d\xe5\xd4\xec\x4f\x22\xfc\xad\xda\x55\x4a\x1a\x4a\x35\xb6\xcb\x60\xda\xb7\xcb\x4c\xd7\x7c\x6a\xff\x90\xe3\xd8\x16\xc8\x16\xd9\xfd\xdb\x30\x0c\xb9\x35\x91\x8b\x25\xd1\x32\xbe\x64\x3c\x53\xcb\x10\x64\xb9\x94\x24\x29\x63\x39\x5b\x9b\xb3\x74\xc6\x52\xa3\xb9\x74\xaf\xe3\x42\x0b\x39\x69\x22\x5a\x3a\x9a\xb3\x82\x0a\x72\xe2\x73\x45\xd9\x84\xbd\xd5\x6c\xd2\x09\x27\x3a\x81\x98\xf4\xe7\x71\x12\x1c\x33\x1b\x90\x76\xb4\x87\x96\xb6\x2e\x3a\x05\x2c\xd9\x79\x29\x9a\xee\x37\x3f\x5b\xb0\x7c\xb6\x60\xf9\x6c\xc1\xf2\xd9\x82\xe5\x57\x76\xc1\xb2\xf5\x5c\x0b\x16\xf4\xbd\x20\x8b\x59\xa7\x78\x31\xb2\x6d\xef\xbf\xb6\x46\xbf\x6b\x51\x12\x86\x51\x3c\x9d\x4f\x7c\x3a\xf3\x64\x8f\x8b\xbf\xb6\x76\xcd\xf0\x6d\x7a\x6d\xed\x9a\xf4\xa4\xe8\x74\x0f\x9c\x59\x34\xf3\xe8\x3f\x2d\xfa\xcf\x86\xf8\x3c\x08\x92\x59\xa7\x7b\x20\x5e\x53\x32\x9d\x75\xaa\x55\xf1\xea\xc7\x71\x07\xdd\xf9\x70\x7e\xa6\xa9\xc3\x28\x66\xe7\xcc\x3b\xee\x7e\x70\x53\xc5\x16\xd8\x0f\x6a\x35\x9b\xe2\x70\x2d\x18\x5a\x7e\x1c\x77\x83\x83\x06\xc5\xb8\xd3\xe9\x78\x4f\x9e\x98\x09\x1b\x2c\xe3\x35\x5a\x37\x9f\xcb\x99\x53\x55\x26\xdb\x6d\xfe\x9e\x8c\xa3\x13\xf1\x8d\x19\x64\x69\x8e\xb6\x77\x46\x09\x74\xed\xda\x19\xfd\x87\x8f\x83\x6c\xd5\xe7\x55\x45\x41\xaf\x0c\xcd\xd5\x80\x75\x11\x22\x6b\x7b\xdd\x3b\xe8\xe4\xc1\xd6\x2c\xed\xe5\x7a\xa7\x52\xaf\xdc\xae\x58\x95\x76\xa5\x62\xd7\x0a\x00\xb0\x86\x15\x95\xb1\xb1\x0c\x43\xd2\x3d\x3b\x0f\xc7\x9d\xf3\x71\xb4\x8a\xaa\xa7\xc5\xaf\x77\xbc\x55\x50\x5c\x5a\x9c\x61\x5b\xcb\x91\x77\xe7\x5c\xcc\x3d\x41\x5e\xca\xa8\x1d\xd6\x61\x28\x78\x44\x62\x2b\x97\xa8\x60\xd0\x8a\x3a\x9d\x4e\xf5\x7e\x55\x32\x9b\x48\xba\x53\xb5\x73\xbd\x5f\xb9\x99\xcc\x67\xb7\x2a\x35\x0a\x95\x37\xab\x72\xb3\xc9\xd2\xf4\x2e\xa4\xf9\x7a\x2c\x9f\xa7\xe7\xeb\xdd\xaa\x70\xae\x71\x39\xdb\xb0\x46\xe5\x2a\xb2\xb0\x86\x2c\x71\xb5\x6a\x33\x19\x38\xf9\x34\xfc\xbc\x0c\x7e\x2b\x73\x6b\x2b\x3b\xec\xf6\x2e\x4c\xdf\xab\x6a\x8e\x31\x2a\xb0\x4d\x05\x20\x3c\x0d\x84\x97\x05\xc1\x5a\xad\xb5\x67\x85\xb1\xdf\xba\x70\x7b\xa9\x60\x3c\x9f\x08\x06\x83\x58\xd8\x49\x1b\xa2\x93\x1c\x93\xa7\x1c\xb3\x0b\x6d\xd1\x7b\x2d\x0d\x7d\xfa\x3f\x9f\x69\x70\x64\xb9\x07\x52\xda\xd2\x31\x63\xea\xbe\x1d\x3a\x1f\xe4\xfd\x16\xb7\x5f\xe4\x3c\xb4\x53\x30\x0f\x51\xb5\x72\x18\x2c\x72\xf3\xd0\x57\x12\x12\xbf\x21\x97\xd5\xaf\xad\x5d\xab\xaa\x29\x09\x67\x15\x2d\x43\x47\x7b\x7e\xf2\xe4\xc3\xb3\xcc\xe7\xc6\xfd\x7b\x1d\xf4\x0a\xb8\x7f\x2f\xfb\xe5\x2e\xfb\x70\xf7\x05\xcd\x71\xa8\x3c\x46\xd1\xa4\x23\x0e\x0b\xe9\x75\x87\xd7\x3b\x9d\x8a\xb4\x1d\x54\xec\xcb\x4e\x8a\x9c\x39\x11\xf5\x22\xf6\xba\xd8\x44\xb7\x51\x0a\x4e\xc3\xbd\xab\x83\x3e\xb8\xf0\xb4\x17\x0c\x65\xc8\x05\x5a\x4b\x97\xd5\x65\xce\x01\x1d\x93\x38\xac\xe0\xb5\xe2\xfc\xcc\xa3\x10\x71\x65\x15\xf2\x01\x77\xa6\xe4\xe9\x92\x82\x1d\xbd\x31\xd6\x92\x8c\xe7\xb6\x6f\xe7\x9f\x79\xfb\x76\x75\x39\xc8\x19\x24\x23\x08\x73\xa9\x3a\x1f\x31\x3e\x71\xf2\xdc\x69\x29\x51\xe7\x28\x31\x67\xaf\x20\x9a\xdd\x4b\xa0\xa4\xba\x47\xce\x31\xc5\xbd\xa1\xb0\xea\xe0\x63\x3f\x0a\xfb\x7e\x8a\xd3\x0a\x07\xa5\x65\x29\xe8\x1f\xbd\xf1\x34\x63\xbe\xdb\xb4\x73\x84\x72\xb2\xca\xe0\x02\x0a\x19\xaf\x31\x0f\x93\x71\x30\x4c\x75\x68\xec\xc3\xb9\x95\x7b\xb9\xca\x3f\xcc\x65\xbb\x5c\x07\x81\xf6\x77\xf6\x5c\xaa\xc4\x55\xf6\x1f\x64\xfe\x74\x47\xc5\x0c\xf5\x5a\xcb\x7b\xf7\xff\xab\xfd\x2a\x80\xae\xac\x19\x15\x74\x54\x9e\x0a\xd7\xcb\xa9\xd0\xe9\xd2\x7f\x0f\xf4\xf6\x14\x33\x00\x6a\x57\x97\x97\x34\x1b\xaa\xc1\xa2\xed\x21\x39\x41\xc5\x85\x51\x74\x15\xc1\xb3\xa1\x64\x3d\x9d\xe1\xed\x02\xaa\xaf\x34\x6d\x6e\x9c\x95\x08\x73\x06\x84\x17\x39\x30\xb5\x3c\xe9\x76\xce\x45\xf8\x2d\x8f\x13\x12\x0d\xe7\x96\x68\x4d\x83\x2c\xfa\x64\x86\x2a\x5c\xe5\x2b\x61\xdf\x9f\x8f\xc6\x29\xb7\xa8\x03\x89\xe3\x28\xae\xd8\x08\x57\x53\x1c\xd9\xf4\x20\x34\xc7\x5b\x5e\xc6\x47\xf3\x76\xe5\x5e\x38\x0c\xc2\x20\x3d\xad\xb4\x35\x4f\x5c\xb3\x54\x23\x8d\xde\x0c\x16\x64\x60\x79\x5b\x08\xff\x4c\x68\x7d\xe4\xd8\x9f\x74\xf4\x1d\x39\x27\x8d\x8e\x48\x98\x38\x51\xef\x11\x12\x50\x63\x18\xf6\xa5\x70\xcc\xe8\xe1\x30\x26\x64\x41\x01\xd9\x8d\x34\xba\xcf\x34\x49\xcb\xd6\x75\x4a\x4b\x36\x30\x3b\x2e\xa3\xde\xa3\x42\xe8\x39\x1c\x38\x8d\xb3\x8c\x8b\xdd\x55\x80\x0a\x6f\xd3\x39\x18\x21\x3a\x65\x20\xca\xcb\x72\xd8\x7a\x9b\x4a\x28\x72\x2e\x1a\x94\xe6\x17\x59\x19\x2c\xbd\xa8\xfe\xdc\x95\xc1\x6b\x72\x7b\x69\xc9\xfa\x60\x97\x22\xf4\xda\xda\xb5\xcc\x12\x41\xb6\xa0\xc0\x50\x95\x5b\x16\x5c\xe3\x91\x1f\x52\xaa\xc5\x93\x09\x99\xd2\x61\x3e\x23\x03\x67\x16\x93\x19\xfd\x87\x26\xf2\x59\x4b\x57\xf9\xc5\x7a\xde\xe2\x2b\xab\x4d\x9a\xb7\xed\x9e\x1d\x48\xa0\x79\xf5\xfe\x9a\x0a\x96\xd8\x91\xf1\x4d\xe3\x4c\xa0\xc4\x8c\x7d\xa1\xd4\x94\x95\x4d\xa0\x12\xe6\x5a\xb3\x19\x70\x36\x84\x20\xe1\x8e\xfb\x4e\x9f\x1f\xbc\x72\xa2\x18\x42\xeb\x64\x1c\xf4\xc7\xf4\xab\x3f\x49\x22\xf0\x21\x99\x91\x7e\xe0\x4f\x40\xe4\x82\x20\x84\x68\x1e\x43\xdf\x4f\x88\xcd\x84\x54\xc1\x1a\x82\x7d\xb8\xa6\x0b\xa8\xce\xdb\x58\x9d\xa5\xa7\xa9\xb9\x29\x49\x97\x2b\xa4\xb9\x3a\x36\x0b\x44\xe4\xca\x85\xb7\x44\x61\x34\x8c\x5b\x16\xeb\x53\x7d\x0e\xb0\xc5\xec\x22\xeb\xd1\x90\x64\xd9\x05\xf2\x67\xe7\x56\xe7\x79\x57\x5f\x5f\x66\xde\x56\xdf\x35\x44\x38\x24\xca\xb6\x5c\x6b\x17\xf4\x8e\x49\x87\xa6\x36\x66\x31\xd9\x97\x99\x3a\x85\xca\xbc\x2a\x32\xa3\x65\xb4\x22\xb8\x41\x3c\xf1\x47\x98\xcc\xfa\xb8\x53\x15\x27\xc0\xaa\x37\x6e\x60\x0d\xb9\xf4\x7d\xc9\x34\xb3\x98\xdc\xa2\x60\x6d\xad\x29\xb4\x8c\x2d\x51\x52\x6d\xe0\x94\xa3\xd9\x6f\x75\x66\x31\xb9\x71\xe3\x3a\xad\xfa\xc9\x13\xfa\xef\x8d\x1b\xb3\x98\xdc\x44\x50\x22\xfb\xb5\x3c\x89\xf7\xc5\xa7\xf3\x9a\x5a\x4e\xfa\x42\x32\x5c\xbb\x26\x88\x50\xd0\x5a\xa4\x42\x29\x11\x44\x5f\x5e\x2b\xa1\xc0\x59\x46\x6d\x12\x37\xe7\x29\xf5\x22\x49\x99\xf4\xe6\x22\x68\x25\xd1\xfb\x7c\xb1\xba\xcf\x11\xba\x7b\xcc\xf0\x20\x9d\x0d\xc2\x3e\x46\xae\x3d\xf6\xb9\x4e\xb3\xd4\x24\x81\xcd\x65\x9c\x5a\xeb\x1c\xfb\x93\x7d\xad\xd1\x7e\x1c\x8b\x79\x8a\x9d\xaa\x39\x22\x61\xa7\x5b\x4d\x82\xb0\xea\x54\xfb\x51\x52\x75\xaa\xa9\x4f\x9f\x67\x41\xd5\xa9\x5a\x55\xa7\x6a\x57\x9d\xea\xfd\xaa\x53\xbd\x53\x75\x28\x1c\x80\xaa\xcf\x72\xfb\x2c\xbb\xcf\xf2\xef\x54\x9d\xea\x6e\xd5\xa9\xee\x55\x9d\x6a\x10\xa6\x32\x73\x3f\x4a\xc6\x3c\x33\xfd\x9d\xd0\xbc\xbf\x5e\x75\xaa\x71\x14\xa5\x55\xa7\xba\x59\x75\xaa\x5b\x55\xa7\xba\x5d\x75\xaa\xcd\xaa\x53\xbd\x2e\x0b\xa6\x7e\x38\xe6\xe0\xe9\xef\x5b\xd1\xa0\xea\x54\xbd\xaa\x53\x6d\x55\x9d\xea\x46\xd5\xa9\xae\xcb\xac\x49\xc0\xb2\xf2\x5f\x42\xeb\x89\x46\x55\xa7\xea\x56\x9d\x6a\xa3\xea\x54\x6b\x55\xa7\x5a\xaf\x3a\xf8\xdf\x83\x60\x34\xf5\xab\x4e\x95\x22\x72\x9f\x36\x92\x72\x92\xb4\x1e\xa1\x59\xb9\x88\x1e\x37\x66\xc1\x7e\x31\x45\xce\xa7\xc7\x3d\x41\x8f\x2c\x35\x60\x19\x39\x6e\x0c\x82\xe3\x60\x40\xf6\x15\x55\xb2\x34\x81\xb7\xa2\x01\x64\xa8\x72\x23\x0d\xa6\x24\xd9\xe7\x05\x0a\x28\x03\xe5\xa4\xb9\x81\xb4\xd9\xe7\xc4\xb9\x71\x1f\x5b\x6c\x90\x87\x1c\xfb\x9d\x2e\x6a\x02\x53\x3a\x08\x93\x20\x74\xd4\x5b\x3f\x4a\xb4\xb7\xd4\x0f\x9d\xea\xfd\x7b\x8a\x66\xea\xd3\x7d\xed\xf9\x0e\x22\xaa\xde\x7d\x13\xa6\x6f\x02\xf5\x11\xaa\x46\x5b\x94\x05\xc3\x49\x14\xc5\x19\x38\x94\xc2\x19\x38\x63\x96\x7b\x12\x8d\x1c\x21\x42\xd8\x43\xf2\x41\x9c\x1a\xb4\x57\xe5\x06\xc1\xb1\xf6\x36\xf4\xfb\x69\xa6\x1e\xda\x15\x19\x04\xf5\xf7\x69\x34\x30\xfa\x47\xfb\x32\x9f\x64\x40\xd1\x4e\x72\x4c\x4a\x8c\x9d\xea\x5d\xbd\x10\xc5\x5d\x74\x9d\x96\x73\x30\xd0\xde\x92\x79\x0f\xbb\x53\x07\x3c\x9a\xfa\xd8\xa9\x5a\x1f\x04\x92\x08\xb2\x77\x67\x31\xe9\x93\x41\xe7\x43\xb7\xed\x79\x8e\xd7\x76\x9d\x56\x7b\xc3\xd9\x68\xbb\xce\x66\xdb\x75\xb6\xda\xae\xb3\xdd\x76\x9d\x1d\xfa\x71\x97\xfe\xb3\xd7\xf6\x1c\xcf\x6d\x7b\xae\xe3\xd1\xcc\x5e\x0b\x8b\x6d\xf0\x6d\x2c\x14\x2f\x74\xe6\xee\xba\x0e\xfd\x6f\xc3\xd9\x74\xb6\x1c\x9a\xd9\xc5\x76\xb3\x54\x0f\xff\x33\x52\x54\x72\xcb\xd9\x91\x1f\x5a\x32\x4d\xa4\x6c\x60\xbe\x6d\x67\xcf\xd9\x73\x68\xc5\x2d\xc7\xdb\xa0\xff\xee\x62\x7b\xa0\xb9\xfe\xda\xda\x35\x57\xf3\x49\x83\x93\x20\x1d\x43\xc2\x56\x5a\x22\xf1\x30\xf4\xa7\xc4\xa2\x94\x48\x0e\xc9\x62\x46\x65\xa7\x87\x0e\x0e\x78\x1a\xf3\xb5\xb5\x6b\x2d\xdc\x78\x0e\xfd\xf8\x14\xa2\x19\x0b\x22\xce\x4e\x63\xc2\x3a\x34\x71\x00\xe2\xa6\xb8\x9f\x24\x51\x1f\x6f\x2f\xf7\xc3\x01\x24\xfe\x94\x70\x6a\x92\xb0\x4f\x57\x03\x1b\xd0\xc6\x43\x70\x4a\x03\xc4\xd9\x8c\x83\x22\xce\x2c\x70\xee\xc4\xf3\xb0\x3f\x26\x31\xf8\x21\xad\x78\x13\xda\xb4\xc6\x30\x08\x47\xd0\x8b\xfd\xfe\x11\x49\x5f\x5b\xbb\xb6\x05\x6d\xe9\x60\xa5\x52\xb7\xd5\x11\xf0\xd7\xd6\xae\xed\x94\x35\x1a\xdb\x89\xcd\x34\x9a\xff\xda\xda\xb5\xdd\x95\xc9\x44\x8b\x7b\x8e\x78\x6a\x51\x82\xed\xe5\x49\xc4\x9a\x55\x73\xea\x94\x9e\x6e\xc9\xe7\xfb\x70\x07\xa2\x18\x7e\x9d\xe6\xf1\xda\x40\x3b\xd6\x6b\x65\x11\x71\x20\x21\x58\x8a\x0c\x20\x1d\xc7\x84\x00\x3a\x5e\x91\x94\x75\x8f\xb7\xd1\x96\x67\x8a\x21\x1a\x02\x4a\x30\x09\x82\xf2\xc1\x7a\x53\x63\x46\x97\x32\x37\x46\xcc\xf5\xd8\xcf\x06\xfb\xd9\x64\x3f\xdb\xec\x67\x97\xfd\xec\xf1\x9c\x2d\xfe\xcb\xf2\x9e\x39\xcd\x26\x05\xc5\x53\xe9\xe3\xa6\x7a\xdc\x53\x8f\x9e\xa7\x9e\x5b\xfa\x73\xeb\xb5\xb5\x6b\x98\x21\x8b\x4c\xab\x08\xa7\x2d\x03\xb5\x9d\x42\x0c\x05\x18\x6f\x29\xc6\x1b\x0a\x87\x2d\xf5\xb8\xa3\x61\xb6\xc1\x31\x3b\x54\xa8\x99\xc8\xec\x96\x54\x40\x97\xbd\xd3\x59\x7a\xda\xf9\x10\x9f\x11\xc6\xc6\x45\x68\x5d\x82\xf2\xa1\x86\xe8\xa1\x86\xe9\xa1\x44\x75\xbb\xf3\xa1\xa7\x90\x08\xc9\xc9\xeb\x71\xa7\xdb\x3d\x40\x29\x71\xad\x5b\xf1\x2a\x4e\xa5\x55\x71\x2a\x1b\x15\xa7\xb2\x53\x71\x2a\xbb\x15\xa7\xb2\x57\x71\x2a\x9b\x15\xa7\xb2\x55\x71\x2a\xdb\x15\xa7\x52\xab\x38\x95\x7a\xc5\xa9\xac\x57\x9c\x4a\xb3\xe2\xd0\xd5\x66\xc5\xae\x38\x95\x5f\xaf\x38\x95\xeb\x15\xa7\x72\xbf\xe2\x54\xee\x54\x9c\x0a\xa9\x38\x15\xb7\xe2\x54\x1a\x15\x07\xff\x0b\x2b\xb2\x9a\x59\x50\x71\x2a\x93\x90\x66\x0e\x54\x6a\x12\xd0\x94\x7e\x94\x54\x9c\x4a\xea\xd3\xe7\x37\xc8\xa4\xe2\x54\x82\x30\xad\x38\x95\xb7\xa2\x01\x2d\x14\x8d\x2a\x4e\x65\x16\x9d\xa8\x62\x3e\x2b\xe7\xb3\x82\x3e\x2b\x49\xe7\xaf\x8a\x53\xa1\x7a\x02\x83\x46\xdf\xe8\x0c\xa1\x95\xe3\x79\x7c\xfe\x15\x27\x90\x8a\x53\xc1\x31\x51\x39\x38\x30\x54\x4a\xe6\xe2\x95\xa4\xb1\xe7\x24\x69\xdc\x72\x02\x67\x61\xaa\x96\xc3\x8e\xbb\x3f\xbc\xb9\xd8\x1f\x8a\x4d\x2e\x6e\xe0\x8a\xbd\x6e\x50\x1b\x1e\x5c\xef\x74\x68\xb9\xee\xf0\x80\x2f\x53\xc5\x49\x68\xbc\x35\x20\xab\x6b\x63\xcc\x7f\xae\x77\xe2\x1c\xe4\x0f\x06\xef\xa1\xee\x29\x55\x67\x6e\x1a\x91\x38\x30\xd5\xd6\xb0\xf6\xa8\x0d\xb7\x6b\x8b\x0e\xfb\x82\xeb\x43\xfa\x24\xb2\xe0\x57\xb9\x0f\x58\xf7\x98\xf1\xe2\xda\xb5\x66\x13\x79\x03\xd7\xe4\x62\x39\x3e\x39\xc5\xdb\x6a\x47\x21\x19\xc0\xc0\x4f\x31\x28\x08\xbf\xe1\x21\x08\x81\xad\xe1\xbd\x37\xa8\xce\xec\x9f\x82\x9f\xc2\x24\xea\xfb\x3c\xac\x11\x0a\x9b\xd6\x80\x7f\x1b\xfb\x09\xb0\x90\x11\x31\x15\xcc\x28\xb8\xb8\xb3\x96\x07\x2d\xf6\xde\x62\x33\x43\x04\x54\x2c\x49\x7a\x2e\x6e\x22\x5a\xc2\x87\xe9\x5a\xb3\x89\x1d\x83\x37\x9c\xe2\x55\xab\xba\xa9\x21\x26\x88\xf3\x78\x3e\x62\xd3\x4c\x18\xa5\x40\x16\x41\x92\x06\xe1\x48\xac\xa2\xae\x31\xf3\x04\x46\xa1\xa7\x00\xc8\x00\x82\x14\x58\xb4\x80\x98\xf8\x47\xb4\x65\x21\x59\xa4\x18\x01\x04\xfc\x44\x0b\x25\x82\xfe\x59\x0c\x0e\xed\x80\xd3\x8e\xbb\x7f\xca\xd0\xeb\x2e\x84\x4b\xf0\xfe\xa9\xec\x02\x6e\x95\x33\xbb\xa1\xd3\xe9\x88\x12\xdd\xd3\x03\xb5\x90\xc4\xde\x60\x1d\x25\xdc\xc0\xf4\x7c\x72\x11\xc8\x2e\x2f\x31\xd7\x75\x67\xca\x6e\x4d\xa1\x74\x3a\x75\x4f\x9a\xa8\x19\x48\x5c\xf2\x65\x30\x11\x30\xd9\x86\x76\x26\xc3\xe9\x4c\x5a\x4d\x02\x8e\x09\x6f\xe0\xcd\x12\xc6\x12\xc6\x18\x86\x75\x71\x9e\x03\xbe\x0d\x7d\x5e\xb6\xa5\xf8\x92\x63\x3f\xfb\xdd\xb0\xf2\xd0\x15\x4a\x36\x03\x4d\x2b\x35\x5c\x60\xb6\x2e\x25\xdd\x41\xb6\x6d\x1a\x89\xf2\x19\x4e\x67\x44\xa1\x94\xfb\xac\xec\x6d\x0c\xa5\x5c\x06\x9a\x98\xd9\xb0\x40\xbd\x10\x87\xff\x84\x2c\xd4\xc8\x0f\xc2\x99\xa3\x8f\xfe\x42\xeb\x61\x92\xc6\x9d\xee\x87\xdc\x0a\xa8\xcc\x82\xe8\x3c\x46\x1f\xb2\x86\xc1\x59\xda\xa7\xbd\x71\xad\xd9\xbc\x6f\x7a\xf2\x53\xed\x89\xd0\xd1\x9c\x8e\x09\xf4\xc8\x28\x08\x51\xc5\xa2\x72\x61\x98\x92\x18\xc7\x36\x62\x23\x20\x05\xe1\xec\x41\x1a\x77\x82\x70\x26\x81\x1f\x91\x53\x6d\x8f\x0d\xab\xeb\x47\xf3\x30\x25\x71\xc7\x55\xa6\xc9\xc9\x24\x3a\x21\x83\x0e\xea\x1d\x32\x95\x2a\x6d\xef\x45\x77\x28\x12\x7a\xde\x24\x25\x71\xd0\x3f\xea\xe0\x2c\xaa\x1a\x11\x93\xe3\x2f\x91\x53\xee\xce\xc0\xb0\x71\x16\x0e\xcb\xa0\x76\xdc\x18\xf1\x32\xb6\x70\x24\xbd\x21\x6b\x75\x43\x35\xc2\x8a\x7a\x8f\x3a\xcc\x31\x43\x93\xb8\xac\xb9\x79\x89\x8b\xbe\xad\xf8\xad\x1b\x1c\x74\x3a\x55\xa8\xca\x41\x28\x4e\xeb\xea\x1c\x78\xa4\xd0\xbe\x96\x90\x7e\x9b\x56\xb0\xe8\x58\x06\xf4\x7a\x70\xcb\x18\x7b\xf5\x96\x7d\xdb\x78\xf7\xda\x99\xfc\xf6\xfe\xe2\x96\xbb\xbf\xa8\xd7\x85\x64\x59\x5d\x50\xb1\x09\x8f\xc1\x73\x34\xd9\x83\x33\x9f\x12\x54\x14\x6f\xed\xab\x29\x98\x20\x21\xfd\x42\xe1\xc4\x45\x54\xad\x73\x44\x4e\x25\xf2\x72\x63\x94\xc2\xec\x74\xaa\x55\x51\x4b\xf9\x86\xd0\x1d\x3f\xac\xa6\x28\x92\x63\xba\x4a\x18\x70\x9e\xac\xd4\x38\x1d\x98\x97\x77\x60\xdb\xc6\x68\x67\x5c\x3a\x20\x8b\x8c\x84\x3d\x22\xa7\xb6\x9a\x10\xfb\x6c\xc2\x65\xbc\x2b\xd3\xe8\x0a\x0d\xc7\x3f\x16\x3a\xd0\x3e\xdd\x3d\xee\xd0\x81\x9f\x4b\xbf\x1f\x93\x0e\x5b\xdb\x74\xb1\xb8\xfa\x76\xad\xff\x60\x1c\x9d\x74\x50\x1c\x64\x8b\xcd\x62\x42\x15\x86\xae\xf2\xaa\x96\xa6\x42\xda\x87\x8f\x3a\xb3\xb4\x2f\xba\xee\x51\xbd\xbe\x8f\x76\xf6\x49\x14\xcd\x30\x02\x13\x1d\xce\xca\xe2\x99\xf6\xbb\x8f\x0e\x34\xd7\x15\x4c\xed\xd2\x35\xe2\x86\xb3\xa5\xad\x06\x0f\x24\x25\x10\x51\xfb\x3a\x4e\x1d\xb2\xab\x83\xa1\xc5\xc7\x28\x6f\xc8\xf5\x4e\x07\x6f\xdd\x92\x39\xca\x7b\xea\x88\x9c\xd6\x2a\x68\xfe\x8f\x52\x31\xd2\x65\x67\xf1\x61\x6b\xab\x69\x4d\x58\x28\xaf\xd1\xe6\x1b\xae\x8a\xc2\x69\x6c\x8b\x49\x30\x2e\xd0\xec\xca\x99\x2a\xac\x0b\x12\x4f\xa5\x0a\x91\xc1\x94\x6d\x99\x1e\x84\x7d\x4a\x21\xa7\xee\xd9\xa6\xc5\xb6\x88\x61\xcf\xa1\xc0\x95\x34\x5f\x55\xc5\x31\xe6\x75\x75\xcc\xba\x18\x2b\xb6\x38\xb6\x94\xfb\x0c\x5b\x89\x48\x47\x0e\xab\x70\x2b\x57\x45\xa4\x52\x9e\x14\x24\x08\x3a\x41\x5d\x0d\x43\x4c\x04\x8e\x04\x0a\x3c\x46\xf8\xfe\xdd\x63\x46\x78\xac\x17\x89\x4f\xa1\x30\xfa\x63\x2d\x67\x72\xfc\x32\xd4\x34\x7e\xcb\x8b\x76\xad\x3f\x94\x08\x57\x9d\xd1\xb2\x59\xaf\xb7\x94\xbf\x00\xe7\x03\xbe\xe3\x57\xc8\x1b\x99\x6d\x2f\x39\xd9\x15\xec\x4e\x6b\x58\x4a\x0e\x67\x9b\x03\x59\x97\x34\xb4\xbe\x73\x97\xc5\x4e\xff\xee\xb1\x60\x0f\x81\xaa\x97\xd9\x21\x31\xf6\x0f\x8a\xd0\x3e\xcb\xd3\xc4\xcb\xd2\x84\x2d\x2a\x97\x61\xdd\x7a\x0e\xda\x96\xd3\xb4\xb8\xae\x0d\xfb\xc3\x66\x53\x18\x62\xca\xfb\xe3\xfc\x16\x6d\x2c\xab\x65\xb3\xc8\xe3\x45\xe8\x09\x35\x5d\xde\x15\x64\x63\xda\x0b\xab\x53\x53\x19\x6a\xb5\x02\xdc\x96\x52\x69\x65\xa2\x6c\x69\x6c\x73\x5d\xab\x52\xb2\xcd\x92\x59\x8b\x1b\xa4\xf4\x33\x93\x7e\x4c\x60\x1a\xc5\x04\xd2\xb1\x1f\x4a\x43\x56\x14\x12\x07\x4e\xfc\x20\x85\xaf\x8d\xfd\xf4\xfa\xf5\xeb\x15\x5b\x63\xa3\x2c\x15\xf8\x6e\x15\x27\x19\x9d\xf4\xf3\x73\x02\x6e\x19\x5f\x42\xb4\xf2\x72\x05\xb5\x66\x54\x39\x83\xfe\xf5\xfa\x45\x79\x63\xf5\x0e\xd8\xce\x8c\xdb\xb1\x9f\xbc\x41\xfa\x2b\x90\xff\xbd\x93\x48\x58\xff\x18\xdd\x75\xa1\x1c\xb0\xd5\x2a\x33\x68\x1a\xd4\xce\x88\x88\xeb\x19\x11\x21\x04\xa5\xcb\x3d\x49\xb9\x86\x4d\x35\xea\x19\xad\x83\x90\x01\xea\xd3\x3d\x02\xfd\xb1\x1f\x8e\xe8\x04\x90\xc8\xb5\x26\x55\xae\x27\x7e\xc2\xcd\x9c\x10\x46\x27\x3c\x6f\xe2\x0f\x71\x75\x3d\xf1\x53\x0c\x53\x35\x20\x59\xd1\x32\x8b\xe5\x5a\x47\x9f\xcc\xca\xa5\xcd\x76\x46\x20\xc8\xbc\x85\x03\xa2\x50\xfa\x29\x7a\x77\x84\xa9\xa2\xac\x9b\x76\x8a\x04\xd5\x72\x16\xc8\x21\x56\xca\x13\x5a\x3d\xbb\x97\x16\x88\x9b\x7c\xb2\xd9\x7c\x09\x93\xcd\x5e\xf1\x64\xb3\xa7\x6b\x66\x92\xe2\x9d\x4e\xc7\xd8\xb4\xd0\xf6\x99\x65\x16\x6d\x46\xc2\x54\xdc\x90\xc3\xf9\x38\xa7\xe1\x78\x59\xd5\x46\x62\x57\x5c\x63\x32\xef\xdd\xb8\xc1\x14\x88\x4e\xa7\x5a\xaf\x16\x55\x6f\xe0\x97\x47\xa4\x5a\xab\x9e\x8f\x86\x3e\x71\x9a\x03\x6c\x0b\xf7\xd8\xc5\xdb\x8e\xf1\xe6\x19\x6f\x1b\xe6\x37\x36\x63\xe1\x30\xc3\xcb\x7d\xa3\x70\x72\x8a\xa1\x6b\x21\x24\x23\xbc\x33\x84\x2a\x63\xc3\x68\x1e\x0e\x14\xdd\xb9\xc2\xcf\xdb\xda\x6c\x0e\x22\x2a\x19\xc6\x54\x0e\x0f\xa3\x18\x6a\x6a\x99\xcb\xff\x68\x16\xba\xfe\xf0\x07\x03\x66\xb3\xa2\xa3\xd8\xef\x45\xc7\xe8\xa3\x85\x17\x0e\x4c\x49\x98\xd2\x71\x9e\x8e\x7d\x3e\xd2\xe3\x39\x3b\xe3\x2d\x9c\xe4\x78\x1e\x79\x84\x9e\x16\x8d\x42\xb8\xc3\xac\x58\xb5\x22\xa5\xd6\xcd\x2b\xb5\x3a\x5f\x2f\x51\xa3\xf2\x7c\xac\xed\x00\x22\xb9\x1e\x04\xa3\x90\x9f\xae\x42\xc6\x6e\x79\x9c\xb3\xeb\xba\x8a\x7d\xe1\xd1\x50\xd4\xd9\xcb\x94\xa4\xbc\xb6\x52\x20\xc8\x96\x8d\xee\x12\x5d\xef\x79\x54\xd2\x8b\x4e\x50\xca\x01\xe7\xea\xb5\x0f\xef\xf2\xfa\xdf\x36\x67\x8a\xed\xe7\x11\x77\xe7\xa8\xd4\x1b\x17\x17\xfa\xe5\x32\x3e\x3b\xa7\x09\x2b\x8f\x58\x99\x63\x36\x61\x86\x5f\x75\x61\x9c\x5b\x17\x97\xb4\xdb\xae\x48\x3d\x48\xd7\x8e\xa4\xc7\x6b\xd9\xfa\x51\xb9\xcf\xe0\x51\x6a\xbe\x6a\xdc\x92\x2b\x46\xbe\x44\x28\xd7\x52\xfa\xd1\x74\x36\x21\x2c\xe2\x8d\x16\x2d\x41\xa8\x24\x08\x9a\x29\x7c\x86\xbe\xc5\xec\x58\x17\x6b\x06\x2d\xa2\x4a\xf0\xcf\x05\x05\x55\xcf\x37\x9b\x45\x2e\xe9\x78\xc2\xff\xb5\x02\x8f\x21\xf1\x61\x99\xc3\xd0\x6b\xf9\xf3\xc4\xab\xdc\x1f\x8f\xde\x41\xd7\xa4\x7b\x90\x0a\xbe\xeb\xc7\x09\xe1\x33\xa6\x72\x78\xec\xb0\x64\xd6\xe6\x33\xcd\x51\x93\x4a\xc0\x0e\x73\x9d\x4d\xde\x20\xa3\x98\x10\xb6\x79\x06\xcd\xe6\x34\x1a\xe0\xee\x45\xdf\x9f\xf4\xe7\x13\x3f\x8d\x62\x9a\xcd\xef\x47\x49\x5b\xd6\xc6\xf7\x82\x44\xc3\x2d\x25\x55\x05\xb8\xdb\xde\xae\xdb\xe4\x07\xb8\xd6\xdf\x12\x2e\x16\xd6\xc2\x6e\xeb\x2f\xbc\x6f\x71\x87\xca\x1f\x0c\x54\x05\xbe\xd3\x33\xab\xf0\x6b\x3d\x3d\x6f\x12\x84\xcf\x89\x4d\x12\x84\x0a\x1b\xf6\x62\x60\x93\xfa\xcf\x5b\x43\xea\x6b\x35\xb0\x17\xa3\x86\x7e\x94\x8c\x4b\xab\x10\xae\x28\xd6\xa2\x26\x7d\x50\xac\xc5\xfa\xa2\xee\x99\x40\x92\x20\xbc\x38\x90\x9a\x97\x6b\xeb\x0a\x40\x2c\xaf\xb6\xb0\x9b\x96\x57\x37\xdb\x71\x47\x95\x0c\x9d\x98\x97\x65\x26\xbd\xa8\xe3\x39\x51\x3a\x26\x71\x27\xac\xc7\x4e\x7f\x1c\x05\x7d\xd2\x89\x95\xdd\x04\x13\x6e\x62\x0e\x5e\x8e\xe7\xc1\x24\x96\x8f\x95\x8f\x75\x09\xa9\xbc\xdb\x58\xf6\x9a\xb7\x1f\xdc\xec\x84\xca\xb9\xed\xda\x2c\x8e\xd6\x3b\xc1\xbe\xde\x8c\x59\x1c\x35\x4d\x4f\x1d\x8b\x55\xac\x35\x45\xa9\x04\xa5\xd4\xa8\x2f\xf4\xfc\x45\x63\x22\x18\x16\xb0\x87\xbd\xd0\x54\xc7\x34\x7a\xd7\x1f\x04\xc8\x10\xfb\x39\x4a\xb3\x81\x61\x56\x52\xde\x39\x96\xbc\x0b\x80\x9d\x89\x74\x16\x76\x2d\x9b\x54\xf7\xd6\x17\xb6\xdd\x6c\x69\x30\x07\xc1\x71\xc1\x58\x13\x43\xad\xa9\x0f\x35\x4a\x29\xad\x87\xa5\xc3\xbd\x15\x7e\xce\xbb\x4e\xe7\x12\x5e\xaa\xf2\xf6\xeb\x6f\x57\xf6\xcd\xce\xdf\xcf\x74\x57\x6b\xb5\x7e\xd2\x6a\x0f\xc2\x63\x12\x27\xa4\xb4\xfd\x5e\x53\xef\x8f\x49\x34\x52\x39\x83\x12\x36\x0e\xec\xa6\x7c\xf6\x5c\x9d\xd2\xd3\xa8\x48\x02\x09\xaa\x7c\x4e\xa7\xca\x74\x3e\x59\x92\x75\x5d\xcf\x7a\x3f\x33\x3e\x32\xd4\x01\x45\x1e\xe5\xac\x66\x85\x76\x5d\x7b\x8b\x6d\xc6\xe2\x46\x06\x8d\x8c\x06\x1d\x33\x94\xd4\x10\x09\x14\x26\x93\xe8\xc4\x19\x07\xa3\xb1\x43\x16\xd9\x11\x9b\xed\xb4\x49\x74\x42\xeb\xa6\xb9\xb5\xed\x1e\x56\x25\xf7\x36\x27\x0b\xe3\x94\xc2\x87\x61\x3b\x38\x33\xcd\xbb\x85\x9d\x3b\x8b\x4e\x3c\x77\xa1\x90\x22\x1a\x2a\x0b\x81\x08\x9b\xf3\xe9\x4c\xff\xe1\x62\xbd\xe3\xb9\xfb\x06\x40\xbd\xf7\xd1\x8d\xed\xbc\x26\x26\xf3\xa9\x30\xdc\x9c\xdb\xc4\x64\x3e\xad\x5d\xb8\x89\xc9\x7c\x6a\xe0\x54\x20\x4a\x9e\x53\x42\xb0\xc9\xca\xac\xe4\x42\x12\xa2\xbe\x82\x84\x48\xe6\xbd\x25\x0c\x5e\xd7\x19\xbc\x70\xa6\x7c\xce\x36\xa6\x7e\xa6\x8d\xcb\xa7\x28\x0a\x94\x52\xc1\xb7\x16\x36\x93\xf2\x54\x6a\xfa\x19\x10\xbc\xc2\x52\x30\x8b\x75\x3e\x81\x37\xbd\x5d\x57\x6a\x9d\x6a\x57\x5a\x6a\xab\x4a\xed\x9a\x92\x24\xf1\x47\x44\xd3\xbb\x78\x4a\x87\xff\x9e\xa7\x06\x66\x95\xc0\xad\xe7\xbb\xdf\x8a\x9f\x79\xf1\x4f\xef\xcf\x93\x71\x49\xa0\xcb\x8d\x8d\x6d\x1e\x1e\x2a\x48\xde\x9c\xf8\x69\x4a\x42\x74\x8f\x2b\x09\x8b\xb9\xe5\xd9\xfb\x32\xe8\xd9\x7b\x63\x02\x3d\x9f\xae\x7e\xa8\xb6\x4e\x57\xf2\xdc\xe3\x65\x08\x0f\x0f\x1b\x43\x06\xed\x21\xf7\x11\x9c\xcf\x28\xb6\x68\x4c\x88\x09\xdb\xb0\x47\xe3\x02\xcb\x15\x84\xa3\x86\x0c\x96\x26\xa3\x9e\x65\x03\x58\x32\x07\x1a\x5a\x2d\x7b\x4a\x23\x51\xbe\xa1\xe7\x66\xf6\xcb\x33\x18\x90\x59\x3a\xc6\xec\x53\x7f\x11\x4c\xe7\x53\x11\xe3\x2c\x0a\xd9\x37\xa3\x54\x2f\x8a\x26\xc4\x0f\xcf\xa0\x3b\x8b\xc9\x20\xe8\xfb\x29\xe9\x18\x34\x39\x40\x50\x9a\x9f\xfd\x71\x74\x44\x06\x30\xc3\xfb\x80\x08\x0b\x9c\x59\x02\x31\x48\x1e\x60\x8b\x0f\xe0\x5d\xde\x76\x8a\x3b\xf7\xea\x44\xf3\xc8\xcc\x4f\x12\x78\x28\x6b\x7e\xc8\x1c\x72\x92\x46\x01\x15\xba\x2c\x0a\x51\xa7\x7b\xc0\x30\x0a\xc2\x20\x0d\xfc\x89\x08\x65\xc4\x4e\xf0\x15\x45\x89\x84\x77\xf9\x3b\x5d\x55\xd1\xf5\x09\x27\x1e\xe1\xae\x49\x0d\xf3\x8e\x22\xda\xb5\xbc\xf9\x16\x7e\x77\x18\xd5\x1c\x90\x68\x3a\x20\x5a\x26\x82\x71\xa9\xa0\x5d\x01\x8f\x53\xc8\x2e\x21\x63\x11\xa1\x58\x48\x2a\x5e\x9b\x16\x2f\x4b\x02\x84\x27\x4f\xc0\x52\x6f\x1d\x93\x2b\x79\x84\x31\x6c\x26\xcd\xa8\x82\x37\xf1\xeb\xf8\x78\xd4\xad\x5a\x8d\x55\x7e\x13\xcc\x70\x4f\x14\x2d\x71\x89\x11\xe2\x20\x76\x9e\x65\x8c\x28\xc6\x32\xb7\x58\xc8\x2e\x89\x07\x8b\xfd\x9e\xb9\x4a\x40\x64\x35\xc2\x6b\xe1\xd5\x0c\x2c\x8e\x1e\x99\x9c\x0a\x02\xb3\xca\x12\xb0\x92\x79\x82\x52\x83\x8e\xb0\x34\x62\x71\x08\xd9\xd5\x41\x93\x60\x1a\xa4\x89\xdd\x50\x91\xb0\x34\xea\xcb\xfb\xa1\x66\x2c\xce\xe2\xf2\x1e\x28\x8d\xe3\x25\x65\x01\x27\x9c\x03\xdc\x59\x48\x86\xd6\x02\x33\x90\xd8\x75\x01\x3b\x1b\x2f\x8b\xb3\xa0\xf0\x51\x12\x77\x42\xe9\x41\xb3\x8a\x62\x66\x15\x04\xef\x93\x8d\xdc\xcf\x2d\x81\xb7\x9e\xef\x0a\x36\xda\xd9\x0f\x4e\xa7\xbd\xa8\xec\xbe\xb4\xbd\x0d\x29\xf9\x5e\x8f\x47\x73\x2a\xbf\x92\x92\xac\x2d\x77\x4f\xcb\x4b\x45\x4f\x71\x3e\x6f\x97\x8b\x47\xf8\xfc\x3c\x98\xa4\xf5\x20\xe4\xfc\x16\x93\x21\x89\x49\xd8\x27\x49\x43\xde\x6b\x36\x8b\x89\x3f\xa0\x6c\x2d\xb1\xe4\x0f\xb7\xf9\x43\x23\x48\xee\xe0\x91\xf6\x07\x32\x2b\xb4\x95\x0f\xde\x7e\xf6\x6a\x81\x60\x08\x0f\xb1\xba\x87\xcc\x73\x71\xa8\xc9\xf3\x87\xbe\x68\xe2\x43\x88\x30\xe0\x2f\x44\xb1\x1a\xf6\x65\x82\x77\x5d\xdc\x63\xf6\x9e\x8c\xcc\x29\xbc\x0d\x33\x22\x46\x0a\x3b\x21\x64\x1e\xa6\x31\x62\x62\x20\xa5\xa1\xe4\x30\x3e\x7b\x88\x4e\xa0\x0f\x33\xb2\xc7\x18\xf6\x7c\xf8\x21\x0f\x72\xa6\xe2\xdd\x20\xbe\x3c\x79\xa2\x77\xa2\x4a\xc5\x2e\xbb\x7e\xdd\xca\xd1\xfa\xc6\x0d\xde\x1a\xf1\xd0\xcd\x66\xa1\x12\xa5\x88\x65\x0d\xcc\x0a\x98\x76\x95\xd0\xfb\x2b\x4c\xd9\x6f\xf9\x65\x57\xf8\x79\x9b\x9b\x22\xf8\xa3\x9f\x90\x7b\x38\xf3\x90\xb2\x09\xdb\x73\x5b\x5a\xe6\x72\xa0\xbb\x5b\x1b\x5a\xbe\x07\x51\x9c\x7e\xbe\x8c\xc7\x77\xb7\xf4\xfa\xbf\x82\xbe\xfa\x25\xa3\xc6\x13\x95\xe3\x0d\x33\x31\x79\x4b\x5c\xf3\x55\x06\x79\x4b\x8c\x32\x8c\x19\x9a\x96\xa2\xe0\xae\xac\x85\x44\xf1\x80\xc4\x9f\x3f\x65\x5a\x48\x34\x4f\xd9\x89\x00\x18\xcd\xfd\x78\x90\x9c\xab\x72\x3c\x11\xb1\xb1\xfb\xd1\x64\x42\x18\x6b\xd2\xfa\xb4\xd7\x34\xe2\xb3\x3f\x41\x1b\xab\x31\x61\x8b\x70\xa9\xdd\x03\x0e\xa8\x7b\xf0\x84\xb9\xfd\x76\x0f\xce\x44\x31\x92\xb0\x59\x5c\xbe\xa5\x11\x24\x54\x55\xea\x9d\x1a\xc0\x54\x41\x6c\x13\x2b\x85\x19\xf9\x3b\x6d\xb0\x84\xf2\x70\x35\x0d\x80\x96\x5f\x32\xfd\xbf\xc3\xa8\x67\xa9\xf6\x3a\x0a\x51\x87\x57\x5c\x34\xe5\x63\xec\x54\xd9\xa2\x8e\xe4\x69\x4b\x26\x8a\x00\x95\xb7\xb5\x7c\x6d\xe8\x8a\x9e\x3f\x70\x14\x7b\x59\x3a\xa3\xdb\x5a\x90\x55\x31\xfd\x73\xde\x36\xd0\x94\x63\x8f\x4f\x9e\x47\xe4\xd4\xd1\xfa\x4d\x57\x09\xfa\x31\x45\x21\xf0\x0b\xf1\xd4\x20\x89\xb4\x5c\xb0\x69\xf1\xc1\xd2\xe7\x53\x71\x6f\x3d\xcf\xf3\x21\x54\x45\x3d\xd5\xb6\xac\xd2\x81\x2a\x12\xad\xda\x06\xae\xb4\x38\x50\x45\x28\xd5\x36\x97\x50\x67\x78\xfb\xad\x11\x3d\x56\x8d\x51\x39\x93\x4b\x24\x99\x70\x77\x80\xd9\xb3\xcc\x40\xe9\x99\x61\x68\xe6\x95\xdd\x29\xea\x2b\x9b\xb0\x39\x53\x14\xc8\xbe\xe7\x0b\xda\xcf\xc2\xf2\x27\xe4\xae\xdf\x2f\x5d\xad\x6c\x6e\x99\xf3\xf0\x97\x83\xa3\x72\xd1\xb7\xfa\x5a\x65\xea\xcf\x94\x84\xd0\x97\x2a\xa2\x67\x21\x19\x47\x71\x3a\xf6\xc3\x97\x27\x34\x94\x80\x58\x79\xdd\x71\xde\x68\x9f\xfa\xb3\xd9\x92\xd1\x9e\x1d\x42\x26\xbf\x17\xeb\xf4\x72\x0c\x6a\x1d\x62\xe9\xc3\xec\x36\xb0\x99\x5a\xa5\xc9\x18\xac\x6d\x8c\xa2\xbb\x06\xb2\xd7\x2f\x33\x80\xb9\x42\xca\x47\x0f\x55\x45\xcd\xd1\x98\x2f\x28\xf8\x7b\x65\x0d\xf5\x2d\x7f\x56\xc0\xec\x2b\x87\xac\x5e\x89\x03\x13\x1c\xce\x0f\xf9\x41\x92\x79\x42\x12\x78\xc8\x87\x6b\xfc\x90\xf2\x0b\x53\xfa\x68\x57\x52\x60\x4a\xee\x63\x79\xec\xd1\x87\x78\xce\x83\xdf\x82\x90\x28\xa9\xc6\x46\x79\x22\x77\xe9\x83\x18\xfa\x51\x1c\x93\x64\x16\xe1\x2d\x7f\x14\x1e\x5b\x8a\x5e\x6e\x09\x4e\x71\x29\xe1\x60\xd1\x02\x93\x83\x55\x6b\x54\x33\x96\x33\x30\x6f\x60\x01\xcf\x72\x31\xc8\xd7\xa7\xa2\x3e\xc5\xb1\xe5\x6b\x4e\x96\x40\x31\xb0\x64\xb1\x7d\xb5\x86\xe4\x7e\xc7\x75\xc1\x67\x6c\xbd\xa8\x16\x3c\xc6\x7b\x43\x2e\x7f\xb4\x85\x0f\xe6\x28\xe7\x2a\x86\x79\x01\x63\x3d\x7f\x24\x61\xde\x9e\xd7\x93\x3e\x61\xf7\x38\x96\xe9\x5b\xdb\x9a\x84\xfc\x4a\x42\x06\xd0\x3b\x35\x94\x26\xaa\xeb\x33\x58\xea\x8a\xd6\x19\xbb\x18\x3d\x20\xa8\x71\xf8\x6a\x55\xe0\x87\x38\x8f\x50\x58\x78\x7a\x29\xc5\x85\x07\x76\x71\x3a\x26\x53\xc1\x5c\xf7\x86\xf0\x90\xcd\x34\xb8\x22\x98\x87\x78\xc0\x6a\x18\x90\x81\x83\xe7\xa2\xb8\x55\x84\xd6\xc9\xb5\x93\x20\x04\x5f\x36\x85\x71\x0b\xbc\x43\xab\x3a\x09\xf0\x32\xf9\x75\x76\x46\x6b\x78\x0a\x7e\xa8\x06\x45\x65\x40\x92\x7e\x05\xa5\x38\x7d\x92\xc5\xa1\xe2\x8b\x74\x05\x55\x31\x22\x05\x17\x0d\xcd\x11\xb2\xc2\xf0\x10\x32\x9f\xaf\xad\x28\xbf\xf3\x47\x45\xc3\x46\x61\x01\xda\x10\x96\x1f\x9f\x96\x97\xe2\xab\x2c\x43\x8f\xd4\xd4\x41\xd6\x78\xa5\x40\x62\x2b\x09\x9d\x4f\x79\xaf\x9d\x66\xc6\x99\x30\x95\xe9\x33\x85\x26\x5b\x82\x10\xad\x0c\x51\x8c\x80\x1e\x32\xdc\xb2\xc3\x70\x35\xad\x62\xc9\x1c\x12\xf5\x1e\xdd\x51\x2a\x18\x2b\xde\x90\x1a\x92\xc8\x94\x8e\xf5\x4c\x14\x76\x2e\x8f\x1c\xec\x1a\x44\x11\x09\x5f\x80\x41\x6c\xbe\x2c\x33\xe2\xab\x2e\x16\x56\x30\x21\xc9\x39\x2f\x3b\xce\x2c\xad\x5e\x6e\x5a\x72\x74\xc4\x79\x9a\xad\xec\x4d\x85\x41\xe1\xd9\xc5\x94\x1d\x03\xd7\x82\x8b\x74\x55\xf4\x7b\x65\xbc\x61\x08\xb2\xce\x13\x00\x0c\x23\x57\xa6\x34\xac\x83\xc5\x73\x77\xa0\x4a\xc7\x49\x15\x6e\x43\xdd\x83\xb6\x0c\xb9\x2e\xcc\x39\xcd\x26\xbc\x19\x2c\xd8\x0d\x17\x0f\x51\x3e\xff\xff\x28\xa7\x3c\x84\xde\x7c\x24\xee\xee\xf8\xff\x3f\x00\x12\x8e\xa8\x64\x27\xd3\x1e\x19\x0c\xd8\xe0\x7d\x7d\x10\xf5\x08\xf8\xb3\xd9\x24\x60\x67\x22\x93\x35\x7e\x9b\xb3\x9f\x42\xdf\xc7\xc9\x2e\x48\x1d\x76\x94\x05\xfa\x24\xc6\xcb\x28\xfb\x41\xdc\x9f\x4f\xd9\xc5\x0b\xec\xaa\xe3\x59\x1c\x1d\x07\x03\xe6\x14\x82\xa7\xe6\x99\xe8\x19\x46\x31\x83\x27\xf8\x13\xc5\xcf\x43\x64\x91\x87\x0d\x78\x40\x08\x8c\xd3\x74\x96\xb4\x9b\xcd\x51\x90\x8e\xe7\xbd\x46\x3f\x9a\x36\x1f\xf9\xc9\xf8\x88\x84\x7e\xd2\x64\x27\x68\xfa\x51\x4c\x9a\xb3\xf9\x64\xd2\xf4\x5a\x9b\x3b\x0c\x20\x65\x7a\xf4\x4b\x1e\x90\xd4\x0f\x26\x54\x00\x40\xb3\xc9\xbe\xbd\x37\x16\x11\x9b\xd8\xdd\xaa\x78\x54\x54\x13\x79\x41\x08\x5f\xdd\x45\x4c\xd8\xb8\x66\x74\xe1\x20\x0c\xa4\x7a\xf3\x51\xd2\xe8\x8f\xe3\x68\x1a\xcc\xa7\x8d\x28\x1e\x35\x67\xcd\xe3\xdd\x66\x90\x24\x73\x92\x34\x59\xd5\xb7\x83\x41\x67\xcf\x2d\x44\x88\xf7\x27\x1f\x36\x8c\x79\xea\x7c\x80\xe0\x5b\xf1\x14\x94\x19\xb5\x05\xf3\xd0\xf3\x47\x12\x0e\x92\xa5\x06\xb8\x9d\x1d\x6d\xfa\xb9\xc3\xf0\x49\xa4\x55\x3c\x52\x53\x47\xd1\x0c\x70\x71\xa3\x55\x81\x38\x5d\xcf\xcb\xdf\xe2\xfc\x97\x14\x98\xcc\xf0\x55\x2c\x2f\x95\xd4\xe0\x7a\xaa\xb6\x62\xa3\x62\x80\x21\x72\xbd\xd3\x31\x97\x72\xdc\x86\x7d\x2f\xe1\x21\x09\x85\xed\x15\x73\x4a\xdb\xa0\xa3\x1d\x38\x9c\xdc\x4b\xde\x9e\xe3\x85\x37\xdc\xf6\xdd\xe9\xe0\xa5\x1c\x99\x3c\xef\x92\xe1\x84\x2c\x82\x63\x62\x64\x64\xb8\x99\x39\x65\xa7\x8a\xfe\x95\xeb\x5e\x89\x61\x94\x8e\x75\x0c\x19\x69\x4b\x30\xc4\xbc\x1c\x43\x96\x31\x8f\x21\xe6\xd1\x31\x54\x19\xd9\x34\x63\xe6\xcc\x63\xc8\xdd\x3b\xd4\x6d\x10\xd6\x75\x55\xef\x8d\x1b\x70\x5d\x2f\x47\xdf\xf5\x96\x4a\x6b\xe1\x2d\xd1\x17\xdc\xb4\x48\xff\xac\x4c\x4e\xa3\xe9\xe2\x5d\xa1\x2e\xeb\x2a\xaa\xb9\x00\xb0\xc8\xb6\x1c\xac\x59\xf0\xba\xc1\x20\xcb\x33\x5f\x37\x3b\x3f\x67\xdb\xf0\xf6\x33\xf7\x67\x71\xe8\x12\xfd\x4c\xf3\xb3\x84\x64\x84\xbb\x59\x44\xb8\x7c\x4e\x03\xe9\x0c\x57\xca\xba\x8a\x6a\x2e\x00\x2c\xb2\x2d\x07\x9b\x21\x5c\x96\xca\x4b\x32\x5f\xcf\x12\x35\x43\xb8\xba\x57\xb8\x1d\xe2\x2e\x15\xc7\x52\x28\x14\xc8\xe3\xe7\x8b\xdf\x28\xad\x2b\x8b\x34\x26\xd3\xf9\xb4\xd4\xba\xbc\xad\x59\x77\xbf\x90\x96\x19\x62\xa4\x11\xf8\x22\xa6\x5a\x2a\xe3\xe7\x29\x61\x52\x53\xec\xc9\x32\x06\x51\xab\xd8\x06\xae\x10\xf8\x8a\x36\x48\x00\xdd\x78\xa9\xde\x8e\x1b\x05\xa7\xa8\xef\x3f\x94\x62\xe4\x21\x8b\x75\x40\x49\x4b\x06\x72\x52\x48\xe8\xda\xba\xcf\x1e\x83\xb0\x4f\xc0\x6d\x78\x0d\x17\xdf\xa7\x54\x33\x89\xdf\x19\xc2\x21\xbe\xf6\xfd\x94\x8c\xa2\xf8\x14\x3d\x0d\x56\x5b\xef\xe6\x2d\x37\x72\x76\x58\x37\x27\x06\xa3\x89\x2c\x2b\x59\xf8\x74\xf9\xcf\x11\x3d\x6c\x4c\xfd\x85\xd5\xdd\x74\xa0\xe5\xc0\xae\x03\xdb\xa8\x1b\xae\x53\x0d\xa1\x73\x0b\x76\xcd\x5c\xc6\x37\x49\x00\x73\x6e\xa1\x19\x11\x51\x63\xb7\x84\x25\xe1\x2d\x39\xda\x2a\x98\xdd\x85\x76\xdb\xe0\x0a\xb1\x90\x16\xbd\xea\x70\x36\x60\x79\x8d\xcd\xa7\x22\x2e\x9e\xfa\x8b\x02\xc6\x7d\xbe\xe8\x77\xc6\x4d\x36\x6b\x6b\x6b\x6c\xe1\xd4\x60\x78\xdc\xe7\xcb\x1a\x4b\x82\xa9\x1c\x1e\x92\x84\xdd\xfc\x59\x71\xf8\xa2\x63\x32\x27\x6d\x0c\x2b\xb2\x86\x76\x54\x3a\x14\x0e\x47\x24\x7d\x3b\xe8\x93\xf7\x82\xfe\xd1\x57\x99\xc6\x51\xb6\x48\xde\xa3\x65\xce\xa9\xb5\x3a\x22\xa9\x02\x55\x65\x15\x93\x70\x3e\x25\x31\x55\x09\x59\xed\x74\xc0\x8c\x48\xaa\x45\x2d\x1a\x91\xd4\xca\xd8\x68\xf3\x88\x35\x0c\xd8\xcc\xc8\x40\xdb\xb1\x02\x4a\x26\xa0\xab\x47\xcb\x4c\xb9\x10\x6a\xaa\x18\x86\x1a\x7e\x23\x9a\xfa\x41\xf8\x22\x09\xa7\x55\xa3\x10\xcd\xb2\xea\x2a\x5e\xd7\x2f\x91\x55\x79\xd6\xd2\x86\x40\x07\x0a\xb3\x98\xe9\x39\x3e\xd7\xb7\x90\x71\x30\x60\xa8\x80\xc1\x7b\x91\xd8\xdb\x36\x82\xf4\xaa\x37\xcc\xc6\x36\x62\x22\x0c\x2b\xeb\x40\x40\x33\x20\x0c\x3f\x8e\xd9\xbd\x68\xec\x95\xe2\x86\xc7\xe3\xd8\x2b\xd5\x02\x59\xb8\x1f\xf6\x4e\x0c\x34\x20\x8d\x4f\x69\x45\x22\x1a\xef\x61\xc0\x2c\x6c\x5d\xb1\x11\xce\xeb\x3c\xb0\x6c\x07\x0e\x93\x7d\xb8\x6e\x61\x05\xd6\x21\x0e\xdb\xa0\x11\x92\x45\x6a\xd9\x76\x63\x10\x85\xc4\xde\x57\xb5\x53\xec\x28\x66\xcc\xbd\xff\x30\x11\xe1\x51\xf8\xed\x6b\x37\x6e\xb0\xaf\xf2\xb2\xb4\x0e\x6d\x10\x8b\x2b\x03\x67\x70\x06\x7d\x0c\xb0\x63\x91\x38\x46\x48\x03\xd9\x28\x6c\x00\x89\x63\x9a\x6d\x18\x84\x18\x6b\xe7\x43\xde\x0c\x74\x9d\x38\x0c\x11\x7a\xd0\xad\x30\xfe\xac\x1c\xd8\xc6\x9b\x65\x9b\x45\x69\xa1\xc3\x81\xcd\x6f\xce\x3c\x24\xac\x7e\xc1\xdb\x3e\xab\x49\xc4\x4d\x92\xdd\xa3\xfa\x80\x96\xc7\xee\x6b\x88\xbd\x71\x3f\x8e\x6d\xfa\x45\x8b\xe6\xa9\x3b\x77\x64\x48\x4b\xd7\x58\x8c\x5f\xb3\x05\x0b\x7b\x5d\x82\xfa\x50\xbb\xeb\xf3\xbd\xd3\x19\xe1\xd7\xa5\xde\x0b\x8f\xfd\x49\x30\x00\x3f\x4d\xe9\x04\xce\x6c\xbe\x2a\x64\x52\x18\x85\x75\xac\x99\xae\x97\xc5\xf5\x8a\x15\x84\x7a\xb6\x0f\x67\x94\x38\xa8\x33\x7c\xf6\xf7\xd9\xdf\x2b\xf9\xb7\x0e\xbf\x36\x0c\x26\xe4\x9d\x63\x12\x1f\x07\xe4\x44\x1e\x90\x21\x90\x06\xfd\x23\x61\xc4\x88\x86\x90\xf4\x7d\xaa\xee\x7d\xf6\xf7\xd9\xdf\x2b\xf9\xb7\x0e\xbf\xe6\xcf\xd3\x71\x14\xc3\x22\x98\x90\x6d\xcf\x73\xc0\x8f\xfb\xe9\x78\x1e\x7f\xc6\xb4\x9f\xfd\xbd\xa2\x7f\xeb\xf0\x6b\x03\x2a\x6b\x5b\xae\xb7\x55\x77\xf7\xea\xde\xce\x67\xcc\xfa\xd9\xdf\x2b\xfa\xb7\xde\xe4\xab\xac\x79\x1a\x4c\xca\xcc\x0c\x1b\x5b\x3b\xd2\x34\xe1\xc7\x41\x3a\x9e\x92\x34\xe8\x97\xd9\x24\xb6\xdd\x82\xcc\x2d\x5c\x0a\x85\x29\x89\xa3\xd9\xbb\x2c\xef\x1b\x64\xe8\xcf\x27\xa9\xa5\xe5\xa2\x05\xe5\xfa\xa1\x24\x7b\xd4\x7b\xa4\xe9\xff\x51\xef\x11\xda\x90\x7b\x8f\x1a\x6a\xc1\x0a\xb7\x31\xbd\x0d\x1f\xc2\x80\x95\x6a\x63\x02\xd5\xde\xf5\x0a\xd2\xe8\x4e\x14\x26\xf3\x29\x55\xf4\xd5\xb2\x64\xe9\x7a\x45\xdd\xc9\x02\x1d\x70\xe9\x74\x14\xd3\xa6\xc9\x4c\xc2\x7c\x55\x76\x5f\x0b\x16\xe8\x06\xdc\x49\xa3\x1b\x1c\x68\x2b\x27\xfa\x49\x5b\xba\xf0\x54\x86\xc7\x30\x8e\xd0\xfe\xc5\x56\x21\xca\x68\x29\x35\x3b\x1f\x90\x5c\xc7\xfe\x84\x79\x3e\x4c\x83\x50\xb3\x60\x62\x04\x3e\xd3\xe4\x67\x5e\xff\x0f\x1f\xbe\xcd\x37\x8f\xa6\x41\xc8\x79\x03\x0f\xa7\xe8\x60\x8a\xf3\xfb\x0b\x3d\x7f\xa6\x0a\x61\x7f\x94\x36\xcb\xd7\x43\x89\xa8\x69\x1d\x1c\x91\xf4\xab\x74\x55\x76\x8f\x7f\xb5\x0e\x63\x32\x54\x3b\xf3\xf4\x0d\x99\xc8\x30\x07\x60\x26\x07\x84\x2b\x2f\x20\xf6\x1d\x96\x59\xde\x59\x0f\x88\xa3\x48\xf5\x0e\xa4\x8f\x26\xae\x02\xdf\xc2\x12\xd3\x20\x74\xe4\x26\x35\x4d\xc5\x12\xcc\x64\x88\x9b\xa2\x64\xc1\xce\xdc\x8a\x3b\xd8\x69\x45\xb7\x68\x06\xb5\xf7\xa5\x80\xd1\x62\x59\x50\xc2\xb2\xa3\x2c\x9f\x5d\x51\xc4\x91\x19\x0f\xd0\x74\x99\xeb\x5c\xdc\xc8\x4b\xc9\x0c\xe4\x75\x3c\xc4\x4f\xd0\xde\xab\x45\x58\xec\x91\xf4\x84\x90\x10\x75\xfc\xc4\x61\x91\xc9\x3d\xd7\x81\x16\xfd\x7f\xab\xac\xbb\x21\x8e\xe6\xa3\xf1\x03\x0a\x5c\xeb\x46\x4c\x64\x55\xca\xc5\x03\x3a\xe0\x0c\xc8\x71\x80\x1b\x9d\xdc\xd7\x6b\x10\x0c\xf9\xe1\x01\xfa\x95\xe2\x49\xab\xbf\x13\xcd\xc3\xd4\xa8\xee\xf3\xc2\x03\x1f\x03\x2e\xbc\x21\x82\x3c\x01\xc0\xeb\x34\x41\x96\x14\x91\x98\x64\x18\xa8\x28\x86\x30\x32\x61\x51\x0e\x19\x51\xdc\xd1\x0f\x06\xb9\xe7\x4d\xbf\x9f\x46\x31\xbc\xae\x25\xc1\x10\xd3\x0c\x1e\x94\x8d\x7e\xef\x42\x04\x3d\x89\x18\x6e\x39\x86\x7d\x33\x8a\xa7\x7e\x4a\x89\x67\x49\x32\x3a\x66\x13\x9d\x1c\x96\x6a\x17\x55\x91\xfe\x66\x47\x5d\xe2\xaf\xf6\x62\x38\xbb\xb0\xbb\x61\x47\x41\x8a\x64\xa5\x8c\xac\xc9\xd5\x06\x97\x70\x8d\x11\x49\xdf\x90\x99\x14\x68\x74\x94\x40\x97\x00\x02\xe8\x8e\xa9\x9a\x65\xf6\x33\x6d\x31\xf2\xd9\xd4\x9f\x4c\x48\x92\xf2\x48\x5b\x9c\x42\x18\x18\x1a\x7a\xc1\x68\x44\xb8\x43\x83\xf4\x65\x9a\xfa\xa3\x30\x48\xe7\x03\x76\x5a\x2c\x0b\x97\xe3\x4f\x1f\xdf\xc5\xea\x3b\x1a\xc7\x35\x41\x1e\xf0\xa4\x9c\xaa\x1a\x29\xb0\xfe\xda\x98\x84\xe0\x33\x91\x31\xc2\x1b\x05\x06\x78\x76\x24\xf2\x53\xe1\xf4\x85\xbe\x59\x18\xdf\xa7\xdf\x9f\xc7\x7e\xff\x94\xe2\xc4\x1d\x48\xa6\xfe\x29\x65\xa6\x93\x38\x0a\x47\x1c\x11\x7f\x4a\xc2\xc1\x03\x0d\x1b\x8d\xb2\xd7\x3b\x1d\xf0\xe0\x76\x31\x7d\x79\x75\xa7\xec\x28\x6a\x9f\x04\x13\x4b\x35\xaa\x09\x6e\xc3\xdd\xb2\xa1\x96\xeb\x6d\x87\x7f\x69\x5f\x12\xaa\x57\x06\xd4\x53\xbe\xe6\x43\xc9\x86\x65\xcc\x21\xab\x31\x9b\xef\x94\xd2\xdf\x70\xe9\x36\xc7\xec\x6d\xbd\xbe\x36\x28\xc4\x55\xb2\xad\x8b\xb1\xbe\x21\xc6\xd8\x20\xc7\x88\x4f\x69\x76\x7e\x01\xf2\xc1\x9c\xd6\x90\x46\xf9\x1d\xaa\x52\xf9\xc5\x4a\x42\xc9\x9c\x35\x27\x60\x5e\x61\x56\x04\xb8\x40\xb4\x48\x29\x26\xa1\x62\x30\x3d\xca\x5b\x42\x14\x9c\x2b\xdc\x56\x97\x6c\x99\x39\x32\xfb\x57\x2c\x7c\xde\x0b\xfa\x47\xef\x0c\x1f\x04\xe1\x68\x42\xd0\x7a\x2e\x7c\x35\x24\xee\x19\x51\xa4\xb9\xb9\x25\x6f\x4e\x4a\x05\x09\xfd\x18\xf9\xa9\x76\x5e\x40\x0c\x60\xe8\xb0\x1d\xf7\x66\x33\xd3\xa9\xd3\x60\x30\x98\x10\xb5\x5b\xca\x11\xc6\x82\xfc\x9b\x3c\x85\xc7\x65\x1f\x43\xe1\xc6\x8d\x22\x14\xf9\x48\xed\x25\x5f\xc5\x6b\xbb\x59\x5c\x92\x5e\x62\x7a\x72\x60\xf4\x1e\x96\xe5\xa6\x7e\xce\x91\xcb\x3a\xc4\x37\x19\x47\xf3\x09\x15\xe4\x52\x68\x48\xa1\xc6\xf9\x4f\x9b\xbf\x82\x84\xcb\xbe\x98\xc9\x31\x8f\x03\xe4\x2d\x37\x46\xca\x0a\x12\x98\x9f\xf3\xaa\x83\x27\x30\x06\x45\x8b\x15\x64\x01\x8b\x9e\xc0\x48\xda\x44\x24\x6c\x87\xfd\xec\x67\x8f\x42\x72\x32\xdc\xca\x90\xe1\x5d\x71\x6f\xa3\xe2\x78\x21\x47\xe5\x98\x30\x5a\xcc\x0f\x77\x30\xea\x88\x97\x20\x81\x51\x4c\x30\xc8\xa1\x41\x16\xd9\x96\x2c\xb6\xba\x6b\x9e\xc2\x51\x79\xed\xc8\x89\xae\x08\x82\xa5\x06\x1e\xa5\x1c\x34\xa1\xc5\x7c\xe2\xb5\x83\x9f\x85\x1c\xb3\x1c\x1d\x39\x8f\xb2\x6c\xf7\xb8\x9b\xe7\xb9\x15\x0b\x01\x8b\xfb\x39\xb4\xdf\x71\x99\xd4\xe8\x47\xd3\x59\x94\x10\xdb\xd2\xd2\xa6\xfe\xcc\xb6\xd4\xe6\x47\x98\xdd\x01\x2c\xea\xf1\x64\x3e\xb5\x18\x46\x25\x2c\x25\x59\x22\x84\xba\x8e\x3b\xe7\x04\x7e\x5c\x40\xe2\x10\x53\x0d\xd5\x10\xdd\xc3\x90\xa2\x28\xdb\x66\x2f\xd7\x2f\x4b\x85\xac\x5a\x14\x94\xad\x0d\x70\xd5\x61\xe8\xf6\x45\x60\xe4\x5a\xa1\x6c\xc9\xb0\x0c\x4c\x89\x70\xbe\xb4\x7c\xbe\x94\xf2\x29\xdb\x72\x61\xe5\x53\x38\x55\x4b\xf1\xe4\xe4\x29\xc8\x75\xf7\x1c\x49\x0a\x66\x00\x29\x81\x51\xfd\xa4\xeb\x17\x5a\x6c\x15\xe9\x9f\xc3\x9c\xae\x45\xf9\xf1\x54\xb1\xdb\x78\x0b\x36\x99\x4b\x06\x4f\xef\x6e\x1e\x98\x2e\x72\x70\xdb\xfc\xd8\xa6\x0a\xeb\x9a\x29\x7e\x2f\xa8\x5c\xeb\xf3\x8c\xa9\x5c\x5b\x94\x71\xe8\x00\x08\xe9\xc0\xcc\x0c\xd5\xf3\x15\x6e\x81\xd8\xeb\x30\x25\x83\xc0\x9f\x9c\x37\x51\x45\xc1\x40\xb5\x06\x55\x50\x97\xb6\x22\x08\x13\xe1\xe1\x2b\xf8\xd3\x01\xd7\x98\x64\x28\x3c\x6d\x81\x48\xd5\x7a\x4a\x46\x8a\xfe\xad\x22\xc9\xe7\x6a\xb2\x8d\x7d\x5a\x3a\xb7\xae\x9d\x3f\x89\xb0\xbb\xf6\xac\x25\xe2\x86\x31\x8a\xed\x70\xc9\x8a\x55\x4e\x83\x70\x9e\xb0\xb0\x1f\xd1\xca\x55\x61\xa1\x73\xe4\x17\x42\x94\x79\x94\xd0\xc2\x5a\x93\x34\x0e\x66\x2b\x54\x84\xf9\x24\x10\x6f\xdb\x14\xe9\x3d\x32\x89\x4e\xc4\xd2\x48\x69\xa3\x3c\xbf\x62\x1b\x39\x77\xd2\x42\xf3\x59\x51\x09\xce\x65\xb4\x5c\xae\x04\xee\x95\x89\x42\x5a\x9d\x35\x09\xab\x46\xb5\x23\xde\xfb\x5a\xee\x5b\x9a\xf8\x55\x9d\x8c\x6c\xc5\xe2\x4a\xa3\xe4\x09\x09\x19\x30\xcf\xde\x63\x9c\x69\x75\x1e\xcb\xe8\x32\x6c\x15\xd6\x30\x0e\x4f\x5e\x50\x18\xe4\x07\x09\xc5\x3e\x3b\xd3\x6a\x8d\xb8\x59\xde\x88\x09\x49\x12\xde\x88\xbe\x1f\x16\x36\xe0\x84\x08\xf4\xfd\xc1\x00\x92\x68\x4a\xe8\x43\x40\x6b\xf7\x27\x72\x10\x82\xd6\x2b\x38\x62\xc0\x85\xdb\x1a\x75\x8d\x71\xaf\x70\xa3\x6b\x2b\x9e\x89\x71\x96\xc1\x10\x0a\x90\x96\xdc\x36\x3b\xb0\x0c\x70\xd6\x60\xc3\xda\x4d\x7b\xa3\xcd\x04\xf8\x9a\xd0\xce\xdf\x0a\xc2\xb2\x05\xde\x0a\x83\x44\x4c\xf2\x0a\x29\x31\x54\xb4\x1a\xfc\x45\x49\x0d\xab\x2b\x11\x9c\x4a\x02\x38\x6d\x1d\xd5\x07\x0a\xd5\x01\xd6\xa1\xb9\xd9\xb8\x54\x3d\x70\xd4\xe4\x3e\xa5\xc4\xc8\x29\x08\x98\xa1\x5d\x62\x24\x7c\xd5\xd6\x5f\xc5\x2b\x2e\xd3\x57\xe9\xcd\x10\xad\x8f\x1b\xa6\x8d\x72\xb3\xd8\x46\xb9\x51\x6c\xa4\xdc\x2c\x34\x52\x6e\xea\x46\x4a\x45\x89\xc2\x69\xda\x33\xa7\x69\x6f\xd9\x34\xed\xd1\x69\x7a\x5b\x08\x34\x93\x58\x85\xc0\x5b\x26\xf0\xd6\x32\xe0\x2d\x0a\x1c\xfd\x8f\xf8\xc4\xf9\x96\x0c\x9a\x2f\xe7\x78\x4d\x88\x31\x92\x4b\x8d\x44\x93\xc5\x53\x7f\x61\x69\x72\x4b\x53\xc3\x0f\xb3\x36\x62\xa6\x28\x98\x66\xe3\xae\x60\xc6\x03\x49\xef\x5c\xb9\x22\x43\x72\x36\x8f\xde\x61\xfd\x28\xe6\x7d\x96\x83\xa4\x75\x20\xcd\xc5\xfa\x30\x9f\x8b\x77\x28\x95\xaa\x02\x58\xa7\xc3\x4b\x64\x56\x0a\x85\x4b\x7b\x56\x68\x89\x76\x27\x65\x55\xb3\x09\x5f\x20\xa9\x32\x19\xe7\x15\x2d\x41\x4d\x63\xd2\x80\x4e\x66\x12\x11\x35\x32\x1c\x1d\xd6\x47\xd9\x5a\x1d\x73\x8d\x6c\x82\x6c\x28\x19\x29\xa5\x64\x3e\x13\xff\x60\xe4\x63\x54\x2c\xc8\xc7\xed\xf1\x32\x56\x52\x52\xa6\x32\xe0\x4a\x08\xdb\x21\xe0\x4b\xc8\x35\x70\x1b\x1e\xac\x73\x15\x9c\xcf\xf1\x4a\xc8\x4b\xc3\x3e\xdc\xd6\x97\x7c\x31\xc1\xf8\x8e\x36\x5b\x54\x26\x74\xd2\x39\xe6\x8e\xa5\xfa\x9e\x92\xe9\x0c\xc9\x24\xc4\x96\x29\x21\xb6\x8b\x25\xc4\x56\xb1\x84\xd8\x2e\x94\x10\xdb\x9f\x49\x88\xd5\x24\xc4\xc6\x65\x45\x44\x91\x1c\xcf\x01\x5f\x4d\x46\x6c\xae\x24\x23\x36\x5f\xa2\x8c\x28\x5f\x68\x71\xfc\xea\xbc\x39\xb8\xdc\xea\x97\x2f\xb5\xdc\x2b\xb5\x91\xf0\x56\xd7\x20\xe4\xc3\xb3\xdc\xbc\x61\x48\x00\x66\xe4\x40\x34\xed\xc6\x30\x98\xa4\x24\xd6\x6a\x21\x61\x1a\x9f\x66\x6a\xc2\x34\xba\x24\xe3\x55\xde\xb8\xc1\x93\x6e\x0a\x82\xe7\x03\x9b\x5c\xa5\x60\x50\x5e\xd2\x5c\x46\xec\x38\x59\x05\x5b\x88\x8b\xdd\x62\x71\xb1\x53\x2c\x2e\x76\x0b\xc5\xc5\xae\x2e\x2e\x5e\xa1\x51\x9d\x1b\x04\x5b\x97\x1d\xae\x45\x42\x35\x07\x7c\xb5\xe1\xba\xbd\xd2\x70\xdd\xbe\xc8\x70\xed\xb2\x0c\x07\xc6\x00\x3c\x4f\xa4\x5d\xf1\x30\xcd\x8c\x99\xee\x41\xa3\x8f\xf1\xdb\xac\x02\x37\x88\x73\xa6\x54\x53\x35\x80\x3a\xb8\x8d\xbd\x3d\x73\x46\xb5\x1d\xd6\x68\x7f\x71\xf0\xfc\x83\x88\x22\x5e\x74\x54\x60\xd9\x31\x02\x5d\xea\x90\x69\x14\x3c\x26\xb6\x55\xa0\xc2\xdb\xfb\x02\x7a\x19\xe4\x55\xa0\x9e\x07\x71\x85\x53\x11\x66\x96\xf3\xeb\xd1\x25\x48\xfe\xac\xc8\xf6\xf3\x05\x67\x7d\x41\xc7\x9a\x56\xf0\x31\xe2\x6b\xd1\x67\xff\xf6\xdf\xfe\xf2\xf7\xfe\xe8\xd3\x1f\xfd\xe8\x93\x1f\x7c\xeb\xd9\xf7\x7f\xfc\xec\x77\x7e\xf8\xe9\xcf\xff\xfb\xb3\xbf\xfe\xcf\x18\x4f\x03\xad\x41\x6e\xc3\xdd\x33\xff\x76\xed\x8e\xdb\xf0\xf4\x63\x72\x62\x7d\x1a\xce\xa7\xdc\x50\xfc\xe9\x3f\xfe\xee\xd3\x6f\xff\xc5\xd3\x6f\xfe\xac\x28\xdb\x2c\x26\xfd\x00\x03\xb0\x7e\xf2\x3f\xff\xf1\xe9\x4f\xff\x4b\xa1\xeb\xc0\xb3\xef\xff\x98\x15\xd7\x96\x86\x0c\xa3\x70\x3e\x55\x92\x5b\xc1\xba\x1a\x9d\xcc\x6b\xe9\xa3\xa8\x86\xb7\x25\xb0\x6d\xba\x70\x3e\x6d\xa4\xd1\x7d\x51\x9f\x25\x6b\xb6\x0d\x63\xff\xd3\xdf\xfa\xf3\x67\xbf\xff\xd7\x8c\x96\xcf\xfe\xf0\x47\x4f\xbf\xf7\x5f\x3e\xfe\xc9\x4f\x9f\xfd\xaf\x1f\x7e\xf2\x1b\x1f\x7d\xf2\x3f\xfe\xe1\xe9\x9f\xfe\x3b\x73\x71\x6f\xd0\xce\xa4\x9a\xa0\x88\x5c\x75\x33\x70\xcf\xfe\xf0\x47\x19\x70\x4d\x51\xb7\xe9\x8d\xfe\xf1\x4f\xbe\xf9\xf1\x4f\xff\xf8\xe9\xb7\xff\xfb\x27\xbf\xf7\x5f\x3f\xf9\xc1\xb7\x3e\xfd\xc5\xf7\x3e\xf9\xe1\x1f\x3c\xfb\xfd\x8f\x9e\xfd\xcd\xf7\xd7\xf2\x1e\xbf\x6b\x85\xfe\x94\xd9\x70\x8c\x9c\x10\xe6\xc1\xc2\xe6\xaf\x5b\xdd\x5a\xfd\xe0\xb6\xfd\xfe\x60\xfd\xfd\xc6\xfb\x83\xda\xbf\x68\x36\x52\x92\xb0\x9c\x6b\x00\x06\x7d\x3e\xfd\xf7\x7f\xff\xf4\xbb\xbf\xcf\x7a\xf7\x93\x1f\x7c\xeb\xe3\x9f\xff\xce\xb3\xef\xff\x18\x09\xf7\xed\xbf\xfb\xf8\x27\x7f\xfd\xc9\x3f\xfc\x5f\x4f\x7f\xf4\xd1\xd3\x6f\xfe\xec\xe9\xff\xf8\xd3\x8f\x7f\xfa\xef\x9f\x7e\xe7\xa7\xbf\xfc\x83\xbf\xed\xba\x0d\xcf\x01\xcf\xfe\xa7\x9f\x7d\x07\x9e\xfe\xe3\x1f\x3c\xfd\xad\x1f\x7f\xf2\x83\x6f\x3d\xfd\xe6\xcf\x3e\xfe\xc9\x4f\xf1\x3c\x67\x59\x21\xd7\x63\x1b\xf8\xff\xf4\xb3\xef\xc8\x62\xac\xc2\x8f\x7f\xf2\x53\xa8\x7b\x4b\xcb\xb2\xc2\x6e\x69\xe9\x56\x99\x95\x86\x19\xbd\x25\xff\xaa\x8e\x94\x46\x17\xd9\x68\xd3\xec\x91\xdf\xd4\x14\x5c\xee\xf7\x92\xa2\xfd\xd9\x4c\x24\x12\xcd\x9e\x5e\xb2\x13\x28\xb3\x7a\x39\x7b\xb8\xfc\xa4\xed\xd5\xc9\xa8\xf8\x7e\x2f\xb1\x85\x13\x09\x8f\x92\x6f\x33\x33\xac\x69\xb8\x53\x41\xb4\x44\x6f\xff\xf0\x3f\x52\xa6\x13\xbd\xfd\xf4\xc7\xdf\x7d\xf6\xfd\x1f\x7f\xf2\x1b\x1f\x3d\xfd\xde\xbf\x37\x3a\x3f\x47\x44\x9f\x13\x90\x12\xff\xbb\x3f\xfa\xf4\x5f\xff\x9c\x8e\xa2\xef\xff\xed\xb3\xef\xff\xf8\x9f\x7e\xf6\x9d\x8f\x3f\xfa\x33\x95\x88\x63\x41\x80\xc9\x91\x1a\x4a\x89\xcd\x26\x6d\x8d\xe6\xbe\xa2\x77\x92\xe2\x66\x0d\xdc\x86\x6a\x15\x6a\xe0\x43\x1b\xaa\x55\xa1\x77\x25\xfd\x80\x84\x69\x30\x0c\xfa\x10\x46\x2c\x7e\x97\x30\x46\xa7\xb1\xbc\x40\xb6\x4a\xaa\xb6\xb1\x17\xa1\x07\x33\xa7\x9d\x88\xa2\xe5\x5e\x98\x62\x29\x76\x4d\x6f\xae\x7c\x0d\x95\x0c\x4a\x6d\x11\x56\x8a\xc5\x06\x3d\x85\x0e\x60\xb1\xd9\x24\x48\xad\x6a\xa3\x6a\xba\x91\xc4\xa7\xba\x04\xa4\x32\xee\xb4\xeb\x89\x7b\x8e\xd9\x0e\x92\xec\xa1\x8f\x3f\xfa\xc3\x67\x7f\xf3\x7d\x26\x1c\xfe\xe9\x67\xdf\xf9\xf4\x2f\xff\xf3\xd3\xdf\xfc\x9b\x8f\x7f\xfa\x9b\x8f\x12\x96\xf6\xc9\x0f\xbe\xc5\xa4\xf4\x2f\xff\xe0\x87\xbf\xfc\x4f\x7f\x58\xd2\x59\x9f\xfe\xa7\xff\x46\x01\x95\x74\x66\x0f\xb4\x8f\x39\x1f\x31\xf8\xe4\x2f\x7f\x94\x39\xc0\x2c\xbd\x68\x1c\xe8\xe9\x41\x83\xd2\xd7\xa1\x03\x92\x70\x16\xeb\x1c\xbb\xc1\xc3\x9d\x51\x42\x38\x50\xad\x32\x92\xed\xab\x52\x9f\xcf\x97\xea\x9d\x53\x4a\x28\x8d\x65\x9c\x52\x2b\xfe\xd2\x33\x3a\x02\x11\x5e\x67\x18\x64\x5c\xb0\xfa\x72\x97\x58\xcc\x1b\xff\xf6\xff\xbe\x9a\x7e\xa0\x80\x4a\xfb\x41\xfb\x98\xef\x87\xa7\xff\xe1\x3b\x99\xf9\x76\x3e\xcd\x74\x41\x4e\x97\x2e\xa1\x8f\x53\x46\x1e\x46\x1f\x03\x4c\x96\x24\x6a\x62\xd1\xf9\x80\x7d\x85\x9a\x62\x8e\x9e\x48\xa4\xa2\xa9\xcf\xb6\x25\x14\x39\xff\xcd\x77\xaf\x88\x9c\xff\xe6\xbb\x4b\xc8\xa9\x3e\x16\x90\xf3\xef\x7f\x98\x61\x6b\xdc\xa2\x50\x04\x55\xf7\x43\xd0\xc4\x7a\x4f\x67\x87\x5f\xfe\xd1\x9f\x5f\x0d\xfe\x14\x50\x29\xfe\xda\xc7\x82\x61\xf9\x0f\xbf\xfb\xec\x4f\xff\xc4\x6c\x02\xdf\xf5\xcc\x30\x85\x5f\x3e\x50\xe4\x78\xea\x95\xe5\xe9\xe9\x23\xf5\x25\x8c\xef\xcc\xf0\x6c\x32\x00\xeb\x19\x5e\xec\xd1\x35\x9f\x6f\x9b\xb6\x05\xbe\xcb\x6a\xb6\x7e\x1a\x0d\xf4\xb9\x99\x4b\x00\x3a\x1d\xf4\x8a\xdc\x4d\x7d\x73\x6d\x1a\x66\xa6\x5c\x1f\x9a\x14\x62\x76\x2d\xc7\xf8\x46\xb2\xfe\x34\x1a\x38\xb4\xac\xa9\x7a\x3e\xfb\xce\x6f\x7f\xf2\xed\xbf\x7c\xfa\xc7\x3f\x7d\xfa\xc3\x1f\x50\x7d\xfe\xaf\xff\xe2\x97\xdf\xff\x05\xd3\xb7\xba\x49\xea\xc7\xa9\x03\x24\x1c\xd8\x9f\xfe\xe2\x8f\x3e\xfe\xc9\x5f\x31\x45\x47\xaa\xfd\x38\x66\x3e\xfa\xbb\x8f\x7f\xf2\x7b\xbf\xfc\x93\x6f\x7e\xfa\x5f\xfe\xd5\xd3\x3f\xff\xd6\x27\xdf\xa3\xdc\x86\x13\x38\x63\xb5\x4f\x7e\xf0\x2d\xc9\x6d\x85\x0c\x85\x95\xc0\xa7\xff\xeb\xef\x3f\xf9\x8d\x8f\x0a\x33\x90\x70\x80\x8c\xf5\x5b\x9f\xfc\xc6\x47\x74\x1e\xff\xc9\xef\x3c\xfd\xce\xb7\x9f\x7e\xef\xbf\x7d\xfa\xa3\xcc\x5a\x41\x87\x49\x66\x00\xac\x2d\x4b\x7c\xf8\x3e\xfd\x77\x7f\xf1\xf4\xa3\xff\x59\xb4\x68\x50\xcb\x69\x45\x03\xbe\x78\x96\x7d\x18\x62\x28\x14\xfc\x9e\xd3\xaa\x78\x78\x52\x1e\x12\x8e\xe6\xbc\x89\x64\x34\xf4\x26\x76\xb4\x9c\xea\xbb\xdc\x07\x8d\x43\x9c\x4f\x69\xa2\xe6\x4f\xb6\x54\x5b\x7a\xfa\xa3\x8f\x58\x0b\x3e\xfd\xc5\x1f\x7f\xfa\x1f\xbf\xf3\xc9\x4f\x7f\xf1\xec\x9b\x7f\xf9\xec\xbb\xff\x81\xb5\xa9\x64\x8c\xc3\xd3\x1f\xfe\xe0\xe3\x8f\x7e\xfb\xe9\x9f\xfd\x19\xed\xcc\x3f\xfd\x57\x65\xb4\xef\xad\x9c\x33\x05\xe8\xba\x0e\x78\x07\x4f\x7f\xf3\xdb\x34\xe7\x9f\x7d\x8f\xf2\x4b\x46\x99\x55\x72\x42\x81\xcd\xe7\x67\x51\xee\x71\x5f\x73\x16\x4d\xfc\x94\xb0\x62\x19\x0b\xe6\x3c\x8e\x4f\x75\x7b\x25\x1d\x60\x0e\x68\xf6\xb9\x90\x9c\x50\xc9\x50\xf3\xf7\x55\x02\x1d\xf4\xb5\x9e\x3e\x4e\x30\x57\x0d\x30\x9e\x1d\x66\xa8\x63\x12\x1d\x23\xf6\xbe\xa0\xb1\x4e\x54\xca\xd0\xdf\xfc\x4d\x26\x50\xcb\x09\xbc\x32\x7d\x57\xcc\xb8\x80\xa7\xdf\xfd\xd1\xc7\xff\xf0\x17\x9f\xfe\xf0\xcf\xa9\xfe\xfa\x87\x3f\x62\xc8\x70\x95\xf8\x27\xdf\xfc\xf8\x27\x7f\x45\x17\x82\xff\xe6\xa7\xe5\x24\x7f\xfa\xf3\xdf\x5d\x3c\xfd\x93\xff\x0a\x3e\xfc\x9f\xd0\x63\xe3\xf9\xd3\xef\xfc\xeb\xa7\x7f\xfc\xb7\x4f\x7f\xf3\xdb\xcf\xfe\xe0\xef\xe8\x84\xf1\x8b\xdf\x7b\xfa\xc7\x7f\x2a\x97\x35\xac\x3f\x65\x87\xcc\xc3\xcb\x75\xc9\x42\x75\xc9\x20\x18\x0e\xa1\x03\x54\x4e\xd2\x6e\x59\x03\x91\x82\x3f\x4f\x9e\xc0\xbd\x70\x18\x84\x41\x7a\xaa\xf7\x90\xb5\x80\x3a\xf8\x74\xbe\xa6\xb9\x56\xea\x17\xba\x00\x40\xb9\xf4\xec\x4f\x7e\xfb\xd9\x6f\xfd\xd5\xb3\xdf\xff\x6b\x4a\xdd\xdf\xfd\x9d\x8f\x7f\xfe\x27\xbf\xea\x5d\xc6\x44\xf0\xf2\x2e\xfb\xa7\x9f\x7d\x07\x25\xc3\xcf\x7f\x77\x41\xa5\x65\x11\x00\x56\xfa\xe3\x9f\xfd\x80\x91\xe7\xe9\x6f\xfd\x98\xe5\x01\x3d\x53\x71\xd7\xbf\x17\xcf\x43\x16\x8d\xf1\xa5\x74\xbf\xd4\x1a\x5d\xee\x10\x3f\x0d\x42\xcb\x73\x32\x6c\x61\xf3\x01\x2b\x03\x9f\x70\xc3\x28\x74\x98\xd6\x24\xe4\x79\x5b\x3d\x3a\x6b\x20\xcc\x13\x6d\xf1\xc0\xe3\xc5\x28\x4d\xa3\x6d\xbe\x8a\xef\x59\x85\xa4\x5d\x98\xea\xd0\x66\x24\xf3\x69\x9b\xfe\x43\x8b\xe2\xa4\xdc\x66\x3f\xf8\xce\xe7\xe6\xb6\x7c\x72\x90\x28\x54\x5f\x6a\xf3\x5f\xcc\x87\x3a\x44\x9b\xff\xd2\x14\xb4\x6a\xb5\xd9\x0f\x56\x93\x1b\x9b\xed\x7c\x12\x2d\x58\x30\x8a\xdb\x45\x89\xb9\xbc\xaa\xdb\xdb\x65\x1f\xd6\xce\xf2\xb6\xce\xa5\x57\xb1\x28\x5b\x23\xef\xb6\xc3\xc3\x55\xed\x9e\xcd\x75\x18\xfb\xf1\x34\x0a\x4f\xb9\xc5\x14\xac\x60\x3a\x9d\x63\x1c\x4d\x1b\xd6\x9b\x45\xb0\xbb\x15\xbf\x72\x80\x41\x94\xc3\xc1\x65\x21\xf4\x10\xc2\x2c\x0a\xe8\xca\x41\x03\x11\x4c\x11\xc4\x7a\x93\xed\x9d\x1c\x7e\xed\xee\xe7\xef\xbf\x7e\xe7\x4b\x87\xf7\xde\xba\xff\xce\xbb\xef\xdd\x7d\xe3\xf0\xad\x77\xde\xf8\xca\x97\xef\x1e\xba\x87\x83\x8d\x43\x8c\x95\x75\x78\x58\x62\x6d\xdd\xdc\xb1\x2f\x05\xda\x3b\x3c\x8c\xe2\x41\x10\xfa\x93\x52\xd0\x1b\x3b\xe8\xf0\xbe\xa6\x87\xc2\x0e\x07\x96\x66\xc4\xe8\xfb\xe8\xea\xc7\x03\xba\xac\x56\x19\xa5\x2b\x34\xd7\xc5\x79\x4e\x58\x6f\x1e\xd8\x96\xdd\x98\x87\x47\x61\x74\x12\x5a\xd2\x72\x2a\xf7\x77\x06\xc2\x94\x8e\xd5\x35\xd8\xab\x16\x68\x97\x82\x7d\x97\x8e\x53\x99\x05\x47\xad\x0c\x1d\xcf\x3f\x31\x69\xa7\xbb\x39\x88\x67\xda\xaa\x93\x60\xa0\xa2\xf7\xc6\xd1\x3c\x94\x91\x84\x44\xe2\xcc\x1f\x0c\x82\x70\x74\x2f\x0c\x71\x2a\x73\x33\xe9\xef\xcc\x53\x33\xdd\x9f\x04\x23\x8a\xb5\xdb\xd8\x62\xd2\x8b\xe0\x55\xc3\x0c\x43\xde\x5a\xfc\xa0\xf4\x48\x82\x1f\x2d\xfd\xe8\x04\x85\xc0\x5a\x6c\xd9\x99\x18\xc3\x54\xe8\xe1\x5e\x0b\x74\x58\x23\xbb\xde\x01\xdc\xe4\x8f\x6a\xe3\x0b\xb8\xd2\x2c\x32\x89\x42\x75\x30\xf3\x44\x33\x05\x07\xea\x02\x36\x8f\xe7\xcb\xf7\xae\x2c\xcc\x56\x67\x10\xa5\xbd\x8e\xca\x5b\xcf\x81\x10\xea\x26\x91\x6a\x26\x6d\xd6\xa5\x9b\x2a\x3f\x31\x47\x55\x5c\xfd\x48\x06\x5b\x9f\x68\x07\x23\x18\xe2\xb5\x4c\xbd\xf8\x4b\x66\xa8\x83\x65\xaa\xb4\x6d\x58\x67\x84\xe7\xfe\x83\xa2\x67\x51\xf7\x66\x65\xbc\x6c\x99\x02\x9c\x18\xbd\x10\x29\x4c\x63\x8a\xbd\xed\x18\x00\xb5\xcf\x32\xd9\xde\xd7\xa3\xa7\xb2\x9d\xa6\x73\x47\x87\x3e\xca\xbb\x15\x82\xa3\x83\x71\x2d\x8e\x8d\xd0\x6e\x4c\xfd\x99\xa5\x5d\x32\xaa\x05\x4d\x62\x14\x12\x8d\x0b\xf6\xb3\xf7\x81\xe8\xe3\xc3\x12\x5d\x7f\x5b\x44\x1a\xe7\x09\x96\xda\xa5\x53\x4b\x08\x7d\xb4\x69\xb1\xba\xac\xc3\xec\x72\x33\xbb\x27\x72\x1b\x2c\xce\xb1\x87\xb6\xa3\x98\x9a\xd6\x21\x38\x79\x9f\x39\x2c\xca\x5a\xc4\x18\xbd\x50\x25\x72\x60\xd7\x0e\x29\xbb\x43\xed\xb0\xeb\x1d\x1c\x64\x6a\xc4\x4c\xdc\xf8\x59\x5c\xed\xbb\x62\xb0\x97\xd5\x5d\x5a\x0f\x2f\xc8\x2e\xb1\x96\xb5\x66\x2b\xd1\x59\x46\xd6\x91\xa9\x42\xe6\xc9\x16\xe6\xc3\xa3\xac\x9c\xf4\xac\xd0\x1b\x75\x5e\x7b\x0a\x69\xc9\x0b\x5d\xbf\x7e\x98\x25\x20\xfd\x92\xad\x83\x8f\x9f\x8b\xd6\x92\x11\xa1\x19\xc9\x59\xa6\xbb\x1d\xda\x59\x36\xd2\xe1\x94\xa0\x26\xea\x78\x1e\xfc\xae\x14\x21\xd1\xca\xcb\x20\x74\x69\x0a\x61\xc1\x2c\x42\x62\x62\xba\x10\x26\xa2\xd0\xea\x28\x48\x31\xac\xd7\xdd\x8f\x66\xa7\xe7\x8c\x03\xcb\x96\x93\x12\x97\x3e\x42\x9c\xd8\xda\x97\x98\x09\x34\x74\x23\xd2\x52\x51\x1a\x33\x31\xae\x52\xf5\xde\x31\xfa\x38\x9f\x07\x09\x66\x90\x5d\xcb\x83\x2d\x62\x94\xd0\x46\xb9\x32\xb5\x88\xf1\xaf\x1b\xf4\x50\xf7\x0b\x92\x31\xf3\xc0\xd7\xcd\xdc\x48\x08\x45\x95\xc2\xd1\x95\xe7\xa0\xfd\xac\x26\x91\x65\xbd\xa2\x8f\xbc\xe4\xaa\xbd\x20\x71\xa6\xf9\x2c\x3b\xdf\x56\x84\x52\xd0\x4e\xcb\xb0\x3a\x4b\x30\xac\x57\xcd\x6e\xf0\xb8\x61\x31\xbb\x02\x58\x7a\xaf\xdd\xd5\xac\x00\x56\x57\xbe\x0f\x67\x7e\x10\x27\xe5\xfa\xf1\x36\xd3\x8f\x9b\xeb\x30\x0f\xe7\x09\x19\xc8\x2a\x84\x6e\xcb\x97\x0a\xa2\x2a\x96\x4b\x42\xe2\xb9\x78\x63\xa8\x7a\x65\x5e\x46\x94\xb8\xfc\xea\xcc\xc4\xa3\x63\x6b\x30\xef\x6b\x0c\x14\xba\xe2\x20\x6e\xe2\x66\x14\xc3\xd0\x93\x9f\xbc\xcc\x27\xa9\x94\x84\xe4\x84\x87\x3a\x09\x5d\x58\x87\xd0\x93\xea\x76\x20\x35\xd8\x40\x5e\x9d\x11\x18\xe5\xd5\x06\x30\x43\x0a\x78\x1c\x75\x1b\xc4\xfb\x4a\x54\x15\x0b\x01\xfa\x4a\x35\x1d\xa6\x0c\x47\x31\x58\x01\x6d\x1b\x86\x65\xd9\x87\xc0\x85\x9b\x10\xba\xfb\x50\xab\x05\xd2\xd2\xcd\x63\xb7\x50\x5c\x14\x15\xba\x01\x9d\x9d\x03\x8f\x97\xf3\x68\x39\x0f\xcb\x79\x0e\xfd\x57\x9d\xa8\x65\x05\x58\xec\x16\x86\x32\x07\x26\xe9\xdd\x0d\xbc\x03\xe3\x62\x0a\xc5\xd6\xd2\x9b\xc9\xce\xc7\x20\xde\x5e\x7a\x35\xd9\xf3\xb1\xef\x55\xb3\x58\x6e\x97\xa8\x07\x37\x71\x43\x1a\xaf\xe5\xe8\xc1\x2d\x7c\xe1\xcf\x6c\xab\xda\x85\x36\xbc\xed\xbf\x5d\xd2\xf6\xa5\x37\x55\xbd\xf4\xa1\xbb\x7c\xd5\xbc\xb1\xbd\x75\xe9\x65\x73\x2f\x48\x48\x3f\x2d\x07\x8d\x91\x9c\x2f\x01\xba\x75\x78\xd8\x8f\x30\x46\x69\x39\xf0\xdd\xcb\xe2\xbd\x71\x78\x48\x16\x29\x59\x02\x7a\x63\x7b\xf3\x72\xa0\x37\x0f\x0f\x45\x1c\xef\x25\x78\x6f\x5f\x0e\xf8\xd6\xe1\x21\x4e\xf2\x4b\xd0\xbe\x24\xe4\xed\xc3\x43\xf4\x68\x5d\x02\xf9\x92\xa6\x95\x9d\xc3\xc3\x74\x1c\x93\x64\x1c\x4d\x06\x87\x49\x3a\x8f\x47\x64\x59\x2d\xbb\xcc\xc8\xc2\xfe\x5e\xc0\x40\x57\x73\x86\xb8\x94\x7a\xc5\xbe\x2c\xb0\xd4\xe4\x6c\x32\x2b\x71\xdc\x12\x40\x92\x50\x4b\x61\x15\x53\xb4\x00\xac\x69\x50\x19\x07\x49\x1a\x8d\x62\x7f\x6a\x0d\xfc\xd4\xd7\xcd\x2a\x81\xb2\x7c\xa0\x85\xc5\x4f\xb3\x37\x38\x01\x2c\x8c\xfb\x48\x72\xd3\xa6\xd8\x87\x63\x33\x16\x9f\x74\xe8\x9c\xb3\x5f\x3e\xd9\xe0\x33\x22\xd3\x0d\xe8\x5c\xe5\x60\xcd\x72\xa2\x91\xe8\x2d\x1e\x2b\xb3\x0f\x5f\x97\x6b\x78\xd1\x39\x6f\xf1\xd8\x30\xf1\x2c\x3c\x96\xe6\x69\x69\x29\x05\x22\xc9\xc6\xe1\x38\xb0\x70\x1d\x58\xc8\x48\x16\xcd\x26\xdc\x89\xc2\x63\x12\xcb\x80\x1a\xd1\x50\x15\x4a\x20\x08\xf1\xb0\x77\x30\x8c\xe2\xa9\x96\xde\x90\x36\x93\xeb\x66\x74\xb5\xf4\xb1\x76\x7f\x39\x62\x70\xae\xf9\x43\x0d\xc4\x6e\xa5\x8f\x1d\x4a\x5f\xf1\x24\x13\xda\x3f\x18\xc2\x0e\xa4\x8f\xe5\x15\xe2\xab\x01\x56\xb2\xa3\xd0\xe6\xa8\x8e\x0b\x2f\x5c\x68\x52\xf0\xb0\x0e\xe9\x63\x47\x37\x46\x2d\x3c\xe3\x0b\x45\x81\x87\x10\x9b\xcc\x93\xe0\x98\xe8\x1d\x87\x71\x3a\xa6\xd1\x31\x01\x3f\x3c\xd5\x69\x18\xcd\x53\x79\xdc\x9c\x75\x6a\x43\xf6\xf4\x94\xf6\xd1\x63\x79\x33\x18\x4d\xe6\xfb\xc0\x29\xed\x61\xb8\xd9\x81\x85\x6b\xd3\x2c\xc9\x38\x18\xa6\x96\xed\x40\xbd\x3e\xcd\x66\x9c\x42\x1d\xbc\x03\xb8\x45\x3b\x96\xe6\x9d\x45\x33\x99\x53\x56\xd5\x0b\x42\x93\x85\xa7\xcc\xfb\x4b\x32\x4c\x2f\x08\x15\x57\xdc\x63\xd7\xfd\x07\x8f\x09\x16\x6c\x14\xf1\x7a\x07\xa6\x19\x66\xef\xa1\x50\xa0\x05\x18\xc3\x77\xe5\x7d\x60\xbd\x20\x6c\x2c\x98\x5e\xc7\x0e\xf1\xa6\x8f\xbb\x01\x43\xbb\x0d\x0b\xd7\xc8\xe6\x61\xb6\x9b\x30\xe5\xd9\x30\x8b\xb7\x9f\x21\xf6\xeb\x49\x42\xd7\xa4\x74\x04\xe1\x81\x50\xda\xbc\xde\xa9\x38\xa2\x1a\x8c\xc2\x28\xa6\xab\x28\xda\x19\x65\x3d\x70\xde\xd8\x5d\x48\xed\xb2\x1b\xc8\x96\x50\xae\x5f\xb8\xd8\x33\x70\xe3\x06\x2c\xf0\xc9\xb8\x9e\x1f\xdb\xbf\x8a\x51\x5c\xa8\x12\x85\xfc\x49\x19\x6e\xe1\x80\xeb\xc0\xd4\x3e\x60\xdb\xff\x5c\x72\x64\xaf\xd2\x5f\x33\xd6\xd0\x41\x98\x48\x23\x9e\x94\x80\x0d\x21\xfb\x2f\xb4\xea\x17\x85\xd2\xd3\x19\x89\x86\x70\x88\xbe\x9e\x15\x01\xa2\x02\xb7\xe1\x10\xda\xe7\x0f\x44\x43\xb3\x29\x6c\xeb\xa1\xed\x28\x5c\xa5\x35\x52\x2d\x3c\x55\x3b\x9e\xc7\x20\xf9\x32\x5a\xd2\x65\x46\x42\xb4\x11\x66\x1b\x35\x50\xd7\x42\x64\x5a\xa5\x49\x8b\x0b\xb6\x4c\x9f\x40\x97\x37\xce\x14\xd4\x87\x36\xdc\xbe\x92\x9e\x5b\x41\x09\xef\x56\x7a\x58\x10\xcd\xb0\xb4\x58\xa3\xef\x4f\x26\xd6\x21\xda\x89\x5e\x04\xf7\x48\xa2\xe4\x4c\x17\x32\x5b\xc9\x22\x66\xe9\xad\xa8\x57\xb3\x88\xc9\x2b\x74\x4b\x76\x1f\x15\x12\x0b\x63\xb1\x56\x66\xbb\x59\xf0\x16\x17\x36\x6e\xe9\x55\x7b\xaf\x50\xe3\x16\x25\xf8\x2f\xbd\x9a\xea\x9f\xd1\x0a\x53\x5e\x42\x58\xbe\x9e\xf2\x2e\xbd\xc6\x64\x6a\x5e\x29\x64\xcf\xbd\xe4\x32\x70\xe3\xf0\xf0\x83\xb9\x1f\xa6\xc1\xa4\x7c\xb1\xd6\xf2\xb6\xc4\x62\xe7\x85\x19\xcd\x1c\x19\xc3\xc2\x56\x07\x98\x92\xf3\x6c\x52\x52\x52\x31\xf1\x32\xf5\x67\x4a\x4e\x09\xb8\x2b\x91\xb5\x48\x40\xb1\xeb\x9f\x57\xed\xf2\x22\x08\xfb\x19\x17\x17\x33\xca\x0d\x3b\x35\xd8\x82\x75\xb0\xce\x95\xa6\x46\x37\x15\x4a\x53\xd1\x5c\xb7\xb1\xb3\x65\x43\xfd\x7c\x01\x7d\x11\x90\xad\x2d\xdc\xa3\x95\xae\xb0\x7c\x23\x92\xaf\xbd\xa0\x4e\xf5\xed\x0d\x5b\x3a\xe8\x64\x25\xc0\xd2\x3b\xbe\x5e\xba\x04\x18\x90\xe3\x00\x7d\x59\x96\x48\x81\xd6\x8b\x35\x11\x67\xb9\xfd\x3c\x26\xd9\x68\x6c\xc1\xfa\x2a\x5b\xd2\x7a\xe3\x96\xf4\xe9\xf3\x74\xe6\xd2\x5b\xb0\x5e\x2d\x63\xa9\x20\x36\xfe\x46\x5a\x30\xeb\x50\xae\x10\x32\xf6\x83\xc0\xb8\x7b\xda\xb8\xdf\x54\xc4\xa2\x96\x47\xa8\xa2\xa1\x32\xa1\x7f\xa8\x2f\xed\x6a\x35\x5c\x95\xd8\xf0\x21\xbb\x17\x99\x07\xf6\x1d\x06\x71\x92\xf2\xbb\x1c\xf1\x6a\x23\x71\xf3\x9f\x5c\x9f\x48\xcd\x5d\xae\x5e\x6c\xb8\xce\xaa\xd0\xae\x19\xe5\x9f\xf5\xa5\x0b\x3b\x23\x2d\xb5\x6f\xf6\x57\x88\x0d\xbf\x49\x97\x05\x09\x26\x54\xb1\x35\xae\x30\x97\x7f\xab\xa3\xa3\xc7\xe0\x5e\x8a\x8f\xba\x86\x5a\x3d\x9d\x99\xc6\x7a\xed\xdc\xd9\xd5\xd2\x32\x1a\x5a\xb2\x11\x68\xc1\xe1\xe3\xe0\x15\xa2\xef\x45\x50\xbc\x4a\x9a\x8b\xc3\x04\x7e\x89\xfe\xb6\xb3\xf4\x28\xf3\x4b\x97\xde\x2b\x29\x42\x2f\x54\x74\xaf\x2e\x4d\xa6\xd0\x81\x70\x05\xd1\x92\xe0\xa1\x00\xf7\xc2\xe2\x45\x63\xf7\xeb\x41\xf2\xb6\xff\xb6\xe4\xa8\x55\xa6\x8a\x65\xba\x8f\x62\x45\xdb\xb6\x11\xbf\x5a\x86\xb7\x70\xa8\x4a\xa3\xd6\x4a\x23\xf8\x45\xa3\x5b\x3a\x82\x2e\xd6\x04\x0c\x1e\x69\x6b\xa7\xb0\xa0\x09\x25\x0b\xcf\x9d\x97\xe0\xfa\x7a\x91\xb5\xcd\x0b\x5b\x81\x78\x2f\x6e\x05\xd2\xba\xd0\x0a\xe4\x95\x18\xd7\x4b\x86\x32\xa3\x52\xa2\xce\x07\xbd\xa4\xf1\xec\x5d\x64\x3c\xab\x89\x83\xa3\xcb\xec\x94\x7a\xf4\xe8\x0b\x4d\xcd\x2f\x1a\xef\x65\x03\xfb\x32\x6d\xe1\x43\x7b\x15\x1b\xd6\x39\x4b\x24\x51\xe7\x39\x4b\x45\xf7\xdc\xa5\x22\x5d\x65\x6d\x95\xa8\xdc\x3b\x2f\xd0\xbd\xe6\xca\xfd\x13\xe8\x8a\x3c\x31\xc7\x10\x4b\xcb\xce\x8d\xc5\x83\xe9\x91\xee\x8c\x3d\x25\xf1\x88\x0c\xa4\x6b\x36\x05\xa3\x9f\xb9\x93\x0c\xf8\x88\x8a\x76\x56\x4b\x37\x38\xd0\xb6\x65\x18\x00\x63\xfb\xe4\x91\xad\x83\xa8\xd7\x43\xe3\x30\xbe\xcf\xef\xb8\xe5\xc0\x42\xbe\x7d\x30\x15\x49\x45\x5b\x3e\xf5\xfa\xd4\x80\x21\xaa\xed\xd6\xeb\x8f\x0e\x44\xc1\xee\xf4\xa0\xd8\x31\x85\xe5\x2d\xe9\xf8\x5f\x25\xc7\x14\x7e\x37\x78\x38\x20\x0b\xa2\x5f\x75\x00\x1d\x91\x28\x97\x98\x33\x12\x4f\xf1\xaa\x77\xbd\x63\x02\x1c\xad\x9c\xa6\x41\xbd\x6e\xcb\x6c\xf2\xba\x26\xff\xb4\xcb\x41\x75\x83\x83\x03\xcd\xba\x22\x72\x96\x90\xf1\x15\xf3\x71\x59\x6d\x96\x7e\xa1\x73\x1d\x5b\x39\x11\x75\x15\xce\x75\x2b\x37\xdb\xd9\x42\x07\x92\x87\x2b\xf5\x21\xeb\x16\x8e\xd8\x85\xdc\xa2\x5f\x3c\x52\x0b\xc7\x47\x7a\xa4\x2e\xb6\x3e\x92\x53\xa1\x4c\x58\x99\x68\x65\x0e\x04\xc5\xd3\x92\x56\xa9\xb5\x08\xf4\xc5\xac\x03\x8b\x47\x36\xdc\x04\x17\x9e\x3c\x01\x99\xe5\x11\x4b\xbe\xde\x31\x46\x34\xb6\x66\x11\x38\xd8\xda\xa0\x40\x61\xcc\x96\xe7\xe1\x55\x38\x7f\x3e\x2a\x61\xcc\x17\xb8\x6f\xf1\xa2\xc6\xb7\xeb\x40\xe0\x69\xa7\xdc\x69\xa6\xc0\x13\xfd\x89\x41\x45\x94\x9c\x84\x36\x66\xae\x0b\xe7\x40\x57\xcb\xe7\x42\x1b\x6a\x81\x2b\x77\xb2\x53\xc9\x5d\x7a\x6f\x4e\x65\x3f\xca\xb3\x1b\x7e\x38\x88\xa6\x96\x0d\xeb\x30\xad\xd7\xe1\x09\xf0\x5d\xe8\x54\x89\x5a\xa8\x41\xe0\x72\x79\x6b\x24\x29\x31\x92\xcf\x12\xc8\x2c\x69\xf6\x40\x36\x9f\x79\x0a\xbb\xf0\x05\xee\xce\xbc\xd2\x8a\xee\x15\xac\x59\x85\x92\x58\xd3\xec\x4b\xc6\x3a\x0d\x9a\x4d\x78\x3b\x4a\x49\x1b\x1e\x93\x38\xc2\xcb\xa7\x90\x79\xa8\xbc\xa0\xa4\x3b\xf6\x27\x24\x4c\x1b\x97\x52\x54\xcd\xca\xcb\x8d\x2f\xf9\x85\x63\x76\x06\x4f\xe6\x65\xab\xc3\x57\x6b\xe7\x2b\x8d\xfd\x30\x99\x45\xc9\x12\xaf\xbc\x1d\xf7\x45\x4d\x3c\x86\x9d\x7b\x95\xe5\xbe\x86\x6d\xa1\xe6\x2d\x77\xd5\xcb\x94\xe6\x57\x6b\xd3\x21\x89\xfb\x87\x21\x49\x96\xf8\x88\xee\x70\x07\xd4\x0c\xe5\x63\xc2\xa9\x49\x4b\xb3\x26\x5d\x66\xf5\x4e\xeb\x4f\xc8\x92\xea\x77\xdd\xe5\xd5\x27\xe4\xb2\xb5\xb7\x58\xed\x53\x7f\xb6\x64\x7d\x9f\x71\x07\x95\xd5\x5a\xbd\x00\xa7\xfd\xcc\x69\x5d\x59\xb4\x31\xb0\x0a\xfb\xb2\xe2\x57\x1c\x63\xbb\x5d\xde\x03\xb4\x12\x9e\xb8\xd7\xcd\x8e\xe5\x5d\x6e\x53\x95\x42\x3a\x22\xa7\xe5\x1e\xa4\xbb\xc2\x14\x53\x46\x70\x5a\xfa\x92\x14\xdf\x64\xf5\x33\x19\xb6\x04\x83\xd6\x72\x0c\xf8\x1e\xec\xe5\x70\xd8\x62\x38\x90\x30\x8d\x83\xa5\x48\x6c\x2c\x47\x82\x03\xc0\x8b\x72\xa5\xb7\xad\x31\xd0\x5f\xe0\x86\xd4\x25\x06\xfa\xf9\x6c\xfe\x82\xdd\x85\x91\x6f\x3a\xd0\x55\x87\xa6\xa3\x38\xfd\x52\x51\x22\x8b\x64\xaa\x8e\x4f\x4f\x26\x73\x79\xba\x9a\x4a\x1b\xd3\x2d\xd7\x9f\x61\xc4\x2d\xa6\x06\x0e\xc8\x8c\x2e\xe4\xfa\x78\x31\xd9\xbb\x18\xaf\xc6\xa1\x22\x82\x3d\xea\xba\x37\xe6\xa4\xeb\x63\x8a\x97\x58\x59\x18\x33\xb1\x42\x45\xec\x74\xd8\x5c\x89\x44\xab\x8a\xfa\x2c\xcd\x39\xe2\xf0\x16\x62\x2c\xb7\x47\x6e\xf3\x04\x86\x23\x1e\x66\x63\x7a\x1b\x98\x6e\xba\xa6\x52\x03\xca\x44\x91\xf3\x25\x3e\x22\xa7\xc0\x10\xef\x62\x33\x6a\xb5\x03\xe3\xe3\x57\x75\x85\x28\xa3\x1f\x09\x17\x86\xcf\x9f\x7e\x09\xa1\xac\x32\xe7\x49\xd1\x93\x3f\x69\x9f\x05\xab\x1f\x27\xe7\x01\x89\xf4\xce\xb0\x84\xa7\xf0\xb9\x2a\x50\x22\x75\x3f\xc4\xb4\x31\x22\xa9\x25\x9a\xc6\x1a\x2f\x55\x25\xae\x27\x1f\xd8\x50\x83\x4a\xc5\xb0\xbd\x71\xed\xb1\xc8\xf4\xa6\x2b\x64\x19\xb2\x34\x12\xad\x32\x07\xef\xe3\x9d\x93\x12\x3f\x49\xbd\x18\xf1\xfb\xe3\xbc\x5a\x7b\x44\x4e\x15\x4a\x92\x17\xad\x98\x73\xe7\x11\x39\x75\x38\x13\x8b\x12\xe7\x70\xb1\xf0\xf0\x16\xb4\xcc\x84\x67\xe2\xa8\xc9\x01\xc2\x25\x95\x35\xf5\x67\x1c\xb4\x3e\x0e\x6a\x35\x3e\x12\xcc\x81\x20\x77\xdf\x66\xea\x0c\x3a\x1f\x63\x7c\xdc\x42\x47\x8e\x60\xc6\x85\xe8\x7e\xab\x1f\x7f\x37\x46\xc1\x8d\x1b\x50\x3c\xe4\x84\x69\x6b\xea\xcf\x1a\x02\x55\xde\x42\xec\x21\xf1\xbd\x7b\xe0\xb0\x3c\x26\x91\x1d\x38\xe2\xd7\x67\xfb\xa7\xac\x9f\x3f\x3c\x22\xa7\x6d\x38\x12\xba\x72\x5b\x12\xe0\x58\x34\xff\xcc\xce\x9d\x6c\x17\x8d\xba\x9e\x59\x2f\xe2\x50\xcf\x9e\x72\xca\x14\xb2\xfc\x06\x76\x62\x8f\xfe\x20\x68\x7d\x8c\x9f\x19\x11\x9f\x12\x11\x16\x06\x20\xc2\x91\xd7\x06\x73\x29\xab\x81\x37\x24\x9b\x2b\xf8\x81\x0d\x58\xe4\x07\xf6\x48\x6b\x64\xc3\x6e\xea\xcf\x2e\x0c\xee\x2d\xca\x15\x09\x49\xdf\xf2\x67\x0a\x10\xa7\xd8\x12\x60\x82\xa6\xe7\x03\xc5\x28\xe3\x02\x30\x76\x8d\x04\x3a\xa0\x00\x91\x19\x98\x3f\xb2\xbd\xaf\x13\x4a\x16\x12\x6c\xa6\x95\xc4\x4b\x86\x69\x69\xc9\x82\x1a\x4f\x31\x3f\xf0\x0e\xbb\x89\xb8\x1c\xe4\x57\x39\x7b\x14\x03\x95\xa1\xbd\x97\x40\x61\x2c\xae\x41\x18\x22\x85\x18\xe3\x77\x60\x98\x2d\xa5\x39\x53\xaa\xeb\xfa\xb4\x4e\x35\x57\x23\x1f\x9e\x99\x87\x62\x65\x87\x5b\x11\x67\x01\xe4\x3a\xcd\x29\x80\xa5\x53\x52\x1c\xa8\x2d\xf7\xb3\x5c\x65\x6f\xf9\xb3\x8b\xaf\x7b\x96\xcc\x01\x39\x34\x69\x05\x28\x6d\xb2\x08\xd2\xf1\xcb\x65\xab\x48\x2f\x3a\xb7\xbb\xfb\x6a\x6d\xed\xaf\xa2\x3a\xc9\xe6\x3f\x20\xd8\x8d\x3c\x3a\xfd\x2c\x8e\xd2\xe8\x3c\x1b\x62\x19\x69\x1b\x58\x3a\x3d\x9d\x91\xfd\xb5\xb5\x07\x24\x55\xef\x54\xf6\x66\xde\x3f\xc4\x30\xa5\x61\x92\xc6\xf3\x7e\x1a\xc5\x6d\x8a\x08\xe5\xd2\xb1\x9f\xb4\x19\x1a\x8d\xb1\x8f\xd3\xb3\x3f\x18\x68\x2c\x6b\xf8\x94\xb0\x19\xb5\xd6\x81\x4a\x85\x1b\xaf\xc6\x41\xd2\x5d\x05\x79\xe6\x92\x3d\x8b\xc9\x30\x58\x50\xdc\xa1\xc6\x80\x1d\x98\xbe\x1f\xb1\xb8\x7a\x36\x60\xa7\x0a\x1c\x64\xc2\x69\x74\x4c\x04\x92\xec\x8d\xa6\xf7\x27\xc4\x8f\x45\x32\xbe\x38\xd2\x01\x53\x24\xd3\x51\x8f\x31\xa9\x82\xc7\x12\x02\x7d\xa6\x69\x64\x3a\x4b\x4f\x45\x22\xbe\x60\xaa\xdf\x1f\xcb\x44\xbf\x3f\xc6\xc0\x51\x3a\xf3\xca\xd1\xa5\x19\xa2\xe8\x22\x93\xed\x09\x3c\x20\xa9\x88\xab\x7c\x27\x9a\x9d\xea\x24\x6f\x70\x8b\x13\x2b\x0f\x01\x3a\x99\xf7\x49\x34\xa4\x85\x6c\x3e\x38\x8b\x74\x04\x14\x39\x24\x6d\xf8\x83\x81\x50\x52\xc4\xe4\xde\x6c\xc2\x3b\xe9\x98\xc4\x27\x41\x42\x1c\xf0\x93\x64\x3e\x25\x10\xa4\xff\xfb\x9b\x7f\x94\x80\xcf\x0d\x80\x0d\x61\x5c\x52\x95\x1b\x87\xd3\x98\x5a\x89\xea\x24\xc7\x41\xdf\x2c\xa2\x85\x34\xeb\x58\x56\x2f\x13\x78\x71\xd1\x22\x4f\x8b\x60\x85\x65\x99\x87\x2a\x3b\x1a\xad\x38\x52\xb9\x80\x92\x09\x49\x79\x3c\xd0\xab\x5a\x77\x24\x24\x2d\xb0\xb9\xec\xbe\x40\x77\x88\xab\x5e\x30\x4d\xfd\x59\xc1\x9a\x69\x7f\x4d\x1e\x53\xc7\x54\x08\x50\x37\xb3\xb5\xd9\x13\x75\x0f\x45\x5b\xfa\xa1\xd8\x02\xb5\xfb\x2b\xb4\x6d\x6b\x50\x43\xae\x0b\x96\xd0\x43\x57\xf8\xa7\xfe\x0c\xe7\x42\x9d\x2c\xcb\xce\xdb\xef\xfe\x0a\x6d\x6b\x1a\x84\x11\xb6\x88\xa5\x94\xe1\x99\x0c\x1d\x59\x4e\xc3\x6d\x10\xc4\x3a\xd3\xa9\xc5\xcb\x94\x90\xeb\x25\x6c\x5f\x5e\x38\xbe\x9e\x38\x6f\xfc\x62\x8e\x61\x6c\x5f\xf2\x30\xbe\x77\x78\x38\x09\x42\xe2\x2f\x73\x53\xba\xe4\x01\x8f\xf3\xcf\x60\x6c\xec\xba\xdc\x49\x49\x5d\x8d\xc1\xa9\xa4\x99\x67\xe4\x99\x36\x16\xd9\xce\xb4\xb1\xb0\x60\x34\xd9\xdb\x8b\x6a\x8b\x4c\x78\xaf\x80\x1d\xfd\xed\x88\x90\x2e\xf9\xb8\x5f\xcf\x11\xa0\x6b\x85\x43\xe2\xe7\x9c\xbc\x38\x7c\x8e\x43\x17\x0e\xf0\x90\x3b\xe2\xdc\x5d\x59\x14\xb0\x73\xa2\xe1\x28\xca\x9b\xe1\x88\xf2\x61\x71\x56\x71\x51\x12\x4c\x25\xf4\x2f\xf6\x1e\x24\x63\xa6\x99\x33\x94\x0b\x35\xec\x97\x70\x32\xed\xc2\x63\x77\xe2\xf7\x8a\x64\x25\x87\xf3\x65\xbf\x97\x31\xf9\x5e\x38\x74\xe6\xb8\x3f\x59\x52\xc1\x17\xfb\x93\x4b\xda\x94\xf1\x7c\xc3\x30\x08\x97\x39\x0a\x5e\x5e\x72\xf4\xa3\x49\x54\x3e\xba\x5b\xde\xee\xa5\x05\xc7\xd4\x4f\xc7\x4b\x36\xdd\x5a\x5c\x6c\x50\x38\x5f\xa2\x23\xcf\xdb\x65\xeb\xde\xaf\xb3\x48\x94\x7b\x5b\xee\xe6\x8e\xeb\x50\x25\xf5\x8d\xed\x2d\xc0\xfb\xdb\xfd\x78\x00\x31\x19\x92\x98\x84\x29\xe6\xfd\x06\x16\x64\xe5\xfe\x25\x3e\x37\xdc\xdd\xdd\xdd\x0d\xee\x9a\x91\xba\xd0\x81\x4d\x68\x42\x6b\x8f\x27\x78\xd0\x81\x6d\x3d\xa1\x05\x1d\xd8\x80\x75\xfa\x85\xfe\xc3\x53\x37\xa0\x23\x52\xf0\x1f\x5d\x8b\x9f\xf8\x3d\x1e\x86\xc0\x8a\x94\x2b\x49\xa4\xab\xe4\x5f\xf6\x7b\xb6\x16\x87\x9b\xbe\x5b\x51\x63\xe2\x40\xd4\xf0\xe9\x3f\x3d\xfa\x4f\x34\xf3\xfb\x41\xca\xd4\xaa\x1c\x84\x2f\xf6\x27\xba\x9a\x3d\xa6\xea\x75\x63\x0c\xeb\xab\x90\x5c\x49\x98\x51\x2b\xf6\x07\xcc\x55\x44\x93\x12\x06\x46\xec\xf4\x4d\x94\x58\x63\x1b\xd6\x21\x6a\xf4\x79\x52\x12\x84\x5a\x92\x89\xed\x99\x74\x9f\x31\x70\x5e\x85\xcf\x84\x2c\x79\x77\xd4\x43\x29\x62\x43\xb4\xa2\xc3\xa4\x04\x30\x66\x41\x27\x47\xa2\x17\x98\x34\x8a\xe4\x15\x08\x3d\xe8\xd0\xaf\xad\xc5\xe9\x63\x2b\x6a\xc4\xd2\x88\xec\x1b\xe9\x23\x99\x3e\x31\xd2\x7b\x32\x7d\x01\x1d\x58\x9c\x3e\x6e\x4d\xfc\x9e\x65\xb9\x8d\x4d\xaf\xb5\xb9\xb5\xbd\x09\xeb\xd0\xc3\xcb\x5c\x37\xb6\x76\xb6\x76\xb6\x29\x7b\xf8\xec\x72\xd7\x5d\x77\x73\x63\x67\x0b\xd6\x61\x62\x43\x13\xbe\x1e\x4a\x40\xa7\x26\xa0\x96\xd7\xda\xde\x69\xed\x49\x40\x3b\xde\x96\xb7\xd5\x6a\x49\x40\xee\x4e\xcb\xdb\xd9\x72\x05\xa0\x6f\x28\x40\x8f\x4d\x40\xae\xb7\xb7\xb1\xb1\xa1\x00\x79\xde\x9e\xb7\xd7\x72\x25\xa0\xbd\x2d\x77\xc3\xdd\xf4\x04\xa0\x7f\x19\xea\xca\x97\x60\x02\xcf\xdb\x86\x75\x38\x85\x3a\x78\xdb\x0e\x6c\xb9\xb4\x38\x46\xa0\x3e\xb5\x1d\x68\xb1\x57\xfa\xf5\xb1\x6d\x72\xc1\x99\x39\x22\xac\x89\x03\x2c\x2c\xb6\xc8\xa2\x9b\x80\x72\x33\x6e\xa7\xd3\xc1\xbb\x78\xb4\xb1\x34\xa1\xb3\x9f\xc0\x2a\x0b\x4d\xf3\xa0\xf1\xa0\x0d\xc5\x68\x14\x15\x64\x68\xa4\xe3\x20\x69\xd0\x7e\xae\x4d\xf6\xc5\xab\x2f\x43\xe8\xe3\x6b\x8f\x07\xd0\xe7\xaf\xb2\x5e\xa8\xf1\x47\xac\x6b\xb5\xc3\x68\x4c\x58\x17\x9a\xb3\xbe\xec\xf7\x1c\xda\x6a\x67\xc5\x73\x6d\x02\x14\x1b\x35\x18\xa4\x66\x70\xde\x61\x76\x7d\xb0\x30\x14\xee\xd0\x57\x0c\x65\x83\xe4\xe8\xc5\xc1\x68\x9c\x92\x58\x33\xd4\x1c\x65\x34\x09\xd1\x11\x9c\x72\x35\x2a\xa2\xd7\xc1\x3a\xca\x74\xc4\x91\xed\x70\x6a\xf2\xdf\x9e\x63\xd0\xcf\x96\x76\x98\x81\x1f\x1f\x5d\xa4\xc6\xfa\x73\xd7\x18\x8f\x7a\xed\xbc\xa6\x44\x25\x04\xed\x56\xd5\x32\x6f\x9b\x8e\x0e\xcf\xdb\xd6\x42\xd4\x50\x5d\x1f\x5d\xba\x59\x55\x36\xdc\x86\x53\x68\xc3\x29\xd4\x04\xf3\x34\xe9\x58\x51\x25\x1e\x9b\x25\x7a\xaa\x44\x5d\xf0\x57\x93\x0e\x27\x26\x88\x29\x02\xdf\xa0\xcd\x9b\xf8\x4c\xee\x9c\x72\xc3\x07\xad\xf8\xeb\xfa\x87\x05\xff\x40\xe1\xff\x4b\xfd\xc3\x63\x3b\x27\xd3\x2f\x21\x7f\x2d\x21\xeb\x4e\x1f\xb7\xe2\x51\xcf\x82\x8d\x46\x6b\xd3\xdd\xdc\xda\xa4\xe2\x88\x4a\x01\xaf\xb1\xb5\xb1\xe3\x6d\x50\x8d\x0e\xdb\xe2\x36\x36\xf7\x76\xb7\x36\x3c\x2a\x07\xa9\x48\xe0\xb3\x73\xfd\x16\x24\xef\x7e\xe1\xf3\x19\x68\x75\xb7\xb1\xb7\xbd\xd7\xda\xde\x76\x11\x5a\x0d\xbc\xc6\xee\xce\xb6\xeb\xb9\xbb\x08\x0d\x85\xdd\xa6\xb7\xb5\x85\xdf\x1f\x2b\xc1\x2b\x90\x71\x1b\xee\xd6\xd6\xf6\xe6\xc6\x26\x47\xc6\x6d\xb4\xdc\x4d\xb7\xb5\xb5\xc7\x8b\x7b\x0d\x77\x6b\xa7\xd5\xda\x6a\x19\xc5\x75\x6e\xc0\x24\x3e\x67\x9d\xd9\x86\x69\x5c\x08\xd2\xd4\x90\x54\x29\xdc\xa2\xb3\xff\x6d\x75\x50\x34\x75\x80\x9d\x0d\x85\x36\xa4\xd0\xa4\x1a\x43\x0d\x52\x37\x27\x01\xb1\x57\x0a\x80\x51\x31\x97\x52\x25\x02\xff\x6f\xd3\xf2\xeb\x60\xa5\x94\x2f\xdc\x8c\x00\x13\x0d\x37\xcf\xc7\xb6\xb6\xb6\x98\x4c\xbe\x49\xd5\x22\xd7\xdd\xf0\x36\xdc\x5d\x3a\x1a\x5a\x8d\x3d\xd6\x4d\x6d\xa4\xc4\x96\x7e\xbc\x75\xc1\xb0\x6e\x35\x36\x6d\x24\x9c\xbb\xb5\x95\xa9\x4c\x4c\x79\x66\x65\xd6\x02\x9a\x1d\x5a\xa5\xcd\xab\xa3\xdc\x00\xb7\x61\x41\x87\x08\x56\xd8\x56\x95\x58\xec\x5a\x73\x0a\x9b\x7e\xa6\x0f\x0e\x56\x69\xd6\x34\xee\x4f\xce\x53\x98\x50\xdd\xd1\x58\xf9\x8b\xfd\x89\x15\x35\xc6\x8e\xd0\x3e\x26\x45\x0a\xd3\xf5\xbc\xd2\xc5\xd4\x09\x43\x43\x13\x6a\x81\x0c\x83\xed\xa7\x7e\xd8\xb2\xb8\x12\xe6\xdb\xab\xea\x54\x3d\x1e\xeb\x7a\xd0\x1a\x90\x91\xd0\xa9\x32\x28\x8f\xd1\xb1\xf6\x36\x8c\xa1\x06\x1b\xdb\x2e\xb4\x61\x2c\xd4\xa9\x0f\x28\x32\x0d\x1f\x15\x2a\x3a\x3d\x47\x8d\x1e\x3e\xf7\xec\x82\xf6\x65\xa8\x67\x8d\x1d\xe8\x3b\x30\xb9\xe0\xe4\xaa\xd1\x7d\x2c\x26\xd7\x2f\x16\x40\x5b\x69\x72\x2d\x2a\xa8\x4d\xae\x94\xba\xb5\xb1\x9c\x3e\xfb\xf4\xb5\xbf\x5f\x32\xf5\xbe\xa8\xc9\xf5\x8b\xfd\x89\x43\x5b\xfd\xab\x30\xb9\x52\x7a\x32\xca\xf1\xf9\xab\xef\xc0\xaa\x93\xed\xe5\x26\xd7\x25\x35\x9e\x3b\xd9\xae\x38\xb9\xf2\xda\xb4\xf1\x47\x4b\xdb\x0d\x2a\xd4\x0c\x29\x9c\x35\x18\xbc\x84\x68\x2f\x17\x36\x18\xf4\xe7\x3d\x32\x26\x93\x60\xb1\x64\x55\x7f\x47\xe4\xf9\x6c\x6d\x5f\xb6\xb6\x7f\x1d\x3a\x50\x77\x1b\xde\xe6\xee\x36\x5f\x5d\xe3\x5d\x55\x5e\x63\x67\xb7\xb5\xb3\xc3\x52\xee\xb0\x3c\xad\xbd\x56\x8b\xa7\xbc\xc1\x52\xf6\xdc\xed\x4d\xbe\x52\xbf\xcb\x4a\xed\xed\xb4\xf6\x36\x79\x0a\xcd\x74\x17\xd6\xe1\x0d\xfe\xfe\x79\xfe\xfe\x79\x5e\xcf\x9d\xc3\x37\x68\xed\x9f\x87\x75\xb8\x03\x75\x78\x03\xd6\xe1\x75\x63\x77\x5c\xf4\xde\x79\xd3\x93\xec\x66\x63\x92\x92\xa9\x62\xaa\x4a\x56\x9d\xaa\x5e\x91\x95\x72\x8c\x56\x85\x98\xea\x09\x5b\x5b\x42\x7d\x1a\x61\xe2\xc8\x4c\xec\x61\x62\xcf\x4c\xa4\x52\xdd\x62\x44\x66\x4b\xd0\xbb\x94\xc2\x31\xd4\x69\x4f\xac\xc3\x08\x83\x78\xb0\xef\xf8\x8d\xa6\x4b\x2d\xad\x37\xe1\x17\x26\x4d\x44\xca\x11\x05\x47\xbb\xcf\x1a\xd1\x64\xaa\xb7\xdc\xa1\x80\x71\xf1\xfa\x86\x74\xe1\x13\xd3\x38\xce\xa8\x47\xb0\x0e\x47\x50\xa3\xd0\x44\x4e\x04\x31\x11\xb7\x67\x4c\x6c\xa6\xa4\xbe\xed\xbf\x4d\x3b\x62\xd2\x71\x21\x8a\x61\xd2\xf1\x38\x38\xbc\x6d\x43\xa8\x7b\x4c\x33\x38\x72\x10\xd2\x65\xd5\x02\xaa\x34\xb7\x64\xf4\x61\x28\x66\x98\x42\x45\x21\x61\x73\x6b\x89\x1e\xd0\x57\x85\x65\xd6\x8b\x68\x03\x39\x66\x97\x3a\xc1\x9d\x52\xc8\x2b\x69\x06\xe5\xc5\xcb\xf5\x03\xda\x8b\xb5\xe4\x65\xeb\x07\x12\x53\x47\x51\xe3\x95\xd5\x15\xe8\x70\xd0\xe7\xe3\xd5\xaa\x61\x41\x49\x05\x5c\xe4\x47\x4d\x61\xbf\x2c\x0c\x07\x8e\xf2\xcb\x4d\xd5\xef\x86\x56\x91\x48\xad\x62\x1d\x8e\x2e\xae\xb0\x5c\xae\xd9\x03\xd6\xd9\x08\xf5\x72\x8d\xce\x42\xb8\xf2\x26\x97\x9b\x23\xc6\xa6\xed\x60\x6c\xf3\x73\x62\xfc\x95\x2e\x74\x5b\xee\xca\x02\x29\x67\xfb\x55\x46\x0a\x1c\x66\x0c\x53\x95\xe8\x9b\xb5\x27\xa2\x76\x3e\x4e\x0d\x59\xaa\x4a\xf5\xa3\x44\x2e\xa8\x98\xf5\x58\xbb\x9f\x29\x08\xe5\x37\x66\x46\xbe\x4a\x53\x05\x5f\x0e\x4f\xf0\x26\xf2\x75\xb0\xe8\xe4\x83\xd8\xd4\x70\xa2\xa7\x95\xdb\x12\x99\x6c\xe6\x3b\x2a\xf3\x1b\xe7\x66\xbe\xcb\x33\xdb\x2b\x9a\x16\xb2\x4a\xed\x4b\x38\x08\x75\xc9\x10\x86\xb9\x78\xfa\xcc\x18\xea\xd0\x09\xb9\x03\xbe\x76\x86\x24\xcd\xa8\xf6\xda\x45\x52\x74\x15\x4b\xd7\xb0\xa9\xbd\x24\x8e\xe3\xee\x0b\x3c\x90\x54\xac\x92\x1b\x17\xf8\xf9\x61\x32\x8c\xe2\xe9\x9d\x44\x1c\xe8\x58\xbd\xcc\x83\xe3\xd1\xe5\x95\xfa\xf3\xc2\x86\x3c\xc7\x4d\x78\x78\xb5\xf3\x92\x93\x25\x7b\x99\x7b\xf0\x8a\xda\xc6\xae\xdb\x77\x60\xb6\xb8\x13\x4d\xa7\x3e\x7d\xb8\xef\xc7\x24\x74\xa8\xdc\xc0\x27\xa4\xb8\xb6\x47\x3f\x8b\x66\x56\x92\xe1\x05\x6d\xff\x3c\x61\x61\x9c\xa1\x06\x15\xa8\x40\x9b\x7b\xf8\x99\x9e\xe2\x78\xb6\x8d\xa2\x61\x2d\x7c\x07\x4e\x7d\x07\x16\x3d\x07\x4e\x7b\xa8\x34\x7c\xa0\x7b\x8d\x2f\x7c\x3c\x89\xbc\xe8\xc1\x93\x27\x70\xca\x5e\x4e\x7b\x7a\x98\x72\xe6\x78\xc6\xdd\x4d\x2a\x0a\x72\xc5\xc1\x79\x43\x6b\x99\x78\x65\xad\x12\x4e\xf6\x1f\x70\x47\x95\xa0\x0d\x01\xd4\x61\xd3\x81\xc5\x0a\xd1\x5d\xcf\x8b\xc7\xb3\xc0\x36\xd9\x67\x0e\x08\xc0\xad\xab\x01\x4c\x89\x75\xda\xb3\x85\x57\xf9\x99\xf2\xc8\xe3\x34\xd2\x88\x53\x40\x14\xa8\x51\x5a\xd6\x04\x51\xa0\x06\xa7\xec\x55\x27\xca\x59\xae\xc3\xe2\x28\xa5\xc5\xd9\x7e\x4a\xb6\x8f\x58\xaf\xf4\xcc\xb3\x15\x3e\xd4\xf1\x36\x0e\x6f\xd7\xb5\xe9\x8a\xa0\x43\x95\xdb\x7d\x85\x2d\xd5\xf7\x7d\xf1\xdd\x97\xdf\x9b\x4d\x48\xc6\x51\x9c\x92\x24\x85\x99\x9f\x8e\xf3\x9d\xc4\x1b\xc5\xb9\xb0\x06\x15\x8e\x9b\xec\x6f\xc5\xb7\x57\x46\x74\x14\x92\x05\x24\xcf\xd3\x3a\x8f\x16\x8a\xc6\x9a\xc2\xaa\x8c\xc4\xc9\x11\x39\xf9\xfa\xaa\x14\x5e\x46\x0f\x06\xe8\x55\x23\x07\xc7\x6a\x65\x6a\x30\x47\xa0\xab\x95\x0e\x1a\x36\x08\x5e\xd2\xa8\xe2\xa8\x47\xbb\xf2\xcf\x52\x34\x5c\xc7\xb5\x1f\x0a\x08\xf6\xbc\xac\xaf\x18\x75\x84\xac\xa8\x38\x15\x21\x27\x14\x75\xb2\x87\xc0\x0b\x14\x0a\xee\xd2\xcc\x8f\xd4\xd0\x91\x9d\x62\x68\x7b\x11\x16\x3b\xc1\x03\xed\xb3\x89\xdf\x27\xe3\x68\x32\x20\x71\x22\xf5\xc6\x0f\x98\x8b\x21\x2d\xc4\xef\x77\x50\x73\x57\xc4\xf3\xf9\x78\x17\x5f\x9c\x10\xcb\xb7\x1d\x34\x4b\xb0\xb7\x1e\xc7\x50\x49\x3d\xbf\x21\x9f\xbf\xee\x80\xf6\xf6\x0d\x07\x7a\xc6\xb7\x9e\xf1\x0d\xd9\x8d\x2b\xac\x5c\x00\x36\xd8\x03\xcd\x29\x9e\xb4\x5c\x7c\x0c\x37\xf0\x97\xe6\xe1\x0f\x7a\x16\xa4\xad\xdf\xc0\x5f\xc4\x06\x9f\x10\x13\x91\xd6\x93\x69\x5a\x41\x1f\x8d\x24\x6c\x31\x84\x84\x19\xf5\xf5\x19\x38\xaf\xa6\xe5\xbd\xb2\x3f\x90\x01\x68\x22\xc1\xe2\x39\xcf\xea\xae\x15\xd1\x9c\xdd\xe0\xc0\x6e\x60\xd8\x99\xa8\xb1\xb0\xd2\xec\xc9\xc3\xa4\xf1\x28\x0a\x42\xab\x22\xb9\x41\xe8\x7d\x6b\xd9\x7b\xed\x0d\xc5\xab\x53\xac\x82\xac\xa2\xe4\xa8\x6b\xb7\xe2\x84\x30\x25\xee\xc0\x81\xca\x6c\x41\x47\x2f\xfd\xb5\xe9\xcf\x80\x8c\x90\x43\xcb\x90\xa0\x9a\xdc\x73\x21\xd1\x53\x48\x30\xad\xf0\x80\xd5\x8f\x82\x43\x48\x8f\x9c\xe6\xfb\x12\x4e\xe8\x5e\xd8\xa6\x2d\x08\xf9\x9c\x97\x44\x73\x4a\x5c\x3e\x16\x71\x3f\x9a\x2e\x8d\xc9\xb0\xbb\xc7\xbc\x4a\xf1\xfa\xc1\x24\x79\x3b\x1a\xf0\x23\xa6\xfd\x24\x79\x37\x8a\x52\xf9\xf2\xd5\x80\x9c\xf0\x43\x57\xc7\x23\x9a\x4d\xb7\xef\x8a\xd6\xea\xc7\x50\xb4\x28\x18\x9d\x0e\x54\xc2\x28\x24\x15\xfb\xfc\x63\xf2\x26\xd6\x82\x25\x84\xbf\xa5\xd8\x0e\x44\x53\x2f\xc7\xd7\x16\x88\xe3\xf5\x38\x7d\x34\xca\x35\xd8\x11\xa9\xbb\x13\x42\xdf\xac\xca\x1b\xf7\xbe\x5a\xb1\x1d\xd1\x28\x3d\xa3\x78\xe0\x59\x1d\xd1\x56\x23\x0f\x9b\x07\x68\x32\xad\x9c\x57\xd7\x48\xd2\xd3\x09\x61\x22\x0d\x6f\xc2\xd1\x8e\xc8\x88\x33\xad\x1c\x58\x63\x44\xd2\x3b\xd1\x74\x36\x4f\xc9\xe0\x01\x2d\x65\x71\x4c\x1a\xfe\x6c\x46\xc2\xc1\x9d\x71\x30\x19\x58\xa2\x3d\x6c\xb2\xb4\x69\xa1\xfb\x71\x34\x23\x71\xca\x8e\xb0\x72\x55\x93\xd6\xc5\x24\x83\x00\xc2\x0e\xdb\x98\x40\x74\x2c\x58\xf4\x5a\xe6\xe9\xba\xe3\x40\xdd\xb3\x1b\xc9\x6c\x12\xa4\x56\xc5\xa9\xe8\xae\x4a\xab\x19\xe8\xb4\xce\x29\x98\x26\x59\xc0\x13\x76\x27\x2e\x7b\xf4\xd4\x63\x4b\x3d\x6e\xa8\xc7\x4d\xf5\xb8\x75\x90\xbd\x2a\x93\x8f\x80\x32\xce\x92\x77\x0c\x5e\x1d\x5b\x71\xfe\xb6\x05\xa3\x97\xb2\xd5\xdb\x0f\xac\xca\x38\x4d\x67\xed\x66\xf3\xe4\xe4\xa4\x71\xb2\xd1\x88\xe2\x51\xb3\xe5\xba\x6e\x33\x39\x1e\x51\x79\x35\x62\xe4\xe5\x80\x1a\x09\x49\x5f\x4f\xd3\x38\xe8\xcd\x53\xa3\x33\xd5\x21\x3a\xb1\x89\x21\x7a\x4e\x94\x94\x79\x1b\x3d\x3f\x21\x5f\xf5\x27\x0d\x3a\xcd\x47\x93\x60\x40\xe7\x4d\xdb\xbe\x32\x0a\x98\x2c\x33\xf5\xd3\x38\x58\x5c\x31\x87\x30\xd0\x3e\x6f\x74\xa3\x27\x1e\xfa\xe2\x61\x20\x1e\x88\x78\x18\x16\x7a\x3f\xef\xbd\x84\xf3\x85\xcf\x1b\x27\xa4\x57\x12\x27\x44\x1e\x70\xc0\x23\x62\xe8\xb9\x4f\x46\x31\xc1\xd3\x1f\xde\xae\x2b\x6e\x51\xbf\x7f\x6f\x9f\xcf\xf9\xa2\x9f\xd8\x11\x41\xa5\x55\xb5\x59\x74\x34\xa5\x58\xf1\x04\xa6\x3f\xf1\x17\x54\x94\xc4\x33\xaa\x41\x6d\xe6\xcc\xcb\x34\xa1\x36\x78\x78\x7e\xee\x6a\xec\x5d\xe8\xbb\x30\x70\x80\x98\x67\xef\xb8\xf6\x25\x75\x2f\x8a\x92\x60\x78\xf6\xd1\xd8\x70\xf2\xb9\x77\x65\x0f\xd6\xa1\x67\xd3\x45\x6c\xb3\x23\x81\xf4\xd4\x8b\x04\x41\xe1\x41\x07\x0d\x8a\x7d\x5e\x6e\x60\x43\x1f\xed\x6c\xb0\x0e\x5c\x57\x1c\xd0\xf7\x9e\x78\x37\xea\xff\x86\x51\x7f\x9f\xc3\x19\x20\x1c\x0a\x48\x54\xf9\x0d\x0a\x45\x7b\x61\x35\xcb\x04\x01\x93\x56\x3a\x80\x9b\x58\x59\xdf\x46\x05\xb3\xee\x33\x4d\xba\xde\x13\xa5\x3a\x50\x17\x4a\xac\x20\x41\x5d\xb5\x4b\x9c\x20\x36\x15\xee\xaf\xb7\x81\xcf\xd1\x7a\xa7\x0f\x1d\x4d\x93\x6e\xeb\xdb\x6c\x3d\x07\xd0\xf9\x86\x33\x98\xa3\x74\x69\x2d\x1b\xa3\x5f\x3e\x1b\x67\x16\x4e\x78\x95\xf6\x0d\x9e\xf6\x8d\x72\x8b\xe4\xde\x8b\x3a\xae\x87\x3b\xaa\xe3\x48\x74\xd7\x83\xff\xe3\xdd\xf7\x5a\xbc\xf5\xe3\xa8\x05\x1d\x50\x6f\x9b\xd0\x01\xbe\x89\x4d\x66\x49\x30\x89\x42\xfa\xdd\x23\x75\xaf\x65\xec\x4f\x47\xc9\x38\xeb\x9f\x65\x2d\x44\x05\x64\x31\xb3\x16\x36\x5d\xbb\x79\xd0\x84\x85\x0d\x4d\x68\x65\x0e\x4b\x07\xe1\x0a\xe5\xeb\xa5\xe5\x53\xff\xbc\xf2\xe8\x7f\xc6\x60\xe0\xde\x2b\x3a\xf9\x31\xa9\xd8\x6c\xc2\xcc\xa5\x2b\xba\xf9\xc2\x75\x60\x7e\xea\x3a\x70\xe2\x1e\x60\xb2\xc7\x92\x3d\x9a\xec\x39\x70\xe2\x1d\xbc\x88\x43\x6c\x33\xd7\x81\x99\x16\xb4\x6f\x8e\x57\xba\xcd\x5c\x54\x02\xe6\xa7\xfc\x85\xaa\x01\x27\xfc\xb9\x25\xf7\x4a\xe6\x78\xaf\xdb\xcc\xe3\x79\xf9\x0b\xe6\xe5\xcf\x2a\xef\x80\x52\x84\x16\xa8\xd3\x2a\x64\x2a\x95\x89\xb4\x64\x1d\xdb\x2e\x52\x69\x3f\x0f\x16\x94\x9f\x29\xa9\x06\xa7\xf4\xe9\x34\x77\x75\xf1\x03\x71\x3c\xf7\xc1\x8c\xf4\x03\x7f\x02\x7d\x3f\x21\x78\xf0\x6e\xee\xc2\xff\xfe\xed\x6f\xc3\xdc\x13\xe7\x81\x07\x2d\xb8\x29\x99\x48\xac\x02\x1f\x88\x3e\x9a\x44\x23\xeb\x84\x76\xef\x89\x4b\xfb\x27\x1e\xf3\x35\x60\xa0\x1f\x22\xd2\x16\x8f\xbc\x97\xbb\x72\x4d\x4e\x89\x56\x43\xdf\xc5\x81\x76\xc7\x24\xa5\x1e\x4f\x3d\x55\xa9\x27\xae\xf0\x40\xa4\xac\x41\x87\x02\xf3\x7a\x7c\x20\xee\x25\xcf\x06\x83\x6d\x36\xe1\x0b\x24\x24\x31\x6f\x60\xc3\x8c\x63\x87\xb3\x8f\x67\x48\xbf\x41\x4b\xbf\x02\x90\xf6\x1a\x6d\xdd\x3a\xed\x94\x3a\xab\xfe\x84\x22\x86\x23\x6c\x1d\x06\x2d\x79\xd7\x0c\x7e\xc3\x61\xb8\x0e\x03\xe3\x1e\x41\xaf\x18\x48\xbd\x08\x88\x57\x02\x24\x76\x75\x7a\x2b\x74\x7b\x14\x58\xcf\xc5\x31\x01\x75\xe8\xb9\x7a\x19\xaf\xa4\x0c\xad\xa4\xe7\xc9\x32\x1e\x5f\x6c\xd3\x2e\xb5\x62\x8a\x62\xbc\x5a\x57\x0a\x33\x0c\xf6\x80\xaa\x97\x6d\xdd\x21\xc6\x28\x5e\x62\x1d\x29\x80\x39\x74\x68\xf3\x9b\x60\xa9\x86\xc2\x3a\x58\xbc\xd0\x3a\x93\x09\xac\x6f\x13\x4a\x6a\x97\x62\x89\x82\x26\x76\xed\xac\xc5\x20\xcb\x47\xf3\x42\x3e\x9a\x17\xf1\x11\xaf\xb0\xc9\xb1\xd4\x2b\x2c\xe1\xa6\xa0\x31\x98\xc7\x78\x0b\x0c\x74\xe0\x01\xac\x83\xe7\xba\xae\x7e\xe6\x2d\x28\x99\x10\x5e\xde\x89\x65\x2e\xa5\xc6\xc9\xe4\xcb\x51\x78\xf9\xed\xa5\xc1\xc6\x39\xae\x5d\x5b\x97\xbc\x67\xf8\x5c\x9f\x31\xcf\xdd\xc9\x6c\x2f\x8d\x93\x89\x35\x16\x4b\xa0\xac\x59\x2a\x49\xfd\x38\x75\x80\x84\x83\xec\x7e\xf7\x78\x4e\x2c\xf6\x79\xb5\x28\x51\xaa\xc9\x62\xab\x7e\x9c\x4c\xf8\x39\x44\x0a\xc5\xb6\x1b\x63\x07\x2c\x12\x0e\x9e\x1b\x1e\xc5\xd6\x6e\x18\x1b\xda\x17\x75\xbc\x2a\x58\x5e\x20\x96\x8d\x04\x89\xd1\xd0\xaf\xc8\x9d\x5c\x19\xf0\x09\x03\xae\x6f\xd3\x2b\x4f\x9a\xab\xa9\x82\xc3\x63\x15\xe9\x2e\x0e\x4b\x4d\x92\xac\x2c\x76\xbb\x66\x55\xe4\x14\xa1\xcb\xc9\x5c\x2a\x25\xca\x24\x97\xaa\x5a\xc3\x9f\x0a\x6c\x94\xc8\x52\x35\x19\x62\xe4\x8c\x6f\xd0\x5f\x65\x18\x08\xca\xf2\x17\xf1\xa4\x19\xcf\x09\xf3\xe0\x63\x3a\xa2\x18\xfd\x1d\x58\x1d\x50\xd1\x2d\x6b\x39\x39\xf6\xf2\x02\x0c\x70\x5a\x28\x7c\x7e\xf5\xe5\xd8\xc4\xef\xe5\xc4\x15\xad\xe4\x2a\x86\xe7\x65\x05\x1d\x61\xc7\xae\xfd\x9e\x29\xe8\x26\x97\x15\x74\x19\x78\x4c\xd0\x4d\x8c\x03\x92\x57\x23\x26\x7c\x26\x20\x7c\x5b\xf7\x1f\xbd\x1a\xd0\x3d\x06\x5a\x1d\xd3\x7c\x69\x22\xae\x54\xc0\x15\x89\x2c\x4e\x07\xba\xf2\xcf\xa4\x51\x52\xf4\x32\x69\xe5\x82\xad\x50\xac\x9d\x15\x9a\x9d\x5e\x60\xc0\x8c\x12\x35\xa6\xff\xcf\x48\x8d\xe9\xbf\x74\x35\x86\x4f\x0e\xfd\xab\x52\x63\x32\xf0\xf2\x6a\x4c\xff\xca\xc6\x48\x9f\x8d\x8e\xfe\x67\x6a\x8c\x48\xa5\xb4\xed\xff\x8a\xa9\x31\xfd\xe7\x53\x63\xfa\x52\x8d\x59\x19\xd0\x4a\x6a\xcc\x4b\x0c\x1e\x72\xd5\x61\xb6\xa5\x57\x39\xa5\xcc\xa5\x03\x69\xbf\x5a\x92\x51\x3b\x77\x90\x91\x8f\x56\x3e\xcf\x17\xfc\xe9\xd4\xb7\x64\x44\x5a\x74\xe1\x3f\xe5\x81\x64\x0b\x20\xe6\x05\xeb\xd5\x88\x56\xb6\x89\xd4\xd7\x0e\x67\x5d\x85\x80\x2d\x84\x9a\x17\xb3\x2f\x78\xbd\xf8\x82\x45\xed\x4b\x15\xb6\x4b\xc5\x6d\x99\xc0\x2d\x5b\x39\x9a\x42\x57\x3f\xbf\x7d\x6a\xe7\x32\x2d\x93\xc1\xa5\x52\x98\xcb\x61\x19\x9d\x59\xb2\x42\x63\x44\xf9\x5e\x3f\x33\x88\x03\xc1\x8c\xa0\xac\x9d\x27\x04\x38\xb3\x2d\x61\x27\xbf\x32\x81\xae\xc6\xd5\x73\x88\x75\x43\x84\xe9\x2d\xba\x4a\x11\xff\x2b\x74\x7d\x8c\xee\x82\xe6\x88\x58\xe2\x68\x5b\xf5\xa7\xb3\x49\xe6\x36\x2f\xe6\xda\x28\x03\xe4\xe1\x8d\x51\xfb\x80\x5e\x56\xfb\x50\xab\x05\xb6\x28\xc5\x2e\xf7\xd2\x61\x5b\x01\x34\xc1\x0a\x71\x27\x45\x5f\x6e\xf0\x02\x25\xa6\xcb\x57\xea\xae\x95\xc1\xc6\x39\x01\xee\x2e\xef\xf5\x3e\xd8\x38\x1c\x46\xf1\xd4\x2f\xbf\xca\x63\x83\x5f\x1f\x76\x05\xbb\xc5\x2c\x66\x9a\x03\xfd\x68\x1e\xa6\x0e\x24\x33\xd2\x0f\x86\x01\x06\x6f\x16\x7d\xcf\xa7\x25\x96\xb3\xeb\xaa\x0b\x06\xd2\x68\xa6\xd2\x79\x2c\x37\x2d\x6e\xb4\xca\x47\x66\x2b\x4f\x40\x32\xea\xdc\x08\xc7\x56\x1a\xf4\x8f\x1e\xd0\xf2\x4a\xc6\x3a\x58\x31\xc7\x58\x3f\xb4\xe7\x42\x9b\x25\x4a\x09\x3f\x8b\x49\x3f\x48\x82\x08\xef\x37\x93\x4d\x5b\x4d\xd8\x6b\xbd\x20\xa4\x07\x7b\x7f\x20\xe1\x30\x9c\x14\x58\x89\x4a\xc5\x19\x56\xa0\xad\x11\x13\xeb\x3f\x09\xd2\xfe\x18\x54\x81\x46\x7a\x3a\x93\xf1\x82\x71\xd3\xab\x92\x54\xda\x86\x6e\x20\x5c\x41\x50\xc0\x4f\xfd\x05\x93\xf4\x7e\x2f\xe1\x13\x3c\x0f\xb8\xc0\x12\xa2\x99\x12\xfd\xb8\xa3\x2e\x2b\x92\x74\x90\x38\xde\xb8\x01\xfc\x1e\x4f\xed\xdb\x85\xc9\x42\x44\xa8\x62\x06\xe1\xbe\x8c\x59\x4c\xbb\x8a\xcc\x84\x4f\x8d\x6d\x43\x21\x2e\x66\xff\x68\xb3\xc7\x45\xf1\xe8\x69\xdd\x63\x20\x21\x6a\xd5\xbd\x7b\xc4\xad\x03\x8c\xe2\x95\xb6\xf6\x42\x8c\xb7\x91\xf1\x36\x33\xde\x62\xad\xa3\x5e\x0e\xad\x87\x26\xad\xdf\x8d\xe6\xe2\x4c\x26\x23\xf5\xca\x2c\xb2\x42\x77\x40\x3d\xcb\xa6\xcc\x81\x90\x28\xcf\xf1\x5e\x4c\xfc\xa3\x3c\x39\x87\x06\x95\x3e\xf7\xd2\xa9\x34\x30\xa9\xf4\x66\xb0\x20\x1a\x95\x9e\xa3\xe9\x9f\xab\xd8\xb0\x0e\xad\x92\xe6\x9f\x5d\x28\xd8\xa4\x81\xb1\xaf\xf1\x6e\x86\x6b\x4b\xee\xbd\xda\x7b\x09\xf7\x5e\xbd\xa8\x45\x23\x6b\x67\x6e\xb5\xf8\xa2\x5c\xbc\x74\x91\x20\x2b\x7d\x31\xf6\xfd\xc3\x49\xd4\xf7\x97\x5c\x70\xbd\xb1\xdb\x92\x5e\xbe\x2c\x2b\xd3\x41\x39\x45\xb4\x67\x8e\xee\xda\x1a\x47\xe9\xcb\x98\xdb\xa2\x03\x69\x40\xfa\xc1\xd4\x9f\xb4\xa1\xd2\xa8\xa0\xcb\xd9\x38\x9a\x27\x7e\x38\x48\xda\x78\xc2\x63\x0d\x60\x14\x47\xf3\x59\x10\x8e\xda\xd0\xdd\xc0\x19\xb8\x3f\x8f\x63\x12\xf6\x4f\xdb\xd0\xad\xfc\x8b\x8a\x03\x95\xca\x41\xe6\xde\x04\xb3\x1a\x3c\xfd\x1d\xd0\x0f\x6c\x6a\x62\xb8\xae\x78\xbd\x8d\xa0\x41\xe1\x0a\x49\x83\xcc\x35\x47\xca\xf2\x1d\x5e\x43\x43\x10\x02\x4c\x41\x9e\xf9\x2e\x88\xa3\xe2\xaf\x70\x5a\x16\x18\x89\x5f\x82\x53\xfa\x25\xb5\x2e\xd1\x4b\x8e\xea\xc1\x62\x6b\x2c\xbb\x70\x08\x4e\x82\x81\xba\x6b\x46\x68\xdb\xcc\x2f\x33\x7b\xa3\x51\x6a\x5c\x02\x95\xb9\xbc\x95\x45\xbc\x10\xb5\x6b\xba\x1c\x80\x88\xa0\xc0\x2f\x7c\x54\xf7\xf4\xc2\x2d\x70\xa9\x74\x1e\xd1\x07\xf3\x08\x1c\x2f\x53\x83\x11\x3a\x66\xdd\x12\x78\x8e\x74\x95\xc5\xe3\xe8\x43\x9d\xd7\x21\xe7\x90\x54\xbb\x4d\xa8\x91\xcc\x7b\xec\xf4\x8c\x15\x40\xbd\x03\x23\x07\x02\x0a\xd8\x54\x69\x64\x8d\x1d\x56\xa5\xad\xea\xd4\x24\x72\xa6\x95\x94\x02\xd6\x23\x96\xfd\x73\x32\x99\x13\xee\xc0\x58\xe4\x8a\x58\x66\x8d\x98\x1c\x93\x38\x21\x96\xcd\x8e\x81\xa8\x5e\x2a\x3f\xfe\xbb\xe7\xbe\x04\x5f\xd8\x4b\xf2\x5b\x38\x9f\x92\xd8\x9f\x2c\x63\xb2\xcc\x79\x57\xd6\x29\x31\xc1\xc3\x4b\x56\xb3\xeb\xd6\xf7\x0e\x9a\x23\x4d\xca\x06\x39\x47\x2a\x51\x49\xb7\x16\x08\xaa\x2e\x25\xd7\x0b\xbc\x4a\xe0\x39\xc9\xb5\x70\x80\xc7\x84\xc7\xb8\xa8\x8d\x34\xba\x2f\xf4\x03\x6b\xc6\xae\x93\x88\xe6\x69\x5b\x2d\x7e\x43\xcc\x26\xce\x1e\x05\x18\xa7\x17\xef\xc2\xc5\x93\x49\x81\x67\xae\x8b\xf9\x4e\x1a\x5f\x0f\x2c\xf0\xbe\x2d\x41\x4b\xa6\x38\x35\x2a\x6d\x56\x3c\xf0\xf0\x36\x62\x93\xbb\x59\x1e\x97\xe6\x19\xb2\x7b\x77\xd9\x55\xc4\xac\xc4\xfe\xb2\x42\xa4\xd2\x66\xc9\xb4\x01\xe2\x13\xa7\x92\x04\x77\x4b\x02\x73\xf7\xf3\x9a\x8e\xe6\x63\x84\x59\xe1\x36\x2c\xf8\xc1\x06\x97\x36\xda\x86\x9a\x4c\x08\xb8\x6f\x57\x1b\x16\x25\x4c\xf0\x02\xfd\x91\x2e\x31\x87\xb3\x39\xe6\x0d\x36\xcb\x96\x07\x93\x6a\xb5\xc4\x25\x7f\x57\xc6\x68\xe8\x00\xb8\xe2\x2c\x9b\xc1\xb2\xf8\x0c\x26\x85\x2c\x0f\x33\x0c\xe4\xe1\x84\x85\x34\xf1\xa1\x01\x2c\x22\xc3\x61\xd0\x0f\x48\x88\x2b\x7c\x6d\x42\xa0\x48\x87\x22\xd9\xd3\xe3\xff\xc9\x2f\x2c\xaa\x4f\xc5\x6d\x54\xa0\xa6\xd9\x85\xea\x22\x03\x97\x9d\x15\xb7\x42\x59\x42\xab\x8a\x57\xd1\xd6\xd3\x84\xe1\xe0\x96\x82\x5f\x63\xa1\x7c\xb4\x3c\x92\xcb\xf4\x3c\x78\xa0\x13\x71\xc8\x67\x35\xf2\x15\x55\x6b\x60\x2e\x73\xd7\x8b\x30\xab\x41\x4b\x6b\x51\x09\x3b\xbf\x40\xb7\x94\xe7\x65\x35\x43\xf6\x97\x0d\xc7\x57\xeb\x1e\x7d\xd1\x21\x4b\x62\x4b\xec\x5d\xd1\x48\xc4\xe5\xa1\x4e\x21\xa9\xbf\xb8\x0e\xd4\x57\x19\x95\x0a\xd9\xc2\x01\xa9\xad\xc2\x71\x21\x5a\xd2\x01\x2f\x61\x43\xf0\xd5\xed\x00\xe3\x86\xb3\x82\x7e\x90\xcf\xf5\x5d\xf1\x12\x84\x96\x78\x1e\x4e\xa2\x28\xb6\xae\xa0\xab\x38\x12\x4d\xd8\xb0\x6d\xba\xea\xdf\x80\xfa\x4a\x72\xf9\x6a\x38\xe0\x25\x84\x87\x7c\x95\x39\x60\xea\x73\x49\xc5\xcd\xc6\x26\xd5\xf0\xbb\x9e\x8a\xd9\xeb\x98\x79\xbf\x98\x69\xae\xa0\xe7\x78\x25\x57\x00\x89\x75\x3d\x9d\x8e\x4a\x7a\xff\x25\x6c\x72\x5c\xfc\x36\x91\xe8\xb2\xa7\x9f\x5f\x81\x5d\x92\xcb\xc5\xfc\x14\x11\x1c\x96\xe8\x80\x97\x04\xbe\x71\x78\x18\x06\xfd\x65\x76\xa2\x4b\xba\x3b\x6c\x22\xd6\x69\x10\xce\xa3\x79\xf9\x6d\xdc\xde\xe6\x2e\x8f\x57\x6a\x58\x80\xb4\x80\x01\xf9\x80\x59\x56\x4f\x3f\xbe\xd1\x83\x26\xf8\xb6\xd0\xa6\x6e\x83\xa1\x61\x18\x03\x90\xe6\x5e\x60\x6e\x68\x42\x6f\x9f\x1b\x8a\xa9\x06\x76\xee\x48\x32\xba\xa0\x70\x24\xf5\xb2\x21\xbe\x97\xb7\xc1\xa7\xea\x6a\x1e\xe7\x54\xc3\xb9\x2e\xb7\xd1\xeb\x3d\x07\x52\x5b\x0f\x31\x5e\xf7\x1d\xf0\xa0\x0e\x78\x45\xac\x6c\x46\x21\x18\x59\x26\x07\x44\x87\x91\x39\x62\x1d\x9d\x78\x6e\x46\x45\x0b\x92\x37\x83\x30\x48\xf1\xb2\xa8\xdb\x50\xb3\x2a\x1e\xc1\x80\x25\xb8\x9a\xe2\xca\xb7\xcb\x57\x56\x26\xa8\x99\xd5\xf3\x13\x73\x16\xa5\x09\x2c\x3a\x26\x2d\x86\xd5\xc9\x56\xc8\x6f\x88\xe8\x5d\x11\x20\x94\x2c\x66\xf9\x86\xe6\xfa\x18\x1b\xea\x27\xc4\x81\x45\xbe\x59\x93\x68\xb4\x0c\x17\xb3\xbe\x49\x34\xca\xa3\xe4\xa1\xe9\x49\x7c\x97\x48\x3f\x79\xa2\xb2\xb4\xf4\x1c\x2d\x95\xc1\x62\x39\x34\xc6\xa5\x88\x38\xe7\xf1\x2b\xf2\xaa\x9f\x10\x66\x2e\x36\x39\x6c\x38\xa1\x5c\x3b\x2c\xb6\xa2\x64\xef\xf4\xaa\x0f\xad\xfa\xc2\x56\x2e\xac\x3a\x55\xac\xcc\xa1\xdc\x55\x16\x7e\x99\xf1\x2d\x76\xbd\x32\x26\x56\x6d\x10\x38\xe6\x98\x90\xd7\x64\x75\x3d\x07\x3c\xf7\x40\xee\x92\x66\xae\x14\xe3\x3b\xc2\x62\xa3\x83\x11\xd1\x93\x26\xc4\x49\x34\x4a\xd8\x9c\x30\xb3\x3c\x75\x9e\x6a\x16\x9d\xd0\x64\xe4\x3e\xcf\xb5\xcd\x4b\xcf\x62\xc2\x82\xc2\x08\x0a\xe9\x30\x78\xaf\xe8\xe5\x31\x89\x1f\xf8\x1a\x8a\xeb\xca\x2c\xbb\xeb\x1e\x50\xb6\xb7\x45\x71\xd1\x1f\xf4\x55\x41\x10\xa9\xf4\x35\xe3\x57\xcc\x0c\xc5\xc6\x3d\x6b\xbc\x79\x17\xba\x3e\x8d\x97\xa9\x1d\x3a\xaa\x61\x36\x67\xda\xfd\xcc\x1d\x66\x92\xb6\x97\xb8\xa0\xcd\x3a\xb4\x33\x35\x08\x4a\x64\x6b\x49\x83\xfe\x51\xa2\x57\xc2\xb6\xc1\xf5\xb3\x85\x72\xa3\x5e\xbf\x68\x7e\x9e\x59\xf4\x03\x1c\x63\xca\xa0\x68\x1b\x1f\x20\xe6\x96\x61\xbc\x93\x1c\x3a\x70\x0c\x37\x61\x6e\xa3\xb9\x6b\xee\x20\xb0\x63\x07\x21\x04\xfb\xe6\x5d\xfc\xb4\x87\xac\xb9\x6d\x1a\xa5\x31\xf1\x58\x4b\x9c\x69\x37\xef\x6b\xf6\x6c\xf3\x1a\xff\xc2\x5d\xff\x1a\xf3\x5e\x90\x19\x1f\xf3\xfb\x1b\x25\xb6\xd7\x59\xa7\x7d\x0e\x3c\x9b\x4a\x8b\x47\x50\x87\xec\x6d\xf9\x42\x52\xb0\x78\x8f\x01\x1e\xf3\x75\x10\x51\x2d\xf9\x11\x57\xdd\x78\x99\x21\x58\x73\x66\x2d\x43\x4b\x20\xb3\xf2\x3d\x32\xac\x7c\xf4\x0f\x3f\x1e\x31\xa3\xe0\x8c\x31\x79\x62\x05\xf6\x3e\x1c\xc1\x4d\x2e\x6b\x6a\xb5\x23\xbd\x04\x33\xe3\xcf\x60\x1d\x8e\xf6\xb5\x44\x5a\x61\xca\x88\xce\x45\x01\xc9\x7f\xbe\x05\xc7\x19\x6b\x38\x92\x84\xd9\xda\x75\xc7\x2f\x31\x8f\xf1\x30\x5a\xab\x35\x01\xe9\x58\x2f\x68\xc9\xad\x0e\x78\xfb\x50\xaf\xff\xbf\xd8\x8e\x35\xad\x35\x02\x87\xc7\x17\xf7\x3c\x19\x4b\xcf\x93\x84\x49\xd5\xc0\x81\x47\xda\x7a\x13\xb9\xc7\x81\xd0\xb6\x1b\x53\x7f\xa6\x0b\x1a\x73\x17\x21\x86\xdb\xf0\x58\xed\x24\x40\x1b\x1e\x17\x0d\xdc\x37\xc5\x3e\x98\x39\x7a\x73\xbe\x38\x99\x2d\x74\x15\x78\x45\x77\x6c\x31\xe7\xf9\x4a\xc3\x25\x18\xa1\xd2\xa9\x28\x71\x9a\x9e\xce\x48\x34\xd4\x4a\x5d\xef\x74\xa0\x22\x2a\xaf\xd8\xcf\xe5\x28\xb3\x7c\x37\x5b\xa0\x20\x06\x71\x07\xee\x85\xb8\x27\x78\x2a\xed\x93\x32\x7b\x3e\x37\x6f\x2e\x7f\x05\x8f\xdf\x2f\x84\xb7\xb3\x66\x36\x9c\x90\x0c\xeb\x3c\x6b\x53\x97\x92\x96\xdd\x10\xbb\x50\xd0\x6c\xc2\x7b\xef\xbc\xf1\x0e\x0c\xfd\x24\x05\x92\xa4\xc1\xd4\x4f\xc9\xed\x42\xcf\xf8\x41\x3e\xe6\xd8\x00\x9a\x8c\xff\x35\xf9\x80\x32\x6d\x60\x9b\x9b\x56\x01\xac\x33\x84\x6e\x8a\xd1\xe3\x36\xb6\xa8\xd8\x5c\xef\xc8\x39\x43\xab\x33\x80\x9b\x1d\x38\x82\xdb\x8a\x14\xb4\xf6\x76\xc6\x3d\x5e\x63\x22\xba\x9c\x58\x72\x4f\x26\x17\xfb\xe7\xf6\xa4\x5c\x98\x14\x6f\xde\x8a\xc9\x43\xd2\x01\xcd\x2d\x25\xaa\xa1\xa2\x0b\x33\xca\x20\x5d\x16\x94\x2e\xe2\xc2\x7f\x80\x3e\x09\x26\xe7\x16\xa7\x99\x8c\xd2\x7c\x5f\xe9\xa2\x97\x85\x5e\x5c\xbb\x62\x34\x40\xb0\xea\x06\x50\x87\x29\x6f\xa8\x36\x30\x35\x25\x7f\xdb\x68\x52\xb2\x1f\xbd\xe7\xbe\x44\xbf\x8d\xd5\x83\xa4\x45\x27\xcf\x17\x1f\x2d\xf9\x20\x4e\x2f\x6b\x5c\x7a\x71\xab\xec\x17\x7b\x4d\xf0\x85\xd6\xd9\x4a\x0b\xf6\x83\x84\x58\x0b\xb5\x7b\x61\x5a\xe4\xf9\x92\x4e\x5b\x85\x1a\x59\xdb\xc6\x7d\x57\x32\x3d\xb7\xf8\xd3\x96\x16\xda\x1e\x8e\x27\x9d\x31\x57\x5d\x6e\xb4\x9e\x77\xb9\xb1\x74\x79\x61\xae\x0f\xca\xec\x0f\xa6\x05\x82\xd1\xaf\xa7\x13\xa5\x0e\x96\x2f\xbf\xf8\xda\x17\x69\x9f\x28\xb5\x50\x58\x05\xdd\x51\xcf\x99\x2a\x56\x32\x56\xb8\x2b\x19\x2b\x72\x11\x87\x4b\x1b\x7d\xe1\xc6\x96\x9f\xe6\x92\xba\x08\x2b\x24\xa2\x98\xb3\x0b\xd3\x14\x13\x89\x33\x57\x52\x9c\x6a\xac\x73\xa1\x95\x8b\x56\x8e\xae\x8f\x8c\x8b\x99\x31\x46\x5a\x5b\xd6\x7a\xd5\x12\x3c\xc7\xb0\x25\x12\x1c\xc7\x88\x6c\xa0\x65\x52\xf1\x05\xde\x1b\xad\x22\x15\x7d\x10\xa7\x96\x31\xf6\x33\x28\x51\xf5\xa0\x70\x02\x79\x15\xa3\x6c\x7e\x30\xf7\xc3\x34\xa0\x33\xde\xab\x66\x21\x5e\xe5\x06\x7a\x5d\x3e\x8b\x96\x14\x5e\xe5\x2e\x97\xc1\xe2\xc6\x75\x95\x92\x8e\x63\x92\x8c\xa3\xc9\x20\x51\xcb\xce\x52\xd3\x87\x3c\x2a\xc1\x02\xd6\xea\x4a\x2b\x42\x6e\x18\x3e\x52\x06\x68\xed\xe8\x05\x9e\x9c\xd8\xd7\xdd\xb4\x64\x7c\x5b\x55\xa4\x1b\xe0\xfa\xfd\xe2\x0b\x20\xe6\x44\x2b\xc8\xa1\xeb\x7f\x0e\x04\xd0\x84\x70\x99\x5d\x25\x1b\xe0\x5a\x5f\xbc\x70\x07\xdf\x05\x95\x0e\x0b\x15\x30\x11\x1b\xde\xbd\x20\x92\x6c\xb8\xf5\x82\x84\xf4\xb9\x90\x55\x2d\x77\x60\x61\x1f\xec\x17\xdd\xa8\x7f\x77\x91\x66\xa4\xda\x69\xb6\x67\x58\x37\x04\xe1\x80\x2c\xde\x19\x5a\x99\xa3\xb2\x01\x9f\xa5\xbb\x6f\xfb\x6f\x3b\xf0\xb6\xff\xf6\x01\xb4\x65\xe4\x9f\x80\xbb\xc3\xe4\xbb\xa0\x9d\x3f\x3d\x41\x21\xa9\x8c\x4a\x84\xea\x85\xb5\x82\xf9\xe3\x15\x08\xe7\xe0\x02\x06\x27\xec\x81\xac\xd0\xb6\xcd\x65\x82\x7e\x17\x3f\xe8\xec\xcf\x12\xcc\xd3\x3e\x8c\x85\x0f\xa5\xdf\xd3\xc0\x74\x73\x42\xdb\x1d\xcd\xd0\x0d\x0e\x1c\x18\xc0\xf5\x9c\xa7\x37\xfd\x5a\x1b\xfc\x3f\xec\xbd\x79\x77\xdc\x36\xb2\x38\xfa\xbf\x3f\x05\xe2\xdf\xbb\x51\xb7\xdd\x6e\x03\xe0\x2e\x8d\x26\xd7\x71\x9c\xc4\xef\x3a\x76\x8e\xad\x4c\xc6\x3f\x3f\x1f\x05\xc4\x62\x71\xdc\x22\x35\x24\x65\xab\x27\xd6\x77\x7f\x07\x1b\x09\xb2\xc9\xee\x56\x4b\x56\x32\x73\x1d\xe7\x40\x4d\x2c\x05\xa0\x50\x55\x28\x6c\x55\xd3\xa9\xad\x5c\x2d\xed\x59\xa7\xf2\x79\x55\x94\xdb\x13\x85\x16\xf9\xa4\xa2\x5c\xdd\x23\x36\x4f\xb2\xdc\x35\xb9\x65\xc7\x3e\xde\x2c\x5b\x5f\x69\xb6\xb3\x85\xb6\x91\x42\x96\x62\x15\x82\x65\xc3\xe6\x94\x2c\x16\xab\x7b\x7c\x9a\xfc\x9c\x61\x70\x5b\x69\x79\xb2\x5a\x33\x51\x3a\x44\x35\x02\x65\xc3\x4c\xdb\xca\xc1\x46\x09\x9a\x77\x26\x72\x27\x5e\xb5\x56\xe3\xe1\x0a\x2b\x21\x74\x8b\x56\x43\xaf\x38\x91\xfd\xeb\xdf\x74\x22\xdb\x6d\x21\xb3\xd5\x1a\x69\x60\x92\xfc\x97\x3b\x49\x2a\x53\x83\xcd\xf9\x80\x32\x26\xd8\x2c\x37\x72\xf7\xa3\x15\x27\x70\x1e\xac\x4e\xa8\x70\x06\x50\x6f\xf6\x1c\x98\x43\x94\x6b\xe0\x8b\x9b\x9e\x3b\xec\xf4\x76\x31\x53\x62\xcd\x99\x3d\x36\xce\xe4\x0f\x50\x4f\x58\xf6\x9f\x48\xae\xce\xd1\x46\xa6\xab\x77\x91\x93\x49\xa6\x6f\xb1\xdd\x03\xca\xac\xe2\x44\x4e\x19\xb9\xfa\x54\xb6\xef\x26\xb9\x31\x33\x39\x3a\xe3\x5e\xe7\xa4\x41\x8d\xdd\xfd\x63\x65\xfa\x51\x8d\xdc\xfd\x63\x65\xf9\xb1\x23\x92\xde\x5c\x40\x99\xba\x32\xd7\xec\x24\x33\x73\x65\xdb\xef\x26\x04\xe7\xd4\x99\x0d\xaf\x22\x44\x3f\x97\x26\xe0\x2c\x19\x65\x22\x92\x89\x12\x73\xcd\xd4\xdf\xcd\xf1\xd7\x43\x90\xcb\x2c\x26\x39\xd7\x87\x2d\x12\xcf\x4e\x36\x9b\x9a\x99\xd4\x86\x72\x56\x06\x63\x2b\xa1\xfe\xaf\x21\xa1\x6e\x87\x77\x5b\xb1\xbe\xcd\x4a\x6c\xfb\x65\x51\x7f\x6a\xb8\x85\x5b\xe1\x57\x9e\x1a\x9a\x29\xf5\xdf\x73\x6e\x70\xe5\x77\xd3\x95\xc1\x55\xce\xb8\x5c\xee\x08\xf4\x3f\x9d\x90\xbe\xfe\x61\xeb\xf5\xb5\xb8\x76\x39\xd7\x28\x4a\x8d\x66\xec\x2e\xed\xd4\xda\xcd\x18\x9b\x6e\x0f\x75\xc7\x84\xd5\x1f\xa9\x97\xee\xda\xa3\x5b\x90\xbe\x37\x26\x17\x1d\x7e\xf8\x6c\xda\xee\xad\xdb\x5c\x3d\xcd\x16\x0b\xc9\x37\x45\xce\xaa\xdd\x1f\x34\xaa\xed\xc9\x0f\xeb\xde\x41\x84\xcd\x8b\x46\xa7\xc6\x2d\x1f\x31\xb4\xd0\x07\x77\x4c\x7b\xe3\xf5\xf0\x21\xc8\x8b\xe2\xec\xce\xa5\x73\x7f\x87\x69\xe7\x44\xcd\xc5\x6d\xf9\x3d\xaf\x78\x7d\x94\x9d\xf2\xc9\x7d\xf9\x05\xee\xeb\xe4\x83\x4e\xb9\xbe\x21\x1e\xfb\xae\x21\x67\xea\x22\x29\x29\x6b\x73\x37\xf3\xe1\x43\xf0\x28\x07\xc5\x59\x9d\x9d\x66\xff\xe2\x4c\xe2\x4e\x7b\x9d\xd0\x86\x77\xe5\x62\xb8\x3e\xc9\x2a\x50\xa9\x04\x63\xd6\xd9\xc1\xc4\x9c\x7f\xe0\x65\x87\xf8\xcc\xe1\x78\x73\x5c\xa9\x4f\xc7\xde\xb7\x0f\x35\x9a\x4b\x5f\xef\xa7\xe0\xd3\x27\xf0\xd5\xe4\xbd\xba\x5f\xd0\xba\xe2\x3e\x5f\x2c\x9a\xcc\x2a\x11\xb5\x89\x4e\xd5\x07\x57\xf3\x17\xb1\xed\x60\x48\xa4\x5a\x06\xea\xa0\xdb\xe9\x8d\x42\xfc\x43\xf0\x5e\xaa\xb0\xef\x8d\x4b\xd8\xf1\x41\x5b\x33\x6c\x83\xe5\x57\xad\x28\xd9\xfd\x7c\x67\xfc\xa4\xde\xfc\x5e\x5b\x9e\x39\xb8\x9e\x57\x05\x07\xa5\xc6\x66\x4c\x87\xb7\x0e\xdd\x4f\x2d\x1e\x56\xef\xf4\xa2\x5b\xb7\x55\x7a\x4b\xac\xbf\x9b\xc2\x62\x0d\x57\x8f\x2b\x43\xe6\xe4\x4c\xdd\x8e\xfb\x1c\x22\xa5\xa5\xe2\x0d\x34\xbc\x65\x3f\x1a\x87\xca\x26\xe6\x95\x6e\xb4\xac\x74\xad\x23\xe3\x6d\x81\x1c\xec\x26\xf6\x3e\x43\xdd\x23\xa2\xb3\xcf\x7b\xd7\xae\x76\xb5\xc7\x9d\xfa\x54\x97\xdf\xf1\xfa\x97\xa3\xc7\xba\x4c\x35\xb1\xaf\x29\x76\xe6\xf4\x0e\x93\xb7\xfc\xbd\x81\xb5\x6f\xdd\x0e\xe9\x69\x96\x9f\xd7\xfc\x3f\x81\xb5\x75\x4f\xfe\xf4\xac\x4d\x3b\x24\xfa\x93\x6e\xf4\x55\x59\x7b\x14\xc8\x2d\xb0\xf6\x96\x75\xdf\x34\x6b\x8f\x55\xbb\x25\x6b\xeb\x02\x37\xc0\xd7\x9a\xcc\x9a\xc9\x5b\x73\xcf\xa1\xf9\x35\xca\xd7\x9f\xf1\x19\xde\x88\x7d\xe1\xe2\xbc\xfc\x4f\xe0\x6a\xd9\x8f\xcf\xc6\xd3\xb2\x82\x42\x88\x8a\xab\x67\xc9\x86\x52\x24\x73\xfc\xab\xc8\xf9\x0b\x95\x30\xb9\x11\xbe\x04\xff\xb5\x3d\x8c\xb4\x03\xe3\x47\xd9\x7f\xc7\x95\x9d\x69\xae\xba\xb7\x6e\x7e\xdf\xdf\xb0\x30\xdf\x0e\xf8\x98\x7c\x33\x72\xe2\x81\xa9\xed\x4a\x3c\x3b\x5c\xdb\x95\x30\x3a\x0c\x02\xdc\xb7\xcd\xb9\x05\x81\x37\xd2\x8b\xcf\x2b\xee\xc6\x06\x6a\x2b\x61\x27\xb3\xdf\x80\xa8\x93\xbc\x67\x0d\x16\x2b\x71\x72\xa8\xfe\x8e\x0a\xb9\xdb\xb3\x4c\x69\x6d\x2c\x91\xe5\x7f\x82\x8c\x63\x64\x2b\x83\xb1\xd7\x52\x5b\x34\x49\x40\xb5\xd3\x29\xff\xdf\x92\x71\xbe\x23\x35\x9f\x58\xb2\x52\x1f\xd3\x2b\x6d\x82\xb8\xf4\x0f\x1e\xa8\xcf\x41\x19\x6b\xb2\x0c\xa5\xdd\x8c\x62\x74\x15\xde\x23\x1d\x20\xdf\x91\xe5\x15\x58\xcf\xe0\xe8\x41\xf3\x20\x77\x67\xee\x63\x64\x69\xdd\x48\x4a\x32\x97\x13\xd4\x72\x94\xf5\x6e\xf1\x99\xef\x4d\xdb\x54\xab\xce\x73\x46\x96\x37\x6e\xc2\x6d\xcc\x62\xdc\x69\xd1\xa9\x6e\x58\xb0\xd4\xe7\xbc\x62\x6a\xdc\xc7\xf3\x7c\xe4\x2c\x77\x73\xdd\x54\xc3\xe9\x48\xc3\xeb\x93\xf3\xb2\xda\xdc\x74\x51\x66\x9b\x5a\x5e\x91\xfa\xbc\xdc\x98\x49\x0d\x4b\xb5\x36\x8f\xc6\xe5\xfa\x3c\x06\x95\xeb\x33\x35\xb8\xdc\x00\xcb\xa0\x60\x7d\x2e\x8d\x81\xf5\x79\x2c\x0a\xfe\xdd\xa7\x8f\xe6\xd0\xec\x23\xe7\xef\x19\x59\x5a\x33\x5a\xb7\xb4\x57\x3b\x34\x3d\x3c\x00\x4e\xcc\x52\xcd\x17\x11\x78\x00\xb2\x29\xf8\x2f\x10\xd9\xbb\x58\xe3\xb3\xd2\xb6\xdb\xbb\xe3\x33\x13\xb8\x67\xea\xb9\xf2\x3e\xef\xbf\xcd\x0c\xc5\x3b\x40\x7e\xe5\xfc\xbd\x55\xe3\xcd\x23\x63\xb5\xe9\xa4\x38\x18\x1c\x36\xb4\x01\xed\xaa\xb5\xe8\x25\x20\x93\x60\xc5\x5e\x9b\x82\x4d\x4a\x2b\xec\xda\x34\xcf\x96\x32\x5c\xe9\x24\xf9\x26\xc9\x08\xa3\x36\x21\xb0\x1b\x62\x56\x04\xb5\x49\xea\xf0\xa7\x6d\xb7\xda\x2c\x53\xbf\xec\xa4\xd7\x36\x5d\x2d\xb8\x8b\x7e\x5a\x23\x69\x0e\xed\x4f\x37\xd5\x11\x31\x87\xed\x47\xa7\x7c\x23\x5d\x0e\x9b\xdf\x6e\xba\x95\x2b\x87\xe6\x97\x9b\xd6\xca\x93\xc3\xe6\xf7\xe8\x64\xfd\x19\xdf\xed\x8c\xca\xe9\xfa\xe4\xb6\x4e\xee\x64\x5d\x9f\x5d\x9d\x55\x0c\xaf\x6f\x31\x5d\x53\xc3\xfd\x49\xb6\xb7\x11\x24\xfa\xeb\x6a\x3a\xae\x91\x18\xb6\xa8\x23\x28\x5a\x68\x56\xac\x7c\x7f\xbe\x58\xbc\xe6\xa4\xec\xe6\x6b\x63\xa5\x28\x41\x78\xdb\x3d\x2d\x0d\xfe\xda\x3b\x5a\x12\x4c\x2b\x1a\x24\xa5\x1c\xea\x1f\xa3\x14\xfc\x19\x1f\x0e\x0c\x53\xf0\x92\x93\xcf\xbf\x9d\xa5\x09\x58\x56\xf5\xd9\xe9\x57\x0f\x1d\x9c\x81\x1b\xa1\xe1\x86\x7e\x2c\x65\x38\x64\xb6\x03\x25\x6f\x22\xd2\x2d\xc9\xb3\x53\x60\xe7\xf3\x6f\x39\x1c\xa3\x07\xdf\xa6\x46\xe7\x98\xbb\x7f\x12\xde\x39\xf6\x06\xdf\xe8\x1b\xe3\xdb\xbd\xc1\xba\x8e\x62\xd4\xf4\xbd\x77\x52\xd0\x43\x6f\xe7\x58\x7b\x94\x3a\x6e\x44\x5f\xda\x4c\x23\xed\xf9\xf8\x75\x4f\xb9\xe5\x98\x19\x81\xa2\x19\xf7\x50\xfd\x1d\x13\x27\xf8\x33\x5e\xdf\x1e\x16\x27\xe7\x35\xfd\xe9\x3f\xe6\xe0\xab\xe9\xcc\x67\x97\x5a\xce\xf9\xe8\x15\xa4\xd3\xff\xc2\xd3\xa6\x5f\x8e\x1e\xdf\xd8\x81\x53\x33\xbc\x86\xa3\x1c\xda\x3d\x6c\x3f\x46\x79\xeb\x33\xde\x7f\x1d\xe5\xad\x1f\xff\x43\x0e\x9f\x4c\x57\x6e\x83\xaf\x2c\xb9\x5c\x6d\xe2\xff\x5f\x76\xae\xf1\xcb\xd1\xe3\x1b\x3a\xda\x30\x23\xdb\xb2\xd4\x8f\xe6\x80\xc3\xfc\x1c\x65\xa7\x5b\xbf\x7b\x79\x5e\xd3\xef\xfe\xfd\xf7\xa9\x0c\x96\xbf\xbb\x85\x93\x8e\x86\x48\xae\xac\x46\xff\x72\xf4\xb8\xb3\xab\x64\xbf\x77\x3f\xf2\xb8\xb5\x63\x87\xb6\xa9\x37\x70\xf2\xa0\x07\xaa\xe5\x8d\xef\xf4\xbe\x86\xfe\x35\xca\x19\xb7\x60\xaa\xfa\x73\x1d\x41\x9c\xd7\xf4\xd5\xed\x9e\x42\xc8\x79\x7b\x9b\x83\x88\xf3\x9a\x1e\x6d\x71\x16\x71\x5e\xd3\x5f\x6f\xf9\x38\x42\xb6\x6c\xbb\x13\x89\xf3\x9a\x7e\xbf\xf9\x50\x42\x8e\xc1\x36\xe7\x12\xcd\x58\xad\xdf\xe0\x6f\x10\xbc\x31\xdb\xd1\x36\x07\x14\x2e\x82\x37\x43\xdc\xea\x98\xa2\x41\xcb\xc6\x6c\xaf\xfe\xd3\x0e\x2b\x14\x36\xff\x88\xf3\x8a\x71\x09\xef\x9c\x5a\xa8\xc8\x0d\x07\x17\xc3\x93\xcc\xb6\x6b\xf1\x4d\x13\xcd\xee\x27\x18\x37\x7f\x8a\xd0\xf0\x9b\x9e\x01\x7e\xed\x9d\x25\x34\x7c\xd6\x4d\x46\x6d\xf2\x51\x73\xa8\xe0\xa4\xe3\x36\xfd\x57\xe7\x68\xc1\xc9\xe1\x39\x10\xda\x03\x06\x27\x83\xdf\x66\xf8\xde\x1e\x33\x38\xc9\x41\x9b\xfc\xaa\x3d\x6c\x70\x32\x34\xe7\x0d\x8e\x44\x39\x6c\x3f\xdc\xdd\x7d\x47\x98\x1c\xb6\x1f\xbd\x1c\x47\xed\xf1\x43\xfb\xd5\xcb\xf3\xab\x7b\x08\xe1\x7e\xf7\x61\x39\x47\x11\xce\x67\x2f\xd7\xf7\xcd\x81\x44\xf3\xd1\xcb\xf1\xca\x39\x96\x70\x3e\x47\xe7\xf0\x5b\xbf\x7e\xac\x91\x79\x6b\x87\x13\xb6\xba\xdb\x50\x42\x07\x8e\x28\xae\xa5\x9a\x76\x0f\x2a\x9a\x88\x9d\x76\x78\x9d\xd2\xce\x0e\x6f\x07\xe6\xa4\xcd\x3a\xbc\x1f\xdc\x49\xb8\xd2\xb9\x45\x5b\xcf\x4d\xec\x8d\x38\xa7\x17\x2d\x35\x1d\x36\xbf\x47\x69\xfd\xd6\xaf\xe4\x9e\xd7\xf4\xf5\xed\x1d\x63\x98\xda\x6e\x65\xef\x62\xf8\x30\xe3\x5a\xd4\xbe\xb2\x5d\xdd\xa5\xc3\xdd\x68\x7e\x0b\x42\xde\x9e\x84\x6f\xe6\x78\xc3\x0c\xd3\xbf\xdf\x09\x87\x8b\x81\x81\x43\x8e\x2e\xb6\x47\xce\x39\x56\x69\xe7\x06\x35\xac\xad\x28\xe8\xe6\xce\x3c\xcc\x40\xb6\x92\xe8\xb5\x39\xf9\xb0\x23\x3c\x26\x87\xfe\x5c\xfe\x59\xb2\xaa\xf8\x7e\x83\x1b\x8c\x04\xee\xbe\x54\xe0\x8e\x6b\xd0\x35\x56\x3a\xfd\xde\x82\xe1\x8c\x94\x15\x7f\x5a\x15\xcf\x49\x9d\x7d\xe0\x13\xed\xd8\xd1\x31\x38\x40\xd4\xe1\x47\xce\x3f\x02\x35\xeb\x9a\xf4\x03\xd7\xf9\x81\xb2\x0f\xa5\xe8\xb8\x61\x11\xf9\xd9\xe8\xb9\xb6\x0a\x70\x08\xee\x37\x80\xee\x62\x08\xe1\x03\x88\x1e\x40\x74\x04\xe1\xbe\xfa\x7f\x0e\x21\xfc\xbf\x77\xf5\x2b\xee\x6f\x7a\x2d\xbb\x03\xb6\xb3\xf0\xb8\x8a\x0a\x7b\xe4\x70\x5e\xd3\x9f\x25\x48\xcd\x81\xdb\x0e\x95\x65\xdf\xac\x2a\xba\xee\xc4\x35\x45\xdf\x90\x5f\x7f\xdb\xd7\x01\x3f\x33\xf8\x4f\xe5\x4c\xff\xb8\xce\x4e\xd7\x79\x44\xb9\x8e\x93\x18\x05\x7a\xa3\xa7\x98\x78\x57\x13\x4a\xb6\x86\x71\xde\xf0\x8c\x09\xa5\xeb\x3b\x48\xba\xf2\xd2\x5b\xb7\xac\xb1\x84\x49\x16\x3c\x67\xa4\xdc\x44\xaa\x4e\xa7\xde\xdc\xfd\x60\xa9\x5c\x29\x27\xf7\x1e\xbe\x9d\x6d\x87\x8e\x37\x77\xff\x69\x4b\x6a\x0d\xfe\x2a\x45\xcf\x6d\x51\xbb\xc6\xdd\xba\xe4\xc2\x96\x34\xdb\xb1\x5b\x17\x3c\xb5\x05\xed\x11\xc7\xd6\x25\x8b\xa6\x9f\xcd\xa9\xe3\xd6\x65\x4b\x5b\xb6\x7d\xfa\xba\x75\xd9\xbc\xad\xb7\xb5\xbd\xb0\x01\xc0\x2a\x47\xd8\x13\x1e\xb9\x22\x6d\xad\xb6\x37\xa6\x81\xa4\x54\x9d\xff\x72\xf4\x78\x22\x05\xab\x9a\xd5\xd1\x74\x06\x56\x63\xf1\xf4\xed\x88\x3f\x33\x7c\x0b\x56\xaf\xaf\x64\x72\x7a\x51\x94\x6b\xcc\x36\xc3\xf8\x7a\xde\xcc\xb6\x33\x16\xac\xdb\x30\xa8\xc4\xdd\x45\x22\x8a\x52\x5f\x88\x48\x40\x8e\x29\x81\x98\xb2\x10\x47\x38\x4e\xfc\x30\x4a\x59\x4c\x83\xd0\x4f\xb9\x17\x45\x14\x47\x42\xfe\x4b\x69\xca\x30\x46\x51\xca\xa9\xb8\x3b\x1d\x1a\x81\x5b\x30\x1b\xfb\x1f\x35\x02\x5e\xe2\xa5\x51\x12\xe0\xc0\x27\x5e\x98\x86\x9c\x8a\x84\x26\x9c\xf1\xd0\x8b\x12\x2f\x89\x29\xc1\x01\x4e\x03\x2a\xc2\x94\x72\x96\x26\x34\xa6\x21\xf3\x50\xca\x12\xee\x25\x3c\x4a\x49\x80\x79\x44\xd3\xc4\x8f\x7d\x8f\x7a\x09\x61\x7e\xe2\x13\x16\x86\x28\x4c\x79\x94\x84\x09\x8d\x52\x1f\x45\x1e\x09\x02\x94\xf8\x94\x87\x2c\x65\x8c\x27\x9c\x85\x83\xa3\xe7\xdd\x82\xad\xc4\xff\xac\xd1\x43\x31\x4e\x59\x98\x12\xce\xc2\x84\x53\xc2\x11\x0d\x59\xca\x05\x0f\x83\x00\x32\xc1\x62\xe6\x51\xc1\x08\x0f\x53\xc1\x18\x24\xd8\x43\xc4\x0b\xfc\xc8\xa7\x7e\x14\x12\xc4\x92\x24\xa5\x11\x4f\x28\x8c\x82\x30\x4d\x51\xc2\x13\x42\x63\xc9\x63\x8c\x32\xc2\x08\x4f\x43\x4f\xfe\x4b\x42\xf9\x2f\x65\xf2\x1f\x4b\xe4\xbf\xe1\xd1\xbb\x05\x73\x66\xff\x51\xa3\xa7\xa5\x1f\xe1\x34\xe2\xb1\x96\x81\x42\xa4\x69\x14\x6b\x49\x98\xc4\x4c\xc4\x44\xcb\x43\x21\x92\x38\x09\xb5\x54\xa4\x41\x0a\x59\xa0\x65\x23\xf5\x13\x9a\xf8\x5a\x42\x8a\x28\x0d\x99\x91\x93\x34\x92\xff\xb4\xb4\x94\xc3\x16\x33\x2d\x33\x13\xce\x08\x0f\x86\x47\xef\x4f\xe5\x9d\x9a\x79\x1a\x77\xa3\xc3\x17\xec\x7c\x26\xc4\xbc\x63\xc7\x18\xfd\x1a\xfa\xd0\xfb\x55\x9f\x91\x40\x56\xdb\x62\x35\x14\x27\xf2\xf1\x79\xca\x4f\xf8\x22\xbb\x78\x56\x18\x23\xbf\xdb\x50\x5e\x8b\x3f\x0b\x92\x5a\x38\x1a\x86\xa7\x94\x99\x79\x20\x03\x38\xdd\xca\x73\xe8\x46\x98\x0f\xb0\x6f\x81\xa2\x39\x9c\x0e\x52\xd9\xbf\xc1\x49\xfc\xd8\xa9\xf2\x47\x52\x9e\xde\xda\x21\x3c\x2d\x8a\xc5\x4a\x65\xff\x96\xfc\xa3\x1e\xb8\x90\xf2\x74\x6b\x0f\x4b\x7f\x10\x47\x3c\x40\x9a\x25\x22\xc5\x13\x5e\x70\x43\x4c\x11\xcb\x75\xc4\x3c\x50\xa0\xe3\xa9\x3d\xd7\x93\xc3\xfb\x67\x47\x08\x0e\x6f\x0f\x1f\x25\xc9\xf2\xb4\xf8\xb8\xb5\xfd\xfe\xf5\x75\xec\x76\x6e\x93\xf6\xb6\x20\x8c\xcf\x1a\xeb\xc0\x0d\x82\x4f\x9f\x40\xad\xac\xd0\x81\x1a\x3c\xe8\xec\x74\x6b\x17\x6d\xea\xa1\x56\xe5\x7a\x6c\xae\x8d\x03\x2c\xb5\xdb\xa7\xbb\x38\x3f\x01\x87\xc0\x0b\x21\xb8\x27\xa1\x00\x04\xa1\x9b\x28\x4b\xa3\x79\x20\x13\xe6\x81\xcc\x52\xb9\xa9\x92\x64\xe0\x3c\x56\x40\x93\x36\xb5\x71\x7b\xa2\x50\x78\x5f\x79\xcf\x1a\x5a\x9e\x7a\xb7\xe0\xf1\xfe\x73\x09\xdf\x53\xf2\xee\x94\xdc\xb8\xf4\x1d\xbb\x74\x95\xe5\x82\x97\x79\x71\xe3\xf5\xb1\x91\xfa\xce\x16\xa4\x1a\xe8\xde\xcd\x6b\xbb\xad\x85\x6f\x72\x7a\x66\xac\x7b\x36\x5b\xd5\x79\x63\x89\x54\xdb\x3a\x3d\x18\xf0\xfc\x5a\xf7\x2e\x78\x68\x73\xb7\xab\x8e\xeb\xb3\x5c\x7b\xee\xe8\xf8\xab\xaf\xc1\x3d\x90\x4f\xa7\xd3\xb7\xad\xa7\xd8\x9d\xb5\x2b\xd5\x81\xeb\xeb\xe0\xbe\x0f\x51\xe0\xfb\x3e\xc4\x41\xe8\x07\xd0\x0f\x22\x3f\x80\x41\x90\xf8\x21\x8c\x02\xe2\x87\x30\x0e\xa8\x1f\x42\x12\x30\x3f\x84\x69\xc0\xfd\x08\xb2\x10\xfa\x11\xe4\x21\xf2\x23\x04\x43\xcf\x8f\x10\x0a\x7d\x3f\x42\x5e\x18\xf8\x31\xf2\xc3\xc8\x8f\x51\x18\xc6\x7e\x8c\xa2\x30\xf1\x63\x14\x87\xc4\x8f\x11\x09\xa9\x1f\xa3\x34\x64\x7e\x8c\x68\xc8\xfd\x18\xb1\x50\xf8\x31\x12\x11\xf4\x63\x0c\x23\xe4\xc7\x18\x45\x9e\x1f\x63\x2f\xf2\xfd\x18\xfb\x51\xe0\xc7\x38\x88\x42\x3f\xc6\x61\x14\xf9\x31\x8e\xa3\xd8\x8f\x71\x12\x25\x7e\x84\x49\x44\xfc\x08\x53\x15\xb2\x28\xf5\x23\xb9\x0c\xf7\x23\x2c\x22\xe6\x87\x1e\x8c\xb8\x1f\x7a\x58\x85\x5e\x24\xfc\xd0\xf3\x63\xe8\x07\x5e\x10\x23\x3f\xf0\x22\x15\xc6\x31\xf6\x7d\x2f\x89\x3d\xdf\xf7\x88\x0a\xd3\xd8\xf7\x3d\x8f\xa9\x90\xc7\x81\x8f\x3d\x21\x43\x1f\xc6\xa1\x8f\x7d\x14\x87\x3e\xf2\x71\x1c\xf9\xc8\xf7\xe3\xc8\x87\x7e\x10\xc7\x3e\xf4\xc3\x38\xf6\x84\x1f\xa9\x30\x8e\x13\x8f\xfb\x89\x0a\x89\x0a\x69\x4c\x3c\xe6\x33\x15\xf2\x98\x78\xd4\x17\x32\x0c\x60\x9c\x7a\x69\x80\x54\x88\xe3\xd4\x23\x81\xa7\x42\x3f\xa6\x5e\x12\x04\x2a\x0c\x63\xea\xc5\x41\xac\xc2\x24\xa6\x5e\x14\x10\x15\xa6\x31\xf3\xc2\x80\xaa\x50\xae\x70\x83\x80\xab\x50\xc4\xcc\x93\x03\x26\x43\x14\x33\xcf\x0b\xb1\x0a\xbd\x98\x79\x38\xf4\x63\xee\xe1\x30\x88\xb9\x27\x07\x47\x86\x91\x0a\xe3\x98\x7b\x30\x4c\x54\x48\x62\x8e\x45\x98\xaa\x90\xc6\x1c\xf3\x90\xa9\x90\xab\x50\xc4\x1c\xb3\x08\xaa\x10\xc5\x1c\x53\x13\x62\x15\x7a\x31\xc7\x69\xe4\xab\x30\x88\x39\x26\x51\xa8\xc2\x48\x85\x71\xcc\xe5\xc8\xa9\x90\xa8\x50\xd6\x12\x47\x54\x85\xb2\x96\x28\xe2\x2a\x94\xb5\x44\xb1\xac\x25\x8c\x91\x0a\x71\x13\x06\xb1\xa7\x42\x5f\x85\xb2\x16\x3f\x0e\x55\x28\x6b\xf1\xe2\x58\x85\x89\x0a\x49\xcc\x30\x8e\x53\x15\x52\x15\xb2\x98\x61\x14\x73\x15\x0a\x19\x26\x50\x85\x28\xa6\x18\x26\xd8\x09\xbd\x98\x22\x91\xf8\x2a\x0c\xe2\x14\x89\x24\x54\x61\xa4\xc2\x58\x85\x49\x4c\x90\x48\x48\x4c\x10\x4f\x52\x15\xd2\x38\x41\x3c\x61\x71\x82\x44\xc2\x55\x28\xe2\x18\x09\x02\x55\x88\x4c\x18\x21\x41\x70\x1c\x61\x48\xbc\x38\xc4\x90\xf8\x71\x88\x11\x09\xe2\x00\x23\x12\xc6\x01\x96\xc8\x92\x61\x1c\xfb\xd8\x23\x49\xec\x61\x9f\x90\xd8\xc3\x01\x49\x63\x8c\x03\x42\x63\x8c\x43\xc2\x62\x84\x23\x15\xc6\x84\xc7\x10\x27\x44\x44\x02\x93\x14\x46\x02\xd3\x14\x45\x1c\xb3\x14\x47\x0c\xf3\xd4\x93\x4b\xe3\xd4\x8f\xa8\x87\xd2\x20\x4a\x3d\x9c\x86\x11\xf1\xfc\x34\x8c\x12\x2f\x48\xa3\x28\xf1\xa2\x34\x8e\x62\x2f\x4e\x93\x28\xf2\x48\x4a\xa2\xd0\x4b\xd3\x34\x0a\x3c\x96\xd2\xc8\xf7\x44\x4a\x23\xcf\x87\x29\x8b\xb0\x8f\x53\x1e\x21\xdf\x4f\x25\xcf\x86\x14\x4a\xfe\xa5\x28\xe4\x3e\xa1\x28\x64\x3e\xa5\x38\xa4\x3e\xa7\x5e\x98\x06\x90\xfa\x21\x09\x30\x0d\xc2\x24\xf0\x69\x10\xc6\x41\x48\xc3\x30\x0a\x62\x1a\x85\x81\xec\x44\xe8\x07\x94\xc6\xa1\x17\x70\x9a\x84\x38\x84\x94\x84\x30\xf4\x68\x1a\x88\x30\xa0\x69\xc0\xc3\x88\xd2\x80\x86\x09\x65\x41\x1a\x52\xca\x02\x12\x72\xca\x83\x38\x82\x54\x04\x51\xe4\x31\x18\x84\x51\xc0\x60\xe0\x47\x11\x43\x81\x17\x11\x86\x02\x14\x51\x86\x03\x18\x09\xe6\xf9\x3c\x46\xcc\xf3\x59\xec\x33\xdf\x4f\xe3\x90\x05\x92\x2f\x59\xe0\xc7\x71\xca\x42\x3f\x8c\x39\x0b\xfd\x20\x81\x2c\xf2\xbd\xc4\x63\x91\x8f\x92\x80\xc5\x3e\x4c\x62\x16\x7b\x3c\x49\x59\xe2\xd1\x84\xb1\xc4\x4b\x09\x64\xc4\x4b\x08\x66\xc4\x8b\x48\xc0\x52\x2f\x24\x31\x4b\x3d\x9f\x10\x46\x3d\x4c\x18\xa3\x1e\x4c\x21\x63\x58\xa4\x98\x31\xcc\xd2\x80\x71\x9c\xa6\x31\xe3\x38\x49\x09\xe3\x38\x4e\x19\x13\x38\xa4\x90\x09\x1c\x50\xcc\x04\xf6\x68\xc0\x21\x46\x34\xe6\x10\x43\x4a\x38\x42\x82\x32\x8e\x10\x63\x90\x23\x44\x19\xe6\x18\xa5\x2c\xe0\x18\x11\xc9\x1a\x28\x61\x84\x7b\x28\x61\x8c\x7b\x28\x66\x42\x86\x1c\x73\x1f\xc5\x3c\xe0\x3e\x4a\x78\xa4\x42\xc2\x03\x44\x24\x92\x50\xca\x05\x0f\x10\x15\x88\x07\x88\x09\x9f\x87\x88\x8b\x90\x87\x18\x8a\x98\x87\x18\x89\x94\x47\xd8\x13\x8c\x47\x38\xb8\x3b\x6d\x74\x50\xa5\x62\xa8\x29\xf0\x46\x66\x16\x28\xff\xf3\x21\x82\x10\x06\x10\x41\x04\x43\x15\xc6\x10\x43\x04\x13\x88\x21\x86\xa9\x0a\x19\xf4\xa0\x07\x85\x0c\x11\x86\x3e\xf4\x91\x0f\x03\xe8\xa3\x10\x86\x30\x40\xb1\x0a\x09\x8c\x60\x88\x28\x8c\x61\x84\x38\x4c\x60\x84\x21\x24\x30\xc6\x12\x46\x82\x7d\x48\x61\x82\x43\xc8\x20\xc1\x09\xe4\x30\xc5\x29\x82\x30\xc5\x0c\x21\x48\xb1\x40\x18\x32\x0f\x21\x0f\x32\x4f\xc2\xe6\x5e\x88\x02\xc8\xbd\x18\x85\x50\x78\x29\x8a\xa1\xf0\x18\x4a\x10\xf4\x04\x22\x08\xfa\x18\x51\x04\x7d\x1f\x31\x24\x67\x38\x8e\x90\x9f\x60\x88\x90\x9f\x62\x84\x90\xcf\x31\x46\x28\x80\xd8\x47\x38\xf0\x70\x80\x70\x10\xe0\x08\xe1\x20\xc6\x09\x42\x01\xc1\x04\xa1\x80\x62\x8a\x50\x20\x64\xfd\x21\xc2\x02\xa1\xd0\xf3\x10\x42\x61\xe0\x79\x08\x86\x91\xe7\x23\x18\x26\x5e\x88\x60\x98\x7a\x31\x82\x21\xf5\x12\x28\x42\xee\xa5\x50\x44\xd0\x63\x50\x44\xc8\x13\x50\x44\xd8\x87\x50\x44\xbe\x8f\xa1\x88\x02\xdf\x87\x22\x0a\xfd\x00\xc1\x28\x92\x33\x6f\x14\xfb\x89\x0a\x09\x82\x51\xe2\x53\x84\x22\xe2\x73\x84\xa2\xd4\x17\x08\x47\x69\x80\x10\x8e\x68\x80\x91\x17\xd1\xc0\x47\x5e\xc4\x02\x39\x65\xb3\x20\x42\x41\xc4\x83\x44\x85\x04\x85\x11\x0f\x28\x0a\x23\x11\x30\x14\x45\x22\x10\x28\x8e\x44\x08\x51\x1c\xc3\x10\xa3\x24\x86\xa1\x8f\x48\x0c\xc3\x40\x85\x11\x4a\x63\x18\xc6\x88\xc6\x28\x24\x2a\x4c\x11\x8b\x51\xc8\x54\xc8\x11\x8f\x51\x04\x91\x88\x51\x84\x55\xe8\x61\x18\xa3\x28\xc0\x48\x2a\x03\x2a\x8c\x31\x8e\x51\x94\x60\x1c\xe3\x28\xc5\x5e\x8c\x23\xaa\x42\x29\xc5\x71\x0c\x25\x22\x63\x89\x4e\x14\x7b\x6a\x06\xf0\x55\x18\xe2\x28\x46\x71\xac\xc2\x04\xc7\x31\x8a\x53\x9c\xc4\x52\x72\x27\x6a\x96\x20\x31\x4a\xa0\x0a\x11\x4e\x63\x94\x78\x38\x8d\x61\xe2\x63\x1a\xc3\x24\x54\x61\x8c\x59\x0c\x93\x44\x85\x29\xe6\x91\x48\xa8\x0a\x39\x16\x91\x20\x50\x85\x48\x6a\x0e\xc4\x53\x61\xe0\xa1\x88\x93\xd0\x43\x11\x93\xe2\x37\x62\x84\x78\x5e\xc4\x48\xea\x79\x11\x25\xcc\xf3\x23\x4a\xb8\xe7\x47\x69\x0a\xbd\x20\x4a\x53\xac\x42\xcf\x0b\x23\x92\x06\x2a\x8c\xbc\x28\x4a\xd2\x58\x85\xc4\x8b\xa3\x38\xa5\x9e\x9c\x42\x98\x97\x44\x51\x2a\x3c\x12\x45\x14\x7a\x24\x0a\x29\xf6\xd2\x28\xa0\xbe\x47\xa3\x80\x06\x1e\x8d\x7c\x1a\x79\x2c\xf2\x68\xec\xf1\xc8\xa3\xc4\xe3\x11\xa6\xd4\x13\x11\xa2\xcc\x87\x11\xa2\xc2\x87\x11\x64\x92\x45\x04\xc3\x3e\x0e\xa5\xbc\xf3\x42\xce\x02\xdf\x0f\x99\x94\x6b\x21\x65\xb1\x0a\x13\x3f\x0c\x53\x96\xfa\x51\x48\x18\xf5\xe3\x30\x61\xdc\x4f\xc2\x98\x09\x9f\x84\x31\x87\x3e\x0d\x25\xe2\x59\x18\x72\xcf\xe7\x61\xc0\x7d\x5f\x84\x3e\x0f\x02\x18\xfa\x3c\x0a\x70\x28\x15\x21\x2f\xc4\x3c\x09\xfc\x10\x73\x12\x84\x21\xe2\x69\x10\x85\x90\xd3\x20\x0e\x21\x67\x01\x09\x04\xe7\x41\x1a\x70\x2e\x02\x16\x70\x01\x03\x11\x70\x81\x42\x18\x48\xa1\x87\x55\xe8\x07\x54\x78\x61\x10\x50\xe1\x87\x91\x0a\x93\x80\x8a\x20\x54\x07\x2b\x21\x55\x21\x0f\xa8\x88\x22\xa8\x42\x1c\x50\x11\x47\xbe\x0a\xc3\x80\xca\x89\x37\x60\x22\x89\x12\x15\xa6\x01\x13\x24\x92\x75\x91\x48\xd6\x45\x62\x14\x08\x91\xc6\x9e\x0a\x83\x10\x8a\x34\x8e\x42\x24\x68\x9c\xa8\x90\x84\x58\xd0\x98\x86\x9e\xa0\x31\x0f\x7d\x41\x13\x18\x06\x82\x25\x38\x0c\x85\x44\x50\x24\x58\x12\x86\xb1\x60\x49\x1c\x26\x82\x25\x24\x24\x82\x25\x69\x98\x0a\x9e\xb0\x90\x0a\x9e\x88\x90\x09\x4e\x50\xc8\x05\x27\x5e\x28\x04\x27\x41\x84\x04\x27\x51\x84\x05\x27\x49\xe4\x09\x4e\x48\xe4\x0b\x4e\x68\x14\x0a\x4e\x78\x14\x09\x9e\xc2\x28\x16\x3c\xc5\x11\x11\x3c\xf5\xa3\x54\xf0\x34\x8c\xa8\xe0\x69\x14\x71\xc1\xd3\x24\x12\x82\xa7\x69\x8c\x04\x4f\x59\x8c\x05\x4f\x45\xec\x0b\x4e\x51\x1c\x08\x4e\x71\x1c\x09\x4e\xfd\x38\x16\x9c\x86\x31\x11\x9c\xc6\x31\x15\x9c\x12\x29\xfe\x29\x8d\x85\xe0\x94\x25\x50\x70\x2a\x12\x2c\x38\x43\x89\x2f\x38\xf3\x92\x40\x70\x16\x24\x91\xe0\x2c\x4a\x12\xc1\x59\x9c\x10\xc1\x18\x49\xa8\x60\x8c\x26\x5c\x30\xc6\x09\x14\x8c\x43\x82\x04\xe3\x98\xc8\x59\xc0\x23\x81\x60\x3c\x20\x91\x9c\x11\x48\x22\x18\x4f\x08\x11\x8c\xa7\x84\x0a\xca\x29\xe1\x82\x72\x9e\x42\x41\x05\x4c\xb1\xa0\x02\xa7\xbe\xa0\xc2\x4f\x43\x41\xa5\xb2\x28\xa8\x88\xd2\x44\x50\x91\xa4\xa9\xa0\x22\x4d\x99\xa0\x82\xa5\xe6\x7c\x52\x79\x78\xd0\xab\xc9\x5b\x9a\x5a\x88\x9a\x54\xa8\x0a\x39\xf4\x20\x46\x32\xaf\x9e\x5a\x3c\x33\xb5\x44\x30\x84\x3e\x4a\x60\x04\x03\x94\xc2\x18\x06\x88\xc1\x04\x86\x48\x40\x02\x23\x35\xa9\x44\x6a\x52\x89\xd5\xa4\x12\xab\x49\x25\x51\x93\x4a\xa2\x26\x15\xe2\x41\x24\x35\x38\x8c\x7c\x98\x7a\x3e\x0a\x60\xea\x45\x28\x84\xa9\x97\xa0\x18\x52\x8f\xa2\x04\x52\x8f\xa3\x14\x52\x1f\x21\x0a\xa9\xef\x21\x0e\xa9\x1f\x20\x01\xa9\x5c\xe8\x40\xea\x13\xec\x41\xea\x53\x59\x8f\x2f\xa4\x06\x14\x20\x1c\xc3\x34\xf0\x70\x02\xd3\x20\xc0\x29\x4c\x83\x08\x33\x98\x06\x09\x16\x90\x04\xa9\x87\x20\x09\xa8\x87\x21\x09\xb8\xe7\x43\x12\x08\x2f\x84\x49\x88\x3c\x25\xe3\xbc\x04\x26\xa1\xe7\xa5\x30\x09\x7d\x8f\xc1\x24\x0c\x3c\x0e\x93\x30\xf4\x21\x24\x61\xe4\x63\x48\xc2\xd8\xf7\x55\x18\x40\x12\x26\x7e\x04\xd3\x90\xf8\x89\x0a\x09\xa4\x61\xea\x53\x15\x32\xc8\x42\xea\x0b\x19\x06\x08\xf2\x90\x06\x18\x72\xa9\x3f\x41\x11\xb2\x20\x50\xa1\x5c\xf8\xc9\x29\x44\x86\x04\x21\xc9\xbc\x08\x87\x3c\x60\x2a\x14\xc8\x0b\x79\x88\x54\x88\x91\x1f\xf2\xd0\x47\x41\xc8\xc3\x40\x85\x11\x0a\x43\x1e\x26\x2a\x24\x28\x0a\x79\x48\x51\x1c\xf2\x90\xa9\x50\xa0\x24\xe4\x11\x52\xa1\xd4\x88\x79\xe4\xab\x30\x40\x69\xc8\xa3\x08\xd1\x90\x45\xb1\x0a\x09\x62\x21\x8b\xa8\x0a\x19\xe2\x21\x8b\x04\xe2\x21\x8d\x21\x92\x8b\x17\x8c\x61\x48\x63\x1f\xc3\x30\x95\xaa\x75\x98\xc6\x91\x0a\x95\xf6\x1c\x13\x15\x52\xec\x85\x49\xcc\x54\x28\xb0\x1f\x26\x89\x5c\x05\xc7\x09\x56\xa1\x87\xc3\x30\x4a\x02\x15\x46\x38\x0a\xc3\x24\x56\x21\xc1\x71\x18\x24\x29\x4e\x42\x3f\x61\x2a\x14\x98\x84\x1e\x81\x2a\xc4\x38\x0d\x31\xf1\x30\x0d\x91\xd4\x7f\x43\x48\x42\xcc\x42\x48\x62\xcc\x03\x41\x12\xcc\x03\x4e\x52\x2c\x02\x4e\x98\x07\x03\xa9\xd7\xc1\x80\xa6\xd0\x43\x41\x9a\x22\xa5\xe5\x7b\x2a\xf4\x3d\x2f\x48\xd2\xd0\xf3\x83\x38\x8d\xbc\x20\x88\xd2\xc4\x0b\x82\x30\x25\x52\x8e\xa6\x72\x19\xe8\xa7\xcc\x8b\x03\x2f\x15\x5e\x12\x60\x39\x91\x04\x88\x22\x8f\x04\x90\x7a\x9e\xe4\x50\xdf\x93\xca\x78\x28\x97\x9f\x34\x92\x4b\x51\x2a\x97\xa8\x29\x25\x3e\xf4\x09\x4d\x7d\xe4\x27\x94\xfa\xd8\x8f\x29\xf7\xe5\x6c\x26\x7c\x39\x7b\x40\x3f\xf0\x03\x86\xfd\xd0\xf7\xe5\x1c\xe7\x7b\xcc\xf7\x63\x1f\xb3\xc0\x27\x3e\x62\x91\x9f\x7a\x82\xc5\x3e\xf5\x38\x4b\x7c\xe6\x31\x46\x7c\xee\x51\x96\x06\xd0\x4b\x19\x0b\x90\x47\x18\x0f\xb0\x17\x33\x11\x78\x5e\xc4\x61\x10\x78\x21\x47\x81\xd4\xf3\x71\x10\x79\x3e\xf7\x82\xc4\xf3\xb8\x1f\x10\x0f\xf1\x20\xa0\x1e\xe4\x61\xc0\xb0\xe0\x51\xc0\x31\xe7\x71\x08\x31\xe3\x49\x88\x70\x2a\xe7\x5e\x4c\x78\x1a\xfa\x38\xe1\x69\x18\xe2\x98\xd3\x30\xc2\x21\x67\x61\x82\x03\xce\x43\x82\x7d\x2e\xe4\xdc\x29\x75\x5b\x8c\x04\x0c\x05\x86\x02\x45\x08\x09\x81\x22\x0f\x31\x81\x23\x1f\x51\xe1\x45\x21\x4a\x85\x5c\xf5\x27\xc2\x8f\x12\x14\x8b\x20\x4a\x51\x24\x02\xb9\x6e\x10\x61\xc4\x91\x2f\xc2\x18\x22\x4f\x44\x31\x46\x58\x44\xb1\x8f\xa0\x88\xe3\x00\x0a\x11\xc7\x11\xe4\x22\x8e\x13\x48\x45\x12\xa7\x30\x15\x49\x4c\x21\x11\x49\xcc\x61\x22\x48\x02\x61\x2c\x07\x15\x46\x82\x24\x3e\x8c\x44\x9a\x84\x30\x14\x69\x12\xa9\x30\x51\x61\xaa\x42\x06\x23\x41\x13\x21\x43\x82\x60\x2c\x28\xf1\x60\x22\x28\x09\x20\x11\x72\xed\x43\x05\x25\x31\x64\x82\x12\x02\x85\xa0\x84\xca\x35\x01\xe1\x08\x0b\x9a\x42\xe4\x0b\x9a\x62\x14\x0a\x39\x6c\xb1\x48\xd3\x10\x11\x21\xe7\x0e\x26\xd2\x94\x20\x21\xd2\x94\x4a\xb5\x3e\xe5\xd8\x13\x84\x42\x1c\x0a\x42\x31\x8e\x05\xa1\x3e\x26\x82\xd0\x10\x33\x91\xd0\x08\x0b\x91\xd0\xc4\xc3\x22\xa1\xa9\x17\x88\x98\x32\x2f\x12\x31\x15\x1e\x11\x11\x43\x1e\x13\x11\xf3\x34\x9b\xfb\x9e\x08\x59\xe4\x87\x22\x60\x89\x9f\x88\x80\xa5\x3e\x15\x3e\x63\xbe\x10\xbe\x1c\x5b\xe1\xcb\x51\x15\x1e\xf7\x02\x22\x3c\x1e\xc8\x69\x9e\x87\x21\x12\x98\xc7\x61\x20\x30\x27\x61\x22\x10\xa7\x21\x13\x88\xb3\x08\x09\xc4\x45\x14\x08\x24\x50\x94\x08\x2c\x70\xc4\x04\x16\x7e\x8c\x85\x27\x82\x38\x14\x9e\x90\x93\x9c\x2f\xe2\x98\x8b\x40\x24\x09\x16\xa1\x20\x49\x28\x62\x91\x26\x44\x24\x82\x26\x4c\x10\xc1\x08\x12\x54\x08\xe2\xb7\x53\x8b\xde\x38\xbc\xc1\x99\x85\xc1\x38\x8e\x10\x84\x51\x1c\x4b\x6d\x30\x4e\x50\x08\xa3\x98\xa0\x04\x86\x31\x45\x29\x0c\x63\x86\x18\x0c\x63\x8e\x21\x0c\x63\x21\xc5\x4c\x02\xb1\x0f\xc3\x04\xe1\x10\x06\x89\x94\xe1\x41\x82\x31\x81\x41\xe2\x61\x0a\x83\xc4\xc7\x1c\x06\x49\x80\x05\x0c\x92\xd0\x43\x30\x48\x22\xcf\x53\x61\x00\xfd\x24\xf6\x22\xe8\x27\x89\x17\x43\x3f\x21\x1e\x51\x21\x85\x7e\x92\x7a\x1c\xfa\x09\xf5\x84\x0c\x7d\x04\xfd\x84\xf9\x1e\xf4\x12\xee\xfb\x2a\x0c\xa1\x97\x08\x3f\x56\x61\x02\x65\xc1\x14\x7a\x04\xf9\x14\x62\x82\x7c\x0e\x31\xc1\x01\x54\x21\x82\x98\x78\x81\xa7\xc2\x00\x62\xe2\x07\x21\x44\xc4\x0f\x62\x15\x26\x10\x91\x20\x48\x55\x48\x21\x22\x61\xc0\x65\x18\x42\x15\x22\x08\x49\x14\x7a\x2a\xf4\x55\x18\xaa\x30\x82\x90\xc4\x61\xa2\x42\xa2\x42\xaa\x42\xae\x42\x21\x43\x89\x44\x12\x47\x18\x22\x12\x47\xbe\x0a\x03\x15\x46\x2a\x8c\x55\x28\x85\x66\x1c\xa5\x2a\x64\xd0\x23\x71\xc4\x65\x18\x43\xe8\x93\x38\x46\xd0\x27\x51\xec\xc1\x80\x44\xb1\xaf\xc2\x10\x86\x24\x8c\x23\x18\x91\x30\x8e\x61\x4c\xc2\x98\xc0\x84\x04\x71\x0a\x09\x09\x62\x06\x53\x12\xc4\x1c\x52\xe2\xc7\x02\x32\x22\xd7\x47\x9c\x78\x09\x86\x82\x78\x89\x8f\xe4\xea\x30\x40\x88\x20\x39\x69\x12\x94\xc4\xc8\x27\x30\x49\x50\x90\x88\x84\xa0\x30\x11\x09\x45\x51\xc2\x13\x86\xe2\x84\x25\x1c\x25\x09\x23\x10\x91\x84\x12\x84\xd2\x24\x25\x18\xb1\x84\x48\xc1\x95\x10\x12\x20\x91\x24\x24\xc4\x30\x89\x49\x84\x51\x12\x91\x18\xe3\x24\x24\x04\x7b\x49\x40\x52\xec\x27\x3e\xa1\x38\x4c\x7c\xc2\x70\x94\x78\x84\xe3\x38\xc1\x29\xc4\x49\x82\x52\x84\x49\x02\x53\x8c\xd3\x58\xa4\x1e\xa6\x31\x4f\x7d\xcc\x63\x96\x06\x58\xc4\x34\x0d\x3d\x18\xa7\x69\xe4\xa1\x98\xa4\xb1\x87\x63\xb9\x78\xf0\xe2\x38\x4d\x3d\x3f\x96\x4b\x88\x20\x8e\x52\xe6\x45\x71\x98\x72\x2f\x8e\x03\x29\xff\x63\x5f\xca\xff\xd8\xa3\xc8\x4b\x63\x4c\xb1\x47\x63\x44\x3d\x8f\xc5\x52\xf1\xe0\x91\xa0\x81\x0f\x23\x4e\x43\x1f\x45\x8c\x46\x3e\x8e\x28\x8d\x7d\x2f\x4a\x69\xe2\xfb\x11\xa1\xc4\x0f\x22\x39\x23\x84\x91\x9c\x11\xa2\x28\xa6\xd4\x4f\xa2\x88\x32\x5f\x2e\x4e\xb8\x9f\x2a\x9d\x9d\x46\x3e\x83\x3e\x8b\x3c\x86\x7c\x1e\x61\x86\x7d\x11\x21\xe6\x05\x28\x42\xcc\x0f\x70\x04\x99\x14\xf6\x82\x05\x81\x2f\x85\x74\x10\x84\x8c\x45\x41\x28\x97\x22\x41\x14\xa6\x2c\x09\xe2\x90\x30\x12\x10\x15\xa6\x61\xc2\xd2\x80\x86\x31\xa3\x01\x0b\x23\xc6\x02\x1e\x86\x8c\x07\x22\x0c\x18\x0f\x51\xe8\x33\x11\xca\xe5\x07\x0c\xbd\xd0\xe3\x28\x94\xcb\x0f\x1c\x06\x21\xe2\x38\x0c\x43\xb9\x86\x97\x7a\xb2\x5c\x48\x70\x1e\x84\x24\x60\x5c\x2e\x27\x18\x57\xcb\x09\x1e\x85\x3c\x48\x79\x14\x8a\x80\xf0\x38\x82\x41\xc2\x93\x08\x05\x31\x4f\x22\x1c\x44\x9c\x44\x7e\x10\xf1\x34\x0a\x82\x90\xa7\x51\x18\x04\x9c\x46\x51\xe0\x4b\x9d\x39\xf0\x38\x8b\x48\x80\x39\x97\x0b\x68\x2e\x22\xaa\x42\x1e\x40\x29\xba\x7d\x21\x60\x0c\x7d\x2e\x50\x8c\x7c\x26\x50\xec\xf9\x54\xe0\xd8\xf7\x53\xe1\xc5\x81\x0a\x23\x9f\x08\x3f\x8e\x7d\xc9\x9c\x89\x1f\x8b\x20\x4e\xfd\x48\x04\x31\xf5\x43\x11\xc6\xcc\x0f\x44\x18\x0b\xdf\x17\x51\x02\x55\x88\x7c\x4f\x44\x89\xe7\x63\x11\x27\xbe\x8f\x44\x9c\x48\x45\x2b\x91\x6b\x0a\x91\x24\xb1\xc7\x25\x99\x79\x5c\x90\x24\xf5\x98\x20\x09\xf5\xa8\x20\x09\xf7\x52\x91\x26\x52\x6e\xa7\x04\x79\x89\x48\x09\xf6\xd4\x9c\xa2\xc2\xc0\x93\xb3\x4c\xe8\x85\x72\x4e\xf1\x02\x41\x49\xe2\xf9\x42\x2d\x5d\x05\x23\x54\x85\xdc\xc3\x82\x11\xe1\x21\xc1\x52\xe4\x41\xc1\x52\x8c\x85\x60\xa9\xaf\xc2\x00\xcb\x25\x4a\x84\x99\xe0\x92\xa0\x04\x4f\x89\x0a\x53\x2c\x97\x31\x0c\xcb\x25\x0d\x97\x21\x85\x38\x11\x8c\x62\x15\x7a\x38\x16\x8c\x06\x38\x12\x8c\x86\x2a\x8c\x55\x48\xe4\x0a\x95\xa6\x38\x14\x94\x32\x1c\x08\x4a\xb9\x0c\x19\x54\x21\xc6\x81\x48\x99\x87\x7d\x91\xb2\x40\x85\x11\xf6\x05\x61\xb1\x0a\x09\xf6\x45\xc2\xa8\x0a\x65\xd9\x98\x09\x19\x72\x84\x03\x11\x71\xac\x42\x1f\x07\x6a\x7b\x2b\x14\x21\x8f\x71\x28\x02\x9e\xa8\x30\xc5\x91\xf0\x39\xc3\x91\xf0\x38\x97\xa1\x80\x38\x92\xb3\x0f\x8e\x04\x12\x72\xdd\x8c\x44\x80\x03\xbd\xd3\x22\xa0\x48\x30\x1a\xbe\x1a\xf4\x19\x9f\xa3\xed\xec\xa7\xb2\xe2\xff\x3c\xe7\x79\x9d\x91\xc5\xae\x47\x66\x5b\x3a\x04\x6e\x7d\x3f\x36\x35\x4e\xda\xc3\xf7\xa2\xdc\xce\x39\x30\x5d\x90\xd3\x33\x70\x08\x04\x59\x54\x7c\xad\x4f\x49\x75\x8a\x0c\x0e\xc1\xe4\x02\x3c\xb0\x7e\x71\x95\xb7\xdc\x0b\xd8\xf3\xca\xea\x34\x62\xa2\xe1\x7f\x03\x06\x4f\xe2\xd0\x0c\xd4\xca\x57\xac\x3e\xa7\xfe\x6c\x9e\x74\x1b\xaf\x88\x63\x5e\x74\x1b\x2c\x5c\xa5\x36\x5b\xe8\xab\xaf\x8e\x9d\x2a\x54\xec\xaa\xc3\xc5\x16\x25\x57\xad\xa6\x57\xd6\xad\xcb\x4d\xba\xa2\xcf\xc5\x31\xa2\x59\x71\x48\xab\x71\xa3\x3b\xbb\x83\x1f\x5a\x78\x0d\x3f\xb4\xde\xda\x67\x5e\x86\xf3\x14\xfb\x3e\xbc\x77\xef\x0e\xb8\x07\x7e\xe0\x75\x05\xea\x13\x0e\x16\xa4\xaa\x01\xd7\x2f\x09\x41\x21\xc0\x6f\xca\xd1\xe6\x6f\xf3\x3b\x40\xe5\xfb\xef\xaa\x26\x75\x46\xd5\xcf\x53\x7e\x9a\xf2\xf2\x85\x00\xc7\x3a\x25\xcb\x29\x07\x70\x8e\xe6\x50\x7d\x53\x52\xf3\x77\x45\xb9\xd4\xde\xa4\x55\xd4\x19\x29\xc9\x29\xf8\x5d\x45\x5c\x02\x05\x19\x1c\x9d\x70\xf3\xab\x2e\xc0\x3f\xcf\x79\xb9\x9c\xab\xbc\x1a\x4d\x15\xf8\xfd\xde\x25\x78\x69\x7e\x6f\x68\x20\xf8\x6f\x7e\x41\x4e\xcf\x16\xdc\x34\xf6\x78\x2e\x33\x4f\xde\xa0\x19\xc0\x33\xe0\x29\x67\xfa\xf7\xc0\xc3\x87\xe0\xf0\xaf\xc0\xbb\x23\x31\xd4\x70\xac\xca\xa8\x20\xb5\xcc\x6f\x08\xe9\xd0\x34\xef\xf0\x50\xbf\xe4\xfa\x06\x40\xb0\xaf\xe3\x56\x4f\xd5\x1b\xe2\x53\xe9\x6f\x5a\x0f\xa3\x6f\xc1\x3e\x38\xcf\x19\x17\x59\xce\x99\x1a\x32\x3d\x1a\x73\x33\x18\xe0\x50\xb5\x61\x40\x54\xff\xa9\xde\x3a\x95\x9c\xd0\xf1\x97\x48\x68\xd7\xcb\x0e\x06\xac\x7d\x05\x36\x0c\x7e\x9e\xaf\xe5\x16\x03\x63\xd7\x4b\x70\x67\x65\x71\x76\x5c\x2f\xcf\xf8\xf8\x95\x8b\x9d\x5f\x22\xba\xb0\xaf\xd1\xc7\x2e\xa0\x9d\xdd\xe6\x9f\xd7\xd9\xe2\xf8\xe7\xf3\x92\xbf\xe4\x39\xe3\x6b\xa6\xcb\x60\xb7\x2a\x3c\x5b\x45\xb1\x20\xe5\x2f\x75\xb6\x18\xc7\xa8\xb7\x63\x15\xbe\xa9\xe2\xa5\x1c\xf3\xf5\x55\x20\x6b\xda\xe3\x98\x5f\xd4\x5c\xbb\xc5\xd3\xb2\x77\x4e\xaa\x2a\x7b\x97\x83\x4f\x9f\xda\x99\x7b\x52\x93\xf2\x1d\xaf\xa7\xe0\x77\xf5\x82\x7a\x62\xdd\xf9\xa2\x03\xe5\x15\xbd\x3f\xcb\x1c\x80\xec\xfe\x7d\x99\x59\x59\xe5\x2e\xce\x4b\xca\x95\xbc\x30\xb9\xde\x64\x6f\x0f\x5a\x38\xef\xf9\x12\x64\xb9\xc9\x26\x0b\x65\xc2\x5e\x29\x9e\x9f\x95\x45\x5d\xc8\x81\x9d\x9f\x90\xea\xc5\xc7\xfc\xe7\xb2\x38\xe3\x65\xbd\xd4\xee\x8c\x75\x91\x99\x84\x30\x95\x05\x75\x23\xdf\xbc\xe7\x4b\xa5\x37\xa9\x54\xf5\x75\x00\x2e\xd5\x3f\xeb\xc4\x41\xe5\x3b\x50\x13\x8f\x42\x01\x2d\x39\xa9\xf9\xe3\x05\xa9\x2a\x67\x86\x03\xea\xe2\x52\xf3\xa5\x85\x94\x69\x41\xc6\x2b\x83\x93\x19\x90\xd4\x57\xad\xa0\x06\x6a\xd4\xa8\xc4\x21\xb4\x30\x5e\xd1\x32\x3b\xd3\x73\xb0\xca\xa5\xd0\xd2\x46\xcf\x79\x7e\x7e\xca\x4b\xa9\x22\x82\xc3\x91\x78\x39\x46\x4a\xcf\x72\xd3\x69\x91\x8b\xec\xdd\xb9\x2d\x59\x97\xe7\xfc\x40\x21\xf5\xee\x07\xb2\x38\xe7\x77\x25\xb6\xdb\xec\x53\xb7\xe8\xc7\x32\xab\x3b\xc5\xcc\x38\x74\xfa\xbe\x6c\x7a\xee\x94\x7c\xcf\x97\xee\xf7\xf4\xc0\x45\x78\x8b\xd1\xc7\x45\x5e\xd5\xe5\x39\xad\x8b\x52\x21\xae\x2e\x24\xd0\x6a\x06\xf4\x04\xfa\xb3\x45\xa5\x6c\x6e\x9b\x3c\x5d\x45\xbe\x03\xa8\xa5\x12\x17\xe4\x54\xf7\xb9\x03\x77\x1d\x94\x6e\x13\x0e\x6c\xd3\x9d\x1c\x92\x60\xc0\xe5\x64\xda\x50\x8d\xa4\x97\x99\xf9\x8b\x67\xe0\xb8\xe6\x52\x51\x6b\x67\x4f\x9d\xf2\x98\x2c\x16\x8f\x4f\x38\x7d\x3f\xc9\xf2\xaa\x26\xb9\xa4\x58\x07\xaa\xed\xed\x57\x4d\x32\xb0\x3f\x0a\xd1\xc9\xa8\x48\xfc\xa4\x2c\x3e\xaa\x37\xd6\x47\xcb\x33\xfe\xa4\x2c\x8b\x72\x72\xf7\x31\xc9\xf3\xa2\x06\x92\x27\x00\x01\xaa\x52\x40\x2a\x40\x1a\xbc\xdf\xd5\xc3\xe1\x36\xed\xac\xa8\xaa\x2c\x5d\x70\xa7\x02\xad\x4e\x4c\x2a\xbe\x10\x33\x05\xac\x69\x9a\x8c\xea\xd6\xfe\x92\x0b\x5e\xf2\x9c\xda\x26\x28\x9b\x0a\x27\xa4\xca\xf7\x6a\x90\x72\x2e\x75\xf6\x4c\xea\x82\x59\xc5\x95\x59\xa4\xf3\x33\x5e\x4e\xa6\x9d\x1c\xb2\x06\xce\x74\xd3\xec\x5d\x70\xd9\x83\xaf\xbf\x06\x13\x39\x98\x85\xd0\xdf\x87\x87\x87\xe0\x6e\xa1\xe8\xf0\xae\xba\x99\xda\x4f\x6b\x7b\x09\xbe\xd1\xd1\xfb\x40\xb6\xf8\xa0\xdb\xe3\x2c\x3f\xe1\x65\x56\x57\x93\xea\x3c\x7d\xac\x87\x4e\x35\x4b\xfd\xb6\x5d\x35\xc0\xdb\x04\xf0\x55\xa7\x0a\xd9\xba\x5e\xa2\xd4\x7e\x46\x87\xe6\x95\xcc\x2b\x35\xcb\x92\x57\x95\x6c\xc6\xe9\xb9\xd4\xd3\xb2\xfa\x84\x97\x20\xe5\x5a\x75\x2a\x4a\x67\xac\x66\x40\x8e\xe5\x5d\x70\x1f\xac\xb4\x45\xa1\xca\xb6\xbe\xa5\xfa\x56\x72\x6b\x39\x36\x71\x1a\xd8\x69\xae\xcb\x28\xbf\x03\xda\x8e\xfc\xbe\x92\x49\x8b\x73\xbe\x0f\x5a\xe4\xb4\x62\x66\x5f\x0b\x99\x19\xb0\xe2\x61\x5f\x49\x87\x19\x70\x25\x8d\x8e\x93\x64\x66\x39\xcf\x41\xae\x69\x5f\xc5\xeb\x9f\x6d\x13\x5e\x08\xf0\xcd\x70\xfc\xc8\x00\xb5\x6d\x9b\x1f\x1f\xab\x9e\xa8\xc9\xad\xcd\xa2\xc6\xdb\x28\xee\xff\x2d\xb2\x05\x7f\xf1\x81\x97\x1f\x32\xfe\x11\xa8\x29\x17\xfc\x50\x66\x4c\xa9\xb7\xfa\x3f\xc9\xc3\x2a\x41\xc6\x6f\x73\x1f\x7b\x48\x47\x18\xdc\x5c\xd6\x7c\x2f\x57\xb6\x4a\x24\xc8\x19\x58\xcb\x88\xce\xe4\x72\xfc\xb8\x38\x3d\x2b\x72\x9e\x9b\x9b\xa6\x2d\x81\x36\xad\x9a\x01\x27\x53\x77\x2d\xdd\xe4\x69\xd6\x61\x7d\x69\x23\x59\x72\xd6\xe6\xd3\xe5\x1b\x8d\x7c\x8d\x00\xd0\x05\xdb\x56\x38\xe8\xfe\xf4\xc9\x0e\xd9\xbb\xee\x90\xb5\xd5\x4c\xe7\xe4\xec\x6c\xb1\x34\x50\x9a\x39\x7f\xda\x2e\xc8\xdd\xe9\xd6\xed\xeb\x1b\xdd\x8f\xf7\x7c\xb9\x0f\xf6\x24\xfc\x62\xb1\x7c\x57\xe4\x3f\x93\xfa\x64\x6f\x66\x76\x0c\x14\x8d\x36\x48\xe8\x66\x9a\x94\x84\x65\xe7\x95\xc5\x87\x5e\xad\x28\xdd\x50\x3b\x13\xc9\x14\x03\x9c\x55\xb3\xc6\xf7\x3f\x00\xf4\x42\x8e\x8e\x9e\xa4\xe9\x45\x27\x65\xe9\xa4\x2c\xdd\x14\xb9\xb2\x2d\x1f\xe5\xef\x16\xca\xf8\xb3\xc9\xe2\x44\xca\xc5\x4a\xdb\x80\x33\xa2\x16\x4b\x7b\x7b\x07\x36\xd6\xc9\x3a\x17\x45\xf9\x84\xd0\x93\x49\x4b\x16\x44\x26\xcc\x40\xd6\x76\xc3\xc0\x29\xb2\xbc\xde\x86\x4c\x87\xf4\x4c\x6b\x66\x4e\x55\x7d\x54\x3c\x26\x65\xcd\xab\x8c\xe4\x9a\x5e\xe9\xc5\x0c\xd0\xe5\x0c\x68\xfc\xcd\x80\x6a\xc2\xb4\x69\xaf\x7e\x19\xd0\x69\x10\xd0\xdd\xba\x7f\x08\xf6\x9e\x81\x3d\x70\x5f\xb7\x6e\x7e\x01\xee\x83\xbd\x59\xfb\xbd\x3c\x68\x4a\x5c\x02\xbe\xa8\xf8\x30\x88\x9f\xb6\x04\x61\x7e\x5d\x4e\x6d\x5c\x03\xe1\xff\xb6\xd8\xb5\x17\xcd\x89\x5e\x80\xda\x62\x4a\x2e\xc8\xff\xee\x81\xef\x4a\xf2\x11\x90\x8b\xac\x92\xeb\x64\xd9\x67\xb2\x50\x5b\x08\x36\xdd\xac\xb1\xc1\xef\x6f\x24\x71\xbf\xbd\x54\x6b\x71\x99\xa1\x32\x39\x1e\xde\xd1\x26\x70\x5c\x7a\x2d\x95\x40\xf8\xb9\x1d\xda\x11\x92\x5d\xc9\x37\x19\xa2\x57\xbc\x0d\xc1\xe2\x71\x8a\xc5\x3d\x92\xcd\xf2\x9c\x97\x2f\xd5\xf0\x3a\x79\x9c\x58\x37\x73\x71\x5e\x0f\x64\x76\x62\x37\x31\x03\x1e\xe6\x06\xa5\x4a\xb8\xf9\x3f\x7d\x02\xee\xb7\xd1\x92\x5d\x3a\x33\x23\x21\x67\x49\x3b\xe6\x97\x2e\x6f\x19\xde\xb6\x6b\x98\x49\x5b\xb2\xaa\xcb\xe2\x3d\xdf\x07\x7b\xff\x87\x52\xba\x67\xcb\x6e\xf1\xb2\x67\x68\x0d\xf5\xe6\xee\x7b\xc5\x3e\x4a\xe8\xf1\xca\x5a\x93\x7a\x54\xd7\x65\x96\x1a\x07\x06\x6f\xa7\x93\x76\xc4\xa6\xd3\x3e\x3d\x5e\x61\x99\x3f\x27\x66\x22\x7f\xa2\xb7\x73\x26\x4d\xa7\xf6\xde\xed\xb5\xb8\xff\x5d\x6b\x7a\xcf\xc9\x29\x57\xf4\x47\x4f\x48\x59\x57\x0f\x14\x42\x1f\xbc\x2b\x33\xf6\x40\xf1\xf1\x1e\xb8\x6c\xcb\xb8\xd8\x3e\x25\x67\x8e\xd8\xe1\x79\x5d\x2e\x7b\x62\x47\x23\x59\x3b\xe5\xfa\xac\x82\xc7\x25\x44\xa0\x5a\x32\x3d\xe8\xb5\x82\xe7\x5b\xcd\xd1\xbb\xb7\xc1\xa5\xef\xa6\x0d\x4e\x23\x6e\x60\x1c\xf7\xa4\x10\xd9\x9b\x39\xe4\x7a\x69\x56\x8f\xb3\x0e\xd6\xad\x4c\x91\xd9\x1f\x48\x51\x98\xcd\x3a\xa9\x17\x68\xdf\x18\x4e\xbb\xe8\x26\x2c\x9b\x84\x65\xaf\x04\xde\x57\x16\xd8\xfa\xf9\x4d\xf4\xd2\x89\xbd\x9c\x3a\xb8\xbf\x9c\x9a\x9f\xd3\x75\xb2\x94\x16\x39\x95\x18\xcb\x28\xa0\x59\x49\x17\x8d\xa0\x6c\xb6\x36\x9f\x9f\x9f\xa6\xbc\xbc\x34\x33\x8c\x12\xa8\xe6\xa7\xd4\xe4\x55\x99\xb1\x22\x59\xce\xf8\x05\x50\x45\xf4\xcf\xd1\x12\x9a\x38\x2e\x01\xbf\xa8\x4b\xa2\x96\x71\xe0\x89\xfc\xa9\x51\xbc\x22\xdd\x15\x83\x9b\xa1\xb9\xec\x82\x1c\x17\xf0\x8f\x9b\xae\x3e\x56\x05\xd6\x4a\xf9\x7e\xe6\x89\x9d\x60\x55\x47\x66\x4e\x43\x87\xe6\x00\x6f\x9b\x39\xc0\x1b\x9f\x03\xbc\x39\x5d\x1e\xdc\xf9\xb7\x90\x96\x2e\xf9\x8b\x6c\xb1\xd8\x07\x7b\x79\x91\x73\xa7\x21\x0e\xaa\x6e\x52\xb2\xee\x51\x33\x8a\x1b\x78\x72\x93\xa4\x6d\x39\xe0\x01\x75\xe9\xa2\x25\x1f\x1d\xad\xb9\x59\x8d\x7e\x0b\xfb\x62\x1f\xb8\x83\x48\x97\xfb\xc0\x9d\xbd\xcb\x7d\xc3\x2b\x77\x7a\x0c\xba\x91\x19\xcf\xb4\x6e\xbc\x89\x1b\xe5\x7f\x5d\x8e\x34\x05\x37\xb0\xa4\x2d\xd7\xb0\xe5\x48\xb1\x6b\xf1\x65\x17\xe6\x36\x8c\x69\x56\x04\x5b\x72\xa6\xc9\xbd\x2d\x6b\x7e\xe1\xa1\x55\x1e\x3a\x53\x0b\xb4\x9b\xe3\xa0\xb3\xce\x00\xb6\x03\x2d\xeb\x19\x62\x20\xb6\xaf\xe5\xe4\xf0\x6a\x70\x95\x6b\x36\xb1\x8d\x5c\x1a\x6c\xa0\xca\xc7\x23\xb9\xeb\x82\x15\xe0\x85\x31\x3e\xaa\xce\xe5\x72\x72\x7a\x95\x59\x65\xcd\x62\x77\x28\x6b\x7f\xf1\x20\xf1\x60\xd7\x0e\x1d\xd9\xaf\xa7\x04\x7f\x74\x4a\x51\x23\xd1\xd3\xf9\xfd\xb9\x13\xeb\x66\x96\x03\x76\xa4\x37\x9e\x6c\x4e\x1b\x35\xa4\xed\x1b\xb0\x8d\xb6\xaf\xbf\xb7\xd5\xf6\xff\x78\x35\xba\x25\x8d\x55\x5d\xda\xf4\x65\x1b\x5d\xda\xf4\xa0\x45\xde\xe1\xa1\x9d\x16\xf6\xc0\x37\x66\xec\xe6\x23\x9a\x43\x0b\x72\x7f\x2c\xa7\x95\x64\x4d\xd6\xf5\x6a\xdc\x20\x21\xae\x25\xbd\x1e\xb1\x75\x97\x89\x2d\x59\xb9\x2b\xc5\x2e\x39\xb8\x25\xfe\x72\x08\xe0\x9f\x7f\xec\x3b\x03\xae\xba\x38\xb0\x7e\x1f\xcc\xd1\xe7\xd3\x81\x01\x78\x3b\x75\x2f\x3e\x34\x1b\x61\x07\x77\x2e\xb7\x39\xd0\x7d\x73\xb7\xd9\x1a\xbc\xfb\x76\xda\x1c\x43\xcc\x59\x56\x9d\x2d\xc8\x52\xf6\x09\x1c\x82\xbd\x06\xec\x5e\x9b\x45\x0e\x93\x24\xc1\xee\x44\x76\xb9\xce\xc6\xe0\xf0\x1c\xa5\xad\xa5\xfe\xfc\xf2\xc9\xab\x27\xcf\x8f\x1e\x1d\x3d\x7d\xf1\xfc\xf8\xd1\xd1\xd1\xcb\xa7\xdf\xfe\x72\xf4\xe4\x95\x36\x5b\x28\x47\x58\x6a\x38\x57\x3d\x07\x9e\x93\x79\xae\xd4\x0d\x89\x5d\xa9\x12\x5d\x0b\x80\xb3\xc0\xbc\x26\x24\x87\x86\xaf\x05\xe9\x4e\x67\x31\xbe\x13\x28\x75\x97\xe2\x85\xd8\xfa\x64\x7c\xa5\x15\x8a\x72\x1d\x31\xf6\x07\xb6\xc2\x4a\xc5\x9d\x9a\xa0\xbc\x80\x4f\xde\xec\x35\x8a\x43\x23\x57\xdf\x4e\xef\x5c\xba\xbc\xa1\x8b\xfc\x6c\x94\x38\x4b\x9b\xd0\xd2\x18\x5c\xa1\x15\xb8\x32\xe6\xb0\xdb\xdc\xa6\xd2\x3b\x97\xe6\x04\x50\xdb\x02\xd7\x55\x5e\xc7\x96\x75\x67\xe7\xbe\x77\xf9\x65\xad\xf9\x4d\x03\x6a\xfc\xc2\x8b\x94\xde\x29\xa9\xb8\xd4\xc2\xf9\xe9\xf9\xe9\xd8\x15\x01\x3f\x34\xb2\x4d\x66\x7e\x5a\xf3\x92\xd4\x9c\x8f\x5e\x22\xc4\x4e\xe6\x67\x23\xf7\x38\x26\x9e\x32\xc7\x64\x4f\x69\x8e\x4e\xb2\x0a\x9c\xf2\xfa\xa4\x60\x20\xab\xc0\x22\x7b\xcf\xc1\x6f\xc7\xf3\xd3\x2c\xff\x0d\xf0\x0b\xca\xcf\x6a\x50\x9f\x90\x1a\x64\x35\x20\x54\x7e\x56\xe0\xb7\xcc\xb4\xe3\x37\xf0\xf1\x24\xa3\x27\x40\x6a\x5f\xf7\x40\x96\x7f\x28\xde\x73\xa6\x8e\xe0\x39\xa1\x27\xcd\x55\xa8\x2c\xb7\x57\xa1\x40\x5d\x80\x77\x3c\x57\xa5\x95\x6a\x46\x4b\x09\x4b\xce\x6f\xe9\x52\x03\x93\x90\x64\x8a\x9a\xff\x64\x8b\x4a\x92\xbf\xe7\x6c\xae\x97\x39\x16\x01\x59\xd5\x54\xf7\x31\xab\x4f\x40\x91\xf3\xe6\x9c\x63\x1f\x4c\x54\xe1\xe9\xd6\x37\xc3\xfc\x39\xec\xdf\x0c\xfb\x89\xd4\x27\xdb\x5d\x0c\x33\x6d\x02\xc5\x07\x5e\xce\xdd\x22\xdf\x1b\xa2\xb8\x04\x6f\x6c\xbb\x0f\x8f\xe7\x19\xe3\x79\x9d\xd5\xcb\xb7\xbd\x0e\x99\xde\xa8\xa3\x4a\x8d\xb7\xf5\x97\xcd\x4e\xb3\x3c\x93\x74\xa3\xba\x3a\x74\xc5\x4c\xe9\x07\x6a\xdd\x23\xf9\xec\xcd\xef\x60\x2f\xdf\xdb\x07\x48\x29\x1d\xfa\x37\x06\x97\x6f\x0f\x9a\x0b\x69\xa7\x59\xfe\xed\x72\x62\x4a\x38\x96\x63\x0a\xc7\x74\x4c\x31\xcf\xb5\xdd\x98\xe6\xb2\x5a\x0b\xd6\x00\x7a\xf8\x50\x75\xec\xb7\x63\x35\xc5\xf1\xb2\x5e\xfe\xd6\xf6\xb2\x3a\x29\xca\xfa\x84\xe4\x6c\x3e\x58\xe7\x5e\xbe\x37\x0a\xdb\xb9\x11\xa7\x4b\xa9\x01\x98\x35\xb0\xbb\xae\xe7\xf4\xe8\x7c\xfd\x75\xe7\x32\x9c\x35\x55\xee\xf2\x9d\x05\xe3\xb2\xd7\xc4\xc2\x9c\x01\x3c\x9d\x19\x66\xd2\x85\x37\xde\x94\x53\x6d\x1b\xb8\x2a\xb7\xd6\x54\xec\xd6\xd2\xe2\x25\xc9\xdf\x8d\x71\x7f\xe2\x43\xc3\xfd\x59\x65\x7b\xf2\x58\x1d\xd0\x8f\x48\x01\xcf\x64\xaf\x0b\xed\x51\x61\x14\x2e\x72\xc4\xc5\x63\xa5\xd2\x55\x80\xc8\x11\x56\xf6\x78\x7e\x03\x45\xd9\x7c\xbc\xcc\xde\x9d\xd4\xbf\x35\xc4\xd3\x70\xe0\x59\x99\x7d\x20\x35\x77\xd9\x23\x2d\x8a\x05\x27\x92\x3b\x44\x59\x9c\xaa\x82\x6f\x81\x36\xda\xbe\x34\xa3\x9a\xe5\xef\x80\x4c\x04\xa5\x4c\x95\xcc\xb6\xe0\xa2\xcf\x17\x2d\x9b\xb9\xec\x91\xf3\x8f\xda\x5c\x50\xa7\x2d\x0e\x11\x69\xdd\x54\x21\x74\xd2\x34\xa0\x43\x44\x03\xee\x34\xba\x3e\x16\xf4\xdd\x16\x7e\x26\xe9\xcc\x5e\x14\x90\x9f\x5f\x1d\x82\x3d\x3d\xaf\xee\xc9\xa4\xee\x70\xac\x42\x6b\x55\x70\xbd\xc1\xae\x60\x1c\xba\x84\x06\xda\x9d\xa6\x87\xe0\x49\x5e\x9d\x97\x5a\x7a\xaa\x3b\x62\x85\x00\xbf\x3d\x80\xbf\x49\x91\x78\x56\xf2\x8a\x97\x1f\xb8\x64\x2f\xb5\x1b\xa2\x4f\x0d\xec\x00\xeb\xaa\x8d\xfa\x2b\x1b\xaf\xea\x3b\x74\xaa\x5a\x6d\x0a\x29\x6b\xbb\x16\xb0\xe0\xa0\x69\x50\xf7\x34\x51\x17\x68\xaa\xe2\x39\xeb\x6c\x91\x99\x4e\xe9\x3f\x6e\x95\xe0\x1b\xa0\xdb\x05\xfe\xa2\x60\x7c\x03\x10\xd8\x07\x0f\x90\xba\x41\xde\x36\x9c\x9f\x75\xef\xa3\x37\xdc\xb0\x82\xcf\x19\x68\x87\xb3\x35\xfd\xb4\xc2\xa8\xce\xf8\xaf\xb2\xab\xbf\xd6\x36\x70\xf7\x92\x32\xf8\xf6\x3c\x5b\xd4\x0f\xb2\xdc\xce\xa2\xa5\xbd\x97\x53\x19\x57\x27\x45\xc5\xf5\x2c\xa5\xc6\x4c\x2e\x0a\x72\x19\x90\x0a\x14\xea\x0e\xca\x6f\x8b\x82\x91\xea\xe4\x37\x03\xa0\x9a\xcb\xca\x95\x8d\x2c\xe5\x4b\xe1\x31\xcf\x16\xd6\xce\x1b\xe5\xd9\x42\x73\xad\x4e\xfb\x89\x5c\xd8\xa4\x53\x72\xe1\xce\xea\x5c\xa1\xa8\xef\x7b\x45\x12\x4b\xc3\xb7\x24\x67\x7d\xc6\xd5\xf3\x39\x2b\x78\x95\xef\xd5\x12\x10\x2d\x78\x49\xb9\x73\xbb\x70\x0d\x47\xe7\x66\x6f\x52\x0f\xa7\x6c\x82\xfe\x55\x08\xd5\x73\x6d\xed\x6b\xa8\x80\x1c\x77\x99\x5d\xfe\xdd\x98\x59\x91\xd0\x51\xa3\x21\xc8\x19\x38\xa7\xa5\xb9\x74\x5d\x02\xc6\xed\x47\xba\x9c\x7f\x0e\x79\x63\x34\x01\x57\xd8\x68\x41\x53\x08\xa0\xdb\x58\xf5\x44\xcd\x76\xb4\xda\x5c\xee\xd6\x7b\xb9\x87\xe0\x41\xf3\x9e\xa3\xb9\xee\xdd\x0c\xfa\xa4\x25\x8d\x49\xdf\xed\x9d\x96\x49\x9f\x3e\x01\x34\x9d\xce\x00\x6c\xd6\xc6\x25\xaf\xf4\xe5\x5e\xd5\x83\x89\x99\x13\xd5\xfa\xf7\xe3\x49\xb6\xe0\xc0\x44\x3d\x78\xd0\x3e\x2b\x90\x25\x5a\x7c\x81\x6f\x6c\x53\xf6\xc1\xfd\xfb\xaa\x9d\x6f\xbb\x52\x42\x0f\xf8\x7d\xcd\xe8\xfa\xb6\x49\x6b\xbd\x4d\x41\x1b\xe6\xc6\x06\x45\x03\xbc\xb8\xd6\xd2\xf3\x56\x53\x67\x5d\xe8\x6d\xf3\x31\x57\x12\xb1\x67\x66\x38\xf0\x4b\xc5\x99\x64\xcc\x1e\x0f\x7f\x20\x65\x56\x9c\x57\xe0\x37\x0d\xe7\x37\x7d\x71\x8b\x48\x7e\xb0\xbc\xfa\xf4\xf9\xf7\x4f\x9f\x3f\x3d\x7a\x0d\x0e\x01\x02\x0f\xed\xcb\x9c\x9f\x1e\xfd\xfd\xf8\xe9\xf3\xa3\x27\x3f\x3c\x79\xa9\x8c\x2d\x46\x49\x14\x26\x1e\xf2\xfc\x38\xc4\x1e\x0a\x22\x7e\xdf\x83\xb1\x33\xbb\x16\xf9\x07\x2e\x31\xf2\x9b\x22\x6e\xa5\x2f\x13\x20\xf4\xf4\xac\x89\xeb\x0a\x4a\x2d\xc2\x7d\xad\xf6\x19\xc9\xdf\xb9\x3c\x71\xef\xd2\x70\x51\x87\x9f\xa8\x6e\x45\x8f\xee\x2d\xff\xb9\x84\x6f\x72\x72\xe6\x34\x6e\xf5\xa9\x43\x23\xc6\xbd\x39\xee\x3c\x74\x98\xe3\xd5\x3c\x1a\xc3\xf3\x9f\x9e\x3e\x3f\xfe\xdb\xa3\x67\xbf\x3c\x71\x0b\x04\xfc\x81\x87\xfd\xd5\x32\x4f\x73\x85\xa2\xa5\x9b\x77\x04\xd7\xab\x85\xf7\xbc\x39\xde\x5b\x6d\x96\xc3\xbf\x4d\x56\xbd\xac\x68\x0c\x75\x7e\xe5\x7c\x37\x54\xae\xb1\x28\xa7\x38\x08\xbe\x31\x5f\xfb\x7a\xce\xbc\xbc\x03\x6c\x72\x43\x92\x06\xe6\x81\x01\xd9\x96\x6e\xe8\xe9\xd3\x27\x07\xe6\x03\x1b\xed\x3e\xe0\x52\x6a\xc0\xa1\x2d\xfc\x17\x55\xf1\x03\x39\x8b\xa2\xee\x9c\xa9\xf2\xdd\x73\x69\xb2\xc7\xa1\x6d\x3d\xfa\x57\xa7\xfd\x43\x6c\x6b\x31\x33\xc0\xb5\x7f\x2a\x0b\xdf\x7a\x82\x3d\xce\x2a\xab\x2c\x8e\xdf\xc9\xdf\xd1\x54\xf1\x60\x1d\xd7\x7a\x34\x32\x00\x6f\xd7\x47\x1e\x9f\xe5\x69\x0c\xba\x81\xa7\x31\xe8\x7a\x4f\x63\xf0\x67\x7c\x1a\x83\x6f\xea\x69\x0c\xbe\x81\xa7\x31\xde\xe7\x7f\x1a\x73\xd5\x77\x2b\x77\xbe\xbc\x5c\xf9\xf2\x72\xe5\xcb\xcb\x95\xcf\xf8\x72\x45\x6f\x8b\xfd\x9a\xd5\x27\xc5\x79\xed\x54\x5b\xa4\xff\x50\x54\x5b\x59\x62\xd0\x08\x05\x87\xe0\xf7\xcb\x03\x97\x8c\xb2\x1c\x14\xe9\x3f\x2c\x42\x64\x89\xb9\xd2\xd9\x5f\x88\x49\x36\x05\x7f\x55\xa7\x7f\xb4\xc8\xeb\x2c\xb7\x63\xfc\xd5\x56\x9c\xa3\x1a\x90\x4d\xdd\xc2\x86\x79\x32\xc9\x3a\x45\xfa\x0f\x45\x8c\xab\x1c\xf3\xe5\x5d\xce\x97\x77\x39\x5f\xde\xe5\xfc\xb9\xde\xe5\xb4\x57\x71\x07\xde\xe6\x34\x89\xdb\xbe\xcf\x19\x52\x54\x3e\xcb\xfb\x9c\x4e\xcb\xd6\xbc\xd1\xe9\xe4\xdb\xf0\x4e\xa7\x93\xf7\xca\x6f\x75\x3a\xa5\xb7\x79\xaf\xd3\xad\xee\x8a\x6f\x76\x7a\xfd\x7f\xb3\x7a\x8f\xe4\x59\x96\xf3\xa7\x35\x3f\x5d\x7b\x9f\xc4\x66\x9a\x14\x67\x9a\xc1\xce\x56\xef\xdb\x2d\x4c\x1e\x70\x08\x3e\x14\x19\x93\x6b\x41\xe7\x42\xc9\x15\x16\x08\x73\x32\xcf\xaa\xbf\x91\x45\xc6\xec\x95\x10\x5d\xeb\xd4\xbd\x84\xe2\xd4\x76\x35\xd0\x74\x51\xe4\xbc\x0b\xd8\x76\xa7\xb9\xcd\xa2\xb7\xac\xd7\x37\x7b\xed\x4a\x6e\x32\xdd\xd0\x66\x9d\x3a\x19\xac\xb7\xfb\x98\x48\xd9\x32\xd1\x0a\xde\x05\xea\xdf\x21\x6f\x92\x96\xa8\x7f\x8b\xbc\x2d\x85\xfb\x37\xc9\xdb\x52\xbd\x24\xa9\x25\xdb\x34\xa9\x6b\x75\x12\xd5\x26\xb4\xba\x87\x32\xa6\x71\x98\x9b\x84\x6f\xf6\x2e\xd0\xde\x0c\xec\x2d\x55\x78\x81\xd5\x6f\x15\xbe\xe7\xcb\xbd\xb7\xee\x5d\xfd\xdd\x47\x71\xf3\x6d\xfd\xcf\x79\x99\x53\xe3\x62\xda\x7d\x0b\x70\x81\xf6\x41\x77\x88\x96\x68\x1f\x74\x47\xe6\x02\xef\x83\xee\x80\x2c\xf1\x3e\xe8\x8e\x83\x7b\x25\xd4\x8d\x57\x5c\xfb\x9e\x2f\x9d\xbb\x62\xd3\xb1\x0b\x58\x16\xb1\x6b\x2f\x52\xd6\x27\x1c\x9c\x14\x65\xf6\xaf\x22\xaf\xc9\x42\xdd\x94\xe8\x3c\x9e\xea\x9f\x6a\xb7\x79\x7f\x2e\xb2\xbc\xae\xec\x24\x7c\x46\x2a\xa9\xa3\x64\xb9\x54\x99\xf4\xb5\xdb\xa2\x6c\x0e\xf0\x99\xde\x2b\xb7\x12\x65\xe5\xba\xe6\x0f\x65\x71\x7e\x76\x09\x7e\x6c\x1b\xb2\xdd\x03\xae\xb6\xc0\x5a\xd1\xd5\x66\x9b\xf4\xdb\x7f\xb5\x1b\x99\xa3\x17\x32\x9d\x77\x89\x9d\x0b\xfe\x1f\x33\xa6\x76\xe3\x4d\x9a\xfa\x74\xd3\x1d\xd4\x37\x99\xda\xb8\xde\xf5\xcc\x15\xdc\x7f\xfa\x04\x56\x22\xaf\x78\x51\x53\xa9\xff\x35\x3f\x95\x5d\x5b\x01\xb5\xf9\x9e\xe4\xf0\x25\x6b\x75\xb7\x46\xdd\x7a\x1c\x78\x2e\xa3\x58\xa4\xcf\x21\x1a\x76\x9f\x49\xc0\x7d\xb0\x82\x31\xfd\x08\xa6\x97\x7b\xdd\x03\x1c\xb5\x8e\xd9\x07\x99\xc3\x32\x8e\xf4\xb1\x73\xb6\x7b\x49\xb3\x99\xe9\x5a\x84\xac\x4c\x0f\x57\xb8\x93\xbd\x59\x76\x5d\xe9\xba\x23\xb5\xd3\xb9\xbe\xee\xda\xb6\xb1\x73\xfb\x51\x8d\x69\xff\x16\xe3\xa0\x04\xf8\x20\x25\x37\xdd\x86\xf7\x6d\xce\xcf\xc0\xf9\x7f\xb3\x8d\xd8\x8e\xef\x6d\xf6\xb5\x5c\x6f\x33\x4d\xba\xed\x1e\xe0\x78\x6f\x9c\xe3\xc7\x9f\x76\xba\xcf\x37\x3b\xc4\x78\xc2\xd5\x01\x58\x9b\xaa\x23\xdc\x2c\x0d\xce\xdb\x4c\x36\xaa\xc7\xf3\x3d\x9c\x4b\x8e\xef\x46\x5d\x83\xdf\x7b\x80\xae\xcb\xed\xde\x18\xb7\xaf\xb0\xab\x9a\x13\xfb\xdc\xbe\x9a\x4b\xce\x8a\xe0\x3e\x58\x45\xdf\xcd\xb0\xbb\xd7\x67\x77\x8b\x8f\x3f\x2f\xb3\xdb\x16\x6e\x66\xf5\x11\xc6\xf9\x96\xd0\xf7\xef\xca\xe2\x3c\x67\x6b\x59\xa7\xcd\xd6\xbb\x45\x2e\xf5\x92\xee\xf5\x71\x19\xd3\xa3\x59\x95\xe9\xd3\x27\x93\xf9\xf0\xd0\xe8\x31\x57\x21\xd1\x4d\x6f\xea\x24\xe8\x17\x67\x84\x66\xb5\xfb\x82\xce\x89\x1d\x9e\x9c\xbd\xee\xec\xec\x96\x5d\x8e\x4f\xdb\xde\xc0\xbc\xdd\xe5\x71\xcf\xf0\x78\x8b\x88\x1b\x20\x14\x49\x05\xf5\x9e\xcb\x4e\x17\x9d\x99\x73\xd9\x61\x22\xd5\xc4\xfd\xfe\x7c\xa9\x9b\xb5\xbf\xc2\x43\xcd\xeb\xa7\x9e\x86\xa9\xf5\x4e\x19\x76\xe3\x0c\x56\xf7\xc1\x20\x8a\xb7\x21\xdd\xf4\xdd\x9e\xc3\x4e\x6b\x89\xf4\x2a\xcf\x1a\x36\xbd\x94\xb9\x70\x5e\xbd\x8c\x8c\xbd\xbf\x6e\xec\xfd\x8d\x63\xef\x0f\xc8\xf7\x01\xb5\xce\x77\xf4\xba\xb5\x53\x81\xdf\x4c\x05\xc3\x10\x1f\x17\x45\xc9\xb2\x9c\xd4\xbc\xfa\x41\x4f\xb2\xda\x2e\xe4\x4a\x2d\x43\x19\x87\x6a\xde\x00\x70\x5d\xb6\x0e\xa6\x1f\x5d\x64\xee\x6b\x24\xf5\xdd\xc1\x78\x2f\xc3\xb2\x9f\xa1\x10\xa2\xe2\x2e\x62\x75\x44\xe7\xc1\xac\xa4\xad\x5f\x7b\x23\xd4\x46\xae\x64\xfd\xb1\x3f\x56\x4e\x6c\x57\x6a\xe9\x61\xff\xcb\xa1\xf6\xa7\x69\xc6\xd8\x7e\x5e\xa8\x2d\xca\xfb\x17\xf2\xf7\x52\xff\x5e\x5e\x5d\x9c\x05\xa3\x54\xba\xa2\xd9\xdb\x06\x07\xf3\x7e\xd2\xd0\x08\xae\x14\xea\x26\x74\x3b\xba\xfb\x76\xc6\x7a\xd2\xea\x6c\x73\x0c\x74\x68\x7d\xe9\xc9\xef\x9a\x3e\xf6\xf5\x9f\x99\x95\x67\xc3\x63\x6b\xc5\x9a\x33\x9a\x33\x43\x3e\xfb\x96\x8c\x2e\x57\x17\xc6\xd7\xeb\xfe\x3a\x46\xe8\x74\x7e\x65\x58\xd6\x95\x9c\xfc\xae\x39\x67\x5f\xff\xf9\x3c\x1d\xff\x63\xd5\x96\xb1\x67\x59\xae\x96\x31\x1b\x20\x1d\x75\x59\xb6\xcd\xbe\x6e\x15\x3f\x5b\x41\x7e\xaf\xf0\xd8\x62\x60\x40\x6f\xea\x3e\xf4\xea\xec\x9e\xae\x7f\xec\x85\xae\xf8\xd8\xab\x03\xfa\x0f\x7c\xf0\xb5\xf6\xbd\xd7\xf0\xe5\x86\xce\x23\xab\xb5\xcf\xbd\xb6\x28\x6f\x28\xfe\x5a\x30\x2c\x63\x5c\x0f\x48\x43\x56\x3b\x01\x52\x0f\x9b\xe4\xc0\x4d\xde\xec\x52\x5a\xed\x55\xae\x1b\xe4\xd1\xa2\xe6\x15\xc8\x4e\x65\xa5\x7a\xb5\x53\xc1\xb4\x28\x16\x6f\x15\xe3\x59\x96\xfa\x82\xb4\x2b\x20\xad\x2f\xc2\x76\x42\xde\xe6\xd7\x7c\x1b\xa8\xbe\x33\x7e\x7f\x78\x43\xd6\xab\x08\x3b\x35\x4c\x8d\xd4\x9d\xf5\xca\xee\xb5\x00\x9b\xc9\x7b\x77\xda\xbd\x03\xac\xe6\x73\x2d\x18\x56\x09\xb8\x16\x90\x56\xe9\xb8\xa6\x24\x75\xf4\x93\x6b\x40\xda\xf4\x1a\xd4\x3e\x06\xb5\x6f\x41\xcd\x44\x02\xdd\x09\x01\xf6\x05\xbb\x3a\x73\xef\x48\x2d\x1b\x63\xde\xa3\x35\x04\x02\x0a\x31\x7a\x36\xb2\xca\xbe\x6f\xde\x3a\x30\x48\x5a\xd1\xac\xaa\x88\x82\x31\xbc\xc3\xda\xe7\x3a\x59\xfe\x4e\xdf\x2e\x89\x04\xd9\x31\x0f\x72\xd3\xcf\x56\x57\x0e\xb2\x7b\x77\x73\xbd\x3f\xd3\xdd\xdc\x63\xbb\xab\xfc\x58\xdf\x52\x57\x0c\x2d\x29\x6d\xf4\xfe\x61\x10\xed\x7a\x63\xf5\xb8\xd1\x61\x8f\x9f\x65\x39\x1f\xad\x01\xe3\x1d\xaf\x01\x63\xb7\x8a\xbf\x4b\x09\x30\x5a\x47\xec\xef\x7c\x17\xb4\xad\xe2\xf5\xfa\x2a\xae\x79\x17\xb4\xa1\xa3\x0d\xf7\x41\x91\xbe\x63\x3b\x70\xbb\x44\x62\x19\xa8\xd1\x74\x6e\x96\xec\x4c\xd7\xdb\x38\xa6\x18\xa7\xa6\xc1\x7b\x28\xbf\x5b\xb9\x66\x56\x3b\xb2\xc1\x2a\xbf\xe2\xd2\x1f\x4a\x72\x76\xa2\x41\x64\x0b\xb6\xfe\x61\xfc\x0a\x6d\x0d\xd4\x27\x61\x92\x8b\xac\x6a\x56\x12\x52\x44\xfc\xae\xa2\xcc\x53\x76\x35\xf3\xec\xcd\xc0\x23\x93\x6b\xbd\xa0\x5d\x25\xb6\x81\x4a\xf5\x8b\x5f\xa7\x8e\xe5\x15\xea\x18\xa2\xb6\xc1\x3a\x54\xdf\x44\x51\x9e\x92\x5a\xe6\xfa\x89\xac\x05\x3b\x46\x61\x16\x74\x07\x90\xac\xe0\x8e\x3a\x13\xef\x0b\x32\xff\xf6\x7c\x05\xa5\x59\xce\xb2\xfc\x5d\xcf\x53\x50\x7b\x05\x9c\x4d\x06\xeb\xbb\x9b\xde\x9d\x75\xfc\xb5\xd8\x25\x28\xff\xc0\xf3\xfa\x31\xcf\x6b\x5e\xea\x27\xd5\x37\x58\x27\x19\xa9\xf3\xd5\xeb\xe7\x8f\x8f\x9f\xfc\xed\xc9\xf3\xa3\x95\x2a\xb7\x97\xd7\xaa\xe1\xe3\xc2\x20\xf1\x77\x14\x3a\x2d\xe4\x6b\x3d\x9b\xb0\x40\x9a\x2b\xea\x0e\xa2\xc1\xa1\xba\x83\x78\x95\x36\xcc\x89\xba\xb2\xab\x5e\xcb\xb6\x80\xe6\x15\xaf\x7f\x22\x17\xcf\xb2\xaa\x96\xe2\xc6\x1c\x3f\xae\xc9\x30\x51\x22\xf2\xd2\x34\xa9\x1d\x07\x70\xd8\x6e\xb0\xcc\xab\x65\x4e\x7f\x2a\xce\x2b\xfe\x44\x35\x62\x6f\x95\xde\xd7\xfa\xc6\xea\x3c\x4b\x7d\x08\x1e\x17\x67\x4b\xfd\x8e\xf1\xff\x2d\x96\x6a\x4d\xf4\x34\xa7\x73\xf5\xe8\x53\x3f\x3b\x7d\x5e\x30\xf5\x82\x4b\xdf\x80\x29\xca\x6a\x7e\xe7\xe1\x43\x59\xf2\x67\x5e\x9e\x66\xfa\x4a\x66\x56\x81\x13\x5e\xf2\x74\x09\xde\x95\x24\xaf\x39\x9b\x01\x51\x72\xf5\xd6\x51\x36\xfa\x1d\x9f\xa9\x27\x6a\xf9\x12\x9c\xf1\xb2\x2a\x72\x50\xa4\x35\xc9\xf2\x2c\x7f\x07\x88\x04\xa5\x1c\x16\xa9\x27\x9d\x59\x05\xaa\x42\xd4\x1f\x49\xc9\x55\x1b\x48\x55\x15\x34\x53\x87\xc9\xac\xa0\xe7\xed\x13\x55\x39\x7f\x54\x60\x52\x9f\x70\x09\xe0\xee\x2b\x53\xe8\xee\x54\x55\xc5\x38\x59\x80\x2c\x57\x57\x5c\x6c\x92\x7a\x5c\x5b\x9c\xd7\xa0\xe4\x9a\x83\xd5\xd5\xaf\x2c\xa7\x8b\x73\xc9\x3e\x12\x8c\xcd\xb1\xc8\x4e\x33\x53\x8f\x7a\xb8\x29\xf1\x53\x49\xb8\xe7\x95\xba\xb3\x79\xb6\x9c\x81\xd3\x82\x65\x42\xfe\xe5\xaa\x7f\x67\xe7\xe9\x22\xab\x4e\x66\x12\x0c\xcb\x2a\x73\x5f\x68\x06\x2a\x19\x4f\x79\x2e\x0b\x92\x9c\x3d\x2c\x4a\x50\xf1\xc5\x42\x02\xc9\xb4\x9a\xe9\xb6\x51\xe5\x91\x15\x9d\x49\xe4\xd6\x12\x98\xc6\x98\xaa\xfd\xe3\x49\x71\xda\xed\x52\x56\x01\x71\x5e\xe6\x59\x75\xc2\x55\x31\x56\x80\xaa\x50\x95\xca\x29\x50\xc6\x18\x04\x89\x62\xb1\x28\x3e\x4a\x84\xd3\x22\x67\x99\xec\x5a\xb5\x6f\x06\x52\x2b\xad\xc5\x07\xae\x7a\xa6\x89\x21\x2f\xea\x8c\xea\x21\x50\x83\x72\xd6\x0e\xb6\x49\xaa\x4e\xc8\x62\x01\x52\x6e\x30\xc8\x99\x04\x95\xe5\x80\x38\x9d\x2b\x65\x4b\xd4\x0b\xc8\x8c\x2c\x80\xa4\x3b\x59\x6f\xbf\xd3\x96\xa0\x8e\x7e\x7c\x02\x5e\xbd\xf8\xfe\xe8\xd7\x47\x2f\x9f\x80\xa7\xaf\xc0\xcf\x2f\x5f\xfc\xed\xe9\x77\x4f\xbe\x03\x77\x1f\xbd\x02\x4f\x5f\xdd\x9d\x81\x5f\x9f\x1e\xfd\xf8\xe2\x97\x23\xf0\xeb\xa3\x97\x2f\x1f\x3d\x3f\x7a\x0d\x5e\x7c\x0f\x1e\x3d\x7f\x0d\xfe\xe7\xe9\xf3\xef\x66\xe0\xc9\xdf\x7f\x7e\xf9\xe4\xd5\x2b\x09\xea\xc5\x4b\xf0\xf4\xa7\x9f\x9f\x3d\x7d\xf2\xdd\x0c\x3c\x7d\xfe\xf8\xd9\x2f\xdf\x3d\x7d\xfe\x03\xf8\xf6\x97\x23\xf0\xfc\xc5\x11\x78\xf6\xf4\xa7\xa7\x47\x4f\xbe\x03\x47\x2f\x54\x9d\x06\xda\xd3\x27\xaf\xc0\x8b\xef\x65\xe9\x9f\x9e\xbc\x7c\xfc\xe3\xa3\xe7\x47\x8f\xbe\x7d\xfa\xec\xe9\xd1\xeb\x19\xf8\xfe\xe9\xd1\xf3\x27\xaf\x5e\x81\xef\x5f\xbc\x04\x8f\xc0\xcf\x8f\x5e\x1e\x3d\x7d\xfc\xcb\xb3\x47\x2f\xc1\xcf\xbf\xbc\xfc\xf9\xc5\xab\x27\xe0\xd1\xf3\xef\xc0\xf3\x17\xcf\x9f\x3e\xff\xfe\xe5\xd3\xe7\x3f\x3c\xf9\xe9\xc9\xf3\xa3\x39\x78\xfa\x5c\x02\x7b\xfe\x02\x68\x1e\x7e\xf5\xe3\xa3\x67\xcf\x54\x85\x8f\x7e\x39\xfa\xf1\xc5\xcb\x57\xb2\x95\x8f\x5f\xfc\xfc\xfa\xe5\xd3\x1f\x7e\x3c\x02\x3f\xbe\x78\xf6\xdd\x93\x97\xaf\xc0\xb7\x4f\xc0\xb3\xa7\x8f\xbe\x7d\xf6\x44\xd7\xf6\xfc\x35\x78\xfc\xec\xd1\xd3\x9f\x14\x61\x7d\xf7\xe8\xa7\x47\x3f\x3c\x51\x05\x5f\x1c\xfd\xf8\xe4\xa5\xca\x69\xda\xf8\xeb\x8f\x4f\x54\xd4\xd3\xe7\xe0\xd1\x73\xf0\xe8\xf1\xd1\xd3\x17\xcf\x25\x7e\x1e\xbf\x78\x7e\xf4\xf2\xd1\xe3\xa3\x19\x38\x7a\xf1\xf2\x08\xbc\x78\xa9\xf0\x23\xb3\xfe\xfa\xf4\xd5\x93\x19\x78\xf4\xf2\xe9\x2b\x89\x9c\xef\x5f\xbe\xf8\x69\x06\x24\x76\x5f\x7c\xaf\xf0\xf7\x5c\x16\x7d\xfe\x44\x03\x92\x98\xef\x0e\xd0\x8b\x97\xf2\x5b\x02\xfb\xe5\xd5\x93\xb6\x45\xdf\x3d\x79\xf4\xec\xe9\xf3\x1f\x5e\xc9\xf2\x6e\xfe\xb9\x73\x91\x5c\x09\xae\x27\xa7\x59\x5d\x37\x67\x7a\x6a\xbb\xd6\x88\x55\x7b\x54\x62\x3f\x3f\x7d\x02\xbf\x5f\x1e\x34\x99\x4e\x1d\x81\xd9\x64\xed\x44\x7e\xfa\xd4\xb5\xbf\xb1\xf2\x20\xd1\x6d\xc0\x81\x12\x83\xdf\x12\xfa\xfe\x23\x29\x59\xf5\x80\x16\xa7\x67\xa4\xd6\x2f\xf1\x73\x29\xfb\xe0\x1c\xc1\xf9\xc5\x1d\xb7\xcc\xdc\xfd\x58\x85\xd7\xc9\xda\x3e\x92\x68\xbb\xe7\xb4\x6e\x2c\x6f\xaf\x97\x4e\x09\xd5\xdc\x56\x27\x76\x01\x54\xe0\x63\xb6\x58\x80\xb3\x32\xcb\x6b\x40\xc0\x47\x52\x2a\x19\x9b\x09\x70\x5a\x28\x63\x10\x24\x07\x08\x82\x45\x03\x98\x94\x4a\x3a\x10\xc6\xb4\xfc\xc8\xea\xb9\x36\xf5\x93\x55\x80\x48\x69\x27\xce\x17\x4d\x4d\xfa\xd5\xff\x09\x5f\x9c\x55\x40\x68\x9d\x03\x9c\xf2\xd3\xa2\x5c\x82\x05\x27\xef\xab\x79\xb7\x33\xa6\xd8\x4f\xdd\x8e\x20\xa8\x7b\xf0\x22\xfd\x90\x15\xe7\xd5\x62\xa9\x2e\xeb\x4b\xa1\xd1\xf4\xa1\x3a\x29\xce\x17\x4c\x8a\x16\x25\x87\x75\xcb\x10\x34\x2d\x6b\xa8\x88\x48\x89\x56\x49\x58\xca\xf2\x50\x5d\x18\x61\x54\x72\x52\x71\x36\x07\xaf\xb8\x8a\xfc\x17\x2f\x0b\xf5\xdc\xe5\x3c\x37\xe0\xe6\x63\x48\xef\xcd\xc6\xae\x0b\xbd\xdc\x79\xcf\x9b\x55\xe6\x51\x6e\xae\x16\xe2\xb9\x7a\x4b\xfb\xe9\x13\xc8\xaa\xe7\xe4\xf9\x24\x9f\xea\x83\x05\xfd\x98\xa1\x7d\xc8\xb0\x67\x5e\x2e\xa4\x1c\x10\x70\x56\x54\x59\x9d\x7d\xb0\xaf\xb5\xd5\xc3\xe2\x61\xf2\xce\x1d\xdf\x6c\xfa\x9e\xd2\xe5\x38\x85\xf1\xd3\xac\x76\x5b\x2d\x23\x5b\x8b\x01\xbc\x9c\x81\x13\x92\xb3\x85\xfc\xb1\xe0\xb9\xba\x3f\x5e\xcd\x40\x36\x6b\x29\x42\x1d\x7f\xa8\x5e\xba\x2c\x68\x7b\xd4\xe1\xd1\xdf\xb5\x37\xc0\x87\x0f\xc1\x53\x25\xcf\xf5\x74\x94\x17\x60\x8f\xcb\x0e\xef\x69\x45\xa7\x01\x2d\xb3\xe4\x1a\x2b\x73\x53\x47\xdd\x18\x57\xd4\x25\x5c\x8b\x29\x9d\xfa\xe7\x2a\x1d\x7c\xfa\xd4\x1c\xf5\x4c\xb2\xca\x2c\xf3\x56\xf3\x4d\xc1\xd7\x5f\x83\x81\xf2\xf6\xba\x94\x63\xbe\xa4\xec\x3c\x19\xd4\xce\x21\x6d\x0b\x78\xe9\x3e\x23\x7a\xa2\x21\xff\xee\x1c\x66\xc9\xf1\x95\x6a\xb9\x14\x81\xb9\x46\x2c\xeb\x76\xde\x9e\xc5\xf5\x2f\x76\x3f\x7c\x08\x1e\xd5\x92\x69\xaa\x1a\xbc\x93\x64\x50\x15\xa7\x1c\xbc\xcf\xb4\x61\x0b\xa9\x6c\xf1\x0b\x3b\x7b\x4b\x2e\x2c\x3b\xd7\xb0\x78\x69\x55\x54\x43\x59\xbf\xe4\x94\x9c\xab\xe3\xc0\xf3\xbc\x52\xa6\x2a\x32\xce\xc0\x5d\xd5\x92\xbb\xba\x25\x73\x30\xd9\x03\xf7\x65\x87\xef\x83\xbd\xe9\x9e\x63\x71\x92\x97\xea\x35\x9f\xaa\xf1\x50\xf6\x67\xa5\x87\x65\xd7\xa0\xff\xa5\x7d\x69\x60\x68\xa9\x27\xae\xb5\x2b\x86\x86\x8e\xb2\xea\x17\x2b\xba\x26\xa6\x80\x61\x10\xfb\x6e\xaf\xf1\x3e\xaa\xb3\xdb\xf3\xd7\x36\xb7\x41\x5c\xf5\x31\xab\xe9\x09\x98\xf4\x1f\x82\xb6\x83\x22\xf5\x1c\x89\x52\x4a\x2a\x7b\x91\x50\xfd\x06\x68\xbf\x3d\x62\xd4\x50\xf5\x13\x35\xd9\x6e\x07\x15\x69\xc9\xc9\xfb\x03\xb7\x20\x5e\x53\x70\xd6\xa1\x9c\xb5\x60\xbc\xad\xc1\xb8\x5f\x78\x14\xe8\xc3\x87\xa0\x5a\x14\x1f\x1b\xba\x30\xa2\xb6\xad\x45\x32\xb6\x35\xe1\xe1\x0a\x38\xa9\x8a\xea\xaa\x9b\x6a\x66\xcd\xfb\x7f\xb7\x79\xbd\x57\x26\x95\x7b\x48\xda\x3e\x8f\x68\x98\xb0\x3f\x56\x3b\xd5\xbf\x70\xc4\x9e\x6d\x87\x2a\x31\xb1\x19\x78\x0e\x0e\xdb\x6c\x8e\xf3\x4a\xa0\x1f\x34\x3a\x6f\x62\x17\x3c\xd7\x4f\x61\x4d\xd7\x9a\x52\x6f\xb2\xb7\xc3\xbd\xbb\x74\x4e\x7e\xd5\xc3\xd4\x75\x92\x96\x30\x66\xa5\x74\x5f\xe0\xb6\xd2\xb4\x15\xbd\xa7\xad\x5c\x75\x28\xbc\xc9\x37\x32\x63\x34\xa2\xb3\x9d\x38\x6c\x4d\x7b\xd3\x9d\x24\xf5\x51\x01\x88\x7a\x9d\x53\x72\x7a\x5e\xea\xb5\x9b\x5e\xe3\x28\x3a\xd5\x13\xa9\x95\xca\x77\x73\xfe\xd1\x76\xf2\xee\x57\xe0\x5b\x2e\x8a\x92\x6b\x38\x84\xa9\xd9\x3f\x6b\x84\x54\x83\xde\x19\x10\x59\x59\xd5\x40\x4d\x45\x1d\x08\x8d\xd4\x77\x05\xb3\x93\xc1\x69\xba\x2c\x3c\xd9\x73\xd2\xf6\x66\xaa\x59\xdd\x17\x29\x00\x0c\xe0\x72\xde\x22\xff\x9b\x5e\xee\x95\x2c\x60\xbf\x1d\xaa\x61\x74\x6a\x61\xa6\x5b\x26\x95\x16\xd7\x5e\xb4\xc2\x58\x21\x94\x51\xc1\x06\x34\xf8\xae\xc8\xf7\x6a\x90\x73\xa9\xb5\x9c\x70\x6d\xc9\xdb\x58\x01\xd4\x67\x2d\xf3\x95\x11\xd2\x95\x38\x94\x2d\xa9\x71\x95\xc7\x06\xda\xd5\x34\xec\xa9\x00\x1f\xf9\xde\x07\x0e\xc8\xa2\xe4\x84\x2d\xc1\x3b\xa9\x54\xe5\xc0\x98\xad\xfb\x87\xa4\x1f\x72\x76\xc6\x73\x36\x56\xfd\xfc\xec\xbc\x3a\x99\x38\xe8\xd0\x4d\xb0\x15\x3c\xd2\x03\xae\x4c\x53\x71\xb9\x84\x04\xcd\x19\xaa\xee\x6b\x21\x57\xfa\xf9\x3b\x65\x19\x46\x5b\xd3\x1b\xef\xe7\x9b\xd5\xd8\x96\x69\xde\x5a\x5a\x55\x6f\xee\x14\x5f\x37\xe3\x25\xd5\xcc\x66\xa2\x18\x47\xcb\xca\xfc\x6f\xba\x28\xf5\xe1\xd6\x7a\x99\xe1\xc6\x76\x7a\x5a\xd5\xbf\x1c\x55\xe1\x74\x70\xa9\x31\x68\xe3\xec\xb4\xb7\x22\x18\xd2\x84\x3b\xd7\xf2\x65\x4b\x4e\x65\xa3\x4f\xc1\x5f\x01\x6c\x6e\xaf\x74\x1b\x6f\x4c\x2a\xfd\x15\x9c\xb6\x8d\x1a\xed\xa3\x7d\x5b\x6f\x27\xa1\x22\xaf\x0a\xb9\x02\xd2\x72\x65\x22\xd7\x35\x53\xbb\x3c\xd8\x07\xf6\xd1\x62\xa7\xd5\x56\xb5\xdf\x03\xf7\x7b\x7c\xa4\xff\xdb\x93\x83\x01\x18\xaf\x39\x95\x3a\x35\xf8\x2f\xe6\xae\x2b\xe4\x82\x62\x3e\x5e\xf6\x97\x8a\x2b\x09\x31\xb4\x07\x36\x6d\x8c\x75\x49\x06\x53\x3a\xfb\x7c\xaf\xcf\xf9\xa3\xfd\x6f\xec\x55\x19\x09\xd1\xbe\x48\xb6\x48\xa8\x4b\x42\x8d\xda\xd9\x4a\xd3\xae\x72\x26\x97\x24\xd5\xf9\x99\x5c\x2e\xea\xe7\x0d\x4f\x9f\x00\x04\xdb\x3b\xaf\x2e\xa4\xc9\x74\x44\x3d\xda\x56\x69\x2f\xf2\x3e\xbd\x0c\x4e\x33\xeb\x00\x28\xd3\x17\x6b\x27\xa1\x9b\x9f\x7a\xf4\x95\xf0\x52\xd1\xda\x80\x07\xf9\x77\xcd\x65\x5d\x73\x13\xeb\xb4\xf8\xc0\x6d\x5f\x4c\x13\xdf\xd9\xcb\xf5\xe6\xea\x78\xe9\x9a\x16\xb4\xb0\x5d\x3a\x6e\xc4\xec\xf0\x23\xd8\x83\xee\x00\xbc\x6b\x05\x7d\x57\xb6\xaa\x16\x35\x88\x7a\xd7\xb9\xf3\xd5\x0e\xd7\xc3\x87\x8a\x44\xe5\x42\x78\xaf\xdb\x7c\xbb\xb4\xc9\x84\xe8\x4c\x7e\xe0\xa3\xb2\x09\x26\xb3\xb2\xb1\xc1\xea\x42\xda\x46\x77\x90\x31\x33\xb3\x62\x2c\xf2\x99\xb1\xad\x36\x03\xd9\x6d\xe9\x14\xea\xe5\xc9\xd8\xac\xd8\x41\xdb\x1d\x3d\x44\x23\x2b\x02\xc7\x42\x9d\xcc\xe5\xa8\x6f\xb6\x73\xca\x9c\x5d\xd3\x08\x0d\xea\xb0\x1d\xbb\x76\x01\x38\xe9\xf5\xd8\x99\xf5\xbf\xfe\x1a\x74\x62\x3a\x10\x1a\x81\xce\xf8\x82\x2b\xe3\xc2\x43\xcd\x1c\xd0\x53\xba\xc3\x36\x75\xe5\xaf\x56\x56\x7a\x14\x62\xf4\x95\x9e\x7e\x31\xa4\x3a\xcb\x1c\x4d\xb3\x1a\x2d\xb6\x31\xe6\xf2\xe0\x81\x9c\x13\x0e\x5a\xbe\xb0\x98\x51\x56\x34\x06\x91\xa3\x10\x64\xb2\xb4\x68\x30\x78\xe9\xc4\x0d\xa2\x06\x80\xce\x80\x64\x23\x6b\x90\xcb\xfe\x0c\xd6\x94\xf9\x0b\x80\xd3\xee\xe5\x53\xe7\x81\x95\x6d\xbe\x9d\xcf\x64\x13\x50\x5b\x75\x27\xc9\xda\x10\xdd\x38\x5c\xbd\x09\x58\x01\xa9\xce\xd4\xd2\xa1\xe5\x1b\x34\x5d\x99\x74\x6f\x7a\x88\xaf\x28\xf9\x35\xc0\x47\x8b\xc5\xe0\x96\x53\x77\xf3\x46\xd9\xbe\xd9\x6a\x9b\xa6\x8f\x73\x33\x9f\xe9\xb2\xca\x76\x65\x51\x82\x6e\x5f\x66\x20\x2f\x1a\x3d\x4e\x76\x76\x08\x7a\x1f\x41\x8e\x1a\xd5\x5f\x92\x6b\xc3\x76\xd3\x01\x2d\xc5\xac\x46\x64\x74\xc3\x0a\x63\xa2\x65\xe3\xb0\x77\x7a\x6a\x70\x6f\xa4\x76\xaf\x83\xaa\xcf\x64\xb1\x70\x54\x14\xbd\x83\xa8\x25\x79\x75\x67\x6d\x3f\x5c\xe6\x34\x96\xa4\x3a\x68\xef\xf0\xa6\x7a\x44\x7f\x78\xb8\x32\x67\x38\x76\x70\x5c\xbc\xac\xd2\x80\x84\xd0\x31\x8a\x3b\x96\x6f\xa5\x86\x83\xb1\xc5\xdf\x18\xb2\x16\x2b\xfb\xe8\x23\x7b\x38\x2b\xd3\x4b\xab\x1a\x8f\x4f\xef\x6d\xde\x83\xae\xec\x5b\x74\x0f\x44\xd5\xa0\x3d\x7b\xfa\xfd\x0b\x50\x94\xcc\xec\x69\x58\x53\xa3\xbd\xb5\xfe\x74\x15\x75\x63\x95\xbe\xe9\x97\x05\x0f\x80\xd9\xa6\x91\x68\x5d\x43\x5a\x57\xe0\xe0\xc5\x66\xc6\x2d\x79\x7d\xb0\xcb\xac\x2a\xd7\x49\x6f\x7b\x2b\xc1\x66\x18\x46\xd7\x82\xa6\xe0\x6a\xfa\xdb\xce\x8a\x4e\x67\x1b\x50\x9f\x9d\xfd\x96\xc6\x1e\x6b\xbd\x15\x0a\x1e\x17\xe7\xf9\xc8\xe6\x73\x9f\xc9\x5d\xab\x94\xfc\x83\xa3\xa4\x8d\x8c\xc6\x0a\x15\xb6\x85\xa6\xbd\x99\x06\xf5\x64\x8b\x93\xb3\x9b\xb1\x4d\x70\xf4\x10\xc7\xc8\x25\x1c\xe8\xf4\x68\x57\xcd\x52\x46\xcf\x08\x1d\xeb\xe0\x7c\xa8\xa8\x46\x8d\xae\xa0\x51\x98\x9d\xee\x91\xf2\x5d\x07\x88\x59\xc0\x90\xf2\x5d\x6f\xd9\xa2\xee\x0a\x38\x10\xcc\xb9\xc4\xa6\xf2\xe6\xd0\xa1\x5f\xda\x28\x24\x9b\x4a\xeb\x6d\x8c\x3d\x6d\x36\xff\x5d\x63\xc0\xa9\x0f\xad\x5d\x57\xf7\x01\x5a\x48\xd6\x4c\xcc\xe5\xaa\x59\xd0\xf0\xcb\xd5\xc3\xe3\x6f\xc9\xb8\xf9\x46\x8c\xe3\x2f\x37\x0f\x6f\xe2\xe6\xe1\xb7\xa4\xfc\xb7\xba\x78\xf8\x2d\x29\xaf\x7d\xef\x50\x11\xd6\x97\x6b\x87\x9f\xfd\xda\x61\xf4\x67\x12\x62\x9f\xcf\x04\x2e\xbc\x29\x13\xb8\xf0\x06\x4c\xe0\xa2\x5b\x94\xd6\xf8\xf8\x58\xb9\xe4\x3a\x6e\x7d\xcc\xad\x95\x76\x28\xc0\x3b\x4b\x54\xa7\x22\xed\xde\x6a\x43\x4d\x3b\x5a\x6b\xf6\x07\x9c\x72\x8f\x7a\x86\xd9\xad\x8a\xa0\xe9\x4c\x36\x7e\xb3\xde\x4b\xc2\x31\x89\xfd\x73\xb6\x7a\x55\xfc\x33\x8a\xec\xb5\x04\xb5\x95\xc8\xfe\x39\xdb\xe9\xaa\x78\x17\x4f\x23\xe2\x5a\xa9\xca\x46\x70\x66\xd6\x8a\xdf\x82\xbf\xe3\x39\x7b\x5c\xe4\xb5\x72\x73\xb5\x47\x65\x55\x25\xd7\x6e\x5a\xd7\x0b\x78\x62\x89\x78\x7b\x21\x3f\xcc\x02\xdb\x48\xfa\xb2\x21\xe4\xed\xc5\xfd\x08\x1f\xdc\xa0\xd0\xef\xfa\xa3\x4f\x87\x05\xfe\xec\x4e\x73\xe8\xae\x1e\x25\xed\x9b\x15\xcd\x82\x2c\x8b\x73\x85\x73\xe3\x86\x54\x9f\x5b\x28\x7f\x17\x0a\x3b\xfb\xd6\xe5\x03\xcf\x99\x89\xf0\x42\x13\x45\x2f\xf6\xc1\x5e\x00\xff\xcb\x14\xa2\xcb\xce\xe7\xaa\xb3\xbb\x9e\xbb\xbb\xbd\x18\xfe\xd7\x9e\xb2\xab\x71\x07\x80\xe6\x1d\x71\xbf\x65\x57\x95\xe3\x8e\xd3\x3e\xdb\xa7\xb7\xd3\xd5\x5e\xed\x00\xb6\x7d\x31\xe6\x62\xe3\x9a\x80\xd6\x3b\xb0\x5c\xdf\xc5\x4d\x2f\x51\x37\x35\x60\x97\x8a\xe5\xa4\x9e\xbf\xb3\x18\x5d\xef\x3d\xf3\xcf\xde\xfa\x2d\x5d\x77\xfe\xd9\xbb\xb1\xa5\xdf\xd0\x3f\x6f\x37\xd4\x46\xc6\xa0\x46\xba\xd6\x19\xe5\x17\x6f\x1b\x5f\xbc\x6d\x7c\xf1\xb6\x71\x15\xad\x5c\xe3\xa9\x3a\x2d\x8a\xfa\x64\x5c\x95\xdd\x79\x1b\xa5\x0b\xfe\x1a\xbd\xed\x83\xda\x75\x6d\xa0\x5e\x1c\xe7\xe4\x74\xcd\xc0\xee\xb8\xc2\xe9\xc2\xbe\x46\x57\xbb\x80\x76\x5e\xa1\xd0\x22\xaf\x49\x96\xf3\xf2\xf8\xd5\x79\x29\x08\x1d\x5f\xa9\x24\x3b\xca\xa6\xd0\xad\xe4\x19\x59\xae\xf3\xd5\x92\xec\x56\x45\x74\x7c\x5c\x9d\x90\x33\x7e\xfc\x92\xd3\x5a\x69\xf6\xe3\x1b\x71\x3b\x8e\x5b\x7c\x45\x77\x30\x3b\x54\x91\x48\x44\x99\xf5\xca\xf1\x51\x51\x2c\xea\xec\x6c\x4d\x25\x3b\xee\x8b\x22\xf8\xf9\x7d\xe7\x20\x64\xf7\x95\xe4\x72\x70\x3d\xb6\x30\x6e\x9d\xe7\x7c\xf1\x1c\xf3\xc5\x73\xcc\x0d\x79\x8e\xc1\x07\x5f\x1c\x32\x7d\xf1\x9e\xf3\xc5\x7b\xce\x17\xef\x39\x5f\xbc\xe7\xdc\xa2\xf7\x9c\xa3\x92\xf3\x53\x72\xb6\xb2\x6d\xdd\xba\xd0\x91\x2a\xce\x79\xcd\xd5\x63\x7b\x67\x8e\x77\xa2\x27\xc7\x25\x17\xed\xb5\x12\xc6\xcf\xb4\x21\xd4\x92\x8b\xb9\xfa\xb0\x57\xa4\x73\x0d\x43\x25\xc8\xdf\x36\xde\x3a\x0c\x56\x09\xea\xc3\xa6\x28\xd4\xff\x8f\x72\xfe\xa1\x12\xed\xf7\x81\xa9\xcb\x6e\x20\x83\x43\x05\x7c\x6e\xbf\x9b\x7b\xc0\x2a\xe2\x3b\xd3\x22\xdd\xb2\xfb\xfa\x2a\x86\xd3\x37\xf6\xb8\x05\xd3\x40\xfc\xfa\xeb\xe6\xb7\xbd\xa6\xf3\x4d\x1b\xd3\x35\x4b\xae\xa2\x1d\xb3\xe4\x96\x69\x1d\x1c\xfd\xae\x6b\xdf\x77\x5a\x34\x53\x6d\x36\x31\xb3\xc6\x46\xf8\xac\xe9\xf5\x7e\xdb\x7f\x6d\x3e\xf3\x52\x8e\xb5\xb5\xe7\x2a\x3b\x60\xbd\xb1\x3a\x7e\x6d\x24\x81\xad\xe9\x44\x7b\xc3\x45\x97\xec\xa3\x60\x5e\x72\x76\x4e\xb9\xd3\x39\xed\xf6\x78\xa6\x01\xb5\x37\xca\x3a\x4e\x91\xc1\x7d\x9d\xac\x07\xc8\x5c\x11\x9b\x01\xe8\xde\xaf\xea\xd6\x6b\x9e\xa4\x16\x8c\xbf\xb1\x9d\x7c\xab\x1f\xad\x76\xa2\xb4\xb1\xdb\x6f\x00\x94\x1d\xef\xa4\xf4\xef\x34\x76\x6c\x52\x2a\xea\x32\x35\x5a\x04\xec\xaf\xf4\xb5\x63\xd1\x59\xfd\x99\xd9\x51\xd2\x74\xdb\x8c\x89\xfc\x73\x47\x1b\x89\xb6\x6e\x13\x45\xb6\xa8\x79\x29\x17\x30\x2e\x5b\xb4\xb1\xe6\x29\x83\x73\xbb\xe4\x77\x70\xa1\x3b\x31\xbf\x98\x81\xa5\xf9\xb9\x6c\x6c\xab\xaa\x4f\x6d\xd7\xb9\xb1\x13\xa6\xe2\x8c\xd9\xdf\xcb\xe6\xf2\xf7\x63\xdd\x0f\x75\xc3\x9b\x94\x9c\xa8\x59\x9f\x13\x7a\xa2\xfb\xaa\x9c\x51\x33\x50\x58\x7f\xb8\x5f\x83\x8a\x92\x05\x9f\xab\x66\xbf\xe3\xf5\xa3\x92\x93\x17\xc2\xa1\xf9\xf6\x6a\x7c\x3f\xb1\xa1\xa4\x99\xaa\xe8\x6f\x12\xde\x4b\x52\x67\x85\x73\x8b\x4c\x7e\x2a\x75\xca\x4d\x37\x5e\x7c\xe5\xb0\x75\x13\xdc\x4b\x6c\xeb\xb8\xc9\xbd\x89\xa5\xfa\x78\xe8\x52\x18\xb8\xa7\xeb\xed\xf9\xb8\x72\x49\xc0\x70\x95\x25\x57\x09\x63\xdf\x50\x9d\xfc\xad\x68\x4d\x01\x76\x28\x4c\x7e\x6b\xda\x35\xec\xd6\x47\xb9\xf6\x1a\x5d\xd1\xa2\xe4\xc6\x37\x3e\x07\xed\xbb\xd6\xb2\xf8\x38\x93\xea\x85\x8c\xfd\x58\x94\x55\x0d\x88\x4c\xac\x75\x5b\x1b\xfc\xff\x2a\x93\x5e\x29\x18\x5d\xdc\xb7\x09\x13\x05\xea\x8c\x94\x3c\xaf\x5f\x65\xff\xe2\x33\x03\xa9\x87\x7b\x9d\xe1\x91\x46\x4f\x9b\x1b\xdc\x73\x3e\xac\xa8\x28\x8b\x8f\x26\x63\x59\x7c\x9c\xab\x9e\xdf\x6b\x7e\x36\xf2\xf2\xb8\x2c\x3e\xfe\x3f\x5a\x04\x98\x9c\xdb\xc9\x03\x4b\xe2\xf6\xa1\x51\x96\xef\x1b\xaf\xfe\x59\x6e\x4a\xc8\x9f\xa6\x94\xaa\xb3\x31\x8f\x7b\x4a\x2e\x6c\x66\x72\xd1\x64\x26\x17\x9d\xcc\x7a\x58\x0e\x8c\x75\x76\x5d\x81\x75\x9b\x3d\xd3\x20\xa0\xda\x4e\x6e\x1a\xa0\xe6\x8c\xa6\x37\xaa\xf6\xb6\xc2\x7e\x22\xb9\x70\x09\xd3\xe2\xea\x9b\xb6\x59\x0e\xaa\xef\x29\x00\xf7\xdc\x21\x01\x0f\x6d\x99\x59\x53\xf8\x21\xe8\x15\xca\xf2\x6e\xa1\xa9\x94\xe6\xb6\x0f\xad\x60\x71\x8d\xf8\x35\x77\xdd\x1b\xf4\xaf\xa6\xae\xd2\x8a\xfe\xfd\x52\xd9\x20\xcd\xaa\xef\x17\xe7\xd5\x89\xc3\xaf\xc5\xc7\xc6\xfe\xb8\x43\x32\xa6\xab\xda\xf0\x71\x43\x21\x0f\x9d\x2c\x53\xed\x46\xbb\xbd\x79\x2b\xe1\x4a\x2e\x6a\x21\xfe\xd5\xa9\xda\x88\xad\x86\x40\x56\xaa\x75\x32\x35\xb2\x5c\x4d\xca\xe7\xe5\xdf\xbb\x99\x2e\x3a\xd3\xbd\x33\xdd\x81\xde\xd6\xc1\xcc\x3c\xc4\x95\xed\x6f\x96\x7e\xee\x93\x5b\x77\x4a\xd0\xf9\xe4\x5a\xa5\x8d\x9b\x4b\xc2\x90\x0d\x70\xe3\x96\xdd\xd6\x2c\xdd\xb4\xc6\xec\x7e\xd3\x3f\x37\xd5\x5a\xed\x6f\x39\xa1\xc1\x42\x07\xdf\x2d\x9d\x6b\x42\xfa\xd1\xa0\x6e\x5f\x76\xc9\x45\x04\xb8\xef\x7e\x6a\xf0\x0f\x54\x83\xcd\x15\x6b\x85\xbc\xfb\x87\x6e\xfd\xf6\xfa\xe8\xc3\x87\xe0\xe3\x09\xa9\xf7\x2a\xf0\xaf\x3b\xb6\x81\xff\x72\x9e\x31\xe9\xc7\xb3\xda\xac\x10\x3f\x25\x59\x0e\x2e\x9a\x37\xb4\xa4\xaa\xd5\x6b\xd2\x42\xc8\xe6\xdd\xe9\xf6\xef\xfe\xe1\x96\x6d\x3c\x18\x9b\xae\x5d\x82\xd5\x23\xb4\xdc\xef\xa0\x1c\xdc\x6f\xd1\xa2\xb9\xd8\xce\x90\x2b\xb4\x04\x1e\xb4\x59\x7b\x53\x76\x6b\xdc\x72\x95\xaf\xfa\x69\x57\xe7\x2a\xeb\x00\xe0\xc6\x98\x4a\x03\xfc\xeb\x0a\x36\x1d\x96\xea\xd6\xd9\x66\xe9\x33\xd4\xeb\x01\x12\xbe\x3d\x86\xea\xb3\xb2\xcb\x58\xb2\x71\x43\x2c\x63\x3b\x37\xc8\x6c\x2e\x3f\x69\x14\xac\x65\xa7\x5f\x35\xd6\xfa\xdc\xb4\xec\x52\x6a\x43\x3e\xb2\x49\x2d\x3b\xbd\x6e\xd9\xc9\x15\x56\x2e\x07\x99\x47\x86\xbd\x66\x76\xd9\x62\x5d\x65\x57\xe0\x8b\x8b\xfd\x3e\xaf\xd9\xfe\x69\xb6\x30\xba\xe4\x00\x03\xda\x7c\x3d\x9e\x38\x1b\xe0\x85\xb3\xab\xf3\x80\xda\x77\x6c\x09\xff\xf0\x70\x95\x26\x7b\xaa\xc2\xae\x13\x59\x5f\xef\xdf\x8d\x71\x1b\xc5\xee\xa5\x36\x37\xf0\x81\x2f\x96\xea\x75\x78\xfe\xce\x2a\x79\x8d\x5a\x27\x95\xf0\xbd\xaa\x5d\x19\x66\x79\x5d\x80\xea\x9f\xe7\xa4\x6c\xd4\xbe\x4a\x2b\x77\x26\x72\xe9\x22\xd3\xc6\x4d\xf4\x9a\x64\x50\x8f\x5b\xbb\x8c\xdd\x7a\x41\x57\x82\xd2\xac\x46\x7a\x8b\x90\x83\x36\x43\xf1\xb1\x79\xbd\xa1\x63\x52\xae\x5e\x45\x36\x6a\x08\x50\x56\x8b\xb8\x8e\x97\xd9\xb5\xb2\x5b\x15\x40\x90\xb2\x29\xd5\x95\x1b\x8e\x07\x1f\xa3\xd5\x1a\x79\x62\x81\xd1\xf3\x52\x0e\x41\x0b\xaf\x01\x54\x29\x6a\x71\x55\x45\x4b\x2e\x33\xd5\x1b\xab\x45\x28\x50\x66\xe7\x0c\x14\x65\x66\xad\xed\xb5\x80\xe4\x12\xc7\x59\xd3\xac\x5b\xca\xb4\x95\x48\x15\xd8\x61\xc7\x87\x1a\xfd\x6a\x89\xe1\x60\xad\xe6\xa7\x67\x0e\xe8\x4e\x55\xed\xbb\x14\x2b\x93\xe7\x66\xb9\x62\xdd\xcc\x9a\x07\x43\x2e\x90\xf6\xc9\x3c\xec\xd8\x88\x91\xf8\x51\x46\x2a\xec\x1a\xbb\xf8\xa8\xad\x1f\x58\x7c\xbb\x40\xde\xc0\xd6\x0a\x4b\x53\x6d\x23\xab\x1a\xad\xde\x1d\x96\x81\x35\x46\xb5\xb2\xba\x70\x1f\xa8\xeb\x82\x7f\x39\x54\xe4\xd0\x7b\x8a\x6e\xb7\x7f\xb5\x41\x32\xb5\xcd\xd9\x1f\x18\xf5\x20\xca\xed\x77\x75\x92\x89\x7a\xe2\x1a\x8f\xd1\xe4\xa7\xea\x19\xf5\x36\x2b\x35\x93\xb4\x28\x6b\x63\x83\xb0\x5c\x02\x02\x58\x26\xd4\x3e\x6b\x3d\x58\x69\x83\x8f\x07\x7a\xee\x3a\x2b\xce\x26\x53\x83\x93\x26\x8f\x66\x96\xae\xb0\xd3\xe8\x28\x95\xac\x50\x62\xdd\x69\xeb\xd6\xb4\xda\x69\x46\xf3\x64\xb4\x4b\x1a\x3d\x04\xb4\xcb\x00\x83\x83\xfe\x83\xd0\x16\x94\xbb\x05\xb3\xa1\x07\x52\xb5\xeb\xd0\xc8\x9a\xc6\x5c\x8e\x2f\xa5\xcd\x6e\x8a\xb3\x93\xd2\x65\x81\xde\xf2\x7d\xc0\x07\x51\x23\x04\xe9\x30\xad\x5d\x4e\xed\x92\xdb\x91\xec\xb2\xda\x76\xa2\x32\x3b\x95\xdb\x38\xf1\x1e\x3c\x32\xdd\xc6\x8b\x37\xbe\xb2\x1b\x6f\xd3\xaa\x35\x0e\xbc\x4d\x8e\x89\x2b\xa7\x8f\x4b\x2e\xb0\xe1\x4e\xed\xef\x91\x9f\x9e\x19\x87\x85\x33\x99\x5a\x9b\xc4\x61\x3f\xdf\x06\xa4\x95\x39\x8d\xca\x76\xac\x95\xb5\xfe\xf1\xd7\xac\x63\xf4\x68\x22\x73\x4d\x67\xe0\x58\xfb\x54\x86\x07\xfa\xd7\x5f\x54\x69\xfd\xd1\xea\x75\xda\x5e\xd2\x9b\x63\x73\x86\xd5\x1e\x99\xa9\x98\x41\xc2\xd1\x0f\xf8\x1a\xaf\xe8\x13\xd5\x29\xe5\x05\x6a\x93\x03\x72\x85\x15\x70\x68\xbb\xb7\x8d\x0b\x72\x8b\x89\xa9\x3a\x9a\x32\xc6\x17\x14\x9c\x99\x7e\x6a\xf8\x76\x4e\x8b\x9c\x12\xf5\x76\xac\x9a\x4e\xa7\x06\xc9\xf6\xef\xbc\xaa\x49\xad\xf6\xa4\xd5\x97\x3e\x25\xf8\x4e\x53\xc8\x2b\x99\x34\x99\x5a\xd3\xf6\xb3\x75\x3d\x70\x46\x6e\xc4\xdf\x79\x43\x28\x1d\x4f\xe7\xcd\xfd\x81\x5f\xb3\xc5\xe2\x25\xa7\x3c\xfb\xa0\x8e\x59\xab\x11\x6f\x73\xa3\xf9\x27\x39\xbf\xa8\x7f\xee\xfa\x3e\x97\x62\xa3\x89\x9e\x33\x52\x13\x75\x2a\xe3\xb8\x49\x94\x71\x5d\xcb\x71\x12\x25\xdc\x74\x7d\x14\x25\x03\x76\x45\x3a\x1e\x5c\x35\x52\x2a\xcb\x6a\x52\x1a\x55\xbc\x06\x1a\xd7\x76\xdb\xac\x36\xfc\xac\x2e\xa4\xcf\x6d\xd1\xc6\x05\xab\x1e\xef\x4b\xf0\xeb\x49\xb1\xe0\xea\xec\x48\x15\x37\xf9\x86\x9c\xb0\xae\xb6\x74\x0c\x89\x03\x5d\xea\x6f\x6b\xb7\x38\xc9\x2a\x73\xb5\xe3\x11\xad\xb3\x0f\xcd\x89\x4f\x93\x4e\x54\xf4\x73\xb5\x93\x9f\x9f\x2f\x16\x16\x35\xa3\xee\x04\xb5\x01\x31\x6d\x27\x39\xaf\x47\x1d\x0b\xf6\xb3\x19\xfd\x91\x0f\x79\x1a\x1c\x75\xe1\x56\xe4\x2d\x80\xd6\x97\xb3\x1b\xdb\x75\x4e\xd7\xe8\x38\x26\x67\x47\x11\xb5\x75\xd6\x1a\x1f\xc6\x3d\xfa\x46\x69\x3c\x74\x13\xe7\xcd\xdd\x4c\x5f\x5f\xcf\x72\xbd\x1b\xff\xed\xf2\x68\x79\xc6\xb5\x50\x6e\x15\xb5\xab\xde\xbd\x19\x92\xf1\x1d\x67\xff\x4e\xd3\xc7\xe9\xde\xf5\x14\xbb\x32\xfa\xd6\x2d\xc7\xe0\xf0\x17\x8c\x37\x49\x97\xb3\xee\x85\x18\x17\xa8\x00\x13\x77\x0c\xba\xa9\xdd\x51\x6b\x86\xfd\xc0\xc9\x72\xd9\xd6\xd2\xf7\xd1\xbf\x0e\xf6\x5a\xb8\x97\x5b\xd0\xeb\x33\x4e\x3e\x8c\x71\x55\x3f\xdb\x3a\x7a\x1d\xf7\x5f\x6c\x9a\xa8\x20\x38\x7e\x88\xdd\xe8\xb5\x14\x8b\xbf\x90\xec\x26\x81\x35\x2a\xb2\xb6\xa5\x59\x35\x0a\x23\x34\xdb\x1d\xfa\xab\xd3\xec\x0a\xec\xb5\x70\x37\xd0\xec\xe3\x45\x46\xdf\xaf\x25\x57\x95\xc3\x39\xa9\xb3\xf4\x52\xe4\x2a\xa5\xeb\x54\xd8\x44\x76\x1d\x57\x9a\xc8\x6e\x93\x1d\xb0\x1b\x9b\xaa\x3d\x01\x3e\xca\xb3\x53\x52\x73\xf6\xd4\x3e\x95\x1a\xf3\x34\xeb\x66\x9c\x50\xfd\x92\x4a\x6b\xe8\xe6\x42\x58\x56\x3d\xe3\x44\x0c\xf8\x13\xc7\xe3\xfe\xc4\xc7\x5d\x1a\x67\x95\xae\x30\x2b\x72\x4d\x4e\x8e\x77\xe1\x95\xb4\x0e\x8d\xd9\xa4\x6f\xf9\xbb\x2c\x77\x4a\x75\x13\x06\x8b\x7c\x77\x5e\x12\xb3\x27\xb5\x52\xca\xa6\x0d\x16\x7c\x42\xaa\x2c\x7f\x37\x54\x4c\xa7\x74\x7b\xf6\xcb\x19\x23\x35\x5f\xd7\xbf\xc1\x1c\x07\x0e\xfa\xec\x6e\x65\x83\xff\x35\x8e\x79\xdb\x3c\xab\xae\x79\x2f\x3a\xe9\x2b\x2e\x81\xdb\xa4\x65\x57\xac\x95\x24\xaf\x16\xa4\xe6\xe6\xc0\xa4\xe2\x4f\xf3\x7a\x32\xd1\x5b\xa1\x24\x67\xc5\xe9\x64\x0a\xee\x01\x0c\x1e\x00\x24\x7f\x98\xc5\x2a\x82\x53\xb7\x13\xda\x64\x58\x63\x8c\x13\x34\x56\x2d\xba\x84\x04\xda\x8c\x23\x1a\xc6\xbe\x26\xa2\xbe\xe6\x32\x4f\xb3\x9c\x19\x25\xbf\xe9\xc9\x74\x4c\xea\xaf\x02\x51\xd1\xdb\x00\x51\x6c\xd7\x29\xaf\x62\x86\x8b\xb6\xe2\xe8\xb3\x3a\x26\xbd\xfa\x35\xfa\x39\x71\x3c\x99\x3a\xfd\x13\x65\x71\xba\xaf\x2f\x11\xe8\xfb\x03\xed\xd5\x81\xde\xad\x01\x7b\x61\xc0\xc5\x4e\x5d\xec\x5e\x96\x19\x9e\xdb\x5f\x65\x51\x37\x1b\x57\x3c\xb6\xdf\x67\xc7\x9e\x38\x31\x93\xd2\x08\x73\x39\x53\x51\xf3\xd3\x59\x87\x97\x5c\x78\xdd\x99\xc7\x1c\x70\xa8\x23\x43\x95\xdc\xe5\x1e\xa0\x37\xf1\xd5\x01\x88\x4e\x5e\x0e\x25\x37\xce\x9b\x55\x96\x15\x1e\xb6\xd9\x5a\xc7\xcd\x2a\xdf\x89\x73\xe0\x77\xf3\x94\x73\x7d\xea\xe9\x53\x50\x4b\x45\x7b\x8d\xe4\x50\xc6\xb7\x1d\x39\x72\x1f\xec\x9d\x5d\xcc\xc0\x50\xec\x74\xc5\xd6\xa5\x24\x2a\x07\x14\x9c\x01\xb8\x9a\x89\xd4\xc6\xe5\x88\x79\x75\xac\xf2\x8b\xa2\x3c\x5d\xc9\x99\xca\x19\x61\x1f\x8c\xcf\x10\x60\x3b\x2a\x03\x3d\x4a\x5b\x33\x4d\x81\xf5\xe4\xdd\xc9\x79\x39\xdb\x72\x6c\xae\x38\xc8\xeb\x40\x0d\x3d\xc6\x18\x79\x71\xdd\x41\x92\x94\xd4\xfd\x48\xad\x05\x18\xd7\xc3\xe6\x11\x76\x57\x8d\x58\xd9\xf5\x33\x3a\x45\x9f\x88\x06\xf4\x82\x2d\xf0\x3c\x3a\xe7\xee\x83\xaf\x46\x52\x56\x41\x58\x47\xd4\x96\x69\x57\x73\x34\xde\xa8\x1b\x86\x5d\xcd\x73\xa1\x93\xff\xbe\x9a\xb2\xd4\x29\xaf\x7b\x09\x97\xd3\x69\x27\xc6\xfd\x72\xd4\x5c\xab\xe4\x4e\x47\x57\xff\x2b\xd8\x5f\xab\xed\x0d\x8e\x52\x3b\x87\x75\xb6\x7a\xae\x46\x8f\x59\xf5\x37\xb2\xc8\x98\x25\x48\x03\x7c\x3a\xb0\x77\x7b\x45\x3a\x5f\x14\x39\xef\x41\x75\x9b\x3c\xa0\xfa\xef\xee\xfc\x7c\x4d\xab\x4d\xd2\x64\xa0\xe6\x1b\x9c\xe6\xaf\xf6\xc4\x69\x88\x71\x1d\x9e\x6b\x27\x3c\xed\x5b\xf3\xff\x08\x21\x1c\x19\xd9\xfa\xe0\x84\x10\xee\xd9\xce\xb8\xb8\xdd\x44\x75\x72\xc5\xb7\x96\xdc\xd4\x4d\xd5\xb2\x28\x6a\xbb\xe7\x9f\x0d\xac\x23\xbc\xa1\x75\x84\x41\x77\x77\xc1\x64\x22\x3b\x19\x9b\xd6\xf6\xdd\x88\xef\xb8\x28\x7f\xaf\x30\xaa\xb6\x85\x79\x65\xcf\x81\x1e\xd9\x29\xa7\xd2\xcb\xf3\xb6\x4d\xd3\xf6\x34\x43\xf6\x73\x5f\x85\xce\x8a\x54\xdd\x7c\x50\x8a\x2f\x38\x04\x5f\x75\x0e\x63\x95\x59\xbc\x4e\x4c\x63\x9f\xed\x56\xf5\xc6\x2b\x4f\x09\xbf\x37\x44\x60\x1c\xe1\x9b\xad\xd7\x07\xb2\x33\x0f\xe4\x4c\x9f\xcd\x86\x3d\xe6\xdb\x8c\xea\x36\xac\xca\xa9\xfa\xaf\xef\x51\x0f\xbb\xcf\xdf\x76\x7d\xda\x16\xee\x22\xf9\xeb\xaf\xc1\x10\x8e\xc1\x37\xbd\xe8\xe1\x0b\xd8\x39\xe3\x17\x5d\xfd\xd0\x8e\x89\xa2\xdc\xb9\x43\xe6\x9a\x0c\x3a\x05\x1d\x39\x6e\x2f\x5a\x6f\x29\xcf\x1f\x2d\x16\x12\xe8\xd8\xb6\x7d\x37\xd3\x64\x68\x4b\xcc\x1f\x5d\x82\xdb\x35\xa6\xc9\xb7\x66\x85\x69\x73\xac\xae\x2f\xd5\xe6\x7f\x9b\x41\x7e\xf6\x93\xcd\x2d\x7b\x27\xc7\xff\xf0\x8e\xae\xec\x5e\x77\x6c\x33\x3a\xb1\xed\xc6\x88\xbe\x6a\x50\xd4\xed\xfd\x72\x7d\x07\xbe\x81\x66\x6e\x59\xc3\x2e\x15\xec\x77\xce\x18\x55\x23\xb5\x37\x65\xed\x4b\x79\xeb\x15\x8b\xb9\xb5\xed\x40\x6f\x6f\xd4\x9b\x8e\x59\xf1\x39\xed\x08\x27\x6d\x4d\xe5\xa5\x6e\x79\x73\x66\xa9\x05\x62\xf7\xd8\xb2\xcb\xf1\x0e\xfd\xab\x8e\xb6\x70\x66\xc0\xfd\x0d\x37\xd1\x91\xd9\xb9\x5b\x4b\x46\x26\xcf\x20\x15\x05\xa3\x54\xb4\xb2\x53\x1a\x34\xbc\xe4\x66\xcb\xc9\x29\x77\x29\x21\x98\x9b\x98\xff\x94\xed\xd4\xaf\x46\xf6\x53\xed\x99\xb3\x79\x5c\x01\x5c\x45\xa1\xc5\x6f\xb8\x25\x97\x86\x1b\xb9\x34\x1c\xe1\x52\x17\xf9\xa1\x65\x43\x77\x76\x3a\xb6\x47\x96\xed\xf9\x65\x77\x85\xdd\xd9\xfd\x95\xb0\x54\x9e\x79\x2f\x61\x78\x3f\xb8\xcd\xde\xc6\x75\x46\xfe\x43\xc6\x3f\x7e\x5b\x5c\x80\x43\xbd\x99\xb0\x25\x6b\x1e\x74\x34\x05\xeb\xca\x1c\x1c\xba\x35\x7f\xe3\x0c\xc6\xc5\xbe\x93\xa2\x6e\xb9\x39\x9f\x1a\xd3\x0f\x01\x6e\xbb\xb0\xec\xe4\x5f\x76\xf3\x37\x77\x7b\x70\xa3\x7a\xee\x77\xc6\x59\xdf\xa4\x5f\x2e\x0a\xc2\xd4\xc3\x94\x2e\x02\xbf\xfe\xba\xdb\xca\x37\x8e\x2d\x72\x5d\xc8\xad\xdc\x11\x68\x6a\x2e\xdd\x7c\x57\x61\xe8\xe9\xf5\x9b\xbb\x1f\xad\x5a\xa3\x5e\x4e\x7c\xbb\xfc\xce\x90\x86\x62\x0f\xa7\x3a\xcb\xb0\x33\xb0\xb7\x37\xed\xc9\xbb\x5b\xa8\xdd\xd0\xa7\x5d\x0d\x5d\xbe\x05\xfb\xea\x76\xd9\xb5\x14\x22\x77\x05\xe1\x70\xab\xbb\x0c\x35\x64\xb8\x6f\x7f\xf4\x8f\x63\xf7\xfb\xc3\xd8\x66\x68\xe9\x6f\xdf\xf9\xdd\xa6\x2f\x48\xca\xa5\xf6\xed\x68\xde\xcd\x38\x9b\x1f\xce\xe4\x01\xd6\x49\xf3\xb5\x62\x7c\xd2\x5d\xbd\x7d\xb5\xa3\x14\xfd\xa7\x1a\xaa\x0f\x72\x2d\x47\x6a\xae\x96\xc4\x66\x97\xaa\xd1\x7c\x87\x96\x47\x1b\xe4\x5c\xb4\xa5\x9c\x8b\x36\xca\xb9\x68\x40\xce\x35\xba\xa6\x93\xab\x89\x73\x33\x56\xf5\x72\xe1\x66\x52\xdf\x6b\x67\xb5\x68\x70\x56\x53\xfe\x82\xd5\x8a\x63\xec\x55\xb5\x29\x3d\x03\x6f\xf6\x54\x8f\xf6\x66\x60\x4f\x37\x5c\xfe\x6a\x1a\x27\x3f\x54\x23\x54\xac\xb5\x5e\xf7\xb6\xab\x45\x90\xba\x2e\xab\xdd\xe7\xc5\xad\x56\x34\xba\x47\x2b\x8a\xc8\x8d\x2c\x3d\xf6\x58\xf6\x61\x6f\x78\x0f\xda\x59\x25\x5c\xd5\x64\xca\x64\x3a\x69\x17\x16\x1f\x4b\x72\x76\xa6\x3c\x15\x34\x10\xa7\x2b\x03\xbf\xdf\x5d\x20\xea\xc1\x07\xbf\x37\xf7\xdd\x14\x9f\x2d\x88\x64\x6f\x09\xe8\xbc\xac\x8a\x72\x1f\xec\x99\xfa\xf6\x36\x4d\x4a\xce\x09\xc0\x6c\x8b\x65\xd7\x95\x36\xf5\xae\x6a\xc2\x65\xc3\x96\x5e\x07\x0f\x8a\xbc\x24\x1e\x36\x74\xaf\xb3\xfb\xef\x2c\xd0\x9a\x55\x88\x9b\x61\x47\x5a\x7d\x67\x74\xb8\x45\xcd\xcb\x57\x1f\xde\x19\x4c\x54\x5d\x2d\xae\x45\xf4\x74\x70\xc9\xd8\x28\xb4\x03\x8b\xad\xb7\x1d\x17\x38\xe6\x12\xd5\xc1\x9d\xcb\x6d\x76\xbb\xde\xdc\x6d\xee\xe4\xdd\x7d\x3b\x6d\x0c\x4e\xcc\x59\x56\x9d\x2d\xc8\xd2\x08\xa0\x3d\x03\x74\xaf\xcd\xd0\x98\x28\x34\x67\x5d\x06\xd1\x57\xb5\xfe\xd4\x31\x00\x68\x87\xe7\x5a\x40\xe4\x74\xbb\x13\x08\xed\x6d\xed\x4e\xcb\x58\x57\x07\xa1\x25\xa7\x32\xd4\xd9\xae\x84\xae\xd9\x1f\x6a\x2d\x81\xee\xd2\x9e\x6d\x8c\xd9\x8d\x96\x6e\x7c\xc4\xed\x50\x56\x4e\xe4\xda\x24\x9f\xde\xa8\xdb\x01\x84\x36\x88\xa7\x07\x44\xef\xea\x5d\x0b\xc8\x56\x62\x79\x0b\x38\x46\x99\xfc\x03\xc6\xc3\xb4\xe1\x1a\xe4\x74\xbd\x91\x34\x8a\xec\xff\xc2\x9e\xb7\x1b\x2e\xb7\xde\x75\x25\x95\x5e\x88\xad\xad\xe1\xb9\x5d\x2f\x18\x9f\xee\x86\xb4\x82\x71\xd9\xf3\x3b\xfd\xbb\x0b\x3b\x62\x71\x76\xa7\x7f\x7f\xe1\x5a\x80\xcc\x1d\x86\x9d\x61\xdc\x19\x3c\x9b\xdb\x01\x5c\x5a\x14\x8b\xd9\x9d\x35\x67\x76\xd7\x80\xd9\x3d\xe1\xbd\xe6\x24\xb2\x72\x68\x7b\x53\xf0\x9e\x98\x93\xe6\x5d\xf9\x62\xf2\x66\x8f\x93\x4a\x2d\x15\xe4\xdf\x07\x59\xde\xfc\x2c\xce\x6b\x27\xda\x7e\x2e\xb2\x9c\x93\x72\xef\xed\xf4\xce\xa5\xa3\xad\x38\xc6\x9c\x8d\x3e\xd2\x08\xab\x3d\xb5\xb4\xdc\x5b\x99\x94\xe1\x3c\x00\xf7\xc0\x04\x81\xfb\xfa\xb5\x4a\xf5\xcf\xb2\x9e\x04\xd3\xe9\x6c\x98\x3a\x76\x5d\x7b\xe6\x4a\xfb\xcb\xaa\x57\x55\xa9\x35\xbe\xe9\x5a\x82\xb9\xd9\x6a\xfa\x34\x04\x47\x68\x01\x05\x10\x0e\x0e\xab\x45\xb7\x42\xb6\x7a\xfd\x31\x55\x46\x21\x34\xe2\x0f\xae\x61\xba\xdd\x79\x9f\xd1\x33\x73\x9b\x7c\x31\x73\xfb\xa7\x31\x73\x6b\x40\x55\xe7\xa7\xdf\x2e\xc7\x8d\x68\x06\x3b\x1a\x84\xed\xc3\xbf\x96\xd9\xdb\x2e\xa8\x5d\x2d\xd4\x1a\x28\xa7\xd9\xf8\x40\x7b\xc1\x8e\x16\x24\xbb\xd0\xaf\x65\xff\xd6\x05\xb4\xab\x81\x5a\x0b\x83\x5c\xac\x19\x5b\x2f\xd9\xb1\xb3\x7d\xf8\xd7\x32\x80\xdb\x05\xb5\xab\x91\xda\xcf\x62\xb3\xd9\xbf\x01\x9b\xcd\xfe\xf5\x6c\x36\x07\x9f\xd1\x66\x73\x70\x53\x36\x9b\x83\x1b\xb0\xd9\x1c\x7e\x46\x1b\xc6\xe1\x4d\xd9\x30\x0e\x6f\xc0\x86\x71\x74\x1b\x36\x8c\xe3\xcf\x6f\xc3\xf8\xf6\xac\xff\x7e\x6e\x53\xc9\xcd\x21\xd0\xe7\xb4\x30\x8c\x3f\xbf\x3d\x66\xe4\x5d\xd9\x8a\xf1\x17\x43\xc6\x5f\x0c\x19\xdf\xb0\x21\xe3\x2f\x76\x8c\xbf\xd8\x31\xfe\x62\xc7\xf8\x8b\x1d\xe3\x2f\x76\x8c\x6f\xc1\x8e\xf1\x7a\xfb\xc5\x7a\x96\x55\xca\xee\xe3\xe6\xa6\xc7\x0b\x61\x94\xb5\xde\x1d\x26\x60\x0d\x8d\x64\x79\xcd\xcb\xb3\x62\xa1\x36\x8b\x7e\xd0\x1e\xf6\xd4\x1c\xdd\xba\x10\x1e\xcc\x31\x21\x33\x90\x3a\x6e\xf1\x09\x38\x04\xf7\x89\xb5\xb4\xf6\x3e\x05\x87\x20\x05\x0f\xc0\x7b\xe2\xb8\xb0\x76\x66\x82\x9e\x79\xac\xf7\x04\xdc\x97\x85\xee\x01\x6d\x70\x4c\x19\x42\x51\xf7\xa7\xb8\xac\xfd\x75\xc7\x16\xb3\x8e\x5a\xb5\x38\x9b\xdb\xeb\x50\xfa\xda\xee\x12\x3c\x04\xb8\x01\x64\xaf\xf7\xf4\x8c\x90\xaa\xb8\x09\xcf\xeb\x72\xd9\xf5\x17\x2d\x63\x24\xb5\xa9\x1f\xc6\x0c\xeb\xa7\x4f\xc6\x1d\xb5\x01\xf8\xea\xfc\xf4\x85\x78\xca\xaa\x1e\x4c\x1b\x3d\x59\x64\xf9\xfb\x6a\x06\x32\x56\x75\x60\x67\xac\x1a\xb7\x33\x9a\xf5\x8d\x8c\x36\x26\x87\x9b\xd6\x2a\xb0\x6f\x32\x66\x9c\xa8\xeb\x8b\x96\x9d\x56\xc9\xf9\xe7\x57\x75\x04\xcb\xd9\x2b\x3b\x73\xf6\x9a\xb8\x9a\x67\x52\x97\x5c\x79\x6e\xbf\x4e\xab\x65\x23\x24\x04\x70\x08\x9a\x76\xb6\xb6\xa5\xf4\x74\x6a\xee\xde\xc9\xea\xde\xc8\x4c\x73\x1d\xfd\xb6\x6b\xdf\xb6\xb5\xb5\x6c\x06\xbc\x2d\x3c\x05\xf7\x76\x45\xc7\x91\x9d\x77\xd7\xa0\x43\xe7\xb9\x05\x74\xe8\x49\x76\x05\x1d\x3a\x7a\x13\x3a\xda\xc2\x5b\xa3\x83\x54\x94\xe7\x2c\xcb\xdf\x75\x18\xaa\x8d\x75\x98\xda\xfa\x08\x9f\x2f\xc1\x03\x90\xce\x1d\x8b\xad\x15\x27\x25\x3d\xd1\x38\xaa\x1e\xe5\x86\x78\x3a\x4c\x30\x92\xa5\x65\x88\x56\x70\xb4\x83\x5a\x35\xb6\xda\xda\xf8\x67\xb2\x40\x27\xbe\xed\xf5\x50\xbc\x9b\x7f\xd4\xbc\xa3\x6a\xc5\x5a\x03\x8f\xab\xa3\xe6\x3a\xc0\x77\x48\x56\x4d\xd8\x99\x63\x27\xdc\x69\x9e\xb6\x65\xe6\x0c\x68\x73\xe3\xde\x69\xab\xce\x94\x4d\x3b\xc6\x85\x9a\x4a\xac\x92\xd8\xab\xc4\xc1\x99\x53\x89\xd1\x7d\x0f\x3a\x99\x06\x2b\xe9\x1a\x9e\xfa\xdd\x85\xb7\xef\x7e\xcc\x5c\x20\xfb\xee\xc7\xcc\xed\xc3\xbe\xfb\x31\x73\x51\xb0\xdf\x19\xae\xcb\x96\x86\xce\xd5\x99\x89\xb2\x0b\xff\x42\x18\x3a\x71\x09\x68\x28\xdd\xf0\x23\x3d\x2f\x9f\x37\x92\x7f\x95\x22\x4c\xf2\xdc\x89\x5d\x43\x0a\xee\x70\x6d\x22\x88\x46\x63\x57\x8c\xea\x94\x7c\x93\xbd\x75\xc9\xa3\x59\xe5\x74\x46\x7b\x6e\x1d\x05\x34\x36\x96\x6d\x4b\x1b\x3b\xfd\xb3\x4e\xd6\xf6\xb6\xdb\x1a\x64\x74\x08\x4b\x0f\xac\x45\xb1\x6d\x9d\xd4\x19\x7a\xe2\xae\x89\x57\x4f\x8c\x67\xf6\x4e\x95\x9c\x36\x7f\x6d\x6d\x57\xda\xf7\x4b\x95\xeb\xc4\xa0\xb9\x1d\xb9\x30\x9c\xa6\x52\xd4\x47\x63\x55\xbb\xd6\x35\xaa\xec\xbd\x97\x2b\x6a\x36\xed\xbd\x5c\xd1\xa6\x1c\x2b\xbd\x47\xb7\x49\x72\x98\x97\x2b\xae\x60\xec\x5c\x17\x33\x15\x58\x41\xdc\xbe\x19\x50\xca\x60\x83\xfb\x81\x59\xda\x58\xe2\x76\x88\x7c\x3a\x1b\x9a\xcd\x4d\x3e\x87\xe4\xa7\xcd\x45\x2f\xfb\xd0\x43\x0f\x47\x63\x55\x7d\x9c\xfc\x4a\xce\x37\xd2\x5d\xee\x4c\x0f\x1d\x39\xa4\x9f\x67\xb9\xc2\xa0\x6f\x32\x6f\x0d\xe5\x38\xe6\x3a\x2e\x8d\x89\x57\x59\xd9\x29\xb9\xb0\xfe\x23\xae\x7e\x22\x30\x99\x1a\xe0\xbd\x01\xef\x69\x34\x5a\xa5\x52\xb8\xd2\x18\xb2\xbf\x8d\xf9\xcf\xa6\x0d\x7f\x3d\x04\xc8\xc5\x84\xba\xbc\x61\x1f\xaf\x4f\xac\xa9\x57\x87\x6c\x1f\x36\xed\xd7\x3d\x6b\x6d\xc5\x19\xb4\x1f\x0f\xe0\xfd\x38\x6b\xcd\xc1\x65\xae\x31\x38\x55\xd0\xc5\xfe\x71\xf6\xb6\xfb\xba\x42\xa5\xce\x57\x85\x88\x7b\x05\xf9\xd8\x79\x44\x76\xd8\x6b\x5f\xfb\x84\x56\xe7\x52\x86\xda\x9d\xfc\xf7\x9c\x2e\x1f\x74\x72\x32\x6b\x43\xc3\x49\x5b\x15\xec\xb2\xd5\xfb\x40\x8f\x89\xad\x79\xbf\x1d\x63\x47\x20\xbf\xe3\xb5\x8a\x1b\x90\x16\x4d\xbc\x1a\x5c\xc7\x08\xb4\xe5\xd9\xb5\x93\xed\x35\x49\x5c\x57\xf2\xa6\xc5\xc9\x5b\xd7\x78\x59\x3f\xcd\xb1\xf6\xda\xd8\xe9\xeb\xe7\xd1\x93\x61\x43\xfe\x2e\xc2\x74\xe6\xfe\x2c\xf5\xfa\x85\xe8\x63\xa5\x93\x30\x61\x16\x41\xf6\x5a\xaa\x79\x01\x48\x18\x53\x77\x9d\x94\xe0\x68\xf1\xb6\x6c\x1e\x95\x5d\xf1\x7c\x71\x32\x6d\xab\xea\xc9\x55\x25\x6b\x7b\x6c\x36\x69\xac\x2e\xeb\x64\xfb\xb6\xd0\x58\x47\x71\x9a\x28\x19\xe7\xea\x67\xbb\x93\xa9\x86\x3b\x6b\x74\x4f\x23\xf0\x7a\x12\x8f\x69\x72\x70\x24\x4b\xdb\x0b\x4b\x18\x0c\xfc\xa5\x65\x0d\xc0\x5a\xea\x18\x26\xaa\x06\xc0\x1b\xf6\x76\x2d\x71\x75\xc8\xcb\x2d\xf5\xc6\x61\x65\xb3\x6e\x3c\x04\xd9\x81\x1b\xc3\xac\x2d\x9a\xc6\x09\xc7\xd2\x3c\xfc\x1b\x62\x36\xad\x54\x76\x47\x45\xc6\xf5\x06\xa5\x33\x59\xc9\xf4\x19\xf8\x1d\xb0\xe5\x7e\x57\x7f\x9f\x36\x95\xf5\x7c\x73\x18\xbe\x2b\x16\x1f\xf8\xe3\x62\xb1\xc8\xaa\xac\xc8\x3b\x8a\xd3\x4a\xe2\x06\xea\xd4\xcd\xdb\x80\xe5\xad\xf8\xb7\xea\x60\x38\x73\x56\x39\x79\xa3\x0c\x74\x5e\x10\x3f\x7c\x08\x5e\x15\x65\x0d\xd2\xa5\xb2\x90\xa8\x91\x5c\x08\xa0\x5f\x2b\xea\x02\x55\x51\xd6\x93\x76\x7d\x32\x75\xac\x88\x2e\x61\x6b\xcd\xb5\x69\xff\x3f\xf4\x49\xc4\x3f\xc0\x5f\x40\x7e\x00\xfe\x31\x42\x08\x0a\xf6\x9b\x7f\xbc\x75\x9f\x44\xa9\xd1\x5e\x42\x33\x9f\x38\x96\x87\xa4\x18\x62\xcb\xae\xf1\xe2\x86\x66\xee\x1f\x02\xb6\x5c\x79\x59\xa2\x9a\xb6\xb2\x1b\x71\xdf\xc5\x7b\x47\x48\xa9\xfc\xd6\x8e\xfa\x6a\xae\x76\x16\x93\xdd\xcb\x25\x03\x1f\xc8\xdf\x7f\xd5\xf6\x4c\xff\xf1\xe0\xc1\xc0\x9c\x85\x9b\x7e\x1e\x77\x3b\x7a\xac\x7a\xaa\xf3\xa8\xf6\x99\x9f\xfd\x16\x82\x07\x60\x09\x3b\x58\x38\x5e\x45\x43\x03\xe6\xc1\xa1\x04\xdc\x3e\x29\x56\x5d\xb2\xa9\xa3\xa6\x8e\xd3\x92\x93\xf7\x03\x36\xc3\x1c\x5a\x5f\x90\x8b\x67\x5c\xd4\x47\xc5\x4b\xf3\xd0\xc6\x21\xf5\x6e\x9a\xd1\x3d\x1c\x7a\x37\x1a\x1b\x59\x9c\x9d\x90\x61\x42\x5f\x2b\x94\xb2\x8e\x50\xda\x8a\xe4\x07\xa8\xd1\x72\x53\x87\x03\x14\x85\x2a\x4e\xda\x4c\xa3\xce\x08\x38\x0a\xdf\x33\x67\x11\xeb\x8e\x48\xbb\x76\x7e\x75\x7e\xaa\x8d\x60\xf7\x35\xd8\x3e\x14\xe7\x25\xb8\xb2\xf2\x65\x37\x85\x9c\xf2\x9b\x36\x8b\x36\x80\x94\x14\xe7\x82\x7d\xd8\x36\xb1\xe9\x9f\xcb\x53\x93\x25\x78\xd0\xdd\xe7\x93\x12\x51\x8d\xe3\x08\xb5\x34\xc4\xa2\x48\xe1\xa8\x90\x74\xb1\x42\x2c\x4e\xda\x95\x89\xa5\x4f\x1e\x9a\x0b\x33\xc3\x84\x59\xcb\x83\x7f\x2c\x71\xb8\x5b\x0b\xc3\xc4\xa1\x73\xac\x27\x0e\x77\x71\x73\x35\xe2\x18\xda\x3a\xdb\x00\x72\x95\x38\x9a\x26\xde\x20\x71\x34\x2a\x9b\xdd\x22\x5a\x55\xe6\x54\x8a\xdb\xf4\x75\x93\xe3\x4e\x7a\x6d\xc3\xa0\xcb\x76\xee\x52\x63\xb2\x74\x2c\xe8\xaf\x8c\xa3\x9a\x04\x5b\xad\xa2\xdd\xa3\x03\xce\x9b\x7c\xbb\x79\x58\xbd\x21\x6f\xed\x06\xa2\xda\xbb\x73\x52\x52\x27\xe5\xc0\x59\xa3\x82\x15\xfe\xdd\xa1\x4e\xb3\x87\x3b\x50\x67\x93\xd2\xd6\x39\xc8\x0a\xf5\xb3\xd6\x27\xc4\x2a\x1d\x6b\xb6\x90\x79\x06\xf8\xa2\xb3\x59\xd7\x07\xf0\xe6\x1f\x6f\xbb\x9c\xe2\xea\x65\xc0\xec\x65\xcc\xd5\x98\x54\xce\x14\x56\x29\x6a\x53\x69\x6c\xd8\x52\xbd\x33\x31\x63\xdd\x85\xca\xe9\xc2\xaa\x9c\x3e\x50\x19\xff\xa2\x72\xa9\xdf\x2b\xab\xcd\xd5\x7e\x38\x50\xde\x1c\xff\x03\xf7\x7a\x72\xdc\xef\xca\xb1\xde\x37\x94\x7d\xa9\x9d\xbe\xd4\xaa\x2f\xc7\x23\x9d\x71\x67\x5c\x63\xc1\xe2\x3b\x6d\x42\xa3\xef\x00\x53\x46\x6b\x8b\xe3\x8e\x07\x4c\x63\x6d\x43\xc6\x76\x6c\x6d\x7c\x74\xcc\xcc\xe1\xee\xd3\xd9\x13\xd7\xb4\x1c\xee\x3d\x9a\xcd\x6a\xae\xaf\x33\x57\x4d\x86\x36\x6a\xe6\xa8\xe8\xbf\x76\x2a\x68\x62\xdc\x2c\x56\x99\x71\x33\x39\xca\x95\xa5\x1d\x25\xac\x49\x4d\x7a\x3b\x59\xc7\xbd\x4d\xb4\xce\xde\x99\xb6\xd8\xb1\xb2\x77\x66\x6b\x37\xbb\x60\x1d\x10\x73\x19\xd9\x40\x67\xce\x82\x7b\x75\x9d\x6d\x9b\x97\xf3\x8f\x56\x64\xed\xb2\xec\x34\x0f\x0a\xaf\xb8\x2a\x68\xda\xa8\xc4\xaa\xba\xa3\xd1\x97\x84\xfa\xd6\xc6\xa1\x33\x5a\x1d\xf1\xb7\x79\xc2\xb5\x1d\x33\x73\x2e\xb8\x77\x08\xe0\x3c\x49\xda\xdd\xbd\x5d\xda\x0c\xb6\x50\x0b\x7b\x15\x5f\xa3\x42\x23\x09\x06\x67\x10\x5b\x4b\xe7\x49\xe7\xef\x7a\xea\xb6\x7b\x32\x0b\xbd\x7d\xde\x0c\x71\x77\x43\x66\xf8\x14\xd7\xdd\x9a\x19\xc8\x31\xe1\x8b\x99\x3a\x69\x6f\x3d\x15\xe9\x33\xf5\xc3\x43\xb0\x27\x2b\xdf\xeb\x3b\x31\x04\x17\xfb\x80\x2f\x94\xdd\x09\xbe\x70\xec\x4d\x80\xa5\x8a\x5f\xea\xf8\xd6\xae\x84\xf1\x4b\xe8\xf6\x4a\xc1\xbb\xd8\x07\x13\xbe\x30\x02\xeb\xef\xba\x94\x96\xc2\x7f\x9f\xb6\x06\x2c\x96\x6e\xae\xd7\x6e\xae\xd7\x53\x63\xb5\xa2\x8b\x85\x9f\xb5\x15\x82\x31\x14\xf4\x93\x9b\xfe\x37\xc6\x22\x5c\x07\x92\xd6\xec\x05\x5f\xcc\xcd\x47\xb3\xeb\xb8\x1e\x4b\x8d\x1d\x8c\xc6\x3a\x02\x5f\x34\x72\x66\x4b\xdb\x17\x43\x17\xf6\x36\x58\x9f\x30\xb5\x0d\x1b\xbe\xd8\xda\xec\xc5\x75\x2a\x36\x8f\x6e\x8c\x47\xca\xb7\xd6\x1d\x98\xf6\x80\xa5\xf2\xd8\xa3\xb0\xaf\xbf\xb6\xc8\x99\x77\x8f\x40\x9c\x63\x3e\xfd\x08\xf9\x73\xb6\x78\x6e\xef\x73\xb9\x18\x5b\x39\x71\xbd\x85\x76\xd8\x4b\x83\xdd\x76\x5c\x8d\xa6\x1c\xac\xdd\x07\x7b\xe0\x81\x36\x54\xda\x74\xe1\x8f\x27\x84\x56\x06\xbc\x79\xdb\x72\xed\x2b\x92\x6b\x77\x2b\xdb\x5b\x64\xb9\xaa\xef\x9a\x2b\xbb\xae\xd1\x6d\x5a\xe3\xb9\x46\x67\x98\x9c\xb9\xa6\x26\x87\x1d\xd2\xe8\x9c\xd3\x8e\x47\x9b\x6d\xbd\xbe\xe8\xb2\xdb\x38\x7b\x31\xb5\x68\x5f\x2f\xa6\xf8\x99\x35\x7c\xa8\x5b\xb7\x9d\x4f\x97\x33\xc7\x1e\xa4\x6b\x1f\x6e\xd8\x73\x8b\xc5\xd3\xed\x39\x6e\xf9\xb0\xd9\xb1\x47\xc7\xa0\xdb\x8a\x3d\xb7\xae\x91\x96\x8d\x36\x5a\x06\x4c\xb4\x9c\x92\xd2\x35\xdb\x3e\xd7\xdf\x1d\x43\x53\x1d\x9d\x54\xe7\x5a\x55\x4a\x57\x14\x53\x9d\x71\x45\x33\x1d\xd0\x4e\xdb\x9c\x56\x81\x73\xf3\xf6\xec\x94\xad\x98\x29\x1b\x71\x7e\xa3\x7e\x7c\xfa\x04\xda\x24\x8d\x2b\x99\xa6\x7f\x75\x12\x0d\xa2\x64\xaa\xf9\xf9\xe9\xd3\x16\xef\x18\x47\x98\x38\x55\x4c\x5c\x9d\x90\xc5\xa2\xf8\xf8\xe4\x9f\xe7\x64\xa1\x39\xb9\xad\xcf\xa0\xd9\xa0\x7f\xda\x6d\x8c\x83\x71\xd9\x20\xe7\xb3\x93\xad\x45\xb7\xba\xbb\xd8\x7c\xad\x64\xb2\xb8\xb6\xd9\xec\x77\x37\xa3\x41\xb4\xca\xe4\xaa\x0f\x46\xa7\xdf\xca\x63\x90\x63\x7f\xf3\x46\x7c\x07\x55\x5a\x9c\xf6\x5c\x07\x9d\x91\x92\x9c\x82\xd6\x75\x90\xe6\xa0\x23\xe5\xbf\xb6\xe6\x55\xad\x23\x9a\xec\x7f\x8c\xa7\xa1\xb3\x55\x56\x37\xbc\xbc\x9e\x95\x37\x71\xf2\x46\x46\xde\x8a\x8f\xb7\x65\xe3\xad\xb9\x78\x85\x89\x87\xac\xc6\x5a\xa8\xf6\xfc\x7a\x62\x1a\xfd\xf5\xd7\xa6\xf9\xf3\x05\x17\x8a\xf5\xe0\x74\x30\xb9\xb4\xac\xd9\x75\x6c\x60\xc0\x37\x56\xdb\xdb\xe3\xbf\x15\x08\x75\x71\xb6\x06\x7e\x5a\xd4\x75\x71\x6a\x2b\x70\xa5\x74\x77\x73\xc0\xdd\x13\x70\x8c\x5d\x2a\xab\x2d\xdd\x81\xb5\x66\xac\x1d\x04\xb4\x89\x8d\x05\x6b\xb7\xfd\x8e\x79\xcb\x66\x78\xf6\x9d\xdf\xce\x8a\x7b\xbf\xfd\xd9\x59\x9f\xed\xbb\x1f\x96\x0d\x3b\x66\x80\x9a\x3b\x2c\x4e\x4f\xf4\x0e\x40\x7f\x88\x57\x72\xe5\xcd\xc5\x22\x30\xe4\x46\x4b\xdb\x65\x33\x06\x82\xb4\xfd\xbd\xbe\xd1\x36\x93\x78\xb4\x3c\xe3\xfd\x0c\x9b\x7c\xda\x98\x35\xa4\x39\x7d\x35\x8b\x48\xf5\xc7\x76\xf3\xc6\xdd\x71\xb5\xab\xaa\xdd\x5c\x1c\x75\x7d\x72\xe1\xed\x9d\x72\xdd\x8c\x8b\xa3\xc1\x07\x59\xff\x36\x3e\x8e\x7a\xd4\xc4\x17\xab\xe6\x2c\x3b\xd4\xa4\x06\xca\x15\x7a\x43\x6e\xbd\x9a\xf4\x9b\x72\xdd\xe5\x92\xc8\x4d\xbb\xef\x1a\x82\x7d\xe3\x2e\xbc\x36\xd0\xf8\xb8\xdb\xa0\x41\x37\x5e\xde\xf6\x6e\xbc\xbc\x2f\x34\x3e\x22\xf3\xae\x48\xa4\x9b\x7d\x75\x5d\x8f\x48\xd7\xfb\xeb\xba\x12\x91\x6a\x63\x70\xcf\xb2\xfc\xfd\x46\xb7\x08\x36\xd3\xa4\x38\xd3\x0f\x6a\xce\xae\xe2\x0e\x61\xe5\x59\xfb\xaa\x3b\x04\x0d\xf7\x6a\xde\x10\x86\xc0\x76\x6c\x99\x76\x1b\x7b\xa3\x8e\x10\xc6\xdb\xab\x53\x26\x67\xc3\x2e\x10\xda\x8d\xa8\xbf\x37\xca\x9a\xf9\xee\x98\x63\x34\x7b\x93\xdd\x2c\xaf\x57\xb3\x3c\x2e\xf2\xba\x2c\x16\x7d\x60\x36\xba\x63\x92\x50\x6f\x84\x36\x39\xcd\xf7\x6a\x96\xd7\xbd\x2c\xaf\x57\xb3\xac\x54\xdb\x8d\xee\x6b\x38\x5d\x2d\xb6\x89\xb9\x9a\xc5\x50\x2d\xf3\xc0\x9b\x3d\x83\x2f\x65\x1a\x54\xe3\xa5\xfd\x69\x5b\x20\x63\x4c\x07\xdb\x9f\xaf\xdb\x9f\x6e\xbe\xa6\x3d\xae\x5d\xd1\xdd\xa8\xaf\x63\x9e\x72\xef\x8c\x28\xbb\xa6\x03\x0e\x27\x06\x8d\xff\xeb\x45\xd6\x03\xd9\x1c\xc7\x1a\x28\xdb\x07\x7b\xff\x5f\xde\x22\xea\xa7\x3d\x70\x1f\xb4\x3b\xdc\x7b\xb3\xf6\xfb\xb5\xfc\x76\xf3\x3e\x6e\xd3\x9a\x11\x1b\x28\xe2\xec\xe9\xad\x64\xb3\x24\xd1\xcd\x36\x98\xde\xd6\xec\x34\xdf\xb8\xd6\xc8\x8b\x9c\x0f\xba\xd6\xf0\x3c\x6f\x25\xde\xe8\xd4\x03\x74\xa2\xd3\x5f\x9c\x11\x9a\xd5\x52\x84\xc1\x39\x76\x1c\x73\xec\x3a\x3f\x5d\xc5\x00\xec\x46\x9f\x1f\xea\x18\x65\xa3\x30\xed\x5c\x76\xe8\xef\x44\x6d\x70\x1e\x38\xee\xb9\x40\xc2\x7c\x7c\x5e\x7e\x20\xf5\x79\xc9\x1d\x9f\x01\x9d\xf8\x95\x02\x8d\x27\x11\x37\xfb\x9a\xbd\x29\xdf\x2c\x6a\x7b\x9a\xc2\x99\xba\x5b\xdc\x59\xdc\xb9\x6b\xc3\x85\xbe\x0e\xd3\x5f\x5f\xde\x24\xc3\x35\x4d\xbe\x9a\x9d\x8a\x0d\xbe\x3c\x36\xf1\x6a\xb5\x37\xeb\xfb\xfb\xe8\xa4\xba\xd6\x6e\xc7\xae\x68\x76\x1c\xbf\x80\xce\x3c\xf1\xd2\x58\xdc\x7d\x6d\x0e\xe5\xe7\xd5\x8a\x43\x35\xcd\x83\x2b\x19\xeb\x95\x8c\xae\x2c\x6e\x0e\xe2\x07\x6b\x6d\x6e\xf8\x74\x1f\xc7\x75\xb3\x36\xcf\x51\x9c\xac\xcd\xc3\xb1\x21\xa8\x7f\x6f\x9e\xb3\xab\xb3\x3e\xf3\x93\xc9\xdf\x92\x20\x86\xe1\xff\xbd\x79\x24\x33\x1f\xcb\xd8\x79\x1f\x2a\xe7\x6b\x70\x38\xf6\x66\xd4\x4e\xb6\x16\xf8\x74\xb8\xa5\xce\x04\xb7\x02\x7c\xd2\x61\xa7\x15\x00\x2b\x33\xe4\x2a\x00\x04\x1e\x80\xf5\x40\x5a\x05\xc0\x20\x69\xd9\xe0\xab\x1d\xe7\xfb\xce\x80\x3e\x04\x58\x4a\xe3\xe2\x6c\xb8\x39\xaf\x5b\x24\x2e\x1b\xa9\xbd\x11\x52\x0f\x94\xcc\xb3\xea\x4a\xa8\x43\x63\x06\xbd\xf6\xdc\xa8\xc5\xb3\x7d\x87\xd5\xf3\x00\x66\xfa\x69\xf3\xbf\xb6\xf9\x5f\xdb\xfc\xaf\x87\xf2\x5b\xe4\xee\xf7\xbe\x67\x3d\xe4\xef\x83\x71\xbd\x04\xf4\xd1\xb9\xdf\x8f\x98\xf5\xd1\xb4\xdf\x8f\xe8\xc2\x6b\x50\x38\x38\x75\x81\xd6\x4f\x4a\xd6\x8d\x6d\xce\xde\x06\x6f\x66\xeb\x46\xd9\xc6\xd9\x36\xd9\xa6\xb8\x56\xb5\x3f\xff\x1c\xe8\x4c\x17\xd3\x15\x92\x55\x2e\xf0\xaa\x9e\xb7\xd2\x15\x9b\x9f\xda\x25\xde\xb0\xc7\x52\x9d\x38\x6b\xe9\xcc\x28\x67\xff\x3f\x7b\xd7\xd6\xdb\x36\x8e\x85\xdf\xfd\x2b\xce\x3e\xb4\x8e\x9b\xac\xe3\xf8\x92\x7a\xdd\xcd\x16\x49\x11\x2c\x0a\xcc\xb4\x45\x9a\x19\xcc\x4c\x11\xd8\xac\xc5\xc4\x44\x6d\xc9\x90\xe4\x24\x9e\x20\xff\x7d\x20\x5e\x24\x4a\x22\xa9\xab\x33\x4e\xc6\x2f\x81\x22\x8b\x87\x3c\xe4\xe1\xe1\xc7\xc3\xcb\xd7\x6c\x1d\x68\xa7\x53\x2a\x91\x12\x7f\xa9\x5e\xa4\x5c\x6d\x31\x4b\xaf\x73\x20\x82\x7a\x07\x23\x88\x5d\x4d\xce\x47\x1d\xaa\x0e\xec\x03\x09\x9a\x9f\x35\x42\xa2\xbe\x62\x3c\x84\xe1\x54\x4e\x6a\x4c\xa9\x7e\x74\x3c\x7b\xaa\xbb\xc2\x75\x94\x67\x99\xd3\x49\xf1\xd1\x6e\x3a\x59\x71\x3a\x59\x83\xad\x16\xbc\x0a\x2b\x2f\xa5\x9e\x09\x35\xd9\x11\x2d\x1e\x48\xec\x7b\x9d\xce\x70\x78\x9d\xfc\x41\xc6\xfa\x43\x09\xeb\x2f\x73\x13\xf0\x99\xc1\x38\xbb\x9a\x5f\x87\xc2\x95\xd4\x7b\x59\xcc\x4f\x81\xb0\x24\xa8\x1e\xd0\x70\xbd\x01\x54\x0f\x76\xa0\x5a\x36\x0f\x3d\xa8\x66\xbf\xca\xa0\x5a\x75\xca\xd7\x4e\xb2\x29\x8a\x1a\x13\x87\x16\xd3\xac\xc5\xe1\x59\xab\x14\x6c\x0e\x4f\x3a\xb6\xad\x54\xaa\xe8\x88\x96\x02\x4b\xdb\xa5\xb9\x17\xab\x8c\xd2\x92\xfd\xb5\x92\x54\xb2\xf7\x23\x10\x20\x3a\xae\xc9\x7a\x04\x6b\x06\xfb\xe2\xef\xf9\xba\x59\x52\x71\xb1\x62\x66\xad\x0b\x21\x9c\xa0\x68\xf2\xc0\x5b\x01\x44\xf4\x4c\x20\xa2\x17\x63\x40\xe4\xdb\xe9\x32\x41\x44\xcf\x04\x22\x94\x22\x5f\x0c\x88\xa0\xea\x64\x83\x08\x99\xd0\x91\x0e\xe0\x92\xad\x29\xb9\xde\xcb\x81\x88\xaa\xac\x7c\x7a\xd6\xb8\xd4\xc2\xc7\xb1\x92\xbf\xa8\x0e\x72\xb9\xe4\x8e\x99\xe3\x3a\x98\xfd\xb6\x6a\x85\xa5\x34\xb5\xdf\xa6\x18\xf5\x78\xd7\x49\x92\xea\xf1\xd7\xc6\x25\x4b\x4d\x9a\xe0\xa7\xcd\xf3\xf1\x89\x72\xbf\xd7\xed\xa8\x8e\xeb\x91\x2e\x7d\x0b\x46\x86\x8b\xb7\xd4\xbc\x7b\x8a\xac\x53\x3b\x99\xb3\xf2\x95\x76\x38\x17\xe3\xa1\xcb\x04\xdb\x3b\x1e\xba\xac\x3e\xbf\x23\xa2\xdb\x3a\x22\x3a\xe6\x41\xba\x5a\xcf\x16\xee\xf6\x61\xdf\x19\x36\xfa\xf0\x0f\xe2\x7b\x7c\x6e\x8b\x70\xdd\xd5\xb0\xd6\xb1\x91\x69\x44\x55\xb2\x3b\xf5\xdd\xda\xcf\x9d\xec\xae\x10\x1c\x2c\x7a\xd7\xf7\xa6\xc9\xee\xca\xda\x62\x3e\x32\xbb\xd8\xea\x73\x44\x62\xa7\x58\x45\xd3\x7c\x29\x4f\xf1\xc3\x2f\xaa\x32\xe3\xb1\x4d\xea\x66\x62\xbc\x7e\x41\x62\x3c\x26\x53\xc3\x8b\x17\x6b\xa5\xc2\x55\x3d\xa5\x55\xfd\xe5\xe2\xfc\xeb\xf9\xa7\xcb\xd3\xcb\x8f\x9f\x3f\x8d\x4f\x2f\x2f\x2f\x3e\x9e\xfd\x72\x79\xfe\x95\x07\x71\x8a\xca\x64\x46\x75\xfe\xeb\xf9\xa7\xcb\x94\xb0\x87\x46\x3e\x76\x33\x35\x25\x40\x5e\xa2\x2b\x6d\xea\x6c\x8e\x2f\x6d\xd2\x6c\x8e\x2f\x6d\xd2\x42\xec\x66\x2f\x54\xf3\x4c\xea\xc6\xac\xec\x73\x51\x37\xe6\x10\x92\x45\xdd\xa8\xaf\xc1\x19\x5a\x8a\x8d\x61\x7c\x9b\x6b\x09\x29\x21\x01\x24\x88\xdd\xb1\x65\x85\x18\xf9\xda\x72\x69\x01\xe1\xa2\x51\xa5\x1a\x85\x70\xcd\xac\x06\x41\x1c\x1b\x97\x96\xc3\xfc\x72\xab\xd5\x60\x3b\xaa\x1b\x10\xdf\x77\x5d\xa9\x7c\xd2\xbe\xee\x4a\x72\x62\x4b\xbc\x15\x65\xc9\x7b\xd0\x2b\x08\xe2\xda\xfd\x0d\x8e\x89\xd3\x99\x96\xc9\x38\x07\x77\x68\x0e\xcf\x14\xb4\xc6\x3f\x4f\xef\x3c\x14\xb4\x59\x65\xcf\x4b\x78\x9a\x35\x28\xe5\x24\xbf\xdc\x50\x43\x54\x70\xa6\x76\x16\xf9\xa5\x31\x25\x33\x3f\xb6\x46\x53\x79\x44\xf2\x9d\x65\x65\xef\xeb\xd6\x30\xbc\x02\xb0\x33\x3a\x95\xc5\xcc\xf1\x75\x95\xb2\x50\xff\xdf\x78\x6c\x19\xf9\x1b\x63\x43\xc3\x51\x27\xe1\xe3\xf9\x0b\x01\x56\x9b\x36\x9d\xee\x6b\x68\x1f\x13\x3e\xbd\xd3\x1e\x24\xbd\x73\xaf\x2b\x37\xf7\x03\x6b\xb1\xc1\x81\xa8\xf5\xc1\x41\x58\x73\x83\x03\xae\xfd\x00\x1e\x43\x52\xc4\xba\x38\x11\xa3\x23\xc2\x71\x4a\xc4\x41\xc7\x44\x89\xc8\xe5\xe8\x69\x10\x6f\x91\x0b\xdf\x91\x87\x3f\x52\x8d\xd9\xfd\x22\x2a\x4a\xa1\x4e\x97\xcf\xb0\x82\x8f\xd9\x55\x4d\x6a\xba\xbf\x23\x5e\xc4\x06\xbc\x81\xcb\x19\xf1\x60\x81\xfd\x99\x63\x01\xf1\x60\x4e\x7e\x60\x98\x8c\xdb\xde\x6a\x31\x01\x7c\x3f\xc5\x4b\x1f\xfc\x19\xf2\x81\xf8\x80\xa6\xc1\xbf\x1e\x4c\x08\x2f\xc8\x04\xee\x66\x64\x3a\x03\xe2\x05\x92\x88\x7d\xeb\xfc\xc0\x16\x3d\xc0\x88\xd1\x74\x06\xdc\x97\x02\xb1\x61\x42\x3d\xc1\x04\x7c\x07\x6e\xd8\xbe\x30\x2c\x5d\xff\xe7\x3b\xf0\x1d\x83\xb7\x5a\x2c\xb0\xd5\x66\x85\xc2\x20\x32\x09\x4a\x25\x44\xdf\x11\x7f\x06\x8e\x8d\x43\x3e\x98\x11\xec\x51\x11\xad\x20\x19\x65\x4c\x60\xfc\x36\xf4\x71\x81\x03\x6b\xfd\x7c\x0d\x63\xf6\x0b\xb1\xa7\x18\xfa\xed\x4e\xbb\x43\xff\x9f\x22\x1f\xdf\x38\xee\x9a\xde\x0f\xdc\x88\x0e\x57\x3e\x9c\x06\x65\x7d\x04\x5a\x64\x5a\x14\xf6\xe4\x3b\xa2\x4c\xe0\xdc\x62\xb7\x2d\x27\x11\x3b\x0c\x1e\xe1\x9b\x28\xf7\xc9\xb8\x4d\x2c\x6c\xfb\xc4\x5f\x5f\x25\x14\xe2\xda\x50\x4e\x0d\x56\x47\x4c\x98\xcb\xcf\x85\x3e\xb0\x7e\xf6\x18\x1e\x14\xa5\xe7\x41\x57\x0b\xf6\x15\xbe\x47\x8b\xe5\x1c\x73\x85\x03\xe3\x60\x63\x06\xbd\x01\xfd\x01\x9a\x76\x73\x04\x7d\x1a\x24\x65\xcf\x5d\xe9\x79\x28\x3d\x1f\xb3\xf3\xfc\x54\x0a\x6d\xf0\xb3\xf5\x1e\x97\x14\x1d\xbb\xd8\x73\x5a\xf0\x10\x6e\x8c\x68\xdb\xef\x58\x24\xf6\x0d\x1c\x1e\xc2\xc9\xff\xa0\xdb\xe1\x02\x0e\x0f\xa9\x8e\x93\x31\x9d\x40\x63\xd7\x5f\x4f\x22\x85\xbd\x99\xe3\xfa\x33\x64\xb3\xc6\x4d\xe5\xd5\xb4\x9b\x29\x99\x87\x11\xe5\x09\xfb\x9a\x81\xfb\x50\x66\xec\xba\x7a\xf6\x23\xbc\x7e\xcd\x5a\x4a\x5c\x81\x46\xfb\xc2\x7b\xd1\x1b\x84\x04\xb9\x27\xed\x09\x71\x07\xd0\x6d\xb1\xef\x47\x94\xec\xa1\xd1\x60\xbd\xb3\xcd\x3b\x27\x65\xe8\x58\x9c\xad\xdf\x35\x52\x7d\xfb\x28\x47\xdf\xa6\xdd\x38\xec\x70\x98\x96\x01\x48\xd0\x8a\x0b\x11\x0f\x04\xe7\x3a\xec\x77\xc8\xb6\xf8\xf3\xd9\x7a\x42\x8d\xde\x59\xf9\xe0\xad\x96\xd4\x09\x5d\x3b\x2e\xed\x6e\xa9\xda\xf5\xc2\x4e\xb0\x74\xc9\x2d\x3d\xde\x5b\x93\x51\x87\x79\x05\x09\x25\x8a\x90\xc8\x8e\x43\x6f\x9c\xdf\x92\xa5\x26\x4e\x34\x51\xbc\x91\xa3\x5b\x87\xc5\x44\x86\xae\x78\xc3\x09\xfc\xfb\x48\xbc\xe1\xb7\xf3\x9d\xc4\x0c\x80\xc6\x8e\xee\x66\x64\x8e\x61\x6f\x7f\x9f\x25\xfa\x2f\xc4\xef\xc7\xa3\xab\x43\x2b\xd7\x65\x4b\x58\x22\x63\x56\x90\x6f\x34\xc9\x15\x0f\x48\x91\x6b\xd8\x13\x5f\xfe\xeb\xe4\x04\x56\x36\x23\xda\xb2\x92\x57\x13\xc3\x49\xf8\x20\x7f\x06\xef\xc3\x8c\x46\x82\x33\x02\xf6\xc5\xbb\xc4\xa5\xdc\xc9\xab\x89\x15\xf6\xc8\xeb\x4c\x61\x91\xdd\x6d\x22\xe0\xdd\x1c\xb5\x65\xa7\x2e\x6a\xcb\x4e\x0d\xd4\x96\x47\xe3\xb1\x18\xd8\x3e\xb0\x71\x85\x4c\xd1\x9c\xde\xb8\xa2\xd5\x7b\xf0\xb6\x2c\x0f\xed\x78\xe9\xcc\x91\x3b\xbe\x40\x16\xd2\xd3\x18\xf6\xfe\x53\x52\x7e\x4f\xc8\xff\x12\xfc\x3d\xb5\x6f\xe6\xf8\xf4\x9e\x18\xb8\x0c\x07\x25\x49\x19\xfb\xb1\x8c\x2e\x90\x45\x56\x5e\x46\x4e\x25\x59\x5e\x07\xe2\xae\x8a\x20\x23\x33\x6b\x62\x8f\xb1\x3f\x46\xfc\x4b\x9f\x6f\xb1\x7b\x4b\xf0\x1d\xd0\xea\x86\x14\x0d\x53\x69\xb8\x98\x1d\xc3\x37\x19\x95\xf2\xbe\x9c\x07\x3a\xdf\x43\xae\xcf\xf7\x79\xd1\x22\xd3\x04\x14\x49\xff\xdf\x45\xcb\x19\x93\x41\xe6\x96\x99\xf5\x3d\x6e\x63\x9a\xf5\x0c\x74\x4f\xbc\x30\xce\xee\x8d\x02\xfc\x11\xbc\x62\x07\x92\x9b\x48\x98\x4e\xf3\x00\x4e\xf9\x97\xa6\x4c\xb5\x86\xa7\xc8\x9d\x01\x19\x29\x33\x37\x34\x9f\x9c\xb9\xe9\xad\x4f\x99\x1d\xd5\xf7\xda\x71\x17\xc8\x0f\xbe\xfa\x19\x65\x4c\x0a\xd3\x06\x27\x2e\x47\x89\x09\x11\x35\x29\x4f\xa1\x46\x7c\x44\x99\xa3\xb5\xb3\xf2\x47\xd0\x9c\x62\x3b\x70\xc2\x7c\x0d\xcf\xf3\x91\xeb\xd3\xda\xe1\x8c\xf0\x00\xd8\xb6\xf8\x8b\xde\x31\x7f\x35\xbd\x1f\x41\x73\xd0\x79\xc5\x13\x4d\xd7\xb1\x7f\x89\x6d\x63\xae\x73\x28\xc4\x59\xf9\xd1\xbb\xe6\xb0\xf3\xaa\xd9\xe0\x4b\x69\xe1\xa2\x48\xb2\x64\x45\xbd\xb3\x88\x28\xec\x7d\x0b\x75\xba\x6a\xa5\xb5\x2a\x21\x56\x9e\xdf\x46\xb5\x51\x51\x50\x50\x87\x65\x55\xcc\x0a\x9a\x64\x15\xa0\x4c\xc6\x2c\xe8\x23\x6a\x74\x6a\x5c\x0c\xd9\xf6\xd2\xc7\x2c\xf4\xf9\xaa\x11\xeb\x54\xcf\x51\x0d\x76\x4f\x6c\x4b\x11\xd5\xe8\x6d\x13\xce\x7c\x3a\xf8\x75\x34\x1e\x4f\x91\xeb\x63\x8f\x20\x7b\xfc\x75\x8a\x7c\xdf\xc0\x25\xdd\xed\x96\xa4\xde\xee\xca\xb9\xfc\x66\x44\x45\xc3\x7e\x69\x9c\x17\x65\xf1\xbb\x39\x8b\x92\x94\xd8\x7d\x39\x8b\x3f\x32\xb0\x5d\x49\x4a\x6c\x31\xd4\x7e\x10\x19\x65\x30\x6f\x1f\x75\x74\x00\x8f\x37\xe6\x53\x42\x3c\xa3\xe1\xe6\x82\x78\xbc\xd0\x65\x40\x9e\xda\x92\x35\x50\x8f\xee\x50\xe6\x58\xcb\x23\xc1\xf0\xda\xcc\x46\x80\xf7\x05\xf0\x98\xca\xe2\xf3\x00\xbf\x75\x31\x84\x99\x32\xf9\x3c\x79\xfc\x59\x0c\x57\xa6\x6c\xbe\x46\x44\x99\x34\x73\x21\x3a\x85\x2a\xd5\x4e\xbb\xbf\x73\xda\xe3\x53\x17\x23\x83\xc7\x2e\x3f\x2d\x7f\x19\x1e\xbb\x26\x6f\x1a\xd4\x72\xca\x95\x6e\xb3\x27\x0d\x0a\x5c\xd9\x8d\x32\xdb\x2a\x35\x5d\x7e\xb6\xce\xb2\x98\x23\xd3\x59\x58\x41\x47\x36\xd8\x26\x47\xb6\x8b\x72\x6e\x2e\xca\xb9\xe9\x28\x64\xef\xc9\xa2\x90\xfd\xc2\x51\xc8\x32\x60\x38\x8c\xdb\x11\x34\x3f\x33\xc6\x87\x87\xe6\x48\xe7\xd9\x33\x8c\x76\x32\x9d\xcb\x78\x71\x55\xcd\x69\xdc\xf8\x1c\xdf\x60\xdb\xe2\x67\xf0\x46\xd2\xd9\x84\xfa\x43\xa2\xda\x5e\xb0\x91\x90\xa8\xbe\x2b\xd4\xe8\xf7\xeb\x09\x89\xba\xb4\x95\x5e\x54\x44\x94\xab\xb4\x0b\x88\xee\x02\xa2\xbb\x80\xe8\xf6\xaa\xa1\x0f\x88\x1e\x6f\x13\x24\x7d\xb9\x73\x6b\x13\xa8\xe9\x76\x87\x35\x4c\xad\x7f\x22\x36\x36\x64\x71\x5c\x43\x30\x74\x63\x81\xe3\xc1\xe6\xc3\x10\xc7\x9b\x0f\x43\xbc\x7d\x82\xc0\xf1\xb0\xb6\x50\x07\xc5\x7b\x1e\xb6\xd2\x70\x79\xcb\x43\x1e\xa2\xe0\x7a\xc0\x6c\x70\xb2\x8a\x2e\xa3\xbe\xaa\xa8\x6a\xe4\xa4\x90\x63\x28\x28\x40\xdd\x29\x15\x42\x6a\x0e\xe0\xa8\xba\x69\xdd\x01\x1c\x55\x3f\xad\x3b\xda\xad\xea\xa8\x35\x4c\x16\x74\x7d\x33\x6f\x90\x88\x3e\xd0\xe7\xab\xd6\xbb\xbf\x02\x00\x00\xff\xff\xae\xc3\xe9\x8b\xa5\x1d\x33\x00")
+//nolint:misspell
+var _dashboardHtml = []byte(`<!DOCTYPE html>
+<html lang="en" style="height: 100%">
+ <head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
-func publicBundleJsBytes() ([]byte, error) {
- return bindataRead(
- _publicBundleJs,
- "public/bundle.js",
- )
+ <title>Go Ethereum Dashboard</title>
+ <link rel="shortcut icon" type="image/ico" href="https://ethereum.org/favicon.ico" />
+ <style>
+ ::-webkit-scrollbar {
+ width: 16px;
+ }
+ ::-webkit-scrollbar-thumb {
+ background: #212121;
+ }
+ </style>
+ </head>
+ <body style="height: 100%; margin: 0">
+ <div id="dashboard" style="height: 100%"></div>
+ <script src="bundle.js"></script>
+ </body>
+</html>
+`)
+
+func dashboardHtmlBytes() ([]byte, error) {
+ return _dashboardHtml, nil
}
-func publicBundleJs() (*asset, error) {
- bytes, err := publicBundleJsBytes()
+func dashboardHtml() (*asset, error) {
+ bytes, err := dashboardHtmlBytes()
if err != nil {
return nil, err
}
- info := bindataFileInfo{name: "public/bundle.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
- a := &asset{bytes: bytes, info: info}
+ info := bindataFileInfo{name: "dashboard.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xd9, 0xa6, 0xeb, 0x32, 0x49, 0x9b, 0xe5, 0x3a, 0xcb, 0x99, 0xd3, 0xb6, 0x69, 0x7f, 0xde, 0x35, 0x9d, 0x5, 0x96, 0x84, 0xc0, 0x14, 0xef, 0xbe, 0x58, 0x10, 0x5e, 0x40, 0xf2, 0x12, 0x97}}
return a, nil
}
-var _publicDashboardHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x52\x4d\x8b\xdb\x30\x10\xbd\xe7\x57\xcc\x0e\x14\x5a\xa8\xd6\xd9\x5b\x49\x2d\x43\xd9\xa4\xa5\xa7\x94\x92\x85\xf6\x28\x5b\xb3\xd6\x34\xfa\x70\xa5\xb1\xb7\xf9\xf7\xc5\xce\x2e\x09\xfd\x38\x8d\x86\xf7\xde\xf0\x34\x6f\xea\x9b\xed\xfe\xfe\xf0\xfd\xcb\x0e\x9c\x04\xdf\xac\xea\xb9\x80\x37\xb1\xd7\x48\x11\xa1\xc8\xc9\x93\x46\x47\xdc\x3b\xd9\xc0\xdd\x7a\xfd\x0a\x9b\x15\x00\x40\xed\xc8\xd8\xf3\x73\x69\x03\x89\x81\xce\x99\x5c\x48\x34\x3e\x1c\x3e\xaa\x77\xf8\x27\xec\x44\x06\x45\x3f\x47\x9e\x34\x7e\x53\x0f\x1f\xd4\x7d\x0a\x83\x11\x6e\x3d\x21\x74\x29\x0a\x45\xd1\xf8\x79\xa7\xc9\xf6\xf4\x97\x3a\x9a\x40\x1a\x27\xa6\xa7\x21\x65\xb9\x12\x3c\xb1\x15\xa7\x2d\x4d\xdc\x91\x5a\x9a\xb7\xc0\x91\x85\x8d\x57\xa5\x33\x9e\xf4\x1d\x36\xab\xcb\x34\x61\xf1\xd4\x7c\x4a\xb0\x13\x47\x99\xc6\x00\x5b\x53\x5c\x9b\x4c\xb6\x75\x75\x06\x2f\x64\xcf\xf1\x08\x99\xbc\xc6\xe2\x52\x96\x6e\x14\xe0\x2e\x45\x04\x39\x0d\xa4\x91\x83\xe9\xa9\xe2\x2e\x21\xb8\x4c\x8f\x1a\xe7\x3f\x96\x4d\x55\xd1\xf3\xec\xdb\x94\xfb\xea\xd1\x4c\xb3\xe8\x76\xe6\x55\xd7\x56\x6e\x94\x82\xc3\x7e\xbb\x87\xd7\xc7\x31\x1f\x53\xe0\xc2\x6f\x36\xf0\x95\x64\xcc\x11\x24\x81\x38\x02\xfa\x25\x94\xa3\xf1\xe0\xb9\xcd\x26\x33\x95\x19\x29\x03\x91\x85\x71\x58\x28\xed\x18\xad\xe7\xd8\x83\x1d\xf3\x52\x68\x22\x9f\x86\x40\x51\x40\xa9\xe7\xc0\xaa\x4b\x62\x75\x9b\xec\xe9\x5f\xe1\xbe\x87\x60\x72\xcf\x71\x03\xeb\xeb\xfd\x5b\x9e\x80\xad\x46\xfb\xb2\xa7\xff\x5c\x46\x5d\x59\x9e\xae\x74\xa5\xcb\x3c\x08\x94\xdc\x69\x5c\x3c\xd2\xed\x8f\x32\xd3\xce\xc0\x8b\xb1\xd9\x4d\xb3\xaa\xab\xf3\x0d\xfe\x0e\x00\x00\xff\xff\x58\x5e\xc8\x63\x94\x02\x00\x00")
+//nolint:misspell
+var _bundleJs = []byte((((((((((`!function(modules) {
+ function __webpack_require__(moduleId) {
+ if (installedModules[moduleId]) return installedModules[moduleId].exports;
+ var module = installedModules[moduleId] = {
+ i: moduleId,
+ l: !1,
+ exports: {}
+ };
+ return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__),
+ module.l = !0, module.exports;
+ }
+ var installedModules = {};
+ __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) {
+ __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {
+ configurable: !1,
+ enumerable: !0,
+ get: getter
+ });
+ }, __webpack_require__.n = function(module) {
+ var getter = module && module.__esModule ? function() {
+ return module.default;
+ } : function() {
+ return module;
+ };
+ return __webpack_require__.d(getter, "a", getter), getter;
+ }, __webpack_require__.o = function(object, property) {
+ return Object.prototype.hasOwnProperty.call(object, property);
+ }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 331);
+}([ function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ "production" === process.env.NODE_ENV ? module.exports = __webpack_require__(332) : module.exports = __webpack_require__(333);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ (function(process) {
+ if ("production" !== process.env.NODE_ENV) {
+ var REACT_ELEMENT_TYPE = "function" == typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103, isValidElement = function(object) {
+ return "object" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;
+ };
+ module.exports = __webpack_require__(374)(isValidElement, !0);
+ } else module.exports = __webpack_require__(375)();
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports) {
+ function defaultSetTimout() {
+ throw new Error("setTimeout has not been defined");
+ }
+ function defaultClearTimeout() {
+ throw new Error("clearTimeout has not been defined");
+ }
+ function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) return setTimeout(fun, 0);
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) return cachedSetTimeout = setTimeout,
+ setTimeout(fun, 0);
+ try {
+ return cachedSetTimeout(fun, 0);
+ } catch (e) {
+ try {
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch (e) {
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+ }
+ function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) return clearTimeout(marker);
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) return cachedClearTimeout = clearTimeout,
+ clearTimeout(marker);
+ try {
+ return cachedClearTimeout(marker);
+ } catch (e) {
+ try {
+ return cachedClearTimeout.call(null, marker);
+ } catch (e) {
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+ }
+ function cleanUpNextTick() {
+ draining && currentQueue && (draining = !1, currentQueue.length ? queue = currentQueue.concat(queue) : queueIndex = -1,
+ queue.length && drainQueue());
+ }
+ function drainQueue() {
+ if (!draining) {
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = !0;
+ for (var len = queue.length; len; ) {
+ for (currentQueue = queue, queue = []; ++queueIndex < len; ) currentQueue && currentQueue[queueIndex].run();
+ queueIndex = -1, len = queue.length;
+ }
+ currentQueue = null, draining = !1, runClearTimeout(timeout);
+ }
+ }
+ function Item(fun, array) {
+ this.fun = fun, this.array = array;
+ }
+ function noop() {}
+ var cachedSetTimeout, cachedClearTimeout, process = module.exports = {};
+ !function() {
+ try {
+ cachedSetTimeout = "function" == typeof setTimeout ? setTimeout : defaultSetTimout;
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ cachedClearTimeout = "function" == typeof clearTimeout ? clearTimeout : defaultClearTimeout;
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ }();
+ var currentQueue, queue = [], draining = !1, queueIndex = -1;
+ process.nextTick = function(fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) args[i - 1] = arguments[i];
+ queue.push(new Item(fun, args)), 1 !== queue.length || draining || runTimeout(drainQueue);
+ }, Item.prototype.run = function() {
+ this.fun.apply(null, this.array);
+ }, process.title = "browser", process.browser = !0, process.env = {}, process.argv = [],
+ process.version = "", process.versions = {}, process.on = noop, process.addListener = noop,
+ process.once = noop, process.off = noop, process.removeListener = noop, process.removeAllListeners = noop,
+ process.emit = noop, process.prependListener = noop, process.prependOnceListener = noop,
+ process.listeners = function(name) {
+ return [];
+ }, process.binding = function(name) {
+ throw new Error("process.binding is not supported");
+ }, process.cwd = function() {
+ return "/";
+ }, process.chdir = function(dir) {
+ throw new Error("process.chdir is not supported");
+ }, process.umask = function() {
+ return 0;
+ };
+}, function(module, exports, __webpack_require__) {
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
+ !function() {
+ "use strict";
+ function classNames() {
+ for (var classes = [], i = 0; i < arguments.length; i++) {
+ var arg = arguments[i];
+ if (arg) {
+ var argType = typeof arg;
+ if ("string" === argType || "number" === argType) classes.push(arg); else if (Array.isArray(arg)) classes.push(classNames.apply(null, arg)); else if ("object" === argType) for (var key in arg) hasOwn.call(arg, key) && arg[key] && classes.push(key);
+ }
+ }
+ return classes.join(" ");
+ }
+ var hasOwn = {}.hasOwnProperty;
+ void 0 !== module && module.exports ? module.exports = classNames : (__WEBPACK_AMD_DEFINE_ARRAY__ = [],
+ void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() {
+ return classNames;
+ }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }();
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return PRESENTATION_ATTRIBUTES;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return EVENT_ATTRIBUTES;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return SCALE_TYPES;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return LEGEND_TYPES;
+ }), __webpack_require__.d(__webpack_exports__, "j", function() {
+ return getDisplayName;
+ }), __webpack_require__.d(__webpack_exports__, "h", function() {
+ return findAllByType;
+ }), __webpack_require__.d(__webpack_exports__, "i", function() {
+ return findChildByType;
+ }), __webpack_require__.d(__webpack_exports__, "k", function() {
+ return getPresentationAttributes;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return filterEventAttributes;
+ }), __webpack_require__.d(__webpack_exports__, "f", function() {
+ return filterEventsOfChild;
+ }), __webpack_require__.d(__webpack_exports__, "q", function() {
+ return validateWidthHeight;
+ }), __webpack_require__.d(__webpack_exports__, "n", function() {
+ return isSsr;
+ }), __webpack_require__.d(__webpack_exports__, "g", function() {
+ return filterSvgElements;
+ }), __webpack_require__.d(__webpack_exports__, "m", function() {
+ return isChildrenEqual;
+ }), __webpack_require__.d(__webpack_exports__, "p", function() {
+ return renderByOrder;
+ }), __webpack_require__.d(__webpack_exports__, "l", function() {
+ return getReactEventByType;
+ }), __webpack_require__.d(__webpack_exports__, "o", function() {
+ return parseChildIndex;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isString__ = __webpack_require__(164), __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isString__), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject__ = __webpack_require__(31), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__PureRender__ = __webpack_require__(5), PRESENTATION_ATTRIBUTES = {
+ alignmentBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ angle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ baselineShift: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ clip: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ clipPath: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ clipRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ color: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ colorInterpolation: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ colorInterpolationFilters: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ colorProfile: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ colorRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ cursor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ direction: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "ltr", "rtl", "inherit" ]),
+ display: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ dominantBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ enableBackground: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ fill: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ fillOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ fillRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "nonzero", "evenodd", "inherit" ]),
+ filter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ floodColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ floodOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ font: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ fontFamily: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ fontSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ fontSizeAdjust: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ fontStretch: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "wider", "narrower", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", "inherit" ]),
+ fontStyle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "italic", "oblique", "inherit" ]),
+ fontVariant: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "small-caps", "inherit" ]),
+ fontWeight: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "bold", "bolder", "lighter", 100, 200, 300, 400, 500, 600, 700, 800, 900, "inherit" ]),
+ glyphOrientationHorizontal: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ glyphOrientationVertical: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ imageRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeQuality", "inherit" ]),
+ kerning: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ letterSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ lightingColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ markerEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ markerMid: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ markerStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ mask: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ opacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ overflow: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "scroll", "auto", "inherit" ]),
+ pointerEvents: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visiblePainted", "visibleFill", "visibleStroke", "visible", "painted", "fill", "stroke", "all", "none", "inherit" ]),
+ shapeRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "crispEdges", "geometricPrecision", "inherit" ]),
+ stopColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ stopOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ stroke: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ strokeDasharray: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ strokeDashoffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ strokeLinecap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "butt", "round", "square", "inherit" ]),
+ strokeLinejoin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "miter", "round", "bevel", "inherit" ]),
+ strokeMiterlimit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ strokeOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ strokeWidth: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ textAnchor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]),
+ textDecoration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "none", "underline", "overline", "line-through", "blink", "inherit" ]),
+ textRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision", "inherit" ]),
+ unicodeBidi: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "embed", "bidi-override", "inherit" ]),
+ visibility: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "collapse", "inherit" ]),
+ wordSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ writingMode: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "lr-tb", "rl-tb", "tb-rl", "lr", "rl", "tb", "inherit" ]),
+ transform: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,
+ width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ dx: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ dy: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ r: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ radius: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ])
+ }, EVENT_ATTRIBUTES = {
+ onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseOver: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseOut: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onTouchEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onTouchMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onTouchStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onTouchCancel: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func
+ }, REACT_BROWSER_EVENT_MAP = {
+ click: "onClick",
+ mousedown: "onMouseDown",
+ mouseup: "onMouseUp",
+ mouseover: "onMouseOver",
+ mousemove: "onMouseMove",
+ mouseout: "onMouseOut",
+ mouseenter: "onMouseEnter",
+ mouseleave: "onMouseLeave",
+ touchcancel: "onTouchCancel",
+ touchend: "onTouchEnd",
+ touchmove: "onTouchMove",
+ touchstart: "onTouchStart"
+ }, SCALE_TYPES = [ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ], LEGEND_TYPES = [ "plainline", "line", "square", "rect", "circle", "cross", "diamond", "star", "triangle", "wye", "none" ], getDisplayName = function(Comp) {
+ return Comp ? "string" == typeof Comp ? Comp : Comp.displayName || Comp.name || "Component" : "";
+ }, findAllByType = function(children, type) {
+ var result = [], types = [];
+ return types = __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(type) ? type.map(function(t) {
+ return getDisplayName(t);
+ }) : [ getDisplayName(type) ], __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(child) {
+ var childType = child && child.type && (child.type.displayName || child.type.name);
+ -1 !== types.indexOf(childType) && result.push(child);
+ }), result;
+ }, findChildByType = function(children, type) {
+ var result = findAllByType(children, type);
+ return result && result[0];
+ }, getPresentationAttributes = function(el) {
+ if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null;
+ var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el;
+ if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null;
+ var out = null;
+ for (var i in props) ({}).hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i] && (out || (out = {}),
+ out[i] = props[i]);
+ return out;
+ }, getEventHandlerOfElement = function(originalHandler, props) {
+ return function(e) {
+ return originalHandler(props, e), null;
+ };
+ }, filterEventAttributes = function(el, newHandler) {
+ var wrapCallback = arguments.length > 2 && void 0 !== arguments[2] && arguments[2];
+ if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null;
+ var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el;
+ if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null;
+ var out = null;
+ for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && (out || (out = {}),
+ out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i]));
+ return out;
+ }, getEventHandlerOfChild = function(originalHandler, data, index) {
+ return function(e) {
+ return originalHandler(data, index, e), null;
+ };
+ }, filterEventsOfChild = function(props, data, index) {
+ if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null;
+ var out = null;
+ for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(props[i]) && (out || (out = {}),
+ out[i] = getEventHandlerOfChild(props[i], data, index));
+ return out;
+ }, validateWidthHeight = function(el) {
+ if (!el || !el.props) return !1;
+ var _el$props = el.props, width = _el$props.width, height = _el$props.height;
+ return !(!Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.g)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.g)(height) || height <= 0);
+ }, isSsr = function() {
+ return !("undefined" != typeof window && window.document && window.document.createElement && window.setTimeout);
+ }, SVG_TAGS = [ "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "ellipse", "feBlend", "feColormatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-url", "foreignObject", "g", "glyph", "glyphRef", "hkern", "image", "line", "lineGradient", "marker", "mask", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "use", "view", "vkern" ], isSvgElement = function(child) {
+ return child && child.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(child.type) && SVG_TAGS.indexOf(child.type) >= 0;
+ }, filterSvgElements = function(children) {
+ var svgElements = [];
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(entry) {
+ entry && entry.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0 && svgElements.push(entry);
+ }), svgElements;
+ }, isSingleChildEqual = function(nextChild, prevChild) {
+ if (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) return !0;
+ if (!__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) {
+ var _ref = nextChild.props || {}, nextChildren = _ref.children, nextProps = _objectWithoutProperties(_ref, [ "children" ]), _ref2 = prevChild.props || {}, prevChildren = _ref2.children, prevProps = _objectWithoutProperties(_ref2, [ "children" ]);
+ return nextChildren && prevChildren ? Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren) : !nextChildren && !prevChildren && Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps);
+ }
+ return !1;
+ }, isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) {
+ if (nextChildren === prevChildren) return !0;
+ if (__WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren) !== __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(prevChildren)) return !1;
+ var count = __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren);
+ if (0 === count) return !0;
+ if (1 === count) return isSingleChildEqual(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChildren) ? nextChildren[0] : nextChildren, __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChildren) ? prevChildren[0] : prevChildren);
+ for (var i = 0; i < count; i++) {
+ var nextChild = nextChildren[i], prevChild = prevChildren[i];
+ if (__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChild) || __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChild)) {
+ if (!isChildrenEqual(nextChild, prevChild)) return !1;
+ } else if (!isSingleChildEqual(nextChild, prevChild)) return !1;
+ }
+ return !0;
+ }, renderByOrder = function(children, renderMap) {
+ var elements = [], record = {};
+ return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(child, index) {
+ if (child && isSvgElement(child)) elements.push(child); else if (child && renderMap[getDisplayName(child.type)]) {
+ var displayName = getDisplayName(child.type), _renderMap$displayNam = renderMap[displayName], handler = _renderMap$displayNam.handler, once = _renderMap$displayNam.once;
+ if (once && !record[displayName] || !once) {
+ var results = handler(child, displayName, index);
+ __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(results) ? elements = [ elements ].concat(_toConsumableArray(results)) : elements.push(results),
+ record[displayName] = !0;
+ }
+ }
+ }), elements;
+ }, getReactEventByType = function(e) {
+ var type = e && e.type;
+ return type && REACT_BROWSER_EVENT_MAP[type] ? REACT_BROWSER_EVENT_MAP[type] : null;
+ }, parseChildIndex = function(child, children) {
+ var result = -1;
+ return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(entry, index) {
+ entry === child && (result = index);
+ }), result;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function shallowEqual(a, b) {
+ for (var key in a) if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) return !1;
+ for (var _key in b) if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) return !1;
+ return !0;
+ }
+ function shouldComponentUpdate(props, state) {
+ return !shallowEqual(props, this.props) || !shallowEqual(state, this.state);
+ }
+ function pureRenderDecorator(component) {
+ component.prototype.shouldComponentUpdate = shouldComponentUpdate;
+ }
+ __webpack_exports__.b = shallowEqual, __webpack_exports__.a = pureRenderDecorator;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0, exports.default = function(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _assign = __webpack_require__(205), _assign2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_assign);
+ exports.default = _assign2.default || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ };
+}, function(module, exports, __webpack_require__) {
+ function isFunction(value) {
+ if (!isObject(value)) return !1;
+ var tag = baseGetTag(value);
+ return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+ }
+ var baseGetTag = __webpack_require__(42), isObject = __webpack_require__(31), asyncTag = "[object AsyncFunction]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]";
+ module.exports = isFunction;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "i", function() {
+ return mathSign;
+ }), __webpack_require__.d(__webpack_exports__, "h", function() {
+ return isPercent;
+ }), __webpack_require__.d(__webpack_exports__, "g", function() {
+ return isNumber;
+ }), __webpack_require__.d(__webpack_exports__, "f", function() {
+ return isNumOrStr;
+ }), __webpack_require__.d(__webpack_exports__, "j", function() {
+ return uniqueId;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return getPercentValue;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return getAnyElementOfObject;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return hasDuplicate;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return interpolateNumber;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return findEntryInArray;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_get__ = __webpack_require__(165), __WEBPACK_IMPORTED_MODULE_0_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_get__), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(117), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__ = __webpack_require__(170), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__), __WEBPACK_IMPORTED_MODULE_4_lodash_isString__ = __webpack_require__(164), __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isString__), mathSign = function(value) {
+ return 0 === value ? 0 : value > 0 ? 1 : -1;
+ }, isPercent = function(value) {
+ return __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value) && value.indexOf("%") === value.length - 1;
+ }, isNumber = function(value) {
+ return __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default()(value) && !__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value);
+ }, isNumOrStr = function(value) {
+ return isNumber(value) || __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value);
+ }, idCounter = 0, uniqueId = function(prefix) {
+ var id = ++idCounter;
+ return "" + (prefix || "") + id;
+ }, getPercentValue = function(percent, totalValue) {
+ var defaultValue = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, validate = arguments.length > 3 && void 0 !== arguments[3] && arguments[3];
+ if (!isNumber(percent) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(percent)) return defaultValue;
+ var value = void 0;
+ if (isPercent(percent)) {
+ var index = percent.indexOf("%");
+ value = totalValue * parseFloat(percent.slice(0, index)) / 100;
+ } else value = +percent;
+ return __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value) && (value = defaultValue),
+ validate && value > totalValue && (value = totalValue), value;
+ }, getAnyElementOfObject = function(obj) {
+ if (!obj) return null;
+ var keys = Object.keys(obj);
+ return keys && keys.length ? obj[keys[0]] : null;
+ }, hasDuplicate = function(ary) {
+ if (!__WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default()(ary)) return !1;
+ for (var len = ary.length, cache = {}, i = 0; i < len; i++) {
+ if (cache[ary[i]]) return !0;
+ cache[ary[i]] = !0;
+ }
+ return !1;
+ }, interpolateNumber = function(numberA, numberB) {
+ return isNumber(numberA) && isNumber(numberB) ? function(t) {
+ return numberA + t * (numberB - numberA);
+ } : function() {
+ return numberB;
+ };
+ }, findEntryInArray = function(ary, specifiedKey, specifiedValue) {
+ return ary && ary.length ? ary.find(function(entry) {
+ return entry && __WEBPACK_IMPORTED_MODULE_0_lodash_get___default()(entry, specifiedKey) === specifiedValue;
+ }) : null;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function getDefaultTheme() {
+ return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)());
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.sheetsManager = void 0;
+ var _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _map = __webpack_require__(397), _map2 = _interopRequireDefault(_map), _minSafeInteger = __webpack_require__(413), _minSafeInteger2 = _interopRequireDefault(_minSafeInteger), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _hoistNonReactStatics = __webpack_require__(152), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _getDisplayName = __webpack_require__(226), _getDisplayName2 = _interopRequireDefault(_getDisplayName), _wrapDisplayName = __webpack_require__(75), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _contextTypes = __webpack_require__(416), _contextTypes2 = _interopRequireDefault(_contextTypes), _jss = __webpack_require__(228), _ns = __webpack_require__(227), ns = function(obj) {
+ if (obj && obj.__esModule) return obj;
+ var newObj = {};
+ if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);
+ return newObj.default = obj, newObj;
+ }(_ns), _jssPreset = __webpack_require__(439), _jssPreset2 = _interopRequireDefault(_jssPreset), _createMuiTheme = __webpack_require__(151), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(150), _themeListener2 = _interopRequireDefault(_themeListener), _createGenerateClassName = __webpack_require__(451), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _getStylesCreator = __webpack_require__(452), _getStylesCreator2 = _interopRequireDefault(_getStylesCreator), jss = (0,
+ _jss.create)((0, _jssPreset2.default)()), generateClassName = (0, _createGenerateClassName2.default)(), indexCounter = _minSafeInteger2.default, sheetsManager = exports.sheetsManager = new _map2.default(), noopTheme = {}, defaultTheme = void 0, withStyles = function(stylesOrCreator) {
+ var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
+ return function(Component) {
+ var _options$withTheme = options.withTheme, withTheme = void 0 !== _options$withTheme && _options$withTheme, _options$flip = options.flip, flip = void 0 === _options$flip ? null : _options$flip, name = options.name, styleSheetOptions = (0,
+ _objectWithoutProperties3.default)(options, [ "withTheme", "flip", "name" ]), stylesCreator = (0,
+ _getStylesCreator2.default)(stylesOrCreator), listenToTheme = stylesCreator.themingEnabled || withTheme || "string" == typeof name;
+ indexCounter += 1, stylesCreator.options.index = indexCounter, "production" !== process.env.NODE_ENV && (0,
+ _warning2.default)(indexCounter < 0, [ "Material-UI: you might have a memory leak.", "The indexCounter is not supposed to grow that much." ].join(" "));
+ var WithStyles = function(_React$Component) {
+ function WithStyles(props, context) {
+ (0, _classCallCheck3.default)(this, WithStyles);
+ var _this = (0, _possibleConstructorReturn3.default)(this, (WithStyles.__proto__ || (0,
+ _getPrototypeOf2.default)(WithStyles)).call(this, props, context));
+ _this.state = {}, _this.disableStylesGeneration = !1, _this.jss = null, _this.sheetOptions = null,
+ _this.sheetsManager = sheetsManager, _this.stylesCreatorSaved = null, _this.theme = null,
+ _this.unsubscribeId = null, _this.jss = _this.context[ns.jss] || jss;
+ var muiThemeProviderOptions = _this.context.muiThemeProviderOptions;
+ return muiThemeProviderOptions && (muiThemeProviderOptions.sheetsManager && (_this.sheetsManager = muiThemeProviderOptions.sheetsManager),
+ _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration),
+ _this.stylesCreatorSaved = stylesCreator, _this.sheetOptions = (0, _extends3.default)({
+ generateClassName: generateClassName
+ }, _this.context[ns.sheetOptions]), _this.theme = listenToTheme ? _themeListener2.default.initial(context) || getDefaultTheme() : noopTheme,
+ _this;
+ }
+ return (0, _inherits3.default)(WithStyles, _React$Component), (0, _createClass3.default)(WithStyles, [ {
+ key: "componentWillMount",
+ value: function() {
+ this.attach(this.theme);
+ }
+ }, {
+ key: "componentDidMount",
+ value: function() {
+ var _this2 = this;
+ listenToTheme && (this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) {
+ var oldTheme = _this2.theme;
+ _this2.theme = theme, _this2.attach(_this2.theme), _this2.setState({}, function() {
+ _this2.detach(oldTheme);
+ });
+ }));
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function() {
+ this.stylesCreatorSaved !== stylesCreator && "production" !== process.env.NODE_ENV && (this.detach(this.theme),
+ this.stylesCreatorSaved = stylesCreator, this.attach(this.theme));
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.detach(this.theme), null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId);
+ }
+ }, {
+ key: "attach",
+ value: function(theme) {
+ if (!this.disableStylesGeneration) {
+ var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved);
+ sheetManager || (sheetManager = new _map2.default(), this.sheetsManager.set(stylesCreatorSaved, sheetManager));
+ var sheetManagerTheme = sheetManager.get(theme);
+ if (sheetManagerTheme || (sheetManagerTheme = {
+ refs: 0,
+ sheet: null
+ }, sheetManager.set(theme, sheetManagerTheme)), 0 === sheetManagerTheme.refs) {
+ var styles = stylesCreatorSaved.create(theme, name), meta = name;
+ "production" === process.env.NODE_ENV || meta || (meta = (0, _getDisplayName2.default)(Component));
+ var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({
+ meta: meta,
+ classNamePrefix: meta,
+ flip: "boolean" == typeof flip ? flip : "rtl" === theme.direction,
+ link: !1
+ }, this.sheetOptions, stylesCreatorSaved.options, {
+ name: name
+ }, styleSheetOptions));
+ sheetManagerTheme.sheet = sheet, sheet.attach();
+ var sheetsRegistry = this.context[ns.sheetsRegistry];
+ sheetsRegistry && sheetsRegistry.add(sheet);
+ }
+ sheetManagerTheme.refs += 1;
+ }
+ }
+ }, {
+ key: "detach",
+ value: function(theme) {
+ if (!this.disableStylesGeneration) {
+ var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved), sheetManagerTheme = sheetManager.get(theme);
+ if (sheetManagerTheme.refs -= 1, 0 === sheetManagerTheme.refs) {
+ sheetManager.delete(theme), this.jss.removeStyleSheet(sheetManagerTheme.sheet);
+ var sheetsRegistry = this.context[ns.sheetsRegistry];
+ sheetsRegistry && sheetsRegistry.remove(sheetManagerTheme.sheet);
+ }
+ }
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this3 = this, _props = this.props, classesProp = _props.classes, innerRef = _props.innerRef, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "classes", "innerRef" ]), classes = void 0, renderedClasses = {};
+ if (!this.disableStylesGeneration) {
+ var sheetManager = this.sheetsManager.get(this.stylesCreatorSaved), sheetsManagerTheme = sheetManager.get(this.theme);
+ renderedClasses = sheetsManagerTheme.sheet.classes;
+ }
+ classes = classesProp ? (0, _extends3.default)({}, renderedClasses, (0, _keys2.default)(classesProp).reduce(function(accumulator, key) {
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(renderedClasses[key] || _this3.disableStylesGeneration, [ "Material-UI: the key ` + "`") + (`" + key + "` + ("`" + ` provided to the classes property is not implemented in " + (0,
+ _getDisplayName2.default)(Component) + ".", "You can only override one of the following: " + (0,
+ _keys2.default)(renderedClasses).join(",") ].join("\n")), "production" !== process.env.NODE_ENV && (0,
+ _warning2.default)(!classesProp[key] || "string" == typeof classesProp[key], [ "Material-UI: the key `))) + (("`" + (`" + key + "` + "`")) + (` provided to the classes property is not valid for " + (0,
+ _getDisplayName2.default)(Component) + ".", "You need to provide a non empty string instead of: " + classesProp[key] + "." ].join("\n")),
+ classesProp[key] && (accumulator[key] = renderedClasses[key] + " " + classesProp[key]),
+ accumulator;
+ }, {})) : renderedClasses;
+ var more = {};
+ return withTheme && (more.theme = this.theme), _react2.default.createElement(Component, (0,
+ _extends3.default)({
+ classes: classes
+ }, more, other, {
+ ref: innerRef
+ }));
+ }
+ } ]), WithStyles;
+ }(_react2.default.Component);
+ return WithStyles.propTypes = "production" !== process.env.NODE_ENV ? {
+ classes: _propTypes2.default.object,
+ innerRef: _propTypes2.default.func
+ } : {}, WithStyles.contextTypes = (0, _extends3.default)({
+ muiThemeProviderOptions: _propTypes2.default.object
+ }, _contextTypes2.default, listenToTheme ? _themeListener2.default.contextTypes : {}),
+ "production" !== process.env.NODE_ENV && (WithStyles.displayName = (0, _wrapDisplayName2.default)(Component, "WithStyles")),
+ (0, _hoistNonReactStatics2.default)(WithStyles, Component), "production" !== process.env.NODE_ENV && (WithStyles.Naked = Component,
+ WithStyles.options = options), WithStyles;
+ };
+ };
+ exports.default = withStyles;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ var warning = function() {};
+ "production" !== process.env.NODE_ENV && (warning = function(condition, format, args) {
+ var len = arguments.length;
+ args = new Array(len > 2 ? len - 2 : 0);
+ for (var key = 2; key < len; key++) args[key - 2] = arguments[key];
+ if (void 0 === format) throw new Error("` + ("`" + `warning(condition, format, ...args)`)))) + ((("`" + (` requires a warning message argument");
+ if (format.length < 10 || /^[s\W]*$/.test(format)) throw new Error("The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: " + format);
+ if (!condition) {
+ var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ "undefined" != typeof console && console.error(message);
+ try {
+ throw new Error(message);
+ } catch (x) {}
+ }
+ }), module.exports = warning;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports) {
+ var isArray = Array.isArray;
+ module.exports = isArray;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _defineProperty = __webpack_require__(143), _defineProperty2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_defineProperty);
+ exports.default = function(obj, key, value) {
+ return key in obj ? (0, _defineProperty2.default)(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function Layer(props) {
+ var children = props.children, className = props.className, others = _objectWithoutProperties(props, [ "children", "className" ]), layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-layer", className);
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", _extends({
+ className: layerClass
+ }, others), children);
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, propTypes = {
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ])
+ };
+ Layer.propTypes = propTypes, __webpack_exports__.a = Layer;
+}, function(module, exports, __webpack_require__) {
+ var global = __webpack_require__(158), core = __webpack_require__(159), hide = __webpack_require__(244), redefine = __webpack_require__(534), ctx = __webpack_require__(537), $export = function(type, name, source) {
+ var key, own, out, exp, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {}).prototype, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype || (exports.prototype = {});
+ IS_GLOBAL && (source = name);
+ for (key in source) own = !IS_FORCED && target && void 0 !== target[key], out = (own ? target : source)[key],
+ exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out,
+ target && redefine(target, key, out, type & $export.U), exports[key] != out && hide(exports, key, exp),
+ IS_PROTO && expProto[key] != out && (expProto[key] = out);
+ };
+ global.core = core, $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8,
+ $export.B = 16, $export.W = 32, $export.U = 64, $export.R = 128, module.exports = $export;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ __webpack_require__.d(__webpack_exports__, "w", function() {
+ return getValueByDataKey;
+ }), __webpack_require__.d(__webpack_exports__, "n", function() {
+ return getDomainOfDataByKey;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return calculateActiveTickIndex;
+ }), __webpack_require__.d(__webpack_exports__, "r", function() {
+ return getMainColorOfGraphicItem;
+ }), __webpack_require__.d(__webpack_exports__, "q", function() {
+ return getLegendProps;
+ }), __webpack_require__.d(__webpack_exports__, "i", function() {
+ return getBarSizeList;
+ }), __webpack_require__.d(__webpack_exports__, "h", function() {
+ return getBarPosition;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return appendOffsetOfLegend;
+ }), __webpack_require__.d(__webpack_exports__, "z", function() {
+ return parseErrorBarsOfAxis;
+ }), __webpack_require__.d(__webpack_exports__, "o", function() {
+ return getDomainOfItemsWithSameAxis;
+ }), __webpack_require__.d(__webpack_exports__, "x", function() {
+ return isCategorialAxis;
+ }), __webpack_require__.d(__webpack_exports__, "m", function() {
+ return getCoordinatesOfGrid;
+ }), __webpack_require__.d(__webpack_exports__, "u", function() {
+ return getTicksOfAxis;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return combineEventHandlers;
+ }), __webpack_require__.d(__webpack_exports__, "A", function() {
+ return parseScale;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return checkDomainOfScale;
+ }), __webpack_require__.d(__webpack_exports__, "f", function() {
+ return findPositionOfBar;
+ }), __webpack_require__.d(__webpack_exports__, "C", function() {
+ return truncateByDomain;
+ }), __webpack_require__.d(__webpack_exports__, "s", function() {
+ return getStackGroupsByAxisId;
+ }), __webpack_require__.d(__webpack_exports__, "v", function() {
+ return getTicksOfScale;
+ }), __webpack_require__.d(__webpack_exports__, "l", function() {
+ return getCateCoordinateOfLine;
+ }), __webpack_require__.d(__webpack_exports__, "k", function() {
+ return getCateCoordinateOfBar;
+ }), __webpack_require__.d(__webpack_exports__, "j", function() {
+ return getBaseValueOfBar;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return detectReferenceElementsDomain;
+ }), __webpack_require__.d(__webpack_exports__, "t", function() {
+ return getStackedDataOfItem;
+ }), __webpack_require__.d(__webpack_exports__, "p", function() {
+ return getDomainOfStackGroups;
+ }), __webpack_require__.d(__webpack_exports__, "B", function() {
+ return parseSpecifiedDomain;
+ }), __webpack_require__.d(__webpack_exports__, "D", function() {
+ return validateCoordinateInRange;
+ }), __webpack_require__.d(__webpack_exports__, "g", function() {
+ return getBandSizeOfAxis;
+ }), __webpack_require__.d(__webpack_exports__, "y", function() {
+ return parseDomainOfCategoryAxis;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__ = __webpack_require__(281), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(117), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isString__ = __webpack_require__(164), __WEBPACK_IMPORTED_MODULE_3_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isString__), __WEBPACK_IMPORTED_MODULE_4_lodash_max__ = __webpack_require__(702), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_max__), __WEBPACK_IMPORTED_MODULE_5_lodash_min__ = __webpack_require__(284), __WEBPACK_IMPORTED_MODULE_5_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash_min__), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_8_lodash_get__ = __webpack_require__(165), __WEBPACK_IMPORTED_MODULE_8_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_lodash_get__), __WEBPACK_IMPORTED_MODULE_9_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_10_recharts_scale__ = __webpack_require__(703), __WEBPACK_IMPORTED_MODULE_11_d3_scale__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_10_recharts_scale__),
+ __webpack_require__(287)), __WEBPACK_IMPORTED_MODULE_12_d3_shape__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_13__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_14__cartesian_ReferenceDot__ = __webpack_require__(320), __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceLine__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceArea__ = __webpack_require__(322), __WEBPACK_IMPORTED_MODULE_17__cartesian_ErrorBar__ = __webpack_require__(91), __WEBPACK_IMPORTED_MODULE_18__component_Legend__ = __webpack_require__(171), __WEBPACK_IMPORTED_MODULE_19__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, getValueByDataKey = function(obj, dataKey, defaultValue) {
+ return __WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(obj) || __WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(dataKey) ? defaultValue : Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.f)(dataKey) ? __WEBPACK_IMPORTED_MODULE_8_lodash_get___default()(obj, dataKey, defaultValue) : __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(dataKey) ? dataKey(obj) : defaultValue;
+ }, getDomainOfDataByKey = function(data, key, type, filterNil) {
+ var flattenData = data.reduce(function(result, entry) {
+ var value = getValueByDataKey(entry, key);
+ return __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(value) ? [].concat(_toConsumableArray(result), _toConsumableArray(value)) : [].concat(_toConsumableArray(result), [ value ]);
+ }, []);
+ if ("number" === type) {
+ var domain = flattenData.filter(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g);
+ return [ Math.min.apply(null, domain), Math.max.apply(null, domain) ];
+ }
+ return (filterNil ? flattenData.filter(function(entry) {
+ return !__WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(entry);
+ }) : flattenData).map(function(entry) {
+ return Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.f)(entry) ? entry : "";
+ });
+ }, calculateActiveTickIndex = function(coordinate, ticks, unsortedTicks, axis) {
+ var index = -1, len = ticks.length;
+ if (len > 1) {
+ if (axis && "angleAxis" === axis.axisType && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) for (var range = axis.range, i = 0; i < len; i++) {
+ var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate, cur = unsortedTicks[i].coordinate, after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate, sameDirectionCoord = void 0;
+ if (Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.i)(cur - before) !== Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.i)(after - cur)) {
+ var diffInterval = [];
+ if (Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.i)(after - cur) === Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.i)(range[1] - range[0])) {
+ sameDirectionCoord = after;
+ var curInRange = cur + range[1] - range[0];
+ diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2), diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2);
+ } else {
+ sameDirectionCoord = before;
+ var afterInRange = after + range[1] - range[0];
+ diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2), diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2);
+ }
+ var sameInterval = [ Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2) ];
+ if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) {
+ index = unsortedTicks[i].index;
+ break;
+ }
+ } else {
+ var min = Math.min(before, after), max = Math.max(before, after);
+ if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) {
+ index = unsortedTicks[i].index;
+ break;
+ }
+ }
+ } else for (var _i = 0; _i < len; _i++) if (0 === _i && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) {
+ index = ticks[_i].index;
+ break;
+ }
+ } else index = 0;
+ return index;
+ }, getMainColorOfGraphicItem = function(item) {
+ var displayName = item.type.displayName, result = void 0;
+ switch (displayName) {
+ case "Line":
+ case "Area":
+ case "Radar":
+ result = item.props.stroke;
+ break;
+
+ default:
+ result = item.props.fill;
+ }
+ return result;
+ }, getLegendProps = function(_ref) {
+ var children = _ref.children, formatedGraphicalItems = _ref.formatedGraphicalItems, legendWidth = _ref.legendWidth, legendContent = _ref.legendContent, legendItem = Object(__WEBPACK_IMPORTED_MODULE_19__ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_18__component_Legend__.a);
+ if (!legendItem) return null;
+ var legendData = void 0;
+ return legendData = legendItem.props && legendItem.props.payload ? legendItem.props && legendItem.props.payload : "children" === legendContent ? (formatedGraphicalItems || []).reduce(function(result, _ref2) {
+ var item = _ref2.item, props = _ref2.props, data = props.sectors || props.data || [];
+ return result.concat(data.map(function(entry) {
+ return {
+ type: legendItem.props.iconType || item.props.legendType,
+ value: entry.name,
+ color: entry.fill,
+ payload: entry
+ };
+ }));
+ }, []) : (formatedGraphicalItems || []).map(function(_ref3) {
+ var item = _ref3.item, _item$props = item.props, dataKey = _item$props.dataKey, name = _item$props.name, legendType = _item$props.legendType;
+ return {
+ inactive: _item$props.hide,
+ dataKey: dataKey,
+ type: legendItem.props.iconType || legendType || "square",
+ color: getMainColorOfGraphicItem(item),
+ value: name || dataKey,
+ payload: item.props
+ };
+ }), _extends({}, legendItem.props, __WEBPACK_IMPORTED_MODULE_18__component_Legend__.a.getWithHeight(legendItem, legendWidth), {
+ payload: legendData,
+ item: legendItem
+ });
+ }, getBarSizeList = function(_ref4) {
+ var globalSize = _ref4.barSize, _ref4$stackGroups = _ref4.stackGroups, stackGroups = void 0 === _ref4$stackGroups ? {} : _ref4$stackGroups;
+ if (!stackGroups) return {};
+ for (var result = {}, numericAxisIds = Object.keys(stackGroups), i = 0, len = numericAxisIds.length; i < len; i++) for (var sgs = stackGroups[numericAxisIds[i]].stackGroups, stackIds = Object.keys(sgs), j = 0, sLen = stackIds.length; j < sLen; j++) {
+ var _sgs$stackIds$j = sgs[stackIds[j]], items = _sgs$stackIds$j.items, cateAxisId = _sgs$stackIds$j.cateAxisId, barItems = items.filter(function(item) {
+ return Object(__WEBPACK_IMPORTED_MODULE_19__ReactUtils__.j)(item.type).indexOf("Bar") >= 0;
+ });
+ if (barItems && barItems.length) {
+ var selfSize = barItems[0].props.barSize, cateId = barItems[0].props[cateAxisId];
+ result[cateId] || (result[cateId] = []), result[cateId].push({
+ item: barItems[0],
+ stackList: barItems.slice(1),
+ barSize: __WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(selfSize) ? globalSize : selfSize
+ });
+ }
+ }
+ return result;
+ }, getBarPosition = function(_ref5) {
+ var barGap = _ref5.barGap, barCategoryGap = _ref5.barCategoryGap, bandSize = _ref5.bandSize, _ref5$sizeList = _ref5.sizeList, sizeList = void 0 === _ref5$sizeList ? [] : _ref5$sizeList, maxBarSize = _ref5.maxBarSize, len = sizeList.length;
+ if (len < 1) return null;
+ var realBarGap = Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.c)(barGap, bandSize, 0, !0), result = void 0;
+ if (sizeList[0].barSize === +sizeList[0].barSize) {
+ var useFull = !1, fullBarSize = bandSize / len, sum = sizeList.reduce(function(res, entry) {
+ return res + entry.barSize || 0;
+ }, 0);
+ sum += (len - 1) * realBarGap, sum >= bandSize && (sum -= (len - 1) * realBarGap,
+ realBarGap = 0), sum >= bandSize && fullBarSize > 0 && (useFull = !0, fullBarSize *= .9,
+ sum = len * fullBarSize);
+ var offset = (bandSize - sum) / 2 >> 0, prev = {
+ offset: offset - realBarGap,
+ size: 0
+ };
+ result = sizeList.reduce(function(res, entry) {
+ var newRes = [].concat(_toConsumableArray(res), [ {
+ item: entry.item,
+ position: {
+ offset: prev.offset + prev.size + realBarGap,
+ size: useFull ? fullBarSize : entry.barSize
+ }
+ } ]);
+ return prev = newRes[newRes.length - 1].position, entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) {
+ newRes.push({
+ item: item,
+ position: prev
+ });
+ }), newRes;
+ }, []);
+ } else {
+ var _offset = Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.c)(barCategoryGap, bandSize, 0, !0);
+ bandSize - 2 * _offset - (len - 1) * realBarGap <= 0 && (realBarGap = 0);
+ var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len;
+ originalSize > 1 && (originalSize >>= 0);
+ var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize;
+ result = sizeList.reduce(function(res, entry, i) {
+ var newRes = [].concat(_toConsumableArray(res), [ {
+ item: entry.item,
+ position: {
+ offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2,
+ size: size
+ }
+ } ]);
+ return entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) {
+ newRes.push({
+ item: item,
+ position: newRes[newRes.length - 1].position
+ });
+ }), newRes;
+ }, []);
+ }
+ return result;
+ }, appendOffsetOfLegend = function(offset, items, props, legendBox) {
+ var children = props.children, width = props.width, height = props.height, margin = props.margin, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), legendProps = getLegendProps({
+ children: children,
+ items: items,
+ legendWidth: legendWidth,
+ legendHeight: legendHeight
+ }), newOffset = offset;
+ if (legendProps) {
+ var box = legendBox || {}, align = legendProps.align, verticalAlign = legendProps.verticalAlign, layout = legendProps.layout;
+ ("vertical" === layout || "horizontal" === layout && "center" === verticalAlign) && Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(offset[align]) && (newOffset = _extends({}, offset, _defineProperty({}, align, newOffset[align] + (box.width || 0)))),
+ ("horizontal" === layout || "vertical" === layout && "center" === align) && Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(offset[verticalAlign]) && (newOffset = _extends({}, offset, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0))));
+ }
+ return newOffset;
+ }, getDomainOfErrorBars = function(data, item, dataKey, axisType) {
+ var children = item.props.children, errorBars = Object(__WEBPACK_IMPORTED_MODULE_19__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_17__cartesian_ErrorBar__.a).filter(function(errorBarChild) {
+ var direction = errorBarChild.props.direction;
+ return !(!__WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(direction) && !__WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(axisType)) || axisType.indexOf(direction) >= 0;
+ });
+ if (errorBars && errorBars.length) {
+ var keys = errorBars.map(function(errorBarChild) {
+ return errorBarChild.props.dataKey;
+ });
+ return data.reduce(function(result, entry) {
+ var entryValue = getValueByDataKey(entry, dataKey, 0), mainValue = __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(entryValue) ? [ __WEBPACK_IMPORTED_MODULE_5_lodash_min___default()(entryValue), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default()(entryValue) ] : [ entryValue, entryValue ], errorDomain = keys.reduce(function(prevErrorArr, k) {
+ var errorValue = getValueByDataKey(entry, k, 0), lowerValue = mainValue[0] - Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[0] : errorValue), upperValue = mainValue[1] + Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[1] : errorValue);
+ return [ Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1]) ];
+ }, [ 1 / 0, -1 / 0 ]);
+ return [ Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1]) ];
+ }, [ 1 / 0, -1 / 0 ]);
+ }
+ return null;
+ }, parseErrorBarsOfAxis = function(data, items, dataKey, axisType) {
+ var domains = items.map(function(item) {
+ return getDomainOfErrorBars(data, item, dataKey, axisType);
+ }).filter(function(entry) {
+ return !__WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(entry);
+ });
+ return domains && domains.length ? domains.reduce(function(result, entry) {
+ return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ];
+ }, [ 1 / 0, -1 / 0 ]) : null;
+ }, getDomainOfItemsWithSameAxis = function(data, items, type, filterNil) {
+ var domains = items.map(function(item) {
+ var dataKey = item.props.dataKey;
+ return "number" === type && dataKey ? getDomainOfErrorBars(data, item, dataKey) || getDomainOfDataByKey(data, dataKey, type, filterNil) : getDomainOfDataByKey(data, dataKey, type, filterNil);
+ });
+ if ("number" === type) return domains.reduce(function(result, entry) {
+ return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ];
+ }, [ 1 / 0, -1 / 0 ]);
+ var tag = {};
+ return domains.reduce(function(result, entry) {
+ for (var i = 0, len = entry.length; i < len; i++) tag[entry[i]] || (tag[entry[i]] = !0,
+ result.push(entry[i]));
+ return result;
+ }, []);
+ }, isCategorialAxis = function(layout, axisType) {
+ return "horizontal" === layout && "xAxis" === axisType || "vertical" === layout && "yAxis" === axisType || "centric" === layout && "angleAxis" === axisType || "radial" === layout && "radiusAxis" === axisType;
+ }, getCoordinatesOfGrid = function(ticks, min, max) {
+ var hasMin = void 0, hasMax = void 0, values = ticks.map(function(entry) {
+ return entry.coordinate === min && (hasMin = !0), entry.coordinate === max && (hasMax = !0),
+ entry.coordinate;
+ });
+ return hasMin || values.push(min), hasMax || values.push(max), values;
+ }, getTicksOfAxis = function(axis, isGrid, isAll) {
+ if (!axis) return null;
+ var scale = axis.scale, duplicateDomain = axis.duplicateDomain, type = axis.type, range = axis.range, offset = (isGrid || isAll) && "category" === type && scale.bandwidth ? scale.bandwidth() / 2 : 0;
+ return offset = "angleAxis" === axis.axisType ? 2 * Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.i)(range[0] - range[1]) * offset : offset,
+ isGrid && (axis.ticks || axis.niceTicks) ? (axis.ticks || axis.niceTicks).map(function(entry) {
+ var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry;
+ return {
+ coordinate: scale(scaleContent) + offset,
+ value: entry,
+ offset: offset
+ };
+ }) : axis.isCategorial && axis.categoricalDomain ? axis.categoricalDomain.map(function(entry, index) {
+ return {
+ coordinate: scale(entry),
+ value: entry,
+ index: index,
+ offset: offset
+ };
+ }) : scale.ticks && !isAll ? scale.ticks(axis.tickCount).map(function(entry) {
+ return {
+ coordinate: scale(entry) + offset,
+ value: entry,
+ offset: offset
+ };
+ }) : scale.domain().map(function(entry, index) {
+ return {
+ coordinate: scale(entry) + offset,
+ value: duplicateDomain ? duplicateDomain[entry] : entry,
+ index: index,
+ offset: offset
+ };
+ });
+ }, combineEventHandlers = function(defaultHandler, parentHandler, childHandler) {
+ var customizedHandler = void 0;
+ return __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(childHandler) ? customizedHandler = childHandler : __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(parentHandler) && (customizedHandler = parentHandler),
+ __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(defaultHandler) || customizedHandler ? function(arg1, arg2, arg3, arg4) {
+ __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(defaultHandler) && defaultHandler(arg1, arg2, arg3, arg4),
+ __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(customizedHandler) && customizedHandler(arg1, arg2, arg3, arg4);
+ } : null;
+ }, parseScale = function(axis, chartType) {
+ var scale = axis.scale, type = axis.type, layout = axis.layout, axisType = axis.axisType;
+ if ("auto" === scale) return "radial" === layout && "radiusAxis" === axisType ? {
+ scale: __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scaleBand(),
+ realScaleType: "band"
+ } : "radial" === layout && "angleAxis" === axisType ? {
+ scale: __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scaleLinear(),
+ realScaleType: "linear"
+ } : "category" === type && chartType && (chartType.indexOf("LineChart") >= 0 || chartType.indexOf("AreaChart") >= 0) ? {
+ scale: __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scalePoint(),
+ realScaleType: "point"
+ } : "category" === type ? {
+ scale: __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scaleBand(),
+ realScaleType: "band"
+ } : {
+ scale: __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scaleLinear(),
+ realScaleType: "linear"
+ };
+ if (__WEBPACK_IMPORTED_MODULE_3_lodash_isString___default()(scale)) {
+ var name = "scale" + scale.slice(0, 1).toUpperCase() + scale.slice(1);
+ return {
+ scale: (__WEBPACK_IMPORTED_MODULE_11_d3_scale__[name] || __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scalePoint)(),
+ realScaleType: __WEBPACK_IMPORTED_MODULE_11_d3_scale__[name] ? name : "point"
+ };
+ }
+ return __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(scale) ? {
+ scale: scale
+ } : {
+ scale: __WEBPACK_IMPORTED_MODULE_11_d3_scale__.scalePoint(),
+ realScaleType: "point"
+ };
+ }, checkDomainOfScale = function(scale) {
+ var domain = scale.domain();
+ if (domain && !(domain.length <= 2)) {
+ var len = domain.length, range = scale.range(), min = Math.min(range[0], range[1]) - 1e-4, max = Math.max(range[0], range[1]) + 1e-4, first = scale(domain[0]), last = scale(domain[len - 1]);
+ (first < min || first > max || last < min || last > max) && scale.domain([ domain[0], domain[len - 1] ]);
+ }
+ }, findPositionOfBar = function(barPosition, child) {
+ if (!barPosition) return null;
+ for (var i = 0, len = barPosition.length; i < len; i++) if (barPosition[i].item === child) return barPosition[i].position;
+ return null;
+ }, truncateByDomain = function(value, domain) {
+ if (!domain || 2 !== domain.length || !Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(domain[0]) || !Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(domain[1])) return value;
+ var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]), result = [ value[0], value[1] ];
+ return (!Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(value[0]) || value[0] < min) && (result[0] = min),
+ (!Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(value[1]) || value[1] > max) && (result[1] = max),
+ result[0] > max && (result[0] = max), result[1] < min && (result[1] = min), result;
+ }, offsetSign = function(series) {
+ var n = series.length;
+ if (!(n <= 0)) for (var j = 0, m = series[0].length; j < m; ++j) for (var positive = 0, negative = 0, i = 0; i < n; ++i) {
+ var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1];
+ value >= 0 ? (series[i][j][0] = positive, series[i][j][1] = positive + value, positive = series[i][j][1]) : (series[i][j][0] = negative,
+ series[i][j][1] = negative + value, negative = series[i][j][1]);
+ }
+ }, STACK_OFFSET_MAP = {
+ sign: offsetSign,
+ expand: __WEBPACK_IMPORTED_MODULE_12_d3_shape__.o,
+ none: __WEBPACK_IMPORTED_MODULE_12_d3_shape__.p,
+ silhouette: __WEBPACK_IMPORTED_MODULE_12_d3_shape__.q,
+ wiggle: __WEBPACK_IMPORTED_MODULE_12_d3_shape__.r
+ }, getStackedData = function(data, stackItems, offsetType) {
+ var dataKeys = stackItems.map(function(item) {
+ return item.props.dataKey;
+ });
+ return Object(__WEBPACK_IMPORTED_MODULE_12_d3_shape__.n)().keys(dataKeys).value(function(d, key) {
+ return +getValueByDataKey(d, key, 0);
+ }).order(__WEBPACK_IMPORTED_MODULE_12_d3_shape__.s).offset(STACK_OFFSET_MAP[offsetType])(data);
+ }, getStackGroupsByAxisId = function(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) {
+ if (!data) return null;
+ var items = reverseStackOrder ? _items.reverse() : _items, stackGroups = items.reduce(function(result, item) {
+ var _item$props2 = item.props, stackId = _item$props2.stackId;
+ if (_item$props2.hide) return result;
+ var axisId = item.props[numericAxisId], parentGroup = result[axisId] || {
+ hasStack: !1,
+ stackGroups: {}
+ };
+ if (Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.f)(stackId)) {
+ var childGroup = parentGroup.stackGroups[stackId] || {
+ numericAxisId: numericAxisId,
+ cateAxisId: cateAxisId,
+ items: []
+ };
+ childGroup.items.push(item), parentGroup.hasStack = !0, parentGroup.stackGroups[stackId] = childGroup;
+ } else parentGroup.stackGroups[Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.j)("_stackId_")] = {
+ numericAxisId: numericAxisId,
+ cateAxisId: cateAxisId,
+ items: [ item ]
+ };
+ return _extends({}, result, _defineProperty({}, axisId, parentGroup));
+ }, {});
+ return Object.keys(stackGroups).reduce(function(result, axisId) {
+ var group = stackGroups[axisId];
+ return group.hasStack && (group.stackGroups = Object.keys(group.stackGroups).reduce(function(res, stackId) {
+ var g = group.stackGroups[stackId];
+ return _extends({}, res, _defineProperty({}, stackId, {
+ numericAxisId: numericAxisId,
+ cateAxisId: cateAxisId,
+ items: g.items,
+ stackedData: getStackedData(data, g.items, offsetType)
+ }));
+ }, {})), _extends({}, result, _defineProperty({}, axisId, group));
+ }, {});
+ }, calculateDomainOfTicks = function(ticks, type) {
+ return "number" === type ? [ Math.min.apply(null, ticks), Math.max.apply(null, ticks) ] : ticks;
+ }, getTicksOfScale = function(scale, opts) {
+ var realScaleType = opts.realScaleType, type = opts.type, tickCount = opts.tickCount, originalDomain = opts.originalDomain, allowDecimals = opts.allowDecimals, scaleType = realScaleType || opts.scale;
+ if ("auto" !== scaleType && "linear" !== scaleType) return null;
+ if (tickCount && "number" === type && originalDomain && ("auto" === originalDomain[0] || "auto" === originalDomain[1])) {
+ var domain = scale.domain(), tickValues = Object(__WEBPACK_IMPORTED_MODULE_10_recharts_scale__.getNiceTickValues)(domain, tickCount, allowDecimals);
+ return scale.domain(calculateDomainOfTicks(tickValues, type)), {
+ niceTicks: tickValues
+ };
+ }
+ if (tickCount && "number" === type) {
+ var _domain = scale.domain();
+ return {
+ niceTicks: Object(__WEBPACK_IMPORTED_MODULE_10_recharts_scale__.getTickValuesFixedDomain)(_domain, tickCount, allowDecimals)
+ };
+ }
+ return null;
+ }, getCateCoordinateOfLine = function(_ref6) {
+ var axis = _ref6.axis, ticks = _ref6.ticks, bandSize = _ref6.bandSize, entry = _ref6.entry, index = _ref6.index;
+ if ("category" === axis.type) {
+ if (!axis.allowDuplicatedCategory && axis.dataKey && !__WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(entry[axis.dataKey])) {
+ var matchedTick = Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.a)(ticks, "value", entry[axis.dataKey]);
+ if (matchedTick) return matchedTick.coordinate + bandSize / 2;
+ }
+ return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null;
+ }
+ var value = getValueByDataKey(entry, axis.dataKey);
+ return __WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(value) ? null : axis.scale(value);
+ }, getCateCoordinateOfBar = function(_ref7) {
+ var axis = _ref7.axis, ticks = _ref7.ticks, offset = _ref7.offset, bandSize = _ref7.bandSize, entry = _ref7.entry, index = _ref7.index;
+ if ("category" === axis.type) return ticks[index] ? ticks[index].coordinate + offset : null;
+ var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]);
+ return __WEBPACK_IMPORTED_MODULE_9_lodash_isNil___default()(value) ? null : axis.scale(value) - bandSize / 2 + offset;
+ }, getBaseValueOfBar = function(_ref8) {
+ var numericAxis = _ref8.numericAxis, domain = numericAxis.scale.domain();
+ if ("number" === numericAxis.type) {
+ var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]);
+ return min <= 0 && max >= 0 ? 0 : max < 0 ? max : min;
+ }
+ return domain[0];
+ }, detectReferenceElementsDomain = function(children, domain, axisId, axisType, specifiedTicks) {
+ var lines = Object(__WEBPACK_IMPORTED_MODULE_19__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceLine__.a), dots = Object(__WEBPACK_IMPORTED_MODULE_19__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_14__cartesian_ReferenceDot__.a), elements = lines.concat(dots), areas = Object(__WEBPACK_IMPORTED_MODULE_19__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceArea__.a), idKey = axisType + "Id", valueKey = axisType[0], finalDomain = domain;
+ if (elements.length && (finalDomain = elements.reduce(function(result, el) {
+ if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(el.props[valueKey])) {
+ var value = el.props[valueKey];
+ return [ Math.min(result[0], value), Math.max(result[1], value) ];
+ }
+ return result;
+ }, finalDomain)), areas.length) {
+ var key1 = valueKey + "1", key2 = valueKey + "2";
+ finalDomain = areas.reduce(function(result, el) {
+ if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(el.props[key1]) && Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(el.props[key2])) {
+ var value1 = el.props[key1], value2 = el.props[key2];
+ return [ Math.min(result[0], value1, value2), Math.max(result[1], value1, value2) ];
+ }
+ return result;
+ }, finalDomain);
+ }
+ return specifiedTicks && specifiedTicks.length && (finalDomain = specifiedTicks.reduce(function(result, tick) {
+ return Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(tick) ? [ Math.min(result[0], tick), Math.max(result[1], tick) ] : result;
+ }, finalDomain)), finalDomain;
+ }, getStackedDataOfItem = function(item, stackGroups) {
+ var stackId = item.props.stackId;
+ if (Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.f)(stackId)) {
+ var group = stackGroups[stackId];
+ if (group && group.items.length) {
+ for (var itemIndex = -1, i = 0, len = group.items.length; i < len; i++) if (group.items[i] === item) {
+ itemIndex = i;
+ break;
+ }
+ return itemIndex >= 0 ? group.stackedData[itemIndex] : null;
+ }
+ }
+ return null;
+ }, getDomainOfSingle = function(data) {
+ return data.reduce(function(result, entry) {
+ return [ Math.min.apply(null, entry.concat([ result[0] ]).filter(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)), Math.max.apply(null, entry.concat([ result[1] ]).filter(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)) ];
+ }, [ 1 / 0, -1 / 0 ]);
+ }, getDomainOfStackGroups = function(stackGroups, startIndex, endIndex) {
+ return Object.keys(stackGroups).reduce(function(result, stackId) {
+ var group = stackGroups[stackId], stackedData = group.stackedData, domain = stackedData.reduce(function(res, entry) {
+ var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1));
+ return [ Math.min(res[0], s[0]), Math.max(res[1], s[1]) ];
+ }, [ 1 / 0, -1 / 0 ]);
+ return [ Math.min(domain[0], result[0]), Math.max(domain[1], result[1]) ];
+ }, [ 1 / 0, -1 / 0 ]).map(function(result) {
+ return result === 1 / 0 || result === -1 / 0 ? 0 : result;
+ });
+ }, MIN_VALUE_REG = /^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, MAX_VALUE_REG = /^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, parseSpecifiedDomain = function(specifiedDomain, dataDomain, allowDataOverflow) {
+ if (!__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(specifiedDomain)) return dataDomain;
+ var domain = [];
+ if (Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(specifiedDomain[0])) domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]); else if (MIN_VALUE_REG.test(specifiedDomain[0])) {
+ var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1];
+ domain[0] = dataDomain[0] - value;
+ } else __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(specifiedDomain[0]) ? domain[0] = specifiedDomain[0](dataDomain[0]) : domain[0] = dataDomain[0];
+ if (Object(__WEBPACK_IMPORTED_MODULE_13__DataUtils__.g)(specifiedDomain[1])) domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]); else if (MAX_VALUE_REG.test(specifiedDomain[1])) {
+ var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1];
+ domain[1] = dataDomain[1] + _value;
+ } else __WEBPACK_IMPORTED_MODULE_7_lodash_isFunction___default()(specifiedDomain[1]) ? domain[1] = specifiedDomain[1](dataDomain[1]) : domain[1] = dataDomain[1];
+ return domain;
+ }, validateCoordinateInRange = function(coordinate, scale) {
+ if (!scale) return !1;
+ var range = scale.range(), first = range[0], last = range[range.length - 1];
+ return first <= last ? coordinate >= first && coordinate <= last : coordinate >= last && coordinate <= first;
+ }, getBandSizeOfAxis = function(axis, ticks) {
+ if (axis && axis.scale && axis.scale.bandwidth) return axis.scale.bandwidth();
+ if (axis && ticks && ticks.length >= 2) {
+ for (var orderedTicks = __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default()(ticks, function(o) {
+ return o.coordinate;
+ }), bandSize = 1 / 0, i = 1, len = orderedTicks.length; i < len; i++) {
+ var cur = orderedTicks[i], prev = orderedTicks[i - 1];
+ bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize);
+ }
+ return bandSize === 1 / 0 ? 0 : bandSize;
+ }
+ return 0;
+ }, parseDomainOfCategoryAxis = function(specifiedDomain, calculatedDomain, axisChild) {
+ return specifiedDomain && specifiedDomain.length ? __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(specifiedDomain, __WEBPACK_IMPORTED_MODULE_8_lodash_get___default()(axisChild, "type.defaultProps.domain")) ? calculatedDomain : specifiedDomain : calculatedDomain;
+ };
+}, function(module, exports) {
+ var core = module.exports = {
+ version: "2.5.3"
+ };
+ "number" == typeof __e && (__e = core);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function newInterval(floori, offseti, count, field) {
+ function interval(date) {
+ return floori(date = new Date(+date)), date;
+ }
+ return interval.floor = interval, interval.ceil = function(date) {
+ return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
+ }, interval.round = function(date) {
+ var d0 = interval(date), d1 = interval.ceil(date);
+ return date - d0 < d1 - date ? d0 : d1;
+ }, interval.offset = function(date, step) {
+ return offseti(date = new Date(+date), null == step ? 1 : Math.floor(step)), date;
+ }, interval.range = function(start, stop, step) {
+ var previous, range = [];
+ if (start = interval.ceil(start), step = null == step ? 1 : Math.floor(step), !(start < stop && step > 0)) return range;
+ do {
+ range.push(previous = new Date(+start)), offseti(start, step), floori(start);
+ } while (previous < start && start < stop);
+ return range;
+ }, interval.filter = function(test) {
+ return newInterval(function(date) {
+ if (date >= date) for (;floori(date), !test(date); ) date.setTime(date - 1);
+ }, function(date, step) {
+ if (date >= date) if (step < 0) for (;++step <= 0; ) for (;offseti(date, -1), !test(date); ) ; else for (;--step >= 0; ) for (;offseti(date, 1),
+ !test(date); ) ;
+ });
+ }, count && (interval.count = function(start, end) {
+ return t0.setTime(+start), t1.setTime(+end), floori(t0), floori(t1), Math.floor(count(t0, t1));
+ }, interval.every = function(step) {
+ return step = Math.floor(step), isFinite(step) && step > 0 ? step > 1 ? interval.filter(field ? function(d) {
+ return field(d) % step == 0;
+ } : function(d) {
+ return interval.count(0, d) % step == 0;
+ }) : interval : null;
+ }), interval;
+ }
+ __webpack_exports__.a = newInterval;
+ var t0 = new Date(), t1 = new Date();
+}, function(module, exports, __webpack_require__) {
+ var global = __webpack_require__(24), core = __webpack_require__(17), ctx = __webpack_require__(47), hide = __webpack_require__(40), $export = function(type, name, source) {
+ var key, own, out, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, IS_WRAP = type & $export.W, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {}).prototype;
+ IS_GLOBAL && (source = name);
+ for (key in source) (own = !IS_FORCED && target && void 0 !== target[key]) && key in exports || (out = own ? target[key] : source[key],
+ exports[key] = IS_GLOBAL && "function" != typeof target[key] ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) {
+ var F = function(a, b, c) {
+ if (this instanceof C) {
+ switch (arguments.length) {
+ case 0:
+ return new C();
+
+ case 1:
+ return new C(a);
+
+ case 2:
+ return new C(a, b);
+ }
+ return new C(a, b, c);
+ }
+ return C.apply(this, arguments);
+ };
+ return F.prototype = C.prototype, F;
+ }(out) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, IS_PROTO && ((exports.virtual || (exports.virtual = {}))[key] = out,
+ type & $export.R && expProto && !expProto[key] && hide(expProto, key, out)));
+ };
+ $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, $export.B = 16, $export.W = 32,
+ $export.U = 64, $export.R = 128, module.exports = $export;
+}, function(module, exports) {
+ function isNil(value) {
+ return null == value;
+ }
+ module.exports = isNil;
+}, function(module, exports, __webpack_require__) {
+ var store = __webpack_require__(140)("wks"), uid = __webpack_require__(98), Symbol = __webpack_require__(24).Symbol, USE_SYMBOL = "function" == typeof Symbol;
+ (module.exports = function(name) {
+ return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)("Symbol." + name));
+ }).store = store;
+}, function(module, exports, __webpack_require__) {
+ var anObject = __webpack_require__(48), IE8_DOM_DEFINE = __webpack_require__(207), toPrimitive = __webpack_require__(134), dP = Object.defineProperty;
+ exports.f = __webpack_require__(25) ? Object.defineProperty : function(O, P, Attributes) {
+ if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) {}
+ if ("get" in Attributes || "set" in Attributes) throw TypeError("Accessors not supported!");
+ return "value" in Attributes && (O[P] = Attributes.value), O;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return RADIAN;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return polarToCartesian;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return getMaxRadius;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return formatAxisMap;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return inRangeOfSector;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_2__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, RADIAN = Math.PI / 180, radianToDegree = function(angleInRadian) {
+ return 180 * angleInRadian / Math.PI;
+ }, polarToCartesian = function(cx, cy, radius, angle) {
+ return {
+ x: cx + Math.cos(-RADIAN * angle) * radius,
+ y: cy + Math.sin(-RADIAN * angle) * radius
+ };
+ }, getMaxRadius = function(width, height) {
+ var offset = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0
+ };
+ return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2;
+ }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) {
+ var width = props.width, height = props.height, startAngle = props.startAngle, endAngle = props.endAngle, cx = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.c)(props.cx, width, width / 2), cy = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.c)(props.cy, height, height / 2), maxRadius = getMaxRadius(width, height, offset), innerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.c)(props.innerRadius, maxRadius, 0), outerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.c)(props.outerRadius, maxRadius, .8 * maxRadius);
+ return Object.keys(axisMap).reduce(function(result, id) {
+ var axis = axisMap[id], domain = axis.domain, reversed = axis.reversed, range = void 0;
+ __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(axis.range) ? ("angleAxis" === axisType ? range = [ startAngle, endAngle ] : "radiusAxis" === axisType && (range = [ innerRadius, outerRadius ]),
+ reversed && (range = [ range[1], range[0] ])) : (range = axis.range, startAngle = range[0],
+ endAngle = range[1]);
+ var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.A)(axis, chartName), realScaleType = _parseScale.realScaleType, scale = _parseScale.scale;
+ scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.c)(scale);
+ var ticks = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.v)(scale, _extends({}, axis, {
+ realScaleType: realScaleType
+ })), finalAxis = _extends({}, axis, ticks, {
+ range: range,
+ radius: outerRadius,
+ realScaleType: realScaleType,
+ scale: scale,
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ startAngle: startAngle,
+ endAngle: endAngle
+ });
+ return _extends({}, result, _defineProperty({}, id, finalAxis));
+ }, {});
+ }, distanceBetweenPoints = function(point, anotherPoint) {
+ var x1 = point.x, y1 = point.y, x2 = anotherPoint.x, y2 = anotherPoint.y;
+ return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
+ }, getAngleOfPoint = function(_ref, _ref2) {
+ var x = _ref.x, y = _ref.y, cx = _ref2.cx, cy = _ref2.cy, radius = distanceBetweenPoints({
+ x: x,
+ y: y
+ }, {
+ x: cx,
+ y: cy
+ });
+ if (radius <= 0) return {
+ radius: radius
+ };
+ var cos = (x - cx) / radius, angleInRadian = Math.acos(cos);
+ return y > cy && (angleInRadian = 2 * Math.PI - angleInRadian), {
+ radius: radius,
+ angle: radianToDegree(angleInRadian),
+ angleInRadian: angleInRadian
+ };
+ }, formatAngleOfSector = function(_ref3) {
+ var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360), min = Math.min(startCnt, endCnt);
+ return {
+ startAngle: startAngle - 360 * min,
+ endAngle: endAngle - 360 * min
+ };
+ }, reverseFormatAngleOfSetor = function(angle, _ref4) {
+ var startAngle = _ref4.startAngle, endAngle = _ref4.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360);
+ return angle + 360 * Math.min(startCnt, endCnt);
+ }, inRangeOfSector = function(_ref5, sector) {
+ var x = _ref5.x, y = _ref5.y, _getAngleOfPoint = getAngleOfPoint({
+ x: x,
+ y: y
+ }, sector), radius = _getAngleOfPoint.radius, angle = _getAngleOfPoint.angle, innerRadius = sector.innerRadius, outerRadius = sector.outerRadius;
+ if (radius < innerRadius || radius > outerRadius) return !1;
+ if (0 === radius) return !0;
+ var _formatAngleOfSector = formatAngleOfSector(sector), startAngle = _formatAngleOfSector.startAngle, endAngle = _formatAngleOfSector.endAngle, formatAngle = angle, inRange = void 0;
+ if (startAngle <= endAngle) {
+ for (;formatAngle > endAngle; ) formatAngle -= 360;
+ for (;formatAngle < startAngle; ) formatAngle += 360;
+ inRange = formatAngle >= startAngle && formatAngle <= endAngle;
+ } else {
+ for (;formatAngle > startAngle; ) formatAngle -= 360;
+ for (;formatAngle < endAngle; ) formatAngle += 360;
+ inRange = formatAngle >= endAngle && formatAngle <= startAngle;
+ }
+ return inRange ? _extends({}, sector, {
+ radius: radius,
+ angle: reverseFormatAngleOfSetor(formatAngle, sector)
+ }) : null;
+ };
+}, function(module, exports) {
+ var global = module.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")();
+ "number" == typeof __g && (__g = global);
+}, function(module, exports, __webpack_require__) {
+ module.exports = !__webpack_require__(49)(function() {
+ return 7 != Object.defineProperty({}, "a", {
+ get: function() {
+ return 7;
+ }
+ }).a;
+ });
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(350),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0, exports.default = function(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _defineProperty = __webpack_require__(143), _defineProperty2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_defineProperty);
+ exports.default = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), (0, _defineProperty2.default)(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }();
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _typeof2 = __webpack_require__(100), _typeof3 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_typeof2);
+ exports.default = function(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" !== (void 0 === call ? "undefined" : (0, _typeof3.default)(call)) && "function" != typeof call ? self : call;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ exports.__esModule = !0;
+ var _setPrototypeOf = __webpack_require__(367), _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf), _create = __webpack_require__(371), _create2 = _interopRequireDefault(_create), _typeof2 = __webpack_require__(100), _typeof3 = _interopRequireDefault(_typeof2);
+ exports.default = function(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + (void 0 === superClass ? "undefined" : (0,
+ _typeof3.default)(superClass)));
+ subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass);
+ };
+}, function(module, exports) {
+ function isObject(value) {
+ var type = typeof value;
+ return null != value && ("object" == type || "function" == type);
+ }
+ module.exports = isObject;
+}, function(module, exports, __webpack_require__) {
+ var freeGlobal = __webpack_require__(242), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")();
+ module.exports = root;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.translateStyle = exports.AnimateGroup = exports.configBezier = exports.configSpring = void 0;
+ var _Animate = __webpack_require__(263), _Animate2 = _interopRequireDefault(_Animate), _easing = __webpack_require__(275), _util = __webpack_require__(123), _AnimateGroup = __webpack_require__(679), _AnimateGroup2 = _interopRequireDefault(_AnimateGroup);
+ exports.configSpring = _easing.configSpring, exports.configBezier = _easing.configBezier,
+ exports.AnimateGroup = _AnimateGroup2.default, exports.translateStyle = _util.translateStyle,
+ exports.default = _Animate2.default;
+}, function(module, exports, __webpack_require__) {
+ function isEqual(value, other) {
+ return baseIsEqual(value, other);
+ }
+ var baseIsEqual = __webpack_require__(178);
+ module.exports = isEqual;
+}, function(module, exports) {
+ module.exports = function(it) {
+ return "object" == typeof it ? null !== it : "function" == typeof it;
+ };
+}, function(module, exports) {
+ function isObjectLike(value) {
+ return null != value && "object" == typeof value;
+ }
+ module.exports = isObjectLike;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__src_bisect__ = __webpack_require__(288);
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_bisect__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_1__src_ascending__ = __webpack_require__(64);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_ascending__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__src_bisector__ = __webpack_require__(289);
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_bisector__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_18__src_quantile__ = (__webpack_require__(707), __webpack_require__(708),
+ __webpack_require__(291), __webpack_require__(293), __webpack_require__(709), __webpack_require__(712),
+ __webpack_require__(713), __webpack_require__(297), __webpack_require__(714), __webpack_require__(715),
+ __webpack_require__(716), __webpack_require__(717), __webpack_require__(298), __webpack_require__(290),
+ __webpack_require__(718), __webpack_require__(185));
+ __webpack_require__.d(__webpack_exports__, "d", function() {
+ return __WEBPACK_IMPORTED_MODULE_18__src_quantile__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_19__src_range__ = __webpack_require__(295);
+ __webpack_require__.d(__webpack_exports__, "e", function() {
+ return __WEBPACK_IMPORTED_MODULE_19__src_range__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_23__src_ticks__ = (__webpack_require__(719), __webpack_require__(720),
+ __webpack_require__(721), __webpack_require__(296));
+ __webpack_require__.d(__webpack_exports__, "h", function() {
+ return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.a;
+ }), __webpack_require__.d(__webpack_exports__, "f", function() {
+ return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.b;
+ }), __webpack_require__.d(__webpack_exports__, "g", function() {
+ return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.c;
+ });
+ __webpack_require__(299), __webpack_require__(292), __webpack_require__(722);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "d", function() {
+ return durationSecond;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return durationMinute;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return durationHour;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return durationDay;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return durationWeek;
+ });
+ var durationSecond = 1e3, durationMinute = 6e4, durationHour = 36e5, durationDay = 864e5, durationWeek = 6048e5;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function makeEmptyFunction(arg) {
+ return function() {
+ return arg;
+ };
+ }
+ var emptyFunction = function() {};
+ emptyFunction.thatReturns = makeEmptyFunction, emptyFunction.thatReturnsFalse = makeEmptyFunction(!1),
+ emptyFunction.thatReturnsTrue = makeEmptyFunction(!0), emptyFunction.thatReturnsNull = makeEmptyFunction(null),
+ emptyFunction.thatReturnsThis = function() {
+ return this;
+ }, emptyFunction.thatReturnsArgument = function(arg) {
+ return arg;
+ }, module.exports = emptyFunction;
+}, function(module, exports, __webpack_require__) {
+ var dP = __webpack_require__(22), createDesc = __webpack_require__(71);
+ module.exports = __webpack_require__(25) ? function(object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+ } : function(object, key, value) {
+ return object[key] = value, object;
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(378),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ function baseGetTag(value) {
+ return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
+ }
+ var Symbol = __webpack_require__(77), getRawTag = __webpack_require__(520), objectToString = __webpack_require__(521), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0;
+ module.exports = baseGetTag;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function Label(props) {
+ var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = void 0 === _props$className ? "" : _props$className;
+ if (!viewBox || __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) && __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(children) && !Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content) && !__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) return null;
+ if (Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content)) return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(content, props);
+ var label = void 0;
+ if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) {
+ if (label = content(props), Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label)) return label;
+ } else label = getLabel(props);
+ var isPolarLabel = isPolar(viewBox), attrs = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(props);
+ if (isPolarLabel && ("insideStart" === position || "insideEnd" === position || "end" === position)) return renderRadialLabel(props, label, attrs);
+ var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props);
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__Text__.a, _extends({
+ className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-label", className)
+ }, attrs, positionAttrs), label);
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(31), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__Text__ = __webpack_require__(55), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, cartesianViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number
+ }), polarViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ startAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ endAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number
+ }), propTypes = {
+ viewBox: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ cartesianViewBoxShape, polarViewBoxShape ]),
+ formatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),
+ offset: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ position: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "top", "left", "right", "bottom", "inside", "outside", "insideLeft", "insideRight", "insideTop", "insideBottom", "insideTopLeft", "insideBottomLeft", "insideTopRight", "insideBottomRight", "insideStart", "insideEnd", "end", "center" ]),
+ children: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node ]),
+ className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,
+ content: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ])
+ }, defaultProps = {
+ offset: 5
+ }, getLabel = function(props) {
+ var value = props.value, formatter = props.formatter, label = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(props.children) ? value : props.children;
+ return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(formatter) ? formatter(label) : label;
+ }, getDeltaAngle = function(startAngle, endAngle) {
+ return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360);
+ }, renderRadialLabel = function(labelProps, label, attrs) {
+ var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, clockWise = viewBox.clockWise, radius = (innerRadius + outerRadius) / 2, deltaAngle = getDeltaAngle(startAngle, endAngle), sign = deltaAngle >= 0 ? 1 : -1, labelAngle = void 0, direction = void 0;
+ "insideStart" === position ? (labelAngle = startAngle + sign * offset, direction = clockWise) : "insideEnd" === position ? (labelAngle = endAngle - sign * offset,
+ direction = !clockWise) : "end" === position && (labelAngle = endAngle + sign * offset,
+ direction = clockWise), direction = deltaAngle <= 0 ? direction : !direction;
+ var startPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle + 359 * (direction ? 1 : -1)), path = "M" + startPoint.x + "," + startPoint.y + "\n A" + radius + "," + radius + ",0,1," + (direction ? 0 : 1) + ",\n " + endPoint.x + "," + endPoint.y, id = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(labelProps.id) ? Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.j)("recharts-radial-line-") : labelProps.id;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("text", _extends({}, attrs, {
+ dominantBaseline: "central",
+ className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-radial-bar-label", className)
+ }), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("path", {
+ id: id,
+ d: path
+ })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("textPath", {
+ xlinkHref: "#" + id
+ }, label));
+ }, getAttrsOfPolarLabel = function(props) {
+ var viewBox = props.viewBox, offset = props.offset, position = props.position, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, midAngle = (startAngle + endAngle) / 2;
+ if ("outside" === position) {
+ var _polarToCartesian = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x;
+ return {
+ x: _x,
+ y: _polarToCartesian.y,
+ textAnchor: _x >= cx ? "start" : "end",
+ verticalAnchor: "middle"
+ };
+ }
+ if ("center" === position) return {
+ x: cx,
+ y: cy,
+ textAnchor: "middle",
+ verticalAnchor: "middle"
+ };
+ var r = (innerRadius + outerRadius) / 2, _polarToCartesian2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, r, midAngle);
+ return {
+ x: _polarToCartesian2.x,
+ y: _polarToCartesian2.y,
+ textAnchor: "middle",
+ verticalAnchor: "middle"
+ };
+ }, getAttrsOfCartesianLabel = function(props) {
+ var viewBox = props.viewBox, offset = props.offset, position = props.position, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sign = height >= 0 ? 1 : -1;
+ return "top" === position ? {
+ x: x + width / 2,
+ y: y - sign * offset,
+ textAnchor: "middle",
+ verticalAnchor: "end"
+ } : "bottom" === position ? {
+ x: x + width / 2,
+ y: y + height + sign * offset,
+ textAnchor: "middle",
+ verticalAnchor: "start"
+ } : "left" === position ? {
+ x: x - offset,
+ y: y + height / 2,
+ textAnchor: "end",
+ verticalAnchor: "middle"
+ } : "right" === position ? {
+ x: x + width + offset,
+ y: y + height / 2,
+ textAnchor: "start",
+ verticalAnchor: "middle"
+ } : "insideLeft" === position ? {
+ x: x + offset,
+ y: y + height / 2,
+ textAnchor: "start",
+ verticalAnchor: "middle"
+ } : "insideRight" === position ? {
+ x: x + width - offset,
+ y: y + height / 2,
+ textAnchor: "end",
+ verticalAnchor: "middle"
+ } : "insideTop" === position ? {
+ x: x + width / 2,
+ y: y + sign * offset,
+ textAnchor: "middle",
+ verticalAnchor: "start"
+ } : "insideBottom" === position ? {
+ x: x + width / 2,
+ y: y + height - sign * offset,
+ textAnchor: "middle",
+ verticalAnchor: "end"
+ } : "insideTopLeft" === position ? {
+ x: x + offset,
+ y: y + sign * offset,
+ textAnchor: "start",
+ verticalAnchor: "start"
+ } : "insideTopRight" === position ? {
+ x: x + width - offset,
+ y: y + sign * offset,
+ textAnchor: "end",
+ verticalAnchor: "start"
+ } : "insideBottomLeft" === position ? {
+ x: x + offset,
+ y: y + height - sign * offset,
+ textAnchor: "start",
+ verticalAnchor: "end"
+ } : "insideBottomRight" === position ? {
+ x: x + width - offset,
+ y: y + height - sign * offset,
+ textAnchor: "end",
+ verticalAnchor: "end"
+ } : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(position) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(position.x) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.x)) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(position.y) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.y)) ? {
+ x: x + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.c)(position.x, width),
+ y: y + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.c)(position.y, height),
+ textAnchor: "end",
+ verticalAnchor: "end"
+ } : {
+ x: x + width / 2,
+ y: y + height / 2,
+ textAnchor: "middle",
+ verticalAnchor: "middle"
+ };
+ }, isPolar = function(viewBox) {
+ return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(viewBox.cx);
+ };
+ Label.displayName = "Label", Label.defaultProps = defaultProps, Label.propTypes = propTypes;
+ var parseViewBox = function(props) {
+ var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise;
+ if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(width) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(height)) {
+ if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(y)) return {
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ };
+ if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(top) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(left)) return {
+ x: top,
+ y: left,
+ width: width,
+ height: height
+ };
+ }
+ return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(y) ? {
+ x: x,
+ y: y,
+ width: 0,
+ height: 0
+ } : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(cx) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(cy) ? {
+ cx: cx,
+ cy: cy,
+ startAngle: startAngle || angle || 0,
+ endAngle: endAngle || angle || 0,
+ innerRadius: innerRadius || 0,
+ outerRadius: outerRadius || radius || r || 0,
+ clockWise: clockWise
+ } : props.viewBox ? props.viewBox : {};
+ }, parseLabel = function(label, viewBox) {
+ return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, {
+ key: "label-implicit",
+ viewBox: viewBox
+ }) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, {
+ key: "label-implicit",
+ viewBox: viewBox,
+ value: label
+ }) : Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, {
+ key: "label-implicit",
+ content: label,
+ viewBox: viewBox
+ }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, _extends({
+ viewBox: viewBox
+ }, label, {
+ key: "label-implicit"
+ })) : null : null;
+ }, renderCallByParent = function(parentProps, viewBox) {
+ var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2];
+ if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null;
+ var children = parentProps.children, parentViewBox = parseViewBox(parentProps), explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.h)(children, Label).map(function(child, index) {
+ return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(child, {
+ viewBox: viewBox || parentViewBox,
+ key: "label-" + index
+ });
+ });
+ return ckeckPropsLabel ? [ parseLabel(parentProps.label, viewBox || parentViewBox) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren;
+ };
+ Label.parseViewBox = parseViewBox, Label.renderCallByParent = renderCallByParent,
+ __webpack_exports__.a = Label;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__src_color__ = __webpack_require__(188);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_color__.e;
+ }), __webpack_require__.d(__webpack_exports__, "f", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_color__.g;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_color__.f;
+ });
+ var __WEBPACK_IMPORTED_MODULE_1__src_lab__ = __webpack_require__(730);
+ __webpack_require__.d(__webpack_exports__, "e", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_lab__.a;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_lab__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__ = __webpack_require__(731);
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__.a;
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function LabelList(props) {
+ var data = props.data, valueAccessor = props.valueAccessor, dataKey = props.dataKey, clockWise = props.clockWise, id = props.id, others = _objectWithoutProperties(props, [ "data", "valueAccessor", "dataKey", "clockWise", "id" ]);
+ return data && data.length ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-label-list"
+ }, data.map(function(entry, index) {
+ var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(dataKey) ? valueAccessor(entry, index) : Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry && entry.payload, dataKey), idProps = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? {} : {
+ id: id + "-" + index
+ };
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__Label__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(entry), others, idProps, {
+ index: index,
+ value: value,
+ viewBox: __WEBPACK_IMPORTED_MODULE_7__Label__.a.parseViewBox(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(clockWise) ? entry : _extends({}, entry, {
+ clockWise: clockWise
+ })),
+ key: "label-" + index
+ }));
+ })) : null;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(31), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_lodash_last__ = __webpack_require__(781), __WEBPACK_IMPORTED_MODULE_3_lodash_last___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_last__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, propTypes = {
+ id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object),
+ valueAccessor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ clockWise: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ])
+ }, defaultProps = {
+ valueAccessor: function(entry) {
+ return __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(entry.value) ? __WEBPACK_IMPORTED_MODULE_3_lodash_last___default()(entry.value) : entry.value;
+ }
+ };
+ LabelList.propTypes = propTypes, LabelList.displayName = "LabelList";
+ var parseLabelList = function(label, data) {
+ return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, {
+ key: "labelList-implicit",
+ data: data
+ }) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, {
+ key: "labelList-implicit",
+ data: data,
+ content: label
+ }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, _extends({
+ data: data
+ }, label, {
+ key: "labelList-implicit"
+ })) : null : null;
+ }, renderCallByParent = function(parentProps, data) {
+ var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2];
+ if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null;
+ var children = parentProps.children, explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, LabelList).map(function(child, index) {
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(child, {
+ data: data,
+ key: "labelList-" + index
+ });
+ });
+ return ckeckPropsLabel ? [ parseLabelList(parentProps.label, data) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren;
+ };
+ LabelList.renderCallByParent = renderCallByParent, LabelList.defaultProps = defaultProps,
+ __webpack_exports__.a = LabelList;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__ = __webpack_require__(281), __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_range__ = __webpack_require__(329), __WEBPACK_IMPORTED_MODULE_2_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_range__), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle__ = __webpack_require__(790), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_throttle__), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__container_Surface__ = __webpack_require__(78), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(122), __WEBPACK_IMPORTED_MODULE_11__component_Legend__ = __webpack_require__(171), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(66), __WEBPACK_IMPORTED_MODULE_13__shape_Cross__ = __webpack_require__(323), __WEBPACK_IMPORTED_MODULE_14__shape_Sector__ = __webpack_require__(128), __WEBPACK_IMPORTED_MODULE_15__shape_Dot__ = __webpack_require__(57), __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__ = __webpack_require__(65), __WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__ = __webpack_require__(330), __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__ = __webpack_require__(328), __WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__ = __webpack_require__(184), __WEBPACK_IMPORTED_MODULE_21__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_24__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_25__util_Events__ = __webpack_require__(791), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ORIENT_MAP = {
+ xAxis: [ "bottom", "top" ],
+ yAxis: [ "left", "right" ]
+ }, originCoordinate = {
+ x: 0,
+ y: 0
+ }, generateCategoricalChart = function(_ref) {
+ var _class, _temp, _initialiseProps, chartName = _ref.chartName, GraphicalChild = _ref.GraphicalChild, _ref$eventType = _ref.eventType, eventType = void 0 === _ref$eventType ? "axis" : _ref$eventType, axisComponents = _ref.axisComponents, legendContent = _ref.legendContent, formatAxisMap = _ref.formatAxisMap, defaultProps = _ref.defaultProps, propTypes = _ref.propTypes;
+ return _temp = _class = function(_Component) {
+ function CategoricalChartWrapper(props) {
+ _classCallCheck(this, CategoricalChartWrapper);
+ var _this = _possibleConstructorReturn(this, (CategoricalChartWrapper.__proto__ || Object.getPrototypeOf(CategoricalChartWrapper)).call(this, props));
+ _initialiseProps.call(_this);
+ var defaultState = _this.constructor.createDefaultState(props);
+ return _this.state = _extends({}, defaultState, {
+ updateId: 0
+ }, _this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({
+ props: props
+ }, defaultState, {
+ updateId: 0
+ }))), _this.uniqueChartId = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(props.id) ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.j)("recharts") : props.id,
+ props.throttleDelay && (_this.triggeredAfterMouseMove = __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default()(_this.triggeredAfterMouseMove, props.throttleDelay)),
+ _this;
+ }
+ return _inherits(CategoricalChartWrapper, _Component), _createClass(CategoricalChartWrapper, [ {
+ key: "componentDidMount",
+ value: function() {
+ __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.addListener();
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, data = _props.data, children = _props.children, width = _props.width, height = _props.height, layout = _props.layout, stackOffset = _props.stackOffset, margin = _props.margin, updateId = this.state.updateId;
+ if (nextProps.data === data && nextProps.width === width && nextProps.height === height && nextProps.layout === layout && nextProps.stackOffset === stackOffset && Object(__WEBPACK_IMPORTED_MODULE_24__util_PureRender__.b)(nextProps.margin, margin)) {
+ if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.m)(nextProps.children, children)) {
+ var hasGlobalData = !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.data), newUpdateId = hasGlobalData ? updateId : updateId + 1, _state = this.state, dataStartIndex = _state.dataStartIndex, dataEndIndex = _state.dataEndIndex, _defaultState = _extends({}, this.constructor.createDefaultState(nextProps), {
+ dataEndIndex: dataEndIndex,
+ dataStartIndex: dataStartIndex
+ });
+ this.setState(_extends({}, _defaultState, {
+ updateId: newUpdateId
+ }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({
+ props: nextProps
+ }, _defaultState, {
+ updateId: newUpdateId
+ }))));
+ }
+ } else {
+ var defaultState = this.constructor.createDefaultState(nextProps);
+ this.setState(_extends({}, defaultState, {
+ updateId: updateId + 1
+ }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({
+ props: nextProps
+ }, defaultState, {
+ updateId: updateId + 1
+ }))));
+ }
+ __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.addListener(),
+ !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.removeListener();
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.removeListener(),
+ "function" == typeof this.triggeredAfterMouseMove.cancel && this.triggeredAfterMouseMove.cancel();
+ }
+ }, {
+ key: "getAxisMap",
+ value: function(props, _ref2) {
+ var _ref2$axisType = _ref2.axisType, axisType = void 0 === _ref2$axisType ? "xAxis" : _ref2$axisType, AxisComp = _ref2.AxisComp, graphicalItems = _ref2.graphicalItems, stackGroups = _ref2.stackGroups, dataStartIndex = _ref2.dataStartIndex, dataEndIndex = _ref2.dataEndIndex, children = props.children, axisIdKey = axisType + "Id", axes = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, AxisComp), axisMap = {};
+ return axes && axes.length ? axisMap = this.getAxisMapByAxes(props, {
+ axes: axes,
+ graphicalItems: graphicalItems,
+ axisType: axisType,
+ axisIdKey: axisIdKey,
+ stackGroups: stackGroups,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ }) : graphicalItems && graphicalItems.length && (axisMap = this.getAxisMapByItems(props, {
+ Axis: AxisComp,
+ graphicalItems: graphicalItems,
+ axisType: axisType,
+ axisIdKey: axisIdKey,
+ stackGroups: stackGroups,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ })), axisMap;
+ }
+ }, {
+ key: "getAxisMapByAxes",
+ value: function(props, _ref3) {
+ var _this2 = this, axes = _ref3.axes, graphicalItems = _ref3.graphicalItems, axisType = _ref3.axisType, axisIdKey = _ref3.axisIdKey, stackGroups = _ref3.stackGroups, dataStartIndex = _ref3.dataStartIndex, dataEndIndex = _ref3.dataEndIndex, layout = props.layout, children = props.children, stackOffset = props.stackOffset, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType);
+ return axes.reduce(function(result, child) {
+ var _child$props = child.props, type = _child$props.type, dataKey = _child$props.dataKey, allowDataOverflow = _child$props.allowDataOverflow, allowDuplicatedCategory = _child$props.allowDuplicatedCategory, scale = _child$props.scale, ticks = _child$props.ticks, axisId = child.props[axisIdKey], displayedData = _this2.constructor.getDisplayedData(props, {
+ graphicalItems: graphicalItems.filter(function(item) {
+ return item.props[axisIdKey] === axisId;
+ }),
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ }), len = displayedData.length;
+ if (!result[axisId]) {
+ var domain = void 0, duplicateDomain = void 0, categoricalDomain = void 0;
+ if (dataKey) {
+ if (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, type),
+ "category" === type && isCategorial) {
+ var duplicate = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.d)(domain);
+ allowDuplicatedCategory && duplicate ? (duplicateDomain = domain, domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len)) : allowDuplicatedCategory || (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) {
+ return finalDomain.indexOf(entry) >= 0 ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]);
+ }, []));
+ } else if ("category" === type) domain = allowDuplicatedCategory ? domain.filter(function(entry) {
+ return "" !== entry && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry);
+ }) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) {
+ return finalDomain.indexOf(entry) >= 0 || "" === entry || __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry) ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]);
+ }, []); else if ("number" === type) {
+ var errorBarsDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.z)(displayedData, graphicalItems.filter(function(item) {
+ return item.props[axisIdKey] === axisId && !item.props.hide;
+ }), dataKey, axisType);
+ errorBarsDomain && (domain = errorBarsDomain);
+ }
+ !isCategorial || "number" !== type && "auto" === scale || (categoricalDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, "category"));
+ } else domain = isCategorial ? __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && "number" === type ? "expand" === stackOffset ? [ 0, 1 ] : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) {
+ return item.props[axisIdKey] === axisId && !item.props.hide;
+ }), type, !0);
+ return "number" === type && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType, ticks),
+ child.props.domain && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(child.props.domain, domain, allowDataOverflow))),
+ _extends({}, result, _defineProperty({}, axisId, _extends({}, child.props, {
+ axisType: axisType,
+ domain: domain,
+ categoricalDomain: categoricalDomain,
+ duplicateDomain: duplicateDomain,
+ originalDomain: child.props.domain,
+ isCategorial: isCategorial,
+ layout: layout
+ })));
+ }
+ return result;
+ }, {});
+ }
+ }, {
+ key: "getAxisMapByItems",
+ value: function(props, _ref4) {
+ var graphicalItems = _ref4.graphicalItems, Axis = _ref4.Axis, axisType = _ref4.axisType, axisIdKey = _ref4.axisIdKey, stackGroups = _ref4.stackGroups, dataStartIndex = _ref4.dataStartIndex, dataEndIndex = _ref4.dataEndIndex, layout = props.layout, children = props.children, displayedData = this.constructor.getDisplayedData(props, {
+ graphicalItems: graphicalItems,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ }), len = displayedData.length, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType), index = -1;
+ return graphicalItems.reduce(function(result, child) {
+ var axisId = child.props[axisIdKey];
+ if (!result[axisId]) {
+ index++;
+ var domain = void 0;
+ return isCategorial ? domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack ? (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex),
+ domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)) : (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(Axis.defaultProps.domain, Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) {
+ return item.props[axisIdKey] === axisId && !item.props.hide;
+ }), "number"), Axis.defaultProps.allowDataOverflow), domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)),
+ _extends({}, result, _defineProperty({}, axisId, _extends({
+ axisType: axisType
+ }, Axis.defaultProps, {
+ hide: !0,
+ orientation: ORIENT_MAP[axisType] && ORIENT_MAP[axisType][index % 2],
+ domain: domain,
+ originalDomain: Axis.defaultProps.domain,
+ isCategorial: isCategorial,
+ layout: layout
+ })));
+ }
+ return result;
+ }, {});
+ }
+ }, {
+ key: "getActiveCoordinate",
+ value: function(tooltipTicks, activeIndex, rangeObj) {
+ var layout = this.props.layout, entry = tooltipTicks.find(function(tick) {
+ return tick && tick.index === activeIndex;
+ });
+ if (entry) {
+ if ("horizontal" === layout) return {
+ x: entry.coordinate,
+ y: rangeObj.y
+ };
+ if ("vertical" === layout) return {
+ x: rangeObj.x,
+ y: entry.coordinate
+ };
+ if ("centric" === layout) {
+ var _angle = entry.coordinate, _radius = rangeObj.radius;
+ return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, _radius, _angle), {
+ angle: _angle,
+ radius: _radius
+ });
+ }
+ var radius = entry.coordinate, angle = rangeObj.angle;
+ return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, radius, angle), {
+ angle: angle,
+ radius: radius
+ });
+ }
+ return originCoordinate;
+ }
+ }, {
+ key: "getMouseInfo",
+ value: function(event) {
+ if (!this.container) return null;
+ var containerOffset = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.b)(this.container), e = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.a)(event, containerOffset), rangeObj = this.inRange(e.chartX, e.chartY);
+ if (!rangeObj) return null;
+ var _state2 = this.state, xAxisMap = _state2.xAxisMap, yAxisMap = _state2.yAxisMap;
+ if ("axis" !== eventType && xAxisMap && yAxisMap) {
+ var xScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap).scale, yScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap).scale, xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null, yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null;
+ return _extends({}, e, {
+ xValue: xValue,
+ yValue: yValue
+ });
+ }
+ var _state3 = this.state, ticks = _state3.orderedTooltipTicks, axis = _state3.tooltipAxis, tooltipTicks = _state3.tooltipTicks, pos = this.calculateTooltipPos(rangeObj), activeIndex = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.b)(pos, ticks, tooltipTicks, axis);
+ if (activeIndex >= 0 && tooltipTicks) {
+ var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value, activePayload = this.getTooltipContent(activeIndex, activeLabel), activeCoordinate = this.getActiveCoordinate(ticks, activeIndex, rangeObj);
+ return _extends({}, e, {
+ activeTooltipIndex: activeIndex,
+ activeLabel: activeLabel,
+ activePayload: activePayload,
+ activeCoordinate: activeCoordinate
+ });
+ }
+ return null;
+ }
+ }, {
+ key: "getTooltipContent",
+ value: function(activeIndex, activeLabel) {
+ var _state4 = this.state, graphicalItems = _state4.graphicalItems, tooltipAxis = _state4.tooltipAxis, displayedData = this.constructor.getDisplayedData(this.props, this.state);
+ return activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length ? null : graphicalItems.reduce(function(result, child) {
+ if (child.props.hide) return result;
+ var _child$props2 = child.props, dataKey = _child$props2.dataKey, name = _child$props2.name, unit = _child$props2.unit, formatter = _child$props2.formatter, data = _child$props2.data, payload = void 0;
+ return payload = tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(data || displayedData, tooltipAxis.dataKey, activeLabel) : displayedData[activeIndex],
+ payload ? [].concat(_toConsumableArray(result), [ _extends({}, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(child), {
+ dataKey: dataKey,
+ unit: unit,
+ formatter: formatter,
+ name: name || dataKey,
+ color: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(child),
+ value: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.w)(payload, dataKey),
+ payload: payload
+ }) ]) : result;
+ }, []);
+ }
+ }, {
+ key: "getFormatItems",
+ value: function(props, currentState) {
+ var _this3 = this, graphicalItems = currentState.graphicalItems, stackGroups = currentState.stackGroups, offset = currentState.offset, updateId = currentState.updateId, dataStartIndex = currentState.dataStartIndex, dataEndIndex = currentState.dataEndIndex, barSize = props.barSize, layout = props.layout, barGap = props.barGap, barCategoryGap = props.barCategoryGap, globalMaxBarSize = props.maxBarSize, _getAxisNameByLayout = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout.numericAxisName, cateAxisName = _getAxisNameByLayout.cateAxisName, hasBar = this.constructor.hasBar(graphicalItems), sizeList = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.i)({
+ barSize: barSize,
+ stackGroups: stackGroups
+ }), formatedItems = [];
+ return graphicalItems.forEach(function(item, index) {
+ var displayedData = _this3.constructor.getDisplayedData(props, {
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ }, item), _item$props = item.props, dataKey = _item$props.dataKey, childMaxBarSize = _item$props.maxBarSize, numericAxisId = item.props[numericAxisName + "Id"], cateAxisId = item.props[cateAxisName + "Id"], axisObj = axisComponents.reduce(function(result, entry) {
+ var _extends4, axisMap = currentState[entry.axisType + "Map"], id = item.props[entry.axisType + "Id"], axis = axisMap && axisMap[id];
+ return _extends({}, result, (_extends4 = {}, _defineProperty(_extends4, entry.axisType, axis),
+ _defineProperty(_extends4, entry.axisType + "Ticks", Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis)),
+ _extends4));
+ }, {}), cateAxis = axisObj[cateAxisName], cateTicks = axisObj[cateAxisName + "Ticks"], stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.t)(item, stackGroups[numericAxisId].stackGroups), bandSize = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(cateAxis, cateTicks), maxBarSize = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize, barPosition = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.h)({
+ barGap: barGap,
+ barCategoryGap: barCategoryGap,
+ bandSize: bandSize,
+ sizeList: sizeList[cateAxisId],
+ maxBarSize: maxBarSize
+ }), componsedFn = item && item.type && item.type.getComposedData;
+ if (componsedFn) {
+ var _extends5;
+ formatedItems.push({
+ props: _extends({}, componsedFn(_extends({}, axisObj, {
+ displayedData: displayedData,
+ props: props,
+ dataKey: dataKey,
+ item: item,
+ bandSize: bandSize,
+ barPosition: barPosition,
+ offset: offset,
+ stackedData: stackedData,
+ layout: layout,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex,
+ onItemMouseLeave: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseLeave, null, item.props.onMouseLeave),
+ onItemMouseEnter: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseEnter, null, item.props.onMouseEnter)
+ })), (_extends5 = {
+ key: item.key || "item-" + index
+ }, _defineProperty(_extends5, numericAxisName, axisObj[numericAxisName]), _defineProperty(_extends5, cateAxisName, axisObj[cateAxisName]),
+ _defineProperty(_extends5, "animationId", updateId), _extends5)),
+ childIndex: Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.o)(item, props.children),
+ item: item
+ });
+ }
+ }), formatedItems;
+ }
+ }, {
+ key: "getCursorRectangle",
+ value: function() {
+ var layout = this.props.layout, _state5 = this.state, activeCoordinate = _state5.activeCoordinate, offset = _state5.offset, tooltipAxisBandSize = _state5.tooltipAxisBandSize, halfSize = tooltipAxisBandSize / 2;
+ return {
+ stroke: "none",
+ fill: "#ccc",
+ x: "horizontal" === layout ? activeCoordinate.x - halfSize : offset.left + .5,
+ y: "horizontal" === layout ? offset.top + .5 : activeCoordinate.y - halfSize,
+ width: "horizontal" === layout ? tooltipAxisBandSize : offset.width - 1,
+ height: "horizontal" === layout ? offset.height - 1 : tooltipAxisBandSize
+ };
+ }
+ }, {
+ key: "getCursorPoints",
+ value: function() {
+ var layout = this.props.layout, _state6 = this.state, activeCoordinate = _state6.activeCoordinate, offset = _state6.offset, x1 = void 0, y1 = void 0, x2 = void 0, y2 = void 0;
+ if ("horizontal" === layout) x1 = activeCoordinate.x, x2 = x1, y1 = offset.top,
+ y2 = offset.top + offset.height; else if ("vertical" === layout) y1 = activeCoordinate.y,
+ y2 = y1, x1 = offset.left, x2 = offset.left + offset.width; else if (!__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cx) || !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cy)) {
+ if ("centric" !== layout) {
+ var _cx = activeCoordinate.cx, _cy = activeCoordinate.cy, radius = activeCoordinate.radius, startAngle = activeCoordinate.startAngle, endAngle = activeCoordinate.endAngle, startPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, startAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, endAngle);
+ return {
+ points: [ startPoint, endPoint ],
+ cx: _cx,
+ cy: _cy,
+ radius: radius,
+ startAngle: startAngle,
+ endAngle: endAngle
+ };
+ }
+ var cx = activeCoordinate.cx, cy = activeCoordinate.cy, innerRadius = activeCoordinate.innerRadius, outerRadius = activeCoordinate.outerRadius, angle = activeCoordinate.angle, innerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, innerRadius, angle), outerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, outerRadius, angle);
+ x1 = innerPoint.x, y1 = innerPoint.y, x2 = outerPoint.x, y2 = outerPoint.y;
+ }
+ return [ {
+ x: x1,
+ y: y1
+ }, {
+ x: x2,
+ y: y2
+ } ];
+ }
+ }, {
+ key: "getAxisNameByLayout",
+ value: function(layout) {
+ return "horizontal" === layout ? {
+ numericAxisName: "yAxis",
+ cateAxisName: "xAxis"
+ } : "vertical" === layout ? {
+ numericAxisName: "xAxis",
+ cateAxisName: "yAxis"
+ } : "centric" === layout ? {
+ numericAxisName: "radiusAxis",
+ cateAxisName: "angleAxis"
+ } : {
+ numericAxisName: "angleAxis",
+ cateAxisName: "radiusAxis"
+ };
+ }
+ }, {
+ key: "calculateTooltipPos",
+ value: function(rangeObj) {
+ var layout = this.props.layout;
+ return "horizontal" === layout ? rangeObj.x : "vertical" === layout ? rangeObj.y : "centric" === layout ? rangeObj.angle : rangeObj.radius;
+ }
+ }, {
+ key: "inRange",
+ value: function(x, y) {
+ var layout = this.props.layout;
+ if ("horizontal" === layout || "vertical" === layout) {
+ var offset = this.state.offset;
+ return x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height ? {
+ x: x,
+ y: y
+ } : null;
+ }
+ var _state7 = this.state, angleAxisMap = _state7.angleAxisMap, radiusAxisMap = _state7.radiusAxisMap;
+ if (angleAxisMap && radiusAxisMap) {
+ var angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap);
+ return Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.d)({
+ x: x,
+ y: y
+ }, angleAxis);
+ }
+ return null;
+ }
+ }, {
+ key: "parseEventsOfWrapper",
+ value: function() {
+ var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), tooltipEvents = tooltipItem && "axis" === eventType ? {
+ onMouseEnter: this.handleMouseEnter,
+ onMouseMove: this.handleMouseMove,
+ onMouseLeave: this.handleMouseLeave,
+ onTouchMove: this.handleTouchMove
+ } : {}, outerEvents = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(this.props, this.handleOuterEvent);
+ return _extends({}, outerEvents, tooltipEvents);
+ }
+ }, {
+ key: "updateStateOfAxisMapsOffsetAndStackGroups",
+ value: function(_ref5) {
+ var _this4 = this, props = _ref5.props, dataStartIndex = _ref5.dataStartIndex, dataEndIndex = _ref5.dataEndIndex, updateId = _ref5.updateId;
+ if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)({
+ props: props
+ })) return null;
+ var children = props.children, layout = props.layout, stackOffset = props.stackOffset, data = props.data, reverseStackOrder = props.reverseStackOrder, _getAxisNameByLayout2 = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout2.numericAxisName, cateAxisName = _getAxisNameByLayout2.cateAxisName, graphicalItems = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, GraphicalChild), stackGroups = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.s)(data, graphicalItems, numericAxisName + "Id", cateAxisName + "Id", stackOffset, reverseStackOrder), axisObj = axisComponents.reduce(function(result, entry) {
+ var name = entry.axisType + "Map";
+ return _extends({}, result, _defineProperty({}, name, _this4.getAxisMap(props, _extends({}, entry, {
+ graphicalItems: graphicalItems,
+ stackGroups: entry.axisType === numericAxisName && stackGroups,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ }))));
+ }, {}), offset = this.calculateOffset(_extends({}, axisObj, {
+ props: props,
+ graphicalItems: graphicalItems
+ }));
+ Object.keys(axisObj).forEach(function(key) {
+ axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace("Map", ""), chartName);
+ });
+ var cateAxisMap = axisObj[cateAxisName + "Map"], ticksObj = this.tooltipTicksGenerator(cateAxisMap), formatedGraphicalItems = this.getFormatItems(props, _extends({}, axisObj, {
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex,
+ updateId: updateId,
+ graphicalItems: graphicalItems,
+ stackGroups: stackGroups,
+ offset: offset
+ }));
+ return _extends({
+ formatedGraphicalItems: formatedGraphicalItems,
+ graphicalItems: graphicalItems,
+ offset: offset,
+ stackGroups: stackGroups
+ }, ticksObj, axisObj);
+ }
+ }, {
+ key: "addListener",
+ value: function() {
+ __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.on(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent),
+ __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners + 1);
+ }
+ }, {
+ key: "removeListener",
+ value: function() {
+ __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.removeListener(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent),
+ __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners - 1);
+ }
+ }, {
+ key: "calculateOffset",
+ value: function(_ref6) {
+ var props = _ref6.props, graphicalItems = _ref6.graphicalItems, _ref6$xAxisMap = _ref6.xAxisMap, xAxisMap = void 0 === _ref6$xAxisMap ? {} : _ref6$xAxisMap, _ref6$yAxisMap = _ref6.yAxisMap, yAxisMap = void 0 === _ref6$yAxisMap ? {} : _ref6$yAxisMap, width = props.width, height = props.height, children = props.children, margin = props.margin || {}, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a), legendItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_11__component_Legend__.a), offsetH = Object.keys(yAxisMap).reduce(function(result, id) {
+ var entry = yAxisMap[id], orientation = entry.orientation;
+ return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.width));
+ }, {
+ left: margin.left || 0,
+ right: margin.right || 0
+ }), offsetV = Object.keys(xAxisMap).reduce(function(result, id) {
+ var entry = xAxisMap[id], orientation = entry.orientation;
+ return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.height));
+ }, {
+ top: margin.top || 0,
+ bottom: margin.bottom || 0
+ }), offset = _extends({}, offsetV, offsetH), brushBottom = offset.bottom;
+ if (brushItem && (offset.bottom += brushItem.props.height || __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a.defaultProps.height),
+ legendItem && this.legendInstance) {
+ var legendBox = this.legendInstance.getBBox();
+ offset = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.a)(offset, graphicalItems, props, legendBox);
+ }
+ return _extends({
+ brushBottom: brushBottom
+ }, offset, {
+ width: width - offset.left - offset.right,
+ height: height - offset.top - offset.bottom
+ });
+ }
+ }, {
+ key: "triggerSyncEvent",
+ value: function(data) {
+ var syncId = this.props.syncId;
+ __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(syncId) || __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.emit(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, syncId, this.uniqueChartId, data);
+ }
+ }, {
+ key: "filterFormatItem",
+ value: function(item, displayName, childIndex) {
+ for (var formatedGraphicalItems = this.state.formatedGraphicalItems, i = 0, len = formatedGraphicalItems.length; i < len; i++) {
+ var entry = formatedGraphicalItems[i];
+ if (entry.item === item || entry.props.key === item.key || displayName === Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(entry.item.type) && childIndex === entry.childIndex) return entry;
+ }
+ return null;
+ }
+ }, {
+ key: "renderAxis",
+ value: function(axisOptions, element, displayName, index) {
+ var _props2 = this.props, width = _props2.width, height = _props2.height;
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a, _extends({}, axisOptions, {
+ className: "recharts-" + axisOptions.axisType + " " + axisOptions.axisType,
+ key: element.key || displayName + "-" + index,
+ viewBox: {
+ x: 0,
+ y: 0,
+ width: width,
+ height: height
+ },
+ ticksGenerator: this.axesTicksGenerator
+ }));
+ }
+ }, {
+ key: "renderLegend",
+ value: function() {
+ var _this5 = this, formatedGraphicalItems = this.state.formatedGraphicalItems, _props3 = this.props, children = _props3.children, width = _props3.width, height = _props3.height, margin = this.props.margin || {}, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), props = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.q)({
+ children: children,
+ formatedGraphicalItems: formatedGraphicalItems,
+ legendWidth: legendWidth,
+ legendHeight: legendHeight,
+ legendContent: legendContent
+ });
+ if (!props) return null;
+ var item = props.item, otherProps = _objectWithoutProperties(props, [ "item" ]);
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(item, _extends({}, otherProps, {
+ chartWidth: width,
+ chartHeight: height,
+ margin: margin,
+ ref: function(legend) {
+ _this5.legendInstance = legend;
+ },
+ onBBoxUpdate: this.handleLegendBBoxUpdate
+ }));
+ }
+ }, {
+ key: "renderTooltip",
+ value: function() {
+ var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a);
+ if (!tooltipItem) return null;
+ var _state8 = this.state, isTooltipActive = _state8.isTooltipActive, activeCoordinate = _state8.activeCoordinate, activePayload = _state8.activePayload, activeLabel = _state8.activeLabel, offset = _state8.offset;
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(tooltipItem, {
+ viewBox: _extends({}, offset, {
+ x: offset.left,
+ y: offset.top
+ }),
+ active: isTooltipActive,
+ label: activeLabel,
+ payload: isTooltipActive ? activePayload : [],
+ coordinate: activeCoordinate
+ });
+ }
+ }, {
+ key: "renderActiveDot",
+ value: function(option, props) {
+ var dot = void 0;
+ return dot = Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(option) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_15__shape_Dot__.a, props),
+ __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {
+ className: "recharts-active-dot",
+ key: props.key
+ }, dot);
+ }
+ }, {
+ key: "renderActivePoints",
+ value: function(_ref7) {
+ var item = _ref7.item, activePoint = _ref7.activePoint, basePoint = _ref7.basePoint, childIndex = _ref7.childIndex, isRange = _ref7.isRange, result = [], key = item.props.key, _item$item$props = item.item.props, activeDot = _item$item$props.activeDot, dataKey = _item$item$props.dataKey, dotProps = _extends({
+ index: childIndex,
+ dataKey: dataKey,
+ cx: activePoint.x,
+ cy: activePoint.y,
+ r: 4,
+ fill: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(item.item),
+ strokeWidth: 2,
+ stroke: "#fff",
+ payload: activePoint.payload,
+ value: activePoint.value,
+ key: key + "-activePoint-" + childIndex
+ }, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(activeDot), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(activeDot));
+ return result.push(this.renderActiveDot(activeDot, dotProps, childIndex)), basePoint ? result.push(this.renderActiveDot(activeDot, _extends({}, dotProps, {
+ cx: basePoint.x,
+ cy: basePoint.y,
+ key: key + "-basePoint-" + childIndex
+ }), childIndex)) : isRange && result.push(null), result;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this6 = this;
+ if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)(this)) return null;
+ var _props4 = this.props, children = _props4.children, className = _props4.className, width = _props4.width, height = _props4.height, style = _props4.style, compact = _props4.compact, others = _objectWithoutProperties(_props4, [ "children", "className", "width", "height", "style", "compact" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(others), map = {
+ CartesianGrid: {
+ handler: this.renderGrid,
+ once: !0
+ },
+ ReferenceArea: {
+ handler: this.renderReferenceElement
+ },
+ ReferenceLine: {
+ handler: this.renderReferenceElement
+ },
+ ReferenceDot: {
+ handler: this.renderReferenceElement
+ },
+ XAxis: {
+ handler: this.renderXAxis
+ },
+ YAxis: {
+ handler: this.renderYAxis
+ },
+ Brush: {
+ handler: this.renderBrush,
+ once: !0
+ },
+ Bar: {
+ handler: this.renderGraphicChild
+ },
+ Line: {
+ handler: this.renderGraphicChild
+ },
+ Area: {
+ handler: this.renderGraphicChild
+ },
+ Radar: {
+ handler: this.renderGraphicChild
+ },
+ RadialBar: {
+ handler: this.renderGraphicChild
+ },
+ Scatter: {
+ handler: this.renderGraphicChild
+ },
+ Pie: {
+ handler: this.renderGraphicChild
+ },
+ Tooltip: {
+ handler: this.renderCursor,
+ once: !0
+ },
+ PolarGrid: {
+ handler: this.renderPolarGrid,
+ once: !0
+ },
+ PolarAngleAxis: {
+ handler: this.renderPolarAxis
+ },
+ PolarRadiusAxis: {
+ handler: this.renderPolarAxis
+ }
+ };
+ if (compact) return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, {
+ width: width,
+ height: height
+ }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map));
+ var events = this.parseEventsOfWrapper();
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("div", _extends({
+ className: __WEBPACK_IMPORTED_MODULE_7_classnames___default()("recharts-wrapper", className),
+ style: _extends({}, style, {
+ position: "relative",
+ cursor: "default",
+ width: width,
+ height: height
+ })
+ }, events, {
+ ref: function(node) {
+ _this6.container = node;
+ }
+ }), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, {
+ width: width,
+ height: height
+ }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)), this.renderLegend(), this.renderTooltip());
+ }
+ } ]), CategoricalChartWrapper;
+ }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class.displayName = chartName,
+ _class.propTypes = _extends({
+ syncId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ compact: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object),
+ layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "horizontal", "vertical" ]),
+ stackOffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "sign", "expand", "none", "wiggle", "silhouette" ]),
+ throttleDelay: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ margin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({
+ top: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ right: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ bottom: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ left: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number
+ }),
+ barCategoryGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ barGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ barSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ maxBarSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,
+ className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ children: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node ]),
+ onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ reverseStackOrder: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string
+ }, propTypes), _class.defaultProps = _extends({
+ layout: "horizontal",
+ stackOffset: "none",
+ barCategoryGap: "10%",
+ barGap: 4,
+ margin: {
+ top: 5,
+ right: 5,
+ bottom: 5,
+ left: 5
+ },
+ reverseStackOrder: !1
+ }, defaultProps), _class.createDefaultState = function(props) {
+ var children = props.children, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a);
+ return {
+ chartX: 0,
+ chartY: 0,
+ dataStartIndex: brushItem && brushItem.props && brushItem.props.startIndex || 0,
+ dataEndIndex: brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0,
+ activeTooltipIndex: -1,
+ isTooltipActive: !1
+ };
+ }, _class.hasBar = function(graphicalItems) {
+ return !(!graphicalItems || !graphicalItems.length) && graphicalItems.some(function(item) {
+ var name = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(item && item.type);
+ return name && name.indexOf("Bar") >= 0;
+ });
+ }, _class.getDisplayedData = function(props, _ref8, item) {
+ var graphicalItems = _ref8.graphicalItems, dataStartIndex = _ref8.dataStartIndex, dataEndIndex = _ref8.dataEndIndex, itemsData = (graphicalItems || []).reduce(function(result, child) {
+ var itemData = child.props.data;
+ return itemData && itemData.length ? [].concat(_toConsumableArray(result), _toConsumableArray(itemData)) : result;
+ }, []);
+ if (itemsData && itemsData.length > 0) return itemsData;
+ if (item && item.props && item.props.data && item.props.data.length > 0) return item.props.data;
+ var data = props.data;
+ return data && data.length && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(dataStartIndex) && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(dataEndIndex) ? data.slice(dataStartIndex, dataEndIndex + 1) : [];
+ }, _initialiseProps = function() {
+ var _this7 = this;
+ this.handleLegendBBoxUpdate = function(box) {
+ if (box && _this7.legendInstance) {
+ var _state9 = _this7.state, dataStartIndex = _state9.dataStartIndex, dataEndIndex = _state9.dataEndIndex, updateId = _state9.updateId;
+ _this7.setState(_this7.updateStateOfAxisMapsOffsetAndStackGroups({
+ props: _this7.props,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex,
+ updateId: updateId
+ }));
+ }
+ }, this.handleReceiveSyncEvent = function(cId, chartId, data) {
+ var _props5 = _this7.props, syncId = _props5.syncId, layout = _props5.layout, updateId = _this7.state.updateId;
+ if (syncId === cId && chartId !== _this7.uniqueChartId) {
+ var dataStartIndex = data.dataStartIndex, dataEndIndex = data.dataEndIndex;
+ if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataStartIndex) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataEndIndex)) if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.activeTooltipIndex)) _this7.setState(data); else {
+ var chartX = data.chartX, chartY = data.chartY, activeTooltipIndex = data.activeTooltipIndex, _state10 = _this7.state, offset = _state10.offset, tooltipTicks = _state10.tooltipTicks;
+ if (!offset) return;
+ var viewBox = _extends({}, offset, {
+ x: offset.left,
+ y: offset.top
+ }), validateChartX = Math.min(chartX, viewBox.x + viewBox.width), validateChartY = Math.min(chartY, viewBox.y + viewBox.height), activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value, activePayload = _this7.getTooltipContent(activeTooltipIndex), activeCoordinate = tooltipTicks[activeTooltipIndex] ? {
+ x: "horizontal" === layout ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX,
+ y: "horizontal" === layout ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate
+ } : originCoordinate;
+ _this7.setState(_extends({}, data, {
+ activeLabel: activeLabel,
+ activeCoordinate: activeCoordinate,
+ activePayload: activePayload
+ }));
+ } else _this7.setState(_extends({
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex
+ }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({
+ props: _this7.props,
+ dataStartIndex: dataStartIndex,
+ dataEndIndex: dataEndIndex,
+ updateId: updateId
+ })));
+ }
+ }, this.handleBrushChange = function(_ref9) {
+ var startIndex = _ref9.startIndex, endIndex = _ref9.endIndex;
+ if (startIndex !== _this7.state.dataStartIndex || endIndex !== _this7.state.dataEndIndex) {
+ var updateId = _this7.state.updateId;
+ _this7.setState(function() {
+ return _extends({
+ dataStartIndex: startIndex,
+ dataEndIndex: endIndex
+ }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({
+ props: _this7.props,
+ dataStartIndex: startIndex,
+ dataEndIndex: endIndex,
+ updateId: updateId
+ }));
+ }), _this7.triggerSyncEvent({
+ dataStartIndex: startIndex,
+ dataEndIndex: endIndex
+ });
+ }
+ }, this.handleMouseEnter = function(e) {
+ var onMouseEnter = _this7.props.onMouseEnter, mouse = _this7.getMouseInfo(e);
+ if (mouse) {
+ var nextState = _extends({}, mouse, {
+ isTooltipActive: !0
+ });
+ _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseEnter) && onMouseEnter(nextState, e);
+ }
+ }, this.triggeredAfterMouseMove = function(e) {
+ var onMouseMove = _this7.props.onMouseMove, mouse = _this7.getMouseInfo(e), nextState = mouse ? _extends({}, mouse, {
+ isTooltipActive: !0
+ }) : {
+ isTooltipActive: !1
+ };
+ _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseMove) && onMouseMove(nextState, e);
+ }, this.handleItemMouseEnter = function(el) {
+ _this7.setState(function() {
+ return {
+ isTooltipActive: !0,
+ activeItem: el,
+ activePayload: el.tooltipPayload,
+ activeCoordinate: el.tooltipPosition || {
+ x: el.cx,
+ y: el.cy
+ }
+ };
+ });
+ }, this.handleItemMouseLeave = function() {
+ _this7.setState(function() {
+ return {
+ isTooltipActive: !1
+ };
+ });
+ }, this.handleMouseMove = function(e) {
+ e && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(e.persist) && e.persist(),
+ _this7.triggeredAfterMouseMove(e);
+ }, this.handleMouseLeave = function(e) {
+ var onMouseLeave = _this7.props.onMouseLeave, nextState = {
+ isTooltipActive: !1
+ };
+ _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseLeave) && onMouseLeave(nextState, e);
+ }, this.handleOuterEvent = function(e) {
+ var eventName = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.l)(e);
+ if (eventName && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(_this7.props[eventName])) {
+ var mouse = _this7.getMouseInfo(e);
+ (0, _this7.props[eventName])(mouse, e);
+ }
+ }, this.handleClick = function(e) {
+ var onClick = _this7.props.onClick;
+ if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onClick)) {
+ onClick(_this7.getMouseInfo(e), e);
+ }
+ }, this.handleMouseDown = function(e) {
+ var onMouseDown = _this7.props.onMouseDown;
+ if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseDown)) {
+ onMouseDown(_this7.getMouseInfo(e), e);
+ }
+ }, this.handleMouseUp = function(e) {
+ var onMouseUp = _this7.props.onMouseUp;
+ if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseUp)) {
+ onMouseUp(_this7.getMouseInfo(e), e);
+ }
+ }, this.handleTouchMove = function(e) {
+ null != e.changedTouches && e.changedTouches.length > 0 && _this7.handleMouseMove(e.changedTouches[0]);
+ }, this.verticalCoordinatesGenerator = function(_ref10) {
+ var xAxis = _ref10.xAxis, width = _ref10.width, height = _ref10.height, offset = _ref10.offset;
+ return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, xAxis, {
+ ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(xAxis, !0),
+ viewBox: {
+ x: 0,
+ y: 0,
+ width: width,
+ height: height
+ }
+ })), offset.left, offset.left + offset.width);
+ }, this.horizontalCoordinatesGenerator = function(_ref11) {
+ var yAxis = _ref11.yAxis, width = _ref11.width, height = _ref11.height, offset = _ref11.offset;
+ return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, yAxis, {
+ ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(yAxis, !0),
+ viewBox: {
+ x: 0,
+ y: 0,
+ width: width,
+ height: height
+ }
+ })), offset.top, offset.top + offset.height);
+ }, this.axesTicksGenerator = function(axis) {
+ return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !0);
+ }, this.tooltipTicksGenerator = function(axisMap) {
+ var axis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(axisMap), tooltipTicks = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !1, !0);
+ return {
+ tooltipTicks: tooltipTicks,
+ orderedTooltipTicks: __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default()(tooltipTicks, function(o) {
+ return o.coordinate;
+ }),
+ tooltipAxis: axis,
+ tooltipAxisBandSize: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(axis)
+ };
+ }, this.renderCursor = function(element) {
+ var _state11 = _this7.state, isTooltipActive = _state11.isTooltipActive, activeCoordinate = _state11.activeCoordinate, activePayload = _state11.activePayload, offset = _state11.offset;
+ if (!(element && element.props.cursor && isTooltipActive && activeCoordinate)) return null;
+ var layout = _this7.props.layout, restProps = void 0, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a;
+ if ("ScatterChart" === chartName) restProps = activeCoordinate, cursorComp = __WEBPACK_IMPORTED_MODULE_13__shape_Cross__.a; else if ("BarChart" === chartName) restProps = _this7.getCursorRectangle(),
+ cursorComp = __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__.a; else if ("radial" === layout) {
+ var _getCursorPoints = _this7.getCursorPoints(), cx = _getCursorPoints.cx, cy = _getCursorPoints.cy, radius = _getCursorPoints.radius, startAngle = _getCursorPoints.startAngle, endAngle = _getCursorPoints.endAngle;
+ restProps = {
+ cx: cx,
+ cy: cy,
+ startAngle: startAngle,
+ endAngle: endAngle,
+ innerRadius: radius,
+ outerRadius: radius
+ }, cursorComp = __WEBPACK_IMPORTED_MODULE_14__shape_Sector__.a;
+ } else restProps = {
+ points: _this7.getCursorPoints()
+ }, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a;
+ var key = element.key || "_recharts-cursor", cursorProps = _extends({
+ stroke: "#ccc"
+ }, offset, restProps, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(element.props.cursor), {
+ payload: activePayload,
+ key: key,
+ className: "recharts-tooltip-cursor"
+ });
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(element.props.cursor) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element.props.cursor, cursorProps) : Object(__WEBPACK_IMPORTED_MODULE_5_react__.createElement)(cursorComp, cursorProps);
+ }, this.renderPolarAxis = function(element, displayName, index) {
+ var axisType = element.type.axisType, axisMap = _this7.state[axisType + "Map"], axisOption = axisMap[element.props[axisType + "Id"]];
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, _extends({}, axisOption, {
+ className: axisType,
+ key: element.key || displayName + "-" + index,
+ ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axisOption, !0)
+ }));
+ }, this.renderXAxis = function(element, displayName, index) {
+ var xAxisMap = _this7.state.xAxisMap, axisObj = xAxisMap[element.props.xAxisId];
+ return _this7.renderAxis(axisObj, element, displayName, index);
+ }, this.renderYAxis = function(element, displayName, index) {
+ var yAxisMap = _this7.state.yAxisMap, axisObj = yAxisMap[element.props.yAxisId];
+ return _this7.renderAxis(axisObj, element, displayName, index);
+ }, this.renderGrid = function(element) {
+ var _state12 = _this7.state, xAxisMap = _state12.xAxisMap, yAxisMap = _state12.yAxisMap, offset = _state12.offset, _props6 = _this7.props, width = _props6.width, height = _props6.height, xAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap), yAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap), props = element.props || {};
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {
+ key: element.key || "grid",
+ x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(props.x) ? props.x : offset.left,
+ y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(props.y) ? props.y : offset.top,
+ width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(props.width) ? props.width : offset.width,
+ height: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(props.height) ? props.height : offset.height,
+ xAxis: xAxis,
+ yAxis: yAxis,
+ offset: offset,
+ chartWidth: width,
+ chartHeight: height,
+ verticalCoordinatesGenerator: _this7.verticalCoordinatesGenerator,
+ horizontalCoordinatesGenerator: _this7.horizontalCoordinatesGenerator
+ });
+ }, this.renderPolarGrid = function(element) {
+ var _state13 = _this7.state, radiusAxisMap = _state13.radiusAxisMap, angleAxisMap = _state13.angleAxisMap, radiusAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(radiusAxisMap), angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap), cx = angleAxis.cx, cy = angleAxis.cy, innerRadius = angleAxis.innerRadius, outerRadius = angleAxis.outerRadius;
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {
+ polarAngles: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(angleAxis, !0).map(function(entry) {
+ return entry.coordinate;
+ }),
+ polarRadius: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(radiusAxis, !0).map(function(entry) {
+ return entry.coordinate;
+ }),
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ key: element.key || "polar-grid"
+ });
+ }, this.renderBrush = function(element) {
+ var _props7 = _this7.props, margin = _props7.margin, data = _props7.data, _state14 = _this7.state, offset = _state14.offset, dataStartIndex = _state14.dataStartIndex, dataEndIndex = _state14.dataEndIndex, updateId = _state14.updateId;
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {
+ key: element.key || "_recharts-brush",
+ onChange: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this7.handleBrushChange, null, element.props.onChange),
+ data: data,
+ x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(element.props.x) ? element.props.x : offset.left,
+ y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0),
+ width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.g)(element.props.width) ? element.props.width : offset.width,
+ startIndex: dataStartIndex,
+ endIndex: dataEndIndex,
+ updateId: "brush-" + updateId
+ });
+ }, this.renderReferenceElement = function(element, displayName, index) {
+ if (!element) return null;
+ var _state15 = _this7.state, xAxisMap = _state15.xAxisMap, yAxisMap = _state15.yAxisMap, offset = _state15.offset, _element$props = element.props, xAxisId = _element$props.xAxisId, yAxisId = _element$props.yAxisId;
+ return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {
+ key: element.key || displayName + "-" + index,
+ xAxis: xAxisMap[xAxisId],
+ yAxis: yAxisMap[yAxisId],
+ viewBox: {
+ x: offset.left,
+ y: offset.top,
+ width: offset.width,
+ height: offset.height
+ }
+ });
+ }, this.renderGraphicChild = function(element, displayName, index) {
+ var item = _this7.filterFormatItem(element, displayName, index);
+ if (!item) return null;
+ var graphicalItem = Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, item.props), _state16 = _this7.state, isTooltipActive = _state16.isTooltipActive, tooltipAxis = _state16.tooltipAxis, activeTooltipIndex = _state16.activeTooltipIndex, activeLabel = _state16.activeLabel, children = _this7.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), _item$props2 = item.props, points = _item$props2.points, isRange = _item$props2.isRange, baseLine = _item$props2.baseLine, _item$item$props2 = item.item.props, activeDot = _item$item$props2.activeDot;
+ if (!_item$item$props2.hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0) {
+ var activePoint = void 0, basePoint = void 0;
+ if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? (activePoint = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(points, "payload." + tooltipAxis.dataKey, activeLabel),
+ basePoint = isRange && baseLine && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(baseLine, "payload." + tooltipAxis.dataKey, activeLabel)) : (activePoint = points[activeTooltipIndex],
+ basePoint = isRange && baseLine && baseLine[activeTooltipIndex]), !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activePoint)) return [ graphicalItem ].concat(_toConsumableArray(_this7.renderActivePoints({
+ item: item,
+ activePoint: activePoint,
+ basePoint: basePoint,
+ childIndex: activeTooltipIndex,
+ isRange: isRange
+ })));
+ }
+ return isRange ? [ graphicalItem, null, null ] : [ graphicalItem, null ];
+ };
+ }, _temp;
+ };
+ __webpack_exports__.a = generateCategoricalChart;
+}, function(module, exports, __webpack_require__) {
+ var aFunction = __webpack_require__(206);
+ module.exports = function(fn, that, length) {
+ if (aFunction(fn), void 0 === that) return fn;
+ switch (length) {
+ case 1:
+ return function(a) {
+ return fn.call(that, a);
+ };
+
+ case 2:
+ return function(a, b) {
+ return fn.call(that, a, b);
+ };
+
+ case 3:
+ return function(a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function() {
+ return fn.apply(that, arguments);
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(35);
+ module.exports = function(it) {
+ if (!isObject(it)) throw TypeError(it + " is not an object!");
+ return it;
+ };
+}, function(module, exports) {
+ module.exports = function(exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return !0;
+ }
+ };
+}, function(module, exports) {
+ var hasOwnProperty = {}.hasOwnProperty;
+ module.exports = function(it, key) {
+ return hasOwnProperty.call(it, key);
+ };
+}, function(module, exports) {
+ var g;
+ g = function() {
+ return this;
+ }();
+ try {
+ g = g || Function("return this")() || (0, eval)("this");
+ } catch (e) {
+ "object" == typeof window && (g = window);
+ }
+ module.exports = g;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function capitalizeFirstLetter(string) {
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)("string" == typeof string, "Material-UI: capitalizeFirstLetter(string) expects a string argument."),
+ string.charAt(0).toUpperCase() + string.slice(1);
+ }
+ function contains(obj, pred) {
+ return (0, _keys2.default)(pred).every(function(key) {
+ return obj.hasOwnProperty(key) && obj[key] === pred[key];
+ });
+ }
+ function findIndex(arr, pred) {
+ for (var predType = void 0 === pred ? "undefined" : (0, _typeof3.default)(pred), i = 0; i < arr.length; i += 1) {
+ if ("function" === predType && !0 == !!pred(arr[i], i, arr)) return i;
+ if ("object" === predType && contains(arr[i], pred)) return i;
+ if (-1 !== [ "string", "number", "boolean" ].indexOf(predType)) return arr.indexOf(pred);
+ }
+ return -1;
+ }
+ function find(arr, pred) {
+ var index = findIndex(arr, pred);
+ return index > -1 ? arr[index] : void 0;
+ }
+ function createChainedFunction() {
+ for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) funcs[_key] = arguments[_key];
+ return funcs.filter(function(func) {
+ return null != func;
+ }).reduce(function(acc, func) {
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)("function" == typeof func, "Material-UI: invalid Argument Type, must only provide functions, undefined, or null."),
+ function() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2];
+ acc.apply(this, args), func.apply(this, args);
+ };
+ }, function() {});
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _typeof2 = __webpack_require__(100), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys);
+ exports.capitalizeFirstLetter = capitalizeFirstLetter, exports.contains = contains,
+ exports.findIndex = findIndex, exports.find = find, exports.createChainedFunction = createChainedFunction;
+ var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ function getNative(object, key) {
+ var value = getValue(object, key);
+ return baseIsNative(value) ? value : void 0;
+ }
+ var baseIsNative = __webpack_require__(562), getValue = __webpack_require__(565);
+ module.exports = getNative;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return function() {
+ return x;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__ = __webpack_require__(686), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__ = __webpack_require__(184), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), BREAKING_SPACES = /[ \f\n\r\t\v\u2028\u2029]+/, calculateWordWidths = function(props) {
+ try {
+ return {
+ wordsWithComputedWidth: (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES)).map(function(word) {
+ return {
+ word: word,
+ width: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(word, props.style).width
+ };
+ }),
+ spaceWidth: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(" ", props.style).width
+ };
+ } catch (e) {
+ return null;
+ }
+ }, Text = (_temp2 = _class = function(_Component) {
+ function Text() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Text);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Text.__proto__ || Object.getPrototypeOf(Text)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ wordsByLines: []
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Text, _Component), _createClass(Text, [ {
+ key: "componentWillMount",
+ value: function() {
+ this.updateWordsByLines(this.props, !0);
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var needCalculate = this.props.children !== nextProps.children || this.props.style !== nextProps.style;
+ this.updateWordsByLines(nextProps, needCalculate);
+ }
+ }, {
+ key: "updateWordsByLines",
+ value: function(props, needCalculate) {
+ if (!props.width && !props.scaleToFit || Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)()) this.updateWordsWithoutCalculate(props); else {
+ if (needCalculate) {
+ var wordWidths = calculateWordWidths(props);
+ if (!wordWidths) return void this.updateWordsWithoutCalculate(props);
+ var wordsWithComputedWidth = wordWidths.wordsWithComputedWidth, spaceWidth = wordWidths.spaceWidth;
+ this.wordsWithComputedWidth = wordsWithComputedWidth, this.spaceWidth = spaceWidth;
+ }
+ var wordsByLines = this.calculateWordsByLines(this.wordsWithComputedWidth, this.spaceWidth, props.width);
+ this.setState({
+ wordsByLines: wordsByLines
+ });
+ }
+ }
+ }, {
+ key: "updateWordsWithoutCalculate",
+ value: function(props) {
+ var words = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES);
+ this.setState({
+ wordsByLines: [ {
+ words: words
+ } ]
+ });
+ }
+ }, {
+ key: "calculateWordsByLines",
+ value: function(wordsWithComputedWidth, spaceWidth, lineWidth) {
+ var scaleToFit = this.props.scaleToFit;
+ return wordsWithComputedWidth.reduce(function(result, _ref2) {
+ var word = _ref2.word, width = _ref2.width, currentLine = result[result.length - 1];
+ if (currentLine && (null == lineWidth || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) currentLine.words.push(word),
+ currentLine.width += width + spaceWidth; else {
+ var newLine = {
+ words: [ word ],
+ width: width
+ };
+ result.push(newLine);
+ }
+ return result;
+ }, []);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props = this.props, dx = _props.dx, dy = _props.dy, textAnchor = _props.textAnchor, verticalAnchor = _props.verticalAnchor, scaleToFit = _props.scaleToFit, angle = _props.angle, lineHeight = _props.lineHeight, capHeight = _props.capHeight, className = _props.className, textProps = _objectWithoutProperties(_props, [ "dx", "dy", "textAnchor", "verticalAnchor", "scaleToFit", "angle", "lineHeight", "capHeight", "className" ]), wordsByLines = this.state.wordsByLines;
+ if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.f)(textProps.x) || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.f)(textProps.y)) return null;
+ var x = textProps.x + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(dx) ? dx : 0), y = textProps.y + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(dy) ? dy : 0), startDy = void 0;
+ switch (verticalAnchor) {
+ case "start":
+ startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + capHeight + ")");
+ break;
+
+ case "middle":
+ startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) / 2 + " * -" + lineHeight + " + (" + capHeight + " / 2))");
+ break;
+
+ default:
+ startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) + " * -" + lineHeight + ")");
+ }
+ var transforms = [];
+ if (scaleToFit) {
+ var lineWidth = wordsByLines[0].width;
+ transforms.push("scale(" + this.props.width / lineWidth + ")");
+ }
+ return angle && transforms.push("rotate(" + angle + ", " + x + ", " + y + ")"),
+ transforms.length && (textProps.transform = transforms.join(" ")), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("text", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(textProps), {
+ x: x,
+ y: y,
+ className: __WEBPACK_IMPORTED_MODULE_4_classnames___default()("recharts-text", className),
+ textAnchor: textAnchor
+ }), wordsByLines.map(function(line, index) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("tspan", {
+ x: x,
+ dy: 0 === index ? startDy : lineHeight,
+ key: index
+ }, line.words.join(" "));
+ }));
+ }
+ } ]), Text;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, {
+ scaleToFit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ angle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ textAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]),
+ verticalAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end" ]),
+ style: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object
+ }), _class.defaultProps = {
+ x: 0,
+ y: 0,
+ lineHeight: "1em",
+ capHeight: "0.71em",
+ scaleToFit: !1,
+ textAnchor: "start",
+ verticalAnchor: "end"
+ }, _temp2);
+ __webpack_exports__.a = Text;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return map;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return slice;
+ });
+ var array = Array.prototype, map = array.map, slice = array.slice;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Dot = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Dot() {
+ return _classCallCheck(this, Dot), _possibleConstructorReturn(this, (Dot.__proto__ || Object.getPrototypeOf(Dot)).apply(this, arguments));
+ }
+ return _inherits(Dot, _Component), _createClass(Dot, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, cx = _props.cx, cy = _props.cy, r = _props.r, className = _props.className, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-dot", className);
+ return cx === +cx && cy === +cy && r === +r ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("circle", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props, null, !0), {
+ className: layerClass,
+ cx: cx,
+ cy: cy,
+ r: r
+ })) : null;
+ }
+ } ]), Dot;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Dot", _class2.propTypes = {
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ r: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Dot;
+}, function(module, exports, __webpack_require__) {
+ var IObject = __webpack_require__(135), defined = __webpack_require__(137);
+ module.exports = function(it) {
+ return IObject(defined(it));
+ };
+}, function(module, exports, __webpack_require__) {
+ var defined = __webpack_require__(137);
+ module.exports = function(it) {
+ return Object(defined(it));
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _toCss = __webpack_require__(153), _toCss2 = _interopRequireDefault(_toCss), _toCssValue = __webpack_require__(105), _toCssValue2 = _interopRequireDefault(_toCssValue), StyleRule = function() {
+ function StyleRule(key, style, options) {
+ _classCallCheck(this, StyleRule), this.type = "style", this.isProcessed = !1;
+ var sheet = options.sheet, Renderer = options.Renderer, selector = options.selector;
+ this.key = key, this.options = options, this.style = style, selector && (this.selectorText = selector),
+ this.renderer = sheet ? sheet.renderer : new Renderer();
+ }
+ return _createClass(StyleRule, [ {
+ key: "prop",
+ value: function(name, nextValue) {
+ if (null != nextValue) {
+ if (this.style[name] !== nextValue) if (nextValue = this.options.jss.plugins.onChangeValue(nextValue, name, this),
+ this.style[name] = nextValue, this.renderable) this.renderer.setStyle(this.renderable, name, nextValue); else {
+ var sheet = this.options.sheet;
+ sheet && sheet.attached && (0, _warning2.default)(!1, 'Rule is not linked. Missing sheet option "link: true".');
+ }
+ return this;
+ }
+ return this.style[name];
+ }
+ }, {
+ key: "applyTo",
+ value: function(renderable) {
+ var json = this.toJSON();
+ for (var prop in json) this.renderer.setStyle(renderable, prop, json[prop]);
+ return this;
+ }
+ }, {
+ key: "toJSON",
+ value: function() {
+ var json = {};
+ for (var prop in this.style) {
+ var value = this.style[prop];
+ "object" !== (void 0 === value ? "undefined" : _typeof(value)) ? json[prop] = value : Array.isArray(value) && (json[prop] = (0,
+ _toCssValue2.default)(value));
+ }
+ return json;
+ }
+ }, {
+ key: "toString",
+ value: function(options) {
+ var sheet = this.options.sheet, link = !!sheet && sheet.options.link, opts = link ? _extends({}, options, {
+ allowEmpty: !0
+ }) : options;
+ return (0, _toCss2.default)(this.selector, this.style, opts);
+ }
+ }, {
+ key: "selector",
+ set: function(selector) {
+ if (selector !== this.selectorText && (this.selectorText = selector, this.renderable)) {
+ if (!this.renderer.setSelector(this.renderable, selector) && this.renderable) {
+ var renderable = this.renderer.replaceRule(this.renderable, this);
+ renderable && (this.renderable = renderable);
+ }
+ }
+ },
+ get: function() {
+ return this.selectorText;
+ }
+ } ]), StyleRule;
+ }();
+ exports.default = StyleRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, menuSkeletons = [ {
+ id: "home",
+ menu: {
+ title: "Home",
+ icon: "home"
+ }
+ }, {
+ id: "chain",
+ menu: {
+ title: "Chain",
+ icon: "link"
+ }
+ }, {
+ id: "txpool",
+ menu: {
+ title: "TxPool",
+ icon: "credit-card"
+ }
+ }, {
+ id: "network",
+ menu: {
+ title: "Network",
+ icon: "globe"
+ }
+ }, {
+ id: "system",
+ menu: {
+ title: "System",
+ icon: "tachometer"
+ }
+ }, {
+ id: "logs",
+ menu: {
+ title: "Logs",
+ icon: "list"
+ }
+ } ];
+ exports.MENU = new Map(menuSkeletons.map(function(_ref) {
+ var id = _ref.id, menu = _ref.menu;
+ return [ id, _extends({
+ id: id
+ }, menu) ];
+ })), exports.DURATION = 200, exports.styles = {
+ light: {
+ color: "rgba(255, 255, 255, 0.54)"
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ function isSymbol(value) {
+ return "symbol" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag;
+ }
+ var baseGetTag = __webpack_require__(42), isObjectLike = __webpack_require__(36), symbolTag = "[object Symbol]";
+ module.exports = isSymbol;
+}, function(module, exports) {
+ function identity(value) {
+ return value;
+ }
+ module.exports = identity;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_3_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_smooth__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), getRectangePath = function(x, y, width, height, radius) {
+ var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2), sign = height >= 0 ? 1 : -1, clockWise = height >= 0 ? 1 : 0, path = void 0;
+ if (maxRadius > 0 && radius instanceof Array) {
+ for (var newRadius = [], i = 0; i < 4; i++) newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i];
+ path = "M" + x + "," + (y + sign * newRadius[0]), newRadius[0] > 0 && (path += "A " + newRadius[0] + "," + newRadius[0] + ",0,0," + clockWise + "," + (x + newRadius[0]) + "," + y),
+ path += "L " + (x + width - newRadius[1]) + "," + y, newRadius[1] > 0 && (path += "A " + newRadius[1] + "," + newRadius[1] + ",0,0," + clockWise + ",\n " + (x + width) + "," + (y + sign * newRadius[1])),
+ path += "L " + (x + width) + "," + (y + height - sign * newRadius[2]), newRadius[2] > 0 && (path += "A " + newRadius[2] + "," + newRadius[2] + ",0,0," + clockWise + ",\n " + (x + width - newRadius[2]) + "," + (y + height)),
+ path += "L " + (x + newRadius[3]) + "," + (y + height), newRadius[3] > 0 && (path += "A " + newRadius[3] + "," + newRadius[3] + ",0,0," + clockWise + ",\n " + x + "," + (y + height - sign * newRadius[3])),
+ path += "Z";
+ } else if (maxRadius > 0 && radius === +radius && radius > 0) {
+ var _newRadius = Math.min(maxRadius, radius);
+ path = "M " + x + "," + (y + sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + _newRadius) + "," + y + "\n L " + (x + width - _newRadius) + "," + y + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width) + "," + (y + sign * _newRadius) + "\n L " + (x + width) + "," + (y + height - sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width - _newRadius) + "," + (y + height) + "\n L " + (x + _newRadius) + "," + (y + height) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + x + "," + (y + height - sign * _newRadius) + " Z";
+ } else path = "M " + x + "," + y + " h " + width + " v " + height + " h " + -width + " Z";
+ return path;
+ }, Rectangle = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Rectangle() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Rectangle);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ totalLength: -1
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Rectangle, _Component), _createClass(Rectangle, [ {
+ key: "componentDidMount",
+ value: function() {
+ if (this.node && this.node.getTotalLength) try {
+ var totalLength = this.node.getTotalLength();
+ totalLength && this.setState({
+ totalLength: totalLength
+ });
+ } catch (err) {}
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this2 = this, _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, radius = _props.radius, className = _props.className, totalLength = this.state.totalLength, _props2 = this.props, animationEasing = _props2.animationEasing, animationDuration = _props2.animationDuration, animationBegin = _props2.animationBegin, isAnimationActive = _props2.isAnimationActive, isUpdateAnimationActive = _props2.isUpdateAnimationActive;
+ if (x !== +x || y !== +y || width !== +width || height !== +height || 0 === width || 0 === height) return null;
+ var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-rectangle", className);
+ return isUpdateAnimationActive ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, {
+ canBegin: totalLength > 0,
+ from: {
+ width: width,
+ height: height,
+ x: x,
+ y: y
+ },
+ to: {
+ width: width,
+ height: height,
+ x: x,
+ y: y
+ },
+ duration: animationDuration,
+ animationEasing: animationEasing,
+ isActive: isUpdateAnimationActive
+ }, function(_ref2) {
+ var currWidth = _ref2.width, currHeight = _ref2.height, currX = _ref2.x, currY = _ref2.y;
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, {
+ canBegin: totalLength > 0,
+ from: "0px " + (-1 === totalLength ? 1 : totalLength) + "px",
+ to: totalLength + "px 0px",
+ attributeName: "strokeDasharray",
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing
+ }, __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(_this2.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(_this2.props), {
+ className: layerClass,
+ d: getRectangePath(currX, currY, currWidth, currHeight, radius),
+ ref: function(node) {
+ _this2.node = node;
+ }
+ })));
+ }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), {
+ className: layerClass,
+ d: getRectangePath(x, y, width, height, radius)
+ }));
+ }
+ } ]), Rectangle;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Rectangle",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ radius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array ]),
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ])
+ }), _class2.defaultProps = {
+ x: 0,
+ y: 0,
+ width: 0,
+ height: 0,
+ radius: 0,
+ isAnimationActive: !1,
+ isUpdateAnimationActive: !1,
+ animationBegin: 0,
+ animationDuration: 1500,
+ animationEasing: "ease"
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Rectangle;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_d3_shape__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), CURVE_FACTORIES = {
+ curveBasisClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.c,
+ curveBasisOpen: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.d,
+ curveBasis: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.b,
+ curveLinearClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.f,
+ curveLinear: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e,
+ curveMonotoneX: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.g,
+ curveMonotoneY: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.h,
+ curveNatural: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.i,
+ curveStep: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.j,
+ curveStepAfter: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.k,
+ curveStepBefore: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.l
+ }, defined = function(p) {
+ return p.x === +p.x && p.y === +p.y;
+ }, getX = function(p) {
+ return p.x;
+ }, getY = function(p) {
+ return p.y;
+ }, getCurveFactory = function(type, layout) {
+ if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(type)) return type;
+ var name = "curve" + type.slice(0, 1).toUpperCase() + type.slice(1);
+ return "curveMonotone" === name && layout ? CURVE_FACTORIES[name + ("vertical" === layout ? "Y" : "X")] : CURVE_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e;
+ }, Curve = Object(__WEBPACK_IMPORTED_MODULE_6__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Curve() {
+ return _classCallCheck(this, Curve), _possibleConstructorReturn(this, (Curve.__proto__ || Object.getPrototypeOf(Curve)).apply(this, arguments));
+ }
+ return _inherits(Curve, _Component), _createClass(Curve, [ {
+ key: "getPath",
+ value: function() {
+ var _props = this.props, type = _props.type, points = _props.points, baseLine = _props.baseLine, layout = _props.layout, connectNulls = _props.connectNulls, curveFactory = getCurveFactory(type, layout), formatPoints = connectNulls ? points.filter(function(entry) {
+ return defined(entry);
+ }) : points, lineFunction = void 0;
+ if (__WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(baseLine)) {
+ var areaPoints = formatPoints.map(function(entry, index) {
+ return _extends({}, entry, {
+ base: baseLine[index]
+ });
+ });
+ return lineFunction = "vertical" === layout ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(function(d) {
+ return d.base.x;
+ }) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(function(d) {
+ return d.base.y;
+ }), lineFunction.defined(defined).curve(curveFactory), lineFunction(areaPoints);
+ }
+ return lineFunction = "vertical" === layout && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.m)().x(getX).y(getY),
+ lineFunction.defined(defined).curve(curveFactory), lineFunction(formatPoints);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, className = _props2.className, points = _props2.points, path = _props2.path, pathRef = _props2.pathRef;
+ if (!(points && points.length || path)) return null;
+ var realPath = points && points.length ? this.getPath() : path;
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props, null, !0), {
+ className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-curve", className),
+ d: realPath,
+ ref: pathRef
+ }));
+ }
+ } ]), Curve;
+ }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Curve",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, {
+ className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ type: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ layout: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "horizontal", "vertical" ]),
+ baseLine: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]),
+ points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object),
+ connectNulls: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ path: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ pathRef: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func
+ }), _class2.defaultProps = {
+ type: "linear",
+ points: [],
+ connectNulls: !1
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Curve;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__),
+ __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), XAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function XAxis() {
+ return _classCallCheck(this, XAxis), _possibleConstructorReturn(this, (XAxis.__proto__ || Object.getPrototypeOf(XAxis)).apply(this, arguments));
+ }
+ return _inherits(XAxis, _Component), _createClass(XAxis, [ {
+ key: "render",
+ value: function() {
+ return null;
+ }
+ } ]), XAxis;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "XAxis",
+ _class2.propTypes = {
+ allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])),
+ dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "top", "bottom" ]),
+ type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]),
+ ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array,
+ tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
+ padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
+ left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ right: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number
+ }),
+ allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),
+ tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]),
+ axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),
+ tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),
+ minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]),
+ reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool
+ }, _class2.defaultProps = {
+ allowDecimals: !0,
+ hide: !1,
+ orientation: "bottom",
+ width: 0,
+ height: 30,
+ mirror: !1,
+ xAxisId: 0,
+ tickCount: 5,
+ type: "category",
+ domain: [ 0, "auto" ],
+ padding: {
+ left: 0,
+ right: 0
+ },
+ allowDataOverflow: !1,
+ scale: "auto",
+ reversed: !1,
+ allowDuplicatedCategory: !0
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = XAxis;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__),
+ __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), YAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function YAxis() {
+ return _classCallCheck(this, YAxis), _possibleConstructorReturn(this, (YAxis.__proto__ || Object.getPrototypeOf(YAxis)).apply(this, arguments));
+ }
+ return _inherits(YAxis, _Component), _createClass(YAxis, [ {
+ key: "render",
+ value: function() {
+ return null;
+ }
+ } ]), YAxis;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "YAxis",
+ _class2.propTypes = {
+ allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])),
+ dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),
+ ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array,
+ tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "left", "right" ]),
+ type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]),
+ padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
+ top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ bottom: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number
+ }),
+ allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,
+ scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),
+ tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]),
+ axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),
+ tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),
+ minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]),
+ reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool
+ }, _class2.defaultProps = {
+ allowDuplicatedCategory: !0,
+ allowDecimals: !0,
+ hide: !1,
+ orientation: "left",
+ width: 60,
+ height: 0,
+ mirror: !1,
+ yAxisId: 0,
+ tickCount: 5,
+ type: "number",
+ domain: [ 0, "auto" ],
+ padding: {
+ top: 0,
+ bottom: 0
+ },
+ allowDataOverflow: !1,
+ scale: "auto",
+ reversed: !1
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = YAxis;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function toObject(val) {
+ if (null === val || void 0 === val) throw new TypeError("Object.assign cannot be called with null or undefined");
+ return Object(val);
+ }
+ var getOwnPropertySymbols = Object.getOwnPropertySymbols, hasOwnProperty = Object.prototype.hasOwnProperty, propIsEnumerable = Object.prototype.propertyIsEnumerable;
+ module.exports = function() {
+ try {
+ if (!Object.assign) return !1;
+ var test1 = new String("abc");
+ if (test1[5] = "de", "5" === Object.getOwnPropertyNames(test1)[0]) return !1;
+ for (var test2 = {}, i = 0; i < 10; i++) test2["_" + String.fromCharCode(i)] = i;
+ if ("0123456789" !== Object.getOwnPropertyNames(test2).map(function(n) {
+ return test2[n];
+ }).join("")) return !1;
+ var test3 = {};
+ return "abcdefghijklmnopqrst".split("").forEach(function(letter) {
+ test3[letter] = letter;
+ }), "abcdefghijklmnopqrst" === Object.keys(Object.assign({}, test3)).join("");
+ } catch (err) {
+ return !1;
+ }
+ }() ? Object.assign : function(target, source) {
+ for (var from, symbols, to = toObject(target), s = 1; s < arguments.length; s++) {
+ from = Object(arguments[s]);
+ for (var key in from) hasOwnProperty.call(from, key) && (to[key] = from[key]);
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) propIsEnumerable.call(from, symbols[i]) && (to[symbols[i]] = from[symbols[i]]);
+ }
+ }
+ return to;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function invariant(condition, format, a, b, c, d, e, f) {
+ if (validateFormat(format), !condition) {
+ var error;
+ if (void 0 === format) error = new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings."); else {
+ var args = [ a, b, c, d, e, f ], argIndex = 0;
+ error = new Error(format.replace(/%s/g, function() {
+ return args[argIndex++];
+ })), error.name = "Invariant Violation";
+ }
+ throw error.framesToPop = 1, error;
+ }
+ }
+ var validateFormat = function(format) {};
+ "production" !== process.env.NODE_ENV && (validateFormat = function(format) {
+ if (void 0 === format) throw new Error("invariant requires an error message argument");
+ }), module.exports = invariant;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports) {
+ module.exports = function(bitmap, value) {
+ return {
+ enumerable: !(1 & bitmap),
+ configurable: !(2 & bitmap),
+ writable: !(4 & bitmap),
+ value: value
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var $keys = __webpack_require__(209), enumBugKeys = __webpack_require__(141);
+ module.exports = Object.keys || function(O) {
+ return $keys(O, enumBugKeys);
+ };
+}, function(module, exports) {
+ module.exports = {};
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function createBreakpoints(breakpoints) {
+ function up(key) {
+ return "@media (min-width:" + ("number" == typeof values[key] ? values[key] : key) + unit + ")";
+ }
+ function down(key) {
+ var endIndex = keys.indexOf(key) + 1, upperbound = values[keys[endIndex]];
+ return endIndex === keys.length ? up("xs") : "@media (max-width:" + (("number" == typeof upperbound && endIndex > 0 ? upperbound : key) - step / 100) + unit + ")";
+ }
+ function between(start, end) {
+ var endIndex = keys.indexOf(end) + 1;
+ return endIndex === keys.length ? up(start) : "@media (min-width:" + values[start] + unit + ") and (max-width:" + (values[keys[endIndex]] - step / 100) + unit + ")";
+ }
+ function only(key) {
+ return between(key, key);
+ }
+ function width(key) {
+ return values[key];
+ }
+ var _breakpoints$values = breakpoints.values, values = void 0 === _breakpoints$values ? {
+ xs: 0,
+ sm: 600,
+ md: 960,
+ lg: 1280,
+ xl: 1920
+ } : _breakpoints$values, _breakpoints$unit = breakpoints.unit, unit = void 0 === _breakpoints$unit ? "px" : _breakpoints$unit, _breakpoints$step = breakpoints.step, step = void 0 === _breakpoints$step ? 5 : _breakpoints$step, other = (0,
+ _objectWithoutProperties3.default)(breakpoints, [ "values", "unit", "step" ]);
+ return (0, _extends3.default)({
+ keys: keys,
+ values: values,
+ up: up,
+ down: down,
+ between: between,
+ only: only,
+ width: width
+ }, other);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.keys = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
+ exports.default = createBreakpoints;
+ var keys = exports.keys = [ "xs", "sm", "md", "lg", "xl" ];
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _getDisplayName = __webpack_require__(226), _getDisplayName2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_getDisplayName), wrapDisplayName = function(BaseComponent, hocName) {
+ return hocName + "(" + (0, _getDisplayName2.default)(BaseComponent) + ")";
+ };
+ exports.default = wrapDisplayName;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _createRule = __webpack_require__(106), _createRule2 = _interopRequireDefault(_createRule), _linkRule = __webpack_require__(231), _linkRule2 = _interopRequireDefault(_linkRule), _StyleRule = __webpack_require__(60), _StyleRule2 = _interopRequireDefault(_StyleRule), _escape = __webpack_require__(424), _escape2 = _interopRequireDefault(_escape), RuleList = function() {
+ function RuleList(options) {
+ _classCallCheck(this, RuleList), this.map = {}, this.raw = {}, this.index = [],
+ this.options = options, this.classes = options.classes;
+ }
+ return _createClass(RuleList, [ {
+ key: "add",
+ value: function(name, decl, options) {
+ var _options = this.options, parent = _options.parent, sheet = _options.sheet, jss = _options.jss, Renderer = _options.Renderer, generateClassName = _options.generateClassName;
+ options = _extends({
+ classes: this.classes,
+ parent: parent,
+ sheet: sheet,
+ jss: jss,
+ Renderer: Renderer,
+ generateClassName: generateClassName
+ }, options), !options.selector && this.classes[name] && (options.selector = "." + (0,
+ _escape2.default)(this.classes[name])), this.raw[name] = decl;
+ var rule = (0, _createRule2.default)(name, decl, options), className = void 0;
+ !options.selector && rule instanceof _StyleRule2.default && (className = generateClassName(rule, sheet),
+ rule.selector = "." + (0, _escape2.default)(className)), this.register(rule, className);
+ var index = void 0 === options.index ? this.index.length : options.index;
+ return this.index.splice(index, 0, rule), rule;
+ }
+ }, {
+ key: "get",
+ value: function(name) {
+ return this.map[name];
+ }
+ }, {
+ key: "remove",
+ value: function(rule) {
+ this.unregister(rule), this.index.splice(this.indexOf(rule), 1);
+ }
+ }, {
+ key: "indexOf",
+ value: function(rule) {
+ return this.index.indexOf(rule);
+ }
+ }, {
+ key: "process",
+ value: function() {
+ var plugins = this.options.jss.plugins;
+ this.index.slice(0).forEach(plugins.onProcessRule, plugins);
+ }
+ }, {
+ key: "register",
+ value: function(rule, className) {
+ this.map[rule.key] = rule, rule instanceof _StyleRule2.default && (this.map[rule.selector] = rule,
+ className && (this.classes[rule.key] = className));
+ }
+ }, {
+ key: "unregister",
+ value: function(rule) {
+ delete this.map[rule.key], rule instanceof _StyleRule2.default && (delete this.map[rule.selector],
+ delete this.classes[rule.key]);
+ }
+ }, {
+ key: "update",
+ value: function(name, data) {
+ var _options2 = this.options, plugins = _options2.jss.plugins, sheet = _options2.sheet;
+ if ("string" == typeof name) return void plugins.onUpdate(data, this.get(name), sheet);
+ for (var index = 0; index < this.index.length; index++) plugins.onUpdate(name, this.index[index], sheet);
+ }
+ }, {
+ key: "link",
+ value: function(cssRules) {
+ for (var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index), i = 0; i < cssRules.length; i++) {
+ var cssRule = cssRules[i], _key = this.options.sheet.renderer.getKey(cssRule);
+ map[_key] && (_key = map[_key]);
+ var rule = this.map[_key];
+ rule && (0, _linkRule2.default)(rule, cssRule);
+ }
+ }
+ }, {
+ key: "toString",
+ value: function(options) {
+ for (var str = "", sheet = this.options.sheet, link = !!sheet && sheet.options.link, index = 0; index < this.index.length; index++) {
+ var rule = this.index[index], css = rule.toString(options);
+ (css || link) && (str && (str += "\n"), str += css);
+ }
+ return str;
+ }
+ } ]), RuleList;
+ }();
+ exports.default = RuleList;
+}, function(module, exports, __webpack_require__) {
+ var root = __webpack_require__(32), Symbol = root.Symbol;
+ module.exports = Symbol;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function Surface(props) {
+ var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, others = _objectWithoutProperties(props, [ "children", "width", "height", "viewBox", "className", "style" ]), svgView = viewBox || {
+ width: width,
+ height: height,
+ x: 0,
+ y: 0
+ }, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-surface", className), attrs = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others);
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("svg", _extends({}, attrs, {
+ className: layerClass,
+ width: width,
+ height: height,
+ style: style,
+ viewBox: svgView.x + " " + svgView.y + " " + svgView.width + " " + svgView.height,
+ version: "1.1"
+ }), children);
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, propTypes = {
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired,
+ height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired,
+ viewBox: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number
+ }),
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,
+ children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ])
+ };
+ Surface.propTypes = propTypes, __webpack_exports__.a = Surface;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__src_path__ = __webpack_require__(584);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_path__.a;
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function acos(x) {
+ return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
+ }
+ function asin(x) {
+ return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return abs;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return atan2;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return cos;
+ }), __webpack_require__.d(__webpack_exports__, "h", function() {
+ return max;
+ }), __webpack_require__.d(__webpack_exports__, "i", function() {
+ return min;
+ }), __webpack_require__.d(__webpack_exports__, "k", function() {
+ return sin;
+ }), __webpack_require__.d(__webpack_exports__, "l", function() {
+ return sqrt;
+ }), __webpack_require__.d(__webpack_exports__, "f", function() {
+ return epsilon;
+ }), __webpack_require__.d(__webpack_exports__, "j", function() {
+ return pi;
+ }), __webpack_require__.d(__webpack_exports__, "g", function() {
+ return halfPi;
+ }), __webpack_require__.d(__webpack_exports__, "m", function() {
+ return tau;
+ }), __webpack_exports__.b = acos, __webpack_exports__.c = asin;
+ var abs = Math.abs, atan2 = Math.atan2, cos = Math.cos, max = Math.max, min = Math.min, sin = Math.sin, sqrt = Math.sqrt, epsilon = 1e-12, pi = Math.PI, halfPi = pi / 2, tau = 2 * pi;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(series, order) {
+ if ((n = series.length) > 1) for (var j, s0, n, i = 1, s1 = series[order[0]], m = s1.length; i < n; ++i) for (s0 = s1,
+ s1 = series[order[i]], j = 0; j < m; ++j) s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(series) {
+ for (var n = series.length, o = new Array(n); --n >= 0; ) o[n] = n;
+ return o;
+ };
+}, function(module, exports, __webpack_require__) {
+ function isArrayLike(value) {
+ return null != value && isLength(value.length) && !isFunction(value);
+ }
+ var isFunction = __webpack_require__(8), isLength = __webpack_require__(182);
+ module.exports = isArrayLike;
+}, function(module, exports, __webpack_require__) {
+ function baseIteratee(value) {
+ return "function" == typeof value ? value : null == value ? identity : "object" == typeof value ? isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value) : property(value);
+ }
+ var baseMatches = __webpack_require__(669), baseMatchesProperty = __webpack_require__(672), identity = __webpack_require__(63), isArray = __webpack_require__(12), property = __webpack_require__(676);
+ module.exports = baseIteratee;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Cell() {
+ return null;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__),
+ __webpack_require__(4)), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ };
+ Cell.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__.c),
+ Cell.displayName = "Cell", __webpack_exports__.a = Cell;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return null === x ? NaN : +x;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function linearish(scale) {
+ var domain = scale.domain;
+ return scale.ticks = function(count) {
+ var d = domain();
+ return Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(d[0], d[d.length - 1], null == count ? 10 : count);
+ }, scale.tickFormat = function(count, specifier) {
+ return Object(__WEBPACK_IMPORTED_MODULE_3__tickFormat__.a)(domain(), count, specifier);
+ }, scale.nice = function(count) {
+ null == count && (count = 10);
+ var step, d = domain(), i0 = 0, i1 = d.length - 1, start = d[i0], stop = d[i1];
+ return stop < start && (step = start, start = stop, stop = step, step = i0, i0 = i1,
+ i1 = step), step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count),
+ step > 0 ? (start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step,
+ step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)) : step < 0 && (start = Math.ceil(start * step) / step,
+ stop = Math.floor(stop * step) / step, step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)),
+ step > 0 ? (d[i0] = Math.floor(start / step) * step, d[i1] = Math.ceil(stop / step) * step,
+ domain(d)) : step < 0 && (d[i0] = Math.ceil(start * step) / step, d[i1] = Math.floor(stop * step) / step,
+ domain(d)), scale;
+ }, scale;
+ }
+ function linear() {
+ var scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(__WEBPACK_IMPORTED_MODULE_2__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c);
+ return scale.copy = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, linear());
+ }, linearish(scale);
+ }
+ __webpack_exports__.b = linearish, __webpack_exports__.a = linear;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(126), __WEBPACK_IMPORTED_MODULE_3__tickFormat__ = __webpack_require__(742);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__src_value__ = __webpack_require__(187);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_value__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_5__src_number__ = (__webpack_require__(305), __webpack_require__(190),
+ __webpack_require__(303), __webpack_require__(306), __webpack_require__(125));
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return __WEBPACK_IMPORTED_MODULE_5__src_number__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_7__src_round__ = (__webpack_require__(307), __webpack_require__(732));
+ __webpack_require__.d(__webpack_exports__, "d", function() {
+ return __WEBPACK_IMPORTED_MODULE_7__src_round__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = (__webpack_require__(308), __webpack_require__(733),
+ __webpack_require__(736), __webpack_require__(302), __webpack_require__(737), __webpack_require__(738),
+ __webpack_require__(739), __webpack_require__(740));
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a;
+ });
+ __webpack_require__(741);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function linear(a, d) {
+ return function(t) {
+ return a + t * d;
+ };
+ }
+ function exponential(a, b, y) {
+ return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
+ return Math.pow(a + t * b, y);
+ };
+ }
+ function hue(a, b) {
+ var d = b - a;
+ return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a);
+ }
+ function gamma(y) {
+ return 1 == (y = +y) ? nogamma : function(a, b) {
+ return b - a ? exponential(a, b, y) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a);
+ };
+ }
+ function nogamma(a, b) {
+ var d = b - a;
+ return d ? linear(a, d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a);
+ }
+ __webpack_exports__.c = hue, __webpack_exports__.b = gamma, __webpack_exports__.a = nogamma;
+ var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(304);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(s) {
+ return s.match(/.{6}/g).map(function(x) {
+ return "#" + x;
+ });
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ErrorBar = (_temp = _class = function(_Component) {
+ function ErrorBar() {
+ return _classCallCheck(this, ErrorBar), _possibleConstructorReturn(this, (ErrorBar.__proto__ || Object.getPrototypeOf(ErrorBar)).apply(this, arguments));
+ }
+ return _inherits(ErrorBar, _Component), _createClass(ErrorBar, [ {
+ key: "renderErrorBars",
+ value: function() {
+ var _props = this.props, offset = _props.offset, layout = _props.layout, width = _props.width, dataKey = _props.dataKey, data = _props.data, dataPointFormatter = _props.dataPointFormatter, xAxis = _props.xAxis, yAxis = _props.yAxis, others = _objectWithoutProperties(_props, [ "offset", "layout", "width", "dataKey", "data", "dataPointFormatter", "xAxis", "yAxis" ]), props = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others);
+ return data.map(function(entry, i) {
+ var _dataPointFormatter = dataPointFormatter(entry, dataKey), x = _dataPointFormatter.x, y = _dataPointFormatter.y, value = _dataPointFormatter.value, errorVal = _dataPointFormatter.errorVal;
+ if (!errorVal) return null;
+ var xMid = void 0, yMid = void 0, xMin = void 0, yMin = void 0, xMax = void 0, yMax = void 0, scale = void 0, coordsTop = void 0, coordsMid = void 0, coordsBot = void 0, lowBound = void 0, highBound = void 0;
+ return Array.isArray(errorVal) ? (lowBound = errorVal[0], highBound = errorVal[1]) : (lowBound = errorVal,
+ highBound = errorVal), "vertical" === layout ? (scale = xAxis.scale, xMid = value,
+ yMid = y + offset, xMin = scale(xMid - lowBound), yMin = yMid + width, xMax = scale(xMid + highBound),
+ yMax = yMid - width, coordsTop = {
+ x1: xMax,
+ y1: yMin,
+ x2: xMax,
+ y2: yMax
+ }, coordsMid = {
+ x1: xMin,
+ y1: yMid,
+ x2: xMax,
+ y2: yMid
+ }, coordsBot = {
+ x1: xMin,
+ y1: yMin,
+ x2: xMin,
+ y2: yMax
+ }) : "horizontal" === layout && (scale = yAxis.scale, xMid = x + offset, yMid = value,
+ xMin = xMid - width, xMax = xMid + width, yMin = scale(yMid - lowBound), yMax = scale(yMid + highBound),
+ coordsTop = {
+ x1: xMin,
+ y1: yMax,
+ x2: xMax,
+ y2: yMax
+ }, coordsMid = {
+ x1: xMid,
+ y1: yMin,
+ x2: xMid,
+ y2: yMax
+ }, coordsBot = {
+ x1: xMin,
+ y1: yMin,
+ x2: xMax,
+ y2: yMin
+ }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, _extends({
+ className: "recharts-errorBar",
+ key: i
+ }, props), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsTop), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsMid), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsBot));
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, {
+ className: "recharts-errorBars"
+ }, this.renderErrorBars());
+ }
+ } ]), ErrorBar;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class.propTypes = {
+ dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]).isRequired,
+ data: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array,
+ xAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,
+ yAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,
+ layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ dataPointFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
+ stroke: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ strokeWidth: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ offset: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number
+ }, _class.defaultProps = {
+ stroke: "black",
+ strokeWidth: 1.5,
+ width: 5,
+ offset: 0,
+ layout: "horizontal"
+ }, _temp);
+ __webpack_exports__.a = ErrorBar;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return formatAxisMap;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) {
+ var width = props.width, height = props.height, layout = props.layout, ids = Object.keys(axisMap), steps = {
+ left: offset.left,
+ leftMirror: offset.left,
+ right: width - offset.right,
+ rightMirror: width - offset.right,
+ top: offset.top,
+ topMirror: offset.top,
+ bottom: height - offset.bottom,
+ bottomMirror: height - offset.bottom
+ };
+ return ids.reduce(function(result, id) {
+ var axis = axisMap[id], orientation = axis.orientation, domain = axis.domain, _axis$padding = axis.padding, padding = void 0 === _axis$padding ? {} : _axis$padding, mirror = axis.mirror, reversed = axis.reversed, offsetKey = orientation + (mirror ? "Mirror" : ""), range = void 0, x = void 0, y = void 0, needSpace = void 0;
+ range = "xAxis" === axisType ? [ offset.left + (padding.left || 0), offset.left + offset.width - (padding.right || 0) ] : "yAxis" === axisType ? "horizontal" === layout ? [ offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0) ] : [ offset.top + (padding.top || 0), offset.top + offset.height - (padding.bottom || 0) ] : axis.range,
+ reversed && (range = [ range[1], range[0] ]);
+ var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.A)(axis, chartName), scale = _parseScale.scale, realScaleType = _parseScale.realScaleType;
+ scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.c)(scale);
+ var ticks = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.v)(scale, _extends({}, axis, {
+ realScaleType: realScaleType
+ }));
+ "xAxis" === axisType ? (needSpace = "top" === orientation && !mirror || "bottom" === orientation && mirror,
+ x = offset.left, y = steps[offsetKey] - needSpace * axis.height) : "yAxis" === axisType && (needSpace = "left" === orientation && !mirror || "right" === orientation && mirror,
+ x = steps[offsetKey] - needSpace * axis.width, y = offset.top);
+ var finalAxis = _extends({}, axis, ticks, {
+ realScaleType: realScaleType,
+ x: x,
+ y: y,
+ scale: scale,
+ width: "xAxis" === axisType ? offset.width : axis.width,
+ height: "yAxis" === axisType ? offset.height : axis.height
+ });
+ return finalAxis.bandSize = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.g)(finalAxis, ticks),
+ axis.hide || "xAxis" !== axisType ? axis.hide || (steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width) : steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height,
+ _extends({}, result, _defineProperty({}, id, finalAxis));
+ }, {});
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ var emptyObject = {};
+ "production" !== process.env.NODE_ENV && Object.freeze(emptyObject), module.exports = emptyObject;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ var emptyFunction = __webpack_require__(39), warning = emptyFunction;
+ if ("production" !== process.env.NODE_ENV) {
+ var printWarning = function(format) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];
+ var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ "undefined" != typeof console && console.error(message);
+ try {
+ throw new Error(message);
+ } catch (x) {}
+ };
+ warning = function(condition, format) {
+ if (void 0 === format) throw new Error("` + "`")) + (`warning(condition, format, ...args)` + ("`" + ` requires a warning message argument");
+ if (0 !== format.indexOf("Failed Composite propType: ") && !condition) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];
+ printWarning.apply(void 0, [ format ].concat(args));
+ }
+ };
+ }
+ module.exports = warning;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function checkDCE() {
+ if ("undefined" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE) {
+ if ("production" !== process.env.NODE_ENV) throw new Error("^_^");
+ try {
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ }
+ "production" === process.env.NODE_ENV ? (checkDCE(), module.exports = __webpack_require__(334)) : module.exports = __webpack_require__(337);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function is(x, y) {
+ return x === y ? 0 !== x || 0 !== y || 1 / x == 1 / y : x !== x && y !== y;
+ }
+ function shallowEqual(objA, objB) {
+ if (is(objA, objB)) return !0;
+ if ("object" != typeof objA || null === objA || "object" != typeof objB || null === objB) return !1;
+ var keysA = Object.keys(objA), keysB = Object.keys(objB);
+ if (keysA.length !== keysB.length) return !1;
+ for (var i = 0; i < keysA.length; i++) if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) return !1;
+ return !0;
+ }
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ module.exports = shallowEqual;
+}, function(module, exports, __webpack_require__) {
+ var toInteger = __webpack_require__(138), min = Math.min;
+ module.exports = function(it) {
+ return it > 0 ? min(toInteger(it), 9007199254740991) : 0;
+ };
+}, function(module, exports) {
+ var id = 0, px = Math.random();
+ module.exports = function(key) {
+ return "Symbol(".concat(void 0 === key ? "" : key, ")_", (++id + px).toString(36));
+ };
+}, function(module, exports) {
+ exports.f = {}.propertyIsEnumerable;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ exports.__esModule = !0;
+ var _iterator = __webpack_require__(352), _iterator2 = _interopRequireDefault(_iterator), _symbol = __webpack_require__(360), _symbol2 = _interopRequireDefault(_symbol), _typeof = "function" == typeof _symbol2.default && "symbol" == typeof _iterator2.default ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj;
+ };
+ exports.default = "function" == typeof _symbol2.default && "symbol" === _typeof(_iterator2.default) ? function(obj) {
+ return void 0 === obj ? "undefined" : _typeof(obj);
+ } : function(obj) {
+ return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : void 0 === obj ? "undefined" : _typeof(obj);
+ };
+}, function(module, exports, __webpack_require__) {
+ var anObject = __webpack_require__(48), dPs = __webpack_require__(356), enumBugKeys = __webpack_require__(141), IE_PROTO = __webpack_require__(139)("IE_PROTO"), Empty = function() {}, createDict = function() {
+ var iframeDocument, iframe = __webpack_require__(208)("iframe"), i = enumBugKeys.length;
+ for (iframe.style.display = "none", __webpack_require__(357).appendChild(iframe),
+ iframe.src = "javascript:", iframeDocument = iframe.contentWindow.document, iframeDocument.open(),
+ iframeDocument.write("<script>document.F=Object<\/script>"), iframeDocument.close(),
+ createDict = iframeDocument.F; i--; ) delete createDict.prototype[enumBugKeys[i]];
+ return createDict();
+ };
+ module.exports = Object.create || function(O, Properties) {
+ var result;
+ return null !== O ? (Empty.prototype = anObject(O), result = new Empty(), Empty.prototype = null,
+ result[IE_PROTO] = O) : result = createDict(), void 0 === Properties ? result : dPs(result, Properties);
+ };
+}, function(module, exports, __webpack_require__) {
+ var def = __webpack_require__(22).f, has = __webpack_require__(50), TAG = __webpack_require__(21)("toStringTag");
+ module.exports = function(it, tag, stat) {
+ it && !has(it = stat ? it : it.prototype, TAG) && def(it, TAG, {
+ configurable: !0,
+ value: tag
+ });
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function isNonNullObject(value) {
+ return !!value && "object" == typeof value;
+ }
+ function isSpecial(value) {
+ var stringValue = Object.prototype.toString.call(value);
+ return "[object RegExp]" === stringValue || "[object Date]" === stringValue || isReactElement(value);
+ }
+ function isReactElement(value) {
+ return value.$$typeof === REACT_ELEMENT_TYPE;
+ }
+ function emptyTarget(val) {
+ return Array.isArray(val) ? [] : {};
+ }
+ function cloneUnlessOtherwiseSpecified(value, optionsArgument) {
+ return optionsArgument && !1 === optionsArgument.clone || !isMergeableObject(value) ? value : deepmerge(emptyTarget(value), value, optionsArgument);
+ }
+ function defaultArrayMerge(target, source, optionsArgument) {
+ return target.concat(source).map(function(element) {
+ return cloneUnlessOtherwiseSpecified(element, optionsArgument);
+ });
+ }
+ function mergeObject(target, source, optionsArgument) {
+ var destination = {};
+ return isMergeableObject(target) && Object.keys(target).forEach(function(key) {
+ destination[key] = cloneUnlessOtherwiseSpecified(target[key], optionsArgument);
+ }), Object.keys(source).forEach(function(key) {
+ isMergeableObject(source[key]) && target[key] ? destination[key] = deepmerge(target[key], source[key], optionsArgument) : destination[key] = cloneUnlessOtherwiseSpecified(source[key], optionsArgument);
+ }), destination;
+ }
+ function deepmerge(target, source, optionsArgument) {
+ var sourceIsArray = Array.isArray(source), targetIsArray = Array.isArray(target), options = optionsArgument || {
+ arrayMerge: defaultArrayMerge
+ };
+ if (sourceIsArray === targetIsArray) return sourceIsArray ? (options.arrayMerge || defaultArrayMerge)(target, source, optionsArgument) : mergeObject(target, source, optionsArgument);
+ return cloneUnlessOtherwiseSpecified(source, optionsArgument);
+ }
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: !0
+ });
+ var isMergeableObject = function(value) {
+ return isNonNullObject(value) && !isSpecial(value);
+ }, canUseSymbol = "function" == typeof Symbol && Symbol.for, REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for("react.element") : 60103;
+ deepmerge.all = function(array, optionsArgument) {
+ if (!Array.isArray(array)) throw new Error("first argument should be an array");
+ return array.reduce(function(prev, next) {
+ return deepmerge(prev, next, optionsArgument);
+ }, {});
+ };
+ var deepmerge_1 = deepmerge;
+ __webpack_exports__.default = deepmerge_1;
+}, function(module, exports, __webpack_require__) {
+ var ctx = __webpack_require__(47), call = __webpack_require__(221), isArrayIter = __webpack_require__(222), anObject = __webpack_require__(48), toLength = __webpack_require__(97), getIterFn = __webpack_require__(223), BREAK = {}, RETURN = {}, exports = module.exports = function(iterable, entries, fn, that, ITERATOR) {
+ var length, step, iterator, result, iterFn = ITERATOR ? function() {
+ return iterable;
+ } : getIterFn(iterable), f = ctx(fn, that, entries ? 2 : 1), index = 0;
+ if ("function" != typeof iterFn) throw TypeError(iterable + " is not iterable!");
+ if (isArrayIter(iterFn)) {
+ for (length = toLength(iterable.length); length > index; index++) if ((result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index])) === BREAK || result === RETURN) return result;
+ } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done; ) if ((result = call(iterator, f, step.value, entries)) === BREAK || result === RETURN) return result;
+ };
+ exports.BREAK = BREAK, exports.RETURN = RETURN;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function toCssValue(value) {
+ var ignoreImportant = arguments.length > 1 && void 0 !== arguments[1] && arguments[1];
+ if (!Array.isArray(value)) return value;
+ var cssValue = "";
+ if (Array.isArray(value[0])) for (var i = 0; i < value.length && "!important" !== value[i]; i++) cssValue && (cssValue += ", "),
+ cssValue += join(value[i], " "); else cssValue = join(value, ", ");
+ return ignoreImportant || "!important" !== value[value.length - 1] || (cssValue += " !important"),
+ cssValue;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = toCssValue;
+ var join = function(value, by) {
+ for (var result = "", i = 0; i < value.length && "!important" !== value[i]; i++) result && (result += by),
+ result += value[i];
+ return result;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function createRule() {
+ var name = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "unnamed", decl = arguments[1], options = arguments[2], jss = options.jss, declCopy = (0,
+ _cloneStyle2.default)(decl), rule = jss.plugins.onCreateRule(name, declCopy, options);
+ return rule || ("@" === name[0] && (0, _warning2.default)(!1, "[JSS] Unknown at-rule %s", name),
+ new _StyleRule2.default(name, declCopy, options));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = createRule;
+ var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _StyleRule = __webpack_require__(60), _StyleRule2 = _interopRequireDefault(_StyleRule), _cloneStyle = __webpack_require__(420), _cloneStyle2 = _interopRequireDefault(_cloneStyle);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: !0
+ }), __webpack_require__.d(__webpack_exports__, "isBrowser", function() {
+ return isBrowser;
+ });
+ var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ }, isBrowser = "object" === ("undefined" == typeof window ? "undefined" : _typeof(window)) && "object" === ("undefined" == typeof document ? "undefined" : _typeof(document)) && 9 === document.nodeType;
+ __webpack_exports__.default = isBrowser;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ function noop() {}
+ exports.__esModule = !0, exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;
+ var _propTypes = __webpack_require__(1), PropTypes = function(obj) {
+ if (obj && obj.__esModule) return obj;
+ var newObj = {};
+ if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);
+ return newObj.default = obj, newObj;
+ }(_propTypes), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _reactDom = __webpack_require__(95), _reactDom2 = _interopRequireDefault(_reactDom), _PropTypes = __webpack_require__(460), UNMOUNTED = exports.UNMOUNTED = "unmounted", EXITED = exports.EXITED = "exited", ENTERING = exports.ENTERING = "entering", ENTERED = exports.ENTERED = "entered", EXITING = exports.EXITING = "exiting", Transition = function(_React$Component) {
+ function Transition(props, context) {
+ _classCallCheck(this, Transition);
+ var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context)), parentGroup = context.transitionGroup, appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear, initialStatus = void 0;
+ return _this.nextStatus = null, props.in ? appear ? (initialStatus = EXITED, _this.nextStatus = ENTERING) : initialStatus = ENTERED : initialStatus = props.unmountOnExit || props.mountOnEnter ? UNMOUNTED : EXITED,
+ _this.state = {
+ status: initialStatus
+ }, _this.nextCallback = null, _this;
+ }
+ return _inherits(Transition, _React$Component), Transition.prototype.getChildContext = function() {
+ return {
+ transitionGroup: null
+ };
+ }, Transition.prototype.componentDidMount = function() {
+ this.updateStatus(!0);
+ }, Transition.prototype.componentWillReceiveProps = function(nextProps) {
+ var _ref = this.pendingState || this.state, status = _ref.status;
+ nextProps.in ? (status === UNMOUNTED && this.setState({
+ status: EXITED
+ }), status !== ENTERING && status !== ENTERED && (this.nextStatus = ENTERING)) : status !== ENTERING && status !== ENTERED || (this.nextStatus = EXITING);
+ }, Transition.prototype.componentDidUpdate = function() {
+ this.updateStatus();
+ }, Transition.prototype.componentWillUnmount = function() {
+ this.cancelNextCallback();
+ }, Transition.prototype.getTimeouts = function() {
+ var timeout = this.props.timeout, exit = void 0, enter = void 0, appear = void 0;
+ return exit = enter = appear = timeout, null != timeout && "number" != typeof timeout && (exit = timeout.exit,
+ enter = timeout.enter, appear = timeout.appear), {
+ exit: exit,
+ enter: enter,
+ appear: appear
+ };
+ }, Transition.prototype.updateStatus = function() {
+ var mounting = arguments.length > 0 && void 0 !== arguments[0] && arguments[0], nextStatus = this.nextStatus;
+ if (null !== nextStatus) {
+ this.nextStatus = null, this.cancelNextCallback();
+ var node = _reactDom2.default.findDOMNode(this);
+ nextStatus === ENTERING ? this.performEnter(node, mounting) : this.performExit(node);
+ } else this.props.unmountOnExit && this.state.status === EXITED && this.setState({
+ status: UNMOUNTED
+ });
+ }, Transition.prototype.performEnter = function(node, mounting) {
+ var _this2 = this, enter = this.props.enter, appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting, timeouts = this.getTimeouts();
+ if (!mounting && !enter) return void this.safeSetState({
+ status: ENTERED
+ }, function() {
+ _this2.props.onEntered(node);
+ });
+ this.props.onEnter(node, appearing), this.safeSetState({
+ status: ENTERING
+ }, function() {
+ _this2.props.onEntering(node, appearing), _this2.onTransitionEnd(node, timeouts.enter, function() {
+ _this2.safeSetState({
+ status: ENTERED
+ }, function() {
+ _this2.props.onEntered(node, appearing);
+ });
+ });
+ });
+ }, Transition.prototype.performExit = function(node) {
+ var _this3 = this, exit = this.props.exit, timeouts = this.getTimeouts();
+ if (!exit) return void this.safeSetState({
+ status: EXITED
+ }, function() {
+ _this3.props.onExited(node);
+ });
+ this.props.onExit(node), this.safeSetState({
+ status: EXITING
+ }, function() {
+ _this3.props.onExiting(node), _this3.onTransitionEnd(node, timeouts.exit, function() {
+ _this3.safeSetState({
+ status: EXITED
+ }, function() {
+ _this3.props.onExited(node);
+ });
+ });
+ });
+ }, Transition.prototype.cancelNextCallback = function() {
+ null !== this.nextCallback && (this.nextCallback.cancel(), this.nextCallback = null);
+ }, Transition.prototype.safeSetState = function(nextState, callback) {
+ var _this4 = this;
+ this.pendingState = nextState, callback = this.setNextCallback(callback), this.setState(nextState, function() {
+ _this4.pendingState = null, callback();
+ });
+ }, Transition.prototype.setNextCallback = function(callback) {
+ var _this5 = this, active = !0;
+ return this.nextCallback = function(event) {
+ active && (active = !1, _this5.nextCallback = null, callback(event));
+ }, this.nextCallback.cancel = function() {
+ active = !1;
+ }, this.nextCallback;
+ }, Transition.prototype.onTransitionEnd = function(node, timeout, handler) {
+ this.setNextCallback(handler), node ? (this.props.addEndListener && this.props.addEndListener(node, this.nextCallback),
+ null != timeout && setTimeout(this.nextCallback, timeout)) : setTimeout(this.nextCallback, 0);
+ }, Transition.prototype.render = function() {
+ var status = this.state.status;
+ if (status === UNMOUNTED) return null;
+ var _props = this.props, children = _props.children, childProps = _objectWithoutProperties(_props, [ "children" ]);
+ if (delete childProps.in, delete childProps.mountOnEnter, delete childProps.unmountOnExit,
+ delete childProps.appear, delete childProps.enter, delete childProps.exit, delete childProps.timeout,
+ delete childProps.addEndListener, delete childProps.onEnter, delete childProps.onEntering,
+ delete childProps.onEntered, delete childProps.onExit, delete childProps.onExiting,
+ delete childProps.onExited, "function" == typeof children) return children(status, childProps);
+ var child = _react2.default.Children.only(children);
+ return _react2.default.cloneElement(child, childProps);
+ }, Transition;
+ }(_react2.default.Component);
+ Transition.contextTypes = {
+ transitionGroup: PropTypes.object
+ }, Transition.childContextTypes = {
+ transitionGroup: function() {}
+ }, Transition.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: PropTypes.oneOfType([ PropTypes.func.isRequired, PropTypes.element.isRequired ]).isRequired,
+ in: PropTypes.bool,
+ mountOnEnter: PropTypes.bool,
+ unmountOnExit: PropTypes.bool,
+ appear: PropTypes.bool,
+ enter: PropTypes.bool,
+ exit: PropTypes.bool,
+ timeout: function(props) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];
+ var pt = _PropTypes.timeoutsShape;
+ return props.addEndListener || (pt = pt.isRequired), pt.apply(void 0, [ props ].concat(args));
+ },
+ addEndListener: PropTypes.func,
+ onEnter: PropTypes.func,
+ onEntering: PropTypes.func,
+ onEntered: PropTypes.func,
+ onExit: PropTypes.func,
+ onExiting: PropTypes.func,
+ onExited: PropTypes.func
+ } : {}, Transition.defaultProps = {
+ in: !1,
+ mountOnEnter: !1,
+ unmountOnExit: !1,
+ appear: !1,
+ enter: !0,
+ exit: !0,
+ onEnter: noop,
+ onEntering: noop,
+ onEntered: noop,
+ onExit: noop,
+ onExiting: noop,
+ onExited: noop
+ }, Transition.UNMOUNTED = 0, Transition.EXITED = 1, Transition.ENTERING = 2, Transition.ENTERED = 3,
+ Transition.EXITING = 4, exports.default = Transition;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _Typography = __webpack_require__(480);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_Typography).default;
+ }
+ });
+}, function(module, exports) {
+ module.exports = function(exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return !0;
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), nativeCreate = getNative(Object, "create");
+ module.exports = nativeCreate;
+}, function(module, exports, __webpack_require__) {
+ function ListCache(entries) {
+ var index = -1, length = null == entries ? 0 : entries.length;
+ for (this.clear(); ++index < length; ) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ var listCacheClear = __webpack_require__(570), listCacheDelete = __webpack_require__(571), listCacheGet = __webpack_require__(572), listCacheHas = __webpack_require__(573), listCacheSet = __webpack_require__(574);
+ ListCache.prototype.clear = listCacheClear, ListCache.prototype.delete = listCacheDelete,
+ ListCache.prototype.get = listCacheGet, ListCache.prototype.has = listCacheHas,
+ ListCache.prototype.set = listCacheSet, module.exports = ListCache;
+}, function(module, exports, __webpack_require__) {
+ function assocIndexOf(array, key) {
+ for (var length = array.length; length--; ) if (eq(array[length][0], key)) return length;
+ return -1;
+ }
+ var eq = __webpack_require__(168);
+ module.exports = assocIndexOf;
+}, function(module, exports, __webpack_require__) {
+ function getMapData(map, key) {
+ var data = map.__data__;
+ return isKeyable(key) ? data["string" == typeof key ? "string" : "hash"] : data.map;
+ }
+ var isKeyable = __webpack_require__(576);
+ module.exports = getMapData;
+}, function(module, exports) {
+ function arrayMap(array, iteratee) {
+ for (var index = -1, length = null == array ? 0 : array.length, result = Array(length); ++index < length; ) result[index] = iteratee(array[index], index, array);
+ return result;
+ }
+ module.exports = arrayMap;
+}, function(module, exports, __webpack_require__) {
+ function toKey(value) {
+ if ("string" == typeof value || isSymbol(value)) return value;
+ var result = value + "";
+ return "0" == result && 1 / value == -INFINITY ? "-0" : result;
+ }
+ var isSymbol = __webpack_require__(62), INFINITY = 1 / 0;
+ module.exports = toKey;
+}, function(module, exports, __webpack_require__) {
+ function isNaN(value) {
+ return isNumber(value) && value != +value;
+ }
+ var isNumber = __webpack_require__(170);
+ module.exports = isNaN;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Linear(context) {
+ this._context = context;
+ }
+ Linear.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._point = 0;
+ },
+ lineEnd: function() {
+ (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
+ break;
+
+ case 1:
+ this._point = 2;
+
+ default:
+ this._context.lineTo(x, y);
+ }
+ }
+ }, __webpack_exports__.a = function(context) {
+ return new Linear(context);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function() {};
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function point(that, x, y) {
+ that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);
+ }
+ function Basis(context) {
+ this._context = context;
+ }
+ __webpack_exports__.c = point, __webpack_exports__.a = Basis, Basis.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 3:
+ point(this, this._x1, this._y1);
+
+ case 2:
+ this._context.lineTo(this._x1, this._y1);
+ }
+ (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
+ break;
+
+ case 1:
+ this._point = 2;
+ break;
+
+ case 2:
+ this._point = 3, this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);
+
+ default:
+ point(this, x, y);
+ }
+ this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;
+ }
+ }, __webpack_exports__.b = function(context) {
+ return new Basis(context);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function point(that, x, y) {
+ that._context.bezierCurveTo(that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2);
+ }
+ function Cardinal(context, tension) {
+ this._context = context, this._k = (1 - tension) / 6;
+ }
+ __webpack_exports__.b = point, __webpack_exports__.a = Cardinal, Cardinal.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 2:
+ this._context.lineTo(this._x2, this._y2);
+ break;
+
+ case 3:
+ point(this, this._x1, this._y1);
+ }
+ (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
+ break;
+
+ case 1:
+ this._point = 2, this._x1 = x, this._y1 = y;
+ break;
+
+ case 2:
+ this._point = 3;
+
+ default:
+ point(this, x, y);
+ }
+ this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2,
+ this._y2 = y;
+ }
+ };
+ !function custom(tension) {
+ function cardinal(context) {
+ return new Cardinal(context, tension);
+ }
+ return cardinal.tension = function(tension) {
+ return custom(+tension);
+ }, cardinal;
+ }(0);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_5__DefaultTooltipContent__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_smooth__),
+ __webpack_require__(681)), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__util_PureRender__ = __webpack_require__(5), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), propTypes = {
+ content: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ viewBox: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number
+ }),
+ active: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ separator: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ formatter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ offset: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ itemStyle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,
+ labelStyle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,
+ wrapperStyle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,
+ cursor: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object ]),
+ coordinate: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number
+ }),
+ position: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number
+ }),
+ label: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.any,
+ payload: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
+ name: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.any,
+ value: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]),
+ unit: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.any
+ })),
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]),
+ itemSorter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ filterNull: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ useTranslate3d: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool
+ }, defaultProps = {
+ active: !1,
+ offset: 10,
+ viewBox: {
+ x1: 0,
+ x2: 0,
+ y1: 0,
+ y2: 0
+ },
+ coordinate: {
+ x: 0,
+ y: 0
+ },
+ cursorStyle: {},
+ separator: " : ",
+ wrapperStyle: {},
+ itemStyle: {},
+ labelStyle: {},
+ cursor: !0,
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)(),
+ animationEasing: "ease",
+ animationDuration: 400,
+ itemSorter: function() {
+ return -1;
+ },
+ filterNull: !0,
+ useTranslate3d: !1
+ }, renderContent = function(content, props) {
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(content) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(content, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content) ? content(props) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__DefaultTooltipContent__.a, props);
+ }, Tooltip = Object(__WEBPACK_IMPORTED_MODULE_8__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Tooltip() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Tooltip);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ boxWidth: -1,
+ boxHeight: -1
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Tooltip, _Component), _createClass(Tooltip, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.updateBBox();
+ }
+ }, {
+ key: "componentDidUpdate",
+ value: function() {
+ this.updateBBox();
+ }
+ }, {
+ key: "updateBBox",
+ value: function() {
+ var _state = this.state, boxWidth = _state.boxWidth, boxHeight = _state.boxHeight;
+ if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {
+ var box = this.wrapperNode.getBoundingClientRect();
+ (Math.abs(box.width - boxWidth) > 1 || Math.abs(box.height - boxHeight) > 1) && this.setState({
+ boxWidth: box.width,
+ boxHeight: box.height
+ });
+ } else -1 === boxWidth && -1 === boxHeight || this.setState({
+ boxWidth: -1,
+ boxHeight: -1
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this2 = this, _props = this.props, payload = _props.payload, isAnimationActive = _props.isAnimationActive, animationDuration = _props.animationDuration, animationEasing = _props.animationEasing, filterNull = _props.filterNull, finalPayload = filterNull && payload && payload.length ? payload.filter(function(entry) {
+ return !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(entry.value);
+ }) : payload, hasPayload = finalPayload && finalPayload.length, _props2 = this.props, content = _props2.content, viewBox = _props2.viewBox, coordinate = _props2.coordinate, position = _props2.position, active = _props2.active, offset = _props2.offset, wrapperStyle = _props2.wrapperStyle, outerStyle = _extends({
+ pointerEvents: "none",
+ visibility: active && hasPayload ? "visible" : "hidden",
+ position: "absolute",
+ top: 0
+ }, wrapperStyle), translateX = void 0, translateY = void 0;
+ if (position && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.g)(position.x) && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.g)(position.y)) translateX = position.x,
+ translateY = position.y; else {
+ var _state2 = this.state, boxWidth = _state2.boxWidth, boxHeight = _state2.boxHeight;
+ boxWidth > 0 && boxHeight > 0 && coordinate ? (translateX = position && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.g)(position.x) ? position.x : Math.max(coordinate.x + boxWidth + offset > viewBox.x + viewBox.width ? coordinate.x - boxWidth - offset : coordinate.x + offset, viewBox.x),
+ translateY = position && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.g)(position.y) ? position.y : Math.max(coordinate.y + boxHeight + offset > viewBox.y + viewBox.height ? coordinate.y - boxHeight - offset : coordinate.y + offset, viewBox.y)) : outerStyle.visibility = "hidden";
+ }
+ return outerStyle = _extends({}, outerStyle, Object(__WEBPACK_IMPORTED_MODULE_4_react_smooth__.translateStyle)({
+ transform: this.props.useTranslate3d ? "translate3d(" + translateX + "px, " + translateY + "px, 0)" : "translate(" + translateX + "px, " + translateY + "px)"
+ })), isAnimationActive && active && (outerStyle = _extends({}, outerStyle, Object(__WEBPACK_IMPORTED_MODULE_4_react_smooth__.translateStyle)({
+ transition: "transform " + animationDuration + "ms " + animationEasing
+ }))), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("div", {
+ className: "recharts-tooltip-wrapper",
+ style: outerStyle,
+ ref: function(node) {
+ _this2.wrapperNode = node;
+ }
+ }, renderContent(content, _extends({}, this.props, {
+ payload: finalPayload
+ })));
+ }
+ } ]), Tooltip;
+ }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Tooltip",
+ _class2.propTypes = propTypes, _class2.defaultProps = defaultProps, _class = _temp2)) || _class;
+ __webpack_exports__.a = Tooltip;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.warn = exports.getTransitionVal = exports.compose = exports.translateStyle = exports.mapObject = exports.debugf = exports.debug = exports.log = exports.generatePrefixStyle = exports.getDashCase = exports.identity = exports.getIntersectionKeys = void 0;
+ var _intersection2 = __webpack_require__(645), _intersection3 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_intersection2), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, PREFIX_LIST = [ "Webkit", "Moz", "O", "ms" ], IN_LINE_PREFIX_LIST = [ "-webkit-", "-moz-", "-o-", "-ms-" ], IN_COMPATIBLE_PROPERTY = [ "transform", "transformOrigin", "transition" ], identity = (exports.getIntersectionKeys = function(preObj, nextObj) {
+ return (0, _intersection3.default)(Object.keys(preObj), Object.keys(nextObj));
+ }, exports.identity = function(param) {
+ return param;
+ }), getDashCase = exports.getDashCase = function(name) {
+ return name.replace(/([A-Z])/g, function(v) {
+ return "-" + v.toLowerCase();
+ });
+ }, generatePrefixStyle = exports.generatePrefixStyle = function(name, value) {
+ if (-1 === IN_COMPATIBLE_PROPERTY.indexOf(name)) return _defineProperty({}, name, value);
+ var isTransition = "transition" === name, camelName = name.replace(/(\w)/, function(v) {
+ return v.toUpperCase();
+ }), styleVal = value;
+ return PREFIX_LIST.reduce(function(result, property, i) {
+ return isTransition && (styleVal = value.replace(/(transform|transform-origin)/gim, IN_LINE_PREFIX_LIST[i] + "$1")),
+ _extends({}, result, _defineProperty({}, property + camelName, styleVal));
+ }, {});
+ }, log = exports.log = function() {
+ var _console;
+ (_console = console).log.apply(_console, arguments);
+ }, isDev = (exports.debug = function(name) {
+ return function(item) {
+ return log(name, item), item;
+ };
+ }, exports.debugf = function(tag, f) {
+ return function() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ var res = f.apply(void 0, args), name = tag || f.name || "anonymous function", argNames = "(" + args.map(JSON.stringify).join(", ") + ")";
+ return log(name + ": " + argNames + " => " + JSON.stringify(res)), res;
+ };
+ }, exports.mapObject = function(fn, obj) {
+ return Object.keys(obj).reduce(function(res, key) {
+ return _extends({}, res, _defineProperty({}, key, fn(key, obj[key])));
+ }, {});
+ }, exports.translateStyle = function(style) {
+ return Object.keys(style).reduce(function(res, key) {
+ return _extends({}, res, generatePrefixStyle(key, res[key]));
+ }, style);
+ }, exports.compose = function() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2];
+ if (!args.length) return identity;
+ var fns = args.reverse(), firstFn = fns[0], tailsFn = fns.slice(1);
+ return function() {
+ return tailsFn.reduce(function(res, fn) {
+ return fn(res);
+ }, firstFn.apply(void 0, arguments));
+ };
+ }, exports.getTransitionVal = function(props, duration, easing) {
+ return props.map(function(prop) {
+ return getDashCase(prop) + " " + duration + "ms " + easing;
+ }).join(",");
+ }, "production" !== process.env.NODE_ENV);
+ exports.warn = function(condition, format, a, b, c, d, e, f) {
+ if (isDev && "undefined" != typeof console && console.warn && (void 0 === format && console.warn("LogUtils requires an error message argument"),
+ !condition)) if (void 0 === format) console.warn("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings."); else {
+ var args = [ a, b, c, d, e, f ], argIndex = 0;
+ console.warn(format.replace(/%s/g, function() {
+ return args[argIndex++];
+ }));
+ }
+ };
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ function baseExtremum(array, iteratee, comparator) {
+ for (var index = -1, length = array.length; ++index < length; ) {
+ var value = array[index], current = iteratee(value);
+ if (null != current && (void 0 === computed ? current === current && !isSymbol(current) : comparator(current, computed))) var computed = current, result = value;
+ }
+ return result;
+ }
+ var isSymbol = __webpack_require__(62);
+ module.exports = baseExtremum;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(a, b) {
+ return a = +a, b -= a, function(t) {
+ return a + b * t;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function deinterpolateLinear(a, b) {
+ return (b -= a = +a) ? function(x) {
+ return (x - a) / b;
+ } : Object(__WEBPACK_IMPORTED_MODULE_3__constant__.a)(b);
+ }
+ function deinterpolateClamp(deinterpolate) {
+ return function(a, b) {
+ var d = deinterpolate(a = +a, b = +b);
+ return function(x) {
+ return x <= a ? 0 : x >= b ? 1 : d(x);
+ };
+ };
+ }
+ function reinterpolateClamp(reinterpolate) {
+ return function(a, b) {
+ var r = reinterpolate(a = +a, b = +b);
+ return function(t) {
+ return t <= 0 ? a : t >= 1 ? b : r(t);
+ };
+ };
+ }
+ function bimap(domain, range, deinterpolate, reinterpolate) {
+ var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
+ return d1 < d0 ? (d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0)) : (d0 = deinterpolate(d0, d1),
+ r0 = reinterpolate(r0, r1)), function(x) {
+ return r0(d0(x));
+ };
+ }
+ function polymap(domain, range, deinterpolate, reinterpolate) {
+ var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1;
+ for (domain[j] < domain[0] && (domain = domain.slice().reverse(), range = range.slice().reverse()); ++i < j; ) d[i] = deinterpolate(domain[i], domain[i + 1]),
+ r[i] = reinterpolate(range[i], range[i + 1]);
+ return function(x) {
+ var i = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(domain, x, 1, j) - 1;
+ return r[i](d[i](x));
+ };
+ }
+ function copy(source, target) {
+ return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp());
+ }
+ function continuous(deinterpolate, reinterpolate) {
+ function rescale() {
+ return piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap,
+ output = input = null, scale;
+ }
+ function scale(x) {
+ return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);
+ }
+ var piecewise, output, input, domain = unit, range = unit, interpolate = __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.a, clamp = !1;
+ return scale.invert = function(y) {
+ return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
+ }, scale.domain = function(_) {
+ return arguments.length ? (domain = __WEBPACK_IMPORTED_MODULE_2__array__.a.call(_, __WEBPACK_IMPORTED_MODULE_4__number__.a),
+ rescale()) : domain.slice();
+ }, scale.range = function(_) {
+ return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_2__array__.b.call(_),
+ rescale()) : range.slice();
+ }, scale.rangeRound = function(_) {
+ return range = __WEBPACK_IMPORTED_MODULE_2__array__.b.call(_), interpolate = __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.d,
+ rescale();
+ }, scale.clamp = function(_) {
+ return arguments.length ? (clamp = !!_, rescale()) : clamp;
+ }, scale.interpolate = function(_) {
+ return arguments.length ? (interpolate = _, rescale()) : interpolate;
+ }, rescale();
+ }
+ __webpack_exports__.c = deinterpolateLinear, __webpack_exports__.a = copy, __webpack_exports__.b = continuous;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_2__array__ = __webpack_require__(56), __WEBPACK_IMPORTED_MODULE_3__constant__ = __webpack_require__(191), __WEBPACK_IMPORTED_MODULE_4__number__ = __webpack_require__(309), unit = [ 0, 1 ];
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__formatDecimal__ = __webpack_require__(192);
+ __webpack_exports__.a = function(x) {
+ return x = Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(Math.abs(x)),
+ x ? x[1] : NaN;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_6__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), getDeltaAngle = function(startAngle, endAngle) {
+ return Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.i)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 359.999);
+ }, getTangentCircle = function(_ref) {
+ var cx = _ref.cx, cy = _ref.cy, radius = _ref.radius, angle = _ref.angle, sign = _ref.sign, isExternal = _ref.isExternal, cornerRadius = _ref.cornerRadius, centerRadius = cornerRadius * (isExternal ? 1 : -1) + radius, theta = Math.asin(cornerRadius / centerRadius) / __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.a, centerAngle = angle + sign * theta;
+ return {
+ center: Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, centerRadius, centerAngle),
+ circleTangency: Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, radius, centerAngle),
+ lineTangency: Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, centerRadius * Math.cos(theta * __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.a), angle),
+ theta: theta
+ };
+ }, getSectorPath = function(_ref2) {
+ var cx = _ref2.cx, cy = _ref2.cy, innerRadius = _ref2.innerRadius, outerRadius = _ref2.outerRadius, startAngle = _ref2.startAngle, endAngle = _ref2.endAngle, angle = getDeltaAngle(startAngle, endAngle), tempEndAngle = startAngle + angle, outerStartPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, outerRadius, startAngle), outerEndPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, outerRadius, tempEndAngle), path = "M " + outerStartPoint.x + "," + outerStartPoint.y + "\n A " + outerRadius + "," + outerRadius + ",0,\n " + +(Math.abs(angle) > 180) + "," + +(startAngle > tempEndAngle) + ",\n " + outerEndPoint.x + "," + outerEndPoint.y + "\n ";
+ if (innerRadius > 0) {
+ var innerStartPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, innerRadius, startAngle), innerEndPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, innerRadius, tempEndAngle);
+ path += "L " + innerEndPoint.x + "," + innerEndPoint.y + "\n A " + innerRadius + "," + innerRadius + ",0,\n " + +(Math.abs(angle) > 180) + "," + +(startAngle <= tempEndAngle) + ",\n " + innerStartPoint.x + "," + innerStartPoint.y + " Z";
+ } else path += "L " + cx + "," + cy + " Z";
+ return path;
+ }, getSectorWithCorner = function(_ref3) {
+ var cx = _ref3.cx, cy = _ref3.cy, innerRadius = _ref3.innerRadius, outerRadius = _ref3.outerRadius, cornerRadius = _ref3.cornerRadius, startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, sign = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.i)(endAngle - startAngle), _getTangentCircle = getTangentCircle({
+ cx: cx,
+ cy: cy,
+ radius: outerRadius,
+ angle: startAngle,
+ sign: sign,
+ cornerRadius: cornerRadius
+ }), soct = _getTangentCircle.circleTangency, solt = _getTangentCircle.lineTangency, sot = _getTangentCircle.theta, _getTangentCircle2 = getTangentCircle({
+ cx: cx,
+ cy: cy,
+ radius: outerRadius,
+ angle: endAngle,
+ sign: -sign,
+ cornerRadius: cornerRadius
+ }), eoct = _getTangentCircle2.circleTangency, eolt = _getTangentCircle2.lineTangency, eot = _getTangentCircle2.theta, outerArcAngle = Math.abs(startAngle - endAngle) - sot - eot;
+ if (outerArcAngle < 0) return getSectorPath({
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ startAngle: startAngle,
+ endAngle: endAngle
+ });
+ var path = "M " + solt.x + "," + solt.y + "\n A" + cornerRadius + "," + cornerRadius + ",0,0," + +(sign < 0) + "," + soct.x + "," + soct.y + "\n A" + outerRadius + "," + outerRadius + ",0," + +(outerArcAngle > 180) + "," + +(sign < 0) + "," + eoct.x + "," + eoct.y + "\n A" + cornerRadius + "," + cornerRadius + ",0,0," + +(sign < 0) + "," + eolt.x + "," + eolt.y + "\n ";
+ if (innerRadius > 0) {
+ var _getTangentCircle3 = getTangentCircle({
+ cx: cx,
+ cy: cy,
+ radius: innerRadius,
+ angle: startAngle,
+ sign: sign,
+ isExternal: !0,
+ cornerRadius: cornerRadius
+ }), sict = _getTangentCircle3.circleTangency, silt = _getTangentCircle3.lineTangency, sit = _getTangentCircle3.theta, _getTangentCircle4 = getTangentCircle({
+ cx: cx,
+ cy: cy,
+ radius: innerRadius,
+ angle: endAngle,
+ sign: -sign,
+ isExternal: !0,
+ cornerRadius: cornerRadius
+ }), eict = _getTangentCircle4.circleTangency, eilt = _getTangentCircle4.lineTangency, eit = _getTangentCircle4.theta, innerArcAngle = Math.abs(startAngle - endAngle) - sit - eit;
+ if (innerArcAngle < 0) return path + "L" + cx + "," + cy + "Z";
+ path += "L" + eilt.x + "," + eilt.y + "\n A" + cornerRadius + "," + cornerRadius + ",0,0," + +(sign < 0) + "," + eict.x + "," + eict.y + "\n A" + innerRadius + "," + innerRadius + ",0," + +(innerArcAngle > 180) + "," + +(sign > 0) + "," + sict.x + "," + sict.y + "\n A" + cornerRadius + "," + cornerRadius + ",0,0," + +(sign < 0) + "," + silt.x + "," + silt.y + "Z";
+ } else path += "L" + cx + "," + cy + "Z";
+ return path;
+ }, Sector = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Sector() {
+ return _classCallCheck(this, Sector), _possibleConstructorReturn(this, (Sector.__proto__ || Object.getPrototypeOf(Sector)).apply(this, arguments));
+ }
+ return _inherits(Sector, _Component), _createClass(Sector, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, cx = _props.cx, cy = _props.cy, innerRadius = _props.innerRadius, outerRadius = _props.outerRadius, cornerRadius = _props.cornerRadius, startAngle = _props.startAngle, endAngle = _props.endAngle, className = _props.className;
+ if (outerRadius < innerRadius || startAngle === endAngle) return null;
+ var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-sector", className), deltaRadius = outerRadius - innerRadius, cr = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.c)(cornerRadius, deltaRadius, 0, !0), path = void 0;
+ return path = cr > 0 && Math.abs(startAngle - endAngle) < 360 ? getSectorWithCorner({
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ cornerRadius: Math.min(cr, deltaRadius / 2),
+ startAngle: startAngle,
+ endAngle: endAngle
+ }) : getSectorPath({
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ startAngle: startAngle,
+ endAngle: endAngle
+ }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props), {
+ className: layerClass,
+ d: path
+ }));
+ }
+ } ]), Sector;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Sector",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ innerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ outerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ startAngle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ endAngle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ cornerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string ])
+ }), _class2.defaultProps = {
+ cx: 0,
+ cy: 0,
+ innerRadius: 0,
+ outerRadius: 0,
+ startAngle: 0,
+ endAngle: 0,
+ cornerRadius: 0
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Sector;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_lodash_minBy__ = __webpack_require__(783), __WEBPACK_IMPORTED_MODULE_1_lodash_minBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_minBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_maxBy__ = __webpack_require__(324), __WEBPACK_IMPORTED_MODULE_2_lodash_maxBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_maxBy__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_6__component_Text__ = __webpack_require__(55), __WEBPACK_IMPORTED_MODULE_7__component_Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), PolarRadiusAxis = Object(__WEBPACK_IMPORTED_MODULE_5__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function PolarRadiusAxis() {
+ return _classCallCheck(this, PolarRadiusAxis), _possibleConstructorReturn(this, (PolarRadiusAxis.__proto__ || Object.getPrototypeOf(PolarRadiusAxis)).apply(this, arguments));
+ }
+ return _inherits(PolarRadiusAxis, _Component), _createClass(PolarRadiusAxis, [ {
+ key: "getTickValueCoord",
+ value: function(_ref) {
+ var coordinate = _ref.coordinate, _props = this.props, angle = _props.angle, cx = _props.cx, cy = _props.cy;
+ return Object(__WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__.e)(cx, cy, coordinate, angle);
+ }
+ }, {
+ key: "getTickTextAnchor",
+ value: function() {
+ var orientation = this.props.orientation, textAnchor = void 0;
+ switch (orientation) {
+ case "left":
+ textAnchor = "end";
+ break;
+
+ case "right":
+ textAnchor = "start";
+ break;
+
+ default:
+ textAnchor = "middle";
+ }
+ return textAnchor;
+ }
+ }, {
+ key: "getViewBox",
+ value: function() {
+ var _props2 = this.props, cx = _props2.cx, cy = _props2.cy, angle = _props2.angle, ticks = _props2.ticks, maxRadiusTick = __WEBPACK_IMPORTED_MODULE_2_lodash_maxBy___default()(ticks, function(entry) {
+ return entry.coordinate || 0;
+ });
+ return {
+ cx: cx,
+ cy: cy,
+ startAngle: angle,
+ endAngle: angle,
+ innerRadius: __WEBPACK_IMPORTED_MODULE_1_lodash_minBy___default()(ticks, function(entry) {
+ return entry.coordinate || 0;
+ }).coordinate || 0,
+ outerRadius: maxRadiusTick.coordinate || 0
+ };
+ }
+ }, {
+ key: "renderAxisLine",
+ value: function() {
+ var _props3 = this.props, cx = _props3.cx, cy = _props3.cy, angle = _props3.angle, ticks = _props3.ticks, axisLine = _props3.axisLine, others = _objectWithoutProperties(_props3, [ "cx", "cy", "angle", "ticks", "axisLine" ]), extent = ticks.reduce(function(result, entry) {
+ return [ Math.min(result[0], entry.coordinate), Math.max(result[1], entry.coordinate) ];
+ }, [ 1 / 0, -1 / 0 ]), point0 = Object(__WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__.e)(cx, cy, extent[0], angle), point1 = Object(__WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__.e)(cx, cy, extent[1], angle), props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others), {
+ fill: "none"
+ }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(axisLine), {
+ x1: point0.x,
+ y1: point0.y,
+ x2: point1.x,
+ y2: point1.y
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("line", _extends({
+ className: "recharts-polar-radius-axis-line"
+ }, props));
+ }
+ }, {
+ key: "renderTickItem",
+ value: function(option, props, value) {
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__component_Text__.a, _extends({}, props, {
+ className: "recharts-polar-radius-axis-tick-value"
+ }), value);
+ }
+ }, {
+ key: "renderTicks",
+ value: function() {
+ var _this2 = this, _props4 = this.props, ticks = _props4.ticks, tick = _props4.tick, angle = _props4.angle, tickFormatter = _props4.tickFormatter, stroke = _props4.stroke, others = _objectWithoutProperties(_props4, [ "ticks", "tick", "angle", "tickFormatter", "stroke" ]), textAnchor = this.getTickTextAnchor(), axisProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others), customTickProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(tick), items = ticks.map(function(entry, i) {
+ var coord = _this2.getTickValueCoord(entry), tickProps = _extends({
+ textAnchor: textAnchor,
+ transform: "rotate(" + (90 - angle) + ", " + coord.x + ", " + coord.y + ")"
+ }, axisProps, {
+ stroke: "none",
+ fill: stroke
+ }, customTickProps, {
+ index: i
+ }, coord, {
+ payload: entry
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({
+ className: "recharts-polar-radius-axis-tick",
+ key: "tick-" + i
+ }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this2.props, entry, i)), _this2.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value) : entry.value));
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-polar-radius-axis-ticks"
+ }, items);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props5 = this.props, ticks = _props5.ticks, axisLine = _props5.axisLine, tick = _props5.tick;
+ return ticks && ticks.length ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-polar-radius-axis"
+ }, axisLine && this.renderAxisLine(), tick && this.renderTicks(), __WEBPACK_IMPORTED_MODULE_7__component_Label__.a.renderCallByParent(this.props, this.getViewBox())) : null;
+ }
+ } ]), PolarRadiusAxis;
+ }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = "PolarRadiusAxis",
+ _class2.axisType = "radiusAxis", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.a, {
+ type: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "number", "category" ]),
+ cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ radiusAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ angle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ tickCount: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ ticks: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.any,
+ coordinate: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number
+ })),
+ orientation: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "left", "right", "middle" ]),
+ axisLine: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object ]),
+ tick: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),
+ stroke: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,
+ tickFormatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ domain: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])),
+ scale: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),
+ allowDataOverflow: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool
+ }), _class2.defaultProps = {
+ type: "number",
+ radiusAxisId: 0,
+ cx: 0,
+ cy: 0,
+ angle: 0,
+ orientation: "right",
+ stroke: "#ccc",
+ axisLine: !0,
+ tick: !0,
+ tickCount: 5,
+ domain: [ 0, "auto" ],
+ allowDataOverflow: !1,
+ scale: "auto",
+ allowDuplicatedCategory: !0
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = PolarRadiusAxis;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_6__shape_Dot__ = __webpack_require__(57), __WEBPACK_IMPORTED_MODULE_7__shape_Polygon__ = __webpack_require__(195), __WEBPACK_IMPORTED_MODULE_8__component_Text__ = __webpack_require__(55), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), RADIAN = Math.PI / 180, PolarAngleAxis = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function PolarAngleAxis() {
+ return _classCallCheck(this, PolarAngleAxis), _possibleConstructorReturn(this, (PolarAngleAxis.__proto__ || Object.getPrototypeOf(PolarAngleAxis)).apply(this, arguments));
+ }
+ return _inherits(PolarAngleAxis, _Component), _createClass(PolarAngleAxis, [ {
+ key: "getTickLineCoord",
+ value: function(data) {
+ var _props = this.props, cx = _props.cx, cy = _props.cy, radius = _props.radius, orientation = _props.orientation, tickLine = _props.tickLine, tickLineSize = tickLine && tickLine.size || 8, p1 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, data.coordinate), p2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius + ("inner" === orientation ? -1 : 1) * tickLineSize, data.coordinate);
+ return {
+ x1: p1.x,
+ y1: p1.y,
+ x2: p2.x,
+ y2: p2.y
+ };
+ }
+ }, {
+ key: "getTickTextAnchor",
+ value: function(data) {
+ var orientation = this.props.orientation, cos = Math.cos(-data.coordinate * RADIAN);
+ return cos > 1e-5 ? "outer" === orientation ? "start" : "end" : cos < -1e-5 ? "outer" === orientation ? "end" : "start" : "middle";
+ }
+ }, {
+ key: "renderAxisLine",
+ value: function() {
+ var _props2 = this.props, cx = _props2.cx, cy = _props2.cy, radius = _props2.radius, axisLine = _props2.axisLine, axisLineType = _props2.axisLineType, props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), {
+ fill: "none"
+ }, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(axisLine));
+ if ("circle" === axisLineType) return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__shape_Dot__.a, _extends({
+ className: "recharts-polar-angle-axis-line"
+ }, props, {
+ cx: cx,
+ cy: cy,
+ r: radius
+ }));
+ var ticks = this.props.ticks, points = ticks.map(function(entry) {
+ return Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, entry.coordinate);
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__shape_Polygon__.a, _extends({
+ className: "recharts-polar-angle-axis-line"
+ }, props, {
+ points: points
+ }));
+ }
+ }, {
+ key: "renderTickItem",
+ value: function(option, props, value) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__component_Text__.a, _extends({}, props, {
+ className: "recharts-polar-angle-axis-tick-value"
+ }), value);
+ }
+ }, {
+ key: "renderTicks",
+ value: function() {
+ var _this2 = this, _props3 = this.props, ticks = _props3.ticks, tick = _props3.tick, tickLine = _props3.tickLine, tickFormatter = _props3.tickFormatter, stroke = _props3.stroke, axisProps = Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), customTickProps = Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(tick), tickLineProps = _extends({}, axisProps, {
+ fill: "none"
+ }, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(tickLine)), items = ticks.map(function(entry, i) {
+ var lineCoord = _this2.getTickLineCoord(entry), textAnchor = _this2.getTickTextAnchor(entry), tickProps = _extends({
+ textAnchor: textAnchor
+ }, axisProps, {
+ stroke: "none",
+ fill: stroke
+ }, customTickProps, {
+ index: i,
+ payload: entry,
+ x: lineCoord.x2,
+ y: lineCoord.y2
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Layer__.a, _extends({
+ className: "recharts-polar-angle-axis-tick",
+ key: "tick-" + i
+ }, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.f)(_this2.props, entry, i)), tickLine && __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("line", _extends({
+ className: "recharts-polar-angle-axis-tick-line"
+ }, tickLineProps, lineCoord)), tick && _this2.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value) : entry.value));
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Layer__.a, {
+ className: "recharts-polar-angle-axis-ticks"
+ }, items);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props4 = this.props, ticks = _props4.ticks, radius = _props4.radius, axisLine = _props4.axisLine;
+ return radius <= 0 || !ticks || !ticks.length ? null : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Layer__.a, {
+ className: "recharts-polar-angle-axis"
+ }, axisLine && this.renderAxisLine(), this.renderTicks());
+ }
+ } ]), PolarAngleAxis;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "PolarAngleAxis",
+ _class2.axisType = "angleAxis", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, {
+ type: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "number", "category" ]),
+ angleAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ dataKey: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func ]),
+ cx: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ radius: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ hide: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ scale: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func ]),
+ axisLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),
+ axisLineType: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "polygon", "circle" ]),
+ tickLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),
+ tick: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ]),
+ ticks: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ value: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,
+ coordinate: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number
+ })),
+ stroke: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,
+ orientation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "inner", "outer" ]),
+ tickFormatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool
+ }), _class2.defaultProps = {
+ type: "category",
+ angleAxisId: 0,
+ scale: "auto",
+ cx: 0,
+ cy: 0,
+ domain: [ 0, "auto" ],
+ orientation: "outer",
+ axisLine: !0,
+ tickLine: !0,
+ tick: !0,
+ hide: !1,
+ allowDuplicatedCategory: !0
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = PolarAngleAxis;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__),
+ __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ZAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function ZAxis() {
+ return _classCallCheck(this, ZAxis), _possibleConstructorReturn(this, (ZAxis.__proto__ || Object.getPrototypeOf(ZAxis)).apply(this, arguments));
+ }
+ return _inherits(ZAxis, _Component), _createClass(ZAxis, [ {
+ key: "render",
+ value: function() {
+ return null;
+ }
+ } ]), ZAxis;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "ZAxis",
+ _class2.propTypes = {
+ type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]),
+ name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ zAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),
+ dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),
+ range: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number),
+ scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ])
+ }, _class2.defaultProps = {
+ zAxisId: 0,
+ range: [ 64, 64 ],
+ scale: "auto",
+ type: "number"
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = ZAxis;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
+ if ("production" !== process.env.NODE_ENV) for (var typeSpecName in typeSpecs) if (typeSpecs.hasOwnProperty(typeSpecName)) {
+ var error;
+ try {
+ invariant("function" == typeof typeSpecs[typeSpecName], "%s: %s type `))) + (("`" + (`%s` + "`")) + (` is invalid; it must be a function, usually from the ` + ("`" + `prop-types`))))) + (((("`" + (` package, but received ` + "`")) + (`%s` + ("`" + `.", componentName || "React class", location, typeSpecName, typeof typeSpecs[typeSpecName]),
+ error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
+ } catch (ex) {
+ error = ex;
+ }
+ if (warning(!error || error instanceof Error, "%s: type specification of %s `))) + (("`" + (`%s` + "`")) + (` is invalid; the type checker function must return ` + ("`" + `null`)))) + ((("`" + (` or an ` + "`")) + (`Error` + ("`" + ` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error),
+ error instanceof Error && !(error.message in loggedTypeFailures)) {
+ loggedTypeFailures[error.message] = !0;
+ var stack = getStack ? getStack() : "";
+ warning(!1, "Failed %s type: %s%s", location, error.message, null != stack ? stack : "");
+ }
+ }
+ }
+ if ("production" !== process.env.NODE_ENV) var invariant = __webpack_require__(70), warning = __webpack_require__(94), ReactPropTypesSecret = __webpack_require__(133), loggedTypeFailures = {};
+ module.exports = checkPropTypes;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ module.exports = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(35);
+ module.exports = function(it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && "function" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;
+ if ("function" == typeof (fn = it.valueOf) && !isObject(val = fn.call(it))) return val;
+ if (!S && "function" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+ };
+}, function(module, exports, __webpack_require__) {
+ var cof = __webpack_require__(136);
+ module.exports = Object("z").propertyIsEnumerable(0) ? Object : function(it) {
+ return "String" == cof(it) ? it.split("") : Object(it);
+ };
+}, function(module, exports) {
+ var toString = {}.toString;
+ module.exports = function(it) {
+ return toString.call(it).slice(8, -1);
+ };
+}, function(module, exports) {
+ module.exports = function(it) {
+ if (void 0 == it) throw TypeError("Can't call method on " + it);
+ return it;
+ };
+}, function(module, exports) {
+ var ceil = Math.ceil, floor = Math.floor;
+ module.exports = function(it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+ };
+}, function(module, exports, __webpack_require__) {
+ var shared = __webpack_require__(140)("keys"), uid = __webpack_require__(98);
+ module.exports = function(key) {
+ return shared[key] || (shared[key] = uid(key));
+ };
+}, function(module, exports, __webpack_require__) {
+ var global = __webpack_require__(24), store = global["__core-js_shared__"] || (global["__core-js_shared__"] = {});
+ module.exports = function(key) {
+ return store[key] || (store[key] = {});
+ };
+}, function(module, exports) {
+ module.exports = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",");
+}, function(module, exports) {
+ exports.f = Object.getOwnPropertySymbols;
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(348),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var $at = __webpack_require__(354)(!0);
+ __webpack_require__(145)(String, "String", function(iterated) {
+ this._t = String(iterated), this._i = 0;
+ }, function() {
+ var point, O = this._t, index = this._i;
+ return index >= O.length ? {
+ value: void 0,
+ done: !0
+ } : (point = $at(O, index), this._i += point.length, {
+ value: point,
+ done: !1
+ });
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var LIBRARY = __webpack_require__(146), $export = __webpack_require__(19), redefine = __webpack_require__(212), hide = __webpack_require__(40), has = __webpack_require__(50), Iterators = __webpack_require__(73), $iterCreate = __webpack_require__(355), setToStringTag = __webpack_require__(102), getPrototypeOf = __webpack_require__(210), ITERATOR = __webpack_require__(21)("iterator"), BUGGY = !([].keys && "next" in [].keys()), returnThis = function() {
+ return this;
+ };
+ module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var methods, key, IteratorPrototype, getMethod = function(kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case "keys":
+ case "values":
+ return function() {
+ return new Constructor(this, kind);
+ };
+ }
+ return function() {
+ return new Constructor(this, kind);
+ };
+ }, TAG = NAME + " Iterator", DEF_VALUES = "values" == DEFAULT, VALUES_BUG = !1, proto = Base.prototype, $native = proto[ITERATOR] || proto["@@iterator"] || DEFAULT && proto[DEFAULT], $default = !BUGGY && $native || getMethod(DEFAULT), $entries = DEFAULT ? DEF_VALUES ? getMethod("entries") : $default : void 0, $anyNative = "Array" == NAME ? proto.entries || $native : $native;
+ if ($anyNative && (IteratorPrototype = getPrototypeOf($anyNative.call(new Base()))) !== Object.prototype && IteratorPrototype.next && (setToStringTag(IteratorPrototype, TAG, !0),
+ LIBRARY || has(IteratorPrototype, ITERATOR) || hide(IteratorPrototype, ITERATOR, returnThis)),
+ DEF_VALUES && $native && "values" !== $native.name && (VALUES_BUG = !0, $default = function() {
+ return $native.call(this);
+ }), LIBRARY && !FORCED || !BUGGY && !VALUES_BUG && proto[ITERATOR] || hide(proto, ITERATOR, $default),
+ Iterators[NAME] = $default, Iterators[TAG] = returnThis, DEFAULT) if (methods = {
+ values: DEF_VALUES ? $default : getMethod("values"),
+ keys: IS_SET ? $default : getMethod("keys"),
+ entries: $entries
+ }, FORCED) for (key in methods) key in proto || redefine(proto, key, methods[key]); else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ return methods;
+ };
+}, function(module, exports) {
+ module.exports = !0;
+}, function(module, exports, __webpack_require__) {
+ exports.f = __webpack_require__(21);
+}, function(module, exports, __webpack_require__) {
+ var META = __webpack_require__(98)("meta"), isObject = __webpack_require__(35), has = __webpack_require__(50), setDesc = __webpack_require__(22).f, id = 0, isExtensible = Object.isExtensible || function() {
+ return !0;
+ }, FREEZE = !__webpack_require__(49)(function() {
+ return isExtensible(Object.preventExtensions({}));
+ }), setMeta = function(it) {
+ setDesc(it, META, {
+ value: {
+ i: "O" + ++id,
+ w: {}
+ }
+ });
+ }, fastKey = function(it, create) {
+ if (!isObject(it)) return "symbol" == typeof it ? it : ("string" == typeof it ? "S" : "P") + it;
+ if (!has(it, META)) {
+ if (!isExtensible(it)) return "F";
+ if (!create) return "E";
+ setMeta(it);
+ }
+ return it[META].i;
+ }, getWeak = function(it, create) {
+ if (!has(it, META)) {
+ if (!isExtensible(it)) return !0;
+ if (!create) return !1;
+ setMeta(it);
+ }
+ return it[META].w;
+ }, onFreeze = function(it) {
+ return FREEZE && meta.NEED && isExtensible(it) && !has(it, META) && setMeta(it),
+ it;
+ }, meta = module.exports = {
+ KEY: META,
+ NEED: !1,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+ };
+}, function(module, exports, __webpack_require__) {
+ var global = __webpack_require__(24), core = __webpack_require__(17), LIBRARY = __webpack_require__(146), wksExt = __webpack_require__(147), defineProperty = __webpack_require__(22).f;
+ module.exports = function(name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ "_" == name.charAt(0) || name in $Symbol || defineProperty($Symbol, name, {
+ value: wksExt.f(name)
+ });
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.CHANNEL = void 0;
+ var _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), CHANNEL = exports.CHANNEL = "__THEMING__", themeListener = {
+ contextTypes: (0, _defineProperty3.default)({}, CHANNEL, _propTypes2.default.object),
+ initial: function(context) {
+ return context[CHANNEL] ? context[CHANNEL].getState() : null;
+ },
+ subscribe: function(context, cb) {
+ return context[CHANNEL] ? context[CHANNEL].subscribe(cb) : null;
+ },
+ unsubscribe: function(context, subscriptionId) {
+ context[CHANNEL] && context[CHANNEL].unsubscribe(subscriptionId);
+ }
+ };
+ exports.default = themeListener;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function createMuiTheme() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, _options$palette = options.palette, paletteInput = void 0 === _options$palette ? {} : _options$palette, _options$breakpoints = options.breakpoints, breakpointsInput = void 0 === _options$breakpoints ? {} : _options$breakpoints, _options$mixins = options.mixins, mixinsInput = void 0 === _options$mixins ? {} : _options$mixins, _options$typography = options.typography, typographyInput = void 0 === _options$typography ? {} : _options$typography, shadowsInput = options.shadows, other = (0,
+ _objectWithoutProperties3.default)(options, [ "palette", "breakpoints", "mixins", "typography", "shadows" ]), palette = (0,
+ _createPalette2.default)(paletteInput), breakpoints = (0, _createBreakpoints2.default)(breakpointsInput), muiTheme = (0,
+ _extends3.default)({
+ direction: "ltr",
+ palette: palette,
+ typography: (0, _createTypography2.default)(palette, typographyInput),
+ mixins: (0, _createMixins2.default)(breakpoints, _spacing2.default, mixinsInput),
+ breakpoints: breakpoints,
+ shadows: shadowsInput || _shadows2.default
+ }, (0, _deepmerge2.default)({
+ transitions: _transitions2.default,
+ spacing: _spacing2.default,
+ zIndex: _zIndex2.default
+ }, other));
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(25 === muiTheme.shadows.length, "Material-UI: the shadows array provided to createMuiTheme should support 25 elevations."),
+ muiTheme;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _deepmerge = __webpack_require__(103), _deepmerge2 = _interopRequireDefault(_deepmerge), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _createTypography = __webpack_require__(380), _createTypography2 = _interopRequireDefault(_createTypography), _createBreakpoints = __webpack_require__(74), _createBreakpoints2 = _interopRequireDefault(_createBreakpoints), _createPalette = __webpack_require__(381), _createPalette2 = _interopRequireDefault(_createPalette), _createMixins = __webpack_require__(388), _createMixins2 = _interopRequireDefault(_createMixins), _shadows = __webpack_require__(389), _shadows2 = _interopRequireDefault(_shadows), _transitions = __webpack_require__(390), _transitions2 = _interopRequireDefault(_transitions), _zIndex = __webpack_require__(394), _zIndex2 = _interopRequireDefault(_zIndex), _spacing = __webpack_require__(395), _spacing2 = _interopRequireDefault(_spacing);
+ exports.default = createMuiTheme;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var REACT_STATICS = {
+ childContextTypes: !0,
+ contextTypes: !0,
+ defaultProps: !0,
+ displayName: !0,
+ getDefaultProps: !0,
+ mixins: !0,
+ propTypes: !0,
+ type: !0
+ }, KNOWN_STATICS = {
+ name: !0,
+ length: !0,
+ prototype: !0,
+ caller: !0,
+ callee: !0,
+ arguments: !0,
+ arity: !0
+ }, defineProperty = Object.defineProperty, getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, getPrototypeOf = Object.getPrototypeOf, objectPrototype = getPrototypeOf && getPrototypeOf(Object);
+ module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
+ if ("string" != typeof sourceComponent) {
+ if (objectPrototype) {
+ var inheritedComponent = getPrototypeOf(sourceComponent);
+ inheritedComponent && inheritedComponent !== objectPrototype && hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
+ }
+ var keys = getOwnPropertyNames(sourceComponent);
+ getOwnPropertySymbols && (keys = keys.concat(getOwnPropertySymbols(sourceComponent)));
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i];
+ if (!(REACT_STATICS[key] || KNOWN_STATICS[key] || blacklist && blacklist[key])) {
+ var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
+ try {
+ defineProperty(targetComponent, key, descriptor);
+ } catch (e) {}
+ }
+ }
+ return targetComponent;
+ }
+ return targetComponent;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function indentStr(str, indent) {
+ for (var result = "", index = 0; index < indent; index++) result += " ";
+ return result + str;
+ }
+ function toCss(selector, style) {
+ var options = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, result = "";
+ if (!style) return result;
+ var _options$indent = options.indent, indent = void 0 === _options$indent ? 0 : _options$indent, fallbacks = style.fallbacks;
+ if (indent++, fallbacks) if (Array.isArray(fallbacks)) for (var index = 0; index < fallbacks.length; index++) {
+ var fallback = fallbacks[index];
+ for (var prop in fallback) {
+ var value = fallback[prop];
+ null != value && (result += "\n" + indentStr(prop + ": " + (0, _toCssValue2.default)(value) + ";", indent));
+ }
+ } else for (var _prop in fallbacks) {
+ var _value = fallbacks[_prop];
+ null != _value && (result += "\n" + indentStr(_prop + ": " + (0, _toCssValue2.default)(_value) + ";", indent));
+ }
+ for (var _prop2 in style) {
+ var _value2 = style[_prop2];
+ null != _value2 && "fallbacks" !== _prop2 && (result += "\n" + indentStr(_prop2 + ": " + (0,
+ _toCssValue2.default)(_value2) + ";", indent));
+ }
+ return result || options.allowEmpty ? (indent--, result = indentStr(selector + " {" + result + "\n", indent) + indentStr("}", indent)) : result;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = toCss;
+ var _toCssValue = __webpack_require__(105), _toCssValue2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_toCssValue);
+}, function(module, exports) {
+ module.exports = function(module) {
+ return module.webpackPolyfill || (module.deprecate = function() {}, module.paths = [],
+ module.children || (module.children = []), Object.defineProperty(module, "loaded", {
+ enumerable: !0,
+ get: function() {
+ return module.l;
+ }
+ }), Object.defineProperty(module, "id", {
+ enumerable: !0,
+ get: function() {
+ return module.i;
+ }
+ }), module.webpackPolyfill = 1), module;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _SheetsRegistry = __webpack_require__(229), _SheetsRegistry2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_SheetsRegistry);
+ exports.default = new _SheetsRegistry2.default();
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _isInBrowser = __webpack_require__(107), _isInBrowser2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_isInBrowser), js = "", css = "";
+ if (_isInBrowser2.default) {
+ var jsCssMap = {
+ Moz: "-moz-",
+ ms: "-ms-",
+ O: "-o-",
+ Webkit: "-webkit-"
+ }, style = document.createElement("p").style;
+ for (var key in jsCssMap) if (key + "Transform" in style) {
+ js = key, css = jsCssMap[key];
+ break;
+ }
+ }
+ exports.default = {
+ js: js,
+ css: css
+ };
+}, function(module, exports, __webpack_require__) {
+ function debounce(func, wait, options) {
+ function invokeFunc(time) {
+ var args = lastArgs, thisArg = lastThis;
+ return lastArgs = lastThis = void 0, lastInvokeTime = time, result = func.apply(thisArg, args);
+ }
+ function leadingEdge(time) {
+ return lastInvokeTime = time, timerId = setTimeout(timerExpired, wait), leading ? invokeFunc(time) : result;
+ }
+ function remainingWait(time) {
+ var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, result = wait - timeSinceLastCall;
+ return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
+ }
+ function shouldInvoke(time) {
+ var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
+ return void 0 === lastCallTime || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+ }
+ function timerExpired() {
+ var time = now();
+ if (shouldInvoke(time)) return trailingEdge(time);
+ timerId = setTimeout(timerExpired, remainingWait(time));
+ }
+ function trailingEdge(time) {
+ return timerId = void 0, trailing && lastArgs ? invokeFunc(time) : (lastArgs = lastThis = void 0,
+ result);
+ }
+ function cancel() {
+ void 0 !== timerId && clearTimeout(timerId), lastInvokeTime = 0, lastArgs = lastCallTime = lastThis = timerId = void 0;
+ }
+ function flush() {
+ return void 0 === timerId ? result : trailingEdge(now());
+ }
+ function debounced() {
+ var time = now(), isInvoking = shouldInvoke(time);
+ if (lastArgs = arguments, lastThis = this, lastCallTime = time, isInvoking) {
+ if (void 0 === timerId) return leadingEdge(lastCallTime);
+ if (maxing) return timerId = setTimeout(timerExpired, wait), invokeFunc(lastCallTime);
+ }
+ return void 0 === timerId && (timerId = setTimeout(timerExpired, wait)), result;
+ }
+ var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = !1, maxing = !1, trailing = !0;
+ if ("function" != typeof func) throw new TypeError(FUNC_ERROR_TEXT);
+ return wait = toNumber(wait) || 0, isObject(options) && (leading = !!options.leading,
+ maxing = "maxWait" in options, maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait,
+ trailing = "trailing" in options ? !!options.trailing : trailing), debounced.cancel = cancel,
+ debounced.flush = flush, debounced;
+ }
+ var isObject = __webpack_require__(31), now = __webpack_require__(519), toNumber = __webpack_require__(243), FUNC_ERROR_TEXT = "Expected a function", nativeMax = Math.max, nativeMin = Math.min;
+ module.exports = debounce;
+}, function(module, exports) {
+ var global = module.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")();
+ "number" == typeof __g && (__g = global);
+}, function(module, exports) {
+ var core = module.exports = {
+ version: "2.5.1"
+ };
+ "number" == typeof __e && (__e = core);
+}, function(module, exports) {
+ module.exports = function(it) {
+ return "object" == typeof it ? null !== it : "function" == typeof it;
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = !__webpack_require__(110)(function() {
+ return 7 != Object.defineProperty({}, "a", {
+ get: function() {
+ return 7;
+ }
+ }).a;
+ });
+}, function(module, exports) {
+ module.exports = Math.sign || function(x) {
+ return 0 == (x = +x) || x != x ? x : x < 0 ? -1 : 1;
+ };
+}, function(module, exports) {
+ var $expm1 = Math.expm1;
+ module.exports = !$expm1 || $expm1(10) > 22025.465794806718 || $expm1(10) < 22025.465794806718 || -2e-17 != $expm1(-2e-17) ? function(x) {
+ return 0 == (x = +x) ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
+ } : $expm1;
+}, function(module, exports, __webpack_require__) {
+ function isString(value) {
+ return "string" == typeof value || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
+ }
+ var baseGetTag = __webpack_require__(42), isArray = __webpack_require__(12), isObjectLike = __webpack_require__(36), stringTag = "[object String]";
+ module.exports = isString;
+}, function(module, exports, __webpack_require__) {
+ function get(object, path, defaultValue) {
+ var result = null == object ? void 0 : baseGet(object, path);
+ return void 0 === result ? defaultValue : result;
+ }
+ var baseGet = __webpack_require__(246);
+ module.exports = get;
+}, function(module, exports, __webpack_require__) {
+ function isKey(value, object) {
+ if (isArray(value)) return !1;
+ var type = typeof value;
+ return !("number" != type && "symbol" != type && "boolean" != type && null != value && !isSymbol(value)) || (reIsPlainProp.test(value) || !reIsDeepProp.test(value) || null != object && value in Object(object));
+ }
+ var isArray = __webpack_require__(12), isSymbol = __webpack_require__(62), reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/;
+ module.exports = isKey;
+}, function(module, exports, __webpack_require__) {
+ function MapCache(entries) {
+ var index = -1, length = null == entries ? 0 : entries.length;
+ for (this.clear(); ++index < length; ) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ var mapCacheClear = __webpack_require__(559), mapCacheDelete = __webpack_require__(575), mapCacheGet = __webpack_require__(577), mapCacheHas = __webpack_require__(578), mapCacheSet = __webpack_require__(579);
+ MapCache.prototype.clear = mapCacheClear, MapCache.prototype.delete = mapCacheDelete,
+ MapCache.prototype.get = mapCacheGet, MapCache.prototype.has = mapCacheHas, MapCache.prototype.set = mapCacheSet,
+ module.exports = MapCache;
+}, function(module, exports) {
+ function eq(value, other) {
+ return value === other || value !== value && other !== other;
+ }
+ module.exports = eq;
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), root = __webpack_require__(32), Map = getNative(root, "Map");
+ module.exports = Map;
+}, function(module, exports, __webpack_require__) {
+ function isNumber(value) {
+ return "number" == typeof value || isObjectLike(value) && baseGetTag(value) == numberTag;
+ }
+ var baseGetTag = __webpack_require__(42), isObjectLike = __webpack_require__(36), numberTag = "[object Number]";
+ module.exports = isNumber;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__DefaultLegendContent__ = __webpack_require__(582), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), renderContent = function(content, props) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(content) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(content, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(content) ? content(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__DefaultLegendContent__.a, props);
+ }, ICON_TYPES = __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b.filter(function(type) {
+ return "none" !== type;
+ }), Legend = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Legend() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Legend);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Legend.__proto__ || Object.getPrototypeOf(Legend)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ boxWidth: -1,
+ boxHeight: -1
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Legend, _Component), _createClass(Legend, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.updateBBox();
+ }
+ }, {
+ key: "componentDidUpdate",
+ value: function() {
+ this.updateBBox();
+ }
+ }, {
+ key: "getBBox",
+ value: function() {
+ var _state = this.state, boxWidth = _state.boxWidth, boxHeight = _state.boxHeight;
+ return boxWidth >= 0 && boxHeight >= 0 ? {
+ width: boxWidth,
+ height: boxHeight
+ } : null;
+ }
+ }, {
+ key: "getDefaultPosition",
+ value: function(style) {
+ var _props = this.props, layout = _props.layout, align = _props.align, verticalAlign = _props.verticalAlign, margin = _props.margin, chartWidth = _props.chartWidth, chartHeight = _props.chartHeight, hPos = void 0, vPos = void 0;
+ if (!style || (void 0 === style.left || null === style.left) && (void 0 === style.right || null === style.right)) if ("center" === align && "vertical" === layout) {
+ var box = this.getBBox() || {
+ width: 0
+ };
+ hPos = {
+ left: ((chartWidth || 0) - box.width) / 2
+ };
+ } else hPos = "right" === align ? {
+ right: margin && margin.right || 0
+ } : {
+ left: margin && margin.left || 0
+ };
+ if (!style || (void 0 === style.top || null === style.top) && (void 0 === style.bottom || null === style.bottom)) if ("middle" === verticalAlign) {
+ var _box = this.getBBox() || {
+ height: 0
+ };
+ vPos = {
+ top: ((chartHeight || 0) - _box.height) / 2
+ };
+ } else vPos = "bottom" === verticalAlign ? {
+ bottom: margin && margin.bottom || 0
+ } : {
+ top: margin && margin.top || 0
+ };
+ return _extends({}, hPos, vPos);
+ }
+ }, {
+ key: "updateBBox",
+ value: function() {
+ var _state2 = this.state, boxWidth = _state2.boxWidth, boxHeight = _state2.boxHeight, onBBoxUpdate = this.props.onBBoxUpdate;
+ if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {
+ var box = this.wrapperNode.getBoundingClientRect();
+ (Math.abs(box.width - boxWidth) > 1 || Math.abs(box.height - boxHeight) > 1) && this.setState({
+ boxWidth: box.width,
+ boxHeight: box.height
+ }, function() {
+ onBBoxUpdate && onBBoxUpdate(box);
+ });
+ } else -1 === boxWidth && -1 === boxHeight || this.setState({
+ boxWidth: -1,
+ boxHeight: -1
+ }, function() {
+ onBBoxUpdate && onBBoxUpdate(null);
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this2 = this, _props2 = this.props, content = _props2.content, width = _props2.width, height = _props2.height, wrapperStyle = _props2.wrapperStyle, outerStyle = _extends({
+ position: "absolute",
+ width: width || "auto",
+ height: height || "auto"
+ }, this.getDefaultPosition(wrapperStyle), wrapperStyle);
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("div", {
+ className: "recharts-legend-wrapper",
+ style: outerStyle,
+ ref: function(node) {
+ _this2.wrapperNode = node;
+ }
+ }, renderContent(content, this.props));
+ }
+ } ], [ {
+ key: "getWithHeight",
+ value: function(item, chartWidth) {
+ var layout = item.props.layout;
+ return "vertical" === layout && Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(item.props.height) ? {
+ height: item.props.height
+ } : "horizontal" === layout ? {
+ width: item.props.width || chartWidth
+ } : null;
+ }
+ } ]), Legend;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "Legend",
+ _class2.propTypes = {
+ content: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func ]),
+ wrapperStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ chartWidth: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ chartHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ iconSize: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ iconType: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(ICON_TYPES),
+ layout: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "horizontal", "vertical" ]),
+ align: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "center", "left", "right" ]),
+ verticalAlign: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "top", "bottom", "middle" ]),
+ margin: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ top: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ left: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ bottom: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ right: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number
+ }),
+ payload: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ value: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,
+ id: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,
+ type: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b)
+ })),
+ formatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ onClick: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ onBBoxUpdate: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func
+ }, _class2.defaultProps = {
+ iconSize: 14,
+ layout: "horizontal",
+ align: "center",
+ verticalAlign: "bottom"
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Legend;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_d3_shape__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), SYMBOL_FACTORIES = {
+ symbolCircle: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.u,
+ symbolCross: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.v,
+ symbolDiamond: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.w,
+ symbolSquare: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.x,
+ symbolStar: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.y,
+ symbolTriangle: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.z,
+ symbolWye: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.A
+ }, RADIAN = Math.PI / 180, getSymbolFactory = function(type) {
+ var name = "symbol" + type.slice(0, 1).toUpperCase() + type.slice(1);
+ return SYMBOL_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_2_d3_shape__.u;
+ }, calculateAreaSize = function(size, sizeType, type) {
+ if ("area" === sizeType) return size;
+ switch (type) {
+ case "cross":
+ return 5 * size * size / 9;
+
+ case "diamond":
+ return .5 * size * size / Math.sqrt(3);
+
+ case "square":
+ return size * size;
+
+ case "star":
+ var angle = 18 * RADIAN;
+ return 1.25 * size * size * (Math.tan(angle) - Math.tan(2 * angle) * Math.pow(Math.tan(angle), 2));
+
+ case "triangle":
+ return Math.sqrt(3) * size * size / 4;
+
+ case "wye":
+ return (21 - 10 * Math.sqrt(3)) * size * size / 8;
+
+ default:
+ return Math.PI * size * size / 4;
+ }
+ }, Symbols = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Symbols() {
+ return _classCallCheck(this, Symbols), _possibleConstructorReturn(this, (Symbols.__proto__ || Object.getPrototypeOf(Symbols)).apply(this, arguments));
+ }
+ return _inherits(Symbols, _Component), _createClass(Symbols, [ {
+ key: "getPath",
+ value: function() {
+ var _props = this.props, size = _props.size, sizeType = _props.sizeType, type = _props.type, symbolFactory = getSymbolFactory(type);
+ return Object(__WEBPACK_IMPORTED_MODULE_2_d3_shape__.t)().type(symbolFactory).size(calculateAreaSize(size, sizeType, type))();
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, className = _props2.className, cx = _props2.cx, cy = _props2.cy, size = _props2.size;
+ return cx === +cx && cy === +cy && size === +size ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), {
+ className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()("recharts-symbols", className),
+ transform: "translate(" + cx + ", " + cy + ")",
+ d: this.getPath()
+ })) : null;
+ }
+ } ]), Symbols;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Symbols",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, {
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "circle", "cross", "diamond", "square", "star", "triangle", "wye" ]),
+ cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ size: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ sizeType: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "area", "diameter" ])
+ }), _class2.defaultProps = {
+ type: "circle",
+ size: 64,
+ sizeType: "area"
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Symbols;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_1__src_area__ = (__webpack_require__(583), __webpack_require__(249));
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_area__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__src_line__ = __webpack_require__(174);
+ __webpack_require__.d(__webpack_exports__, "m", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_line__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_8__src_symbol__ = (__webpack_require__(585), __webpack_require__(588),
+ __webpack_require__(251), __webpack_require__(252), __webpack_require__(589), __webpack_require__(590));
+ __webpack_require__.d(__webpack_exports__, "t", function() {
+ return __WEBPACK_IMPORTED_MODULE_8__src_symbol__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_9__src_symbol_circle__ = __webpack_require__(254);
+ __webpack_require__.d(__webpack_exports__, "u", function() {
+ return __WEBPACK_IMPORTED_MODULE_9__src_symbol_circle__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_10__src_symbol_cross__ = __webpack_require__(255);
+ __webpack_require__.d(__webpack_exports__, "v", function() {
+ return __WEBPACK_IMPORTED_MODULE_10__src_symbol_cross__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_11__src_symbol_diamond__ = __webpack_require__(256);
+ __webpack_require__.d(__webpack_exports__, "w", function() {
+ return __WEBPACK_IMPORTED_MODULE_11__src_symbol_diamond__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_12__src_symbol_square__ = __webpack_require__(258);
+ __webpack_require__.d(__webpack_exports__, "x", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__src_symbol_square__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_13__src_symbol_star__ = __webpack_require__(257);
+ __webpack_require__.d(__webpack_exports__, "y", function() {
+ return __WEBPACK_IMPORTED_MODULE_13__src_symbol_star__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_14__src_symbol_triangle__ = __webpack_require__(259);
+ __webpack_require__.d(__webpack_exports__, "z", function() {
+ return __WEBPACK_IMPORTED_MODULE_14__src_symbol_triangle__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_15__src_symbol_wye__ = __webpack_require__(260);
+ __webpack_require__.d(__webpack_exports__, "A", function() {
+ return __WEBPACK_IMPORTED_MODULE_15__src_symbol_wye__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_16__src_curve_basisClosed__ = __webpack_require__(591);
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return __WEBPACK_IMPORTED_MODULE_16__src_curve_basisClosed__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_17__src_curve_basisOpen__ = __webpack_require__(592);
+ __webpack_require__.d(__webpack_exports__, "d", function() {
+ return __WEBPACK_IMPORTED_MODULE_17__src_curve_basisOpen__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_18__src_curve_basis__ = __webpack_require__(120);
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_18__src_curve_basis__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_26__src_curve_linearClosed__ = (__webpack_require__(593),
+ __webpack_require__(261), __webpack_require__(262), __webpack_require__(121), __webpack_require__(594),
+ __webpack_require__(595), __webpack_require__(176), __webpack_require__(596));
+ __webpack_require__.d(__webpack_exports__, "f", function() {
+ return __WEBPACK_IMPORTED_MODULE_26__src_curve_linearClosed__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_27__src_curve_linear__ = __webpack_require__(118);
+ __webpack_require__.d(__webpack_exports__, "e", function() {
+ return __WEBPACK_IMPORTED_MODULE_27__src_curve_linear__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_28__src_curve_monotone__ = __webpack_require__(597);
+ __webpack_require__.d(__webpack_exports__, "g", function() {
+ return __WEBPACK_IMPORTED_MODULE_28__src_curve_monotone__.a;
+ }), __webpack_require__.d(__webpack_exports__, "h", function() {
+ return __WEBPACK_IMPORTED_MODULE_28__src_curve_monotone__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_29__src_curve_natural__ = __webpack_require__(598);
+ __webpack_require__.d(__webpack_exports__, "i", function() {
+ return __WEBPACK_IMPORTED_MODULE_29__src_curve_natural__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_30__src_curve_step__ = __webpack_require__(599);
+ __webpack_require__.d(__webpack_exports__, "j", function() {
+ return __WEBPACK_IMPORTED_MODULE_30__src_curve_step__.a;
+ }), __webpack_require__.d(__webpack_exports__, "k", function() {
+ return __WEBPACK_IMPORTED_MODULE_30__src_curve_step__.b;
+ }), __webpack_require__.d(__webpack_exports__, "l", function() {
+ return __WEBPACK_IMPORTED_MODULE_30__src_curve_step__.c;
+ });
+ var __WEBPACK_IMPORTED_MODULE_31__src_stack__ = __webpack_require__(600);
+ __webpack_require__.d(__webpack_exports__, "n", function() {
+ return __WEBPACK_IMPORTED_MODULE_31__src_stack__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_32__src_offset_expand__ = __webpack_require__(601);
+ __webpack_require__.d(__webpack_exports__, "o", function() {
+ return __WEBPACK_IMPORTED_MODULE_32__src_offset_expand__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_34__src_offset_none__ = (__webpack_require__(602),
+ __webpack_require__(81));
+ __webpack_require__.d(__webpack_exports__, "p", function() {
+ return __WEBPACK_IMPORTED_MODULE_34__src_offset_none__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_35__src_offset_silhouette__ = __webpack_require__(603);
+ __webpack_require__.d(__webpack_exports__, "q", function() {
+ return __WEBPACK_IMPORTED_MODULE_35__src_offset_silhouette__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_36__src_offset_wiggle__ = __webpack_require__(604);
+ __webpack_require__.d(__webpack_exports__, "r", function() {
+ return __WEBPACK_IMPORTED_MODULE_36__src_offset_wiggle__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_40__src_order_none__ = (__webpack_require__(177),
+ __webpack_require__(605), __webpack_require__(606), __webpack_require__(82));
+ __webpack_require__.d(__webpack_exports__, "s", function() {
+ return __WEBPACK_IMPORTED_MODULE_40__src_order_none__.a;
+ });
+ __webpack_require__(607);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_d3_path__ = __webpack_require__(79), __WEBPACK_IMPORTED_MODULE_1__constant__ = __webpack_require__(54), __WEBPACK_IMPORTED_MODULE_2__curve_linear__ = __webpack_require__(118), __WEBPACK_IMPORTED_MODULE_3__point__ = __webpack_require__(175);
+ __webpack_exports__.a = function() {
+ function line(data) {
+ var i, d, buffer, n = data.length, defined0 = !1;
+ for (null == context && (output = curve(buffer = Object(__WEBPACK_IMPORTED_MODULE_0_d3_path__.a)())),
+ i = 0; i <= n; ++i) !(i < n && defined(d = data[i], i, data)) === defined0 && ((defined0 = !defined0) ? output.lineStart() : output.lineEnd()),
+ defined0 && output.point(+x(d, i, data), +y(d, i, data));
+ if (buffer) return output = null, buffer + "" || null;
+ }
+ var x = __WEBPACK_IMPORTED_MODULE_3__point__.a, y = __WEBPACK_IMPORTED_MODULE_3__point__.b, defined = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!0), context = null, curve = __WEBPACK_IMPORTED_MODULE_2__curve_linear__.a, output = null;
+ return line.x = function(_) {
+ return arguments.length ? (x = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ line) : x;
+ }, line.y = function(_) {
+ return arguments.length ? (y = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ line) : y;
+ }, line.defined = function(_) {
+ return arguments.length ? (defined = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!!_),
+ line) : defined;
+ }, line.curve = function(_) {
+ return arguments.length ? (curve = _, null != context && (output = curve(context)),
+ line) : curve;
+ }, line.context = function(_) {
+ return arguments.length ? (null == _ ? context = output = null : output = curve(context = _),
+ line) : context;
+ }, line;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function x(p) {
+ return p[0];
+ }
+ function y(p) {
+ return p[1];
+ }
+ __webpack_exports__.a = x, __webpack_exports__.b = y;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function point(that, x, y) {
+ var x1 = that._x1, y1 = that._y1, x2 = that._x2, y2 = that._y2;
+ if (that._l01_a > __WEBPACK_IMPORTED_MODULE_0__math__.f) {
+ var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);
+ x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n, y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
+ }
+ if (that._l23_a > __WEBPACK_IMPORTED_MODULE_0__math__.f) {
+ var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m = 3 * that._l23_a * (that._l23_a + that._l12_a);
+ x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m, y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
+ }
+ that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
+ }
+ function CatmullRom(context, alpha) {
+ this._context = context, this._alpha = alpha;
+ }
+ __webpack_exports__.a = point;
+ var __WEBPACK_IMPORTED_MODULE_0__math__ = __webpack_require__(80), __WEBPACK_IMPORTED_MODULE_1__cardinal__ = __webpack_require__(121);
+ CatmullRom.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 2:
+ this._context.lineTo(this._x2, this._y2);
+ break;
+
+ case 3:
+ this.point(this._x2, this._y2);
+ }
+ (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ if (x = +x, y = +y, this._point) {
+ var x23 = this._x2 - x, y23 = this._y2 - y;
+ this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
+ }
+ switch (this._point) {
+ case 0:
+ this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
+ break;
+
+ case 1:
+ this._point = 2;
+ break;
+
+ case 2:
+ this._point = 3;
+
+ default:
+ point(this, x, y);
+ }
+ this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a,
+ this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x,
+ this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+ }
+ };
+ !function custom(alpha) {
+ function catmullRom(context) {
+ return alpha ? new CatmullRom(context, alpha) : new __WEBPACK_IMPORTED_MODULE_1__cardinal__.a(context, 0);
+ }
+ return catmullRom.alpha = function(alpha) {
+ return custom(+alpha);
+ }, catmullRom;
+ }(.5);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function sum(series) {
+ for (var v, s = 0, i = -1, n = series.length; ++i < n; ) (v = +series[i][1]) && (s += v);
+ return s;
+ }
+ __webpack_exports__.b = sum;
+ var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(82);
+ __webpack_exports__.a = function(series) {
+ var sums = series.map(sum);
+ return Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series).sort(function(a, b) {
+ return sums[a] - sums[b];
+ });
+ };
+}, function(module, exports, __webpack_require__) {
+ function baseIsEqual(value, other, bitmask, customizer, stack) {
+ return value === other || (null == value || null == other || !isObjectLike(value) && !isObjectLike(other) ? value !== value && other !== other : baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack));
+ }
+ var baseIsEqualDeep = __webpack_require__(608), isObjectLike = __webpack_require__(36);
+ module.exports = baseIsEqual;
+}, function(module, exports, __webpack_require__) {
+ function keys(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+ }
+ var arrayLikeKeys = __webpack_require__(626), baseKeys = __webpack_require__(632), isArrayLike = __webpack_require__(83);
+ module.exports = keys;
+}, function(module, exports, __webpack_require__) {
+ var baseIsArguments = __webpack_require__(628), isObjectLike = __webpack_require__(36), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, propertyIsEnumerable = objectProto.propertyIsEnumerable, isArguments = baseIsArguments(function() {
+ return arguments;
+ }()) ? baseIsArguments : function(value) {
+ return isObjectLike(value) && hasOwnProperty.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
+ };
+ module.exports = isArguments;
+}, function(module, exports) {
+ function isIndex(value, length) {
+ return !!(length = null == length ? MAX_SAFE_INTEGER : length) && ("number" == typeof value || reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;
+ }
+ var MAX_SAFE_INTEGER = 9007199254740991, reIsUint = /^(?:0|[1-9]\d*)$/;
+ module.exports = isIndex;
+}, function(module, exports) {
+ function isLength(value) {
+ return "number" == typeof value && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
+ var MAX_SAFE_INTEGER = 9007199254740991;
+ module.exports = isLength;
+}, function(module, exports) {
+ function baseUnary(func) {
+ return function(value) {
+ return func(value);
+ };
+ }
+ module.exports = baseUnary;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function autoCompleteStyle(name, value) {
+ return STYLE_LIST.indexOf(name) >= 0 && value === +value ? value + "px" : value;
+ }
+ function camelToMiddleLine(text) {
+ return text.split("").reduce(function(result, entry) {
+ return entry === entry.toUpperCase() ? [].concat(_toConsumableArray(result), [ "-", entry.toLowerCase() ]) : [].concat(_toConsumableArray(result), [ entry ]);
+ }, []).join("");
+ }
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return getStringSize;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return getOffset;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return calculateChartCoordinate;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, stringCache = {
+ widthCache: {},
+ cacheCount: 0
+ }, SPAN_STYLE = {
+ position: "absolute",
+ top: "-20000px",
+ left: 0,
+ padding: 0,
+ margin: 0,
+ border: "none",
+ whiteSpace: "pre"
+ }, STYLE_LIST = [ "minWidth", "maxWidth", "width", "minHeight", "maxHeight", "height", "top", "left", "fontSize", "lineHeight", "padding", "margin", "paddingLeft", "paddingRight", "paddingTop", "paddingBottom", "marginLeft", "marginRight", "marginTop", "marginBottom" ], getStyleString = function(style) {
+ return Object.keys(style).reduce(function(result, s) {
+ return "" + result + camelToMiddleLine(s) + ":" + autoCompleteStyle(s, style[s]) + ";";
+ }, "");
+ }, getStringSize = function(text) {
+ var style = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
+ if (void 0 === text || null === text || Object(__WEBPACK_IMPORTED_MODULE_0__ReactUtils__.n)()) return {
+ width: 0,
+ height: 0
+ };
+ var str = "" + text, styleString = getStyleString(style), cacheKey = str + "-" + styleString;
+ if (stringCache.widthCache[cacheKey]) return stringCache.widthCache[cacheKey];
+ try {
+ var measurementSpan = document.getElementById("recharts_measurement_span");
+ measurementSpan || (measurementSpan = document.createElement("span"), measurementSpan.setAttribute("id", "recharts_measurement_span"),
+ document.body.appendChild(measurementSpan)), measurementSpan.setAttribute("style", getStyleString(_extends({}, SPAN_STYLE, style))),
+ measurementSpan.textContent = str;
+ var rect = measurementSpan.getBoundingClientRect(), result = {
+ width: rect.width,
+ height: rect.height
+ };
+ return stringCache.widthCache[cacheKey] = result, ++stringCache.cacheCount > 2e3 && (stringCache.cacheCount = 0,
+ stringCache.widthCache = {}), result;
+ } catch (e) {
+ return {
+ width: 0,
+ height: 0
+ };
+ }
+ }, getOffset = function(el) {
+ var html = el.ownerDocument.documentElement, box = {
+ top: 0,
+ left: 0
+ };
+ return void 0 !== el.getBoundingClientRect && (box = el.getBoundingClientRect()),
+ {
+ top: box.top + window.pageYOffset - html.clientTop,
+ left: box.left + window.pageXOffset - html.clientLeft
+ };
+ }, calculateChartCoordinate = function(event, offset) {
+ return {
+ chartX: Math.round(event.pageX - offset.left),
+ chartY: Math.round(event.pageY - offset.top)
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(86);
+ __webpack_exports__.a = function(values, p, valueof) {
+ if (null == valueof && (valueof = __WEBPACK_IMPORTED_MODULE_0__number__.a), n = values.length) {
+ if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
+ if (p >= 1) return +valueof(values[n - 1], n - 1, values);
+ var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values[i0], i0, values);
+ return value0 + (+valueof(values[i0 + 1], i0 + 1, values) - value0) * (i - i0);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Map() {}
+ function map(object, f) {
+ var map = new Map();
+ if (object instanceof Map) object.each(function(value, key) {
+ map.set(key, value);
+ }); else if (Array.isArray(object)) {
+ var o, i = -1, n = object.length;
+ if (null == f) for (;++i < n; ) map.set(i, object[i]); else for (;++i < n; ) map.set(f(o = object[i], i, object), o);
+ } else if (object) for (var key in object) map.set(key, object[key]);
+ return map;
+ }
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return prefix;
+ });
+ var prefix = "$";
+ Map.prototype = map.prototype = {
+ constructor: Map,
+ has: function(key) {
+ return prefix + key in this;
+ },
+ get: function(key) {
+ return this[prefix + key];
+ },
+ set: function(key, value) {
+ return this[prefix + key] = value, this;
+ },
+ remove: function(key) {
+ var property = prefix + key;
+ return property in this && delete this[property];
+ },
+ clear: function() {
+ for (var property in this) property[0] === prefix && delete this[property];
+ },
+ keys: function() {
+ var keys = [];
+ for (var property in this) property[0] === prefix && keys.push(property.slice(1));
+ return keys;
+ },
+ values: function() {
+ var values = [];
+ for (var property in this) property[0] === prefix && values.push(this[property]);
+ return values;
+ },
+ entries: function() {
+ var entries = [];
+ for (var property in this) property[0] === prefix && entries.push({
+ key: property.slice(1),
+ value: this[property]
+ });
+ return entries;
+ },
+ size: function() {
+ var size = 0;
+ for (var property in this) property[0] === prefix && ++size;
+ return size;
+ },
+ empty: function() {
+ for (var property in this) if (property[0] === prefix) return !1;
+ return !0;
+ },
+ each: function(f) {
+ for (var property in this) property[0] === prefix && f(this[property], property.slice(1), this);
+ }
+ }, __webpack_exports__.a = map;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1__rgb__ = __webpack_require__(302), __WEBPACK_IMPORTED_MODULE_2__array__ = __webpack_require__(305), __WEBPACK_IMPORTED_MODULE_3__date__ = __webpack_require__(306), __WEBPACK_IMPORTED_MODULE_4__number__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_5__object__ = __webpack_require__(307), __WEBPACK_IMPORTED_MODULE_6__string__ = __webpack_require__(308), __WEBPACK_IMPORTED_MODULE_7__constant__ = __webpack_require__(304);
+ __webpack_exports__.a = function(a, b) {
+ var c, t = typeof b;
+ return null == b || "boolean" === t ? Object(__WEBPACK_IMPORTED_MODULE_7__constant__.a)(b) : ("number" === t ? __WEBPACK_IMPORTED_MODULE_4__number__.a : "string" === t ? (c = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.a)(b)) ? (b = c,
+ __WEBPACK_IMPORTED_MODULE_1__rgb__.a) : __WEBPACK_IMPORTED_MODULE_6__string__.a : b instanceof __WEBPACK_IMPORTED_MODULE_0_d3_color__.a ? __WEBPACK_IMPORTED_MODULE_1__rgb__.a : b instanceof Date ? __WEBPACK_IMPORTED_MODULE_3__date__.a : Array.isArray(b) ? __WEBPACK_IMPORTED_MODULE_2__array__.a : "function" != typeof b.valueOf && "function" != typeof b.toString || isNaN(b) ? __WEBPACK_IMPORTED_MODULE_5__object__.a : __WEBPACK_IMPORTED_MODULE_4__number__.a)(a, b);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Color() {}
+ function color(format) {
+ var m;
+ return format = (format + "").trim().toLowerCase(), (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16),
+ new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | 240 & m, (15 & m) << 4 | 15 & m, 1)) : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format)) ? new Rgb(255 * m[1] / 100, 255 * m[2] / 100, 255 * m[3] / 100, 1) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format)) ? rgba(255 * m[1] / 100, 255 * m[2] / 100, 255 * m[3] / 100, m[4]) : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : "transparent" === format ? new Rgb(NaN, NaN, NaN, 0) : null;
+ }
+ function rgbn(n) {
+ return new Rgb(n >> 16 & 255, n >> 8 & 255, 255 & n, 1);
+ }
+ function rgba(r, g, b, a) {
+ return a <= 0 && (r = g = b = NaN), new Rgb(r, g, b, a);
+ }
+ function rgbConvert(o) {
+ return o instanceof Color || (o = color(o)), o ? (o = o.rgb(), new Rgb(o.r, o.g, o.b, o.opacity)) : new Rgb();
+ }
+ function rgb(r, g, b, opacity) {
+ return 1 === arguments.length ? rgbConvert(r) : new Rgb(r, g, b, null == opacity ? 1 : opacity);
+ }
+ function Rgb(r, g, b, opacity) {
+ this.r = +r, this.g = +g, this.b = +b, this.opacity = +opacity;
+ }
+ function hsla(h, s, l, a) {
+ return a <= 0 ? h = s = l = NaN : l <= 0 || l >= 1 ? h = s = NaN : s <= 0 && (h = NaN),
+ new Hsl(h, s, l, a);
+ }
+ function hslConvert(o) {
+ if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
+ if (o instanceof Color || (o = color(o)), !o) return new Hsl();
+ if (o instanceof Hsl) return o;
+ o = o.rgb();
+ var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;
+ return s ? (h = r === max ? (g - b) / s + 6 * (g < b) : g === max ? (b - r) / s + 2 : (r - g) / s + 4,
+ s /= l < .5 ? max + min : 2 - max - min, h *= 60) : s = l > 0 && l < 1 ? 0 : h,
+ new Hsl(h, s, l, o.opacity);
+ }
+ function hsl(h, s, l, opacity) {
+ return 1 === arguments.length ? hslConvert(h) : new Hsl(h, s, l, null == opacity ? 1 : opacity);
+ }
+ function Hsl(h, s, l, opacity) {
+ this.h = +h, this.s = +s, this.l = +l, this.opacity = +opacity;
+ }
+ function hsl2rgb(h, m1, m2) {
+ return 255 * (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1);
+ }
+ __webpack_exports__.a = Color, __webpack_require__.d(__webpack_exports__, "d", function() {
+ return darker;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return brighter;
+ }), __webpack_exports__.e = color, __webpack_exports__.h = rgbConvert, __webpack_exports__.g = rgb,
+ __webpack_exports__.b = Rgb, __webpack_exports__.f = hsl;
+ var __WEBPACK_IMPORTED_MODULE_0__define__ = __webpack_require__(189), darker = .7, brighter = 1 / darker, reI = "\\s*([+-]?\\d+)\\s*", reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex3 = /^#([0-9a-f]{3})$/, reHex6 = /^#([0-9a-f]{6})$/, reRgbInteger = new RegExp("^rgb\\(" + [ reI, reI, reI ] + "\\)$"), reRgbPercent = new RegExp("^rgb\\(" + [ reP, reP, reP ] + "\\)$"), reRgbaInteger = new RegExp("^rgba\\(" + [ reI, reI, reI, reN ] + "\\)$"), reRgbaPercent = new RegExp("^rgba\\(" + [ reP, reP, reP, reN ] + "\\)$"), reHslPercent = new RegExp("^hsl\\(" + [ reN, reP, reP ] + "\\)$"), reHslaPercent = new RegExp("^hsla\\(" + [ reN, reP, reP, reN ] + "\\)$"), named = {
+ aliceblue: 15792383,
+ antiquewhite: 16444375,
+ aqua: 65535,
+ aquamarine: 8388564,
+ azure: 15794175,
+ beige: 16119260,
+ bisque: 16770244,
+ black: 0,
+ blanchedalmond: 16772045,
+ blue: 255,
+ blueviolet: 9055202,
+ brown: 10824234,
+ burlywood: 14596231,
+ cadetblue: 6266528,
+ chartreuse: 8388352,
+ chocolate: 13789470,
+ coral: 16744272,
+ cornflowerblue: 6591981,
+ cornsilk: 16775388,
+ crimson: 14423100,
+ cyan: 65535,
+ darkblue: 139,
+ darkcyan: 35723,
+ darkgoldenrod: 12092939,
+ darkgray: 11119017,
+ darkgreen: 25600,
+ darkgrey: 11119017,
+ darkkhaki: 12433259,
+ darkmagenta: 9109643,
+ darkolivegreen: 5597999,
+ darkorange: 16747520,
+ darkorchid: 10040012,
+ darkred: 9109504,
+ darksalmon: 15308410,
+ darkseagreen: 9419919,
+ darkslateblue: 4734347,
+ darkslategray: 3100495,
+ darkslategrey: 3100495,
+ darkturquoise: 52945,
+ darkviolet: 9699539,
+ deeppink: 16716947,
+ deepskyblue: 49151,
+ dimgray: 6908265,
+ dimgrey: 6908265,
+ dodgerblue: 2003199,
+ firebrick: 11674146,
+ floralwhite: 16775920,
+ forestgreen: 2263842,
+ fuchsia: 16711935,
+ gainsboro: 14474460,
+ ghostwhite: 16316671,
+ gold: 16766720,
+ goldenrod: 14329120,
+ gray: 8421504,
+ green: 32768,
+ greenyellow: 11403055,
+ grey: 8421504,
+ honeydew: 15794160,
+ hotpink: 16738740,
+ indianred: 13458524,
+ indigo: 4915330,
+ ivory: 16777200,
+ khaki: 15787660,
+ lavender: 15132410,
+ lavenderblush: 16773365,
+ lawngreen: 8190976,
+ lemonchiffon: 16775885,
+ lightblue: 11393254,
+ lightcoral: 15761536,
+ lightcyan: 14745599,
+ lightgoldenrodyellow: 16448210,
+ lightgray: 13882323,
+ lightgreen: 9498256,
+ lightgrey: 13882323,
+ lightpink: 16758465,
+ lightsalmon: 16752762,
+ lightseagreen: 2142890,
+ lightskyblue: 8900346,
+ lightslategray: 7833753,
+ lightslategrey: 7833753,
+ lightsteelblue: 11584734,
+ lightyellow: 16777184,
+ lime: 65280,
+ limegreen: 3329330,
+ linen: 16445670,
+ magenta: 16711935,
+ maroon: 8388608,
+ mediumaquamarine: 6737322,
+ mediumblue: 205,
+ mediumorchid: 12211667,
+ mediumpurple: 9662683,
+ mediumseagreen: 3978097,
+ mediumslateblue: 8087790,
+ mediumspringgreen: 64154,
+ mediumturquoise: 4772300,
+ mediumvioletred: 13047173,
+ midnightblue: 1644912,
+ mintcream: 16121850,
+ mistyrose: 16770273,
+ moccasin: 16770229,
+ navajowhite: 16768685,
+ navy: 128,
+ oldlace: 16643558,
+ olive: 8421376,
+ olivedrab: 7048739,
+ orange: 16753920,
+ orangered: 16729344,
+ orchid: 14315734,
+ palegoldenrod: 15657130,
+ palegreen: 10025880,
+ paleturquoise: 11529966,
+ palevioletred: 14381203,
+ papayawhip: 16773077,
+ peachpuff: 16767673,
+ peru: 13468991,
+ pink: 16761035,
+ plum: 14524637,
+ powderblue: 11591910,
+ purple: 8388736,
+ rebeccapurple: 6697881,
+ red: 16711680,
+ rosybrown: 12357519,
+ royalblue: 4286945,
+ saddlebrown: 9127187,
+ salmon: 16416882,
+ sandybrown: 16032864,
+ seagreen: 3050327,
+ seashell: 16774638,
+ sienna: 10506797,
+ silver: 12632256,
+ skyblue: 8900331,
+ slateblue: 6970061,
+ slategray: 7372944,
+ slategrey: 7372944,
+ snow: 16775930,
+ springgreen: 65407,
+ steelblue: 4620980,
+ tan: 13808780,
+ teal: 32896,
+ thistle: 14204888,
+ tomato: 16737095,
+ turquoise: 4251856,
+ violet: 15631086,
+ wheat: 16113331,
+ white: 16777215,
+ whitesmoke: 16119285,
+ yellow: 16776960,
+ yellowgreen: 10145074
+ };
+ Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Color, color, {
+ displayable: function() {
+ return this.rgb().displayable();
+ },
+ toString: function() {
+ return this.rgb() + "";
+ }
+ }), Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Rgb, rgb, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(Color, {
+ brighter: function(k) {
+ return k = null == k ? brighter : Math.pow(brighter, k), new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ darker: function(k) {
+ return k = null == k ? darker : Math.pow(darker, k), new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ rgb: function() {
+ return this;
+ },
+ displayable: function() {
+ return 0 <= this.r && this.r <= 255 && 0 <= this.g && this.g <= 255 && 0 <= this.b && this.b <= 255 && 0 <= this.opacity && this.opacity <= 1;
+ },
+ toString: function() {
+ var a = this.opacity;
+ return a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)), (1 === a ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (1 === a ? ")" : ", " + a + ")");
+ }
+ })), Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Hsl, hsl, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(Color, {
+ brighter: function(k) {
+ return k = null == k ? brighter : Math.pow(brighter, k), new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ darker: function(k) {
+ return k = null == k ? darker : Math.pow(darker, k), new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ rgb: function() {
+ var h = this.h % 360 + 360 * (this.h < 0), s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < .5 ? l : 1 - l) * s, m1 = 2 * l - m2;
+ return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);
+ },
+ displayable: function() {
+ return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;
+ }
+ }));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function extend(parent, definition) {
+ var prototype = Object.create(parent.prototype);
+ for (var key in definition) prototype[key] = definition[key];
+ return prototype;
+ }
+ __webpack_exports__.b = extend, __webpack_exports__.a = function(constructor, factory, prototype) {
+ constructor.prototype = factory.prototype = prototype, prototype.constructor = constructor;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function basis(t1, v0, v1, v2, v3) {
+ var t2 = t1 * t1, t3 = t2 * t1;
+ return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
+ }
+ __webpack_exports__.a = basis, __webpack_exports__.b = function(values) {
+ var n = values.length - 1;
+ return function(t) {
+ var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
+ return basis((t - i / n) * n, v0, v1, v2, v3);
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return function() {
+ return x;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x, p) {
+ if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null;
+ var i, coefficient = x.slice(0, i);
+ return [ coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1) ];
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_1__src_millisecond__ = (__webpack_require__(18), __webpack_require__(757));
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_millisecond__.a;
+ }), __webpack_require__.d(__webpack_exports__, "n", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_millisecond__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__src_second__ = __webpack_require__(758);
+ __webpack_require__.d(__webpack_exports__, "g", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_second__.a;
+ }), __webpack_require__.d(__webpack_exports__, "r", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_second__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_3__src_minute__ = __webpack_require__(759);
+ __webpack_require__.d(__webpack_exports__, "d", function() {
+ return __WEBPACK_IMPORTED_MODULE_3__src_minute__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_4__src_hour__ = __webpack_require__(760);
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_4__src_hour__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_5__src_day__ = __webpack_require__(761);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_5__src_day__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_6__src_week__ = __webpack_require__(762);
+ __webpack_require__.d(__webpack_exports__, "j", function() {
+ return __WEBPACK_IMPORTED_MODULE_6__src_week__.b;
+ }), __webpack_require__.d(__webpack_exports__, "h", function() {
+ return __WEBPACK_IMPORTED_MODULE_6__src_week__.b;
+ }), __webpack_require__.d(__webpack_exports__, "e", function() {
+ return __WEBPACK_IMPORTED_MODULE_6__src_week__.a;
+ }), __webpack_require__.d(__webpack_exports__, "i", function() {
+ return __WEBPACK_IMPORTED_MODULE_6__src_week__.c;
+ });
+ var __WEBPACK_IMPORTED_MODULE_7__src_month__ = __webpack_require__(763);
+ __webpack_require__.d(__webpack_exports__, "f", function() {
+ return __WEBPACK_IMPORTED_MODULE_7__src_month__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_8__src_year__ = __webpack_require__(764);
+ __webpack_require__.d(__webpack_exports__, "k", function() {
+ return __WEBPACK_IMPORTED_MODULE_8__src_year__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_9__src_utcMinute__ = __webpack_require__(765);
+ __webpack_require__.d(__webpack_exports__, "o", function() {
+ return __WEBPACK_IMPORTED_MODULE_9__src_utcMinute__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_10__src_utcHour__ = __webpack_require__(766);
+ __webpack_require__.d(__webpack_exports__, "m", function() {
+ return __WEBPACK_IMPORTED_MODULE_10__src_utcHour__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_11__src_utcDay__ = __webpack_require__(767);
+ __webpack_require__.d(__webpack_exports__, "l", function() {
+ return __WEBPACK_IMPORTED_MODULE_11__src_utcDay__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__ = __webpack_require__(768);
+ __webpack_require__.d(__webpack_exports__, "u", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.b;
+ }), __webpack_require__.d(__webpack_exports__, "s", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.b;
+ }), __webpack_require__.d(__webpack_exports__, "p", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.a;
+ }), __webpack_require__.d(__webpack_exports__, "t", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.c;
+ });
+ var __WEBPACK_IMPORTED_MODULE_13__src_utcMonth__ = __webpack_require__(769);
+ __webpack_require__.d(__webpack_exports__, "q", function() {
+ return __WEBPACK_IMPORTED_MODULE_13__src_utcMonth__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_14__src_utcYear__ = __webpack_require__(770);
+ __webpack_require__.d(__webpack_exports__, "v", function() {
+ return __WEBPACK_IMPORTED_MODULE_14__src_utcYear__.a;
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return timeFormat;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return utcFormat;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return utcParse;
+ });
+ var locale, timeFormat, timeParse, utcFormat, utcParse, __WEBPACK_IMPORTED_MODULE_0__locale__ = __webpack_require__(318);
+ !function(definition) {
+ locale = Object(__WEBPACK_IMPORTED_MODULE_0__locale__.a)(definition), timeFormat = locale.format,
+ timeParse = locale.parse, utcFormat = locale.utcFormat, utcParse = locale.utcParse;
+ }({
+ dateTime: "%x, %X",
+ date: "%-m/%-d/%Y",
+ time: "%-I:%M:%S %p",
+ periods: [ "AM", "PM" ],
+ days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
+ shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
+ months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
+ shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), getPolygonPoints = function(points) {
+ return points.reduce(function(result, entry) {
+ return entry.x === +entry.x && entry.y === +entry.y && result.push([ entry.x, entry.y ]),
+ result;
+ }, []).join(" ");
+ }, Polygon = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Polygon() {
+ return _classCallCheck(this, Polygon), _possibleConstructorReturn(this, (Polygon.__proto__ || Object.getPrototypeOf(Polygon)).apply(this, arguments));
+ }
+ return _inherits(Polygon, _Component), _createClass(Polygon, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, points = _props.points, className = _props.className;
+ if (!points || !points.length) return null;
+ var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-polygon", className);
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("polygon", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props), {
+ className: layerClass,
+ points: getPolygonPoints(points)
+ }));
+ }
+ } ]), Polygon;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Polygon",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ points: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number
+ }))
+ }), _class = _temp)) || _class;
+ __webpack_exports__.a = Polygon;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_5_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react_smooth__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__shape_Curve__ = __webpack_require__(66), __WEBPACK_IMPORTED_MODULE_9__shape_Dot__ = __webpack_require__(57), __WEBPACK_IMPORTED_MODULE_10__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_11__component_LabelList__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_12__ErrorBar__ = __webpack_require__(91), __WEBPACK_IMPORTED_MODULE_13__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Line = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Line() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Line);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Line.__proto__ || Object.getPrototypeOf(Line)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !0,
+ totalLength: 0
+ }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.j)("recharts-line-"),
+ _this.cachePrevData = function(points) {
+ _this.setState({
+ prevPoints: points
+ });
+ }, _this.pathRef = function(node) {
+ _this.mainCurve = node;
+ }, _this.handleAnimationEnd = function() {
+ _this.setState({
+ isAnimationFinished: !0
+ }), _this.props.onAnimationEnd();
+ }, _this.handleAnimationStart = function() {
+ _this.setState({
+ isAnimationFinished: !1
+ }), _this.props.onAnimationStart();
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Line, _Component), _createClass(Line, [ {
+ key: "componentDidMount",
+ value: function() {
+ if (this.props.isAnimationActive) {
+ var totalLength = this.getTotalLength();
+ this.setState({
+ totalLength: totalLength
+ });
+ }
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, points = _props.points;
+ nextProps.animationId !== animationId && this.cachePrevData(points);
+ }
+ }, {
+ key: "getTotalLength",
+ value: function() {
+ var curveDom = this.mainCurve;
+ try {
+ return curveDom && curveDom.getTotalLength && curveDom.getTotalLength() || 0;
+ } catch (err) {
+ return 0;
+ }
+ }
+ }, {
+ key: "getStrokeDasharray",
+ value: function(length, totalLength, lines) {
+ for (var lineLength = lines.reduce(function(pre, next) {
+ return pre + next;
+ }), count = parseInt(length / lineLength, 10), remainLength = length % lineLength, restLength = totalLength - length, remainLines = [], i = 0, sum = 0; ;sum += lines[i],
+ ++i) if (sum + lines[i] > remainLength) {
+ remainLines = [].concat(_toConsumableArray(lines.slice(0, i)), [ remainLength - sum ]);
+ break;
+ }
+ var emptyLines = remainLines.length % 2 == 0 ? [ 0, restLength ] : [ restLength ];
+ return [].concat(_toConsumableArray(this.repeat(lines, count)), _toConsumableArray(remainLines), emptyLines).map(function(line) {
+ return line + "px";
+ }).join(", ");
+ }
+ }, {
+ key: "repeat",
+ value: function(lines, count) {
+ for (var linesUnit = lines.length % 2 != 0 ? [].concat(_toConsumableArray(lines), [ 0 ]) : lines, result = [], i = 0; i < count; ++i) result = [].concat(_toConsumableArray(result), _toConsumableArray(linesUnit));
+ return result;
+ }
+ }, {
+ key: "renderErrorBar",
+ value: function() {
+ function dataPointFormatter(dataPoint, dataKey) {
+ return {
+ x: dataPoint.x,
+ y: dataPoint.y,
+ value: dataPoint.value,
+ errorVal: Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.w)(dataPoint.payload, dataKey)
+ };
+ }
+ if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;
+ var _props2 = this.props, points = _props2.points, xAxis = _props2.xAxis, yAxis = _props2.yAxis, layout = _props2.layout, children = _props2.children, errorBarItems = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_12__ErrorBar__.a);
+ return errorBarItems ? errorBarItems.map(function(item, i) {
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(item, {
+ key: i,
+ data: points,
+ xAxis: xAxis,
+ yAxis: yAxis,
+ layout: layout,
+ dataPointFormatter: dataPointFormatter
+ });
+ }) : null;
+ }
+ }, {
+ key: "renderDotItem",
+ value: function(option, props) {
+ var dotItem = void 0;
+ if (__WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(option)) dotItem = __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(option, props); else if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option)) dotItem = option(props); else {
+ var className = __WEBPACK_IMPORTED_MODULE_6_classnames___default()("recharts-line-dot", option ? option.className : "");
+ dotItem = __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Dot__.a, _extends({}, props, {
+ className: className
+ }));
+ }
+ return dotItem;
+ }
+ }, {
+ key: "renderDots",
+ value: function() {
+ var _this2 = this;
+ if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;
+ var _props3 = this.props, dot = _props3.dot, points = _props3.points, dataKey = _props3.dataKey, lineProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), customDotProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(dot), dotEvents = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.e)(dot), dots = points.map(function(entry, i) {
+ var dotProps = _extends({
+ key: "dot-" + i,
+ r: 3
+ }, lineProps, customDotProps, dotEvents, {
+ value: entry.value,
+ dataKey: dataKey,
+ cx: entry.x,
+ cy: entry.y,
+ index: i,
+ payload: entry.payload
+ });
+ return _this2.renderDotItem(dot, dotProps);
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__container_Layer__.a, {
+ className: "recharts-line-dots",
+ key: "dots"
+ }, dots);
+ }
+ }, {
+ key: "renderCurveStatically",
+ value: function(points, needClip, props) {
+ var _props4 = this.props, type = _props4.type, layout = _props4.layout, connectNulls = _props4.connectNulls, id = _props4.id, clipPathId = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? this.id : id, curveProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.e)(this.props), {
+ fill: "none",
+ className: "recharts-line-curve",
+ clipPath: needClip ? "url(#clipPath-" + clipPathId + ")" : null,
+ points: points
+ }, props, {
+ type: type,
+ layout: layout,
+ connectNulls: connectNulls
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__shape_Curve__.a, _extends({}, curveProps, {
+ pathRef: this.pathRef
+ }));
+ }
+ }, {
+ key: "renderCurveWithAnimation",
+ value: function(needClip) {
+ var _this3 = this, _props5 = this.props, points = _props5.points, strokeDasharray = _props5.strokeDasharray, isAnimationActive = _props5.isAnimationActive, animationBegin = _props5.animationBegin, animationDuration = _props5.animationDuration, animationEasing = _props5.animationEasing, animationId = _props5.animationId, width = _props5.width, height = _props5.height, _state = (_objectWithoutProperties(_props5, [ "points", "strokeDasharray", "isAnimationActive", "animationBegin", "animationDuration", "animationEasing", "animationId", "width", "height" ]),
+ this.state), prevPoints = _state.prevPoints, totalLength = _state.totalLength;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "line-" + animationId,
+ onAnimationEnd: this.handleAnimationEnd,
+ onAnimationStart: this.handleAnimationStart
+ }, function(_ref2) {
+ var t = _ref2.t;
+ if (prevPoints) {
+ var stepData = points.map(function(entry, index) {
+ if (prevPoints[index]) {
+ var prev = prevPoints[index], _interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(prev.x, entry.x), _interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(prev.y, entry.y);
+ return _extends({}, entry, {
+ x: _interpolatorX(t),
+ y: _interpolatorY(t)
+ });
+ }
+ var interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(2 * width, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(height / 2, entry.y);
+ return _extends({}, entry, {
+ x: interpolatorX(t),
+ y: interpolatorY(t)
+ });
+ });
+ return _this3.renderCurveStatically(stepData, needClip);
+ }
+ var interpolator = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(0, totalLength), curLength = interpolator(t), currentStrokeDasharray = void 0;
+ if (strokeDasharray) {
+ var lines = strokeDasharray.split(/[,\s]+/gim).map(function(num) {
+ return parseFloat(num);
+ });
+ currentStrokeDasharray = _this3.getStrokeDasharray(curLength, totalLength, lines);
+ } else currentStrokeDasharray = curLength + "px " + (totalLength - curLength) + "px";
+ return _this3.renderCurveStatically(points, needClip, {
+ strokeDasharray: currentStrokeDasharray
+ });
+ });
+ }
+ }, {
+ key: "renderCurve",
+ value: function(needClip) {
+ var _props6 = this.props, points = _props6.points, isAnimationActive = _props6.isAnimationActive, _state2 = this.state, prevPoints = _state2.prevPoints, totalLength = _state2.totalLength;
+ return isAnimationActive && points && points.length && (!prevPoints && totalLength > 0 || !__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points)) ? this.renderCurveWithAnimation(needClip) : this.renderCurveStatically(points, needClip);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props7 = this.props, hide = _props7.hide, dot = _props7.dot, points = _props7.points, className = _props7.className, xAxis = _props7.xAxis, yAxis = _props7.yAxis, top = _props7.top, left = _props7.left, width = _props7.width, height = _props7.height, isAnimationActive = _props7.isAnimationActive, id = _props7.id;
+ if (hide || !points || !points.length) return null;
+ var isAnimationFinished = this.state.isAnimationFinished, hasSinglePoint = 1 === points.length, layerClass = __WEBPACK_IMPORTED_MODULE_6_classnames___default()("recharts-line", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? this.id : id;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__container_Layer__.a, {
+ className: layerClass
+ }, needClip ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("clipPath", {
+ id: "clipPath-" + clipPathId
+ }, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("rect", {
+ x: left,
+ y: top,
+ width: width,
+ height: height
+ }))) : null, !hasSinglePoint && this.renderCurve(needClip), this.renderErrorBar(), (hasSinglePoint || dot) && this.renderDots(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_11__component_LabelList__.a.renderCallByParent(this.props, points));
+ }
+ } ]), Line;
+ }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = "Line",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,
+ type: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),
+ unit: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ name: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ yAxis: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object,
+ xAxis: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object,
+ legendType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.b),
+ layout: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "horizontal", "vertical" ]),
+ connectNulls: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ activeDot: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool ]),
+ dot: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool ]),
+ top: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ left: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ points: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.value
+ })),
+ onAnimationStart: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ onAnimationEnd: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]),
+ animationId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ id: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string
+ }), _class2.defaultProps = {
+ xAxisId: 0,
+ yAxisId: 0,
+ connectNulls: !1,
+ activeDot: !0,
+ dot: !0,
+ legendType: "line",
+ stroke: "#3182bd",
+ strokeWidth: 1,
+ fill: "#fff",
+ points: [],
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 1500,
+ animationEasing: "ease",
+ hide: !1,
+ onAnimationStart: function() {},
+ onAnimationEnd: function() {}
+ }, _class2.getComposedData = function(_ref3) {
+ var props = _ref3.props, xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, xAxisTicks = _ref3.xAxisTicks, yAxisTicks = _ref3.yAxisTicks, dataKey = _ref3.dataKey, bandSize = _ref3.bandSize, displayedData = _ref3.displayedData, offset = _ref3.offset, layout = props.layout, points = displayedData.map(function(entry, index) {
+ var value = Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.w)(entry, dataKey);
+ return "horizontal" === layout ? {
+ x: Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.l)({
+ axis: xAxis,
+ ticks: xAxisTicks,
+ bandSize: bandSize,
+ entry: entry,
+ index: index
+ }),
+ y: __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) ? null : yAxis.scale(value),
+ value: value,
+ payload: entry
+ } : {
+ x: __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) ? null : xAxis.scale(value),
+ y: Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.l)({
+ axis: yAxis,
+ ticks: yAxisTicks,
+ bandSize: bandSize,
+ entry: entry,
+ index: index
+ }),
+ value: value,
+ payload: entry
+ };
+ });
+ return _extends({
+ points: points,
+ layout: layout
+ }, offset);
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Line;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__ = __webpack_require__(117), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_8_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_react_smooth__), __WEBPACK_IMPORTED_MODULE_9__shape_Curve__ = __webpack_require__(66), __WEBPACK_IMPORTED_MODULE_10__shape_Dot__ = __webpack_require__(57), __WEBPACK_IMPORTED_MODULE_11__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_12__component_LabelList__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_13__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_15__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Area = Object(__WEBPACK_IMPORTED_MODULE_13__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Area() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Area);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Area.__proto__ || Object.getPrototypeOf(Area)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !0
+ }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.j)("recharts-area-"),
+ _this.cachePrevData = function(points, baseLine) {
+ _this.setState({
+ prevPoints: points,
+ prevBaseLine: baseLine
+ });
+ }, _this.handleAnimationEnd = function() {
+ var onAnimationEnd = _this.props.onAnimationEnd;
+ _this.setState({
+ isAnimationFinished: !0
+ }), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(onAnimationEnd) && onAnimationEnd();
+ }, _this.handleAnimationStart = function() {
+ var onAnimationStart = _this.props.onAnimationStart;
+ _this.setState({
+ isAnimationFinished: !1
+ }), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(onAnimationStart) && onAnimationStart();
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Area, _Component), _createClass(Area, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, points = _props.points, baseLine = _props.baseLine;
+ nextProps.animationId !== animationId && this.cachePrevData(points, baseLine);
+ }
+ }, {
+ key: "renderDots",
+ value: function() {
+ var _this2 = this;
+ if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;
+ var _props2 = this.props, dot = _props2.dot, points = _props2.points, dataKey = _props2.dataKey, areaProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), customDotProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(dot), dotEvents = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.e)(dot), dots = points.map(function(entry, i) {
+ var dotProps = _extends({
+ key: "dot-" + i,
+ r: 3
+ }, areaProps, customDotProps, dotEvents, {
+ dataKey: dataKey,
+ cx: entry.x,
+ cy: entry.y,
+ index: i,
+ value: entry.value,
+ payload: entry.payload
+ });
+ return _this2.constructor.renderDotItem(dot, dotProps);
+ });
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {
+ className: "recharts-area-dots"
+ }, dots);
+ }
+ }, {
+ key: "renderHorizontalRect",
+ value: function(alpha) {
+ var _props3 = this.props, baseLine = _props3.baseLine, points = _props3.points, strokeWidth = _props3.strokeWidth, startX = points[0].x, endX = points[points.length - 1].x, width = alpha * Math.abs(startX - endX), maxY = Math.max.apply(null, points.map(function(entry) {
+ return entry.y || 0;
+ }));
+ return Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.g)(baseLine) ? maxY = Math.max(baseLine, maxY) : baseLine && __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(baseLine) && baseLine.length && (maxY = Math.max(Math.max.apply(null, baseLine.map(function(entry) {
+ return entry.y || 0;
+ })), maxY)), Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.g)(maxY) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("rect", {
+ x: startX < endX ? startX : startX - width,
+ y: 0,
+ width: width,
+ height: maxY + (strokeWidth || 1)
+ }) : null;
+ }
+ }, {
+ key: "renderVerticalRect",
+ value: function(alpha) {
+ var _props4 = this.props, baseLine = _props4.baseLine, points = _props4.points, strokeWidth = _props4.strokeWidth, startY = points[0].y, endY = points[points.length - 1].y, height = alpha * Math.abs(startY - endY), maxX = Math.max.apply(null, points.map(function(entry) {
+ return entry.x || 0;
+ }));
+ return Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.g)(baseLine) ? maxX = Math.max(baseLine, maxX) : baseLine && __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(baseLine) && baseLine.length && (maxX = Math.max(Math.max.apply(null, baseLine.map(function(entry) {
+ return entry.x || 0;
+ })), maxX)), Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.g)(maxX) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("rect", {
+ x: 0,
+ y: startY < endY ? startY : startY - height,
+ width: maxX + (strokeWidth || 1),
+ height: height
+ }) : null;
+ }
+ }, {
+ key: "renderClipRect",
+ value: function(alpha) {
+ return "vertical" === this.props.layout ? this.renderVerticalRect(alpha) : this.renderHorizontalRect(alpha);
+ }
+ }, {
+ key: "renderAreaStatically",
+ value: function(points, baseLine, needClip) {
+ var _props5 = this.props, layout = _props5.layout, type = _props5.type, stroke = _props5.stroke, connectNulls = _props5.connectNulls, isRange = _props5.isRange;
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {
+ clipPath: needClip ? "url(#clipPath-" + this.id + ")" : null
+ }, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Curve__.a, _extends({}, this.props, {
+ points: points,
+ baseLine: baseLine,
+ stroke: "none",
+ className: "recharts-area-area"
+ })), "none" !== stroke && __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Curve__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), {
+ className: "recharts-area-curve",
+ layout: layout,
+ type: type,
+ connectNulls: connectNulls,
+ fill: "none",
+ points: points
+ })), "none" !== stroke && isRange && __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Curve__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), {
+ className: "recharts-area-curve",
+ layout: layout,
+ type: type,
+ connectNulls: connectNulls,
+ fill: "none",
+ points: baseLine
+ })));
+ }
+ }, {
+ key: "renderAreaWithAnimation",
+ value: function(needClip) {
+ var _this3 = this, _props6 = this.props, points = _props6.points, baseLine = _props6.baseLine, isAnimationActive = _props6.isAnimationActive, animationBegin = _props6.animationBegin, animationDuration = _props6.animationDuration, animationEasing = _props6.animationEasing, animationId = _props6.animationId, id = _props6.id, _state = this.state, prevPoints = _state.prevPoints, prevBaseLine = _state.prevBaseLine, clipPathId = __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(id) ? this.id : id;
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "area-" + animationId,
+ onAnimationEnd: this.handleAnimationEnd,
+ onAnimationStart: this.handleAnimationStart
+ }, function(_ref2) {
+ var t = _ref2.t;
+ if (prevPoints) {
+ var stepPoints = points.map(function(entry, index) {
+ if (prevPoints[index]) {
+ var prev = prevPoints[index], interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.e)(prev.x, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.e)(prev.y, entry.y);
+ return _extends({}, entry, {
+ x: interpolatorX(t),
+ y: interpolatorY(t)
+ });
+ }
+ return entry;
+ }), stepBaseLine = void 0;
+ if (Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.g)(baseLine)) {
+ stepBaseLine = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.e)(prevBaseLine, baseLine)(t);
+ } else if (__WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(baseLine) || __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default()(baseLine)) {
+ var _interpolator = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.e)(prevBaseLine, 0);
+ stepBaseLine = _interpolator(t);
+ } else stepBaseLine = baseLine.map(function(entry, index) {
+ if (prevBaseLine[index]) {
+ var prev = prevBaseLine[index], interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.e)(prev.x, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.e)(prev.y, entry.y);
+ return _extends({}, entry, {
+ x: interpolatorX(t),
+ y: interpolatorY(t)
+ });
+ }
+ return entry;
+ });
+ return _this3.renderAreaStatically(stepPoints, stepBaseLine, needClip);
+ }
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, null, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("clipPath", {
+ id: "animationClipPath-" + clipPathId
+ }, _this3.renderClipRect(t))), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {
+ clipPath: "url(#animationClipPath-" + clipPathId + ")"
+ }, _this3.renderAreaStatically(points, baseLine, needClip)));
+ });
+ }
+ }, {
+ key: "renderArea",
+ value: function(needClip) {
+ var _props7 = this.props, points = _props7.points, baseLine = _props7.baseLine, isAnimationActive = _props7.isAnimationActive, _state2 = this.state, prevPoints = _state2.prevPoints, prevBaseLine = _state2.prevBaseLine, totalLength = _state2.totalLength;
+ return isAnimationActive && points && points.length && (!prevPoints && totalLength > 0 || !__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points) || !__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevBaseLine, baseLine)) ? this.renderAreaWithAnimation(needClip) : this.renderAreaStatically(points, baseLine, needClip);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props8 = this.props, hide = _props8.hide, dot = _props8.dot, points = _props8.points, className = _props8.className, top = _props8.top, left = _props8.left, xAxis = _props8.xAxis, yAxis = _props8.yAxis, width = _props8.width, height = _props8.height, isAnimationActive = _props8.isAnimationActive, id = _props8.id;
+ if (hide || !points || !points.length) return null;
+ var isAnimationFinished = this.state.isAnimationFinished, hasSinglePoint = 1 === points.length, layerClass = __WEBPACK_IMPORTED_MODULE_7_classnames___default()("recharts-area", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(id) ? this.id : id;
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {
+ className: layerClass
+ }, needClip ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("clipPath", {
+ id: "clipPath-" + clipPathId
+ }, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("rect", {
+ x: left,
+ y: top,
+ width: width,
+ height: height
+ }))) : null, hasSinglePoint ? null : this.renderArea(needClip), (dot || hasSinglePoint) && this.renderDots(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_12__component_LabelList__.a.renderCallByParent(this.props, points));
+ }
+ } ]), Area;
+ }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class2.displayName = "Area",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,
+ dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]).isRequired,
+ type: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]),
+ unit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ name: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),
+ yAxis: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,
+ xAxis: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,
+ stackId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),
+ legendType: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.b),
+ connectNulls: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ activeDot: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool ]),
+ dot: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool ]),
+ label: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool ]),
+ hide: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "horizontal", "vertical" ]),
+ baseLine: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ]),
+ isRange: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ points: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ value: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ])
+ })),
+ onAnimationStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ onAnimationEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,
+ animationId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]),
+ id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string
+ }), _class2.defaultProps = {
+ stroke: "#3182bd",
+ fill: "#3182bd",
+ fillOpacity: .6,
+ xAxisId: 0,
+ yAxisId: 0,
+ legendType: "line",
+ connectNulls: !1,
+ points: [],
+ dot: !1,
+ activeDot: !0,
+ hide: !1,
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 1500,
+ animationEasing: "ease"
+ }, _class2.getBaseValue = function(props, xAxis, yAxis) {
+ var layout = props.layout, baseValue = props.baseValue;
+ if (Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.g)(baseValue)) return baseValue;
+ var numericAxis = "horizontal" === layout ? yAxis : xAxis, domain = numericAxis.scale.domain();
+ if ("number" === numericAxis.type) {
+ var max = Math.max(domain[0], domain[1]), min = Math.min(domain[0], domain[1]);
+ return "dataMin" === baseValue ? min : "dataMax" === baseValue ? max : max < 0 ? max : Math.max(Math.min(domain[0], domain[1]), 0);
+ }
+ return "dataMin" === baseValue ? domain[0] : "dataMax" === baseValue ? domain[1] : domain[0];
+ }, _class2.getComposedData = function(_ref3) {
+ var props = _ref3.props, xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, xAxisTicks = _ref3.xAxisTicks, yAxisTicks = _ref3.yAxisTicks, bandSize = _ref3.bandSize, dataKey = _ref3.dataKey, stackedData = _ref3.stackedData, dataStartIndex = _ref3.dataStartIndex, displayedData = _ref3.displayedData, offset = _ref3.offset, layout = props.layout, hasStack = stackedData && stackedData.length, baseValue = Area.getBaseValue(props, xAxis, yAxis), isRange = !1, points = displayedData.map(function(entry, index) {
+ var value = void 0;
+ return hasStack ? value = stackedData[dataStartIndex + index] : (value = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.w)(entry, dataKey),
+ __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(value) ? isRange = !0 : value = [ baseValue, value ]),
+ "horizontal" === layout ? {
+ x: Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.l)({
+ axis: xAxis,
+ ticks: xAxisTicks,
+ bandSize: bandSize,
+ entry: entry,
+ index: index
+ }),
+ y: __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(value[1]) ? null : yAxis.scale(value[1]),
+ value: value,
+ payload: entry
+ } : {
+ x: __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(value[1]) ? null : xAxis.scale(value[1]),
+ y: Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.l)({
+ axis: yAxis,
+ ticks: yAxisTicks,
+ bandSize: bandSize,
+ entry: entry,
+ index: index
+ }),
+ value: value,
+ payload: entry
+ };
+ }), baseLine = void 0;
+ return baseLine = hasStack || isRange ? points.map(function(entry) {
+ return {
+ x: "horizontal" === layout ? entry.x : xAxis.scale(entry && entry.value[0]),
+ y: "horizontal" === layout ? yAxis.scale(entry && entry.value[0]) : entry.y
+ };
+ }) : "horizontal" === layout ? yAxis.scale(baseValue) : xAxis.scale(baseValue),
+ _extends({
+ points: points,
+ baseLine: baseLine,
+ layout: layout,
+ isRange: isRange
+ }, offset);
+ }, _class2.renderDotItem = function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Dot__.a, _extends({}, props, {
+ className: "recharts-area-dot"
+ }));
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Area;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_1_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_3_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_3_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_4_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_4_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react__), __WEBPACK_IMPORTED_MODULE_5_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_5_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_prop_types__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_7_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_react_smooth__), __WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__ = __webpack_require__(65), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__ErrorBar__ = __webpack_require__(91), __WEBPACK_IMPORTED_MODULE_11__component_Cell__ = __webpack_require__(85), __WEBPACK_IMPORTED_MODULE_12__component_LabelList__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_13__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_14__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Bar = Object(__WEBPACK_IMPORTED_MODULE_13__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Bar() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Bar);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Bar.__proto__ || Object.getPrototypeOf(Bar)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !1
+ }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.j)("recharts-bar-"),
+ _this.cachePrevData = function(data) {
+ _this.setState({
+ prevData: data
+ });
+ }, _this.handleAnimationEnd = function() {
+ _this.setState({
+ isAnimationFinished: !0
+ }), _this.props.onAnimationEnd();
+ }, _this.handleAnimationStart = function() {
+ _this.setState({
+ isAnimationFinished: !1
+ }), _this.props.onAnimationStart();
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Bar, _Component), _createClass(Bar, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, data = _props.data;
+ nextProps.animationId !== animationId && this.cachePrevData(data);
+ }
+ }, {
+ key: "renderRectangle",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__.a, props);
+ }
+ }, {
+ key: "renderRectanglesStatically",
+ value: function(data) {
+ var _this2 = this, shape = this.props.shape, baseProps = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.k)(this.props);
+ return data && data.map(function(entry, i) {
+ var props = _extends({}, baseProps, entry, {
+ index: i
+ });
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, _extends({
+ className: "recharts-bar-rectangle"
+ }, Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.f)(_this2.props, entry, i), {
+ key: "rectangle-" + i
+ }), _this2.renderRectangle(shape, props));
+ });
+ }
+ }, {
+ key: "renderRectanglesWithAnimation",
+ value: function() {
+ var _this3 = this, _props2 = this.props, data = _props2.data, layout = _props2.layout, isAnimationActive = _props2.isAnimationActive, animationBegin = _props2.animationBegin, animationDuration = _props2.animationDuration, animationEasing = _props2.animationEasing, animationId = _props2.animationId, prevData = (_props2.width,
+ this.state.prevData);
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "bar-" + animationId,
+ onAnimationEnd: this.handleAnimationEnd,
+ onAnimationStart: this.handleAnimationStart
+ }, function(_ref2) {
+ var t = _ref2.t, stepData = data.map(function(entry, index) {
+ var prev = prevData && prevData[index];
+ if (prev) {
+ var interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.e)(prev.x, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.e)(prev.y, entry.y), interpolatorWidth = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.e)(prev.width, entry.width), interpolatorHeight = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.e)(prev.height, entry.height);
+ return _extends({}, entry, {
+ x: interpolatorX(t),
+ y: interpolatorY(t),
+ width: interpolatorWidth(t),
+ height: interpolatorHeight(t)
+ });
+ }
+ if ("horizontal" === layout) {
+ var _interpolatorHeight = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.e)(0, entry.height), h = _interpolatorHeight(t);
+ return _extends({}, entry, {
+ y: entry.y + entry.height - h,
+ height: h
+ });
+ }
+ var interpolator = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.e)(0, entry.width), w = interpolator(t);
+ return _extends({}, entry, {
+ width: w
+ });
+ });
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, null, _this3.renderRectanglesStatically(stepData));
+ });
+ }
+ }, {
+ key: "renderRectangles",
+ value: function() {
+ var _props3 = this.props, data = _props3.data, isAnimationActive = _props3.isAnimationActive, prevData = this.state.prevData;
+ return !(isAnimationActive && data && data.length) || prevData && __WEBPACK_IMPORTED_MODULE_1_lodash_isEqual___default()(prevData, data) ? this.renderRectanglesStatically(data) : this.renderRectanglesWithAnimation();
+ }
+ }, {
+ key: "renderBackground",
+ value: function(sectors) {
+ var _this4 = this, data = this.props.data, backgroundProps = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.k)(this.props.background);
+ return data.map(function(entry, i) {
+ var background = (entry.value, entry.background), rest = _objectWithoutProperties(entry, [ "value", "background" ]);
+ if (!background) return null;
+ var props = _extends({}, rest, {
+ fill: "#eee"
+ }, background, backgroundProps, Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.f)(_this4.props, entry, i), {
+ index: i,
+ key: "background-bar-" + i,
+ className: "recharts-bar-background-rectangle"
+ });
+ return _this4.renderRectangle(background, props);
+ });
+ }
+ }, {
+ key: "renderErrorBar",
+ value: function() {
+ function dataPointFormatter(dataPoint, dataKey) {
+ return {
+ x: dataPoint.x,
+ y: dataPoint.y,
+ value: dataPoint.value,
+ errorVal: Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.w)(dataPoint, dataKey)
+ };
+ }
+ if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;
+ var _props4 = this.props, data = _props4.data, xAxis = _props4.xAxis, yAxis = _props4.yAxis, layout = _props4.layout, children = _props4.children, errorBarItems = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_10__ErrorBar__.a);
+ if (!errorBarItems) return null;
+ var offset = "vertical" === layout ? data[0].height / 2 : data[0].width / 2;
+ return errorBarItems.map(function(item, i) {
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(item, {
+ key: i,
+ data: data,
+ xAxis: xAxis,
+ yAxis: yAxis,
+ layout: layout,
+ offset: offset,
+ dataPointFormatter: dataPointFormatter
+ });
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props5 = this.props, hide = _props5.hide, data = _props5.data, className = _props5.className, xAxis = _props5.xAxis, yAxis = _props5.yAxis, left = _props5.left, top = _props5.top, width = _props5.width, height = _props5.height, isAnimationActive = _props5.isAnimationActive, background = _props5.background, id = _props5.id;
+ if (hide || !data || !data.length) return null;
+ var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_6_classnames___default()("recharts-bar", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(id) ? this.id : id;
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {
+ className: layerClass
+ }, needClip ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement("clipPath", {
+ id: "clipPath-" + clipPathId
+ }, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement("rect", {
+ x: left,
+ y: top,
+ width: width,
+ height: height
+ }))) : null, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {
+ className: "recharts-bar-rectangles",
+ clipPath: needClip ? "url(#clipPath-" + clipPathId + ")" : null
+ }, background ? this.renderBackground() : null, this.renderRectangles()), this.renderErrorBar(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_12__component_LabelList__.a.renderCallByParent(this.props, data));
+ }
+ } ]), Bar;
+ }(__WEBPACK_IMPORTED_MODULE_4_react__.Component), _class2.displayName = "Bar", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string,
+ layout: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf([ "vertical", "horizontal" ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ yAxis: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object,
+ xAxis: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object,
+ stackId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ barSize: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ unit: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number ]),
+ name: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number ]),
+ dataKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]).isRequired,
+ legendType: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.b),
+ minPointSize: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ maxBarSize: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ hide: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,
+ shape: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element ]),
+ data: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ radius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.array ]),
+ value: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.array ])
+ })),
+ onAnimationStart: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func,
+ onAnimationEnd: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func,
+ animationId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]),
+ id: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string
+ }), _class2.defaultProps = {
+ xAxisId: 0,
+ yAxisId: 0,
+ legendType: "rect",
+ minPointSize: 0,
+ hide: !1,
+ data: [],
+ layout: "vertical",
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 400,
+ animationEasing: "ease",
+ onAnimationStart: function() {},
+ onAnimationEnd: function() {}
+ }, _class2.getComposedData = function(_ref3) {
+ var props = _ref3.props, item = _ref3.item, barPosition = _ref3.barPosition, bandSize = _ref3.bandSize, xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, xAxisTicks = _ref3.xAxisTicks, yAxisTicks = _ref3.yAxisTicks, stackedData = _ref3.stackedData, dataStartIndex = _ref3.dataStartIndex, displayedData = _ref3.displayedData, offset = _ref3.offset, pos = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.f)(barPosition, item);
+ if (!pos) return [];
+ var layout = props.layout, _item$props = item.props, dataKey = _item$props.dataKey, children = _item$props.children, minPointSize = _item$props.minPointSize, numericAxis = "horizontal" === layout ? yAxis : xAxis, stackedDomain = stackedData ? numericAxis.scale.domain() : null, baseValue = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.j)({
+ props: props,
+ numericAxis: numericAxis
+ }), cells = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_11__component_Cell__.a), rects = displayedData.map(function(entry, index) {
+ var value = void 0, x = void 0, y = void 0, width = void 0, height = void 0, background = void 0;
+ if (stackedData ? value = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.C)(stackedData[dataStartIndex + index], stackedDomain) : (value = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.w)(entry, dataKey),
+ __WEBPACK_IMPORTED_MODULE_3_lodash_isArray___default()(value) || (value = [ baseValue, value ])),
+ "horizontal" === layout) {
+ if (x = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.k)({
+ axis: xAxis,
+ ticks: xAxisTicks,
+ bandSize: bandSize,
+ offset: pos.offset,
+ entry: entry,
+ index: index
+ }), y = yAxis.scale(value[1]), width = pos.size, height = yAxis.scale(value[0]) - yAxis.scale(value[1]),
+ background = {
+ x: x,
+ y: yAxis.y,
+ width: width,
+ height: yAxis.height
+ }, Math.abs(minPointSize) > 0 && Math.abs(height) < Math.abs(minPointSize)) {
+ var delta = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.i)(height || minPointSize) * (Math.abs(minPointSize) - Math.abs(height));
+ y -= delta, height += delta;
+ }
+ } else if (x = xAxis.scale(value[0]), y = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.k)({
+ axis: yAxis,
+ ticks: yAxisTicks,
+ bandSize: bandSize,
+ offset: pos.offset,
+ entry: entry,
+ index: index
+ }), width = xAxis.scale(value[1]) - xAxis.scale(value[0]), height = pos.size, background = {
+ x: xAxis.x,
+ y: y,
+ width: xAxis.width,
+ height: height
+ }, Math.abs(minPointSize) > 0 && Math.abs(width) < Math.abs(minPointSize)) {
+ var _delta = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.i)(width || minPointSize) * (Math.abs(minPointSize) - Math.abs(width));
+ width += _delta;
+ }
+ return _extends({}, entry, {
+ x: x,
+ y: y,
+ width: width,
+ height: height,
+ value: stackedData ? value : value[1],
+ payload: entry,
+ background: background
+ }, cells && cells[index] && cells[index].props);
+ });
+ return _extends({
+ data: rects,
+ layout: layout
+ }, offset);
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Bar;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_5_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react_smooth__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__component_LabelList__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_11__ZAxis__ = __webpack_require__(131), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(66), __WEBPACK_IMPORTED_MODULE_13__shape_Symbols__ = __webpack_require__(172), __WEBPACK_IMPORTED_MODULE_14__ErrorBar__ = __webpack_require__(91), __WEBPACK_IMPORTED_MODULE_15__component_Cell__ = __webpack_require__(85), __WEBPACK_IMPORTED_MODULE_16__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Scatter = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Scatter() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Scatter);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Scatter.__proto__ || Object.getPrototypeOf(Scatter)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !1
+ }, _this.cachePrevPoints = function(points) {
+ _this.setState({
+ prevPoints: points
+ });
+ }, _this.handleAnimationEnd = function() {
+ _this.setState({
+ isAnimationFinished: !0
+ });
+ }, _this.handleAnimationStart = function() {
+ _this.setState({
+ isAnimationFinished: !1
+ });
+ }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.j)("recharts-scatter-"),
+ _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Scatter, _Component), _createClass(Scatter, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, points = _props.points;
+ nextProps.animationId !== animationId && this.cachePrevPoints(points);
+ }
+ }, {
+ key: "renderSymbolItem",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__shape_Symbols__.a, _extends({}, props, {
+ type: option
+ }));
+ }
+ }, {
+ key: "renderSymbolsStatically",
+ value: function(points) {
+ var _this2 = this, _props2 = this.props, shape = _props2.shape, activeShape = _props2.activeShape, activeIndex = _props2.activeIndex, baseProps = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.k)(this.props);
+ return points.map(function(entry, i) {
+ var props = _extends({
+ key: "symbol-" + i
+ }, baseProps, entry);
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({
+ className: "recharts-scatter-symbol"
+ }, Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.f)(_this2.props, entry, i), {
+ key: "symbol-" + i
+ }), _this2.renderSymbolItem(activeIndex === i ? activeShape : shape, props));
+ });
+ }
+ }, {
+ key: "renderSymbolsWithAnimation",
+ value: function() {
+ var _this3 = this, _props3 = this.props, points = _props3.points, isAnimationActive = _props3.isAnimationActive, animationBegin = _props3.animationBegin, animationDuration = _props3.animationDuration, animationEasing = _props3.animationEasing, animationId = _props3.animationId, prevPoints = this.state.prevPoints;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "pie-" + animationId,
+ onAnimationEnd: this.handleAnimationEnd,
+ onAnimationStart: this.handleAnimationStart
+ }, function(_ref2) {
+ var t = _ref2.t, stepData = points.map(function(entry, index) {
+ var prev = prevPoints && prevPoints[index];
+ if (prev) {
+ var interpolatorCx = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.e)(prev.cx, entry.cx), interpolatorCy = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.e)(prev.cy, entry.cy), interpolatorSize = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.e)(prev.size, entry.size);
+ return _extends({}, entry, {
+ cx: interpolatorCx(t),
+ cy: interpolatorCy(t),
+ size: interpolatorSize(t)
+ });
+ }
+ var interpolator = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.e)(0, entry.size);
+ return _extends({}, entry, {
+ size: interpolator(t)
+ });
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, null, _this3.renderSymbolsStatically(stepData));
+ });
+ }
+ }, {
+ key: "renderSymbols",
+ value: function() {
+ var _props4 = this.props, points = _props4.points, isAnimationActive = _props4.isAnimationActive, prevPoints = this.state.prevPoints;
+ return !(isAnimationActive && points && points.length) || prevPoints && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points) ? this.renderSymbolsStatically(points) : this.renderSymbolsWithAnimation();
+ }
+ }, {
+ key: "renderErrorBar",
+ value: function() {
+ function dataPointFormatterY(dataPoint, dataKey) {
+ return {
+ x: dataPoint.cx,
+ y: dataPoint.cy,
+ value: dataPoint.y,
+ errorVal: Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.w)(dataPoint, dataKey)
+ };
+ }
+ function dataPointFormatterX(dataPoint, dataKey) {
+ return {
+ x: dataPoint.cx,
+ y: dataPoint.cy,
+ value: dataPoint.x,
+ errorVal: Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.w)(dataPoint, dataKey)
+ };
+ }
+ if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;
+ var _props5 = this.props, points = _props5.points, xAxis = _props5.xAxis, yAxis = _props5.yAxis, children = _props5.children, errorBarItems = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_14__ErrorBar__.a);
+ return errorBarItems ? errorBarItems.map(function(item, i) {
+ var direction = item.props.direction;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(item, {
+ key: i,
+ data: points,
+ xAxis: xAxis,
+ yAxis: yAxis,
+ layout: "x" === direction ? "vertical" : "horizontal",
+ dataPointFormatter: "x" === direction ? dataPointFormatterX : dataPointFormatterY
+ });
+ }) : null;
+ }
+ }, {
+ key: "renderLine",
+ value: function() {
+ var _props6 = this.props, points = _props6.points, line = _props6.line, lineType = _props6.lineType, lineJointType = _props6.lineJointType, scatterProps = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.k)(this.props), customLineProps = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.k)(line), linePoints = void 0, lineItem = void 0;
+ "joint" === lineType && (linePoints = points.map(function(entry) {
+ return {
+ x: entry.cx,
+ y: entry.cy
+ };
+ }));
+ var lineProps = _extends({}, scatterProps, {
+ fill: "none",
+ stroke: scatterProps && scatterProps.fill
+ }, customLineProps, {
+ points: linePoints
+ });
+ return lineItem = __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(line) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(line, lineProps) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(line) ? line(lineProps) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a, _extends({}, lineProps, {
+ type: lineJointType
+ })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-scatter-line",
+ key: "recharts-scatter-line"
+ }, lineItem);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props7 = this.props, hide = _props7.hide, points = _props7.points, line = _props7.line, className = _props7.className, xAxis = _props7.xAxis, yAxis = _props7.yAxis, left = _props7.left, top = _props7.top, width = _props7.width, height = _props7.height, id = _props7.id;
+ if (hide || !points || !points.length) return null;
+ var _state = this.state, isAnimationActive = _state.isAnimationActive, isAnimationFinished = _state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_6_classnames___default()("recharts-scatter", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? this.id : id;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: layerClass,
+ clipPath: needClip ? "url(#clipPath-" + clipPathId + ")" : null
+ }, needClip ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("clipPath", {
+ id: "clipPath-" + clipPathId
+ }, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("rect", {
+ x: left,
+ y: top,
+ width: width,
+ height: height
+ }))) : null, line && this.renderLine(), this.renderErrorBar(), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ key: "recharts-scatter-symbols"
+ }, this.renderSymbols()), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_9__component_LabelList__.a.renderCallByParent(this.props, points));
+ }
+ } ]), Scatter;
+ }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = "Scatter",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.a, __WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.c, {
+ xAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ zAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ line: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),
+ lineType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "fitting", "joint" ]),
+ lineJointType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),
+ legendType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.b),
+ className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,
+ name: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ activeIndex: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ activeShape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),
+ shape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "circle", "cross", "diamond", "square", "star", "triangle", "wye" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),
+ points: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ size: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ node: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),
+ y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),
+ z: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ])
+ }),
+ payload: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.any
+ })),
+ hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ animationId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ])
+ }), _class2.defaultProps = {
+ xAxisId: 0,
+ yAxisId: 0,
+ zAxisId: 0,
+ legendType: "circle",
+ lineType: "joint",
+ lineJointType: "linear",
+ data: [],
+ shape: "circle",
+ hide: !1,
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 400,
+ animationEasing: "linear"
+ }, _class2.getComposedData = function(_ref3) {
+ var xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, zAxis = _ref3.zAxis, item = _ref3.item, displayedData = _ref3.displayedData, onItemMouseLeave = _ref3.onItemMouseLeave, onItemMouseEnter = _ref3.onItemMouseEnter, offset = _ref3.offset, xAxisTicks = _ref3.xAxisTicks, cells = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.h)(item.props.children, __WEBPACK_IMPORTED_MODULE_15__component_Cell__.a), xAxisDataKey = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(xAxis.dataKey) ? item.props.dataKey : xAxis.dataKey, yAxisDataKey = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(yAxis.dataKey) ? item.props.dataKey : yAxis.dataKey, zAxisDataKey = zAxis && zAxis.dataKey, defaultRangeZ = zAxis ? zAxis.range : __WEBPACK_IMPORTED_MODULE_11__ZAxis__.a.defaultProps.range, defaultZ = defaultRangeZ && defaultRangeZ[0], xBandSize = xAxis.scale.bandwidth ? xAxis.scale.bandwidth() : 0, yBandSize = yAxis.scale.bandwidth ? yAxis.scale.bandwidth() : 0, points = displayedData.map(function(entry, index) {
+ var x = entry[xAxisDataKey], y = entry[yAxisDataKey], z = !__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(zAxisDataKey) && entry[zAxisDataKey] || "-", tooltipPayload = [ {
+ name: xAxis.name || xAxis.dataKey,
+ unit: xAxis.unit || "",
+ value: x,
+ payload: entry
+ }, {
+ name: yAxis.name || yAxis.dataKey,
+ unit: yAxis.unit || "",
+ value: y,
+ payload: entry
+ } ];
+ "-" !== z && tooltipPayload.push({
+ name: zAxis.name || zAxis.dataKey,
+ unit: zAxis.unit || "",
+ value: z,
+ payload: entry
+ });
+ var cx = Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.l)({
+ axis: xAxis,
+ ticks: xAxisTicks,
+ bandSize: xBandSize,
+ entry: entry,
+ index: index
+ }), cy = Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.l)({
+ axis: yAxis,
+ ticks: xAxisTicks,
+ bandSize: yBandSize,
+ entry: entry,
+ index: index
+ }), size = "-" !== z ? zAxis.scale(z) : defaultZ, radius = Math.sqrt(Math.max(size, 0) / Math.PI);
+ return _extends({}, entry, {
+ cx: cx,
+ cy: cy,
+ x: cx - radius,
+ y: cy - radius,
+ xAxis: xAxis,
+ yAxis: yAxis,
+ zAxis: zAxis,
+ width: 2 * radius,
+ height: 2 * radius,
+ size: size,
+ node: {
+ x: x,
+ y: y,
+ z: z
+ },
+ tooltipPayload: tooltipPayload,
+ tooltipPosition: {
+ x: cx,
+ y: cy
+ },
+ payload: entry
+ }, cells && cells[index] && cells[index].props);
+ });
+ return _extends({
+ onMouseLeave: onItemMouseLeave,
+ onMouseEnter: onItemMouseEnter,
+ points: points
+ }, offset);
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Scatter;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var canUseDOM = !("undefined" == typeof window || !window.document || !window.document.createElement), ExecutionEnvironment = {
+ canUseDOM: canUseDOM,
+ canUseWorkers: "undefined" != typeof Worker,
+ canUseEventListeners: canUseDOM && !(!window.addEventListener && !window.attachEvent),
+ canUseViewport: canUseDOM && !!window.screen,
+ isInWorker: !canUseDOM
+ };
+ module.exports = ExecutionEnvironment;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ var emptyFunction = __webpack_require__(39), EventListener = {
+ listen: function(target, eventType, callback) {
+ return target.addEventListener ? (target.addEventListener(eventType, callback, !1),
+ {
+ remove: function() {
+ target.removeEventListener(eventType, callback, !1);
+ }
+ }) : target.attachEvent ? (target.attachEvent("on" + eventType, callback), {
+ remove: function() {
+ target.detachEvent("on" + eventType, callback);
+ }
+ }) : void 0;
+ },
+ capture: function(target, eventType, callback) {
+ return target.addEventListener ? (target.addEventListener(eventType, callback, !0),
+ {
+ remove: function() {
+ target.removeEventListener(eventType, callback, !0);
+ }
+ }) : ("production" !== process.env.NODE_ENV && console.error("Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events."),
+ {
+ remove: emptyFunction
+ });
+ },
+ registerDefault: function() {}
+ };
+ module.exports = EventListener;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function getActiveElement(doc) {
+ if (void 0 === (doc = doc || ("undefined" != typeof document ? document : void 0))) return null;
+ try {
+ return doc.activeElement || doc.body;
+ } catch (e) {
+ return doc.body;
+ }
+ }
+ module.exports = getActiveElement;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function containsNode(outerNode, innerNode) {
+ return !(!outerNode || !innerNode) && (outerNode === innerNode || !isTextNode(outerNode) && (isTextNode(innerNode) ? containsNode(outerNode, innerNode.parentNode) : "contains" in outerNode ? outerNode.contains(innerNode) : !!outerNode.compareDocumentPosition && !!(16 & outerNode.compareDocumentPosition(innerNode))));
+ }
+ var isTextNode = __webpack_require__(335);
+ module.exports = containsNode;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function focusNode(node) {
+ try {
+ node.focus();
+ } catch (e) {}
+ }
+ module.exports = focusNode;
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(343),
+ __esModule: !0
+ };
+}, function(module, exports) {
+ module.exports = function(it) {
+ if ("function" != typeof it) throw TypeError(it + " is not a function!");
+ return it;
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = !__webpack_require__(25) && !__webpack_require__(49)(function() {
+ return 7 != Object.defineProperty(__webpack_require__(208)("div"), "a", {
+ get: function() {
+ return 7;
+ }
+ }).a;
+ });
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(35), document = __webpack_require__(24).document, is = isObject(document) && isObject(document.createElement);
+ module.exports = function(it) {
+ return is ? document.createElement(it) : {};
+ };
+}, function(module, exports, __webpack_require__) {
+ var has = __webpack_require__(50), toIObject = __webpack_require__(58), arrayIndexOf = __webpack_require__(346)(!1), IE_PROTO = __webpack_require__(139)("IE_PROTO");
+ module.exports = function(object, names) {
+ var key, O = toIObject(object), i = 0, result = [];
+ for (key in O) key != IE_PROTO && has(O, key) && result.push(key);
+ for (;names.length > i; ) has(O, key = names[i++]) && (~arrayIndexOf(result, key) || result.push(key));
+ return result;
+ };
+}, function(module, exports, __webpack_require__) {
+ var has = __webpack_require__(50), toObject = __webpack_require__(59), IE_PROTO = __webpack_require__(139)("IE_PROTO"), ObjectProto = Object.prototype;
+ module.exports = Object.getPrototypeOf || function(O) {
+ return O = toObject(O), has(O, IE_PROTO) ? O[IE_PROTO] : "function" == typeof O.constructor && O instanceof O.constructor ? O.constructor.prototype : O instanceof Object ? ObjectProto : null;
+ };
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19), core = __webpack_require__(17), fails = __webpack_require__(49);
+ module.exports = function(KEY, exec) {
+ var fn = (core.Object || {})[KEY] || Object[KEY], exp = {};
+ exp[KEY] = exec(fn), $export($export.S + $export.F * fails(function() {
+ fn(1);
+ }), "Object", exp);
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = __webpack_require__(40);
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(358);
+ for (var global = __webpack_require__(24), hide = __webpack_require__(40), Iterators = __webpack_require__(73), TO_STRING_TAG = __webpack_require__(21)("toStringTag"), DOMIterables = "CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","), i = 0; i < DOMIterables.length; i++) {
+ var NAME = DOMIterables[i], Collection = global[NAME], proto = Collection && Collection.prototype;
+ proto && !proto[TO_STRING_TAG] && hide(proto, TO_STRING_TAG, NAME), Iterators[NAME] = Iterators.Array;
+ }
+}, function(module, exports) {
+ module.exports = function(done, value) {
+ return {
+ value: value,
+ done: !!done
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var cof = __webpack_require__(136);
+ module.exports = Array.isArray || function(arg) {
+ return "Array" == cof(arg);
+ };
+}, function(module, exports, __webpack_require__) {
+ var $keys = __webpack_require__(209), hiddenKeys = __webpack_require__(141).concat("length", "prototype");
+ exports.f = Object.getOwnPropertyNames || function(O) {
+ return $keys(O, hiddenKeys);
+ };
+}, function(module, exports, __webpack_require__) {
+ var pIE = __webpack_require__(99), createDesc = __webpack_require__(71), toIObject = __webpack_require__(58), toPrimitive = __webpack_require__(134), has = __webpack_require__(50), IE8_DOM_DEFINE = __webpack_require__(207), gOPD = Object.getOwnPropertyDescriptor;
+ exports.f = __webpack_require__(25) ? gOPD : function(O, P) {
+ if (O = toIObject(O), P = toPrimitive(P, !0), IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) {}
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+ };
+}, function(module, exports) {}, function(module, exports, __webpack_require__) {
+ var hide = __webpack_require__(40);
+ module.exports = function(target, src, safe) {
+ for (var key in src) safe && target[key] ? target[key] = src[key] : hide(target, key, src[key]);
+ return target;
+ };
+}, function(module, exports) {
+ module.exports = function(it, Constructor, name, forbiddenField) {
+ if (!(it instanceof Constructor) || void 0 !== forbiddenField && forbiddenField in it) throw TypeError(name + ": incorrect invocation!");
+ return it;
+ };
+}, function(module, exports, __webpack_require__) {
+ var anObject = __webpack_require__(48);
+ module.exports = function(iterator, fn, value, entries) {
+ try {
+ return entries ? fn(anObject(value)[0], value[1]) : fn(value);
+ } catch (e) {
+ var ret = iterator.return;
+ throw void 0 !== ret && anObject(ret.call(iterator)), e;
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ var Iterators = __webpack_require__(73), ITERATOR = __webpack_require__(21)("iterator"), ArrayProto = Array.prototype;
+ module.exports = function(it) {
+ return void 0 !== it && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
+ };
+}, function(module, exports, __webpack_require__) {
+ var classof = __webpack_require__(224), ITERATOR = __webpack_require__(21)("iterator"), Iterators = __webpack_require__(73);
+ module.exports = __webpack_require__(17).getIteratorMethod = function(it) {
+ if (void 0 != it) return it[ITERATOR] || it["@@iterator"] || Iterators[classof(it)];
+ };
+}, function(module, exports, __webpack_require__) {
+ var cof = __webpack_require__(136), TAG = __webpack_require__(21)("toStringTag"), ARG = "Arguments" == cof(function() {
+ return arguments;
+ }()), tryGet = function(it, key) {
+ try {
+ return it[key];
+ } catch (e) {}
+ };
+ module.exports = function(it) {
+ var O, T, B;
+ return void 0 === it ? "Undefined" : null === it ? "Null" : "string" == typeof (T = tryGet(O = Object(it), TAG)) ? T : ARG ? cof(O) : "Object" == (B = cof(O)) && "function" == typeof O.callee ? "Arguments" : B;
+ };
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(35);
+ module.exports = function(it, TYPE) {
+ if (!isObject(it) || it._t !== TYPE) throw TypeError("Incompatible receiver, " + TYPE + " required!");
+ return it;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var getDisplayName = function(Component) {
+ if ("string" == typeof Component) return Component;
+ if (Component) return Component.displayName || Component.name || "Component";
+ };
+ exports.default = getDisplayName;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ exports.jss = "64a55d578f856d258dc345b094a2a2b3", exports.sheetsRegistry = "d4bd0baacbc52bbd48bbb9eb24344ecd",
+ exports.managers = "b768b78919504fba9de2c03545c5cd3a", exports.sheetOptions = "6fc570d6bd61383819d0f9e7407c452d";
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.create = exports.createGenerateClassName = exports.sheets = exports.RuleList = exports.SheetsManager = exports.SheetsRegistry = exports.toCssValue = exports.getDynamicStyles = void 0;
+ var _getDynamicStyles = __webpack_require__(418);
+ Object.defineProperty(exports, "getDynamicStyles", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_getDynamicStyles).default;
+ }
+ });
+ var _toCssValue = __webpack_require__(105);
+ Object.defineProperty(exports, "toCssValue", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_toCssValue).default;
+ }
+ });
+ var _SheetsRegistry = __webpack_require__(229);
+ Object.defineProperty(exports, "SheetsRegistry", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_SheetsRegistry).default;
+ }
+ });
+ var _SheetsManager = __webpack_require__(419);
+ Object.defineProperty(exports, "SheetsManager", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_SheetsManager).default;
+ }
+ });
+ var _RuleList = __webpack_require__(76);
+ Object.defineProperty(exports, "RuleList", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_RuleList).default;
+ }
+ });
+ var _sheets = __webpack_require__(155);
+ Object.defineProperty(exports, "sheets", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_sheets).default;
+ }
+ });
+ var _createGenerateClassName = __webpack_require__(232);
+ Object.defineProperty(exports, "createGenerateClassName", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_createGenerateClassName).default;
+ }
+ });
+ var _Jss = __webpack_require__(426), _Jss2 = _interopRequireDefault(_Jss), create = exports.create = function(options) {
+ return new _Jss2.default(options);
+ };
+ exports.default = create();
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), SheetsRegistry = function() {
+ function SheetsRegistry() {
+ _classCallCheck(this, SheetsRegistry), this.registry = [];
+ }
+ return _createClass(SheetsRegistry, [ {
+ key: "add",
+ value: function(sheet) {
+ var registry = this.registry, index = sheet.options.index;
+ if (-1 === registry.indexOf(sheet)) {
+ if (0 === registry.length || index >= this.index) return void registry.push(sheet);
+ for (var i = 0; i < registry.length; i++) if (registry[i].options.index > index) return void registry.splice(i, 0, sheet);
+ }
+ }
+ }, {
+ key: "reset",
+ value: function() {
+ this.registry = [];
+ }
+ }, {
+ key: "remove",
+ value: function(sheet) {
+ var index = this.registry.indexOf(sheet);
+ this.registry.splice(index, 1);
+ }
+ }, {
+ key: "toString",
+ value: function(options) {
+ return this.registry.filter(function(sheet) {
+ return sheet.attached;
+ }).map(function(sheet) {
+ return sheet.toString(options);
+ }).join("\n");
+ }
+ }, {
+ key: "index",
+ get: function() {
+ return 0 === this.registry.length ? 0 : this.registry[this.registry.length - 1].options.index;
+ }
+ } ]), SheetsRegistry;
+ }();
+ exports.default = SheetsRegistry;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _symbolObservable = __webpack_require__(421), _symbolObservable2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_symbolObservable);
+ exports.default = function(value) {
+ return value && value[_symbolObservable2.default] && value === value[_symbolObservable2.default]();
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function linkRule(rule, cssRule) {
+ rule.renderable = cssRule, rule.rules && cssRule.cssRules && rule.rules.link(cssRule.cssRules);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = linkRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _StyleSheet = __webpack_require__(233), _moduleId = (_interopRequireDefault(_StyleSheet),
+ __webpack_require__(425)), _moduleId2 = _interopRequireDefault(_moduleId), env = process.env.NODE_ENV;
+ exports.default = function() {
+ var ruleCounter = 0, defaultPrefix = "production" === env ? "c" : "";
+ return function(rule, sheet) {
+ (ruleCounter += 1) > 1e10 && (0, _warning2.default)(!1, "[JSS] You might have a memory leak. Rule counter is at %s.", ruleCounter);
+ var prefix = defaultPrefix, jssId = "";
+ return sheet && (prefix = sheet.options.classNamePrefix || defaultPrefix, null != sheet.options.jss.id && (jssId += sheet.options.jss.id)),
+ "production" === env ? "" + prefix + _moduleId2.default + jssId + ruleCounter : prefix + rule.key + "-" + _moduleId2.default + (jssId && "-" + jssId) + "-" + ruleCounter;
+ };
+ };
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _linkRule = __webpack_require__(231), _linkRule2 = _interopRequireDefault(_linkRule), _RuleList = __webpack_require__(76), _RuleList2 = _interopRequireDefault(_RuleList), StyleSheet = function() {
+ function StyleSheet(styles, options) {
+ _classCallCheck(this, StyleSheet), this.attached = !1, this.deployed = !1, this.linked = !1,
+ this.classes = {}, this.options = _extends({}, options, {
+ sheet: this,
+ parent: this,
+ classes: this.classes
+ }), this.renderer = new options.Renderer(this), this.rules = new _RuleList2.default(this.options);
+ for (var name in styles) this.rules.add(name, styles[name]);
+ this.rules.process();
+ }
+ return _createClass(StyleSheet, [ {
+ key: "attach",
+ value: function() {
+ return this.attached ? this : (this.deployed || this.deploy(), this.renderer.attach(),
+ !this.linked && this.options.link && this.link(), this.attached = !0, this);
+ }
+ }, {
+ key: "detach",
+ value: function() {
+ return this.attached ? (this.renderer.detach(), this.attached = !1, this) : this;
+ }
+ }, {
+ key: "addRule",
+ value: function(name, decl, options) {
+ var queue = this.queue;
+ this.attached && !queue && (this.queue = []);
+ var rule = this.rules.add(name, decl, options);
+ return this.options.jss.plugins.onProcessRule(rule), this.attached ? this.deployed ? (queue ? queue.push(rule) : (this.insertRule(rule),
+ this.queue && (this.queue.forEach(this.insertRule, this), this.queue = void 0)),
+ rule) : rule : (this.deployed = !1, rule);
+ }
+ }, {
+ key: "insertRule",
+ value: function(rule) {
+ var renderable = this.renderer.insertRule(rule);
+ renderable && this.options.link && (0, _linkRule2.default)(rule, renderable);
+ }
+ }, {
+ key: "addRules",
+ value: function(styles, options) {
+ var added = [];
+ for (var name in styles) added.push(this.addRule(name, styles[name], options));
+ return added;
+ }
+ }, {
+ key: "getRule",
+ value: function(name) {
+ return this.rules.get(name);
+ }
+ }, {
+ key: "deleteRule",
+ value: function(name) {
+ var rule = this.rules.get(name);
+ return !!rule && (this.rules.remove(rule), !this.attached || !rule.renderable || this.renderer.deleteRule(rule.renderable));
+ }
+ }, {
+ key: "indexOf",
+ value: function(rule) {
+ return this.rules.indexOf(rule);
+ }
+ }, {
+ key: "deploy",
+ value: function() {
+ return this.renderer.deploy(), this.deployed = !0, this;
+ }
+ }, {
+ key: "link",
+ value: function() {
+ var cssRules = this.renderer.getRules();
+ return cssRules && this.rules.link(cssRules), this.linked = !0, this;
+ }
+ }, {
+ key: "update",
+ value: function(name, data) {
+ return this.rules.update(name, data), this;
+ }
+ }, {
+ key: "toString",
+ value: function(options) {
+ return this.rules.toString(options);
+ }
+ } ]), StyleSheet;
+ }();
+ exports.default = StyleSheet;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _ButtonBase = __webpack_require__(463);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ButtonBase).default;
+ }
+ });
+}, function(module, exports) {
+ exports = module.exports = function(searchInput) {
+ if (searchInput && "object" == typeof searchInput) {
+ var hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode;
+ hasKeyCode && (searchInput = hasKeyCode);
+ }
+ if ("number" == typeof searchInput) return names[searchInput];
+ var search = String(searchInput), foundNamedKey = codes[search.toLowerCase()];
+ if (foundNamedKey) return foundNamedKey;
+ var foundNamedKey = aliases[search.toLowerCase()];
+ return foundNamedKey || (1 === search.length ? search.charCodeAt(0) : void 0);
+ };
+ var codes = exports.code = exports.codes = {
+ backspace: 8,
+ tab: 9,
+ enter: 13,
+ shift: 16,
+ ctrl: 17,
+ alt: 18,
+ "pause/break": 19,
+ "caps lock": 20,
+ esc: 27,
+ space: 32,
+ "page up": 33,
+ "page down": 34,
+ end: 35,
+ home: 36,
+ left: 37,
+ up: 38,
+ right: 39,
+ down: 40,
+ insert: 45,
+ delete: 46,
+ command: 91,
+ "left command": 91,
+ "right command": 93,
+ "numpad *": 106,
+ "numpad +": 107,
+ "numpad -": 109,
+ "numpad .": 110,
+ "numpad /": 111,
+ "num lock": 144,
+ "scroll lock": 145,
+ "my computer": 182,
+ "my calculator": 183,
+ ";": 186,
+ "=": 187,
+ ",": 188,
+ "-": 189,
+ ".": 190,
+ "/": 191,
+ "`))) + (("`" + (`": 192,
+ "[": 219,
+ "\\": 220,
+ "]": 221,
+ "'": 222
+ }, aliases = exports.aliases = {
+ windows: 91,
+ "⇧": 16,
+ "⌥": 18,
+ "⌃": 17,
+ "⌘": 91,
+ ctl: 17,
+ control: 17,
+ option: 18,
+ pause: 19,
+ break: 19,
+ caps: 20,
+ return: 13,
+ escape: 27,
+ spc: 32,
+ pgup: 33,
+ pgdn: 34,
+ ins: 45,
+ del: 46,
+ cmd: 91
+ };
+ for (i = 97; i < 123; i++) codes[String.fromCharCode(i)] = i - 32;
+ for (var i = 48; i < 58; i++) codes[i - 48] = i;
+ for (i = 1; i < 13; i++) codes["f" + i] = i + 111;
+ for (i = 0; i < 10; i++) codes["numpad " + i] = i + 96;
+ var names = exports.names = exports.title = {};
+ for (i in codes) names[codes[i]] = i;
+ for (var alias in aliases) codes[alias] = aliases[alias];
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ exports.__esModule = !0;
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _ChildMapping = __webpack_require__(475), values = Object.values || function(obj) {
+ return Object.keys(obj).map(function(k) {
+ return obj[k];
+ });
+ }, propTypes = {
+ component: _propTypes2.default.any,
+ children: _propTypes2.default.node,
+ appear: _propTypes2.default.bool,
+ enter: _propTypes2.default.bool,
+ exit: _propTypes2.default.bool,
+ childFactory: _propTypes2.default.func
+ }, defaultProps = {
+ component: "div",
+ childFactory: function(child) {
+ return child;
+ }
+ }, TransitionGroup = function(_React$Component) {
+ function TransitionGroup(props, context) {
+ _classCallCheck(this, TransitionGroup);
+ var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
+ return _this.handleExited = function(key, node, originalHandler) {
+ var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);
+ key in currentChildMapping || (originalHandler && originalHandler(node), _this.setState(function(state) {
+ var children = _extends({}, state.children);
+ return delete children[key], {
+ children: children
+ };
+ }));
+ }, _this.state = {
+ children: (0, _ChildMapping.getChildMapping)(props.children, function(child) {
+ var onExited = function(node) {
+ _this.handleExited(child.key, node, child.props.onExited);
+ };
+ return (0, _react.cloneElement)(child, {
+ onExited: onExited,
+ in: !0,
+ appear: _this.getProp(child, "appear"),
+ enter: _this.getProp(child, "enter"),
+ exit: _this.getProp(child, "exit")
+ });
+ })
+ }, _this;
+ }
+ return _inherits(TransitionGroup, _React$Component), TransitionGroup.prototype.getChildContext = function() {
+ return {
+ transitionGroup: {
+ isMounting: !this.appeared
+ }
+ };
+ }, TransitionGroup.prototype.getProp = function(child, prop) {
+ var props = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.props;
+ return null != props[prop] ? props[prop] : child.props[prop];
+ }, TransitionGroup.prototype.componentDidMount = function() {
+ this.appeared = !0;
+ }, TransitionGroup.prototype.componentWillReceiveProps = function(nextProps) {
+ var _this2 = this, prevChildMapping = this.state.children, nextChildMapping = (0,
+ _ChildMapping.getChildMapping)(nextProps.children), children = (0, _ChildMapping.mergeChildMappings)(prevChildMapping, nextChildMapping);
+ Object.keys(children).forEach(function(key) {
+ var child = children[key];
+ if ((0, _react.isValidElement)(child)) {
+ var onExited = function(node) {
+ _this2.handleExited(child.key, node, child.props.onExited);
+ }, hasPrev = key in prevChildMapping, hasNext = key in nextChildMapping, prevChild = prevChildMapping[key], isLeaving = (0,
+ _react.isValidElement)(prevChild) && !prevChild.props.in;
+ !hasNext || hasPrev && !isLeaving ? hasNext || !hasPrev || isLeaving ? hasNext && hasPrev && (0,
+ _react.isValidElement)(prevChild) && (children[key] = (0, _react.cloneElement)(child, {
+ onExited: onExited,
+ in: prevChild.props.in,
+ exit: _this2.getProp(child, "exit", nextProps),
+ enter: _this2.getProp(child, "enter", nextProps)
+ })) : children[key] = (0, _react.cloneElement)(child, {
+ in: !1
+ }) : children[key] = (0, _react.cloneElement)(child, {
+ onExited: onExited,
+ in: !0,
+ exit: _this2.getProp(child, "exit", nextProps),
+ enter: _this2.getProp(child, "enter", nextProps)
+ });
+ }
+ }), this.setState({
+ children: children
+ });
+ }, TransitionGroup.prototype.render = function() {
+ var _props = this.props, Component = _props.component, childFactory = _props.childFactory, props = _objectWithoutProperties(_props, [ "component", "childFactory" ]), children = this.state.children;
+ return delete props.appear, delete props.enter, delete props.exit, _react2.default.createElement(Component, props, values(children).map(childFactory));
+ }, TransitionGroup;
+ }(_react2.default.Component);
+ TransitionGroup.childContextTypes = {
+ transitionGroup: _propTypes2.default.object.isRequired
+ }, TransitionGroup.propTypes = "production" !== process.env.NODE_ENV ? propTypes : {},
+ TransitionGroup.defaultProps = defaultProps, exports.default = TransitionGroup,
+ module.exports = exports.default;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _Icon = __webpack_require__(478);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_Icon).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function cloneChildrenWithClassName(children, className) {
+ return _react.Children.map(children, function(child) {
+ return (0, _react.isValidElement)(child) && (0, _react.cloneElement)(child, {
+ className: child.props.hasOwnProperty("className") ? child.props.className + " " + className : className
+ });
+ });
+ }
+ function isMuiElement(element, muiNames) {
+ return (0, _react.isValidElement)(element) && -1 !== muiNames.indexOf(element.type.muiName);
+ }
+ function isMuiComponent(element, muiNames) {
+ return -1 !== muiNames.indexOf(element.muiName);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.cloneChildrenWithClassName = cloneChildrenWithClassName, exports.isMuiElement = isMuiElement,
+ exports.isMuiComponent = isMuiComponent;
+ var _react = __webpack_require__(0);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _SvgIcon = __webpack_require__(479);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_SvgIcon).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _setStatic = __webpack_require__(484), _setStatic2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_setStatic), setDisplayName = function(displayName) {
+ return (0, _setStatic2.default)("displayName", displayName);
+ };
+ exports.default = setDisplayName;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _Grid = __webpack_require__(509);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_Grid).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ (function(global) {
+ var freeGlobal = "object" == typeof global && global && global.Object === Object && global;
+ module.exports = freeGlobal;
+ }).call(exports, __webpack_require__(51));
+}, function(module, exports, __webpack_require__) {
+ function toNumber(value) {
+ if ("number" == typeof value) return value;
+ if (isSymbol(value)) return NAN;
+ if (isObject(value)) {
+ var other = "function" == typeof value.valueOf ? value.valueOf() : value;
+ value = isObject(other) ? other + "" : other;
+ }
+ if ("string" != typeof value) return 0 === value ? value : +value;
+ value = value.replace(reTrim, "");
+ var isBinary = reIsBinary.test(value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
+ }
+ var isObject = __webpack_require__(31), isSymbol = __webpack_require__(62), NAN = NaN, reTrim = /^\s+|\s+$/g, reIsBadHex = /^[-+]0x[0-9a-f]+$/i, reIsBinary = /^0b[01]+$/i, reIsOctal = /^0o[0-7]+$/i, freeParseInt = parseInt;
+ module.exports = toNumber;
+}, function(module, exports, __webpack_require__) {
+ var dP = __webpack_require__(528), createDesc = __webpack_require__(533);
+ module.exports = __webpack_require__(161) ? function(object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+ } : function(object, key, value) {
+ return object[key] = value, object;
+ };
+}, function(module, exports) {
+ module.exports = Math.log1p || function(x) {
+ return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
+ };
+}, function(module, exports, __webpack_require__) {
+ function baseGet(object, path) {
+ path = castPath(path, object);
+ for (var index = 0, length = path.length; null != object && index < length; ) object = object[toKey(path[index++])];
+ return index && index == length ? object : void 0;
+ }
+ var castPath = __webpack_require__(247), toKey = __webpack_require__(116);
+ module.exports = baseGet;
+}, function(module, exports, __webpack_require__) {
+ function castPath(value, object) {
+ return isArray(value) ? value : isKey(value, object) ? [ value ] : stringToPath(toString(value));
+ }
+ var isArray = __webpack_require__(12), isKey = __webpack_require__(166), stringToPath = __webpack_require__(556), toString = __webpack_require__(580);
+ module.exports = castPath;
+}, function(module, exports) {
+ function toSource(func) {
+ if (null != func) {
+ try {
+ return funcToString.call(func);
+ } catch (e) {}
+ try {
+ return func + "";
+ } catch (e) {}
+ }
+ return "";
+ }
+ var funcProto = Function.prototype, funcToString = funcProto.toString;
+ module.exports = toSource;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_d3_path__ = __webpack_require__(79), __WEBPACK_IMPORTED_MODULE_1__constant__ = __webpack_require__(54), __WEBPACK_IMPORTED_MODULE_2__curve_linear__ = __webpack_require__(118), __WEBPACK_IMPORTED_MODULE_3__line__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_4__point__ = __webpack_require__(175);
+ __webpack_exports__.a = function() {
+ function area(data) {
+ var i, j, k, d, buffer, n = data.length, defined0 = !1, x0z = new Array(n), y0z = new Array(n);
+ for (null == context && (output = curve(buffer = Object(__WEBPACK_IMPORTED_MODULE_0_d3_path__.a)())),
+ i = 0; i <= n; ++i) {
+ if (!(i < n && defined(d = data[i], i, data)) === defined0) if (defined0 = !defined0) j = i,
+ output.areaStart(), output.lineStart(); else {
+ for (output.lineEnd(), output.lineStart(), k = i - 1; k >= j; --k) output.point(x0z[k], y0z[k]);
+ output.lineEnd(), output.areaEnd();
+ }
+ defined0 && (x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data), output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]));
+ }
+ if (buffer) return output = null, buffer + "" || null;
+ }
+ function arealine() {
+ return Object(__WEBPACK_IMPORTED_MODULE_3__line__.a)().defined(defined).curve(curve).context(context);
+ }
+ var x0 = __WEBPACK_IMPORTED_MODULE_4__point__.a, x1 = null, y0 = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(0), y1 = __WEBPACK_IMPORTED_MODULE_4__point__.b, defined = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!0), context = null, curve = __WEBPACK_IMPORTED_MODULE_2__curve_linear__.a, output = null;
+ return area.x = function(_) {
+ return arguments.length ? (x0 = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ x1 = null, area) : x0;
+ }, area.x0 = function(_) {
+ return arguments.length ? (x0 = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ area) : x0;
+ }, area.x1 = function(_) {
+ return arguments.length ? (x1 = null == _ ? null : "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ area) : x1;
+ }, area.y = function(_) {
+ return arguments.length ? (y0 = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ y1 = null, area) : y0;
+ }, area.y0 = function(_) {
+ return arguments.length ? (y0 = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ area) : y0;
+ }, area.y1 = function(_) {
+ return arguments.length ? (y1 = null == _ ? null : "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ area) : y1;
+ }, area.lineX0 = area.lineY0 = function() {
+ return arealine().x(x0).y(y0);
+ }, area.lineY1 = function() {
+ return arealine().x(x0).y(y1);
+ }, area.lineX1 = function() {
+ return arealine().x(x1).y(y0);
+ }, area.defined = function(_) {
+ return arguments.length ? (defined = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!!_),
+ area) : defined;
+ }, area.curve = function(_) {
+ return arguments.length ? (curve = _, null != context && (output = curve(context)),
+ area) : curve;
+ }, area.context = function(_) {
+ return arguments.length ? (null == _ ? context = output = null : output = curve(context = _),
+ area) : context;
+ }, area;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Radial(curve) {
+ this._curve = curve;
+ }
+ function curveRadial(curve) {
+ function radial(context) {
+ return new Radial(curve(context));
+ }
+ return radial._curve = curve, radial;
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return curveRadialLinear;
+ }), __webpack_exports__.b = curveRadial;
+ var __WEBPACK_IMPORTED_MODULE_0__linear__ = __webpack_require__(118), curveRadialLinear = curveRadial(__WEBPACK_IMPORTED_MODULE_0__linear__.a);
+ Radial.prototype = {
+ areaStart: function() {
+ this._curve.areaStart();
+ },
+ areaEnd: function() {
+ this._curve.areaEnd();
+ },
+ lineStart: function() {
+ this._curve.lineStart();
+ },
+ lineEnd: function() {
+ this._curve.lineEnd();
+ },
+ point: function(a, r) {
+ this._curve.point(r * Math.sin(a), r * -Math.cos(a));
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function lineRadial(l) {
+ var c = l.curve;
+ return l.angle = l.x, delete l.x, l.radius = l.y, delete l.y, l.curve = function(_) {
+ return arguments.length ? c(Object(__WEBPACK_IMPORTED_MODULE_0__curve_radial__.b)(_)) : c()._curve;
+ }, l;
+ }
+ __webpack_exports__.a = lineRadial;
+ var __WEBPACK_IMPORTED_MODULE_0__curve_radial__ = __webpack_require__(250);
+ __webpack_require__(174);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x, y) {
+ return [ (y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x) ];
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return slice;
+ });
+ var slice = Array.prototype.slice;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__math__ = __webpack_require__(80);
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var r = Math.sqrt(size / __WEBPACK_IMPORTED_MODULE_0__math__.j);
+ context.moveTo(r, 0), context.arc(0, 0, r, 0, __WEBPACK_IMPORTED_MODULE_0__math__.m);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var r = Math.sqrt(size / 5) / 2;
+ context.moveTo(-3 * r, -r), context.lineTo(-r, -r), context.lineTo(-r, -3 * r),
+ context.lineTo(r, -3 * r), context.lineTo(r, -r), context.lineTo(3 * r, -r), context.lineTo(3 * r, r),
+ context.lineTo(r, r), context.lineTo(r, 3 * r), context.lineTo(-r, 3 * r), context.lineTo(-r, r),
+ context.lineTo(-3 * r, r), context.closePath();
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var tan30 = Math.sqrt(1 / 3), tan30_2 = 2 * tan30;
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var y = Math.sqrt(size / tan30_2), x = y * tan30;
+ context.moveTo(0, -y), context.lineTo(x, 0), context.lineTo(0, y), context.lineTo(-x, 0),
+ context.closePath();
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__math__ = __webpack_require__(80), kr = Math.sin(__WEBPACK_IMPORTED_MODULE_0__math__.j / 10) / Math.sin(7 * __WEBPACK_IMPORTED_MODULE_0__math__.j / 10), kx = Math.sin(__WEBPACK_IMPORTED_MODULE_0__math__.m / 10) * kr, ky = -Math.cos(__WEBPACK_IMPORTED_MODULE_0__math__.m / 10) * kr;
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var r = Math.sqrt(.8908130915292852 * size), x = kx * r, y = ky * r;
+ context.moveTo(0, -r), context.lineTo(x, y);
+ for (var i = 1; i < 5; ++i) {
+ var a = __WEBPACK_IMPORTED_MODULE_0__math__.m * i / 5, c = Math.cos(a), s = Math.sin(a);
+ context.lineTo(s * r, -c * r), context.lineTo(c * x - s * y, s * x + c * y);
+ }
+ context.closePath();
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var w = Math.sqrt(size), x = -w / 2;
+ context.rect(x, x, w, w);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var sqrt3 = Math.sqrt(3);
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var y = -Math.sqrt(size / (3 * sqrt3));
+ context.moveTo(0, 2 * y), context.lineTo(-sqrt3 * y, -y), context.lineTo(sqrt3 * y, -y),
+ context.closePath();
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var c = -.5, s = Math.sqrt(3) / 2, k = 1 / Math.sqrt(12), a = 3 * (k / 2 + 1);
+ __webpack_exports__.a = {
+ draw: function(context, size) {
+ var r = Math.sqrt(size / a), x0 = r / 2, y0 = r * k, x1 = x0, y1 = r * k + r, x2 = -x1, y2 = y1;
+ context.moveTo(x0, y0), context.lineTo(x1, y1), context.lineTo(x2, y2), context.lineTo(c * x0 - s * y0, s * x0 + c * y0),
+ context.lineTo(c * x1 - s * y1, s * x1 + c * y1), context.lineTo(c * x2 - s * y2, s * x2 + c * y2),
+ context.lineTo(c * x0 + s * y0, c * y0 - s * x0), context.lineTo(c * x1 + s * y1, c * y1 - s * x1),
+ context.lineTo(c * x2 + s * y2, c * y2 - s * x2), context.closePath();
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function CardinalClosed(context, tension) {
+ this._context = context, this._k = (1 - tension) / 6;
+ }
+ __webpack_exports__.a = CardinalClosed;
+ var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(119), __WEBPACK_IMPORTED_MODULE_1__cardinal__ = __webpack_require__(121);
+ CardinalClosed.prototype = {
+ areaStart: __WEBPACK_IMPORTED_MODULE_0__noop__.a,
+ areaEnd: __WEBPACK_IMPORTED_MODULE_0__noop__.a,
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN,
+ this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 1:
+ this._context.moveTo(this._x3, this._y3), this._context.closePath();
+ break;
+
+ case 2:
+ this._context.lineTo(this._x3, this._y3), this._context.closePath();
+ break;
+
+ case 3:
+ this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5);
+ }
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1, this._x3 = x, this._y3 = y;
+ break;
+
+ case 1:
+ this._point = 2, this._context.moveTo(this._x4 = x, this._y4 = y);
+ break;
+
+ case 2:
+ this._point = 3, this._x5 = x, this._y5 = y;
+ break;
+
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_1__cardinal__.b)(this, x, y);
+ }
+ this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2,
+ this._y2 = y;
+ }
+ };
+ !function custom(tension) {
+ function cardinal(context) {
+ return new CardinalClosed(context, tension);
+ }
+ return cardinal.tension = function(tension) {
+ return custom(+tension);
+ }, cardinal;
+ }(0);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function CardinalOpen(context, tension) {
+ this._context = context, this._k = (1 - tension) / 6;
+ }
+ __webpack_exports__.a = CardinalOpen;
+ var __WEBPACK_IMPORTED_MODULE_0__cardinal__ = __webpack_require__(121);
+ CardinalOpen.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0;
+ },
+ lineEnd: function() {
+ (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1;
+ break;
+
+ case 1:
+ this._point = 2;
+ break;
+
+ case 2:
+ this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
+ break;
+
+ case 3:
+ this._point = 4;
+
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_0__cardinal__.b)(this, x, y);
+ }
+ this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2,
+ this._y2 = y;
+ }
+ };
+ !function custom(tension) {
+ function cardinal(context) {
+ return new CardinalOpen(context, tension);
+ }
+ return cardinal.tension = function(tension) {
+ return custom(+tension);
+ }, cardinal;
+ }(0);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _class, _class2, _temp, _isEqual2 = __webpack_require__(34), _isEqual3 = _interopRequireDefault(_isEqual2), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _AnimateManager = __webpack_require__(640), _AnimateManager2 = _interopRequireDefault(_AnimateManager), _PureRender = __webpack_require__(643), _PureRender2 = _interopRequireDefault(_PureRender), _easing = __webpack_require__(275), _configUpdate = __webpack_require__(662), _configUpdate2 = _interopRequireDefault(_configUpdate), _util = __webpack_require__(123), Animate = (0,
+ _PureRender2.default)((_temp = _class2 = function(_Component) {
+ function Animate(props, context) {
+ _classCallCheck(this, Animate);
+ var _this = _possibleConstructorReturn(this, (Animate.__proto__ || Object.getPrototypeOf(Animate)).call(this, props, context)), _this$props = _this.props, isActive = _this$props.isActive, attributeName = _this$props.attributeName, from = _this$props.from, to = _this$props.to, steps = _this$props.steps, children = _this$props.children;
+ if (_this.handleStyleChange = _this.handleStyleChange.bind(_this), _this.changeStyle = _this.changeStyle.bind(_this),
+ !isActive) return _this.state = {
+ style: {}
+ }, "function" == typeof children && (_this.state = {
+ style: to
+ }), _possibleConstructorReturn(_this);
+ if (steps && steps.length) _this.state = {
+ style: steps[0].style
+ }; else if (from) {
+ if ("function" == typeof children) return _this.state = {
+ style: from
+ }, _possibleConstructorReturn(_this);
+ _this.state = {
+ style: attributeName ? _defineProperty({}, attributeName, from) : from
+ };
+ } else _this.state = {
+ style: {}
+ };
+ return _this;
+ }
+ return _inherits(Animate, _Component), _createClass(Animate, [ {
+ key: "componentDidMount",
+ value: function() {
+ var _props = this.props, isActive = _props.isActive, canBegin = _props.canBegin;
+ this.mounted = !0, isActive && canBegin && this.runAnimation(this.props);
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var isActive = nextProps.isActive, canBegin = nextProps.canBegin, attributeName = nextProps.attributeName, shouldReAnimate = nextProps.shouldReAnimate;
+ if (canBegin) {
+ if (!isActive) return void this.setState({
+ style: attributeName ? _defineProperty({}, attributeName, nextProps.to) : nextProps.to
+ });
+ if (!((0, _isEqual3.default)(this.props.to, nextProps.to) && this.props.canBegin && this.props.isActive)) {
+ var isTriggered = !this.props.canBegin || !this.props.isActive;
+ this.manager && this.manager.stop(), this.stopJSAnimation && this.stopJSAnimation();
+ var from = isTriggered || shouldReAnimate ? nextProps.from : this.props.to;
+ this.setState({
+ style: attributeName ? _defineProperty({}, attributeName, from) : from
+ }), this.runAnimation(_extends({}, nextProps, {
+ from: from,
+ begin: 0
+ }));
+ }
+ }
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.mounted = !1, this.unSubscribe && this.unSubscribe(), this.manager && (this.manager.stop(),
+ this.manager = null), this.stopJSAnimation && this.stopJSAnimation();
+ }
+ }, {
+ key: "runJSAnimation",
+ value: function(props) {
+ var _this2 = this, from = props.from, to = props.to, duration = props.duration, easing = props.easing, begin = props.begin, onAnimationEnd = props.onAnimationEnd, onAnimationStart = props.onAnimationStart, startAnimation = (0,
+ _configUpdate2.default)(from, to, (0, _easing.configEasing)(easing), duration, this.changeStyle), finalStartAnimation = function() {
+ _this2.stopJSAnimation = startAnimation();
+ };
+ this.manager.start([ onAnimationStart, begin, finalStartAnimation, duration, onAnimationEnd ]);
+ }
+ }, {
+ key: "runStepAnimation",
+ value: function(props) {
+ var _this3 = this, steps = props.steps, begin = props.begin, onAnimationStart = props.onAnimationStart, _steps$ = steps[0], initialStyle = _steps$.style, _steps$$duration = _steps$.duration, initialTime = void 0 === _steps$$duration ? 0 : _steps$$duration, addStyle = function(sequence, nextItem, index) {
+ if (0 === index) return sequence;
+ var duration = nextItem.duration, _nextItem$easing = nextItem.easing, easing = void 0 === _nextItem$easing ? "ease" : _nextItem$easing, style = nextItem.style, nextProperties = nextItem.properties, onAnimationEnd = nextItem.onAnimationEnd, preItem = index > 0 ? steps[index - 1] : nextItem, properties = nextProperties || Object.keys(style);
+ if ("function" == typeof easing || "spring" === easing) return [].concat(_toConsumableArray(sequence), [ _this3.runJSAnimation.bind(_this3, {
+ from: preItem.style,
+ to: style,
+ duration: duration,
+ easing: easing
+ }), duration ]);
+ var transition = (0, _util.getTransitionVal)(properties, duration, easing), newStyle = _extends({}, preItem.style, style, {
+ transition: transition
+ });
+ return [].concat(_toConsumableArray(sequence), [ newStyle, duration, onAnimationEnd ]).filter(_util.identity);
+ };
+ return this.manager.start([ onAnimationStart ].concat(_toConsumableArray(steps.reduce(addStyle, [ initialStyle, Math.max(initialTime, begin) ])), [ props.onAnimationEnd ]));
+ }
+ }, {
+ key: "runAnimation",
+ value: function(props) {
+ this.manager || (this.manager = (0, _AnimateManager2.default)());
+ var begin = props.begin, duration = props.duration, attributeName = props.attributeName, propsTo = (props.from,
+ props.to), easing = props.easing, onAnimationStart = props.onAnimationStart, onAnimationEnd = props.onAnimationEnd, steps = props.steps, children = props.children, manager = this.manager;
+ if (this.unSubscribe = manager.subscribe(this.handleStyleChange), "function" == typeof easing || "function" == typeof children || "spring" === easing) return void this.runJSAnimation(props);
+ if (steps.length > 1) return void this.runStepAnimation(props);
+ var to = attributeName ? _defineProperty({}, attributeName, propsTo) : propsTo, transition = (0,
+ _util.getTransitionVal)(Object.keys(to), duration, easing);
+ manager.start([ onAnimationStart, begin, _extends({}, to, {
+ transition: transition
+ }), duration, onAnimationEnd ]);
+ }
+ }, {
+ key: "handleStyleChange",
+ value: function(style) {
+ this.changeStyle(style);
+ }
+ }, {
+ key: "changeStyle",
+ value: function(style) {
+ this.mounted && this.setState({
+ style: style
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, children = _props2.children, isActive = (_props2.begin,
+ _props2.duration, _props2.attributeName, _props2.easing, _props2.isActive), others = (_props2.steps,
+ _props2.from, _props2.to, _props2.canBegin, _props2.onAnimationEnd, _props2.shouldReAnimate,
+ _props2.onAnimationReStart, _objectWithoutProperties(_props2, [ "children", "begin", "duration", "attributeName", "easing", "isActive", "steps", "from", "to", "canBegin", "onAnimationEnd", "shouldReAnimate", "onAnimationReStart" ])), count = _react.Children.count(children), stateStyle = (0,
+ _util.translateStyle)(this.state.style);
+ if ("function" == typeof children) return children(stateStyle);
+ if (!isActive || 0 === count) return children;
+ var cloneContainer = function(container) {
+ var _container$props = container.props, _container$props$styl = _container$props.style, style = void 0 === _container$props$styl ? {} : _container$props$styl, className = _container$props.className;
+ return (0, _react.cloneElement)(container, _extends({}, others, {
+ style: _extends({}, style, stateStyle),
+ className: className
+ }));
+ };
+ if (1 === count) {
+ _react.Children.only(children);
+ return cloneContainer(_react.Children.only(children));
+ }
+ return _react2.default.createElement("div", null, _react.Children.map(children, function(child) {
+ return cloneContainer(child);
+ }));
+ }
+ } ]), Animate;
+ }(_react.Component), _class2.displayName = "Animate", _class2.propTypes = {
+ from: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.string ]),
+ to: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.string ]),
+ attributeName: _propTypes2.default.string,
+ duration: _propTypes2.default.number,
+ begin: _propTypes2.default.number,
+ easing: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ steps: _propTypes2.default.arrayOf(_propTypes2.default.shape({
+ duration: _propTypes2.default.number.isRequired,
+ style: _propTypes2.default.object.isRequired,
+ easing: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]), _propTypes2.default.func ]),
+ properties: _propTypes2.default.arrayOf("string"),
+ onAnimationEnd: _propTypes2.default.func
+ })),
+ children: _propTypes2.default.oneOfType([ _propTypes2.default.node, _propTypes2.default.func ]),
+ isActive: _propTypes2.default.bool,
+ canBegin: _propTypes2.default.bool,
+ onAnimationEnd: _propTypes2.default.func,
+ shouldReAnimate: _propTypes2.default.bool,
+ onAnimationStart: _propTypes2.default.func,
+ onAnimationReStart: _propTypes2.default.func
+ }, _class2.defaultProps = {
+ begin: 0,
+ duration: 1e3,
+ from: "",
+ to: "",
+ attributeName: "",
+ easing: "ease",
+ isActive: !0,
+ canBegin: !0,
+ steps: [],
+ onAnimationEnd: function() {},
+ onAnimationStart: function() {}
+ }, _class = _temp)) || _class;
+ exports.default = Animate;
+}, function(module, exports, __webpack_require__) {
+ function Stack(entries) {
+ var data = this.__data__ = new ListCache(entries);
+ this.size = data.size;
+ }
+ var ListCache = __webpack_require__(112), stackClear = __webpack_require__(609), stackDelete = __webpack_require__(610), stackGet = __webpack_require__(611), stackHas = __webpack_require__(612), stackSet = __webpack_require__(613);
+ Stack.prototype.clear = stackClear, Stack.prototype.delete = stackDelete, Stack.prototype.get = stackGet,
+ Stack.prototype.has = stackHas, Stack.prototype.set = stackSet, module.exports = Stack;
+}, function(module, exports, __webpack_require__) {
+ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length;
+ if (arrLength != othLength && !(isPartial && othLength > arrLength)) return !1;
+ var stacked = stack.get(array);
+ if (stacked && stack.get(other)) return stacked == other;
+ var index = -1, result = !0, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : void 0;
+ for (stack.set(array, other), stack.set(other, array); ++index < arrLength; ) {
+ var arrValue = array[index], othValue = other[index];
+ if (customizer) var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);
+ if (void 0 !== compared) {
+ if (compared) continue;
+ result = !1;
+ break;
+ }
+ if (seen) {
+ if (!arraySome(other, function(othValue, othIndex) {
+ if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) return seen.push(othIndex);
+ })) {
+ result = !1;
+ break;
+ }
+ } else if (arrValue !== othValue && !equalFunc(arrValue, othValue, bitmask, customizer, stack)) {
+ result = !1;
+ break;
+ }
+ }
+ return stack.delete(array), stack.delete(other), result;
+ }
+ var SetCache = __webpack_require__(266), arraySome = __webpack_require__(616), cacheHas = __webpack_require__(267), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
+ module.exports = equalArrays;
+}, function(module, exports, __webpack_require__) {
+ function SetCache(values) {
+ var index = -1, length = null == values ? 0 : values.length;
+ for (this.__data__ = new MapCache(); ++index < length; ) this.add(values[index]);
+ }
+ var MapCache = __webpack_require__(167), setCacheAdd = __webpack_require__(614), setCacheHas = __webpack_require__(615);
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd, SetCache.prototype.has = setCacheHas,
+ module.exports = SetCache;
+}, function(module, exports) {
+ function cacheHas(cache, key) {
+ return cache.has(key);
+ }
+ module.exports = cacheHas;
+}, function(module, exports) {
+ function arrayPush(array, values) {
+ for (var index = -1, length = values.length, offset = array.length; ++index < length; ) array[offset + index] = values[index];
+ return array;
+ }
+ module.exports = arrayPush;
+}, function(module, exports) {
+ function arrayFilter(array, predicate) {
+ for (var index = -1, length = null == array ? 0 : array.length, resIndex = 0, result = []; ++index < length; ) {
+ var value = array[index];
+ predicate(value, index, array) && (result[resIndex++] = value);
+ }
+ return result;
+ }
+ module.exports = arrayFilter;
+}, function(module, exports, __webpack_require__) {
+ (function(module) {
+ var root = __webpack_require__(32), stubFalse = __webpack_require__(629), freeExports = "object" == typeof exports && exports && !exports.nodeType && exports, freeModule = freeExports && "object" == typeof module && module && !module.nodeType && module, moduleExports = freeModule && freeModule.exports === freeExports, Buffer = moduleExports ? root.Buffer : void 0, nativeIsBuffer = Buffer ? Buffer.isBuffer : void 0, isBuffer = nativeIsBuffer || stubFalse;
+ module.exports = isBuffer;
+ }).call(exports, __webpack_require__(154)(module));
+}, function(module, exports, __webpack_require__) {
+ var baseIsTypedArray = __webpack_require__(630), baseUnary = __webpack_require__(183), nodeUtil = __webpack_require__(631), nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray, isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+ module.exports = isTypedArray;
+}, function(module, exports) {
+ function overArg(func, transform) {
+ return function(arg) {
+ return func(transform(arg));
+ };
+ }
+ module.exports = overArg;
+}, function(module, exports, __webpack_require__) {
+ (function(global) {
+ for (var now = __webpack_require__(642), root = "undefined" == typeof window ? global : window, vendors = [ "moz", "webkit" ], suffix = "AnimationFrame", raf = root["request" + suffix], caf = root["cancel" + suffix] || root["cancelRequest" + suffix], i = 0; !raf && i < vendors.length; i++) raf = root[vendors[i] + "Request" + suffix],
+ caf = root[vendors[i] + "Cancel" + suffix] || root[vendors[i] + "CancelRequest" + suffix];
+ if (!raf || !caf) {
+ var last = 0, id = 0, queue = [];
+ raf = function(callback) {
+ if (0 === queue.length) {
+ var _now = now(), next = Math.max(0, 1e3 / 60 - (_now - last));
+ last = next + _now, setTimeout(function() {
+ var cp = queue.slice(0);
+ queue.length = 0;
+ for (var i = 0; i < cp.length; i++) if (!cp[i].cancelled) try {
+ cp[i].callback(last);
+ } catch (e) {
+ setTimeout(function() {
+ throw e;
+ }, 0);
+ }
+ }, Math.round(next));
+ }
+ return queue.push({
+ handle: ++id,
+ callback: callback,
+ cancelled: !1
+ }), id;
+ }, caf = function(handle) {
+ for (var i = 0; i < queue.length; i++) queue[i].handle === handle && (queue[i].cancelled = !0);
+ };
+ }
+ module.exports = function(fn) {
+ return raf.call(root, fn);
+ }, module.exports.cancel = function() {
+ caf.apply(root, arguments);
+ }, module.exports.polyfill = function(object) {
+ object || (object = root), object.requestAnimationFrame = raf, object.cancelAnimationFrame = caf;
+ };
+ }).call(exports, __webpack_require__(51));
+}, function(module, exports, __webpack_require__) {
+ function isPlainObject(value) {
+ if (!isObjectLike(value) || baseGetTag(value) != objectTag) return !1;
+ var proto = getPrototype(value);
+ if (null === proto) return !0;
+ var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
+ return "function" == typeof Ctor && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
+ }
+ var baseGetTag = __webpack_require__(42), getPrototype = __webpack_require__(644), isObjectLike = __webpack_require__(36), objectTag = "[object Object]", funcProto = Function.prototype, objectProto = Object.prototype, funcToString = funcProto.toString, hasOwnProperty = objectProto.hasOwnProperty, objectCtorString = funcToString.call(Object);
+ module.exports = isPlainObject;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.configEasing = exports.configSpring = exports.configBezier = void 0;
+ var _util = __webpack_require__(123), cubicBezierFactor = function(c1, c2) {
+ return [ 0, 3 * c1, 3 * c2 - 6 * c1, 3 * c1 - 3 * c2 + 1 ];
+ }, multyTime = function(params, t) {
+ return params.map(function(param, i) {
+ return param * Math.pow(t, i);
+ }).reduce(function(pre, curr) {
+ return pre + curr;
+ });
+ }, cubicBezier = function(c1, c2) {
+ return function(t) {
+ var params = cubicBezierFactor(c1, c2);
+ return multyTime(params, t);
+ };
+ }, derivativeCubicBezier = function(c1, c2) {
+ return function(t) {
+ var params = cubicBezierFactor(c1, c2), newParams = [].concat(_toConsumableArray(params.map(function(param, i) {
+ return param * i;
+ }).slice(1)), [ 0 ]);
+ return multyTime(newParams, t);
+ };
+ }, configBezier = exports.configBezier = function() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ var x1 = args[0], y1 = args[1], x2 = args[2], y2 = args[3];
+ if (1 === args.length) switch (args[0]) {
+ case "linear":
+ x1 = 0, y1 = 0, x2 = 1, y2 = 1;
+ break;
+
+ case "ease":
+ x1 = .25, y1 = .1, x2 = .25, y2 = 1;
+ break;
+
+ case "ease-in":
+ x1 = .42, y1 = 0, x2 = 1, y2 = 1;
+ break;
+
+ case "ease-out":
+ x1 = .42, y1 = 0, x2 = .58, y2 = 1;
+ break;
+
+ case "ease-in-out":
+ x1 = 0, y1 = 0, x2 = .58, y2 = 1;
+ break;
+
+ default:
+ (0, _util.warn)(!1, "[configBezier]: arguments should be one of oneOf 'linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', instead received %s", args);
+ }
+ (0, _util.warn)([ x1, x2, y1, y2 ].every(function(num) {
+ return "number" == typeof num && num >= 0 && num <= 1;
+ }), "[configBezier]: arguments should be x1, y1, x2, y2 of [0, 1] instead received %s", args);
+ var curveX = cubicBezier(x1, x2), curveY = cubicBezier(y1, y2), derCurveX = derivativeCubicBezier(x1, x2), rangeValue = function(value) {
+ return value > 1 ? 1 : value < 0 ? 0 : value;
+ }, bezier = function(_t) {
+ for (var t = _t > 1 ? 1 : _t, x = t, i = 0; i < 8; ++i) {
+ var evalT = curveX(x) - t, derVal = derCurveX(x);
+ if (Math.abs(evalT - t) < 1e-4 || derVal < 1e-4) return curveY(x);
+ x = rangeValue(x - evalT / derVal);
+ }
+ return curveY(x);
+ };
+ return bezier.isStepper = !1, bezier;
+ }, configSpring = exports.configSpring = function() {
+ var config = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, _config$stiff = config.stiff, stiff = void 0 === _config$stiff ? 100 : _config$stiff, _config$damping = config.damping, damping = void 0 === _config$damping ? 8 : _config$damping, _config$dt = config.dt, dt = void 0 === _config$dt ? 17 : _config$dt, stepper = function(currX, destX, currV) {
+ var FSpring = -(currX - destX) * stiff, FDamping = currV * damping, newV = currV + (FSpring - FDamping) * dt / 1e3, newX = currV * dt / 1e3 + currX;
+ return Math.abs(newX - destX) < 1e-4 && Math.abs(newV) < 1e-4 ? [ destX, 0 ] : [ newX, newV ];
+ };
+ return stepper.isStepper = !0, stepper.dt = dt, stepper;
+ };
+ exports.configEasing = function() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2];
+ var easing = args[0];
+ if ("string" == typeof easing) switch (easing) {
+ case "ease":
+ case "ease-in-out":
+ case "ease-out":
+ case "ease-in":
+ case "linear":
+ return configBezier(easing);
+
+ case "spring":
+ return configSpring();
+
+ default:
+ (0, _util.warn)(!1, "[configEasing]: first argument should be one of 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear' and 'spring', instead received %s", args);
+ }
+ return "function" == typeof easing ? easing : ((0, _util.warn)(!1, "[configEasing]: first argument type should be function or string, instead received %s", args),
+ null);
+ };
+}, function(module, exports, __webpack_require__) {
+ function baseRest(func, start) {
+ return setToString(overRest(func, start, identity), func + "");
+ }
+ var identity = __webpack_require__(63), overRest = __webpack_require__(653), setToString = __webpack_require__(655);
+ module.exports = baseRest;
+}, function(module, exports, __webpack_require__) {
+ var baseForOwn = __webpack_require__(665), createBaseEach = __webpack_require__(668), baseEach = createBaseEach(baseForOwn);
+ module.exports = baseEach;
+}, function(module, exports, __webpack_require__) {
+ function isStrictComparable(value) {
+ return value === value && !isObject(value);
+ }
+ var isObject = __webpack_require__(31);
+ module.exports = isStrictComparable;
+}, function(module, exports) {
+ function matchesStrictComparable(key, srcValue) {
+ return function(object) {
+ return null != object && (object[key] === srcValue && (void 0 !== srcValue || key in Object(object)));
+ };
+ }
+ module.exports = matchesStrictComparable;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return warn;
+ });
+ var isDev = "production" !== process.env.NODE_ENV, warn = function(condition, format, a, b, c, d, e, f) {
+ if (isDev && "undefined" != typeof console && console.warn && (void 0 === format && console.warn("LogUtils requires an error message argument"),
+ !condition)) if (void 0 === format) console.warn("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings."); else {
+ var args = [ a, b, c, d, e, f ], argIndex = 0;
+ console.warn(format.replace(/%s/g, function() {
+ return args[argIndex++];
+ }));
+ }
+ };
+ }).call(__webpack_exports__, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ var baseFlatten = __webpack_require__(695), baseOrderBy = __webpack_require__(697), baseRest = __webpack_require__(276), isIterateeCall = __webpack_require__(282), sortBy = baseRest(function(collection, iteratees) {
+ if (null == collection) return [];
+ var length = iteratees.length;
+ return length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1]) ? iteratees = [] : length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2]) && (iteratees = [ iteratees[0] ]),
+ baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+ });
+ module.exports = sortBy;
+}, function(module, exports, __webpack_require__) {
+ function isIterateeCall(value, index, object) {
+ if (!isObject(object)) return !1;
+ var type = typeof index;
+ return !!("number" == type ? isArrayLike(object) && isIndex(index, object.length) : "string" == type && index in object) && eq(object[index], value);
+ }
+ var eq = __webpack_require__(168), isArrayLike = __webpack_require__(83), isIndex = __webpack_require__(181), isObject = __webpack_require__(31);
+ module.exports = isIterateeCall;
+}, function(module, exports) {
+ function baseGt(value, other) {
+ return value > other;
+ }
+ module.exports = baseGt;
+}, function(module, exports, __webpack_require__) {
+ function min(array) {
+ return array && array.length ? baseExtremum(array, identity, baseLt) : void 0;
+ }
+ var baseExtremum = __webpack_require__(124), baseLt = __webpack_require__(285), identity = __webpack_require__(63);
+ module.exports = min;
+}, function(module, exports) {
+ function baseLt(value, other) {
+ return value < other;
+ }
+ module.exports = baseLt;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var identity = function(i) {
+ return i;
+ }, PLACE_HOLDER = exports.PLACE_HOLDER = {
+ "@@functional/placeholder": !0
+ }, isPlaceHolder = function(val) {
+ return val === PLACE_HOLDER;
+ }, curry0 = function(fn) {
+ return function _curried() {
+ return 0 === arguments.length || 1 === arguments.length && isPlaceHolder(arguments.length <= 0 ? void 0 : arguments[0]) ? _curried : fn.apply(void 0, arguments);
+ };
+ }, curryN = function curryN(n, fn) {
+ return 1 === n ? fn : curry0(function() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ var argsLength = args.filter(function(arg) {
+ return arg !== PLACE_HOLDER;
+ }).length;
+ return argsLength >= n ? fn.apply(void 0, args) : curryN(n - argsLength, curry0(function() {
+ for (var _len2 = arguments.length, restArgs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) restArgs[_key2] = arguments[_key2];
+ var newArgs = args.map(function(arg) {
+ return isPlaceHolder(arg) ? restArgs.shift() : arg;
+ });
+ return fn.apply(void 0, _toConsumableArray(newArgs).concat(restArgs));
+ }));
+ });
+ }, curry = exports.curry = function(fn) {
+ return curryN(fn.length, fn);
+ };
+ exports.range = function(begin, end) {
+ for (var arr = [], i = begin; i < end; ++i) arr[i - begin] = i;
+ return arr;
+ }, exports.map = curry(function(fn, arr) {
+ return Array.isArray(arr) ? arr.map(fn) : Object.keys(arr).map(function(key) {
+ return arr[key];
+ }).map(fn);
+ }), exports.compose = function() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) args[_key3] = arguments[_key3];
+ if (!args.length) return identity;
+ var fns = args.reverse(), firstFn = fns[0], tailsFn = fns.slice(1);
+ return function() {
+ return tailsFn.reduce(function(res, fn) {
+ return fn(res);
+ }, firstFn.apply(void 0, arguments));
+ };
+ }, exports.reverse = function(arr) {
+ return Array.isArray(arr) ? arr.reverse() : arr.split("").reverse.join("");
+ }, exports.memoize = function(fn) {
+ var lastArgs = null, lastResult = null;
+ return function() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) args[_key4] = arguments[_key4];
+ return lastArgs && args.every(function(val, i) {
+ return val === lastArgs[i];
+ }) ? lastResult : (lastArgs = args, lastResult = fn.apply(void 0, args));
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: !0
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__src_band__ = __webpack_require__(706);
+ __webpack_require__.d(__webpack_exports__, "scaleBand", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_band__.a;
+ }), __webpack_require__.d(__webpack_exports__, "scalePoint", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_band__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_1__src_identity__ = __webpack_require__(729);
+ __webpack_require__.d(__webpack_exports__, "scaleIdentity", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__src_identity__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__src_linear__ = __webpack_require__(87);
+ __webpack_require__.d(__webpack_exports__, "scaleLinear", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_linear__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_3__src_log__ = __webpack_require__(752);
+ __webpack_require__.d(__webpack_exports__, "scaleLog", function() {
+ return __WEBPACK_IMPORTED_MODULE_3__src_log__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_4__src_ordinal__ = __webpack_require__(300);
+ __webpack_require__.d(__webpack_exports__, "scaleOrdinal", function() {
+ return __WEBPACK_IMPORTED_MODULE_4__src_ordinal__.a;
+ }), __webpack_require__.d(__webpack_exports__, "scaleImplicit", function() {
+ return __WEBPACK_IMPORTED_MODULE_4__src_ordinal__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_5__src_pow__ = __webpack_require__(753);
+ __webpack_require__.d(__webpack_exports__, "scalePow", function() {
+ return __WEBPACK_IMPORTED_MODULE_5__src_pow__.a;
+ }), __webpack_require__.d(__webpack_exports__, "scaleSqrt", function() {
+ return __WEBPACK_IMPORTED_MODULE_5__src_pow__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_6__src_quantile__ = __webpack_require__(754);
+ __webpack_require__.d(__webpack_exports__, "scaleQuantile", function() {
+ return __WEBPACK_IMPORTED_MODULE_6__src_quantile__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_7__src_quantize__ = __webpack_require__(755);
+ __webpack_require__.d(__webpack_exports__, "scaleQuantize", function() {
+ return __WEBPACK_IMPORTED_MODULE_7__src_quantize__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_8__src_threshold__ = __webpack_require__(756);
+ __webpack_require__.d(__webpack_exports__, "scaleThreshold", function() {
+ return __WEBPACK_IMPORTED_MODULE_8__src_threshold__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_9__src_time__ = __webpack_require__(316);
+ __webpack_require__.d(__webpack_exports__, "scaleTime", function() {
+ return __WEBPACK_IMPORTED_MODULE_9__src_time__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_10__src_utcTime__ = __webpack_require__(772);
+ __webpack_require__.d(__webpack_exports__, "scaleUtc", function() {
+ return __WEBPACK_IMPORTED_MODULE_10__src_utcTime__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_11__src_category10__ = __webpack_require__(773);
+ __webpack_require__.d(__webpack_exports__, "schemeCategory10", function() {
+ return __WEBPACK_IMPORTED_MODULE_11__src_category10__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_12__src_category20b__ = __webpack_require__(774);
+ __webpack_require__.d(__webpack_exports__, "schemeCategory20b", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__src_category20b__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_13__src_category20c__ = __webpack_require__(775);
+ __webpack_require__.d(__webpack_exports__, "schemeCategory20c", function() {
+ return __WEBPACK_IMPORTED_MODULE_13__src_category20c__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_14__src_category20__ = __webpack_require__(776);
+ __webpack_require__.d(__webpack_exports__, "schemeCategory20", function() {
+ return __WEBPACK_IMPORTED_MODULE_14__src_category20__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = __webpack_require__(777);
+ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixDefault", function() {
+ return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_16__src_rainbow__ = __webpack_require__(778);
+ __webpack_require__.d(__webpack_exports__, "interpolateRainbow", function() {
+ return __WEBPACK_IMPORTED_MODULE_16__src_rainbow__.b;
+ }), __webpack_require__.d(__webpack_exports__, "interpolateWarm", function() {
+ return __WEBPACK_IMPORTED_MODULE_16__src_rainbow__.c;
+ }), __webpack_require__.d(__webpack_exports__, "interpolateCool", function() {
+ return __WEBPACK_IMPORTED_MODULE_16__src_rainbow__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_17__src_viridis__ = __webpack_require__(779);
+ __webpack_require__.d(__webpack_exports__, "interpolateViridis", function() {
+ return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.a;
+ }), __webpack_require__.d(__webpack_exports__, "interpolateMagma", function() {
+ return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.c;
+ }), __webpack_require__.d(__webpack_exports__, "interpolateInferno", function() {
+ return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.b;
+ }), __webpack_require__.d(__webpack_exports__, "interpolatePlasma", function() {
+ return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.d;
+ });
+ var __WEBPACK_IMPORTED_MODULE_18__src_sequential__ = __webpack_require__(780);
+ __webpack_require__.d(__webpack_exports__, "scaleSequential", function() {
+ return __WEBPACK_IMPORTED_MODULE_18__src_sequential__.a;
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__ascending__ = __webpack_require__(64), __WEBPACK_IMPORTED_MODULE_1__bisector__ = __webpack_require__(289), ascendingBisect = Object(__WEBPACK_IMPORTED_MODULE_1__bisector__.a)(__WEBPACK_IMPORTED_MODULE_0__ascending__.a), bisectRight = ascendingBisect.right;
+ ascendingBisect.left;
+ __webpack_exports__.a = bisectRight;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function ascendingComparator(f) {
+ return function(d, x) {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__ascending__.a)(f(d), x);
+ };
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__ascending__ = __webpack_require__(64);
+ __webpack_exports__.a = function(compare) {
+ return 1 === compare.length && (compare = ascendingComparator(compare)), {
+ left: function(a, x, lo, hi) {
+ for (null == lo && (lo = 0), null == hi && (hi = a.length); lo < hi; ) {
+ var mid = lo + hi >>> 1;
+ compare(a[mid], x) < 0 ? lo = mid + 1 : hi = mid;
+ }
+ return lo;
+ },
+ right: function(a, x, lo, hi) {
+ for (null == lo && (lo = 0), null == hi && (hi = a.length); lo < hi; ) {
+ var mid = lo + hi >>> 1;
+ compare(a[mid], x) > 0 ? hi = mid : lo = mid + 1;
+ }
+ return lo;
+ }
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function pair(a, b) {
+ return [ a, b ];
+ }
+ __webpack_exports__.a = pair;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__variance__ = __webpack_require__(292);
+ __webpack_exports__.a = function(array, f) {
+ var v = Object(__WEBPACK_IMPORTED_MODULE_0__variance__.a)(array, f);
+ return v ? Math.sqrt(v) : v;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(86);
+ __webpack_exports__.a = function(values, valueof) {
+ var value, delta, n = values.length, m = 0, i = -1, mean = 0, sum = 0;
+ if (null == valueof) for (;++i < n; ) isNaN(value = Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(values[i])) || (delta = value - mean,
+ mean += delta / ++m, sum += delta * (value - mean)); else for (;++i < n; ) isNaN(value = Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(valueof(values[i], i, values))) || (delta = value - mean,
+ mean += delta / ++m, sum += delta * (value - mean));
+ if (m > 1) return sum / (m - 1);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(values, valueof) {
+ var value, min, max, n = values.length, i = -1;
+ if (null == valueof) {
+ for (;++i < n; ) if (null != (value = values[i]) && value >= value) for (min = max = value; ++i < n; ) null != (value = values[i]) && (min > value && (min = value),
+ max < value && (max = value));
+ } else for (;++i < n; ) if (null != (value = valueof(values[i], i, values)) && value >= value) for (min = max = value; ++i < n; ) null != (value = valueof(values[i], i, values)) && (min > value && (min = value),
+ max < value && (max = value));
+ return [ min, max ];
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return slice;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return map;
+ });
+ var array = Array.prototype, slice = array.slice, map = array.map;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(start, stop, step) {
+ start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start,
+ start = 0, 1) : n < 3 ? 1 : +step;
+ for (var i = -1, n = 0 | Math.max(0, Math.ceil((stop - start) / step)), range = new Array(n); ++i < n; ) range[i] = start + i * step;
+ return range;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function tickIncrement(start, stop, count) {
+ var step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);
+ return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
+ }
+ function tickStep(start, stop, count) {
+ var step0 = Math.abs(stop - start) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;
+ return error >= e10 ? step1 *= 10 : error >= e5 ? step1 *= 5 : error >= e2 && (step1 *= 2),
+ stop < start ? -step1 : step1;
+ }
+ __webpack_exports__.b = tickIncrement, __webpack_exports__.c = tickStep;
+ var e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);
+ __webpack_exports__.a = function(start, stop, count) {
+ var reverse, n, ticks, step, i = -1;
+ if (stop = +stop, start = +start, count = +count, start === stop && count > 0) return [ start ];
+ if ((reverse = stop < start) && (n = start, start = stop, stop = n), 0 === (step = tickIncrement(start, stop, count)) || !isFinite(step)) return [];
+ if (step > 0) for (start = Math.ceil(start / step), stop = Math.floor(stop / step),
+ ticks = new Array(n = Math.ceil(stop - start + 1)); ++i < n; ) ticks[i] = (start + i) * step; else for (start = Math.floor(start * step),
+ stop = Math.ceil(stop * step), ticks = new Array(n = Math.ceil(start - stop + 1)); ++i < n; ) ticks[i] = (start - i) / step;
+ return reverse && ticks.reverse(), ticks;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(values) {
+ return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(values, valueof) {
+ var value, min, n = values.length, i = -1;
+ if (null == valueof) {
+ for (;++i < n; ) if (null != (value = values[i]) && value >= value) for (min = value; ++i < n; ) null != (value = values[i]) && min > value && (min = value);
+ } else for (;++i < n; ) if (null != (value = valueof(values[i], i, values)) && value >= value) for (min = value; ++i < n; ) null != (value = valueof(values[i], i, values)) && min > value && (min = value);
+ return min;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function length(d) {
+ return d.length;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__min__ = __webpack_require__(298);
+ __webpack_exports__.a = function(matrix) {
+ if (!(n = matrix.length)) return [];
+ for (var i = -1, m = Object(__WEBPACK_IMPORTED_MODULE_0__min__.a)(matrix, length), transpose = new Array(m); ++i < m; ) for (var n, j = -1, row = transpose[i] = new Array(n); ++j < n; ) row[j] = matrix[j][i];
+ return transpose;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function ordinal(range) {
+ function scale(d) {
+ var key = d + "", i = index.get(key);
+ if (!i) {
+ if (unknown !== implicit) return unknown;
+ index.set(key, i = domain.push(d));
+ }
+ return range[(i - 1) % range.length];
+ }
+ var index = Object(__WEBPACK_IMPORTED_MODULE_0_d3_collection__.a)(), domain = [], unknown = implicit;
+ return range = null == range ? [] : __WEBPACK_IMPORTED_MODULE_1__array__.b.call(range),
+ scale.domain = function(_) {
+ if (!arguments.length) return domain.slice();
+ domain = [], index = Object(__WEBPACK_IMPORTED_MODULE_0_d3_collection__.a)();
+ for (var d, key, i = -1, n = _.length; ++i < n; ) index.has(key = (d = _[i]) + "") || index.set(key, domain.push(d));
+ return scale;
+ }, scale.range = function(_) {
+ return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_),
+ scale) : range.slice();
+ }, scale.unknown = function(_) {
+ return arguments.length ? (unknown = _, scale) : unknown;
+ }, scale.copy = function() {
+ return ordinal().domain(domain).range(range).unknown(unknown);
+ }, scale;
+ }
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return implicit;
+ }), __webpack_exports__.a = ordinal;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_collection__ = __webpack_require__(723), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(56), implicit = {
+ name: "implicit"
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return deg2rad;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return rad2deg;
+ });
+ var deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function rgbSpline(spline) {
+ return function(colors) {
+ var i, color, n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n);
+ for (i = 0; i < n; ++i) color = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.f)(colors[i]),
+ r[i] = color.r || 0, g[i] = color.g || 0, b[i] = color.b || 0;
+ return r = spline(r), g = spline(g), b = spline(b), color.opacity = 1, function(t) {
+ return color.r = r(t), color.g = g(t), color.b = b(t), color + "";
+ };
+ };
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1__basis__ = __webpack_require__(190), __WEBPACK_IMPORTED_MODULE_2__basisClosed__ = __webpack_require__(303), __WEBPACK_IMPORTED_MODULE_3__color__ = __webpack_require__(89);
+ __webpack_exports__.a = function rgbGamma(y) {
+ function rgb(start, end) {
+ var r = color((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.f)(start)).r, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.f)(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = Object(__WEBPACK_IMPORTED_MODULE_3__color__.a)(start.opacity, end.opacity);
+ return function(t) {
+ return start.r = r(t), start.g = g(t), start.b = b(t), start.opacity = opacity(t),
+ start + "";
+ };
+ }
+ var color = Object(__WEBPACK_IMPORTED_MODULE_3__color__.b)(y);
+ return rgb.gamma = rgbGamma, rgb;
+ }(1);
+ rgbSpline(__WEBPACK_IMPORTED_MODULE_1__basis__.b), rgbSpline(__WEBPACK_IMPORTED_MODULE_2__basisClosed__.a);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(190);
+ __webpack_exports__.a = function(values) {
+ var n = values.length;
+ return function(t) {
+ var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];
+ return Object(__WEBPACK_IMPORTED_MODULE_0__basis__.a)((t - i / n) * n, v0, v1, v2, v3);
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return function() {
+ return x;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__value__ = __webpack_require__(187);
+ __webpack_exports__.a = function(a, b) {
+ var i, nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb);
+ for (i = 0; i < na; ++i) x[i] = Object(__WEBPACK_IMPORTED_MODULE_0__value__.a)(a[i], b[i]);
+ for (;i < nb; ++i) c[i] = b[i];
+ return function(t) {
+ for (i = 0; i < na; ++i) c[i] = x[i](t);
+ return c;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(a, b) {
+ var d = new Date();
+ return a = +a, b -= a, function(t) {
+ return d.setTime(a + b * t), d;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__value__ = __webpack_require__(187);
+ __webpack_exports__.a = function(a, b) {
+ var k, i = {}, c = {};
+ null !== a && "object" == typeof a || (a = {}), null !== b && "object" == typeof b || (b = {});
+ for (k in b) k in a ? i[k] = Object(__WEBPACK_IMPORTED_MODULE_0__value__.a)(a[k], b[k]) : c[k] = b[k];
+ return function(t) {
+ for (k in i) c[k] = i[k](t);
+ return c;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function zero(b) {
+ return function() {
+ return b;
+ };
+ }
+ function one(b) {
+ return function(t) {
+ return b(t) + "";
+ };
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(125), reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, reB = new RegExp(reA.source, "g");
+ __webpack_exports__.a = function(a, b) {
+ var am, bm, bs, bi = reA.lastIndex = reB.lastIndex = 0, i = -1, s = [], q = [];
+ for (a += "", b += ""; (am = reA.exec(a)) && (bm = reB.exec(b)); ) (bs = bm.index) > bi && (bs = b.slice(bi, bs),
+ s[i] ? s[i] += bs : s[++i] = bs), (am = am[0]) === (bm = bm[0]) ? s[i] ? s[i] += bm : s[++i] = bm : (s[++i] = null,
+ q.push({
+ i: i,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(am, bm)
+ })), bi = reB.lastIndex;
+ return bi < b.length && (bs = b.slice(bi), s[i] ? s[i] += bs : s[++i] = bs), s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length,
+ function(t) {
+ for (var o, i = 0; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ });
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return +x;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__ = __webpack_require__(743);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.a;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.b;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__src_formatSpecifier__ = (__webpack_require__(311),
+ __webpack_require__(312));
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_formatSpecifier__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_3__src_precisionFixed__ = __webpack_require__(749);
+ __webpack_require__.d(__webpack_exports__, "d", function() {
+ return __WEBPACK_IMPORTED_MODULE_3__src_precisionFixed__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_4__src_precisionPrefix__ = __webpack_require__(750);
+ __webpack_require__.d(__webpack_exports__, "e", function() {
+ return __WEBPACK_IMPORTED_MODULE_4__src_precisionPrefix__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_5__src_precisionRound__ = __webpack_require__(751);
+ __webpack_require__.d(__webpack_exports__, "f", function() {
+ return __WEBPACK_IMPORTED_MODULE_5__src_precisionRound__.a;
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(127), __WEBPACK_IMPORTED_MODULE_1__formatGroup__ = __webpack_require__(744), __WEBPACK_IMPORTED_MODULE_2__formatNumerals__ = __webpack_require__(745), __WEBPACK_IMPORTED_MODULE_3__formatSpecifier__ = __webpack_require__(312), __WEBPACK_IMPORTED_MODULE_4__formatTypes__ = __webpack_require__(313), __WEBPACK_IMPORTED_MODULE_5__formatPrefixAuto__ = __webpack_require__(314), __WEBPACK_IMPORTED_MODULE_6__identity__ = __webpack_require__(748), prefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ];
+ __webpack_exports__.a = function(locale) {
+ function newFormat(specifier) {
+ function format(value) {
+ var i, n, c, valuePrefix = prefix, valueSuffix = suffix;
+ if ("c" === type) valueSuffix = formatType(value) + valueSuffix, value = ""; else {
+ value = +value;
+ var valueNegative = value < 0;
+ if (value = formatType(Math.abs(value), precision), valueNegative && 0 == +value && (valueNegative = !1),
+ valuePrefix = (valueNegative ? "(" === sign ? sign : "-" : "-" === sign || "(" === sign ? "" : sign) + valuePrefix,
+ valueSuffix = ("s" === type ? prefixes[8 + __WEBPACK_IMPORTED_MODULE_5__formatPrefixAuto__.b / 3] : "") + valueSuffix + (valueNegative && "(" === sign ? ")" : ""),
+ maybeSuffix) for (i = -1, n = value.length; ++i < n; ) if (48 > (c = value.charCodeAt(i)) || c > 57) {
+ valueSuffix = (46 === c ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix,
+ value = value.slice(0, i);
+ break;
+ }
+ }
+ comma && !zero && (value = group(value, 1 / 0));
+ var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
+ switch (comma && zero && (value = group(padding + value, padding.length ? width - valueSuffix.length : 1 / 0),
+ padding = ""), align) {
+ case "<":
+ value = valuePrefix + value + valueSuffix + padding;
+ break;
+
+ case "=":
+ value = valuePrefix + padding + value + valueSuffix;
+ break;
+
+ case "^":
+ value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
+ break;
+
+ default:
+ value = padding + valuePrefix + value + valueSuffix;
+ }
+ return numerals(value);
+ }
+ specifier = Object(__WEBPACK_IMPORTED_MODULE_3__formatSpecifier__.a)(specifier);
+ var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, type = specifier.type, prefix = "$" === symbol ? currency[0] : "#" === symbol && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", suffix = "$" === symbol ? currency[1] : /[%p]/.test(type) ? percent : "", formatType = __WEBPACK_IMPORTED_MODULE_4__formatTypes__.a[type], maybeSuffix = !type || /[defgprs%]/.test(type);
+ return precision = null == precision ? type ? 6 : 12 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision)),
+ format.toString = function() {
+ return specifier + "";
+ }, format;
+ }
+ function formatPrefix(specifier, value) {
+ var f = newFormat((specifier = Object(__WEBPACK_IMPORTED_MODULE_3__formatSpecifier__.a)(specifier),
+ specifier.type = "f", specifier)), e = 3 * Math.max(-8, Math.min(8, Math.floor(Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(value) / 3))), k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
+ return function(value) {
+ return f(k * value) + prefix;
+ };
+ }
+ var group = locale.grouping && locale.thousands ? Object(__WEBPACK_IMPORTED_MODULE_1__formatGroup__.a)(locale.grouping, locale.thousands) : __WEBPACK_IMPORTED_MODULE_6__identity__.a, currency = locale.currency, decimal = locale.decimal, numerals = locale.numerals ? Object(__WEBPACK_IMPORTED_MODULE_2__formatNumerals__.a)(locale.numerals) : __WEBPACK_IMPORTED_MODULE_6__identity__.a, percent = locale.percent || "%";
+ return {
+ format: newFormat,
+ formatPrefix: formatPrefix
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function formatSpecifier(specifier) {
+ return new FormatSpecifier(specifier);
+ }
+ function FormatSpecifier(specifier) {
+ if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
+ var match, fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zero = !!match[5], width = match[6] && +match[6], comma = !!match[7], precision = match[8] && +match[8].slice(1), type = match[9] || "";
+ "n" === type ? (comma = !0, type = "g") : __WEBPACK_IMPORTED_MODULE_0__formatTypes__.a[type] || (type = ""),
+ (zero || "0" === fill && "=" === align) && (zero = !0, fill = "0", align = "="),
+ this.fill = fill, this.align = align, this.sign = sign, this.symbol = symbol, this.zero = zero,
+ this.width = width, this.comma = comma, this.precision = precision, this.type = type;
+ }
+ __webpack_exports__.a = formatSpecifier;
+ var __WEBPACK_IMPORTED_MODULE_0__formatTypes__ = __webpack_require__(313), re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
+ formatSpecifier.prototype = FormatSpecifier.prototype, FormatSpecifier.prototype.toString = function() {
+ return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (null == this.width ? "" : Math.max(1, 0 | this.width)) + (this.comma ? "," : "") + (null == this.precision ? "" : "." + Math.max(0, 0 | this.precision)) + this.type;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__formatDefault__ = __webpack_require__(746), __WEBPACK_IMPORTED_MODULE_1__formatPrefixAuto__ = __webpack_require__(314), __WEBPACK_IMPORTED_MODULE_2__formatRounded__ = __webpack_require__(747);
+ __webpack_exports__.a = {
+ "": __WEBPACK_IMPORTED_MODULE_0__formatDefault__.a,
+ "%": function(x, p) {
+ return (100 * x).toFixed(p);
+ },
+ b: function(x) {
+ return Math.round(x).toString(2);
+ },
+ c: function(x) {
+ return x + "";
+ },
+ d: function(x) {
+ return Math.round(x).toString(10);
+ },
+ e: function(x, p) {
+ return x.toExponential(p);
+ },
+ f: function(x, p) {
+ return x.toFixed(p);
+ },
+ g: function(x, p) {
+ return x.toPrecision(p);
+ },
+ o: function(x) {
+ return Math.round(x).toString(8);
+ },
+ p: function(x, p) {
+ return Object(__WEBPACK_IMPORTED_MODULE_2__formatRounded__.a)(100 * x, p);
+ },
+ r: __WEBPACK_IMPORTED_MODULE_2__formatRounded__.a,
+ s: __WEBPACK_IMPORTED_MODULE_1__formatPrefixAuto__.a,
+ X: function(x) {
+ return Math.round(x).toString(16).toUpperCase();
+ },
+ x: function(x) {
+ return Math.round(x).toString(16);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return prefixExponent;
+ });
+ var prefixExponent, __WEBPACK_IMPORTED_MODULE_0__formatDecimal__ = __webpack_require__(192);
+ __webpack_exports__.a = function(x, p) {
+ var d = Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(x, p);
+ if (!d) return x + "";
+ var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = 3 * Math.max(-8, Math.min(8, Math.floor(exponent / 3)))) + 1, n = coefficient.length;
+ return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(x, Math.max(0, p + i - 1))[0];
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(domain, interval) {
+ domain = domain.slice();
+ var t, i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1];
+ return x1 < x0 && (t = i0, i0 = i1, i1 = t, t = x0, x0 = x1, x1 = t), domain[i0] = interval.floor(x0),
+ domain[i1] = interval.ceil(x1), domain;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function date(t) {
+ return new Date(t);
+ }
+ function number(t) {
+ return t instanceof Date ? +t : +new Date(+t);
+ }
+ function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
+ function tickFormat(date) {
+ return (second(date) < date ? formatMillisecond : minute(date) < date ? formatSecond : hour(date) < date ? formatMinute : day(date) < date ? formatHour : month(date) < date ? week(date) < date ? formatDay : formatWeek : year(date) < date ? formatMonth : formatYear)(date);
+ }
+ function tickInterval(interval, start, stop, step) {
+ if (null == interval && (interval = 10), "number" == typeof interval) {
+ var target = Math.abs(stop - start) / interval, i = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.c)(function(i) {
+ return i[2];
+ }).right(tickIntervals, target);
+ i === tickIntervals.length ? (step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.g)(start / durationYear, stop / durationYear, interval),
+ interval = year) : i ? (i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i],
+ step = i[1], interval = i[0]) : (step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.g)(start, stop, interval),
+ interval = millisecond);
+ }
+ return null == step ? interval : interval.every(step);
+ }
+ var scale = Object(__WEBPACK_IMPORTED_MODULE_5__continuous__.b)(__WEBPACK_IMPORTED_MODULE_5__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c), invert = scale.invert, domain = scale.domain, formatMillisecond = format(".%L"), formatSecond = format(":%S"), formatMinute = format("%I:%M"), formatHour = format("%I %p"), formatDay = format("%a %d"), formatWeek = format("%b %d"), formatMonth = format("%B"), formatYear = format("%Y"), tickIntervals = [ [ second, 1, durationSecond ], [ second, 5, 5 * durationSecond ], [ second, 15, 15 * durationSecond ], [ second, 30, 30 * durationSecond ], [ minute, 1, durationMinute ], [ minute, 5, 5 * durationMinute ], [ minute, 15, 15 * durationMinute ], [ minute, 30, 30 * durationMinute ], [ hour, 1, durationHour ], [ hour, 3, 3 * durationHour ], [ hour, 6, 6 * durationHour ], [ hour, 12, 12 * durationHour ], [ day, 1, durationDay ], [ day, 2, 2 * durationDay ], [ week, 1, durationWeek ], [ month, 1, durationMonth ], [ month, 3, 3 * durationMonth ], [ year, 1, durationYear ] ];
+ return scale.invert = function(y) {
+ return new Date(invert(y));
+ }, scale.domain = function(_) {
+ return arguments.length ? domain(__WEBPACK_IMPORTED_MODULE_4__array__.a.call(_, number)) : domain().map(date);
+ }, scale.ticks = function(interval, step) {
+ var t, d = domain(), t0 = d[0], t1 = d[d.length - 1], r = t1 < t0;
+ return r && (t = t0, t0 = t1, t1 = t), t = tickInterval(interval, t0, t1, step),
+ t = t ? t.range(t0, t1 + 1) : [], r ? t.reverse() : t;
+ }, scale.tickFormat = function(count, specifier) {
+ return null == specifier ? tickFormat : format(specifier);
+ }, scale.nice = function(interval, step) {
+ var d = domain();
+ return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) ? domain(Object(__WEBPACK_IMPORTED_MODULE_6__nice__.a)(d, interval)) : scale;
+ }, scale.copy = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_5__continuous__.a)(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
+ }, scale;
+ }
+ __webpack_exports__.a = calendar;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_2_d3_time__ = __webpack_require__(193), __WEBPACK_IMPORTED_MODULE_3_d3_time_format__ = __webpack_require__(317), __WEBPACK_IMPORTED_MODULE_4__array__ = __webpack_require__(56), __WEBPACK_IMPORTED_MODULE_5__continuous__ = __webpack_require__(126), __WEBPACK_IMPORTED_MODULE_6__nice__ = __webpack_require__(315), durationSecond = 1e3, durationMinute = 60 * durationSecond, durationHour = 60 * durationMinute, durationDay = 24 * durationHour, durationWeek = 7 * durationDay, durationMonth = 30 * durationDay, durationYear = 365 * durationDay;
+ __webpack_exports__.b = function() {
+ return calendar(__WEBPACK_IMPORTED_MODULE_2_d3_time__.k, __WEBPACK_IMPORTED_MODULE_2_d3_time__.f, __WEBPACK_IMPORTED_MODULE_2_d3_time__.j, __WEBPACK_IMPORTED_MODULE_2_d3_time__.a, __WEBPACK_IMPORTED_MODULE_2_d3_time__.b, __WEBPACK_IMPORTED_MODULE_2_d3_time__.d, __WEBPACK_IMPORTED_MODULE_2_d3_time__.g, __WEBPACK_IMPORTED_MODULE_2_d3_time__.c, __WEBPACK_IMPORTED_MODULE_3_d3_time_format__.a).domain([ new Date(2e3, 0, 1), new Date(2e3, 0, 2) ]);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__ = __webpack_require__(194);
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.a;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.b;
+ });
+ __webpack_require__(318), __webpack_require__(319), __webpack_require__(771);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function localDate(d) {
+ if (0 <= d.y && d.y < 100) {
+ var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
+ return date.setFullYear(d.y), date;
+ }
+ return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
+ }
+ function utcDate(d) {
+ if (0 <= d.y && d.y < 100) {
+ var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
+ return date.setUTCFullYear(d.y), date;
+ }
+ return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
+ }
+ function newYear(y) {
+ return {
+ y: y,
+ m: 0,
+ d: 1,
+ H: 0,
+ M: 0,
+ S: 0,
+ L: 0
+ };
+ }
+ function formatLocale(locale) {
+ function newFormat(specifier, formats) {
+ return function(date) {
+ var c, pad, format, string = [], i = -1, j = 0, n = specifier.length;
+ for (date instanceof Date || (date = new Date(+date)); ++i < n; ) 37 === specifier.charCodeAt(i) && (string.push(specifier.slice(j, i)),
+ null != (pad = pads[c = specifier.charAt(++i)]) ? c = specifier.charAt(++i) : pad = "e" === c ? " " : "0",
+ (format = formats[c]) && (c = format(date, pad)), string.push(c), j = i + 1);
+ return string.push(specifier.slice(j, i)), string.join("");
+ };
+ }
+ function newParse(specifier, newDate) {
+ return function(string) {
+ var week, day, d = newYear(1900), i = parseSpecifier(d, specifier, string += "", 0);
+ if (i != string.length) return null;
+ if ("Q" in d) return new Date(d.Q);
+ if ("p" in d && (d.H = d.H % 12 + 12 * d.p), "V" in d) {
+ if (d.V < 1 || d.V > 53) return null;
+ "w" in d || (d.w = 1), "Z" in d ? (week = utcDate(newYear(d.y)), day = week.getUTCDay(),
+ week = day > 4 || 0 === day ? __WEBPACK_IMPORTED_MODULE_0_d3_time__.p.ceil(week) : Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.p)(week),
+ week = __WEBPACK_IMPORTED_MODULE_0_d3_time__.l.offset(week, 7 * (d.V - 1)), d.y = week.getUTCFullYear(),
+ d.m = week.getUTCMonth(), d.d = week.getUTCDate() + (d.w + 6) % 7) : (week = newDate(newYear(d.y)),
+ day = week.getDay(), week = day > 4 || 0 === day ? __WEBPACK_IMPORTED_MODULE_0_d3_time__.e.ceil(week) : Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.e)(week),
+ week = __WEBPACK_IMPORTED_MODULE_0_d3_time__.a.offset(week, 7 * (d.V - 1)), d.y = week.getFullYear(),
+ d.m = week.getMonth(), d.d = week.getDate() + (d.w + 6) % 7);
+ } else ("W" in d || "U" in d) && ("w" in d || (d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0),
+ day = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(),
+ d.m = 0, d.d = "W" in d ? (d.w + 6) % 7 + 7 * d.W - (day + 5) % 7 : d.w + 7 * d.U - (day + 6) % 7);
+ return "Z" in d ? (d.H += d.Z / 100 | 0, d.M += d.Z % 100, utcDate(d)) : newDate(d);
+ };
+ }
+ function parseSpecifier(d, specifier, string, j) {
+ for (var c, parse, i = 0, n = specifier.length, m = string.length; i < n; ) {
+ if (j >= m) return -1;
+ if (37 === (c = specifier.charCodeAt(i++))) {
+ if (c = specifier.charAt(i++), !(parse = parses[c in pads ? specifier.charAt(i++) : c]) || (j = parse(d, string, j)) < 0) return -1;
+ } else if (c != string.charCodeAt(j++)) return -1;
+ }
+ return j;
+ }
+ function parsePeriod(d, string, i) {
+ var n = periodRe.exec(string.slice(i));
+ return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+ }
+ function parseShortWeekday(d, string, i) {
+ var n = shortWeekdayRe.exec(string.slice(i));
+ return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+ }
+ function parseWeekday(d, string, i) {
+ var n = weekdayRe.exec(string.slice(i));
+ return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+ }
+ function parseShortMonth(d, string, i) {
+ var n = shortMonthRe.exec(string.slice(i));
+ return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+ }
+ function parseMonth(d, string, i) {
+ var n = monthRe.exec(string.slice(i));
+ return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+ }
+ function parseLocaleDateTime(d, string, i) {
+ return parseSpecifier(d, locale_dateTime, string, i);
+ }
+ function parseLocaleDate(d, string, i) {
+ return parseSpecifier(d, locale_date, string, i);
+ }
+ function parseLocaleTime(d, string, i) {
+ return parseSpecifier(d, locale_time, string, i);
+ }
+ function formatShortWeekday(d) {
+ return locale_shortWeekdays[d.getDay()];
+ }
+ function formatWeekday(d) {
+ return locale_weekdays[d.getDay()];
+ }
+ function formatShortMonth(d) {
+ return locale_shortMonths[d.getMonth()];
+ }
+ function formatMonth(d) {
+ return locale_months[d.getMonth()];
+ }
+ function formatPeriod(d) {
+ return locale_periods[+(d.getHours() >= 12)];
+ }
+ function formatUTCShortWeekday(d) {
+ return locale_shortWeekdays[d.getUTCDay()];
+ }
+ function formatUTCWeekday(d) {
+ return locale_weekdays[d.getUTCDay()];
+ }
+ function formatUTCShortMonth(d) {
+ return locale_shortMonths[d.getUTCMonth()];
+ }
+ function formatUTCMonth(d) {
+ return locale_months[d.getUTCMonth()];
+ }
+ function formatUTCPeriod(d) {
+ return locale_periods[+(d.getUTCHours() >= 12)];
+ }
+ var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_weekdays = locale.days, locale_shortWeekdays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths, periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths), formats = {
+ a: formatShortWeekday,
+ A: formatWeekday,
+ b: formatShortMonth,
+ B: formatMonth,
+ c: null,
+ d: formatDayOfMonth,
+ e: formatDayOfMonth,
+ f: formatMicroseconds,
+ H: formatHour24,
+ I: formatHour12,
+ j: formatDayOfYear,
+ L: formatMilliseconds,
+ m: formatMonthNumber,
+ M: formatMinutes,
+ p: formatPeriod,
+ Q: formatUnixTimestamp,
+ s: formatUnixTimestampSeconds,
+ S: formatSeconds,
+ u: formatWeekdayNumberMonday,
+ U: formatWeekNumberSunday,
+ V: formatWeekNumberISO,
+ w: formatWeekdayNumberSunday,
+ W: formatWeekNumberMonday,
+ x: null,
+ X: null,
+ y: formatYear,
+ Y: formatFullYear,
+ Z: formatZone,
+ "%": formatLiteralPercent
+ }, utcFormats = {
+ a: formatUTCShortWeekday,
+ A: formatUTCWeekday,
+ b: formatUTCShortMonth,
+ B: formatUTCMonth,
+ c: null,
+ d: formatUTCDayOfMonth,
+ e: formatUTCDayOfMonth,
+ f: formatUTCMicroseconds,
+ H: formatUTCHour24,
+ I: formatUTCHour12,
+ j: formatUTCDayOfYear,
+ L: formatUTCMilliseconds,
+ m: formatUTCMonthNumber,
+ M: formatUTCMinutes,
+ p: formatUTCPeriod,
+ Q: formatUnixTimestamp,
+ s: formatUnixTimestampSeconds,
+ S: formatUTCSeconds,
+ u: formatUTCWeekdayNumberMonday,
+ U: formatUTCWeekNumberSunday,
+ V: formatUTCWeekNumberISO,
+ w: formatUTCWeekdayNumberSunday,
+ W: formatUTCWeekNumberMonday,
+ x: null,
+ X: null,
+ y: formatUTCYear,
+ Y: formatUTCFullYear,
+ Z: formatUTCZone,
+ "%": formatLiteralPercent
+ }, parses = {
+ a: parseShortWeekday,
+ A: parseWeekday,
+ b: parseShortMonth,
+ B: parseMonth,
+ c: parseLocaleDateTime,
+ d: parseDayOfMonth,
+ e: parseDayOfMonth,
+ f: parseMicroseconds,
+ H: parseHour24,
+ I: parseHour24,
+ j: parseDayOfYear,
+ L: parseMilliseconds,
+ m: parseMonthNumber,
+ M: parseMinutes,
+ p: parsePeriod,
+ Q: parseUnixTimestamp,
+ s: parseUnixTimestampSeconds,
+ S: parseSeconds,
+ u: parseWeekdayNumberMonday,
+ U: parseWeekNumberSunday,
+ V: parseWeekNumberISO,
+ w: parseWeekdayNumberSunday,
+ W: parseWeekNumberMonday,
+ x: parseLocaleDate,
+ X: parseLocaleTime,
+ y: parseYear,
+ Y: parseFullYear,
+ Z: parseZone,
+ "%": parseLiteralPercent
+ };
+ return formats.x = newFormat(locale_date, formats), formats.X = newFormat(locale_time, formats),
+ formats.c = newFormat(locale_dateTime, formats), utcFormats.x = newFormat(locale_date, utcFormats),
+ utcFormats.X = newFormat(locale_time, utcFormats), utcFormats.c = newFormat(locale_dateTime, utcFormats),
+ {
+ format: function(specifier) {
+ var f = newFormat(specifier += "", formats);
+ return f.toString = function() {
+ return specifier;
+ }, f;
+ },
+ parse: function(specifier) {
+ var p = newParse(specifier += "", localDate);
+ return p.toString = function() {
+ return specifier;
+ }, p;
+ },
+ utcFormat: function(specifier) {
+ var f = newFormat(specifier += "", utcFormats);
+ return f.toString = function() {
+ return specifier;
+ }, f;
+ },
+ utcParse: function(specifier) {
+ var p = newParse(specifier, utcDate);
+ return p.toString = function() {
+ return specifier;
+ }, p;
+ }
+ };
+ }
+ function pad(value, fill, width) {
+ var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
+ return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
+ }
+ function requote(s) {
+ return s.replace(requoteRe, "\\$&");
+ }
+ function formatRe(names) {
+ return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
+ }
+ function formatLookup(names) {
+ for (var map = {}, i = -1, n = names.length; ++i < n; ) map[names[i].toLowerCase()] = i;
+ return map;
+ }
+ function parseWeekdayNumberSunday(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 1));
+ return n ? (d.w = +n[0], i + n[0].length) : -1;
+ }
+ function parseWeekdayNumberMonday(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 1));
+ return n ? (d.u = +n[0], i + n[0].length) : -1;
+ }
+ function parseWeekNumberSunday(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.U = +n[0], i + n[0].length) : -1;
+ }
+ function parseWeekNumberISO(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.V = +n[0], i + n[0].length) : -1;
+ }
+ function parseWeekNumberMonday(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.W = +n[0], i + n[0].length) : -1;
+ }
+ function parseFullYear(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 4));
+ return n ? (d.y = +n[0], i + n[0].length) : -1;
+ }
+ function parseYear(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;
+ }
+ function parseZone(d, string, i) {
+ var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
+ return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
+ }
+ function parseMonthNumber(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
+ }
+ function parseDayOfMonth(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.d = +n[0], i + n[0].length) : -1;
+ }
+ function parseDayOfYear(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 3));
+ return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
+ }
+ function parseHour24(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.H = +n[0], i + n[0].length) : -1;
+ }
+ function parseMinutes(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.M = +n[0], i + n[0].length) : -1;
+ }
+ function parseSeconds(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 2));
+ return n ? (d.S = +n[0], i + n[0].length) : -1;
+ }
+ function parseMilliseconds(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 3));
+ return n ? (d.L = +n[0], i + n[0].length) : -1;
+ }
+ function parseMicroseconds(d, string, i) {
+ var n = numberRe.exec(string.slice(i, i + 6));
+ return n ? (d.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;
+ }
+ function parseLiteralPercent(d, string, i) {
+ var n = percentRe.exec(string.slice(i, i + 1));
+ return n ? i + n[0].length : -1;
+ }
+ function parseUnixTimestamp(d, string, i) {
+ var n = numberRe.exec(string.slice(i));
+ return n ? (d.Q = +n[0], i + n[0].length) : -1;
+ }
+ function parseUnixTimestampSeconds(d, string, i) {
+ var n = numberRe.exec(string.slice(i));
+ return n ? (d.Q = 1e3 * +n[0], i + n[0].length) : -1;
+ }
+ function formatDayOfMonth(d, p) {
+ return pad(d.getDate(), p, 2);
+ }
+ function formatHour24(d, p) {
+ return pad(d.getHours(), p, 2);
+ }
+ function formatHour12(d, p) {
+ return pad(d.getHours() % 12 || 12, p, 2);
+ }
+ function formatDayOfYear(d, p) {
+ return pad(1 + __WEBPACK_IMPORTED_MODULE_0_d3_time__.a.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d), p, 3);
+ }
+ function formatMilliseconds(d, p) {
+ return pad(d.getMilliseconds(), p, 3);
+ }
+ function formatMicroseconds(d, p) {
+ return formatMilliseconds(d, p) + "000";
+ }
+ function formatMonthNumber(d, p) {
+ return pad(d.getMonth() + 1, p, 2);
+ }
+ function formatMinutes(d, p) {
+ return pad(d.getMinutes(), p, 2);
+ }
+ function formatSeconds(d, p) {
+ return pad(d.getSeconds(), p, 2);
+ }
+ function formatWeekdayNumberMonday(d) {
+ var day = d.getDay();
+ return 0 === day ? 7 : day;
+ }
+ function formatWeekNumberSunday(d, p) {
+ return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.h.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d), p, 2);
+ }
+ function formatWeekNumberISO(d, p) {
+ var day = d.getDay();
+ return d = day >= 4 || 0 === day ? Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.i)(d) : __WEBPACK_IMPORTED_MODULE_0_d3_time__.i.ceil(d),
+ pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.i.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d) + (4 === Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d).getDay()), p, 2);
+ }
+ function formatWeekdayNumberSunday(d) {
+ return d.getDay();
+ }
+ function formatWeekNumberMonday(d, p) {
+ return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.e.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d), p, 2);
+ }
+ function formatYear(d, p) {
+ return pad(d.getFullYear() % 100, p, 2);
+ }
+ function formatFullYear(d, p) {
+ return pad(d.getFullYear() % 1e4, p, 4);
+ }
+ function formatZone(d) {
+ var z = d.getTimezoneOffset();
+ return (z > 0 ? "-" : (z *= -1, "+")) + pad(z / 60 | 0, "0", 2) + pad(z % 60, "0", 2);
+ }
+ function formatUTCDayOfMonth(d, p) {
+ return pad(d.getUTCDate(), p, 2);
+ }
+ function formatUTCHour24(d, p) {
+ return pad(d.getUTCHours(), p, 2);
+ }
+ function formatUTCHour12(d, p) {
+ return pad(d.getUTCHours() % 12 || 12, p, 2);
+ }
+ function formatUTCDayOfYear(d, p) {
+ return pad(1 + __WEBPACK_IMPORTED_MODULE_0_d3_time__.l.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d), p, 3);
+ }
+ function formatUTCMilliseconds(d, p) {
+ return pad(d.getUTCMilliseconds(), p, 3);
+ }
+ function formatUTCMicroseconds(d, p) {
+ return formatUTCMilliseconds(d, p) + "000";
+ }
+ function formatUTCMonthNumber(d, p) {
+ return pad(d.getUTCMonth() + 1, p, 2);
+ }
+ function formatUTCMinutes(d, p) {
+ return pad(d.getUTCMinutes(), p, 2);
+ }
+ function formatUTCSeconds(d, p) {
+ return pad(d.getUTCSeconds(), p, 2);
+ }
+ function formatUTCWeekdayNumberMonday(d) {
+ var dow = d.getUTCDay();
+ return 0 === dow ? 7 : dow;
+ }
+ function formatUTCWeekNumberSunday(d, p) {
+ return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.s.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d), p, 2);
+ }
+ function formatUTCWeekNumberISO(d, p) {
+ var day = d.getUTCDay();
+ return d = day >= 4 || 0 === day ? Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.t)(d) : __WEBPACK_IMPORTED_MODULE_0_d3_time__.t.ceil(d),
+ pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.t.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d) + (4 === Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d).getUTCDay()), p, 2);
+ }
+ function formatUTCWeekdayNumberSunday(d) {
+ return d.getUTCDay();
+ }
+ function formatUTCWeekNumberMonday(d, p) {
+ return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.p.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d), p, 2);
+ }
+ function formatUTCYear(d, p) {
+ return pad(d.getUTCFullYear() % 100, p, 2);
+ }
+ function formatUTCFullYear(d, p) {
+ return pad(d.getUTCFullYear() % 1e4, p, 4);
+ }
+ function formatUTCZone() {
+ return "+0000";
+ }
+ function formatLiteralPercent() {
+ return "%";
+ }
+ function formatUnixTimestamp(d) {
+ return +d;
+ }
+ function formatUnixTimestampSeconds(d) {
+ return Math.floor(+d / 1e3);
+ }
+ __webpack_exports__.a = formatLocale;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_time__ = __webpack_require__(193), pads = {
+ "-": "",
+ _: " ",
+ "0": "0"
+ }, numberRe = /^\s*\d+/, percentRe = /^%/, requoteRe = /[\\^$*+?|[\]().{}]/g;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function formatIsoNative(date) {
+ return date.toISOString();
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return isoSpecifier;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__defaultLocale__ = __webpack_require__(194), isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
+ Date.prototype.toISOString || Object(__WEBPACK_IMPORTED_MODULE_0__defaultLocale__.b)(isoSpecifier);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_6__shape_Dot__ = __webpack_require__(57), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__component_Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_9__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ReferenceDot = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function ReferenceDot() {
+ return _classCallCheck(this, ReferenceDot), _possibleConstructorReturn(this, (ReferenceDot.__proto__ || Object.getPrototypeOf(ReferenceDot)).apply(this, arguments));
+ }
+ return _inherits(ReferenceDot, _Component), _createClass(ReferenceDot, [ {
+ key: "getCoordinate",
+ value: function() {
+ var _props = this.props, x = _props.x, y = _props.y, xAxis = _props.xAxis, yAxis = _props.yAxis, xScale = xAxis.scale, yScale = yAxis.scale, result = {
+ cx: xScale(x) + (xScale.bandwidth ? xScale.bandwidth() / 2 : 0),
+ cy: yScale(y) + (yScale.bandwidth ? yScale.bandwidth() / 2 : 0)
+ };
+ return Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.D)(result.cx, xScale) && Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.D)(result.cy, yScale) ? result : null;
+ }
+ }, {
+ key: "renderDot",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__shape_Dot__.a, _extends({}, props, {
+ cx: props.cx,
+ cy: props.cy,
+ className: "recharts-reference-dot-dot"
+ }));
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, x = _props2.x, y = _props2.y, r = _props2.r, isX = Object(__WEBPACK_IMPORTED_MODULE_9__util_DataUtils__.f)(x), isY = Object(__WEBPACK_IMPORTED_MODULE_9__util_DataUtils__.f)(y);
+ if (!isX || !isY) return null;
+ var coordinate = this.getCoordinate();
+ if (!coordinate) return null;
+ var _props3 = this.props, shape = _props3.shape, className = _props3.className, dotProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props), coordinate);
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__container_Layer__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()("recharts-reference-dot", className)
+ }, this.renderDot(shape, dotProps), __WEBPACK_IMPORTED_MODULE_8__component_Label__.a.renderCallByParent(this.props, {
+ x: coordinate.cx - r,
+ y: coordinate.cy - r,
+ width: 2 * r,
+ height: 2 * r
+ }));
+ }
+ } ]), ReferenceDot;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "ReferenceDot",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.a, {
+ r: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ scale: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func
+ }),
+ yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ scale: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func
+ }),
+ isFront: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ alwaysShow: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ shape: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ])
+ }), _class2.defaultProps = {
+ isFront: !1,
+ alwaysShow: !1,
+ xAxisId: 0,
+ yAxisId: 0,
+ r: 10,
+ fill: "#fff",
+ stroke: "#ccc",
+ fillOpacity: 1,
+ strokeWidth: 1
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = ReferenceDot;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__component_Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__ = __webpack_require__(16), _slicedToArray = function() {
+ function sliceIterator(arr, i) {
+ var _arr = [], _n = !0, _d = !1, _e = void 0;
+ try {
+ for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value),
+ !i || _arr.length !== i); _n = !0) ;
+ } catch (err) {
+ _d = !0, _e = err;
+ } finally {
+ try {
+ !_n && _i.return && _i.return();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+ return _arr;
+ }
+ return function(arr, i) {
+ if (Array.isArray(arr)) return arr;
+ if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ };
+ }(), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, renderLine = function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("line", _extends({}, props, {
+ className: "recharts-reference-line-line"
+ }));
+ }, ReferenceLine = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function ReferenceLine() {
+ return _classCallCheck(this, ReferenceLine), _possibleConstructorReturn(this, (ReferenceLine.__proto__ || Object.getPrototypeOf(ReferenceLine)).apply(this, arguments));
+ }
+ return _inherits(ReferenceLine, _Component), _createClass(ReferenceLine, [ {
+ key: "getEndPoints",
+ value: function(isX, isY) {
+ var _props = this.props, xAxis = _props.xAxis, yAxis = _props.yAxis, viewBox = _props.viewBox, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height;
+ if (isY) {
+ var value = this.props.y, scale = yAxis.scale, offset = scale.bandwidth ? scale.bandwidth() / 2 : 0, coord = scale(value) + offset;
+ if (Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(coord, scale)) return "left" === yAxis.orientation ? [ {
+ x: x,
+ y: coord
+ }, {
+ x: x + width,
+ y: coord
+ } ] : [ {
+ x: x + width,
+ y: coord
+ }, {
+ x: x,
+ y: coord
+ } ];
+ } else if (isX) {
+ var _value = this.props.x, _scale = xAxis.scale, _offset = _scale.bandwidth ? _scale.bandwidth() / 2 : 0, _coord = _scale(_value) + _offset;
+ if (Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(_coord, _scale)) return "top" === xAxis.orientation ? [ {
+ x: _coord,
+ y: y
+ }, {
+ x: _coord,
+ y: y + height
+ } ] : [ {
+ x: _coord,
+ y: y + height
+ }, {
+ x: _coord,
+ y: y
+ } ];
+ }
+ return null;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, x = _props2.x, y = _props2.y, shape = _props2.shape, className = _props2.className, isX = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(x), isY = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(y);
+ if (!isX && !isY) return null;
+ var endPoints = this.getEndPoints(isX, isY);
+ if (!endPoints) return null;
+ var _endPoints = _slicedToArray(endPoints, 2), start = _endPoints[0], end = _endPoints[1], props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.e)(this.props), {
+ x1: start.x,
+ y1: start.y,
+ x2: end.x,
+ y2: end.y
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__container_Layer__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()("recharts-reference-line", className)
+ }, renderLine(shape, props), __WEBPACK_IMPORTED_MODULE_7__component_Label__.a.renderCallByParent(this.props, {
+ x: Math.min(props.x1, props.x2),
+ y: Math.min(props.y1, props.y2),
+ width: Math.abs(props.x2 - props.x1),
+ height: Math.abs(props.y2 - props.y1)
+ }));
+ }
+ } ]), ReferenceLine;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "ReferenceLine",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, {
+ viewBox: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number
+ }),
+ xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ isFront: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ alwaysShow: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ shape: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func
+ }), _class2.defaultProps = {
+ isFront: !1,
+ alwaysShow: !1,
+ xAxisId: 0,
+ yAxisId: 0,
+ fill: "none",
+ stroke: "#ccc",
+ fillOpacity: 1,
+ strokeWidth: 1
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = ReferenceLine;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_6__component_Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__ = __webpack_require__(65), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ReferenceArea = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function ReferenceArea() {
+ return _classCallCheck(this, ReferenceArea), _possibleConstructorReturn(this, (ReferenceArea.__proto__ || Object.getPrototypeOf(ReferenceArea)).apply(this, arguments));
+ }
+ return _inherits(ReferenceArea, _Component), _createClass(ReferenceArea, [ {
+ key: "getRect",
+ value: function(hasX1, hasX2, hasY1, hasY2) {
+ var _props = this.props, xValue1 = _props.x1, xValue2 = _props.x2, yValue1 = _props.y1, yValue2 = _props.y2, xAxis = _props.xAxis, yAxis = _props.yAxis, xScale = xAxis.scale, yScale = yAxis.scale, xOffset = xScale.bandwidth ? xScale.bandwidth() / 2 : 0, yOffset = yScale.bandwidth ? yScale.bandwidth() / 2 : 0, xRange = xScale.range(), yRange = yScale.range(), x1 = void 0, x2 = void 0, y1 = void 0, y2 = void 0;
+ return x1 = hasX1 ? xScale(xValue1) + xOffset : xRange[0], x2 = hasX2 ? xScale(xValue2) + xOffset : xRange[1],
+ y1 = hasY1 ? yScale(yValue1) + yOffset : yRange[0], y2 = hasY2 ? yScale(yValue2) + yOffset : yRange[1],
+ Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(x1, xScale) && Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(x2, xScale) && Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(y1, yScale) && Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(y2, yScale) ? {
+ x: Math.min(x1, x2),
+ y: Math.min(y1, y2),
+ width: Math.abs(x2 - x1),
+ height: Math.abs(y2 - y1)
+ } : null;
+ }
+ }, {
+ key: "renderRect",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__.a, _extends({}, props, {
+ className: "recharts-reference-area-rect"
+ }));
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, x1 = _props2.x1, x2 = _props2.x2, y1 = _props2.y1, y2 = _props2.y2, className = _props2.className, hasX1 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(x1), hasX2 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(x2), hasY1 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(y1), hasY2 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.f)(y2);
+ if (!(hasX1 || hasX2 || hasY1 || hasY2)) return null;
+ var rect = this.getRect(hasX1, hasX2, hasY1, hasY2);
+ if (!rect) return null;
+ var shape = this.props.shape;
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__container_Layer__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()("recharts-reference-area", className)
+ }, this.renderRect(shape, _extends({}, this.props, rect)), __WEBPACK_IMPORTED_MODULE_6__component_Label__.a.renderCallByParent(this.props, rect));
+ }
+ } ]), ReferenceArea;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "ReferenceArea",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, {
+ viewBox: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number
+ }),
+ xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ isFront: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ alwaysShow: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ x1: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ x2: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ y1: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ y2: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),
+ yAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ xAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ shape: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ])
+ }), _class2.defaultProps = {
+ isFront: !1,
+ alwaysShow: !1,
+ xAxisId: 0,
+ yAxisId: 0,
+ r: 10,
+ fill: "#ccc",
+ fillOpacity: .5,
+ stroke: "none",
+ strokeWidth: 1
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = ReferenceArea;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Cross = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Cross() {
+ return _classCallCheck(this, Cross), _possibleConstructorReturn(this, (Cross.__proto__ || Object.getPrototypeOf(Cross)).apply(this, arguments));
+ }
+ return _inherits(Cross, _Component), _createClass(Cross, [ {
+ key: "getPath",
+ value: function(x, y, width, height, top, left) {
+ return "M" + x + "," + top + "v" + height + "M" + left + "," + y + "h" + width;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, top = _props.top, left = _props.left, className = _props.className;
+ return Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(x) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(y) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(width) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(height) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(top) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(left) ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), {
+ className: __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-cross", className),
+ d: this.getPath(x, y, width, height, top, left)
+ })) : null;
+ }
+ } ]), Cross;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Cross",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, {
+ x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string
+ }), _class2.defaultProps = {
+ x: 0,
+ y: 0,
+ top: 0,
+ left: 0,
+ width: 0,
+ height: 0
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Cross;
+}, function(module, exports, __webpack_require__) {
+ function maxBy(array, iteratee) {
+ return array && array.length ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt) : void 0;
+ }
+ var baseExtremum = __webpack_require__(124), baseGt = __webpack_require__(283), baseIteratee = __webpack_require__(84);
+ module.exports = maxBy;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject__ = __webpack_require__(274), __WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject__), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_4_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_4_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react__), __WEBPACK_IMPORTED_MODULE_5_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_5_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_prop_types__), __WEBPACK_IMPORTED_MODULE_6_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_6_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react_smooth__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__shape_Sector__ = __webpack_require__(128), __WEBPACK_IMPORTED_MODULE_11__shape_Curve__ = __webpack_require__(66), __WEBPACK_IMPORTED_MODULE_12__component_Text__ = __webpack_require__(55), __WEBPACK_IMPORTED_MODULE_13__component_Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_14__component_LabelList__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_15__component_Cell__ = __webpack_require__(85), __WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_18__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_20__util_LogUtils__ = __webpack_require__(280), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Pie = Object(__WEBPACK_IMPORTED_MODULE_8__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Pie() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Pie);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Pie.__proto__ || Object.getPrototypeOf(Pie)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !1,
+ isAnimationStarted: !1
+ }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.j)("recharts-pie-"),
+ _this.cachePrevData = function(sectors) {
+ _this.setState({
+ prevSectors: sectors
+ });
+ }, _this.handleAnimationEnd = function() {
+ _this.setState({
+ isAnimationFinished: !0
+ });
+ }, _this.handleAnimationStart = function() {
+ _this.setState({
+ isAnimationStarted: !0
+ });
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Pie, _Component), _createClass(Pie, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, sectors = _props.sectors;
+ nextProps.isAnimationActive !== this.props.isAnimationActive ? this.cachePrevData([]) : nextProps.animationId !== animationId && this.cachePrevData(sectors);
+ }
+ }, {
+ key: "getTextAnchor",
+ value: function(x, cx) {
+ return x > cx ? "start" : x < cx ? "end" : "middle";
+ }
+ }, {
+ key: "isActiveIndex",
+ value: function(i) {
+ var activeIndex = this.props.activeIndex;
+ return Array.isArray(activeIndex) ? -1 !== activeIndex.indexOf(i) : i === activeIndex;
+ }
+ }, {
+ key: "renderLabelLineItem",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__shape_Curve__.a, _extends({}, props, {
+ type: "linear",
+ className: "recharts-pie-label-line"
+ }));
+ }
+ }, {
+ key: "renderLabelItem",
+ value: function(option, props, value) {
+ if (__WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option)) return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props);
+ var label = value;
+ return __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) && (label = option(props),
+ __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(label)) ? label : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_12__component_Text__.a, _extends({}, props, {
+ alignmentBaseline: "middle",
+ className: "recharts-pie-label-text"
+ }), label);
+ }
+ }, {
+ key: "renderLabels",
+ value: function(sectors) {
+ var _this2 = this;
+ if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;
+ var _props2 = this.props, label = _props2.label, labelLine = _props2.labelLine, dataKey = _props2.dataKey, valueKey = _props2.valueKey, pieProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(this.props), customLabelProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(label), customLabelLineProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(labelLine), offsetRadius = label && label.offsetRadius || 20, labels = sectors.map(function(entry, i) {
+ var midAngle = (entry.startAngle + entry.endAngle) / 2, endPoint = Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.e)(entry.cx, entry.cy, entry.outerRadius + offsetRadius, midAngle), labelProps = _extends({}, pieProps, entry, {
+ stroke: "none"
+ }, customLabelProps, {
+ index: i,
+ textAnchor: _this2.getTextAnchor(endPoint.x, entry.cx)
+ }, endPoint), lineProps = _extends({}, pieProps, entry, {
+ fill: "none",
+ stroke: entry.fill
+ }, customLabelLineProps, {
+ index: i,
+ points: [ Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.e)(entry.cx, entry.cy, entry.outerRadius, midAngle), endPoint ]
+ }), realDataKey = dataKey;
+ return __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(valueKey) ? realDataKey = "value" : __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && (realDataKey = valueKey),
+ __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {
+ key: "label-" + i
+ }, labelLine && _this2.renderLabelLineItem(labelLine, lineProps), _this2.renderLabelItem(label, labelProps, Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey)));
+ });
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {
+ className: "recharts-pie-labels"
+ }, labels);
+ }
+ }, {
+ key: "renderSectorItem",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject___default()(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Sector__.a, _extends({}, props, option)) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Sector__.a, props);
+ }
+ }, {
+ key: "renderSectorsStatically",
+ value: function(sectors) {
+ var _this3 = this, activeShape = this.props.activeShape;
+ return sectors.map(function(entry, i) {
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, _extends({
+ className: "recharts-pie-sector"
+ }, Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.f)(_this3.props, entry, i), {
+ key: "sector-" + i
+ }), _this3.renderSectorItem(_this3.isActiveIndex(i) ? activeShape : null, entry));
+ });
+ }
+ }, {
+ key: "renderSectorsWithAnimation",
+ value: function() {
+ var _this4 = this, _props3 = this.props, sectors = _props3.sectors, isAnimationActive = _props3.isAnimationActive, animationBegin = _props3.animationBegin, animationDuration = _props3.animationDuration, animationEasing = _props3.animationEasing, animationId = _props3.animationId, prevSectors = this.state.prevSectors;
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "pie-" + animationId,
+ onAnimationEnd: this.handleAnimationEnd
+ }, function(_ref2) {
+ var t = _ref2.t, stepData = [], first = sectors && sectors[0], curAngle = first.startAngle;
+ return sectors.forEach(function(entry, index) {
+ var prev = prevSectors && prevSectors[index], paddingAngle = index > 0 ? entry.paddingAngle : 0;
+ if (prev) {
+ var angleIp = Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.e)(prev.endAngle - prev.startAngle, entry.endAngle - entry.startAngle), latest = _extends({}, entry, {
+ startAngle: curAngle + paddingAngle,
+ endAngle: curAngle + angleIp(t) + paddingAngle
+ });
+ stepData.push(latest), curAngle = latest.endAngle;
+ } else {
+ var endAngle = entry.endAngle, startAngle = entry.startAngle, interpolatorAngle = Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.e)(0, endAngle - startAngle), deltaAngle = interpolatorAngle(t), _latest = _extends({}, entry, {
+ startAngle: curAngle + paddingAngle,
+ endAngle: curAngle + deltaAngle + paddingAngle
+ });
+ stepData.push(_latest), curAngle = _latest.endAngle;
+ }
+ }), __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, null, _this4.renderSectorsStatically(stepData));
+ });
+ }
+ }, {
+ key: "renderSectors",
+ value: function() {
+ var _props4 = this.props, sectors = _props4.sectors, isAnimationActive = _props4.isAnimationActive, prevSectors = this.state.prevSectors;
+ return !(isAnimationActive && sectors && sectors.length) || prevSectors && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevSectors, sectors) ? this.renderSectorsStatically(sectors) : this.renderSectorsWithAnimation();
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props5 = this.props, hide = _props5.hide, sectors = _props5.sectors, className = _props5.className, label = _props5.label, cx = _props5.cx, cy = _props5.cy, innerRadius = _props5.innerRadius, outerRadius = _props5.outerRadius, isAnimationActive = _props5.isAnimationActive, id = _props5.id;
+ if (hide || !sectors || !sectors.length || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.g)(cx) || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.g)(cy) || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.g)(innerRadius) || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.g)(outerRadius)) return null;
+ var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_7_classnames___default()("recharts-pie", className);
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {
+ className: layerClass
+ }, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement("g", {
+ clipPath: "url(#" + (__WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(id) ? this.id : id) + ")"
+ }, this.renderSectors()), label && this.renderLabels(sectors), __WEBPACK_IMPORTED_MODULE_13__component_Label__.a.renderCallByParent(this.props, null, !1), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_14__component_LabelList__.a.renderCallByParent(this.props, sectors, !1));
+ }
+ } ]), Pie;
+ }(__WEBPACK_IMPORTED_MODULE_4_react__.Component), _class2.displayName = "Pie", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string,
+ animationId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ cx: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ cy: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ startAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ endAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ paddingAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ innerRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ outerRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ cornerRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),
+ dataKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]).isRequired,
+ nameKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),
+ valueKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),
+ data: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object),
+ minAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ legendType: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.b),
+ maxRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ sectors: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object),
+ hide: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,
+ labelLine: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool ]),
+ label: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({
+ offsetRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number
+ }), __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool ]),
+ activeShape: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element ]),
+ activeIndex: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number) ]),
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "spring", "linear" ]),
+ id: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string
+ }), _class2.defaultProps = {
+ stroke: "#fff",
+ fill: "#808080",
+ legendType: "rect",
+ cx: "50%",
+ cy: "50%",
+ startAngle: 0,
+ endAngle: 360,
+ innerRadius: 0,
+ outerRadius: "80%",
+ paddingAngle: 0,
+ labelLine: !0,
+ hide: !1,
+ minAngle: 0,
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.n)(),
+ animationBegin: 400,
+ animationDuration: 1500,
+ animationEasing: "ease",
+ nameKey: "name"
+ }, _class2.parseDeltaAngle = function(_ref3) {
+ var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle;
+ return Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.i)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360);
+ }, _class2.getRealPieData = function(item) {
+ var _item$props = item.props, data = _item$props.data, children = _item$props.children, presentationProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(item.props), cells = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__component_Cell__.a);
+ return data && data.length ? data.map(function(entry, index) {
+ return _extends({
+ payload: entry
+ }, presentationProps, entry, cells && cells[index] && cells[index].props);
+ }) : cells && cells.length ? cells.map(function(cell) {
+ return _extends({}, presentationProps, cell.props);
+ }) : [];
+ }, _class2.parseCoordinateOfPie = function(item, offset) {
+ var top = offset.top, left = offset.left, width = offset.width, height = offset.height, maxPieRadius = Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.c)(width, height);
+ return {
+ cx: left + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.c)(item.props.cx, width, width / 2),
+ cy: top + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.c)(item.props.cy, height, height / 2),
+ innerRadius: Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.c)(item.props.innerRadius, maxPieRadius, 0),
+ outerRadius: Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.c)(item.props.outerRadius, maxPieRadius, .8 * maxPieRadius),
+ maxRadius: item.props.maxRadius || Math.sqrt(width * width + height * height) / 2
+ };
+ }, _class2.getComposedData = function(_ref4) {
+ var item = _ref4.item, offset = _ref4.offset, onItemMouseLeave = _ref4.onItemMouseLeave, onItemMouseEnter = _ref4.onItemMouseEnter, pieData = Pie.getRealPieData(item);
+ if (!pieData || !pieData.length) return [];
+ var _item$props2 = item.props, cornerRadius = _item$props2.cornerRadius, startAngle = _item$props2.startAngle, endAngle = _item$props2.endAngle, paddingAngle = _item$props2.paddingAngle, dataKey = _item$props2.dataKey, nameKey = _item$props2.nameKey, valueKey = _item$props2.valueKey, minAngle = Math.abs(item.props.minAngle), coordinate = Pie.parseCoordinateOfPie(item, offset), len = pieData.length, deltaAngle = Pie.parseDeltaAngle({
+ startAngle: startAngle,
+ endAngle: endAngle
+ }), absDeltaAngle = Math.abs(deltaAngle), totalPadingAngle = (absDeltaAngle >= 360 ? len : len - 1) * paddingAngle, realTotalAngle = absDeltaAngle - len * minAngle - totalPadingAngle, realDataKey = dataKey;
+ __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(valueKey) ? (Object(__WEBPACK_IMPORTED_MODULE_20__util_LogUtils__.a)(!1, 'Use "dataKey" to specify the value of pie,\n the props "valueKey" will be deprecated in 1.1.0'),
+ realDataKey = "value") : __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && (Object(__WEBPACK_IMPORTED_MODULE_20__util_LogUtils__.a)(!1, 'Use "dataKey" to specify the value of pie,\n the props "valueKey" will be deprecated in 1.1.0'),
+ realDataKey = valueKey);
+ var sum = pieData.reduce(function(result, entry) {
+ var val = Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey, 0);
+ return result + (Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.g)(val) ? val : 0);
+ }, 0), sectors = void 0;
+ if (sum > 0) {
+ var prev = void 0;
+ sectors = pieData.map(function(entry, i) {
+ var val = Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey, 0), name = Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, nameKey, i), percent = (Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.g)(val) ? val : 0) / sum, tempStartAngle = void 0;
+ tempStartAngle = i ? prev.endAngle + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.i)(deltaAngle) * paddingAngle : startAngle;
+ var tempEndAngle = tempStartAngle + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.i)(deltaAngle) * (minAngle + percent * realTotalAngle), midAngle = (tempStartAngle + tempEndAngle) / 2, middleRadius = (coordinate.innerRadius + coordinate.outerRadius) / 2, tooltipPayload = [ {
+ name: name,
+ value: val,
+ payload: entry
+ } ], tooltipPosition = Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.e)(coordinate.cx, coordinate.cy, middleRadius, midAngle);
+ return prev = _extends({
+ percent: percent,
+ cornerRadius: cornerRadius,
+ name: name,
+ tooltipPayload: tooltipPayload,
+ midAngle: midAngle,
+ middleRadius: middleRadius,
+ tooltipPosition: tooltipPosition
+ }, entry, coordinate, {
+ value: Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey),
+ startAngle: tempStartAngle,
+ endAngle: tempEndAngle,
+ payload: entry,
+ paddingAngle: Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.i)(deltaAngle) * paddingAngle
+ });
+ });
+ }
+ return _extends({}, coordinate, {
+ sectors: sectors,
+ data: pieData,
+ onMouseLeave: onItemMouseLeave,
+ onMouseEnter: onItemMouseEnter
+ });
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Pie;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_4_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_smooth__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_11__shape_Polygon__ = __webpack_require__(195), __WEBPACK_IMPORTED_MODULE_12__shape_Dot__ = __webpack_require__(57), __WEBPACK_IMPORTED_MODULE_13__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_14__component_LabelList__ = __webpack_require__(45), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Radar = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Radar() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Radar);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Radar.__proto__ || Object.getPrototypeOf(Radar)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !1
+ }, _this.cachePrevData = function(points) {
+ _this.setState({
+ prevPoints: points
+ });
+ }, _this.handleAnimationEnd = function() {
+ _this.setState({
+ isAnimationFinished: !0
+ });
+ }, _this.handleAnimationStart = function() {
+ _this.setState({
+ isAnimationFinished: !1
+ });
+ }, _this.handleMouseEnter = function(e) {
+ var onMouseEnter = _this.props.onMouseEnter;
+ onMouseEnter && onMouseEnter(_this.props, e);
+ }, _this.handleMouseLeave = function(e) {
+ var onMouseLeave = _this.props.onMouseLeave;
+ onMouseLeave && onMouseLeave(_this.props, e);
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Radar, _Component), _createClass(Radar, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, points = _props.points;
+ nextProps.animationId !== animationId && this.cachePrevData(points);
+ }
+ }, {
+ key: "renderDotItem",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_12__shape_Dot__.a, _extends({}, props, {
+ className: "recharts-radar-dot"
+ }));
+ }
+ }, {
+ key: "renderDots",
+ value: function(points) {
+ var _this2 = this, _props2 = this.props, dot = _props2.dot, dataKey = _props2.dataKey, baseProps = Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.k)(this.props), customDotProps = Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.k)(dot), dots = points.map(function(entry, i) {
+ var dotProps = _extends({
+ key: "dot-" + i,
+ r: 3
+ }, baseProps, customDotProps, {
+ dataKey: dataKey,
+ cx: entry.x,
+ cy: entry.y,
+ index: i,
+ playload: entry
+ });
+ return _this2.renderDotItem(dot, dotProps);
+ });
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__container_Layer__.a, {
+ className: "recharts-radar-dots"
+ }, dots);
+ }
+ }, {
+ key: "renderPolygonStatically",
+ value: function(points) {
+ var _props3 = this.props, shape = _props3.shape, dot = _props3.dot, radar = void 0;
+ return radar = __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(shape) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(shape, _extends({}, this.props, {
+ points: points
+ })) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(shape) ? shape(_extends({}, this.props, {
+ points: points
+ })) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__shape_Polygon__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.e)(this.props), {
+ onMouseEnter: this.handleMouseEnter,
+ onMouseLeave: this.handleMouseLeave
+ }, Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.k)(this.props), {
+ points: points
+ })), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__container_Layer__.a, {
+ className: "recharts-radar-polygon"
+ }, radar, dot ? this.renderDots(points) : null);
+ }
+ }, {
+ key: "renderPolygonWithAnimation",
+ value: function() {
+ var _this3 = this, _props4 = this.props, points = _props4.points, isAnimationActive = _props4.isAnimationActive, animationBegin = _props4.animationBegin, animationDuration = _props4.animationDuration, animationEasing = _props4.animationEasing, animationId = _props4.animationId, prevPoints = this.state.prevPoints;
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "radar-" + animationId,
+ onAnimationEnd: this.handleAnimationEnd,
+ onAnimationStart: this.handleAnimationStart
+ }, function(_ref2) {
+ var t = _ref2.t, stepData = points.map(function(entry, index) {
+ var prev = prevPoints && prevPoints[index];
+ if (prev) {
+ var _interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.e)(prev.x, entry.x), _interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.e)(prev.y, entry.y);
+ return _extends({}, entry, {
+ x: _interpolatorX(t),
+ y: _interpolatorY(t)
+ });
+ }
+ var interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.e)(entry.cx, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.e)(entry.cy, entry.y);
+ return _extends({}, entry, {
+ x: interpolatorX(t),
+ y: interpolatorY(t)
+ });
+ });
+ return _this3.renderPolygonStatically(stepData);
+ });
+ }
+ }, {
+ key: "renderPolygon",
+ value: function() {
+ var _props5 = this.props, points = _props5.points, isAnimationActive = _props5.isAnimationActive, prevPoints = this.state.prevPoints;
+ return !(isAnimationActive && points && points.length) || prevPoints && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points) ? this.renderPolygonStatically(points) : this.renderPolygonWithAnimation();
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props6 = this.props, hide = _props6.hide, className = _props6.className, points = _props6.points, isAnimationActive = _props6.isAnimationActive;
+ if (hide || !points || !points.length) return null;
+ var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-radar", className);
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__container_Layer__.a, {
+ className: layerClass
+ }, this.renderPolygon(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_14__component_LabelList__.a.renderCallByParent(this.props, points));
+ }
+ } ]), Radar;
+ }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Radar",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.c, {
+ className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ dataKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]).isRequired,
+ angleAxisId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number ]),
+ radiusAxisId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number ]),
+ points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ cx: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ angle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ radius: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ value: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ payload: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object
+ })),
+ shape: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ activeDot: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool ]),
+ dot: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool ]),
+ label: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool ]),
+ legendType: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.b),
+ hide: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ onClick: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ animationId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ])
+ }), _class2.defaultProps = {
+ angleAxisId: 0,
+ radiusAxisId: 0,
+ hide: !1,
+ activeDot: !0,
+ dot: !1,
+ legendType: "rect",
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 1500,
+ animationEasing: "ease"
+ }, _class2.getComposedData = function(_ref3) {
+ var radiusAxis = _ref3.radiusAxis, angleAxis = _ref3.angleAxis, displayedData = _ref3.displayedData, dataKey = _ref3.dataKey, bandSize = _ref3.bandSize, cx = angleAxis.cx, cy = angleAxis.cy;
+ return {
+ points: displayedData.map(function(entry, i) {
+ var name = Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry, angleAxis.dataKey, i), value = Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry, dataKey, 0), angle = angleAxis.scale(name) + (bandSize || 0), radius = radiusAxis.scale(value);
+ return _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, angle), {
+ name: name,
+ value: value,
+ cx: cx,
+ cy: cy,
+ radius: radius,
+ angle: angle,
+ payload: entry
+ });
+ })
+ };
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Radar;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(34), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_2_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_6_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react_smooth__), __WEBPACK_IMPORTED_MODULE_7__shape_Sector__ = __webpack_require__(128), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_11__component_LabelList__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_12__component_Cell__ = __webpack_require__(85), __WEBPACK_IMPORTED_MODULE_13__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), RadialBar = Object(__WEBPACK_IMPORTED_MODULE_10__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function RadialBar() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, RadialBar);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = RadialBar.__proto__ || Object.getPrototypeOf(RadialBar)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isAnimationFinished: !1
+ }, _this.cachePrevData = function(data) {
+ _this.setState({
+ prevData: data
+ });
+ }, _this.handleAnimationEnd = function() {
+ _this.setState({
+ isAnimationFinished: !0
+ });
+ }, _this.handleAnimationStart = function() {
+ _this.setState({
+ isAnimationFinished: !1
+ });
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(RadialBar, _Component), _createClass(RadialBar, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, animationId = _props.animationId, data = _props.data;
+ nextProps.animationId !== animationId && this.cachePrevData(data);
+ }
+ }, {
+ key: "getDeltaAngle",
+ value: function() {
+ var _props2 = this.props, startAngle = _props2.startAngle, endAngle = _props2.endAngle;
+ return Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.i)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360);
+ }
+ }, {
+ key: "renderSectorShape",
+ value: function(shape, props) {
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(shape) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(shape, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(shape) ? shape(props) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__shape_Sector__.a, props);
+ }
+ }, {
+ key: "renderSectorsStatically",
+ value: function(sectors) {
+ var _this2 = this, _props3 = this.props, shape = _props3.shape, activeShape = _props3.activeShape, activeIndex = _props3.activeIndex, cornerRadius = _props3.cornerRadius, others = _objectWithoutProperties(_props3, [ "shape", "activeShape", "activeIndex", "cornerRadius" ]), baseProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others);
+ return sectors.map(function(entry, i) {
+ var props = _extends({}, baseProps, {
+ cornerRadius: cornerRadius
+ }, entry, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this2.props, entry, i), {
+ key: "sector-" + i,
+ className: "recharts-radial-bar-sector"
+ });
+ return _this2.renderSectorShape(i === activeIndex ? activeShape : shape, props);
+ });
+ }
+ }, {
+ key: "renderSectorsWithAnimation",
+ value: function() {
+ var _this3 = this, _props4 = this.props, data = _props4.data, isAnimationActive = _props4.isAnimationActive, animationBegin = _props4.animationBegin, animationDuration = _props4.animationDuration, animationEasing = _props4.animationEasing, animationId = _props4.animationId, prevData = this.state.prevData;
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6_react_smooth___default.a, {
+ begin: animationBegin,
+ duration: animationDuration,
+ isActive: isAnimationActive,
+ easing: animationEasing,
+ from: {
+ t: 0
+ },
+ to: {
+ t: 1
+ },
+ key: "radialBar-" + animationId,
+ onAnimationStart: this.handleAnimationStart,
+ onAnimationEnd: this.handleAnimationEnd
+ }, function(_ref2) {
+ var t = _ref2.t, stepData = data.map(function(entry, index) {
+ var prev = prevData && prevData[index];
+ if (prev) {
+ var interpolatorStartAngle = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(prev.startAngle, entry.startAngle), interpolatorEndAngle = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(prev.endAngle, entry.endAngle);
+ return _extends({}, entry, {
+ startAngle: interpolatorStartAngle(t),
+ endAngle: interpolatorEndAngle(t)
+ });
+ }
+ var endAngle = entry.endAngle, startAngle = entry.startAngle, interpolator = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.e)(startAngle, endAngle);
+ return _extends({}, entry, {
+ endAngle: interpolator(t)
+ });
+ });
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, null, _this3.renderSectorsStatically(stepData));
+ });
+ }
+ }, {
+ key: "renderSectors",
+ value: function() {
+ var _props5 = this.props, data = _props5.data, isAnimationActive = _props5.isAnimationActive, prevData = this.state.prevData;
+ return !(isAnimationActive && data && data.length) || prevData && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevData, data) ? this.renderSectorsStatically(data) : this.renderSectorsWithAnimation();
+ }
+ }, {
+ key: "renderBackground",
+ value: function(sectors) {
+ var _this4 = this, cornerRadius = this.props.cornerRadius, backgroundProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props.background);
+ return sectors.map(function(entry, i) {
+ var background = (entry.value, entry.background), rest = _objectWithoutProperties(entry, [ "value", "background" ]);
+ if (!background) return null;
+ var props = _extends({
+ cornerRadius: cornerRadius
+ }, rest, {
+ fill: "#eee"
+ }, background, backgroundProps, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this4.props, entry, i), {
+ index: i,
+ key: "sector-" + i,
+ className: "recharts-radial-bar-background-sector"
+ });
+ return _this4.renderSectorShape(background, props);
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props6 = this.props, hide = _props6.hide, data = _props6.data, className = _props6.className, background = _props6.background, isAnimationActive = _props6.isAnimationActive;
+ if (hide || !data || !data.length) return null;
+ var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-area", className);
+ return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: layerClass
+ }, background && __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-radial-bar-background"
+ }, this.renderBackground(data)), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-radial-bar-sectors"
+ }, this.renderSectors(data)), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_11__component_LabelList__.a.renderCallByParent(_extends({}, this.props, {
+ clockWise: this.getDeltaAngle() < 0
+ }), data));
+ }
+ } ]), RadialBar;
+ }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = "RadialBar",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.c, {
+ className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,
+ angleAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ radiusAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),
+ shape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),
+ activeShape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),
+ activeIndex: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ dataKey: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]).isRequired,
+ cornerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),
+ minPointSize: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ maxBarSize: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ data: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({
+ cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.value
+ })),
+ legendType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.b),
+ label: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object ]),
+ background: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),
+ hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ onClick: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear", "spring" ])
+ }), _class2.defaultProps = {
+ angleAxisId: 0,
+ radiusAxisId: 0,
+ minPointSize: 0,
+ hide: !1,
+ legendType: "rect",
+ data: [],
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 1500,
+ animationEasing: "ease"
+ }, _class2.getComposedData = function(_ref3) {
+ var item = _ref3.item, props = _ref3.props, radiusAxis = _ref3.radiusAxis, radiusAxisTicks = _ref3.radiusAxisTicks, angleAxis = _ref3.angleAxis, angleAxisTicks = _ref3.angleAxisTicks, displayedData = _ref3.displayedData, dataKey = _ref3.dataKey, stackedData = _ref3.stackedData, barPosition = _ref3.barPosition, bandSize = _ref3.bandSize, dataStartIndex = _ref3.dataStartIndex, pos = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.f)(barPosition, item);
+ if (!pos) return [];
+ var cx = angleAxis.cx, cy = angleAxis.cy, layout = props.layout, _item$props = item.props, children = _item$props.children, minPointSize = _item$props.minPointSize, numericAxis = "radial" === layout ? angleAxis : radiusAxis, stackedDomain = stackedData ? numericAxis.scale.domain() : null, baseValue = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.j)({
+ props: props,
+ numericAxis: numericAxis
+ }), cells = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_12__component_Cell__.a);
+ return {
+ data: displayedData.map(function(entry, index) {
+ var value = void 0, innerRadius = void 0, outerRadius = void 0, startAngle = void 0, endAngle = void 0, backgroundSector = void 0;
+ if (stackedData ? value = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.C)(stackedData[dataStartIndex + index], stackedDomain) : (value = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.w)(entry, dataKey),
+ __WEBPACK_IMPORTED_MODULE_2_lodash_isArray___default()(value) || (value = [ baseValue, value ])),
+ "radial" === layout) {
+ innerRadius = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.k)({
+ axis: radiusAxis,
+ ticks: radiusAxisTicks,
+ bandSize: bandSize,
+ offset: pos.offset,
+ entry: entry,
+ index: index
+ }), endAngle = angleAxis.scale(value[1]), startAngle = angleAxis.scale(value[0]),
+ outerRadius = innerRadius + pos.size;
+ var deltaAngle = endAngle - startAngle;
+ if (Math.abs(minPointSize) > 0 && Math.abs(deltaAngle) < Math.abs(minPointSize)) {
+ endAngle += Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.i)(deltaAngle || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaAngle));
+ }
+ backgroundSector = {
+ background: {
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ startAngle: props.startAngle,
+ endAngle: props.endAngle
+ }
+ };
+ } else {
+ innerRadius = radiusAxis.scale(value[0]), outerRadius = radiusAxis.scale(value[1]),
+ startAngle = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.k)({
+ axis: angleAxis,
+ ticks: angleAxisTicks,
+ bandSize: bandSize,
+ offset: pos.offset,
+ entry: entry,
+ index: index
+ }), endAngle = startAngle + pos.size;
+ var deltaRadius = outerRadius - innerRadius;
+ if (Math.abs(minPointSize) > 0 && Math.abs(deltaRadius) < Math.abs(minPointSize)) {
+ outerRadius += Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.i)(deltaRadius || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaRadius));
+ }
+ }
+ return _extends({}, entry, backgroundSector, {
+ payload: entry,
+ value: stackedData ? value : value[1],
+ cx: cx,
+ cy: cy,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ startAngle: startAngle,
+ endAngle: endAngle
+ }, cells && cells[index] && cells[index].props);
+ }),
+ layout: layout
+ };
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = RadialBar;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_range__ = __webpack_require__(329), __WEBPACK_IMPORTED_MODULE_0_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_range__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5_d3_scale__ = __webpack_require__(287), __WEBPACK_IMPORTED_MODULE_6__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__component_Text__ = __webpack_require__(55), __WEBPACK_IMPORTED_MODULE_10__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_11__util_CssPrefixUtils__ = __webpack_require__(787), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), Brush = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Brush(props) {
+ _classCallCheck(this, Brush);
+ var _this = _possibleConstructorReturn(this, (Brush.__proto__ || Object.getPrototypeOf(Brush)).call(this, props));
+ return _this.handleDrag = function(e) {
+ _this.leaveTimer && (clearTimeout(_this.leaveTimer), _this.leaveTimer = null), _this.state.isTravellerMoving ? _this.handleTravellerMove(e) : _this.state.isSlideMoving && _this.handleSlideDrag(e);
+ }, _this.handleTouchMove = function(e) {
+ null != e.changedTouches && e.changedTouches.length > 0 && _this.handleDrag(e.changedTouches[0]);
+ }, _this.handleDragEnd = function() {
+ _this.setState({
+ isTravellerMoving: !1,
+ isSlideMoving: !1
+ });
+ }, _this.handleLeaveWrapper = function() {
+ (_this.state.isTravellerMoving || _this.state.isSlideMoving) && (_this.leaveTimer = setTimeout(_this.handleDragEnd, 1e3));
+ }, _this.handleEnterSlideOrTraveller = function() {
+ _this.setState({
+ isTextActive: !0
+ });
+ }, _this.handleLeaveSlideOrTraveller = function() {
+ _this.setState({
+ isTextActive: !1
+ });
+ }, _this.handleSlideDragStart = function(e) {
+ var event = e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : e;
+ _this.setState({
+ isTravellerMoving: !1,
+ isSlideMoving: !0,
+ slideMoveStartX: event.pageX
+ });
+ }, _this.travellerDragStartHandlers = {
+ startX: _this.handleTravellerDragStart.bind(_this, "startX"),
+ endX: _this.handleTravellerDragStart.bind(_this, "endX")
+ }, _this.state = props.data && props.data.length ? _this.updateScale(props) : {},
+ _this;
+ }
+ return _inherits(Brush, _Component), _createClass(Brush, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _this2 = this, _props = this.props, data = _props.data, width = _props.width, x = _props.x, travellerWidth = _props.travellerWidth, updateId = _props.updateId;
+ (nextProps.data !== data || nextProps.updateId !== updateId) && nextProps.data && nextProps.data.length ? this.setState(this.updateScale(nextProps)) : nextProps.width === width && nextProps.x === x && nextProps.travellerWidth === travellerWidth || (this.scale.range([ nextProps.x, nextProps.x + nextProps.width - nextProps.travellerWidth ]),
+ this.scaleValues = this.scale.domain().map(function(entry) {
+ return _this2.scale(entry);
+ }), this.setState({
+ startX: this.scale(nextProps.startIndex),
+ endX: this.scale(nextProps.endIndex)
+ }));
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.scale = null, this.scaleValues = null, this.leaveTimer && (clearTimeout(this.leaveTimer),
+ this.leaveTimer = null);
+ }
+ }, {
+ key: "getIndexInRange",
+ value: function(range, x) {
+ for (var len = range.length, start = 0, end = len - 1; end - start > 1; ) {
+ var middle = Math.floor((start + end) / 2);
+ range[middle] > x ? end = middle : start = middle;
+ }
+ return x >= range[end] ? end : start;
+ }
+ }, {
+ key: "getIndex",
+ value: function(_ref) {
+ var startX = _ref.startX, endX = _ref.endX, min = Math.min(startX, endX), max = Math.max(startX, endX);
+ return {
+ startIndex: this.getIndexInRange(this.scaleValues, min),
+ endIndex: this.getIndexInRange(this.scaleValues, max)
+ };
+ }
+ }, {
+ key: "getTextOfTick",
+ value: function(index) {
+ var _props2 = this.props, data = _props2.data, tickFormatter = _props2.tickFormatter, dataKey = _props2.dataKey, text = Object(__WEBPACK_IMPORTED_MODULE_6__util_ChartUtils__.w)(data[index], dataKey, index);
+ return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(tickFormatter) ? tickFormatter(text) : text;
+ }
+ }, {
+ key: "handleSlideDrag",
+ value: function(e) {
+ var _state = this.state, slideMoveStartX = _state.slideMoveStartX, startX = _state.startX, endX = _state.endX, _props3 = this.props, x = _props3.x, width = _props3.width, travellerWidth = _props3.travellerWidth, startIndex = _props3.startIndex, endIndex = _props3.endIndex, onChange = _props3.onChange, delta = e.pageX - slideMoveStartX;
+ delta > 0 ? delta = Math.min(delta, x + width - travellerWidth - endX, x + width - travellerWidth - startX) : delta < 0 && (delta = Math.max(delta, x - startX, x - endX));
+ var newIndex = this.getIndex({
+ startX: startX + delta,
+ endX: endX + delta
+ });
+ newIndex.startIndex === startIndex && newIndex.endIndex === endIndex || !onChange || onChange(newIndex),
+ this.setState({
+ startX: startX + delta,
+ endX: endX + delta,
+ slideMoveStartX: e.pageX
+ });
+ }
+ }, {
+ key: "handleTravellerDragStart",
+ value: function(id, e) {
+ var event = e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : e;
+ this.setState({
+ isSlideMoving: !1,
+ isTravellerMoving: !0,
+ movingTravellerId: id,
+ brushMoveStartX: event.pageX
+ });
+ }
+ }, {
+ key: "handleTravellerMove",
+ value: function(e) {
+ var _setState, _state2 = this.state, brushMoveStartX = _state2.brushMoveStartX, movingTravellerId = _state2.movingTravellerId, prevValue = this.state[movingTravellerId], _props4 = this.props, x = _props4.x, width = _props4.width, travellerWidth = _props4.travellerWidth, onChange = _props4.onChange, params = {
+ startX: this.state.startX,
+ endX: this.state.endX
+ }, delta = e.pageX - brushMoveStartX;
+ delta > 0 ? delta = Math.min(delta, x + width - travellerWidth - prevValue) : delta < 0 && (delta = Math.max(delta, x - prevValue)),
+ params[movingTravellerId] = prevValue + delta;
+ var newIndex = this.getIndex(params);
+ this.setState((_setState = {}, _defineProperty(_setState, movingTravellerId, prevValue + delta),
+ _defineProperty(_setState, "brushMoveStartX", e.pageX), _setState), function() {
+ onChange && onChange(newIndex);
+ });
+ }
+ }, {
+ key: "updateScale",
+ value: function(props) {
+ var _this3 = this, data = props.data, startIndex = props.startIndex, endIndex = props.endIndex, x = props.x, width = props.width, travellerWidth = props.travellerWidth, len = data.length;
+ return this.scale = Object(__WEBPACK_IMPORTED_MODULE_5_d3_scale__.scalePoint)().domain(__WEBPACK_IMPORTED_MODULE_0_lodash_range___default()(0, len)).range([ x, x + width - travellerWidth ]),
+ this.scaleValues = this.scale.domain().map(function(entry) {
+ return _this3.scale(entry);
+ }), {
+ isTextActive: !1,
+ isSlideMoving: !1,
+ isTravellerMoving: !1,
+ startX: this.scale(startIndex),
+ endX: this.scale(endIndex)
+ };
+ }
+ }, {
+ key: "renderBackground",
+ value: function() {
+ var _props5 = this.props, x = _props5.x, y = _props5.y, width = _props5.width, height = _props5.height, fill = _props5.fill, stroke = _props5.stroke;
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("rect", {
+ stroke: stroke,
+ fill: fill,
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ });
+ }
+ }, {
+ key: "renderPanorama",
+ value: function() {
+ var _props6 = this.props, x = _props6.x, y = _props6.y, width = _props6.width, height = _props6.height, data = _props6.data, children = _props6.children, padding = _props6.padding, chartElement = __WEBPACK_IMPORTED_MODULE_2_react__.Children.only(children);
+ return chartElement ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(chartElement, {
+ x: x,
+ y: y,
+ width: width,
+ height: height,
+ margin: padding,
+ compact: !0,
+ data: data
+ }) : null;
+ }
+ }, {
+ key: "renderTraveller",
+ value: function(travellerX, id) {
+ var _props7 = this.props, y = _props7.y, travellerWidth = _props7.travellerWidth, height = _props7.height, stroke = _props7.stroke, lineY = Math.floor(y + height / 2) - 1, x = Math.max(travellerX, this.props.x);
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-brush-traveller",
+ onMouseEnter: this.handleEnterSlideOrTraveller,
+ onMouseLeave: this.handleLeaveSlideOrTraveller,
+ onMouseDown: this.travellerDragStartHandlers[id],
+ onTouchStart: this.travellerDragStartHandlers[id],
+ style: {
+ cursor: "col-resize"
+ }
+ }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("rect", {
+ x: x,
+ y: y,
+ width: travellerWidth,
+ height: height,
+ fill: stroke,
+ stroke: "none"
+ }), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("line", {
+ x1: x + 1,
+ y1: lineY,
+ x2: x + travellerWidth - 1,
+ y2: lineY,
+ fill: "none",
+ stroke: "#fff"
+ }), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("line", {
+ x1: x + 1,
+ y1: lineY + 2,
+ x2: x + travellerWidth - 1,
+ y2: lineY + 2,
+ fill: "none",
+ stroke: "#fff"
+ }));
+ }
+ }, {
+ key: "renderSlide",
+ value: function(startX, endX) {
+ var _props8 = this.props, y = _props8.y, height = _props8.height, stroke = _props8.stroke;
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("rect", {
+ className: "recharts-brush-slide",
+ onMouseEnter: this.handleEnterSlideOrTraveller,
+ onMouseLeave: this.handleLeaveSlideOrTraveller,
+ onMouseDown: this.handleSlideDragStart,
+ onTouchStart: this.handleSlideDragStart,
+ style: {
+ cursor: "move"
+ },
+ stroke: "none",
+ fill: stroke,
+ fillOpacity: .2,
+ x: Math.min(startX, endX),
+ y: y,
+ width: Math.abs(endX - startX),
+ height: height
+ });
+ }
+ }, {
+ key: "renderText",
+ value: function() {
+ var _props9 = this.props, startIndex = _props9.startIndex, endIndex = _props9.endIndex, y = _props9.y, height = _props9.height, travellerWidth = _props9.travellerWidth, stroke = _props9.stroke, _state3 = this.state, startX = _state3.startX, endX = _state3.endX, attrs = {
+ pointerEvents: "none",
+ fill: stroke
+ };
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-brush-texts"
+ }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__component_Text__.a, _extends({
+ textAnchor: "end",
+ verticalAnchor: "middle",
+ x: Math.min(startX, endX) - 5,
+ y: y + height / 2
+ }, attrs), this.getTextOfTick(startIndex)), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__component_Text__.a, _extends({
+ textAnchor: "start",
+ verticalAnchor: "middle",
+ x: Math.max(startX, endX) + travellerWidth + 5,
+ y: y + height / 2
+ }, attrs), this.getTextOfTick(endIndex)));
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props10 = this.props, data = _props10.data, className = _props10.className, children = _props10.children, x = _props10.x, y = _props10.y, width = _props10.width, height = _props10.height, _state4 = this.state, startX = _state4.startX, endX = _state4.endX, isTextActive = _state4.isTextActive, isSlideMoving = _state4.isSlideMoving, isTravellerMoving = _state4.isTravellerMoving;
+ if (!data || !data.length || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(x) || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(y) || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(width) || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(height) || width <= 0 || height <= 0) return null;
+ var layerClass = __WEBPACK_IMPORTED_MODULE_4_classnames___default()("recharts-brush", className), isPanoramic = 1 === __WEBPACK_IMPORTED_MODULE_2_react___default.a.Children.count(children), style = Object(__WEBPACK_IMPORTED_MODULE_11__util_CssPrefixUtils__.a)("userSelect", "none");
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: layerClass,
+ onMouseMove: this.handleDrag,
+ onMouseLeave: this.handleLeaveWrapper,
+ onMouseUp: this.handleDragEnd,
+ onTouchEnd: this.handleDragEnd,
+ onTouchMove: this.handleTouchMove,
+ style: style
+ }, this.renderBackground(), isPanoramic && this.renderPanorama(), this.renderSlide(startX, endX), this.renderTraveller(startX, "startX"), this.renderTraveller(endX, "endX"), (isTextActive || isSlideMoving || isTravellerMoving) && this.renderText());
+ }
+ } ]), Brush;
+ }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Brush",
+ _class2.propTypes = {
+ className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ fill: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ stroke: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number.isRequired,
+ travellerWidth: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ padding: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({
+ top: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ right: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ bottom: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ left: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number
+ }),
+ dataKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ data: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array,
+ startIndex: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ endIndex: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ tickFormatter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ children: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node,
+ onChange: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ updateId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number ])
+ }, _class2.defaultProps = {
+ height: 40,
+ travellerWidth: 5,
+ fill: "#fff",
+ stroke: "#666",
+ padding: {
+ top: 1,
+ right: 1,
+ bottom: 1,
+ left: 1
+ }
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Brush;
+}, function(module, exports, __webpack_require__) {
+ var createRange = __webpack_require__(784), range = createRange();
+ module.exports = range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__ = __webpack_require__(184), __WEBPACK_IMPORTED_MODULE_6__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_7__component_Text__ = __webpack_require__(55), __WEBPACK_IMPORTED_MODULE_8__component_Label__ = __webpack_require__(43), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), CartesianAxis = (_temp = _class = function(_Component) {
+ function CartesianAxis() {
+ return _classCallCheck(this, CartesianAxis), _possibleConstructorReturn(this, (CartesianAxis.__proto__ || Object.getPrototypeOf(CartesianAxis)).apply(this, arguments));
+ }
+ return _inherits(CartesianAxis, _Component), _createClass(CartesianAxis, [ {
+ key: "shouldComponentUpdate",
+ value: function(_ref, state) {
+ var viewBox = _ref.viewBox, restProps = _objectWithoutProperties(_ref, [ "viewBox" ]), _props = this.props, viewBoxOld = _props.viewBox, restPropsOld = _objectWithoutProperties(_props, [ "viewBox" ]);
+ return !Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.b)(viewBox, viewBoxOld) || !Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.b)(restProps, restPropsOld) || !Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.b)(state, this.state);
+ }
+ }, {
+ key: "getTickLineCoord",
+ value: function(data) {
+ var _props2 = this.props, x = _props2.x, y = _props2.y, width = _props2.width, height = _props2.height, orientation = _props2.orientation, tickSize = _props2.tickSize, mirror = _props2.mirror, tickMargin = _props2.tickMargin, x1 = void 0, x2 = void 0, y1 = void 0, y2 = void 0, tx = void 0, ty = void 0, sign = mirror ? -1 : 1, finalTickSize = data.tickSize || tickSize, tickCoord = Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(data.tickCoord) ? data.tickCoord : data.coordinate;
+ switch (orientation) {
+ case "top":
+ x1 = x2 = data.coordinate, y2 = y + !mirror * height, y1 = y2 - sign * finalTickSize,
+ ty = y1 - sign * tickMargin, tx = tickCoord;
+ break;
+
+ case "left":
+ y1 = y2 = data.coordinate, x2 = x + !mirror * width, x1 = x2 - sign * finalTickSize,
+ tx = x1 - sign * tickMargin, ty = tickCoord;
+ break;
+
+ case "right":
+ y1 = y2 = data.coordinate, x2 = x + mirror * width, x1 = x2 + sign * finalTickSize,
+ tx = x1 + sign * tickMargin, ty = tickCoord;
+ break;
+
+ default:
+ x1 = x2 = data.coordinate, y2 = y + mirror * height, y1 = y2 + sign * finalTickSize,
+ ty = y1 + sign * tickMargin, tx = tickCoord;
+ }
+ return {
+ line: {
+ x1: x1,
+ y1: y1,
+ x2: x2,
+ y2: y2
+ },
+ tick: {
+ x: tx,
+ y: ty
+ }
+ };
+ }
+ }, {
+ key: "getTickTextAnchor",
+ value: function() {
+ var _props3 = this.props, orientation = _props3.orientation, mirror = _props3.mirror, textAnchor = void 0;
+ switch (orientation) {
+ case "left":
+ textAnchor = mirror ? "start" : "end";
+ break;
+
+ case "right":
+ textAnchor = mirror ? "end" : "start";
+ break;
+
+ default:
+ textAnchor = "middle";
+ }
+ return textAnchor;
+ }
+ }, {
+ key: "getTickVerticalAnchor",
+ value: function() {
+ var _props4 = this.props, orientation = _props4.orientation, mirror = _props4.mirror, verticalAnchor = "end";
+ switch (orientation) {
+ case "left":
+ case "right":
+ verticalAnchor = "middle";
+ break;
+
+ case "top":
+ verticalAnchor = mirror ? "start" : "end";
+ break;
+
+ default:
+ verticalAnchor = mirror ? "end" : "start";
+ }
+ return verticalAnchor;
+ }
+ }, {
+ key: "renderAxisLine",
+ value: function() {
+ var _props5 = this.props, x = _props5.x, y = _props5.y, width = _props5.width, height = _props5.height, orientation = _props5.orientation, axisLine = _props5.axisLine, mirror = _props5.mirror, props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props), {
+ fill: "none"
+ }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(axisLine));
+ if ("top" === orientation || "bottom" === orientation) {
+ var needHeight = "top" === orientation && !mirror || "bottom" === orientation && mirror;
+ props = _extends({}, props, {
+ x1: x,
+ y1: y + needHeight * height,
+ x2: x + width,
+ y2: y + needHeight * height
+ });
+ } else {
+ var needWidth = "left" === orientation && !mirror || "right" === orientation && mirror;
+ props = _extends({}, props, {
+ x1: x + needWidth * width,
+ y1: y,
+ x2: x + needWidth * width,
+ y2: y + height
+ });
+ }
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("line", _extends({
+ className: "recharts-cartesian-axis-line"
+ }, props));
+ }
+ }, {
+ key: "renderTickItem",
+ value: function(option, props, value) {
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__component_Text__.a, _extends({}, props, {
+ className: "recharts-cartesian-axis-tick-value"
+ }), value);
+ }
+ }, {
+ key: "renderTicks",
+ value: function(ticks) {
+ var _this2 = this, _props6 = this.props, tickLine = _props6.tickLine, stroke = _props6.stroke, tick = _props6.tick, tickFormatter = _props6.tickFormatter, unit = _props6.unit, finalTicks = CartesianAxis.getTicks(_extends({}, this.props, {
+ ticks: ticks
+ })), textAnchor = this.getTickTextAnchor(), verticalAnchor = this.getTickVerticalAnchor(), axisProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props), customTickProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(tick), tickLineProps = _extends({}, axisProps, {
+ fill: "none"
+ }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(tickLine)), items = finalTicks.map(function(entry, i) {
+ var _getTickLineCoord = _this2.getTickLineCoord(entry), lineCoord = _getTickLineCoord.line, tickCoord = _getTickLineCoord.tick, tickProps = _extends({
+ textAnchor: textAnchor,
+ verticalAnchor: verticalAnchor
+ }, axisProps, {
+ stroke: "none",
+ fill: stroke
+ }, customTickProps, tickCoord, {
+ index: i,
+ payload: entry,
+ visibleTicksCount: finalTicks.length
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__container_Layer__.a, _extends({
+ className: "recharts-cartesian-axis-tick",
+ key: "tick-" + i
+ }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this2.props, entry, i)), tickLine && __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("line", _extends({
+ className: "recharts-cartesian-axis-tick-line"
+ }, tickLineProps, lineCoord)), tick && _this2.renderTickItem(tick, tickProps, "" + (__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(entry.value) : entry.value) + (unit || "")));
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("g", {
+ className: "recharts-cartesian-axis-ticks"
+ }, items);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props7 = this.props, axisLine = _props7.axisLine, width = _props7.width, height = _props7.height, ticksGenerator = _props7.ticksGenerator, className = _props7.className;
+ if (_props7.hide) return null;
+ var _props8 = this.props, ticks = _props8.ticks, noTicksProps = _objectWithoutProperties(_props8, [ "ticks" ]), finalTicks = ticks;
+ return __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(ticksGenerator) && (finalTicks = ticksGenerator(ticks && ticks.length > 0 ? this.props : noTicksProps)),
+ width <= 0 || height <= 0 || !finalTicks || !finalTicks.length ? null : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__container_Layer__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()("recharts-cartesian-axis", className)
+ }, axisLine && this.renderAxisLine(), this.renderTicks(finalTicks), __WEBPACK_IMPORTED_MODULE_8__component_Label__.a.renderCallByParent(this.props));
+ }
+ } ], [ {
+ key: "getTicks",
+ value: function(props) {
+ var tick = props.tick, ticks = props.ticks, viewBox = props.viewBox, minTickGap = props.minTickGap, orientation = props.orientation, interval = props.interval, tickFormatter = props.tickFormatter, unit = props.unit;
+ return ticks && ticks.length && tick ? Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(interval) || Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)() ? CartesianAxis.getNumberIntervalTicks(ticks, Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.g)(interval) ? interval : 0) : "preserveStartEnd" === interval ? CartesianAxis.getTicksStart({
+ ticks: ticks,
+ tickFormatter: tickFormatter,
+ viewBox: viewBox,
+ orientation: orientation,
+ minTickGap: minTickGap,
+ unit: unit
+ }, !0) : "preserveStart" === interval ? CartesianAxis.getTicksStart({
+ ticks: ticks,
+ tickFormatter: tickFormatter,
+ viewBox: viewBox,
+ orientation: orientation,
+ minTickGap: minTickGap,
+ unit: unit
+ }) : CartesianAxis.getTicksEnd({
+ ticks: ticks,
+ tickFormatter: tickFormatter,
+ viewBox: viewBox,
+ orientation: orientation,
+ minTickGap: minTickGap,
+ unit: unit
+ }) : [];
+ }
+ }, {
+ key: "getNumberIntervalTicks",
+ value: function(ticks, interval) {
+ return ticks.filter(function(entry, i) {
+ return i % (interval + 1) == 0;
+ });
+ }
+ }, {
+ key: "getTicksStart",
+ value: function(_ref2, preserveEnd) {
+ var ticks = _ref2.ticks, tickFormatter = _ref2.tickFormatter, viewBox = _ref2.viewBox, orientation = _ref2.orientation, minTickGap = _ref2.minTickGap, unit = _ref2.unit, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sizeKey = "top" === orientation || "bottom" === orientation ? "width" : "height", result = (ticks || []).slice(), unitSize = unit ? Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(unit)[sizeKey] : 0, len = result.length, sign = len >= 2 ? Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.i)(result[1].coordinate - result[0].coordinate) : 1, start = void 0, end = void 0;
+ if (1 === sign ? (start = "width" === sizeKey ? x : y, end = "width" === sizeKey ? x + width : y + height) : (start = "width" === sizeKey ? x + width : y + height,
+ end = "width" === sizeKey ? x : y), preserveEnd) {
+ var tail = ticks[len - 1], tailContent = __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(tail.value) : tail.value, tailSize = Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(tailContent)[sizeKey] + unitSize, tailGap = sign * (tail.coordinate + sign * tailSize / 2 - end);
+ result[len - 1] = tail = _extends({}, tail, {
+ tickCoord: tailGap > 0 ? tail.coordinate - tailGap * sign : tail.coordinate
+ });
+ sign * (tail.tickCoord - sign * tailSize / 2 - start) >= 0 && sign * (tail.tickCoord + sign * tailSize / 2 - end) <= 0 && (end = tail.tickCoord - sign * (tailSize / 2 + minTickGap),
+ result[len - 1] = _extends({}, tail, {
+ isShow: !0
+ }));
+ }
+ for (var count = preserveEnd ? len - 1 : len, i = 0; i < count; i++) {
+ var entry = result[i], content = __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(entry.value) : entry.value, size = Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(content)[sizeKey] + unitSize;
+ if (0 === i) {
+ var gap = sign * (entry.coordinate - sign * size / 2 - start);
+ result[i] = entry = _extends({}, entry, {
+ tickCoord: gap < 0 ? entry.coordinate - gap * sign : entry.coordinate
+ });
+ } else result[i] = entry = _extends({}, entry, {
+ tickCoord: entry.coordinate
+ });
+ sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0 && (start = entry.tickCoord + sign * (size / 2 + minTickGap),
+ result[i] = _extends({}, entry, {
+ isShow: !0
+ }));
+ }
+ return result.filter(function(entry) {
+ return entry.isShow;
+ });
+ }
+ }, {
+ key: "getTicksEnd",
+ value: function(_ref3) {
+ var ticks = _ref3.ticks, tickFormatter = _ref3.tickFormatter, viewBox = _ref3.viewBox, orientation = _ref3.orientation, minTickGap = _ref3.minTickGap, unit = _ref3.unit, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sizeKey = "top" === orientation || "bottom" === orientation ? "width" : "height", unitSize = unit ? Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(unit)[sizeKey] : 0, result = (ticks || []).slice(), len = result.length, sign = len >= 2 ? Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.i)(result[1].coordinate - result[0].coordinate) : 1, start = void 0, end = void 0;
+ 1 === sign ? (start = "width" === sizeKey ? x : y, end = "width" === sizeKey ? x + width : y + height) : (start = "width" === sizeKey ? x + width : y + height,
+ end = "width" === sizeKey ? x : y);
+ for (var i = len - 1; i >= 0; i--) {
+ var entry = result[i], content = __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(entry.value) : entry.value, size = Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(content)[sizeKey] + unitSize;
+ if (i === len - 1) {
+ var gap = sign * (entry.coordinate + sign * size / 2 - end);
+ result[i] = entry = _extends({}, entry, {
+ tickCoord: gap > 0 ? entry.coordinate - gap * sign : entry.coordinate
+ });
+ } else result[i] = entry = _extends({}, entry, {
+ tickCoord: entry.coordinate
+ });
+ sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0 && (end = entry.tickCoord - sign * (size / 2 + minTickGap),
+ result[i] = _extends({}, entry, {
+ isShow: !0
+ }));
+ }
+ return result.filter(function(entry) {
+ return entry.isShow;
+ });
+ }
+ } ]), CartesianAxis;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.displayName = "CartesianAxis",
+ _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.a, {
+ className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ orientation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "top", "bottom", "left", "right" ]),
+ viewBox: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number
+ }),
+ tick: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ]),
+ axisLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),
+ tickLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),
+ mirror: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,
+ tickMargin: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number.isRequired,
+ minTickGap: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ ticks: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.array,
+ tickSize: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ stroke: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,
+ tickFormatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ ticksGenerator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ interval: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ])
+ }), _class.defaultProps = {
+ x: 0,
+ y: 0,
+ width: 0,
+ height: 0,
+ viewBox: {
+ x: 0,
+ y: 0,
+ width: 0,
+ height: 0
+ },
+ orientation: "bottom",
+ ticks: [],
+ stroke: "#666",
+ tickLine: !0,
+ axisLine: !0,
+ tick: !0,
+ mirror: !1,
+ minTickGap: 5,
+ tickSize: 6,
+ tickMargin: 2,
+ interval: "preserveEnd"
+ }, _temp);
+ __webpack_exports__.a = CartesianAxis;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _reactDom = __webpack_require__(95), _MuiThemeProvider = __webpack_require__(342), _MuiThemeProvider2 = _interopRequireDefault(_MuiThemeProvider), _createMuiTheme = __webpack_require__(151), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _Dashboard = __webpack_require__(396), _Dashboard2 = _interopRequireDefault(_Dashboard), theme = (0,
+ _createMuiTheme2.default)({
+ palette: {
+ type: "dark"
+ }
+ }), dashboard = document.getElementById("dashboard");
+ dashboard && (0, _reactDom.render)(_react2.default.createElement(_MuiThemeProvider2.default, {
+ theme: theme
+ }, _react2.default.createElement(_Dashboard2.default, null)), dashboard);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function y(a) {
+ for (var b = arguments.length - 1, e = "Minified React error #" + a + "; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=" + a, c = 0; c < b; c++) e += "&args[]=" + encodeURIComponent(arguments[c + 1]);
+ throw b = Error(e + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."),
+ b.name = "Invariant Violation", b.framesToPop = 1, b;
+ }
+ function A(a, b, e) {
+ this.props = a, this.context = b, this.refs = n, this.updater = e || z;
+ }
+ function B(a, b, e) {
+ this.props = a, this.context = b, this.refs = n, this.updater = e || z;
+ }
+ function C() {}
+ function E(a, b, e) {
+ this.props = a, this.context = b, this.refs = n, this.updater = e || z;
+ }
+ function J(a, b, e) {
+ var c, d = {}, g = null, k = null;
+ if (null != b) for (c in void 0 !== b.ref && (k = b.ref), void 0 !== b.key && (g = "" + b.key),
+ b) H.call(b, c) && !I.hasOwnProperty(c) && (d[c] = b[c]);
+ var f = arguments.length - 2;
+ if (1 === f) d.children = e; else if (1 < f) {
+ for (var h = Array(f), l = 0; l < f; l++) h[l] = arguments[l + 2];
+ d.children = h;
+ }
+ if (a && a.defaultProps) for (c in f = a.defaultProps) void 0 === d[c] && (d[c] = f[c]);
+ return {
+ $$typeof: r,
+ type: a,
+ key: g,
+ ref: k,
+ props: d,
+ _owner: G.current
+ };
+ }
+ function K(a) {
+ return "object" == typeof a && null !== a && a.$$typeof === r;
+ }
+ function escape(a) {
+ var b = {
+ "=": "=0",
+ ":": "=2"
+ };
+ return "$" + ("" + a).replace(/[=:]/g, function(a) {
+ return b[a];
+ });
+ }
+ function N(a, b, e, c) {
+ if (M.length) {
+ var d = M.pop();
+ return d.result = a, d.keyPrefix = b, d.func = e, d.context = c, d.count = 0, d;
+ }
+ return {
+ result: a,
+ keyPrefix: b,
+ func: e,
+ context: c,
+ count: 0
+ };
+ }
+ function O(a) {
+ a.result = null, a.keyPrefix = null, a.func = null, a.context = null, a.count = 0,
+ 10 > M.length && M.push(a);
+ }
+ function P(a, b, e, c) {
+ var d = typeof a;
+ "undefined" !== d && "boolean" !== d || (a = null);
+ var g = !1;
+ if (null === a) g = !0; else switch (d) {
+ case "string":
+ case "number":
+ g = !0;
+ break;
+
+ case "object":
+ switch (a.$$typeof) {
+ case r:
+ case t:
+ case u:
+ case v:
+ g = !0;
+ }
+ }
+ if (g) return e(c, a, "" === b ? "." + Q(a, 0) : b), 1;
+ if (g = 0, b = "" === b ? "." : b + ":", Array.isArray(a)) for (var k = 0; k < a.length; k++) {
+ d = a[k];
+ var f = b + Q(d, k);
+ g += P(d, f, e, c);
+ } else if (null === a || void 0 === a ? f = null : (f = x && a[x] || a["@@iterator"],
+ f = "function" == typeof f ? f : null), "function" == typeof f) for (a = f.call(a),
+ k = 0; !(d = a.next()).done; ) d = d.value, f = b + Q(d, k++), g += P(d, f, e, c); else "object" === d && (e = "" + a,
+ y("31", "[object Object]" === e ? "object with keys {" + Object.keys(a).join(", ") + "}" : e, ""));
+ return g;
+ }
+ function Q(a, b) {
+ return "object" == typeof a && null !== a && null != a.key ? escape(a.key) : b.toString(36);
+ }
+ function R(a, b) {
+ a.func.call(a.context, b, a.count++);
+ }
+ function S(a, b, e) {
+ var c = a.result, d = a.keyPrefix;
+ a = a.func.call(a.context, b, a.count++), Array.isArray(a) ? T(a, c, e, p.thatReturnsArgument) : null != a && (K(a) && (b = d + (!a.key || b && b.key === a.key ? "" : ("" + a.key).replace(L, "$&/") + "/") + e,
+ a = {
+ $$typeof: r,
+ type: a.type,
+ key: b,
+ ref: a.ref,
+ props: a.props,
+ _owner: a._owner
+ }), c.push(a));
+ }
+ function T(a, b, e, c, d) {
+ var g = "";
+ null != e && (g = ("" + e).replace(L, "$&/") + "/"), b = N(b, g, c, d), null == a || P(a, "", S, b),
+ O(b);
+ }
+ var m = __webpack_require__(69), n = __webpack_require__(93), p = __webpack_require__(39), q = "function" == typeof Symbol && Symbol.for, r = q ? Symbol.for("react.element") : 60103, t = q ? Symbol.for("react.call") : 60104, u = q ? Symbol.for("react.return") : 60105, v = q ? Symbol.for("react.portal") : 60106, w = q ? Symbol.for("react.fragment") : 60107, x = "function" == typeof Symbol && Symbol.iterator, z = {
+ isMounted: function() {
+ return !1;
+ },
+ enqueueForceUpdate: function() {},
+ enqueueReplaceState: function() {},
+ enqueueSetState: function() {}
+ };
+ A.prototype.isReactComponent = {}, A.prototype.setState = function(a, b) {
+ "object" != typeof a && "function" != typeof a && null != a && y("85"), this.updater.enqueueSetState(this, a, b, "setState");
+ }, A.prototype.forceUpdate = function(a) {
+ this.updater.enqueueForceUpdate(this, a, "forceUpdate");
+ }, C.prototype = A.prototype;
+ var D = B.prototype = new C();
+ D.constructor = B, m(D, A.prototype), D.isPureReactComponent = !0;
+ var F = E.prototype = new C();
+ F.constructor = E, m(F, A.prototype), F.unstable_isAsyncReactComponent = !0, F.render = function() {
+ return this.props.children;
+ };
+ var G = {
+ current: null
+ }, H = Object.prototype.hasOwnProperty, I = {
+ key: !0,
+ ref: !0,
+ __self: !0,
+ __source: !0
+ }, L = /\/+/g, M = [], U = {
+ Children: {
+ map: function(a, b, e) {
+ if (null == a) return a;
+ var c = [];
+ return T(a, c, null, b, e), c;
+ },
+ forEach: function(a, b, e) {
+ if (null == a) return a;
+ b = N(null, null, b, e), null == a || P(a, "", R, b), O(b);
+ },
+ count: function(a) {
+ return null == a ? 0 : P(a, "", p.thatReturnsNull, null);
+ },
+ toArray: function(a) {
+ var b = [];
+ return T(a, b, null, p.thatReturnsArgument), b;
+ },
+ only: function(a) {
+ return K(a) || y("143"), a;
+ }
+ },
+ Component: A,
+ PureComponent: B,
+ unstable_AsyncComponent: E,
+ Fragment: w,
+ createElement: J,
+ cloneElement: function(a, b, e) {
+ var c = m({}, a.props), d = a.key, g = a.ref, k = a._owner;
+ if (null != b) {
+ if (void 0 !== b.ref && (g = b.ref, k = G.current), void 0 !== b.key && (d = "" + b.key),
+ a.type && a.type.defaultProps) var f = a.type.defaultProps;
+ for (h in b) H.call(b, h) && !I.hasOwnProperty(h) && (c[h] = void 0 === b[h] && void 0 !== f ? f[h] : b[h]);
+ }
+ var h = arguments.length - 2;
+ if (1 === h) c.children = e; else if (1 < h) {
+ f = Array(h);
+ for (var l = 0; l < h; l++) f[l] = arguments[l + 2];
+ c.children = f;
+ }
+ return {
+ $$typeof: r,
+ type: a.type,
+ key: d,
+ ref: g,
+ props: c,
+ _owner: k
+ };
+ },
+ createFactory: function(a) {
+ var b = J.bind(null, a);
+ return b.type = a, b;
+ },
+ isValidElement: K,
+ version: "16.2.0",
+ __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
+ ReactCurrentOwner: G,
+ assign: m
+ }
+ }, V = Object.freeze({
+ default: U
+ }), W = V && U || V;
+ module.exports = W.default ? W.default : W;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ "production" !== process.env.NODE_ENV && function() {
+ function getIteratorFn(maybeIterable) {
+ if (null === maybeIterable || void 0 === maybeIterable) return null;
+ var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
+ return "function" == typeof maybeIterator ? maybeIterator : null;
+ }
+ function warnNoop(publicInstance, callerName) {
+ var constructor = publicInstance.constructor, componentName = constructor && (constructor.displayName || constructor.name) || "ReactClass", warningKey = componentName + "." + callerName;
+ didWarnStateUpdateForUnmountedComponent[warningKey] || (warning(!1, "%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op.\n\nPlease check the code for the %s component.", callerName, callerName, componentName),
+ didWarnStateUpdateForUnmountedComponent[warningKey] = !0);
+ }
+ function Component(props, context, updater) {
+ this.props = props, this.context = context, this.refs = emptyObject, this.updater = updater || ReactNoopUpdateQueue;
+ }
+ function PureComponent(props, context, updater) {
+ this.props = props, this.context = context, this.refs = emptyObject, this.updater = updater || ReactNoopUpdateQueue;
+ }
+ function ComponentDummy() {}
+ function AsyncComponent(props, context, updater) {
+ this.props = props, this.context = context, this.refs = emptyObject, this.updater = updater || ReactNoopUpdateQueue;
+ }
+ function hasValidRef(config) {
+ if (hasOwnProperty.call(config, "ref")) {
+ var getter = Object.getOwnPropertyDescriptor(config, "ref").get;
+ if (getter && getter.isReactWarning) return !1;
+ }
+ return void 0 !== config.ref;
+ }
+ function hasValidKey(config) {
+ if (hasOwnProperty.call(config, "key")) {
+ var getter = Object.getOwnPropertyDescriptor(config, "key").get;
+ if (getter && getter.isReactWarning) return !1;
+ }
+ return void 0 !== config.key;
+ }
+ function defineKeyPropWarningGetter(props, displayName) {
+ var warnAboutAccessingKey = function() {
+ specialPropKeyWarningShown || (specialPropKeyWarningShown = !0, warning(!1, "%s: ` + "`")) + (`key` + ("`" + ` is not a prop. Trying to access it will result in `)))))) + ((((("`" + `undefined`) + ("`" + (` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)", displayName));
+ };
+ warnAboutAccessingKey.isReactWarning = !0, Object.defineProperty(props, "key", {
+ get: warnAboutAccessingKey,
+ configurable: !0
+ });
+ }
+ function defineRefPropWarningGetter(props, displayName) {
+ var warnAboutAccessingRef = function() {
+ specialPropRefWarningShown || (specialPropRefWarningShown = !0, warning(!1, "%s: ` + "`"))) + ((`ref` + ("`" + ` is not a prop. Trying to access it will result in `)) + ("`" + (`undefined` + "`")))) + (((` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)", displayName));
+ };
+ warnAboutAccessingRef.isReactWarning = !0, Object.defineProperty(props, "ref", {
+ get: warnAboutAccessingRef,
+ configurable: !0
+ });
+ }
+ function createElement(type, config, children) {
+ var propName, props = {}, key = null, ref = null, self = null, source = null;
+ if (null != config) {
+ hasValidRef(config) && (ref = config.ref), hasValidKey(config) && (key = "" + config.key),
+ self = void 0 === config.__self ? null : config.__self, source = void 0 === config.__source ? null : config.__source;
+ for (propName in config) hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName) && (props[propName] = config[propName]);
+ }
+ var childrenLength = arguments.length - 2;
+ if (1 === childrenLength) props.children = children; else if (childrenLength > 1) {
+ for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++) childArray[i] = arguments[i + 2];
+ Object.freeze && Object.freeze(childArray), props.children = childArray;
+ }
+ if (type && type.defaultProps) {
+ var defaultProps = type.defaultProps;
+ for (propName in defaultProps) void 0 === props[propName] && (props[propName] = defaultProps[propName]);
+ }
+ if ((key || ref) && (void 0 === props.$$typeof || props.$$typeof !== REACT_ELEMENT_TYPE)) {
+ var displayName = "function" == typeof type ? type.displayName || type.name || "Unknown" : type;
+ key && defineKeyPropWarningGetter(props, displayName), ref && defineRefPropWarningGetter(props, displayName);
+ }
+ return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
+ }
+ function cloneAndReplaceKey(oldElement, newKey) {
+ return ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
+ }
+ function cloneElement(element, config, children) {
+ var propName, props = _assign({}, element.props), key = element.key, ref = element.ref, self = element._self, source = element._source, owner = element._owner;
+ if (null != config) {
+ hasValidRef(config) && (ref = config.ref, owner = ReactCurrentOwner.current), hasValidKey(config) && (key = "" + config.key);
+ var defaultProps;
+ element.type && element.type.defaultProps && (defaultProps = element.type.defaultProps);
+ for (propName in config) hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName) && (void 0 === config[propName] && void 0 !== defaultProps ? props[propName] = defaultProps[propName] : props[propName] = config[propName]);
+ }
+ var childrenLength = arguments.length - 2;
+ if (1 === childrenLength) props.children = children; else if (childrenLength > 1) {
+ for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++) childArray[i] = arguments[i + 2];
+ props.children = childArray;
+ }
+ return ReactElement(element.type, key, ref, self, source, owner, props);
+ }
+ function isValidElement(object) {
+ return "object" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;
+ }
+ function escape(key) {
+ var escaperLookup = {
+ "=": "=0",
+ ":": "=2"
+ };
+ return "$" + ("" + key).replace(/[=:]/g, function(match) {
+ return escaperLookup[match];
+ });
+ }
+ function escapeUserProvidedKey(text) {
+ return ("" + text).replace(userProvidedKeyEscapeRegex, "$&/");
+ }
+ function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {
+ if (traverseContextPool.length) {
+ var traverseContext = traverseContextPool.pop();
+ return traverseContext.result = mapResult, traverseContext.keyPrefix = keyPrefix,
+ traverseContext.func = mapFunction, traverseContext.context = mapContext, traverseContext.count = 0,
+ traverseContext;
+ }
+ return {
+ result: mapResult,
+ keyPrefix: keyPrefix,
+ func: mapFunction,
+ context: mapContext,
+ count: 0
+ };
+ }
+ function releaseTraverseContext(traverseContext) {
+ traverseContext.result = null, traverseContext.keyPrefix = null, traverseContext.func = null,
+ traverseContext.context = null, traverseContext.count = 0, traverseContextPool.length < POOL_SIZE && traverseContextPool.push(traverseContext);
+ }
+ function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
+ var type = typeof children;
+ "undefined" !== type && "boolean" !== type || (children = null);
+ var invokeCallback = !1;
+ if (null === children) invokeCallback = !0; else switch (type) {
+ case "string":
+ case "number":
+ invokeCallback = !0;
+ break;
+
+ case "object":
+ switch (children.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ case REACT_CALL_TYPE:
+ case REACT_RETURN_TYPE:
+ case REACT_PORTAL_TYPE:
+ invokeCallback = !0;
+ }
+ }
+ if (invokeCallback) return callback(traverseContext, children, "" === nameSoFar ? SEPARATOR + getComponentKey(children, 0) : nameSoFar),
+ 1;
+ var child, nextName, subtreeCount = 0, nextNamePrefix = "" === nameSoFar ? SEPARATOR : nameSoFar + SUBSEPARATOR;
+ if (Array.isArray(children)) for (var i = 0; i < children.length; i++) child = children[i],
+ nextName = nextNamePrefix + getComponentKey(child, i), subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); else {
+ var iteratorFn = getIteratorFn(children);
+ if ("function" == typeof iteratorFn) {
+ iteratorFn === children.entries && (warning(didWarnAboutMaps, "Using Maps as children is unsupported and will likely yield unexpected results. Convert it to a sequence/iterable of keyed ReactElements instead.%s", ReactDebugCurrentFrame.getStackAddendum()),
+ didWarnAboutMaps = !0);
+ for (var step, iterator = iteratorFn.call(children), ii = 0; !(step = iterator.next()).done; ) child = step.value,
+ nextName = nextNamePrefix + getComponentKey(child, ii++), subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
+ } else if ("object" === type) {
+ var addendum = "";
+ addendum = " If you meant to render a collection of children, use an array instead." + ReactDebugCurrentFrame.getStackAddendum();
+ var childrenString = "" + children;
+ invariant(!1, "Objects are not valid as a React child (found: %s).%s", "[object Object]" === childrenString ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString, addendum);
+ }
+ }
+ return subtreeCount;
+ }
+ function traverseAllChildren(children, callback, traverseContext) {
+ return null == children ? 0 : traverseAllChildrenImpl(children, "", callback, traverseContext);
+ }
+ function getComponentKey(component, index) {
+ return "object" == typeof component && null !== component && null != component.key ? escape(component.key) : index.toString(36);
+ }
+ function forEachSingleChild(bookKeeping, child, name) {
+ var func = bookKeeping.func, context = bookKeeping.context;
+ func.call(context, child, bookKeeping.count++);
+ }
+ function forEachChildren(children, forEachFunc, forEachContext) {
+ if (null == children) return children;
+ var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);
+ traverseAllChildren(children, forEachSingleChild, traverseContext), releaseTraverseContext(traverseContext);
+ }
+ function mapSingleChildIntoContext(bookKeeping, child, childKey) {
+ var result = bookKeeping.result, keyPrefix = bookKeeping.keyPrefix, func = bookKeeping.func, context = bookKeeping.context, mappedChild = func.call(context, child, bookKeeping.count++);
+ Array.isArray(mappedChild) ? mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument) : null != mappedChild && (isValidElement(mappedChild) && (mappedChild = cloneAndReplaceKey(mappedChild, keyPrefix + (!mappedChild.key || child && child.key === mappedChild.key ? "" : escapeUserProvidedKey(mappedChild.key) + "/") + childKey)),
+ result.push(mappedChild));
+ }
+ function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
+ var escapedPrefix = "";
+ null != prefix && (escapedPrefix = escapeUserProvidedKey(prefix) + "/");
+ var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);
+ traverseAllChildren(children, mapSingleChildIntoContext, traverseContext), releaseTraverseContext(traverseContext);
+ }
+ function mapChildren(children, func, context) {
+ if (null == children) return children;
+ var result = [];
+ return mapIntoWithKeyPrefixInternal(children, result, null, func, context), result;
+ }
+ function countChildren(children, context) {
+ return traverseAllChildren(children, emptyFunction.thatReturnsNull, null);
+ }
+ function toArray(children) {
+ var result = [];
+ return mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument),
+ result;
+ }
+ function onlyChild(children) {
+ return isValidElement(children) || invariant(!1, "React.Children.only expected to receive a single React element child."),
+ children;
+ }
+ function getComponentName(fiber) {
+ var type = fiber.type;
+ return "string" == typeof type ? type : "function" == typeof type ? type.displayName || type.name : null;
+ }
+ function getDeclarationErrorAddendum() {
+ if (ReactCurrentOwner.current) {
+ var name = getComponentName(ReactCurrentOwner.current);
+ if (name) return "\n\nCheck the render method of ` + ("`" + `" + name + "`)) + ("`" + (`.";
+ }
+ return "";
+ }
+ function getSourceInfoErrorAddendum(elementProps) {
+ if (null !== elementProps && void 0 !== elementProps && void 0 !== elementProps.__source) {
+ var source = elementProps.__source;
+ return "\n\nCheck your code at " + source.fileName.replace(/^.*[\\\/]/, "") + ":" + source.lineNumber + ".";
+ }
+ return "";
+ }
+ function getCurrentComponentErrorInfo(parentType) {
+ var info = getDeclarationErrorAddendum();
+ if (!info) {
+ var parentName = "string" == typeof parentType ? parentType : parentType.displayName || parentType.name;
+ parentName && (info = "\n\nCheck the top-level render call using <" + parentName + ">.");
+ }
+ return info;
+ }
+ function validateExplicitKey(element, parentType) {
+ if (element._store && !element._store.validated && null == element.key) {
+ element._store.validated = !0;
+ var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
+ if (!ownerHasKeyUseWarning[currentComponentErrorInfo]) {
+ ownerHasKeyUseWarning[currentComponentErrorInfo] = !0;
+ var childOwner = "";
+ element && element._owner && element._owner !== ReactCurrentOwner.current && (childOwner = " It was passed a child from " + getComponentName(element._owner) + "."),
+ currentlyValidatingElement = element, warning(!1, 'Each child in an array or iterator should have a unique "key" prop.%s%s See https://fb.me/react-warning-keys for more information.%s', currentComponentErrorInfo, childOwner, getStackAddendum()),
+ currentlyValidatingElement = null;
+ }
+ }
+ }
+ function validateChildKeys(node, parentType) {
+ if ("object" == typeof node) if (Array.isArray(node)) for (var i = 0; i < node.length; i++) {
+ var child = node[i];
+ isValidElement(child) && validateExplicitKey(child, parentType);
+ } else if (isValidElement(node)) node._store && (node._store.validated = !0); else if (node) {
+ var iteratorFn = getIteratorFn(node);
+ if ("function" == typeof iteratorFn && iteratorFn !== node.entries) for (var step, iterator = iteratorFn.call(node); !(step = iterator.next()).done; ) isValidElement(step.value) && validateExplicitKey(step.value, parentType);
+ }
+ }
+ function validatePropTypes(element) {
+ var componentClass = element.type;
+ if ("function" == typeof componentClass) {
+ var name = componentClass.displayName || componentClass.name, propTypes = componentClass.propTypes;
+ propTypes ? (currentlyValidatingElement = element, checkPropTypes(propTypes, element.props, "prop", name, getStackAddendum),
+ currentlyValidatingElement = null) : void 0 === componentClass.PropTypes || propTypesMisspellWarningShown || (propTypesMisspellWarningShown = !0,
+ warning(!1, "Component %s declared ` + "`"))) + ((`PropTypes` + ("`" + ` instead of `)) + ("`" + (`propTypes` + "`"))))) + ((((`. Did you misspell the property assignment?", name || "Unknown")),
+ "function" == typeof componentClass.getDefaultProps && warning(componentClass.getDefaultProps.isReactClassApproved, "getDefaultProps is only used on classic React.createClass definitions. Use a static property named ` + ("`" + `defaultProps`)) + ("`" + (` instead.");
+ }
+ }
+ function validateFragmentProps(fragment) {
+ currentlyValidatingElement = fragment;
+ var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0;
+ try {
+ for (var _step, _iterator = Object.keys(fragment.props)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
+ var key = _step.value;
+ if (!VALID_FRAGMENT_PROPS.has(key)) {
+ warning(!1, "Invalid prop ` + "`"))) + ((`%s` + ("`" + ` supplied to `)) + ("`" + (`React.Fragment` + "`")))) + (((`. React.Fragment can only have ` + ("`" + `key`)) + ("`" + (` and ` + "`"))) + ((`children` + ("`" + ` props.%s", key, getStackAddendum());
+ break;
+ }
+ }
+ } catch (err) {
+ _didIteratorError = !0, _iteratorError = err;
+ } finally {
+ try {
+ !_iteratorNormalCompletion && _iterator.return && _iterator.return();
+ } finally {
+ if (_didIteratorError) throw _iteratorError;
+ }
+ }
+ null !== fragment.ref && warning(!1, "Invalid attribute `)) + ("`" + (`ref` + "`"))))))) + ((((((` supplied to ` + "`") + (`React.Fragment` + ("`" + `.%s", getStackAddendum()),
+ currentlyValidatingElement = null;
+ }
+ function createElementWithValidation(type, props, children) {
+ var validType = "string" == typeof type || "function" == typeof type || "symbol" == typeof type || "number" == typeof type;
+ if (!validType) {
+ var info = "";
+ (void 0 === type || "object" == typeof type && null !== type && 0 === Object.keys(type).length) && (info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");
+ var sourceInfo = getSourceInfoErrorAddendum(props);
+ info += sourceInfo || getDeclarationErrorAddendum(), info += getStackAddendum() || "",
+ warning(!1, "React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", null == type ? type : typeof type, info);
+ }
+ var element = createElement.apply(this, arguments);
+ if (null == element) return element;
+ if (validType) for (var i = 2; i < arguments.length; i++) validateChildKeys(arguments[i], type);
+ return "symbol" == typeof type && type === REACT_FRAGMENT_TYPE ? validateFragmentProps(element) : validatePropTypes(element),
+ element;
+ }
+ function createFactoryWithValidation(type) {
+ var validatedFactory = createElementWithValidation.bind(null, type);
+ return validatedFactory.type = type, Object.defineProperty(validatedFactory, "type", {
+ enumerable: !1,
+ get: function() {
+ return lowPriorityWarning$1(!1, "Factory.type is deprecated. Access the class directly before passing it to createFactory."),
+ Object.defineProperty(this, "type", {
+ value: type
+ }), type;
+ }
+ }), validatedFactory;
+ }
+ function cloneElementWithValidation(element, props, children) {
+ for (var newElement = cloneElement.apply(this, arguments), i = 2; i < arguments.length; i++) validateChildKeys(arguments[i], newElement.type);
+ return validatePropTypes(newElement), newElement;
+ }
+ var _assign = __webpack_require__(69), emptyObject = __webpack_require__(93), invariant = __webpack_require__(70), warning = __webpack_require__(94), emptyFunction = __webpack_require__(39), checkPropTypes = __webpack_require__(132), hasSymbol = "function" == typeof Symbol && Symbol.for, REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for("react.element") : 60103, REACT_CALL_TYPE = hasSymbol ? Symbol.for("react.call") : 60104, REACT_RETURN_TYPE = hasSymbol ? Symbol.for("react.return") : 60105, REACT_PORTAL_TYPE = hasSymbol ? Symbol.for("react.portal") : 60106, REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for("react.fragment") : 60107, MAYBE_ITERATOR_SYMBOL = "function" == typeof Symbol && Symbol.iterator, FAUX_ITERATOR_SYMBOL = "@@iterator", lowPriorityWarning = function() {}, printWarning = function(format) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];
+ var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ "undefined" != typeof console && console.warn(message);
+ try {
+ throw new Error(message);
+ } catch (x) {}
+ };
+ lowPriorityWarning = function(condition, format) {
+ if (void 0 === format) throw new Error("`))) + (("`" + (`warning(condition, format, ...args)` + "`")) + (` requires a warning message argument");
+ if (!condition) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];
+ printWarning.apply(void 0, [ format ].concat(args));
+ }
+ };
+ var lowPriorityWarning$1 = lowPriorityWarning, didWarnStateUpdateForUnmountedComponent = {}, ReactNoopUpdateQueue = {
+ isMounted: function(publicInstance) {
+ return !1;
+ },
+ enqueueForceUpdate: function(publicInstance, callback, callerName) {
+ warnNoop(publicInstance, "forceUpdate");
+ },
+ enqueueReplaceState: function(publicInstance, completeState, callback, callerName) {
+ warnNoop(publicInstance, "replaceState");
+ },
+ enqueueSetState: function(publicInstance, partialState, callback, callerName) {
+ warnNoop(publicInstance, "setState");
+ }
+ };
+ Component.prototype.isReactComponent = {}, Component.prototype.setState = function(partialState, callback) {
+ "object" != typeof partialState && "function" != typeof partialState && null != partialState && invariant(!1, "setState(...): takes an object of state variables to update or a function which returns an object of state variables."),
+ this.updater.enqueueSetState(this, partialState, callback, "setState");
+ }, Component.prototype.forceUpdate = function(callback) {
+ this.updater.enqueueForceUpdate(this, callback, "forceUpdate");
+ };
+ var deprecatedAPIs = {
+ isMounted: [ "isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks." ],
+ replaceState: [ "replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)." ]
+ };
+ for (var fnName in deprecatedAPIs) deprecatedAPIs.hasOwnProperty(fnName) && function(methodName, info) {
+ Object.defineProperty(Component.prototype, methodName, {
+ get: function() {
+ lowPriorityWarning$1(!1, "%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]);
+ }
+ });
+ }(fnName, deprecatedAPIs[fnName]);
+ ComponentDummy.prototype = Component.prototype;
+ var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();
+ pureComponentPrototype.constructor = PureComponent, _assign(pureComponentPrototype, Component.prototype),
+ pureComponentPrototype.isPureReactComponent = !0;
+ var asyncComponentPrototype = AsyncComponent.prototype = new ComponentDummy();
+ asyncComponentPrototype.constructor = AsyncComponent, _assign(asyncComponentPrototype, Component.prototype),
+ asyncComponentPrototype.unstable_isAsyncReactComponent = !0, asyncComponentPrototype.render = function() {
+ return this.props.children;
+ };
+ var specialPropKeyWarningShown, specialPropRefWarningShown, ReactCurrentOwner = {
+ current: null
+ }, hasOwnProperty = Object.prototype.hasOwnProperty, RESERVED_PROPS = {
+ key: !0,
+ ref: !0,
+ __self: !0,
+ __source: !0
+ }, ReactElement = function(type, key, ref, self, source, owner, props) {
+ var element = {
+ $$typeof: REACT_ELEMENT_TYPE,
+ type: type,
+ key: key,
+ ref: ref,
+ props: props,
+ _owner: owner
+ };
+ return element._store = {}, Object.defineProperty(element._store, "validated", {
+ configurable: !1,
+ enumerable: !1,
+ writable: !0,
+ value: !1
+ }), Object.defineProperty(element, "_self", {
+ configurable: !1,
+ enumerable: !1,
+ writable: !1,
+ value: self
+ }), Object.defineProperty(element, "_source", {
+ configurable: !1,
+ enumerable: !1,
+ writable: !1,
+ value: source
+ }), Object.freeze && (Object.freeze(element.props), Object.freeze(element)), element;
+ }, ReactDebugCurrentFrame = {};
+ ReactDebugCurrentFrame.getCurrentStack = null, ReactDebugCurrentFrame.getStackAddendum = function() {
+ var impl = ReactDebugCurrentFrame.getCurrentStack;
+ return impl ? impl() : null;
+ };
+ var SEPARATOR = ".", SUBSEPARATOR = ":", didWarnAboutMaps = !1, userProvidedKeyEscapeRegex = /\/+/g, POOL_SIZE = 10, traverseContextPool = [], describeComponentFrame = function(name, source, ownerName) {
+ return "\n in " + (name || "Unknown") + (source ? " (at " + source.fileName.replace(/^.*[\\\/]/, "") + ":" + source.lineNumber + ")" : ownerName ? " (created by " + ownerName + ")" : "");
+ }, currentlyValidatingElement = null, propTypesMisspellWarningShown = !1, getDisplayName = function(element) {
+ return null == element ? "#empty" : "string" == typeof element || "number" == typeof element ? "#text" : "string" == typeof element.type ? element.type : element.type === REACT_FRAGMENT_TYPE ? "React.Fragment" : element.type.displayName || element.type.name || "Unknown";
+ }, getStackAddendum = function() {
+ var stack = "";
+ if (currentlyValidatingElement) {
+ var name = getDisplayName(currentlyValidatingElement), owner = currentlyValidatingElement._owner;
+ stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner));
+ }
+ return stack += ReactDebugCurrentFrame.getStackAddendum() || "";
+ }, VALID_FRAGMENT_PROPS = new Map([ [ "children", !0 ], [ "key", !0 ] ]), ownerHasKeyUseWarning = {}, React = {
+ Children: {
+ map: mapChildren,
+ forEach: forEachChildren,
+ count: countChildren,
+ toArray: toArray,
+ only: onlyChild
+ },
+ Component: Component,
+ PureComponent: PureComponent,
+ unstable_AsyncComponent: AsyncComponent,
+ Fragment: REACT_FRAGMENT_TYPE,
+ createElement: createElementWithValidation,
+ cloneElement: cloneElementWithValidation,
+ createFactory: createFactoryWithValidation,
+ isValidElement: isValidElement,
+ version: "16.2.0",
+ __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
+ ReactCurrentOwner: ReactCurrentOwner,
+ assign: _assign
+ }
+ };
+ _assign(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {
+ ReactDebugCurrentFrame: ReactDebugCurrentFrame,
+ ReactComponentTreeHook: {}
+ });
+ var React$2 = Object.freeze({
+ default: React
+ }), React$3 = React$2 && React || React$2, react = React$3.default ? React$3.default : React$3;
+ module.exports = react;
+ }();
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function E(a) {
+ for (var b = arguments.length - 1, c = "Minified React error #" + a + "; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=" + a, d = 0; d < b; d++) c += "&args[]=" + encodeURIComponent(arguments[d + 1]);
+ throw b = Error(c + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."),
+ b.name = "Invariant Violation", b.framesToPop = 1, b;
+ }
+ function pa(a, b) {
+ return (a & b) === b;
+ }
+ function va(a, b) {
+ if (oa.hasOwnProperty(a) || 2 < a.length && ("o" === a[0] || "O" === a[0]) && ("n" === a[1] || "N" === a[1])) return !1;
+ if (null === b) return !0;
+ switch (typeof b) {
+ case "boolean":
+ return oa.hasOwnProperty(a) ? a = !0 : (b = wa(a)) ? a = b.hasBooleanValue || b.hasStringBooleanValue || b.hasOverloadedBooleanValue : (a = a.toLowerCase().slice(0, 5),
+ a = "data-" === a || "aria-" === a), a;
+
+ case "undefined":
+ case "number":
+ case "string":
+ case "object":
+ return !0;
+
+ default:
+ return !1;
+ }
+ }
+ function wa(a) {
+ return ua.hasOwnProperty(a) ? ua[a] : null;
+ }
+ function Ia(a) {
+ return a[1].toUpperCase();
+ }
+ function Ja(a, b, c, d, e, f, g, h, k) {
+ P._hasCaughtError = !1, P._caughtError = null;
+ var q = Array.prototype.slice.call(arguments, 3);
+ try {
+ b.apply(c, q);
+ } catch (v) {
+ P._caughtError = v, P._hasCaughtError = !0;
+ }
+ }
+ function Ka() {
+ if (P._hasRethrowError) {
+ var a = P._rethrowError;
+ throw P._rethrowError = null, P._hasRethrowError = !1, a;
+ }
+ }
+ function Na() {
+ if (La) for (var a in Ma) {
+ var b = Ma[a], c = La.indexOf(a);
+ if (-1 < c || E("96", a), !Oa[c]) {
+ b.extractEvents || E("97", a), Oa[c] = b, c = b.eventTypes;
+ for (var d in c) {
+ var e = void 0, f = c[d], g = b, h = d;
+ Pa.hasOwnProperty(h) && E("99", h), Pa[h] = f;
+ var k = f.phasedRegistrationNames;
+ if (k) {
+ for (e in k) k.hasOwnProperty(e) && Qa(k[e], g, h);
+ e = !0;
+ } else f.registrationName ? (Qa(f.registrationName, g, h), e = !0) : e = !1;
+ e || E("98", d, a);
+ }
+ }
+ }
+ }
+ function Qa(a, b, c) {
+ Ra[a] && E("100", a), Ra[a] = b, Sa[a] = b.eventTypes[c].dependencies;
+ }
+ function Ta(a) {
+ La && E("101"), La = Array.prototype.slice.call(a), Na();
+ }
+ function Ua(a) {
+ var c, b = !1;
+ for (c in a) if (a.hasOwnProperty(c)) {
+ var d = a[c];
+ Ma.hasOwnProperty(c) && Ma[c] === d || (Ma[c] && E("102", c), Ma[c] = d, b = !0);
+ }
+ b && Na();
+ }
+ function Za(a, b, c, d) {
+ b = a.type || "unknown-event", a.currentTarget = Ya(d), P.invokeGuardedCallbackAndCatchFirstError(b, c, void 0, a),
+ a.currentTarget = null;
+ }
+ function $a(a, b) {
+ return null == b && E("30"), null == a ? b : Array.isArray(a) ? Array.isArray(b) ? (a.push.apply(a, b),
+ a) : (a.push(b), a) : Array.isArray(b) ? [ a ].concat(b) : [ a, b ];
+ }
+ function ab(a, b, c) {
+ Array.isArray(a) ? a.forEach(b, c) : a && b.call(c, a);
+ }
+ function cb(a, b) {
+ if (a) {
+ var c = a._dispatchListeners, d = a._dispatchInstances;
+ if (Array.isArray(c)) for (var e = 0; e < c.length && !a.isPropagationStopped(); e++) Za(a, b, c[e], d[e]); else c && Za(a, b, c, d);
+ a._dispatchListeners = null, a._dispatchInstances = null, a.isPersistent() || a.constructor.release(a);
+ }
+ }
+ function db(a) {
+ return cb(a, !0);
+ }
+ function gb(a) {
+ return cb(a, !1);
+ }
+ function ib(a, b) {
+ var c = a.stateNode;
+ if (!c) return null;
+ var d = Wa(c);
+ if (!d) return null;
+ c = d[b];
+ a: switch (b) {
+ case "onClick":
+ case "onClickCapture":
+ case "onDoubleClick":
+ case "onDoubleClickCapture":
+ case "onMouseDown":
+ case "onMouseDownCapture":
+ case "onMouseMove":
+ case "onMouseMoveCapture":
+ case "onMouseUp":
+ case "onMouseUpCapture":
+ (d = !d.disabled) || (a = a.type, d = !("button" === a || "input" === a || "select" === a || "textarea" === a)),
+ a = !d;
+ break a;
+
+ default:
+ a = !1;
+ }
+ return a ? null : (c && "function" != typeof c && E("231", b, typeof c), c);
+ }
+ function jb(a, b, c, d) {
+ for (var e, f = 0; f < Oa.length; f++) {
+ var g = Oa[f];
+ g && (g = g.extractEvents(a, b, c, d)) && (e = $a(e, g));
+ }
+ return e;
+ }
+ function kb(a) {
+ a && (bb = $a(bb, a));
+ }
+ function lb(a) {
+ var b = bb;
+ bb = null, b && (a ? ab(b, db) : ab(b, gb), bb && E("95"), P.rethrowCaughtError());
+ }
+ function pb(a) {
+ if (a[Q]) return a[Q];
+ for (var b = []; !a[Q]; ) {
+ if (b.push(a), !a.parentNode) return null;
+ a = a.parentNode;
+ }
+ var c = void 0, d = a[Q];
+ if (5 === d.tag || 6 === d.tag) return d;
+ for (;a && (d = a[Q]); a = b.pop()) c = d;
+ return c;
+ }
+ function qb(a) {
+ if (5 === a.tag || 6 === a.tag) return a.stateNode;
+ E("33");
+ }
+ function rb(a) {
+ return a[ob] || null;
+ }
+ function tb(a) {
+ do {
+ a = a.return;
+ } while (a && 5 !== a.tag);
+ return a || null;
+ }
+ function ub(a, b, c) {
+ for (var d = []; a; ) d.push(a), a = tb(a);
+ for (a = d.length; 0 < a--; ) b(d[a], "captured", c);
+ for (a = 0; a < d.length; a++) b(d[a], "bubbled", c);
+ }
+ function vb(a, b, c) {
+ (b = ib(a, c.dispatchConfig.phasedRegistrationNames[b])) && (c._dispatchListeners = $a(c._dispatchListeners, b),
+ c._dispatchInstances = $a(c._dispatchInstances, a));
+ }
+ function wb(a) {
+ a && a.dispatchConfig.phasedRegistrationNames && ub(a._targetInst, vb, a);
+ }
+ function xb(a) {
+ if (a && a.dispatchConfig.phasedRegistrationNames) {
+ var b = a._targetInst;
+ b = b ? tb(b) : null, ub(b, vb, a);
+ }
+ }
+ function yb(a, b, c) {
+ a && c && c.dispatchConfig.registrationName && (b = ib(a, c.dispatchConfig.registrationName)) && (c._dispatchListeners = $a(c._dispatchListeners, b),
+ c._dispatchInstances = $a(c._dispatchInstances, a));
+ }
+ function zb(a) {
+ a && a.dispatchConfig.registrationName && yb(a._targetInst, null, a);
+ }
+ function Ab(a) {
+ ab(a, wb);
+ }
+ function Bb(a, b, c, d) {
+ if (c && d) a: {
+ for (var e = c, f = d, g = 0, h = e; h; h = tb(h)) g++;
+ h = 0;
+ for (var k = f; k; k = tb(k)) h++;
+ for (;0 < g - h; ) e = tb(e), g--;
+ for (;0 < h - g; ) f = tb(f), h--;
+ for (;g--; ) {
+ if (e === f || e === f.alternate) break a;
+ e = tb(e), f = tb(f);
+ }
+ e = null;
+ } else e = null;
+ for (f = e, e = []; c && c !== f && (null === (g = c.alternate) || g !== f); ) e.push(c),
+ c = tb(c);
+ for (c = []; d && d !== f && (null === (g = d.alternate) || g !== f); ) c.push(d),
+ d = tb(d);
+ for (d = 0; d < e.length; d++) yb(e[d], "bubbled", a);
+ for (a = c.length; 0 < a--; ) yb(c[a], "captured", b);
+ }
+ function Eb() {
+ return !Db && l.canUseDOM && (Db = "textContent" in document.documentElement ? "textContent" : "innerText"),
+ Db;
+ }
+ function Fb() {
+ if (S._fallbackText) return S._fallbackText;
+ var a, d, b = S._startText, c = b.length, e = Gb(), f = e.length;
+ for (a = 0; a < c && b[a] === e[a]; a++) ;
+ var g = c - a;
+ for (d = 1; d <= g && b[c - d] === e[f - d]; d++) ;
+ return S._fallbackText = e.slice(a, 1 < d ? 1 - d : void 0), S._fallbackText;
+ }
+ function Gb() {
+ return "value" in S._root ? S._root.value : S._root[Eb()];
+ }
+ function T(a, b, c, d) {
+ this.dispatchConfig = a, this._targetInst = b, this.nativeEvent = c, a = this.constructor.Interface;
+ for (var e in a) a.hasOwnProperty(e) && ((b = a[e]) ? this[e] = b(c) : "target" === e ? this.target = d : this[e] = c[e]);
+ return this.isDefaultPrevented = (null != c.defaultPrevented ? c.defaultPrevented : !1 === c.returnValue) ? C.thatReturnsTrue : C.thatReturnsFalse,
+ this.isPropagationStopped = C.thatReturnsFalse, this;
+ }
+ function Kb(a, b, c, d) {
+ if (this.eventPool.length) {
+ var e = this.eventPool.pop();
+ return this.call(e, a, b, c, d), e;
+ }
+ return new this(a, b, c, d);
+ }
+ function Lb(a) {
+ a instanceof this || E("223"), a.destructor(), 10 > this.eventPool.length && this.eventPool.push(a);
+ }
+ function Jb(a) {
+ a.eventPool = [], a.getPooled = Kb, a.release = Lb;
+ }
+ function Mb(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function Nb(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function dc(a, b) {
+ switch (a) {
+ case "topKeyUp":
+ return -1 !== Pb.indexOf(b.keyCode);
+
+ case "topKeyDown":
+ return 229 !== b.keyCode;
+
+ case "topKeyPress":
+ case "topMouseDown":
+ case "topBlur":
+ return !0;
+
+ default:
+ return !1;
+ }
+ }
+ function ec(a) {
+ return a = a.detail, "object" == typeof a && "data" in a ? a.data : null;
+ }
+ function gc(a, b) {
+ switch (a) {
+ case "topCompositionEnd":
+ return ec(b);
+
+ case "topKeyPress":
+ return 32 !== b.which ? null : (cc = !0, ac);
+
+ case "topTextInput":
+ return a = b.data, a === ac && cc ? null : a;
+
+ default:
+ return null;
+ }
+ }
+ function hc(a, b) {
+ if (fc) return "topCompositionEnd" === a || !Vb && dc(a, b) ? (a = Fb(), S._root = null,
+ S._startText = null, S._fallbackText = null, fc = !1, a) : null;
+ switch (a) {
+ case "topPaste":
+ return null;
+
+ case "topKeyPress":
+ if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {
+ if (b.char && 1 < b.char.length) return b.char;
+ if (b.which) return String.fromCharCode(b.which);
+ }
+ return null;
+
+ case "topCompositionEnd":
+ return $b ? null : b.data;
+
+ default:
+ return null;
+ }
+ }
+ function mc(a) {
+ if (a = Xa(a)) {
+ jc && "function" == typeof jc.restoreControlledState || E("194");
+ var b = Wa(a.stateNode);
+ jc.restoreControlledState(a.stateNode, a.type, b);
+ }
+ }
+ function oc(a) {
+ kc ? lc ? lc.push(a) : lc = [ a ] : kc = a;
+ }
+ function pc() {
+ if (kc) {
+ var a = kc, b = lc;
+ if (lc = kc = null, mc(a), b) for (a = 0; a < b.length; a++) mc(b[a]);
+ }
+ }
+ function rc(a, b) {
+ return a(b);
+ }
+ function tc(a, b) {
+ if (sc) return rc(a, b);
+ sc = !0;
+ try {
+ return rc(a, b);
+ } finally {
+ sc = !1, pc();
+ }
+ }
+ function vc(a) {
+ var b = a && a.nodeName && a.nodeName.toLowerCase();
+ return "input" === b ? !!uc[a.type] : "textarea" === b;
+ }
+ function wc(a) {
+ return a = a.target || a.srcElement || window, a.correspondingUseElement && (a = a.correspondingUseElement),
+ 3 === a.nodeType ? a.parentNode : a;
+ }
+ function yc(a, b) {
+ if (!l.canUseDOM || b && !("addEventListener" in document)) return !1;
+ b = "on" + a;
+ var c = b in document;
+ return c || (c = document.createElement("div"), c.setAttribute(b, "return;"), c = "function" == typeof c[b]),
+ !c && xc && "wheel" === a && (c = document.implementation.hasFeature("Events.wheel", "3.0")),
+ c;
+ }
+ function zc(a) {
+ var b = a.type;
+ return (a = a.nodeName) && "input" === a.toLowerCase() && ("checkbox" === b || "radio" === b);
+ }
+ function Ac(a) {
+ var b = zc(a) ? "checked" : "value", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = "" + a[b];
+ if (!a.hasOwnProperty(b) && "function" == typeof c.get && "function" == typeof c.set) return Object.defineProperty(a, b, {
+ enumerable: c.enumerable,
+ configurable: !0,
+ get: function() {
+ return c.get.call(this);
+ },
+ set: function(a) {
+ d = "" + a, c.set.call(this, a);
+ }
+ }), {
+ getValue: function() {
+ return d;
+ },
+ setValue: function(a) {
+ d = "" + a;
+ },
+ stopTracking: function() {
+ a._valueTracker = null, delete a[b];
+ }
+ };
+ }
+ function Bc(a) {
+ a._valueTracker || (a._valueTracker = Ac(a));
+ }
+ function Cc(a) {
+ if (!a) return !1;
+ var b = a._valueTracker;
+ if (!b) return !0;
+ var c = b.getValue(), d = "";
+ return a && (d = zc(a) ? a.checked ? "true" : "false" : a.value), (a = d) !== c && (b.setValue(a),
+ !0);
+ }
+ function Ec(a, b, c) {
+ return a = T.getPooled(Dc.change, a, b, c), a.type = "change", oc(c), Ab(a), a;
+ }
+ function Hc(a) {
+ kb(a), lb(!1);
+ }
+ function Ic(a) {
+ if (Cc(qb(a))) return a;
+ }
+ function Jc(a, b) {
+ if ("topChange" === a) return b;
+ }
+ function Lc() {
+ Fc && (Fc.detachEvent("onpropertychange", Mc), Gc = Fc = null);
+ }
+ function Mc(a) {
+ "value" === a.propertyName && Ic(Gc) && (a = Ec(Gc, a, wc(a)), tc(Hc, a));
+ }
+ function Nc(a, b, c) {
+ "topFocus" === a ? (Lc(), Fc = b, Gc = c, Fc.attachEvent("onpropertychange", Mc)) : "topBlur" === a && Lc();
+ }
+ function Oc(a) {
+ if ("topSelectionChange" === a || "topKeyUp" === a || "topKeyDown" === a) return Ic(Gc);
+ }
+ function Pc(a, b) {
+ if ("topClick" === a) return Ic(b);
+ }
+ function $c(a, b) {
+ if ("topInput" === a || "topChange" === a) return Ic(b);
+ }
+ function bd(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function dd(a) {
+ var b = this.nativeEvent;
+ return b.getModifierState ? b.getModifierState(a) : !!(a = cd[a]) && !!b[a];
+ }
+ function ed() {
+ return dd;
+ }
+ function fd(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function jd(a) {
+ return a = a.type, "string" == typeof a ? a : "function" == typeof a ? a.displayName || a.name : null;
+ }
+ function kd(a) {
+ var b = a;
+ if (a.alternate) for (;b.return; ) b = b.return; else {
+ if (0 != (2 & b.effectTag)) return 1;
+ for (;b.return; ) if (b = b.return, 0 != (2 & b.effectTag)) return 1;
+ }
+ return 3 === b.tag ? 2 : 3;
+ }
+ function ld(a) {
+ return !!(a = a._reactInternalFiber) && 2 === kd(a);
+ }
+ function md(a) {
+ 2 !== kd(a) && E("188");
+ }
+ function nd(a) {
+ var b = a.alternate;
+ if (!b) return b = kd(a), 3 === b && E("188"), 1 === b ? null : a;
+ for (var c = a, d = b; ;) {
+ var e = c.return, f = e ? e.alternate : null;
+ if (!e || !f) break;
+ if (e.child === f.child) {
+ for (var g = e.child; g; ) {
+ if (g === c) return md(e), a;
+ if (g === d) return md(e), b;
+ g = g.sibling;
+ }
+ E("188");
+ }
+ if (c.return !== d.return) c = e, d = f; else {
+ g = !1;
+ for (var h = e.child; h; ) {
+ if (h === c) {
+ g = !0, c = e, d = f;
+ break;
+ }
+ if (h === d) {
+ g = !0, d = e, c = f;
+ break;
+ }
+ h = h.sibling;
+ }
+ if (!g) {
+ for (h = f.child; h; ) {
+ if (h === c) {
+ g = !0, c = f, d = e;
+ break;
+ }
+ if (h === d) {
+ g = !0, d = f, c = e;
+ break;
+ }
+ h = h.sibling;
+ }
+ g || E("189");
+ }
+ }
+ c.alternate !== d && E("190");
+ }
+ return 3 !== c.tag && E("188"), c.stateNode.current === c ? a : b;
+ }
+ function od(a) {
+ if (!(a = nd(a))) return null;
+ for (var b = a; ;) {
+ if (5 === b.tag || 6 === b.tag) return b;
+ if (b.child) b.child.return = b, b = b.child; else {
+ if (b === a) break;
+ for (;!b.sibling; ) {
+ if (!b.return || b.return === a) return null;
+ b = b.return;
+ }
+ b.sibling.return = b.return, b = b.sibling;
+ }
+ }
+ return null;
+ }
+ function pd(a) {
+ if (!(a = nd(a))) return null;
+ for (var b = a; ;) {
+ if (5 === b.tag || 6 === b.tag) return b;
+ if (b.child && 4 !== b.tag) b.child.return = b, b = b.child; else {
+ if (b === a) break;
+ for (;!b.sibling; ) {
+ if (!b.return || b.return === a) return null;
+ b = b.return;
+ }
+ b.sibling.return = b.return, b = b.sibling;
+ }
+ }
+ return null;
+ }
+ function rd(a) {
+ var b = a.targetInst;
+ do {
+ if (!b) {
+ a.ancestors.push(b);
+ break;
+ }
+ var c;
+ for (c = b; c.return; ) c = c.return;
+ if (!(c = 3 !== c.tag ? null : c.stateNode.containerInfo)) break;
+ a.ancestors.push(b), b = pb(c);
+ } while (b);
+ for (c = 0; c < a.ancestors.length; c++) b = a.ancestors[c], sd(a.topLevelType, b, a.nativeEvent, wc(a.nativeEvent));
+ }
+ function ud(a) {
+ td = !!a;
+ }
+ function U(a, b, c) {
+ return c ? ba.listen(c, b, vd.bind(null, a)) : null;
+ }
+ function wd(a, b, c) {
+ return c ? ba.capture(c, b, vd.bind(null, a)) : null;
+ }
+ function vd(a, b) {
+ if (td) {
+ var c = wc(b);
+ if (c = pb(c), null === c || "number" != typeof c.tag || 2 === kd(c) || (c = null),
+ qd.length) {
+ var d = qd.pop();
+ d.topLevelType = a, d.nativeEvent = b, d.targetInst = c, a = d;
+ } else a = {
+ topLevelType: a,
+ nativeEvent: b,
+ targetInst: c,
+ ancestors: []
+ };
+ try {
+ tc(rd, a);
+ } finally {
+ a.topLevelType = null, a.nativeEvent = null, a.targetInst = null, a.ancestors.length = 0,
+ 10 > qd.length && qd.push(a);
+ }
+ }
+ }
+ function yd(a, b) {
+ var c = {};
+ return c[a.toLowerCase()] = b.toLowerCase(), c["Webkit" + a] = "webkit" + b, c["Moz" + a] = "moz" + b,
+ c["ms" + a] = "MS" + b, c["O" + a] = "o" + b.toLowerCase(), c;
+ }
+ function Cd(a) {
+ if (Ad[a]) return Ad[a];
+ if (!zd[a]) return a;
+ var c, b = zd[a];
+ for (c in b) if (b.hasOwnProperty(c) && c in Bd) return Ad[a] = b[c];
+ return "";
+ }
+ function Hd(a) {
+ return Object.prototype.hasOwnProperty.call(a, Gd) || (a[Gd] = Fd++, Ed[a[Gd]] = {}),
+ Ed[a[Gd]];
+ }
+ function Id(a) {
+ for (;a && a.firstChild; ) a = a.firstChild;
+ return a;
+ }
+ function Jd(a, b) {
+ var c = Id(a);
+ a = 0;
+ for (var d; c; ) {
+ if (3 === c.nodeType) {
+ if (d = a + c.textContent.length, a <= b && d >= b) return {
+ node: c,
+ offset: b - a
+ };
+ a = d;
+ }
+ a: {
+ for (;c; ) {
+ if (c.nextSibling) {
+ c = c.nextSibling;
+ break a;
+ }
+ c = c.parentNode;
+ }
+ c = void 0;
+ }
+ c = Id(c);
+ }
+ }
+ function Kd(a) {
+ var b = a && a.nodeName && a.nodeName.toLowerCase();
+ return b && ("input" === b && "text" === a.type || "textarea" === b || "true" === a.contentEditable);
+ }
+ function Rd(a, b) {
+ if (Qd || null == Nd || Nd !== da()) return null;
+ var c = Nd;
+ return "selectionStart" in c && Kd(c) ? c = {
+ start: c.selectionStart,
+ end: c.selectionEnd
+ } : window.getSelection ? (c = window.getSelection(), c = {
+ anchorNode: c.anchorNode,
+ anchorOffset: c.anchorOffset,
+ focusNode: c.focusNode,
+ focusOffset: c.focusOffset
+ }) : c = void 0, Pd && ea(Pd, c) ? null : (Pd = c, a = T.getPooled(Md.select, Od, a, b),
+ a.type = "select", a.target = Nd, Ab(a), a);
+ }
+ function Td(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function Ud(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function Vd(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function Wd(a) {
+ var b = a.keyCode;
+ return "charCode" in a ? 0 === (a = a.charCode) && 13 === b && (a = 13) : a = b,
+ 32 <= a || 13 === a ? a : 0;
+ }
+ function Zd(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function $d(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function ae(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function be(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function ce(a, b, c, d) {
+ return T.call(this, a, b, c, d);
+ }
+ function V(a) {
+ 0 > he || (a.current = ge[he], ge[he] = null, he--);
+ }
+ function W(a, b) {
+ he++, ge[he] = a.current, a.current = b;
+ }
+ function ke(a) {
+ return le(a) ? je : ie.current;
+ }
+ function me(a, b) {
+ var c = a.type.contextTypes;
+ if (!c) return D;
+ var d = a.stateNode;
+ if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext;
+ var f, e = {};
+ for (f in c) e[f] = b[f];
+ return d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b,
+ a.__reactInternalMemoizedMaskedChildContext = e), e;
+ }
+ function le(a) {
+ return 2 === a.tag && null != a.type.childContextTypes;
+ }
+ function ne(a) {
+ le(a) && (V(X, a), V(ie, a));
+ }
+ function oe(a, b, c) {
+ null != ie.cursor && E("168"), W(ie, b, a), W(X, c, a);
+ }
+ function pe(a, b) {
+ var c = a.stateNode, d = a.type.childContextTypes;
+ if ("function" != typeof c.getChildContext) return b;
+ c = c.getChildContext();
+ for (var e in c) e in d || E("108", jd(a) || "Unknown", e);
+ return B({}, b, c);
+ }
+ function qe(a) {
+ if (!le(a)) return !1;
+ var b = a.stateNode;
+ return b = b && b.__reactInternalMemoizedMergedChildContext || D, je = ie.current,
+ W(ie, b, a), W(X, X.current, a), !0;
+ }
+ function re(a, b) {
+ var c = a.stateNode;
+ if (c || E("169"), b) {
+ var d = pe(a, je);
+ c.__reactInternalMemoizedMergedChildContext = d, V(X, a), V(ie, a), W(ie, d, a);
+ } else V(X, a);
+ W(X, b, a);
+ }
+ function Y(a, b, c) {
+ this.tag = a, this.key = b, this.stateNode = this.type = null, this.sibling = this.child = this.return = null,
+ this.index = 0, this.memoizedState = this.updateQueue = this.memoizedProps = this.pendingProps = this.ref = null,
+ this.internalContextTag = c, this.effectTag = 0, this.lastEffect = this.firstEffect = this.nextEffect = null,
+ this.expirationTime = 0, this.alternate = null;
+ }
+ function se(a, b, c) {
+ var d = a.alternate;
+ return null === d ? (d = new Y(a.tag, a.key, a.internalContextTag), d.type = a.type,
+ d.stateNode = a.stateNode, d.alternate = a, a.alternate = d) : (d.effectTag = 0,
+ d.nextEffect = null, d.firstEffect = null, d.lastEffect = null), d.expirationTime = c,
+ d.pendingProps = b, d.child = a.child, d.memoizedProps = a.memoizedProps, d.memoizedState = a.memoizedState,
+ d.updateQueue = a.updateQueue, d.sibling = a.sibling, d.index = a.index, d.ref = a.ref,
+ d;
+ }
+ function te(a, b, c) {
+ var d = void 0, e = a.type, f = a.key;
+ return "function" == typeof e ? (d = e.prototype && e.prototype.isReactComponent ? new Y(2, f, b) : new Y(0, f, b),
+ d.type = e, d.pendingProps = a.props) : "string" == typeof e ? (d = new Y(5, f, b),
+ d.type = e, d.pendingProps = a.props) : "object" == typeof e && null !== e && "number" == typeof e.tag ? (d = e,
+ d.pendingProps = a.props) : E("130", null == e ? e : typeof e, ""), d.expirationTime = c,
+ d;
+ }
+ function ue(a, b, c, d) {
+ return b = new Y(10, d, b), b.pendingProps = a, b.expirationTime = c, b;
+ }
+ function ve(a, b, c) {
+ return b = new Y(6, null, b), b.pendingProps = a, b.expirationTime = c, b;
+ }
+ function we(a, b, c) {
+ return b = new Y(7, a.key, b), b.type = a.handler, b.pendingProps = a, b.expirationTime = c,
+ b;
+ }
+ function xe(a, b, c) {
+ return a = new Y(9, null, b), a.expirationTime = c, a;
+ }
+ function ye(a, b, c) {
+ return b = new Y(4, a.key, b), b.pendingProps = a.children || [], b.expirationTime = c,
+ b.stateNode = {
+ containerInfo: a.containerInfo,
+ pendingChildren: null,
+ implementation: a.implementation
+ }, b;
+ }
+ function Be(a) {
+ return function(b) {
+ try {
+ return a(b);
+ } catch (c) {}
+ };
+ }
+ function Ce(a) {
+ if ("undefined" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;
+ var b = __REACT_DEVTOOLS_GLOBAL_HOOK__;
+ if (b.isDisabled || !b.supportsFiber) return !0;
+ try {
+ var c = b.inject(a);
+ ze = Be(function(a) {
+ return b.onCommitFiberRoot(c, a);
+ }), Ae = Be(function(a) {
+ return b.onCommitFiberUnmount(c, a);
+ });
+ } catch (d) {}
+ return !0;
+ }
+ function De(a) {
+ "function" == typeof ze && ze(a);
+ }
+ function Ee(a) {
+ "function" == typeof Ae && Ae(a);
+ }
+ function Fe(a) {
+ return {
+ baseState: a,
+ expirationTime: 0,
+ first: null,
+ last: null,
+ callbackList: null,
+ hasForceUpdate: !1,
+ isInitialized: !1
+ };
+ }
+ function Ge(a, b) {
+ null === a.last ? a.first = a.last = b : (a.last.next = b, a.last = b), (0 === a.expirationTime || a.expirationTime > b.expirationTime) && (a.expirationTime = b.expirationTime);
+ }
+ function He(a, b) {
+ var c = a.alternate, d = a.updateQueue;
+ null === d && (d = a.updateQueue = Fe(null)), null !== c ? null === (a = c.updateQueue) && (a = c.updateQueue = Fe(null)) : a = null,
+ a = a !== d ? a : null, null === a ? Ge(d, b) : null === d.last || null === a.last ? (Ge(d, b),
+ Ge(a, b)) : (Ge(d, b), a.last = b);
+ }
+ function Ie(a, b, c, d) {
+ return a = a.partialState, "function" == typeof a ? a.call(b, c, d) : a;
+ }
+ function Je(a, b, c, d, e, f) {
+ null !== a && a.updateQueue === c && (c = b.updateQueue = {
+ baseState: c.baseState,
+ expirationTime: c.expirationTime,
+ first: c.first,
+ last: c.last,
+ isInitialized: c.isInitialized,
+ callbackList: null,
+ hasForceUpdate: !1
+ }), c.expirationTime = 0, c.isInitialized ? a = c.baseState : (a = c.baseState = b.memoizedState,
+ c.isInitialized = !0);
+ for (var g = !0, h = c.first, k = !1; null !== h; ) {
+ var q = h.expirationTime;
+ if (q > f) {
+ var v = c.expirationTime;
+ (0 === v || v > q) && (c.expirationTime = q), k || (k = !0, c.baseState = a);
+ } else k || (c.first = h.next, null === c.first && (c.last = null)), h.isReplace ? (a = Ie(h, d, a, e),
+ g = !0) : (q = Ie(h, d, a, e)) && (a = g ? B({}, a, q) : B(a, q), g = !1), h.isForced && (c.hasForceUpdate = !0),
+ null !== h.callback && (q = c.callbackList, null === q && (q = c.callbackList = []),
+ q.push(h));
+ h = h.next;
+ }
+ return null !== c.callbackList ? b.effectTag |= 32 : null !== c.first || c.hasForceUpdate || (b.updateQueue = null),
+ k || (c.baseState = a), a;
+ }
+ function Ke(a, b) {
+ var c = a.callbackList;
+ if (null !== c) for (a.callbackList = null, a = 0; a < c.length; a++) {
+ var d = c[a], e = d.callback;
+ d.callback = null, "function" != typeof e && E("191", e), e.call(b);
+ }
+ }
+ function Le(a, b, c, d) {
+ function e(a, b) {
+ b.updater = f, a.stateNode = b, b._reactInternalFiber = a;
+ }
+ var f = {
+ isMounted: ld,
+ enqueueSetState: function(c, d, e) {
+ c = c._reactInternalFiber, e = void 0 === e ? null : e;
+ var g = b(c);
+ He(c, {
+ expirationTime: g,
+ partialState: d,
+ callback: e,
+ isReplace: !1,
+ isForced: !1,
+ nextCallback: null,
+ next: null
+ }), a(c, g);
+ },
+ enqueueReplaceState: function(c, d, e) {
+ c = c._reactInternalFiber, e = void 0 === e ? null : e;
+ var g = b(c);
+ He(c, {
+ expirationTime: g,
+ partialState: d,
+ callback: e,
+ isReplace: !0,
+ isForced: !1,
+ nextCallback: null,
+ next: null
+ }), a(c, g);
+ },
+ enqueueForceUpdate: function(c, d) {
+ c = c._reactInternalFiber, d = void 0 === d ? null : d;
+ var e = b(c);
+ He(c, {
+ expirationTime: e,
+ partialState: null,
+ callback: d,
+ isReplace: !1,
+ isForced: !0,
+ nextCallback: null,
+ next: null
+ }), a(c, e);
+ }
+ };
+ return {
+ adoptClassInstance: e,
+ constructClassInstance: function(a, b) {
+ var c = a.type, d = ke(a), f = 2 === a.tag && null != a.type.contextTypes, g = f ? me(a, d) : D;
+ return b = new c(b, g), e(a, b), f && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = d,
+ a.__reactInternalMemoizedMaskedChildContext = g), b;
+ },
+ mountClassInstance: function(a, b) {
+ var c = a.alternate, d = a.stateNode, e = d.state || null, g = a.pendingProps;
+ g || E("158");
+ var h = ke(a);
+ d.props = g, d.state = a.memoizedState = e, d.refs = D, d.context = me(a, h), null != a.type && null != a.type.prototype && !0 === a.type.prototype.unstable_isAsyncReactComponent && (a.internalContextTag |= 1),
+ "function" == typeof d.componentWillMount && (e = d.state, d.componentWillMount(),
+ e !== d.state && f.enqueueReplaceState(d, d.state, null), null !== (e = a.updateQueue) && (d.state = Je(c, a, e, d, g, b))),
+ "function" == typeof d.componentDidMount && (a.effectTag |= 4);
+ },
+ updateClassInstance: function(a, b, e) {
+ var g = b.stateNode;
+ g.props = b.memoizedProps, g.state = b.memoizedState;
+ var h = b.memoizedProps, k = b.pendingProps;
+ k || null == (k = h) && E("159");
+ var u = g.context, z = ke(b);
+ if (z = me(b, z), "function" != typeof g.componentWillReceiveProps || h === k && u === z || (u = g.state,
+ g.componentWillReceiveProps(k, z), g.state !== u && f.enqueueReplaceState(g, g.state, null)),
+ u = b.memoizedState, e = null !== b.updateQueue ? Je(a, b, b.updateQueue, g, k, e) : u,
+ !(h !== k || u !== e || X.current || null !== b.updateQueue && b.updateQueue.hasForceUpdate)) return "function" != typeof g.componentDidUpdate || h === a.memoizedProps && u === a.memoizedState || (b.effectTag |= 4),
+ !1;
+ var G = k;
+ if (null === h || null !== b.updateQueue && b.updateQueue.hasForceUpdate) G = !0; else {
+ var I = b.stateNode, L = b.type;
+ G = "function" == typeof I.shouldComponentUpdate ? I.shouldComponentUpdate(G, e, z) : !L.prototype || !L.prototype.isPureReactComponent || (!ea(h, G) || !ea(u, e));
+ }
+ return G ? ("function" == typeof g.componentWillUpdate && g.componentWillUpdate(k, e, z),
+ "function" == typeof g.componentDidUpdate && (b.effectTag |= 4)) : ("function" != typeof g.componentDidUpdate || h === a.memoizedProps && u === a.memoizedState || (b.effectTag |= 4),
+ c(b, k), d(b, e)), g.props = k, g.state = e, g.context = z, G;
+ }
+ };
+ }
+ function Xe(a) {
+ return null === a || void 0 === a ? null : (a = We && a[We] || a["@@iterator"],
+ "function" == typeof a ? a : null);
+ }
+ function Ze(a, b) {
+ var c = b.ref;
+ if (null !== c && "function" != typeof c) {
+ if (b._owner) {
+ b = b._owner;
+ var d = void 0;
+ b && (2 !== b.tag && E("110"), d = b.stateNode), d || E("147", c);
+ var e = "" + c;
+ return null !== a && null !== a.ref && a.ref._stringRef === e ? a.ref : (a = function(a) {
+ var b = d.refs === D ? d.refs = {} : d.refs;
+ null === a ? delete b[e] : b[e] = a;
+ }, a._stringRef = e, a);
+ }
+ "string" != typeof c && E("148"), b._owner || E("149", c);
+ }
+ return c;
+ }
+ function $e(a, b) {
+ "textarea" !== a.type && E("31", "[object Object]" === Object.prototype.toString.call(b) ? "object with keys {" + Object.keys(b).join(", ") + "}" : b, "");
+ }
+ function af(a) {
+ function b(b, c) {
+ if (a) {
+ var d = b.lastEffect;
+ null !== d ? (d.nextEffect = c, b.lastEffect = c) : b.firstEffect = b.lastEffect = c,
+ c.nextEffect = null, c.effectTag = 8;
+ }
+ }
+ function c(c, d) {
+ if (!a) return null;
+ for (;null !== d; ) b(c, d), d = d.sibling;
+ return null;
+ }
+ function d(a, b) {
+ for (a = new Map(); null !== b; ) null !== b.key ? a.set(b.key, b) : a.set(b.index, b),
+ b = b.sibling;
+ return a;
+ }
+ function e(a, b, c) {
+ return a = se(a, b, c), a.index = 0, a.sibling = null, a;
+ }
+ function f(b, c, d) {
+ return b.index = d, a ? null !== (d = b.alternate) ? (d = d.index, d < c ? (b.effectTag = 2,
+ c) : d) : (b.effectTag = 2, c) : c;
+ }
+ function g(b) {
+ return a && null === b.alternate && (b.effectTag = 2), b;
+ }
+ function h(a, b, c, d) {
+ return null === b || 6 !== b.tag ? (b = ve(c, a.internalContextTag, d), b.return = a,
+ b) : (b = e(b, c, d), b.return = a, b);
+ }
+ function k(a, b, c, d) {
+ return null !== b && b.type === c.type ? (d = e(b, c.props, d), d.ref = Ze(b, c),
+ d.return = a, d) : (d = te(c, a.internalContextTag, d), d.ref = Ze(b, c), d.return = a,
+ d);
+ }
+ function q(a, b, c, d) {
+ return null === b || 7 !== b.tag ? (b = we(c, a.internalContextTag, d), b.return = a,
+ b) : (b = e(b, c, d), b.return = a, b);
+ }
+ function v(a, b, c, d) {
+ return null === b || 9 !== b.tag ? (b = xe(c, a.internalContextTag, d), b.type = c.value,
+ b.return = a, b) : (b = e(b, null, d), b.type = c.value, b.return = a, b);
+ }
+ function y(a, b, c, d) {
+ return null === b || 4 !== b.tag || b.stateNode.containerInfo !== c.containerInfo || b.stateNode.implementation !== c.implementation ? (b = ye(c, a.internalContextTag, d),
+ b.return = a, b) : (b = e(b, c.children || [], d), b.return = a, b);
+ }
+ function u(a, b, c, d, f) {
+ return null === b || 10 !== b.tag ? (b = ue(c, a.internalContextTag, d, f), b.return = a,
+ b) : (b = e(b, c, d), b.return = a, b);
+ }
+ function z(a, b, c) {
+ if ("string" == typeof b || "number" == typeof b) return b = ve("" + b, a.internalContextTag, c),
+ b.return = a, b;
+ if ("object" == typeof b && null !== b) {
+ switch (b.$$typeof) {
+ case Re:
+ return b.type === Ve ? (b = ue(b.props.children, a.internalContextTag, c, b.key),
+ b.return = a, b) : (c = te(b, a.internalContextTag, c), c.ref = Ze(null, b), c.return = a,
+ c);
+
+ case Se:
+ return b = we(b, a.internalContextTag, c), b.return = a, b;
+
+ case Te:
+ return c = xe(b, a.internalContextTag, c), c.type = b.value, c.return = a, c;
+
+ case Ue:
+ return b = ye(b, a.internalContextTag, c), b.return = a, b;
+ }
+ if (Ye(b) || Xe(b)) return b = ue(b, a.internalContextTag, c, null), b.return = a,
+ b;
+ $e(a, b);
+ }
+ return null;
+ }
+ function G(a, b, c, d) {
+ var e = null !== b ? b.key : null;
+ if ("string" == typeof c || "number" == typeof c) return null !== e ? null : h(a, b, "" + c, d);
+ if ("object" == typeof c && null !== c) {
+ switch (c.$$typeof) {
+ case Re:
+ return c.key === e ? c.type === Ve ? u(a, b, c.props.children, d, e) : k(a, b, c, d) : null;
+
+ case Se:
+ return c.key === e ? q(a, b, c, d) : null;
+
+ case Te:
+ return null === e ? v(a, b, c, d) : null;
+
+ case Ue:
+ return c.key === e ? y(a, b, c, d) : null;
+ }
+ if (Ye(c) || Xe(c)) return null !== e ? null : u(a, b, c, d, null);
+ $e(a, c);
+ }
+ return null;
+ }
+ function I(a, b, c, d, e) {
+ if ("string" == typeof d || "number" == typeof d) return a = a.get(c) || null, h(b, a, "" + d, e);
+ if ("object" == typeof d && null !== d) {
+ switch (d.$$typeof) {
+ case Re:
+ return a = a.get(null === d.key ? c : d.key) || null, d.type === Ve ? u(b, a, d.props.children, e, d.key) : k(b, a, d, e);
+
+ case Se:
+ return a = a.get(null === d.key ? c : d.key) || null, q(b, a, d, e);
+
+ case Te:
+ return a = a.get(c) || null, v(b, a, d, e);
+
+ case Ue:
+ return a = a.get(null === d.key ? c : d.key) || null, y(b, a, d, e);
+ }
+ if (Ye(d) || Xe(d)) return a = a.get(c) || null, u(b, a, d, e, null);
+ $e(b, d);
+ }
+ return null;
+ }
+ function L(e, g, m, A) {
+ for (var h = null, r = null, n = g, w = g = 0, k = null; null !== n && w < m.length; w++) {
+ n.index > w ? (k = n, n = null) : k = n.sibling;
+ var x = G(e, n, m[w], A);
+ if (null === x) {
+ null === n && (n = k);
+ break;
+ }
+ a && n && null === x.alternate && b(e, n), g = f(x, g, w), null === r ? h = x : r.sibling = x,
+ r = x, n = k;
+ }
+ if (w === m.length) return c(e, n), h;
+ if (null === n) {
+ for (;w < m.length; w++) (n = z(e, m[w], A)) && (g = f(n, g, w), null === r ? h = n : r.sibling = n,
+ r = n);
+ return h;
+ }
+ for (n = d(e, n); w < m.length; w++) (k = I(n, e, w, m[w], A)) && (a && null !== k.alternate && n.delete(null === k.key ? w : k.key),
+ g = f(k, g, w), null === r ? h = k : r.sibling = k, r = k);
+ return a && n.forEach(function(a) {
+ return b(e, a);
+ }), h;
+ }
+ function N(e, g, m, A) {
+ var h = Xe(m);
+ "function" != typeof h && E("150"), null == (m = h.call(m)) && E("151");
+ for (var r = h = null, n = g, w = g = 0, k = null, x = m.next(); null !== n && !x.done; w++,
+ x = m.next()) {
+ n.index > w ? (k = n, n = null) : k = n.sibling;
+ var J = G(e, n, x.value, A);
+ if (null === J) {
+ n || (n = k);
+ break;
+ }
+ a && n && null === J.alternate && b(e, n), g = f(J, g, w), null === r ? h = J : r.sibling = J,
+ r = J, n = k;
+ }
+ if (x.done) return c(e, n), h;
+ if (null === n) {
+ for (;!x.done; w++, x = m.next()) null !== (x = z(e, x.value, A)) && (g = f(x, g, w),
+ null === r ? h = x : r.sibling = x, r = x);
+ return h;
+ }
+ for (n = d(e, n); !x.done; w++, x = m.next()) null !== (x = I(n, e, w, x.value, A)) && (a && null !== x.alternate && n.delete(null === x.key ? w : x.key),
+ g = f(x, g, w), null === r ? h = x : r.sibling = x, r = x);
+ return a && n.forEach(function(a) {
+ return b(e, a);
+ }), h;
+ }
+ return function(a, d, f, h) {
+ "object" == typeof f && null !== f && f.type === Ve && null === f.key && (f = f.props.children);
+ var m = "object" == typeof f && null !== f;
+ if (m) switch (f.$$typeof) {
+ case Re:
+ a: {
+ var r = f.key;
+ for (m = d; null !== m; ) {
+ if (m.key === r) {
+ if (10 === m.tag ? f.type === Ve : m.type === f.type) {
+ c(a, m.sibling), d = e(m, f.type === Ve ? f.props.children : f.props, h), d.ref = Ze(m, f),
+ d.return = a, a = d;
+ break a;
+ }
+ c(a, m);
+ break;
+ }
+ b(a, m), m = m.sibling;
+ }
+ f.type === Ve ? (d = ue(f.props.children, a.internalContextTag, h, f.key), d.return = a,
+ a = d) : (h = te(f, a.internalContextTag, h), h.ref = Ze(d, f), h.return = a, a = h);
+ }
+ return g(a);
+
+ case Se:
+ a: {
+ for (m = f.key; null !== d; ) {
+ if (d.key === m) {
+ if (7 === d.tag) {
+ c(a, d.sibling), d = e(d, f, h), d.return = a, a = d;
+ break a;
+ }
+ c(a, d);
+ break;
+ }
+ b(a, d), d = d.sibling;
+ }
+ d = we(f, a.internalContextTag, h), d.return = a, a = d;
+ }
+ return g(a);
+
+ case Te:
+ a: {
+ if (null !== d) {
+ if (9 === d.tag) {
+ c(a, d.sibling), d = e(d, null, h), d.type = f.value, d.return = a, a = d;
+ break a;
+ }
+ c(a, d);
+ }
+ d = xe(f, a.internalContextTag, h), d.type = f.value, d.return = a, a = d;
+ }
+ return g(a);
+
+ case Ue:
+ a: {
+ for (m = f.key; null !== d; ) {
+ if (d.key === m) {
+ if (4 === d.tag && d.stateNode.containerInfo === f.containerInfo && d.stateNode.implementation === f.implementation) {
+ c(a, d.sibling), d = e(d, f.children || [], h), d.return = a, a = d;
+ break a;
+ }
+ c(a, d);
+ break;
+ }
+ b(a, d), d = d.sibling;
+ }
+ d = ye(f, a.internalContextTag, h), d.return = a, a = d;
+ }
+ return g(a);
+ }
+ if ("string" == typeof f || "number" == typeof f) return f = "" + f, null !== d && 6 === d.tag ? (c(a, d.sibling),
+ d = e(d, f, h)) : (c(a, d), d = ve(f, a.internalContextTag, h)), d.return = a, a = d,
+ g(a);
+ if (Ye(f)) return L(a, d, f, h);
+ if (Xe(f)) return N(a, d, f, h);
+ if (m && $e(a, f), void 0 === f) switch (a.tag) {
+ case 2:
+ case 1:
+ h = a.type, E("152", h.displayName || h.name || "Component");
+ }
+ return c(a, d);
+ };
+ }
+ function df(a, b, c, d, e) {
+ function f(a, b, c) {
+ var d = b.expirationTime;
+ b.child = null === a ? cf(b, null, c, d) : bf(b, a.child, c, d);
+ }
+ function g(a, b) {
+ var c = b.ref;
+ null === c || a && a.ref === c || (b.effectTag |= 128);
+ }
+ function h(a, b, c, d) {
+ if (g(a, b), !c) return d && re(b, !1), q(a, b);
+ c = b.stateNode, id.current = b;
+ var e = c.render();
+ return b.effectTag |= 1, f(a, b, e), b.memoizedState = c.state, b.memoizedProps = c.props,
+ d && re(b, !0), b.child;
+ }
+ function k(a) {
+ var b = a.stateNode;
+ b.pendingContext ? oe(a, b.pendingContext, b.pendingContext !== b.context) : b.context && oe(a, b.context, !1),
+ I(a, b.containerInfo);
+ }
+ function q(a, b) {
+ if (null !== a && b.child !== a.child && E("153"), null !== b.child) {
+ a = b.child;
+ var c = se(a, a.pendingProps, a.expirationTime);
+ for (b.child = c, c.return = b; null !== a.sibling; ) a = a.sibling, c = c.sibling = se(a, a.pendingProps, a.expirationTime),
+ c.return = b;
+ c.sibling = null;
+ }
+ return b.child;
+ }
+ function v(a, b) {
+ switch (b.tag) {
+ case 3:
+ k(b);
+ break;
+
+ case 2:
+ qe(b);
+ break;
+
+ case 4:
+ I(b, b.stateNode.containerInfo);
+ }
+ return null;
+ }
+ var y = a.shouldSetTextContent, u = a.useSyncScheduling, z = a.shouldDeprioritizeSubtree, G = b.pushHostContext, I = b.pushHostContainer, L = c.enterHydrationState, N = c.resetHydrationState, J = c.tryToClaimNextHydratableInstance;
+ a = Le(d, e, function(a, b) {
+ a.memoizedProps = b;
+ }, function(a, b) {
+ a.memoizedState = b;
+ });
+ var w = a.adoptClassInstance, m = a.constructClassInstance, A = a.mountClassInstance, Ob = a.updateClassInstance;
+ return {
+ beginWork: function(a, b, c) {
+ if (0 === b.expirationTime || b.expirationTime > c) return v(a, b);
+ switch (b.tag) {
+ case 0:
+ null !== a && E("155");
+ var d = b.type, e = b.pendingProps, r = ke(b);
+ return r = me(b, r), d = d(e, r), b.effectTag |= 1, "object" == typeof d && null !== d && "function" == typeof d.render ? (b.tag = 2,
+ e = qe(b), w(b, d), A(b, c), b = h(a, b, !0, e)) : (b.tag = 1, f(a, b, d), b.memoizedProps = e,
+ b = b.child), b;
+
+ case 1:
+ a: {
+ if (e = b.type, c = b.pendingProps, d = b.memoizedProps, X.current) null === c && (c = d); else if (null === c || d === c) {
+ b = q(a, b);
+ break a;
+ }
+ d = ke(b), d = me(b, d), e = e(c, d), b.effectTag |= 1, f(a, b, e), b.memoizedProps = c,
+ b = b.child;
+ }
+ return b;
+
+ case 2:
+ return e = qe(b), d = void 0, null === a ? b.stateNode ? E("153") : (m(b, b.pendingProps),
+ A(b, c), d = !0) : d = Ob(a, b, c), h(a, b, d, e);
+
+ case 3:
+ return k(b), e = b.updateQueue, null !== e ? (d = b.memoizedState, e = Je(a, b, e, null, null, c),
+ d === e ? (N(), b = q(a, b)) : (d = e.element, r = b.stateNode, (null === a || null === a.child) && r.hydrate && L(b) ? (b.effectTag |= 2,
+ b.child = cf(b, null, d, c)) : (N(), f(a, b, d)), b.memoizedState = e, b = b.child)) : (N(),
+ b = q(a, b)), b;
+
+ case 5:
+ G(b), null === a && J(b), e = b.type;
+ var n = b.memoizedProps;
+ return d = b.pendingProps, null === d && null === (d = n) && E("154"), r = null !== a ? a.memoizedProps : null,
+ X.current || null !== d && n !== d ? (n = d.children, y(e, d) ? n = null : r && y(e, r) && (b.effectTag |= 16),
+ g(a, b), 2147483647 !== c && !u && z(e, d) ? (b.expirationTime = 2147483647, b = null) : (f(a, b, n),
+ b.memoizedProps = d, b = b.child)) : b = q(a, b), b;
+
+ case 6:
+ return null === a && J(b), a = b.pendingProps, null === a && (a = b.memoizedProps),
+ b.memoizedProps = a, null;
+
+ case 8:
+ b.tag = 7;
+
+ case 7:
+ return e = b.pendingProps, X.current ? null === e && null === (e = a && a.memoizedProps) && E("154") : null !== e && b.memoizedProps !== e || (e = b.memoizedProps),
+ d = e.children, b.stateNode = null === a ? cf(b, b.stateNode, d, c) : bf(b, b.stateNode, d, c),
+ b.memoizedProps = e, b.stateNode;
+
+ case 9:
+ return null;
+
+ case 4:
+ a: {
+ if (I(b, b.stateNode.containerInfo), e = b.pendingProps, X.current) null === e && null == (e = a && a.memoizedProps) && E("154"); else if (null === e || b.memoizedProps === e) {
+ b = q(a, b);
+ break a;
+ }
+ null === a ? b.child = bf(b, null, e, c) : f(a, b, e), b.memoizedProps = e, b = b.child;
+ }
+ return b;
+
+ case 10:
+ a: {
+ if (c = b.pendingProps, X.current) null === c && (c = b.memoizedProps); else if (null === c || b.memoizedProps === c) {
+ b = q(a, b);
+ break a;
+ }
+ f(a, b, c), b.memoizedProps = c, b = b.child;
+ }
+ return b;
+
+ default:
+ E("156");
+ }
+ },
+ beginFailedWork: function(a, b, c) {
+ switch (b.tag) {
+ case 2:
+ qe(b);
+ break;
+
+ case 3:
+ k(b);
+ break;
+
+ default:
+ E("157");
+ }
+ return b.effectTag |= 64, null === a ? b.child = null : b.child !== a.child && (b.child = a.child),
+ 0 === b.expirationTime || b.expirationTime > c ? v(a, b) : (b.firstEffect = null,
+ b.lastEffect = null, b.child = null === a ? cf(b, null, null, c) : bf(b, a.child, null, c),
+ 2 === b.tag && (a = b.stateNode, b.memoizedProps = a.props, b.memoizedState = a.state),
+ b.child);
+ }
+ };
+ }
+ function ef(a, b, c) {
+ function d(a) {
+ a.effectTag |= 4;
+ }
+ var e = a.createInstance, f = a.createTextInstance, g = a.appendInitialChild, h = a.finalizeInitialChildren, k = a.prepareUpdate, q = a.persistence, v = b.getRootHostContainer, y = b.popHostContext, u = b.getHostContext, z = b.popHostContainer, G = c.prepareToHydrateHostInstance, I = c.prepareToHydrateHostTextInstance, L = c.popHydrationState, N = void 0, J = void 0, w = void 0;
+ return a.mutation ? (N = function() {}, J = function(a, b, c) {
+ (b.updateQueue = c) && d(b);
+ }, w = function(a, b, c, e) {
+ c !== e && d(b);
+ }) : E(q ? "235" : "236"), {
+ completeWork: function(a, b, c) {
+ var m = b.pendingProps;
+ switch (null === m ? m = b.memoizedProps : 2147483647 === b.expirationTime && 2147483647 !== c || (b.pendingProps = null),
+ b.tag) {
+ case 1:
+ return null;
+
+ case 2:
+ return ne(b), null;
+
+ case 3:
+ return z(b), V(X, b), V(ie, b), m = b.stateNode, m.pendingContext && (m.context = m.pendingContext,
+ m.pendingContext = null), null !== a && null !== a.child || (L(b), b.effectTag &= -3),
+ N(b), null;
+
+ case 5:
+ y(b), c = v();
+ var A = b.type;
+ if (null !== a && null != b.stateNode) {
+ var p = a.memoizedProps, q = b.stateNode, x = u();
+ q = k(q, A, p, m, c, x), J(a, b, q, A, p, m, c), a.ref !== b.ref && (b.effectTag |= 128);
+ } else {
+ if (!m) return null === b.stateNode && E("166"), null;
+ if (a = u(), L(b)) G(b, c, a) && d(b); else {
+ a = e(A, m, c, a, b);
+ a: for (p = b.child; null !== p; ) {
+ if (5 === p.tag || 6 === p.tag) g(a, p.stateNode); else if (4 !== p.tag && null !== p.child) {
+ p.child.return = p, p = p.child;
+ continue;
+ }
+ if (p === b) break;
+ for (;null === p.sibling; ) {
+ if (null === p.return || p.return === b) break a;
+ p = p.return;
+ }
+ p.sibling.return = p.return, p = p.sibling;
+ }
+ h(a, A, m, c) && d(b), b.stateNode = a;
+ }
+ null !== b.ref && (b.effectTag |= 128);
+ }
+ return null;
+
+ case 6:
+ if (a && null != b.stateNode) w(a, b, a.memoizedProps, m); else {
+ if ("string" != typeof m) return null === b.stateNode && E("166"), null;
+ a = v(), c = u(), L(b) ? I(b) && d(b) : b.stateNode = f(m, a, c, b);
+ }
+ return null;
+
+ case 7:
+ (m = b.memoizedProps) || E("165"), b.tag = 8, A = [];
+ a: for ((p = b.stateNode) && (p.return = b); null !== p; ) {
+ if (5 === p.tag || 6 === p.tag || 4 === p.tag) E("247"); else if (9 === p.tag) A.push(p.type); else if (null !== p.child) {
+ p.child.return = p, p = p.child;
+ continue;
+ }
+ for (;null === p.sibling; ) {
+ if (null === p.return || p.return === b) break a;
+ p = p.return;
+ }
+ p.sibling.return = p.return, p = p.sibling;
+ }
+ return p = m.handler, m = p(m.props, A), b.child = bf(b, null !== a ? a.child : null, m, c),
+ b.child;
+
+ case 8:
+ return b.tag = 7, null;
+
+ case 9:
+ case 10:
+ return null;
+
+ case 4:
+ return z(b), N(b), null;
+
+ case 0:
+ E("167");
+
+ default:
+ E("156");
+ }
+ }
+ };
+ }
+ function ff(a, b) {
+ function c(a) {
+ var c = a.ref;
+ if (null !== c) try {
+ c(null);
+ } catch (A) {
+ b(a, A);
+ }
+ }
+ function d(a) {
+ switch ("function" == typeof Ee && Ee(a), a.tag) {
+ case 2:
+ c(a);
+ var d = a.stateNode;
+ if ("function" == typeof d.componentWillUnmount) try {
+ d.props = a.memoizedProps, d.state = a.memoizedState, d.componentWillUnmount();
+ } catch (A) {
+ b(a, A);
+ }
+ break;
+
+ case 5:
+ c(a);
+ break;
+
+ case 7:
+ e(a.stateNode);
+ break;
+
+ case 4:
+ k && g(a);
+ }
+ }
+ function e(a) {
+ for (var b = a; ;) if (d(b), null === b.child || k && 4 === b.tag) {
+ if (b === a) break;
+ for (;null === b.sibling; ) {
+ if (null === b.return || b.return === a) return;
+ b = b.return;
+ }
+ b.sibling.return = b.return, b = b.sibling;
+ } else b.child.return = b, b = b.child;
+ }
+ function f(a) {
+ return 5 === a.tag || 3 === a.tag || 4 === a.tag;
+ }
+ function g(a) {
+ for (var b = a, c = !1, f = void 0, g = void 0; ;) {
+ if (!c) {
+ c = b.return;
+ a: for (;;) {
+ switch (null === c && E("160"), c.tag) {
+ case 5:
+ f = c.stateNode, g = !1;
+ break a;
+
+ case 3:
+ case 4:
+ f = c.stateNode.containerInfo, g = !0;
+ break a;
+ }
+ c = c.return;
+ }
+ c = !0;
+ }
+ if (5 === b.tag || 6 === b.tag) e(b), g ? J(f, b.stateNode) : N(f, b.stateNode); else if (4 === b.tag ? f = b.stateNode.containerInfo : d(b),
+ null !== b.child) {
+ b.child.return = b, b = b.child;
+ continue;
+ }
+ if (b === a) break;
+ for (;null === b.sibling; ) {
+ if (null === b.return || b.return === a) return;
+ b = b.return, 4 === b.tag && (c = !1);
+ }
+ b.sibling.return = b.return, b = b.sibling;
+ }
+ }
+ var h = a.getPublicInstance, k = a.mutation;
+ a = a.persistence, k || E(a ? "235" : "236");
+ var q = k.commitMount, v = k.commitUpdate, y = k.resetTextContent, u = k.commitTextUpdate, z = k.appendChild, G = k.appendChildToContainer, I = k.insertBefore, L = k.insertInContainerBefore, N = k.removeChild, J = k.removeChildFromContainer;
+ return {
+ commitResetTextContent: function(a) {
+ y(a.stateNode);
+ },
+ commitPlacement: function(a) {
+ a: {
+ for (var b = a.return; null !== b; ) {
+ if (f(b)) {
+ var c = b;
+ break a;
+ }
+ b = b.return;
+ }
+ E("160"), c = void 0;
+ }
+ var d = b = void 0;
+ switch (c.tag) {
+ case 5:
+ b = c.stateNode, d = !1;
+ break;
+
+ case 3:
+ case 4:
+ b = c.stateNode.containerInfo, d = !0;
+ break;
+
+ default:
+ E("161");
+ }
+ 16 & c.effectTag && (y(b), c.effectTag &= -17);
+ a: b: for (c = a; ;) {
+ for (;null === c.sibling; ) {
+ if (null === c.return || f(c.return)) {
+ c = null;
+ break a;
+ }
+ c = c.return;
+ }
+ for (c.sibling.return = c.return, c = c.sibling; 5 !== c.tag && 6 !== c.tag; ) {
+ if (2 & c.effectTag) continue b;
+ if (null === c.child || 4 === c.tag) continue b;
+ c.child.return = c, c = c.child;
+ }
+ if (!(2 & c.effectTag)) {
+ c = c.stateNode;
+ break a;
+ }
+ }
+ for (var e = a; ;) {
+ if (5 === e.tag || 6 === e.tag) c ? d ? L(b, e.stateNode, c) : I(b, e.stateNode, c) : d ? G(b, e.stateNode) : z(b, e.stateNode); else if (4 !== e.tag && null !== e.child) {
+ e.child.return = e, e = e.child;
+ continue;
+ }
+ if (e === a) break;
+ for (;null === e.sibling; ) {
+ if (null === e.return || e.return === a) return;
+ e = e.return;
+ }
+ e.sibling.return = e.return, e = e.sibling;
+ }
+ },
+ commitDeletion: function(a) {
+ g(a), a.return = null, a.child = null, a.alternate && (a.alternate.child = null,
+ a.alternate.return = null);
+ },
+ commitWork: function(a, b) {
+ switch (b.tag) {
+ case 2:
+ break;
+
+ case 5:
+ var c = b.stateNode;
+ if (null != c) {
+ var d = b.memoizedProps;
+ a = null !== a ? a.memoizedProps : d;
+ var e = b.type, f = b.updateQueue;
+ b.updateQueue = null, null !== f && v(c, f, e, a, d, b);
+ }
+ break;
+
+ case 6:
+ null === b.stateNode && E("162"), c = b.memoizedProps, u(b.stateNode, null !== a ? a.memoizedProps : c, c);
+ break;
+
+ case 3:
+ break;
+
+ default:
+ E("163");
+ }
+ },
+ commitLifeCycles: function(a, b) {
+ switch (b.tag) {
+ case 2:
+ var c = b.stateNode;
+ if (4 & b.effectTag) if (null === a) c.props = b.memoizedProps, c.state = b.memoizedState,
+ c.componentDidMount(); else {
+ var d = a.memoizedProps;
+ a = a.memoizedState, c.props = b.memoizedProps, c.state = b.memoizedState, c.componentDidUpdate(d, a);
+ }
+ b = b.updateQueue, null !== b && Ke(b, c);
+ break;
+
+ case 3:
+ c = b.updateQueue, null !== c && Ke(c, null !== b.child ? b.child.stateNode : null);
+ break;
+
+ case 5:
+ c = b.stateNode, null === a && 4 & b.effectTag && q(c, b.type, b.memoizedProps, b);
+ break;
+
+ case 6:
+ case 4:
+ break;
+
+ default:
+ E("163");
+ }
+ },
+ commitAttachRef: function(a) {
+ var b = a.ref;
+ if (null !== b) {
+ var c = a.stateNode;
+ switch (a.tag) {
+ case 5:
+ b(h(c));
+ break;
+
+ default:
+ b(c);
+ }
+ }
+ },
+ commitDetachRef: function(a) {
+ null !== (a = a.ref) && a(null);
+ }
+ };
+ }
+ function hf(a) {
+ function b(a) {
+ return a === gf && E("174"), a;
+ }
+ var c = a.getChildHostContext, d = a.getRootHostContext, e = {
+ current: gf
+ }, f = {
+ current: gf
+ }, g = {
+ current: gf
+ };
+ return {
+ getHostContext: function() {
+ return b(e.current);
+ },
+ getRootHostContainer: function() {
+ return b(g.current);
+ },
+ popHostContainer: function(a) {
+ V(e, a), V(f, a), V(g, a);
+ },
+ popHostContext: function(a) {
+ f.current === a && (V(e, a), V(f, a));
+ },
+ pushHostContainer: function(a, b) {
+ W(g, b, a), b = d(b), W(f, a, a), W(e, b, a);
+ },
+ pushHostContext: function(a) {
+ var d = b(g.current), h = b(e.current);
+ d = c(h, a.type, d), h !== d && (W(f, a, a), W(e, d, a));
+ },
+ resetHostContainer: function() {
+ e.current = gf, g.current = gf;
+ }
+ };
+ }
+ function jf(a) {
+ function b(a, b) {
+ var c = new Y(5, null, 0);
+ c.type = "DELETED", c.stateNode = b, c.return = a, c.effectTag = 8, null !== a.lastEffect ? (a.lastEffect.nextEffect = c,
+ a.lastEffect = c) : a.firstEffect = a.lastEffect = c;
+ }
+ function c(a, b) {
+ switch (a.tag) {
+ case 5:
+ return null !== (b = f(b, a.type, a.pendingProps)) && (a.stateNode = b, !0);
+
+ case 6:
+ return null !== (b = g(b, a.pendingProps)) && (a.stateNode = b, !0);
+
+ default:
+ return !1;
+ }
+ }
+ function d(a) {
+ for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag; ) a = a.return;
+ y = a;
+ }
+ var e = a.shouldSetTextContent;
+ if (!(a = a.hydration)) return {
+ enterHydrationState: function() {
+ return !1;
+ },
+ resetHydrationState: function() {},
+ tryToClaimNextHydratableInstance: function() {},
+ prepareToHydrateHostInstance: function() {
+ E("175");
+ },
+ prepareToHydrateHostTextInstance: function() {
+ E("176");
+ },
+ popHydrationState: function() {
+ return !1;
+ }
+ };
+ var f = a.canHydrateInstance, g = a.canHydrateTextInstance, h = a.getNextHydratableSibling, k = a.getFirstHydratableChild, q = a.hydrateInstance, v = a.hydrateTextInstance, y = null, u = null, z = !1;
+ return {
+ enterHydrationState: function(a) {
+ return u = k(a.stateNode.containerInfo), y = a, z = !0;
+ },
+ resetHydrationState: function() {
+ u = y = null, z = !1;
+ },
+ tryToClaimNextHydratableInstance: function(a) {
+ if (z) {
+ var d = u;
+ if (d) {
+ if (!c(a, d)) {
+ if (!(d = h(d)) || !c(a, d)) return a.effectTag |= 2, z = !1, void (y = a);
+ b(y, u);
+ }
+ y = a, u = k(d);
+ } else a.effectTag |= 2, z = !1, y = a;
+ }
+ },
+ prepareToHydrateHostInstance: function(a, b, c) {
+ return b = q(a.stateNode, a.type, a.memoizedProps, b, c, a), a.updateQueue = b,
+ null !== b;
+ },
+ prepareToHydrateHostTextInstance: function(a) {
+ return v(a.stateNode, a.memoizedProps, a);
+ },
+ popHydrationState: function(a) {
+ if (a !== y) return !1;
+ if (!z) return d(a), z = !0, !1;
+ var c = a.type;
+ if (5 !== a.tag || "head" !== c && "body" !== c && !e(c, a.memoizedProps)) for (c = u; c; ) b(a, c),
+ c = h(c);
+ return d(a), u = y ? h(a.stateNode) : null, !0;
+ }
+ };
+ }
+ function kf(a) {
+ function b(a) {
+ Qb = ja = !0;
+ var b = a.stateNode;
+ if (b.current === a && E("177"), b.isReadyForCommit = !1, id.current = null, 1 < a.effectTag) if (null !== a.lastEffect) {
+ a.lastEffect.nextEffect = a;
+ var c = a.firstEffect;
+ } else c = a; else c = a.firstEffect;
+ for (yg(), t = c; null !== t; ) {
+ var d = !1, e = void 0;
+ try {
+ for (;null !== t; ) {
+ var f = t.effectTag;
+ if (16 & f && zg(t), 128 & f) {
+ var g = t.alternate;
+ null !== g && Ag(g);
+ }
+ switch (-242 & f) {
+ case 2:
+ Ne(t), t.effectTag &= -3;
+ break;
+
+ case 6:
+ Ne(t), t.effectTag &= -3, Oe(t.alternate, t);
+ break;
+
+ case 4:
+ Oe(t.alternate, t);
+ break;
+
+ case 8:
+ Sc = !0, Bg(t), Sc = !1;
+ }
+ t = t.nextEffect;
+ }
+ } catch (Tc) {
+ d = !0, e = Tc;
+ }
+ d && (null === t && E("178"), h(t, e), null !== t && (t = t.nextEffect));
+ }
+ for (Cg(), b.current = a, t = c; null !== t; ) {
+ c = !1, d = void 0;
+ try {
+ for (;null !== t; ) {
+ var k = t.effectTag;
+ if (36 & k && Dg(t.alternate, t), 128 & k && Eg(t), 64 & k) switch (e = t, f = void 0,
+ null !== R && (f = R.get(e), R.delete(e), null == f && null !== e.alternate && (e = e.alternate,
+ f = R.get(e), R.delete(e))), null == f && E("184"), e.tag) {
+ case 2:
+ e.stateNode.componentDidCatch(f.error, {
+ componentStack: f.componentStack
+ });
+ break;
+
+ case 3:
+ null === ca && (ca = f.error);
+ break;
+
+ default:
+ E("157");
+ }
+ var Qc = t.nextEffect;
+ t.nextEffect = null, t = Qc;
+ }
+ } catch (Tc) {
+ c = !0, d = Tc;
+ }
+ c && (null === t && E("178"), h(t, d), null !== t && (t = t.nextEffect));
+ }
+ return ja = Qb = !1, "function" == typeof De && De(a.stateNode), ha && (ha.forEach(G),
+ ha = null), null !== ca && (a = ca, ca = null, Ob(a)), b = b.current.expirationTime,
+ 0 === b && (qa = R = null), b;
+ }
+ function c(a) {
+ for (;;) {
+ var b = Fg(a.alternate, a, H), c = a.return, d = a.sibling, e = a;
+ if (2147483647 === H || 2147483647 !== e.expirationTime) {
+ if (2 !== e.tag && 3 !== e.tag) var f = 0; else f = e.updateQueue, f = null === f ? 0 : f.expirationTime;
+ for (var g = e.child; null !== g; ) 0 !== g.expirationTime && (0 === f || f > g.expirationTime) && (f = g.expirationTime),
+ g = g.sibling;
+ e.expirationTime = f;
+ }
+ if (null !== b) return b;
+ if (null !== c && (null === c.firstEffect && (c.firstEffect = a.firstEffect), null !== a.lastEffect && (null !== c.lastEffect && (c.lastEffect.nextEffect = a.firstEffect),
+ c.lastEffect = a.lastEffect), 1 < a.effectTag && (null !== c.lastEffect ? c.lastEffect.nextEffect = a : c.firstEffect = a,
+ c.lastEffect = a)), null !== d) return d;
+ if (null === c) {
+ a.stateNode.isReadyForCommit = !0;
+ break;
+ }
+ a = c;
+ }
+ return null;
+ }
+ function d(a) {
+ var b = rg(a.alternate, a, H);
+ return null === b && (b = c(a)), id.current = null, b;
+ }
+ function e(a) {
+ var b = Gg(a.alternate, a, H);
+ return null === b && (b = c(a)), id.current = null, b;
+ }
+ function f(a) {
+ if (null !== R) {
+ if (!(0 === H || H > a)) if (H <= Uc) for (;null !== F; ) F = k(F) ? e(F) : d(F); else for (;null !== F && !A(); ) F = k(F) ? e(F) : d(F);
+ } else if (!(0 === H || H > a)) if (H <= Uc) for (;null !== F; ) F = d(F); else for (;null !== F && !A(); ) F = d(F);
+ }
+ function g(a, b) {
+ if (ja && E("243"), ja = !0, a.isReadyForCommit = !1, a !== ra || b !== H || null === F) {
+ for (;-1 < he; ) ge[he] = null, he--;
+ je = D, ie.current = D, X.current = !1, x(), ra = a, H = b, F = se(ra.current, null, b);
+ }
+ var c = !1, d = null;
+ try {
+ f(b);
+ } catch (Rc) {
+ c = !0, d = Rc;
+ }
+ for (;c; ) {
+ if (eb) {
+ ca = d;
+ break;
+ }
+ var g = F;
+ if (null === g) eb = !0; else {
+ var k = h(g, d);
+ if (null === k && E("183"), !eb) {
+ try {
+ for (c = k, d = b, k = c; null !== g; ) {
+ switch (g.tag) {
+ case 2:
+ ne(g);
+ break;
+
+ case 5:
+ qg(g);
+ break;
+
+ case 3:
+ p(g);
+ break;
+
+ case 4:
+ p(g);
+ }
+ if (g === k || g.alternate === k) break;
+ g = g.return;
+ }
+ F = e(c), f(d);
+ } catch (Rc) {
+ c = !0, d = Rc;
+ continue;
+ }
+ break;
+ }
+ }
+ }
+ return b = ca, eb = ja = !1, ca = null, null !== b && Ob(b), a.isReadyForCommit ? a.current.alternate : null;
+ }
+ function h(a, b) {
+ var c = id.current = null, d = !1, e = !1, f = null;
+ if (3 === a.tag) c = a, q(a) && (eb = !0); else for (var g = a.return; null !== g && null === c; ) {
+ if (2 === g.tag ? "function" == typeof g.stateNode.componentDidCatch && (d = !0,
+ f = jd(g), c = g, e = !0) : 3 === g.tag && (c = g), q(g)) {
+ if (Sc || null !== ha && (ha.has(g) || null !== g.alternate && ha.has(g.alternate))) return null;
+ c = null, e = !1;
+ }
+ g = g.return;
+ }
+ if (null !== c) {
+ null === qa && (qa = new Set()), qa.add(c);
+ var h = "";
+ g = a;
+ do {
+ a: switch (g.tag) {
+ case 0:
+ case 1:
+ case 2:
+ case 5:
+ var k = g._debugOwner, Qc = g._debugSource, m = jd(g), n = null;
+ k && (n = jd(k)), k = Qc, m = "\n in " + (m || "Unknown") + (k ? " (at " + k.fileName.replace(/^.*[\\\/]/, "") + ":" + k.lineNumber + ")" : n ? " (created by " + n + ")" : "");
+ break a;
+
+ default:
+ m = "";
+ }
+ h += m, g = g.return;
+ } while (g);
+ g = h, a = jd(a), null === R && (R = new Map()), b = {
+ componentName: a,
+ componentStack: g,
+ error: b,
+ errorBoundary: d ? c.stateNode : null,
+ errorBoundaryFound: d,
+ errorBoundaryName: f,
+ willRetry: e
+ }, R.set(c, b);
+ try {
+ var p = b.error;
+ p && p.suppressReactErrorLogging || console.error(p);
+ } catch (Vc) {
+ Vc && Vc.suppressReactErrorLogging || console.error(Vc);
+ }
+ return Qb ? (null === ha && (ha = new Set()), ha.add(c)) : G(c), c;
+ }
+ return null === ca && (ca = b), null;
+ }
+ function k(a) {
+ return null !== R && (R.has(a) || null !== a.alternate && R.has(a.alternate));
+ }
+ function q(a) {
+ return null !== qa && (qa.has(a) || null !== a.alternate && qa.has(a.alternate));
+ }
+ function v() {
+ return 20 * (1 + ((I() + 100) / 20 | 0));
+ }
+ function y(a) {
+ return 0 !== ka ? ka : ja ? Qb ? 1 : H : !Hg || 1 & a.internalContextTag ? v() : 1;
+ }
+ function u(a, b) {
+ return z(a, b, !1);
+ }
+ function z(a, b) {
+ for (;null !== a; ) {
+ if ((0 === a.expirationTime || a.expirationTime > b) && (a.expirationTime = b),
+ null !== a.alternate && (0 === a.alternate.expirationTime || a.alternate.expirationTime > b) && (a.alternate.expirationTime = b),
+ null === a.return) {
+ if (3 !== a.tag) break;
+ var c = a.stateNode;
+ !ja && c === ra && b < H && (F = ra = null, H = 0);
+ var d = c, e = b;
+ if (Rb > Ig && E("185"), null === d.nextScheduledRoot) d.remainingExpirationTime = e,
+ null === O ? (sa = O = d, d.nextScheduledRoot = d) : (O = O.nextScheduledRoot = d,
+ O.nextScheduledRoot = sa); else {
+ var f = d.remainingExpirationTime;
+ (0 === f || e < f) && (d.remainingExpirationTime = e);
+ }
+ Fa || (la ? Sb && (ma = d, na = 1, m(ma, na)) : 1 === e ? w(1, null) : L(e)), !ja && c === ra && b < H && (F = ra = null,
+ H = 0);
+ }
+ a = a.return;
+ }
+ }
+ function G(a) {
+ z(a, 1, !0);
+ }
+ function I() {
+ return Uc = 2 + ((Wc() - Pe) / 10 | 0);
+ }
+ function L(a) {
+ if (0 !== Tb) {
+ if (a > Tb) return;
+ Jg(Xc);
+ }
+ var b = Wc() - Pe;
+ Tb = a, Xc = Kg(J, {
+ timeout: 10 * (a - 2) - b
+ });
+ }
+ function N() {
+ var a = 0, b = null;
+ if (null !== O) for (var c = O, d = sa; null !== d; ) {
+ var e = d.remainingExpirationTime;
+ if (0 === e) {
+ if ((null === c || null === O) && E("244"), d === d.nextScheduledRoot) {
+ sa = O = d.nextScheduledRoot = null;
+ break;
+ }
+ if (d === sa) sa = e = d.nextScheduledRoot, O.nextScheduledRoot = e, d.nextScheduledRoot = null; else {
+ if (d === O) {
+ O = c, O.nextScheduledRoot = sa, d.nextScheduledRoot = null;
+ break;
+ }
+ c.nextScheduledRoot = d.nextScheduledRoot, d.nextScheduledRoot = null;
+ }
+ d = c.nextScheduledRoot;
+ } else {
+ if ((0 === a || e < a) && (a = e, b = d), d === O) break;
+ c = d, d = d.nextScheduledRoot;
+ }
+ }
+ c = ma, null !== c && c === b ? Rb++ : Rb = 0, ma = b, na = a;
+ }
+ function J(a) {
+ w(0, a);
+ }
+ function w(a, b) {
+ for (fb = b, N(); null !== ma && 0 !== na && (0 === a || na <= a) && !Yc; ) m(ma, na),
+ N();
+ if (null !== fb && (Tb = 0, Xc = -1), 0 !== na && L(na), fb = null, Yc = !1, Rb = 0,
+ Ub) throw a = Zc, Zc = null, Ub = !1, a;
+ }
+ function m(a, c) {
+ if (Fa && E("245"), Fa = !0, c <= I()) {
+ var d = a.finishedWork;
+ null !== d ? (a.finishedWork = null, a.remainingExpirationTime = b(d)) : (a.finishedWork = null,
+ null !== (d = g(a, c)) && (a.remainingExpirationTime = b(d)));
+ } else d = a.finishedWork, null !== d ? (a.finishedWork = null, a.remainingExpirationTime = b(d)) : (a.finishedWork = null,
+ null !== (d = g(a, c)) && (A() ? a.finishedWork = d : a.remainingExpirationTime = b(d)));
+ Fa = !1;
+ }
+ function A() {
+ return !(null === fb || fb.timeRemaining() > Lg) && (Yc = !0);
+ }
+ function Ob(a) {
+ null === ma && E("246"), ma.remainingExpirationTime = 0, Ub || (Ub = !0, Zc = a);
+ }
+ var r = hf(a), n = jf(a), p = r.popHostContainer, qg = r.popHostContext, x = r.resetHostContainer, Me = df(a, r, n, u, y), rg = Me.beginWork, Gg = Me.beginFailedWork, Fg = ef(a, r, n).completeWork;
+ r = ff(a, h);
+ var zg = r.commitResetTextContent, Ne = r.commitPlacement, Bg = r.commitDeletion, Oe = r.commitWork, Dg = r.commitLifeCycles, Eg = r.commitAttachRef, Ag = r.commitDetachRef, Wc = a.now, Kg = a.scheduleDeferredCallback, Jg = a.cancelDeferredCallback, Hg = a.useSyncScheduling, yg = a.prepareForCommit, Cg = a.resetAfterCommit, Pe = Wc(), Uc = 2, ka = 0, ja = !1, F = null, ra = null, H = 0, t = null, R = null, qa = null, ha = null, ca = null, eb = !1, Qb = !1, Sc = !1, sa = null, O = null, Tb = 0, Xc = -1, Fa = !1, ma = null, na = 0, Yc = !1, Ub = !1, Zc = null, fb = null, la = !1, Sb = !1, Ig = 1e3, Rb = 0, Lg = 1;
+ return {
+ computeAsyncExpiration: v,
+ computeExpirationForFiber: y,
+ scheduleWork: u,
+ batchedUpdates: function(a, b) {
+ var c = la;
+ la = !0;
+ try {
+ return a(b);
+ } finally {
+ (la = c) || Fa || w(1, null);
+ }
+ },
+ unbatchedUpdates: function(a) {
+ if (la && !Sb) {
+ Sb = !0;
+ try {
+ return a();
+ } finally {
+ Sb = !1;
+ }
+ }
+ return a();
+ },
+ flushSync: function(a) {
+ var b = la;
+ la = !0;
+ try {
+ a: {
+ var c = ka;
+ ka = 1;
+ try {
+ var d = a();
+ break a;
+ } finally {
+ ka = c;
+ }
+ d = void 0;
+ }
+ return d;
+ } finally {
+ la = b, Fa && E("187"), w(1, null);
+ }
+ },
+ deferredUpdates: function(a) {
+ var b = ka;
+ ka = v();
+ try {
+ return a();
+ } finally {
+ ka = b;
+ }
+ }
+ };
+ }
+ function lf(a) {
+ function b(a) {
+ return a = od(a), null === a ? null : a.stateNode;
+ }
+ var c = a.getPublicInstance;
+ a = kf(a);
+ var d = a.computeAsyncExpiration, e = a.computeExpirationForFiber, f = a.scheduleWork;
+ return {
+ createContainer: function(a, b) {
+ var c = new Y(3, null, 0);
+ return a = {
+ current: c,
+ containerInfo: a,
+ pendingChildren: null,
+ remainingExpirationTime: 0,
+ isReadyForCommit: !1,
+ finishedWork: null,
+ context: null,
+ pendingContext: null,
+ hydrate: b,
+ nextScheduledRoot: null
+ }, c.stateNode = a;
+ },
+ updateContainer: function(a, b, c, q) {
+ var g = b.current;
+ if (c) {
+ c = c._reactInternalFiber;
+ var h;
+ b: {
+ for (2 === kd(c) && 2 === c.tag || E("170"), h = c; 3 !== h.tag; ) {
+ if (le(h)) {
+ h = h.stateNode.__reactInternalMemoizedMergedChildContext;
+ break b;
+ }
+ (h = h.return) || E("171");
+ }
+ h = h.stateNode.context;
+ }
+ c = le(c) ? pe(c, h) : h;
+ } else c = D;
+ null === b.context ? b.context = c : b.pendingContext = c, b = q, b = void 0 === b ? null : b,
+ q = null != a && null != a.type && null != a.type.prototype && !0 === a.type.prototype.unstable_isAsyncReactComponent ? d() : e(g),
+ He(g, {
+ expirationTime: q,
+ partialState: {
+ element: a
+ },
+ callback: b,
+ isReplace: !1,
+ isForced: !1,
+ nextCallback: null,
+ next: null
+ }), f(g, q);
+ },
+ batchedUpdates: a.batchedUpdates,
+ unbatchedUpdates: a.unbatchedUpdates,
+ deferredUpdates: a.deferredUpdates,
+ flushSync: a.flushSync,
+ getPublicRootInstance: function(a) {
+ if (a = a.current, !a.child) return null;
+ switch (a.child.tag) {
+ case 5:
+ return c(a.child.stateNode);
+
+ default:
+ return a.child.stateNode;
+ }
+ },
+ findHostInstance: b,
+ findHostInstanceWithNoPortals: function(a) {
+ return a = pd(a), null === a ? null : a.stateNode;
+ },
+ injectIntoDevTools: function(a) {
+ var c = a.findFiberByHostInstance;
+ return Ce(B({}, a, {
+ findHostInstanceByFiber: function(a) {
+ return b(a);
+ },
+ findFiberByHostInstance: function(a) {
+ return c ? c(a) : null;
+ }
+ }));
+ }
+ };
+ }
+ function pf(a, b, c) {
+ var d = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;
+ return {
+ $$typeof: Ue,
+ key: null == d ? null : "" + d,
+ children: a,
+ containerInfo: b,
+ implementation: c
+ };
+ }
+ function Hf(a) {
+ return !!Gf.hasOwnProperty(a) || !Ff.hasOwnProperty(a) && (Ef.test(a) ? Gf[a] = !0 : (Ff[a] = !0,
+ !1));
+ }
+ function If(a, b, c) {
+ var d = wa(b);
+ if (d && va(b, c)) {
+ var e = d.mutationMethod;
+ e ? e(a, c) : null == c || d.hasBooleanValue && !c || d.hasNumericValue && isNaN(c) || d.hasPositiveNumericValue && 1 > c || d.hasOverloadedBooleanValue && !1 === c ? Jf(a, b) : d.mustUseProperty ? a[d.propertyName] = c : (b = d.attributeName,
+ (e = d.attributeNamespace) ? a.setAttributeNS(e, b, "" + c) : d.hasBooleanValue || d.hasOverloadedBooleanValue && !0 === c ? a.setAttribute(b, "") : a.setAttribute(b, "" + c));
+ } else Kf(a, b, va(b, c) ? c : null);
+ }
+ function Kf(a, b, c) {
+ Hf(b) && (null == c ? a.removeAttribute(b) : a.setAttribute(b, "" + c));
+ }
+ function Jf(a, b) {
+ var c = wa(b);
+ c ? (b = c.mutationMethod) ? b(a, void 0) : c.mustUseProperty ? a[c.propertyName] = !c.hasBooleanValue && "" : a.removeAttribute(c.attributeName) : a.removeAttribute(b);
+ }
+ function Lf(a, b) {
+ var c = b.value, d = b.checked;
+ return B({
+ type: void 0,
+ step: void 0,
+ min: void 0,
+ max: void 0
+ }, b, {
+ defaultChecked: void 0,
+ defaultValue: void 0,
+ value: null != c ? c : a._wrapperState.initialValue,
+ checked: null != d ? d : a._wrapperState.initialChecked
+ });
+ }
+ function Mf(a, b) {
+ var c = b.defaultValue;
+ a._wrapperState = {
+ initialChecked: null != b.checked ? b.checked : b.defaultChecked,
+ initialValue: null != b.value ? b.value : c,
+ controlled: "checkbox" === b.type || "radio" === b.type ? null != b.checked : null != b.value
+ };
+ }
+ function Nf(a, b) {
+ null != (b = b.checked) && If(a, "checked", b);
+ }
+ function Of(a, b) {
+ Nf(a, b);
+ var c = b.value;
+ null != c ? 0 === c && "" === a.value ? a.value = "0" : "number" === b.type ? (b = parseFloat(a.value) || 0,
+ (c != b || c == b && a.value != c) && (a.value = "" + c)) : a.value !== "" + c && (a.value = "" + c) : (null == b.value && null != b.defaultValue && a.defaultValue !== "" + b.defaultValue && (a.defaultValue = "" + b.defaultValue),
+ null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked));
+ }
+ function Pf(a, b) {
+ switch (b.type) {
+ case "submit":
+ case "reset":
+ break;
+
+ case "color":
+ case "date":
+ case "datetime":
+ case "datetime-local":
+ case "month":
+ case "time":
+ case "week":
+ a.value = "", a.value = a.defaultValue;
+ break;
+
+ default:
+ a.value = a.value;
+ }
+ b = a.name, "" !== b && (a.name = ""), a.defaultChecked = !a.defaultChecked, a.defaultChecked = !a.defaultChecked,
+ "" !== b && (a.name = b);
+ }
+ function Qf(a) {
+ var b = "";
+ return aa.Children.forEach(a, function(a) {
+ null == a || "string" != typeof a && "number" != typeof a || (b += a);
+ }), b;
+ }
+ function Rf(a, b) {
+ return a = B({
+ children: void 0
+ }, b), (b = Qf(b.children)) && (a.children = b), a;
+ }
+ function Sf(a, b, c, d) {
+ if (a = a.options, b) {
+ b = {};
+ for (var e = 0; e < c.length; e++) b["$" + c[e]] = !0;
+ for (c = 0; c < a.length; c++) e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e),
+ e && d && (a[c].defaultSelected = !0);
+ } else {
+ for (c = "" + c, b = null, e = 0; e < a.length; e++) {
+ if (a[e].value === c) return a[e].selected = !0, void (d && (a[e].defaultSelected = !0));
+ null !== b || a[e].disabled || (b = a[e]);
+ }
+ null !== b && (b.selected = !0);
+ }
+ }
+ function Tf(a, b) {
+ var c = b.value;
+ a._wrapperState = {
+ initialValue: null != c ? c : b.defaultValue,
+ wasMultiple: !!b.multiple
+ };
+ }
+ function Uf(a, b) {
+ return null != b.dangerouslySetInnerHTML && E("91"), B({}, b, {
+ value: void 0,
+ defaultValue: void 0,
+ children: "" + a._wrapperState.initialValue
+ });
+ }
+ function Vf(a, b) {
+ var c = b.value;
+ null == c && (c = b.defaultValue, b = b.children, null != b && (null != c && E("92"),
+ Array.isArray(b) && (1 >= b.length || E("93"), b = b[0]), c = "" + b), null == c && (c = "")),
+ a._wrapperState = {
+ initialValue: "" + c
+ };
+ }
+ function Wf(a, b) {
+ var c = b.value;
+ null != c && (c = "" + c, c !== a.value && (a.value = c), null == b.defaultValue && (a.defaultValue = c)),
+ null != b.defaultValue && (a.defaultValue = b.defaultValue);
+ }
+ function Xf(a) {
+ var b = a.textContent;
+ b === a._wrapperState.initialValue && (a.value = b);
+ }
+ function Zf(a) {
+ switch (a) {
+ case "svg":
+ return "http://www.w3.org/2000/svg";
+
+ case "math":
+ return "http://www.w3.org/1998/Math/MathML";
+
+ default:
+ return "http://www.w3.org/1999/xhtml";
+ }
+ }
+ function $f(a, b) {
+ return null == a || "http://www.w3.org/1999/xhtml" === a ? Zf(b) : "http://www.w3.org/2000/svg" === a && "foreignObject" === b ? "http://www.w3.org/1999/xhtml" : a;
+ }
+ function cg(a, b) {
+ if (b) {
+ var c = a.firstChild;
+ if (c && c === a.lastChild && 3 === c.nodeType) return void (c.nodeValue = b);
+ }
+ a.textContent = b;
+ }
+ function fg(a, b) {
+ a = a.style;
+ for (var c in b) if (b.hasOwnProperty(c)) {
+ var d = 0 === c.indexOf("--"), e = c, f = b[c];
+ e = null == f || "boolean" == typeof f || "" === f ? "" : d || "number" != typeof f || 0 === f || dg.hasOwnProperty(e) && dg[e] ? ("" + f).trim() : f + "px",
+ "float" === c && (c = "cssFloat"), d ? a.setProperty(c, e) : a[c] = e;
+ }
+ }
+ function hg(a, b, c) {
+ b && (gg[a] && (null != b.children || null != b.dangerouslySetInnerHTML) && E("137", a, c()),
+ null != b.dangerouslySetInnerHTML && (null != b.children && E("60"), "object" == typeof b.dangerouslySetInnerHTML && "__html" in b.dangerouslySetInnerHTML || E("61")),
+ null != b.style && "object" != typeof b.style && E("62", c()));
+ }
+ function ig(a, b) {
+ if (-1 === a.indexOf("-")) return "string" == typeof b.is;
+ switch (a) {
+ case "annotation-xml":
+ case "color-profile":
+ case "font-face":
+ case "font-face-src":
+ case "font-face-uri":
+ case "font-face-format":
+ case "font-face-name":
+ case "missing-glyph":
+ return !1;
+
+ default:
+ return !0;
+ }
+ }
+ function lg(a, b) {
+ a = 9 === a.nodeType || 11 === a.nodeType ? a : a.ownerDocument;
+ var c = Hd(a);
+ b = Sa[b];
+ for (var d = 0; d < b.length; d++) {
+ var e = b[d];
+ c.hasOwnProperty(e) && c[e] || ("topScroll" === e ? wd("topScroll", "scroll", a) : "topFocus" === e || "topBlur" === e ? (wd("topFocus", "focus", a),
+ wd("topBlur", "blur", a), c.topBlur = !0, c.topFocus = !0) : "topCancel" === e ? (yc("cancel", !0) && wd("topCancel", "cancel", a),
+ c.topCancel = !0) : "topClose" === e ? (yc("close", !0) && wd("topClose", "close", a),
+ c.topClose = !0) : Dd.hasOwnProperty(e) && U(e, Dd[e], a), c[e] = !0);
+ }
+ }
+ function ng(a, b, c, d) {
+ return c = 9 === c.nodeType ? c : c.ownerDocument, d === jg && (d = Zf(a)), d === jg ? "script" === a ? (a = c.createElement("div"),
+ a.innerHTML = "<script><\/script>", a = a.removeChild(a.firstChild)) : a = "string" == typeof b.is ? c.createElement(a, {
+ is: b.is
+ }) : c.createElement(a) : a = c.createElementNS(d, a), a;
+ }
+ function og(a, b) {
+ return (9 === b.nodeType ? b : b.ownerDocument).createTextNode(a);
+ }
+ function pg(a, b, c, d) {
+ var e = ig(b, c);
+ switch (b) {
+ case "iframe":
+ case "object":
+ U("topLoad", "load", a);
+ var f = c;
+ break;
+
+ case "video":
+ case "audio":
+ for (f in mg) mg.hasOwnProperty(f) && U(f, mg[f], a);
+ f = c;
+ break;
+
+ case "source":
+ U("topError", "error", a), f = c;
+ break;
+
+ case "img":
+ case "image":
+ U("topError", "error", a), U("topLoad", "load", a), f = c;
+ break;
+
+ case "form":
+ U("topReset", "reset", a), U("topSubmit", "submit", a), f = c;
+ break;
+
+ case "details":
+ U("topToggle", "toggle", a), f = c;
+ break;
+
+ case "input":
+ Mf(a, c), f = Lf(a, c), U("topInvalid", "invalid", a), lg(d, "onChange");
+ break;
+
+ case "option":
+ f = Rf(a, c);
+ break;
+
+ case "select":
+ Tf(a, c), f = B({}, c, {
+ value: void 0
+ }), U("topInvalid", "invalid", a), lg(d, "onChange");
+ break;
+
+ case "textarea":
+ Vf(a, c), f = Uf(a, c), U("topInvalid", "invalid", a), lg(d, "onChange");
+ break;
+
+ default:
+ f = c;
+ }
+ hg(b, f, kg);
+ var h, g = f;
+ for (h in g) if (g.hasOwnProperty(h)) {
+ var k = g[h];
+ "style" === h ? fg(a, k, kg) : "dangerouslySetInnerHTML" === h ? null != (k = k ? k.__html : void 0) && bg(a, k) : "children" === h ? "string" == typeof k ? ("textarea" !== b || "" !== k) && cg(a, k) : "number" == typeof k && cg(a, "" + k) : "suppressContentEditableWarning" !== h && "suppressHydrationWarning" !== h && "autoFocus" !== h && (Ra.hasOwnProperty(h) ? null != k && lg(d, h) : e ? Kf(a, h, k) : null != k && If(a, h, k));
+ }
+ switch (b) {
+ case "input":
+ Bc(a), Pf(a, c);
+ break;
+
+ case "textarea":
+ Bc(a), Xf(a, c);
+ break;
+
+ case "option":
+ null != c.value && a.setAttribute("value", c.value);
+ break;
+
+ case "select":
+ a.multiple = !!c.multiple, b = c.value, null != b ? Sf(a, !!c.multiple, b, !1) : null != c.defaultValue && Sf(a, !!c.multiple, c.defaultValue, !0);
+ break;
+
+ default:
+ "function" == typeof f.onClick && (a.onclick = C);
+ }
+ }
+ function sg(a, b, c, d, e) {
+ var f = null;
+ switch (b) {
+ case "input":
+ c = Lf(a, c), d = Lf(a, d), f = [];
+ break;
+
+ case "option":
+ c = Rf(a, c), d = Rf(a, d), f = [];
+ break;
+
+ case "select":
+ c = B({}, c, {
+ value: void 0
+ }), d = B({}, d, {
+ value: void 0
+ }), f = [];
+ break;
+
+ case "textarea":
+ c = Uf(a, c), d = Uf(a, d), f = [];
+ break;
+
+ default:
+ "function" != typeof c.onClick && "function" == typeof d.onClick && (a.onclick = C);
+ }
+ hg(b, d, kg);
+ var g, h;
+ a = null;
+ for (g in c) if (!d.hasOwnProperty(g) && c.hasOwnProperty(g) && null != c[g]) if ("style" === g) for (h in b = c[g]) b.hasOwnProperty(h) && (a || (a = {}),
+ a[h] = ""); else "dangerouslySetInnerHTML" !== g && "children" !== g && "suppressContentEditableWarning" !== g && "suppressHydrationWarning" !== g && "autoFocus" !== g && (Ra.hasOwnProperty(g) ? f || (f = []) : (f = f || []).push(g, null));
+ for (g in d) {
+ var k = d[g];
+ if (b = null != c ? c[g] : void 0, d.hasOwnProperty(g) && k !== b && (null != k || null != b)) if ("style" === g) if (b) {
+ for (h in b) !b.hasOwnProperty(h) || k && k.hasOwnProperty(h) || (a || (a = {}),
+ a[h] = "");
+ for (h in k) k.hasOwnProperty(h) && b[h] !== k[h] && (a || (a = {}), a[h] = k[h]);
+ } else a || (f || (f = []), f.push(g, a)), a = k; else "dangerouslySetInnerHTML" === g ? (k = k ? k.__html : void 0,
+ b = b ? b.__html : void 0, null != k && b !== k && (f = f || []).push(g, "" + k)) : "children" === g ? b === k || "string" != typeof k && "number" != typeof k || (f = f || []).push(g, "" + k) : "suppressContentEditableWarning" !== g && "suppressHydrationWarning" !== g && (Ra.hasOwnProperty(g) ? (null != k && lg(e, g),
+ f || b === k || (f = [])) : (f = f || []).push(g, k));
+ }
+ return a && (f = f || []).push("style", a), f;
+ }
+ function tg(a, b, c, d, e) {
+ "input" === c && "radio" === e.type && null != e.name && Nf(a, e), ig(c, d), d = ig(c, e);
+ for (var f = 0; f < b.length; f += 2) {
+ var g = b[f], h = b[f + 1];
+ "style" === g ? fg(a, h, kg) : "dangerouslySetInnerHTML" === g ? bg(a, h) : "children" === g ? cg(a, h) : d ? null != h ? Kf(a, g, h) : a.removeAttribute(g) : null != h ? If(a, g, h) : Jf(a, g);
+ }
+ switch (c) {
+ case "input":
+ Of(a, e);
+ break;
+
+ case "textarea":
+ Wf(a, e);
+ break;
+
+ case "select":
+ a._wrapperState.initialValue = void 0, b = a._wrapperState.wasMultiple, a._wrapperState.wasMultiple = !!e.multiple,
+ c = e.value, null != c ? Sf(a, !!e.multiple, c, !1) : b !== !!e.multiple && (null != e.defaultValue ? Sf(a, !!e.multiple, e.defaultValue, !0) : Sf(a, !!e.multiple, e.multiple ? [] : "", !1));
+ }
+ }
+ function ug(a, b, c, d, e) {
+ switch (b) {
+ case "iframe":
+ case "object":
+ U("topLoad", "load", a);
+ break;
+
+ case "video":
+ case "audio":
+ for (var f in mg) mg.hasOwnProperty(f) && U(f, mg[f], a);
+ break;
+
+ case "source":
+ U("topError", "error", a);
+ break;
+
+ case "img":
+ case "image":
+ U("topError", "error", a), U("topLoad", "load", a);
+ break;
+
+ case "form":
+ U("topReset", "reset", a), U("topSubmit", "submit", a);
+ break;
+
+ case "details":
+ U("topToggle", "toggle", a);
+ break;
+
+ case "input":
+ Mf(a, c), U("topInvalid", "invalid", a), lg(e, "onChange");
+ break;
+
+ case "select":
+ Tf(a, c), U("topInvalid", "invalid", a), lg(e, "onChange");
+ break;
+
+ case "textarea":
+ Vf(a, c), U("topInvalid", "invalid", a), lg(e, "onChange");
+ }
+ hg(b, c, kg), d = null;
+ for (var g in c) c.hasOwnProperty(g) && (f = c[g], "children" === g ? "string" == typeof f ? a.textContent !== f && (d = [ "children", f ]) : "number" == typeof f && a.textContent !== "" + f && (d = [ "children", "" + f ]) : Ra.hasOwnProperty(g) && null != f && lg(e, g));
+ switch (b) {
+ case "input":
+ Bc(a), Pf(a, c);
+ break;
+
+ case "textarea":
+ Bc(a), Xf(a, c);
+ break;
+
+ case "select":
+ case "option":
+ break;
+
+ default:
+ "function" == typeof c.onClick && (a.onclick = C);
+ }
+ return d;
+ }
+ function vg(a, b) {
+ return a.nodeValue !== b;
+ }
+ function Ng(a) {
+ return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType && (8 !== a.nodeType || " react-mount-point-unstable " !== a.nodeValue));
+ }
+ function Og(a) {
+ return !(!(a = a ? 9 === a.nodeType ? a.documentElement : a.firstChild : null) || 1 !== a.nodeType || !a.hasAttribute("data-reactroot"));
+ }
+ function Pg(a, b, c, d, e) {
+ Ng(c) || E("200");
+ var f = c._reactRootContainer;
+ if (f) Z.updateContainer(b, f, a, e); else {
+ if (!(d = d || Og(c))) for (f = void 0; f = c.lastChild; ) c.removeChild(f);
+ var g = Z.createContainer(c, d);
+ f = c._reactRootContainer = g, Z.unbatchedUpdates(function() {
+ Z.updateContainer(b, g, a, e);
+ });
+ }
+ return Z.getPublicRootInstance(f);
+ }
+ function Qg(a, b) {
+ var c = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;
+ return Ng(b) || E("200"), pf(a, b, null, c);
+ }
+ function Rg(a, b) {
+ this._reactRootContainer = Z.createContainer(a, b);
+ }
+ var aa = __webpack_require__(0), l = __webpack_require__(200), B = __webpack_require__(69), C = __webpack_require__(39), ba = __webpack_require__(201), da = __webpack_require__(202), ea = __webpack_require__(96), fa = __webpack_require__(203), ia = __webpack_require__(204), D = __webpack_require__(93);
+ aa || E("227");
+ var oa = {
+ children: !0,
+ dangerouslySetInnerHTML: !0,
+ defaultValue: !0,
+ defaultChecked: !0,
+ innerHTML: !0,
+ suppressContentEditableWarning: !0,
+ suppressHydrationWarning: !0,
+ style: !0
+ }, ta = {
+ MUST_USE_PROPERTY: 1,
+ HAS_BOOLEAN_VALUE: 4,
+ HAS_NUMERIC_VALUE: 8,
+ HAS_POSITIVE_NUMERIC_VALUE: 24,
+ HAS_OVERLOADED_BOOLEAN_VALUE: 32,
+ HAS_STRING_BOOLEAN_VALUE: 64,
+ injectDOMPropertyConfig: function(a) {
+ var b = ta, c = a.Properties || {}, d = a.DOMAttributeNamespaces || {}, e = a.DOMAttributeNames || {};
+ a = a.DOMMutationMethods || {};
+ for (var f in c) {
+ ua.hasOwnProperty(f) && E("48", f);
+ var g = f.toLowerCase(), h = c[f];
+ g = {
+ attributeName: g,
+ attributeNamespace: null,
+ propertyName: f,
+ mutationMethod: null,
+ mustUseProperty: pa(h, b.MUST_USE_PROPERTY),
+ hasBooleanValue: pa(h, b.HAS_BOOLEAN_VALUE),
+ hasNumericValue: pa(h, b.HAS_NUMERIC_VALUE),
+ hasPositiveNumericValue: pa(h, b.HAS_POSITIVE_NUMERIC_VALUE),
+ hasOverloadedBooleanValue: pa(h, b.HAS_OVERLOADED_BOOLEAN_VALUE),
+ hasStringBooleanValue: pa(h, b.HAS_STRING_BOOLEAN_VALUE)
+ }, 1 >= g.hasBooleanValue + g.hasNumericValue + g.hasOverloadedBooleanValue || E("50", f),
+ e.hasOwnProperty(f) && (g.attributeName = e[f]), d.hasOwnProperty(f) && (g.attributeNamespace = d[f]),
+ a.hasOwnProperty(f) && (g.mutationMethod = a[f]), ua[f] = g;
+ }
+ }
+ }, ua = {}, xa = ta, ya = xa.MUST_USE_PROPERTY, K = xa.HAS_BOOLEAN_VALUE, za = xa.HAS_NUMERIC_VALUE, Aa = xa.HAS_POSITIVE_NUMERIC_VALUE, Ba = xa.HAS_OVERLOADED_BOOLEAN_VALUE, Ca = xa.HAS_STRING_BOOLEAN_VALUE, Da = {
+ Properties: {
+ allowFullScreen: K,
+ async: K,
+ autoFocus: K,
+ autoPlay: K,
+ capture: Ba,
+ checked: ya | K,
+ cols: Aa,
+ contentEditable: Ca,
+ controls: K,
+ default: K,
+ defer: K,
+ disabled: K,
+ download: Ba,
+ draggable: Ca,
+ formNoValidate: K,
+ hidden: K,
+ loop: K,
+ multiple: ya | K,
+ muted: ya | K,
+ noValidate: K,
+ open: K,
+ playsInline: K,
+ readOnly: K,
+ required: K,
+ reversed: K,
+ rows: Aa,
+ rowSpan: za,
+ scoped: K,
+ seamless: K,
+ selected: ya | K,
+ size: Aa,
+ start: za,
+ span: Aa,
+ spellCheck: Ca,
+ style: 0,
+ tabIndex: 0,
+ itemScope: K,
+ acceptCharset: 0,
+ className: 0,
+ htmlFor: 0,
+ httpEquiv: 0,
+ value: Ca
+ },
+ DOMAttributeNames: {
+ acceptCharset: "accept-charset",
+ className: "class",
+ htmlFor: "for",
+ httpEquiv: "http-equiv"
+ },
+ DOMMutationMethods: {
+ value: function(a, b) {
+ if (null == b) return a.removeAttribute("value");
+ "number" !== a.type || !1 === a.hasAttribute("value") ? a.setAttribute("value", "" + b) : a.validity && !a.validity.badInput && a.ownerDocument.activeElement !== a && a.setAttribute("value", "" + b);
+ }
+ }
+ }, Ea = xa.HAS_STRING_BOOLEAN_VALUE, M = {
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace"
+ }, Ga = {
+ Properties: {
+ autoReverse: Ea,
+ externalResourcesRequired: Ea,
+ preserveAlpha: Ea
+ },
+ DOMAttributeNames: {
+ autoReverse: "autoReverse",
+ externalResourcesRequired: "externalResourcesRequired",
+ preserveAlpha: "preserveAlpha"
+ },
+ DOMAttributeNamespaces: {
+ xlinkActuate: M.xlink,
+ xlinkArcrole: M.xlink,
+ xlinkHref: M.xlink,
+ xlinkRole: M.xlink,
+ xlinkShow: M.xlink,
+ xlinkTitle: M.xlink,
+ xlinkType: M.xlink,
+ xmlBase: M.xml,
+ xmlLang: M.xml,
+ xmlSpace: M.xml
+ }
+ }, Ha = /[\-\:]([a-z])/g;
+ "accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode x-height xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xmlns:xlink xml:lang xml:space".split(" ").forEach(function(a) {
+ var b = a.replace(Ha, Ia);
+ Ga.Properties[b] = 0, Ga.DOMAttributeNames[b] = a;
+ }), xa.injectDOMPropertyConfig(Da), xa.injectDOMPropertyConfig(Ga);
+ var P = {
+ _caughtError: null,
+ _hasCaughtError: !1,
+ _rethrowError: null,
+ _hasRethrowError: !1,
+ injection: {
+ injectErrorUtils: function(a) {
+ "function" != typeof a.invokeGuardedCallback && E("197"), Ja = a.invokeGuardedCallback;
+ }
+ },
+ invokeGuardedCallback: function(a, b, c, d, e, f, g, h, k) {
+ Ja.apply(P, arguments);
+ },
+ invokeGuardedCallbackAndCatchFirstError: function(a, b, c, d, e, f, g, h, k) {
+ if (P.invokeGuardedCallback.apply(this, arguments), P.hasCaughtError()) {
+ var q = P.clearCaughtError();
+ P._hasRethrowError || (P._hasRethrowError = !0, P._rethrowError = q);
+ }
+ },
+ rethrowCaughtError: function() {
+ return Ka.apply(P, arguments);
+ },
+ hasCaughtError: function() {
+ return P._hasCaughtError;
+ },
+ clearCaughtError: function() {
+ if (P._hasCaughtError) {
+ var a = P._caughtError;
+ return P._caughtError = null, P._hasCaughtError = !1, a;
+ }
+ E("198");
+ }
+ }, La = null, Ma = {}, Oa = [], Pa = {}, Ra = {}, Sa = {}, Va = Object.freeze({
+ plugins: Oa,
+ eventNameDispatchConfigs: Pa,
+ registrationNameModules: Ra,
+ registrationNameDependencies: Sa,
+ possibleRegistrationNames: null,
+ injectEventPluginOrder: Ta,
+ injectEventPluginsByName: Ua
+ }), Wa = null, Xa = null, Ya = null, bb = null, hb = {
+ injectEventPluginOrder: Ta,
+ injectEventPluginsByName: Ua
+ }, mb = Object.freeze({
+ injection: hb,
+ getListener: ib,
+ extractEvents: jb,
+ enqueueEvents: kb,
+ processEventQueue: lb
+ }), nb = Math.random().toString(36).slice(2), Q = "__reactInternalInstance$" + nb, ob = "__reactEventHandlers$" + nb, sb = Object.freeze({
+ precacheFiberNode: function(a, b) {
+ b[Q] = a;
+ },
+ getClosestInstanceFromNode: pb,
+ getInstanceFromNode: function(a) {
+ return a = a[Q], !a || 5 !== a.tag && 6 !== a.tag ? null : a;
+ },
+ getNodeFromInstance: qb,
+ getFiberCurrentPropsFromNode: rb,
+ updateFiberProps: function(a, b) {
+ a[ob] = b;
+ }
+ }), Cb = Object.freeze({
+ accumulateTwoPhaseDispatches: Ab,
+ accumulateTwoPhaseDispatchesSkipTarget: function(a) {
+ ab(a, xb);
+ },
+ accumulateEnterLeaveDispatches: Bb,
+ accumulateDirectDispatches: function(a) {
+ ab(a, zb);
+ }
+ }), Db = null, S = {
+ _root: null,
+ _startText: null,
+ _fallbackText: null
+ }, Hb = "dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances".split(" "), Ib = {
+ type: null,
+ target: null,
+ currentTarget: C.thatReturnsNull,
+ eventPhase: null,
+ bubbles: null,
+ cancelable: null,
+ timeStamp: function(a) {
+ return a.timeStamp || Date.now();
+ },
+ defaultPrevented: null,
+ isTrusted: null
+ };
+ B(T.prototype, {
+ preventDefault: function() {
+ this.defaultPrevented = !0;
+ var a = this.nativeEvent;
+ a && (a.preventDefault ? a.preventDefault() : "unknown" != typeof a.returnValue && (a.returnValue = !1),
+ this.isDefaultPrevented = C.thatReturnsTrue);
+ },
+ stopPropagation: function() {
+ var a = this.nativeEvent;
+ a && (a.stopPropagation ? a.stopPropagation() : "unknown" != typeof a.cancelBubble && (a.cancelBubble = !0),
+ this.isPropagationStopped = C.thatReturnsTrue);
+ },
+ persist: function() {
+ this.isPersistent = C.thatReturnsTrue;
+ },
+ isPersistent: C.thatReturnsFalse,
+ destructor: function() {
+ var b, a = this.constructor.Interface;
+ for (b in a) this[b] = null;
+ for (a = 0; a < Hb.length; a++) this[Hb[a]] = null;
+ }
+ }), T.Interface = Ib, T.augmentClass = function(a, b) {
+ function c() {}
+ c.prototype = this.prototype;
+ var d = new c();
+ B(d, a.prototype), a.prototype = d, a.prototype.constructor = a, a.Interface = B({}, this.Interface, b),
+ a.augmentClass = this.augmentClass, Jb(a);
+ }, Jb(T), T.augmentClass(Mb, {
+ data: null
+ }), T.augmentClass(Nb, {
+ data: null
+ });
+ var Pb = [ 9, 13, 27, 32 ], Vb = l.canUseDOM && "CompositionEvent" in window, Wb = null;
+ l.canUseDOM && "documentMode" in document && (Wb = document.documentMode);
+ var Xb;
+ if (Xb = l.canUseDOM && "TextEvent" in window && !Wb) {
+ var Yb = window.opera;
+ Xb = !("object" == typeof Yb && "function" == typeof Yb.version && 12 >= parseInt(Yb.version(), 10));
+ }
+ var xc, Zb = Xb, $b = l.canUseDOM && (!Vb || Wb && 8 < Wb && 11 >= Wb), ac = String.fromCharCode(32), bc = {
+ beforeInput: {
+ phasedRegistrationNames: {
+ bubbled: "onBeforeInput",
+ captured: "onBeforeInputCapture"
+ },
+ dependencies: [ "topCompositionEnd", "topKeyPress", "topTextInput", "topPaste" ]
+ },
+ compositionEnd: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionEnd",
+ captured: "onCompositionEndCapture"
+ },
+ dependencies: "topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")
+ },
+ compositionStart: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionStart",
+ captured: "onCompositionStartCapture"
+ },
+ dependencies: "topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")
+ },
+ compositionUpdate: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionUpdate",
+ captured: "onCompositionUpdateCapture"
+ },
+ dependencies: "topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")
+ }
+ }, cc = !1, fc = !1, ic = {
+ eventTypes: bc,
+ extractEvents: function(a, b, c, d) {
+ var e;
+ if (Vb) b: {
+ switch (a) {
+ case "topCompositionStart":
+ var f = bc.compositionStart;
+ break b;
+
+ case "topCompositionEnd":
+ f = bc.compositionEnd;
+ break b;
+
+ case "topCompositionUpdate":
+ f = bc.compositionUpdate;
+ break b;
+ }
+ f = void 0;
+ } else fc ? dc(a, c) && (f = bc.compositionEnd) : "topKeyDown" === a && 229 === c.keyCode && (f = bc.compositionStart);
+ return f ? ($b && (fc || f !== bc.compositionStart ? f === bc.compositionEnd && fc && (e = Fb()) : (S._root = d,
+ S._startText = Gb(), fc = !0)), f = Mb.getPooled(f, b, c, d), e ? f.data = e : null !== (e = ec(c)) && (f.data = e),
+ Ab(f), e = f) : e = null, (a = Zb ? gc(a, c) : hc(a, c)) ? (b = Nb.getPooled(bc.beforeInput, b, c, d),
+ b.data = a, Ab(b)) : b = null, [ e, b ];
+ }
+ }, jc = null, kc = null, lc = null, nc = {
+ injectFiberControlledHostComponent: function(a) {
+ jc = a;
+ }
+ }, qc = Object.freeze({
+ injection: nc,
+ enqueueStateRestore: oc,
+ restoreStateIfNeeded: pc
+ }), sc = !1, uc = {
+ color: !0,
+ date: !0,
+ datetime: !0,
+ "datetime-local": !0,
+ email: !0,
+ month: !0,
+ number: !0,
+ password: !0,
+ range: !0,
+ search: !0,
+ tel: !0,
+ text: !0,
+ time: !0,
+ url: !0,
+ week: !0
+ };
+ l.canUseDOM && (xc = document.implementation && document.implementation.hasFeature && !0 !== document.implementation.hasFeature("", ""));
+ var Dc = {
+ change: {
+ phasedRegistrationNames: {
+ bubbled: "onChange",
+ captured: "onChangeCapture"
+ },
+ dependencies: "topBlur topChange topClick topFocus topInput topKeyDown topKeyUp topSelectionChange".split(" ")
+ }
+ }, Fc = null, Gc = null, Kc = !1;
+ l.canUseDOM && (Kc = yc("input") && (!document.documentMode || 9 < document.documentMode));
+ var ad = {
+ eventTypes: Dc,
+ _isInputEventSupported: Kc,
+ extractEvents: function(a, b, c, d) {
+ var e = b ? qb(b) : window, f = e.nodeName && e.nodeName.toLowerCase();
+ if ("select" === f || "input" === f && "file" === e.type) var g = Jc; else if (vc(e)) if (Kc) g = $c; else {
+ g = Oc;
+ var h = Nc;
+ } else !(f = e.nodeName) || "input" !== f.toLowerCase() || "checkbox" !== e.type && "radio" !== e.type || (g = Pc);
+ if (g && (g = g(a, b))) return Ec(g, c, d);
+ h && h(a, e, b), "topBlur" === a && null != b && (a = b._wrapperState || e._wrapperState) && a.controlled && "number" === e.type && (a = "" + e.value,
+ e.getAttribute("value") !== a && e.setAttribute("value", a));
+ }
+ };
+ T.augmentClass(bd, {
+ view: null,
+ detail: null
+ });
+ var cd = {
+ Alt: "altKey",
+ Control: "ctrlKey",
+ Meta: "metaKey",
+ Shift: "shiftKey"
+ };
+ bd.augmentClass(fd, {
+ screenX: null,
+ screenY: null,
+ clientX: null,
+ clientY: null,
+ pageX: null,
+ pageY: null,
+ ctrlKey: null,
+ shiftKey: null,
+ altKey: null,
+ metaKey: null,
+ getModifierState: ed,
+ button: null,
+ buttons: null,
+ relatedTarget: function(a) {
+ return a.relatedTarget || (a.fromElement === a.srcElement ? a.toElement : a.fromElement);
+ }
+ });
+ var gd = {
+ mouseEnter: {
+ registrationName: "onMouseEnter",
+ dependencies: [ "topMouseOut", "topMouseOver" ]
+ },
+ mouseLeave: {
+ registrationName: "onMouseLeave",
+ dependencies: [ "topMouseOut", "topMouseOver" ]
+ }
+ }, hd = {
+ eventTypes: gd,
+ extractEvents: function(a, b, c, d) {
+ if ("topMouseOver" === a && (c.relatedTarget || c.fromElement) || "topMouseOut" !== a && "topMouseOver" !== a) return null;
+ var e = d.window === d ? d : (e = d.ownerDocument) ? e.defaultView || e.parentWindow : window;
+ if ("topMouseOut" === a ? (a = b, b = (b = c.relatedTarget || c.toElement) ? pb(b) : null) : a = null,
+ a === b) return null;
+ var f = null == a ? e : qb(a);
+ e = null == b ? e : qb(b);
+ var g = fd.getPooled(gd.mouseLeave, a, c, d);
+ return g.type = "mouseleave", g.target = f, g.relatedTarget = e, c = fd.getPooled(gd.mouseEnter, b, c, d),
+ c.type = "mouseenter", c.target = e, c.relatedTarget = f, Bb(g, c, a, b), [ g, c ];
+ }
+ }, id = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, qd = [], td = !0, sd = void 0, xd = Object.freeze({
+ get _enabled() {
+ return td;
+ },
+ get _handleTopLevel() {
+ return sd;
+ },
+ setHandleTopLevel: function(a) {
+ sd = a;
+ },
+ setEnabled: ud,
+ isEnabled: function() {
+ return td;
+ },
+ trapBubbledEvent: U,
+ trapCapturedEvent: wd,
+ dispatchEvent: vd
+ }), zd = {
+ animationend: yd("Animation", "AnimationEnd"),
+ animationiteration: yd("Animation", "AnimationIteration"),
+ animationstart: yd("Animation", "AnimationStart"),
+ transitionend: yd("Transition", "TransitionEnd")
+ }, Ad = {}, Bd = {};
+ l.canUseDOM && (Bd = document.createElement("div").style, "AnimationEvent" in window || (delete zd.animationend.animation,
+ delete zd.animationiteration.animation, delete zd.animationstart.animation), "TransitionEvent" in window || delete zd.transitionend.transition);
+ var Dd = {
+ topAbort: "abort",
+ topAnimationEnd: Cd("animationend") || "animationend",
+ topAnimationIteration: Cd("animationiteration") || "animationiteration",
+ topAnimationStart: Cd("animationstart") || "animationstart",
+ topBlur: "blur",
+ topCancel: "cancel",
+ topCanPlay: "canplay",
+ topCanPlayThrough: "canplaythrough",
+ topChange: "change",
+ topClick: "click",
+ topClose: "close",
+ topCompositionEnd: "compositionend",
+ topCompositionStart: "compositionstart",
+ topCompositionUpdate: "compositionupdate",
+ topContextMenu: "contextmenu",
+ topCopy: "copy",
+ topCut: "cut",
+ topDoubleClick: "dblclick",
+ topDrag: "drag",
+ topDragEnd: "dragend",
+ topDragEnter: "dragenter",
+ topDragExit: "dragexit",
+ topDragLeave: "dragleave",
+ topDragOver: "dragover",
+ topDragStart: "dragstart",
+ topDrop: "drop",
+ topDurationChange: "durationchange",
+ topEmptied: "emptied",
+ topEncrypted: "encrypted",
+ topEnded: "ended",
+ topError: "error",
+ topFocus: "focus",
+ topInput: "input",
+ topKeyDown: "keydown",
+ topKeyPress: "keypress",
+ topKeyUp: "keyup",
+ topLoadedData: "loadeddata",
+ topLoad: "load",
+ topLoadedMetadata: "loadedmetadata",
+ topLoadStart: "loadstart",
+ topMouseDown: "mousedown",
+ topMouseMove: "mousemove",
+ topMouseOut: "mouseout",
+ topMouseOver: "mouseover",
+ topMouseUp: "mouseup",
+ topPaste: "paste",
+ topPause: "pause",
+ topPlay: "play",
+ topPlaying: "playing",
+ topProgress: "progress",
+ topRateChange: "ratechange",
+ topScroll: "scroll",
+ topSeeked: "seeked",
+ topSeeking: "seeking",
+ topSelectionChange: "selectionchange",
+ topStalled: "stalled",
+ topSuspend: "suspend",
+ topTextInput: "textInput",
+ topTimeUpdate: "timeupdate",
+ topToggle: "toggle",
+ topTouchCancel: "touchcancel",
+ topTouchEnd: "touchend",
+ topTouchMove: "touchmove",
+ topTouchStart: "touchstart",
+ topTransitionEnd: Cd("transitionend") || "transitionend",
+ topVolumeChange: "volumechange",
+ topWaiting: "waiting",
+ topWheel: "wheel"
+ }, Ed = {}, Fd = 0, Gd = "_reactListenersID" + ("" + Math.random()).slice(2), Ld = l.canUseDOM && "documentMode" in document && 11 >= document.documentMode, Md = {
+ select: {
+ phasedRegistrationNames: {
+ bubbled: "onSelect",
+ captured: "onSelectCapture"
+ },
+ dependencies: "topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange".split(" ")
+ }
+ }, Nd = null, Od = null, Pd = null, Qd = !1, Sd = {
+ eventTypes: Md,
+ extractEvents: function(a, b, c, d) {
+ var f, e = d.window === d ? d.document : 9 === d.nodeType ? d : d.ownerDocument;
+ if (!(f = !e)) {
+ a: {
+ e = Hd(e), f = Sa.onSelect;
+ for (var g = 0; g < f.length; g++) {
+ var h = f[g];
+ if (!e.hasOwnProperty(h) || !e[h]) {
+ e = !1;
+ break a;
+ }
+ }
+ e = !0;
+ }
+ f = !e;
+ }
+ if (f) return null;
+ switch (e = b ? qb(b) : window, a) {
+ case "topFocus":
+ (vc(e) || "true" === e.contentEditable) && (Nd = e, Od = b, Pd = null);
+ break;
+
+ case "topBlur":
+ Pd = Od = Nd = null;
+ break;
+
+ case "topMouseDown":
+ Qd = !0;
+ break;
+
+ case "topContextMenu":
+ case "topMouseUp":
+ return Qd = !1, Rd(c, d);
+
+ case "topSelectionChange":
+ if (Ld) break;
+
+ case "topKeyDown":
+ case "topKeyUp":
+ return Rd(c, d);
+ }
+ return null;
+ }
+ };
+ T.augmentClass(Td, {
+ animationName: null,
+ elapsedTime: null,
+ pseudoElement: null
+ }), T.augmentClass(Ud, {
+ clipboardData: function(a) {
+ return "clipboardData" in a ? a.clipboardData : window.clipboardData;
+ }
+ }), bd.augmentClass(Vd, {
+ relatedTarget: null
+ });
+ var Xd = {
+ Esc: "Escape",
+ Spacebar: " ",
+ Left: "ArrowLeft",
+ Up: "ArrowUp",
+ Right: "ArrowRight",
+ Down: "ArrowDown",
+ Del: "Delete",
+ Win: "OS",
+ Menu: "ContextMenu",
+ Apps: "ContextMenu",
+ Scroll: "ScrollLock",
+ MozPrintableKey: "Unidentified"
+ }, Yd = {
+ 8: "Backspace",
+ 9: "Tab",
+ 12: "Clear",
+ 13: "Enter",
+ 16: "Shift",
+ 17: "Control",
+ 18: "Alt",
+ 19: "Pause",
+ 20: "CapsLock",
+ 27: "Escape",
+ 32: " ",
+ 33: "PageUp",
+ 34: "PageDown",
+ 35: "End",
+ 36: "Home",
+ 37: "ArrowLeft",
+ 38: "ArrowUp",
+ 39: "ArrowRight",
+ 40: "ArrowDown",
+ 45: "Insert",
+ 46: "Delete",
+ 112: "F1",
+ 113: "F2",
+ 114: "F3",
+ 115: "F4",
+ 116: "F5",
+ 117: "F6",
+ 118: "F7",
+ 119: "F8",
+ 120: "F9",
+ 121: "F10",
+ 122: "F11",
+ 123: "F12",
+ 144: "NumLock",
+ 145: "ScrollLock",
+ 224: "Meta"
+ };
+ bd.augmentClass(Zd, {
+ key: function(a) {
+ if (a.key) {
+ var b = Xd[a.key] || a.key;
+ if ("Unidentified" !== b) return b;
+ }
+ return "keypress" === a.type ? (a = Wd(a), 13 === a ? "Enter" : String.fromCharCode(a)) : "keydown" === a.type || "keyup" === a.type ? Yd[a.keyCode] || "Unidentified" : "";
+ },
+ location: null,
+ ctrlKey: null,
+ shiftKey: null,
+ altKey: null,
+ metaKey: null,
+ repeat: null,
+ locale: null,
+ getModifierState: ed,
+ charCode: function(a) {
+ return "keypress" === a.type ? Wd(a) : 0;
+ },
+ keyCode: function(a) {
+ return "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0;
+ },
+ which: function(a) {
+ return "keypress" === a.type ? Wd(a) : "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0;
+ }
+ }), fd.augmentClass($d, {
+ dataTransfer: null
+ }), bd.augmentClass(ae, {
+ touches: null,
+ targetTouches: null,
+ changedTouches: null,
+ altKey: null,
+ metaKey: null,
+ ctrlKey: null,
+ shiftKey: null,
+ getModifierState: ed
+ }), T.augmentClass(be, {
+ propertyName: null,
+ elapsedTime: null,
+ pseudoElement: null
+ }), fd.augmentClass(ce, {
+ deltaX: function(a) {
+ return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0;
+ },
+ deltaY: function(a) {
+ return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0;
+ },
+ deltaZ: null,
+ deltaMode: null
+ });
+ var de = {}, ee = {};
+ "abort animationEnd animationIteration animationStart blur cancel canPlay canPlayThrough click close contextMenu copy cut doubleClick drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error focus input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing progress rateChange reset scroll seeked seeking stalled submit suspend timeUpdate toggle touchCancel touchEnd touchMove touchStart transitionEnd volumeChange waiting wheel".split(" ").forEach(function(a) {
+ var b = a[0].toUpperCase() + a.slice(1), c = "on" + b;
+ b = "top" + b, c = {
+ phasedRegistrationNames: {
+ bubbled: c,
+ captured: c + "Capture"
+ },
+ dependencies: [ b ]
+ }, de[a] = c, ee[b] = c;
+ });
+ var fe = {
+ eventTypes: de,
+ extractEvents: function(a, b, c, d) {
+ var e = ee[a];
+ if (!e) return null;
+ switch (a) {
+ case "topKeyPress":
+ if (0 === Wd(c)) return null;
+
+ case "topKeyDown":
+ case "topKeyUp":
+ a = Zd;
+ break;
+
+ case "topBlur":
+ case "topFocus":
+ a = Vd;
+ break;
+
+ case "topClick":
+ if (2 === c.button) return null;
+
+ case "topDoubleClick":
+ case "topMouseDown":
+ case "topMouseMove":
+ case "topMouseUp":
+ case "topMouseOut":
+ case "topMouseOver":
+ case "topContextMenu":
+ a = fd;
+ break;
+
+ case "topDrag":
+ case "topDragEnd":
+ case "topDragEnter":
+ case "topDragExit":
+ case "topDragLeave":
+ case "topDragOver":
+ case "topDragStart":
+ case "topDrop":
+ a = $d;
+ break;
+
+ case "topTouchCancel":
+ case "topTouchEnd":
+ case "topTouchMove":
+ case "topTouchStart":
+ a = ae;
+ break;
+
+ case "topAnimationEnd":
+ case "topAnimationIteration":
+ case "topAnimationStart":
+ a = Td;
+ break;
+
+ case "topTransitionEnd":
+ a = be;
+ break;
+
+ case "topScroll":
+ a = bd;
+ break;
+
+ case "topWheel":
+ a = ce;
+ break;
+
+ case "topCopy":
+ case "topCut":
+ case "topPaste":
+ a = Ud;
+ break;
+
+ default:
+ a = T;
+ }
+ return b = a.getPooled(e, b, c, d), Ab(b), b;
+ }
+ };
+ sd = function(a, b, c, d) {
+ a = jb(a, b, c, d), kb(a), lb(!1);
+ }, hb.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")),
+ Wa = sb.getFiberCurrentPropsFromNode, Xa = sb.getInstanceFromNode, Ya = sb.getNodeFromInstance,
+ hb.injectEventPluginsByName({
+ SimpleEventPlugin: fe,
+ EnterLeaveEventPlugin: hd,
+ ChangeEventPlugin: ad,
+ SelectEventPlugin: Sd,
+ BeforeInputEventPlugin: ic
+ });
+ var ge = [], he = -1;
+ new Set();
+ var ie = {
+ current: D
+ }, X = {
+ current: !1
+ }, je = D, ze = null, Ae = null, Qe = "function" == typeof Symbol && Symbol.for, Re = Qe ? Symbol.for("react.element") : 60103, Se = Qe ? Symbol.for("react.call") : 60104, Te = Qe ? Symbol.for("react.return") : 60105, Ue = Qe ? Symbol.for("react.portal") : 60106, Ve = Qe ? Symbol.for("react.fragment") : 60107, We = "function" == typeof Symbol && Symbol.iterator, Ye = Array.isArray, bf = af(!0), cf = af(!1), gf = {}, mf = Object.freeze({
+ default: lf
+ }), nf = mf && lf || mf, of = nf.default ? nf.default : nf, qf = "object" == typeof performance && "function" == typeof performance.now, rf = void 0;
+ rf = qf ? function() {
+ return performance.now();
+ } : function() {
+ return Date.now();
+ };
+ var sf = void 0, tf = void 0;
+ if (l.canUseDOM) if ("function" != typeof requestIdleCallback || "function" != typeof cancelIdleCallback) {
+ var Bf, uf = null, vf = !1, wf = -1, xf = !1, yf = 0, zf = 33, Af = 33;
+ Bf = qf ? {
+ didTimeout: !1,
+ timeRemaining: function() {
+ var a = yf - performance.now();
+ return 0 < a ? a : 0;
+ }
+ } : {
+ didTimeout: !1,
+ timeRemaining: function() {
+ var a = yf - Date.now();
+ return 0 < a ? a : 0;
+ }
+ };
+ var Cf = "__reactIdleCallback$" + Math.random().toString(36).slice(2);
+ window.addEventListener("message", function(a) {
+ if (a.source === window && a.data === Cf) {
+ if (vf = !1, a = rf(), 0 >= yf - a) {
+ if (!(-1 !== wf && wf <= a)) return void (xf || (xf = !0, requestAnimationFrame(Df)));
+ Bf.didTimeout = !0;
+ } else Bf.didTimeout = !1;
+ wf = -1, a = uf, uf = null, null !== a && a(Bf);
+ }
+ }, !1);
+ var Df = function(a) {
+ xf = !1;
+ var b = a - yf + Af;
+ b < Af && zf < Af ? (8 > b && (b = 8), Af = b < zf ? zf : b) : zf = b, yf = a + Af,
+ vf || (vf = !0, window.postMessage(Cf, "*"));
+ };
+ sf = function(a, b) {
+ return uf = a, null != b && "number" == typeof b.timeout && (wf = rf() + b.timeout),
+ xf || (xf = !0, requestAnimationFrame(Df)), 0;
+ }, tf = function() {
+ uf = null, vf = !1, wf = -1;
+ };
+ } else sf = window.requestIdleCallback, tf = window.cancelIdleCallback; else sf = function(a) {
+ return setTimeout(function() {
+ a({
+ timeRemaining: function() {
+ return 1 / 0;
+ }
+ });
+ });
+ }, tf = function(a) {
+ clearTimeout(a);
+ };
+ var Ef = /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, Ff = {}, Gf = {}, Yf = {
+ html: "http://www.w3.org/1999/xhtml",
+ mathml: "http://www.w3.org/1998/Math/MathML",
+ svg: "http://www.w3.org/2000/svg"
+ }, ag = void 0, bg = function(a) {
+ return "undefined" != typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {
+ MSApp.execUnsafeLocalFunction(function() {
+ return a(b, c);
+ });
+ } : a;
+ }(function(a, b) {
+ if (a.namespaceURI !== Yf.svg || "innerHTML" in a) a.innerHTML = b; else {
+ for (ag = ag || document.createElement("div"), ag.innerHTML = "<svg>" + b + "</svg>",
+ b = ag.firstChild; a.firstChild; ) a.removeChild(a.firstChild);
+ for (;b.firstChild; ) a.appendChild(b.firstChild);
+ }
+ }), dg = {
+ animationIterationCount: !0,
+ borderImageOutset: !0,
+ borderImageSlice: !0,
+ borderImageWidth: !0,
+ boxFlex: !0,
+ boxFlexGroup: !0,
+ boxOrdinalGroup: !0,
+ columnCount: !0,
+ columns: !0,
+ flex: !0,
+ flexGrow: !0,
+ flexPositive: !0,
+ flexShrink: !0,
+ flexNegative: !0,
+ flexOrder: !0,
+ gridRow: !0,
+ gridRowEnd: !0,
+ gridRowSpan: !0,
+ gridRowStart: !0,
+ gridColumn: !0,
+ gridColumnEnd: !0,
+ gridColumnSpan: !0,
+ gridColumnStart: !0,
+ fontWeight: !0,
+ lineClamp: !0,
+ lineHeight: !0,
+ opacity: !0,
+ order: !0,
+ orphans: !0,
+ tabSize: !0,
+ widows: !0,
+ zIndex: !0,
+ zoom: !0,
+ fillOpacity: !0,
+ floodOpacity: !0,
+ stopOpacity: !0,
+ strokeDasharray: !0,
+ strokeDashoffset: !0,
+ strokeMiterlimit: !0,
+ strokeOpacity: !0,
+ strokeWidth: !0
+ }, eg = [ "Webkit", "ms", "Moz", "O" ];
+ Object.keys(dg).forEach(function(a) {
+ eg.forEach(function(b) {
+ b = b + a.charAt(0).toUpperCase() + a.substring(1), dg[b] = dg[a];
+ });
+ });
+ var gg = B({
+ menuitem: !0
+ }, {
+ area: !0,
+ base: !0,
+ br: !0,
+ col: !0,
+ embed: !0,
+ hr: !0,
+ img: !0,
+ input: !0,
+ keygen: !0,
+ link: !0,
+ meta: !0,
+ param: !0,
+ source: !0,
+ track: !0,
+ wbr: !0
+ }), jg = Yf.html, kg = C.thatReturns(""), mg = {
+ topAbort: "abort",
+ topCanPlay: "canplay",
+ topCanPlayThrough: "canplaythrough",
+ topDurationChange: "durationchange",
+ topEmptied: "emptied",
+ topEncrypted: "encrypted",
+ topEnded: "ended",
+ topError: "error",
+ topLoadedData: "loadeddata",
+ topLoadedMetadata: "loadedmetadata",
+ topLoadStart: "loadstart",
+ topPause: "pause",
+ topPlay: "play",
+ topPlaying: "playing",
+ topProgress: "progress",
+ topRateChange: "ratechange",
+ topSeeked: "seeked",
+ topSeeking: "seeking",
+ topStalled: "stalled",
+ topSuspend: "suspend",
+ topTimeUpdate: "timeupdate",
+ topVolumeChange: "volumechange",
+ topWaiting: "waiting"
+ }, wg = Object.freeze({
+ createElement: ng,
+ createTextNode: og,
+ setInitialProperties: pg,
+ diffProperties: sg,
+ updateProperties: tg,
+ diffHydratedProperties: ug,
+ diffHydratedText: vg,
+ warnForUnmatchedText: function() {},
+ warnForDeletedHydratableElement: function() {},
+ warnForDeletedHydratableText: function() {},
+ warnForInsertedHydratedElement: function() {},
+ warnForInsertedHydratedText: function() {},
+ restoreControlledState: function(a, b, c) {
+ switch (b) {
+ case "input":
+ if (Of(a, c), b = c.name, "radio" === c.type && null != b) {
+ for (c = a; c.parentNode; ) c = c.parentNode;
+ for (c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]'),
+ b = 0; b < c.length; b++) {
+ var d = c[b];
+ if (d !== a && d.form === a.form) {
+ var e = rb(d);
+ e || E("90"), Cc(d), Of(d, e);
+ }
+ }
+ }
+ break;
+
+ case "textarea":
+ Wf(a, c);
+ break;
+
+ case "select":
+ null != (b = c.value) && Sf(a, !!c.multiple, b, !1);
+ }
+ }
+ });
+ nc.injectFiberControlledHostComponent(wg);
+ var xg = null, Mg = null, Z = of({
+ getRootHostContext: function(a) {
+ var b = a.nodeType;
+ switch (b) {
+ case 9:
+ case 11:
+ a = (a = a.documentElement) ? a.namespaceURI : $f(null, "");
+ break;
+
+ default:
+ b = 8 === b ? a.parentNode : a, a = b.namespaceURI || null, b = b.tagName, a = $f(a, b);
+ }
+ return a;
+ },
+ getChildHostContext: function(a, b) {
+ return $f(a, b);
+ },
+ getPublicInstance: function(a) {
+ return a;
+ },
+ prepareForCommit: function() {
+ xg = td;
+ var a = da();
+ if (Kd(a)) {
+ if ("selectionStart" in a) var b = {
+ start: a.selectionStart,
+ end: a.selectionEnd
+ }; else a: {
+ var c = window.getSelection && window.getSelection();
+ if (c && 0 !== c.rangeCount) {
+ b = c.anchorNode;
+ var d = c.anchorOffset, e = c.focusNode;
+ c = c.focusOffset;
+ try {
+ b.nodeType, e.nodeType;
+ } catch (z) {
+ b = null;
+ break a;
+ }
+ var f = 0, g = -1, h = -1, k = 0, q = 0, v = a, y = null;
+ b: for (;;) {
+ for (var u; v !== b || 0 !== d && 3 !== v.nodeType || (g = f + d), v !== e || 0 !== c && 3 !== v.nodeType || (h = f + c),
+ 3 === v.nodeType && (f += v.nodeValue.length), null !== (u = v.firstChild); ) y = v,
+ v = u;
+ for (;;) {
+ if (v === a) break b;
+ if (y === b && ++k === d && (g = f), y === e && ++q === c && (h = f), null !== (u = v.nextSibling)) break;
+ v = y, y = v.parentNode;
+ }
+ v = u;
+ }
+ b = -1 === g || -1 === h ? null : {
+ start: g,
+ end: h
+ };
+ } else b = null;
+ }
+ b = b || {
+ start: 0,
+ end: 0
+ };
+ } else b = null;
+ Mg = {
+ focusedElem: a,
+ selectionRange: b
+ }, ud(!1);
+ },
+ resetAfterCommit: function() {
+ var a = Mg, b = da(), c = a.focusedElem, d = a.selectionRange;
+ if (b !== c && fa(document.documentElement, c)) {
+ if (Kd(c)) if (b = d.start, a = d.end, void 0 === a && (a = b), "selectionStart" in c) c.selectionStart = b,
+ c.selectionEnd = Math.min(a, c.value.length); else if (window.getSelection) {
+ b = window.getSelection();
+ var e = c[Eb()].length;
+ a = Math.min(d.start, e), d = void 0 === d.end ? a : Math.min(d.end, e), !b.extend && a > d && (e = d,
+ d = a, a = e), e = Jd(c, a);
+ var f = Jd(c, d);
+ if (e && f && (1 !== b.rangeCount || b.anchorNode !== e.node || b.anchorOffset !== e.offset || b.focusNode !== f.node || b.focusOffset !== f.offset)) {
+ var g = document.createRange();
+ g.setStart(e.node, e.offset), b.removeAllRanges(), a > d ? (b.addRange(g), b.extend(f.node, f.offset)) : (g.setEnd(f.node, f.offset),
+ b.addRange(g));
+ }
+ }
+ for (b = [], a = c; a = a.parentNode; ) 1 === a.nodeType && b.push({
+ element: a,
+ left: a.scrollLeft,
+ top: a.scrollTop
+ });
+ for (ia(c), c = 0; c < b.length; c++) a = b[c], a.element.scrollLeft = a.left, a.element.scrollTop = a.top;
+ }
+ Mg = null, ud(xg), xg = null;
+ },
+ createInstance: function(a, b, c, d, e) {
+ return a = ng(a, b, c, d), a[Q] = e, a[ob] = b, a;
+ },
+ appendInitialChild: function(a, b) {
+ a.appendChild(b);
+ },
+ finalizeInitialChildren: function(a, b, c, d) {
+ pg(a, b, c, d);
+ a: {
+ switch (b) {
+ case "button":
+ case "input":
+ case "select":
+ case "textarea":
+ a = !!c.autoFocus;
+ break a;
+ }
+ a = !1;
+ }
+ return a;
+ },
+ prepareUpdate: function(a, b, c, d, e) {
+ return sg(a, b, c, d, e);
+ },
+ shouldSetTextContent: function(a, b) {
+ return "textarea" === a || "string" == typeof b.children || "number" == typeof b.children || "object" == typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && "string" == typeof b.dangerouslySetInnerHTML.__html;
+ },
+ shouldDeprioritizeSubtree: function(a, b) {
+ return !!b.hidden;
+ },
+ createTextInstance: function(a, b, c, d) {
+ return a = og(a, b), a[Q] = d, a;
+ },
+ now: rf,
+ mutation: {
+ commitMount: function(a) {
+ a.focus();
+ },
+ commitUpdate: function(a, b, c, d, e) {
+ a[ob] = e, tg(a, b, c, d, e);
+ },
+ resetTextContent: function(a) {
+ a.textContent = "";
+ },
+ commitTextUpdate: function(a, b, c) {
+ a.nodeValue = c;
+ },
+ appendChild: function(a, b) {
+ a.appendChild(b);
+ },
+ appendChildToContainer: function(a, b) {
+ 8 === a.nodeType ? a.parentNode.insertBefore(b, a) : a.appendChild(b);
+ },
+ insertBefore: function(a, b, c) {
+ a.insertBefore(b, c);
+ },
+ insertInContainerBefore: function(a, b, c) {
+ 8 === a.nodeType ? a.parentNode.insertBefore(b, c) : a.insertBefore(b, c);
+ },
+ removeChild: function(a, b) {
+ a.removeChild(b);
+ },
+ removeChildFromContainer: function(a, b) {
+ 8 === a.nodeType ? a.parentNode.removeChild(b) : a.removeChild(b);
+ }
+ },
+ hydration: {
+ canHydrateInstance: function(a, b) {
+ return 1 !== a.nodeType || b.toLowerCase() !== a.nodeName.toLowerCase() ? null : a;
+ },
+ canHydrateTextInstance: function(a, b) {
+ return "" === b || 3 !== a.nodeType ? null : a;
+ },
+ getNextHydratableSibling: function(a) {
+ for (a = a.nextSibling; a && 1 !== a.nodeType && 3 !== a.nodeType; ) a = a.nextSibling;
+ return a;
+ },
+ getFirstHydratableChild: function(a) {
+ for (a = a.firstChild; a && 1 !== a.nodeType && 3 !== a.nodeType; ) a = a.nextSibling;
+ return a;
+ },
+ hydrateInstance: function(a, b, c, d, e, f) {
+ return a[Q] = f, a[ob] = c, ug(a, b, c, e, d);
+ },
+ hydrateTextInstance: function(a, b, c) {
+ return a[Q] = c, vg(a, b);
+ },
+ didNotMatchHydratedContainerTextInstance: function() {},
+ didNotMatchHydratedTextInstance: function() {},
+ didNotHydrateContainerInstance: function() {},
+ didNotHydrateInstance: function() {},
+ didNotFindHydratableContainerInstance: function() {},
+ didNotFindHydratableContainerTextInstance: function() {},
+ didNotFindHydratableInstance: function() {},
+ didNotFindHydratableTextInstance: function() {}
+ },
+ scheduleDeferredCallback: sf,
+ cancelDeferredCallback: tf,
+ useSyncScheduling: !0
+ });
+ rc = Z.batchedUpdates, Rg.prototype.render = function(a, b) {
+ Z.updateContainer(a, this._reactRootContainer, null, b);
+ }, Rg.prototype.unmount = function(a) {
+ Z.updateContainer(null, this._reactRootContainer, null, a);
+ };
+ var Sg = {
+ createPortal: Qg,
+ findDOMNode: function(a) {
+ if (null == a) return null;
+ if (1 === a.nodeType) return a;
+ var b = a._reactInternalFiber;
+ if (b) return Z.findHostInstance(b);
+ "function" == typeof a.render ? E("188") : E("213", Object.keys(a));
+ },
+ hydrate: function(a, b, c) {
+ return Pg(null, a, b, !0, c);
+ },
+ render: function(a, b, c) {
+ return Pg(null, a, b, !1, c);
+ },
+ unstable_renderSubtreeIntoContainer: function(a, b, c, d) {
+ return (null == a || void 0 === a._reactInternalFiber) && E("38"), Pg(a, b, c, !1, d);
+ },
+ unmountComponentAtNode: function(a) {
+ return Ng(a) || E("40"), !!a._reactRootContainer && (Z.unbatchedUpdates(function() {
+ Pg(null, null, a, !1, function() {
+ a._reactRootContainer = null;
+ });
+ }), !0);
+ },
+ unstable_createPortal: Qg,
+ unstable_batchedUpdates: tc,
+ unstable_deferredUpdates: Z.deferredUpdates,
+ flushSync: Z.flushSync,
+ __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
+ EventPluginHub: mb,
+ EventPluginRegistry: Va,
+ EventPropagators: Cb,
+ ReactControlledComponent: qc,
+ ReactDOMComponentTree: sb,
+ ReactDOMEventListener: xd
+ }
+ };
+ Z.injectIntoDevTools({
+ findFiberByHostInstance: pb,
+ bundleType: 0,
+ version: "16.2.0",
+ rendererPackageName: "react-dom"
+ });
+ var Tg = Object.freeze({
+ default: Sg
+ }), Ug = Tg && Sg || Tg;
+ module.exports = Ug.default ? Ug.default : Ug;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function isTextNode(object) {
+ return isNode(object) && 3 == object.nodeType;
+ }
+ var isNode = __webpack_require__(336);
+ module.exports = isTextNode;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function isNode(object) {
+ var doc = object ? object.ownerDocument || object : document, defaultView = doc.defaultView || window;
+ return !(!object || !("function" == typeof defaultView.Node ? object instanceof defaultView.Node : "object" == typeof object && "number" == typeof object.nodeType && "string" == typeof object.nodeName));
+ }
+ module.exports = isNode;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ "production" !== process.env.NODE_ENV && function() {
+ function checkMask(value, bitmask) {
+ return (value & bitmask) === bitmask;
+ }
+ function shouldSetAttribute(name, value) {
+ if (isReservedProp(name)) return !1;
+ if (name.length > 2 && ("o" === name[0] || "O" === name[0]) && ("n" === name[1] || "N" === name[1])) return !1;
+ if (null === value) return !0;
+ switch (typeof value) {
+ case "boolean":
+ return shouldAttributeAcceptBooleanValue(name);
+
+ case "undefined":
+ case "number":
+ case "string":
+ case "object":
+ return !0;
+
+ default:
+ return !1;
+ }
+ }
+ function getPropertyInfo(name) {
+ return properties.hasOwnProperty(name) ? properties[name] : null;
+ }
+ function shouldAttributeAcceptBooleanValue(name) {
+ if (isReservedProp(name)) return !0;
+ var propertyInfo = getPropertyInfo(name);
+ if (propertyInfo) return propertyInfo.hasBooleanValue || propertyInfo.hasStringBooleanValue || propertyInfo.hasOverloadedBooleanValue;
+ var prefix = name.toLowerCase().slice(0, 5);
+ return "data-" === prefix || "aria-" === prefix;
+ }
+ function isReservedProp(name) {
+ return RESERVED_PROPS.hasOwnProperty(name);
+ }
+ function recomputePluginOrdering() {
+ if (eventPluginOrder) for (var pluginName in namesToPlugins) {
+ var pluginModule = namesToPlugins[pluginName], pluginIndex = eventPluginOrder.indexOf(pluginName);
+ if (pluginIndex > -1 || invariant(!1, "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, ` + ("`" + `%s`)))) + ((("`" + (`.", pluginName),
+ !plugins[pluginIndex]) {
+ pluginModule.extractEvents || invariant(!1, "EventPluginRegistry: Event plugins must implement an ` + "`")) + (`extractEvents` + ("`" + ` method, but `))) + (("`" + (`%s` + "`")) + (` does not.", pluginName),
+ plugins[pluginIndex] = pluginModule;
+ var publishedEvents = pluginModule.eventTypes;
+ for (var eventName in publishedEvents) publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) || invariant(!1, "EventPluginRegistry: Failed to publish event ` + ("`" + `%s`))))) + (((("`" + (` for plugin ` + "`")) + (`%s` + ("`" + `.", eventName, pluginName);
+ }
+ }
+ }
+ function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
+ eventNameDispatchConfigs.hasOwnProperty(eventName) && invariant(!1, "EventPluginHub: More than one plugin attempted to publish the same event name, `))) + (("`" + (`%s` + "`")) + (`.", eventName),
+ eventNameDispatchConfigs[eventName] = dispatchConfig;
+ var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
+ if (phasedRegistrationNames) {
+ for (var phaseName in phasedRegistrationNames) if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
+ var phasedRegistrationName = phasedRegistrationNames[phaseName];
+ publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
+ }
+ return !0;
+ }
+ return !!dispatchConfig.registrationName && (publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName),
+ !0);
+ }
+ function publishRegistrationName(registrationName, pluginModule, eventName) {
+ registrationNameModules[registrationName] && invariant(!1, "EventPluginHub: More than one plugin attempted to publish the same registration name, ` + ("`" + `%s`)))) + ((("`" + (`.", registrationName),
+ registrationNameModules[registrationName] = pluginModule, registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
+ var lowerCasedName = registrationName.toLowerCase();
+ possibleRegistrationNames[lowerCasedName] = registrationName, "onDoubleClick" === registrationName && (possibleRegistrationNames.ondblclick = registrationName);
+ }
+ function injectEventPluginOrder(injectedEventPluginOrder) {
+ eventPluginOrder && invariant(!1, "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."),
+ eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder), recomputePluginOrdering();
+ }
+ function injectEventPluginsByName(injectedNamesToPlugins) {
+ var isOrderingDirty = !1;
+ for (var pluginName in injectedNamesToPlugins) if (injectedNamesToPlugins.hasOwnProperty(pluginName)) {
+ var pluginModule = injectedNamesToPlugins[pluginName];
+ namesToPlugins.hasOwnProperty(pluginName) && namesToPlugins[pluginName] === pluginModule || (namesToPlugins[pluginName] && invariant(!1, "EventPluginRegistry: Cannot inject two different event plugins using the same name, ` + "`")) + (`%s` + ("`" + `.", pluginName),
+ namesToPlugins[pluginName] = pluginModule, isOrderingDirty = !0);
+ }
+ isOrderingDirty && recomputePluginOrdering();
+ }
+ function executeDispatch(event, simulated, listener, inst) {
+ var type = event.type || "unknown-event";
+ event.currentTarget = getNodeFromInstance(inst), ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(type, listener, void 0, event),
+ event.currentTarget = null;
+ }
+ function executeDispatchesInOrder(event, simulated) {
+ var dispatchListeners = event._dispatchListeners, dispatchInstances = event._dispatchInstances;
+ if (validateEventDispatches(event), Array.isArray(dispatchListeners)) for (var i = 0; i < dispatchListeners.length && !event.isPropagationStopped(); i++) executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]); else dispatchListeners && executeDispatch(event, simulated, dispatchListeners, dispatchInstances);
+ event._dispatchListeners = null, event._dispatchInstances = null;
+ }
+ function accumulateInto(current, next) {
+ return null == next && invariant(!1, "accumulateInto(...): Accumulated items must not be null or undefined."),
+ null == current ? next : Array.isArray(current) ? Array.isArray(next) ? (current.push.apply(current, next),
+ current) : (current.push(next), current) : Array.isArray(next) ? [ current ].concat(next) : [ current, next ];
+ }
+ function forEachAccumulated(arr, cb, scope) {
+ Array.isArray(arr) ? arr.forEach(cb, scope) : arr && cb.call(scope, arr);
+ }
+ function isInteractive(tag) {
+ return "button" === tag || "input" === tag || "select" === tag || "textarea" === tag;
+ }
+ function shouldPreventMouseEvent(name, type, props) {
+ switch (name) {
+ case "onClick":
+ case "onClickCapture":
+ case "onDoubleClick":
+ case "onDoubleClickCapture":
+ case "onMouseDown":
+ case "onMouseDownCapture":
+ case "onMouseMove":
+ case "onMouseMoveCapture":
+ case "onMouseUp":
+ case "onMouseUpCapture":
+ return !(!props.disabled || !isInteractive(type));
+
+ default:
+ return !1;
+ }
+ }
+ function getListener(inst, registrationName) {
+ var listener, stateNode = inst.stateNode;
+ if (!stateNode) return null;
+ var props = getFiberCurrentPropsFromNode(stateNode);
+ return props ? (listener = props[registrationName], shouldPreventMouseEvent(registrationName, inst.type, props) ? null : (listener && "function" != typeof listener && invariant(!1, "Expected `))) + (("`" + (`%s` + "`")) + (` listener to be a function, instead got a value of ` + ("`" + `%s`)))))) + ((((("`" + (` type.", registrationName, typeof listener),
+ listener)) : null;
+ }
+ function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ for (var events, i = 0; i < plugins.length; i++) {
+ var possiblePlugin = plugins[i];
+ if (possiblePlugin) {
+ var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+ extractedEvents && (events = accumulateInto(events, extractedEvents));
+ }
+ }
+ return events;
+ }
+ function enqueueEvents(events) {
+ events && (eventQueue = accumulateInto(eventQueue, events));
+ }
+ function processEventQueue(simulated) {
+ var processingEventQueue = eventQueue;
+ eventQueue = null, processingEventQueue && (simulated ? forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated) : forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel),
+ eventQueue && invariant(!1, "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented."),
+ ReactErrorUtils.rethrowCaughtError());
+ }
+ function precacheFiberNode$1(hostInst, node) {
+ node[internalInstanceKey] = hostInst;
+ }
+ function getClosestInstanceFromNode(node) {
+ if (node[internalInstanceKey]) return node[internalInstanceKey];
+ for (var parents = []; !node[internalInstanceKey]; ) {
+ if (parents.push(node), !node.parentNode) return null;
+ node = node.parentNode;
+ }
+ var closest = void 0, inst = node[internalInstanceKey];
+ if (inst.tag === HostComponent || inst.tag === HostText) return inst;
+ for (;node && (inst = node[internalInstanceKey]); node = parents.pop()) closest = inst;
+ return closest;
+ }
+ function getInstanceFromNode$1(node) {
+ var inst = node[internalInstanceKey];
+ return inst && (inst.tag === HostComponent || inst.tag === HostText) ? inst : null;
+ }
+ function getNodeFromInstance$1(inst) {
+ if (inst.tag === HostComponent || inst.tag === HostText) return inst.stateNode;
+ invariant(!1, "getNodeFromInstance: Invalid argument.");
+ }
+ function getFiberCurrentPropsFromNode$1(node) {
+ return node[internalEventHandlersKey] || null;
+ }
+ function updateFiberProps$1(node, props) {
+ node[internalEventHandlersKey] = props;
+ }
+ function getParent(inst) {
+ do {
+ inst = inst.return;
+ } while (inst && inst.tag !== HostComponent);
+ return inst || null;
+ }
+ function getLowestCommonAncestor(instA, instB) {
+ for (var depthA = 0, tempA = instA; tempA; tempA = getParent(tempA)) depthA++;
+ for (var depthB = 0, tempB = instB; tempB; tempB = getParent(tempB)) depthB++;
+ for (;depthA - depthB > 0; ) instA = getParent(instA), depthA--;
+ for (;depthB - depthA > 0; ) instB = getParent(instB), depthB--;
+ for (var depth = depthA; depth--; ) {
+ if (instA === instB || instA === instB.alternate) return instA;
+ instA = getParent(instA), instB = getParent(instB);
+ }
+ return null;
+ }
+ function getParentInstance(inst) {
+ return getParent(inst);
+ }
+ function traverseTwoPhase(inst, fn, arg) {
+ for (var path = []; inst; ) path.push(inst), inst = getParent(inst);
+ var i;
+ for (i = path.length; i-- > 0; ) fn(path[i], "captured", arg);
+ for (i = 0; i < path.length; i++) fn(path[i], "bubbled", arg);
+ }
+ function traverseEnterLeave(from, to, fn, argFrom, argTo) {
+ for (var common = from && to ? getLowestCommonAncestor(from, to) : null, pathFrom = []; ;) {
+ if (!from) break;
+ if (from === common) break;
+ var alternate = from.alternate;
+ if (null !== alternate && alternate === common) break;
+ pathFrom.push(from), from = getParent(from);
+ }
+ for (var pathTo = []; ;) {
+ if (!to) break;
+ if (to === common) break;
+ var _alternate = to.alternate;
+ if (null !== _alternate && _alternate === common) break;
+ pathTo.push(to), to = getParent(to);
+ }
+ for (var i = 0; i < pathFrom.length; i++) fn(pathFrom[i], "bubbled", argFrom);
+ for (var _i = pathTo.length; _i-- > 0; ) fn(pathTo[_i], "captured", argTo);
+ }
+ function listenerAtPhase(inst, event, propagationPhase) {
+ return getListener(inst, event.dispatchConfig.phasedRegistrationNames[propagationPhase]);
+ }
+ function accumulateDirectionalDispatches(inst, phase, event) {
+ warning(inst, "Dispatching inst must not be null");
+ var listener = listenerAtPhase(inst, event, phase);
+ listener && (event._dispatchListeners = accumulateInto(event._dispatchListeners, listener),
+ event._dispatchInstances = accumulateInto(event._dispatchInstances, inst));
+ }
+ function accumulateTwoPhaseDispatchesSingle(event) {
+ event && event.dispatchConfig.phasedRegistrationNames && traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
+ }
+ function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
+ if (event && event.dispatchConfig.phasedRegistrationNames) {
+ var targetInst = event._targetInst;
+ traverseTwoPhase(targetInst ? getParentInstance(targetInst) : null, accumulateDirectionalDispatches, event);
+ }
+ }
+ function accumulateDispatches(inst, ignoredDirection, event) {
+ if (inst && event && event.dispatchConfig.registrationName) {
+ var registrationName = event.dispatchConfig.registrationName, listener = getListener(inst, registrationName);
+ listener && (event._dispatchListeners = accumulateInto(event._dispatchListeners, listener),
+ event._dispatchInstances = accumulateInto(event._dispatchInstances, inst));
+ }
+ }
+ function accumulateDirectDispatchesSingle(event) {
+ event && event.dispatchConfig.registrationName && accumulateDispatches(event._targetInst, null, event);
+ }
+ function accumulateTwoPhaseDispatches(events) {
+ forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
+ }
+ function accumulateTwoPhaseDispatchesSkipTarget(events) {
+ forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);
+ }
+ function accumulateEnterLeaveDispatches(leave, enter, from, to) {
+ traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
+ }
+ function accumulateDirectDispatches(events) {
+ forEachAccumulated(events, accumulateDirectDispatchesSingle);
+ }
+ function getTextContentAccessor() {
+ return !contentKey && ExecutionEnvironment.canUseDOM && (contentKey = "textContent" in document.documentElement ? "textContent" : "innerText"),
+ contentKey;
+ }
+ function initialize(nativeEventTarget) {
+ return compositionState._root = nativeEventTarget, compositionState._startText = getText(),
+ !0;
+ }
+ function reset() {
+ compositionState._root = null, compositionState._startText = null, compositionState._fallbackText = null;
+ }
+ function getData() {
+ if (compositionState._fallbackText) return compositionState._fallbackText;
+ var start, end, startValue = compositionState._startText, startLength = startValue.length, endValue = getText(), endLength = endValue.length;
+ for (start = 0; start < startLength && startValue[start] === endValue[start]; start++) ;
+ var minEnd = startLength - start;
+ for (end = 1; end <= minEnd && startValue[startLength - end] === endValue[endLength - end]; end++) ;
+ var sliceTail = end > 1 ? 1 - end : void 0;
+ return compositionState._fallbackText = endValue.slice(start, sliceTail), compositionState._fallbackText;
+ }
+ function getText() {
+ return "value" in compositionState._root ? compositionState._root.value : compositionState._root[getTextContentAccessor()];
+ }
+ function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
+ delete this.nativeEvent, delete this.preventDefault, delete this.stopPropagation,
+ this.dispatchConfig = dispatchConfig, this._targetInst = targetInst, this.nativeEvent = nativeEvent;
+ var Interface = this.constructor.Interface;
+ for (var propName in Interface) if (Interface.hasOwnProperty(propName)) {
+ delete this[propName];
+ var normalize = Interface[propName];
+ normalize ? this[propName] = normalize(nativeEvent) : "target" === propName ? this.target = nativeEventTarget : this[propName] = nativeEvent[propName];
+ }
+ var defaultPrevented = null != nativeEvent.defaultPrevented ? nativeEvent.defaultPrevented : !1 === nativeEvent.returnValue;
+ return this.isDefaultPrevented = defaultPrevented ? emptyFunction.thatReturnsTrue : emptyFunction.thatReturnsFalse,
+ this.isPropagationStopped = emptyFunction.thatReturnsFalse, this;
+ }
+ function getPooledWarningPropertyDefinition(propName, getVal) {
+ function set(val) {
+ return warn(isFunction ? "setting the method" : "setting the property", "This is effectively a no-op"),
+ val;
+ }
+ function get() {
+ return warn(isFunction ? "accessing the method" : "accessing the property", isFunction ? "This is a no-op function" : "This is set to null"),
+ getVal;
+ }
+ function warn(action, result) {
+ warning(!1, "This synthetic event is reused for performance reasons. If you're seeing this, you're %s ` + "`")) + (`%s` + ("`" + ` on a released/nullified synthetic event. %s. If you must keep the original synthetic event around, use event.persist(). See https://fb.me/react-event-pooling for more information.", action, propName, result);
+ }
+ var isFunction = "function" == typeof getVal;
+ return {
+ configurable: !0,
+ set: set,
+ get: get
+ };
+ }
+ function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {
+ var EventConstructor = this;
+ if (EventConstructor.eventPool.length) {
+ var instance = EventConstructor.eventPool.pop();
+ return EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst),
+ instance;
+ }
+ return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);
+ }
+ function releasePooledEvent(event) {
+ var EventConstructor = this;
+ event instanceof EventConstructor || invariant(!1, "Trying to release an event instance into a pool of a different type."),
+ event.destructor(), EventConstructor.eventPool.length < EVENT_POOL_SIZE && EventConstructor.eventPool.push(event);
+ }
+ function addEventPoolingTo(EventConstructor) {
+ EventConstructor.eventPool = [], EventConstructor.getPooled = getPooledEvent, EventConstructor.release = releasePooledEvent;
+ }
+ function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function isKeypressCommand(nativeEvent) {
+ return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && !(nativeEvent.ctrlKey && nativeEvent.altKey);
+ }
+ function getCompositionEventType(topLevelType) {
+ switch (topLevelType) {
+ case "topCompositionStart":
+ return eventTypes.compositionStart;
+
+ case "topCompositionEnd":
+ return eventTypes.compositionEnd;
+
+ case "topCompositionUpdate":
+ return eventTypes.compositionUpdate;
+ }
+ }
+ function isFallbackCompositionStart(topLevelType, nativeEvent) {
+ return "topKeyDown" === topLevelType && nativeEvent.keyCode === START_KEYCODE;
+ }
+ function isFallbackCompositionEnd(topLevelType, nativeEvent) {
+ switch (topLevelType) {
+ case "topKeyUp":
+ return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);
+
+ case "topKeyDown":
+ return nativeEvent.keyCode !== START_KEYCODE;
+
+ case "topKeyPress":
+ case "topMouseDown":
+ case "topBlur":
+ return !0;
+
+ default:
+ return !1;
+ }
+ }
+ function getDataFromCustomEvent(nativeEvent) {
+ var detail = nativeEvent.detail;
+ return "object" == typeof detail && "data" in detail ? detail.data : null;
+ }
+ function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var eventType, fallbackData;
+ if (canUseCompositionEvent ? eventType = getCompositionEventType(topLevelType) : isComposing ? isFallbackCompositionEnd(topLevelType, nativeEvent) && (eventType = eventTypes.compositionEnd) : isFallbackCompositionStart(topLevelType, nativeEvent) && (eventType = eventTypes.compositionStart),
+ !eventType) return null;
+ useFallbackCompositionData && (isComposing || eventType !== eventTypes.compositionStart ? eventType === eventTypes.compositionEnd && isComposing && (fallbackData = getData()) : isComposing = initialize(nativeEventTarget));
+ var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
+ if (fallbackData) event.data = fallbackData; else {
+ var customData = getDataFromCustomEvent(nativeEvent);
+ null !== customData && (event.data = customData);
+ }
+ return accumulateTwoPhaseDispatches(event), event;
+ }
+ function getNativeBeforeInputChars(topLevelType, nativeEvent) {
+ switch (topLevelType) {
+ case "topCompositionEnd":
+ return getDataFromCustomEvent(nativeEvent);
+
+ case "topKeyPress":
+ return nativeEvent.which !== SPACEBAR_CODE ? null : (hasSpaceKeypress = !0, SPACEBAR_CHAR);
+
+ case "topTextInput":
+ var chars = nativeEvent.data;
+ return chars === SPACEBAR_CHAR && hasSpaceKeypress ? null : chars;
+
+ default:
+ return null;
+ }
+ }
+ function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
+ if (isComposing) {
+ if ("topCompositionEnd" === topLevelType || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+ var chars = getData();
+ return reset(), isComposing = !1, chars;
+ }
+ return null;
+ }
+ switch (topLevelType) {
+ case "topPaste":
+ return null;
+
+ case "topKeyPress":
+ if (!isKeypressCommand(nativeEvent)) {
+ if (nativeEvent.char && nativeEvent.char.length > 1) return nativeEvent.char;
+ if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);
+ }
+ return null;
+
+ case "topCompositionEnd":
+ return useFallbackCompositionData ? null : nativeEvent.data;
+
+ default:
+ return null;
+ }
+ }
+ function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var chars;
+ if (!(chars = canUseTextInputEvent ? getNativeBeforeInputChars(topLevelType, nativeEvent) : getFallbackBeforeInputChars(topLevelType, nativeEvent))) return null;
+ var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);
+ return event.data = chars, accumulateTwoPhaseDispatches(event), event;
+ }
+ function restoreStateOfTarget(target) {
+ var internalInstance = getInstanceFromNode(target);
+ if (internalInstance) {
+ fiberHostComponent && "function" == typeof fiberHostComponent.restoreControlledState || invariant(!1, "Fiber needs to be injected to handle a fiber target for controlled events. This error is likely caused by a bug in React. Please file an issue.");
+ var props = getFiberCurrentPropsFromNode(internalInstance.stateNode);
+ fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);
+ }
+ }
+ function enqueueStateRestore(target) {
+ restoreTarget ? restoreQueue ? restoreQueue.push(target) : restoreQueue = [ target ] : restoreTarget = target;
+ }
+ function restoreStateIfNeeded() {
+ if (restoreTarget) {
+ var target = restoreTarget, queuedTargets = restoreQueue;
+ if (restoreTarget = null, restoreQueue = null, restoreStateOfTarget(target), queuedTargets) for (var i = 0; i < queuedTargets.length; i++) restoreStateOfTarget(queuedTargets[i]);
+ }
+ }
+ function batchedUpdates(fn, bookkeeping) {
+ if (isNestingBatched) return fiberBatchedUpdates(fn, bookkeeping);
+ isNestingBatched = !0;
+ try {
+ return fiberBatchedUpdates(fn, bookkeeping);
+ } finally {
+ isNestingBatched = !1, restoreStateIfNeeded();
+ }
+ }
+ function isTextInputElement(elem) {
+ var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
+ return "input" === nodeName ? !!supportedInputTypes[elem.type] : "textarea" === nodeName;
+ }
+ function getEventTarget(nativeEvent) {
+ var target = nativeEvent.target || nativeEvent.srcElement || window;
+ return target.correspondingUseElement && (target = target.correspondingUseElement),
+ target.nodeType === TEXT_NODE ? target.parentNode : target;
+ }
+ function isEventSupported(eventNameSuffix, capture) {
+ if (!ExecutionEnvironment.canUseDOM || capture && !("addEventListener" in document)) return !1;
+ var eventName = "on" + eventNameSuffix, isSupported = eventName in document;
+ if (!isSupported) {
+ var element = document.createElement("div");
+ element.setAttribute(eventName, "return;"), isSupported = "function" == typeof element[eventName];
+ }
+ return !isSupported && useHasFeature && "wheel" === eventNameSuffix && (isSupported = document.implementation.hasFeature("Events.wheel", "3.0")),
+ isSupported;
+ }
+ function isCheckable(elem) {
+ var type = elem.type, nodeName = elem.nodeName;
+ return nodeName && "input" === nodeName.toLowerCase() && ("checkbox" === type || "radio" === type);
+ }
+ function getTracker(node) {
+ return node._valueTracker;
+ }
+ function detachTracker(node) {
+ node._valueTracker = null;
+ }
+ function getValueFromNode(node) {
+ var value = "";
+ return node ? value = isCheckable(node) ? node.checked ? "true" : "false" : node.value : value;
+ }
+ function trackValueOnNode(node) {
+ var valueField = isCheckable(node) ? "checked" : "value", descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField), currentValue = "" + node[valueField];
+ if (!node.hasOwnProperty(valueField) && "function" == typeof descriptor.get && "function" == typeof descriptor.set) {
+ Object.defineProperty(node, valueField, {
+ enumerable: descriptor.enumerable,
+ configurable: !0,
+ get: function() {
+ return descriptor.get.call(this);
+ },
+ set: function(value) {
+ currentValue = "" + value, descriptor.set.call(this, value);
+ }
+ });
+ return {
+ getValue: function() {
+ return currentValue;
+ },
+ setValue: function(value) {
+ currentValue = "" + value;
+ },
+ stopTracking: function() {
+ detachTracker(node), delete node[valueField];
+ }
+ };
+ }
+ }
+ function track(node) {
+ getTracker(node) || (node._valueTracker = trackValueOnNode(node));
+ }
+ function updateValueIfChanged(node) {
+ if (!node) return !1;
+ var tracker = getTracker(node);
+ if (!tracker) return !0;
+ var lastValue = tracker.getValue(), nextValue = getValueFromNode(node);
+ return nextValue !== lastValue && (tracker.setValue(nextValue), !0);
+ }
+ function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
+ var event = SyntheticEvent$1.getPooled(eventTypes$1.change, inst, nativeEvent, target);
+ return event.type = "change", enqueueStateRestore(target), accumulateTwoPhaseDispatches(event),
+ event;
+ }
+ function shouldUseChangeEvent(elem) {
+ var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
+ return "select" === nodeName || "input" === nodeName && "file" === elem.type;
+ }
+ function manualDispatchChangeEvent(nativeEvent) {
+ batchedUpdates(runEventInBatch, createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)));
+ }
+ function runEventInBatch(event) {
+ enqueueEvents(event), processEventQueue(!1);
+ }
+ function getInstIfValueChanged(targetInst) {
+ if (updateValueIfChanged(getNodeFromInstance$1(targetInst))) return targetInst;
+ }
+ function getTargetInstForChangeEvent(topLevelType, targetInst) {
+ if ("topChange" === topLevelType) return targetInst;
+ }
+ function startWatchingForValueChange(target, targetInst) {
+ activeElement = target, activeElementInst = targetInst, activeElement.attachEvent("onpropertychange", handlePropertyChange);
+ }
+ function stopWatchingForValueChange() {
+ activeElement && (activeElement.detachEvent("onpropertychange", handlePropertyChange),
+ activeElement = null, activeElementInst = null);
+ }
+ function handlePropertyChange(nativeEvent) {
+ "value" === nativeEvent.propertyName && getInstIfValueChanged(activeElementInst) && manualDispatchChangeEvent(nativeEvent);
+ }
+ function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
+ "topFocus" === topLevelType ? (stopWatchingForValueChange(), startWatchingForValueChange(target, targetInst)) : "topBlur" === topLevelType && stopWatchingForValueChange();
+ }
+ function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
+ if ("topSelectionChange" === topLevelType || "topKeyUp" === topLevelType || "topKeyDown" === topLevelType) return getInstIfValueChanged(activeElementInst);
+ }
+ function shouldUseClickEvent(elem) {
+ var nodeName = elem.nodeName;
+ return nodeName && "input" === nodeName.toLowerCase() && ("checkbox" === elem.type || "radio" === elem.type);
+ }
+ function getTargetInstForClickEvent(topLevelType, targetInst) {
+ if ("topClick" === topLevelType) return getInstIfValueChanged(targetInst);
+ }
+ function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
+ if ("topInput" === topLevelType || "topChange" === topLevelType) return getInstIfValueChanged(targetInst);
+ }
+ function handleControlledInputBlur(inst, node) {
+ if (null != inst) {
+ var state = inst._wrapperState || node._wrapperState;
+ if (state && state.controlled && "number" === node.type) {
+ var value = "" + node.value;
+ node.getAttribute("value") !== value && node.setAttribute("value", value);
+ }
+ }
+ }
+ function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function modifierStateGetter(keyArg) {
+ var syntheticEvent = this, nativeEvent = syntheticEvent.nativeEvent;
+ if (nativeEvent.getModifierState) return nativeEvent.getModifierState(keyArg);
+ var keyProp = modifierKeyToProp[keyArg];
+ return !!keyProp && !!nativeEvent[keyProp];
+ }
+ function getEventModifierState(nativeEvent) {
+ return modifierStateGetter;
+ }
+ function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function get(key) {
+ return key._reactInternalFiber;
+ }
+ function has(key) {
+ return void 0 !== key._reactInternalFiber;
+ }
+ function set(key, value) {
+ key._reactInternalFiber = value;
+ }
+ function getComponentName(fiber) {
+ var type = fiber.type;
+ return "string" == typeof type ? type : "function" == typeof type ? type.displayName || type.name : null;
+ }
+ function isFiberMountedImpl(fiber) {
+ var node = fiber;
+ if (fiber.alternate) for (;node.return; ) node = node.return; else {
+ if ((node.effectTag & Placement) !== NoEffect) return MOUNTING;
+ for (;node.return; ) if (node = node.return, (node.effectTag & Placement) !== NoEffect) return MOUNTING;
+ }
+ return node.tag === HostRoot ? MOUNTED : UNMOUNTED;
+ }
+ function isFiberMounted(fiber) {
+ return isFiberMountedImpl(fiber) === MOUNTED;
+ }
+ function isMounted(component) {
+ var owner = ReactCurrentOwner.current;
+ if (null !== owner && owner.tag === ClassComponent) {
+ var ownerFiber = owner, instance = ownerFiber.stateNode;
+ warning(instance._warnedAboutRefsInRender, "%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", getComponentName(ownerFiber) || "A component"),
+ instance._warnedAboutRefsInRender = !0;
+ }
+ var fiber = get(component);
+ return !!fiber && isFiberMountedImpl(fiber) === MOUNTED;
+ }
+ function assertIsMounted(fiber) {
+ isFiberMountedImpl(fiber) !== MOUNTED && invariant(!1, "Unable to find node on an unmounted component.");
+ }
+ function findCurrentFiberUsingSlowPath(fiber) {
+ var alternate = fiber.alternate;
+ if (!alternate) {
+ var state = isFiberMountedImpl(fiber);
+ return state === UNMOUNTED && invariant(!1, "Unable to find node on an unmounted component."),
+ state === MOUNTING ? null : fiber;
+ }
+ for (var a = fiber, b = alternate; ;) {
+ var parentA = a.return, parentB = parentA ? parentA.alternate : null;
+ if (!parentA || !parentB) break;
+ if (parentA.child === parentB.child) {
+ for (var child = parentA.child; child; ) {
+ if (child === a) return assertIsMounted(parentA), fiber;
+ if (child === b) return assertIsMounted(parentA), alternate;
+ child = child.sibling;
+ }
+ invariant(!1, "Unable to find node on an unmounted component.");
+ }
+ if (a.return !== b.return) a = parentA, b = parentB; else {
+ for (var didFindChild = !1, _child = parentA.child; _child; ) {
+ if (_child === a) {
+ didFindChild = !0, a = parentA, b = parentB;
+ break;
+ }
+ if (_child === b) {
+ didFindChild = !0, b = parentA, a = parentB;
+ break;
+ }
+ _child = _child.sibling;
+ }
+ if (!didFindChild) {
+ for (_child = parentB.child; _child; ) {
+ if (_child === a) {
+ didFindChild = !0, a = parentB, b = parentA;
+ break;
+ }
+ if (_child === b) {
+ didFindChild = !0, b = parentB, a = parentA;
+ break;
+ }
+ _child = _child.sibling;
+ }
+ didFindChild || invariant(!1, "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.");
+ }
+ }
+ a.alternate !== b && invariant(!1, "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ return a.tag !== HostRoot && invariant(!1, "Unable to find node on an unmounted component."),
+ a.stateNode.current === a ? fiber : alternate;
+ }
+ function findCurrentHostFiber(parent) {
+ var currentParent = findCurrentFiberUsingSlowPath(parent);
+ if (!currentParent) return null;
+ for (var node = currentParent; ;) {
+ if (node.tag === HostComponent || node.tag === HostText) return node;
+ if (node.child) node.child.return = node, node = node.child; else {
+ if (node === currentParent) return null;
+ for (;!node.sibling; ) {
+ if (!node.return || node.return === currentParent) return null;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ }
+ return null;
+ }
+ function findCurrentHostFiberWithNoPortals(parent) {
+ var currentParent = findCurrentFiberUsingSlowPath(parent);
+ if (!currentParent) return null;
+ for (var node = currentParent; ;) {
+ if (node.tag === HostComponent || node.tag === HostText) return node;
+ if (node.child && node.tag !== HostPortal) node.child.return = node, node = node.child; else {
+ if (node === currentParent) return null;
+ for (;!node.sibling; ) {
+ if (!node.return || node.return === currentParent) return null;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ }
+ return null;
+ }
+ function findRootContainerNode(inst) {
+ for (;inst.return; ) inst = inst.return;
+ return inst.tag !== HostRoot ? null : inst.stateNode.containerInfo;
+ }
+ function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst) {
+ if (callbackBookkeepingPool.length) {
+ var instance = callbackBookkeepingPool.pop();
+ return instance.topLevelType = topLevelType, instance.nativeEvent = nativeEvent,
+ instance.targetInst = targetInst, instance;
+ }
+ return {
+ topLevelType: topLevelType,
+ nativeEvent: nativeEvent,
+ targetInst: targetInst,
+ ancestors: []
+ };
+ }
+ function releaseTopLevelCallbackBookKeeping(instance) {
+ instance.topLevelType = null, instance.nativeEvent = null, instance.targetInst = null,
+ instance.ancestors.length = 0, callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE && callbackBookkeepingPool.push(instance);
+ }
+ function handleTopLevelImpl(bookKeeping) {
+ var targetInst = bookKeeping.targetInst, ancestor = targetInst;
+ do {
+ if (!ancestor) {
+ bookKeeping.ancestors.push(ancestor);
+ break;
+ }
+ var root = findRootContainerNode(ancestor);
+ if (!root) break;
+ bookKeeping.ancestors.push(ancestor), ancestor = getClosestInstanceFromNode(root);
+ } while (ancestor);
+ for (var i = 0; i < bookKeeping.ancestors.length; i++) targetInst = bookKeeping.ancestors[i],
+ _handleTopLevel(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
+ }
+ function setHandleTopLevel(handleTopLevel) {
+ _handleTopLevel = handleTopLevel;
+ }
+ function setEnabled(enabled) {
+ _enabled = !!enabled;
+ }
+ function isEnabled() {
+ return _enabled;
+ }
+ function trapBubbledEvent(topLevelType, handlerBaseName, element) {
+ return element ? EventListener.listen(element, handlerBaseName, dispatchEvent.bind(null, topLevelType)) : null;
+ }
+ function trapCapturedEvent(topLevelType, handlerBaseName, element) {
+ return element ? EventListener.capture(element, handlerBaseName, dispatchEvent.bind(null, topLevelType)) : null;
+ }
+ function dispatchEvent(topLevelType, nativeEvent) {
+ if (_enabled) {
+ var nativeEventTarget = getEventTarget(nativeEvent), targetInst = getClosestInstanceFromNode(nativeEventTarget);
+ null === targetInst || "number" != typeof targetInst.tag || isFiberMounted(targetInst) || (targetInst = null);
+ var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst);
+ try {
+ batchedUpdates(handleTopLevelImpl, bookKeeping);
+ } finally {
+ releaseTopLevelCallbackBookKeeping(bookKeeping);
+ }
+ }
+ }
+ function makePrefixMap(styleProp, eventName) {
+ var prefixes = {};
+ return prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(), prefixes["Webkit" + styleProp] = "webkit" + eventName,
+ prefixes["Moz" + styleProp] = "moz" + eventName, prefixes["ms" + styleProp] = "MS" + eventName,
+ prefixes["O" + styleProp] = "o" + eventName.toLowerCase(), prefixes;
+ }
+ function getVendorPrefixedEventName(eventName) {
+ if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];
+ if (!vendorPrefixes[eventName]) return eventName;
+ var prefixMap = vendorPrefixes[eventName];
+ for (var styleProp in prefixMap) if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) return prefixedEventNames[eventName] = prefixMap[styleProp];
+ return "";
+ }
+ function runEventQueueInBatch(events) {
+ enqueueEvents(events), processEventQueue(!1);
+ }
+ function handleTopLevel(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ runEventQueueInBatch(extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget));
+ }
+ function getListeningForDocument(mountAt) {
+ return Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey) || (mountAt[topListenersIDKey] = reactTopListenersCounter++,
+ alreadyListeningTo[mountAt[topListenersIDKey]] = {}), alreadyListeningTo[mountAt[topListenersIDKey]];
+ }
+ function listenTo(registrationName, contentDocumentHandle) {
+ for (var mountAt = contentDocumentHandle, isListening = getListeningForDocument(mountAt), dependencies = registrationNameDependencies[registrationName], i = 0; i < dependencies.length; i++) {
+ var dependency = dependencies[i];
+ isListening.hasOwnProperty(dependency) && isListening[dependency] || ("topScroll" === dependency ? trapCapturedEvent("topScroll", "scroll", mountAt) : "topFocus" === dependency || "topBlur" === dependency ? (trapCapturedEvent("topFocus", "focus", mountAt),
+ trapCapturedEvent("topBlur", "blur", mountAt), isListening.topBlur = !0, isListening.topFocus = !0) : "topCancel" === dependency ? (isEventSupported("cancel", !0) && trapCapturedEvent("topCancel", "cancel", mountAt),
+ isListening.topCancel = !0) : "topClose" === dependency ? (isEventSupported("close", !0) && trapCapturedEvent("topClose", "close", mountAt),
+ isListening.topClose = !0) : topLevelTypes.hasOwnProperty(dependency) && trapBubbledEvent(dependency, topLevelTypes[dependency], mountAt),
+ isListening[dependency] = !0);
+ }
+ }
+ function isListeningToAllDependencies(registrationName, mountAt) {
+ for (var isListening = getListeningForDocument(mountAt), dependencies = registrationNameDependencies[registrationName], i = 0; i < dependencies.length; i++) {
+ var dependency = dependencies[i];
+ if (!isListening.hasOwnProperty(dependency) || !isListening[dependency]) return !1;
+ }
+ return !0;
+ }
+ function getLeafNode(node) {
+ for (;node && node.firstChild; ) node = node.firstChild;
+ return node;
+ }
+ function getSiblingNode(node) {
+ for (;node; ) {
+ if (node.nextSibling) return node.nextSibling;
+ node = node.parentNode;
+ }
+ }
+ function getNodeForCharacterOffset(root, offset) {
+ for (var node = getLeafNode(root), nodeStart = 0, nodeEnd = 0; node; ) {
+ if (node.nodeType === TEXT_NODE) {
+ if (nodeEnd = nodeStart + node.textContent.length, nodeStart <= offset && nodeEnd >= offset) return {
+ node: node,
+ offset: offset - nodeStart
+ };
+ nodeStart = nodeEnd;
+ }
+ node = getLeafNode(getSiblingNode(node));
+ }
+ }
+ function getOffsets(outerNode) {
+ var selection = window.getSelection && window.getSelection();
+ if (!selection || 0 === selection.rangeCount) return null;
+ var anchorNode = selection.anchorNode, anchorOffset = selection.anchorOffset, focusNode$$1 = selection.focusNode, focusOffset = selection.focusOffset;
+ try {
+ anchorNode.nodeType, focusNode$$1.nodeType;
+ } catch (e) {
+ return null;
+ }
+ return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode$$1, focusOffset);
+ }
+ function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode$$1, focusOffset) {
+ var length = 0, start = -1, end = -1, indexWithinAnchor = 0, indexWithinFocus = 0, node = outerNode, parentNode = null;
+ outer: for (;;) {
+ for (var next = null; ;) {
+ if (node !== anchorNode || 0 !== anchorOffset && node.nodeType !== TEXT_NODE || (start = length + anchorOffset),
+ node !== focusNode$$1 || 0 !== focusOffset && node.nodeType !== TEXT_NODE || (end = length + focusOffset),
+ node.nodeType === TEXT_NODE && (length += node.nodeValue.length), null === (next = node.firstChild)) break;
+ parentNode = node, node = next;
+ }
+ for (;;) {
+ if (node === outerNode) break outer;
+ if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset && (start = length),
+ parentNode === focusNode$$1 && ++indexWithinFocus === focusOffset && (end = length),
+ null !== (next = node.nextSibling)) break;
+ node = parentNode, parentNode = node.parentNode;
+ }
+ node = next;
+ }
+ return -1 === start || -1 === end ? null : {
+ start: start,
+ end: end
+ };
+ }
+ function setOffsets(node, offsets) {
+ if (window.getSelection) {
+ var selection = window.getSelection(), length = node[getTextContentAccessor()].length, start = Math.min(offsets.start, length), end = void 0 === offsets.end ? start : Math.min(offsets.end, length);
+ if (!selection.extend && start > end) {
+ var temp = end;
+ end = start, start = temp;
+ }
+ var startMarker = getNodeForCharacterOffset(node, start), endMarker = getNodeForCharacterOffset(node, end);
+ if (startMarker && endMarker) {
+ if (1 === selection.rangeCount && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) return;
+ var range = document.createRange();
+ range.setStart(startMarker.node, startMarker.offset), selection.removeAllRanges(),
+ start > end ? (selection.addRange(range), selection.extend(endMarker.node, endMarker.offset)) : (range.setEnd(endMarker.node, endMarker.offset),
+ selection.addRange(range));
+ }
+ }
+ }
+ function isInDocument(node) {
+ return containsNode(document.documentElement, node);
+ }
+ function hasSelectionCapabilities(elem) {
+ var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
+ return nodeName && ("input" === nodeName && "text" === elem.type || "textarea" === nodeName || "true" === elem.contentEditable);
+ }
+ function getSelectionInformation() {
+ var focusedElem = getActiveElement();
+ return {
+ focusedElem: focusedElem,
+ selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection$1(focusedElem) : null
+ };
+ }
+ function restoreSelection(priorSelectionInformation) {
+ var curFocusedElem = getActiveElement(), priorFocusedElem = priorSelectionInformation.focusedElem, priorSelectionRange = priorSelectionInformation.selectionRange;
+ if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
+ hasSelectionCapabilities(priorFocusedElem) && setSelection(priorFocusedElem, priorSelectionRange);
+ for (var ancestors = [], ancestor = priorFocusedElem; ancestor = ancestor.parentNode; ) ancestor.nodeType === ELEMENT_NODE && ancestors.push({
+ element: ancestor,
+ left: ancestor.scrollLeft,
+ top: ancestor.scrollTop
+ });
+ focusNode(priorFocusedElem);
+ for (var i = 0; i < ancestors.length; i++) {
+ var info = ancestors[i];
+ info.element.scrollLeft = info.left, info.element.scrollTop = info.top;
+ }
+ }
+ }
+ function getSelection$1(input) {
+ return ("selectionStart" in input ? {
+ start: input.selectionStart,
+ end: input.selectionEnd
+ } : getOffsets(input)) || {
+ start: 0,
+ end: 0
+ };
+ }
+ function setSelection(input, offsets) {
+ var start = offsets.start, end = offsets.end;
+ void 0 === end && (end = start), "selectionStart" in input ? (input.selectionStart = start,
+ input.selectionEnd = Math.min(end, input.value.length)) : setOffsets(input, offsets);
+ }
+ function getSelection(node) {
+ if ("selectionStart" in node && hasSelectionCapabilities(node)) return {
+ start: node.selectionStart,
+ end: node.selectionEnd
+ };
+ if (window.getSelection) {
+ var selection = window.getSelection();
+ return {
+ anchorNode: selection.anchorNode,
+ anchorOffset: selection.anchorOffset,
+ focusNode: selection.focusNode,
+ focusOffset: selection.focusOffset
+ };
+ }
+ }
+ function constructSelectEvent(nativeEvent, nativeEventTarget) {
+ if (mouseDown || null == activeElement$1 || activeElement$1 !== getActiveElement()) return null;
+ var currentSelection = getSelection(activeElement$1);
+ if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
+ lastSelection = currentSelection;
+ var syntheticEvent = SyntheticEvent$1.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);
+ return syntheticEvent.type = "select", syntheticEvent.target = activeElement$1,
+ accumulateTwoPhaseDispatches(syntheticEvent), syntheticEvent;
+ }
+ return null;
+ }
+ function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function getEventCharCode(nativeEvent) {
+ var charCode, keyCode = nativeEvent.keyCode;
+ return "charCode" in nativeEvent ? 0 === (charCode = nativeEvent.charCode) && 13 === keyCode && (charCode = 13) : charCode = keyCode,
+ charCode >= 32 || 13 === charCode ? charCode : 0;
+ }
+ function getEventKey(nativeEvent) {
+ if (nativeEvent.key) {
+ var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
+ if ("Unidentified" !== key) return key;
+ }
+ if ("keypress" === nativeEvent.type) {
+ var charCode = getEventCharCode(nativeEvent);
+ return 13 === charCode ? "Enter" : String.fromCharCode(charCode);
+ }
+ return "keydown" === nativeEvent.type || "keyup" === nativeEvent.type ? translateToKey[nativeEvent.keyCode] || "Unidentified" : "";
+ }
+ function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
+ return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
+ }
+ function createCursor(defaultValue) {
+ return {
+ current: defaultValue
+ };
+ }
+ function pop(cursor, fiber) {
+ if (index < 0) return void warning(!1, "Unexpected pop.");
+ fiber !== fiberStack[index] && warning(!1, "Unexpected Fiber popped."), cursor.current = valueStack[index],
+ valueStack[index] = null, fiberStack[index] = null, index--;
+ }
+ function push(cursor, value, fiber) {
+ index++, valueStack[index] = cursor.current, fiberStack[index] = fiber, cursor.current = value;
+ }
+ function reset$1() {
+ for (;index > -1; ) valueStack[index] = null, fiberStack[index] = null, index--;
+ }
+ function describeFiber(fiber) {
+ switch (fiber.tag) {
+ case IndeterminateComponent:
+ case FunctionalComponent:
+ case ClassComponent:
+ case HostComponent:
+ var owner = fiber._debugOwner, source = fiber._debugSource, name = getComponentName(fiber), ownerName = null;
+ return owner && (ownerName = getComponentName(owner)), describeComponentFrame(name, source, ownerName);
+
+ default:
+ return "";
+ }
+ }
+ function getStackAddendumByWorkInProgressFiber(workInProgress) {
+ var info = "", node = workInProgress;
+ do {
+ info += describeFiber(node), node = node.return;
+ } while (node);
+ return info;
+ }
+ function getCurrentFiberOwnerName() {
+ var fiber = ReactDebugCurrentFiber.current;
+ if (null === fiber) return null;
+ var owner = fiber._debugOwner;
+ return null !== owner && void 0 !== owner ? getComponentName(owner) : null;
+ }
+ function getCurrentFiberStackAddendum() {
+ var fiber = ReactDebugCurrentFiber.current;
+ return null === fiber ? null : getStackAddendumByWorkInProgressFiber(fiber);
+ }
+ function resetCurrentFiber() {
+ ReactDebugCurrentFrame.getCurrentStack = null, ReactDebugCurrentFiber.current = null,
+ ReactDebugCurrentFiber.phase = null;
+ }
+ function setCurrentFiber(fiber) {
+ ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackAddendum, ReactDebugCurrentFiber.current = fiber,
+ ReactDebugCurrentFiber.phase = null;
+ }
+ function setCurrentPhase(phase) {
+ ReactDebugCurrentFiber.phase = phase;
+ }
+ function recordEffect() {
+ enableUserTimingAPI && effectCountInCurrentCommit++;
+ }
+ function recordScheduleUpdate() {
+ enableUserTimingAPI && (isCommitting && (hasScheduledUpdateInCurrentCommit = !0),
+ null !== currentPhase && "componentWillMount" !== currentPhase && "componentWillReceiveProps" !== currentPhase && (hasScheduledUpdateInCurrentPhase = !0));
+ }
+ function startRequestCallbackTimer() {
+ enableUserTimingAPI && supportsUserTiming && !isWaitingForCallback && (isWaitingForCallback = !0,
+ beginMark("(Waiting for async callback...)"));
+ }
+ function stopRequestCallbackTimer(didExpire) {
+ if (enableUserTimingAPI && supportsUserTiming) {
+ isWaitingForCallback = !1;
+ endMark("(Waiting for async callback...)", "(Waiting for async callback...)", didExpire ? "React was blocked by main thread" : null);
+ }
+ }
+ function startWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;
+ if (currentFiber = fiber, !beginFiberMark(fiber, null)) return;
+ fiber._debugIsCurrentlyTiming = !0;
+ }
+ }
+ function cancelWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;
+ fiber._debugIsCurrentlyTiming = !1, clearFiberMark(fiber, null);
+ }
+ }
+ function stopWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;
+ if (currentFiber = fiber.return, !fiber._debugIsCurrentlyTiming) return;
+ fiber._debugIsCurrentlyTiming = !1, endFiberMark(fiber, null, null);
+ }
+ }
+ function stopFailedWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;
+ if (currentFiber = fiber.return, !fiber._debugIsCurrentlyTiming) return;
+ fiber._debugIsCurrentlyTiming = !1;
+ endFiberMark(fiber, null, "An error was thrown inside this error boundary");
+ }
+ }
+ function startPhaseTimer(fiber, phase) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ if (clearPendingPhaseMeasurement(), !beginFiberMark(fiber, phase)) return;
+ currentPhaseFiber = fiber, currentPhase = phase;
+ }
+ }
+ function stopPhaseTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ if (null !== currentPhase && null !== currentPhaseFiber) {
+ endFiberMark(currentPhaseFiber, currentPhase, hasScheduledUpdateInCurrentPhase ? "Scheduled a cascading update" : null);
+ }
+ currentPhase = null, currentPhaseFiber = null;
+ }
+ }
+ function startWorkLoopTimer(nextUnitOfWork) {
+ if (enableUserTimingAPI) {
+ if (currentFiber = nextUnitOfWork, !supportsUserTiming) return;
+ commitCountInCurrentWorkLoop = 0, beginMark("(React Tree Reconciliation)"), resumeTimers();
+ }
+ }
+ function stopWorkLoopTimer(interruptedBy) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ var warning$$1 = null;
+ if (null !== interruptedBy) if (interruptedBy.tag === HostRoot) warning$$1 = "A top-level update interrupted the previous render"; else {
+ var componentName = getComponentName(interruptedBy) || "Unknown";
+ warning$$1 = "An update to " + componentName + " interrupted the previous render";
+ } else commitCountInCurrentWorkLoop > 1 && (warning$$1 = "There were cascading updates");
+ commitCountInCurrentWorkLoop = 0, pauseTimers(), endMark("(React Tree Reconciliation)", "(React Tree Reconciliation)", warning$$1);
+ }
+ }
+ function startCommitTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ isCommitting = !0, hasScheduledUpdateInCurrentCommit = !1, labelsInCurrentCommit.clear(),
+ beginMark("(Committing Changes)");
+ }
+ }
+ function stopCommitTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ var warning$$1 = null;
+ hasScheduledUpdateInCurrentCommit ? warning$$1 = "Lifecycle hook scheduled a cascading update" : commitCountInCurrentWorkLoop > 0 && (warning$$1 = "Caused by a cascading update in earlier commit"),
+ hasScheduledUpdateInCurrentCommit = !1, commitCountInCurrentWorkLoop++, isCommitting = !1,
+ labelsInCurrentCommit.clear(), endMark("(Committing Changes)", "(Committing Changes)", warning$$1);
+ }
+ }
+ function startCommitHostEffectsTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ effectCountInCurrentCommit = 0, beginMark("(Committing Host Effects)");
+ }
+ }
+ function stopCommitHostEffectsTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ var count = effectCountInCurrentCommit;
+ effectCountInCurrentCommit = 0, endMark("(Committing Host Effects: " + count + " Total)", "(Committing Host Effects)", null);
+ }
+ }
+ function startCommitLifeCyclesTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ effectCountInCurrentCommit = 0, beginMark("(Calling Lifecycle Methods)");
+ }
+ }
+ function stopCommitLifeCyclesTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) return;
+ var count = effectCountInCurrentCommit;
+ effectCountInCurrentCommit = 0, endMark("(Calling Lifecycle Methods: " + count + " Total)", "(Calling Lifecycle Methods)", null);
+ }
+ }
+ function getUnmaskedContext(workInProgress) {
+ return isContextProvider(workInProgress) ? previousContext : contextStackCursor.current;
+ }
+ function cacheContext(workInProgress, unmaskedContext, maskedContext) {
+ var instance = workInProgress.stateNode;
+ instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext, instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
+ }
+ function getMaskedContext(workInProgress, unmaskedContext) {
+ var type = workInProgress.type, contextTypes = type.contextTypes;
+ if (!contextTypes) return emptyObject;
+ var instance = workInProgress.stateNode;
+ if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) return instance.__reactInternalMemoizedMaskedChildContext;
+ var context = {};
+ for (var key in contextTypes) context[key] = unmaskedContext[key];
+ var name = getComponentName(workInProgress) || "Unknown";
+ return checkPropTypes(contextTypes, context, "context", name, ReactDebugCurrentFiber.getCurrentFiberStackAddendum),
+ instance && cacheContext(workInProgress, unmaskedContext, context), context;
+ }
+ function hasContextChanged() {
+ return didPerformWorkStackCursor.current;
+ }
+ function isContextConsumer(fiber) {
+ return fiber.tag === ClassComponent && null != fiber.type.contextTypes;
+ }
+ function isContextProvider(fiber) {
+ return fiber.tag === ClassComponent && null != fiber.type.childContextTypes;
+ }
+ function popContextProvider(fiber) {
+ isContextProvider(fiber) && (pop(didPerformWorkStackCursor, fiber), pop(contextStackCursor, fiber));
+ }
+ function popTopLevelContextObject(fiber) {
+ pop(didPerformWorkStackCursor, fiber), pop(contextStackCursor, fiber);
+ }
+ function pushTopLevelContextObject(fiber, context, didChange) {
+ null != contextStackCursor.cursor && invariant(!1, "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue."),
+ push(contextStackCursor, context, fiber), push(didPerformWorkStackCursor, didChange, fiber);
+ }
+ function processChildContext(fiber, parentContext) {
+ var instance = fiber.stateNode, childContextTypes = fiber.type.childContextTypes;
+ if ("function" != typeof instance.getChildContext) {
+ var componentName = getComponentName(fiber) || "Unknown";
+ return warnedAboutMissingGetChildContext[componentName] || (warnedAboutMissingGetChildContext[componentName] = !0,
+ warning(!1, "%s.childContextTypes is specified but there is no getChildContext() method on the instance. You can either define getChildContext() on %s or remove childContextTypes from it.", componentName, componentName)),
+ parentContext;
+ }
+ var childContext = void 0;
+ ReactDebugCurrentFiber.setCurrentPhase("getChildContext"), startPhaseTimer(fiber, "getChildContext"),
+ childContext = instance.getChildContext(), stopPhaseTimer(), ReactDebugCurrentFiber.setCurrentPhase(null);
+ for (var contextKey in childContext) contextKey in childContextTypes || invariant(!1, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', getComponentName(fiber) || "Unknown", contextKey);
+ var name = getComponentName(fiber) || "Unknown";
+ return checkPropTypes(childContextTypes, childContext, "child context", name, ReactDebugCurrentFiber.getCurrentFiberStackAddendum),
+ _assign({}, parentContext, childContext);
+ }
+ function pushContextProvider(workInProgress) {
+ if (!isContextProvider(workInProgress)) return !1;
+ var instance = workInProgress.stateNode, memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyObject;
+ return previousContext = contextStackCursor.current, push(contextStackCursor, memoizedMergedChildContext, workInProgress),
+ push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress),
+ !0;
+ }
+ function invalidateContextProvider(workInProgress, didChange) {
+ var instance = workInProgress.stateNode;
+ if (instance || invariant(!1, "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue."),
+ didChange) {
+ var mergedContext = processChildContext(workInProgress, previousContext);
+ instance.__reactInternalMemoizedMergedChildContext = mergedContext, pop(didPerformWorkStackCursor, workInProgress),
+ pop(contextStackCursor, workInProgress), push(contextStackCursor, mergedContext, workInProgress),
+ push(didPerformWorkStackCursor, didChange, workInProgress);
+ } else pop(didPerformWorkStackCursor, workInProgress), push(didPerformWorkStackCursor, didChange, workInProgress);
+ }
+ function resetContext() {
+ previousContext = emptyObject, contextStackCursor.current = emptyObject, didPerformWorkStackCursor.current = !1;
+ }
+ function findCurrentUnmaskedContext(fiber) {
+ isFiberMounted(fiber) && fiber.tag === ClassComponent || invariant(!1, "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.");
+ for (var node = fiber; node.tag !== HostRoot; ) {
+ if (isContextProvider(node)) return node.stateNode.__reactInternalMemoizedMergedChildContext;
+ var parent = node.return;
+ parent || invariant(!1, "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue."),
+ node = parent;
+ }
+ return node.stateNode.context;
+ }
+ function msToExpirationTime(ms) {
+ return (ms / UNIT_SIZE | 0) + MAGIC_NUMBER_OFFSET;
+ }
+ function expirationTimeToMs(expirationTime) {
+ return (expirationTime - MAGIC_NUMBER_OFFSET) * UNIT_SIZE;
+ }
+ function ceiling(num, precision) {
+ return (1 + (num / precision | 0)) * precision;
+ }
+ function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {
+ return ceiling(currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);
+ }
+ function FiberNode(tag, key, internalContextTag) {
+ this.tag = tag, this.key = key, this.type = null, this.stateNode = null, this.return = null,
+ this.child = null, this.sibling = null, this.index = 0, this.ref = null, this.pendingProps = null,
+ this.memoizedProps = null, this.updateQueue = null, this.memoizedState = null, this.internalContextTag = internalContextTag,
+ this.effectTag = NoEffect, this.nextEffect = null, this.firstEffect = null, this.lastEffect = null,
+ this.expirationTime = NoWork, this.alternate = null, this._debugID = debugCounter++,
+ this._debugSource = null, this._debugOwner = null, this._debugIsCurrentlyTiming = !1,
+ hasBadMapPolyfill || "function" != typeof Object.preventExtensions || Object.preventExtensions(this);
+ }
+ function shouldConstruct(Component) {
+ return !(!Component.prototype || !Component.prototype.isReactComponent);
+ }
+ function createWorkInProgress(current, pendingProps, expirationTime) {
+ var workInProgress = current.alternate;
+ return null === workInProgress ? (workInProgress = createFiber(current.tag, current.key, current.internalContextTag),
+ workInProgress.type = current.type, workInProgress.stateNode = current.stateNode,
+ workInProgress._debugID = current._debugID, workInProgress._debugSource = current._debugSource,
+ workInProgress._debugOwner = current._debugOwner, workInProgress.alternate = current,
+ current.alternate = workInProgress) : (workInProgress.effectTag = NoEffect, workInProgress.nextEffect = null,
+ workInProgress.firstEffect = null, workInProgress.lastEffect = null), workInProgress.expirationTime = expirationTime,
+ workInProgress.pendingProps = pendingProps, workInProgress.child = current.child,
+ workInProgress.memoizedProps = current.memoizedProps, workInProgress.memoizedState = current.memoizedState,
+ workInProgress.updateQueue = current.updateQueue, workInProgress.sibling = current.sibling,
+ workInProgress.index = current.index, workInProgress.ref = current.ref, workInProgress;
+ }
+ function createHostRootFiber() {
+ return createFiber(HostRoot, null, NoContext);
+ }
+ function createFiberFromElement(element, internalContextTag, expirationTime) {
+ var owner = null;
+ owner = element._owner;
+ var fiber = void 0, type = element.type, key = element.key;
+ if ("function" == typeof type) fiber = shouldConstruct(type) ? createFiber(ClassComponent, key, internalContextTag) : createFiber(IndeterminateComponent, key, internalContextTag),
+ fiber.type = type, fiber.pendingProps = element.props; else if ("string" == typeof type) fiber = createFiber(HostComponent, key, internalContextTag),
+ fiber.type = type, fiber.pendingProps = element.props; else if ("object" == typeof type && null !== type && "number" == typeof type.tag) fiber = type,
+ fiber.pendingProps = element.props; else {
+ var info = "";
+ (void 0 === type || "object" == typeof type && null !== type && 0 === Object.keys(type).length) && (info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");
+ var ownerName = owner ? getComponentName(owner) : null;
+ ownerName && (info += "\n\nCheck the render method of `))) + (("`" + (`" + ownerName + "` + "`")) + (`."), invariant(!1, "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", null == type ? type : typeof type, info);
+ }
+ return fiber._debugSource = element._source, fiber._debugOwner = element._owner,
+ fiber.expirationTime = expirationTime, fiber;
+ }
+ function createFiberFromFragment(elements, internalContextTag, expirationTime, key) {
+ var fiber = createFiber(Fragment, key, internalContextTag);
+ return fiber.pendingProps = elements, fiber.expirationTime = expirationTime, fiber;
+ }
+ function createFiberFromText(content, internalContextTag, expirationTime) {
+ var fiber = createFiber(HostText, null, internalContextTag);
+ return fiber.pendingProps = content, fiber.expirationTime = expirationTime, fiber;
+ }
+ function createFiberFromHostInstanceForDeletion() {
+ var fiber = createFiber(HostComponent, null, NoContext);
+ return fiber.type = "DELETED", fiber;
+ }
+ function createFiberFromCall(call, internalContextTag, expirationTime) {
+ var fiber = createFiber(CallComponent, call.key, internalContextTag);
+ return fiber.type = call.handler, fiber.pendingProps = call, fiber.expirationTime = expirationTime,
+ fiber;
+ }
+ function createFiberFromReturn(returnNode, internalContextTag, expirationTime) {
+ var fiber = createFiber(ReturnComponent, null, internalContextTag);
+ return fiber.expirationTime = expirationTime, fiber;
+ }
+ function createFiberFromPortal(portal, internalContextTag, expirationTime) {
+ var fiber = createFiber(HostPortal, portal.key, internalContextTag);
+ return fiber.pendingProps = portal.children || [], fiber.expirationTime = expirationTime,
+ fiber.stateNode = {
+ containerInfo: portal.containerInfo,
+ pendingChildren: null,
+ implementation: portal.implementation
+ }, fiber;
+ }
+ function createFiberRoot(containerInfo, hydrate) {
+ var uninitializedFiber = createHostRootFiber(), root = {
+ current: uninitializedFiber,
+ containerInfo: containerInfo,
+ pendingChildren: null,
+ remainingExpirationTime: NoWork,
+ isReadyForCommit: !1,
+ finishedWork: null,
+ context: null,
+ pendingContext: null,
+ hydrate: hydrate,
+ nextScheduledRoot: null
+ };
+ return uninitializedFiber.stateNode = root, root;
+ }
+ function catchErrors(fn) {
+ return function(arg) {
+ try {
+ return fn(arg);
+ } catch (err) {
+ hasLoggedError || (hasLoggedError = !0, warning(!1, "React DevTools encountered an error: %s", err));
+ }
+ };
+ }
+ function injectInternals(internals) {
+ if ("undefined" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;
+ var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
+ if (hook.isDisabled) return !0;
+ if (!hook.supportsFiber) return warning(!1, "The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://fb.me/react-devtools"),
+ !0;
+ try {
+ var rendererID = hook.inject(internals);
+ onCommitFiberRoot = catchErrors(function(root) {
+ return hook.onCommitFiberRoot(rendererID, root);
+ }), onCommitFiberUnmount = catchErrors(function(fiber) {
+ return hook.onCommitFiberUnmount(rendererID, fiber);
+ });
+ } catch (err) {
+ warning(!1, "React DevTools encountered an error: %s.", err);
+ }
+ return !0;
+ }
+ function onCommitRoot(root) {
+ "function" == typeof onCommitFiberRoot && onCommitFiberRoot(root);
+ }
+ function onCommitUnmount(fiber) {
+ "function" == typeof onCommitFiberUnmount && onCommitFiberUnmount(fiber);
+ }
+ function createUpdateQueue(baseState) {
+ var queue = {
+ baseState: baseState,
+ expirationTime: NoWork,
+ first: null,
+ last: null,
+ callbackList: null,
+ hasForceUpdate: !1,
+ isInitialized: !1
+ };
+ return queue.isProcessing = !1, queue;
+ }
+ function insertUpdateIntoQueue(queue, update) {
+ null === queue.last ? queue.first = queue.last = update : (queue.last.next = update,
+ queue.last = update), (queue.expirationTime === NoWork || queue.expirationTime > update.expirationTime) && (queue.expirationTime = update.expirationTime);
+ }
+ function insertUpdateIntoFiber(fiber, update) {
+ var alternateFiber = fiber.alternate, queue1 = fiber.updateQueue;
+ null === queue1 && (queue1 = fiber.updateQueue = createUpdateQueue(null));
+ var queue2 = void 0;
+ return null !== alternateFiber ? null === (queue2 = alternateFiber.updateQueue) && (queue2 = alternateFiber.updateQueue = createUpdateQueue(null)) : queue2 = null,
+ queue2 = queue2 !== queue1 ? queue2 : null, (queue1.isProcessing || null !== queue2 && queue2.isProcessing) && !didWarnUpdateInsideUpdate && (warning(!1, "An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback."),
+ didWarnUpdateInsideUpdate = !0), null === queue2 ? void insertUpdateIntoQueue(queue1, update) : null === queue1.last || null === queue2.last ? (insertUpdateIntoQueue(queue1, update),
+ void insertUpdateIntoQueue(queue2, update)) : (insertUpdateIntoQueue(queue1, update),
+ void (queue2.last = update));
+ }
+ function getUpdateExpirationTime(fiber) {
+ if (fiber.tag !== ClassComponent && fiber.tag !== HostRoot) return NoWork;
+ var updateQueue = fiber.updateQueue;
+ return null === updateQueue ? NoWork : updateQueue.expirationTime;
+ }
+ function getStateFromUpdate(update, instance, prevState, props) {
+ var partialState = update.partialState;
+ if ("function" == typeof partialState) {
+ var updateFn = partialState;
+ return debugRenderPhaseSideEffects && updateFn.call(instance, prevState, props),
+ updateFn.call(instance, prevState, props);
+ }
+ return partialState;
+ }
+ function processUpdateQueue(current, workInProgress, queue, instance, props, renderExpirationTime) {
+ if (null !== current && current.updateQueue === queue) {
+ var currentQueue = queue;
+ queue = workInProgress.updateQueue = {
+ baseState: currentQueue.baseState,
+ expirationTime: currentQueue.expirationTime,
+ first: currentQueue.first,
+ last: currentQueue.last,
+ isInitialized: currentQueue.isInitialized,
+ callbackList: null,
+ hasForceUpdate: !1
+ };
+ }
+ queue.isProcessing = !0, queue.expirationTime = NoWork;
+ var state = void 0;
+ queue.isInitialized ? state = queue.baseState : (state = queue.baseState = workInProgress.memoizedState,
+ queue.isInitialized = !0);
+ for (var dontMutatePrevState = !0, update = queue.first, didSkip = !1; null !== update; ) {
+ var updateExpirationTime = update.expirationTime;
+ if (updateExpirationTime > renderExpirationTime) {
+ var remainingExpirationTime = queue.expirationTime;
+ (remainingExpirationTime === NoWork || remainingExpirationTime > updateExpirationTime) && (queue.expirationTime = updateExpirationTime),
+ didSkip || (didSkip = !0, queue.baseState = state), update = update.next;
+ } else {
+ didSkip || (queue.first = update.next, null === queue.first && (queue.last = null));
+ var _partialState = void 0;
+ if (update.isReplace ? (state = getStateFromUpdate(update, instance, state, props),
+ dontMutatePrevState = !0) : (_partialState = getStateFromUpdate(update, instance, state, props)) && (state = dontMutatePrevState ? _assign({}, state, _partialState) : _assign(state, _partialState),
+ dontMutatePrevState = !1), update.isForced && (queue.hasForceUpdate = !0), null !== update.callback) {
+ var _callbackList = queue.callbackList;
+ null === _callbackList && (_callbackList = queue.callbackList = []), _callbackList.push(update);
+ }
+ update = update.next;
+ }
+ }
+ return null !== queue.callbackList ? workInProgress.effectTag |= Callback : null !== queue.first || queue.hasForceUpdate || (workInProgress.updateQueue = null),
+ didSkip || (didSkip = !0, queue.baseState = state), queue.isProcessing = !1, state;
+ }
+ function commitCallbacks(queue, context) {
+ var callbackList = queue.callbackList;
+ if (null !== callbackList) {
+ queue.callbackList = null;
+ for (var i = 0; i < callbackList.length; i++) {
+ var update = callbackList[i], _callback = update.callback;
+ update.callback = null, "function" != typeof _callback && invariant(!1, "Invalid argument passed as callback. Expected a function. Instead received: %s", _callback),
+ _callback.call(context);
+ }
+ }
+ }
+ function getIteratorFn(maybeIterable) {
+ if (null === maybeIterable || void 0 === maybeIterable) return null;
+ var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
+ return "function" == typeof maybeIterator ? maybeIterator : null;
+ }
+ function coerceRef(current, element) {
+ var mixedRef = element.ref;
+ if (null !== mixedRef && "function" != typeof mixedRef) {
+ if (element._owner) {
+ var owner = element._owner, inst = void 0;
+ if (owner) {
+ var ownerFiber = owner;
+ ownerFiber.tag !== ClassComponent && invariant(!1, "Stateless function components cannot have refs."),
+ inst = ownerFiber.stateNode;
+ }
+ inst || invariant(!1, "Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.", mixedRef);
+ var stringRef = "" + mixedRef;
+ if (null !== current && null !== current.ref && current.ref._stringRef === stringRef) return current.ref;
+ var ref = function(value) {
+ var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;
+ null === value ? delete refs[stringRef] : refs[stringRef] = value;
+ };
+ return ref._stringRef = stringRef, ref;
+ }
+ "string" != typeof mixedRef && invariant(!1, "Expected ref to be a function or a string."),
+ element._owner || invariant(!1, "Element ref was specified as a string (%s) but no owner was set. You may have multiple copies of React loaded. (details: https://fb.me/react-refs-must-have-owner).", mixedRef);
+ }
+ return mixedRef;
+ }
+ function throwOnInvalidObjectType(returnFiber, newChild) {
+ if ("textarea" !== returnFiber.type) {
+ var addendum = "";
+ addendum = " If you meant to render a collection of children, use an array instead." + (getCurrentFiberStackAddendum$1() || ""),
+ invariant(!1, "Objects are not valid as a React child (found: %s).%s", "[object Object]" === Object.prototype.toString.call(newChild) ? "object with keys {" + Object.keys(newChild).join(", ") + "}" : newChild, addendum);
+ }
+ }
+ function warnOnFunctionType() {
+ var currentComponentErrorInfo = "Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it." + (getCurrentFiberStackAddendum$1() || "");
+ ownerHasFunctionTypeWarning[currentComponentErrorInfo] || (ownerHasFunctionTypeWarning[currentComponentErrorInfo] = !0,
+ warning(!1, "Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.%s", getCurrentFiberStackAddendum$1() || ""));
+ }
+ function ChildReconciler(shouldTrackSideEffects) {
+ function deleteChild(returnFiber, childToDelete) {
+ if (shouldTrackSideEffects) {
+ var last = returnFiber.lastEffect;
+ null !== last ? (last.nextEffect = childToDelete, returnFiber.lastEffect = childToDelete) : returnFiber.firstEffect = returnFiber.lastEffect = childToDelete,
+ childToDelete.nextEffect = null, childToDelete.effectTag = Deletion;
+ }
+ }
+ function deleteRemainingChildren(returnFiber, currentFirstChild) {
+ if (!shouldTrackSideEffects) return null;
+ for (var childToDelete = currentFirstChild; null !== childToDelete; ) deleteChild(returnFiber, childToDelete),
+ childToDelete = childToDelete.sibling;
+ return null;
+ }
+ function mapRemainingChildren(returnFiber, currentFirstChild) {
+ for (var existingChildren = new Map(), existingChild = currentFirstChild; null !== existingChild; ) null !== existingChild.key ? existingChildren.set(existingChild.key, existingChild) : existingChildren.set(existingChild.index, existingChild),
+ existingChild = existingChild.sibling;
+ return existingChildren;
+ }
+ function useFiber(fiber, pendingProps, expirationTime) {
+ var clone = createWorkInProgress(fiber, pendingProps, expirationTime);
+ return clone.index = 0, clone.sibling = null, clone;
+ }
+ function placeChild(newFiber, lastPlacedIndex, newIndex) {
+ if (newFiber.index = newIndex, !shouldTrackSideEffects) return lastPlacedIndex;
+ var current = newFiber.alternate;
+ if (null !== current) {
+ var oldIndex = current.index;
+ return oldIndex < lastPlacedIndex ? (newFiber.effectTag = Placement, lastPlacedIndex) : oldIndex;
+ }
+ return newFiber.effectTag = Placement, lastPlacedIndex;
+ }
+ function placeSingleChild(newFiber) {
+ return shouldTrackSideEffects && null === newFiber.alternate && (newFiber.effectTag = Placement),
+ newFiber;
+ }
+ function updateTextNode(returnFiber, current, textContent, expirationTime) {
+ if (null === current || current.tag !== HostText) {
+ var created = createFiberFromText(textContent, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ var existing = useFiber(current, textContent, expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ function updateElement(returnFiber, current, element, expirationTime) {
+ if (null !== current && current.type === element.type) {
+ var existing = useFiber(current, element.props, expirationTime);
+ return existing.ref = coerceRef(current, element), existing.return = returnFiber,
+ existing._debugSource = element._source, existing._debugOwner = element._owner,
+ existing;
+ }
+ var created = createFiberFromElement(element, returnFiber.internalContextTag, expirationTime);
+ return created.ref = coerceRef(current, element), created.return = returnFiber,
+ created;
+ }
+ function updateCall(returnFiber, current, call, expirationTime) {
+ if (null === current || current.tag !== CallComponent) {
+ var created = createFiberFromCall(call, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ var existing = useFiber(current, call, expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ function updateReturn(returnFiber, current, returnNode, expirationTime) {
+ if (null === current || current.tag !== ReturnComponent) {
+ var created = createFiberFromReturn(returnNode, returnFiber.internalContextTag, expirationTime);
+ return created.type = returnNode.value, created.return = returnFiber, created;
+ }
+ var existing = useFiber(current, null, expirationTime);
+ return existing.type = returnNode.value, existing.return = returnFiber, existing;
+ }
+ function updatePortal(returnFiber, current, portal, expirationTime) {
+ if (null === current || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {
+ var created = createFiberFromPortal(portal, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ var existing = useFiber(current, portal.children || [], expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ function updateFragment(returnFiber, current, fragment, expirationTime, key) {
+ if (null === current || current.tag !== Fragment) {
+ var created = createFiberFromFragment(fragment, returnFiber.internalContextTag, expirationTime, key);
+ return created.return = returnFiber, created;
+ }
+ var existing = useFiber(current, fragment, expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ function createChild(returnFiber, newChild, expirationTime) {
+ if ("string" == typeof newChild || "number" == typeof newChild) {
+ var created = createFiberFromText("" + newChild, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ if ("object" == typeof newChild && null !== newChild) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ if (newChild.type === REACT_FRAGMENT_TYPE) {
+ var _created = createFiberFromFragment(newChild.props.children, returnFiber.internalContextTag, expirationTime, newChild.key);
+ return _created.return = returnFiber, _created;
+ }
+ var _created2 = createFiberFromElement(newChild, returnFiber.internalContextTag, expirationTime);
+ return _created2.ref = coerceRef(null, newChild), _created2.return = returnFiber,
+ _created2;
+
+ case REACT_CALL_TYPE:
+ var _created3 = createFiberFromCall(newChild, returnFiber.internalContextTag, expirationTime);
+ return _created3.return = returnFiber, _created3;
+
+ case REACT_RETURN_TYPE:
+ var _created4 = createFiberFromReturn(newChild, returnFiber.internalContextTag, expirationTime);
+ return _created4.type = newChild.value, _created4.return = returnFiber, _created4;
+
+ case REACT_PORTAL_TYPE:
+ var _created5 = createFiberFromPortal(newChild, returnFiber.internalContextTag, expirationTime);
+ return _created5.return = returnFiber, _created5;
+ }
+ if (isArray$1(newChild) || getIteratorFn(newChild)) {
+ var _created6 = createFiberFromFragment(newChild, returnFiber.internalContextTag, expirationTime, null);
+ return _created6.return = returnFiber, _created6;
+ }
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+ return "function" == typeof newChild && warnOnFunctionType(), null;
+ }
+ function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
+ var key = null !== oldFiber ? oldFiber.key : null;
+ if ("string" == typeof newChild || "number" == typeof newChild) return null !== key ? null : updateTextNode(returnFiber, oldFiber, "" + newChild, expirationTime);
+ if ("object" == typeof newChild && null !== newChild) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ return newChild.key === key ? newChild.type === REACT_FRAGMENT_TYPE ? updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key) : updateElement(returnFiber, oldFiber, newChild, expirationTime) : null;
+
+ case REACT_CALL_TYPE:
+ return newChild.key === key ? updateCall(returnFiber, oldFiber, newChild, expirationTime) : null;
+
+ case REACT_RETURN_TYPE:
+ return null === key ? updateReturn(returnFiber, oldFiber, newChild, expirationTime) : null;
+
+ case REACT_PORTAL_TYPE:
+ return newChild.key === key ? updatePortal(returnFiber, oldFiber, newChild, expirationTime) : null;
+ }
+ if (isArray$1(newChild) || getIteratorFn(newChild)) return null !== key ? null : updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+ return "function" == typeof newChild && warnOnFunctionType(), null;
+ }
+ function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {
+ if ("string" == typeof newChild || "number" == typeof newChild) {
+ return updateTextNode(returnFiber, existingChildren.get(newIdx) || null, "" + newChild, expirationTime);
+ }
+ if ("object" == typeof newChild && null !== newChild) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ var _matchedFiber = existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null;
+ return newChild.type === REACT_FRAGMENT_TYPE ? updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key) : updateElement(returnFiber, _matchedFiber, newChild, expirationTime);
-func publicDashboardHtmlBytes() ([]byte, error) {
- return bindataRead(
- _publicDashboardHtml,
- "public/dashboard.html",
- )
+ case REACT_CALL_TYPE:
+ return updateCall(returnFiber, existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, newChild, expirationTime);
+
+ case REACT_RETURN_TYPE:
+ return updateReturn(returnFiber, existingChildren.get(newIdx) || null, newChild, expirationTime);
+
+ case REACT_PORTAL_TYPE:
+ return updatePortal(returnFiber, existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, newChild, expirationTime);
+ }
+ if (isArray$1(newChild) || getIteratorFn(newChild)) {
+ return updateFragment(returnFiber, existingChildren.get(newIdx) || null, newChild, expirationTime, null);
+ }
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+ return "function" == typeof newChild && warnOnFunctionType(), null;
+ }
+ function warnOnInvalidKey(child, knownKeys) {
+ if ("object" != typeof child || null === child) return knownKeys;
+ switch (child.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ case REACT_CALL_TYPE:
+ case REACT_PORTAL_TYPE:
+ warnForMissingKey(child);
+ var key = child.key;
+ if ("string" != typeof key) break;
+ if (null === knownKeys) {
+ knownKeys = new Set(), knownKeys.add(key);
+ break;
+ }
+ if (!knownKeys.has(key)) {
+ knownKeys.add(key);
+ break;
+ }
+ warning(!1, "Encountered two children with the same key, ` + ("`" + `%s`)))) + ((("`" + (`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.%s", key, getCurrentFiberStackAddendum$1());
+ }
+ return knownKeys;
+ }
+ function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {
+ for (var knownKeys = null, i = 0; i < newChildren.length; i++) {
+ knownKeys = warnOnInvalidKey(newChildren[i], knownKeys);
+ }
+ for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, lastPlacedIndex = 0, newIdx = 0, nextOldFiber = null; null !== oldFiber && newIdx < newChildren.length; newIdx++) {
+ oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling;
+ var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);
+ if (null === newFiber) {
+ null === oldFiber && (oldFiber = nextOldFiber);
+ break;
+ }
+ shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber),
+ lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber,
+ previousNewFiber = newFiber, oldFiber = nextOldFiber;
+ }
+ if (newIdx === newChildren.length) return deleteRemainingChildren(returnFiber, oldFiber),
+ resultingFirstChild;
+ if (null === oldFiber) {
+ for (;newIdx < newChildren.length; newIdx++) {
+ var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);
+ _newFiber && (lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx),
+ null === previousNewFiber ? resultingFirstChild = _newFiber : previousNewFiber.sibling = _newFiber,
+ previousNewFiber = _newFiber);
+ }
+ return resultingFirstChild;
+ }
+ for (var existingChildren = mapRemainingChildren(returnFiber, oldFiber); newIdx < newChildren.length; newIdx++) {
+ var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);
+ _newFiber2 && (shouldTrackSideEffects && null !== _newFiber2.alternate && existingChildren.delete(null === _newFiber2.key ? newIdx : _newFiber2.key),
+ lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = _newFiber2 : previousNewFiber.sibling = _newFiber2,
+ previousNewFiber = _newFiber2);
+ }
+ return shouldTrackSideEffects && existingChildren.forEach(function(child) {
+ return deleteChild(returnFiber, child);
+ }), resultingFirstChild;
+ }
+ function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {
+ var iteratorFn = getIteratorFn(newChildrenIterable);
+ if ("function" != typeof iteratorFn && invariant(!1, "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue."),
+ "function" == typeof newChildrenIterable.entries) {
+ newChildrenIterable.entries === iteratorFn && (warning(didWarnAboutMaps, "Using Maps as children is unsupported and will likely yield unexpected results. Convert it to a sequence/iterable of keyed ReactElements instead.%s", getCurrentFiberStackAddendum$1()),
+ didWarnAboutMaps = !0);
+ }
+ var _newChildren = iteratorFn.call(newChildrenIterable);
+ if (_newChildren) for (var knownKeys = null, _step = _newChildren.next(); !_step.done; _step = _newChildren.next()) {
+ var child = _step.value;
+ knownKeys = warnOnInvalidKey(child, knownKeys);
+ }
+ var newChildren = iteratorFn.call(newChildrenIterable);
+ null == newChildren && invariant(!1, "An iterable object provided no iterator.");
+ for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, lastPlacedIndex = 0, newIdx = 0, nextOldFiber = null, step = newChildren.next(); null !== oldFiber && !step.done; newIdx++,
+ step = newChildren.next()) {
+ oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling;
+ var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);
+ if (null === newFiber) {
+ oldFiber || (oldFiber = nextOldFiber);
+ break;
+ }
+ shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber),
+ lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber,
+ previousNewFiber = newFiber, oldFiber = nextOldFiber;
+ }
+ if (step.done) return deleteRemainingChildren(returnFiber, oldFiber), resultingFirstChild;
+ if (null === oldFiber) {
+ for (;!step.done; newIdx++, step = newChildren.next()) {
+ var _newFiber3 = createChild(returnFiber, step.value, expirationTime);
+ null !== _newFiber3 && (lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx),
+ null === previousNewFiber ? resultingFirstChild = _newFiber3 : previousNewFiber.sibling = _newFiber3,
+ previousNewFiber = _newFiber3);
+ }
+ return resultingFirstChild;
+ }
+ for (var existingChildren = mapRemainingChildren(returnFiber, oldFiber); !step.done; newIdx++,
+ step = newChildren.next()) {
+ var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);
+ null !== _newFiber4 && (shouldTrackSideEffects && null !== _newFiber4.alternate && existingChildren.delete(null === _newFiber4.key ? newIdx : _newFiber4.key),
+ lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = _newFiber4 : previousNewFiber.sibling = _newFiber4,
+ previousNewFiber = _newFiber4);
+ }
+ return shouldTrackSideEffects && existingChildren.forEach(function(child) {
+ return deleteChild(returnFiber, child);
+ }), resultingFirstChild;
+ }
+ function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {
+ if (null !== currentFirstChild && currentFirstChild.tag === HostText) {
+ deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
+ var existing = useFiber(currentFirstChild, textContent, expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ deleteRemainingChildren(returnFiber, currentFirstChild);
+ var created = createFiberFromText(textContent, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {
+ for (var key = element.key, child = currentFirstChild; null !== child; ) {
+ if (child.key === key) {
+ if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.type === element.type) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);
+ return existing.ref = coerceRef(child, element), existing.return = returnFiber,
+ existing._debugSource = element._source, existing._debugOwner = element._owner,
+ existing;
+ }
+ deleteRemainingChildren(returnFiber, child);
+ break;
+ }
+ deleteChild(returnFiber, child), child = child.sibling;
+ }
+ if (element.type === REACT_FRAGMENT_TYPE) {
+ var created = createFiberFromFragment(element.props.children, returnFiber.internalContextTag, expirationTime, element.key);
+ return created.return = returnFiber, created;
+ }
+ var _created7 = createFiberFromElement(element, returnFiber.internalContextTag, expirationTime);
+ return _created7.ref = coerceRef(currentFirstChild, element), _created7.return = returnFiber,
+ _created7;
+ }
+ function reconcileSingleCall(returnFiber, currentFirstChild, call, expirationTime) {
+ for (var key = call.key, child = currentFirstChild; null !== child; ) {
+ if (child.key === key) {
+ if (child.tag === CallComponent) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(child, call, expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ deleteRemainingChildren(returnFiber, child);
+ break;
+ }
+ deleteChild(returnFiber, child), child = child.sibling;
+ }
+ var created = createFiberFromCall(call, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ function reconcileSingleReturn(returnFiber, currentFirstChild, returnNode, expirationTime) {
+ var child = currentFirstChild;
+ if (null !== child) {
+ if (child.tag === ReturnComponent) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(child, null, expirationTime);
+ return existing.type = returnNode.value, existing.return = returnFiber, existing;
+ }
+ deleteRemainingChildren(returnFiber, child);
+ }
+ var created = createFiberFromReturn(returnNode, returnFiber.internalContextTag, expirationTime);
+ return created.type = returnNode.value, created.return = returnFiber, created;
+ }
+ function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {
+ for (var key = portal.key, child = currentFirstChild; null !== child; ) {
+ if (child.key === key) {
+ if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(child, portal.children || [], expirationTime);
+ return existing.return = returnFiber, existing;
+ }
+ deleteRemainingChildren(returnFiber, child);
+ break;
+ }
+ deleteChild(returnFiber, child), child = child.sibling;
+ }
+ var created = createFiberFromPortal(portal, returnFiber.internalContextTag, expirationTime);
+ return created.return = returnFiber, created;
+ }
+ function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {
+ "object" == typeof newChild && null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && (newChild = newChild.props.children);
+ var isObject = "object" == typeof newChild && null !== newChild;
+ if (isObject) switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));
+
+ case REACT_CALL_TYPE:
+ return placeSingleChild(reconcileSingleCall(returnFiber, currentFirstChild, newChild, expirationTime));
+
+ case REACT_RETURN_TYPE:
+ return placeSingleChild(reconcileSingleReturn(returnFiber, currentFirstChild, newChild, expirationTime));
+
+ case REACT_PORTAL_TYPE:
+ return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));
+ }
+ if ("string" == typeof newChild || "number" == typeof newChild) return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, "" + newChild, expirationTime));
+ if (isArray$1(newChild)) return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);
+ if (getIteratorFn(newChild)) return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);
+ if (isObject && throwOnInvalidObjectType(returnFiber, newChild), "function" == typeof newChild && warnOnFunctionType(),
+ void 0 === newChild) switch (returnFiber.tag) {
+ case ClassComponent:
+ if (returnFiber.stateNode.render._isMockFunction) break;
+
+ case FunctionalComponent:
+ var Component = returnFiber.type;
+ invariant(!1, "%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.", Component.displayName || Component.name || "Component");
+ }
+ return deleteRemainingChildren(returnFiber, currentFirstChild);
+ }
+ return reconcileChildFibers;
+ }
+ function cloneChildFibers(current, workInProgress) {
+ if (null !== current && workInProgress.child !== current.child && invariant(!1, "Resuming work not yet implemented."),
+ null !== workInProgress.child) {
+ var currentChild = workInProgress.child, newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
+ for (workInProgress.child = newChild, newChild.return = workInProgress; null !== currentChild.sibling; ) currentChild = currentChild.sibling,
+ newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime),
+ newChild.return = workInProgress;
+ newChild.sibling = null;
+ }
+ }
+ function logCapturedError(capturedError) {
+ if (!1 !== showDialog(capturedError)) {
+ var error = capturedError.error;
+ if (!error || !error.suppressReactErrorLogging) {
+ var componentName = capturedError.componentName, componentStack = capturedError.componentStack, errorBoundaryName = capturedError.errorBoundaryName, errorBoundaryFound = capturedError.errorBoundaryFound, willRetry = capturedError.willRetry, componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : "The above error occurred in one of your React components:", errorBoundaryMessage = void 0;
+ errorBoundaryMessage = errorBoundaryFound && errorBoundaryName ? willRetry ? "React will try to recreate this component tree from scratch using the error boundary you provided, " + errorBoundaryName + "." : "This error was initially handled by the error boundary " + errorBoundaryName + ".\nRecreating the tree from scratch failed so React will unmount the tree." : "Consider adding an error boundary to your tree to customize error handling behavior.\nVisit https://fb.me/react-error-boundaries to learn more about error boundaries.";
+ var combinedMessage = "" + componentNameMessage + componentStack + "\n\n" + errorBoundaryMessage;
+ console.error(combinedMessage);
+ }
+ }
+ }
+ function getContextForSubtree(parentComponent) {
+ if (!parentComponent) return emptyObject;
+ var fiber = get(parentComponent), parentContext = findCurrentUnmaskedContext(fiber);
+ return isContextProvider(fiber) ? processChildContext(fiber, parentContext) : parentContext;
+ }
+ function createPortal$1(children, containerInfo, implementation) {
+ var key = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null;
+ return {
+ $$typeof: REACT_PORTAL_TYPE,
+ key: null == key ? null : "" + key,
+ children: children,
+ containerInfo: containerInfo,
+ implementation: implementation
+ };
+ }
+ function isAttributeNameSafe(attributeName) {
+ return !!validatedAttributeNameCache.hasOwnProperty(attributeName) || !illegalAttributeNameCache.hasOwnProperty(attributeName) && (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName) ? (validatedAttributeNameCache[attributeName] = !0,
+ !0) : (illegalAttributeNameCache[attributeName] = !0, warning(!1, "Invalid attribute name: ` + "`")) + (`%s` + ("`" + `", attributeName),
+ !1));
+ }
+ function shouldIgnoreValue(propertyInfo, value) {
+ return null == value || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && !1 === value;
+ }
+ function getValueForProperty(node, name, expected) {
+ var propertyInfo = getPropertyInfo(name);
+ if (propertyInfo) {
+ if (propertyInfo.mutationMethod || propertyInfo.mustUseProperty) return node[propertyInfo.propertyName];
+ var attributeName = propertyInfo.attributeName, stringValue = null;
+ if (propertyInfo.hasOverloadedBooleanValue) {
+ if (node.hasAttribute(attributeName)) {
+ var value = node.getAttribute(attributeName);
+ return "" === value || (shouldIgnoreValue(propertyInfo, expected) ? value : value === "" + expected ? expected : value);
+ }
+ } else if (node.hasAttribute(attributeName)) {
+ if (shouldIgnoreValue(propertyInfo, expected)) return node.getAttribute(attributeName);
+ if (propertyInfo.hasBooleanValue) return expected;
+ stringValue = node.getAttribute(attributeName);
+ }
+ return shouldIgnoreValue(propertyInfo, expected) ? null === stringValue ? expected : stringValue : stringValue === "" + expected ? expected : stringValue;
+ }
+ }
+ function getValueForAttribute(node, name, expected) {
+ if (isAttributeNameSafe(name)) {
+ if (!node.hasAttribute(name)) return void 0 === expected ? void 0 : null;
+ var value = node.getAttribute(name);
+ return value === "" + expected ? expected : value;
+ }
+ }
+ function setValueForProperty(node, name, value) {
+ var propertyInfo = getPropertyInfo(name);
+ if (!propertyInfo || !shouldSetAttribute(name, value)) return void setValueForAttribute(node, name, shouldSetAttribute(name, value) ? value : null);
+ var mutationMethod = propertyInfo.mutationMethod;
+ if (mutationMethod) mutationMethod(node, value); else {
+ if (shouldIgnoreValue(propertyInfo, value)) return void deleteValueForProperty(node, name);
+ if (propertyInfo.mustUseProperty) node[propertyInfo.propertyName] = value; else {
+ var attributeName = propertyInfo.attributeName, namespace = propertyInfo.attributeNamespace;
+ namespace ? node.setAttributeNS(namespace, attributeName, "" + value) : propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && !0 === value ? node.setAttribute(attributeName, "") : node.setAttribute(attributeName, "" + value);
+ }
+ }
+ }
+ function setValueForAttribute(node, name, value) {
+ isAttributeNameSafe(name) && (null == value ? node.removeAttribute(name) : node.setAttribute(name, "" + value));
+ }
+ function deleteValueForAttribute(node, name) {
+ node.removeAttribute(name);
+ }
+ function deleteValueForProperty(node, name) {
+ var propertyInfo = getPropertyInfo(name);
+ if (propertyInfo) {
+ var mutationMethod = propertyInfo.mutationMethod;
+ if (mutationMethod) mutationMethod(node, void 0); else if (propertyInfo.mustUseProperty) {
+ var propName = propertyInfo.propertyName;
+ propertyInfo.hasBooleanValue ? node[propName] = !1 : node[propName] = "";
+ } else node.removeAttribute(propertyInfo.attributeName);
+ } else node.removeAttribute(name);
+ }
+ function isControlled(props) {
+ return "checkbox" === props.type || "radio" === props.type ? null != props.checked : null != props.value;
+ }
+ function getHostProps(element, props) {
+ var node = element, value = props.value, checked = props.checked;
+ return _assign({
+ type: void 0,
+ step: void 0,
+ min: void 0,
+ max: void 0
+ }, props, {
+ defaultChecked: void 0,
+ defaultValue: void 0,
+ value: null != value ? value : node._wrapperState.initialValue,
+ checked: null != checked ? checked : node._wrapperState.initialChecked
+ });
+ }
+ function initWrapperState(element, props) {
+ ReactControlledValuePropTypes.checkPropTypes("input", props, getCurrentFiberStackAddendum$3),
+ void 0 === props.checked || void 0 === props.defaultChecked || didWarnCheckedDefaultChecked || (warning(!1, "%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components", getCurrentFiberOwnerName$2() || "A component", props.type),
+ didWarnCheckedDefaultChecked = !0), void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue || (warning(!1, "%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components", getCurrentFiberOwnerName$2() || "A component", props.type),
+ didWarnValueDefaultValue = !0);
+ var defaultValue = props.defaultValue;
+ element._wrapperState = {
+ initialChecked: null != props.checked ? props.checked : props.defaultChecked,
+ initialValue: null != props.value ? props.value : defaultValue,
+ controlled: isControlled(props)
+ };
+ }
+ function updateChecked(element, props) {
+ var node = element, checked = props.checked;
+ null != checked && setValueForProperty(node, "checked", checked);
+ }
+ function updateWrapper(element, props) {
+ var node = element, controlled = isControlled(props);
+ node._wrapperState.controlled || !controlled || didWarnUncontrolledToControlled || (warning(!1, "A component is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s", props.type, getCurrentFiberStackAddendum$3()),
+ didWarnUncontrolledToControlled = !0), !node._wrapperState.controlled || controlled || didWarnControlledToUncontrolled || (warning(!1, "A component is changing a controlled input of type %s to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s", props.type, getCurrentFiberStackAddendum$3()),
+ didWarnControlledToUncontrolled = !0), updateChecked(element, props);
+ var value = props.value;
+ if (null != value) if (0 === value && "" === node.value) node.value = "0"; else if ("number" === props.type) {
+ var valueAsNumber = parseFloat(node.value) || 0;
+ (value != valueAsNumber || value == valueAsNumber && node.value != value) && (node.value = "" + value);
+ } else node.value !== "" + value && (node.value = "" + value); else null == props.value && null != props.defaultValue && node.defaultValue !== "" + props.defaultValue && (node.defaultValue = "" + props.defaultValue),
+ null == props.checked && null != props.defaultChecked && (node.defaultChecked = !!props.defaultChecked);
+ }
+ function postMountWrapper(element, props) {
+ var node = element;
+ switch (props.type) {
+ case "submit":
+ case "reset":
+ break;
+
+ case "color":
+ case "date":
+ case "datetime":
+ case "datetime-local":
+ case "month":
+ case "time":
+ case "week":
+ node.value = "", node.value = node.defaultValue;
+ break;
+
+ default:
+ node.value = node.value;
+ }
+ var name = node.name;
+ "" !== name && (node.name = ""), node.defaultChecked = !node.defaultChecked, node.defaultChecked = !node.defaultChecked,
+ "" !== name && (node.name = name);
+ }
+ function restoreControlledState$1(element, props) {
+ var node = element;
+ updateWrapper(node, props), updateNamedCousins(node, props);
+ }
+ function updateNamedCousins(rootNode, props) {
+ var name = props.name;
+ if ("radio" === props.type && null != name) {
+ for (var queryRoot = rootNode; queryRoot.parentNode; ) queryRoot = queryRoot.parentNode;
+ for (var group = queryRoot.querySelectorAll("input[name=" + JSON.stringify("" + name) + '][type="radio"]'), i = 0; i < group.length; i++) {
+ var otherNode = group[i];
+ if (otherNode !== rootNode && otherNode.form === rootNode.form) {
+ var otherProps = getFiberCurrentPropsFromNode$1(otherNode);
+ otherProps || invariant(!1, "ReactDOMInput: Mixing React and non-React radio inputs with the same `))) + (("`" + (`name` + "`")) + (` is not supported."),
+ updateValueIfChanged(otherNode), updateWrapper(otherNode, otherProps);
+ }
+ }
+ }
+ }
+ function flattenChildren(children) {
+ var content = "";
+ return React.Children.forEach(children, function(child) {
+ null != child && ("string" != typeof child && "number" != typeof child || (content += child));
+ }), content;
+ }
+ function validateProps(element, props) {
+ warning(null == props.selected, "Use the ` + ("`" + `defaultValue`))))) + (((("`" + (` or ` + "`")) + (`value` + ("`" + ` props on <select> instead of setting `))) + (("`" + (`selected` + "`")) + (` on <option>.");
+ }
+ function postMountWrapper$1(element, props) {
+ null != props.value && element.setAttribute("value", props.value);
+ }
+ function getHostProps$1(element, props) {
+ var hostProps = _assign({
+ children: void 0
+ }, props), content = flattenChildren(props.children);
+ return content && (hostProps.children = content), hostProps;
+ }
+ function getDeclarationErrorAddendum() {
+ var ownerName = getCurrentFiberOwnerName$3();
+ return ownerName ? "\n\nCheck the render method of ` + ("`" + `" + ownerName + "`)))) + ((("`" + (`." : "";
+ }
+ function checkSelectPropTypes(props) {
+ ReactControlledValuePropTypes.checkPropTypes("select", props, getCurrentFiberStackAddendum$4);
+ for (var i = 0; i < valuePropNames.length; i++) {
+ var propName = valuePropNames[i];
+ if (null != props[propName]) {
+ var isArray = Array.isArray(props[propName]);
+ props.multiple && !isArray ? warning(!1, "The ` + "`")) + (`%s` + ("`" + ` prop supplied to <select> must be an array if `))) + (("`" + (`multiple` + "`")) + (` is true.%s", propName, getDeclarationErrorAddendum()) : !props.multiple && isArray && warning(!1, "The ` + ("`" + `%s`)))))))) + ((((((("`" + ` prop supplied to <select> must be a scalar value if `) + ("`" + (`multiple` + "`"))) + ((` is false.%s", propName, getDeclarationErrorAddendum());
+ }
+ }
+ }
+ function updateOptions(node, multiple, propValue, setDefaultSelected) {
+ var options = node.options;
+ if (multiple) {
+ for (var selectedValues = propValue, selectedValue = {}, i = 0; i < selectedValues.length; i++) selectedValue["$" + selectedValues[i]] = !0;
+ for (var _i = 0; _i < options.length; _i++) {
+ var selected = selectedValue.hasOwnProperty("$" + options[_i].value);
+ options[_i].selected !== selected && (options[_i].selected = selected), selected && setDefaultSelected && (options[_i].defaultSelected = !0);
+ }
+ } else {
+ for (var _selectedValue = "" + propValue, defaultSelected = null, _i2 = 0; _i2 < options.length; _i2++) {
+ if (options[_i2].value === _selectedValue) return options[_i2].selected = !0, void (setDefaultSelected && (options[_i2].defaultSelected = !0));
+ null !== defaultSelected || options[_i2].disabled || (defaultSelected = options[_i2]);
+ }
+ null !== defaultSelected && (defaultSelected.selected = !0);
+ }
+ }
+ function getHostProps$2(element, props) {
+ return _assign({}, props, {
+ value: void 0
+ });
+ }
+ function initWrapperState$1(element, props) {
+ var node = element;
+ checkSelectPropTypes(props);
+ var value = props.value;
+ node._wrapperState = {
+ initialValue: null != value ? value : props.defaultValue,
+ wasMultiple: !!props.multiple
+ }, void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue$1 || (warning(!1, "Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://fb.me/react-controlled-components"),
+ didWarnValueDefaultValue$1 = !0);
+ }
+ function postMountWrapper$2(element, props) {
+ var node = element;
+ node.multiple = !!props.multiple;
+ var value = props.value;
+ null != value ? updateOptions(node, !!props.multiple, value, !1) : null != props.defaultValue && updateOptions(node, !!props.multiple, props.defaultValue, !0);
+ }
+ function postUpdateWrapper(element, props) {
+ var node = element;
+ node._wrapperState.initialValue = void 0;
+ var wasMultiple = node._wrapperState.wasMultiple;
+ node._wrapperState.wasMultiple = !!props.multiple;
+ var value = props.value;
+ null != value ? updateOptions(node, !!props.multiple, value, !1) : wasMultiple !== !!props.multiple && (null != props.defaultValue ? updateOptions(node, !!props.multiple, props.defaultValue, !0) : updateOptions(node, !!props.multiple, props.multiple ? [] : "", !1));
+ }
+ function restoreControlledState$2(element, props) {
+ var node = element, value = props.value;
+ null != value && updateOptions(node, !!props.multiple, value, !1);
+ }
+ function getHostProps$3(element, props) {
+ var node = element;
+ return null != props.dangerouslySetInnerHTML && invariant(!1, "` + ("`" + `dangerouslySetInnerHTML`)) + ("`" + (` does not make sense on <textarea>."),
+ _assign({}, props, {
+ value: void 0,
+ defaultValue: void 0,
+ children: "" + node._wrapperState.initialValue
+ });
+ }
+ function initWrapperState$2(element, props) {
+ var node = element;
+ ReactControlledValuePropTypes.checkPropTypes("textarea", props, getCurrentFiberStackAddendum$5),
+ void 0 === props.value || void 0 === props.defaultValue || didWarnValDefaultVal || (warning(!1, "Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://fb.me/react-controlled-components"),
+ didWarnValDefaultVal = !0);
+ var initialValue = props.value;
+ if (null == initialValue) {
+ var defaultValue = props.defaultValue, children = props.children;
+ null != children && (warning(!1, "Use the ` + "`")))) + (((`defaultValue` + ("`" + ` or `)) + ("`" + (`value` + "`"))) + ((` props instead of setting children on <textarea>."),
+ null != defaultValue && invariant(!1, "If you supply ` + ("`" + `defaultValue`)) + ("`" + (` on a <textarea>, do not pass children."),
+ Array.isArray(children) && (children.length <= 1 || invariant(!1, "<textarea> can only have at most one child."),
+ children = children[0]), defaultValue = "" + children), null == defaultValue && (defaultValue = ""),
+ initialValue = defaultValue;
+ }
+ node._wrapperState = {
+ initialValue: "" + initialValue
+ };
+ }
+ function updateWrapper$1(element, props) {
+ var node = element, value = props.value;
+ if (null != value) {
+ var newValue = "" + value;
+ newValue !== node.value && (node.value = newValue), null == props.defaultValue && (node.defaultValue = newValue);
+ }
+ null != props.defaultValue && (node.defaultValue = props.defaultValue);
+ }
+ function postMountWrapper$3(element, props) {
+ var node = element, textContent = node.textContent;
+ textContent === node._wrapperState.initialValue && (node.value = textContent);
+ }
+ function restoreControlledState$3(element, props) {
+ updateWrapper$1(element, props);
+ }
+ function getIntrinsicNamespace(type) {
+ switch (type) {
+ case "svg":
+ return SVG_NAMESPACE;
+
+ case "math":
+ return MATH_NAMESPACE;
+
+ default:
+ return HTML_NAMESPACE$1;
+ }
+ }
+ function getChildNamespace(parentNamespace, type) {
+ return null == parentNamespace || parentNamespace === HTML_NAMESPACE$1 ? getIntrinsicNamespace(type) : parentNamespace === SVG_NAMESPACE && "foreignObject" === type ? HTML_NAMESPACE$1 : parentNamespace;
+ }
+ function prefixKey(prefix, key) {
+ return prefix + key.charAt(0).toUpperCase() + key.substring(1);
+ }
+ function dangerousStyleValue(name, value, isCustomProperty) {
+ return null == value || "boolean" == typeof value || "" === value ? "" : isCustomProperty || "number" != typeof value || 0 === value || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name] ? ("" + value).trim() : value + "px";
+ }
+ function createDangerousStringForStyles(styles) {
+ var serialized = "", delimiter = "";
+ for (var styleName in styles) if (styles.hasOwnProperty(styleName)) {
+ var styleValue = styles[styleName];
+ if (null != styleValue) {
+ var isCustomProperty = 0 === styleName.indexOf("--");
+ serialized += delimiter + hyphenateStyleName(styleName) + ":", serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty),
+ delimiter = ";";
+ }
+ }
+ return serialized || null;
+ }
+ function setValueForStyles(node, styles, getStack) {
+ var style = node.style;
+ for (var styleName in styles) if (styles.hasOwnProperty(styleName)) {
+ var isCustomProperty = 0 === styleName.indexOf("--");
+ isCustomProperty || warnValidStyle$1(styleName, styles[styleName], getStack);
+ var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
+ "float" === styleName && (styleName = "cssFloat"), isCustomProperty ? style.setProperty(styleName, styleValue) : style[styleName] = styleValue;
+ }
+ }
+ function assertValidProps(tag, props, getStack) {
+ props && (voidElementTags[tag] && (null != props.children || null != props.dangerouslySetInnerHTML) && invariant(!1, "%s is a void element tag and must neither have ` + "`"))))) + ((((`children` + ("`" + ` nor use `)) + ("`" + (`dangerouslySetInnerHTML` + "`"))) + ((`.%s", tag, getStack()),
+ null != props.dangerouslySetInnerHTML && (null != props.children && invariant(!1, "Can only set one of ` + ("`" + `children`)) + ("`" + (` or ` + "`")))) + (((`props.dangerouslySetInnerHTML` + ("`" + `."),
+ "object" == typeof props.dangerouslySetInnerHTML && HTML$1 in props.dangerouslySetInnerHTML || invariant(!1, "`)) + ("`" + (`props.dangerouslySetInnerHTML` + "`"))) + ((` must be in the form ` + ("`" + `{__html: ...}`)) + ("`" + (`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.")),
+ warning(props.suppressContentEditableWarning || !props.contentEditable || null == props.children, "A component is ` + "`")))))) + (((((`contentEditable` + ("`" + ` and contains `)) + ("`" + (`children` + "`"))) + ((` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.%s", getStack()),
+ null != props.style && "object" != typeof props.style && invariant(!1, "The ` + ("`" + `style`)) + ("`" + (` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s", getStack()));
+ }
+ function isCustomComponent(tagName, props) {
+ if (-1 === tagName.indexOf("-")) return "string" == typeof props.is;
+ switch (tagName) {
+ case "annotation-xml":
+ case "color-profile":
+ case "font-face":
+ case "font-face-src":
+ case "font-face-uri":
+ case "font-face-format":
+ case "font-face-name":
+ case "missing-glyph":
+ return !1;
+
+ default:
+ return !0;
+ }
+ }
+ function getStackAddendum() {
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
+ return null != stack ? stack : "";
+ }
+ function validateProperty(tagName, name) {
+ if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) return !0;
+ if (rARIACamel.test(name)) {
+ var ariaName = "aria-" + name.slice(4).toLowerCase(), correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null;
+ if (null == correctName) return warning(!1, "Invalid ARIA attribute ` + "`")))) + (((`%s` + ("`" + `. ARIA attributes follow the pattern aria-* and must be lowercase.%s", name, getStackAddendum()),
+ warnedProperties[name] = !0, !0;
+ if (name !== correctName) return warning(!1, "Invalid ARIA attribute `)) + ("`" + (`%s` + "`"))) + ((`. Did you mean ` + ("`" + `%s`)) + ("`" + (`?%s", name, correctName, getStackAddendum()),
+ warnedProperties[name] = !0, !0;
+ }
+ if (rARIA.test(name)) {
+ var lowerCasedName = name.toLowerCase(), standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null;
+ if (null == standardName) return warnedProperties[name] = !0, !1;
+ if (name !== standardName) return warning(!1, "Unknown ARIA attribute ` + "`"))))) + ((((`%s` + ("`" + `. Did you mean `)) + ("`" + (`%s` + "`"))) + ((`?%s", name, standardName, getStackAddendum()),
+ warnedProperties[name] = !0, !0;
+ }
+ return !0;
+ }
+ function warnInvalidARIAProps(type, props) {
+ var invalidProps = [];
+ for (var key in props) {
+ validateProperty(type, key) || invalidProps.push(key);
+ }
+ var unknownPropString = invalidProps.map(function(prop) {
+ return "` + ("`" + `" + prop + "`)) + ("`" + (`";
+ }).join(", ");
+ 1 === invalidProps.length ? warning(!1, "Invalid aria prop %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s", unknownPropString, type, getStackAddendum()) : invalidProps.length > 1 && warning(!1, "Invalid aria props %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s", unknownPropString, type, getStackAddendum());
+ }
+ function validateProperties(type, props) {
+ isCustomComponent(type, props) || warnInvalidARIAProps(type, props);
+ }
+ function getStackAddendum$1() {
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
+ return null != stack ? stack : "";
+ }
+ function validateProperties$1(type, props) {
+ "input" !== type && "textarea" !== type && "select" !== type || null == props || null !== props.value || didWarnValueNull || (didWarnValueNull = !0,
+ "select" === type && props.multiple ? warning(!1, "` + "`")))) + (((`value` + ("`" + ` prop on `)) + ("`" + (`%s` + "`"))) + ((` should not be null. Consider using an empty array when ` + ("`" + `multiple`)) + ("`" + (` is set to ` + "`"))))))) + ((((((`true` + "`") + (` to clear the component or ` + ("`" + `undefined`))) + (("`" + (` for uncontrolled components.%s", type, getStackAddendum$1()) : warning(!1, "` + "`")) + (`value` + ("`" + ` prop on `)))) + ((("`" + (`%s` + "`")) + (` should not be null. Consider using an empty string to clear the component or ` + ("`" + `undefined`))) + (("`" + (` for uncontrolled components.%s", type, getStackAddendum$1()));
+ }
+ function getStackAddendum$2() {
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
+ return null != stack ? stack : "";
+ }
+ function validateProperties$2(type, props, canUseEventSystem) {
+ isCustomComponent(type, props) || warnUnknownProperties(type, props, canUseEventSystem);
+ }
+ function ensureListeningTo(rootContainerElement, registrationName) {
+ listenTo(registrationName, rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument);
+ }
+ function getOwnerDocumentFromRootContainer(rootContainerElement) {
+ return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
+ }
+ function trapClickOnNonInteractiveElement(node) {
+ node.onclick = emptyFunction;
+ }
+ function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
+ for (var propKey in nextProps) if (nextProps.hasOwnProperty(propKey)) {
+ var nextProp = nextProps[propKey];
+ if (propKey === STYLE) nextProp && Object.freeze(nextProp), setValueForStyles(domElement, nextProp, getStack); else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ var nextHtml = nextProp ? nextProp[HTML] : void 0;
+ null != nextHtml && setInnerHTML(domElement, nextHtml);
+ } else if (propKey === CHILDREN) if ("string" == typeof nextProp) {
+ var canSetTextContent = "textarea" !== tag || "" !== nextProp;
+ canSetTextContent && setTextContent(domElement, nextProp);
+ } else "number" == typeof nextProp && setTextContent(domElement, "" + nextProp); else propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || propKey === AUTOFOCUS || (registrationNameModules.hasOwnProperty(propKey) ? null != nextProp && ("function" != typeof nextProp && warnForInvalidEventListener(propKey, nextProp),
+ ensureListeningTo(rootContainerElement, propKey)) : isCustomComponentTag ? setValueForAttribute(domElement, propKey, nextProp) : null != nextProp && setValueForProperty(domElement, propKey, nextProp));
+ }
+ }
+ function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
+ for (var i = 0; i < updatePayload.length; i += 2) {
+ var propKey = updatePayload[i], propValue = updatePayload[i + 1];
+ propKey === STYLE ? setValueForStyles(domElement, propValue, getStack) : propKey === DANGEROUSLY_SET_INNER_HTML ? setInnerHTML(domElement, propValue) : propKey === CHILDREN ? setTextContent(domElement, propValue) : isCustomComponentTag ? null != propValue ? setValueForAttribute(domElement, propKey, propValue) : deleteValueForAttribute(domElement, propKey) : null != propValue ? setValueForProperty(domElement, propKey, propValue) : deleteValueForProperty(domElement, propKey);
+ }
+ }
+ function createElement$1(type, props, rootContainerElement, parentNamespace) {
+ var domElement, ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement), namespaceURI = parentNamespace;
+ if (namespaceURI === HTML_NAMESPACE && (namespaceURI = getIntrinsicNamespace(type)),
+ namespaceURI === HTML_NAMESPACE) {
+ var isCustomComponentTag = isCustomComponent(type, props);
+ if (warning(isCustomComponentTag || type === type.toLowerCase(), "<%s /> is using uppercase HTML. Always use lowercase HTML tags in React.", type),
+ "script" === type) {
+ var div = ownerDocument.createElement("div");
+ div.innerHTML = "<script><\/script>";
+ var firstChild = div.firstChild;
+ domElement = div.removeChild(firstChild);
+ } else domElement = "string" == typeof props.is ? ownerDocument.createElement(type, {
+ is: props.is
+ }) : ownerDocument.createElement(type);
+ } else domElement = ownerDocument.createElementNS(namespaceURI, type);
+ return namespaceURI === HTML_NAMESPACE && (isCustomComponentTag || "[object HTMLUnknownElement]" !== Object.prototype.toString.call(domElement) || Object.prototype.hasOwnProperty.call(warnedUnknownTags, type) || (warnedUnknownTags[type] = !0,
+ warning(!1, "The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.", type))),
+ domElement;
+ }
+ function createTextNode$1(text, rootContainerElement) {
+ return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
+ }
+ function setInitialProperties$1(domElement, tag, rawProps, rootContainerElement) {
+ var isCustomComponentTag = isCustomComponent(tag, rawProps);
+ validatePropertiesInDevelopment(tag, rawProps), isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot && (warning(!1, "%s is using shady DOM. Using shady DOM with React can cause things to break subtly.", getCurrentFiberOwnerName$1() || "A component"),
+ didWarnShadyDOM = !0);
+ var props;
+ switch (tag) {
+ case "iframe":
+ case "object":
+ trapBubbledEvent("topLoad", "load", domElement), props = rawProps;
+ break;
+
+ case "video":
+ case "audio":
+ for (var event in mediaEvents) mediaEvents.hasOwnProperty(event) && trapBubbledEvent(event, mediaEvents[event], domElement);
+ props = rawProps;
+ break;
+
+ case "source":
+ trapBubbledEvent("topError", "error", domElement), props = rawProps;
+ break;
+
+ case "img":
+ case "image":
+ trapBubbledEvent("topError", "error", domElement), trapBubbledEvent("topLoad", "load", domElement),
+ props = rawProps;
+ break;
+
+ case "form":
+ trapBubbledEvent("topReset", "reset", domElement), trapBubbledEvent("topSubmit", "submit", domElement),
+ props = rawProps;
+ break;
+
+ case "details":
+ trapBubbledEvent("topToggle", "toggle", domElement), props = rawProps;
+ break;
+
+ case "input":
+ initWrapperState(domElement, rawProps), props = getHostProps(domElement, rawProps),
+ trapBubbledEvent("topInvalid", "invalid", domElement), ensureListeningTo(rootContainerElement, "onChange");
+ break;
+
+ case "option":
+ validateProps(domElement, rawProps), props = getHostProps$1(domElement, rawProps);
+ break;
+
+ case "select":
+ initWrapperState$1(domElement, rawProps), props = getHostProps$2(domElement, rawProps),
+ trapBubbledEvent("topInvalid", "invalid", domElement), ensureListeningTo(rootContainerElement, "onChange");
+ break;
+
+ case "textarea":
+ initWrapperState$2(domElement, rawProps), props = getHostProps$3(domElement, rawProps),
+ trapBubbledEvent("topInvalid", "invalid", domElement), ensureListeningTo(rootContainerElement, "onChange");
+ break;
+
+ default:
+ props = rawProps;
+ }
+ switch (assertValidProps(tag, props, getStack), setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag),
+ tag) {
+ case "input":
+ track(domElement), postMountWrapper(domElement, rawProps);
+ break;
+
+ case "textarea":
+ track(domElement), postMountWrapper$3(domElement, rawProps);
+ break;
+
+ case "option":
+ postMountWrapper$1(domElement, rawProps);
+ break;
+
+ case "select":
+ postMountWrapper$2(domElement, rawProps);
+ break;
+
+ default:
+ "function" == typeof props.onClick && trapClickOnNonInteractiveElement(domElement);
+ }
+ }
+ function diffProperties$1(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
+ validatePropertiesInDevelopment(tag, nextRawProps);
+ var lastProps, nextProps, updatePayload = null;
+ switch (tag) {
+ case "input":
+ lastProps = getHostProps(domElement, lastRawProps), nextProps = getHostProps(domElement, nextRawProps),
+ updatePayload = [];
+ break;
+
+ case "option":
+ lastProps = getHostProps$1(domElement, lastRawProps), nextProps = getHostProps$1(domElement, nextRawProps),
+ updatePayload = [];
+ break;
+
+ case "select":
+ lastProps = getHostProps$2(domElement, lastRawProps), nextProps = getHostProps$2(domElement, nextRawProps),
+ updatePayload = [];
+ break;
+
+ case "textarea":
+ lastProps = getHostProps$3(domElement, lastRawProps), nextProps = getHostProps$3(domElement, nextRawProps),
+ updatePayload = [];
+ break;
+
+ default:
+ lastProps = lastRawProps, nextProps = nextRawProps, "function" != typeof lastProps.onClick && "function" == typeof nextProps.onClick && trapClickOnNonInteractiveElement(domElement);
+ }
+ assertValidProps(tag, nextProps, getStack);
+ var propKey, styleName, styleUpdates = null;
+ for (propKey in lastProps) if (!nextProps.hasOwnProperty(propKey) && lastProps.hasOwnProperty(propKey) && null != lastProps[propKey]) if (propKey === STYLE) {
+ var lastStyle = lastProps[propKey];
+ for (styleName in lastStyle) lastStyle.hasOwnProperty(styleName) && (styleUpdates || (styleUpdates = {}),
+ styleUpdates[styleName] = "");
+ } else propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || propKey === AUTOFOCUS || (registrationNameModules.hasOwnProperty(propKey) ? updatePayload || (updatePayload = []) : (updatePayload = updatePayload || []).push(propKey, null));
+ for (propKey in nextProps) {
+ var nextProp = nextProps[propKey], lastProp = null != lastProps ? lastProps[propKey] : void 0;
+ if (nextProps.hasOwnProperty(propKey) && nextProp !== lastProp && (null != nextProp || null != lastProp)) if (propKey === STYLE) if (nextProp && Object.freeze(nextProp),
+ lastProp) {
+ for (styleName in lastProp) !lastProp.hasOwnProperty(styleName) || nextProp && nextProp.hasOwnProperty(styleName) || (styleUpdates || (styleUpdates = {}),
+ styleUpdates[styleName] = "");
+ for (styleName in nextProp) nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName] && (styleUpdates || (styleUpdates = {}),
+ styleUpdates[styleName] = nextProp[styleName]);
+ } else styleUpdates || (updatePayload || (updatePayload = []), updatePayload.push(propKey, styleUpdates)),
+ styleUpdates = nextProp; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ var nextHtml = nextProp ? nextProp[HTML] : void 0, lastHtml = lastProp ? lastProp[HTML] : void 0;
+ null != nextHtml && lastHtml !== nextHtml && (updatePayload = updatePayload || []).push(propKey, "" + nextHtml);
+ } else propKey === CHILDREN ? lastProp === nextProp || "string" != typeof nextProp && "number" != typeof nextProp || (updatePayload = updatePayload || []).push(propKey, "" + nextProp) : propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || (registrationNameModules.hasOwnProperty(propKey) ? (null != nextProp && ("function" != typeof nextProp && warnForInvalidEventListener(propKey, nextProp),
+ ensureListeningTo(rootContainerElement, propKey)), updatePayload || lastProp === nextProp || (updatePayload = [])) : (updatePayload = updatePayload || []).push(propKey, nextProp));
+ }
+ return styleUpdates && (updatePayload = updatePayload || []).push(STYLE, styleUpdates),
+ updatePayload;
+ }
+ function updateProperties$1(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
+ switch ("input" === tag && "radio" === nextRawProps.type && null != nextRawProps.name && updateChecked(domElement, nextRawProps),
+ updateDOMProperties(domElement, updatePayload, isCustomComponent(tag, lastRawProps), isCustomComponent(tag, nextRawProps)),
+ tag) {
+ case "input":
+ updateWrapper(domElement, nextRawProps);
+ break;
+
+ case "textarea":
+ updateWrapper$1(domElement, nextRawProps);
+ break;
+
+ case "select":
+ postUpdateWrapper(domElement, nextRawProps);
+ }
+ }
+ function diffHydratedProperties$1(domElement, tag, rawProps, parentNamespace, rootContainerElement) {
+ var suppressHydrationWarning = !0 === rawProps[SUPPRESS_HYDRATION_WARNING$1], isCustomComponentTag = isCustomComponent(tag, rawProps);
+ switch (validatePropertiesInDevelopment(tag, rawProps), isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot && (warning(!1, "%s is using shady DOM. Using shady DOM with React can cause things to break subtly.", getCurrentFiberOwnerName$1() || "A component"),
+ didWarnShadyDOM = !0), tag) {
+ case "iframe":
+ case "object":
+ trapBubbledEvent("topLoad", "load", domElement);
+ break;
+
+ case "video":
+ case "audio":
+ for (var event in mediaEvents) mediaEvents.hasOwnProperty(event) && trapBubbledEvent(event, mediaEvents[event], domElement);
+ break;
+
+ case "source":
+ trapBubbledEvent("topError", "error", domElement);
+ break;
+
+ case "img":
+ case "image":
+ trapBubbledEvent("topError", "error", domElement), trapBubbledEvent("topLoad", "load", domElement);
+ break;
+
+ case "form":
+ trapBubbledEvent("topReset", "reset", domElement), trapBubbledEvent("topSubmit", "submit", domElement);
+ break;
+
+ case "details":
+ trapBubbledEvent("topToggle", "toggle", domElement);
+ break;
+
+ case "input":
+ initWrapperState(domElement, rawProps), trapBubbledEvent("topInvalid", "invalid", domElement),
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+
+ case "option":
+ validateProps(domElement, rawProps);
+ break;
+
+ case "select":
+ initWrapperState$1(domElement, rawProps), trapBubbledEvent("topInvalid", "invalid", domElement),
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+
+ case "textarea":
+ initWrapperState$2(domElement, rawProps), trapBubbledEvent("topInvalid", "invalid", domElement),
+ ensureListeningTo(rootContainerElement, "onChange");
+ }
+ assertValidProps(tag, rawProps, getStack);
+ for (var extraAttributeNames = new Set(), attributes = domElement.attributes, i = 0; i < attributes.length; i++) {
+ switch (attributes[i].name.toLowerCase()) {
+ case "data-reactroot":
+ case "value":
+ case "checked":
+ case "selected":
+ break;
+
+ default:
+ extraAttributeNames.add(attributes[i].name);
+ }
+ }
+ var updatePayload = null;
+ for (var propKey in rawProps) if (rawProps.hasOwnProperty(propKey)) {
+ var nextProp = rawProps[propKey];
+ if (propKey === CHILDREN) "string" == typeof nextProp ? domElement.textContent !== nextProp && (suppressHydrationWarning || warnForTextDifference(domElement.textContent, nextProp),
+ updatePayload = [ CHILDREN, nextProp ]) : "number" == typeof nextProp && domElement.textContent !== "" + nextProp && (suppressHydrationWarning || warnForTextDifference(domElement.textContent, nextProp),
+ updatePayload = [ CHILDREN, "" + nextProp ]); else if (registrationNameModules.hasOwnProperty(propKey)) null != nextProp && ("function" != typeof nextProp && warnForInvalidEventListener(propKey, nextProp),
+ ensureListeningTo(rootContainerElement, propKey)); else {
+ var serverValue, propertyInfo;
+ if (suppressHydrationWarning) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || "value" === propKey || "checked" === propKey || "selected" === propKey) ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ var rawHtml = nextProp ? nextProp[HTML] || "" : "", serverHTML = domElement.innerHTML, expectedHTML = normalizeHTML(domElement, rawHtml);
+ expectedHTML !== serverHTML && warnForPropDifference(propKey, serverHTML, expectedHTML);
+ } else if (propKey === STYLE) {
+ extraAttributeNames.delete(propKey);
+ var expectedStyle = createDangerousStringForStyles(nextProp);
+ serverValue = domElement.getAttribute("style"), expectedStyle !== serverValue && warnForPropDifference(propKey, serverValue, expectedStyle);
+ } else if (isCustomComponentTag) extraAttributeNames.delete(propKey.toLowerCase()),
+ serverValue = getValueForAttribute(domElement, propKey, nextProp), nextProp !== serverValue && warnForPropDifference(propKey, serverValue, nextProp); else if (shouldSetAttribute(propKey, nextProp)) {
+ if (propertyInfo = getPropertyInfo(propKey)) extraAttributeNames.delete(propertyInfo.attributeName),
+ serverValue = getValueForProperty(domElement, propKey, nextProp); else {
+ var ownNamespace = parentNamespace;
+ ownNamespace === HTML_NAMESPACE && (ownNamespace = getIntrinsicNamespace(tag)),
+ ownNamespace === HTML_NAMESPACE ? extraAttributeNames.delete(propKey.toLowerCase()) : extraAttributeNames.delete(propKey),
+ serverValue = getValueForAttribute(domElement, propKey, nextProp);
+ }
+ nextProp !== serverValue && warnForPropDifference(propKey, serverValue, nextProp);
+ }
+ }
+ }
+ switch (extraAttributeNames.size > 0 && !suppressHydrationWarning && warnForExtraAttributes(extraAttributeNames),
+ tag) {
+ case "input":
+ track(domElement), postMountWrapper(domElement, rawProps);
+ break;
+
+ case "textarea":
+ track(domElement), postMountWrapper$3(domElement, rawProps);
+ break;
+
+ case "select":
+ case "option":
+ break;
+
+ default:
+ "function" == typeof rawProps.onClick && trapClickOnNonInteractiveElement(domElement);
+ }
+ return updatePayload;
+ }
+ function diffHydratedText$1(textNode, text) {
+ return textNode.nodeValue !== text;
+ }
+ function warnForUnmatchedText$1(textNode, text) {
+ warnForTextDifference(textNode.nodeValue, text);
+ }
+ function warnForDeletedHydratableElement$1(parentNode, child) {
+ didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, "Did not expect server HTML to contain a <%s> in <%s>.", child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase()));
+ }
+ function warnForDeletedHydratableText$1(parentNode, child) {
+ didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, 'Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase()));
+ }
+ function warnForInsertedHydratedElement$1(parentNode, tag, props) {
+ didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, "Expected server HTML to contain a matching <%s> in <%s>.", tag, parentNode.nodeName.toLowerCase()));
+ }
+ function warnForInsertedHydratedText$1(parentNode, text) {
+ "" !== text && (didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, 'Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase())));
+ }
+ function restoreControlledState(domElement, tag, props) {
+ switch (tag) {
+ case "input":
+ return void restoreControlledState$1(domElement, props);
+
+ case "textarea":
+ return void restoreControlledState$3(domElement, props);
+
+ case "select":
+ return void restoreControlledState$2(domElement, props);
+ }
+ }
+ function isValidContainer(node) {
+ return !(!node || node.nodeType !== ELEMENT_NODE && node.nodeType !== DOCUMENT_NODE && node.nodeType !== DOCUMENT_FRAGMENT_NODE && (node.nodeType !== COMMENT_NODE || " react-mount-point-unstable " !== node.nodeValue));
+ }
+ function getReactRootElementInContainer(container) {
+ return container ? container.nodeType === DOCUMENT_NODE ? container.documentElement : container.firstChild : null;
+ }
+ function shouldHydrateDueToLegacyHeuristic(container) {
+ var rootElement = getReactRootElementInContainer(container);
+ return !(!rootElement || rootElement.nodeType !== ELEMENT_NODE || !rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
+ }
+ function shouldAutoFocusHostComponent(type, props) {
+ switch (type) {
+ case "button":
+ case "input":
+ case "select":
+ case "textarea":
+ return !!props.autoFocus;
+ }
+ return !1;
+ }
+ function renderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
+ if (isValidContainer(container) || invariant(!1, "Target container is not a DOM element."),
+ container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
+ var hostInstance = DOMRenderer.findHostInstanceWithNoPortals(container._reactRootContainer.current);
+ hostInstance && warning(hostInstance.parentNode === container, "render(...): It looks like the React-rendered content of this container was removed without using React. This is not supported and will cause errors. Instead, call ReactDOM.unmountComponentAtNode to empty a container.");
+ }
+ var isRootRenderedBySomeReact = !!container._reactRootContainer, rootEl = getReactRootElementInContainer(container), hasNonRootReactChild = !(!rootEl || !getInstanceFromNode$1(rootEl));
+ warning(!hasNonRootReactChild || isRootRenderedBySomeReact, "render(...): Replacing React-rendered children with a new root component. If you intended to update the children of this node, you should instead have the existing children update their state and render the new components instead of calling ReactDOM.render."),
+ warning(container.nodeType !== ELEMENT_NODE || !container.tagName || "BODY" !== container.tagName.toUpperCase(), "render(): Rendering components directly into document.body is discouraged, since its children are often manipulated by third-party scripts and browser extensions. This may lead to subtle reconciliation issues. Try rendering into a container element created for your app.");
+ var root = container._reactRootContainer;
+ if (root) DOMRenderer.updateContainer(children, root, parentComponent, callback); else {
+ var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);
+ if (!shouldHydrate) for (var warned = !1, rootSibling = void 0; rootSibling = container.lastChild; ) !warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME) && (warned = !0,
+ warning(!1, "render(): Target node has markup rendered by React, but there are unrelated nodes as well. This is most commonly caused by white-space inserted around server-rendered markup.")),
+ container.removeChild(rootSibling);
+ !shouldHydrate || forceHydrate || warnedAboutHydrateAPI || (warnedAboutHydrateAPI = !0,
+ lowPriorityWarning$1(!1, "render(): Calling ReactDOM.render() to hydrate server-rendered markup will stop working in React v17. Replace the ReactDOM.render() call with ReactDOM.hydrate() if you want React to attach to the server HTML."));
+ var newRoot = DOMRenderer.createContainer(container, shouldHydrate);
+ root = container._reactRootContainer = newRoot, DOMRenderer.unbatchedUpdates(function() {
+ DOMRenderer.updateContainer(children, newRoot, parentComponent, callback);
+ });
+ }
+ return DOMRenderer.getPublicRootInstance(root);
+ }
+ function createPortal(children, container) {
+ var key = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null;
+ return isValidContainer(container) || invariant(!1, "Target container is not a DOM element."),
+ createPortal$1(children, container, null, key);
+ }
+ function ReactRoot(container, hydrate) {
+ var root = DOMRenderer.createContainer(container, hydrate);
+ this._reactRootContainer = root;
+ }
+ var React = __webpack_require__(0), invariant = __webpack_require__(70), warning = __webpack_require__(94), ExecutionEnvironment = __webpack_require__(200), _assign = __webpack_require__(69), emptyFunction = __webpack_require__(39), EventListener = __webpack_require__(201), getActiveElement = __webpack_require__(202), shallowEqual = __webpack_require__(96), containsNode = __webpack_require__(203), focusNode = __webpack_require__(204), emptyObject = __webpack_require__(93), checkPropTypes = __webpack_require__(132), hyphenateStyleName = __webpack_require__(338), camelizeStyleName = __webpack_require__(340);
+ React || invariant(!1, "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.");
+ var RESERVED_PROPS = {
+ children: !0,
+ dangerouslySetInnerHTML: !0,
+ defaultValue: !0,
+ defaultChecked: !0,
+ innerHTML: !0,
+ suppressContentEditableWarning: !0,
+ suppressHydrationWarning: !0,
+ style: !0
+ }, DOMPropertyInjection = {
+ MUST_USE_PROPERTY: 1,
+ HAS_BOOLEAN_VALUE: 4,
+ HAS_NUMERIC_VALUE: 8,
+ HAS_POSITIVE_NUMERIC_VALUE: 24,
+ HAS_OVERLOADED_BOOLEAN_VALUE: 32,
+ HAS_STRING_BOOLEAN_VALUE: 64,
+ injectDOMPropertyConfig: function(domPropertyConfig) {
+ var Injection = DOMPropertyInjection, Properties = domPropertyConfig.Properties || {}, DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {}, DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}, DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};
+ for (var propName in Properties) {
+ properties.hasOwnProperty(propName) && invariant(!1, "injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.", propName);
+ var lowerCased = propName.toLowerCase(), propConfig = Properties[propName], propertyInfo = {
+ attributeName: lowerCased,
+ attributeNamespace: null,
+ propertyName: propName,
+ mutationMethod: null,
+ mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),
+ hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),
+ hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),
+ hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),
+ hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE),
+ hasStringBooleanValue: checkMask(propConfig, Injection.HAS_STRING_BOOLEAN_VALUE)
+ };
+ if (propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1 || invariant(!1, "DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s", propName),
+ DOMAttributeNames.hasOwnProperty(propName)) {
+ var attributeName = DOMAttributeNames[propName];
+ propertyInfo.attributeName = attributeName;
+ }
+ DOMAttributeNamespaces.hasOwnProperty(propName) && (propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName]),
+ DOMMutationMethods.hasOwnProperty(propName) && (propertyInfo.mutationMethod = DOMMutationMethods[propName]),
+ properties[propName] = propertyInfo;
+ }
+ }
+ }, ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD", ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040", ROOT_ATTRIBUTE_NAME = "data-reactroot", properties = {}, injection = DOMPropertyInjection, MUST_USE_PROPERTY = injection.MUST_USE_PROPERTY, HAS_BOOLEAN_VALUE = injection.HAS_BOOLEAN_VALUE, HAS_NUMERIC_VALUE = injection.HAS_NUMERIC_VALUE, HAS_POSITIVE_NUMERIC_VALUE = injection.HAS_POSITIVE_NUMERIC_VALUE, HAS_OVERLOADED_BOOLEAN_VALUE = injection.HAS_OVERLOADED_BOOLEAN_VALUE, HAS_STRING_BOOLEAN_VALUE = injection.HAS_STRING_BOOLEAN_VALUE, HTMLDOMPropertyConfig = {
+ Properties: {
+ allowFullScreen: HAS_BOOLEAN_VALUE,
+ async: HAS_BOOLEAN_VALUE,
+ autoFocus: HAS_BOOLEAN_VALUE,
+ autoPlay: HAS_BOOLEAN_VALUE,
+ capture: HAS_OVERLOADED_BOOLEAN_VALUE,
+ checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ cols: HAS_POSITIVE_NUMERIC_VALUE,
+ contentEditable: HAS_STRING_BOOLEAN_VALUE,
+ controls: HAS_BOOLEAN_VALUE,
+ default: HAS_BOOLEAN_VALUE,
+ defer: HAS_BOOLEAN_VALUE,
+ disabled: HAS_BOOLEAN_VALUE,
+ download: HAS_OVERLOADED_BOOLEAN_VALUE,
+ draggable: HAS_STRING_BOOLEAN_VALUE,
+ formNoValidate: HAS_BOOLEAN_VALUE,
+ hidden: HAS_BOOLEAN_VALUE,
+ loop: HAS_BOOLEAN_VALUE,
+ multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ noValidate: HAS_BOOLEAN_VALUE,
+ open: HAS_BOOLEAN_VALUE,
+ playsInline: HAS_BOOLEAN_VALUE,
+ readOnly: HAS_BOOLEAN_VALUE,
+ required: HAS_BOOLEAN_VALUE,
+ reversed: HAS_BOOLEAN_VALUE,
+ rows: HAS_POSITIVE_NUMERIC_VALUE,
+ rowSpan: HAS_NUMERIC_VALUE,
+ scoped: HAS_BOOLEAN_VALUE,
+ seamless: HAS_BOOLEAN_VALUE,
+ selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ size: HAS_POSITIVE_NUMERIC_VALUE,
+ start: HAS_NUMERIC_VALUE,
+ span: HAS_POSITIVE_NUMERIC_VALUE,
+ spellCheck: HAS_STRING_BOOLEAN_VALUE,
+ style: 0,
+ tabIndex: 0,
+ itemScope: HAS_BOOLEAN_VALUE,
+ acceptCharset: 0,
+ className: 0,
+ htmlFor: 0,
+ httpEquiv: 0,
+ value: HAS_STRING_BOOLEAN_VALUE
+ },
+ DOMAttributeNames: {
+ acceptCharset: "accept-charset",
+ className: "class",
+ htmlFor: "for",
+ httpEquiv: "http-equiv"
+ },
+ DOMMutationMethods: {
+ value: function(node, value) {
+ if (null == value) return node.removeAttribute("value");
+ "number" !== node.type || !1 === node.hasAttribute("value") ? node.setAttribute("value", "" + value) : node.validity && !node.validity.badInput && node.ownerDocument.activeElement !== node && node.setAttribute("value", "" + value);
+ }
+ }
+ }, HAS_STRING_BOOLEAN_VALUE$1 = injection.HAS_STRING_BOOLEAN_VALUE, NS = {
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace"
+ }, ATTRS = [ "accent-height", "alignment-baseline", "arabic-form", "baseline-shift", "cap-height", "clip-path", "clip-rule", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "dominant-baseline", "enable-background", "fill-opacity", "fill-rule", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "glyph-name", "glyph-orientation-horizontal", "glyph-orientation-vertical", "horiz-adv-x", "horiz-origin-x", "image-rendering", "letter-spacing", "lighting-color", "marker-end", "marker-mid", "marker-start", "overline-position", "overline-thickness", "paint-order", "panose-1", "pointer-events", "rendering-intent", "shape-rendering", "stop-color", "stop-opacity", "strikethrough-position", "strikethrough-thickness", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-anchor", "text-decoration", "text-rendering", "underline-position", "underline-thickness", "unicode-bidi", "unicode-range", "units-per-em", "v-alphabetic", "v-hanging", "v-ideographic", "v-mathematical", "vector-effect", "vert-adv-y", "vert-origin-x", "vert-origin-y", "word-spacing", "writing-mode", "x-height", "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", "xlink:title", "xlink:type", "xml:base", "xmlns:xlink", "xml:lang", "xml:space" ], SVGDOMPropertyConfig = {
+ Properties: {
+ autoReverse: HAS_STRING_BOOLEAN_VALUE$1,
+ externalResourcesRequired: HAS_STRING_BOOLEAN_VALUE$1,
+ preserveAlpha: HAS_STRING_BOOLEAN_VALUE$1
+ },
+ DOMAttributeNames: {
+ autoReverse: "autoReverse",
+ externalResourcesRequired: "externalResourcesRequired",
+ preserveAlpha: "preserveAlpha"
+ },
+ DOMAttributeNamespaces: {
+ xlinkActuate: NS.xlink,
+ xlinkArcrole: NS.xlink,
+ xlinkHref: NS.xlink,
+ xlinkRole: NS.xlink,
+ xlinkShow: NS.xlink,
+ xlinkTitle: NS.xlink,
+ xlinkType: NS.xlink,
+ xmlBase: NS.xml,
+ xmlLang: NS.xml,
+ xmlSpace: NS.xml
+ }
+ }, CAMELIZE = /[\-\:]([a-z])/g, capitalize = function(token) {
+ return token[1].toUpperCase();
+ };
+ ATTRS.forEach(function(original) {
+ var reactName = original.replace(CAMELIZE, capitalize);
+ SVGDOMPropertyConfig.Properties[reactName] = 0, SVGDOMPropertyConfig.DOMAttributeNames[reactName] = original;
+ }), injection.injectDOMPropertyConfig(HTMLDOMPropertyConfig), injection.injectDOMPropertyConfig(SVGDOMPropertyConfig);
+ var ReactErrorUtils = {
+ _caughtError: null,
+ _hasCaughtError: !1,
+ _rethrowError: null,
+ _hasRethrowError: !1,
+ injection: {
+ injectErrorUtils: function(injectedErrorUtils) {
+ "function" != typeof injectedErrorUtils.invokeGuardedCallback && invariant(!1, "Injected invokeGuardedCallback() must be a function."),
+ invokeGuardedCallback = injectedErrorUtils.invokeGuardedCallback;
+ }
+ },
+ invokeGuardedCallback: function(name, func, context, a, b, c, d, e, f) {
+ invokeGuardedCallback.apply(ReactErrorUtils, arguments);
+ },
+ invokeGuardedCallbackAndCatchFirstError: function(name, func, context, a, b, c, d, e, f) {
+ if (ReactErrorUtils.invokeGuardedCallback.apply(this, arguments), ReactErrorUtils.hasCaughtError()) {
+ var error = ReactErrorUtils.clearCaughtError();
+ ReactErrorUtils._hasRethrowError || (ReactErrorUtils._hasRethrowError = !0, ReactErrorUtils._rethrowError = error);
+ }
+ },
+ rethrowCaughtError: function() {
+ return rethrowCaughtError.apply(ReactErrorUtils, arguments);
+ },
+ hasCaughtError: function() {
+ return ReactErrorUtils._hasCaughtError;
+ },
+ clearCaughtError: function() {
+ if (ReactErrorUtils._hasCaughtError) {
+ var error = ReactErrorUtils._caughtError;
+ return ReactErrorUtils._caughtError = null, ReactErrorUtils._hasCaughtError = !1,
+ error;
+ }
+ invariant(!1, "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ }, invokeGuardedCallback = function(name, func, context, a, b, c, d, e, f) {
+ ReactErrorUtils._hasCaughtError = !1, ReactErrorUtils._caughtError = null;
+ var funcArgs = Array.prototype.slice.call(arguments, 3);
+ try {
+ func.apply(context, funcArgs);
+ } catch (error) {
+ ReactErrorUtils._caughtError = error, ReactErrorUtils._hasCaughtError = !0;
+ }
+ };
+ if ("undefined" != typeof window && "function" == typeof window.dispatchEvent && "undefined" != typeof document && "function" == typeof document.createEvent) {
+ var fakeNode = document.createElement("react");
+ invokeGuardedCallback = function(name, func, context, a, b, c, d, e, f) {
+ function callCallback() {
+ fakeNode.removeEventListener(evtType, callCallback, !1), func.apply(context, funcArgs),
+ didError = !1;
+ }
+ function onError(event) {
+ error = event.error, didSetError = !0, null === error && 0 === event.colno && 0 === event.lineno && (isCrossOriginError = !0);
+ }
+ var didError = !0, funcArgs = Array.prototype.slice.call(arguments, 3), error = void 0, didSetError = !1, isCrossOriginError = !1, evtType = "react-" + (name || "invokeguardedcallback");
+ window.addEventListener("error", onError), fakeNode.addEventListener(evtType, callCallback, !1);
+ var evt = document.createEvent("Event");
+ evt.initEvent(evtType, !1, !1), fakeNode.dispatchEvent(evt), didError ? (didSetError ? isCrossOriginError && (error = new Error("A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://fb.me/react-crossorigin-error for more information.")) : error = new Error("An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the \"Pause on exceptions\" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue."),
+ ReactErrorUtils._hasCaughtError = !0, ReactErrorUtils._caughtError = error) : (ReactErrorUtils._hasCaughtError = !1,
+ ReactErrorUtils._caughtError = null), window.removeEventListener("error", onError);
+ };
+ }
+ var validateEventDispatches, rethrowCaughtError = function() {
+ if (ReactErrorUtils._hasRethrowError) {
+ var error = ReactErrorUtils._rethrowError;
+ throw ReactErrorUtils._rethrowError = null, ReactErrorUtils._hasRethrowError = !1,
+ error;
+ }
+ }, eventPluginOrder = null, namesToPlugins = {}, plugins = [], eventNameDispatchConfigs = {}, registrationNameModules = {}, registrationNameDependencies = {}, possibleRegistrationNames = {}, EventPluginRegistry = Object.freeze({
+ plugins: plugins,
+ eventNameDispatchConfigs: eventNameDispatchConfigs,
+ registrationNameModules: registrationNameModules,
+ registrationNameDependencies: registrationNameDependencies,
+ possibleRegistrationNames: possibleRegistrationNames,
+ injectEventPluginOrder: injectEventPluginOrder,
+ injectEventPluginsByName: injectEventPluginsByName
+ }), getFiberCurrentPropsFromNode = null, getInstanceFromNode = null, getNodeFromInstance = null, injection$2 = {
+ injectComponentTree: function(Injected) {
+ getFiberCurrentPropsFromNode = Injected.getFiberCurrentPropsFromNode, getInstanceFromNode = Injected.getInstanceFromNode,
+ getNodeFromInstance = Injected.getNodeFromInstance, warning(getNodeFromInstance && getInstanceFromNode, "EventPluginUtils.injection.injectComponentTree(...): Injected module is missing getNodeFromInstance or getInstanceFromNode.");
+ }
+ };
+ validateEventDispatches = function(event) {
+ var dispatchListeners = event._dispatchListeners, dispatchInstances = event._dispatchInstances, listenersIsArr = Array.isArray(dispatchListeners), listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0, instancesIsArr = Array.isArray(dispatchInstances), instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;
+ warning(instancesIsArr === listenersIsArr && instancesLen === listenersLen, "EventPluginUtils: Invalid ` + "`")) + (`event` + ("`" + `.");
+ };
+ var eventQueue = null, executeDispatchesAndRelease = function(event, simulated) {
+ event && (executeDispatchesInOrder(event, simulated), event.isPersistent() || event.constructor.release(event));
+ }, executeDispatchesAndReleaseSimulated = function(e) {
+ return executeDispatchesAndRelease(e, !0);
+ }, executeDispatchesAndReleaseTopLevel = function(e) {
+ return executeDispatchesAndRelease(e, !1);
+ }, injection$1 = {
+ injectEventPluginOrder: injectEventPluginOrder,
+ injectEventPluginsByName: injectEventPluginsByName
+ }, EventPluginHub = Object.freeze({
+ injection: injection$1,
+ getListener: getListener,
+ extractEvents: extractEvents,
+ enqueueEvents: enqueueEvents,
+ processEventQueue: processEventQueue
+ }), IndeterminateComponent = 0, FunctionalComponent = 1, ClassComponent = 2, HostRoot = 3, HostPortal = 4, HostComponent = 5, HostText = 6, CallComponent = 7, CallHandlerPhase = 8, ReturnComponent = 9, Fragment = 10, randomKey = Math.random().toString(36).slice(2), internalInstanceKey = "__reactInternalInstance$" + randomKey, internalEventHandlersKey = "__reactEventHandlers$" + randomKey, ReactDOMComponentTree = Object.freeze({
+ precacheFiberNode: precacheFiberNode$1,
+ getClosestInstanceFromNode: getClosestInstanceFromNode,
+ getInstanceFromNode: getInstanceFromNode$1,
+ getNodeFromInstance: getNodeFromInstance$1,
+ getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode$1,
+ updateFiberProps: updateFiberProps$1
+ }), EventPropagators = Object.freeze({
+ accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
+ accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,
+ accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches,
+ accumulateDirectDispatches: accumulateDirectDispatches
+ }), contentKey = null, compositionState = {
+ _root: null,
+ _startText: null,
+ _fallbackText: null
+ }, didWarnForAddedNewProperty = !1, isProxySupported = "function" == typeof Proxy, EVENT_POOL_SIZE = 10, shouldBeReleasedProperties = [ "dispatchConfig", "_targetInst", "nativeEvent", "isDefaultPrevented", "isPropagationStopped", "_dispatchListeners", "_dispatchInstances" ], EventInterface = {
+ type: null,
+ target: null,
+ currentTarget: emptyFunction.thatReturnsNull,
+ eventPhase: null,
+ bubbles: null,
+ cancelable: null,
+ timeStamp: function(event) {
+ return event.timeStamp || Date.now();
+ },
+ defaultPrevented: null,
+ isTrusted: null
+ };
+ _assign(SyntheticEvent.prototype, {
+ preventDefault: function() {
+ this.defaultPrevented = !0;
+ var event = this.nativeEvent;
+ event && (event.preventDefault ? event.preventDefault() : "unknown" != typeof event.returnValue && (event.returnValue = !1),
+ this.isDefaultPrevented = emptyFunction.thatReturnsTrue);
+ },
+ stopPropagation: function() {
+ var event = this.nativeEvent;
+ event && (event.stopPropagation ? event.stopPropagation() : "unknown" != typeof event.cancelBubble && (event.cancelBubble = !0),
+ this.isPropagationStopped = emptyFunction.thatReturnsTrue);
+ },
+ persist: function() {
+ this.isPersistent = emptyFunction.thatReturnsTrue;
+ },
+ isPersistent: emptyFunction.thatReturnsFalse,
+ destructor: function() {
+ var Interface = this.constructor.Interface;
+ for (var propName in Interface) Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));
+ for (var i = 0; i < shouldBeReleasedProperties.length; i++) this[shouldBeReleasedProperties[i]] = null;
+ Object.defineProperty(this, "nativeEvent", getPooledWarningPropertyDefinition("nativeEvent", null)),
+ Object.defineProperty(this, "preventDefault", getPooledWarningPropertyDefinition("preventDefault", emptyFunction)),
+ Object.defineProperty(this, "stopPropagation", getPooledWarningPropertyDefinition("stopPropagation", emptyFunction));
+ }
+ }), SyntheticEvent.Interface = EventInterface, SyntheticEvent.augmentClass = function(Class, Interface) {
+ var Super = this, E = function() {};
+ E.prototype = Super.prototype;
+ var prototype = new E();
+ _assign(prototype, Class.prototype), Class.prototype = prototype, Class.prototype.constructor = Class,
+ Class.Interface = _assign({}, Super.Interface, Interface), Class.augmentClass = Super.augmentClass,
+ addEventPoolingTo(Class);
+ }, isProxySupported && (SyntheticEvent = new Proxy(SyntheticEvent, {
+ construct: function(target, args) {
+ return this.apply(target, Object.create(target.prototype), args);
+ },
+ apply: function(constructor, that, args) {
+ return new Proxy(constructor.apply(that, args), {
+ set: function(target, prop, value) {
+ return "isPersistent" === prop || target.constructor.Interface.hasOwnProperty(prop) || -1 !== shouldBeReleasedProperties.indexOf(prop) || (warning(didWarnForAddedNewProperty || target.isPersistent(), "This synthetic event is reused for performance reasons. If you're seeing this, you're adding a new property in the synthetic event object. The property is never released. See https://fb.me/react-event-pooling for more information."),
+ didWarnForAddedNewProperty = !0), target[prop] = value, !0;
+ }
+ });
+ }
+ })), addEventPoolingTo(SyntheticEvent);
+ var SyntheticEvent$1 = SyntheticEvent, CompositionEventInterface = {
+ data: null
+ };
+ SyntheticEvent$1.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);
+ var InputEventInterface = {
+ data: null
+ };
+ SyntheticEvent$1.augmentClass(SyntheticInputEvent, InputEventInterface);
+ var END_KEYCODES = [ 9, 13, 27, 32 ], START_KEYCODE = 229, canUseCompositionEvent = ExecutionEnvironment.canUseDOM && "CompositionEvent" in window, documentMode = null;
+ ExecutionEnvironment.canUseDOM && "documentMode" in document && (documentMode = document.documentMode);
+ var useHasFeature, canUseTextInputEvent = ExecutionEnvironment.canUseDOM && "TextEvent" in window && !documentMode && !function() {
+ var opera = window.opera;
+ return "object" == typeof opera && "function" == typeof opera.version && parseInt(opera.version(), 10) <= 12;
+ }(), useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11), SPACEBAR_CODE = 32, SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE), eventTypes = {
+ beforeInput: {
+ phasedRegistrationNames: {
+ bubbled: "onBeforeInput",
+ captured: "onBeforeInputCapture"
+ },
+ dependencies: [ "topCompositionEnd", "topKeyPress", "topTextInput", "topPaste" ]
+ },
+ compositionEnd: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionEnd",
+ captured: "onCompositionEndCapture"
+ },
+ dependencies: [ "topBlur", "topCompositionEnd", "topKeyDown", "topKeyPress", "topKeyUp", "topMouseDown" ]
+ },
+ compositionStart: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionStart",
+ captured: "onCompositionStartCapture"
+ },
+ dependencies: [ "topBlur", "topCompositionStart", "topKeyDown", "topKeyPress", "topKeyUp", "topMouseDown" ]
+ },
+ compositionUpdate: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionUpdate",
+ captured: "onCompositionUpdateCapture"
+ },
+ dependencies: [ "topBlur", "topCompositionUpdate", "topKeyDown", "topKeyPress", "topKeyUp", "topMouseDown" ]
+ }
+ }, hasSpaceKeypress = !1, isComposing = !1, BeforeInputEventPlugin = {
+ eventTypes: eventTypes,
+ extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ return [ extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) ];
+ }
+ }, fiberHostComponent = null, ReactControlledComponentInjection = {
+ injectFiberControlledHostComponent: function(hostComponentImpl) {
+ fiberHostComponent = hostComponentImpl;
+ }
+ }, restoreTarget = null, restoreQueue = null, injection$3 = ReactControlledComponentInjection, ReactControlledComponent = Object.freeze({
+ injection: injection$3,
+ enqueueStateRestore: enqueueStateRestore,
+ restoreStateIfNeeded: restoreStateIfNeeded
+ }), fiberBatchedUpdates = function(fn, bookkeeping) {
+ return fn(bookkeeping);
+ }, isNestingBatched = !1, ReactGenericBatchingInjection = {
+ injectFiberBatchedUpdates: function(_batchedUpdates) {
+ fiberBatchedUpdates = _batchedUpdates;
+ }
+ }, injection$4 = ReactGenericBatchingInjection, supportedInputTypes = {
+ color: !0,
+ date: !0,
+ datetime: !0,
+ "datetime-local": !0,
+ email: !0,
+ month: !0,
+ number: !0,
+ password: !0,
+ range: !0,
+ search: !0,
+ tel: !0,
+ text: !0,
+ time: !0,
+ url: !0,
+ week: !0
+ }, ELEMENT_NODE = 1, TEXT_NODE = 3, COMMENT_NODE = 8, DOCUMENT_NODE = 9, DOCUMENT_FRAGMENT_NODE = 11;
+ ExecutionEnvironment.canUseDOM && (useHasFeature = document.implementation && document.implementation.hasFeature && !0 !== document.implementation.hasFeature("", ""));
+ var eventTypes$1 = {
+ change: {
+ phasedRegistrationNames: {
+ bubbled: "onChange",
+ captured: "onChangeCapture"
+ },
+ dependencies: [ "topBlur", "topChange", "topClick", "topFocus", "topInput", "topKeyDown", "topKeyUp", "topSelectionChange" ]
+ }
+ }, activeElement = null, activeElementInst = null, isInputEventSupported = !1;
+ ExecutionEnvironment.canUseDOM && (isInputEventSupported = isEventSupported("input") && (!document.documentMode || document.documentMode > 9));
+ var ChangeEventPlugin = {
+ eventTypes: eventTypes$1,
+ _isInputEventSupported: isInputEventSupported,
+ extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var getTargetInstFunc, handleEventFunc, targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
+ if (shouldUseChangeEvent(targetNode) ? getTargetInstFunc = getTargetInstForChangeEvent : isTextInputElement(targetNode) ? isInputEventSupported ? getTargetInstFunc = getTargetInstForInputOrChangeEvent : (getTargetInstFunc = getTargetInstForInputEventPolyfill,
+ handleEventFunc = handleEventsForInputEventPolyfill) : shouldUseClickEvent(targetNode) && (getTargetInstFunc = getTargetInstForClickEvent),
+ getTargetInstFunc) {
+ var inst = getTargetInstFunc(topLevelType, targetInst);
+ if (inst) {
+ return createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
+ }
+ }
+ handleEventFunc && handleEventFunc(topLevelType, targetNode, targetInst), "topBlur" === topLevelType && handleControlledInputBlur(targetInst, targetNode);
+ }
+ }, DOMEventPluginOrder = [ "ResponderEventPlugin", "SimpleEventPlugin", "TapEventPlugin", "EnterLeaveEventPlugin", "ChangeEventPlugin", "SelectEventPlugin", "BeforeInputEventPlugin" ], UIEventInterface = {
+ view: null,
+ detail: null
+ };
+ SyntheticEvent$1.augmentClass(SyntheticUIEvent, UIEventInterface);
+ var modifierKeyToProp = {
+ Alt: "altKey",
+ Control: "ctrlKey",
+ Meta: "metaKey",
+ Shift: "shiftKey"
+ }, MouseEventInterface = {
+ screenX: null,
+ screenY: null,
+ clientX: null,
+ clientY: null,
+ pageX: null,
+ pageY: null,
+ ctrlKey: null,
+ shiftKey: null,
+ altKey: null,
+ metaKey: null,
+ getModifierState: getEventModifierState,
+ button: null,
+ buttons: null,
+ relatedTarget: function(event) {
+ return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);
+ }
+ };
+ SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);
+ var eventTypes$2 = {
+ mouseEnter: {
+ registrationName: "onMouseEnter",
+ dependencies: [ "topMouseOut", "topMouseOver" ]
+ },
+ mouseLeave: {
+ registrationName: "onMouseLeave",
+ dependencies: [ "topMouseOut", "topMouseOver" ]
+ }
+ }, EnterLeaveEventPlugin = {
+ eventTypes: eventTypes$2,
+ extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ if ("topMouseOver" === topLevelType && (nativeEvent.relatedTarget || nativeEvent.fromElement)) return null;
+ if ("topMouseOut" !== topLevelType && "topMouseOver" !== topLevelType) return null;
+ var win;
+ if (nativeEventTarget.window === nativeEventTarget) win = nativeEventTarget; else {
+ var doc = nativeEventTarget.ownerDocument;
+ win = doc ? doc.defaultView || doc.parentWindow : window;
+ }
+ var from, to;
+ if ("topMouseOut" === topLevelType) {
+ from = targetInst;
+ var related = nativeEvent.relatedTarget || nativeEvent.toElement;
+ to = related ? getClosestInstanceFromNode(related) : null;
+ } else from = null, to = targetInst;
+ if (from === to) return null;
+ var fromNode = null == from ? win : getNodeFromInstance$1(from), toNode = null == to ? win : getNodeFromInstance$1(to), leave = SyntheticMouseEvent.getPooled(eventTypes$2.mouseLeave, from, nativeEvent, nativeEventTarget);
+ leave.type = "mouseleave", leave.target = fromNode, leave.relatedTarget = toNode;
+ var enter = SyntheticMouseEvent.getPooled(eventTypes$2.mouseEnter, to, nativeEvent, nativeEventTarget);
+ return enter.type = "mouseenter", enter.target = toNode, enter.relatedTarget = fromNode,
+ accumulateEnterLeaveDispatches(leave, enter, from, to), [ leave, enter ];
+ }
+ }, ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, ReactCurrentOwner = ReactInternals.ReactCurrentOwner, ReactDebugCurrentFrame = ReactInternals.ReactDebugCurrentFrame, NoEffect = 0, PerformedWork = 1, Placement = 2, Update = 4, PlacementAndUpdate = 6, Deletion = 8, ContentReset = 16, Callback = 32, Err = 64, Ref = 128, MOUNTING = 1, MOUNTED = 2, UNMOUNTED = 3, CALLBACK_BOOKKEEPING_POOL_SIZE = 10, callbackBookkeepingPool = [], _enabled = !0, _handleTopLevel = void 0, ReactDOMEventListener = Object.freeze({
+ get _enabled() {
+ return _enabled;
+ },
+ get _handleTopLevel() {
+ return _handleTopLevel;
+ },
+ setHandleTopLevel: setHandleTopLevel,
+ setEnabled: setEnabled,
+ isEnabled: isEnabled,
+ trapBubbledEvent: trapBubbledEvent,
+ trapCapturedEvent: trapCapturedEvent,
+ dispatchEvent: dispatchEvent
+ }), vendorPrefixes = {
+ animationend: makePrefixMap("Animation", "AnimationEnd"),
+ animationiteration: makePrefixMap("Animation", "AnimationIteration"),
+ animationstart: makePrefixMap("Animation", "AnimationStart"),
+ transitionend: makePrefixMap("Transition", "TransitionEnd")
+ }, prefixedEventNames = {}, style = {};
+ ExecutionEnvironment.canUseDOM && (style = document.createElement("div").style,
+ "AnimationEvent" in window || (delete vendorPrefixes.animationend.animation, delete vendorPrefixes.animationiteration.animation,
+ delete vendorPrefixes.animationstart.animation), "TransitionEvent" in window || delete vendorPrefixes.transitionend.transition);
+ var topLevelTypes$1 = {
+ topAbort: "abort",
+ topAnimationEnd: getVendorPrefixedEventName("animationend") || "animationend",
+ topAnimationIteration: getVendorPrefixedEventName("animationiteration") || "animationiteration",
+ topAnimationStart: getVendorPrefixedEventName("animationstart") || "animationstart",
+ topBlur: "blur",
+ topCancel: "cancel",
+ topCanPlay: "canplay",
+ topCanPlayThrough: "canplaythrough",
+ topChange: "change",
+ topClick: "click",
+ topClose: "close",
+ topCompositionEnd: "compositionend",
+ topCompositionStart: "compositionstart",
+ topCompositionUpdate: "compositionupdate",
+ topContextMenu: "contextmenu",
+ topCopy: "copy",
+ topCut: "cut",
+ topDoubleClick: "dblclick",
+ topDrag: "drag",
+ topDragEnd: "dragend",
+ topDragEnter: "dragenter",
+ topDragExit: "dragexit",
+ topDragLeave: "dragleave",
+ topDragOver: "dragover",
+ topDragStart: "dragstart",
+ topDrop: "drop",
+ topDurationChange: "durationchange",
+ topEmptied: "emptied",
+ topEncrypted: "encrypted",
+ topEnded: "ended",
+ topError: "error",
+ topFocus: "focus",
+ topInput: "input",
+ topKeyDown: "keydown",
+ topKeyPress: "keypress",
+ topKeyUp: "keyup",
+ topLoadedData: "loadeddata",
+ topLoad: "load",
+ topLoadedMetadata: "loadedmetadata",
+ topLoadStart: "loadstart",
+ topMouseDown: "mousedown",
+ topMouseMove: "mousemove",
+ topMouseOut: "mouseout",
+ topMouseOver: "mouseover",
+ topMouseUp: "mouseup",
+ topPaste: "paste",
+ topPause: "pause",
+ topPlay: "play",
+ topPlaying: "playing",
+ topProgress: "progress",
+ topRateChange: "ratechange",
+ topScroll: "scroll",
+ topSeeked: "seeked",
+ topSeeking: "seeking",
+ topSelectionChange: "selectionchange",
+ topStalled: "stalled",
+ topSuspend: "suspend",
+ topTextInput: "textInput",
+ topTimeUpdate: "timeupdate",
+ topToggle: "toggle",
+ topTouchCancel: "touchcancel",
+ topTouchEnd: "touchend",
+ topTouchMove: "touchmove",
+ topTouchStart: "touchstart",
+ topTransitionEnd: getVendorPrefixedEventName("transitionend") || "transitionend",
+ topVolumeChange: "volumechange",
+ topWaiting: "waiting",
+ topWheel: "wheel"
+ }, BrowserEventConstants = {
+ topLevelTypes: topLevelTypes$1
+ }, topLevelTypes = BrowserEventConstants.topLevelTypes, alreadyListeningTo = {}, reactTopListenersCounter = 0, topListenersIDKey = "_reactListenersID" + ("" + Math.random()).slice(2), skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && "documentMode" in document && document.documentMode <= 11, eventTypes$3 = {
+ select: {
+ phasedRegistrationNames: {
+ bubbled: "onSelect",
+ captured: "onSelectCapture"
+ },
+ dependencies: [ "topBlur", "topContextMenu", "topFocus", "topKeyDown", "topKeyUp", "topMouseDown", "topMouseUp", "topSelectionChange" ]
+ }
+ }, activeElement$1 = null, activeElementInst$1 = null, lastSelection = null, mouseDown = !1, SelectEventPlugin = {
+ eventTypes: eventTypes$3,
+ extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : nativeEventTarget.nodeType === DOCUMENT_NODE ? nativeEventTarget : nativeEventTarget.ownerDocument;
+ if (!doc || !isListeningToAllDependencies("onSelect", doc)) return null;
+ var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
+ switch (topLevelType) {
+ case "topFocus":
+ (isTextInputElement(targetNode) || "true" === targetNode.contentEditable) && (activeElement$1 = targetNode,
+ activeElementInst$1 = targetInst, lastSelection = null);
+ break;
+
+ case "topBlur":
+ activeElement$1 = null, activeElementInst$1 = null, lastSelection = null;
+ break;
+
+ case "topMouseDown":
+ mouseDown = !0;
+ break;
+
+ case "topContextMenu":
+ case "topMouseUp":
+ return mouseDown = !1, constructSelectEvent(nativeEvent, nativeEventTarget);
+
+ case "topSelectionChange":
+ if (skipSelectionChangeEvent) break;
+
+ case "topKeyDown":
+ case "topKeyUp":
+ return constructSelectEvent(nativeEvent, nativeEventTarget);
+ }
+ return null;
+ }
+ }, AnimationEventInterface = {
+ animationName: null,
+ elapsedTime: null,
+ pseudoElement: null
+ };
+ SyntheticEvent$1.augmentClass(SyntheticAnimationEvent, AnimationEventInterface);
+ var ClipboardEventInterface = {
+ clipboardData: function(event) {
+ return "clipboardData" in event ? event.clipboardData : window.clipboardData;
+ }
+ };
+ SyntheticEvent$1.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);
+ var FocusEventInterface = {
+ relatedTarget: null
+ };
+ SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);
+ var normalizeKey = {
+ Esc: "Escape",
+ Spacebar: " ",
+ Left: "ArrowLeft",
+ Up: "ArrowUp",
+ Right: "ArrowRight",
+ Down: "ArrowDown",
+ Del: "Delete",
+ Win: "OS",
+ Menu: "ContextMenu",
+ Apps: "ContextMenu",
+ Scroll: "ScrollLock",
+ MozPrintableKey: "Unidentified"
+ }, translateToKey = {
+ "8": "Backspace",
+ "9": "Tab",
+ "12": "Clear",
+ "13": "Enter",
+ "16": "Shift",
+ "17": "Control",
+ "18": "Alt",
+ "19": "Pause",
+ "20": "CapsLock",
+ "27": "Escape",
+ "32": " ",
+ "33": "PageUp",
+ "34": "PageDown",
+ "35": "End",
+ "36": "Home",
+ "37": "ArrowLeft",
+ "38": "ArrowUp",
+ "39": "ArrowRight",
+ "40": "ArrowDown",
+ "45": "Insert",
+ "46": "Delete",
+ "112": "F1",
+ "113": "F2",
+ "114": "F3",
+ "115": "F4",
+ "116": "F5",
+ "117": "F6",
+ "118": "F7",
+ "119": "F8",
+ "120": "F9",
+ "121": "F10",
+ "122": "F11",
+ "123": "F12",
+ "144": "NumLock",
+ "145": "ScrollLock",
+ "224": "Meta"
+ }, KeyboardEventInterface = {
+ key: getEventKey,
+ location: null,
+ ctrlKey: null,
+ shiftKey: null,
+ altKey: null,
+ metaKey: null,
+ repeat: null,
+ locale: null,
+ getModifierState: getEventModifierState,
+ charCode: function(event) {
+ return "keypress" === event.type ? getEventCharCode(event) : 0;
+ },
+ keyCode: function(event) {
+ return "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0;
+ },
+ which: function(event) {
+ return "keypress" === event.type ? getEventCharCode(event) : "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0;
+ }
+ };
+ SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);
+ var DragEventInterface = {
+ dataTransfer: null
+ };
+ SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);
+ var TouchEventInterface = {
+ touches: null,
+ targetTouches: null,
+ changedTouches: null,
+ altKey: null,
+ metaKey: null,
+ ctrlKey: null,
+ shiftKey: null,
+ getModifierState: getEventModifierState
+ };
+ SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);
+ var TransitionEventInterface = {
+ propertyName: null,
+ elapsedTime: null,
+ pseudoElement: null
+ };
+ SyntheticEvent$1.augmentClass(SyntheticTransitionEvent, TransitionEventInterface);
+ var WheelEventInterface = {
+ deltaX: function(event) {
+ return "deltaX" in event ? event.deltaX : "wheelDeltaX" in event ? -event.wheelDeltaX : 0;
+ },
+ deltaY: function(event) {
+ return "deltaY" in event ? event.deltaY : "wheelDeltaY" in event ? -event.wheelDeltaY : "wheelDelta" in event ? -event.wheelDelta : 0;
+ },
+ deltaZ: null,
+ deltaMode: null
+ };
+ SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);
+ var eventTypes$4 = {}, topLevelEventsToDispatchConfig = {};
+ [ "abort", "animationEnd", "animationIteration", "animationStart", "blur", "cancel", "canPlay", "canPlayThrough", "click", "close", "contextMenu", "copy", "cut", "doubleClick", "drag", "dragEnd", "dragEnter", "dragExit", "dragLeave", "dragOver", "dragStart", "drop", "durationChange", "emptied", "encrypted", "ended", "error", "focus", "input", "invalid", "keyDown", "keyPress", "keyUp", "load", "loadedData", "loadedMetadata", "loadStart", "mouseDown", "mouseMove", "mouseOut", "mouseOver", "mouseUp", "paste", "pause", "play", "playing", "progress", "rateChange", "reset", "scroll", "seeked", "seeking", "stalled", "submit", "suspend", "timeUpdate", "toggle", "touchCancel", "touchEnd", "touchMove", "touchStart", "transitionEnd", "volumeChange", "waiting", "wheel" ].forEach(function(event) {
+ var capitalizedEvent = event[0].toUpperCase() + event.slice(1), onEvent = "on" + capitalizedEvent, topEvent = "top" + capitalizedEvent, type = {
+ phasedRegistrationNames: {
+ bubbled: onEvent,
+ captured: onEvent + "Capture"
+ },
+ dependencies: [ topEvent ]
+ };
+ eventTypes$4[event] = type, topLevelEventsToDispatchConfig[topEvent] = type;
+ });
+ var knownHTMLTopLevelTypes = [ "topAbort", "topCancel", "topCanPlay", "topCanPlayThrough", "topClose", "topDurationChange", "topEmptied", "topEncrypted", "topEnded", "topError", "topInput", "topInvalid", "topLoad", "topLoadedData", "topLoadedMetadata", "topLoadStart", "topPause", "topPlay", "topPlaying", "topProgress", "topRateChange", "topReset", "topSeeked", "topSeeking", "topStalled", "topSubmit", "topSuspend", "topTimeUpdate", "topToggle", "topVolumeChange", "topWaiting" ], SimpleEventPlugin = {
+ eventTypes: eventTypes$4,
+ extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
+ if (!dispatchConfig) return null;
+ var EventConstructor;
+ switch (topLevelType) {
+ case "topKeyPress":
+ if (0 === getEventCharCode(nativeEvent)) return null;
+
+ case "topKeyDown":
+ case "topKeyUp":
+ EventConstructor = SyntheticKeyboardEvent;
+ break;
+
+ case "topBlur":
+ case "topFocus":
+ EventConstructor = SyntheticFocusEvent;
+ break;
+
+ case "topClick":
+ if (2 === nativeEvent.button) return null;
+
+ case "topDoubleClick":
+ case "topMouseDown":
+ case "topMouseMove":
+ case "topMouseUp":
+ case "topMouseOut":
+ case "topMouseOver":
+ case "topContextMenu":
+ EventConstructor = SyntheticMouseEvent;
+ break;
+
+ case "topDrag":
+ case "topDragEnd":
+ case "topDragEnter":
+ case "topDragExit":
+ case "topDragLeave":
+ case "topDragOver":
+ case "topDragStart":
+ case "topDrop":
+ EventConstructor = SyntheticDragEvent;
+ break;
+
+ case "topTouchCancel":
+ case "topTouchEnd":
+ case "topTouchMove":
+ case "topTouchStart":
+ EventConstructor = SyntheticTouchEvent;
+ break;
+
+ case "topAnimationEnd":
+ case "topAnimationIteration":
+ case "topAnimationStart":
+ EventConstructor = SyntheticAnimationEvent;
+ break;
+
+ case "topTransitionEnd":
+ EventConstructor = SyntheticTransitionEvent;
+ break;
+
+ case "topScroll":
+ EventConstructor = SyntheticUIEvent;
+ break;
+
+ case "topWheel":
+ EventConstructor = SyntheticWheelEvent;
+ break;
+
+ case "topCopy":
+ case "topCut":
+ case "topPaste":
+ EventConstructor = SyntheticClipboardEvent;
+ break;
+
+ default:
+ -1 === knownHTMLTopLevelTypes.indexOf(topLevelType) && warning(!1, "SimpleEventPlugin: Unhandled event type, `))))) + (((("`" + (`%s` + "`")) + (`. This warning is likely caused by a bug in React. Please file an issue.", topLevelType),
+ EventConstructor = SyntheticEvent$1;
+ }
+ var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
+ return accumulateTwoPhaseDispatches(event), event;
+ }
+ };
+ setHandleTopLevel(handleTopLevel), injection$1.injectEventPluginOrder(DOMEventPluginOrder),
+ injection$2.injectComponentTree(ReactDOMComponentTree), injection$1.injectEventPluginsByName({
+ SimpleEventPlugin: SimpleEventPlugin,
+ EnterLeaveEventPlugin: EnterLeaveEventPlugin,
+ ChangeEventPlugin: ChangeEventPlugin,
+ SelectEventPlugin: SelectEventPlugin,
+ BeforeInputEventPlugin: BeforeInputEventPlugin
+ });
+ var enableAsyncSubtreeAPI = !0, enableUserTimingAPI = !0, enableMutatingReconciler = !0, enablePersistentReconciler = !1, debugRenderPhaseSideEffects = !1, valueStack = [], fiberStack = [], index = -1, describeComponentFrame = function(name, source, ownerName) {
+ return "\n in " + (name || "Unknown") + (source ? " (at " + source.fileName.replace(/^.*[\\\/]/, "") + ":" + source.lineNumber + ")" : ownerName ? " (created by " + ownerName + ")" : "");
+ }, ReactDebugCurrentFiber = {
+ current: null,
+ phase: null,
+ resetCurrentFiber: resetCurrentFiber,
+ setCurrentFiber: setCurrentFiber,
+ setCurrentPhase: setCurrentPhase,
+ getCurrentFiberOwnerName: getCurrentFiberOwnerName,
+ getCurrentFiberStackAddendum: getCurrentFiberStackAddendum
+ }, supportsUserTiming = "undefined" != typeof performance && "function" == typeof performance.mark && "function" == typeof performance.clearMarks && "function" == typeof performance.measure && "function" == typeof performance.clearMeasures, currentFiber = null, currentPhase = null, currentPhaseFiber = null, isCommitting = !1, hasScheduledUpdateInCurrentCommit = !1, hasScheduledUpdateInCurrentPhase = !1, commitCountInCurrentWorkLoop = 0, effectCountInCurrentCommit = 0, isWaitingForCallback = !1, labelsInCurrentCommit = new Set(), formatMarkName = function(markName) {
+ return "⚛ " + markName;
+ }, formatLabel = function(label, warning$$1) {
+ return (warning$$1 ? "⛔ " : "⚛ ") + label + (warning$$1 ? " Warning: " + warning$$1 : "");
+ }, beginMark = function(markName) {
+ performance.mark(formatMarkName(markName));
+ }, clearMark = function(markName) {
+ performance.clearMarks(formatMarkName(markName));
+ }, endMark = function(label, markName, warning$$1) {
+ var formattedMarkName = formatMarkName(markName), formattedLabel = formatLabel(label, warning$$1);
+ try {
+ performance.measure(formattedLabel, formattedMarkName);
+ } catch (err) {}
+ performance.clearMarks(formattedMarkName), performance.clearMeasures(formattedLabel);
+ }, getFiberMarkName = function(label, debugID) {
+ return label + " (#" + debugID + ")";
+ }, getFiberLabel = function(componentName, isMounted, phase) {
+ return null === phase ? componentName + " [" + (isMounted ? "update" : "mount") + "]" : componentName + "." + phase;
+ }, beginFiberMark = function(fiber, phase) {
+ var componentName = getComponentName(fiber) || "Unknown", debugID = fiber._debugID, isMounted = null !== fiber.alternate, label = getFiberLabel(componentName, isMounted, phase);
+ if (isCommitting && labelsInCurrentCommit.has(label)) return !1;
+ labelsInCurrentCommit.add(label);
+ var markName = getFiberMarkName(label, debugID);
+ return beginMark(markName), !0;
+ }, clearFiberMark = function(fiber, phase) {
+ var componentName = getComponentName(fiber) || "Unknown", debugID = fiber._debugID, isMounted = null !== fiber.alternate, label = getFiberLabel(componentName, isMounted, phase), markName = getFiberMarkName(label, debugID);
+ clearMark(markName);
+ }, endFiberMark = function(fiber, phase, warning$$1) {
+ var componentName = getComponentName(fiber) || "Unknown", debugID = fiber._debugID, isMounted = null !== fiber.alternate, label = getFiberLabel(componentName, isMounted, phase), markName = getFiberMarkName(label, debugID);
+ endMark(label, markName, warning$$1);
+ }, shouldIgnoreFiber = function(fiber) {
+ switch (fiber.tag) {
+ case HostRoot:
+ case HostComponent:
+ case HostText:
+ case HostPortal:
+ case ReturnComponent:
+ case Fragment:
+ return !0;
+
+ default:
+ return !1;
+ }
+ }, clearPendingPhaseMeasurement = function() {
+ null !== currentPhase && null !== currentPhaseFiber && clearFiberMark(currentPhaseFiber, currentPhase),
+ currentPhaseFiber = null, currentPhase = null, hasScheduledUpdateInCurrentPhase = !1;
+ }, pauseTimers = function() {
+ for (var fiber = currentFiber; fiber; ) fiber._debugIsCurrentlyTiming && endFiberMark(fiber, null, null),
+ fiber = fiber.return;
+ }, resumeTimersRecursively = function(fiber) {
+ null !== fiber.return && resumeTimersRecursively(fiber.return), fiber._debugIsCurrentlyTiming && beginFiberMark(fiber, null);
+ }, resumeTimers = function() {
+ null !== currentFiber && resumeTimersRecursively(currentFiber);
+ }, warnedAboutMissingGetChildContext = {}, contextStackCursor = createCursor(emptyObject), didPerformWorkStackCursor = createCursor(!1), previousContext = emptyObject, NoWork = 0, Sync = 1, Never = 2147483647, UNIT_SIZE = 10, MAGIC_NUMBER_OFFSET = 2, NoContext = 0, AsyncUpdates = 1, hasBadMapPolyfill = !1;
+ try {
+ Object.preventExtensions({});
+ } catch (e) {
+ hasBadMapPolyfill = !0;
+ }
+ var debugCounter = 1, createFiber = function(tag, key, internalContextTag) {
+ return new FiberNode(tag, key, internalContextTag);
+ }, onCommitFiberRoot = null, onCommitFiberUnmount = null, hasLoggedError = !1, didWarnUpdateInsideUpdate = !1, fakeInternalInstance = {}, isArray = Array.isArray, didWarnAboutStateAssignmentForComponent = {}, warnOnInvalidCallback = function(callback, callerName) {
+ warning(null === callback || "function" == typeof callback, "%s(...): Expected the last optional ` + ("`" + `callback`))) + (("`" + (` argument to be a function. Instead received: %s.", callerName, callback);
+ };
+ Object.defineProperty(fakeInternalInstance, "_processChildContext", {
+ enumerable: !1,
+ value: function() {
+ invariant(!1, "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).");
+ }
+ }), Object.freeze(fakeInternalInstance);
+ var ReactFiberClassComponent = function(scheduleWork, computeExpirationForFiber, memoizeProps, memoizeState) {
+ function checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext) {
+ if (null === oldProps || null !== workInProgress.updateQueue && workInProgress.updateQueue.hasForceUpdate) return !0;
+ var instance = workInProgress.stateNode, type = workInProgress.type;
+ if ("function" == typeof instance.shouldComponentUpdate) {
+ startPhaseTimer(workInProgress, "shouldComponentUpdate");
+ var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, newContext);
+ return stopPhaseTimer(), debugRenderPhaseSideEffects && instance.shouldComponentUpdate(newProps, newState, newContext),
+ warning(void 0 !== shouldUpdate, "%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", getComponentName(workInProgress) || "Unknown"),
+ shouldUpdate;
+ }
+ return !type.prototype || !type.prototype.isPureReactComponent || (!shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState));
+ }
+ function checkClassInstance(workInProgress) {
+ var instance = workInProgress.stateNode, type = workInProgress.type, name = getComponentName(workInProgress);
+ instance.render || (type.prototype && "function" == typeof type.prototype.render ? warning(!1, "%s(...): No ` + "`")) + (`render` + ("`" + ` method found on the returned component instance: did you accidentally return an object from the constructor?", name) : warning(!1, "%s(...): No `)))) + ((("`" + (`render` + "`")) + (` method found on the returned component instance: you may have forgotten to define ` + ("`" + `render`))) + (("`" + (`.", name));
+ var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state;
+ warning(noGetInitialStateOnES6, "getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", name);
+ var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved;
+ warning(noGetDefaultPropsOnES6, "getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.", name);
+ var noInstancePropTypes = !instance.propTypes;
+ warning(noInstancePropTypes, "propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.", name);
+ var noInstanceContextTypes = !instance.contextTypes;
+ warning(noInstanceContextTypes, "contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.", name);
+ var noComponentShouldUpdate = "function" != typeof instance.componentShouldUpdate;
+ warning(noComponentShouldUpdate, "%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", name),
+ type.prototype && type.prototype.isPureReactComponent && void 0 !== instance.shouldComponentUpdate && warning(!1, "%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.", getComponentName(workInProgress) || "A pure component");
+ var noComponentDidUnmount = "function" != typeof instance.componentDidUnmount;
+ warning(noComponentDidUnmount, "%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?", name);
+ var noComponentDidReceiveProps = "function" != typeof instance.componentDidReceiveProps;
+ warning(noComponentDidReceiveProps, "%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().", name);
+ var noComponentWillRecieveProps = "function" != typeof instance.componentWillRecieveProps;
+ warning(noComponentWillRecieveProps, "%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?", name);
+ var hasMutatedProps = instance.props !== workInProgress.pendingProps;
+ warning(void 0 === instance.props || !hasMutatedProps, "%s(...): When calling super() in ` + "`")) + (`%s` + ("`" + `, make sure to pass up the same props that your component's constructor was passed.", name, name);
+ var noInstanceDefaultProps = !instance.defaultProps;
+ warning(noInstanceDefaultProps, "Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.", name, name);
+ var state = instance.state;
+ state && ("object" != typeof state || isArray(state)) && warning(!1, "%s.state: must be set to an object or null", getComponentName(workInProgress)),
+ "function" == typeof instance.getChildContext && warning("object" == typeof workInProgress.type.childContextTypes, "%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", getComponentName(workInProgress));
+ }
+ function resetInputPointers(workInProgress, instance) {
+ instance.props = workInProgress.memoizedProps, instance.state = workInProgress.memoizedState;
+ }
+ function adoptClassInstance(workInProgress, instance) {
+ instance.updater = updater, workInProgress.stateNode = instance, set(instance, workInProgress),
+ instance._reactInternalInstance = fakeInternalInstance;
+ }
+ function constructClassInstance(workInProgress, props) {
+ var ctor = workInProgress.type, unmaskedContext = getUnmaskedContext(workInProgress), needsContext = isContextConsumer(workInProgress), context = needsContext ? getMaskedContext(workInProgress, unmaskedContext) : emptyObject, instance = new ctor(props, context);
+ return adoptClassInstance(workInProgress, instance), needsContext && cacheContext(workInProgress, unmaskedContext, context),
+ instance;
+ }
+ function callComponentWillMount(workInProgress, instance) {
+ startPhaseTimer(workInProgress, "componentWillMount");
+ var oldState = instance.state;
+ instance.componentWillMount(), stopPhaseTimer(), debugRenderPhaseSideEffects && instance.componentWillMount(),
+ oldState !== instance.state && (warning(!1, "%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", getComponentName(workInProgress)),
+ updater.enqueueReplaceState(instance, instance.state, null));
+ }
+ function callComponentWillReceiveProps(workInProgress, instance, newProps, newContext) {
+ startPhaseTimer(workInProgress, "componentWillReceiveProps");
+ var oldState = instance.state;
+ if (instance.componentWillReceiveProps(newProps, newContext), stopPhaseTimer(),
+ debugRenderPhaseSideEffects && instance.componentWillReceiveProps(newProps, newContext),
+ instance.state !== oldState) {
+ var componentName = getComponentName(workInProgress) || "Component";
+ didWarnAboutStateAssignmentForComponent[componentName] || (warning(!1, "%s.componentWillReceiveProps(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", componentName),
+ didWarnAboutStateAssignmentForComponent[componentName] = !0), updater.enqueueReplaceState(instance, instance.state, null);
+ }
+ }
+ function mountClassInstance(workInProgress, renderExpirationTime) {
+ var current = workInProgress.alternate;
+ checkClassInstance(workInProgress);
+ var instance = workInProgress.stateNode, state = instance.state || null, props = workInProgress.pendingProps;
+ props || invariant(!1, "There must be pending props for an initial mount. This error is likely caused by a bug in React. Please file an issue.");
+ var unmaskedContext = getUnmaskedContext(workInProgress);
+ if (instance.props = props, instance.state = workInProgress.memoizedState = state,
+ instance.refs = emptyObject, instance.context = getMaskedContext(workInProgress, unmaskedContext),
+ enableAsyncSubtreeAPI && null != workInProgress.type && null != workInProgress.type.prototype && !0 === workInProgress.type.prototype.unstable_isAsyncReactComponent && (workInProgress.internalContextTag |= AsyncUpdates),
+ "function" == typeof instance.componentWillMount) {
+ callComponentWillMount(workInProgress, instance);
+ var updateQueue = workInProgress.updateQueue;
+ null !== updateQueue && (instance.state = processUpdateQueue(current, workInProgress, updateQueue, instance, props, renderExpirationTime));
+ }
+ "function" == typeof instance.componentDidMount && (workInProgress.effectTag |= Update);
+ }
+ function updateClassInstance(current, workInProgress, renderExpirationTime) {
+ var instance = workInProgress.stateNode;
+ resetInputPointers(workInProgress, instance);
+ var oldProps = workInProgress.memoizedProps, newProps = workInProgress.pendingProps;
+ newProps || null == (newProps = oldProps) && invariant(!1, "There should always be pending or memoized props. This error is likely caused by a bug in React. Please file an issue.");
+ var oldContext = instance.context, newUnmaskedContext = getUnmaskedContext(workInProgress), newContext = getMaskedContext(workInProgress, newUnmaskedContext);
+ "function" != typeof instance.componentWillReceiveProps || oldProps === newProps && oldContext === newContext || callComponentWillReceiveProps(workInProgress, instance, newProps, newContext);
+ var oldState = workInProgress.memoizedState, newState = void 0;
+ if (newState = null !== workInProgress.updateQueue ? processUpdateQueue(current, workInProgress, workInProgress.updateQueue, instance, newProps, renderExpirationTime) : oldState,
+ !(oldProps !== newProps || oldState !== newState || hasContextChanged() || null !== workInProgress.updateQueue && workInProgress.updateQueue.hasForceUpdate)) return "function" == typeof instance.componentDidUpdate && (oldProps === current.memoizedProps && oldState === current.memoizedState || (workInProgress.effectTag |= Update)),
+ !1;
+ var shouldUpdate = checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext);
+ return shouldUpdate ? ("function" == typeof instance.componentWillUpdate && (startPhaseTimer(workInProgress, "componentWillUpdate"),
+ instance.componentWillUpdate(newProps, newState, newContext), stopPhaseTimer(),
+ debugRenderPhaseSideEffects && instance.componentWillUpdate(newProps, newState, newContext)),
+ "function" == typeof instance.componentDidUpdate && (workInProgress.effectTag |= Update)) : ("function" == typeof instance.componentDidUpdate && (oldProps === current.memoizedProps && oldState === current.memoizedState || (workInProgress.effectTag |= Update)),
+ memoizeProps(workInProgress, newProps), memoizeState(workInProgress, newState)),
+ instance.props = newProps, instance.state = newState, instance.context = newContext,
+ shouldUpdate;
+ }
+ var updater = {
+ isMounted: isMounted,
+ enqueueSetState: function(instance, partialState, callback) {
+ var fiber = get(instance);
+ callback = void 0 === callback ? null : callback, warnOnInvalidCallback(callback, "setState");
+ var expirationTime = computeExpirationForFiber(fiber);
+ insertUpdateIntoFiber(fiber, {
+ expirationTime: expirationTime,
+ partialState: partialState,
+ callback: callback,
+ isReplace: !1,
+ isForced: !1,
+ nextCallback: null,
+ next: null
+ }), scheduleWork(fiber, expirationTime);
+ },
+ enqueueReplaceState: function(instance, state, callback) {
+ var fiber = get(instance);
+ callback = void 0 === callback ? null : callback, warnOnInvalidCallback(callback, "replaceState");
+ var expirationTime = computeExpirationForFiber(fiber);
+ insertUpdateIntoFiber(fiber, {
+ expirationTime: expirationTime,
+ partialState: state,
+ callback: callback,
+ isReplace: !0,
+ isForced: !1,
+ nextCallback: null,
+ next: null
+ }), scheduleWork(fiber, expirationTime);
+ },
+ enqueueForceUpdate: function(instance, callback) {
+ var fiber = get(instance);
+ callback = void 0 === callback ? null : callback, warnOnInvalidCallback(callback, "forceUpdate");
+ var expirationTime = computeExpirationForFiber(fiber);
+ insertUpdateIntoFiber(fiber, {
+ expirationTime: expirationTime,
+ partialState: null,
+ callback: callback,
+ isReplace: !1,
+ isForced: !0,
+ nextCallback: null,
+ next: null
+ }), scheduleWork(fiber, expirationTime);
+ }
+ };
+ return {
+ adoptClassInstance: adoptClassInstance,
+ constructClassInstance: constructClassInstance,
+ mountClassInstance: mountClassInstance,
+ updateClassInstance: updateClassInstance
+ };
+ }, hasSymbol = "function" == typeof Symbol && Symbol.for, REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for("react.element") : 60103, REACT_CALL_TYPE = hasSymbol ? Symbol.for("react.call") : 60104, REACT_RETURN_TYPE = hasSymbol ? Symbol.for("react.return") : 60105, REACT_PORTAL_TYPE = hasSymbol ? Symbol.for("react.portal") : 60106, REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for("react.fragment") : 60107, MAYBE_ITERATOR_SYMBOL = "function" == typeof Symbol && Symbol.iterator, FAUX_ITERATOR_SYMBOL = "@@iterator", getCurrentFiberStackAddendum$1 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnAboutMaps = !1, ownerHasKeyUseWarning = {}, ownerHasFunctionTypeWarning = {}, warnForMissingKey = function(child) {
+ if (null !== child && "object" == typeof child && child._store && !child._store.validated && null == child.key) {
+ "object" != typeof child._store && invariant(!1, "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue."),
+ child._store.validated = !0;
+ var currentComponentErrorInfo = 'Each child in an array or iterator should have a unique "key" prop. See https://fb.me/react-warning-keys for more information.' + (getCurrentFiberStackAddendum$1() || "");
+ ownerHasKeyUseWarning[currentComponentErrorInfo] || (ownerHasKeyUseWarning[currentComponentErrorInfo] = !0,
+ warning(!1, 'Each child in an array or iterator should have a unique "key" prop. See https://fb.me/react-warning-keys for more information.%s', getCurrentFiberStackAddendum$1()));
+ }
+ }, isArray$1 = Array.isArray, reconcileChildFibers = ChildReconciler(!0), mountChildFibers = ChildReconciler(!1), warnedAboutStatelessRefs = {}, ReactFiberBeginWork = function(config, hostContext, hydrationContext, scheduleWork, computeExpirationForFiber) {
+ function reconcileChildren(current, workInProgress, nextChildren) {
+ reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, workInProgress.expirationTime);
+ }
+ function reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, renderExpirationTime) {
+ workInProgress.child = null === current ? mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime) : reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);
+ }
+ function updateFragment(current, workInProgress) {
+ var nextChildren = workInProgress.pendingProps;
+ if (hasContextChanged()) null === nextChildren && (nextChildren = workInProgress.memoizedProps); else if (null === nextChildren || workInProgress.memoizedProps === nextChildren) return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ return reconcileChildren(current, workInProgress, nextChildren), memoizeProps(workInProgress, nextChildren),
+ workInProgress.child;
+ }
+ function markRef(current, workInProgress) {
+ var ref = workInProgress.ref;
+ null === ref || current && current.ref === ref || (workInProgress.effectTag |= Ref);
+ }
+ function updateFunctionalComponent(current, workInProgress) {
+ var fn = workInProgress.type, nextProps = workInProgress.pendingProps, memoizedProps = workInProgress.memoizedProps;
+ if (hasContextChanged()) null === nextProps && (nextProps = memoizedProps); else if (null === nextProps || memoizedProps === nextProps) return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ var nextChildren, unmaskedContext = getUnmaskedContext(workInProgress), context = getMaskedContext(workInProgress, unmaskedContext);
+ return ReactCurrentOwner.current = workInProgress, ReactDebugCurrentFiber.setCurrentPhase("render"),
+ nextChildren = fn(nextProps, context), ReactDebugCurrentFiber.setCurrentPhase(null),
+ workInProgress.effectTag |= PerformedWork, reconcileChildren(current, workInProgress, nextChildren),
+ memoizeProps(workInProgress, nextProps), workInProgress.child;
+ }
+ function updateClassComponent(current, workInProgress, renderExpirationTime) {
+ var hasContext = pushContextProvider(workInProgress), shouldUpdate = void 0;
+ return null === current ? workInProgress.stateNode ? invariant(!1, "Resuming work not yet implemented.") : (constructClassInstance(workInProgress, workInProgress.pendingProps),
+ mountClassInstance(workInProgress, renderExpirationTime), shouldUpdate = !0) : shouldUpdate = updateClassInstance(current, workInProgress, renderExpirationTime),
+ finishClassComponent(current, workInProgress, shouldUpdate, hasContext);
+ }
+ function finishClassComponent(current, workInProgress, shouldUpdate, hasContext) {
+ if (markRef(current, workInProgress), !shouldUpdate) return hasContext && invalidateContextProvider(workInProgress, !1),
+ bailoutOnAlreadyFinishedWork(current, workInProgress);
+ var instance = workInProgress.stateNode;
+ ReactCurrentOwner.current = workInProgress;
+ var nextChildren = void 0;
+ return ReactDebugCurrentFiber.setCurrentPhase("render"), nextChildren = instance.render(),
+ debugRenderPhaseSideEffects && instance.render(), ReactDebugCurrentFiber.setCurrentPhase(null),
+ workInProgress.effectTag |= PerformedWork, reconcileChildren(current, workInProgress, nextChildren),
+ memoizeState(workInProgress, instance.state), memoizeProps(workInProgress, instance.props),
+ hasContext && invalidateContextProvider(workInProgress, !0), workInProgress.child;
+ }
+ function pushHostRootContext(workInProgress) {
+ var root = workInProgress.stateNode;
+ root.pendingContext ? pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context) : root.context && pushTopLevelContextObject(workInProgress, root.context, !1),
+ pushHostContainer(workInProgress, root.containerInfo);
+ }
+ function updateHostRoot(current, workInProgress, renderExpirationTime) {
+ pushHostRootContext(workInProgress);
+ var updateQueue = workInProgress.updateQueue;
+ if (null !== updateQueue) {
+ var prevState = workInProgress.memoizedState, state = processUpdateQueue(current, workInProgress, updateQueue, null, null, renderExpirationTime);
+ if (prevState === state) return resetHydrationState(), bailoutOnAlreadyFinishedWork(current, workInProgress);
+ var element = state.element, root = workInProgress.stateNode;
+ return (null === current || null === current.child) && root.hydrate && enterHydrationState(workInProgress) ? (workInProgress.effectTag |= Placement,
+ workInProgress.child = mountChildFibers(workInProgress, null, element, renderExpirationTime)) : (resetHydrationState(),
+ reconcileChildren(current, workInProgress, element)), memoizeState(workInProgress, state),
+ workInProgress.child;
+ }
+ return resetHydrationState(), bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+ function updateHostComponent(current, workInProgress, renderExpirationTime) {
+ pushHostContext(workInProgress), null === current && tryToClaimNextHydratableInstance(workInProgress);
+ var type = workInProgress.type, memoizedProps = workInProgress.memoizedProps, nextProps = workInProgress.pendingProps;
+ null === nextProps && null === (nextProps = memoizedProps) && invariant(!1, "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue.");
+ var prevProps = null !== current ? current.memoizedProps : null;
+ if (hasContextChanged()) ; else if (null === nextProps || memoizedProps === nextProps) return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ var nextChildren = nextProps.children;
+ return shouldSetTextContent(type, nextProps) ? nextChildren = null : prevProps && shouldSetTextContent(type, prevProps) && (workInProgress.effectTag |= ContentReset),
+ markRef(current, workInProgress), renderExpirationTime !== Never && !useSyncScheduling && shouldDeprioritizeSubtree(type, nextProps) ? (workInProgress.expirationTime = Never,
+ null) : (reconcileChildren(current, workInProgress, nextChildren), memoizeProps(workInProgress, nextProps),
+ workInProgress.child);
+ }
+ function updateHostText(current, workInProgress) {
+ null === current && tryToClaimNextHydratableInstance(workInProgress);
+ var nextProps = workInProgress.pendingProps;
+ return null === nextProps && (nextProps = workInProgress.memoizedProps), memoizeProps(workInProgress, nextProps),
+ null;
+ }
+ function mountIndeterminateComponent(current, workInProgress, renderExpirationTime) {
+ null !== current && invariant(!1, "An indeterminate component should never have mounted. This error is likely caused by a bug in React. Please file an issue.");
+ var value, fn = workInProgress.type, props = workInProgress.pendingProps, unmaskedContext = getUnmaskedContext(workInProgress), context = getMaskedContext(workInProgress, unmaskedContext);
+ if (fn.prototype && "function" == typeof fn.prototype.render) {
+ var componentName = getComponentName(workInProgress);
+ warning(!1, "The <%s /> component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.", componentName, componentName);
+ }
+ if (ReactCurrentOwner.current = workInProgress, value = fn(props, context), workInProgress.effectTag |= PerformedWork,
+ "object" == typeof value && null !== value && "function" == typeof value.render) {
+ workInProgress.tag = ClassComponent;
+ var hasContext = pushContextProvider(workInProgress);
+ return adoptClassInstance(workInProgress, value), mountClassInstance(workInProgress, renderExpirationTime),
+ finishClassComponent(current, workInProgress, !0, hasContext);
+ }
+ workInProgress.tag = FunctionalComponent;
+ var Component = workInProgress.type;
+ if (Component && warning(!Component.childContextTypes, "%s(...): childContextTypes cannot be defined on a functional component.", Component.displayName || Component.name || "Component"),
+ null !== workInProgress.ref) {
+ var info = "", ownerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName();
+ ownerName && (info += "\n\nCheck the render method of `)))))) + ((((("`" + (`" + ownerName + "` + "`")) + (`.");
+ var warningKey = ownerName || workInProgress._debugID || "", debugSource = workInProgress._debugSource;
+ debugSource && (warningKey = debugSource.fileName + ":" + debugSource.lineNumber),
+ warnedAboutStatelessRefs[warningKey] || (warnedAboutStatelessRefs[warningKey] = !0,
+ warning(!1, "Stateless function components cannot be given refs. Attempts to access this ref will fail.%s%s", info, ReactDebugCurrentFiber.getCurrentFiberStackAddendum()));
+ }
+ return reconcileChildren(current, workInProgress, value), memoizeProps(workInProgress, props),
+ workInProgress.child;
+ }
+ function updateCallComponent(current, workInProgress, renderExpirationTime) {
+ var nextCall = workInProgress.pendingProps;
+ hasContextChanged() ? null === nextCall && null === (nextCall = current && current.memoizedProps) && invariant(!1, "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue.") : null !== nextCall && workInProgress.memoizedProps !== nextCall || (nextCall = workInProgress.memoizedProps);
+ var nextChildren = nextCall.children;
+ return workInProgress.stateNode = null === current ? mountChildFibers(workInProgress, workInProgress.stateNode, nextChildren, renderExpirationTime) : reconcileChildFibers(workInProgress, workInProgress.stateNode, nextChildren, renderExpirationTime),
+ memoizeProps(workInProgress, nextCall), workInProgress.stateNode;
+ }
+ function updatePortalComponent(current, workInProgress, renderExpirationTime) {
+ pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
+ var nextChildren = workInProgress.pendingProps;
+ if (hasContextChanged()) null === nextChildren && null == (nextChildren = current && current.memoizedProps) && invariant(!1, "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue."); else if (null === nextChildren || workInProgress.memoizedProps === nextChildren) return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ return null === current ? (workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime),
+ memoizeProps(workInProgress, nextChildren)) : (reconcileChildren(current, workInProgress, nextChildren),
+ memoizeProps(workInProgress, nextChildren)), workInProgress.child;
+ }
+ function bailoutOnAlreadyFinishedWork(current, workInProgress) {
+ return cancelWorkTimer(workInProgress), cloneChildFibers(current, workInProgress),
+ workInProgress.child;
+ }
+ function bailoutOnLowPriority(current, workInProgress) {
+ switch (cancelWorkTimer(workInProgress), workInProgress.tag) {
+ case HostRoot:
+ pushHostRootContext(workInProgress);
+ break;
+
+ case ClassComponent:
+ pushContextProvider(workInProgress);
+ break;
+
+ case HostPortal:
+ pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
+ }
+ return null;
+ }
+ function memoizeProps(workInProgress, nextProps) {
+ workInProgress.memoizedProps = nextProps;
+ }
+ function memoizeState(workInProgress, nextState) {
+ workInProgress.memoizedState = nextState;
+ }
+ function beginWork(current, workInProgress, renderExpirationTime) {
+ if (workInProgress.expirationTime === NoWork || workInProgress.expirationTime > renderExpirationTime) return bailoutOnLowPriority(current, workInProgress);
+ switch (workInProgress.tag) {
+ case IndeterminateComponent:
+ return mountIndeterminateComponent(current, workInProgress, renderExpirationTime);
+
+ case FunctionalComponent:
+ return updateFunctionalComponent(current, workInProgress);
+
+ case ClassComponent:
+ return updateClassComponent(current, workInProgress, renderExpirationTime);
+
+ case HostRoot:
+ return updateHostRoot(current, workInProgress, renderExpirationTime);
+
+ case HostComponent:
+ return updateHostComponent(current, workInProgress, renderExpirationTime);
+
+ case HostText:
+ return updateHostText(current, workInProgress);
+
+ case CallHandlerPhase:
+ workInProgress.tag = CallComponent;
+
+ case CallComponent:
+ return updateCallComponent(current, workInProgress, renderExpirationTime);
+
+ case ReturnComponent:
+ return null;
+
+ case HostPortal:
+ return updatePortalComponent(current, workInProgress, renderExpirationTime);
+
+ case Fragment:
+ return updateFragment(current, workInProgress);
+
+ default:
+ invariant(!1, "Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ }
+ function beginFailedWork(current, workInProgress, renderExpirationTime) {
+ switch (workInProgress.tag) {
+ case ClassComponent:
+ pushContextProvider(workInProgress);
+ break;
+
+ case HostRoot:
+ pushHostRootContext(workInProgress);
+ break;
+
+ default:
+ invariant(!1, "Invalid type of work. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ if (workInProgress.effectTag |= Err, null === current ? workInProgress.child = null : workInProgress.child !== current.child && (workInProgress.child = current.child),
+ workInProgress.expirationTime === NoWork || workInProgress.expirationTime > renderExpirationTime) return bailoutOnLowPriority(current, workInProgress);
+ workInProgress.firstEffect = null, workInProgress.lastEffect = null;
+ if (reconcileChildrenAtExpirationTime(current, workInProgress, null, renderExpirationTime),
+ workInProgress.tag === ClassComponent) {
+ var instance = workInProgress.stateNode;
+ workInProgress.memoizedProps = instance.props, workInProgress.memoizedState = instance.state;
+ }
+ return workInProgress.child;
+ }
+ var shouldSetTextContent = config.shouldSetTextContent, useSyncScheduling = config.useSyncScheduling, shouldDeprioritizeSubtree = config.shouldDeprioritizeSubtree, pushHostContext = hostContext.pushHostContext, pushHostContainer = hostContext.pushHostContainer, enterHydrationState = hydrationContext.enterHydrationState, resetHydrationState = hydrationContext.resetHydrationState, tryToClaimNextHydratableInstance = hydrationContext.tryToClaimNextHydratableInstance, _ReactFiberClassCompo = ReactFiberClassComponent(scheduleWork, computeExpirationForFiber, memoizeProps, memoizeState), adoptClassInstance = _ReactFiberClassCompo.adoptClassInstance, constructClassInstance = _ReactFiberClassCompo.constructClassInstance, mountClassInstance = _ReactFiberClassCompo.mountClassInstance, updateClassInstance = _ReactFiberClassCompo.updateClassInstance;
+ return {
+ beginWork: beginWork,
+ beginFailedWork: beginFailedWork
+ };
+ }, ReactFiberCompleteWork = function(config, hostContext, hydrationContext) {
+ function markUpdate(workInProgress) {
+ workInProgress.effectTag |= Update;
+ }
+ function markRef(workInProgress) {
+ workInProgress.effectTag |= Ref;
+ }
+ function appendAllReturns(returns, workInProgress) {
+ var node = workInProgress.stateNode;
+ for (node && (node.return = workInProgress); null !== node; ) {
+ if (node.tag === HostComponent || node.tag === HostText || node.tag === HostPortal) invariant(!1, "A call cannot have host component children."); else if (node.tag === ReturnComponent) returns.push(node.type); else if (null !== node.child) {
+ node.child.return = node, node = node.child;
+ continue;
+ }
+ for (;null === node.sibling; ) {
+ if (null === node.return || node.return === workInProgress) return;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ }
+ function moveCallToHandlerPhase(current, workInProgress, renderExpirationTime) {
+ var call = workInProgress.memoizedProps;
+ call || invariant(!1, "Should be resolved by now. This error is likely caused by a bug in React. Please file an issue."),
+ workInProgress.tag = CallHandlerPhase;
+ var returns = [];
+ appendAllReturns(returns, workInProgress);
+ var fn = call.handler, props = call.props, nextChildren = fn(props, returns), currentFirstChild = null !== current ? current.child : null;
+ return workInProgress.child = reconcileChildFibers(workInProgress, currentFirstChild, nextChildren, renderExpirationTime),
+ workInProgress.child;
+ }
+ function appendAllChildren(parent, workInProgress) {
+ for (var node = workInProgress.child; null !== node; ) {
+ if (node.tag === HostComponent || node.tag === HostText) appendInitialChild(parent, node.stateNode); else if (node.tag === HostPortal) ; else if (null !== node.child) {
+ node.child.return = node, node = node.child;
+ continue;
+ }
+ if (node === workInProgress) return;
+ for (;null === node.sibling; ) {
+ if (null === node.return || node.return === workInProgress) return;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ }
+ function completeWork(current, workInProgress, renderExpirationTime) {
+ var newProps = workInProgress.pendingProps;
+ switch (null === newProps ? newProps = workInProgress.memoizedProps : workInProgress.expirationTime === Never && renderExpirationTime !== Never || (workInProgress.pendingProps = null),
+ workInProgress.tag) {
+ case FunctionalComponent:
+ return null;
+
+ case ClassComponent:
+ return popContextProvider(workInProgress), null;
+
+ case HostRoot:
+ popHostContainer(workInProgress), popTopLevelContextObject(workInProgress);
+ var fiberRoot = workInProgress.stateNode;
+ return fiberRoot.pendingContext && (fiberRoot.context = fiberRoot.pendingContext,
+ fiberRoot.pendingContext = null), null !== current && null !== current.child || (popHydrationState(workInProgress),
+ workInProgress.effectTag &= ~Placement), updateHostContainer(workInProgress), null;
+
+ case HostComponent:
+ popHostContext(workInProgress);
+ var rootContainerInstance = getRootHostContainer(), type = workInProgress.type;
+ if (null !== current && null != workInProgress.stateNode) {
+ var oldProps = current.memoizedProps, instance = workInProgress.stateNode, currentHostContext = getHostContext(), updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
+ updateHostComponent(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance),
+ current.ref !== workInProgress.ref && markRef(workInProgress);
+ } else {
+ if (!newProps) return null === workInProgress.stateNode && invariant(!1, "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."),
+ null;
+ var _currentHostContext = getHostContext();
+ if (popHydrationState(workInProgress)) prepareToHydrateHostInstance(workInProgress, rootContainerInstance, _currentHostContext) && markUpdate(workInProgress); else {
+ var _instance = createInstance(type, newProps, rootContainerInstance, _currentHostContext, workInProgress);
+ appendAllChildren(_instance, workInProgress), finalizeInitialChildren(_instance, type, newProps, rootContainerInstance) && markUpdate(workInProgress),
+ workInProgress.stateNode = _instance;
+ }
+ null !== workInProgress.ref && markRef(workInProgress);
+ }
+ return null;
+
+ case HostText:
+ var newText = newProps;
+ if (current && null != workInProgress.stateNode) {
+ var oldText = current.memoizedProps;
+ updateHostText(current, workInProgress, oldText, newText);
+ } else {
+ if ("string" != typeof newText) return null === workInProgress.stateNode && invariant(!1, "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."),
+ null;
+ var _rootContainerInstance = getRootHostContainer(), _currentHostContext2 = getHostContext();
+ popHydrationState(workInProgress) ? prepareToHydrateHostTextInstance(workInProgress) && markUpdate(workInProgress) : workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext2, workInProgress);
+ }
+ return null;
+
+ case CallComponent:
+ return moveCallToHandlerPhase(current, workInProgress, renderExpirationTime);
+
+ case CallHandlerPhase:
+ return workInProgress.tag = CallComponent, null;
+
+ case ReturnComponent:
+ case Fragment:
+ return null;
+
+ case HostPortal:
+ return popHostContainer(workInProgress), updateHostContainer(workInProgress), null;
+
+ case IndeterminateComponent:
+ invariant(!1, "An indeterminate component should have become determinate before completing. This error is likely caused by a bug in React. Please file an issue.");
+
+ default:
+ invariant(!1, "Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ }
+ var createInstance = config.createInstance, createTextInstance = config.createTextInstance, appendInitialChild = config.appendInitialChild, finalizeInitialChildren = config.finalizeInitialChildren, prepareUpdate = config.prepareUpdate, mutation = config.mutation, persistence = config.persistence, getRootHostContainer = hostContext.getRootHostContainer, popHostContext = hostContext.popHostContext, getHostContext = hostContext.getHostContext, popHostContainer = hostContext.popHostContainer, prepareToHydrateHostInstance = hydrationContext.prepareToHydrateHostInstance, prepareToHydrateHostTextInstance = hydrationContext.prepareToHydrateHostTextInstance, popHydrationState = hydrationContext.popHydrationState, updateHostContainer = void 0, updateHostComponent = void 0, updateHostText = void 0;
+ if (mutation) enableMutatingReconciler ? (updateHostContainer = function(workInProgress) {},
+ updateHostComponent = function(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance) {
+ workInProgress.updateQueue = updatePayload, updatePayload && markUpdate(workInProgress);
+ }, updateHostText = function(current, workInProgress, oldText, newText) {
+ oldText !== newText && markUpdate(workInProgress);
+ }) : invariant(!1, "Mutating reconciler is disabled."); else if (persistence) if (enablePersistentReconciler) {
+ var cloneInstance = persistence.cloneInstance, createContainerChildSet = persistence.createContainerChildSet, appendChildToContainerChildSet = persistence.appendChildToContainerChildSet, finalizeContainerChildren = persistence.finalizeContainerChildren, appendAllChildrenToContainer = function(containerChildSet, workInProgress) {
+ for (var node = workInProgress.child; null !== node; ) {
+ if (node.tag === HostComponent || node.tag === HostText) appendChildToContainerChildSet(containerChildSet, node.stateNode); else if (node.tag === HostPortal) ; else if (null !== node.child) {
+ node.child.return = node, node = node.child;
+ continue;
+ }
+ if (node === workInProgress) return;
+ for (;null === node.sibling; ) {
+ if (null === node.return || node.return === workInProgress) return;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ };
+ updateHostContainer = function(workInProgress) {
+ var portalOrRoot = workInProgress.stateNode;
+ if (null === workInProgress.firstEffect) ; else {
+ var container = portalOrRoot.containerInfo, newChildSet = createContainerChildSet(container);
+ finalizeContainerChildren(container, newChildSet) && markUpdate(workInProgress),
+ portalOrRoot.pendingChildren = newChildSet, appendAllChildrenToContainer(newChildSet, workInProgress),
+ markUpdate(workInProgress);
+ }
+ }, updateHostComponent = function(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance) {
+ var childrenUnchanged = null === workInProgress.firstEffect, currentInstance = current.stateNode;
+ if (childrenUnchanged && null === updatePayload) workInProgress.stateNode = currentInstance; else {
+ var recyclableInstance = workInProgress.stateNode, newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);
+ finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance) && markUpdate(workInProgress),
+ workInProgress.stateNode = newInstance, childrenUnchanged ? markUpdate(workInProgress) : appendAllChildren(newInstance, workInProgress);
+ }
+ }, updateHostText = function(current, workInProgress, oldText, newText) {
+ if (oldText !== newText) {
+ var rootContainerInstance = getRootHostContainer(), currentHostContext = getHostContext();
+ workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress),
+ markUpdate(workInProgress);
+ }
+ };
+ } else invariant(!1, "Persistent reconciler is disabled."); else invariant(!1, "Noop reconciler is disabled.");
+ return {
+ completeWork: completeWork
+ };
+ }, invokeGuardedCallback$2 = ReactErrorUtils.invokeGuardedCallback, hasCaughtError$1 = ReactErrorUtils.hasCaughtError, clearCaughtError$1 = ReactErrorUtils.clearCaughtError, ReactFiberCommitWork = function(config, captureError) {
+ function safelyCallComponentWillUnmount(current, instance) {
+ if (invokeGuardedCallback$2(null, callComponentWillUnmountWithTimer, null, current, instance),
+ hasCaughtError$1()) {
+ var unmountError = clearCaughtError$1();
+ captureError(current, unmountError);
+ }
+ }
+ function safelyDetachRef(current) {
+ var ref = current.ref;
+ if (null !== ref && (invokeGuardedCallback$2(null, ref, null, null), hasCaughtError$1())) {
+ var refError = clearCaughtError$1();
+ captureError(current, refError);
+ }
+ }
+ function commitLifeCycles(current, finishedWork) {
+ switch (finishedWork.tag) {
+ case ClassComponent:
+ var instance = finishedWork.stateNode;
+ if (finishedWork.effectTag & Update) if (null === current) startPhaseTimer(finishedWork, "componentDidMount"),
+ instance.props = finishedWork.memoizedProps, instance.state = finishedWork.memoizedState,
+ instance.componentDidMount(), stopPhaseTimer(); else {
+ var prevProps = current.memoizedProps, prevState = current.memoizedState;
+ startPhaseTimer(finishedWork, "componentDidUpdate"), instance.props = finishedWork.memoizedProps,
+ instance.state = finishedWork.memoizedState, instance.componentDidUpdate(prevProps, prevState),
+ stopPhaseTimer();
+ }
+ var updateQueue = finishedWork.updateQueue;
+ return void (null !== updateQueue && commitCallbacks(updateQueue, instance));
+
+ case HostRoot:
+ var _updateQueue = finishedWork.updateQueue;
+ if (null !== _updateQueue) {
+ commitCallbacks(_updateQueue, null !== finishedWork.child ? finishedWork.child.stateNode : null);
+ }
+ return;
+
+ case HostComponent:
+ var _instance2 = finishedWork.stateNode;
+ if (null === current && finishedWork.effectTag & Update) {
+ var type = finishedWork.type, props = finishedWork.memoizedProps;
+ commitMount(_instance2, type, props, finishedWork);
+ }
+ return;
+
+ case HostText:
+ case HostPortal:
+ return;
+
+ default:
+ invariant(!1, "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ }
+ function commitAttachRef(finishedWork) {
+ var ref = finishedWork.ref;
+ if (null !== ref) {
+ var instance = finishedWork.stateNode;
+ switch (finishedWork.tag) {
+ case HostComponent:
+ ref(getPublicInstance(instance));
+ break;
+
+ default:
+ ref(instance);
+ }
+ }
+ }
+ function commitDetachRef(current) {
+ var currentRef = current.ref;
+ null !== currentRef && currentRef(null);
+ }
+ function commitUnmount(current) {
+ switch ("function" == typeof onCommitUnmount && onCommitUnmount(current), current.tag) {
+ case ClassComponent:
+ safelyDetachRef(current);
+ var instance = current.stateNode;
+ return void ("function" == typeof instance.componentWillUnmount && safelyCallComponentWillUnmount(current, instance));
+
+ case HostComponent:
+ return void safelyDetachRef(current);
+
+ case CallComponent:
+ return void commitNestedUnmounts(current.stateNode);
+
+ case HostPortal:
+ return void (enableMutatingReconciler && mutation ? unmountHostComponents(current) : enablePersistentReconciler && persistence && emptyPortalContainer(current));
+ }
+ }
+ function commitNestedUnmounts(root) {
+ for (var node = root; ;) if (commitUnmount(node), null === node.child || mutation && node.tag === HostPortal) {
+ if (node === root) return;
+ for (;null === node.sibling; ) {
+ if (null === node.return || node.return === root) return;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ } else node.child.return = node, node = node.child;
+ }
+ function detachFiber(current) {
+ current.return = null, current.child = null, current.alternate && (current.alternate.child = null,
+ current.alternate.return = null);
+ }
+ function getHostParentFiber(fiber) {
+ for (var parent = fiber.return; null !== parent; ) {
+ if (isHostParent(parent)) return parent;
+ parent = parent.return;
+ }
+ invariant(!1, "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ function isHostParent(fiber) {
+ return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
+ }
+ function getHostSibling(fiber) {
+ var node = fiber;
+ siblings: for (;;) {
+ for (;null === node.sibling; ) {
+ if (null === node.return || isHostParent(node.return)) return null;
+ node = node.return;
+ }
+ for (node.sibling.return = node.return, node = node.sibling; node.tag !== HostComponent && node.tag !== HostText; ) {
+ if (node.effectTag & Placement) continue siblings;
+ if (null === node.child || node.tag === HostPortal) continue siblings;
+ node.child.return = node, node = node.child;
+ }
+ if (!(node.effectTag & Placement)) return node.stateNode;
+ }
+ }
+ function commitPlacement(finishedWork) {
+ var parentFiber = getHostParentFiber(finishedWork), parent = void 0, isContainer = void 0;
+ switch (parentFiber.tag) {
+ case HostComponent:
+ parent = parentFiber.stateNode, isContainer = !1;
+ break;
+
+ case HostRoot:
+ case HostPortal:
+ parent = parentFiber.stateNode.containerInfo, isContainer = !0;
+ break;
+
+ default:
+ invariant(!1, "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ parentFiber.effectTag & ContentReset && (resetTextContent(parent), parentFiber.effectTag &= ~ContentReset);
+ for (var before = getHostSibling(finishedWork), node = finishedWork; ;) {
+ if (node.tag === HostComponent || node.tag === HostText) before ? isContainer ? insertInContainerBefore(parent, node.stateNode, before) : insertBefore(parent, node.stateNode, before) : isContainer ? appendChildToContainer(parent, node.stateNode) : appendChild(parent, node.stateNode); else if (node.tag === HostPortal) ; else if (null !== node.child) {
+ node.child.return = node, node = node.child;
+ continue;
+ }
+ if (node === finishedWork) return;
+ for (;null === node.sibling; ) {
+ if (null === node.return || node.return === finishedWork) return;
+ node = node.return;
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ }
+ function unmountHostComponents(current) {
+ for (var node = current, currentParentIsValid = !1, currentParent = void 0, currentParentIsContainer = void 0; ;) {
+ if (!currentParentIsValid) {
+ var parent = node.return;
+ findParent: for (;;) {
+ switch (null === parent && invariant(!1, "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."),
+ parent.tag) {
+ case HostComponent:
+ currentParent = parent.stateNode, currentParentIsContainer = !1;
+ break findParent;
+
+ case HostRoot:
+ case HostPortal:
+ currentParent = parent.stateNode.containerInfo, currentParentIsContainer = !0;
+ break findParent;
+ }
+ parent = parent.return;
+ }
+ currentParentIsValid = !0;
+ }
+ if (node.tag === HostComponent || node.tag === HostText) commitNestedUnmounts(node),
+ currentParentIsContainer ? removeChildFromContainer(currentParent, node.stateNode) : removeChild(currentParent, node.stateNode); else if (node.tag === HostPortal) {
+ if (currentParent = node.stateNode.containerInfo, null !== node.child) {
+ node.child.return = node, node = node.child;
+ continue;
+ }
+ } else if (commitUnmount(node), null !== node.child) {
+ node.child.return = node, node = node.child;
+ continue;
+ }
+ if (node === current) return;
+ for (;null === node.sibling; ) {
+ if (null === node.return || node.return === current) return;
+ node = node.return, node.tag === HostPortal && (currentParentIsValid = !1);
+ }
+ node.sibling.return = node.return, node = node.sibling;
+ }
+ }
+ function commitDeletion(current) {
+ unmountHostComponents(current), detachFiber(current);
+ }
+ function commitWork(current, finishedWork) {
+ switch (finishedWork.tag) {
+ case ClassComponent:
+ return;
+
+ case HostComponent:
+ var instance = finishedWork.stateNode;
+ if (null != instance) {
+ var newProps = finishedWork.memoizedProps, oldProps = null !== current ? current.memoizedProps : newProps, type = finishedWork.type, updatePayload = finishedWork.updateQueue;
+ finishedWork.updateQueue = null, null !== updatePayload && commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);
+ }
+ return;
+
+ case HostText:
+ null === finishedWork.stateNode && invariant(!1, "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.");
+ var textInstance = finishedWork.stateNode, newText = finishedWork.memoizedProps, oldText = null !== current ? current.memoizedProps : newText;
+ return void commitTextUpdate(textInstance, oldText, newText);
+
+ case HostRoot:
+ return;
+
+ default:
+ invariant(!1, "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ }
+ function commitResetTextContent(current) {
+ resetTextContent(current.stateNode);
+ }
+ var getPublicInstance = config.getPublicInstance, mutation = config.mutation, persistence = config.persistence, callComponentWillUnmountWithTimer = function(current, instance) {
+ startPhaseTimer(current, "componentWillUnmount"), instance.props = current.memoizedProps,
+ instance.state = current.memoizedState, instance.componentWillUnmount(), stopPhaseTimer();
+ };
+ if (!mutation) {
+ var commitContainer = void 0;
+ if (persistence) {
+ var replaceContainerChildren = persistence.replaceContainerChildren, createContainerChildSet = persistence.createContainerChildSet, emptyPortalContainer = function(current) {
+ var portal = current.stateNode, containerInfo = portal.containerInfo, emptyChildSet = createContainerChildSet(containerInfo);
+ replaceContainerChildren(containerInfo, emptyChildSet);
+ };
+ commitContainer = function(finishedWork) {
+ switch (finishedWork.tag) {
+ case ClassComponent:
+ case HostComponent:
+ case HostText:
+ return;
+
+ case HostRoot:
+ case HostPortal:
+ var portalOrRoot = finishedWork.stateNode, containerInfo = portalOrRoot.containerInfo, _pendingChildren = portalOrRoot.pendingChildren;
+ return void replaceContainerChildren(containerInfo, _pendingChildren);
+
+ default:
+ invariant(!1, "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ };
+ } else commitContainer = function(finishedWork) {};
+ if (enablePersistentReconciler) return {
+ commitResetTextContent: function(finishedWork) {},
+ commitPlacement: function(finishedWork) {},
+ commitDeletion: function(current) {
+ commitNestedUnmounts(current), detachFiber(current);
+ },
+ commitWork: function(current, finishedWork) {
+ commitContainer(finishedWork);
+ },
+ commitLifeCycles: commitLifeCycles,
+ commitAttachRef: commitAttachRef,
+ commitDetachRef: commitDetachRef
+ };
+ persistence ? invariant(!1, "Persistent reconciler is disabled.") : invariant(!1, "Noop reconciler is disabled.");
+ }
+ var commitMount = mutation.commitMount, commitUpdate = mutation.commitUpdate, resetTextContent = mutation.resetTextContent, commitTextUpdate = mutation.commitTextUpdate, appendChild = mutation.appendChild, appendChildToContainer = mutation.appendChildToContainer, insertBefore = mutation.insertBefore, insertInContainerBefore = mutation.insertInContainerBefore, removeChild = mutation.removeChild, removeChildFromContainer = mutation.removeChildFromContainer;
+ if (enableMutatingReconciler) return {
+ commitResetTextContent: commitResetTextContent,
+ commitPlacement: commitPlacement,
+ commitDeletion: commitDeletion,
+ commitWork: commitWork,
+ commitLifeCycles: commitLifeCycles,
+ commitAttachRef: commitAttachRef,
+ commitDetachRef: commitDetachRef
+ };
+ invariant(!1, "Mutating reconciler is disabled.");
+ }, NO_CONTEXT = {}, ReactFiberHostContext = function(config) {
+ function requiredContext(c) {
+ return c === NO_CONTEXT && invariant(!1, "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),
+ c;
+ }
+ function getRootHostContainer() {
+ return requiredContext(rootInstanceStackCursor.current);
+ }
+ function pushHostContainer(fiber, nextRootInstance) {
+ push(rootInstanceStackCursor, nextRootInstance, fiber);
+ var nextRootContext = getRootHostContext(nextRootInstance);
+ push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor, nextRootContext, fiber);
+ }
+ function popHostContainer(fiber) {
+ pop(contextStackCursor, fiber), pop(contextFiberStackCursor, fiber), pop(rootInstanceStackCursor, fiber);
+ }
+ function getHostContext() {
+ return requiredContext(contextStackCursor.current);
+ }
+ function pushHostContext(fiber) {
+ var rootInstance = requiredContext(rootInstanceStackCursor.current), context = requiredContext(contextStackCursor.current), nextContext = getChildHostContext(context, fiber.type, rootInstance);
+ context !== nextContext && (push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor, nextContext, fiber));
+ }
+ function popHostContext(fiber) {
+ contextFiberStackCursor.current === fiber && (pop(contextStackCursor, fiber), pop(contextFiberStackCursor, fiber));
+ }
+ function resetHostContainer() {
+ contextStackCursor.current = NO_CONTEXT, rootInstanceStackCursor.current = NO_CONTEXT;
+ }
+ var getChildHostContext = config.getChildHostContext, getRootHostContext = config.getRootHostContext, contextStackCursor = createCursor(NO_CONTEXT), contextFiberStackCursor = createCursor(NO_CONTEXT), rootInstanceStackCursor = createCursor(NO_CONTEXT);
+ return {
+ getHostContext: getHostContext,
+ getRootHostContainer: getRootHostContainer,
+ popHostContainer: popHostContainer,
+ popHostContext: popHostContext,
+ pushHostContainer: pushHostContainer,
+ pushHostContext: pushHostContext,
+ resetHostContainer: resetHostContainer
+ };
+ }, ReactFiberHydrationContext = function(config) {
+ function enterHydrationState(fiber) {
+ var parentInstance = fiber.stateNode.containerInfo;
+ return nextHydratableInstance = getFirstHydratableChild(parentInstance), hydrationParentFiber = fiber,
+ isHydrating = !0, !0;
+ }
+ function deleteHydratableInstance(returnFiber, instance) {
+ switch (returnFiber.tag) {
+ case HostRoot:
+ didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
+ break;
+
+ case HostComponent:
+ didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
+ }
+ var childToDelete = createFiberFromHostInstanceForDeletion();
+ childToDelete.stateNode = instance, childToDelete.return = returnFiber, childToDelete.effectTag = Deletion,
+ null !== returnFiber.lastEffect ? (returnFiber.lastEffect.nextEffect = childToDelete,
+ returnFiber.lastEffect = childToDelete) : returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
+ }
+ function insertNonHydratedInstance(returnFiber, fiber) {
+ switch (fiber.effectTag |= Placement, returnFiber.tag) {
+ case HostRoot:
+ var parentContainer = returnFiber.stateNode.containerInfo;
+ switch (fiber.tag) {
+ case HostComponent:
+ var type = fiber.type, props = fiber.pendingProps;
+ didNotFindHydratableContainerInstance(parentContainer, type, props);
+ break;
+
+ case HostText:
+ var text = fiber.pendingProps;
+ didNotFindHydratableContainerTextInstance(parentContainer, text);
+ }
+ break;
+
+ case HostComponent:
+ var parentType = returnFiber.type, parentProps = returnFiber.memoizedProps, parentInstance = returnFiber.stateNode;
+ switch (fiber.tag) {
+ case HostComponent:
+ var _type = fiber.type, _props = fiber.pendingProps;
+ didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);
+ break;
+
+ case HostText:
+ var _text = fiber.pendingProps;
+ didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
+ }
+ break;
+
+ default:
+ return;
+ }
+ }
+ function tryHydrate(fiber, nextInstance) {
+ switch (fiber.tag) {
+ case HostComponent:
+ var type = fiber.type, props = fiber.pendingProps, instance = canHydrateInstance(nextInstance, type, props);
+ return null !== instance && (fiber.stateNode = instance, !0);
+
+ case HostText:
+ var text = fiber.pendingProps, textInstance = canHydrateTextInstance(nextInstance, text);
+ return null !== textInstance && (fiber.stateNode = textInstance, !0);
+
+ default:
+ return !1;
+ }
+ }
+ function tryToClaimNextHydratableInstance(fiber) {
+ if (isHydrating) {
+ var nextInstance = nextHydratableInstance;
+ if (!nextInstance) return insertNonHydratedInstance(hydrationParentFiber, fiber),
+ isHydrating = !1, void (hydrationParentFiber = fiber);
+ if (!tryHydrate(fiber, nextInstance)) {
+ if (!(nextInstance = getNextHydratableSibling(nextInstance)) || !tryHydrate(fiber, nextInstance)) return insertNonHydratedInstance(hydrationParentFiber, fiber),
+ isHydrating = !1, void (hydrationParentFiber = fiber);
+ deleteHydratableInstance(hydrationParentFiber, nextHydratableInstance);
+ }
+ hydrationParentFiber = fiber, nextHydratableInstance = getFirstHydratableChild(nextInstance);
+ }
+ }
+ function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
+ var instance = fiber.stateNode, updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);
+ return fiber.updateQueue = updatePayload, null !== updatePayload;
+ }
+ function prepareToHydrateHostTextInstance(fiber) {
+ var textInstance = fiber.stateNode, textContent = fiber.memoizedProps, shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
+ if (shouldUpdate) {
+ var returnFiber = hydrationParentFiber;
+ if (null !== returnFiber) switch (returnFiber.tag) {
+ case HostRoot:
+ var parentContainer = returnFiber.stateNode.containerInfo;
+ didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
+ break;
+
+ case HostComponent:
+ var parentType = returnFiber.type, parentProps = returnFiber.memoizedProps, parentInstance = returnFiber.stateNode;
+ didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
+ }
+ }
+ return shouldUpdate;
+ }
+ function popToNextHostParent(fiber) {
+ for (var parent = fiber.return; null !== parent && parent.tag !== HostComponent && parent.tag !== HostRoot; ) parent = parent.return;
+ hydrationParentFiber = parent;
+ }
+ function popHydrationState(fiber) {
+ if (fiber !== hydrationParentFiber) return !1;
+ if (!isHydrating) return popToNextHostParent(fiber), isHydrating = !0, !1;
+ var type = fiber.type;
+ if (fiber.tag !== HostComponent || "head" !== type && "body" !== type && !shouldSetTextContent(type, fiber.memoizedProps)) for (var nextInstance = nextHydratableInstance; nextInstance; ) deleteHydratableInstance(fiber, nextInstance),
+ nextInstance = getNextHydratableSibling(nextInstance);
+ return popToNextHostParent(fiber), nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null,
+ !0;
+ }
+ function resetHydrationState() {
+ hydrationParentFiber = null, nextHydratableInstance = null, isHydrating = !1;
+ }
+ var shouldSetTextContent = config.shouldSetTextContent, hydration = config.hydration;
+ if (!hydration) return {
+ enterHydrationState: function() {
+ return !1;
+ },
+ resetHydrationState: function() {},
+ tryToClaimNextHydratableInstance: function() {},
+ prepareToHydrateHostInstance: function() {
+ invariant(!1, "Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");
+ },
+ prepareToHydrateHostTextInstance: function() {
+ invariant(!1, "Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");
+ },
+ popHydrationState: function(fiber) {
+ return !1;
+ }
+ };
+ var canHydrateInstance = hydration.canHydrateInstance, canHydrateTextInstance = hydration.canHydrateTextInstance, getNextHydratableSibling = hydration.getNextHydratableSibling, getFirstHydratableChild = hydration.getFirstHydratableChild, hydrateInstance = hydration.hydrateInstance, hydrateTextInstance = hydration.hydrateTextInstance, didNotMatchHydratedContainerTextInstance = hydration.didNotMatchHydratedContainerTextInstance, didNotMatchHydratedTextInstance = hydration.didNotMatchHydratedTextInstance, didNotHydrateContainerInstance = hydration.didNotHydrateContainerInstance, didNotHydrateInstance = hydration.didNotHydrateInstance, didNotFindHydratableContainerInstance = hydration.didNotFindHydratableContainerInstance, didNotFindHydratableContainerTextInstance = hydration.didNotFindHydratableContainerTextInstance, didNotFindHydratableInstance = hydration.didNotFindHydratableInstance, didNotFindHydratableTextInstance = hydration.didNotFindHydratableTextInstance, hydrationParentFiber = null, nextHydratableInstance = null, isHydrating = !1;
+ return {
+ enterHydrationState: enterHydrationState,
+ resetHydrationState: resetHydrationState,
+ tryToClaimNextHydratableInstance: tryToClaimNextHydratableInstance,
+ prepareToHydrateHostInstance: prepareToHydrateHostInstance,
+ prepareToHydrateHostTextInstance: prepareToHydrateHostTextInstance,
+ popHydrationState: popHydrationState
+ };
+ }, ReactFiberInstrumentation = {
+ debugTool: null
+ }, ReactFiberInstrumentation_1 = ReactFiberInstrumentation, defaultShowDialog = function(capturedError) {
+ return !0;
+ }, showDialog = defaultShowDialog, invokeGuardedCallback$1 = ReactErrorUtils.invokeGuardedCallback, hasCaughtError = ReactErrorUtils.hasCaughtError, clearCaughtError = ReactErrorUtils.clearCaughtError, didWarnAboutStateTransition = !1, didWarnSetStateChildContext = !1, didWarnStateUpdateForUnmountedComponent = {}, warnAboutUpdateOnUnmounted = function(fiber) {
+ var componentName = getComponentName(fiber) || "ReactClass";
+ didWarnStateUpdateForUnmountedComponent[componentName] || (warning(!1, "Can only update a mounted or mounting component. This usually means you called setState, replaceState, or forceUpdate on an unmounted component. This is a no-op.\n\nPlease check the code for the %s component.", componentName),
+ didWarnStateUpdateForUnmountedComponent[componentName] = !0);
+ }, warnAboutInvalidUpdates = function(instance) {
+ switch (ReactDebugCurrentFiber.phase) {
+ case "getChildContext":
+ if (didWarnSetStateChildContext) return;
+ warning(!1, "setState(...): Cannot call setState() inside getChildContext()"), didWarnSetStateChildContext = !0;
+ break;
+
+ case "render":
+ if (didWarnAboutStateTransition) return;
+ warning(!1, "Cannot update during an existing state transition (such as within ` + ("`" + `render`))) + (("`" + (` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to ` + "`")) + (`componentWillMount` + ("`" + `."),
+ didWarnAboutStateTransition = !0;
+ }
+ }, ReactFiberScheduler = function(config) {
+ function resetContextStack() {
+ reset$1(), resetContext(), resetHostContainer();
+ }
+ function commitAllHostEffects() {
+ for (;null !== nextEffect; ) {
+ ReactDebugCurrentFiber.setCurrentFiber(nextEffect), recordEffect();
+ var effectTag = nextEffect.effectTag;
+ if (effectTag & ContentReset && commitResetTextContent(nextEffect), effectTag & Ref) {
+ var current = nextEffect.alternate;
+ null !== current && commitDetachRef(current);
+ }
+ switch (effectTag & ~(Callback | Err | ContentReset | Ref | PerformedWork)) {
+ case Placement:
+ commitPlacement(nextEffect), nextEffect.effectTag &= ~Placement;
+ break;
+
+ case PlacementAndUpdate:
+ commitPlacement(nextEffect), nextEffect.effectTag &= ~Placement;
+ var _current = nextEffect.alternate;
+ commitWork(_current, nextEffect);
+ break;
+
+ case Update:
+ var _current2 = nextEffect.alternate;
+ commitWork(_current2, nextEffect);
+ break;
+
+ case Deletion:
+ isUnmounting = !0, commitDeletion(nextEffect), isUnmounting = !1;
+ }
+ nextEffect = nextEffect.nextEffect;
+ }
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ }
+ function commitAllLifeCycles() {
+ for (;null !== nextEffect; ) {
+ var effectTag = nextEffect.effectTag;
+ if (effectTag & (Update | Callback)) {
+ recordEffect();
+ var current = nextEffect.alternate;
+ commitLifeCycles(current, nextEffect);
+ }
+ effectTag & Ref && (recordEffect(), commitAttachRef(nextEffect)), effectTag & Err && (recordEffect(),
+ commitErrorHandling(nextEffect));
+ var next = nextEffect.nextEffect;
+ nextEffect.nextEffect = null, nextEffect = next;
+ }
+ }
+ function commitRoot(finishedWork) {
+ isWorking = !0, isCommitting = !0, startCommitTimer();
+ var root = finishedWork.stateNode;
+ root.current === finishedWork && invariant(!1, "Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue."),
+ root.isReadyForCommit = !1, ReactCurrentOwner.current = null;
+ var firstEffect = void 0;
+ for (finishedWork.effectTag > PerformedWork ? null !== finishedWork.lastEffect ? (finishedWork.lastEffect.nextEffect = finishedWork,
+ firstEffect = finishedWork.firstEffect) : firstEffect = finishedWork : firstEffect = finishedWork.firstEffect,
+ prepareForCommit(), nextEffect = firstEffect, startCommitHostEffectsTimer(); null !== nextEffect; ) {
+ var didError = !1, _error = void 0;
+ invokeGuardedCallback$1(null, commitAllHostEffects, null), hasCaughtError() && (didError = !0,
+ _error = clearCaughtError()), didError && (null === nextEffect && invariant(!1, "Should have next effect. This error is likely caused by a bug in React. Please file an issue."),
+ captureError(nextEffect, _error), null !== nextEffect && (nextEffect = nextEffect.nextEffect));
+ }
+ for (stopCommitHostEffectsTimer(), resetAfterCommit(), root.current = finishedWork,
+ nextEffect = firstEffect, startCommitLifeCyclesTimer(); null !== nextEffect; ) {
+ var _didError = !1, _error2 = void 0;
+ invokeGuardedCallback$1(null, commitAllLifeCycles, null), hasCaughtError() && (_didError = !0,
+ _error2 = clearCaughtError()), _didError && (null === nextEffect && invariant(!1, "Should have next effect. This error is likely caused by a bug in React. Please file an issue."),
+ captureError(nextEffect, _error2), null !== nextEffect && (nextEffect = nextEffect.nextEffect));
+ }
+ if (isCommitting = !1, isWorking = !1, stopCommitLifeCyclesTimer(), stopCommitTimer(),
+ "function" == typeof onCommitRoot && onCommitRoot(finishedWork.stateNode), ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork),
+ commitPhaseBoundaries && (commitPhaseBoundaries.forEach(scheduleErrorRecovery),
+ commitPhaseBoundaries = null), null !== firstUncaughtError) {
+ var _error3 = firstUncaughtError;
+ firstUncaughtError = null, onUncaughtError(_error3);
+ }
+ var remainingTime = root.current.expirationTime;
+ return remainingTime === NoWork && (capturedErrors = null, failedBoundaries = null),
+ remainingTime;
+ }
+ function resetExpirationTime(workInProgress, renderTime) {
+ if (renderTime === Never || workInProgress.expirationTime !== Never) {
+ for (var newExpirationTime = getUpdateExpirationTime(workInProgress), child = workInProgress.child; null !== child; ) child.expirationTime !== NoWork && (newExpirationTime === NoWork || newExpirationTime > child.expirationTime) && (newExpirationTime = child.expirationTime),
+ child = child.sibling;
+ workInProgress.expirationTime = newExpirationTime;
+ }
+ }
+ function completeUnitOfWork(workInProgress) {
+ for (;;) {
+ var current = workInProgress.alternate;
+ ReactDebugCurrentFiber.setCurrentFiber(workInProgress);
+ var next = completeWork(current, workInProgress, nextRenderExpirationTime);
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ var returnFiber = workInProgress.return, siblingFiber = workInProgress.sibling;
+ if (resetExpirationTime(workInProgress, nextRenderExpirationTime), null !== next) return stopWorkTimer(workInProgress),
+ ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress),
+ next;
+ if (null !== returnFiber) {
+ null === returnFiber.firstEffect && (returnFiber.firstEffect = workInProgress.firstEffect),
+ null !== workInProgress.lastEffect && (null !== returnFiber.lastEffect && (returnFiber.lastEffect.nextEffect = workInProgress.firstEffect),
+ returnFiber.lastEffect = workInProgress.lastEffect);
+ workInProgress.effectTag > PerformedWork && (null !== returnFiber.lastEffect ? returnFiber.lastEffect.nextEffect = workInProgress : returnFiber.firstEffect = workInProgress,
+ returnFiber.lastEffect = workInProgress);
+ }
+ if (stopWorkTimer(workInProgress), ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress),
+ null !== siblingFiber) return siblingFiber;
+ if (null === returnFiber) {
+ return workInProgress.stateNode.isReadyForCommit = !0, null;
+ }
+ workInProgress = returnFiber;
+ }
+ return null;
+ }
+ function performUnitOfWork(workInProgress) {
+ var current = workInProgress.alternate;
+ startWorkTimer(workInProgress), ReactDebugCurrentFiber.setCurrentFiber(workInProgress);
+ var next = beginWork(current, workInProgress, nextRenderExpirationTime);
+ return ReactDebugCurrentFiber.resetCurrentFiber(), ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress),
+ null === next && (next = completeUnitOfWork(workInProgress)), ReactCurrentOwner.current = null,
+ next;
+ }
+ function performFailedUnitOfWork(workInProgress) {
+ var current = workInProgress.alternate;
+ startWorkTimer(workInProgress), ReactDebugCurrentFiber.setCurrentFiber(workInProgress);
+ var next = beginFailedWork(current, workInProgress, nextRenderExpirationTime);
+ return ReactDebugCurrentFiber.resetCurrentFiber(), ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress),
+ null === next && (next = completeUnitOfWork(workInProgress)), ReactCurrentOwner.current = null,
+ next;
+ }
+ function workLoop(expirationTime) {
+ if (null !== capturedErrors) return void slowWorkLoopThatChecksForFailedWork(expirationTime);
+ if (!(nextRenderExpirationTime === NoWork || nextRenderExpirationTime > expirationTime)) if (nextRenderExpirationTime <= mostRecentCurrentTime) for (;null !== nextUnitOfWork; ) nextUnitOfWork = performUnitOfWork(nextUnitOfWork); else for (;null !== nextUnitOfWork && !shouldYield(); ) nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
+ }
+ function slowWorkLoopThatChecksForFailedWork(expirationTime) {
+ if (!(nextRenderExpirationTime === NoWork || nextRenderExpirationTime > expirationTime)) if (nextRenderExpirationTime <= mostRecentCurrentTime) for (;null !== nextUnitOfWork; ) nextUnitOfWork = hasCapturedError(nextUnitOfWork) ? performFailedUnitOfWork(nextUnitOfWork) : performUnitOfWork(nextUnitOfWork); else for (;null !== nextUnitOfWork && !shouldYield(); ) nextUnitOfWork = hasCapturedError(nextUnitOfWork) ? performFailedUnitOfWork(nextUnitOfWork) : performUnitOfWork(nextUnitOfWork);
+ }
+ function renderRootCatchBlock(root, failedWork, boundary, expirationTime) {
+ unwindContexts(failedWork, boundary), nextUnitOfWork = performFailedUnitOfWork(boundary),
+ workLoop(expirationTime);
+ }
+ function renderRoot(root, expirationTime) {
+ isWorking && invariant(!1, "renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue."),
+ isWorking = !0, root.isReadyForCommit = !1, root === nextRoot && expirationTime === nextRenderExpirationTime && null !== nextUnitOfWork || (resetContextStack(),
+ nextRoot = root, nextRenderExpirationTime = expirationTime, nextUnitOfWork = createWorkInProgress(nextRoot.current, null, expirationTime)),
+ startWorkLoopTimer(nextUnitOfWork);
+ var didError = !1, error = null;
+ for (invokeGuardedCallback$1(null, workLoop, null, expirationTime), hasCaughtError() && (didError = !0,
+ error = clearCaughtError()); didError; ) {
+ if (didFatal) {
+ firstUncaughtError = error;
+ break;
+ }
+ var failedWork = nextUnitOfWork;
+ if (null !== failedWork) {
+ var boundary = captureError(failedWork, error);
+ if (null === boundary && invariant(!1, "Should have found an error boundary. This error is likely caused by a bug in React. Please file an issue."),
+ !didFatal) {
+ if (didError = !1, error = null, invokeGuardedCallback$1(null, renderRootCatchBlock, null, root, failedWork, boundary, expirationTime),
+ !hasCaughtError()) break;
+ didError = !0, error = clearCaughtError();
+ }
+ } else didFatal = !0;
+ }
+ var uncaughtError = firstUncaughtError;
+ return stopWorkLoopTimer(interruptedBy), interruptedBy = null, isWorking = !1, didFatal = !1,
+ firstUncaughtError = null, null !== uncaughtError && onUncaughtError(uncaughtError),
+ root.isReadyForCommit ? root.current.alternate : null;
+ }
+ function captureError(failedWork, error) {
+ ReactCurrentOwner.current = null, ReactDebugCurrentFiber.resetCurrentFiber();
+ var boundary = null, errorBoundaryFound = !1, willRetry = !1, errorBoundaryName = null;
+ if (failedWork.tag === HostRoot) boundary = failedWork, isFailedBoundary(failedWork) && (didFatal = !0); else for (var node = failedWork.return; null !== node && null === boundary; ) {
+ if (node.tag === ClassComponent) {
+ var instance = node.stateNode;
+ "function" == typeof instance.componentDidCatch && (errorBoundaryFound = !0, errorBoundaryName = getComponentName(node),
+ boundary = node, willRetry = !0);
+ } else node.tag === HostRoot && (boundary = node);
+ if (isFailedBoundary(node)) {
+ if (isUnmounting) return null;
+ if (null !== commitPhaseBoundaries && (commitPhaseBoundaries.has(node) || null !== node.alternate && commitPhaseBoundaries.has(node.alternate))) return null;
+ boundary = null, willRetry = !1;
+ }
+ node = node.return;
+ }
+ if (null !== boundary) {
+ null === failedBoundaries && (failedBoundaries = new Set()), failedBoundaries.add(boundary);
+ var _componentStack = getStackAddendumByWorkInProgressFiber(failedWork), _componentName = getComponentName(failedWork);
+ null === capturedErrors && (capturedErrors = new Map());
+ var capturedError = {
+ componentName: _componentName,
+ componentStack: _componentStack,
+ error: error,
+ errorBoundary: errorBoundaryFound ? boundary.stateNode : null,
+ errorBoundaryFound: errorBoundaryFound,
+ errorBoundaryName: errorBoundaryName,
+ willRetry: willRetry
+ };
+ capturedErrors.set(boundary, capturedError);
+ try {
+ logCapturedError(capturedError);
+ } catch (e) {
+ var suppressLogging = e && e.suppressReactErrorLogging;
+ suppressLogging || console.error(e);
+ }
+ return isCommitting ? (null === commitPhaseBoundaries && (commitPhaseBoundaries = new Set()),
+ commitPhaseBoundaries.add(boundary)) : scheduleErrorRecovery(boundary), boundary;
+ }
+ return null === firstUncaughtError && (firstUncaughtError = error), null;
+ }
+ function hasCapturedError(fiber) {
+ return null !== capturedErrors && (capturedErrors.has(fiber) || null !== fiber.alternate && capturedErrors.has(fiber.alternate));
+ }
+ function isFailedBoundary(fiber) {
+ return null !== failedBoundaries && (failedBoundaries.has(fiber) || null !== fiber.alternate && failedBoundaries.has(fiber.alternate));
+ }
+ function commitErrorHandling(effectfulFiber) {
+ var capturedError = void 0;
+ switch (null !== capturedErrors && (capturedError = capturedErrors.get(effectfulFiber),
+ capturedErrors.delete(effectfulFiber), null == capturedError && null !== effectfulFiber.alternate && (effectfulFiber = effectfulFiber.alternate,
+ capturedError = capturedErrors.get(effectfulFiber), capturedErrors.delete(effectfulFiber))),
+ null == capturedError && invariant(!1, "No error for given unit of work. This error is likely caused by a bug in React. Please file an issue."),
+ effectfulFiber.tag) {
+ case ClassComponent:
+ var instance = effectfulFiber.stateNode, info = {
+ componentStack: capturedError.componentStack
+ };
+ return void instance.componentDidCatch(capturedError.error, info);
+
+ case HostRoot:
+ return void (null === firstUncaughtError && (firstUncaughtError = capturedError.error));
+
+ default:
+ invariant(!1, "Invalid type of work. This error is likely caused by a bug in React. Please file an issue.");
+ }
+ }
+ function unwindContexts(from, to) {
+ for (var node = from; null !== node; ) {
+ switch (node.tag) {
+ case ClassComponent:
+ popContextProvider(node);
+ break;
+
+ case HostComponent:
+ popHostContext(node);
+ break;
+
+ case HostRoot:
+ case HostPortal:
+ popHostContainer(node);
+ }
+ if (node === to || node.alternate === to) {
+ stopFailedWorkTimer(node);
+ break;
+ }
+ stopWorkTimer(node), node = node.return;
+ }
+ }
+ function computeAsyncExpiration() {
+ return computeExpirationBucket(recalculateCurrentTime(), 1e3, 200);
+ }
+ function computeExpirationForFiber(fiber) {
+ return expirationContext !== NoWork ? expirationContext : isWorking ? isCommitting ? Sync : nextRenderExpirationTime : !useSyncScheduling || fiber.internalContextTag & AsyncUpdates ? computeAsyncExpiration() : Sync;
+ }
+ function scheduleWork(fiber, expirationTime) {
+ return scheduleWorkImpl(fiber, expirationTime, !1);
+ }
+ function checkRootNeedsClearing(root, fiber, expirationTime) {
+ !isWorking && root === nextRoot && expirationTime < nextRenderExpirationTime && (null !== nextUnitOfWork && (interruptedBy = fiber),
+ nextRoot = null, nextUnitOfWork = null, nextRenderExpirationTime = NoWork);
+ }
+ function scheduleWorkImpl(fiber, expirationTime, isErrorRecovery) {
+ if (recordScheduleUpdate(), !isErrorRecovery && fiber.tag === ClassComponent) {
+ var instance = fiber.stateNode;
+ warnAboutInvalidUpdates(instance);
+ }
+ for (var node = fiber; null !== node; ) {
+ if ((node.expirationTime === NoWork || node.expirationTime > expirationTime) && (node.expirationTime = expirationTime),
+ null !== node.alternate && (node.alternate.expirationTime === NoWork || node.alternate.expirationTime > expirationTime) && (node.alternate.expirationTime = expirationTime),
+ null === node.return) {
+ if (node.tag !== HostRoot) return void (isErrorRecovery || fiber.tag !== ClassComponent || warnAboutUpdateOnUnmounted(fiber));
+ var root = node.stateNode;
+ checkRootNeedsClearing(root, fiber, expirationTime), requestWork(root, expirationTime),
+ checkRootNeedsClearing(root, fiber, expirationTime);
+ }
+ node = node.return;
+ }
+ }
+ function scheduleErrorRecovery(fiber) {
+ scheduleWorkImpl(fiber, Sync, !0);
+ }
+ function recalculateCurrentTime() {
+ var ms = now() - startTime;
+ return mostRecentCurrentTime = msToExpirationTime(ms);
+ }
+ function deferredUpdates(fn) {
+ var previousExpirationContext = expirationContext;
+ expirationContext = computeAsyncExpiration();
+ try {
+ return fn();
+ } finally {
+ expirationContext = previousExpirationContext;
+ }
+ }
+ function syncUpdates(fn) {
+ var previousExpirationContext = expirationContext;
+ expirationContext = Sync;
+ try {
+ return fn();
+ } finally {
+ expirationContext = previousExpirationContext;
+ }
+ }
+ function scheduleCallbackWithExpiration(expirationTime) {
+ if (callbackExpirationTime !== NoWork) {
+ if (expirationTime > callbackExpirationTime) return;
+ cancelDeferredCallback(callbackID);
+ } else startRequestCallbackTimer();
+ var currentMs = now() - startTime, expirationMs = expirationTimeToMs(expirationTime), timeout = expirationMs - currentMs;
+ callbackExpirationTime = expirationTime, callbackID = scheduleDeferredCallback(performAsyncWork, {
+ timeout: timeout
+ });
+ }
+ function requestWork(root, expirationTime) {
+ if (nestedUpdateCount > NESTED_UPDATE_LIMIT && invariant(!1, "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops."),
+ null === root.nextScheduledRoot) root.remainingExpirationTime = expirationTime,
+ null === lastScheduledRoot ? (firstScheduledRoot = lastScheduledRoot = root, root.nextScheduledRoot = root) : (lastScheduledRoot.nextScheduledRoot = root,
+ lastScheduledRoot = root, lastScheduledRoot.nextScheduledRoot = firstScheduledRoot); else {
+ var remainingExpirationTime = root.remainingExpirationTime;
+ (remainingExpirationTime === NoWork || expirationTime < remainingExpirationTime) && (root.remainingExpirationTime = expirationTime);
+ }
+ if (!isRendering) return isBatchingUpdates ? void (isUnbatchingUpdates && (nextFlushedRoot = root,
+ nextFlushedExpirationTime = Sync, performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime))) : void (expirationTime === Sync ? performWork(Sync, null) : scheduleCallbackWithExpiration(expirationTime));
+ }
+ function findHighestPriorityRoot() {
+ var highestPriorityWork = NoWork, highestPriorityRoot = null;
+ if (null !== lastScheduledRoot) for (var previousScheduledRoot = lastScheduledRoot, root = firstScheduledRoot; null !== root; ) {
+ var remainingExpirationTime = root.remainingExpirationTime;
+ if (remainingExpirationTime === NoWork) {
+ if ((null === previousScheduledRoot || null === lastScheduledRoot) && invariant(!1, "Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue."),
+ root === root.nextScheduledRoot) {
+ root.nextScheduledRoot = null, firstScheduledRoot = lastScheduledRoot = null;
+ break;
+ }
+ if (root === firstScheduledRoot) {
+ var next = root.nextScheduledRoot;
+ firstScheduledRoot = next, lastScheduledRoot.nextScheduledRoot = next, root.nextScheduledRoot = null;
+ } else {
+ if (root === lastScheduledRoot) {
+ lastScheduledRoot = previousScheduledRoot, lastScheduledRoot.nextScheduledRoot = firstScheduledRoot,
+ root.nextScheduledRoot = null;
+ break;
+ }
+ previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot, root.nextScheduledRoot = null;
+ }
+ root = previousScheduledRoot.nextScheduledRoot;
+ } else {
+ if ((highestPriorityWork === NoWork || remainingExpirationTime < highestPriorityWork) && (highestPriorityWork = remainingExpirationTime,
+ highestPriorityRoot = root), root === lastScheduledRoot) break;
+ previousScheduledRoot = root, root = root.nextScheduledRoot;
+ }
+ }
+ var previousFlushedRoot = nextFlushedRoot;
+ null !== previousFlushedRoot && previousFlushedRoot === highestPriorityRoot ? nestedUpdateCount++ : nestedUpdateCount = 0,
+ nextFlushedRoot = highestPriorityRoot, nextFlushedExpirationTime = highestPriorityWork;
+ }
+ function performAsyncWork(dl) {
+ performWork(NoWork, dl);
+ }
+ function performWork(minExpirationTime, dl) {
+ if (deadline = dl, findHighestPriorityRoot(), enableUserTimingAPI && null !== deadline) {
+ stopRequestCallbackTimer(nextFlushedExpirationTime < recalculateCurrentTime());
+ }
+ for (;null !== nextFlushedRoot && nextFlushedExpirationTime !== NoWork && (minExpirationTime === NoWork || nextFlushedExpirationTime <= minExpirationTime) && !deadlineDidExpire; ) performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime),
+ findHighestPriorityRoot();
+ if (null !== deadline && (callbackExpirationTime = NoWork, callbackID = -1), nextFlushedExpirationTime !== NoWork && scheduleCallbackWithExpiration(nextFlushedExpirationTime),
+ deadline = null, deadlineDidExpire = !1, nestedUpdateCount = 0, hasUnhandledError) {
+ var _error4 = unhandledError;
+ throw unhandledError = null, hasUnhandledError = !1, _error4;
+ }
+ }
+ function performWorkOnRoot(root, expirationTime) {
+ if (isRendering && invariant(!1, "performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue."),
+ isRendering = !0, expirationTime <= recalculateCurrentTime()) {
+ var finishedWork = root.finishedWork;
+ null !== finishedWork ? (root.finishedWork = null, root.remainingExpirationTime = commitRoot(finishedWork)) : (root.finishedWork = null,
+ null !== (finishedWork = renderRoot(root, expirationTime)) && (root.remainingExpirationTime = commitRoot(finishedWork)));
+ } else {
+ var _finishedWork = root.finishedWork;
+ null !== _finishedWork ? (root.finishedWork = null, root.remainingExpirationTime = commitRoot(_finishedWork)) : (root.finishedWork = null,
+ null !== (_finishedWork = renderRoot(root, expirationTime)) && (shouldYield() ? root.finishedWork = _finishedWork : root.remainingExpirationTime = commitRoot(_finishedWork)));
+ }
+ isRendering = !1;
+ }
+ function shouldYield() {
+ return null !== deadline && (!(deadline.timeRemaining() > timeHeuristicForUnitOfWork) && (deadlineDidExpire = !0,
+ !0));
+ }
+ function onUncaughtError(error) {
+ null === nextFlushedRoot && invariant(!1, "Should be working on a root. This error is likely caused by a bug in React. Please file an issue."),
+ nextFlushedRoot.remainingExpirationTime = NoWork, hasUnhandledError || (hasUnhandledError = !0,
+ unhandledError = error);
+ }
+ function batchedUpdates(fn, a) {
+ var previousIsBatchingUpdates = isBatchingUpdates;
+ isBatchingUpdates = !0;
+ try {
+ return fn(a);
+ } finally {
+ isBatchingUpdates = previousIsBatchingUpdates, isBatchingUpdates || isRendering || performWork(Sync, null);
+ }
+ }
+ function unbatchedUpdates(fn) {
+ if (isBatchingUpdates && !isUnbatchingUpdates) {
+ isUnbatchingUpdates = !0;
+ try {
+ return fn();
+ } finally {
+ isUnbatchingUpdates = !1;
+ }
+ }
+ return fn();
+ }
+ function flushSync(fn) {
+ var previousIsBatchingUpdates = isBatchingUpdates;
+ isBatchingUpdates = !0;
+ try {
+ return syncUpdates(fn);
+ } finally {
+ isBatchingUpdates = previousIsBatchingUpdates, isRendering && invariant(!1, "flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering."),
+ performWork(Sync, null);
+ }
+ }
+ var hostContext = ReactFiberHostContext(config), hydrationContext = ReactFiberHydrationContext(config), popHostContainer = hostContext.popHostContainer, popHostContext = hostContext.popHostContext, resetHostContainer = hostContext.resetHostContainer, _ReactFiberBeginWork = ReactFiberBeginWork(config, hostContext, hydrationContext, scheduleWork, computeExpirationForFiber), beginWork = _ReactFiberBeginWork.beginWork, beginFailedWork = _ReactFiberBeginWork.beginFailedWork, _ReactFiberCompleteWo = ReactFiberCompleteWork(config, hostContext, hydrationContext), completeWork = _ReactFiberCompleteWo.completeWork, _ReactFiberCommitWork = ReactFiberCommitWork(config, captureError), commitResetTextContent = _ReactFiberCommitWork.commitResetTextContent, commitPlacement = _ReactFiberCommitWork.commitPlacement, commitDeletion = _ReactFiberCommitWork.commitDeletion, commitWork = _ReactFiberCommitWork.commitWork, commitLifeCycles = _ReactFiberCommitWork.commitLifeCycles, commitAttachRef = _ReactFiberCommitWork.commitAttachRef, commitDetachRef = _ReactFiberCommitWork.commitDetachRef, now = config.now, scheduleDeferredCallback = config.scheduleDeferredCallback, cancelDeferredCallback = config.cancelDeferredCallback, useSyncScheduling = config.useSyncScheduling, prepareForCommit = config.prepareForCommit, resetAfterCommit = config.resetAfterCommit, startTime = now(), mostRecentCurrentTime = msToExpirationTime(0), expirationContext = NoWork, isWorking = !1, nextUnitOfWork = null, nextRoot = null, nextRenderExpirationTime = NoWork, nextEffect = null, capturedErrors = null, failedBoundaries = null, commitPhaseBoundaries = null, firstUncaughtError = null, didFatal = !1, isCommitting = !1, isUnmounting = !1, interruptedBy = null, firstScheduledRoot = null, lastScheduledRoot = null, callbackExpirationTime = NoWork, callbackID = -1, isRendering = !1, nextFlushedRoot = null, nextFlushedExpirationTime = NoWork, deadlineDidExpire = !1, hasUnhandledError = !1, unhandledError = null, deadline = null, isBatchingUpdates = !1, isUnbatchingUpdates = !1, NESTED_UPDATE_LIMIT = 1e3, nestedUpdateCount = 0, timeHeuristicForUnitOfWork = 1;
+ return {
+ computeAsyncExpiration: computeAsyncExpiration,
+ computeExpirationForFiber: computeExpirationForFiber,
+ scheduleWork: scheduleWork,
+ batchedUpdates: batchedUpdates,
+ unbatchedUpdates: unbatchedUpdates,
+ flushSync: flushSync,
+ deferredUpdates: deferredUpdates
+ };
+ }, didWarnAboutNestedUpdates = !1, ReactFiberReconciler$1 = function(config) {
+ function scheduleTopLevelUpdate(current, element, callback) {
+ "render" !== ReactDebugCurrentFiber.phase || null === ReactDebugCurrentFiber.current || didWarnAboutNestedUpdates || (didWarnAboutNestedUpdates = !0,
+ warning(!1, "Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\n\nCheck the render method of %s.", getComponentName(ReactDebugCurrentFiber.current) || "Unknown")),
+ callback = void 0 === callback ? null : callback, warning(null === callback || "function" == typeof callback, "render(...): Expected the last optional `)))) + ((("`" + (`callback` + "`")) + (` argument to be a function. Instead received: %s.", callback);
+ var expirationTime = void 0;
+ expirationTime = enableAsyncSubtreeAPI && null != element && null != element.type && null != element.type.prototype && !0 === element.type.prototype.unstable_isAsyncReactComponent ? computeAsyncExpiration() : computeExpirationForFiber(current),
+ insertUpdateIntoFiber(current, {
+ expirationTime: expirationTime,
+ partialState: {
+ element: element
+ },
+ callback: callback,
+ isReplace: !1,
+ isForced: !1,
+ nextCallback: null,
+ next: null
+ }), scheduleWork(current, expirationTime);
+ }
+ function findHostInstance(fiber) {
+ var hostFiber = findCurrentHostFiber(fiber);
+ return null === hostFiber ? null : hostFiber.stateNode;
+ }
+ var getPublicInstance = config.getPublicInstance, _ReactFiberScheduler = ReactFiberScheduler(config), computeAsyncExpiration = _ReactFiberScheduler.computeAsyncExpiration, computeExpirationForFiber = _ReactFiberScheduler.computeExpirationForFiber, scheduleWork = _ReactFiberScheduler.scheduleWork, batchedUpdates = _ReactFiberScheduler.batchedUpdates, unbatchedUpdates = _ReactFiberScheduler.unbatchedUpdates, flushSync = _ReactFiberScheduler.flushSync, deferredUpdates = _ReactFiberScheduler.deferredUpdates;
+ return {
+ createContainer: function(containerInfo, hydrate) {
+ return createFiberRoot(containerInfo, hydrate);
+ },
+ updateContainer: function(element, container, parentComponent, callback) {
+ var current = container.current;
+ ReactFiberInstrumentation_1.debugTool && (null === current.alternate ? ReactFiberInstrumentation_1.debugTool.onMountContainer(container) : null === element ? ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container) : ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container));
+ var context = getContextForSubtree(parentComponent);
+ null === container.context ? container.context = context : container.pendingContext = context,
+ scheduleTopLevelUpdate(current, element, callback);
+ },
+ batchedUpdates: batchedUpdates,
+ unbatchedUpdates: unbatchedUpdates,
+ deferredUpdates: deferredUpdates,
+ flushSync: flushSync,
+ getPublicRootInstance: function(container) {
+ var containerFiber = container.current;
+ if (!containerFiber.child) return null;
+ switch (containerFiber.child.tag) {
+ case HostComponent:
+ return getPublicInstance(containerFiber.child.stateNode);
+
+ default:
+ return containerFiber.child.stateNode;
+ }
+ },
+ findHostInstance: findHostInstance,
+ findHostInstanceWithNoPortals: function(fiber) {
+ var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
+ return null === hostFiber ? null : hostFiber.stateNode;
+ },
+ injectIntoDevTools: function(devToolsConfig) {
+ var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
+ return injectInternals(_assign({}, devToolsConfig, {
+ findHostInstanceByFiber: function(fiber) {
+ return findHostInstance(fiber);
+ },
+ findFiberByHostInstance: function(instance) {
+ return findFiberByHostInstance ? findFiberByHostInstance(instance) : null;
+ }
+ }));
+ }
+ };
+ }, ReactFiberReconciler$2 = Object.freeze({
+ default: ReactFiberReconciler$1
+ }), ReactFiberReconciler$3 = ReactFiberReconciler$2 && ReactFiberReconciler$1 || ReactFiberReconciler$2, reactReconciler = ReactFiberReconciler$3.default ? ReactFiberReconciler$3.default : ReactFiberReconciler$3;
+ ExecutionEnvironment.canUseDOM && "function" != typeof requestAnimationFrame && warning(!1, "React depends on requestAnimationFrame. Make sure that you load a polyfill in older browsers. http://fb.me/react-polyfills");
+ var hasNativePerformanceNow = "object" == typeof performance && "function" == typeof performance.now, now = void 0;
+ now = hasNativePerformanceNow ? function() {
+ return performance.now();
+ } : function() {
+ return Date.now();
+ };
+ var rIC = void 0, cIC = void 0;
+ if (ExecutionEnvironment.canUseDOM) if ("function" != typeof requestIdleCallback || "function" != typeof cancelIdleCallback) {
+ var frameDeadlineObject, scheduledRICCallback = null, isIdleScheduled = !1, timeoutTime = -1, isAnimationFrameScheduled = !1, frameDeadline = 0, previousFrameTime = 33, activeFrameTime = 33;
+ frameDeadlineObject = hasNativePerformanceNow ? {
+ didTimeout: !1,
+ timeRemaining: function() {
+ var remaining = frameDeadline - performance.now();
+ return remaining > 0 ? remaining : 0;
+ }
+ } : {
+ didTimeout: !1,
+ timeRemaining: function() {
+ var remaining = frameDeadline - Date.now();
+ return remaining > 0 ? remaining : 0;
+ }
+ };
+ var messageKey = "__reactIdleCallback$" + Math.random().toString(36).slice(2), idleTick = function(event) {
+ if (event.source === window && event.data === messageKey) {
+ isIdleScheduled = !1;
+ var currentTime = now();
+ if (frameDeadline - currentTime <= 0) {
+ if (!(-1 !== timeoutTime && timeoutTime <= currentTime)) return void (isAnimationFrameScheduled || (isAnimationFrameScheduled = !0,
+ requestAnimationFrame(animationTick)));
+ frameDeadlineObject.didTimeout = !0;
+ } else frameDeadlineObject.didTimeout = !1;
+ timeoutTime = -1;
+ var callback = scheduledRICCallback;
+ scheduledRICCallback = null, null !== callback && callback(frameDeadlineObject);
+ }
+ };
+ window.addEventListener("message", idleTick, !1);
+ var animationTick = function(rafTime) {
+ isAnimationFrameScheduled = !1;
+ var nextFrameTime = rafTime - frameDeadline + activeFrameTime;
+ nextFrameTime < activeFrameTime && previousFrameTime < activeFrameTime ? (nextFrameTime < 8 && (nextFrameTime = 8),
+ activeFrameTime = nextFrameTime < previousFrameTime ? previousFrameTime : nextFrameTime) : previousFrameTime = nextFrameTime,
+ frameDeadline = rafTime + activeFrameTime, isIdleScheduled || (isIdleScheduled = !0,
+ window.postMessage(messageKey, "*"));
+ };
+ rIC = function(callback, options) {
+ return scheduledRICCallback = callback, null != options && "number" == typeof options.timeout && (timeoutTime = now() + options.timeout),
+ isAnimationFrameScheduled || (isAnimationFrameScheduled = !0, requestAnimationFrame(animationTick)),
+ 0;
+ }, cIC = function() {
+ scheduledRICCallback = null, isIdleScheduled = !1, timeoutTime = -1;
+ };
+ } else rIC = window.requestIdleCallback, cIC = window.cancelIdleCallback; else rIC = function(frameCallback) {
+ return setTimeout(function() {
+ frameCallback({
+ timeRemaining: function() {
+ return 1 / 0;
+ }
+ });
+ });
+ }, cIC = function(timeoutID) {
+ clearTimeout(timeoutID);
+ };
+ var lowPriorityWarning = function() {}, printWarning = function(format) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];
+ var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ "undefined" != typeof console && console.warn(message);
+ try {
+ throw new Error(message);
+ } catch (x) {}
+ };
+ lowPriorityWarning = function(condition, format) {
+ if (void 0 === format) throw new Error("` + ("`" + `warning(condition, format, ...args)`))) + (("`" + (` requires a warning message argument");
+ if (!condition) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];
+ printWarning.apply(void 0, [ format ].concat(args));
+ }
+ };
+ var lowPriorityWarning$1 = lowPriorityWarning, VALID_ATTRIBUTE_NAME_REGEX = new RegExp("^[" + ATTRIBUTE_NAME_START_CHAR + "][" + ATTRIBUTE_NAME_CHAR + "]*$"), illegalAttributeNameCache = {}, validatedAttributeNameCache = {}, ReactControlledValuePropTypes = {
+ checkPropTypes: null
+ }, hasReadOnlyValue = {
+ button: !0,
+ checkbox: !0,
+ image: !0,
+ hidden: !0,
+ radio: !0,
+ reset: !0,
+ submit: !0
+ }, propTypes = {
+ value: function(props, propName, componentName) {
+ return !props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled ? null : new Error("You provided a ` + "`")) + (`value` + ("`" + ` prop to a form field without an `))))) + (((("`" + (`onChange` + "`")) + (` handler. This will render a read-only field. If the field should be mutable use ` + ("`" + `defaultValue`))) + (("`" + (`. Otherwise, set either ` + "`")) + (`onChange` + ("`" + ` or `)))) + ((("`" + (`readOnly` + "`")) + (`.");
+ },
+ checked: function(props, propName, componentName) {
+ return !props[propName] || props.onChange || props.readOnly || props.disabled ? null : new Error("You provided a ` + ("`" + `checked`))) + (("`" + (` prop to a form field without an ` + "`")) + (`onChange` + ("`" + ` handler. This will render a read-only field. If the field should be mutable use `))))))))) + (((((((("`" + `defaultChecked`) + ("`" + (`. Otherwise, set either ` + "`"))) + ((`onChange` + ("`" + ` or `)) + ("`" + (`readOnly` + "`")))) + (((`.");
+ }
+ };
+ ReactControlledValuePropTypes.checkPropTypes = function(tagName, props, getStack) {
+ checkPropTypes(propTypes, props, "prop", tagName, getStack);
+ };
+ var getCurrentFiberOwnerName$2 = ReactDebugCurrentFiber.getCurrentFiberOwnerName, getCurrentFiberStackAddendum$3 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnValueDefaultValue = !1, didWarnCheckedDefaultChecked = !1, didWarnControlledToUncontrolled = !1, didWarnUncontrolledToControlled = !1, getCurrentFiberOwnerName$3 = ReactDebugCurrentFiber.getCurrentFiberOwnerName, getCurrentFiberStackAddendum$4 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnValueDefaultValue$1 = !1, valuePropNames = [ "value", "defaultValue" ], getCurrentFiberStackAddendum$5 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnValDefaultVal = !1, HTML_NAMESPACE$1 = "http://www.w3.org/1999/xhtml", MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML", SVG_NAMESPACE = "http://www.w3.org/2000/svg", Namespaces = {
+ html: HTML_NAMESPACE$1,
+ mathml: MATH_NAMESPACE,
+ svg: SVG_NAMESPACE
+ }, reusableSVGContainer = void 0, setInnerHTML = function(func) {
+ return "undefined" != typeof MSApp && MSApp.execUnsafeLocalFunction ? function(arg0, arg1, arg2, arg3) {
+ MSApp.execUnsafeLocalFunction(function() {
+ return func(arg0, arg1, arg2, arg3);
+ });
+ } : func;
+ }(function(node, html) {
+ if (node.namespaceURI !== Namespaces.svg || "innerHTML" in node) node.innerHTML = html; else {
+ reusableSVGContainer = reusableSVGContainer || document.createElement("div"), reusableSVGContainer.innerHTML = "<svg>" + html + "</svg>";
+ for (var svgNode = reusableSVGContainer.firstChild; node.firstChild; ) node.removeChild(node.firstChild);
+ for (;svgNode.firstChild; ) node.appendChild(svgNode.firstChild);
+ }
+ }), setTextContent = function(node, text) {
+ if (text) {
+ var firstChild = node.firstChild;
+ if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) return void (firstChild.nodeValue = text);
+ }
+ node.textContent = text;
+ }, isUnitlessNumber = {
+ animationIterationCount: !0,
+ borderImageOutset: !0,
+ borderImageSlice: !0,
+ borderImageWidth: !0,
+ boxFlex: !0,
+ boxFlexGroup: !0,
+ boxOrdinalGroup: !0,
+ columnCount: !0,
+ columns: !0,
+ flex: !0,
+ flexGrow: !0,
+ flexPositive: !0,
+ flexShrink: !0,
+ flexNegative: !0,
+ flexOrder: !0,
+ gridRow: !0,
+ gridRowEnd: !0,
+ gridRowSpan: !0,
+ gridRowStart: !0,
+ gridColumn: !0,
+ gridColumnEnd: !0,
+ gridColumnSpan: !0,
+ gridColumnStart: !0,
+ fontWeight: !0,
+ lineClamp: !0,
+ lineHeight: !0,
+ opacity: !0,
+ order: !0,
+ orphans: !0,
+ tabSize: !0,
+ widows: !0,
+ zIndex: !0,
+ zoom: !0,
+ fillOpacity: !0,
+ floodOpacity: !0,
+ stopOpacity: !0,
+ strokeDasharray: !0,
+ strokeDashoffset: !0,
+ strokeMiterlimit: !0,
+ strokeOpacity: !0,
+ strokeWidth: !0
+ }, prefixes = [ "Webkit", "ms", "Moz", "O" ];
+ Object.keys(isUnitlessNumber).forEach(function(prop) {
+ prefixes.forEach(function(prefix) {
+ isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
+ });
+ });
+ var warnValidStyle = emptyFunction, badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/, badStyleValueWithSemicolonPattern = /;\s*$/, warnedStyleNames = {}, warnedStyleValues = {}, warnedForNaNValue = !1, warnedForInfinityValue = !1, warnHyphenatedStyleName = function(name, getStack) {
+ warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name] || (warnedStyleNames[name] = !0,
+ warning(!1, "Unsupported style property %s. Did you mean %s?%s", name, camelizeStyleName(name), getStack()));
+ }, warnBadVendoredStyleName = function(name, getStack) {
+ warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name] || (warnedStyleNames[name] = !0,
+ warning(!1, "Unsupported vendor-prefixed style property %s. Did you mean %s?%s", name, name.charAt(0).toUpperCase() + name.slice(1), getStack()));
+ }, warnStyleValueWithSemicolon = function(name, value, getStack) {
+ warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value] || (warnedStyleValues[value] = !0,
+ warning(!1, 'Style property values shouldn\'t contain a semicolon. Try "%s: %s" instead.%s', name, value.replace(badStyleValueWithSemicolonPattern, ""), getStack()));
+ }, warnStyleValueIsNaN = function(name, value, getStack) {
+ warnedForNaNValue || (warnedForNaNValue = !0, warning(!1, "` + ("`" + `NaN`)) + ("`" + (` is an invalid value for the ` + "`"))) + ((`%s` + ("`" + ` css style property.%s", name, getStack()));
+ }, warnStyleValueIsInfinity = function(name, value, getStack) {
+ warnedForInfinityValue || (warnedForInfinityValue = !0, warning(!1, "`)) + ("`" + (`Infinity` + "`"))))) + ((((` is an invalid value for the ` + ("`" + `%s`)) + ("`" + (` css style property.%s", name, getStack()));
+ };
+ warnValidStyle = function(name, value, getStack) {
+ name.indexOf("-") > -1 ? warnHyphenatedStyleName(name, getStack) : badVendoredStyleNamePattern.test(name) ? warnBadVendoredStyleName(name, getStack) : badStyleValueWithSemicolonPattern.test(value) && warnStyleValueWithSemicolon(name, value, getStack),
+ "number" == typeof value && (isNaN(value) ? warnStyleValueIsNaN(name, 0, getStack) : isFinite(value) || warnStyleValueIsInfinity(name, 0, getStack));
+ };
+ var warnValidStyle$1 = warnValidStyle, omittedCloseTags = {
+ area: !0,
+ base: !0,
+ br: !0,
+ col: !0,
+ embed: !0,
+ hr: !0,
+ img: !0,
+ input: !0,
+ keygen: !0,
+ link: !0,
+ meta: !0,
+ param: !0,
+ source: !0,
+ track: !0,
+ wbr: !0
+ }, voidElementTags = _assign({
+ menuitem: !0
+ }, omittedCloseTags), HTML$1 = "__html", ariaProperties = {
+ "aria-current": 0,
+ "aria-details": 0,
+ "aria-disabled": 0,
+ "aria-hidden": 0,
+ "aria-invalid": 0,
+ "aria-keyshortcuts": 0,
+ "aria-label": 0,
+ "aria-roledescription": 0,
+ "aria-autocomplete": 0,
+ "aria-checked": 0,
+ "aria-expanded": 0,
+ "aria-haspopup": 0,
+ "aria-level": 0,
+ "aria-modal": 0,
+ "aria-multiline": 0,
+ "aria-multiselectable": 0,
+ "aria-orientation": 0,
+ "aria-placeholder": 0,
+ "aria-pressed": 0,
+ "aria-readonly": 0,
+ "aria-required": 0,
+ "aria-selected": 0,
+ "aria-sort": 0,
+ "aria-valuemax": 0,
+ "aria-valuemin": 0,
+ "aria-valuenow": 0,
+ "aria-valuetext": 0,
+ "aria-atomic": 0,
+ "aria-busy": 0,
+ "aria-live": 0,
+ "aria-relevant": 0,
+ "aria-dropeffect": 0,
+ "aria-grabbed": 0,
+ "aria-activedescendant": 0,
+ "aria-colcount": 0,
+ "aria-colindex": 0,
+ "aria-colspan": 0,
+ "aria-controls": 0,
+ "aria-describedby": 0,
+ "aria-errormessage": 0,
+ "aria-flowto": 0,
+ "aria-labelledby": 0,
+ "aria-owns": 0,
+ "aria-posinset": 0,
+ "aria-rowcount": 0,
+ "aria-rowindex": 0,
+ "aria-rowspan": 0,
+ "aria-setsize": 0
+ }, warnedProperties = {}, rARIA = new RegExp("^(aria)-[" + ATTRIBUTE_NAME_CHAR + "]*$"), rARIACamel = new RegExp("^(aria)[A-Z][" + ATTRIBUTE_NAME_CHAR + "]*$"), hasOwnProperty = Object.prototype.hasOwnProperty, didWarnValueNull = !1, possibleStandardNames = {
+ accept: "accept",
+ acceptcharset: "acceptCharset",
+ "accept-charset": "acceptCharset",
+ accesskey: "accessKey",
+ action: "action",
+ allowfullscreen: "allowFullScreen",
+ alt: "alt",
+ as: "as",
+ async: "async",
+ autocapitalize: "autoCapitalize",
+ autocomplete: "autoComplete",
+ autocorrect: "autoCorrect",
+ autofocus: "autoFocus",
+ autoplay: "autoPlay",
+ autosave: "autoSave",
+ capture: "capture",
+ cellpadding: "cellPadding",
+ cellspacing: "cellSpacing",
+ challenge: "challenge",
+ charset: "charSet",
+ checked: "checked",
+ children: "children",
+ cite: "cite",
+ class: "className",
+ classid: "classID",
+ classname: "className",
+ cols: "cols",
+ colspan: "colSpan",
+ content: "content",
+ contenteditable: "contentEditable",
+ contextmenu: "contextMenu",
+ controls: "controls",
+ controlslist: "controlsList",
+ coords: "coords",
+ crossorigin: "crossOrigin",
+ dangerouslysetinnerhtml: "dangerouslySetInnerHTML",
+ data: "data",
+ datetime: "dateTime",
+ default: "default",
+ defaultchecked: "defaultChecked",
+ defaultvalue: "defaultValue",
+ defer: "defer",
+ dir: "dir",
+ disabled: "disabled",
+ download: "download",
+ draggable: "draggable",
+ enctype: "encType",
+ for: "htmlFor",
+ form: "form",
+ formmethod: "formMethod",
+ formaction: "formAction",
+ formenctype: "formEncType",
+ formnovalidate: "formNoValidate",
+ formtarget: "formTarget",
+ frameborder: "frameBorder",
+ headers: "headers",
+ height: "height",
+ hidden: "hidden",
+ high: "high",
+ href: "href",
+ hreflang: "hrefLang",
+ htmlfor: "htmlFor",
+ httpequiv: "httpEquiv",
+ "http-equiv": "httpEquiv",
+ icon: "icon",
+ id: "id",
+ innerhtml: "innerHTML",
+ inputmode: "inputMode",
+ integrity: "integrity",
+ is: "is",
+ itemid: "itemID",
+ itemprop: "itemProp",
+ itemref: "itemRef",
+ itemscope: "itemScope",
+ itemtype: "itemType",
+ keyparams: "keyParams",
+ keytype: "keyType",
+ kind: "kind",
+ label: "label",
+ lang: "lang",
+ list: "list",
+ loop: "loop",
+ low: "low",
+ manifest: "manifest",
+ marginwidth: "marginWidth",
+ marginheight: "marginHeight",
+ max: "max",
+ maxlength: "maxLength",
+ media: "media",
+ mediagroup: "mediaGroup",
+ method: "method",
+ min: "min",
+ minlength: "minLength",
+ multiple: "multiple",
+ muted: "muted",
+ name: "name",
+ nonce: "nonce",
+ novalidate: "noValidate",
+ open: "open",
+ optimum: "optimum",
+ pattern: "pattern",
+ placeholder: "placeholder",
+ playsinline: "playsInline",
+ poster: "poster",
+ preload: "preload",
+ profile: "profile",
+ radiogroup: "radioGroup",
+ readonly: "readOnly",
+ referrerpolicy: "referrerPolicy",
+ rel: "rel",
+ required: "required",
+ reversed: "reversed",
+ role: "role",
+ rows: "rows",
+ rowspan: "rowSpan",
+ sandbox: "sandbox",
+ scope: "scope",
+ scoped: "scoped",
+ scrolling: "scrolling",
+ seamless: "seamless",
+ selected: "selected",
+ shape: "shape",
+ size: "size",
+ sizes: "sizes",
+ span: "span",
+ spellcheck: "spellCheck",
+ src: "src",
+ srcdoc: "srcDoc",
+ srclang: "srcLang",
+ srcset: "srcSet",
+ start: "start",
+ step: "step",
+ style: "style",
+ summary: "summary",
+ tabindex: "tabIndex",
+ target: "target",
+ title: "title",
+ type: "type",
+ usemap: "useMap",
+ value: "value",
+ width: "width",
+ wmode: "wmode",
+ wrap: "wrap",
+ about: "about",
+ accentheight: "accentHeight",
+ "accent-height": "accentHeight",
+ accumulate: "accumulate",
+ additive: "additive",
+ alignmentbaseline: "alignmentBaseline",
+ "alignment-baseline": "alignmentBaseline",
+ allowreorder: "allowReorder",
+ alphabetic: "alphabetic",
+ amplitude: "amplitude",
+ arabicform: "arabicForm",
+ "arabic-form": "arabicForm",
+ ascent: "ascent",
+ attributename: "attributeName",
+ attributetype: "attributeType",
+ autoreverse: "autoReverse",
+ azimuth: "azimuth",
+ basefrequency: "baseFrequency",
+ baselineshift: "baselineShift",
+ "baseline-shift": "baselineShift",
+ baseprofile: "baseProfile",
+ bbox: "bbox",
+ begin: "begin",
+ bias: "bias",
+ by: "by",
+ calcmode: "calcMode",
+ capheight: "capHeight",
+ "cap-height": "capHeight",
+ clip: "clip",
+ clippath: "clipPath",
+ "clip-path": "clipPath",
+ clippathunits: "clipPathUnits",
+ cliprule: "clipRule",
+ "clip-rule": "clipRule",
+ color: "color",
+ colorinterpolation: "colorInterpolation",
+ "color-interpolation": "colorInterpolation",
+ colorinterpolationfilters: "colorInterpolationFilters",
+ "color-interpolation-filters": "colorInterpolationFilters",
+ colorprofile: "colorProfile",
+ "color-profile": "colorProfile",
+ colorrendering: "colorRendering",
+ "color-rendering": "colorRendering",
+ contentscripttype: "contentScriptType",
+ contentstyletype: "contentStyleType",
+ cursor: "cursor",
+ cx: "cx",
+ cy: "cy",
+ d: "d",
+ datatype: "datatype",
+ decelerate: "decelerate",
+ descent: "descent",
+ diffuseconstant: "diffuseConstant",
+ direction: "direction",
+ display: "display",
+ divisor: "divisor",
+ dominantbaseline: "dominantBaseline",
+ "dominant-baseline": "dominantBaseline",
+ dur: "dur",
+ dx: "dx",
+ dy: "dy",
+ edgemode: "edgeMode",
+ elevation: "elevation",
+ enablebackground: "enableBackground",
+ "enable-background": "enableBackground",
+ end: "end",
+ exponent: "exponent",
+ externalresourcesrequired: "externalResourcesRequired",
+ fill: "fill",
+ fillopacity: "fillOpacity",
+ "fill-opacity": "fillOpacity",
+ fillrule: "fillRule",
+ "fill-rule": "fillRule",
+ filter: "filter",
+ filterres: "filterRes",
+ filterunits: "filterUnits",
+ floodopacity: "floodOpacity",
+ "flood-opacity": "floodOpacity",
+ floodcolor: "floodColor",
+ "flood-color": "floodColor",
+ focusable: "focusable",
+ fontfamily: "fontFamily",
+ "font-family": "fontFamily",
+ fontsize: "fontSize",
+ "font-size": "fontSize",
+ fontsizeadjust: "fontSizeAdjust",
+ "font-size-adjust": "fontSizeAdjust",
+ fontstretch: "fontStretch",
+ "font-stretch": "fontStretch",
+ fontstyle: "fontStyle",
+ "font-style": "fontStyle",
+ fontvariant: "fontVariant",
+ "font-variant": "fontVariant",
+ fontweight: "fontWeight",
+ "font-weight": "fontWeight",
+ format: "format",
+ from: "from",
+ fx: "fx",
+ fy: "fy",
+ g1: "g1",
+ g2: "g2",
+ glyphname: "glyphName",
+ "glyph-name": "glyphName",
+ glyphorientationhorizontal: "glyphOrientationHorizontal",
+ "glyph-orientation-horizontal": "glyphOrientationHorizontal",
+ glyphorientationvertical: "glyphOrientationVertical",
+ "glyph-orientation-vertical": "glyphOrientationVertical",
+ glyphref: "glyphRef",
+ gradienttransform: "gradientTransform",
+ gradientunits: "gradientUnits",
+ hanging: "hanging",
+ horizadvx: "horizAdvX",
+ "horiz-adv-x": "horizAdvX",
+ horizoriginx: "horizOriginX",
+ "horiz-origin-x": "horizOriginX",
+ ideographic: "ideographic",
+ imagerendering: "imageRendering",
+ "image-rendering": "imageRendering",
+ in2: "in2",
+ in: "in",
+ inlist: "inlist",
+ intercept: "intercept",
+ k1: "k1",
+ k2: "k2",
+ k3: "k3",
+ k4: "k4",
+ k: "k",
+ kernelmatrix: "kernelMatrix",
+ kernelunitlength: "kernelUnitLength",
+ kerning: "kerning",
+ keypoints: "keyPoints",
+ keysplines: "keySplines",
+ keytimes: "keyTimes",
+ lengthadjust: "lengthAdjust",
+ letterspacing: "letterSpacing",
+ "letter-spacing": "letterSpacing",
+ lightingcolor: "lightingColor",
+ "lighting-color": "lightingColor",
+ limitingconeangle: "limitingConeAngle",
+ local: "local",
+ markerend: "markerEnd",
+ "marker-end": "markerEnd",
+ markerheight: "markerHeight",
+ markermid: "markerMid",
+ "marker-mid": "markerMid",
+ markerstart: "markerStart",
+ "marker-start": "markerStart",
+ markerunits: "markerUnits",
+ markerwidth: "markerWidth",
+ mask: "mask",
+ maskcontentunits: "maskContentUnits",
+ maskunits: "maskUnits",
+ mathematical: "mathematical",
+ mode: "mode",
+ numoctaves: "numOctaves",
+ offset: "offset",
+ opacity: "opacity",
+ operator: "operator",
+ order: "order",
+ orient: "orient",
+ orientation: "orientation",
+ origin: "origin",
+ overflow: "overflow",
+ overlineposition: "overlinePosition",
+ "overline-position": "overlinePosition",
+ overlinethickness: "overlineThickness",
+ "overline-thickness": "overlineThickness",
+ paintorder: "paintOrder",
+ "paint-order": "paintOrder",
+ panose1: "panose1",
+ "panose-1": "panose1",
+ pathlength: "pathLength",
+ patterncontentunits: "patternContentUnits",
+ patterntransform: "patternTransform",
+ patternunits: "patternUnits",
+ pointerevents: "pointerEvents",
+ "pointer-events": "pointerEvents",
+ points: "points",
+ pointsatx: "pointsAtX",
+ pointsaty: "pointsAtY",
+ pointsatz: "pointsAtZ",
+ prefix: "prefix",
+ preservealpha: "preserveAlpha",
+ preserveaspectratio: "preserveAspectRatio",
+ primitiveunits: "primitiveUnits",
+ property: "property",
+ r: "r",
+ radius: "radius",
+ refx: "refX",
+ refy: "refY",
+ renderingintent: "renderingIntent",
+ "rendering-intent": "renderingIntent",
+ repeatcount: "repeatCount",
+ repeatdur: "repeatDur",
+ requiredextensions: "requiredExtensions",
+ requiredfeatures: "requiredFeatures",
+ resource: "resource",
+ restart: "restart",
+ result: "result",
+ results: "results",
+ rotate: "rotate",
+ rx: "rx",
+ ry: "ry",
+ scale: "scale",
+ security: "security",
+ seed: "seed",
+ shaperendering: "shapeRendering",
+ "shape-rendering": "shapeRendering",
+ slope: "slope",
+ spacing: "spacing",
+ specularconstant: "specularConstant",
+ specularexponent: "specularExponent",
+ speed: "speed",
+ spreadmethod: "spreadMethod",
+ startoffset: "startOffset",
+ stddeviation: "stdDeviation",
+ stemh: "stemh",
+ stemv: "stemv",
+ stitchtiles: "stitchTiles",
+ stopcolor: "stopColor",
+ "stop-color": "stopColor",
+ stopopacity: "stopOpacity",
+ "stop-opacity": "stopOpacity",
+ strikethroughposition: "strikethroughPosition",
+ "strikethrough-position": "strikethroughPosition",
+ strikethroughthickness: "strikethroughThickness",
+ "strikethrough-thickness": "strikethroughThickness",
+ string: "string",
+ stroke: "stroke",
+ strokedasharray: "strokeDasharray",
+ "stroke-dasharray": "strokeDasharray",
+ strokedashoffset: "strokeDashoffset",
+ "stroke-dashoffset": "strokeDashoffset",
+ strokelinecap: "strokeLinecap",
+ "stroke-linecap": "strokeLinecap",
+ strokelinejoin: "strokeLinejoin",
+ "stroke-linejoin": "strokeLinejoin",
+ strokemiterlimit: "strokeMiterlimit",
+ "stroke-miterlimit": "strokeMiterlimit",
+ strokewidth: "strokeWidth",
+ "stroke-width": "strokeWidth",
+ strokeopacity: "strokeOpacity",
+ "stroke-opacity": "strokeOpacity",
+ suppresscontenteditablewarning: "suppressContentEditableWarning",
+ suppresshydrationwarning: "suppressHydrationWarning",
+ surfacescale: "surfaceScale",
+ systemlanguage: "systemLanguage",
+ tablevalues: "tableValues",
+ targetx: "targetX",
+ targety: "targetY",
+ textanchor: "textAnchor",
+ "text-anchor": "textAnchor",
+ textdecoration: "textDecoration",
+ "text-decoration": "textDecoration",
+ textlength: "textLength",
+ textrendering: "textRendering",
+ "text-rendering": "textRendering",
+ to: "to",
+ transform: "transform",
+ typeof: "typeof",
+ u1: "u1",
+ u2: "u2",
+ underlineposition: "underlinePosition",
+ "underline-position": "underlinePosition",
+ underlinethickness: "underlineThickness",
+ "underline-thickness": "underlineThickness",
+ unicode: "unicode",
+ unicodebidi: "unicodeBidi",
+ "unicode-bidi": "unicodeBidi",
+ unicoderange: "unicodeRange",
+ "unicode-range": "unicodeRange",
+ unitsperem: "unitsPerEm",
+ "units-per-em": "unitsPerEm",
+ unselectable: "unselectable",
+ valphabetic: "vAlphabetic",
+ "v-alphabetic": "vAlphabetic",
+ values: "values",
+ vectoreffect: "vectorEffect",
+ "vector-effect": "vectorEffect",
+ version: "version",
+ vertadvy: "vertAdvY",
+ "vert-adv-y": "vertAdvY",
+ vertoriginx: "vertOriginX",
+ "vert-origin-x": "vertOriginX",
+ vertoriginy: "vertOriginY",
+ "vert-origin-y": "vertOriginY",
+ vhanging: "vHanging",
+ "v-hanging": "vHanging",
+ videographic: "vIdeographic",
+ "v-ideographic": "vIdeographic",
+ viewbox: "viewBox",
+ viewtarget: "viewTarget",
+ visibility: "visibility",
+ vmathematical: "vMathematical",
+ "v-mathematical": "vMathematical",
+ vocab: "vocab",
+ widths: "widths",
+ wordspacing: "wordSpacing",
+ "word-spacing": "wordSpacing",
+ writingmode: "writingMode",
+ "writing-mode": "writingMode",
+ x1: "x1",
+ x2: "x2",
+ x: "x",
+ xchannelselector: "xChannelSelector",
+ xheight: "xHeight",
+ "x-height": "xHeight",
+ xlinkactuate: "xlinkActuate",
+ "xlink:actuate": "xlinkActuate",
+ xlinkarcrole: "xlinkArcrole",
+ "xlink:arcrole": "xlinkArcrole",
+ xlinkhref: "xlinkHref",
+ "xlink:href": "xlinkHref",
+ xlinkrole: "xlinkRole",
+ "xlink:role": "xlinkRole",
+ xlinkshow: "xlinkShow",
+ "xlink:show": "xlinkShow",
+ xlinktitle: "xlinkTitle",
+ "xlink:title": "xlinkTitle",
+ xlinktype: "xlinkType",
+ "xlink:type": "xlinkType",
+ xmlbase: "xmlBase",
+ "xml:base": "xmlBase",
+ xmllang: "xmlLang",
+ "xml:lang": "xmlLang",
+ xmlns: "xmlns",
+ "xml:space": "xmlSpace",
+ xmlnsxlink: "xmlnsXlink",
+ "xmlns:xlink": "xmlnsXlink",
+ xmlspace: "xmlSpace",
+ y1: "y1",
+ y2: "y2",
+ y: "y",
+ ychannelselector: "yChannelSelector",
+ z: "z",
+ zoomandpan: "zoomAndPan"
+ }, warnedProperties$1 = {}, hasOwnProperty$1 = Object.prototype.hasOwnProperty, EVENT_NAME_REGEX = /^on./, INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/, rARIA$1 = new RegExp("^(aria)-[" + ATTRIBUTE_NAME_CHAR + "]*$"), rARIACamel$1 = new RegExp("^(aria)[A-Z][" + ATTRIBUTE_NAME_CHAR + "]*$"), validateProperty$1 = function(tagName, name, value, canUseEventSystem) {
+ if (hasOwnProperty$1.call(warnedProperties$1, name) && warnedProperties$1[name]) return !0;
+ var lowerCasedName = name.toLowerCase();
+ if ("onfocusin" === lowerCasedName || "onfocusout" === lowerCasedName) return warning(!1, "React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React."),
+ warnedProperties$1[name] = !0, !0;
+ if (canUseEventSystem) {
+ if (registrationNameModules.hasOwnProperty(name)) return !0;
+ var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
+ if (null != registrationName) return warning(!1, "Invalid event handler property ` + "`"))) + ((`%s` + ("`" + `. Did you mean `)) + ("`" + (`%s` + "`")))) + (((`?%s", name, registrationName, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ if (EVENT_NAME_REGEX.test(name)) return warning(!1, "Unknown event handler property ` + ("`" + `%s`)) + ("`" + (`. It will be ignored.%s", name, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ } else if (EVENT_NAME_REGEX.test(name)) return INVALID_EVENT_NAME_REGEX.test(name) && warning(!1, "Invalid event handler property ` + "`"))) + ((`%s` + ("`" + `. React events use the camelCase naming convention, for example `)) + ("`" + (`onClick` + "`")))))) + (((((`.%s", name, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ if (rARIA$1.test(name) || rARIACamel$1.test(name)) return !0;
+ if ("innerhtml" === lowerCasedName) return warning(!1, "Directly setting property ` + ("`" + `innerHTML`)) + ("`" + (` is not permitted. For more information, lookup documentation on ` + "`"))) + ((`dangerouslySetInnerHTML` + ("`" + `."),
+ warnedProperties$1[name] = !0, !0;
+ if ("aria" === lowerCasedName) return warning(!1, "The `)) + ("`" + (`aria` + "`")))) + (((` attribute is reserved for future use in React. Pass individual ` + ("`" + `aria-`)) + ("`" + (` attributes instead."),
+ warnedProperties$1[name] = !0, !0;
+ if ("is" === lowerCasedName && null !== value && void 0 !== value && "string" != typeof value) return warning(!1, "Received a ` + "`"))) + ((`%s` + ("`" + ` for a string attribute `)) + ("`" + (`is` + "`"))))) + ((((`. If this is expected, cast the value to a string.%s", typeof value, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ if ("number" == typeof value && isNaN(value)) return warning(!1, "Received NaN for the ` + ("`" + `%s`)) + ("`" + (` attribute. If this is expected, cast the value to a string.%s", name, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ var isReserved = isReservedProp(name);
+ if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
+ var standardName = possibleStandardNames[lowerCasedName];
+ if (standardName !== name) return warning(!1, "Invalid DOM property ` + "`"))) + ((`%s` + ("`" + `. Did you mean `)) + ("`" + (`%s` + "`")))) + (((`?%s", name, standardName, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ } else if (!isReserved && name !== lowerCasedName) return warning(!1, "React does not recognize the ` + ("`" + `%s`)) + ("`" + (` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase ` + "`"))) + ((`%s` + ("`" + ` instead. If you accidentally passed it from a parent component, remove it from the DOM element.%s", name, lowerCasedName, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0;
+ return "boolean" != typeof value || shouldAttributeAcceptBooleanValue(name) ? !!isReserved || (!!shouldSetAttribute(name, value) || (warnedProperties$1[name] = !0,
+ !1)) : (value ? warning(!1, 'Received `)) + ("`" + (`%s` + "`"))))))) + ((((((` for a non-boolean attribute ` + "`") + (`%s` + ("`" + `.\n\nIf you want to write it to the DOM, pass a string instead: %s="%s" or %s={value.toString()}.%s', value, name, name, value, name, getStackAddendum$2()) : warning(!1, 'Received `))) + (("`" + (`%s` + "`")) + (` for a non-boolean attribute ` + ("`" + `%s`)))) + ((("`" + (`.\n\nIf you want to write it to the DOM, pass a string instead: %s="%s" or %s={value.toString()}.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.%s', value, name, name, value, name, name, name, getStackAddendum$2()),
+ warnedProperties$1[name] = !0, !0);
+ }, warnUnknownProperties = function(type, props, canUseEventSystem) {
+ var unknownProps = [];
+ for (var key in props) {
+ validateProperty$1(0, key, props[key], canUseEventSystem) || unknownProps.push(key);
+ }
+ var unknownPropString = unknownProps.map(function(prop) {
+ return "` + "`")) + (`" + prop + "` + ("`" + `";
+ }).join(", ");
+ 1 === unknownProps.length ? warning(!1, "Invalid value for prop %s on <%s> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM. For details, see https://fb.me/react-attribute-behavior%s", unknownPropString, type, getStackAddendum$2()) : unknownProps.length > 1 && warning(!1, "Invalid values for props %s on <%s> tag. Either remove them from the element, or pass a string or number value to keep them in the DOM. For details, see https://fb.me/react-attribute-behavior%s", unknownPropString, type, getStackAddendum$2());
+ }, getCurrentFiberOwnerName$1 = ReactDebugCurrentFiber.getCurrentFiberOwnerName, getCurrentFiberStackAddendum$2 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnInvalidHydration = !1, didWarnShadyDOM = !1, DANGEROUSLY_SET_INNER_HTML = "dangerouslySetInnerHTML", SUPPRESS_CONTENT_EDITABLE_WARNING = "suppressContentEditableWarning", SUPPRESS_HYDRATION_WARNING$1 = "suppressHydrationWarning", AUTOFOCUS = "autoFocus", CHILDREN = "children", STYLE = "style", HTML = "__html", HTML_NAMESPACE = Namespaces.html, getStack = emptyFunction.thatReturns("");
+ getStack = getCurrentFiberStackAddendum$2;
+ var warnedUnknownTags = {
+ time: !0,
+ dialog: !0
+ }, validatePropertiesInDevelopment = function(type, props) {
+ validateProperties(type, props), validateProperties$1(type, props), validateProperties$2(type, props, !0);
+ }, NORMALIZE_NEWLINES_REGEX = /\r\n?/g, NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g, normalizeMarkupForTextOrAttribute = function(markup) {
+ return ("string" == typeof markup ? markup : "" + markup).replace(NORMALIZE_NEWLINES_REGEX, "\n").replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, "");
+ }, warnForTextDifference = function(serverText, clientText) {
+ if (!didWarnInvalidHydration) {
+ var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText), normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
+ normalizedServerText !== normalizedClientText && (didWarnInvalidHydration = !0,
+ warning(!1, 'Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText));
+ }
+ }, warnForPropDifference = function(propName, serverValue, clientValue) {
+ if (!didWarnInvalidHydration) {
+ var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue), normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
+ normalizedServerValue !== normalizedClientValue && (didWarnInvalidHydration = !0,
+ warning(!1, "Prop `))) + (("`" + (`%s` + "`")) + (` did not match. Server: %s Client: %s", propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue)));
+ }
+ }, warnForExtraAttributes = function(attributeNames) {
+ if (!didWarnInvalidHydration) {
+ didWarnInvalidHydration = !0;
+ var names = [];
+ attributeNames.forEach(function(name) {
+ names.push(name);
+ }), warning(!1, "Extra attributes from the server: %s", names);
+ }
+ }, warnForInvalidEventListener = function(registrationName, listener) {
+ !1 === listener ? warning(!1, "Expected ` + ("`" + `%s`))))) + (((("`" + (` listener to be a function, instead got ` + "`")) + (`false` + ("`" + `.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.%s", registrationName, registrationName, registrationName, getCurrentFiberStackAddendum$2()) : warning(!1, "Expected `))) + (("`" + (`%s` + "`")) + (` listener to be a function, instead got a value of ` + ("`" + `%s`)))) + ((("`" + (` type.%s", registrationName, typeof listener, getCurrentFiberStackAddendum$2());
+ }, normalizeHTML = function(parent, html) {
+ var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
+ return testElement.innerHTML = html, testElement.innerHTML;
+ }, mediaEvents = {
+ topAbort: "abort",
+ topCanPlay: "canplay",
+ topCanPlayThrough: "canplaythrough",
+ topDurationChange: "durationchange",
+ topEmptied: "emptied",
+ topEncrypted: "encrypted",
+ topEnded: "ended",
+ topError: "error",
+ topLoadedData: "loadeddata",
+ topLoadedMetadata: "loadedmetadata",
+ topLoadStart: "loadstart",
+ topPause: "pause",
+ topPlay: "play",
+ topPlaying: "playing",
+ topProgress: "progress",
+ topRateChange: "ratechange",
+ topSeeked: "seeked",
+ topSeeking: "seeking",
+ topStalled: "stalled",
+ topSuspend: "suspend",
+ topTimeUpdate: "timeupdate",
+ topVolumeChange: "volumechange",
+ topWaiting: "waiting"
+ }, ReactDOMFiberComponent = Object.freeze({
+ createElement: createElement$1,
+ createTextNode: createTextNode$1,
+ setInitialProperties: setInitialProperties$1,
+ diffProperties: diffProperties$1,
+ updateProperties: updateProperties$1,
+ diffHydratedProperties: diffHydratedProperties$1,
+ diffHydratedText: diffHydratedText$1,
+ warnForUnmatchedText: warnForUnmatchedText$1,
+ warnForDeletedHydratableElement: warnForDeletedHydratableElement$1,
+ warnForDeletedHydratableText: warnForDeletedHydratableText$1,
+ warnForInsertedHydratedElement: warnForInsertedHydratedElement$1,
+ warnForInsertedHydratedText: warnForInsertedHydratedText$1,
+ restoreControlledState: restoreControlledState
+ }), getCurrentFiberStackAddendum$6 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, validateDOMNesting = emptyFunction, specialTags = [ "address", "applet", "area", "article", "aside", "base", "basefont", "bgsound", "blockquote", "body", "br", "button", "caption", "center", "col", "colgroup", "dd", "details", "dir", "div", "dl", "dt", "embed", "fieldset", "figcaption", "figure", "footer", "form", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "iframe", "img", "input", "isindex", "li", "link", "listing", "main", "marquee", "menu", "menuitem", "meta", "nav", "noembed", "noframes", "noscript", "object", "ol", "p", "param", "plaintext", "pre", "script", "section", "select", "source", "style", "summary", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "title", "tr", "track", "ul", "wbr", "xmp" ], inScopeTags = [ "applet", "caption", "html", "table", "td", "th", "marquee", "object", "template", "foreignObject", "desc", "title" ], buttonScopeTags = inScopeTags.concat([ "button" ]), impliedEndTags = [ "dd", "dt", "li", "option", "optgroup", "p", "rp", "rt" ], emptyAncestorInfo = {
+ current: null,
+ formTag: null,
+ aTagInScope: null,
+ buttonTagInScope: null,
+ nobrTagInScope: null,
+ pTagInButtonScope: null,
+ listItemTagAutoclosing: null,
+ dlItemTagAutoclosing: null
+ }, updatedAncestorInfo$1 = function(oldInfo, tag, instance) {
+ var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo), info = {
+ tag: tag,
+ instance: instance
+ };
+ return -1 !== inScopeTags.indexOf(tag) && (ancestorInfo.aTagInScope = null, ancestorInfo.buttonTagInScope = null,
+ ancestorInfo.nobrTagInScope = null), -1 !== buttonScopeTags.indexOf(tag) && (ancestorInfo.pTagInButtonScope = null),
+ -1 !== specialTags.indexOf(tag) && "address" !== tag && "div" !== tag && "p" !== tag && (ancestorInfo.listItemTagAutoclosing = null,
+ ancestorInfo.dlItemTagAutoclosing = null), ancestorInfo.current = info, "form" === tag && (ancestorInfo.formTag = info),
+ "a" === tag && (ancestorInfo.aTagInScope = info), "button" === tag && (ancestorInfo.buttonTagInScope = info),
+ "nobr" === tag && (ancestorInfo.nobrTagInScope = info), "p" === tag && (ancestorInfo.pTagInButtonScope = info),
+ "li" === tag && (ancestorInfo.listItemTagAutoclosing = info), "dd" !== tag && "dt" !== tag || (ancestorInfo.dlItemTagAutoclosing = info),
+ ancestorInfo;
+ }, isTagValidWithParent = function(tag, parentTag) {
+ switch (parentTag) {
+ case "select":
+ return "option" === tag || "optgroup" === tag || "#text" === tag;
+
+ case "optgroup":
+ return "option" === tag || "#text" === tag;
+
+ case "option":
+ return "#text" === tag;
+
+ case "tr":
+ return "th" === tag || "td" === tag || "style" === tag || "script" === tag || "template" === tag;
+
+ case "tbody":
+ case "thead":
+ case "tfoot":
+ return "tr" === tag || "style" === tag || "script" === tag || "template" === tag;
+
+ case "colgroup":
+ return "col" === tag || "template" === tag;
+
+ case "table":
+ return "caption" === tag || "colgroup" === tag || "tbody" === tag || "tfoot" === tag || "thead" === tag || "style" === tag || "script" === tag || "template" === tag;
+
+ case "head":
+ return "base" === tag || "basefont" === tag || "bgsound" === tag || "link" === tag || "meta" === tag || "title" === tag || "noscript" === tag || "noframes" === tag || "style" === tag || "script" === tag || "template" === tag;
+
+ case "html":
+ return "head" === tag || "body" === tag;
+
+ case "#document":
+ return "html" === tag;
+ }
+ switch (tag) {
+ case "h1":
+ case "h2":
+ case "h3":
+ case "h4":
+ case "h5":
+ case "h6":
+ return "h1" !== parentTag && "h2" !== parentTag && "h3" !== parentTag && "h4" !== parentTag && "h5" !== parentTag && "h6" !== parentTag;
+
+ case "rp":
+ case "rt":
+ return -1 === impliedEndTags.indexOf(parentTag);
+
+ case "body":
+ case "caption":
+ case "col":
+ case "colgroup":
+ case "frame":
+ case "head":
+ case "html":
+ case "tbody":
+ case "td":
+ case "tfoot":
+ case "th":
+ case "thead":
+ case "tr":
+ return null == parentTag;
+ }
+ return !0;
+ }, findInvalidAncestorForTag = function(tag, ancestorInfo) {
+ switch (tag) {
+ case "address":
+ case "article":
+ case "aside":
+ case "blockquote":
+ case "center":
+ case "details":
+ case "dialog":
+ case "dir":
+ case "div":
+ case "dl":
+ case "fieldset":
+ case "figcaption":
+ case "figure":
+ case "footer":
+ case "header":
+ case "hgroup":
+ case "main":
+ case "menu":
+ case "nav":
+ case "ol":
+ case "p":
+ case "section":
+ case "summary":
+ case "ul":
+ case "pre":
+ case "listing":
+ case "table":
+ case "hr":
+ case "xmp":
+ case "h1":
+ case "h2":
+ case "h3":
+ case "h4":
+ case "h5":
+ case "h6":
+ return ancestorInfo.pTagInButtonScope;
+
+ case "form":
+ return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
+
+ case "li":
+ return ancestorInfo.listItemTagAutoclosing;
+
+ case "dd":
+ case "dt":
+ return ancestorInfo.dlItemTagAutoclosing;
+
+ case "button":
+ return ancestorInfo.buttonTagInScope;
+
+ case "a":
+ return ancestorInfo.aTagInScope;
+
+ case "nobr":
+ return ancestorInfo.nobrTagInScope;
+ }
+ return null;
+ }, didWarn = {};
+ validateDOMNesting = function(childTag, childText, ancestorInfo) {
+ ancestorInfo = ancestorInfo || emptyAncestorInfo;
+ var parentInfo = ancestorInfo.current, parentTag = parentInfo && parentInfo.tag;
+ null != childText && (warning(null == childTag, "validateDOMNesting: when childText is passed, childTag should be null"),
+ childTag = "#text");
+ var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo, invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo), invalidParentOrAncestor = invalidParent || invalidAncestor;
+ if (invalidParentOrAncestor) {
+ var ancestorTag = invalidParentOrAncestor.tag, addendum = getCurrentFiberStackAddendum$6(), warnKey = !!invalidParent + "|" + childTag + "|" + ancestorTag + "|" + addendum;
+ if (!didWarn[warnKey]) {
+ didWarn[warnKey] = !0;
+ var tagDisplayName = childTag, whitespaceInfo = "";
+ if ("#text" === childTag ? /\S/.test(childText) ? tagDisplayName = "Text nodes" : (tagDisplayName = "Whitespace text nodes",
+ whitespaceInfo = " Make sure you don't have any extra whitespace between tags on each line of your source code.") : tagDisplayName = "<" + childTag + ">",
+ invalidParent) {
+ var info = "";
+ "table" === ancestorTag && "tr" === childTag && (info += " Add a <tbody> to your code to match the DOM tree generated by the browser."),
+ warning(!1, "validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s", tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);
+ } else warning(!1, "validateDOMNesting(...): %s cannot appear as a descendant of <%s>.%s", tagDisplayName, ancestorTag, addendum);
+ }
+ }
+ }, validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo$1, validateDOMNesting.isTagValidInContext = function(tag, ancestorInfo) {
+ ancestorInfo = ancestorInfo || emptyAncestorInfo;
+ var parentInfo = ancestorInfo.current, parentTag = parentInfo && parentInfo.tag;
+ return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo);
+ };
+ var validateDOMNesting$1 = validateDOMNesting, createElement = createElement$1, createTextNode = createTextNode$1, setInitialProperties = setInitialProperties$1, diffProperties = diffProperties$1, updateProperties = updateProperties$1, diffHydratedProperties = diffHydratedProperties$1, diffHydratedText = diffHydratedText$1, warnForUnmatchedText = warnForUnmatchedText$1, warnForDeletedHydratableElement = warnForDeletedHydratableElement$1, warnForDeletedHydratableText = warnForDeletedHydratableText$1, warnForInsertedHydratedElement = warnForInsertedHydratedElement$1, warnForInsertedHydratedText = warnForInsertedHydratedText$1, updatedAncestorInfo = validateDOMNesting$1.updatedAncestorInfo, precacheFiberNode = precacheFiberNode$1, updateFiberProps = updateFiberProps$1;
+ "function" == typeof Map && null != Map.prototype && "function" == typeof Map.prototype.forEach && "function" == typeof Set && null != Set.prototype && "function" == typeof Set.prototype.clear && "function" == typeof Set.prototype.forEach || warning(!1, "React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. http://fb.me/react-polyfills"),
+ injection$3.injectFiberControlledHostComponent(ReactDOMFiberComponent);
+ var eventsEnabled = null, selectionInformation = null, DOMRenderer = reactReconciler({
+ getRootHostContext: function(rootContainerInstance) {
+ var type = void 0, namespace = void 0, nodeType = rootContainerInstance.nodeType;
+ switch (nodeType) {
+ case DOCUMENT_NODE:
+ case DOCUMENT_FRAGMENT_NODE:
+ type = nodeType === DOCUMENT_NODE ? "#document" : "#fragment";
+ var root = rootContainerInstance.documentElement;
+ namespace = root ? root.namespaceURI : getChildNamespace(null, "");
+ break;
+
+ default:
+ var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance, ownNamespace = container.namespaceURI || null;
+ type = container.tagName, namespace = getChildNamespace(ownNamespace, type);
+ }
+ var validatedTag = type.toLowerCase();
+ return {
+ namespace: namespace,
+ ancestorInfo: updatedAncestorInfo(null, validatedTag, null)
+ };
+ },
+ getChildHostContext: function(parentHostContext, type) {
+ var parentHostContextDev = parentHostContext;
+ return {
+ namespace: getChildNamespace(parentHostContextDev.namespace, type),
+ ancestorInfo: updatedAncestorInfo(parentHostContextDev.ancestorInfo, type, null)
+ };
+ },
+ getPublicInstance: function(instance) {
+ return instance;
+ },
+ prepareForCommit: function() {
+ eventsEnabled = isEnabled(), selectionInformation = getSelectionInformation(), setEnabled(!1);
+ },
+ resetAfterCommit: function() {
+ restoreSelection(selectionInformation), selectionInformation = null, setEnabled(eventsEnabled),
+ eventsEnabled = null;
+ },
+ createInstance: function(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
+ var parentNamespace = void 0, hostContextDev = hostContext;
+ if (validateDOMNesting$1(type, null, hostContextDev.ancestorInfo), "string" == typeof props.children || "number" == typeof props.children) {
+ var string = "" + props.children, ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);
+ validateDOMNesting$1(null, string, ownAncestorInfo);
+ }
+ parentNamespace = hostContextDev.namespace;
+ var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
+ return precacheFiberNode(internalInstanceHandle, domElement), updateFiberProps(domElement, props),
+ domElement;
+ },
+ appendInitialChild: function(parentInstance, child) {
+ parentInstance.appendChild(child);
+ },
+ finalizeInitialChildren: function(domElement, type, props, rootContainerInstance) {
+ return setInitialProperties(domElement, type, props, rootContainerInstance), shouldAutoFocusHostComponent(type, props);
+ },
+ prepareUpdate: function(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
+ var hostContextDev = hostContext;
+ if (typeof newProps.children != typeof oldProps.children && ("string" == typeof newProps.children || "number" == typeof newProps.children)) {
+ var string = "" + newProps.children, ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);
+ validateDOMNesting$1(null, string, ownAncestorInfo);
+ }
+ return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
+ },
+ shouldSetTextContent: function(type, props) {
+ return "textarea" === type || "string" == typeof props.children || "number" == typeof props.children || "object" == typeof props.dangerouslySetInnerHTML && null !== props.dangerouslySetInnerHTML && "string" == typeof props.dangerouslySetInnerHTML.__html;
+ },
+ shouldDeprioritizeSubtree: function(type, props) {
+ return !!props.hidden;
+ },
+ createTextInstance: function(text, rootContainerInstance, hostContext, internalInstanceHandle) {
+ validateDOMNesting$1(null, text, hostContext.ancestorInfo);
+ var textNode = createTextNode(text, rootContainerInstance);
+ return precacheFiberNode(internalInstanceHandle, textNode), textNode;
+ },
+ now: now,
+ mutation: {
+ commitMount: function(domElement, type, newProps, internalInstanceHandle) {
+ domElement.focus();
+ },
+ commitUpdate: function(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
+ updateFiberProps(domElement, newProps), updateProperties(domElement, updatePayload, type, oldProps, newProps);
+ },
+ resetTextContent: function(domElement) {
+ domElement.textContent = "";
+ },
+ commitTextUpdate: function(textInstance, oldText, newText) {
+ textInstance.nodeValue = newText;
+ },
+ appendChild: function(parentInstance, child) {
+ parentInstance.appendChild(child);
+ },
+ appendChildToContainer: function(container, child) {
+ container.nodeType === COMMENT_NODE ? container.parentNode.insertBefore(child, container) : container.appendChild(child);
+ },
+ insertBefore: function(parentInstance, child, beforeChild) {
+ parentInstance.insertBefore(child, beforeChild);
+ },
+ insertInContainerBefore: function(container, child, beforeChild) {
+ container.nodeType === COMMENT_NODE ? container.parentNode.insertBefore(child, beforeChild) : container.insertBefore(child, beforeChild);
+ },
+ removeChild: function(parentInstance, child) {
+ parentInstance.removeChild(child);
+ },
+ removeChildFromContainer: function(container, child) {
+ container.nodeType === COMMENT_NODE ? container.parentNode.removeChild(child) : container.removeChild(child);
+ }
+ },
+ hydration: {
+ canHydrateInstance: function(instance, type, props) {
+ return instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase() ? null : instance;
+ },
+ canHydrateTextInstance: function(instance, text) {
+ return "" === text || instance.nodeType !== TEXT_NODE ? null : instance;
+ },
+ getNextHydratableSibling: function(instance) {
+ for (var node = instance.nextSibling; node && node.nodeType !== ELEMENT_NODE && node.nodeType !== TEXT_NODE; ) node = node.nextSibling;
+ return node;
+ },
+ getFirstHydratableChild: function(parentInstance) {
+ for (var next = parentInstance.firstChild; next && next.nodeType !== ELEMENT_NODE && next.nodeType !== TEXT_NODE; ) next = next.nextSibling;
+ return next;
+ },
+ hydrateInstance: function(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
+ precacheFiberNode(internalInstanceHandle, instance), updateFiberProps(instance, props);
+ var parentNamespace = void 0;
+ return parentNamespace = hostContext.namespace, diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);
+ },
+ hydrateTextInstance: function(textInstance, text, internalInstanceHandle) {
+ return precacheFiberNode(internalInstanceHandle, textInstance), diffHydratedText(textInstance, text);
+ },
+ didNotMatchHydratedContainerTextInstance: function(parentContainer, textInstance, text) {
+ warnForUnmatchedText(textInstance, text);
+ },
+ didNotMatchHydratedTextInstance: function(parentType, parentProps, parentInstance, textInstance, text) {
+ !0 !== parentProps.suppressHydrationWarning && warnForUnmatchedText(textInstance, text);
+ },
+ didNotHydrateContainerInstance: function(parentContainer, instance) {
+ 1 === instance.nodeType ? warnForDeletedHydratableElement(parentContainer, instance) : warnForDeletedHydratableText(parentContainer, instance);
+ },
+ didNotHydrateInstance: function(parentType, parentProps, parentInstance, instance) {
+ !0 !== parentProps.suppressHydrationWarning && (1 === instance.nodeType ? warnForDeletedHydratableElement(parentInstance, instance) : warnForDeletedHydratableText(parentInstance, instance));
+ },
+ didNotFindHydratableContainerInstance: function(parentContainer, type, props) {
+ warnForInsertedHydratedElement(parentContainer, type, props);
+ },
+ didNotFindHydratableContainerTextInstance: function(parentContainer, text) {
+ warnForInsertedHydratedText(parentContainer, text);
+ },
+ didNotFindHydratableInstance: function(parentType, parentProps, parentInstance, type, props) {
+ !0 !== parentProps.suppressHydrationWarning && warnForInsertedHydratedElement(parentInstance, type, props);
+ },
+ didNotFindHydratableTextInstance: function(parentType, parentProps, parentInstance, text) {
+ !0 !== parentProps.suppressHydrationWarning && warnForInsertedHydratedText(parentInstance, text);
+ }
+ },
+ scheduleDeferredCallback: rIC,
+ cancelDeferredCallback: cIC,
+ useSyncScheduling: !0
+ });
+ injection$4.injectFiberBatchedUpdates(DOMRenderer.batchedUpdates);
+ var warnedAboutHydrateAPI = !1;
+ ReactRoot.prototype.render = function(children, callback) {
+ var root = this._reactRootContainer;
+ DOMRenderer.updateContainer(children, root, null, callback);
+ }, ReactRoot.prototype.unmount = function(callback) {
+ var root = this._reactRootContainer;
+ DOMRenderer.updateContainer(null, root, null, callback);
+ };
+ var ReactDOM = {
+ createPortal: createPortal,
+ findDOMNode: function(componentOrElement) {
+ var owner = ReactCurrentOwner.current;
+ if (null !== owner) {
+ var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
+ warning(warnedAboutRefsInRender, "%s is accessing findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", getComponentName(owner) || "A component"),
+ owner.stateNode._warnedAboutRefsInRender = !0;
+ }
+ if (null == componentOrElement) return null;
+ if (componentOrElement.nodeType === ELEMENT_NODE) return componentOrElement;
+ var inst = get(componentOrElement);
+ if (inst) return DOMRenderer.findHostInstance(inst);
+ "function" == typeof componentOrElement.render ? invariant(!1, "Unable to find node on an unmounted component.") : invariant(!1, "Element appears to be neither ReactComponent nor DOMNode. Keys: %s", Object.keys(componentOrElement));
+ },
+ hydrate: function(element, container, callback) {
+ return renderSubtreeIntoContainer(null, element, container, !0, callback);
+ },
+ render: function(element, container, callback) {
+ return renderSubtreeIntoContainer(null, element, container, !1, callback);
+ },
+ unstable_renderSubtreeIntoContainer: function(parentComponent, element, containerNode, callback) {
+ return null != parentComponent && has(parentComponent) || invariant(!1, "parentComponent must be a valid React Component"),
+ renderSubtreeIntoContainer(parentComponent, element, containerNode, !1, callback);
+ },
+ unmountComponentAtNode: function(container) {
+ if (isValidContainer(container) || invariant(!1, "unmountComponentAtNode(...): Target container is not a DOM element."),
+ container._reactRootContainer) {
+ var rootEl = getReactRootElementInContainer(container), renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
+ return warning(!renderedByDifferentReact, "unmountComponentAtNode(): The node you're attempting to unmount was rendered by another copy of React."),
+ DOMRenderer.unbatchedUpdates(function() {
+ renderSubtreeIntoContainer(null, null, container, !1, function() {
+ container._reactRootContainer = null;
+ });
+ }), !0;
+ }
+ var _rootEl = getReactRootElementInContainer(container), hasNonRootReactChild = !(!_rootEl || !getInstanceFromNode$1(_rootEl)), isContainerReactRoot = 1 === container.nodeType && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
+ return warning(!hasNonRootReactChild, "unmountComponentAtNode(): The node you're attempting to unmount was rendered by React and is not a top-level container. %s", isContainerReactRoot ? "You may have accidentally passed in a React root node instead of its container." : "Instead, have the parent component update its state and rerender in order to remove this component."),
+ !1;
+ },
+ unstable_createPortal: createPortal,
+ unstable_batchedUpdates: batchedUpdates,
+ unstable_deferredUpdates: DOMRenderer.deferredUpdates,
+ flushSync: DOMRenderer.flushSync,
+ __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
+ EventPluginHub: EventPluginHub,
+ EventPluginRegistry: EventPluginRegistry,
+ EventPropagators: EventPropagators,
+ ReactControlledComponent: ReactControlledComponent,
+ ReactDOMComponentTree: ReactDOMComponentTree,
+ ReactDOMEventListener: ReactDOMEventListener
+ }
+ };
+ if (!DOMRenderer.injectIntoDevTools({
+ findFiberByHostInstance: getClosestInstanceFromNode,
+ bundleType: 1,
+ version: "16.2.0",
+ rendererPackageName: "react-dom"
+ }) && ExecutionEnvironment.canUseDOM && window.top === window.self && (navigator.userAgent.indexOf("Chrome") > -1 && -1 === navigator.userAgent.indexOf("Edge") || navigator.userAgent.indexOf("Firefox") > -1)) {
+ var protocol = window.location.protocol;
+ /^(https?|file):$/.test(protocol) && console.info("%cDownload the React DevTools for a better development experience: https://fb.me/react-devtools" + ("file:" === protocol ? "\nYou might need to use a local HTTP server (instead of file://): https://fb.me/react-devtools-faq" : ""), "font-weight:bold");
+ }
+ var ReactDOM$2 = Object.freeze({
+ default: ReactDOM
+ }), ReactDOM$3 = ReactDOM$2 && ReactDOM || ReactDOM$2, reactDom = ReactDOM$3.default ? ReactDOM$3.default : ReactDOM$3;
+ module.exports = reactDom;
+ }();
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function hyphenateStyleName(string) {
+ return hyphenate(string).replace(msPattern, "-ms-");
+ }
+ var hyphenate = __webpack_require__(339), msPattern = /^ms-/;
+ module.exports = hyphenateStyleName;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function hyphenate(string) {
+ return string.replace(_uppercasePattern, "-$1").toLowerCase();
+ }
+ var _uppercasePattern = /([A-Z])/g;
+ module.exports = hyphenate;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function camelizeStyleName(string) {
+ return camelize(string.replace(msPattern, "ms-"));
+ }
+ var camelize = __webpack_require__(341), msPattern = /^-ms-/;
+ module.exports = camelizeStyleName;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function camelize(string) {
+ return string.replace(_hyphenPattern, function(_, character) {
+ return character.toUpperCase();
+ });
+ }
+ var _hyphenPattern = /-(.)/g;
+ module.exports = camelize;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _brcast = __webpack_require__(376), _brcast2 = _interopRequireDefault(_brcast), _themeListener = __webpack_require__(150), _themeListener2 = _interopRequireDefault(_themeListener), _exactProp = __webpack_require__(377), _exactProp2 = _interopRequireDefault(_exactProp), MuiThemeProvider = function(_React$Component) {
+ function MuiThemeProvider(props, context) {
+ (0, _classCallCheck3.default)(this, MuiThemeProvider);
+ var _this = (0, _possibleConstructorReturn3.default)(this, (MuiThemeProvider.__proto__ || (0,
+ _getPrototypeOf2.default)(MuiThemeProvider)).call(this, props, context));
+ return _this.broadcast = (0, _brcast2.default)(), _this.unsubscribeId = null, _this.outerTheme = null,
+ _this.outerTheme = _themeListener2.default.initial(context), _this.broadcast.setState(_this.mergeOuterLocalTheme(_this.props.theme)),
+ _this;
+ }
+ return (0, _inherits3.default)(MuiThemeProvider, _React$Component), (0, _createClass3.default)(MuiThemeProvider, [ {
+ key: "getChildContext",
+ value: function() {
+ var _ref;
+ return _ref = {}, (0, _defineProperty3.default)(_ref, _themeListener.CHANNEL, this.broadcast),
+ (0, _defineProperty3.default)(_ref, "muiThemeProviderOptions", {
+ sheetsManager: this.props.sheetsManager,
+ disableStylesGeneration: this.props.disableStylesGeneration
+ }), _ref;
+ }
+ }, {
+ key: "componentDidMount",
+ value: function() {
+ var _this2 = this;
+ this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(outerTheme) {
+ _this2.outerTheme = outerTheme, _this2.broadcast.setState(_this2.mergeOuterLocalTheme(_this2.props.theme));
+ });
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ this.props.theme !== nextProps.theme && this.broadcast.setState(this.mergeOuterLocalTheme(nextProps.theme));
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId);
+ }
+ }, {
+ key: "mergeOuterLocalTheme",
+ value: function(localTheme) {
+ return "function" == typeof localTheme ? ("production" !== process.env.NODE_ENV && (0,
+ _warning2.default)(this.outerTheme, [ "Material-UI: you are providing a theme function property to the MuiThemeProvider component:", "<MuiThemeProvider theme={outerTheme => outerTheme} />", "", "However, no outer theme is present.", "Make sure a theme is already injected higher in the React tree or provide a theme object." ].join("\n")),
+ localTheme(this.outerTheme)) : this.outerTheme ? (0, _extends3.default)({}, this.outerTheme, localTheme) : localTheme;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return this.props.children;
+ }
+ } ]), MuiThemeProvider;
+ }(_react2.default.Component);
+ MuiThemeProvider.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node.isRequired,
+ disableStylesGeneration: _propTypes2.default.bool,
+ sheetsManager: _propTypes2.default.object,
+ theme: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.func ]).isRequired
+ } : {}, MuiThemeProvider.propTypes = "production" !== process.env.NODE_ENV ? (0,
+ _exactProp2.default)(MuiThemeProvider.propTypes, "MuiThemeProvider") : {}, MuiThemeProvider.defaultProps = {
+ disableStylesGeneration: !1,
+ sheetsManager: null
+ }, MuiThemeProvider.childContextTypes = (0, _extends3.default)({}, _themeListener2.default.contextTypes, {
+ muiThemeProviderOptions: _propTypes2.default.object
+ }), MuiThemeProvider.contextTypes = _themeListener2.default.contextTypes, exports.default = MuiThemeProvider;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(344), module.exports = __webpack_require__(17).Object.assign;
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.S + $export.F, "Object", {
+ assign: __webpack_require__(345)
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var getKeys = __webpack_require__(72), gOPS = __webpack_require__(142), pIE = __webpack_require__(99), toObject = __webpack_require__(59), IObject = __webpack_require__(135), $assign = Object.assign;
+ module.exports = !$assign || __webpack_require__(49)(function() {
+ var A = {}, B = {}, S = Symbol(), K = "abcdefghijklmnopqrst";
+ return A[S] = 7, K.split("").forEach(function(k) {
+ B[k] = k;
+ }), 7 != $assign({}, A)[S] || Object.keys($assign({}, B)).join("") != K;
+ }) ? function(target, source) {
+ for (var T = toObject(target), aLen = arguments.length, index = 1, getSymbols = gOPS.f, isEnum = pIE.f; aLen > index; ) for (var key, S = IObject(arguments[index++]), keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S), length = keys.length, j = 0; length > j; ) isEnum.call(S, key = keys[j++]) && (T[key] = S[key]);
+ return T;
+ } : $assign;
+}, function(module, exports, __webpack_require__) {
+ var toIObject = __webpack_require__(58), toLength = __webpack_require__(97), toAbsoluteIndex = __webpack_require__(347);
+ module.exports = function(IS_INCLUDES) {
+ return function($this, el, fromIndex) {
+ var value, O = toIObject($this), length = toLength(O.length), index = toAbsoluteIndex(fromIndex, length);
+ if (IS_INCLUDES && el != el) {
+ for (;length > index; ) if ((value = O[index++]) != value) return !0;
+ } else for (;length > index; index++) if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
+ return !IS_INCLUDES && -1;
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var toInteger = __webpack_require__(138), max = Math.max, min = Math.min;
+ module.exports = function(index, length) {
+ return index = toInteger(index), index < 0 ? max(index + length, 0) : min(index, length);
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(349);
+ var $Object = __webpack_require__(17).Object;
+ module.exports = function(it, key, desc) {
+ return $Object.defineProperty(it, key, desc);
+ };
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.S + $export.F * !__webpack_require__(25), "Object", {
+ defineProperty: __webpack_require__(22).f
+ });
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(351), module.exports = __webpack_require__(17).Object.getPrototypeOf;
+}, function(module, exports, __webpack_require__) {
+ var toObject = __webpack_require__(59), $getPrototypeOf = __webpack_require__(210);
+ __webpack_require__(211)("getPrototypeOf", function() {
+ return function(it) {
+ return $getPrototypeOf(toObject(it));
+ };
+ });
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(353),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(144), __webpack_require__(213), module.exports = __webpack_require__(147).f("iterator");
+}, function(module, exports, __webpack_require__) {
+ var toInteger = __webpack_require__(138), defined = __webpack_require__(137);
+ module.exports = function(TO_STRING) {
+ return function(that, pos) {
+ var a, b, s = String(defined(that)), i = toInteger(pos), l = s.length;
+ return i < 0 || i >= l ? TO_STRING ? "" : void 0 : (a = s.charCodeAt(i), a < 55296 || a > 56319 || i + 1 === l || (b = s.charCodeAt(i + 1)) < 56320 || b > 57343 ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : b - 56320 + (a - 55296 << 10) + 65536);
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var create = __webpack_require__(101), descriptor = __webpack_require__(71), setToStringTag = __webpack_require__(102), IteratorPrototype = {};
+ __webpack_require__(40)(IteratorPrototype, __webpack_require__(21)("iterator"), function() {
+ return this;
+ }), module.exports = function(Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, {
+ next: descriptor(1, next)
+ }), setToStringTag(Constructor, NAME + " Iterator");
+ };
+}, function(module, exports, __webpack_require__) {
+ var dP = __webpack_require__(22), anObject = __webpack_require__(48), getKeys = __webpack_require__(72);
+ module.exports = __webpack_require__(25) ? Object.defineProperties : function(O, Properties) {
+ anObject(O);
+ for (var P, keys = getKeys(Properties), length = keys.length, i = 0; length > i; ) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+ };
+}, function(module, exports, __webpack_require__) {
+ var document = __webpack_require__(24).document;
+ module.exports = document && document.documentElement;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var addToUnscopables = __webpack_require__(359), step = __webpack_require__(214), Iterators = __webpack_require__(73), toIObject = __webpack_require__(58);
+ module.exports = __webpack_require__(145)(Array, "Array", function(iterated, kind) {
+ this._t = toIObject(iterated), this._i = 0, this._k = kind;
+ }, function() {
+ var O = this._t, kind = this._k, index = this._i++;
+ return !O || index >= O.length ? (this._t = void 0, step(1)) : "keys" == kind ? step(0, index) : "values" == kind ? step(0, O[index]) : step(0, [ index, O[index] ]);
+ }, "values"), Iterators.Arguments = Iterators.Array, addToUnscopables("keys"), addToUnscopables("values"),
+ addToUnscopables("entries");
+}, function(module, exports) {
+ module.exports = function() {};
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(361),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(362), __webpack_require__(218), __webpack_require__(365), __webpack_require__(366),
+ module.exports = __webpack_require__(17).Symbol;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var global = __webpack_require__(24), has = __webpack_require__(50), DESCRIPTORS = __webpack_require__(25), $export = __webpack_require__(19), redefine = __webpack_require__(212), META = __webpack_require__(148).KEY, $fails = __webpack_require__(49), shared = __webpack_require__(140), setToStringTag = __webpack_require__(102), uid = __webpack_require__(98), wks = __webpack_require__(21), wksExt = __webpack_require__(147), wksDefine = __webpack_require__(149), enumKeys = __webpack_require__(363), isArray = __webpack_require__(215), anObject = __webpack_require__(48), isObject = __webpack_require__(35), toIObject = __webpack_require__(58), toPrimitive = __webpack_require__(134), createDesc = __webpack_require__(71), _create = __webpack_require__(101), gOPNExt = __webpack_require__(364), $GOPD = __webpack_require__(217), $DP = __webpack_require__(22), $keys = __webpack_require__(72), gOPD = $GOPD.f, dP = $DP.f, gOPN = gOPNExt.f, $Symbol = global.Symbol, $JSON = global.JSON, _stringify = $JSON && $JSON.stringify, HIDDEN = wks("_hidden"), TO_PRIMITIVE = wks("toPrimitive"), isEnum = {}.propertyIsEnumerable, SymbolRegistry = shared("symbol-registry"), AllSymbols = shared("symbols"), OPSymbols = shared("op-symbols"), ObjectProto = Object.prototype, USE_NATIVE = "function" == typeof $Symbol, QObject = global.QObject, setter = !QObject || !QObject.prototype || !QObject.prototype.findChild, setSymbolDesc = DESCRIPTORS && $fails(function() {
+ return 7 != _create(dP({}, "a", {
+ get: function() {
+ return dP(this, "a", {
+ value: 7
+ }).a;
+ }
+ })).a;
+ }) ? function(it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ protoDesc && delete ObjectProto[key], dP(it, key, D), protoDesc && it !== ObjectProto && dP(ObjectProto, key, protoDesc);
+ } : dP, wrap = function(tag) {
+ var sym = AllSymbols[tag] = _create($Symbol.prototype);
+ return sym._k = tag, sym;
+ }, isSymbol = USE_NATIVE && "symbol" == typeof $Symbol.iterator ? function(it) {
+ return "symbol" == typeof it;
+ } : function(it) {
+ return it instanceof $Symbol;
+ }, $defineProperty = function(it, key, D) {
+ return it === ObjectProto && $defineProperty(OPSymbols, key, D), anObject(it), key = toPrimitive(key, !0),
+ anObject(D), has(AllSymbols, key) ? (D.enumerable ? (has(it, HIDDEN) && it[HIDDEN][key] && (it[HIDDEN][key] = !1),
+ D = _create(D, {
+ enumerable: createDesc(0, !1)
+ })) : (has(it, HIDDEN) || dP(it, HIDDEN, createDesc(1, {})), it[HIDDEN][key] = !0),
+ setSymbolDesc(it, key, D)) : dP(it, key, D);
+ }, $defineProperties = function(it, P) {
+ anObject(it);
+ for (var key, keys = enumKeys(P = toIObject(P)), i = 0, l = keys.length; l > i; ) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+ }, $create = function(it, P) {
+ return void 0 === P ? _create(it) : $defineProperties(_create(it), P);
+ }, $propertyIsEnumerable = function(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, !0));
+ return !(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) && (!(E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]) || E);
+ }, $getOwnPropertyDescriptor = function(it, key) {
+ if (it = toIObject(it), key = toPrimitive(key, !0), it !== ObjectProto || !has(AllSymbols, key) || has(OPSymbols, key)) {
+ var D = gOPD(it, key);
+ return !D || !has(AllSymbols, key) || has(it, HIDDEN) && it[HIDDEN][key] || (D.enumerable = !0),
+ D;
+ }
+ }, $getOwnPropertyNames = function(it) {
+ for (var key, names = gOPN(toIObject(it)), result = [], i = 0; names.length > i; ) has(AllSymbols, key = names[i++]) || key == HIDDEN || key == META || result.push(key);
+ return result;
+ }, $getOwnPropertySymbols = function(it) {
+ for (var key, IS_OP = it === ObjectProto, names = gOPN(IS_OP ? OPSymbols : toIObject(it)), result = [], i = 0; names.length > i; ) !has(AllSymbols, key = names[i++]) || IS_OP && !has(ObjectProto, key) || result.push(AllSymbols[key]);
+ return result;
+ };
+ USE_NATIVE || ($Symbol = function() {
+ if (this instanceof $Symbol) throw TypeError("Symbol is not a constructor!");
+ var tag = uid(arguments.length > 0 ? arguments[0] : void 0), $set = function(value) {
+ this === ObjectProto && $set.call(OPSymbols, value), has(this, HIDDEN) && has(this[HIDDEN], tag) && (this[HIDDEN][tag] = !1),
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ return DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {
+ configurable: !0,
+ set: $set
+ }), wrap(tag);
+ }, redefine($Symbol.prototype, "toString", function() {
+ return this._k;
+ }), $GOPD.f = $getOwnPropertyDescriptor, $DP.f = $defineProperty, __webpack_require__(216).f = gOPNExt.f = $getOwnPropertyNames,
+ __webpack_require__(99).f = $propertyIsEnumerable, __webpack_require__(142).f = $getOwnPropertySymbols,
+ DESCRIPTORS && !__webpack_require__(146) && redefine(ObjectProto, "propertyIsEnumerable", $propertyIsEnumerable, !0),
+ wksExt.f = function(name) {
+ return wrap(wks(name));
+ }), $export($export.G + $export.W + $export.F * !USE_NATIVE, {
+ Symbol: $Symbol
+ });
+ for (var es6Symbols = "hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","), j = 0; es6Symbols.length > j; ) wks(es6Symbols[j++]);
+ for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k; ) wksDefine(wellKnownSymbols[k++]);
+ $export($export.S + $export.F * !USE_NATIVE, "Symbol", {
+ for: function(key) {
+ return has(SymbolRegistry, key += "") ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
+ },
+ keyFor: function(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + " is not a symbol!");
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function() {
+ setter = !0;
+ },
+ useSimple: function() {
+ setter = !1;
+ }
+ }), $export($export.S + $export.F * !USE_NATIVE, "Object", {
+ create: $create,
+ defineProperty: $defineProperty,
+ defineProperties: $defineProperties,
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ getOwnPropertyNames: $getOwnPropertyNames,
+ getOwnPropertySymbols: $getOwnPropertySymbols
+ }), $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function() {
+ var S = $Symbol();
+ return "[null]" != _stringify([ S ]) || "{}" != _stringify({
+ a: S
+ }) || "{}" != _stringify(Object(S));
+ })), "JSON", {
+ stringify: function(it) {
+ for (var replacer, $replacer, args = [ it ], i = 1; arguments.length > i; ) args.push(arguments[i++]);
+ if ($replacer = replacer = args[1], (isObject(replacer) || void 0 !== it) && !isSymbol(it)) return isArray(replacer) || (replacer = function(key, value) {
+ if ("function" == typeof $replacer && (value = $replacer.call(this, key, value)),
+ !isSymbol(value)) return value;
+ }), args[1] = replacer, _stringify.apply($JSON, args);
+ }
+ }), $Symbol.prototype[TO_PRIMITIVE] || __webpack_require__(40)($Symbol.prototype, TO_PRIMITIVE, $Symbol.prototype.valueOf),
+ setToStringTag($Symbol, "Symbol"), setToStringTag(Math, "Math", !0), setToStringTag(global.JSON, "JSON", !0);
+}, function(module, exports, __webpack_require__) {
+ var getKeys = __webpack_require__(72), gOPS = __webpack_require__(142), pIE = __webpack_require__(99);
+ module.exports = function(it) {
+ var result = getKeys(it), getSymbols = gOPS.f;
+ if (getSymbols) for (var key, symbols = getSymbols(it), isEnum = pIE.f, i = 0; symbols.length > i; ) isEnum.call(it, key = symbols[i++]) && result.push(key);
+ return result;
+ };
+}, function(module, exports, __webpack_require__) {
+ var toIObject = __webpack_require__(58), gOPN = __webpack_require__(216).f, toString = {}.toString, windowNames = "object" == typeof window && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [], getWindowNames = function(it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+ };
+ module.exports.f = function(it) {
+ return windowNames && "[object Window]" == toString.call(it) ? getWindowNames(it) : gOPN(toIObject(it));
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(149)("asyncIterator");
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(149)("observable");
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(368),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(369), module.exports = __webpack_require__(17).Object.setPrototypeOf;
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.S, "Object", {
+ setPrototypeOf: __webpack_require__(370).set
+ });
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(35), anObject = __webpack_require__(48), check = function(O, proto) {
+ if (anObject(O), !isObject(proto) && null !== proto) throw TypeError(proto + ": can't set as prototype!");
+ };
+ module.exports = {
+ set: Object.setPrototypeOf || ("__proto__" in {} ? function(test, buggy, set) {
+ try {
+ set = __webpack_require__(47)(Function.call, __webpack_require__(217).f(Object.prototype, "__proto__").set, 2),
+ set(test, []), buggy = !(test instanceof Array);
+ } catch (e) {
+ buggy = !0;
+ }
+ return function(O, proto) {
+ return check(O, proto), buggy ? O.__proto__ = proto : set(O, proto), O;
+ };
+ }({}, !1) : void 0),
+ check: check
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(372),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(373);
+ var $Object = __webpack_require__(17).Object;
+ module.exports = function(P, D) {
+ return $Object.create(P, D);
+ };
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.S, "Object", {
+ create: __webpack_require__(101)
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ var emptyFunction = __webpack_require__(39), invariant = __webpack_require__(70), warning = __webpack_require__(94), assign = __webpack_require__(69), ReactPropTypesSecret = __webpack_require__(133), checkPropTypes = __webpack_require__(132);
+ module.exports = function(isValidElement, throwOnDirectAccess) {
+ function getIteratorFn(maybeIterable) {
+ var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
+ if ("function" == typeof iteratorFn) return iteratorFn;
+ }
+ function is(x, y) {
+ return x === y ? 0 !== x || 1 / x == 1 / y : x !== x && y !== y;
+ }
+ function PropTypeError(message) {
+ this.message = message, this.stack = "";
+ }
+ function createChainableTypeChecker(validate) {
+ function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
+ if (componentName = componentName || ANONYMOUS, propFullName = propFullName || propName,
+ secret !== ReactPropTypesSecret) if (throwOnDirectAccess) invariant(!1, "Calling PropTypes validators directly is not supported by the ` + "`")) + (`prop-types` + ("`" + ` package. Use `))) + (("`" + (`PropTypes.checkPropTypes()` + "`")) + (` to call them. Read more at http://fb.me/use-check-prop-types"); else if ("production" !== process.env.NODE_ENV && "undefined" != typeof console) {
+ var cacheKey = componentName + ":" + propName;
+ !manualPropTypeCallCache[cacheKey] && manualPropTypeWarningCount < 3 && (warning(!1, "You are manually calling a React.PropTypes validation function for the ` + ("`" + `%s`)))))) + ((((("`" + (` prop on ` + "`")) + (`%s` + ("`" + `. This is deprecated and will throw in the standalone `))) + (("`" + (`prop-types` + "`")) + (` package. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.", propFullName, componentName),
+ manualPropTypeCallCache[cacheKey] = !0, manualPropTypeWarningCount++);
+ }
+ return null == props[propName] ? isRequired ? new PropTypeError(null === props[propName] ? "The " + location + " ` + ("`" + `" + propFullName + "`)))) + ((("`" + (` is marked as required in ` + "`")) + (`" + componentName + "` + ("`" + `, but its value is `))) + (("`" + (`null` + "`")) + (`." : "The " + location + " ` + ("`" + `" + propFullName + "`))))) + (((("`" + (` is marked as required in ` + "`")) + (`" + componentName + "` + ("`" + `, but its value is `))) + (("`" + (`undefined` + "`")) + (`.") : null : validate(props, propName, componentName, location, propFullName);
+ }
+ if ("production" !== process.env.NODE_ENV) var manualPropTypeCallCache = {}, manualPropTypeWarningCount = 0;
+ var chainedCheckType = checkType.bind(null, !1);
+ return chainedCheckType.isRequired = checkType.bind(null, !0), chainedCheckType;
+ }
+ function createPrimitiveTypeChecker(expectedType) {
+ function validate(props, propName, componentName, location, propFullName, secret) {
+ var propValue = props[propName];
+ if (getPropType(propValue) !== expectedType) return new PropTypeError("Invalid " + location + " ` + ("`" + `" + propFullName + "`)))) + ((("`" + (` of type ` + "`")) + (`" + getPreciseType(propValue) + "` + ("`" + ` supplied to `))) + (("`" + (`" + componentName + "` + "`")) + (`, expected ` + ("`" + `" + expectedType + "`)))))))) + ((((((("`" + `.");
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function createArrayOfTypeChecker(typeChecker) {
+ function validate(props, propName, componentName, location, propFullName) {
+ if ("function" != typeof typeChecker) return new PropTypeError("Property `) + ("`" + (`" + propFullName + "` + "`"))) + ((` of component ` + ("`" + `" + componentName + "`)) + ("`" + (` has invalid PropType notation inside arrayOf.");
+ var propValue = props[propName];
+ if (!Array.isArray(propValue)) {
+ return new PropTypeError("Invalid " + location + " ` + "`")))) + (((`" + propFullName + "` + ("`" + ` of type `)) + ("`" + (`" + getPropType(propValue) + "` + "`"))) + ((` supplied to ` + ("`" + `" + componentName + "`)) + ("`" + (`, expected an array.");
+ }
+ for (var i = 0; i < propValue.length; i++) {
+ var error = typeChecker(propValue, i, componentName, location, propFullName + "[" + i + "]", ReactPropTypesSecret);
+ if (error instanceof Error) return error;
+ }
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function createInstanceTypeChecker(expectedClass) {
+ function validate(props, propName, componentName, location, propFullName) {
+ if (!(props[propName] instanceof expectedClass)) {
+ var expectedClassName = expectedClass.name || ANONYMOUS;
+ return new PropTypeError("Invalid " + location + " ` + "`"))))) + ((((`" + propFullName + "` + ("`" + ` of type `)) + ("`" + (`" + getClassName(props[propName]) + "` + "`"))) + ((` supplied to ` + ("`" + `" + componentName + "`)) + ("`" + (`, expected instance of ` + "`")))) + (((`" + expectedClassName + "` + ("`" + `.");
+ }
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function createEnumTypeChecker(expectedValues) {
+ function validate(props, propName, componentName, location, propFullName) {
+ for (var propValue = props[propName], i = 0; i < expectedValues.length; i++) if (is(propValue, expectedValues[i])) return null;
+ return new PropTypeError("Invalid " + location + " `)) + ("`" + (`" + propFullName + "` + "`"))) + ((` of value ` + ("`" + `" + propValue + "`)) + ("`" + (` supplied to ` + "`")))))) + (((((`" + componentName + "` + ("`" + `, expected one of " + JSON.stringify(expectedValues) + ".");
+ }
+ return Array.isArray(expectedValues) ? createChainableTypeChecker(validate) : ("production" !== process.env.NODE_ENV && warning(!1, "Invalid argument supplied to oneOf, expected an instance of array."),
+ emptyFunction.thatReturnsNull);
+ }
+ function createObjectOfTypeChecker(typeChecker) {
+ function validate(props, propName, componentName, location, propFullName) {
+ if ("function" != typeof typeChecker) return new PropTypeError("Property `)) + ("`" + (`" + propFullName + "` + "`"))) + ((` of component ` + ("`" + `" + componentName + "`)) + ("`" + (` has invalid PropType notation inside objectOf.");
+ var propValue = props[propName], propType = getPropType(propValue);
+ if ("object" !== propType) return new PropTypeError("Invalid " + location + " ` + "`")))) + (((`" + propFullName + "` + ("`" + ` of type `)) + ("`" + (`" + propType + "` + "`"))) + ((` supplied to ` + ("`" + `" + componentName + "`)) + ("`" + (`, expected an object.");
+ for (var key in propValue) if (propValue.hasOwnProperty(key)) {
+ var error = typeChecker(propValue, key, componentName, location, propFullName + "." + key, ReactPropTypesSecret);
+ if (error instanceof Error) return error;
+ }
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function createUnionTypeChecker(arrayOfTypeCheckers) {
+ function validate(props, propName, componentName, location, propFullName) {
+ for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
+ if (null == (0, arrayOfTypeCheckers[i])(props, propName, componentName, location, propFullName, ReactPropTypesSecret)) return null;
+ }
+ return new PropTypeError("Invalid " + location + " ` + "`"))))) + ((((`" + propFullName + "` + ("`" + ` supplied to `)) + ("`" + (`" + componentName + "` + "`"))) + ((`.");
+ }
+ if (!Array.isArray(arrayOfTypeCheckers)) return "production" !== process.env.NODE_ENV && warning(!1, "Invalid argument supplied to oneOfType, expected an instance of array."),
+ emptyFunction.thatReturnsNull;
+ for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
+ var checker = arrayOfTypeCheckers[i];
+ if ("function" != typeof checker) return warning(!1, "Invalid argument supplied to oneOfType. Expected an array of check functions, but received %s at index %s.", getPostfixForTypeWarning(checker), i),
+ emptyFunction.thatReturnsNull;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function createShapeTypeChecker(shapeTypes) {
+ function validate(props, propName, componentName, location, propFullName) {
+ var propValue = props[propName], propType = getPropType(propValue);
+ if ("object" !== propType) return new PropTypeError("Invalid " + location + " ` + ("`" + `" + propFullName + "`)) + ("`" + (` of type ` + "`")))) + (((`" + propType + "` + ("`" + ` supplied to `)) + ("`" + (`" + componentName + "` + "`"))) + ((`, expected ` + ("`" + `object`)) + ("`" + (`.");
+ for (var key in shapeTypes) {
+ var checker = shapeTypes[key];
+ if (checker) {
+ var error = checker(propValue, key, componentName, location, propFullName + "." + key, ReactPropTypesSecret);
+ if (error) return error;
+ }
+ }
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function createStrictShapeTypeChecker(shapeTypes) {
+ function validate(props, propName, componentName, location, propFullName) {
+ var propValue = props[propName], propType = getPropType(propValue);
+ if ("object" !== propType) return new PropTypeError("Invalid " + location + " ` + "`"))))))) + ((((((`" + propFullName + "` + "`") + (` of type ` + ("`" + `" + propType + "`))) + (("`" + (` supplied to ` + "`")) + (`" + componentName + "` + ("`" + `, expected `)))) + ((("`" + (`object` + "`")) + (`.");
+ var allKeys = assign({}, props[propName], shapeTypes);
+ for (var key in allKeys) {
+ var checker = shapeTypes[key];
+ if (!checker) return new PropTypeError("Invalid " + location + " ` + ("`" + `" + propFullName + "`))) + (("`" + (` key ` + "`")) + (`" + key + "` + ("`" + ` supplied to `))))) + (((("`" + (`" + componentName + "` + "`")) + (`.\nBad object: " + JSON.stringify(props[propName], null, " ") + "\nValid keys: " + JSON.stringify(Object.keys(shapeTypes), null, " "));
+ var error = checker(propValue, key, componentName, location, propFullName + "." + key, ReactPropTypesSecret);
+ if (error) return error;
+ }
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }
+ function isNode(propValue) {
+ switch (typeof propValue) {
+ case "number":
+ case "string":
+ case "undefined":
+ return !0;
+
+ case "boolean":
+ return !propValue;
+
+ case "object":
+ if (Array.isArray(propValue)) return propValue.every(isNode);
+ if (null === propValue || isValidElement(propValue)) return !0;
+ var iteratorFn = getIteratorFn(propValue);
+ if (!iteratorFn) return !1;
+ var step, iterator = iteratorFn.call(propValue);
+ if (iteratorFn !== propValue.entries) {
+ for (;!(step = iterator.next()).done; ) if (!isNode(step.value)) return !1;
+ } else for (;!(step = iterator.next()).done; ) {
+ var entry = step.value;
+ if (entry && !isNode(entry[1])) return !1;
+ }
+ return !0;
+
+ default:
+ return !1;
+ }
+ }
+ function isSymbol(propType, propValue) {
+ return "symbol" === propType || ("Symbol" === propValue["@@toStringTag"] || "function" == typeof Symbol && propValue instanceof Symbol);
+ }
+ function getPropType(propValue) {
+ var propType = typeof propValue;
+ return Array.isArray(propValue) ? "array" : propValue instanceof RegExp ? "object" : isSymbol(propType, propValue) ? "symbol" : propType;
+ }
+ function getPreciseType(propValue) {
+ if (void 0 === propValue || null === propValue) return "" + propValue;
+ var propType = getPropType(propValue);
+ if ("object" === propType) {
+ if (propValue instanceof Date) return "date";
+ if (propValue instanceof RegExp) return "regexp";
+ }
+ return propType;
+ }
+ function getPostfixForTypeWarning(value) {
+ var type = getPreciseType(value);
+ switch (type) {
+ case "array":
+ case "object":
+ return "an " + type;
+
+ case "boolean":
+ case "date":
+ case "regexp":
+ return "a " + type;
+
+ default:
+ return type;
+ }
+ }
+ function getClassName(propValue) {
+ return propValue.constructor && propValue.constructor.name ? propValue.constructor.name : ANONYMOUS;
+ }
+ var ITERATOR_SYMBOL = "function" == typeof Symbol && Symbol.iterator, FAUX_ITERATOR_SYMBOL = "@@iterator", ANONYMOUS = "<<anonymous>>", ReactPropTypes = {
+ array: createPrimitiveTypeChecker("array"),
+ bool: createPrimitiveTypeChecker("boolean"),
+ func: createPrimitiveTypeChecker("function"),
+ number: createPrimitiveTypeChecker("number"),
+ object: createPrimitiveTypeChecker("object"),
+ string: createPrimitiveTypeChecker("string"),
+ symbol: createPrimitiveTypeChecker("symbol"),
+ any: function() {
+ return createChainableTypeChecker(emptyFunction.thatReturnsNull);
+ }(),
+ arrayOf: createArrayOfTypeChecker,
+ element: function() {
+ function validate(props, propName, componentName, location, propFullName) {
+ var propValue = props[propName];
+ if (!isValidElement(propValue)) {
+ return new PropTypeError("Invalid " + location + " ` + ("`" + `" + propFullName + "`))) + (("`" + (` of type ` + "`")) + (`" + getPropType(propValue) + "` + ("`" + ` supplied to `)))) + ((("`" + (`" + componentName + "` + "`")) + (`, expected a single ReactElement.");
+ }
+ return null;
+ }
+ return createChainableTypeChecker(validate);
+ }(),
+ instanceOf: createInstanceTypeChecker,
+ node: function() {
+ function validate(props, propName, componentName, location, propFullName) {
+ return isNode(props[propName]) ? null : new PropTypeError("Invalid " + location + " ` + ("`" + `" + propFullName + "`))) + (("`" + (` supplied to ` + "`")) + (`" + componentName + "` + ("`" + `, expected a ReactNode.");
+ }
+ return createChainableTypeChecker(validate);
+ }(),
+ objectOf: createObjectOfTypeChecker,
+ oneOf: createEnumTypeChecker,
+ oneOfType: createUnionTypeChecker,
+ shape: createShapeTypeChecker,
+ exact: createStrictShapeTypeChecker
+ };
+ return PropTypeError.prototype = Error.prototype, ReactPropTypes.checkPropTypes = checkPropTypes,
+ ReactPropTypes.PropTypes = ReactPropTypes, ReactPropTypes;
+ };
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var emptyFunction = __webpack_require__(39), invariant = __webpack_require__(70), ReactPropTypesSecret = __webpack_require__(133);
+ module.exports = function() {
+ function shim(props, propName, componentName, location, propFullName, secret) {
+ secret !== ReactPropTypesSecret && invariant(!1, "Calling PropTypes validators directly is not supported by the `)))))) + ((((("`" + (`prop-types` + "`")) + (` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");
+ }
+ function getShim() {
+ return shim;
+ }
+ shim.isRequired = shim;
+ var ReactPropTypes = {
+ array: shim,
+ bool: shim,
+ func: shim,
+ number: shim,
+ object: shim,
+ string: shim,
+ symbol: shim,
+ any: shim,
+ arrayOf: getShim,
+ element: shim,
+ instanceOf: getShim,
+ node: shim,
+ objectOf: getShim,
+ oneOf: getShim,
+ oneOfType: getShim,
+ shape: getShim,
+ exact: getShim
+ };
+ return ReactPropTypes.checkPropTypes = emptyFunction, ReactPropTypes.PropTypes = ReactPropTypes,
+ ReactPropTypes;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function createBroadcast(initialState) {
+ function getState() {
+ return _state;
+ }
+ function setState(state) {
+ _state = state;
+ for (var keys = Object.keys(listeners), i = 0, len = keys.length; i < len; i++) listeners[keys[i]] && listeners[keys[i]](state);
+ }
+ function subscribe(listener) {
+ if ("function" != typeof listener) throw new Error("listener must be a function.");
+ var currentId = id;
+ return listeners[currentId] = listener, id += 1, currentId;
+ }
+ function unsubscribe(id) {
+ listeners[id] = void 0;
+ }
+ var listeners = {}, id = 1, _state = initialState;
+ return {
+ getState: getState,
+ setState: setState,
+ subscribe: subscribe,
+ unsubscribe: unsubscribe
+ };
+ }
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: !0
+ }), __webpack_exports__.default = createBroadcast;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function exactProp(propTypes, componentNameInError) {
+ return (0, _extends4.default)({}, propTypes, (0, _defineProperty3.default)({}, specialProperty, function(props) {
+ var unknownProps = (0, _keys2.default)(props).filter(function(prop) {
+ return !propTypes.hasOwnProperty(prop);
+ });
+ return unknownProps.length > 0 ? new TypeError(componentNameInError + ": unknown props found: " + unknownProps.join(", ") + ". Please remove the unknown properties.") : null;
+ }));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.specialProperty = void 0;
+ var _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _extends3 = __webpack_require__(7), _extends4 = _interopRequireDefault(_extends3);
+ exports.default = exactProp;
+ var specialProperty = exports.specialProperty = "exact-prop: ​";
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(379), module.exports = __webpack_require__(17).Object.keys;
+}, function(module, exports, __webpack_require__) {
+ var toObject = __webpack_require__(59), $keys = __webpack_require__(72);
+ __webpack_require__(211)("keys", function() {
+ return function(it) {
+ return $keys(toObject(it));
+ };
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function round(value) {
+ return Math.round(1e5 * value) / 1e5;
+ }
+ function createTypography(palette, typography) {
+ function pxToRem(value) {
+ return value / htmlFontSize + "rem";
+ }
+ var _ref = "function" == typeof typography ? typography(palette) : typography, _ref$fontFamily = _ref.fontFamily, fontFamily = void 0 === _ref$fontFamily ? '"Roboto", "Helvetica", "Arial", sans-serif' : _ref$fontFamily, _ref$fontSize = _ref.fontSize, fontSize = void 0 === _ref$fontSize ? 14 : _ref$fontSize, _ref$fontWeightLight = _ref.fontWeightLight, fontWeightLight = void 0 === _ref$fontWeightLight ? 300 : _ref$fontWeightLight, _ref$fontWeightRegula = _ref.fontWeightRegular, fontWeightRegular = void 0 === _ref$fontWeightRegula ? 400 : _ref$fontWeightRegula, _ref$fontWeightMedium = _ref.fontWeightMedium, fontWeightMedium = void 0 === _ref$fontWeightMedium ? 500 : _ref$fontWeightMedium, _ref$htmlFontSize = _ref.htmlFontSize, htmlFontSize = void 0 === _ref$htmlFontSize ? 16 : _ref$htmlFontSize, other = (0,
+ _objectWithoutProperties3.default)(_ref, [ "fontFamily", "fontSize", "fontWeightLight", "fontWeightRegular", "fontWeightMedium", "htmlFontSize" ]);
+ return (0, _deepmerge2.default)({
+ pxToRem: pxToRem,
+ round: round,
+ fontFamily: fontFamily,
+ fontSize: fontSize,
+ fontWeightLight: fontWeightLight,
+ fontWeightRegular: fontWeightRegular,
+ fontWeightMedium: fontWeightMedium,
+ display4: {
+ fontSize: pxToRem(112),
+ fontWeight: fontWeightLight,
+ fontFamily: fontFamily,
+ letterSpacing: "-.04em",
+ lineHeight: round(128 / 112) + "em",
+ marginLeft: "-.06em",
+ color: palette.text.secondary
+ },
+ display3: {
+ fontSize: pxToRem(56),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ letterSpacing: "-.02em",
+ lineHeight: round(73 / 56) + "em",
+ marginLeft: "-.04em",
+ color: palette.text.secondary
+ },
+ display2: {
+ fontSize: pxToRem(45),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ lineHeight: round(48 / 45) + "em",
+ marginLeft: "-.04em",
+ color: palette.text.secondary
+ },
+ display1: {
+ fontSize: pxToRem(34),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ lineHeight: round(41 / 34) + "em",
+ marginLeft: "-.04em",
+ color: palette.text.secondary
+ },
+ headline: {
+ fontSize: pxToRem(24),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ lineHeight: round(32.5 / 24) + "em",
+ color: palette.text.primary
+ },
+ title: {
+ fontSize: pxToRem(21),
+ fontWeight: fontWeightMedium,
+ fontFamily: fontFamily,
+ lineHeight: round(24.5 / 21) + "em",
+ color: palette.text.primary
+ },
+ subheading: {
+ fontSize: pxToRem(16),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ lineHeight: round(1.5) + "em",
+ color: palette.text.primary
+ },
+ body2: {
+ fontSize: pxToRem(14),
+ fontWeight: fontWeightMedium,
+ fontFamily: fontFamily,
+ lineHeight: round(24 / 14) + "em",
+ color: palette.text.primary
+ },
+ body1: {
+ fontSize: pxToRem(14),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ lineHeight: round(20.5 / 14) + "em",
+ color: palette.text.primary
+ },
+ caption: {
+ fontSize: pxToRem(12),
+ fontWeight: fontWeightRegular,
+ fontFamily: fontFamily,
+ lineHeight: round(1.375) + "em",
+ color: palette.text.secondary
+ },
+ button: {
+ fontSize: pxToRem(fontSize),
+ textTransform: "uppercase",
+ fontWeight: fontWeightMedium,
+ fontFamily: fontFamily
+ }
+ }, other, {
+ clone: !1
+ });
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
+ exports.default = createTypography;
+ var _deepmerge = __webpack_require__(103), _deepmerge2 = _interopRequireDefault(_deepmerge);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function addLightOrDark(intent, direction, shade, tonalOffset) {
+ intent[direction] || (intent.hasOwnProperty(shade) ? intent[direction] = intent[shade] : "light" === direction ? intent.light = (0,
+ _colorManipulator.lighten)(intent.main, tonalOffset) : "dark" === direction && (intent.dark = (0,
+ _colorManipulator.darken)(intent.main, 1.5 * tonalOffset)));
+ }
+ function createPalette(palette) {
+ function getContrastText(background) {
+ var contrastText = (0, _colorManipulator.getContrastRatio)(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;
+ if ("production" !== process.env.NODE_ENV) {
+ var contrast = (0, _colorManipulator.getContrastRatio)(background, contrastText);
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(contrast >= 3, [ "Material-UI: the contrast ratio of " + contrast + ":1 for " + contrastText + " on " + background, "falls below the WACG recommended absolute minimum contrast ratio of 3:1.", "https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast" ].join("\n"));
+ }
+ return contrastText;
+ }
+ function augmentColor(color, mainShade, lightShade, darkShade) {
+ !color.main && color[mainShade] && (color.main = color[mainShade]), addLightOrDark(color, "light", lightShade, tonalOffset),
+ addLightOrDark(color, "dark", darkShade, tonalOffset), color.contrastText || (color.contrastText = getContrastText(color.main));
+ }
+ var _palette$primary = palette.primary, primary = void 0 === _palette$primary ? {
+ light: _indigo2.default[300],
+ main: _indigo2.default[500],
+ dark: _indigo2.default[700]
+ } : _palette$primary, _palette$secondary = palette.secondary, secondary = void 0 === _palette$secondary ? {
+ light: _pink2.default.A200,
+ main: _pink2.default.A400,
+ dark: _pink2.default.A700
+ } : _palette$secondary, _palette$error = palette.error, error = void 0 === _palette$error ? {
+ main: _red2.default[500]
+ } : _palette$error, _palette$type = palette.type, type = void 0 === _palette$type ? "light" : _palette$type, _palette$contrastThre = palette.contrastThreshold, contrastThreshold = void 0 === _palette$contrastThre ? 3 : _palette$contrastThre, _palette$tonalOffset = palette.tonalOffset, tonalOffset = void 0 === _palette$tonalOffset ? .2 : _palette$tonalOffset, other = (0,
+ _objectWithoutProperties3.default)(palette, [ "primary", "secondary", "error", "type", "contrastThreshold", "tonalOffset" ]);
+ augmentColor(primary, 500, 300, 700), augmentColor(secondary, "A400", "A200", "A700"),
+ augmentColor(error, 500, 300, 700);
+ var types = {
+ dark: dark,
+ light: light
+ };
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(types[type], "Material-UI: the palette type ` + ("`" + `" + type + "`))) + (("`" + (` is not supported."),
+ (0, _deepmerge2.default)((0, _extends3.default)({
+ common: _common2.default,
+ type: type,
+ primary: primary,
+ secondary: secondary,
+ error: error,
+ grey: _grey2.default,
+ contrastThreshold: contrastThreshold,
+ getContrastText: getContrastText,
+ tonalOffset: tonalOffset,
+ types: types
+ }, types[type]), other, {
+ clone: !1
+ });
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.dark = exports.light = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
+ exports.default = createPalette;
+ var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _deepmerge = __webpack_require__(103), _deepmerge2 = _interopRequireDefault(_deepmerge), _indigo = __webpack_require__(382), _indigo2 = _interopRequireDefault(_indigo), _pink = __webpack_require__(383), _pink2 = _interopRequireDefault(_pink), _grey = __webpack_require__(384), _grey2 = _interopRequireDefault(_grey), _red = __webpack_require__(385), _red2 = _interopRequireDefault(_red), _common = __webpack_require__(386), _common2 = _interopRequireDefault(_common), _colorManipulator = __webpack_require__(387), light = exports.light = {
+ text: {
+ primary: "rgba(0, 0, 0, 0.87)",
+ secondary: "rgba(0, 0, 0, 0.54)",
+ disabled: "rgba(0, 0, 0, 0.38)",
+ hint: "rgba(0, 0, 0, 0.38)"
+ },
+ divider: "rgba(0, 0, 0, 0.12)",
+ background: {
+ paper: _common2.default.white,
+ default: _grey2.default[50],
+ appBar: _grey2.default[100],
+ chip: _grey2.default[300],
+ avatar: _grey2.default[400]
+ },
+ action: {
+ active: "rgba(0, 0, 0, 0.54)",
+ hover: "rgba(0, 0, 0, 0.14)",
+ selected: "rgba(0, 0, 0, 0.08)",
+ disabled: "rgba(0, 0, 0, 0.26)",
+ disabledBackground: "rgba(0, 0, 0, 0.12)"
+ }
+ }, dark = exports.dark = {
+ text: {
+ primary: _common2.default.fullWhite,
+ secondary: "rgba(255, 255, 255, 0.7)",
+ disabled: "rgba(255, 255, 255, 0.5)",
+ hint: "rgba(255, 255, 255, 0.5)",
+ icon: "rgba(255, 255, 255, 0.5)"
+ },
+ divider: "rgba(255, 255, 255, 0.12)",
+ background: {
+ paper: _grey2.default[800],
+ default: "#303030",
+ appBar: _grey2.default[900],
+ chip: _grey2.default[700],
+ avatar: _grey2.default[600]
+ },
+ action: {
+ active: _common2.default.fullWhite,
+ hover: "rgba(255, 255, 255, 0.14)",
+ selected: "rgba(255, 255, 255, 0.8)",
+ disabled: "rgba(255, 255, 255, 0.3)",
+ disabledBackground: "rgba(255, 255, 255, 0.12)"
+ }
+ };
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var indigo = {
+ 50: "#e8eaf6",
+ 100: "#c5cae9",
+ 200: "#9fa8da",
+ 300: "#7986cb",
+ 400: "#5c6bc0",
+ 500: "#3f51b5",
+ 600: "#3949ab",
+ 700: "#303f9f",
+ 800: "#283593",
+ 900: "#1a237e",
+ A100: "#8c9eff",
+ A200: "#536dfe",
+ A400: "#3d5afe",
+ A700: "#304ffe"
+ };
+ exports.default = indigo;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var pink = {
+ 50: "#fce4ec",
+ 100: "#f8bbd0",
+ 200: "#f48fb1",
+ 300: "#f06292",
+ 400: "#ec407a",
+ 500: "#e91e63",
+ 600: "#d81b60",
+ 700: "#c2185b",
+ 800: "#ad1457",
+ 900: "#880e4f",
+ A100: "#ff80ab",
+ A200: "#ff4081",
+ A400: "#f50057",
+ A700: "#c51162"
+ };
+ exports.default = pink;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var grey = {
+ 50: "#fafafa",
+ 100: "#f5f5f5",
+ 200: "#eeeeee",
+ 300: "#e0e0e0",
+ 400: "#bdbdbd",
+ 500: "#9e9e9e",
+ 600: "#757575",
+ 700: "#616161",
+ 800: "#424242",
+ 900: "#212121",
+ A100: "#d5d5d5",
+ A200: "#aaaaaa",
+ A400: "#303030",
+ A700: "#616161"
+ };
+ exports.default = grey;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var red = {
+ 50: "#ffebee",
+ 100: "#ffcdd2",
+ 200: "#ef9a9a",
+ 300: "#e57373",
+ 400: "#ef5350",
+ 500: "#f44336",
+ 600: "#e53935",
+ 700: "#d32f2f",
+ 800: "#c62828",
+ 900: "#b71c1c",
+ A100: "#ff8a80",
+ A200: "#ff5252",
+ A400: "#ff1744",
+ A700: "#d50000"
+ };
+ exports.default = red;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var common = {
+ transparent: "transparent",
+ black: "#000",
+ fullBlack: "rgba(0, 0, 0, 1)",
+ white: "#fff",
+ fullWhite: "rgba(255, 255, 255, 1)"
+ };
+ exports.default = common;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function clamp(value) {
+ var min = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, max = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1;
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(value >= min && value <= max, "Material-UI: the value provided " + value + " is out of range [" + min + ", " + max + "]."),
+ value < min ? min : value > max ? max : value;
+ }
+ function convertHexToRGB(color) {
+ color = color.substr(1);
+ var re = new RegExp(".{1," + color.length / 3 + "}", "g"), colors = color.match(re);
+ return colors && 1 === colors[0].length && (colors = colors.map(function(n) {
+ return n + n;
+ })), colors ? "rgb(" + colors.map(function(n) {
+ return parseInt(n, 16);
+ }).join(", ") + ")" : "";
+ }
+ function decomposeColor(color) {
+ if ("#" === color.charAt(0)) return decomposeColor(convertHexToRGB(color));
+ var marker = color.indexOf("("), type = color.substring(0, marker), values = color.substring(marker + 1, color.length - 1).split(",");
+ return values = values.map(function(value) {
+ return parseFloat(value);
+ }), {
+ type: type,
+ values: values
+ };
+ }
+ function recomposeColor(color) {
+ var type = color.type, values = color.values;
+ return type.indexOf("rgb") > -1 && (values = values.map(function(n, i) {
+ return i < 3 ? parseInt(n, 10) : n;
+ })), type.indexOf("hsl") > -1 && (values[1] = values[1] + "%", values[2] = values[2] + "%"),
+ color.type + "(" + values.join(", ") + ")";
+ }
+ function getContrastRatio(foreground, background) {
+ var lumA = getLuminance(foreground), lumB = getLuminance(background);
+ return (Math.max(lumA, lumB) + .05) / (Math.min(lumA, lumB) + .05);
+ }
+ function getLuminance(color) {
+ var decomposedColor = decomposeColor(color);
+ if (decomposedColor.type.indexOf("rgb") > -1) {
+ var rgb = decomposedColor.values.map(function(val) {
+ return val /= 255, val <= .03928 ? val / 12.92 : Math.pow((val + .055) / 1.055, 2.4);
+ });
+ return Number((.2126 * rgb[0] + .7152 * rgb[1] + .0722 * rgb[2]).toFixed(3));
+ }
+ if (decomposedColor.type.indexOf("hsl") > -1) return decomposedColor.values[2] / 100;
+ throw new Error("Material-UI: unsupported ` + "`")) + (`" + color + "` + ("`" + ` color.");
+ }
+ function emphasize(color) {
+ var coefficient = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : .15;
+ return getLuminance(color) > .5 ? darken(color, coefficient) : lighten(color, coefficient);
+ }
+ function fade(color, value) {
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(color, "Material-UI: missing color argument in fade(" + color + ", " + value + ")."),
+ color ? (color = decomposeColor(color), value = clamp(value), "rgb" !== color.type && "hsl" !== color.type || (color.type += "a"),
+ color.values[3] = value, recomposeColor(color)) : color;
+ }
+ function darken(color, coefficient) {
+ if ("production" !== process.env.NODE_ENV && (0, _warning2.default)(color, "Material-UI: missing color argument in darken(" + color + ", " + coefficient + ")."),
+ !color) return color;
+ if (color = decomposeColor(color), coefficient = clamp(coefficient), color.type.indexOf("hsl") > -1) color.values[2] *= 1 - coefficient; else if (color.type.indexOf("rgb") > -1) for (var i = 0; i < 3; i += 1) color.values[i] *= 1 - coefficient;
+ return recomposeColor(color);
+ }
+ function lighten(color, coefficient) {
+ if ("production" !== process.env.NODE_ENV && (0, _warning2.default)(color, "Material-UI: missing color argument in lighten(" + color + ", " + coefficient + ")."),
+ !color) return color;
+ if (color = decomposeColor(color), coefficient = clamp(coefficient), color.type.indexOf("hsl") > -1) color.values[2] += (100 - color.values[2]) * coefficient; else if (color.type.indexOf("rgb") > -1) for (var i = 0; i < 3; i += 1) color.values[i] += (255 - color.values[i]) * coefficient;
+ return recomposeColor(color);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.convertHexToRGB = convertHexToRGB, exports.decomposeColor = decomposeColor,
+ exports.recomposeColor = recomposeColor, exports.getContrastRatio = getContrastRatio,
+ exports.getLuminance = getLuminance, exports.emphasize = emphasize, exports.fade = fade,
+ exports.darken = darken, exports.lighten = lighten;
+ var _warning = __webpack_require__(11), _warning2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_warning);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function createMixins(breakpoints, spacing, mixins) {
+ var _toolbar;
+ return (0, _extends4.default)({
+ gutters: function(styles) {
+ return (0, _extends4.default)({
+ paddingLeft: 2 * spacing.unit,
+ paddingRight: 2 * spacing.unit
+ }, styles, (0, _defineProperty3.default)({}, breakpoints.up("sm"), (0, _extends4.default)({
+ paddingLeft: 3 * spacing.unit,
+ paddingRight: 3 * spacing.unit
+ }, styles[breakpoints.up("sm")])));
+ },
+ toolbar: (_toolbar = {
+ minHeight: 56
+ }, (0, _defineProperty3.default)(_toolbar, breakpoints.up("xs") + " and (orientation: landscape)", {
+ minHeight: 48
+ }), (0, _defineProperty3.default)(_toolbar, breakpoints.up("sm"), {
+ minHeight: 64
+ }), _toolbar)
+ }, mixins);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _extends3 = __webpack_require__(7), _extends4 = _interopRequireDefault(_extends3);
+ exports.default = createMixins;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function createShadow() {
+ return [ (arguments.length <= 0 ? void 0 : arguments[0]) + "px " + (arguments.length <= 1 ? void 0 : arguments[1]) + "px " + (arguments.length <= 2 ? void 0 : arguments[2]) + "px " + (arguments.length <= 3 ? void 0 : arguments[3]) + "px rgba(0, 0, 0, " + shadowKeyUmbraOpacity + ")", (arguments.length <= 4 ? void 0 : arguments[4]) + "px " + (arguments.length <= 5 ? void 0 : arguments[5]) + "px " + (arguments.length <= 6 ? void 0 : arguments[6]) + "px " + (arguments.length <= 7 ? void 0 : arguments[7]) + "px rgba(0, 0, 0, " + shadowKeyPenumbraOpacity + ")", (arguments.length <= 8 ? void 0 : arguments[8]) + "px " + (arguments.length <= 9 ? void 0 : arguments[9]) + "px " + (arguments.length <= 10 ? void 0 : arguments[10]) + "px " + (arguments.length <= 11 ? void 0 : arguments[11]) + "px rgba(0, 0, 0, " + shadowAmbientShadowOpacity + ")" ].join(",");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var shadowKeyUmbraOpacity = .2, shadowKeyPenumbraOpacity = .14, shadowAmbientShadowOpacity = .12, shadows = [ "none", createShadow(0, 1, 3, 0, 0, 1, 1, 0, 0, 2, 1, -1), createShadow(0, 1, 5, 0, 0, 2, 2, 0, 0, 3, 1, -2), createShadow(0, 1, 8, 0, 0, 3, 4, 0, 0, 3, 3, -2), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8) ];
+ exports.default = shadows;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.isNumber = exports.isString = exports.formatMs = exports.duration = exports.easing = void 0;
+ var _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _isNan = __webpack_require__(391), _isNan2 = _interopRequireDefault(_isNan), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), easing = exports.easing = {
+ easeInOut: "cubic-bezier(0.4, 0, 0.2, 1)",
+ easeOut: "cubic-bezier(0.0, 0, 0.2, 1)",
+ easeIn: "cubic-bezier(0.4, 0, 1, 1)",
+ sharp: "cubic-bezier(0.4, 0, 0.6, 1)"
+ }, duration = exports.duration = {
+ shortest: 150,
+ shorter: 200,
+ short: 250,
+ standard: 300,
+ complex: 375,
+ enteringScreen: 225,
+ leavingScreen: 195
+ }, formatMs = exports.formatMs = function(milliseconds) {
+ return Math.round(milliseconds) + "ms";
+ }, isString = exports.isString = function(value) {
+ return "string" == typeof value;
+ }, isNumber = exports.isNumber = function(value) {
+ return !(0, _isNan2.default)(parseFloat(value));
+ };
+ exports.default = {
+ easing: easing,
+ duration: duration,
+ create: function() {
+ var props = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [ "all" ], options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, _options$duration = options.duration, durationOption = void 0 === _options$duration ? duration.standard : _options$duration, _options$easing = options.easing, easingOption = void 0 === _options$easing ? easing.easeInOut : _options$easing, _options$delay = options.delay, delay = void 0 === _options$delay ? 0 : _options$delay, other = (0,
+ _objectWithoutProperties3.default)(options, [ "duration", "easing", "delay" ]);
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(isString(props) || Array.isArray(props), 'Material-UI: argument "props" must be a string or Array'),
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(isNumber(durationOption), 'Material-UI: argument "duration" must be a number but found ' + durationOption),
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(isString(easingOption), 'Material-UI: argument "easing" must be a string'),
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(isNumber(delay), 'Material-UI: argument "delay" must be a string'),
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(0 === (0, _keys2.default)(other).length, "Material-UI: unrecognized argument(s) [" + (0,
+ _keys2.default)(other).join(",") + "]"), (Array.isArray(props) ? props : [ props ]).map(function(animatedProp) {
+ return animatedProp + " " + formatMs(durationOption) + " " + easingOption + " " + formatMs(delay);
+ }).join(",");
+ },
+ getAutoHeightDuration: function(height) {
+ if (!height) return 0;
+ var constant = height / 36;
+ return Math.round(10 * (4 + 15 * Math.pow(constant, .25) + constant / 5));
+ }
+ };
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(392),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(393), module.exports = __webpack_require__(17).Number.isNaN;
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.S, "Number", {
+ isNaN: function(number) {
+ return number != number;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var zIndex = {
+ mobileStepper: 1e3,
+ appBar: 1100,
+ drawer: 1200,
+ modal: 1300,
+ snackbar: 1400,
+ tooltip: 1500
+ };
+ exports.default = zIndex;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = {
+ unit: 8
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Header = __webpack_require__(453), _Header2 = _interopRequireDefault(_Header), _Body = __webpack_require__(486), _Body2 = _interopRequireDefault(_Body), _common = __webpack_require__(61), deepUpdate = function deepUpdate(updater, update, prev) {
+ if (void 0 === update) return prev;
+ if ("function" == typeof updater) return updater(update, prev);
+ var updated = {};
+ return Object.keys(prev).forEach(function(key) {
+ updated[key] = deepUpdate(updater[key], update[key], prev[key]);
+ }), updated;
+ }, shouldUpdate = function shouldUpdate(updater, msg) {
+ var su = {};
+ return Object.keys(msg).forEach(function(key) {
+ su[key] = "function" == typeof updater[key] || shouldUpdate(updater[key], msg[key]);
+ }), su;
+ }, replacer = function(update) {
+ return update;
+ }, appender = function(limit) {
+ var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : replacer;
+ return function(update, prev) {
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(update.map(function(sample) {
+ return mapper(sample);
+ }))).slice(-limit);
+ };
+ }, defaultContent = {
+ general: {
+ version: null,
+ commit: null
+ },
+ home: {
+ activeMemory: [],
+ virtualMemory: [],
+ networkIngress: [],
+ networkEgress: [],
+ processCPU: [],
+ systemCPU: [],
+ diskRead: [],
+ diskWrite: []
+ },
+ chain: {},
+ txpool: {},
+ network: {},
+ system: {},
+ logs: {
+ log: []
+ }
+ }, updaters = {
+ general: {
+ version: replacer,
+ commit: replacer
+ },
+ home: {
+ activeMemory: appender(200),
+ virtualMemory: appender(200),
+ networkIngress: appender(200),
+ networkEgress: appender(200),
+ processCPU: appender(200),
+ systemCPU: appender(200),
+ diskRead: appender(200),
+ diskWrite: appender(200)
+ },
+ chain: null,
+ txpool: null,
+ network: null,
+ system: null,
+ logs: {
+ log: appender(200)
+ }
+ }, styles = {
+ dashboard: {
+ display: "flex",
+ flexFlow: "column",
+ width: "100%",
+ height: "100%",
+ zIndex: 1,
+ overflow: "hidden"
+ }
+ }, themeStyles = function(theme) {
+ return {
+ dashboard: {
+ background: theme.palette.background.default
+ }
+ };
+ }, Dashboard = function(_Component) {
+ function Dashboard(props) {
+ _classCallCheck(this, Dashboard);
+ var _this = _possibleConstructorReturn(this, (Dashboard.__proto__ || Object.getPrototypeOf(Dashboard)).call(this, props));
+ return _this.reconnect = function() {
+ var server = new WebSocket(("https:" === window.location.protocol ? "wss://" : "ws://") + window.location.host + "/api");
+ server.onopen = function() {
+ _this.setState({
+ content: defaultContent,
+ shouldUpdate: {}
+ });
+ }, server.onmessage = function(event) {
+ var msg = JSON.parse(event.data);
+ if (!msg) return void console.error("Incoming message is " + msg);
+ _this.update(msg);
+ }, server.onclose = function() {
+ setTimeout(_this.reconnect, 3e3);
+ };
+ }, _this.update = function(msg) {
+ _this.setState(function(prevState) {
+ return {
+ content: deepUpdate(updaters, msg, prevState.content),
+ shouldUpdate: shouldUpdate(updaters, msg)
+ };
+ });
+ }, _this.changeContent = function(newActive) {
+ _this.setState(function(prevState) {
+ return prevState.active !== newActive ? {
+ active: newActive
+ } : {};
+ });
+ }, _this.switchSideBar = function() {
+ _this.setState(function(prevState) {
+ return {
+ sideBar: !prevState.sideBar
+ };
+ });
+ }, _this.state = {
+ active: _common.MENU.get("home").id,
+ sideBar: !0,
+ content: defaultContent,
+ shouldUpdate: {}
+ }, _this;
+ }
+ return _inherits(Dashboard, _Component), _createClass(Dashboard, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.reconnect();
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return _react2.default.createElement("div", {
+ className: this.props.classes.dashboard,
+ style: styles.dashboard
+ }, _react2.default.createElement(_Header2.default, {
+ opened: this.state.sideBar,
+ switchSideBar: this.switchSideBar
+ }), _react2.default.createElement(_Body2.default, {
+ opened: this.state.sideBar,
+ changeContent: this.changeContent,
+ active: this.state.active,
+ content: this.state.content,
+ shouldUpdate: this.state.shouldUpdate
+ }));
+ }
+ } ]), Dashboard;
+ }(_react.Component);
+ exports.default = (0, _withStyles2.default)(themeStyles)(Dashboard);
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(398),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(218), __webpack_require__(144), __webpack_require__(213), __webpack_require__(399),
+ __webpack_require__(406), __webpack_require__(409), __webpack_require__(411), module.exports = __webpack_require__(17).Map;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var strong = __webpack_require__(400), validate = __webpack_require__(225);
+ module.exports = __webpack_require__(402)("Map", function(get) {
+ return function() {
+ return get(this, arguments.length > 0 ? arguments[0] : void 0);
+ };
+ }, {
+ get: function(key) {
+ var entry = strong.getEntry(validate(this, "Map"), key);
+ return entry && entry.v;
+ },
+ set: function(key, value) {
+ return strong.def(validate(this, "Map"), 0 === key ? 0 : key, value);
+ }
+ }, strong, !0);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var dP = __webpack_require__(22).f, create = __webpack_require__(101), redefineAll = __webpack_require__(219), ctx = __webpack_require__(47), anInstance = __webpack_require__(220), forOf = __webpack_require__(104), $iterDefine = __webpack_require__(145), step = __webpack_require__(214), setSpecies = __webpack_require__(401), DESCRIPTORS = __webpack_require__(25), fastKey = __webpack_require__(148).fastKey, validate = __webpack_require__(225), SIZE = DESCRIPTORS ? "_s" : "size", getEntry = function(that, key) {
+ var entry, index = fastKey(key);
+ if ("F" !== index) return that._i[index];
+ for (entry = that._f; entry; entry = entry.n) if (entry.k == key) return entry;
+ };
+ module.exports = {
+ getConstructor: function(wrapper, NAME, IS_MAP, ADDER) {
+ var C = wrapper(function(that, iterable) {
+ anInstance(that, C, NAME, "_i"), that._t = NAME, that._i = create(null), that._f = void 0,
+ that._l = void 0, that[SIZE] = 0, void 0 != iterable && forOf(iterable, IS_MAP, that[ADDER], that);
+ });
+ return redefineAll(C.prototype, {
+ clear: function() {
+ for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) entry.r = !0,
+ entry.p && (entry.p = entry.p.n = void 0), delete data[entry.i];
+ that._f = that._l = void 0, that[SIZE] = 0;
+ },
+ delete: function(key) {
+ var that = validate(this, NAME), entry = getEntry(that, key);
+ if (entry) {
+ var next = entry.n, prev = entry.p;
+ delete that._i[entry.i], entry.r = !0, prev && (prev.n = next), next && (next.p = prev),
+ that._f == entry && (that._f = next), that._l == entry && (that._l = prev), that[SIZE]--;
+ }
+ return !!entry;
+ },
+ forEach: function(callbackfn) {
+ validate(this, NAME);
+ for (var entry, f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : void 0, 3); entry = entry ? entry.n : this._f; ) for (f(entry.v, entry.k, this); entry && entry.r; ) entry = entry.p;
+ },
+ has: function(key) {
+ return !!getEntry(validate(this, NAME), key);
+ }
+ }), DESCRIPTORS && dP(C.prototype, "size", {
+ get: function() {
+ return validate(this, NAME)[SIZE];
+ }
+ }), C;
+ },
+ def: function(that, key, value) {
+ var prev, index, entry = getEntry(that, key);
+ return entry ? entry.v = value : (that._l = entry = {
+ i: index = fastKey(key, !0),
+ k: key,
+ v: value,
+ p: prev = that._l,
+ n: void 0,
+ r: !1
+ }, that._f || (that._f = entry), prev && (prev.n = entry), that[SIZE]++, "F" !== index && (that._i[index] = entry)),
+ that;
+ },
+ getEntry: getEntry,
+ setStrong: function(C, NAME, IS_MAP) {
+ $iterDefine(C, NAME, function(iterated, kind) {
+ this._t = validate(iterated, NAME), this._k = kind, this._l = void 0;
+ }, function() {
+ for (var that = this, kind = that._k, entry = that._l; entry && entry.r; ) entry = entry.p;
+ return that._t && (that._l = entry = entry ? entry.n : that._t._f) ? "keys" == kind ? step(0, entry.k) : "values" == kind ? step(0, entry.v) : step(0, [ entry.k, entry.v ]) : (that._t = void 0,
+ step(1));
+ }, IS_MAP ? "entries" : "values", !IS_MAP, !0), setSpecies(NAME);
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var global = __webpack_require__(24), core = __webpack_require__(17), dP = __webpack_require__(22), DESCRIPTORS = __webpack_require__(25), SPECIES = __webpack_require__(21)("species");
+ module.exports = function(KEY) {
+ var C = "function" == typeof core[KEY] ? core[KEY] : global[KEY];
+ DESCRIPTORS && C && !C[SPECIES] && dP.f(C, SPECIES, {
+ configurable: !0,
+ get: function() {
+ return this;
+ }
+ });
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var global = __webpack_require__(24), $export = __webpack_require__(19), meta = __webpack_require__(148), fails = __webpack_require__(49), hide = __webpack_require__(40), redefineAll = __webpack_require__(219), forOf = __webpack_require__(104), anInstance = __webpack_require__(220), isObject = __webpack_require__(35), setToStringTag = __webpack_require__(102), dP = __webpack_require__(22).f, each = __webpack_require__(403)(0), DESCRIPTORS = __webpack_require__(25);
+ module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
+ var Base = global[NAME], C = Base, ADDER = IS_MAP ? "set" : "add", proto = C && C.prototype, O = {};
+ return DESCRIPTORS && "function" == typeof C && (IS_WEAK || proto.forEach && !fails(function() {
+ new C().entries().next();
+ })) ? (C = wrapper(function(target, iterable) {
+ anInstance(target, C, NAME, "_c"), target._c = new Base(), void 0 != iterable && forOf(iterable, IS_MAP, target[ADDER], target);
+ }), each("add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON".split(","), function(KEY) {
+ var IS_ADDER = "add" == KEY || "set" == KEY;
+ KEY in proto && (!IS_WEAK || "clear" != KEY) && hide(C.prototype, KEY, function(a, b) {
+ if (anInstance(this, C, KEY), !IS_ADDER && IS_WEAK && !isObject(a)) return "get" == KEY && void 0;
+ var result = this._c[KEY](0 === a ? 0 : a, b);
+ return IS_ADDER ? this : result;
+ });
+ }), IS_WEAK || dP(C.prototype, "size", {
+ get: function() {
+ return this._c.size;
+ }
+ })) : (C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER), redefineAll(C.prototype, methods),
+ meta.NEED = !0), setToStringTag(C, NAME), O[NAME] = C, $export($export.G + $export.W + $export.F, O),
+ IS_WEAK || common.setStrong(C, NAME, IS_MAP), C;
+ };
+}, function(module, exports, __webpack_require__) {
+ var ctx = __webpack_require__(47), IObject = __webpack_require__(135), toObject = __webpack_require__(59), toLength = __webpack_require__(97), asc = __webpack_require__(404);
+ module.exports = function(TYPE, $create) {
+ var IS_MAP = 1 == TYPE, IS_FILTER = 2 == TYPE, IS_SOME = 3 == TYPE, IS_EVERY = 4 == TYPE, IS_FIND_INDEX = 6 == TYPE, NO_HOLES = 5 == TYPE || IS_FIND_INDEX, create = $create || asc;
+ return function($this, callbackfn, that) {
+ for (var val, res, O = toObject($this), self = IObject(O), f = ctx(callbackfn, that, 3), length = toLength(self.length), index = 0, result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : void 0; length > index; index++) if ((NO_HOLES || index in self) && (val = self[index],
+ res = f(val, index, O), TYPE)) if (IS_MAP) result[index] = res; else if (res) switch (TYPE) {
+ case 3:
+ return !0;
+
+ case 5:
+ return val;
+
+ case 6:
+ return index;
+
+ case 2:
+ result.push(val);
+ } else if (IS_EVERY) return !1;
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var speciesConstructor = __webpack_require__(405);
+ module.exports = function(original, length) {
+ return new (speciesConstructor(original))(length);
+ };
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(35), isArray = __webpack_require__(215), SPECIES = __webpack_require__(21)("species");
+ module.exports = function(original) {
+ var C;
+ return isArray(original) && (C = original.constructor, "function" != typeof C || C !== Array && !isArray(C.prototype) || (C = void 0),
+ isObject(C) && null === (C = C[SPECIES]) && (C = void 0)), void 0 === C ? Array : C;
+ };
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.P + $export.R, "Map", {
+ toJSON: __webpack_require__(407)("Map")
+ });
+}, function(module, exports, __webpack_require__) {
+ var classof = __webpack_require__(224), from = __webpack_require__(408);
+ module.exports = function(NAME) {
+ return function() {
+ if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
+ return from(this);
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var forOf = __webpack_require__(104);
+ module.exports = function(iter, ITERATOR) {
+ var result = [];
+ return forOf(iter, !1, result.push, result, ITERATOR), result;
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(410)("Map");
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var $export = __webpack_require__(19);
+ module.exports = function(COLLECTION) {
+ $export($export.S, COLLECTION, {
+ of: function() {
+ for (var length = arguments.length, A = new Array(length); length--; ) A[length] = arguments[length];
+ return new this(A);
+ }
+ });
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(412)("Map");
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var $export = __webpack_require__(19), aFunction = __webpack_require__(206), ctx = __webpack_require__(47), forOf = __webpack_require__(104);
+ module.exports = function(COLLECTION) {
+ $export($export.S, COLLECTION, {
+ from: function(source) {
+ var mapping, A, n, cb, mapFn = arguments[1];
+ return aFunction(this), mapping = void 0 !== mapFn, mapping && aFunction(mapFn),
+ void 0 == source ? new this() : (A = [], mapping ? (n = 0, cb = ctx(mapFn, arguments[2], 2),
+ forOf(source, !1, function(nextItem) {
+ A.push(cb(nextItem, n++));
+ })) : forOf(source, !1, A.push, A), new this(A));
+ }
+ });
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(414),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(415), module.exports = -9007199254740991;
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(19);
+ $export($export.S, "Number", {
+ MIN_SAFE_INTEGER: -9007199254740991
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _ns$jss$ns$sheetOptio, _propTypes = __webpack_require__(1), _ns = __webpack_require__(227), ns = function(obj) {
+ if (obj && obj.__esModule) return obj;
+ var newObj = {};
+ if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);
+ return newObj.default = obj, newObj;
+ }(_ns), _propTypes2 = __webpack_require__(417), _propTypes3 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_propTypes2);
+ exports.default = (_ns$jss$ns$sheetOptio = {}, _defineProperty(_ns$jss$ns$sheetOptio, ns.jss, _propTypes3.default.jss),
+ _defineProperty(_ns$jss$ns$sheetOptio, ns.sheetOptions, _propTypes.object), _defineProperty(_ns$jss$ns$sheetOptio, ns.sheetsRegistry, _propTypes3.default.registry),
+ _defineProperty(_ns$jss$ns$sheetOptio, ns.managers, _propTypes.object), _ns$jss$ns$sheetOptio);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _propTypes = __webpack_require__(1);
+ exports.default = {
+ jss: (0, _propTypes.shape)({
+ options: (0, _propTypes.shape)({
+ createGenerateClassName: _propTypes.func.isRequired
+ }).isRequired,
+ createStyleSheet: _propTypes.func.isRequired,
+ removeStyleSheet: _propTypes.func.isRequired
+ }),
+ registry: (0, _propTypes.shape)({
+ add: _propTypes.func.isRequired,
+ toString: _propTypes.func.isRequired
+ })
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ exports.default = function(styles) {
+ function extract(styles) {
+ var to = null;
+ for (var key in styles) {
+ var value = styles[key], type = void 0 === value ? "undefined" : _typeof(value);
+ if ("function" === type) to || (to = {}), to[key] = value; else if ("object" === type && null !== value && !Array.isArray(value)) {
+ var extracted = extract(value);
+ extracted && (to || (to = {}), to[key] = extracted);
+ }
+ }
+ return to;
+ }
+ return extract(styles);
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _warning = __webpack_require__(11), _warning2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_warning), SheetsManager = function() {
+ function SheetsManager() {
+ _classCallCheck(this, SheetsManager), this.sheets = [], this.refs = [], this.keys = [];
+ }
+ return _createClass(SheetsManager, [ {
+ key: "get",
+ value: function(key) {
+ var index = this.keys.indexOf(key);
+ return this.sheets[index];
+ }
+ }, {
+ key: "add",
+ value: function(key, sheet) {
+ var sheets = this.sheets, refs = this.refs, keys = this.keys, index = sheets.indexOf(sheet);
+ return -1 !== index ? index : (sheets.push(sheet), refs.push(0), keys.push(key),
+ sheets.length - 1);
+ }
+ }, {
+ key: "manage",
+ value: function(key) {
+ var index = this.keys.indexOf(key), sheet = this.sheets[index];
+ return 0 === this.refs[index] && sheet.attach(), this.refs[index]++, this.keys[index] || this.keys.splice(index, 0, key),
+ sheet;
+ }
+ }, {
+ key: "unmanage",
+ value: function(key) {
+ var index = this.keys.indexOf(key);
+ if (-1 === index) return void (0, _warning2.default)(!1, "SheetsManager: can't find sheet to unmanage");
+ this.refs[index] > 0 && 0 === --this.refs[index] && this.sheets[index].detach();
+ }
+ }, {
+ key: "size",
+ get: function() {
+ return this.keys.length;
+ }
+ } ]), SheetsManager;
+ }();
+ exports.default = SheetsManager;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function cloneStyle(style) {
+ if (null == style) return style;
+ var typeOfStyle = void 0 === style ? "undefined" : _typeof(style);
+ if ("string" === typeOfStyle || "number" === typeOfStyle || "function" === typeOfStyle) return style;
+ if (isArray(style)) return style.map(cloneStyle);
+ if ((0, _isObservable2.default)(style)) return style;
+ var newStyle = {};
+ for (var name in style) {
+ var value = style[name];
+ "object" !== (void 0 === value ? "undefined" : _typeof(value)) ? newStyle[name] = value : newStyle[name] = cloneStyle(value);
+ }
+ return newStyle;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ exports.default = cloneStyle;
+ var _isObservable = __webpack_require__(230), _isObservable2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_isObservable), isArray = Array.isArray;
+}, function(module, exports, __webpack_require__) {
+ module.exports = __webpack_require__(422);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(global, module) {
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var root, _ponyfill = __webpack_require__(423), _ponyfill2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_ponyfill);
+ root = "undefined" != typeof self ? self : "undefined" != typeof window ? window : void 0 !== global ? global : module;
+ var result = (0, _ponyfill2.default)(root);
+ exports.default = result;
+ }).call(exports, __webpack_require__(51), __webpack_require__(154)(module));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function symbolObservablePonyfill(root) {
+ var result, _Symbol = root.Symbol;
+ return "function" == typeof _Symbol ? _Symbol.observable ? result = _Symbol.observable : (result = _Symbol("observable"),
+ _Symbol.observable = result) : result = "@@observable", result;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = symbolObservablePonyfill;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(global, process) {
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var CSS = global.CSS, env = process.env.NODE_ENV, escapeRegex = /([[\].#*$><+~=|^:(),"'`)))) + ((("`" + (`])/g;
+ exports.default = function(str) {
+ return "production" === env ? str : CSS && CSS.escape ? CSS.escape(str) : str.replace(escapeRegex, "\\$1");
+ };
+ }).call(exports, __webpack_require__(51), __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(global) {
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var ns = "2f1acc6c3a606b082e5eef5e54414ffb";
+ null == global[ns] && (global[ns] = 0), exports.default = global[ns]++;
+ }).call(exports, __webpack_require__(51));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ }, _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _isInBrowser = __webpack_require__(107), _isInBrowser2 = _interopRequireDefault(_isInBrowser), _StyleSheet = __webpack_require__(233), _StyleSheet2 = _interopRequireDefault(_StyleSheet), _PluginsRegistry = __webpack_require__(427), _PluginsRegistry2 = _interopRequireDefault(_PluginsRegistry), _rules = __webpack_require__(428), _rules2 = _interopRequireDefault(_rules), _observables = __webpack_require__(434), _observables2 = _interopRequireDefault(_observables), _functions = __webpack_require__(435), _functions2 = _interopRequireDefault(_functions), _sheets = __webpack_require__(155), _sheets2 = _interopRequireDefault(_sheets), _StyleRule = __webpack_require__(60), _StyleRule2 = _interopRequireDefault(_StyleRule), _createGenerateClassName = __webpack_require__(232), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _createRule2 = __webpack_require__(106), _createRule3 = _interopRequireDefault(_createRule2), _DomRenderer = __webpack_require__(437), _DomRenderer2 = _interopRequireDefault(_DomRenderer), _VirtualRenderer = __webpack_require__(438), _VirtualRenderer2 = _interopRequireDefault(_VirtualRenderer), defaultPlugins = _rules2.default.concat([ _observables2.default, _functions2.default ]), instanceCounter = 0, Jss = function() {
+ function Jss(options) {
+ _classCallCheck(this, Jss), this.id = instanceCounter++, this.version = "9.5.1",
+ this.plugins = new _PluginsRegistry2.default(), this.options = {
+ createGenerateClassName: _createGenerateClassName2.default,
+ Renderer: _isInBrowser2.default ? _DomRenderer2.default : _VirtualRenderer2.default,
+ plugins: []
+ }, this.generateClassName = (0, _createGenerateClassName2.default)(), this.use.apply(this, defaultPlugins),
+ this.setup(options);
+ }
+ return _createClass(Jss, [ {
+ key: "setup",
+ value: function() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
+ return options.createGenerateClassName && (this.options.createGenerateClassName = options.createGenerateClassName,
+ this.generateClassName = options.createGenerateClassName()), null != options.insertionPoint && (this.options.insertionPoint = options.insertionPoint),
+ (options.virtual || options.Renderer) && (this.options.Renderer = options.Renderer || (options.virtual ? _VirtualRenderer2.default : _DomRenderer2.default)),
+ options.plugins && this.use.apply(this, options.plugins), this;
+ }
+ }, {
+ key: "createStyleSheet",
+ value: function(styles) {
+ var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, index = options.index;
+ "number" != typeof index && (index = 0 === _sheets2.default.index ? 0 : _sheets2.default.index + 1);
+ var sheet = new _StyleSheet2.default(styles, _extends({}, options, {
+ jss: this,
+ generateClassName: options.generateClassName || this.generateClassName,
+ insertionPoint: this.options.insertionPoint,
+ Renderer: this.options.Renderer,
+ index: index
+ }));
+ return this.plugins.onProcessSheet(sheet), sheet;
+ }
+ }, {
+ key: "removeStyleSheet",
+ value: function(sheet) {
+ return sheet.detach(), _sheets2.default.remove(sheet), this;
+ }
+ }, {
+ key: "createRule",
+ value: function(name) {
+ var style = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, options = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};
+ "object" === (void 0 === name ? "undefined" : _typeof(name)) && (options = style,
+ style = name, name = void 0);
+ var ruleOptions = options;
+ ruleOptions.jss = this, ruleOptions.Renderer = this.options.Renderer, ruleOptions.generateClassName || (ruleOptions.generateClassName = this.generateClassName),
+ ruleOptions.classes || (ruleOptions.classes = {});
+ var rule = (0, _createRule3.default)(name, style, ruleOptions);
+ return !ruleOptions.selector && rule instanceof _StyleRule2.default && (rule.selector = "." + ruleOptions.generateClassName(rule)),
+ this.plugins.onProcessRule(rule), rule;
+ }
+ }, {
+ key: "use",
+ value: function() {
+ for (var _this = this, _len = arguments.length, plugins = Array(_len), _key = 0; _key < _len; _key++) plugins[_key] = arguments[_key];
+ return plugins.forEach(function(plugin) {
+ -1 === _this.options.plugins.indexOf(plugin) && (_this.options.plugins.push(plugin),
+ _this.plugins.use(plugin));
+ }), this;
+ }
+ } ]), Jss;
+ }();
+ exports.default = Jss;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _warning = __webpack_require__(11), _warning2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_warning), PluginsRegistry = function() {
+ function PluginsRegistry() {
+ _classCallCheck(this, PluginsRegistry), this.hooks = {
+ onCreateRule: [],
+ onProcessRule: [],
+ onProcessStyle: [],
+ onProcessSheet: [],
+ onChangeValue: [],
+ onUpdate: []
+ };
+ }
+ return _createClass(PluginsRegistry, [ {
+ key: "onCreateRule",
+ value: function(name, decl, options) {
+ for (var i = 0; i < this.hooks.onCreateRule.length; i++) {
+ var rule = this.hooks.onCreateRule[i](name, decl, options);
+ if (rule) return rule;
+ }
+ return null;
+ }
+ }, {
+ key: "onProcessRule",
+ value: function(rule) {
+ if (!rule.isProcessed) {
+ for (var sheet = rule.options.sheet, i = 0; i < this.hooks.onProcessRule.length; i++) this.hooks.onProcessRule[i](rule, sheet);
+ rule.style && this.onProcessStyle(rule.style, rule, sheet), rule.isProcessed = !0;
+ }
+ }
+ }, {
+ key: "onProcessStyle",
+ value: function(style, rule, sheet) {
+ for (var nextStyle = style, i = 0; i < this.hooks.onProcessStyle.length; i++) nextStyle = this.hooks.onProcessStyle[i](nextStyle, rule, sheet),
+ rule.style = nextStyle;
+ }
+ }, {
+ key: "onProcessSheet",
+ value: function(sheet) {
+ for (var i = 0; i < this.hooks.onProcessSheet.length; i++) this.hooks.onProcessSheet[i](sheet);
+ }
+ }, {
+ key: "onUpdate",
+ value: function(data, rule, sheet) {
+ for (var i = 0; i < this.hooks.onUpdate.length; i++) this.hooks.onUpdate[i](data, rule, sheet);
+ }
+ }, {
+ key: "onChangeValue",
+ value: function(value, prop, rule) {
+ for (var processedValue = value, i = 0; i < this.hooks.onChangeValue.length; i++) processedValue = this.hooks.onChangeValue[i](processedValue, prop, rule);
+ return processedValue;
+ }
+ }, {
+ key: "use",
+ value: function(plugin) {
+ for (var name in plugin) this.hooks[name] ? this.hooks[name].push(plugin[name]) : (0,
+ _warning2.default)(!1, '[JSS] Unknown hook "%s".', name);
+ }
+ } ]), PluginsRegistry;
+ }();
+ exports.default = PluginsRegistry;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _SimpleRule = __webpack_require__(429), _SimpleRule2 = _interopRequireDefault(_SimpleRule), _KeyframesRule = __webpack_require__(430), _KeyframesRule2 = _interopRequireDefault(_KeyframesRule), _ConditionalRule = __webpack_require__(431), _ConditionalRule2 = _interopRequireDefault(_ConditionalRule), _FontFaceRule = __webpack_require__(432), _FontFaceRule2 = _interopRequireDefault(_FontFaceRule), _ViewportRule = __webpack_require__(433), _ViewportRule2 = _interopRequireDefault(_ViewportRule), classes = {
+ "@charset": _SimpleRule2.default,
+ "@import": _SimpleRule2.default,
+ "@namespace": _SimpleRule2.default,
+ "@keyframes": _KeyframesRule2.default,
+ "@media": _ConditionalRule2.default,
+ "@supports": _ConditionalRule2.default,
+ "@font-face": _FontFaceRule2.default,
+ "@viewport": _ViewportRule2.default,
+ "@-ms-viewport": _ViewportRule2.default
+ };
+ exports.default = Object.keys(classes).map(function(key) {
+ var re = new RegExp("^" + key);
+ return {
+ onCreateRule: function(name, decl, options) {
+ return re.test(name) ? new classes[key](name, decl, options) : null;
+ }
+ };
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), SimpleRule = function() {
+ function SimpleRule(key, value, options) {
+ _classCallCheck(this, SimpleRule), this.type = "simple", this.isProcessed = !1,
+ this.key = key, this.value = value, this.options = options;
+ }
+ return _createClass(SimpleRule, [ {
+ key: "toString",
+ value: function(options) {
+ if (Array.isArray(this.value)) {
+ for (var str = "", index = 0; index < this.value.length; index++) str += this.key + " " + this.value[index] + ";",
+ this.value[index + 1] && (str += "\n");
+ return str;
+ }
+ return this.key + " " + this.value + ";";
+ }
+ } ]), SimpleRule;
+ }();
+ exports.default = SimpleRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _RuleList = __webpack_require__(76), _RuleList2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_RuleList), KeyframesRule = function() {
+ function KeyframesRule(key, frames, options) {
+ _classCallCheck(this, KeyframesRule), this.type = "keyframes", this.isProcessed = !1,
+ this.key = key, this.options = options, this.rules = new _RuleList2.default(_extends({}, options, {
+ parent: this
+ }));
+ for (var name in frames) this.rules.add(name, frames[name], _extends({}, this.options, {
+ parent: this,
+ selector: name
+ }));
+ this.rules.process();
+ }
+ return _createClass(KeyframesRule, [ {
+ key: "toString",
+ value: function() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {
+ indent: 1
+ }, inner = this.rules.toString(options);
+ return inner && (inner += "\n"), this.key + " {\n" + inner + "}";
+ }
+ } ]), KeyframesRule;
+ }();
+ exports.default = KeyframesRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _RuleList = __webpack_require__(76), _RuleList2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_RuleList), ConditionalRule = function() {
+ function ConditionalRule(key, styles, options) {
+ _classCallCheck(this, ConditionalRule), this.type = "conditional", this.isProcessed = !1,
+ this.key = key, this.options = options, this.rules = new _RuleList2.default(_extends({}, options, {
+ parent: this
+ }));
+ for (var name in styles) this.rules.add(name, styles[name]);
+ this.rules.process();
+ }
+ return _createClass(ConditionalRule, [ {
+ key: "getRule",
+ value: function(name) {
+ return this.rules.get(name);
+ }
+ }, {
+ key: "indexOf",
+ value: function(rule) {
+ return this.rules.indexOf(rule);
+ }
+ }, {
+ key: "addRule",
+ value: function(name, style, options) {
+ var rule = this.rules.add(name, style, options);
+ return this.options.jss.plugins.onProcessRule(rule), rule;
+ }
+ }, {
+ key: "toString",
+ value: function() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {
+ indent: 1
+ }, inner = this.rules.toString(options);
+ return inner ? this.key + " {\n" + inner + "\n}" : "";
+ }
+ } ]), ConditionalRule;
+ }();
+ exports.default = ConditionalRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _toCss = __webpack_require__(153), _toCss2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_toCss), FontFaceRule = function() {
+ function FontFaceRule(key, style, options) {
+ _classCallCheck(this, FontFaceRule), this.type = "font-face", this.isProcessed = !1,
+ this.key = key, this.style = style, this.options = options;
+ }
+ return _createClass(FontFaceRule, [ {
+ key: "toString",
+ value: function(options) {
+ if (Array.isArray(this.style)) {
+ for (var str = "", index = 0; index < this.style.length; index++) str += (0, _toCss2.default)(this.key, this.style[index]),
+ this.style[index + 1] && (str += "\n");
+ return str;
+ }
+ return (0, _toCss2.default)(this.key, this.style, options);
+ }
+ } ]), FontFaceRule;
+ }();
+ exports.default = FontFaceRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _toCss = __webpack_require__(153), _toCss2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_toCss), ViewportRule = function() {
+ function ViewportRule(key, style, options) {
+ _classCallCheck(this, ViewportRule), this.type = "viewport", this.isProcessed = !1,
+ this.key = key, this.style = style, this.options = options;
+ }
+ return _createClass(ViewportRule, [ {
+ key: "toString",
+ value: function(options) {
+ return (0, _toCss2.default)(this.key, this.style, options);
+ }
+ } ]), ViewportRule;
+ }();
+ exports.default = ViewportRule;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _StyleRule = __webpack_require__(60), _StyleRule2 = _interopRequireDefault(_StyleRule), _createRule = __webpack_require__(106), _createRule2 = _interopRequireDefault(_createRule), _isObservable = __webpack_require__(230), _isObservable2 = _interopRequireDefault(_isObservable);
+ exports.default = {
+ onCreateRule: function(name, decl, options) {
+ if (!(0, _isObservable2.default)(decl)) return null;
+ var style$ = decl, rule = (0, _createRule2.default)(name, {}, options);
+ return style$.subscribe(function(style) {
+ for (var prop in style) rule.prop(prop, style[prop]);
+ }), rule;
+ },
+ onProcessRule: function(rule) {
+ if (rule instanceof _StyleRule2.default) {
+ var styleRule = rule, style = styleRule.style;
+ for (var prop in style) {
+ (function(prop) {
+ var value = style[prop];
+ if (!(0, _isObservable2.default)(value)) return "continue";
+ delete style[prop], value.subscribe({
+ next: function(nextValue) {
+ styleRule.prop(prop, nextValue);
+ }
+ });
+ })(prop);
+ }
+ }
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _RuleList = __webpack_require__(76), _RuleList2 = _interopRequireDefault(_RuleList), _StyleRule = __webpack_require__(60), _StyleRule2 = _interopRequireDefault(_StyleRule), _kebabCase = __webpack_require__(436), _kebabCase2 = _interopRequireDefault(_kebabCase), _createRule = __webpack_require__(106), _createRule2 = _interopRequireDefault(_createRule), now = Date.now(), fnValuesNs = "fnValues" + now, fnStyleNs = "fnStyle" + ++now;
+ exports.default = {
+ onCreateRule: function(name, decl, options) {
+ if ("function" != typeof decl) return null;
+ var rule = (0, _createRule2.default)(name, {}, options);
+ return rule[fnStyleNs] = decl, rule;
+ },
+ onProcessStyle: function(style, rule) {
+ var fn = {};
+ for (var prop in style) {
+ var value = style[prop];
+ "function" == typeof value && (delete style[prop], fn[(0, _kebabCase2.default)(prop)] = value);
+ }
+ return rule = rule, rule[fnValuesNs] = fn, style;
+ },
+ onUpdate: function(data, rule) {
+ if (rule.rules instanceof _RuleList2.default) return void rule.rules.update(data);
+ if (rule instanceof _StyleRule2.default) {
+ if (rule = rule, rule[fnValuesNs]) for (var prop in rule[fnValuesNs]) rule.prop(prop, rule[fnValuesNs][prop](data));
+ rule = rule;
+ var fnStyle = rule[fnStyleNs];
+ if (fnStyle) {
+ var style = fnStyle(data);
+ for (var _prop in style) rule.prop(_prop, style[_prop]);
+ }
+ }
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var regExp = /([A-Z])/g, replace = function(str) {
+ return "-" + str.toLowerCase();
+ };
+ exports.default = function(str) {
+ return str.replace(regExp, replace);
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(global) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function getStyle(cssRule, prop) {
+ try {
+ return cssRule.style.getPropertyValue(prop);
+ } catch (err) {
+ return "";
+ }
+ }
+ function setStyle(cssRule, prop, value) {
+ try {
+ var cssValue = value;
+ if (Array.isArray(value) && (cssValue = (0, _toCssValue2.default)(value, !0), "!important" === value[value.length - 1])) return cssRule.style.setProperty(prop, cssValue, "important"),
+ !0;
+ cssRule.style.setProperty(prop, cssValue);
+ } catch (err) {
+ return !1;
+ }
+ return !0;
+ }
+ function setSelector(cssRule, selectorText) {
+ return cssRule.selectorText = selectorText, cssRule.selectorText === selectorText;
+ }
+ function findHigherSheet(registry, options) {
+ for (var i = 0; i < registry.length; i++) {
+ var sheet = registry[i];
+ if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) return sheet;
+ }
+ return null;
+ }
+ function findHighestSheet(registry, options) {
+ for (var i = registry.length - 1; i >= 0; i--) {
+ var sheet = registry[i];
+ if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) return sheet;
+ }
+ return null;
+ }
+ function findCommentNode(text) {
+ for (var head = getHead(), i = 0; i < head.childNodes.length; i++) {
+ var node = head.childNodes[i];
+ if (8 === node.nodeType && node.nodeValue.trim() === text) return node;
+ }
+ return null;
+ }
+ function findPrevNode(options) {
+ var registry = _sheets2.default.registry;
+ if (registry.length > 0) {
+ var sheet = findHigherSheet(registry, options);
+ if (sheet) return sheet.renderer.element;
+ if (sheet = findHighestSheet(registry, options)) return sheet.renderer.element.nextElementSibling;
+ }
+ var insertionPoint = options.insertionPoint;
+ if (insertionPoint && "string" == typeof insertionPoint) {
+ var comment = findCommentNode(insertionPoint);
+ if (comment) return comment.nextSibling;
+ (0, _warning2.default)("jss" === insertionPoint, '[JSS] Insertion point "%s" not found.', insertionPoint);
+ }
+ return null;
+ }
+ function insertStyle(style, options) {
+ var insertionPoint = options.insertionPoint, prevNode = findPrevNode(options);
+ if (prevNode) {
+ var parentNode = prevNode.parentNode;
+ return void (parentNode && parentNode.insertBefore(style, prevNode));
+ }
+ if (insertionPoint && "number" == typeof insertionPoint.nodeType) {
+ var insertionPointElement = insertionPoint, _parentNode = insertionPointElement.parentNode;
+ return void (_parentNode ? _parentNode.insertBefore(style, insertionPointElement.nextSibling) : (0,
+ _warning2.default)(!1, "[JSS] Insertion point is not in the DOM."));
+ }
+ getHead().insertBefore(style, prevNode);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _sheets = __webpack_require__(155), _sheets2 = _interopRequireDefault(_sheets), _StyleRule = __webpack_require__(60), _StyleRule2 = _interopRequireDefault(_StyleRule), _toCssValue = __webpack_require__(105), _toCssValue2 = _interopRequireDefault(_toCssValue), CSSRuleTypes = {
+ STYLE_RULE: 1,
+ KEYFRAMES_RULE: 7
+ }, getKey = function() {
+ var extractKey = function(cssText) {
+ var from = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0;
+ return cssText.substr(from, cssText.indexOf("{") - 1);
+ };
+ return function(cssRule) {
+ if (cssRule.type === CSSRuleTypes.STYLE_RULE) return cssRule.selectorText;
+ if (cssRule.type === CSSRuleTypes.KEYFRAMES_RULE) {
+ var name = cssRule.name;
+ if (name) return "@keyframes " + name;
+ var cssText = cssRule.cssText;
+ return "@" + extractKey(cssText, cssText.indexOf("keyframes"));
+ }
+ return extractKey(cssRule.cssText);
+ };
+ }(), getHead = function() {
+ var head = void 0;
+ return function() {
+ return head || (head = document.head || document.getElementsByTagName("head")[0]),
+ head;
+ };
+ }(), getUnescapedKeysMap = function() {
+ var style = void 0, isAttached = !1;
+ return function(rules) {
+ var map = {};
+ style || (style = document.createElement("style"));
+ for (var i = 0; i < rules.length; i++) {
+ var rule = rules[i];
+ if (rule instanceof _StyleRule2.default) {
+ var selector = rule.selector;
+ if (selector && -1 !== selector.indexOf("\\")) {
+ isAttached || (getHead().appendChild(style), isAttached = !0), style.textContent = selector + " {}";
+ var _style = style, sheet = _style.sheet;
+ if (sheet) {
+ var cssRules = sheet.cssRules;
+ cssRules && (map[cssRules[0].selectorText] = rule.key);
+ }
+ }
+ }
+ }
+ return isAttached && (getHead().removeChild(style), isAttached = !1), map;
+ };
+ }(), DomRenderer = function() {
+ function DomRenderer(sheet) {
+ _classCallCheck(this, DomRenderer), this.getStyle = getStyle, this.setStyle = setStyle,
+ this.setSelector = setSelector, this.getKey = getKey, this.getUnescapedKeysMap = getUnescapedKeysMap,
+ this.hasInsertedRules = !1, sheet && _sheets2.default.add(sheet), this.sheet = sheet;
+ var _ref = this.sheet ? this.sheet.options : {}, media = _ref.media, meta = _ref.meta, element = _ref.element;
+ this.element = element || document.createElement("style"), this.element.type = "text/css",
+ this.element.setAttribute("data-jss", ""), media && this.element.setAttribute("media", media),
+ meta && this.element.setAttribute("data-meta", meta);
+ var nonce = global.__webpack_nonce__;
+ nonce && this.element.setAttribute("nonce", nonce);
+ }
+ return _createClass(DomRenderer, [ {
+ key: "attach",
+ value: function() {
+ !this.element.parentNode && this.sheet && (this.hasInsertedRules && (this.deploy(),
+ this.hasInsertedRules = !1), insertStyle(this.element, this.sheet.options));
+ }
+ }, {
+ key: "detach",
+ value: function() {
+ this.element.parentNode.removeChild(this.element);
+ }
+ }, {
+ key: "deploy",
+ value: function() {
+ this.sheet && (this.element.textContent = "\n" + this.sheet.toString() + "\n");
+ }
+ }, {
+ key: "insertRule",
+ value: function(rule, index) {
+ var sheet = this.element.sheet, cssRules = sheet.cssRules, str = rule.toString();
+ if (index || (index = cssRules.length), !str) return !1;
+ try {
+ sheet.insertRule(str, index);
+ } catch (err) {
+ return (0, _warning2.default)(!1, "[JSS] Can not insert an unsupported rule \n\r%s", rule),
+ !1;
+ }
+ return this.hasInsertedRules = !0, cssRules[index];
+ }
+ }, {
+ key: "deleteRule",
+ value: function(cssRule) {
+ var sheet = this.element.sheet, index = this.indexOf(cssRule);
+ return -1 !== index && (sheet.deleteRule(index), !0);
+ }
+ }, {
+ key: "indexOf",
+ value: function(cssRule) {
+ for (var cssRules = this.element.sheet.cssRules, _index = 0; _index < cssRules.length; _index++) if (cssRule === cssRules[_index]) return _index;
+ return -1;
+ }
+ }, {
+ key: "replaceRule",
+ value: function(cssRule, rule) {
+ var index = this.indexOf(cssRule), newCssRule = this.insertRule(rule, index);
+ return this.element.sheet.deleteRule(index), newCssRule;
+ }
+ }, {
+ key: "getRules",
+ value: function() {
+ return this.element.sheet.cssRules;
+ }
+ } ]), DomRenderer;
+ }();
+ exports.default = DomRenderer;
+ }).call(exports, __webpack_require__(51));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), VirtualRenderer = function() {
+ function VirtualRenderer() {
+ _classCallCheck(this, VirtualRenderer);
+ }
+ return _createClass(VirtualRenderer, [ {
+ key: "setStyle",
+ value: function() {
+ return !0;
+ }
+ }, {
+ key: "getStyle",
+ value: function() {
+ return "";
+ }
+ }, {
+ key: "setSelector",
+ value: function() {
+ return !0;
+ }
+ }, {
+ key: "getKey",
+ value: function() {
+ return "";
+ }
+ }, {
+ key: "attach",
+ value: function() {}
+ }, {
+ key: "detach",
+ value: function() {}
+ }, {
+ key: "deploy",
+ value: function() {}
+ }, {
+ key: "insertRule",
+ value: function() {
+ return !1;
+ }
+ }, {
+ key: "deleteRule",
+ value: function() {
+ return !0;
+ }
+ }, {
+ key: "replaceRule",
+ value: function() {
+ return !1;
+ }
+ }, {
+ key: "getRules",
+ value: function() {}
+ }, {
+ key: "indexOf",
+ value: function() {
+ return -1;
+ }
+ } ]), VirtualRenderer;
+ }();
+ exports.default = VirtualRenderer;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function jssPreset() {
+ return {
+ plugins: [ (0, _jssGlobal2.default)(), (0, _jssNested2.default)(), (0, _jssCamelCase2.default)(), (0,
+ _jssDefaultUnit2.default)(), (0, _jssVendorPrefixer2.default)(), (0, _jssPropsSort2.default)() ]
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _jssGlobal = __webpack_require__(440), _jssGlobal2 = _interopRequireDefault(_jssGlobal), _jssNested = __webpack_require__(441), _jssNested2 = _interopRequireDefault(_jssNested), _jssCamelCase = __webpack_require__(442), _jssCamelCase2 = _interopRequireDefault(_jssCamelCase), _jssDefaultUnit = __webpack_require__(443), _jssDefaultUnit2 = _interopRequireDefault(_jssDefaultUnit), _jssVendorPrefixer = __webpack_require__(445), _jssVendorPrefixer2 = _interopRequireDefault(_jssVendorPrefixer), _jssPropsSort = __webpack_require__(450), _jssPropsSort2 = _interopRequireDefault(_jssPropsSort);
+ exports.default = jssPreset;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function addScope(selector, scope) {
+ for (var parts = selector.split(separatorRegExp), scoped = "", i = 0; i < parts.length; i++) scoped += scope + " " + parts[i].trim(),
+ parts[i + 1] && (scoped += ", ");
+ return scoped;
+ }
+ function handleNestedGlobalContainerRule(rule) {
+ var options = rule.options, style = rule.style, rules = style[propKey];
+ if (rules) {
+ for (var name in rules) options.sheet.addRule(name, rules[name], _extends({}, options, {
+ selector: addScope(name, rule.selector)
+ }));
+ delete style[propKey];
+ }
+ }
+ function handlePrefixedGlobalRule(rule) {
+ var options = rule.options, style = rule.style;
+ for (var prop in style) if (prop.substr(0, propKey.length) === propKey) {
+ var selector = addScope(prop.substr(propKey.length), rule.selector);
+ options.sheet.addRule(selector, style[prop], _extends({}, options, {
+ selector: selector
+ })), delete style[prop];
+ }
+ }
+ function jssGlobal() {
+ function onCreateRule(name, styles, options) {
+ if (name === propKey) return new GlobalContainerRule(name, styles, options);
+ if ("@" === name[0] && name.substr(0, prefixKey.length) === prefixKey) return new GlobalPrefixedRule(name, styles, options);
+ var parent = options.parent;
+ return parent && ("global" !== parent.type && "global" !== parent.options.parent.type || (options.global = !0)),
+ options.global && (options.selector = name), null;
+ }
+ function onProcessRule(rule) {
+ "style" === rule.type && (handleNestedGlobalContainerRule(rule), handlePrefixedGlobalRule(rule));
+ }
+ return {
+ onCreateRule: onCreateRule,
+ onProcessRule: onProcessRule
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }();
+ exports.default = jssGlobal;
+ var _jss = __webpack_require__(228), propKey = "@global", prefixKey = "@global ", GlobalContainerRule = function() {
+ function GlobalContainerRule(key, styles, options) {
+ _classCallCheck(this, GlobalContainerRule), this.type = "global", this.key = key,
+ this.options = options, this.rules = new _jss.RuleList(_extends({}, options, {
+ parent: this
+ }));
+ for (var selector in styles) this.rules.add(selector, styles[selector], {
+ selector: selector
+ });
+ this.rules.process();
+ }
+ return _createClass(GlobalContainerRule, [ {
+ key: "getRule",
+ value: function(name) {
+ return this.rules.get(name);
+ }
+ }, {
+ key: "addRule",
+ value: function(name, style, options) {
+ var rule = this.rules.add(name, style, options);
+ return this.options.jss.plugins.onProcessRule(rule), rule;
+ }
+ }, {
+ key: "indexOf",
+ value: function(rule) {
+ return this.rules.indexOf(rule);
+ }
+ }, {
+ key: "toString",
+ value: function() {
+ return this.rules.toString();
+ }
+ } ]), GlobalContainerRule;
+ }(), GlobalPrefixedRule = function() {
+ function GlobalPrefixedRule(name, style, options) {
+ _classCallCheck(this, GlobalPrefixedRule), this.name = name, this.options = options;
+ var selector = name.substr(prefixKey.length);
+ this.rule = options.jss.createRule(selector, style, _extends({}, options, {
+ parent: this,
+ selector: selector
+ }));
+ }
+ return _createClass(GlobalPrefixedRule, [ {
+ key: "toString",
+ value: function(options) {
+ return this.rule.toString(options);
+ }
+ } ]), GlobalPrefixedRule;
+ }(), separatorRegExp = /\s*,\s*/g;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function jssNested() {
+ function getReplaceRef(container) {
+ return function(match, key) {
+ var rule = container.getRule(key);
+ return rule ? rule.selector : ((0, _warning2.default)(!1, "[JSS] Could not find the referenced rule %s in %s.", key, container.options.meta || container),
+ key);
+ };
+ }
+ function replaceParentRefs(nestedProp, parentProp) {
+ for (var parentSelectors = parentProp.split(separatorRegExp), nestedSelectors = nestedProp.split(separatorRegExp), result = "", i = 0; i < parentSelectors.length; i++) for (var parent = parentSelectors[i], j = 0; j < nestedSelectors.length; j++) {
+ var nested = nestedSelectors[j];
+ result && (result += ", "), result += hasAnd(nested) ? nested.replace(parentRegExp, parent) : parent + " " + nested;
+ }
+ return result;
+ }
+ function getOptions(rule, container, options) {
+ if (options) return _extends({}, options, {
+ index: options.index + 1
+ });
+ var nestingLevel = rule.options.nestingLevel;
+ return nestingLevel = void 0 === nestingLevel ? 1 : nestingLevel + 1, _extends({}, rule.options, {
+ nestingLevel: nestingLevel,
+ index: container.indexOf(rule) + 1
+ });
+ }
+ function onProcessStyle(style, rule) {
+ if ("style" !== rule.type) return style;
+ var container = rule.options.parent, options = void 0, replaceRef = void 0;
+ for (var prop in style) {
+ var isNested = hasAnd(prop), isNestedConditional = "@" === prop[0];
+ if (isNested || isNestedConditional) {
+ if (options = getOptions(rule, container, options), isNested) {
+ var selector = replaceParentRefs(prop, rule.selector);
+ replaceRef || (replaceRef = getReplaceRef(container)), selector = selector.replace(refRegExp, replaceRef),
+ container.addRule(selector, style[prop], _extends({}, options, {
+ selector: selector
+ }));
+ } else isNestedConditional && container.addRule(prop, null, options).addRule(rule.key, style[prop], {
+ selector: rule.selector
+ });
+ delete style[prop];
+ }
+ }
+ return style;
+ }
+ var hasAnd = function(str) {
+ return -1 !== str.indexOf("&");
+ };
+ return {
+ onProcessStyle: onProcessStyle
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ };
+ exports.default = jssNested;
+ var _warning = __webpack_require__(11), _warning2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_warning), separatorRegExp = /\s*,\s*/g, parentRegExp = /&/g, refRegExp = /\$([\w-]+)/g;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function replace(str) {
+ return "-" + str.toLowerCase();
+ }
+ function convertCase(style) {
+ var converted = {};
+ for (var prop in style) converted[prop.replace(regExp, replace)] = style[prop];
+ return style.fallbacks && (Array.isArray(style.fallbacks) ? converted.fallbacks = style.fallbacks.map(convertCase) : converted.fallbacks = convertCase(style.fallbacks)),
+ converted;
+ }
+ function camelCase() {
+ function onProcessStyle(style) {
+ if (Array.isArray(style)) {
+ for (var index = 0; index < style.length; index++) style[index] = convertCase(style[index]);
+ return style;
+ }
+ return convertCase(style);
+ }
+ return {
+ onProcessStyle: onProcessStyle
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = camelCase;
+ var regExp = /([A-Z])/g;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function addCamelCasedVersion(obj) {
+ var regExp = /(-[a-z])/g, replace = function(str) {
+ return str[1].toUpperCase();
+ }, newObj = {};
+ for (var key in obj) newObj[key] = obj[key], newObj[key.replace(regExp, replace)] = obj[key];
+ return newObj;
+ }
+ function iterate(prop, value, options) {
+ if (!value) return value;
+ var convertedValue = value, type = void 0 === value ? "undefined" : _typeof(value);
+ switch ("object" === type && Array.isArray(value) && (type = "array"), type) {
+ case "object":
+ if ("fallbacks" === prop) {
+ for (var innerProp in value) value[innerProp] = iterate(innerProp, value[innerProp], options);
+ break;
+ }
+ for (var _innerProp in value) value[_innerProp] = iterate(prop + "-" + _innerProp, value[_innerProp], options);
+ break;
+
+ case "array":
+ for (var i = 0; i < value.length; i++) value[i] = iterate(prop, value[i], options);
+ break;
+
+ case "number":
+ 0 !== value && (convertedValue = value + (options[prop] || units[prop] || ""));
+ }
+ return convertedValue;
+ }
+ function defaultUnit() {
+ function onProcessStyle(style, rule) {
+ if ("style" !== rule.type) return style;
+ for (var prop in style) style[prop] = iterate(prop, style[prop], camelCasedOptions);
+ return style;
+ }
+ function onChangeValue(value, prop) {
+ return iterate(prop, value, camelCasedOptions);
+ }
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, camelCasedOptions = addCamelCasedVersion(options);
+ return {
+ onProcessStyle: onProcessStyle,
+ onChangeValue: onChangeValue
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ exports.default = defaultUnit;
+ var _defaultUnits = __webpack_require__(444), _defaultUnits2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_defaultUnits), units = addCamelCasedVersion(_defaultUnits2.default);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = {
+ "animation-delay": "ms",
+ "animation-duration": "ms",
+ "background-position": "px",
+ "background-position-x": "px",
+ "background-position-y": "px",
+ "background-size": "px",
+ border: "px",
+ "border-bottom": "px",
+ "border-bottom-left-radius": "px",
+ "border-bottom-right-radius": "px",
+ "border-bottom-width": "px",
+ "border-left": "px",
+ "border-left-width": "px",
+ "border-radius": "px",
+ "border-right": "px",
+ "border-right-width": "px",
+ "border-spacing": "px",
+ "border-top": "px",
+ "border-top-left-radius": "px",
+ "border-top-right-radius": "px",
+ "border-top-width": "px",
+ "border-width": "px",
+ "border-after-width": "px",
+ "border-before-width": "px",
+ "border-end-width": "px",
+ "border-horizontal-spacing": "px",
+ "border-start-width": "px",
+ "border-vertical-spacing": "px",
+ bottom: "px",
+ "box-shadow": "px",
+ "column-gap": "px",
+ "column-rule": "px",
+ "column-rule-width": "px",
+ "column-width": "px",
+ "flex-basis": "px",
+ "font-size": "px",
+ "font-size-delta": "px",
+ height: "px",
+ left: "px",
+ "letter-spacing": "px",
+ "logical-height": "px",
+ "logical-width": "px",
+ margin: "px",
+ "margin-after": "px",
+ "margin-before": "px",
+ "margin-bottom": "px",
+ "margin-left": "px",
+ "margin-right": "px",
+ "margin-top": "px",
+ "max-height": "px",
+ "max-width": "px",
+ "margin-end": "px",
+ "margin-start": "px",
+ "mask-position-x": "px",
+ "mask-position-y": "px",
+ "mask-size": "px",
+ "max-logical-height": "px",
+ "max-logical-width": "px",
+ "min-height": "px",
+ "min-width": "px",
+ "min-logical-height": "px",
+ "min-logical-width": "px",
+ motion: "px",
+ "motion-offset": "px",
+ outline: "px",
+ "outline-offset": "px",
+ "outline-width": "px",
+ padding: "px",
+ "padding-bottom": "px",
+ "padding-left": "px",
+ "padding-right": "px",
+ "padding-top": "px",
+ "padding-after": "px",
+ "padding-before": "px",
+ "padding-end": "px",
+ "padding-start": "px",
+ "perspective-origin-x": "%",
+ "perspective-origin-y": "%",
+ perspective: "px",
+ right: "px",
+ "shape-margin": "px",
+ size: "px",
+ "text-indent": "px",
+ "text-stroke": "px",
+ "text-stroke-width": "px",
+ top: "px",
+ "transform-origin": "%",
+ "transform-origin-x": "%",
+ "transform-origin-y": "%",
+ "transform-origin-z": "%",
+ "transition-delay": "ms",
+ "transition-duration": "ms",
+ "vertical-align": "px",
+ width: "px",
+ "word-spacing": "px",
+ "box-shadow-x": "px",
+ "box-shadow-y": "px",
+ "box-shadow-blur": "px",
+ "box-shadow-spread": "px",
+ "font-line-height": "px",
+ "text-shadow-x": "px",
+ "text-shadow-y": "px",
+ "text-shadow-blur": "px"
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function jssVendorPrefixer() {
+ function onProcessRule(rule) {
+ "keyframes" === rule.type && (rule.key = "@" + vendor.prefix.css + rule.key.substr(1));
+ }
+ function onProcessStyle(style, rule) {
+ if ("style" !== rule.type) return style;
+ for (var prop in style) {
+ var value = style[prop], changeProp = !1, supportedProp = vendor.supportedProperty(prop);
+ supportedProp && supportedProp !== prop && (changeProp = !0);
+ var changeValue = !1, supportedValue = vendor.supportedValue(supportedProp, value);
+ supportedValue && supportedValue !== value && (changeValue = !0), (changeProp || changeValue) && (changeProp && delete style[prop],
+ style[supportedProp || prop] = supportedValue || value);
+ }
+ return style;
+ }
+ function onChangeValue(value, prop) {
+ return vendor.supportedValue(prop, value);
+ }
+ return {
+ onProcessRule: onProcessRule,
+ onProcessStyle: onProcessStyle,
+ onChangeValue: onChangeValue
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = jssVendorPrefixer;
+ var _cssVendor = __webpack_require__(446), vendor = function(obj) {
+ if (obj && obj.__esModule) return obj;
+ var newObj = {};
+ if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);
+ return newObj.default = obj, newObj;
+ }(_cssVendor);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.supportedValue = exports.supportedProperty = exports.prefix = void 0;
+ var _prefix = __webpack_require__(156), _prefix2 = _interopRequireDefault(_prefix), _supportedProperty = __webpack_require__(447), _supportedProperty2 = _interopRequireDefault(_supportedProperty), _supportedValue = __webpack_require__(449), _supportedValue2 = _interopRequireDefault(_supportedValue);
+ exports.default = {
+ prefix: _prefix2.default,
+ supportedProperty: _supportedProperty2.default,
+ supportedValue: _supportedValue2.default
+ }, exports.prefix = _prefix2.default, exports.supportedProperty = _supportedProperty2.default,
+ exports.supportedValue = _supportedValue2.default;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function supportedProperty(prop) {
+ return el ? null != cache[prop] ? cache[prop] : ((0, _camelize2.default)(prop) in el.style ? cache[prop] = prop : _prefix2.default.js + (0,
+ _camelize2.default)("-" + prop) in el.style ? cache[prop] = _prefix2.default.css + prop : cache[prop] = !1,
+ cache[prop]) : prop;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = supportedProperty;
+ var _isInBrowser = __webpack_require__(107), _isInBrowser2 = _interopRequireDefault(_isInBrowser), _prefix = __webpack_require__(156), _prefix2 = _interopRequireDefault(_prefix), _camelize = __webpack_require__(448), _camelize2 = _interopRequireDefault(_camelize), el = void 0, cache = {};
+ if (_isInBrowser2.default) {
+ el = document.createElement("p");
+ var computed = window.getComputedStyle(document.documentElement, "");
+ for (var key in computed) isNaN(key) || (cache[computed[key]] = computed[key]);
+ }
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function camelize(str) {
+ return str.replace(regExp, toUpper);
+ }
+ function toUpper(match, c) {
+ return c ? c.toUpperCase() : "";
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = camelize;
+ var regExp = /[-\s]+(.)?/g;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function supportedValue(property, value) {
+ if (!el) return value;
+ if ("string" != typeof value || !isNaN(parseInt(value, 10))) return value;
+ var cacheKey = property + value;
+ if (null != cache[cacheKey]) return cache[cacheKey];
+ try {
+ el.style[property] = value;
+ } catch (err) {
+ return cache[cacheKey] = !1, !1;
+ }
+ return "" !== el.style[property] ? cache[cacheKey] = value : (value = _prefix2.default.css + value,
+ "-ms-flex" === value && (value = "-ms-flexbox"), el.style[property] = value, "" !== el.style[property] && (cache[cacheKey] = value)),
+ cache[cacheKey] || (cache[cacheKey] = !1), el.style[property] = "", cache[cacheKey];
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = supportedValue;
+ var _isInBrowser = __webpack_require__(107), _isInBrowser2 = _interopRequireDefault(_isInBrowser), _prefix = __webpack_require__(156), _prefix2 = _interopRequireDefault(_prefix), cache = {}, el = void 0;
+ _isInBrowser2.default && (el = document.createElement("p"));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function jssPropsSort() {
+ function sort(prop0, prop1) {
+ return prop0.length - prop1.length;
+ }
+ function onProcessStyle(style, rule) {
+ if ("style" !== rule.type) return style;
+ var newStyle = {}, props = Object.keys(style).sort(sort);
+ for (var prop in props) newStyle[props[prop]] = style[props[prop]];
+ return newStyle;
+ }
+ return {
+ onProcessStyle: onProcessStyle
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = jssPropsSort;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function createGenerateClassName() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, _options$dangerouslyU = options.dangerouslyUseGlobalCSS, dangerouslyUseGlobalCSS = void 0 !== _options$dangerouslyU && _options$dangerouslyU, _options$productionPr = options.productionPrefix, productionPrefix = void 0 === _options$productionPr ? "jss" : _options$productionPr, escapeRegex = /([[\].#*$><+~=|^:(),"'` + "`")) + (`\s])/g, ruleCounter = 0;
+ return "production" === process.env.NODE_ENV && "undefined" != typeof window && "jss" === productionPrefix && (generatorCounter += 1) > 2 && console.error([ "Material-UI: we have detected more than needed creation of the class name generator.", "You should only use one class name generator on the client side.", "If you do otherwise, you take the risk to have conflicting class names in production." ].join("\n")),
+ function(rule, styleSheet) {
+ if (ruleCounter += 1, "production" !== process.env.NODE_ENV && (0, _warning2.default)(ruleCounter < 1e10, [ "Material-UI: you might have a memory leak.", "The ruleCounter is not supposed to grow that much." ].join("")),
+ dangerouslyUseGlobalCSS) {
+ if (styleSheet && styleSheet.options.classNamePrefix) {
+ var prefix = styleSheet.options.classNamePrefix;
+ if (prefix = prefix.replace(escapeRegex, "-"), prefix.match(/^Mui/)) return prefix + "-" + rule.key;
+ if ("production" !== process.env.NODE_ENV) return prefix + "-" + rule.key + "-" + ruleCounter;
+ }
+ return "production" === process.env.NODE_ENV ? "" + productionPrefix + ruleCounter : rule.key + "-" + ruleCounter;
+ }
+ if ("production" === process.env.NODE_ENV) return "" + productionPrefix + ruleCounter;
+ if (styleSheet && styleSheet.options.classNamePrefix) {
+ var _prefix = styleSheet.options.classNamePrefix;
+ return (_prefix = _prefix.replace(escapeRegex, "-")) + "-" + rule.key + "-" + ruleCounter;
+ }
+ return rule.key + "-" + ruleCounter;
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = createGenerateClassName;
+ var _warning = __webpack_require__(11), _warning2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_warning), generatorCounter = 0;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function getStylesCreator(stylesOrCreator) {
+ function create(theme, name) {
+ var styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;
+ if (!theme.overrides || !name || !theme.overrides[name]) return styles;
+ var overrides = theme.overrides[name], stylesWithOverrides = (0, _extends3.default)({}, styles);
+ return (0, _keys2.default)(overrides).forEach(function(key) {
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(stylesWithOverrides[key], [ "Material-UI: you are trying to override a style that does not exist.", "Fix the ` + ("`" + `" + key + "`))) + (("`" + (` key of ` + "`")) + (`theme.overrides." + name + "` + ("`" + `." ].join("\n")),
+ stylesWithOverrides[key] = (0, _deepmerge2.default)(stylesWithOverrides[key], overrides[key]);
+ }), stylesWithOverrides;
+ }
+ var themingEnabled = "function" == typeof stylesOrCreator;
+ return {
+ create: create,
+ options: {},
+ themingEnabled: themingEnabled
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _deepmerge = __webpack_require__(103), _deepmerge2 = _interopRequireDefault(_deepmerge);
+ exports.default = getStylesCreator;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _AppBar = __webpack_require__(454), _AppBar2 = _interopRequireDefault(_AppBar), _Toolbar = __webpack_require__(458), _Toolbar2 = _interopRequireDefault(_Toolbar), _Transition = __webpack_require__(108), _Transition2 = _interopRequireDefault(_Transition), _IconButton = __webpack_require__(461), _IconButton2 = _interopRequireDefault(_IconButton), _Typography = __webpack_require__(109), _Typography2 = _interopRequireDefault(_Typography), _ChevronLeft = __webpack_require__(481), _ChevronLeft2 = _interopRequireDefault(_ChevronLeft), _common = __webpack_require__(61), styles = {
+ arrow: {
+ default: {
+ transition: "transform " + _common.DURATION + "ms"
+ },
+ transition: {
+ entered: {
+ transform: "rotate(180deg)"
+ }
+ }
+ }
+ }, themeStyles = function(theme) {
+ return {
+ header: {
+ backgroundColor: theme.palette.background.appBar,
+ color: theme.palette.getContrastText(theme.palette.background.appBar),
+ zIndex: theme.zIndex.appBar
+ },
+ toolbar: {
+ paddingLeft: theme.spacing.unit,
+ paddingRight: theme.spacing.unit
+ },
+ title: {
+ paddingLeft: theme.spacing.unit
+ }
+ };
+ }, Header = function(_Component) {
+ function Header() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Header);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Header.__proto__ || Object.getPrototypeOf(Header)).call.apply(_ref, [ this ].concat(args))),
+ _this.arrow = function(transitionState) {
+ return _react2.default.createElement(_IconButton2.default, {
+ onClick: _this.props.switchSideBar
+ }, _react2.default.createElement(_ChevronLeft2.default, {
+ style: _extends({}, styles.arrow.default, styles.arrow.transition[transitionState])
+ }));
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Header, _Component), _createClass(Header, [ {
+ key: "shouldComponentUpdate",
+ value: function(nextProps) {
+ return nextProps.opened !== this.props.opened;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props = this.props, classes = _props.classes, opened = _props.opened;
+ return _react2.default.createElement(_AppBar2.default, {
+ position: "static",
+ className: classes.header
+ }, _react2.default.createElement(_Toolbar2.default, {
+ className: classes.toolbar
+ }, _react2.default.createElement(_Transition2.default, {
+ mountOnEnter: !0,
+ in: opened,
+ timeout: {
+ enter: _common.DURATION
+ }
+ }, this.arrow), _react2.default.createElement(_Typography2.default, {
+ type: "title",
+ color: "inherit",
+ noWrap: !0,
+ className: classes.title
+ }, "Go Ethereum Dashboard")));
+ }
+ } ]), Header;
+ }(_react.Component);
+ exports.default = (0, _withStyles2.default)(themeStyles)(Header);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _AppBar = __webpack_require__(455);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_AppBar).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function AppBar(props) {
+ var _classNames, children = props.children, classes = props.classes, classNameProp = props.className, color = props.color, position = props.position, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className", "color", "position" ]), className = (0,
+ _classnames2.default)(classes.root, classes["position" + (0, _helpers.capitalizeFirstLetter)(position)], (_classNames = {},
+ (0, _defineProperty3.default)(_classNames, classes["color" + (0, _helpers.capitalizeFirstLetter)(color)], "inherit" !== color),
+ (0, _defineProperty3.default)(_classNames, "mui-fixed", "fixed" === position), _classNames), classNameProp);
+ return _react2.default.createElement(_Paper2.default, (0, _extends3.default)({
+ square: !0,
+ component: "header",
+ elevation: 4,
+ className: className
+ }, other), children);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(52), _Paper = __webpack_require__(456), _Paper2 = _interopRequireDefault(_Paper), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ display: "flex",
+ flexDirection: "column",
+ width: "100%",
+ boxSizing: "border-box",
+ zIndex: theme.zIndex.appBar,
+ flexShrink: 0
+ },
+ positionFixed: {
+ position: "fixed",
+ top: 0,
+ left: "auto",
+ right: 0
+ },
+ positionAbsolute: {
+ position: "absolute",
+ top: 0,
+ left: "auto",
+ right: 0
+ },
+ positionStatic: {
+ position: "static",
+ flexShrink: 0
+ },
+ colorDefault: {
+ backgroundColor: theme.palette.background.appBar,
+ color: theme.palette.getContrastText(theme.palette.background.appBar)
+ },
+ colorPrimary: {
+ backgroundColor: theme.palette.primary.main,
+ color: theme.palette.primary.contrastText
+ },
+ colorSecondary: {
+ backgroundColor: theme.palette.secondary.main,
+ color: theme.palette.secondary.contrastText
+ }
+ };
+ };
+ AppBar.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node.isRequired,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ color: _propTypes2.default.oneOf([ "inherit", "primary", "secondary", "default" ]),
+ position: _propTypes2.default.oneOf([ "static", "fixed", "absolute" ])
+ } : {}, AppBar.defaultProps = {
+ color: "primary",
+ position: "fixed"
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiAppBar"
+ })(AppBar);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _Paper = __webpack_require__(457);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_Paper).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function Paper(props) {
+ var classes = props.classes, classNameProp = props.className, Component = props.component, square = props.square, elevation = props.elevation, other = (0,
+ _objectWithoutProperties3.default)(props, [ "classes", "className", "component", "square", "elevation" ]);
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(elevation >= 0 && elevation < 25, "Material-UI: this elevation `))))) + (((("`" + (`" + elevation + "` + "`")) + (` is not implemented.");
+ var className = (0, _classnames2.default)(classes.root, classes["shadow" + (elevation >= 0 ? elevation : 0)], (0,
+ _defineProperty3.default)({}, classes.rounded, !square), classNameProp);
+ return _react2.default.createElement(Component, (0, _extends3.default)({
+ className: className
+ }, other));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {
+ var shadows = {};
+ return theme.shadows.forEach(function(shadow, index) {
+ shadows["shadow" + index] = {
+ boxShadow: shadow
+ };
+ }), (0, _extends3.default)({
+ root: {
+ backgroundColor: theme.palette.background.paper
+ },
+ rounded: {
+ borderRadius: 2
+ }
+ }, shadows);
+ };
+ Paper.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ elevation: _propTypes2.default.number,
+ square: _propTypes2.default.bool
+ } : {}, Paper.defaultProps = {
+ component: "div",
+ elevation: 2,
+ square: !1
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiPaper"
+ })(Paper);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _Toolbar = __webpack_require__(459);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_Toolbar).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function Toolbar(props) {
+ var children = props.children, classes = props.classes, classNameProp = props.className, disableGutters = props.disableGutters, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className", "disableGutters" ]), className = (0,
+ _classnames2.default)(classes.root, (0, _defineProperty3.default)({}, classes.gutters, !disableGutters), classNameProp);
+ return _react2.default.createElement("div", (0, _extends3.default)({
+ className: className
+ }, other), children);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {
+ return {
+ root: (0, _extends3.default)({
+ position: "relative",
+ display: "flex",
+ alignItems: "center"
+ }, theme.mixins.toolbar),
+ gutters: theme.mixins.gutters({})
+ };
+ };
+ Toolbar.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ disableGutters: _propTypes2.default.bool
+ } : {}, Toolbar.defaultProps = {
+ disableGutters: !1
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiToolbar"
+ })(Toolbar);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function transitionTimeout(transitionType) {
+ var timeoutPropName = "transition" + transitionType + "Timeout", enabledPropName = "transition" + transitionType;
+ return function(props) {
+ if (props[enabledPropName]) {
+ if (null == props[timeoutPropName]) return new Error(timeoutPropName + " wasn't supplied to CSSTransitionGroup: this can cause unreliable animations and won't be supported in a future version of React. See https://fb.me/react-animation-transition-group-timeout for more information.");
+ if ("number" != typeof props[timeoutPropName]) return new Error(timeoutPropName + " must be a number (in milliseconds)");
+ }
+ return null;
+ };
+ }
+ exports.__esModule = !0, exports.classNamesShape = exports.timeoutsShape = void 0,
+ exports.transitionTimeout = transitionTimeout;
+ var _propTypes = __webpack_require__(1), _propTypes2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_propTypes);
+ exports.timeoutsShape = _propTypes2.default.oneOfType([ _propTypes2.default.number, _propTypes2.default.shape({
+ enter: _propTypes2.default.number,
+ exit: _propTypes2.default.number
+ }).isRequired ]), exports.classNamesShape = _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.shape({
+ enter: _propTypes2.default.string,
+ exit: _propTypes2.default.string,
+ active: _propTypes2.default.string
+ }), _propTypes2.default.shape({
+ enter: _propTypes2.default.string,
+ enterActive: _propTypes2.default.string,
+ exit: _propTypes2.default.string,
+ exitActive: _propTypes2.default.string
+ }) ]);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _IconButton = __webpack_require__(462);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_IconButton).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function IconButton(props) {
+ var _classNames, buttonRef = props.buttonRef, children = props.children, classes = props.classes, className = props.className, color = props.color, disabled = props.disabled, rootRef = props.rootRef, other = (0,
+ _objectWithoutProperties3.default)(props, [ "buttonRef", "children", "classes", "className", "color", "disabled", "rootRef" ]);
+ return _react2.default.createElement(_ButtonBase2.default, (0, _extends3.default)({
+ className: (0, _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes["color" + (0,
+ _helpers.capitalizeFirstLetter)(color)], "default" !== color), (0, _defineProperty3.default)(_classNames, classes.disabled, disabled),
+ _classNames), className),
+ centerRipple: !0,
+ focusRipple: !0,
+ disabled: disabled,
+ rootRef: buttonRef,
+ ref: rootRef
+ }, other), _react2.default.createElement("span", {
+ className: classes.label
+ }, "string" == typeof children ? _react2.default.createElement(_Icon2.default, {
+ className: classes.icon
+ }, children) : _react2.default.Children.map(children, function(child) {
+ return (0, _reactHelpers.isMuiElement)(child, [ "Icon", "SvgIcon" ]) ? _react2.default.cloneElement(child, {
+ className: (0, _classnames2.default)(classes.icon, child.props.className)
+ }) : child;
+ })));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _ButtonBase = __webpack_require__(234), _ButtonBase2 = _interopRequireDefault(_ButtonBase), _helpers = __webpack_require__(52), _Icon = __webpack_require__(237), _Icon2 = _interopRequireDefault(_Icon), _reactHelpers = __webpack_require__(238);
+ __webpack_require__(239);
+ var styles = exports.styles = function(theme) {
+ return {
+ root: {
+ textAlign: "center",
+ flex: "0 0 auto",
+ fontSize: theme.typography.pxToRem(24),
+ width: 6 * theme.spacing.unit,
+ height: 6 * theme.spacing.unit,
+ padding: 0,
+ borderRadius: "50%",
+ color: theme.palette.action.active,
+ transition: theme.transitions.create("background-color", {
+ duration: theme.transitions.duration.shortest
+ })
+ },
+ colorInherit: {
+ color: "inherit"
+ },
+ colorPrimary: {
+ color: theme.palette.primary.main
+ },
+ colorSecondary: {
+ color: theme.palette.secondary.main
+ },
+ disabled: {
+ color: theme.palette.action.disabled
+ },
+ label: {
+ width: "100%",
+ display: "flex",
+ alignItems: "inherit",
+ justifyContent: "inherit"
+ },
+ icon: {
+ width: "1em",
+ height: "1em"
+ }
+ };
+ };
+ IconButton.propTypes = "production" !== process.env.NODE_ENV ? {
+ buttonRef: _propTypes2.default.func,
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ color: _propTypes2.default.oneOf([ "default", "inherit", "primary", "secondary" ]),
+ disabled: _propTypes2.default.bool,
+ disableRipple: _propTypes2.default.bool,
+ rootRef: _propTypes2.default.func
+ } : {}, IconButton.defaultProps = {
+ color: "default",
+ disabled: !1,
+ disableRipple: !1
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiIconButton"
+ })(IconButton);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _reactDom = __webpack_require__(95), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _keycode = __webpack_require__(235), _keycode2 = _interopRequireDefault(_keycode), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _keyboardFocus = __webpack_require__(464), _TouchRipple = __webpack_require__(468), _TouchRipple2 = _interopRequireDefault(_TouchRipple), _createRippleHandler = __webpack_require__(477), _createRippleHandler2 = _interopRequireDefault(_createRippleHandler), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ display: "inline-flex",
+ alignItems: "center",
+ justifyContent: "center",
+ position: "relative",
+ WebkitTapHighlightColor: theme.palette.common.transparent,
+ backgroundColor: "transparent",
+ outline: "none",
+ border: 0,
+ borderRadius: 0,
+ padding: 0,
+ cursor: "pointer",
+ userSelect: "none",
+ verticalAlign: "middle",
+ appearance: "none",
+ textDecoration: "none",
+ color: "inherit",
+ "&::-moz-focus-inner": {
+ borderStyle: "none"
+ }
+ },
+ disabled: {
+ pointerEvents: "none",
+ cursor: "default"
+ }
+ };
+ }, ButtonBase = function(_React$Component) {
+ function ButtonBase() {
+ var _ref, _temp, _this, _ret;
+ (0, _classCallCheck3.default)(this, ButtonBase);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = ButtonBase.__proto__ || (0,
+ _getPrototypeOf2.default)(ButtonBase)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ keyboardFocused: !1
+ }, _this.onKeyboardFocusHandler = function(event) {
+ _this.keyDown = !1, _this.setState({
+ keyboardFocused: !0
+ }), _this.props.onKeyboardFocus && _this.props.onKeyboardFocus(event);
+ }, _this.ripple = null, _this.keyDown = !1, _this.button = null, _this.keyboardFocusTimeout = null,
+ _this.keyboardFocusCheckTime = 50, _this.keyboardFocusMaxCheckTimes = 5, _this.handleKeyDown = function(event) {
+ var _this$props = _this.props, component = _this$props.component, focusRipple = _this$props.focusRipple, onKeyDown = _this$props.onKeyDown, onClick = _this$props.onClick, key = (0,
+ _keycode2.default)(event);
+ focusRipple && !_this.keyDown && _this.state.keyboardFocused && "space" === key && (_this.keyDown = !0,
+ event.persist(), _this.ripple.stop(event, function() {
+ _this.ripple.start(event);
+ })), onKeyDown && onKeyDown(event), event.target === _this.button && onClick && component && "a" !== component && "button" !== component && ("space" === key || "enter" === key) && (event.preventDefault(),
+ onClick(event));
+ }, _this.handleKeyUp = function(event) {
+ _this.props.focusRipple && "space" === (0, _keycode2.default)(event) && _this.state.keyboardFocused && (_this.keyDown = !1,
+ event.persist(), _this.ripple.stop(event, function() {
+ return _this.ripple.pulsate(event);
+ })), _this.props.onKeyUp && _this.props.onKeyUp(event);
+ }, _this.handleMouseDown = (0, _createRippleHandler2.default)(_this, "MouseDown", "start", function() {
+ clearTimeout(_this.keyboardFocusTimeout), (0, _keyboardFocus.focusKeyPressed)(!1),
+ _this.state.keyboardFocused && _this.setState({
+ keyboardFocused: !1
+ });
+ }), _this.handleMouseUp = (0, _createRippleHandler2.default)(_this, "MouseUp", "stop"),
+ _this.handleMouseLeave = (0, _createRippleHandler2.default)(_this, "MouseLeave", "stop", function(event) {
+ _this.state.keyboardFocused && event.preventDefault();
+ }), _this.handleTouchStart = (0, _createRippleHandler2.default)(_this, "TouchStart", "start"),
+ _this.handleTouchEnd = (0, _createRippleHandler2.default)(_this, "TouchEnd", "stop"),
+ _this.handleTouchMove = (0, _createRippleHandler2.default)(_this, "TouchEnd", "stop"),
+ _this.handleBlur = (0, _createRippleHandler2.default)(_this, "Blur", "stop", function() {
+ clearTimeout(_this.keyboardFocusTimeout), (0, _keyboardFocus.focusKeyPressed)(!1),
+ _this.setState({
+ keyboardFocused: !1
+ });
+ }), _this.handleFocus = function(event) {
+ _this.props.disabled || (_this.button || (_this.button = event.currentTarget), event.persist(),
+ (0, _keyboardFocus.detectKeyboardFocus)(_this, _this.button, function() {
+ _this.onKeyboardFocusHandler(event);
+ }), _this.props.onFocus && _this.props.onFocus(event));
+ }, _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);
+ }
+ return (0, _inherits3.default)(ButtonBase, _React$Component), (0, _createClass3.default)(ButtonBase, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.button = (0, _reactDom.findDOMNode)(this), (0, _keyboardFocus.listenForFocusKeys)();
+ }
+ }, {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ !this.props.disabled && nextProps.disabled && this.state.keyboardFocused && this.setState({
+ keyboardFocused: !1
+ });
+ }
+ }, {
+ key: "componentWillUpdate",
+ value: function(nextProps, nextState) {
+ this.props.focusRipple && nextState.keyboardFocused && !this.state.keyboardFocused && !this.props.disableRipple && this.ripple.pulsate();
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.button = null, clearTimeout(this.keyboardFocusTimeout);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _classNames, _this2 = this, _props = this.props, centerRipple = _props.centerRipple, children = _props.children, classes = _props.classes, classNameProp = _props.className, component = _props.component, disabled = _props.disabled, disableRipple = _props.disableRipple, keyboardFocusedClassName = (_props.focusRipple,
+ _props.keyboardFocusedClassName), rootRef = (_props.onBlur, _props.onFocus, _props.onKeyboardFocus,
+ _props.onKeyDown, _props.onKeyUp, _props.onMouseDown, _props.onMouseLeave, _props.onMouseUp,
+ _props.onTouchEnd, _props.onTouchMove, _props.onTouchStart, _props.rootRef), tabIndex = _props.tabIndex, type = _props.type, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "centerRipple", "children", "classes", "className", "component", "disabled", "disableRipple", "focusRipple", "keyboardFocusedClassName", "onBlur", "onFocus", "onKeyboardFocus", "onKeyDown", "onKeyUp", "onMouseDown", "onMouseLeave", "onMouseUp", "onTouchEnd", "onTouchMove", "onTouchStart", "rootRef", "tabIndex", "type" ]), className = (0,
+ _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.disabled, disabled),
+ (0, _defineProperty3.default)(_classNames, keyboardFocusedClassName || "", this.state.keyboardFocused),
+ _classNames), classNameProp), buttonProps = {}, ComponentProp = component;
+ return ComponentProp || (ComponentProp = other.href ? "a" : "button"), "button" === ComponentProp && (buttonProps.type = type || "button"),
+ "a" !== ComponentProp && (buttonProps.role = "button" === buttonProps.type ? void 0 : "button",
+ buttonProps.disabled = disabled), _react2.default.createElement(ComponentProp, (0,
+ _extends3.default)({
+ onBlur: this.handleBlur,
+ onFocus: this.handleFocus,
+ onKeyDown: this.handleKeyDown,
+ onKeyUp: this.handleKeyUp,
+ onMouseDown: this.handleMouseDown,
+ onMouseLeave: this.handleMouseLeave,
+ onMouseUp: this.handleMouseUp,
+ onTouchEnd: this.handleTouchEnd,
+ onTouchMove: this.handleTouchMove,
+ onTouchStart: this.handleTouchStart,
+ tabIndex: disabled ? -1 : tabIndex,
+ className: className
+ }, buttonProps, {
+ ref: rootRef
+ }, other), children, disableRipple || disabled ? null : _react2.default.createElement(_TouchRipple2.default, {
+ innerRef: function(node) {
+ _this2.ripple = node;
+ },
+ center: centerRipple
+ }));
+ }
+ } ]), ButtonBase;
+ }(_react2.default.Component);
+ ButtonBase.propTypes = "production" !== process.env.NODE_ENV ? {
+ centerRipple: _propTypes2.default.bool,
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ disabled: _propTypes2.default.bool,
+ disableRipple: _propTypes2.default.bool,
+ focusRipple: _propTypes2.default.bool,
+ keyboardFocusedClassName: _propTypes2.default.string,
+ onBlur: _propTypes2.default.func,
+ onClick: _propTypes2.default.func,
+ onFocus: _propTypes2.default.func,
+ onKeyboardFocus: _propTypes2.default.func,
+ onKeyDown: _propTypes2.default.func,
+ onKeyUp: _propTypes2.default.func,
+ onMouseDown: _propTypes2.default.func,
+ onMouseLeave: _propTypes2.default.func,
+ onMouseUp: _propTypes2.default.func,
+ onTouchEnd: _propTypes2.default.func,
+ onTouchMove: _propTypes2.default.func,
+ onTouchStart: _propTypes2.default.func,
+ role: _propTypes2.default.string,
+ rootRef: _propTypes2.default.func,
+ tabIndex: _propTypes2.default.oneOfType([ _propTypes2.default.number, _propTypes2.default.string ]),
+ type: _propTypes2.default.string
+ } : {}, ButtonBase.defaultProps = {
+ centerRipple: !1,
+ disableRipple: !1,
+ focusRipple: !1,
+ tabIndex: 0,
+ type: "button"
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiButtonBase"
+ })(ButtonBase);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function focusKeyPressed(pressed) {
+ return void 0 !== pressed && (internal.focusKeyPressed = Boolean(pressed)), internal.focusKeyPressed;
+ }
+ function detectKeyboardFocus(instance, element, callback) {
+ var attempt = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 1;
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(instance.keyboardFocusCheckTime, "Material-UI: missing instance.keyboardFocusCheckTime"),
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(instance.keyboardFocusMaxCheckTimes, "Material-UI: missing instance.keyboardFocusMaxCheckTimes"),
+ instance.keyboardFocusTimeout = setTimeout(function() {
+ focusKeyPressed() && (document.activeElement === element || (0, _contains2.default)(element, document.activeElement)) ? callback() : attempt < instance.keyboardFocusMaxCheckTimes && detectKeyboardFocus(instance, element, callback, attempt + 1);
+ }, instance.keyboardFocusCheckTime);
+ }
+ function isFocusKey(event) {
+ return -1 !== FOCUS_KEYS.indexOf((0, _keycode2.default)(event));
+ }
+ function listenForFocusKeys() {
+ internal.listening || ((0, _addEventListener2.default)(window, "keyup", function(event) {
+ isFocusKey(event) && (internal.focusKeyPressed = !0);
+ }), internal.listening = !0);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.focusKeyPressed = focusKeyPressed, exports.detectKeyboardFocus = detectKeyboardFocus,
+ exports.listenForFocusKeys = listenForFocusKeys;
+ var _keycode = __webpack_require__(235), _keycode2 = _interopRequireDefault(_keycode), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _contains = __webpack_require__(465), _contains2 = _interopRequireDefault(_contains), _addEventListener = __webpack_require__(467), _addEventListener2 = _interopRequireDefault(_addEventListener), internal = {
+ listening: !1,
+ focusKeyPressed: !1
+ }, FOCUS_KEYS = [ "tab", "enter", "space", "esc", "up", "down", "left", "right" ];
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function fallback(context, node) {
+ if (node) do {
+ if (node === context) return !0;
+ } while (node = node.parentNode);
+ return !1;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _inDOM = __webpack_require__(466), _inDOM2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_inDOM);
+ exports.default = function() {
+ return _inDOM2.default ? function(context, node) {
+ return context.contains ? context.contains(node) : context.compareDocumentPosition ? context === node || !!(16 & context.compareDocumentPosition(node)) : fallback(context, node);
+ } : fallback;
+ }(), module.exports = exports.default;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = !("undefined" == typeof window || !window.document || !window.document.createElement),
+ module.exports = exports.default;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = function(node, event, handler, capture) {
+ return node.addEventListener(event, handler, capture), {
+ remove: function() {
+ node.removeEventListener(event, handler, capture);
+ }
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = exports.DELAY_RIPPLE = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _toConsumableArray2 = __webpack_require__(469), _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _reactDom = __webpack_require__(95), _reactDom2 = _interopRequireDefault(_reactDom), _TransitionGroup = __webpack_require__(236), _TransitionGroup2 = _interopRequireDefault(_TransitionGroup), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Ripple = __webpack_require__(476), _Ripple2 = _interopRequireDefault(_Ripple), DURATION = 550, DELAY_RIPPLE = exports.DELAY_RIPPLE = 80, styles = exports.styles = function(theme) {
+ return {
+ root: {
+ display: "block",
+ position: "absolute",
+ overflow: "hidden",
+ borderRadius: "inherit",
+ width: "100%",
+ height: "100%",
+ left: 0,
+ top: 0,
+ pointerEvents: "none",
+ zIndex: 0
+ },
+ wrapper: {
+ opacity: 1
+ },
+ wrapperLeaving: {
+ opacity: 0,
+ animation: "mui-ripple-exit " + DURATION + "ms " + theme.transitions.easing.easeInOut
+ },
+ wrapperPulsating: {
+ position: "absolute",
+ left: 0,
+ top: 0,
+ display: "block",
+ width: "100%",
+ height: "100%",
+ animation: "mui-ripple-pulsate 2500ms " + theme.transitions.easing.easeInOut + " 200ms infinite"
+ },
+ "@keyframes mui-ripple-enter": {
+ "0%": {
+ transform: "scale(0)"
+ },
+ "100%": {
+ transform: "scale(1)"
+ }
+ },
+ "@keyframes mui-ripple-exit": {
+ "0%": {
+ opacity: 1
+ },
+ "100%": {
+ opacity: 0
+ }
+ },
+ "@keyframes mui-ripple-pulsate": {
+ "0%": {
+ transform: "scale(1)"
+ },
+ "50%": {
+ transform: "scale(0.92)"
+ },
+ "100%": {
+ transform: "scale(1)"
+ }
+ },
+ ripple: {
+ width: 50,
+ height: 50,
+ left: 0,
+ top: 0,
+ opacity: 0,
+ position: "absolute",
+ borderRadius: "50%",
+ background: "currentColor"
+ },
+ rippleVisible: {
+ opacity: .3,
+ transform: "scale(1)",
+ animation: "mui-ripple-enter " + DURATION + "ms " + theme.transitions.easing.easeInOut
+ },
+ rippleFast: {
+ animationDuration: "200ms"
+ }
+ };
+ }, TouchRipple = function(_React$Component) {
+ function TouchRipple() {
+ var _ref, _temp, _this, _ret;
+ (0, _classCallCheck3.default)(this, TouchRipple);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = TouchRipple.__proto__ || (0,
+ _getPrototypeOf2.default)(TouchRipple)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ nextKey: 0,
+ ripples: []
+ }, _this.ignoringMouseDown = !1, _this.startTimer = null, _this.startTimerCommit = null,
+ _this.pulsate = function() {
+ _this.start({}, {
+ pulsate: !0
+ });
+ }, _this.start = function() {
+ var event = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, cb = arguments[2], _options$pulsate = options.pulsate, pulsate = void 0 !== _options$pulsate && _options$pulsate, _options$center = options.center, center = void 0 === _options$center ? _this.props.center || options.pulsate : _options$center, _options$fakeElement = options.fakeElement, fakeElement = void 0 !== _options$fakeElement && _options$fakeElement;
+ if ("mousedown" === event.type && _this.ignoringMouseDown) return void (_this.ignoringMouseDown = !1);
+ "touchstart" === event.type && (_this.ignoringMouseDown = !0);
+ var element = fakeElement ? null : _reactDom2.default.findDOMNode(_this), rect = element ? element.getBoundingClientRect() : {
+ width: 0,
+ height: 0,
+ left: 0,
+ top: 0
+ }, rippleX = void 0, rippleY = void 0, rippleSize = void 0;
+ if (center || 0 === event.clientX && 0 === event.clientY || !event.clientX && !event.touches) rippleX = Math.round(rect.width / 2),
+ rippleY = Math.round(rect.height / 2); else {
+ var clientX = event.clientX ? event.clientX : event.touches[0].clientX, clientY = event.clientY ? event.clientY : event.touches[0].clientY;
+ rippleX = Math.round(clientX - rect.left), rippleY = Math.round(clientY - rect.top);
+ }
+ if (center) (rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3)) % 2 == 0 && (rippleSize += 1); else {
+ var sizeX = 2 * Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) + 2, sizeY = 2 * Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) + 2;
+ rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));
+ }
+ event.touches ? (_this.startTimerCommit = function() {
+ _this.startCommit({
+ pulsate: pulsate,
+ rippleX: rippleX,
+ rippleY: rippleY,
+ rippleSize: rippleSize,
+ cb: cb
+ });
+ }, _this.startTimer = setTimeout(function() {
+ _this.startTimerCommit(), _this.startTimerCommit = null;
+ }, DELAY_RIPPLE)) : _this.startCommit({
+ pulsate: pulsate,
+ rippleX: rippleX,
+ rippleY: rippleY,
+ rippleSize: rippleSize,
+ cb: cb
+ });
+ }, _this.startCommit = function(params) {
+ var pulsate = params.pulsate, rippleX = params.rippleX, rippleY = params.rippleY, rippleSize = params.rippleSize, cb = params.cb, ripples = _this.state.ripples;
+ ripples = [].concat((0, _toConsumableArray3.default)(ripples), [ _react2.default.createElement(_Ripple2.default, {
+ key: _this.state.nextKey,
+ classes: _this.props.classes,
+ timeout: {
+ exit: DURATION,
+ enter: DURATION
+ },
+ pulsate: pulsate,
+ rippleX: rippleX,
+ rippleY: rippleY,
+ rippleSize: rippleSize
+ }) ]), _this.setState({
+ nextKey: _this.state.nextKey + 1,
+ ripples: ripples
+ }, cb);
+ }, _this.stop = function(event, cb) {
+ clearTimeout(_this.startTimer);
+ var ripples = _this.state.ripples;
+ if ("touchend" === event.type && _this.startTimerCommit) return event.persist(),
+ _this.startTimerCommit(), _this.startTimerCommit = null, void (_this.startTimer = setTimeout(function() {
+ _this.stop(event, cb);
+ }, 0));
+ _this.startTimerCommit = null, ripples && ripples.length && _this.setState({
+ ripples: ripples.slice(1)
+ }, cb);
+ }, _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);
+ }
+ return (0, _inherits3.default)(TouchRipple, _React$Component), (0, _createClass3.default)(TouchRipple, [ {
+ key: "componentWillUnmount",
+ value: function() {
+ clearTimeout(this.startTimer);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props = this.props, classes = (_props.center, _props.classes), className = _props.className, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "center", "classes", "className" ]);
+ return _react2.default.createElement(_TransitionGroup2.default, (0, _extends3.default)({
+ component: "span",
+ enter: !0,
+ exit: !0,
+ className: (0, _classnames2.default)(classes.root, className)
+ }, other), this.state.ripples);
+ }
+ } ]), TouchRipple;
+ }(_react2.default.Component);
+ TouchRipple.propTypes = "production" !== process.env.NODE_ENV ? {
+ center: _propTypes2.default.bool,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string
+ } : {}, TouchRipple.defaultProps = {
+ center: !1
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ flip: !1,
+ name: "MuiTouchRipple"
+ })(TouchRipple);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _from = __webpack_require__(470), _from2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_from);
+ exports.default = function(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return (0, _from2.default)(arr);
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(471),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(144), __webpack_require__(472), module.exports = __webpack_require__(17).Array.from;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var ctx = __webpack_require__(47), $export = __webpack_require__(19), toObject = __webpack_require__(59), call = __webpack_require__(221), isArrayIter = __webpack_require__(222), toLength = __webpack_require__(97), createProperty = __webpack_require__(473), getIterFn = __webpack_require__(223);
+ $export($export.S + $export.F * !__webpack_require__(474)(function(iter) {
+ Array.from(iter);
+ }), "Array", {
+ from: function(arrayLike) {
+ var length, result, step, iterator, O = toObject(arrayLike), C = "function" == typeof this ? this : Array, aLen = arguments.length, mapfn = aLen > 1 ? arguments[1] : void 0, mapping = void 0 !== mapfn, index = 0, iterFn = getIterFn(O);
+ if (mapping && (mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : void 0, 2)), void 0 == iterFn || C == Array && isArrayIter(iterFn)) for (length = toLength(O.length),
+ result = new C(length); length > index; index++) createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); else for (iterator = iterFn.call(O),
+ result = new C(); !(step = iterator.next()).done; index++) createProperty(result, index, mapping ? call(iterator, mapfn, [ step.value, index ], !0) : step.value);
+ return result.length = index, result;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ var $defineProperty = __webpack_require__(22), createDesc = __webpack_require__(71);
+ module.exports = function(object, index, value) {
+ index in object ? $defineProperty.f(object, index, createDesc(0, value)) : object[index] = value;
+ };
+}, function(module, exports, __webpack_require__) {
+ var ITERATOR = __webpack_require__(21)("iterator"), SAFE_CLOSING = !1;
+ try {
+ var riter = [ 7 ][ITERATOR]();
+ riter.return = function() {
+ SAFE_CLOSING = !0;
+ }, Array.from(riter, function() {
+ throw 2;
+ });
+ } catch (e) {}
+ module.exports = function(exec, skipClosing) {
+ if (!skipClosing && !SAFE_CLOSING) return !1;
+ var safe = !1;
+ try {
+ var arr = [ 7 ], iter = arr[ITERATOR]();
+ iter.next = function() {
+ return {
+ done: safe = !0
+ };
+ }, arr[ITERATOR] = function() {
+ return iter;
+ }, exec(arr);
+ } catch (e) {}
+ return safe;
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function getChildMapping(children, mapFn) {
+ var mapper = function(child) {
+ return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;
+ }, result = Object.create(null);
+ return children && _react.Children.map(children, function(c) {
+ return c;
+ }).forEach(function(child) {
+ result[child.key] = mapper(child);
+ }), result;
+ }
+ function mergeChildMappings(prev, next) {
+ function getValueForKey(key) {
+ return key in next ? next[key] : prev[key];
+ }
+ prev = prev || {}, next = next || {};
+ var nextKeysPending = Object.create(null), pendingKeys = [];
+ for (var prevKey in prev) prevKey in next ? pendingKeys.length && (nextKeysPending[prevKey] = pendingKeys,
+ pendingKeys = []) : pendingKeys.push(prevKey);
+ var i = void 0, childMapping = {};
+ for (var nextKey in next) {
+ if (nextKeysPending[nextKey]) for (i = 0; i < nextKeysPending[nextKey].length; i++) {
+ var pendingNextKey = nextKeysPending[nextKey][i];
+ childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);
+ }
+ childMapping[nextKey] = getValueForKey(nextKey);
+ }
+ for (i = 0; i < pendingKeys.length; i++) childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);
+ return childMapping;
+ }
+ exports.__esModule = !0, exports.getChildMapping = getChildMapping, exports.mergeChildMappings = mergeChildMappings;
+ var _react = __webpack_require__(0);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _Transition = __webpack_require__(108), _Transition2 = _interopRequireDefault(_Transition), Ripple = function(_React$Component) {
+ function Ripple() {
+ var _ref, _temp, _this, _ret;
+ (0, _classCallCheck3.default)(this, Ripple);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = Ripple.__proto__ || (0,
+ _getPrototypeOf2.default)(Ripple)).call.apply(_ref, [ this ].concat(args))), _this.state = {
+ rippleVisible: !1,
+ rippleLeaving: !1
+ }, _this.handleEnter = function() {
+ _this.setState({
+ rippleVisible: !0
+ });
+ }, _this.handleExit = function() {
+ _this.setState({
+ rippleLeaving: !0
+ });
+ }, _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);
+ }
+ return (0, _inherits3.default)(Ripple, _React$Component), (0, _createClass3.default)(Ripple, [ {
+ key: "render",
+ value: function() {
+ var _classNames, _classNames2, _props = this.props, classes = _props.classes, classNameProp = _props.className, pulsate = _props.pulsate, rippleX = _props.rippleX, rippleY = _props.rippleY, rippleSize = _props.rippleSize, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "classes", "className", "pulsate", "rippleX", "rippleY", "rippleSize" ]), _state = this.state, rippleVisible = _state.rippleVisible, rippleLeaving = _state.rippleLeaving, className = (0,
+ _classnames2.default)(classes.wrapper, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.wrapperLeaving, rippleLeaving),
+ (0, _defineProperty3.default)(_classNames, classes.wrapperPulsating, pulsate), _classNames), classNameProp), rippleClassName = (0,
+ _classnames2.default)(classes.ripple, (_classNames2 = {}, (0, _defineProperty3.default)(_classNames2, classes.rippleVisible, rippleVisible),
+ (0, _defineProperty3.default)(_classNames2, classes.rippleFast, pulsate), _classNames2)), rippleStyles = {
+ width: rippleSize,
+ height: rippleSize,
+ top: -rippleSize / 2 + rippleY,
+ left: -rippleSize / 2 + rippleX
+ };
+ return _react2.default.createElement(_Transition2.default, (0, _extends3.default)({
+ onEnter: this.handleEnter,
+ onExit: this.handleExit
+ }, other), _react2.default.createElement("span", {
+ className: className
+ }, _react2.default.createElement("span", {
+ className: rippleClassName,
+ style: rippleStyles
+ })));
+ }
+ } ]), Ripple;
+ }(_react2.default.Component);
+ Ripple.propTypes = "production" !== process.env.NODE_ENV ? {
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ pulsate: _propTypes2.default.bool,
+ rippleSize: _propTypes2.default.number,
+ rippleX: _propTypes2.default.number,
+ rippleY: _propTypes2.default.number
+ } : {}, Ripple.defaultProps = {
+ pulsate: !1
+ }, exports.default = Ripple;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function createRippleHandler(instance, eventName, action, cb) {
+ return function(event) {
+ return cb && cb.call(instance, event), !event.defaultPrevented && (instance.ripple && instance.ripple[action](event),
+ instance.props && "function" == typeof instance.props["on" + eventName] && instance.props["on" + eventName](event),
+ !0);
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = createRippleHandler;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function Icon(props) {
+ var children = props.children, classes = props.classes, classNameProp = props.className, color = props.color, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className", "color" ]), className = (0,
+ _classnames2.default)("material-icons", classes.root, (0, _defineProperty3.default)({}, classes["color" + (0,
+ _helpers.capitalizeFirstLetter)(color)], "inherit" !== color), classNameProp);
+ return _react2.default.createElement("span", (0, _extends3.default)({
+ className: className,
+ "aria-hidden": "true"
+ }, other), children);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(52), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ userSelect: "none"
+ },
+ colorPrimary: {
+ color: theme.palette.primary.main
+ },
+ colorSecondary: {
+ color: theme.palette.secondary.main
+ },
+ colorAction: {
+ color: theme.palette.action.active
+ },
+ colorDisabled: {
+ color: theme.palette.action.disabled
+ },
+ colorError: {
+ color: theme.palette.error.main
+ }
+ };
+ };
+ Icon.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ color: _propTypes2.default.oneOf([ "inherit", "secondary", "action", "disabled", "error", "primary" ])
+ } : {}, Icon.defaultProps = {
+ color: "inherit"
+ }, Icon.muiName = "Icon", exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiIcon"
+ })(Icon);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function SvgIcon(props) {
+ var children = props.children, classes = props.classes, classNameProp = props.className, color = props.color, nativeColor = props.nativeColor, titleAccess = props.titleAccess, viewBox = props.viewBox, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className", "color", "nativeColor", "titleAccess", "viewBox" ]), className = (0,
+ _classnames2.default)(classes.root, (0, _defineProperty3.default)({}, classes["color" + (0,
+ _helpers.capitalizeFirstLetter)(color)], "inherit" !== color), classNameProp);
+ return _react2.default.createElement("svg", (0, _extends3.default)({
+ className: className,
+ focusable: "false",
+ viewBox: viewBox,
+ color: nativeColor,
+ "aria-hidden": titleAccess ? "false" : "true"
+ }, other), titleAccess ? _react2.default.createElement("title", null, titleAccess) : null, children);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(52), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ display: "inline-block",
+ fill: "currentColor",
+ height: 24,
+ width: 24,
+ userSelect: "none",
+ flexShrink: 0,
+ transition: theme.transitions.create("fill", {
+ duration: theme.transitions.duration.shorter
+ })
+ },
+ colorPrimary: {
+ color: theme.palette.primary.main
+ },
+ colorSecondary: {
+ color: theme.palette.secondary.main
+ },
+ colorAction: {
+ color: theme.palette.action.active
+ },
+ colorDisabled: {
+ color: theme.palette.action.disabled
+ },
+ colorError: {
+ color: theme.palette.error.main
+ }
+ };
+ };
+ SvgIcon.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node.isRequired,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ color: _propTypes2.default.oneOf([ "action", "disabled", "error", "inherit", "primary", "secondary" ]),
+ nativeColor: _propTypes2.default.string,
+ titleAccess: _propTypes2.default.string,
+ viewBox: _propTypes2.default.string
+ } : {}, SvgIcon.defaultProps = {
+ color: "inherit",
+ viewBox: "0 0 24 24"
+ }, SvgIcon.muiName = "SvgIcon", exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiSvgIcon"
+ })(SvgIcon);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function Typography(props) {
+ var _classNames, align = props.align, classes = props.classes, classNameProp = props.className, componentProp = props.component, color = props.color, gutterBottom = props.gutterBottom, headlineMapping = props.headlineMapping, noWrap = props.noWrap, paragraph = props.paragraph, type = props.type, other = (0,
+ _objectWithoutProperties3.default)(props, [ "align", "classes", "className", "component", "color", "gutterBottom", "headlineMapping", "noWrap", "paragraph", "type" ]), className = (0,
+ _classnames2.default)(classes.root, classes[type], (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes["color" + (0,
+ _helpers.capitalizeFirstLetter)(color)], "default" !== color), (0, _defineProperty3.default)(_classNames, classes.noWrap, noWrap),
+ (0, _defineProperty3.default)(_classNames, classes.gutterBottom, gutterBottom),
+ (0, _defineProperty3.default)(_classNames, classes.paragraph, paragraph), (0, _defineProperty3.default)(_classNames, classes["align" + (0,
+ _helpers.capitalizeFirstLetter)(align)], "inherit" !== align), _classNames), classNameProp), Component = componentProp || (paragraph ? "p" : headlineMapping[type]) || "span";
+ return _react2.default.createElement(Component, (0, _extends3.default)({
+ className: className
+ }, other));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(52), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ display: "block",
+ margin: 0
+ },
+ display4: theme.typography.display4,
+ display3: theme.typography.display3,
+ display2: theme.typography.display2,
+ display1: theme.typography.display1,
+ headline: theme.typography.headline,
+ title: theme.typography.title,
+ subheading: theme.typography.subheading,
+ body2: theme.typography.body2,
+ body1: theme.typography.body1,
+ caption: theme.typography.caption,
+ button: theme.typography.button,
+ alignLeft: {
+ textAlign: "left"
+ },
+ alignCenter: {
+ textAlign: "center"
+ },
+ alignRight: {
+ textAlign: "right"
+ },
+ alignJustify: {
+ textAlign: "justify"
+ },
+ noWrap: {
+ overflow: "hidden",
+ textOverflow: "ellipsis",
+ whiteSpace: "nowrap"
+ },
+ gutterBottom: {
+ marginBottom: "0.35em"
+ },
+ paragraph: {
+ marginBottom: 2 * theme.spacing.unit
+ },
+ colorInherit: {
+ color: "inherit"
+ },
+ colorPrimary: {
+ color: theme.palette.primary.main
+ },
+ colorSecondary: {
+ color: theme.palette.secondary.main
+ },
+ colorTextSecondary: {
+ color: theme.palette.text.secondary
+ },
+ colorError: {
+ color: theme.palette.error.main
+ }
+ };
+ };
+ Typography.propTypes = "production" !== process.env.NODE_ENV ? {
+ align: _propTypes2.default.oneOf([ "inherit", "left", "center", "right", "justify" ]),
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ color: _propTypes2.default.oneOf([ "inherit", "primary", "textSecondary", "secondary", "error", "default" ]),
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ gutterBottom: _propTypes2.default.bool,
+ headlineMapping: _propTypes2.default.object,
+ noWrap: _propTypes2.default.bool,
+ paragraph: _propTypes2.default.bool,
+ type: _propTypes2.default.oneOf([ "display4", "display3", "display2", "display1", "headline", "title", "subheading", "body2", "body1", "caption", "button" ])
+ } : {}, Typography.defaultProps = {
+ align: "inherit",
+ color: "default",
+ gutterBottom: !1,
+ headlineMapping: {
+ display4: "h1",
+ display3: "h1",
+ display2: "h1",
+ display1: "h1",
+ headline: "h1",
+ title: "h2",
+ subheading: "h3",
+ body2: "aside",
+ body1: "p"
+ },
+ noWrap: !1,
+ paragraph: !1,
+ type: "body1"
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiTypography"
+ })(Typography);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(global) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _pure = __webpack_require__(482), _pure2 = _interopRequireDefault(_pure), _SvgIcon = __webpack_require__(239), _SvgIcon2 = _interopRequireDefault(_SvgIcon), SvgIconCustom = global.__MUI_SvgIcon__ || _SvgIcon2.default, _ref = _react2.default.createElement("path", {
+ d: "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"
+ }), ChevronLeft = function(props) {
+ return _react2.default.createElement(SvgIconCustom, props, _ref);
+ };
+ ChevronLeft = (0, _pure2.default)(ChevronLeft), ChevronLeft.muiName = "SvgIcon",
+ exports.default = ChevronLeft;
+ }).call(exports, __webpack_require__(51));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ exports.__esModule = !0;
+ var _shouldUpdate = __webpack_require__(483), _shouldUpdate2 = _interopRequireDefault(_shouldUpdate), _shallowEqual = __webpack_require__(485), _shallowEqual2 = _interopRequireDefault(_shallowEqual), _setDisplayName = __webpack_require__(240), _setDisplayName2 = _interopRequireDefault(_setDisplayName), _wrapDisplayName = __webpack_require__(75), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), pure = function(BaseComponent) {
+ var hoc = (0, _shouldUpdate2.default)(function(props, nextProps) {
+ return !(0, _shallowEqual2.default)(props, nextProps);
+ });
+ return "production" !== process.env.NODE_ENV ? (0, _setDisplayName2.default)((0,
+ _wrapDisplayName2.default)(BaseComponent, "pure"))(hoc(BaseComponent)) : hoc(BaseComponent);
+ };
+ exports.default = pure;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ exports.__esModule = !0;
+ var _react = __webpack_require__(0), _setDisplayName = __webpack_require__(240), _setDisplayName2 = _interopRequireDefault(_setDisplayName), _wrapDisplayName = __webpack_require__(75), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), shouldUpdate = function(test) {
+ return function(BaseComponent) {
+ var factory = (0, _react.createFactory)(BaseComponent), ShouldUpdate = function(_Component) {
+ function ShouldUpdate() {
+ return _classCallCheck(this, ShouldUpdate), _possibleConstructorReturn(this, _Component.apply(this, arguments));
+ }
+ return _inherits(ShouldUpdate, _Component), ShouldUpdate.prototype.shouldComponentUpdate = function(nextProps) {
+ return test(this.props, nextProps);
+ }, ShouldUpdate.prototype.render = function() {
+ return factory(this.props);
+ }, ShouldUpdate;
+ }(_react.Component);
+ return "production" !== process.env.NODE_ENV ? (0, _setDisplayName2.default)((0,
+ _wrapDisplayName2.default)(BaseComponent, "shouldUpdate"))(ShouldUpdate) : ShouldUpdate;
+ };
+ };
+ exports.default = shouldUpdate;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var setStatic = function(key, value) {
+ return function(BaseComponent) {
+ return BaseComponent[key] = value, BaseComponent;
+ };
+ };
+ exports.default = setStatic;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ exports.__esModule = !0;
+ var _shallowEqual = __webpack_require__(96), _shallowEqual2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_shallowEqual);
+ exports.default = _shallowEqual2.default;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _SideBar = __webpack_require__(487), _SideBar2 = _interopRequireDefault(_SideBar), _Main = __webpack_require__(507), _Main2 = _interopRequireDefault(_Main), styles = {
+ body: {
+ display: "flex",
+ width: "100%",
+ height: "100%"
+ }
+ }, Body = function(_Component) {
+ function Body() {
+ return _classCallCheck(this, Body), _possibleConstructorReturn(this, (Body.__proto__ || Object.getPrototypeOf(Body)).apply(this, arguments));
+ }
+ return _inherits(Body, _Component), _createClass(Body, [ {
+ key: "render",
+ value: function() {
+ return _react2.default.createElement("div", {
+ style: styles.body
+ }, _react2.default.createElement(_SideBar2.default, {
+ opened: this.props.opened,
+ changeContent: this.props.changeContent
+ }), _react2.default.createElement(_Main2.default, {
+ active: this.props.active,
+ content: this.props.content,
+ shouldUpdate: this.props.shouldUpdate
+ }));
+ }
+ } ]), Body;
+ }(_react.Component);
+ exports.default = Body;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _List = __webpack_require__(488), _List2 = _interopRequireDefault(_List), _Icon = __webpack_require__(237), _Icon2 = _interopRequireDefault(_Icon), _Transition = __webpack_require__(108), _Transition2 = _interopRequireDefault(_Transition), _reactFa = __webpack_require__(496), _common = __webpack_require__(61), styles = {
+ menu: {
+ default: {
+ transition: "margin-left " + _common.DURATION + "ms"
+ },
+ transition: {
+ entered: {
+ marginLeft: -200
+ }
+ }
+ }
+ }, themeStyles = function(theme) {
+ return {
+ list: {
+ background: theme.palette.background.appBar
+ },
+ listItem: {
+ minWidth: 3 * theme.spacing.unit
+ },
+ icon: {
+ fontSize: 3 * theme.spacing.unit
+ }
+ };
+ }, SideBar = function(_Component) {
+ function SideBar() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, SideBar);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = SideBar.__proto__ || Object.getPrototypeOf(SideBar)).call.apply(_ref, [ this ].concat(args))),
+ _this.clickOn = function(menu) {
+ return function(event) {
+ event.preventDefault(), _this.props.changeContent(menu);
+ };
+ }, _this.menuItems = function(transitionState) {
+ var classes = _this.props.classes, children = [];
+ return _common.MENU.forEach(function(menu) {
+ children.push(_react2.default.createElement(_List.ListItem, {
+ button: !0,
+ key: menu.id,
+ onClick: _this.clickOn(menu.id),
+ className: classes.listItem
+ }, _react2.default.createElement(_List.ListItemIcon, null, _react2.default.createElement(_Icon2.default, {
+ className: classes.icon
+ }, _react2.default.createElement(_reactFa.Icon, {
+ name: menu.icon
+ }))), _react2.default.createElement(_List.ListItemText, {
+ primary: menu.title,
+ style: _extends({}, styles.menu.default, styles.menu.transition[transitionState], {
+ padding: 0
+ })
+ })));
+ }), children;
+ }, _this.menu = function(transitionState) {
+ return _react2.default.createElement("div", {
+ className: _this.props.classes.list
+ }, _react2.default.createElement(_List2.default, null, _this.menuItems(transitionState)));
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(SideBar, _Component), _createClass(SideBar, [ {
+ key: "shouldComponentUpdate",
+ value: function(nextProps) {
+ return nextProps.opened !== this.props.opened;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return _react2.default.createElement(_Transition2.default, {
+ mountOnEnter: !0,
+ in: this.props.opened,
+ timeout: {
+ enter: _common.DURATION
+ }
+ }, this.menu);
+ }
+ } ]), SideBar;
+ }(_react.Component);
+ exports.default = (0, _withStyles2.default)(themeStyles)(SideBar);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _List = __webpack_require__(489);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_List).default;
+ }
+ });
+ var _ListItem = __webpack_require__(490);
+ Object.defineProperty(exports, "ListItem", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ListItem).default;
+ }
+ });
+ var _ListItemAvatar = __webpack_require__(491);
+ Object.defineProperty(exports, "ListItemAvatar", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ListItemAvatar).default;
+ }
+ });
+ var _ListItemText = __webpack_require__(492);
+ Object.defineProperty(exports, "ListItemText", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ListItemText).default;
+ }
+ });
+ var _ListItemIcon = __webpack_require__(493);
+ Object.defineProperty(exports, "ListItemIcon", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ListItemIcon).default;
+ }
+ });
+ var _ListItemSecondaryAction = __webpack_require__(494);
+ Object.defineProperty(exports, "ListItemSecondaryAction", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ListItemSecondaryAction).default;
+ }
+ });
+ var _ListSubheader = __webpack_require__(495);
+ Object.defineProperty(exports, "ListSubheader", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_ListSubheader).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ flex: "1 1 auto",
+ listStyle: "none",
+ margin: 0,
+ padding: 0,
+ position: "relative"
+ },
+ padding: {
+ paddingTop: theme.spacing.unit,
+ paddingBottom: theme.spacing.unit
+ },
+ dense: {
+ paddingTop: theme.spacing.unit / 2,
+ paddingBottom: theme.spacing.unit / 2
+ },
+ subheader: {
+ paddingTop: 0
+ }
+ };
+ }, List = function(_React$Component) {
+ function List() {
+ return (0, _classCallCheck3.default)(this, List), (0, _possibleConstructorReturn3.default)(this, (List.__proto__ || (0,
+ _getPrototypeOf2.default)(List)).apply(this, arguments));
+ }
+ return (0, _inherits3.default)(List, _React$Component), (0, _createClass3.default)(List, [ {
+ key: "getChildContext",
+ value: function() {
+ return {
+ dense: this.props.dense
+ };
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _classNames, _props = this.props, children = _props.children, classes = _props.classes, classNameProp = _props.className, Component = _props.component, dense = _props.dense, disablePadding = _props.disablePadding, subheader = _props.subheader, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "children", "classes", "className", "component", "dense", "disablePadding", "subheader" ]), className = (0,
+ _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.dense, dense && !disablePadding),
+ (0, _defineProperty3.default)(_classNames, classes.padding, !disablePadding), (0,
+ _defineProperty3.default)(_classNames, classes.subheader, subheader), _classNames), classNameProp);
+ return _react2.default.createElement(Component, (0, _extends3.default)({
+ className: className
+ }, other), subheader, children);
+ }
+ } ]), List;
+ }(_react2.default.Component);
+ List.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ dense: _propTypes2.default.bool,
+ disablePadding: _propTypes2.default.bool,
+ subheader: _propTypes2.default.node
+ } : {}, List.defaultProps = {
+ component: "ul",
+ dense: !1,
+ disablePadding: !1
+ }, List.childContextTypes = {
+ dense: _propTypes2.default.bool
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiList"
+ })(List);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _ButtonBase = __webpack_require__(234), _ButtonBase2 = _interopRequireDefault(_ButtonBase), _reactHelpers = __webpack_require__(238), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ display: "flex",
+ justifyContent: "flex-start",
+ alignItems: "center",
+ position: "relative",
+ textDecoration: "none"
+ },
+ container: {
+ position: "relative"
+ },
+ keyboardFocused: {
+ backgroundColor: theme.palette.action.hover
+ },
+ default: {
+ paddingTop: 12,
+ paddingBottom: 12
+ },
+ dense: {
+ paddingTop: theme.spacing.unit,
+ paddingBottom: theme.spacing.unit
+ },
+ disabled: {
+ opacity: .5
+ },
+ divider: {
+ borderBottom: "1px solid " + theme.palette.divider
+ },
+ gutters: {
+ paddingLeft: 2 * theme.spacing.unit,
+ paddingRight: 2 * theme.spacing.unit
+ },
+ button: {
+ transition: theme.transitions.create("background-color", {
+ duration: theme.transitions.duration.shortest
+ }),
+ "&:hover": {
+ textDecoration: "none",
+ backgroundColor: theme.palette.action.hover,
+ "@media (hover: none)": {
+ backgroundColor: "transparent"
+ },
+ "&$disabled": {
+ backgroundColor: "transparent"
+ }
+ }
+ },
+ secondaryAction: {
+ paddingRight: 4 * theme.spacing.unit
+ }
+ };
+ }, ListItem = function(_React$Component) {
+ function ListItem() {
+ return (0, _classCallCheck3.default)(this, ListItem), (0, _possibleConstructorReturn3.default)(this, (ListItem.__proto__ || (0,
+ _getPrototypeOf2.default)(ListItem)).apply(this, arguments));
+ }
+ return (0, _inherits3.default)(ListItem, _React$Component), (0, _createClass3.default)(ListItem, [ {
+ key: "getChildContext",
+ value: function() {
+ return {
+ dense: this.props.dense || this.context.dense || !1
+ };
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _classNames, _props = this.props, button = _props.button, childrenProp = _props.children, classes = _props.classes, classNameProp = _props.className, componentProp = _props.component, dense = _props.dense, disabled = _props.disabled, disableGutters = _props.disableGutters, divider = _props.divider, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "button", "children", "classes", "className", "component", "dense", "disabled", "disableGutters", "divider" ]), isDense = dense || this.context.dense || !1, children = _react2.default.Children.toArray(childrenProp), hasAvatar = children.some(function(value) {
+ return (0, _reactHelpers.isMuiElement)(value, [ "ListItemAvatar" ]);
+ }), hasSecondaryAction = children.length && (0, _reactHelpers.isMuiElement)(children[children.length - 1], [ "ListItemSecondaryAction" ]), className = (0,
+ _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.gutters, !disableGutters),
+ (0, _defineProperty3.default)(_classNames, classes.divider, divider), (0, _defineProperty3.default)(_classNames, classes.disabled, disabled),
+ (0, _defineProperty3.default)(_classNames, classes.button, button), (0, _defineProperty3.default)(_classNames, classes.secondaryAction, hasSecondaryAction),
+ (0, _defineProperty3.default)(_classNames, isDense || hasAvatar ? classes.dense : classes.default, !0),
+ _classNames), classNameProp), listItemProps = (0, _extends3.default)({
+ className: className,
+ disabled: disabled
+ }, other), ComponentMain = componentProp;
+ return button && (ComponentMain = _ButtonBase2.default, listItemProps.component = componentProp,
+ listItemProps.keyboardFocusedClassName = classes.keyboardFocused), hasSecondaryAction ? _react2.default.createElement("div", {
+ className: classes.container
+ }, _react2.default.createElement(ComponentMain, listItemProps, children), children.pop()) : _react2.default.createElement(ComponentMain, listItemProps, children);
+ }
+ } ]), ListItem;
+ }(_react2.default.Component);
+ ListItem.propTypes = "production" !== process.env.NODE_ENV ? {
+ button: _propTypes2.default.bool,
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ dense: _propTypes2.default.bool,
+ disabled: _propTypes2.default.bool,
+ disableGutters: _propTypes2.default.bool,
+ divider: _propTypes2.default.bool
+ } : {}, ListItem.defaultProps = {
+ button: !1,
+ component: "li",
+ dense: !1,
+ disabled: !1,
+ disableGutters: !1,
+ divider: !1
+ }, ListItem.contextTypes = {
+ dense: _propTypes2.default.bool
+ }, ListItem.childContextTypes = {
+ dense: _propTypes2.default.bool
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiListItem"
+ })(ListItem);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function ListItemAvatar(props, context) {
+ var children = props.children, classes = props.classes, classNameProp = props.className, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className" ]);
+ return void 0 === context.dense ? ("production" !== process.env.NODE_ENV && (0,
+ _warning2.default)(!1, "Material-UI: <ListItemAvatar> is a simple wrapper to apply the dense styles\n to <Avatar>. You do not need it unless you are controlling the <List> dense property."),
+ props.children) : _react2.default.cloneElement(children, (0, _extends3.default)({
+ className: (0, _classnames2.default)((0, _defineProperty3.default)({}, classes.root, context.dense), classNameProp, children.props.className),
+ childrenClassName: (0, _classnames2.default)((0, _defineProperty3.default)({}, classes.icon, context.dense), children.props.childrenClassName)
+ }, other));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ width: 36,
+ height: 36,
+ fontSize: theme.typography.pxToRem(18),
+ marginRight: 4
+ },
+ icon: {
+ width: 20,
+ height: 20,
+ fontSize: theme.typography.pxToRem(20)
+ }
+ };
+ };
+ ListItemAvatar.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.element.isRequired,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string
+ } : {}, ListItemAvatar.contextTypes = {
+ dense: _propTypes2.default.bool
+ }, ListItemAvatar.muiName = "ListItemAvatar", exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiListItemAvatar"
+ })(ListItemAvatar);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function ListItemText(props, context) {
+ var _classNames, classes = props.classes, classNameProp = props.className, disableTypography = props.disableTypography, inset = props.inset, primary = props.primary, secondary = props.secondary, other = (0,
+ _objectWithoutProperties3.default)(props, [ "classes", "className", "disableTypography", "inset", "primary", "secondary" ]), dense = context.dense, className = (0,
+ _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.dense, dense),
+ (0, _defineProperty3.default)(_classNames, classes.inset, inset), _classNames), classNameProp);
+ return _react2.default.createElement("div", (0, _extends3.default)({
+ className: className
+ }, other), primary && (disableTypography ? primary : _react2.default.createElement(_Typography2.default, {
+ type: "subheading",
+ className: (0, _classnames2.default)(classes.primary, (0, _defineProperty3.default)({}, classes.textDense, dense))
+ }, primary)), secondary && (disableTypography ? secondary : _react2.default.createElement(_Typography2.default, {
+ type: "body1",
+ className: (0, _classnames2.default)(classes.secondary, (0, _defineProperty3.default)({}, classes.textDense, dense)),
+ color: "textSecondary"
+ }, secondary)));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Typography = __webpack_require__(109), _Typography2 = _interopRequireDefault(_Typography), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ flex: "1 1 auto",
+ minWidth: 0,
+ padding: "0 16px",
+ "&:first-child": {
+ paddingLeft: 0
+ }
+ },
+ inset: {
+ "&:first-child": {
+ paddingLeft: 7 * theme.spacing.unit
+ }
+ },
+ dense: {
+ fontSize: theme.typography.pxToRem(13)
+ },
+ primary: {
+ "&$textDense": {
+ fontSize: "inherit"
+ }
+ },
+ secondary: {
+ "&$textDense": {
+ fontSize: "inherit"
+ }
+ },
+ textDense: {}
+ };
+ };
+ ListItemText.propTypes = "production" !== process.env.NODE_ENV ? {
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ disableTypography: _propTypes2.default.bool,
+ inset: _propTypes2.default.bool,
+ primary: _propTypes2.default.node,
+ secondary: _propTypes2.default.node
+ } : {}, ListItemText.defaultProps = {
+ disableTypography: !1,
+ inset: !1,
+ primary: !1,
+ secondary: !1
+ }, ListItemText.contextTypes = {
+ dense: _propTypes2.default.bool
+ }, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiListItemText"
+ })(ListItemText);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function ListItemIcon(props) {
+ var children = props.children, classes = props.classes, classNameProp = props.className, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className" ]);
+ return _react2.default.cloneElement(children, (0, _extends3.default)({
+ className: (0, _classnames2.default)(classes.root, classNameProp, children.props.className)
+ }, other));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ height: 24,
+ marginRight: 2 * theme.spacing.unit,
+ width: 24,
+ color: theme.palette.action.active,
+ flexShrink: 0
+ }
+ };
+ };
+ ListItemIcon.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.element.isRequired,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string
+ } : {}, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiListItemIcon"
+ })(ListItemIcon);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function ListItemSecondaryAction(props) {
+ var children = props.children, classes = props.classes, className = props.className, other = (0,
+ _objectWithoutProperties3.default)(props, [ "children", "classes", "className" ]);
+ return _react2.default.createElement("div", (0, _extends3.default)({
+ className: (0, _classnames2.default)(classes.root, className)
+ }, other), children);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ position: "absolute",
+ right: 4,
+ top: "50%",
+ marginTop: 3 * -theme.spacing.unit
+ }
+ };
+ };
+ ListItemSecondaryAction.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string
+ } : {}, ListItemSecondaryAction.muiName = "ListItemSecondaryAction", exports.default = (0,
+ _withStyles2.default)(styles, {
+ name: "MuiListItemSecondaryAction"
+ })(ListItemSecondaryAction);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function ListSubheader(props) {
+ var _classNames, classes = props.classes, classNameProp = props.className, color = props.color, Component = props.component, disableSticky = props.disableSticky, inset = props.inset, other = (0,
+ _objectWithoutProperties3.default)(props, [ "classes", "className", "color", "component", "disableSticky", "inset" ]), className = (0,
+ _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes["color" + (0,
+ _helpers.capitalizeFirstLetter)(color)], "default" !== color), (0, _defineProperty3.default)(_classNames, classes.inset, inset),
+ (0, _defineProperty3.default)(_classNames, classes.sticky, !disableSticky), _classNames), classNameProp);
+ return _react2.default.createElement(Component, (0, _extends3.default)({
+ className: className
+ }, other));
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(52), styles = exports.styles = function(theme) {
+ return {
+ root: {
+ boxSizing: "border-box",
+ lineHeight: "48px",
+ listStyle: "none",
+ paddingLeft: 2 * theme.spacing.unit,
+ paddingRight: 2 * theme.spacing.unit,
+ color: theme.palette.text.secondary,
+ fontFamily: theme.typography.fontFamily,
+ fontWeight: theme.typography.fontWeightMedium,
+ fontSize: theme.typography.pxToRem(theme.typography.fontSize)
+ },
+ colorPrimary: {
+ color: theme.palette.primary.main
+ },
+ colorInherit: {
+ color: "inherit"
+ },
+ inset: {
+ paddingLeft: 9 * theme.spacing.unit
+ },
+ sticky: {
+ position: "sticky",
+ top: 0,
+ zIndex: 1,
+ backgroundColor: "inherit"
+ }
+ };
+ };
+ ListSubheader.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ color: _propTypes2.default.oneOf([ "default", "primary", "inherit" ]),
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ disableSticky: _propTypes2.default.bool,
+ inset: _propTypes2.default.bool
+ } : {}, ListSubheader.defaultProps = {
+ color: "default",
+ component: "li",
+ disableSticky: !1,
+ inset: !1
+ }, ListSubheader.muiName = "ListSubheader", exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiListSubheader"
+ })(ListSubheader);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.IconStack = exports.Icon = exports.default = void 0, __webpack_require__(497);
+ var _Icon = __webpack_require__(505), _Icon2 = _interopRequireDefault(_Icon), _IconStack = __webpack_require__(506), _IconStack2 = _interopRequireDefault(_IconStack);
+ exports.default = _Icon2.default, exports.Icon = _Icon2.default, exports.IconStack = _IconStack2.default;
+}, function(module, exports, __webpack_require__) {
+ var content = __webpack_require__(498);
+ "string" == typeof content && (content = [ [ module.i, content, "" ] ]);
+ var options = {
+ hmr: !0
+ };
+ options.transform = void 0;
+ __webpack_require__(503)(content, options);
+ content.locals && (module.exports = content.locals);
+}, function(module, exports, __webpack_require__) {
+ var escape = __webpack_require__(499);
+ exports = module.exports = __webpack_require__(500)(!1), exports.push([ module.i, "/*!\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n font-family: 'FontAwesome';\n \n src: url(" + escape(__webpack_require__(501)) + ") format('woff2'), url(" + escape(__webpack_require__(502)) + ') format(\'woff\');\n font-weight: normal;\n font-style: normal;\n}\n.fa {\n display: inline-block;\n font: normal normal normal 14px/1 FontAwesome;\n font-size: inherit;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n font-size: 1.33333333em;\n line-height: 0.75em;\n vertical-align: -15%;\n}\n.fa-2x {\n font-size: 2em;\n}\n.fa-3x {\n font-size: 3em;\n}\n.fa-4x {\n font-size: 4em;\n}\n.fa-5x {\n font-size: 5em;\n}\n.fa-fw {\n width: 1.28571429em;\n text-align: center;\n}\n.fa-ul {\n padding-left: 0;\n margin-left: 2.14285714em;\n list-style-type: none;\n}\n.fa-ul > li {\n position: relative;\n}\n.fa-li {\n position: absolute;\n left: -2.14285714em;\n width: 2.14285714em;\n top: 0.14285714em;\n text-align: center;\n}\n.fa-li.fa-lg {\n left: -1.85714286em;\n}\n.fa-border {\n padding: .2em .25em .15em;\n border: solid 0.08em #eeeeee;\n border-radius: .1em;\n}\n.fa-pull-left {\n float: left;\n}\n.fa-pull-right {\n float: right;\n}\n.fa.fa-pull-left {\n margin-right: .3em;\n}\n.fa.fa-pull-right {\n margin-left: .3em;\n}\n/* Deprecated as of 4.4.0 */\n.pull-right {\n float: right;\n}\n.pull-left {\n float: left;\n}\n.fa.pull-left {\n margin-right: .3em;\n}\n.fa.pull-right {\n margin-left: .3em;\n}\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n.fa-rotate-90 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";\n -webkit-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n.fa-rotate-180 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n.fa-rotate-270 {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";\n -webkit-transform: rotate(270deg);\n -ms-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";\n -webkit-transform: scale(-1, 1);\n -ms-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n -webkit-transform: scale(1, -1);\n -ms-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n filter: none;\n}\n.fa-stack {\n position: relative;\n display: inline-block;\n width: 2em;\n height: 2em;\n line-height: 2em;\n vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n position: absolute;\n left: 0;\n width: 100%;\n text-align: center;\n}\n.fa-stack-1x {\n line-height: inherit;\n}\n.fa-stack-2x {\n font-size: 2em;\n}\n.fa-inverse {\n color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n.fa-glass:before {\n content: "\\F000";\n}\n.fa-music:before {\n content: "\\F001";\n}\n.fa-search:before {\n content: "\\F002";\n}\n.fa-envelope-o:before {\n content: "\\F003";\n}\n.fa-heart:before {\n content: "\\F004";\n}\n.fa-star:before {\n content: "\\F005";\n}\n.fa-star-o:before {\n content: "\\F006";\n}\n.fa-user:before {\n content: "\\F007";\n}\n.fa-film:before {\n content: "\\F008";\n}\n.fa-th-large:before {\n content: "\\F009";\n}\n.fa-th:before {\n content: "\\F00A";\n}\n.fa-th-list:before {\n content: "\\F00B";\n}\n.fa-check:before {\n content: "\\F00C";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n content: "\\F00D";\n}\n.fa-search-plus:before {\n content: "\\F00E";\n}\n.fa-search-minus:before {\n content: "\\F010";\n}\n.fa-power-off:before {\n content: "\\F011";\n}\n.fa-signal:before {\n content: "\\F012";\n}\n.fa-gear:before,\n.fa-cog:before {\n content: "\\F013";\n}\n.fa-trash-o:before {\n content: "\\F014";\n}\n.fa-home:before {\n content: "\\F015";\n}\n.fa-file-o:before {\n content: "\\F016";\n}\n.fa-clock-o:before {\n content: "\\F017";\n}\n.fa-road:before {\n content: "\\F018";\n}\n.fa-download:before {\n content: "\\F019";\n}\n.fa-arrow-circle-o-down:before {\n content: "\\F01A";\n}\n.fa-arrow-circle-o-up:before {\n content: "\\F01B";\n}\n.fa-inbox:before {\n content: "\\F01C";\n}\n.fa-play-circle-o:before {\n content: "\\F01D";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n content: "\\F01E";\n}\n.fa-refresh:before {\n content: "\\F021";\n}\n.fa-list-alt:before {\n content: "\\F022";\n}\n.fa-lock:before {\n content: "\\F023";\n}\n.fa-flag:before {\n content: "\\F024";\n}\n.fa-headphones:before {\n content: "\\F025";\n}\n.fa-volume-off:before {\n content: "\\F026";\n}\n.fa-volume-down:before {\n content: "\\F027";\n}\n.fa-volume-up:before {\n content: "\\F028";\n}\n.fa-qrcode:before {\n content: "\\F029";\n}\n.fa-barcode:before {\n content: "\\F02A";\n}\n.fa-tag:before {\n content: "\\F02B";\n}\n.fa-tags:before {\n content: "\\F02C";\n}\n.fa-book:before {\n content: "\\F02D";\n}\n.fa-bookmark:before {\n content: "\\F02E";\n}\n.fa-print:before {\n content: "\\F02F";\n}\n.fa-camera:before {\n content: "\\F030";\n}\n.fa-font:before {\n content: "\\F031";\n}\n.fa-bold:before {\n content: "\\F032";\n}\n.fa-italic:before {\n content: "\\F033";\n}\n.fa-text-height:before {\n content: "\\F034";\n}\n.fa-text-width:before {\n content: "\\F035";\n}\n.fa-align-left:before {\n content: "\\F036";\n}\n.fa-align-center:before {\n content: "\\F037";\n}\n.fa-align-right:before {\n content: "\\F038";\n}\n.fa-align-justify:before {\n content: "\\F039";\n}\n.fa-list:before {\n content: "\\F03A";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n content: "\\F03B";\n}\n.fa-indent:before {\n content: "\\F03C";\n}\n.fa-video-camera:before {\n content: "\\F03D";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n content: "\\F03E";\n}\n.fa-pencil:before {\n content: "\\F040";\n}\n.fa-map-marker:before {\n content: "\\F041";\n}\n.fa-adjust:before {\n content: "\\F042";\n}\n.fa-tint:before {\n content: "\\F043";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n content: "\\F044";\n}\n.fa-share-square-o:before {\n content: "\\F045";\n}\n.fa-check-square-o:before {\n content: "\\F046";\n}\n.fa-arrows:before {\n content: "\\F047";\n}\n.fa-step-backward:before {\n content: "\\F048";\n}\n.fa-fast-backward:before {\n content: "\\F049";\n}\n.fa-backward:before {\n content: "\\F04A";\n}\n.fa-play:before {\n content: "\\F04B";\n}\n.fa-pause:before {\n content: "\\F04C";\n}\n.fa-stop:before {\n content: "\\F04D";\n}\n.fa-forward:before {\n content: "\\F04E";\n}\n.fa-fast-forward:before {\n content: "\\F050";\n}\n.fa-step-forward:before {\n content: "\\F051";\n}\n.fa-eject:before {\n content: "\\F052";\n}\n.fa-chevron-left:before {\n content: "\\F053";\n}\n.fa-chevron-right:before {\n content: "\\F054";\n}\n.fa-plus-circle:before {\n content: "\\F055";\n}\n.fa-minus-circle:before {\n content: "\\F056";\n}\n.fa-times-circle:before {\n content: "\\F057";\n}\n.fa-check-circle:before {\n content: "\\F058";\n}\n.fa-question-circle:before {\n content: "\\F059";\n}\n.fa-info-circle:before {\n content: "\\F05A";\n}\n.fa-crosshairs:before {\n content: "\\F05B";\n}\n.fa-times-circle-o:before {\n content: "\\F05C";\n}\n.fa-check-circle-o:before {\n content: "\\F05D";\n}\n.fa-ban:before {\n content: "\\F05E";\n}\n.fa-arrow-left:before {\n content: "\\F060";\n}\n.fa-arrow-right:before {\n content: "\\F061";\n}\n.fa-arrow-up:before {\n content: "\\F062";\n}\n.fa-arrow-down:before {\n content: "\\F063";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n content: "\\F064";\n}\n.fa-expand:before {\n content: "\\F065";\n}\n.fa-compress:before {\n content: "\\F066";\n}\n.fa-plus:before {\n content: "\\F067";\n}\n.fa-minus:before {\n content: "\\F068";\n}\n.fa-asterisk:before {\n content: "\\F069";\n}\n.fa-exclamation-circle:before {\n content: "\\F06A";\n}\n.fa-gift:before {\n content: "\\F06B";\n}\n.fa-leaf:before {\n content: "\\F06C";\n}\n.fa-fire:before {\n content: "\\F06D";\n}\n.fa-eye:before {\n content: "\\F06E";\n}\n.fa-eye-slash:before {\n content: "\\F070";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n content: "\\F071";\n}\n.fa-plane:before {\n content: "\\F072";\n}\n.fa-calendar:before {\n content: "\\F073";\n}\n.fa-random:before {\n content: "\\F074";\n}\n.fa-comment:before {\n content: "\\F075";\n}\n.fa-magnet:before {\n content: "\\F076";\n}\n.fa-chevron-up:before {\n content: "\\F077";\n}\n.fa-chevron-down:before {\n content: "\\F078";\n}\n.fa-retweet:before {\n content: "\\F079";\n}\n.fa-shopping-cart:before {\n content: "\\F07A";\n}\n.fa-folder:before {\n content: "\\F07B";\n}\n.fa-folder-open:before {\n content: "\\F07C";\n}\n.fa-arrows-v:before {\n content: "\\F07D";\n}\n.fa-arrows-h:before {\n content: "\\F07E";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n content: "\\F080";\n}\n.fa-twitter-square:before {\n content: "\\F081";\n}\n.fa-facebook-square:before {\n content: "\\F082";\n}\n.fa-camera-retro:before {\n content: "\\F083";\n}\n.fa-key:before {\n content: "\\F084";\n}\n.fa-gears:before,\n.fa-cogs:before {\n content: "\\F085";\n}\n.fa-comments:before {\n content: "\\F086";\n}\n.fa-thumbs-o-up:before {\n content: "\\F087";\n}\n.fa-thumbs-o-down:before {\n content: "\\F088";\n}\n.fa-star-half:before {\n content: "\\F089";\n}\n.fa-heart-o:before {\n content: "\\F08A";\n}\n.fa-sign-out:before {\n content: "\\F08B";\n}\n.fa-linkedin-square:before {\n content: "\\F08C";\n}\n.fa-thumb-tack:before {\n content: "\\F08D";\n}\n.fa-external-link:before {\n content: "\\F08E";\n}\n.fa-sign-in:before {\n content: "\\F090";\n}\n.fa-trophy:before {\n content: "\\F091";\n}\n.fa-github-square:before {\n content: "\\F092";\n}\n.fa-upload:before {\n content: "\\F093";\n}\n.fa-lemon-o:before {\n content: "\\F094";\n}\n.fa-phone:before {\n content: "\\F095";\n}\n.fa-square-o:before {\n content: "\\F096";\n}\n.fa-bookmark-o:before {\n content: "\\F097";\n}\n.fa-phone-square:before {\n content: "\\F098";\n}\n.fa-twitter:before {\n content: "\\F099";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n content: "\\F09A";\n}\n.fa-github:before {\n content: "\\F09B";\n}\n.fa-unlock:before {\n content: "\\F09C";\n}\n.fa-credit-card:before {\n content: "\\F09D";\n}\n.fa-feed:before,\n.fa-rss:before {\n content: "\\F09E";\n}\n.fa-hdd-o:before {\n content: "\\F0A0";\n}\n.fa-bullhorn:before {\n content: "\\F0A1";\n}\n.fa-bell:before {\n content: "\\F0F3";\n}\n.fa-certificate:before {\n content: "\\F0A3";\n}\n.fa-hand-o-right:before {\n content: "\\F0A4";\n}\n.fa-hand-o-left:before {\n content: "\\F0A5";\n}\n.fa-hand-o-up:before {\n content: "\\F0A6";\n}\n.fa-hand-o-down:before {\n content: "\\F0A7";\n}\n.fa-arrow-circle-left:before {\n content: "\\F0A8";\n}\n.fa-arrow-circle-right:before {\n content: "\\F0A9";\n}\n.fa-arrow-circle-up:before {\n content: "\\F0AA";\n}\n.fa-arrow-circle-down:before {\n content: "\\F0AB";\n}\n.fa-globe:before {\n content: "\\F0AC";\n}\n.fa-wrench:before {\n content: "\\F0AD";\n}\n.fa-tasks:before {\n content: "\\F0AE";\n}\n.fa-filter:before {\n content: "\\F0B0";\n}\n.fa-briefcase:before {\n content: "\\F0B1";\n}\n.fa-arrows-alt:before {\n content: "\\F0B2";\n}\n.fa-group:before,\n.fa-users:before {\n content: "\\F0C0";\n}\n.fa-chain:before,\n.fa-link:before {\n content: "\\F0C1";\n}\n.fa-cloud:before {\n content: "\\F0C2";\n}\n.fa-flask:before {\n content: "\\F0C3";\n}\n.fa-cut:before,\n.fa-scissors:before {\n content: "\\F0C4";\n}\n.fa-copy:before,\n.fa-files-o:before {\n content: "\\F0C5";\n}\n.fa-paperclip:before {\n content: "\\F0C6";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n content: "\\F0C7";\n}\n.fa-square:before {\n content: "\\F0C8";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n content: "\\F0C9";\n}\n.fa-list-ul:before {\n content: "\\F0CA";\n}\n.fa-list-ol:before {\n content: "\\F0CB";\n}\n.fa-strikethrough:before {\n content: "\\F0CC";\n}\n.fa-underline:before {\n content: "\\F0CD";\n}\n.fa-table:before {\n content: "\\F0CE";\n}\n.fa-magic:before {\n content: "\\F0D0";\n}\n.fa-truck:before {\n content: "\\F0D1";\n}\n.fa-pinterest:before {\n content: "\\F0D2";\n}\n.fa-pinterest-square:before {\n content: "\\F0D3";\n}\n.fa-google-plus-square:before {\n content: "\\F0D4";\n}\n.fa-google-plus:before {\n content: "\\F0D5";\n}\n.fa-money:before {\n content: "\\F0D6";\n}\n.fa-caret-down:before {\n content: "\\F0D7";\n}\n.fa-caret-up:before {\n content: "\\F0D8";\n}\n.fa-caret-left:before {\n content: "\\F0D9";\n}\n.fa-caret-right:before {\n content: "\\F0DA";\n}\n.fa-columns:before {\n content: "\\F0DB";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n content: "\\F0DC";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n content: "\\F0DD";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n content: "\\F0DE";\n}\n.fa-envelope:before {\n content: "\\F0E0";\n}\n.fa-linkedin:before {\n content: "\\F0E1";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n content: "\\F0E2";\n}\n.fa-legal:before,\n.fa-gavel:before {\n content: "\\F0E3";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n content: "\\F0E4";\n}\n.fa-comment-o:before {\n content: "\\F0E5";\n}\n.fa-comments-o:before {\n content: "\\F0E6";\n}\n.fa-flash:before,\n.fa-bolt:before {\n content: "\\F0E7";\n}\n.fa-sitemap:before {\n content: "\\F0E8";\n}\n.fa-umbrella:before {\n content: "\\F0E9";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n content: "\\F0EA";\n}\n.fa-lightbulb-o:before {\n content: "\\F0EB";\n}\n.fa-exchange:before {\n content: "\\F0EC";\n}\n.fa-cloud-download:before {\n content: "\\F0ED";\n}\n.fa-cloud-upload:before {\n content: "\\F0EE";\n}\n.fa-user-md:before {\n content: "\\F0F0";\n}\n.fa-stethoscope:before {\n content: "\\F0F1";\n}\n.fa-suitcase:before {\n content: "\\F0F2";\n}\n.fa-bell-o:before {\n content: "\\F0A2";\n}\n.fa-coffee:before {\n content: "\\F0F4";\n}\n.fa-cutlery:before {\n content: "\\F0F5";\n}\n.fa-file-text-o:before {\n content: "\\F0F6";\n}\n.fa-building-o:before {\n content: "\\F0F7";\n}\n.fa-hospital-o:before {\n content: "\\F0F8";\n}\n.fa-ambulance:before {\n content: "\\F0F9";\n}\n.fa-medkit:before {\n content: "\\F0FA";\n}\n.fa-fighter-jet:before {\n content: "\\F0FB";\n}\n.fa-beer:before {\n content: "\\F0FC";\n}\n.fa-h-square:before {\n content: "\\F0FD";\n}\n.fa-plus-square:before {\n content: "\\F0FE";\n}\n.fa-angle-double-left:before {\n content: "\\F100";\n}\n.fa-angle-double-right:before {\n content: "\\F101";\n}\n.fa-angle-double-up:before {\n content: "\\F102";\n}\n.fa-angle-double-down:before {\n content: "\\F103";\n}\n.fa-angle-left:before {\n content: "\\F104";\n}\n.fa-angle-right:before {\n content: "\\F105";\n}\n.fa-angle-up:before {\n content: "\\F106";\n}\n.fa-angle-down:before {\n content: "\\F107";\n}\n.fa-desktop:before {\n content: "\\F108";\n}\n.fa-laptop:before {\n content: "\\F109";\n}\n.fa-tablet:before {\n content: "\\F10A";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n content: "\\F10B";\n}\n.fa-circle-o:before {\n content: "\\F10C";\n}\n.fa-quote-left:before {\n content: "\\F10D";\n}\n.fa-quote-right:before {\n content: "\\F10E";\n}\n.fa-spinner:before {\n content: "\\F110";\n}\n.fa-circle:before {\n content: "\\F111";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n content: "\\F112";\n}\n.fa-github-alt:before {\n content: "\\F113";\n}\n.fa-folder-o:before {\n content: "\\F114";\n}\n.fa-folder-open-o:before {\n content: "\\F115";\n}\n.fa-smile-o:before {\n content: "\\F118";\n}\n.fa-frown-o:before {\n content: "\\F119";\n}\n.fa-meh-o:before {\n content: "\\F11A";\n}\n.fa-gamepad:before {\n content: "\\F11B";\n}\n.fa-keyboard-o:before {\n content: "\\F11C";\n}\n.fa-flag-o:before {\n content: "\\F11D";\n}\n.fa-flag-checkered:before {\n content: "\\F11E";\n}\n.fa-terminal:before {\n content: "\\F120";\n}\n.fa-code:before {\n content: "\\F121";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n content: "\\F122";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n content: "\\F123";\n}\n.fa-location-arrow:before {\n content: "\\F124";\n}\n.fa-crop:before {\n content: "\\F125";\n}\n.fa-code-fork:before {\n content: "\\F126";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n content: "\\F127";\n}\n.fa-question:before {\n content: "\\F128";\n}\n.fa-info:before {\n content: "\\F129";\n}\n.fa-exclamation:before {\n content: "\\F12A";\n}\n.fa-superscript:before {\n content: "\\F12B";\n}\n.fa-subscript:before {\n content: "\\F12C";\n}\n.fa-eraser:before {\n content: "\\F12D";\n}\n.fa-puzzle-piece:before {\n content: "\\F12E";\n}\n.fa-microphone:before {\n content: "\\F130";\n}\n.fa-microphone-slash:before {\n content: "\\F131";\n}\n.fa-shield:before {\n content: "\\F132";\n}\n.fa-calendar-o:before {\n content: "\\F133";\n}\n.fa-fire-extinguisher:before {\n content: "\\F134";\n}\n.fa-rocket:before {\n content: "\\F135";\n}\n.fa-maxcdn:before {\n content: "\\F136";\n}\n.fa-chevron-circle-left:before {\n content: "\\F137";\n}\n.fa-chevron-circle-right:before {\n content: "\\F138";\n}\n.fa-chevron-circle-up:before {\n content: "\\F139";\n}\n.fa-chevron-circle-down:before {\n content: "\\F13A";\n}\n.fa-html5:before {\n content: "\\F13B";\n}\n.fa-css3:before {\n content: "\\F13C";\n}\n.fa-anchor:before {\n content: "\\F13D";\n}\n.fa-unlock-alt:before {\n content: "\\F13E";\n}\n.fa-bullseye:before {\n content: "\\F140";\n}\n.fa-ellipsis-h:before {\n content: "\\F141";\n}\n.fa-ellipsis-v:before {\n content: "\\F142";\n}\n.fa-rss-square:before {\n content: "\\F143";\n}\n.fa-play-circle:before {\n content: "\\F144";\n}\n.fa-ticket:before {\n content: "\\F145";\n}\n.fa-minus-square:before {\n content: "\\F146";\n}\n.fa-minus-square-o:before {\n content: "\\F147";\n}\n.fa-level-up:before {\n content: "\\F148";\n}\n.fa-level-down:before {\n content: "\\F149";\n}\n.fa-check-square:before {\n content: "\\F14A";\n}\n.fa-pencil-square:before {\n content: "\\F14B";\n}\n.fa-external-link-square:before {\n content: "\\F14C";\n}\n.fa-share-square:before {\n content: "\\F14D";\n}\n.fa-compass:before {\n content: "\\F14E";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n content: "\\F150";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n content: "\\F151";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n content: "\\F152";\n}\n.fa-euro:before,\n.fa-eur:before {\n content: "\\F153";\n}\n.fa-gbp:before {\n content: "\\F154";\n}\n.fa-dollar:before,\n.fa-usd:before {\n content: "\\F155";\n}\n.fa-rupee:before,\n.fa-inr:before {\n content: "\\F156";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n content: "\\F157";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n content: "\\F158";\n}\n.fa-won:before,\n.fa-krw:before {\n content: "\\F159";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n content: "\\F15A";\n}\n.fa-file:before {\n content: "\\F15B";\n}\n.fa-file-text:before {\n content: "\\F15C";\n}\n.fa-sort-alpha-asc:before {\n content: "\\F15D";\n}\n.fa-sort-alpha-desc:before {\n content: "\\F15E";\n}\n.fa-sort-amount-asc:before {\n content: "\\F160";\n}\n.fa-sort-amount-desc:before {\n content: "\\F161";\n}\n.fa-sort-numeric-asc:before {\n content: "\\F162";\n}\n.fa-sort-numeric-desc:before {\n content: "\\F163";\n}\n.fa-thumbs-up:before {\n content: "\\F164";\n}\n.fa-thumbs-down:before {\n content: "\\F165";\n}\n.fa-youtube-square:before {\n content: "\\F166";\n}\n.fa-youtube:before {\n content: "\\F167";\n}\n.fa-xing:before {\n content: "\\F168";\n}\n.fa-xing-square:before {\n content: "\\F169";\n}\n.fa-youtube-play:before {\n content: "\\F16A";\n}\n.fa-dropbox:before {\n content: "\\F16B";\n}\n.fa-stack-overflow:before {\n content: "\\F16C";\n}\n.fa-instagram:before {\n content: "\\F16D";\n}\n.fa-flickr:before {\n content: "\\F16E";\n}\n.fa-adn:before {\n content: "\\F170";\n}\n.fa-bitbucket:before {\n content: "\\F171";\n}\n.fa-bitbucket-square:before {\n content: "\\F172";\n}\n.fa-tumblr:before {\n content: "\\F173";\n}\n.fa-tumblr-square:before {\n content: "\\F174";\n}\n.fa-long-arrow-down:before {\n content: "\\F175";\n}\n.fa-long-arrow-up:before {\n content: "\\F176";\n}\n.fa-long-arrow-left:before {\n content: "\\F177";\n}\n.fa-long-arrow-right:before {\n content: "\\F178";\n}\n.fa-apple:before {\n content: "\\F179";\n}\n.fa-windows:before {\n content: "\\F17A";\n}\n.fa-android:before {\n content: "\\F17B";\n}\n.fa-linux:before {\n content: "\\F17C";\n}\n.fa-dribbble:before {\n content: "\\F17D";\n}\n.fa-skype:before {\n content: "\\F17E";\n}\n.fa-foursquare:before {\n content: "\\F180";\n}\n.fa-trello:before {\n content: "\\F181";\n}\n.fa-female:before {\n content: "\\F182";\n}\n.fa-male:before {\n content: "\\F183";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n content: "\\F184";\n}\n.fa-sun-o:before {\n content: "\\F185";\n}\n.fa-moon-o:before {\n content: "\\F186";\n}\n.fa-archive:before {\n content: "\\F187";\n}\n.fa-bug:before {\n content: "\\F188";\n}\n.fa-vk:before {\n content: "\\F189";\n}\n.fa-weibo:before {\n content: "\\F18A";\n}\n.fa-renren:before {\n content: "\\F18B";\n}\n.fa-pagelines:before {\n content: "\\F18C";\n}\n.fa-stack-exchange:before {\n content: "\\F18D";\n}\n.fa-arrow-circle-o-right:before {\n content: "\\F18E";\n}\n.fa-arrow-circle-o-left:before {\n content: "\\F190";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n content: "\\F191";\n}\n.fa-dot-circle-o:before {\n content: "\\F192";\n}\n.fa-wheelchair:before {\n content: "\\F193";\n}\n.fa-vimeo-square:before {\n content: "\\F194";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n content: "\\F195";\n}\n.fa-plus-square-o:before {\n content: "\\F196";\n}\n.fa-space-shuttle:before {\n content: "\\F197";\n}\n.fa-slack:before {\n content: "\\F198";\n}\n.fa-envelope-square:before {\n content: "\\F199";\n}\n.fa-wordpress:before {\n content: "\\F19A";\n}\n.fa-openid:before {\n content: "\\F19B";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n content: "\\F19C";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n content: "\\F19D";\n}\n.fa-yahoo:before {\n content: "\\F19E";\n}\n.fa-google:before {\n content: "\\F1A0";\n}\n.fa-reddit:before {\n content: "\\F1A1";\n}\n.fa-reddit-square:before {\n content: "\\F1A2";\n}\n.fa-stumbleupon-circle:before {\n content: "\\F1A3";\n}\n.fa-stumbleupon:before {\n content: "\\F1A4";\n}\n.fa-delicious:before {\n content: "\\F1A5";\n}\n.fa-digg:before {\n content: "\\F1A6";\n}\n.fa-pied-piper-pp:before {\n content: "\\F1A7";\n}\n.fa-pied-piper-alt:before {\n content: "\\F1A8";\n}\n.fa-drupal:before {\n content: "\\F1A9";\n}\n.fa-joomla:before {\n content: "\\F1AA";\n}\n.fa-language:before {\n content: "\\F1AB";\n}\n.fa-fax:before {\n content: "\\F1AC";\n}\n.fa-building:before {\n content: "\\F1AD";\n}\n.fa-child:before {\n content: "\\F1AE";\n}\n.fa-paw:before {\n content: "\\F1B0";\n}\n.fa-spoon:before {\n content: "\\F1B1";\n}\n.fa-cube:before {\n content: "\\F1B2";\n}\n.fa-cubes:before {\n content: "\\F1B3";\n}\n.fa-behance:before {\n content: "\\F1B4";\n}\n.fa-behance-square:before {\n content: "\\F1B5";\n}\n.fa-steam:before {\n content: "\\F1B6";\n}\n.fa-steam-square:before {\n content: "\\F1B7";\n}\n.fa-recycle:before {\n content: "\\F1B8";\n}\n.fa-automobile:before,\n.fa-car:before {\n content: "\\F1B9";\n}\n.fa-cab:before,\n.fa-taxi:before {\n content: "\\F1BA";\n}\n.fa-tree:before {\n content: "\\F1BB";\n}\n.fa-spotify:before {\n content: "\\F1BC";\n}\n.fa-deviantart:before {\n content: "\\F1BD";\n}\n.fa-soundcloud:before {\n content: "\\F1BE";\n}\n.fa-database:before {\n content: "\\F1C0";\n}\n.fa-file-pdf-o:before {\n content: "\\F1C1";\n}\n.fa-file-word-o:before {\n content: "\\F1C2";\n}\n.fa-file-excel-o:before {\n content: "\\F1C3";\n}\n.fa-file-powerpoint-o:before {\n content: "\\F1C4";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n content: "\\F1C5";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n content: "\\F1C6";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n content: "\\F1C7";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n content: "\\F1C8";\n}\n.fa-file-code-o:before {\n content: "\\F1C9";\n}\n.fa-vine:before {\n content: "\\F1CA";\n}\n.fa-codepen:before {\n content: "\\F1CB";\n}\n.fa-jsfiddle:before {\n content: "\\F1CC";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n content: "\\F1CD";\n}\n.fa-circle-o-notch:before {\n content: "\\F1CE";\n}\n.fa-ra:before,\n.fa-resistance:before,\n.fa-rebel:before {\n content: "\\F1D0";\n}\n.fa-ge:before,\n.fa-empire:before {\n content: "\\F1D1";\n}\n.fa-git-square:before {\n content: "\\F1D2";\n}\n.fa-git:before {\n content: "\\F1D3";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n content: "\\F1D4";\n}\n.fa-tencent-weibo:before {\n content: "\\F1D5";\n}\n.fa-qq:before {\n content: "\\F1D6";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n content: "\\F1D7";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n content: "\\F1D8";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n content: "\\F1D9";\n}\n.fa-history:before {\n content: "\\F1DA";\n}\n.fa-circle-thin:before {\n content: "\\F1DB";\n}\n.fa-header:before {\n content: "\\F1DC";\n}\n.fa-paragraph:before {\n content: "\\F1DD";\n}\n.fa-sliders:before {\n content: "\\F1DE";\n}\n.fa-share-alt:before {\n content: "\\F1E0";\n}\n.fa-share-alt-square:before {\n content: "\\F1E1";\n}\n.fa-bomb:before {\n content: "\\F1E2";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n content: "\\F1E3";\n}\n.fa-tty:before {\n content: "\\F1E4";\n}\n.fa-binoculars:before {\n content: "\\F1E5";\n}\n.fa-plug:before {\n content: "\\F1E6";\n}\n.fa-slideshare:before {\n content: "\\F1E7";\n}\n.fa-twitch:before {\n content: "\\F1E8";\n}\n.fa-yelp:before {\n content: "\\F1E9";\n}\n.fa-newspaper-o:before {\n content: "\\F1EA";\n}\n.fa-wifi:before {\n content: "\\F1EB";\n}\n.fa-calculator:before {\n content: "\\F1EC";\n}\n.fa-paypal:before {\n content: "\\F1ED";\n}\n.fa-google-wallet:before {\n content: "\\F1EE";\n}\n.fa-cc-visa:before {\n content: "\\F1F0";\n}\n.fa-cc-mastercard:before {\n content: "\\F1F1";\n}\n.fa-cc-discover:before {\n content: "\\F1F2";\n}\n.fa-cc-amex:before {\n content: "\\F1F3";\n}\n.fa-cc-paypal:before {\n content: "\\F1F4";\n}\n.fa-cc-stripe:before {\n content: "\\F1F5";\n}\n.fa-bell-slash:before {\n content: "\\F1F6";\n}\n.fa-bell-slash-o:before {\n content: "\\F1F7";\n}\n.fa-trash:before {\n content: "\\F1F8";\n}\n.fa-copyright:before {\n content: "\\F1F9";\n}\n.fa-at:before {\n content: "\\F1FA";\n}\n.fa-eyedropper:before {\n content: "\\F1FB";\n}\n.fa-paint-brush:before {\n content: "\\F1FC";\n}\n.fa-birthday-cake:before {\n content: "\\F1FD";\n}\n.fa-area-chart:before {\n content: "\\F1FE";\n}\n.fa-pie-chart:before {\n content: "\\F200";\n}\n.fa-line-chart:before {\n content: "\\F201";\n}\n.fa-lastfm:before {\n content: "\\F202";\n}\n.fa-lastfm-square:before {\n content: "\\F203";\n}\n.fa-toggle-off:before {\n content: "\\F204";\n}\n.fa-toggle-on:before {\n content: "\\F205";\n}\n.fa-bicycle:before {\n content: "\\F206";\n}\n.fa-bus:before {\n content: "\\F207";\n}\n.fa-ioxhost:before {\n content: "\\F208";\n}\n.fa-angellist:before {\n content: "\\F209";\n}\n.fa-cc:before {\n content: "\\F20A";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n content: "\\F20B";\n}\n.fa-meanpath:before {\n content: "\\F20C";\n}\n.fa-buysellads:before {\n content: "\\F20D";\n}\n.fa-connectdevelop:before {\n content: "\\F20E";\n}\n.fa-dashcube:before {\n content: "\\F210";\n}\n.fa-forumbee:before {\n content: "\\F211";\n}\n.fa-leanpub:before {\n content: "\\F212";\n}\n.fa-sellsy:before {\n content: "\\F213";\n}\n.fa-shirtsinbulk:before {\n content: "\\F214";\n}\n.fa-simplybuilt:before {\n content: "\\F215";\n}\n.fa-skyatlas:before {\n content: "\\F216";\n}\n.fa-cart-plus:before {\n content: "\\F217";\n}\n.fa-cart-arrow-down:before {\n content: "\\F218";\n}\n.fa-diamond:before {\n content: "\\F219";\n}\n.fa-ship:before {\n content: "\\F21A";\n}\n.fa-user-secret:before {\n content: "\\F21B";\n}\n.fa-motorcycle:before {\n content: "\\F21C";\n}\n.fa-street-view:before {\n content: "\\F21D";\n}\n.fa-heartbeat:before {\n content: "\\F21E";\n}\n.fa-venus:before {\n content: "\\F221";\n}\n.fa-mars:before {\n content: "\\F222";\n}\n.fa-mercury:before {\n content: "\\F223";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n content: "\\F224";\n}\n.fa-transgender-alt:before {\n content: "\\F225";\n}\n.fa-venus-double:before {\n content: "\\F226";\n}\n.fa-mars-double:before {\n content: "\\F227";\n}\n.fa-venus-mars:before {\n content: "\\F228";\n}\n.fa-mars-stroke:before {\n content: "\\F229";\n}\n.fa-mars-stroke-v:before {\n content: "\\F22A";\n}\n.fa-mars-stroke-h:before {\n content: "\\F22B";\n}\n.fa-neuter:before {\n content: "\\F22C";\n}\n.fa-genderless:before {\n content: "\\F22D";\n}\n.fa-facebook-official:before {\n content: "\\F230";\n}\n.fa-pinterest-p:before {\n content: "\\F231";\n}\n.fa-whatsapp:before {\n content: "\\F232";\n}\n.fa-server:before {\n content: "\\F233";\n}\n.fa-user-plus:before {\n content: "\\F234";\n}\n.fa-user-times:before {\n content: "\\F235";\n}\n.fa-hotel:before,\n.fa-bed:before {\n content: "\\F236";\n}\n.fa-viacoin:before {\n content: "\\F237";\n}\n.fa-train:before {\n content: "\\F238";\n}\n.fa-subway:before {\n content: "\\F239";\n}\n.fa-medium:before {\n content: "\\F23A";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n content: "\\F23B";\n}\n.fa-optin-monster:before {\n content: "\\F23C";\n}\n.fa-opencart:before {\n content: "\\F23D";\n}\n.fa-expeditedssl:before {\n content: "\\F23E";\n}\n.fa-battery-4:before,\n.fa-battery:before,\n.fa-battery-full:before {\n content: "\\F240";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n content: "\\F241";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n content: "\\F242";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n content: "\\F243";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n content: "\\F244";\n}\n.fa-mouse-pointer:before {\n content: "\\F245";\n}\n.fa-i-cursor:before {\n content: "\\F246";\n}\n.fa-object-group:before {\n content: "\\F247";\n}\n.fa-object-ungroup:before {\n content: "\\F248";\n}\n.fa-sticky-note:before {\n content: "\\F249";\n}\n.fa-sticky-note-o:before {\n content: "\\F24A";\n}\n.fa-cc-jcb:before {\n content: "\\F24B";\n}\n.fa-cc-diners-club:before {\n content: "\\F24C";\n}\n.fa-clone:before {\n content: "\\F24D";\n}\n.fa-balance-scale:before {\n content: "\\F24E";\n}\n.fa-hourglass-o:before {\n content: "\\F250";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n content: "\\F251";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n content: "\\F252";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n content: "\\F253";\n}\n.fa-hourglass:before {\n content: "\\F254";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n content: "\\F255";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n content: "\\F256";\n}\n.fa-hand-scissors-o:before {\n content: "\\F257";\n}\n.fa-hand-lizard-o:before {\n content: "\\F258";\n}\n.fa-hand-spock-o:before {\n content: "\\F259";\n}\n.fa-hand-pointer-o:before {\n content: "\\F25A";\n}\n.fa-hand-peace-o:before {\n content: "\\F25B";\n}\n.fa-trademark:before {\n content: "\\F25C";\n}\n.fa-registered:before {\n content: "\\F25D";\n}\n.fa-creative-commons:before {\n content: "\\F25E";\n}\n.fa-gg:before {\n content: "\\F260";\n}\n.fa-gg-circle:before {\n content: "\\F261";\n}\n.fa-tripadvisor:before {\n content: "\\F262";\n}\n.fa-odnoklassniki:before {\n content: "\\F263";\n}\n.fa-odnoklassniki-square:before {\n content: "\\F264";\n}\n.fa-get-pocket:before {\n content: "\\F265";\n}\n.fa-wikipedia-w:before {\n content: "\\F266";\n}\n.fa-safari:before {\n content: "\\F267";\n}\n.fa-chrome:before {\n content: "\\F268";\n}\n.fa-firefox:before {\n content: "\\F269";\n}\n.fa-opera:before {\n content: "\\F26A";\n}\n.fa-internet-explorer:before {\n content: "\\F26B";\n}\n.fa-tv:before,\n.fa-television:before {\n content: "\\F26C";\n}\n.fa-contao:before {\n content: "\\F26D";\n}\n.fa-500px:before {\n content: "\\F26E";\n}\n.fa-amazon:before {\n content: "\\F270";\n}\n.fa-calendar-plus-o:before {\n content: "\\F271";\n}\n.fa-calendar-minus-o:before {\n content: "\\F272";\n}\n.fa-calendar-times-o:before {\n content: "\\F273";\n}\n.fa-calendar-check-o:before {\n content: "\\F274";\n}\n.fa-industry:before {\n content: "\\F275";\n}\n.fa-map-pin:before {\n content: "\\F276";\n}\n.fa-map-signs:before {\n content: "\\F277";\n}\n.fa-map-o:before {\n content: "\\F278";\n}\n.fa-map:before {\n content: "\\F279";\n}\n.fa-commenting:before {\n content: "\\F27A";\n}\n.fa-commenting-o:before {\n content: "\\F27B";\n}\n.fa-houzz:before {\n content: "\\F27C";\n}\n.fa-vimeo:before {\n content: "\\F27D";\n}\n.fa-black-tie:before {\n content: "\\F27E";\n}\n.fa-fonticons:before {\n content: "\\F280";\n}\n.fa-reddit-alien:before {\n content: "\\F281";\n}\n.fa-edge:before {\n content: "\\F282";\n}\n.fa-credit-card-alt:before {\n content: "\\F283";\n}\n.fa-codiepie:before {\n content: "\\F284";\n}\n.fa-modx:before {\n content: "\\F285";\n}\n.fa-fort-awesome:before {\n content: "\\F286";\n}\n.fa-usb:before {\n content: "\\F287";\n}\n.fa-product-hunt:before {\n content: "\\F288";\n}\n.fa-mixcloud:before {\n content: "\\F289";\n}\n.fa-scribd:before {\n content: "\\F28A";\n}\n.fa-pause-circle:before {\n content: "\\F28B";\n}\n.fa-pause-circle-o:before {\n content: "\\F28C";\n}\n.fa-stop-circle:before {\n content: "\\F28D";\n}\n.fa-stop-circle-o:before {\n content: "\\F28E";\n}\n.fa-shopping-bag:before {\n content: "\\F290";\n}\n.fa-shopping-basket:before {\n content: "\\F291";\n}\n.fa-hashtag:before {\n content: "\\F292";\n}\n.fa-bluetooth:before {\n content: "\\F293";\n}\n.fa-bluetooth-b:before {\n content: "\\F294";\n}\n.fa-percent:before {\n content: "\\F295";\n}\n.fa-gitlab:before {\n content: "\\F296";\n}\n.fa-wpbeginner:before {\n content: "\\F297";\n}\n.fa-wpforms:before {\n content: "\\F298";\n}\n.fa-envira:before {\n content: "\\F299";\n}\n.fa-universal-access:before {\n content: "\\F29A";\n}\n.fa-wheelchair-alt:before {\n content: "\\F29B";\n}\n.fa-question-circle-o:before {\n content: "\\F29C";\n}\n.fa-blind:before {\n content: "\\F29D";\n}\n.fa-audio-description:before {\n content: "\\F29E";\n}\n.fa-volume-control-phone:before {\n content: "\\F2A0";\n}\n.fa-braille:before {\n content: "\\F2A1";\n}\n.fa-assistive-listening-systems:before {\n content: "\\F2A2";\n}\n.fa-asl-interpreting:before,\n.fa-american-sign-language-interpreting:before {\n content: "\\F2A3";\n}\n.fa-deafness:before,\n.fa-hard-of-hearing:before,\n.fa-deaf:before {\n content: "\\F2A4";\n}\n.fa-glide:before {\n content: "\\F2A5";\n}\n.fa-glide-g:before {\n content: "\\F2A6";\n}\n.fa-signing:before,\n.fa-sign-language:before {\n content: "\\F2A7";\n}\n.fa-low-vision:before {\n content: "\\F2A8";\n}\n.fa-viadeo:before {\n content: "\\F2A9";\n}\n.fa-viadeo-square:before {\n content: "\\F2AA";\n}\n.fa-snapchat:before {\n content: "\\F2AB";\n}\n.fa-snapchat-ghost:before {\n content: "\\F2AC";\n}\n.fa-snapchat-square:before {\n content: "\\F2AD";\n}\n.fa-pied-piper:before {\n content: "\\F2AE";\n}\n.fa-first-order:before {\n content: "\\F2B0";\n}\n.fa-yoast:before {\n content: "\\F2B1";\n}\n.fa-themeisle:before {\n content: "\\F2B2";\n}\n.fa-google-plus-circle:before,\n.fa-google-plus-official:before {\n content: "\\F2B3";\n}\n.fa-fa:before,\n.fa-font-awesome:before {\n content: "\\F2B4";\n}\n.fa-handshake-o:before {\n content: "\\F2B5";\n}\n.fa-envelope-open:before {\n content: "\\F2B6";\n}\n.fa-envelope-open-o:before {\n content: "\\F2B7";\n}\n.fa-linode:before {\n content: "\\F2B8";\n}\n.fa-address-book:before {\n content: "\\F2B9";\n}\n.fa-address-book-o:before {\n content: "\\F2BA";\n}\n.fa-vcard:before,\n.fa-address-card:before {\n content: "\\F2BB";\n}\n.fa-vcard-o:before,\n.fa-address-card-o:before {\n content: "\\F2BC";\n}\n.fa-user-circle:before {\n content: "\\F2BD";\n}\n.fa-user-circle-o:before {\n content: "\\F2BE";\n}\n.fa-user-o:before {\n content: "\\F2C0";\n}\n.fa-id-badge:before {\n content: "\\F2C1";\n}\n.fa-drivers-license:before,\n.fa-id-card:before {\n content: "\\F2C2";\n}\n.fa-drivers-license-o:before,\n.fa-id-card-o:before {\n content: "\\F2C3";\n}\n.fa-quora:before {\n content: "\\F2C4";\n}\n.fa-free-code-camp:before {\n content: "\\F2C5";\n}\n.fa-telegram:before {\n content: "\\F2C6";\n}\n.fa-thermometer-4:before,\n.fa-thermometer:before,\n.fa-thermometer-full:before {\n content: "\\F2C7";\n}\n.fa-thermometer-3:before,\n.fa-thermometer-three-quarters:before {\n content: "\\F2C8";\n}\n.fa-thermometer-2:before,\n.fa-thermometer-half:before {\n content: "\\F2C9";\n}\n.fa-thermometer-1:before,\n.fa-thermometer-quarter:before {\n content: "\\F2CA";\n}\n.fa-thermometer-0:before,\n.fa-thermometer-empty:before {\n content: "\\F2CB";\n}\n.fa-shower:before {\n content: "\\F2CC";\n}\n.fa-bathtub:before,\n.fa-s15:before,\n.fa-bath:before {\n content: "\\F2CD";\n}\n.fa-podcast:before {\n content: "\\F2CE";\n}\n.fa-window-maximize:before {\n content: "\\F2D0";\n}\n.fa-window-minimize:before {\n content: "\\F2D1";\n}\n.fa-window-restore:before {\n content: "\\F2D2";\n}\n.fa-times-rectangle:before,\n.fa-window-close:before {\n content: "\\F2D3";\n}\n.fa-times-rectangle-o:before,\n.fa-window-close-o:before {\n content: "\\F2D4";\n}\n.fa-bandcamp:before {\n content: "\\F2D5";\n}\n.fa-grav:before {\n content: "\\F2D6";\n}\n.fa-etsy:before {\n content: "\\F2D7";\n}\n.fa-imdb:before {\n content: "\\F2D8";\n}\n.fa-ravelry:before {\n content: "\\F2D9";\n}\n.fa-eercast:before {\n content: "\\F2DA";\n}\n.fa-microchip:before {\n content: "\\F2DB";\n}\n.fa-snowflake-o:before {\n content: "\\F2DC";\n}\n.fa-superpowers:before {\n content: "\\F2DD";\n}\n.fa-wpexplorer:before {\n content: "\\F2DE";\n}\n.fa-meetup:before {\n content: "\\F2E0";\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n', "" ]);
+}, function(module, exports) {
+ module.exports = function(url) {
+ return "string" != typeof url ? url : (/^['"].*['"]$/.test(url) && (url = url.slice(1, -1)),
+ /["'() \t\n]/.test(url) ? '"' + url.replace(/"/g, '\\"').replace(/\n/g, "\\n") + '"' : url);
+ };
+}, function(module, exports) {
+ function cssWithMappingToString(item, useSourceMap) {
+ var content = item[1] || "", cssMapping = item[3];
+ if (!cssMapping) return content;
+ if (useSourceMap && "function" == typeof btoa) {
+ var sourceMapping = toComment(cssMapping);
+ return [ content ].concat(cssMapping.sources.map(function(source) {
+ return "/*# sourceURL=" + cssMapping.sourceRoot + source + " */";
+ })).concat([ sourceMapping ]).join("\n");
+ }
+ return [ content ].join("\n");
+ }
+ function toComment(sourceMap) {
+ return "/*# sourceMappingURL=data:application/json;charset=utf-8;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
+ }
+ module.exports = function(useSourceMap) {
+ var list = [];
+ return list.toString = function() {
+ return this.map(function(item) {
+ var content = cssWithMappingToString(item, useSourceMap);
+ return item[2] ? "@media " + item[2] + "{" + content + "}" : content;
+ }).join("");
+ }, list.i = function(modules, mediaQuery) {
+ "string" == typeof modules && (modules = [ [ null, modules, "" ] ]);
+ for (var alreadyImportedModules = {}, i = 0; i < this.length; i++) {
+ var id = this[i][0];
+ "number" == typeof id && (alreadyImportedModules[id] = !0);
+ }
+ for (i = 0; i < modules.length; i++) {
+ var item = modules[i];
+ "number" == typeof item[0] && alreadyImportedModules[item[0]] || (mediaQuery && !item[2] ? item[2] = mediaQuery : mediaQuery && (item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"),
+ list.push(item));
+ }
+ }, list;
+ };
+}, function(module, exports) {
+ module.exports = "data:font/woff2;base64,d09GMgABAAAAAS1oAA0AAAAChpgAAS0OAAQBywAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGiAGYACFchEIComZKIe2WAE2AiQDlXALlhAABCAFiQYHtHVbUglyR2H3kYQqug2BJ+096zq1GibTzT1ytyoKAhnlGvH2XQR0B9xFqm6jsv/////kpDFG2w7cQODV9Pt8rYoUCGaTbZJgmyTYkaFAZFtCUREkKFtVPCsorbhAUNA1HuRggbAO2j72UBAaO+EokdExs/1s2/5o1Kiiwimf3Fl5lPJKaenrF62Fznwl24G3XqwUR4KiM7gSbp6V6LraldwKxM2QRIqecFxZciCUTN9Q9A6NG4N0pSnLEZjvE6c2UsJeIlMLTH7xWVLXQ1hSFQmKNIGO5kb6eVxbv+g3bqHirnwdc+C7jHEeo027jiVLyf8XLtu6DiwL+oT3+EzQdP8n9hCQyU0dLBEVY/eIK2L6xNeH50/9c/le2CSFhtd6Lgf1bcWgDPxoJmdi3vDhdu2H8wEOySeKDzajOrC7w/Nz622jYowx2KhtMCLHghqwvypWjKiNHqNjoyQsMEFUUFS0MRID+/SsPAvtO+3z0mAQ5rYn8UgOP/Fzzqk6kQ9ORJ+o/KkQSRGkJIwEVBSLW4GCYjSKEc38f+rs7yyvzrzX772jYmw2kboLSUzpaX3bjCbgNOOUbSwnyxbL8yO916Wzf1J3AaJidcC2LEuWC8YGm+J2iwPbCG1fLcDA5lxIi537jkhI/qrzk+oHxsI/mJbTbfMLOVCIrdgpOedKqIYkxr2InOex9Dj46Mfazs5+uTvEchWNbr89JBEatR+UTmRkbhshJ66m8OM7s/SsOJm8J9lOpu0eIX8tGAZKGcq20y7g2PqR7livPQwsEgQOkJseImA6GKL/Gw8JCSB7je+e3OC8EstLISefAKEtRkiUnAmJIyR+m1pfhLmdEBK1A041VlU4RsivHKKOJRRQ1Pvdq9rb+wYIDIZDcAgCJARRGaK0u9oQnXKs7KLKvZvuumu7a9obpzPZtxPROlIRJR4QtoEye/SH3qn1kh1oJbspOMkR9gD48QEPGApJTEuQNnb0I+37s+7+Biw70KY2h6BOmjLOaHa3Dw4I/u9/zf7rDE9Pkad0IxaFBuJ4VInvqkJmAp2ehHFeFiOcrp+WP3v+NWKKSeLgJS1XWpDruWKkQaMTDF7kMc3ZbjUZ+a7pitemTlGdWSf65t3NEpYE/JFTBNwYH6YhdCIgBmBiM+n3JZMH9O8zNbsCFNFmdjurndXObM6s7jmcOmpnZj9ncpv1cP94nyCAD3wS/CAkCCBlEpQcEpRaFCjFFCR3KFpyU5DodiubWtkcz9Zx9k2i7B6b7s3q3ZltPyZzW/bldJlTklNqjqc5nK/j9z+tfNrqDfHwxT5HDswGLBBiRNW3Xqn0ql6px90bOmyKM469TkGaYKs1C5wyNrMBTPlwU/IJQd+nL1XrCsLWmLS8s7QnOVy0p9WGdLiFEK8h3/b2+rca/RuBbAAGhSBQTVK0mpA5boAKzWAVEhMoyhBA0iBIeSlN0mRNyg2QHDXp1KQTSCfSkZoc8m1TPPro23Ema7wpXM97O+4xxcNt+QebONt74YvVWIQx3S0zx5qQkSmCQiiEkSz7JfWTELC2to0ExAsFBd3923efb36+mHTt8EhXOGyQ1FoRCXKk47//PWWzGuzfMSvmBwUvyY4xVz/WsHLuEg44OVBMxtIBPnVvOSDFGDEgdMOYq8N1Y6edke7EQLP5XUsUEFLvf2JO/7uSdvuTtNQaqqgouCKKg3nrvbt7HAxjrv+P5vNzY3qmGSaucDWn5QShLGqzbiCia07EIYMug25e9/hVdR8AQHz8GD92tT73B7kdudwckXIYVWHcSFIgCxqPEPq51/jVkQCT80kNRInfy4tRv71+cOkKgNyNOzu4bvn5jUwYFyShdPkJOgloRkNZoe3eVE+gRk4dTn59F/ExImCzqPyf2GHPB8sozT9IIBGXlocfxFyWzeV1yjATTNS19fEnte26vb7NlFBibm1Pv5jrtt39jb8CGEpsiz8CAQie5XOr5wWIMCwOOIx4yULy+va+QhnH5ZFGiRAUn1/fG1JpWh34/7fUfmUjFWqwEbF3/WhPYyomRjYMrFlxwZIFe4l9P8nzPvd1Hvu2LvM0Ds5oJQVnlGAEpybX5yC4yxIpqaxSNRjlSIx9saf/y6Swa9yp2xyQJ0qZ3k+/AEmI2xO2nV/vs38FkXFPYifWSMefAEJZRU2jAxw2yHaEgTWqEE5KDeUVAU+ITgcaRgtOeCgxkjoBXLrfq0Pga45joGI4BVH0CRNk4RhbTBQoZWwcKzJ1Le7QYdaYZKKONTuiTiTU9iKiSKqPEKtTRrpv6zJpqCKK2VyzaAQ3SYz2oDxTQ08CrRm4lsiQSKAe4kV3IQEuH9fp/SFCUxJDqmcexJ2JY+MOueRzKtWnc4koNW2UPXHGyoplovvxWZELJOtcPhBmTjiAcZeMeOojdgqlNnVt7wngGZ2wYNtOTS1KAFz0EEa3x3LpRAKAHrVa0zCTByMn6qWIbuwR0kdqTILahlgUG8qMokGqnfFnWXOZKrJZytwHx17ZtZg7ItgdJGhifz25FhnPmxOYMN52SDyXVnZ/gWObXwBcWYoD7KPodztkQhYCg4sDToOEMxshJM7n57Tn4t5JfFCYIH4TJhPkA2TFLsgDG9Sw6QItYQfz+mEZCSsrwhOSOboubVL46TTjY3mvnrkji1XVwkZX7gh1vQ3cCRdpL/Ccr5RmfoA03fBsg+sOWFP0OcOEG/cxRZ3wvTNAkP3aaxOI3BVAFycjo7y2Y6y92W7qqSC68RXvU187rCX77kmK0MEru/gu80wa2EMCeLHr7h4evvrqhrF3CdrNVtuCgIG6qOGkwMP5RXhmfkhgvekwH7whZJToQFF7T2gxiRcXsUjBtkbDq9V6cxqNN/Pdibazxpx0D3J2zOip0mudu4ZoZVMzt9uHdpk5hHF8q0+C75dLKZVVXPKWQdIlo7m7AsRvHntsPIbbS7j/up3NjqKkjmmzj/FI60eASYV6nT02mldXbzDr2Qt8Fd4lQfcaamREKSENgKlwd67I7l+Cs+s7uPGm22OXRCPp/8uBTZDA3k56nPIFtwRwsF6PQ0R43sJ4aimENU/IOfsNoWDR0kVEWO548Y0g3ZJHVcjA7cuvDsSZqgSp79baiZwuJQ23v7bOiLF+DOPx+j3/CBoWQxNvpikNRoQ388rnJFqk/Si3Z8Hrb0Ktpw3bxpzAQN7lJvLD2mXuewbq4uWOo6AIbKCwZopfxlJ4mU5bp10MrpsHOGAtM5lztKbBknt/UGoB3hm4V3VjOe+FuK6phBtbPh3qLZ8uRKLcjln6H/ebFQ+AHmSHDM/C2AeisisYXnuTrrlD7veJsW3gxNnwLKaxQE48spAd2tnQ+PKJrx9/Di6NlFbx5k3w2hFT7CvTXESeK6LaUqJ80Ta1C+IncVxU4N0CppXzHB45h0SEBlg8fyTtcImA3gciu+mFppL8JJvStwveLPlwH7tz+aVU084a3f6vYrv/1E5rSZEeX+ahYNXmCkboiB/qV5OfVv+UJdnRdwitfqmkxETUkNnCy90q87N4afIeuHlbclqqhwCZW1MltEeb3BhzYEY844WjhbOsIKLBVosr/vMhK62W9/WKuNiNizl5n2vFwWZikTgy3gZz3n1sO1spZSTE+IlUnYaWa62DkuApmnaPtqk5rAGE4xune9N1E/J1j3SPyN6zQEXj9D58Q/baPFw0JQiXUnbhDKW26eXE6Kra9EDXukPMOFyR+H4pFCNrfL65LmHrb6q62gO6MDBHlHEwHRQl8fzwE6GZaHCLqboNTP+c3iKMKz6O7Oa1JaoLXk3LiphOmnPTyAZxjrQ9lRKwD77u5eSmhrBLETRy5y0q7+cl6NpoI9clO3BQ6aaUaNZDPffO+traDZca5SYUKaliYYTGS0z4QL/5nuR0uiGifjLtU11yWWy6WjbQM9GeSt5vtJhPo1b1O7loJmdPNZJSVIgvffnB0sZ7rqXyFxdBWtImhxlT8+LZdNjK+ZzPAwvNrwHpolDq60OhpBSiMBMItLZELPtwYnDQt9R6KacgXYBJ9z4aAA5RXEJswSK6l14zUj5y/Sr7uwRDPsAeHoOn4Rd4UFW6eh6tfVkRPQIP9cyVFrx99dC2xxCaGQrnDRw2LWAvIkgLCm+FJpJEl0kw/0UyWGGJlS0fqXsONcCBmTwNLH2U0RNgYDb6x+0YkGppounYaW08VXVqWala+moOQlxAjGfLM0VqZnCW+JifOrra7eoQV9vHrp+62d+zjpyUznClxLMzYW+v+xGBMYhkYYv4IJwDt92rpf2ImUqC17I/IGrOcTeuvk3D5s5mZplZtWbLHNRzAh6wGySbnAmElUj9kRTmrGyllvW5v8CIlyglLptyBuPSdz8D8r5tPX4LgnmyY1mRYmcpPMtXhCAvVngW2muptJIk5/OPDELwcn7xhgGn0/A5E942jTDRJv6ZX3ZNAFnCJYST0p175kV/iTY8w+mVx8Lt2yWLJas0rYuO36BP3kDv807h+QihgqoiWrcY309Ee3UzUw+Mx1eLTbCVUqftM3M8w/UZp5HYsw2jgKbxsFxJDjCNqy6gxS0y3a3sz+OErTuvCeyDMNUOtn1Oqy9i9fYajk57hEmZs3xiX3LEZfidX3BTaYPjyhQPPhIn3HesNfzb+lJGLNGHiCUeU1mWhLvGV2ijNkxfaeyDoz2am75pMfEz/llJN064Q3CNScnwxJS+wxIoD6hyr769MKvde2qJGfe6hXKLS7yemeXQom8pbNnE9IczbmG/VDF/XKfDSRlFKOltvfeyvd+Dm5PCRPRs+qx/ZbOzx+Ykw4Xfd1ieiMxVrPwoQJWErvdN9WEibqwOLOQqdkezHZYcicyoE3i5iq4+lUfZDFOCEYOA7r1nwMyJIpRRy3akYhQwKnrbyFBF9HnByYmMPzevJBMLwY7Y8CWeHYlHh9LR5HDJZFnIJmbiByHt+8dhNpSOfKgIKb8OO3U3I8IzyTSQbUrEs9v4Cm/39olP+HCtyIGidjhqoOqZ/HgoS8svWtxkuwOKj3jJxYP9bTdW0V9cp2bXTOU3DHCbWPN6Fh7shUg3vi2rDpa1LCgxS0hirWWQqCxyLRkco6ARcKFMy+/G7aAzPeZUmALGMql0kTLZvFiWazqptLX/CFqANcDPcwWJDnAOiNJTc1SruAUa1es6Ll21t0QilECw9S22RbfMkQYhEJQTQY3wkTK6ybYt8EYZfbHLkoAyQseDko1RGpnVF+AFKXTFw6d82iM0hHzcXPfjqIDwyGC3ZmMQLLafI9QHZ4npMTrZLdYWq6G5dHkXINtd+4eY4OQyr1p+ArGEAC4p4+mu8/Sz1wLHjODWHrWh3CVSpUuNmKu/KHmQAmCROJa2QxrXx9aN+rfL93qTuh2KSy1OjgyE8wEO9WBeK6b1i55uCKKoizO528+0GP4C5fSAnRaVVIHyM4J0UeHYo6kGCDQ8PjpKMMOIJeXdkVphYmDovQPqds2s/IZh9lQvWgEC+hScYd6dx9CTSWkJm1cxkBb88f2DX6mQED4pw/qXvkgilIr54+lwkusLg3w3bRRGtV5az81+ZosRFzBK8epeAMlJkRfcM1a5IekYpdx70zxlzC89znBg2tcM3nGtngA4XvbU2dPBSzjM60/NOfZ3MNPqWpC0fB6K3AR2P5FuwxQJ4Awzl4FmgSH9y9+30X6V/FSKIB+n5B37wcryIErTm6X7hAcRHN811wvBcKaPFLpWCbzfM4fLq7jF1/MPLj3G8czugS19p9xbzmflUuE1q/Od827so0I44ZH3g5kzLrsI0jgUCVlnoSMw3ya4va9ThC8uZmdcChpF4mbnfQ6QyCxrh6KU6ZNn/AYU+yQDuT9YWZMHKo/6lKm6Ebwxr5BwrZdFKL/X6/JSU5KkUbqYdJ7uAzYsoFHjalwI8OM8CC9dTq5z+80dpTvNJwwYSFhdjkWYMh45kIdkpmtZ/Q3ZapCOwlI20dTt9wNREiGYygDq7vcgVoa7mQolIggVXtBgl04zT/KMog/6hoOsW/EddjrgyoQ62ehe2pxy17/nEUDq0uwKjUbFX67XEeUBCE5jzELSF/H9wzhwo1xpr6K11zfP7otn5a0DKu6P0c39LINDq50awg7hW4c2tFSSP7q6tRaFJfJ6+8VAAQYYakFwQk418J4iNFSepeD0IpZ9MHVK9IePnpbInH4z9h7ZDtF7fQJ1V/aM4O5Nkx5q+jnILYJdE/WrnRGZJ2xTsiAv8FI+PKUr50+fldvYH2VCI5VCY9Ia2cAC6GpMXBESo8QtvlpolVvX+kk8jar8D/GEGHGodt5+lmtdm0fDztVURL8/U6nL2dYvGsYt1Ncl3ZKJlNnoNwyI/nemaXxDFstJocRx8XdjqIBXAZsUeAyasSDPDC83BIF4rIJITy+u5bUd8G9dkZ4PlEddinmP34Pr/If7I4WHHzepj2LN4ySTdMccqlLbJCAGvpjpf13jtGE3G81Go9Gur7KPLG4hcsvfSXwywBC847g46pJ4/zbnmWdTpmixCbKTUl5ek0Qu+HiKTdFNUz/mvJ4nR/oj/H7hK52susTsCHY0imQhRnlU3DnxLbJmVmE3aPtCrssXNP6rn5boFyypMrzGicT9FSZ2VEhNcXDwNBQ/AlJctL2yqr5YYTyR2DQQ7pYcQE1prEjURF++6AmbRRFnqs9SiXmxTZrT0WxU/tigSt2uDauWeQ9jys4imUhK9CwgNop19i/atJviDq2dBMAPi5TpiXmOAJdWy9nmbkpu259IXFDFUqNCZHzTFDS5X+iOJGvunMvGwMYuuZp3EuqWyhvCmRQBSaBwU739JOT8HJZ8fWrO1vQ5yNrkpOkTw/4RoW2HfIMx0d+Ynre3/G6+OTODOb4fAevurJDUNXECU/p8hpufeFftORPa3OzN6kKyllZaIbqZuMttp0sv+0xuO2mr7nWz7STmFSrOdDMQ1s22E4zXQH0AFLCktEJ79Vnv4rjkn9SRlBR6qzJK53VA32H3FlwZTfuJhw5SN2+z8xhkeuigFaigm2Wz8jfeLyQ0XV6Vwb8ya4ocaCSMEz0cJQCJ5THuSedC0tiDIIPPSHwIAvhOLlvJTVwLTJeM+2La7drpMU1n5vIaOp1OVi5fMLEALJ4rFuEsuKRo3XQ3tGw4jXN+SVZeDU7ly7xN8rLDf/jYkWrk3NmDLaIJb9yuxa9R5MFvEFttf4igauk9cgOc/G0+8X56NCRNmuEXG316INXvm4BzAItoIiKeh+x1N7dWe1LDu92mALhPES2ehUQ5VtbZpWeGScqOS+xMZ9u2QhD/VA+o81C1J4dLF8/KzKbvCg5xVwWE1pLzM2W2s6USBP9w5IYmkJaI25KJ5kyLGGhws6qn1U6DYVOuowx3+aEKJpjU4oU7ZSiHLC0CN3bKeKMtv9t3JFepF89uWPNVn56HhbiJ6vfGdDiJmxG1kZkDWecRiro/S02fY3S7WdiDvnAq1YeO+okFi+It7YQc7svQkWZMrHzCW25MiuecDX00iXs12RjpoKCjM+GnjB0VC4huirCUJCQsK6NETgfUhC1I7VY+mNdIpo6Y2vlPc1wItwX/lS3RO8BXNgBO+JVNid04sp1GaZWR1Du+jaU3GWvzMrE2JQLWkswPHGFdLDohjcqy2r1FLB2f3ntVhP4BC25hd7ux+YVOZ6GGLq3ySQc5cjpqoIQV/5KMGrA8SRNFtTHwYCRgTGJyx5KEgded6s5dEeV44h05PVIZdiYqUTXogAQwen8e88v4eTyI4AHqg2BNfPbUmZpkT4bZpWlaruMZxSSu7hm7KyMeS0jIRgqNw+nE6u2+gwCnjgnuyBj4iR+njyktCb4GOk0ky3ljoK5FwCVBaZWSBTJdlpgIzGzltqiQiRyaGc04hkkavHmy0gVaF0dKs4MaogauXNUeMhrWmVhiGL9Mvvbwn0nCQS39R3JSACHNMKAToNtMK8BRaKpT81nU0hPX8lO/Nf1fHtgopQYOcG9GmqdUiYcRryNrHE7bvupsfHKHbgazZNdIoAceltx5E9uK5vnu5Mgm24YXeONwsMH34eVb6RY4RxqG/tlkdKyirKOxeuywg9mmBgk4tLRCva5LUCJAMmWMZQPmlAuseeYeeOenHtpqvbicBpVKS8KIaMFYxaxC7H3qEaY2CPnDov+1YD+1aRCRKrxbOWUrYtFWTO9hTM2ZE7Omn+lkDAJCWXAus8+ICsZuXDTs57OFxqSK3B6NZOwRPHeg31ciBgXP0z8gnye5TyUSj2EBMhlO/zkfi60sud+fobYP6iGbxeJ/LtN5f5da+a8l8jT2VcT1XvrLdaDPhuJnoCkCTSWWAOdD9c4aVumpB5qeyk0hetQmkJ287dl8FkTCLKZp9X5SLCWx+nxPIr772Qzkzx1oXDMrf6Py/GGrvRqc4ucEgIOeBYjQaTiTgh5cFCQDITGZTIrlYTZztg16EitNwlKtYufSF18Ka+C1dstqxN3pjRtV+K/oo5ItgsNqWPpHdB+VC5i/wKaVYph+iMuawJMb6pa6d3TR+a2KzZ2nUxJrUNYy/4ygKD1jdnTzoiKeWzOZyRcmtq1o6kROBYgIPbfyiI6LUMmb9EG0RxSS+cInE1/oUiOoxk06LtfsEZ8zgAnF7tZ0Sn4XnOQzend4IMCU2DuYN7rpAk+kHAs4nMlZKQrJRFNF+K6E3y+ApBPUzDeXaQ/gDI0hd3nKNsDqtCSgE404RTDqVGHejPt8QAjG/w1n+urXD/EuO23JHQe07zngOcFz3UhyTB43JqqkB5KRjjMbQnME4I58W28QASYSb3XaU2f31a0Yrit7oUFFv9/la1riCaQiTuKKZOoZNYOiOpqYSVa1otqKlT6rRu1irEuFx86oZikqY5amRzU888xDoJgAn5UuZ/QVXQSo669rlpIKGbalgRcgQTDjvi2+09mjFqapdn8EhlQguAUGD2Q0SyioFsVZcWCyqpsodd3leyy9OjAqJHwy7A6DmosvBEm6yyyTYEW8hujYFPF4UBuusyNxhLCvz8xgAJvgL+s66oDI0tPWJzuN2YlWBocRRCnLtAzOC3LJ/OOP9jg5vneifVsB+oZGrIjLCOui+d6cF863Dpy+oR0r5dLCmmieS0jeXODHmlWKjh2o5KyCSsBWJHBVapl8YzDL7tx7r97HTPPrQavaP+hW5j2nNI3y71O6GcW0dGD1xcZkmf+Jb/zZZKViBlVQBpQXzALwSqV4E9FnpK5KUvhynU+Fuc9zCfMdxsGRodoYNE13mKncHg0P6CIi9jQUMvfh6OBgTcQa8US6L04hidV2gjPVubfygeEujBVmK5NAeE+XVshx6ptqXtdD36qpS22u958RLOKxOEgEOYxaqKw8JrhvtoUfKNFA/7BrqfEe39ZNNZvzH42hXbFNhbhVMgw9EHZwQjZEWGpgqXKq8jz1d5XGMeaZWdA61SDnb5E8vwA5ojuMAZ34jkbA1fqTJBw7Mtac12q0sRD63rrseCwWEssayoGdQwTFUsSJdBgWuLASJIMcVkpmHsFmiMU5xykAr2GZOVCJqybg+NHFNk9vvtYDF2ypPJ3U8+ICGfIZ72RzPSMBM8VzFo+1UC3QYkSg1PwijQ/sWzqwd8m6Xmr5idOBu9BRZWpgjIuXVHGSBT2i+rGUSCajb48boRtrxIlMRN5XoU/7hsL5lOvKKkozc1sZzjadajHwQNnYbnI8rs6+24eGI4nN0kAJiDC/m2MGCaKdHwWZP++1nTwyikTV06YJv+h9r7BUc83ZU8790CLiC1LNCq6VpC59329a3s0Y44f5Rm8qmJWn3ZeHtv+3lrU63fTWG8GTvME3ye33SMLy5I2aDqV4obRdxdvHYRk2HnY17RJS/aDMvmUxh+0kWEyFm7rDCkqJYWGaERPdhizG8+yEkMwaIjMtz0fkIRzLpTizt/I4CnzgVDpT3lCTjAIfuLb18XAcTVKuWd5i9Oale+8ru0/9ZdubMvby12cFp6nTda7n91Y9+lU+LcUBa2I2VZ8SkpLQqXBa4k290E+oYP+y3CRX6ETBeRuOEbnxQd+7o1vANAWN/GGR/Ep/P65mRD89l++RiWSwryhLROS0sTrinEQeky9b5SOif/UkQQzF+yNLSC4ROpWeeD8l5ttW9HK3FUABW0IkzH2eY/FvGOGT21M2YExQZk0myZSAm0E8OooHrnaQnsOaClHSflDfGxB3oZLvW+vtKwj3nhStkYaP+wFgK2qjIFbfxyuPnlIq4wG2tXWjbH8hFA6j/up8/isnr0tZ/jabNrbNXwbrlnVk0n1fA4es3Fv/eXXbmJVqjqUAsLtvJMbjWT2geWpSnBFpKYsWmQZikNSLTGFEKL1Y/VXKd0kIq9q7WoAWJPQ3Atq77jkaufomf5nWNFrD3dYnjJNERp/13RBbTl3FfuZkGEQ/VvD2F1GVV6HNzbKBfXZTPsFODgNt98nDKwNT3nHwuA5IsP9h//rKVSH3zpKv5oYaF4naV2JfK6WrjZnoVfT+T12KXhu/7Aj8bDUHOQlAxeQx5id/6+DZQZ9e/oNt7KoS/ckRsm+xEjqbwTm416OjcxkOmy0T3QBOOhq7EZiAdEQBLcZ6a1O36mq1YTTtn3JjtH96D0b727sg3r/hhHj/2naI9zdbALzDpEM4liM3tnA13yuzhrMgHOJ+HSqFYkpKWdx61rN3K/y1zdkC7xAtyOpwmS9MzExbY2fY99HNbvRsY7iTYf9QiYbUy0irRue/Aru+myR90jlgf6Ohy9YYsJFcCoL0Dzgz5hJZbfAxYj6/fsa9Sq752IKvz4/J/HlCcz0ikobozMNm7Sh6S4kFHPdNf8UijRoISGDlxncItWO9RWSF6jpiOK42KAI5sBiJPO8QyWP/bI3dmB4vhb0W/BBrnZtn6gxHpLS9jAGRsMna4F4CRVNFKTXWR+tfXr2Pa9+HC/J2ib/VzJrTEX1UM/87NvEMIFd2FVRDUF+g9tBr88LqjC5fZbzg0ZROStNMAHtUySGzijaTaj5o+Jww3Qy6I+eG3dlbr+rjl5qpwIbMS8MBsXqTLP4h2hMziKbSMpjnBoG2OjZkPh2lBWhpbUXWXMw98EgMutQcWit7NpysQFfKyq8mEWxDJxLCLJIQEdByWCAUEgchFRo4nyhc48ytMpgtwVA4Dmjo70AOkhRDNAuajTx+s6EG2e5aN2olKQxl/rTF62VGy/xwWuonMTWxC9NeNhpCg80FyDO4bmOZbyMUfrqIwsKycZivUttAIdWh99AgesNe3UtzXVTeQINUTrNUIIUsUypAATfQE9kXQ76vicSr28mFmA/2k5JMDp2oaVGGTpUcLITECSM65c5S0aq7iKVq+JIXFzmXBRXiMYAtglmZl1DHTsK/AIpcJrl5TDiv07nN94kmMMtjksF2CBTwxolcjsCKofJKtUHKzTuk8lE7HJVdhYn9SbRNOAnZc68CqtgUTWb0P9SwBxyhSRIYmrJyG7tyIdJLhjnRjzhw2X1Rv+y9jYvnZ/sthCoPc221fsVYBtdQGjBk+E1eCLXwP0TFGGRJgm08hqhwO6F/BnmOBiwi26amNq3kdspwB1RcXspu9Nv3vn8FM22kPjikZUOu8dxOfRCtzertY8Og5tmtJHM327wT+pwj1bU8U0YtQbqnoBTkhvl6rNLiibETzwqAQoEJKnu4BjZjZx2Jh7FUeq1HB1gfMiuTgs322Rn/YQe2nDCbARuGpP8HO+YcIJ1FRWFHmGTxzpgABte/wFvvqk0AvKsG4QquafAbntMPZ/TSOkKIW8QJVfq5rRIzvRlKOd0NMAjKD5pJBr4yJwlvq/2T0BYSXGWgJTReNX2jhrYeAuY1gtQLHf0g0jA9B/MTDZ7BSsd9bX8f5BN5sBImqaipzyKR/i5j1oIJVrvxfWXnSt/a6zo0MnFgR8xP9KabLRMUlfKcr8HjLUKUi+6ZSpdGuOlZw9u+ojN8/8V8KcnkDorg8wasuur2SUfuzMFhvukPnqIIK+8qve90dFARYu/2gu9B3R0YRG8/BEMQjqFntHTztPXQO/K4xEnLXUcdhZgyUkU8XpVtSzOUrPcUpyvhE6w73w2aW4uqFsszy9r5jxlbMbC8wb15hHa4hY8KFyN/D6rccN88atRpQ9NhZuZ+XOcbR6QDQ6U0G+7C3mR1YnQgQqBLl8L10LFRbb0TPc5hm6abVHE8rfZeeufYofGvKMveuZZHflHbvFpvTxj41mPnhuCUD3I+UqV7Yrq5NKb3y3ZNnXGEsxGDbCk8i1aUe8Sb5pmQsTJQmQD6VBmAJx1E2AwKVnS7ApC8zvIVnYdvUK1hVZLJ4zZgiKAB/yLCgYFRZe9dawRhLd9ePHhqnzzkRy7b2dV+raW21+vF6fQ127m9269d01b6Hb5gOM+mvo4Rl/glub27ctceeaN20fQOAhgCm/OSnDvj23Bj/xn3heq1HP3om/zK091gAJvZmL110pnB7RY5cbnvcRCbRanEf6kZ0rnmzexCxRnS5xUUpwfbNtjHkQNht2XcwbZF9dirT+JZlPqtx5EjOnnrEnAcAoAQxukvIS8cpb81c5GnllUnISDgf+sifIeNpULjoaqoCuMPdFwbj1QjGeLz0tKdTY4kKzJuX8Xk3iCRur5i09ocHOJepyb1sZCSqpmPyGUXw+kUaZkbpmPgSeo9FRWE+gV1JUUWpqOMyK3z1pMfCs3K02ZqsGHYuNaQoJPOzUXA053gE+KrX9FlAvac4ChyffKebW85Gbr7VVA2ekgkZ7A0BPHZujapUPP3QEDiWA0oMc3OmM0Af+F4XwlKeb17lTPa5hMDrScsvoPx403rMW6b2BWFPnbwT+r0htWzhv34xGr+3xKY1rByzTHjZjRjc7pfJXYlbJPjS99aTmmSK1b47jPfJ7ekxNTgfueU606bTeBHQEjv5B1C7mIr0/3K7qd23VZGcUAYm92xdUtanWiqcEDs7UUw9/iBv+R1YYGXzvJTWGSE7oVVuJOYS33Ur9I4R4FYx0sCGWlJBKyC7aMlmgvH+4MABxl1UimxRZ7gkkktqNqWOJzGfA4xB9YSy0cSgM6e4OZmNuvIgO49IRZLwEY2klFmHltYsRXS2n7AEPSXX4/gaqJcXurNi14Ua4WUmp1gk4j++UT4tXP1BQUGR11+luOkm3kTB28QAgGKfY5/0TsraSWLCBpOfYdRvJwwv+X+1KXtVb/JdSlNtt1bxlpgIp83DbniGg4/L1tD5HvMbPGCKfIkGE1yifXAmnxeugSRCWGZu+K3EAP+pzqIoM0i6daKndthCcJsAvI+G95oAMfheaJ/gBRh0c57njI+r/5DUK6JkLBMxQ8QIJpqP9FuCHRn5Z7Y010DphbhU4i4+Ph74bVV04cFkSgns7Vi56MnZo/mZzDTg93qGJXETFBBpU10ZBUHzCnjszLDuuNZIdZ2AI4mYG+Fr/4yElBbCxudYd6UhLs1+8AMU4d8IyuAsgE3SgWkigojG8i4zF+r1WRVqaQ2I1YZRK6GwJtCIkuD99Z8ohq4wMEZFoApAm+Q0BCqdGv9bAOa5sgsrhT7bBHooesP81Uf7CnduWWYNYE8QboIsB5cMJzrnl/sN9jZ9u1efnvYJA1xUoLOsGaTEwH761AKEGEaIWaXtPkWWFWDsrNoWBvyomzbvV7B8ToonwNtoD+SxUA9Ymhnmd1PzZZ7LZNp0DqSJ7RBFYs4P2fC8HpIRnowERD3Ww9EI+OQQYwZLvbguiUntoB3rT0yDzMapMm4t51aJ/KhSHiGk6q77psmB0mdkjTQMUnvnUpppK2/m2XoepTaG8zTzY+X/W/i2bSbj3uDqYH+sGnnw584HQkwW8tLuC/uAx9uKu2oYTXzEdLt4bCJEOosYwKQmKzo+5gYsRLXK5rVQb63B0JEcmxEb7ifEfEiJB9UaNpUF7WZiqI55q4kxuWyo+n+J/fy9rz44RAwVognfOMizwWSmOLrgPShHArAkddTlkEPSiGU1Y/fkdI2xkY2UlyKNhRcv7s5tAgXLfhfPabBUbMiOUlXLlwuDnpta3rLRs21VfR4Dzw539DJkaokxjdp/EZT6e/P4f7Kp2LfgkD+26jqlH36z3XlAfRv9qH+z768Ed7Rqg8HEGq9ND2k7v6646VvZVVLC+Z4ZOlXmOu7uDFuRKVYzfWY5XmWIo2u6TXlgJjAyoKC1xSV1UsBlewX0fukvxQtpG83QiK04BLEmykemKV1Vwzi0R9FwWg5rBABwGIpGlDkJS6WJIRHnMEoQCgWkRHxdaPWUo0b7GZMVCAGz6obSjYN6c7qKQ9IKnnT3/EL6J89ztLMUQsvq93S2HVJLr0IujyP2++QwRgslrByI4J5BHy+AwZsyTxg+sZR+QfqPcT71PnrqUYkG+ir0kGSdOmYjTLa7JRkNgFjzPOCV8el5IejNH72Je92G2IZ/GH/0JVfQ9Wu41nebIfMqM52GnGkGoBzECRtOrBH3/TjXLxXW/azqbNDCRnlbPH0fQ/TUsVenzJKqUk23lj8bDmh6K898f/7gxGMYHQH/dOR7xUv9ReUGYNQrNlqZXMinKlfrA1MGY3Ed6dtq8t+wKZYFLrizU77Fk3vMXi/1RZ/qtmbIwK46k5telMP740lYreWHyzv8uOgxb2bfrJCne4JYP857/VWdTZVqn3Wukemfx0MrHXxbot3T761A68csOccZnNDl1wcgbIIvRzP/tvPZ/0atBOHuP65s1aX686mro9Am7b94qw6ql9gYyt98f3+TJU80Vu0kCNVq9YqH3zQ5q26W5PbW+Wnmeu61KdvuMrJvAK5v1w9R1L4SywhWzyLvkjjP46FO4U54fjGBYE6kdRJzaMrvsxh/pj5Ib+37SqPyD8jkidH0AfjPZ/txFE2FZssGuNny20mO7aHiNTz187rudlY5pWFMPL14Qr5wB+Akw6d7AuPO3FXqXHNJ6s0jK5JC/AMQ7Vn7dzxzoNZrWDGE34dYDZpeBEwDk9HuhlnYM7u3lt+k+A/TkPgUUDq+MiENuaQTs6BhKqeQX1qwI5CYfPBHDPtxaUp6hXDz8u0OnG6SasA7a+ewR1nWr4IMs92GmxmLN8Q0KOizn9Zv/OH0a7s3WLUqeoc+Z4Z2Vhvw0kSxJfLnN1YqIGiDl8nAcQS8sM19ccVXRpKhLj8MlDSCDkysKhDzYn61P8M/UDxmaZDpaCG+ZsYNhRFn2XRAEJAiwsG6KzfQZE5lN+HwwLn5se06HkGXQD1BUjxCQeJAy0c4CDbYraoOQ3R8E8e9RkwDHV3p6xJ4sjxpgI3SqZ4lcWrMq/zXMoZVmY9blaRVoCrpNAiIzmTrNZ2OHgK+7ZtFQ8UcEFo9tMT6HnikTOCu3BRCQ4l5NB0Xq+R2CB8g8KCXZ1ZQjhqQ9esbsQjBybLyYcL7vy98Mq0dqzLklChPhWWTwN/oamnBJOTrwOJebVVQXQy0F+34P3u8dHuAwvybjUzZSqDgzG7k5N29BWwtN4oS19ItXZWy8qJM30SByzVxkG0Q+BVxo3YghKUQ3UImavJdA6s+WnOLV25YOYFztbp+RvMN4RdUuYPDSF6c7JO+5Z0owSKkSa+xcyJzIRrKbzOU0ylzfSbD4TMua55ETeCqiS0sM+lREquTh/KZOXsIonU+X85HOkK5jMxIEnNF5daKF4oDWx3Ng0v9UCOWYpCjl7e2Nl9sE9UfjljvmPC8o5d+ZqVe+Ipy9197rlEOO0kE3sT+/DeE8d5Y5YsEsqkgHv2dEG6VzN6EEhJuqttw/BExjTcpFUE/dpUM2SmD0nSDp3zRJIpDRKM4EnbrI0uAWTrfulbDC37S5ZeMoBaYwyT2grdOP2Ddb4sWem0XlzZX6as1IHBX/gr2hdjSqXaHCSjXDI6WlfmDNVi1EKg7Xc919pbMSdOA59ZVno0kx47s/wol2Z6TqfEf+BVgfNmKH9w1pngIXjXI4OX4LbPTKk9IxbFi1TlaG4F02KL5GHLsyLWxSzMVOJcb9QhgvBAQHNOJabWGHwKlcfndOjkWGq7CWobs9MJv1FvNbr9ip0amLmz7W+PZUYDKRlvEPn0gZAg6znLt8864WgqJ2NK5fXlrY+YvFvO2XsSyIQGTmalbnqZXThGEb8v6qcbfJK6Mcp27Qz/Z0DUSjqxWczv1bZOddo6omTq5mhIrKLw9m8Kofi/u3S8TZDGYISEUsyNv1L092nBOnxO219QIqCi/YhCQLC5tMggbWBhnvWLojpN/QuL0AISCWMyy8WoPMgVpv3Yk7SWVQiPT41TApJcnYEAJWFcQQW6cOf0DOT46oSv8rG9ZcZc5shBkqypqZsuzLB7p9brrHeGx79+PGRYSWjB/VJOvWdrGnbg5m/ce26m1JyifY3X7h5IfGWsaVaVV6mh2BzHP6HMHCPNKEs6tLkHbR1gEe8m5kz+eF5GrpIBKyel3QOZ6x7G2Jxa5oWJspTFjxoeMT9e6wdFDgSmKKDdnR74ROCpyHXkiRbyNq/hVMKY7/uQE+3BoUxTjrs2T7Fhbe/aZOsHypkOeccy+ND6mXySXthTEt5L8KS9fSqMMkwvxZgEKRnPAGgIfvebwvJcMe3JIA1EucyFjPfoJKYY1TGTRy/OlW+pgDADXgzq2/qH+198cSzBrQx8q/xg/ty3BwYqevB8lKbGJ+x1HHN2FYNqKB9x4KtSq4l6TD7RzTb/jrqZv4gJ+Bw7CHMygxTFi2D4sYVXi2D9VHlQ92eoAWVlMBaH9wwR7fQwMOp9L8eUvI07aFt0R/lEuzXWXkW/xiPjaPfIjTpmPwn7BXUzejDv2o7vJOpUqKieXlTPQWh6BRKXCZd4CuhJew+B3TUbpujO3cCMi/gn5HLC/BmlSwqAm3qObyBs1qI8up7VTmyyjJ0QZqinTX8qzH7QVcqPh1fz2l+fBD8HlnYeOyhBgBmFqM262lLDXv8gM7c9NtI2PTLmbut+fWOvvRUHkE83k1gMhpXgZLqsAUoZ1nyP3kxQnN6dfg/Nhan68TiaK1FE7PTgXK/U5tKtC8OtU8MXXKc991XZdswNTeSFmh5jImH7q0s7z0GuHBY91KjEmqmUudZrgQFKhE6AcJvoTSVBUmDR2Yg72PkoE/u9hzXDEFeavds9tQiLhlkgnWct5F4IdjSB0Fh/rtmJ+oVK2EDu1z34Y8czxer87H3KKikSCHWS1sr/Yhu8VLkTRpobJ9N8uU4zl8G55kXf3gCyzjmJu9qqKTGQ0CESR9savfdrOJKtNpRE7wp+SK+4vUdwwAQlqEZ6M+4ywcRNGt9KomFa3tY/q2ON4G4wnik/i2jhBE4XgMB1ns8fmgWyHf4LbTMfSI5+ssEf28oxckT8J72s1tcx+57gx9V/kUtynXSbcwFK1EoPc76j2fazpn++1rhV1wXMz831BRCeMrT1FHJeoCtoTnpnlrFsMCdcHC9lkdt0WNSQ03adbCDJaudjbX0hUdYdz7yO43Qj1OZ6iLYjXRbb1dofoR/PldfeT5zR14dqReE6kyMJ9zaBbjo8kU7nEM3RdcdpsaaN4RjJe4V63hgPtdcxyp6k6v7jo+tVVsnybP0MK9Fhwk7wwler5I3JaLvLKU+nMnltRWzZpK9B1tU3H6Slq1lRcPAV9gaxZkKsijw4ip+FuzsCxh8Fj+X0lvgnZ0tSNW6Z9swG5r0LwVRACa5uvCq2F4MhPRZhNX+JnqyioYOIsFp+Q1eX0VBeRFgtWGanauj8ToDFsRC9cTT/TxIGwUlAFfnoU9IS+sD7ffJYaC/tPtwsYpbj5/M4ObXJ9O4tOkd8BVcFkZIp3d5i3x/7Qcfq+DVHk948KtmV29o6xJ+jBiEUXWdqfqtPB98m/4tVh07rork419sgrviU5YcTZ/EMXQctVxpXfyhX7IdOSbwzusMaTtLGDmdy454zfLeSbQ3ybY2gJz1bbpTtnqxNLD/mjCSwCNFIRK6TRLItrttPGD81dQhYrV3Lk+wU0zP6Eh83+T6rFyrmh3eAAWc/mqiVKiGS6fj6SnlUokALVbNnztN6xdFJ8bqVz18XpAaFN9Im8lx0jBB/8EguH1nxWuYoNFkn62TCDNdUhw2RRrjSc7wt7HF5umGtEjcb0w1bjYQ2N0smw0qILyTgsWMvw9R4jBD3vVsXxAGhgOG2jw47f/fEqqJ6MRpGdvinXUeEJ9qP6lGvQlNPwgP7iQ6V5bvt6f3QhiTQARN5mSjeE/BUU5P8LRgeO5ZoxbF6vswRVJrIJUTho9d0cwSgiCKJiT3qZ3dVEoF1RD9ioRgkGh5aFnL8Oej3R7zO6zyZjCb8w5FhPMV2NZ+TMNFdGWYlUxfyiQieYR9/birx1+vYip2dHbNv0Lxi2s79gjhwSjmfwYLY4qCawieYLXPOQIZy0PDrhIW8qVSwuqVBWIGkBkkM0Vw4bV17g09mC5VgIxzK1hNYs1ReZroZNffUJycb2ezE7NAYFvhXyjLPtyB2xXNF4lx/nu2IURhztZ4omcuQQEHoFGpSFB4qWuj8GbDlYZGIzLPoHFNsAdGWolKMW8vcnGS8Kimdyam7nMAMUOTCosS9SHQYo2/9vDWc9DiJyS6Ewl3AaMtcc+DQhtiL4QvaAxDm1z8Y9VZz8djoaC1VgyeJI0X2Z/KJum1d9MQyTmpXbBn2cm2pWs3jEpejw8MjMuf2QkUYNzVeXoekA2E0B9oExXdVqe1LyydnP2dlk3/I3xMyMTPO5ue4zMe4m29g1NdsS3pQNl6XIIgk9yQ5ToqQFItXdmcy+UgCz4+Tr+ZDUu/fnGE3Rg6hL+O58TPxXDit+61GhFy5L3oMUMzvLz/9vewe6Afup+n1e3jW49O8912vD7O+uwD5iesXL7QXXjn6QDdjo3/epQ4aRxs8SBdvfpdGivIhzDaUOoZqmSqar05i2mxOebqJ18NDxGNHodxkMltkN4ZXNF3TCtE1wDRpzTKppsEqGoDdaNHv+3C5HCqCHR45287W+W1Zbdi3ih63a2giEsmLxYqjV94LIfmoQfCKYW762UqufOtW1064Y3yHdarbH+9qK60n+h3T0Bk3tBgVjsgUC7jk0igndGNuVoTjZBOqG1VjngyM6vcpkEnilbXA4xs4KCn1S98PGc6WOdtVJ9ccGLSP1brBGmqE5j9W16RAQpIdT89F4BBHDRks4GNDpCJRW2K4JN/1FTkZdGTShok9lORYpiDgZEyDkOoXTf/l6c2LCLKCaN3ps36IyfjKbKNjji4U5s/Qtpx06HHVDD9ZJ3sSJ96I6kHkY1Px/VaBTRj2JalrRJgNrHvGpu0YWOQ93jrrxip8pM28ZSLu7tHa5uV+wORPdgk7r0dfUhrPnv30XLzU3EeRJDQ8FKuJaWXFZjN/vdLGUGi0SLb7YjDS6DbEjlW6vpIYt3P7wbK0TNOonxqXqFEe83xfUObRyufcM8Uwnn+Zucv2G0QerebiQ77TBEjvoaEcounGLH9BMV4n3000i5Ibi+jkAttdJe1FSjUzzuiVgg0rzapCUB/JXiRSusZSCkRCK8lNLe2yCbFzAtrgYoxSDIhWRmVQBZ87N4u6gq5J+ROrb5fbbbXCXqzUTaWK/Ypr3wzFKytfm5WioMBbOUuekhHGEthXpINSugN2CxB/26etFxQ/ZshxMsoFc6rhnn2/WAS5QHmaZquzqrrCydoWxUjKLz33mJsb+8rWr4xBfiD+rDAG1cycCPUZeHJhoSBHRL92q2y/AFGsrulaXFyRRCxolWm/SuIUGV0mKEEvjSJGYtwXE4Bh0caavggNDIjpbTKjbF2C5Yl4JOz7kuhFNXjNw5AxeLWTe5mQ1wUBueFBhTE+XjKf4OZflsbCQmWaO2KWon7z1oMpx86MMrNqgIvQIA6VcvE4XSeHN9rzsA31i4nJIGKMQ99ox/pU5sVkl4fumLUM/SkEpisLkonFB21EKbL11S41hzHRLRQArvwbznxZefXxkuAqEgGxum+N2qQc8kwTIKQG3/I0QeWluT0CCsTx9lSDmLhAfMxYJKYVaRpuLkvcSXzuUoQCoPdA31CChv7mQIWR3FCP470cKrGWG4phspfD9QS2a0AMztufjA+Vf6+jlJftPUmahAngPZtsF5vBAbuOW7ypvNeSIsRo7Fgwj1HSnAhmAaf7y5Lc4u2Olvdj3B48HSM5YHxjT30kbwE+ZalYPIxgLPpvvpARqV+x6EuJMwvnDIyNjoMVcJZ7WRKxBYeV4R5BblvtGTmrTdsIDalUKCEivqgGP1qwXQODaQVFxG2yC8Sewj7VJ5aGmeV7R8h0nRqvIKrXKhF+pvzrmnm5letgiSerQfs/2ZgjAfzUKQK3EG/GKCTi9ePIiduVTJ+N1Px2WU8xbx28nPNfPOwvx5C4AU3KKLmAtBRXf+iv6JeRUZEnXuobIzD6TXyXM314N3SRyTyIzmH+1kC+zLsAy0idbI8xxz6BwB6fJiAuE9Rt83aimiEq4PQpJPN6n9xtcsfYdL2FtBUoiDoesLeDR4gcR4diZVamd6JpJEO+TzH0+BAgkNDbY+da3FrsPEdjPHqs/kCxOgOrSi3A1cTfX2DoqQM4gKGZfg6A2oaIDORNFooJp6kD6CkNdUWNtLORAnNZMfKNjEK1ozcW1zR33zDrR5fTNYnBeo3CBUEwH+980KCWn1un5ECcxFb3z9yf7P2fUc0WcV5AVwGcci2O/dJVjJ5P7bcD2f7FJDkn58hJQmpmYDUNmyIU0aYOWXjI+Frv9CCBVe5PLyY4M9/cLMg4zg5rrDLi+h4mp74gJ5k/mmVFdockzhnVTGCPQhCJJbY9s1SHvWZ0RjXlr744kS7Fzxu/PDE9Po4wy0fGIAg3AgF6QEp5lq9+wuVwKWcf1Cxn7dlZG0wuJLksH6sF9yCXxi3ePKB/axfO+dL5e85/efxjKjCuMsYvcTGntc7h8rvBq6KTEr9nwg/ruhaBg+DkSxa+lfFNJsBSPOgO5cc3eEPmnnlbTfSWypsNI826+QCOo+dEGHlhuf6pM1yup3dmnndyyBFGPEeaVz7ZxLi/t00Ts10LXLOoTvjYHrBzsVfdjWSdPNOh+9IAg1flALydCKowNjTf/nQH1ci079B28Mi7MD7UrwzMBIjv0DsgBAi9kylmryOvKgmiMjwC+w5o/c0g9x9+J0IYwnesC5IPum2iSC/iGZy90+y3A5Cv4XdxTbAdD/AUydj2b+5nDBMQG0MpzLU2N9sj5YhCxlOQ+D5fLRVbzcRMfFK+Us/xkMvRbBRRg33uHFxUvkgpCp85RmGxuyJe4GKmQTqR3bNRNLG7JyDKPb1zTwkPoQMQw/EngxsZQAIumujZWSY4egqKLGk3FRqytaPq/TN52ME7jYHrVX1wL99JnwwB6/8LeFb5eNbeaWz4Rr1axepmm//L+WhY2mOHmNTsHi5iDOjqQiqsfCa/4o98Z6u3ZS/Ka8h1u/52XF9Ih7aenmKCoAwH+mTZcOFHm74v60GaffPACOOsrCfs93jInK7Vi+G5O9ZF8N3Y6QrLIVe43N/oBAeAaszMe6rtnNlaSSTfer57T94UcK8eO+d4phKwPde6mHHee/3T9aD1yTX6bDK4M0+ODOU9ARn5QO0TaoZqIwwT+EdZv1STbqE++SberA6vzSODz0NCz6n/ekwedXm1+d1sf1MfAu9hvWGXpe4wx0xUdoLAM5biLIwyCuVzZFQBcudVfUXdA5Wc3WwAMeC3eqJgWA9hKmh7H5pxGml1VeNc3hoWqiJM/rrQtED5VJXWWNlSVYe+RgNn9l1z5cTdF0XBzhSzNatWMN/LWKzSFi/G73XrtcZrunqFnUL1vCcH2YPASrp4GRuizOffHAnmSXrz7gGA0jf6ipH1jZLSWf6GzpXtMXS0v7Z5r4i3zppffYGhfLR4beNbBMB4Akp9evxs88j+RJvXVpf7hnLz12NzZHNxunblW5HjtyYRjo5gn29Vtn+4vmzrPwc8HGrbQ/QhCU9lEnFCDpO2PZlK3FycHmCexExyseWtiOFkMU1oHfdvq3fR0blLaQbqxKPqZIqVKjteGNKLyxi/JLW1eEix7xjHVbizVWBdR7VrQ63qhoLm7PezAwaasf1PmO1RU4VDleJ3k2+PFgtnfuEfeUc4UO+Ze3tIrr8uJPX7F98VNsUhFhF9CBxkNCxxHz7kYBaABGxstVVNQlKTuVBlAoYy5kGNMVKEueJI/HG84WwIQpBRv6amJNJXoyWJx2Lit2hCibL5DsOaVhxAKD/8HR22f0b3CJ5BmFF9PEdE9DIcwho6rA9lQJBm1CQiA40XOOK998iNRvqXpplm8+u3NWC86nupFcCCDEv09XV23Fymz1jntSuYn/IMdghqE4XgtgJeND3ezzAzT5ODKODp+r7aMC1Jh41mS9H1UqARyMdvsJuCT6i8zWnjMhMGwinYhgcUs0fyx54KWDzREseYZcds5+oabaPFU81coOf2h1DM3CEh+m947iTDKwwXiQiDBD5kbO3F4CuM551iipsQ4U5JTQMWw2RUIisYDoLGjLmwGG8w7cVgxBg4OcH+18/8XHw1IN6j9LvYpijH+pOgi5LYeQvxaqVxlBltKLLs94Dm0zxcR5EJFd4y1wfp8WRUnhjzUJyXMK/06CSIp7Zuz+UfQKEKAsSSIQHXWAy/47qVn5aWHI3TTumDxhlr1bOteGlraZD23vOcf92dzajRmyIwP85eMuW2WEbnjSx7c8Dmcl9lEEBWrvoVksHxknmfZ4iSFP4aEwzOTspf52n0CI6X+3cCcb07WNrIHEVEg6Bcoa1iMRoeR6OSKLakEI2KUnPXwJKqVMXL3fQ8G1zaiVH++ZECMnRUCYM7l58LYJLV3FsbB9kssOpBa76jS6PqYkRsI+NiOM0sXZlpXKybsf58a0OJ2eXQeExxfnIW3QrUzoY+fIt6zIy7D0KK3MPJYZ/oYsT3P2HfEPCAh2EOZzO8MKDoDtLjKAlq6twiRrVBKu1736PLZLRdxZkrWEjmlHrAc//Z1vcL5QtaqQJT6eJMHQ/gDnU6p5nLheEp0tKywN1uuEocjkVCD25TvvbsD7Q+xKbxAhOT+sLNCW39aCzyUs37593SVIp+fek5LAmQL4Klp77i+7WvLu6EAuH9qkiAfoUhxeCFy2DS1wJF+bsPvBh4GfsU+BRP+duWINsbbQR3AUmwbOqntNGRVXqdevZrKr0qfG3lmcoCKgsuP/31937l/L4NyOVj6/i5wAJocNfTP2XNWZdduSpIfMybMc/0kfnIZT+pVjsJ2KcJDjIRmlBRVoi8kmxXNm0cNU8RpDMbJwPbXv2iqxx4ExLgLKjSuRuzYSlU7JnzpWVV+65zMTCr29kWhGZ0ORcTgPyAw/4c/FS7rnvSIbCKTMCn0UDvT0yOl9V0x70hyQ76uV7jTCF0reZpIPakll64+TpDEvjMUu7WCYK9mfBLnP0NEj8yVMnqWXj/26lGcSMdMIWKsAo88r0Wr2jRrc76mvXDKZkG9a4ba2VzuWG9VJNs1fENeIO1qsn/ATm08b3SZI/JJSv+s2I4WP1ayiDryDtnnQN2OAxuFzeTz7vU2GGTgCa9XhyKwdRvnGJ7dwlPT+ED+xU3v2rPr7fYss6ewAXDLOl+ovNXWRa+8Ni7ccOOep0bsI6zVm/Ou+lnxic1wo33KKvqItWlDMMK/kGW04MGW506lNNQv/F8udOSKz6k8iPRBjI/JE1uZL116sCoZdFTn0oln4yt/hJl2J5+nf1Vn3GX1fEYmgq83rPZ0oh62QVSbuDQvyw3hAWLy7Ho9xK199HFxT5gF8UVBgrNL+t1RhJnh4cTT2cpUOeVSvSFXClYG78EayBWRiLx6ANcdPbX2Mpy0gIj8th3RV2zcxqsOlmgI26HmjjBgAtMbSI2RBuL2gqOHFYAG8ShrkhgUSDgr6Kq4KjSr+6tURdrRwzT/10B8jwykk6IP52RpOBVDefQJuQZ8nyGYZW5vQJfR9yPsX2bZGmfIZA6YMi+BeWF0cEbofj1WwTtXCxZqcRdSrO6/hnpz7nfkIisxMOsfru2l08QEZOeHN5BJT6dC7bxmQRd1eQTMlCZbDVwuOBPk8PRkAj2gVvKgDRPQJ/CoREsAMcA0qyKh4MtgywZmTS9HexYN58tIz+QM5K4BH97Hh+L/akWTc6H30O/jTHOOKMVYb2vHlkps02/ImvqE61h5l89NKdKcU2F5T+izG5oNo5rih3JnJgQnVD/GiAQCZoyoDuJMwyzZ4I0AR7VjVrQptOpp0da7GsobY0McLZ2q+umDHJpWhFGzX2KuItpOskv6/uaEB2MY3pQn8V1VsVROUWN0iYnzC/sC4eRduWc8q35BDyAMobf9NuK3vaMFoXpWVEpgmouGs34SE6s+6LaFzExmXPN1cqXremS59iL4HvmDZ2lJ3yta4OqbFSrJe8x8uqqix1Dpc/dZ/ZRVUpb7ifyxFX62JT7zJ2X1rZ7vzgx6SAfio1ypW6a7+Ka0rmFEs19HbrOCgU6ExEALMTQudz3NhpYN6Sfru+sZqzBGmWbJwUNB05NGaEVMnB8gjTZ9HA2BZC2AlZu65OBcCZTPchbLSDfnvHgv36dTmrGSZ6wnFn1L2NgWUFxNpot/YtZrjMwI1Z+GmgHc4b+RVBUO6F1HZfwYjbW+IZXRCPFB04xbz7BGeopzpip/0MbeDSMJLUvaghsMfcKeZcu2C+brfIsl+7yjVJy1/njltD3W1lFKkcQ0JXiS20v/Xw3/cfu/Avv/N9TSbjqglPGl7hxpkbV1+ONufiMqDb9zBUFOgVj5vpWcwfCC0DY6neagCvaa/8xgcRjzRzP9WHDreLpyf6k4XceMAs6WTXNUbQiCsCK6p8rFmciEiUqHqMyGgHpdMv1mmCNR6WQ3bSlDcBmOmhOM+wWM8YWXgWGfjxQEANN+r9aAMsEKneC+cbP1tKQ8kkwoBZwISJggVBT5gILTOgDFTYLCjasT9zUE3sDJri8rWAoiQLbhZITBb+5TXELtGFQyAbM2Nk9UJvrWl9do95wdvVXkX97ba9oOg31VQx1BiwKQemHajn0XverKu+l1QQ3I+3AQ69mpQWcXbcRjBAUZ3KLe05ZvLK0IDWsjxTEHiSgT4AIZf4NR27FxnOY4SSKjFwG72n7YONE1tjZ0e0/tN++BTvyAOrod9zM6zVVgnhqfu60zKbW3LWGqqf01p2fPod506nf9uApHNJvKWwq3u6RSPAtHZY7+8j0AwMr2XyRGNIrW6WKLdnYFVpHrhNY+WZ+PEaJhsRfzvTMneEc9/2Of3IdvWZeBRBSzAW+Dd+CizQvKSuO2DFMYTFQFUV2fhqSOitMPo4STcZllWI3DzWkt9NbCd5IbxZ9cBADaTh/8TsdYH+UJJA3vZh+71l3ojT35VJ5cAZKknOIoqoDgr3gwYeGAn3YISpZZtd+kbDxsOqmV/mBXbRUS1YY4DBGefnabIMbiSQimc9c1vnCQRq7g0U//qLUBFcNLN1bYvISHjBx+eYQ0y77fJfMeLVaHo0vysuBBMGV/12S8NVQKjQaA5QkKiiTlMGJCBlSN9EBtEygJr6i4BLlYGdvEFTckS4ZoiScVsyHiWgWtVXuTPBIbqhlvvppX60igZPYA2/fgQD9FrdlKm1i7p3kRDKao5Z1e/T0Ht250YgN37ZcG5+oie/Yv+ip7ITZ7VqnRMfcmsb0Cnboev4OMVVshxDgUmwtd2syVvl42dWRO53YgDT9MDCFPdSReI9+3r3aqwMD0dcMbzICUtttf9SUuNc9f970X3+d0XLXH/uWWiaW158vfxvfuKedr6GrKOfNW83hQ3voJWJbZgOFLuHMPE5jMEcyuNq8aqv3fkiS5WlEUJzCY2Xef3w6UNw3acUvcRiX1dct2o+nG81/+lzsYtE3UvQ+r1xsJH3tVhG1+ILL99qGH1X2n8gdKkIz/WyUDhRSUGbrCdFkA68nDr76zTxqxsEOFEWt7MLLH3j8C/ezfcQ2Zq1z0BcoxLBTyMsb7mV+ATSeBFXY4OgpEdNDMeVpi3MlQ/WscqMaSCL3M9jmDtrYgx4pCZSLTFvY6NOpKcxtagwUpQHmA1XthhsD29mcIvz+xdlJiadSC/C3xjbNVzOulm5QpdfRSI2HtdXfmzVRN3Nc6kC/jhNTd5WvrlJoFMaE+GVx6tyNRzA/3r1+/NiRWhs+1Q7e1gJHTO7u5dvRxWMBW8Nk/U4KjSVDOYtYpTz6Ue3tXmn5u9rvi3AsVSDIkRQXCx9Uw4n2fpHtVa4yFygnd3zWL5qrQjMUAMLqsdfo50oILLt0Cuoe3PGsV2dMTiTyIFvIVuP8Dnzevpl2wGgwWJ1Y/gzp7JrP0Dzbao5o5/mcthmJajDQzntyTE5ts63mW1tMHvYzU7EkWQiDEfel8cqIE34N34elf5KRS56wuq3xGN0h1VFFKNiLmpOLw9lQOiZ/l/l7r8a806w0c8WTiYVXTDNBjDaFUg0RaXYtFTcFUxA6n0yxM62wZQaa8e65PV6qi4mvGaLFpjTLs780BsJPQ9/pUn7ckIyFTkswK2MkJjOWTbH81ul1PDqlIhVak5ToACydisduMk6WxtTORUeWEOvRJVfVqSFgEN0DNNmJwof6Gw+6X9rOHGDV6oB9tC7xS3Hf9MV+m0rHa6andLnKa832U8N5KssNs8r7KfdJjPlrJFHuhoze9oZy1XEziVSUtX8pQQpSc/7IPVtEuApqORxxqu/idh5/z0Pcbm8D4p1LUh4yhnbfKcbN1DFknGN9RJkyazw5P8BdDjvEOP2hf/q6QlIpePbLoztI02m0fXvNNzSezcoXNM+PWxbECwzeOmeaVgctfUC4IN2hGl/XgEpQehels4/6h42VWDuXKWFESs0/pY+cXBUjWJLB7HLpmud38G2+yc3+QfPQjjJcqQ3dPRHmNjlqiVLwC0xtiqGLAi5JwmVH47X8oFKwJ5yIdvckmAlQ0Bk+NWgMXwqAqgFj1dKgV64/vIYr+sLgAPX/vPfjYN6Dz4eyI0O9gJfLCBjFQuqb6VcnQqvDfrOrgs39Y+FiDQAT0v7v2jV+fWDw1UHWRSgSKHKiG3sybWU1+xQKdD5gdrPDAwPvZAIsDHAqPa7Plca8ARgn2OG5ByBvjiTdpao7ZvJgosyi2Px0sbnJn0qvJN/746pIH/7lWuUABBJLlcPUioOxHM9rA8ArEEwBbe2tFN7f71IyHqTlrjH0LLBx4cfD9YiVh0Ye7wvBo3CSzLktl71KJWLH6x+glc89Z/VW9aONXol5gZC9fs8Xw9e89RUwfi1Qx8/Xqnv8xptCovjGMliyWto/6whvRyF4zW4uytt9Ja59TxtvCV++P2K4G0rcEuGJ506++XYbsiRibDt66c5ghiZLq4d4Xl0iEZLlFcNkmA8rEeRnCwFlSTKA+a+LBPYg8oEUQiPwKGlqTk4+U3dGwQxXANMMoXyXA2K4GAn+AojAV/lvV15ccRMajz+/pjE+BEIATNAvPdFpUv/bLL7r+ODIY3lrV74YWinHQlW8oI7Wa2p51Rs0WP71x0vD5iwNM/EK7kYAAvvlvDkY4nBL63WOr7DVt4MLl4zZcZBA95yYT0F2/nlHNPD6kMve3i4sbbmjI0QiXszRo4cBOGykUVr1pTH184Kr0EOUrp/oXKs0b0rcqIzo7Z6KD5WmoIUdk/1kRDbnaFumvHwamddM0Rxd1Vb4foEuhtc6tukOjMYSzNQweioFGBz6GRWaSFjXLIDPv883n5F6rvZV9FFOvGUuNyQ6uobFLs3KMNajTb3larkT6zn/F2eqC3sy2qxDjRv+G6tPGb2i5aK40/v/kE7ZmH/DQC6L1FfUMQVEsQd6HFsQwbDiW7BNJVbmNexyITQmVZlyqw1z4qA3JXl/AOdO2UooP6VuWW2JHiJUE/pDjU1tcvsuBO6Y3bR7YlNOVIwd7F0qGX3okht2YKqkmPuilTHqXkid5e6L03aTTm/uVduGQVM2V5lP2YllC1so2s5CEQPlos2dHoV0bzFiz6sVWkiC57x70cD1pH7LToB9Vh3Li9m5AG+ykhU8iz4jx/2ib6rw7r5URkQi7xslN+8zrqzXLvUoPxW+ZreSg4rl5l3f0vVgIfWcwLH8wL+8MSVV7/RxTDronKeoz7h8kgT7QDgn8xcrrvVWqLZXHnXboIKdMH+LC8t9ICtUL4nuUW7pE6DibBDqnn6GY7vye5dwq/5h7T2m6KNWOiN2bfjpfpDiyDHugc/tkPZ0CTCNU1BIgV22L8hq4mcvIbuSiBt7LxujYyDlap3Q98lokYXiW+M9khBV1fpAyo1xi0lnNs5Nlq3/+h+XlW1x6fslWTjsvmRjf9VgIheN2liRdK6k5QGznROkrz6dFwciA7f7e+KFxXJpuMUU6VCdTz/7rDA9hi+/ObPSRgHtE24eVn2mT1lbEtWcDxu9ta8iSe7ZCul7R0V6CWAp04dyyhLswR22T29L8f9ZAuq6p/5T7+nHApU0AzugpbuUvuu31B5MJ/SxuaI+4bBj6MThkk5AGZW94KrxOCDhF8qLinvsgpV6FGL2BDgFX3gIVuLU8NPc2igeWCJdzpSsxJtNNnf+LKRm6GdmlNMrzZwpVKrVShtVCHQ+DS3oXXp9AxuGb6MqkW1HB8W2H5YxiVPNHYw8u7G6u9u15Yf8tyaqhRU6F5eZUYN68Ujt4Wq6vWwapmr+uUwB7hwN2EYs+//B8PiPYehZqiInTMushsm0pbJiSnB79ryXNq3Vq+akDmiT5tFdE7+NEG2qDf1F0j2uC9J+kupmobvaBEZ2HIrf6odFu2BFV2luFnV44DghR1ZZ5z8/N0te9hUrm1syt5bdJV+sbXfkunPDWrXq6U1aP9x24myes5M5o7lmpIhPygzPexz5sqossyc5qy8bfRUADVR95cwb68rnNtneVut6w7T/dlUSuVvi0WRUHixfdepWyu2j5EXNK0IWOoF44uFhj1kuTDSNct1QyzHyIhGtoW6v72pbKVhz1hE1NI31AdsgyTRz5VPKNt3Bq6LyDHuZKAUsiWtXqocQ+wqrOhpEbaoz/Iiwji8K8FTFKt0f1wWpeiepMR62b/EnM/8Y+G+Kd3zQixSlqT3KWYc8EAoEYZ5EqG2CHj9GX6NZM+dmAl63TBKVZutmJxoVQNQYJk03t0Ywe4KM55USR6eKsVTIQsTRztMvrx9muNV6cWP4XS5MLkkRsm5eHr2k2dJXoWuU1ijtEGgait1jpCHInPrrrnziiiXYPyXA0Fz9hDbdFVHGwLRuKrmZMMAC5LMnGKsZJ4qNjtNXrmjEqeOfPfsA7sWdTJYa3ENnCFIE8ZuZjImmOVbulOrnjqvYm0GlENOaVL9R9a55zAXEjSZp/dmjaPWc41FKLCP2fGTpqboFes3K8aJ8eVlItMjn7tF7qkZJEiWZrE/YEegUghZSRJIm1mvqJ84JF/WRKKis/fFr1c23X9x14VhUBYGwNINK3RRvrYHddMeggPUdYBJYs3/oC+zziGwE2i+E3i3d1KmqrK7BGQoUVEJJaqLUmy8DnQqC+ErAbjAspsSnWELE991Vup5I1Wgd1xdGZagCJQzWNo4lDNQvEsbBtcYCFDomekxssRlkS1S19AqxXrxHds2KosoPU0E0ijrkRMEESYEG+d4Dr8qvkfDoPLgLliEulDE/Hm5U5Z7gGch6HQdo1JPlsLUMn1qIQuQYqvKpF5bO74evQ24W0u6XtR/57kmdngD4j7OJfgMr2+9zAm2mOLlUf7DFPWYhY7comksbSPeK6oNTrcvoSDchTPBTvy5ExAI054sk/tl+Xcva2bRhvEfpAppzr2kISzeQwOAif2TPuH2/rIm1mnyfe52p2NywUZI33nItD8odeaf7x+CIzIJ6qxVSYVbOXQh2NHS8lp6gj4u/sAUy+gjt5AT6wi3mx+iuqFlEjtuMGe1T2ECqJV/RQihG1hPj3UhrZX8lJgQ1+9U9J7wbakYsp/f7mLpH9fRvV/gQOeg7/Cjv2qSQwfdY0DN6YPdmnU2D1Dy1ft8x6sv5YlL0NnSm6BQwbL111kaaqb5JahHLr/vjyx5Kb6uIScxxqLm2xLQQKIUbrmN/A8eYx1XvyED0uqvb0R3RoiMCZc0mm7FWlbP3qczzeSgY+gnye8ynS3Wkz+GYV0sTZQGUkFoKXj4od0RJphmS2xIV37l9eMjeCv7axrriNbxnWYBHMqYcMg/I0/smi/P7ngzTc8+DIXEZgMpcCaHBnrysjI4ZQ91QJVWLDWZi6xP1BfdTta/l2ie1SIVMYmnMLJxzteRGA8C59DbkBKauN9+8ROQK5qZnHcyjb0dhKWroUy0mnT43lNJ5xs/nFR5DQ86WCGniXQBNUhyToLsMQfEajzCZ8AwNS2aTtEY9eguMxmcEZ4oDr3RmmzcXS3ggkFvQEuWrHwxMXi5bs6bUrT7zWtEBY/sZN+QWEweNhTM2/hZjHs2XmddxzAeyd6y5KkND+VY8t/wOXSlFjR3DOZqfKajPm8owbJRTTesfLiT0YkFTmOqWSGliEyV67LJx3ZNWEAPdzxvet8qAGDfk9is44Pp7ClziSKZB4VoeACNblzjEBaQwnirGDNFyH1stnHN3G27beFAr7pSoSEVs+xmH5VkuL91rNncZS2KuP/s41jhH9kkHAS7fC3WhAZa3ct68mWw5jw9Fad6c+AESooaZYIYigsaDnpGPyIefy7rz9iZ2ocxJzNsE1aJ1KkpcW9VeA2VuBvRRBSVqCT97625XK5sQszELgrJagNjcQ6vyCRbSJK/XM/evIdvuNur3laP+L6VTR8cgQKk0zowdGUW4IcNSGmSeHjhoZz+D00p+EY8QorJ1PwtaaaG/RBiDhzSj7Ut7aiUYKYgnGbcFeJrpTWH+/1l2a0V0gixs1gTFAf0TYzrJw3fhhVhrfHwy85yFEuskwi5FeYY9HwZ4kscqLUxNmrlfFr6273hDg9PTewXAdNPniDQCLp+mPBmgBFDwcvHNmZnhEXO5Mbm8L5wW1U4dOLB1daK9LtO/U6pfcoRqq124XK2lmmF2XpXkG6Kp4XP281ERiJ4MWsWc9S3F1ESMAHW1U90PGI1nizaDhA+Gsnske+YWcg+mMtrP8AD+NfM+tvgbhSwJk4doD2OmGxZisUrWis8/JHtvdZVvPs2o/qR2Q2yhkii2wjzcLzDnePsoDkQnf2HUp9hSmTDc3yLgb0CahqikPk4ImznfllG5XbbiqBp9uLcAM4EoiyB6Hl4pKNKuZbQIfUUxF1wEAt9wGp1CgCh5+5VmzLcTxUjw8c/IWYTEL0hJ/o0AOyz/p5QIccKrPZWn/ARk1sZ/PHpssGhpIGZ8QZfRZsBnXXlcxegPOmXU5P3OfY8fi8fVrxPnRq7ZTbEuTRelLUzaQ6PkRYhm6bqsv6x17eJcUSgUS43bhKBSaq2ruVL7EseP0e8vtfBbzQS3dQ5UT2IOpItEOxND2LdjAo1Fu5a9RcZUU3HD3fxoM2SU2y17BfxmWHAWxMPwNqetaA9dornbVqNIYTM8rdXcAHaZ1EpAWKbi6b7n9s1NxHpkUspMYgWjM6KRL5gC9AiYh7hkeqgil/jzP9SAAx9n2jpEX6Ud0cJQqL43va3CX9mgy1NjFX2+FaGWwv/fqPTKlfwwkCT5nTACpaBz+7vgm01HJV77lljiyQM1093+VG47m73APiYCEVSmBDzljRaZKTMIU2ZWMfPl2pMnrP3UdmiSyspE5vSk/AvuboYkNG6rtbcn3HJ9YhIw7+RE23hv/FbqC8ED0PxVnUpnSR8YTv6JnKd9BrLWNIO7LxLBG+6KfN+lXJTsJE2VjHmBuyKZaqZ9BWqPuQDokcNpCH9i0/kh1A9O070QU0K2dvNDOa53cJ03ferKNbH9+KyEHnEy6NGq4MbStAD3VcONuyzr1em8gRtJnRb1ff877d1ZzZzInZRESm1b8Pbl0E+srXPepSRGbOVYio5+pj0vXxi74VPpTOyx7BdKxNPdJqjHXigNcXd2I+vjvwke7+qSjvv/LtFQ39nlFjpiQvixZhpWiDJxy2duidmZC6+LBWw4VtOFuLRi0eW0MBeDYUctT1RsTz1BjGaTsVfsT9etT0qf/h17m9XMkc2yuWfG8CBrGTqH4fntSf7nM+TPKnoQFeabQSQR/4fzlb3Mimu+UA3JYObms271Rkd4KetH/1JQRSW9NcRc/X23rtoSwLypM9u1UnV1m94IV+ctzOjxH5n+mN/6MtQU1Ob7ufr0pUeJohL+qw+dkov0Gg4lds1vTf/dzWsgeAeG70L4dUaO6U4314JrVikxMvBkQiEINA354K4uCpKKTpEDOE8sZr36pxKcfzJUaVYNdYux5MRk20zyru16eaf5G8p1mGfR8MKSzDumGUtz3ycPXqSnEqB5K4MaN1VVT52o+0KZ+NC26iutJLQlT7s5ZWzVpSqR2mNAqokFRokE9WM2FGdnBfRNVX9f2X4xZoSmdr1WuzUNiRDzLVYNm9wwHY8YwSAXKV9E8Xu989SzYjEbGZYjUXzmg2ueOT2tP4f35FBvmcGeY9Zzux8fgyQm8RadfdNCb1dUh+IiTcIMp7w9oER5JCxJnNcITgEs2oaxCXeZA0nNePtFjY8RpzaQvXjgbqFD1EMfLaH4HJksnc+V0trMslkNOt15pX6xzMqdyxfYjKiOPVmiB8PinmPPLFR4ZaFxVaJr5+DdKk/r5lRx9FyxRRzYB6yAKoTiLwDYki+Jqk5T5H9VHmY67PWJlmKN/D/VxKunSNJ0AyTZtlVmdYeGZEgihRqkJLYya1EMzC+Lrc9XF2lY+/7NGk4b7rbOeA0csHI2/Zy6X3l7PzLCF9q9zfNDfnuT7tp11TjlmRt8hg7cgRy5U2aV6Svjou97BpbqMxeYMGC7dxdiY0Pz1Q+RUdj0K3rGqlxUn38tDxzpH3v4Xd4Co86+NtXRrsJjkT/COJZafnyCJsRlE/McrkSdljlxV5MyUixZK5a9E7h5PGBPd+9BmmJ6Nny2Xdw6cafkWt9PF/dW1mdN8dLMpWljzGtKyzAFwD0snvqJ8szSNNosYW0i0x2IGqb0UkMj+NssY+EMZqKsGspaHjZSY0e9xaI6uikRH2WMCQn9msJlSRe9Fhvdcg82LuoQ9Fo7l81QsCtP0ymI0yQWXMF3SaJW7MIoaO/2YHq0eyXPZnC6+3hsCX3opRpvn9FuG3INsZU3miXTp/8cuHueH68NmxPheAOqbaEdpwa9MW/QkrP0aYPxcROw5CASStbK3E+arydWIYmZIrcSsD2JJBUKDdGXNITC+EtTuivqkcLKJlra25mDkSek5oalWY4O4NBe2xa3BWW+BQLM5n7///d94pYshcJ4JyJzo2/frmSxx/2xH6PfvX17Lgjna+jIyFRKWTtmZuqW74WO12qnS1aSuBy8Qu8r0fZqxdwBHXFNrldMryKbG2X1L53Xtrvfu1lmmf2M9Hh3okn18jpr65FJ6+hxLoaHx7IInGRMV2lt7vy4s10eAMmX9cLH+10NZs/iuCmCQuHqe2yy1ru3wR1g7oyxymrWfqPeht7przvEgTt+rTexxS16QcHv2NdYwSeszg50Yp+N2ByDV0/VLpjLHyQA9AZHUzBSyeQTEWGhESPlUbje/gj9UModT8l82lBbqpsMhuP5JWBDEilj/5rFwCIX1s29ZEQxyn94cF9zKjXFYWM8m3Yf+shQCx/b7GObcWB7RDiGU2h2EJLskGkg+/rOVwPZCafzd/pwa+7g5lISfBj2vRpPmjIvbtBAkjZN4bIAzVLo1atCfKkQmFwVVW6hpAtew2yvc93CBbQ9EFt7rJcepUEDrgU/svEMekpfEFI2AgSt/lNBg+W/4wm/jPqPoLX8b5io/3dutpb7fuHhnkdLDyv3KHVoS7k32QMB+uEULLkHBg/OFudIgQz/4rqUx/nIEYdRuNsvsJosv6e/Wov0eZIoTlro/Yz2eQqIi/u6yae1s+b2ZSt1zmitQ748xi/vLHMJd3movyPxatfYSefwwKbor7Wfe/HSjhL+tPrJLNm/8iXupYPOYAVTIls7tN39X35gGyE+7F363I4TKs7adF04Spl1G9e3D811T8ENidUO1aFIPoiKCGjvTGtxN2fiErhSMhb2LMqqkboYWl3GfKCQJKxDWqWs5G0Nttbu9K3D8nGiFwNYAaeBCZxMclP5j99LYh+fzO2Znv6XEtMlSL6JhS+6zswad40+D0ebOcIofPJ27XYP86BObk52WA1OCtCAYHC70scOwxnRKwPJeyiku3UDXB+cIHMEjLtRyPqzcAuHDt2oM7mZccVckvbNn5zoJBIZ0e+1p4o7UdhTxZl6wQ6JW2psCYo2bpggBjiFRFTkG3216bnjlKj2UIpFAgklgbpCV/D+r9itFhSOWasadxeFty7A7R3R4rTliSGhnL2nLxResm1kU1p+aj24KlFnZP3iqI7RMHTDxhyxXYafBQWigcNxFsEt7i5Qp0pCcJbqMQng2KvgxGF0/2yJL/qD8XnycNf5ccZ7fsfR+FRPSNMFjKY29wTX+7QdCXWFTqL/o3dZuXzD9gpBmFZyz+x3RAhoNEtrlhai8cErDeEvvkANQNXGTx6c+wf9GZS+SvzsAVpCMVuHP2x7+UrVivyjrRtxpDlQdq1vAFk2x0NKsIK6uIP3qf3MDtLJ5yS1t5RIYDcGRWmNr6gpKmVLwaPYglkIOH+pl3tWu6KrKWKn0AxwTnYvQdkl5YI73XUdaIcod8yDvGx9oirRNMt5fHVWOgcm4CpQO0zxGFHumfPzZyp9T77NVzsTeFS/Ibi62PZGglsMpfmtb+kNbJWIvir6GrCntMBLBgGVhEuH4lV2tty8xozZq05ZNJskR2QrhDOVJEvAVlrRGL4OuEYmEUZ1Uvalai5HTpus25bKNca0yghyZRkTdnYWnxl2pfz6BcisMk366kNbzCnPGHzI3wFlR3liEBine/gp2rsDjr2QLhVJe2zaMaem/KBDwAaXZYVzWuh0EY3DaNHGybuRUsOmAUdwxsMVNz+9uCinZLHGV4RePbcNCAqgxNkm9WbwVgO78c2eB7dpz58SXBu0h5FHF871mjYk3gWwJJK4dVA9B2/ndTg3v9QeveydW54lPmA8FQ6eLvfLJMdNdNOXtkIpR6pqU65R4+bGVWT8YI7oU7YiuKcfM7eZHcm9hX1N17GzVAt0aD/0FzefsQbtXZvh0PeE8pdpokVI5RWJn3rFn/3lfBWnLZ/BGRTVdGSGp7/bkSz9OstEzweaG5KpFtBqN2zB3QREADbZpxct/IaPArfUwSunfVpVNJ9erud4T7XdvJ2fZsX82FEeSPgbFBALjcLqVTsiSXv3KZHcMYUEjVrAsPgaLvXYF8UH4ZQSQPOImzLzhJapYgMrcbp681bwmwuBc17GPp8fHq8EAlZbxbWl78UtHxg1zna+gKG08V3omq6Wl9pjpvsi/I0iZoj5xFyl36yv45w8jNuLY3kerZgjtsVRap82ZHJ/IwGnyJGzgt4USu3LNGwSGvJPFgbu38YoeQ6HFu9O9c19JG2ODFuaBC3LfPOT1Igq/REdlFPxilz30ZyN/uiHiUAS/wvLQArd4KQIqGllJ5ptgp8ncSSdtBJzJ0IDmn+BxuCpu0GpuWTzKfbwLgaIKgn5X3m2jiN6XxcZ0Ktf7g/P8fR7vRPqX2GsXz0r5IqS04zPnidQ9Ny6dw1H1Eru1mwui7r9cqhx+1rIdh9EKJ1EQxkYR48m40Pp2LHDIRGh8pOvPZLHo3o0hYKKdiijJDsDvHsGiBsyGhQUIECPaceY/HXf7gdwY9JFwxTsChoJaGgACXPkzz4NE4HWTLZe66Jm79q7d74NVFfen7b/B1LZDcwvX7lJHqrEpsRNJ0J/Lp602CxQmi3o+kjKain9/iVQf/m9vvREcDLbyF7tXneNYEvWq4FL6ANQYT7Ovu+rpWrPqGfq+Cn9S1P809m8Eu5kR0ZZR8wkkxWqlRX4WGCIDDclktKAY7JLkdpRFk+5G8GPgSJC1aEbQpUnq+i2XhAu62Ai8IY7ykd/ogbT/4DIbGXUkq1PXmyJgzqZURmhPuw0NWUbFvgaPVs3JHq9pwWDtH8M4Wm/5UbwXCpC9A4UJ8edxkGWDAVrb94CuJDnTUZjvMDdEL6EhacCFzN8gNOsJXbxoj4h0hy0r13YwoCln9j2iSchCfAe7306eGmJFy/qeGNSsV4BV6WLSav2hrbf4UP675um33rk819gfmP+oppWpu9GdmaPXTVPbhT7rEOC8j/F3dK3ujesOaGfJ12mL2d9oeeC1oNpBIHeVUnIg6muT5J0Ftrwvq3MkgbCP83Va4zn5xcCOtLI1dBb+dw+VFNpw/ShEKAEmJucHEU8N/caRS3vTgnYkHc7521ECI2vddbH5FvFHerKxdMGesQrOarJZ19QGk8kH97LVVlOlIFbuyNqraLc+w9JJvXD0zOWXGU0boXP1xGFKR1SdmN46y/0VtJDxD/dS/WHnYmbZ3sfR7n6WPmSsrYiYhes4yjjNs4LvMqbvXy6qfbyCVLwctFJnMngJsAtTtWx3M/5Kqc/joYyQnBFWVAL0RdbAKTdLv+ghXI//WdPowFokr8vJWzkr/1ST7gTRbwNumYdIE49ZCb+dV9xYsA/DFjCsILcE2YEOtjMSi+sC5N9Pyh1iza+i6PPUJgi+LNMftdpVi3fZzHt6FlCHGeCBgkUmBzcGBT8DP7spH0XSKRLMqA0Bem1lnIpCKnbocgjfHRpCOtAQKMdhkrmUhhbxRnEaw14ppPJD9hjAgNFXvHg7A7ySTLfuLBkVm+VcVDNH4e5a1phMtvXSIIvjhs9KLhjW2xXJWnWG7gfo7djWACCY4gPwaNoUMZxt9PpNokSGWP8TfI/vgt9H2lTaIdSbdDoXR750BU2O/Son5aN2j8nr6zyBINCfWfF2U2rbfTux57r7MtDaix2tJzP1LGvoD6J+qcPl0fwwBZ/kit6WWw/R+jcpip7grESLuxtN+RBx1SqXjFE5SKlO1KOVXLwoBCEImJo+KYObHF3JJKx1C9neb5Sv21acIclFIswQs4Vz50jNP9iwejoXHEwbu0ICe5OXU2JPL5x64jOTpfU9XvUiIbNaMxA/vwxP7vbfot0+fLA6sI2zZzY2sFUnbhrp47VzIYPHtKZGQ/Sh/tcTQgA5XzAdCAQ0zVPPDQ+IEoO532+3hks/1EdclEqza/2m0FcFSf1KXkFetQnhh0TS2TYrgZEjfZXZGm8QGd6dScxXBV9u15xwefPSTwGPmVe1mgpyFEqHrn0FGx6rX9CgGw/C2fc+bIB1PeKi8oDzUfW7lqbGhqCvjBgErMH5X773QfqkzmjPCE6BJWIziuSqXjboyIicKpbhVfFffePFSLiWXzKkpGqPvcvaWUrVbZyrx9Xl+nRV3M2CpRn7SqdRH3seoF5bivhiIV3VdOL1onrzWapFA9HvwMlIam7iExbI/6DItFoMplmbWj/0nxGcWJ9KpVIiAipI3qctLEfblbLtICZXfZ4QSCYMY2uoqVtAbepH2uxCgnXglYSEHw9CMRAuz2FwU9CB7B6xlC8ZPPAyTVWcmwkAL2h0VrVhDiQu4O0OF7Pj5hxcCg6QTZKNVBZMgkJw6hWHpm1DidHlInOzHBl5uGdrVy2qmhqkxYfHQ6i0nChMWGEjsp3xcqTU7lBAwgkE9N8vUjB9UUjN9GH1dLgtNx8/tBwst4cKurKxAqbB2DlRF1a85SMQi2SgFw2yxNpVw94zIhHjQT6kPr+7w5HR5IQoNeufo1ZukqpvlQ3TXFewui6I4Iwgafk2MO1cYe+BBrz18vqYoswmktWb3TxWw2KGdWWbREOXudrIBdrtLotZMtw2t2ff/+vXgxK9N1k9jOix92VRhoTj0bPVObPutuXnTlvk1xT4wI45wMZ0XFrEOoigQLPg3hMXzqv+BxQnIpMaMClMCHc3mnLjA7UF3vo6DgbtTq5nvN6RQ0EIBiuT3n6q4sv0JjgbA0sKfO0R76G8ueNxXHO8lG2FJgbUhnzDmCBsFwVC0r5PluLGwCUpqFpcCbVgEChrPGtGq6xDa6pACSviQU6wRBROLKioEJ0OkBgez68p4UWJ/th596ddTkH5+n+9zkQ8J4noAEIqUweEvlj0LjKxJFIaJH0ZM2e8ofr4VlHj2aZqQEEtqvBEtbfL58JTuYCPfD4U2a7MFSrO1dKJsMgxkmcCzK4tPL6AuwzMZEA22vDiXJgyNR9spJBzLau/Jm+qxOBg9T862QIhLyUQB0MXHEtEJ45KNZC7KwsdhHRo60SQUxYwnGqSFupIclm5IUtdHz475/ZBIluuVDOpFIDXrBiwuzV+MNHT59mhQA9K6WMpOVo/rSwV/BEO0tm3ngxgsheFwtVq12SM6BAavxLOHtW2y4gIms1AoEPHRGw0f5opUfCvrVwQ+m5krMq+TYEBmmq01Mr0L+4dTQ0OTXqZGqQKwyGnUtrudJOcelCpRkCBZRN8IgTDisrP3sHxjITTYObTkp/VvF1EPw5MNEkI2RWnC/VLCmRzw1BazCUxoJeG4yHgflGHJTfm80FwNzcbrECi/f7upQ8JaIRnEqtwJz3jHZxACScm+oen8nor2QJQOR3d/W4P50E5VLA/RhzkApEMatGEy2gX/FFMX39emPjkRbGnVqMGWjQ9FvcER4HlMbPJMP9nSYFAERXeBgmZmXFJentIH4pCX6OEoNYTLd0y5vd0oWWjkoGS90vLyiXRlsMmEtZPTvKH8rYlWL/+peDfiRWZLhdmqI42tx81PcaAoFiStMWKTp2IP/6oxgzUoZSl1G0jwR9y7rkf0/tDNYJawbFVVDEwYt9s59TVpWv/QzMf3h/cwBRynJvr7GfMx6j/3rnkDKJRhCkjNL6J9avo9jdbk4/8B7XeyJd9TEWQisfxNW1pQ3jsDsqqwqK7dFlT13C3dYtztJOfrW/+DL1zJzyo3UlbMUoWr6tu6OdYn+hOU2ZaF1aHw4zJymiFDmgI4c+zCrXAzxjjDvaHNSafWw+4qf7Jfspt1ZgEGxlWRfuLjUq0A/ZD6VEfuotDIn2B2Q1SuHGWvUhUQO1udOmp15mAVCAoy9mar4LgVTKWJESogRYJihmIQiIw51eE/KYZy9qPAmzL9rH66WDUydK1pM14VZeCf6V+t+fv55exBltvHugjwYyvqw7oqUNMGk3BCQB4A8HFibiqbX+07WOjY2rj1hFT1PoH8B4xjUOHsexvdmKdCKOFWiqEYh2569fQ9oWg+VTlZu9fkEkujyGQAvRAbzlHmaKXDtTzGGMKZqmNkPR0V+d3t/OigxnMCg0aS1rwhM8BQojNXSLXENDo6sZaPU+DDuPIWC2CJCpqAsgM6rzLdcABTaVaHQPiURdG+lTsGVOh6jq6w2NfYN9jY2LqOYird7OzxMjUW6Tt7IWumBGOp/DGRAEPhWhNzkkbFbazGV+zMvHzIgWShBh+iWTiXF+1tyjs8u0r6deD2yHQ7H0swMNZisvDq4Luf7htGVCYbvoEzztuie0IFwqAEbzmUPbO62NfByEYw23htqAmE66f/ZmviHg//lMMml+gTxbDcXYxe1w64QIJprRlUG+a27ubrqQcr7ti6f97Okbbia7Zhd/dhxuam6ULc3oMh/cNSgh7NHyovTV3cRyQ36H5IpEBLKXzSJgXFSfJ2oJvsxQYJIwaRrcT82a551G7GtyZu11yZn3otqpalwnrx4zgyFCuklFbN9RP6bzbTEyPFS/p/MSUuekpXzAWH3f9ecL73aFq2bpKrc/X4hLfElZ9d7E+6OShXu9JW1gKhA13ES7pNFgjIdOgZ85JCOTY72HpAzYFKAFGHrhS4vKzxeEdLHYgB8LZIK6a9iB3TfzB+xbgzOoA3qiGdyQLJ6mwb1iPPcafFM8l37Yui1WRYlsD8ykqgLtaUFAT1u22C41PsRwUfWlpeJliz6W4VLHd+fYqkTnLtuL0N7kDVhOI7EnTqKkympqAaKR0L40F9UhBpmxdEtfveKTy2alUoDAIUDmo7xDEpRKLagSamHJHkgq9s0M4/uNgZ1O7stwtEB3l1a0Wzu73Q3d6uKehHPsccLl0UiKpGyBttqcQbs/1P55rQkiumr9IYDkhNY8f9xVtD/daL3lwOV/pmvhpzGxpm9h3rv429Zl6f04U4CcMffQneSLhLYEjCHT87riOZNohdhJDRiH1kKO6woHETlLq29fKABbAWYZMLe4iG8h/AuFkvkzMR2eQ7e+wTtYDpZJaCSlyYDnprlAhMVAMFdsDR/dEV2GJilzNvDgqDR38aRZkDNjLvzjTQJnC168FMgx0sfpuU+zcXMjTXPxgjNaTkxNafZ98PDGDaE5jX9Vgn6H6LN4fnsWriQ2ugicqANG1cmsUa9Fae4yV3aGWRRGpgxB2+eeVhBsqAsUuAbt1uQEVkRYZXLiKLTAsFq6ZZ6S682wkBYzKdvKXHQAGor5NVxe4SJy8hnQqOdzswrcd+4dUOQ1jqpmN6FO30skZrPIXnF7sCJMjZ3cXa+IGXpgQPiVRFFol8wE5jZmsp0WlRx+aKtHqTXGdVUEN0fk8O3ruMQVfvcKwbjj9S6IIzPxUBMLjvpUVsohvB9uf6yv79qYBVBmNqDViT5s2zYJOUDd0pb3ppkej6UC4DXPmjYy8vl0QDcKnuFMjs4yCR321xcgdPz17SfUr8BiSMrk79S8AYh3EsvmV2by8bfJijc9zNv8Lj1ieA0lBWQ/Dbp/we6NYbPKyyCSOeBl/3CQp4u9SI/SqQxLyOX3XPCQxduP+52EnoSMJKCwmOObQyWWMKiWHMHmDcnGygXmgwGd3W50dqO8OoC1Tchg4bORQoSN22FzcJMmCykCIi0ScWODo6oJm5NAqUnix+jzYmvc2RS5nanMBTNlUJwWRjjdAYlabVVMKNkRKHFQMDW/GW4ZJ7ylwUP4x8JWibWKacC1qpvaEpOhjmqV0PDJvwRYP3HpZ14605vAW1tQsFY4qZwZsguhnzakANo9ScmJKAi1YwbNR5aaFdtAqRUXveBMYiFst2wF3MY436xNdtr5+p12VmL1cd9+FdzSEi+k2s0lx0lpH4iFwLbSgs+h1qNU8509+iFCs4MEUAZTBjqmbZ11rHaL0AQFUASfyHPPz6XvO6e/F6bPWgR8cywWR4UPyzrgxnBI9oqvZ9npVhV1gKMXWghSPmbmzECd4gBlFOKLrkBGwzw2482y4C4dBZO6TIEN1hAvgSmTWJQLBDMiTE4+lF6CbQvUFJh3J9bB5RWVqT7b+tQbXONDPOvxhUP9S2Jgnigu9u511sHWsJqBpdZUnhgnyCCCb+/VBvNNR/SYex14uCQKdgasG/o57wqrfOieRrCNyXjKyoBhEEBRSdvWp/Mn7X89z3p8Uflv2PxeQuxm0/+iLLNaZvpX+gE05qkjnQgHNJPOeYFJrAeVmDkj2/Q1DA5a2q0ORQyn2ebAMh0H4rdwkyfG2xZCh6R+u6X2VbhqfRUa26MQV3dF/WDuCQ0RbfcnP+gWIaxAIACAg0MgMkPZHvnRAHBjrcQIbBPdu0/Fodgfeyi+QzIOyeBrQ4mD8dFrgfYnjFWYIq4W6UM/CL8MVPJRXpDuDNqduKRrS/HmbcUzzult7OokutudFoEAjh/NrrC0XeA8aSgAUSZ3bGRtWd0xnyAPc7voM+yVaE8BSqal//E6nE6JSaKVN07B2CSpehbauLr0CyMjHARvdDR6z4q5cOPk6amanDCPpGv+eOUMyKxVqre2GM/DnEZ+Oih8tkK5jvyUy27p6W3GCWBOCy2rlY9kzf5snZ05oy8ZXFTMJjGJzMIDvhcBOZtWPHZuHwYDtzp9O0Ir14cOZN5TjlxIoBHaCAzJbDUU7SBqi6imZmVfiIzW6eZOzIFhxDi/gnx8Z/WAwHjM1FdGjGnwyCURQ89GASPt9k1rp4wxl+j0sREGnndKJSKDEVzTvjfF28MXpFINGBnr3Da9O5R7PLFVS5E5YNw7JOrRvrU84bt7YvFhKk13ZtSxurOoT1/uZ6gyww8O+UUXBmqJXVYRFgHk1zTyWJUMKo/pZ+9TMIxL97yIY/7rjkGkgVQa7VD53Y+4YH6PZT+hFkb6W766brpqWMxu2LHbVZSVNVogGxq8IqCSDnCIc3OZtNY0MdhAt4TPAQaU1hBHacA8StvEPHumyXrT5QGfDgveok3WfaAMYZvPIUJlOuHcjW+5YC2TQ1zYLnlrrBr+JAP27IJleMezgE7wSJUBHtLokCiBy8hfjKO9nQEhy0tGs6vXCG90dlfV2Hct5cRztEwA0j6JzF05YvOwCYhKbhKZKXNunHRf8vIZ618PeEVLrZRElAYgpbxCCZkkZ1mYQb9WPh9nJJUlTNAwTCPu43sbJs6dmJZGdA9k61zApVCUEz2c0hthNOLKDY8fDzginDzcnYqLc/xMXl5O39zyRWOcx3a5rO1ILV8+6Zfyp/HWi9ja+AI7fCuHY6nIIYupBL+2v97qCzi+H08v0i7op4TB90puxji8Jqgs7BGBliXrc/N0kF02KAtrB5ZINvEMiUZxIyjbiVuWeZeMj6Z7+8EwKJNe4MoL1r/BYtb469ejrMWsDgODkoDkFxQA3NoLnZ39tJEmZobOekNxSYnPEhAV3TzOnCSSqygoaFzSRUTpQ9H0HwEdFa3dHNzz6WNf6Hj2L8GDRYIuOuQc/fxpXvjGK4rOn54xfxjXpsnz0oJKaTRAYGyHeBBO70wk5pCYNsPSVJeqxRIunZY/0OqP5A80B10MjVikMWh8fWc4PDHIpDwL7kBLAo2aLxbH9aIvC+Ol0TXtcAHIf9ecym/r6JF0kq5whxBhIGrppXTgYkWREpwLRal59rcm0KY0YNivEYm9tSTSTIcEnfkiq4V/reeDSnZpvgzBbO4AaqNaJT0nKb6WOJYYZeaIFMjhYDj8VMrhx+wqj03nOPWbuy6sgIe7jdZ3uH4PyeL1XChIlHSkdgtyqyJqRG+9RxBHDeaYaQP+soRsA0hljIYlaWEmObNkibbPHGQ+8/wOLWkNt2xNEu6+3LDZFqFUQe+UJLacVkhHfOez7AqIFyTHDwsL6vk6HccSMVIMFXNc8FogFCSRUGrX24e9j13Zi8Zn2Dhg57CGIBb7et+S8qTLVtRYjxkVo92VeLpydFgvoEHRcNcytA8IXlsxflJ77wjrmqyXGbK8yYeiOmsOQxFVEic1bpiQHCWhJ9dDWAJQMDZHg9uukftsW+k8lhtOg3NjT0ZlUfrKLZJnaSTzGFJO6BOy/W8ZN9JXepoNX3S6uSI/6no8UdXrbCa1kUIsNeylIvp9ElzZEdtpXpN8fcPwsaJSn5y92BnotGwPO38kiYzRu/knZHh34fJBKsbNujEPX3fwZiRvcpd3plalFSQKyOlUHdtIBmn58wP68tNMFtviFvzkbFYHY1ygp7y+N08L7IqaDrf0xblShkQp113u+LyMQu7RAdPktj0zlejpcUbJTU3J6MiThkLK/Ge3ydjbCq1PTVv61LBgEhD0rVdbcELOiXQMu98Cacpc9vFg3nsZWOrR8S8p08apY0S7Uqf/UHZ67ot4n+6mNDlIE4Zfn8HZh4Uj6boxovkm0+tQwi/W1dahp9Umrn9VnKh1jqjgKZbvbDn20K32OiHlfcmRvD1b8hIqspk7p62yAYR1e7C0sQPrLhqklnARveIi6iHq4gYs/rx8HHYOqw9uThmbSwwT7TYzdQBkPoP2NoyXBLvPeS9IFqJ93BMekvHRkYMCe3FMgR2c8SSS8g0K55zgLcTE9GGhj1uO/vlzdAvdblOMbjKOxJ/gQKF/ku4a0beKjQ+/Dg+PjHhITnDBoonH47XeEB7SMvHQ4wgmBOHpCzMDCafxhPORzcDGZoz3eOMPKef6DBEBV1AnaII3ZvI+kdoglgJzIag7FfxwgdUmUf2xt85jDk4fBD5PZ2RI90XeMXUJEHuEzF7L2q/8VuR98ejjMttA50rKSAWVU+EWHvYUPiF+9RabTOleZBsQCZjmcsDSNS/nHZBHeU4PV/4ILfVgBaSxG+LkyZpMSgOeiz2p1ChSpVYyw8iP7E07vjqLLc/sQQgwPBnIpAlMwwcxTDxGKNJK7q30FEwOhu5DbKhZ9/bDTo/8A1837QA6KpVcOM2P3ncIoOoLDWQ1J0yy38/lpu71SPdzNU0gnjJJRI4lnrZXUFxweXKifoWD0o3pKXFOMAfFRfd8KYko9UAB/NYoIjuRSkdakCGjo5dVpdssV0yKI0XXrNJFtq2EhxwYmU81Lkv6wZGxkab5mVNsc28CjMV6iWSSEzfj6dOzOyUFbjyPDzX/Ko8UD/fZaXW4jrY/b4yTbUmWlyJtkPcuHecUWEzz3vfGRqWRtbWRjhly4sf1cwzqlgu9n/m0jg04syGiyMt7TpNjxnnZl6PtBIr5TmaA5zLj/SH8bhsiNWhVxEb4hkon0GSEQgDEMuXyc3Y1Ed4J1tfli/DKQ6FyEz5+GC6BrBy13KQQiWtnx89MaW5O8WSbkI/zvXUnrfLS42ZdoR7xtUL7cxRMt7dByQE1U4do1Uujduacdm4tyl9lvDkQZfVWByJtk68HiUISOu9HA86rvnjWY/VaWAquvslvGhvp2nn+5fkA8sJIEEtnVJwcfmNOB8K4F+3iAIdPWks63GLcQQeAJTlDCV2dw2/yFcqXF5i5yNV32zGN3SkbKKN0uJhesj+xgXWAxqaYAy0UQQGduoo5rxmLowCn6TlO1tmEHUyt9sG9I9pBMll12unh4b01x8YvXx4fPWYScWwUysdq9sbl3oeIvxG+y6E/dfb9QXKpWpmaFs0C0V3TQetYIBRf1XbvTQ+8jzFWHJa/JhlQXO/qHcU2WKOTMuvrnW035KWxW2zSjye7HkGpyVE2UrsLUwvtUX3r65StU4fsZX+V7O9THFxELXdMclRDXbnTjm9ybHm93YJYpc3bSl5mb+6jDC2K6Qvwy7CHlSiVWDPTUj5c1iPqlgk54haJVlDppZhR1ZDbkR4sHmH5ZaTP5KZYmyO/KoXf52dW7FRucfmPzUdMlyiYwlop02+ETfPBaY7lISNa0RgEykgFLoPQJPGJyYBX+vW0oK9csHCpuBXQKsi29Y0LFy8PlJUuZ77SeSA5k+9MMpeBGnCnKNEjWi0paY7BuPO13WrrtNJq1K0ZPR8avDBik/PyG2BuozDgYV2cazKTSSm6WO1F2zhmlm5Esc63uyU4kkNTLt5v2hWLxJsY9k5n3yd/ZN1wrS2d2UqTPWG6ir1ZPGzc7MegDKNPGllkYslIbF9MAUMKBl4bXcfK0h3Rbw6q8cfgjz6rybnYqKj8TmuxWQmlkdS1PYGa1MPj9RdmhedOpazsA0jOXpW5A5/OGZ9m46g8lpcfiSh84kXT5ChTTLXXXPmfij6cdcI0D3ZkTpfpvvV+tEhO8gCrW7FuRMTMymVoL9qIKDKpMaJoZV/KlFFuVj2RQ+T28JKo+Uj/HBt/RY3vZxtpfqclqkKl4zE1/sbgY3rFlQt2DYE+YetZgPElsWW+JmMhoIkVcElCDcs40LNdfkEtbKE2NMMxpZiSLxWwW1wSXFoIDEn1ClQ00BxXufnwYWE4J2z6iHhSWazfTpJl+wDGajM63O0tBjpHkNs2F+UZdtPhYWQkJGCDTSzclEP09r4EevAztyFxhjGTmPeP4F3Ti9kX324jeI61Qg6NyufGwGxduL5Lw163D3QOlfS51sITX0BZ0PwXdeycZ1P6tWuu513QAk/GpJcmdjr1mB9Og9th+kwZ2BFld8mLnvUtaFl9Oh6owXhpIE+5BSCVinh8K16Lw7GyQ3EBJYR/A+a4XXtbWxse2HEimgnceEBMB9Z1cNWUHdXDarvqgwsL3NYtAd3oo1s9yX+LwPWT2KayXAzxZYmLanFb/iXvHLNeV6WHlBoZJ+JIatN5wmPq9CVKOIoYSW14lcLlPehDL/pdLibBdzTNRN7DLMaYF84Tyhwz+bnqlCK2epYUn4NgxVWpkBbqwQ18TTofM1FjIZNfx6Pl8VcoARhXaoeQ0/lx69ZT8iNmKEc0R96XST60p9TgheRu1dqERZIGDvzZqf/3jfJehJuSgOaXy5eL2jxEJD5u8UhHW8cWTYknyUPUJpLHuCdv+HJVbQgFgByKxhH7zU7Lz92+f3dKAT+JEuU2l1xBPIiPTsG29w5aSzUSokTBKZj8he8dSGk9F4Jp2XFsUwXO1TqcQhoytiZ5WZHtXhvZBhdi2K51feYQWStsf2P8vlrbbUzH1SU5pBXjpnPBxsyqWe9P8jHp37pZRDIOTLYKv/2/yqIl+KL1YxUrN50HVpRfLnJzSXENcBvXqfC55bogPhAEyWJH7E56lcW9MrJxlliT/UT5Sa7WYYr2ltonSP8QVoNUoq3snLyZnx+VRcl0j3z62ke1M5YoDW9PdHJKbA+XEnMCPOU71fLcMylZUfnogWBnd4c4BSJvvSbv3zc+F+5j0a2CiF6i9UAmC+bRdOpUkwcSfWe7HLEkgn2I7LAwaLpovRMpiEdU+gG+AMdzlON5NHLsxwANIBQAf2/qDU3ySDsLzqZ36n58qiAhKOvv8vfP+Qv2htngthn3YWTYByIJuZEL2y1zUWcj4iwxTbAWnHyvrS+pdc1o9lKUsdMtxy5rJEf4SyzdhTFhFT1hq/yMWVDHQcYscZQlIRHW/wpPTgUVenZONtdepcYDPvDuxqxB6XbcSodG8NO9zSmwyQovnZmK3qpszJKpQjNHTRmcrydbGJAaLG5cFr7njFwda97Row1tMQWlaG20b7U+IdMa9Lvw1WpNMEMgPKbp5//zB+WftYC5345cvby7u5G+YEt/fAdfeE70ERFgx4CcuJ5wVx0dSgzoDGpITPZND6k8lOpflJKJPQf5f5+qkEMFFKiKBk1AB1fehc4l6om3Frj9x4aC9OGTZhSXf6OOJeSnTW7YcOahC1oA1DP9QD4n9k288GQN/lm6LEIEVLOXdbHCSvU6+QMbg+bYbz6vtWJeHdW54ciRkt6LR3iOul9X62DPBEgMBI+SIj20z5+j/gF6Jj3eBQgcQP4l04xI2fPYcWmTeBewREi6WHjPauqEr0sBIBZ8QAAEUVQWsMZQqOQrBxjjOnUe7rJj3X3Qnr1UspvLC6HwhUI1jNqoygI4MYLWaMipqqqcp2G3mUZ19lhMY1uhbk7XqHh0Tt9Em1jYxSoRTjgEAv3wxtzhw3M3HgIWiRV8+PYYhs0yDX+QBVJ7Pn03OPjYLsfhuUeOnQTVeRHVgrCfT2fBI/hRDpaRmnHzJ6BnEgrPZpKquBLCBxhL+FmItGCyOY9o8zLqwoTJNtr9JH2THq4OHiCXgyjDVD+777IYfUGtYPcPNxvUBTiU6IAYTBlIRlISA4lHigoLRf1GSghYdyFTw0vScoYdjgAE3kBFS2H63DLL9ie+6bHKjJQldlvYn1s3voIfU65Gs2q8AehqhhSHWzXoaKFNBnQsobnhXv+h0mkj2uFDb6+0znHCp/tap2Xo5vOavXSsv2XjGVdp/pW3h+5wX9d0qP9eKj6yuLH5Vmxo8fkXWppRo2pYB6fPHELf46iqgjmpcQI31kD5GbGLgq+4J7QS0O0WHuOe4fodq1s9ZR4cicRIK17Rl7rF3uphL/VHhRM2jHrVPPA2KXnQtoflREjkd0bLz/PjE3bl+voybka9KSXDZPjz7wO57i6dKeEIFMbblVA2XsO3cgmN4wR7qmj3yDyKTMo/s0loLqe3mI60ZGh0WySd5R7jFl0J7OKyZsWYsDkmNC7aOwDmczuPQoyvlf32ChKaa/b1Gdzm9fWVfs8+qGopz7B5IlTL4528ar1NVRuBAulkzoJNvN2xrbRb/4RE8Wc0D3saK+HdnR+pjAKhFzqqPIM5cakCtwH+Qc9/FAIFf6EVdwcJTH27xUE9wqM2Exuv26BldvjdQXURlCtV+l//H/ZR3jNm3j+f5OKVG1K3XJcIMAVSxgAYfw2kUl4g8yz3mOtW0XeF3FeiGx0Vgn+y7jLiYEEJH+V2qUepPDkLD5PKNG5YO6E/uwuJP/KnGyp1VjD7q+S00+0De1sBNCKuEMPOgiy2F8TughUacdO8sec87OeSUkuaK4IIB98dhms1yFd4Y0bshPAYUAhP/H8fPSrC8KU7RRL7gwWZ1RhEg36/zzoX1AmSbVxBtr5w+LLa/cvrGVxYWKcIZLf/q/Urv0gOazb7/1pi3uzfV3NYDOSsL9TNAyRfuq1RhBMS8YRaX5epvWhokEz1dXzXxhA4+Q0JwtbkWpSmwtR98UlIwjrGi29LfbuMCsxhLy3Va6PzeFZxMMQCwnLKzn9MQ5Bf4IQIFEQQNmgm6LuTU6VxfXDfqPI9mhi4fjM4vhCh8V54jlPfoWO+qNU4VW0RsfdlfjewuLYe9JlWVVrHOvR2xq8L5Ftt6T6FvxOAP9MN0QjgcBt99F8G4fkQZ0sGQt30ofrDXwol61+kZz33SWh8Lt2lxIXy/lYOXjHkk7owCSJ7k5Y3hoNthnPQOcgP6pums/TRQuD17E6elEnBE3CHzGl7Cl1KrCDqEPY6TbiqpdJ55CWJxXWG59UGAL/6R+YEzf9W1oGhArUL5tIBawJrPG8pGs57PB1P8UdK16WheENOajMty6obqu/xEFctNxczOYofQsaSKFQKYNpQDB6qr4hYH+m+aYqRC3cIUeU65Z3XwdvwgDbjuCkSIlMRICMTFrct6I8MCI8sriJ2CQj1hFzuGupkfm4VsJEycnIyT2K7NoJbllSB1tIKUhgPq0tjy1nz54qL+K80Y12RPrQUpI0GjHB54KfmgWoGcDoaBEddr1rQ6NjIJBIwCov0+l/qTitNN/pZMhhsFQpAB3iH6jYHcZ3hCbedNJ/V3zU5T9TQopx9EVSTkHL8ZjX6nzL/axYgdAGq37K6fbtwxFVc0nVyupu3sXNWbLjXqoVhh/W83rKODX1Wbdrxx34z/2dtho3NLBhcN219lS2OwYQq45oQLEVIm3ED5yRZeLg9DkUVmPz+X1YnnvZD6hmyUplph05Etfo59QOdkS8AC0MZYrKzwdj4eJ2hQDhgwTJJzKosIfHRwgNm3YSybkXx8zjeYvH6KxJRkJQy7KqY671DWl4/R/f4Vmbi7PbnoLGyBPsXKELr4Ell8/wrFIk5rRbuOg1BDA4Lw/Wc7wr/vHaopdTQNNRSQrdIINd659Gzeex8/3gbvq6c1qPbVz+ARRv7Ehp0tNBGTw7P3JThk2Me+5Q99ZoxReUkVihU85Ka18F9C+arclkYDqMhSBxoUSEuRi8NZBCe9vTVq0e0g54w/+/U0TtqFwc4NnQd/sDE6qrFFq7s0Ak43NV55PgL31FHtP0vWrWQYTMGPQYKy8/0T4Gqh8Jf1dikSpqZUNeSokmxUnOjWj2OkHzavEEjkYysrIzwDiORc3Xr7uabuzsu6+ndGga7+i50itepOupLFklUJxeBNpgalcptN5jSIvI67xrs4r5zBwPFYhLHcdd5TOJAWixZrwliZ5iO3cUswf6/bp8G+4mYew5PuDtdk8mqIV/jIj1jF/jTugKGmoJkaWqbMqRH7EK/WLUkgOO14Hypqxd/adshsaGCKm5U7gElmwIT+zvPFSrqxfbkXjPOL2PtrrlFwJ8Tc58INPa6QwN3TGp9KRmx+eI8KIaeWXBId+Ld81eLXpL9SEyMLQt2y9twhPnEkUABd97E0J9wxcy5nVX6S7iXwKE+Meu3gPHETMu+qWbiBDBwidDOjpcbPdRf64zxnyELCTn+ccZburrBxq2u+XSELWNcDdUJQNVx8V2ykuBDQUq0r3DNUGFvfB55qWxO3uqRew9GhvMqM7NG0PjLeEx/VHaitNAw1JtWLJGQu+Te+/PUakj1QShcyfTUeOIH+vufvgd4dFC9DfWvqlKlXqnX5eUAU7/vaCKRSLDG/UpuI19wvy7CJK2yAhmNczLwaajx+0LM5ubxe1TRdVpLC3Rc1EwaSYcZJb7t8SqaC4y/UPg9Fnv5YuAiVbhRhyJW01J9CT5agtbxitIMpYHFik6xs1bdrgLpLftKyexoAgzPg+HNDcNeqdnVwQwRjDuSpkZRw9QsKivorSL1ItUwMCm2Ojs6VpSnElA4KmUoN9JKbJe9joubMG9IZV7GiuLleSWBYLyTHTSnx1nSW2VYFn2yNkv8SgXLqYSREswAAF4jPMmdyQjPSd9fL+6uMjMtQLFsszSWy/tgyuxQ4j0B5ksmPS4p6c3VnFh2TKqIxWaxb9kLnYtCR13ero0W0isC8ovm2IJQebjQSY5uqVZg5mstflOMxWTQ7RFk/QLYY1W3ly7aZ8aXJ90gMU6K/fWtMFAh9AAIoc6vgodIle2oXUhmsBKeD1u0WsJ4yx3ixQVcLsIgkeCAvSuiXF8WNBNimKZPdq8a/4KKkiO7rvaxiMV2IYJszAQs1Hg87BpEE3hJTgItRhOC7GUsL4lcbYLe02S0UHmYEsRJcoaDx5AmJIoRRxu8S/FLthaE1ocxxHESl3pHnyGvo7K1QQXtu8ARuTM4rRHMjc0EOTdVO8i0VmXmZyCw6d2MHr9Mu/jOkG+cdHCSUjxzmuVrMARV4C0LgqLAgrDmnD1DmMsBvkOxnp7R9hxXakGcsrUM2k9pw+2fjKWSaWwwBxhHdGM9B1SjCax1NZ082YTxhfonTYo+IwWOqw3uQadEiBaiw+S2hRCiKehtgyLHm/EZWCEQDi3ql86cYb5SHpWqgrmZX630kX0pO807NhPF79CfsiiOjm861pT8cUNe/fnHle2p+63btemtQT2OevkaT+8HYsoJhWSEfvjKxdvb+7aN1+5oepduL0p+mMeqxaR6U+gsSoKmSiMyxa3D8xBpC+H/Wn5fontju4weXW8HlmJSOvR2Ouuj4vY/ZT8JdFpd1rjf1aDfZ9WqTWsO6hYUJo56ep9xsx/lJcNVQ1dcWd7au2Vz9baGN2l2ouQHuaxal2TvCBoUEZ9UqRZW5qxRzEOOHCRtBMSMa8BpDN13tMa/BRIj8+avOw/N+MyLyQklectHH604QDU6eXEptKisfOKMrE7d5z39tMbsxd1C1oHFXlz+qVP5OF0HAuv1ql2aP3u8oHJX+bXy0lt/Ley5K1cPGKRx2SleMtX43/3HLcjMG0tLoBQwZzSJTNK87iZP+bJTULxk7eACncWeLW2yFYAFxz73uN3zgIdu7HgbylF5WeW0jgBi4RziiXmmQxJRmgibzsf6QQDPGZMpCJiPQsvrRGA8YJKI7JnB1xizsbLwBem//jeeyQeRuyVmIqVZiRaTFY37PraS2dCoR13cVH3qX/Pi+p3D6shUGMQsYX/S7N9eJnjUoKuR5yx2pTSYRXBX8MK2n/JThEEU/U7v4oWtCGdq3ineyeziJqqKZJkADLo1C7g0rX/k/ijaBAjn5CTB/eNzROJC3aZ4nfBPn2gRqlhRn8xM4rJ3mAWKYO0fcY5uHVDuiHNUoRdz29UnQMdUesC9LO0yH8zoSrUqbmreiPs0X5h9M7m4F52cu9eZx2rF0qstqyVp+ajypb3pCoDytwG9wlCST/OkRj+PrWtqU9sj7QcER/on68pwG/Yx5o4dvUrDGG3qYgba9s3VYVvvMu+x5T9rS3EBHKeyIYyIQC1eWTk39yqdlm8w8IGRacVN0mzkPfXfuvy2tO2qv6WS9r4o6Tdnqby/X6vfx5nHBFfl2KOk0y4u+40KjA5wzdse6GukjAOfrgvuIw+s8/j4wWNdBkDg+QPul5KNcQOLb5pzFl2sdkuOwGld00MVKx2aSzbWCy3tLydTosvoe1aq4UYjcAXGpnVPJuHlZx70eompdfLgdJKqeGVMlC6KqHbec9xNZu/Rn0Av484p9nWVsO/IG0HjKRswIdu9+AApL1m4CKLGXyRtVT9Tf14V3glHcdEB2ssTyFbEi2oudt3W8VVIofMwwcptx5XW2CozEqi8h9BiB3QzgKPaySjhzyRGI7HEUINoelqYsrJvEbYU2lyiyGT55rKgcG0cTJF+9kwMag4TYhDLbRBtS+XQxwmocXNO8bYiUV9RaDnRCS2RG9vjs59DVc8DAdGf/Y9P6j3ehvZ51DXxhNEMWWvI7dQfisNOLmUcdZtprSN1ueXakuCgoLmtknDVDCqT2CGh9ENf37szjNVR2nCDYXoEbaZnGuctloyZCbkt5Ynz9AcAAmsKCziJq1oHxMPojqcWlllQlGTMH02qnLHxYFRHvLXQHGjRpF06q2T41NBWTs12AmOqVzp3mRPrjXxr0oEuOtOrHo1P3dqRc4B3HCBwAFQSytIfDIC2JXrOgdmHwSrsMCnYDOoeQQcmM6+SE1BQUV9pLt4tWukh4Y3R9r0l0VR09qj4ZjPra9e03iu08LT/ZoPQ3TaLneO1B6ULq9U2bVDQ0Y9INLHXhxiFwzL+1fwKsXVtTUPNpQbnoXBtKlnLrauL0jkOAcJfu53y4hVKEVvE8/O6Ljm01ybz4SxygEi4ad+DOMmFoO9hws3WyN8Zl1u/Th6YbrP+PI5DcnhMte9y+Uoy4nZjGBT+5D54zQn8nO7WEeRKHoIjdeOkB7c6blmTFp2YfRps9HrC06606V5ZO5625LF6tOqzF9OJrDHAYDd6g3Yvmphf55yTsMoOe5DPGz0nVIcgYErZvF0YAvjIh1XLAilLe3b7W6WEFLDVnXmsYNctMC3TP52awV6Cmv/HW8ltAw9TxpAewj35A08jX0StrZ1xyHEajm1SHzAOzRrC0ymVCmmiYhFKnbF9587t+Dzdd/hv4mGBARk2ulue9oG7XkSF3hyEWnpgr6uc4My2LkTmS8/yp3/NGj1isQUJm8bi7mKIAOSdbK3esnftl4JN4hia0wY3ZBjWhqWjCIWAFYDtI3dRXSGw9tjLmJgU82cxfUJK2jmJhvrEwtSO8Umu8z1DVlKNuSXOTNVNVaJdQyj1KyNP9zFRrmRqyjK+uX4SJsdCJ9mpcL7ZY/BR3hw0zBsxI7CWmnEdyrhMj8nMrq5Mm+KekhYIm4YZDkdadCpqGJYeSbZg6BbbUbWijS/QAkhKZX/WbLnoh9If6LGOlZuUeFswlESj1owxwsBTVEuJYWbUO6IM+NkzYBdMmLB95I172KdKESY1s4CxxNnqSoRet/z1tEe9j4ahhusm9faeeK3usiVuhnEjI+lHs6E3lqT/cCgvOPmEndfKtkobR3nRG772ONE/lqT/sMgrPkkItKWu+I8Q5YWLV+K7VNxtCkFqmPcvYogHpoizWUZOR/91F2P+BPe1jlyuwYuIzzrraSW6luFmVSxwF+aCSeyNcCD/ll55tuuVHwj3QsBjeMIyitDsG/fKFg1WYuCnNk4Bv2QL1tmN05lUgOTmnWwUxleGe3TEiFR78JboUxEeL6VRlVn+pUv9jhXVN7fkIxKuu3AWUWNHb5He8Gf7UaCARz9lPIDztOgFdBmG/edKoPjprDi3M9dZtbXeqPxGXjqezIrjfO6Oypo4YHJ94FHnwWhG6TTV66K6aiKzOmuiMjtro84uLO8m/tZ621RJRrdUefg9nUuZwjvCcHICJNzRsoA4Zl+bk1RJH1ZbhYpbAbLFumD2wuYuTg8wzlW4qeM4SQBZnpcNx0Q1D5U39m8tChwh8212OamPHFwvtUtSmZ2x4iH9Hoz/Nv+IDIFi6R7JXLUrJ0nnZS+xnWH2ykZ6G823EPu1e+2L8/BQfPO1d43DNGVqLaWgdMLboF7CXN9TS9crJ7xK5vtSm4JT9I4AHWaZ8A7I5oIDNL6W1JYrxmX50Mci04PWahpckfPKjOBFzS4CxT5wtubtlyHNXOy+9UL14LjDfXbahk4hByJmxeu641KLMHLWR8Dfu8AqudD9HyCtxvaVjS9KleTz4jYbmE2a/vFu/+vKfourfX0YPPHtjh1vE+Gw4JjnbM+4+3Dv/L1mJe3e/xBuft3YV9VY7lXhvGwRQSG5y40h06vC/f0462lEKrl6EjPJ2UC4hUVZb8oFStJO8UM4ZqQEt5IsA+NSHRIJnMaPg23Wd/CsRRsOwfEoyWn9d0yMBd9l7uM363jQrLvy0zLt50x6AKwgQqIIwSzkJxpcbkBP3qRsC+/3/xhvPGmRveNZVcjXyqOWOoc4lt5w7IB1o4ha5RM487kmPuZzNFBjWKFZ+xOWxd/P7wvlEY99dPKscI8ttAmJjnlDHCbqH4N6pbHKCg5aYDehKao8aZ8dqaI2T2dndH94vApoVEm6H3cxYe5yzMzeMztlrhceu5nlMHT+0Ov8Hv1Zc212y1lF9o3ewxp7Ka5LHpKS9lkbaAH0ox0mjduRx7aF9xtYnu7W4bE+VCmrMP9qSqL52NevjyQ3CqC/k6KA27dvEsFVY2uXsXfx1Fk7OKC2PszrgPErZ9E2dyYkHdE+3oJ1y+u27vo+G8IK3VZa68GISrQFo5EatLhngsu/5T2K/oM+T4sB5Wnptl1AnMkB/+VRWdb3hvmn99hP2uba8r/Sxr0MQUmuTiVGKJ3gmgRZ/jnMOaPeStVDCDTOUUBK/bi2OaDhda4zcD0FgjBBo4oxCrjkLF4Z9T4FhCi12khSqdRCeI21TNSHiGotGPDt72HacDOt//s3dWID8E5WNHwHEXWHoOegi2FsZQyNmnoIovaoSkDq1TX6q+J5uEMXB41RQFJScYJP+aewPC8d5CbxHUlHJgItcEBfUy+7bW6m9b/YwgNjppBaNTv1PHkECRjjyxgv6aqeUJbIZX8g4J22+oGtAvCiBJTTB5ZQLldr9FmJRDTOATztH0GK+qXTF6aQTseslZppxUSV9g5OJH/CNyDt9y6GINIry8BnHEmcZ6HGOrUjP+G4pFB1R5cXcSs1PCiTGc/ari1Iu0pEnxuvuOBVMSZn7LvOviNZuQIYI33Eg5CJBy2Uc6MVPEmayrmNYM57NsKBcNhTpPuadUHrnG1tFotHg3A8EO2Z3Ppz+E9pYzACyraCdb8Y+AWdlJxmHsI1byMPrJKckh/a1S7vb12FbK48KH9J69WWK9AgWxRELZax0xJkofEEv3Ed6p274SkZyzxVUHF5b1FeNDlLHJsSIwkqwb/xJV7+5vaPIlYfdoQcKi3C5upz2XkxIk6kIcM0xgjwXFUk0Z/Ki1utzMBNfYHfkU++f3ICPZn1Sy2RBwqJvzgySeWt/t4rkQjKKLEdWWRtaK+mxZCInAVMYaC8JFWZVJeuCvaUQ/coBg8Evtrlih2OHScgSCgEeA4IGcsVtQr2AwPKPZ6qPFhVl65RlKTKA4nCBUwOKUZNi4deqz6GwryFcMXeGIXvMQPMQriParAqvQ4IGU/ygO18T7EODBQsgu4Civ2R7jDJ37CvyrkC0L3ziCwcde6JgMPohPzAwgq0SHP+EjW93sSy2cpSpdXqKKWH8/WNK6TQRrtMxx8/RmgjfkoX9PK9MQ/1lJaWAhwLlLShEHApTyLNLUrIEv1xEA2bAsmDN8d1NpXXKNuEor/3q+z/7pYhUECB6gg+GsOBMZQKAKQmFBknjnMzrdmHhlgs6zlZgxd8v3Maq9NByENFdnDGfMy6JRSYswQzuDcff5RfKnhD6+Y4zwo8oyKMHxsnIkfBtfHn0iEH3cKjxBCk51b167Op4HPAJjw2RC1tno/Bm6GLDoF0rnSeeuhxNf63Im33jK+8Suvc7H1f/CheDr1t7SdWoLObm3MS3gLbtEb3PhIPfSpz1lbJFdOHAxYisKagzPdt/Le3rQbv/Pyo1Rb0qTlvcai5p7rR+XvBlG+skCEMPA6if113B79AYQ7wI2GMxOm5WddZfWnBopTEfCPScu/SXPYG8omXSQwClF/fmYlXK9vLIu2Rjv/cTtyegjCXfJfnpzmnOOjWvQouxXlmkKS4CO9u7P5zy6EA6GKYv85+HXAqNUUjAfIFcwrLdk7eOT7QY8nk6LNRR9Uh64DDmscPgTj+/NCKkXmzNiaqygy9LTKzflH7lssAgVv0YeG5lpjr0L4pNdUf4+PZ6V9bl5F6719pHu90quXzYijfrR4aT6SNPehDL/rJ4JwM7Q6wGVA0PwwPOeZUyywC7jEAoq/VrNIUhjnRzSL1Zr3gyVDurKZdU7v12x/UnH8oHzB2NPtzz0oHc2K1mW5Rt3vp7PwGfc0MI8FApP3y9+7Jj6DxnxmYVdnB+xO9pl6+nFIrGIEvNvcnChKkl5AZi4sRyEtop/ct7d9G+HOBNZNY/rTellj8eVhR9zOI1f4H0ukNgLid7VdL/YrUYiKNqCbLw6LRe9Zb7W0TlnDb2hpaor7i1rYvyrKWw1pby9taLWwk3k6KZZRXSFcGz03IXxjRClbTp+R45nOT5ICxWA0p5NYcH5lvwUMmqTbZbJhrdElwiaFdAC5AP3caU7mehmiXcy3ihiThOezobrFQWwO2n/j1sI5wg1mP07JH5vUfOvWlr/X1mUXrdNHX5+4DYia4PA2YRehf6/HRcNEwSnR6H8BYDKetQrSy9awuUvbt+vUKLkXC4sSOoJR1LTBPU0LDvhhtCeLb1ceinKDx4pPsGgdddpQW32SdYLd/y8OdWBn/UP/gnOL6m1sNF4zqVu5D0zRPEJGMkbWQv/cwJnrNzXWgwDTGJtEQ1EWhypkndNlB7vbNQsG1Jdorh0TLjkccf35B7XjWHvC8Q1BLWqoAl24WrJ/nvlJnvLx4wivO9BtpfBu4b/HKnOLxkjist2+cF3FKs2ADnBTr/EcU3OF+DIaJyZVvIFAK5zgQsHkPdXGC66K12cIIzPrW8JCgtfqZp42Nn5nVjD3Gtp8Tm1TcwrduMnCtErm/YUEdL+FGWw1dK3BetrVGtRebxCjK8/3CP8msM2dnAfOz9dkOBOxRKbQBw8TEirUORExtNPeYRzu/Pzgx11vRq9RU2D4gPbFROBrjE6opypLeNcGoY2srZ2RSvvYAhogdwxJBfIZ25Oz9Yequa0Jjev/t5VuV6clDOJReJ7PVpIbUz08HgFMwt4MqICmbNXKP63yfgMikipNezD/4en23W/CiwIFTVwdV970e9huxBOxUfRqBjT9M18D2+Q5VzV67wIzNfRhMCdI2aLg42w3uYuKNx45F2rACbrwvhE0B0dlBhQ4E7DbK4uv7tpM2TWsUPOnMdTmNbzUpP3GpCSPGMDE5daNBLsptWAIWqWnIqvJmZ8ZRfxqTt7pXb/H+Z61AxusYdaw7wwnJbxcjCJalzPUmj280jhFPkTpvbtP0TV6pnaI7Pp7ncoIwti4nmn0XvClY9eQMIqI5mbpP5wywiot+qS43QDO8tPLxmr9ffkkq+o+VYPqFDuvWo8GxEnGtFMHKXgxRKFSGlc8D2ATfoDH3YGAGwvN3Mo2+3sZ1raTgr9WTBa/XBdijCMvaxTAGEoxG77UoemM8uchtTKloY/L1LXATFIY6knxtA+neLseiuVZmaEri6k34fpog7VvQtbR9/PRyisoyiwS4fvzooHd6SgWQOtWNe+lzCRCeMxH293jUutcsR7cgnU1LZLyasHYXJWLtsW++g38H1nwC4Pyt2mw2pXoJXmFDRzt6Vmy4DiB8X/XDD6b9beCvt0WpWlFsnO5aHOvuPme36RBzU2+YrL9sB5sDh/NQj+SuGzj/Q+g0PkAVmo/ygGUxYhTPgh/cHZzgCSAO/sx60Nf34EYIXbU1tgNRxoOML1kN4XZBZkfbVxJKO/+oPd55dxZAvFK/2+X+cboZXAMSa0swezJ0du0wBj0idw0wf8RO3heUA/W8cg2vRO5u2gaDSmAzxDf5JS8twyqdUp7ugC5VK/xbbK9RnYY3SMIWf8HX8zB4G/gve8eGAXGwkME4PjZGsr4OJzAqCEdc8lHbYdckOwOeaIlmFABFQtf8p5lDErqWhLctYBkwgd0BKfCPg3mUW2jKkZH2E7/EVuqVCkgynnBDihm0eFG1UMKl8Og5mhI+Jnpn4YCtjyqVK2vJvIQnxRS/yldfpH5J+bWOwVBnX/cQQ097YvHizsyWiaOqYdW387ZOycgg8ND0Cqf7fkEnDpUvAknZ5e2Mn2+ymfXqHyKnDNrcrBoqMHcCp8G587CB645LGqNPTHiL+4lpMcBNKn/LgHrcl7F7mSCbbc1lSrohLE8n9qhaMk6KbQ7CDwbiOqi0jtyiKkfHYOD0eF1z0rYjZkRcmBD9AfK6FaPERkmCnUh38+1dEquqAJJJC/uikT+4NyMVyIJViS7xNXc1ya7OUj83+9YXkA+u5DAckTq9M6m/bhMBcCY5JudWdXCwHbSkQUZzkBSbjBtVYztJfbshXI8YrlV2whu05X2ohAFigr8PmXo6zc3OOXke3CEgUtnU2NfOvpPuk978qcoKTkApiTDfl0RkOyhBsFhytFtC+RJO/mEdHyuW43vHzT9YgYcT/t8vp6pK2r3VnHbW3bbDNvZs0qRnjLSHTyW6pcFQCijFL1arzSDqag6E/j5NVI3yYzc0YsmkXux+XuwoKXnHFEm9isfY0IRlN2EneIxVJHU4lZHmL6Gc4pz0TvLOqCcWbrrgzmjotJGeNTHb6Bk7vl5uNIs4677fllPNcc9GO+IgSngOiaTcyvBd8F3m5v5ZIO4d1k1HLVdNqMbVX8kJSw/jpsfpVqRnR2cXx+Tj0z6Eld1XJvrCGRlpvSYN+wzJmdujzro1y1iYbrwT1hdGPmdsYdHip7KPMMPmEcJ4KXuT5RviONzcfT47fM7EOQlpuCA3P8TJa07BvBvOwVe2vabm/xbis/wg+dVB8vJQ+UVq9odw5aZZ0nLSitIT8h2SShbhEnAYN8N+VqG72sC3OOC0y2+fP5ej2u+7y9f+6yCHq9rnrfwzI0pGCTtTbDYQUUGAaRLdf6sEpPEFQ98P7GZ/VDBZ8nceAsJJ+/e0K37UHrRbl7BrQh2xBeKTNNExTPmoW6Eq88Y7L2rT+kwBQU0wWOV9Pv0QsbmksvUu5HTYunUVyMN0H2qNssRpWo246jbE7KEp4xCxpHUR7B5k+Jr4buOu/ATAuZWrv55/P5S02crKFe4Kg3xuNG9au/M4SNsvo9Bo1SGr3QQGfYNJPqnXFh/e/N9k/uQJ5H9f4xUIWfYzo3JEkHdjNtNa+bXPS+UF2Kz498ZBHr87+J9UyfidBQEgR1gZS2I07nAAOkk56Ottjcp7Iz97/8dYJfalQ7CHS0074YzrwgBFjSh7dlQSNgtMYZtZfcZq40+TjNGtVPbQsr9gEHUgsbkAhJXtu8sfSsTa24P1MmaEMfbfRJrp464vn00a/OhSjTGzQ2KHFiBAIw/EXiR5SCK2YwPhJRvfgBvkwJDiLhNNdL7YQpvJbDcg6pTVXoSnyF1dXb0qlwK/CBAYEmXCZ14xOo6zCXYidKq8xTLt5T1NQGZd5026zJ9EX5zxd2B00Zj87wKGwf+mbZ2sqpXIdR5Kd6UiQmibloW0TzuTGxv81r0ELoSFd4kzLMNlSvtWS20ExEMyTEMUedOdT9gHEUz9gVWVe8ovXCKI5vHvS7EJaIGekKoJv2J4GlqIv+tMUhK+mrppvU/HKD3utnzS7aT8x1Z9iLop8LXXvp3gW1sB6R/aUPZbz/Pu8W4dzPPkMuw2WRedS6qVCb9VGEwTmn0DklcZMCR/2oNSOqCnDKVPAP0zSWq6KM6SH1LWhUqNgAvwkSmnndQW+e23prGxBfsGSJtJ+4PZbpxTtyjLZ5hL6nALpajvMptcn4+mDm9O3e+BHXlh6Lua9q/BnjiUJ+SQ2nC2DrElG3/XAUurRUWpZ08YxVs6KszXuBAAzw9wupjis4cEV94f3vr8GcfIRsvkdPi1IQNX5W/j9tqngiKyy7IiQ9aAb4jFb77lQq1K5mSGlzsnS82S4F9f9vqeaKF26ivb85MXDAyBZMCBA7bkyN6NiosgJwF/l6ych5KGVpSv4bhtrBmzDqpJLl7Fy4UJwbweON/wQp/jr3N/rWaJRzDY/jjj1bwasirKriC8mRTqqZCtEVTSlYSjY74bszaIc374B6DuAkppbbAXFumxFqR4WX6t6lbTKYlJurfGmxWvwCsI1OEeaBf884HKzpzFO131nkWexNAcQgFB0JAFUZmJbCKUVdXaf4bwtSzeQ+wp/hDkJ2abQ3vcS0SGXdpwIygcBV7xzt8eFbrlefcOcz28mRg9Vbncam8Wbv4Q8GxWZRT2dcn4aUorJM/aZMVV3SO6O/W2BU/r7ZwKCT85rzKcC5U81zuycT5vCVSvcqQeeCbWClu1uyct0nimcKgwaqdb8DszDpxJd+mKDry1gDZOPzubsTxtJyqMeETX/T8kQeDKgvEaOA+JZiIiMMbvu8paSfk7jKMgX9+iVRJjR2uoIskMBiOYKwtRRQn6oHAPm1hkC3zErcynxiF4M6NmMvb5W9D0RoOH18lL4BHBb2EAneYMrUt+ttu3Uqk2CdxZw2Nq/NM8hJdMXegXgyWh0hHSVFPLtlLnT42eV8O2YmO7wqPHZdBQhH2OUwwCFr2uvBBcFvXcCh7e4ftUhB/d9tF14aQgaMGMudCra6a7LngIBvt/ewfI6AjfE3paCUoOVG+MO8c45s1IyxCviQ6Ay1AfXkVzVAoSJ0ucQMHkBu7PBPcMCoR09oFC8yVGauRkQ9N/g9fXqgYWDW+xHaOuhkBYViuuF+PqsHouBZMHVK0UBPMiISKmxhuN1MNCw56y4AK6zEbziy5+i1+HHJlhY6hhCxs7odgADRD0OyUjCU82kEyb9z1CDR5kWJiZ4W/awAoI9N+hvHPq7+VMniEuiEEynVL3IA8gmzQKoxmpmII6HWe1X40qW3QEl4j0Uypdjr82FewsgRtPObszA6ak47bfNf632JYjXqGebIMb6YFtvBcEk1vKZaKF0J++qAVXqAoHPeg2OHXHULwb3aTkX5fnDdnHTe7UcIIiB0uOfXEUndxmGW6OVn0UW+BboCFxqGWLrqMqYGcgaWbN8qB8FlTsEdsvXAt3hEcz6wmVuXpD6lVsco65s+K6zs0TUUjkJHH+fXJglpP6b2ceqtWaZ8lPM8sZPemqxPq6K+V/G7wb3Pke9sa7gd97AATfTp9iAdzzLXCpZ1ty7zqm9I+Dva/r7JbwfkRmGiywFSGzPqERqUsGmqOaOVlSMrrwdvFy+UQz78Qn+grD+JkPS7Zn1YI/aD/Lcl/61PhLJgxgdM2h8Z+eiajO7Xk3hdQmLp8+/XT1AfR15zSY35vNFEe3Crnu3TroXhZNinB2hO932rTcWXp+HNqH1bH3Tdmq5SHBUlebZMU7syP03wleg3oc18qIg7TwxQZRFanbDHRco1d5ArtcFE9KFzE0vsc6NdJcsv4M8JdTWFSFt90g3ZMSHJr5Z+d2tx5WOY9Va1gsbbZpTbJc6ui2/g/G7ihujp4+RZ1JD6EgYbu370nnaYVfFB+TvSyDmNrix+ofKPcNFTsuc54psD01nkGeSZ7pKNzLd1ihZ6d9NFmTlLGRRHDENJesexrqanEoUQrMt1pKslWNWmaxS7H1KsV4AEN+cCLSEjKvrHKDI+skIQ6MSh6GHeR6WgVZ0S4OoF58EmjQ/X2gnch6jsAbslhh444VSaeLqEWqWGfQdF40q1J7/rNmFBqKTMkRedN/cAjR4ZqayQYAMd6ofLBPBw3eFDLb4DXeIgwM8nTJVeOSQenel/KVQPb/EXX7G1Lkof1QGgROtljGMaJaTgaB/v8vqNyov3im9v2qlUlRr8OXBwaWw18DBI55NpBFS/iqoaUgL7y6oRG198cgY3VElm+/uoA31aSvCdD8B9Yd23wy/NBW5vxD5QvOZitIjL0KtTpgvnef+QFp8sR52/9+d2u45ZPWdEDLNE9FXSz7PLv6/8nNpj8Pc+YSoWIYMS2rhA3ySr+S38NBnLSnqIzS8f5BMuDSLT2GyXTt7LmZQ8LDtcyN4H868MAPCumdQmGzOwX1VxfpkkNFos6eFnL/5XvnYMkmicQsHyf023T/3ewVjopbOMEXceGJde74Ci0ox0rsXbuYNA2o2vOZsuvKuTWr5/Bhefy3Cmho+lmx/Zm4Lu/+yzSdB2omsLYakzTf8oK2YfYcovYLg3HLJyiaC4U14JcVEx2E8rgUcxqKWMNH9GpXQpnsht5+rZKFyWNtCNu2GIwv/ZkuATYdymH/XxtBNbz9+ys9ZLzc4ww+xLlfLhnuqmjPz8joOHRC4XO46DDED0hKxh+KbJzhoWxbVUg09nYuCbvKPl3GKAprjDkuoCBVlEE6LEEtFay/xnfmhXnKsJDSicvxVuBqVlUMnF6+mIF9sHx3f1RIwdOYLB8DQXHIMDss81pEKq7cI3ufvK1szEg34NViHlJY7zBDgcdkzXVC0aL1NdJkqD3NVrBcVD2bUTMAE4s3bwvtcRNBzJBB+4zrT/z8Bmzu3L+in+ch+617X3VEDEdfk63Ocmv2r9+YVJRemJCifVfQbykYLjgamJispXxnVw9QlUNl7kqfvfaceO42TrLT/v8H3x8ow352B/xfmTuizp4Oqv7gUz8Ii5mLVyMYTfzLv9/XXorbf1PpyBahz21H/w0bzrhKf5/tUTUwBwYg5ZlpujylJiuuyDsXHoXxVj30S65yVYS8CpwfZQ+TtoOg5sQj9gKnLMsQdKyeRqRqw6uqws6TGphVsgTJfE4ndUyk4sMcodF4pYcmiikKqTZ3cnJvR+agNAEXDbG+3kzbUre6CWdulIhaYZ+jucCUI3QrFTLkPmlmIQh/Es+lvRwRKce++T4wJCbbywRxpMC82O1xSllckqfaSQLWUyily6Q3uF4cKw+tJ9XA1hmDxHeU2ZrqemUMAo0h+GWVhi3L4c/dmXuYhWG6BY53HAPPhMT8GCCk7b1LHCKrSmQNweYdTHkiRonN1bsP41CMABxuiCkPh9C289z1DHeXLVlVuP82TPo4Irgh0aH/Gd58zkYV/Go9Y/ToyKDswIDs4IFFne32yM5S+tDDeiH5PKtuVRc8pFFjquaM5/Da8Pf3byvx/C1gKHzJjSCHyO6hTyzwinQcCxZjUtKHE5/Thq6eBYovauRu7UA8l1GgZ9gamxir+fc09Pw2n6GfVz1ajdqSkjmZrp00Y0uottYme57b3n3uOCNa81jzHu1XVRdVK+n8UUfO0flR89zG3+QzLOTrL+AlikVvnKMCjt/D3ocOFNW86A7n9JVkzTd6fQQNIx1Pt3R7eUQiM+GsC7vC9EuezmSulfAge0N1N/2QJ9INGkMpboQwex7PNKxrpq2QKHwJdSg1/ZV1KSLrfLYUViD+lFdyFJ6c8GWuFPFu3X9uk97rWFeETx6ke4+EkkJ1mVdVhwYfqZIsMkwhjSiLS324ouSK9j3v86OGCbJb/01QKeJzMvHbbKI2JeAYag0jXEp/ZzFhXhw5UewaHx4XLpn92EbOLwr2Cnl8eKTk+CaOPnrUfCUlTqmIe5AGObS1Y9eJUydJ5iPm+sDcsyaRUUa+5YxutuC5lZISGaEMIRpKxoRlA5llkW8cfSzd0FjWTTBj7H8Cczld6ZjDZQMwOHX4eKzk48Hevv1C5KaCwOJAaH5UJMUlCj/uzy0m7Lk9pd3ERXObAqZuz6jb7GYnJIL20IRgOeXPd6ej3+X7dsiSnN+W09LiJHNOebE3etSv6TMuyYlBuz6F8mO+n/KxLHaZ/EHo4sU/cC0/2vUj/kfOdsunpmhtLN0UUXaWpkeiPUvUvgmG/268a0BwKoM7cvTeUfv8s3ecWroq2pP4x6TN5vQg+jPOvZPVpXdS8gEthWBRelzv06eNdukAgWP0jzyAcwgAibjQKil/4sbfJW3nv2dO3Kbuuq1JebJ+I+flK1Vg7re5foJVj87t8q/njatsJ+N/LQdxEvQnEomE1qOi1QGP22gmyZoCLNhCv0wTpAfAPK9n5E1JTX8JANmnAOX7jhIYCOHOwkBuZuAAhlyg+H3BtGQeHG+YwoeJjO2MWxc2W65CJKy6OS23nlJd1YKT4gYGVM197XUSQSSbK8Fl0qIUNMZrAPq7jnYn7+rp/J+WXksIzuzSyhwYNg1hOzhkLXgrtdXhSgdfhnUVXzIMzqJHrwEHynIDZT0dnT/A3PvbKLb9/QOBihN3h5QbLy+UKMcCX2C9Nfp3zi+eLys6WH23WvxY1sIucnXIkFGWgJeBVybtA9xlVXM/f4F68H9Og9J8amoEGl/ITXczMYfkxxEfDyNxFkpbdf9XRvB4+dSOsH0IB9p5fU2Fcr0uKXLovjEriRu1FykJ86VRbrUifEQfwlUXKV44czbc/u0M/WOrxCP7kg+oQew7fZcvC98Ko8IJzxu50j/vG9ZLf+TwgM64xLvsR5+f+k1n3Wm9oA85XiMw88872I6XEkpiGIuP6piZ2Nr2I7I8n+jrTet6fR50dW3+uGv7jnCHlmFTFqyYrp7TFiAy83AYLkFeUzGeXy53Rx9hbyU3rixTVVeplNWVCjfnbWS0JUX2PSzbUIXe6qlb0rDT5YqaqvXtbIrt5/FLkD0zuj5oOnBaN3/Xnx+7Z37/3iPvitQ7HHhEr3Tb30+7pv582d500rp91NUmWTn95+cUusaucGJ1VVtdkInxmFS6otjOuSPC4apV1kZvf375FnnO1aWqpWrYzGBh7rLq5YXLfqouOxUmXFVCwUSuyAgZvZM84aIS8ANqwJrBNXmk0YNv5Slduo3vsSy9hLYr6F3HKtFEjKw4ObvFvOKa9hWmoG1Tit1UpUnM9jniurkD4+zbIqr+rcRfS0tnaMXwJsNcXmE9pAsSWIanHhDG/SiJHHVg7rMdpW1nTxssi9OJhgJofYH7kt55qAYkmQPbkhKkJAzfRcb7W9PpYpLH5gyzXB3aish4bH5bxfC+ANHTbDqyDumIvPYstRKz3c1nA59caoEbEa1nWRPqCY6IJwe0HOUmZinhi0dMfJ/GrSrhhxxR29xwcqWjg37uGjvOWvG0kn/DSV2s3Q0hPPlhUH9Ct0nu8w5iuENVeNCPHA72/UVn/8ZDf/8opjwVf2e3ZO/b19Cgck17TFfSrkcHaBI3/DmzV/dGyZwsc1IGhcvflXpIN9J6z5nMRnJjSEv8//ga328ZU67h40ZhMBnDFq16soGVaMdDqhzO1zorBi+hna/V0q39Wy1XmMAgcAKUBMDQMxR26O1cdXHHR0cr1JtEWCnd4J4DJ9YG47cmTet1GcaX08ObfkWtvN6IjFd/F3Cn9ts1AkrZcEfVoNPS9LQwzOqMX9XUjaqOAN9xV//EmJSYCn9dNZh4DJIAyfagnhbg+THLeXXSJuanDq84SMiPJxOf/juk0kC7PFHudvU4uYSMrb51Vqw8Hua3yaZFWSkWK5nvdG65sXzO37LVS7X0lQzUH93ptdUzKonLFqjqItv8tgL23qsjIxv6HvC42w2S0I5O2WkiTUOjRphawXVUCArdwYOmN/TtEOp5XD330Ya+0ZFjBJUPWFkkKuZe2klO62jucRwFwYdoyTyHsOyHotLqHFu3AOethpG1JcGJxVVZ9s5B7kf0OJxtG16O0HMfrbJ1F9bCtpOTJDYJecA3WVZQs9++1MDQAwL2dEbzKGp/kTqor8HauOcVJGoaGsHC76CFltF7dyVwaBHsQrZMkd0e8Vw9QJIiMB24i+E0KVUWEKoMd/EEJyCqT6p3HjQHysr1Ix/imfBOPnGiptmY7O4Lrz7E6jBTfNtfQWWRZ648Msw4EP1ArSvpsTWUCTP7Z0twOtbp8KxFB+pM3v9Cdv9Lr66LiWr7OuK97iomeoWU3eCp+jDiDlYgCz4Ooc1HtFgd/kNKo+pJ8k+y90VysgOy8OMQE1ff7cYC7WKVJJ9XK8JeapLJkqz7+/b1z5b2nhCIhTbgHUjTWCMxOAuNy4w1mJEV1gMUl9SLovSW2WCi1qmOd0euVRfKAyzwt5/+MDMJj6Cr7Kv02ufMtTELwdBRmSbIHqKcZzshj9BddppY5ut+MJxh9rkLuZvB1QmP+Fy9TYG4/KGGRjRDJmjimSCNVtTTvtOXfI6sruaAmXc56qN9wZw5jS+17UiGFFm8tKWaMermlcuatVcFhSjUdTJpZxZv1H05qH4hVjcb1judOkipCfN4x5fXE34I47K/p4oPdgVX3Niy+2qhyw37d48kGeLEa8qqZZq+iDFaXp1XJFPXK8S80ZosqS2rM63WByHsY23umWgW/Lo5lY6boSUGIFEqOyWBX5YP7gCoOIhGViiz1fiGm3P437dmzDgUZPWbnRefEJzYtGdtNUBAN1bWibXJISmR3sJeYKzWI22ME9yKpbu+h0exa4IhvQbjBnnDdeiophmz5NQoK8tx/tE63sKt0UTdiTUvgMtijbN3Ge2e6/DyifnUyGIrGe1iDxaf+OGOgZrtu9c2zn3rSK/Qm4dtJJyadGXWMS0exJsK7vy1vLsIR11pudyY8KiZ4Lkku7pROm4acHnr/nOGx6mJ6ULZ4HE4+aZ/SK9yLTuhLWP/Tr8q75qNpRJys0pdFWPE8vPo/UfWG1n5zu11Y3lVa9t1DNTKGL9EUaAaKY2fOjRenJ6tSzx851hFld6aLhRIeKNy5LqeqWrJ+M6axqHxhgX74y2bXf3JZVU2pf+jeKxia64XE+QeoF9sb58Y0+Kwr3V2prhvTA6UekEr1CRe0pVcd+oCJT7qW6FQoI9HPKqamakyGpXT4vaPPL1Vx+Tlju53sJWcmK4rPdynVPMyYnfdoHd4tr2f8grIYXmZI0fl5cGo53TGcyvHc6rkisrK8Q+WW/KrVdFZMYvNbh4spiwopzSc92MkoVXMU5nrOZORnULnjCXFWv1Iq1xS6LcV1671whlt6FlahCxd4UtIklvaRbcQw7/H5C9sO99mvesSCuifJIA2qMIhW2FChXLv69ZkB7da9QyMzFbPem/ZkogEgW7QSO+l9qUdS7BWFlWFJbbOD9LDKUeSjkKZJL5FN1xm/FnWtVTkru24xwr1Bktn3t/JtzuiNxvvIHevqUJo/in5a4XNzTSyjZf/6Vzzs3I8wnp1wat0q1Plb9f5PygYI60IIqQqR4SZDLYdugc8Sz++JwM8aevz+JxUP/qZmu9abQ1syxUVlNex/n9rpsawQ9LrZLUJQNJQtkrqixoe+vWUrHVVuSA3IkMIKokAqKbJbM5lvNUQgPFBtUkY5pDgyBHlzK5CWnxH1X4Q25nnB9ngUba+AqzvZWMpWEio3yMPu8CV+pVrhrqe6eYzpJNLVsMgPVsS3fTy41jAX8bH35Dm/e/pVx/WQ2+nmP/YRqt4tiMpyIF0OOatNutdm+VIr853MywRa3mrlNGheK28woHKLEGG17cJZeKpyyOGhS/U6P1023N1rJ0j+pzCOImz5+bL4fk7Z8yXDJ3aXcf+HFuHf2RgFMZvs65BgQhsiPsYZyO3IG/9QN5eHvPRdkkOo0O1uYYS4c8X4GvP4xFyAoj8a4hNcAsW1dSA4fNLnY3ObW4OSvg2pNHNIcQJe4V6UUlWTp5ygXJFzlqWunDktdJXpXcoW3ka+R35q7INKgpO+UP5U8UOgyF/IX/D2KNj1O6QhKP+wsItca290B5Vd0r7PWoswhvwBZ3Q2Ou90GwAHu2xW15zTe4c5HXnizvXm86nvzp94b3SnPUJ8QlxZ/vhuQa2+84X4mNOaJv7lP1Uwn921ylXm+NkwskZ7V3HXccdKknZHccdxhKcbr6kD8HlTfM6xTKx0rGBdXjkdoc+6w+nqhmLRqGsbuNEIeokAVOreDiQoDutisTPO8UoupMApX4bDapXb3W6XBjLHQdIdNoqR8SeDnbKOqrTW+O+TNdymN4toKupefxH0G0Ka4MtNksXvz2COQHYRD65R2v2vuIOm2FEGO5sOeA8at0bVZgUcq+dADcLjKzg9Gq0uSrtBk5spbvAFI+TFyk4wRFqkDKU0GLi6VPLwB4tYYqbc/Pv6DRkICwZpgFgBII4BgEbHmowX0ZDKrgSNqUUp4kqv1skX1wgcSc7GEMybETWSdL5Ez0j4hfxOt5WcC0oX5vpSGHMuSSkJD13vyMWbQZDKkHhMUqLGdVQuSWac+BkKqc61OElCX3ouuvRNKpBUjjuvMQFBoWZk/h6H8O4p8HHwD2BP0V1LHEtEReutdijgYLDzMO3pa71LCGWcI/iTtD+mTq+C9rFkDXZ7LlWgEk0qpSihj8+qypLMoPNFIvtSjhPc/zTHr+PsvVQIuWBmRPzYk7bJa4NvhYEcO4GeGPIzE6SJmEIeY17f02LbMaqBzMeI0yNbU7MlSbVPhjs9LM0dxLNENjVmd6owxeGlhh8M5Hg5JbafSutZdX/fYfo/qbhjfj6X4PIENcsvixBy0zo43W0W5manPkdz7JRSjXaJ3qZlQ+aQE7Unc9azImnRUTOQKMoUFZkbJOsXDhO6SYsnLApSV22ZKvmpE7z/s/eWRY4K7vKnupfuwZ3oATO++z/deKliuw41yP75CvzMQJk7ThzNoGSA/Wex6wbfeWjrwyf4tH0VXmL8mZjkMGZuCvK1PshKY3IprPeMZu3Fb5b57JO67D06td9M8euSUes23Vdjtt4ft5ehcqUmDQKnZmbcWTp5pgDuFsePpQse+yuMSPxXjOq70lE75vrPetxBySxJfKgyaXC8zpBKoHeQ2cKC1LJwcRADJVClIZI/Y6YQOQhHlRu/ZsV2ne2bOLNy63wFdhhCBSxXe7N88msssMR9AN6NRObC7XSGPEIe3rfFsXxMdIEUiaAj2yeXFfRn5T7Z4LwmACSRUnZkXQphx6iCIQ4kFKoVHAqA1lNm9qLm0ZmUr44VpdZwmJKaXIWNUbEjQlONGWsZ0glpzyQ2bylDYS8CG6KasxjKnaEnTzhp7wVIC/vq+PiVfbbamFvLmxHBYvlknZBs3ZQwAKy8gTYoIRaq2qqifvqObdJZEHg53bqxok8n48Lak/v6zO1r2oaD4k1z0to9GkDTXR8sgaoB2Vu3yo9LUEAQorzmAVR9fiV8B7XjS58pyI/qePDj3O57p3YXFre5fsbJdL+G2eS83QyXkyQIztLnjA+O7Ifw84hkJMS+VNTSdXH/AQhIa/VB0iHPqBT1RTOfLxCvs+1xbUeUU6vCCwkqxYsSu/LLAGtn3nzYY4+QaLwAvciVAfgU+iDTZ3P1g5Llr7+0e0HIsNJ7KuInCupOzul07zopVvv6eE1kK0qXuWeMSGJ3TsAbcktLT93Yl5lmaJDaehPFXvlKoKdA9lO+EMv+o3vLk1/43Mn+M4LH7UMtvTQZit2mlP4J+vMmIgMgQIKVOtrT/RIjEyWxFTacFKkj3MZhyMyBByUWd/WFECwMrzmgU73Nl5Umr8pdVvMFT40KG4j4xEqd5/CskpintLd/64kyKSV1kYP+lR4TTMEEywiJg303LR5ts9XbRvCAQLHwIHODOeq/mshb78gqoQJ5Rb6LAsSy5LSZb6qjaw2mUeMR1xyXVUyJbboOMxXSO+F5bAKQ/3ZHKLEUW/lqKOWKbOfwCrpW3piwzLlbqOu/LXNtKguQ0w/m9xn+p9s0zLbXPWUI6cuV5iq8llg6R0eV0eBwT5yOPSOphPuZTEbirrP+u5qrslC883j/fMN/9VVlZi/cTilYHsfbF9kPEPJaB1qrGiwu3zRdvtvHePQTDmmocDf+xdnigat8eSHhKhiyCW8JreyaMgg3njA1kygrSl7CxcoZm/2m3/sUJtIGZbrnsd+bBeWkx3x2DiiIC1z6rQzuyghzd/dQ2sZYquFw2VykQpBx0XSSNXz0Iptx3G12KDMrpB4ghm2wCs5JlaeHMtITGHEAsoOsvXn4GpLIyMwY5Vlo8VbYWJozUD2Lzna8+Tx3Ep5HDGeTUv8uzrkNWKcb06+S8JUkr9oHnfa59hRHpfGF38JurAp5Z2B3SgKvWmYx7YXJnA5kZyQmJzdHkajZPdJgMD2U/CferHV1KKl5wLWdXGbFxVn3t206VZE0Vr0JmD/V546Ou0qwv5e6yHdVsYA/3B9nYWZn/lhExmB55XrLD8Mt/DnOJDQEBYH5pmb/EuGnl+Vr7U3zGfiPwTQcpsRVy5V5VvW5BzFY+o+mOc5KVy+PK26/rFywS4tlQ8HXogNoEJ0UkDku82TxmadBDjxd/HRBQE8X0nI7oLArRgFYc7At8LGnxAYzKIE+LMowYERQ5tVggPcLymrXFLWDn773h+CP37bqArDv7dkWgzr7ata25VHxpCD3hgRkYD7cmfCD9nxt0pwX/0ifftJZc/1Z6asuq69zJIWNi0XBEfuO5vRy+IOSwvGPqkBJG7fHN7W7fgMyiv/skzBW4CRb90ioE6fPvSJjfG2r2Xr0FmRZhqCm0Mtm70CXFF6hPQlgexzZewdHWe0p4OsQJ+5Je2p8PP5ByAWSfPF/rZe2IStvM/8i9jzuSrN06yIlRzl7B5E54AGmDySrcP1iuUhqtgw6U8hDfR3IfWVhqnennv7f8EbwLxE61Oa4+zTci6g+n6n//5Ctnrj5iuFH0Ia6m1B6ir2K3m9rwv7HdkoawDDyBP49XfrX+0zZNwf3uIWVq67ef7U+TQv3LrC31mtgJloc5J2hHpK3gUw72HhFHA2Gzefmli93jaknq/FCZ7pecVuAc5vFaP/m31sp4ZrAfKDjm6ecjcKeXloEN1EpWJLpfRT609SNXClOB/spy5UrGFbDKuRWbtoS0hDSl1jQLkv5YlzAS0dYM+8uKKLRbaOYaRHa6ZZcpoByoeFSzzzRcPBCGWOm1fwVgOQUlCthfx0rEcrJO+N0LT3ILSK8eVSsJNioM3Nhx5Q4MdURVtq0oWPDd4O9Oi9EBgqsYW1TlW2plqa8nsBplY8ytX3jvS2DK0cUfHmyv7grdh3/CqTP5vTgzdO6pUMc/tPo4IUCWqTJIAwYNux+8GXLxwOkU6cSx2fXc+rkl0NaVo/Oxo6d4iB2f4fPILG9Ien9dP6N9KGw9KHlR+836a02agfblbud2znfUTFyUGEJfx5do+YBIgrhHckLMbIWGwbDz7dL2r9HTHDJw8kWacQRp2XD/Vc/IMoCP34yEHQg+pdeO/BafFaa5Cw4yQ1oOwFVdyIiD8DWqq1Tv4DOjXcWr+/AQJD5gUnWurcpMp9HxR3oafafkhF494BrVZOJ/NPOqlSxf0YqHxKJawSFNihGALM1EMuXuC5x9qO5WDL2mfNkCgzIbaPYQ2MWzDJmA4QwrsAI6CoY11qodsbKZiBYBIb79Jyc0ohpSpqtgUSE2P1CGZgFJS9b8sr5g2u7+0dGRkbO214qLy4eP+BILUcMjxzxhU11fqOQINIVMJ9ia9ejeBQgcg6FXV7/R6sUCe11+3Z+C+1uq0+PQ19CEpLb6ublRkNYQrlqepYTua6LeEEvku6AzsUeExAQB3BtomUYR2L8CwE4onIEaiqzHVdHc+6qZ1VLFn2O0ntYdjLr6wlFnnLwlwJiBzAI7kyIqBkucERiWFF3rU+UJV+rz9uxaB2XXdaxO/MWdesAs7vjrGw8IC3YSmI5t4znTN0MtDx4+8P961U/v3bt01O7/g2Pe2cP0PdudPekIEHZP99MfAZeSI59WdW4BUOysuaIVoxA7FxeibfV7qxd5WNLWajUpwIhEN8Sw/CPh0Owf6oJ99jdwBBP2A2JCzYfEPDa9md7eQw6S0+XPcjqMu9yPfC1e+f9DVLHO+wTGnSVG9t8cxcW9qpTkpYdY596pW1B9uhGJJ4/cbDW0A0q3WrCatnhvf38vuhAOJAwB2L/Cv6IoAFk1IuE0FTkFSbK64HOFMHgJmxM3IKUCxx3ZVWXoRmBboA3dNimfbanV1kfGuwChp4dFEL3MOkPaITOuIIBHFDL9G+30v6NuQ5QM4RzKa0/zjbg40pr+M2Bm3Va4/Pix+FEnp7iXb9tbXFQxIL6+1HE636H9Z228ygZPi8hQ1sQxGIyIfnYJdoFpaVcoCxpK78AC66U6ceRttt7tilPjLtkYi6lW78mVyPeQqWvNkzw2vYGpA0M2KRP++C7HPNTmqXhuTph/pUhYgSmeYl0mG/KbT59jKfELJ9HjcK/brqIEmUnewKfUE2bYUibyeCaUxJjB2eSQ81+bx54JfjPwCBhIeBfK/WVWUth9KizGhi6+c9z6oGE9uxX9ICKieAe52IEGidHjNyvOrQB7N5IjqWVUA+53HC23xK2f8h7Pm1gJX2146675jtp7Q3MhBazp28zQldgnAfGyV9BY4ZgCxyCeRUD4OW5cSBZbN12jEndA6EzJZY+23k2alYJDpEbD6AT8Xy6uoFHvP+7YVLWB1bkju29OGENEXLaCHIQkGty99qF68TWsk8fDpmsRuhogOsXgOLT5vvaDWtgAFhlSD18PyAhK/5S7KTqb3lhHUbkIWdpC9iA3qsdJqAd36bOGkk+ahvb6PvdLJeBDNRP3LV7UzListmrPdvy80ISQ9uz/VI2BWZzR1p2XFVZ2fqjeUp04emFGke9S0aYav9dWnMyzQsYXueIG6+WSSwuJv5SO1rShlj1M5KCAE4QIl0MUGSeY/q+6U4o1JRziko5w3BcXL+PLXC6asnVMT/lDJRVUW+81SIqIcUvxeiDNSrCp7p0ipEPCEElBLipZhg8pSrBbldkjBe36IrPcer9apJfAlevhJP/WF4o7snl+OJRNBUUxJSPD2eTysSXy7Fy+OoirEHowi4u2T1lyfy5Ql0bPw5ibqnZTWm5CzGmRJPdicHegV6uHvEU8Jd8heqpnjjC70IqttqCkRdgR3DoktxbyIKqY+nTX6rEBOK/jf38LsqADXXrwjl/O0WU4VwuUWNy/FCPldWLUoo8vS4WVdafl3PXtUFzG8fUOU2ewqeW6XE6T08b3oRUQ8lHq/BCGeEZngLGfcQjwc+kgXyAN/KpMMFxpTal4vyiT76ohn5gh3hIcH+iEMFsC/hORegmYZree55mXKtTCs+O6OaypKxmK+1W+Mv8LH4CQXPZvdu65AD2j7RTzwLgzHoIxRyycp5F+p3hQAZNzAiAaKQE9hhwRpZTYC4MH9JYr44SF4tcuRprQ1hDAWb3rRCjOKQADeRTjmzIbX4Z0kgMuuDBGlPQh+5rAu6KnvIqiG9JrpG3BBzqMFToZ/v4ehtdNMqVsbqkWNofLWSyqKMJhBFPaOtRQSWK4LTQkqgJlEiL3HCZJHlIos4WW7Z/aO2hIAknjoQ7+8ZpIpXBrt8DqY4nYuaYcElCeNGjoLlqOvW7n69XNfa2Opc4yDKBLAFgQc9D/bpoXfAjhbluJnkIqrkaao04Mh9QpWpVzOZ36zu4+5bbzRZZrnMIosd/tLSMzEDRH9v2pS9wHLBXUODqoRwz7xBeWywomvJN1MgTK7NasGqDfVA2T79+XP6Jf/x6jDbKXURtUG6IN05/YgtXnsaI3j4L6HepkxbFmDiMC+tliiJ3D/CqFnNKYbYm2EKjHdJe+KtZM1kQwgxr5W22d347dqQ2kfwjGSFEmqJvDyW44DxGvKkUq/rMPAqZVlDsU5zSSh+LuS4EUQ8gZ9vdQ93z6ov259FUJtxAtz3e4IL22PbiVgkNgLj4usfE9Bp3eCLRQYA8+z3mII8qC22jYC1b+VtcO9W8xcFdFjX+2LRS73Nu/kOkaUXL9Vtamj16KhvqecyLDtXnsyBzHi/SZZnxq3YjDkwc9n0UfCmThNP8gz3IKFIHlAEsjHomP4nvAFnS6QsLcjezCL4ejLx89eY2m2ltIRxEgpaiShFepJRTmWWc0SkEhEcq6M91YY77AcsY6tQmF8iYnB5sR4HSQxrPMaJdJIsX4LwQqWmjuot93GSmJcgoOzckC6YX7YVBtPW/69oiyJ72Bj5Z/JH2xFqrt3nFOF5EAbhwhWthzshWIw7isYbg/wWQwpIqJIqZ/ZyLZD+OzJJO7KB8GTj+lSS11jqxCUSXN1mF1Ss9weVm8eaUnOg3235EMct7i8sjh3LwjtVsL1Vstvf+bEQxHYte4Wnkz2Vbk8JOYIAnfJrgB8RVa7rlZCdqu7ikxIeBO6LEuH/KPpuF2R6tklp/hMM/sNQX+2tDaZrrZBhihW3NmQ+Kjuf7wIJ2rvre5VW2uDV/nHQzVOCB/0b6ocCW5hC7k/vbF15V57pTVJawSQuqd0lmJKb+K+ncWoitsyZsd0u7905Ku23q6cHFKudSCruOpxIqMlmY6FFcN/mUrWWb6W+uVEjImjV4nRMwslcl1aXCbCowU9m9dri2s/AlH0FPVFdr5pMvaXxvkivl3ybPGznmCWKy0PTNgdo/yVgdDSoNXvbKc9EvBck70Odgr1XMk2FsuqgRpeYy0SFq5dwjpeY/lZJNGVAlCC0DImsRyL5wZ3GwgVTs119s6fbhfONgviWTchi5EbcKb1LdN24z3+VGpqymU1xOSVxG2Mrj4+iObqxusBzZvgK0baynPmmYhiSIRPzdIpPZa0NyV43dXzPUK3c44H6kF5nLWoS0YooQpQJcQ0FAjf/fsbUxhA/Vlx4XaJvRoZvZyaedzVPp9Zv6ywzlduqbExU/Z/Ww7XcGYZObgX5VWB6p1xU5OzD5GQaka1T9OnpXPqva8be+ytdKFBYnNHxmPR4JTKKul/K5Z6Y5zJnQP5FwJ+XyWeGpEhqu8t06U3t+w6JTRHqNvZGTr4N22NeusoF8NmyvO2t8mOR1eusfy1K4ETUX8cFLivxoUxRbIFPkQMIwmTlAGB1k7unH7w7qeHWplX9Yu1omCvoEX1PkF3m5rPx7sHwEw7aicO1IcwZf2JomAnF/OIf0wYSjsd5Mi/2JH0tNAO+rZAtAoH3Eqii2xx9luAZfJB+XMfPL23p2ojPscAEIF6EJDIDns2U4jUj3Oe+wFwPgVBcgmtYs7QOjL90eE2sKcaVFE9sBsApXvhWOWYr+xR0c41qvBHayMuXIyPz867CgXj16tU/Z+FCG+X/mFB8wUN2Dd62sRNx0z8vuSbttdX7yuiS7Ah5dLtnIrlnJ10Rq09JafBX6XZkFewWjS+/H5r2zW7fELDy8SnQ+TCk++tQI1gyP/lCx4azEakpizUL45NzYvJie3SqY4Z6Y843+1XrFEEZH/3UkjEpIaLYKL2Nk5FT+c7xLIQXNJDyH+RI+EOOJG5wPyTBPYLHAmlbnu5+xdeJq50PtaPBWViWhQPEQSOTXzCCFpKoipZqhSUdFyNKyfM4X6W8mWYu5+/EyOEtzopexi7g1icKjGR1wf7s4oPQeAgsPXL/7pyyI5FlsZO2pYHyKkFazcrdhcUTW1Mqawyh9bXE7LSA9OhITr0EF1SysiX5RZ2EHZUW+XaMQYLmyGOKUt9ZlDaA4gBk68y7q1ncsgGlABsUhw4C/PTK74Efio1HJgf/GWMDiDzj9G+el5Am4mzzd3WMvT9MSFqUs5RunI2rTSlEL/NVnHHWsju/G/a8O+oPBQ2P7I+M7gy8xvZnHo23sxGbuN0pAcrR3aKqn6WM/7m3eQ53fF5+ZN9sA68WJsm+QOPjwVMKCP1s1ocHFxwGxs6NcrhTHu9aHrYuYn6I6wrFEH6OlGV5+XllveK/xWb6H2n9tokIUwff1cDUkURUupUXnpWVTRXiGMkAgU8l5SwlEWQsf+5M9D3OQv2pLYOCMeo7LIKPe+p9F4Qs0pzcPa2/c4/eboyJPce6T0k79iR/qu7ScPLtwidpJmuMH9w3rtn6vUcu7vaxEub9jboP3fbNdPQAFDDqG3IFtegNJx2t/GJcOYOqcn+R2+4NbGdqT9zaLXIM3P6SbPEDYxLF7IvDN2ljbSvTIRWrRJdd1fSJzmExPdGkNXGBi2wGf44PrQ5s79sG1aOjJRGVkbQa0pH9asQJR/dkVArCD3YCL6P0+Qn1iCP27I8fqb1O3r7VXsEMeJOc7EKuOsbB3FcYqdq8yY8ImBukRdF2UjRxzwNVPXpqVWRBUksW1l3kldDUFO+5aGwh1VeZn9h1Qujrog1tDyhjD9rnJwpIAmWOqHTt3BVve1KWfSRvRRRi+7E/mcPZFYHLrO6jQaEPeRWzZtv+mrFDL86fnHvd1rN1N3rkko8djxqT0FhHtnahstX+2tstVz6/ua1ffplrz6OUyPGPiJSU7r+qdu5yyJtpgiYhryopgbMIHXJJ9ezSYkDl7KqWJU010J1zkyFOm73rPdUzaMQlYIEdVTMGso6P9XlWfAyOjeRwiA8I02ssNq7W1a2KXSt7E/b0xkXOl1zAE9Re2dMEytYDeW7blC4qHVF6lU1Ps/PVv//pEETvEe7dJ+xUlf9TXKIwmFdVJzX7lL46mSPhaM6FQRUlykVat8qcNWK10pyrFDZNLvtecefV7dO22ljX2yiSpgIxhafYXWyH7tQoNBccoqdB1OaY4o3Sou3bi8DCAhOtVlhrdile25rcbjbjq2WlCFGifu6AcWDrYTRFpJuVrdTbbBHZWnshnrPO3mWn2bkQCAzCUruWZm2lhHfFoRd8tfjaTvZ3AGRheyVR9Aljn3nY0WeR/VKznqCcxUE5eu+gWLUHQk6efDX52ZGzEYdPnPs0OV937JzOOaW1kKCvuxAcLgeZ6OWi/2btb/qxKPsbRN/mmVwTAxxFUGydnH6LULyEy6JBqyel98ePbZ2ypMMgEHzF1inMXcuNg9oxj988fGApe9nt+Hk/y0o7fMaT5RU97djIBH9KN7axTeXl/U1Bvr3vfndl+4KkjUj4rWJezb4r5s402PeW9VQbs+KJMRrnurLRs+onWk5XUqhmEMMdWqZ4qZINUrfNHq99HpMIzPfUzR6rRdfaonVewPetfdsNmaywF/891rwz5LFDQexsQ1zjoydFDs6pKdcui2IuLfrH90dC/LTunNiE8u5IQXxaRYd5jMut03nxSOfcOv8M+ySNhhMniliF9nYfyTMmu3nzAlZRSi+5uf+aSV7p08XbCeonNFrv/1lbGX0+/MSTbhafnNjrxNGt5hnFo3boq/5Ub+R3KPJreMeC1SDP8tS/rV5nV3rbvLhyxjFrDX1QY/AuZvrFnen2EvtMQOS3XoMt3dA38HBqhG+psbuccs2k8PpE4ra0C3BwS3TygcIDchT6j1V9yiRnbUp0kEFQg7TDdq3dywwcaBMq2bLlzZst97X9WtB2JsVkSKtqfDS3UMYOOaDz+7HeP11df3oFdxsY2+4CIBEAgAgad/j/o0yb4Q8HmMDaes0gesCF6R64oNCpIdX4LgUrJyx6nGI4++4Ig6cPKt+uJIve6obOas6GLIK1N+piQ+aFARXj65Jvni/a913BRaxoKx66ErcjUE6qGcg6DR/SxzyfROJTEF9TNBA7Ds7WTEcfrK6Z3e+z7FZf/SFHs6k4l4jKnCWw9wIdrWdxXbB3WLncwhsYElx6C12IQpdXsPsMh86713r97FRT+Xag9GzTyvDwyhCFhla4KyP6iuGhnKq1p6UGtwLmFfofDPJMIPSUvhW+V/+n/rrPmz3ddTUO0mYehl3qWTrdNXRncThoxKIpo6qhqCup2zweNWSstFCvOjnbP3R1biThrntgHOf7HlmsEKu0PyHFJl3cs5LfcKNhgYa7UrIcPNTSsaVua33LRHB6YXdZgdYk1noV+jqh35OJSBl67ObVERuD769kWZwQR2qxYe9yzT7x7/dxzbhFQMrYR+OsNI3eE5u/2ivugPzU2+2TArfzNXyo2SLDRUCfn+Lgz+I4H/14j3k+18FYA3FJp6YzJeU0Jo2VxVVl0aN4jN6cKx/WG1ZbCle4Dj/SJP5VjKSLmTepiuxInZXskDKx3JjubQqHJhrnrnt9tDMD8X2dvfeM1/WiHZZgUgdVBc7VPX1paSr2oyJROrPrLCAhOKnzoDaL3KRQpSfgVJRzpOvWcnZ3pqyDTRIAREtPeO/byWluTYInXFenrQltRpOI2WaKUIKqT8QcVqYNCbvmXISz08pgvg6V45ETJX7ySsL5SnZDbaI4j2sddjm9BUWKt2fdZnaeR9mhzncy77Ew8STbLadc5rTGSZhNRDecTxbbutLjrXJV+gzKFDpR2oObMTw70gktq5jrOhjheuuv+l4l8XGQvEK+WkuKUUTr6MZ7BdKXlnjHb2UltCpwDNcOFjd8tS10PF7deNij0GJU/u0qbgyV5X3O25lv0MrLntco890B77Syg6cE19pctp+nXijvHlpuxNEzoGaC8bFapCwyy+2HOoOnr6oiuhfQbrtAe/O21Tgspi2iXriddxJRs7eDUh7rk+Dt0EV+p3/q6wsFwCc+0RVAXlW2Pv+S3Vc1C4DAJTMjWIk19AYi37bnuLXobXd/DK636CMs6H8ssUP1OOmWhZ1Xjs9PPcS74oYY3Ej3Gzfr4z3OtsXMGjor0Q3hk54oTuWsPM3CbiJdO9ms4UQKCgorh019BLVZYNbnKkwQl+d2bCAAi3HBqoeeWmaj/LZ1Jq3KLX+Yo0E4s02y+9TugMAQHLfm6tbKNnUKdBMQMml75jXwleL+BMZrEL4c9/kNCcF2QL6+5dlKZx12OzFwaLcCBFACddoyW+twjAe/Q5GVVW2jlwqpXkiFv26qfDrMfeXq9EoIdKAeON3hMkWepLCebD3rVS2706196NXbEJMwFRPkxHOpCS4+Uf0WoKYaz3inoFSu5hkWYTck7m0S+n0ciTthw7//bWsuxDTTHtznN6rxtgO4S3Tdi5RC+3v8EN7PH/OeuVo9o5F/+yv4SaEX+qbh5Jf3d/T96ZNvTqkur5BS8SJrrk81aLK8FWG5vUOVS5AwG0+viv0fUKskhC+7e3HLdVvBEtbAX2brXyIukHfkeSTsOCkib1iIOzPANFon5PKTokcmnqz0b9nsNRug8mfIrAlb5O2RgnCueKMkflZsWXnSP0E6p08wTy4/SXbCewWx134MbJZ6XSXyvuB4gfnVpK4xn0cy9bINza8e9zRgCzF3+aGzuQ9e+A6xIkL2ftnOPNeOa9Vo+jql+78m9TlEg8mXH/zZQAnxuoFJuMjiNDzsbJxDIu1gv8g25/ylwd43FtCLley9gHvvlYXtpz1WnyuvlQ1gl+FUA/h/D1UQMOuUjqCxcypPyo8bEu28sHRqjeHUeegyls+gisJ8KgUoVHfYbKlktsVi4m5RL8jLN1pbm2l9D5pow61tXombV6NMtm2nP+QBLC9va2sCWMVGdAa7FQKHthO7sSudLc/ke1aaqrpYN4xORmQM9xT9F84zOcTIkYVWvdF7B1yPFKhvzBSsbx/9yv2XNyoPHzrEXssuZp3iPWf2o60KOzp1UFuwdZ0rz1rq5QdQBMnuz7jldX4oe5y5tLfLzcr9nghSpPzuypHQsyWkP85M2OEnbaNPI43IABs4tHgKgPQPJBpOPsB8kt+WXh65qh95fnIH2xaJj9eu25l81ix5La5u+79REemg35ZC007PIm4P9/wGjSU7VHPTA5URQtatZuwgPTPoRVhYmTekVxcN+cZzFAnslP8SmGkqKCorIkFDLsLV2qUY7bgrnTqPgp/TV1JebZFTUU3DwJ8YeiuDDC6lIO5zU9rmECHaRl3++2JaeEy3fU7I4k6PCoEBJOvQcGd2nYdFngzpbUF+RK+MglBoI+OiLuQwa7PDD8jjsqfEb+K3bo1/8z/vzdatbP8PjYkvFU94v/kkXZMM10yiYBouXCimUACCKzpyanvUeH1jT/ru6/0jViCiBvsdzKUpnToMz+5moJ6oKMO98lEe6vAgHPTHgN4qqcpbw9W1n5Ks4X7ELWBo+MAxKTq/iMMFhtKZnBi3wm4PQC3Izt2B2ic+YxMosp/x788+LKapsZFVMI4uUZ/ur3/u2y+MpHNVKrZrot6RUjEmJjt7nD08pB4JUQGlFrWQZMOFUhUYJaSVHaWxUq8JwKS9xeKnRkAiEonO+HqGhkVHMeNN6308KjpR3xU1CYPVeleawaML1Z+okPhEFosO10tqfh/cB1++8P8fDB7zz/8MgcJbI6nXx8zhELxaBrfu2i/AhBA5WE1Gnajbh3sS4MHcN/L+HgLImZCxnNqp5PTP4hu3K4oFaIazw8P/c0RmISEv18XaecbZC3vcuPTQPfXuZzA8iRXM7ynlOKA0sAdU7E3Kpnpqt15LIhnDfwPiJEyfK8rcj78hXqWGXCqS/GQlXMH/JR6gik65GMxzu+TGJITNy/haG5aUOsu8GASNhiaFLBPAdAwnVdx9lH60I87O4gq9XBHosumA9MmduIwvIS3sbVnCVvNCLUVpOMm3OazQyTI8x8hTfk4JS9upxHDTJ4fDgqCHB4AqkRXWnNZ3Y1dG3/Zjpx6onks/wlpBShDZxrqlcDfUt7zzYiDRaYf49stLTNJgXcfrZ8mOcCRsKYdx/Au5osGx0o1WsUIfpkOPKmPvgPxLr2lyen8hkTPo2oe2HLazfDDj30azig1g9Adam0IEmVFenvZ6fSIh1alNj674ciILv1veGVKyjBrvkcBNP+3H8A+GuCATvR83luwL4QmHZExkHEgrWNPp91Rwnbu29ZcfO52M37tXtc/P2zOPhms+avqnV12gW/cFAfrRgpdRVH74Bzc5tUWdPJtyBZWjo2pPAj7CM69T0aeKQjCPbiv5D1xxxFxYaB3AO2VkkYfgSeZ49uU25T7xpyChoVhDp/2gVh1yAZNwTqZGrxOVS+98OTlRUOeY9hpiYS39fgokFQKRRxZuWJCAPzphLnABZi4fHgILIcKuQ+FmiACE34RaDyT53O+A+r4XCurh1t2eXNiJara0q41ydtJimzH65MBGNAsKJUIgEAgfuUINayK9crIsHSSn9CTsyf1ciTdLla013nP3825fxAy+0Sv19bGjFXa1vacgivJQJJLPqTPML6GlGHi+HT5KgoZhdy/L8lTOabtY6oZGkU6thylAH9fMHh7UhUH8oQL1pEskcj76R9duYwlR7lJdDaG/XWVcFUMgEHcQXurKus0A8JGer1c23qp9TEJ8+ejSsZmoszYx851SDA200XBuPZKHDB0MYhCUHT5Aawaz/hZEtlLX18aMQgzAPGTrFkTMT0ud595nekrrMoVtbwW/3XpNbgVF531FS0fAV5Tkt5RIoUODCWmnovMzs7UFPAVJPu1NGVH7gZuCboVo4O6pHjXrMK0WcWI5agtDX8B+UOpv1vXwYa2ZyoDAMfCUPmLXqYqR09xp1naG/5s2Mxl1XwicyTtmah4DuC8xJ3mwGTm3RDibYdEgBa26bisWLlrA8hhmcf+5PsFaDszD81SQmhbOn86sBPVzNqfq6csaDdfuH+2gd6NWDB+sQCn4weoIgfbgdxcxqBH+u7Ng0mjvCQOmfFp3spCLqob3VbP/afO3Dx5hrn97+F3nsv4iqpcQNQuIWPcgr033oURYZmx8Ns9ipskzz9JaHz1joWT4x4YvwOJiV0/80MXi2mcWxEwgFQsM2MOBXrAMftCHb5Q7THif1DBlt18IylqakiyZkLtDw7XdtyX3IpjECIe5ESgbe8EWmsw+1O05gjYHP8LBgwSlA5i8Bfz774XpQ4eOYAYZGS+HoMZ9vUfXKBABBj8EpAARlAyaWmm0Fwm5Nv1t/fK5CXZ7TK/HM+xaq1tho5B4t8rZ+iewOTYSIae0MbYysRcn6XC9wMjNpeZbpMuUxh4pzSmxTEDGmVZ+K3KYnq4yn9XKkQdra4O1OfIDWu3mCTBOR7uFhssygzVy2WFRShYLDsMjzv1/K44WWsEsqk+o6c9o7U8N6Dr6GtZYFQc9YKdPv+YwiMEMjhTfixwcjLxXPPJOHcw7wMp7W7O+Hpz8HNNlMMVet0fnyM7drMAteww6viYc3Jb1VqEWGU8ePXRdhvO8tcfR9jTGj0tGfTFRrFcBUMp54hNAT6V+a/fxplvvK4G5Y58RDATAFESZxsr3t95A+Y1rLL8VVULUI8WxJtZyQ4y4ZdYs5C9hdFsQWE9k69Saey3+QPJhC6QUGWlgIFHuvC+wDaIGqUKCWO4YSfVIVYgsfaPIpF20C095qiyuqt7t9LkbdEdkCBS3ip8uQOeH676EjKwA9n3v24D57hrHDzlTrVUSr1cAgSFPyhqi0pWk6WBowLo/my+YPZ+k8wog8G/H+SL3mRoGjzo4gvhBNgJWS8YjppFYrh+2iKCJSXH0cY9LhY7t3Hks0biDOl5QQXUQft/d8luwAbk1oIDfPItgZJGZbDJ12Nod/3YNNp01YtL9C5nHra2wgUvT93br/O3RFo9vC4iAiq7LDZ1vE6OZCknRkKU4EIroEDCK6MhNjPz57Ql/U3/J2BcSTh/2/AWW1CZR/SXCwtn4trZ4Wx4iuqU6hnbLRQhiDkrak/UwkJRLIpBg5Ed/Xrqk4CHx3L71FDMjR7LMx/2LV1SgYvhBw70nmvL47zQUSc7DSW++oTX1S0CzZCnGu6JIOWVXGplgnKNwklvL8Sc67fFxzlx93gGOxzQ97rBARDd/4FrA8xOZd7YWWTXl5p7e6RswFDaT/77TmM3q0JKBILQqKQOz6OyA83q3RxbqUzwBLkY5IufgQ2HOIXqErqOKW75+xVA+mpLdtGMDkdhaQv+PYsw0bB4QwpLZn+Pdc5+d65vUs9y7WYkWp4FqKEqVtNWcG7I6iHFabyU5IiCMFZ/J4oVdYyw6t1pyFfSgUEE80wVAcBHEL44i+5zG1A2fj2fLXb9bdRGzb8VXnCi+Qce4M2FJg0wcL7EIjyleasGLXxPZ7nMTk8c7kV8TIv6ArdUUS5VZtQkJbRHEhJoiuG9q6c09MUj2nmbGzqQ7RiDP2Q1VXFY+s/Afe8DFOVljNkqcP3jezIBX8zBNLaulN9IaH9iZnqLuSHJWqDIKt5EUHUnqtO48++AI6+LmKLfc5rkVBu0PnA01dXl3akJ0hcv/5RyKBkGRsK/Wj28XD4b1XGUbM1nhjvq1TFzuyrprbCNz/3PQy3+UDsuvzBsURxMO6GL/L2vm0MRCWjCW8nIVzkS5aIVE2BpxOeH+V+vzn9J6s0MdjB04IECsyRMA00MX6gU0kYS24pzxFYouN6PCVZt7X6dc0RCAj199IyF8epQoMTK4T4ePna8EurFk2UD6Qz/5eDfuC04uP3mTanZHQ/T9AuXSjIq5IgX7ypoUWbxsQ6pgvYbIMusnJRLG9+yAYltp3Ks2h4npaExGkgqtGUhPXb3+hIbe56MNjU0VneHuItvcVe3SMZ9Q4NUKD1sQ8h65jTmvsqTIEwb7/ZbSwlisnQ0UuXxV7q+16sNC2PG5HInpIFN+enwuwjT80+9UUL6Dey71pWI5jnDeecwtvn4AXnqsswr6XPrWQBVKqMpYYG7uYhBEV3BrDjlfYywaOrEy41lhARGIykbOvNKm160UYtQxuvr2RExj9mH1dSLSnVTpVAyTNytvdv0EeqAf04DGoww8jm7Lc2lEdx7ZoS+zxaMHw/qbsfDVEzNtVy7JezIrB9inrO7LdJIXYvCAlcVKnYIElmPXCwQi6r3LBTkLxc7D5MqTGZui8wu50zjjbMmtQLWc0aTMpCWuPmnw6xb6jgWnTxfg9AECx8CB3tnfFPZ+l9l9JLno+mZ9Zabz512m1LcOu+85k6Q5eTKpNldM4rr/+Ld15VMLTXb6icbacaHSOXTZKWlH14nj6DCmzu+HNvjypadHCS0wSeUAI8gXGXXgyRMxl419xa1bY7QCwZN6qZShNhJXxYEhLXBpPxZLoaSknDj+J2C4UENycrvx7BnTE8fPcFz8jZtCO/lrFskDaf6FfjjU369JiId7J9FEBYnxg9HyyqrxnErgEyJhbUAhr0KVtlPSgrGx/CCPPx8fe77jHQHmxYIaa33upE1xuleFxc5X3iwvv/UboFIrT9jsQ/1bEsb8kVl3M3xjf/jNwvzkaz19C1G+/7bbYztZqTTA5eIZ+/bOzBWHB/tlZDZuqn+R7ZP72q9sY2Dj1yy9yanfpEAVBw83aU2PkT2Zy+JHc56tNGcD6ueFJdZyR44Gpt1w9EjqqkMcAwg1cL4js4JTL9qdKpGm5AnPk10FNvIPgx8cfRf8TuB4/py87buhy/e9vI2Ly0VyrlA/U3LK7mK3/Y9P1hx7FlGArXCJydhoKky1/tQWD2LO/e+OzPxZDFPrbssNL/tCWvw7C33WbX45Ybk0spkdrKItwmisW4cLstf06c2OH8+tlkokxTGzBZgATscmzXwnu2PH5KylL8q66ef8JuGnpbMspxq5L545NOydCuKzZ4eRKRleRAYUgg4Ixy+tFVAiuNyIRWTTvQsfJh0IUyOW1QJwS6DI74BEHpjbAUT8pAr7yJoL/PDqGk2IOULWxTRH4R7zZUDxZo5+3rs7A2F+t1dPawrXQ0wB6PGOIFSG55V8oDuW3XboKeKQs2FIFpK3DJbAufB6rj1seU76FKJTXvrrBt94R4fprzAYqgVm38Z4IWW4A8a4Lpo5labA4lwoCgf/KG5vQWlP+UB1dDopk1PYUNZVNr8mKr3f9kLydvXd7XAMRn6zW8XDwRq6o0AOiwiH4RxdHNzP7UqBFRiYYTDIyGRUpXjNilqt0KELjZjkcRwwLo5XMnbhzffCMWhkjS1DWvGkv1bVQUC1R4TDsXxnO+7lPRlF1hg0yidLPPxArbp8CIuYNF6AcQl85Vzlf/uGVhUf4u0bnzFwoA8lW8YjU9Tv4CPsRumL+uL3z9gjsqgtpkOkSfHazO3Mpb4rXBYpLO1XeXnyOiPs33Pt91GlvKiY5VBePPHy30X+L+tQmJ6slE55h4S684j/356SPymB6GXA/VP9kn9iOglqHnelbmGmjdLuXLhUx/ddbj4ssuZKeqO7jUYgIuepvKLGuTAtvMnhaIsAh5b6y3HztLMoQj/W6eZaCHspsrHLNnuzb6uNm92U7pjaMldDwQbddMuLgt1ngjXzVDi+w/aOsL4sK0/NZTAbSFXg3LoHt3ZSckHWRI8Nmac2kYYS28WZqf8hFugCBIZEKW46qZ9uYwmlYYvqtT0ytt2r7+odd3M59E/dWdhWQF6N41hJ+wN7K4sS6vsL1SOW52Kfrp6J7beqV/UWG6B5FSsCQCUNsaowLrl7uid+e2SEetJy7dMvEd3bjmzzf56/5Z1Mjf4YKmLb2WTSXwe9v6ASnA5FY71m/9fu4RVhkyLDc9i14i0J+512BRTnJJUOOTWGXdwmLKfMi99QF6zLTK5Z4d8kOPDAoD720g/RPfjCW8fWd9w8BioJQxh+ziQCXJilnlnJWTf/m1ckWeGTf7GsXpCcceJGJUWF1tnXQdMUVxOyUakUN8p71fDordFFSDKHQwbmKUPaG451zZS85/oSLnc5QcVZFMiTkkuasRLW/4GcuGPq65nryeflZArRScyjlzzlGwzxjtfjHXeClBpUUE7lkP0Id2Kyj7vUobyisiJ+SKfQNsg2yl8CEN4wd25ES0FBTo6R3mU5uL7O0hip02lGVmcEtD/8+KwPwiPA0d58n8/n2uDWvF4OMqV8iMWae+iEQSbwWBCEfLTjrFtRaFmIXqGQy29HfL6d4SNXKoOKZmVgLcbeo6xcBgcWAIU2xmn1hcu6ry50dS9e7bLRHnn8+eC1a0GolPXtyQUCHp+vL+HLmYLUNZnsbtFu1556110x59raWlvPnW9tFVY5NQ/LhQhf4TbjnAllXuVewc8hTeXqGxkGzU2x/elIoQjRh1Z4XW0k79rVj5FLSk3PDzRGLauXGG9R60Mbnaq22jLRx+2zBrozcS+DVJ9dvSnxHRY8Ni5qeG+/L3xDQV6mW2NC6jKp43xBCbl7b3/QMa2VS3vxBjJBFWBPrfEMG0Y4u8I7p9UnIL6LORIEEsaAQGJSw13ulKPKt9FxLFbabxefPCrwkvr4bL0RXpTcq7UYUWNUpIpfFJEUNT8ks1XYEDBfOdeKIGbJ0SkW/AMchhJDwsUF16WVtCmnjAvz15nohFCmWyJxLDaZF8YKFrqo3TxzHlqNbU52Lg2DsoEuJ6Drug0f1JyWEbnf1fx9OYm1UMyCvCQN/LnIaD/69+rLgxsyPffzgisLLsUjRz13T5OZHEc+hCPMYcgA5uqbAGNkJKBcHsfZgIfunfi17927+orhZ+O1ebRaumeL63aMYp+899S3YXoCOBape8ibfQ5CaNJBt3ttRAP+hq6FhS6DHPQnKku4208baWs7op1EIJYjmROBgJ0cri8AaJCGkLo7k0Aa/+DCsQ0h9Nsr/9qrDswtshZjnGtuLvrL73YZliQ/OovviaaB79yX38XA/mLHe98TzWF6A8BLwMPq3qNkmUdreVbWtrzBhada+a/NpTq3zCdajhVzZ5suArsBT1wXLyvfafsuhKU1aso+KKGOCz2C/z7yCMt2Hgrb9Hc9N1yDNL4f2eDfiHnx+n4p2MlxGU5LAQIXAnOpc37yOX88otgLaw2c4Ld7ZAGGpt/Wb/nDnjuftcda6I2EsATmQcRSiTSndnLDrU3NgZbRsvkSyoCel4sm8l8+tXA8YVwmEN1SFvNfcZ+/zW8NQFgiUF1UVd4web/ovnYZ4Ha0C3fW6v2ldMpd5VXVlxbtad8LhzwVQ9Pi8WmueD1jMXY3OYooZvkK7E3qa/PahDqTJ9qqCrtJ6ooMlQb3YHx5zgg5RO28pvE1km6O8FUOOrpDKy8+OVXHRigjZUmUfJVLIbra4dCSk2wwqKQzNrHZbsdMR5dlKjZOZQ0vy4wa7dSO18WqamrVmuN3+rSt82X1xTdyfNGCkOCElOTWlJTW5OQEmajorp7s3Q2DQeqaWs1TqkNyCtaUQuNJm7JudIfa1n61Lc0jWuNWu3+72sh2+tYdG0yyrEIBG3L5pyI5xZc1ntjDOeAegDhWBr7quHisB2jqX2ReyzqTfHhtVwEon7d+q98N+k3qeYErpSkjEiXKgrWZH3X9qoWdgn7er74W+4fRiYsqt/Skt8VLE6OUWI6Dr+88+M/RZ6v7NwB8YBCAzdrWehKwxkgwlRy0z2lrWZg9MscWFuTh7/vlbg1f+9d1/1i//kdXVtK5jo6zgVldL0s8Su5UZG4Wnbi4WbPt5vVKTTZA4Ody3Y2cG/NO+2Jqvu/TRB04tXwgzcIn5CteDrdqjYt0fYzzB/vOgbRiRkFHxIqQpL3Mg/npoi+vnWOWRKc7J2a0e3OIKXmxwBgn+gn5SzE3tPqTReXTbfromLfSlNN/G2vhPCP6BOv9r+HqqI9T1PhJuMBWkDrgCcdl8PgbOB5amSh0IGm790A+BvY4W4TmwOs0WEzv/fD7h3uiwEou/hfKFC4KNXxFvM9eXXPSnWOdQxF+6eEbB9gSTED+IT3hSaUUF3V/euptDprKkF6920lVOpQQgOmYZP+Nw92MEmEOP2EyaAIvkLDEae55xTvY124GUbqJ+OdvINjvkJMoi/6B+dEbJgufPVg7Ldk/j3ZrQ8op/J+dCxtmbTnZ3NKfRfOV7GZeHRqi8IUtTdeWSsvnPe40byxxl8uSoWlegVhcbFjes9zbk4aRl5cPey06f66dsuXD++3951Z7FOIP2j8/9SbcDvMqX2n48K+SXaLFokC3kMHjVH4R3DkZe8zsHVW0cK38Tf3ZWB3XkKEFavrEyVPpm6lXOjrv0UBWFJNW2b6vqj0tvb19X2X7m+N5DgN7isSOnV6/Zx7UaWbnaOhqonIPltSuDJ3y1zAoicd3FDkws46ke+ZU1ixPVOE8fg2KisgMERKOPs+3WBhWWBXQF50YsDi8s150zqqs8byZxC+tmKSnhnkKt0YeJsCRJFpMxO0DpOTIjyFECOLmxgfKSG7LgzjhbbHJHhK31uhMupD5tzqPZO1KBCeqIQZjXD/TPMa2fcQcv45AfeHfHc4A3snazubR3YEKIgIn4Xx8yzL5X32w+FcJMzqY5OupB6B9NilYtC646YKIl0mTAp+rZYxtBsWbzQBb0DrenRe35nKIbayMTCNoZCCYlmNeb6WAEaYAoDvRNuHA4Yph1Pghbaz3GLXTTNpTiYUd4wo+lm7Eyk4tuubwAGon3DkYQlD5Qt/fIjfVJRwipszPSp889IuT4Q4FFFqnr98pjAp9pwZCCeJbAVP9hIr59GfUk2QlgZGjHDcN2U+yC02gEBRtZvGbWo1kUT/B8qc4a5Se0OcNsLM4VuKAGtBqV7u7e3raAAqTNRu5etWEkZTx/39mZjIhD4Nd80rFGDe6/Jft5TPG3wECQ8aFMlAHt+/01iyoTXeIj8e5n9fWKimpqTVI2On58xigwCUBIHOCOdKPdO5J8VQLSObJJwUIiQ5+HKMGaWOH3UsBFtscIrp+WLDrPX5LSKBe6SFP/AAEGXEm/grkIooaXq748n9TOWMqbGB0yeqBMTK6MspRhWQW+QxAGsC/2Vox0E6W/6NbCjr+qJCsSFzBzHTchtAC4xrog0Nll1OsU/BSfEQWyw4V4pBYRUN5ZOmDaHDhOUAGADwo+Sv589/43cgkzJk0psDFOy4ZOeuMiyk1mfdkp2UZpXPXt3okAb+y3/5Vm9dmH+rd0NJ7f/7lPCbddgjSJJQIouli8ilLv4ELV/OJ5FT/sczy3xISUro4WcFqk6X5J6m8P39LXkdXgdh7mG8OJTju84z51WR3tQejssN/tc1K6wcGZ9xN/HoJMy6cijdTzVv9Xqhuhz/B1KMD0AGKbL7ezUM5oFhkvxPSQz8cBJLLNXsv9sLtlczsey/u29V7wiDDFjJEe0QNded3b4zpr8Xq/8ynD+AbgpAN9IH8f0McaptjhuuU+dhU3CPImgzbEwa9rut5K0yR80B3Mcjw/enR9Z1jwEDPXd3pP+ylfP6dw0sM9os5r4NkzFixg4nb22Uscoz3ujc1NYXnz+u8vNDZkJjR11xcNUGz1OsJ3jeKCYFb881C/n64tcHRYukFjXMcz153+UUeKWBzT3LRjyll3qYFbENa3EBLZ/6xnt+dnb96juYvbWmxTSkbunwZRBHfUp3Rv5OvPaWoyi/sDvx8ugTHcHpXpFBDPMH8eNl1Hz0oOZYWbTht2Iq3LUxXrrAubjqxWn135p2gNroKd+CCJCKdBdlPNabwdIg1/77pjMDlTtaB9DsmzKLtpQMgJ3xeMN/86gzV9VKrLvJUKHwkcIL5yLKbGKfLIb6FTTrADXRvVMSmS/6ZlE1IJ4LSHZO6lelPiot8MrU2Tq8174lrIDFKLdkxEepZWXP1uh1WaVXbOG8Y+QTCZllwyXMbsCqVbAnJL9ZFdnMySqriL4A/HXywt8W4g0akYi3RVkFjRu/rOqLUwcxs6mzN73vnsbsT+xUuS/T5vk0oGDZNWRdXv9UsM7oeq3cMl5eXRWPCqRlRneHBi+wbPAqRqdhDVD/fbPw3VVq23xz3rYoq0RrMewRFjfJpcENUtDS+Yylm2SgxLwb2CFoRLPFPoKIQLAu8yFSaZUXW+8YWQ5X60GvYlhIc980SS/ws8Q5LSDqnJsjwIxtI97EA6UQ1bXJIr/HB4z8zsVHfRiKtv7xE09CJj6TCNtjxisW3UM8+uN/iCSG8FVVxhnXyLu/dZtxj517ktHTd78CAWKxcWlrjSrOwOQBWXa3QsdmIKw9882bv5HGBLMTn0o/x5UGuXy/lhJjlKCPrIDqUzpOJlWuAUdxuz8t+Q6EKmZubmhY8r8+zTfdmjYHJpaYkBDw7E4Xl65QOZY+i5M7apDEYHSWJiWnL89FFVQ5n8XEqO/OPUubmMT1YjsNoV2CHVlXYcje3784uWRIiznH3pgJ5zVezKJ8DTazuJp/+cbT+z4j3lwdi8r7+FSn/Yw+AtvLW1UFuat5J21c0eaUamXQH0p3XMaja7FHKFgLcg4p/7Gr2CTYDyxyM91chaO5kNxcXN/KLIk64vK/LtPj0jjruQ/FNXAB0hLtpMXKxqFseP9CDb8x7441URXq9crIJ4zarF+NrP1q6/KxRW7vr3zfPL4yIwIoZyFb/ey7XCD3VrtwishUrm6r20zk96yBL00xlLGBT6Qyyd805b1fNocmT/GzG2goduBlf1NJHl9eGYVKSMLqYZcPiydIaX8eBH3X2ibYDNQWTy1gyhexrnj4WCKaZ01u3On+CBRL+a+HRly83OvNZw5KU9PQrVy4xQWTWD2U7wWbt85009riJrY1ZLpTK2+ZIOqboAV6ew8rKzrhgIho8nUjkp/xXn932RyGXdbhNxywZHeqmWkBMFFQ33WNDg8LdEq/ejobAkgq5Ht4+0Rw3JTG1sCRFNZSaOkSWa1CpvOCNhYwycqITQIimg9j7NX+FE7b9qpLdlSuKWoX6mBKrZn2kykfGDQs3m5rijFIdPbk0R09i+udUy7eyCn+548+OkwcjX/t3qwxUYdKzpmr6pqN0vcNbmsz9jMn6SL8JgS0EeXOJ7uJHsGQYyBNomUF1LlqRNTROXr4Dsvrr67NS4dOyE0fbMlHRkfX6XEkWh5gfvd4+GfOOXXocUM/F4Nc96D4nO7S9cpvL6pg/vjhExXhbazVqkzRJCLpUp1UJs1frMLAqq6OnqhZo2qzYRmel/UxSZ/pYLM3H3GNBjCGK7+zmKvzsfSWT5AtzFfdZfPp7BMhGu93r5yuR/M51Xfgk2F9vSaxyEisHc8W6Gf12OL2Y7rmoc7vnf4+WUoKo3D8sJRhfirknTiwXgzgrIMvZBLFrxKfxRt9nZC8kW4Y1lw4nnK5azsehHimVm7QaQeJ7UJOg6A17rTJk/tZm3KXpt0MoqIO/UVWZZzHOcvlcO+JI+YsIYr7NFWLXCwfPhPSF/x+u4B6Uo2UrbEmPItwi99OcpJUNrH8uvD8Ik6k+aWvt59HlVjJZ1nIULo/CNunRi888GtxPRn1L3+VsY8YrJKcjy6cIe8mYCjZTsDnSkHW00+bhZITp0WD77ukqtBLZlQRYz+y51TXcPfr8Zefo9L8Sb3U3fv801C3SeP3IZrnLJp9827xj5a3/o7c7wrylLLta7Zxf3aXDJmvjr6nC/entC1wm9a9jd0bwCJFjFuugrjfqHofYlP78zldLxfeLXdp9UYFZpzrS3EgMEkE9ci9LdVdU0hY3/bLMVm9ppQGwnvngrcztO+QH1Y2MvRwYK6wZ3ZZPP2WTvo+/6sptiyvXOVeWp/8qhjOti9UGTaqTdT0CF5u7LfhaUinCx+fAhohRiXYhRRCgUWG4KDmXFVArQnbHe0DUBUUcEjWWKhNxrV0/rNMf/8nPdlOS2A6JIVfjkLjENxkUZyHaToyC58KjSXK4hldPsOa8xwTUh2QWbWKDrpJX0EK7lL5NxCHjuP31KkmYsD4FdNMzPFobq/FvxtkzMFjguf6fhoMWBn+9mNynAP4/i3mcpQtJPbg1YNW8pTTcav1NLIqPQ3mqPfBv3YmvVHBHWMrORm/8tM1+Vf5vjLQGmitabUfR7P56LfVWGC2Sloo7H3rtaY+mm8qBQKU1GX5jOHvut5n28u5u1lBM41See5D+oCvTPB35VDTqjuxC4+Yt3L5bpUBBptJkL3lAZbbzQfcqbcVoyZuWiDAz6A5OPuc5oSDzM/foRKDWy5O1f5geHIbKrAjv3+oGHqOD0eB5AuwqH3srDO5JGfRmRCQCNXe/CBiUoKJbRQaLRxOmZZOGTN9lvnVygEjy4LoPyecCMYydEbQblR+8VP9+zqcddFd5d7MkdnNqGBKsZjIo/WTo2+9G12dda1N6IX6gJ10eOjQFYASJbHlpMZ9ZyriAwDd58witVOGjxCkSSUrR8pt1i80glrKlvl7EwgPVsxKDxLeYJ15EoR/ndtLU0NH3g9NJd057KyQ+x3wM8tTYv/N67EZk+RfeGZzeYQztHrqRzOaiBE+832JETB/Re8ys97VvwL6dPDV8/8qQloAtREmfoN+aa/mt13nrtUJvV8Ur92+Vy8le6MQnXk4/8cHoIBY9OFx8N3JwMOJ+SXHAC4dYvPaKmuyq+rOjyjOtCliUntpkeXrArGyZyckwrUUYmAtwKfXbSxWMZK0eykLElCyLROVLhKELzp5rg7n9bf/x7j9eJIcMZlJkOU0iUajIJfjrp8ao0aNm9Eiqx8Onh13pOV9S3PlVm7BBcfN9PNzY+YTWPYBe8cZGLdqL1Faau/K8BuyavVZxvirEnaovf3PcAHKUmuf83QcPpLDrzRl1IWBE69ze8ltJ63f4PSkJRWuKdt4aq9ZryL9nb3X9U5QsYPnn69EqDuezozqIC2c8hE63o4mRz74ke9ap2pdtmL7flZ3Luzo3bcpMzJ1WUKgJifkPhFpvnXjjhvRc2WInQ/jaTH16cSE9FUV3ogpoOKqYk3SKklvBRjNYY4TV4VhydfAuvSQES3zYM4pik9M4pfWZcgWl0our/ds/TRx6Yt6oqkEf49SnP8prK1GzGeoQPYpKWjtU+Gdy+b9dTRoTe0PUfUJLxNQVJjCfjEZ+fqJZ6+M6jVBdmlzI5ApCtoySVKQqJrH9LEYfn3UE9FW3eZem42BIgf1usw1uHrGaDQtG/uPAfMpLj2xuhtF4wIoZXC7ljfCY3kh8rsPSSW2OLMVpXbMmGqcBK0OKuTnz+KcbRA5aiYbogTeDK+b7Z/2PkMdEc8HuPpyphfABngSGiuSz1gxtYph/fHvshntxgE91eWXih9qsKCs3BN/kb8qIejAn8CMysVZRB7Ke2MeXFE2GRbOvfZ4KHB+rh0xL7zTUCNZ+9kmJOp3WsseMNSdK0GU5d3NlPntoUJmKZ42LFpQsq4hmIaZr5cvY5ZyfXtjCxoaM6Gx8wHf8dXzDkd+sujxl1PISzZvU+AbUnXx3WkBP4mkaUMnyrgmAbPQGbnPRHZ5TDI/WlLmhpEzOyRZ8kvvGQnLK4CVJlNCgo3XWoTtF28xSLI77xU1qN6ubl2x9vi1bwc4SgGAU5HD24frB/MmuvBgw2YEudZ8Pw0kWInURQ0MRNqdMAJmZFblOf+XmLZJKHaVizDtChCHBIJrpfimLmIrmNGRukmROajdzmie2RQlvjjlK448LCW4wiJKQcNwzngM7k76168yd0TAVNypdFPhS3Ye1xonoBUPXHPsg3Jk8P9zBf5A0+qShPxi2e3SacauesqqzosD4G57GYtdY4bAf0N2wH3+88/GBEGUPEOHCbfU3t5YJlwl35L92uUOof7Js5Pz1V4Zq3G0MJ+Z8W2S2HPY+yRumpkSRUZN4BTNDa99wFim7nPNlDq+ejUM+qOXUniQe2jJmPeHk/ObxOkjK+mg12qIIEqH6aEbs/JzhTLYsQJi+OpyQn6OyGEWYsn43geZCVj9RI5GYvDNRQeYu0ZjarJDueFftdWrNVAOCYTccYE66IqMqjGtLYlnAy0pEHLU6Cp6JFCxU+rO/zjNzccglzYMhTI5vDAQSb1CMTbxafjhfHkJV655ovTJ8pfVIFECVh4TzvfJt4q1Fal08FK/WbR/IGO67CXdGyYe7fOohW6PKJKwF5lGLpSPPevWWmOsAVN4a1p5O6Mo2EoQJCe/oro6hSA8dTmIhG2InFnLIVuHKxSFSBZVuHq8mPne+id13/qy72h6YuKoppHJSGWDyPjxcuud88aZhAJEgCcEQkCuPjlF/27lvo+7wvj1/AmIkSmiTmdySIkHkuISjdXU/+QQEXB7vnsRoRyHuNxXKy70mSz6qrnA1MKtFmasq5dTafiM+xKRSlD5wOCXfHXH8m3v/zX3LIwu78nCHidPEcZPNv8ZmT0dbcFZhoOZyEU7gdsj/CkBgSJRy6nK3nVVIa5rOrXx6rJhnLHT/8FGy8ODsza3oTmL8Bw60KeXtWRjEMEfffXdzPZd/PxEx/V0G+M6fHi4659Pm0VgMAYnv07sko8wcVrfejdqBc3fXBS+M4kCtQAEF6u7ee1csfXbinKUi1Lh60AP01NZFSR8HSUuQHVXtAIHFj0llm1AAkWCJm2ZxmDTqkoA8RXS0XHwPNDpDKHoPHW2oO24JlGloHTA3mLkVMSiLWFj/Yj7ZeV0lXfC6IJoILRwi1ZM5EeFzh+Z6EBhSaRGVIA3Zqh/TjeufpDETjCGkU2rxMw33x16spy1TYFk5AASEnB+xBIAlzKXKkoE+ojKXLr4tfbdw0bfp8zf3uV4W5i1SuNUy6VXvs1vi8vcOS1aPH161to+7avHQXRLuTueJhR6BYY7GIn36trot6ex89rL6srogax/dMmH6Al6moJ6UIWIpLUS00hUqNQ/PN2hv2dGg++iCSv7y0j9czrZuPBr0b//xUZv+tDBepjA2niUGZ/IVPinAZt7HVcwqNwXdwsdV6P2c/ye5f4hNJCvrz/3GNl83CdSkoPofWdUHfGr19POMwWlw+v9Vese1QZDbE6rI+8/W8o+0DlvSDAyTki4QYAj0ewxmuyJb6qiDo/ac30gxN9Ywg651IGVlybJIuWsukr7CYTA80WJHUdBKaZkluZFfyish19PofVf3atuRdShHa2bi3EVzRpgvo3LZAXl5xSOKWH812kaZzxNI4sauNRD7nxpZy2WZ6jg88jEeZ+2cqBqYfWZQq33VLC2mXl+KStrGHs+3Jn0k8ds2x3bGuNvupAKx/2XX/tbEb5Ewr4seP+sfCgF71GTCluEiAOL2KwaVFD2Z+JK+KqfaY4wUearieHnLWiWtPXZTI0PG6TkKcCI4KuxeHVp4xN03U9bNijvP2cX6c7y5uF8ilcyvab/XIyfJKyrHcTIaE0kF0h6UeWwlC5eKRY64pKNeW8aJ+IU3sDhBrC0C0xY0HPPji7L8Lqv4QdN1HkbqjUVPWpph3hg7UjNHBdVG5+TGGBjpfhQDI5HCnhjoiVS6XVx7amehV/SMD1gHswh+9jwMm3BEbbFFyt2t4vTtUYYajke9DEMEGw/y8Ij45z1wiSRzQ6tUIruRjFkftHVHP9zWMXrLoHir/GkBtXaRNTroaKxg0giH5LqfI58qHZCQkZqMLPe6oxjrkmYGEPgjFT4zZbNUde2T1HUrKO+BbIU608sqb9h3xuTQ/gP6UZP75cqRj9NHd0W/Aq04+IXxsHeum6+/VZWy1Zv8buunD0uMLbcg2wvNjkuhTe2y43KGOb9drWF5+rYr9NAytrbecCvSue4frLqoeKSXP+RfUXv4jCjHtg47fwrdLRchmOQxRlIbOW7/FGaLDPchrdCa2scPmqoR65E/buv4COaMCgAgYwNEJD1LjrZuLFCJWWf+yxp4cc/NqdEnQ/HQBiAK3n3WR+ElM0NnrVH505xjDiTWbvclbGNm6KxVy4ygTuq3Dl723qQeugijTYYt7idLVrzPms05uHmR82XyerFiUQOmvsi1oRCzxo94VONS0FGml6Y1fg1enY11OWcR5vAz/xxmIMx7ia4mI1SKiHXTSJ1/BDglFfim3TJ08ik69U4j44dzmj8/JZLrqD8wNaUSp7bS0Zm0VCqtA1K7A6xn0ylT15B5GiLSh1NB3LvK6Yyqrxcpcf73pVLTSz1XEJdIxBKQnT2wvC4oPL/Uyz5Mff8szhk38Oaxq83GjhqXuFCnnp8gf3PtKx7mZkkCvdBYXGiWj547c8ZiKfS9LlYA4a/TxKYs7NV8cFX3/JnpWVm1GA21rn3SMNOQVKR6FvutcdpNnmVScAz8CxHAzxYtTgJTXCDgwC7jXfALk+35SIdkj3YHx2nfZEs5fe9kcXqBD+LiS8oQNfNuWCBlh+cQ/DViRr+gwTapyo1th0PK1EA75T+3e++IrlIsbLA93vqahnDE/WWZ8Igo7xavRk0t39djFsQ8uzoLR8jQnRtuyNHllooF3uYU29wmGFLGYVJWztV6FCovg9K0VJkj85xINgisgPGh7HbZ9K202yPKD0ndKNfh2+lWIVHSoITNGEfn8H/p34SdBBcreMRtMmszqKYDGLvhelXmMzXVsKcDhfeyMm8amX5HcYjrcpR2IA8EwbO+gvMPKuMNpbVb1ZLhQ+qsW346620mld0k3gc0aWql70I4rzR8l7r62I1wSNzmcp8b19UrxrpRKana+9iCmUneCvI8RG0eaN3OCWyzuUge4zdJeQyqQ47lF2qz+c/8vfxBR6FAG7DEyl7kclUEZTWQ9sO0Y/pHGyNbIUPJIkoD6VTcu3I3K0wDVcq7+pB8Je8jToBNtzbVdD8SJrKD+EL98K1EvW/6hTvlBjw+ydBnskilUwfL6q5iYS11aS2BH8Zs/6Hb9Pgv0L7QMKZcTct9S/g/5EZkRJOWez3IezwH1I0ff+XvCIpe0aCS74w78IoV93x4u92LCZca8vldHTk0avvM3BsRRhFh+qFm33wSxmxcFhu8UbMhjnI1ufQzTN0fYxs2mj9h42H2ucM132ONzUd8ry34AcfAh9lsc17X86vEOJolyxc2deCbT4bnOeNRuL7HnwuXjm5YSXiv/Y3yNHBh3L0aZr3Ott32S37KPxwrMnlJBWIporE75ij5GuVK/JGOzpXQRki66pH48c7YK+CEKjEmIsmw4eHJjayw3VACxmHOJSdvBpFmP70clYRjT8pPwUsL5Owd38I4nFZ66uxNlYzDqZFjZ4jO1qcT9Rw2WV999wnbDm/8lG288/8remdUfO6FVlE/J6n1EY7pmSKReKYYF+RSjztnT17UTNvEODvU3nHG3N5hsIffmGytTGKMTFz6V3fIPmuw+YZ+W2d3a+PxBTrb0T4EMn1ai0Kfe52jVxMKLPKRd70m2lOuIGvXyxYXYUCW1LjzP7k2PjOjobaRbj0pP3vAMvjcAaWEyu7w9IaaxkgyHSwLKXGTwkgIYAz6vt6VujNqa1TEnkIZHvqYyD+SEt5RbSQl3Cn6kJT04X1iVdpxX+WxY75xWQkthBvX1MsTCF/MMdOBvilq1j8VqKeHRT03PqfjLTnkNuVsn5AEky6qmyBz8ZaCeCLhaOCWgo1jvre4W8DPeZ67N4c/rE4NLf4WsYDVErQYoiBU5PEQS8340sUFgvT3N/cEOeV8sdGweBh6lGrSZ21oHORJ9263SN9vkmcp64h2h6rZftoW9e+zG+sNQ/87EEyaSnHtnRp1C/Ob0nCvBf1tV+c8Ffe2s8uXPRdsKyiEbENQ/PEZnm0tl1tJs0j3SEsohZN8TFFr4GcPgcKqP0P4RRFCeLi/fVFO4CLN8Tu2sEZOVbGKY0UP7KlcazVF4UcK0L3IEl5Kdtg8hCuXp0RrvQuFz3KuS+xDrU4Nf713wrkqrnuM8cF/wva4q8+a8ak+6AYWjWqh42j4/8OJvVd+f3uvfPRrm8O/q88kBmH/Pbmx/sjjZ/Ux2WkPeufdwINm0oZNrItts6UGIAHrDPDRH3pg0vusMBpYEP8qtMsrR+N/qG4a0dEgP0oPHQzrPgPIBgBbU3SBZLA+KReNEgNgemRNH5G4tCvIOYLBrixaJywgxK8+GRBjdX1uwKptxJDYTumQPZl6OAEkEVIC1aPMM/JjDLGoFzEBTUUQrMRLpFm9JLe2jYuj0/CG2ASh1A016grkXRxZPHqIKLCNs7upOh7PT2LqTqi9QZtFjAM12KUsu44vngHQDgcALaSx3kQM2cqw5gGyAROtc1WEMgpizEM9h4eVKLBGyXNVAdc7y48oLvMV5CaJ70DDtxE/S5YqFwHYlcoxpPy4RTyHCg+JfGfXPLQlDnUiCpOwmgRrQ/BEGSXKq5HNcIB6Rald72g/pCpks1BnyFz7HhFSCkTbxIcA6lW6JEbAoybRaajmqYfxr1o+Xj0VeNyg5ohLSFVOeRiPnKqIeFW0wfYEcZrmWckCyPhkKtVnZ+ttAm5MFbglroNyFuSwvCHaQJTUWiITxvKcWx4iKPLNmHBm6s9rrpYbInaHguAbJA6+z4E5Jn9Mm0m0URyhke/gVvw6vr2yV0la1GuKN+YC41RUviHMWJs1MlGpqNxJwenBZSiLWoQFpoZQm/gEFQpip8V9TEzdz7DfOtYuJ6/PAoEYVBIvDIlriFMWLYs+qsGcbKyRVBLREsc10X1UBNdyAwWK6iPEZeQop/xTnEePnDoWridXEW2aUCAAOPnhn29WlVbH9b/QHRrujjdTfyqqigIXNuKLq4OSLYL/qDdrw0ngNVB8Led30Q+YheBTnFiq0cntvegtEmek1fILYCgI2lSsj3pJfygTahLbYVqSY16Udy6ZljivmhRnLclmVpnC9qxdaGz2My55T4V1HOIyJvba2/euF7qlBzhFQUR8THxa2jO4yaGl0NEy1l3p25H1NexLcU+fW6HYtNy1LAQf1YQ+3WsqmdXEatYetA5zzq2aCSqN3tGufFztD0FbCpbHVO+uywULialPzN09Na5AJ/0P4dLWepzmAj1dWihDG0cGRenfZhFNtu04HZRH8oNXh8lQK3GxTkWAt23vRjA24zhaOhJiN7nPxS2MGtCsm7Qlf8Z7mM1DaMcZsKPvhDGd9150xd5tLFKsqR9cjwXoSOIMVAGjWiN4sOOuvYmXyGDf7FmzJ+7c97J9P7G89p4YfQGj7GlvdTjMS9jWUDHrwvIIu73jpZnlpIZDsrnKAJoev+3i2+uwwJJakSKzOAaNs6yn1thAeNcKGMK1Lc9gYJxQaox9Nkxsl1Ka+fv0VVzu+4M2WwzN0UNarbefu4hO3CId9MgqWbPRG/U9Hh0zQ5PIvjPF8/SW2qOB3Xh+r9AS+yxjH2UbvUcHip4UCzuXLDXOUj5Vs3fmiDbUvLRTQVI3fARhcffpdQSH8F7Y2oEYO1ayYNu8PK6uVpH2vfGS76BW00jJqkUt6jPiEo90OcmFaJYRhkfrO8bhmn4ZE1bobjxyAS3LpdbmyO5/E4iGVsTWP8AligNhc1L9MbeUPjqXmISZe9h+25R4/Qg5OtY3Ttv7K20x3d7W42Y3NWQZRxdyz8d62e+XWkbdrCg6298lt1CfFgo58ruoR6yGYZx4TEngA3JsMn2J0do+Fk2sbj/Wz0v7d0Uv2ROSOlTjQNcCv1lft8fvk2Hu7u9eTwD6BU1FXjOgCb+Ij5hPp5BcELjQA4GTnMCBl3MKDV/mDF6cyTkcJC0X8JGRUeYOrck1jKV5uQ4nrcttsNMPcwcS6cnnutGBDQLDY9x24VYg5QRJqIm0wt+HnCETP+YcSYTmAtkkN8rcoepcw7NkW64jha7LbUig4dyBzvSz/+5Gf8beJjgc7yQQKrWksAD2cMrWdyzmhI/saGkbaMyndN8tBiw2EcMAaTCyqg5JHOleryxgj8WaBjek8Ht+qjVR/FILPD9PyIpjJVOHkIoomqBEPBEb00PJk86s4sfu1yqZBgKichqc9/xXL748NfOZSVSYh64s/XmLH1Do/wn58vU0nU1ev1bLv7fXj6+rZT8x5E0c9/xCT8NQuq08cUJUfavXGDZaCXwHLjx/o5sMHDNwyEfLMnGvWm/duZhwfFVOYlVxa+jEd35trBW5OWDGTJZF1UVAS2F9lsohDCwFtIwvipABcLegmTeKlfVii60gXd4Q4UcTtXvgyO2xkLOwTzG+GFIx3NkNO8SNjORB0dz2Jpq9pHUdwrNGqpwAP4dtCcL+xhrCnV2A6xwxm+v30gzPmxS+R2cf/drD2euPvvz/SVmkleW4xoMR+yNKsqJqumFatuN6ACJMKONCen4QRnGitLFplhdlVTdt1w/jNC/rth/ndT/v5wBAEBgChcERSBQag8XhCUQSmUKl0RlMFpvD5fEFwjB9Kr5YIpXJFUqVWqPV6Q1Gk9litdkdTpfbx+PrBUAIRlAMJ0iKZliOF0RJVlRNN0zLdlzPD8IoTtIsL8qqbtquH8ZpXtZtP87rft7f3w/CKE7SLC/Kqm7argcQYUIZF1JpY90wTvOybvtxXvfzfj+xqHlk9ew9IxQ/pKJquhHK37Rsx/V8AIRgBMVwguTxBUKRWELRDCuVyRVKlVqj1ekNRpPZYrXZHU6X2+P1cQAgCAyBwuAIJAqNweLwBCIpAKBQaXQGk8XmcHl8gVAklkhlcoVSpdZodXqD0WS2WG12h9Pl9vH4egFAEBgChcERSBQag8XhCUQSmUKlWZ7OYLLYHC6PLxCKxBKpTK5QqtQarU5vMJrMFqvN7nC63B6vnz9fIBSJJVKZXKFUqTVanR4AIRhBMZwgKZphOYPRZLZYbXaH0+X2eH1+hAllXEiljXUemxUD07Jdbsfj9Sm/FgARJpRxIT0/CKM4UdrYNMuLsqqbtuuHcZqXdduP87qf93MACMEIiuEESdEMy/GCKMmKqumGadmO6/lBGMVJmuVFWdVN2/XDOM3Luu3Hed2f5/sCIAQjKIYTJEUzLMcLoiQrqqYbpmU7rucHYRQnaZYXZVU3bdcfzi8hmNVtKWhyWXpimv4zGu0z3lOOSGBdQcJNeDFBsq6APl2BiPo1nWqBnV4dRuVptVRcPzhFfNOVibFfk2XV729Ie1WOj8Sg/adU6SZMoS0z4FFXzW69ktSkAhF1Bf7rtQerjk21/pGIv/oqCtult6Oq7qK2q0Tc1iseiCW7ajvoYuDNrqAHJyBZD7I+DSjYn5Y0ju4LF3fzXXwX9B/4rC+ZwvuGSlcjyKQAxvVaY2E3xMGeiJK7Qic4OnvefSCR2k4d7PUkgjilb5KYE1F8V4G/nvwg0G1Pbky3FCn4jFFeIR1XnLBDTTiHfTpOj2jbkWMmNNmdcbZvkH+/pl/u1kCWeN6JGwH7yZC7xTUFsu+GyNoNUbcrFJYGdO8qXNoBwV0Di3cJ1PpDIcNX0cNeIoB5d8bebv7Q8geFwuaXEWXsqy/r+NxSqj2YYL8atu4qpeKGNWL9Sq4E0feSnXqvA013WqqB+B5OCWjdwQz+UAgOUZk3f960FNbhFoQtveKQnKFF0t9n9ryPnAHZQ6UyOcryKljf3X8TxvfuWUu4VWvEJgVE8g8Dje0IXMw0nqqA/F3NB2F/d48tng41xCZfa0TwiUDGO4ONr0kxZrXNq7N7zkOKW8WPWX1FqQOBeBVk9VPPOcmHiNz9QPR+srokHu+XYINL/NxQuKPzBZhLfcj0kso9BZJ3dheN1f5aUgo/ULqpaHunJbCev1pkz5nmJx+2YmmmEQGDeXMtS2hPlMO8nvYaANUXLvzmIFt/NC8lMHmVXdR8FOEfKIWU54+rRJ33zgVCy4AonkSN0xXrurnyHSLxY8Xln2Z3hog4sbVOZ6JQF5Rt+5Ech3pk7m8MKsSiajZo6YluzmlbAdB912lZCkzo2bHxRY5m/Dnd8xplRro446Nk/cejk9dP86Jrn0CXcJTC7esjHUJc+xmp5CcCTW8G/j20KQWnDXXEkEW9Qj466s36NlFsb4WbqswVlDa19JBdp1oqIKQp5A3LuGvJARHWv/iQ9cHpIN0vhmQ/NhzuDVHXG9LIN0SQf9Z4qvbj4ydleTrzyh9L/e+6FUNhTYHbvdVUJv11Zs/rVIHJBOPMeF+Br76aF7pX/kTFKXs16lBKN5tBtgWGzO+3DIMyg7p3V5ZxlPtvLUO072cqk9Lf1Nl0G2X/DfSXitfEagteIt1+7zToeztmby29V/I/g5Mqd6NX5DG4e8XLEvN81cT28WupLlG4WiLG/ApY8i30kuhKyP6SL36tGebPDJj9D9zbtY9kcLiRO/EAPFeusQLF8TTVTdRTvPUPL9zyK6lFbpPrtdbYtOYw7TuYjj23606q9dEde5gzjf2rpCG/USk5XT0kfZOa6N61ydXMMuMPl8UXm0scvaJQEx1nKNurUFmRKWvn5o+aoGYTCJMsrn36ZUsC/NRmaNQYwA8jD+m1KoMzV+CLqq1BK/y4hOrbCHh2/KBmZRa3mCsR+yvcLJixZlRy7n5q67jxKQnyh7pbVBZuks3h6Crj7Y80cMjvhV2n97pXMceznyUMtma0pzUqef7wxufv91cbCeOK9AlAWdg5fpn86arqw4v34djJhJhUFzXYWM/Zs2lfjhdxIyD+Gjud/N0P64XKSygdrTU2rTlM+w5GUcwAL/x/Usby70wDsKFFRSZSC3qnxE/8RRtLvtAtnVF9WZcOawV23eDlDQiF7aSbsM7xpgHhcXNPG0xj90cZpA8yye6jvxBo0sncBbtu4qq7pyA6YAgIoNalo+Eki5rykX/Yx5g3VdGschyUsMtfSv9RIXdKhZeiqYeqOjb11c5t0Oe6j2gZ9SWw62KftjS0ErDP3wmSVIdN1P6uXwKjM1xqwnqZ6kZzMWf2LhH8YwWOYp2MR5tkPzJSWWABb+3SO8TU9reGqzJ1o5gluXuZuF5yf7kpYCvwducdFbXbs52L4AX50d0390ZzPYkfoNlDdUPwvXveQy7VPRtaOGtWwFllBIaSGdhg9tSuX1mJ6pOjVXVA0GnAhFIbfDqRgAUUXtB5r9Qlq5iL9YJ9LtOAH1Q0T4e9wgMuXXFxpVotdi4bd+muZYj1ab3aw38bkb+0wOZv+465OsL6G+ZmLx4xSXxG3WLithPj2UTSWP+P4uUHQ0WszT97nv+LVfstTnj+5PO5MIt3ipaNNtt+VRy9fn0uePiokJ7v+WPZ02bsniEBFbE293i9PuJ9ngMAAAALV0FEPGnb6zP88rbXtCmPPvR8UcS3jeZ+2vqKlIYOhYpYm7G7QwLe7fz43s7vfcLz3zxBjz4UoKLlA9fvzxmFNmMOAFTE2sw7a63d9psjNy57N2Ou6qI4nARUxNr83dP9X5vj/Mw0gIpYm7E7QgIqYm3G7ozpIyIiIiqllFJKKUVERERExMzMzMybPzmqpzfN1sd0M1prrWeBExERERER0YGoaHr2ir8c/beM/nQm3q93Lo7D4VmbTvnLi9W+GbtnSEBFrM3YHSEBFbE2j4329RZ+GWKVct20wZ/IetvJXURERERERERmZmZmZmZmVlVVVVVVVVWzabq6e3r7ppOcf4Q2vU5krQEA";
+}, function(module, exports) {
+ module.exports = "data:font/woff;base64,d09GRgABAAAAAX7oAA0AAAAChqwABAAHAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca75HuUdERUYAAAFMAAAAHwAAACAC8AAET1MvMgAAAWwAAAA+AAAAYIgyekBjbWFwAAABrAAAAWkAAALyCr86f2dhc3AAAAMYAAAACAAAAAj//wADZ2x5ZgAAAyAAAV95AAJMvI/3rk1oZWFkAAFinAAAADMAAAA2EInlLWhoZWEAAWLQAAAAHwAAACQPAwq1aG10eAABYvAAAAL0AAAK8EV5GIVsb2NhAAFl5AAABxYAAAsQAvWiXG1heHAAAWz8AAAAHwAAACADLAIcbmFtZQABbRwAAAJEAAAEhuOXi6xwb3N0AAFvYAAAD4UAABp1r4+boQAAAAEAAAAAzD2izwAAAADLTzwwAAAAANQxaLl4nGNgZGBg4ANiCQYQYGJgZGBkOgQkWcA8BgAMuAD3AHicY2Bmy2ScwMDKwMDSw2LMwMDQBqGZihkYGLsY8ICCyqJiBgcGha8MbAz/gXw2BkaQMCOSEgUGRgDQywhuAAB4nM2S30ricRDF52dqZeb5PsAi6gNEvYDIPoAIe9NFiE8gPoH4BOITiJcbLCLRdche7KUIW1tb+cPdavtvc6b11l+/Teii6yU6MGc4MMwHhhGRBZnXB/FCF+8uTN5zjnrDsNekIDFZl4xsS1d25ZscZXO5dK6iKU1rXota1qrWtalt7eqODtTXic6YYpprzLPIMquss8k2u9zjgD4nnFnK0pa3opWtanVrWtu6tmcD820ylSAIyRn5/Ioo6jSrBS1pRWva0JZ2tKd9HepYlULHDNdZYIkV1thgix322OeQY6qJOctawUpWsZo1rGUd61nfhjb+RwzOgq1gM/gUfAw2/KvR/eiLW3VJl3DLbskturiLuahbcBFM8RePMBCKB0xwjzvc4gbXuMIl/uAC5zjDb/zCGD5GOMUJjvETRzjEDxxgH99Xv86v/bby4vKC9SKhRV4PzF/hPSgeSyxGk0vLK/957xNi+cPzAAAAAAAAAf//AAJ4nLy9CYBU1ZUw/O69b6l9e7V1dXV3VVfVq+pu6G5qbXotmp1udgQExBZFkUVBQRAXSiEqiBso4t5oRMkyYxbzJUacyqaTRWISYja/+dokJpm4jJPkNxG6Ht+591VVVzcN6Mz8H3S9d/f13HvPOfec8zjMbeY4YhPhwUkclwnag8QetA+hvJrdjAc3C4FTm0XuFEf/Ie6SM5z4jJDjasDjlJA9GHc7xVCwXkmmE0E7UlLJbpQIxmuR+ExT4S6U9SmKbzhHnyhbuKspHPMIOU8sLMwIQXSBU5IK/BEO72gKeap1umpaBwd1cFBHE3jsTguub8bJbpyIe+zCaG8ynUHpRNwtctPWXbXiqnXT4DXx6mWF0V6llmRNtlibEDg9GJ/X5HI1zbsCXlFc9X6hozKAvFaXMCCOb+Mwa0MO2iBxQei3jQvQH4Ku1kcRPMIKtjnS4QDvdrhgGNx8Tv1YvVf9GEnoOiL1J9Nh9dhX3rpPPX382muPIwHVIuH4tTejZREMCZCkJVZzyX4FLb15JMW1x9XT9731FfVYhM4GdyYncQLH+bgubi7HReyixEsW3AQjgKJKRInanW4Y67S9EzcTmAPR5fS4PbV8B453k0w6040ydm1yUnY6PTBQuUBE/duTieymVoRaN2UTT6p/iwRks5A3y0gQTbpTWbN88FtviO31mWYnQs7mTH27+Ma30pfkVveeyvauXt0r5HtXBwgXrj2xp6l10qTWpj0nasMFzizLfAw79HadQZDNz289/KwwyRdxOCK+ScKzh5seGDidp7l5WoY2x7RvOc7PcTwMaTOfghbGa7Gnm8CE0jEljyYdhfsNof7OFnWo+7ZrF4TDC669rXtIfafwQM6BV+jCl15x79S3/tE0OxsOZ2c3/eOt//1O4Xmt7C/C3A1x9RqMylAcnbeIAE8A0IxMwTQTkdNxjyzAmPjUh5Yil1N2qT1qD0yoCy9VH6xqQx+9LXfKb6OP2siNbp/6pGqSzK4a03vvmWpcogX9Da2pdkX0s9FrDQ3q5Nl6uj5wuW49hV49ihhhaklEKLXj3M3gt6C4uuL4cXUFis9GO9GN6DXWroZzNws7UUM3ulW9vVv9hbrytdeIodTM+HlaSduYE+jYu+gqjhQhJAkD7w5k4rWEs4kBxZYOCNwty4c/t/wWe/PMbf270cbd/dtmNtvPcG+r3377bdS9d9Pjj2+66OFHNk3P5aZveuRh8i0t/G0YByNdPxJdP1aujmvherj53KXctdwu7j7uKe6fOU5IJZUmVC/WIKe7AwEIX8CP7EmFQXgR5NHY+E+Z/kL1jV04KKf42C52jgfPKb4CRz0EnsPcSIxQkVPNVaa6UJmw5D5mi0aERZMtR6FHx3MWfJgVrNInPxJ+esRJKpOo45ZS4XzpFKtbYAuWp8AtVs4n3ZlHjVAVGjNiF4gnXH9S5ZL9/UnMniNukjtXDOboltmfRPSJf1ThGf7RuWI4tjDZXnM2LHLIpbWqC2mtso/xj43/n/aPrQ9zbTE1H2tri6EsfY64ca7SV8idO+6Tp6x0owBz0gf6ZdlZGHGScUMvmKCiMAChcefif3wWPvmoChAzzMIIhJ3mzh1X6f4vjtWooYBz6kbOIt7Jf5lzgw/OB0msb0FISfYgOBH08KhD4p3+woS7/Av8d6mH/H7qQAq+n/rJXxawKP9daD31+/3qr/AD4IVyrznzgeDgD3Ahjgs7rUisj+oRLVtJZvSjy3c7JT0SHKxk9dfqr7WSkAKuYm1IKZb+awg9b6y/XIqGu2j7RQjOwWnaDDdpDzotIW1uOmBbhkfcXYPg7EdFLIs7F5bFc7J5SDYDijIE6MaIcxTu1Zc6F+6Fh87KSZ1/qEDIXlzfdw6ErLJPVs7DtZ4FtZ+s/YU8rRVnP12rWXs/cUuLZ7xIl1sDl6JYEBb5ALQmlXRk0m6PW5Qs0PpawBMhSIk2I8AVPW4H3bO1HZri1DtPqL9X/1X9/YmdRw40XV0XsDau2bBw3/E3ju9buGFNozVQt77xwJFCrn9dP/zh3OM05c4TyP/411DvpoClqfHqwJw3b1wHySHXuhvfnBO4urHJEtikvoLnFNgGjdkGDf+EMj44si9wkTK4aEASsWt+2r7x/OhCfs5hyVsc7IFyn849UHI4rlOZE2Xh+ZcCc2PqRtcN05eF0CD0l1PMI1DPyHwweuIa8CeVetHpjlMIgvUpwYw4YUZCsEZFCf7TVsNyjUoUkJQoRRMBl4egZkQHAxZwphSagFWcBlyf9RAWtCcDaDRQARSFtiAJgmoB7g6dPHToJD5kM31DdoZmGfTV97tNln0TWmxmqebfLC7kn9Rwj8FqMd4alXTWWY5qy/8y22zGlyxVsakGve8Bt9k8OvG9eqvZdFuYJfZZITF20xoOoU3/ZnJjfzoSX27yGSL36jd6rHfF/Xbz122uDXrjdWmD2WR0rayKT6rGLjNL29w8eaHJZDCH7zNsqExs2J7QWbTErX7sYmcH4K0jOEgHN5W7SsNDKmdZuIBfBtrWWUtp1G6EgjC6QVESGKSVEZZQaU1nGC0LY8jOEIeFzSk80DncueGcxUpIllgthQGUb5UM6ncMErnWYRlY3TsM+NQAA53UDOs8esLMs85AKYuDBCrAyHIOd6GWfHW4H2DeHuHnbNNjrH8Igof7F9+4bTH5Oqv9uUgyGXnOoa1/HwzYlQLhZLb+Wdeg40X8K6VH7gwAWoidDFEKa5SSBlAq7scuuwc2FcBP1dwZwLkAV8U9uAf9n26dmZh1hf5Cv8lk1nXrsAH/OLA88De2NH5jwDigBihiSxFdNIR4hH6tKnjKHD2W8JTCv+gQ1s8xVOvwMp/vR9+hfVPXfY3S/NreSqdYhpbDuQVQ6xqDQHoke1CJwpmj9SJoF172x9pip9iZSnKxAf8etMNgUl8zocvVAUB8OH6PfyB2OkfjRTi7Y/5p6l01JjTZdMrBw9mOBhlTg5TXphP27gkjmK227xTBhrM1o4AF2WpRIM3ZMOymsLXDzk5gk9B2hCENHAYPnFJ/eerAgVModgpdd0J9Sl2tPnXiBLoMPY0uI0NqGW4oLBRUSHWgmANfWpn0xAk2j3HAl+bB9mgHaOdQijQjSqZIxCVqdI4zBNRNFIIptSMREaidetgYEIXcerq5sGR05wjRMURufpkXOc0vmZ3Iixymv5kc+KPmQtbsQE4IVj+EcCdymAvZZh86ogs70WIIsULIUUhihSRosTOsQ0d82M8jdjKped5kswFtKZsRZQOYz8Bzdrqbd8p+2aztm2Zwnn6vu0RHiBQJtHIRrgswlOJeWHrLo6bd44730NWH3BLFY5CSoWwmDSBc9mBc0DhISGGvowAODElDP7mz/fH2u9AbsTb1m/Y6NetIO9Rsnd3eiIA0Q5T44hqPJrVc9A8FRvC+u9rgD9sbatSsLKN8TUMU5RndlK2AFS8XZjiAs9yuMqi47AnYLorA0o1sCl8BL/yAQf2W0WtU81adzp1nCwf+flSGmQMHzoIaPGAyqd/S61HWJjsZ3FjUQQeOV0Da8bNAZ5y2anucthlqLAiKCaJzt3V1RQsNqAeajbLWn563qQ861UG2yQ04LCYT6tHr1bwNfXyepmIGExQFMLOVH2xGURIkcHgFPcHICDRkZG039shucgZ1IoJOFjpPwgt1XoqyeEDxnYKNquoDQ8pHsr6U4YMqnCVGjD5UbfDKP63WMi7kb7u7cKyqvr6q8MuuijGyctVcVMPD2aFLK0zD2Jxj2fODgcKQ1W6zBQLBOhw476LHz85xqHm9To7gXER2yGr+h+db9ajcpkR5L4oqPUgJ1Vsw4GyJOD3v4/Rgl0S+jGQm4jyc/YDacRRSG+32un0Pfr+EfG0/OVuyWQ179Ui3Sf3BF0ZQtYNI3nA7QLjAqVmfEovW7ttbRPHWXWrA+n26KsOeB2hK1Ib8J3Zeu/Y2WESV+EyYm8lWAeaC9WFAWEb2a6A84JiNl5GT0sJOsq6U8Zwu5OCCrO1wVv8RZdV16gcH1P/YcJucpNMFK0/eO/Orl93xpxnGRgBHs1xF+weh0L1i4GtmeQp6FMkHkHPD7ZANDQlY/Zv6lWuuvE3WilCS8t7eWbdfZ7/CIxOZZoeQfXu1ALOETGgudE1WKCjqzskv4NAYjDR1Af9YujR1Ab88hmsln8WF0giBcz14iB9mHsLIjPHdkOgU81Cu7yi+LhooF/fXcVyF8QIrohOEuYdpffzcSoYvW+O8xk+vo2s8RXd7VyWPiNKCcP5SStANy5mirCRbIroDSIc2I10g1ka4/PpDh9arQwW2X2OIzn8d6dR/fD3fRuEyW6Qj7FyGwWV5w4PtLq1hgxSrbsaheo0PS9c5xZkBZU7E6bUC1J5lHcr2re8T8lXVv3i065ZVd8/Oqx/abT6lztX+3jc2vHSrEk/vumSx2acI3CzltIV2nP+LMivV17etIFRVW7ZOSE44oFd8+A8Bj6VmR3uH3JhsVBjdX+Kl9dEWWjEg/q7ROGoN/GBBpJIYthrsctbR47yMmpVgDGgEDL0qEphirtP5Dffe5SPY6Mwb6qfVvKD+Qv2y+osXaqbV3zBzJG75Xvc3nJ13DKEk6kfJoTvwvqMPTgou3hAYQT4DMztNl655EImPP66eenDNpabOmYERpDSwYXFw0oNHH0be13fufF39k9avAOH4IcDh2L4Fx2IZduGgcRM4q2X1K+optg+LaC4sVX7wNF3haC6EUDRzrrYGKbwE+Bwra+L4pXHaRDLGdbKZsOsDz7h1oNxFMwxWn+Ktr/fSn+KzGmaMU7HqOLzbL0SqXTWuqpbelip4V0eEaga6sN99A+ZsJmvPbG7Dp2kTHKnFUHYnA/Q2I97GxgGFB4DosOEoJcjLKT5xj9BFn9tvNlUr0TbnnMWL5zjboorPbN6PPqf+zAxgGpXqpObwTfv23RRuBieL/NknH4WMekItdAiKL+qssaaf+fozaWuNMwrQ3/E1NanuWgkxYQ9v5qt8K5ENxZFtpa8KvJ4wJFnJmRiRT2Ge3jEaYWeVOQ+cuHVw4rfAOUfXqiuUkuEXhB9itIo9SN+A7ttRMRxot1TIHrIHXYkU0pLYUQ7+kRyQXpTsoD/C0ecZrpDjczkarebYuwD/BfjRIMLRbMMI7ULFfDQW51QWTvnMEIhZQhpMfxy7ByydDWf3I8o1FfvSQfnjiZA9If83fj3wLxBYXVf3BPx1d99aV9fD/p7o6YG/W9nf6p6e46tX02Q9PULu1G3Crv/Sj86LdqY/JLzL9uiaCh5FESMCCqJMiSE3ysPm2LeevyGiuqLJVKSQUlL9STSYyin4hxHeSCP71GwqojojEfyjSC6FBpP9KaWQjpZw04ekDcW6UheqTdBCgfqDPZHGhRKfoBUox4LDzbXozQiNy6WGPkH7kizQXweZoDL8AyWlNZtwBsB5boQ2L+Gu4LYCxAJNYqF0FyznTBLWrpLpxmwZK/Q51gFRokdiXSrmk0QPO+YBDY+6BZG5e1BaGSHlKvziVTG3+r58/ZThtXPv83vdIoIzEZtcomeCjgiY+ImrkUcSz4d5uYVHOowtblFnN8vOYNSPFDP+eM4Ct/pBeOYlw49VG40G7w7yWE1ahyZIWDn9Pm+y4AFzFe8CR2EQHOvOCuHrJ88aviG7bMO8qZ18s0VXLRqd1QZlg2KI6Yz1Ynhzvb5ZMIcE3zZFF9LrnD6dKRKMVrmRSPSb5wzfsH261VY9o85HfuMOWWvLaIuaLzu1u9uHheK9MIp7NC4AY4PpGVxoYAHnNb/f4wpGo0G5qjWkzlRnhls0v8sj5PTmtvpTf69vM+sC6Hl1eZD6BT349aW9PCdqe5EJaP5OjmvQNhPG9wmWQDFjL7KsNQwtVDqei2BZx1gUFF2A3WcYfoP0roXPaYSobB7ScJchs7xlPuAxeDA24D/sj2Xnb0Ec3XPaYoMFjfbMqgNmeZBiM4NAQg/O34IDlFlx2D8QO8NtKcoBaDRzkGuAHlCRC8Cji8jACAJVZlcV+dA2MvuDY8c+OEaGKMp0KkefQwl5bQpzqbVyonDVCD+ZDByjSfHsQ+uHWToCz7smzZw56a7TOVSWWRjhLWu43AKYJRIHxCmjQO18RkYdiBJoDpg5KoqAKB9SdNUDws9LgPjHu4VUEg63iAhYTS1JUC4ljRRDIv7554I/niwry4Z/gD29rQnF9D7y9qV05PXggQbr0hqnVd5nFVGPmu1X/xzldyOPzqU3C92LkNrtW+vvUPoJwu3/3q6LkAXkJ2o3jwvDN8yXjAY5WofX4ZMWSQ3MUx+5tP5/t080WWtERRbsvM2CmkJ+Ac5gg0lnO/JtgtvV96vcdQ6g1qJ6h1NnKdLR7OxywQ5/GcdF3ImAPRltBtpLgs45xVpEGO4IXcM0jPXZyRZ+N9+JUjZI24IoiQbJaonLaSESAA+8QmxkcNOcXrSjoXp676Wz22f7EUY6sXHqop1rEu1XbO2NL9Chwu+xdX9YMooCcvPhVHNC4Neg3+/2rPDM+MzNq9qCE5d0px59fca2p55fNeGFCevVa6wBNP+63gmdQTtvSJ1M6rbPuQS/Kfl6ti6ZcXWH3xz/QaJ6va95ePNq3ms11Ub8La64QN5s0pn1Ao8WYxn52pfc0pdcNrk94A29+tAVT1053S+6NdqUp+uzneNcdE+DtehD0VQzjmYoaQpdpncLEvRQxPCkHGlRqqebd4jOs909f0q134x2rkfernmyHPynW9pb197jFyy190V0JlGPq2+0Y7fDgpD9eWI2Nhlrtvr3TUt8/daLJFm2hHolnMTGUJXZKJCrsF4Q9DgaN0Ssckuw3fxg4e0l+jWLLrI6+OoJGeLEjhF4PQVtruZugdmLu63abRhdy9CuHu0mjDJHEKUBKC1Al1E3Bnh1MxAVJUDJcLSZ0H7QvdjjdMAclwAcygtTGIZdgo6IPYkpQUfhnBG6FgzZ7eIbQYfzVmc7/BzBBQsqPR//JG16DeYtfF8YRcRao8uia+SdPBaiNVU1xGZGokmWarD98vi8gB7xgmCIPR8WSH2/+vspMJPEfvFGrywizBPjw8EdTrk26Gu05CK+p33wF+G5kmuY489Uw/wiJJiNCG0eWlBj4Scs0c+bjnR6ghHi+YWZ1YWvHrFdOyvoarLFDBYrwk5HAumrAz5LI7poLXpw7TZc7fE7eZPXYt5+FfY50C5tjAnjB1zGPcRxcnEcw7zHPWYQUwodFDaIdSjlpMvgHOPYjZOAAzOBstEjiaiYEL0wgeXTDAOdCjrdTnp7AlOkAB5N6F0irMBgUoG8C7WxnYEuQ9z2oKdyYC0Gu9BVe+uCjY16BItu3HGV9AQJdMR448MNf7NpYyvUmjozWd7n47OZTpPZKpBhjghW89hQnoYKu2DMMeJRoGLI585AZhFjXliYOZzMvPr0rPGH3Lb1n+/8ApFqdNKcWQvTgqnaaNq+jo35qTPRCWnianOR9ISoK1wXwjhUF3aNG8hpfNdRPA12u/bfuWOXOMX3MZMWEYuSLaeZdInAmKuK7xTziVwxjqXk4ZkfETa58gLO/0ft1sQTSa7YbuYTStI6zIf/f2j3WBmFC/lHt7tytCvH+r880v9P2nxh96ds83l4dWNvj+0X8I8HN+eLv1DfESebGWp7jocI8aeYRwDk9xR3rphzuYfKpaHrx3MO/7Xs5McNHT8bu4s/a0w1PjS950hqErefdjTOGp2cbLbo1SG9HgX0FrMsgP9j1kORNeU0e/LZse6RNGSIilLQ7H76uHDPKjs5bh+LvH+Nn0MlZP67fRygHWScQQs0UTj2abuIT/hpCZq4CLhU/afoosZnZPLDdWz+GBVV6lOJuK5BiHGZJC5qNlU71E3Hthey248d247z24+hg45qkzlKmUSNdkFGB4+WYo5tfxYdAAS6TE9JGj1g4Wq5ZjqSlD5Jx4GsSiEYyAqWNlSseMawtXFu8+DmzYP85lM5lB3EgE18zPoh0pE4WCkFydtows2FvJrNs6QoAIPHBoyHLIHTjJXN54syi4C3vyts4ESg8qq4CMcFM1HJlXChJGDpCFB0oFuA9Ib22REgH4iygQETRBtWvrsyh29wG6TCbyV44lopjQaH8+qA8G7kqDpwNJxOKe9GINWGHBl001QGN031A3VgOI8G8VAqchQNPqsof44W8U9ek/3wjOZ0WBDlaSiM8U00IQ10KKg+aOuZ1WNVDwbRBPQ8mkCKshXcphnDp4KKEiTijE0n0QT15Ci5EplKiNezu6pRF9Tcg/SuiTw45lZqgM9qN1D4P8++O9T49ZyQB5qH8l+B2iFRpZ6h9S5ofDpC78op05IAlRMHBI543Jhzohq3X+KB1vMDZDn71vdhTj2pLldPLhS3XHyNXx9PJnT+ay7eIi5EuXAQNQUzHpvNkwk2oWA41df34kkV+nXygdv1z9z9q0tq6+trL/nV3c/od2nrVfwH9FMEGJvMdXOzoFXabHIKzKU7g+TRoE1lYKxUuKHyQgWWJqD7bsKmXIIJZzJwZMfWw1sHMBewq0/bA3a0euGx7cMMykm2J20lxDTJ4vC4hxkYEgAxfdYaG0CBwoA6xK9apQ6t8i8Ach0NQDFtAzhfLqfw41e0UrYfq5JsdihGFDVBkNW9t5qhFBt+XR0qQFHYvwoFVvmhlAXl8Wf35E3cirGytpPiGjpNj6fKnlFazOOWtfvLLhQKSKLsZqueStd3S/SGhUkHQZeFXKmL3Bmz7JvbZhA3l3rn8Ptssut9NcdW/6B6/PrtE4lHx9sMBvfkxpDkCnXMu3bfi+sHYcvwybCT45BaKPVTNlcLvnq+1Ms3ZYPZa9Pp0VtqDvaLxvzuveoLHiM2W+qvGtjTNmnJwILFU9qjbrbBQJJkqe+7YK5bmOSgfbxppV08e2LpTiZr9/GjpRxHulueUYOZiKPn1GAWRecfh3/q7fWqi7zea+CNJHwnvK7x4tXqt0dPpQGXp1KFqTQQHToJeb3on1gGr/oxZKWFaHozVB6eyrdMLZ4zjNVE2UclAQLGWgq6nGLplKWbM+NJla7pmYxSkF5jeRAs9zOcnAQcFVAh5qQPQIwAaWVOGXHsooBGUyd9QDSi0YjDj3669PLo2ir4AFQPKM34UNDs6BhZK5c9nSE/k30+udCu5yuk5fXC9bLJdyrrM8n4Vb2hsKKEcwPGvcKgr9APaRpb/jmqYYnSGbFc29l14ldl31k1t5+jCZDY5Cu0s7bsLPK7qsZpS7Jc8+LKmmX5PLXB6I4Uz/p6s7BL2EO1JvRIZN1ia3TdqTc8waBHaPXgywq1ZqdPyPucZnCFK2Q8izjMWfL4wljVH64o+c+0AIZzlT4hO0L1VFJASgl2S/WcVYs4imIaVc5IXlEbO0+5a55iDyXWW1GaSIcOBoinT5kOHwwdHTnosImOqQG/yhwwcvAw+fCrBn25/BKcnFW+xz76ypRWNV6No8Hk3LWD4+jIAOGjBn1lY0atidFtGduIcu2V9Y6ucUxFbL6hBhEJIsBJNcfJ2qbAZgNVzAitxzICYxT2hFcrpgVPLA2xr/AHTRZK8Z2Bpzaej555lD8q/AEwJk6P3Zr0eHE/ohspf7DwPpZl+SidCR9A+R/AcVTmf1Z4v/A+c2pB8KBptDJXQJlXFss8SxCdFroYitLyylAKKxwKwAdpDcwD/7UENOEo2Kf3hxzV7gkF7ZoKj8se1PR4EkG7psyTssMJMUp6J0+7zMb9DOs/0jxMMCw7VnwnW4w5Ow9qOluWqUKeqNiuUmvObkOFLtC4tRZp3rG1VPa/id2dJlsQFRdooZI1VsYss1L8tg5J7OlOxHsYbxNGfFQbbpFffFGWV8jVPurwVYPz7BC0e0zb0JPnS14MQSfOOTYeJudFWwtoOKCVrK0e2koqt1jRPoF3rIR5V9f9Fp4rHQ60nlaB6xzDY+Uq6/0OqFm9+rdQtcMPhMwhmaabM6YNlfJe7dwMwJjH6o0lmxEQByIbs6JgCJzJkgWVUsD5m+nmw2NEQMsy49y1R5f9NWf17JFMNn0qWJ9s7Yu19lzNIpuCgfr2uiqUG9P6wbJwOf6n5YcW/dzruEI0TfN6k0Gl2e3fNjVMo+Uu2eGa1DKnaywwjPSJ0l7tpT7ZR0CP8bnLQEjGdHmUxB/nsAyUBFoHNGllcFd0EJ/V+EEI5GgsONQ8eznIvYPFEMe3xrZ3BA5amO5PWRekGUXLPBcLkhIUAaL+WuQpq4l0I40vA/HltJCvXEY3ypTTQj4og//iJrqQNgWObGTLaeORwNgAdL3iuy/y7hHmPfJu5D4aPyYAc+fKXQ5AE86dvRgwWi4zxKTYOU3xR9I2xh5YEEntSqJInVhh5TrT55JDnH3A4DPs3QuPAwb6Nozxv34+yUT0/fEzlf1V5xdPPlt2Wl+Bfdeh4qFxTiHKg+oKurx/LctXwvsgopv8lfLO8wpT/gzyyEhhKVkWmvfUJ2znZzg952B6wckoYnd2ApOrBKCChmk6MkWNHSGwrGDZO3jt9w8sHa7Cf73zWSCjhcDO19Xfqf+q/o4KPcGW0IZqXse7j9xRsF687MAPX8Z/WXlg+MGnUY/6qvpbJmFZi9pRDXXRczB7JgVt6IORKuoOsdnV+GopjbHGVLIQQ6ymJAtZFFGUPiqGUNgWieC76X1In6Kov8H55BScy6X61F+HN4b7IW4/E1bYpyhzlPWQoE/DR1JCvlifxttiRy8q86i0iWIUoZCPFLZFk4kolI8ihWxyypQkzqu/gfqVZErBd0dwNh2hzeiDClCkLwW1IwVqhwyFbXRD51Iwxn1ClmrMo1LHyliPdvAXu0kRlz4oiWo9/ZoVxToCReG7Q5l0hFaXOk9baFs13CJ15kWoM1fS9S4NZrFbZdyrOLZQKe1lCp4wUtSBlP5kLtmPFDp+fRGch7itdDwpj6cvElF/DWPd30/nQoG+R0dwzjyF9yItR+WpLQIcYs6irnkzjmLoqyOYsJfoNZVSUENrHntky5rukCDYrTaTZLKSXamn8feHgMrCHAGqTKVkF+JMdemLtg2uzUwTQ3qr0673wUlZc/S1O9BBiolAKm7UedqitcTjHsHOS8uPyam1oBLeRbcXjen2V4P61ftlTZgWqr8f9cOiv454qFv9KnUbDKj//qIELXrfx9KXhXJpekg+m8ni0gyQ3scyJJWiDJ/5zD3CX4Xrtfadqx3najeTexunIedoN86O2xB8cNxmcyU5TEHTUSyuxzKwlldIGYAoRUV1ZweY/ibVL6EKJMyDBmNtJDBeKEtfrAtDXUSjocbwiWm5p5mYK58vllRSEtVoT0o/pZhOjBUOvuiI3psgaqo7E+EM7IGzzyOU2xtJU20wURKEHzRX+7K+q5rVjxikqx81XwX+6mZkAKcWhQzaIjAUo9SP0B8g+BqIfkR9nalSJx6B8Gsg/tFHSzEowbSzXy/HVJ4HlEaZyKQ4HaUdf6wOPpGTURoAOKqsheAWbcsubfn4yw5z3ux0wsOBHQaD5S2LwWB3Wr5hkYWxeMjp/3jFIjvNr5idMroSbzKJOp1oKhw0WK2luy1oV5Yzc26gludQLMmeCrrsriLel2A3zE53OMmQ50Rc0xur1AnTKCxm6YSdzgnN9EncTQbVfNif94fVtu/c6muCmcO/bIs1+W75dgy9AHgUTC9Mp4ZNff2S3bsv2dCVy3VtoC70dYvjq23oZD6vTmirqq4ma4/UtS1og7+6I4MUDSvBlKZxuPul3XOffXYuvBwan0zS7DjMY3zlUD0vMv4soK5U6CycoFxmkdN4gIjqD1AhOiqYqul90st1TOV2unlqe0MAHOcL6lu/2wmry+uqXu3ci6Sv+bDibFbf/c2bQw/usx7w2FqaumuaGqqwjpDuOd1+rF/28CubMl/9ypcfihqizvqoN9oTsBElqVx+7E6XF1acd7V88zokXrpmSP32po0twpxsfzbUyFtEsxSam26X+WmGROr6nz61PeywEn00YojaPfpVe7aWeBzQQ5GDdZOA1Tr2hsXJNt2ohzE4BdjBPdFant4ljdyTneEmzR8YmD9pKo9W7N+7IqP5eonmGyxLr/PyvD2XLJ41a2ViIIdQw5Ktt31hTSlk9e3FkCIuQcedpzLmQW4SrEslCru+xg8XJTcAO5sLjVHOpHg5OgsBjkonpOHtEXOH3+nSBK+63jn8GfQAOokeKLzod97yFX/Mv3Opk2x07lejhb+o0f1O5370K2xBv9qPs+9tW3fjN6jK8DduXLftvdf/+lc8Oeb/yi1Ov9+5dKf602mhP6jvIvc7oWmhd5Bb/fM7TK92UKIy2XquiuvipnIXAeRnmhFrqmNsOyO0nUXuKqSgYhe0xcE40yqlPH4ZaCHk5hn7mYeTOpxRohlAtHHTvGVroC/P4b0jvUB3ovXqqqsnGRymnbYJ9/3ncqfzEfQqMl+8Mm1wCL5wbZDYIk/ejrw6lHdGZxxSt/3bnJPo6huvf67n0n+e/P17evIbaD9VFV8z0s3/kPDxgunli20zoNi+Kb/cW9df9y6y2S+zmWSHjA1q693vxNFHE/fMqM8u/MIrexwfvPyV6zdnv3ypNnc22J8+ZPAUpBA1lv47e08iyC2VpTwRvezgK+5qYVcyG98ymou7kplwoYi9o/4UV99hj4QIZ++c0XkENibZQh9oD/qhSTIaJYuaMZjN5IVTuZ6emvr6Giq+WxcOF8+kjcJGqvcH27cVySVud1SPGOe7CVGxf6oQxLYhPdLcHgGWvDAwIdt/ZFCw5yQTT6yi+u9qISWYB/QWbNUfHzZiZAC3iL+NiMpbCDbmLDb8yGB/XhhI5vuPFGbJlgERETMaVgvftlsG9Ng4fFyymU2X6VEKEeTR2WzGnFl4arA/S0+yM9odxdmy0CUp6Pnc9RznKUpyR8a8UaW/zLwp7scV6TJj4iKjhB7L5F6wwpaAO4cC6hAaQFk1rw6OdeMh5s7RJ+FoiOZWB0dUaSBNORyx0gIjkSjXnzzFNNhzq3uzvauR9oIQrd5AlmXLZlFgGMpHee0NoTiAAkzqlRofGP4iS0Iz5CuC555mBk8EeA7Q64UB7dlfpGNgPQtDQMVkuC1Up09q5ivEFEp32F0IiJpmMZrO1PKJoKZKgBzlyCAcBbCELZUSDkyYr1ssp8aPds511yYSfROGmHrrKUHUq3l6nx1Y37Yi2R/vTbZXdxSTUC3okrofTXKGa53X2egNNNc0TO1adsmOaVoZYwJLufi6VS9OzMxqqGEshmGLn5YC6wshIlk89c1d0Uu+yuKpHqL6LbK9lKC2s6e5e1Pvih0LliaCLPOoEC35yP0LbIcUNQWEBFaUKMAepkRTSlqhh6CQoeYRuhFVpJO4D9Ur/jaj71X11KQp9mqeCMiATVhqdTV4a41PvHjvh6j/a39Dj5Nm9bPqrz6v++epFh12OxBv463EgnUpT1vzrNjFSDx0+/tfWPv50TR/gmnyupwMKyqdZLD/1JJ4NymfbBfk5n9PPaLOUo98T9PcaOlc1NzYvKizRfNSA0QqYyBSHz/Kh/O576uvvPgi6v2+xmJM9itunndTQojyh68cSVqZrcgfXsG5xKN8gPJyI1KlZZHSHdVBxho+ixv8+rMl7u6zckrG78hyoVpOlfjDQ+JR8m6JP3zW7Z14kPGHz+IG419CGbSsFBQqa4zpZ1mhGm6UgzM6QrWsNBtXzaQTdaFRmq+a3n+Q3fqXLuJS2k2cRq0ywx7ED6Q+vasTOKpHpzNKPAZawoqycqeMslbFl8dZm35Qwjmrmne2O9U8DSvkaRjVuSvlgDXOG0S76ESDaBBwLDvKud1qzu6lwmbGvAE95LWrOY8HsSCUM+X1xpEs6kAF/ygnaDrU7dTGiyZtwRffVGtQEugdcdk4H8PzqLSx1iHew6QumOUO8iP2+lHQe/o9s5ccpvM9DDSmzVaNv/QjjdFtq7KYeAnxX/IpSWbtQ/sjeZXzRsjOToOtlYqy+4wNdZMEkgG32VHnUqTSHVBR38159v1RDeN15PasOp1dtWfPKgRPPLhqDxksMD/J02dgT/lOXFoG5chco0bta+dySd2dSiVRTQkkJUeXLy2rU19oeqz3dL4+VYcWgIvP1qfUY8P51Se61H8WULHiAPxm1YXUrYmZvtq6ENoPb9Q+eOksdavI2/mKxlBeDofzIpOt4RgQjb3KHbm4xXlYZGOuaSuuWflfJ+l6rbiF5bnypas2figrcSSv1VW6Ox57Uzz6XnjcAkdufcfc8hZvdYt2WHQl/SYzYLguOmdBu6aFFbQn7CUfzsEIwE/g/sEBMGoeqkBF5XeGgeI6nYMd7xTQvAWOamSdpqtxhGfRymXZ6ZUGPFRDQj2AbtKXEgWE1ENxHsAr6Yvy6YBkiabP2hS5tinTqqZM71q17Cbhtt/Or1nZkrpido3b7HNtmLb1AZ/3wX/a/N39aycBbdx4bPswk2si+e3HyJNV+thcxdx707IaWdp6Wbztui5Uhfu2WXR8zyK0gqyeuf2xY0sc+okIj+Q6NuouNEz1U4qXevZEJkS3ikxKYXz2kCtRsrSR4Ido/pdfq32nZdrOnuvveuZf/7XwHg1iIglQOF78pwfb2tCP9YMHPv+nwhe1ujQSY8QmDsWrqIZZM9ddpPQqsPZ0SdoqmApyNiUg2twB6iZBABOpUoVeM7wGtCQV8nC0xSx/YTJHw4eofU8+VzTsN/w21YiDbg5/N1u4Wcz1pU5xqb6+lAhP/GW/Y3UvPctjbTomljT87RyqQ91v08w8zH/+hn253GmWQaBPNuezxIOMTp1ZlH+i08zIbdoFOsHMsmYzjkqeIgNNk8RLOsJFa5CZkjplLU+ymwc3yw2NCzYX3+Q7a+z6aH0TGXjLP68x5i9c9sLxZ15/BcUHn3l9N7p8gDTXB9bYzQZxwZKLJ5MXBjdvXtDYIG8uvlXOviYAhwNkjjXO8+Ondr/+zCCKv/L6M8dfUJ8YIE1wyNnXGMS5i1b0amwE7oxVygkfwgzZYV52cce509yIXJfWP+iZveyqsPPjOo+hn09v5qfCyA9iMkFMMogS+bA50HpYdoWKA1HxIFYWVXH2wF4B5WslQKvs/53MJMegiByCI6FvfZ/2VHMW/WNGV32bJHm2y0bD9ZGY0SR5XjI6kKe+4QbJbDTcLxm6bR7TYYOlnNS9gyatb6pMqjPRpKZOq8cISXHuIZMjwe/Eun6L0+m09OvwTj7hMD30kNme4PnutmJEokHkd/AJu/mhT5u+aMroDEPCAYD5VNGh3v8Ng4y8oYbWqUa9SardLq2QTRtbvFbDIwbXxZLuM9V6g2Wee4LiRXZjZVJd7Q3SCodlY3NFUp3R1u9urfdge2Fov81aXbWliiczV7swdq2eSXjwVlttEFHjoRE4HLgEomY24Bk0zlNjJR/+V3KV5UYYLhxhUq82kWHDzBwQTHYSMOFunrEI6D0ILEwJ8IVakUIaVVyOiqEAXbFhgEpYu9RM0MvqN/9l6YqbHw3HiVHGgLRjgYhICNtqXIab730ZTUe3oum4896bDa4aW1hAItVXhGROUzz86M0rlqr/+f322iMotvWWOzy3HSJ3q39+b69teUwPlCeRRJGXCBXbcEVi3lk/3X73e3v3Fvbu+MksbyziUkQEkbwoSsRiQ5I+tty2h1+xZNWHd8ztm/lmGe9munOd3KYRazOI3o4m0/R+vkwJwREOPaUkJvSrG8GBQ3lksCKdbGWwn9iE6SCN7Kd0UVLKieqcQAIqGq2ZpOGPzourgwPZAZ830uDO8ErVhHBD1BYImCM1LZ5W4We7b8wLtSFHymkNNOUm6RXATr9wT/iSgW/etNWtDtH9EznCa9sneT1KUzSx5I4ZrS+sO6zZrMG5xNz2H3asWe274TNNnmlCPJAKhR2FnChZdXY8+zlfrW32nEB8elWXHa0KXzwnGJ471eVeO/fuIxObYn0pnEv1eXf3papu3NMYmbJv2yWXH+bKNpiYLGk3pS0rdrQom2s2HmmNYyJZBG3EBKrnhz10I1dSVJmVnoilbY6JjVIbW+XjB6CGbmGSqzyk5fFqClidKUeoVlizLLf7Z0Krp6UmYg4EbNGG8IQqhc+4GyJeHwwoGojPyx1e90JrKHTHkkS0Pmb0yq0da8PqB2zQAu6tuVeu3rz/i6iTKPpJvKZkqXKhVcjeVTU9XqdEZttqfRctmo3tOqskFnKOcCgViAvTPE2fucG3ek3HD9vnxq86fPklN0ybPiUSXLN4qSs+d7dXG7fYhAlP7hXmrnW7ps4NB2cXcYIvkiyjyQFXOsu6L8mOtd4rDJ363tnmeSvXJtV/nUxvKZsJo9TpQNZbCBybQBNlinjmGJvJYq5p6sCqdTvWzvI6uh3eWWt3rFs1MLXpm3g6nvZy7p3CA45z2FMmX1h48+xmW2LuVL/b7Z86N2Frnn3zwue/WXgDt7z8PDWq7BjP3HIZJxcDsJfEKD4XcbotuBLXcBUDinKa7biWlG/Mysm0GzKcw0iwmlUmpUktSxW9lPeBqOVtu2jgyaBcGKKCiFlGmOTptVlggA+4fGZNMF02M8/q3kK2dzXmJSOOJ2kWSBwo2jgIALJbGCrpAWu4LrVFBXRjJmEPwc7HTm3tVoBKUdRLiVTITcDNDmLXWDT0/T/+8SM0Y+vsmZNRxyw8+48Hdtw1G/+RkD9K1s4JW9HJStRzJ/7am8lp05KJ6dOHn0P3PvrktrW9hf1oj+IITXoCX1+JbTLeN7OZYqQy9UhDJ+wMn6ANIBZqCixKGAWUTtiLxB2l+OywCw0Bhgd/GOhMdXEC202oWuhXN/qUJy4vm15MXv4EHkRMtIPZJVP/CQjRGpO9Gr2j+G76HuY0Ok/lvlemv+heGh3P/m+NZt+3UtC/bIVxvHu/EZFczBpQyJblj5l5NCp4+kJhq3b9h/e/IGuiinhAzZcEcVnCkhAuM8hIFlGhRpaP3QLSfPQ6csTGlIfC6TlgUF/uU1IBTKeorRAKNmKKfGpBbn48EETXH9tOFdkZzCLWE3WoCLPFMMD0Hx0fFFGikK2AXJzXIFengXWZ3qey72ZuNr1vSAH1546kgk4JTieXUzvBELv4Kc2DdkfCdmVqT6TIWEpVUMXoB3POcMf575zh5txzPLf4nte3NKaUmq6pfdsclmGYkm19U7tqlFTjltfvWdwWQwFoGWV1BmJt+J6nfzIw7/mPBn7ydM3zJ3Iz7986X0g31M9NpOesnK5ZmJm+ck46Mbe+IS3M33r/zFysTeNh0stQfYXOAqVs6gCeJnBx7jbuASpfG1WoWQTtmUlHi35PGrrB3sxfS1U4nBkakkZUe8LldIATzigLprcW0GF2IkNCZoCKzl9GydA7UZjnbuxx07PHQiRNVRsqcoyFZyzxkl6An0cAHEQSxBYsSYhIOjdGRNQJ4kps1PPwazYZurAbYye+XdN1+O6jDjsS5eSEJp2nHgtGYrSIjkaTrWlCwCL5Js2ZFU15a+SZVb72/e3GUL9c4035m7JdSgjZHY9+F3GV+wVaIEpQtyQ1S4TX6Qg/iecxLxAsIwlLOkmcKfFEgh9vs1mhxToeTWeqISefU/+/JLGZkk2IIH2dr8OKBKNO4qvdfr8ktrjFqtTlM+a3d88Rq202u11y14pzutvnT16WCtv4umxsDTbZSBIZ8Z2Ve1LJdkKezR3bB85vv48Z2kxnKLhp9+taFLVoVmTBncuC3+ddl3chrutyF/o8M+LXSIUvqeTlGY4aN0N5B8xZvk45hxG/tlmz2trwQKy0TGOAqeZlWc3Wls9Z4QzA4CTucnrOMtVkig+ya2Cmlg+EFdU4djGRDmdJMZwiMI6ME2uGfrS0LKPGY9MkBrW0DLTgdAYUeZfFaDLoDAZeL89zdv6po+mqqW17pwzsmlTl9rq9l1VNfnvyi1fd9vPtuf3Dj938g8m/bYOw2WvdVeHZuaXzHv32zs4/tsv9zoVz4AQ0YZsDvzrh7upa/0SfZ6U74kD6Vo/XnZ40+9//47bYYINn2YQad1144i+Q8+5n1W+ezkyoqbl2tne5J3ak4dqfn/jalI6uea2GtUs8Kzxmrz7Ax56olIWgun5ORpsCPc6QN44uJ75ovIjZlqV9wnTbKXbPU0s001nUiamGhpBzGl1rV6+qTvbULdCvmbtL/WB+a4jUGh1Soi1etazaIjlCRiVgJTWWyVMnGyQX6v/uXlxvqdY72uKdTktNI181eYY8QyQoVr2sKt6WkBzGWhJqnY8cu+au0S+o60lWr1q91mV0EhHSTa7iG2sszs54m0NfbanHe7/bj1ySAcq21BBrQDGGHFLpDCvbkOUupJjGD4zoh6z+txEVku3HBK507tC4wZEI7dzWbJiImj1DO8p4kHxeYya5YQ49d/HF6DnTOa2acKcVdOiii9T1worz2zcZ4bHN5JYxHJKPUrsU9PKfGjFAZQEA6hQAvWG2oIHy4Ty1AjPYdzajjQ9Map4oCn63wdoUbjBLsslNLr+3DZtFqWFSg8FJiNdX7TEYW1PN0wTBLDlwJ5r8WbHV0VAVtk0+6HKP2daWGQ2eap+XEKcB8kuiGWfuu5y4TbJkbgg3WQ1uvyBObJ4U4N2ug5Nt4aoGR6v4WfW1TuyQzIIwrTlFJlfuS4jKYolL4HyfxLiKsPawBfEapUrvsbVXF3J72N23m/cU7WtR/mNaXDL1UtT/2JvqT7+g/ufboaa3X7j6aF3Q39S4+eC0eb3zJtyIVr6qO37H/oFNA5GrL+HXrZlu8d+uFj74X5se4PfhWy4TjJ4vbeMVMuHexcv7HvqKQQnfcfxK1+TrewyMPrj0TI78C+BNjP/NOIRBEqL2ZuzaXRv5lyeWdqJIVFVPnOHOvPHFg8Lf1H/MmnVc/WVBj/+OYr9+6XWO6TqfeY7N6xJuFXcFt4G7ntvJ3c7dpUnZuJycJGpbUbSbp9QaHJhWKmLdDOiBh25FxEPRBCoBgloAya1FlG8EP9KD2CYHaz2VdMjlI7fyPcpLj+akVO9yZuIZGlcS3FF/86dqH0pOXnnZlIb5kYn+9VHlklcvsaWu80+MzG/IXrZyctTgau2d4pE7nE6XTTRJkrvJYDB3z5rq9iBf9Z/U35y4iBgMhBj0IUlvEOEX1ut1er0jrjOZdHqzaQqxAY1rnWq32W3t2GbjA0wS6Cen1WvnCl4HOdh12UTRm56/+6Lty1Zu0ce8Xp/PGJio37Jy2faLbl+Q9orhqQZDU0MgxhO9xSIIhjaPR2kxI55X1vIOrzAXPXD6J+iy4V2SQAQ4en2CUS8KRoMimcyS4AvrjCY9/GxGgXfzomTGRjN2GTHx6kbddURGWaZW6KQnRtvrodgYYC5iTvHBGXXo5KGBkY8MAFbObO6QfEnXgNrkybfFKqwefoOa5Cnx7IvfWqkq2iEr8abLdbkY1FF2h53pQ9BNL5OidtSCLnGI7mOakq1ZFnOy2Sx/DM8BxOUQlLu6d0StFoKHhszyaU4244HCoFmm5tJymkyMoOkAB6lV37IGsFtjctJjhHE1KQcTVp/bIZRjMBceiTMxO/SaQjDejGVHzZ1VYexWv/lOVdBl9wmDKLzlujuxGTsd/vt8EWT6svo79ZZfVIWcDh9BIvo/L33zTaRpCavf8ztdwap30HQ3DlfdWeOwm++8bov61tPVTmeo6hdoN6r5shlFqu4DQsn85jdfUoNFPVOueLdWxzVQDIcbc7/mGfttmWDJ/HLFvllhrZa3tfS2tPSiFvZ6qlJh+XScf/wJ3msZ/ovFy/Nf0kba9j37qgyxZFbZv2dDl/Vq2ejfhyWDy1TV+330W7Pdbi7cWiSRs1VxvDrV25sqPB1nZ8Buxkdo5pIMGihVCD8uYoE90ILgmLYgeq6nM2Vr5wEKNMTOCXZezFFWSn9SvVTd1t7LK07RMalFqXn2C83SRLmaGOw7WZ1D6Cvo9WR/Tr1B3YduJDnG9032o5VBefWGaHBKoqOhtj1e3ei5rfOGJVvSq3upjdFcf3I4TF5Sf9qg/qWR8Z2yZziR3qUZAX6nAGGeZDhVPaVnUJCzJ5sBMcAuGyNs2AcK6BDTPc6R0ax6UjaSg25w5H5bx0WBq2YXbhCc6ketKx556ZEVrXweOpKFBaZmk/3xRcu7on9+Rde2oE33yp+jXcsXvRC4qMNmm30VakUTsDOxcU1Pz5qNicJ76slkP111/cnGVQc/95e7DyPBLzvp8nPKfvX04bv/8rmDq9iax4BLqsItjDYDykK0sicV6ZeYzLXETKzTZw9jodJnJq0965jVR/r0uLUnzQ35hYF9tQZT7OWUqa6m4aVWQ4NJqnPeeae/scHQ+lJDTZ0p9XLMZKjdNyZVQ82dd9Y0jE6Dc2OyYTfNZmwYydboH110g8FUd/fdtUbDqDTlb5LRdZ7i1o3lpzKpQqo+IxVvNyiDEPa9Sn5qiUUoFhmqRU3eEq7RLVA8k9dufYJlbqpwdF68kK8N114809vrNcdmzaydPjMQmPXK9xYeL3JRUR9A4sNXH+ODjJP6meOf7SiyUQMGj9dVbfHiKSFzrL6lR7nlGTe6oZKZ6pycWtw0tevuCa7swoVVkwu5bLaSidqfuvpw92SNgzq9Q2ME6mW73+onczKuRd3Z0B07p3Ue5irGJwW74BaOiyTsml0i9p+aDGM0gYt9rA12D4p6eUR638mo9240hoxiVEYP0i5iNFIjEdRQFyqO56kVGX42EAiEpnTGanT8rJjFi2SH26WbeTEMVyEfn9efRH0aZ5W/bNmSV19B6zRSqy+lDnV89pVd976AUBcJ8seufvjwOnSD+5lblJ6W+pg5NAV7LdUur8eAAqm+HM55441BvbAw6wbCIKh4uqY2LU5Nds5NJPsZYzUwZ7bNG7hoUTarFAe2AOPUMf2x/UL/lW7X5O7DV191uHPazjtC2e5FrswcAuNnl/V9XKX9/yJc8aVhoKYamlE9uyOW7NrNp52Z79W+dsf+s6ONMerFilOvWShSLmntW4GMOQL4C8X6SmTn0VHTnDwLEjBAQo5OeWH8Kb9qBDBWaJ8y7KyEx3MB7dJPAJ1lUB41Pkmuk36vkeqpMSEAxvuh/y28BkE4YWfEaspOcV43rDbqw2WrE7Aviey+h92zUnXUosFaJv1VoUVKqbhstnCeWW+ePDLpuSIVX5zs9BQ62ek5N945ZrLZ2umYjrMAiLMuBLUhDWhJFxvawjQNUmul80NqEa5H00J1DCti+piZdFH1UBKddQjRLwzQkDH6mVQYWjUcl+WV9NsBh1Y6HCvRenCC4zj6iGqEjqexeVxTVKTpIal6CHKB4/j5dThZ27gk/fgT1YWERpV1RlkT3fEMylRqHAoCK1trjGpgGOJHxaai9SuReWzT1qZZ64uN8Y00FFKr59TTLLYrquloIq0pPaisVcs+zhAera95Vs/LlSHL2FZdyVrrOEdfChdqVwsbrrJwqKZI6vQg1qxRNlCoHuk4PXewUTm7XVeMzPI4MMCdOZ8enBH9Enu50XoPFiTFNevOcL4rlI3Sg0Ql6pSSihgtkeT1FhRSYDVDYkpppZVogkVJQKe53PR4oFFAh7kt2Eqzw3+J/mjqbpSi15AhN5P7hyPXnY66WQrRo1gQraGeFpmmBTLsz02N6YluidLGlBik0s1pJoIjaYV4Mm6PQoUCgH6M0iOd8n0ybinNsBPaLncGthTJA2+xyBRC4KHGHhkfKJPWDFnHa6EiFhuKuzVuEbP3RxkNUFRGi6OEuDuTTolRQPco45rlpaMkuurpJWw3URg/jspsUhq+G7FQ5GZCEiF3mtKkSsadYZXDrkfb2Y0A8UqmIIN2SxuNZ+oBV0/TrJS7TF/pJJuQdIixm2GM6FshaSb+Hk0X7T5KFuKhTEJm3VKBBBaeuqAltQzbozYh4W+sBguZhq0iFgQk2ixKvR17CPESbDIiUW/BBoOIsBUjQgRRJyEiEhETI7HaDKKeSAKyOokuCW8Jmf088QE5KmEkCjwxypQvLQrhqqAoSiaCiR6ZJBKyCmZeb5AFC9Gb9DxvsuoMyG7TIb2g0xG/Qa6WqkUBGQ1mbBGx2QA1CoKOSAED77ULPI8IbyHNraIo2HC9TrCIEnRIwrzVorOJBy6WBB4DYS6iJhkTM7IhIknQOkzsZnMQWu4wQZU67EGIIFJFEOZF7LNiImCsg1zEYHFi0abTu0VBxNhschKhWmcw2QWrXwrLWDBKWPAJkNCps9Q5BIIxr8ciQk4suAVihnHCSC9io0mWEL3yr5fMMhUmMPGYNh6GEUlNolUSsOAlVQKBngkGbNRJOkT/WSWDAVnsvEuUeATDrZcEQdCbdJJQRyRMeDe2E+IwG2zEpCd2bHXbj594gMjEISJJbyPYwBtFiU4VRi6rYNIbRQHDYhKIVW/hzRjmDsuYJ5JcjXmbDZ2loKR+D9mRwYQknSjqZOxGABZuZDMDSGEYer2XCNATSRQMBowQjCtGgsgj3ibyeh0W9Lyol4loESS7WWfjdS6R3QPA2FirBJ3ebNYLyGIloodOrNXEWwUvjKWBKlc4oAIAB+QBuKtCVp0FmawwZpJegkADj2BeeScvVPF6gqAFOmgGDLfVB03QI4sk2PQ8EUWTSCwwkgvulRCyQReMyG/nYc4sMI0oEOWRaSIhMR3ClF8SEkW/HjYzmgc7G6t4wcUTqE1y2dxYrHbpdWFRMosGDIPOQ1/reVmHzA4jER0iL+i8mNRYg0gPcCM5eJ2X6DFAMUAA4Ao2swlaIBOrjhDM6xpthqDdhq0EUfulAI1ELxrNyC5UOwhPAHyJYDHEwGU3Sjq9Xkccsh4JOl626aEmI7Fhk0GnkyQRw6gKOmTksRl6ACsNYYMoDN8efgTqAWTBRFurg2mmkEagAlhWWBQAiqtEWLlGrCe8DTpDDHFznb3K6ualah3TjnCdcYm3MprJRTUhSyi+vqiRS+VXawHMmcQEZ+PYtyickuDyaJ+j0FAr/LnCUqqjul5R8LHow/gtT8u792jKQO27Jths6m++JTx4k95qL96F/B6SRzZSLVZ8bM3DaH906h3PaUylYK2x3nhsaANZOdPJVX6TU9PjqIbTtQMol2AqiEq/C3zLdayf5yjur+Z4bhhcVJoQfyJLkMxMP/wNZ0tsL2r+4g/n8lDaWwDa+yaBY3Kqbqls5o4qHLNvRcWFm+x1qsys253hZFWmH4ESuEb+Vw01qlzwMcN2nOxDf0Dv1zRQpWK+fM9NmNxlC/teScUYBF0lm1MhV5B9h2Ds1SqmXxDg+OK3VegVPP0Q+sAZKPtjbnUvGtBYeGigd7XA5QqcGtDYKYO0a4MwBFTxJNe7WjMKXvpedpGnz+kxZRO4Rr4MpGcnUInxlKZKQVLpI0aazSwrBEW18aAZWaxA1CfQ5fdDp0sfDLpffUJ94n46QMWPAd2PLocA2WcyxegdGkuDLodM7EtaeZ/CLICR342frzY6Jhc1AEZz0RSsbpaC1i3Imlwlx+yc27lJ3GRuCreYW8m4+ZRAsWmchAw1rF2WaReo9It28ySUuHSlr1cz0xFMXIkJEENeXEyBFz591R2LNt8s9u3omNor8LkDNw4fuvGA5AqkZ6ztMvQuuOOuOxb0GrrWzkgHXNKwZpePLC1Kx5Lg5kV3XPX0QqF3aseOPvFmTfgRAxQunIcua2zyRGruLlh23H33jtTabVdcOjXWlGqCv9jUS6/YtlaIM9lCta74qezCU/MW3iRsu7sm4mlqROtZZElP7X5xs/AhF+SmclcXraUAKVzLM7INSLERwy5pVDL8UgrLlESDiCfNaZr42j4TLdoAKCqPUR6Lh7mEF/xv+GONtSRglKW2mLXKZ6ojQf+J6oaY/6C/MMV/wh+L1hz0+9+obhibiuy66ODiHTcuPrF4+fKlO3cseWPJGD/KxqD0AKkz+aqssTZJNoK7Meb/cbXvgB//CRz+6gP+KCSqrhudqPD2h4sPLL7ox4t33LR0+XIoebS3aOMyx2x7cxpccNRACzWpSD+IpV3DSrVIyr391Ok8bJf3bsVowsknEeqYMbD+UMNtz6PcU2/DHrrnN2m/9SSa8MK93YfW9/XU/gTojethzZmZfn2QWn1nUJfRJPuLkjZN9BgIomjKHrK7hL+3TV9/Ord+ehv6e7ZkWkvxZdX31A/xv6ofOnPLL96162JShe4ryqRtmaYuRl+si6D71C0RbdtBRdlMiZvHreLWczu4O7j9XNnmv4AYf5HtcQw5txSXOsPZE0wwl8lo1rNvyLDraIZtUyHh4qRT5mKameFm5EQiTrqZySAoi/qotRUohFlxRxLkiiKXxIz5gztDayUa4wxtRKf9RKjNmW12S2HeNToecOI1i/c8cNfSFUZpzaI9BxZP05t37jTrpy0+sGfRGkloaLpo7wN7Fq+RIKXuGvxli91mztUKxH96VXN84aor5kS1V/PCeHN0zhWrtBeyDAQt833EIgCe9IsBPAQ75qAecD4L7yMDucI/voSNWDskfep1znDIlgWUb3cvjya1zr0ntWTekpv6700tqTPrZ8/Wm+uWpO7t79gYnb8kee/c1kmI70W7dVLWFgo79zXuSXSE6aPQkdjTGGYPPNhuDDt1LT5iA7QI/XsAZ7Pqwi0DOszzNt6n5rPo8D7Ca/cw2rlRx9VzES5Bvywx6h6meEKWtFVc9nRCQkE9Csr0ECl+ojOZLnvEwdKNUGGIfhEC0U9CULsC0zpz6s9RU4E9v4s6VWaZAHMx8kvNyZdNCqBA8dsTkBnKUL8e+7n6c/x59efqZ1En1SmiX61AXGxg+B98TvMxnjZ/Zo9ws3AzswLtLFnV0Cx3FAX0i1obiDGbkhV+15j0ws1PbrvziuG/b3nrqSevx5cYumxmQ+Hp+VeuP9BPdD2Lskt6Ct/01dcoVehRQ7fNZFCv7Llu0fIuPP2Kh7c9eQXRXf/4U/+2pfC0wWTrMuBL5x5af3X/8N97lmQX9eDpXqUmUK1eCXHdBvRo1/JF10Fha0bJ9lEd7enaNz6YPB/7fsyIXr89UWJ5jdVBHatz56FYGv0gEEdyOadB/aOh1ardyOVguAkMt5qr0AzOlb9Nyobf64+xjxPlLJMMqMrgLCn2n+Y0SxGYq7jdkYdZrMC+Wqr+yT8wSvdkXDt8ldfr/MBotRXtfo7da2n2jj+1Ze/Rdv7O5a6w3v2H8ZzsjM9L1A6Ddr8W5TIUoylpsDlKt4ZjaufOEX62VWl2b6j9CR9W3rSdyo0TWOl+g2VD92sGhgfLhpTJ78aGoBFL09qwWplu6d+5Wljx/bBrb+Ruhu2ArYKMtjqkaDfOpOrFEPuQFZxHsivImK7afUm0m10OU2ZuInW2IfJgKpGk2KYoRTMJ+wUH4ZZNC9f3Tp40uabpap9uUli2TbGtR3MvTXRi9ZDY0tvbUlPVHLrIe2n77CumLZqOdgl/1sbBYdEGSv3SBoR1jTPvWi+8VxlTOVpLFqzqXT6xxp/VtRmmNjgQTh1efr1pDs4+FXYkliSbJniqqts7EpMXz4wvbs5Udarf0sbM4pDJDZdf3nCkwWSP9O9SN6q3lCPGjOvIXYqVS3Fr2V46SrgxoinHpDWjsNoHJKgyDTvYypcDJFi0llu6jdMUWijenMpo0kqeoq03Kv0lMkXlj5kUI/qO39N6x2cQH9/We63BaBFMSyzx1PKd102b2tv78+nr2iPvocekBk9rZNaC2Qtuum7h/slWHaUbr7TWWoXQxKbujtnZvrkTWxbW49zIt/eyoYlrVryY2yWbwsqCmzod1UBTPtS2sqN9+eypU7udzX7vGS6aunZtW2uoudXh8sRsJp3FvLG1VolMwPVzFN3kSNjlrvZ1dk1bMrumgi96OdW2l5UWzRAu61M8I3lcojYgbpdHruit1uNmbcisCEDL4854yoNF07tl98jIaXdYsOFElbF2DVsjOmKu7kzuqV+6aGttWy3CndlO2YyQRZwY6lp+8bplbU2t9rDdJVmB5pbrm66w4CWv9+8AWn9idLZoJTqL6LL6lDl9GzYdeG7b9s4ut81eJSx1WEY+oy4EMV6OeIkAjW/J6vVVlhvMUfEd9U83z+sItvgdwbC/rX324/PXHFzaMdUVQpgsNRAzVsyS14SMotUnxYyyeud3NvU3T2mfHAg2t/T1b1/wBJr7clX41O2luXFwnKEswzH2mwL3cU9pFiMq+24f4x87Nv/T/rH1jf1GKP1OecUn6ivco2NU7txxnzxlpZuSu0wWQaAicWWbhujeslMdcRLLeKEXTFBRGJpX+YVRug9Xn3msaI9CZvqSTdTCBxC+KMzkvVvKdkwjnv/L25sAtlGcfeM7s5fOlbSry5It67Akx2dsWZJvK7FzOHES507IZXI6DpCbQEKCCKGQcIUA4SbmKtCQQrl5Ca3aAqXc4YVSWmhNS3kLLUfblwKxtfnPzK4OHyG87//7Poi1s7uzuzOzszPPM8/z/H54pGgD4DRb5ocguEH+PSwTT54UY+KLoshyeHvylZUrPR70By56/vnmZvRH/0E9kr5TTdDPkmvfieFr0aUxfK344nXkpGelPESua34+vVw9Aj1qgqw9JLLyv5lyUjPyLOwYCxqreNmwHItVYEIBxSGC/CIBTFH8kCDTSmNAKAKPEckFe8uvguSdRu0vtazi2g+6NJLgM4RprJRiTTZBhw0+QdIgxR0wWsn4otTm7g+5GKTJKLEAEAmL6Hpj+sdkl0kNUSaHoKUBwL4S+A8AWis4TBjTVBOzV7v96CaulAIgkJNhplEZHAY8EGHVHocYEZAiGsf/KkYIlQVTESkxh15UjX110JwD4zVg6w6HLXEnNm5okrSV1r6WC3/au+NP16x/8uIl5d0zPBpogJwlcuLBmx7cv6FlmqAJOmK1rQsKVlmY1+UMeuhssk7rXTbF/5Nww/4vD295aU9jz+4ftPfe6TV4+fGcw9py1k3v3Xvpjz5f2BLYvri4duKW+Z018vLJG5aAiz45oViBcnXrypP7M7UTFXIwtXJk8P3OymXwppT44XT5fIe2wra++Ym/TN71ZF/vE7vPKp81w2hjdCxnqX3j/hvvv7yvGVfOHq1pme9c6bQ8lR9jvHOR/+FwPQj/ad4dF3Y29Oy6bOLa272sTqiwOKTWRYffufuSB/6+sNm/fWFxzYTNc6fWyCtX35oNRM7ZttxEXsPYiT5bRFDhBGodcVxqMxZ0gpFoIIpkHFvEFhkpodI3cvLh92j3+PmxVVddtWppS+85N/YPDPTf9wpYfO6556H/gJgvw8IdrtA+Z10scM1L1zStWY1XX97agbOdBy8bJt3i+e8eLcUuU7GArTCPFNvr4Ikrt5X0MDrui/rsQRsWwwLRSDRiY+/4sfzTN2+Uv3x+27bngflG4HntV9sf3nVi584Tu+ZeeVZ7MYf0qscN9KoTb5048Rbc+Kb87FM4IygD5ue3pX62+aJ3ht65qGrSopmBobY2nOfEiewaIsZoMFCFVAXRBAl1Ke+I4SCjEiTq+atgXSusRTqFRfmCcdiOzVc3akTH0fPJLTfMKDPidcWyGXsO75lRpmxgWd/hwST+7pjk4U9Drm/JigOPAYWTPSC1vztolQc+vurgRTNnXnRQ2chlkMIXyOSXTuT4gkIq1gCD9BvKmImSIXgGqBgMJckJjNaZkAhZEn0WSUsgJdVlcB6Q2kjRCeVaUgUVAQEDkAwRzIEUxhxIAeIrISkO+cq1CSoJMUKAMcusq0IbYM0+9yAmkX8fKcOnnIQJJq/MCpCgA8AEKbPyLBx+kyl8SH3u8NiaIoqK+IhvZBDzQY6eW/thTzopseemk7BHoc7OzndMcrDfKHmZnsGkxLyWz0OC+2eKUbDn3CNbVRzRTsPbODSi2X6X1xJjtCF5DnrcGd/dsBup19KUWsYzvDt65HNz8cQujEaS++7tDsbhgU2Q2L6DMQwdRvECUw5JYEEJseKqNFHKQnlFA+i7vGHK+REAIudPafgRmNpQvrJTvmKpbkJ5S8yBpudYS/kE3RL5R/7W8+bOYFMTVtCNQx8TL3xXTejfq8qqa2qqy3b9IQwWzDoYkQcTfHVRiSiWFFXzic+cZde3zexdTt75I2g8O4fE/ZWr+BZ2xVUXexOSFX2Fot5m8YnmauCzBUiIJVgmPwlWgHXz4JzV6364mrlWfmr2grb5Nr38FBL7QSe0lk1Z13b0TfraIR/9R1DbuXJl57Szzx76IP0SFNfvmBTxRNLvgmvBl+PHH/SOry/+c+a9KeNrHZkTcTh2STiEw/8jeNUN+/SQuYPjRyzzY4A/BqnmO1+XP7r9Ifnlc3mg2a8zmfnOt3f0Pndg9uwDz/WufHzy/ryV+b0bgHT97aDwdbpQfkn+6PWd1+3TFWgOaKFuRS/K/ia6asrEA3kr95es2bjzdVTG0lM27m/sb7FPm28YaC0OTvVwON6XVY+1MiQcmnWoXaiKw8gBrLp2JDAktIQNY+zbDBbs34IbCO/ujaHyU9QeoVSANsbMaOhC2q13iS5jaaHcW6jV2vUe2hPSmS06C2eFggCWjpUV3DxG1j2AKserVBuC0eA5wSDAlrFygJ4lQCuHMpl1IXSB3q7VkpUyI7qV3o1uqkE3t0H0GPSs0VlRqcbIuucUVY7qEs5heCj+xJi9FVs2pudiq7PCnBSrAjiKnfh7YC7hkhE5Mh5xwMwrdh9LhvkdJAkLMtArm6/XcO7aKn5N83KztfvWA1ZzBVxJzqRfIRuo5rvyailw8gcB6WqMZgXOAV1fXgPImelQpUc+Ava4KgW3S97LzmiecaC0e0bzFkHJ8QrZbFfypeTBPxQVfQC4J/FNrvlSfjwzLiiYW3Y8/1FIUEOyD4ak52MKGn1JzBxicmBcGH5gOBoXAYnuknvlO05cu3eh21l1867yhkktr4JVJ06A2XkYXazJOQqk60twO/gruJ1JXvn3/ZtemVbbs2R22zkhTnPl34H491/lgLtsljFwu34MwkeP5tYgcOxGI7U6vxbZOtSF8Fv4DhQF8N34CUj8oxfLr8v/vqOv5+yAv7AiOnP6LUB3xx3pOzFuwvEzoCuwjd8LVeEaJtn76No5N9fXz7NKxTqh99FXH/3r/r+fAWph8JszoyzsuuAEGh/AKYq+CI1hPsUOqxgg4hKrGCdUZ3g0StBBHPCyXdSnPzIWMTqLhXlB7mM0olFkf804zWCq5GKPgqs0jES/bHUO7iqAbKGZLl0D9CYn3SCIBRaNTq5ZCfO5P+YPXw9FSg+ST0eSI495jBhuA7kJXsHzsflUFEGeqi9VQgp7ZIqsyI6511UHlX0SeFjaAzFyX2l9fjhiKpXJPcZeXVcqcy0+muqqS9XnZJMU0mZnUYtVuSjj8I6RcyyxWmWVEatNXMYUhL3JwIhdMpkpuAQxCs8a2CQEbCE/T25HJ29+8+ZQXWjm6pm+VtonGfWGmkWNHReU8zZGbxH1jI0v33HFDrIrWsjuBR2Ni2oMeqMEKqlTYP5PrwLGgft8IE2VVZRh39/n08d7b765F4swtTNn1sIOfcgo6aqqpjXrSjiLhSvRNU/LT1dV6SQjC58Cliu6r//zAQjfWgnhSiyUMlm7igZpxG6sgbA+xZbiG7VY4svGcLcMJ0Uhq/c0kmzxurucxOyMabKaCVOoDhQol9+BVM7YUl/KoJTNhOeCJF7KB/3Am8WKTZ+L8s9Pk3feryzTY9OK0YTmg56sXEm4YMxUKbWU2CZJWLmqM6HmV6MarApTdiRG9N24FXu4ZaExsGZIArbIm8v8YXfyKFEdIByQXNI5dbhctaum90/aePmByzdO6tCN0yWNHxmTaNuRXFfZ1MxUFxRUGtuqrN3Lu61VbcbKgoJqprmpct3i65766VPXLabJymtVLbqbt6tu6kWzKitnXTR1zSx9hf6W6667BW1mrbltc03X1trCWNDtDtYVOZxVtRV1dRW1VU5HUR0+Fius3dpVs/m2VUc3T5iw+SgZ/xXsWReJQSHL1DnbkMIjSdwlzHm4lKFcoLoCZ2Y82S8ZDQb551otSBCqyB5MhkhQJk/2E5TfHgVFEvSgWqB/OpQPMy4mMEKkBH0ZsEiytJyFhMxgBBJuoiiJAS7PWYAytixMEMh+h12ZpURhgNx4AJNR9mAyyhU6mLE2X3U+tjbfDuimKSv6Do/bez/sEUTQQ+w8/YQBsx9Va4XhbWKD3vt+3GN8G1T8+GDr4b6u1uITo8sYJo7LCj5F1g83oiJCnLaM+DGoFe7S5RX2O8rYL+CaoPwGgyDKpI1BjyR/dppCZvq7Gv+1iOrJWXTYrK8GHUdfKQEpUEAJcBSmN446AP56M2hmYTIcDdsPheuwD6aHyTp2KKZeJqS4beiDjb0d9sbJm/o3TWko2Acm7yvoO+yt7673dvV2ke2kJgAYnaajtzGol1OqG8fviAl794UHDlzYsefw1iWmuo5XrKtbujdt6m5ZbX2ltbi3t7g1cbhvcVEZ/rjLihZjvIzcXscOv25CcV2ZZFqy9fAe+reqQ0c2tlxpixk5SS+O1B+LlfGWYMISlWKUmH3IF4HepTem+OKTNSHl7eFwYZtyhkgStdmwhSkNCnz0ve+HXJzO0hzAbu++4uNAc7zYh9OBZouOc4XevxcfapiCWodWnA4SrStt8vYjH354ZJ/1twcJpIanBElxonweWb07JKKdEg/E/GAHf2vdRw5eaVvZippG5fpU7KpYmw0qvlFsDh4d6U6RrCuUiqEeyXhEyf0E1ZHpH6KSigsUpPYtTaCDTBKDxu1bSqP0IJK3FM+ngaHU0n0stQ+1aS5GLDIiQuz7R4XRie8ZCPa9Ar8U2TChyvZ+8qZJZYFP6fSow5aP4Fvlkpu6E4nub7/kqcN9g1TfYT7x4ZHEvqUY7RIvwhyhx/dvkpPpFHo+o0V9yovbCw5gdq4cFnolNVGRBvhshKnSpUiXsSvYK8PTbDZnnrQDk1MaCPB/w5R8GAUcxUKR42iYOL4Pu9qxqXQSfRZDX+GPgNajDwUq8LA9xBmvf2T6W8KZAdHoTXv3HVfsvkr8ioRmAwUDdy5hNLCNNLLzFh/mRAXqDG/JAeQq+dgRVsCRVkH2OPZzUC3vydKewn3gAp1B/pUBrCLuDRQGHc5AzggiHMik8o+KArOvsKd0MInvwhErfId8RZEBNBhOigyFxYGTFN2TMRoJ/Tnr3ikql8YR31n8+tG2pIepn1FvUH+kvkASlAkUg0rQMpq3Ojpinx2xPzL/SN7qkefPtP//+voz5R9ZX4wIbsl4W47CYsK80lkxLYfXTeXSp/LS9GmOny79fyM/PM3x4WXG+Km4bgQYi8pnfx/I1vRfoyuedyz9rzEOjpX6P5VRHutg7ufk9Rh0dEAR4PLcgfEK5Hd8M09Rv6e++n//lfxvemnWLyOvvxaADN9AIDrc26gFRGyj8e0jvqwG83+ld3/f3ncKa8JoHMRppReSU3nlSar3y/RNkECjJObBSfwf66Nn6FFD1zNJLx6wvYNJ0q/olFLQnp6sY5WSrsx9PoBcIQ+EkNCRyPKYY9trM0YGyre+EgjXjDgnkdeXZY8IZCgkbNm3WRtTACCGGWhDxDobU2yz2WmYLLvJr4DknYLmlzxkKXLgFSStE1O3gp2fSWKuylTGXku+G5f0opRw9StWHHUJD2m4kP+lQZc+RvZp76j74CSswuafjOUW+3T2uxLobsRfPZTBllBw68NUDfoWO5UoyjNW/XtJhUR7GqOKaUVaTBLph0kNpvpz0qIXHQT9Y9fm8+8UIjP4HAQXHlsqOCPgA4oIXk5HI5YAHwhjq2A0HI1jQ2Y0HnGgo9EmqPj6goiDRdo6nwTyh3L/QEL+/STc/D39iUR/qsfrTaZSSa+3J4X3iTA0CQQTA6AneVADE170P1LDBK0X9A94U16NM+nUoO0A6PdqsSKY8BaO1xH9IaH6n3CoFxLrBBZzbb5onLRnOO6L+5CYhPG2p0cZNDEkk0c+THjBgJdOeRM43uIUFZ0uJ1Kp1IdHQCKRTKa8QwPDOFMx80mOLnWE36MCD0LwD0fhABE/PpnK8dbCDHNqvu02pdiuMAVGxoaFBwQZewHQ/zHCN3FEub4Pl+tY5ZJTStlSyrOUUiVGlkwhc00opRt+AWwcXjCI5OwZ9L+YCJLixmGNdiQXLq8FzFgH4VZdrc6lk6t0OvAWStTqdPIOsB8cGPPwMZIiR9CPkmWHvEM39mFSLiMq139mykXlfFtynLrMWAfhXPxw5b770RPITcFbqFxjHYYzlLKSvf1gv1riKt3Yh3G5ZlBXMxFm7rD2Gs4PIY51kImcqdbDDn82qqj4+eD8MQ9TSrmOoXJtzW+vERwT4lgHUblOW90xDsNjo18uyoELNsZhPBah/gW3kveIS6UFI+mWUUdScw/rN/RnYzcWGd9Q34Bzs/f83p3gdG+b3HMGMDIReq5yz//BCwTnnu6d4HtWontuzZXzezY+XXma5lTt0IrcWK3gpeaj9Ci2fKsnq5HXtYJo3hiClxq/JSIClyC2/fSA16uQpHu9aQKRxOFgLi9NZIohnJWegV3QgrNbjHgMEZq7Qzl3tDwfEBOJWMdj23BLQwDkYc/hsmIRUJUZI2xtHRoBrRHQn3VymzjYLxkZ8vjBFF4I7Vdgm/rpTWZzv9kMKAU9VEG/pXtyC9zS0FyyWN2DZqmsPzijyDoONLNn5ZzgmK2Wv2Sg4Dz8UG0BI600Vg4Lby1ZQBhQVpSHcAno14Y56jFKAci6iUPxRj/d0yFpgiYwksIAvEkAkahTSKqjSB3Rbwo3QT8Y31UnU8rqQ13XCgU3iTSBst5Pz/B6vUMkA4N/8+cfPSoPRalMta1AMU5mWZ5vyJLSHjo0ipaW6c8jrX1uLKwHdU73EfafXH1aYRPIEB1nacjy6X7GzkBTm7rlZPcmbOIns1mi73B96UD3Jjp5mhMwgQ9v6oYp7BpApr7DfUj4VbKPcZwas9wCzFNzkKxH5ul8mqLvzkBTowq2qRskcblPc4JJpRMjSwxIiU9zHBdZg2T5BFkv1FIWgoqGv78mNdZAwdGpzUYMZqILrMryay7eYOwcitceFKZH67qm98EWxbh+JdkwaUIV0Dd9qHn5vuXL9zFfqqZ3BdBs776lmPVx6b5f9k3HGeX/UqR1xZCevgbfcPp0+h/40uXpe5STSkiCvEW5MiPHZvsslY90wY1EJVF9G/M64zD+WmClMaSCCmKK/cHZ8uH+VzZLxCuh0fFi2mTgDWaThWUDrSs333LbSkxaK1MS1iHRBw9/fXcU9P9Q/jPvd2ktVpM2wHXE1/Rvnx8rNuCYXZIN/2AUV/ncH2SxZCny3dVQi/BMIAB/FagjLHt5aYeCKuUPK/6RHhrTldGSlReYgL+KCWcsY8q6OV5WJ4u/MFnQMq+lAP/AW7LJZw6cP+7WKQ9Nubn8/AOJlYd+MOeBOT84tDIx0BK6/PqfH146M3n/gSv6fK1XuCPn3Lvh+rtv2Lf+3g0R9xWgt3teR8e84T8XXfCATa+3PXDBokunVwpC5fRLgeaNi2Zsag5oOWlc6+oJu9787MicRdvWzpoX8M6ZuXbbwtn9w78rB34L6riHv5rvHH0VtiSkiqcTOfMzJo0dRaA0AMm5RBZSEP51JKOSwmO5ncU8lmEcIQXqFBA71MIEtBfEgr7oyIIhxZXNMS/ll4tYzB127qvoYKp0iUv+nRhlEqVLC0BIHLySpjLYhbjQgKo4yDZUye+VH2ofTGXLjTS7VOwsuwkuC5QXyzc6zYGKYrDB/nh/ripHQVN00j2tjfKN0Um5yiztr6ki8xqbx0deSJVQdYRliJhQQwRuhOBBtwIPGAnqR5mroFeAZg9EI7+YT1J+XvBl+eWgxukqqNYUXP7A5QWa8bVOWaf40kxXfGmmrz36mTz02dG1aAuYz45+PJJo/bULb7jhQnQDdJvuVau6XU5zNXijT7mafPoyvmxt7jZouB7x3Y5dNzuB8VPs/djjAn8u/4O6aZy149VaVRe4nBpcVzn+P6tbpKDanKmWBt0GVRVq/7d10xPf/XJs5c/4IeIu9v2rlAy50kTfhEmXHPqf1UQxCoIn/keFV+U8tFFmmfbvt0LCjPDvKjFTAX84wCkQEL5aOiEKKVFICqIS8ZBJwoRaGXUjv/126tD7h1Jvy2+Dirfp5NsgNeoanFxHqqN6eBGc8mQSVIAHAGYxN2XXRfBYjP2o8Vw5l1pBbaB2UJeSldd7qMeIFR/VCQ0HqB7xvHQ4L43yoPeG0qgWwdPnOePx06XZ/LQlm47ifYmwk420CZh7zOhf0jxgRv/UPYYyDyGBke4xp7PnyQaMvZvZypS6n9ui227CF3yLptXp0W8JdiZG0ASbSI4v837TX446JI+xo26AslH/yf0knxnHnw4l8R9+EI1/FZE6oa7V2akyagGW1jK+QbyF8IQQbAAwwmyoWgcz0XHY0ZTJokfEidtrJmIMDe7JB/fPaVv9wPJjH391PH72qni8sKLhgsFzA0XE3lUUQH2LTQV0/O9uWjS5MDF5U+Na+asVJtFs9hYHFl59b+emX2wKRXYet2uLi4vB32DvEm9N/OL0g5tNwQK3YKc3BxotgwKxv/3T0oiN2tvTbFhkmW0BwecpXNSo1UhB+HHAaitvCbXGpU0G1ixacexPpu4s6sFlVC01mdqCv0OOt8Uk8ovS4SgaKrWoOWykUg4bqhc6iepqs///ahY68cQrrz320Nvv0p/87UarxNYba6UqV0Wgwu5wSWuf2CBZy2ouOPbg/krfDYMP/a/aCjpT5jXP9IBHXtCc/9xGuf7pbZUDnJYu5Jy8xOkZhv5DY1TLHbdA/rklmufLwOf/u4bEa0tILiHrByUKG+eI9QO7dWT8Kewca0FBx1SKwhAxhNJ41Bo39iqKXJkXeYf7cOWp6/m5zGfk+Q0qx+jw5TW7VYtmdEyShgPpMYT1mMWE68dabdPBSfKVjMPQajQyYLuSgFePWYH9Y69EMb6TX6GLLYzDyOqVRLp37MrlfOOfpWwYUwfYMvA0uEIYt5IA1mEiCsVPUsTueiMy2dATkChLEGwUcbtoXFjeKkmc0V8eLeQ0Vo4ugOU3Jt65a3gecNvxB8GLkzG6iip7Y0fwSfIWHAkwo/Gm3bvrDRagcYGD902ZZRwckU8+WfjzY4qsCk8d4/awA5SOKkV1qERtT1scLB3WAongtwYJ5xFmPIphwiMkgUusBzB3AyDfPtFzpAm0NhvAV/KNC1i7w+KQ2+Q2tLGzC+QbvGIl+PeH1qJC24fg35UibD9Zp2sGE4daih8AqyaCqHynbPAFDX//uyHow1xJ3jiPqZLGyQ2dfJzKYO8miY8xlQPV9/kx4BtQsC/YC9NJSymrs7vTKXtAJ1pZymh2iyaeuWeQCkA2YIcJd0WpDiZ5SRiXwdrEsjlEo0k9QfDXAp9iAcya+XyqL4Wi6OZIqOOo9+F1POL0UgnnppPo7xiTzJgqhvqHWS7ouf9G/UWr/ZoYdlDW36G/njzrBt2TZ+H4WqtFuf89dEykVP4iJsejMj23jiKO8BnHvkcKR0wRIAtgRN2LZ8Y5Gx77kFjMRtUDAPtNZf7Bp8nm5roKONB+RXJuRR3SRusq1E1sdXxCV1nYQnad5BLmabKZSn576hYXyB9eHCovbZ3kKlhchxV3dIiuy6Vlk6vYUhAsa56lHlSw7pMkltOItPcgknSXUr3UNmqvyhCsrjzarQ7FJ5b4uITy5EU2G6MQxuBaaFDAzv9xOxoZAJ8Fy3EAPkScEdvUQAQm7xYg79bssIeCp05ReqdeqwUUfnn9CtPSQF4sLAsVCBz5UZvtC2Bxz3FfX1gofy4GbKB7XvqmL+QvVDgdIKJj8iMqYg6YaYPX5N0m/U/l1uCmYQ8E2lMU6QmAbCJ54bgDJH//BRgmB8yyBUT5czdQwHWA9IUNPWoBXC4CUQXckT//0oaKtOB8coH8E9t6hTSKyrvlfcMehseDHvSRDJF1zWbFr3OY5RuPZkL+UeLorsJCk7kUxEUfdl5NOZE04yQ/oLk4PKUiPC6O9ky2vTObape1TCgPTDWKBuO9RlbTD8Z33713DnBmLnDCqbHlTc1uu2NegaU4KFXOvT7gbqwuSxQVnGXW7NZ5jEDX2ntTRteG+Hv2YB6tfOQLhaY3M5HZ8DdLj5zdksoacMiVSGSosFEiqXDRKEBkWdgLkFQNY+lUiFlLDEtK4CukVqIfT5Z3ZMRDJFrRp8N0SI3hzr+9pxCE8W4YFIIgtswGgXcAn8Q/DJcmGWkCiIZHLIqV2Q3om5mG6xrA0f2E4tAEfNGIRAeiPgJ5EIm1QZ8tQEvA5iPuxEzmHYUVDhsSqROJ0pd8c8SpoWlAM0Bnuk2Wky88sx9Yr4Q2dJDWFFwFwO6nX4WfpmWaqZt51sy6pnGRKsG+3hWcu/68K2qmL+qK03+9//6hMq2B5rXQ6jx5PwgA8wMfMSGtQWso++gB+Sv5t/D+192FYqKvva2q1ReqCevdS4NFE3asql/e1Fje7OtW5iEW+5DRe1HdOr9f3djT143+/nX7e1pm6OF16z7nvCsmrVo9jTlz1d573V0JRtds4vr2xo5wN6kXQLrXxayCN0cFsQ+7HS/DkB4RIvMYXjlNgu40JT/CfWXSFwwlQ41pKtRmRmkapWmUJjh7TNQ/vXCIqhjnR1sGbZX1vvfJWNqrYGQR9GyMJ2vz85gUJhSty8UeY2IfNW6gGvjD/qgFY2RgQRcHMGcClgktEqaKseHmx1gbCgEQUhAWzxrXWdkRPM8L7Hr/xb1VLfMC4wLnzJ53vifoqQp2rzisDWqNAEJYHKQPr+gOVqHj58/vPgflmteS+Gs1YFngDFRU2htqusvnLAFPzsanLgrfHGaR2KGLNgQ7KjvHzVq8ZE55d02DvbIi4IQMhAAw1IhL1ZI0RD0jnqbKZUyScNlFyPdI8TZfhi2dOKCHKPx1kpV3yqum8ZTgJVOC184k5ffeIzCE6noDoN6T38PLBwRkESVOUcflb45j/1s6kfxAfsa5T3Gu3OcEUz5QhgwFv5Gg5KyVqX3Hj++D+Bd71yK5Zivxd23HMzu6YbY4WqB40fOo0fMKOaoCYT4f88BuDQIFBB2Y1uAQDWa9fNPxffFYz9nnPEPKO6o+u8+T0bg/R6dj3iJbeWf6+uP71t4HZ61Zt1GpQBR65JuS+45LPRG1Iq5hVTV2yDp0pQvfAm/RHXANz8/6SSs8SX7FzwF9nZLFKrCE8DKLRc4k5MSO5X9Lta/av21P1GwoNJije7btX9WuOLzABEwOXts27Wn6kTS14MFLL5rT6cKMba7OORdd+uACZWBU5SUqiw8RwLYAh8/iC47wfhi9PyJiSBX0sinUomhyOYk+v5zjJ53nBIoJL04StsXk8omYQU/ZoCNIeksBLwHRIPJdXnrmIDFRsTiSiDDnKb9dpN1oIvMOILmvK+dfHlRhHYNVONRpuGNtPIqRB9TPGselZR2kfehkkMDFQMWznP6hQWNgaDmhF05RG69TJr/dq7xNm6a0WBlLqdnosBhYqX7C+vqC5fuWC6BK0IMUzaCrWOWd98gps5YHPVDUr3U8snWITFW0t+9Bz8bqpmk+TYA31Dp13ukTJollFbhWvmK9CHsAr8V1Kznl5RS7ZGWubsCKpVcas/ARBB+kamRTuPzxWAk2PvUTQRU4b3p09hYrFOQkrzXoE0Z2vvxf8t9pTtAmLIYBnRns6uk+DuYBVrAyisQKkt/KNz7W3SNfZtYNMFr80qygYD7QJiQrSArQumX2s9dIGf8h7oSibwDah7mSyvHWh/5oH8G35k7cKz/6qLHQXf/gq/Kjr8p/wr+3MENrftLUXAYH0yydqPf6hqbQz+A/MGV2Z+fPhvvB4AGHCsZjdUjDymDVcyQaJd/UQ1+9VpLk10BEktZija5RksCLUh38wYhVzavxWRBB+eokfEWjkhm+e1p8deX56NFhFZDeoVXB3/OfD19Dj1Nuh24LIvJrpCD05JHPx6XCRVOK+RrKh6840/NBPJaJdlEg8LUjns9cnVcbKVdJMLIBgNICIwsLRhZgjHeQaX5tpiFGvoPKUfVSXsLIpeXPSCOMfGFwxxhtkCCxIxbSw+KoZ2FImoDERqJByRcGPpoNMn3moauq4Wr7C88bH7aDPgasq01fZJLr2WQy/dP0L+ijD6c//SgavUr+dDVYBb1PgHdOrrz7btJ/DacS3H+rGHI+LZR8PIvuK/niPiCxH8r/Hno/PXkKGFcEfgg+7hic2sg8Exqcioa3V+SvgB6svv6uu8BcMO5naluZeYWzY37et6qMQ9WAQ60UHoVD6wGOPLU5TwG1RTJWbksriGfAaumUMiqttWoYg37ZDnmzXCdv3rFMKzAaKxoxe+wajWl1+1c3KsJ24+TDbx+e3Kjs3PhV+2qTRmMHPYLIfEzGpqF+ud+ugdpl195//7XLtFA5aZXMq5fstsLLifR+j3/7ZOwNOXm7/x5yIH2hdfeS1WbJKirfP5EbAqM4trA/J2EiVZEECFsv482RenlVyUCl+8qZxAgWcILweT2DS46fLqeG27MUHZ9IKzmk25CXM9u9lJlS/05nE1EgbIFdjX0CZytEpWT5/6EzGEXgpwpk7dmg9UN8PZyXvbQiveeMlh2ynoJE9ySdwdMapTGO9J0e5UudrC8l7ZTCHqBjp2lvJjXmT9bnBeRwvUaVw3KG/fxyjPUDcmUAvx0rmc85zVNuKoqtrlnfF0y0SexEhCMBENkjBKtACWZxIMftjKicGM3QCBWXYfAjo/zMJ4LVYrz1fT0QjUmjFVzMrv3JJ/KHtwpanWh8FSw9wZMTOj0ozveMVCL6/Z+AKUZgRedFoH//VqPFarwVFH/yk7Us0OnIUf6EfO+rRlGnpV8b6S+Zs+FhnJN8BgwylBNyHqJLjGJJeBS7WBX7vF6z2WIahZyfvkmcJoKEJErBdDIoabToXcZORblX2JeJLIfepZbNzRZ4kFaWhGOobflwRgImK2EOuxUpCs3p5+XnwXrYhwZkzD2SPozG7T4xRl85tD24IbinflN//e5gkL4S7ezGO3uCTLP8fBpjreKr6nBufFUdvh5eO7QtiC7q34TybQjSB4LoIrSzO7hhWLsouv/IkOUxfFkVh1l6lF8t8V5VlhiGe6vm+Pfy+vawFYYz+HXhBcohsuZDK0huOYeuZD7vKRzIrtfLtYQWVclJ782nQEXjJCoRfZK9mCrEftblIAdWjr3BAzn6X/qkWJrCQVc2jcbQrzWDRKpUtLhAQmxFr9xN3xfEK6ai1ZTSw2QwWAySdruc9JK5DMnB6BkU7m1SZv1GdSXEVIIWH5EQY17s/pUqLXHLKXRTOeWyoEfKKUHfb9RqWUoShu6a5pXRfUGyOBSESX1KsErDZYGSPFkAhHOywKjP8Bhcq87ulf+pigNYJlqb/xY/g2tVWQDlUTLfKtE/yH+fuXGfQyO7TX2nDh47pRN4BdJ+WtoCVDIj02gfuRturqvvAW8JFvkDi1GwgIBFHoReeSA9QCeXFhbeXNhduBT2D2Nlfejmup568B9GfIlgxJekE9AL0LcpD8CepeiKmwsLl/ac7rsvwP61qt8lzxVnGIPiQFlAGNNr20vg4dOfKg0B7QdFt8EYHtHtewBSIsLjinA+0nIon8RaYFl+SXLlCOJYaW1m0CkCfoFVlijisTDEJMbK3iiEss9AD3op/Z5w6Y5fXHp2vU93v17gOTtd0Vf1wFWlBoMLhoY112MoPxoJerC5pD/ctqJn55rmJ/5ooLVOsHJHXXV/mYWFqWGNlRv/IXqzIuUh9hRgARY0eQPV83AYDRUO5MBBNzJFe/NcDEc5IIJUMglmpf90ikIa+QfESVHJDVeMmJJzeG4Y8apSxetQPhrUDCNHipGtxFwoOuSUNFGSUw7RUgqTpTerfp5G7PM5/M3RywLFcsLtBqniQCDtHeYUOmL8GlEmZbhQB4kzl8lSmk6WWkQHmiUmSiDh2H76MoF7AoFAMUi53XKiWP7d9y8T8VNW7L8xBzhjmRL4/gHlWb/Pt4WO6Nx35TWlBbdt+u80GYnJFfTrw3mOsSDzL1SmHjQiOeycCQh8wE+FsyJ1KJ5NxijC1o2EbmIuZTEIiCKEo4JyDiWJF54JxhTTho2N9JsB2qBnGaPkdKMXIH0q3922AjfQREi340KtbAdnD6xdqtdydDltNzKMyVrgLhb2vFQL3jZrdbSTdctOmgavmJCE4ISiXt49/pWLxZLiQpuZYY1Gw1+OGGyYpoVjWZaBgP1AMm42Sg3jRWGLIL4FKAd6vvEINs8CmqFpmNxkMAhbXMEOg8G0SW/avp9m0IUAsjyv6uP0EGqPtpxX7fCVfQXlBRsCcfgWR6iwOdVhTYFcV1dy6CHU5B2CKBnPXoFruuLrnz1zGKkI67RGo44t66mc3wtqSCDZG+BOUbgbvchr5etwzsOoi10sGS8VxD8e/cNuTYHuYj2AWrawZHnXu6JwqVGSL3tCATUGVN0pin4L6Q8rFZ71rIiJvRjbMPCTY7wC0YvXW+lwlQYb6rJrTZilW62GSiWJoYXot351RBQuN0oTd3V3FLAW0zrebNLCzXuDwdm7PMHuuli4cmb1xHFVBZbn75CMlwtiw4b2ZpGzGGZrTIKRdsRbF5atuMBSFpxeVR2t74lPCrrAils+cD2MW+NhbUVlxImedbkOQj1c5dIsmFVY6x/nsJnFgLtiXEPTtHEH3vQ8jmGiH+H8vjIzJ1oPmQCto8VAkWNBh6si7A5IotVRHWqdsEh9Z3vRO2vNyOAC4O0qU3CYCmedh+NZASaUkcMzoeDlwO7A1pq9ovCA4+0f3Q9KBJ3G9kuzVn4dY31s2neXXZ5P1tTuaPjP63DRaPL9fVJtOYq0wbK1gnjwceuj8q1mUTSAja9qjRcbpQVzRAGd2CwZL8N5UbJlrkhADZGogcqLpHVfQAXyV2FKst1NETlqMcIyUl8lkkbjaiTTzWy5Dmfl4JKHUKcgMYrAq2x/I/9Mo9GJv5B070pB3Tj+Zxrbzyw6rUb+1bukz/0B+JUtqgqYJgrrjNJ8Ueg1SnCi2WwW5YWhhc5FFnCvZBYs6eckY68gzpeM6wRRftIoqbz3it5RT3R13PExV0p+ybKdMffpZFPKqMZIe/twVFcf2Jh+SX4IfEsWLHnJeH/GRJ2xW0P3S/S6ly6SE+Auec9/nz/SkQ0duBGVfbsg5vEPaSgDknYK0Gh7HuoZUkCyWx11MSnuc/gi4QA+gJQg5YCiI9Kkx9ABWmGSprOlzY2HdOa9+KRhWztPZxcceGyrh7OPTAcAbAvI73vBXVcGJoMjM++ejY5s9MnvEvzud+7lnUec/A9P3I+2egvsfxPX52HfNXhz7mJWpzPvd7FngXVn8849Tn4lOHcZ69pv1unYJRtxluv8j6ExYz4oR+ozgxm+Hkomk2mkSsvvoB106Fgy6UW9NH2z0wl70a+gg71E1lZWlsEik9HglG8GvU7l12A0yQ+oGbB+W3+KYv6K2jFCTSWYQ3ZMfCIwvC0Q9YdtAYsffUZxJAVZIqGABTsoOmrj0YgthoFQPTRdV8X4CQhpbSuHd9DUgHZaOeZa8cbt24x8ZOa2i+fc2l12qzhVeql4Y63GzOmMXRvfTvhunVN666ydvS0nPBVTmhfVztJoGkMdNROqajzSlIKS5trO8gk82+SfWNEUKhHp5JNdhYevnHLO5Go7c2oQDFGnwFMRcAiA4o57ARj6Gn41xBc3nZ2+o6S+pMDAQfnHgGYNZpe/Cnzji/gcOg4A+TU0PWgER3GVgotBsCXUeEls5HewSsxg3pTMUHYB3CwI6QfqS6E3CxHhRergbwVB7hXs3tL6wYEM4oPC55G9byn6bqbiNnX4LBhUfniMttUunQGme+Q+exw9s9QudOQXpf6lsaAoRqaZEsGOi5x+PldajFmV9mZ1MyCMlcTypx/VaTeHUc5LqInUHFSjCKYGCvBoMgIKDlNGfVImHaJVsZjoKtYGMIUB9oLBLAYACR82nDEqYYaCcICP4K0UkZj7fzLVgKnwmPSXOvnnOqNBL6fwSlyK+LJgt5eO9NNgs0GLSdMM4l8vgHH5Ws6kF7S2b96SB6ZX/6t6uvzh5I/v/pjp/V21mbECv2HQkwGBMktWlkBvnOwXL/vkLGgRtVoa0Fv/sjj9uUbUQwh30Jf09R082NcHD6f7FNtPfr3rcL2DuXqzp603GFEz+jvb4XvU+45htZNO2wrZav9prFrLQ7nqMRePagIdkr92oP7rV3HTsF7WQHViDLngd7zi4SsGIx0hzrQPB8auMuPNX1nAqn6SdOQk2ZFJ5wQpsnOKIjvot2esWudBv//zDEllusvU35Sr/8hanr49Rq2gnGGfGVYB2Tt2a8D+EXUe1hq5dvJmq7JlrKYAW87cAKTPs6+rfb4dewQHiZGfWO5P3+eDVgztHQ6F44ocGg9gXkI16gl/ABjAAMkI2O0C85GwExc11bV2dtROTt95mkp/7qrv3j6ptcophk3mYGjeGjO0za7o+8HBc3fd65HL7weQ14itc1K7/tjWN21LV2zBWHWOt+44d06NWcNv5hnj9oWOwmvXrD/0HKzesgU8wjtZs8EoNi54Jr2FGlX3OPGGztX9u8e5EdWTvqs5vkfd38yv3y+/oyEYtfKDPxqr9kMjq8lGxmyPDG5kQl2HXZp564rDxsh1PxajDNp5O+ES43iMzQwIbS8xGxNIQgzHChVEX5sVk4JBHi8vUSGXOxh0u0L9IZdMbLzA6wox/XETXWWxmMLaxsRlJV2WibcvnLEr4AqVFDh7azp8okur5fWFVslV1VntM2mBJIm0oGGAbeYWYrVB94TubAAH+l3QVuHtaqlvaQhumtQFi92ucgCCLnhJQRDCLYmFPrE5WBauaLZKtuLa0maPM9RV4eecVmGLuuaPxv0EiTFzqziM2Zc3UoMP2m1EG4YO7ARD4Iwx+S9UaIzVJsHt0URjDjXyx1tP1xDr42DzTPlvjEagRdEKtCZfdWeVS7IW6nmt1iX6Omp6nQUlIVdg14yFt0+0dJVclmjUhk0WSxVNZ1oi/RelDUh7PNyyaOYWwerkgqUzQk5Pc2ltsU2yNleEy4LNom9hYguEwQJ4iSsIQLnLXQy7Jm0KNqCG6/JiFPrMWoaW2JHKqRbUGqupi6mrqDupR6lfEF4T7BmPV8kiGFotiARG9H+URX+qES+iLt9bWNVHCGXB4iNeZbBZMywxaEAkTrBFIGCzotx1sTrMaYSDNGpBHaGl83kJOqkKfukl/QyJ93w4QMAwbRFMdEo8tpC4pCzcYSAOi1qOgFqOUQt4NxVZzGZL0dMTJ6Zf6J42E/ykPRz0abmJAAhWO2jjDeMCvvZ2b8k4Az8IaYM7Wldksxatddsu8zs5IF+SSECbpJtYfoX8d/mzKyom6KxW3YTy/TC0vxyl08azpkeiM3mvJqCfBny2opqI22ZzR2qKbE+0txM463ZOj+4Ovs5f4PnkjlrzgPmoPxL562R5Mbh/8h75utLKQksQ+OV/OqGpGDg3HqqzlY0rAZ/dVVpme1JbJNjF0pC76ZImdyhU1NA1IeICBpuerr89Erm9Lk3/ZG5FE2sysU0VC489Mq+8Gaeby+fRTaD0l790LHWsi//6gr2NRejaRrJxN4Mt8l+KzdAJzPLvg6K7EmiGr+GirwONl38h8bKZ/rGEWkXtpvZTt1EPEz0doxSid80ioaeuNhjBeLqWiG+M15J5eVHUO6Lk5QWjAdJhWkBk1IuNY4YbP9qtJQy4POclXQRDhqNe4SU9BERodHcMnhyRMn1P6We47wXH6KH0K2GH3e4IgzlnnTXUuEF+af1q4F282OMWabBYY6gaHwPHtJZYbfnixZXjYxYtmLMEDWtVj7nD7R3hwqLwpKlIUYHp/gUL4BsuYVHj02nX042LjS6UbnoKfkzSQ661F64WqoOFfVPAk4WhjvZQYWGovSNUCGYtidZWGTVLAC26PaDkP9vtoNLeUVXVcXj58vSvwOfyD8pstBecI19Y4wy2LH+h01Ufey+9fnw87p5rjOhKJi1cNysYiQRnHUObqNutpX/x1qRJb01OL/x0W1M3Z7Nx3U2bPsdp3mrlUZoR5M3yP4Bp2oF18+RvJz88G10d6n64G99kjmyMtwadEXBAvs4H7eVgt+JLiXlz/01JOPofcIoGHZdqwxmFGa8K2zKLMiAG8EE4X/e1O/SFzapLA3CXQa91fFHqol/W69Nfgm69Tmf/oswpHxMhKAj/w06vEeVpVX7MW4BeoclUCVabbUNngfQtVoupEp7npa+pzIzRytgkZflF8HoPtiDYaM6BvbDigBwBdkD2YmGAxHDHKOPLHlvx06KG1+x+XqvVmJ8plug4b3nWI8lrkLpt9T4t8hqtPARu0fx+2CI1DT7w6w2W3wL5h4JgLKFnGwLpMJR9AaRgg/cB/E/zFaMxaygdTzH/RqlOsoYv1TLFAIPeK2z2RQBTc5qAgPQEX6ikGiozCerZLSBE+OZbuUgM/gp8JBc+8wBo6OwEXsHn9HoETgqjUgIg8SWCIHi8Th8aIQblK96Q3xhfU1ISnOAcnUPwgkFw88k0WKdlGZrmdGaHiStYGk9cN670iuuuiy9GE7LDpONoWsIs1Qyr8xaMOm/G50VKwcHiUuwBYlvFDMjFaFhgbMAW5qMg6kD/4jatASnsn8s/ku1shWxH+rjjerAAALAwPRsskEX5x2wVmCM75AfBQvCJ/GNZpFvkN+Q/gzb5o3Pk3xM+9uA5PaAQs6XJHzG/lf8svwkE+Z/yP+SfgyJ6j/xz+Z9gPBLe9Whc+or4mOjRyKSUB+M/ByzoLxhneUxJiv9owGux5xurHby7n72zf2iOjzb50ova4Tvt6f9eC9eufQ98kJQD6Udpbw8YSCdhsuKO+26HrkPysevgk7vSp3bRu9IX98BLTt515MgYvhezqHU5L5cMGG0G57bEH0JyEZaOaLuVU/qAh47V2rH0BOKtdIig2GI5gqbMeeOcOTfMZdw0vB/LT3/8MZgK5sS6YrEueYpw5dQL5xfVdln1Jha3HGvSW7tqi+ZfOPXK05+C57G6j95cJMcWvfmRjiVp8DJOQztx6AD3Kk/5mDwklvyetx1+Sj5v9P1Jeth3bSI4HyP9ZSLZyNdMtAqhOlK+NHDrRY9cdNEj8BGyyfAYKV/g0AP4mPov/zkQzV6YB1zysREtiMR9w1y1qF/L58HYcjkqR5f3Qh0YHImUcEh+fQA+lp7RD2rGik/uZi9h70H6BI6ubMd9Adi5MI4ziqF3V4XJctFLRG9TQu+5hEW9ATtOI2lRIvEQSIak0fzVBpC44wGcxBHchSA6zOAzmDMjXsJi3w+6WrM9Gi4qDJV0xjcKL65sm04z1y9dsvMj69SKGvkD+bPyqoToWRpv/uj9tujSBRqTsaJkwRsvrKuaMidhLfBy4h9hfMDGmZ9wzWcryn1D8q3fHDLZjCwPtQGbS0sX+etLPLuPg11g3G3NZgDva+vyWubMsYiGJsuGLRWFF05aktRoboY73QGtprqG1/ldhQEtX1So0QSGRNea9k7r+GraorH6o4Ge583aG27g/PX00/fLTk9doWVPyL3JUDTOXaetfWnXQ1NdlR6PSV8lBhdWdVlbCQ6s8q40ZLRvRDo5YbcOESriWJyEs5NQfQm3Dx4zsfKBRlWpLhYKo4/GBAiHIW7YGOZTYDleaWsPjY4zWFcRRwmG3XNKykF5eN40zaJ9fTSMV06+9klre7jitgcrQu02Y5Xf8+JbvpLaej1rukvuvdvAukzVd3z7mN9julxrKd/0W/kf+5aHyiOMxl7CAQ0nGtc/BugnnMXFzHhQOsyad2t5ld26XnTEWiaeZ1jaXrPIWjwHNNpcHGu1cnyBVXLySLFg+YI0zYcLmL4+znBr/Wx31SppQh/8VdQe97W5DX6Tdbyn46qXS9g6q1/fbS1cYrSGbEAPakfMQ4DqwDFgqFn92B6Ih5UqGkliUdSfCMKgz+azWD2oBelHuh2PLO49tmmm74GpWzrGW1nAM/8NZsiPGr3t42e+8VmgFcD6pRdc0Ai977oWLtu4sJLl5UVD6ZOeuqgHwHw7v8IgG0ZTWxWMWnxR7NCBBj4eCYT4Wa1glC10U2tFU0ldgQ6AU9RxDWALoms69pYvvG3VpMvB3fntN/0pO3CUjnOAa34BJusqFvQuKLhPXt6wrW8CBOOZ6uG2UPpUAqZR3TFqj31slR5+ZTbKd+uMgk6+w6jRWlW8QKS0meWkTgeSZkliiM1iMONTQsE0m8L3VP1WsrDJcTVIDKaz97GZjWA5vjtYZWQkaZA4cDMDITNAN5eTZuUdJQDNU3Sa3DODgp/BwHco4Bk8hUswolBwYPgzVgqkBoofMqC5lHpPxS49HD0fs+qkcBFGlApeipriTkGTXwXUQFl//M2oPUMk6lFV57CwHvDTMKpK21hmJxqfwhEKMtyqCtGdw2pnN4fnXZKsWbJgQsvs2ZGbb7x+8+ajU9f3+itXrp2yY3ld3azAhAPyh0Wetlgs2E5Pn/YIoNEMM2H37ue9Xp8f7bD//OjQQY/H759QkmiPLN980YvMzpbp09tiop678ZwN42gzzRiy/vwEi1yRDihgCVoIm5O6hT9KL8B/XHJoO3btgmJ6+3JYCf8rfS6MpncMfb4b3kifN/QxvAO7dSu4s+weMt8XIkl0BtKBKKo2RuYnRt2yyiymdG4FypIEVLZgdZcsLoSJjRAHWmLveuzJWozdGHCgOE++DPXDqLWDD7wOh9cOjnvtdq9jaLCsuWlBczMzK1E5vXlB84Hm8rJmMK0qAX+8ITm0KnnOFN5g5KeueHvFVN5o4MFhfL65rLyZKXLg+yj/3mguk+eUNzeXgx+XNUvptVWJP+O9Pyu/iSp4K7gx/sL27S/ELzXynGFfWdk+A8cb0zdmripvakLzKJa7viWcGybKDzRIFQiCCOgE/yB4KgFM6VTr4EI8qhQI4XGH5/D43Uo3gxAS4LHAo8g7eJkEncSSD5npQjF1OQUP8mjUj8fqougw57AGqlA3xsT0HOZAwpohTwKgHLV2jgSvkimWxmM/jacEoHCcoFkipMwIaPrEwSMCXrHB3oZWAZIh0Y6z4PdASkm8K8nVHmiLoRkGDVjoahLIjzMQA24Mz0GRVqRw4ALZ7I5ankO6L64So0xV4To05/tx0mFFF9dhYS4gYLEfTfv4DrUx4IG4OIBAs9AEvAgNk2GlKfADcCNg6RBESRFx4WjeihqSlBCvu5HVuBA+SdbhUL3jyvwYIWA2vJrXTiRPclvURrhZ1RurLe1h4U16LcNK7FLGpHNqaPk2pAXQNK/TMhYGQAggPT/O8DQNeaAFumkBp2+hTx8uNgG91iYajUDwF9gZxqoPm5o4DWcvCBbq9CKSKiwFdvMGEWjHFdDAX+gugkBr4XUco+ctAFidFisAdq0mDIysTrDr3PbqOCxze1mtnqW1BmuntsJVEEPTgrmgzBLy+9x2I4Qcp+eNdOGsmN1WZqeBp8goOmZpIOA0Ni8DOYaFsKSKLWWsD2jNdLFHUyZUhRkjB2irruqCyyocegNEz+RstANCC7SbSkD7zPRdtJ7TQlpH03oa3AO1Fo7VshykhTJRq39cZ6A5hqEFRgNjrJE2abUsDYEOMoxG0ACzAONWO+SdjqArpAmtKLSsDYkOnd9TsUDqslZMKYkUFt2bkBIl5U5W5wcADeE6YYHF47RFvRG/1ihCA8sAP037rZcEnKsnOMrLadGqu3B8R6WeQYOf6OE1QXvIep5gYGBdd3hCtK+kYRKL5IRV8cUmJG7odW53zC+6Ra0A7SHRbJV09WeVNrV0Rsfrw16fjxaAYHKZ3cwaIAHOgHZNtN7IyXOAxsKyGj1qXx2twS8cyreKTlOB21yk8/Pl7PjzrNa2u7eVQqZyZ1W4uVg0gNY5nhK7bYJfQ3sAqK0D9MQCycQzCdZTatPSmj0mpEDyDRMBaCg2VRRDWq8FRZLdA8pKGJNgcADBxWocJj2AFmDQWrQCh0pCc8WMxCAJlGFMDgAMZsmkZbSQZRmO5oHQ7DLoW4u1NF/QNr6jiHugQVyrcdqK2woLJQCYCWsMXsZxudZUVUqbmmqqnB0aswayWr7ObJoa0nBVBe1I3Za2eW3rF7vEoFdPl1lcEGpZYLL+QsPTDK3jeADNcQaIA3qLBjAMYNw0Cz+FnAaagNHIMUaWo1G7AebkS4YCh91usRpFRprmNvOitsiOejJ6S4XeAgCajahnGyx6x0K9eXywRGtgdKLf3+mzsrTRVMY5DXa9qUOwaLkCDecVaK6ibkLY8tO6aX6t02wvwnTea2Md1mvrNr141q5yGyhylx3pWLFj8/qmNxfWTCmF0B9Era6RDEVsUJgXn7x7whTWVxMoQNUq0OunTTEURzxuvUmNj8eymEB5kRxdRdVSrdQC7FUUDNEBbPTHHGN0KMz48CztUOiA0ViCBgovG+LxIAf8fIzF8zvaYaRQGF9FRpNWUOthHLFhEQRlKyE0x27Yc0XA9PSn+1psXvnX8mGwqLv2+gO7QkFGXHfBRQdSXlBFv//WrxaO23jD0D/QpA5nPfNN16xLt07aOaXZ9BF9CGit7dN3TyrAqxAlMyZ3NEfLPbqdI/SwEnwlZ5ux8JoZ+sPw+prWZbxw0YeLF9+2vEMwAvY379w34Z83fdFc/MXH0/9CnwvAdfdKP3rbNSnWbJP9f30UGAoSDZ2F0TLWiboXjbQDFr40Fh6j2n6t1HKsf1TR1QBzJ0dqPbTie4WZiCGOhy0GhFsex83SGTtKK1SItzjCNKugz2GpKIYJGUWMPcfcGG5cNKOm11NYJpoOlneUllS4qhs2PdTTkdzYHpq2oPnQWXZv94TI7Jqy2qLayH8/2PmDjRPBhg+P7O2d0XmtPPjcRnO3ugNYvAPeq50bq3DqnTxvNrssM5w+vzNRGV9cVdy2sbNlSXNQKLEL1tJwxFtZ6W2uXHppcPL2g0c+7DZvfA6w13bO6N2r7MiDeIfo5xVId3iFxLK0UR0k4ipjD4kTfPJaQlMcyrNyxuKcDruUEAdfgAntsvCpdMwF6L8G2UJbut5RzIGAw+P7wu6hnUam2Cb/Dq9Gg7NE/8emGa0Mx9ndtT75H0atRl5u7zTEu+bQF6xI2O9kWmcwM3/h8Putg4+hB/S4TEWmvS02dG1ZUdD9eae8W/6VxW6rsFt1WtldwGvtXeze+Iq+vqFPLaABXEqNWHdQNJVRnppnwDjFdmkiM4MB1WKb3esPuU4SkwyLflMMsfcOUYSYHBJLLrHn0kIuUygTV4b9rwYI/6NihQrTAZtkJ35Mw8hZ6uJSNECrbG0k9hvJ8pmYH5aqL40U/bnya23IlZpY1V81MeUKab+u/HNRpLTeDKjOdSC5rhNQZrnn0v+49NL/AAOl9eVg/j55jUl0heQvqyZOrALmkEs0gdv2yUfL60uLnCC5YYOcdNI9+IJLlbIyuKxB4omrCruB02yVNsvis1H13fWJiUsnkj+U3tQNk92b5AFSGjohKzx5PUObSEnelMfjLX1QJhh/oL970ybwWq4cynu0YVbBIOqSoXAow2qHF9vsjpL8BR4WLDdbiqpLF7Q4S5qbSpwtC8ZVFVnMzKIRA8yn4D37tJ5iF5JXSksL/cBV3DPNfs0YY0QF0i/eZk+hftSJV/4IYRsaEGpbQRANKzjOLRwkMdYscQsOhrALJ5Yz40HiI8zGCdk8wfBhiSOuw86mltz2zqfv3LZE2YCNjFl+32gS5Pcf13l1j8vvCyaj/L6ZYbWPP65lGTMoQSdByeNav/ZxUIJOghL1JNTnboM2URPbI79u1um45d8Yjd8s53Q6M6jtYU0WwzffGM3oLKhVzhoMyln5dXTWbPzmG4Oq+/2UvZgSUQ+lgnhcw8MaR0bASG1JkGPUoU6MlRBJGUN8YMdhIokzn8fqn5Rffrz316fWHv1s70E0X4aWy5cN3I4pZre+AMRbKiyib8GSQydvOP+8ccUC/wmqTezJ1H3N8o/f3fvZ0bW7fvnKv3a+DgpvvwU4Xt3NwXHjime+sfWGk4ciYrFQqmCbcSnVpl2uejASc75vlB//qNiWRB6aBlyb/wWjMyfJGQ7zYP1Qgf+jhgjSB7HCgh/mcDgIjof3VD/Xw6aoidgbjCL8DrzDbiXdAI2L6LPwV8HqDPViG1BJH5qAJYy/j2KCEKQCBAEfBhLgekKugfY3JUmMiS+y1sTEleOTkTWdTYLpKWuhU5Joy8uNCtzHMSlUJx2ju45JdSHp2IBLnpxOPgt0z8Kz6kJHd5yQ6iRJeoE1j/O6MDicOxw2Cm/YzGLU+uct/bhiIeVC5Tby7yB12bPPog/81CkK8LuZKdRlxGcQr6fhpUusWUCk6rFcCM2NNBr1HVZCgYGXffARpGYR4BwksuA5Ev966Np4K0OwI4jChXsK0mmsBA+GrIrj1TzF/gEdQaTD8Lsdx5zjSj3FvFTlZ8DVtTTPa8pCpyhnwmr1dDdMcNI6p2QCPMOIga1TDm9e5izQBc7pvbqZoxlTGRANdpY1a6x1JnNRrLy00Ag5UatjocBzBc1G0WyP/secqNUt8BAJ9JxF0Ij+stZgczWDRHLIWXXAG67l6G8SH3ujkbIGdxkSaeGlZ7GmkKeAYa0Gg23BpGoNYJ2BSeWmAo6VaGbchHanU1d6TT/grjbbWU5CsiZD6221GwqLmhfVFLJAU9LY21k60Wjwa6Fd0rsgMLCWYl9j3eKQvtVfXayFjKt8SWvvhToTBh+hAWRNWsIV/CPua3Y6pSMjXjU1n1pPXYy+xqxOjGdjkkT6pyOD94kaNVgFSniOwR9iPFYSRHovGhVxbK2IdrE66MFOa9gojz5bolpCD1ABQ2NIu1RUyiA5Rg6hE1hlxyo6vAebfmfa7GLH7G0arVEo4i0ewfNE5Z82bphdXX2ib+MKpCP2y6cO/VH+vaDtB+DQH0EQhKYd/Lmclj+W//udvVcmHwSLp02oZDjBxHFX/qaqshKygs7QsLRj27wCSVPuQAWzLmpzljGsy9kM5i+MhLW1MZemsKS19aGFheMNxYW7/jnkn2wSXD7/JK/7NqObZfXGYoHVL1/bU+J/ZsWype6iJ5p7bpgsOD47pGyu6bj20t7W9h1PnbMVMMkHfzAtcZ1gQL0ANrW0bTUKetShGtfDFct31aOnozK09RjR053jWOOsnvRWt0usdc95vGNSVOSK66s51/R82WILpaUkzBdP+G2Rpu3Ba56Qx6TMJcDMo4HSYmdE5tyjLzx/9MAv/YFfyrelX33iflDCRJ94Nf0YKLnfv3z5wm8OHvyGbZHdQ/LZq94FzmfBpN+ky+S/vrsKHBkCf/H8Rn5WWetDssNOJKdtwGsvNBZVOYonKB9oLBYgNh8A9HHFcJrFabYYxKJVLNL7GQFpOGh4wmsjAv6QOZxkd3oXLe9dtXxWs9myWT7ypuRyScdA+dqSqcsXrVww17flpcu3tBVEXbx9SseKOQsSldzki1cuaIn47Cxj0Lin1NcJoUjnuc0lLGcVNTxSj4Tq2KIVl3TAcMvM+fO6miwWRy3nnN69Y9s14Cfd21q8tOAp0Ok+kr8FrlABeOe4IGqMFdP2zK22BmZ2VVzaD2hIW4rqp22dXGiRxjW1tdWYzDs7OeukaZs2X91R0Nl91qK5k2MmE7PUxTvaoo3F0DHz4jktHhF9PvT1V/COpqoQrEFiiw3JLn9jKeJJbiXxVUTCAorPPrD5LPgvaMswMjF/2zq7QR5KfzF7K/ObwbLM39bZ9MzZW4F74vwd8r+Accf8iWDyKeoUmIp+rmpvn7djR56ciRHKatT4oDFpTO2nCe5ikiqRaYZkUyEyffC7Ar3gNWPwmR79roCvYTKxWtbhbKz5ZKziacuKOUtxAXNUrJjJtP87CzugFhG0YWZUhZFVPvWdpR0lvytrprlijpTfR1kbqJDLalHCzixWHEP7HQFqKexbZVDDxgyhoRe/RzwYj7794lwcvngaxgDVnlv2XbwBanQ98H4nfYDq474MyeQ2KoYjQYk4hqWxuAPPrVQEC6UOMhrRCpBYnJCLYkuD5LP5cLSXRJ9a2yi/+ezt8te3nfiRZechwD+z553t0N14ijKaSy1fyKXOIN0DNcKC2MTlvR1BcL+83gx+VWr5CCx79bE/3Aa0tz8Bylovjf3xsmfkb/d+4NqS5APgA5+T1lsKIm3LJ046m5f/mEwG5IZhOrbC6xMLh2j0+njsPqksauKlUYcSm4XtCpI4yjvRoDv6X7MrQvP1zFWB8rDR69nbtN59jruuS99Qa2o2dfTc8af3Tw57n3t/y2nkf0k9De8/GPv1cwZ+mbPH2V73WPz38cdACLjBxcMsaCqeAyoj1n+tkFHUsKyDURuI5qczYVhIcClCch9ryyQsMUo9ySSfk4//rF8Q36U5ndbo+CSzFQV0EOwwuRzyDnVzHDDkKEz9TD7+nCjAVRMBpzMnHZopy7Kpk1irfGIba8V7Fy7LJOQCI7D+FHv65mK/Ayr6tE0NM1Iqkx2Mslax7xkPLiuslnI/UX57lBiUnjNGh4/KT+70XdHialysBuN4hgnjX7difYsqSnAVUGiNsY896i0+IsEQV1TAx9Hk5sCRvj6O9yPxFAigHNCRWjogYYhe4GEirC8EzznvziT6pPnGGTMaecmYSN55HrO47BLz4p2VlTsXmy8p46LR2R0dg/Ppr9/7omGTu1AecC2u7FlWdMcdRct6qha5gJcRqms7S8BLQ9ptoD+RqPY5C6DFaYEFTl91IsHbaVOkoqQiYqLt/FDJphLP+BvGy78JlY13OrFXKHgTDIA3sYcoY/QV2LoT6veBsUTmEP9k/LFiDVGxIiGlMpfMEDS0ATqXDKturEjDzCVVeDvUEFI8BoI0y37ROnfZQ/X8vKbqGaa4/HJcM6+5ussUv6XI1jI7XnH7+ttd9uY58Yo7osqJGIjFNPNx5ujdNnvz/OaKO9bf6xwaArH18svwm9ktZ/ua7re5mhbEKu/ru9fpwIl7otruFnTt/0fbd8BHVWX/v3vfe/Omtze9ZvqkJzOZmfROgJCEEHpooXcJIB1haGIDFaWoKFERG3YsKLpZ+1pQF7fgz4K7uLu2tRcgc/nf+95MCMj+dD///z8w7936yn23nHPPOd8TA2Vx6Qhyldg+i7lydDy/Z24PKZLIuz0hGV6RP1QTRy+WStHpuaBi/oV7NdmCJtUFOiJAl3ZkXwbSruxD6R6b6cBpvAxJpJpNBKrBQCUS+oTb430pNq2+flrhc4XKHHlpmK4Nlyay+3rDpVWBwsdDtEPt4C1Gg9HC4xANFL6a83VNzpwAh3wG0zr/oEFZq7KkQSlqIc4UZmaXl4YDw61ZS2yQl+lkROkFn3j4oHk4lZElCrYHLO7Ng6kR1FRqMUXxeAULQgEhkxZEP0GNuKdBeCe+P8kb9MX9xIW3aOKJqX2WN5mFNRB/W8jx8VgJlcXgpRoSkJ0gXm7iVJY/juNB4gMEx03rG8CiF//NSlmN1M60oM8Kcng1z785bL1SJ6E1yvaV96B/pdO4LPlcMPLlG4BirjzRzDBKiR735hok+RIw6zZ0z6XXTHn7oc8r+u4AC0DL19u3f40OoRvRIRICo0EnqPrkiis+QS+gA+gFEoLJO3f18VPApUDKhyodnaqzFF1Os9DjBHIgA0o9rwZS9BSS0rWZ1J5n5nWNSCgtvF3jUvrZ+cdSqyRsXhbT8eAL76B9s+CBe+fnwJLzbtwiPMypJ6/4BFRd8AyZtUdofz3RFwM6NugnY8SfMEoYo4Ex6wAfSARDMcbMVKOvT6Jr/vwHMOn4cfQpiH1GPxBIfXfDituB8Q3iojRp2J/acc1P+20Hgyeu3fMPF9uOatDqJSObnAc9azM65oLfKSUVpIoI8oDRl+7Cvhjw6KK6Ab9z2HFsJhile+neZLbjtNyRnQR4TUpm/lc4sk/hjAoJDvyMAxIKJUUEkLNUCt/43E+EJyUe7ZIZX9FJmWi7TugF3iR0lATPmiKJtL+tALG6NRo4Pq3jiXPJZBtPBDJ+vST/1jMH0Z/RfvTng4weVptKTEy76UwPo2RSl+aWSmrKy6FcpunVyOSwvLxOMRY9ZjIxXTib6YJH0IuDlg/C/0Hl4xwHtQVShHnDo95bZvqHDgqi4WoF/lODR4KDhgbfWjNHWiAFXQCgHvz+C88m2RtEnRbAEwEFH6QgkWdgNktvrqYTJFhMAO3oCarq3OxaVRidfXhSeSSvoWbb73MC13euLIzHSssdtb42+Q7YkKpSKOALg8BLIHy1RrPoS/xkVZ/e8OZYtTo0vfxy3c9pnzjsx8IaSgEPGWXifhceWf5olpnDTyEQeZjOohMemoJ/Uj6BHnrvVnTy6KpVR4HjVpD3l3fWPLnhf5LJ/9kwdsfkJo8EtcB/N1QdR/f3kgKgHDiOrvrDH1Zs/Aj9/NHGoiETOwKiXpk4TxC7Vy/VJkgjTEQ5MCgo0ZP9tYg/DdgcYdMUpylBgG2CId5MPHwL2KaYnqIlXNrQw4wPTDTij5VgbtA/YJbAs4OJGazVVqN/V2u1Er2kaNXKYokeHStpjsWawe9izSU4dKZphn/j4zWvksRA3PYBLxl0aIOvJNIUcEuA5aWXgYVz+cGsi4xHsFirqa7WaCWS4mLJu/hiuC91Bsg1SzqKm/ydEmDPD5TEmmORYtaIXuU6A03FvnKN3bn9tde2Z1k1Zc9ccEEcOh8HSyN4cyLzqdBO3nQ7kWYKZJrJxPaHEkLjBEMJM/l2/6GpRGv70C/1luj7VarYFzGVitWyOUdzWC1CBdUF+bX5oEM8/6UyN8e9+Ob4/SDfTeQuRcZndUzlzYtcebmVWTb263vv+1pidYPoefgTu/FF8TUlkpwcyS53QYFQM30enFPpbmO+C2Xl4avn5rB69L2kNasyxxVRWc2rH3hgtdWiKgYnL86XuPDsQxCZE2nwsX61FOEFRZUTJ2BjaUWVKsCFjKQDnacmOa3z0p5LHUH77qUdI5baDbwdXLmLnDorL71jKRhxIf9y2F49vHvRcPSJwW43rFzdsWRxO8CLqYOPf7R6ncHu4NfYHGvalywBD1zI1ZA56k4uyU4SnlvARRIfWjSx73deLzw0x3oyOeaEmMUEK0dV9j3y6BkwBAdSDz3c9wK4Fgw58+gjfZtewCl06XKiHpPa+9DPZx4FcnQ6t6IiFy64/9vvD15Rfjv68dEzpx4Gyqpy9G1ORUXOQH6F4H1QAeJmXHSPehH6mO1N1aKsSZtgLzgxaVPtwO/bA07A3k2TUFaqdhPjPF9hT4p/NinF/AP3aBm+j06wdg8IuDlkefBYgU8H8EpBG6MxnmBT4H8BHU4bGB7yRuoLMGQNuOnNN9/sgMbU52AIeook3AwNOGcwOgwGr2H+0ZcND+O8xehaXGYwPAxcb7yB/tbXcWfHfjGxPzhgfMkEbNQi4luIEthuYvMxIKRNA3lzugSx7YBC3CdGfsGIm1piuXZHTgz9kA7AdQ9fZuDNibFrj0XrL7v7kcuaG54+lqi6jDafp0TZmOzUAKMOjEhOIOdUMVA+R7eVT5GkNmcf5eFcHPX3PYWD4Ofz21dOZZ+VcW/i+XQjdYR6jTpKvU/9nfon9Sn1JfUV4UFdNFHQV0OugPURTVIX5wYmHA2KBiQliWqIpwfCogqaN4xIbJMlEc/7AkdtzlDYUJJG6SCCkhCZQAQbOXNCTZsTBVyoAOYQ1yuYLHXBGmA0Y+JOWiPqLBGFVcyl0eSC+IkEyi5h5oAITB2qhlE8NEkmH8WpMaMG1EDm5WFXTp9dl+uZUDmoaNVef16lPVQwfahcwsgkeZyb1dMSAAAn1dG+zVkhD6RhRQKPRP/uKuvMbofEiFxurUWnBv+QKoy8nWXMEo2Nu1Oms+o0TwBwl6nwusJEobwxl+2ozkvkGIxyizJCh/N9oIrVcWqJnJMxnMamL1Svm6ANN9Y4B0uVWVkmpemntY68bKtX7VPkSjmYPbzvkLo0T0fn/hQ6HJfZnWYrXLWmqhadKlo4FNxO+8qipQxnHF7nQIO6JPJ8JX/MLc+mVwFI/k2hC5tWTB1SOi9R5UrUaAN7HziycypkWBkb4JxKlzVg8thqsltwn5Br3c0mVVmVEdpik9bdZGBs3SatxkzPU5tUcoaFQJWlC5h0GhMd1tqe7Cn2e2mDRavn84basrS0WuV31zqs4TBUaP7MGqUaCSbgIc2AXJfHVmAfKZPlOwBegaZMMfpD5nxdGd+ikcXG3PVyLi2Ty/g4p+gbZct1xwtK2XwF7Vc+UoTe1gBOo5ByIBeqOHipQQeUqbUjlZJiAIQrizyuHo+xf1NmTJNNojbhZS2Y3g0h+rNkI1+wthTUmsVRJqjUcbiTCLrlcVBC0GuI+h2RxwBBmY0oIwhacYLGlyG91sdKcL8TumwizR8x17K8a0nzhlpWqtBwQOqdPy2SPTaXU+bxBnOs0OIstqllOjOtkahlWjWvsPsUUjkrN4NOuTnf5Ulu9NuHDh/XnVi6H8IWZ0NT2a7lq7NsbXWDDb7CLIcztvZt9Dl6G/3jT8lQRcewjkJe3eyrcvnzpBvK8g7mGv2jG0YmQhFebfIWYw7DIM9y0DTjsXPKzYVqjVyZZzFIOQNUMXJGQkONWqOTMEpQaMrPd4wcBcLl5WEAbpnZXWLQ1bXWAlA1tBrQ3oLslUf3o3/+bsHSV4CjZ/zdaxcPq3XKpQFD2OIYP+KWoLPNrrIMGrJ83f3UQOwtF14lO6mVeD7QQDUIZex5E0HMVZs5iQGTEzU0bcaEgldicNNcISwAiQIRRwiPf5NoRBoi2+kJMyHACumEm0hUXIA2SDiTYDlMtEU1dKgGVhOFGlyRKejZ7ap7YLS2e+joleMHmQrqlLsVgUBgTsC1+/bnlHuUgTnNAeeent2373Y15tmbOleOblmqHHU/PXvl6OYl6jHPNCp2C2Vce3rwP2dtobFlJpzVYitoUOKM5jlCxu17nA1PjVEsbRu9ErzVs8dVW2Bs6lw1eki3dsyDdco9isCcYIAUhHpyx+a55I74n6vh8FgNfrBV05oNhWd2jl41ebAjr1EoMid9Q1ftA6MVSxlz66WK0U82pJ83ndWQbxs2a5Xot0PEzBhEjaMmUFOo2dQ86krqTrKfEywUXNWFRGXOUFpDMREk06HEICpy4n+C0THRvcRjgciFBB1PUWWTFhQ0faRUQpCGJSKsOQQCOhaY6RCeds2A1eFPSG4hIMKI+yJCXWK6jQcX0Ami7FBJSCdotyR0bCQPZxp1cDswGwx5uVwj09AwwsK4aUmLcYNa1wils6QhF4SAtZktejkDJAFFeeEMKK9XyKwMA2mrg7aW1CovYxnVWzSnDLpcNrOaAbTHUOTndfC5mqvP/AyfSDUzx2c9PuOvs/KPoQJYhU7fFg9v3FHuGTX8mxqpXMo4PMzQBwZPuW60xh2Qg519p9WpAk7FEoVoDWZ/CyBmdCsYA3iN5qQyg5ONwdltUzSQgcw4yxN215Uy4IUKKdG7k7Mcx+gkOiihtVof9DG0HAClEUbK2MgIh6QEgmJwQqMya5S0WWPDw5BRK+GOv+ekbvoXI/00FXfD692pf7kvqaMrngJrT+tUPfUjrcq2Ak6Gpw49DBQ7/ZwOM9LJM3/4UfKdCkAmLgMS1q8GyZcvmW9EkwV74wz2ArHpG0yNxT1hBbWV2k3dTT1J9fbv9PQ7h2XPhywn9APx7WQ850ZPxGPX/Ur8/3d5XgQW8+hAFtnPTJIDe6K8ade8vp76yaVh2BPucuxxhFNZAtDRfzwA6v8uv6snXJpKMsnJ9ee8K9/pXT4oRc3bNbleQoVLw/gxusJnkv3VgPpiQXTR1P+mANgOqNJwD6KIN2+iQy+h0rKbGmo4ngMWUesFD4IPUb+j3qI+wpTYWaABblAIai6y49fvJFFsd91/Gaf/y+/5W/rHhUA+/7fX+3/5fKygrHJG1FLpPed24H8/JH9rwXMHSA3wTPSbawHqv7+ThAraTgn7XBJ8RAMgZ7/9teCj/cGLQyBdPHhGwEwRDvC/qNb3X5Q9D4YJ85q1Z7VML9uFR0mI7BheoFRHZJ0ZZSGzyZCxMmX2o/fTunXofYfDOdxxEnSfdLQ7HKhHVLB7H73f96qgWpdESUG1rhT4SQHHyZOkwieibh2b9r1M9lOcgtRoBJF/iXwPph0JXwJEXzEgvYSyEUZPLCrw7Ofz4gziNCYwoDTBBgkIvmFEcgrTZ8rguKqWtZX42LqmEt03qrVlU5NwAFctB/qnvDX1uY1f1dSnmp/svvttMKRqXLByTSs5rgUzWkc1bWohByZcOb9t6d6h5HhL6lj78kV7m9tXLLq18AX06dKCKqeic/yOMcceXH6sbX5l8y1L8XHo3qVzVrQ37120vL351kXE/uosBYkvcKOIucib0sbu4sPjZ4e9S6bkQ7+t1+aH+VOWjN51367R9NfXvxToe13QBIsFXro++d2tt353DlMkY3fkxlQ80LGhfKAiH1FEUk1jhQibqJhqScJkKlkLn041pZrY0353qtZR70jVuv0FQdhryjPB3mDBJDAJrv10MUIIpihfpQ4ltVqQ1FX6aCpcrwaUVHqWUteLUHn4/lLRj8k5q2icxQaE52BB+hzKxMlzsWTHF9OsYiD9gAHhgJ9SWHzxAQpOhGrBjWgBWsC+OyCSJ4YPo8FoMHsq6EG11lorqmVoyKaDnmCuDzyKf73muBn0+nLBo/6crl5Qvr/7gQceSG3LhFbeBeT7u5999tlUFeryV2tPqNUnIP4jZ221H/QEa7VPg+vwsVcu79XWBlH309paUaaCpBQL8XvLcLsHqQKqjuzWGj00QTYN0pjCi0KPFzM/lNgjOY/BFPBEYiU+T8xDeHWfJ0A8j+EcocPSPg9XigA429fZLQF79Adqlus+mIEO/zkF2KNXvTkTpi5ZeiYOwm++gv4IrG0TnkN96HPYMfaKZTUHl1xaPHJJsil1K/PAWvTHuZ0vpJ6sTaA3gfQvbwP+ig+v1LkWrYrcfei5oa3X/cXRsG7C4x1ZB1YNWzOq3Jb+hpn9TBcVoPLwmwwW/PxcsBrywu4T2VsgGw20L4YpVUP6xOIynnjsHLoPgSaiI2YfHnq4UQZKwo6hbWDdsp5r54eaR7U+fOeKqYefXQvljUPALWDnhuT+2y5/s/oqxdDixQrENM0DNej350vB0PV9Xy5dfFtOSXfZ8Bwdev6pzsnokeOL52S1DJIbNj9ycOPW/b/zhsElq0vrgbw1w2txGZz7EEFn7fdaIOzBmjP6ZyFCmYMBCEUJA+UDwhxSiMeVoD5DgGwpScG1r1177WupbTvm2O1zWuvc7j0txg5D1vLBc+i3H1u3/rHH1q97bBf64Qgapnx+86qnrf8AW4ZPVpkIxoDimSNAwbhJ/WvPPPf2DkmOe3dLa61b6pFWDqU/WvcYrv/oo+ufRT+i3294dM+lE8EDtxZBsPsZIEU/UOfxjlL8Pg1UaxoJgGyfUiI3KJgvx/FDx89thFVlGI9AJP2dOJq8fSCzvyy2CWEO31vSs3hxD9Je2lE62VpSULnSaolWdZgMHXSf+CUOGm6YMudmORi/69ixXTf+EX4s44dVo7+IH+in7a9u2zZj5jY6u2fxkuHti9GrB5aWFxkM+BqVKy0eFi4UP+ZNgyauvGZ237Gdu469cyN6DgRWgHdxOuqZsW3bq9u3EbTxs2MkX7FnKRXul/mYTx4moCbRXEAQvmIGymTHHDOtATTRbo0nQoBYGwHModE8aQEgoQMhnmglskTqxKlZLohTEnQgQRTX2Dim6k10owaiiXjsKziNzAvb8g7dUDO1yE0zz+kgJ/UNv0aSPKIs5vWDb5T+4xh339/KUqHC99AL/MeG9rCl2FdkKYK739UrTKqwv8rTpPD+E5St3f4+mrTb2zGoUqcDO91xpSIEFqHrTE66LGAvbfZP5JSwHG2ZOOT6uaOMRjDTVqnT11w2JvUZusnpoxmO3Q8WgXkPaE0m+tEadM0zSjDD7WCgwZRnjaOX0M5Am8/gNZnkenoIWPDClyPR1YYx42+e1KBSAdqu0VSJfaRWKvZ5sq/bcA4tgvfg1iJEJNefMtBw1JMxIM04EsHtR7qHmagwgBOTN0+evHkj/fN4aJGlKJkFsrSQhPTqru6e7j4KH7rU+k2THHPNd0yjqWl3mOc6Jm0C60ihyeAEmCnleWnKKkYphEn2JHG9mRSPmJ5L4tJ3Tl6/fjKatEm0q5WS6TZKVWA+vnUAr/a/PLCIs+xJe8Qy8xm7WXDu3dMpXNakTRd99KSIipckL3DqtPi4Mwa8N+MR0mBy0yTyErXk8WvF47mXOEHIrBPkVVCW0Exgo9gAfc8IUUwPZGEe5YTwfpSfDFRXBuuPbAIR92kJ8mb9R9GfMFEiFI/siaANRYDcb0W9Vr8coIgtyIMdnwjHl8gxSWDhk3zQ9hLYgY+fgB2dJUHdtqDV57MGt+mCOPeG/kOS5xGuEEQLhcOAucZI5VKNgi5MGjRJnOXTZtjxBE71DEjNElJ5nOoX9hP7SzOCez4wUDVttuv3aMvNOXYTm7V50d/u59W8o8v3JfrDTbuKfFbOtXoDML9jUVt9C8Lr0KMPv9Fjdme7Fc4tD+4D+bONvDP3zQvh55uy+KVeWa7BKbXPVti/CBu35aiiVp/Us1blA7pC89BhhVzA5c6RBhqrlNkTLhAGAdGXLf4mPKGGiV82juYwjx3CoQSf8DAUescCzIjN2+5Cx0ChBX0KzuAwyGfeST3tRlNd6CsXKISDXWCfC+hceOzp8O8aGcVcSqnxCks82ldSQ6hR1DRqOrUYc6TbqOuo26iDVC/1LvG2RXqplxiNkhkbR3EzkrblaIM54zwgRnYHvYXEtjdhJoo4sVCiBM/2tJkz+IT0KKbZz2W404o7OIJzZIDnDIJnJOIi2ZS4MCZGRLvwMkCTbLIG8kSMae6PYXrVxHPFQgzysXjaGF/AbxaoOpJACUIKWotJSJVcplargUpmAjkKpUqqlaqAXCGRqRUy2ZkvDAaohjodVI+z2aBUZjbLpMB2xGpVyKHRCOWKyWYzVKqMRpWyC8fVEpnBIJOowQb0kdEo57QQ80taTj6Z5xVSHMJxqWIaTjPwOKKSypTgypc1Gg1mCdRqjUEzXa3WmrRAqQRak+ZPar1NDyQSJZTLFFJODZlZB5b1/Vuld4zuegG4dLGyZQf2fwMVcrVanvrhG7mq5Bhs1kpZVqqVpJ4FnwM5p5BxKrAguU4mW5eUNb31ukz+2lsyPDI//+FLheLLH5Rs3/cq1fd9KvdnP2pl3I+fSWTIBBeizT9yCv2PYK1eMRzlfS9V8N+Dd3lFFpJ8azR+C07LVKqUDn6G4FdyjVrxFUAKtdqFDF8otFrFF+ALpVaLpP9U6fWqJcvgWloj41ipPnXjsrugXkVvMsu96FSv6QCVwSegBB/GdgGBlKKy/Ak81ZAd+ipg+t9jjABOLUZL4pAH74G9K46i21AXuu3oCrD3V+KHQQ+YdjQTP0pTY0bdJ+pj3Deq774BEZAzIMLk4FNSjOHTgP1cnrJRPmoyHjuX4rGzFc9Jv9yvM3M6D/GnLChbExEuEKRlZBNXwhnFPXMOCn77iD07INYhRrIHS2wOKmBEsL/Hr40PmLJQAyAx40mOmLzH8L+QgaNJ0RC5ioQN+siYLGGPOML9AMrJcJdjM1gpV6JXlGA6sTVLURB5ohXlN7i0aggkdUWX13xw/03jNSoLYOWMbPJotQyWJBr9FpVK4TYCs1IvI8bwygSyl4yODgUbNCr8OAJChRKs3boTmtiWqL3UBVdYLm0pUjPMZmGLLQPDHHY0oiucSlCmPK1nKGLQdpqCI2wurtiEmSsAgmGPpQKd5pSAkdvCs/NlGghHd1+xruOWSFhjLJRAmnWtGbQf2S2Xh8fRq3M6uQAdZhiA65pwe6Tmxu2YKG5YOGZRqcLiAIA6r5+J32jUb/s2vJEAGuPWj0XJ5joOC5B+tEQDfCUFxDUbAVYntJ0Ptzgdjf1qS89t2r8vydGQoQFLJ/ftb0Lvdk5nIWTw00vgdUuugyxgGAjZ6Z2/odno5PzUfPCJwaaVWmivDNnhzvnzUbPBZiTOdtksGfSkPpK5JUajzQCemP/Ldhj529qBmAL4CKgnkQZDN/CROC02hgDhRsQNhUCI8/SvNgLIB9Zhs1k5i1+agSxHz28BvsbeFxrQp82zGSWNexcjUcxrQR82Pvv8b2iGz+bNu53jpYyE4WTM7fPmAR2wzZ+/j+MZGl9HuQ+3ydfok4yOzMD3LxV0gX9rC2COUvTTjSkNguwIfDoycgnY4q+/cxYYPOnKlpyG4c01RR3ouomAXbGyxF1a7f5tL3i3xpzsGLHSzs9P/QlYgFLv6Rjv1lzsnXKoyG+ceXSeWMIMGFFdyvCrr8Ak+6hesvnR3tONadLf8NygF/X2kirJblKFIGdmnjWzL0OeN0E1CyjrMZ+Rjfmc6bPx19/BR8DFdUCwEBa0oON8LEqcJMI0GQ2TREmQ/OjK//XtkklEwW3zpdd/eL3UOD053OQ9Ivh6Y5ID/sCvvXEyiaeyd9CdduvIhQtHWu01oDWZtCGb4J+xX+d1wLcqo1oEbbbftE4YM14j+x03JOIE6FEbEpHVTFoBdSUUIV5BCwBJMQgpv945MZFDfEce2EQYg00HtOCQm9+wQRs3GFndjBk61qh/1m4YO1YfD0K+pISHvOG3zE4FUlPqBHElebewb3y3JjXYsg/s2WeU6HQx4xr0/BpjTKu50TCpbxIP/TFD2Y1lhphed5E+Hf2t4/TCvSE202oCGmY08utLoeCFGAlHegFpFrUM/QRkst+0jtHJTF2AjxC/fy95fyDvBHLZRb5/ghpG8JN+05tVE9tRQLTfiYWpYL7iMXG04LcIEFV3Yr6IqVxMKPBiWZIZ+vWP3yW1KaIKWvrEE1IaB2zSv6nxy6rVf7swHS1XaeBV0KSqSZ9/U4vgKwTxlb77Dl8hiK8E8nn8h45dmJ6S4CvS5NJyHOj7PQ5gnid0djd7HLcX0dDF5JEEio595JjrMdkI7ZQI9ntcx4OAqCQN3O5jj8+cWveHOwrbOxx1c2cs7RprB3bbuFWrh9+7fPsdbx969LlyztpQUad3l0ditX+8oxq+9LL5CvTt7bb8Il1sybUfAw5c8tZ7aDf66uWue78cAsKHe3841rtvPWCUoazZI8Z2Tp/w9F/SMn1OnNcklBxzU3rMmVoJNgAPdAE2EZKBQGbDGfNuOjaAaRSdIe1UjLAkIgv9VzgBPYoe//3v6SgOfYcebQVavHh9fTVoS93FvPl79DhQpe6io96+N415xr43vV46igM4ASxCl4DZH/k3bOh7H+w49NHlTzzxxKSPwGx0CfpqA4D+Q2AHuik39WG2OfWhSgW95mzozTZDL6bkPzRn8Frxi7Arcb8cK/ZJYdfO58mFgoSjH8CD6N3rcSYQmGeirZDBC3ex0fQuHpfRAfN5Ra9a0kVXfnE3o6HPDAaQve+LSyYq9y+b0joMhB47ACx3gtNv3LP2ytnaGmVDa6K1NZY3oq5u6IjFdavuvmfNtdMm1beUtDeX5Q6vqx/asahm9X2wr+CV1fs/BfJ/3nXJ0/FQ7tI7ym8+cjv64k6JBX29evt0w1B1XUM81pjT2NHRmHPtilXbpy6orY+WDRITtp1vfyBibxKrmgThP843GvBn4VeJmBMgESxJhCRaKgsfvSFOnxUXfMuyZjwBcyYDfO2Xqv+wF22+//mO+zqeP/PN8w7H852wHqwVE15Lu4qlZzzf2fm8Q0JdRFNY3Ukq4aqkwv1oc+o5IQEEPxYrS5+/X7ycsF+TJTnB/oWgQIBzCk56osxPEXyCrGqy5R+KmRi95MSV/0S9qAf1/vPK50H70Q/QB2m/trPQBx8cBe3Pw+TDJPPKf4Lah/8Eln7tPpmPev6xUXRju/EfoCv/pPtrtI3ohPN4Pvs3bsPpuKfH9YlIMR6FjKBMIhiwA2LmTjY1E8R8Iy5oAxGCkWQKAbVgFS8auxcwmOuJmopdUrM+rVvOS//6Eguk4dpSDzt0SGROa7VWG3Jo7Cq1PDs/R62aE2oz8CBkNNze4wnRjGm4wzE7r4Pn3V5DoWf8iMEmY+VQC5OVU5ytVqk5eTh/eHFjbpGDB/SH6JKzh9Ghz7fAXcfBajxCpNFZK/bsPDA4EtK6ddropiUzXE5rsccmkSzVNdnsRYuy3E8+XrDY6wkM1umWqoc4naW3HK7Ndxs8Om1s7Yq13bNHVul0KtrprY+0N8+as3EwSqEZ/7jxZ9Ah0j1CX1NiPjdMtVOTqAXUKupK6ibibyPoJ54T8H/M1HH4GNQmzBKOqF0TK0YuFk+E4glznOaIIZeEqO6YcRdMBENEa5t0S5KLjxF8AXwZPFGmi4XifkqLj6LuJa6QIFWEWqQrUAOMYRjROOY8NXh63tvotnnlzry6G9/X1aX+NtJkL5s2rczFd/hYafk8dNvbpXW692+sy1v9qVr9L3fD4bLOopKJJUWdZYcb3P9Sqz/11B+uGFeUtyCvaFzF4XqUU1dKigd9ZfNAF6OdVmY3jfT7OnhXmanMFyQ3Ka17B3QB1daT6EV0AL14cuvWk6ASdILKk49dZIDMqpe8ddBbHCm7J2+MEuoclSWeQ+DmQ57SUseM7oXoX96Db0nqgXJM3j1lETihPWdMTvvE1jsa9N/I5d/oG+5onSgkTWq5o1H/tVz+tb7xjhYYrIeKMTn3luaUeg6+lbofzTrkKal0zF7YPcNRWuoJenDGvTljFBDfGq+d5Mm2DnxauO9i2vnnZFkcpcVU3yBqLrWUaDcGDERKHI3Q6bMpEZP4Mmr3RoL+Tw4EXoSwHWQaFjiQUJyPCquGj9A3bEzEjY+YojEfSSNuBcj0GzX6cGVaEB6Jgpj4hS5QYdOk+dNm+ZtbW/3BA21lkcoxyyvygtmLw40tuSe62uzFxa2d8sDgKyG8kganXXial/lkc+lrmEo/oLWYe9O7S4O16NWiIcWRpmI4Y6BI7GR9TS3YOXpUZzRwmdO5ZExkjobWNcYsdGBWfoNPe6ShVs26LXlSzSXDLQ4ZmmpPgE0FZnMRWhmRrTJ2fAyXdRgs7sJlNIDHA/GKoAW+50/EA/5YfOQFGK8SqhHPQ0cEDGytsIe5gFpBvHr4vMS/Ak1WJBIgI0PwpC4gs7BGrccrqCbHCPMQS8vxzRHgI1r1oShRtQ8YBVSrmC4a8wqI/QSeH+dEjcRVmM6Q1vwW1z848q7bDu6uqKxYu3YFUPlztTvWhkP5g8eMGZyPdg5afUndEw01Q6Y8d01XxzTwxIcM8yEDJw2eXd0ZcUohZ5EYg12Sv0vu15SpR4+tSn3dVlbePryi3DRjzkx6YlXH9VvBm68p5bnZ6x8zS4Mhd7bZ6MofWYbetpbNb76rkskevdDBWO4dcfXhwr7n8sfDqZO9ngmpW8Y/8mIoXNk1rgJMYaDkuZa4L3vtcwy6YROjvnTs2PKKcdQv/FLLgI/GkwftA7roL+w9soG8+1aLIeeWlYCbCf9ynlK6AXyHu0LeRFCKeHSEvup837NlZynmFfyNnAJWkAgOxkEiASPbXkERuZGYpBALcQEbRoCdJNq7IrAQ2WQWwI+JYgUmQujmJcMro9Wxn/KB3cjiYaI2Bpsaw1WDtYt7wL/3ou9uq20wmlnWb4yWTX002dKSfPR5fCqRq4LZ8tpJe/+6/DagYgw9i30Nw9E2ZDF5oN2w7rvfPb6xsnOYL6d9cQEe2N/vVbMBfGdGla6OT1OXzDGEDWp+zfYVf907cS9eB/XpdZAgNacVZRMEWoRYbkvcRGudjGNgTFNVBIXSxxF4TbOI1pR2KSMo2uLeJjqWIfvpAlAMEVWIjRTTArXUpAI69eHLrj68ZUtxR2XE6zYoQUJPM61jQ36ZUWdUaAEmsiqGGkYmpJBha/8dWzqiViNV10qzH+jwNS4fVWdwKyoMjBzCopUqlpHqh2YDhqHN8D3eYyjXmqqVV4PcyvqEMV7e1jS9vZwd2aAuUQKWBUv+sCB3icaQZXRDwNw8yBAoyGEskql6E89CBoD8MK2xxQPhkBOaAISQVjxbTRuyGxgZiBcAPkN3VWM683kBJ9yDaeShAobsOaJ9oKgbXjwZ4CBD+oMwOENcwk9QRQiyHNFeMYugc1qBUjXBxkh2bn19bjZtjYbt+fn2cPSLYjEFHiwJkZRQCfrRHboXnbzT7PPYiqrtHbLUEPThC6D1pYdB2TG46MpliVd2NZICdwLHvbcDx/2MvCMSDYeiaIojL9/uyM8DX12YcB9zMzq1t62ZpuWMDq5/73Xgvhc47tz8aapm2Z/GPr4wsO1b4Pp227bvRPwSyVncNK60r2GBZw3QIkRSDPMMBDlLwHaQnPRIzlKsXa1TqFDFt3q3Ssab6a4zx9CyAA29kqQGrwg/WMKnKadWyh5Gx80M5zGASYyvb/od6uwwT/fKzuElnGV/wpxo1nl3BZm7pu8JeMDKwMD7pr5Bf9Y71TLehMIBmvZJkj70+genZ4F2egrynrv7X9Bho3D3F3+vzg4Z6F7jaTWb2/fSlXB939/Pm3dKhDmB0B/4y4m8bNSUVt0XNPrxVzVxmZlIgAsWPi57vkNb0XxfQq0+ik7uPYheW8gB6ZVyjZYb+u6KOc9eNWLEVc/OmXao6UrijhrV2oLhkGvjfMDfsBc4jqZOZ5T3TghKaLQDvUqwua7fLLdKr5JB+ZQ5uPrb+CqD669yhcJEl5B45t4wc9Hqo3tQvzZfV0Z/7Zz+ip3wFWqoFehwbQE4z5psI+oTKWuBBJ91P7j+AsEhS+HMgYXQk7+QDVbjez2P77UF05Np7TNhlsQzCBHTCWCERtpgdtFprm5giRBuN4I8DDJun/AIE7g3onVu5Iloz0PmIr4kVAAvXkK4rmRH3iP5eQ/nWWzevHKtBwBVIDUpqAIgoK2NhK2WwsMFufflmK3u7LjGQ7AvWalapqks8FssBYcLcu7NsVq9uaUaH65og89YcUWffkTUasWXzD2Ya7X68stxpldbWei3JDku2+p2MXK5cQXYapQzjNyItm03ySXA6bblcVyOxeVi5XLzyjI6ny6wR7whi0TOOIS8PJvLDiVy49Wo16igaYUR1F6NA+ZgOtMBWLn5qr4RK4xyDjpdtjwBY8hyNskg3MZ5afwIwfzknIK2rz9ElO9FO+F4NsG7QAFLhLFJaL91gdV/rc+2wOa7Ydq6+tpx41YtAhHwkdXPNgx11gKJVRE7k7T6/Vbm+TPV5Ay+VhaWr1q2/cDK5dkBv8BHkD5FDfA7QjSIG6jBmNoxemKBX2gKe2K80RcjZ/rCvAv3ynA54qYSdKEeKLjXSuO69fT1nDghoVJZJ84l0slzYVh74kRfD9khHQAiFwQ4Dqlksg//mPNyEDUwli4myrfTvumJNgXxHoLbkODs4Zkcr6MB0jmzcDqenVjMCbFxpnfLM8+gH5+BaM/EdTi4Zd1EMAcSuDcSRHsgBHMmQooUeWaL0nRoDMkac8ikFKvhkAUnnjdWA1SMovyiDWwcs0ymqLiVjJcaLuMcLyEYxP7ClI+lLhs3quobCL+pGjXussseXge/qR6JA+NGVn8D1z0MLhtIKqUeXle+UqvWrixf9zAuwmlXll328GVlK7XcuMvoEwPpJq6fd9Thb11NtVDjqBmYe6AoYdtX2OEVBBOJODATnD2NgIBwjpGLElz1iBvwwuZxWmvWhJfOgbG42HeF+TOUVl0RpOoitkuJCI1mgIMMRdYFB/LkBqtKkaP3bhhlpZ8q+L6R52vHE9xU9DcCyyrAqT5xey0f4xvPyJUq+QSZTG6Td8rfV1gUnXK5zC6bIMvSqwXgky71g3qHHv/fPYEUleNiNrmMvjlikOcdWGAtkrPhURu8CvBAwXeN+IK1tz9xbeYewEVwX8fX8nwjyEtXxFe2fyUcZULKM8K1e9K30usHZe6PnyiNS0DalqEM5MuDAEt74AVbQCBOzIB5czBkZgMJCZfgiVGwOcHynCmSCPEBOBW4gXshupX95R4Qs3DnrK9rLt/1VQx9jD6OfbVra/XXs3a6QNPVly77cdmlV4Mm+Pbbb6OHmeRFGNwzQ14/Q48/ARqUR1vW7tu3tuWoEj17Yjx95vXNYfTnQaHQIJATpgTfdWn/0BmbgqGC1xCyw3AH9Sh1hMwOGc/VaVfuF8TBr+QHMkpNvl8r+ev5nlgJywjADtUMXgFdjO6CIrp+x6FA9BIpuoo8F4S1F01OPe8IQhi0w7P/TS2QTCG0EW1MIV20fdtjQAWqgfLQtvao7lyZoB0l7cET/TrwA7yLoiUXS90RtG/YYA+m/osq4CqVfA4EM+UqXUnLsNbyQKC8dVhLCRp7rsQofEl84X65XxoXwSBo75SlccD65yWeIBoRQV8mQRAlRMygH9qN7Q/B3qAtaEN4Qj7FWeC/CLytGMUz+T0Wru84gToCWQTsNxNielM4PyUsFZCi55pTtbC3L4nSiwJeJCgzSKTdnZOjSOcKz+wkFKeBI9pCTAjgBSqorwFmQASRnHCW/E8ggBbt6rkTVRxGux4H89YW3tmzC1wXnNccQN2fgeuD85iK4Nwg6sZlCtcKRQ6Dl0iZ6wPN83Hdz8B1AUH2bz2rlPxT8NtnpMoFr0QDURAu4uvSxWLqJi7Ae8bNEResZvGo14vWdwlaEPun/SXwgvMFFzCn1wCjLhE30XPXP7oe/wc/ruscv379+M51H9cOP3PPyIrcCYMnRMc7RsNGu4Sx+bhFbI25MTg4OrSq+eVVZ0bNr182p20MA6QeDjBjh89ZVjd35JlV1pwQo6EnNzCfNkw2hnJox8gVK0aOWr58VPqMfoa3jB3aODE1xew1aXBN4JDQVtsEgppPSxRas9uyczb6+6HFvqzC6GLQBKAUoAeXRAqz/EsOAfvsnYESO5TT8Ikhs2YNSTVr7CWkzWbg9XBvWk5L8CRwzxLcien4BLHBNyaADng4In7l6eT10H399akzY0DTcUw0t6Gnjx9HSxYybagNPEp+KSmi7Wf+efw4c1+fArXh8+XAI/bh8WcBex+bwpxgLp612qiZZKaCpKkFIkrkggUAz5BEAxjBrjGI43gxIiIuQBbAUJAWwDnTfh4I5oXg5MZPvqCexVEWT9oSEW1VUKnBxWgWsMpQ/KxPxQCWqdwNKjTFVot9F128En2p8/FKVqrP8ameHZw3ymyly7h7owGb+r5CNavzFYHlr7dJHalOtqK8FF0utWeD1vKwjA7CW2inBr3cYAHmArXLBZovi8gcgaJdkuPr0fuqLKlsco7GqFTLmx9r4hUyefBkQhMaB73WSMvjjbDVqffKctGR+J8NaqMcGFuNEWOuDoTq7ZwJjphl0I2DY3z23EkauU+f+v2rIYO8RSOFmCApDIOZ99dLeJ35gzLBvl+U4yTPs32wUz5MtxKfNfjrCVSeToB5jJ33IzSssEno0Rm48yAdPDGGQkSSnxIsNVgKYaLp3A8TecGSoCR5mlKwr2Oarrv9VLK9G1Ck0llM3dGUUI/ql8cLv75aulcEEmZqz/R63EHmvTOCripTm8RVcygV92cBb8GN57YRmC5Lj1qjIeHFzEraiiZB9P0EIDAB/8rnJc6IBfIbry1COo8pGBxO44KdS2cM4R2XdVw2B7as37h+GK3fLW/74h9ftMl3U2cVyiv+tWf0/etnlEPdLvlmsBIkwcrN8l1IoXgMrUelaP1jCoVut/wZyEAbZJ6R71bdYMjKy8syrI3gv116lbx13LhWuUq/C2ilc6fnVVfn7dIr5Zt37NgsV+JEjezWfftulZGCT7/xxtOkINGCE+xmhH3MgVKpGmoYNZKaTs2n1uDBeYFPOOq/PBNsSBHVLhIfmDYQ6047QAd7II0LksOIXgR4XTgh8UQPGxi7aCI9rGVOC/6PMvUz5ngsPgpJr7eUnBYk5yw+xuaJtcl/8LpwQq8PjF00MZUE56T38KyY1SvAUov8BrpLSKOp0xQpJyFH4hHvLMV+JSG4eoOEfRDo8RGYPAIfIBhBkY3JCiC4vxEmEKJkIbp0MvhCmAmkhSZKZDTSMVH6ld40FnnzrEGWSUA2ZD1jtNAyn94vY4Obtsx+qHtWzKIANMMMv6mg/cPFV3d2ztDDkUCBjpuc9L/YfCcc411fNH8xvXrUStTosfHogMbmcRlLT3R/VBqA5tDcKbubaiQ0oCsem7/h044wBKBLmvpR7jGxv3MGbXz2fjKHh9JrrZzS4xk8TLgqM8V7IB3EzJ+Eg3Q8oef1JEUGtDTxbxMUdQ/04LCHB/IuVL/+a6XeQO8vbhn+SJg59vHnINeHqrIRxcyZ2YDet45geC2YbfSxS+kuG6ZdZ4HDoETrQ7e88jyIA8cHJ9FBcC06kuLRYngTHUr1onFoLSyCCpAP7FqrzYBmi7IRmWg3oqEslAPzOIIfeuCLEwliwszSuG9yTEBwC8RHAR3lfaxgKULAHYyiijBnipqIure4iR93gwBm4ehoImoyRy/sxdyTV6lLaEZJK09vLFfUou8hSADNHTrb8iFbHwJs4MCcA3DPoPY1ewHYURSsDI1pMpmbF228FV5TnFdc0BTXgN5knenHB33vspqbky0lPwvdSYqP0BvYLpNnyRMrQSiuGj4RNY9vWuFEEG5IrYMbtfblk2cNMfuNriyP4jovWDljXqPVazR5gFV6Szx1qMvUTD9/RrgYK/RNS3/bEGuJXCpK1WJOfxyeCWZTi6nV1F7qKeoV6hPqFFAAK27TStAMxoE14GqyC51xzoGZwyDUJyRQb47rYcikh5ywpx4T9tVANOYzRo0VMEZ8SxujMXM0QRtzQawCGKOhSDQRLykE3lwciUX9Jf1CfX/E7GPEuRjH4umQ1+wNeYOCNAVPs8WRmKDaWmw2moycg/iL90kCUSLJ8nKi92N81ZJoxAmEk9EcJVBMGTa7BuA7B0mGOSHu/Ar76JgdJc8fFzZ5ibdkH74MeQXiSDtj5UXyQuRO0XN3wVcxpTNDokmRcN0Lb3pehXRmJo/z+siWD9kNMAibkwnCGCeIcDUYIu0U/AW+z5TkTbOfvWLEiCuOzLkpuWnylDvXTZywfv2EiZM2Tpm8KXnTnCMk79nZN8GZnI6jnQwrkbC0hGGlkKYJKIrwBwEe7GdMJl5vMul5cFcl2wS2mjB9w+tPm/1ms38r0Zkk5cieO2CgUAmC00dcTmuWRu22aFwuj8vpcR1wOnU24mjEoXm0UG22mg1Kk8fmKlRZ3FaDyupxejZKVSq+qMjlcBQaZzqDIZfHpNYbvdxM/yaz0uVyyqUymT7kcfJqvU5vNut5rdrg8Bx1uTR2ZyjkdKi3mJVOJykmXe90akpDIYdT3UY0hiGhSCFDM5DEhCckTz174ABi7h+Nm2o2aZbR80EVqBw5HR1D706fDvJA/pr56AX0wjxSYs5sXKLvOE3rDCqVQaNSoTJIy1lAWkHF5gUtVj1vGZvlFgNWv5WcnIARngKK7UOUbskz4IcYjfMsFoN26zC/fxj5NTZoDeHqsMHilUBGrlFY1BaDhwR1arPOorZypip7dra9KrI97M4K8SaNR5kVwvVbfIyDwRW1FhWwBC1Ki/bqzKVWZ7Kvblw92JBdmW2gyRcjLQKFpyB/5JtDQZcaMJ8MnApE//TCXCDHswHZ+aunxlLTqHl4JriMuoq6WfBySBBhBYffBiHAEkN4XcY5PJuWIcfPDSnBUaiIcS2MKkGWnFb0iWUGBdCpgRKynnP0QkDwRM8nyOhL/0BU0Lwit4v9QmoIyvzOSp2uyuGXfF3LG2pOjZwxfMqU5vxKV10dqM1OOI12o9PizS7Lq/QXBKS8w1RkzskbHK0FpkB2cU1NQW4wHG6ePas5h/mpbh96Ed2LDAhJPLZg3wPzds2btwvA6wZ3jh+8/e2nVixduuIpsLV9bkt16dQ6GfC0Jn6WJlpbE9zPiVb4U9Rje9/uVpXMXNI8CT0WjI4Hrf8K5xnkerXWaM8LJMK+bK1KojQZ7Hnh2qrs1kBdpKgh2GqYuWNm6kmoCY/bseGaoiB8kdx0nhSMOXEC3Scr7SxtLkOPXaNtKyxBj22B/jPK0ra2UuZ7fCTkuL7/20FMkasxH+rA9HgQc6PDqQnUUepveAZngQz4QQ2YRlF8NAQSZDLG81rAHDOXkOk3EhBPQDyx0RBx6s75QkZfyMf5eLzKRc0JYFAz3iCeEEMcJvTNCVzN6NNFjeLF+o24dHhhNAtzPSb7ExGyF+OC8UyizmcMkf/CVEjWXiHG9fO4Qgb+eYz4c5MfJ9gg4bq4p5GFQsRJT5CHNkg4F3BiDp90DfIoEUFEJ6SVxAtoIdFMdoUGPCZBcBM7MEG8KxBRpY1Ehm+Ku0DCKMnkSQR5RDrPBWhdpjm8sRKc6g2qGQH7IiG0TmzF+HxY19x05/btoGr6s+FRI7OBJ6djRC76jBzB6+Pz+kz1k8smb7ZutTZd2nXJvNGtcI9C57CELNmyde0jz1KAae94ayH64PjxPTfeyL4r9q1F1oT1PX6xATrlcmA212aPlllLrX/3PnHIeth8alD4oKU4dU1u7sume9vEbrgy6nokYUYvukvfMTd+Fo+gO8HYRMkxY4X7QamUgboy9z2VqXyLyaqvs3gH1d1cVI4+txptujqAmVazvqn2pmLMl/z1r7tvvBF9WQ9/mrVunddbHPGWhDeu8PuKi31fWWovu8xjDeQGrLHwhuX+8uE3Tly92Xa5ddiGLTVcjsat1EnsfufEqQunL6HHLEhdPnx4cSLedsnxSs+gsLMKfOusDC4oRN+8i/8qK4EGnQXgqadS7xpcBhUHwYTOTqAZP76vFGjKcL3UO58khg9PwANVVQUFhYXTgXqMWakEsKqqvByszsN/Jvw3dWpe3mNgKymZ6jSl/8rL0eUVFeNVs6Yz0rEWyxlzWCbzOuP5HuN0oHGBeyw47nHFZD6NSc5NAxrgTF2K71qK7wrvRd8ATerSMeVWrZwL+kM5ZVatDEgC6pm+cqtKCVhFwEUSDYwE1qNvX3+9snLLVRV4dpXrnHww/Cf8NakjR8j4VPSPTwXmunx4XI6kLqG2UPuoB6nD1B/S3qjS+0S4S/s4whEQxIeB6QLoCEdLCOYI0WcTpGQsHxeSB1hv4zMuQQnFNSAkQJWQ3msWMxLgN1/JINbgYyVCeU6AO0kQ03DxAU0XzsPw02jA6YsEHAFah5lVHVToTTYLmBL1O/0k9fQ9rdU9PKwDUkmLAeqBUq810WOmgVg2SVHT9sYhMweVOyr1jGoQD56Xsq0Kbl4eqxvGSkP5oEOFo9RZsK61ep9BuEiHkvnlRWyDyEXwekAu8oGqWSEUrefhqaFsDp5JoIIP+7kl59HVywPFWY5A1LMyxwXmKxjjvf6IEN9eEePRHImcv0Qqp+HUvwFWIveEFwytaLIYlDItMMpl8r27tDIWLtnMdEtVctBdmq6iuvSXVYCW0YKDQK1AXZCV8YD3mfDtzOCj85ZissfSvxZrqAg1BK/EE6gF1KXU1dQt4jqMF1RC/bK+uLAKC+tuetnl0ojchJYNCstuIg4SvpiGjqbNKEWFLlZYgPHkq4sSXEleWMEFK9dQGk0ycY6BFzIk6foC+RsMRX+BySmpMvIes97pKANPXCKJRE99Ud/ozwqW1+sbOloLiuoaQu4iZ4dbP6RrRFEUM1tdG/QFuuq84NCswixlDrhSo8oqlMs37bKVagt37YKX5IcH18akm3f5s0ZGq1BeQX1BQT39cFFkcteimsS8mRXassG5BjP7MzyfS1o1KOCTnXCNmfZpRZ1VZVLbPN1ZwVBTeZ1Fbda6rfrF2YFs4Fu01bhEOvt/RvldiuVc5CXr1XSWqxRlg4gbPQT+8uHqspLSwtQa625FaR14kdy5EH2+uKZ285JkZSI8283zhWr4yHkfjqbUmCf+VkIJ45wgK+nNpIHIfnCIjZQIY5msMsBEYEoIGluc+KeqZogbiczmE168zETVXmKq+rKlBNXuencnAJRWWzE6azYTlQL5zw/L7dJROPA0H+kYVxX67DlpaXupdO1zMXAHzoEH0d5XS1rm7do576Gs0RVa7dDZklq5XXbqPimUd+ECt2d5cybecN+3V+8BrIM3EP16A6/fMAnMxwVEe7Zz72HCdEQb2RXqf/ioDKRdM2pB/9slPEE6oSfWA7/6Yoz4KkNTP9ELcx7fMummziKmN/OiO+EPB6oWVYGGUb/6og+nXw58Dn8et6xm2oIoSqJa8cU3PAO0U9Fe5p6u3/ri/RjHbLJfzpUgmkPEd6EwhepEtKdfiwMPHhoeCcdm/AqKA8SX8QGREPdx3MTTC6QuDtM0MJw6AXqLODl6Qc7Ri/TqLtGBgyBwBLEmTVsY1IbbNE0gptb3QEGUkxKq/ocw/e9lMghlO3G4r2XkqmUj6aeE29wdKCkJ3K0fgGWcJ2g6El0EAjlEiZAutJNQTt6qgdpSGbEa/E86KMy6oUtXlb2JvgTa170jZ3eUapdrNw255pEntzdeI5OskMj7fk1HBRxdGGnLxePmrdeBVmbPHpK/UKttyi1+csful4pymjiZjM79NS2WgXJ4NfHTKrwD2cQQbPNZomziFWe29NavXkCbrBE9cZpNeMUkZXGn1lIer/CuZI4kcBoCnuIAuHKKfmP+5JrV06rmT+3qGQ1LmtdcM0zCc1MKHWzJvsm3P7L5b1vGXhGECiBjl7NSFq5krVmO8nH1RWg/ej+jCX/yEYVNmi0FUD7rzBbBj5/gnw+MA/fAUwtWVy04MLV79ZZXdIsOTotCEPNE6sf97sFbgfyWwbV8qUSpYBWpmy2WkA3IQlXL2zD1PzHTRNfJoKJYqVTJRnaSS4JS4Di6Go3r19sS9vV8ZE+PMmmJTZBBA4g8n3gEYUM88YqZFtoTfxcyEAJGSeORyR/Pkcv/KLfJ56buCsReP0vVJgNwwlwxbc5Hk/pegrW9qV4JdQT9NOmjOTjxj3KhbLIWUK/HhLJC2pyPJ5+uFcr2pvXIkCCHzE776OCozF47iAuOG0yUj2jaEl3kRDUjGd40Nx8d2jJ11brHJ8J1FX1Ph7aOBAz64S9rnltazjWWVmuy1da65llzJNSkpppxqavXTDi8PjkKNsTP/NiywDT4T+j7SXe8sZyNhLyB+kkVfs158tD8fjQ9AaE6ImBoihCXMCrEIOk2gpfKNGCxC/JGooMpYsdyAoTXxSOEkyGaZp7+fyJHI2pTMbFzMsVfRjjqFJXfHnS4cn2WsMnk9LcX5Lf7XUZzyOLLdTmC7Z1ipleI5KfL5Be0+50mU5iU+WUVIRfX6W6vJX4RxH+17d1nqCGlsWG8w+vgg53wP0aSRKjjsFvsJrWWt9ocTquV16pNOMEhpAohUNsr5jpsYu4FBW1Wu6m3vRv0otrMr5vWto4cFnPmWbLc5cEbW/5jRBzzgryKJXS4x0i8QGC2Hf+k1M8Ung4AdSoJemEtDp5OMlRfEuK+l+rt943SK6yDWrwSUpj8F7w+4VktynuIHxD8/Rk9TUHvPPTJre+I8807z9DsygX7U9Q7eN6Bl6c+XLAyMwulqFvRJ/PgHTSFJ7jzns2deTayZJCRRoZbSBhhxPiOLBnC83JUSLsqtRUPlE9RVy8cSgLg7VVanRE8ptaL73ACtRp1QqlMIbFMSJ/2t8RRzFiqi1CSBLeYEXWGJSHiXbkftES0EcFrFxTVoYkTFBFtWyKAuhIpp88FzVwwJBCSrFIud5X4A2DQsZ0Vc9taImWuYkVWxbiVHV0PzvrTrY+MKLWP0jjBJnT2hh+uGHv9K3PHXjd7bHlFTrmt68oRS4M1HWPHNZcq6IcWtY0uAkqTi9lgc5ibi5voWonPmW1XySd8s+P3gfiU9vXDL3eMmDsuvOjRrp6vptTE9nj9YM9tAOyY+9ruicHqaTMuX7oj/urU9pzKLLc5v2Juk1Z3yX6GNuco7Pns9GIjMNaftxaMFWT2RPcwVJLZvvKZMCkdEvFIDALyLV74TILiKkvayGwU5/5EP3SxMMy56EVw6vd85vOHZQws9sd1wMBPCsk9g6Lta6F26gxnOGIHIyumNpnLQoOGJ0fOfGIezUx6cOHTkwyKypwl45fu2T+n+9ICqc+U7U+UtuTM3zPnPD8GJx+ol6sCDqhSQH+hRuMfHJc7DUvbOW3XOKdU48i2seVN1xXunLViSHH3UzPAgicWX2K3LGwf8uCyuffMX2GcUj6hrDFkvxp+cr7BA52W8YoYolHqfM+7frKx7yEqTJwHR/VaPIMRQwct7iUePA0yybQeq3iiBa1YtG7F1VevABvnPHvVO2RtS1GZVY4mIWg5VyFz6kTfozfQ950jrgJ3X0AfDLAnpAS0fMoCxLvD9NMApl+tH7O+/feZ1X9v5tHz7ghQ+tIZGuL68x5GmP+Jigc+EetLC6aOCCoX/s41RBQi0ZKxEYpiMh94OJOZEUD5ie2B4A+O0A1ZeArJIj7KEiGyjJJ+g1MIzya4p43i0R9KhwjgWjQCT6OXwz7Lkbohm48c2bz04Tuf1peBxSALZU2fa2TZI5srqx7UyE0ao0//4KQjQAoq0Sm0HZ0a3lSH9uk9L5n77jmMTgHu8JKZVwqqlSAJHhv9oagY6TEAxYSZh0GyKeuM+wj6+cj1X42uuREkN8/e+SKQHrGgPnOJWuEEzJSNm48A4br4SlMfqJmGcm373wccWAK4xJPBkmCSiOYdqDtvoF01J/ScXIKnR10gT+YzYFS0RJAFw/P8CPsuxLfSlRDJJzEXM/MZ+TAjym6dQ1ifuW+e2ccOYYMuJugK/tNhSCUNDocBJg3gICmcovAhaZ0tewTYwRhgf0Q21wwUA+S/UAmSZqfTjJKuggJ4SdjhCDtSE1J3JWPDhsWS4hFO6F4EXm5bXlm5vA2VzxLWhStw3/sZrwsFBFuAEoe88O0wDy3iWEU9BAVKMCPwiIIsj4khkjFAGANRiRL3gZA4f1QAgeD0E+ggPJewT0b8qXp/JOKHz/mB1NyXQ8L0NePQew88go49ZKb/TBL6Lh0HQg9s/vbBOWBpxL9Jt+l99NbdP6L5058luZtxHBTf8wPYOf2IPwL/3hSNNkXHjBkV8fkj197zEHr3kUx49kPfgM2+yOjRd6O3PtgE5McjfiEGij/YhH48HiF2FYqzFPND+tvacf9fJmCK02Z9DPOGgq10AX41gqVkJhB7ElpwTk2EV2RdkdBpkVZcV0KsUfziRoWLSUQE+CQRkhyPEyNODoYkvrTrNUzkmdILj7Bdcc5QWFQV503malYQG9JESRyKaP6QPrxk2V3BMnSNiw54lTk+9OY+XZamctWwIt4wfPZmr9qcpQqW1TsN0dusFadu/fste/B3KkV/WBpQKnMbx47rcGo5i1bDOBqrsmrHB2jmSpnUA0fEO+71lEhbS5XOh5y58SWjJztWVzmz7+xo2/S8BEoKshuqhwcGd+yrGh5UT76vb8+i7p3vMZejp4zghYbSvu52aY4Vchy9ZRoaL2fBlPd9fT/4D1xjU1vastqn1cbRrdk11++/714Ac4ta9MUxBevyljh4hoE873fYTJaCKwa5l7qUSig/Cjl1bOjeEV5PrXKOTun9cHxi5lpbs6t6tQYcnds+M/WMTqJdf8n1M4dMG7oANWmqJ0+q3YX6nrskpwyozvn7I+ufjYoLOPEUiA5czHzp1Y8sdIH/mBMPkM0nGAp6sgiIvPAFiX8PE+PJImDv1YDHNCyte0t978Y7Dj99zY33qF5nq6JlNXJbPDQF/vmo+p5M+htMdYSkx0LFCbDQnS/ROOCY1K2pa0ezVp0k3+XKl+jNkjywFfBw2ljWomMLXL0/U1B72+P/evX5zx/sqW1ataxoSIP/6gsTWp5469UqqVIPa2oYjUpa+co7b79SJVWrWU9WHaNWyypfpl8/TaatzLrCduF2cVIVosZjGiA9OMCjozDSBY/DapBZ7DOeHeOZCH1C8C3Z042+FgKYYX9768ktILnl5FZUROI4EWi7e4QAfR3SCmW+7u45kyQhFrPlW07+H+a+O7CJI/t/Z4tWvRdblmXJsiRXuciSbINl2ZhibMCYZrrppptOgIDoJEBCT4BAuBBSCCnkm94wuUtCChzJQQ4Skji5NO6SXL65Sw5safjNzEq2bLjcfe/7/eMH1u7s7OzszOzMmzdv3vs8UBPZgZ7SKhlhEU8daWFaBBsQNsEGJEg0eKie2rGcgFXNxwGrUVz81q2unL5ORR1yL4a33oOjSUtJeifJYkGHFGis9G2stliq1/kqDQHEuk9Ishj8RkvSJMTdBwz0oCofvOarQsG0ilO+qtVbmjrON23Z0sQWNG2hn1uIc8EH2O6rLC6u9LUbjV/juK87z0sP+CorfXC6wfBMdiV9qOvpLYm+C2k0NWMtQnsKsOP/kpvsCnfDj3ZfBQH4ChwAXwEBsIaedXxpJLT0+PGlTOvS4+B12h25B3H/FCijH+qKP467g6kTj3EQNYKaRDVTc6mF1HK0CtxA3UHtpPZR91FHqAeph6nj1JPUC9TL1GvUaepdAeuYIRahTGwX1C7CP4GuMcTglhHQD3TFOEoXo212P/4JsBM6gqOLjqhiDoDuABJrCmjcIh7YTU6UJ4YB5R0BBphAQGcHfs6LVjgmI2MPABXw+nijRo8fMmkCGhPIB7wm4BY5HZzJIKGdbg3He4FJl0+jXsO43BLax+gcOsBXAOKOTgZMfjFl1p9lkvWnGXtSshq2aIo1cIHGbEpnT+uTmXP65BT9WyD9fTbdZNaCbWq/GtylxXd/b7LxL+uSI26wER6/Gx4HzdrsyFhAn1e98rJCTT8CV71GZ8Nv1bn0k4ANaazGCLxUAZapK+EIMEgcaeHASLiVRaNkVwi+e+j00UdYIH7Muh9kffYZe/aUiFmmju6+CP+IvmdmdOUW8HX2COD8YQMDjOJLnBjWAn+k9Sj6x5YXrMv8Pc08tnYQR681pLHwPolEj05PisWmdK1er7cnieVgCJuml0jAVC5Nj9KARsCCDBWYLRUn2Q3onz1JJIcHgN2oUMJX2LTIWTAZHlYzFlYi5eC9orfA2NfFNGg9c0bdMVzEVQ+ZCaTwbAjusAA/fJRVodQnRRxYXgUqH/rk1ZNixgdooFacBAoZfPsQKPvuUzG8NvBtWt72eQ58A54GXtV2+OUnuWBLB40awoDaCywHLCyEL4JfPoNfR+6AX4GUP/2pH5gpZdFnzoze18AI8hKC/48x7yjS/TsHA/rWCYp4z6+nvwZNz6+P/H398+z5p0IeaPGEKvOYxvWnwPT2qg2vvbYh4xnwKMYwh3pPH4HerEfj7XZKSjx7Y3kMSzGYcUF8C4fYXnSBFplASzmFCw4jxfmpgIg3Mg/B38L0ZfqzoOl8A5g6vj9cGX1j/vhgC+2HRxfRGjAlUwmvwNCyGczvTz+x+eBcMPA9Q30lN+s2mApPjx51Hkw6e2flmAXR03DlgDFgHV3W0RtMpfVLx81YDoPwY6W+qHK46SyonXfvhidjtEFMsf8gur+YkusELz9khyQH6PyIzfZ7bVi5k4nHM3ihixgZwTkdT7xDmfwmftrB9avPnP5iz54vTp8Jr+IOtgH66oEDVwEN/3vtuUOrHnujbd++tjceWzXztqfGvHPixE+BP+y599Onjixc9f6S94+deIdd3iEuHbtnz9hS9tqaWbM6HiqtZKKDt28fHGFych1z5qQzW9l7DlZFhnmLps/mBD76GJqbx3baW4z7n8uhb7ruAlhNQFohtMUKuCtW/Xi9lRzgl1b9NBxGB3jl1mFuy3cPdWQ89N3qmdLfLJg+OA9kv7o3slu5+cQx+hOD1WqIOnBCWoeP0e/xETyOj3AYCc8i4X3o+NBD33330OI3itLdC37T5/k/747srSqxf0xhbUnqRlAk2M4IftoMxFObnfhqy6MKKR9VSpVTlVRfqgbR5aGIMo+mxiPqPIOaTc2nFlHLqJWIQm9EFHo7otF7qf3UMeoiGhFY9OMkR5/dgK3XTD1/AROf+MMuiRJ/AOOC/coP3/caAv/krgnrsxj4W/yccQ6LgN9Yab+gjubo1KcDIpeA9W80eQMeERZei6jItaiYu6/9DL2XPtp+Zqgz/q9CNVOVhn5Wcm5WDZmpmrkc/W6LnSOVC4F+ETAsAvqF5C8W7njBueiBnvE/Dl7UmbEzumXtCy+sXff88/Cyu3d1b3fLJDOT1mdiaqDEEagfEsjKNKTXqBA3niGxKs1GeWrAZxdR7TvgE6ChkjkcmQw/4jLffht+uGjRnoS/u9Pz7cp0Tzr+Keye9HSPPX+CJ92Df+Pz0z3s+xk9/sETQxZ1j1k0JKNbnujP8fw6obTg9owsCQd0hkJvRbbUmJvmyeeBTG9IEhlNZUDFyBgRLTXlxf0LLELjbzvBe8jusYa9lXFezI0sZjQm3t92+HAbAw+33X9/G2iryLt2Ka+iIg88mRuifwrlgifzKsAWfO8wTtiy4DBb0v5KbkVFLleNj7/5DTrG+NBMRL8uo/MYRL24ONwR37U/TwTNGB+QFbxEUIkQSTHNAZ+wyRFXZRce8HP7ALvng48OjziwYmHzjIXL7x124Lfn7596aQRns4iVht7T4M9rNn6+GaScW37x8M6Nm46Nmb5x7UTrDI0+TfPH+8tmlxeJVYbkXk9NOAXZUubF997Ydej9wLjlGzYuHxd4fv+hl2rL2VSdQZnka5yz+MNNZ4F61NaHH9k6auW0iWGnVa8drL//vDPXaVDpUvrUdLzmTFXFeFnsfxzbEuRgjCiiwkB8UqYCoirWCxCQEYxFEseyZ2NnHfGwQPwKoI8QJ3VBEGDiMhUri5fhLHbQi6UWxIcvCUS/FnTIBVXyd23JHd8Bnkti7sVJIpTZZXTSJ98TxCbqZJWM5QF70uxiuueCA9FExXKmFVJJTmYFn5okVRdgjD6z0lvNMgEUVGjTjE7e1YVrj+st6OMPE3qbKq5GTzygmYCxKAD+0zpzlKtYtxu9djdiMnWAwtDYVHT3f1xr3S7gxDfgx7t0KOcblA7nl/4/r7vgR0Pg37E3TjmxNUO3dBLG7tbZJbTdaWcIQ+8UtsyJZw+MU2AvukDPhxfAVTA+2u+O92A7bGOiKObVyOv08ffgD/R8MAa2wXYwGoSVtDoS0pZpIyE1rQRhrZ0N2xkqOoPeH4kwLPG3EfmG3k8CIDwdUtp8TYTS61lKk6+lKWzHiSrJf4/mohrqHsTpUxwWy/NuAkX964eAYBz7Tw/OxEQaBm+ba7zYzagBQ4BiHw2Mpiv1v3olMDg5H55meB36yOExw4Zp/dphw1D4nx5wol+7P6w9LyFV6AON3noyLGwDhU9a9ZoPdIk5/errQAhgEx+I+ouQoe6f/X7l7m34bkODTtcQAk5QZi6XloEcbBwOL5ZJy83wTfixFt1s+NVMWLMAuRkff1zcl0sfailF2XWoJXUqAGJOINNjviAFN44S7IAaa2cxKCAWDKM7xx4TcHsxoRWILcZnMRYRkBZAgFyNvJe3MnSoqQk3RLgJUDQtHdlvEm/hJ/UbKSV6ujL0x8g5hUyjNSkyPDqpQiaXKaQ6T4bCpNXIFJyckZFU4IFdt0X23bZLkuoZ6hvzoZF+/QNN3wxbrnVO7znWXFtGX80Hr/MpHzZUjM5Wg9ZwCJtIhcJ0EUuLdTStE9OsVsLwPGsXm8V6Xs6yyY705OR0RzLLynk9irSzPM9IIkdvu/PO28oX3jFvkvlKKCTXZ5aUZgd3ZDuDQWf2jmB2aUnm0CGf29ccuTu2bxBFtKwOcawt2NpFSWOrChfZKCEiUEeC4NvVaRNupU12L5aEBsheO+7uMaEEYtVNeK8JcbABu+AinYjbM4H/Jhm7OCqvXvfyjN98r5YPGdK/aZ4z5QbVt1MMXleXtPJZYg4WHrxpSm4qTS0a8anVxbGupKhd32+hLmUavvlfi9bvuPudaxcWPWWCbzr0Ws3u/NwNr7zChYH4le4yd/D3Gae21PGyL4/Mf6v/7Pov16W445LxlLx5iNSlFKUaw3lWk9Uyc6EOvdbsOlGRYr4c7dg5P82WhlZ0WPD+Sk9xe8y/ERfm2hCPOwTPhHa9krZ5aAFPw4iVbJQsb2WxJ3QCrEFMGBlBVpWocdKplxebMbjwyrM/w/afz66sWry8vzmX5dLMZU2lmSrAFExed+rCqXWTCxigyixtKjOncWyuuf/yxVUw7DKHBBMn1Hq1PhD21TYRX1cV08rT0sqnVRQO8TvkKCuUoTQlyaRmZWkOq15vzUiTs8okU4oU5YTykzv8Q5ghEDsUCwv7Efjnq60Fjwg+sehOnzUpRHvKjiH8BAxLtx19/xQg+HLRmYwAzXkYmFbEy9CMgHcT7DGMSNoUZLAAnQKFnJRloju1xdroDk4NFhgdXL/XROlGQ7poV4mWds+Ad88XO3R5srW/Ezly07nFcPQM2BZcO78+I6N+/tpgG6QpkYRho49otfQYWptiAMnRaXqzWQ++anGAEzsPfqLR01wWbKCf0JtTDLDg4M4r13JqQhkZoZqca5iHo29QbJiLENsaCugpXuON9+pOQV0n3q7GA2jifZbVZuC9IvRjw/Dy5bYu0BghuO9va+WyrZ9vPA6yn4hQQo/Dez9M6yfwRdSXEpIK6kSs+gmgPbjp610q3S74Z62wm4OfStwHxbaA3X1CEm/IdLqHJhvAJhADwvEKZaPUXKvZRV4A160ee/Diny8eHItOS969D6yGHURYOSNeNHidQ18bCmpLIrj2vneXCKnxQ6vBapJNe7irLp26KCymzeWC7ZzWgJrQ8CtN6HNRROMMURyssmPFVINQEl4ULzQT3HkSNaqA2EBeKwQvw8sndx6rEOk0fQ3i3NbvWnPFqeUanagi+mBXJdjfDYB/eRi38oaER0lwQxLo/8nDwDCg6aQ6RT9r3bpZ+hT1yY4rCVUi/YHMNVXUQLznHFN4j1cDg8f9i/rhLuKnMBFw4vEdrxRLYZv5+NdYfav67f3bOrka2N5deqWRurFJqY1uTvg2qLOgr0O6zKYbh9++dQVRJ9IcfA/kmJRV/aBW2dGU+LXoTtvS2Rg95D+pG/52ATffCTls6CZtj08GgU6kYr+teyNw/7oR0EdeXTxNYpYWSIFk5nxyBxEhG765cdbI2I0xpYfBrsP/YSvhbvD2Yd98KRDnilOki1o2kT4fL9fsCbEbU0pWr76pFbHsh8b6TlyUKqGCVC3VQHZmjLToVqTD/k+ICO4haNY0UmiSdIvUTBFhSFxk4gUaLJPTgCIURvMnYUtEUL72b/sSKAakepAbDXCfPffYY+fOAndkN2JdWhfNOHBgxiIys9LX71i27A469CKuxYvkBvPXg/CHJ9TdSNHNBOkcyNMZFi0y6OAfou+sB3PWr4d74C+lx75oe7hUaHLEkLOqIUNUMAJitKH04bYvjpVivg3cEPG4v/Wj6qkJ1Jxb9TnEPosoXpTh9jABYep0duphdu+cptiAAsWEUTEFgVNvNKFWowJ4twvRRQobFpJObAWibj2trsKYBn96/gN4tM+S87vrxZI7v9i89OPRpP8kpuuV/twuEgkp9oGP0F8k/OkxBijf9X2yGTUk04oaEEXAn1AE25TY1yb+EH4ORsypH50SzTj66bLNf96rEsZgKDHVwImSRSgOHtG7ktsfJodHIqZU6wegwrl8F7we4REXhGIsaR/A0ygGtaEotq8xELXhOKr5V9oQ9Zl/izARdyNCU5K+R1i9gEuNe19nn1OjLhfu0YQ2+I9nP3tpydabxuzB67ebkoHipbaXdj3xdmxUUmEMFYCqs2TagQPTlrzIlAqdj1x2H6eo7Z6BkZT0VYNVNw9WzYsg/YGXgSo1fdUkMhq/iXVDMB93v9KHQevDpZHOrgdDD5d20x3qRZDjE+dMvlNZku8+ewa6NCb/6Tx6cZtE4kFEaNvg7vPp4BNC/ImLvz6vfrhNakYJJduHdJ9fB58Q4k9c/CfzLH2DJfNsKfHnaKQMepol27paf8DX9ZF5AdRJqEa8nl3dgo7Vhw5fBu4n4IfHN36+VYYpC9n8PDJOKMQ7aC34jlCfccKN6121YVYlwRc/eRj+eZdOtevrTQeB9gm18NmOjROeeVune1vIaNwxcqMj3H0eQis6PsyujteFoKALpU4glyIK6/EJ3JbR5PXFN0HtcTCq+Lfh5+p08CNJiiRPKn0RfhSj8f+kjMD1olSahxJ3hLqqRM9FFYYfCTdeFKggmoeeANmd7SNEvii8JfL9TfMq+TZYPiTwkJ1AcBReESCWt5MNwOwiKQl6QezjR/mE1iUMYvQ+ohM+Fc9UsV4SfbfHOxGBDbMYTxiDt8eYUaqzO2MtLwpe7+QjN3f1VnQCCXMm7euKRycqAYctI8HXpsYbwIqv3gBRJcQAw15NJ3DcY46iIge87S3rV/nVKyoWbTl65kzUjuO4cJGj/bijiB727Z6SEvB7yZFdj30bfRzdGOkoomLv4jB9q8M7YXhdwBqJ09F0l1spwsZR6KXaQJfYXdAFZ4nQlACbC7u2HqZ2w4k3ZxwG6uOuhqUnZlRvSpVmyKzG7CKnUqLKGcPbmuvLqxvHhAITKgpTFB8/dQb+PTk12WqkVd4hOUbmsTmn7mou3giPNL1wfO2gUIl7d86UnIaaIk56KG3cV2CMtbJ52K6hwar2YMWwopHNS2bmP34aRt/KbSjIkVjGMKqG2XPjcukVqO02ofVEECOWUAIyCdE9J+vsgOCOzEi0EQGpEMEZQhFMIs4tHzBq4zBkGO9OR5SPmPfMj3K0Rj0vv3Tj5B11AwDTP8kiSuJ1KrG4qC+XXl0yUS5Vtay5+sjUqY9chei0fMhPhxFZB6Z3li9/B17d/9vjcOKWOcvfoYsaJZzUnuP2BfN2tcweJR7bx8goDPotvKFGyotrQr4CHg6JZYJOa949dnVQMzcdZwLPwavvLJ+wCex9+g/7Uc7Er0sMf0zAC9IRGbEbtQJasQTsPrsG/TpNlRLC2k6cEeKPhvywii+FfyJbSX1JSX17UsKF8HfvdQrrUuNfmIDS3EtusLZ4iBZSRm1YYEhTXcfOfUeCxZ2DLWcom0uNcQVBjIVN0CKJzwP2uPYIcXBuiAuTOG98BYM1UrFnvInw9c8xOj8dAk0KnU4Bj+gUrQodPIIvQBO5iNrqigFVPQOLhniDzd9vWrlOP+Sep+8ZotdtGPFZcR0djgH8w/tvflrIN9paXPdD0Z23+aYtmTqxT6amHP3TNNUVx3Wi+X+Q+nmpkQn1wz1RBQS0DAEL0FdcQYYYRlslMh18xP2V4wncQmJFjTZSTcJ8ddXz2esSyRaJQim5fl2iVKAgDvSIiRqedTqHGUzdKnwADDyg11lSLWZnZ32jn/3zTLpinnX6fc5hTFflV6zQiFI8dr8zQS9WS5kJ/SKskqCnH/uE8a5n79SkAZQIze83qHZEyIkQiA7tu7Bv3wVu5Of3R0PoEiOhhQAm8wTrDBrx3X2h+z9H4XAXli6mY0ai5cJ4DXbebrBLcF93231ehqi86NCs1toKfwiAGjgNHkT/p4GaAPyhtRVQoA9YAfpAas4lEQVDreHWSCuDT6A1iqqFpqs4fRHeg+caB6bPLKbPiKchn6pCcKud4dXGPYuierOY7+945qJabexoM6rVF5/pQHzZj8SJE8oZ0fqXN0bC617g3lFlZqre4V5Yx4Q3vtzeSnw2gfMY3qkTby7h3TmCNOLW76cT3k/9y7J8IfgsDUXbGCi4NA1hK5RbFktw9Qpex8WKJl7E92ruRHRoKfG/YiGYNxoyQcTceWMhidEkobEPebcTz9USIETSI5KTNGqYb0jV65RWcIMJ0cbon9nZlgIT7E8nR2/kwhWgWuNQyulUlh3bMTvZIb4qzTexi/UW1Q2KmRE5DKR0v44vktMUV5ivmMip/vQKWmURwZ/obvjqqp746nZNT0z1dqoHkjp7XNB+S6KG3xCJH+RuxOyU86lqahAVASKgBSnAieh8b9AfDAUTwBywDPwXeB1cBlcBpBXo82GkNBfBSTNyWNqNPTG7XaIACROnZiIhDVZA8BuBN52Pgeu4Y9uZxS601OKDtBUAI+KdjUKOrJM4qcbY7XhxETsWC+tbky827eG9UMTG4akuCLD4x10c8MSeQ6s+vZUxYYAlF08wljysOwPDLAW8QQZbd5kEkSrgDVgLFZUYJ/IGgZXcISioDj3vF95pwKh9qIAmP9DjI64ZXiQJXhTRMindbTQVodpzRNHCRXxnmVDDFGK7MvxEAHEePpGJtJMVy24DLirmP8FXzLh4n8goxLs49HP7RA7BjYlTRDxco/QiHhWANfkzUHMUB0E5MJA3E8xAt1LsELmVDEbDcQsxeMFvZPwYWdClBCbh8xCFXfwUYhKMBG7KgcpkYomLehF5xmEocuJq8X6fAJeHfUCirDi/gA2rF4oJPhW7tMk+GjSkoEoV8y5dsg/Qw1KMxlLFqPS8gZsLMvPbFypGCkEP/TbIcqSk+13FFq5lSH1LS9uUv61KmX/70qH0T2IdD8aG/QWNxujQ6O9MowpHvgxoTicWJStTeInMkmpVmCwOs1Yv432NMolENZhOd1k4hUfJ0NIsqUplqgbBBRabQaweaCpjGJrluZTCgqLMFfnl03feoc8utgfl9DDgm9x7RAbgeJamAVNmqtGiicMyv3f/JKVGli0BrDpXwVlc6fQQpUQsb/RJeaDXmh0Wk9JuTpFJxRaFCf4sabCyKRa9bbAjWdHHquCYEq9qoFWZLTMY1dbrr1kbJHadJSUztVqR7HCqvAFW8pKyly4jz2NOZi6LNQyj0GTmgiTY9u1DD337kH/mLMBLU9emSVgO/iRmWPoCzYpEsvRN8F51VqlKyzBSru/rjHMDMD10AhgO2hlAa6pU5hJvGsfyUlok4eVitVjHzipl5Va1RcT8VxLtz8+VizWSslQwlNFUu7Nua+Qc6/zekQoT+9s3Jh+bJDLRaRJ5rlQHaEY3gtbT0+ATdfVicWXo/HkA2CNsklIHGJUqWylJo9Xy9/7rTbqJa1ye7eqrYaQjvf51W9VOXpKsM1ZxrNeQEG5MqZQoHHbPXI4bkZ4QZqtU4rwUR1GOSTdw5sw9Mz+am9end40oc277FVmaSVOyoB9N52cnJ2cV0MzBYUZtmkwqMaamSqRKvTJVLLegT6aqoaV9fa6coF3jlCZrOS3DAg7IRJmMiKXtaRktJat9alMqMKuTlIyS9lhYrafMV6MQqxRiJbMa/mP4nVIdo0xSKZWWJE3x6tIWh81OS+ksTo7y4RiUY5LYpbFVZGb5+knowiQV6kQWucSi1iokUovVIGaeTE22TXWuTNWxS7M3lilsSmVomlolBYtWMdWbCqfaklO1rC515dY0ZdnGbJFKPbVSU7lqPovacvRsxu3artPyYv363jS9/tjiJceOLVkMXagjpixFg0rGDOjzEtvYiJpdP7yBU9Fnei1LFou06j2p9DqTYvubgcLX9ysMNINBfGgejMlGQ1KsKOTEIg67tgQSvUYnY2igKa2QiD0KRWoGapboBqW6/1KZ3Dfb76un6d5XKkoWlBdvmcRKgIjW6kwyhWxYn/SzBsPuQoeRYQyW3mGQ769y2cGgOtR/kvRalmPFr03otc0/2yeXLeunVhai4tcLPEMfCeBeJZx5L+LPu5uWArCidvUWWVlMkvgg50GnDA/P/b1py6RJW6KLJm1patoSHVM6e/Mdvz0L3KD00tY/3DMpj8nuP2fVoBenpU4c39TPJR9yAJ58BF658uq6RdXV9vwc/NAk8ugkrrD36FpvpknJSU22/JIBQ6fNqTw0xrt44vSh9b29aWqGVluLvQN7DQ8MjescxPxypRFU0FpqBvbmQnX3VIQRHbvBNOuKECuC+HY0z3tZsljkO8UJWPmGtrHauM2zziDo3Akg14jrj1+5bKKeWIhsFnwCvvfZhg2fgWLQAIpxKDr3ZqTnhWq1Ta0GK2fVOlLJEj/VMVSwbI6bSn9Aote/tJ6cz8Er55gmlzkSjgOqc60bPoPv9Xjb726BCx0drIb4XW3qUK3PUaZZiOUFCzVlDh9T28MwG/4giNPGr18/XgjtOncuchdNUBEJVG/cnkwi4MqbCF+H12JejaNHU/gIN2XoqVpVZOTD18M8WotpldeIEjxPbORrfROqrrVWTZhQxYeqJvhqWQrzstFWEBYE+hHB9v0IDPtqj+BkDEl8pJbqUaaUzjLF5BE9imBIBjcVFbH1HEUT+6DEUvQoIioORbfW+noUIdrUvYzA9n9RHgYtbf9/Kg+NONL/s/LQneUxoVFL/U9KIv71UjD/1vuxLIljVyK6YSEonui1urirTOLRxBXz/G5i5xL3H+veluqTTiYXyE7BMzqzXJ6ZKZenaMH3VncmzEDRteg2+B26x2myubZsDacT8KsZLOvDPgpsBoxYpdHb0dHmFtkdPq/Np0FHTTEJm/zoDhOCreEwCIVC8MeWFvhjKARC4TBsRWd1SwtQh7hwG2wKR9vawrt2hdtoWxgcIUGhOeN2DXFvDzkE9aIXkZxiXBiiiKTBIxWdfXbOQJww+zQ+h8GJCkI0WlEpiT/dmME6PhP7dYMYjVgY7qAgdm4b5iiAsXqxSEWEfh3CGaLYCErFhLFz1CjqwTdQeuwLWHiKpUDcP247FvqjCMHnAw5FKdKDwjTuRfgBSsDOQRVDdUrrlBF5Yz4sRnWvVfe6aRzxGoLEWjoMXqe9q6rYe7Ad/VA/89ljWaHVuE9C6oprgv6EojNYdIQ1nlCto1S4HUVy6NeBbqAqCH4pcET8EYbAGAvP4h9NzjDmHJgcO2JNQZPtj6hwB7Vb7J24AbrWghqM7wk0iaMDXYhMdtxreZaKNGEAFC6UWUJcFIPbVUUvFDUAG2wSYksyI00lAxpQpIpKtLUREb/KFHYCVwH8zrj0A9Nu7HCxm6XQ8mup8hfl8Cdg60AduwScybS8YGnKjFDxVwPqmhSlOMSgDgFsmSXMEXSvCSXKjBUC91NRAn5WEvqmldRwaiqxuuwEJPR3ho1eI0ecpaAxacDgEDanD+N9F5P1InZ35SKWzAFiuuYTPG5jP6Qa+82mTvz9aSaxdP9+qdiksJoY+datjAyYOmZ+Wddnzm2+LVnZYAD9zpRpc1asmDNtSkGzxbLm+cm5uZOfXzONqRlZVRpqqELsJCwFfxk4sTtEUXGxk6O30dyTReksWAvYNlAM3yur6dWiUgNgX1DMiye/NFnMe1vkKpoWZdY3LW6qzxSxd/n7coy4jydQxaB1dw3j74Y/xHW2E8Y6MFMeKoh7gBLxHxmokho/RTyfeYjrThsLiCE3sVDVsqi2Qfomq6kxszZsoCdvmDULjD0Ef7p/2eVD4w+hbxwEStoy/4W/rYd/eApefvIJkP0EyFv78wvzQWNiLYGbfjbr1T+/iv6yogOzwPvwdfgTyuHysvuB8tAhWLf154eaHoAfvvQY/Pj4tEe/Y0TdcbCYbrwa4i25HrT9Jvxog6PLgM1IcPu6sKnCOkVHK5ZusiGFLjyhqoOQehZNB2jsxO8dORKPbMLJYtHsoK7EE0DwyJH4nXAsLubvVYxpN9Zl9VHl1AhqLpbFYCkdxpHXdMp/O6W+aPndeUFQxuNJ2LhMS9hxIYqF/iKTleV6RohaEe2krmMKSoFnlRWZNOHC2snsRjdlViihgcxgfzFMXjXZAP5Ctg8rqvLzq/LZHePv2r1h913j+y2c2sxq67Rs89SF/TqoW8WyIex9IRpiwijL9p+74Ik4GXopCZX2719KAup8nH1kUs3iKru9anGNbNv7z73E2+38S8+9v012y9hEGWceNQj1WjXNG7VxlYcuF1xqbcBFaxI28cltEGR8djSmTVZscadkDHbUtd0elIQLXzxy5KLQJqTITZ3XnGBPeeegHYv6Rah+i3YM0plMOnzFxq+4MOyA82fNgvNhRwI6Ewd2ohGxE3AJKE29U9c8/dOGDT89vSaVt2fa+e6XibLVPDIf/c9qmAPsepMdm07Tbgeq37+sVluEkjA/SKoXbKv7um7bgup/vyZVwfL2Puv+enJNWtqak39d110ujMve6z8rO4N6uwONg3+n6COYkSNK/c/P+HrG8/5/v+Tnnn46otz+dnb229u796f+/7v+JOLtrv+sM90xm35l9h3/u47k3bnTK3ShhO+gokqxRzuuB0kJBMUBj9htV4p5q9ik63GXa+sq+WTGnF5WWF88OjcnJ3d0cX1hWbqZYSO3ip3c9VRIqwzjMzqEAs0jG0O1eZVWi8VamVcbahzZHLhVHNaViT+UoDtBoVl8FvouZLc35lJd4xYCqNQmvE9EaDwqekDnjwGOCWndiUF3EfEFTg7oQQLSJUwKQKh2kUkw42PQ4sgWKvBUkYMD+N0uM42WxdI5UhJb5FZK0KmyiBMPryyt6tWcnmKbuk0xV9RSHw0PnwPfq9s+RcaJtk4s9gxgw7W+8PiCPlUeOMx6Ap/b8h3wkrsCL3uTszLAMxlZv+Bo2+2ZlWK6yhNe4R3EgXBRur+Qv3vqL95SWJeUX9+yZDjIrJneNmU7mLjO0Ldrr6cJfeNCCgNy4WZxCLYgySAOwghIy6Bm8cWsRBwJ58628OMlEs8ILJkbxKz+hG0KP3N4XJWtalzVAVfIV4tVcUP0U+l+vo6rEuJtz2xZlKYzTdk+8x5xnfL2odH63nMzYNi7b9bgou1TTLo0LlzlibbQamweGv3xBnXWW+vLSYeUNzcd7LWlgJ+I3eiP8QT0Ds/r/cvZ7VM0om0zoTIzB84Z0hzIp6nqkbP2pYOnp2xny+P7QIIOsAvNogOpydiPMYfXV4KYJWAXVMY7kaa5mLoSz4kYzH8K8EV4Q4Z0GZ4jGL04KggYZxyWmjPEMEcCeHuSIXcFG38+5ruiHHiJaSQW9HBs4cmjFaZgDQc7Zu3bN2tB7sCx+2Z58ujFaADvmzMSPj7u7oNHrRlVHrMeNBRWgBAOwU8t2hy1uqJIrwVN1oxvo0uTjL7aPCetjJIVKW266pk/p6EGDMvxoyXoe1sycLuXFvf1uOA74e2FPs66pK9Luu/CPo1lff2sfZq/7psVndq41TDCRL/Vf6AyYPdUSQ9I64tuUCiwQSE2G5zGopDkiDLAaK6Ja32ZVcozodpZtbPerMiZHqF0I2R9c+n7fLWr7YXwkifYz3P+fL9c8VBf9gDN9s6+R9aDGQQfD/Uk0OnErxw4O5kV/BHcQhhoilHXIiwXxpjF4IYGeww1yWsnWhWxVQEe1rjfmjiMzhwTfq0pn5dB917aUg/D9S3wi+in9S2PLgMPZkcbpu4WV7bUi1rHR3/rDkUqzS5GrZF605hQpBWFxQPy6PDYzBIuJC1Kg32rJqCxXKhWgPKkVKxUbnaJqJLCyN/uPwMPYY8vJ+9uqbctezS8ecqQGbb6luutYMqhNYyi2GW2OTz6NJfNZc5V5paVZKpUranOCVU2s4s/rPCkvEEEWAImHubtiqjFmGahNT8aTeTgj0G8pYAY1Bs2qGVikCTYZMnBYO10BxMHk9IlBFGD6XAzFQWAYKjHc75iMwjEwU4Yhw4HwbuDbtNNU3CL+VXjNetHDVunHzZDv27Y6I3Kccv5ldKAsSC9MHnmvtIiyFWPKHSVSx5cs1NS7ioIMRvMUyRBV34Vs5hnxVPFxXb6uex00FFSW4yG6tnQAIYN5bvLJYvN+5iKG9TEWrCz1JtnBJ+kWMdvkY6YM2MofBCcGDpj0SjpneOTHJDic9RWmWzPzGCLC27wisIFruhIeoyroCpfpYh+Au51eqs8SjlMtyy2wvm2LDNYmdOnuMb89Z9YIAeZCq0sv7rABa10i1JZUB3b88Xt6iUIJFMIEtetKV254GTc4UuYB4QAGrVuQu68ZCbomghuJny6mJcp/MOyu3uyqooHCsTvnNHBjUsqqS8RpoiBfjRZDPTP3muUThmYX7ygf0rqhHWWcermqmiRQAj3zuzfa9+fbcCG/zg0H0AKht/x1xUTIphiAC1Nky9n9S7JLMfzQGhMYEitr4kuCwwJH5x9he5rGMVvnnB58Vy4IzRUIIMz73HQjln72mN2aMIvYV/cSbzYTqLWEU8riVX0aZiYClMaELBWMaCvkU8XqQgUIelEpnQlE0OwFKYO1K9QFzRg/fhAfPoQuiaItThDUF/cwrraTxZWKoCXXpy4d/520wjD1sbo1Fn7/qrZN6t+vUWDCFWKoe+Sl+wB5cD+gaJ6RJuqnjQ6DWaxYoO0yoOij0hCHZXia9NzKt5EVKk2dEZZlemrZS25fWUjdNs1A7J9Q8W5/c6f9/QLeuClQvvqWh9zm6ni6MkJ4+DjI+fsQ7wSvTjPM2vf2IG5CzAhhh1cTSDDevRgRSFo0Js9VZvV6hytBX6KwxlW0KTVF1WAGcak6NK+8z1XaROmu9EwrXTm1bb/xZ8DhtU0jIXvuDx9i0vxrJexBb7nq+3EgeGfYSkqmfCPhltr7hQZOZ2RJ7FuGcb1Skcn4tjH7fLpBOBQHdmU1gmYMKN1CvihVrFZoYN/VOi0SiZZoWOVg4BEqtgk1wLPq2LDcr3klTyglW9WSCWD0fkuveSKVMoo2E8k+u0KLdO2RKGNXCAP52oVS5RanTRSoZBJNXK6Do7S6cBj0aflGqlUyZyWa3TRa0kpvENCi3WauA6DsKaWUNlUmWCH4BbcOPhNsbq4mS5vswIgmTAPGukemyRUwgYJ3jBhtb3tw1c+UDWg+KxYItbdqxe/flCrFPSgXeHgiMkjakR58AL88Y0lS94AapAL1CT00S12IZjKRrsWfjPwMtyqUao1YC58AOeDYXCS0u6bPm53hpTxL3kD/tgjP1jbIyMUSqx3HqI1xNMVKAr487GRH5qguE54ozTsiqkCcYceVuAV7P9espuapsf+ET1+f7NSlifSqmUsq9KnWJ26uslNA5191WqZSi32KVSMOtfXkLfnd68zcpRUmifW/Iuku9943X1zY0YfvHnzCOQ3a7UNCpZWMKxcpZTzUwfVTbEolTJAywfrdaw6LVl/eseuUziVkvlXqdjCWzQ7MNziG+JxFLrRxrdyNqJTQklYE++WgICEcQdMEsCj/3QbJnTRJvrII00DoA20nYaf0UfoI9EmdA3aoO00sDfBMN2GhZz4BkmGo9Nwolgy/NjnTSBMdZMb4Xe6EelEbzLxEmAKuCVcwB2QADffs+vSZ4EKXm1sbYJXgSlz1BpYxuSCN2EZ/G9gQrHABK9mjmLqblHJ57AxSuMplAQ/GEaPVIE30aP/jbI7hbJDDzaC67folFhWfUVCcRmonDrKEvOy2ZcahnpouLtXgPiuKhdTL/MTJ8LEVwpJhal+RizkFdTslYAAsAEMzVVkpQ3FQTquyauzK4l6OpYGYo0OtDQn8MW0j6jN2Inzc3prwOUOBNyuALsuMDgQGBxxLziyAP2xaxfUD1m44Eik79FFi48++PVRdt3RxYuOoovIZ/C/T91+YdWqC7efYh6D8AN4Gi65sH/sqL3n6KHwJ7gOu1QAq1mwJjcomXcAXju48dv6/AbZCFv91Y0H4bUD8yTBXDB3L7jvizZwJ50ivD5A47f7J+B3LlgASBlayYuPAvT7+ijMBKuBatXF9ourWNn8eWMPXFiy6P17J0R5HI0+A3oty3rXeO956T54bX/LlJKVxtucUxbsB+L7XroHxU9d0IL6zPQbFHuA0EUd1hcmYI3oYNB3KecAK8AeyXlTTPkdrT5jyuUBrHXkYQQ9JCuLaClWLLICpjfcAn8BUrAcSOG+F9avf2E9yFWwisw896IzNUBmtcrTRqb1OQN/ThuJgmlANuDdhe68TJREmlEQsnP6qgEtpWMfcrrsoYIMegmQvvwKyumXV14GB9ePH7d+/bjx0YdT8jKy7Mk1hgEkF4XVWn0G/t2KAiNxfoaaZHtWRl6K3qrUmlmlw2z0JiebtUprAn4YT/mpINFWje/ae4CIV9LprnwSwppHJqwkhJ1koRkVXaKjvzifxvwvrXbZRGqj7Sbx8f3jN4wfvwF4pRm90qSuVeuWpqSk9cqQGjP7DLvbe1eh0SgxlhtPLRyEjhKj8VTx9uF9Mvu/Bv/+2mtATq9IhDplIM5pfPQXfRKXLE7KzNBqk7kkfV6vXJ+y+K6CWAaL6oQsXytW+nJ7AS2Qv4ZzA992xzcVZBAvoHprBb91eJFDNKEROYg5L+/kyCWgkxUVpVaO2fIVPP3kU/D011vGhejT+Q6wx9m3EK39X4WvOjyFfTPAXjsXHlsZvf4UbP168+avQegpmg+N67hkxwCLhX3t8B3gt/ct9KbDVfaYjvq9iAbMwH2OA9jUxuVzURgQutjlsxuUtMlImbCSOo16m48zCApcRL3OX+wrQqsOFMUzRq0JeGiUAH8miuc+hJeT4c+VwNcAj400jF2cC+j+7qHFajO4PS/tI6Puw1TXURr07mOwz7HNq0iqnghCF3frggvtFxVf8eBFZf9eZvAeAFuD0Z/sM+jnC6M3NgIATjP6d4oWjeRc4iLaUuboFdkxtRwczHaDL3196SKQT3s8/f5a/eHeQCHNZ4gAKKSDRbCfPQo1zHVXoRIgqpLLbu8I1SbgaUupJGoh4mp3JVA8vPJUsjwIsk49j7GxUfujWpJVQRrZbsWAOAQyG9Ersl5SYT4/gDEJ0UU+8eyHOd18si4QEfdtVuwPGA3lCjQwBQ2PxBm722zAPGtPNrvSi1C2EyRLNm2dyMCj/PIN2ybQdzYzlmRW0WvgJ+vViCEQAfWAgW89DpJ0CjRI6AWH0/pKZVy1ci5tT2EVyXr9oLYNKlqB0qn6V7z3pFsuc87fn1YilbGlyhFrPoSX4Evw0odr1nwIMkE/kPnhZ7eYYOj1Zhcujn0Y3Vc8d9W6saLoK/y8levH9n77OK1VKaTpLYdsfVCW1aqZtNPKKlIzmdrPN6gYOX7tgD7nHgdGtVykk8tbDlhROq5KMbdEogjVfrpOTuMqKAZ8Q16+JrFA9Np/xkeB2NxqpNIxOg7AO2tOF/pc/gwJMLIBxoVmErXTqKURxXACP+3OwPgkiLAwt//4h2+XR81H4N+98LswmIcWjUMHAOOBry/Ah94S/a6MmXru7q/h38HeRtk0WNJ+8mT7SRFFr9j0g1vy8C7wyP2PwznRmXfvSYXl9utgzRUgC+yDp+An0WEblfT89aBiqegkfgiPKxr3L+5tsptgo9wuGi2smSAWUQTwGGKIzifNm9wiKzYEwlgbShbNg24rwGZBHhwwobKzlM5IKwHLbIZfwb5zyrT97p0hky1UZH+/2L+eT671jhCrZMmcaUyJaqvW4K3P8k6ocZaXStDyyZhl7v3o7QNPHtk7OyVH3Cdv1NQU1c47ACIpLD3igUvw6g0K5F1bD4aDviBnPPxGyWiGLqTzft9bjBg/wA118KYC6at9cgaVpPASr5tmyzJoXqsQMxOHyspz0mqm+8a++4TLNaz/cTBm/iA4G76x5gZ15cSUuCwnhuMfEPw1skTFFWt/ovkpQAw/XJjgYdjZXui7AT1NoBT8Wl8x7Sa+FbXcxWOvH4TfTa8dzbKja6cD/cHXj90Gzz6aqnwS/u7LTbhvPMc8AgrBgwe2NC+9Y+mBt948sGzzstmb7+Es83atGd++PXt7+/g1u+bNWQ7Ee34A1Sefwz0JLItca4WPra4YXgImf/knMLl0WOXt8ERsfaJG3+1HKofyURVUP+Lvxi6sWhHbgkuNCol1LQJap4jRUmh1goHMMAyOkSEkG383QGR+WMEV2MmiFhHFjrUf75nyeBF4uOQreO6Rlx/98qHv8zTj3gL6F/5WAV4EyVYVdePpUPOIgtpp/WYNn7Prtnf7eq+/OWnkontWPO+ZDK7Rl7hLd+/4Iz2qpGDXG+OH3//3jcMWA37Rkd6PguZfhsDv0YQzESwxByZXLT7+HHhq2OR++Y/O39yxauT4YQM+3XSWHnjXa6/F5WxhXvAzgnEBbrmrabhpv9CXuDFN6RTXyY6lSNjNjNoA2YiIkI0I0BS14Q1LUahqArAxJGEE72cyZyOC/kt8vyEc03kRymVE8+KfUblMeOdY58V7aYISNPofe3tWp7mjn+GwTp+bbLUJrq/RqHK67nyjX0mGR8kkaXUs7bWWToQ/FlRXs9+CYnQqePqCGubQ+uxBgZV1tuzydIdBqtWP6J03qNTr0IAL1Vw4NKJk6cbZhyaO1kl+GPtYc3UBl4QfbP+2oPoDMGVa3sB+hXJzVUr1a0ePnhnsygop5DJTfqFt6pPC+lZ5g+JuI/KSftRj1BtoVuUFiBBBFRorkGMl7phZFFnE4SBaIRj5m61XAjHTFZOR0xOI4nSSic9B8jF5NTGLK0GVHUWmgTjsseCLSRNDbxMu0RoSt1bsM+qx5VsMJwaXgTHqO4uKUxPNdjIQUY0W7Dpw9Ni9e+YvCGbL2WIvB7SWoumTwxt23L0xPEkkVckNGdBQVWGwaFRSSbCKk6rUtFZcVaW2ahUivrJSa00Bb3nyhtZ/+NOH9Q05KiApLpI6ewNmysw9u8+/v6vMb1Gp0WrPJWveMaB/8+z+oXkbmp7eVLN921tntvmSaLHUbjSkGTTMXKs1chFkrvLMXXHbh/VD8zxpEpnMrJDws6aF92xcm6JFpE+x7tEH771DJloQDIUqWlp2zRhpEYstgBnTd9X0yf6SkgAqMcvonHQDKbG0vIpT0yolL62sUqdquapKjTVl4NJ5M4fWjxtX39Bs51M0asuUajCM3tI049yu3efVsiKvmGFEd8+Y1q9//YBGOKVPzaanJr65fds2Xzotk0jFnElFP6IyzYOp2cN1nnH1Q2e2gPNivVph5sdmlxRK85MVarY0VIb7TOoNSvS5CGOPBanFWMLm9Bv1aDpwpHuwW2DilNnEOv1OjDaDODTU2RG3r6QdSiabFgBu/EaM2ZeGGRIsLVAyZJueCwhfHg0UJzFAtDIGoCfGCP5yoGREKpVRpQiu3f/Z0mU/PHNsarqYFUkVXOscsBEceA3cK9Po070arcSQr+EMdnOuLgeIlGIJJ8L6v6JZRZ5VcEOK06VU/ClzsE4nU7qWbdmxvjlY0nj78m1Tigzpo0SG3sW9tfCj3DGrT06f+sCkyuRoU7+qmuFWZa/muZW9RaJUnTowtE9hcOyS8VkSlYQD7JLCp0ZmfqCeXTgsSynV5e038hLsQlRwFkvT6gIRLwePplUVZctkbc5Ber3M2GtUpqhg2N1jh28bX5NlkdBrKm0+2uhsCKT0XjqnobCoZvyQ9Ojhkfm5xuTJeSUP0Pr8iZ02P2EyR3mJhtbsBJvQOKpyl21uZ8gZw7T0xTAuuR7Xgn7pr1irx4y1iIvumGNwRAgxsRRONxIdMCWE2XB7mKESkAwSghxVV9ylv9KEyW9T7CjYogsahQnhdi02PaRDPXMiwW7toyJeDrxEg82QOCcUGbG+3b/GAv0XDYraikWTQlRQG0FFiKBVIZZEd1WdSfRPFb5lq6EYcCSeRhv9gKVab6qzEB5864aq694n3IhzIX3C2QVx5iJUudP3UMwO3WTU/5+1wyhsZf7KK4KN+auvClbn8etXXpFEbP9Z09xz6+w6r2Hb/6699GgdlUmVYKxYiQCaFGulmLX+/1UDcSZISc1S2CYU/QoQ6tLR9J81C90bUhIJsAkNgnIj2UbL/oPGAJ08b2qMjgAyNcdPCdIJ0Gp20UkaU/zoMl8nevIiymWObASPK11mKJw6hHh0FOSKrLD2IV5HqKJAp5w8Dn7gJDslnSIjP3htQ5CYfQ4Hj4BceAE2wgs0hSuz65zWon0UtKqiC/Ar6LvZQuE2yAWP1KF753bhZMseFWSaTvSdPyZzlJPo4BARVJe4petjYaSmeLG6qGkMuAGzkQbR+1LpdktmO7E3pUOCVSqVaYm8AgQTVYbgpLW3Zlq2k5Q0alv2j+irb7dgQEiCBOYyhywdV4iOv5lpFQDCUHKcprVVkLeLKa6D6BXjsUwJe8k8ELmdXFxj2h9A3Bfn9HMaTuNE/wE6819ajNpoOCkpem/0XqlSp0GXNLqkm+lmW0cSHepoom1sW7SN+1lvbw/rbfwNSib75RdOprdz+BKQS8WBDunX7C+KDull9pf2KPvL5Q5pomxYg0rli883eKOWtCQqj/0WMfGNcDyscLFpSqHTQBsvRifQxrPfdrvseEQsoimtTiEWQXQSIWa9PaQXo86jQ3O7XgxwoGcMc4OS6toRk84AFOAQzx7fr7HxeJhj+xoThRVie3hUiZ8F7U63iBMRU8xAkA9gJQms6kkLjlPAu91PP8Kpf5837XHYXpwu1zNsEudU2lVmpYrb9fCP4D7wLbiPrk2A9RT+gAc+CC8/pn28RMoApUxl5OxKp7mgoI97TPTuJ4D7scc67XkTyu0hiK49bIPiZ7x3gsZLGsZzQ/w45ssz/GoX0HdWCMupfS6/C7uU4ALEJxV2CmMFt6zZVdgMD71/97pRKUmee1fmlPYtfw9Mef99MBRXuF/tm7C9sJJTJbEMB6S0nOYLDFlJVtmhZ7tEHfSzN9c7vPW7O1reHVjUNHZoxRyXSLz1O6D9Dm59AjWG+Mk+SjGiM6yaVSG2UOwzlXgGZI4Gon3rvj8xbdqJ78l3lLAU9w/UA0WUlFJgKq1BfyAZkDM244XoP01+aMCNBu7oSXiJWRY9CTLZwzhMD4GXcSyRGzbcaBU9zoWIHboIUI50xsXQ2HtrMGb1qhXWNwE/itRyRtHjUvga/K+v7pqc2zhghHbuoKRHPPeNmLjYlGsMVHpnTBMrVpSGloNhHUz7d3ASHAr4I6AKiOomG+7JvFMsWbsVfj7y+m9+M2KrGdwhE3euY0UCLoOUIGvbAaOzow4sotoptvyTT6KbPvkElKOJgQLH6GUgC/4xegc8H+/X8We1VCU1IvY8TzC3A+6AGzva5tBKN4DVlGOgINgGC62hDHYfWnVijR1vwJGOOeniIA18REnPp7GjlVwsHS4Hs01em5Y8e3ZyWq18os/mg/tsyeAJR9WAwo0bmur0UkUNaN0r4mgATrm+EbEsI0+hl/p5jobfm4aZ5Mp+uPhsq33YwuTS0uSFw+xNTUdt+YZArVO56PYBYTFcp5QDvnGkEgCWlXJgfVgkYupTUlJlkd+OREshRi6ixdOMvB7epZTQkpFC3acSGoT3e4ZiL6NYz5BsyNhimzAxiHanLghMHFEtwWPF52RYouAA8OxC5hngRwuM9NjCFK0Z9YLnQVccBlrPU72K5BfhDlgPd16UeYOLh43o/RHIWswkKcEC7YCcYGPjqlHw6WaQ+3HZiGGL2x8YtaqxMVjeyCD2XmqVZR05ciRLZpXKZDn3TGiccI9x1ajG8mAj/XTZxGRP0UF4bf9+ID6Yn588qaxhScW9UlqiUDNDnXkol1HBgTBTck/5EvgNeUkjbJJZZVJpdmZmtlQqTZPlFEkkRdfwy0atIn267w1a9DJqlwIsfQgyeBsKazrYrQzq1BqRHLF+GJQooAS83e9h89EKqi9Qj9j5GgB7vgHz5jd3HAQzH/nDH9+uGQe/hw9sf/VnmvnyDwW91fRKsS04pKHaaNx8/c0D9Ferv3l378g/vPnyjVfmH22wmft44ebAQNpfA5p+9xMYPrn3+gmDVg8qMasA4IasuyfeX4luvYBGn0JRqKfFWArcIbERSSez5JVQE6quIQYHG3FgMxUR4lH+geJsdFMUq5iDdGLCgrigtraqCZ26nS8Tu5UCPL87yZYc7giCP8kA8SYlCKwReUQsHmVPcDhqYhzYPqXICpRAVPDRwJ+37762Y8TOt+atv1r3x3nw/nd+Az+6sHr1BeD6zUWwAIboZxfDWvjDc3EJ73OABcduv9/dtMWWJ5fm/TJ/+Z07ru2a99bOEbfNuf3R1tUX4EeIeqAsPqT7wSNR+FEXrYQ/X4WLjwBiToLayYbq0RbD043hEQTswK0BaYjO0XbA7Y4eGMeMan/2BfZ+/e7od2AclEceBVOZXmDdPZFPFzNjoslNEyMPgSH0msindK9424S5H8l+7u2ooxCP5J0uazrDHLZEIZos6IyuEb8aP/s6z0Ha6NV0+iQ2CHA56Jgq7D4gYmko8lvpbs+gs0EjnOmwukmN/mgqfo6GW460RHF054+T82pgs+fabXkuwyC1pjev7peirdFlFgE1L+cS09LqNnXXX1QNQlhhDbbSP6rVLXQLOpCfiMcGv5tVDpPNZnKoNFKVSv2BSqGSbwSA4UUtsYTRHS1qwccj6auzBAQsgd0qB3ajycoRvj4O8iasJFE/47CXLjtR+BG8PGGpVSAo6gVixAfPwI50JYvVobH7RzEqH2wViyW8OvKQ06PWpJnSbJomxKkTnh+ipWSTrSzXY3FrdSZLbl4SvNd4ZyNW2mm809iclJdrMem0bosnt8w22zA5iCsdnGyYrbGhfDRqj5MdY1PTH4td4laOlWrDZbOdGUFbhropnrlW2aRP8bvq3Fm+0pr04XP2Xdg3Z3h6Takvy13n8qfoS/ujr9K/VJ1hC2Y4Z5eFtXpZd90AHo1iO+FJiPILpcY2QF4S6qHUsnpISTRaAujn18Mhz0TX0Ztvpa0SbBkMFPAfgH0hEgYKMPMWmyeYhlxG38WNuOEyahA1ifggdovi+E14H0uQVRtNmNy7hS1+ogHX5b1D8BFnBSbBDTx+TO12ERFVhrozCoudCBcgmlvt49V8VpJcnmaRmlZ8sHLTF/459cbckKl2Jv4crHHI/P1v39Xx50d/PLM3CIK//QsYa1q8v32SKStJZ5Zr+/fXyosrtJMAtcmUZdKZFdo5c7QKszmoBc/1mmjIy0+yMNJSa/8BK99fses2y2BTKNdYu/fC3vmD7zrz10f3f2l84Uv422+SX77tyR12habC3AzoZnMwQ2G+qxomvZWu0AbND77+2wfMFRqtPAXxFBk3KO4K2Yefh9hIMuvhsSrgMmIPCBw2f8GCNKyemwaIT1LWjbfffXERG8H4cmQDD0ssvohXUytjsoq5K6ufWbPmmdVXFx2077o694WVk/0OucSSN2xWQ26K2GSZ485ctE+b558wvsaiWnzXjKyssZveWrH8zNoxLmuOP1dDi3Tm4gyPRa9qdDqrp2RLXdWrR9XdPr6mIF0npRWj16wZPWbNmlOqJ5cODA3O7jNyeINXqcuv9GY48nu5len5KVYaTG8w5+W6ivLSFXxgzMI7JgzesX5SaXHDrJleT01OqlSqdflH+dU6AIKDnUkuf0Gv1ORSfyjQz1/jTbTDE+zXb9o9cPa4TnTETbdqlTfI2hOgI+h+Fe7pc7uJJiO5SygUC4MbPTxrd/Fygr5NgFjTd1rDU7YgUHvQAh6ojc5EX2mJsobYNZ3f3aYdHAaZ7bt2tcNL6Ah+wGVo7SoUOXA9C97xxK72zqcGdyt6Qrgb/4o9Gt7Ukt1cmIcScwCtv9ZWN7UP06N9/mnrBBJtNf9Va8zrqs//oAl66kc5qXLEa+iIQTOBVweIgSda3IISfOe5yIiFQ4InPNJGQthvM4o+cTA6Xer1cKpOxzhE40deHz6SyUgGFFk04QOVnAHXu4pdiEajI4bjCsO3LEaDwWgBpUz/yHWGT7Inety0/+YGJfiewBQqHr7/889jdnb4ZCAIRb2oGmxnB/AUlQPiOr8xDxho7nIzHsQRETVrZ7zkRmGUdIZ1fqzjwojwpOcHjIPobcY+A9GfxXqxOXGUf0yfSSlVi8QDPB2UZ4B4kQpfg2lmB22js4rx0ZkMjmDHF8UuEI6dm2y0ozgL3XOYuWRnx+rxG6bpto15WNBXf3jMNt20DeNlffMexrBfKCKvL4NbMDrL07u3h96HgpE2OssMjpgdbJYZNiWnh1AYwyw0kebpChtQOIt14IssOp39CE4FLzbOx7fnN8L+4L7cEhwuQf3fjvrlZ2QNNgR7yHIwePPLztiLTEYiXGKINijqFY7OEO4lRI6UECJg20ae8XaGcA7MZyEYYmAJnwRfDIGASiplSzgzfHEon9SmlkqYwRCFPleR0Nv4hFKC/iEcJilB/6F8cpsqljIWwvlIsDjqBgWutSXdoORKZVsSfAFNb2pQEj+jQ1sSEO6BATgOnomf5XJh/TkbzTN7Y/aaGmJxb+I1Jp6RMBoG6woCNP6JtSUapARlk6nZs3fvnvXgPDwHimDBjfEgBFvHUzfo34fmHz/9y+nj80PxAPjTnr3Mtr17IpPAeVCE/p+PHqJujIen4Cn0AGhBY/Wtt1cVFq56G5Si8VoqhIWxmXmDYi51lotyBtyagFuHJQVYcRKd6OGPo382MDX6FfzjHLAYbpsDsuiUBSdOgHknTkT/G94X/ZJ+C16aA5aAJXPgJfqt6JeCXU1M1wvLY7KoQorqlBx1SpBEBM1Ph6VfRH6IpV+YOLOxOxxV11xX1xytIye27nMBqW+toqNNZ0M9UMHayDnaFLvzHk5Xx5DkdTAtDuzXqte2o05u1ms5dHo5Fk3kRsyN/qIo9yKRkqhRSVOxPxjs9kWXBUAhJk/+IoDdPkhAIQ6bmpmkyH1aJT8NnKP3wOeiP74Ji94UF3EF03ilNnIfk0QuxUwwIqGXKnIMoDgiEY2N3kdPNUU3wvcMOYroncw/0JUpQd7Whr4E3nUpxH5RfQ5AbMjdGPCKIExyerxcF9Qn0wXlScHtB54s0Fx65AjTt3nr5utNoPHanrUwk2AbhKeMhtEXVpwr09Xpys6teAFGR0/5ERwCX4NDP9KtbdEL4zJoMLG2qX4SALe3tb58bPqaQ5/ObASgceanh9ZMP/by+8JkEMduiMtPhHWWjspE/IBg821w+HTEE5m960dE/cDNE+OT2BSHVmYc+uuht0czkUiE+Qk+BkZgtdxoE+OWi21w0wcfwE02sVwuZi+J0ZLtRTiL3voJOnwxMtiRGRw5MsheCo6kF4TD1I01ayBGP6CEcORB/MQN6rHH0JgUd2SiPNgJ+/bt03c9NrKbzkoanpVAbMNelAawto7JyuJ9UxxDAw9Hu21yFI/B2QzAAZS0h2bCzSVbz6dnjJa63cFpjb5cCZtbv3jR7tr9ABT5LIPegw11C4b1KvPUutEwOg18V+9ssHJKhQL0aYbfGLc2n9j7En3+dw3vLNZpMtXWtJxpGyYM14iH33l83RJblYhJzzCUoZG/uve6Q/deeRMUbRnQcvKRr47/adnw4Sb4Ikilk5S0bSSVoNuWT3awiId5ygN41uZ0KclespJG9JUoICAKGvBidXJvUSCIoe9pN+bxYyOS7bEW6YlS1HOtwk2V55lhB/wWdpjz5Cnm1+fSKWaLRGpMlihz1WK/JlvjF6tzlZJko1RiMafQc183w+eJgJPeOv9V9OQXsOPV+fNfBRywAu5VWAvPwC/PrVhxDlhACbCQ0JlbrX9GFKeIgkFRSnGeyCM//Ono/obkAimbpd+6fPlWfRYrLUg29B/96WG5R3SUiFMX9HgTDs1ZcQ5+2eOFsOBWamio11cj+v1yrI0HoBgjMYchqx8dgbV3xzQ4UXuibi/yAKKTixEa0eTmpAWlaT0oCpBVBbYtxHqCRm5VNZfLlmeJmNxSxnF3YM8dY8/u3DT9juUPAvHeZ+2NZZztr+ZqK/g2Q67JOQsWZe1pbt4zM/LRrDFbd726p2PX4q29z9K/9MuPXs4uAUyfXPC4eMGaS/fdMW3TznPj7lyYAnJH/cbKVTWmXjTxWviVIb9P0bd68Ggzzqb9tfKti3e173llz9bGuTvPUj19/A4mvuB6+PjFKAG8khY2u0l0kPl/1X0JfBvF2ffO7KX7Wmll3bJOy4dkS7Lk24rtOIkdJ45zx4nj3PcJOUmIIeTghgRSIORqgHC2JdBwFRqgJZQWSLkbWpoE3raUEiiUtpBo883Myo7thNK+7/f+ft+XWDs7s7Ozs7PPzDzPzPM8/zTxa0Fgi4g2S1RWMoFeHTS4obcOIpazP39LL89BFO/HbnnctUUhr8tKYhZHwuMqL56YrAi7EkqDWrFYxfDrP7zq/TPSuU8fmjv3oU8BQ0Jw62CmuL23RBM4HW+vcltMZqee7OM1+asDfoPWFvAUVjvM9Rqug7erjj4GGlFx/YuVnhjESqP2CJ+n2clEPqxDXEs3tpHtXc1BLRDCCGGob3mAQBNdDSINO7B2D+lzSEikBdknpwfw2AejBxMEJo+wH/vyIYB6WKUDiFg1qBz8oGfq1J5OcENNo066ldcxNK9eDw402vTaeLnLRsMX2fF+RmUy87zgMaqZ6JvWKa1ecD/PI2ZKWlLUmZcX4NQxf10B9rW2gd7poZVqM7dS+iWtoGk184vOIZnOzsyQrD/uF63giIaHtEJ7vbRXSh8ttHN2m7bGYYSTwf57PsgLCFoAaY05Tw8RP7rRV5D9B6uhgfa+FScr0tO8zQ5R4xUMSjBdeqRMwUJWHVE9DD4GDIRKBfF9RlMfKinGiUZaNeKey6hWag61Cc9wNJvM2QABoQ9dgsgEIRluDXMA/eYIRHM078fuM5NROpxw055/I8UK/vkQoCfN6U4lOxdnXwCC7j2dIP0urTJJX1kELSxWmsBInZmuPntM+kJnNuuA5mVwB9A7a4sSoUq7AQCgs1eEiiJ1LiN8CqXXXUi39aYfyeWvGJgOoBso75u4UNqwEryS1eDS68boA0b4lc78knTlb1Ef+pvOLM1WBxbNWFNUsmZBp8OhcHVO3VwdWztvst3+H6bL+59sD/sF1UJNRRLK1WhawMD32Kk+AWcMozYJJdPYkQdZgSRo6TBn3c4TZ3lYJLRe0FSrAwIas+SlHUTvVhERqujDheAFIJJi4OUEJFKGckloluDhAjviLBRKpT5g7crzaTkVqwDBIFCwKk7ry+uyBvRKpQLAgH2i14zkisrR9S4PR5eFQmUVjvrLaTrjs5m9E/fZQ0IwiDH/WlstT6ZMgrB8OY7t2nUQR6bMmDEFR5dcfvmSO9Vda5VMiUOhU6tZi+BieqQeDAnJqtU6haOEUa7tUou1GoXJGBufbtTwi05IX5xYtD7cGQDApNDU0odC5UIQvSmGLGx9q1X4McaZWwlqVuKEXdKkXS/jhM4/A+rPnThpCZryfiX9ifhJN+ODoqeP1/UQbKM0VY/mYoynNR3Nx8uoNYjyt1E3U9+j9hE7e7KjEsiFMBcOTv/WfIN2NL8t/l3ht90PoOy5+PskkP/g9/unZb9/cY6vvcTLMlxOAmn5JWKsHGQHxC6ZMxcD3V0XngDlQOq6OG1A5Jxuv3w3/gO3XBw5Kwf0gNilMsp/Od9l3DmO6vMIP5IaRy2grqBuQKxArtVSvUiZgAe9FlTybElb+oylUgRWDXc9Yu1D1huJvNfb9kE5TVbqkJcjvWJQxp3DDKqMvyayYq/uZi5Blvv/QI5jATUFSayPkAj82JoM+D2ukP7UPiyJL9xlTQR8BeGAjJmA8vRiN2RJftCMgs3Tpl6DgtdA4DVwHeHnhHy+6W6LwmBMWp4AQaXFptYUG6a+KvIGQ9LyyX1k0eEueemh5Dw1BVDb5AhVPWtSLOIP1TVE9p3CqzILK2eMLw1HkzPSMooKrlMOGOJ9cgvR9sAuHnG447XXbsasnSgcXoUehCpw7RbC6p3ZjaLo6Tk9XPo8pcjm9CzmUT8i/HzO8p1wuynsgStGrGty4Ip49tER028+LqvE4haNE818NN+FwkEZ6g+jZAopUzrlxqZJfCqHiYfOiMf8IHHMR3OyNjteBU/3fityLvOIdUTNIO3ru5DIJVdD0criQZlRVNuMdcHy1oDKVxqsM9rgZb1n1bkr0gTjSH/d8EQpraWn7ikwOgImi8UUcBgL9kzlDE7pg890+gLjfrVO/PVtxtvXeUbHeU9z7IpbCuoZtrRgXGu0/LJ5ATv9aF8Ou7/EZZPzMIpAun8u0794FNA5gR8/C2ZguS/cWl6Rr/CEfeVX50JIUoHJbzd6jGD22ECrUak0tgbGzobQsZb3g4y1TLsGqHcD42wbXzfKXj10nBE9G9VTVaKKm1o3SEdxDumr3dJns0W/R84BSgN9OQLfUvYAm2OBakI87FS83020o0LePj0pxJwSbAoSIz0RiXa5fsoR9X+5n9J4jwRx8b12dxhvhw6Fsaob48UdRPrtayi45slr5uMuhAmeQJsEwgW+QMK6ayGm4X2n9CGXxx9IWjt3Z184nX1W49Pcr9FwGXT42D6s4arO17U+eDRH7jty5A8+xHA8OCL3k/SMZDRcOn5G5UKyrLkv0lAX8kdik2ZVo96TvQEXi0r1aTgOHbUf24bduaDzdU3/NXwzNYmgLmEID9nPeG6PB2/x51iBMGblMUsAie2+rIXu9+G9DjQ/4h6Vc3pSR3yJ5xTGExd7R6NnahFDiLhCs7oq2dzktDqN4A+jtBZt5zZIl32RV9x1e8uBnTbAiLrWkkKLyy3yeUM9/krbvIkdOyZbOIGl1auXlI4GNKt8coBxXtbRGH85rqYBnJWZ9HBIly9V6q5gFW1QPD3kY85460+m79jLQd/Y5MxYXsxrQ52TF11NHb5JixfuaBcnixquxgSUUD/QTA9xqUHEQ51gz1M2xKdSxF8dkmggBmZBDYStdEwy+mpYvkJakfb7+mDSzZiAcNPQaURshbJKF0HRTHiNZsjLroHcAP6J0bqs4fCCxcbA0Bjj1JhV0JAxCPALvYIT2zOeQ0/qOZVLYe3afLh7277wxFToHpAfjXrzvSXt5UUiy6tUKvDhN0OveHZpMgVWj2TpOQcniB5hPfN6nsujt1ZJ/7i2eOyoGACsRtUGyts6s4d4LaANymkKIXC9p/PRO7oObS/vWdDoBNZwfHgov6B+2uruQiWkwVenF59+4UZBKd0xU/p+gK6s0/I/RTQE0Py3iT1L1VIdiI+hMGoqXkbAUjAqOUdI2GcL9lBSAuSxDbBBcoId51jjsoEcFpB4awzSvYrsHuyvjhOBgBeB9QBbv5NxmqflLUUlkEMhFxdQC+JMqTQisnqv44Pash0F6uFczJv9q7RfGa5MhQAjZSKVENaEwdPZf0TiHFcZVIFT0oFQKcel/JwOHP0NYIBVb37ar7M5LE+fYANnAA3y1F5Pi+MmyAGvib5Xz+hLNemFMLKjPPOBrzAR/MSm8+W35QGV9I3FEvS3mv+6XW/xBUcZn5+jcOcBDayIhCvo6abbCiofjNZIs7xFTIW3oiCYYr01kXASZNhMxF9S06WqDwZKYHcQRLUbrWPyQ69sDMIQ4AALPKNsVrVzJ2BhyWJwSPr7iJb3q52putiDtYW3WYOgIn8M4rq90n5wzN8umPJ80lQwxj/KKNhD0oyf6Vmz4WSkBlTKY6Cbp9iZ6GtNQ/IAYmGCMngBokcOTYV4rZXYmqSwNodIRgQiiyLxHRKX/3YgR8No1sMQXX5snUsTwALBHLQGBBgkbhooTPFibiRFny0YtoLRkJlwb6WFYVS8jjPBJ4FmqfFyjUm1YepsoAKv7zSbO89/DyWpBdWGjNTEV0Xof55RaqsraakiXJQHNqh11zILTxb7oJf/EZ0sA8ZHH5c+bhzeJS11miesdxY4D19pBh1K/nFY+aOp7rDSbDBrRIWVPrvyJa2gyhj+S5A+/ZNnpOem32de0pqVKGENneTzrKyUkobTSObl6RHOgqJsI6Mq5n4O9pSX08Ua6SnV3M5lwAQsyzMPTF34LKwucK6fYHY6zVceNjJ8rx7Z9xiJXYC4/BjBy8WjqaxeSgYBK8fn1HG9WHJKpcWwGeqBL4xhnsJi2BIKu5FghRfdsFqRPPzigVQGVmLsO2/7w5927Nz+xc7uCV6+oe3Qh6dAx0lvQ2XkV/v26Vz5YzcNL9HT6fSILZOWZMe2nRguwMIXF/l99uiy6i5HS553BfjBu/sOHNj37s5/7PDUZZx/v//BTz99cHKbNjCz9aj02mzAem+8/40fdg717f8+fOd09Xnpqda1m4JC1622VHVwnL3YbRhfteC2JbVti3r9Y5G5w05FqCiaT8cRDx5EfYzLuQvAOBkEJdmbogngFS9Wg5QRzxZhkU0SjQMCcojfOMeKDZosGLszUize9afdd19WXsJYa4bc9frrIPn6YajyxCdWWiyq90NMe9VUcFUiMnZoe17LFhdzY1OyKjHKYgQj+k8O4LNRQ23KeGbVwYOrLntAKCq2/EZ65a23QTYvVr/21stmiPT1wHD5kvYnwndH5g6fYBWGDikIGmcPSa4JJVvKCz+/aE7off/RRG8u2duHoMyhY/vF3LSIbX2tskoPJ2N54fUg7JkKEoUfHBDdKjJ1DtzuPS82znXx4Vg4aNYUqBkFawxsHX9spJFlVJoClcWPrvCZreK1UKE3aBI6f6Z4WKRoeFHGr0toDToFvBaAwath14isflJG4PSixiUKNgOcLoz2j5p4r3+0MB3q88wWl0bUc8J1LlaMimyhoHT73ehPYS5gRXB28DoYoPSoHVagdsCtkJJxwGRFJoI7SBxwWXPwYFDWa8rZM8nNJDebTOpYgwLKjiYS8Rx4Od2+9e1Kh1KnMzWYXKn61npNcPNoZ9L5Pq8wW83jxKDNW5eqm5JKTq5N1XnswbyxRptZwb+PsozaEtDUj6xPuvQNZpNO6ci8x/aA66+oWhe7hXcEnN5iIezUOzu252vUnKs5X10R1LKsP1LgcBRE/CyrD1ap85tdnFrjvW4Myhg2F3kcQTt/U+n6qmvXD6KB6f9XaWCwBwOWkukgiuhAXaAhdLBlwkttJk6FF9fMiPEgdHAdVOgM2oTWP0SmgyF+bVKr1yvAdYAa0BkQEegmDcFa0zkiqE+OCiAiCLWFRkKDTSYCtQ4TQQwTgUomAqVQRIu0elBfALJOIuKr8ainY2X2B71ggOX4OlAP8OISS+QnmgsTC2AuCmMgWZ5En9lEoddnrek6BjHVSmro8oZyUaRVCau+eUi7IjZfekj6/dQ3Y6MM+mFPjt0y8mnEcyvVHPeC3ttzeodEbe/Y2l6oAdx1Hx8FS37BCpXlzRVJ3VwYSgybkWzYsKaBo6JTm0cUxjjTp1FXfaiY87yse7j8SoOb5x2t3qDWE6I5US0dcvF5kyFwRn1GAACXBktBDVDqfSUjoo8ybd1X3DKkY01Lfj8/WM2IZ+6iZhPdNjMfRuN7v58vnOZD/X94VR+N7f1+aHjk0+KAXxIG/ET4wOQQMAlEL9soq2eTA1vI/uWkEH7n0eL6PfNqR4/WhUaGdKNaGubtqS47/E5YOPkpy545hTNEa/fOaxyBBvdwSM6xtzb66NtBC8rh3iN9uXfNe3umTt3z3pq9QLtnRHZZdhm8Ff4sW5OtYX+WJfgFsKfEoxs1ogndGDv8blD86HOOO3NaKHj3cNGQvfOHDh+tK/T5C3WjRzTO34dzoIf/heM+PSUUvHM4Vrtvft3oUTpPdD/Q75m258TaNSewx2Y9dGehdBXYBCWw6etfgrvpNNgtzTn3C7rzXI+UAUfpHnC0T8+S2BJFqBTGN+Nz+jBIoOh1phxMAB3HY7NX1MdAQgDG/FQa612G024AxsLH7Nl5S/esm2ZtLbnh2DH69/+Q3FZ/unzk2MV1ByvNZunDj56hJ5z7r6AC3jer3TZnIxsavnfpuez02wV2+Ms30PQNL5/45ova8ctGjinLhy/a706Wp5Lwd9knwBdnH0ibGN34G1yNvseoXl/vOV0+M5VPlVCVaDRcSq2lbqH+eMHaAIlJoZz3QTTTXToy8BxwOTfZaTRUmHq9yllTva5GTWEskHFYCEvLHtXQ0EEUSsjdOSW+3itkREb9kcX29Yy+F/WK2LGHiURCRqx0KExGXzKS0WQSxxIdlLl1ItThgZ24pORFOYEe56vw+SqujtQURFzuyMMFNZGI2xX5QQSFNb0B0IyT3vvhFW/f0mGZf/Vad22F25tGv6Ved4WzTLv86puGG93TU6fdYw/vWDZLKzVnZmbqZ9fDVa3fm9l2S7q0c2755IAxUc60jgfWxpoq6UwnU12UKyCNfrGKKYtXT0slVwz1hie3Hi3NM5UMWdxQLQpWaKZV9jzDxK+3+x3VE8dWshotIpeQYU+BzV+SnsL8qSoWq4p9M26lu6jIvdJdXOz+l2fwlf3H5j10cu2kCT989/vSW3Mq4+Sfx9YFhMdaOeHLCas33bbrd82l8HB89Oh4YvRo6WT3fYubq/ctmb9Q4CqSdnPTiyuXSZ80ZPbYwcqijHx/Y2lTOxA83Xz06MqK+ZXX3n3luKTLRps5fTRkXnYNk6lkedaoFwCXp0Hz8+fusvb+MryNChItgWQ435LoU6C15jgwRGXBRLm/3G/xWxKWxIA9t9s5addvNBvbZ91ww6xpNfMX377/5Mn99/4STF6yZCn6B0yDWAi4Jt9zzcjJN790c/Wc2Vi/4o01S0nG1YO5Azw3BHPjZZig1GFqRYMcb/QbozkngRjBRl4xI5sLiEw5quwH94yQPhx/z2v760f2HOkZWf/cnbNm6V5Mtk1SX2e2hxjq3FOlumR1qfQDdpJteVNnT09n03JbU7EeRkwQ+8rE4/QYgtPBot44gZpK3UZRpngKdQ42yoZlkLh6EIWoPnrgN8axzwCy+Y0xybBdNZmKQ9aE0Y/d0qFM2KQBTWYpNwajJlwNQ8qTJ2t54USHPVghLgD0Td5YdRl1G3Rwc9ix+h3tXm+7l1OqKu1xf1TcOPZseyWoelSsCo5UT23Yu5v1ahw6iwJELls+Kla5zNhSbvZCVX5Rk4e/pnvanoZ5hyZX/trpKNpa/LwNya6GdrNrkToJKFIsUITs0ijH0ub86enCjQ0111yxrFQ6Jd1FFLPu1TW4qgtrMoFVszo6Zh3yZ8pS/oQDsd6z7CHQk8lkOG2LL1OYtN7QxXQPPdz0mloNYMPe7EmApDu1Qvrtspi5opKLm9JWVWFmdB6kHh/Z+GX+uPwEjJ+w0gmPMCkvcL2+oQUVhbXR7aEhY1WljZrySsanDjfFgD1kh/vtIV2TM2l1qisqNMaAvdwzxBAaoHMRJFzEBQYojcRSrGcLragBRRCQtROwiZaO9uFtrHCIk5UYWDcTr6N5qqvhm0xDl1pRZ2luXn/vUnZ6aXtVe3wqt/Te9c3NljqFOvsrwHeoaUVIYVf/cTnbVYaul3WxT+9R21Eare4AvKo9PqqtpW1MaQe98lyUQLK8oVfyaWNV+bR17czw/GDQ18y2r5tWXmVM88rs/T+tVdjUSVToA2NofDV/OL31clRWUm1T1P5UUeMrEcWYt36g3mMZ1Y4lcJDzAaOji7Cil+zJIocI6KarIVaBD6RTomBELxuM4lxkqx21wcUIBBj+vA7fhFsMolZ5IaygVUWHrmTChaNbggAEW0YVh9i1h8KoskGFQ931FttWPDQPgLyhxW0sgGm1/aUpQzuld+j2wmac3FzYTr/7i6pyHY+NBImbD9zAkSvAS1wg2taKy2xtiwaKTp+eFIHLEuiNfVfNoL3euNUaz/cw065yk7ZhlCMOMnUen89Tx7xUrKCzIXr/2IqWP8AGt9/vboD37SuLa/hzGPqVfuQcsaal91eEVoIZrNtflpdX5ncHHj7SgcmFUlOW8xT7ST/7DjvlpnxUCMmicWo1IiNrDFUrzAIrHQZBGoUxNKdy2EYbsHQQpHkrSU6HeaKHkdbDMI9NWWNYo53l/KHycIgO1QPsZFc+poNxKytaBGLobbFiHxtpbMuKXW1gQRbdDFpe8b0HTMCklt6SznxY+hViImt10n5w43Q4D0Jm1Hg+Ww+oJuljZq7+DzB7CqwSpMn0XebT8BYO8gC6HzMLwxTMn3l+Js9I7zNQ8RGThnxtFxgOFV1bYDdUgkdZGtRyZm71lSy7juXG0exrHPsVA/Vm5qcceOcvb0uJE1+9C7a+DYb9Knv6HdD0snSw/bPRQK+kk80c3Psy+PUjZx/78z2fwxUvgKcOnnvm45sWTGfYNVM/6Pkov2wVSz/DsmMPsPSfIQRfMMDIM8EJHJjOsyWzFeANFb0N3MmwUhlP146H3BUtDFOxlKOvpOltDLdyG83CO9n+PJwLjfzjyaop7dcxWPDzyauhiGzpC8yKJeciYSDm1gXnCQPOmEfVntL2BJd2J2LRWMKd5hLtpR71uFqYqR33yJ3v3In+4AaTrrur4WyGIGYcbegiJhvdfUdQWDl7zrASJt+Qp1LlGfKZkmFzZleOmDED7l58xx2LF91xhzT6qM50Et/OEtiNk0TTuyd3zO0nkHdUUkXUZGoBsZ/LaYGgEYvpfR3ER1UDNxuvYy7xLn3OIS56c8tFGG2M/Gql0RExr4Ef3ZA92jBa6SwZU87ycUuJKxKKuEoscfiYoO0mAMq544BW0ArnKUF7lqCKMKg30xvQqy5Cryw96asdMXlkpHHevMbSzoVtScajtirRP6vaAxjU7Qkys3zs3yq4MJa49sFWw0IOJ0ch8yT5aIwbQo2hVmF74SjsowBI3gj2gmXn4FJ6/XEbvyMuTw/lstMAYurWe9Zv5YgyRdoruVJHcWFhYbGjlKtsj5haUpBKjd3yky1bfsL4+qvSW/TZl/UWix5W6C0DVOzRbCLt7++AQyLQLBx6dzC+Z9GsSsapNyuVZr2TqZy1qGc8rMeFb5H+0OeAApgqcMn4ANQXUkfhb9KfJuXv0yVjA17cfluIJIGJBFvikakuHXcD2LufPMgfR/l3xIUBtHUJFwuXwLVhqJaURKVaLm7Y6/+DJkUU9HVGxvru758BQ36jmeXrTF/zvt0z/qIWBs+Q5s129zXkmb7W/aov7VycIQSJqbx/EwvMqxd6QtfAuRhraBSgeYM4IfXJILmER5adSlKGXs+MvSqOX4qb1zQ+9dpTjWs2iwtBC7gStFyb0zaGp276THr8iSMDFAZ/vvtVQ8vYsS2GV3fv+uEP4WEZDfwUSEm3ST/+6yDFwgv1MlABqpjYaogmi/mCmiV2DJlzHmgxW00J0ZuOh3KVha/IJd2IFSR3SI9/hspkltx+Qa3x9obPN4PFmz9/IFdhjsK6lEd+jCp8801/Ba3k9rPDXv3mblnXUvro7m9eBcN6eg7kaj0Qj8UjW9uAAUNeuleBwWKmSK1SBgFvBcAw5w1zZBeReTQ2flpD8cs3nnvwxpeLG6aNj40ec92zx5+9bgySOGRd7KJJG/fsvFW6+tadezZOgp/rSmdueXPzXe+/f9fmN7fMLNVt3Dkf5UY3zd8JhdzLfHPq5rmfATO/aRMv/eWzuTf3+ZtmZX8LNsqP9Xr79SYxPqArYYPaSwA79aFpDugKYyra32uvGBPZvu25bdueAwfOodGVlrmkc4TWMJkfxfSNSHpCz4QJPYtnV7a2Vs4GTxFSPruf7f4GIzmxr36T6R1WcyMChnnvHQuwbkkRVU21Up3UHDyekn1IJL7L29W4ut82nA6OB/vGS/mNLhpe+1Dj8wfv3fbofU2xzJOZWJNPX18MHiyu7yGqMMxy1MVJ/4PoXaWeXuNIQJyu5EykZJOpvlwYTNOk+xrF+YEdvyk1bWI8k4lPnJZKt7WBg0TXRjp5Yezs8+fS79AvESwl7de/q/+rduwj2RwhwG8bU4OD4uwgDdiLx9hLExJux/piaUJxfb/W/O+3Y8/XiOS4o4OHzybUdum+lgTvkFbMXnCM9MUlGvFC2rnDTPdZTJYDh0xIfJSdRv3ITtAZDdDvg0aDCTs5ZIiSM1mZAgkRb4AjQYaTvdli546ySSReOUogXuaPb5z64PjxD1oqRV+qfEQkml+24KFrDjU2gq2rkLgy4sapw9ZMbcifsXiX9OHvtm37ALhuX/fJsTsnHLguNq2qtgF+isSjSukl6UXpZ9IvjEU1zUUuw4zOxXNul7Y42pd2Dgm1dKQdl/8CRB54EBS9cvnwG579+trnpJ8vah7R2jsezFFS7G7KiySGO6mfEhtPojaFXkcgyxC5RXoD0fkP9lm+ku9nvqAm0etVD3VCsqSGsvRXiLCQzX9ZexJvlhLEGKIzQZbY8MIHYzW7WaJZEiJxwBou6A+kU0aCL4TtTWVnmEiC+bnXAjT1s069HV4eErz1M8vWXBGfAG06s5Kt97vOHrOH/C6m0h56t9E2OWxQ84ZQFKUYaX2RtYFWaatElqG9oVR5qNAVNwBg4hxr7igb1lxmczmESLwmUhN2GhQcrVBpjCqrs0DlaBheC9+8TqgaNc5rcFeNVj4RSVYtgKJaUCu8QvOVM7s1cI4ln9ZvBE6wHYwHxsQCh+Con9tx7Bvpj2+Mn0TbDTZxgyscsqMfHLF1VmiMWaXhlIXx8dGRqUJWE9OK9pH6Kr3NYqsEDANL3cG6aLQuOLOuyMyykDaoi55fn163ZPGaZHmk1KDUmF1CItGSKcX+pCyi2mm1jTM3j9y/TTrzX972abUeg37YWPUfQMnm44vWLKEtGqvRrBTyH9gsffRwYf/1hjwy6wupEI+EOBG7qbKKPKgEfBx7gLnICPvencqw99x+l8WQ9zsILGpeLc1AFLL4ZAYuvoQ9wn/BHxeHNNJjaqeNHwoadQpWJV37kTj/3gDcfSmDAq7Pt5OW7CQnCA4qldP9S6WNCaMbWDGKomw4SEjMm0qbiZ/wNDGEtBhFIWd5g38QjyzNVT1VzT1NNei0pukZoHqmR1by6yHnPUfJP2z8XjPbQl9/bpVldk3b1hKawklZqmRr25ZnntnylPQ14J86shkew7Fs5WZwnWxcQwxs/p+oO7w++/9t3cH10v9K3csTlv/1ul9//X+n5v3rriTzslz7vrqjueQ/rzf6+3dqPXrFitH/cY0NfRhMeKUJe6tvpkZRE6guai61lFpNXUltpW6idlF7ZY8XoNdXYBSkZWy5fGPOkUpKtGLsTJhzSc3k7IBSvfHeMCmnBAanD87/Lff33scNCtk7VarsTSq7qkOlKh4uVLTMXbjrPIUZ6YXPDet6raMYXcqXFXWnkEBW5M3el1PelTWCqQGJ/TNKJ/pHchlkC+Qp/Y4sj56D6oGqYVcVd/5p1rBdC88iRh1z9R0tYdeQYpVKOkTum3LRMUmK6PmWqycuSgldlIItW/t89QWpEoKYOpRqozYieftG6nZqD3Uv9Qj1Y+pZ7MEX73j1sXzEUL0vhv6oQdreoVwoDoqHLsFdVoMcHp5IlhXRBMQhuulPNnGR+pZyvq38wem9ca5Hdo5YPyRLDakXtNhxM8yYnCaTs4Mco+S4o9+5fGQ6ZG4dSSa7Fi4eGZ0fEdXqQrVaeokEYkDpDCbKWzG+47mei+5+41+myE8DR48+sOoF/ITVorjUaLUan171wFHwA3zNFO13NF2Uku0TD2DPwl2jBJ13YOWil8f9GHPJBI5edG/Hv0yR/wjPiHUdKVZC42yGGk6tkHW8eCTOElbOC8wYNgGrvuL/2H15APFxhGPDPCRe5kfcH1YXTQXSKSTP95lVmGVfedhbHsCKxYS7JPZgeEspSvZfU25AnzZ68kTpnJjnMYKj0C397T0FRl1gIFDse/6I9PKPN5w+MB2An+3jIU0DBQR6xW2n1yn41T8F9M33gNj7m7OnNz+9efPT4OCiaQrE21h5VVXDqpdWbDmqVTUOUfF5LDQopi+C9DUfXH3LP28FkyYse3fmlCkz31068X5AfS5tmEBrlKUmr15JjwHxJx8HJfer+MWP/HHjk9Lro2mlJU8Z0yg1TNXvQdmhmwH7/HqlasVx6f0gfubm89T6t4dxClWyQKVK7ehY9vQMjf5nW6beX6NSRZJKBddyYuPm09dy/Na/5nyTy3bFApoPCJr7IJRlNEycRd9D3o2Q5WYMP9zdX14BcjkA2y1Sg+U3fsC9J8lyZm5hiO7z70BTGjTWUxFgjEA0esvrsjkUrgvV6asTTWURoWAoeCTv0+gB2f29CwGwW3ZyDlGm8+gKpHC6vJ6I0/EKQVefX3b87tjXLhVMp5IxQA4hnx6EQ2QvEjspzKGgWJHEP3il7ns7VKqPP1apdqBhFYV21aA4vKz/q7/7bdlycUbo36Z0v/rJ6z7/tl/cQbX8GD/ngQfk56BQNSh+TnvxJwYPXDpvX1x6laG6B8qsvWM8oSUMhH0RWx8F8exK6TW2+xI8PJgLk9lfgeOX4td5UjYkuh/YF2uUaqR+Rr2FrUx06LXrAMvJpnHYTs7a10Ryw4R7r4nmIOnmBLUH9XghRbYA+TrgAakw3vDEciDe6UQX0TiC9czSobCPaFdhWRNbn3DoAr6OcS7RcINRcvBGdjoK+TomIRI9GVG+zorWUFjHoAEmZSI6ptiifTD2CKvWF2jUuqRBmqKw8goFb1Xwe/0avzak0cjBOpzEK0QDuN63MxWKMi1tmRAUeYHT0SzNv0hbvT6uYNJQoVCjgQEO0HRRBadaOK5msdPNBxKekgk6Z41BGw8LUa1Wqyop00LIg6DbJvrn+PKnHDEAlV5vKSqMDBeg0mu0VuR5LFqdgi9YyAKnVsu4RY+gh0o/FG2Fgk4rlLz0hGfCakds0fz68N/Rh3wMfbHHyBdrQ1+s7XMmYDQWmIxs4C2FQiHiVxI7/FptSOvT+jWasMa/GqcrFAZxSqYo5GybOcHsDkALZ1FZ9KI5TzKZXTqzaljaoFUDUFJijqhUeR3xcVtUfKIsMbslpWcyFYtXWtRCnh2AuBPd5GJo5/Try3WiYUks6ntimEGtMdmqRKNQ64acErB6lgd8JFg+t3Te5a5CjuPjkfrqxgZ3yp7nToWKvWrbYaDsTm6qmDZ+LA3BukvaoIO+dViMEGgUiX15PUjQgp9oJOYWoeoYlMZBjFTjz2fL8XcXTGHsl6qczY+nMWHg/HjdD3LzHg0Gm0qM+fN0/DyXviY1UfrHxClgjr+sNhYvNE2bzCXYHZ+UFGdvkLZvaiwDCloNY02bwFr43PWfcAaGneb1TGjO/tapZ0dkVwCWpmHJ8Juk56TnNzXFgSL71qhWRm0L1xW+F5Q6alkOaObatKVpuBns+LI2qs2bq3E0ZadN3bBulTG3H0J0XIxUMVWKeO6xuZU7JA/oGL8x7qadgMURSBSua2jMYpPEhNEP0I8Phf1IhBMSAou6C+vz+4qAMZ4QU+EQWy7bc5SjDOlL2qvcBQBkFTqlEknvENQAwKgVSpahGY7lFCwNzn6wfj04vHCf06zZu6hkZBF4gKUNJq8lYrQomE5z4IEKGoBaRu9zRT2rlvLuWNz7eP8tOfjhEUZUGHgFDcqhgjaw4qx1wKrQc0rVbqji1RwGGODUrO4MeE8qAO/97rYRKKiQXgb1ukarwWbQsDRKSOyu27fF5fXrfXdJBe5ALW0atNfBUqXnoaKV/Sea0SyUHbXizSgxFCZey0QKDysxrNMv4NEE4M0FoqrJ19HY8wUfwkpfEI1psF5GIuDR+4exgTUePNBN2NKN58Kc30vRvpCfwzAEojVKx0AU5YPWHGOEh7IAg7giZg3HaqNXLlrlMe5tAB3StPttXpoZF2TXF/mK3ez+DW9KH+zbKf1toVtfc9/3tkUK8guUDH3lLw+ub2b0Fb4rvn781mBQ9NsZXflxKbvtSOS67RvD4ZvXvnimRWdv/v3rpb7hnYEgRstpAYikjf4gGjyiwxbFXTRkKwsayhI+hVB/MAPVYyPbnOV6n3cv8IPKXb89/XNAK9yzlzw0kfa9Lb0Dq50jn0iVd9w0BJZmxkVFae8BEHhr44LuqrmJIRaOoYErGFSpLQ1tNYEVX1ZxkYYmW55BKdhm5M0ImpnuA9OGqDXW0CywASi3tR2XPrksX21X0WAK0IL4xgWddrumOXTtzZsLC6FFb89zODQqT43Ce/uNrxy8bJbTp2+pCY26TGpG3y94XsO9x/6NsqJekKEmEo9TqVA4B42GFT74FNBBJoC5zDo6zdmBBiBWkzdDM/EhRDZkABsFxegCB60hWMcQfHk6RYWxXyU3o6PRB2drXcMmVG2bY9Lo/VZPlSNQXxTMM2vVKrAi+fxfpC+kbz5/fB4L9KoQk5j/BRgHusGUy83wyzHbf3L8J9vHyAFYPuSP0qfSL6X3JelIu7uMHXnTs6c++/vp11rzq2o00rv/VEBo3/jG9m6Ldfatp7YvfubATPh58UOVYZfZYVWxNKNXaYPBgkB+nhZkf7np6Rl5ic1HgfWeyMTIWu1xaask3aU5cI9Dy0DP8efwJtBzcsDtPD5LMebRv0v3HDsASv72xvfmRKzj77ksfpN01d/ApCYWlTz1tmd//fpPdkyG7tk7Xpf1ScgYQ/YB8RpKPdHpXkZtQn1kH/VDihIsfh/2UIl4R+y5MvE/jQ/mhdBYVkR+5dgFaCJe/j+MH11uKDWgv+XfETI/qig4dxT7TKUzBRWIMfruW0gIqB6DweBFv3/3bP83GfwYFj/srAKnoCuff0co6xDG0Pw2Bn2bWzCvKdvhxrA0FQrTQaMVa9+EYoDYndTia8TFipGldViE7lX1I/gpVrYEsMTqoDfFg43NRKvAGmWAlRx0sQtbp7mx2ZkR+z4W9UC27tUD8jg0zQS1IIgtfzn3oaetWq0ubn06rY0P086V/nrcAPPyI4bloWRouSGSnwcNx6W/ztUOi2vTT1vjOq3W+vQhl11Z6AIpAgz5CqN0+Bi7AxdkT4q5coD+EuUA/aByHHbG51Ay0isE0zLlKlTawcH8RdqEFVVq4f5QQhUExXdLx86YCj2CwtTzDtYFfKfHpBA8haYzoPJu6a2gKhHavxCVZk1oF+Vz0Vg+V7dnTx0IFBeyuKSoTicXJL11N6i8dEHSsbtB8cCC2MLiAMAFcfmxaK/NjMyHm7BEBTCTiycVDs8qAZMSiCY0hzA8C0JYRkbjVoB9nm/fcXzV5e/fu4BHZ79etRuYHwbDpINr16nUR6S3jpyzgU5yDkqOHIJ3wemrf3NgDs+Puvn1VeRMuZ06z9RK96ySXrnvCenlY7ZrQOflIH3fk6DimE2cJK8/5vD/dKheIqpZivigUwO/EE5becS8lAArHw6iH/NdcH2PH0z88KGyx0ZZPrdIQ0Hp1dJxcOLzeZ+BTT/teA7W4glNekH64M0NG94EPkRtvjf/cil545z0BOiSvg9W55fNjcMFqJSr18z7bO6UMc+N6SJ3behfElxzCa4QyaznAT+FPU9NomZSi6k11FXUQ9QT1AvUq9R71EfUGfSO2AanDoRlSGEaW+KgeRqLGLTs7wqbPXNEhCBSglWUVyVSZDHCGifzPZ51UowoL1/UASDqADkRqdy6Bda3E0mXxAqMIroljLPk1juiMJXG3Y7glaYQk4HYYpArTb6BlEdgjXCyXAzoe57YP3NYzoFS2RQTS5bQ7MgWVjevxE0zkKd5lsc+0NUKtZpzBxzAoLRo1Cl3ZKHVEA8WiWOa3RETfwvLeXQODs4EXKLZzIxt58wWFwM38Zp4mbGpNX5uCGfQ62w0bXDCiRreF9Go0SFrCdSjSdxkQkeWETQVQ0Iah3PINUPLF09ZYr5qb60GzPvbsDg9dk1hqC7AlC9s8m7d9+iw4dvXTYpxyWaL9+xKndIslGnJ8WHG5HMytGAwOpl7GYtZ8CksZnN+drFB73TUGgz6VB38hjHo9bgaqDI/0StFMeVWFZeDaJ4Z5NljTz0angOBEUJAA5qhoZZVsRwNWIMV6HkkYzm0pmih88YNt4Chsxloz9eCVQq1jteHTF+qQ0FrSHH/PqULhAzS187y2XlKLe253y0/zM5JJ4yRPIURH+hUSiOYMnaHxiRkgbMxpKloMAsamFkhfT2ynm7vYtNKMKxk/ohO3YqbD1TVbF85Vjn+ykpr2sIPmb5thKGjex5cbi7TobcmR1RBl0IwotdmhHPVZh/DWAp8LGOlFzrq0Ws7nHU+Q3ac3sbQRp3ejupzWkwZ9KrilFf1fwBUC+G2AAAAeJxjYGRgYGBhPD3hfEVkPL/NVwZudgYQuGJ81ghG////n4GTkQ3E5WBgYgDqAABkIwvXAHicY2BkYGBj+M/AwMDJ8B8IOBkZgCLIgGkrAHsKBc4AeJyNVktrFEEQrnn0PIybLIYVNQRWSUyULIqo6EXmsB69iB4MiCLiRSKCJ3Nq/Bn+D8Gjv0q8rVUzVT3ftJOsSz6qu7q63tWTzNNn4l/6kij5RVTSf+F1wbTwPU/WAid7PzxjfHWePplMYXcYruNdK3TPd++ZzBjkXt7pbkQu031r2/d61YcLzvwEmRzsr41VfcmppxhvOeSdOvQdzouUEvblO+P4rNhG0KieB4Ky50+cD7k7xdxYDhRTF9VC5Y5beIijy2UjMlWUb8sD2KfMQx76moS4kZqvrj8/4py8CTmyWHp7EneKPp8JTzON20W1nyr9wvxEZfK4lxhbA7897ZSWd0WtOnOtZeqpSTVvxsOeUt2H2Eecr8TyhT1TQvxQuwZzEs58Vx+NK/jIuhaMCdfgmYB9WzDC3mzkXY0xVsv1sKejfoHZtLNG52/C+4XeTdnH1HKi9K3kifGO7zsByyeF+sLyE5tPXmdM98bqrXm5aLNvvMQP8v3Q+Gw3E6ybL6jd/ewb04xyp3EzfQQ9dkPA/BaFwUOvE+1ID0Y9vBHHoXaX7Qzxn0DzafNscuEu+3KkNLxDpfK0DvPSr1b4prLsbGRWwqyKTAX+W71l9utO/gTf6TBX1L8P5W+6Fc+T+mlvcxtXjXd6Oq16/tzqUa+pWYQD81n9nzO2wcZS/XnM60sghz4/4fMrI+9CjKuM93z+Sv2+rXpqpge1+h6D5TYF+F1AvVVELb9Qh3bNPm7gu4x1wDuDtdZX99sF6NQeT62v4L1NZUZZvtCzlNftXNhsQJ2DriryIe6J6g+9qHU/lifrbYy7gPOSzu8NzCfmsvwxOAv9yPY+tHd/9vpD/MOaXGa5Taa7Y32h7/h+Nc5/Hvn3FGzNzReIbW8sLtV9nfcfWe+h8rNyqFvWS51/6cfMZlz1B3m3ov1Cv0cO7Xnawh6xb5We79dDW7Oov/7pDeDv2t18BPC/RRLPRUAKve7pruRcfbwTZDzdFHre7y/1CnzxeJyllntUz2ccx9/P404uuYYQGmnNQpFkihBiIeMQi7kzs2mbTYaJZYwk17k0l61NyD3kHic0cg+5h5BpriHsZf/4f+uc9/n+vs/zubzf78/zfU7Sv38e/wExkqkIFkg2AmRIhYJBnlQ4VCrqCq5IxUdKJcYC9kuyXsoNnJIcoqTSA6UyCVJZ3svx7khZx8VSeXIq0KNCplRxIiiQKtGvspdUpZzkRJ5TulR1tFQtCMRJ1ennzHoN8moWB3CqRS+XGQBOteOlOp5SXRfJlRhXuNULlOpnS270bAA3d/LcU5BHD49H0nv0b+gPeL4fDtjzRLPnSqkRPRvDqQk9veDlxbs3tb3h650sNeV30zBATjM4NkOnjwOgjs8mqTleNefpOxTkSi32SH7oaQk+8APwasVeK3r7k+9PnQD4B1C7dS+QL7Whdxu4B1IrkPi27LXjvT1x7bOkIOp2QH9HH6lTohRMTGdyuqC/Czy74PuHSVIInELg1xUdXfGpGzy7MYPuxHVnvqHs96BmT3zsRd3e+NQHX/pQOwyuYXDpS1w//O5Hj4+pEY6OAeQPwMeBhQFcBoUAzsHgVGkINYfQcxjch6F9OLMYQd8RcBoJt0+pP4r8z9gfzdn4HM+/oPcYzlIE84kg90tyxlEnknMTiT/jWR9P3HfR0gTmMZG1SU4AnpPxMIrZRVF/CrlT4DkVjT/QJxru0+AwnfwZadJPxM9kbxY5Mcwxhr3ZnI9Y+MWyFgufWNZiOZdz6D+HnDg0xlErDo/mwn8e53E+81/ArBY6S4vguoj5/EyvxfizhHpL2VuKd8uYWTz7v+DPcjQvR8MKZrYCniuZ1yrqJHDWVuN7IrUS8XIN72typLX0WofGdcwxCW5JnOv1eLSe72MD3DfwHWyA30Z6bWQWm5jLZvzaTN0t1NqCH1s5h1vhnUzeNuK3wWl7+lvsgEcKmneibxc6d1NvDzPchx/78Go//FLplYrfB/DwADoP4n8aZyYNPofodYg6h6lzBL5HWEuHy5/EHKXnUXQcg38GtY6j/zjzO4HWEzxP0uMk6yfRfApPTrN/Gr/O4PsZ8s4yp0x0Z6LhHGvn4HUeb8/D4QK+XKBHFryz4HyR2IvovISWy+xd5pu4AuerrF/Dl+touM65yIbjDeJvMuNbxN2idw7rt/kW74C7IBff7nGW/+JM3mfvAb48RNMjch/zHT3BhyfwfEp+Pt7nU+sZZ+I5vV7Qs4BvpQCOL9H3Et4v4f8Kza9Ye11cRhVlimySKfpIpli+TPEMmRIDZUqWAwtkSjnJOBQGK2VKe8iU4SouGy3jyG/HeJny6TIVfEA213SMTCU3QGzlXqBApsoeGacomapjZapFylQPlXE+JVPDH/CsSU4t6tdiz4W82sTXIbYu3OqOlHFlz5Ue9YfKuOXIuAfLeFCjIc9GEQDeja/INPEESTJeCTLerDclppmrDHehaR4k44se3zyZFvTzg49fpkwrOPo7ywTQs3WaTBsQuFimLfHtQPvRMkE8O8CnowtAYyc4B6O7M750QUMI4C4z3eDQPVAmlLgecPsoHBDbkx69vAAxvdHSG+/64G8f4sPQ3Bce/dgLj5PpT6/+KTID4PkJeQMTZQahZTDah2TJDGVOw8JkhsNnFBpG03sMdb5C29dwH4u2b6j/7QyZceRE8hyPPu4qM4G8CcxzAjOeiK+TqPs98ZPhNpn9KPKn4N9UfkezN43cH5nr9DeA30w0zcTbWfgaQ7/ZnJs55MfxnIuuucx6HrXnE7sQXYuot5i4JcxxCRqXsrYMz5Yxw/hUmeXMZQW9V6JlFX1/nSjzGz0S4MsdZBJy3+J3vPiDc7Uab1dzFhLxZQ1c1vK+Fr3r6L+O9yT8SOJ9Cx5uRWMy3nDPmO3sb8ffHZyHHehLgVMKfXfSb9cbsLabWnvwfy8c98JvPzn7mXcqeg6g+SD9D8IlDd6HwGH6HGEvHc1H4XyM+hn0PM5sTzCrkyGAvdPM6Qy9znKWzuJRJuf1PPwvUDMLXKQWd4W5RL3LcLmKD9fIy4bHDfZu+sncgtct9OXAP4czdZs+d+h5h9934ZiLj7nJgNr3qHUffffRlIeGPPz6G20P4POQvIf4/5i6T/h+n3Dun8LtKT7lw+8Za895f4FnBcQUoIV7w7zkLLyix5v74nWGrPGStc6yhTxkCw+VLXJKtliIbAnWS/Lb4Yps6TzZsk6y5VhzzJat4CdbkfhKgP+vbBVPWScf2aqustWiZavzu8Ym2ZqhIF3WJVK2NrXrJMq6Bsu+Q3y9INn6xLo9km0wQ9adNfcs2XfjZD14NqRWw1xZT9AoSraxPyiQbZIs6xUh681+U3Kbu8j6ku8L1xYOgJp+biBTtiXcWhHvv0A2AB1t4mUDqdGO96BwQH4H+AWn/B/8A2W9n3QAAHicY2BkYGA6zCTJoM4AAkxAzAiEDAwOYD4DAB0oAU0AeJyVk99qE0EUxr/dpE1rpGDRUryQQUTBi920lBaCN9s/6U1oYgilV+o2O0mWJrthdpKQa19A8AXEKx9AvBe89FUEH8FvJ2MTsUJNSOY3Z+b8+c7ZBbDtPIWD+cfHG8sOyvhk2UUJ3ywXcA8/LRdRdh5aXsGmU7e8SvvUcgkv3WeW13DXfW95HXfcL5bLeOD+sLyBR4WAWZziOnevTMacHWzhnWWXtz5bLuAxvlsuYstxLa/gCXXNeZX215ZL+Oi8tbyGbXdmeR333Q+Wy3jufrW8gReFAo6QYoQZFGL00IeGwDFCTCBJp6QEEc8FdlHBDvbhkQMM+BVLXpnZSa6Sa+4d8SaO0tFMxb2+FsfhRIrTMIlmYreys++JYDAQ5igTSmZSTWREhxrrSRgvwNRESzHkilqa6GAqs3TITYuWHsasIGQutGRvPAhV7tvAGdqo0/sQVe7atJ3gAk1yizvUGmftenBYbbRrJxfNRqt9u4znRlVGtfldgT1qO+CvstQXnEuVxWki9rwDr2JE3i54k0IkpWSm5XkTuyadoF9q/vvm5KZR5T4d0u/CulzVkk/X5s8tijkiWoembVe0hbRqE++S7VxESbjmu46pmVNpDmSYSc6pK5XQqdB9KRajzWRH58K7qTInXaoTWoWRHIbqSoRaq/hybK4kqY47MrODVqayv3qjtLhuzk3PIhbPEkwfNPtS5SvuX+sN/4jpGWXoaz2q+n5eXjiP78Xp/0TwOal5VxLTef8fMf0BRSaZ9PELz4vYEXicfVcFdOPIsnVVmWInGVimt8yU2JacLE9gmZm9st22NZYtjSAwy8zMzMyPmfYxv33MzLCPmaqk9kzm/HN+TtIk3b7dfW9XKSlM/b8/+BoXkMIUpW5KXZ+6LnVj6pbUrakbUrelbgYEgjRkIAs5yMMQFKAIwzACo7AMlsMKWAkbwcawCWwKm8HmsAVsCVvB1rANvAm2he1ge9gBdoSdYGfYBXaF3WB32AP2hL1gb9gH9oUxGIcSlKECBphQhQmYhP1gfzgADoSD4GA4BFbBFEzDDMzCoXAYHA5HwJFwFBwNx8CxcBwcDyfAiXASnAynwKlwGpwOZ8CZcBacDefAuVCD88CCemo09UZqBBrQBAUtaEMHbFgNXXCgB31wwYM14EMAIUQwB/OwAIuwFs6HC+BCuAguhkvgUrgMLocr4Eq4Cq6Ga+BauA6uhxvgRrgJboZb4Fa4DW6HO+BOuAvuhnvgXrgP7ocH4EF4CB6GR+BReAwehyfgSXgKnoZn4Fl4Dp6HF+BFeAlehlfgVXgzvAXeCm+Dt8M74J3wLng3vAfeC++D98MH4IPwIfgwvAYfgY/Cx+Dj8An4JHwKPg2fgc/C5+Dz8AX4IrwOX4Ivw1fgq/A1+Dp8A74J34Jvw3fgu/A9+D78AH4IP4Ifw0/gp/Az+Dn8An4Jv4Jfw2/gt/AG/A5+D3+AP8Kf4M/wF/gr/A3+Dv+Af8K/4N/wH/gvphAQkTCNGcxiDvOpHXAIC1jEYRzBUVyGy3EFrsSNcGPcBDfFzXBz3AK3xK1wa9wG34Tb4na4Pe6AO+JOuDPugrvibrg77oF74l64N+6D++IYjmMJy1hBA02s4gRO4n64Px6AB+JBeDAegqtwCqdxBmfxUDwMD8cj8Eg8Co/GY/BYPA6PxxPwRDwp9TqejKfgqXgano5n4Jl4Fp6N5+C5WMPz0MI6NrCJClvYxg7auBq76GAP++iih2vQxwBDjHAO53EBF3Etno8X4IV4EV6Ml+CleBlejlfglXgVXo3X4LV4HV6PN+CNeBPejLfgrXgb3o534J14F96N9+C9eB/ejw/gg/gQPoyP4KP4GD6OT+CT+BQ+jc/gs/gcPo8v4Iv4Er6Mr+Cr+GZ8C74V34Zvx3fgO/Fd+G58D74X34fvxw/gB/FD+GF8DT+CH8WP4cfxE/hJ/BR+Gj+Dn8XP4efxC/hFfB2/hF/Gr+BX8Wv4dfwGfhO/hd/G7+B38Xv4ffwB/hB/hD/Gn+BP8Wf4c/wF/hJ/hb/G3+Bv8Q38Hf4e/4B/xD/hn/Ev+Ff8G/4d/4H/xH/hv/E/+F9KERASUZoylKUc5WmIClSkYRqhUVpGy2kFraSNaGPahDalzWhz2oK2pK1oa9qG3kTb0na0Pe1AO9JOtDPtQrvSbrQ77UF70l60N+1D+9IYjVOJylQhg0yq0gRN0n60Px1AB9JBdDAdQqtoiqZphmbpUDqMDqcj6Eg6io6mY+hYOo6OpxPoRDqJTqZT6FQ6jU6nM+hMOovOpnPoXKrReWRRnRrUJEUtalOHbFpNXXKoR31yyaM15FNAIUU0R/O0QIu0ls6nC+hCuogupkvoUrqMLqcr6Eq6iq6ma+hauo6upxvoRrqJbqZb6Fa6jW6nO+hOuovupnvoXrqP7qcH6EF6iB6mR+hReowepyfoSXqKnqZn6Fl6jp6nF+hFeoleplfo1dQdmbZjBUGmFwV2Ixsoy2908qo/pxzXU5kO98N0EFp+QYqa6nnhYjoKlJ9u2U4vH3ZqjuW3FYadnLTtIES3m/VVz51TubWu26vZ/Xxcu1FIbquVDex233Ko4bYzoW8FnXTH7ak8z6ZqlhOmQ7un0r5rNYeb7nzf4YYM5wedbORJlbH7dXeh6DnWYq1h+w1HMaenrDDnq5avgk5elhJP6LiNbrrlWO0Cb6bpddy+CgpzrhP1VI3XU9RNIRjS7cjLrvEbblPl6lZcU2i10/wXpOuu281L0bP8bsbz7X6YbVg95VvpltsP+bnTzNqh5diNYqgWwlpH2e1OWIjb83Yz7BT4Wbtfc1QrHE6aDdUPlV9MOr68PpK0V0dBaLcW07KXot1v8nsJTrfjd0dbVkPJqdXm7KZyc57dCCNfZT3Vb9hOoWd5NVmr8rNWUybkE+Z1qqYdZoKO5atMo6P4hESwkSBUXq1uNbrzlt8caVl8hINeftBIy6FnPItNwMZwvVzL9WV8OH590Iln0p2MWq0a4TDzzPlusvORQSfewpDnREFNjFHo2X3dLCYmits5txvXI2sixUfCOOkN2f2Wm8CChq9UP+i44YiGJa4YYmDSKtSt/qBp+b47H6+jmDTjVeSTduTp57Ej4iMSH/FyAnutqrUixxnW7aBnOc5ytdBwrJ61blnptt1i2ymrxXfEV3m1yEZjNYak0XDcQA3zqfTtfjt+PcPn2Vf5huWoftPys77Vb7q9XMPt9VjjbM9q91VYGJxX5K07R1kf2z2cVyoc4a17nkzZ4As73GIXKj8hK+qOLGGZXvic8kObGVfofsf17bVsX8sZYsfXGh2ZJJy3Q/ZlcvBiMrF93BtOHF9jct+lrlpM820O8nrJwUjYiXr1gNcqB7dM92S50h+KA0nHclrFOLokMSUn83KIGHHsfpfNmRxlzouCDm9rhG+P8jls1ORxHELsfpbJvc5isW0zQz3xQRIdhCbjsA/4cOW+F2OLJ0Sjg8ubdAvxCwmZ3nB+sNdsMnM26ksMKbLF+NLIATfJDwLqNPlSsBv48PrpunKcYkOOtcUHG6pCh2XU7o6b4rZc3Iq8ZEQOZEXiyNp6R67cYCSeYNkGQ5G3IUim4Rju1lV23uc738mEVtANshxReTNDdd9WrYYVqII4N7knmbbvRl5azjLDHoma2bqyOEJQIwpZSo9PxfJi/9heOrDmVEHOp1Zno3bZca7PfsLIQdfhiOHbXRV2eMJ2ZyjiuOTztIrXUHdUhs1rNzjMR43uEMvI6+HrO7quFR/78rbrtnk362JAcclAhjVUiwU+cxXGO80nTb6kSSO+xEkzPiu+NxzC+0E6cH22GhfJPYlbfHkGmS1OKgOvpXndLhumzf5vckqqu6xxUdtZ3hweWDvOKBzjQ/ZrqDi25tnbPmtvcUTkmFdwZBE1tkU9z3GBdW6r0fiIa4MMNpx0E6fmJJXWes0iY8OOG/Dhq3wQ2aEolhdTCWO2wYlKKc4wLkdlyZRxOpEt1CPb4R208wz2JO8MWT1mt/oNle2pZtcOiy1ZErOsVrx0xXmgk4Sp1lhLrWi6UV2s1JcTj/23wUjivw2G2H8b9GVfhfX44hJgfoAorH8111RBl9NG1rE8qWKjhMM9ty77im/jsPZ37LfCmsgN9dRJM9GZd9vv82aSdzOc/Z3Fgg4FfDDLl4bAOAwtCYPSL6gFT25hoi4L6CXvZYIeLyTT4qvVp57q5Noc6zyrmecwF/siL98S8uZo3IhDC7u5mecz5uxlOWn5YhiKF8SvOcvWxTsdgDiYJMkivr/pBkexIYFIuuxKsGFXpmul6mRxSWYpBhHfSL6+tse2jupJi1+bKA970dq1cna2aihOoDKhHOPo+mYt/vDq2Mppjg4STbKaFZKiauwm9lBkBx0+UZ+DnZLEs9BocoDS2SYYfLSs3GBEB6ilQxKglvbjANUJe46RbgRBOcve5JBZSKKqNjFHJs6OG7HfbS+wgyUJacW6sUHSStfKY+Wh+NNP5s/yIK93dP2XQ5yuk5AfD+YdxZdebJg0Yscmz+PPiDisx1eiVh4vFZKUH2cEvvZ8rSWzJQZZ7xS2rrxdJRX51K57FAVNsvs+rfYWyY/q1PXnqR425DNZDa27s8vjOFQXY3gdq843slYuTa5cNxpyOK1HoQo2/b9Dsq2RwXAcg1ds0ItjU61crkhhDC9yNo3qeiO6k15gmYcWBp8e696Rw8w12Sz8Uc0hnb/0BsGLv7G43/atXrbF37Rdn6wmh47x6vho3Q7rkRy9loEjoeMXkyoeWua4TLQ+S40s6Ufe0qfiq+VL+skVn+fPXHc+yPE19V27meGLES3wMu265Jagu+hxUnMjP1gTsWL8OcBWcbMtDsuOSkshCTy0PQoikdY0c/LPjT2nqB61ca6bmVd23eV/HPr8yy9US6Px3muDzctYZZNkSYOc6yQ5Rx6Zo003XPJAxiaG5/hTnL9K4zXxyMTYSJLZ4oGaK0MlKcpSiFYThhSmFFUpJqSYzEV9+9DxVWN81tY4j0wKaLIsXQFNCmhSQJMCmhTQ5GS6VhmLEXVplaQoS1FJZpsal44pRVWKCSkEND4mhTwdF9C4gMYrUhhSCGJcEOOCGNdrmx7TteBKgisJriS4kuBKgisJriS4kjCVhaksiLIgyoIo6+XN6AlnxnUdvyHQsqacMXRt6lomr8gcFWGtCGtFWCvxA4FWNHRWiA0hNmRaQ0CGgAwBGQIyBGQIyJClmoIwBWEKwhSEqZd6aPxMQGaVz7sVPxNQVR5UBVQVUFUeVIWmKjRVU15uSEtoqoKYEMSEIMQXFfFFRXxREV9UxBcV8UVFfFGZEMSkICYFIaaoTApispJulWIZ2RTcih8IQkxhsCm4GJeiJEVZiooUhhSmFFUpJqSYzMwpDpvcFEsYMpchljDEEoZYwhBLGGIJQyxhjAtJSUhKghAzGGIGQ8xgiBkMMYMhZjDEDIaYwRAzGGIGQ8xgiBkMCV9GWRBlQZQFIR4wyoKoCKIiiIogRHpDpDdEekOkN0R6Q6Q3KoIwBCG6G6K7IboborshuhuiuyG6G6K7IboborshuhuiuyG6G6YgTEGI6IYpCFMQLHqrxAguBMGic0sQIrohohtVQVQFIaIbIrohohsiuiGiGyK6IaIbIrohohsiuiGiGyK6IaIbIrohohsiujEpCIkEhkQCQyKBwaK3SlUV27Q0MaZrxpkivSnSmzoelCYMXZsyWJViQgrmM8VLpuhviv6m6G+K/qbob4r+puhviv6m6G+K/qbob4r+puhviv6m6G+K/qbob4r+Zim5lqVVeoWrxnVd0nVZ13qpq/RSV5m6rup6QteD+VbpekrX07qe0fVsUk9p3inNO6V5pzTvlOad0rxTmndK805p3inNO6V5pzTvlOad0rxTmlcHzdK05p3WvNOad1rzTmveac07rXmnNe+05p3WvNOad1rzTmveac2rY2tJx9bSjOad0bwzmldH2JKOsKUZzTujeWc074zmndG8M5p3RvPOaN5ZzTureWc176zmndW8s5p3VvPOilMmNemsJp3VpLOadFaTzmrS2dn/AboJB4wAAAA=";
+}, function(module, exports, __webpack_require__) {
+ function addStylesToDom(styles, options) {
+ for (var i = 0; i < styles.length; i++) {
+ var item = styles[i], domStyle = stylesInDom[item.id];
+ if (domStyle) {
+ domStyle.refs++;
+ for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j](item.parts[j]);
+ for (;j < item.parts.length; j++) domStyle.parts.push(addStyle(item.parts[j], options));
+ } else {
+ for (var parts = [], j = 0; j < item.parts.length; j++) parts.push(addStyle(item.parts[j], options));
+ stylesInDom[item.id] = {
+ id: item.id,
+ refs: 1,
+ parts: parts
+ };
+ }
+ }
+ }
+ function listToStyles(list, options) {
+ for (var styles = [], newStyles = {}, i = 0; i < list.length; i++) {
+ var item = list[i], id = options.base ? item[0] + options.base : item[0], css = item[1], media = item[2], sourceMap = item[3], part = {
+ css: css,
+ media: media,
+ sourceMap: sourceMap
+ };
+ newStyles[id] ? newStyles[id].parts.push(part) : styles.push(newStyles[id] = {
+ id: id,
+ parts: [ part ]
+ });
+ }
+ return styles;
+ }
+ function insertStyleElement(options, style) {
+ var target = getElement(options.insertInto);
+ if (!target) throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");
+ var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];
+ if ("top" === options.insertAt) lastStyleElementInsertedAtTop ? lastStyleElementInsertedAtTop.nextSibling ? target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling) : target.appendChild(style) : target.insertBefore(style, target.firstChild),
+ stylesInsertedAtTop.push(style); else if ("bottom" === options.insertAt) target.appendChild(style); else {
+ if ("object" != typeof options.insertAt || !options.insertAt.before) throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");
+ var nextSibling = getElement(options.insertInto + " " + options.insertAt.before);
+ target.insertBefore(style, nextSibling);
+ }
+ }
+ function removeStyleElement(style) {
+ if (null === style.parentNode) return !1;
+ style.parentNode.removeChild(style);
+ var idx = stylesInsertedAtTop.indexOf(style);
+ idx >= 0 && stylesInsertedAtTop.splice(idx, 1);
+ }
+ function createStyleElement(options) {
+ var style = document.createElement("style");
+ return options.attrs.type = "text/css", addAttrs(style, options.attrs), insertStyleElement(options, style),
+ style;
+ }
+ function createLinkElement(options) {
+ var link = document.createElement("link");
+ return options.attrs.type = "text/css", options.attrs.rel = "stylesheet", addAttrs(link, options.attrs),
+ insertStyleElement(options, link), link;
+ }
+ function addAttrs(el, attrs) {
+ Object.keys(attrs).forEach(function(key) {
+ el.setAttribute(key, attrs[key]);
+ });
+ }
+ function addStyle(obj, options) {
+ var style, update, remove, result;
+ if (options.transform && obj.css) {
+ if (!(result = options.transform(obj.css))) return function() {};
+ obj.css = result;
+ }
+ if (options.singleton) {
+ var styleIndex = singletonCounter++;
+ style = singleton || (singleton = createStyleElement(options)), update = applyToSingletonTag.bind(null, style, styleIndex, !1),
+ remove = applyToSingletonTag.bind(null, style, styleIndex, !0);
+ } else obj.sourceMap && "function" == typeof URL && "function" == typeof URL.createObjectURL && "function" == typeof URL.revokeObjectURL && "function" == typeof Blob && "function" == typeof btoa ? (style = createLinkElement(options),
+ update = updateLink.bind(null, style, options), remove = function() {
+ removeStyleElement(style), style.href && URL.revokeObjectURL(style.href);
+ }) : (style = createStyleElement(options), update = applyToTag.bind(null, style),
+ remove = function() {
+ removeStyleElement(style);
+ });
+ return update(obj), function(newObj) {
+ if (newObj) {
+ if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) return;
+ update(obj = newObj);
+ } else remove();
+ };
+ }
+ function applyToSingletonTag(style, index, remove, obj) {
+ var css = remove ? "" : obj.css;
+ if (style.styleSheet) style.styleSheet.cssText = replaceText(index, css); else {
+ var cssNode = document.createTextNode(css), childNodes = style.childNodes;
+ childNodes[index] && style.removeChild(childNodes[index]), childNodes.length ? style.insertBefore(cssNode, childNodes[index]) : style.appendChild(cssNode);
+ }
+ }
+ function applyToTag(style, obj) {
+ var css = obj.css, media = obj.media;
+ if (media && style.setAttribute("media", media), style.styleSheet) style.styleSheet.cssText = css; else {
+ for (;style.firstChild; ) style.removeChild(style.firstChild);
+ style.appendChild(document.createTextNode(css));
+ }
+ }
+ function updateLink(link, options, obj) {
+ var css = obj.css, sourceMap = obj.sourceMap, autoFixUrls = void 0 === options.convertToAbsoluteUrls && sourceMap;
+ (options.convertToAbsoluteUrls || autoFixUrls) && (css = fixUrls(css)), sourceMap && (css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */");
+ var blob = new Blob([ css ], {
+ type: "text/css"
+ }), oldSrc = link.href;
+ link.href = URL.createObjectURL(blob), oldSrc && URL.revokeObjectURL(oldSrc);
+ }
+ var stylesInDom = {}, isOldIE = function(fn) {
+ var memo;
+ return function() {
+ return void 0 === memo && (memo = fn.apply(this, arguments)), memo;
+ };
+ }(function() {
+ return window && document && document.all && !window.atob;
+ }), getElement = function(fn) {
+ var memo = {};
+ return function(selector) {
+ if (void 0 === memo[selector]) {
+ var styleTarget = fn.call(this, selector);
+ if (styleTarget instanceof window.HTMLIFrameElement) try {
+ styleTarget = styleTarget.contentDocument.head;
+ } catch (e) {
+ styleTarget = null;
+ }
+ memo[selector] = styleTarget;
+ }
+ return memo[selector];
+ };
+ }(function(target) {
+ return document.querySelector(target);
+ }), singleton = null, singletonCounter = 0, stylesInsertedAtTop = [], fixUrls = __webpack_require__(504);
+ module.exports = function(list, options) {
+ if ("undefined" != typeof DEBUG && DEBUG && "object" != typeof document) throw new Error("The style-loader cannot be used in a non-browser environment");
+ options = options || {}, options.attrs = "object" == typeof options.attrs ? options.attrs : {},
+ options.singleton || "boolean" == typeof options.singleton || (options.singleton = isOldIE()),
+ options.insertInto || (options.insertInto = "head"), options.insertAt || (options.insertAt = "bottom");
+ var styles = listToStyles(list, options);
+ return addStylesToDom(styles, options), function(newList) {
+ for (var mayRemove = [], i = 0; i < styles.length; i++) {
+ var item = styles[i], domStyle = stylesInDom[item.id];
+ domStyle.refs--, mayRemove.push(domStyle);
+ }
+ if (newList) {
+ addStylesToDom(listToStyles(newList, options), options);
+ }
+ for (var i = 0; i < mayRemove.length; i++) {
+ var domStyle = mayRemove[i];
+ if (0 === domStyle.refs) {
+ for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();
+ delete stylesInDom[domStyle.id];
+ }
+ }
+ };
+ };
+ var replaceText = function() {
+ var textStore = [];
+ return function(index, replacement) {
+ return textStore[index] = replacement, textStore.filter(Boolean).join("\n");
+ };
+ }();
+}, function(module, exports) {
+ module.exports = function(css) {
+ var location = "undefined" != typeof window && window.location;
+ if (!location) throw new Error("fixUrls requires window.location");
+ if (!css || "string" != typeof css) return css;
+ var baseUrl = location.protocol + "//" + location.host, currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");
+ return css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) {
+ var unquotedOrigUrl = origUrl.trim().replace(/^"(.*)"$/, function(o, $1) {
+ return $1;
+ }).replace(/^'(.*)'$/, function(o, $1) {
+ return $1;
+ });
+ if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) return fullMatch;
+ var newUrl;
+ return newUrl = 0 === unquotedOrigUrl.indexOf("//") ? unquotedOrigUrl : 0 === unquotedOrigUrl.indexOf("/") ? baseUrl + unquotedOrigUrl : currentDir + unquotedOrigUrl.replace(/^\.\//, ""),
+ "url(" + JSON.stringify(newUrl) + ")";
+ });
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), React = function(obj) {
+ if (obj && obj.__esModule) return obj;
+ var newObj = {};
+ if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);
+ return newObj.default = obj, newObj;
+ }(_react), _propTypes = __webpack_require__(1), _propTypes2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_propTypes), Icon = function(_React$Component) {
+ function Icon() {
+ return _classCallCheck(this, Icon), _possibleConstructorReturn(this, (Icon.__proto__ || Object.getPrototypeOf(Icon)).apply(this, arguments));
+ }
+ return _inherits(Icon, _React$Component), _createClass(Icon, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, Component = _props.Component, name = _props.name, size = _props.size, rotate = _props.rotate, flip = _props.flip, spin = _props.spin, fixedWidth = _props.fixedWidth, stack = _props.stack, inverse = _props.inverse, pulse = _props.pulse, className = _props.className, props = _objectWithoutProperties(_props, [ "Component", "name", "size", "rotate", "flip", "spin", "fixedWidth", "stack", "inverse", "pulse", "className" ]), classNames = "fa fa-" + name;
+ return size && (classNames = classNames + " fa-" + size), rotate && (classNames = classNames + " fa-rotate-" + rotate),
+ flip && (classNames = classNames + " fa-flip-" + flip), fixedWidth && (classNames += " fa-fw"),
+ spin && (classNames += " fa-spin"), pulse && (classNames += " fa-pulse"), stack && (classNames = classNames + " fa-stack-" + stack),
+ inverse && (classNames += " fa-inverse"), className && (classNames = classNames + " " + className),
+ React.createElement(Component, _extends({}, props, {
+ className: classNames
+ }));
+ }
+ } ]), Icon;
+ }(React.Component);
+ Icon.propTypes = {
+ name: _propTypes2.default.string.isRequired,
+ className: _propTypes2.default.string,
+ size: _propTypes2.default.oneOf([ "lg", "2x", "3x", "4x", "5x" ]),
+ rotate: _propTypes2.default.oneOf([ "45", "90", "135", "180", "225", "270", "315" ]),
+ flip: _propTypes2.default.oneOf([ "horizontal", "vertical" ]),
+ fixedWidth: _propTypes2.default.bool,
+ spin: _propTypes2.default.bool,
+ pulse: _propTypes2.default.bool,
+ stack: _propTypes2.default.oneOf([ "1x", "2x" ]),
+ inverse: _propTypes2.default.bool,
+ Component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ])
+ }, Icon.defaultProps = {
+ Component: "span"
+ }, exports.default = Icon;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), React = function(obj) {
+ if (obj && obj.__esModule) return obj;
+ var newObj = {};
+ if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);
+ return newObj.default = obj, newObj;
+ }(_react), _propTypes = __webpack_require__(1), _propTypes2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_propTypes), IconStack = function(_React$Component) {
+ function IconStack() {
+ return _classCallCheck(this, IconStack), _possibleConstructorReturn(this, (IconStack.__proto__ || Object.getPrototypeOf(IconStack)).apply(this, arguments));
+ }
+ return _inherits(IconStack, _React$Component), _createClass(IconStack, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, className = _props.className, size = _props.size, children = _props.children, props = _objectWithoutProperties(_props, [ "className", "size", "children" ]), classNames = [ "fa-stack" ];
+ size && classNames.push("fa-" + size), className && classNames.push(className);
+ var iconStackClassName = classNames.join(" ");
+ return React.createElement("span", _extends({}, props, {
+ className: iconStackClassName
+ }), children);
+ }
+ } ]), IconStack;
+ }(React.Component);
+ IconStack.propTypes = {
+ className: _propTypes2.default.string,
+ size: _propTypes2.default.oneOf([ "lg", "2x", "3x", "4x", "5x" ]),
+ children: _propTypes2.default.node.isRequired
+ }, exports.default = IconStack;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _common = __webpack_require__(61), _Footer = __webpack_require__(508), _Footer2 = _interopRequireDefault(_Footer), styles = {
+ wrapper: {
+ display: "flex",
+ flexDirection: "column",
+ width: "100%"
+ },
+ content: {
+ flex: 1,
+ overflow: "auto"
+ }
+ }, themeStyles = function(theme) {
+ return {
+ content: {
+ backgroundColor: theme.palette.background.default,
+ padding: 3 * theme.spacing.unit
+ }
+ };
+ }, Main = function(_Component) {
+ function Main() {
+ return _classCallCheck(this, Main), _possibleConstructorReturn(this, (Main.__proto__ || Object.getPrototypeOf(Main)).apply(this, arguments));
+ }
+ return _inherits(Main, _Component), _createClass(Main, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, classes = _props.classes, active = _props.active, content = _props.content, shouldUpdate = _props.shouldUpdate, children = null;
+ switch (active) {
+ case _common.MENU.get("home").id:
+ case _common.MENU.get("chain").id:
+ case _common.MENU.get("txpool").id:
+ case _common.MENU.get("network").id:
+ case _common.MENU.get("system").id:
+ children = _react2.default.createElement("div", null, "Work in progress.");
+ break;
+
+ case _common.MENU.get("logs").id:
+ children = _react2.default.createElement("div", null, content.logs.log.map(function(log, index) {
+ return _react2.default.createElement("div", {
+ key: index
+ }, log);
+ }));
+ }
+ return _react2.default.createElement("div", {
+ style: styles.wrapper
+ }, _react2.default.createElement("div", {
+ className: classes.content,
+ style: styles.content
+ }, children), _react2.default.createElement(_Footer2.default, {
+ content: content,
+ shouldUpdate: shouldUpdate
+ }));
+ }
+ } ]), Main;
+ }(_react.Component);
+ exports.default = (0, _withStyles2.default)(themeStyles)(Main);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Typography = __webpack_require__(109), _Typography2 = _interopRequireDefault(_Typography), _Grid = __webpack_require__(241), _Grid2 = _interopRequireDefault(_Grid), _recharts = __webpack_require__(524), _ChartRow = __webpack_require__(804), _ChartRow2 = _interopRequireDefault(_ChartRow), _CustomTooltip = __webpack_require__(805), _CustomTooltip2 = _interopRequireDefault(_CustomTooltip), _common = __webpack_require__(61), styles = {
+ footer: {
+ maxWidth: "100%",
+ flexWrap: "nowrap",
+ margin: 0
+ },
+ chartRowWrapper: {
+ height: "100%",
+ padding: 0
+ },
+ doubleChartWrapper: {
+ height: "100%",
+ width: "99%",
+ paddingTop: 5
+ }
+ }, themeStyles = function(theme) {
+ return {
+ footer: {
+ backgroundColor: theme.palette.background.appBar,
+ color: theme.palette.getContrastText(theme.palette.background.appBar),
+ zIndex: theme.zIndex.appBar,
+ height: 10 * theme.spacing.unit
+ }
+ };
+ }, Footer = function(_Component) {
+ function Footer() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, Footer);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = Footer.__proto__ || Object.getPrototypeOf(Footer)).call.apply(_ref, [ this ].concat(args))),
+ _this.info = function(about, value) {
+ return value ? _react2.default.createElement(_Typography2.default, {
+ type: "caption",
+ color: "inherit"
+ }, _react2.default.createElement("span", {
+ style: _common.styles.light
+ }, about), " ", value) : null;
+ }, _this.doubleChart = function(syncId, topChart, bottomChart) {
+ for (var topDefault = topChart.default ? topChart.default : 0, bottomDefault = bottomChart.default ? bottomChart.default : 0, topTooltip = topChart.tooltip ? _react2.default.createElement(_recharts.Tooltip, {
+ cursor: !1,
+ content: _react2.default.createElement(_CustomTooltip2.default, {
+ tooltip: topChart.tooltip
+ })
+ }) : null, bottomTooltip = bottomChart.tooltip ? _react2.default.createElement(_recharts.Tooltip, {
+ cursor: !1,
+ content: _react2.default.createElement(_CustomTooltip2.default, {
+ tooltip: bottomChart.tooltip
+ })
+ }) : null, data = [].concat(_toConsumableArray(topChart.data.map(function(_ref2) {
+ var value = _ref2.value, d = {};
+ return d.topKey = value || topDefault, d;
+ }))), i = 0; i < data.length && i < bottomChart.data.length; i++) {
+ var d = bottomChart.data[i];
+ data[i].bottomKey = d && d.value ? -d.value : bottomDefault;
+ }
+ return data = [].concat(_toConsumableArray(data), _toConsumableArray(bottomChart.data.slice(data.length).map(function(_ref3) {
+ var value = _ref3.value, d = {};
+ return d.topKey = topDefault, d.bottomKey = -value || bottomDefault, d;
+ }))), _react2.default.createElement("div", {
+ style: styles.doubleChartWrapper
+ }, _react2.default.createElement(_recharts.ResponsiveContainer, {
+ width: "100%",
+ height: "50%"
+ }, _react2.default.createElement(_recharts.AreaChart, {
+ data: data,
+ syncId: syncId
+ }, topTooltip, _react2.default.createElement(_recharts.Area, {
+ type: "monotone",
+ dataKey: "topKey",
+ stroke: "#8884d8",
+ fill: "#8884d8"
+ }))), _react2.default.createElement("div", {
+ style: {
+ marginTop: -10,
+ width: "100%",
+ height: "50%"
+ }
+ }, _react2.default.createElement(_recharts.ResponsiveContainer, {
+ width: "100%",
+ height: "100%"
+ }, _react2.default.createElement(_recharts.AreaChart, {
+ data: data,
+ syncId: syncId
+ }, bottomTooltip, _react2.default.createElement(_recharts.Area, {
+ type: "monotone",
+ dataKey: "bottomKey",
+ stroke: "#82ca9d",
+ fill: "#82ca9d"
+ })))));
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Footer, _Component), _createClass(Footer, [ {
+ key: "shouldComponentUpdate",
+ value: function(nextProps) {
+ return void 0 !== nextProps.shouldUpdate.home;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var content = this.props.content, general = content.general, home = content.home;
+ return _react2.default.createElement(_Grid2.default, {
+ container: !0,
+ className: this.props.classes.footer,
+ direction: "row",
+ alignItems: "center",
+ style: styles.footer
+ }, _react2.default.createElement(_Grid2.default, {
+ item: !0,
+ xs: !0,
+ style: styles.chartRowWrapper
+ }, _react2.default.createElement(_ChartRow2.default, null, this.doubleChart("all", {
+ data: home.processCPU,
+ tooltip: (0, _CustomTooltip.percentPlotter)("Process")
+ }, {
+ data: home.systemCPU,
+ tooltip: (0, _CustomTooltip.percentPlotter)("System", (0, _CustomTooltip.multiplier)(-1))
+ }), this.doubleChart("all", {
+ data: home.activeMemory,
+ tooltip: (0, _CustomTooltip.bytePlotter)("Active")
+ }, {
+ data: home.virtualMemory,
+ tooltip: (0, _CustomTooltip.bytePlotter)("Virtual", (0, _CustomTooltip.multiplier)(-1))
+ }), this.doubleChart("all", {
+ data: home.diskRead,
+ tooltip: (0, _CustomTooltip.bytePerSecPlotter)("Disk Read")
+ }, {
+ data: home.diskWrite,
+ tooltip: (0, _CustomTooltip.bytePerSecPlotter)("Disk Write", (0, _CustomTooltip.multiplier)(-1))
+ }), this.doubleChart("all", {
+ data: home.networkIngress,
+ tooltip: (0, _CustomTooltip.bytePerSecPlotter)("Download")
+ }, {
+ data: home.networkEgress,
+ tooltip: (0, _CustomTooltip.bytePerSecPlotter)("Upload", (0, _CustomTooltip.multiplier)(-1))
+ }))), _react2.default.createElement(_Grid2.default, {
+ item: !0
+ }, this.info("Geth", general.version), this.info("Commit", general.commit ? general.commit.substring(0, 7) : null)));
+ }
+ } ]), Footer;
+ }(_react.Component);
+ exports.default = (0, _withStyles2.default)(themeStyles)(Footer);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function generateGrid(globalStyles, theme, breakpoint) {
+ var styles = (0, _defineProperty3.default)({}, "grid-" + breakpoint, {
+ flexBasis: 0,
+ flexGrow: 1,
+ maxWidth: "100%"
+ });
+ GRID_SIZES.forEach(function(size) {
+ if ("boolean" != typeof size) {
+ var width = Math.round(size / 12 * Math.pow(10, 6)) / Math.pow(10, 4) + "%";
+ styles["grid-" + breakpoint + "-" + size] = {
+ flexBasis: width,
+ maxWidth: width
+ };
+ }
+ }), "xs" === breakpoint ? (0, _extends3.default)(globalStyles, styles) : globalStyles[theme.breakpoints.up(breakpoint)] = styles;
+ }
+ function generateGutter(theme, breakpoint) {
+ var styles = {};
+ return GUTTERS.forEach(function(spacing, index) {
+ 0 !== index && (styles["spacing-" + breakpoint + "-" + spacing] = {
+ margin: -spacing / 2,
+ width: "calc(100% + " + spacing + "px)",
+ "& > $typeItem": {
+ padding: spacing / 2
+ }
+ });
+ }), styles;
+ }
+ function Grid(props) {
+ var _classNames, alignContent = props.alignContent, alignItems = props.alignItems, classes = props.classes, classNameProp = props.className, Component = props.component, container = props.container, direction = props.direction, hidden = props.hidden, item = props.item, justify = props.justify, lg = props.lg, md = props.md, zeroMinWidth = props.zeroMinWidth, sm = props.sm, spacing = props.spacing, wrap = props.wrap, xl = props.xl, xs = props.xs, other = (0,
+ _objectWithoutProperties3.default)(props, [ "alignContent", "alignItems", "classes", "className", "component", "container", "direction", "hidden", "item", "justify", "lg", "md", "zeroMinWidth", "sm", "spacing", "wrap", "xl", "xs" ]), className = (0,
+ _classnames2.default)((_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.typeContainer, container),
+ (0, _defineProperty3.default)(_classNames, classes.typeItem, item), (0, _defineProperty3.default)(_classNames, classes.zeroMinWidth, zeroMinWidth),
+ (0, _defineProperty3.default)(_classNames, classes["spacing-xs-" + String(spacing)], container && 0 !== spacing),
+ (0, _defineProperty3.default)(_classNames, classes["direction-xs-" + String(direction)], direction !== Grid.defaultProps.direction),
+ (0, _defineProperty3.default)(_classNames, classes["wrap-xs-" + String(wrap)], wrap !== Grid.defaultProps.wrap),
+ (0, _defineProperty3.default)(_classNames, classes["align-items-xs-" + String(alignItems)], alignItems !== Grid.defaultProps.alignItems),
+ (0, _defineProperty3.default)(_classNames, classes["align-content-xs-" + String(alignContent)], alignContent !== Grid.defaultProps.alignContent),
+ (0, _defineProperty3.default)(_classNames, classes["justify-xs-" + String(justify)], justify !== Grid.defaultProps.justify),
+ (0, _defineProperty3.default)(_classNames, classes["grid-xs"], !0 === xs), (0, _defineProperty3.default)(_classNames, classes["grid-xs-" + String(xs)], xs && !0 !== xs),
+ (0, _defineProperty3.default)(_classNames, classes["grid-sm"], !0 === sm), (0, _defineProperty3.default)(_classNames, classes["grid-sm-" + String(sm)], sm && !0 !== sm),
+ (0, _defineProperty3.default)(_classNames, classes["grid-md"], !0 === md), (0, _defineProperty3.default)(_classNames, classes["grid-md-" + String(md)], md && !0 !== md),
+ (0, _defineProperty3.default)(_classNames, classes["grid-lg"], !0 === lg), (0, _defineProperty3.default)(_classNames, classes["grid-lg-" + String(lg)], lg && !0 !== lg),
+ (0, _defineProperty3.default)(_classNames, classes["grid-xl"], !0 === xl), (0, _defineProperty3.default)(_classNames, classes["grid-xl-" + String(xl)], xl && !0 !== xl),
+ _classNames), classNameProp), gridProps = (0, _extends3.default)({
+ className: className
+ }, other);
+ return hidden ? _react2.default.createElement(_Hidden2.default, hidden, _react2.default.createElement(Component, gridProps)) : _react2.default.createElement(Component, gridProps);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.styles = void 0;
+ var _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _createBreakpoints = __webpack_require__(74), _requirePropFactory = __webpack_require__(510), _requirePropFactory2 = _interopRequireDefault(_requirePropFactory), _Hidden = __webpack_require__(511), _Hidden2 = _interopRequireDefault(_Hidden), GUTTERS = [ 0, 8, 16, 24, 40 ], GRID_SIZES = [ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ], styles = exports.styles = function(theme) {
+ return (0, _extends3.default)({
+ typeContainer: {
+ boxSizing: "border-box",
+ display: "flex",
+ flexWrap: "wrap",
+ width: "100%"
+ },
+ typeItem: {
+ boxSizing: "border-box",
+ flex: "0 0 auto",
+ margin: "0"
+ },
+ zeroMinWidth: {
+ minWidth: 0
+ },
+ "direction-xs-column": {
+ flexDirection: "column"
+ },
+ "direction-xs-column-reverse": {
+ flexDirection: "column-reverse"
+ },
+ "direction-xs-row-reverse": {
+ flexDirection: "row-reverse"
+ },
+ "wrap-xs-nowrap": {
+ flexWrap: "nowrap"
+ },
+ "wrap-xs-wrap-reverse": {
+ flexWrap: "wrap-reverse"
+ },
+ "align-items-xs-center": {
+ alignItems: "center"
+ },
+ "align-items-xs-flex-start": {
+ alignItems: "flex-start"
+ },
+ "align-items-xs-flex-end": {
+ alignItems: "flex-end"
+ },
+ "align-items-xs-baseline": {
+ alignItems: "baseline"
+ },
+ "align-content-xs-center": {
+ alignContent: "center"
+ },
+ "align-content-xs-flex-start": {
+ alignContent: "flex-start"
+ },
+ "align-content-xs-flex-end": {
+ alignContent: "flex-end"
+ },
+ "align-content-xs-space-between": {
+ alignContent: "space-between"
+ },
+ "align-content-xs-space-around": {
+ alignContent: "space-around"
+ },
+ "justify-xs-center": {
+ justifyContent: "center"
+ },
+ "justify-xs-flex-end": {
+ justifyContent: "flex-end"
+ },
+ "justify-xs-space-between": {
+ justifyContent: "space-between"
+ },
+ "justify-xs-space-around": {
+ justifyContent: "space-around"
+ }
+ }, generateGutter(theme, "xs"), _createBreakpoints.keys.reduce(function(accumulator, key) {
+ return generateGrid(accumulator, theme, key), accumulator;
+ }, {}));
+ };
+ Grid.propTypes = "production" !== process.env.NODE_ENV ? {
+ alignContent: _propTypes2.default.oneOf([ "stretch", "center", "flex-start", "flex-end", "space-between", "space-around" ]),
+ alignItems: _propTypes2.default.oneOf([ "flex-start", "center", "flex-end", "stretch", "baseline" ]),
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),
+ container: _propTypes2.default.bool,
+ direction: _propTypes2.default.oneOf([ "row", "row-reverse", "column", "column-reverse" ]),
+ hidden: _propTypes2.default.object,
+ item: _propTypes2.default.bool,
+ justify: _propTypes2.default.oneOf([ "flex-start", "center", "flex-end", "space-between", "space-around" ]),
+ lg: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),
+ md: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),
+ sm: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),
+ spacing: _propTypes2.default.oneOf(GUTTERS),
+ wrap: _propTypes2.default.oneOf([ "nowrap", "wrap", "wrap-reverse" ]),
+ xl: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),
+ xs: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),
+ zeroMinWidth: _propTypes2.default.bool
+ } : {}, Grid.defaultProps = {
+ alignContent: "stretch",
+ alignItems: "stretch",
+ component: "div",
+ container: !1,
+ direction: "row",
+ item: !1,
+ justify: "flex-start",
+ zeroMinWidth: !1,
+ spacing: 16,
+ wrap: "wrap"
+ };
+ var GridWrapper = Grid;
+ if ("production" !== process.env.NODE_ENV) {
+ GridWrapper = function(props) {
+ return _react2.default.createElement(Grid, props);
+ };
+ var requireProp = (0, _requirePropFactory2.default)("Grid");
+ GridWrapper.propTypes = {
+ alignContent: requireProp("container"),
+ alignItems: requireProp("container"),
+ direction: requireProp("container"),
+ justify: requireProp("container"),
+ lg: requireProp("item"),
+ md: requireProp("item"),
+ sm: requireProp("item"),
+ spacing: requireProp("container"),
+ wrap: requireProp("container"),
+ xs: requireProp("item"),
+ zeroMinWidth: requireProp("zeroMinWidth")
+ };
+ }
+ exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiGrid"
+ })(GridWrapper);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var requirePropFactory = function(componentNameInError) {
+ return function(requiredProp) {
+ return function(props, propName, componentName, location, propFullName) {
+ var propFullNameSafe = propFullName || propName;
+ return void 0 === props[propName] || props[requiredProp] ? null : new Error("The property ` + ("`" + `" + propFullNameSafe + "`))) + (("`" + (` of ` + "`")) + (`" + componentNameInError + "` + ("`" + ` must be used on `)))) + ((("`" + (`" + requiredProp + "` + "`")) + (`.");
+ };
+ };
+ };
+ exports.default = requirePropFactory;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _Hidden = __webpack_require__(512);
+ Object.defineProperty(exports, "default", {
+ enumerable: !0,
+ get: function() {
+ return _interopRequireDefault(_Hidden).default;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function Hidden(props) {
+ var implementation = props.implementation, other = (0, _objectWithoutProperties3.default)(props, [ "implementation" ]);
+ return "js" === implementation ? _react2.default.createElement(_HiddenJs2.default, other) : _react2.default.createElement(_HiddenCss2.default, other);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _HiddenJs = __webpack_require__(513), _HiddenJs2 = _interopRequireDefault(_HiddenJs), _HiddenCss = __webpack_require__(523), _HiddenCss2 = _interopRequireDefault(_HiddenCss);
+ Hidden.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ className: _propTypes2.default.string,
+ implementation: _propTypes2.default.oneOf([ "js", "css" ]),
+ initialWidth: _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ]),
+ lgDown: _propTypes2.default.bool,
+ lgUp: _propTypes2.default.bool,
+ mdDown: _propTypes2.default.bool,
+ mdUp: _propTypes2.default.bool,
+ only: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ]), _propTypes2.default.arrayOf(_propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ])) ]),
+ smDown: _propTypes2.default.bool,
+ smUp: _propTypes2.default.bool,
+ xlDown: _propTypes2.default.bool,
+ xlUp: _propTypes2.default.bool,
+ xsDown: _propTypes2.default.bool,
+ xsUp: _propTypes2.default.bool
+ } : {}, Hidden.defaultProps = {
+ implementation: "js",
+ lgDown: !1,
+ lgUp: !1,
+ mdDown: !1,
+ mdUp: !1,
+ smDown: !1,
+ smUp: !1,
+ xlDown: !1,
+ xlUp: !1,
+ xsDown: !1,
+ xsUp: !1
+ }, exports.default = Hidden;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function HiddenJs(props) {
+ var children = props.children, only = (props.lgDown, props.lgUp, props.mdDown, props.mdUp,
+ props.only), width = (props.smDown, props.smUp, props.width), other = (props.xlDown,
+ props.xlUp, props.xsDown, props.xsUp, (0, _objectWithoutProperties3.default)(props, [ "children", "lgDown", "lgUp", "mdDown", "mdUp", "only", "smDown", "smUp", "width", "xlDown", "xlUp", "xsDown", "xsUp" ]));
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(0 === (0, _keys2.default)(other).length, "Material-UI: unsupported properties received " + (0,
+ _stringify2.default)(other) + " by ` + ("`" + `<Hidden />`))) + (("`" + (`.");
+ var visible = !0;
+ if (only) if (Array.isArray(only)) for (var i = 0; i < only.length; i += 1) {
+ var breakpoint = only[i];
+ if (width === breakpoint) {
+ visible = !1;
+ break;
+ }
+ } else only && width === only && (visible = !1);
+ if (visible) for (var _i = 0; _i < _createBreakpoints.keys.length; _i += 1) {
+ var _breakpoint = _createBreakpoints.keys[_i], breakpointUp = props[_breakpoint + "Up"], breakpointDown = props[_breakpoint + "Down"];
+ if (breakpointUp && (0, _withWidth.isWidthUp)(_breakpoint, width) || breakpointDown && (0,
+ _withWidth.isWidthDown)(_breakpoint, width)) {
+ visible = !1;
+ break;
+ }
+ }
+ return visible ? children : null;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _stringify = __webpack_require__(514), _stringify2 = _interopRequireDefault(_stringify), _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _createBreakpoints = __webpack_require__(74), _withWidth = __webpack_require__(516), _withWidth2 = _interopRequireDefault(_withWidth);
+ HiddenJs.propTypes = {
+ children: _propTypes2.default.node,
+ className: _propTypes2.default.string,
+ implementation: _propTypes2.default.oneOf([ "js", "css" ]),
+ initialWidth: _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ]),
+ lgDown: _propTypes2.default.bool,
+ lgUp: _propTypes2.default.bool,
+ mdDown: _propTypes2.default.bool,
+ mdUp: _propTypes2.default.bool,
+ only: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ]), _propTypes2.default.arrayOf(_propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ])) ]),
+ smDown: _propTypes2.default.bool,
+ smUp: _propTypes2.default.bool,
+ width: _propTypes2.default.string.isRequired,
+ xlDown: _propTypes2.default.bool,
+ xlUp: _propTypes2.default.bool,
+ xsDown: _propTypes2.default.bool,
+ xsUp: _propTypes2.default.bool
+ }, exports.default = (0, _withWidth2.default)()(HiddenJs);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ module.exports = {
+ default: __webpack_require__(515),
+ __esModule: !0
+ };
+}, function(module, exports, __webpack_require__) {
+ var core = __webpack_require__(17), $JSON = core.JSON || (core.JSON = {
+ stringify: JSON.stringify
+ });
+ module.exports = function(it) {
+ return $JSON.stringify.apply($JSON, arguments);
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.isWidthDown = exports.isWidthUp = void 0;
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _reactEventListener = __webpack_require__(517), _reactEventListener2 = _interopRequireDefault(_reactEventListener), _debounce = __webpack_require__(157), _debounce2 = _interopRequireDefault(_debounce), _wrapDisplayName = __webpack_require__(75), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _hoistNonReactStatics = __webpack_require__(152), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _withTheme = __webpack_require__(522), _withTheme2 = _interopRequireDefault(_withTheme), _createBreakpoints = __webpack_require__(74), withWidth = (exports.isWidthUp = function(breakpoint, width) {
+ return arguments.length > 2 && void 0 !== arguments[2] && !arguments[2] ? _createBreakpoints.keys.indexOf(breakpoint) < _createBreakpoints.keys.indexOf(width) : _createBreakpoints.keys.indexOf(breakpoint) <= _createBreakpoints.keys.indexOf(width);
+ }, exports.isWidthDown = function(breakpoint, width) {
+ return arguments.length > 2 && void 0 !== arguments[2] && !arguments[2] ? _createBreakpoints.keys.indexOf(width) < _createBreakpoints.keys.indexOf(breakpoint) : _createBreakpoints.keys.indexOf(width) <= _createBreakpoints.keys.indexOf(breakpoint);
+ }, function() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
+ return function(Component) {
+ var _options$resizeInterv = options.resizeInterval, resizeInterval = void 0 === _options$resizeInterv ? 166 : _options$resizeInterv, _options$withTheme = options.withTheme, withThemeOption = void 0 !== _options$withTheme && _options$withTheme, WithWidth = function(_React$Component) {
+ function WithWidth() {
+ var _ref, _temp, _this, _ret;
+ (0, _classCallCheck3.default)(this, WithWidth);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = WithWidth.__proto__ || (0,
+ _getPrototypeOf2.default)(WithWidth)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ width: void 0
+ }, _this.handleResize = (0, _debounce2.default)(function() {
+ _this.updateWidth(window.innerWidth);
+ }, resizeInterval), _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);
+ }
+ return (0, _inherits3.default)(WithWidth, _React$Component), (0, _createClass3.default)(WithWidth, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.updateWidth(window.innerWidth);
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.handleResize.cancel();
+ }
+ }, {
+ key: "updateWidth",
+ value: function(innerWidth) {
+ for (var breakpoints = this.props.theme.breakpoints, width = null, index = 1; null === width && index < _createBreakpoints.keys.length; ) {
+ var currentWidth = _createBreakpoints.keys[index];
+ if (innerWidth < breakpoints.values[currentWidth]) {
+ width = _createBreakpoints.keys[index - 1];
+ break;
+ }
+ index += 1;
+ }
+ (width = width || "xl") !== this.state.width && this.setState({
+ width: width
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props = this.props, initialWidth = _props.initialWidth, theme = _props.theme, width = _props.width, other = (0,
+ _objectWithoutProperties3.default)(_props, [ "initialWidth", "theme", "width" ]), props = (0,
+ _extends3.default)({
+ width: width || this.state.width || initialWidth
+ }, other), more = {};
+ return withThemeOption && (more.theme = theme), void 0 === props.width ? null : _react2.default.createElement(_reactEventListener2.default, {
+ target: "window",
+ onResize: this.handleResize
+ }, _react2.default.createElement(Component, (0, _extends3.default)({}, more, props)));
+ }
+ } ]), WithWidth;
+ }(_react2.default.Component);
+ return WithWidth.propTypes = "production" !== process.env.NODE_ENV ? {
+ initialWidth: _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ]),
+ theme: _propTypes2.default.object.isRequired,
+ width: _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ])
+ } : {}, "production" !== process.env.NODE_ENV && (WithWidth.displayName = (0, _wrapDisplayName2.default)(Component, "WithWidth")),
+ (0, _hoistNonReactStatics2.default)(WithWidth, Component), (0, _withTheme2.default)()(WithWidth);
+ };
+ });
+ exports.default = withWidth;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function mergeDefaultEventOptions(options) {
+ return (0, _assign2.default)({}, defaultEventOptions, options);
+ }
+ function getEventListenerArgs(eventName, callback, options) {
+ var args = [ eventName, callback ];
+ return args.push(_supports.passiveOption ? options : options.capture), args;
+ }
+ function on(target, eventName, callback, options) {
+ target.addEventListener.apply(target, getEventListenerArgs(eventName, callback, options));
+ }
+ function off(target, eventName, callback, options) {
+ target.removeEventListener.apply(target, getEventListenerArgs(eventName, callback, options));
+ }
+ function forEachListener(props, iteratee) {
+ var eventProps = (props.children, props.target, (0, _objectWithoutProperties3.default)(props, [ "children", "target" ]));
+ (0, _keys2.default)(eventProps).forEach(function(name) {
+ if ("on" === name.substring(0, 2)) {
+ var prop = eventProps[name], type = void 0 === prop ? "undefined" : (0, _typeof3.default)(prop), isObject = "object" === type, isFunction = "function" === type;
+ if (isObject || isFunction) {
+ var capture = "capture" === name.substr(-7).toLowerCase(), eventName = name.substring(2).toLowerCase();
+ eventName = capture ? eventName.substring(0, eventName.length - 7) : eventName,
+ isObject ? iteratee(eventName, prop.handler, prop.options) : iteratee(eventName, prop, mergeDefaultEventOptions({
+ capture: capture
+ }));
+ }
+ }
+ });
+ }
+ function withOptions(handler, options) {
+ return "production" !== process.env.NODE_ENV && (0, _warning2.default)(options, "react-event-listener: should be specified options in withOptions."),
+ {
+ handler: handler,
+ options: mergeDefaultEventOptions(options)
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _typeof2 = __webpack_require__(100), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _assign = __webpack_require__(205), _assign2 = _interopRequireDefault(_assign);
+ exports.withOptions = withOptions;
+ var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _shallowEqual = __webpack_require__(96), _shallowEqual2 = _interopRequireDefault(_shallowEqual), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _supports = __webpack_require__(518), defaultEventOptions = {
+ capture: !1,
+ passive: !1
+ }, EventListener = function(_React$Component) {
+ function EventListener() {
+ return (0, _classCallCheck3.default)(this, EventListener), (0, _possibleConstructorReturn3.default)(this, (EventListener.__proto__ || (0,
+ _getPrototypeOf2.default)(EventListener)).apply(this, arguments));
+ }
+ return (0, _inherits3.default)(EventListener, _React$Component), (0, _createClass3.default)(EventListener, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.addListeners();
+ }
+ }, {
+ key: "shouldComponentUpdate",
+ value: function(nextProps) {
+ return !(0, _shallowEqual2.default)(this.props, nextProps);
+ }
+ }, {
+ key: "componentWillUpdate",
+ value: function() {
+ this.removeListeners();
+ }
+ }, {
+ key: "componentDidUpdate",
+ value: function() {
+ this.addListeners();
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.removeListeners();
+ }
+ }, {
+ key: "addListeners",
+ value: function() {
+ this.applyListeners(on);
+ }
+ }, {
+ key: "removeListeners",
+ value: function() {
+ this.applyListeners(off);
+ }
+ }, {
+ key: "applyListeners",
+ value: function(onOrOff) {
+ var target = this.props.target;
+ if (target) {
+ var element = target;
+ "string" == typeof target && (element = window[target]), forEachListener(this.props, onOrOff.bind(null, element));
+ }
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return this.props.children || null;
+ }
+ } ]), EventListener;
+ }(_react2.default.Component);
+ EventListener.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ target: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.string ]).isRequired
+ } : {}, exports.default = EventListener;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function defineProperty(object, property, attr) {
+ return (0, _defineProperty2.default)(object, property, attr);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.passiveOption = void 0;
+ var _defineProperty = __webpack_require__(143), _defineProperty2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_defineProperty);
+ exports.passiveOption = function() {
+ var cache = null;
+ return function() {
+ if (null !== cache) return cache;
+ var supportsPassiveOption = !1;
+ try {
+ window.addEventListener("test", null, defineProperty({}, "passive", {
+ get: function() {
+ supportsPassiveOption = !0;
+ }
+ }));
+ } catch (err) {}
+ return cache = supportsPassiveOption, supportsPassiveOption;
+ }();
+ }();
+ exports.default = {};
+}, function(module, exports, __webpack_require__) {
+ var root = __webpack_require__(32), now = function() {
+ return root.Date.now();
+ };
+ module.exports = now;
+}, function(module, exports, __webpack_require__) {
+ function getRawTag(value) {
+ var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
+ try {
+ value[symToStringTag] = void 0;
+ var unmasked = !0;
+ } catch (e) {}
+ var result = nativeObjectToString.call(value);
+ return unmasked && (isOwn ? value[symToStringTag] = tag : delete value[symToStringTag]),
+ result;
+ }
+ var Symbol = __webpack_require__(77), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, nativeObjectToString = objectProto.toString, symToStringTag = Symbol ? Symbol.toStringTag : void 0;
+ module.exports = getRawTag;
+}, function(module, exports) {
+ function objectToString(value) {
+ return nativeObjectToString.call(value);
+ }
+ var objectProto = Object.prototype, nativeObjectToString = objectProto.toString;
+ module.exports = objectToString;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function getDefaultTheme() {
+ return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)());
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends2 = __webpack_require__(7), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _hoistNonReactStatics = __webpack_require__(152), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _wrapDisplayName = __webpack_require__(75), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _createMuiTheme = __webpack_require__(151), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(150), _themeListener2 = _interopRequireDefault(_themeListener), defaultTheme = void 0, withTheme = function() {
+ return function(Component) {
+ var WithTheme = function(_React$Component) {
+ function WithTheme(props, context) {
+ (0, _classCallCheck3.default)(this, WithTheme);
+ var _this = (0, _possibleConstructorReturn3.default)(this, (WithTheme.__proto__ || (0,
+ _getPrototypeOf2.default)(WithTheme)).call(this, props, context));
+ return _this.state = {}, _this.unsubscribeId = null, _this.state = {
+ theme: _themeListener2.default.initial(context) || getDefaultTheme()
+ }, _this;
+ }
+ return (0, _inherits3.default)(WithTheme, _React$Component), (0, _createClass3.default)(WithTheme, [ {
+ key: "componentDidMount",
+ value: function() {
+ var _this2 = this;
+ this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) {
+ _this2.setState({
+ theme: theme
+ });
+ });
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return _react2.default.createElement(Component, (0, _extends3.default)({
+ theme: this.state.theme
+ }, this.props));
+ }
+ } ]), WithTheme;
+ }(_react2.default.Component);
+ return WithTheme.contextTypes = _themeListener2.default.contextTypes, "production" !== process.env.NODE_ENV && (WithTheme.displayName = (0,
+ _wrapDisplayName2.default)(Component, "WithTheme")), (0, _hoistNonReactStatics2.default)(WithTheme, Component),
+ "production" !== process.env.NODE_ENV && (WithTheme.Naked = Component), WithTheme;
+ };
+ };
+ exports.default = withTheme;
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ (function(process) {
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function HiddenCss(props) {
+ var children = props.children, classes = props.classes, only = (props.lgDown, props.lgUp,
+ props.mdDown, props.mdUp, props.only), other = (props.smDown, props.smUp, props.xlDown,
+ props.xlUp, props.xsDown, props.xsUp, (0, _objectWithoutProperties3.default)(props, [ "children", "classes", "lgDown", "lgUp", "mdDown", "mdUp", "only", "smDown", "smUp", "xlDown", "xlUp", "xsDown", "xsUp" ]));
+ "production" !== process.env.NODE_ENV && (0, _warning2.default)(0 === (0, _keys2.default)(other).length || 1 === (0,
+ _keys2.default)(other).length && other.hasOwnProperty("ref"), "Material-UI: unsupported properties received " + (0,
+ _keys2.default)(other).join(", ") + " by ` + "`")) + (`<Hidden />` + ("`" + `.");
+ for (var className = [], i = 0; i < _createBreakpoints.keys.length; i += 1) {
+ var breakpoint = _createBreakpoints.keys[i], breakpointUp = props[breakpoint + "Up"], breakpointDown = props[breakpoint + "Down"];
+ breakpointUp && className.push(classes[breakpoint + "Up"]), breakpointDown && className.push(classes[breakpoint + "Down"]);
+ }
+ if (only) {
+ (Array.isArray(only) ? only : [ only ]).forEach(function(breakpoint) {
+ className.push(classes["only" + (0, _helpers.capitalizeFirstLetter)(breakpoint)]);
+ });
+ }
+ return _react2.default.createElement("div", {
+ className: className
+ }, children);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _keys = __webpack_require__(41), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(6), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _defineProperty2 = __webpack_require__(13), _defineProperty3 = _interopRequireDefault(_defineProperty2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _createBreakpoints = __webpack_require__(74), _helpers = __webpack_require__(52), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = function(theme) {
+ var hidden = {
+ display: "none"
+ };
+ return _createBreakpoints.keys.reduce(function(acc, key) {
+ return acc["only" + (0, _helpers.capitalizeFirstLetter)(key)] = (0, _defineProperty3.default)({}, theme.breakpoints.only(key), hidden),
+ acc[key + "Up"] = (0, _defineProperty3.default)({}, theme.breakpoints.up(key), hidden),
+ acc[key + "Down"] = (0, _defineProperty3.default)({}, theme.breakpoints.down(key), hidden),
+ acc;
+ }, {});
+ };
+ HiddenCss.propTypes = "production" !== process.env.NODE_ENV ? {
+ children: _propTypes2.default.node,
+ classes: _propTypes2.default.object.isRequired,
+ className: _propTypes2.default.string,
+ implementation: _propTypes2.default.oneOf([ "js", "css" ]),
+ lgDown: _propTypes2.default.bool,
+ lgUp: _propTypes2.default.bool,
+ mdDown: _propTypes2.default.bool,
+ mdUp: _propTypes2.default.bool,
+ only: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ]), _propTypes2.default.arrayOf(_propTypes2.default.oneOf([ "xs", "sm", "md", "lg", "xl" ])) ]),
+ smDown: _propTypes2.default.bool,
+ smUp: _propTypes2.default.bool,
+ xlDown: _propTypes2.default.bool,
+ xlUp: _propTypes2.default.bool,
+ xsDown: _propTypes2.default.bool,
+ xsUp: _propTypes2.default.bool
+ } : {}, exports.default = (0, _withStyles2.default)(styles, {
+ name: "MuiHiddenCss"
+ })(HiddenCss);
+ }).call(exports, __webpack_require__(2));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: !0
+ });
+ var __WEBPACK_IMPORTED_MODULE_1__container_Surface__ = (__webpack_require__(525),
+ __webpack_require__(78));
+ __webpack_require__.d(__webpack_exports__, "Surface", function() {
+ return __WEBPACK_IMPORTED_MODULE_1__container_Surface__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14);
+ __webpack_require__.d(__webpack_exports__, "Layer", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__container_Layer__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_3__component_Legend__ = __webpack_require__(171);
+ __webpack_require__.d(__webpack_exports__, "Legend", function() {
+ return __WEBPACK_IMPORTED_MODULE_3__component_Legend__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_4__component_Tooltip__ = __webpack_require__(122);
+ __webpack_require__.d(__webpack_exports__, "Tooltip", function() {
+ return __WEBPACK_IMPORTED_MODULE_4__component_Tooltip__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_5__component_ResponsiveContainer__ = __webpack_require__(682);
+ __webpack_require__.d(__webpack_exports__, "ResponsiveContainer", function() {
+ return __WEBPACK_IMPORTED_MODULE_5__component_ResponsiveContainer__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_6__component_Cell__ = __webpack_require__(85);
+ __webpack_require__.d(__webpack_exports__, "Cell", function() {
+ return __WEBPACK_IMPORTED_MODULE_6__component_Cell__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_7__component_Text__ = __webpack_require__(55);
+ __webpack_require__.d(__webpack_exports__, "Text", function() {
+ return __WEBPACK_IMPORTED_MODULE_7__component_Text__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_8__component_Label__ = __webpack_require__(43);
+ __webpack_require__.d(__webpack_exports__, "Label", function() {
+ return __WEBPACK_IMPORTED_MODULE_8__component_Label__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_9__component_LabelList__ = __webpack_require__(45);
+ __webpack_require__.d(__webpack_exports__, "LabelList", function() {
+ return __WEBPACK_IMPORTED_MODULE_9__component_LabelList__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_10__shape_Sector__ = __webpack_require__(128);
+ __webpack_require__.d(__webpack_exports__, "Sector", function() {
+ return __WEBPACK_IMPORTED_MODULE_10__shape_Sector__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_11__shape_Curve__ = __webpack_require__(66);
+ __webpack_require__.d(__webpack_exports__, "Curve", function() {
+ return __WEBPACK_IMPORTED_MODULE_11__shape_Curve__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_12__shape_Rectangle__ = __webpack_require__(65);
+ __webpack_require__.d(__webpack_exports__, "Rectangle", function() {
+ return __WEBPACK_IMPORTED_MODULE_12__shape_Rectangle__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_13__shape_Polygon__ = __webpack_require__(195);
+ __webpack_require__.d(__webpack_exports__, "Polygon", function() {
+ return __WEBPACK_IMPORTED_MODULE_13__shape_Polygon__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_14__shape_Dot__ = __webpack_require__(57);
+ __webpack_require__.d(__webpack_exports__, "Dot", function() {
+ return __WEBPACK_IMPORTED_MODULE_14__shape_Dot__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_15__shape_Cross__ = __webpack_require__(323);
+ __webpack_require__.d(__webpack_exports__, "Cross", function() {
+ return __WEBPACK_IMPORTED_MODULE_15__shape_Cross__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_16__shape_Symbols__ = __webpack_require__(172);
+ __webpack_require__.d(__webpack_exports__, "Symbols", function() {
+ return __WEBPACK_IMPORTED_MODULE_16__shape_Symbols__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_17__polar_PolarGrid__ = __webpack_require__(782);
+ __webpack_require__.d(__webpack_exports__, "PolarGrid", function() {
+ return __WEBPACK_IMPORTED_MODULE_17__polar_PolarGrid__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_18__polar_PolarRadiusAxis__ = __webpack_require__(129);
+ __webpack_require__.d(__webpack_exports__, "PolarRadiusAxis", function() {
+ return __WEBPACK_IMPORTED_MODULE_18__polar_PolarRadiusAxis__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_19__polar_PolarAngleAxis__ = __webpack_require__(130);
+ __webpack_require__.d(__webpack_exports__, "PolarAngleAxis", function() {
+ return __WEBPACK_IMPORTED_MODULE_19__polar_PolarAngleAxis__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_20__polar_Pie__ = __webpack_require__(325);
+ __webpack_require__.d(__webpack_exports__, "Pie", function() {
+ return __WEBPACK_IMPORTED_MODULE_20__polar_Pie__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_21__polar_Radar__ = __webpack_require__(326);
+ __webpack_require__.d(__webpack_exports__, "Radar", function() {
+ return __WEBPACK_IMPORTED_MODULE_21__polar_Radar__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_22__polar_RadialBar__ = __webpack_require__(327);
+ __webpack_require__.d(__webpack_exports__, "RadialBar", function() {
+ return __WEBPACK_IMPORTED_MODULE_22__polar_RadialBar__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_23__cartesian_Brush__ = __webpack_require__(328);
+ __webpack_require__.d(__webpack_exports__, "Brush", function() {
+ return __WEBPACK_IMPORTED_MODULE_23__cartesian_Brush__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_24__cartesian_ReferenceLine__ = __webpack_require__(321);
+ __webpack_require__.d(__webpack_exports__, "ReferenceLine", function() {
+ return __WEBPACK_IMPORTED_MODULE_24__cartesian_ReferenceLine__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_25__cartesian_ReferenceDot__ = __webpack_require__(320);
+ __webpack_require__.d(__webpack_exports__, "ReferenceDot", function() {
+ return __WEBPACK_IMPORTED_MODULE_25__cartesian_ReferenceDot__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_26__cartesian_ReferenceArea__ = __webpack_require__(322);
+ __webpack_require__.d(__webpack_exports__, "ReferenceArea", function() {
+ return __WEBPACK_IMPORTED_MODULE_26__cartesian_ReferenceArea__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_27__cartesian_CartesianAxis__ = __webpack_require__(330);
+ __webpack_require__.d(__webpack_exports__, "CartesianAxis", function() {
+ return __WEBPACK_IMPORTED_MODULE_27__cartesian_CartesianAxis__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_28__cartesian_CartesianGrid__ = __webpack_require__(788);
+ __webpack_require__.d(__webpack_exports__, "CartesianGrid", function() {
+ return __WEBPACK_IMPORTED_MODULE_28__cartesian_CartesianGrid__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_29__cartesian_Line__ = __webpack_require__(196);
+ __webpack_require__.d(__webpack_exports__, "Line", function() {
+ return __WEBPACK_IMPORTED_MODULE_29__cartesian_Line__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_30__cartesian_Area__ = __webpack_require__(197);
+ __webpack_require__.d(__webpack_exports__, "Area", function() {
+ return __WEBPACK_IMPORTED_MODULE_30__cartesian_Area__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_31__cartesian_Bar__ = __webpack_require__(198);
+ __webpack_require__.d(__webpack_exports__, "Bar", function() {
+ return __WEBPACK_IMPORTED_MODULE_31__cartesian_Bar__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_32__cartesian_Scatter__ = __webpack_require__(199);
+ __webpack_require__.d(__webpack_exports__, "Scatter", function() {
+ return __WEBPACK_IMPORTED_MODULE_32__cartesian_Scatter__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_33__cartesian_XAxis__ = __webpack_require__(67);
+ __webpack_require__.d(__webpack_exports__, "XAxis", function() {
+ return __WEBPACK_IMPORTED_MODULE_33__cartesian_XAxis__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_34__cartesian_YAxis__ = __webpack_require__(68);
+ __webpack_require__.d(__webpack_exports__, "YAxis", function() {
+ return __WEBPACK_IMPORTED_MODULE_34__cartesian_YAxis__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_35__cartesian_ZAxis__ = __webpack_require__(131);
+ __webpack_require__.d(__webpack_exports__, "ZAxis", function() {
+ return __WEBPACK_IMPORTED_MODULE_35__cartesian_ZAxis__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_36__cartesian_ErrorBar__ = __webpack_require__(91);
+ __webpack_require__.d(__webpack_exports__, "ErrorBar", function() {
+ return __WEBPACK_IMPORTED_MODULE_36__cartesian_ErrorBar__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_37__chart_LineChart__ = __webpack_require__(789);
+ __webpack_require__.d(__webpack_exports__, "LineChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_37__chart_LineChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_38__chart_BarChart__ = __webpack_require__(793);
+ __webpack_require__.d(__webpack_exports__, "BarChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_38__chart_BarChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_39__chart_PieChart__ = __webpack_require__(794);
+ __webpack_require__.d(__webpack_exports__, "PieChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_39__chart_PieChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_40__chart_Treemap__ = __webpack_require__(795);
+ __webpack_require__.d(__webpack_exports__, "Treemap", function() {
+ return __WEBPACK_IMPORTED_MODULE_40__chart_Treemap__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_41__chart_Sankey__ = __webpack_require__(796);
+ __webpack_require__.d(__webpack_exports__, "Sankey", function() {
+ return __WEBPACK_IMPORTED_MODULE_41__chart_Sankey__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_42__chart_RadarChart__ = __webpack_require__(799);
+ __webpack_require__.d(__webpack_exports__, "RadarChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_42__chart_RadarChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_43__chart_ScatterChart__ = __webpack_require__(800);
+ __webpack_require__.d(__webpack_exports__, "ScatterChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_43__chart_ScatterChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_44__chart_AreaChart__ = __webpack_require__(801);
+ __webpack_require__.d(__webpack_exports__, "AreaChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_44__chart_AreaChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_45__chart_RadialBarChart__ = __webpack_require__(802);
+ __webpack_require__.d(__webpack_exports__, "RadialBarChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_45__chart_RadialBarChart__.a;
+ });
+ var __WEBPACK_IMPORTED_MODULE_46__chart_ComposedChart__ = __webpack_require__(803);
+ __webpack_require__.d(__webpack_exports__, "ComposedChart", function() {
+ return __WEBPACK_IMPORTED_MODULE_46__chart_ComposedChart__.a;
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_core_js_es6_math__ = __webpack_require__(526), testObject = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_core_js_es6_math__),
+ {});
+ if (!Object.setPrototypeOf && !testObject.__proto__) {
+ var nativeGetPrototypeOf = Object.getPrototypeOf;
+ Object.getPrototypeOf = function(object) {
+ return object.__proto__ ? object.__proto__ : nativeGetPrototypeOf.call(Object, object);
+ };
+ }
+}, function(module, exports, __webpack_require__) {
+ __webpack_require__(527), __webpack_require__(539), __webpack_require__(540), __webpack_require__(541),
+ __webpack_require__(542), __webpack_require__(543), __webpack_require__(544), __webpack_require__(545),
+ __webpack_require__(547), __webpack_require__(548), __webpack_require__(549), __webpack_require__(550),
+ __webpack_require__(551), __webpack_require__(552), __webpack_require__(553), __webpack_require__(554),
+ __webpack_require__(555), module.exports = __webpack_require__(159).Math;
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), log1p = __webpack_require__(245), sqrt = Math.sqrt, $acosh = Math.acosh;
+ $export($export.S + $export.F * !($acosh && 710 == Math.floor($acosh(Number.MAX_VALUE)) && $acosh(1 / 0) == 1 / 0), "Math", {
+ acosh: function(x) {
+ return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var anObject = __webpack_require__(529), IE8_DOM_DEFINE = __webpack_require__(530), toPrimitive = __webpack_require__(532), dP = Object.defineProperty;
+ exports.f = __webpack_require__(161) ? Object.defineProperty : function(O, P, Attributes) {
+ if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) {}
+ if ("get" in Attributes || "set" in Attributes) throw TypeError("Accessors not supported!");
+ return "value" in Attributes && (O[P] = Attributes.value), O;
+ };
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(160);
+ module.exports = function(it) {
+ if (!isObject(it)) throw TypeError(it + " is not an object!");
+ return it;
+ };
+}, function(module, exports, __webpack_require__) {
+ module.exports = !__webpack_require__(161) && !__webpack_require__(110)(function() {
+ return 7 != Object.defineProperty(__webpack_require__(531)("div"), "a", {
+ get: function() {
+ return 7;
+ }
+ }).a;
+ });
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(160), document = __webpack_require__(158).document, is = isObject(document) && isObject(document.createElement);
+ module.exports = function(it) {
+ return is ? document.createElement(it) : {};
+ };
+}, function(module, exports, __webpack_require__) {
+ var isObject = __webpack_require__(160);
+ module.exports = function(it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && "function" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;
+ if ("function" == typeof (fn = it.valueOf) && !isObject(val = fn.call(it))) return val;
+ if (!S && "function" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+ };
+}, function(module, exports) {
+ module.exports = function(bitmap, value) {
+ return {
+ enumerable: !(1 & bitmap),
+ configurable: !(2 & bitmap),
+ writable: !(4 & bitmap),
+ value: value
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ var global = __webpack_require__(158), hide = __webpack_require__(244), has = __webpack_require__(535), SRC = __webpack_require__(536)("src"), $toString = Function.toString, TPL = ("" + $toString).split("toString");
+ __webpack_require__(159).inspectSource = function(it) {
+ return $toString.call(it);
+ }, (module.exports = function(O, key, val, safe) {
+ var isFunction = "function" == typeof val;
+ isFunction && (has(val, "name") || hide(val, "name", key)), O[key] !== val && (isFunction && (has(val, SRC) || hide(val, SRC, O[key] ? "" + O[key] : TPL.join(String(key)))),
+ O === global ? O[key] = val : safe ? O[key] ? O[key] = val : hide(O, key, val) : (delete O[key],
+ hide(O, key, val)));
+ })(Function.prototype, "toString", function() {
+ return "function" == typeof this && this[SRC] || $toString.call(this);
+ });
+}, function(module, exports) {
+ var hasOwnProperty = {}.hasOwnProperty;
+ module.exports = function(it, key) {
+ return hasOwnProperty.call(it, key);
+ };
+}, function(module, exports) {
+ var id = 0, px = Math.random();
+ module.exports = function(key) {
+ return "Symbol(".concat(void 0 === key ? "" : key, ")_", (++id + px).toString(36));
+ };
+}, function(module, exports, __webpack_require__) {
+ var aFunction = __webpack_require__(538);
+ module.exports = function(fn, that, length) {
+ if (aFunction(fn), void 0 === that) return fn;
+ switch (length) {
+ case 1:
+ return function(a) {
+ return fn.call(that, a);
+ };
+
+ case 2:
+ return function(a, b) {
+ return fn.call(that, a, b);
+ };
+
+ case 3:
+ return function(a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function() {
+ return fn.apply(that, arguments);
+ };
+ };
+}, function(module, exports) {
+ module.exports = function(it) {
+ if ("function" != typeof it) throw TypeError(it + " is not a function!");
+ return it;
+ };
+}, function(module, exports, __webpack_require__) {
+ function asinh(x) {
+ return isFinite(x = +x) && 0 != x ? x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)) : x;
+ }
+ var $export = __webpack_require__(15), $asinh = Math.asinh;
+ $export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), "Math", {
+ asinh: asinh
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), $atanh = Math.atanh;
+ $export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), "Math", {
+ atanh: function(x) {
+ return 0 == (x = +x) ? x : Math.log((1 + x) / (1 - x)) / 2;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), sign = __webpack_require__(162);
+ $export($export.S, "Math", {
+ cbrt: function(x) {
+ return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ clz32: function(x) {
+ return (x >>>= 0) ? 31 - Math.floor(Math.log(x + .5) * Math.LOG2E) : 32;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), exp = Math.exp;
+ $export($export.S, "Math", {
+ cosh: function(x) {
+ return (exp(x = +x) + exp(-x)) / 2;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), $expm1 = __webpack_require__(163);
+ $export($export.S + $export.F * ($expm1 != Math.expm1), "Math", {
+ expm1: $expm1
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ fround: __webpack_require__(546)
+ });
+}, function(module, exports, __webpack_require__) {
+ var sign = __webpack_require__(162), pow = Math.pow, EPSILON = pow(2, -52), EPSILON32 = pow(2, -23), MAX32 = pow(2, 127) * (2 - EPSILON32), MIN32 = pow(2, -126), roundTiesToEven = function(n) {
+ return n + 1 / EPSILON - 1 / EPSILON;
+ };
+ module.exports = Math.fround || function(x) {
+ var a, result, $abs = Math.abs(x), $sign = sign(x);
+ return $abs < MIN32 ? $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32 : (a = (1 + EPSILON32 / EPSILON) * $abs,
+ result = a - (a - $abs), result > MAX32 || result != result ? $sign * (1 / 0) : $sign * result);
+ };
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), abs = Math.abs;
+ $export($export.S, "Math", {
+ hypot: function(value1, value2) {
+ for (var arg, div, sum = 0, i = 0, aLen = arguments.length, larg = 0; i < aLen; ) arg = abs(arguments[i++]),
+ larg < arg ? (div = larg / arg, sum = sum * div * div + 1, larg = arg) : arg > 0 ? (div = arg / larg,
+ sum += div * div) : sum += arg;
+ return larg === 1 / 0 ? 1 / 0 : larg * Math.sqrt(sum);
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), $imul = Math.imul;
+ $export($export.S + $export.F * __webpack_require__(110)(function() {
+ return -5 != $imul(4294967295, 5) || 2 != $imul.length;
+ }), "Math", {
+ imul: function(x, y) {
+ var xn = +x, yn = +y, xl = 65535 & xn, yl = 65535 & yn;
+ return 0 | xl * yl + ((65535 & xn >>> 16) * yl + xl * (65535 & yn >>> 16) << 16 >>> 0);
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ log10: function(x) {
+ return Math.log(x) * Math.LOG10E;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ log1p: __webpack_require__(245)
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ log2: function(x) {
+ return Math.log(x) / Math.LN2;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ sign: __webpack_require__(162)
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), expm1 = __webpack_require__(163), exp = Math.exp;
+ $export($export.S + $export.F * __webpack_require__(110)(function() {
+ return -2e-17 != !Math.sinh(-2e-17);
+ }), "Math", {
+ sinh: function(x) {
+ return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15), expm1 = __webpack_require__(163), exp = Math.exp;
+ $export($export.S, "Math", {
+ tanh: function(x) {
+ var a = expm1(x = +x), b = expm1(-x);
+ return a == 1 / 0 ? 1 : b == 1 / 0 ? -1 : (a - b) / (exp(x) + exp(-x));
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var $export = __webpack_require__(15);
+ $export($export.S, "Math", {
+ trunc: function(it) {
+ return (it > 0 ? Math.floor : Math.ceil)(it);
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ var memoizeCapped = __webpack_require__(557), reLeadingDot = /^\./, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, reEscapeChar = /\\(\\)?/g, stringToPath = memoizeCapped(function(string) {
+ var result = [];
+ return reLeadingDot.test(string) && result.push(""), string.replace(rePropName, function(match, number, quote, string) {
+ result.push(quote ? string.replace(reEscapeChar, "$1") : number || match);
+ }), result;
+ });
+ module.exports = stringToPath;
+}, function(module, exports, __webpack_require__) {
+ function memoizeCapped(func) {
+ var result = memoize(func, function(key) {
+ return cache.size === MAX_MEMOIZE_SIZE && cache.clear(), key;
+ }), cache = result.cache;
+ return result;
+ }
+ var memoize = __webpack_require__(558), MAX_MEMOIZE_SIZE = 500;
+ module.exports = memoizeCapped;
+}, function(module, exports, __webpack_require__) {
+ function memoize(func, resolver) {
+ if ("function" != typeof func || null != resolver && "function" != typeof resolver) throw new TypeError(FUNC_ERROR_TEXT);
+ var memoized = function() {
+ var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
+ if (cache.has(key)) return cache.get(key);
+ var result = func.apply(this, args);
+ return memoized.cache = cache.set(key, result) || cache, result;
+ };
+ return memoized.cache = new (memoize.Cache || MapCache)(), memoized;
+ }
+ var MapCache = __webpack_require__(167), FUNC_ERROR_TEXT = "Expected a function";
+ memoize.Cache = MapCache, module.exports = memoize;
+}, function(module, exports, __webpack_require__) {
+ function mapCacheClear() {
+ this.size = 0, this.__data__ = {
+ hash: new Hash(),
+ map: new (Map || ListCache)(),
+ string: new Hash()
+ };
+ }
+ var Hash = __webpack_require__(560), ListCache = __webpack_require__(112), Map = __webpack_require__(169);
+ module.exports = mapCacheClear;
+}, function(module, exports, __webpack_require__) {
+ function Hash(entries) {
+ var index = -1, length = null == entries ? 0 : entries.length;
+ for (this.clear(); ++index < length; ) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+ var hashClear = __webpack_require__(561), hashDelete = __webpack_require__(566), hashGet = __webpack_require__(567), hashHas = __webpack_require__(568), hashSet = __webpack_require__(569);
+ Hash.prototype.clear = hashClear, Hash.prototype.delete = hashDelete, Hash.prototype.get = hashGet,
+ Hash.prototype.has = hashHas, Hash.prototype.set = hashSet, module.exports = Hash;
+}, function(module, exports, __webpack_require__) {
+ function hashClear() {
+ this.__data__ = nativeCreate ? nativeCreate(null) : {}, this.size = 0;
+ }
+ var nativeCreate = __webpack_require__(111);
+ module.exports = hashClear;
+}, function(module, exports, __webpack_require__) {
+ function baseIsNative(value) {
+ return !(!isObject(value) || isMasked(value)) && (isFunction(value) ? reIsNative : reIsHostCtor).test(toSource(value));
+ }
+ var isFunction = __webpack_require__(8), isMasked = __webpack_require__(563), isObject = __webpack_require__(31), toSource = __webpack_require__(248), reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reIsHostCtor = /^\[object .+?Constructor\]$/, funcProto = Function.prototype, objectProto = Object.prototype, funcToString = funcProto.toString, hasOwnProperty = objectProto.hasOwnProperty, reIsNative = RegExp("^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$");
+ module.exports = baseIsNative;
+}, function(module, exports, __webpack_require__) {
+ function isMasked(func) {
+ return !!maskSrcKey && maskSrcKey in func;
+ }
+ var coreJsData = __webpack_require__(564), maskSrcKey = function() {
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
+ return uid ? "Symbol(src)_1." + uid : "";
+ }();
+ module.exports = isMasked;
+}, function(module, exports, __webpack_require__) {
+ var root = __webpack_require__(32), coreJsData = root["__core-js_shared__"];
+ module.exports = coreJsData;
+}, function(module, exports) {
+ function getValue(object, key) {
+ return null == object ? void 0 : object[key];
+ }
+ module.exports = getValue;
+}, function(module, exports) {
+ function hashDelete(key) {
+ var result = this.has(key) && delete this.__data__[key];
+ return this.size -= result ? 1 : 0, result;
+ }
+ module.exports = hashDelete;
+}, function(module, exports, __webpack_require__) {
+ function hashGet(key) {
+ var data = this.__data__;
+ if (nativeCreate) {
+ var result = data[key];
+ return result === HASH_UNDEFINED ? void 0 : result;
+ }
+ return hasOwnProperty.call(data, key) ? data[key] : void 0;
+ }
+ var nativeCreate = __webpack_require__(111), HASH_UNDEFINED = "__lodash_hash_undefined__", objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;
+ module.exports = hashGet;
+}, function(module, exports, __webpack_require__) {
+ function hashHas(key) {
+ var data = this.__data__;
+ return nativeCreate ? void 0 !== data[key] : hasOwnProperty.call(data, key);
+ }
+ var nativeCreate = __webpack_require__(111), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;
+ module.exports = hashHas;
+}, function(module, exports, __webpack_require__) {
+ function hashSet(key, value) {
+ var data = this.__data__;
+ return this.size += this.has(key) ? 0 : 1, data[key] = nativeCreate && void 0 === value ? HASH_UNDEFINED : value,
+ this;
+ }
+ var nativeCreate = __webpack_require__(111), HASH_UNDEFINED = "__lodash_hash_undefined__";
+ module.exports = hashSet;
+}, function(module, exports) {
+ function listCacheClear() {
+ this.__data__ = [], this.size = 0;
+ }
+ module.exports = listCacheClear;
+}, function(module, exports, __webpack_require__) {
+ function listCacheDelete(key) {
+ var data = this.__data__, index = assocIndexOf(data, key);
+ return !(index < 0) && (index == data.length - 1 ? data.pop() : splice.call(data, index, 1),
+ --this.size, !0);
+ }
+ var assocIndexOf = __webpack_require__(113), arrayProto = Array.prototype, splice = arrayProto.splice;
+ module.exports = listCacheDelete;
+}, function(module, exports, __webpack_require__) {
+ function listCacheGet(key) {
+ var data = this.__data__, index = assocIndexOf(data, key);
+ return index < 0 ? void 0 : data[index][1];
+ }
+ var assocIndexOf = __webpack_require__(113);
+ module.exports = listCacheGet;
+}, function(module, exports, __webpack_require__) {
+ function listCacheHas(key) {
+ return assocIndexOf(this.__data__, key) > -1;
+ }
+ var assocIndexOf = __webpack_require__(113);
+ module.exports = listCacheHas;
+}, function(module, exports, __webpack_require__) {
+ function listCacheSet(key, value) {
+ var data = this.__data__, index = assocIndexOf(data, key);
+ return index < 0 ? (++this.size, data.push([ key, value ])) : data[index][1] = value,
+ this;
+ }
+ var assocIndexOf = __webpack_require__(113);
+ module.exports = listCacheSet;
+}, function(module, exports, __webpack_require__) {
+ function mapCacheDelete(key) {
+ var result = getMapData(this, key).delete(key);
+ return this.size -= result ? 1 : 0, result;
+ }
+ var getMapData = __webpack_require__(114);
+ module.exports = mapCacheDelete;
+}, function(module, exports) {
+ function isKeyable(value) {
+ var type = typeof value;
+ return "string" == type || "number" == type || "symbol" == type || "boolean" == type ? "__proto__" !== value : null === value;
+ }
+ module.exports = isKeyable;
+}, function(module, exports, __webpack_require__) {
+ function mapCacheGet(key) {
+ return getMapData(this, key).get(key);
+ }
+ var getMapData = __webpack_require__(114);
+ module.exports = mapCacheGet;
+}, function(module, exports, __webpack_require__) {
+ function mapCacheHas(key) {
+ return getMapData(this, key).has(key);
+ }
+ var getMapData = __webpack_require__(114);
+ module.exports = mapCacheHas;
+}, function(module, exports, __webpack_require__) {
+ function mapCacheSet(key, value) {
+ var data = getMapData(this, key), size = data.size;
+ return data.set(key, value), this.size += data.size == size ? 0 : 1, this;
+ }
+ var getMapData = __webpack_require__(114);
+ module.exports = mapCacheSet;
+}, function(module, exports, __webpack_require__) {
+ function toString(value) {
+ return null == value ? "" : baseToString(value);
+ }
+ var baseToString = __webpack_require__(581);
+ module.exports = toString;
+}, function(module, exports, __webpack_require__) {
+ function baseToString(value) {
+ if ("string" == typeof value) return value;
+ if (isArray(value)) return arrayMap(value, baseToString) + "";
+ if (isSymbol(value)) return symbolToString ? symbolToString.call(value) : "";
+ var result = value + "";
+ return "0" == result && 1 / value == -INFINITY ? "-0" : result;
+ }
+ var Symbol = __webpack_require__(77), arrayMap = __webpack_require__(115), isArray = __webpack_require__(12), isSymbol = __webpack_require__(62), INFINITY = 1 / 0, symbolProto = Symbol ? Symbol.prototype : void 0, symbolToString = symbolProto ? symbolProto.toString : void 0;
+ module.exports = baseToString;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__container_Surface__ = __webpack_require__(78), __WEBPACK_IMPORTED_MODULE_5__shape_Symbols__ = __webpack_require__(172), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ICON_TYPES = __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b.filter(function(type) {
+ return "none" !== type;
+ }), DefaultLegendContent = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function DefaultLegendContent() {
+ return _classCallCheck(this, DefaultLegendContent), _possibleConstructorReturn(this, (DefaultLegendContent.__proto__ || Object.getPrototypeOf(DefaultLegendContent)).apply(this, arguments));
+ }
+ return _inherits(DefaultLegendContent, _Component), _createClass(DefaultLegendContent, [ {
+ key: "renderIcon",
+ value: function(data) {
+ var inactiveColor = this.props.inactiveColor, color = data.inactive ? inactiveColor : data.color;
+ return "plainline" === data.type ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", {
+ strokeWidth: 4,
+ fill: "none",
+ stroke: color,
+ strokeDasharray: data.payload.strokeDasharray,
+ x1: 0,
+ y1: 16,
+ x2: 32,
+ y2: 16,
+ className: "recharts-legend-icon"
+ }) : "line" === data.type ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", {
+ strokeWidth: 4,
+ fill: "none",
+ stroke: color,
+ d: "M0,16h" + 32 / 3 + "\n A" + 32 / 6 + "," + 32 / 6 + ",0,1,1," + 32 / 3 * 2 + ",16\n H32M" + 32 / 3 * 2 + ",16\n A" + 32 / 6 + "," + 32 / 6 + ",0,1,1," + 32 / 3 + ",16",
+ className: "recharts-legend-icon"
+ }) : "rect" === data.type ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", {
+ stroke: "none",
+ fill: color,
+ d: "M0,4h32v24h-32z",
+ className: "recharts-legend-icon"
+ }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__shape_Symbols__.a, {
+ fill: color,
+ cx: 16,
+ cy: 16,
+ size: 32,
+ sizeType: "diameter",
+ type: data.type
+ });
+ }
+ }, {
+ key: "renderItems",
+ value: function() {
+ var _this2 = this, _props = this.props, payload = _props.payload, iconSize = _props.iconSize, layout = _props.layout, formatter = _props.formatter, viewBox = {
+ x: 0,
+ y: 0,
+ width: 32,
+ height: 32
+ }, itemStyle = {
+ display: "horizontal" === layout ? "inline-block" : "block",
+ marginRight: 10
+ }, svgStyle = {
+ display: "inline-block",
+ verticalAlign: "middle",
+ marginRight: 4
+ };
+ return payload.map(function(entry, i) {
+ var _classNames, finalFormatter = entry.formatter || formatter, className = __WEBPACK_IMPORTED_MODULE_2_classnames___default()((_classNames = {
+ "recharts-legend-item": !0
+ }, _defineProperty(_classNames, "legend-item-" + i, !0), _defineProperty(_classNames, "inactive", entry.inactive),
+ _classNames));
+ return "none" === entry.type ? null : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("li", _extends({
+ className: className,
+ style: itemStyle,
+ key: "legend-item-" + i
+ }, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.f)(_this2.props, entry, i)), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Surface__.a, {
+ width: iconSize,
+ height: iconSize,
+ viewBox: viewBox,
+ style: svgStyle
+ }, _this2.renderIcon(entry)), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("span", {
+ className: "recharts-legend-item-text"
+ }, finalFormatter ? finalFormatter(entry.value, entry, i) : entry.value));
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, payload = _props2.payload, layout = _props2.layout, align = _props2.align;
+ if (!payload || !payload.length) return null;
+ var finalStyle = {
+ padding: 0,
+ margin: 0,
+ textAlign: "horizontal" === layout ? align : "left"
+ };
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("ul", {
+ className: "recharts-default-legend",
+ style: finalStyle
+ }, this.renderItems());
+ }
+ } ]), DefaultLegendContent;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Legend",
+ _class2.propTypes = {
+ content: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element,
+ iconSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ iconType: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(ICON_TYPES),
+ layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "horizontal", "vertical" ]),
+ align: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "center", "left", "right" ]),
+ verticalAlign: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "top", "bottom", "middle" ]),
+ payload: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({
+ value: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any,
+ id: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any,
+ type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b)
+ })),
+ inactiveColor: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,
+ formatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,
+ onClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func
+ }, _class2.defaultProps = {
+ iconSize: 14,
+ layout: "horizontal",
+ align: "center",
+ verticalAlign: "middle",
+ inactiveColor: "#ccc"
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = DefaultLegendContent;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(79), __webpack_require__(54), __webpack_require__(80);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Path() {
+ this._x0 = this._y0 = this._x1 = this._y1 = null, this._ = "";
+ }
+ function path() {
+ return new Path();
+ }
+ var pi = Math.PI, tau = 2 * pi, tauEpsilon = tau - 1e-6;
+ Path.prototype = path.prototype = {
+ constructor: Path,
+ moveTo: function(x, y) {
+ this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
+ },
+ closePath: function() {
+ null !== this._x1 && (this._x1 = this._x0, this._y1 = this._y0, this._ += "Z");
+ },
+ lineTo: function(x, y) {
+ this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
+ },
+ quadraticCurveTo: function(x1, y1, x, y) {
+ this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
+ },
+ bezierCurveTo: function(x1, y1, x2, y2, x, y) {
+ this._ += "C" + +x1 + "," + +y1 + "," + +x2 + "," + +y2 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
+ },
+ arcTo: function(x1, y1, x2, y2, r) {
+ x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
+ var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;
+ if (r < 0) throw new Error("negative radius: " + r);
+ if (null === this._x1) this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); else if (l01_2 > 1e-6) if (Math.abs(y01 * x21 - y21 * x01) > 1e-6 && r) {
+ var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;
+ Math.abs(t01 - 1) > 1e-6 && (this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01)),
+ this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
+ } else this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); else ;
+ },
+ arc: function(x, y, r, a0, a1, ccw) {
+ x = +x, y = +y, r = +r;
+ var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;
+ if (r < 0) throw new Error("negative radius: " + r);
+ null === this._x1 ? this._ += "M" + x0 + "," + y0 : (Math.abs(this._x1 - x0) > 1e-6 || Math.abs(this._y1 - y0) > 1e-6) && (this._ += "L" + x0 + "," + y0),
+ r && (da < 0 && (da = da % tau + tau), da > tauEpsilon ? this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0) : da > 1e-6 && (this._ += "A" + r + "," + r + ",0," + +(da >= pi) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1))));
+ },
+ rect: function(x, y, w, h) {
+ this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + +w + "v" + +h + "h" + -w + "Z";
+ },
+ toString: function() {
+ return this._;
+ }
+ }, __webpack_exports__.a = path;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(54), __webpack_require__(586), __webpack_require__(587), __webpack_require__(80);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(a, b) {
+ return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(d) {
+ return d;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(250), __webpack_require__(249), __webpack_require__(251);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(79), __webpack_require__(253), __webpack_require__(54), __webpack_require__(175),
+ __webpack_require__(252);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_d3_path__ = __webpack_require__(79), __WEBPACK_IMPORTED_MODULE_1__symbol_circle__ = __webpack_require__(254), __WEBPACK_IMPORTED_MODULE_2__symbol_cross__ = __webpack_require__(255), __WEBPACK_IMPORTED_MODULE_3__symbol_diamond__ = __webpack_require__(256), __WEBPACK_IMPORTED_MODULE_4__symbol_star__ = __webpack_require__(257), __WEBPACK_IMPORTED_MODULE_5__symbol_square__ = __webpack_require__(258), __WEBPACK_IMPORTED_MODULE_6__symbol_triangle__ = __webpack_require__(259), __WEBPACK_IMPORTED_MODULE_7__symbol_wye__ = __webpack_require__(260), __WEBPACK_IMPORTED_MODULE_8__constant__ = __webpack_require__(54);
+ __WEBPACK_IMPORTED_MODULE_1__symbol_circle__.a, __WEBPACK_IMPORTED_MODULE_2__symbol_cross__.a,
+ __WEBPACK_IMPORTED_MODULE_3__symbol_diamond__.a, __WEBPACK_IMPORTED_MODULE_5__symbol_square__.a,
+ __WEBPACK_IMPORTED_MODULE_4__symbol_star__.a, __WEBPACK_IMPORTED_MODULE_6__symbol_triangle__.a,
+ __WEBPACK_IMPORTED_MODULE_7__symbol_wye__.a;
+ __webpack_exports__.a = function() {
+ function symbol() {
+ var buffer;
+ if (context || (context = buffer = Object(__WEBPACK_IMPORTED_MODULE_0_d3_path__.a)()),
+ type.apply(this, arguments).draw(context, +size.apply(this, arguments)), buffer) return context = null,
+ buffer + "" || null;
+ }
+ var type = Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(__WEBPACK_IMPORTED_MODULE_1__symbol_circle__.a), size = Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(64), context = null;
+ return symbol.type = function(_) {
+ return arguments.length ? (type = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(_),
+ symbol) : type;
+ }, symbol.size = function(_) {
+ return arguments.length ? (size = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(+_),
+ symbol) : size;
+ }, symbol.context = function(_) {
+ return arguments.length ? (context = null == _ ? null : _, symbol) : context;
+ }, symbol;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function BasisClosed(context) {
+ this._context = context;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(119), __WEBPACK_IMPORTED_MODULE_1__basis__ = __webpack_require__(120);
+ BasisClosed.prototype = {
+ areaStart: __WEBPACK_IMPORTED_MODULE_0__noop__.a,
+ areaEnd: __WEBPACK_IMPORTED_MODULE_0__noop__.a,
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN,
+ this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 1:
+ this._context.moveTo(this._x2, this._y2), this._context.closePath();
+ break;
+
+ case 2:
+ this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3),
+ this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3),
+ this._context.closePath();
+ break;
+
+ case 3:
+ this.point(this._x2, this._y2), this.point(this._x3, this._y3), this.point(this._x4, this._y4);
+ }
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1, this._x2 = x, this._y2 = y;
+ break;
+
+ case 1:
+ this._point = 2, this._x3 = x, this._y3 = y;
+ break;
+
+ case 2:
+ this._point = 3, this._x4 = x, this._y4 = y, this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);
+ break;
+
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_1__basis__.c)(this, x, y);
+ }
+ this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;
+ }
+ }, __webpack_exports__.a = function(context) {
+ return new BasisClosed(context);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function BasisOpen(context) {
+ this._context = context;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(120);
+ BasisOpen.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0;
+ },
+ lineEnd: function() {
+ (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1;
+ break;
+
+ case 1:
+ this._point = 2;
+ break;
+
+ case 2:
+ this._point = 3;
+ var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6;
+ this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);
+ break;
+
+ case 3:
+ this._point = 4;
+
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_0__basis__.c)(this, x, y);
+ }
+ this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;
+ }
+ }, __webpack_exports__.a = function(context) {
+ return new BasisOpen(context);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Bundle(context, beta) {
+ this._basis = new __WEBPACK_IMPORTED_MODULE_0__basis__.a(context), this._beta = beta;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(120);
+ Bundle.prototype = {
+ lineStart: function() {
+ this._x = [], this._y = [], this._basis.lineStart();
+ },
+ lineEnd: function() {
+ var x = this._x, y = this._y, j = x.length - 1;
+ if (j > 0) for (var t, x0 = x[0], y0 = y[0], dx = x[j] - x0, dy = y[j] - y0, i = -1; ++i <= j; ) t = i / j,
+ this._basis.point(this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy));
+ this._x = this._y = null, this._basis.lineEnd();
+ },
+ point: function(x, y) {
+ this._x.push(+x), this._y.push(+y);
+ }
+ };
+ !function custom(beta) {
+ function bundle(context) {
+ return 1 === beta ? new __WEBPACK_IMPORTED_MODULE_0__basis__.a(context) : new Bundle(context, beta);
+ }
+ return bundle.beta = function(beta) {
+ return custom(+beta);
+ }, bundle;
+ }(.85);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function CatmullRomClosed(context, alpha) {
+ this._context = context, this._alpha = alpha;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__cardinalClosed__ = __webpack_require__(261), __WEBPACK_IMPORTED_MODULE_1__noop__ = __webpack_require__(119), __WEBPACK_IMPORTED_MODULE_2__catmullRom__ = __webpack_require__(176);
+ CatmullRomClosed.prototype = {
+ areaStart: __WEBPACK_IMPORTED_MODULE_1__noop__.a,
+ areaEnd: __WEBPACK_IMPORTED_MODULE_1__noop__.a,
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN,
+ this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 1:
+ this._context.moveTo(this._x3, this._y3), this._context.closePath();
+ break;
+
+ case 2:
+ this._context.lineTo(this._x3, this._y3), this._context.closePath();
+ break;
+
+ case 3:
+ this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5);
+ }
+ },
+ point: function(x, y) {
+ if (x = +x, y = +y, this._point) {
+ var x23 = this._x2 - x, y23 = this._y2 - y;
+ this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
+ }
+ switch (this._point) {
+ case 0:
+ this._point = 1, this._x3 = x, this._y3 = y;
+ break;
+
+ case 1:
+ this._point = 2, this._context.moveTo(this._x4 = x, this._y4 = y);
+ break;
+
+ case 2:
+ this._point = 3, this._x5 = x, this._y5 = y;
+ break;
+
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_2__catmullRom__.a)(this, x, y);
+ }
+ this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a,
+ this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x,
+ this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+ }
+ };
+ !function custom(alpha) {
+ function catmullRom(context) {
+ return alpha ? new CatmullRomClosed(context, alpha) : new __WEBPACK_IMPORTED_MODULE_0__cardinalClosed__.a(context, 0);
+ }
+ return catmullRom.alpha = function(alpha) {
+ return custom(+alpha);
+ }, catmullRom;
+ }(.5);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function CatmullRomOpen(context, alpha) {
+ this._context = context, this._alpha = alpha;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__cardinalOpen__ = __webpack_require__(262), __WEBPACK_IMPORTED_MODULE_1__catmullRom__ = __webpack_require__(176);
+ CatmullRomOpen.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
+ },
+ lineEnd: function() {
+ (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ if (x = +x, y = +y, this._point) {
+ var x23 = this._x2 - x, y23 = this._y2 - y;
+ this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
+ }
+ switch (this._point) {
+ case 0:
+ this._point = 1;
+ break;
+
+ case 1:
+ this._point = 2;
+ break;
+
+ case 2:
+ this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
+ break;
+
+ case 3:
+ this._point = 4;
+
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_1__catmullRom__.a)(this, x, y);
+ }
+ this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a,
+ this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x,
+ this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+ }
+ };
+ !function custom(alpha) {
+ function catmullRom(context) {
+ return alpha ? new CatmullRomOpen(context, alpha) : new __WEBPACK_IMPORTED_MODULE_0__cardinalOpen__.a(context, 0);
+ }
+ return catmullRom.alpha = function(alpha) {
+ return custom(+alpha);
+ }, catmullRom;
+ }(.5);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function LinearClosed(context) {
+ this._context = context;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(119);
+ LinearClosed.prototype = {
+ areaStart: __WEBPACK_IMPORTED_MODULE_0__noop__.a,
+ areaEnd: __WEBPACK_IMPORTED_MODULE_0__noop__.a,
+ lineStart: function() {
+ this._point = 0;
+ },
+ lineEnd: function() {
+ this._point && this._context.closePath();
+ },
+ point: function(x, y) {
+ x = +x, y = +y, this._point ? this._context.lineTo(x, y) : (this._point = 1, this._context.moveTo(x, y));
+ }
+ }, __webpack_exports__.a = function(context) {
+ return new LinearClosed(context);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function sign(x) {
+ return x < 0 ? -1 : 1;
+ }
+ function slope3(that, x2, y2) {
+ var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);
+ return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), .5 * Math.abs(p)) || 0;
+ }
+ function slope2(that, t) {
+ var h = that._x1 - that._x0;
+ return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
+ }
+ function point(that, t0, t1) {
+ var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;
+ that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
+ }
+ function MonotoneX(context) {
+ this._context = context;
+ }
+ function MonotoneY(context) {
+ this._context = new ReflectContext(context);
+ }
+ function ReflectContext(context) {
+ this._context = context;
+ }
+ function monotoneX(context) {
+ return new MonotoneX(context);
+ }
+ function monotoneY(context) {
+ return new MonotoneY(context);
+ }
+ __webpack_exports__.a = monotoneX, __webpack_exports__.b = monotoneY, MonotoneX.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN, this._point = 0;
+ },
+ lineEnd: function() {
+ switch (this._point) {
+ case 2:
+ this._context.lineTo(this._x1, this._y1);
+ break;
+
+ case 3:
+ point(this, this._t0, slope2(this, this._t0));
+ }
+ (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
+ this._line = 1 - this._line;
+ },
+ point: function(x, y) {
+ var t1 = NaN;
+ if (x = +x, y = +y, x !== this._x1 || y !== this._y1) {
+ switch (this._point) {
+ case 0:
+ this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
+ break;
+
+ case 1:
+ this._point = 2;
+ break;
+
+ case 2:
+ this._point = 3, point(this, slope2(this, t1 = slope3(this, x, y)), t1);
+ break;
+
+ default:
+ point(this, this._t0, t1 = slope3(this, x, y));
+ }
+ this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y, this._t0 = t1;
+ }
+ }
+ }, (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
+ MonotoneX.prototype.point.call(this, y, x);
+ }, ReflectContext.prototype = {
+ moveTo: function(x, y) {
+ this._context.moveTo(y, x);
+ },
+ closePath: function() {
+ this._context.closePath();
+ },
+ lineTo: function(x, y) {
+ this._context.lineTo(y, x);
+ },
+ bezierCurveTo: function(x1, y1, x2, y2, x, y) {
+ this._context.bezierCurveTo(y1, x1, y2, x2, y, x);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Natural(context) {
+ this._context = context;
+ }
+ function controlPoints(x) {
+ var i, m, n = x.length - 1, a = new Array(n), b = new Array(n), r = new Array(n);
+ for (a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1], i = 1; i < n - 1; ++i) a[i] = 1,
+ b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
+ for (a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n], i = 1; i < n; ++i) m = a[i] / b[i - 1],
+ b[i] -= m, r[i] -= m * r[i - 1];
+ for (a[n - 1] = r[n - 1] / b[n - 1], i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
+ for (b[n - 1] = (x[n] + a[n - 1]) / 2, i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
+ return [ a, b ];
+ }
+ Natural.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x = [], this._y = [];
+ },
+ lineEnd: function() {
+ var x = this._x, y = this._y, n = x.length;
+ if (n) if (this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]),
+ 2 === n) this._context.lineTo(x[1], y[1]); else for (var px = controlPoints(x), py = controlPoints(y), i0 = 0, i1 = 1; i1 < n; ++i0,
+ ++i1) this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
+ (this._line || 0 !== this._line && 1 === n) && this._context.closePath(), this._line = 1 - this._line,
+ this._x = this._y = null;
+ },
+ point: function(x, y) {
+ this._x.push(+x), this._y.push(+y);
+ }
+ }, __webpack_exports__.a = function(context) {
+ return new Natural(context);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Step(context, t) {
+ this._context = context, this._t = t;
+ }
+ function stepBefore(context) {
+ return new Step(context, 0);
+ }
+ function stepAfter(context) {
+ return new Step(context, 1);
+ }
+ __webpack_exports__.c = stepBefore, __webpack_exports__.b = stepAfter, Step.prototype = {
+ areaStart: function() {
+ this._line = 0;
+ },
+ areaEnd: function() {
+ this._line = NaN;
+ },
+ lineStart: function() {
+ this._x = this._y = NaN, this._point = 0;
+ },
+ lineEnd: function() {
+ 0 < this._t && this._t < 1 && 2 === this._point && this._context.lineTo(this._x, this._y),
+ (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(),
+ this._line >= 0 && (this._t = 1 - this._t, this._line = 1 - this._line);
+ },
+ point: function(x, y) {
+ switch (x = +x, y = +y, this._point) {
+ case 0:
+ this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
+ break;
+
+ case 1:
+ this._point = 2;
+
+ default:
+ if (this._t <= 0) this._context.lineTo(this._x, y), this._context.lineTo(x, y); else {
+ var x1 = this._x * (1 - this._t) + x * this._t;
+ this._context.lineTo(x1, this._y), this._context.lineTo(x1, y);
+ }
+ }
+ this._x = x, this._y = y;
+ }
+ }, __webpack_exports__.a = function(context) {
+ return new Step(context, .5);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function stackValue(d, key) {
+ return d[key];
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__array__ = __webpack_require__(253), __WEBPACK_IMPORTED_MODULE_1__constant__ = __webpack_require__(54), __WEBPACK_IMPORTED_MODULE_2__offset_none__ = __webpack_require__(81), __WEBPACK_IMPORTED_MODULE_3__order_none__ = __webpack_require__(82);
+ __webpack_exports__.a = function() {
+ function stack(data) {
+ var i, oz, kz = keys.apply(this, arguments), m = data.length, n = kz.length, sz = new Array(n);
+ for (i = 0; i < n; ++i) {
+ for (var sij, ki = kz[i], si = sz[i] = new Array(m), j = 0; j < m; ++j) si[j] = sij = [ 0, +value(data[j], ki, j, data) ],
+ sij.data = data[j];
+ si.key = ki;
+ }
+ for (i = 0, oz = order(sz); i < n; ++i) sz[oz[i]].index = i;
+ return offset(sz, oz), sz;
+ }
+ var keys = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)([]), order = __WEBPACK_IMPORTED_MODULE_3__order_none__.a, offset = __WEBPACK_IMPORTED_MODULE_2__offset_none__.a, value = stackValue;
+ return stack.keys = function(_) {
+ return arguments.length ? (keys = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(__WEBPACK_IMPORTED_MODULE_0__array__.a.call(_)),
+ stack) : keys;
+ }, stack.value = function(_) {
+ return arguments.length ? (value = "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_),
+ stack) : value;
+ }, stack.order = function(_) {
+ return arguments.length ? (order = null == _ ? __WEBPACK_IMPORTED_MODULE_3__order_none__.a : "function" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(__WEBPACK_IMPORTED_MODULE_0__array__.a.call(_)),
+ stack) : order;
+ }, stack.offset = function(_) {
+ return arguments.length ? (offset = null == _ ? __WEBPACK_IMPORTED_MODULE_2__offset_none__.a : _,
+ stack) : offset;
+ }, stack;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(81);
+ __webpack_exports__.a = function(series, order) {
+ if ((n = series.length) > 0) {
+ for (var i, n, y, j = 0, m = series[0].length; j < m; ++j) {
+ for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
+ if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
+ }
+ Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series, order);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(81);
+ __webpack_exports__.a = function(series, order) {
+ if ((n = series.length) > 0) {
+ for (var n, j = 0, s0 = series[order[0]], m = s0.length; j < m; ++j) {
+ for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
+ s0[j][1] += s0[j][0] = -y / 2;
+ }
+ Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series, order);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(81);
+ __webpack_exports__.a = function(series, order) {
+ if ((n = series.length) > 0 && (m = (s0 = series[order[0]]).length) > 0) {
+ for (var s0, m, n, y = 0, j = 1; j < m; ++j) {
+ for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
+ for (var si = series[order[i]], sij0 = si[j][1] || 0, sij1 = si[j - 1][1] || 0, s3 = (sij0 - sij1) / 2, k = 0; k < i; ++k) {
+ var sk = series[order[k]];
+ s3 += (sk[j][1] || 0) - (sk[j - 1][1] || 0);
+ }
+ s1 += sij0, s2 += s3 * sij0;
+ }
+ s0[j - 1][1] += s0[j - 1][0] = y, s1 && (y -= s2 / s1);
+ }
+ s0[j - 1][1] += s0[j - 1][0] = y, Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series, order);
+ }
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(177);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(82), __webpack_require__(177);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(82);
+}, function(module, exports, __webpack_require__) {
+ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+ var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);
+ objTag = objTag == argsTag ? objectTag : objTag, othTag = othTag == argsTag ? objectTag : othTag;
+ var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
+ if (isSameTag && isBuffer(object)) {
+ if (!isBuffer(other)) return !1;
+ objIsArr = !0, objIsObj = !1;
+ }
+ if (isSameTag && !objIsObj) return stack || (stack = new Stack()), objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+ if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty.call(other, "__wrapped__");
+ if (objIsWrapped || othIsWrapped) {
+ var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
+ return stack || (stack = new Stack()), equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+ }
+ }
+ return !!isSameTag && (stack || (stack = new Stack()), equalObjects(object, other, bitmask, customizer, equalFunc, stack));
+ }
+ var Stack = __webpack_require__(264), equalArrays = __webpack_require__(265), equalByTag = __webpack_require__(617), equalObjects = __webpack_require__(621), getTag = __webpack_require__(635), isArray = __webpack_require__(12), isBuffer = __webpack_require__(270), isTypedArray = __webpack_require__(271), COMPARE_PARTIAL_FLAG = 1, argsTag = "[object Arguments]", arrayTag = "[object Array]", objectTag = "[object Object]", objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;
+ module.exports = baseIsEqualDeep;
+}, function(module, exports, __webpack_require__) {
+ function stackClear() {
+ this.__data__ = new ListCache(), this.size = 0;
+ }
+ var ListCache = __webpack_require__(112);
+ module.exports = stackClear;
+}, function(module, exports) {
+ function stackDelete(key) {
+ var data = this.__data__, result = data.delete(key);
+ return this.size = data.size, result;
+ }
+ module.exports = stackDelete;
+}, function(module, exports) {
+ function stackGet(key) {
+ return this.__data__.get(key);
+ }
+ module.exports = stackGet;
+}, function(module, exports) {
+ function stackHas(key) {
+ return this.__data__.has(key);
+ }
+ module.exports = stackHas;
+}, function(module, exports, __webpack_require__) {
+ function stackSet(key, value) {
+ var data = this.__data__;
+ if (data instanceof ListCache) {
+ var pairs = data.__data__;
+ if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) return pairs.push([ key, value ]),
+ this.size = ++data.size, this;
+ data = this.__data__ = new MapCache(pairs);
+ }
+ return data.set(key, value), this.size = data.size, this;
+ }
+ var ListCache = __webpack_require__(112), Map = __webpack_require__(169), MapCache = __webpack_require__(167), LARGE_ARRAY_SIZE = 200;
+ module.exports = stackSet;
+}, function(module, exports) {
+ function setCacheAdd(value) {
+ return this.__data__.set(value, HASH_UNDEFINED), this;
+ }
+ var HASH_UNDEFINED = "__lodash_hash_undefined__";
+ module.exports = setCacheAdd;
+}, function(module, exports) {
+ function setCacheHas(value) {
+ return this.__data__.has(value);
+ }
+ module.exports = setCacheHas;
+}, function(module, exports) {
+ function arraySome(array, predicate) {
+ for (var index = -1, length = null == array ? 0 : array.length; ++index < length; ) if (predicate(array[index], index, array)) return !0;
+ return !1;
+ }
+ module.exports = arraySome;
+}, function(module, exports, __webpack_require__) {
+ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+ switch (tag) {
+ case dataViewTag:
+ if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) return !1;
+ object = object.buffer, other = other.buffer;
+
+ case arrayBufferTag:
+ return !(object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other)));
+
+ case boolTag:
+ case dateTag:
+ case numberTag:
+ return eq(+object, +other);
+
+ case errorTag:
+ return object.name == other.name && object.message == other.message;
+
+ case regexpTag:
+ case stringTag:
+ return object == other + "";
+
+ case mapTag:
+ var convert = mapToArray;
+
+ case setTag:
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+ if (convert || (convert = setToArray), object.size != other.size && !isPartial) return !1;
+ var stacked = stack.get(object);
+ if (stacked) return stacked == other;
+ bitmask |= COMPARE_UNORDERED_FLAG, stack.set(object, other);
+ var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+ return stack.delete(object), result;
+
+ case symbolTag:
+ if (symbolValueOf) return symbolValueOf.call(object) == symbolValueOf.call(other);
+ }
+ return !1;
+ }
+ var Symbol = __webpack_require__(77), Uint8Array = __webpack_require__(618), eq = __webpack_require__(168), equalArrays = __webpack_require__(265), mapToArray = __webpack_require__(619), setToArray = __webpack_require__(620), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2, boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", mapTag = "[object Map]", numberTag = "[object Number]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", symbolProto = Symbol ? Symbol.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
+ module.exports = equalByTag;
+}, function(module, exports, __webpack_require__) {
+ var root = __webpack_require__(32), Uint8Array = root.Uint8Array;
+ module.exports = Uint8Array;
+}, function(module, exports) {
+ function mapToArray(map) {
+ var index = -1, result = Array(map.size);
+ return map.forEach(function(value, key) {
+ result[++index] = [ key, value ];
+ }), result;
+ }
+ module.exports = mapToArray;
+}, function(module, exports) {
+ function setToArray(set) {
+ var index = -1, result = Array(set.size);
+ return set.forEach(function(value) {
+ result[++index] = value;
+ }), result;
+ }
+ module.exports = setToArray;
+}, function(module, exports, __webpack_require__) {
+ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length;
+ if (objLength != getAllKeys(other).length && !isPartial) return !1;
+ for (var index = objLength; index--; ) {
+ var key = objProps[index];
+ if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) return !1;
+ }
+ var stacked = stack.get(object);
+ if (stacked && stack.get(other)) return stacked == other;
+ var result = !0;
+ stack.set(object, other), stack.set(other, object);
+ for (var skipCtor = isPartial; ++index < objLength; ) {
+ key = objProps[index];
+ var objValue = object[key], othValue = other[key];
+ if (customizer) var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
+ if (!(void 0 === compared ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
+ result = !1;
+ break;
+ }
+ skipCtor || (skipCtor = "constructor" == key);
+ }
+ if (result && !skipCtor) {
+ var objCtor = object.constructor, othCtor = other.constructor;
+ objCtor != othCtor && "constructor" in object && "constructor" in other && !("function" == typeof objCtor && objCtor instanceof objCtor && "function" == typeof othCtor && othCtor instanceof othCtor) && (result = !1);
+ }
+ return stack.delete(object), stack.delete(other), result;
+ }
+ var getAllKeys = __webpack_require__(622), COMPARE_PARTIAL_FLAG = 1, objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;
+ module.exports = equalObjects;
+}, function(module, exports, __webpack_require__) {
+ function getAllKeys(object) {
+ return baseGetAllKeys(object, keys, getSymbols);
+ }
+ var baseGetAllKeys = __webpack_require__(623), getSymbols = __webpack_require__(624), keys = __webpack_require__(179);
+ module.exports = getAllKeys;
+}, function(module, exports, __webpack_require__) {
+ function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+ var result = keysFunc(object);
+ return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+ }
+ var arrayPush = __webpack_require__(268), isArray = __webpack_require__(12);
+ module.exports = baseGetAllKeys;
+}, function(module, exports, __webpack_require__) {
+ var arrayFilter = __webpack_require__(269), stubArray = __webpack_require__(625), objectProto = Object.prototype, propertyIsEnumerable = objectProto.propertyIsEnumerable, nativeGetSymbols = Object.getOwnPropertySymbols, getSymbols = nativeGetSymbols ? function(object) {
+ return null == object ? [] : (object = Object(object), arrayFilter(nativeGetSymbols(object), function(symbol) {
+ return propertyIsEnumerable.call(object, symbol);
+ }));
+ } : stubArray;
+ module.exports = getSymbols;
+}, function(module, exports) {
+ function stubArray() {
+ return [];
+ }
+ module.exports = stubArray;
+}, function(module, exports, __webpack_require__) {
+ function arrayLikeKeys(value, inherited) {
+ var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;
+ for (var key in value) !inherited && !hasOwnProperty.call(value, key) || skipIndexes && ("length" == key || isBuff && ("offset" == key || "parent" == key) || isType && ("buffer" == key || "byteLength" == key || "byteOffset" == key) || isIndex(key, length)) || result.push(key);
+ return result;
+ }
+ var baseTimes = __webpack_require__(627), isArguments = __webpack_require__(180), isArray = __webpack_require__(12), isBuffer = __webpack_require__(270), isIndex = __webpack_require__(181), isTypedArray = __webpack_require__(271), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;
+ module.exports = arrayLikeKeys;
+}, function(module, exports) {
+ function baseTimes(n, iteratee) {
+ for (var index = -1, result = Array(n); ++index < n; ) result[index] = iteratee(index);
+ return result;
+ }
+ module.exports = baseTimes;
+}, function(module, exports, __webpack_require__) {
+ function baseIsArguments(value) {
+ return isObjectLike(value) && baseGetTag(value) == argsTag;
+ }
+ var baseGetTag = __webpack_require__(42), isObjectLike = __webpack_require__(36), argsTag = "[object Arguments]";
+ module.exports = baseIsArguments;
+}, function(module, exports) {
+ function stubFalse() {
+ return !1;
+ }
+ module.exports = stubFalse;
+}, function(module, exports, __webpack_require__) {
+ function baseIsTypedArray(value) {
+ return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+ }
+ var baseGetTag = __webpack_require__(42), isLength = __webpack_require__(182), isObjectLike = __webpack_require__(36), typedArrayTags = {};
+ typedArrayTags["[object Float32Array]"] = typedArrayTags["[object Float64Array]"] = typedArrayTags["[object Int8Array]"] = typedArrayTags["[object Int16Array]"] = typedArrayTags["[object Int32Array]"] = typedArrayTags["[object Uint8Array]"] = typedArrayTags["[object Uint8ClampedArray]"] = typedArrayTags["[object Uint16Array]"] = typedArrayTags["[object Uint32Array]"] = !0,
+ typedArrayTags["[object Arguments]"] = typedArrayTags["[object Array]"] = typedArrayTags["[object ArrayBuffer]"] = typedArrayTags["[object Boolean]"] = typedArrayTags["[object DataView]"] = typedArrayTags["[object Date]"] = typedArrayTags["[object Error]"] = typedArrayTags["[object Function]"] = typedArrayTags["[object Map]"] = typedArrayTags["[object Number]"] = typedArrayTags["[object Object]"] = typedArrayTags["[object RegExp]"] = typedArrayTags["[object Set]"] = typedArrayTags["[object String]"] = typedArrayTags["[object WeakMap]"] = !1,
+ module.exports = baseIsTypedArray;
+}, function(module, exports, __webpack_require__) {
+ (function(module) {
+ var freeGlobal = __webpack_require__(242), freeExports = "object" == typeof exports && exports && !exports.nodeType && exports, freeModule = freeExports && "object" == typeof module && module && !module.nodeType && module, moduleExports = freeModule && freeModule.exports === freeExports, freeProcess = moduleExports && freeGlobal.process, nodeUtil = function() {
+ try {
+ return freeProcess && freeProcess.binding && freeProcess.binding("util");
+ } catch (e) {}
+ }();
+ module.exports = nodeUtil;
+ }).call(exports, __webpack_require__(154)(module));
+}, function(module, exports, __webpack_require__) {
+ function baseKeys(object) {
+ if (!isPrototype(object)) return nativeKeys(object);
+ var result = [];
+ for (var key in Object(object)) hasOwnProperty.call(object, key) && "constructor" != key && result.push(key);
+ return result;
+ }
+ var isPrototype = __webpack_require__(633), nativeKeys = __webpack_require__(634), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;
+ module.exports = baseKeys;
+}, function(module, exports) {
+ function isPrototype(value) {
+ var Ctor = value && value.constructor;
+ return value === ("function" == typeof Ctor && Ctor.prototype || objectProto);
+ }
+ var objectProto = Object.prototype;
+ module.exports = isPrototype;
+}, function(module, exports, __webpack_require__) {
+ var overArg = __webpack_require__(272), nativeKeys = overArg(Object.keys, Object);
+ module.exports = nativeKeys;
+}, function(module, exports, __webpack_require__) {
+ var DataView = __webpack_require__(636), Map = __webpack_require__(169), Promise = __webpack_require__(637), Set = __webpack_require__(638), WeakMap = __webpack_require__(639), baseGetTag = __webpack_require__(42), toSource = __webpack_require__(248), dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap), getTag = baseGetTag;
+ (DataView && "[object DataView]" != getTag(new DataView(new ArrayBuffer(1))) || Map && "[object Map]" != getTag(new Map()) || Promise && "[object Promise]" != getTag(Promise.resolve()) || Set && "[object Set]" != getTag(new Set()) || WeakMap && "[object WeakMap]" != getTag(new WeakMap())) && (getTag = function(value) {
+ var result = baseGetTag(value), Ctor = "[object Object]" == result ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : "";
+ if (ctorString) switch (ctorString) {
+ case dataViewCtorString:
+ return "[object DataView]";
+
+ case mapCtorString:
+ return "[object Map]";
+
+ case promiseCtorString:
+ return "[object Promise]";
+
+ case setCtorString:
+ return "[object Set]";
+
+ case weakMapCtorString:
+ return "[object WeakMap]";
+ }
+ return result;
+ }), module.exports = getTag;
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), root = __webpack_require__(32), DataView = getNative(root, "DataView");
+ module.exports = DataView;
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), root = __webpack_require__(32), Promise = getNative(root, "Promise");
+ module.exports = Promise;
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), root = __webpack_require__(32), Set = getNative(root, "Set");
+ module.exports = Set;
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), root = __webpack_require__(32), WeakMap = getNative(root, "WeakMap");
+ module.exports = WeakMap;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _toArray(arr) {
+ return Array.isArray(arr) ? arr : Array.from(arr);
+ }
+ function createAnimateManager() {
+ var currStyle = {}, handleChange = function() {
+ return null;
+ }, shouldStop = !1, setStyle = function setStyle(_style) {
+ if (!shouldStop) {
+ if (Array.isArray(_style)) {
+ if (!_style.length) return;
+ var styles = _style, _styles = _toArray(styles), curr = _styles[0], restStyles = _styles.slice(1);
+ return "number" == typeof curr ? void (0, _setRafTimeout2.default)(setStyle.bind(null, restStyles), curr) : (setStyle(curr),
+ void (0, _setRafTimeout2.default)(setStyle.bind(null, restStyles)));
+ }
+ "object" === (void 0 === _style ? "undefined" : _typeof(_style)) && (currStyle = _style,
+ handleChange(currStyle)), "function" == typeof _style && _style();
+ }
+ };
+ return {
+ stop: function() {
+ shouldStop = !0;
+ },
+ start: function(style) {
+ shouldStop = !1, setStyle(style);
+ },
+ subscribe: function(_handleChange) {
+ return handleChange = _handleChange, function() {
+ handleChange = function() {
+ return null;
+ };
+ };
+ }
+ };
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ exports.default = createAnimateManager;
+ var _setRafTimeout = __webpack_require__(641), _setRafTimeout2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_setRafTimeout);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function setRafTimeout(callback) {
+ var timeout = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, currTime = -1, shouldUpdate = function shouldUpdate(now) {
+ currTime < 0 && (currTime = now), now - currTime > timeout ? (callback(now), currTime = -1) : (0,
+ _raf2.default)(shouldUpdate);
+ };
+ (0, _raf2.default)(shouldUpdate);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.default = setRafTimeout;
+ var _raf = __webpack_require__(273), _raf2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_raf);
+}, function(module, exports, __webpack_require__) {
+ (function(process) {
+ (function() {
+ var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
+ "undefined" != typeof performance && null !== performance && performance.now ? module.exports = function() {
+ return performance.now();
+ } : void 0 !== process && null !== process && process.hrtime ? (module.exports = function() {
+ return (getNanoSeconds() - nodeLoadTime) / 1e6;
+ }, hrtime = process.hrtime, getNanoSeconds = function() {
+ var hr;
+ return hr = hrtime(), 1e9 * hr[0] + hr[1];
+ }, moduleLoadTime = getNanoSeconds(), upTime = 1e9 * process.uptime(), nodeLoadTime = moduleLoadTime - upTime) : Date.now ? (module.exports = function() {
+ return Date.now() - loadTime;
+ }, loadTime = Date.now()) : (module.exports = function() {
+ return new Date().getTime() - loadTime;
+ }, loadTime = new Date().getTime());
+ }).call(this);
+ }).call(exports, __webpack_require__(2));
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function shallowEqual(objA, objB) {
+ if (objA === objB) return !0;
+ if ("object" !== (void 0 === objA ? "undefined" : _typeof(objA)) || null === objA || "object" !== (void 0 === objB ? "undefined" : _typeof(objB)) || null === objB) return !1;
+ var keysA = Object.keys(objA), keysB = Object.keys(objB);
+ if (keysA.length !== keysB.length) return !1;
+ for (var bHasOwnProperty = hasOwnProperty.bind(objB), i = 0; i < keysA.length; i++) {
+ var keyA = keysA[i];
+ if (objA[keyA] !== objB[keyA]) if ((0, _isArray3.default)(objA[keyA])) {
+ if (!(0, _isArray3.default)(objB[keyA]) || objA[keyA].length !== objB[keyA].length) return !1;
+ if (!(0, _isEqual3.default)(objA[keyA], objB[keyA])) return !1;
+ } else if ((0, _isPlainObject3.default)(objA[keyA])) {
+ if (!(0, _isPlainObject3.default)(objB[keyA]) || !(0, _isEqual3.default)(objA[keyA], objB[keyA])) return !1;
+ } else if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) return !1;
+ }
+ return !0;
+ }
+ function shallowCompare(instance, nextProps, nextState) {
+ return !shallowEqual(instance.props, nextProps) || !shallowEqual(instance.state, nextState);
+ }
+ function shouldComponentUpdate(nextProps, nextState) {
+ return shallowCompare(this, nextProps, nextState);
+ }
+ function pureRenderDecorator(component) {
+ component.prototype.shouldComponentUpdate = shouldComponentUpdate;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.shallowEqual = void 0;
+ var _isPlainObject2 = __webpack_require__(274), _isPlainObject3 = _interopRequireDefault(_isPlainObject2), _isEqual2 = __webpack_require__(34), _isEqual3 = _interopRequireDefault(_isEqual2), _isArray2 = __webpack_require__(12), _isArray3 = _interopRequireDefault(_isArray2), _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
+ return typeof obj;
+ } : function(obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ exports.shallowEqual = shallowEqual, exports.default = pureRenderDecorator;
+}, function(module, exports, __webpack_require__) {
+ var overArg = __webpack_require__(272), getPrototype = overArg(Object.getPrototypeOf, Object);
+ module.exports = getPrototype;
+}, function(module, exports, __webpack_require__) {
+ var arrayMap = __webpack_require__(115), baseIntersection = __webpack_require__(646), baseRest = __webpack_require__(276), castArrayLikeObject = __webpack_require__(660), intersection = baseRest(function(arrays) {
+ var mapped = arrayMap(arrays, castArrayLikeObject);
+ return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
+ });
+ module.exports = intersection;
+}, function(module, exports, __webpack_require__) {
+ function baseIntersection(arrays, iteratee, comparator) {
+ for (var includes = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array(othLength), maxLength = 1 / 0, result = []; othIndex--; ) {
+ var array = arrays[othIndex];
+ othIndex && iteratee && (array = arrayMap(array, baseUnary(iteratee))), maxLength = nativeMin(array.length, maxLength),
+ caches[othIndex] = !comparator && (iteratee || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : void 0;
+ }
+ array = arrays[0];
+ var index = -1, seen = caches[0];
+ outer: for (;++index < length && result.length < maxLength; ) {
+ var value = array[index], computed = iteratee ? iteratee(value) : value;
+ if (value = comparator || 0 !== value ? value : 0, !(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) {
+ for (othIndex = othLength; --othIndex; ) {
+ var cache = caches[othIndex];
+ if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) continue outer;
+ }
+ seen && seen.push(computed), result.push(value);
+ }
+ }
+ return result;
+ }
+ var SetCache = __webpack_require__(266), arrayIncludes = __webpack_require__(647), arrayIncludesWith = __webpack_require__(652), arrayMap = __webpack_require__(115), baseUnary = __webpack_require__(183), cacheHas = __webpack_require__(267), nativeMin = Math.min;
+ module.exports = baseIntersection;
+}, function(module, exports, __webpack_require__) {
+ function arrayIncludes(array, value) {
+ return !!(null == array ? 0 : array.length) && baseIndexOf(array, value, 0) > -1;
+ }
+ var baseIndexOf = __webpack_require__(648);
+ module.exports = arrayIncludes;
+}, function(module, exports, __webpack_require__) {
+ function baseIndexOf(array, value, fromIndex) {
+ return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);
+ }
+ var baseFindIndex = __webpack_require__(649), baseIsNaN = __webpack_require__(650), strictIndexOf = __webpack_require__(651);
+ module.exports = baseIndexOf;
+}, function(module, exports) {
+ function baseFindIndex(array, predicate, fromIndex, fromRight) {
+ for (var length = array.length, index = fromIndex + (fromRight ? 1 : -1); fromRight ? index-- : ++index < length; ) if (predicate(array[index], index, array)) return index;
+ return -1;
+ }
+ module.exports = baseFindIndex;
+}, function(module, exports) {
+ function baseIsNaN(value) {
+ return value !== value;
+ }
+ module.exports = baseIsNaN;
+}, function(module, exports) {
+ function strictIndexOf(array, value, fromIndex) {
+ for (var index = fromIndex - 1, length = array.length; ++index < length; ) if (array[index] === value) return index;
+ return -1;
+ }
+ module.exports = strictIndexOf;
+}, function(module, exports) {
+ function arrayIncludesWith(array, value, comparator) {
+ for (var index = -1, length = null == array ? 0 : array.length; ++index < length; ) if (comparator(value, array[index])) return !0;
+ return !1;
+ }
+ module.exports = arrayIncludesWith;
+}, function(module, exports, __webpack_require__) {
+ function overRest(func, start, transform) {
+ return start = nativeMax(void 0 === start ? func.length - 1 : start, 0), function() {
+ for (var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array(length); ++index < length; ) array[index] = args[start + index];
+ index = -1;
+ for (var otherArgs = Array(start + 1); ++index < start; ) otherArgs[index] = args[index];
+ return otherArgs[start] = transform(array), apply(func, this, otherArgs);
+ };
+ }
+ var apply = __webpack_require__(654), nativeMax = Math.max;
+ module.exports = overRest;
+}, function(module, exports) {
+ function apply(func, thisArg, args) {
+ switch (args.length) {
+ case 0:
+ return func.call(thisArg);
+
+ case 1:
+ return func.call(thisArg, args[0]);
+
+ case 2:
+ return func.call(thisArg, args[0], args[1]);
+
+ case 3:
+ return func.call(thisArg, args[0], args[1], args[2]);
+ }
+ return func.apply(thisArg, args);
+ }
+ module.exports = apply;
+}, function(module, exports, __webpack_require__) {
+ var baseSetToString = __webpack_require__(656), shortOut = __webpack_require__(659), setToString = shortOut(baseSetToString);
+ module.exports = setToString;
+}, function(module, exports, __webpack_require__) {
+ var constant = __webpack_require__(657), defineProperty = __webpack_require__(658), identity = __webpack_require__(63), baseSetToString = defineProperty ? function(func, string) {
+ return defineProperty(func, "toString", {
+ configurable: !0,
+ enumerable: !1,
+ value: constant(string),
+ writable: !0
+ });
+ } : identity;
+ module.exports = baseSetToString;
+}, function(module, exports) {
+ function constant(value) {
+ return function() {
+ return value;
+ };
+ }
+ module.exports = constant;
+}, function(module, exports, __webpack_require__) {
+ var getNative = __webpack_require__(53), defineProperty = function() {
+ try {
+ var func = getNative(Object, "defineProperty");
+ return func({}, "", {}), func;
+ } catch (e) {}
+ }();
+ module.exports = defineProperty;
+}, function(module, exports) {
+ function shortOut(func) {
+ var count = 0, lastCalled = 0;
+ return function() {
+ var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
+ if (lastCalled = stamp, remaining > 0) {
+ if (++count >= HOT_COUNT) return arguments[0];
+ } else count = 0;
+ return func.apply(void 0, arguments);
+ };
+ }
+ var HOT_COUNT = 800, HOT_SPAN = 16, nativeNow = Date.now;
+ module.exports = shortOut;
+}, function(module, exports, __webpack_require__) {
+ function castArrayLikeObject(value) {
+ return isArrayLikeObject(value) ? value : [];
+ }
+ var isArrayLikeObject = __webpack_require__(661);
+ module.exports = castArrayLikeObject;
+}, function(module, exports, __webpack_require__) {
+ function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
+ }
+ var isArrayLike = __webpack_require__(83), isObjectLike = __webpack_require__(36);
+ module.exports = isArrayLikeObject;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _filter2 = __webpack_require__(663), _filter3 = _interopRequireDefault(_filter2), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _slicedToArray = function() {
+ function sliceIterator(arr, i) {
+ var _arr = [], _n = !0, _d = !1, _e = void 0;
+ try {
+ for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value),
+ !i || _arr.length !== i); _n = !0) ;
+ } catch (err) {
+ _d = !0, _e = err;
+ } finally {
+ try {
+ !_n && _i.return && _i.return();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+ return _arr;
+ }
+ return function(arr, i) {
+ if (Array.isArray(arr)) return arr;
+ if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ };
+ }(), _raf = __webpack_require__(273), _raf2 = _interopRequireDefault(_raf), _util = __webpack_require__(123), alpha = function(begin, end, k) {
+ return begin + (end - begin) * k;
+ }, needContinue = function(_ref) {
+ return _ref.from !== _ref.to;
+ }, calStepperVals = function calStepperVals(easing, preVals, steps) {
+ var nextStepVals = (0, _util.mapObject)(function(key, val) {
+ if (needContinue(val)) {
+ var _easing = easing(val.from, val.to, val.velocity), _easing2 = _slicedToArray(_easing, 2), newX = _easing2[0], newV = _easing2[1];
+ return _extends({}, val, {
+ from: newX,
+ velocity: newV
+ });
+ }
+ return val;
+ }, preVals);
+ return steps < 1 ? (0, _util.mapObject)(function(key, val) {
+ return needContinue(val) ? _extends({}, val, {
+ velocity: alpha(val.velocity, nextStepVals[key].velocity, steps),
+ from: alpha(val.from, nextStepVals[key].from, steps)
+ }) : val;
+ }, preVals) : calStepperVals(easing, nextStepVals, steps - 1);
+ };
+ exports.default = function(from, to, easing, duration, render) {
+ var interKeys = (0, _util.getIntersectionKeys)(from, to), timingStyle = interKeys.reduce(function(res, key) {
+ return _extends({}, res, _defineProperty({}, key, [ from[key], to[key] ]));
+ }, {}), stepperStyle = interKeys.reduce(function(res, key) {
+ return _extends({}, res, _defineProperty({}, key, {
+ from: from[key],
+ velocity: 0,
+ to: to[key]
+ }));
+ }, {}), cafId = -1, preTime = void 0, beginTime = void 0, update = function() {
+ return null;
+ }, getCurrStyle = function() {
+ return (0, _util.mapObject)(function(key, val) {
+ return val.from;
+ }, stepperStyle);
+ }, shouldStopAnimation = function() {
+ return !(0, _filter3.default)(stepperStyle, needContinue).length;
+ }, stepperUpdate = function(now) {
+ preTime || (preTime = now);
+ var deltaTime = now - preTime, steps = deltaTime / easing.dt;
+ stepperStyle = calStepperVals(easing, stepperStyle, steps), render(_extends({}, from, to, getCurrStyle())),
+ preTime = now, shouldStopAnimation() || (cafId = (0, _raf2.default)(update));
+ }, timingUpdate = function(now) {
+ beginTime || (beginTime = now);
+ var t = (now - beginTime) / duration, currStyle = (0, _util.mapObject)(function(key, val) {
+ return alpha.apply(void 0, _toConsumableArray(val).concat([ easing(t) ]));
+ }, timingStyle);
+ if (render(_extends({}, from, to, currStyle)), t < 1) cafId = (0, _raf2.default)(update); else {
+ var finalStyle = (0, _util.mapObject)(function(key, val) {
+ return alpha.apply(void 0, _toConsumableArray(val).concat([ easing(1) ]));
+ }, timingStyle);
+ render(_extends({}, from, to, finalStyle));
+ }
+ };
+ return update = easing.isStepper ? stepperUpdate : timingUpdate, function() {
+ return (0, _raf2.default)(update), function() {
+ (0, _raf.cancel)(cafId);
+ };
+ };
+ };
+}, function(module, exports, __webpack_require__) {
+ function filter(collection, predicate) {
+ return (isArray(collection) ? arrayFilter : baseFilter)(collection, baseIteratee(predicate, 3));
+ }
+ var arrayFilter = __webpack_require__(269), baseFilter = __webpack_require__(664), baseIteratee = __webpack_require__(84), isArray = __webpack_require__(12);
+ module.exports = filter;
+}, function(module, exports, __webpack_require__) {
+ function baseFilter(collection, predicate) {
+ var result = [];
+ return baseEach(collection, function(value, index, collection) {
+ predicate(value, index, collection) && result.push(value);
+ }), result;
+ }
+ var baseEach = __webpack_require__(277);
+ module.exports = baseFilter;
+}, function(module, exports, __webpack_require__) {
+ function baseForOwn(object, iteratee) {
+ return object && baseFor(object, iteratee, keys);
+ }
+ var baseFor = __webpack_require__(666), keys = __webpack_require__(179);
+ module.exports = baseForOwn;
+}, function(module, exports, __webpack_require__) {
+ var createBaseFor = __webpack_require__(667), baseFor = createBaseFor();
+ module.exports = baseFor;
+}, function(module, exports) {
+ function createBaseFor(fromRight) {
+ return function(object, iteratee, keysFunc) {
+ for (var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; length--; ) {
+ var key = props[fromRight ? length : ++index];
+ if (!1 === iteratee(iterable[key], key, iterable)) break;
+ }
+ return object;
+ };
+ }
+ module.exports = createBaseFor;
+}, function(module, exports, __webpack_require__) {
+ function createBaseEach(eachFunc, fromRight) {
+ return function(collection, iteratee) {
+ if (null == collection) return collection;
+ if (!isArrayLike(collection)) return eachFunc(collection, iteratee);
+ for (var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); (fromRight ? index-- : ++index < length) && !1 !== iteratee(iterable[index], index, iterable); ) ;
+ return collection;
+ };
+ }
+ var isArrayLike = __webpack_require__(83);
+ module.exports = createBaseEach;
+}, function(module, exports, __webpack_require__) {
+ function baseMatches(source) {
+ var matchData = getMatchData(source);
+ return 1 == matchData.length && matchData[0][2] ? matchesStrictComparable(matchData[0][0], matchData[0][1]) : function(object) {
+ return object === source || baseIsMatch(object, source, matchData);
+ };
+ }
+ var baseIsMatch = __webpack_require__(670), getMatchData = __webpack_require__(671), matchesStrictComparable = __webpack_require__(279);
+ module.exports = baseMatches;
+}, function(module, exports, __webpack_require__) {
+ function baseIsMatch(object, source, matchData, customizer) {
+ var index = matchData.length, length = index, noCustomizer = !customizer;
+ if (null == object) return !length;
+ for (object = Object(object); index--; ) {
+ var data = matchData[index];
+ if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) return !1;
+ }
+ for (;++index < length; ) {
+ data = matchData[index];
+ var key = data[0], objValue = object[key], srcValue = data[1];
+ if (noCustomizer && data[2]) {
+ if (void 0 === objValue && !(key in object)) return !1;
+ } else {
+ var stack = new Stack();
+ if (customizer) var result = customizer(objValue, srcValue, key, object, source, stack);
+ if (!(void 0 === result ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) return !1;
+ }
+ }
+ return !0;
+ }
+ var Stack = __webpack_require__(264), baseIsEqual = __webpack_require__(178), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
+ module.exports = baseIsMatch;
+}, function(module, exports, __webpack_require__) {
+ function getMatchData(object) {
+ for (var result = keys(object), length = result.length; length--; ) {
+ var key = result[length], value = object[key];
+ result[length] = [ key, value, isStrictComparable(value) ];
+ }
+ return result;
+ }
+ var isStrictComparable = __webpack_require__(278), keys = __webpack_require__(179);
+ module.exports = getMatchData;
+}, function(module, exports, __webpack_require__) {
+ function baseMatchesProperty(path, srcValue) {
+ return isKey(path) && isStrictComparable(srcValue) ? matchesStrictComparable(toKey(path), srcValue) : function(object) {
+ var objValue = get(object, path);
+ return void 0 === objValue && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+ };
+ }
+ var baseIsEqual = __webpack_require__(178), get = __webpack_require__(165), hasIn = __webpack_require__(673), isKey = __webpack_require__(166), isStrictComparable = __webpack_require__(278), matchesStrictComparable = __webpack_require__(279), toKey = __webpack_require__(116), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
+ module.exports = baseMatchesProperty;
+}, function(module, exports, __webpack_require__) {
+ function hasIn(object, path) {
+ return null != object && hasPath(object, path, baseHasIn);
+ }
+ var baseHasIn = __webpack_require__(674), hasPath = __webpack_require__(675);
+ module.exports = hasIn;
+}, function(module, exports) {
+ function baseHasIn(object, key) {
+ return null != object && key in Object(object);
+ }
+ module.exports = baseHasIn;
+}, function(module, exports, __webpack_require__) {
+ function hasPath(object, path, hasFunc) {
+ path = castPath(path, object);
+ for (var index = -1, length = path.length, result = !1; ++index < length; ) {
+ var key = toKey(path[index]);
+ if (!(result = null != object && hasFunc(object, key))) break;
+ object = object[key];
+ }
+ return result || ++index != length ? result : !!(length = null == object ? 0 : object.length) && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));
+ }
+ var castPath = __webpack_require__(247), isArguments = __webpack_require__(180), isArray = __webpack_require__(12), isIndex = __webpack_require__(181), isLength = __webpack_require__(182), toKey = __webpack_require__(116);
+ module.exports = hasPath;
+}, function(module, exports, __webpack_require__) {
+ function property(path) {
+ return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
+ }
+ var baseProperty = __webpack_require__(677), basePropertyDeep = __webpack_require__(678), isKey = __webpack_require__(166), toKey = __webpack_require__(116);
+ module.exports = property;
+}, function(module, exports) {
+ function baseProperty(key) {
+ return function(object) {
+ return null == object ? void 0 : object[key];
+ };
+ }
+ module.exports = baseProperty;
+}, function(module, exports, __webpack_require__) {
+ function basePropertyDeep(path) {
+ return function(object) {
+ return baseGet(object, path);
+ };
+ }
+ var baseGet = __webpack_require__(246);
+ module.exports = basePropertyDeep;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _class, _temp, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _TransitionGroup = __webpack_require__(236), _TransitionGroup2 = _interopRequireDefault(_TransitionGroup), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _AnimateGroupChild = __webpack_require__(680), _AnimateGroupChild2 = _interopRequireDefault(_AnimateGroupChild), AnimateGroup = (_temp = _class = function(_Component) {
+ function AnimateGroup() {
+ return _classCallCheck(this, AnimateGroup), _possibleConstructorReturn(this, (AnimateGroup.__proto__ || Object.getPrototypeOf(AnimateGroup)).apply(this, arguments));
+ }
+ return _inherits(AnimateGroup, _Component), _createClass(AnimateGroup, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, component = _props.component, children = _props.children, appear = _props.appear, enter = _props.enter, leave = _props.leave;
+ return _react2.default.createElement(_TransitionGroup2.default, {
+ component: component
+ }, _react.Children.map(children, function(child, index) {
+ return _react2.default.createElement(_AnimateGroupChild2.default, {
+ appearOptions: appear,
+ enterOptions: enter,
+ leaveOptions: leave,
+ key: "child-" + index
+ }, child);
+ }));
+ }
+ } ]), AnimateGroup;
+ }(_react.Component), _class.propTypes = {
+ appear: _propTypes2.default.object,
+ enter: _propTypes2.default.object,
+ leave: _propTypes2.default.object,
+ children: _propTypes2.default.oneOfType([ _propTypes2.default.array, _propTypes2.default.element ]),
+ component: _propTypes2.default.any
+ }, _class.defaultProps = {
+ component: "span"
+ }, _temp);
+ exports.default = AnimateGroup;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _class, _temp2, _isNumber2 = __webpack_require__(170), _isNumber3 = _interopRequireDefault(_isNumber2), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _Transition = __webpack_require__(108), _Transition2 = _interopRequireDefault(_Transition), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _Animate = __webpack_require__(263), _Animate2 = _interopRequireDefault(_Animate), parseDurationOfSingleTransition = function() {
+ var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, steps = options.steps, duration = options.duration;
+ return steps && steps.length ? steps.reduce(function(result, entry) {
+ return result + ((0, _isNumber3.default)(entry.duration) && entry.duration > 0 ? entry.duration : 0);
+ }, 0) : (0, _isNumber3.default)(duration) ? duration : 0;
+ }, AnimateGroupChild = (_temp2 = _class = function(_Component) {
+ function AnimateGroupChild() {
+ var _ref, _temp, _this, _ret;
+ _classCallCheck(this, AnimateGroupChild);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref = AnimateGroupChild.__proto__ || Object.getPrototypeOf(AnimateGroupChild)).call.apply(_ref, [ this ].concat(args))),
+ _this.state = {
+ isActive: !1
+ }, _this.handleEnter = function(node, isAppearing) {
+ var _this$props = _this.props, appearOptions = _this$props.appearOptions, enterOptions = _this$props.enterOptions;
+ _this.handleStyleActive(isAppearing ? appearOptions : enterOptions);
+ }, _this.handleExit = function() {
+ _this.handleStyleActive(_this.props.leaveOptions);
+ }, _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(AnimateGroupChild, _Component), _createClass(AnimateGroupChild, [ {
+ key: "handleStyleActive",
+ value: function(style) {
+ if (style) {
+ var onAnimationEnd = style.onAnimationEnd ? function() {
+ style.onAnimationEnd();
+ } : null;
+ this.setState(_extends({}, style, {
+ onAnimationEnd: onAnimationEnd,
+ isActive: !0
+ }));
+ }
+ }
+ }, {
+ key: "parseTimeout",
+ value: function() {
+ var _props = this.props, appearOptions = _props.appearOptions, enterOptions = _props.enterOptions, leaveOptions = _props.leaveOptions;
+ return parseDurationOfSingleTransition(appearOptions) + parseDurationOfSingleTransition(enterOptions) + parseDurationOfSingleTransition(leaveOptions);
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this2 = this, _props2 = this.props, children = _props2.children, props = (_props2.appearOptions,
+ _props2.enterOptions, _props2.leaveOptions, _objectWithoutProperties(_props2, [ "children", "appearOptions", "enterOptions", "leaveOptions" ]));
+ return _react2.default.createElement(_Transition2.default, _extends({}, props, {
+ onEnter: this.handleEnter,
+ onExit: this.handleExit,
+ timeout: this.parseTimeout()
+ }), function(transitionState) {
+ return _react2.default.createElement(_Animate2.default, _this2.state, _react.Children.only(children));
+ });
+ }
+ } ]), AnimateGroupChild;
+ }(_react.Component), _class.propTypes = {
+ appearOptions: _propTypes2.default.object,
+ enterOptions: _propTypes2.default.object,
+ leaveOptions: _propTypes2.default.object,
+ children: _propTypes2.default.element
+ }, _temp2);
+ exports.default = AnimateGroupChild;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(12), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), defaultFormatter = function(value) {
+ return __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(value) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.f)(value[0]) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.f)(value[1]) ? value.join(" ~ ") : value;
+ }, DefaultTooltipContent = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function DefaultTooltipContent() {
+ return _classCallCheck(this, DefaultTooltipContent), _possibleConstructorReturn(this, (DefaultTooltipContent.__proto__ || Object.getPrototypeOf(DefaultTooltipContent)).apply(this, arguments));
+ }
+ return _inherits(DefaultTooltipContent, _Component), _createClass(DefaultTooltipContent, [ {
+ key: "renderContent",
+ value: function() {
+ var _props = this.props, payload = _props.payload, separator = _props.separator, formatter = _props.formatter, itemStyle = _props.itemStyle, itemSorter = _props.itemSorter;
+ if (payload && payload.length) {
+ var listStyle = {
+ padding: 0,
+ margin: 0
+ }, items = payload.sort(itemSorter).map(function(entry, i) {
+ var finalItemStyle = _extends({
+ display: "block",
+ paddingTop: 4,
+ paddingBottom: 4,
+ color: entry.color || "#000"
+ }, itemStyle), hasName = Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.f)(entry.name), finalFormatter = entry.formatter || formatter || defaultFormatter;
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("li", {
+ className: "recharts-tooltip-item",
+ key: "tooltip-item-" + i,
+ style: finalItemStyle
+ }, hasName ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("span", {
+ className: "recharts-tooltip-item-name"
+ }, entry.name) : null, hasName ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("span", {
+ className: "recharts-tooltip-item-separator"
+ }, separator) : null, __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("span", {
+ className: "recharts-tooltip-item-value"
+ }, finalFormatter ? finalFormatter(entry.value, entry.name, entry, i) : entry.value), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("span", {
+ className: "recharts-tooltip-item-unit"
+ }, entry.unit || ""));
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("ul", {
+ className: "recharts-tooltip-item-list",
+ style: listStyle
+ }, items);
+ }
+ return null;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props2 = this.props, labelStyle = _props2.labelStyle, label = _props2.label, labelFormatter = _props2.labelFormatter, wrapperStyle = _props2.wrapperStyle, finalStyle = _extends({
+ margin: 0,
+ padding: 10,
+ backgroundColor: "#fff",
+ border: "1px solid #ccc",
+ whiteSpace: "nowrap"
+ }, wrapperStyle), finalLabelStyle = _extends({
+ margin: 0
+ }, labelStyle), hasLabel = Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.f)(label), finalLabel = hasLabel ? label : "";
+ return hasLabel && labelFormatter && (finalLabel = labelFormatter(label)), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("div", {
+ className: "recharts-default-tooltip",
+ style: finalStyle
+ }, __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("p", {
+ className: "recharts-tooltip-label",
+ style: finalLabelStyle
+ }, finalLabel), this.renderContent());
+ }
+ } ]), DefaultTooltipContent;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "DefaultTooltipContent",
+ _class2.propTypes = {
+ separator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,
+ formatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ wrapperStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ itemStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ labelStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ labelFormatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ label: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,
+ payload: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({
+ name: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,
+ value: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.array ]),
+ unit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any
+ })),
+ itemSorter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func
+ }, _class2.defaultProps = {
+ separator: " : ",
+ itemStyle: {},
+ labelStyle: {}
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = DefaultTooltipContent;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_debounce__ = __webpack_require__(157), __WEBPACK_IMPORTED_MODULE_0_lodash_debounce___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_debounce__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4_react_resize_detector__ = __webpack_require__(683), __WEBPACK_IMPORTED_MODULE_4_react_resize_detector___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_resize_detector__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_LogUtils__ = __webpack_require__(280), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), ResponsiveContainer = (_temp = _class = function(_Component) {
+ function ResponsiveContainer(props) {
+ _classCallCheck(this, ResponsiveContainer);
+ var _this = _possibleConstructorReturn(this, (ResponsiveContainer.__proto__ || Object.getPrototypeOf(ResponsiveContainer)).call(this, props));
+ return _this.updateDimensionsImmediate = function() {
+ if (_this.mounted) {
+ var newSize = _this.getContainerSize();
+ if (newSize) {
+ var _this$state = _this.state, oldWidth = _this$state.containerWidth, oldHeight = _this$state.containerHeight, containerWidth = newSize.containerWidth, containerHeight = newSize.containerHeight;
+ containerWidth === oldWidth && containerHeight === oldHeight || _this.setState({
+ containerWidth: containerWidth,
+ containerHeight: containerHeight
+ });
+ }
+ }
+ }, _this.state = {
+ containerWidth: -1,
+ containerHeight: -1
+ }, _this.handleResize = props.debounce > 0 ? __WEBPACK_IMPORTED_MODULE_0_lodash_debounce___default()(_this.updateDimensionsImmediate, props.debounce) : _this.updateDimensionsImmediate,
+ _this;
+ }
+ return _inherits(ResponsiveContainer, _Component), _createClass(ResponsiveContainer, [ {
+ key: "componentDidMount",
+ value: function() {
+ this.mounted = !0;
+ var size = this.getContainerSize();
+ size && this.setState(size);
+ }
+ }, {
+ key: "componentWillUnmount",
+ value: function() {
+ this.mounted = !1;
+ }
+ }, {
+ key: "getContainerSize",
+ value: function() {
+ return this.container ? {
+ containerWidth: this.container.clientWidth,
+ containerHeight: this.container.clientHeight
+ } : null;
+ }
+ }, {
+ key: "renderChart",
+ value: function() {
+ var _state = this.state, containerWidth = _state.containerWidth, containerHeight = _state.containerHeight;
+ if (containerWidth < 0 || containerHeight < 0) return null;
+ var _props = this.props, aspect = _props.aspect, width = _props.width, height = _props.height, minWidth = _props.minWidth, minHeight = _props.minHeight, maxHeight = _props.maxHeight, children = _props.children;
+ Object(__WEBPACK_IMPORTED_MODULE_6__util_LogUtils__.a)(Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(width) || Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(height), "The width(%s) and height(%s) are both fixed numbers,\n maybe you don't need to use a ResponsiveContainer.", width, height),
+ Object(__WEBPACK_IMPORTED_MODULE_6__util_LogUtils__.a)(!aspect || aspect > 0, "The aspect(%s) must be greater than zero.", aspect);
+ var calculatedWidth = Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(width) ? containerWidth : width, calculatedHeight = Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(height) ? containerHeight : height;
+ return aspect && aspect > 0 && (calculatedHeight = calculatedWidth / aspect, maxHeight && calculatedHeight > maxHeight && (calculatedHeight = maxHeight)),
+ Object(__WEBPACK_IMPORTED_MODULE_6__util_LogUtils__.a)(calculatedWidth > 0 || calculatedHeight > 0, "The width(%s) and height(%s) of chart should be greater than 0,\n please check the style of container, or the props width(%s) and height(%s),\n or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the\n height and width.", calculatedWidth, calculatedHeight, width, height, minWidth, minHeight, aspect),
+ __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(children, {
+ width: calculatedWidth,
+ height: calculatedHeight
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this2 = this, _props2 = this.props, minWidth = _props2.minWidth, minHeight = _props2.minHeight, width = _props2.width, height = _props2.height, maxHeight = _props2.maxHeight, id = _props2.id, className = _props2.className, style = {
+ width: width,
+ height: height,
+ minWidth: minWidth,
+ minHeight: minHeight,
+ maxHeight: maxHeight
+ };
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("div", {
+ id: id,
+ className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()("recharts-responsive-container", className),
+ style: style,
+ ref: function(node) {
+ _this2.container = node;
+ }
+ }, this.renderChart(), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_resize_detector___default.a, {
+ handleWidth: !0,
+ handleHeight: !0,
+ onResize: this.handleResize
+ }));
+ }
+ } ]), ResponsiveContainer;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.displayName = "ResponsiveContainer",
+ _class.propTypes = {
+ aspect: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ minHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ minWidth: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ maxHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ children: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.node.isRequired,
+ debounce: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ id: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),
+ className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ])
+ }, _class.defaultProps = {
+ width: "100%",
+ height: "100%",
+ debounce: 0
+ }, _temp);
+ __webpack_exports__.a = ResponsiveContainer;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _ResizeDetector = __webpack_require__(684), _ResizeDetector2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_ResizeDetector);
+ exports.default = _ResizeDetector2.default;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _slicedToArray = function() {
+ function sliceIterator(arr, i) {
+ var _arr = [], _n = !0, _d = !1, _e = void 0;
+ try {
+ for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value),
+ !i || _arr.length !== i); _n = !0) ;
+ } catch (err) {
+ _d = !0, _e = err;
+ } finally {
+ try {
+ !_n && _i.return && _i.return();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+ return _arr;
+ }
+ return function(arr, i) {
+ if (Array.isArray(arr)) return arr;
+ if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ };
+ }(), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _resizeDetectorStyles = __webpack_require__(685), ResizeDetector = function(_Component) {
+ function ResizeDetector() {
+ _classCallCheck(this, ResizeDetector);
+ var _this = _possibleConstructorReturn(this, (ResizeDetector.__proto__ || Object.getPrototypeOf(ResizeDetector)).call(this));
+ return _this.state = {
+ expandChildHeight: 0,
+ expandChildWidth: 0,
+ expandScrollLeft: 0,
+ expandScrollTop: 0,
+ shrinkScrollTop: 0,
+ shrinkScrollLeft: 0,
+ lastWidth: 0,
+ lastHeight: 0
+ }, _this.reset = _this.reset.bind(_this), _this.handleScroll = _this.handleScroll.bind(_this),
+ _this;
+ }
+ return _inherits(ResizeDetector, _Component), _createClass(ResizeDetector, [ {
+ key: "componentWillMount",
+ value: function() {
+ this.forceUpdate();
+ }
+ }, {
+ key: "componentDidMount",
+ value: function() {
+ var _containerSize = this.containerSize(), _containerSize2 = _slicedToArray(_containerSize, 2), width = _containerSize2[0], height = _containerSize2[1];
+ this.reset(width, height), this.props.onResize(width, height);
+ }
+ }, {
+ key: "shouldComponentUpdate",
+ value: function(nextProps, nextState) {
+ return this.props !== nextProps || this.state !== nextState;
+ }
+ }, {
+ key: "componentDidUpdate",
+ value: function() {
+ this.expand.scrollLeft = this.expand.scrollWidth, this.expand.scrollTop = this.expand.scrollHeight,
+ this.shrink.scrollLeft = this.shrink.scrollWidth, this.shrink.scrollTop = this.shrink.scrollHeight;
+ }
+ }, {
+ key: "containerSize",
+ value: function() {
+ return [ this.props.handleWidth && this.container.parentElement.offsetWidth, this.props.handleHeight && this.container.parentElement.offsetHeight ];
+ }
+ }, {
+ key: "reset",
+ value: function(containerWidth, containerHeight) {
+ if ("undefined" != typeof window) {
+ var parent = this.container.parentElement, position = "static";
+ parent.currentStyle ? position = parent.currentStyle.position : window.getComputedStyle && (position = window.getComputedStyle(parent).position),
+ "static" === position && (parent.style.position = "relative"), this.setState({
+ expandChildHeight: this.expand.offsetHeight + 10,
+ expandChildWidth: this.expand.offsetWidth + 10,
+ lastWidth: containerWidth,
+ lastHeight: containerHeight
+ });
+ }
+ }
+ }, {
+ key: "handleScroll",
+ value: function(e) {
+ if ("undefined" != typeof window) {
+ e.preventDefault(), e.stopPropagation();
+ var state = this.state, _containerSize3 = this.containerSize(), _containerSize4 = _slicedToArray(_containerSize3, 2), width = _containerSize4[0], height = _containerSize4[1];
+ width === state.lastWidth && height === state.lastHeight || this.props.onResize(width, height),
+ this.reset(width, height);
+ }
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _this2 = this, state = this.state, expandStyle = _extends({}, _resizeDetectorStyles.expandChildStyle, {
+ width: state.expandChildWidth,
+ height: state.expandChildHeight
+ });
+ return _react2.default.createElement("div", {
+ style: _resizeDetectorStyles.parentStyle,
+ ref: function(e) {
+ _this2.container = e;
+ }
+ }, _react2.default.createElement("div", {
+ style: _resizeDetectorStyles.parentStyle,
+ onScroll: this.handleScroll,
+ ref: function(e) {
+ _this2.expand = e;
+ }
+ }, _react2.default.createElement("div", {
+ style: expandStyle
+ })), _react2.default.createElement("div", {
+ style: _resizeDetectorStyles.parentStyle,
+ onScroll: this.handleScroll,
+ ref: function(e) {
+ _this2.shrink = e;
+ }
+ }, _react2.default.createElement("div", {
+ style: _resizeDetectorStyles.shrinkChildStyle
+ })));
+ }
+ } ]), ResizeDetector;
+ }(_react.Component);
+ exports.default = ResizeDetector, ResizeDetector.propTypes = {
+ handleWidth: _propTypes2.default.bool,
+ handleHeight: _propTypes2.default.bool,
+ onResize: _propTypes2.default.func
+ }, ResizeDetector.defaultProps = {
+ handleWidth: !1,
+ handleHeight: !1,
+ onResize: function(e) {
+ return e;
+ }
+ };
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ exports.parentStyle = {
+ position: "absolute",
+ left: 0,
+ top: 0,
+ right: 0,
+ bottom: 0,
+ overflow: "hidden",
+ zIndex: -1,
+ visibility: "hidden"
+ }, exports.shrinkChildStyle = {
+ position: "absolute",
+ left: 0,
+ top: 0,
+ width: "200%",
+ height: "200%"
+ }, exports.expandChildStyle = {
+ position: "absolute",
+ left: 0,
+ top: 0,
+ width: "100%",
+ height: "100%"
+ };
+}, function(module, exports, __webpack_require__) {
+ function reduceCSSCalc(value, decimalPrecision) {
+ function evaluateExpression(expression, functionIdentifier, call) {
+ if (stack++ > MAX_STACK) throw stack = 0, new Error("Call stack overflow for " + call);
+ if ("" === expression) throw new Error(functionIdentifier + "(): '" + call + "' must contain a non-whitespace string");
+ expression = evaluateNestedExpression(expression, call);
+ var units = getUnitsInExpression(expression);
+ if (units.length > 1 || expression.indexOf("var(") > -1) return functionIdentifier + "(" + expression + ")";
+ var unit = units[0] || "";
+ "%" === unit && (expression = expression.replace(/\b[0-9\.]+%/g, function(percent) {
+ return .01 * parseFloat(percent.slice(0, -1));
+ }));
+ var result, toEvaluate = expression.replace(new RegExp(unit, "gi"), "");
+ try {
+ result = mexp.eval(toEvaluate);
+ } catch (e) {
+ return functionIdentifier + "(" + expression + ")";
+ }
+ return "%" === unit && (result *= 100), (functionIdentifier.length || "%" === unit) && (result = Math.round(result * decimalPrecision) / decimalPrecision),
+ result += unit;
+ }
+ function evaluateNestedExpression(expression, call) {
+ expression = expression.replace(/((?:\-[a-z]+\-)?calc)/g, "");
+ for (var matches, evaluatedPart = "", nonEvaluatedPart = expression; matches = NESTED_CALC_RE.exec(nonEvaluatedPart); ) {
+ matches[0].index > 0 && (evaluatedPart += nonEvaluatedPart.substring(0, matches[0].index));
+ var balancedExpr = balanced("(", ")", nonEvaluatedPart.substring([ 0 ].index));
+ if ("" === balancedExpr.body) throw new Error("'" + expression + "' must contain a non-whitespace string");
+ var evaluated = evaluateExpression(balancedExpr.body, "", call);
+ evaluatedPart += balancedExpr.pre + evaluated, nonEvaluatedPart = balancedExpr.post;
+ }
+ return evaluatedPart + nonEvaluatedPart;
+ }
+ return stack = 0, decimalPrecision = Math.pow(10, void 0 === decimalPrecision ? 5 : decimalPrecision),
+ value = value.replace(/\n+/g, " "), reduceFunctionCall(value, /((?:\-[a-z]+\-)?calc)\(/, evaluateExpression);
+ }
+ function getUnitsInExpression(expression) {
+ for (var uniqueUnits = [], uniqueLowerCaseUnits = [], unitRegEx = /[\.0-9]([%a-z]+)/gi, matches = unitRegEx.exec(expression); matches; ) matches && matches[1] && (-1 === uniqueLowerCaseUnits.indexOf(matches[1].toLowerCase()) && (uniqueUnits.push(matches[1]),
+ uniqueLowerCaseUnits.push(matches[1].toLowerCase())), matches = unitRegEx.exec(expression));
+ return uniqueUnits;
+ }
+ var stack, balanced = __webpack_require__(687), reduceFunctionCall = __webpack_require__(688), mexp = __webpack_require__(690), MAX_STACK = 100, NESTED_CALC_RE = /(\+|\-|\*|\\|[^a-z]|)(\s*)(\()/g;
+ module.exports = reduceCSSCalc;
+}, function(module, exports) {
+ function balanced(a, b, str) {
+ a instanceof RegExp && (a = maybeMatch(a, str)), b instanceof RegExp && (b = maybeMatch(b, str));
+ var r = range(a, b, str);
+ return r && {
+ start: r[0],
+ end: r[1],
+ pre: str.slice(0, r[0]),
+ body: str.slice(r[0] + a.length, r[1]),
+ post: str.slice(r[1] + b.length)
+ };
+ }
+ function maybeMatch(reg, str) {
+ var m = str.match(reg);
+ return m ? m[0] : null;
+ }
+ function range(a, b, str) {
+ var begs, beg, left, right, result, ai = str.indexOf(a), bi = str.indexOf(b, ai + 1), i = ai;
+ if (ai >= 0 && bi > 0) {
+ for (begs = [], left = str.length; i >= 0 && !result; ) i == ai ? (begs.push(i),
+ ai = str.indexOf(a, i + 1)) : 1 == begs.length ? result = [ begs.pop(), bi ] : (beg = begs.pop(),
+ beg < left && (left = beg, right = bi), bi = str.indexOf(b, i + 1)), i = ai < bi && ai >= 0 ? ai : bi;
+ begs.length && (result = [ left, right ]);
+ }
+ return result;
+ }
+ module.exports = balanced, balanced.range = range;
+}, function(module, exports, __webpack_require__) {
+ function reduceFunctionCall(string, functionRE, callback) {
+ var call = string;
+ return getFunctionCalls(string, functionRE).reduce(function(string, obj) {
+ return string.replace(obj.functionIdentifier + "(" + obj.matches.body + ")", evalFunctionCall(obj.matches.body, obj.functionIdentifier, callback, call, functionRE));
+ }, string);
+ }
+ function getFunctionCalls(call, functionRE) {
+ var expressions = [], fnRE = "string" == typeof functionRE ? new RegExp("\\b(" + functionRE + ")\\(") : functionRE;
+ do {
+ var searchMatch = fnRE.exec(call);
+ if (!searchMatch) return expressions;
+ if (void 0 === searchMatch[1]) throw new Error("Missing the first couple of parenthesis to get the function identifier in " + functionRE);
+ var fn = searchMatch[1], startIndex = searchMatch.index, matches = balanced("(", ")", call.substring(startIndex));
+ if (!matches || matches.start !== searchMatch[0].length - 1) throw new SyntaxError(fn + "(): missing closing ')' in the value '" + call + "'");
+ expressions.push({
+ matches: matches,
+ functionIdentifier: fn
+ }), call = matches.post;
+ } while (fnRE.test(call));
+ return expressions;
+ }
+ function evalFunctionCall(string, functionIdentifier, callback, call, functionRE) {
+ return callback(reduceFunctionCall(string, functionRE, callback), functionIdentifier, call);
+ }
+ var balanced = __webpack_require__(689);
+ module.exports = reduceFunctionCall;
+}, function(module, exports) {
+ function balanced(a, b, str) {
+ a instanceof RegExp && (a = maybeMatch(a, str)), b instanceof RegExp && (b = maybeMatch(b, str));
+ var r = range(a, b, str);
+ return r && {
+ start: r[0],
+ end: r[1],
+ pre: str.slice(0, r[0]),
+ body: str.slice(r[0] + a.length, r[1]),
+ post: str.slice(r[1] + b.length)
+ };
+ }
+ function maybeMatch(reg, str) {
+ var m = str.match(reg);
+ return m ? m[0] : null;
+ }
+ function range(a, b, str) {
+ var begs, beg, left, right, result, ai = str.indexOf(a), bi = str.indexOf(b, ai + 1), i = ai;
+ if (ai >= 0 && bi > 0) {
+ for (begs = [], left = str.length; i >= 0 && !result; ) i == ai ? (begs.push(i),
+ ai = str.indexOf(a, i + 1)) : 1 == begs.length ? result = [ begs.pop(), bi ] : (beg = begs.pop(),
+ beg < left && (left = beg, right = bi), bi = str.indexOf(b, i + 1)), i = ai < bi && ai >= 0 ? ai : bi;
+ begs.length && (result = [ left, right ]);
+ }
+ return result;
+ }
+ module.exports = balanced, balanced.range = range;
+}, function(module, exports, __webpack_require__) {
+ var Mexp = __webpack_require__(691);
+ Mexp.prototype.formulaEval = function() {
+ "use strict";
+ for (var pop1, pop2, pop3, disp = [], arr = this.value, i = 0; i < arr.length; i++) 1 === arr[i].type || 3 === arr[i].type ? disp.push({
+ value: 3 === arr[i].type ? arr[i].show : arr[i].value,
+ type: 1
+ }) : 13 === arr[i].type ? disp.push({
+ value: arr[i].show,
+ type: 1
+ }) : 0 === arr[i].type ? disp[disp.length - 1] = {
+ value: arr[i].show + ("-" != arr[i].show ? "(" : "") + disp[disp.length - 1].value + ("-" != arr[i].show ? ")" : ""),
+ type: 0
+ } : 7 === arr[i].type ? disp[disp.length - 1] = {
+ value: (1 != disp[disp.length - 1].type ? "(" : "") + disp[disp.length - 1].value + (1 != disp[disp.length - 1].type ? ")" : "") + arr[i].show,
+ type: 7
+ } : 10 === arr[i].type ? (pop1 = disp.pop(), pop2 = disp.pop(), "P" === arr[i].show || "C" === arr[i].show ? disp.push({
+ value: "<sup>" + pop2.value + "</sup>" + arr[i].show + "<sub>" + pop1.value + "</sub>",
+ type: 10
+ }) : disp.push({
+ value: (1 != pop2.type ? "(" : "") + pop2.value + (1 != pop2.type ? ")" : "") + "<sup>" + pop1.value + "</sup>",
+ type: 1
+ })) : 2 === arr[i].type || 9 === arr[i].type ? (pop1 = disp.pop(), pop2 = disp.pop(),
+ disp.push({
+ value: (1 != pop2.type ? "(" : "") + pop2.value + (1 != pop2.type ? ")" : "") + arr[i].show + (1 != pop1.type ? "(" : "") + pop1.value + (1 != pop1.type ? ")" : ""),
+ type: arr[i].type
+ })) : 12 === arr[i].type && (pop1 = disp.pop(), pop2 = disp.pop(), pop3 = disp.pop(),
+ disp.push({
+ value: arr[i].show + "(" + pop3.value + "," + pop2.value + "," + pop1.value + ")",
+ type: 12
+ }));
+ return disp[0].value;
+ }, module.exports = Mexp;
+}, function(module, exports, __webpack_require__) {
+ var Mexp = __webpack_require__(692);
+ Mexp.prototype.postfixEval = function(UserDefined) {
+ "use strict";
+ UserDefined = UserDefined || {}, UserDefined.PI = Math.PI, UserDefined.E = Math.E;
+ for (var pop1, pop2, pop3, stack = [], arr = this.value, bool = void 0 !== UserDefined.n, i = 0; i < arr.length; i++) 1 === arr[i].type ? stack.push({
+ value: arr[i].value,
+ type: 1
+ }) : 3 === arr[i].type ? stack.push({
+ value: UserDefined[arr[i].value],
+ type: 1
+ }) : 0 === arr[i].type ? void 0 === stack[stack.length - 1].type ? stack[stack.length - 1].value.push(arr[i]) : stack[stack.length - 1].value = arr[i].value(stack[stack.length - 1].value) : 7 === arr[i].type ? void 0 === stack[stack.length - 1].type ? stack[stack.length - 1].value.push(arr[i]) : stack[stack.length - 1].value = arr[i].value(stack[stack.length - 1].value) : 8 === arr[i].type ? (pop1 = stack.pop(),
+ pop2 = stack.pop(), stack.push({
+ type: 1,
+ value: arr[i].value(pop2.value, pop1.value)
+ })) : 10 === arr[i].type ? (pop1 = stack.pop(), pop2 = stack.pop(), void 0 === pop2.type ? (pop2.value = pop2.concat(pop1),
+ pop2.value.push(arr[i]), stack.push(pop2)) : void 0 === pop1.type ? (pop1.unshift(pop2),
+ pop1.push(arr[i]), stack.push(pop1)) : stack.push({
+ type: 1,
+ value: arr[i].value(pop2.value, pop1.value)
+ })) : 2 === arr[i].type || 9 === arr[i].type ? (pop1 = stack.pop(), pop2 = stack.pop(),
+ void 0 === pop2.type ? (console.log(pop2), pop2 = pop2.concat(pop1), pop2.push(arr[i]),
+ stack.push(pop2)) : void 0 === pop1.type ? (pop1.unshift(pop2), pop1.push(arr[i]),
+ stack.push(pop1)) : stack.push({
+ type: 1,
+ value: arr[i].value(pop2.value, pop1.value)
+ })) : 12 === arr[i].type ? (pop1 = stack.pop(), void 0 !== pop1.type && (pop1 = [ pop1 ]),
+ pop2 = stack.pop(), pop3 = stack.pop(), stack.push({
+ type: 1,
+ value: arr[i].value(pop3.value, pop2.value, new Mexp(pop1))
+ })) : 13 === arr[i].type && (bool ? stack.push({
+ value: UserDefined[arr[i].value],
+ type: 3
+ }) : stack.push([ arr[i] ]));
+ if (stack.length > 1) throw new Mexp.exception("Uncaught Syntax error");
+ return stack[0].value > 1e15 ? "Infinity" : parseFloat(stack[0].value.toFixed(15));
+ }, Mexp.eval = function(str, tokens, obj) {
+ return void 0 === tokens ? this.lex(str).toPostfix().postfixEval() : void 0 === obj ? void 0 !== tokens.length ? this.lex(str, tokens).toPostfix().postfixEval() : this.lex(str).toPostfix().postfixEval(tokens) : this.lex(str, tokens).toPostfix().postfixEval(obj);
+ }, module.exports = Mexp;
+}, function(module, exports, __webpack_require__) {
+ var Mexp = __webpack_require__(693);
+ Mexp.prototype.toPostfix = function() {
+ "use strict";
+ for (var elem, popped, prep, pre, ele, post = [], stack = [ {
+ value: "(",
+ type: 4,
+ pre: 0
+ } ], arr = this.value, i = 1; i < arr.length; i++) if (1 === arr[i].type || 3 === arr[i].type || 13 === arr[i].type) 1 === arr[i].type && (arr[i].value = Number(arr[i].value)),
+ post.push(arr[i]); else if (4 === arr[i].type) stack.push(arr[i]); else if (5 === arr[i].type) for (;4 !== (popped = stack.pop()).type; ) post.push(popped); else if (11 === arr[i].type) {
+ for (;4 !== (popped = stack.pop()).type; ) post.push(popped);
+ stack.push(popped);
+ } else {
+ elem = arr[i], pre = elem.pre, ele = stack[stack.length - 1], prep = ele.pre;
+ var flag = "Math.pow" == ele.value && "Math.pow" == elem.value;
+ if (pre > prep) stack.push(elem); else {
+ for (;prep >= pre && !flag || flag && pre < prep; ) popped = stack.pop(), ele = stack[stack.length - 1],
+ post.push(popped), prep = ele.pre, flag = "Math.pow" == elem.value && "Math.pow" == ele.value;
+ stack.push(elem);
+ }
+ }
+ return new Mexp(post);
+ }, module.exports = Mexp;
+}, function(module, exports, __webpack_require__) {
+ function inc(arr, val) {
+ for (var i = 0; i < arr.length; i++) arr[i] += val;
+ return arr;
+ }
+ function match(str1, str2, i, x) {
+ for (var f = 0; f < x; f++) if (str1[i + f] !== str2[f]) return !1;
+ return !0;
+ }
+ var Mexp = __webpack_require__(694), token = [ "sin", "cos", "tan", "pi", "(", ")", "P", "C", "asin", "acos", "atan", "7", "8", "9", "int", "cosh", "acosh", "ln", "^", "root", "4", "5", "6", "/", "!", "tanh", "atanh", "Mod", "1", "2", "3", "*", "sinh", "asinh", "e", "log", "0", ".", "+", "-", ",", "Sigma", "n", "Pi", "pow" ], show = [ "sin", "cos", "tan", "&pi;", "(", ")", "P", "C", "asin", "acos", "atan", "7", "8", "9", "Int", "cosh", "acosh", " ln", "^", "root", "4", "5", "6", "&divide;", "!", "tanh", "atanh", " Mod ", "1", "2", "3", "&times;", "sinh", "asinh", "e", " log", "0", ".", "+", "-", ",", "&Sigma;", "n", "&Pi;", "pow" ], eva = [ Mexp.math.sin, Mexp.math.cos, Mexp.math.tan, "PI", "(", ")", Mexp.math.P, Mexp.math.C, Mexp.math.asin, Mexp.math.acos, Mexp.math.atan, "7", "8", "9", Math.floor, Mexp.math.cosh, Mexp.math.acosh, Math.log, Math.pow, Math.sqrt, "4", "5", "6", Mexp.math.div, Mexp.math.fact, Mexp.math.tanh, Mexp.math.atanh, Mexp.math.mod, "1", "2", "3", Mexp.math.mul, Mexp.math.sinh, Mexp.math.asinh, "E", Mexp.math.log, "0", ".", Mexp.math.add, Mexp.math.sub, ",", Mexp.math.sigma, "n", Mexp.math.Pi, Math.pow ], preced = {
+ 0: 11,
+ 1: 0,
+ 2: 3,
+ 3: 0,
+ 4: 0,
+ 5: 0,
+ 6: 0,
+ 7: 11,
+ 8: 11,
+ 9: 1,
+ 10: 10,
+ 11: 0,
+ 12: 11,
+ 13: 0
+ }, type = [ 0, 0, 0, 3, 4, 5, 10, 10, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 10, 0, 1, 1, 1, 2, 7, 0, 0, 2, 1, 1, 1, 2, 0, 0, 3, 0, 1, 6, 9, 9, 11, 12, 13, 12, 8 ], type0 = {
+ 0: !0,
+ 1: !0,
+ 3: !0,
+ 4: !0,
+ 6: !0,
+ 8: !0,
+ 9: !0,
+ 12: !0,
+ 13: !0
+ }, type1 = {
+ 0: !0,
+ 1: !0,
+ 2: !0,
+ 3: !0,
+ 4: !0,
+ 5: !0,
+ 6: !0,
+ 7: !0,
+ 8: !0,
+ 9: !0,
+ 10: !0,
+ 11: !0,
+ 12: !0,
+ 13: !0
+ }, type_1 = {
+ 0: !0,
+ 3: !0,
+ 4: !0,
+ 8: !0,
+ 12: !0,
+ 13: !0
+ }, empty = {}, type_3 = {
+ 0: !0,
+ 1: !0,
+ 3: !0,
+ 4: !0,
+ 6: !0,
+ 8: !0,
+ 12: !0,
+ 13: !0
+ }, type6 = {
+ 1: !0
+ }, newAr = [ [], [ "1", "2", "3", "7", "8", "9", "4", "5", "6", "+", "-", "*", "/", "(", ")", "^", "!", "P", "C", "e", "0", ".", ",", "n" ], [ "pi", "ln", "Pi" ], [ "sin", "cos", "tan", "Del", "int", "Mod", "log", "pow" ], [ "asin", "acos", "atan", "cosh", "root", "tanh", "sinh" ], [ "acosh", "atanh", "asinh", "Sigma" ] ];
+ Mexp.addToken = function(tokens) {
+ for (i = 0; i < tokens.length; i++) {
+ x = tokens[i].token.length;
+ var temp = -1;
+ if (x < newAr.length) for (y = 0; y < newAr[x].length; y++) if (tokens[i].token === newAr[x][y]) {
+ temp = token.indexOf(newAr[x][y]);
+ break;
+ }
+ -1 === temp ? (token.push(tokens[i].token), type.push(tokens[i].type), newAr.length <= tokens[i].token.length && (newAr[tokens[i].token.length] = []),
+ newAr[tokens[i].token.length].push(tokens[i].token), eva.push(tokens[i].value),
+ show.push(tokens[i].show)) : (token[temp] = tokens[i].token, type[temp] = tokens[i].type,
+ eva[temp] = tokens[i].value, show[temp] = tokens[i].show);
+ }
+ }, Mexp.lex = function(inp, tokens) {
+ "use strict";
+ var key, i, x, y, str = [ {
+ type: 4,
+ value: "(",
+ show: "(",
+ pre: 0
+ } ], ptc = [], inpStr = inp, pcounter = 0, allowed = type0, bracToClose = 0, asterick = empty, prevKey = "";
+ void 0 !== tokens && Mexp.addToken(tokens);
+ var obj = {};
+ for (i = 0; i < inpStr.length; i++) if (" " != inpStr[i]) {
+ key = "";
+ sec: for (x = inpStr.length - i > newAr.length - 2 ? newAr.length - 1 : inpStr.length - i; x > 0; x--) for (y = 0; y < newAr[x].length; y++) if (match(inpStr, newAr[x][y], i, x)) {
+ key = newAr[x][y];
+ break sec;
+ }
+ if (i += key.length - 1, "" === key) throw new Mexp.exception("Can't understand after " + inpStr.slice(i));
+ var index = token.indexOf(key), cToken = key, cType = type[index], cEv = eva[index], cPre = preced[cType], cShow = show[index], pre = str[str.length - 1];
+ for (j = ptc.length; j--; ) if (0 === ptc[j] && -1 !== [ 0, 2, 3, 5, 9, 11, 12, 13 ].indexOf(cType)) {
+ if (!0 !== allowed[cType]) throw new Mexp.exception(key + " is not allowed after " + prevKey);
+ str.push({
+ value: ")",
+ type: 5,
+ pre: 0,
+ show: ")"
+ }), allowed = type1, asterick = type_3, inc(ptc, -1).pop();
+ }
+ if (!0 !== allowed[cType]) throw new Mexp.exception(key + " is not allowed after " + prevKey);
+ if (!0 === asterick[cType] && (cType = 2, cEv = Mexp.math.mul, cShow = "&times;",
+ cPre = 3, i -= key.length), obj = {
+ value: cEv,
+ type: cType,
+ pre: cPre,
+ show: cShow
+ }, 0 === cType) allowed = type0, asterick = empty, inc(ptc, 2).push(2), str.push(obj),
+ str.push({
+ value: "(",
+ type: 4,
+ pre: 0,
+ show: "("
+ }); else if (1 === cType) 1 === pre.type ? (pre.value += cEv, inc(ptc, 1)) : str.push(obj),
+ allowed = type1, asterick = type_1; else if (2 === cType) allowed = type0, asterick = empty,
+ inc(ptc, 2), str.push(obj); else if (3 === cType) str.push(obj), allowed = type1,
+ asterick = type_3; else if (4 === cType) pcounter += ptc.length, ptc = [], bracToClose++,
+ allowed = type0, asterick = empty, str.push(obj); else if (5 === cType) {
+ if (!bracToClose) throw new Mexp.exception("Closing parenthesis are more than opening one, wait What!!!");
+ for (;pcounter--; ) str.push({
+ value: ")",
+ type: 5,
+ pre: 0,
+ show: ")"
+ });
+ pcounter = 0, bracToClose--, allowed = type1, asterick = type_3, str.push(obj);
+ } else if (6 === cType) {
+ if (pre.hasDec) throw new Mexp.exception("Two decimals are not allowed in one number");
+ 1 !== pre.type && (pre = {
+ value: 0,
+ type: 1,
+ pre: 0
+ }, str.push(pre), inc(ptc, -1)), allowed = type6, inc(ptc, 1), asterick = empty,
+ pre.value += cEv, pre.hasDec = !0;
+ } else 7 === cType && (allowed = type1, asterick = type_3, inc(ptc, 1), str.push(obj));
+ 8 === cType ? (allowed = type0, asterick = empty, inc(ptc, 4).push(4), str.push(obj),
+ str.push({
+ value: "(",
+ type: 4,
+ pre: 0,
+ show: "("
+ })) : 9 === cType ? (9 === pre.type ? pre.value === Mexp.math.add ? (pre.value = cEv,
+ pre.show = cShow, inc(ptc, 1)) : pre.value === Mexp.math.sub && "-" === cShow && (pre.value = Mexp.math.add,
+ pre.show = "+", inc(ptc, 1)) : 5 !== pre.type && 7 !== pre.type && 1 !== pre.type && 3 !== pre.type && 13 !== pre.type ? "-" === cToken && (allowed = type0,
+ asterick = empty, inc(ptc, 2).push(2), str.push({
+ value: Mexp.math.changeSign,
+ type: 0,
+ pre: 21,
+ show: "-"
+ }), str.push({
+ value: "(",
+ type: 4,
+ pre: 0,
+ show: "("
+ })) : (str.push(obj), inc(ptc, 2)), allowed = type0, asterick = empty) : 10 === cType ? (allowed = type0,
+ asterick = empty, inc(ptc, 2), str.push(obj)) : 11 === cType ? (allowed = type0,
+ asterick = empty, str.push(obj)) : 12 === cType ? (allowed = type0, asterick = empty,
+ inc(ptc, 6).push(6), str.push(obj), str.push({
+ value: "(",
+ type: 4,
+ pre: 0
+ })) : 13 === cType && (allowed = type1, asterick = type_3, str.push(obj)), inc(ptc, -1),
+ prevKey = key;
+ }
+ for (var j = ptc.length; j--; ) 0 === ptc[j] && (str.push({
+ value: ")",
+ show: ")",
+ type: 5,
+ pre: 3
+ }), inc(ptc, -1).pop());
+ if (!0 !== allowed[5]) throw new Mexp.exception("complete the expression");
+ for (;bracToClose--; ) str.push({
+ value: ")",
+ show: ")",
+ type: 5,
+ pre: 3
+ });
+ return str.push({
+ type: 5,
+ value: ")",
+ show: ")",
+ pre: 0
+ }), new Mexp(str);
+ }, module.exports = Mexp;
+}, function(module, exports) {
+ var Mexp = function(parsed) {
+ this.value = parsed;
+ };
+ Mexp.math = {
+ isDegree: !0,
+ acos: function(x) {
+ return Mexp.math.isDegree ? 180 / Math.PI * Math.acos(x) : Math.acos(x);
+ },
+ add: function(a, b) {
+ return a + b;
+ },
+ asin: function(x) {
+ return Mexp.math.isDegree ? 180 / Math.PI * Math.asin(x) : Math.asin(x);
+ },
+ atan: function(x) {
+ return Mexp.math.isDegree ? 180 / Math.PI * Math.atan(x) : Math.atan(x);
+ },
+ acosh: function(x) {
+ return Math.log(x + Math.sqrt(x * x - 1));
+ },
+ asinh: function(x) {
+ return Math.log(x + Math.sqrt(x * x + 1));
+ },
+ atanh: function(x) {
+ return Math.log((1 + x) / (1 - x));
+ },
+ C: function(n, r) {
+ var pro = 1, other = n - r, choice = r;
+ choice < other && (choice = other, other = r);
+ for (var i = choice + 1; i <= n; i++) pro *= i;
+ return pro / Mexp.math.fact(other);
+ },
+ changeSign: function(x) {
+ return -x;
+ },
+ cos: function(x) {
+ return Mexp.math.isDegree && (x = Mexp.math.toRadian(x)), Math.cos(x);
+ },
+ cosh: function(x) {
+ return (Math.pow(Math.E, x) + Math.pow(Math.E, -1 * x)) / 2;
+ },
+ div: function(a, b) {
+ return a / b;
+ },
+ fact: function(n) {
+ if (n % 1 != 0) return "NAN";
+ for (var pro = 1, i = 2; i <= n; i++) pro *= i;
+ return pro;
+ },
+ inverse: function(x) {
+ return 1 / x;
+ },
+ log: function(i) {
+ return Math.log(i) / Math.log(10);
+ },
+ mod: function(a, b) {
+ return a % b;
+ },
+ mul: function(a, b) {
+ return a * b;
+ },
+ P: function(n, r) {
+ for (var pro = 1, i = Math.floor(n) - Math.floor(r) + 1; i <= Math.floor(n); i++) pro *= i;
+ return pro;
+ },
+ Pi: function(low, high, ex) {
+ for (var pro = 1, i = low; i <= high; i++) pro *= Number(ex.postfixEval({
+ n: i
+ }));
+ return pro;
+ },
+ pow10x: function(e) {
+ for (var x = 1; e--; ) x *= 10;
+ return x;
+ },
+ sigma: function(low, high, ex) {
+ for (var sum = 0, i = low; i <= high; i++) sum += Number(ex.postfixEval({
+ n: i
+ }));
+ return sum;
+ },
+ sin: function(x) {
+ return Mexp.math.isDegree && (x = Mexp.math.toRadian(x)), Math.sin(x);
+ },
+ sinh: function(x) {
+ return (Math.pow(Math.E, x) - Math.pow(Math.E, -1 * x)) / 2;
+ },
+ sub: function(a, b) {
+ return a - b;
+ },
+ tan: function(x) {
+ return Mexp.math.isDegree && (x = Mexp.math.toRadian(x)), Math.tan(x);
+ },
+ tanh: function(x) {
+ return Mexp.sinha(x) / Mexp.cosha(x);
+ },
+ toRadian: function(x) {
+ return x * Math.PI / 180;
+ }
+ }, Mexp.exception = function(message) {
+ this.message = message;
+ }, module.exports = Mexp;
+}, function(module, exports, __webpack_require__) {
+ function baseFlatten(array, depth, predicate, isStrict, result) {
+ var index = -1, length = array.length;
+ for (predicate || (predicate = isFlattenable), result || (result = []); ++index < length; ) {
+ var value = array[index];
+ depth > 0 && predicate(value) ? depth > 1 ? baseFlatten(value, depth - 1, predicate, isStrict, result) : arrayPush(result, value) : isStrict || (result[result.length] = value);
+ }
+ return result;
+ }
+ var arrayPush = __webpack_require__(268), isFlattenable = __webpack_require__(696);
+ module.exports = baseFlatten;
+}, function(module, exports, __webpack_require__) {
+ function isFlattenable(value) {
+ return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
+ }
+ var Symbol = __webpack_require__(77), isArguments = __webpack_require__(180), isArray = __webpack_require__(12), spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : void 0;
+ module.exports = isFlattenable;
+}, function(module, exports, __webpack_require__) {
+ function baseOrderBy(collection, iteratees, orders) {
+ var index = -1;
+ iteratees = arrayMap(iteratees.length ? iteratees : [ identity ], baseUnary(baseIteratee));
+ var result = baseMap(collection, function(value, key, collection) {
+ return {
+ criteria: arrayMap(iteratees, function(iteratee) {
+ return iteratee(value);
+ }),
+ index: ++index,
+ value: value
+ };
+ });
+ return baseSortBy(result, function(object, other) {
+ return compareMultiple(object, other, orders);
+ });
+ }
+ var arrayMap = __webpack_require__(115), baseIteratee = __webpack_require__(84), baseMap = __webpack_require__(698), baseSortBy = __webpack_require__(699), baseUnary = __webpack_require__(183), compareMultiple = __webpack_require__(700), identity = __webpack_require__(63);
+ module.exports = baseOrderBy;
+}, function(module, exports, __webpack_require__) {
+ function baseMap(collection, iteratee) {
+ var index = -1, result = isArrayLike(collection) ? Array(collection.length) : [];
+ return baseEach(collection, function(value, key, collection) {
+ result[++index] = iteratee(value, key, collection);
+ }), result;
+ }
+ var baseEach = __webpack_require__(277), isArrayLike = __webpack_require__(83);
+ module.exports = baseMap;
+}, function(module, exports) {
+ function baseSortBy(array, comparer) {
+ var length = array.length;
+ for (array.sort(comparer); length--; ) array[length] = array[length].value;
+ return array;
+ }
+ module.exports = baseSortBy;
+}, function(module, exports, __webpack_require__) {
+ function compareMultiple(object, other, orders) {
+ for (var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; ++index < length; ) {
+ var result = compareAscending(objCriteria[index], othCriteria[index]);
+ if (result) {
+ if (index >= ordersLength) return result;
+ return result * ("desc" == orders[index] ? -1 : 1);
+ }
+ }
+ return object.index - other.index;
+ }
+ var compareAscending = __webpack_require__(701);
+ module.exports = compareMultiple;
+}, function(module, exports, __webpack_require__) {
+ function compareAscending(value, other) {
+ if (value !== other) {
+ var valIsDefined = void 0 !== value, valIsNull = null === value, valIsReflexive = value === value, valIsSymbol = isSymbol(value), othIsDefined = void 0 !== other, othIsNull = null === other, othIsReflexive = other === other, othIsSymbol = isSymbol(other);
+ if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) return 1;
+ if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) return -1;
+ }
+ return 0;
+ }
+ var isSymbol = __webpack_require__(62);
+ module.exports = compareAscending;
+}, function(module, exports, __webpack_require__) {
+ function max(array) {
+ return array && array.length ? baseExtremum(array, identity, baseGt) : void 0;
+ }
+ var baseExtremum = __webpack_require__(124), baseGt = __webpack_require__(283), identity = __webpack_require__(63);
+ module.exports = max;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _getNiceTickValues = __webpack_require__(704);
+ Object.defineProperty(exports, "getTickValues", {
+ enumerable: !0,
+ get: function() {
+ return _getNiceTickValues.getTickValues;
+ }
+ }), Object.defineProperty(exports, "getNiceTickValues", {
+ enumerable: !0,
+ get: function() {
+ return _getNiceTickValues.getNiceTickValues;
+ }
+ }), Object.defineProperty(exports, "getTickValuesFixedDomain", {
+ enumerable: !0,
+ get: function() {
+ return _getNiceTickValues.getTickValuesFixedDomain;
+ }
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+ return arr2;
+ }
+ return Array.from(arr);
+ }
+ function getValidInterval(_ref) {
+ var _ref2 = _slicedToArray(_ref, 2), min = _ref2[0], max = _ref2[1], validMin = min, validMax = max;
+ return min > max && (validMin = max, validMax = min), [ validMin, validMax ];
+ }
+ function getFormatStep(roughStep, allowDecimals, correctionFactor) {
+ if (roughStep <= 0) return 0;
+ var digitCount = _arithmetic2.default.getDigitCount(roughStep), stepRatio = roughStep / Math.pow(10, digitCount), amendStepRatio = 1 !== digitCount ? _arithmetic2.default.multiply(Math.ceil(stepRatio / .05) + correctionFactor, .05) : _arithmetic2.default.multiply(Math.ceil(stepRatio / .1) + correctionFactor, .1), formatStep = _arithmetic2.default.multiply(amendStepRatio, Math.pow(10, digitCount));
+ return allowDecimals ? formatStep : Math.ceil(formatStep);
+ }
+ function getTickOfSingleValue(value, tickCount, allowDecimals) {
+ var isFlt = _arithmetic2.default.isFloat(value), step = 1, middle = value;
+ if (isFlt && allowDecimals) {
+ var absVal = Math.abs(value);
+ absVal < 1 ? (step = Math.pow(10, _arithmetic2.default.getDigitCount(value) - 1),
+ middle = _arithmetic2.default.multiply(Math.floor(value / step), step)) : absVal > 1 && (middle = Math.floor(value));
+ } else 0 === value ? middle = Math.floor((tickCount - 1) / 2) : allowDecimals || (middle = Math.floor(value));
+ var middleIndex = Math.floor((tickCount - 1) / 2);
+ return (0, _utils.compose)((0, _utils.map)(function(n) {
+ return _arithmetic2.default.sum(middle, _arithmetic2.default.multiply(n - middleIndex, step));
+ }), _utils.range)(0, tickCount);
+ }
+ function calculateStep(min, max, tickCount, allowDecimals) {
+ var correctionFactor = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0, step = getFormatStep((max - min) / (tickCount - 1), allowDecimals, correctionFactor), middle = void 0;
+ min <= 0 && max >= 0 ? middle = 0 : (middle = _arithmetic2.default.divide(_arithmetic2.default.sum(min, max), 2),
+ middle = _arithmetic2.default.minus(middle, _arithmetic2.default.modulo(middle, step)),
+ middle = _arithmetic2.default.strip(middle, 16));
+ var belowCount = Math.ceil((middle - min) / step), upCount = Math.ceil((max - middle) / step), scaleCount = belowCount + upCount + 1;
+ return scaleCount > tickCount ? calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1) : (scaleCount < tickCount && (upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount,
+ belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount)), {
+ step: step,
+ tickMin: _arithmetic2.default.minus(middle, _arithmetic2.default.multiply(belowCount, step)),
+ tickMax: _arithmetic2.default.sum(middle, _arithmetic2.default.multiply(upCount, step))
+ });
+ }
+ function getNiceTickValuesFn(_ref3) {
+ var _ref4 = _slicedToArray(_ref3, 2), min = _ref4[0], max = _ref4[1], tickCount = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 6, allowDecimals = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], count = Math.max(tickCount, 2), _getValidInterval = getValidInterval([ min, max ]), _getValidInterval2 = _slicedToArray(_getValidInterval, 2), cormin = _getValidInterval2[0], cormax = _getValidInterval2[1];
+ if (cormin === cormax) return getTickOfSingleValue(cormin, tickCount, allowDecimals);
+ var _calculateStep = calculateStep(cormin, cormax, count, allowDecimals), step = _calculateStep.step, tickMin = _calculateStep.tickMin, tickMax = _calculateStep.tickMax, values = _arithmetic2.default.rangeStep(tickMin, tickMax + .1 * step, step);
+ return min > max ? (0, _utils.reverse)(values) : values;
+ }
+ function getTickValuesFn(_ref5) {
+ var _ref6 = _slicedToArray(_ref5, 2), min = _ref6[0], max = _ref6[1], tickCount = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 6, allowDecimals = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], count = Math.max(tickCount, 2), _getValidInterval3 = getValidInterval([ min, max ]), _getValidInterval4 = _slicedToArray(_getValidInterval3, 2), cormin = _getValidInterval4[0], cormax = _getValidInterval4[1];
+ if (cormin === cormax) return getTickOfSingleValue(cormin, tickCount, allowDecimals);
+ var step = getFormatStep((cormax - cormin) / (count - 1), allowDecimals, 0), fn = (0,
+ _utils.compose)((0, _utils.map)(function(n) {
+ return cormin + n * step;
+ }), _utils.range), values = fn(0, count).filter(function(entry) {
+ return entry >= cormin && entry <= cormax;
+ });
+ return min > max ? (0, _utils.reverse)(values) : values;
+ }
+ function getTickValuesFixedDomainFn(_ref7, tickCount) {
+ var _ref8 = _slicedToArray(_ref7, 2), min = _ref8[0], max = _ref8[1], allowDecimals = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], _getValidInterval5 = getValidInterval([ min, max ]), _getValidInterval6 = _slicedToArray(_getValidInterval5, 2), cormin = _getValidInterval6[0], cormax = _getValidInterval6[1];
+ if (cormin === cormax) return [ cormin ];
+ var count = Math.max(tickCount, 2), step = getFormatStep((cormax - cormin) / (count - 1), allowDecimals, 0), values = [].concat(_toConsumableArray(_arithmetic2.default.rangeStep(cormin, cormax - .99 * step, step)), [ cormax ]);
+ return min > max ? (0, _utils.reverse)(values) : values;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.getTickValuesFixedDomain = exports.getTickValues = exports.getNiceTickValues = void 0;
+ var _slicedToArray = function() {
+ function sliceIterator(arr, i) {
+ var _arr = [], _n = !0, _d = !1, _e = void 0;
+ try {
+ for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value),
+ !i || _arr.length !== i); _n = !0) ;
+ } catch (err) {
+ _d = !0, _e = err;
+ } finally {
+ try {
+ !_n && _i.return && _i.return();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+ return _arr;
+ }
+ return function(arr, i) {
+ if (Array.isArray(arr)) return arr;
+ if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ };
+ }(), _utils = __webpack_require__(286), _arithmetic = __webpack_require__(705), _arithmetic2 = function(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }(_arithmetic);
+ exports.getNiceTickValues = (0, _utils.memoize)(getNiceTickValuesFn), exports.getTickValues = (0,
+ _utils.memoize)(getTickValuesFn), exports.getTickValuesFixedDomain = (0, _utils.memoize)(getTickValuesFixedDomainFn);
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function strip(num) {
+ var precision = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 12;
+ return +parseFloat(num.toPrecision(precision));
+ }
+ function isFloat(num) {
+ return /^([+-]?)\d*\.\d+$/.test(num);
+ }
+ function getDigitCount(value) {
+ var abs = Math.abs(value);
+ return 0 === value ? 1 : Math.floor(Math.log(abs) / Math.log(10)) + 1;
+ }
+ function getDecimalDigitCount(a) {
+ var str = a ? "" + a : "";
+ if (str.indexOf("e") >= 0) return Math.abs(parseInt(str.slice(str.indexOf("e") + 1), 10));
+ var ary = str.split(".");
+ return ary.length > 1 ? ary[1].length : 0;
+ }
+ function multiply(a, b) {
+ var intA = parseInt(("" + a).replace(".", ""), 10), intB = parseInt(("" + b).replace(".", ""), 10), count = getDecimalDigitCount(a) + getDecimalDigitCount(b);
+ return intA * intB / Math.pow(10, count);
+ }
+ function sum(a, b) {
+ var count = Math.max(getDecimalDigitCount(a), getDecimalDigitCount(b));
+ return count = Math.pow(10, count), (multiply(a, count) + multiply(b, count)) / count;
+ }
+ function minus(a, b) {
+ return sum(a, -b);
+ }
+ function divide(a, b) {
+ var ca = getDecimalDigitCount(a), cb = getDecimalDigitCount(b);
+ return parseInt(("" + a).replace(".", ""), 10) / parseInt(("" + b).replace(".", ""), 10) * Math.pow(10, cb - ca);
+ }
+ function modulo(a, b) {
+ var mod = Math.abs(b);
+ return b <= 0 ? a : minus(a, multiply(mod, Math.floor(a / mod)));
+ }
+ function rangeStep(start, end, step) {
+ for (var num = start, result = []; num < end; ) result.push(num), num = sum(num, step);
+ return result;
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _utils = __webpack_require__(286), interpolateNumber = (0, _utils.curry)(function(a, b, t) {
+ var newA = +a;
+ return newA + t * (+b - newA);
+ }), uninterpolateNumber = (0, _utils.curry)(function(a, b, x) {
+ var diff = b - +a;
+ return diff = diff || 1 / 0, (x - a) / diff;
+ }), uninterpolateTruncation = (0, _utils.curry)(function(a, b, x) {
+ var diff = b - +a;
+ return diff = diff || 1 / 0, Math.max(0, Math.min(1, (x - a) / diff));
+ });
+ exports.default = {
+ rangeStep: rangeStep,
+ isFloat: isFloat,
+ getDigitCount: getDigitCount,
+ getDecimalDigitCount: getDecimalDigitCount,
+ sum: sum,
+ minus: minus,
+ multiply: multiply,
+ divide: divide,
+ modulo: modulo,
+ strip: strip,
+ interpolateNumber: interpolateNumber,
+ uninterpolateNumber: uninterpolateNumber,
+ uninterpolateTruncation: uninterpolateTruncation
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function band() {
+ function rescale() {
+ var n = domain().length, reverse = range[1] < range[0], start = range[reverse - 0], stop = range[1 - reverse];
+ step = (stop - start) / Math.max(1, n - paddingInner + 2 * paddingOuter), round && (step = Math.floor(step)),
+ start += (stop - start - step * (n - paddingInner)) * align, bandwidth = step * (1 - paddingInner),
+ round && (start = Math.round(start), bandwidth = Math.round(bandwidth));
+ var values = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.e)(n).map(function(i) {
+ return start + step * i;
+ });
+ return ordinalRange(reverse ? values.reverse() : values);
+ }
+ var step, bandwidth, scale = Object(__WEBPACK_IMPORTED_MODULE_1__ordinal__.a)().unknown(void 0), domain = scale.domain, ordinalRange = scale.range, range = [ 0, 1 ], round = !1, paddingInner = 0, paddingOuter = 0, align = .5;
+ return delete scale.unknown, scale.domain = function(_) {
+ return arguments.length ? (domain(_), rescale()) : domain();
+ }, scale.range = function(_) {
+ return arguments.length ? (range = [ +_[0], +_[1] ], rescale()) : range.slice();
+ }, scale.rangeRound = function(_) {
+ return range = [ +_[0], +_[1] ], round = !0, rescale();
+ }, scale.bandwidth = function() {
+ return bandwidth;
+ }, scale.step = function() {
+ return step;
+ }, scale.round = function(_) {
+ return arguments.length ? (round = !!_, rescale()) : round;
+ }, scale.padding = function(_) {
+ return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)),
+ rescale()) : paddingInner;
+ }, scale.paddingInner = function(_) {
+ return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
+ }, scale.paddingOuter = function(_) {
+ return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
+ }, scale.align = function(_) {
+ return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
+ }, scale.copy = function() {
+ return band().domain(domain()).range(range).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);
+ }, rescale();
+ }
+ function pointish(scale) {
+ var copy = scale.copy;
+ return scale.padding = scale.paddingOuter, delete scale.paddingInner, delete scale.paddingOuter,
+ scale.copy = function() {
+ return pointish(copy());
+ }, scale;
+ }
+ function point() {
+ return pointish(band().paddingInner(1));
+ }
+ __webpack_exports__.a = band, __webpack_exports__.b = point;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__ordinal__ = __webpack_require__(300);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(290);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(294), __webpack_require__(288), __webpack_require__(710), __webpack_require__(293),
+ __webpack_require__(711), __webpack_require__(295), __webpack_require__(296), __webpack_require__(297);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return function() {
+ return x;
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return x;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(294), __webpack_require__(64), __webpack_require__(86), __webpack_require__(185);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(291);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(86);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(64), __webpack_require__(86), __webpack_require__(185);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(64);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(299);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_2__src_map__ = (__webpack_require__(724), __webpack_require__(725),
+ __webpack_require__(186));
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return __WEBPACK_IMPORTED_MODULE_2__src_map__.a;
+ });
+ __webpack_require__(726), __webpack_require__(727), __webpack_require__(728);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(186);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function Set() {}
+ function set(object, f) {
+ var set = new Set();
+ if (object instanceof Set) object.each(function(value) {
+ set.add(value);
+ }); else if (object) {
+ var i = -1, n = object.length;
+ if (null == f) for (;++i < n; ) set.add(object[i]); else for (;++i < n; ) set.add(f(object[i], i, object));
+ }
+ return set;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__map__ = __webpack_require__(186), proto = __WEBPACK_IMPORTED_MODULE_0__map__.a.prototype;
+ Set.prototype = set.prototype = {
+ constructor: Set,
+ has: proto.has,
+ add: function(value) {
+ return value += "", this[__WEBPACK_IMPORTED_MODULE_0__map__.b + value] = value,
+ this;
+ },
+ remove: proto.remove,
+ clear: proto.clear,
+ values: proto.keys,
+ size: proto.size,
+ empty: proto.empty,
+ each: proto.each
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function identity() {
+ function scale(x) {
+ return +x;
+ }
+ var domain = [ 0, 1 ];
+ return scale.invert = scale, scale.domain = scale.range = function(_) {
+ return arguments.length ? (domain = __WEBPACK_IMPORTED_MODULE_0__array__.a.call(_, __WEBPACK_IMPORTED_MODULE_2__number__.a),
+ scale) : domain.slice();
+ }, scale.copy = function() {
+ return identity().domain(domain);
+ }, Object(__WEBPACK_IMPORTED_MODULE_1__linear__.b)(scale);
+ }
+ __webpack_exports__.a = identity;
+ var __WEBPACK_IMPORTED_MODULE_0__array__ = __webpack_require__(56), __WEBPACK_IMPORTED_MODULE_1__linear__ = __webpack_require__(87), __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__(309);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function labConvert(o) {
+ if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
+ if (o instanceof Hcl) {
+ var h = o.h * __WEBPACK_IMPORTED_MODULE_2__math__.a;
+ return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
+ }
+ o instanceof __WEBPACK_IMPORTED_MODULE_1__color__.b || (o = Object(__WEBPACK_IMPORTED_MODULE_1__color__.h)(o));
+ var b = rgb2xyz(o.r), a = rgb2xyz(o.g), l = rgb2xyz(o.b), x = xyz2lab((.4124564 * b + .3575761 * a + .1804375 * l) / Xn), y = xyz2lab((.2126729 * b + .7151522 * a + .072175 * l) / Yn);
+ return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - xyz2lab((.0193339 * b + .119192 * a + .9503041 * l) / Zn)), o.opacity);
+ }
+ function lab(l, a, b, opacity) {
+ return 1 === arguments.length ? labConvert(l) : new Lab(l, a, b, null == opacity ? 1 : opacity);
+ }
+ function Lab(l, a, b, opacity) {
+ this.l = +l, this.a = +a, this.b = +b, this.opacity = +opacity;
+ }
+ function xyz2lab(t) {
+ return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
+ }
+ function lab2xyz(t) {
+ return t > t1 ? t * t * t : t2 * (t - t0);
+ }
+ function xyz2rgb(x) {
+ return 255 * (x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055);
+ }
+ function rgb2xyz(x) {
+ return (x /= 255) <= .04045 ? x / 12.92 : Math.pow((x + .055) / 1.055, 2.4);
+ }
+ function hclConvert(o) {
+ if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
+ o instanceof Lab || (o = labConvert(o));
+ var h = Math.atan2(o.b, o.a) * __WEBPACK_IMPORTED_MODULE_2__math__.b;
+ return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
+ }
+ function hcl(h, c, l, opacity) {
+ return 1 === arguments.length ? hclConvert(h) : new Hcl(h, c, l, null == opacity ? 1 : opacity);
+ }
+ function Hcl(h, c, l, opacity) {
+ this.h = +h, this.c = +c, this.l = +l, this.opacity = +opacity;
+ }
+ __webpack_exports__.a = lab, __webpack_exports__.b = hcl;
+ var __WEBPACK_IMPORTED_MODULE_0__define__ = __webpack_require__(189), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(188), __WEBPACK_IMPORTED_MODULE_2__math__ = __webpack_require__(301), Xn = .95047, Yn = 1, Zn = 1.08883, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;
+ Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Lab, lab, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(__WEBPACK_IMPORTED_MODULE_1__color__.a, {
+ brighter: function(k) {
+ return new Lab(this.l + 18 * (null == k ? 1 : k), this.a, this.b, this.opacity);
+ },
+ darker: function(k) {
+ return new Lab(this.l - 18 * (null == k ? 1 : k), this.a, this.b, this.opacity);
+ },
+ rgb: function() {
+ var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200;
+ return y = Yn * lab2xyz(y), x = Xn * lab2xyz(x), z = Zn * lab2xyz(z), new __WEBPACK_IMPORTED_MODULE_1__color__.b(xyz2rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), xyz2rgb(-.969266 * x + 1.8760108 * y + .041556 * z), xyz2rgb(.0556434 * x - .2040259 * y + 1.0572252 * z), this.opacity);
+ }
+ })), Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Hcl, hcl, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(__WEBPACK_IMPORTED_MODULE_1__color__.a, {
+ brighter: function(k) {
+ return new Hcl(this.h, this.c, this.l + 18 * (null == k ? 1 : k), this.opacity);
+ },
+ darker: function(k) {
+ return new Hcl(this.h, this.c, this.l - 18 * (null == k ? 1 : k), this.opacity);
+ },
+ rgb: function() {
+ return labConvert(this).rgb();
+ }
+ }));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function cubehelixConvert(o) {
+ if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
+ o instanceof __WEBPACK_IMPORTED_MODULE_1__color__.b || (o = Object(__WEBPACK_IMPORTED_MODULE_1__color__.h)(o));
+ var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * __WEBPACK_IMPORTED_MODULE_2__math__.b - 120 : NaN;
+ return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
+ }
+ function cubehelix(h, s, l, opacity) {
+ return 1 === arguments.length ? cubehelixConvert(h) : new Cubehelix(h, s, l, null == opacity ? 1 : opacity);
+ }
+ function Cubehelix(h, s, l, opacity) {
+ this.h = +h, this.s = +s, this.l = +l, this.opacity = +opacity;
+ }
+ __webpack_exports__.a = cubehelix;
+ var __WEBPACK_IMPORTED_MODULE_0__define__ = __webpack_require__(189), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(188), __WEBPACK_IMPORTED_MODULE_2__math__ = __webpack_require__(301), A = -.14861, B = 1.78277, C = -.29227, D = -.90649, E = 1.97294, ED = E * D, EB = E * B, BC_DA = B * C - D * A;
+ Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Cubehelix, cubehelix, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(__WEBPACK_IMPORTED_MODULE_1__color__.a, {
+ brighter: function(k) {
+ return k = null == k ? __WEBPACK_IMPORTED_MODULE_1__color__.c : Math.pow(__WEBPACK_IMPORTED_MODULE_1__color__.c, k),
+ new Cubehelix(this.h, this.s, this.l * k, this.opacity);
+ },
+ darker: function(k) {
+ return k = null == k ? __WEBPACK_IMPORTED_MODULE_1__color__.d : Math.pow(__WEBPACK_IMPORTED_MODULE_1__color__.d, k),
+ new Cubehelix(this.h, this.s, this.l * k, this.opacity);
+ },
+ rgb: function() {
+ var h = isNaN(this.h) ? 0 : (this.h + 120) * __WEBPACK_IMPORTED_MODULE_2__math__.a, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h);
+ return new __WEBPACK_IMPORTED_MODULE_1__color__.b(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);
+ }
+ }));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(a, b) {
+ return a = +a, b -= a, function(t) {
+ return Math.round(a + b * t);
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function interpolateTransform(parse, pxComma, pxParen, degParen) {
+ function pop(s) {
+ return s.length ? s.pop() + " " : "";
+ }
+ function translate(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i = s.push("translate(", null, pxComma, null, pxParen);
+ q.push({
+ i: i - 4,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(xa, xb)
+ }, {
+ i: i - 2,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(ya, yb)
+ });
+ } else (xb || yb) && s.push("translate(" + xb + pxComma + yb + pxParen);
+ }
+ function rotate(a, b, s, q) {
+ a !== b ? (a - b > 180 ? b += 360 : b - a > 180 && (a += 360), q.push({
+ i: s.push(pop(s) + "rotate(", null, degParen) - 2,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(a, b)
+ })) : b && s.push(pop(s) + "rotate(" + b + degParen);
+ }
+ function skewX(a, b, s, q) {
+ a !== b ? q.push({
+ i: s.push(pop(s) + "skewX(", null, degParen) - 2,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(a, b)
+ }) : b && s.push(pop(s) + "skewX(" + b + degParen);
+ }
+ function scale(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i = s.push(pop(s) + "scale(", null, ",", null, ")");
+ q.push({
+ i: i - 4,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(xa, xb)
+ }, {
+ i: i - 2,
+ x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(ya, yb)
+ });
+ } else 1 === xb && 1 === yb || s.push(pop(s) + "scale(" + xb + "," + yb + ")");
+ }
+ return function(a, b) {
+ var s = [], q = [];
+ return a = parse(a), b = parse(b), translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q),
+ rotate(a.rotate, b.rotate, s, q), skewX(a.skewX, b.skewX, s, q), scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q),
+ a = b = null, function(t) {
+ for (var o, i = -1, n = q.length; ++i < n; ) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ };
+ };
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_1__parse__ = __webpack_require__(734);
+ interpolateTransform(__WEBPACK_IMPORTED_MODULE_1__parse__.a, "px, ", "px)", "deg)"),
+ interpolateTransform(__WEBPACK_IMPORTED_MODULE_1__parse__.b, ", ", ")", ")");
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function parseCss(value) {
+ return "none" === value ? __WEBPACK_IMPORTED_MODULE_0__decompose__.b : (cssNode || (cssNode = document.createElement("DIV"),
+ cssRoot = document.documentElement, cssView = document.defaultView), cssNode.style.transform = value,
+ value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"),
+ cssRoot.removeChild(cssNode), value = value.slice(7, -1).split(","), Object(__WEBPACK_IMPORTED_MODULE_0__decompose__.a)(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]));
+ }
+ function parseSvg(value) {
+ return null == value ? __WEBPACK_IMPORTED_MODULE_0__decompose__.b : (svgNode || (svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g")),
+ svgNode.setAttribute("transform", value), (value = svgNode.transform.baseVal.consolidate()) ? (value = value.matrix,
+ Object(__WEBPACK_IMPORTED_MODULE_0__decompose__.a)(value.a, value.b, value.c, value.d, value.e, value.f)) : __WEBPACK_IMPORTED_MODULE_0__decompose__.b);
+ }
+ __webpack_exports__.a = parseCss, __webpack_exports__.b = parseSvg;
+ var cssNode, cssRoot, cssView, svgNode, __WEBPACK_IMPORTED_MODULE_0__decompose__ = __webpack_require__(735);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return identity;
+ });
+ var degrees = 180 / Math.PI, identity = {
+ translateX: 0,
+ translateY: 0,
+ rotate: 0,
+ skewX: 0,
+ scaleX: 1,
+ scaleY: 1
+ };
+ __webpack_exports__.a = function(a, b, c, d, e, f) {
+ var scaleX, scaleY, skewX;
+ return (scaleX = Math.sqrt(a * a + b * b)) && (a /= scaleX, b /= scaleX), (skewX = a * c + b * d) && (c -= a * skewX,
+ d -= b * skewX), (scaleY = Math.sqrt(c * c + d * d)) && (c /= scaleY, d /= scaleY,
+ skewX /= scaleY), a * d < b * c && (a = -a, b = -b, skewX = -skewX, scaleX = -scaleX),
+ {
+ translateX: e,
+ translateY: f,
+ rotate: Math.atan2(b, a) * degrees,
+ skewX: Math.atan(skewX) * degrees,
+ scaleX: scaleX,
+ scaleY: scaleY
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ Math.SQRT2;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function hsl(hue) {
+ return function(start, end) {
+ var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.d)(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.d)(end)).h), s = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.s, end.s), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.opacity, end.opacity);
+ return function(t) {
+ return start.h = h(t), start.s = s(t), start.l = l(t), start.opacity = opacity(t),
+ start + "";
+ };
+ };
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(89);
+ hsl(__WEBPACK_IMPORTED_MODULE_1__color__.c), hsl(__WEBPACK_IMPORTED_MODULE_1__color__.a);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__(44), __webpack_require__(89);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function hcl(hue) {
+ return function(start, end) {
+ var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.c)(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.c)(end)).h), c = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.c, end.c), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.opacity, end.opacity);
+ return function(t) {
+ return start.h = h(t), start.c = c(t), start.l = l(t), start.opacity = opacity(t),
+ start + "";
+ };
+ };
+ }
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(89);
+ hcl(__WEBPACK_IMPORTED_MODULE_1__color__.c), hcl(__WEBPACK_IMPORTED_MODULE_1__color__.a);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function cubehelix(hue) {
+ return function cubehelixGamma(y) {
+ function cubehelix(start, end) {
+ var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(end)).h), s = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.s, end.s), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.opacity, end.opacity);
+ return function(t) {
+ return start.h = h(t), start.s = s(t), start.l = l(Math.pow(t, y)), start.opacity = opacity(t),
+ start + "";
+ };
+ }
+ return y = +y, cubehelix.gamma = cubehelixGamma, cubehelix;
+ }(1);
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return cubehelixLong;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(89), cubehelixLong = (cubehelix(__WEBPACK_IMPORTED_MODULE_1__color__.c),
+ cubehelix(__WEBPACK_IMPORTED_MODULE_1__color__.a));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_format__ = __webpack_require__(310);
+ __webpack_exports__.a = function(domain, count, specifier) {
+ var precision, start = domain[0], stop = domain[domain.length - 1], step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.g)(start, stop, null == count ? 10 : count);
+ switch (specifier = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.c)(null == specifier ? ",f" : specifier),
+ specifier.type) {
+ case "s":
+ var value = Math.max(Math.abs(start), Math.abs(stop));
+ return null != specifier.precision || isNaN(precision = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.e)(step, value)) || (specifier.precision = precision),
+ Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.b)(specifier, value);
+
+ case "":
+ case "e":
+ case "g":
+ case "p":
+ case "r":
+ null != specifier.precision || isNaN(precision = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.f)(step, Math.max(Math.abs(start), Math.abs(stop)))) || (specifier.precision = precision - ("e" === specifier.type));
+ break;
+
+ case "f":
+ case "%":
+ null != specifier.precision || isNaN(precision = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.d)(step)) || (specifier.precision = precision - 2 * ("%" === specifier.type));
+ }
+ return Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.a)(specifier);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return format;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return formatPrefix;
+ });
+ var locale, format, formatPrefix, __WEBPACK_IMPORTED_MODULE_0__locale__ = __webpack_require__(311);
+ !function(definition) {
+ locale = Object(__WEBPACK_IMPORTED_MODULE_0__locale__.a)(definition), format = locale.format,
+ formatPrefix = locale.formatPrefix;
+ }({
+ decimal: ".",
+ thousands: ",",
+ grouping: [ 3 ],
+ currency: [ "$", "" ]
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(grouping, thousands) {
+ return function(value, width) {
+ for (var i = value.length, t = [], j = 0, g = grouping[0], length = 0; i > 0 && g > 0 && (length + g + 1 > width && (g = Math.max(1, width - length)),
+ t.push(value.substring(i -= g, i + g)), !((length += g + 1) > width)); ) g = grouping[j = (j + 1) % grouping.length];
+ return t.reverse().join(thousands);
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(numerals) {
+ return function(value) {
+ return value.replace(/[0-9]/g, function(i) {
+ return numerals[+i];
+ });
+ };
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x, p) {
+ x = x.toPrecision(p);
+ out: for (var i1, n = x.length, i = 1, i0 = -1; i < n; ++i) switch (x[i]) {
+ case ".":
+ i0 = i1 = i;
+ break;
+
+ case "0":
+ 0 === i0 && (i0 = i), i1 = i;
+ break;
+
+ case "e":
+ break out;
+
+ default:
+ i0 > 0 && (i0 = 0);
+ }
+ return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__formatDecimal__ = __webpack_require__(192);
+ __webpack_exports__.a = function(x, p) {
+ var d = Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(x, p);
+ if (!d) return x + "";
+ var coefficient = d[0], exponent = d[1];
+ return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_exports__.a = function(x) {
+ return x;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(127);
+ __webpack_exports__.a = function(step) {
+ return Math.max(0, -Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(Math.abs(step)));
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(127);
+ __webpack_exports__.a = function(step, value) {
+ return Math.max(0, 3 * Math.max(-8, Math.min(8, Math.floor(Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(value) / 3))) - Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(Math.abs(step)));
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(127);
+ __webpack_exports__.a = function(step, max) {
+ return step = Math.abs(step), max = Math.abs(max) - step, Math.max(0, Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(max) - Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(step)) + 1;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function deinterpolate(a, b) {
+ return (b = Math.log(b / a)) ? function(x) {
+ return Math.log(x / a) / b;
+ } : Object(__WEBPACK_IMPORTED_MODULE_2__constant__.a)(b);
+ }
+ function reinterpolate(a, b) {
+ return a < 0 ? function(t) {
+ return -Math.pow(-b, t) * Math.pow(-a, 1 - t);
+ } : function(t) {
+ return Math.pow(b, t) * Math.pow(a, 1 - t);
+ };
+ }
+ function pow10(x) {
+ return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
+ }
+ function powp(base) {
+ return 10 === base ? pow10 : base === Math.E ? Math.exp : function(x) {
+ return Math.pow(base, x);
+ };
+ }
+ function logp(base) {
+ return base === Math.E ? Math.log : 10 === base && Math.log10 || 2 === base && Math.log2 || (base = Math.log(base),
+ function(x) {
+ return Math.log(x) / base;
+ });
+ }
+ function reflect(f) {
+ return function(x) {
+ return -f(-x);
+ };
+ }
+ function log() {
+ function rescale() {
+ return logs = logp(base), pows = powp(base), domain()[0] < 0 && (logs = reflect(logs),
+ pows = reflect(pows)), scale;
+ }
+ var scale = Object(__WEBPACK_IMPORTED_MODULE_4__continuous__.b)(deinterpolate, reinterpolate).domain([ 1, 10 ]), domain = scale.domain, base = 10, logs = logp(10), pows = powp(10);
+ return scale.base = function(_) {
+ return arguments.length ? (base = +_, rescale()) : base;
+ }, scale.domain = function(_) {
+ return arguments.length ? (domain(_), rescale()) : domain();
+ }, scale.ticks = function(count) {
+ var r, d = domain(), u = d[0], v = d[d.length - 1];
+ (r = v < u) && (i = u, u = v, v = i);
+ var p, k, t, i = logs(u), j = logs(v), n = null == count ? 10 : +count, z = [];
+ if (!(base % 1) && j - i < n) {
+ if (i = Math.round(i) - 1, j = Math.round(j) + 1, u > 0) {
+ for (;i < j; ++i) for (k = 1, p = pows(i); k < base; ++k) if (!((t = p * k) < u)) {
+ if (t > v) break;
+ z.push(t);
+ }
+ } else for (;i < j; ++i) for (k = base - 1, p = pows(i); k >= 1; --k) if (!((t = p * k) < u)) {
+ if (t > v) break;
+ z.push(t);
+ }
+ } else z = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(i, j, Math.min(j - i, n)).map(pows);
+ return r ? z.reverse() : z;
+ }, scale.tickFormat = function(count, specifier) {
+ if (null == specifier && (specifier = 10 === base ? ".0e" : ","), "function" != typeof specifier && (specifier = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.a)(specifier)),
+ count === 1 / 0) return specifier;
+ null == count && (count = 10);
+ var k = Math.max(1, base * count / scale.ticks().length);
+ return function(d) {
+ var i = d / pows(Math.round(logs(d)));
+ return i * base < base - .5 && (i *= base), i <= k ? specifier(d) : "";
+ };
+ }, scale.nice = function() {
+ return domain(Object(__WEBPACK_IMPORTED_MODULE_3__nice__.a)(domain(), {
+ floor: function(x) {
+ return pows(Math.floor(logs(x)));
+ },
+ ceil: function(x) {
+ return pows(Math.ceil(logs(x)));
+ }
+ }));
+ }, scale.copy = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_4__continuous__.a)(scale, log().base(base));
+ }, scale;
+ }
+ __webpack_exports__.a = log;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_format__ = __webpack_require__(310), __WEBPACK_IMPORTED_MODULE_2__constant__ = __webpack_require__(191), __WEBPACK_IMPORTED_MODULE_3__nice__ = __webpack_require__(315), __WEBPACK_IMPORTED_MODULE_4__continuous__ = __webpack_require__(126);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function raise(x, exponent) {
+ return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
+ }
+ function pow() {
+ function deinterpolate(a, b) {
+ return (b = raise(b, exponent) - (a = raise(a, exponent))) ? function(x) {
+ return (raise(x, exponent) - a) / b;
+ } : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(b);
+ }
+ function reinterpolate(a, b) {
+ return b = raise(b, exponent) - (a = raise(a, exponent)), function(t) {
+ return raise(a + b * t, 1 / exponent);
+ };
+ }
+ var exponent = 1, scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(deinterpolate, reinterpolate), domain = scale.domain;
+ return scale.exponent = function(_) {
+ return arguments.length ? (exponent = +_, domain(domain())) : exponent;
+ }, scale.copy = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, pow().exponent(exponent));
+ }, Object(__WEBPACK_IMPORTED_MODULE_1__linear__.b)(scale);
+ }
+ function sqrt() {
+ return pow().exponent(.5);
+ }
+ __webpack_exports__.a = pow, __webpack_exports__.b = sqrt;
+ var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(191), __WEBPACK_IMPORTED_MODULE_1__linear__ = __webpack_require__(87), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(126);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function quantile() {
+ function rescale() {
+ var i = 0, n = Math.max(1, range.length);
+ for (thresholds = new Array(n - 1); ++i < n; ) thresholds[i - 1] = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.d)(domain, i / n);
+ return scale;
+ }
+ function scale(x) {
+ if (!isNaN(x = +x)) return range[Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(thresholds, x)];
+ }
+ var domain = [], range = [], thresholds = [];
+ return scale.invertExtent = function(y) {
+ var i = range.indexOf(y);
+ return i < 0 ? [ NaN, NaN ] : [ i > 0 ? thresholds[i - 1] : domain[0], i < thresholds.length ? thresholds[i] : domain[domain.length - 1] ];
+ }, scale.domain = function(_) {
+ if (!arguments.length) return domain.slice();
+ domain = [];
+ for (var d, i = 0, n = _.length; i < n; ++i) null == (d = _[i]) || isNaN(d = +d) || domain.push(d);
+ return domain.sort(__WEBPACK_IMPORTED_MODULE_0_d3_array__.a), rescale();
+ }, scale.range = function(_) {
+ return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_),
+ rescale()) : range.slice();
+ }, scale.quantiles = function() {
+ return thresholds.slice();
+ }, scale.copy = function() {
+ return quantile().domain(domain).range(range);
+ }, scale;
+ }
+ __webpack_exports__.a = quantile;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(56);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function quantize() {
+ function scale(x) {
+ if (x <= x) return range[Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(domain, x, 0, n)];
+ }
+ function rescale() {
+ var i = -1;
+ for (domain = new Array(n); ++i < n; ) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
+ return scale;
+ }
+ var x0 = 0, x1 = 1, n = 1, domain = [ .5 ], range = [ 0, 1 ];
+ return scale.domain = function(_) {
+ return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [ x0, x1 ];
+ }, scale.range = function(_) {
+ return arguments.length ? (n = (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_)).length - 1,
+ rescale()) : range.slice();
+ }, scale.invertExtent = function(y) {
+ var i = range.indexOf(y);
+ return i < 0 ? [ NaN, NaN ] : i < 1 ? [ x0, domain[0] ] : i >= n ? [ domain[n - 1], x1 ] : [ domain[i - 1], domain[i] ];
+ }, scale.copy = function() {
+ return quantize().domain([ x0, x1 ]).range(range);
+ }, Object(__WEBPACK_IMPORTED_MODULE_2__linear__.b)(scale);
+ }
+ __webpack_exports__.a = quantize;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(56), __WEBPACK_IMPORTED_MODULE_2__linear__ = __webpack_require__(87);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function threshold() {
+ function scale(x) {
+ if (x <= x) return range[Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(domain, x, 0, n)];
+ }
+ var domain = [ .5 ], range = [ 0, 1 ], n = 1;
+ return scale.domain = function(_) {
+ return arguments.length ? (domain = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_),
+ n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
+ }, scale.range = function(_) {
+ return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_),
+ n = Math.min(domain.length, range.length - 1), scale) : range.slice();
+ }, scale.invertExtent = function(y) {
+ var i = range.indexOf(y);
+ return [ domain[i - 1], domain[i] ];
+ }, scale.copy = function() {
+ return threshold().domain(domain).range(range);
+ }, scale;
+ }
+ __webpack_exports__.a = threshold;
+ var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(56);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), millisecond = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function() {}, function(date, step) {
+ date.setTime(+date + step);
+ }, function(start, end) {
+ return end - start;
+ });
+ millisecond.every = function(k) {
+ return k = Math.floor(k), isFinite(k) && k > 0 ? k > 1 ? Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setTime(Math.floor(date / k) * k);
+ }, function(date, step) {
+ date.setTime(+date + step * k);
+ }, function(start, end) {
+ return (end - start) / k;
+ }) : millisecond : null;
+ }, __webpack_exports__.a = millisecond;
+ millisecond.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), second = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setTime(Math.floor(date / __WEBPACK_IMPORTED_MODULE_1__duration__.d) * __WEBPACK_IMPORTED_MODULE_1__duration__.d);
+ }, function(date, step) {
+ date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.d);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.d;
+ }, function(date) {
+ return date.getUTCSeconds();
+ });
+ __webpack_exports__.a = second;
+ second.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), minute = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setTime(Math.floor(date / __WEBPACK_IMPORTED_MODULE_1__duration__.c) * __WEBPACK_IMPORTED_MODULE_1__duration__.c);
+ }, function(date, step) {
+ date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.c);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.c;
+ }, function(date) {
+ return date.getMinutes();
+ });
+ __webpack_exports__.a = minute;
+ minute.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), hour = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ var offset = date.getTimezoneOffset() * __WEBPACK_IMPORTED_MODULE_1__duration__.c % __WEBPACK_IMPORTED_MODULE_1__duration__.b;
+ offset < 0 && (offset += __WEBPACK_IMPORTED_MODULE_1__duration__.b), date.setTime(Math.floor((+date - offset) / __WEBPACK_IMPORTED_MODULE_1__duration__.b) * __WEBPACK_IMPORTED_MODULE_1__duration__.b + offset);
+ }, function(date, step) {
+ date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.b);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.b;
+ }, function(date) {
+ return date.getHours();
+ });
+ __webpack_exports__.a = hour;
+ hour.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), day = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setDate(date.getDate() + step);
+ }, function(start, end) {
+ return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * __WEBPACK_IMPORTED_MODULE_1__duration__.c) / __WEBPACK_IMPORTED_MODULE_1__duration__.a;
+ }, function(date) {
+ return date.getDate() - 1;
+ });
+ __webpack_exports__.a = day;
+ day.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function weekday(i) {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7), date.setHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setDate(date.getDate() + 7 * step);
+ }, function(start, end) {
+ return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * __WEBPACK_IMPORTED_MODULE_1__duration__.c) / __WEBPACK_IMPORTED_MODULE_1__duration__.e;
+ });
+ }
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return sunday;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return monday;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return thursday;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), sunday = weekday(0), monday = weekday(1), tuesday = weekday(2), wednesday = weekday(3), thursday = weekday(4), friday = weekday(5), saturday = weekday(6);
+ sunday.range, monday.range, tuesday.range, wednesday.range, thursday.range, friday.range,
+ saturday.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), month = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setDate(1), date.setHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setMonth(date.getMonth() + step);
+ }, function(start, end) {
+ return end.getMonth() - start.getMonth() + 12 * (end.getFullYear() - start.getFullYear());
+ }, function(date) {
+ return date.getMonth();
+ });
+ __webpack_exports__.a = month;
+ month.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), year = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setMonth(0, 1), date.setHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setFullYear(date.getFullYear() + step);
+ }, function(start, end) {
+ return end.getFullYear() - start.getFullYear();
+ }, function(date) {
+ return date.getFullYear();
+ });
+ year.every = function(k) {
+ return isFinite(k = Math.floor(k)) && k > 0 ? Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setFullYear(Math.floor(date.getFullYear() / k) * k), date.setMonth(0, 1), date.setHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setFullYear(date.getFullYear() + step * k);
+ }) : null;
+ }, __webpack_exports__.a = year;
+ year.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcMinute = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCSeconds(0, 0);
+ }, function(date, step) {
+ date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.c);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.c;
+ }, function(date) {
+ return date.getUTCMinutes();
+ });
+ __webpack_exports__.a = utcMinute;
+ utcMinute.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcHour = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCMinutes(0, 0, 0);
+ }, function(date, step) {
+ date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.b);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.b;
+ }, function(date) {
+ return date.getUTCHours();
+ });
+ __webpack_exports__.a = utcHour;
+ utcHour.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcDay = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setUTCDate(date.getUTCDate() + step);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.a;
+ }, function(date) {
+ return date.getUTCDate() - 1;
+ });
+ __webpack_exports__.a = utcDay;
+ utcDay.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function utcWeekday(i) {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7), date.setUTCHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setUTCDate(date.getUTCDate() + 7 * step);
+ }, function(start, end) {
+ return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.e;
+ });
+ }
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return utcSunday;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return utcMonday;
+ }), __webpack_require__.d(__webpack_exports__, "c", function() {
+ return utcThursday;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcSunday = utcWeekday(0), utcMonday = utcWeekday(1), utcTuesday = utcWeekday(2), utcWednesday = utcWeekday(3), utcThursday = utcWeekday(4), utcFriday = utcWeekday(5), utcSaturday = utcWeekday(6);
+ utcSunday.range, utcMonday.range, utcTuesday.range, utcWednesday.range, utcThursday.range,
+ utcFriday.range, utcSaturday.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), utcMonth = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCDate(1), date.setUTCHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setUTCMonth(date.getUTCMonth() + step);
+ }, function(start, end) {
+ return end.getUTCMonth() - start.getUTCMonth() + 12 * (end.getUTCFullYear() - start.getUTCFullYear());
+ }, function(date) {
+ return date.getUTCMonth();
+ });
+ __webpack_exports__.a = utcMonth;
+ utcMonth.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), utcYear = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCMonth(0, 1), date.setUTCHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setUTCFullYear(date.getUTCFullYear() + step);
+ }, function(start, end) {
+ return end.getUTCFullYear() - start.getUTCFullYear();
+ }, function(date) {
+ return date.getUTCFullYear();
+ });
+ utcYear.every = function(k) {
+ return isFinite(k = Math.floor(k)) && k > 0 ? Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {
+ date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k), date.setUTCMonth(0, 1),
+ date.setUTCHours(0, 0, 0, 0);
+ }, function(date, step) {
+ date.setUTCFullYear(date.getUTCFullYear() + step * k);
+ }) : null;
+ }, __webpack_exports__.a = utcYear;
+ utcYear.range;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function parseIsoNative(string) {
+ var date = new Date(string);
+ return isNaN(date) ? null : date;
+ }
+ var __WEBPACK_IMPORTED_MODULE_0__isoFormat__ = __webpack_require__(319), __WEBPACK_IMPORTED_MODULE_1__defaultLocale__ = __webpack_require__(194);
+ +new Date("2000-01-01T00:00:00.000Z") || Object(__WEBPACK_IMPORTED_MODULE_1__defaultLocale__.c)(__WEBPACK_IMPORTED_MODULE_0__isoFormat__.a);
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__time__ = __webpack_require__(316), __WEBPACK_IMPORTED_MODULE_1_d3_time_format__ = __webpack_require__(317), __WEBPACK_IMPORTED_MODULE_2_d3_time__ = __webpack_require__(193);
+ __webpack_exports__.a = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__time__.a)(__WEBPACK_IMPORTED_MODULE_2_d3_time__.v, __WEBPACK_IMPORTED_MODULE_2_d3_time__.q, __WEBPACK_IMPORTED_MODULE_2_d3_time__.u, __WEBPACK_IMPORTED_MODULE_2_d3_time__.l, __WEBPACK_IMPORTED_MODULE_2_d3_time__.m, __WEBPACK_IMPORTED_MODULE_2_d3_time__.o, __WEBPACK_IMPORTED_MODULE_2_d3_time__.r, __WEBPACK_IMPORTED_MODULE_2_d3_time__.n, __WEBPACK_IMPORTED_MODULE_1_d3_time_format__.b).domain([ Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2) ]);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(90);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(90);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(90);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(90);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(88);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.b)(Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(300, .5, 0), Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(-240, .5, 1));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return warm;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return cool;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(88), warm = Object(__WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.b)(Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(-100, .75, .35), Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(80, 1.5, .8)), cool = Object(__WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.b)(Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(260, .75, .35), Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(80, 1.5, .8)), rainbow = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)();
+ __webpack_exports__.b = function(t) {
+ (t < 0 || t > 1) && (t -= Math.floor(t));
+ var ts = Math.abs(t - .5);
+ return rainbow.h = 360 * t - 100, rainbow.s = 1.5 - 1.5 * ts, rainbow.l = .8 - .9 * ts,
+ rainbow + "";
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function ramp(range) {
+ var n = range.length;
+ return function(t) {
+ return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
+ };
+ }
+ __webpack_require__.d(__webpack_exports__, "c", function() {
+ return magma;
+ }), __webpack_require__.d(__webpack_exports__, "b", function() {
+ return inferno;
+ }), __webpack_require__.d(__webpack_exports__, "d", function() {
+ return plasma;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(90);
+ __webpack_exports__.a = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
+ var magma = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")), inferno = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")), plasma = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function sequential(interpolator) {
+ function scale(x) {
+ var t = (x - x0) / (x1 - x0);
+ return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
+ }
+ var x0 = 0, x1 = 1, clamp = !1;
+ return scale.domain = function(_) {
+ return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [ x0, x1 ];
+ }, scale.clamp = function(_) {
+ return arguments.length ? (clamp = !!_, scale) : clamp;
+ }, scale.interpolator = function(_) {
+ return arguments.length ? (interpolator = _, scale) : interpolator;
+ }, scale.copy = function() {
+ return sequential(interpolator).domain([ x0, x1 ]).clamp(clamp);
+ }, Object(__WEBPACK_IMPORTED_MODULE_0__linear__.b)(scale);
+ }
+ __webpack_exports__.a = sequential;
+ var __WEBPACK_IMPORTED_MODULE_0__linear__ = __webpack_require__(87);
+}, function(module, exports) {
+ function last(array) {
+ var length = null == array ? 0 : array.length;
+ return length ? array[length - 1] : void 0;
+ }
+ module.exports = last;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), PolarGrid = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function PolarGrid() {
+ return _classCallCheck(this, PolarGrid), _possibleConstructorReturn(this, (PolarGrid.__proto__ || Object.getPrototypeOf(PolarGrid)).apply(this, arguments));
+ }
+ return _inherits(PolarGrid, _Component), _createClass(PolarGrid, [ {
+ key: "getPolygonPath",
+ value: function(radius) {
+ var _props = this.props, cx = _props.cx, cy = _props.cy, polarAngles = _props.polarAngles, path = "";
+ return polarAngles.forEach(function(angle, i) {
+ var point = Object(__WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__.e)(cx, cy, radius, angle);
+ path += i ? "L " + point.x + "," + point.y : "M " + point.x + "," + point.y;
+ }), path += "Z";
+ }
+ }, {
+ key: "renderPolarAngles",
+ value: function() {
+ var _props2 = this.props, cx = _props2.cx, cy = _props2.cy, innerRadius = _props2.innerRadius, outerRadius = _props2.outerRadius, polarAngles = _props2.polarAngles;
+ if (!polarAngles || !polarAngles.length) return null;
+ var props = _extends({
+ stroke: "#ccc"
+ }, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props));
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", {
+ className: "recharts-polar-grid-angle"
+ }, polarAngles.map(function(entry, i) {
+ var start = Object(__WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__.e)(cx, cy, innerRadius, entry), end = Object(__WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__.e)(cx, cy, outerRadius, entry);
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", _extends({}, props, {
+ key: "line-" + i,
+ x1: start.x,
+ y1: start.y,
+ x2: end.x,
+ y2: end.y
+ }));
+ }));
+ }
+ }, {
+ key: "renderConcentricCircle",
+ value: function(radius, index, extraProps) {
+ var _props3 = this.props, cx = _props3.cx, cy = _props3.cy, props = _extends({
+ stroke: "#ccc"
+ }, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), {
+ fill: "none"
+ }, extraProps);
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("circle", _extends({}, props, {
+ className: "recharts-polar-grid-concentric-circle",
+ key: "circle-" + index,
+ cx: cx,
+ cy: cy,
+ r: radius
+ }));
+ }
+ }, {
+ key: "renderConcentricPolygon",
+ value: function(radius, index, extraProps) {
+ var props = _extends({
+ stroke: "#ccc"
+ }, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), {
+ fill: "none"
+ }, extraProps);
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, props, {
+ className: "recharts-polar-grid-concentric-polygon",
+ key: "path-" + index,
+ d: this.getPolygonPath(radius)
+ }));
+ }
+ }, {
+ key: "renderConcentricPath",
+ value: function() {
+ var _this2 = this, _props4 = this.props, polarRadius = _props4.polarRadius, gridType = _props4.gridType;
+ return polarRadius && polarRadius.length ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", {
+ className: "recharts-polar-grid-concentric"
+ }, polarRadius.map(function(entry, i) {
+ return "circle" === gridType ? _this2.renderConcentricCircle(entry, i) : _this2.renderConcentricPolygon(entry, i);
+ })) : null;
+ }
+ }, {
+ key: "render",
+ value: function() {
+ return this.props.outerRadius <= 0 ? null : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", {
+ className: "recharts-polar-grid"
+ }, this.renderPolarAngles(), this.renderConcentricPath());
+ }
+ } ]), PolarGrid;
+ }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "PolarGrid",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {
+ cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ innerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ outerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,
+ polarAngles: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number),
+ polarRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number),
+ gridType: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "polygon", "circle" ])
+ }), _class2.defaultProps = {
+ cx: 0,
+ cy: 0,
+ innerRadius: 0,
+ outerRadius: 0,
+ gridType: "polygon"
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = PolarGrid;
+}, function(module, exports, __webpack_require__) {
+ function minBy(array, iteratee) {
+ return array && array.length ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt) : void 0;
+ }
+ var baseExtremum = __webpack_require__(124), baseIteratee = __webpack_require__(84), baseLt = __webpack_require__(285);
+ module.exports = minBy;
+}, function(module, exports, __webpack_require__) {
+ function createRange(fromRight) {
+ return function(start, end, step) {
+ return step && "number" != typeof step && isIterateeCall(start, end, step) && (end = step = void 0),
+ start = toFinite(start), void 0 === end ? (end = start, start = 0) : end = toFinite(end),
+ step = void 0 === step ? start < end ? 1 : -1 : toFinite(step), baseRange(start, end, step, fromRight);
+ };
+ }
+ var baseRange = __webpack_require__(785), isIterateeCall = __webpack_require__(282), toFinite = __webpack_require__(786);
+ module.exports = createRange;
+}, function(module, exports) {
+ function baseRange(start, end, step, fromRight) {
+ for (var index = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length); length--; ) result[fromRight ? length : ++index] = start,
+ start += step;
+ return result;
+ }
+ var nativeCeil = Math.ceil, nativeMax = Math.max;
+ module.exports = baseRange;
+}, function(module, exports, __webpack_require__) {
+ function toFinite(value) {
+ if (!value) return 0 === value ? value : 0;
+ if ((value = toNumber(value)) === INFINITY || value === -INFINITY) {
+ return (value < 0 ? -1 : 1) * MAX_INTEGER;
+ }
+ return value === value ? value : 0;
+ }
+ var toNumber = __webpack_require__(243), INFINITY = 1 / 0, MAX_INTEGER = 1.7976931348623157e308;
+ module.exports = toFinite;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _defineProperty(obj, key, value) {
+ return key in obj ? Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0
+ }) : obj[key] = value, obj;
+ }
+ __webpack_require__.d(__webpack_exports__, "a", function() {
+ return generatePrefixStyle;
+ });
+ var _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, PREFIX_LIST = [ "Webkit", "Moz", "O", "ms" ], generatePrefixStyle = function(name, value) {
+ if (!name) return null;
+ var camelName = name.replace(/(\w)/, function(v) {
+ return v.toUpperCase();
+ }), result = PREFIX_LIST.reduce(function(res, entry) {
+ return _extends({}, res, _defineProperty({}, entry + camelName, value));
+ }, {});
+ return result[name] = value, result;
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), CartesianGrid = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function CartesianGrid() {
+ return _classCallCheck(this, CartesianGrid), _possibleConstructorReturn(this, (CartesianGrid.__proto__ || Object.getPrototypeOf(CartesianGrid)).apply(this, arguments));
+ }
+ return _inherits(CartesianGrid, _Component), _createClass(CartesianGrid, [ {
+ key: "renderLineItem",
+ value: function(option, props) {
+ var lineItem = void 0;
+ if (__WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option)) lineItem = __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props); else if (__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option)) lineItem = option(props); else {
+ var x1 = props.x1, y1 = props.y1, x2 = props.x2, y2 = props.y2, key = props.key, others = _objectWithoutProperties(props, [ "x1", "y1", "x2", "y2", "key" ]);
+ lineItem = __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("line", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(others), {
+ x1: x1,
+ y1: y1,
+ x2: x2,
+ y2: y2,
+ fill: "none",
+ key: key
+ }));
+ }
+ return lineItem;
+ }
+ }, {
+ key: "renderHorizontal",
+ value: function(horizontalPoints) {
+ var _this2 = this, _props = this.props, x = _props.x, width = _props.width, horizontal = _props.horizontal;
+ if (!horizontalPoints || !horizontalPoints.length) return null;
+ var items = horizontalPoints.map(function(entry, i) {
+ var props = _extends({}, _this2.props, {
+ x1: x,
+ y1: entry,
+ x2: x + width,
+ y2: entry,
+ key: "line-" + i,
+ index: i
+ });
+ return _this2.renderLineItem(horizontal, props);
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("g", {
+ className: "recharts-cartesian-grid-horizontal"
+ }, items);
+ }
+ }, {
+ key: "renderVertical",
+ value: function(verticalPoints) {
+ var _this3 = this, _props2 = this.props, y = _props2.y, height = _props2.height, vertical = _props2.vertical;
+ if (!verticalPoints || !verticalPoints.length) return null;
+ var items = verticalPoints.map(function(entry, i) {
+ var props = _extends({}, _this3.props, {
+ x1: entry,
+ y1: y,
+ x2: entry,
+ y2: y + height,
+ key: "line-" + i,
+ index: i
+ });
+ return _this3.renderLineItem(vertical, props);
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("g", {
+ className: "recharts-cartesian-grid-vertical"
+ }, items);
+ }
+ }, {
+ key: "renderVerticalStripes",
+ value: function(verticalPoints) {
+ var verticalFill = this.props.verticalFill;
+ if (!verticalFill || !verticalFill.length) return null;
+ var _props3 = this.props, fillOpacity = _props3.fillOpacity, x = _props3.x, y = _props3.y, width = _props3.width, height = _props3.height, verticalPointsUpdated = verticalPoints.slice().sort(function(a, b) {
+ return a - b > 0;
+ });
+ x !== verticalPointsUpdated[0] && verticalPointsUpdated.unshift(0);
+ var items = verticalPointsUpdated.map(function(entry, i) {
+ var lineWidth = verticalPointsUpdated[i + 1] ? verticalPointsUpdated[i + 1] - entry : x + width - entry;
+ if (lineWidth <= 0) return null;
+ var colorIndex = i % verticalFill.length;
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("rect", {
+ key: i,
+ x: Math.round(entry + x - x),
+ y: y,
+ width: lineWidth,
+ height: height,
+ stroke: "none",
+ fill: verticalFill[colorIndex],
+ fillOpacity: fillOpacity,
+ className: "recharts-cartesian-grid-bg"
+ });
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("g", {
+ className: "recharts-cartesian-gridstripes-vertical"
+ }, items);
+ }
+ }, {
+ key: "renderHorizontalStripes",
+ value: function(horizontalPoints) {
+ var horizontalFill = this.props.horizontalFill;
+ if (!horizontalFill || !horizontalFill.length) return null;
+ var _props4 = this.props, fillOpacity = _props4.fillOpacity, x = _props4.x, y = _props4.y, width = _props4.width, height = _props4.height, horizontalPointsUpdated = horizontalPoints.slice().sort(function(a, b) {
+ return a - b > 0;
+ });
+ y !== horizontalPointsUpdated[0] && horizontalPointsUpdated.unshift(0);
+ var items = horizontalPointsUpdated.map(function(entry, i) {
+ var lineHeight = horizontalPointsUpdated[i + 1] ? horizontalPointsUpdated[i + 1] - entry : y + height - entry;
+ if (lineHeight <= 0) return null;
+ var colorIndex = i % horizontalFill.length;
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("rect", {
+ key: i,
+ y: Math.round(entry + y - y),
+ x: x,
+ height: lineHeight,
+ width: width,
+ stroke: "none",
+ fill: horizontalFill[colorIndex],
+ fillOpacity: fillOpacity,
+ className: "recharts-cartesian-grid-bg"
+ });
+ });
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("g", {
+ className: "recharts-cartesian-gridstripes-horizontal"
+ }, items);
+ }
+ }, {
+ key: "renderBackground",
+ value: function() {
+ var fill = this.props.fill;
+ if (!fill || "none" === fill) return null;
+ var _props5 = this.props, fillOpacity = _props5.fillOpacity, x = _props5.x, y = _props5.y, width = _props5.width, height = _props5.height;
+ return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("rect", {
+ x: x,
+ y: y,
+ width: width,
+ height: height,
+ stroke: "none",
+ fill: fill,
+ fillOpacity: fillOpacity,
+ className: "recharts-cartesian-grid-bg"
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ var _props6 = this.props, x = _props6.x, y = _props6.y, width = _props6.width, height = _props6.height, horizontal = _props6.horizontal, vertical = _props6.vertical, horizontalCoordinatesGenerator = _props6.horizontalCoordinatesGenerator, verticalCoordinatesGenerator = _props6.verticalCoordinatesGenerator, xAxis = _props6.xAxis, yAxis = _props6.yAxis, offset = _props6.offset, chartWidth = _props6.chartWidth, chartHeight = _props6.chartHeight;
+ if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(height) || height <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(x) || x !== +x || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(y) || y !== +y) return null;
+ var _props7 = this.props, horizontalPoints = _props7.horizontalPoints, verticalPoints = _props7.verticalPoints;
+ return horizontalPoints && horizontalPoints.length || !__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(horizontalCoordinatesGenerator) || (horizontalPoints = horizontalCoordinatesGenerator({
+ yAxis: yAxis,
+ width: chartWidth,
+ height: chartHeight,
+ offset: offset
+ })), verticalPoints && verticalPoints.length || !__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(verticalCoordinatesGenerator) || (verticalPoints = verticalCoordinatesGenerator({
+ xAxis: xAxis,
+ width: chartWidth,
+ height: chartHeight,
+ offset: offset
+ })), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("g", {
+ className: "recharts-cartesian-grid"
+ }, this.renderBackground(), horizontal && this.renderHorizontal(horizontalPoints), vertical && this.renderVertical(verticalPoints), horizontal && this.renderHorizontalStripes(horizontalPoints), vertical && this.renderVerticalStripes(verticalPoints));
+ }
+ } ]), CartesianGrid;
+ }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = "CartesianGrid",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {
+ x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ horizontal: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool ]),
+ vertical: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool ]),
+ horizontalPoints: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number),
+ verticalPoints: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number),
+ horizontalCoordinatesGenerator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ verticalCoordinatesGenerator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,
+ xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ offset: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,
+ chartWidth: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ chartHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,
+ verticalFill: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string),
+ horizontalFill: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string)
+ }), _class2.defaultProps = {
+ horizontal: !0,
+ vertical: !0,
+ horizontalPoints: [],
+ verticalPoints: [],
+ stroke: "#ccc",
+ fill: "none",
+ verticalFill: [],
+ horizontalFill: []
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = CartesianGrid;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__cartesian_Line__ = __webpack_require__(196), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(67), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(68), __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__ = __webpack_require__(92);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({
+ chartName: "LineChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Line__.a,
+ axisComponents: [ {
+ axisType: "xAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a
+ }, {
+ axisType: "yAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__.a
+ });
+}, function(module, exports, __webpack_require__) {
+ function throttle(func, wait, options) {
+ var leading = !0, trailing = !0;
+ if ("function" != typeof func) throw new TypeError(FUNC_ERROR_TEXT);
+ return isObject(options) && (leading = "leading" in options ? !!options.leading : leading,
+ trailing = "trailing" in options ? !!options.trailing : trailing), debounce(func, wait, {
+ leading: leading,
+ maxWait: wait,
+ trailing: trailing
+ });
+ }
+ var debounce = __webpack_require__(157), isObject = __webpack_require__(31), FUNC_ERROR_TEXT = "Expected a function";
+ module.exports = throttle;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ __webpack_require__.d(__webpack_exports__, "b", function() {
+ return eventCenter;
+ }), __webpack_require__.d(__webpack_exports__, "a", function() {
+ return SYNC_EVENT;
+ });
+ var __WEBPACK_IMPORTED_MODULE_0_events__ = __webpack_require__(792), __WEBPACK_IMPORTED_MODULE_0_events___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_events__), eventCenter = new __WEBPACK_IMPORTED_MODULE_0_events___default.a();
+ eventCenter.setMaxListeners && eventCenter.setMaxListeners(10);
+ var SYNC_EVENT = "recharts.syncMouseEvents";
+}, function(module, exports) {
+ function EventEmitter() {
+ this._events = this._events || {}, this._maxListeners = this._maxListeners || void 0;
+ }
+ function isFunction(arg) {
+ return "function" == typeof arg;
+ }
+ function isNumber(arg) {
+ return "number" == typeof arg;
+ }
+ function isObject(arg) {
+ return "object" == typeof arg && null !== arg;
+ }
+ function isUndefined(arg) {
+ return void 0 === arg;
+ }
+ module.exports = EventEmitter, EventEmitter.EventEmitter = EventEmitter, EventEmitter.prototype._events = void 0,
+ EventEmitter.prototype._maxListeners = void 0, EventEmitter.defaultMaxListeners = 10,
+ EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError("n must be a positive number");
+ return this._maxListeners = n, this;
+ }, EventEmitter.prototype.emit = function(type) {
+ var er, handler, len, args, i, listeners;
+ if (this._events || (this._events = {}), "error" === type && (!this._events.error || isObject(this._events.error) && !this._events.error.length)) {
+ if ((er = arguments[1]) instanceof Error) throw er;
+ var err = new Error('Uncaught, unspecified "error" event. (' + er + ")");
+ throw err.context = er, err;
+ }
+ if (handler = this._events[type], isUndefined(handler)) return !1;
+ if (isFunction(handler)) switch (arguments.length) {
+ case 1:
+ handler.call(this);
+ break;
+
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+
+ default:
+ args = Array.prototype.slice.call(arguments, 1), handler.apply(this, args);
+ } else if (isObject(handler)) for (args = Array.prototype.slice.call(arguments, 1),
+ listeners = handler.slice(), len = listeners.length, i = 0; i < len; i++) listeners[i].apply(this, args);
+ return !0;
+ }, EventEmitter.prototype.addListener = function(type, listener) {
+ var m;
+ if (!isFunction(listener)) throw TypeError("listener must be a function");
+ return this._events || (this._events = {}), this._events.newListener && this.emit("newListener", type, isFunction(listener.listener) ? listener.listener : listener),
+ this._events[type] ? isObject(this._events[type]) ? this._events[type].push(listener) : this._events[type] = [ this._events[type], listener ] : this._events[type] = listener,
+ isObject(this._events[type]) && !this._events[type].warned && (m = isUndefined(this._maxListeners) ? EventEmitter.defaultMaxListeners : this._maxListeners) && m > 0 && this._events[type].length > m && (this._events[type].warned = !0,
+ console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[type].length),
+ "function" == typeof console.trace && console.trace()), this;
+ }, EventEmitter.prototype.on = EventEmitter.prototype.addListener, EventEmitter.prototype.once = function(type, listener) {
+ function g() {
+ this.removeListener(type, g), fired || (fired = !0, listener.apply(this, arguments));
+ }
+ if (!isFunction(listener)) throw TypeError("listener must be a function");
+ var fired = !1;
+ return g.listener = listener, this.on(type, g), this;
+ }, EventEmitter.prototype.removeListener = function(type, listener) {
+ var list, position, length, i;
+ if (!isFunction(listener)) throw TypeError("listener must be a function");
+ if (!this._events || !this._events[type]) return this;
+ if (list = this._events[type], length = list.length, position = -1, list === listener || isFunction(list.listener) && list.listener === listener) delete this._events[type],
+ this._events.removeListener && this.emit("removeListener", type, listener); else if (isObject(list)) {
+ for (i = length; i-- > 0; ) if (list[i] === listener || list[i].listener && list[i].listener === listener) {
+ position = i;
+ break;
+ }
+ if (position < 0) return this;
+ 1 === list.length ? (list.length = 0, delete this._events[type]) : list.splice(position, 1),
+ this._events.removeListener && this.emit("removeListener", type, listener);
+ }
+ return this;
+ }, EventEmitter.prototype.removeAllListeners = function(type) {
+ var key, listeners;
+ if (!this._events) return this;
+ if (!this._events.removeListener) return 0 === arguments.length ? this._events = {} : this._events[type] && delete this._events[type],
+ this;
+ if (0 === arguments.length) {
+ for (key in this._events) "removeListener" !== key && this.removeAllListeners(key);
+ return this.removeAllListeners("removeListener"), this._events = {}, this;
+ }
+ if (listeners = this._events[type], isFunction(listeners)) this.removeListener(type, listeners); else if (listeners) for (;listeners.length; ) this.removeListener(type, listeners[listeners.length - 1]);
+ return delete this._events[type], this;
+ }, EventEmitter.prototype.listeners = function(type) {
+ return this._events && this._events[type] ? isFunction(this._events[type]) ? [ this._events[type] ] : this._events[type].slice() : [];
+ }, EventEmitter.prototype.listenerCount = function(type) {
+ if (this._events) {
+ var evlistener = this._events[type];
+ if (isFunction(evlistener)) return 1;
+ if (evlistener) return evlistener.length;
+ }
+ return 0;
+ }, EventEmitter.listenerCount = function(emitter, type) {
+ return emitter.listenerCount(type);
+ };
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__cartesian_Bar__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(67), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(68), __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__ = __webpack_require__(92);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({
+ chartName: "BarChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Bar__.a,
+ axisComponents: [ {
+ axisType: "xAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a
+ }, {
+ axisType: "yAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__.a
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__), __WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__ = __webpack_require__(130), __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__ = __webpack_require__(129), __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_5__polar_Pie__ = __webpack_require__(325);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__.a)({
+ chartName: "PieChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_5__polar_Pie__.a,
+ eventType: "item",
+ legendContent: "children",
+ axisComponents: [ {
+ axisType: "angleAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__.a
+ }, {
+ axisType: "radiusAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__.b,
+ defaultProps: {
+ layout: "centric",
+ startAngle: 0,
+ endAngle: 360,
+ cx: "50%",
+ cy: "50%",
+ innerRadius: 0,
+ outerRadius: "80%"
+ },
+ propTypes: {
+ layout: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOf([ "centric" ]),
+ startAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,
+ endAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,
+ cx: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ cy: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ innerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ outerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ])
+ }
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__ = __webpack_require__(117), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_4_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_smooth__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__container_Surface__ = __webpack_require__(78), __WEBPACK_IMPORTED_MODULE_7__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__ = __webpack_require__(65), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(122), __WEBPACK_IMPORTED_MODULE_11__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_12__util_ChartUtils__ = __webpack_require__(16), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, computeNode = function computeNode(_ref) {
+ var depth = _ref.depth, node = _ref.node, index = _ref.index, valueKey = _ref.valueKey, children = node.children, childDepth = depth + 1, computedChildren = children && children.length ? children.map(function(child, i) {
+ return computeNode({
+ depth: childDepth,
+ node: child,
+ index: i,
+ valueKey: valueKey
+ });
+ }) : null, value = void 0;
+ return value = children && children.length ? computedChildren.reduce(function(result, child) {
+ return result + child.value;
+ }, 0) : __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default()(node[valueKey]) || node[valueKey] <= 0 ? 0 : node[valueKey],
+ _extends({}, node, {
+ children: computedChildren,
+ value: value,
+ depth: depth,
+ index: index
+ });
+ }, filterRect = function(node) {
+ return {
+ x: node.x,
+ y: node.y,
+ width: node.width,
+ height: node.height
+ };
+ }, getAreaOfChildren = function(children, areaValueRatio) {
+ var ratio = areaValueRatio < 0 ? 0 : areaValueRatio;
+ return children.map(function(child) {
+ var area = child.value * ratio;
+ return _extends({}, child, {
+ area: __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default()(area) || area <= 0 ? 0 : area
+ });
+ });
+ }, getWorstScore = function(row, parentSize, aspectRatio) {
+ var parentArea = parentSize * parentSize, rowArea = row.area * row.area, _row$reduce = row.reduce(function(result, child) {
+ return {
+ min: Math.min(result.min, child.area),
+ max: Math.max(result.max, child.area)
+ };
+ }, {
+ min: 1 / 0,
+ max: 0
+ }), min = _row$reduce.min, max = _row$reduce.max;
+ return rowArea ? Math.max(parentArea * max * aspectRatio / rowArea, rowArea / (parentArea * min * aspectRatio)) : 1 / 0;
+ }, horizontalPosition = function(row, parentSize, parentRect, isFlush) {
+ var rowHeight = parentSize ? Math.round(row.area / parentSize) : 0;
+ (isFlush || rowHeight > parentRect.height) && (rowHeight = parentRect.height);
+ for (var curX = parentRect.x, child = void 0, i = 0, len = row.length; i < len; i++) child = row[i],
+ child.x = curX, child.y = parentRect.y, child.height = rowHeight, child.width = Math.min(rowHeight ? Math.round(child.area / rowHeight) : 0, parentRect.x + parentRect.width - curX),
+ curX += child.width;
+ return child.z = !0, child.width += parentRect.x + parentRect.width - curX, _extends({}, parentRect, {
+ y: parentRect.y + rowHeight,
+ height: parentRect.height - rowHeight
+ });
+ }, verticalPosition = function(row, parentSize, parentRect, isFlush) {
+ var rowWidth = parentSize ? Math.round(row.area / parentSize) : 0;
+ (isFlush || rowWidth > parentRect.width) && (rowWidth = parentRect.width);
+ for (var curY = parentRect.y, child = void 0, i = 0, len = row.length; i < len; i++) child = row[i],
+ child.x = parentRect.x, child.y = curY, child.width = rowWidth, child.height = Math.min(rowWidth ? Math.round(child.area / rowWidth) : 0, parentRect.y + parentRect.height - curY),
+ curY += child.height;
+ return child.z = !1, child.height += parentRect.y + parentRect.height - curY, _extends({}, parentRect, {
+ x: parentRect.x + rowWidth,
+ width: parentRect.width - rowWidth
+ });
+ }, position = function(row, parentSize, parentRect, isFlush) {
+ return parentSize === parentRect.width ? horizontalPosition(row, parentSize, parentRect, isFlush) : verticalPosition(row, parentSize, parentRect, isFlush);
+ }, squarify = function squarify(node, aspectRatio) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = filterRect(node), row = [], best = 1 / 0, child = void 0, score = void 0, size = Math.min(rect.width, rect.height), scaleChildren = getAreaOfChildren(children, rect.width * rect.height / node.value), tempChildren = scaleChildren.slice();
+ for (row.area = 0; tempChildren.length > 0; ) row.push(child = tempChildren[0]),
+ row.area += child.area, score = getWorstScore(row, size, aspectRatio), score <= best ? (tempChildren.shift(),
+ best = score) : (row.area -= row.pop().area, rect = position(row, size, rect, !1),
+ size = Math.min(rect.width, rect.height), row.length = row.area = 0, best = 1 / 0);
+ return row.length && (rect = position(row, size, rect, !0), row.length = row.area = 0),
+ _extends({}, node, {
+ children: scaleChildren.map(function(c) {
+ return squarify(c, aspectRatio);
+ })
+ });
+ }
+ return node;
+ }, Treemap = Object(__WEBPACK_IMPORTED_MODULE_11__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {
+ function Treemap() {
+ var _ref2, _temp, _this, _ret;
+ _classCallCheck(this, Treemap);
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+ return _temp = _this = _possibleConstructorReturn(this, (_ref2 = Treemap.__proto__ || Object.getPrototypeOf(Treemap)).call.apply(_ref2, [ this ].concat(args))),
+ _this.state = _this.createDefaultState(), _ret = _temp, _possibleConstructorReturn(_this, _ret);
+ }
+ return _inherits(Treemap, _Component), _createClass(Treemap, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ nextProps.data !== this.props.data && this.setState(this.createDefaultState());
+ }
+ }, {
+ key: "createDefaultState",
+ value: function() {
+ return {
+ isTooltipActive: !1,
+ activeNode: null
+ };
+ }
+ }, {
+ key: "handleMouseEnter",
+ value: function(node, e) {
+ var _props = this.props, onMouseEnter = _props.onMouseEnter, children = _props.children;
+ Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a) ? this.setState({
+ isTooltipActive: !0,
+ activeNode: node
+ }, function() {
+ onMouseEnter && onMouseEnter(node, e);
+ }) : onMouseEnter && onMouseEnter(node, e);
+ }
+ }, {
+ key: "handleMouseLeave",
+ value: function(node, e) {
+ var _props2 = this.props, onMouseLeave = _props2.onMouseLeave, children = _props2.children;
+ Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a) ? this.setState({
+ isTooltipActive: !1,
+ activeNode: null
+ }, function() {
+ onMouseLeave && onMouseLeave(node, e);
+ }) : onMouseLeave && onMouseLeave(node, e);
+ }
+ }, {
+ key: "handleClick",
+ value: function(node) {
+ var onClick = this.props.onClick;
+ onClick && onClick(node);
+ }
+ }, {
+ key: "renderAnimatedItem",
+ value: function(content, nodeProps, isLeaf) {
+ var _this2 = this, _props3 = this.props, isAnimationActive = _props3.isAnimationActive, animationBegin = _props3.animationBegin, animationDuration = _props3.animationDuration, animationEasing = _props3.animationEasing, isUpdateAnimationActive = _props3.isUpdateAnimationActive, width = nodeProps.width, height = nodeProps.height, x = nodeProps.x, y = nodeProps.y, translateX = parseInt((2 * Math.random() - 1) * width, 10), event = {};
+ return isLeaf && (event = {
+ onMouseEnter: this.handleMouseEnter.bind(this, nodeProps),
+ onMouseLeave: this.handleMouseLeave.bind(this, nodeProps),
+ onClick: this.handleClick.bind(this, nodeProps)
+ }), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_smooth___default.a, {
+ from: {
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ },
+ to: {
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ },
+ duration: animationDuration,
+ easing: animationEasing,
+ isActive: isUpdateAnimationActive
+ }, function(_ref3) {
+ var currX = _ref3.x, currY = _ref3.y, currWidth = _ref3.width, currHeight = _ref3.height;
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_smooth___default.a, {
+ from: "translate(" + translateX + "px, " + translateX + "px)",
+ to: "translate(0, 0)",
+ attributeName: "transform",
+ begin: animationBegin,
+ easing: animationEasing,
+ isActive: isAnimationActive,
+ duration: animationDuration
+ }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__container_Layer__.a, event, _this2.renderContentItem(content, _extends({}, nodeProps, {
+ isAnimationActive: isAnimationActive,
+ isUpdateAnimationActive: !isUpdateAnimationActive,
+ width: currWidth,
+ height: currHeight,
+ x: currX,
+ y: currY
+ }))));
+ });
+ }
+ }, {
+ key: "renderContentItem",
+ value: function(content, nodeProps) {
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(content) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(content, nodeProps) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(content) ? content(nodeProps) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__.a, _extends({
+ fill: "#fff",
+ stroke: "#000"
+ }, nodeProps));
+ }
+ }, {
+ key: "renderNode",
+ value: function(root, node, i) {
+ var _this3 = this, content = this.props.content, nodeProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props), node, {
+ root: root
+ }), isLeaf = !node.children || !node.children.length;
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__container_Layer__.a, {
+ key: "recharts-treemap-node-" + i,
+ className: "recharts-treemap-depth-" + node.depth
+ }, this.renderAnimatedItem(content, nodeProps, isLeaf), node.children && node.children.length ? node.children.map(function(child, index) {
+ return _this3.renderNode(node, child, index);
+ }) : null);
+ }
+ }, {
+ key: "renderAllNodes",
+ value: function() {
+ var _props4 = this.props, width = _props4.width, height = _props4.height, data = _props4.data, dataKey = _props4.dataKey, aspectRatio = _props4.aspectRatio, root = computeNode({
+ depth: 0,
+ node: {
+ children: data,
+ x: 0,
+ y: 0,
+ width: width,
+ height: height
+ },
+ index: 0,
+ valueKey: dataKey
+ }), formatRoot = squarify(root, aspectRatio);
+ return this.renderNode(formatRoot, formatRoot, 0);
+ }
+ }, {
+ key: "renderTooltip",
+ value: function() {
+ var _props5 = this.props, children = _props5.children, nameKey = _props5.nameKey, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a);
+ if (!tooltipItem) return null;
+ var _props6 = this.props, width = _props6.width, height = _props6.height, dataKey = _props6.dataKey, _state = this.state, isTooltipActive = _state.isTooltipActive, activeNode = _state.activeNode, viewBox = {
+ x: 0,
+ y: 0,
+ width: width,
+ height: height
+ }, coordinate = activeNode ? {
+ x: activeNode.x + activeNode.width / 2,
+ y: activeNode.y + activeNode.height / 2
+ } : null, payload = isTooltipActive && activeNode ? [ {
+ payload: activeNode,
+ name: Object(__WEBPACK_IMPORTED_MODULE_12__util_ChartUtils__.w)(activeNode, nameKey, ""),
+ value: Object(__WEBPACK_IMPORTED_MODULE_12__util_ChartUtils__.w)(activeNode, dataKey)
+ } ] : [];
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(tooltipItem, {
+ viewBox: viewBox,
+ active: isTooltipActive,
+ coordinate: coordinate,
+ label: "",
+ payload: payload
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ if (!Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.q)(this)) return null;
+ var _props7 = this.props, width = _props7.width, height = _props7.height, className = _props7.className, style = _props7.style, children = _props7.children, others = _objectWithoutProperties(_props7, [ "width", "height", "className", "style", "children" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others);
+ return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("div", {
+ className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-wrapper", className),
+ style: _extends({}, style, {
+ position: "relative",
+ cursor: "default",
+ width: width,
+ height: height
+ })
+ }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__container_Surface__.a, _extends({}, attrs, {
+ width: width,
+ height: height
+ }), this.renderAllNodes(), Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.g)(children)), this.renderTooltip());
+ }
+ } ]), Treemap;
+ }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Treemap",
+ _class2.propTypes = {
+ width: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ data: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array,
+ style: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,
+ aspectRatio: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ content: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ fill: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ stroke: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,
+ nameKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ dataKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),
+ children: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node ]),
+ onMouseEnter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ onMouseLeave: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ onClick: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,
+ isAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,
+ animationBegin: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ animationDuration: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,
+ animationEasing: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ])
+ }, _class2.defaultProps = {
+ dataKey: "value",
+ aspectRatio: .5 * (1 + Math.sqrt(5)),
+ isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)(),
+ isUpdateAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)(),
+ animationBegin: 0,
+ animationDuration: 1500,
+ animationEasing: "linear"
+ }, _class = _temp2)) || _class;
+ __webpack_exports__.a = Treemap;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function _objectWithoutProperties(obj, keys) {
+ var target = {};
+ for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);
+ return target;
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_lodash_sumBy__ = __webpack_require__(797), __WEBPACK_IMPORTED_MODULE_1_lodash_sumBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sumBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_min__ = __webpack_require__(284), __WEBPACK_IMPORTED_MODULE_2_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_min__), __WEBPACK_IMPORTED_MODULE_3_lodash_maxBy__ = __webpack_require__(324), __WEBPACK_IMPORTED_MODULE_3_lodash_maxBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_maxBy__), __WEBPACK_IMPORTED_MODULE_4_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_4_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react__), __WEBPACK_IMPORTED_MODULE_5_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_5_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_prop_types__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7__container_Surface__ = __webpack_require__(78), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__ = __webpack_require__(122), __WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__ = __webpack_require__(65), __WEBPACK_IMPORTED_MODULE_11__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__ = __webpack_require__(16), _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _extends = Object.assign || function(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
+ }
+ return target;
+ }, defaultCoordinateOfTooltip = {
+ x: 0,
+ y: 0
+ }, interpolationGenerator = function(a, b) {
+ var ka = +a, kb = b - ka;
+ return function(t) {
+ return ka + kb * t;
+ };
+ }, centerY = function(node) {
+ return node.y + node.dy / 2;
+ }, getValue = function(entry) {
+ return entry && entry.value || 0;
+ }, getSumOfIds = function(links, ids) {
+ return ids.reduce(function(result, id) {
+ return result + getValue(links[id]);
+ }, 0);
+ }, getSumWithWeightedSource = function(tree, links, ids) {
+ return ids.reduce(function(result, id) {
+ var link = links[id], sourceNode = tree[link.source];
+ return result + centerY(sourceNode) * getValue(links[id]);
+ }, 0);
+ }, getSumWithWeightedTarget = function(tree, links, ids) {
+ return ids.reduce(function(result, id) {
+ var link = links[id], targetNode = tree[link.target];
+ return result + centerY(targetNode) * getValue(links[id]);
+ }, 0);
+ }, ascendingY = function(a, b) {
+ return a.y - b.y;
+ }, searchTargetsAndSources = function(links, id) {
+ for (var sourceNodes = [], sourceLinks = [], targetNodes = [], targetLinks = [], i = 0, len = links.length; i < len; i++) {
+ var link = links[i];
+ link.source === id && (targetNodes.push(link.target), targetLinks.push(i)), link.target === id && (sourceNodes.push(link.source),
+ sourceLinks.push(i));
+ }
+ return {
+ sourceNodes: sourceNodes,
+ sourceLinks: sourceLinks,
+ targetLinks: targetLinks,
+ targetNodes: targetNodes
+ };
+ }, updateDepthOfTargets = function updateDepthOfTargets(tree, curNode) {
+ for (var targetNodes = curNode.targetNodes, i = 0, len = targetNodes.length; i < len; i++) {
+ var target = tree[targetNodes[i]];
+ target && (target.depth = Math.max(curNode.depth + 1, target.depth), updateDepthOfTargets(tree, target));
+ }
+ }, getNodesTree = function(_ref, width, nodeWidth) {
+ for (var nodes = _ref.nodes, links = _ref.links, tree = nodes.map(function(entry, index) {
+ var result = searchTargetsAndSources(links, index);
+ return _extends({}, entry, result, {
+ value: Math.max(getSumOfIds(links, result.sourceLinks), getSumOfIds(links, result.targetLinks)),
+ depth: 0
+ });
+ }), i = 0, len = tree.length; i < len; i++) {
+ var node = tree[i];
+ node.sourceNodes.length || updateDepthOfTargets(tree, node);
+ }
+ var maxDepth = __WEBPACK_IMPORTED_MODULE_3_lodash_maxBy___default()(tree, function(entry) {
+ return entry.depth;
+ }).depth;
+ if (maxDepth >= 1) for (var childWidth = (width - nodeWidth) / maxDepth, _i = 0, _len = tree.length; _i < _len; _i++) {
+ var _node = tree[_i];
+ _node.targetNodes.length || (_node.depth = maxDepth), _node.x = _node.depth * childWidth,
+ _node.dx = nodeWidth;
+ }
+ return {
+ tree: tree,
+ maxDepth: maxDepth
+ };
+ }, getDepthTree = function(tree) {
+ for (var result = [], i = 0, len = tree.length; i < len; i++) {
+ var node = tree[i];
+ result[node.depth] || (result[node.depth] = []), result[node.depth].push(node);
+ }
+ return result;
+ }, updateYOfTree = function(depthTree, height, nodePadding, links) {
+ for (var yRatio = __WEBPACK_IMPORTED_MODULE_2_lodash_min___default()(depthTree.map(function(nodes) {
+ return (height - (nodes.length - 1) * nodePadding) / __WEBPACK_IMPORTED_MODULE_1_lodash_sumBy___default()(nodes, getValue);
+ })), d = 0, maxDepth = depthTree.length; d < maxDepth; d++) for (var i = 0, len = depthTree[d].length; i < len; i++) {
+ var node = depthTree[d][i];
+ node.y = i, node.dy = node.value * yRatio;
+ }
+ return links.map(function(link) {
+ return _extends({}, link, {
+ dy: getValue(link) * yRatio
+ });
+ });
+ }, resolveCollisions = function(depthTree, height, nodePadding) {
+ for (var i = 0, len = depthTree.length; i < len; i++) {
+ var nodes = depthTree[i], n = nodes.length;
+ nodes.sort(ascendingY);
+ for (var y0 = 0, j = 0; j < n; j++) {
+ var node = nodes[j], dy = y0 - node.y;
+ dy > 0 && (node.y += dy), y0 = node.y + node.dy + nodePadding;
+ }
+ y0 = height + nodePadding;
+ for (var _j = n - 1; _j >= 0; _j--) {
+ var _node2 = nodes[_j], _dy = _node2.y + _node2.dy + nodePadding - y0;
+ if (!(_dy > 0)) break;
+ _node2.y -= _dy, y0 = _node2.y;
+ }
+ }
+ }, relaxLeftToRight = function(tree, depthTree, links, alpha) {
+ for (var i = 0, maxDepth = depthTree.length; i < maxDepth; i++) for (var nodes = depthTree[i], j = 0, len = nodes.length; j < len; j++) {
+ var node = nodes[j];
+ if (node.sourceLinks.length) {
+ var sourceSum = getSumOfIds(links, node.sourceLinks), weightedSum = getSumWithWeightedSource(tree, links, node.sourceLinks), y = weightedSum / sourceSum;
+ node.y += (y - centerY(node)) * alpha;
+ }
+ }
+ }, relaxRightToLeft = function(tree, depthTree, links, alpha) {
+ for (var i = depthTree.length - 1; i >= 0; i--) for (var nodes = depthTree[i], j = 0, len = nodes.length; j < len; j++) {
+ var node = nodes[j];
+ if (node.targetLinks.length) {
+ var targetSum = getSumOfIds(links, node.targetLinks), weightedSum = getSumWithWeightedTarget(tree, links, node.targetLinks), y = weightedSum / targetSum;
+ node.y += (y - centerY(node)) * alpha;
+ }
+ }
+ }, updateYOfLinks = function(tree, links) {
+ for (var i = 0, len = tree.length; i < len; i++) {
+ var node = tree[i], sy = 0, ty = 0;
+ node.targetLinks.sort(function(a, b) {
+ return tree[links[a].target].y - tree[links[b].target].y;
+ }), node.sourceLinks.sort(function(a, b) {
+ return tree[links[a].source].y - tree[links[b].source].y;
+ });
+ for (var j = 0, tLen = node.targetLinks.length; j < tLen; j++) {
+ var link = links[node.targetLinks[j]];
+ link && (link.sy = sy, sy += link.dy);
+ }
+ for (var _j2 = 0, sLen = node.sourceLinks.length; _j2 < sLen; _j2++) {
+ var _link = links[node.sourceLinks[_j2]];
+ _link && (_link.ty = ty, ty += _link.dy);
+ }
+ }
+ }, computeData = function(_ref2) {
+ var data = _ref2.data, width = _ref2.width, height = _ref2.height, iterations = _ref2.iterations, nodeWidth = _ref2.nodeWidth, nodePadding = _ref2.nodePadding, links = data.links, _getNodesTree = getNodesTree(data, width, nodeWidth), tree = _getNodesTree.tree, depthTree = getDepthTree(tree), newLinks = updateYOfTree(depthTree, height, nodePadding, links);
+ resolveCollisions(depthTree, height, nodePadding);
+ for (var alpha = 1, i = 1; i <= iterations; i++) relaxRightToLeft(tree, depthTree, newLinks, alpha *= .99),
+ resolveCollisions(depthTree, height, nodePadding), relaxLeftToRight(tree, depthTree, newLinks, alpha),
+ resolveCollisions(depthTree, height, nodePadding);
+ return updateYOfLinks(tree, newLinks), {
+ nodes: tree,
+ links: newLinks
+ };
+ }, getCoordinateOfTooltip = function(el, type) {
+ return "node" === type ? {
+ x: el.x + el.width / 2,
+ y: el.y + el.height / 2
+ } : {
+ x: (el.sourceX + el.targetX) / 2,
+ y: (el.sourceY + el.targetY) / 2
+ };
+ }, getPayloadOfTooltip = function(el, type, nameKey) {
+ var payload = el.payload;
+ if ("node" === type) return [ {
+ payload: el,
+ name: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload, nameKey, ""),
+ value: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload, "value")
+ } ];
+ if (payload.source && payload.target) {
+ return [ {
+ payload: el,
+ name: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload.source, nameKey, "") + " - " + Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload.target, nameKey, ""),
+ value: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload, "value")
+ } ];
+ }
+ return [];
+ }, Sankey = Object(__WEBPACK_IMPORTED_MODULE_11__util_PureRender__.a)((_temp = _class2 = function(_Component) {
+ function Sankey(props) {
+ _classCallCheck(this, Sankey);
+ var _this = _possibleConstructorReturn(this, (Sankey.__proto__ || Object.getPrototypeOf(Sankey)).call(this, props));
+ return _this.state = _this.createDefaultState(props), _this;
+ }
+ return _inherits(Sankey, _Component), _createClass(Sankey, [ {
+ key: "componentWillReceiveProps",
+ value: function(nextProps) {
+ var _props = this.props, data = _props.data, width = _props.width, height = _props.height, margin = _props.margin, iterations = _props.iterations, nodeWidth = _props.nodeWidth, nodePadding = _props.nodePadding, nameKey = _props.nameKey;
+ nextProps.data === data && nextProps.width === width && nextProps.height === height && Object(__WEBPACK_IMPORTED_MODULE_11__util_PureRender__.b)(nextProps.margin, margin) && nextProps.iterations === iterations && nextProps.nodeWidth === nodeWidth && nextProps.nodePadding === nodePadding && nextProps.nameKey === nameKey || this.setState(this.createDefaultState(nextProps));
+ }
+ }, {
+ key: "createDefaultState",
+ value: function(props) {
+ var data = props.data, width = props.width, height = props.height, margin = props.margin, iterations = props.iterations, nodeWidth = props.nodeWidth, nodePadding = props.nodePadding, contentWidth = width - (margin && margin.left || 0) - (margin && margin.right || 0), contentHeight = height - (margin && margin.top || 0) - (margin && margin.bottom || 0), _computeData = computeData({
+ data: data,
+ width: contentWidth,
+ height: contentHeight,
+ iterations: iterations,
+ nodeWidth: nodeWidth,
+ nodePadding: nodePadding
+ }), links = _computeData.links;
+ return {
+ activeElement: null,
+ activeElementType: null,
+ isTooltipActive: !1,
+ nodes: _computeData.nodes,
+ links: links
+ };
+ }
+ }, {
+ key: "handleMouseEnter",
+ value: function(el, type, e) {
+ var _props2 = this.props, onMouseEnter = _props2.onMouseEnter, children = _props2.children;
+ Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__.a) ? this.setState({
+ activeElement: el,
+ activeElementType: type,
+ isTooltipActive: !0
+ }, function() {
+ onMouseEnter && onMouseEnter(el, type, e);
+ }) : onMouseEnter && onMouseEnter(el, type, e);
+ }
+ }, {
+ key: "handleMouseLeave",
+ value: function(el, type, e) {
+ var _props3 = this.props, onMouseLeave = _props3.onMouseLeave, children = _props3.children;
+ Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__.a) ? this.setState({
+ isTooltipActive: !1
+ }, function() {
+ onMouseLeave && onMouseLeave(el, type, e);
+ }) : onMouseLeave && onMouseLeave(el, type, e);
+ }
+ }, {
+ key: "renderLinkItem",
+ value: function(option, props) {
+ if (__WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option)) return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props);
+ if (__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option)) return option(props);
+ var sourceX = props.sourceX, sourceY = props.sourceY, sourceControlX = props.sourceControlX, targetX = props.targetX, targetY = props.targetY, targetControlX = props.targetControlX, linkWidth = props.linkWidth, others = _objectWithoutProperties(props, [ "sourceX", "sourceY", "sourceControlX", "targetX", "targetY", "targetControlX", "linkWidth" ]);
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement("path", _extends({
+ className: "recharts-sankey-link",
+ d: "\n M" + sourceX + "," + sourceY + "\n C" + sourceControlX + "," + sourceY + " " + targetControlX + "," + targetY + " " + targetX + "," + targetY + "\n ",
+ fill: "none",
+ stroke: "#333",
+ strokeWidth: linkWidth,
+ strokeOpacity: "0.2"
+ }, Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(others)));
+ }
+ }, {
+ key: "renderLinks",
+ value: function(links, nodes) {
+ var _this2 = this, _props4 = this.props, linkCurvature = _props4.linkCurvature, linkContent = _props4.link, margin = _props4.margin, top = margin.top || 0, left = margin.left || 0;
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-sankey-links",
+ key: "recharts-sankey-links"
+ }, links.map(function(link, i) {
+ var sourceRelativeY = link.sy, targetRelativeY = link.ty, linkWidth = link.dy, source = nodes[link.source], target = nodes[link.target], sourceX = source.x + source.dx + left, targetX = target.x + left, interpolationFunc = interpolationGenerator(sourceX, targetX), sourceControlX = interpolationFunc(linkCurvature), targetControlX = interpolationFunc(1 - linkCurvature), sourceY = source.y + sourceRelativeY + linkWidth / 2 + top, targetY = target.y + targetRelativeY + linkWidth / 2 + top, linkProps = _extends({
+ sourceX: sourceX,
+ targetX: targetX,
+ sourceY: sourceY,
+ targetY: targetY,
+ sourceControlX: sourceControlX,
+ targetControlX: targetControlX,
+ sourceRelativeY: sourceRelativeY,
+ targetRelativeY: targetRelativeY,
+ linkWidth: linkWidth,
+ index: i,
+ payload: _extends({}, link, {
+ source: source,
+ target: target
+ })
+ }, Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(linkContent)), events = {
+ onMouseEnter: _this2.handleMouseEnter.bind(_this2, linkProps, "link"),
+ onMouseLeave: _this2.handleMouseLeave.bind(_this2, linkProps, "link")
+ };
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({
+ key: "link" + i
+ }, events), _this2.renderLinkItem(linkContent, linkProps));
+ }));
+ }
+ }, {
+ key: "renderNodeItem",
+ value: function(option, props) {
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__.a, _extends({
+ className: "recharts-sankey-node",
+ fill: "#0088fe",
+ fillOpacity: "0.8"
+ }, props));
+ }
+ }, {
+ key: "renderNodes",
+ value: function(nodes) {
+ var _this3 = this, _props5 = this.props, nodeContent = _props5.node, margin = _props5.margin, top = margin.top || 0, left = margin.left || 0;
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {
+ className: "recharts-sankey-nodes",
+ key: "recharts-sankey-nodes"
+ }, nodes.map(function(node, i) {
+ var x = node.x, y = node.y, dx = node.dx, dy = node.dy, nodeProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(nodeContent), {
+ x: x + left,
+ y: y + top,
+ width: dx,
+ height: dy,
+ index: i,
+ payload: node
+ }), events = {
+ onMouseEnter: _this3.handleMouseEnter.bind(_this3, nodeProps, "node"),
+ onMouseLeave: _this3.handleMouseLeave.bind(_this3, nodeProps, "node")
+ };
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({
+ key: "node" + i
+ }, events), _this3.renderNodeItem(nodeContent, nodeProps));
+ }));
+ }
+ }, {
+ key: "renderTooltip",
+ value: function() {
+ var _props6 = this.props, children = _props6.children, width = _props6.width, height = _props6.height, nameKey = _props6.nameKey, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__.a);
+ if (!tooltipItem) return null;
+ var _state = this.state, isTooltipActive = _state.isTooltipActive, activeElement = _state.activeElement, activeElementType = _state.activeElementType, viewBox = {
+ x: 0,
+ y: 0,
+ width: width,
+ height: height
+ }, coordinate = activeElement ? getCoordinateOfTooltip(activeElement, activeElementType) : defaultCoordinateOfTooltip, payload = activeElement ? getPayloadOfTooltip(activeElement, activeElementType, nameKey) : [];
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(tooltipItem, {
+ viewBox: viewBox,
+ active: isTooltipActive,
+ coordinate: coordinate,
+ label: "",
+ payload: payload
+ });
+ }
+ }, {
+ key: "render",
+ value: function() {
+ if (!Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.q)(this)) return null;
+ var _props7 = this.props, width = _props7.width, height = _props7.height, className = _props7.className, style = _props7.style, children = _props7.children, others = _objectWithoutProperties(_props7, [ "width", "height", "className", "style", "children" ]), _state2 = this.state, links = _state2.links, nodes = _state2.nodes, attrs = Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(others);
+ return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement("div", {
+ className: __WEBPACK_IMPORTED_MODULE_6_classnames___default()("recharts-wrapper", className),
+ style: _extends({}, style, {
+ position: "relative",
+ cursor: "default",
+ width: width,
+ height: height
+ })
+ }, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__container_Surface__.a, _extends({}, attrs, {
+ width: width,
+ height: height
+ }), Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.g)(children), this.renderLinks(links, nodes), this.renderNodes(nodes)), this.renderTooltip());
+ }
+ } ]), Sankey;
+ }(__WEBPACK_IMPORTED_MODULE_4_react__.Component), _class2.displayName = "Sankey",
+ _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.a, {
+ nameKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),
+ dataKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),
+ width: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ height: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ data: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({
+ nodes: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.array,
+ links: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({
+ target: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ source: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ value: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number
+ }))
+ }),
+ nodePadding: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ nodeWidth: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ linkCurvature: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ iterations: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ node: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),
+ link: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),
+ style: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object,
+ className: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string,
+ children: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.node ]),
+ margin: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({
+ top: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ right: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ bottom: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,
+ left: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number
+ })
+ }), _class2.defaultProps = {
+ nodePadding: 10,
+ nodeWidth: 10,
+ nameKey: "name",
+ dataKey: "value",
+ linkCurvature: .5,
+ iterations: 32,
+ margin: {
+ top: 5,
+ right: 5,
+ bottom: 5,
+ left: 5
+ }
+ }, _class = _temp)) || _class;
+ __webpack_exports__.a = Sankey;
+}, function(module, exports, __webpack_require__) {
+ function sumBy(array, iteratee) {
+ return array && array.length ? baseSum(array, baseIteratee(iteratee, 2)) : 0;
+ }
+ var baseIteratee = __webpack_require__(84), baseSum = __webpack_require__(798);
+ module.exports = sumBy;
+}, function(module, exports) {
+ function baseSum(array, iteratee) {
+ for (var result, index = -1, length = array.length; ++index < length; ) {
+ var current = iteratee(array[index]);
+ void 0 !== current && (result = void 0 === result ? current : result + current);
+ }
+ return result;
+ }
+ module.exports = baseSum;
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__), __WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_2__polar_Radar__ = __webpack_require__(326), __WEBPACK_IMPORTED_MODULE_3__polar_PolarAngleAxis__ = __webpack_require__(130), __WEBPACK_IMPORTED_MODULE_4__polar_PolarRadiusAxis__ = __webpack_require__(129), __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__ = __webpack_require__(23);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__.a)({
+ chartName: "RadarChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_2__polar_Radar__.a,
+ axisComponents: [ {
+ axisType: "angleAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__polar_PolarAngleAxis__.a
+ }, {
+ axisType: "radiusAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_4__polar_PolarRadiusAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.b,
+ defaultProps: {
+ layout: "centric",
+ startAngle: 90,
+ endAngle: -270,
+ cx: "50%",
+ cy: "50%",
+ innerRadius: 0,
+ outerRadius: "80%"
+ },
+ propTypes: {
+ layout: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOf([ "centric" ]),
+ startAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,
+ endAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,
+ cx: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ cy: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ innerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ outerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ])
+ }
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__cartesian_Scatter__ = __webpack_require__(199), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(67), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(68), __WEBPACK_IMPORTED_MODULE_4__cartesian_ZAxis__ = __webpack_require__(131), __WEBPACK_IMPORTED_MODULE_5__util_CartesianUtils__ = __webpack_require__(92);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({
+ chartName: "ScatterChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Scatter__.a,
+ eventType: "single",
+ axisComponents: [ {
+ axisType: "xAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a
+ }, {
+ axisType: "yAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a
+ }, {
+ axisType: "zAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_4__cartesian_ZAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_5__util_CartesianUtils__.a
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__ = __webpack_require__(197), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(67), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(68), __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__ = __webpack_require__(92);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({
+ chartName: "AreaChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__.a,
+ axisComponents: [ {
+ axisType: "xAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a
+ }, {
+ axisType: "yAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__.a
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__), __WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__ = __webpack_require__(130), __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__ = __webpack_require__(129), __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_5__polar_RadialBar__ = __webpack_require__(327);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__.a)({
+ chartName: "RadialBarChart",
+ GraphicalChild: __WEBPACK_IMPORTED_MODULE_5__polar_RadialBar__.a,
+ legendContent: "children",
+ axisComponents: [ {
+ axisType: "angleAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__.a
+ }, {
+ axisType: "radiusAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__.b,
+ defaultProps: {
+ layout: "radial",
+ startAngle: 0,
+ endAngle: 360,
+ cx: "50%",
+ cy: "50%",
+ innerRadius: 0,
+ outerRadius: "80%"
+ },
+ propTypes: {
+ layout: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOf([ "radial" ]),
+ startAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,
+ endAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,
+ cx: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ cy: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ innerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),
+ outerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ])
+ }
+ });
+}, function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__ = __webpack_require__(197), __WEBPACK_IMPORTED_MODULE_2__cartesian_Bar__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_3__cartesian_Line__ = __webpack_require__(196), __WEBPACK_IMPORTED_MODULE_4__cartesian_Scatter__ = __webpack_require__(199), __WEBPACK_IMPORTED_MODULE_5__cartesian_XAxis__ = __webpack_require__(67), __WEBPACK_IMPORTED_MODULE_6__cartesian_YAxis__ = __webpack_require__(68), __WEBPACK_IMPORTED_MODULE_7__cartesian_ZAxis__ = __webpack_require__(131), __WEBPACK_IMPORTED_MODULE_8__util_CartesianUtils__ = __webpack_require__(92);
+ __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({
+ chartName: "ComposedChart",
+ GraphicalChild: [ __WEBPACK_IMPORTED_MODULE_3__cartesian_Line__.a, __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__.a, __WEBPACK_IMPORTED_MODULE_2__cartesian_Bar__.a, __WEBPACK_IMPORTED_MODULE_4__cartesian_Scatter__.a ],
+ axisComponents: [ {
+ axisType: "xAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_5__cartesian_XAxis__.a
+ }, {
+ axisType: "yAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_6__cartesian_YAxis__.a
+ }, {
+ axisType: "zAxis",
+ AxisComp: __WEBPACK_IMPORTED_MODULE_7__cartesian_ZAxis__.a
+ } ],
+ formatAxisMap: __WEBPACK_IMPORTED_MODULE_8__util_CartesianUtils__.a
+ });
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ });
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _Grid = __webpack_require__(241), _Grid2 = _interopRequireDefault(_Grid), styles = {
+ container: {
+ flexWrap: "nowrap",
+ height: "100%",
+ maxWidth: "100%",
+ margin: 0
+ },
+ item: {
+ flex: 1,
+ padding: 0
+ }
+ }, ChartRow = function(_Component) {
+ function ChartRow() {
+ return _classCallCheck(this, ChartRow), _possibleConstructorReturn(this, (ChartRow.__proto__ || Object.getPrototypeOf(ChartRow)).apply(this, arguments));
+ }
+ return _inherits(ChartRow, _Component), _createClass(ChartRow, [ {
+ key: "render",
+ value: function() {
+ return _react2.default.createElement(_Grid2.default, {
+ container: !0,
+ direction: "row",
+ style: styles.container,
+ justify: "space-between"
+ }, _react2.default.Children.map(this.props.children, function(child) {
+ return _react2.default.createElement(_Grid2.default, {
+ item: !0,
+ xs: !0,
+ style: styles.item
+ }, child);
+ }));
+ }
+ } ]), ChartRow;
+ }(_react.Component);
+ exports.default = ChartRow;
+}, function(module, exports, __webpack_require__) {
+ "use strict";
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
+ }
+ function _possibleConstructorReturn(self, call) {
+ if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ return !call || "object" != typeof call && "function" != typeof call ? self : call;
+ }
+ function _inherits(subClass, superClass) {
+ if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);
+ }
+ Object.defineProperty(exports, "__esModule", {
+ value: !0
+ }), exports.bytePerSecPlotter = exports.bytePlotter = exports.percentPlotter = exports.multiplier = void 0;
+ var _createClass = function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
+ "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps),
+ Constructor;
+ };
+ }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _Typography = __webpack_require__(109), _Typography2 = _interopRequireDefault(_Typography), _common = __webpack_require__(61), multiplier = exports.multiplier = function() {
+ var by = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 1;
+ return function(x) {
+ return x * by;
+ };
+ }, unit = (exports.percentPlotter = function(text) {
+ var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1);
+ return function(payload) {
+ var p = mapper(payload);
+ return "number" != typeof p ? null : _react2.default.createElement(_Typography2.default, {
+ type: "caption",
+ color: "inherit"
+ }, _react2.default.createElement("span", {
+ style: _common.styles.light
+ }, text), " ", p.toFixed(2), " %");
+ };
+ }, [ "B", "KB", "MB", "GB", "TB", "PB" ]), simplifyBytes = function(x) {
+ for (var i = 0; x > 1024 && i < 5; i++) x /= 1024;
+ return x.toFixed(2).toString().concat(" ", unit[i]);
+ }, CustomTooltip = (exports.bytePlotter = function(text) {
+ var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1);
+ return function(payload) {
+ var p = mapper(payload);
+ return "number" != typeof p ? null : _react2.default.createElement(_Typography2.default, {
+ type: "caption",
+ color: "inherit"
+ }, _react2.default.createElement("span", {
+ style: _common.styles.light
+ }, text), " ", simplifyBytes(p));
+ };
+ }, exports.bytePerSecPlotter = function(text) {
+ var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1);
+ return function(payload) {
+ var p = mapper(payload);
+ return "number" != typeof p ? null : _react2.default.createElement(_Typography2.default, {
+ type: "caption",
+ color: "inherit"
+ }, _react2.default.createElement("span", {
+ style: _common.styles.light
+ }, text), " ", simplifyBytes(p), "/s");
+ };
+ }, function(_Component) {
+ function CustomTooltip() {
+ return _classCallCheck(this, CustomTooltip), _possibleConstructorReturn(this, (CustomTooltip.__proto__ || Object.getPrototypeOf(CustomTooltip)).apply(this, arguments));
+ }
+ return _inherits(CustomTooltip, _Component), _createClass(CustomTooltip, [ {
+ key: "render",
+ value: function() {
+ var _props = this.props, active = _props.active, payload = _props.payload, tooltip = _props.tooltip;
+ return active && "function" == typeof tooltip ? tooltip(payload[0].value) : null;
+ }
+ } ]), CustomTooltip;
+ }(_react.Component));
+ exports.default = CustomTooltip;
+} ]);`)))))))))))
+
+func bundleJsBytes() ([]byte, error) {
+ return _bundleJs, nil
}
-func publicDashboardHtml() (*asset, error) {
- bytes, err := publicDashboardHtmlBytes()
+func bundleJs() (*asset, error) {
+ bytes, err := bundleJsBytes()
if err != nil {
return nil, err
}
- info := bindataFileInfo{name: "public/dashboard.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
- a := &asset{bytes: bytes, info: info}
+ info := bindataFileInfo{name: "bundle.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc0, 0x90, 0x71, 0xbf, 0x69, 0x84, 0xe8, 0x63, 0x9a, 0x6c, 0x14, 0x49, 0xbd, 0x8b, 0x72, 0x2b, 0xe2, 0xd7, 0xdf, 0x49, 0x80, 0xea, 0x49, 0x2e, 0x7d, 0x4f, 0x23, 0x6b, 0xef, 0xcd, 0xc4, 0xdb}}
return a, nil
}
@@ -113,8 +38408,8 @@ func publicDashboardHtml() (*asset, error) {
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
@@ -124,6 +38419,12 @@ func Asset(name string) ([]byte, error) {
return nil, fmt.Errorf("Asset %s not found", name)
}
+// AssetString returns the asset contents as a string (instead of a []byte).
+func AssetString(name string) (string, error) {
+ data, err := Asset(name)
+ return string(data), err
+}
+
// MustAsset is like Asset but panics when Asset would return an error.
// It simplifies safe initialization of global variables.
func MustAsset(name string) []byte {
@@ -135,12 +38436,18 @@ func MustAsset(name string) []byte {
return a
}
+// MustAssetString is like AssetString but panics when Asset would return an
+// error. It simplifies safe initialization of global variables.
+func MustAssetString(name string) string {
+ return string(MustAsset(name))
+}
+
// AssetInfo loads and returns the asset info for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func AssetInfo(name string) (os.FileInfo, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
@@ -150,6 +38457,33 @@ func AssetInfo(name string) (os.FileInfo, error) {
return nil, fmt.Errorf("AssetInfo %s not found", name)
}
+// AssetDigest returns the digest of the file with the given name. It returns an
+// error if the asset could not be found or the digest could not be loaded.
+func AssetDigest(name string) ([sha256.Size]byte, error) {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err)
+ }
+ return a.digest, nil
+ }
+ return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name)
+}
+
+// Digests returns a map of all known files and their checksums.
+func Digests() (map[string][sha256.Size]byte, error) {
+ mp := make(map[string][sha256.Size]byte, len(_bindata))
+ for name := range _bindata {
+ a, err := _bindata[name]()
+ if err != nil {
+ return nil, err
+ }
+ mp[name] = a.digest
+ }
+ return mp, nil
+}
+
// AssetNames returns the names of the assets.
func AssetNames() []string {
names := make([]string, 0, len(_bindata))
@@ -161,8 +38495,9 @@ func AssetNames() []string {
// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
- "public/bundle.js": publicBundleJs,
- "public/dashboard.html": publicDashboardHtml,
+ "dashboard.html": dashboardHtml,
+
+ "bundle.js": bundleJs,
}
// AssetDir returns the file names below a certain
@@ -174,15 +38509,15 @@ var _bindata = map[string]func() (*asset, error){
// img/
// a.png
// b.png
-// then AssetDir("data") would return []string{"foo.txt", "img"}
-// AssetDir("data/img") would return []string{"a.png", "b.png"}
-// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// then AssetDir("data") would return []string{"foo.txt", "img"},
+// AssetDir("data/img") would return []string{"a.png", "b.png"},
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and
// AssetDir("") will return []string{"data"}.
func AssetDir(name string) ([]string, error) {
node := _bintree
if len(name) != 0 {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- pathList := strings.Split(cannonicalName, "/")
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(canonicalName, "/")
for _, p := range pathList {
node = node.Children[p]
if node == nil {
@@ -206,13 +38541,11 @@ type bintree struct {
}
var _bintree = &bintree{nil, map[string]*bintree{
- "public": {nil, map[string]*bintree{
- "bundle.js": {publicBundleJs, map[string]*bintree{}},
- "dashboard.html": {publicDashboardHtml, map[string]*bintree{}},
- }},
+ "bundle.js": {bundleJs, map[string]*bintree{}},
+ "dashboard.html": {dashboardHtml, map[string]*bintree{}},
}}
-// RestoreAsset restores an asset under the given directory
+// RestoreAsset restores an asset under the given directory.
func RestoreAsset(dir, name string) error {
data, err := Asset(name)
if err != nil {
@@ -230,14 +38563,10 @@ func RestoreAsset(dir, name string) error {
if err != nil {
return err
}
- err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
- if err != nil {
- return err
- }
- return nil
+ return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
}
-// RestoreAssets restores an asset under the given directory recursively
+// RestoreAssets restores an asset under the given directory recursively.
func RestoreAssets(dir, name string) error {
children, err := AssetDir(name)
// File
@@ -255,6 +38584,6 @@ func RestoreAssets(dir, name string) error {
}
func _filePath(dir, name string) string {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
}
diff --git a/dashboard/assets/.eslintrc b/dashboard/assets/.eslintrc
index 04ae15d01..ab7a3a039 100644
--- a/dashboard/assets/.eslintrc
+++ b/dashboard/assets/.eslintrc
@@ -16,37 +16,71 @@
// React syntax style mostly according to https://github.com/airbnb/javascript/tree/master/react
{
- "plugins": [
- "react"
- ],
- "parser": "babel-eslint",
- "parserOptions": {
- "ecmaFeatures": {
- "jsx": true,
- "modules": true
- }
- },
- "rules": {
- "react/prefer-es6-class": 2,
- "react/prefer-stateless-function": 2,
- "react/jsx-pascal-case": 2,
- "react/jsx-closing-bracket-location": [1, {"selfClosing": "tag-aligned", "nonEmpty": "tag-aligned"}],
- "react/jsx-closing-tag-location": 1,
- "jsx-quotes": ["error", "prefer-double"],
- "no-multi-spaces": "error",
- "react/jsx-tag-spacing": 2,
- "react/jsx-curly-spacing": [2, {"when": "never", "children": true}],
- "react/jsx-boolean-value": 2,
- "react/no-string-refs": 2,
- "react/jsx-wrap-multilines": 2,
- "react/self-closing-comp": 2,
- "react/jsx-no-bind": 2,
- "react/require-render-return": 2,
- "react/no-is-mounted": 2,
- "key-spacing": ["error", {"align": {
- "beforeColon": false,
- "afterColon": true,
- "on": "value"
- }}]
- }
+ 'env': {
+ 'browser': true,
+ 'node': true,
+ 'es6': true,
+ },
+ 'parser': 'babel-eslint',
+ 'parserOptions': {
+ 'sourceType': 'module',
+ 'ecmaVersion': 6,
+ 'ecmaFeatures': {
+ 'jsx': true,
+ }
+ },
+ 'extends': 'airbnb',
+ 'plugins': [
+ 'flowtype',
+ 'react',
+ ],
+ 'rules': {
+ 'no-tabs': 'off',
+ 'indent': ['error', 'tab'],
+ 'react/jsx-indent': ['error', 'tab'],
+ 'react/jsx-indent-props': ['error', 'tab'],
+ 'react/prefer-stateless-function': 'off',
+ 'jsx-quotes': ['error', 'prefer-single'],
+ 'no-plusplus': 'off',
+ 'no-console': ['error', { allow: ['error'] }],
+
+ // Specifies the maximum length of a line.
+ 'max-len': ['warn', 120, 2, {
+ 'ignoreUrls': true,
+ 'ignoreComments': false,
+ 'ignoreRegExpLiterals': true,
+ 'ignoreStrings': true,
+ 'ignoreTemplateLiterals': true,
+ }],
+ // Enforces consistent spacing between keys and values in object literal properties.
+ 'key-spacing': ['error', {'align': {
+ 'beforeColon': false,
+ 'afterColon': true,
+ 'on': 'value'
+ }}],
+ // Prohibits padding inside curly braces.
+ 'object-curly-spacing': ['error', 'never'],
+ 'no-use-before-define': 'off', // messageAPI
+ 'default-case': 'off',
+
+ 'flowtype/boolean-style': ['error', 'boolean'],
+ 'flowtype/define-flow-type': 'warn',
+ 'flowtype/generic-spacing': ['error', 'never'],
+ 'flowtype/no-primitive-constructor-types': 'error',
+ 'flowtype/no-weak-types': 'error',
+ 'flowtype/object-type-delimiter': ['error', 'comma'],
+ 'flowtype/require-valid-file-annotation': 'error',
+ 'flowtype/semi': ['error', 'always'],
+ 'flowtype/space-after-type-colon': ['error', 'always'],
+ 'flowtype/space-before-generic-bracket': ['error', 'never'],
+ 'flowtype/space-before-type-colon': ['error', 'never'],
+ 'flowtype/union-intersection-spacing': ['error', 'always'],
+ 'flowtype/use-flow-type': 'warn',
+ 'flowtype/valid-syntax': 'warn',
+ },
+ 'settings': {
+ 'flowtype': {
+ 'onlyFilesWithFlowAnnotation': true,
+ }
+ },
}
diff --git a/dashboard/assets/.flowconfig b/dashboard/assets/.flowconfig
new file mode 100644
index 000000000..8051ae5de
--- /dev/null
+++ b/dashboard/assets/.flowconfig
@@ -0,0 +1,9 @@
+[ignore]
+<PROJECT_ROOT>/node_modules/material-ui/.*\.js\.flow
+
+[libs]
+<PROJECT_ROOT>/flow-typed/
+node_modules/jss/flow-typed
+
+[options]
+include_warnings=true
diff --git a/dashboard/assets/common.jsx b/dashboard/assets/common.jsx
new file mode 100644
index 000000000..08a7554ff
--- /dev/null
+++ b/dashboard/assets/common.jsx
@@ -0,0 +1,71 @@
+// @flow
+
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+type ProvidedMenuProp = {|title: string, icon: string|};
+const menuSkeletons: Array<{|id: string, menu: ProvidedMenuProp|}> = [
+ {
+ id: 'home',
+ menu: {
+ title: 'Home',
+ icon: 'home',
+ },
+ }, {
+ id: 'chain',
+ menu: {
+ title: 'Chain',
+ icon: 'link',
+ },
+ }, {
+ id: 'txpool',
+ menu: {
+ title: 'TxPool',
+ icon: 'credit-card',
+ },
+ }, {
+ id: 'network',
+ menu: {
+ title: 'Network',
+ icon: 'globe',
+ },
+ }, {
+ id: 'system',
+ menu: {
+ title: 'System',
+ icon: 'tachometer',
+ },
+ }, {
+ id: 'logs',
+ menu: {
+ title: 'Logs',
+ icon: 'list',
+ },
+ },
+];
+export type MenuProp = {|...ProvidedMenuProp, id: string|};
+// The sidebar menu and the main content are rendered based on these elements.
+// Using the id is circumstantial in some cases, so it is better to insert it also as a value.
+// This way the mistyping is prevented.
+export const MENU: Map<string, {...MenuProp}> = new Map(menuSkeletons.map(({id, menu}) => ([id, {id, ...menu}])));
+
+export const DURATION = 200;
+
+export const styles = {
+ light: {
+ color: 'rgba(255, 255, 255, 0.54)',
+ },
+}
diff --git a/dashboard/assets/components/Body.jsx b/dashboard/assets/components/Body.jsx
new file mode 100644
index 000000000..054e04064
--- /dev/null
+++ b/dashboard/assets/components/Body.jsx
@@ -0,0 +1,61 @@
+// @flow
+
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+import React, {Component} from 'react';
+
+import SideBar from './SideBar';
+import Main from './Main';
+import type {Content} from '../types/content';
+
+// styles contains the constant styles of the component.
+const styles = {
+ body: {
+ display: 'flex',
+ width: '100%',
+ height: '100%',
+ },
+};
+
+export type Props = {
+ opened: boolean,
+ changeContent: string => void,
+ active: string,
+ content: Content,
+ shouldUpdate: Object,
+};
+
+// Body renders the body of the dashboard.
+class Body extends Component<Props> {
+ render() {
+ return (
+ <div style={styles.body}>
+ <SideBar
+ opened={this.props.opened}
+ changeContent={this.props.changeContent}
+ />
+ <Main
+ active={this.props.active}
+ content={this.props.content}
+ shouldUpdate={this.props.shouldUpdate}
+ />
+ </div>
+ );
+ }
+}
+
+export default Body;
diff --git a/dashboard/assets/components/ChartRow.jsx b/dashboard/assets/components/ChartRow.jsx
new file mode 100644
index 000000000..1075346fe
--- /dev/null
+++ b/dashboard/assets/components/ChartRow.jsx
@@ -0,0 +1,57 @@
+// @flow
+
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+import React, {Component} from 'react';
+import type {ChildrenArray} from 'react';
+
+import Grid from 'material-ui/Grid';
+
+// styles contains the constant styles of the component.
+const styles = {
+ container: {
+ flexWrap: 'nowrap',
+ height: '100%',
+ maxWidth: '100%',
+ margin: 0,
+ },
+ item: {
+ flex: 1,
+ padding: 0,
+ },
+}
+
+export type Props = {
+ children: ChildrenArray<React$Element<any>>,
+};
+
+// ChartRow renders a row of equally sized responsive charts.
+class ChartRow extends Component<Props> {
+ render() {
+ return (
+ <Grid container direction='row' style={styles.container} justify='space-between'>
+ {React.Children.map(this.props.children, child => (
+ <Grid item xs style={styles.item}>
+ {child}
+ </Grid>
+ ))}
+ </Grid>
+ );
+ }
+}
+
+export default ChartRow;
diff --git a/dashboard/assets/components/Common.jsx b/dashboard/assets/components/Common.jsx
deleted file mode 100644
index 5129939c5..000000000
--- a/dashboard/assets/components/Common.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// isNullOrUndefined returns true if the given variable is null or undefined.
-export const isNullOrUndefined = variable => variable === null || typeof variable === 'undefined';
-
-export const LIMIT = {
- memory: 200, // Maximum number of memory data samples.
- traffic: 200, // Maximum number of traffic data samples.
- log: 200, // Maximum number of logs.
-};
-// The sidebar menu and the main content are rendered based on these elements.
-export const TAGS = (() => {
- const T = {
- home: { title: "Home", },
- chain: { title: "Chain", },
- transactions: { title: "Transactions", },
- network: { title: "Network", },
- system: { title: "System", },
- logs: { title: "Logs", },
- };
- // Using the key is circumstantial in some cases, so it is better to insert it also as a value.
- // This way the mistyping is prevented.
- for(let key in T) {
- T[key]['id'] = key;
- }
- return T;
-})();
-
-export const DATA_KEYS = (() => {
- const DK = {};
- ["memory", "traffic", "logs"].map(key => {
- DK[key] = key;
- });
- return DK;
-})();
-
-// Temporary - taken from Material-UI
-export const DRAWER_WIDTH = 240;
diff --git a/dashboard/assets/components/CustomTooltip.jsx b/dashboard/assets/components/CustomTooltip.jsx
new file mode 100644
index 000000000..be7c624cf
--- /dev/null
+++ b/dashboard/assets/components/CustomTooltip.jsx
@@ -0,0 +1,95 @@
+// @flow
+
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+import React, {Component} from 'react';
+
+import Typography from 'material-ui/Typography';
+import {styles} from '../common';
+
+// multiplier multiplies a number by another.
+export const multiplier = <T>(by: number = 1) => (x: number) => x * by;
+
+// percentPlotter renders a tooltip, which displays the value of the payload followed by a percent sign.
+export const percentPlotter = <T>(text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => {
+ const p = mapper(payload);
+ if (typeof p !== 'number') {
+ return null;
+ }
+ return (
+ <Typography type='caption' color='inherit'>
+ <span style={styles.light}>{text}</span> {p.toFixed(2)} %
+ </Typography>
+ );
+};
+
+// unit contains the units for the bytePlotter.
+const unit = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
+
+// simplifyBytes returns the simplified version of the given value followed by the unit.
+const simplifyBytes = (x: number) => {
+ let i = 0;
+ for (; x > 1024 && i < 5; i++) {
+ x /= 1024;
+ }
+ return x.toFixed(2).toString().concat(' ', unit[i]);
+};
+
+// bytePlotter renders a tooltip, which displays the payload as a byte value.
+export const bytePlotter = <T>(text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => {
+ const p = mapper(payload);
+ if (typeof p !== 'number') {
+ return null;
+ }
+ return (
+ <Typography type='caption' color='inherit'>
+ <span style={styles.light}>{text}</span> {simplifyBytes(p)}
+ </Typography>
+ );
+};
+
+// bytePlotter renders a tooltip, which displays the payload as a byte value followed by '/s'.
+export const bytePerSecPlotter = <T>(text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => {
+ const p = mapper(payload);
+ if (typeof p !== 'number') {
+ return null;
+ }
+ return (
+ <Typography type='caption' color='inherit'>
+ <span style={styles.light}>{text}</span> {simplifyBytes(p)}/s
+ </Typography>
+ );
+};
+
+export type Props = {
+ active: boolean,
+ payload: Object,
+ tooltip: <T>(text: string, mapper?: T => T) => (payload: mixed) => null | React$Element<any>,
+};
+
+// CustomTooltip takes a tooltip function, and uses it to plot the active value of the chart.
+class CustomTooltip extends Component<Props> {
+ render() {
+ const {active, payload, tooltip} = this.props;
+ if (!active || typeof tooltip !== 'function') {
+ return null;
+ }
+ return tooltip(payload[0].value);
+ }
+}
+
+export default CustomTooltip;
diff --git a/dashboard/assets/components/Dashboard.jsx b/dashboard/assets/components/Dashboard.jsx
index 740acf959..90b1a785c 100644
--- a/dashboard/assets/components/Dashboard.jsx
+++ b/dashboard/assets/components/Dashboard.jsx
@@ -1,3 +1,5 @@
+// @flow
+
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
@@ -15,155 +17,219 @@
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
import React, {Component} from 'react';
-import PropTypes from 'prop-types';
-import {withStyles} from 'material-ui/styles';
-
-import SideBar from './SideBar.jsx';
-import Header from './Header.jsx';
-import Main from "./Main.jsx";
-import {isNullOrUndefined, LIMIT, TAGS, DATA_KEYS,} from "./Common.jsx";
-
-// Styles for the Dashboard component.
-const styles = theme => ({
- appFrame: {
- position: 'relative',
- display: 'flex',
- width: '100%',
- height: '100%',
- background: theme.palette.background.default,
- },
+
+import withStyles from 'material-ui/styles/withStyles';
+
+import Header from './Header';
+import Body from './Body';
+import {MENU} from '../common';
+import type {Content} from '../types/content';
+
+// deepUpdate updates an object corresponding to the given update data, which has
+// the shape of the same structure as the original object. updater also has the same
+// structure, except that it contains functions where the original data needs to be
+// updated. These functions are used to handle the update.
+//
+// Since the messages have the same shape as the state content, this approach allows
+// the generalization of the message handling. The only necessary thing is to set a
+// handler function for every path of the state in order to maximize the flexibility
+// of the update.
+const deepUpdate = (updater: Object, update: Object, prev: Object): $Shape<Content> => {
+ if (typeof update === 'undefined') {
+ // TODO (kurkomisi): originally this was deep copy, investigate it.
+ return prev;
+ }
+ if (typeof updater === 'function') {
+ return updater(update, prev);
+ }
+ const updated = {};
+ Object.keys(prev).forEach((key) => {
+ updated[key] = deepUpdate(updater[key], update[key], prev[key]);
+ });
+
+ return updated;
+};
+
+// shouldUpdate returns the structure of a message. It is used to prevent unnecessary render
+// method triggerings. In the affected component's shouldComponentUpdate method it can be checked
+// whether the involved data was changed or not by checking the message structure.
+//
+// We could return the message itself too, but it's safer not to give access to it.
+const shouldUpdate = (updater: Object, msg: Object) => {
+ const su = {};
+ Object.keys(msg).forEach((key) => {
+ su[key] = typeof updater[key] !== 'function' ? shouldUpdate(updater[key], msg[key]) : true;
+ });
+
+ return su;
+};
+
+// replacer is a state updater function, which replaces the original data.
+const replacer = <T>(update: T) => update;
+
+// appender is a state updater function, which appends the update data to the
+// existing data. limit defines the maximum allowed size of the created array,
+// mapper maps the update data.
+const appender = <T>(limit: number, mapper = replacer) => (update: Array<T>, prev: Array<T>) => [
+ ...prev,
+ ...update.map(sample => mapper(sample)),
+].slice(-limit);
+
+// defaultContent is the initial value of the state content.
+const defaultContent: Content = {
+ general: {
+ version: null,
+ commit: null,
+ },
+ home: {
+ activeMemory: [],
+ virtualMemory: [],
+ networkIngress: [],
+ networkEgress: [],
+ processCPU: [],
+ systemCPU: [],
+ diskRead: [],
+ diskWrite: [],
+ },
+ chain: {},
+ txpool: {},
+ network: {},
+ system: {},
+ logs: {
+ log: [],
+ },
+};
+
+// updaters contains the state updater functions for each path of the state.
+//
+// TODO (kurkomisi): Define a tricky type which embraces the content and the updaters.
+const updaters = {
+ general: {
+ version: replacer,
+ commit: replacer,
+ },
+ home: {
+ activeMemory: appender(200),
+ virtualMemory: appender(200),
+ networkIngress: appender(200),
+ networkEgress: appender(200),
+ processCPU: appender(200),
+ systemCPU: appender(200),
+ diskRead: appender(200),
+ diskWrite: appender(200),
+ },
+ chain: null,
+ txpool: null,
+ network: null,
+ system: null,
+ logs: {
+ log: appender(200),
+ },
+};
+
+// styles contains the constant styles of the component.
+const styles = {
+ dashboard: {
+ display: 'flex',
+ flexFlow: 'column',
+ width: '100%',
+ height: '100%',
+ zIndex: 1,
+ overflow: 'hidden',
+ }
+};
+
+// themeStyles returns the styles generated from the theme for the component.
+const themeStyles: Object = (theme: Object) => ({
+ dashboard: {
+ background: theme.palette.background.default,
+ },
});
-// Dashboard is the main component, which renders the whole page, makes connection with the server and listens for messages.
-// When there is an incoming message, updates the page's content correspondingly.
-class Dashboard extends Component {
- constructor(props) {
- super(props);
- this.state = {
- active: TAGS.home.id, // active menu
- sideBar: true, // true if the sidebar is opened
- memory: [],
- traffic: [],
- logs: [],
- shouldUpdate: {},
- };
- }
-
- // componentDidMount initiates the establishment of the first websocket connection after the component is rendered.
- componentDidMount() {
- this.reconnect();
- }
-
- // reconnect establishes a websocket connection with the server, listens for incoming messages
- // and tries to reconnect on connection loss.
- reconnect = () => {
- const server = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/api");
-
- server.onmessage = event => {
- const msg = JSON.parse(event.data);
- if (isNullOrUndefined(msg)) {
- return;
- }
- this.update(msg);
- };
-
- server.onclose = () => {
- setTimeout(this.reconnect, 3000);
- };
- };
-
- // update analyzes the incoming message, and updates the charts' content correspondingly.
- update = msg => {
- console.log(msg);
- this.setState(prevState => {
- let newState = [];
- newState.shouldUpdate = {};
- const insert = (key, values, limit) => {
- newState[key] = [...prevState[key], ...values];
- while (newState[key].length > limit) {
- newState[key].shift();
- }
- newState.shouldUpdate[key] = true;
- };
- // (Re)initialize the state with the past data.
- if (!isNullOrUndefined(msg.history)) {
- const memory = DATA_KEYS.memory;
- const traffic = DATA_KEYS.traffic;
- newState[memory] = [];
- newState[traffic] = [];
- if (!isNullOrUndefined(msg.history.memorySamples)) {
- newState[memory] = msg.history.memorySamples.map(elem => isNullOrUndefined(elem.value) ? 0 : elem.value);
- while (newState[memory].length > LIMIT.memory) {
- newState[memory].shift();
- }
- newState.shouldUpdate[memory] = true;
- }
- if (!isNullOrUndefined(msg.history.trafficSamples)) {
- newState[traffic] = msg.history.trafficSamples.map(elem => isNullOrUndefined(elem.value) ? 0 : elem.value);
- while (newState[traffic].length > LIMIT.traffic) {
- newState[traffic].shift();
- }
- newState.shouldUpdate[traffic] = true;
- }
- }
- // Insert the new data samples.
- if (!isNullOrUndefined(msg.memory)) {
- insert(DATA_KEYS.memory, [isNullOrUndefined(msg.memory.value) ? 0 : msg.memory.value], LIMIT.memory);
- }
- if (!isNullOrUndefined(msg.traffic)) {
- insert(DATA_KEYS.traffic, [isNullOrUndefined(msg.traffic.value) ? 0 : msg.traffic.value], LIMIT.traffic);
- }
- if (!isNullOrUndefined(msg.log)) {
- insert(DATA_KEYS.logs, [msg.log], LIMIT.log);
- }
-
- return newState;
- });
- };
-
- // The change of the active label on the SideBar component will trigger a new render in the Main component.
- changeContent = active => {
- this.setState(prevState => prevState.active !== active ? {active: active} : {});
- };
-
- openSideBar = () => {
- this.setState({sideBar: true});
- };
-
- closeSideBar = () => {
- this.setState({sideBar: false});
- };
-
- render() {
- // The classes property is injected by withStyles().
- const {classes} = this.props;
-
- return (
- <div className={classes.appFrame}>
- <Header
- opened={this.state.sideBar}
- open={this.openSideBar}
- />
- <SideBar
- opened={this.state.sideBar}
- close={this.closeSideBar}
- changeContent={this.changeContent}
- />
- <Main
- opened={this.state.sideBar}
- active={this.state.active}
- memory={this.state.memory}
- traffic={this.state.traffic}
- logs={this.state.logs}
- shouldUpdate={this.state.shouldUpdate}
- />
- </div>
- );
- }
-}
+export type Props = {
+ classes: Object, // injected by withStyles()
+};
-Dashboard.propTypes = {
- classes: PropTypes.object.isRequired,
+type State = {
+ active: string, // active menu
+ sideBar: boolean, // true if the sidebar is opened
+ content: Content, // the visualized data
+ shouldUpdate: Object, // labels for the components, which need to re-render based on the incoming message
};
-export default withStyles(styles)(Dashboard);
+// Dashboard is the main component, which renders the whole page, makes connection with the server and
+// listens for messages. When there is an incoming message, updates the page's content correspondingly.
+class Dashboard extends Component<Props, State> {
+ constructor(props: Props) {
+ super(props);
+ this.state = {
+ active: MENU.get('home').id,
+ sideBar: true,
+ content: defaultContent,
+ shouldUpdate: {},
+ };
+ }
+
+ // componentDidMount initiates the establishment of the first websocket connection after the component is rendered.
+ componentDidMount() {
+ this.reconnect();
+ }
+
+ // reconnect establishes a websocket connection with the server, listens for incoming messages
+ // and tries to reconnect on connection loss.
+ reconnect = () => {
+ const server = new WebSocket(`${((window.location.protocol === 'https:') ? 'wss://' : 'ws://') + window.location.host}/api`);
+ server.onopen = () => {
+ this.setState({content: defaultContent, shouldUpdate: {}});
+ };
+ server.onmessage = (event) => {
+ const msg: $Shape<Content> = JSON.parse(event.data);
+ if (!msg) {
+ console.error(`Incoming message is ${msg}`);
+ return;
+ }
+ this.update(msg);
+ };
+ server.onclose = () => {
+ setTimeout(this.reconnect, 3000);
+ };
+ };
+
+ // update updates the content corresponding to the incoming message.
+ update = (msg: $Shape<Content>) => {
+ this.setState(prevState => ({
+ content: deepUpdate(updaters, msg, prevState.content),
+ shouldUpdate: shouldUpdate(updaters, msg),
+ }));
+ };
+
+ // changeContent sets the active label, which is used at the content rendering.
+ changeContent = (newActive: string) => {
+ this.setState(prevState => (prevState.active !== newActive ? {active: newActive} : {}));
+ };
+
+ // switchSideBar opens or closes the sidebar's state.
+ switchSideBar = () => {
+ this.setState(prevState => ({sideBar: !prevState.sideBar}));
+ };
+
+ render() {
+ return (
+ <div className={this.props.classes.dashboard} style={styles.dashboard}>
+ <Header
+ opened={this.state.sideBar}
+ switchSideBar={this.switchSideBar}
+ />
+ <Body
+ opened={this.state.sideBar}
+ changeContent={this.changeContent}
+ active={this.state.active}
+ content={this.state.content}
+ shouldUpdate={this.state.shouldUpdate}
+ />
+ </div>
+ );
+ }
+}
+
+export default withStyles(themeStyles)(Dashboard);
diff --git a/dashboard/assets/components/Footer.jsx b/dashboard/assets/components/Footer.jsx
new file mode 100644
index 000000000..54b67c464
--- /dev/null
+++ b/dashboard/assets/components/Footer.jsx
@@ -0,0 +1,173 @@
+// @flow
+
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+import React, {Component} from 'react';
+
+import withStyles from 'material-ui/styles/withStyles';
+import Typography from 'material-ui/Typography';
+import Grid from 'material-ui/Grid';
+import {ResponsiveContainer, AreaChart, Area, Tooltip} from 'recharts';
+
+import ChartRow from './ChartRow';
+import CustomTooltip, {bytePlotter, bytePerSecPlotter, percentPlotter, multiplier} from './CustomTooltip';
+import {styles as commonStyles} from '../common';
+import type {Content} from '../types/content';
+
+// styles contains the constant styles of the component.
+const styles = {
+ footer: {
+ maxWidth: '100%',
+ flexWrap: 'nowrap',
+ margin: 0,
+ },
+ chartRowWrapper: {
+ height: '100%',
+ padding: 0,
+ },
+ doubleChartWrapper: {
+ height: '100%',
+ width: '99%',
+ paddingTop: 5,
+ },
+};
+
+// themeStyles returns the styles generated from the theme for the component.
+const themeStyles: Object = (theme: Object) => ({
+ footer: {
+ backgroundColor: theme.palette.background.appBar,
+ color: theme.palette.getContrastText(theme.palette.background.appBar),
+ zIndex: theme.zIndex.appBar,
+ height: theme.spacing.unit * 10,
+ },
+});
+
+export type Props = {
+ classes: Object, // injected by withStyles()
+ theme: Object,
+ content: Content,
+ shouldUpdate: Object,
+};
+
+// Footer renders the footer of the dashboard.
+class Footer extends Component<Props> {
+ shouldComponentUpdate(nextProps) {
+ return typeof nextProps.shouldUpdate.home !== 'undefined';
+ }
+
+ // info renders a label with the given values.
+ info = (about: string, value: ?string) => (value ? (
+ <Typography type='caption' color='inherit'>
+ <span style={commonStyles.light}>{about}</span> {value}
+ </Typography>
+ ) : null);
+
+ // doubleChart renders a pair of charts separated by the baseline.
+ doubleChart = (syncId, topChart, bottomChart) => {
+ const topKey = 'topKey';
+ const bottomKey = 'bottomKey';
+ const topDefault = topChart.default ? topChart.default : 0;
+ const bottomDefault = bottomChart.default ? bottomChart.default : 0;
+ const topTooltip = topChart.tooltip ? (
+ <Tooltip cursor={false} content={<CustomTooltip tooltip={topChart.tooltip} />} />
+ ) : null;
+ const bottomTooltip = bottomChart.tooltip ? (
+ <Tooltip cursor={false} content={<CustomTooltip tooltip={bottomChart.tooltip} />} />
+ ) : null;
+ const topColor = '#8884d8';
+ const bottomColor = '#82ca9d';
+
+ // Put the samples of the two charts into the same array in order to avoid problems
+ // at the synchronized area charts. If one of the two arrays doesn't have value at
+ // a given position, give it a 0 default value.
+ let data = [...topChart.data.map(({value}) => {
+ const d = {};
+ d[topKey] = value || topDefault;
+ return d;
+ })];
+ for (let i = 0; i < data.length && i < bottomChart.data.length; i++) {
+ // The value needs to be negative in order to plot it upside down.
+ const d = bottomChart.data[i];
+ data[i][bottomKey] = d && d.value ? -d.value : bottomDefault;
+ }
+ data = [...data, ...bottomChart.data.slice(data.length).map(({value}) => {
+ const d = {};
+ d[topKey] = topDefault;
+ d[bottomKey] = -value || bottomDefault;
+ return d;
+ })];
+
+ return (
+ <div style={styles.doubleChartWrapper}>
+ <ResponsiveContainer width='100%' height='50%'>
+ <AreaChart data={data} syncId={syncId} >
+ {topTooltip}
+ <Area type='monotone' dataKey={topKey} stroke={topColor} fill={topColor} />
+ </AreaChart>
+ </ResponsiveContainer>
+ <div style={{marginTop: -10, width: '100%', height: '50%'}}>
+ <ResponsiveContainer width='100%' height='100%'>
+ <AreaChart data={data} syncId={syncId} >
+ {bottomTooltip}
+ <Area type='monotone' dataKey={bottomKey} stroke={bottomColor} fill={bottomColor} />
+ </AreaChart>
+ </ResponsiveContainer>
+ </div>
+ </div>
+ );
+ }
+
+ render() {
+ const {content} = this.props;
+ const {general, home} = content;
+
+ return (
+ <Grid container className={this.props.classes.footer} direction='row' alignItems='center' style={styles.footer}>
+ <Grid item xs style={styles.chartRowWrapper}>
+ <ChartRow>
+ {this.doubleChart(
+ 'all',
+ {data: home.processCPU, tooltip: percentPlotter('Process')},
+ {data: home.systemCPU, tooltip: percentPlotter('System', multiplier(-1))},
+ )}
+ {this.doubleChart(
+ 'all',
+ {data: home.activeMemory, tooltip: bytePlotter('Active')},
+ {data: home.virtualMemory, tooltip: bytePlotter('Virtual', multiplier(-1))},
+ )}
+ {this.doubleChart(
+ 'all',
+ {data: home.diskRead, tooltip: bytePerSecPlotter('Disk Read')},
+ {data: home.diskWrite, tooltip: bytePerSecPlotter('Disk Write', multiplier(-1))},
+ )}
+ {this.doubleChart(
+ 'all',
+ {data: home.networkIngress, tooltip: bytePerSecPlotter('Download')},
+ {data: home.networkEgress, tooltip: bytePerSecPlotter('Upload', multiplier(-1))},
+ )}
+ </ChartRow>
+ </Grid>
+ <Grid item >
+ {this.info('Geth', general.version)}
+ {this.info('Commit', general.commit ? general.commit.substring(0, 7) : null)}
+ </Grid>
+ </Grid>
+ );
+ }
+}
+
+export default withStyles(themeStyles)(Footer);
diff --git a/dashboard/assets/components/Header.jsx b/dashboard/assets/components/Header.jsx
index 7cf57c9c0..e91885af3 100644
--- a/dashboard/assets/components/Header.jsx
+++ b/dashboard/assets/components/Header.jsx
@@ -1,3 +1,5 @@
+// @flow
+
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
@@ -15,73 +17,85 @@
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
import React, {Component} from 'react';
-import PropTypes from 'prop-types';
-import classNames from 'classnames';
-import {withStyles} from 'material-ui/styles';
+
+import withStyles from 'material-ui/styles/withStyles';
import AppBar from 'material-ui/AppBar';
import Toolbar from 'material-ui/Toolbar';
-import Typography from 'material-ui/Typography';
+import Transition from 'react-transition-group/Transition';
import IconButton from 'material-ui/IconButton';
-import MenuIcon from 'material-ui-icons/Menu';
+import Typography from 'material-ui/Typography';
+import ChevronLeftIcon from 'material-ui-icons/ChevronLeft';
+
+import {DURATION} from '../common';
-import {DRAWER_WIDTH} from './Common.jsx';
+// styles contains the constant styles of the component.
+const styles = {
+ arrow: {
+ default: {
+ transition: `transform ${DURATION}ms`,
+ },
+ transition: {
+ entered: {transform: 'rotate(180deg)'},
+ },
+ },
+};
-// Styles for the Header component.
-const styles = theme => ({
- appBar: {
- position: 'absolute',
- transition: theme.transitions.create(['margin', 'width'], {
- easing: theme.transitions.easing.sharp,
- duration: theme.transitions.duration.leavingScreen,
- }),
- },
- appBarShift: {
- marginLeft: DRAWER_WIDTH,
- width: `calc(100% - ${DRAWER_WIDTH}px)`,
- transition: theme.transitions.create(['margin', 'width'], {
- easing: theme.transitions.easing.easeOut,
- duration: theme.transitions.duration.enteringScreen,
- }),
- },
- menuButton: {
- marginLeft: 12,
- marginRight: 20,
- },
- hide: {
- display: 'none',
- },
+// themeStyles returns the styles generated from the theme for the component.
+const themeStyles = (theme: Object) => ({
+ header: {
+ backgroundColor: theme.palette.background.appBar,
+ color: theme.palette.getContrastText(theme.palette.background.appBar),
+ zIndex: theme.zIndex.appBar,
+ },
+ toolbar: {
+ paddingLeft: theme.spacing.unit,
+ paddingRight: theme.spacing.unit,
+ },
+ title: {
+ paddingLeft: theme.spacing.unit,
+ },
});
-// Header renders a header, which contains a sidebar opener icon when that is closed.
-class Header extends Component {
- render() {
- // The classes property is injected by withStyles().
- const {classes} = this.props;
+export type Props = {
+ classes: Object, // injected by withStyles()
+ opened: boolean,
+ switchSideBar: () => void,
+};
- return (
- <AppBar className={classNames(classes.appBar, this.props.opened && classes.appBarShift)}>
- <Toolbar disableGutters={!this.props.opened}>
- <IconButton
- color="contrast"
- aria-label="open drawer"
- onClick={this.props.open}
- className={classNames(classes.menuButton, this.props.opened && classes.hide)}
- >
- <MenuIcon />
- </IconButton>
- <Typography type="title" color="inherit" noWrap>
- Go Ethereum Dashboard
- </Typography>
- </Toolbar>
- </AppBar>
- );
- }
-}
+// Header renders the header of the dashboard.
+class Header extends Component<Props> {
+ shouldComponentUpdate(nextProps) {
+ return nextProps.opened !== this.props.opened;
+ }
-Header.propTypes = {
- classes: PropTypes.object.isRequired,
- opened: PropTypes.bool.isRequired,
- open: PropTypes.func.isRequired,
-};
+ // arrow renders a button, which changes the sidebar's state.
+ arrow = (transitionState: string) => (
+ <IconButton onClick={this.props.switchSideBar}>
+ <ChevronLeftIcon
+ style={{
+ ...styles.arrow.default,
+ ...styles.arrow.transition[transitionState],
+ }}
+ />
+ </IconButton>
+ );
+
+ render() {
+ const {classes, opened} = this.props;
+
+ return (
+ <AppBar position='static' className={classes.header}>
+ <Toolbar className={classes.toolbar}>
+ <Transition mountOnEnter in={opened} timeout={{enter: DURATION}}>
+ {this.arrow}
+ </Transition>
+ <Typography type='title' color='inherit' noWrap className={classes.title}>
+ Go Ethereum Dashboard
+ </Typography>
+ </Toolbar>
+ </AppBar>
+ );
+ }
+}
-export default withStyles(styles)(Header);
+export default withStyles(themeStyles)(Header);
diff --git a/dashboard/assets/components/Home.jsx b/dashboard/assets/components/Home.jsx
deleted file mode 100644
index f67bac555..000000000
--- a/dashboard/assets/components/Home.jsx
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-import React, {Component} from 'react';
-import PropTypes from 'prop-types';
-import Grid from 'material-ui/Grid';
-import {LineChart, AreaChart, Area, YAxis, CartesianGrid, Line, ResponsiveContainer} from 'recharts';
-import {withTheme} from 'material-ui/styles';
-
-import {isNullOrUndefined, DATA_KEYS} from "./Common.jsx";
-
-// ChartGrid renders a grid container for responsive charts.
-// The children are Recharts components extended with the Material-UI's xs property.
-class ChartGrid extends Component {
- render() {
- return (
- <Grid container spacing={this.props.spacing}>
- {
- React.Children.map(this.props.children, child => (
- <Grid item xs={child.props.xs}>
- <ResponsiveContainer width="100%" height={child.props.height}>
- {React.cloneElement(child, {data: child.props.values.map(value => ({value: value}))})}
- </ResponsiveContainer>
- </Grid>
- ))
- }
- </Grid>
- );
- }
-}
-
-ChartGrid.propTypes = {
- spacing: PropTypes.number.isRequired,
-};
-
-// Home renders the home component.
-class Home extends Component {
- shouldComponentUpdate(nextProps) {
- return !isNullOrUndefined(nextProps.shouldUpdate[DATA_KEYS.memory]) ||
- !isNullOrUndefined(nextProps.shouldUpdate[DATA_KEYS.traffic]);
- }
-
- render() {
- const {theme} = this.props;
- const memoryColor = theme.palette.primary[300];
- const trafficColor = theme.palette.secondary[300];
-
- return (
- <ChartGrid spacing={24}>
- <AreaChart xs={6} height={300} values={this.props.memory}>
- <YAxis />
- <Area type="monotone" dataKey="value" stroke={memoryColor} fill={memoryColor} />
- </AreaChart>
- <LineChart xs={6} height={300} values={this.props.traffic}>
- <Line type="monotone" dataKey="value" stroke={trafficColor} dot={false} />
- </LineChart>
- <LineChart xs={6} height={300} values={this.props.memory}>
- <YAxis />
- <CartesianGrid stroke="#eee" strokeDasharray="5 5" />
- <Line type="monotone" dataKey="value" stroke={memoryColor} dot={false} />
- </LineChart>
- <AreaChart xs={6} height={300} values={this.props.traffic}>
- <CartesianGrid stroke="#eee" strokeDasharray="5 5" vertical={false} />
- <Area type="monotone" dataKey="value" stroke={trafficColor} fill={trafficColor} />
- </AreaChart>
- </ChartGrid>
- );
- }
-}
-
-Home.propTypes = {
- theme: PropTypes.object.isRequired,
- shouldUpdate: PropTypes.object.isRequired,
-};
-
-export default withTheme()(Home);
diff --git a/dashboard/assets/components/Main.jsx b/dashboard/assets/components/Main.jsx
index b119d1ffd..a9e3d3578 100644
--- a/dashboard/assets/components/Main.jsx
+++ b/dashboard/assets/components/Main.jsx
@@ -1,3 +1,5 @@
+// @flow
+
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
@@ -15,95 +17,71 @@
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
import React, {Component} from 'react';
-import PropTypes from 'prop-types';
-import classNames from 'classnames';
-import {withStyles} from 'material-ui/styles';
-import {TAGS, DRAWER_WIDTH} from "./Common.jsx";
-import Home from './Home.jsx';
+import withStyles from 'material-ui/styles/withStyles';
-// ContentSwitch chooses and renders the proper page content.
-class ContentSwitch extends Component {
- render() {
- switch(this.props.active) {
- case TAGS.home.id:
- return <Home memory={this.props.memory} traffic={this.props.traffic} shouldUpdate={this.props.shouldUpdate} />;
- case TAGS.chain.id:
- return null;
- case TAGS.transactions.id:
- return null;
- case TAGS.network.id:
- // Only for testing.
- return null;
- case TAGS.system.id:
- return null;
- case TAGS.logs.id:
- return <div>{this.props.logs.map((log, index) => <div key={index}>{log}</div>)}</div>;
- }
- return null;
- }
-}
+import {MENU} from '../common';
+import Footer from './Footer';
+import type {Content} from '../types/content';
-ContentSwitch.propTypes = {
- active: PropTypes.string.isRequired,
- shouldUpdate: PropTypes.object.isRequired,
+// styles contains the constant styles of the component.
+const styles = {
+ wrapper: {
+ display: 'flex',
+ flexDirection: 'column',
+ width: '100%',
+ },
+ content: {
+ flex: 1,
+ overflow: 'auto',
+ },
};
-// styles contains the styles for the Main component.
-const styles = theme => ({
- content: {
- width: '100%',
- marginLeft: -DRAWER_WIDTH,
- flexGrow: 1,
- backgroundColor: theme.palette.background.default,
- padding: theme.spacing.unit * 3,
- transition: theme.transitions.create('margin', {
- easing: theme.transitions.easing.sharp,
- duration: theme.transitions.duration.leavingScreen,
- }),
- marginTop: 56,
- overflow: 'auto',
- [theme.breakpoints.up('sm')]: {
- content: {
- height: 'calc(100% - 64px)',
- marginTop: 64,
- },
- },
- },
- contentShift: {
- marginLeft: 0,
- transition: theme.transitions.create('margin', {
- easing: theme.transitions.easing.easeOut,
- duration: theme.transitions.duration.enteringScreen,
- }),
- },
+// themeStyles returns the styles generated from the theme for the component.
+const themeStyles = theme => ({
+ content: {
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing.unit * 3,
+ },
});
-// Main renders a component for the page content.
-class Main extends Component {
- render() {
- // The classes property is injected by withStyles().
- const {classes} = this.props;
+export type Props = {
+ classes: Object,
+ active: string,
+ content: Content,
+ shouldUpdate: Object,
+};
- return (
- <main className={classNames(classes.content, this.props.opened && classes.contentShift)}>
- <ContentSwitch
- active={this.props.active}
- memory={this.props.memory}
- traffic={this.props.traffic}
- logs={this.props.logs}
- shouldUpdate={this.props.shouldUpdate}
- />
- </main>
- );
- }
-}
+// Main renders the chosen content.
+class Main extends Component<Props> {
+ render() {
+ const {
+ classes, active, content, shouldUpdate,
+ } = this.props;
-Main.propTypes = {
- classes: PropTypes.object.isRequired,
- opened: PropTypes.bool.isRequired,
- active: PropTypes.string.isRequired,
- shouldUpdate: PropTypes.object.isRequired,
-};
+ let children = null;
+ switch (active) {
+ case MENU.get('home').id:
+ case MENU.get('chain').id:
+ case MENU.get('txpool').id:
+ case MENU.get('network').id:
+ case MENU.get('system').id:
+ children = <div>Work in progress.</div>;
+ break;
+ case MENU.get('logs').id:
+ children = <div>{content.logs.log.map((log, index) => <div key={index}>{log}</div>)}</div>;
+ }
+
+ return (
+ <div style={styles.wrapper}>
+ <div className={classes.content} style={styles.content}>{children}</div>
+ <Footer
+ content={content}
+ shouldUpdate={shouldUpdate}
+ />
+ </div>
+ );
+ }
+}
-export default withStyles(styles)(Main);
+export default withStyles(themeStyles)(Main);
diff --git a/dashboard/assets/components/SideBar.jsx b/dashboard/assets/components/SideBar.jsx
index ef077f1e0..c2e419ae9 100644
--- a/dashboard/assets/components/SideBar.jsx
+++ b/dashboard/assets/components/SideBar.jsx
@@ -1,3 +1,5 @@
+// @flow
+
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
@@ -15,92 +17,100 @@
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
import React, {Component} from 'react';
-import PropTypes from 'prop-types';
-import {withStyles} from 'material-ui/styles';
-import Drawer from 'material-ui/Drawer';
-import {IconButton} from "material-ui";
-import List, {ListItem, ListItemText} from 'material-ui/List';
-import ChevronLeftIcon from 'material-ui-icons/ChevronLeft';
-import {TAGS, DRAWER_WIDTH} from './Common.jsx';
+import withStyles from 'material-ui/styles/withStyles';
+import List, {ListItem, ListItemIcon, ListItemText} from 'material-ui/List';
+import Icon from 'material-ui/Icon';
+import Transition from 'react-transition-group/Transition';
+import {Icon as FontAwesome} from 'react-fa';
+
+import {MENU, DURATION} from '../common';
-// Styles for the SideBar component.
-const styles = theme => ({
- drawerPaper: {
- position: 'relative',
- height: '100%',
- width: DRAWER_WIDTH,
- },
- drawerHeader: {
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'flex-end',
- padding: '0 8px',
- ...theme.mixins.toolbar,
- transitionDuration: {
- enter: theme.transitions.duration.enteringScreen,
- exit: theme.transitions.duration.leavingScreen,
- }
- },
+// styles contains the constant styles of the component.
+const styles = {
+ menu: {
+ default: {
+ transition: `margin-left ${DURATION}ms`,
+ },
+ transition: {
+ entered: {marginLeft: -200},
+ },
+ },
+};
+
+// themeStyles returns the styles generated from the theme for the component.
+const themeStyles = theme => ({
+ list: {
+ background: theme.palette.background.appBar,
+ },
+ listItem: {
+ minWidth: theme.spacing.unit * 3,
+ },
+ icon: {
+ fontSize: theme.spacing.unit * 3,
+ },
});
-// SideBar renders a sidebar component.
-class SideBar extends Component {
- constructor(props) {
- super(props);
+export type Props = {
+ classes: Object, // injected by withStyles()
+ opened: boolean,
+ changeContent: string => void,
+};
- // clickOn contains onClick event functions for the menu items.
- // Instantiate only once, and reuse the existing functions to prevent the creation of
- // new function instances every time the render method is triggered.
- this.clickOn = {};
- for(let key in TAGS) {
- const id = TAGS[key].id;
- this.clickOn[id] = event => {
- event.preventDefault();
- console.log(event.target.key);
- this.props.changeContent(id);
- };
- }
- }
+// SideBar renders the sidebar of the dashboard.
+class SideBar extends Component<Props> {
+ shouldComponentUpdate(nextProps) {
+ return nextProps.opened !== this.props.opened;
+ }
- render() {
- // The classes property is injected by withStyles().
- const {classes} = this.props;
+ // clickOn returns a click event handler function for the given menu item.
+ clickOn = menu => (event) => {
+ event.preventDefault();
+ this.props.changeContent(menu);
+ };
- return (
- <Drawer
- type="persistent"
- classes={{paper: classes.drawerPaper,}}
- open={this.props.opened}
- >
- <div>
- <div className={classes.drawerHeader}>
- <IconButton onClick={this.props.close}>
- <ChevronLeftIcon />
- </IconButton>
- </div>
- <List>
- {
- Object.values(TAGS).map(tag => {
- return (
- <ListItem button key={tag.id} onClick={this.clickOn[tag.id]}>
- <ListItemText primary={tag.title} />
- </ListItem>
- );
- })
- }
- </List>
- </div>
- </Drawer>
- );
- }
-}
+ // menuItems returns the menu items corresponding to the sidebar state.
+ menuItems = (transitionState) => {
+ const {classes} = this.props;
+ const children = [];
+ MENU.forEach((menu) => {
+ children.push((
+ <ListItem button key={menu.id} onClick={this.clickOn(menu.id)} className={classes.listItem}>
+ <ListItemIcon>
+ <Icon className={classes.icon}>
+ <FontAwesome name={menu.icon} />
+ </Icon>
+ </ListItemIcon>
+ <ListItemText
+ primary={menu.title}
+ style={{
+ ...styles.menu.default,
+ ...styles.menu.transition[transitionState],
+ padding: 0,
+ }}
+ />
+ </ListItem>
+ ));
+ });
+ return children;
+ };
-SideBar.propTypes = {
- classes: PropTypes.object.isRequired,
- opened: PropTypes.bool.isRequired,
- close: PropTypes.func.isRequired,
- changeContent: PropTypes.func.isRequired,
-};
+ // menu renders the list of the menu items.
+ menu = (transitionState: Object) => (
+ <div className={this.props.classes.list}>
+ <List>
+ {this.menuItems(transitionState)}
+ </List>
+ </div>
+ );
+
+ render() {
+ return (
+ <Transition mountOnEnter in={this.props.opened} timeout={{enter: DURATION}}>
+ {this.menu}
+ </Transition>
+ );
+ }
+}
-export default withStyles(styles)(SideBar);
+export default withStyles(themeStyles)(SideBar);
diff --git a/dashboard/assets/public/dashboard.html b/dashboard/assets/dashboard.html
index e064a2b51..2491bf1ea 100644
--- a/dashboard/assets/public/dashboard.html
+++ b/dashboard/assets/dashboard.html
@@ -6,9 +6,15 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Go Ethereum Dashboard</title>
- <link rel="shortcut icon" type="image/ico" href="https://ethereum.org/favicon.ico"/>
-
- <!-- TODO (kurkomisi): Return to the external libraries to speed up the bundling during development -->
+ <link rel="shortcut icon" type="image/ico" href="https://ethereum.org/favicon.ico" />
+ <style>
+ ::-webkit-scrollbar {
+ width: 16px;
+ }
+ ::-webkit-scrollbar-thumb {
+ background: #212121;
+ }
+ </style>
</head>
<body style="height: 100%; margin: 0">
<div id="dashboard" style="height: 100%"></div>
diff --git a/dashboard/assets/fa-only-woff-loader.js b/dashboard/assets/fa-only-woff-loader.js
new file mode 100644
index 000000000..4d3035736
--- /dev/null
+++ b/dashboard/assets/fa-only-woff-loader.js
@@ -0,0 +1,25 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// fa-only-woff-loader removes the .eot, .ttf, .svg dependencies of the FontAwesome library,
+// because they produce unused extra blobs.
+module.exports = function(content) {
+ return content
+ .replace(/src.*url(?!.*url.*(\.eot)).*(\.eot)[^;]*;/,'')
+ .replace(/url(?!.*url.*(\.eot)).*(\.eot)[^,]*,/,'')
+ .replace(/url(?!.*url.*(\.ttf)).*(\.ttf)[^,]*,/,'')
+ .replace(/,[^,]*url(?!.*url.*(\.svg)).*(\.svg)[^;]*;/,';');
+};
diff --git a/dashboard/assets/index.jsx b/dashboard/assets/index.jsx
index 1e5fdc892..4ee567b01 100644
--- a/dashboard/assets/index.jsx
+++ b/dashboard/assets/index.jsx
@@ -1,3 +1,5 @@
+// @flow
+
// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
@@ -15,22 +17,25 @@
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
import React from 'react';
-import {hydrate} from 'react-dom';
-import {createMuiTheme, MuiThemeProvider} from 'material-ui/styles';
+import {render} from 'react-dom';
-import Dashboard from './components/Dashboard.jsx';
+import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
+import createMuiTheme from 'material-ui/styles/createMuiTheme';
-// Theme for the dashboard.
-const theme = createMuiTheme({
- palette: {
- type: 'dark',
- },
-});
+import Dashboard from './components/Dashboard';
-// Renders the whole dashboard.
-hydrate(
- <MuiThemeProvider theme={theme}>
- <Dashboard />
- </MuiThemeProvider>,
- document.getElementById('dashboard')
-);
+const theme: Object = createMuiTheme({
+ palette: {
+ type: 'dark',
+ },
+});
+const dashboard = document.getElementById('dashboard');
+if (dashboard) {
+ // Renders the whole dashboard.
+ render(
+ <MuiThemeProvider theme={theme}>
+ <Dashboard />
+ </MuiThemeProvider>,
+ dashboard,
+ );
+}
diff --git a/dashboard/assets/package-lock.json b/dashboard/assets/package-lock.json
new file mode 100644
index 000000000..a70fda6d5
--- /dev/null
+++ b/dashboard/assets/package-lock.json
@@ -0,0 +1,7678 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz",
+ "integrity": "sha512-sW77BFwJ48YvQp3Gzz5xtAUiXuYOL2aMJKDwiaY3OcvdqBFurtYfOpSa4QrNyDxmOGRFSYzUpabU2m9QrlWE7w==",
+ "requires": {
+ "chalk": "2.3.0",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.36.tgz",
+ "integrity": "sha512-/SGPOyifPf20iTrMN+WdlY2MbKa7/o4j7B/4IAsdOusASp2icT+Wcdjf4tjJHaXNX8Pe9bpgVxLNxhRvcf8E5w==",
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.36",
+ "@babel/template": "7.0.0-beta.36",
+ "@babel/types": "7.0.0-beta.36"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.36.tgz",
+ "integrity": "sha512-vPPcx2vsSoDbcyWr9S3nd0FM3B4hEXnt0p1oKpwa08GwK0fSRxa98MyaRGf8suk8frdQlG1P3mDrz5p/Rr3pbA==",
+ "requires": {
+ "@babel/types": "7.0.0-beta.36"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.36.tgz",
+ "integrity": "sha512-mUBi90WRyZ9iVvlWLEdeo8gn/tROyJdjKNC4W5xJTSZL+9MS89rTJSqiaJKXIkxk/YRDL/g/8snrG/O0xl33uA==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.36",
+ "@babel/types": "7.0.0-beta.36",
+ "babylon": "7.0.0-beta.36",
+ "lodash": "4.17.4"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz",
+ "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ=="
+ }
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.36.tgz",
+ "integrity": "sha512-OTUb6iSKVR/98dGThRJ1BiyfwbuX10BVnkz89IpaerjTPRhDfMBfLsqmzxz5MiywUOW4M0Clta0o7rSxkfcuzw==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.36",
+ "@babel/helper-function-name": "7.0.0-beta.36",
+ "@babel/types": "7.0.0-beta.36",
+ "babylon": "7.0.0-beta.36",
+ "debug": "3.1.0",
+ "globals": "11.1.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz",
+ "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ=="
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz",
+ "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ=="
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.36.tgz",
+ "integrity": "sha512-PyAORDO9um9tfnrddXgmWN9e6Sq9qxraQIt5ynqBOSXKA5qvK1kUr+Q3nSzKFdzorsiK+oqcUnAFvEoKxv9D+Q==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@types/jss": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.3.0.tgz",
+ "integrity": "sha512-n7MUYCO/Wt4d6Yj0ZewXSSkqBcrdLFgpQ4mUBRXBWDmLfXtgT3tJ26GVPr8HiyRLLze6iQfaBJTlvjRTjgZpRg=="
+ },
+ "@types/react": {
+ "version": "16.0.34",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.34.tgz",
+ "integrity": "sha512-Ee66fX2qMsDnDq7sPnDtq1bGoo479j6Fo1BlSnne+L5rp6ndzBUgz72+MRNuN56zg9uuteRCkJAMdDJEX2Uqig=="
+ },
+ "@types/react-transition-group": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.6.tgz",
+ "integrity": "sha512-mVhRv+d0MIoLWl6hEFA7Nnd/obW2RQpZViTAKhM37mltuTDWCdoj8xAZv94ntB8wgAc6DDiDCXxFXPgClGnsfQ==",
+ "requires": {
+ "@types/react": "16.0.34"
+ }
+ },
+ "acorn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz",
+ "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug=="
+ },
+ "acorn-dynamic-import": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+ "requires": {
+ "acorn": "4.0.13"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+ }
+ }
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "alphanum-sort": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+ },
+ "ansi-escapes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
+ "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ=="
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "aria-query": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.0.tgz",
+ "integrity": "sha512-/r2lHl09V3o74+2MLKEdewoj37YZqiQZnfen1O4iNlrOjUgeKuu1U2yF3iKh6HJxqF+OXkLMfQv65Z/cvxD6vA==",
+ "requires": {
+ "ast-types-flow": "0.0.7"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "array-includes": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+ "requires": {
+ "define-properties": "1.1.2",
+ "es-abstract": "1.10.0"
+ }
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
+ },
+ "asn1.js": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz",
+ "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "requires": {
+ "util": "0.10.3"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "autoprefixer": {
+ "version": "6.7.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+ "requires": {
+ "browserslist": "1.7.7",
+ "caniuse-db": "1.0.30000793",
+ "normalize-range": "0.1.2",
+ "num2fraction": "1.2.2",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "browserslist": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+ "requires": {
+ "caniuse-db": "1.0.30000793",
+ "electron-to-chromium": "1.3.31"
+ }
+ }
+ }
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
+ },
+ "axobject-query": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz",
+ "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=",
+ "requires": {
+ "ast-types-flow": "0.0.7"
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.0",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "babel-eslint": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.1.tgz",
+ "integrity": "sha512-RzdVOyWKQRUnLXhwLk+eKb4oyW+BykZSkpYwFhM4tnfzAG5OWfvG0w/uyzMp5XKEU0jN82+JefHr39bG2+KhRQ==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.36",
+ "@babel/traverse": "7.0.0-beta.36",
+ "@babel/types": "7.0.0-beta.36",
+ "babylon": "7.0.0-beta.36",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.36",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz",
+ "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ=="
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.4",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "babel-helper-bindify-decorators": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
+ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "requires": {
+ "babel-helper-explode-assignable-expression": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-builder-react-jsx": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
+ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-explode-class": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
+ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+ "requires": {
+ "babel-helper-bindify-decorators": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-loader": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz",
+ "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==",
+ "requires": {
+ "find-cache-dir": "1.0.0",
+ "loader-utils": "1.1.0",
+ "mkdirp": "0.5.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU="
+ },
+ "babel-plugin-syntax-async-generators": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o="
+ },
+ "babel-plugin-syntax-class-constructor-call": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
+ "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY="
+ },
+ "babel-plugin-syntax-class-properties": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+ "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94="
+ },
+ "babel-plugin-syntax-decorators": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+ "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs="
+ },
+ "babel-plugin-syntax-do-expressions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz",
+ "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0="
+ },
+ "babel-plugin-syntax-dynamic-import": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+ "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo="
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4="
+ },
+ "babel-plugin-syntax-export-extensions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+ "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE="
+ },
+ "babel-plugin-syntax-flow": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
+ "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0="
+ },
+ "babel-plugin-syntax-function-bind": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz",
+ "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y="
+ },
+ "babel-plugin-syntax-jsx": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+ "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+ },
+ "babel-plugin-syntax-object-rest-spread": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+ },
+ "babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM="
+ },
+ "babel-plugin-transform-async-generator-functions": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-generators": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-class-constructor-call": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
+ "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
+ "requires": {
+ "babel-plugin-syntax-class-constructor-call": "6.18.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-class-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-plugin-syntax-class-properties": "6.13.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-decorators": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
+ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+ "requires": {
+ "babel-helper-explode-class": "6.24.1",
+ "babel-plugin-syntax-decorators": "6.13.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-decorators-legacy": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz",
+ "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=",
+ "requires": {
+ "babel-plugin-syntax-decorators": "6.13.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-do-expressions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz",
+ "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=",
+ "requires": {
+ "babel-plugin-syntax-do-expressions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-export-extensions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
+ "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
+ "requires": {
+ "babel-plugin-syntax-export-extensions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-flow-strip-types": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
+ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
+ "requires": {
+ "babel-plugin-syntax-flow": "6.18.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-function-bind": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz",
+ "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=",
+ "requires": {
+ "babel-plugin-syntax-function-bind": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-object-rest-spread": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+ "requires": {
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-react-display-name": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
+ "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-react-jsx": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
+ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+ "requires": {
+ "babel-helper-builder-react-jsx": "6.26.0",
+ "babel-plugin-syntax-jsx": "6.18.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-react-jsx-self": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
+ "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
+ "requires": {
+ "babel-plugin-syntax-jsx": "6.18.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-react-jsx-source": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
+ "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
+ "requires": {
+ "babel-plugin-syntax-jsx": "6.18.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-runtime": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
+ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+ }
+ }
+ },
+ "babel-preset-env": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz",
+ "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==",
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+ "babel-plugin-transform-async-to-generator": "6.24.1",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-exponentiation-operator": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0",
+ "browserslist": "2.11.3",
+ "invariant": "2.2.2",
+ "semver": "5.5.0"
+ }
+ },
+ "babel-preset-flow": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
+ "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
+ "requires": {
+ "babel-plugin-transform-flow-strip-types": "6.22.0"
+ }
+ },
+ "babel-preset-react": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
+ "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
+ "requires": {
+ "babel-plugin-syntax-jsx": "6.18.0",
+ "babel-plugin-transform-react-display-name": "6.25.0",
+ "babel-plugin-transform-react-jsx": "6.24.1",
+ "babel-plugin-transform-react-jsx-self": "6.22.0",
+ "babel-plugin-transform-react-jsx-source": "6.22.0",
+ "babel-preset-flow": "6.23.0"
+ }
+ },
+ "babel-preset-stage-0": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz",
+ "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=",
+ "requires": {
+ "babel-plugin-transform-do-expressions": "6.22.0",
+ "babel-plugin-transform-function-bind": "6.22.0",
+ "babel-preset-stage-1": "6.24.1"
+ }
+ },
+ "babel-preset-stage-1": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
+ "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
+ "requires": {
+ "babel-plugin-transform-class-constructor-call": "6.24.1",
+ "babel-plugin-transform-export-extensions": "6.22.0",
+ "babel-preset-stage-2": "6.24.1"
+ }
+ },
+ "babel-preset-stage-2": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
+ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+ "requires": {
+ "babel-plugin-syntax-dynamic-import": "6.18.0",
+ "babel-plugin-transform-class-properties": "6.24.1",
+ "babel-plugin-transform-decorators": "6.24.1",
+ "babel-preset-stage-3": "6.24.1"
+ }
+ },
+ "babel-preset-stage-3": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
+ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+ "requires": {
+ "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+ "babel-plugin-transform-async-generator-functions": "6.24.1",
+ "babel-plugin-transform-async-to-generator": "6.24.1",
+ "babel-plugin-transform-exponentiation-operator": "6.24.1",
+ "babel-plugin-transform-object-rest-spread": "6.26.0"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.4",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base64-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
+ "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw=="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "big.js": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
+ },
+ "binary": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
+ "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
+ "requires": {
+ "buffers": "0.1.1",
+ "chainsaw": "0.1.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "brcast": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz",
+ "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg=="
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "browserify-aes": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
+ "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==",
+ "requires": {
+ "buffer-xor": "1.0.3",
+ "cipher-base": "1.0.4",
+ "create-hash": "1.1.3",
+ "evp_bytestokey": "1.0.3",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
+ "requires": {
+ "browserify-aes": "1.1.1",
+ "browserify-des": "1.0.0",
+ "evp_bytestokey": "1.0.3"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+ "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "des.js": "1.0.0",
+ "inherits": "2.0.3"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "randombytes": "2.0.6"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.1.3",
+ "create-hmac": "1.1.6",
+ "elliptic": "6.4.0",
+ "inherits": "2.0.3",
+ "parse-asn1": "5.1.0"
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "requires": {
+ "pako": "1.0.6"
+ }
+ },
+ "browserslist": {
+ "version": "2.11.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+ "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+ "requires": {
+ "caniuse-lite": "1.0.30000792",
+ "electron-to-chromium": "1.3.31"
+ }
+ },
+ "buffer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "requires": {
+ "base64-js": "1.2.1",
+ "ieee754": "1.1.8",
+ "isarray": "1.0.0"
+ }
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ },
+ "buffers": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
+ "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
+ },
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ },
+ "caniuse-api": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
+ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+ "requires": {
+ "browserslist": "1.7.7",
+ "caniuse-db": "1.0.30000793",
+ "lodash.memoize": "4.1.2",
+ "lodash.uniq": "4.5.0"
+ },
+ "dependencies": {
+ "browserslist": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+ "requires": {
+ "caniuse-db": "1.0.30000793",
+ "electron-to-chromium": "1.3.31"
+ }
+ }
+ }
+ },
+ "caniuse-db": {
+ "version": "1.0.30000793",
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000793.tgz",
+ "integrity": "sha1-PADGbkI6ehkHx92Wdpp4sq+opy4="
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000792",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz",
+ "integrity": "sha1-0M6pgfgRjzlhRxr7tDyaHlu/AzI="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chain-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz",
+ "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w="
+ },
+ "chainsaw": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
+ "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
+ "requires": {
+ "traverse": "0.3.9"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "change-emitter": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",
+ "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU="
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+ },
+ "child-process": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/child-process/-/child-process-1.0.2.tgz",
+ "integrity": "sha1-mJdNx+0e5MYin44wX6cxOmiFp/I="
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.1.3",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
+ },
+ "clap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
+ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
+ "requires": {
+ "chalk": "1.1.3"
+ }
+ },
+ "classnames": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz",
+ "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0="
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8="
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "coa": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
+ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ },
+ "color": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+ "requires": {
+ "clone": "1.0.3",
+ "color-convert": "1.9.1",
+ "color-string": "0.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "color-string": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "colormin": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
+ "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+ "requires": {
+ "color": "0.11.4",
+ "css-color-names": "0.0.4",
+ "has": "1.0.1"
+ }
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "typedarray": "0.0.6"
+ }
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "requires": {
+ "date-now": "0.1.4"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "create-ecdh": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+ "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "elliptic": "6.4.0"
+ }
+ },
+ "create-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
+ "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.1",
+ "sha.js": "2.4.10"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
+ "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
+ "requires": {
+ "cipher-base": "1.0.4",
+ "create-hash": "1.1.3",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.1",
+ "safe-buffer": "5.1.1",
+ "sha.js": "2.4.10"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ }
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "requires": {
+ "browserify-cipher": "1.0.0",
+ "browserify-sign": "4.0.4",
+ "create-ecdh": "4.0.0",
+ "create-hash": "1.1.3",
+ "create-hmac": "1.1.6",
+ "diffie-hellman": "5.0.2",
+ "inherits": "2.0.3",
+ "pbkdf2": "3.0.14",
+ "public-encrypt": "4.0.0",
+ "randombytes": "2.0.6",
+ "randomfill": "1.0.3"
+ }
+ },
+ "css-color-names": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+ },
+ "css-loader": {
+ "version": "0.28.9",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.9.tgz",
+ "integrity": "sha512-r3dgelMm/mkPz5Y7m9SeiGE46i2VsEU/OYbez+1llfxtv8b2y5/b5StaeEvPK3S5tlNQI+tDW/xDIhKJoZgDtw==",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "css-selector-tokenizer": "0.7.0",
+ "cssnano": "3.10.0",
+ "icss-utils": "2.1.0",
+ "loader-utils": "1.1.0",
+ "lodash.camelcase": "4.3.0",
+ "object-assign": "4.1.1",
+ "postcss": "5.2.18",
+ "postcss-modules-extract-imports": "1.2.0",
+ "postcss-modules-local-by-default": "1.2.0",
+ "postcss-modules-scope": "1.1.0",
+ "postcss-modules-values": "1.3.0",
+ "postcss-value-parser": "3.3.0",
+ "source-list-map": "2.0.0"
+ }
+ },
+ "css-selector-tokenizer": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
+ "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+ "requires": {
+ "cssesc": "0.1.0",
+ "fastparse": "1.1.1",
+ "regexpu-core": "1.0.0"
+ },
+ "dependencies": {
+ "regexpu-core": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ }
+ }
+ },
+ "css-vendor": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz",
+ "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=",
+ "requires": {
+ "is-in-browser": "1.1.3"
+ }
+ },
+ "cssesc": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q="
+ },
+ "cssnano": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
+ "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+ "requires": {
+ "autoprefixer": "6.7.7",
+ "decamelize": "1.2.0",
+ "defined": "1.0.0",
+ "has": "1.0.1",
+ "object-assign": "4.1.1",
+ "postcss": "5.2.18",
+ "postcss-calc": "5.3.1",
+ "postcss-colormin": "2.2.2",
+ "postcss-convert-values": "2.6.1",
+ "postcss-discard-comments": "2.0.4",
+ "postcss-discard-duplicates": "2.1.0",
+ "postcss-discard-empty": "2.1.0",
+ "postcss-discard-overridden": "0.1.1",
+ "postcss-discard-unused": "2.2.3",
+ "postcss-filter-plugins": "2.0.2",
+ "postcss-merge-idents": "2.1.7",
+ "postcss-merge-longhand": "2.0.2",
+ "postcss-merge-rules": "2.1.2",
+ "postcss-minify-font-values": "1.0.5",
+ "postcss-minify-gradients": "1.0.5",
+ "postcss-minify-params": "1.2.2",
+ "postcss-minify-selectors": "2.1.1",
+ "postcss-normalize-charset": "1.1.1",
+ "postcss-normalize-url": "3.0.8",
+ "postcss-ordered-values": "2.2.3",
+ "postcss-reduce-idents": "2.4.0",
+ "postcss-reduce-initial": "1.0.1",
+ "postcss-reduce-transforms": "1.0.4",
+ "postcss-svgo": "2.1.6",
+ "postcss-unique-selectors": "2.0.2",
+ "postcss-value-parser": "3.3.0",
+ "postcss-zindex": "2.2.0"
+ }
+ },
+ "csso": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
+ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+ "requires": {
+ "clap": "1.2.3",
+ "source-map": "0.5.7"
+ }
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "requires": {
+ "es5-ext": "0.10.38"
+ }
+ },
+ "d3-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz",
+ "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw=="
+ },
+ "d3-collection": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz",
+ "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI="
+ },
+ "d3-color": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz",
+ "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs="
+ },
+ "d3-format": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz",
+ "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw=="
+ },
+ "d3-interpolate": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz",
+ "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==",
+ "requires": {
+ "d3-color": "1.0.3"
+ }
+ },
+ "d3-path": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz",
+ "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q="
+ },
+ "d3-scale": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz",
+ "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=",
+ "requires": {
+ "d3-array": "1.2.1",
+ "d3-collection": "1.0.4",
+ "d3-color": "1.0.3",
+ "d3-format": "1.2.2",
+ "d3-interpolate": "1.1.6",
+ "d3-time": "1.0.8",
+ "d3-time-format": "2.1.1"
+ }
+ },
+ "d3-shape": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz",
+ "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=",
+ "requires": {
+ "d3-path": "1.0.5"
+ }
+ },
+ "d3-time": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz",
+ "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ=="
+ },
+ "d3-time-format": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz",
+ "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==",
+ "requires": {
+ "d3-time": "1.0.8"
+ }
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz",
+ "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ="
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "decompress-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "requires": {
+ "mimic-response": "1.0.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "deepmerge": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz",
+ "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ=="
+ },
+ "define-properties": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+ "requires": {
+ "foreach": "2.0.5",
+ "object-keys": "1.0.11"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "diffie-hellman": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
+ "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "miller-rabin": "4.0.1",
+ "randombytes": "2.0.6"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-helpers": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz",
+ "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg=="
+ },
+ "dom-walk": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
+ "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg="
+ },
+ "domain-browser": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
+ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw="
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.3.31",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz",
+ "integrity": "sha512-XE4CLbswkZgZFn34cKFy1xaX+F5LHxeDLjY1+rsK9asDzknhbrd9g/n/01/acbU25KTsUSiLKwvlLyA+6XLUOA=="
+ },
+ "elliptic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0",
+ "hash.js": "1.1.3",
+ "hmac-drbg": "1.0.1",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "emoji-regex": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz",
+ "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ=="
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+ },
+ "encoding": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+ "requires": {
+ "iconv-lite": "0.4.19"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "memory-fs": "0.4.1",
+ "object-assign": "4.1.1",
+ "tapable": "0.2.8"
+ }
+ },
+ "errno": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz",
+ "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==",
+ "requires": {
+ "prr": "1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz",
+ "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==",
+ "requires": {
+ "es-to-primitive": "1.1.1",
+ "function-bind": "1.1.1",
+ "has": "1.0.1",
+ "is-callable": "1.1.3",
+ "is-regex": "1.0.4"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+ "requires": {
+ "is-callable": "1.1.3",
+ "is-date-object": "1.0.1",
+ "is-symbol": "1.0.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.38",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz",
+ "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==",
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-set": "0.1.5",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "0.3.5"
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "0.3.5"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escope": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+ "requires": {
+ "es6-map": "0.1.5",
+ "es6-weak-map": "2.0.2",
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint": {
+ "version": "4.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz",
+ "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==",
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.0",
+ "concat-stream": "1.6.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.2",
+ "esquery": "1.0.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.1.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.10.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+ },
+ "globals": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz",
+ "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ=="
+ },
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-airbnb": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz",
+ "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==",
+ "requires": {
+ "eslint-config-airbnb-base": "12.1.0"
+ }
+ },
+ "eslint-config-airbnb-base": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz",
+ "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==",
+ "requires": {
+ "eslint-restricted-globals": "0.1.1"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "requires": {
+ "debug": "2.6.9",
+ "resolve": "1.5.0"
+ }
+ },
+ "eslint-loader": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz",
+ "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==",
+ "requires": {
+ "loader-fs-cache": "1.0.1",
+ "loader-utils": "1.1.0",
+ "object-assign": "4.1.1",
+ "object-hash": "1.2.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz",
+ "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==",
+ "requires": {
+ "debug": "2.6.9",
+ "pkg-dir": "1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+ "requires": {
+ "find-up": "1.1.2"
+ }
+ }
+ }
+ },
+ "eslint-plugin-flowtype": {
+ "version": "2.41.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.41.0.tgz",
+ "integrity": "sha512-M5X6qu/zvvXQ7flXp9plyBRlNRMQGNl3c+kQmox+m/jpnCZt0txgauxcrBKAVa9LKE/hBnsItJ9BojdmkefAkA==",
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz",
+ "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==",
+ "requires": {
+ "builtin-modules": "1.1.1",
+ "contains-path": "0.1.0",
+ "debug": "2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "0.3.2",
+ "eslint-module-utils": "2.1.1",
+ "has": "1.0.1",
+ "lodash.cond": "4.5.2",
+ "minimatch": "3.0.4",
+ "read-pkg-up": "2.0.0"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "requires": {
+ "esutils": "2.0.2",
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz",
+ "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=",
+ "requires": {
+ "aria-query": "0.7.0",
+ "array-includes": "3.0.3",
+ "ast-types-flow": "0.0.7",
+ "axobject-query": "0.1.0",
+ "damerau-levenshtein": "1.0.4",
+ "emoji-regex": "6.5.1",
+ "jsx-ast-utils": "2.0.1"
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz",
+ "integrity": "sha512-YGSjB9Qu6QbVTroUZi66pYky3DfoIPLdHQ/wmrBGyBRnwxQsBXAov9j2rpXt/55i8nyMv6IRWJv2s4d4YnduzQ==",
+ "requires": {
+ "doctrine": "2.1.0",
+ "has": "1.0.1",
+ "jsx-ast-utils": "2.0.1",
+ "prop-types": "15.6.0"
+ }
+ },
+ "eslint-restricted-globals": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz",
+ "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc="
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "requires": {
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
+ },
+ "espree": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
+ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
+ "requires": {
+ "acorn": "5.3.0",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "requires": {
+ "estraverse": "4.2.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "events": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "requires": {
+ "md5.js": "1.3.4",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "requires": {
+ "fill-range": "2.2.3"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "fastparse": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+ "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg="
+ },
+ "fbjs": {
+ "version": "0.8.16",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz",
+ "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=",
+ "requires": {
+ "core-js": "1.2.7",
+ "isomorphic-fetch": "2.2.1",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1",
+ "promise": "7.3.1",
+ "setimmediate": "1.0.5",
+ "ua-parser-js": "0.7.17"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+ "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+ }
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "file-loader": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.6.tgz",
+ "integrity": "sha512-873ztuL+/hfvXbLDJ262PGO6XjERnybJu2gW1/5j8HUfxSiFJI9Hj/DhZ50ZGRUxBvuNiazb/cM2rh9pqrxP6Q==",
+ "requires": {
+ "loader-utils": "1.1.0",
+ "schema-utils": "0.3.0"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+ "requires": {
+ "commondir": "1.0.1",
+ "make-dir": "1.1.0",
+ "pkg-dir": "2.0.0"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ }
+ },
+ "flatten": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I="
+ },
+ "flow-bin": {
+ "version": "0.63.1",
+ "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.63.1.tgz",
+ "integrity": "sha512-aWKHYs3UECgpwrIDVUiABjSC8dgaKmonymQDWO+6FhGcp9lnnxdDBE6Sfm3F7YaRPfLYsWAY4lndBrfrfyn+9g=="
+ },
+ "flow-bin-loader": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/flow-bin-loader/-/flow-bin-loader-1.0.2.tgz",
+ "integrity": "sha1-5c6CL/S51tXYJnAk21OnaYNIC+M=",
+ "requires": {
+ "child-process": "1.0.2"
+ }
+ },
+ "flow-typed": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/flow-typed/-/flow-typed-2.2.3.tgz",
+ "integrity": "sha512-xCKOrKn/DnA4BPbNKyp3s2vW7Pzvff1zJhEdzNviTgwpiEkTG6uxQLjofcqvKdzTyZ/PjHBzkx02iyhP/2NrCg==",
+ "requires": {
+ "babel-polyfill": "6.26.0",
+ "colors": "1.1.2",
+ "fs-extra": "4.0.3",
+ "github": "0.2.4",
+ "glob": "7.1.2",
+ "got": "7.1.0",
+ "md5": "2.2.1",
+ "mkdirp": "0.5.1",
+ "request": "2.83.0",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "table": "4.0.2",
+ "through": "2.3.8",
+ "unzip": "0.1.11",
+ "which": "1.3.0",
+ "yargs": "4.8.1"
+ }
+ },
+ "font-awesome": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
+ "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "form-data": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
+ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.17"
+ }
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+ "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+ "optional": true,
+ "requires": {
+ "nan": "2.8.0",
+ "node-pre-gyp": "0.6.39"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.0",
+ "bundled": true,
+ "optional": true
+ },
+ "ajv": {
+ "version": "4.11.8",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "aproba": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.2.9"
+ }
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "bundled": true,
+ "optional": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "bundled": true,
+ "optional": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "bundled": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "bundled": true,
+ "optional": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "bundled": true,
+ "optional": true
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "bundled": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "bundled": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.7",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "0.4.2",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-shims": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "bundled": true,
+ "optional": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "bundled": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "bundled": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "bundled": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "optional": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "bundled": true,
+ "optional": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.15"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.1"
+ }
+ },
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "fstream": "1.0.11",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.1.1",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "bundled": true
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "bundled": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "bundled": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "bundled": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.0",
+ "sshpk": "1.13.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "ini": {
+ "version": "1.3.4",
+ "bundled": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "bundled": true,
+ "optional": true
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "bundled": true,
+ "optional": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.0.2",
+ "json-schema": "0.2.3",
+ "verror": "1.3.6"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "mime-db": {
+ "version": "1.27.0",
+ "bundled": true
+ },
+ "mime-types": {
+ "version": "2.1.15",
+ "bundled": true,
+ "requires": {
+ "mime-db": "1.27.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "node-pre-gyp": {
+ "version": "0.6.39",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.2",
+ "hawk": "3.1.3",
+ "mkdirp": "0.5.1",
+ "nopt": "4.0.1",
+ "npmlog": "4.1.0",
+ "rc": "1.2.1",
+ "request": "2.81.0",
+ "rimraf": "2.6.1",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "tar-pack": "3.4.0"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.0",
+ "osenv": "0.1.4"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "bundled": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "bundled": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "bundled": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "bundled": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.4.0",
+ "bundled": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.4",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.2.9",
+ "bundled": true,
+ "requires": {
+ "buffer-shims": "1.0.0",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "1.0.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.81.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "4.2.1",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.15",
+ "oauth-sign": "0.8.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.0.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.2",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.0.1",
+ "bundled": true
+ },
+ "semver": {
+ "version": "5.3.0",
+ "bundled": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "bundled": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "sshpk": {
+ "version": "1.13.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jodid25519": "1.0.2",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "bundled": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "2.2.1",
+ "bundled": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "tar-pack": {
+ "version": "3.4.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.8",
+ "fstream": "1.0.11",
+ "fstream-ignore": "1.0.5",
+ "once": "1.4.0",
+ "readable-stream": "2.2.9",
+ "rimraf": "2.6.1",
+ "tar": "2.2.1",
+ "uid-number": "0.0.6"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "bundled": true,
+ "optional": true
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "bundled": true,
+ "optional": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "verror": {
+ "version": "1.3.6",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "extsprintf": "1.0.2"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "fstream": {
+ "version": "0.1.31",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz",
+ "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=",
+ "requires": {
+ "graceful-fs": "3.0.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "requires": {
+ "natives": "1.1.1"
+ }
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "github": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz",
+ "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=",
+ "requires": {
+ "mime": "1.6.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "global": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
+ "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
+ "requires": {
+ "min-document": "2.19.0",
+ "process": "0.5.2"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "got": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+ "requires": {
+ "decompress-response": "3.3.0",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-plain-obj": "1.1.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "isurl": "1.0.0",
+ "lowercase-keys": "1.0.0",
+ "p-cancelable": "0.3.0",
+ "p-timeout": "1.2.1",
+ "safe-buffer": "5.1.1",
+ "timed-out": "4.0.1",
+ "url-parse-lax": "1.0.0",
+ "url-to-options": "1.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+ },
+ "has-symbol-support-x": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz",
+ "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA=="
+ },
+ "has-to-string-tag-x": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+ "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+ "requires": {
+ "has-symbol-support-x": "1.4.1"
+ }
+ },
+ "hash-base": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+ "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.0",
+ "sntp": "2.1.0"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "requires": {
+ "hash.js": "1.1.3",
+ "minimalistic-assert": "1.0.0",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "hoek": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
+ "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ=="
+ },
+ "hoist-non-react-statics": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz",
+ "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA="
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
+ },
+ "html-comment-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
+ "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4="
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0="
+ },
+ "icss-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+ "requires": {
+ "postcss": "6.0.16"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz",
+ "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==",
+ "requires": {
+ "chalk": "2.3.0",
+ "source-map": "0.6.1",
+ "supports-color": "5.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+ "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "ieee754": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
+ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q="
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA=="
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "requires": {
+ "ansi-escapes": "3.0.0",
+ "chalk": "2.3.0",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.1.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.4",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ },
+ "is-absolute-url": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-callable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
+ "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI="
+ },
+ "is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "is-function": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
+ "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU="
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-in-browser": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
+ "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
+ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "requires": {
+ "has": "1.0.1"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-svg": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
+ "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
+ "requires": {
+ "html-comment-regex": "1.1.1"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI="
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "isomorphic-fetch": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+ "requires": {
+ "node-fetch": "1.7.3",
+ "whatwg-fetch": "2.0.3"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "isurl": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+ "requires": {
+ "has-to-string-tag-x": "1.4.1",
+ "is-object": "1.0.1"
+ }
+ },
+ "js-base64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.1.tgz",
+ "integrity": "sha512-2h586r2I/CqU7z1aa1kBgWaVAXWAZK+zHnceGi/jFgn7+7VSluxYer/i3xOZVearCxxXvyDkLtTBo+OeJCA3kA=="
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "js-yaml": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
+ "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "2.7.3"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "optional": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+ },
+ "json-loader": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
+ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w=="
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "jss": {
+ "version": "9.5.1",
+ "resolved": "https://registry.npmjs.org/jss/-/jss-9.5.1.tgz",
+ "integrity": "sha512-py//ogG1xeztpEDmosJtrkfUXibx3qiAr+1GQvfLHp7azpqkzTPLCnainDgH7Zn0q6S7rcM1eINrVT9n/r5f2w==",
+ "requires": {
+ "is-in-browser": "1.1.3",
+ "symbol-observable": "1.1.0",
+ "warning": "3.0.0"
+ }
+ },
+ "jss-camel-case": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.0.0.tgz",
+ "integrity": "sha512-XAYa7JpGkLdlLgEfuzSQSVONRzSVvv4Tvyv5H8hLmJuHeFHTWwVrJrW1Cg/buED3izXKwTU2KBGpeXjIR5Eaew=="
+ },
+ "jss-compose": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/jss-compose/-/jss-compose-5.0.0.tgz",
+ "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==",
+ "requires": {
+ "warning": "3.0.0"
+ }
+ },
+ "jss-default-unit": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz",
+ "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg=="
+ },
+ "jss-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/jss-expand/-/jss-expand-5.1.0.tgz",
+ "integrity": "sha512-WTxmNipgj0V8kr8gc8Gc6Et7uQZH60H7FFNG9zZHjR6TPJoj7TDK+/EBxwRHtCRQD4B8RTwoa7MyEKD4ReKfXw=="
+ },
+ "jss-extend": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jss-extend/-/jss-extend-6.1.0.tgz",
+ "integrity": "sha512-bSNwLDOZnMxABsUqvq2lwLJ/MMFs8ThligiLZBOUeyoZCoHqAbcTghvunk2QDVxiOhRTDS57VvhXVJZETW58Bw==",
+ "requires": {
+ "warning": "3.0.0"
+ }
+ },
+ "jss-global": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz",
+ "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q=="
+ },
+ "jss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz",
+ "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==",
+ "requires": {
+ "warning": "3.0.0"
+ }
+ },
+ "jss-preset-default": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-4.1.0.tgz",
+ "integrity": "sha512-C6SyfDg99EFrt0bv0lsg2OEN3e72Fry9/hMPW2sO6MSVsx+vc/Og6TJJY3F2MY5Z/V2/wlARHVmCb3TYMr0zFA==",
+ "requires": {
+ "jss-camel-case": "6.0.0",
+ "jss-compose": "5.0.0",
+ "jss-default-unit": "8.0.2",
+ "jss-expand": "5.1.0",
+ "jss-extend": "6.1.0",
+ "jss-global": "3.0.0",
+ "jss-nested": "6.0.1",
+ "jss-props-sort": "6.0.0",
+ "jss-template": "1.0.1",
+ "jss-vendor-prefixer": "7.0.0"
+ }
+ },
+ "jss-props-sort": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz",
+ "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g=="
+ },
+ "jss-template": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/jss-template/-/jss-template-1.0.1.tgz",
+ "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==",
+ "requires": {
+ "warning": "3.0.0"
+ }
+ },
+ "jss-vendor-prefixer": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz",
+ "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==",
+ "requires": {
+ "css-vendor": "0.3.8"
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz",
+ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=",
+ "requires": {
+ "array-includes": "3.0.3"
+ }
+ },
+ "keycode": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz",
+ "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo="
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "loader-fs-cache": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz",
+ "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=",
+ "requires": {
+ "find-cache-dir": "0.1.1",
+ "mkdirp": "0.5.1"
+ },
+ "dependencies": {
+ "find-cache-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+ "requires": {
+ "commondir": "1.0.1",
+ "mkdirp": "0.5.1",
+ "pkg-dir": "1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+ "requires": {
+ "find-up": "1.1.2"
+ }
+ }
+ }
+ },
+ "loader-runner": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
+ "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI="
+ },
+ "loader-utils": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+ "requires": {
+ "big.js": "3.2.0",
+ "emojis-list": "2.1.0",
+ "json5": "0.5.1"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+ },
+ "lodash.cond": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz",
+ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU="
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
+ },
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "macaddress": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz",
+ "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI="
+ },
+ "make-dir": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz",
+ "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "match-stream": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz",
+ "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=",
+ "requires": {
+ "buffers": "0.1.1",
+ "readable-stream": "1.0.34"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "material-ui": {
+ "version": "1.0.0-beta.30",
+ "resolved": "https://registry.npmjs.org/material-ui/-/material-ui-1.0.0-beta.30.tgz",
+ "integrity": "sha512-cgUUYf+sXjkUQmImjngHPmwo6kBIfvZKrNxmp56cpATYyaeoBydfERwv9SfUu1zzJyXLhJ6tt17XeUBn8aSqug==",
+ "requires": {
+ "@types/jss": "9.3.0",
+ "@types/react-transition-group": "2.0.6",
+ "babel-runtime": "6.26.0",
+ "brcast": "3.0.1",
+ "classnames": "2.2.5",
+ "deepmerge": "2.0.1",
+ "dom-helpers": "3.3.1",
+ "hoist-non-react-statics": "2.3.1",
+ "jss": "9.5.1",
+ "jss-camel-case": "6.0.0",
+ "jss-default-unit": "8.0.2",
+ "jss-global": "3.0.0",
+ "jss-nested": "6.0.1",
+ "jss-props-sort": "6.0.0",
+ "jss-vendor-prefixer": "7.0.0",
+ "keycode": "2.1.9",
+ "lodash": "4.17.4",
+ "normalize-scroll-left": "0.1.2",
+ "prop-types": "15.6.0",
+ "react-event-listener": "0.5.3",
+ "react-jss": "8.2.1",
+ "react-popper": "0.7.5",
+ "react-scrollbar-size": "2.0.2",
+ "react-transition-group": "2.2.1",
+ "recompose": "0.26.0",
+ "scroll": "2.0.1",
+ "warning": "3.0.0"
+ }
+ },
+ "material-ui-icons": {
+ "version": "1.0.0-beta.17",
+ "resolved": "https://registry.npmjs.org/material-ui-icons/-/material-ui-icons-1.0.0-beta.17.tgz",
+ "integrity": "sha1-XxmvVKLZnu7zR6VUFKaFPhyFDcM=",
+ "requires": {
+ "recompose": "0.26.0"
+ }
+ },
+ "math-expression-evaluator": {
+ "version": "1.2.17",
+ "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
+ "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw="
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.6"
+ }
+ },
+ "md5.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ },
+ "dependencies": {
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "requires": {
+ "errno": "0.1.6",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
+ "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
+ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg="
+ },
+ "mimic-response": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz",
+ "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4="
+ },
+ "min-document": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+ "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+ "requires": {
+ "dom-walk": "0.1.1"
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+ "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M="
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "nan": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
+ "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
+ "optional": true
+ },
+ "natives": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
+ "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "node-fetch": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+ "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "requires": {
+ "encoding": "0.1.12",
+ "is-stream": "1.1.0"
+ }
+ },
+ "node-libs-browser": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
+ "requires": {
+ "assert": "1.4.1",
+ "browserify-zlib": "0.2.0",
+ "buffer": "4.9.1",
+ "console-browserify": "1.1.0",
+ "constants-browserify": "1.0.0",
+ "crypto-browserify": "3.12.0",
+ "domain-browser": "1.1.7",
+ "events": "1.1.1",
+ "https-browserify": "1.0.0",
+ "os-browserify": "0.3.0",
+ "path-browserify": "0.0.0",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "readable-stream": "2.3.3",
+ "stream-browserify": "2.0.1",
+ "stream-http": "2.8.0",
+ "string_decoder": "1.0.3",
+ "timers-browserify": "2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "0.11.0",
+ "util": "0.10.3",
+ "vm-browserify": "0.0.4"
+ },
+ "dependencies": {
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ }
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+ },
+ "normalize-scroll-left": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz",
+ "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg=="
+ },
+ "normalize-url": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+ "requires": {
+ "object-assign": "4.1.1",
+ "prepend-http": "1.0.4",
+ "query-string": "4.3.4",
+ "sort-keys": "1.1.2"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.2.0.tgz",
+ "integrity": "sha512-smRWXzkvxw72VquyZ0wggySl7PFUtoDhvhpdwgESXxUrH7vVhhp9asfup1+rVLrhsl7L45Ee1Q/l5R2Ul4MwUg=="
+ },
+ "object-keys": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+ "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0="
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "requires": {
+ "lcid": "1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "over": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz",
+ "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg="
+ },
+ "p-cancelable": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
+ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-timeout": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
+ "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
+ "requires": {
+ "p-finally": "1.0.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "pako": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="
+ },
+ "parse-asn1": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
+ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
+ "requires": {
+ "asn1.js": "4.9.2",
+ "browserify-aes": "1.1.1",
+ "create-hash": "1.1.3",
+ "evp_bytestokey": "1.0.3",
+ "pbkdf2": "3.0.14"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "path": {
+ "version": "0.12.7",
+ "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
+ "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
+ "requires": {
+ "process": "0.11.10",
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ }
+ }
+ },
+ "path-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo="
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "2.3.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "pbkdf2": {
+ "version": "3.0.14",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz",
+ "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==",
+ "requires": {
+ "create-hash": "1.1.3",
+ "create-hmac": "1.1.6",
+ "ripemd160": "2.0.1",
+ "safe-buffer": "5.1.1",
+ "sha.js": "2.4.10"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "requires": {
+ "find-up": "2.1.0"
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+ },
+ "popper.js": {
+ "version": "1.12.9",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz",
+ "integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM="
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.1",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-calc": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
+ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-message-helpers": "2.0.0",
+ "reduce-css-calc": "1.3.0"
+ }
+ },
+ "postcss-colormin": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz",
+ "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
+ "requires": {
+ "colormin": "1.1.2",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-convert-values": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz",
+ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz",
+ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-discard-duplicates": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz",
+ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-discard-empty": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz",
+ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-discard-overridden": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz",
+ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-discard-unused": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz",
+ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
+ "requires": {
+ "postcss": "5.2.18",
+ "uniqs": "2.0.0"
+ }
+ },
+ "postcss-filter-plugins": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz",
+ "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=",
+ "requires": {
+ "postcss": "5.2.18",
+ "uniqid": "4.1.1"
+ }
+ },
+ "postcss-merge-idents": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz",
+ "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
+ "requires": {
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-merge-longhand": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz",
+ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz",
+ "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
+ "requires": {
+ "browserslist": "1.7.7",
+ "caniuse-api": "1.6.1",
+ "postcss": "5.2.18",
+ "postcss-selector-parser": "2.2.3",
+ "vendors": "1.0.1"
+ },
+ "dependencies": {
+ "browserslist": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+ "requires": {
+ "caniuse-db": "1.0.30000793",
+ "electron-to-chromium": "1.3.31"
+ }
+ }
+ }
+ },
+ "postcss-message-helpers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
+ "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4="
+ },
+ "postcss-minify-font-values": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz",
+ "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
+ "requires": {
+ "object-assign": "4.1.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz",
+ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-minify-params": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz",
+ "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
+ "requires": {
+ "alphanum-sort": "1.0.2",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0",
+ "uniqs": "2.0.0"
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz",
+ "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
+ "requires": {
+ "alphanum-sort": "1.0.2",
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "postcss-selector-parser": "2.2.3"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz",
+ "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=",
+ "requires": {
+ "postcss": "6.0.16"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz",
+ "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==",
+ "requires": {
+ "chalk": "2.3.0",
+ "source-map": "0.6.1",
+ "supports-color": "5.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+ "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+ "requires": {
+ "css-selector-tokenizer": "0.7.0",
+ "postcss": "6.0.16"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz",
+ "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==",
+ "requires": {
+ "chalk": "2.3.0",
+ "source-map": "0.6.1",
+ "supports-color": "5.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+ "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+ "requires": {
+ "css-selector-tokenizer": "0.7.0",
+ "postcss": "6.0.16"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz",
+ "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==",
+ "requires": {
+ "chalk": "2.3.0",
+ "source-map": "0.6.1",
+ "supports-color": "5.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+ "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-values": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+ "requires": {
+ "icss-replace-symbols": "1.1.0",
+ "postcss": "6.0.16"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz",
+ "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==",
+ "requires": {
+ "chalk": "2.3.0",
+ "source-map": "0.6.1",
+ "supports-color": "5.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+ "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
+ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz",
+ "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
+ "requires": {
+ "is-absolute-url": "2.1.0",
+ "normalize-url": "1.9.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-ordered-values": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz",
+ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-reduce-idents": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz",
+ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz",
+ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
+ "requires": {
+ "postcss": "5.2.18"
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz",
+ "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
+ "requires": {
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+ "requires": {
+ "flatten": "1.0.2",
+ "indexes-of": "1.0.1",
+ "uniq": "1.0.1"
+ }
+ },
+ "postcss-svgo": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
+ "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+ "requires": {
+ "is-svg": "2.1.0",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0",
+ "svgo": "0.7.2"
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz",
+ "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
+ "requires": {
+ "alphanum-sort": "1.0.2",
+ "postcss": "5.2.18",
+ "uniqs": "2.0.0"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+ "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
+ },
+ "postcss-zindex": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
+ "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+ "requires": {
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "uniqs": "2.0.0"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
+ "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "prop-types": {
+ "version": "15.6.0",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz",
+ "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=",
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1"
+ }
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "public-encrypt": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
+ "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.1.3",
+ "parse-asn1": "5.1.0",
+ "randombytes": "2.0.6"
+ }
+ },
+ "pullstream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz",
+ "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=",
+ "requires": {
+ "over": "0.0.5",
+ "readable-stream": "1.0.34",
+ "setimmediate": "1.0.5",
+ "slice-stream": "1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+ },
+ "query-string": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+ "requires": {
+ "object-assign": "4.1.1",
+ "strict-uri-encode": "1.1.0"
+ }
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+ },
+ "raf": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz",
+ "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==",
+ "requires": {
+ "performance-now": "2.1.0"
+ }
+ },
+ "rafl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/rafl/-/rafl-1.2.2.tgz",
+ "integrity": "sha1-/pMPdYIRAg1H44gV9Rlqi+QVB0A=",
+ "requires": {
+ "global": "4.3.2"
+ }
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz",
+ "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==",
+ "requires": {
+ "randombytes": "2.0.6",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "react": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz",
+ "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==",
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1",
+ "prop-types": "15.6.0"
+ }
+ },
+ "react-dom": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz",
+ "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==",
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1",
+ "prop-types": "15.6.0"
+ }
+ },
+ "react-event-listener": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.5.3.tgz",
+ "integrity": "sha512-fTGYvhe7eTsqq0m664Km0rxKQcqLIGZWZINmy1LU0fu312tay8Mt3Twq2P5Xj1dfDVvvzT1Ql3/FDkiMPJ1MOg==",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "fbjs": "0.8.16",
+ "prop-types": "15.6.0",
+ "warning": "3.0.0"
+ }
+ },
+ "react-fa": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/react-fa/-/react-fa-5.0.0.tgz",
+ "integrity": "sha512-pBEJigNkDJPAP/P9mQXT55VbJbbtwqi4ayieXuFvGpd+gl3aZ9IbjjVKJihdhdysJP0XRgrSa3sT3yOmkQi8wQ==",
+ "requires": {
+ "font-awesome": "4.7.0",
+ "prop-types": "15.6.0"
+ }
+ },
+ "react-jss": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.2.1.tgz",
+ "integrity": "sha512-H1fm32xG8pi4LMHkXjqpLyFOvSDsravd0HI6Dtlb/iyma1tfi7qqqSH2bf0kKyTAJV5hvYL0ls0qvRJWKfDPcA==",
+ "requires": {
+ "hoist-non-react-statics": "2.3.1",
+ "jss": "9.5.1",
+ "jss-preset-default": "4.1.0",
+ "prop-types": "15.6.0",
+ "theming": "1.3.0"
+ }
+ },
+ "react-popper": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.7.5.tgz",
+ "integrity": "sha512-ya9dhhGCf74JTOB2uyksEHhIGw7w9tNZRUJF73lEq2h4H5JT6MBa4PdT4G+sx6fZwq+xKZAL/sVNAIuojPn7Dg==",
+ "requires": {
+ "popper.js": "1.12.9",
+ "prop-types": "15.6.0"
+ }
+ },
+ "react-resize-detector": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-1.1.0.tgz",
+ "integrity": "sha512-68KVcQlhcWQGXMAie82YueCa4f4yqwEoiQbVyYlSgJEin1zMtNBLLeU/+6FLNf1TTgjwSfpbMTJTw/uU0HNgtQ==",
+ "requires": {
+ "prop-types": "15.6.0"
+ }
+ },
+ "react-scrollbar-size": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/react-scrollbar-size/-/react-scrollbar-size-2.0.2.tgz",
+ "integrity": "sha512-scpDs2PZFf9CJteBeDu7jkk7s+YX06Si4rQGVHsH6vjR/p7417q1Jv5SpOblLLesOgNrfWekwoHQG1g0/p3tvw==",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "prop-types": "15.6.0",
+ "react-event-listener": "0.5.3"
+ }
+ },
+ "react-smooth": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.0.tgz",
+ "integrity": "sha1-sp2+vd3bBtIbWwiWIWf7nqwYl9g=",
+ "requires": {
+ "lodash": "4.17.4",
+ "prop-types": "15.6.0",
+ "raf": "3.4.0",
+ "react-transition-group": "2.2.1"
+ }
+ },
+ "react-transition-group": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.2.1.tgz",
+ "integrity": "sha512-q54UBM22bs/CekG8r3+vi9TugSqh0t7qcEVycaRc9M0p0aCEu+h6rp/RFiW7fHfgd1IKpd9oILFTl5QK+FpiPA==",
+ "requires": {
+ "chain-function": "1.0.0",
+ "classnames": "2.2.5",
+ "dom-helpers": "3.3.1",
+ "loose-envify": "1.3.1",
+ "prop-types": "15.6.0",
+ "warning": "3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.3",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "recharts": {
+ "version": "1.0.0-beta.9",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-1.0.0-beta.9.tgz",
+ "integrity": "sha1-8A/33Jt7AXyLT2ahC5bzmyDNE1M=",
+ "requires": {
+ "classnames": "2.2.5",
+ "core-js": "2.5.1",
+ "d3-interpolate": "1.1.6",
+ "d3-scale": "1.0.6",
+ "d3-shape": "1.2.0",
+ "lodash": "4.17.4",
+ "prop-types": "15.6.0",
+ "react-resize-detector": "1.1.0",
+ "react-smooth": "1.0.0",
+ "recharts-scale": "0.3.2",
+ "reduce-css-calc": "1.3.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
+ "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs="
+ }
+ }
+ },
+ "recharts-scale": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.3.2.tgz",
+ "integrity": "sha1-2sdiFxSkdl0VLLKtvDDHO4MSCMk="
+ },
+ "recompose": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz",
+ "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==",
+ "requires": {
+ "change-emitter": "0.1.6",
+ "fbjs": "0.8.16",
+ "hoist-non-react-statics": "2.3.1",
+ "symbol-observable": "1.1.0"
+ }
+ },
+ "reduce-css-calc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
+ "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+ "requires": {
+ "balanced-match": "0.4.2",
+ "math-expression-evaluator": "1.2.17",
+ "reduce-function-call": "1.0.2"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+ }
+ }
+ },
+ "reduce-function-call": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz",
+ "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
+ "requires": {
+ "balanced-match": "0.4.2"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+ }
+ }
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg=="
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc="
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ }
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.83.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
+ "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.1",
+ "har-validator": "5.0.3",
+ "hawk": "6.0.2",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.1",
+ "safe-buffer": "5.1.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.2.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
+ "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
+ "requires": {
+ "hash-base": "2.0.2",
+ "inherits": "2.0.3"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "requires": {
+ "ajv": "5.5.2"
+ }
+ },
+ "scroll": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/scroll/-/scroll-2.0.1.tgz",
+ "integrity": "sha1-tMfSfovPOuiligQvJyaK4/VfnM0=",
+ "requires": {
+ "rafl": "1.2.2"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ },
+ "sha.js": {
+ "version": "2.4.10",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz",
+ "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==",
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "slice-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz",
+ "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=",
+ "requires": {
+ "readable-stream": "1.0.34"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+ "requires": {
+ "is-plain-obj": "1.1.0"
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
+ "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A=="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw="
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "sshpk": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
+ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz",
+ "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==",
+ "requires": {
+ "builtin-status-codes": "3.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "to-arraybuffer": "1.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "style-loader": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz",
+ "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==",
+ "requires": {
+ "loader-utils": "1.1.0",
+ "schema-utils": "0.3.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "svgo": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz",
+ "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
+ "requires": {
+ "coa": "1.0.4",
+ "colors": "1.1.2",
+ "csso": "2.3.2",
+ "js-yaml": "3.7.0",
+ "mkdirp": "0.5.1",
+ "sax": "1.2.4",
+ "whet.extend": "0.9.9"
+ }
+ },
+ "symbol-observable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz",
+ "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw=="
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.0",
+ "lodash": "4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "tapable": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI="
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ },
+ "theming": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/theming/-/theming-1.3.0.tgz",
+ "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==",
+ "requires": {
+ "brcast": "3.0.1",
+ "is-function": "1.0.1",
+ "is-plain-object": "2.0.4",
+ "prop-types": "15.6.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ },
+ "timers-browserify": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz",
+ "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==",
+ "requires": {
+ "setimmediate": "1.0.5"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "tough-cookie": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
+ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "traverse": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
+ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "ua-parser-js": {
+ "version": "0.7.17",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
+ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g=="
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "optional": true
+ },
+ "uglifyjs-webpack-plugin": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-js": "2.8.29",
+ "webpack-sources": "1.1.0"
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+ },
+ "uniqid": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
+ "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
+ "requires": {
+ "macaddress": "0.2.8"
+ }
+ },
+ "uniqs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
+ },
+ "unzip": {
+ "version": "0.1.11",
+ "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz",
+ "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=",
+ "requires": {
+ "binary": "0.3.0",
+ "fstream": "0.1.31",
+ "match-stream": "0.0.2",
+ "pullstream": "0.4.1",
+ "readable-stream": "1.0.34",
+ "setimmediate": "1.0.5"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ }
+ }
+ },
+ "url-loader": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz",
+ "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==",
+ "requires": {
+ "loader-utils": "1.1.0",
+ "mime": "1.6.0",
+ "schema-utils": "0.3.0"
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "url-to-options": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+ "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "vendors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz",
+ "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI="
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ }
+ },
+ "vm-browserify": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+ "requires": {
+ "indexof": "0.0.1"
+ }
+ },
+ "warning": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
+ "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "watchpack": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz",
+ "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=",
+ "requires": {
+ "async": "2.6.0",
+ "chokidar": "1.7.0",
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "webpack": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz",
+ "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==",
+ "requires": {
+ "acorn": "5.3.0",
+ "acorn-dynamic-import": "2.0.2",
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "async": "2.6.0",
+ "enhanced-resolve": "3.4.1",
+ "escope": "3.6.0",
+ "interpret": "1.1.0",
+ "json-loader": "0.5.7",
+ "json5": "0.5.1",
+ "loader-runner": "2.3.0",
+ "loader-utils": "1.1.0",
+ "memory-fs": "0.4.1",
+ "mkdirp": "0.5.1",
+ "node-libs-browser": "2.1.0",
+ "source-map": "0.5.7",
+ "supports-color": "4.5.0",
+ "tapable": "0.2.8",
+ "uglifyjs-webpack-plugin": "0.4.6",
+ "watchpack": "1.4.0",
+ "webpack-sources": "1.1.0",
+ "yargs": "8.0.2"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "requires": {
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "7.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "requires": {
+ "camelcase": "4.1.0"
+ }
+ }
+ }
+ },
+ "webpack-sources": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
+ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
+ "requires": {
+ "source-list-map": "2.0.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "whatwg-fetch": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
+ "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
+ },
+ "whet.extend": {
+ "version": "0.9.9",
+ "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
+ "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE="
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+ },
+ "window-size": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU="
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
+ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
+ "requires": {
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "lodash.assign": "4.2.0",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "window-size": "0.2.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "2.4.1"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
+ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
+ "requires": {
+ "camelcase": "3.0.0",
+ "lodash.assign": "4.2.0"
+ }
+ }
+ }
+}
diff --git a/dashboard/assets/package.json b/dashboard/assets/package.json
index 53376e5c8..847fd4bc1 100644
--- a/dashboard/assets/package.json
+++ b/dashboard/assets/package.json
@@ -1,22 +1,40 @@
{
- "dependencies": {
- "babel-core": "^6.26.0",
- "babel-eslint": "^8.0.1",
- "babel-loader": "^7.1.2",
- "babel-preset-env": "^1.6.1",
- "babel-preset-react": "^6.24.1",
- "babel-preset-stage-0": "^6.24.1",
- "classnames": "^2.2.5",
- "eslint": "^4.5.0",
- "eslint-plugin-react": "^7.4.0",
- "material-ui": "^1.0.0-beta.18",
- "material-ui-icons": "^1.0.0-beta.17",
- "path": "^0.12.7",
- "prop-types": "^15.6.0",
- "recharts": "^1.0.0-beta.0",
- "react": "^16.0.0",
- "react-dom": "^16.0.0",
- "url": "^0.11.0",
- "webpack": "^3.5.5"
- }
+ "dependencies": {
+ "babel-core": "^6.26.0",
+ "babel-eslint": "^8.2.1",
+ "babel-loader": "^7.1.2",
+ "babel-plugin-transform-class-properties": "^6.24.1",
+ "babel-plugin-transform-decorators-legacy": "^1.3.4",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-plugin-transform-runtime": "^6.23.0",
+ "babel-preset-env": "^1.6.1",
+ "babel-preset-react": "^6.24.1",
+ "babel-preset-stage-0": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "classnames": "^2.2.5",
+ "css-loader": "^0.28.9",
+ "eslint": "^4.16.0",
+ "eslint-config-airbnb": "^16.1.0",
+ "eslint-loader": "^1.9.0",
+ "eslint-plugin-import": "^2.8.0",
+ "eslint-plugin-jsx-a11y": "^6.0.3",
+ "eslint-plugin-react": "^7.5.1",
+ "eslint-plugin-flowtype": "^2.41.0",
+ "file-loader": "^1.1.6",
+ "flow-bin": "^0.63.1",
+ "flow-bin-loader": "^1.0.2",
+ "flow-typed": "^2.2.3",
+ "material-ui": "^1.0.0-beta.30",
+ "material-ui-icons": "^1.0.0-beta.17",
+ "path": "^0.12.7",
+ "react": "^16.2.0",
+ "react-dom": "^16.2.0",
+ "react-fa": "^5.0.0",
+ "react-transition-group": "^2.2.1",
+ "recharts": "^1.0.0-beta.9",
+ "style-loader": "^0.19.1",
+ "url": "^0.11.0",
+ "url-loader": "^0.6.2",
+ "webpack": "^3.10.0"
+ }
}
diff --git a/dashboard/assets/types/content.jsx b/dashboard/assets/types/content.jsx
new file mode 100644
index 000000000..546125397
--- /dev/null
+++ b/dashboard/assets/types/content.jsx
@@ -0,0 +1,70 @@
+// @flow
+
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+export type Content = {
+ general: General,
+ home: Home,
+ chain: Chain,
+ txpool: TxPool,
+ network: Network,
+ system: System,
+ logs: Logs,
+};
+
+export type General = {
+ version: ?string,
+ commit: ?string,
+};
+
+export type Home = {
+ activeMemory: ChartEntries,
+ virtualMemory: ChartEntries,
+ networkIngress: ChartEntries,
+ networkEgress: ChartEntries,
+ processCPU: ChartEntries,
+ systemCPU: ChartEntries,
+ diskRead: ChartEntries,
+ diskWrite: ChartEntries,
+};
+
+export type ChartEntries = Array<ChartEntry>;
+
+export type ChartEntry = {
+ time: Date,
+ value: number,
+};
+
+export type Chain = {
+ /* TODO (kurkomisi) */
+};
+
+export type TxPool = {
+ /* TODO (kurkomisi) */
+};
+
+export type Network = {
+ /* TODO (kurkomisi) */
+};
+
+export type System = {
+ /* TODO (kurkomisi) */
+};
+
+export type Logs = {
+ log: Array<string>,
+};
diff --git a/dashboard/assets/webpack.config.js b/dashboard/assets/webpack.config.js
index 13f8c3fbc..d90c4fabd 100644
--- a/dashboard/assets/webpack.config.js
+++ b/dashboard/assets/webpack.config.js
@@ -14,23 +14,61 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+const webpack = require('webpack');
const path = require('path');
module.exports = {
- entry: './index.jsx',
- output: {
- path: path.resolve(__dirname, 'public'),
- filename: 'bundle.js',
- },
- module: {
- loaders: [
- {
- test: /\.jsx$/, // regexp for JSX files
- loader: 'babel-loader', // The babel configuration is in the package.json.
- query: {
- presets: ['env', 'react', 'stage-0']
- }
- },
- ],
- },
+ resolve: {
+ extensions: ['.js', '.jsx'],
+ },
+ entry: './index',
+ output: {
+ path: path.resolve(__dirname, ''),
+ filename: 'bundle.js',
+ },
+ plugins: [
+ new webpack.optimize.UglifyJsPlugin({
+ comments: false,
+ mangle: false,
+ beautify: true,
+ }),
+ ],
+ module: {
+ rules: [
+ {
+ test: /\.jsx$/, // regexp for JSX files
+ exclude: /node_modules/,
+ use: [ // order: from bottom to top
+ {
+ loader: 'babel-loader',
+ options: {
+ plugins: [ // order: from top to bottom
+ // 'transform-decorators-legacy', // @withStyles, @withTheme
+ 'transform-class-properties', // static defaultProps
+ 'transform-flow-strip-types',
+ ],
+ presets: [ // order: from bottom to top
+ 'env',
+ 'react',
+ 'stage-0',
+ ],
+ },
+ },
+ // 'eslint-loader', // show errors not only in the editor, but also in the console
+ ],
+ },
+ {
+ test: /font-awesome\.css$/,
+ use: [
+ 'style-loader',
+ 'css-loader',
+ path.resolve(__dirname, './fa-only-woff-loader.js'),
+ ],
+ },
+ {
+ test: /\.woff2?$/, // font-awesome icons
+ use: 'url-loader',
+ },
+ ],
+ },
};
diff --git a/dashboard/config.go b/dashboard/config.go
index 57d902aee..604a5f2c9 100644
--- a/dashboard/config.go
+++ b/dashboard/config.go
@@ -22,7 +22,7 @@ import "time"
var DefaultConfig = Config{
Host: "localhost",
Port: 8080,
- Refresh: 3 * time.Second,
+ Refresh: 5 * time.Second,
}
// Config contains the configuration parameters of the dashboard.
diff --git a/dashboard/cpu.go b/dashboard/cpu.go
new file mode 100644
index 000000000..c89879028
--- /dev/null
+++ b/dashboard/cpu.go
@@ -0,0 +1,35 @@
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// +build !windows
+
+package dashboard
+
+import (
+ "syscall"
+
+ "github.com/ethereum/go-ethereum/log"
+)
+
+// getProcessCPUTime retrieves the process' CPU time since program startup.
+func getProcessCPUTime() float64 {
+ var usage syscall.Rusage
+ if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil {
+ log.Warn("Failed to retrieve CPU time", "err", err)
+ return 0
+ }
+ return float64(usage.Utime.Sec+usage.Stime.Sec) + float64(usage.Utime.Usec+usage.Stime.Usec)/1000000
+}
diff --git a/dashboard/cpu_windows.go b/dashboard/cpu_windows.go
new file mode 100644
index 000000000..9bb7ec789
--- /dev/null
+++ b/dashboard/cpu_windows.go
@@ -0,0 +1,23 @@
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package dashboard
+
+// getProcessCPUTime returns 0 on Windows as there is no system call to resolve
+// the actual process' CPU time.
+func getProcessCPUTime() float64 {
+ return 0
+}
diff --git a/dashboard/dashboard.go b/dashboard/dashboard.go
index 10a363619..09038638e 100644
--- a/dashboard/dashboard.go
+++ b/dashboard/dashboard.go
@@ -16,7 +16,12 @@
package dashboard
-//go:generate go-bindata -nometadata -o assets.go -prefix assets -pkg dashboard assets/public/...
+//go:generate npm --prefix ./assets install
+//go:generate ./assets/node_modules/.bin/webpack --config ./assets/webpack.config.js --context ./assets
+//go:generate go-bindata -nometadata -o assets.go -prefix assets -nocompress -pkg dashboard assets/dashboard.html assets/bundle.js
+//go:generate sh -c "sed 's#var _bundleJs#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go"
+//go:generate sh -c "sed 's#var _dashboardHtml#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go"
+//go:generate gofmt -w -s assets.go
import (
"fmt"
@@ -24,23 +29,32 @@ import (
"net"
"net/http"
"path/filepath"
+ "runtime"
"sync"
"sync/atomic"
"time"
+ "github.com/elastic/gosigar"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
"github.com/rcrowley/go-metrics"
"golang.org/x/net/websocket"
)
const (
- memorySampleLimit = 200 // Maximum number of memory data samples
- trafficSampleLimit = 200 // Maximum number of traffic data samples
+ activeMemorySampleLimit = 200 // Maximum number of active memory data samples
+ virtualMemorySampleLimit = 200 // Maximum number of virtual memory data samples
+ networkIngressSampleLimit = 200 // Maximum number of network ingress data samples
+ networkEgressSampleLimit = 200 // Maximum number of network egress data samples
+ processCPUSampleLimit = 200 // Maximum number of process cpu data samples
+ systemCPUSampleLimit = 200 // Maximum number of system cpu data samples
+ diskReadSampleLimit = 200 // Maximum number of disk read data samples
+ diskWriteSampleLimit = 200 // Maximum number of disk write data samples
)
-var nextId uint32 // Next connection id
+var nextID uint32 // Next connection id
// Dashboard contains the dashboard internals.
type Dashboard struct {
@@ -48,47 +62,52 @@ type Dashboard struct {
listener net.Listener
conns map[uint32]*client // Currently live websocket connections
- charts charts // The collected data samples to plot
- lock sync.RWMutex // Lock protecting the dashboard's internals
+ charts *HomeMessage
+ commit string
+ lock sync.RWMutex // Lock protecting the dashboard's internals
quit chan chan error // Channel used for graceful exit
wg sync.WaitGroup
}
-// message embraces the data samples of a client message.
-type message struct {
- History *charts `json:"history,omitempty"` // Past data samples
- Memory *chartEntry `json:"memory,omitempty"` // One memory sample
- Traffic *chartEntry `json:"traffic,omitempty"` // One traffic sample
- Log string `json:"log,omitempty"` // One log
-}
-
// client represents active websocket connection with a remote browser.
type client struct {
conn *websocket.Conn // Particular live websocket connection
- msg chan message // Message queue for the update messages
+ msg chan Message // Message queue for the update messages
logger log.Logger // Logger for the particular live websocket connection
}
-// charts contains the collected data samples.
-type charts struct {
- Memory []*chartEntry `json:"memorySamples,omitempty"`
- Traffic []*chartEntry `json:"trafficSamples,omitempty"`
-}
-
-// chartEntry represents one data sample
-type chartEntry struct {
- Time time.Time `json:"time,omitempty"`
- Value float64 `json:"value,omitempty"`
-}
-
// New creates a new dashboard instance with the given configuration.
-func New(config *Config) (*Dashboard, error) {
- return &Dashboard{
+func New(config *Config, commit string) (*Dashboard, error) {
+ now := time.Now()
+ db := &Dashboard{
conns: make(map[uint32]*client),
config: config,
quit: make(chan chan error),
- }, nil
+ charts: &HomeMessage{
+ ActiveMemory: emptyChartEntries(now, activeMemorySampleLimit, config.Refresh),
+ VirtualMemory: emptyChartEntries(now, virtualMemorySampleLimit, config.Refresh),
+ NetworkIngress: emptyChartEntries(now, networkIngressSampleLimit, config.Refresh),
+ NetworkEgress: emptyChartEntries(now, networkEgressSampleLimit, config.Refresh),
+ ProcessCPU: emptyChartEntries(now, processCPUSampleLimit, config.Refresh),
+ SystemCPU: emptyChartEntries(now, systemCPUSampleLimit, config.Refresh),
+ DiskRead: emptyChartEntries(now, diskReadSampleLimit, config.Refresh),
+ DiskWrite: emptyChartEntries(now, diskWriteSampleLimit, config.Refresh),
+ },
+ commit: commit,
+ }
+ return db, nil
+}
+
+// emptyChartEntries returns a ChartEntry array containing limit number of empty samples.
+func emptyChartEntries(t time.Time, limit int, refresh time.Duration) ChartEntries {
+ ce := make(ChartEntries, limit)
+ for i := 0; i < limit; i++ {
+ ce[i] = &ChartEntry{
+ Time: t.Add(-time.Duration(i) * refresh),
+ }
+ }
+ return ce
}
// Protocols is a meaningless implementation of node.Service.
@@ -99,6 +118,8 @@ func (db *Dashboard) APIs() []rpc.API { return nil }
// Start implements node.Service, starting the data collection thread and the listening server of the dashboard.
func (db *Dashboard) Start(server *p2p.Server) error {
+ log.Info("Starting dashboard")
+
db.wg.Add(2)
go db.collectData()
go db.collectLogs() // In case of removing this line change 2 back to 1 in wg.Add.
@@ -172,7 +193,7 @@ func (db *Dashboard) webHandler(w http.ResponseWriter, r *http.Request) {
w.Write(blob)
return
}
- blob, err := Asset(filepath.Join("public", path))
+ blob, err := Asset(path[1:])
if err != nil {
log.Warn("Failed to load the asset", "path", path, "err", err)
http.Error(w, "not found", http.StatusNotFound)
@@ -183,13 +204,13 @@ func (db *Dashboard) webHandler(w http.ResponseWriter, r *http.Request) {
// apiHandler handles requests for the dashboard.
func (db *Dashboard) apiHandler(conn *websocket.Conn) {
- id := atomic.AddUint32(&nextId, 1)
+ id := atomic.AddUint32(&nextID, 1)
client := &client{
conn: conn,
- msg: make(chan message, 128),
+ msg: make(chan Message, 128),
logger: log.New("id", id),
}
- done := make(chan struct{}) // Buffered channel as sender may exit early
+ done := make(chan struct{})
// Start listening for messages to send.
db.wg.Add(1)
@@ -209,9 +230,27 @@ func (db *Dashboard) apiHandler(conn *websocket.Conn) {
}
}
}()
+
+ versionMeta := ""
+ if len(params.VersionMeta) > 0 {
+ versionMeta = fmt.Sprintf(" (%s)", params.VersionMeta)
+ }
// Send the past data.
- client.msg <- message{
- History: &db.charts,
+ client.msg <- Message{
+ General: &GeneralMessage{
+ Version: fmt.Sprintf("v%d.%d.%d%s", params.VersionMajor, params.VersionMinor, params.VersionPatch, versionMeta),
+ Commit: db.commit,
+ },
+ Home: &HomeMessage{
+ ActiveMemory: db.charts.ActiveMemory,
+ VirtualMemory: db.charts.VirtualMemory,
+ NetworkIngress: db.charts.NetworkIngress,
+ NetworkEgress: db.charts.NetworkEgress,
+ ProcessCPU: db.charts.ProcessCPU,
+ SystemCPU: db.charts.SystemCPU,
+ DiskRead: db.charts.DiskRead,
+ DiskWrite: db.charts.DiskWrite,
+ },
}
// Start tracking the connection and drop at connection loss.
db.lock.Lock()
@@ -235,6 +274,19 @@ func (db *Dashboard) apiHandler(conn *websocket.Conn) {
// collectData collects the required data to plot on the dashboard.
func (db *Dashboard) collectData() {
defer db.wg.Done()
+ systemCPUUsage := gosigar.Cpu{}
+ systemCPUUsage.Get()
+ var (
+ prevNetworkIngress = metrics.DefaultRegistry.Get("p2p/InboundTraffic").(metrics.Meter).Count()
+ prevNetworkEgress = metrics.DefaultRegistry.Get("p2p/OutboundTraffic").(metrics.Meter).Count()
+ prevProcessCPUTime = getProcessCPUTime()
+ prevSystemCPUUsage = systemCPUUsage
+ prevDiskRead = metrics.DefaultRegistry.Get("eth/db/chaindata/compact/input").(metrics.Meter).Count()
+ prevDiskWrite = metrics.DefaultRegistry.Get("eth/db/chaindata/compact/output").(metrics.Meter).Count()
+
+ frequency = float64(db.config.Refresh / time.Second)
+ numCPU = float64(runtime.NumCPU())
+ )
for {
select {
@@ -242,32 +294,85 @@ func (db *Dashboard) collectData() {
errc <- nil
return
case <-time.After(db.config.Refresh):
- inboundTraffic := metrics.DefaultRegistry.Get("p2p/InboundTraffic").(metrics.Meter).Rate1()
- memoryInUse := metrics.DefaultRegistry.Get("system/memory/inuse").(metrics.Meter).Rate1()
+ systemCPUUsage.Get()
+ var (
+ curNetworkIngress = metrics.DefaultRegistry.Get("p2p/InboundTraffic").(metrics.Meter).Count()
+ curNetworkEgress = metrics.DefaultRegistry.Get("p2p/OutboundTraffic").(metrics.Meter).Count()
+ curProcessCPUTime = getProcessCPUTime()
+ curSystemCPUUsage = systemCPUUsage
+ curDiskRead = metrics.DefaultRegistry.Get("eth/db/chaindata/compact/input").(metrics.Meter).Count()
+ curDiskWrite = metrics.DefaultRegistry.Get("eth/db/chaindata/compact/output").(metrics.Meter).Count()
+
+ deltaNetworkIngress = float64(curNetworkIngress - prevNetworkIngress)
+ deltaNetworkEgress = float64(curNetworkEgress - prevNetworkEgress)
+ deltaProcessCPUTime = curProcessCPUTime - prevProcessCPUTime
+ deltaSystemCPUUsage = systemCPUUsage.Delta(prevSystemCPUUsage)
+ deltaDiskRead = curDiskRead - prevDiskRead
+ deltaDiskWrite = curDiskWrite - prevDiskWrite
+ )
+ prevNetworkIngress = curNetworkIngress
+ prevNetworkEgress = curNetworkEgress
+ prevProcessCPUTime = curProcessCPUTime
+ prevSystemCPUUsage = curSystemCPUUsage
+ prevDiskRead = curDiskRead
+ prevDiskWrite = curDiskWrite
+
now := time.Now()
- memory := &chartEntry{
+
+ var mem runtime.MemStats
+ runtime.ReadMemStats(&mem)
+ activeMemory := &ChartEntry{
Time: now,
- Value: memoryInUse,
+ Value: float64(mem.Alloc) / frequency,
}
- traffic := &chartEntry{
+ virtualMemory := &ChartEntry{
Time: now,
- Value: inboundTraffic,
+ Value: float64(mem.Sys) / frequency,
}
- // Remove the first elements in case the samples' amount exceeds the limit.
- first := 0
- if len(db.charts.Memory) == memorySampleLimit {
- first = 1
+ networkIngress := &ChartEntry{
+ Time: now,
+ Value: deltaNetworkIngress / frequency,
}
- db.charts.Memory = append(db.charts.Memory[first:], memory)
- first = 0
- if len(db.charts.Traffic) == trafficSampleLimit {
- first = 1
+ networkEgress := &ChartEntry{
+ Time: now,
+ Value: deltaNetworkEgress / frequency,
}
- db.charts.Traffic = append(db.charts.Traffic[first:], traffic)
-
- db.sendToAll(&message{
- Memory: memory,
- Traffic: traffic,
+ processCPU := &ChartEntry{
+ Time: now,
+ Value: deltaProcessCPUTime / frequency / numCPU * 100,
+ }
+ systemCPU := &ChartEntry{
+ Time: now,
+ Value: float64(deltaSystemCPUUsage.Sys+deltaSystemCPUUsage.User) / frequency / numCPU,
+ }
+ diskRead := &ChartEntry{
+ Time: now,
+ Value: float64(deltaDiskRead) / frequency,
+ }
+ diskWrite := &ChartEntry{
+ Time: now,
+ Value: float64(deltaDiskWrite) / frequency,
+ }
+ db.charts.ActiveMemory = append(db.charts.ActiveMemory[1:], activeMemory)
+ db.charts.VirtualMemory = append(db.charts.VirtualMemory[1:], virtualMemory)
+ db.charts.NetworkIngress = append(db.charts.NetworkIngress[1:], networkIngress)
+ db.charts.NetworkEgress = append(db.charts.NetworkEgress[1:], networkEgress)
+ db.charts.ProcessCPU = append(db.charts.ProcessCPU[1:], processCPU)
+ db.charts.SystemCPU = append(db.charts.SystemCPU[1:], systemCPU)
+ db.charts.DiskRead = append(db.charts.DiskRead[1:], diskRead)
+ db.charts.DiskWrite = append(db.charts.DiskRead[1:], diskWrite)
+
+ db.sendToAll(&Message{
+ Home: &HomeMessage{
+ ActiveMemory: ChartEntries{activeMemory},
+ VirtualMemory: ChartEntries{virtualMemory},
+ NetworkIngress: ChartEntries{networkIngress},
+ NetworkEgress: ChartEntries{networkEgress},
+ ProcessCPU: ChartEntries{processCPU},
+ SystemCPU: ChartEntries{systemCPU},
+ DiskRead: ChartEntries{diskRead},
+ DiskWrite: ChartEntries{diskWrite},
+ },
})
}
}
@@ -277,6 +382,7 @@ func (db *Dashboard) collectData() {
func (db *Dashboard) collectLogs() {
defer db.wg.Done()
+ id := 1
// TODO (kurkomisi): log collection comes here.
for {
select {
@@ -284,15 +390,18 @@ func (db *Dashboard) collectLogs() {
errc <- nil
return
case <-time.After(db.config.Refresh / 2):
- db.sendToAll(&message{
- Log: "This is a fake log.",
+ db.sendToAll(&Message{
+ Logs: &LogsMessage{
+ Log: []string{fmt.Sprintf("%-4d: This is a fake log.", id)},
+ },
})
+ id++
}
}
}
// sendToAll sends the given message to the active dashboards.
-func (db *Dashboard) sendToAll(msg *message) {
+func (db *Dashboard) sendToAll(msg *Message) {
db.lock.Lock()
for _, c := range db.conns {
select {
diff --git a/dashboard/message.go b/dashboard/message.go
new file mode 100644
index 000000000..f0d4280e8
--- /dev/null
+++ b/dashboard/message.go
@@ -0,0 +1,72 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package dashboard
+
+import "time"
+
+type Message struct {
+ General *GeneralMessage `json:"general,omitempty"`
+ Home *HomeMessage `json:"home,omitempty"`
+ Chain *ChainMessage `json:"chain,omitempty"`
+ TxPool *TxPoolMessage `json:"txpool,omitempty"`
+ Network *NetworkMessage `json:"network,omitempty"`
+ System *SystemMessage `json:"system,omitempty"`
+ Logs *LogsMessage `json:"logs,omitempty"`
+}
+
+type GeneralMessage struct {
+ Version string `json:"version,omitempty"`
+ Commit string `json:"commit,omitempty"`
+}
+
+type HomeMessage struct {
+ ActiveMemory ChartEntries `json:"activeMemory,omitempty"`
+ VirtualMemory ChartEntries `json:"virtualMemory,omitempty"`
+ NetworkIngress ChartEntries `json:"networkIngress,omitempty"`
+ NetworkEgress ChartEntries `json:"networkEgress,omitempty"`
+ ProcessCPU ChartEntries `json:"processCPU,omitempty"`
+ SystemCPU ChartEntries `json:"systemCPU,omitempty"`
+ DiskRead ChartEntries `json:"diskRead,omitempty"`
+ DiskWrite ChartEntries `json:"diskWrite,omitempty"`
+}
+
+type ChartEntries []*ChartEntry
+
+type ChartEntry struct {
+ Time time.Time `json:"time,omitempty"`
+ Value float64 `json:"value,omitempty"`
+}
+
+type ChainMessage struct {
+ /* TODO (kurkomisi) */
+}
+
+type TxPoolMessage struct {
+ /* TODO (kurkomisi) */
+}
+
+type NetworkMessage struct {
+ /* TODO (kurkomisi) */
+}
+
+type SystemMessage struct {
+ /* TODO (kurkomisi) */
+}
+
+type LogsMessage struct {
+ Log []string `json:"log,omitempty"`
+}
diff --git a/eth/api.go b/eth/api.go
index c748f75de..a345b57e4 100644
--- a/eth/api.go
+++ b/eth/api.go
@@ -17,24 +17,19 @@
package eth
import (
- "bytes"
"compress/gzip"
"context"
"fmt"
"io"
- "io/ioutil"
"math/big"
"os"
"strings"
- "time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/core/vm"
- "github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/miner"
"github.com/ethereum/go-ethereum/params"
@@ -43,8 +38,6 @@ import (
"github.com/ethereum/go-ethereum/trie"
)
-const defaultTraceTimeout = 5 * time.Second
-
// PublicEthereumAPI provides an API to access Ethereum full node-related
// information.
type PublicEthereumAPI struct {
@@ -348,248 +341,6 @@ func NewPrivateDebugAPI(config *params.ChainConfig, eth *Ethereum) *PrivateDebug
return &PrivateDebugAPI{config: config, eth: eth}
}
-// BlockTraceResult is the returned value when replaying a block to check for
-// consensus results and full VM trace logs for all included transactions.
-type BlockTraceResult struct {
- Validated bool `json:"validated"`
- StructLogs []ethapi.StructLogRes `json:"structLogs"`
- Error string `json:"error"`
-}
-
-// TraceArgs holds extra parameters to trace functions
-type TraceArgs struct {
- *vm.LogConfig
- Tracer *string
- Timeout *string
-}
-
-// TraceBlock processes the given block'api RLP but does not import the block in to
-// the chain.
-func (api *PrivateDebugAPI) TraceBlock(blockRlp []byte, config *vm.LogConfig) BlockTraceResult {
- var block types.Block
- err := rlp.Decode(bytes.NewReader(blockRlp), &block)
- if err != nil {
- return BlockTraceResult{Error: fmt.Sprintf("could not decode block: %v", err)}
- }
-
- validated, logs, err := api.traceBlock(&block, config)
- return BlockTraceResult{
- Validated: validated,
- StructLogs: ethapi.FormatLogs(logs),
- Error: formatError(err),
- }
-}
-
-// TraceBlockFromFile loads the block'api RLP from the given file name and attempts to
-// process it but does not import the block in to the chain.
-func (api *PrivateDebugAPI) TraceBlockFromFile(file string, config *vm.LogConfig) BlockTraceResult {
- blockRlp, err := ioutil.ReadFile(file)
- if err != nil {
- return BlockTraceResult{Error: fmt.Sprintf("could not read file: %v", err)}
- }
- return api.TraceBlock(blockRlp, config)
-}
-
-// TraceBlockByNumber processes the block by canonical block number.
-func (api *PrivateDebugAPI) TraceBlockByNumber(blockNr rpc.BlockNumber, config *vm.LogConfig) BlockTraceResult {
- // Fetch the block that we aim to reprocess
- var block *types.Block
- switch blockNr {
- case rpc.PendingBlockNumber:
- // Pending block is only known by the miner
- block = api.eth.miner.PendingBlock()
- case rpc.LatestBlockNumber:
- block = api.eth.blockchain.CurrentBlock()
- default:
- block = api.eth.blockchain.GetBlockByNumber(uint64(blockNr))
- }
-
- if block == nil {
- return BlockTraceResult{Error: fmt.Sprintf("block #%d not found", blockNr)}
- }
-
- validated, logs, err := api.traceBlock(block, config)
- return BlockTraceResult{
- Validated: validated,
- StructLogs: ethapi.FormatLogs(logs),
- Error: formatError(err),
- }
-}
-
-// TraceBlockByHash processes the block by hash.
-func (api *PrivateDebugAPI) TraceBlockByHash(hash common.Hash, config *vm.LogConfig) BlockTraceResult {
- // Fetch the block that we aim to reprocess
- block := api.eth.BlockChain().GetBlockByHash(hash)
- if block == nil {
- return BlockTraceResult{Error: fmt.Sprintf("block #%x not found", hash)}
- }
-
- validated, logs, err := api.traceBlock(block, config)
- return BlockTraceResult{
- Validated: validated,
- StructLogs: ethapi.FormatLogs(logs),
- Error: formatError(err),
- }
-}
-
-// traceBlock processes the given block but does not save the state.
-func (api *PrivateDebugAPI) traceBlock(block *types.Block, logConfig *vm.LogConfig) (bool, []vm.StructLog, error) {
- // Validate and reprocess the block
- var (
- blockchain = api.eth.BlockChain()
- validator = blockchain.Validator()
- processor = blockchain.Processor()
- )
-
- structLogger := vm.NewStructLogger(logConfig)
-
- config := vm.Config{
- Debug: true,
- Tracer: structLogger,
- }
- if err := api.eth.engine.VerifyHeader(blockchain, block.Header(), true); err != nil {
- return false, structLogger.StructLogs(), err
- }
- statedb, err := blockchain.StateAt(blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1).Root())
- if err != nil {
- switch err.(type) {
- case *trie.MissingNodeError:
- return false, structLogger.StructLogs(), fmt.Errorf("required historical state unavailable")
- default:
- return false, structLogger.StructLogs(), err
- }
- }
-
- receipts, _, usedGas, err := processor.Process(block, statedb, config)
- if err != nil {
- return false, structLogger.StructLogs(), err
- }
- if err := validator.ValidateState(block, blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1), statedb, receipts, usedGas); err != nil {
- return false, structLogger.StructLogs(), err
- }
- return true, structLogger.StructLogs(), nil
-}
-
-// formatError formats a Go error into either an empty string or the data content
-// of the error itself.
-func formatError(err error) string {
- if err == nil {
- return ""
- }
- return err.Error()
-}
-
-type timeoutError struct{}
-
-func (t *timeoutError) Error() string {
- return "Execution time exceeded"
-}
-
-// TraceTransaction returns the structured logs created during the execution of EVM
-// and returns them as a JSON object.
-func (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, txHash common.Hash, config *TraceArgs) (interface{}, error) {
- var tracer vm.Tracer
- if config != nil && config.Tracer != nil {
- timeout := defaultTraceTimeout
- if config.Timeout != nil {
- var err error
- if timeout, err = time.ParseDuration(*config.Timeout); err != nil {
- return nil, err
- }
- }
-
- var err error
- if tracer, err = ethapi.NewJavascriptTracer(*config.Tracer); err != nil {
- return nil, err
- }
-
- // Handle timeouts and RPC cancellations
- deadlineCtx, cancel := context.WithTimeout(ctx, timeout)
- go func() {
- <-deadlineCtx.Done()
- tracer.(*ethapi.JavascriptTracer).Stop(&timeoutError{})
- }()
- defer cancel()
- } else if config == nil {
- tracer = vm.NewStructLogger(nil)
- } else {
- tracer = vm.NewStructLogger(config.LogConfig)
- }
-
- // Retrieve the tx from the chain and the containing block
- tx, blockHash, _, txIndex := core.GetTransaction(api.eth.ChainDb(), txHash)
- if tx == nil {
- return nil, fmt.Errorf("transaction %x not found", txHash)
- }
- msg, context, statedb, err := api.computeTxEnv(blockHash, int(txIndex))
- if err != nil {
- switch err.(type) {
- case *trie.MissingNodeError:
- return nil, fmt.Errorf("required historical state unavailable")
- default:
- return nil, err
- }
- }
-
- // Run the transaction with tracing enabled.
- vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{Debug: true, Tracer: tracer})
- ret, gas, failed, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas()))
- if err != nil {
- return nil, fmt.Errorf("tracing failed: %v", err)
- }
- switch tracer := tracer.(type) {
- case *vm.StructLogger:
- return &ethapi.ExecutionResult{
- Gas: gas,
- Failed: failed,
- ReturnValue: fmt.Sprintf("%x", ret),
- StructLogs: ethapi.FormatLogs(tracer.StructLogs()),
- }, nil
- case *ethapi.JavascriptTracer:
- return tracer.GetResult()
- default:
- panic(fmt.Sprintf("bad tracer type %T", tracer))
- }
-}
-
-// computeTxEnv returns the execution environment of a certain transaction.
-func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int) (core.Message, vm.Context, *state.StateDB, error) {
- // Create the parent state.
- block := api.eth.BlockChain().GetBlockByHash(blockHash)
- if block == nil {
- return nil, vm.Context{}, nil, fmt.Errorf("block %x not found", blockHash)
- }
- parent := api.eth.BlockChain().GetBlock(block.ParentHash(), block.NumberU64()-1)
- if parent == nil {
- return nil, vm.Context{}, nil, fmt.Errorf("block parent %x not found", block.ParentHash())
- }
- statedb, err := api.eth.BlockChain().StateAt(parent.Root())
- if err != nil {
- return nil, vm.Context{}, nil, err
- }
- txs := block.Transactions()
-
- // Recompute transactions up to the target index.
- signer := types.MakeSigner(api.config, block.Number())
- for idx, tx := range txs {
- // Assemble the transaction call message
- msg, _ := tx.AsMessage(signer)
- context := core.NewEVMContext(msg, block.Header(), api.eth.BlockChain(), nil)
- if idx == txIndex {
- return msg, context, statedb, nil
- }
-
- vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{})
- gp := new(core.GasPool).AddGas(tx.Gas())
- _, _, _, err := core.ApplyMessage(vmenv, msg, gp)
- if err != nil {
- return nil, vm.Context{}, nil, fmt.Errorf("tx %x failed: %v", tx.Hash(), err)
- }
- statedb.DeleteSuicides()
- }
- return nil, vm.Context{}, nil, fmt.Errorf("tx index %d out of range for block %x", txIndex, blockHash)
-}
-
// Preimage is a debug API function that returns the preimage for a sha3 hash, if known.
func (api *PrivateDebugAPI) Preimage(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) {
db := core.PreimageTable(api.eth.ChainDb())
@@ -617,7 +368,7 @@ type storageEntry struct {
// StorageRangeAt returns the storage at the given block height and transaction index.
func (api *PrivateDebugAPI) StorageRangeAt(ctx context.Context, blockHash common.Hash, txIndex int, contractAddress common.Address, keyStart hexutil.Bytes, maxResult int) (StorageRangeResult, error) {
- _, _, statedb, err := api.computeTxEnv(blockHash, txIndex)
+ _, _, statedb, err := api.computeTxEnv(blockHash, txIndex, 0)
if err != nil {
return StorageRangeResult{}, err
}
@@ -711,11 +462,11 @@ func (api *PrivateDebugAPI) getModifiedAccounts(startBlock, endBlock *types.Bloc
return nil, fmt.Errorf("start block height (%d) must be less than end block height (%d)", startBlock.Number().Uint64(), endBlock.Number().Uint64())
}
- oldTrie, err := trie.NewSecure(startBlock.Root(), api.eth.chainDb, 0)
+ oldTrie, err := trie.NewSecure(startBlock.Root(), trie.NewDatabase(api.eth.chainDb), 0)
if err != nil {
return nil, err
}
- newTrie, err := trie.NewSecure(endBlock.Root(), api.eth.chainDb, 0)
+ newTrie, err := trie.NewSecure(endBlock.Root(), trie.NewDatabase(api.eth.chainDb), 0)
if err != nil {
return nil, err
}
diff --git a/eth/api_tracer.go b/eth/api_tracer.go
new file mode 100644
index 000000000..07c4457bc
--- /dev/null
+++ b/eth/api_tracer.go
@@ -0,0 +1,646 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package eth
+
+import (
+ "bytes"
+ "context"
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "runtime"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/state"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/eth/tracers"
+ "github.com/ethereum/go-ethereum/internal/ethapi"
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/rlp"
+ "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/trie"
+)
+
+const (
+ // defaultTraceTimeout is the amount of time a single transaction can execute
+ // by default before being forcefully aborted.
+ defaultTraceTimeout = 5 * time.Second
+
+ // defaultTraceReexec is the number of blocks the tracer is willing to go back
+ // and reexecute to produce missing historical state necessary to run a specific
+ // trace.
+ defaultTraceReexec = uint64(128)
+)
+
+// TraceConfig holds extra parameters to trace functions.
+type TraceConfig struct {
+ *vm.LogConfig
+ Tracer *string
+ Timeout *string
+ Reexec *uint64
+}
+
+// txTraceResult is the result of a single transaction trace.
+type txTraceResult struct {
+ Result interface{} `json:"result,omitempty"` // Trace results produced by the tracer
+ Error string `json:"error,omitempty"` // Trace failure produced by the tracer
+}
+
+// blockTraceTask represents a single block trace task when an entire chain is
+// being traced.
+type blockTraceTask struct {
+ statedb *state.StateDB // Intermediate state prepped for tracing
+ block *types.Block // Block to trace the transactions from
+ rootref common.Hash // Trie root reference held for this task
+ results []*txTraceResult // Trace results procudes by the task
+}
+
+// blockTraceResult represets the results of tracing a single block when an entire
+// chain is being traced.
+type blockTraceResult struct {
+ Block hexutil.Uint64 `json:"block"` // Block number corresponding to this trace
+ Hash common.Hash `json:"hash"` // Block hash corresponding to this trace
+ Traces []*txTraceResult `json:"traces"` // Trace results produced by the task
+}
+
+// txTraceTask represents a single transaction trace task when an entire block
+// is being traced.
+type txTraceTask struct {
+ statedb *state.StateDB // Intermediate state prepped for tracing
+ index int // Transaction offset in the block
+}
+
+// TraceChain returns the structured logs created during the execution of EVM
+// between two blocks (excluding start) and returns them as a JSON object.
+func (api *PrivateDebugAPI) TraceChain(ctx context.Context, start, end rpc.BlockNumber, config *TraceConfig) (*rpc.Subscription, error) {
+ // Fetch the block interval that we want to trace
+ var from, to *types.Block
+
+ switch start {
+ case rpc.PendingBlockNumber:
+ from = api.eth.miner.PendingBlock()
+ case rpc.LatestBlockNumber:
+ from = api.eth.blockchain.CurrentBlock()
+ default:
+ from = api.eth.blockchain.GetBlockByNumber(uint64(start))
+ }
+ switch end {
+ case rpc.PendingBlockNumber:
+ to = api.eth.miner.PendingBlock()
+ case rpc.LatestBlockNumber:
+ to = api.eth.blockchain.CurrentBlock()
+ default:
+ to = api.eth.blockchain.GetBlockByNumber(uint64(end))
+ }
+ // Trace the chain if we've found all our blocks
+ if from == nil {
+ return nil, fmt.Errorf("starting block #%d not found", start)
+ }
+ if to == nil {
+ return nil, fmt.Errorf("end block #%d not found", end)
+ }
+ return api.traceChain(ctx, from, to, config)
+}
+
+// traceChain configures a new tracer according to the provided configuration, and
+// executes all the transactions contained within. The return value will be one item
+// per transaction, dependent on the requestd tracer.
+func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Block, config *TraceConfig) (*rpc.Subscription, error) {
+ // Tracing a chain is a **long** operation, only do with subscriptions
+ notifier, supported := rpc.NotifierFromContext(ctx)
+ if !supported {
+ return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported
+ }
+ sub := notifier.CreateSubscription()
+
+ // Ensure we have a valid starting state before doing any work
+ origin := start.NumberU64()
+ database := state.NewDatabase(api.eth.ChainDb())
+
+ if number := start.NumberU64(); number > 0 {
+ start = api.eth.blockchain.GetBlock(start.ParentHash(), start.NumberU64()-1)
+ if start == nil {
+ return nil, fmt.Errorf("parent block #%d not found", number-1)
+ }
+ }
+ statedb, err := state.New(start.Root(), database)
+ if err != nil {
+ // If the starting state is missing, allow some number of blocks to be reexecuted
+ reexec := defaultTraceReexec
+ if config != nil && config.Reexec != nil {
+ reexec = *config.Reexec
+ }
+ // Find the most recent block that has the state available
+ for i := uint64(0); i < reexec; i++ {
+ start = api.eth.blockchain.GetBlock(start.ParentHash(), start.NumberU64()-1)
+ if start == nil {
+ break
+ }
+ if statedb, err = state.New(start.Root(), database); err == nil {
+ break
+ }
+ }
+ // If we still don't have the state available, bail out
+ if err != nil {
+ switch err.(type) {
+ case *trie.MissingNodeError:
+ return nil, errors.New("required historical state unavailable")
+ default:
+ return nil, err
+ }
+ }
+ }
+ // Execute all the transaction contained within the chain concurrently for each block
+ blocks := int(end.NumberU64() - origin)
+
+ threads := runtime.NumCPU()
+ if threads > blocks {
+ threads = blocks
+ }
+ var (
+ pend = new(sync.WaitGroup)
+ tasks = make(chan *blockTraceTask, threads)
+ results = make(chan *blockTraceTask, threads)
+ )
+ for th := 0; th < threads; th++ {
+ pend.Add(1)
+ go func() {
+ defer pend.Done()
+
+ // Fetch and execute the next block trace tasks
+ for task := range tasks {
+ signer := types.MakeSigner(api.config, task.block.Number())
+
+ // Trace all the transactions contained within
+ for i, tx := range task.block.Transactions() {
+ msg, _ := tx.AsMessage(signer)
+ vmctx := core.NewEVMContext(msg, task.block.Header(), api.eth.blockchain, nil)
+
+ res, err := api.traceTx(ctx, msg, vmctx, task.statedb, config)
+ if err != nil {
+ task.results[i] = &txTraceResult{Error: err.Error()}
+ log.Warn("Tracing failed", "hash", tx.Hash(), "block", task.block.NumberU64(), "err", err)
+ break
+ }
+ task.statedb.DeleteSuicides()
+ task.results[i] = &txTraceResult{Result: res}
+ }
+ // Stream the result back to the user or abort on teardown
+ select {
+ case results <- task:
+ case <-notifier.Closed():
+ return
+ }
+ }
+ }()
+ }
+ // Start a goroutine to feed all the blocks into the tracers
+ begin := time.Now()
+
+ go func() {
+ var (
+ logged time.Time
+ number uint64
+ traced uint64
+ failed error
+ proot common.Hash
+ )
+ // Ensure everything is properly cleaned up on any exit path
+ defer func() {
+ close(tasks)
+ pend.Wait()
+
+ switch {
+ case failed != nil:
+ log.Warn("Chain tracing failed", "start", start.NumberU64(), "end", end.NumberU64(), "transactions", traced, "elapsed", time.Since(begin), "err", failed)
+ case number < end.NumberU64():
+ log.Warn("Chain tracing aborted", "start", start.NumberU64(), "end", end.NumberU64(), "abort", number, "transactions", traced, "elapsed", time.Since(begin))
+ default:
+ log.Info("Chain tracing finished", "start", start.NumberU64(), "end", end.NumberU64(), "transactions", traced, "elapsed", time.Since(begin))
+ }
+ close(results)
+ }()
+ // Feed all the blocks both into the tracer, as well as fast process concurrently
+ for number = start.NumberU64() + 1; number <= end.NumberU64(); number++ {
+ // Stop tracing if interruption was requested
+ select {
+ case <-notifier.Closed():
+ return
+ default:
+ }
+ // Print progress logs if long enough time elapsed
+ if time.Since(logged) > 8*time.Second {
+ if number > origin {
+ log.Info("Tracing chain segment", "start", origin, "end", end.NumberU64(), "current", number, "transactions", traced, "elapsed", time.Since(begin), "memory", database.TrieDB().Size())
+ } else {
+ log.Info("Preparing state for chain trace", "block", number, "start", origin, "elapsed", time.Since(begin))
+ }
+ logged = time.Now()
+ }
+ // Retrieve the next block to trace
+ block := api.eth.blockchain.GetBlockByNumber(number)
+ if block == nil {
+ failed = fmt.Errorf("block #%d not found", number)
+ break
+ }
+ // Send the block over to the concurrent tracers (if not in the fast-forward phase)
+ if number > origin {
+ txs := block.Transactions()
+
+ select {
+ case tasks <- &blockTraceTask{statedb: statedb.Copy(), block: block, rootref: proot, results: make([]*txTraceResult, len(txs))}:
+ case <-notifier.Closed():
+ return
+ }
+ traced += uint64(len(txs))
+ }
+ // Generate the next state snapshot fast without tracing
+ _, _, _, err := api.eth.blockchain.Processor().Process(block, statedb, vm.Config{})
+ if err != nil {
+ failed = err
+ break
+ }
+ // Finalize the state so any modifications are written to the trie
+ root, err := statedb.Commit(true)
+ if err != nil {
+ failed = err
+ break
+ }
+ if err := statedb.Reset(root); err != nil {
+ failed = err
+ break
+ }
+ // Reference the trie twice, once for us, once for the trancer
+ database.TrieDB().Reference(root, common.Hash{})
+ if number >= origin {
+ database.TrieDB().Reference(root, common.Hash{})
+ }
+ // Dereference all past tries we ourselves are done working with
+ database.TrieDB().Dereference(proot, common.Hash{})
+ proot = root
+ }
+ }()
+
+ // Keep reading the trace results and stream the to the user
+ go func() {
+ var (
+ done = make(map[uint64]*blockTraceResult)
+ next = origin + 1
+ )
+ for res := range results {
+ // Queue up next received result
+ result := &blockTraceResult{
+ Block: hexutil.Uint64(res.block.NumberU64()),
+ Hash: res.block.Hash(),
+ Traces: res.results,
+ }
+ done[uint64(result.Block)] = result
+
+ // Dereference any paret tries held in memory by this task
+ database.TrieDB().Dereference(res.rootref, common.Hash{})
+
+ // Stream completed traces to the user, aborting on the first error
+ for result, ok := done[next]; ok; result, ok = done[next] {
+ if len(result.Traces) > 0 || next == end.NumberU64() {
+ notifier.Notify(sub.ID, result)
+ }
+ delete(done, next)
+ next++
+ }
+ }
+ }()
+ return sub, nil
+}
+
+// TraceBlockByNumber returns the structured logs created during the execution of
+// EVM and returns them as a JSON object.
+func (api *PrivateDebugAPI) TraceBlockByNumber(ctx context.Context, number rpc.BlockNumber, config *TraceConfig) ([]*txTraceResult, error) {
+ // Fetch the block that we want to trace
+ var block *types.Block
+
+ switch number {
+ case rpc.PendingBlockNumber:
+ block = api.eth.miner.PendingBlock()
+ case rpc.LatestBlockNumber:
+ block = api.eth.blockchain.CurrentBlock()
+ default:
+ block = api.eth.blockchain.GetBlockByNumber(uint64(number))
+ }
+ // Trace the block if it was found
+ if block == nil {
+ return nil, fmt.Errorf("block #%d not found", number)
+ }
+ return api.traceBlock(ctx, block, config)
+}
+
+// TraceBlockByHash returns the structured logs created during the execution of
+// EVM and returns them as a JSON object.
+func (api *PrivateDebugAPI) TraceBlockByHash(ctx context.Context, hash common.Hash, config *TraceConfig) ([]*txTraceResult, error) {
+ block := api.eth.blockchain.GetBlockByHash(hash)
+ if block == nil {
+ return nil, fmt.Errorf("block #%x not found", hash)
+ }
+ return api.traceBlock(ctx, block, config)
+}
+
+// TraceBlock returns the structured logs created during the execution of EVM
+// and returns them as a JSON object.
+func (api *PrivateDebugAPI) TraceBlock(ctx context.Context, blob []byte, config *TraceConfig) ([]*txTraceResult, error) {
+ block := new(types.Block)
+ if err := rlp.Decode(bytes.NewReader(blob), block); err != nil {
+ return nil, fmt.Errorf("could not decode block: %v", err)
+ }
+ return api.traceBlock(ctx, block, config)
+}
+
+// TraceBlockFromFile returns the structured logs created during the execution of
+// EVM and returns them as a JSON object.
+func (api *PrivateDebugAPI) TraceBlockFromFile(ctx context.Context, file string, config *TraceConfig) ([]*txTraceResult, error) {
+ blob, err := ioutil.ReadFile(file)
+ if err != nil {
+ return nil, fmt.Errorf("could not read file: %v", err)
+ }
+ return api.TraceBlock(ctx, blob, config)
+}
+
+// traceBlock configures a new tracer according to the provided configuration, and
+// executes all the transactions contained within. The return value will be one item
+// per transaction, dependent on the requestd tracer.
+func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, config *TraceConfig) ([]*txTraceResult, error) {
+ // Create the parent state database
+ if err := api.eth.engine.VerifyHeader(api.eth.blockchain, block.Header(), true); err != nil {
+ return nil, err
+ }
+ parent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1)
+ if parent == nil {
+ return nil, fmt.Errorf("parent %x not found", block.ParentHash())
+ }
+ reexec := defaultTraceReexec
+ if config != nil && config.Reexec != nil {
+ reexec = *config.Reexec
+ }
+ statedb, err := api.computeStateDB(parent, reexec)
+ if err != nil {
+ return nil, err
+ }
+ // Execute all the transaction contained within the block concurrently
+ var (
+ signer = types.MakeSigner(api.config, block.Number())
+
+ txs = block.Transactions()
+ results = make([]*txTraceResult, len(txs))
+
+ pend = new(sync.WaitGroup)
+ jobs = make(chan *txTraceTask, len(txs))
+ )
+ threads := runtime.NumCPU()
+ if threads > len(txs) {
+ threads = len(txs)
+ }
+ for th := 0; th < threads; th++ {
+ pend.Add(1)
+ go func() {
+ defer pend.Done()
+
+ // Fetch and execute the next transaction trace tasks
+ for task := range jobs {
+ msg, _ := txs[task.index].AsMessage(signer)
+ vmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)
+
+ res, err := api.traceTx(ctx, msg, vmctx, task.statedb, config)
+ if err != nil {
+ results[task.index] = &txTraceResult{Error: err.Error()}
+ continue
+ }
+ results[task.index] = &txTraceResult{Result: res}
+ }
+ }()
+ }
+ // Feed the transactions into the tracers and return
+ var failed error
+ for i, tx := range txs {
+ // Send the trace task over for execution
+ jobs <- &txTraceTask{statedb: statedb.Copy(), index: i}
+
+ // Generate the next state snapshot fast without tracing
+ msg, _ := tx.AsMessage(signer)
+ vmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)
+
+ vmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{})
+ if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil {
+ failed = err
+ break
+ }
+ // Finalize the state so any modifications are written to the trie
+ statedb.Finalise(true)
+ }
+ close(jobs)
+ pend.Wait()
+
+ // If execution failed in between, abort
+ if failed != nil {
+ return nil, failed
+ }
+ return results, nil
+}
+
+// computeStateDB retrieves the state database associated with a certain block.
+// If no state is locally available for the given block, a number of blocks are
+// attempted to be reexecuted to generate the desired state.
+func (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (*state.StateDB, error) {
+ // If we have the state fully available, use that
+ statedb, err := api.eth.blockchain.StateAt(block.Root())
+ if err == nil {
+ return statedb, nil
+ }
+ // Otherwise try to reexec blocks until we find a state or reach our limit
+ origin := block.NumberU64()
+ database := state.NewDatabase(api.eth.ChainDb())
+
+ for i := uint64(0); i < reexec; i++ {
+ block = api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1)
+ if block == nil {
+ break
+ }
+ if statedb, err = state.New(block.Root(), database); err == nil {
+ break
+ }
+ }
+ if err != nil {
+ switch err.(type) {
+ case *trie.MissingNodeError:
+ return nil, errors.New("required historical state unavailable")
+ default:
+ return nil, err
+ }
+ }
+ // State was available at historical point, regenerate
+ var (
+ start = time.Now()
+ logged time.Time
+ proot common.Hash
+ )
+ for block.NumberU64() < origin {
+ // Print progress logs if long enough time elapsed
+ if time.Since(logged) > 8*time.Second {
+ log.Info("Regenerating historical state", "block", block.NumberU64()+1, "target", origin, "elapsed", time.Since(start))
+ logged = time.Now()
+ }
+ // Retrieve the next block to regenerate and process it
+ if block = api.eth.blockchain.GetBlockByNumber(block.NumberU64() + 1); block == nil {
+ return nil, fmt.Errorf("block #%d not found", block.NumberU64()+1)
+ }
+ _, _, _, err := api.eth.blockchain.Processor().Process(block, statedb, vm.Config{})
+ if err != nil {
+ return nil, err
+ }
+ // Finalize the state so any modifications are written to the trie
+ root, err := statedb.Commit(true)
+ if err != nil {
+ return nil, err
+ }
+ if err := statedb.Reset(root); err != nil {
+ return nil, err
+ }
+ database.TrieDB().Reference(root, common.Hash{})
+ database.TrieDB().Dereference(proot, common.Hash{})
+ proot = root
+ }
+ log.Info("Historical state regenerated", "block", block.NumberU64(), "elapsed", time.Since(start), "size", database.TrieDB().Size())
+ return statedb, nil
+}
+
+// TraceTransaction returns the structured logs created during the execution of EVM
+// and returns them as a JSON object.
+func (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig) (interface{}, error) {
+ // Retrieve the transaction and assemble its EVM context
+ tx, blockHash, _, index := core.GetTransaction(api.eth.ChainDb(), hash)
+ if tx == nil {
+ return nil, fmt.Errorf("transaction %x not found", hash)
+ }
+ reexec := defaultTraceReexec
+ if config != nil && config.Reexec != nil {
+ reexec = *config.Reexec
+ }
+ msg, vmctx, statedb, err := api.computeTxEnv(blockHash, int(index), reexec)
+ if err != nil {
+ return nil, err
+ }
+ // Trace the transaction and return
+ return api.traceTx(ctx, msg, vmctx, statedb, config)
+}
+
+// traceTx configures a new tracer according to the provided configuration, and
+// executes the given message in the provided environment. The return value will
+// be tracer dependent.
+func (api *PrivateDebugAPI) traceTx(ctx context.Context, message core.Message, vmctx vm.Context, statedb *state.StateDB, config *TraceConfig) (interface{}, error) {
+ // Assemble the structured logger or the JavaScript tracer
+ var (
+ tracer vm.Tracer
+ err error
+ )
+ switch {
+ case config != nil && config.Tracer != nil:
+ // Define a meaningful timeout of a single transaction trace
+ timeout := defaultTraceTimeout
+ if config.Timeout != nil {
+ if timeout, err = time.ParseDuration(*config.Timeout); err != nil {
+ return nil, err
+ }
+ }
+ // Constuct the JavaScript tracer to execute with
+ if tracer, err = tracers.New(*config.Tracer); err != nil {
+ return nil, err
+ }
+ // Handle timeouts and RPC cancellations
+ deadlineCtx, cancel := context.WithTimeout(ctx, timeout)
+ go func() {
+ <-deadlineCtx.Done()
+ tracer.(*tracers.Tracer).Stop(errors.New("execution timeout"))
+ }()
+ defer cancel()
+
+ case config == nil:
+ tracer = vm.NewStructLogger(nil)
+
+ default:
+ tracer = vm.NewStructLogger(config.LogConfig)
+ }
+ // Run the transaction with tracing enabled.
+ vmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{Debug: true, Tracer: tracer})
+
+ ret, gas, failed, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas()))
+ if err != nil {
+ return nil, fmt.Errorf("tracing failed: %v", err)
+ }
+ // Depending on the tracer type, format and return the output
+ switch tracer := tracer.(type) {
+ case *vm.StructLogger:
+ return &ethapi.ExecutionResult{
+ Gas: gas,
+ Failed: failed,
+ ReturnValue: fmt.Sprintf("%x", ret),
+ StructLogs: ethapi.FormatLogs(tracer.StructLogs()),
+ }, nil
+
+ case *tracers.Tracer:
+ return tracer.GetResult()
+
+ default:
+ panic(fmt.Sprintf("bad tracer type %T", tracer))
+ }
+}
+
+// computeTxEnv returns the execution environment of a certain transaction.
+func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, reexec uint64) (core.Message, vm.Context, *state.StateDB, error) {
+ // Create the parent state database
+ block := api.eth.blockchain.GetBlockByHash(blockHash)
+ if block == nil {
+ return nil, vm.Context{}, nil, fmt.Errorf("block %x not found", blockHash)
+ }
+ parent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1)
+ if parent == nil {
+ return nil, vm.Context{}, nil, fmt.Errorf("parent %x not found", block.ParentHash())
+ }
+ statedb, err := api.computeStateDB(parent, reexec)
+ if err != nil {
+ return nil, vm.Context{}, nil, err
+ }
+ // Recompute transactions up to the target index.
+ signer := types.MakeSigner(api.config, block.Number())
+
+ for idx, tx := range block.Transactions() {
+ // Assemble the transaction call message and return if the requested offset
+ msg, _ := tx.AsMessage(signer)
+ context := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)
+ if idx == txIndex {
+ return msg, context, statedb, nil
+ }
+ // Not yet the searched for transaction, execute on top of the current state
+ vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{})
+ if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil {
+ return nil, vm.Context{}, nil, fmt.Errorf("tx %x failed: %v", tx.Hash(), err)
+ }
+ statedb.DeleteSuicides()
+ }
+ return nil, vm.Context{}, nil, fmt.Errorf("tx index %d out of range for block %x", txIndex, blockHash)
+}
diff --git a/eth/backend.go b/eth/backend.go
index c39974a2c..94aad2310 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -144,9 +144,11 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
}
core.WriteBlockChainVersion(chainDb, core.BlockChainVersion)
}
-
- vmConfig := vm.Config{EnablePreimageRecording: config.EnablePreimageRecording}
- eth.blockchain, err = core.NewBlockChain(chainDb, eth.chainConfig, eth.engine, vmConfig)
+ var (
+ vmConfig = vm.Config{EnablePreimageRecording: config.EnablePreimageRecording}
+ cacheConfig = &core.CacheConfig{Disabled: config.NoPruning, TrieNodeLimit: config.TrieCache, TrieTimeLimit: config.TrieTimeout}
+ )
+ eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, eth.chainConfig, eth.engine, vmConfig)
if err != nil {
return nil, err
}
@@ -393,10 +395,10 @@ func (s *Ethereum) Start(srvr *p2p.Server) error {
// Figure out a max peers count based on the server limits
maxPeers := srvr.MaxPeers
if s.config.LightServ > 0 {
- maxPeers -= s.config.LightPeers
- if maxPeers < srvr.MaxPeers/2 {
- maxPeers = srvr.MaxPeers / 2
+ if s.config.LightPeers >= srvr.MaxPeers {
+ return fmt.Errorf("invalid peer config: light peer count (%d) >= total peer count (%d)", s.config.LightPeers, srvr.MaxPeers)
}
+ maxPeers -= s.config.LightPeers
}
// Start the networking layer and the light server if requested
s.protocolManager.Start(maxPeers)
diff --git a/eth/bind.go b/eth/bind.go
deleted file mode 100644
index d09977dbc..000000000
--- a/eth/bind.go
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-package eth
-
-import (
- "context"
- "math/big"
-
- "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/internal/ethapi"
- "github.com/ethereum/go-ethereum/rlp"
- "github.com/ethereum/go-ethereum/rpc"
-)
-
-// ContractBackend implements bind.ContractBackend with direct calls to Ethereum
-// internals to support operating on contracts within subprotocols like eth and
-// swarm.
-//
-// Internally this backend uses the already exposed API endpoints of the Ethereum
-// object. These should be rewritten to internal Go method calls when the Go API
-// is refactored to support a clean library use.
-type ContractBackend struct {
- eapi *ethapi.PublicEthereumAPI // Wrapper around the Ethereum object to access metadata
- bcapi *ethapi.PublicBlockChainAPI // Wrapper around the blockchain to access chain data
- txapi *ethapi.PublicTransactionPoolAPI // Wrapper around the transaction pool to access transaction data
-}
-
-// NewContractBackend creates a new native contract backend using an existing
-// Ethereum object.
-func NewContractBackend(apiBackend ethapi.Backend) *ContractBackend {
- return &ContractBackend{
- eapi: ethapi.NewPublicEthereumAPI(apiBackend),
- bcapi: ethapi.NewPublicBlockChainAPI(apiBackend),
- txapi: ethapi.NewPublicTransactionPoolAPI(apiBackend, new(ethapi.AddrLocker)),
- }
-}
-
-// CodeAt retrieves any code associated with the contract from the local API.
-func (b *ContractBackend) CodeAt(ctx context.Context, contract common.Address, blockNum *big.Int) ([]byte, error) {
- return b.bcapi.GetCode(ctx, contract, toBlockNumber(blockNum))
-}
-
-// CodeAt retrieves any code associated with the contract from the local API.
-func (b *ContractBackend) PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error) {
- return b.bcapi.GetCode(ctx, contract, rpc.PendingBlockNumber)
-}
-
-// ContractCall implements bind.ContractCaller executing an Ethereum contract
-// call with the specified data as the input. The pending flag requests execution
-// against the pending block, not the stable head of the chain.
-func (b *ContractBackend) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNum *big.Int) ([]byte, error) {
- out, err := b.bcapi.Call(ctx, toCallArgs(msg), toBlockNumber(blockNum))
- return out, err
-}
-
-// ContractCall implements bind.ContractCaller executing an Ethereum contract
-// call with the specified data as the input. The pending flag requests execution
-// against the pending block, not the stable head of the chain.
-func (b *ContractBackend) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
- out, err := b.bcapi.Call(ctx, toCallArgs(msg), rpc.PendingBlockNumber)
- return out, err
-}
-
-func toCallArgs(msg ethereum.CallMsg) ethapi.CallArgs {
- args := ethapi.CallArgs{
- To: msg.To,
- From: msg.From,
- Data: msg.Data,
- }
- if msg.Gas != nil {
- args.Gas = hexutil.Big(*msg.Gas)
- }
- if msg.GasPrice != nil {
- args.GasPrice = hexutil.Big(*msg.GasPrice)
- }
- if msg.Value != nil {
- args.Value = hexutil.Big(*msg.Value)
- }
- return args
-}
-
-func toBlockNumber(num *big.Int) rpc.BlockNumber {
- if num == nil {
- return rpc.LatestBlockNumber
- }
- return rpc.BlockNumber(num.Int64())
-}
-
-// PendingAccountNonce implements bind.ContractTransactor retrieving the current
-// pending nonce associated with an account.
-func (b *ContractBackend) PendingNonceAt(ctx context.Context, account common.Address) (nonce uint64, err error) {
- out, err := b.txapi.GetTransactionCount(ctx, account, rpc.PendingBlockNumber)
- if out != nil {
- nonce = uint64(*out)
- }
- return nonce, err
-}
-
-// SuggestGasPrice implements bind.ContractTransactor retrieving the currently
-// suggested gas price to allow a timely execution of a transaction.
-func (b *ContractBackend) SuggestGasPrice(ctx context.Context) (*big.Int, error) {
- return b.eapi.GasPrice(ctx)
-}
-
-// EstimateGasLimit implements bind.ContractTransactor triing to estimate the gas
-// needed to execute a specific transaction based on the current pending state of
-// the backend blockchain. There is no guarantee that this is the true gas limit
-// requirement as other transactions may be added or removed by miners, but it
-// should provide a basis for setting a reasonable default.
-func (b *ContractBackend) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (*big.Int, error) {
- out, err := b.bcapi.EstimateGas(ctx, toCallArgs(msg))
- return out.ToInt(), err
-}
-
-// SendTransaction implements bind.ContractTransactor injects the transaction
-// into the pending pool for execution.
-func (b *ContractBackend) SendTransaction(ctx context.Context, tx *types.Transaction) error {
- raw, _ := rlp.EncodeToBytes(tx)
- _, err := b.txapi.SendRawTransaction(ctx, raw)
- return err
-}
diff --git a/eth/config.go b/eth/config.go
index 383cd6783..dd7f42c7d 100644
--- a/eth/config.go
+++ b/eth/config.go
@@ -22,6 +22,7 @@ import (
"os/user"
"path/filepath"
"runtime"
+ "time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
@@ -43,14 +44,16 @@ var DefaultConfig = Config{
DatasetsOnDisk: 2,
},
NetworkId: 1,
- LightPeers: 20,
- DatabaseCache: 128,
+ LightPeers: 100,
+ DatabaseCache: 768,
+ TrieCache: 256,
+ TrieTimeout: 5 * time.Minute,
GasPrice: big.NewInt(18 * params.Shannon),
TxPool: core.DefaultTxPoolConfig,
GPO: gasprice.Config{
- Blocks: 10,
- Percentile: 50,
+ Blocks: 20,
+ Percentile: 60,
},
}
@@ -78,6 +81,7 @@ type Config struct {
// Protocol options
NetworkId uint64 // Network ID to use for selecting peers to connect to
SyncMode downloader.SyncMode
+ NoPruning bool
// Light client options
LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests
@@ -87,6 +91,8 @@ type Config struct {
SkipBcVersionCheck bool `toml:"-"`
DatabaseHandles int `toml:"-"`
DatabaseCache int
+ TrieCache int
+ TrieTimeout time.Duration
// Mining-related options
Etherbase common.Address `toml:",omitempty"`
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index b338129e0..7f490d9e9 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -18,10 +18,8 @@
package downloader
import (
- "crypto/rand"
"errors"
"fmt"
- "math"
"math/big"
"sync"
"sync/atomic"
@@ -61,12 +59,11 @@ var (
maxHeadersProcess = 2048 // Number of header download results to import at once into the chain
maxResultsProcess = 2048 // Number of content download results to import at once into the chain
- fsHeaderCheckFrequency = 100 // Verification frequency of the downloaded headers during fast sync
- fsHeaderSafetyNet = 2048 // Number of headers to discard in case a chain violation is detected
- fsHeaderForceVerify = 24 // Number of headers to verify before and after the pivot to accept it
- fsPivotInterval = 256 // Number of headers out of which to randomize the pivot point
- fsMinFullBlocks = 64 // Number of blocks to retrieve fully even in fast sync
- fsCriticalTrials = uint32(32) // Number of times to retry in the cricical section before bailing
+ fsHeaderCheckFrequency = 100 // Verification frequency of the downloaded headers during fast sync
+ fsHeaderSafetyNet = 2048 // Number of headers to discard in case a chain violation is detected
+ fsHeaderForceVerify = 24 // Number of headers to verify before and after the pivot to accept it
+ fsHeaderContCheck = 3 * time.Second // Time interval to check for header continuations during state download
+ fsMinFullBlocks = 64 // Number of blocks to retrieve fully even in fast sync
)
var (
@@ -102,9 +99,6 @@ type Downloader struct {
peers *peerSet // Set of active peers from which download can proceed
stateDB ethdb.Database
- fsPivotLock *types.Header // Pivot header on critical section entry (cannot change between retries)
- fsPivotFails uint32 // Number of subsequent fast sync failures in the critical section
-
rttEstimate uint64 // Round trip time to target for download requests
rttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops)
@@ -124,6 +118,7 @@ type Downloader struct {
synchroniseMock func(id string, hash common.Hash) error // Replacement for synchronise during testing
synchronising int32
notified int32
+ committed int32
// Channels
headerCh chan dataPack // [eth/62] Channel receiving inbound block headers
@@ -156,7 +151,7 @@ type Downloader struct {
// LightChain encapsulates functions required to synchronise a light chain.
type LightChain interface {
// HasHeader verifies a header's presence in the local chain.
- HasHeader(h common.Hash, number uint64) bool
+ HasHeader(common.Hash, uint64) bool
// GetHeaderByHash retrieves a header from the local chain.
GetHeaderByHash(common.Hash) *types.Header
@@ -164,8 +159,8 @@ type LightChain interface {
// CurrentHeader retrieves the head header from the local chain.
CurrentHeader() *types.Header
- // GetTdByHash returns the total difficulty of a local block.
- GetTdByHash(common.Hash) *big.Int
+ // GetTd returns the total difficulty of a local block.
+ GetTd(common.Hash, uint64) *big.Int
// InsertHeaderChain inserts a batch of headers into the local chain.
InsertHeaderChain([]*types.Header, int) (int, error)
@@ -179,7 +174,7 @@ type BlockChain interface {
LightChain
// HasBlockAndState verifies block and associated states' presence in the local chain.
- HasBlockAndState(common.Hash) bool
+ HasBlockAndState(common.Hash, uint64) bool
// GetBlockByHash retrieves a block from the local chain.
GetBlockByHash(common.Hash) *types.Block
@@ -324,8 +319,13 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode
errEmptyHeaderSet, errPeersUnavailable, errTooOld,
errInvalidAncestor, errInvalidChain:
log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err)
- d.dropPeer(id)
-
+ if d.dropPeer == nil {
+ // The dropPeer method is nil when `--copydb` is used for a local copy.
+ // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored
+ log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", id)
+ } else {
+ d.dropPeer(id)
+ }
default:
log.Warn("Synchronisation failed, retrying", "err", err)
}
@@ -386,9 +386,7 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode
// Set the requested sync mode, unless it's forbidden
d.mode = mode
- if d.mode == FastSync && atomic.LoadUint32(&d.fsPivotFails) >= fsCriticalTrials {
- d.mode = FullSync
- }
+
// Retrieve the origin peer and initiate the downloading process
p := d.peers.Peer(id)
if p == nil {
@@ -436,57 +434,40 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I
d.syncStatsChainHeight = height
d.syncStatsLock.Unlock()
- // Initiate the sync using a concurrent header and content retrieval algorithm
+ // Ensure our origin point is below any fast sync pivot point
pivot := uint64(0)
- switch d.mode {
- case LightSync:
- pivot = height
- case FastSync:
- // Calculate the new fast/slow sync pivot point
- if d.fsPivotLock == nil {
- pivotOffset, err := rand.Int(rand.Reader, big.NewInt(int64(fsPivotInterval)))
- if err != nil {
- panic(fmt.Sprintf("Failed to access crypto random source: %v", err))
- }
- if height > uint64(fsMinFullBlocks)+pivotOffset.Uint64() {
- pivot = height - uint64(fsMinFullBlocks) - pivotOffset.Uint64()
- }
+ if d.mode == FastSync {
+ if height <= uint64(fsMinFullBlocks) {
+ origin = 0
} else {
- // Pivot point locked in, use this and do not pick a new one!
- pivot = d.fsPivotLock.Number.Uint64()
- }
- // If the point is below the origin, move origin back to ensure state download
- if pivot < origin {
- if pivot > 0 {
+ pivot = height - uint64(fsMinFullBlocks)
+ if pivot <= origin {
origin = pivot - 1
- } else {
- origin = 0
}
}
- log.Debug("Fast syncing until pivot block", "pivot", pivot)
}
- d.queue.Prepare(origin+1, d.mode, pivot, latest)
+ d.committed = 1
+ if d.mode == FastSync && pivot != 0 {
+ d.committed = 0
+ }
+ // Initiate the sync using a concurrent header and content retrieval algorithm
+ d.queue.Prepare(origin+1, d.mode)
if d.syncInitHook != nil {
d.syncInitHook(origin, height)
}
fetchers := []func() error{
- func() error { return d.fetchHeaders(p, origin+1) }, // Headers are always retrieved
- func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and fast sync
- func() error { return d.fetchReceipts(origin + 1) }, // Receipts are retrieved during fast sync
- func() error { return d.processHeaders(origin+1, td) },
+ func() error { return d.fetchHeaders(p, origin+1, pivot) }, // Headers are always retrieved
+ func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and fast sync
+ func() error { return d.fetchReceipts(origin + 1) }, // Receipts are retrieved during fast sync
+ func() error { return d.processHeaders(origin+1, pivot, td) },
}
if d.mode == FastSync {
fetchers = append(fetchers, func() error { return d.processFastSyncContent(latest) })
} else if d.mode == FullSync {
fetchers = append(fetchers, d.processFullSyncContent)
}
- err = d.spawnSync(fetchers)
- if err != nil && d.mode == FastSync && d.fsPivotLock != nil {
- // If sync failed in the critical section, bump the fail counter.
- atomic.AddUint32(&d.fsPivotFails, 1)
- }
- return err
+ return d.spawnSync(fetchers)
}
// spawnSync runs d.process and all given fetcher functions to completion in
@@ -666,7 +647,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err
continue
}
// Otherwise check if we already know the header or not
- if (d.mode == FullSync && d.blockchain.HasBlockAndState(headers[i].Hash())) || (d.mode != FullSync && d.lightchain.HasHeader(headers[i].Hash(), headers[i].Number.Uint64())) {
+ if (d.mode == FullSync && d.blockchain.HasBlockAndState(headers[i].Hash(), headers[i].Number.Uint64())) || (d.mode != FullSync && d.lightchain.HasHeader(headers[i].Hash(), headers[i].Number.Uint64())) {
number, hash = headers[i].Number.Uint64(), headers[i].Hash()
// If every header is known, even future ones, the peer straight out lied about its head
@@ -731,7 +712,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err
arrived = true
// Modify the search interval based on the response
- if (d.mode == FullSync && !d.blockchain.HasBlockAndState(headers[0].Hash())) || (d.mode != FullSync && !d.lightchain.HasHeader(headers[0].Hash(), headers[0].Number.Uint64())) {
+ if (d.mode == FullSync && !d.blockchain.HasBlockAndState(headers[0].Hash(), headers[0].Number.Uint64())) || (d.mode != FullSync && !d.lightchain.HasHeader(headers[0].Hash(), headers[0].Number.Uint64())) {
end = check
break
}
@@ -769,7 +750,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err
// other peers are only accepted if they map cleanly to the skeleton. If no one
// can fill in the skeleton - not even the origin peer - it's assumed invalid and
// the origin is dropped.
-func (d *Downloader) fetchHeaders(p *peerConnection, from uint64) error {
+func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) error {
p.log.Debug("Directing header downloads", "origin", from)
defer p.log.Debug("Header download terminated")
@@ -820,6 +801,18 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64) error {
}
// If no more headers are inbound, notify the content fetchers and return
if packet.Items() == 0 {
+ // Don't abort header fetches while the pivot is downloading
+ if atomic.LoadInt32(&d.committed) == 0 && pivot <= from {
+ p.log.Debug("No headers, waiting for pivot commit")
+ select {
+ case <-time.After(fsHeaderContCheck):
+ getHeaders(from)
+ continue
+ case <-d.cancelCh:
+ return errCancelHeaderFetch
+ }
+ }
+ // Pivot done (or not in fast sync) and no more headers, terminate the process
p.log.Debug("No more headers available")
select {
case d.headerProcCh <- nil:
@@ -853,6 +846,12 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64) error {
getHeaders(from)
case <-timeout.C:
+ if d.dropPeer == nil {
+ // The dropPeer method is nil when `--copydb` is used for a local copy.
+ // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored
+ p.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", p.id)
+ break
+ }
// Header retrieval timed out, consider the peer bad and drop
p.log.Debug("Header request timed out", "elapsed", ttl)
headerTimeoutMeter.Mark(1)
@@ -1071,7 +1070,13 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv
setIdle(peer, 0)
} else {
peer.log.Debug("Stalling delivery, dropping", "type", kind)
- d.dropPeer(pid)
+ if d.dropPeer == nil {
+ // The dropPeer method is nil when `--copydb` is used for a local copy.
+ // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored
+ peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", pid)
+ } else {
+ d.dropPeer(pid)
+ }
}
}
}
@@ -1112,10 +1117,8 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv
}
if request.From > 0 {
peer.log.Trace("Requesting new batch of data", "type", kind, "from", request.From)
- } else if len(request.Headers) > 0 {
- peer.log.Trace("Requesting new batch of data", "type", kind, "count", len(request.Headers), "from", request.Headers[0].Number)
} else {
- peer.log.Trace("Requesting new batch of data", "type", kind, "count", len(request.Hashes))
+ peer.log.Trace("Requesting new batch of data", "type", kind, "count", len(request.Headers), "from", request.Headers[0].Number)
}
// Fetch the chunk and make sure any errors return the hashes to the queue
if fetchHook != nil {
@@ -1143,10 +1146,7 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv
// processHeaders takes batches of retrieved headers from an input channel and
// keeps processing and scheduling them into the header chain and downloader's
// queue until the stream ends or a failure occurs.
-func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
- // Calculate the pivoting point for switching from fast to slow sync
- pivot := d.queue.FastSyncPivot()
-
+func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) error {
// Keep a count of uncertain headers to roll back
rollback := []*types.Header{}
defer func() {
@@ -1171,19 +1171,6 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
"header", fmt.Sprintf("%d->%d", lastHeader, d.lightchain.CurrentHeader().Number),
"fast", fmt.Sprintf("%d->%d", lastFastBlock, curFastBlock),
"block", fmt.Sprintf("%d->%d", lastBlock, curBlock))
-
- // If we're already past the pivot point, this could be an attack, thread carefully
- if rollback[len(rollback)-1].Number.Uint64() > pivot {
- // If we didn't ever fail, lock in the pivot header (must! not! change!)
- if atomic.LoadUint32(&d.fsPivotFails) == 0 {
- for _, header := range rollback {
- if header.Number.Uint64() == pivot {
- log.Warn("Fast-sync pivot locked in", "number", pivot, "hash", header.Hash())
- d.fsPivotLock = header
- }
- }
- }
- }
}
}()
@@ -1218,7 +1205,8 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
// L: Request new headers up from 11 (R's TD was higher, it must have something)
// R: Nothing to give
if d.mode != LightSync {
- if !gotHeaders && td.Cmp(d.blockchain.GetTdByHash(d.blockchain.CurrentBlock().Hash())) > 0 {
+ head := d.blockchain.CurrentBlock()
+ if !gotHeaders && td.Cmp(d.blockchain.GetTd(head.Hash(), head.NumberU64())) > 0 {
return errStallingPeer
}
}
@@ -1230,7 +1218,8 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
// queued for processing when the header download completes. However, as long as the
// peer gave us something useful, we're already happy/progressed (above check).
if d.mode == FastSync || d.mode == LightSync {
- if td.Cmp(d.lightchain.GetTdByHash(d.lightchain.CurrentHeader().Hash())) > 0 {
+ head := d.lightchain.CurrentHeader()
+ if td.Cmp(d.lightchain.GetTd(head.Hash(), head.Number.Uint64())) > 0 {
return errStallingPeer
}
}
@@ -1283,13 +1272,6 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
rollback = append(rollback[:0], rollback[len(rollback)-fsHeaderSafetyNet:]...)
}
}
- // If we're fast syncing and just pulled in the pivot, make sure it's the one locked in
- if d.mode == FastSync && d.fsPivotLock != nil && chunk[0].Number.Uint64() <= pivot && chunk[len(chunk)-1].Number.Uint64() >= pivot {
- if pivot := chunk[int(pivot-chunk[0].Number.Uint64())]; pivot.Hash() != d.fsPivotLock.Hash() {
- log.Warn("Pivot doesn't match locked in one", "remoteNumber", pivot.Number, "remoteHash", pivot.Hash(), "localNumber", d.fsPivotLock.Number, "localHash", d.fsPivotLock.Hash())
- return errInvalidChain
- }
- }
// Unless we're doing light chains, schedule the headers for associated content retrieval
if d.mode == FullSync || d.mode == FastSync {
// If we've reached the allowed number of pending headers, stall a bit
@@ -1324,7 +1306,7 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
// processFullSyncContent takes fetch results from the queue and imports them into the chain.
func (d *Downloader) processFullSyncContent() error {
for {
- results := d.queue.WaitResults()
+ results := d.queue.Results(true)
if len(results) == 0 {
return nil
}
@@ -1338,30 +1320,28 @@ func (d *Downloader) processFullSyncContent() error {
}
func (d *Downloader) importBlockResults(results []*fetchResult) error {
- for len(results) != 0 {
- // Check for any termination requests. This makes clean shutdown faster.
- select {
- case <-d.quitCh:
- return errCancelContentProcessing
- default:
- }
- // Retrieve the a batch of results to import
- items := int(math.Min(float64(len(results)), float64(maxResultsProcess)))
- first, last := results[0].Header, results[items-1].Header
- log.Debug("Inserting downloaded chain", "items", len(results),
- "firstnum", first.Number, "firsthash", first.Hash(),
- "lastnum", last.Number, "lasthash", last.Hash(),
- )
- blocks := make([]*types.Block, items)
- for i, result := range results[:items] {
- blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles)
- }
- if index, err := d.blockchain.InsertChain(blocks); err != nil {
- log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err)
- return errInvalidChain
- }
- // Shift the results to the next batch
- results = results[items:]
+ // Check for any early termination requests
+ if len(results) == 0 {
+ return nil
+ }
+ select {
+ case <-d.quitCh:
+ return errCancelContentProcessing
+ default:
+ }
+ // Retrieve the a batch of results to import
+ first, last := results[0].Header, results[len(results)-1].Header
+ log.Debug("Inserting downloaded chain", "items", len(results),
+ "firstnum", first.Number, "firsthash", first.Hash(),
+ "lastnum", last.Number, "lasthash", last.Hash(),
+ )
+ blocks := make([]*types.Block, len(results))
+ for i, result := range results {
+ blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles)
+ }
+ if index, err := d.blockchain.InsertChain(blocks); err != nil {
+ log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err)
+ return errInvalidChain
}
return nil
}
@@ -1369,35 +1349,92 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error {
// processFastSyncContent takes fetch results from the queue and writes them to the
// database. It also controls the synchronisation of state nodes of the pivot block.
func (d *Downloader) processFastSyncContent(latest *types.Header) error {
- // Start syncing state of the reported head block.
- // This should get us most of the state of the pivot block.
+ // Start syncing state of the reported head block. This should get us most of
+ // the state of the pivot block.
stateSync := d.syncState(latest.Root)
defer stateSync.Cancel()
go func() {
- if err := stateSync.Wait(); err != nil {
+ if err := stateSync.Wait(); err != nil && err != errCancelStateFetch {
d.queue.Close() // wake up WaitResults
}
}()
-
- pivot := d.queue.FastSyncPivot()
+ // Figure out the ideal pivot block. Note, that this goalpost may move if the
+ // sync takes long enough for the chain head to move significantly.
+ pivot := uint64(0)
+ if height := latest.Number.Uint64(); height > uint64(fsMinFullBlocks) {
+ pivot = height - uint64(fsMinFullBlocks)
+ }
+ // To cater for moving pivot points, track the pivot block and subsequently
+ // accumulated download results separatey.
+ var (
+ oldPivot *fetchResult // Locked in pivot block, might change eventually
+ oldTail []*fetchResult // Downloaded content after the pivot
+ )
for {
- results := d.queue.WaitResults()
+ // Wait for the next batch of downloaded data to be available, and if the pivot
+ // block became stale, move the goalpost
+ results := d.queue.Results(oldPivot == nil) // Block if we're not monitoring pivot staleness
if len(results) == 0 {
- return stateSync.Cancel()
+ // If pivot sync is done, stop
+ if oldPivot == nil {
+ return stateSync.Cancel()
+ }
+ // If sync failed, stop
+ select {
+ case <-d.cancelCh:
+ return stateSync.Cancel()
+ default:
+ }
}
if d.chainInsertHook != nil {
d.chainInsertHook(results)
}
+ if oldPivot != nil {
+ results = append(append([]*fetchResult{oldPivot}, oldTail...), results...)
+ }
+ // Split around the pivot block and process the two sides via fast/full sync
+ if atomic.LoadInt32(&d.committed) == 0 {
+ latest = results[len(results)-1].Header
+ if height := latest.Number.Uint64(); height > pivot+2*uint64(fsMinFullBlocks) {
+ log.Warn("Pivot became stale, moving", "old", pivot, "new", height-uint64(fsMinFullBlocks))
+ pivot = height - uint64(fsMinFullBlocks)
+ }
+ }
P, beforeP, afterP := splitAroundPivot(pivot, results)
if err := d.commitFastSyncData(beforeP, stateSync); err != nil {
return err
}
if P != nil {
- stateSync.Cancel()
- if err := d.commitPivotBlock(P); err != nil {
- return err
+ // If new pivot block found, cancel old state retrieval and restart
+ if oldPivot != P {
+ stateSync.Cancel()
+
+ stateSync = d.syncState(P.Header.Root)
+ defer stateSync.Cancel()
+ go func() {
+ if err := stateSync.Wait(); err != nil && err != errCancelStateFetch {
+ d.queue.Close() // wake up WaitResults
+ }
+ }()
+ oldPivot = P
+ }
+ // Wait for completion, occasionally checking for pivot staleness
+ select {
+ case <-stateSync.done:
+ if stateSync.err != nil {
+ return stateSync.err
+ }
+ if err := d.commitPivotBlock(P); err != nil {
+ return err
+ }
+ oldPivot = nil
+
+ case <-time.After(time.Second):
+ oldTail = afterP
+ continue
}
}
+ // Fast sync done, pivot commit done, full import
if err := d.importBlockResults(afterP); err != nil {
return err
}
@@ -1420,52 +1457,49 @@ func splitAroundPivot(pivot uint64, results []*fetchResult) (p *fetchResult, bef
}
func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *stateSync) error {
- for len(results) != 0 {
- // Check for any termination requests.
- select {
- case <-d.quitCh:
- return errCancelContentProcessing
- case <-stateSync.done:
- if err := stateSync.Wait(); err != nil {
- return err
- }
- default:
- }
- // Retrieve the a batch of results to import
- items := int(math.Min(float64(len(results)), float64(maxResultsProcess)))
- first, last := results[0].Header, results[items-1].Header
- log.Debug("Inserting fast-sync blocks", "items", len(results),
- "firstnum", first.Number, "firsthash", first.Hash(),
- "lastnumn", last.Number, "lasthash", last.Hash(),
- )
- blocks := make([]*types.Block, items)
- receipts := make([]types.Receipts, items)
- for i, result := range results[:items] {
- blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles)
- receipts[i] = result.Receipts
- }
- if index, err := d.blockchain.InsertReceiptChain(blocks, receipts); err != nil {
- log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err)
- return errInvalidChain
+ // Check for any early termination requests
+ if len(results) == 0 {
+ return nil
+ }
+ select {
+ case <-d.quitCh:
+ return errCancelContentProcessing
+ case <-stateSync.done:
+ if err := stateSync.Wait(); err != nil {
+ return err
}
- // Shift the results to the next batch
- results = results[items:]
+ default:
+ }
+ // Retrieve the a batch of results to import
+ first, last := results[0].Header, results[len(results)-1].Header
+ log.Debug("Inserting fast-sync blocks", "items", len(results),
+ "firstnum", first.Number, "firsthash", first.Hash(),
+ "lastnumn", last.Number, "lasthash", last.Hash(),
+ )
+ blocks := make([]*types.Block, len(results))
+ receipts := make([]types.Receipts, len(results))
+ for i, result := range results {
+ blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles)
+ receipts[i] = result.Receipts
+ }
+ if index, err := d.blockchain.InsertReceiptChain(blocks, receipts); err != nil {
+ log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err)
+ return errInvalidChain
}
return nil
}
func (d *Downloader) commitPivotBlock(result *fetchResult) error {
- b := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles)
- // Sync the pivot block state. This should complete reasonably quickly because
- // we've already synced up to the reported head block state earlier.
- if err := d.syncState(b.Root()).Wait(); err != nil {
+ block := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles)
+ log.Debug("Committing fast sync pivot as new head", "number", block.Number(), "hash", block.Hash())
+ if _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}); err != nil {
return err
}
- log.Debug("Committing fast sync pivot as new head", "number", b.Number(), "hash", b.Hash())
- if _, err := d.blockchain.InsertReceiptChain([]*types.Block{b}, []types.Receipts{result.Receipts}); err != nil {
+ if err := d.blockchain.FastSyncCommitHead(block.Hash()); err != nil {
return err
}
- return d.blockchain.FastSyncCommitHead(b.Hash())
+ atomic.StoreInt32(&d.committed, 1)
+ return nil
}
// DeliverHeaders injects a new batch of block headers received from a remote
diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go
index 7d1cc8c34..d94d55f11 100644
--- a/eth/downloader/downloader_test.go
+++ b/eth/downloader/downloader_test.go
@@ -26,8 +26,8 @@ import (
"time"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
- "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
@@ -44,8 +44,8 @@ var (
// Reduce some of the parameters to make the tester faster.
func init() {
MaxForkAncestry = uint64(10000)
- blockCacheLimit = 1024
- fsCriticalTrials = 10
+ blockCacheItems = 1024
+ fsHeaderContCheck = 500 * time.Millisecond
}
// downloadTester is a test simulator for mocking out local block chain.
@@ -107,7 +107,7 @@ func newTester() *downloadTester {
// reassembly.
func (dl *downloadTester) makeChain(n int, seed byte, parent *types.Block, parentReceipts types.Receipts, heavy bool) ([]common.Hash, map[common.Hash]*types.Header, map[common.Hash]*types.Block, map[common.Hash]types.Receipts) {
// Generate the block chain
- blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, dl.peerDb, n, func(i int, block *core.BlockGen) {
+ blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), dl.peerDb, n, func(i int, block *core.BlockGen) {
block.SetCoinbase(common.Address{seed})
// If a heavy chain is requested, delay blocks to raise difficulty
@@ -117,7 +117,7 @@ func (dl *downloadTester) makeChain(n int, seed byte, parent *types.Block, paren
// If the block number is multiple of 3, send a bonus transaction to the miner
if parent == dl.genesis && i%3 == 0 {
signer := types.MakeSigner(params.TestChainConfig, block.Number())
- tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), new(big.Int).SetUint64(params.TxGas), nil, nil), signer, testKey)
+ tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, nil, nil), signer, testKey)
if err != nil {
panic(err)
}
@@ -222,7 +222,7 @@ func (dl *downloadTester) HasHeader(hash common.Hash, number uint64) bool {
}
// HasBlockAndState checks if a block and associated state is present in the testers canonical chain.
-func (dl *downloadTester) HasBlockAndState(hash common.Hash) bool {
+func (dl *downloadTester) HasBlockAndState(hash common.Hash, number uint64) bool {
block := dl.GetBlockByHash(hash)
if block == nil {
return false
@@ -292,14 +292,14 @@ func (dl *downloadTester) CurrentFastBlock() *types.Block {
func (dl *downloadTester) FastSyncCommitHead(hash common.Hash) error {
// For now only check that the state trie is correct
if block := dl.GetBlockByHash(hash); block != nil {
- _, err := trie.NewSecure(block.Root(), dl.stateDb, 0)
+ _, err := trie.NewSecure(block.Root(), trie.NewDatabase(dl.stateDb), 0)
return err
}
return fmt.Errorf("non existent block: %x", hash[:4])
}
-// GetTdByHash retrieves the block's total difficulty from the canonical chain.
-func (dl *downloadTester) GetTdByHash(hash common.Hash) *big.Int {
+// GetTd retrieves the block's total difficulty from the canonical chain.
+func (dl *downloadTester) GetTd(hash common.Hash, number uint64) *big.Int {
dl.lock.RLock()
defer dl.lock.RUnlock()
@@ -618,28 +618,22 @@ func assertOwnChain(t *testing.T, tester *downloadTester, length int) {
// number of items of the various chain components.
func assertOwnForkedChain(t *testing.T, tester *downloadTester, common int, lengths []int) {
// Initialize the counters for the first fork
- headers, blocks := lengths[0], lengths[0]
+ headers, blocks, receipts := lengths[0], lengths[0], lengths[0]-fsMinFullBlocks
- minReceipts, maxReceipts := lengths[0]-fsMinFullBlocks-fsPivotInterval, lengths[0]-fsMinFullBlocks
- if minReceipts < 0 {
- minReceipts = 1
- }
- if maxReceipts < 0 {
- maxReceipts = 1
+ if receipts < 0 {
+ receipts = 1
}
// Update the counters for each subsequent fork
for _, length := range lengths[1:] {
headers += length - common
blocks += length - common
-
- minReceipts += length - common - fsMinFullBlocks - fsPivotInterval
- maxReceipts += length - common - fsMinFullBlocks
+ receipts += length - common - fsMinFullBlocks
}
switch tester.downloader.mode {
case FullSync:
- minReceipts, maxReceipts = 1, 1
+ receipts = 1
case LightSync:
- blocks, minReceipts, maxReceipts = 1, 1, 1
+ blocks, receipts = 1, 1
}
if hs := len(tester.ownHeaders); hs != headers {
t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, headers)
@@ -647,11 +641,12 @@ func assertOwnForkedChain(t *testing.T, tester *downloadTester, common int, leng
if bs := len(tester.ownBlocks); bs != blocks {
t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, blocks)
}
- if rs := len(tester.ownReceipts); rs < minReceipts || rs > maxReceipts {
- t.Fatalf("synchronised receipts mismatch: have %v, want between [%v, %v]", rs, minReceipts, maxReceipts)
+ if rs := len(tester.ownReceipts); rs != receipts {
+ t.Fatalf("synchronised receipts mismatch: have %v, want %v", rs, receipts)
}
// Verify the state trie too for fast syncs
- if tester.downloader.mode == FastSync {
+ /*if tester.downloader.mode == FastSync {
+ pivot := uint64(0)
var index int
if pivot := int(tester.downloader.queue.fastSyncPivot); pivot < common {
index = pivot
@@ -659,11 +654,11 @@ func assertOwnForkedChain(t *testing.T, tester *downloadTester, common int, leng
index = len(tester.ownHashes) - lengths[len(lengths)-1] + int(tester.downloader.queue.fastSyncPivot)
}
if index > 0 {
- if statedb, err := state.New(tester.ownHeaders[tester.ownHashes[index]].Root, state.NewDatabase(tester.stateDb)); statedb == nil || err != nil {
+ if statedb, err := state.New(tester.ownHeaders[tester.ownHashes[index]].Root, state.NewDatabase(trie.NewDatabase(tester.stateDb))); statedb == nil || err != nil {
t.Fatalf("state reconstruction failed: %v", err)
}
}
- }
+ }*/
}
// Tests that simple synchronization against a canonical chain works correctly.
@@ -683,7 +678,7 @@ func testCanonicalSynchronisation(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
tester.newPeer("peer", protocol, hashes, headers, blocks, receipts)
@@ -709,7 +704,7 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a long block chain to download and the tester
- targetBlocks := 8 * blockCacheLimit
+ targetBlocks := 8 * blockCacheItems
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
tester.newPeer("peer", protocol, hashes, headers, blocks, receipts)
@@ -744,9 +739,9 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) {
cached = len(tester.downloader.queue.blockDonePool)
if mode == FastSync {
if receipts := len(tester.downloader.queue.receiptDonePool); receipts < cached {
- if tester.downloader.queue.resultCache[receipts].Header.Number.Uint64() < tester.downloader.queue.fastSyncPivot {
- cached = receipts
- }
+ //if tester.downloader.queue.resultCache[receipts].Header.Number.Uint64() < tester.downloader.queue.fastSyncPivot {
+ cached = receipts
+ //}
}
}
frozen = int(atomic.LoadUint32(&blocked))
@@ -754,7 +749,7 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) {
tester.downloader.queue.lock.Unlock()
tester.lock.Unlock()
- if cached == blockCacheLimit || retrieved+cached+frozen == targetBlocks+1 {
+ if cached == blockCacheItems || retrieved+cached+frozen == targetBlocks+1 {
break
}
}
@@ -764,8 +759,8 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) {
tester.lock.RLock()
retrieved = len(tester.ownBlocks)
tester.lock.RUnlock()
- if cached != blockCacheLimit && retrieved+cached+frozen != targetBlocks+1 {
- t.Fatalf("block count mismatch: have %v, want %v (owned %v, blocked %v, target %v)", cached, blockCacheLimit, retrieved, frozen, targetBlocks+1)
+ if cached != blockCacheItems && retrieved+cached+frozen != targetBlocks+1 {
+ t.Fatalf("block count mismatch: have %v, want %v (owned %v, blocked %v, target %v)", cached, blockCacheItems, retrieved, frozen, targetBlocks+1)
}
// Permit the blocked blocks to import
if atomic.LoadUint32(&blocked) > 0 {
@@ -973,7 +968,7 @@ func testCancel(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download and the tester
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
if targetBlocks >= MaxHashFetch {
targetBlocks = MaxHashFetch - 15
}
@@ -1015,12 +1010,12 @@ func testMultiSynchronisation(t *testing.T, protocol int, mode SyncMode) {
// Create various peers with various parts of the chain
targetPeers := 8
- targetBlocks := targetPeers*blockCacheLimit - 15
+ targetBlocks := targetPeers*blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
for i := 0; i < targetPeers; i++ {
id := fmt.Sprintf("peer #%d", i)
- tester.newPeer(id, protocol, hashes[i*blockCacheLimit:], headers, blocks, receipts)
+ tester.newPeer(id, protocol, hashes[i*blockCacheItems:], headers, blocks, receipts)
}
if err := tester.sync("peer #0", nil, mode); err != nil {
t.Fatalf("failed to synchronise blocks: %v", err)
@@ -1044,7 +1039,7 @@ func testMultiProtoSync(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
// Create peers of every type
@@ -1083,7 +1078,7 @@ func testEmptyShortCircuit(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a block chain to download
- targetBlocks := 2*blockCacheLimit - 15
+ targetBlocks := 2*blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
tester.newPeer("peer", protocol, hashes, headers, blocks, receipts)
@@ -1109,8 +1104,8 @@ func testEmptyShortCircuit(t *testing.T, protocol int, mode SyncMode) {
bodiesNeeded++
}
}
- for hash, receipt := range receipts {
- if mode == FastSync && len(receipt) > 0 && headers[hash].Number.Uint64() <= tester.downloader.queue.fastSyncPivot {
+ for _, receipt := range receipts {
+ if mode == FastSync && len(receipt) > 0 {
receiptsNeeded++
}
}
@@ -1138,7 +1133,7 @@ func testMissingHeaderAttack(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
// Attempt a full sync with an attacker feeding gapped headers
@@ -1173,7 +1168,7 @@ func testShiftedHeaderAttack(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
// Attempt a full sync with an attacker feeding shifted headers
@@ -1207,7 +1202,7 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := 3*fsHeaderSafetyNet + fsPivotInterval + fsMinFullBlocks
+ targetBlocks := 3*fsHeaderSafetyNet + 256 + fsMinFullBlocks
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
// Attempt to sync with an attacker that feeds junk during the fast sync phase.
@@ -1247,7 +1242,6 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) {
tester.newPeer("withhold-attack", protocol, hashes, headers, blocks, receipts)
missing = 3*fsHeaderSafetyNet + MaxHeaderFetch + 1
- tester.downloader.fsPivotFails = 0
tester.downloader.syncInitHook = func(uint64, uint64) {
for i := missing; i <= len(hashes); i++ {
delete(tester.peerHeaders["withhold-attack"], hashes[len(hashes)-i])
@@ -1266,8 +1260,6 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) {
t.Errorf("fast sync pivot block #%d not rolled back", head)
}
}
- tester.downloader.fsPivotFails = fsCriticalTrials
-
// Synchronise with the valid peer and make sure sync succeeds. Since the last
// rollback should also disable fast syncing for this process, verify that we
// did a fresh full sync. Note, we can't assert anything about the receipts
@@ -1382,7 +1374,7 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
// Set a sync init hook to catch progress changes
@@ -1531,7 +1523,7 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small enough block chain to download
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
// Set a sync init hook to catch progress changes
@@ -1608,7 +1600,7 @@ func testFakedSyncProgress(t *testing.T, protocol int, mode SyncMode) {
defer tester.terminate()
// Create a small block chain
- targetBlocks := blockCacheLimit - 15
+ targetBlocks := blockCacheItems - 15
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks+3, 0, tester.genesis, nil, false)
// Set a sync init hook to catch progress changes
@@ -1696,6 +1688,7 @@ func TestDeliverHeadersHang(t *testing.T) {
type floodingTestPeer struct {
peer Peer
tester *downloadTester
+ pend sync.WaitGroup
}
func (ftp *floodingTestPeer) Head() (common.Hash, *big.Int) { return ftp.peer.Head() }
@@ -1716,9 +1709,12 @@ func (ftp *floodingTestPeer) RequestHeadersByNumber(from uint64, count, skip int
deliveriesDone := make(chan struct{}, 500)
for i := 0; i < cap(deliveriesDone); i++ {
peer := fmt.Sprintf("fake-peer%d", i)
+ ftp.pend.Add(1)
+
go func() {
ftp.tester.downloader.DeliverHeaders(peer, []*types.Header{{}, {}, {}, {}})
deliveriesDone <- struct{}{}
+ ftp.pend.Done()
}()
}
// Deliver the actual requested headers.
@@ -1750,110 +1746,15 @@ func testDeliverHeadersHang(t *testing.T, protocol int, mode SyncMode) {
// Whenever the downloader requests headers, flood it with
// a lot of unrequested header deliveries.
tester.downloader.peers.peers["peer"].peer = &floodingTestPeer{
- tester.downloader.peers.peers["peer"].peer,
- tester,
+ peer: tester.downloader.peers.peers["peer"].peer,
+ tester: tester,
}
if err := tester.sync("peer", nil, mode); err != nil {
- t.Errorf("sync failed: %v", err)
+ t.Errorf("test %d: sync failed: %v", i, err)
}
tester.terminate()
- }
-}
-
-// Tests that if fast sync aborts in the critical section, it can restart a few
-// times before giving up.
-// We use data driven subtests to manage this so that it will be parallel on its own
-// and not with the other tests, avoiding intermittent failures.
-func TestFastCriticalRestarts(t *testing.T) {
- testCases := []struct {
- protocol int
- progress bool
- }{
- {63, false},
- {64, false},
- {63, true},
- {64, true},
- }
- for _, tc := range testCases {
- t.Run(fmt.Sprintf("protocol %d progress %v", tc.protocol, tc.progress), func(t *testing.T) {
- testFastCriticalRestarts(t, tc.protocol, tc.progress)
- })
- }
-}
-
-func testFastCriticalRestarts(t *testing.T, protocol int, progress bool) {
- t.Parallel()
-
- tester := newTester()
- defer tester.terminate()
-
- // Create a large enough blockchin to actually fast sync on
- targetBlocks := fsMinFullBlocks + 2*fsPivotInterval - 15
- hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
-
- // Create a tester peer with a critical section header missing (force failures)
- tester.newPeer("peer", protocol, hashes, headers, blocks, receipts)
- delete(tester.peerHeaders["peer"], hashes[fsMinFullBlocks-1])
- tester.downloader.dropPeer = func(id string) {} // We reuse the same "faulty" peer throughout the test
-
- // Remove all possible pivot state roots and slow down replies (test failure resets later)
- for i := 0; i < fsPivotInterval; i++ {
- tester.peerMissingStates["peer"][headers[hashes[fsMinFullBlocks+i]].Root] = true
- }
- (tester.downloader.peers.peers["peer"].peer).(*downloadTesterPeer).setDelay(500 * time.Millisecond) // Enough to reach the critical section
-
- // Synchronise with the peer a few times and make sure they fail until the retry limit
- for i := 0; i < int(fsCriticalTrials)-1; i++ {
- // Attempt a sync and ensure it fails properly
- if err := tester.sync("peer", nil, FastSync); err == nil {
- t.Fatalf("failing fast sync succeeded: %v", err)
- }
- time.Sleep(150 * time.Millisecond) // Make sure no in-flight requests remain
-
- // If it's the first failure, pivot should be locked => reenable all others to detect pivot changes
- if i == 0 {
- time.Sleep(150 * time.Millisecond) // Make sure no in-flight requests remain
- if tester.downloader.fsPivotLock == nil {
- time.Sleep(400 * time.Millisecond) // Make sure the first huge timeout expires too
- t.Fatalf("pivot block not locked in after critical section failure")
- }
- tester.lock.Lock()
- tester.peerHeaders["peer"][hashes[fsMinFullBlocks-1]] = headers[hashes[fsMinFullBlocks-1]]
- tester.peerMissingStates["peer"] = map[common.Hash]bool{tester.downloader.fsPivotLock.Root: true}
- (tester.downloader.peers.peers["peer"].peer).(*downloadTesterPeer).setDelay(0)
- tester.lock.Unlock()
- }
- }
- // Return all nodes if we're testing fast sync progression
- if progress {
- tester.lock.Lock()
- tester.peerMissingStates["peer"] = map[common.Hash]bool{}
- tester.lock.Unlock()
-
- if err := tester.sync("peer", nil, FastSync); err != nil {
- t.Fatalf("failed to synchronise blocks in progressed fast sync: %v", err)
- }
- time.Sleep(150 * time.Millisecond) // Make sure no in-flight requests remain
- if fails := atomic.LoadUint32(&tester.downloader.fsPivotFails); fails != 1 {
- t.Fatalf("progressed pivot trial count mismatch: have %v, want %v", fails, 1)
- }
- assertOwnChain(t, tester, targetBlocks+1)
- } else {
- if err := tester.sync("peer", nil, FastSync); err == nil {
- t.Fatalf("succeeded to synchronise blocks in failed fast sync")
- }
- time.Sleep(150 * time.Millisecond) // Make sure no in-flight requests remain
-
- if fails := atomic.LoadUint32(&tester.downloader.fsPivotFails); fails != fsCriticalTrials {
- t.Fatalf("failed pivot trial count mismatch: have %v, want %v", fails, fsCriticalTrials)
- }
- }
- // Retry limit exhausted, downloader will switch to full sync, should succeed
- if err := tester.sync("peer", nil, FastSync); err != nil {
- t.Fatalf("failed to synchronise blocks in slow sync: %v", err)
+ // Flush all goroutines to prevent messing with subsequent tests
+ tester.downloader.peers.peers["peer"].peer.(*floodingTestPeer).pend.Wait()
}
- // Note, we can't assert the chain here because the test asserter assumes sync
- // completed using a single mode of operation, whereas fast-then-slow can result
- // in arbitrary intermediate state that's not cleanly verifiable.
}
diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go
index 6926f1d8c..a1a70e46e 100644
--- a/eth/downloader/queue.go
+++ b/eth/downloader/queue.go
@@ -32,7 +32,11 @@ import (
"gopkg.in/karalabe/cookiejar.v2/collections/prque"
)
-var blockCacheLimit = 8192 // Maximum number of blocks to cache before throttling the download
+var (
+ blockCacheItems = 8192 // Maximum number of blocks to cache before throttling the download
+ blockCacheMemory = 64 * 1024 * 1024 // Maximum amount of memory to use for block caching
+ blockCacheSizeWeight = 0.1 // Multiplier to approximate the average block size based on past ones
+)
var (
errNoFetchesPending = errors.New("no fetches pending")
@@ -41,17 +45,17 @@ var (
// fetchRequest is a currently running data retrieval operation.
type fetchRequest struct {
- Peer *peerConnection // Peer to which the request was sent
- From uint64 // [eth/62] Requested chain element index (used for skeleton fills only)
- Hashes map[common.Hash]int // [eth/61] Requested hashes with their insertion index (priority)
- Headers []*types.Header // [eth/62] Requested headers, sorted by request order
- Time time.Time // Time when the request was made
+ Peer *peerConnection // Peer to which the request was sent
+ From uint64 // [eth/62] Requested chain element index (used for skeleton fills only)
+ Headers []*types.Header // [eth/62] Requested headers, sorted by request order
+ Time time.Time // Time when the request was made
}
// fetchResult is a struct collecting partial results from data fetchers until
// all outstanding pieces complete and the result as a whole can be processed.
type fetchResult struct {
- Pending int // Number of data fetches still pending
+ Pending int // Number of data fetches still pending
+ Hash common.Hash // Hash of the header to prevent recalculating
Header *types.Header
Uncles []*types.Header
@@ -61,12 +65,10 @@ type fetchResult struct {
// queue represents hashes that are either need fetching or are being fetched
type queue struct {
- mode SyncMode // Synchronisation mode to decide on the block parts to schedule for fetching
- fastSyncPivot uint64 // Block number where the fast sync pivots into archive synchronisation mode
-
- headerHead common.Hash // [eth/62] Hash of the last queued header to verify order
+ mode SyncMode // Synchronisation mode to decide on the block parts to schedule for fetching
// Headers are "special", they download in batches, supported by a skeleton chain
+ headerHead common.Hash // [eth/62] Hash of the last queued header to verify order
headerTaskPool map[uint64]*types.Header // [eth/62] Pending header retrieval tasks, mapping starting indexes to skeleton headers
headerTaskQueue *prque.Prque // [eth/62] Priority queue of the skeleton indexes to fetch the filling headers for
headerPeerMiss map[string]map[uint64]struct{} // [eth/62] Set of per-peer header batches known to be unavailable
@@ -87,8 +89,9 @@ type queue struct {
receiptPendPool map[string]*fetchRequest // [eth/63] Currently pending receipt retrieval operations
receiptDonePool map[common.Hash]struct{} // [eth/63] Set of the completed receipt fetches
- resultCache []*fetchResult // Downloaded but not yet delivered fetch results
- resultOffset uint64 // Offset of the first cached fetch result in the block chain
+ resultCache []*fetchResult // Downloaded but not yet delivered fetch results
+ resultOffset uint64 // Offset of the first cached fetch result in the block chain
+ resultSize common.StorageSize // Approximate size of a block (exponential moving average)
lock *sync.Mutex
active *sync.Cond
@@ -109,7 +112,7 @@ func newQueue() *queue {
receiptTaskQueue: prque.New(),
receiptPendPool: make(map[string]*fetchRequest),
receiptDonePool: make(map[common.Hash]struct{}),
- resultCache: make([]*fetchResult, blockCacheLimit),
+ resultCache: make([]*fetchResult, blockCacheItems),
active: sync.NewCond(lock),
lock: lock,
}
@@ -122,10 +125,8 @@ func (q *queue) Reset() {
q.closed = false
q.mode = FullSync
- q.fastSyncPivot = 0
q.headerHead = common.Hash{}
-
q.headerPendPool = make(map[string]*fetchRequest)
q.blockTaskPool = make(map[common.Hash]*types.Header)
@@ -138,7 +139,7 @@ func (q *queue) Reset() {
q.receiptPendPool = make(map[string]*fetchRequest)
q.receiptDonePool = make(map[common.Hash]struct{})
- q.resultCache = make([]*fetchResult, blockCacheLimit)
+ q.resultCache = make([]*fetchResult, blockCacheItems)
q.resultOffset = 0
}
@@ -214,27 +215,13 @@ func (q *queue) Idle() bool {
return (queued + pending + cached) == 0
}
-// FastSyncPivot retrieves the currently used fast sync pivot point.
-func (q *queue) FastSyncPivot() uint64 {
- q.lock.Lock()
- defer q.lock.Unlock()
-
- return q.fastSyncPivot
-}
-
// ShouldThrottleBlocks checks if the download should be throttled (active block (body)
// fetches exceed block cache).
func (q *queue) ShouldThrottleBlocks() bool {
q.lock.Lock()
defer q.lock.Unlock()
- // Calculate the currently in-flight block (body) requests
- pending := 0
- for _, request := range q.blockPendPool {
- pending += len(request.Hashes) + len(request.Headers)
- }
- // Throttle if more blocks (bodies) are in-flight than free space in the cache
- return pending >= len(q.resultCache)-len(q.blockDonePool)
+ return q.resultSlots(q.blockPendPool, q.blockDonePool) <= 0
}
// ShouldThrottleReceipts checks if the download should be throttled (active receipt
@@ -243,13 +230,39 @@ func (q *queue) ShouldThrottleReceipts() bool {
q.lock.Lock()
defer q.lock.Unlock()
- // Calculate the currently in-flight receipt requests
+ return q.resultSlots(q.receiptPendPool, q.receiptDonePool) <= 0
+}
+
+// resultSlots calculates the number of results slots available for requests
+// whilst adhering to both the item and the memory limit too of the results
+// cache.
+func (q *queue) resultSlots(pendPool map[string]*fetchRequest, donePool map[common.Hash]struct{}) int {
+ // Calculate the maximum length capped by the memory limit
+ limit := len(q.resultCache)
+ if common.StorageSize(len(q.resultCache))*q.resultSize > common.StorageSize(blockCacheMemory) {
+ limit = int((common.StorageSize(blockCacheMemory) + q.resultSize - 1) / q.resultSize)
+ }
+ // Calculate the number of slots already finished
+ finished := 0
+ for _, result := range q.resultCache[:limit] {
+ if result == nil {
+ break
+ }
+ if _, ok := donePool[result.Hash]; ok {
+ finished++
+ }
+ }
+ // Calculate the number of slots currently downloading
pending := 0
- for _, request := range q.receiptPendPool {
- pending += len(request.Headers)
+ for _, request := range pendPool {
+ for _, header := range request.Headers {
+ if header.Number.Uint64() < q.resultOffset+uint64(limit) {
+ pending++
+ }
+ }
}
- // Throttle if more receipts are in-flight than free space in the cache
- return pending >= len(q.resultCache)-len(q.receiptDonePool)
+ // Return the free slots to distribute
+ return limit - finished - pending
}
// ScheduleSkeleton adds a batch of header retrieval tasks to the queue to fill
@@ -323,8 +336,7 @@ func (q *queue) Schedule(headers []*types.Header, from uint64) []*types.Header {
q.blockTaskPool[hash] = header
q.blockTaskQueue.Push(header, -float32(header.Number.Uint64()))
- if q.mode == FastSync && header.Number.Uint64() <= q.fastSyncPivot {
- // Fast phase of the fast sync, retrieve receipts too
+ if q.mode == FastSync {
q.receiptTaskPool[hash] = header
q.receiptTaskQueue.Push(header, -float32(header.Number.Uint64()))
}
@@ -335,18 +347,25 @@ func (q *queue) Schedule(headers []*types.Header, from uint64) []*types.Header {
return inserts
}
-// WaitResults retrieves and permanently removes a batch of fetch
-// results from the cache. the result slice will be empty if the queue
-// has been closed.
-func (q *queue) WaitResults() []*fetchResult {
+// Results retrieves and permanently removes a batch of fetch results from
+// the cache. the result slice will be empty if the queue has been closed.
+func (q *queue) Results(block bool) []*fetchResult {
q.lock.Lock()
defer q.lock.Unlock()
+ // Count the number of items available for processing
nproc := q.countProcessableItems()
for nproc == 0 && !q.closed {
+ if !block {
+ return nil
+ }
q.active.Wait()
nproc = q.countProcessableItems()
}
+ // Since we have a batch limit, don't pull more into "dangling" memory
+ if nproc > maxResultsProcess {
+ nproc = maxResultsProcess
+ }
results := make([]*fetchResult, nproc)
copy(results, q.resultCache[:nproc])
if len(results) > 0 {
@@ -363,6 +382,21 @@ func (q *queue) WaitResults() []*fetchResult {
}
// Advance the expected block number of the first cache entry.
q.resultOffset += uint64(nproc)
+
+ // Recalculate the result item weights to prevent memory exhaustion
+ for _, result := range results {
+ size := result.Header.Size()
+ for _, uncle := range result.Uncles {
+ size += uncle.Size()
+ }
+ for _, receipt := range result.Receipts {
+ size += receipt.Size()
+ }
+ for _, tx := range result.Transactions {
+ size += tx.Size()
+ }
+ q.resultSize = common.StorageSize(blockCacheSizeWeight)*size + (1-common.StorageSize(blockCacheSizeWeight))*q.resultSize
+ }
}
return results
}
@@ -370,21 +404,9 @@ func (q *queue) WaitResults() []*fetchResult {
// countProcessableItems counts the processable items.
func (q *queue) countProcessableItems() int {
for i, result := range q.resultCache {
- // Don't process incomplete or unavailable items.
if result == nil || result.Pending > 0 {
return i
}
- // Stop before processing the pivot block to ensure that
- // resultCache has space for fsHeaderForceVerify items. Not
- // doing this could leave us unable to download the required
- // amount of headers.
- if q.mode == FastSync && result.Header.Number.Uint64() == q.fastSyncPivot {
- for j := 0; j < fsHeaderForceVerify; j++ {
- if i+j+1 >= len(q.resultCache) || q.resultCache[i+j+1] == nil {
- return i
- }
- }
- }
}
return len(q.resultCache)
}
@@ -473,10 +495,8 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common
return nil, false, nil
}
// Calculate an upper limit on the items we might fetch (i.e. throttling)
- space := len(q.resultCache) - len(donePool)
- for _, request := range pendPool {
- space -= len(request.Headers)
- }
+ space := q.resultSlots(pendPool, donePool)
+
// Retrieve a batch of tasks, skipping previously failed ones
send := make([]*types.Header, 0, count)
skip := make([]*types.Header, 0)
@@ -484,6 +504,7 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common
progress := false
for proc := 0; proc < space && len(send) < count && !taskQueue.Empty(); proc++ {
header := taskQueue.PopItem().(*types.Header)
+ hash := header.Hash()
// If we're the first to request this task, initialise the result container
index := int(header.Number.Int64() - int64(q.resultOffset))
@@ -493,18 +514,19 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common
}
if q.resultCache[index] == nil {
components := 1
- if q.mode == FastSync && header.Number.Uint64() <= q.fastSyncPivot {
+ if q.mode == FastSync {
components = 2
}
q.resultCache[index] = &fetchResult{
Pending: components,
+ Hash: hash,
Header: header,
}
}
// If this fetch task is a noop, skip this fetch operation
if isNoop(header) {
- donePool[header.Hash()] = struct{}{}
- delete(taskPool, header.Hash())
+ donePool[hash] = struct{}{}
+ delete(taskPool, hash)
space, proc = space-1, proc-1
q.resultCache[index].Pending--
@@ -512,7 +534,7 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common
continue
}
// Otherwise unless the peer is known not to have the data, add to the retrieve list
- if p.Lacks(header.Hash()) {
+ if p.Lacks(hash) {
skip = append(skip, header)
} else {
send = append(send, header)
@@ -565,9 +587,6 @@ func (q *queue) cancel(request *fetchRequest, taskQueue *prque.Prque, pendPool m
if request.From > 0 {
taskQueue.Push(request.From, -float32(request.From))
}
- for hash, index := range request.Hashes {
- taskQueue.Push(hash, float32(index))
- }
for _, header := range request.Headers {
taskQueue.Push(header, -float32(header.Number.Uint64()))
}
@@ -640,18 +659,11 @@ func (q *queue) expire(timeout time.Duration, pendPool map[string]*fetchRequest,
if request.From > 0 {
taskQueue.Push(request.From, -float32(request.From))
}
- for hash, index := range request.Hashes {
- taskQueue.Push(hash, float32(index))
- }
for _, header := range request.Headers {
taskQueue.Push(header, -float32(header.Number.Uint64()))
}
// Add the peer to the expiry report along the the number of failed requests
- expirations := len(request.Hashes)
- if expirations < len(request.Headers) {
- expirations = len(request.Headers)
- }
- expiries[id] = expirations
+ expiries[id] = len(request.Headers)
}
}
// Remove the expired requests from the pending pool
@@ -828,14 +840,16 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header, taskQ
failure = err
break
}
- donePool[header.Hash()] = struct{}{}
+ hash := header.Hash()
+
+ donePool[hash] = struct{}{}
q.resultCache[index].Pending--
useful = true
accepted++
// Clean up a successful fetch
request.Headers[i] = nil
- delete(taskPool, header.Hash())
+ delete(taskPool, hash)
}
// Return all failed or missing fetches to the queue
for _, header := range request.Headers {
@@ -860,7 +874,7 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header, taskQ
// Prepare configures the result cache to allow accepting and caching inbound
// fetch results.
-func (q *queue) Prepare(offset uint64, mode SyncMode, pivot uint64, head *types.Header) {
+func (q *queue) Prepare(offset uint64, mode SyncMode) {
q.lock.Lock()
defer q.lock.Unlock()
@@ -868,6 +882,5 @@ func (q *queue) Prepare(offset uint64, mode SyncMode, pivot uint64, head *types.
if q.resultOffset < offset {
q.resultOffset = offset
}
- q.fastSyncPivot = pivot
q.mode = mode
}
diff --git a/eth/downloader/statesync.go b/eth/downloader/statesync.go
index a0b05c9be..9cc65a208 100644
--- a/eth/downloader/statesync.go
+++ b/eth/downloader/statesync.go
@@ -20,7 +20,6 @@ import (
"fmt"
"hash"
"sync"
- "sync/atomic"
"time"
"github.com/ethereum/go-ethereum/common"
@@ -132,7 +131,10 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync {
// Send the next finished request to the current sync:
case deliverReqCh <- deliverReq:
- finished = append(finished[:0], finished[1:]...)
+ // Shift out the first request, but also set the emptied slot to nil for GC
+ copy(finished, finished[1:])
+ finished[len(finished)-1] = nil
+ finished = finished[:len(finished)-1]
// Handle incoming state packs:
case pack := <-d.stateCh:
@@ -291,6 +293,9 @@ func (s *stateSync) loop() error {
case <-s.cancel:
return errCancelStateFetch
+ case <-s.d.cancelCh:
+ return errCancelStateFetch
+
case req := <-s.deliver:
// Response, disconnect or timeout triggered, drop the peer if stalling
log.Trace("Received node data response", "peer", req.peer.id, "count", len(req.response), "dropped", req.dropped, "timeout", !req.dropped && req.timedOut())
@@ -301,15 +306,11 @@ func (s *stateSync) loop() error {
s.d.dropPeer(req.peer.id)
}
// Process all the received blobs and check for stale delivery
- stale, err := s.process(req)
- if err != nil {
+ if err := s.process(req); err != nil {
log.Warn("Node data write error", "err", err)
return err
}
- // The the delivery contains requested data, mark the node idle (otherwise it's a timed out delivery)
- if !stale {
- req.peer.SetNodeDataIdle(len(req.response))
- }
+ req.peer.SetNodeDataIdle(len(req.response))
}
}
return s.commit(true)
@@ -349,6 +350,7 @@ func (s *stateSync) assignTasks() {
case s.d.trackStateReq <- req:
req.peer.FetchNodeData(req.items)
case <-s.cancel:
+ case <-s.d.cancelCh:
}
}
}
@@ -387,7 +389,7 @@ func (s *stateSync) fillTasks(n int, req *stateReq) {
// process iterates over a batch of delivered state data, injecting each item
// into a running state sync, re-queuing any items that were requested but not
// delivered.
-func (s *stateSync) process(req *stateReq) (bool, error) {
+func (s *stateSync) process(req *stateReq) error {
// Collect processing stats and update progress if valid data was received
duplicate, unexpected := 0, 0
@@ -398,7 +400,7 @@ func (s *stateSync) process(req *stateReq) (bool, error) {
}(time.Now())
// Iterate over all the delivered data and inject one-by-one into the trie
- progress, stale := false, len(req.response) > 0
+ progress := false
for _, blob := range req.response {
prog, hash, err := s.processNodeData(blob)
@@ -412,20 +414,12 @@ func (s *stateSync) process(req *stateReq) (bool, error) {
case trie.ErrAlreadyProcessed:
duplicate++
default:
- return stale, fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err)
+ return fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err)
}
- // If the node delivered a requested item, mark the delivery non-stale
if _, ok := req.tasks[hash]; ok {
delete(req.tasks, hash)
- stale = false
}
}
- // If we're inside the critical section, reset fail counter since we progressed.
- if progress && atomic.LoadUint32(&s.d.fsPivotFails) > 1 {
- log.Trace("Fast-sync progressed, resetting fail counter", "previous", atomic.LoadUint32(&s.d.fsPivotFails))
- atomic.StoreUint32(&s.d.fsPivotFails, 1) // Don't ever reset to 0, as that will unlock the pivot block
- }
-
// Put unfulfilled tasks back into the retry queue
npeers := s.d.peers.Len()
for hash, task := range req.tasks {
@@ -438,12 +432,12 @@ func (s *stateSync) process(req *stateReq) (bool, error) {
// If we've requested the node too many times already, it may be a malicious
// sync where nobody has the right data. Abort.
if len(task.attempts) >= npeers {
- return stale, fmt.Errorf("state node %s failed with all peers (%d tries, %d peers)", hash.TerminalString(), len(task.attempts), npeers)
+ return fmt.Errorf("state node %s failed with all peers (%d tries, %d peers)", hash.TerminalString(), len(task.attempts), npeers)
}
// Missing item, place into the retry queue.
s.tasks[hash] = task
}
- return stale, nil
+ return nil
}
// processNodeData tries to inject a trie node data blob delivered from a remote
diff --git a/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go
index 9889e6cc5..9d53b98b6 100644
--- a/eth/fetcher/fetcher_test.go
+++ b/eth/fetcher/fetcher_test.go
@@ -25,6 +25,7 @@ import (
"time"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
@@ -45,13 +46,13 @@ var (
// contains a transaction and every 5th an uncle to allow testing correct block
// reassembly.
func makeChain(n int, seed byte, parent *types.Block) ([]common.Hash, map[common.Hash]*types.Block) {
- blocks, _ := core.GenerateChain(params.TestChainConfig, parent, testdb, n, func(i int, block *core.BlockGen) {
+ blocks, _ := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) {
block.SetCoinbase(common.Address{seed})
// If the block number is multiple of 3, send a bonus transaction to the miner
if parent == genesis && i%3 == 0 {
signer := types.MakeSigner(params.TestChainConfig, block.Number())
- tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), new(big.Int).SetUint64(params.TxGas), nil, nil), signer, testKey)
+ tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, nil, nil), signer, testKey)
if err != nil {
panic(err)
}
diff --git a/eth/filters/api.go b/eth/filters/api.go
index 03c1d6afc..406c9442e 100644
--- a/eth/filters/api.go
+++ b/eth/filters/api.go
@@ -25,6 +25,7 @@ import (
"sync"
"time"
+ ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
@@ -240,7 +241,7 @@ func (api *PublicFilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc
matchedLogs = make(chan []*types.Log)
)
- logsSub, err := api.events.SubscribeLogs(crit, matchedLogs)
+ logsSub, err := api.events.SubscribeLogs(ethereum.FilterQuery(crit), matchedLogs)
if err != nil {
return nil, err
}
@@ -267,6 +268,8 @@ func (api *PublicFilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc
}
// FilterCriteria represents a request to create a new filter.
+//
+// TODO(karalabe): Kill this in favor of ethereum.FilterQuery.
type FilterCriteria struct {
FromBlock *big.Int
ToBlock *big.Int
@@ -289,7 +292,7 @@ type FilterCriteria struct {
// https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newfilter
func (api *PublicFilterAPI) NewFilter(crit FilterCriteria) (rpc.ID, error) {
logs := make(chan []*types.Log)
- logsSub, err := api.events.SubscribeLogs(crit, logs)
+ logsSub, err := api.events.SubscribeLogs(ethereum.FilterQuery(crit), logs)
if err != nil {
return rpc.ID(""), err
}
diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go
index e08cedb27..b09998f9c 100644
--- a/eth/filters/filter_system.go
+++ b/eth/filters/filter_system.go
@@ -25,6 +25,7 @@ import (
"sync"
"time"
+ ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
@@ -75,7 +76,7 @@ type subscription struct {
id rpc.ID
typ Type
created time.Time
- logsCrit FilterCriteria
+ logsCrit ethereum.FilterQuery
logs chan []*types.Log
hashes chan common.Hash
headers chan *types.Header
@@ -162,7 +163,7 @@ func (es *EventSystem) subscribe(sub *subscription) *Subscription {
// SubscribeLogs creates a subscription that will write all logs matching the
// given criteria to the given logs channel. Default value for the from and to
// block is "latest". If the fromBlock > toBlock an error is returned.
-func (es *EventSystem) SubscribeLogs(crit FilterCriteria, logs chan []*types.Log) (*Subscription, error) {
+func (es *EventSystem) SubscribeLogs(crit ethereum.FilterQuery, logs chan []*types.Log) (*Subscription, error) {
var from, to rpc.BlockNumber
if crit.FromBlock == nil {
from = rpc.LatestBlockNumber
@@ -200,7 +201,7 @@ func (es *EventSystem) SubscribeLogs(crit FilterCriteria, logs chan []*types.Log
// subscribeMinedPendingLogs creates a subscription that returned mined and
// pending logs that match the given criteria.
-func (es *EventSystem) subscribeMinedPendingLogs(crit FilterCriteria, logs chan []*types.Log) *Subscription {
+func (es *EventSystem) subscribeMinedPendingLogs(crit ethereum.FilterQuery, logs chan []*types.Log) *Subscription {
sub := &subscription{
id: rpc.NewID(),
typ: MinedAndPendingLogsSubscription,
@@ -217,7 +218,7 @@ func (es *EventSystem) subscribeMinedPendingLogs(crit FilterCriteria, logs chan
// subscribeLogs creates a subscription that will write all logs matching the
// given criteria to the given logs channel.
-func (es *EventSystem) subscribeLogs(crit FilterCriteria, logs chan []*types.Log) *Subscription {
+func (es *EventSystem) subscribeLogs(crit ethereum.FilterQuery, logs chan []*types.Log) *Subscription {
sub := &subscription{
id: rpc.NewID(),
typ: LogsSubscription,
@@ -234,7 +235,7 @@ func (es *EventSystem) subscribeLogs(crit FilterCriteria, logs chan []*types.Log
// subscribePendingLogs creates a subscription that writes transaction hashes for
// transactions that enter the transaction pool.
-func (es *EventSystem) subscribePendingLogs(crit FilterCriteria, logs chan []*types.Log) *Subscription {
+func (es *EventSystem) subscribePendingLogs(crit ethereum.FilterQuery, logs chan []*types.Log) *Subscription {
sub := &subscription{
id: rpc.NewID(),
typ: PendingLogsSubscription,
diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go
index 7da114fda..7ec3b4be7 100644
--- a/eth/filters/filter_system_test.go
+++ b/eth/filters/filter_system_test.go
@@ -25,7 +25,9 @@ import (
"testing"
"time"
+ ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/bloombits"
"github.com/ethereum/go-ethereum/core/types"
@@ -136,7 +138,7 @@ func TestBlockSubscription(t *testing.T) {
backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed}
api = NewPublicFilterAPI(backend, false)
genesis = new(core.Genesis).MustCommit(db)
- chain, _ = core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) {})
+ chain, _ = core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 10, func(i int, gen *core.BlockGen) {})
chainEvents = []core.ChainEvent{}
)
@@ -194,11 +196,11 @@ func TestPendingTxFilter(t *testing.T) {
api = NewPublicFilterAPI(backend, false)
transactions = []*types.Transaction{
- types.NewTransaction(0, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil),
- types.NewTransaction(1, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil),
- types.NewTransaction(2, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil),
- types.NewTransaction(3, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil),
- types.NewTransaction(4, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), new(big.Int), new(big.Int), nil),
+ types.NewTransaction(0, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), 0, new(big.Int), nil),
+ types.NewTransaction(1, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), 0, new(big.Int), nil),
+ types.NewTransaction(2, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), 0, new(big.Int), nil),
+ types.NewTransaction(3, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), 0, new(big.Int), nil),
+ types.NewTransaction(4, common.HexToAddress("0xb794f5ea0ba39494ce83a213fffba74279579268"), new(big.Int), 0, new(big.Int), nil),
}
hashes []common.Hash
@@ -487,27 +489,27 @@ func TestPendingLogsSubscription(t *testing.T) {
}
testCases = []struct {
- crit FilterCriteria
+ crit ethereum.FilterQuery
expected []*types.Log
c chan []*types.Log
sub *Subscription
}{
// match all
- {FilterCriteria{}, convertLogs(allLogs), nil, nil},
+ {ethereum.FilterQuery{}, convertLogs(allLogs), nil, nil},
// match none due to no matching addresses
- {FilterCriteria{Addresses: []common.Address{{}, notUsedAddress}, Topics: [][]common.Hash{nil}}, []*types.Log{}, nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{{}, notUsedAddress}, Topics: [][]common.Hash{nil}}, []*types.Log{}, nil, nil},
// match logs based on addresses, ignore topics
- {FilterCriteria{Addresses: []common.Address{firstAddr}}, append(convertLogs(allLogs[:2]), allLogs[5].Logs[3]), nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{firstAddr}}, append(convertLogs(allLogs[:2]), allLogs[5].Logs[3]), nil, nil},
// match none due to no matching topics (match with address)
- {FilterCriteria{Addresses: []common.Address{secondAddr}, Topics: [][]common.Hash{{notUsedTopic}}}, []*types.Log{}, nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{secondAddr}, Topics: [][]common.Hash{{notUsedTopic}}}, []*types.Log{}, nil, nil},
// match logs based on addresses and topics
- {FilterCriteria{Addresses: []common.Address{thirdAddress}, Topics: [][]common.Hash{{firstTopic, secondTopic}}}, append(convertLogs(allLogs[3:5]), allLogs[5].Logs[0]), nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{thirdAddress}, Topics: [][]common.Hash{{firstTopic, secondTopic}}}, append(convertLogs(allLogs[3:5]), allLogs[5].Logs[0]), nil, nil},
// match logs based on multiple addresses and "or" topics
- {FilterCriteria{Addresses: []common.Address{secondAddr, thirdAddress}, Topics: [][]common.Hash{{firstTopic, secondTopic}}}, append(convertLogs(allLogs[2:5]), allLogs[5].Logs[0]), nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{secondAddr, thirdAddress}, Topics: [][]common.Hash{{firstTopic, secondTopic}}}, append(convertLogs(allLogs[2:5]), allLogs[5].Logs[0]), nil, nil},
// block numbers are ignored for filters created with New***Filter, these return all logs that match the given criteria when the state changes
- {FilterCriteria{Addresses: []common.Address{firstAddr}, FromBlock: big.NewInt(2), ToBlock: big.NewInt(3)}, append(convertLogs(allLogs[:2]), allLogs[5].Logs[3]), nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{firstAddr}, FromBlock: big.NewInt(2), ToBlock: big.NewInt(3)}, append(convertLogs(allLogs[:2]), allLogs[5].Logs[3]), nil, nil},
// multiple pending logs, should match only 2 topics from the logs in block 5
- {FilterCriteria{Addresses: []common.Address{thirdAddress}, Topics: [][]common.Hash{{firstTopic, fourthTopic}}}, []*types.Log{allLogs[5].Logs[0], allLogs[5].Logs[2]}, nil, nil},
+ {ethereum.FilterQuery{Addresses: []common.Address{thirdAddress}, Topics: [][]common.Hash{{firstTopic, fourthTopic}}}, []*types.Log{allLogs[5].Logs[0], allLogs[5].Logs[2]}, nil, nil},
}
)
diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go
index 11235e95a..0018142c4 100644
--- a/eth/filters/filter_test.go
+++ b/eth/filters/filter_test.go
@@ -24,6 +24,7 @@ import (
"testing"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
@@ -33,7 +34,7 @@ import (
)
func makeReceipt(addr common.Address) *types.Receipt {
- receipt := types.NewReceipt(nil, false, new(big.Int))
+ receipt := types.NewReceipt(nil, false, 0)
receipt.Logs = []*types.Log{
{Address: addr},
}
@@ -65,7 +66,7 @@ func BenchmarkFilters(b *testing.B) {
defer db.Close()
genesis := core.GenesisBlockForTesting(db, addr1, big.NewInt(1000000))
- chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 100010, func(i int, gen *core.BlockGen) {
+ chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 100010, func(i int, gen *core.BlockGen) {
switch i {
case 2403:
receipt := makeReceipt(addr1)
@@ -132,10 +133,10 @@ func TestFilters(t *testing.T) {
defer db.Close()
genesis := core.GenesisBlockForTesting(db, addr, big.NewInt(1000000))
- chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 1000, func(i int, gen *core.BlockGen) {
+ chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 1000, func(i int, gen *core.BlockGen) {
switch i {
case 1:
- receipt := types.NewReceipt(nil, false, new(big.Int))
+ receipt := types.NewReceipt(nil, false, 0)
receipt.Logs = []*types.Log{
{
Address: addr,
@@ -144,7 +145,7 @@ func TestFilters(t *testing.T) {
}
gen.AddUncheckedReceipt(receipt)
case 2:
- receipt := types.NewReceipt(nil, false, new(big.Int))
+ receipt := types.NewReceipt(nil, false, 0)
receipt.Logs = []*types.Log{
{
Address: addr,
@@ -153,7 +154,7 @@ func TestFilters(t *testing.T) {
}
gen.AddUncheckedReceipt(receipt)
case 998:
- receipt := types.NewReceipt(nil, false, new(big.Int))
+ receipt := types.NewReceipt(nil, false, 0)
receipt.Logs = []*types.Log{
{
Address: addr,
@@ -162,7 +163,7 @@ func TestFilters(t *testing.T) {
}
gen.AddUncheckedReceipt(receipt)
case 999:
- receipt := types.NewReceipt(nil, false, new(big.Int))
+ receipt := types.NewReceipt(nil, false, 0)
receipt.Logs = []*types.Log{
{
Address: addr,
diff --git a/eth/gasprice/gasprice.go b/eth/gasprice/gasprice.go
index c662348e1..54325692c 100644
--- a/eth/gasprice/gasprice.go
+++ b/eth/gasprice/gasprice.go
@@ -23,6 +23,7 @@ import (
"sync"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
@@ -101,9 +102,9 @@ func (gpo *Oracle) SuggestPrice(ctx context.Context) (*big.Int, error) {
ch := make(chan getBlockPricesResult, gpo.checkBlocks)
sent := 0
exp := 0
- var txPrices []*big.Int
+ var blockPrices []*big.Int
for sent < gpo.checkBlocks && blockNum > 0 {
- go gpo.getBlockPrices(ctx, blockNum, ch)
+ go gpo.getBlockPrices(ctx, types.MakeSigner(gpo.backend.ChainConfig(), big.NewInt(int64(blockNum))), blockNum, ch)
sent++
exp++
blockNum--
@@ -115,8 +116,8 @@ func (gpo *Oracle) SuggestPrice(ctx context.Context) (*big.Int, error) {
return lastPrice, res.err
}
exp--
- if len(res.prices) > 0 {
- txPrices = append(txPrices, res.prices...)
+ if res.price != nil {
+ blockPrices = append(blockPrices, res.price)
continue
}
if maxEmpty > 0 {
@@ -124,16 +125,16 @@ func (gpo *Oracle) SuggestPrice(ctx context.Context) (*big.Int, error) {
continue
}
if blockNum > 0 && sent < gpo.maxBlocks {
- go gpo.getBlockPrices(ctx, blockNum, ch)
+ go gpo.getBlockPrices(ctx, types.MakeSigner(gpo.backend.ChainConfig(), big.NewInt(int64(blockNum))), blockNum, ch)
sent++
exp++
blockNum--
}
}
price := lastPrice
- if len(txPrices) > 0 {
- sort.Sort(bigIntArray(txPrices))
- price = txPrices[(len(txPrices)-1)*gpo.percentile/100]
+ if len(blockPrices) > 0 {
+ sort.Sort(bigIntArray(blockPrices))
+ price = blockPrices[(len(blockPrices)-1)*gpo.percentile/100]
}
if price.Cmp(maxPrice) > 0 {
price = new(big.Int).Set(maxPrice)
@@ -147,24 +148,38 @@ func (gpo *Oracle) SuggestPrice(ctx context.Context) (*big.Int, error) {
}
type getBlockPricesResult struct {
- prices []*big.Int
- err error
+ price *big.Int
+ err error
}
-// getLowestPrice calculates the lowest transaction gas price in a given block
+type transactionsByGasPrice []*types.Transaction
+
+func (t transactionsByGasPrice) Len() int { return len(t) }
+func (t transactionsByGasPrice) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
+func (t transactionsByGasPrice) Less(i, j int) bool { return t[i].GasPrice().Cmp(t[j].GasPrice()) < 0 }
+
+// getBlockPrices calculates the lowest transaction gas price in a given block
// and sends it to the result channel. If the block is empty, price is nil.
-func (gpo *Oracle) getBlockPrices(ctx context.Context, blockNum uint64, ch chan getBlockPricesResult) {
+func (gpo *Oracle) getBlockPrices(ctx context.Context, signer types.Signer, blockNum uint64, ch chan getBlockPricesResult) {
block, err := gpo.backend.BlockByNumber(ctx, rpc.BlockNumber(blockNum))
if block == nil {
ch <- getBlockPricesResult{nil, err}
return
}
- txs := block.Transactions()
- prices := make([]*big.Int, len(txs))
- for i, tx := range txs {
- prices[i] = tx.GasPrice()
+
+ blockTxs := block.Transactions()
+ txs := make([]*types.Transaction, len(blockTxs))
+ copy(txs, blockTxs)
+ sort.Sort(transactionsByGasPrice(txs))
+
+ for _, tx := range txs {
+ sender, err := types.Sender(signer, tx)
+ if err == nil && sender != block.Coinbase() {
+ ch <- getBlockPricesResult{tx.GasPrice(), nil}
+ return
+ }
}
- ch <- getBlockPricesResult{prices, nil}
+ ch <- getBlockPricesResult{nil, nil}
}
type bigIntArray []*big.Int
diff --git a/eth/gen_config.go b/eth/gen_config.go
index e2d50e1f6..4f2e82d94 100644
--- a/eth/gen_config.go
+++ b/eth/gen_config.go
@@ -13,6 +13,8 @@ import (
"github.com/ethereum/go-ethereum/eth/gasprice"
)
+var _ = (*configMarshaling)(nil)
+
func (c Config) MarshalTOML() (interface{}, error) {
type Config struct {
Genesis *core.Genesis `toml:",omitempty"`
@@ -20,7 +22,6 @@ func (c Config) MarshalTOML() (interface{}, error) {
SyncMode downloader.SyncMode
LightServ int `toml:",omitempty"`
LightPeers int `toml:",omitempty"`
- MaxPeers int `toml:"-"`
SkipBcVersionCheck bool `toml:"-"`
DatabaseHandles int `toml:"-"`
DatabaseCache int
@@ -28,17 +29,11 @@ func (c Config) MarshalTOML() (interface{}, error) {
MinerThreads int `toml:",omitempty"`
ExtraData hexutil.Bytes `toml:",omitempty"`
GasPrice *big.Int
- EthashCacheDir string
- EthashCachesInMem int
- EthashCachesOnDisk int
- EthashDatasetDir string
- EthashDatasetsInMem int
- EthashDatasetsOnDisk int
+ Ethash ethash.Config
TxPool core.TxPoolConfig
GPO gasprice.Config
EnablePreimageRecording bool
- DocRoot string `toml:"-"`
- PowMode ethash.Mode `toml:"-"`
+ DocRoot string `toml:"-"`
}
var enc Config
enc.Genesis = c.Genesis
@@ -53,17 +48,11 @@ func (c Config) MarshalTOML() (interface{}, error) {
enc.MinerThreads = c.MinerThreads
enc.ExtraData = c.ExtraData
enc.GasPrice = c.GasPrice
- enc.EthashCacheDir = c.Ethash.CacheDir
- enc.EthashCachesInMem = c.Ethash.CachesInMem
- enc.EthashCachesOnDisk = c.Ethash.CachesOnDisk
- enc.EthashDatasetDir = c.Ethash.DatasetDir
- enc.EthashDatasetsInMem = c.Ethash.DatasetsInMem
- enc.EthashDatasetsOnDisk = c.Ethash.DatasetsOnDisk
+ enc.Ethash = c.Ethash
enc.TxPool = c.TxPool
enc.GPO = c.GPO
enc.EnablePreimageRecording = c.EnablePreimageRecording
enc.DocRoot = c.DocRoot
- enc.PowMode = c.Ethash.PowMode
return &enc, nil
}
@@ -74,25 +63,18 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error {
SyncMode *downloader.SyncMode
LightServ *int `toml:",omitempty"`
LightPeers *int `toml:",omitempty"`
- MaxPeers *int `toml:"-"`
SkipBcVersionCheck *bool `toml:"-"`
DatabaseHandles *int `toml:"-"`
DatabaseCache *int
Etherbase *common.Address `toml:",omitempty"`
MinerThreads *int `toml:",omitempty"`
- ExtraData hexutil.Bytes `toml:",omitempty"`
+ ExtraData *hexutil.Bytes `toml:",omitempty"`
GasPrice *big.Int
- EthashCacheDir *string
- EthashCachesInMem *int
- EthashCachesOnDisk *int
- EthashDatasetDir *string
- EthashDatasetsInMem *int
- EthashDatasetsOnDisk *int
+ Ethash *ethash.Config
TxPool *core.TxPoolConfig
GPO *gasprice.Config
EnablePreimageRecording *bool
- DocRoot *string `toml:"-"`
- PowMode *ethash.Mode `toml:"-"`
+ DocRoot *string `toml:"-"`
}
var dec Config
if err := unmarshal(&dec); err != nil {
@@ -129,28 +111,13 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error {
c.MinerThreads = *dec.MinerThreads
}
if dec.ExtraData != nil {
- c.ExtraData = dec.ExtraData
+ c.ExtraData = *dec.ExtraData
}
if dec.GasPrice != nil {
c.GasPrice = dec.GasPrice
}
- if dec.EthashCacheDir != nil {
- c.Ethash.CacheDir = *dec.EthashCacheDir
- }
- if dec.EthashCachesInMem != nil {
- c.Ethash.CachesInMem = *dec.EthashCachesInMem
- }
- if dec.EthashCachesOnDisk != nil {
- c.Ethash.CachesOnDisk = *dec.EthashCachesOnDisk
- }
- if dec.EthashDatasetDir != nil {
- c.Ethash.DatasetDir = *dec.EthashDatasetDir
- }
- if dec.EthashDatasetsInMem != nil {
- c.Ethash.DatasetsInMem = *dec.EthashDatasetsInMem
- }
- if dec.EthashDatasetsOnDisk != nil {
- c.Ethash.DatasetsOnDisk = *dec.EthashDatasetsOnDisk
+ if dec.Ethash != nil {
+ c.Ethash = *dec.Ethash
}
if dec.TxPool != nil {
c.TxPool = *dec.TxPool
@@ -164,8 +131,5 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error {
if dec.DocRoot != nil {
c.DocRoot = *dec.DocRoot
}
- if dec.PowMode != nil {
- c.Ethash.PowMode = *dec.PowMode
- }
return nil
}
diff --git a/eth/handler.go b/eth/handler.go
index bec5126dc..c2426544f 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -71,7 +71,6 @@ type ProtocolManager struct {
txpool txPool
blockchain *core.BlockChain
- chaindb ethdb.Database
chainconfig *params.ChainConfig
maxPeers int
@@ -106,7 +105,6 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne
eventMux: mux,
txpool: txpool,
blockchain: blockchain,
- chaindb: chaindb,
chainconfig: config,
peers: newPeerSet(),
newPeerCh: make(chan *peer),
@@ -257,8 +255,14 @@ func (pm *ProtocolManager) handle(p *peer) error {
p.Log().Debug("Ethereum peer connected", "name", p.Name())
// Execute the Ethereum handshake
- td, head, genesis := pm.blockchain.Status()
- if err := p.Handshake(pm.networkId, td, head, genesis); err != nil {
+ var (
+ genesis = pm.blockchain.Genesis()
+ head = pm.blockchain.CurrentHeader()
+ hash = head.Hash()
+ number = head.Number.Uint64()
+ td = pm.blockchain.GetTd(hash, number)
+ )
+ if err := p.Handshake(pm.networkId, td, hash, genesis.Hash()); err != nil {
p.Log().Debug("Ethereum handshake failed", "err", err)
return err
}
@@ -394,14 +398,14 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
case query.Reverse:
// Number based traversal towards the genesis block
if query.Origin.Number >= query.Skip+1 {
- query.Origin.Number -= (query.Skip + 1)
+ query.Origin.Number -= query.Skip + 1
} else {
unknown = true
}
case !query.Reverse:
// Number based traversal towards the leaf block
- query.Origin.Number += (query.Skip + 1)
+ query.Origin.Number += query.Skip + 1
}
}
return p.SendBlockHeaders(headers)
@@ -532,7 +536,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
return errResp(ErrDecode, "msg %v: %v", msg, err)
}
// Retrieve the requested state entry, stopping if enough was found
- if entry, err := pm.chaindb.Get(hash.Bytes()); err == nil {
+ if entry, err := pm.blockchain.TrieNode(hash); err == nil {
data = append(data, entry)
bytes += len(entry)
}
@@ -570,7 +574,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
return errResp(ErrDecode, "msg %v: %v", msg, err)
}
// Retrieve the requested block's receipts, skipping if unknown to us
- results := core.GetBlockReceipts(pm.chaindb, hash, core.GetBlockNumber(pm.chaindb, hash))
+ results := pm.blockchain.GetReceiptsByHash(hash)
if results == nil {
if header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash {
continue
@@ -744,22 +748,24 @@ func (self *ProtocolManager) txBroadcastLoop() {
}
}
-// EthNodeInfo represents a short summary of the Ethereum sub-protocol metadata known
-// about the host peer.
-type EthNodeInfo struct {
- Network uint64 `json:"network"` // Ethereum network ID (1=Frontier, 2=Morden, Ropsten=3)
- Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain
- Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block
- Head common.Hash `json:"head"` // SHA3 hash of the host's best owned block
+// NodeInfo represents a short summary of the Ethereum sub-protocol metadata
+// known about the host peer.
+type NodeInfo struct {
+ Network uint64 `json:"network"` // Ethereum network ID (1=Frontier, 2=Morden, Ropsten=3, Rinkeby=4)
+ Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain
+ Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block
+ Config *params.ChainConfig `json:"config"` // Chain configuration for the fork rules
+ Head common.Hash `json:"head"` // SHA3 hash of the host's best owned block
}
// NodeInfo retrieves some protocol metadata about the running host node.
-func (self *ProtocolManager) NodeInfo() *EthNodeInfo {
+func (self *ProtocolManager) NodeInfo() *NodeInfo {
currentBlock := self.blockchain.CurrentBlock()
- return &EthNodeInfo{
+ return &NodeInfo{
Network: self.networkId,
Difficulty: self.blockchain.GetTd(currentBlock.Hash(), currentBlock.NumberU64()),
Genesis: self.blockchain.Genesis().Hash(),
+ Config: self.blockchain.Config(),
Head: currentBlock.Hash(),
}
}
diff --git a/eth/handler_test.go b/eth/handler_test.go
index 6752cd2a8..e336dfa28 100644
--- a/eth/handler_test.go
+++ b/eth/handler_test.go
@@ -37,8 +37,6 @@ import (
"github.com/ethereum/go-ethereum/params"
)
-var bigTxGas = new(big.Int).SetUint64(params.TxGas)
-
// Tests that protocol versions and modes of operations are matched up properly.
func TestProtocolCompatibility(t *testing.T) {
// Define the compatibility chart
@@ -58,7 +56,7 @@ func TestProtocolCompatibility(t *testing.T) {
for i, tt := range tests {
ProtocolVersions = []uint{tt.version}
- pm, err := newTestProtocolManager(tt.mode, 0, nil, nil)
+ pm, _, err := newTestProtocolManager(tt.mode, 0, nil, nil)
if pm != nil {
defer pm.Stop()
}
@@ -73,7 +71,7 @@ func TestGetBlockHeaders62(t *testing.T) { testGetBlockHeaders(t, 62) }
func TestGetBlockHeaders63(t *testing.T) { testGetBlockHeaders(t, 63) }
func testGetBlockHeaders(t *testing.T, protocol int) {
- pm := newTestProtocolManagerMust(t, downloader.FullSync, downloader.MaxHashFetch+15, nil, nil)
+ pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, downloader.MaxHashFetch+15, nil, nil)
peer, _ := newTestPeer("peer", protocol, pm, true)
defer peer.close()
@@ -232,7 +230,7 @@ func TestGetBlockBodies62(t *testing.T) { testGetBlockBodies(t, 62) }
func TestGetBlockBodies63(t *testing.T) { testGetBlockBodies(t, 63) }
func testGetBlockBodies(t *testing.T, protocol int) {
- pm := newTestProtocolManagerMust(t, downloader.FullSync, downloader.MaxBlockFetch+15, nil, nil)
+ pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, downloader.MaxBlockFetch+15, nil, nil)
peer, _ := newTestPeer("peer", protocol, pm, true)
defer peer.close()
@@ -315,13 +313,13 @@ func testGetNodeData(t *testing.T, protocol int) {
switch i {
case 0:
// In block 1, the test bank sends account #1 some ether.
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey)
block.AddTx(tx)
case 1:
// In block 2, the test bank sends some more ether to account #1.
// acc1Addr passes it on to account #2.
- tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, testBankKey)
- tx2, _ := types.SignTx(types.NewTransaction(block.TxNonce(acc1Addr), acc2Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, acc1Key)
+ tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, testBankKey)
+ tx2, _ := types.SignTx(types.NewTransaction(block.TxNonce(acc1Addr), acc2Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, acc1Key)
block.AddTx(tx1)
block.AddTx(tx2)
case 2:
@@ -339,13 +337,13 @@ func testGetNodeData(t *testing.T, protocol int) {
}
}
// Assemble the test environment
- pm := newTestProtocolManagerMust(t, downloader.FullSync, 4, generator, nil)
+ pm, db := newTestProtocolManagerMust(t, downloader.FullSync, 4, generator, nil)
peer, _ := newTestPeer("peer", protocol, pm, true)
defer peer.close()
// Fetch for now the entire chain db
hashes := []common.Hash{}
- for _, key := range pm.chaindb.(*ethdb.MemDatabase).Keys() {
+ for _, key := range db.Keys() {
if len(key) == len(common.Hash{}) {
hashes = append(hashes, common.BytesToHash(key))
}
@@ -407,13 +405,13 @@ func testGetReceipt(t *testing.T, protocol int) {
switch i {
case 0:
// In block 1, the test bank sends account #1 some ether.
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey)
block.AddTx(tx)
case 1:
// In block 2, the test bank sends some more ether to account #1.
// acc1Addr passes it on to account #2.
- tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, testBankKey)
- tx2, _ := types.SignTx(types.NewTransaction(block.TxNonce(acc1Addr), acc2Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, acc1Key)
+ tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBank), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, testBankKey)
+ tx2, _ := types.SignTx(types.NewTransaction(block.TxNonce(acc1Addr), acc2Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, acc1Key)
block.AddTx(tx1)
block.AddTx(tx2)
case 2:
@@ -431,7 +429,7 @@ func testGetReceipt(t *testing.T, protocol int) {
}
}
// Assemble the test environment
- pm := newTestProtocolManagerMust(t, downloader.FullSync, 4, generator, nil)
+ pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 4, generator, nil)
peer, _ := newTestPeer("peer", protocol, pm, true)
defer peer.close()
@@ -441,7 +439,7 @@ func testGetReceipt(t *testing.T, protocol int) {
block := pm.blockchain.GetBlockByNumber(i)
hashes = append(hashes, block.Hash())
- receipts = append(receipts, core.GetBlockReceipts(pm.chaindb, block.Hash(), block.NumberU64()))
+ receipts = append(receipts, pm.blockchain.GetReceiptsByHash(block.Hash()))
}
// Send the hash request and verify the response
p2p.Send(peer.app, 0x0f, hashes)
@@ -474,7 +472,7 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool
config = &params.ChainConfig{DAOForkBlock: big.NewInt(1), DAOForkSupport: localForked}
gspec = &core.Genesis{Config: config}
genesis = gspec.MustCommit(db)
- blockchain, _ = core.NewBlockChain(db, config, pow, vm.Config{})
+ blockchain, _ = core.NewBlockChain(db, nil, config, pow, vm.Config{})
)
pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db)
if err != nil {
@@ -498,7 +496,7 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool
}
// Create a block to reply to the challenge if no timeout is simulated
if !timeout {
- blocks, _ := core.GenerateChain(&params.ChainConfig{}, genesis, db, 1, func(i int, block *core.BlockGen) {
+ blocks, _ := core.GenerateChain(&params.ChainConfig{}, genesis, ethash.NewFaker(), db, 1, func(i int, block *core.BlockGen) {
if remoteForked {
block.SetExtra(params.DAOForkBlockExtra)
}
diff --git a/eth/helper_test.go b/eth/helper_test.go
index f02242b15..2b05cea80 100644
--- a/eth/helper_test.go
+++ b/eth/helper_test.go
@@ -49,7 +49,7 @@ var (
// newTestProtocolManager creates a new protocol manager for testing purposes,
// with the given number of blocks already known, and potential notification
// channels for different events.
-func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, error) {
+func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, *ethdb.MemDatabase, error) {
var (
evmux = new(event.TypeMux)
engine = ethash.NewFaker()
@@ -59,31 +59,31 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func
Alloc: core.GenesisAlloc{testBank: {Balance: big.NewInt(1000000)}},
}
genesis = gspec.MustCommit(db)
- blockchain, _ = core.NewBlockChain(db, gspec.Config, engine, vm.Config{})
+ blockchain, _ = core.NewBlockChain(db, nil, gspec.Config, engine, vm.Config{})
)
- chain, _ := core.GenerateChain(gspec.Config, genesis, db, blocks, generator)
+ chain, _ := core.GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, blocks, generator)
if _, err := blockchain.InsertChain(chain); err != nil {
panic(err)
}
pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db)
if err != nil {
- return nil, err
+ return nil, nil, err
}
pm.Start(1000)
- return pm, nil
+ return pm, db, nil
}
// newTestProtocolManagerMust creates a new protocol manager for testing purposes,
// with the given number of blocks already known, and potential notification
// channels for different events. In case of an error, the constructor force-
// fails the test.
-func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) *ProtocolManager {
- pm, err := newTestProtocolManager(mode, blocks, generator, newtx)
+func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, *ethdb.MemDatabase) {
+ pm, db, err := newTestProtocolManager(mode, blocks, generator, newtx)
if err != nil {
t.Fatalf("Failed to create protocol manager: %v", err)
}
- return pm
+ return pm, db
}
// testTxPool is a fake, helper transaction pool for testing purposes
@@ -130,7 +130,7 @@ func (p *testTxPool) SubscribeTxPreEvent(ch chan<- core.TxPreEvent) event.Subscr
// newTestTransaction create a new dummy transaction.
func newTestTransaction(from *ecdsa.PrivateKey, nonce uint64, datasize int) *types.Transaction {
- tx := types.NewTransaction(nonce, common.Address{}, big.NewInt(0), big.NewInt(100000), big.NewInt(0), make([]byte, datasize))
+ tx := types.NewTransaction(nonce, common.Address{}, big.NewInt(0), 100000, big.NewInt(0), make([]byte, datasize))
tx, _ = types.SignTx(tx, types.HomesteadSigner{}, from)
return tx
}
@@ -166,8 +166,12 @@ func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*te
tp := &testPeer{app: app, net: net, peer: peer}
// Execute any implicitly requested handshakes and return
if shake {
- td, head, genesis := pm.blockchain.Status()
- tp.handshake(nil, td, head, genesis)
+ var (
+ genesis = pm.blockchain.Genesis()
+ head = pm.blockchain.CurrentHeader()
+ td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64())
+ )
+ tp.handshake(nil, td, head.Hash(), genesis.Hash())
}
return tp, errc
}
diff --git a/eth/protocol_test.go b/eth/protocol_test.go
index d3a44ae91..b2f93d8dd 100644
--- a/eth/protocol_test.go
+++ b/eth/protocol_test.go
@@ -41,8 +41,12 @@ func TestStatusMsgErrors62(t *testing.T) { testStatusMsgErrors(t, 62) }
func TestStatusMsgErrors63(t *testing.T) { testStatusMsgErrors(t, 63) }
func testStatusMsgErrors(t *testing.T, protocol int) {
- pm := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
- td, currentBlock, genesis := pm.blockchain.Status()
+ pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
+ var (
+ genesis = pm.blockchain.Genesis()
+ head = pm.blockchain.CurrentHeader()
+ td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64())
+ )
defer pm.Stop()
tests := []struct {
@@ -55,16 +59,16 @@ func testStatusMsgErrors(t *testing.T, protocol int) {
wantError: errResp(ErrNoStatusMsg, "first msg has code 2 (!= 0)"),
},
{
- code: StatusMsg, data: statusData{10, DefaultConfig.NetworkId, td, currentBlock, genesis},
+ code: StatusMsg, data: statusData{10, DefaultConfig.NetworkId, td, head.Hash(), genesis.Hash()},
wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", protocol),
},
{
- code: StatusMsg, data: statusData{uint32(protocol), 999, td, currentBlock, genesis},
+ code: StatusMsg, data: statusData{uint32(protocol), 999, td, head.Hash(), genesis.Hash()},
wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"),
},
{
- code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, currentBlock, common.Hash{3}},
- wantError: errResp(ErrGenesisBlockMismatch, "0300000000000000 (!= %x)", genesis[:8]),
+ code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}},
+ wantError: errResp(ErrGenesisBlockMismatch, "0300000000000000 (!= %x)", genesis.Hash().Bytes()[:8]),
},
}
@@ -94,7 +98,7 @@ func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) }
func testRecvTransactions(t *testing.T, protocol int) {
txAdded := make(chan []*types.Transaction)
- pm := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, txAdded)
+ pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, txAdded)
pm.acceptTxs = 1 // mark synced to accept transactions
p, _ := newTestPeer("peer", protocol, pm, true)
defer pm.Stop()
@@ -121,7 +125,7 @@ func TestSendTransactions62(t *testing.T) { testSendTransactions(t, 62) }
func TestSendTransactions63(t *testing.T) { testSendTransactions(t, 63) }
func testSendTransactions(t *testing.T, protocol int) {
- pm := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
+ pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
defer pm.Stop()
// Fill the pool with big transactions.
diff --git a/eth/sync_test.go b/eth/sync_test.go
index 9eaa1156f..88c10c7f7 100644
--- a/eth/sync_test.go
+++ b/eth/sync_test.go
@@ -30,12 +30,12 @@ import (
// imported into the blockchain.
func TestFastSyncDisabling(t *testing.T) {
// Create a pristine protocol manager, check that fast sync is left enabled
- pmEmpty := newTestProtocolManagerMust(t, downloader.FastSync, 0, nil, nil)
+ pmEmpty, _ := newTestProtocolManagerMust(t, downloader.FastSync, 0, nil, nil)
if atomic.LoadUint32(&pmEmpty.fastSync) == 0 {
t.Fatalf("fast sync disabled on pristine blockchain")
}
// Create a full protocol manager, check that fast sync gets disabled
- pmFull := newTestProtocolManagerMust(t, downloader.FastSync, 1024, nil, nil)
+ pmFull, _ := newTestProtocolManagerMust(t, downloader.FastSync, 1024, nil, nil)
if atomic.LoadUint32(&pmFull.fastSync) == 1 {
t.Fatalf("fast sync not disabled on non-empty blockchain")
}
diff --git a/eth/tracers/internal/tracers/4byte_tracer.js b/eth/tracers/internal/tracers/4byte_tracer.js
new file mode 100644
index 000000000..0a6b088cc
--- /dev/null
+++ b/eth/tracers/internal/tracers/4byte_tracer.js
@@ -0,0 +1,86 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// 4byteTracer searches for 4byte-identifiers, and collects them for post-processing.
+// It collects the methods identifiers along with the size of the supplied data, so
+// a reversed signature can be matched against the size of the data.
+//
+// Example:
+// > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4byteTracer"})
+// {
+// 0x27dc297e-128: 1,
+// 0x38cc4831-0: 2,
+// 0x524f3889-96: 1,
+// 0xadf59f99-288: 1,
+// 0xc281d19e-0: 1
+// }
+{
+ // ids aggregates the 4byte ids found.
+ ids : {},
+
+ // callType returns 'false' for non-calls, or the peek-index for the first param
+ // after 'value', i.e. meminstart.
+ callType: function(opstr){
+ switch(opstr){
+ case "CALL": case "CALLCODE":
+ // gas, addr, val, memin, meminsz, memout, memoutsz
+ return 3; // stack ptr to memin
+
+ case "DELEGATECALL": case "STATICCALL":
+ // gas, addr, memin, meminsz, memout, memoutsz
+ return 2; // stack ptr to memin
+ }
+ return false;
+ },
+
+ // store save the given indentifier and datasize.
+ store: function(id, size){
+ var key = "" + toHex(id) + "-" + size;
+ this.ids[key] = this.ids[key] + 1 || 1;
+ },
+
+ // step is invoked for every opcode that the VM executes.
+ step: function(log, db) {
+ // Skip any opcodes that are not internal calls
+ var ct = this.callType(log.op.toString());
+ if (!ct) {
+ return;
+ }
+ // Skip any pre-compile invocations, those are just fancy opcodes
+ if (isPrecompiled(toAddress(log.stack.peek(1)))) {
+ return;
+ }
+ // Gather internal call details
+ var inSz = log.stack.peek(ct + 1).valueOf();
+ if (inSz >= 4) {
+ var inOff = log.stack.peek(ct).valueOf();
+ this.store(log.memory.slice(inOff, inOff + 4), inSz-4);
+ }
+ },
+
+ // fault is invoked when the actual execution of an opcode fails.
+ fault: function(log, db) { },
+
+ // result is invoked when all the opcodes have been iterated over and returns
+ // the final result of the tracing.
+ result: function(ctx) {
+ // Save the outer calldata also
+ if (ctx.input.length > 4) {
+ this.store(slice(ctx.input, 0, 4), ctx.input.length-4)
+ }
+ return this.ids;
+ },
+}
diff --git a/eth/tracers/internal/tracers/assets.go b/eth/tracers/internal/tracers/assets.go
new file mode 100644
index 000000000..1912f74ed
--- /dev/null
+++ b/eth/tracers/internal/tracers/assets.go
@@ -0,0 +1,350 @@
+// Code generated by go-bindata. DO NOT EDIT.
+// sources:
+// 4byte_tracer.js
+// call_tracer.js
+// evmdis_tracer.js
+// noop_tracer.js
+// opcount_tracer.js
+// prestate_tracer.js
+
+package tracers
+
+import (
+ "bytes"
+ "compress/gzip"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+func bindataRead(data []byte, name string) ([]byte, error) {
+ gz, err := gzip.NewReader(bytes.NewBuffer(data))
+ if err != nil {
+ return nil, fmt.Errorf("Read %q: %v", name, err)
+ }
+
+ var buf bytes.Buffer
+ _, err = io.Copy(&buf, gz)
+ clErr := gz.Close()
+
+ if err != nil {
+ return nil, fmt.Errorf("Read %q: %v", name, err)
+ }
+ if clErr != nil {
+ return nil, err
+ }
+
+ return buf.Bytes(), nil
+}
+
+type asset struct {
+ bytes []byte
+ info os.FileInfo
+}
+
+type bindataFileInfo struct {
+ name string
+ size int64
+ mode os.FileMode
+ modTime time.Time
+}
+
+func (fi bindataFileInfo) Name() string {
+ return fi.name
+}
+func (fi bindataFileInfo) Size() int64 {
+ return fi.size
+}
+func (fi bindataFileInfo) Mode() os.FileMode {
+ return fi.mode
+}
+func (fi bindataFileInfo) ModTime() time.Time {
+ return fi.modTime
+}
+func (fi bindataFileInfo) IsDir() bool {
+ return false
+}
+func (fi bindataFileInfo) Sys() interface{} {
+ return nil
+}
+
+var __4byte_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x56\x5b\x6f\xdb\x4a\x0e\x7e\xb6\x7f\x05\xd7\x2f\xb5\x51\x59\x8e\x2f\x89\x2f\xd9\x16\xf0\xe6\xa4\x6d\x80\x9c\x24\x88\xdd\x3d\x28\x16\xfb\x30\x9e\xa1\xac\xd9\xc8\x33\xc2\x0c\xe5\x4b\x73\xf2\xdf\x17\x1c\x49\x89\x93\xd3\x62\xbb\x4f\x96\x47\xc3\x8f\x1f\xc9\x8f\xa4\x7a\x3d\xb8\xb0\xf9\xc1\xe9\x75\x4a\x30\x38\xe9\x8f\x61\x99\x22\xac\x6d\x17\x29\x45\x87\xc5\x06\xe6\x05\xa5\xd6\xf9\x66\xaf\x07\xcb\x54\x7b\x48\x74\x86\xa0\x3d\xe4\xc2\x11\xd8\x04\xe8\xcd\xfd\x4c\xaf\x9c\x70\x87\xb8\xd9\xeb\x95\x36\x3f\x7c\xcd\x08\x89\x43\x04\x6f\x13\xda\x09\x87\x33\x38\xd8\x02\xa4\x30\xe0\x50\x69\x4f\x4e\xaf\x0a\x42\xd0\x04\xc2\xa8\x9e\x75\xb0\xb1\x4a\x27\x07\x86\xd4\x04\x85\x51\xe8\x82\x6b\x42\xb7\xf1\x35\x8f\xcf\x37\x5f\xe1\x1a\xbd\x47\x07\x9f\xd1\xa0\x13\x19\xdc\x15\xab\x4c\x4b\xb8\xd6\x12\x8d\x47\x10\x1e\x72\x3e\xf1\x29\x2a\x58\x05\x38\x36\xfc\xc4\x54\x16\x15\x15\xf8\x64\x0b\xa3\x04\x69\x6b\x22\x40\xcd\xcc\x61\x8b\xce\x6b\x6b\x60\x58\xbb\xaa\x00\x23\xb0\x8e\x41\xda\x82\x38\x00\x07\x36\x67\xbb\x0e\x08\x73\x80\x4c\xd0\x8b\xe9\x2f\x24\xe4\x25\x6e\x05\xda\x04\x37\xa9\xcd\x11\x28\x15\xc4\x51\xef\x74\x96\xc1\x0a\xa1\xf0\x98\x14\x59\xc4\x68\xab\x82\xe0\x8f\xab\xe5\x97\xdb\xaf\x4b\x98\xdf\x7c\x83\x3f\xe6\xf7\xf7\xf3\x9b\xe5\xb7\x73\xd8\x69\x4a\x6d\x41\x80\x5b\x2c\xa1\xf4\x26\xcf\x34\x2a\xd8\x09\xe7\x84\xa1\x03\xd8\x84\x11\x7e\xbf\xbc\xbf\xf8\x32\xbf\x59\xce\xff\x71\x75\x7d\xb5\xfc\x06\xd6\xc1\xa7\xab\xe5\xcd\xe5\x62\x01\x9f\x6e\xef\x61\x0e\x77\xf3\xfb\xe5\xd5\xc5\xd7\xeb\xf9\x3d\xdc\x7d\xbd\xbf\xbb\x5d\x5c\xc6\xb0\x40\x66\x85\x6c\xff\xbf\x73\x9e\x84\xea\x39\x04\x85\x24\x74\xe6\xeb\x4c\x7c\xb3\x05\xf8\xd4\x16\x99\x82\x54\x6c\x11\x1c\x4a\xd4\x5b\x54\x20\x40\xda\xfc\xf0\xcb\x45\x65\x2c\x91\x59\xb3\x0e\x31\xff\x54\x90\x70\x95\x80\xb1\x14\x81\x47\x84\xbf\xa7\x44\xf9\xac\xd7\xdb\xed\x76\xf1\xda\x14\xb1\x75\xeb\x5e\x56\xc2\xf9\xde\xc7\xb8\xc9\x98\xa3\xd5\x81\x70\xe9\x84\x44\x07\x1e\x85\x93\x29\xfa\x10\x4c\x78\xd1\xd5\x0a\x0d\xe9\x44\xa3\xf3\x11\x8b\x14\xa4\xcd\x32\x94\xe4\x99\xc1\x26\x5c\xcc\xad\xa7\x6e\xee\xac\x44\xef\xb5\x59\x73\xe0\x70\x45\xaf\x2e\xc2\x06\x29\xb5\xca\xc3\x11\xdc\xdb\x68\xbc\xfe\x8e\x75\x36\x7c\x91\x97\x65\x54\x82\x44\x04\xde\x86\xe8\xc1\x21\xcb\x0c\x15\x78\xbd\x36\x82\x0a\x87\xa1\x97\x56\x08\x1b\x41\x92\xc5\x2e\xd6\x42\x1b\x4f\x7f\x01\x64\x9c\xba\x22\x97\x7b\xb1\xc9\x33\x9c\xf1\x33\xc0\x47\x50\xb8\x2a\xd6\x31\x71\x0a\x96\x4e\x18\x2f\x24\x8b\xbb\x0d\xad\x93\xfd\xa0\x3f\xc2\xd3\xe9\x18\x87\xa7\x4a\x9c\x4c\x86\x67\xd3\x41\x72\x3a\x9c\x9c\xf5\x47\x7d\x3c\x9b\x26\xa3\x31\x4e\xc7\xc3\xd5\x40\x9e\x9e\xe1\x58\x4c\x4e\xc6\xc3\x55\x1f\xc5\xc9\x24\x51\xe3\xd3\x71\x1f\xa7\x0a\x5b\x11\x3c\x06\x60\x37\x83\xd6\x51\xa6\x5b\x4f\x9d\xd2\xfb\x63\xf9\x03\x70\xb2\x1f\x8c\x95\x1c\x4c\xc7\xd8\xed\x0f\x26\x33\xe8\x47\x2f\x6f\x86\x13\x29\x47\x93\x61\xbf\x7b\x32\x83\xc1\xd1\xf9\xe9\x60\x94\x0c\x27\x93\x69\x77\x7a\xf6\xda\x40\xa8\xe4\x74\x9a\x4c\xa7\xdd\xc1\xe4\x0d\x94\x1c\x4c\xfa\xaa\x3f\x45\x86\xea\x97\xc7\x4f\xcd\xc7\x66\x83\x07\x8e\xf2\x20\xd6\x6b\x87\x6b\x41\x58\x56\x2d\x30\x0e\x2f\x12\x1e\x16\x71\xb3\xc1\xcf\x33\x78\x7c\x8a\x9a\xc1\x46\x8a\x2c\x5b\x1e\x72\x56\x35\x15\xce\x78\x78\x97\x88\xcc\xe3\xbb\xa0\x0b\x63\x4d\x97\x2f\x78\x1e\x1f\x01\x2f\x47\x7c\xe8\x6a\xa3\x70\x1f\x2e\xf0\x51\xa2\x9d\x27\x1e\xb3\x62\x13\x10\x45\xc2\xd3\xe4\xdd\x56\x64\x05\xbe\x8b\x40\xc7\x18\xc3\x06\x37\x5c\x54\xe1\x28\x6e\x36\x6a\x97\x33\x48\x0a\x53\x56\xca\xe6\x9e\x5c\xe7\xb1\xd9\x68\xf8\x9d\x26\x99\x1e\x1d\x48\xe1\x11\x5a\x17\xf3\xeb\xeb\xd6\x0c\x5e\xfe\x5c\xdc\xfe\x76\xd9\x9a\x35\x1b\x0d\x76\xb9\x16\x2c\x6d\xa5\x5c\x04\x5b\x91\x45\xa5\xbb\xea\xc7\x7f\x0f\x0f\xb6\xa0\xfa\xd7\x7f\x67\xb3\x32\x5e\x18\x9e\x43\xaf\x07\x9e\x84\x7c\x80\x9c\x1c\x90\x2d\xcd\x9a\xcf\xae\x7f\xbb\xbc\xbe\xfc\x3c\x5f\x5e\xbe\xa2\xb0\x58\xce\x97\x57\x17\xe5\xd1\x5f\x49\xfc\x1f\xfe\x07\x3f\xf3\xdf\x68\x3c\x35\x9f\x6f\x85\x9a\x9c\x37\x1b\x75\xd5\x3c\xf1\x9c\xf2\x3c\x8d\xc2\x18\xd1\x3c\x3c\xb9\x2c\x55\x6b\x86\x3e\xe7\x8e\xe1\x0e\x8a\x9b\x8d\x70\xff\x28\xdf\x5a\x45\xa1\xb9\x42\x86\xb7\xc2\xc1\x03\x1e\xe0\x03\xb4\x5a\xf0\x1e\xc8\x7e\xc1\x7d\x5b\xab\x0e\xbc\x87\x56\x97\x4f\xf8\xe6\x79\xb3\xd1\xa0\x54\xfb\x58\x2b\xff\xaf\x07\x3c\xfc\x1b\x3e\xc0\xeb\xff\xef\xa1\x0f\x7f\xfe\x09\xfd\x57\x34\x31\xe7\x85\xa1\xcd\xd6\x3e\xa0\x0a\x92\xe1\x01\x70\x00\x9b\x4b\xab\xaa\x8d\xc1\x11\xfc\xf3\x77\xc0\x3d\xca\x82\xd0\x07\xba\x98\x1f\xb1\xcd\xec\x3a\x02\xb5\xea\x00\xb3\xed\xf5\x60\xf1\xa0\xf3\xb0\xb8\x4a\x14\x5f\xc2\xf0\x46\x34\x96\x40\x1b\x42\x67\x44\x16\xa4\xed\xab\xf8\x24\xd5\x7c\x6b\xf5\x31\x6a\x6c\xf3\x98\xec\x82\x9c\x36\xeb\x76\xa7\xc3\x31\xea\x04\xda\x7f\x93\x54\xfa\xaa\xd2\x7f\x5e\x15\xe3\xd8\x75\xee\xb0\x2b\xed\x26\x0f\x5f\x19\x66\x6b\x65\xd8\xc3\x3e\x02\x4a\x2d\xef\x6f\x87\xf0\x9f\xc2\x13\x24\xc2\xc8\x67\xa2\x15\xbe\xf6\x77\x0e\x2b\x63\xd5\x26\x3b\x57\xca\xa1\xf7\x81\x51\x50\x42\xcc\x6d\xd6\xee\x77\x3a\x9d\x9f\xf1\xf8\x2c\xc2\xba\x7f\x15\x6b\xbd\xb7\xaa\x90\xb5\x59\x7c\x87\x0f\xf0\x06\x54\x12\x17\xaa\x13\x87\xf6\xbc\x4d\xda\xcf\x41\x87\xeb\x1f\x3f\xc0\xa8\x72\x59\x42\xdc\x26\xc9\x8f\x30\xde\xd8\x97\xca\x08\x22\x0b\x41\xb0\xce\xdd\x21\xf6\xbc\xa9\xda\x01\x24\xaa\xb0\xde\xc3\xa8\x13\x05\x6a\xdd\x51\xa7\x8a\xa7\x56\x4b\x22\x8a\x8c\x8e\xe5\xb2\x4b\xab\x4f\x02\x21\xa9\x10\x59\xa5\x10\xfe\xbc\xb1\x09\x08\x53\x8b\x28\x29\x97\x75\x23\xd8\xff\x50\x36\x50\xbb\x70\xe8\x7f\xe4\x83\x93\xc7\x7e\x6a\x3d\x85\x35\xbf\x42\xee\x29\x42\x27\xf8\x3b\xc7\x6e\xab\xae\xaa\xe6\x64\x80\x2b\xc7\x1f\xe7\xbf\x02\xae\x76\x15\x2f\x8c\xb0\x47\x1b\xe5\xf9\x11\x29\x49\xfb\x17\x1d\xd7\xfd\x6b\x0b\x1e\x99\x5c\x43\xee\x59\x10\x99\xb7\x55\x55\x24\xed\x63\x6d\xf2\x82\xe2\x0c\xcd\x9a\x52\xf8\xf8\x5c\xa0\xa3\x9c\x97\x89\x7e\xbe\x1b\xc1\x49\x14\xf2\xfc\xd6\xba\x3b\xea\xbc\x9e\x2b\x75\x07\x97\x3d\xfb\xd4\xfc\x6f\x00\x00\x00\xff\xff\x08\x1e\xd9\xac\x67\x0b\x00\x00")
+
+func _4byte_tracerJsBytes() ([]byte, error) {
+ return bindataRead(
+ __4byte_tracerJs,
+ "4byte_tracer.js",
+ )
+}
+
+func _4byte_tracerJs() (*asset, error) {
+ bytes, err := _4byte_tracerJsBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "4byte_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _call_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x59\xdf\x6f\x1b\x37\xf2\x7f\x96\xfe\x8a\x49\x1e\x6a\x09\x51\x24\x27\xe9\xb7\x5f\xc0\xae\x7a\xd0\x39\x4a\x6a\xc0\x8d\x03\x5b\x69\x10\x04\x79\xa0\x76\x67\x25\xd6\x5c\x72\x4b\x72\x2d\xef\xa5\xfe\xdf\x0f\x33\xe4\xae\x56\x3f\xec\xe8\x7a\xb8\x43\xef\x45\xd0\x2e\x67\x86\xc3\x99\xcf\xfc\xe2\x8e\x46\x70\x66\x8a\xca\xca\xc5\xd2\xc3\xcb\xe3\x17\xff\x0f\xb3\x25\xc2\xc2\x3c\x47\xbf\x44\x8b\x65\x0e\x93\xd2\x2f\x8d\x75\xdd\xd1\x08\x66\x4b\xe9\x20\x93\x0a\x41\x3a\x28\x84\xf5\x60\x32\xf0\x5b\xf4\x4a\xce\xad\xb0\xd5\xb0\x3b\x1a\x05\x9e\xbd\xcb\x24\x21\xb3\x88\xe0\x4c\xe6\x57\xc2\xe2\x09\x54\xa6\x84\x44\x68\xb0\x98\x4a\xe7\xad\x9c\x97\x1e\x41\x7a\x10\x3a\x1d\x19\x0b\xb9\x49\x65\x56\x91\x48\xe9\xa1\xd4\x29\x5a\xde\xda\xa3\xcd\x5d\xad\xc7\xdb\x77\x1f\xe0\x02\x9d\x43\x0b\x6f\x51\xa3\x15\x0a\xde\x97\x73\x25\x13\xb8\x90\x09\x6a\x87\x20\x1c\x14\xf4\xc6\x2d\x31\x85\x39\x8b\x23\xc6\x37\xa4\xca\x75\x54\x05\xde\x98\x52\xa7\xc2\x4b\xa3\x07\x80\x92\x34\x87\x5b\xb4\x4e\x1a\x0d\xaf\xea\xad\xa2\xc0\x01\x18\x4b\x42\x7a\xc2\xd3\x01\x2c\x98\x82\xf8\xfa\x20\x74\x05\x4a\xf8\x35\xeb\x01\x06\x59\x9f\x3b\x05\xa9\x79\x9b\xa5\x29\x10\xfc\x52\x78\x3a\xf5\x4a\x2a\x05\x73\x84\xd2\x61\x56\xaa\x01\x49\x9b\x97\x1e\x3e\x9e\xcf\x7e\xbe\xfc\x30\x83\xc9\xbb\x4f\xf0\x71\x72\x75\x35\x79\x37\xfb\x74\x0a\x2b\xe9\x97\xa6\xf4\x80\xb7\x18\x44\xc9\xbc\x50\x12\x53\x58\x09\x6b\x85\xf6\x15\x98\x8c\x24\xfc\x32\xbd\x3a\xfb\x79\xf2\x6e\x36\xf9\xfb\xf9\xc5\xf9\xec\x13\x18\x0b\x6f\xce\x67\xef\xa6\xd7\xd7\xf0\xe6\xf2\x0a\x26\xf0\x7e\x72\x35\x3b\x3f\xfb\x70\x31\xb9\x82\xf7\x1f\xae\xde\x5f\x5e\x4f\x87\x70\x8d\xa4\x15\x12\xff\xb7\x6d\x9e\xb1\xf7\x2c\x42\x8a\x5e\x48\xe5\x6a\x4b\x7c\x32\x25\xb8\xa5\x29\x55\x0a\x4b\x71\x8b\x60\x31\x41\x79\x8b\x29\x08\x48\x4c\x51\x1d\xec\x54\x92\x25\x94\xd1\x0b\x3e\xf3\x83\x80\x84\xf3\x0c\xb4\xf1\x03\x70\x88\xf0\xe3\xd2\xfb\xe2\x64\x34\x5a\xad\x56\xc3\x85\x2e\x87\xc6\x2e\x46\x2a\x88\x73\xa3\x9f\x86\x5d\x92\x99\x08\xa5\x66\x56\x24\x68\xc9\x39\x02\xb2\x92\xcc\xaf\xcc\x4a\x83\xb7\x42\x3b\x91\x90\xab\xe9\x7f\xc2\x60\x14\x1e\xf0\x8e\x9e\xbc\x23\xd0\x82\xc5\xc2\x58\xfa\xaf\x54\x8d\x33\xa9\x3d\x5a\x2d\x14\xcb\x76\x90\x8b\x14\x61\x5e\x81\x68\x0b\x1c\xb4\x0f\x43\x30\x0a\xee\x06\xa9\x33\x63\x73\x86\xe5\xb0\xfb\xb5\xdb\x89\x1a\x3a\x2f\x92\x1b\x52\x90\xe4\x27\xa5\xb5\xa8\x3d\x99\xb2\xb4\x4e\xde\x22\x93\x40\xa0\x89\xf6\x9c\xfe\xfa\x0b\xe0\x1d\x26\x65\x90\xd4\x69\x84\x9c\xc0\xe7\xaf\xf7\x5f\x06\x5d\x16\x9d\xa2\x4b\x50\xa7\x98\xf2\xf9\x6e\x1c\xac\x96\x6c\x51\x58\xe1\xd1\x2d\xc2\x6f\xa5\xf3\x2d\x9a\xcc\x9a\x1c\x84\x06\x53\x12\xe2\xdb\xd6\x91\xda\x1b\x16\x28\xe8\xbf\x46\xcb\x1a\x0d\xbb\x9d\x86\xf9\x04\x32\xa1\x1c\xc6\x7d\x9d\xc7\x82\x4e\x23\xf5\xad\xb9\x21\xc9\xc6\x12\x84\x6d\x05\xa6\x48\x4c\x1a\x83\x81\xce\xd1\x1c\x03\xdd\xb0\xdb\x21\xbe\x13\xc8\x4a\xcd\xdb\xf6\x94\x59\x0c\x20\x9d\xf7\xe1\x6b\xb7\x43\x62\xcf\x44\xe1\x4b\x8b\x6c\x4f\xb4\xd6\x58\x07\x32\xcf\x31\x95\xc2\xa3\xaa\xba\x9d\xce\xad\xb0\x61\x01\xc6\xa0\xcc\x62\xb8\x40\x3f\xa5\xc7\x5e\xff\xb4\xdb\xe9\xc8\x0c\x7a\x61\xf5\xc9\x78\xcc\xd9\x27\x93\x1a\xd3\x20\xbe\xe3\x97\xd2\x0d\x33\x51\x2a\xdf\xec\x4b\x4c\x1d\x8b\xbe\xb4\x9a\xfe\xde\x07\x2d\x3e\x22\x18\xad\x2a\x48\x28\xcb\x88\x39\x85\xa7\xab\x9c\xc7\x3c\x1e\xce\x0d\x20\x13\x8e\x4c\x28\x33\x58\x21\x14\x16\x9f\x27\x4b\x24\xdf\xe9\x04\xa3\x96\xae\x72\xec\xd4\x31\xd0\x6e\x43\x53\x0c\xbd\x79\x57\xe6\x73\xb4\xbd\x3e\x7c\x07\xc7\x77\xd9\x71\x1f\xc6\x63\xfe\x53\xeb\x1e\x79\xa2\xbe\x24\xc5\x14\xf1\xa0\xcc\x7f\xed\xad\xd4\x8b\x70\xd6\xa8\xeb\x79\x06\x02\x34\xae\x20\x31\x9a\x41\x4d\x5e\x99\xa3\xd4\x0b\x48\x2c\x0a\x8f\xe9\x00\x44\x9a\x82\x37\x01\x79\x0d\xce\x36\xb7\x84\xef\xbe\xe3\xbd\xc6\x70\x74\x76\x35\x9d\xcc\xa6\x47\x2d\x25\xa4\xbe\xcc\xb2\xa8\x07\xf3\x0e\x0b\xc4\x9b\xde\x8b\xfe\xf0\x56\xa8\x12\x2f\xb3\xa0\x51\xa4\x9d\xea\x14\xc6\x91\xe7\xd9\x36\xcf\xcb\x0d\x1e\x62\x1a\x8d\x60\xe2\x1c\xe6\x73\x85\xbb\xb1\x17\x83\x93\xe3\xd4\x79\x4a\x4e\x04\xb4\xc4\xe4\x85\x42\x02\x50\xbd\x6b\xb4\x34\x6b\xdc\xf1\x55\x81\x27\x00\x00\xa6\x18\xf0\x0b\x82\x3d\xbf\xf0\xe6\x67\xbc\x63\x77\xd4\xd6\x22\x00\x4d\xd2\xd4\xa2\x73\xbd\x7e\x3f\x90\x4b\x5d\x94\xfe\x64\x83\x3c\xc7\xdc\xd8\x6a\xe8\x28\xf7\xf4\xf8\x68\x83\x70\xd2\x9a\x67\x21\xdc\xb9\x26\x9e\x08\xca\xb7\xc2\xf5\xd6\x4b\x67\xc6\xf9\x93\x7a\x89\x1e\xea\x35\xb6\x05\xb1\x1d\x1d\xdf\x1d\xed\x5a\xeb\xb8\xbf\x76\xfa\x8b\x1f\xfa\xc4\x72\x7f\xda\x40\xb9\xc9\x08\xc3\xa2\x74\xcb\x1e\x23\x67\xbd\xba\x8e\xfa\x31\x78\x5b\xe2\x5e\xa4\x33\x7a\x76\x91\xe3\x50\x65\x94\x36\xbc\x2d\x13\x46\xd0\x42\x70\x52\xe1\xa0\x16\x94\x64\x5d\x39\x67\x9b\x7b\x63\x1e\x04\xd2\xf5\xf4\xe2\xcd\xeb\xe9\xf5\xec\xea\xc3\xd9\xac\x0d\x27\x85\x99\x27\xa5\x36\xcf\xa0\x50\x2f\xfc\x92\xf5\x27\x71\x9b\xab\x9f\x89\xe7\xf9\x8b\x2f\xe1\x0d\x8c\xf7\x44\x77\xe7\x71\x0e\xf8\xfc\x85\x65\xdf\xef\x9a\x6f\x93\x34\x18\xf3\x6b\x00\x91\x29\xee\xdb\x39\x62\x4f\xd8\xe5\xe8\x97\x26\xe5\x3c\x98\x88\x90\x4a\x6b\x2b\xa6\x46\xe3\xc1\xc1\xd7\xab\xa3\x6f\x72\x71\x71\x04\x7f\xfc\x01\xad\xe7\xb3\xcb\xd7\xd3\xf6\xbb\xd7\xd3\x8b\xe9\xdb\xc9\x6c\xba\x4d\x7b\x3d\x9b\xcc\xce\xcf\xf8\x6d\x3f\x5a\x65\x34\x82\xeb\x1b\x59\x70\x42\xe5\x34\x65\xf2\x82\x3b\xc3\x46\x5f\x37\x00\xbf\x34\xd4\x73\xd9\x58\x2f\x32\xa1\x93\x3a\x8f\xbb\xda\x69\xde\x90\xcb\x4c\x1d\x2b\xbb\xa9\xa0\x0d\xd4\x7e\xe3\x46\xe9\xde\x5b\x8c\x9b\xa6\x3d\x6f\x6a\xbd\xd6\x06\x0d\x1e\xe1\x5c\xc7\x49\xa6\x77\xf8\x21\xe1\x6f\x70\x0c\x27\xf0\x22\x66\x92\x47\x52\xd5\x4b\x78\x46\xe2\xff\x44\xc2\x7a\xb5\x87\xf3\xaf\x99\xb6\xbc\x61\xe2\x9a\xdc\x9b\xff\x7e\x3a\x33\xa5\xbf\xcc\xb2\x13\xd8\x36\xe2\xf7\x3b\x46\x6c\xe8\x2f\x50\xef\xd2\xff\xdf\x0e\xfd\x3a\xf5\x11\xaa\x4c\x01\x4f\x76\x20\x12\x12\xcf\x93\xad\x38\x88\xc6\xe5\x6e\x86\xa5\xc1\xf8\x81\x64\xfb\x72\x13\xc3\x0f\x65\x8b\x7f\x2b\xd9\xee\xed\xca\xa8\xf7\xda\xec\xbb\x06\x60\xd1\x5b\x89\xb7\x34\x59\x1d\x39\x16\x49\xfd\xa9\x59\x09\x9d\xe0\x10\x3e\x62\x90\xa8\x11\x39\xb9\xc4\x7e\x96\xda\x11\x6e\xf1\xa8\x27\x8d\x93\x09\x43\x4c\x70\xdb\x69\x11\x72\x51\xd1\x64\x92\x95\xfa\xa6\x82\x85\x70\x90\x56\x5a\xe4\x32\x71\x41\x1e\xf7\xb2\x16\x17\xc2\xb2\x58\x8b\xbf\x97\xe8\x68\xcc\x21\x20\x8b\xc4\x97\x42\xa9\x0a\x16\x92\x66\x15\xe2\xee\xbd\x7c\x75\x7c\x0c\xce\xcb\x02\x75\x3a\x80\x1f\x5e\x8d\x7e\xf8\x1e\x6c\xa9\xb0\x3f\xec\xb6\xd2\x78\x73\xd4\xe8\x0d\x5a\x88\xe8\x79\x8d\x85\x5f\xf6\xfa\xf0\xd3\x03\xf5\xe0\x81\xe4\xbe\x97\x16\x9e\xc3\x8b\x2f\x43\xd2\x6b\xbc\x81\xdb\xe0\x49\x40\xe5\x30\x4a\xa3\xf9\xee\xf2\xf5\x65\xef\x46\x58\xa1\xc4\x1c\xfb\x27\x3c\xef\xb1\xad\x56\x22\x36\xfc\xe4\x14\x28\x94\x90\x1a\x44\x92\x98\x52\x7b\x32\x7c\xdd\xbb\xab\x8a\xf2\xfb\x91\xaf\xe5\xf1\x68\x24\x92\x04\x9d\xab\xd3\x3d\x7b\x8d\xd4\x11\x39\x71\x83\xd4\x4e\xa6\xd8\xf2\x0a\x65\x07\xc3\xa9\x39\x52\xd0\xe4\x58\x0b\xcc\x8d\xa3\x4d\xe6\x08\x2b\x4b\x73\x86\x93\x3a\xe1\x41\x3b\x45\xb2\xb6\x03\xa3\x41\x80\x32\x3c\xdd\x73\x8c\x83\xb0\x0b\x37\x0c\xf9\x9e\xb6\xa5\x9c\xa3\xcd\x6a\xb8\x09\xe4\x36\x54\xb9\xa3\xdf\x6a\x07\x34\xe0\x9d\x74\x9e\x1b\x48\xd2\x52\x3a\x08\x48\x96\x7a\x31\x80\xc2\x14\x9c\xa7\x0f\xec\x25\xaf\xa6\xbf\x4e\xaf\x9a\xe2\x7f\xb8\x13\xeb\x16\xff\x69\x33\x01\x81\xa5\xf1\xc2\x63\xfa\x74\x4f\xcf\xbe\x07\x50\xe3\x07\x00\x45\xf2\xd7\xb5\xf1\x7d\xeb\x38\x4a\x38\xbf\x76\xcc\x02\xc3\xf8\xd2\x56\xc0\x95\xca\xbb\xad\xdc\xbd\x9d\x1c\x4c\x51\x57\x08\x52\x8a\xd3\x0e\x25\xf6\x3d\x9d\x75\x34\xb8\x6f\x03\x4f\x40\xa0\x69\x25\x00\x5e\xaf\x3b\x34\x11\x72\x3e\x6b\x68\x4a\x4f\x4e\xa7\x2a\xbd\x4e\x71\x0b\xe1\x3e\x38\xf6\x6d\x4c\x72\x73\xb9\x38\xd7\xbe\x57\x2f\x9e\x6b\x78\x0e\xf5\x03\xa5\x6e\x78\xbe\x11\x2b\x7b\x72\x60\x27\x45\x85\x1e\x61\x2d\xe2\x14\xb6\x5e\x91\xa0\x70\x68\x36\x8d\x45\xbf\x5b\x82\x8f\xa3\x34\x32\xcb\x13\x8b\x7e\x88\xbf\x97\x42\xb9\xde\x71\xd3\x12\x84\x13\x78\xc3\x45\x6c\xdc\x94\xb1\xba\xce\x11\xcf\x46\x93\x11\x05\x06\xb6\x68\x8d\x9a\x2d\x9d\x87\xda\x94\xe2\xa3\x12\xa2\x88\x98\x1c\x1a\x8f\x45\xf8\xed\xeb\x32\x3b\x6d\x02\x78\xda\x94\xfd\x4c\x48\x55\x5a\x7c\x7a\x0a\x7b\x92\x8b\x2b\x6d\x26\x12\xf6\xa5\x43\xe0\x11\xd4\x81\x33\x39\x2e\xcd\x2a\x28\xb0\x2f\x45\xed\x82\xa3\xc1\xc1\x56\x91\xe0\xbb\x14\xe1\xa0\x74\x62\x81\x2d\x70\x34\x06\xaf\x1d\xb5\x77\x2e\xfe\xd3\xd0\x79\xd6\x3c\x7e\x03\x45\x61\x97\x6f\x42\xe3\x31\x6c\xec\xf5\xf2\x4e\x2f\x53\x13\x71\x47\xd3\x7a\xa8\x55\x0d\x0d\x47\x83\x9c\x7f\xc5\xef\xff\x19\xc7\x07\xcf\xc7\xdf\x43\x03\x6d\x9b\x36\x9c\x71\x93\x38\x9c\x74\xdd\xc4\x7c\x1b\x05\xcd\xea\x43\x00\x78\xa8\x3f\x22\xa8\xea\xdf\x30\xf1\x6b\xb8\x72\x4b\x43\x4f\x85\xc5\x5b\x69\x4a\xaa\x56\xf8\xbf\x34\xff\x35\xfd\xdd\x7d\xb7\x73\x1f\xef\xbc\xd8\x7d\xed\x4b\xaf\xd5\x32\xde\xd9\x86\xd6\xa8\x55\x2b\x0c\x17\xd2\x78\x15\x96\x85\xdb\xd4\x0e\xf3\x3f\x72\xf9\x15\xe3\xdd\x9b\x82\x6a\x7f\x2c\x45\xca\xa2\x48\xab\xa6\xfa\x0d\x42\xd7\x01\x4b\xa1\xd3\x38\x79\x88\x34\x95\x24\x8f\xb1\x48\x1a\x8a\x85\x90\xba\xbb\xd7\x8c\xdf\x2c\xb9\xfb\x90\xb1\xd3\xc8\xb6\xab\x66\x9c\x18\x69\xbc\x63\x8d\xbb\x07\x54\xc7\xad\x58\xda\xbe\xc7\x8b\x57\x81\x46\xbb\x32\xe7\xb6\x17\xc4\xad\x90\x4a\xd0\xa8\xc5\xed\x94\x4e\x21\x51\x28\x74\xb8\xbd\xc7\xcc\x9b\x5b\xb4\xae\x7b\x00\xc8\xff\x0c\xc6\xb7\x92\x63\xfd\x18\xcd\x71\x78\xcc\x1e\x1a\xb1\xe1\xf8\x6f\x94\xf0\x3e\xc2\xab\x65\xde\x10\x59\xd2\xf3\x87\x1d\xd4\xbe\x7b\x58\x48\x71\x83\x44\x34\x3f\xc1\x71\xab\x09\xff\xab\x04\xd9\x2e\xc4\x2e\x9a\x66\x2c\x1e\xde\x1b\x33\x00\x85\x82\x47\xa2\xfa\xb3\x4b\xdd\x7c\x3e\x36\xa1\xd5\xd1\x1b\xda\xb7\x9d\xf0\xe5\x4b\xac\x25\xd6\xd7\x1d\xa1\x8f\x9f\x23\x6a\x90\x1e\xad\xa0\xe1\x87\xd0\x15\xbf\x14\x90\x96\x8e\xc5\xb1\x5f\x24\x05\x5d\x14\x1c\xaf\xed\xa9\x3e\x4b\xbd\x18\x76\x3b\xe1\x7d\x2b\xde\x13\x7f\xb7\x8e\xf7\x50\x0c\x99\x33\x5e\x00\x34\xf3\x7f\xe2\xef\xb8\x67\xe4\x19\x79\xeb\x12\x80\xd6\xe8\x55\x18\xa0\xb7\x46\x7e\x66\x8c\x63\xff\xf6\xcd\x22\xad\xf1\xbb\x0d\x80\x33\xe9\x42\xb8\x20\x66\x2b\x24\xfc\xdd\x6e\x44\xd4\x0c\x14\x0c\x27\xfb\x19\x68\x69\x0f\xd3\xd6\x35\x04\x11\xf3\xab\xb0\x1a\x0a\xfb\x49\x7b\x35\xbc\x8a\x07\x95\x79\xcb\x36\x32\x67\xdb\xdc\x9f\xee\x4f\x72\xc7\x35\x1e\xf7\x27\x33\xb2\x79\x03\xd8\x07\x58\xdb\x83\xc5\x2e\xc9\x63\xa9\x92\xa5\xd7\x99\xed\x01\x56\x96\xde\x6a\x3d\xfc\xdd\xe1\x22\x1b\xe2\xb6\x8a\x1b\x34\xfb\x84\xc4\x3c\x13\xe9\x82\x65\x6b\x01\x01\xd5\x41\x57\x46\xb4\xfc\x07\x46\x89\xed\xf8\xa9\x97\xc0\x62\xf8\xb0\xc0\x0d\x29\x85\x8f\x99\x73\xf1\x2f\x1d\xcd\x8c\xeb\xb8\x48\xd1\x49\x8b\x29\x64\x12\x55\x0a\x26\x45\xcb\x13\xe9\x6f\xce\xe8\xf0\x09\x09\xad\x24\x89\xe1\x53\x59\xf8\x6a\xcd\x1f\xf0\xb4\x4c\xd0\x57\x90\xa1\xe0\x6f\x41\xde\x40\x21\x9c\x83\x1c\x05\xcd\xa0\x59\xa9\x54\x05\xc6\xa6\x48\xc2\x9b\xa1\x8c\x42\xd2\x40\xe9\xd0\x3a\x58\x2d\x4d\x2c\x93\xdc\xa5\x15\xd4\x74\x4a\x3f\x88\xf7\x2e\xd2\x15\x4a\x54\x20\x3d\x95\xe4\x78\xa8\x76\x94\x36\x1f\x60\xf8\x2b\x8e\xa1\xaa\xbb\x1b\xa2\xf5\x5c\xb7\x19\xa3\xfc\x9a\x9e\x36\xa3\x33\xce\x35\x9b\x71\xb9\xbe\x91\xda\x0c\xc2\xba\x6c\x6c\x46\x5a\xbb\x08\x6d\x86\x13\xaf\xf0\xd3\x66\x20\xb5\xfa\x65\x5e\x60\x70\x34\x0c\xfc\xb4\x15\x5a\xac\x65\x8c\xad\xf0\xb9\xb1\x21\xe7\xa7\x41\x04\x0c\x79\xb1\x47\xc6\xb9\xc1\x8a\x32\x71\xb0\x51\xab\xac\x84\x17\x9f\x6f\xb0\xfa\xb2\xbf\x8a\x44\x38\xb6\xe8\x9a\xb2\x51\x43\x3a\xac\x3d\x12\xc8\x8d\x16\x72\x7c\x7c\x0a\xf2\xc7\x36\x43\x5d\xf9\x40\x3e\x7b\x56\xef\xd9\x5e\xff\x2c\xbf\xd4\xd1\xd9\x20\x7e\x6b\xbd\xbf\xa1\x51\x8c\x91\x40\x43\x41\xd1\xbd\xef\xfe\x33\x00\x00\xff\xff\xb5\x25\x8b\x4d\x94\x21\x00\x00")
+
+func call_tracerJsBytes() ([]byte, error) {
+ return bindataRead(
+ _call_tracerJs,
+ "call_tracer.js",
+ )
+}
+
+func call_tracerJs() (*asset, error) {
+ bytes, err := call_tracerJsBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "call_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _evmdis_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\xdf\x6f\xda\xca\x12\x7e\x86\xbf\x62\x94\x27\x50\x29\x60\x63\x08\x38\x27\x47\xe2\xa6\xf4\x1c\xae\xd2\x24\x02\x72\x8f\x2a\x94\x87\x05\xc6\xb0\xaa\xf1\x5a\xbb\x6b\x72\xb8\x55\xfe\xf7\xab\xd9\x59\x03\xf9\x75\xdb\x4a\xa7\x0f\x3b\xb5\x77\xbe\x6f\xbe\x9d\x19\xcf\x92\x56\x0b\xae\x54\xbe\xd7\x72\xbd\xb1\x10\xb6\x83\x73\x98\x6d\x10\xd6\xea\x23\xda\x0d\x6a\x2c\xb6\x30\x2c\xec\x46\x69\x53\x6d\xb5\x60\xb6\x91\x06\x12\x99\x22\x48\x03\xb9\xd0\x16\x54\x02\xf6\x85\x7f\x2a\x17\x5a\xe8\x7d\xb3\xda\x6a\x31\xe6\xcd\x6d\x62\x48\x34\x22\x18\x95\xd8\x47\xa1\x31\x86\xbd\x2a\x60\x29\x32\xd0\xb8\x92\xc6\x6a\xb9\x28\x2c\x82\xb4\x20\xb2\x55\x4b\x69\xd8\xaa\x95\x4c\xf6\x44\x29\x2d\x14\xd9\x0a\xb5\x0b\x6d\x51\x6f\x4d\xa9\xe3\x8f\x9b\x7b\xb8\x46\x63\x50\xc3\x1f\x98\xa1\x16\x29\xdc\x15\x8b\x54\x2e\xe1\x5a\x2e\x31\x33\x08\xc2\x40\x4e\x6f\xcc\x06\x57\xb0\x70\x74\x04\xfc\x4c\x52\xa6\x5e\x0a\x7c\x56\x45\xb6\x12\x56\xaa\xac\x01\x28\x49\x39\xec\x50\x1b\xa9\x32\xe8\x94\xa1\x3c\x61\x03\x94\x26\x92\x9a\xb0\x74\x00\x0d\x2a\x27\x5c\x1d\x44\xb6\x87\x54\xd8\x23\xf4\x27\x12\x72\x3c\xf7\x0a\x64\xe6\xc2\x6c\x54\x8e\x60\x37\xc2\xd2\xa9\x1f\x65\x9a\xc2\x02\xa1\x30\x98\x14\x69\x83\xd8\x16\x85\x85\xbf\xc6\xb3\x3f\x6f\xef\x67\x30\xbc\xf9\x0a\x7f\x0d\x27\x93\xe1\xcd\xec\xeb\x05\x3c\x4a\xbb\x51\x85\x05\xdc\x21\x53\xc9\x6d\x9e\x4a\x5c\xc1\xa3\xd0\x5a\x64\x76\x0f\x2a\x21\x86\x2f\xa3\xc9\xd5\x9f\xc3\x9b\xd9\xf0\x5f\xe3\xeb\xf1\xec\x2b\x28\x0d\x9f\xc7\xb3\x9b\xd1\x74\x0a\x9f\x6f\x27\x30\x84\xbb\xe1\x64\x36\xbe\xba\xbf\x1e\x4e\xe0\xee\x7e\x72\x77\x3b\x1d\x35\x61\x8a\xa4\x0a\x09\xff\xe3\x9c\x27\xae\x7a\x1a\x61\x85\x56\xc8\xd4\x94\x99\xf8\xaa\x0a\x30\x1b\x55\xa4\x2b\xd8\x88\x1d\x82\xc6\x25\xca\x1d\xae\x40\xc0\x52\xe5\xfb\x9f\x2e\x2a\x71\x89\x54\x65\x6b\x77\xe6\x77\x1b\x12\xc6\x09\x64\xca\x36\xc0\x20\xc2\x6f\x1b\x6b\xf3\xb8\xd5\x7a\x7c\x7c\x6c\xae\xb3\xa2\xa9\xf4\xba\x95\x32\x9d\x69\xfd\xde\xac\x12\x27\xee\xb6\x2b\x69\x66\x5a\x2c\x51\x83\x46\x5b\xe8\xcc\x80\x29\x92\x84\xfc\x2c\xc8\x2c\x51\x7a\xeb\xda\x04\x12\xad\xb6\x20\xc0\x92\x2f\x58\x05\x39\x6a\xda\xf4\x14\x1f\x8d\xdd\xa7\x4e\xe6\x4a\x1a\x61\x0c\x6e\x17\xe9\xbe\x59\xfd\x5e\xad\x18\x2b\x96\xdf\x62\x98\x7f\x57\xb9\x89\x61\xfe\xf0\xf4\xd0\xa8\x56\x2b\x59\x5e\x98\x0d\x9a\x18\xbe\xb7\x63\x68\x37\x20\x88\x21\x68\x40\xe8\xd6\x8e\x5b\x23\xb7\x76\xdd\xda\x73\xeb\xb9\x5b\xfb\x6e\x1d\xb8\x35\x68\xb3\x61\x74\xc0\x6e\x01\xfb\x05\xec\x18\xb0\x67\xc8\x9e\xa1\x8f\xc3\x81\x42\x8e\x14\x72\xa8\x90\x63\x85\xcc\xd2\x61\x97\x88\x59\x22\x66\xe9\x32\x4b\x97\x59\xba\xec\xd2\x65\x96\xae\x17\xdc\x75\xe7\xe9\x32\x4b\xf7\x9c\x9f\x98\xa5\xcb\x2c\x3d\x3e\x72\x8f\x01\x3d\x7f\x44\x06\xf4\x58\x7c\x8f\x01\x3d\x06\xf4\x19\xd0\xe7\xb0\xfd\x90\x9f\x3a\x6c\x98\xa5\xcf\x61\xfb\x3d\x36\x1c\xb6\xcf\x2c\x7d\x66\x19\xb0\xf8\x41\xe0\xf6\x06\x1c\x6f\xc0\xf1\x06\x3e\xab\x65\x5a\x7d\x5e\xdb\x3e\xb1\xed\xd0\xdb\x8e\xb7\x91\xb7\x5d\x6f\x7d\xe6\xdb\x3e\xf5\x6d\x9f\xfb\xb6\xe7\x3b\xd4\xc9\xf3\x05\x9e\x2f\xf0\x7c\x81\xe7\x0b\x3c\x5f\x59\xc9\xb2\x94\x65\x2d\x7d\x31\x03\x5f\xcd\xc0\x97\x33\xf0\xf5\x0c\x7c\x41\x03\x5f\xd1\xc0\x97\x34\xf0\x35\x0d\x42\xcf\x17\xf6\x63\x08\xc9\x0e\x62\xe8\x34\x20\xe8\xb4\x63\x88\xc8\x06\x31\x74\xc9\x86\x31\xf4\xc8\x76\x62\x38\x27\x1b\xc5\xd0\x27\xdb\x8d\x61\x40\x96\xf8\xa8\x6b\x3b\x44\x48\x8c\x1d\x52\x48\x94\x1d\x92\x48\x9c\x11\x69\x24\xd2\x88\x44\x12\x6b\x44\x2a\x89\x36\x22\x99\xc4\x1b\x45\xac\x23\xea\xb2\x8e\xa8\xc7\x3a\xa2\x73\xd6\x41\xdd\xe7\x00\x03\xd6\x41\xfd\x47\x3a\xa8\x01\x49\x87\xeb\x40\xd2\xe1\x7a\x90\x74\xb8\x2e\x24\x4a\xea\x43\xa7\xc3\x75\x22\x91\x52\x2f\x3a\x1d\xae\x1b\x89\xd6\xf5\x23\xf1\xfa\x8e\x0c\x7a\x81\xb7\xa1\xb7\x1d\x6f\x23\x67\xc3\xc8\x7f\x45\x91\xff\x8c\x22\xff\x1d\x45\x1d\xbf\xef\xfd\xdc\x47\xf0\x44\xdf\x79\xab\x05\x1a\x4d\x91\x5a\x1a\xfe\x32\xdb\xa9\x6f\x34\x9e\x37\x98\x81\x48\x53\x37\xc7\x54\xbe\x54\x2b\x34\x3c\x1f\x17\x88\x19\x48\x8b\x5a\xd0\x05\xa1\x76\xa8\xe9\x6e\x2c\x27\x93\xa3\x23\x4c\x22\x33\x91\x96\xc4\x7e\x86\xd2\x60\x92\xd9\xba\x59\xad\xf0\xfb\x18\x92\x22\x5b\xd2\xe8\xaa\xd5\xe1\xbb\xa7\x00\xbb\x91\xa6\xe9\x46\xd2\xbc\xfd\xd0\x54\xb9\xb9\x80\x52\x67\x22\xde\x92\x49\xd4\x62\x69\x0b\x91\x02\xfe\x8d\xcb\xc2\xcd\x42\x95\x80\xc8\xbc\x72\x48\x78\xe0\x57\x1c\xfe\x24\x6a\xaa\xd6\x0d\x58\x2d\x28\x78\x19\xc2\x58\xcc\x4f\x23\xd0\xb5\x81\x3b\xd4\xfb\x92\xcb\x5d\x83\x14\xf2\x3f\x5f\x7c\x38\x24\x6a\xc2\xbd\xc9\x5c\xad\x54\x76\x42\x43\xa2\xc5\x16\xe1\xf2\xf4\x74\xc7\xff\x36\x53\xcc\xd6\x76\x03\x1f\x21\x78\xb8\xa8\x7a\x04\x6a\xad\x34\x5c\x42\xaa\xd6\xcd\x35\xda\x11\x3d\xd6\xea\x17\xd5\x4a\x45\x26\x50\x73\xbb\x4c\x5f\x71\xdc\xf3\x33\xf7\xea\xec\x01\x2e\x19\x4a\x9e\x4f\x80\xa9\x41\x20\x80\xa7\xf9\x84\xb9\xdd\xd4\xea\x70\x79\x2a\xc5\xc7\xf7\x74\x2a\xa7\x4b\x05\x2e\xf9\xa9\xa2\xf2\x18\xe8\x1f\x11\xa8\xbc\x69\xd5\x4d\xb1\x5d\xa0\xae\xd5\x1b\x6e\x7b\x45\x84\x10\xc3\x73\x7e\xde\x2b\xcb\x3c\x7f\x70\xcf\x4f\x24\xc9\xa9\x77\x8a\xa9\xb6\xe5\xc9\x7f\x87\xb6\x8f\xee\xce\x9e\x6b\xdc\xa9\x1c\x2e\xe1\xe0\x38\x7f\x05\xe1\x64\x11\x22\x51\xba\x46\x28\x09\x97\xd0\xbe\x00\x09\xbf\xf1\xd9\xfc\x0d\x36\x67\xb6\xa6\xca\x1f\x2e\x40\x7e\xf8\x50\x77\xa0\x8a\x7f\xcb\x1a\x9b\xe4\xea\x72\xc4\x09\xc9\x11\xbf\xd5\x64\xbd\x69\xd5\xd4\x6a\x99\xad\x6b\x41\xaf\xee\x72\x5f\x79\xa2\xc5\x3c\x4a\xbb\x64\x7f\x97\x12\xef\x54\xf7\x67\x58\x0a\x83\x70\x76\x35\xbc\xbe\x3e\x8b\xe1\xf8\x70\x75\xfb\x69\x74\x16\x1f\x0e\x29\x33\x63\xe9\xe7\x2b\x97\xf8\x24\x6e\xa7\xde\xdc\x89\xb4\xc0\xdb\x84\xeb\x7d\x70\x97\xff\xc5\xd7\xde\xd1\x2b\x6f\x2e\xe0\xfc\x6c\x2d\x8c\x6b\x87\x17\x80\xf6\xbb\x00\xab\xde\xf2\x0f\x9e\xa7\xe1\x39\xc4\x31\xbd\x85\x0a\x4f\x50\x2f\x30\x32\xcb\x0b\x7b\xc0\x6c\x71\xab\xf4\xbe\x69\xe8\x87\x4f\xcd\xe7\xa4\x71\x48\xce\x07\x7f\xee\x17\x14\xc7\x5e\xcf\x8a\x34\x7d\xbe\xc7\x73\xe4\x9d\x4d\x95\x73\x4e\xe6\xbe\x77\x4e\x3e\x02\xd7\x02\xec\xe7\xa3\x2d\x34\x8a\x6f\x17\xc7\x8a\x7e\x1a\x5d\x8f\xfe\x18\xce\x46\xcf\x2a\x3b\x9d\x0d\x67\xe3\x2b\x7e\xf5\xe3\xda\x86\xbf\x54\xdb\xd7\x9d\x70\x3c\x87\x3b\x06\xbc\x6a\xc1\xb7\x5b\xe0\x97\x7b\xe0\x97\x9a\xe0\x58\xd0\x7f\xa2\xa2\xff\xbf\xa4\xff\x74\x4d\x27\xa3\xd9\xfd\xe4\xe6\xa4\x74\xf4\xe7\xca\x4f\x7c\x33\xde\xf5\xed\xba\x05\xaf\xdc\x79\x7c\xf9\x2b\xee\x8d\xc6\x57\x85\x6d\xb8\xd0\x1f\x4a\xd6\x77\xf4\x4e\x67\xb7\x77\xc7\xde\xbb\x1f\x5f\x8d\x0f\x43\xe5\x47\x31\xda\x0d\x68\xbf\xc3\xfa\xef\xfb\x2f\x77\x9f\x46\xd3\x99\x67\x2a\x33\x9b\x2f\x0f\x9f\xe9\x1a\xed\xdd\x55\xed\x64\x06\xca\xa4\x9c\x7f\xd2\xdc\x51\x9a\xcb\xe9\x77\x40\xa7\x98\x1d\xe0\xcf\x6e\x0e\xf8\x08\xed\xbf\xbb\x78\xe4\x3a\x0e\xf7\x97\x05\xf3\x37\x98\x23\x3e\xd6\xf5\xd9\x45\x7a\x3c\xdd\xf3\x3b\x88\xf1\xd5\xca\x53\xf5\xa9\xfa\xbf\x00\x00\x00\xff\xff\x51\x4b\xdc\x7e\x62\x10\x00\x00")
+
+func evmdis_tracerJsBytes() ([]byte, error) {
+ return bindataRead(
+ _evmdis_tracerJs,
+ "evmdis_tracer.js",
+ )
+}
+
+func evmdis_tracerJs() (*asset, error) {
+ bytes, err := evmdis_tracerJsBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "evmdis_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _noop_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\x4f\x6f\xdb\x46\x10\xc5\xcf\xe6\xa7\x78\xc7\x04\x50\xc5\xfe\x39\x14\x70\x8b\x02\xac\x61\x27\x2a\x1c\xd9\x90\xe8\x06\x3e\x0e\xc9\xa1\xb8\xe9\x6a\x87\x9d\x9d\x95\x22\x04\xf9\xee\xc5\x92\x52\x13\x14\x69\x9b\x9b\xb0\xd2\xfb\xbd\x37\xf3\x46\x65\x89\x1b\x19\x4f\xea\x76\x83\xe1\xfb\x6f\xbf\xfb\x11\xf5\xc0\xd8\xc9\x37\x6c\x03\x2b\xa7\x3d\xaa\x64\x83\x68\x2c\xca\x12\xf5\xe0\x22\x7a\xe7\x19\x2e\x62\x24\x35\x48\x0f\xfb\xc7\xef\xbd\x6b\x94\xf4\xb4\x2c\xca\x72\xd6\x7c\xf1\xeb\x4c\xe8\x95\x19\x51\x7a\x3b\x92\xf2\x35\x4e\x92\xd0\x52\x80\x72\xe7\xa2\xa9\x6b\x92\x31\x9c\x81\x42\x57\x8a\x62\x2f\x9d\xeb\x4f\x19\xe9\x0c\x29\x74\xac\x93\xb5\xb1\xee\xe3\x25\xc7\xab\xf5\x13\xee\x39\x46\x56\xbc\xe2\xc0\x4a\x1e\x8f\xa9\xf1\xae\xc5\xbd\x6b\x39\x44\x06\x45\x8c\xf9\x25\x0e\xdc\xa1\x99\x70\x59\x78\x97\xa3\x6c\xcf\x51\x70\x27\x29\x74\x64\x4e\xc2\x02\xec\x72\x72\x1c\x58\xa3\x93\x80\x1f\x2e\x56\x67\xe0\x02\xa2\x19\xf2\x82\x2c\x0f\xa0\x90\x31\xeb\x5e\x82\xc2\x09\x9e\xec\x93\xf4\x2b\x16\xf2\x69\xee\x0e\x2e\x4c\x36\x83\x8c\x0c\x1b\xc8\xf2\xd4\x47\xe7\x3d\x1a\x46\x8a\xdc\x27\xbf\xc8\xb4\x26\x19\xde\xae\xea\xd7\x0f\x4f\x35\xaa\xf5\x33\xde\x56\x9b\x4d\xb5\xae\x9f\x7f\xc2\xd1\xd9\x20\xc9\xc0\x07\x9e\x51\x6e\x3f\x7a\xc7\x1d\x8e\xa4\x4a\xc1\x4e\x90\x3e\x13\xde\xdc\x6e\x6e\x5e\x57\xeb\xba\xfa\x75\x75\xbf\xaa\x9f\x21\x8a\xbb\x55\xbd\xbe\xdd\x6e\x71\xf7\xb0\x41\x85\xc7\x6a\x53\xaf\x6e\x9e\xee\xab\x0d\x1e\x9f\x36\x8f\x0f\xdb\xdb\x25\xb6\x9c\x53\x71\xd6\xff\xff\xce\xfb\xa9\x3d\x65\x74\x6c\xe4\x7c\xbc\x6c\xe2\x59\x12\xe2\x20\xc9\x77\x18\xe8\xc0\x50\x6e\xd9\x1d\xb8\x03\xa1\x95\xf1\xf4\xd5\xa5\x66\x16\x79\x09\xbb\x69\xe6\x7f\x3d\x48\xac\x7a\x04\xb1\x05\x22\x33\x7e\x1e\xcc\xc6\xeb\xb2\x3c\x1e\x8f\xcb\x5d\x48\x4b\xd1\x5d\xe9\x67\x5c\x2c\x7f\x59\x16\x99\x19\x44\xc6\x5a\xa9\x65\xcd\xe5\xbc\x4b\xd1\x26\x76\x43\xca\x8d\x04\x46\x23\xce\xb3\x8e\xb9\x65\xb4\xd2\xe5\x01\xfe\x4c\x4e\xb9\x43\xaf\xb2\x07\xe1\x37\x3a\xd0\xb6\x55\x37\x5a\xc6\x49\xf3\x8e\x5b\x83\xc9\x5c\x21\x35\x7e\x3a\x47\x82\x29\x85\x48\x6d\xbe\x9b\xfc\xb9\x65\x5d\x16\x1f\x8a\xab\xb2\x44\x34\x1e\xb3\xb7\x0b\x07\xf9\x23\x73\x45\x73\x9f\x7a\x82\x8c\x93\xe3\x74\x19\x39\xd4\xef\x6f\xc0\xef\xb9\x4d\xc6\x71\x59\x5c\x65\xdd\x35\xfa\x14\x26\xe8\x0b\x2f\xbb\x05\xba\xe6\x25\x3e\xe0\xe3\xa2\x98\xc8\x3d\x25\x6f\x9f\xa3\x8f\xc3\xf9\x4c\xa8\xb5\x44\xfe\x4c\xcb\x91\xa4\x07\x85\x8b\x61\x3f\x17\x78\x35\xe9\xff\xdb\x42\x39\x7e\xc9\x83\xbc\x9f\x7c\x66\x60\x9c\xab\x6f\x98\x03\x9c\xb1\x52\xbe\x7d\x39\xb0\xe6\xbf\x3d\x94\x2d\x69\x88\x13\x2e\x6b\x7a\x17\xc8\x5f\xc0\xe7\xf3\xc8\x1b\x73\x61\xb7\x2c\xae\xe6\xf7\xcf\x42\xb5\xf6\xfe\xef\x50\xc5\xc7\xe2\xaf\x00\x00\x00\xff\xff\x13\x5b\x7d\x37\xec\x04\x00\x00")
+
+func noop_tracerJsBytes() ([]byte, error) {
+ return bindataRead(
+ _noop_tracerJs,
+ "noop_tracer.js",
+ )
+}
+
+func noop_tracerJs() (*asset, error) {
+ bytes, err := noop_tracerJsBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "noop_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _opcount_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x94\xcf\x6e\xdb\x46\x10\x87\xcf\xe2\x53\xfc\x8e\x09\xa2\x92\x69\x7b\x28\xe0\x16\x05\x58\xc3\x4e\x04\xd8\xb2\x21\xd1\x09\x7c\x5c\x92\x43\x71\x9b\xd5\x2e\x31\x3b\x2b\x86\x08\xfc\xee\xc5\x2e\xc5\xc6\x08\x5c\xd4\xd7\xd5\xcc\xf7\xcd\x3f\xb1\x28\x70\xe9\x86\x89\xf5\xa1\x17\xfc\xf2\xfe\xe7\xdf\x50\xf5\x84\x83\xfb\x89\xa4\x27\xa6\x70\x44\x19\xa4\x77\xec\xb3\xa2\x40\xd5\x6b\x8f\x4e\x1b\x82\xf6\x18\x14\x0b\x5c\x07\xf9\x21\xde\xe8\x9a\x15\x4f\x79\x56\x14\x73\xce\x8b\x3f\x47\x42\xc7\x44\xf0\xae\x93\x51\x31\x5d\x60\x72\x01\x8d\xb2\x60\x6a\xb5\x17\xd6\x75\x10\x82\x16\x28\xdb\x16\x8e\x71\x74\xad\xee\xa6\x88\xd4\x82\x60\x5b\xe2\xa4\x16\xe2\xa3\x5f\xea\xf8\xb0\x7d\xc0\x0d\x79\x4f\x8c\x0f\x64\x89\x95\xc1\x7d\xa8\x8d\x6e\x70\xa3\x1b\xb2\x9e\xa0\x3c\x86\xf8\xe2\x7b\x6a\x51\x27\x5c\x4c\xbc\x8e\xa5\xec\xcf\xa5\xe0\xda\x05\xdb\x2a\xd1\xce\xae\x41\x3a\x56\x8e\x13\xb1\xd7\xce\xe2\xd7\x45\x75\x06\xae\xe1\x38\x42\xde\x28\x89\x0d\x30\xdc\x10\xf3\xde\x42\xd9\x09\x46\xc9\xf7\xd4\x57\x0c\xe4\x7b\xdf\x2d\xb4\x4d\x9a\xde\x0d\x04\xe9\x95\xc4\xae\x47\x6d\x0c\x6a\x42\xf0\xd4\x05\xb3\x8e\xb4\x3a\x08\x3e\x6f\xaa\x8f\x77\x0f\x15\xca\xed\x23\x3e\x97\xbb\x5d\xb9\xad\x1e\x7f\xc7\xa8\xa5\x77\x41\x40\x27\x9a\x51\xfa\x38\x18\x4d\x2d\x46\xc5\xac\xac\x4c\x70\x5d\x24\xdc\x5e\xed\x2e\x3f\x96\xdb\xaa\xfc\x6b\x73\xb3\xa9\x1e\xe1\x18\xd7\x9b\x6a\x7b\xb5\xdf\xe3\xfa\x6e\x87\x12\xf7\xe5\xae\xda\x5c\x3e\xdc\x94\x3b\xdc\x3f\xec\xee\xef\xf6\x57\x39\xf6\x14\xab\xa2\x98\xff\xff\x33\xef\xd2\xf6\x98\xd0\x92\x28\x6d\xfc\x32\x89\x47\x17\xe0\x7b\x17\x4c\x8b\x5e\x9d\x08\x4c\x0d\xe9\x13\xb5\x50\x68\xdc\x30\xbd\x7a\xa9\x91\xa5\x8c\xb3\x87\xd4\xf3\x7f\x1e\x24\x36\x1d\xac\x93\x35\x3c\x11\xfe\xe8\x45\x86\x8b\xa2\x18\xc7\x31\x3f\xd8\x90\x3b\x3e\x14\x66\xc6\xf9\xe2\xcf\x3c\x8b\x4c\x37\x34\x2e\x58\xa9\x58\x35\xc4\x71\x3f\x0a\x5e\x1d\x07\x43\x90\xf9\x29\xed\xe5\xef\xe0\x05\x29\xd0\x27\xb5\x0d\xc7\x9a\x38\x16\xaf\xad\x17\x0e\x4d\xbc\x87\xf4\xf7\xa1\xaf\xd4\xa4\xdd\xd6\x53\x8a\xbc\xfa\x74\x8b\x9a\xba\x38\x99\x74\xc9\xac\xac\x57\x29\x3c\x5d\xb5\xb6\x4a\xa8\xcd\xb3\x6f\xd9\xaa\x28\x66\x43\x12\x7f\xf9\xd1\x13\x39\xcf\x5d\xff\x8a\xf2\x6c\x95\xd2\x2e\xf0\x7e\x9d\x25\x8a\x17\x1a\x62\x27\xda\x9e\xdc\x17\x6a\xd3\x6a\xe8\x44\x3c\xa5\x66\xdb\xf3\xa9\x45\xfc\xa7\xdb\x05\xe3\xf3\x6c\x15\xf3\x2e\xd0\x05\x9b\x0c\x6f\x8c\x3b\xac\xd1\xd6\x6f\xf1\x0d\xd2\x6b\x9f\x27\xcb\xbb\x77\x78\x3a\x6b\x3a\x15\x8c\x3c\xf7\x8c\xfd\xf9\x08\x55\x23\x41\x99\x33\x3a\x76\xea\x3a\x28\xbb\xd8\xbb\xf9\x3c\x56\x29\xff\x65\xdf\xa2\x60\xf2\x2f\x39\x94\x31\xc9\x33\x03\xfd\x7c\x58\x35\x91\x85\x16\xe2\x38\x50\xb8\x13\x71\xfc\xa8\x80\x49\x02\x5b\x9f\x70\x31\xa7\xd3\x56\x99\x05\x7c\x3e\xbe\x38\x70\x6d\x0f\x79\xb6\x9a\xdf\x9f\x15\xd5\xc8\xd7\xa5\xa8\x99\xf4\x6c\x16\x78\xca\x9e\xb2\x7f\x02\x00\x00\xff\xff\xdd\xd8\xa1\x0a\x5c\x05\x00\x00")
+
+func opcount_tracerJsBytes() ([]byte, error) {
+ return bindataRead(
+ _opcount_tracerJs,
+ "opcount_tracer.js",
+ )
+}
+
+func opcount_tracerJs() (*asset, error) {
+ bytes, err := opcount_tracerJsBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "opcount_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _prestate_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x57\xdd\x6f\x1b\xb9\x11\x7f\xde\xfd\x2b\xa6\x7e\x91\x84\x53\x56\xce\x15\xb8\x02\x72\x5d\x60\xa3\x28\x89\x00\x9d\x6d\x48\x4a\x5d\xf7\x70\x0f\x5c\x72\x76\xc5\x13\x45\x2e\x48\xae\x3e\x10\xf8\x7f\x2f\x86\xfb\x21\xcb\x67\x27\x6e\xeb\x27\x2f\x39\xfc\xcd\xf7\x6f\x46\xa3\x11\x4c\x4c\x79\xb4\xb2\x58\x7b\xf8\xf9\xf2\xfd\xdf\x60\xb5\x46\x28\xcc\x3b\xf4\x6b\xb4\x58\x6d\x21\xad\xfc\xda\x58\x17\x8f\x46\xb0\x5a\x4b\x07\xb9\x54\x08\xd2\x41\xc9\xac\x07\x93\x83\x7f\x26\xaf\x64\x66\x99\x3d\x26\xf1\x68\x54\xbf\x79\xf1\x9a\x10\x72\x8b\x08\xce\xe4\x7e\xcf\x2c\x8e\xe1\x68\x2a\xe0\x4c\x83\x45\x21\x9d\xb7\x32\xab\x3c\x82\xf4\xc0\xb4\x18\x19\x0b\x5b\x23\x64\x7e\x24\x48\xe9\xa1\xd2\x02\x6d\x50\xed\xd1\x6e\x5d\x6b\xc7\xe7\x9b\xaf\x30\x47\xe7\xd0\xc2\x67\xd4\x68\x99\x82\xbb\x2a\x53\x92\xc3\x5c\x72\xd4\x0e\x81\x39\x28\xe9\xc4\xad\x51\x40\x16\xe0\xe8\xe1\x27\x32\x65\xd9\x98\x02\x9f\x4c\xa5\x05\xf3\xd2\xe8\x21\xa0\x24\xcb\x61\x87\xd6\x49\xa3\xe1\xaf\xad\xaa\x06\x70\x08\xc6\x12\x48\x9f\x79\x72\xc0\x82\x29\xe9\xdd\x00\x98\x3e\x82\x62\xfe\xf4\xf4\x0d\x01\x39\xf9\x2d\x40\xea\xa0\x66\x6d\x4a\x04\xbf\x66\x9e\xbc\xde\x4b\xa5\x20\x43\xa8\x1c\xe6\x95\x1a\x12\x5a\x56\x79\xb8\x9f\xad\xbe\xdc\x7e\x5d\x41\x7a\xf3\x00\xf7\xe9\x62\x91\xde\xac\x1e\xae\x60\x2f\xfd\xda\x54\x1e\x70\x87\x35\x94\xdc\x96\x4a\xa2\x80\x3d\xb3\x96\x69\x7f\x04\x93\x13\xc2\xaf\xd3\xc5\xe4\x4b\x7a\xb3\x4a\x3f\xcc\xe6\xb3\xd5\x03\x18\x0b\x9f\x66\xab\x9b\xe9\x72\x09\x9f\x6e\x17\x90\xc2\x5d\xba\x58\xcd\x26\x5f\xe7\xe9\x02\xee\xbe\x2e\xee\x6e\x97\xd3\x04\x96\x48\x56\x21\xbd\xff\x71\xcc\xf3\x90\x3d\x8b\x20\xd0\x33\xa9\x5c\x1b\x89\x07\x53\x81\x5b\x9b\x4a\x09\x58\xb3\x1d\x82\x45\x8e\x72\x87\x02\x18\x70\x53\x1e\xdf\x9c\x54\xc2\x62\xca\xe8\x22\xf8\xfc\x6a\x41\xc2\x2c\x07\x6d\xfc\x10\x1c\x22\xfc\x7d\xed\x7d\x39\x1e\x8d\xf6\xfb\x7d\x52\xe8\x2a\x31\xb6\x18\xa9\x1a\xce\x8d\xfe\x91\xc4\x84\x59\x5a\x74\x9e\x79\x5c\x59\xc6\xd1\x82\xa9\x7c\x59\x79\x07\xae\xca\x73\xc9\x25\x6a\x0f\x52\xe7\xc6\x6e\x43\xa5\x80\x37\xc0\x2d\x32\x8f\xc0\x40\x19\xce\x14\xe0\x01\x79\x15\xee\xea\x48\x87\x72\xb5\x4c\x3b\xc6\xc3\x69\x6e\xcd\x96\x7c\xad\x9c\xa7\x7f\x9c\xc3\x6d\xa6\x50\x40\x81\x1a\x9d\x74\x90\x29\xc3\x37\x49\xfc\x2d\x8e\x9e\x18\x43\x75\x12\x3c\x6c\x84\x42\x6d\xec\xb1\x67\x11\xb2\x4a\x2a\x21\x75\x91\xc4\x51\x2b\x3d\x06\x5d\x29\x35\x8c\x03\x84\x32\x66\x53\x95\x29\xe7\xa6\x0a\xb6\xff\x81\xdc\xd7\x60\xae\x44\x2e\x73\x2a\x0e\xd6\xdd\x7a\x13\xae\x3a\xbd\x26\x23\xf9\x24\x8e\xce\x60\xc6\x90\x57\x3a\xb8\xd3\x67\x42\xd8\x21\x88\x6c\xf0\x2d\x8e\xa2\x1d\xb3\x84\x05\xd7\xe0\xcd\x17\x3c\x84\xcb\xc1\x55\x1c\x45\x32\x87\xbe\x5f\x4b\x97\xb4\xc0\xbf\x31\xce\x7f\x87\xeb\xeb\xeb\xd0\xd4\xb9\xd4\x28\x06\x40\x10\xd1\x4b\x62\xf5\x4d\x94\x31\xc5\x34\xc7\x31\xf4\x2e\x0f\x3d\xf8\x09\x44\x96\x14\xe8\x3f\xd4\xa7\xb5\xb2\xc4\x9b\xa5\xb7\x52\x17\xfd\xf7\xbf\x0c\x86\xe1\x95\x36\xe1\x0d\x34\xe2\x37\xa6\x13\xae\xef\xb9\x11\xe1\xba\xb1\xb9\x96\x9a\x18\xd1\x08\x35\x52\xce\x1b\xcb\x0a\x1c\xc3\xb7\x47\xfa\x7e\x24\xaf\x1e\xe3\xe8\xf1\x2c\xca\xcb\x5a\xe8\x95\x28\x37\x10\x80\xda\xdb\xae\xce\x0b\x49\x9d\xfa\x34\x01\x01\xef\x7b\x49\x58\xb6\xa6\x3c\x4b\xc2\x06\x8f\x3f\xce\x04\x5d\x48\x71\xe8\x2e\x36\x78\x1c\x5c\xc5\xaf\xa6\x28\x69\x8c\xfe\x4d\x8a\xc3\xcb\xf9\x22\xc0\x1d\x53\x1d\x60\x1d\xbf\x25\x21\x9c\xec\x1a\x04\xdd\x41\x07\xc9\xfe\xe5\x1a\x2e\x2e\x0f\x97\xff\xe7\xdf\x45\x63\xc1\x0b\x25\xf3\xcc\xec\x37\x98\xf6\x78\x9e\x4f\x8b\xae\x52\x9e\xda\x4e\xea\x9d\xd9\x10\x81\xae\x29\x4f\x4a\x85\xd4\x98\x92\xaa\xc6\xd5\x0c\x96\x21\x6a\x90\x1e\x2d\x23\x0a\x37\x3b\xb4\x34\xbd\xc0\xa2\xaf\xac\x76\x5d\x3a\x73\xa9\x99\x6a\x81\x9b\xec\x7b\xcb\x78\xdd\xbb\xf5\xf9\x93\x9c\x72\x7f\x08\xd9\x0c\x3e\x8e\x46\x90\x7a\x20\x3f\xa1\x34\x52\xfb\x21\xec\x11\x34\xa2\x20\x02\x12\x28\x2a\xee\x03\x5e\x6f\xc7\x54\x85\xbd\x9a\x64\x88\xaa\xc3\x53\x53\xd1\x44\x7a\x42\x42\xc3\x60\xe0\xd6\xec\xc2\xa8\xcd\x18\xdf\x40\xd3\xf8\xc6\xca\x42\xea\xb8\x89\xe9\x59\xd3\x93\x45\x09\x01\x07\xb3\x42\xcd\x50\xee\xe9\xe4\x43\xc8\x7f\x26\x8b\x99\xf6\xcf\x8a\xa8\x8e\x7c\xfb\x74\xf0\x7b\xd2\x34\x71\xe2\x88\x78\xfb\x3f\x0f\x86\xf0\xfe\x97\xae\x32\xbd\x21\x28\xf8\x31\x98\x37\xaf\x43\xc5\xcf\x2b\xe2\xe5\x67\x41\x0d\x31\xc9\x4f\x41\x6b\xe2\xaa\x8c\xd2\x51\xfb\x19\xe2\x78\xce\x26\x57\xdf\xc1\x3d\xf7\xad\xc5\x6d\x42\x93\x30\x21\x5e\x07\xad\x53\xf4\x11\xb9\xc5\x2d\x4d\x17\xca\x02\x67\x4a\xa1\xed\x39\x08\xdc\x35\x6c\xca\x29\xe4\x0b\xb7\xa5\x3f\xb6\x33\xc7\x33\x5b\xa0\x77\x3f\x36\x2c\xe0\xbc\x7b\xd7\x52\x71\x08\xc5\xb1\x44\xb8\xbe\x86\xde\x64\x31\x4d\x57\xd3\x5e\xd3\x4c\xa3\x11\xdc\x63\xd8\xc8\x32\x25\x33\xa1\x8e\x20\x50\xa1\xc7\xda\x2e\xa3\x43\x88\x3a\x6a\x1a\xd2\x6a\x45\x4b\x0f\x1e\xa4\xf3\x52\x17\x50\x33\xd6\x9e\xe6\x7b\x03\x17\x7a\x84\xb3\xca\x51\xb5\x3e\x1b\x86\xde\xd0\x66\x63\x91\xf8\x8d\xe6\x50\x68\x37\xa6\x64\xb7\x09\xe5\xd2\x3a\x0f\xa5\x62\x1c\x13\xc2\xeb\x8c\x79\x3d\xbf\x0d\x33\x93\xea\x45\x68\xc1\x00\x74\x1a\xb4\x4c\xd1\xa0\x26\xf5\x0e\xfa\x2d\xc6\x20\x8e\x22\xdb\x4a\x3f\xc1\xbe\x3a\x51\x82\xf3\x58\x3e\x25\x04\x5a\x70\x70\x87\x44\xe5\x81\x0d\xea\xa1\x4c\xba\xfe\xf9\x6b\xb3\x05\xa0\x4b\xe2\x88\xde\x3d\xe9\x6b\x65\x8a\xf3\xbe\x16\x75\x58\x78\x65\x2d\xe5\xbf\x1b\x05\x39\xf5\xf8\x1f\x95\xf3\x14\x53\x4b\xe1\x69\xd8\xe2\x25\xb2\x0e\xd4\x4c\x53\x7f\xf0\xe7\x21\x4a\xf3\x33\xcc\x2b\x52\xd7\x4c\xcb\x7a\xab\x2c\x8d\x47\xed\x25\x53\xea\x48\x79\xd8\x5b\x5a\xa7\x68\x81\x1a\x82\x93\x24\x15\x18\x27\x88\x4a\xcd\x55\x25\xea\x32\x08\x75\xdc\xe0\xb9\x60\xf3\xf9\x1e\xb6\x45\xe7\x58\x81\x09\x55\x52\x2e\x0f\xcd\x26\xab\xa1\x57\x93\x5c\x7f\xd0\x4b\x3a\x23\xcf\x29\x46\x99\x22\x69\x8b\x8c\xb8\x3a\x15\xc2\xa2\x73\xfd\x41\xc3\x39\x5d\x66\xef\xd7\xa8\x29\xf8\xa0\x71\x0f\xdd\x8a\xc4\x38\xa7\x95\x51\x0c\x81\x09\x41\xd4\xf6\x6c\x9d\x89\xa3\xc8\xed\xa5\xe7\x6b\x08\x9a\x4c\x79\xea\xc5\x41\x53\xff\x9c\x39\x84\x8b\xe9\xbf\x56\x93\xdb\x8f\xd3\xc9\xed\xdd\xc3\xc5\x18\xce\xce\x96\xb3\x7f\x4f\xbb\xb3\x0f\xe9\x3c\xbd\x99\x4c\x2f\xc6\xa7\x39\x74\xee\x90\x37\xad\x0b\xa4\xd0\x79\xc6\x37\x49\x89\xb8\xe9\x5f\x9e\xf3\xc0\xc9\xc1\x28\xca\x2c\xb2\xcd\xd5\xc9\x98\xba\x41\x1b\x1d\x2d\xe5\xc2\x35\xbc\x1a\xac\xab\xd7\xad\x99\x34\xf2\xfd\x96\xc8\x4f\x2b\x51\xa0\x8a\xef\xda\x91\xce\xe7\x9d\xe7\xf4\x41\xe1\xe8\x0e\x3e\x4e\xe7\xd3\xcf\xe9\x6a\x7a\x26\xb5\x5c\xa5\xab\xd9\xa4\x3e\xfa\xaf\x43\xf4\xfe\xcd\x21\xea\x2d\x97\xab\xdb\xc5\xb4\x37\x6e\xbe\xe6\xb7\xe9\xc7\xde\x9f\x14\x36\x7b\xd3\xf7\x8a\xcc\x9b\x7b\x63\xc5\xff\x92\xab\x27\xbb\x43\xce\x5e\x5a\x1d\x02\x09\x71\x5f\x3d\xfb\x89\x00\x4c\xb7\xfc\x91\xd7\x3f\x93\xa2\xf0\xfe\x45\xc6\x78\x8c\x1f\xe3\xff\x04\x00\x00\xff\xff\xb5\x44\x89\xaf\xbc\x0f\x00\x00")
+
+func prestate_tracerJsBytes() ([]byte, error) {
+ return bindataRead(
+ _prestate_tracerJs,
+ "prestate_tracer.js",
+ )
+}
+
+func prestate_tracerJs() (*asset, error) {
+ bytes, err := prestate_tracerJsBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "prestate_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
+ }
+ return a.bytes, nil
+ }
+ return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// MustAsset is like Asset but panics when Asset would return an error.
+// It simplifies safe initialization of global variables.
+func MustAsset(name string) []byte {
+ a, err := Asset(name)
+ if err != nil {
+ panic("asset: Asset(" + name + "): " + err.Error())
+ }
+
+ return a
+}
+
+// AssetInfo loads and returns the asset info for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func AssetInfo(name string) (os.FileInfo, error) {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
+ }
+ return a.info, nil
+ }
+ return nil, fmt.Errorf("AssetInfo %s not found", name)
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+ names := make([]string, 0, len(_bindata))
+ for name := range _bindata {
+ names = append(names, name)
+ }
+ return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() (*asset, error){
+ "4byte_tracer.js": _4byte_tracerJs,
+
+ "call_tracer.js": call_tracerJs,
+
+ "evmdis_tracer.js": evmdis_tracerJs,
+
+ "noop_tracer.js": noop_tracerJs,
+
+ "opcount_tracer.js": opcount_tracerJs,
+
+ "prestate_tracer.js": prestate_tracerJs,
+}
+
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+// data/
+// foo.txt
+// img/
+// a.png
+// b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"}
+// AssetDir("data/img") would return []string{"a.png", "b.png"}
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+ node := _bintree
+ if len(name) != 0 {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(canonicalName, "/")
+ for _, p := range pathList {
+ node = node.Children[p]
+ if node == nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ }
+ }
+ if node.Func != nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ rv := make([]string, 0, len(node.Children))
+ for childName := range node.Children {
+ rv = append(rv, childName)
+ }
+ return rv, nil
+}
+
+type bintree struct {
+ Func func() (*asset, error)
+ Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+ "4byte_tracer.js": {_4byte_tracerJs, map[string]*bintree{}},
+ "call_tracer.js": {call_tracerJs, map[string]*bintree{}},
+ "evmdis_tracer.js": {evmdis_tracerJs, map[string]*bintree{}},
+ "noop_tracer.js": {noop_tracerJs, map[string]*bintree{}},
+ "opcount_tracer.js": {opcount_tracerJs, map[string]*bintree{}},
+ "prestate_tracer.js": {prestate_tracerJs, map[string]*bintree{}},
+}}
+
+// RestoreAsset restores an asset under the given directory
+func RestoreAsset(dir, name string) error {
+ data, err := Asset(name)
+ if err != nil {
+ return err
+ }
+ info, err := AssetInfo(name)
+ if err != nil {
+ return err
+ }
+ err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
+ if err != nil {
+ return err
+ }
+ err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
+ if err != nil {
+ return err
+ }
+ return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
+}
+
+// RestoreAssets restores an asset under the given directory recursively
+func RestoreAssets(dir, name string) error {
+ children, err := AssetDir(name)
+ // File
+ if err != nil {
+ return RestoreAsset(dir, name)
+ }
+ // Dir
+ for _, child := range children {
+ err = RestoreAssets(dir, filepath.Join(name, child))
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func _filePath(dir, name string) string {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
+}
diff --git a/eth/tracers/internal/tracers/call_tracer.js b/eth/tracers/internal/tracers/call_tracer.js
new file mode 100644
index 000000000..83495b157
--- /dev/null
+++ b/eth/tracers/internal/tracers/call_tracer.js
@@ -0,0 +1,246 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// callTracer is a full blown transaction tracer that extracts and reports all
+// the internal calls made by a transaction, along with any useful information.
+{
+ // callstack is the current recursive call stack of the EVM execution.
+ callstack: [{}],
+
+ // descended tracks whether we've just descended from an outer transaction into
+ // an inner call.
+ descended: false,
+
+ // step is invoked for every opcode that the VM executes.
+ step: function(log, db) {
+ // Capture any errors immediately
+ var error = log.getError();
+ if (error !== undefined) {
+ this.fault(log, db);
+ return;
+ }
+ // We only care about system opcodes, faster if we pre-check once
+ var syscall = (log.op.toNumber() & 0xf0) == 0xf0;
+ if (syscall) {
+ var op = log.op.toString();
+ }
+ // If a new contract is being created, add to the call stack
+ if (syscall && op == 'CREATE') {
+ var inOff = log.stack.peek(1).valueOf();
+ var inEnd = inOff + log.stack.peek(2).valueOf();
+
+ // Assemble the internal call report and store for completion
+ var call = {
+ type: op,
+ from: toHex(log.contract.getAddress()),
+ input: toHex(log.memory.slice(inOff, inEnd)),
+ gasIn: log.getGas(),
+ gasCost: log.getCost(),
+ value: '0x' + log.stack.peek(0).toString(16)
+ };
+ this.callstack.push(call);
+ this.descended = true
+ return;
+ }
+ // If a contract is being self destructed, gather that as a subcall too
+ if (syscall && op == 'SELFDESTRUCT') {
+ var left = this.callstack.length;
+ if (this.callstack[left-1].calls === undefined) {
+ this.callstack[left-1].calls = [];
+ }
+ this.callstack[left-1].calls.push({type: op});
+ return
+ }
+ // If a new method invocation is being done, add to the call stack
+ if (syscall && (op == 'CALL' || op == 'CALLCODE' || op == 'DELEGATECALL' || op == 'STATICCALL')) {
+ // Skip any pre-compile invocations, those are just fancy opcodes
+ var to = toAddress(log.stack.peek(1).toString(16));
+ if (isPrecompiled(to)) {
+ return
+ }
+ var off = (op == 'DELEGATECALL' || op == 'STATICCALL' ? 0 : 1);
+
+ var inOff = log.stack.peek(2 + off).valueOf();
+ var inEnd = inOff + log.stack.peek(3 + off).valueOf();
+
+ // Assemble the internal call report and store for completion
+ var call = {
+ type: op,
+ from: toHex(log.contract.getAddress()),
+ to: toHex(to),
+ input: toHex(log.memory.slice(inOff, inEnd)),
+ gasIn: log.getGas(),
+ gasCost: log.getCost(),
+ outOff: log.stack.peek(4 + off).valueOf(),
+ outLen: log.stack.peek(5 + off).valueOf()
+ };
+ if (op != 'DELEGATECALL' && op != 'STATICCALL') {
+ call.value = '0x' + log.stack.peek(2).toString(16);
+ }
+ this.callstack.push(call);
+ this.descended = true
+ return;
+ }
+ // If we've just descended into an inner call, retrieve it's true allowance. We
+ // need to extract if from within the call as there may be funky gas dynamics
+ // with regard to requested and actually given gas (2300 stipend, 63/64 rule).
+ if (this.descended) {
+ if (log.getDepth() >= this.callstack.length) {
+ this.callstack[this.callstack.length - 1].gas = log.getGas();
+ } else {
+ // TODO(karalabe): The call was made to a plain account. We currently don't
+ // have access to the true gas amount inside the call and so any amount will
+ // mostly be wrong since it depends on a lot of input args. Skip gas for now.
+ }
+ this.descended = false;
+ }
+ // If an existing call is returning, pop off the call stack
+ if (syscall && op == 'REVERT') {
+ this.callstack[this.callstack.length - 1].error = "execution reverted";
+ return;
+ }
+ if (log.getDepth() == this.callstack.length - 1) {
+ // Pop off the last call and get the execution results
+ var call = this.callstack.pop();
+
+ if (call.type == 'CREATE') {
+ // If the call was a CREATE, retrieve the contract address and output code
+ call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost - log.getGas()).toString(16);
+ delete call.gasIn; delete call.gasCost;
+
+ var ret = log.stack.peek(0);
+ if (!ret.equals(0)) {
+ call.to = toHex(toAddress(ret.toString(16)));
+ call.output = toHex(db.getCode(toAddress(ret.toString(16))));
+ } else if (call.error === undefined) {
+ call.error = "internal failure"; // TODO(karalabe): surface these faults somehow
+ }
+ } else {
+ // If the call was a contract call, retrieve the gas usage and output
+ if (call.gas !== undefined) {
+ call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost + call.gas - log.getGas()).toString(16);
+
+ var ret = log.stack.peek(0);
+ if (!ret.equals(0)) {
+ call.output = toHex(log.memory.slice(call.outOff, call.outOff + call.outLen));
+ } else if (call.error === undefined) {
+ call.error = "internal failure"; // TODO(karalabe): surface these faults somehow
+ }
+ }
+ delete call.gasIn; delete call.gasCost;
+ delete call.outOff; delete call.outLen;
+ }
+ if (call.gas !== undefined) {
+ call.gas = '0x' + bigInt(call.gas).toString(16);
+ }
+ // Inject the call into the previous one
+ var left = this.callstack.length;
+ if (this.callstack[left-1].calls === undefined) {
+ this.callstack[left-1].calls = [];
+ }
+ this.callstack[left-1].calls.push(call);
+ }
+ },
+
+ // fault is invoked when the actual execution of an opcode fails.
+ fault: function(log, db) {
+ // If the topmost call already reverted, don't handle the additional fault again
+ if (this.callstack[this.callstack.length - 1].error !== undefined) {
+ return;
+ }
+ // Pop off the just failed call
+ var call = this.callstack.pop();
+ call.error = log.getError();
+
+ // Consume all available gas and clean any leftovers
+ if (call.gas !== undefined) {
+ call.gas = '0x' + bigInt(call.gas).toString(16);
+ call.gasUsed = call.gas
+ }
+ delete call.gasIn; delete call.gasCost;
+ delete call.outOff; delete call.outLen;
+
+ // Flatten the failed call into its parent
+ var left = this.callstack.length;
+ if (left > 0) {
+ if (this.callstack[left-1].calls === undefined) {
+ this.callstack[left-1].calls = [];
+ }
+ this.callstack[left-1].calls.push(call);
+ return;
+ }
+ // Last call failed too, leave it in the stack
+ this.callstack.push(call);
+ },
+
+ // result is invoked when all the opcodes have been iterated over and returns
+ // the final result of the tracing.
+ result: function(ctx, db) {
+ var result = {
+ type: ctx.type,
+ from: toHex(ctx.from),
+ to: toHex(ctx.to),
+ value: '0x' + ctx.value.toString(16),
+ gas: '0x' + bigInt(ctx.gas).toString(16),
+ gasUsed: '0x' + bigInt(ctx.gasUsed).toString(16),
+ input: toHex(ctx.input),
+ output: toHex(ctx.output),
+ time: ctx.time,
+ };
+ if (this.callstack[0].calls !== undefined) {
+ result.calls = this.callstack[0].calls;
+ }
+ if (this.callstack[0].error !== undefined) {
+ result.error = this.callstack[0].error;
+ } else if (ctx.error !== undefined) {
+ result.error = ctx.error;
+ }
+ if (result.error !== undefined) {
+ delete result.output;
+ }
+ return this.finalize(result);
+ },
+
+ // finalize recreates a call object using the final desired field oder for json
+ // serialization. This is a nicety feature to pass meaningfully ordered results
+ // to users who don't interpret it, just display it.
+ finalize: function(call) {
+ var sorted = {
+ type: call.type,
+ from: call.from,
+ to: call.to,
+ value: call.value,
+ gas: call.gas,
+ gasUsed: call.gasUsed,
+ input: call.input,
+ output: call.output,
+ error: call.error,
+ time: call.time,
+ calls: call.calls,
+ }
+ for (var key in sorted) {
+ if (sorted[key] === undefined) {
+ delete sorted[key];
+ }
+ }
+ if (sorted.calls !== undefined) {
+ for (var i=0; i<sorted.calls.length; i++) {
+ sorted.calls[i] = this.finalize(sorted.calls[i]);
+ }
+ }
+ return sorted;
+ }
+}
diff --git a/eth/tracers/internal/tracers/evmdis_tracer.js b/eth/tracers/internal/tracers/evmdis_tracer.js
new file mode 100644
index 000000000..2790e0fd5
--- /dev/null
+++ b/eth/tracers/internal/tracers/evmdis_tracer.js
@@ -0,0 +1,93 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// evmdisTracer returns sufficent information from a trace to perform evmdis-style
+// disassembly.
+{
+ stack: [{ops: []}],
+
+ npushes: {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 32: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 0, 56: 1, 57: 0, 58: 1, 59: 1, 60: 0, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 80: 0, 81: 1, 82: 0, 83: 0, 84: 1, 85: 0, 86: 0, 87: 0, 88: 1, 89: 1, 90: 1, 91: 0, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 2, 129: 3, 130: 4, 131: 5, 132: 6, 133: 7, 134: 8, 135: 9, 136: 10, 137: 11, 138: 12, 139: 13, 140: 14, 141: 15, 142: 16, 143: 17, 144: 2, 145: 3, 146: 4, 147: 5, 148: 6, 149: 7, 150: 8, 151: 9, 152: 10, 153: 11, 154: 12, 155: 13, 156: 14, 157: 15, 158: 16, 159: 17, 160: 0, 161: 0, 162: 0, 163: 0, 164: 0, 240: 1, 241: 1, 242: 1, 243: 0, 244: 0, 255: 0},
+
+ // result is invoked when all the opcodes have been iterated over and returns
+ // the final result of the tracing.
+ result: function() { return this.stack[0].ops; },
+
+ // fault is invoked when the actual execution of an opcode fails.
+ fault: function(log, db) { },
+
+ // step is invoked for every opcode that the VM executes.
+ step: function(log, db) {
+ var frame = this.stack[this.stack.length - 1];
+
+ var error = log.getError();
+ if (error) {
+ frame["error"] = error;
+ } else if (log.getDepth() == this.stack.length) {
+ opinfo = {
+ op: log.op.toNumber(),
+ depth : log.getDepth(),
+ result: [],
+ };
+ if (frame.ops.length > 0) {
+ var prevop = frame.ops[frame.ops.length - 1];
+ for(var i = 0; i < this.npushes[prevop.op]; i++)
+ prevop.result.push(log.stack.peek(i).toString(16));
+ }
+ switch(log.op.toString()) {
+ case "CALL": case "CALLCODE":
+ var instart = log.stack.peek(3).valueOf();
+ var insize = log.stack.peek(4).valueOf();
+ opinfo["gas"] = log.stack.peek(0).valueOf();
+ opinfo["to"] = log.stack.peek(1).toString(16);
+ opinfo["value"] = log.stack.peek(2).toString();
+ opinfo["input"] = log.memory.slice(instart, instart + insize);
+ opinfo["error"] = null;
+ opinfo["return"] = null;
+ opinfo["ops"] = [];
+ this.stack.push(opinfo);
+ break;
+ case "DELEGATECALL": case "STATICCALL":
+ var instart = log.stack.peek(2).valueOf();
+ var insize = log.stack.peek(3).valueOf();
+ opinfo["op"] = log.op.toString();
+ opinfo["gas"] = log.stack.peek(0).valueOf();
+ opinfo["to"] = log.stack.peek(1).toString(16);
+ opinfo["input"] = log.memory.slice(instart, instart + insize);
+ opinfo["error"] = null;
+ opinfo["return"] = null;
+ opinfo["ops"] = [];
+ this.stack.push(opinfo);
+ break;
+ case "RETURN":
+ var out = log.stack.peek(0).valueOf();
+ var outsize = log.stack.peek(1).valueOf();
+ frame.return = log.memory.slice(out, out + outsize);
+ break;
+ case "STOP": case "SUICIDE":
+ frame.return = log.memory.slice(0, 0);
+ break;
+ case "JUMPDEST":
+ opinfo["pc"] = log.getPC();
+ }
+ if(log.op.isPush()) {
+ opinfo["len"] = log.op.toNumber() - 0x5e;
+ }
+ frame.ops.push(opinfo);
+ } else {
+ this.stack = this.stack.slice(0, log.getDepth());
+ }
+ }
+}
diff --git a/eth/tracers/internal/tracers/noop_tracer.js b/eth/tracers/internal/tracers/noop_tracer.js
new file mode 100644
index 000000000..f966ddc7d
--- /dev/null
+++ b/eth/tracers/internal/tracers/noop_tracer.js
@@ -0,0 +1,29 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// noopTracer is just the barebone boilerplate code required from a JavaScript
+// object to be usable as a transaction tracer.
+{
+ // step is invoked for every opcode that the VM executes.
+ step: function(log, db) { },
+
+ // fault is invoked when the actual execution of an opcode fails.
+ fault: function(log, db) { },
+
+ // result is invoked when all the opcodes have been iterated over and returns
+ // the final result of the tracing.
+ result: function(ctx, db) { }
+}
diff --git a/eth/tracers/internal/tracers/opcount_tracer.js b/eth/tracers/internal/tracers/opcount_tracer.js
new file mode 100644
index 000000000..f7984c741
--- /dev/null
+++ b/eth/tracers/internal/tracers/opcount_tracer.js
@@ -0,0 +1,32 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// opcountTracer is a sample tracer that just counts the number of instructions
+// executed by the EVM before the transaction terminated.
+{
+ // count tracks the number of EVM instructions executed.
+ count: 0,
+
+ // step is invoked for every opcode that the VM executes.
+ step: function(log, db) { this.count++ },
+
+ // fault is invoked when the actual execution of an opcode fails.
+ fault: function(log, db) { },
+
+ // result is invoked when all the opcodes have been iterated over and returns
+ // the final result of the tracing.
+ result: function(ctx, db) { return this.count }
+}
diff --git a/eth/tracers/internal/tracers/prestate_tracer.js b/eth/tracers/internal/tracers/prestate_tracer.js
new file mode 100644
index 000000000..99f71d2c3
--- /dev/null
+++ b/eth/tracers/internal/tracers/prestate_tracer.js
@@ -0,0 +1,103 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// prestateTracer outputs sufficient information to create a local execution of
+// the transaction from a custom assembled genesis block.
+{
+ // prestate is the genesis that we're building.
+ prestate: null,
+
+ // lookupAccount injects the specified account into the prestate object.
+ lookupAccount: function(addr, db){
+ var acc = toHex(addr);
+ if (this.prestate[acc] === undefined) {
+ this.prestate[acc] = {
+ balance: '0x' + db.getBalance(addr).toString(16),
+ nonce: db.getNonce(addr),
+ code: toHex(db.getCode(addr)),
+ storage: {}
+ };
+ }
+ },
+
+ // lookupStorage injects the specified storage entry of the given account into
+ // the prestate object.
+ lookupStorage: function(addr, key, db){
+ var acc = toHex(addr);
+ var idx = toHex(key);
+
+ if (this.prestate[acc].storage[idx] === undefined) {
+ var val = toHex(db.getState(addr, key));
+ if (val != "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ this.prestate[acc].storage[idx] = toHex(db.getState(addr, key));
+ }
+ }
+ },
+
+ // result is invoked when all the opcodes have been iterated over and returns
+ // the final result of the tracing.
+ result: function(ctx, db) {
+ // At this point, we need to deduct the 'value' from the
+ // outer transaction, and move it back to the origin
+ this.lookupAccount(ctx.from, db);
+
+ var fromBal = bigInt(this.prestate[toHex(ctx.from)].balance.slice(2), 16);
+ var toBal = bigInt(this.prestate[toHex(ctx.to)].balance.slice(2), 16);
+
+ this.prestate[toHex(ctx.to)].balance = '0x'+toBal.subtract(ctx.value).toString(16);
+ this.prestate[toHex(ctx.from)].balance = '0x'+fromBal.add(ctx.value).toString(16);
+
+ // Decrement the caller's nonce, and remove empty create targets
+ this.prestate[toHex(ctx.from)].nonce--;
+ if (ctx.type == 'CREATE') {
+ // We can blibdly delete the contract prestate, as any existing state would
+ // have caused the transaction to be rejected as invalid in the first place.
+ delete this.prestate[toHex(ctx.to)];
+ }
+ // Return the assembled allocations (prestate)
+ return this.prestate;
+ },
+
+ // step is invoked for every opcode that the VM executes.
+ step: function(log, db) {
+ // Add the current account if we just started tracing
+ if (this.prestate === null){
+ this.prestate = {};
+ // Balance will potentially be wrong here, since this will include the value
+ // sent along with the message. We fix that in 'result()'.
+ this.lookupAccount(log.contract.getAddress(), db);
+ }
+ // Whenever new state is accessed, add it to the prestate
+ switch (log.op.toString()) {
+ case "EXTCODECOPY": case "EXTCODESIZE": case "BALANCE":
+ this.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db);
+ break;
+ case "CREATE":
+ var from = log.contract.getAddress();
+ this.lookupAccount(toContract(from, db.getNonce(from)), db);
+ break;
+ case "CALL": case "CALLCODE": case "DELEGATECALL": case "STATICCALL":
+ this.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db);
+ break;
+ case 'SSTORE':case 'SLOAD':
+ this.lookupStorage(log.contract.getAddress(), toWord(log.stack.peek(0).toString(16)), db);
+ break;
+ }
+ },
+
+ // fault is invoked when the actual execution of an opcode fails.
+ fault: function(log, db) {}
+}
diff --git a/eth/tracers/internal/tracers/tracers.go b/eth/tracers/internal/tracers/tracers.go
new file mode 100644
index 000000000..dcf0d49da
--- /dev/null
+++ b/eth/tracers/internal/tracers/tracers.go
@@ -0,0 +1,21 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+//go:generate go-bindata -nometadata -o assets.go -pkg tracers -ignore ((tracers)|(assets)).go ./...
+//go:generate gofmt -s -w assets.go
+
+// Package tracers contains the actual JavaScript tracer assets.
+package tracers
diff --git a/eth/tracers/testdata/call_tracer_create.json b/eth/tracers/testdata/call_tracer_create.json
new file mode 100644
index 000000000..8699bf3e7
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_create.json
@@ -0,0 +1,58 @@
+{
+ "context": {
+ "difficulty": "3755480783",
+ "gasLimit": "5401723",
+ "miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
+ "number": "2294702",
+ "timestamp": "1513676146"
+ },
+ "genesis": {
+ "alloc": {
+ "0x13e4acefe6a6700604929946e70e6443e4e73447": {
+ "balance": "0xcf3e0938579f000",
+ "code": "0x",
+ "nonce": "9",
+ "storage": {}
+ },
+ "0x7dc9c9730689ff0b0fd506c67db815f12d90a448": {
+ "balance": "0x0",
+ "code": "0x",
+ "nonce": "0",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "3757315409",
+ "extraData": "0x566961425443",
+ "gasLimit": "5406414",
+ "hash": "0xae107f592eebdd9ff8d6ba00363676096e6afb0e1007a7d3d0af88173077378d",
+ "miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
+ "mixHash": "0xc927aa05a38bc3de864e95c33b3ae559d3f39c4ccd51cef6f113f9c50ba0caf1",
+ "nonce": "0x93363bbd2c95f410",
+ "number": "2294701",
+ "stateRoot": "0x6b6737d5bde8058990483e915866bd1578014baeff57bd5e4ed228a2bfad635c",
+ "timestamp": "1513676127",
+ "totalDifficulty": "7160808139332585"
+ },
+ "input": "0xf907ef098504e3b29200830897be8080b9079c606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a1129a01060f46676a5dff6f407f0f51eb6f37f5c8c54e238c70221e18e65fc29d3ea65a0557b01c50ff4ffaac8ed6e5d31237a4ecbac843ab1bfe8bb0165a0060df7c54f",
+ "result": {
+ "from": "0x13e4acefe6a6700604929946e70e6443e4e73447",
+ "gas": "0x5e106",
+ "gasUsed": "0x5e106",
+ "input": "0x606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a11",
+ "output": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029",
+ "to": "0x7dc9c9730689ff0b0fd506c67db815f12d90a448",
+ "type": "CREATE",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_deep_calls.json b/eth/tracers/testdata/call_tracer_deep_calls.json
new file mode 100644
index 000000000..0353d4cfa
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_deep_calls.json
@@ -0,0 +1,415 @@
+{
+ "context": {
+ "difficulty": "117066904",
+ "gasLimit": "4712384",
+ "miner": "0x1977c248e1014cc103929dd7f154199c916e39ec",
+ "number": "25001",
+ "timestamp": "1479891545"
+ },
+ "genesis": {
+ "alloc": {
+ "0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38": {
+ "balance": "0x0",
+ "code": "0x606060405236156100825760e060020a600035046302d05d3f811461008a5780630accce061461009c5780631ab9075a146100c757806331ed274614610102578063645a3b7214610133578063772fdae314610155578063a7f4377914610180578063ae5f80801461019e578063c9bded21146101ea578063f905c15a14610231575b61023a610002565b61023c600054600160a060020a031681565b61023a600435602435604435606435608435600254600160a060020a03166000141561024657610002565b61023a600435600254600160a060020a03166000148015906100f8575060025433600160a060020a03908116911614155b156102f457610002565b61023a60043560243560443560643560843560a43560c435600254600160a060020a03166000141561031657610002565b61023a600435602435600254600160a060020a0316600014156103d057610002565b61023a600435602435604435606435608435600254600160a060020a03166000141561046157610002565b61023a60025433600160a060020a0390811691161461051657610002565b61023a6004356024356044356060828152600160a060020a0382169060ff8516907fa6c2f0913db6f79ff0a4365762c61718973b3413d6e40382e704782a9a5099f690602090a3505050565b61023a600435602435600160a060020a038116606090815260ff8316907fee6348a7ec70f74e3d6cba55a53e9f9110d180d7698e9117fc466ae29a43e34790602090a25050565b61023c60035481565b005b6060908152602090f35b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f115610002575050604051511515905061029d57610002565b60408051858152602081018390528151600160a060020a03858116939087169260ff8a16927f5a690ecd0cb15c1c1fd6b6f8a32df0d4f56cb41a54fea7e94020f013595de796929181900390910190a45050505050565b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f115610002575050604051511515905061036d57610002565b6040805186815260208101869052808201859052606081018490529051600160a060020a03831691889160ff8b16917fd65d9ddafbad8824e2bbd6f56cc9f4ac27ba60737035c10a321ea2f681c94d47919081900360800190a450505050505050565b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f115610002575050604051511515905061042757610002565b60408051828152905183917fa9c6cbc4bd352a6940479f6d802a1001550581858b310d7f68f7bea51218cda6919081900360200190a25050565b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f11561000257505060405151151590506104b857610002565b80600160a060020a031684600160a060020a03168660ff167f69bdaf789251e1d3a0151259c0c715315496a7404bce9fd0b714674685c2cab78686604051808381526020018281526020019250505060405180910390a45050505050565b600254600160a060020a0316ff",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396"
+ }
+ },
+ "0x2cccf5e0538493c235d1c5ef6580f77d99e91396": {
+ "balance": "0x0",
+ "code": "0x606060405236156100775760e060020a600035046302d05d3f811461007f57806313bc6d4b146100915780633688a877146100b95780635188f9961461012f5780637eadc976146101545780638ad79680146101d3578063a43e04d814610238578063a7f437791461025e578063e16c7d981461027c575b61029f610002565b6102a1600054600160a060020a031681565b6102be600435600160a060020a03811660009081526002602052604090205460ff165b919050565b6102d26004356040805160208181018352600080835284815260038252835190849020805460026001821615610100026000190190911604601f8101849004840283018401909552848252929390929183018282801561037d5780601f106103525761010080835404028352916020019161037d565b61029f6004356024356000805433600160a060020a039081169116146104a957610002565b61034060043560008181526001602090815260408083205481517ff905c15a0000000000000000000000000000000000000000000000000000000081529151600160a060020a03909116928392839263f905c15a92600483810193919291829003018189876161da5a03f1156100025750506040515195945050505050565b60408051602060248035600481810135601f810185900485028601850190965285855261029f9581359591946044949293909201918190840183828082843750949650505050505050600054600160a060020a0390811633909116146104f657610002565b61029f6004355b600080548190600160a060020a0390811633909116146105a457610002565b61029f60005433600160a060020a0390811691161461072957610002565b6102a1600435600081815260016020526040902054600160a060020a03166100b4565b005b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b820191906000526020600020905b81548152906001019060200180831161036057829003601f168201915b505050505090506100b4565b506000828152600160208181526040808420805473ffffffffffffffffffffffffffffffffffffffff191686179055600160a060020a038581168086526002909352818520805460ff191690941790935580517f1ab9075a0000000000000000000000000000000000000000000000000000000081523090931660048401525184939192631ab9075a926024828101939192829003018183876161da5a03f11561000257505060408051602081018690528082019290925243606083015260808083526003908301527f414444000000000000000000000000000000000000000000000000000000000060a0830152517f8ac68d4e97d65912f220b4c5f87978b8186320a5e378c1369850b5b5f90323d39181900360c00190a15b505050565b600083815260016020526040902054600160a060020a03838116911614156104d0576104a4565b600083815260016020526040812054600160a060020a031614610389576103898361023f565b600082815260036020908152604082208054845182855293839020919360026001831615610100026000190190921691909104601f90810184900483019391929186019083901061056a57805160ff19168380011785555b5061059a9291505b808211156105a05760008155600101610556565b8280016001018555821561054e579182015b8281111561054e57825182600050559160200191906001019061057c565b50505050565b5090565b600083815260016020526040812054600160a060020a031614156105c757610002565b50506000818152600160205260408082205481517fa7f437790000000000000000000000000000000000000000000000000000000081529151600160a060020a0391909116928392839263a7f4377992600483810193919291829003018183876161da5a03f11561000257505050600160005060008460001916815260200190815260200160002060006101000a815490600160a060020a0302191690556002600050600083600160a060020a0316815260200190815260200160002060006101000a81549060ff02191690557f8ac68d4e97d65912f220b4c5f87978b8186320a5e378c1369850b5b5f90323d383834360405180806020018560001916815260200184600160a060020a03168152602001838152602001828103825260038152602001807f44454c000000000000000000000000000000000000000000000000000000000081526020015060200194505050505060405180910390a1505050565b600054600160a060020a0316ff",
+ "nonce": "1",
+ "storage": {
+ "0x0684ac65a9fa32414dda56996f4183597d695987fdb82b145d722743891a6fe8": "0x0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690",
+ "0x1cd76f78169a420d99346e3501dd3e541622c38a226f9b63e01cfebc69879dc7": "0x000000000000000000000000b4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "0x8e54a4494fe5da016bfc01363f4f6cdc91013bb5434bd2a4a3359f13a23afa2f": "0x000000000000000000000000cf00ffd997ad14939736f026006498e3f099baaf",
+ "0x94edf7f600ba56655fd65fca1f1424334ce369326c1dc3e53151dcd1ad06bc13": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xbbee47108b275f55f98482c6800f6372165e88b0330d3f5dae6419df4734366c": "0x0000000000000000000000002a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "0xd38c0c4e84de118cfdcc775130155d83b8bbaaf23dc7f3c83a626b10473213bd": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xfb3aa5c655c2ec9d40609401f88d505d1da61afaa550e36ef5da0509ada257ba": "0x0000000000000000000000007986bad81f4cbd9317f5a46861437dae58d69113"
+ }
+ },
+ "0x3e9286eafa2db8101246c2131c09b49080d00690": {
+ "balance": "0x0",
+ "code": "0x606060405236156100cf5760e060020a600035046302d05d3f81146100d7578063056d4470146100e957806316c66cc61461010c5780631ab9075a146101935780633ae1005c146101ce57806358541662146101fe5780635ed61af014610231578063644e3b791461025457806384dbac3b146102db578063949ae479146102fd5780639859387b14610321578063a7f4377914610340578063ab03fc261461035e578063e8161b7814610385578063e964d4e114610395578063f905c15a146103a5578063f92eb774146103ae575b6103be610002565b6103c0600054600160a060020a031681565b6103be6004356002546000908190600160a060020a031681141561040357610002565b6103dd60043560006108365b6040805160025460e360020a631c2d8fb30282527f636f6e747261637464620000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b6103be600435600254600160a060020a03166000148015906101c4575060025433600160a060020a03908116911614155b1561088d57610002565b6103be600435602435604435606435600254600090819081908190600160a060020a03168114156108af57610002565b6103c0600435602435604435606435608435600254600090819081908190600160a060020a03168114156110e857610002565b6103be6004356002546000908190600160a060020a03168114156115ec57610002565b6103c06004356000611b635b6040805160025460e360020a631c2d8fb30282527f6d61726b6574646200000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b6103be600435602435600254600160a060020a031660001415611bb557610002565b6103be600435602435600254600090600160a060020a0316811415611d2e57610002565b6103be600435600254600160a060020a031660001415611fc657610002565b6103be60025433600160a060020a0390811691161461207e57610002565b6103be600435602435604435600254600090600160a060020a031681141561208c57610002565b6103dd60043560006124b8610260565b6103c0600435600061250a610118565b6103f160035481565b6103f16004356000612561610260565b005b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061046557610002565b8291506104e55b6040805160025460e360020a631c2d8fb30282527f63706f6f6c00000000000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f115610002575050604051519150505b90565b600160a060020a031663b2206e6d83600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fb2206e6d0000000000000000000000000000000000000000000000000000000082526004820152600160a060020a038816602482015290516044808301935060209282900301816000876161da5a03f11561000257505060405151915061059b90506106ba565b600160a060020a031663d5b205ce83600160a060020a03166336da44686040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a636ad902e7028252600160a060020a0390811660048301526024820187905288166044820152905160648281019350600092829003018183876161da5a03f115610002575050506107355b6040805160025460e360020a631c2d8fb30282527f6c6f676d6772000000000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b50826120ee5b6040805160025460e360020a631c2d8fb30282527f6163636f756e7463746c0000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b600160a060020a0316630accce06600684600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6306db488d02825291519192899290916336da446891600482810192602092919082900301816000876161da5a03f1156100025750505060405180519060200150866040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050505050565b600160a060020a03166316c66cc6836040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f115610002575050604051519150505b919050565b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061091157610002565b87935061091c610260565b600160a060020a031663bdbdb08685600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fbdbdb0860000000000000000000000000000000000000000000000000000000082526004820152602481018a905290516044808301935060209282900301816000876161da5a03f1156100025750506040515193506109ca90506106ba565b600160a060020a03166381982a7a8885876040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f11561000257505050610a3661046c565b600160a060020a03166308636bdb85600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517f08636bdb000000000000000000000000000000000000000000000000000000008252600482015260248101889052604481019290925251606482810192602092919082900301816000876161da5a03f11561000257505060408051805160e160020a630a5d50db028252600482018190529151919450600160a060020a03871692506314baa1b6916024828101926000929190829003018183876161da5a03f11561000257505050610b3561046c565b600160a060020a0316630a3b6ede85600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a63051db76f0282526004820152600160a060020a038d16602482015290516044808301935060209282900301816000876161da5a03f115610002575050604051519150610bd590506106ba565b600160a060020a031663d5b205ce87838b6040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f11561000257505050610c41610118565b600160a060020a031663988db79c888a6040518360e060020a0281526004018083600160a060020a0316815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050610ca5610260565b600160a060020a031663f4f2821b896040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050610d6f5b6040805160025460e360020a631c2d8fb30282527f747261646564620000000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b600160a060020a0316635f539d69896040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050610dc2610639565b600160a060020a0316630accce06600386600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6315b1ea01028252915191928e928e9263ad8f500891600482810192602092919082900301816000876161da5a03f11561000257505050604051805190602001506040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050610ec5610639565b600160a060020a0316630accce06600386600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6315b1ea01028252915191928e928d9263ad8f500891600482810192602092919082900301816000876161da5a03f11561000257505050604051805190602001506040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050610fc8610639565b600160a060020a031663645a3b7285600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151905061101e610260565b600160a060020a031663f92eb77488600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e260020a633e4baddd028252600482015290516024828101935060209282900301816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448381019360009350829003018183876161da5a03f115610002575050505050505050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061114a57610002565b604051600254600160a060020a0316908a908a908a908a908a90611579806125b38339018087600160a060020a0316815260200186600160a060020a03168152602001856000191681526020018481526020018381526020018281526020019650505050505050604051809103906000f092506111c5610118565b600160a060020a031663b9858a288a856040518360e060020a0281526004018083600160a060020a0316815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611229610260565b600160a060020a0316635188f99689856040518360e060020a028152600401808360001916815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611288610260565b600160a060020a031663bdbdb08689896040518360e060020a0281526004018083600019168152602001828152602001925050506020604051808303816000876161da5a03f1156100025750506040515192506112e590506106ba565b600160a060020a03166346d88e7d8a858a6040518460e060020a0281526004018084600160a060020a0316815260200183600160a060020a0316815260200182815260200193505050506000604051808303816000876161da5a03f115610002575050506113516106ba565b600160a060020a03166381982a7a8a84866040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f115610002575050506113bd61046c565b600160a060020a0316632b58469689856040518360e060020a028152600401808360001916815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f1156100025750505061141c61046c565b600160a060020a03166308636bdb8984866040518460e060020a028152600401808460001916815260200183815260200182600160a060020a0316815260200193505050506020604051808303816000876161da5a03f11561000257505060408051805160e160020a630a5d50db028252600482018190529151919350600160a060020a03861692506314baa1b6916024828101926000929190829003018183876161da5a03f115610002575050506114d3610639565b6040805160e160020a630566670302815260016004820152602481018b9052600160a060020a0386811660448301528c811660648301526000608483018190529251931692630accce069260a480840193919291829003018183876161da5a03f11561000257505050611544610639565b600160a060020a031663645a3b728961155b610260565b600160a060020a031663f92eb7748c6040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448084019360009350829003018183876161da5a03f1156100025750939a9950505050505050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061164e57610002565b82915061165961046c565b600160a060020a0316630a3b6ede83600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a63051db76f0282526004820152600160a060020a038816602482015290516044808301935060209282900301816000876161da5a03f1156100025750506040515191506116f990506106ba565b600160a060020a031663d5b205ce83600160a060020a03166336da44686040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a636ad902e7028252600160a060020a0390811660048301526024820187905288166044820152905160648281019350600092829003018183876161da5a03f1156100025750505061179b6106ba565b600160a060020a031663d653078983600160a060020a03166336da44686040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517ff1ff78a0000000000000000000000000000000000000000000000000000000008252915191929163f1ff78a09160048181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150866040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f1156100025750505061189f610260565b600160a060020a031663f4f2821b846040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f115610002575050506118f2610118565b600160a060020a031663f4f2821b846040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050611945610639565b600160a060020a0316630accce06600484600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6306db488d02825291519192899290916336da44689181870191602091908190038801816000876161da5a03f115610002575050506040518051906020015060006040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050611a48610639565b600160a060020a031663645a3b7283600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050604051519050611a9e610260565b600160a060020a031663f92eb77486600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e260020a633e4baddd028252600482015290516024828101935060209282900301816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448381019360009350829003018183876161da5a03f11561000257505050505050565b600160a060020a03166381738c59836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750506040515191506108889050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f1156100025750506040515115159050611c1757610002565b611c1f610260565b600160a060020a03166338a699a4836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505060405151159050611c7457610002565b611c7c610260565b600160a060020a0316632243118a836040518260e060020a02815260040180826000191681526020019150506000604051808303816000876161da5a03f11561000257505050611cca610639565b600160a060020a031663ae5f8080600184846040518460e060020a028152600401808481526020018360001916815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f115610002575050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f1156100025750506040515115159050611d9057610002565b5081611d9a610260565b600160a060020a031663581d5d6084846040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505050611df5610639565b600160a060020a0316630accce06600283600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a630566670302825260048201949094526024810193909352600160a060020a038816604484015260006064840181905260848401819052905160a4808501949293509091829003018183876161da5a03f11561000257505050611eab610639565b600160a060020a031663645a3b7282600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050604051519050611f01610260565b600160a060020a031663f92eb77485600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e260020a633e4baddd028252600482015290516024828101935060209282900301816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448381019360009350829003018183876161da5a03f11561000257505050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061202857610002565b612030610118565b600160a060020a0316639859387b826040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f1156100025750505050565b600254600160a060020a0316ff5b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f11561000257505060405151151590506106b457610002565b600160a060020a031663d65307898383600160a060020a031663f1ff78a06040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fd6530789000000000000000000000000000000000000000000000000000000008252600160a060020a039485166004830152602482015292891660448401525160648381019360009350829003018183876161da5a03f115610002575050506121a5610118565b600160a060020a031663f4f2821b856040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f115610002575050506121f8610cf4565b600160a060020a031663f4f2821b856040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f1156100025750505061224b610639565b600160a060020a0316630accce06600583600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6306db488d028252915191928a9290916336da446891600482810192602092919082900301816000876161da5a03f1156100025750505060405180519060200150886040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f1156100025750505080600160a060020a031663ea71b02d6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151600160a060020a031660001490506124b25761239f610639565b600160a060020a0316630accce06600583600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fea71b02d000000000000000000000000000000000000000000000000000000008252915191928a92909163ea71b02d91600482810192602092919082900301816000876161da5a03f1156100025750505060405180519060200150886040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f115610002575050505b50505050565b600160a060020a03166338a699a4836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750506040515191506108889050565b600160a060020a031663213fe2b7836040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515191506108889050565b600160a060020a031663f92eb774836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f115610002575050604051519150610888905056606060405260405160c08061157983396101206040819052825160805160a051935160e0516101005160008054600160a060020a03199081163317909155600180546005805484168817905560048a90556006869055600b8590556008849055909116861760a060020a60ff02191690554360038190556002558686526101408390526101608190529396929594919390929091600160a060020a033016917f76885d242fb71c6f74a7e717416e42eff4d96faf54f6de75c6a0a6bbd8890c6b91a230600160a060020a03167fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff600b600050546040518082815260200191505060405180910390a250505050505061145e8061011b6000396000f3606060405236156101745760e060020a600035046302d05d3f811461017c57806304a7fdbc1461018e5780630e90f957146101fb5780630fb5a6b41461021257806314baa1b61461021b57806317fc45e21461023a5780632b096926146102435780632e94420f1461025b578063325a19f11461026457806336da44681461026d5780633f81a2c01461027f5780633fc306821461029757806345ecd3d7146102d45780634665096d146102dd5780634e71d92d146102e657806351a34eb8146103085780636111bb951461032d5780636f265b93146103445780637e9014e11461034d57806390ba009114610360578063927df5e014610393578063a7f437791461046c578063ad8f50081461046e578063bc6d909414610477578063bdec3ad114610557578063c19d93fb1461059a578063c9503fe2146105ad578063e0a73a93146105b6578063ea71b02d146105bf578063ea8a1af0146105d1578063ee4a96f9146105f3578063f1ff78a01461065c575b61046c610002565b610665600054600160a060020a031681565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600554600090600160a060020a0390811633909116146106a857610002565b61068260015460a060020a900460ff166000145b90565b61069660085481565b61046c600435600154600160a060020a03166000141561072157610002565b610696600d5481565b610696600435600f8160068110156100025750015481565b61069660045481565b61069660035481565b610665600554600160a060020a031681565b61069660043560158160068110156100025750015481565b6106966004355b600b54600f5460009160028202808203928083039290810191018386101561078357601054840186900394505b50505050919050565b61069660025481565b61069660095481565b61046c600554600090600160a060020a03908116339091161461085857610002565b61046c600435600554600090600160a060020a03908116339091161461092e57610002565b6106826001805460a060020a900460ff161461020f565b610696600b5481565b61068260075460a060020a900460ff1681565b6106966004355b600b54601554600091600282028082039280830392908101910183861015610a6c5760165494506102cb565b61046c6004356024356044356040805160015460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b02600483015291516000928392600160a060020a03919091169163e16c7d9891602481810192602092909190829003018187876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610b4657610002565b005b610696600a5481565b61046c60006000600060006000600160009054906101000a9004600160a060020a0316600160a060020a031663e16c7d986040518160e060020a028152600401808060b260020a691858d8dbdd5b9d18dd1b0281526020015060200190506020604051808303816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f1757610002565b61046c5b60015b60058160ff16101561071e57600f6001820160ff166006811015610002578101549060ff83166006811015610002570154101561129057610002565b61069660015460a060020a900460ff1681565b61069660065481565b610696600c5481565b610665600754600160a060020a031681565b61046c600554600090600160a060020a0390811633909116146112c857610002565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600154600090600160a060020a03168114156113fb57610002565b610696600e5481565b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060005b60068160ff16101561070857828160ff166006811015610002576020020151600f60ff831660068110156100025701558160ff82166006811015610002576020020151601560ff831660068110156100025701556001016106ac565b61071061055b565b505050565b600e8054820190555b50565b6040805160015460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061071557610002565b83861015801561079257508286105b156107b457600f546010546011548689039082030291909104900394506102cb565b8286101580156107c55750600b5486105b156107e757600f546011546012548589039082030291909104900394506102cb565b600b5486108015906107f857508186105b1561081d57600b54600f546012546013549289039281039290920204900394506102cb565b81861015801561082c57508086105b1561084e57600f546013546014548489039082030291909104900394506102cb565b60145494506102cb565b60015460a060020a900460ff1660001461087157610002565b600254600a01431161088257610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663771d50e16040518160e060020a0281526004018090506000604051808303816000876161da5a03f1156100025750505050565b60015460a060020a900460ff1660001461094757610002565b600254600a01431161095857610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180517f51a34eb8000000000000000000000000000000000000000000000000000000008252600482018690529151919350600160a060020a03841692506351a34eb8916024808301926000929190829003018183876161da5a03f11561000257505050600b8290554360025560408051838152905130600160a060020a0316917fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff919081900360200190a25050565b838610158015610a7b57508286105b15610a9d576015546016546017548689039082900302919091040194506102cb565b828610158015610aae5750600b5486105b15610ad0576015546017546018548589039082900302919091040194506102cb565b600b548610801590610ae157508186105b15610b0657600b546015546018546019549289039281900392909202040194506102cb565b818610158015610b1557508086105b15610b3757601554601954601a548489039082900302919091040194506102cb565b601a54860181900394506102cb565b60015460a060020a900460ff16600014610b5f57610002565b6001805460a060020a60ff02191660a060020a17908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919450600160a060020a038516925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604080518051600a556005547ffebf661200000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015216602482015260448101879052905163febf661291606480820192600092909190829003018183876161da5a03f115610002575050508215610cc7576007805473ffffffffffffffffffffffffffffffffffffffff191633179055610dbb565b6040805160055460065460e060020a63599efa6b028352600160a060020a039182166004840152602483015291519184169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050604080516006547f56ccb6f000000000000000000000000000000000000000000000000000000000825233600160a060020a03166004830152602482015290516356ccb6f091604480820192600092909190829003018183876161da5a03f115610002575050600580546007805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551633179055505b6007805460a060020a60ff02191660a060020a87810291909117918290556008544301600955900460ff1615610df757600a54610e039061029e565b600a54610e0b90610367565b600c55610e0f565b600c555b600c54670de0b6b3a7640000850204600d55600754600554604080517f759297bb000000000000000000000000000000000000000000000000000000008152600160a060020a039384166004820152918316602483015260448201879052519184169163759297bb91606481810192600092909190829003018183876161da5a03f11561000257505060408051600754600a54600d54600554600c5460a060020a850460ff161515865260208601929092528486019290925260608401529251600160a060020a0391821694509281169230909116917f3b3d1986083d191be01d28623dc19604728e29ae28bdb9ba52757fdee1a18de2919081900360800190a45050505050565b600954431015610f2657610002565b6001805460a060020a900460ff1614610f3e57610002565b6001805460a060020a60ff0219167402000000000000000000000000000000000000000017908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919750600160a060020a038816925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604051516007549095506000945060a060020a900460ff1615905061105c57600a5484111561105757600a54600d54670de0b6b3a7640000918603020492505b61107e565b600a5484101561107e57600a54600d54670de0b6b3a764000091869003020492505b60065483111561108e5760065492505b6006548390039150600083111561111857604080516005546007547f5928d37f000000000000000000000000000000000000000000000000000000008352600160a060020a0391821660048401528116602483015260448201869052915191871691635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505b600082111561117a576040805160055460e060020a63599efa6b028252600160a060020a0390811660048301526024820185905291519187169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050505b6040805185815260208101849052808201859052905130600160a060020a0316917f89e690b1d5aaae14f3e85f108dc92d9ab3763a58d45aed8b59daedbbae8fe794919081900360600190a260008311156112285784600160a060020a0316634cc927d785336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611282565b84600160a060020a0316634cc927d7600a60005054336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f115610002575050505b600054600160a060020a0316ff5b60156001820160ff166006811015610002578101549060ff8316600681101561000257015411156112c057610002565b60010161055e565b60015460a060020a900460ff166000146112e157610002565b600254600a0143116112f257610002565b6001546040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f11561000257505060408051805160055460065460e060020a63599efa6b028452600160a060020a03918216600485015260248401529251909450918416925063599efa6b916044808301926000929190829003018183876161da5a03f1156100025750505080600160a060020a0316632b68bb2d6040518160e060020a0281526004018090506000604051808303816000876161da5a03f115610002575050600054600160a060020a03169050ff5b6001546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602480830192602092919082900301816000876161da5a03f11561000257505060405151151590506106a85761000256",
+ "nonce": "16",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396"
+ }
+ },
+ "0x70c9217d814985faef62b124420f8dfbddd96433": {
+ "balance": "0x4ef436dcbda6cd4a",
+ "code": "0x",
+ "nonce": "1634",
+ "storage": {}
+ },
+ "0x7986bad81f4cbd9317f5a46861437dae58d69113": {
+ "balance": "0x0",
+ "code": "0x6060604052361561008d5760e060020a600035046302d05d3f811461009557806316c66cc6146100a75780631ab9075a146100d7578063213fe2b7146101125780639859387b1461013f578063988db79c1461015e578063a7f4377914610180578063b9858a281461019e578063c8e40fbf146101c0578063f4f2821b146101e8578063f905c15a14610209575b610212610002565b610214600054600160a060020a031681565b600160a060020a0360043581811660009081526005602052604081205461023193168114610257575060016101e3565b610212600435600254600160a060020a0316600014801590610108575060025433600160a060020a03908116911614155b1561025f57610002565b610214600435600160a060020a03811660009081526004602052604081205460ff16151561027557610002565b610212600435600254600160a060020a03166000141561029b57610002565b610212600435602435600254600160a060020a03166000141561050457610002565b61021260025433600160a060020a0390811691161461056757610002565b610212600435602435600254600160a060020a03166000141561057557610002565b610231600435600160a060020a03811660009081526004602052604090205460ff165b919050565b610212600435600254600090600160a060020a031681141561072057610002565b61024560035481565b005b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060006101e3565b60028054600160a060020a031916821790555b50565b50600160a060020a038181166000908152600460205260409020546101009004166101e3565b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f11561000257505060405151151590506102fe57610002565b600160a060020a03811660009081526004602052604090205460ff161515610272576040516104028061092e833901809050604051809103906000f06004600050600083600160a060020a0316815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555060016004600050600083600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555050565b600160a060020a03821660009081526004602052604090205460ff1615156104725760405161040280610d30833901809050604051809103906000f06004600050600084600160a060020a0316815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555060016004600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff021916908302179055505b600160a060020a03828116600090815260046020819052604080518184205460e060020a630a3b0a4f02825286861693820193909352905161010090920490931692630a3b0a4f926024828101939192829003018183876161da5a03f11561000257505050600160a060020a03811660009081526006602052604090208054600160a060020a031916831790555b5050565b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f11561000257505060405151151590506103b957610002565b600254600160a060020a0316ff5b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f11561000257505060405151151590506105d857610002565b600160a060020a03821660009081526004602052604090205460ff1615156106915760405161040280611132833901809050604051809103906000f06004600050600084600160a060020a0316815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555060016004600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff021916908302179055505b600160a060020a03828116600090815260046020819052604080518184205460e060020a630a3b0a4f02825286861693820193909352905161010090920490931692630a3b0a4f926024828101939192829003018183876161da5a03f11561000257505050600160a060020a031660009081526005602052604090208054600160a060020a0319169091179055565b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f115610002575050604051511515905061078357610002565b50600160a060020a0381811660009081526005602090815260408083205490931680835260049091529190205460ff161561080f576040600081812054825160e260020a632e72bafd028152600160a060020a03868116600483015293516101009092049093169263b9caebf4926024828101939192829003018183876161da5a03f115610002575050505b600160a060020a03828116600090815260056020526040812054909116146108545760406000908120600160a060020a0384169091528054600160a060020a03191690555b50600160a060020a0381811660009081526006602090815260408083205490931680835260049091529190205460ff16156108e657600160a060020a038181166000908152604080518183205460e260020a632e72bafd028252868516600483015291516101009092049093169263b9caebf4926024828101939192829003018183876161da5a03f115610002575050505b600160a060020a03828116600090815260066020526040812054909116146105005760406000908120600160a060020a0384169091528054600160a060020a0319169055505056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056",
+ "nonce": "7",
+ "storage": {
+ "0xffc4df2d4f3d2cffad590bed6296406ab7926ca9e74784f74a95191fa069a174": "0x00000000000000000000000070c9217d814985faef62b124420f8dfbddd96433"
+ }
+ },
+ "0xb4fe7aa695b326c9d219158d2ca50db77b39f99f": {
+ "balance": "0x0",
+ "code": "0x606060405236156100ae5760e060020a600035046302d05d3f81146100b65780631ab9075a146100c85780632b68bb2d146101035780634cc927d7146101c557806351a34eb81461028e57806356ccb6f0146103545780635928d37f1461041d578063599efa6b146104e9578063759297bb146105b2578063771d50e11461067e578063a7f4377914610740578063f905c15a1461075e578063f92eb77414610767578063febf661214610836575b610902610002565b610904600054600160a060020a031681565b610902600435600254600160a060020a03166000148015906100f9575060025433600160a060020a03908116911614155b1561092057610002565b60025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b02606452610902916000918291600160a060020a03169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f115610002575050604051511515905061094257610002565b61090260043560243560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610a0d57610002565b61090260043560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610ae957610002565b61090260043560243560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610bbc57610002565b61090260043560243560443560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610c9657610002565b61090260043560243560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610de057610002565b61090260043560243560443560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610ebb57610002565b60025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b02606452610902916000918291600160a060020a03169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f9e57610002565b61090260025433600160a060020a0390811691161461106957610002565b61090e60035481565b61090e60043560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750506040805180517ff92eb774000000000000000000000000000000000000000000000000000000008252600482018790529151919350600160a060020a038416925063f92eb774916024828101926020929190829003018188876161da5a03f11561000257505060405151949350505050565b61090260043560243560443560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f115610002575050604051511515905061107757610002565b005b6060908152602090f35b60408051918252519081900360200190f35b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f5ed61af000000000000000000000000000000000000000000000000000000000825233600160a060020a039081166004840152925190959286169350635ed61af092602483810193919291829003018183876161da5a03f115610002575050505050565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517fab03fc2600000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015260248301899052808816604484015292519095928616935063ab03fc2692606483810193919291829003018183876161da5a03f1156100025750505050505050565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f949ae47900000000000000000000000000000000000000000000000000000000825233600160a060020a0390811660048401526024830188905292519095928616935063949ae47992604483810193919291829003018183876161da5a03f11561000257505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f46d88e7d000000000000000000000000000000000000000000000000000000008252600160a060020a0380891660048401523381166024840152604483018890529251909592861693506346d88e7d92606483810193919291829003018183876161da5a03f1156100025750505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f5315cdde00000000000000000000000000000000000000000000000000000000825233600160a060020a039081166004840152808a16602484015260448301889052925190959286169350635315cdde92606483810193919291829003018183876161da5a03f115610002575050604080517f5928d37f00000000000000000000000000000000000000000000000000000000815233600160a060020a03908116600483015287166024820152604481018690529051635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517fe68e401c00000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015280891660248401526044830188905292519095928616935063e68e401c92606483810193919291829003018183876161da5a03f1156100025750505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f5152f381000000000000000000000000000000000000000000000000000000008252600160a060020a03808a1660048401528089166024840152604483018890523381166064840152925190959286169350635152f38192608483810193919291829003018183876161da5a03f115610002575050505050505050565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f056d447000000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015292519095928616935063056d447092602483810193919291829003018183876161da5a03f115610002575050505050565b600254600160a060020a0316ff5b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f3ae1005c00000000000000000000000000000000000000000000000000000000825233600160a060020a039081166004840152808a166024840152808916604484015260648301889052925190959286169350633ae1005c92608483810193919291829003018183876161da5a03f11561000257505050505050505056",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396"
+ }
+ },
+ "0xc212e03b9e060e36facad5fd8f4435412ca22e6b": {
+ "balance": "0x0",
+ "code": "0x606060405236156101745760e060020a600035046302d05d3f811461017c57806304a7fdbc1461018e5780630e90f957146101fb5780630fb5a6b41461021257806314baa1b61461021b57806317fc45e21461023a5780632b096926146102435780632e94420f1461025b578063325a19f11461026457806336da44681461026d5780633f81a2c01461027f5780633fc306821461029757806345ecd3d7146102d45780634665096d146102dd5780634e71d92d146102e657806351a34eb8146103085780636111bb951461032d5780636f265b93146103445780637e9014e11461034d57806390ba009114610360578063927df5e014610393578063a7f437791461046c578063ad8f50081461046e578063bc6d909414610477578063bdec3ad114610557578063c19d93fb1461059a578063c9503fe2146105ad578063e0a73a93146105b6578063ea71b02d146105bf578063ea8a1af0146105d1578063ee4a96f9146105f3578063f1ff78a01461065c575b61046c610002565b610665600054600160a060020a031681565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600554600090600160a060020a0390811633909116146106a857610002565b61068260015460a060020a900460ff166000145b90565b61069660085481565b61046c600435600154600160a060020a03166000141561072157610002565b610696600d5481565b610696600435600f8160068110156100025750015481565b61069660045481565b61069660035481565b610665600554600160a060020a031681565b61069660043560158160068110156100025750015481565b6106966004355b600b54600f5460009160028202808203928083039290810191018386101561078357601054840186900394505b50505050919050565b61069660025481565b61069660095481565b61046c600554600090600160a060020a03908116339091161461085857610002565b61046c600435600554600090600160a060020a03908116339091161461092e57610002565b6106826001805460a060020a900460ff161461020f565b610696600b5481565b61068260075460a060020a900460ff1681565b6106966004355b600b54601554600091600282028082039280830392908101910183861015610a6c5760165494506102cb565b61046c6004356024356044356040805160015460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b02600483015291516000928392600160a060020a03919091169163e16c7d9891602481810192602092909190829003018187876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610b4657610002565b005b610696600a5481565b61046c60006000600060006000600160009054906101000a9004600160a060020a0316600160a060020a031663e16c7d986040518160e060020a028152600401808060b260020a691858d8dbdd5b9d18dd1b0281526020015060200190506020604051808303816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f1757610002565b61046c5b60015b60058160ff16101561071e57600f6001820160ff166006811015610002578101549060ff83166006811015610002570154101561129057610002565b61069660015460a060020a900460ff1681565b61069660065481565b610696600c5481565b610665600754600160a060020a031681565b61046c600554600090600160a060020a0390811633909116146112c857610002565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600154600090600160a060020a03168114156113fb57610002565b610696600e5481565b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060005b60068160ff16101561070857828160ff166006811015610002576020020151600f60ff831660068110156100025701558160ff82166006811015610002576020020151601560ff831660068110156100025701556001016106ac565b61071061055b565b505050565b600e8054820190555b50565b6040805160015460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061071557610002565b83861015801561079257508286105b156107b457600f546010546011548689039082030291909104900394506102cb565b8286101580156107c55750600b5486105b156107e757600f546011546012548589039082030291909104900394506102cb565b600b5486108015906107f857508186105b1561081d57600b54600f546012546013549289039281039290920204900394506102cb565b81861015801561082c57508086105b1561084e57600f546013546014548489039082030291909104900394506102cb565b60145494506102cb565b60015460a060020a900460ff1660001461087157610002565b600254600a01431161088257610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663771d50e16040518160e060020a0281526004018090506000604051808303816000876161da5a03f1156100025750505050565b60015460a060020a900460ff1660001461094757610002565b600254600a01431161095857610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180517f51a34eb8000000000000000000000000000000000000000000000000000000008252600482018690529151919350600160a060020a03841692506351a34eb8916024808301926000929190829003018183876161da5a03f11561000257505050600b8290554360025560408051838152905130600160a060020a0316917fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff919081900360200190a25050565b838610158015610a7b57508286105b15610a9d576015546016546017548689039082900302919091040194506102cb565b828610158015610aae5750600b5486105b15610ad0576015546017546018548589039082900302919091040194506102cb565b600b548610801590610ae157508186105b15610b0657600b546015546018546019549289039281900392909202040194506102cb565b818610158015610b1557508086105b15610b3757601554601954601a548489039082900302919091040194506102cb565b601a54860181900394506102cb565b60015460a060020a900460ff16600014610b5f57610002565b6001805460a060020a60ff02191660a060020a17908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919450600160a060020a038516925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604080518051600a556005547ffebf661200000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015216602482015260448101879052905163febf661291606480820192600092909190829003018183876161da5a03f115610002575050508215610cc7576007805473ffffffffffffffffffffffffffffffffffffffff191633179055610dbb565b6040805160055460065460e060020a63599efa6b028352600160a060020a039182166004840152602483015291519184169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050604080516006547f56ccb6f000000000000000000000000000000000000000000000000000000000825233600160a060020a03166004830152602482015290516356ccb6f091604480820192600092909190829003018183876161da5a03f115610002575050600580546007805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551633179055505b6007805460a060020a60ff02191660a060020a87810291909117918290556008544301600955900460ff1615610df757600a54610e039061029e565b600a54610e0b90610367565b600c55610e0f565b600c555b600c54670de0b6b3a7640000850204600d55600754600554604080517f759297bb000000000000000000000000000000000000000000000000000000008152600160a060020a039384166004820152918316602483015260448201879052519184169163759297bb91606481810192600092909190829003018183876161da5a03f11561000257505060408051600754600a54600d54600554600c5460a060020a850460ff161515865260208601929092528486019290925260608401529251600160a060020a0391821694509281169230909116917f3b3d1986083d191be01d28623dc19604728e29ae28bdb9ba52757fdee1a18de2919081900360800190a45050505050565b600954431015610f2657610002565b6001805460a060020a900460ff1614610f3e57610002565b6001805460a060020a60ff0219167402000000000000000000000000000000000000000017908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919750600160a060020a038816925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604051516007549095506000945060a060020a900460ff1615905061105c57600a5484111561105757600a54600d54670de0b6b3a7640000918603020492505b61107e565b600a5484101561107e57600a54600d54670de0b6b3a764000091869003020492505b60065483111561108e5760065492505b6006548390039150600083111561111857604080516005546007547f5928d37f000000000000000000000000000000000000000000000000000000008352600160a060020a0391821660048401528116602483015260448201869052915191871691635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505b600082111561117a576040805160055460e060020a63599efa6b028252600160a060020a0390811660048301526024820185905291519187169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050505b6040805185815260208101849052808201859052905130600160a060020a0316917f89e690b1d5aaae14f3e85f108dc92d9ab3763a58d45aed8b59daedbbae8fe794919081900360600190a260008311156112285784600160a060020a0316634cc927d785336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611282565b84600160a060020a0316634cc927d7600a60005054336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f115610002575050505b600054600160a060020a0316ff5b60156001820160ff166006811015610002578101549060ff8316600681101561000257015411156112c057610002565b60010161055e565b60015460a060020a900460ff166000146112e157610002565b600254600a0143116112f257610002565b6001546040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f11561000257505060408051805160055460065460e060020a63599efa6b028452600160a060020a03918216600485015260248401529251909450918416925063599efa6b916044808301926000929190829003018183876161da5a03f1156100025750505080600160a060020a0316632b68bb2d6040518160e060020a0281526004018090506000604051808303816000876161da5a03f115610002575050600054600160a060020a03169050ff5b6001546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602480830192602092919082900301816000876161da5a03f11561000257505060405151151590506106a85761000256",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000006195",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x5842545553440000000000000000000000000000000000000000000000000000",
+ "0x0000000000000000000000000000000000000000000000000000000000000005": "0x00000000000000000000000070c9217d814985faef62b124420f8dfbddd96433",
+ "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000008ac7230489e80000",
+ "0x000000000000000000000000000000000000000000000000000000000000000b": "0x0000000000000000000000000000000000000000000000283c7b9181eca20000"
+ }
+ },
+ "0xcf00ffd997ad14939736f026006498e3f099baaf": {
+ "balance": "0x0",
+ "code": "0x606060405236156100cf5760e060020a600035046302d05d3f81146100d7578063031e7f5d146100e95780631ab9075a1461010b5780632243118a1461014657806327aad68a1461016557806338a699a4146101da5780635188f996146101f8578063581d5d601461021e57806381738c5914610246578063977da54014610269578063a07421ce14610288578063a7f43779146102be578063bdbdb086146102dc578063e1c7111914610303578063f4f2821b14610325578063f905c15a1461034a578063f92eb77414610353575b610387610002565b610389600054600160a060020a031681565b610387600435602435600254600160a060020a0316600014156103a857610002565b610387600435600254600160a060020a031660001480159061013c575060025433600160a060020a03908116911614155b1561042957610002565b610387600435600254600160a060020a03166000141561044b57610002565b6102ac60043560008181526004602081815260408320547f524d81d3000000000000000000000000000000000000000000000000000000006060908152610100909104600160a060020a031692839263524d81d3926064928188876161da5a03f1156100025750506040515192506103819050565b61039c60043560008181526004602052604090205460ff165b919050565b6103876004356024356002546000908190600160a060020a031681141561079457610002565b61038760043560243560025460009081908190600160a060020a031681141561080457610002565b61038960043560008181526004602052604081205460ff1615156109e357610002565b610387600435600254600160a060020a0316600014156109fb57610002565b600435600090815260096020526040902054670de0b6b3a764000090810360243502045b60408051918252519081900360200190f35b61038760025433600160a060020a03908116911614610a9257610002565b600435600090815260086020526040902054670de0b6b3a7640000602435909102046102ac565b610387600435602435600254600160a060020a031660001415610aa057610002565b61038760043560025460009081908190600160a060020a0316811415610b3657610002565b6102ac60035481565b6102ac600435600081815260076020908152604080832054600690925290912054670de0b6b3a76400000204805b50919050565b005b600160a060020a03166060908152602090f35b15156060908152602090f35b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f11561000257505060405151151590506103fe57610002565b60008281526004602052604090205460ff16151561041b57610002565b600860205260406000205550565b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f11561000257505060405151151590506104a157610002565b604080516000838152600460205291909120805460ff1916600117905561040280610de2833901809050604051809103906000f0600460005060008360001916815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555066470de4df8200006008600050600083600019168152602001908152602001600020600050819055506703782dace9d9000060096000506000836000191681526020019081526020016000206000508190555050565b600460005060008560001916815260200190815260200160002060005060000160019054906101000a9004600160a060020a0316915081600160a060020a031663524d81d36040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151821415905061060057838152600660209081526040808320839055600790915281208190555b81600160a060020a0316630a3b0a4f846040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050600160a060020a038316808252600560209081526040808420879055805160e160020a6364a81ff102815290518694670de0b6b3a7640000949363c9503fe29360048181019492939183900301908290876161da5a03f11561000257505060408051805160e060020a636f265b930282529151919291636f265b939160048181019260209290919082900301816000876161da5a03f11561000257505050604051805190602001500204600660005060008660001916815260200190815260200160002060008282825054019250508190555080600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050506040518051906020015060076000506000866000191681526020019081526020016000206000828282505401925050819055505b50505050565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b9060849060209060248187876161da5a03f11561000257505060405151151590506107e957610002565b8381526004602052604081205460ff16151561056657610002565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b9060849060209060248187876161da5a03f115610002575050604051511515905061085957610002565b849250670de0b6b3a764000083600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575060408051805160e160020a6364a81ff102825291519189028590049650600481810192602092909190829003018188876161da5a03f11561000257505060408051805160e060020a636f265b930282529151919291636f265b9391600481810192602092909190829003018189876161da5a03f115610002575050506040518051906020015002049050806006600050600085600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750604080518051855260208681528286208054989098039097557f2e94420f00000000000000000000000000000000000000000000000000000000815290518896600483810193919291829003018187876161da5a03f115610002575050604080515183526020939093525020805490910190555050505050565b60409020546101009004600160a060020a03166101f3565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f1156100025750506040515115159050610a5157610002565b60008181526004602052604090205460ff161515610a6e57610002565b6040600020805474ffffffffffffffffffffffffffffffffffffffffff1916905550565b600254600160a060020a0316ff5b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f1156100025750506040515115159050610af657610002565b60008281526004602052604090205460ff161515610b1357610002565b670de0b6b3a7640000811115610b2857610002565b600960205260406000205550565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b9060849060209060248187876161da5a03f1156100025750506040515115159050610b8b57610002565b600160a060020a038416815260056020908152604080832054808452600490925282205490935060ff161515610bc057610002565b600460005060008460001916815260200190815260200160002060005060000160019054906101000a9004600160a060020a0316915081600160a060020a031663b9caebf4856040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f115610002575050506005600050600085600160a060020a0316815260200190815260200160002060005060009055839050600082600160a060020a031663524d81d36040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050604051519190911115905061078e57670de0b6b3a764000081600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e060020a636f265b930282529151919291636f265b939160048181019260209290919082900301816000876161da5a03f11561000257505050604051805190602001500204600660005060008560001916815260200190815260200160002060008282825054039250508190555080600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050506040518051906020015060076000506000856000191681526020019081526020016000206000828282505403925050819055505050505056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056",
+ "nonce": "3",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "0x3571d73f14f31a1463bd0a2f92f7fde1653d4e1ead7aedf4b0a5df02f16092ab": "0x0000000000000000000000000000000000000000000007d634e4c55188be0000",
+ "0x4e64fe2d1b72d95a0a31945cc6e4f4e524ac5ad56d6bd44a85ec7bc9cc0462c0": "0x000000000000000000000000000000000000000000000002b5e3af16b1880000"
+ }
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "117124093",
+ "extraData": "0xd5830105008650617269747986312e31322e31826d61",
+ "gasLimit": "4707788",
+ "hash": "0xad325e4c49145fb7a4058a68ac741cc8607a71114e23fc88083c7e881dd653e7",
+ "miner": "0x00714b9ac97fd6bd9325a059a70c9b9fa94ce050",
+ "mixHash": "0x0af918f65cb4af04b608fc1f14a849707696986a0e7049e97ef3981808bcc65f",
+ "nonce": "0x38dee147326a8d40",
+ "number": "25000",
+ "stateRoot": "0xc5d6bbcd46236fcdcc80b332ffaaa5476b980b01608f9708408cfef01b58bd5b",
+ "timestamp": "1479891517",
+ "totalDifficulty": "1895410389427"
+ },
+ "input": "0xf88b8206628504a817c8008303d09094c212e03b9e060e36facad5fd8f4435412ca22e6b80a451a34eb80000000000000000000000000000000000000000000000280faf689c35ac00002aa0a7ee5b7877811bf671d121b40569462e722657044808dc1d6c4f1e4233ec145ba0417e7543d52b65738d9df419cbe40a708424f4d54b0fc145c0a64545a2bb1065",
+ "result": {
+ "calls": [
+ {
+ "from": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "gas": "0x31217",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d98636f6e7472616374617069000000000000000000000000000000000000000000",
+ "output": "0x000000000000000000000000b4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "calls": [
+ {
+ "from": "0xb4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "gas": "0x2a68d",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d98636f6e747261637463746c000000000000000000000000000000000000000000",
+ "output": "0x0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "calls": [
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x23ac9",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d98636f6e7472616374646200000000000000000000000000000000000000000000",
+ "output": "0x0000000000000000000000007986bad81f4cbd9317f5a46861437dae58d69113",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x23366",
+ "gasUsed": "0x273",
+ "input": "0x16c66cc6000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x7986bad81f4cbd9317f5a46861437dae58d69113",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0xb4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "gas": "0x29f35",
+ "gasUsed": "0xf8d",
+ "input": "0x16c66cc6000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0xb4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "gas": "0x28a9e",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d98636f6e747261637463746c000000000000000000000000000000000000000000",
+ "output": "0x0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "calls": [
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x21d79",
+ "gasUsed": "0x24d",
+ "input": "0x13bc6d4b000000000000000000000000b4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x2165b",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d986d61726b65746462000000000000000000000000000000000000000000000000",
+ "output": "0x000000000000000000000000cf00ffd997ad14939736f026006498e3f099baaf",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "calls": [
+ {
+ "from": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "gas": "0x1a8e8",
+ "gasUsed": "0x24d",
+ "input": "0x13bc6d4b0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "gas": "0x1a2c6",
+ "gasUsed": "0x3cb",
+ "input": "0xc9503fe2",
+ "output": "0x0000000000000000000000000000000000000000000000008ac7230489e80000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "gas": "0x19b72",
+ "gasUsed": "0x3cb",
+ "input": "0xc9503fe2",
+ "output": "0x0000000000000000000000000000000000000000000000008ac7230489e80000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "gas": "0x19428",
+ "gasUsed": "0x305",
+ "input": "0x6f265b93",
+ "output": "0x0000000000000000000000000000000000000000000000283c7b9181eca20000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "gas": "0x18d45",
+ "gasUsed": "0x229",
+ "input": "0x2e94420f",
+ "output": "0x5842545553440000000000000000000000000000000000000000000000000000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "gas": "0x1734e",
+ "gasUsed": "0x229",
+ "input": "0x2e94420f",
+ "output": "0x5842545553440000000000000000000000000000000000000000000000000000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x20ee1",
+ "gasUsed": "0x5374",
+ "input": "0x581d5d60000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b0000000000000000000000000000000000000000000000280faf689c35ac0000",
+ "output": "0x",
+ "to": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x1b6c1",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d986c6f676d67720000000000000000000000000000000000000000000000000000",
+ "output": "0x0000000000000000000000002a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x1af69",
+ "gasUsed": "0x229",
+ "input": "0x2e94420f",
+ "output": "0x5842545553440000000000000000000000000000000000000000000000000000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "calls": [
+ {
+ "from": "0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "gas": "0x143a5",
+ "gasUsed": "0x24d",
+ "input": "0x13bc6d4b0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x1a91d",
+ "gasUsed": "0x12fa",
+ "input": "0x0accce0600000000000000000000000000000000000000000000000000000000000000025842545553440000000000000000000000000000000000000000000000000000000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "output": "0x",
+ "to": "0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x19177",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d986c6f676d67720000000000000000000000000000000000000000000000000000",
+ "output": "0x0000000000000000000000002a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x18a22",
+ "gasUsed": "0x229",
+ "input": "0x2e94420f",
+ "output": "0x5842545553440000000000000000000000000000000000000000000000000000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x18341",
+ "gasUsed": "0x334",
+ "input": "0xe16c7d986d61726b65746462000000000000000000000000000000000000000000000000",
+ "output": "0x000000000000000000000000cf00ffd997ad14939736f026006498e3f099baaf",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x17bec",
+ "gasUsed": "0x229",
+ "input": "0x2e94420f",
+ "output": "0x5842545553440000000000000000000000000000000000000000000000000000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x1764e",
+ "gasUsed": "0x45c",
+ "input": "0xf92eb7745842545553440000000000000000000000000000000000000000000000000000",
+ "output": "0x00000000000000000000000000000000000000000000002816d180e30c390000",
+ "to": "0xcf00ffd997ad14939736f026006498e3f099baaf",
+ "type": "CALL",
+ "value": "0x0"
+ },
+ {
+ "calls": [
+ {
+ "from": "0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "gas": "0x108ba",
+ "gasUsed": "0x24d",
+ "input": "0x13bc6d4b0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x2cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "gas": "0x16e62",
+ "gasUsed": "0xebb",
+ "input": "0x645a3b72584254555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002816d180e30c390000",
+ "output": "0x",
+ "to": "0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0xb4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "gas": "0x283b9",
+ "gasUsed": "0xc51c",
+ "input": "0x949ae479000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b0000000000000000000000000000000000000000000000280faf689c35ac0000",
+ "output": "0x",
+ "to": "0x3e9286eafa2db8101246c2131c09b49080d00690",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "gas": "0x30b4a",
+ "gasUsed": "0xedb7",
+ "input": "0x51a34eb80000000000000000000000000000000000000000000000280faf689c35ac0000",
+ "output": "0x",
+ "to": "0xb4fe7aa695b326c9d219158d2ca50db77b39f99f",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0x70c9217d814985faef62b124420f8dfbddd96433",
+ "gas": "0x37b38",
+ "gasUsed": "0x12bb3",
+ "input": "0x51a34eb80000000000000000000000000000000000000000000000280faf689c35ac0000",
+ "output": "0x",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_delegatecall.json b/eth/tracers/testdata/call_tracer_delegatecall.json
new file mode 100644
index 000000000..f7ad6df5f
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_delegatecall.json
@@ -0,0 +1,97 @@
+{
+ "context": {
+ "difficulty": "31927752",
+ "gasLimit": "4707788",
+ "miner": "0x5659922ce141eedbc2733678f9806c77b4eebee8",
+ "number": "11495",
+ "timestamp": "1479735917"
+ },
+ "genesis": {
+ "alloc": {
+ "0x13204f5d64c28326fd7bd05fd4ea855302d7f2ff": {
+ "balance": "0x0",
+ "code": "0x606060405236156100825760e060020a60003504630a0313a981146100875780630a3b0a4f146101095780630cd40fea1461021257806329092d0e1461021f5780634cd06a5f146103295780635dbe47e8146103395780637a9e5410146103d9578063825db5f7146103e6578063a820b44d146103f3578063efa52fb31461047a575b610002565b34610002576104fc600435600060006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a26333556e849091846000604051602001526040518360e060020a028152600401808381526020018281526020019250505060206040518083038186803b156100025760325a03f415610002575050604051519150505b919050565b346100025761051060043560006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a2637d65837a9091336000604051602001526040518360e060020a0281526004018083815260200182600160a060020a031681526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515115905061008257604080517f21ce24d4000000000000000000000000000000000000000000000000000000008152600060048201819052600160a060020a038416602483015291517342b02b5deeb78f34cd5ac896473b63e6c99a71a2926321ce24d49260448082019391829003018186803b156100025760325a03f415610002575050505b50565b3461000257610512600181565b346100025761051060043560006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a2637d65837a9091336000604051602001526040518360e060020a0281526004018083815260200182600160a060020a031681526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515115905061008257604080517f89489a87000000000000000000000000000000000000000000000000000000008152600060048201819052600160a060020a038416602483015291517342b02b5deeb78f34cd5ac896473b63e6c99a71a2926389489a879260448082019391829003018186803b156100025760325a03f4156100025750505061020f565b3461000257610528600435610403565b34610002576104fc600435604080516000602091820181905282517f7d65837a00000000000000000000000000000000000000000000000000000000815260048101829052600160a060020a0385166024820152925190927342b02b5deeb78f34cd5ac896473b63e6c99a71a292637d65837a92604480840193829003018186803b156100025760325a03f4156100025750506040515191506101049050565b3461000257610512600c81565b3461000257610512600081565b3461000257610528600061055660005b600060006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a263685a1f3c9091846000604051602001526040518360e060020a028152600401808381526020018281526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515191506101049050565b346100025761053a600435600060006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a263f775b6b59091846000604051602001526040518360e060020a028152600401808381526020018281526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515191506101049050565b604080519115158252519081900360200190f35b005b6040805160ff9092168252519081900360200190f35b60408051918252519081900360200190f35b60408051600160a060020a039092168252519081900360200190f35b90509056",
+ "nonce": "1",
+ "storage": {
+ "0x4d140b25abf3c71052885c66f73ce07cff141c1afabffdaf5cba04d625b7ebcc": "0x0000000000000000000000000000000000000000000000000000000000000001"
+ }
+ },
+ "0x269296dddce321a6bcbaa2f0181127593d732cba": {
+ "balance": "0x0",
+ "code": "0x606060405236156101275760e060020a60003504630cd40fea811461012c578063173825d9146101395780631849cb5a146101c7578063285791371461030f5780632a58b3301461033f5780632cb0d48a146103565780632f54bf6e1461036a578063332b9f061461039d5780633ca8b002146103c55780633df4ddf4146103d557806341c0e1b5146103f457806347799da81461040557806362a51eee1461042457806366907d13146104575780637065cb48146104825780637a9e541014610496578063825db5f7146104a3578063949d225d146104b0578063a51687df146104c7578063b4da4e37146104e6578063b4e6850b146104ff578063bd7474ca14610541578063e75623d814610541578063e9938e1114610555578063f5d241d314610643575b610002565b3461000257610682600181565b34610002576106986004356106ff335b60006001600a9054906101000a9004600160a060020a0316600160a060020a0316635dbe47e8836000604051602001526040518260e060020a0281526004018082600160a060020a03168152602001915050602060405180830381600087803b156100025760325a03f1156100025750506040515191506103989050565b3461000257604080516101008082018352600080835260208084018290528385018290526060808501839052608080860184905260a080870185905260c080880186905260e09788018690526001605060020a0360043581168752600586529589902089519788018a528054808816808a52605060020a91829004600160a060020a0316978a01889052600183015463ffffffff8082169d8c018e905264010000000082048116988c01899052604060020a90910416958a018690526002830154948a01859052600390920154808916938a01849052049096169690970186905293969495949293604080516001605060020a03998a16815297891660208901529590971686860152600160a060020a03909316606086015263ffffffff9182166080860152811660a08501521660c083015260e08201929092529051908190036101000190f35b346100025761069a60043560018054600091829160ff60f060020a909104161515141561063d5761072833610376565b34610002576106ae6004546001605060020a031681565b34610002576106986004356108b333610149565b346100025761069a6004355b600160a060020a03811660009081526002602052604090205460ff1615156001145b919050565b34610002576106986001805460ff60f060020a9091041615151415610913576108ed33610376565b346100025761069a600435610149565b34610002576106ae6003546001605060020a03605060020a9091041681565b346100025761069861091533610149565b34610002576106ae6003546001605060020a0360a060020a9091041681565b346100025761069a60043560243560018054600091829160ff60f060020a909104161515141561095e5761092633610376565b34610002576106986004356001805460ff60f060020a909104161515141561072557610a8b33610376565b3461000257610698600435610aa533610149565b3461000257610682600c81565b3461000257610682600081565b34610002576106ae6003546001605060020a031681565b34610002576106ca600154600160a060020a03605060020a9091041681565b346100025761069a60015460ff60f060020a9091041681565b346100025761069a60043560243560443560643560843560a43560c43560018054600091829160ff60f060020a9091041615151415610b5857610ad233610376565b3461000257610698600435610bd633610149565b34610002576106e6600435604080516101008181018352600080835260208084018290528385018290526060808501839052608080860184905260a080870185905260c080880186905260e09788018690526001605060020a03808b168752600586529589902089519788018a5280548088168952600160a060020a03605060020a918290041696890196909652600181015463ffffffff8082169b8a019b909b5264010000000081048b1695890195909552604060020a90940490981691860182905260028301549086015260039091015480841696850196909652940416918101919091525b50919050565b346100025761069a60043560243560443560643560843560a43560018054600091829160ff60f060020a9091041615151415610c8e57610bfb33610376565b6040805160ff9092168252519081900360200190f35b005b604080519115158252519081900360200190f35b604080516001605060020a039092168252519081900360200190f35b60408051600160a060020a039092168252519081900360200190f35b6040805163ffffffff9092168252519081900360200190f35b1561012757600160a060020a0381166000908152600260205260409020805460ff191690555b50565b1561063d57506001605060020a0380831660009081526005602052604090208054909116151561075b576000915061063d565b604080516101008101825282546001605060020a038082168352600160a060020a03605060020a92839004166020840152600185015463ffffffff80821695850195909552640100000000810485166060850152604060020a90049093166080830152600284015460a0830152600384015480841660c08401520490911660e0820152610817905b8051600354600090819060016001605060020a0390911611610c995760038054605060020a60f060020a0319169055610ddf565b600380546001605060020a031981166000196001605060020a03928316011782558416600090815260056020526040812080547fffff000000000000000000000000000000000000000000000000000000000000168155600181810180546bffffffffffffffffffffffff191690556002820192909255909101805473ffffffffffffffffffffffffffffffffffffffff19169055915061063d565b1561012757600180547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f060020a8302179055610725565b1561091357600480546001605060020a031981166001605060020a039091166001011790555b565b156101275733600160a060020a0316ff5b1561095e57506001605060020a03808416600090815260056020526040902080549091161515610965576000915061095e565b600191505b5092915050565b60038101546001605060020a0384811691161415610986576001915061095e565b604080516101008101825282546001605060020a038082168352600160a060020a03605060020a92839004166020840152600185015463ffffffff80821695850195909552640100000000810485166060850152604060020a90049093166080830152600284015460a0830152600384015480841660c08401520490911660e0820152610a12906107e3565b61095983825b80546003546001605060020a0391821691600091161515610de55760038054605060020a60a060020a031916605060020a84021760a060020a69ffffffffffffffffffff02191660a060020a84021781558301805473ffffffffffffffffffffffffffffffffffffffff19169055610ddf565b1561072557600480546001605060020a0319168217905550565b1561012757600160a060020a0381166000908152600260205260409020805460ff19166001179055610725565b15610b5857506001605060020a038088166000908152600560205260409020805490911615610b645760009150610b58565b6004546001605060020a0390811690891610610b3057600480546001605060020a03191660018a011790555b6003805460016001605060020a03821681016001605060020a03199092169190911790915591505b50979650505050505050565b80546001605060020a0319168817605060020a60f060020a031916605060020a880217815560018101805463ffffffff1916871767ffffffff0000000019166401000000008702176bffffffff00000000000000001916604060020a860217905560028101839055610b048982610a18565b156101275760018054605060020a60f060020a031916605060020a8302179055610725565b15610c8e57506001605060020a03808816600090815260056020526040902080549091161515610c2e5760009150610c8e565b8054605060020a60f060020a031916605060020a88021781556001808201805463ffffffff1916881767ffffffff0000000019166401000000008802176bffffffff00000000000000001916604060020a87021790556002820184905591505b509695505050505050565b6003546001605060020a03848116605060020a909204161415610d095760e084015160038054605060020a928302605060020a60a060020a031990911617808255919091046001605060020a031660009081526005602052604090200180546001605060020a0319169055610ddf565b6003546001605060020a0384811660a060020a909204161415610d825760c08401516003805460a060020a92830260a060020a69ffffffffffffffffffff021990911617808255919091046001605060020a03166000908152600560205260409020018054605060020a60a060020a0319169055610ddf565b505060c082015160e08301516001605060020a0380831660009081526005602052604080822060039081018054605060020a60a060020a031916605060020a8702179055928416825290200180546001605060020a031916831790555b50505050565b6001605060020a0384161515610e6457600380546001605060020a03605060020a9182900481166000908152600560205260409020830180546001605060020a0319908116871790915583548785018054918590049093168402605060020a60a060020a03199182161790911690915582549185029116179055610ddf565b506001605060020a038381166000908152600560205260409020600390810180549185018054605060020a60a060020a0319908116605060020a94859004909516808502959095176001605060020a0319168817909155815416918402919091179055801515610ef4576003805460a060020a69ffffffffffffffffffff02191660a060020a8402179055610ddf565b6003808401546001605060020a03605060020a9091041660009081526005602052604090200180546001605060020a031916831790555050505056",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000001": "0x000113204f5d64c28326fd7bd05fd4ea855302d7f2ff00000000000000000000"
+ }
+ },
+ "0x42b02b5deeb78f34cd5ac896473b63e6c99a71a2": {
+ "balance": "0x0",
+ "code": "0x6504032353da7150606060405236156100695760e060020a60003504631bf7509d811461006e57806321ce24d41461008157806333556e84146100ec578063685a1f3c146101035780637d65837a1461011757806389489a8714610140578063f775b6b5146101fc575b610007565b61023460043560006100fd82600061010d565b610246600435602435600160a060020a03811660009081526020839052604081205415156102cb57826001016000508054806001018281815481835581811511610278576000838152602090206102789181019083015b808211156102d057600081556001016100d8565b610248600435602435600182015481105b92915050565b6102346004356024355b60018101906100fd565b610248600435602435600160a060020a03811660009081526020839052604090205415156100fd565b61024660043560243580600160a060020a031632600160a060020a03161415156101f857600160a060020a038116600090815260208390526040902054156101f857600160a060020a038116600090815260208390526040902054600183018054909160001901908110156100075760009182526020808320909101805473ffffffffffffffffffffffffffffffffffffffff19169055600160a060020a038316825283905260408120556002820180546000190190555b5050565b61025c60043560243560008260010160005082815481101561000757600091825260209091200154600160a060020a03169392505050565b60408051918252519081900360200190f35b005b604080519115158252519081900360200190f35b60408051600160a060020a039092168252519081900360200190f35b50505060009283526020808420909201805473ffffffffffffffffffffffffffffffffffffffff191686179055600160a060020a0385168352908590526040909120819055600284018054600101905590505b505050565b509056",
+ "nonce": "1",
+ "storage": {}
+ },
+ "0xa529806c67cc6486d4d62024471772f47f6fd672": {
+ "balance": "0x67820e39ac8fe9800",
+ "code": "0x",
+ "nonce": "68",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "31912170",
+ "extraData": "0xd783010502846765746887676f312e372e33856c696e7578",
+ "gasLimit": "4712388",
+ "hash": "0x0855914bdc581bccdc62591fd438498386ffb59ea4d5361ed5c3702e26e2c72f",
+ "miner": "0x334391aa808257952a462d1475562ee2106a6c90",
+ "mixHash": "0x64bb70b8ca883cadb8fbbda2c70a861612407864089ed87b98e5de20acceada6",
+ "nonce": "0x684129f283aaef18",
+ "number": "11494",
+ "stateRoot": "0x7057f31fe3dab1d620771adad35224aae43eb70e94861208bc84c557ff5b9d10",
+ "timestamp": "1479735912",
+ "totalDifficulty": "90744064339"
+ },
+ "input": "0xf889448504a817c800832dc6c094269296dddce321a6bcbaa2f0181127593d732cba80a47065cb480000000000000000000000001523e55a1ca4efbae03355775ae89f8d7699ad9e29a080ed81e4c5e9971a730efab4885566e2c868cd80bd4166d0ed8c287fdf181650a069d7c49215e3d4416ad239cd09dbb71b9f04c16b33b385d14f40b618a7a65115",
+ "result": {
+ "calls": [
+ {
+ "calls": [
+ {
+ "from": "0x13204f5d64c28326fd7bd05fd4ea855302d7f2ff",
+ "gas": "0x2bf459",
+ "gasUsed": "0x2aa",
+ "input": "0x7d65837a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a529806c67cc6486d4d62024471772f47f6fd672",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x42b02b5deeb78f34cd5ac896473b63e6c99a71a2",
+ "type": "DELEGATECALL"
+ }
+ ],
+ "from": "0x269296dddce321a6bcbaa2f0181127593d732cba",
+ "gas": "0x2cae73",
+ "gasUsed": "0xa9d",
+ "input": "0x5dbe47e8000000000000000000000000a529806c67cc6486d4d62024471772f47f6fd672",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x13204f5d64c28326fd7bd05fd4ea855302d7f2ff",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "from": "0xa529806c67cc6486d4d62024471772f47f6fd672",
+ "gas": "0x2d6e28",
+ "gasUsed": "0x64bd",
+ "input": "0x7065cb480000000000000000000000001523e55a1ca4efbae03355775ae89f8d7699ad9e",
+ "output": "0x",
+ "to": "0x269296dddce321a6bcbaa2f0181127593d732cba",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json b/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json
new file mode 100644
index 000000000..b8a4cdd23
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json
@@ -0,0 +1,77 @@
+{
+ "context": {
+ "difficulty": "3451177886",
+ "gasLimit": "4709286",
+ "miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
+ "number": "2290744",
+ "timestamp": "1513616439"
+ },
+ "genesis": {
+ "alloc": {
+ "0x1d3ddf7caf024f253487e18bc4a15b1a360c170a": {
+ "balance": "0x0",
+ "code": "0x606060405263ffffffff60e060020a6000350416633b91f50681146100505780635bb47808146100715780635f51fca01461008c578063bc7647a9146100ad578063f1bd0d7a146100c8575b610000565b346100005761006f600160a060020a03600435811690602435166100e9565b005b346100005761006f600160a060020a0360043516610152565b005b346100005761006f600160a060020a036004358116906024351661019c565b005b346100005761006f600160a060020a03600435166101fa565b005b346100005761006f600160a060020a0360043581169060243516610db8565b005b600160a060020a038083166000908152602081905260408120549091908116903316811461011657610000565b839150600160a060020a038316151561012d573392505b6101378284610e2e565b6101418284610db8565b61014a826101fa565b5b5b50505050565b600154600160a060020a03908116903316811461016e57610000565b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b5b5050565b600254600160a060020a0390811690331681146101b857610000565b600160a060020a038381166000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff19169184169190911790555b5b505050565b6040805160e260020a631a481fc102815260016024820181905260026044830152606482015262093a8060848201819052600060a4830181905260c06004840152601e60c48401527f736574456e7469747953746174757328616464726573732c75696e743829000060e484015292519091600160a060020a038516916369207f049161010480820192879290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526000602482018190526001604483015260606004830152602360648301527f626567696e506f6c6c28616464726573732c75696e7436342c626f6f6c2c626f60848301527f6f6c29000000000000000000000000000000000000000000000000000000000060a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152601960c48201527f61646453746f636b28616464726573732c75696e74323536290000000000000060e48201529051600160a060020a03861692506369207f04916101048082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152601960c48201527f697373756553746f636b2875696e74382c75696e74323536290000000000000060e48201529051600160a060020a03861692506369207f04916101048082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152602160648301527f6772616e7453746f636b2875696e74382c75696e743235362c61646472657373608483015260f860020a60290260a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f115610000575050604080517f010555b8000000000000000000000000000000000000000000000000000000008152600160a060020a03338116602483015260006044830181905260606004840152603c60648401527f6772616e7456657374656453746f636b2875696e74382c75696e743235362c6160848401527f6464726573732c75696e7436342c75696e7436342c75696e743634290000000060a48401529251908716935063010555b89260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152601260c48201527f626567696e53616c65286164647265737329000000000000000000000000000060e48201529051600160a060020a03861692506369207f04916101048082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152601a60648301527f7472616e7366657253616c6546756e64732875696e743235362900000000000060848301529151600160a060020a038716935063de64e15c9260a48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152602d60c48201527f7365744163636f756e74696e6753657474696e67732875696e743235362c756960e48201527f6e7436342c75696e7432353629000000000000000000000000000000000000006101048201529051600160a060020a03861692506369207f04916101248082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152603460648301527f637265617465526563757272696e6752657761726428616464726573732c756960848301527f6e743235362c75696e7436342c737472696e672900000000000000000000000060a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152601b60648301527f72656d6f7665526563757272696e675265776172642875696e7429000000000060848301529151600160a060020a038716935063de64e15c9260a48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152602360648301527f697373756552657761726428616464726573732c75696e743235362c7374726960848301527f6e6729000000000000000000000000000000000000000000000000000000000060a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a6337993857028152600160248201819052604482015260606004820152602260648201527f61737369676e53746f636b2875696e74382c616464726573732c75696e743235608482015260f060020a6136290260a48201529051600160a060020a038616925063de64e15c9160c48082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a6337993857028152600160248201819052604482015260606004820152602260648201527f72656d6f766553746f636b2875696e74382c616464726573732c75696e743235608482015260f060020a6136290260a48201529051600160a060020a038616925063de64e15c9160c48082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260026024808301919091526003604483015260006064830181905267ffffffffffffffff8616608484015260ff871660a484015260c0600484015260c48301919091527f7365744164647265737342796c617728737472696e672c616464726573732c6260e48301527f6f6f6c29000000000000000000000000000000000000000000000000000000006101048301529151600160a060020a03871693506369207f04926101248084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc1028152600260248201526003604482015260006064820181905267ffffffffffffffff8516608483015260ff861660a483015260c06004830152602160c48301527f73657453746174757342796c617728737472696e672c75696e74382c626f6f6c60e483015260f860020a6029026101048301529151600160a060020a03871693506369207f04926101248084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc1028152600260248201526003604482015260006064820181905267ffffffffffffffff8516608483015260ff861660a483015260c06004830152603860c48301527f736574566f74696e6742796c617728737472696e672c75696e743235362c756960e48301527f6e743235362c626f6f6c2c75696e7436342c75696e74382900000000000000006101048301529151600160a060020a03871693506369207f04926101248084019391929182900301818387803b156100005760325a03f115610000575050505b505050565b604080517f225553a4000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301526002602483015291519184169163225553a49160448082019260009290919082900301818387803b156100005760325a03f115610000575050505b5050565b600082604051611fd280610f488339600160a060020a03909216910190815260405190819003602001906000f0801561000057905082600160a060020a03166308b027418260016040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b156100005760325a03f115610000575050604080517fa14e3ee300000000000000000000000000000000000000000000000000000000815260006004820181905260016024830152600160a060020a0386811660448401529251928716935063a14e3ee39260648084019382900301818387803b156100005760325a03f115610000575050505b5050505600606060405234620000005760405160208062001fd283398101604052515b805b600a8054600160a060020a031916600160a060020a0383161790555b506001600d819055600e81905560408051808201909152600c8082527f566f74696e672053746f636b00000000000000000000000000000000000000006020928301908152600b805460008290528251601860ff1990911617825590947f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600291831615610100026000190190921604601f0193909304830192906200010c565b828001600101855582156200010c579182015b828111156200010c578251825591602001919060010190620000ef565b5b50620001309291505b808211156200012c576000815560010162000116565b5090565b50506040805180820190915260038082527f43565300000000000000000000000000000000000000000000000000000000006020928301908152600c805460008290528251600660ff1990911617825590937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c760026001841615610100026000190190931692909204601f010481019291620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b5b506200021b9291505b808211156200012c576000815560010162000116565b5090565b50505b505b611da280620002306000396000f3006060604052361561019a5763ffffffff60e060020a600035041662e1986d811461019f57806302a72a4c146101d657806306eb4e421461020157806306fdde0314610220578063095ea7b3146102ad578063158ccb99146102dd57806318160ddd146102f85780631cf65a781461031757806323b872dd146103365780632c71e60a1461036c57806333148fd6146103ca578063435ebc2c146103f55780635eeb6e451461041e578063600e85b71461043c5780636103d70b146104a157806362c1e46a146104b05780636c182e99146104ba578063706dc87c146104f057806370a082311461052557806377174f851461055057806395d89b411461056f578063a7771ee3146105fc578063a9059cbb14610629578063ab377daa14610659578063b25dbb5e14610685578063b89a73cb14610699578063ca5eb5e1146106c6578063cbcf2e5a146106e1578063d21f05ba1461070e578063d347c2051461072d578063d96831e114610765578063dd62ed3e14610777578063df3c211b146107a8578063e2982c21146107d6578063eb944e4c14610801575b610000565b34610000576101d4600160a060020a036004351660243567ffffffffffffffff6044358116906064358116906084351661081f565b005b34610000576101ef600160a060020a0360043516610a30565b60408051918252519081900360200190f35b34610000576101ef610a4f565b60408051918252519081900360200190f35b346100005761022d610a55565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516602435610ae3565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516610b4e565b005b34610000576101ef610b89565b60408051918252519081900360200190f35b34610000576101ef610b8f565b60408051918252519081900360200190f35b34610000576102c9600160a060020a0360043581169060243516604435610b95565b604080519115158252519081900360200190f35b3461000057610388600160a060020a0360043516602435610bb7565b60408051600160a060020a039096168652602086019490945267ffffffffffffffff928316858501529082166060850152166080830152519081900360a00190f35b34610000576101ef600160a060020a0360043516610c21565b60408051918252519081900360200190f35b3461000057610402610c40565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d4600160a060020a0360043516602435610c4f565b005b3461000057610458600160a060020a0360043516602435610cc9565b60408051600160a060020a03909716875260208701959095528585019390935267ffffffffffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b34610000576101d4610d9e565b005b6101d4610e1e565b005b34610000576104d3600160a060020a0360043516610e21565b6040805167ffffffffffffffff9092168252519081900360200190f35b3461000057610402600160a060020a0360043516610ead565b60408051600160a060020a039092168252519081900360200190f35b34610000576101ef600160a060020a0360043516610ef9565b60408051918252519081900360200190f35b34610000576101ef610f18565b60408051918252519081900360200190f35b346100005761022d610f1e565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516610fac565b604080519115158252519081900360200190f35b34610000576102c9600160a060020a0360043516602435610fc2565b604080519115158252519081900360200190f35b3461000057610402600435610fe2565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d46004351515610ffd565b005b34610000576102c9600160a060020a036004351661104c565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516611062565b005b34610000576102c9600160a060020a0360043516611070565b604080519115158252519081900360200190f35b34610000576101ef6110f4565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351667ffffffffffffffff602435166110fa565b60408051918252519081900360200190f35b34610000576101d4600435611121565b005b34610000576101ef600160a060020a03600435811690602435166111c6565b60408051918252519081900360200190f35b34610000576101ef6004356024356044356064356084356111f3565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351661128c565b60408051918252519081900360200190f35b34610000576101d4600160a060020a036004351660243561129e565b005b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff848116908416101561086457610000565b8367ffffffffffffffff168267ffffffffffffffff16101561088557610000565b8267ffffffffffffffff168267ffffffffffffffff1610156108a657610000565b506040805160a081018252600160a060020a033381168252602080830188905267ffffffffffffffff80871684860152858116606085015287166080840152908816600090815260039091529190912080546001810180835582818380158290116109615760030281600302836000526020600020918201910161096191905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050916000526020600020906003020160005b5082518154600160a060020a031916600160a060020a03909116178155602083015160018201556040830151600290910180546060850151608086015167ffffffffffffffff1990921667ffffffffffffffff948516176fffffffffffffffff00000000000000001916604060020a918516919091021777ffffffffffffffff000000000000000000000000000000001916608060020a939091169290920291909117905550610a268686610fc2565b505b505050505050565b600160a060020a0381166000908152600360205260409020545b919050565b60055481565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b600a5433600160a060020a03908116911614610b6957610000565b600a8054600160a060020a031916600160a060020a0383161790555b5b50565b60005481565b60005b90565b6000610ba2848484611600565b610bad8484846116e2565b90505b9392505050565b600360205281600052604060002081815481101561000057906000526020600020906003020160005b5080546001820154600290920154600160a060020a03909116935090915067ffffffffffffffff80821691604060020a8104821691608060020a9091041685565b600160a060020a0381166000908152600860205260409020545b919050565b600a54600160a060020a031681565b600a5433600160a060020a03908116911614610c6a57610000565b610c7660005482611714565b6000908155600160a060020a038316815260016020526040902054610c9b9082611714565b600160a060020a038316600090815260016020526040812091909155610cc390839083611600565b5b5b5050565b6000600060006000600060006000600360008a600160a060020a0316600160a060020a0316815260200190815260200160002088815481101561000057906000526020600020906003020160005b508054600182015460028301546040805160a081018252600160a060020a039094168085526020850184905267ffffffffffffffff808416928601839052604060020a8404811660608701819052608060020a9094041660808601819052909c50929a509197509095509350909150610d90904261172d565b94505b509295509295509295565b33600160a060020a038116600090815260066020526040902054801515610dc457610000565b8030600160a060020a0316311015610ddb57610000565b600160a060020a0382166000818152600660205260408082208290555183156108fc0291849190818181858888f193505050501515610cc357610000565b5b5050565b5b565b600160a060020a03811660009081526003602052604081205442915b81811015610ea557600160a060020a03841660009081526003602052604090208054610e9a9190839081101561000057906000526020600020906003020160005b5060020154604060020a900467ffffffffffffffff168461177d565b92505b600101610e3d565b5b5050919050565b600160a060020a0380821660009081526007602052604081205490911615610eef57600160a060020a0380831660009081526007602052604090205416610ef1565b815b90505b919050565b600160a060020a0381166000908152600160205260409020545b919050565b600d5481565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b60006000610fb983610c21565b1190505b919050565b6000610fcf338484611600565b610fd983836117ac565b90505b92915050565b600460205260009081526040902054600160a060020a031681565b8015801561101a575061100f33610ef9565b61101833610c21565b115b1561102457610000565b33600160a060020a03166000908152600960205260409020805460ff19168215151790555b50565b60006000610fb983610ef9565b1190505b919050565b610b8533826117dc565b5b50565b600a54604080516000602091820181905282517fcbcf2e5a000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015293519194939093169263cbcf2e5a92602480830193919282900301818787803b156100005760325a03f115610000575050604051519150505b919050565b600e5481565b6000610fd961110984846118b2565b61111385856119b6565b611a05565b90505b92915050565b600a5433600160a060020a0390811691161461113c57610000565b61114860005482611a1f565b600055600554600190101561116c57600a5461116c90600160a060020a0316611a47565b5b600a54600160a060020a03166000908152600160205260409020546111929082611a1f565b600a8054600160a060020a039081166000908152600160205260408120939093559054610b8592911683611600565b5b5b50565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b6000600060008487101561120a5760009250611281565b8387111561121a57879250611281565b61123f6112308961122b888a611714565b611a90565b61123a8689611714565b611abc565b915081925061124e8883611714565b905061127e8361127961126a8461122b8c8b611714565b611a90565b61123a888b611714565b611abc565b611a1f565b92505b505095945050505050565b60066020526000908152604090205481565b600160a060020a03821660009081526003602052604081208054829190849081101561000057906000526020600020906003020160005b50805490925033600160a060020a039081169116146112f357610000565b6040805160a0810182528354600160a060020a0316815260018401546020820152600284015467ffffffffffffffff80821693830193909352604060020a810483166060830152608060020a900490911660808201526113539042611af9565b600160a060020a0385166000908152600360205260409020805491925090849081101561000057906000526020600020906003020160005b508054600160a060020a031916815560006001820181905560029091018054600160c060020a0319169055600160a060020a0385168152600360205260409020805460001981019081101561000057906000526020600020906003020160005b50600160a060020a03851660009081526003602052604090208054859081101561000057906000526020600020906003020160005b5081548154600160a060020a031916600160a060020a03918216178255600180840154908301556002928301805493909201805467ffffffffffffffff191667ffffffffffffffff948516178082558354604060020a908190048616026fffffffffffffffff000000000000000019909116178082559254608060020a9081900490941690930277ffffffffffffffff00000000000000000000000000000000199092169190911790915584166000908152600360205260409020805460001981018083559190829080158290116115485760030281600302836000526020600020918201910161154891905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050600160a060020a033316600090815260016020526040902054611570915082611a1f565b600160a060020a03338116600090815260016020526040808220939093559086168152205461159f9082611714565b600160a060020a038086166000818152600160209081526040918290209490945580518581529051339093169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b50505050565b600160a060020a0383161561166e576116466008600061161f86610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611714565b6008600061165386610ead565b600160a060020a031681526020810191909152604001600020555b600160a060020a038216156116dc576116b46008600061168d85610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611a1f565b600860006116c185610ead565b600160a060020a031681526020810191909152604001600020555b5b505050565b600083826116f082426110fa565b8111156116fc57610000565b611707868686611b1b565b92505b5b50509392505050565b600061172283831115611b4d565b508082035b92915050565b6000610fd983602001518367ffffffffffffffff16856080015167ffffffffffffffff16866040015167ffffffffffffffff16876060015167ffffffffffffffff166111f3565b90505b92915050565b60008167ffffffffffffffff168367ffffffffffffffff1610156117a15781610fd9565b825b90505b92915050565b600033826117ba82426110fa565b8111156117c657610000565b6117d08585611b5d565b92505b5b505092915050565b6117e582610ef9565b6117ee83610c21565b11156117f957610000565b600160a060020a03811660009081526009602052604090205460ff16158015611834575081600160a060020a031681600160a060020a031614155b1561183e57610000565b61184782611070565b1561185157610000565b611864828261185f85610ef9565b611600565b600160a060020a0382811660009081526007602052604090208054600160a060020a031916918316918217905561189a82610ead565b600160a060020a031614610cc357610000565b5b5050565b600160a060020a038216600090815260036020526040812054815b818110156119885761197d836112796003600089600160a060020a0316600160a060020a0316815260200190815260200160002084815481101561000057906000526020600020906003020160005b506040805160a0810182528254600160a060020a031681526001830154602082015260029092015467ffffffffffffffff80821692840192909252604060020a810482166060840152608060020a900416608082015287611af9565b611a1f565b92505b6001016118cd565b600160a060020a0385166000908152600160205260409020546117d09084611714565b92505b505092915050565b600060006119c384611070565b80156119d157506000600d54115b90506119fb816119e9576119e485610ef9565b6119ec565b60005b6111138686611b7b565b611a05565b91505b5092915050565b60008183106117a15781610fd9565b825b90505b92915050565b6000828201611a3c848210801590611a375750838210155b611b4d565b8091505b5092915050565b611a508161104c565b15611a5a57610b85565b6005805460009081526004602052604090208054600160a060020a031916600160a060020a038416179055805460010190555b50565b6000828202611a3c841580611a37575083858381156100005704145b611b4d565b8091505b5092915050565b60006000611acc60008411611b4d565b8284811561000057049050611a3c838581156100005706828502018514611b4d565b8091505b5092915050565b6000610fd98360200151611b0d858561172d565b611714565b90505b92915050565b60008382611b2982426110fa565b811115611b3557610000565b611707868686611b8f565b92505b5b50509392505050565b801515610b8557610000565b5b50565b6000611b6883611a47565b610fd98383611c92565b90505b92915050565b6000610fd983610ef9565b90505b92915050565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190611bd09084611a1f565b600160a060020a038086166000908152600160205260408082209390935590871681522054611bff9084611714565b600160a060020a038616600090815260016020526040902055611c228184611714565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b60003382611ca082426110fa565b811115611cac57610000565b6117d08585611cc2565b92505b5b505092915050565b600160a060020a033316600090815260016020526040812054611ce59083611714565b600160a060020a033381166000908152600160205260408082209390935590851681522054611d149083611a1f565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b929150505600a165627a7a72305820bfa5ddd3fecf3f43aed25385ec7ec3ef79638c2e58d99f85d9a3cc494183bf160029a165627a7a723058200e78a5f7e0f91739035d0fbf5eca02f79377210b722f63431f29a22e2880b3bd0029",
+ "nonce": "789",
+ "storage": {
+ "0xfe9ec0542a1c009be8b1f3acf43af97100ffff42eb736850fb038fa1151ad4d9": "0x000000000000000000000000e4a13bc304682a903e9472f469c33801dd18d9e8"
+ }
+ },
+ "0x5cb4a6b902fcb21588c86c3517e797b07cdaadb9": {
+ "balance": "0x0",
+ "code": "0x",
+ "nonce": "0",
+ "storage": {}
+ },
+ "0xe4a13bc304682a903e9472f469c33801dd18d9e8": {
+ "balance": "0x33c763c929f62c4f",
+ "code": "0x",
+ "nonce": "14",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "3451177886",
+ "extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
+ "gasLimit": "4713874",
+ "hash": "0x5d52a672417cd1269bf4f7095e25dcbf837747bba908cd5ef809dc1bd06144b5",
+ "miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
+ "mixHash": "0x01a12845ed546b94a038a7a03e8df8d7952024ed41ccb3db7a7ade4abc290ce1",
+ "nonce": "0x28c446f1cb9748c1",
+ "number": "2290743",
+ "stateRoot": "0x4898aceede76739daef76448a367d10015a2c022c9e7909b99a10fbf6fb16708",
+ "timestamp": "1513616414",
+ "totalDifficulty": "7146523769022564"
+ },
+ "input": "0xf8aa0e8509502f9000830493e0941d3ddf7caf024f253487e18bc4a15b1a360c170a80b8443b91f506000000000000000000000000a14bdd7e5666d784dcce98ad24d383a6b1cd4182000000000000000000000000e4a13bc304682a903e9472f469c33801dd18d9e829a0524564944fa419f5c189b5074044f89210c6d6b2d77ee8f7f12a927d59b636dfa0015b28986807a424b18b186ee6642d76739df36cad802d20e8c00e79a61d7281",
+ "result": {
+ "calls": [
+ {
+ "error": "internal failure",
+ "from": "0x1d3ddf7caf024f253487e18bc4a15b1a360c170a",
+ "gas": "0x39ff0",
+ "gasUsed": "0x39ff0",
+ "input": "0x606060405234620000005760405160208062001fd283398101604052515b805b600a8054600160a060020a031916600160a060020a0383161790555b506001600d819055600e81905560408051808201909152600c8082527f566f74696e672053746f636b00000000000000000000000000000000000000006020928301908152600b805460008290528251601860ff1990911617825590947f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600291831615610100026000190190921604601f0193909304830192906200010c565b828001600101855582156200010c579182015b828111156200010c578251825591602001919060010190620000ef565b5b50620001309291505b808211156200012c576000815560010162000116565b5090565b50506040805180820190915260038082527f43565300000000000000000000000000000000000000000000000000000000006020928301908152600c805460008290528251600660ff1990911617825590937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c760026001841615610100026000190190931692909204601f010481019291620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b5b506200021b9291505b808211156200012c576000815560010162000116565b5090565b50505b505b611da280620002306000396000f3006060604052361561019a5763ffffffff60e060020a600035041662e1986d811461019f57806302a72a4c146101d657806306eb4e421461020157806306fdde0314610220578063095ea7b3146102ad578063158ccb99146102dd57806318160ddd146102f85780631cf65a781461031757806323b872dd146103365780632c71e60a1461036c57806333148fd6146103ca578063435ebc2c146103f55780635eeb6e451461041e578063600e85b71461043c5780636103d70b146104a157806362c1e46a146104b05780636c182e99146104ba578063706dc87c146104f057806370a082311461052557806377174f851461055057806395d89b411461056f578063a7771ee3146105fc578063a9059cbb14610629578063ab377daa14610659578063b25dbb5e14610685578063b89a73cb14610699578063ca5eb5e1146106c6578063cbcf2e5a146106e1578063d21f05ba1461070e578063d347c2051461072d578063d96831e114610765578063dd62ed3e14610777578063df3c211b146107a8578063e2982c21146107d6578063eb944e4c14610801575b610000565b34610000576101d4600160a060020a036004351660243567ffffffffffffffff6044358116906064358116906084351661081f565b005b34610000576101ef600160a060020a0360043516610a30565b60408051918252519081900360200190f35b34610000576101ef610a4f565b60408051918252519081900360200190f35b346100005761022d610a55565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516602435610ae3565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516610b4e565b005b34610000576101ef610b89565b60408051918252519081900360200190f35b34610000576101ef610b8f565b60408051918252519081900360200190f35b34610000576102c9600160a060020a0360043581169060243516604435610b95565b604080519115158252519081900360200190f35b3461000057610388600160a060020a0360043516602435610bb7565b60408051600160a060020a039096168652602086019490945267ffffffffffffffff928316858501529082166060850152166080830152519081900360a00190f35b34610000576101ef600160a060020a0360043516610c21565b60408051918252519081900360200190f35b3461000057610402610c40565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d4600160a060020a0360043516602435610c4f565b005b3461000057610458600160a060020a0360043516602435610cc9565b60408051600160a060020a03909716875260208701959095528585019390935267ffffffffffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b34610000576101d4610d9e565b005b6101d4610e1e565b005b34610000576104d3600160a060020a0360043516610e21565b6040805167ffffffffffffffff9092168252519081900360200190f35b3461000057610402600160a060020a0360043516610ead565b60408051600160a060020a039092168252519081900360200190f35b34610000576101ef600160a060020a0360043516610ef9565b60408051918252519081900360200190f35b34610000576101ef610f18565b60408051918252519081900360200190f35b346100005761022d610f1e565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516610fac565b604080519115158252519081900360200190f35b34610000576102c9600160a060020a0360043516602435610fc2565b604080519115158252519081900360200190f35b3461000057610402600435610fe2565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d46004351515610ffd565b005b34610000576102c9600160a060020a036004351661104c565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516611062565b005b34610000576102c9600160a060020a0360043516611070565b604080519115158252519081900360200190f35b34610000576101ef6110f4565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351667ffffffffffffffff602435166110fa565b60408051918252519081900360200190f35b34610000576101d4600435611121565b005b34610000576101ef600160a060020a03600435811690602435166111c6565b60408051918252519081900360200190f35b34610000576101ef6004356024356044356064356084356111f3565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351661128c565b60408051918252519081900360200190f35b34610000576101d4600160a060020a036004351660243561129e565b005b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff848116908416101561086457610000565b8367ffffffffffffffff168267ffffffffffffffff16101561088557610000565b8267ffffffffffffffff168267ffffffffffffffff1610156108a657610000565b506040805160a081018252600160a060020a033381168252602080830188905267ffffffffffffffff80871684860152858116606085015287166080840152908816600090815260039091529190912080546001810180835582818380158290116109615760030281600302836000526020600020918201910161096191905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050916000526020600020906003020160005b5082518154600160a060020a031916600160a060020a03909116178155602083015160018201556040830151600290910180546060850151608086015167ffffffffffffffff1990921667ffffffffffffffff948516176fffffffffffffffff00000000000000001916604060020a918516919091021777ffffffffffffffff000000000000000000000000000000001916608060020a939091169290920291909117905550610a268686610fc2565b505b505050505050565b600160a060020a0381166000908152600360205260409020545b919050565b60055481565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b600a5433600160a060020a03908116911614610b6957610000565b600a8054600160a060020a031916600160a060020a0383161790555b5b50565b60005481565b60005b90565b6000610ba2848484611600565b610bad8484846116e2565b90505b9392505050565b600360205281600052604060002081815481101561000057906000526020600020906003020160005b5080546001820154600290920154600160a060020a03909116935090915067ffffffffffffffff80821691604060020a8104821691608060020a9091041685565b600160a060020a0381166000908152600860205260409020545b919050565b600a54600160a060020a031681565b600a5433600160a060020a03908116911614610c6a57610000565b610c7660005482611714565b6000908155600160a060020a038316815260016020526040902054610c9b9082611714565b600160a060020a038316600090815260016020526040812091909155610cc390839083611600565b5b5b5050565b6000600060006000600060006000600360008a600160a060020a0316600160a060020a0316815260200190815260200160002088815481101561000057906000526020600020906003020160005b508054600182015460028301546040805160a081018252600160a060020a039094168085526020850184905267ffffffffffffffff808416928601839052604060020a8404811660608701819052608060020a9094041660808601819052909c50929a509197509095509350909150610d90904261172d565b94505b509295509295509295565b33600160a060020a038116600090815260066020526040902054801515610dc457610000565b8030600160a060020a0316311015610ddb57610000565b600160a060020a0382166000818152600660205260408082208290555183156108fc0291849190818181858888f193505050501515610cc357610000565b5b5050565b5b565b600160a060020a03811660009081526003602052604081205442915b81811015610ea557600160a060020a03841660009081526003602052604090208054610e9a9190839081101561000057906000526020600020906003020160005b5060020154604060020a900467ffffffffffffffff168461177d565b92505b600101610e3d565b5b5050919050565b600160a060020a0380821660009081526007602052604081205490911615610eef57600160a060020a0380831660009081526007602052604090205416610ef1565b815b90505b919050565b600160a060020a0381166000908152600160205260409020545b919050565b600d5481565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b60006000610fb983610c21565b1190505b919050565b6000610fcf338484611600565b610fd983836117ac565b90505b92915050565b600460205260009081526040902054600160a060020a031681565b8015801561101a575061100f33610ef9565b61101833610c21565b115b1561102457610000565b33600160a060020a03166000908152600960205260409020805460ff19168215151790555b50565b60006000610fb983610ef9565b1190505b919050565b610b8533826117dc565b5b50565b600a54604080516000602091820181905282517fcbcf2e5a000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015293519194939093169263cbcf2e5a92602480830193919282900301818787803b156100005760325a03f115610000575050604051519150505b919050565b600e5481565b6000610fd961110984846118b2565b61111385856119b6565b611a05565b90505b92915050565b600a5433600160a060020a0390811691161461113c57610000565b61114860005482611a1f565b600055600554600190101561116c57600a5461116c90600160a060020a0316611a47565b5b600a54600160a060020a03166000908152600160205260409020546111929082611a1f565b600a8054600160a060020a039081166000908152600160205260408120939093559054610b8592911683611600565b5b5b50565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b6000600060008487101561120a5760009250611281565b8387111561121a57879250611281565b61123f6112308961122b888a611714565b611a90565b61123a8689611714565b611abc565b915081925061124e8883611714565b905061127e8361127961126a8461122b8c8b611714565b611a90565b61123a888b611714565b611abc565b611a1f565b92505b505095945050505050565b60066020526000908152604090205481565b600160a060020a03821660009081526003602052604081208054829190849081101561000057906000526020600020906003020160005b50805490925033600160a060020a039081169116146112f357610000565b6040805160a0810182528354600160a060020a0316815260018401546020820152600284015467ffffffffffffffff80821693830193909352604060020a810483166060830152608060020a900490911660808201526113539042611af9565b600160a060020a0385166000908152600360205260409020805491925090849081101561000057906000526020600020906003020160005b508054600160a060020a031916815560006001820181905560029091018054600160c060020a0319169055600160a060020a0385168152600360205260409020805460001981019081101561000057906000526020600020906003020160005b50600160a060020a03851660009081526003602052604090208054859081101561000057906000526020600020906003020160005b5081548154600160a060020a031916600160a060020a03918216178255600180840154908301556002928301805493909201805467ffffffffffffffff191667ffffffffffffffff948516178082558354604060020a908190048616026fffffffffffffffff000000000000000019909116178082559254608060020a9081900490941690930277ffffffffffffffff00000000000000000000000000000000199092169190911790915584166000908152600360205260409020805460001981018083559190829080158290116115485760030281600302836000526020600020918201910161154891905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050600160a060020a033316600090815260016020526040902054611570915082611a1f565b600160a060020a03338116600090815260016020526040808220939093559086168152205461159f9082611714565b600160a060020a038086166000818152600160209081526040918290209490945580518581529051339093169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b50505050565b600160a060020a0383161561166e576116466008600061161f86610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611714565b6008600061165386610ead565b600160a060020a031681526020810191909152604001600020555b600160a060020a038216156116dc576116b46008600061168d85610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611a1f565b600860006116c185610ead565b600160a060020a031681526020810191909152604001600020555b5b505050565b600083826116f082426110fa565b8111156116fc57610000565b611707868686611b1b565b92505b5b50509392505050565b600061172283831115611b4d565b508082035b92915050565b6000610fd983602001518367ffffffffffffffff16856080015167ffffffffffffffff16866040015167ffffffffffffffff16876060015167ffffffffffffffff166111f3565b90505b92915050565b60008167ffffffffffffffff168367ffffffffffffffff1610156117a15781610fd9565b825b90505b92915050565b600033826117ba82426110fa565b8111156117c657610000565b6117d08585611b5d565b92505b5b505092915050565b6117e582610ef9565b6117ee83610c21565b11156117f957610000565b600160a060020a03811660009081526009602052604090205460ff16158015611834575081600160a060020a031681600160a060020a031614155b1561183e57610000565b61184782611070565b1561185157610000565b611864828261185f85610ef9565b611600565b600160a060020a0382811660009081526007602052604090208054600160a060020a031916918316918217905561189a82610ead565b600160a060020a031614610cc357610000565b5b5050565b600160a060020a038216600090815260036020526040812054815b818110156119885761197d836112796003600089600160a060020a0316600160a060020a0316815260200190815260200160002084815481101561000057906000526020600020906003020160005b506040805160a0810182528254600160a060020a031681526001830154602082015260029092015467ffffffffffffffff80821692840192909252604060020a810482166060840152608060020a900416608082015287611af9565b611a1f565b92505b6001016118cd565b600160a060020a0385166000908152600160205260409020546117d09084611714565b92505b505092915050565b600060006119c384611070565b80156119d157506000600d54115b90506119fb816119e9576119e485610ef9565b6119ec565b60005b6111138686611b7b565b611a05565b91505b5092915050565b60008183106117a15781610fd9565b825b90505b92915050565b6000828201611a3c848210801590611a375750838210155b611b4d565b8091505b5092915050565b611a508161104c565b15611a5a57610b85565b6005805460009081526004602052604090208054600160a060020a031916600160a060020a038416179055805460010190555b50565b6000828202611a3c841580611a37575083858381156100005704145b611b4d565b8091505b5092915050565b60006000611acc60008411611b4d565b8284811561000057049050611a3c838581156100005706828502018514611b4d565b8091505b5092915050565b6000610fd98360200151611b0d858561172d565b611714565b90505b92915050565b60008382611b2982426110fa565b811115611b3557610000565b611707868686611b8f565b92505b5b50509392505050565b801515610b8557610000565b5b50565b6000611b6883611a47565b610fd98383611c92565b90505b92915050565b6000610fd983610ef9565b90505b92915050565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190611bd09084611a1f565b600160a060020a038086166000908152600160205260408082209390935590871681522054611bff9084611714565b600160a060020a038616600090815260016020526040902055611c228184611714565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b60003382611ca082426110fa565b811115611cac57610000565b6117d08585611cc2565b92505b5b505092915050565b600160a060020a033316600090815260016020526040812054611ce59083611714565b600160a060020a033381166000908152600160205260408082209390935590851681522054611d149083611a1f565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b929150505600a165627a7a72305820bfa5ddd3fecf3f43aed25385ec7ec3ef79638c2e58d99f85d9a3cc494183bf160029000000000000000000000000a14bdd7e5666d784dcce98ad24d383a6b1cd4182",
+ "type": "CREATE",
+ "value": "0x0"
+ }
+ ],
+ "error": "invalid jump destination (PUSH1) 0",
+ "from": "0xe4a13bc304682a903e9472f469c33801dd18d9e8",
+ "gas": "0x435c8",
+ "gasUsed": "0x435c8",
+ "input": "0x3b91f506000000000000000000000000a14bdd7e5666d784dcce98ad24d383a6b1cd4182000000000000000000000000e4a13bc304682a903e9472f469c33801dd18d9e8",
+ "to": "0x1d3ddf7caf024f253487e18bc4a15b1a360c170a",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_inner_throw_outer_revert.json b/eth/tracers/testdata/call_tracer_inner_throw_outer_revert.json
new file mode 100644
index 000000000..edd80e5b8
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_inner_throw_outer_revert.json
@@ -0,0 +1,81 @@
+{
+ "context": {
+ "difficulty": "3956606365",
+ "gasLimit": "5413248",
+ "miner": "0x00d8ae40d9a06d0e7a2877b62e32eb959afbe16d",
+ "number": "2295104",
+ "timestamp": "1513681256"
+ },
+ "genesis": {
+ "alloc": {
+ "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76": {
+ "balance": "0x0",
+ "code": "0x60606040526004361061015e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680625b4487146101a257806311df9995146101cb578063278ecde11461022057806330adce0e146102435780633197cbb61461026c5780634bb278f3146102955780636103d70b146102aa57806363a599a4146102bf5780636a2d1cb8146102d457806375f12b21146102fd57806378e979251461032a578063801db9cc1461035357806386d1a69f1461037c5780638da5cb5b146103915780638ef26a71146103e65780639890220b1461040f5780639b39caef14610424578063b85dfb801461044d578063be9a6555146104a1578063ccb07cef146104b6578063d06c91e4146104e3578063d669e1d414610538578063df40503c14610561578063e2982c2114610576578063f02e030d146105c3578063f2fde38b146105d8578063f3283fba14610611575b600060149054906101000a900460ff1615151561017a57600080fd5b60075442108061018b575060085442115b15151561019757600080fd5b6101a03361064a565b005b34156101ad57600080fd5b6101b5610925565b6040518082815260200191505060405180910390f35b34156101d657600080fd5b6101de61092b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561022b57600080fd5b6102416004808035906020019091905050610951565b005b341561024e57600080fd5b610256610c48565b6040518082815260200191505060405180910390f35b341561027757600080fd5b61027f610c4e565b6040518082815260200191505060405180910390f35b34156102a057600080fd5b6102a8610c54565b005b34156102b557600080fd5b6102bd610f3e565b005b34156102ca57600080fd5b6102d261105d565b005b34156102df57600080fd5b6102e76110d5565b6040518082815260200191505060405180910390f35b341561030857600080fd5b6103106110e1565b604051808215151515815260200191505060405180910390f35b341561033557600080fd5b61033d6110f4565b6040518082815260200191505060405180910390f35b341561035e57600080fd5b6103666110fa565b6040518082815260200191505060405180910390f35b341561038757600080fd5b61038f611104565b005b341561039c57600080fd5b6103a4611196565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f157600080fd5b6103f96111bb565b6040518082815260200191505060405180910390f35b341561041a57600080fd5b6104226111c1565b005b341561042f57600080fd5b610437611296565b6040518082815260200191505060405180910390f35b341561045857600080fd5b610484600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061129c565b604051808381526020018281526020019250505060405180910390f35b34156104ac57600080fd5b6104b46112c0565b005b34156104c157600080fd5b6104c9611341565b604051808215151515815260200191505060405180910390f35b34156104ee57600080fd5b6104f6611354565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561054357600080fd5b61054b61137a565b6040518082815260200191505060405180910390f35b341561056c57600080fd5b610574611385565b005b341561058157600080fd5b6105ad600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116c3565b6040518082815260200191505060405180910390f35b34156105ce57600080fd5b6105d66116db565b005b34156105e357600080fd5b61060f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611829565b005b341561061c57600080fd5b610648600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118fe565b005b600080670de0b6b3a7640000341015151561066457600080fd5b61069b610696670de0b6b3a7640000610688610258346119d990919063ffffffff16565b611a0c90919063ffffffff16565b611a27565b9150660221b262dd80006106ba60065484611a7e90919063ffffffff16565b111515156106c757600080fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156107d557600080fd5b6102c65a03f115156107e657600080fd5b5050506040518051905050610808828260010154611a7e90919063ffffffff16565b8160010181905550610827348260000154611a7e90919063ffffffff16565b816000018190555061084434600554611a7e90919063ffffffff16565b60058190555061085f82600654611a7e90919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167ff3c1c7c0eb1328ddc834c4c9e579c06d35f443bf1102b034653624a239c7a40c836040518082815260200191505060405180910390a27fd1dc370699ae69fb860ed754789a4327413ec1cd379b93f2cbedf449a26b0e8583600554604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050565b60025481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060085442108061096b5750651b48eb57e00060065410155b15151561097757600080fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154821415156109c757600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610ac857600080fd5b6102c65a03f11515610ad957600080fd5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b7d57600080fd5b6102c65a03f11515610b8e57600080fd5b505050604051805190501515610ba357600080fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000811115610c4457610c433382611a9c565b5b5050565b60055481565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cb157600080fd5b600854421015610cd357660221b262dd8000600654141515610cd257600080fd5b5b651b48eb57e000600654108015610cf057506213c6806008540142105b151515610cfc57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501515610d7557600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610e3a57600080fd5b6102c65a03f11515610e4b57600080fd5b5050506040518051905090506000811115610f2057600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610ef957600080fd5b6102c65a03f11515610f0a57600080fd5b505050604051805190501515610f1f57600080fd5b5b6001600960006101000a81548160ff02191690831515021790555050565b600080339150600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114151515610f9657600080fd5b803073ffffffffffffffffffffffffffffffffffffffff163110151515610fbc57600080fd5b610fd181600254611b5090919063ffffffff16565b6002819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561105957fe5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110b857600080fd5b6001600060146101000a81548160ff021916908315150217905550565b670de0b6b3a764000081565b600060149054906101000a900460ff1681565b60075481565b651b48eb57e00081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561115f57600080fd5b600060149054906101000a900460ff16151561117a57600080fd5b60008060146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121c57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561129457600080fd5b565b61025881565b600a6020528060005260406000206000915090508060000154908060010154905082565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561131b57600080fd5b600060075414151561132c57600080fd5b4260078190555062278d004201600881905550565b600960009054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b660221b262dd800081565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113e557600080fd5b600654660221b262dd800003925061142b670de0b6b3a764000061141c610258670de0b6b3a76400006119d990919063ffffffff16565b81151561142557fe5b04611a27565b915081831115151561143c57600080fd5b600a60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561158c57600080fd5b6102c65a03f1151561159d57600080fd5b50505060405180519050506115bf838260010154611a7e90919063ffffffff16565b81600101819055506115dc83600654611a7e90919063ffffffff16565b6006819055503073ffffffffffffffffffffffffffffffffffffffff167ff3c1c7c0eb1328ddc834c4c9e579c06d35f443bf1102b034653624a239c7a40c846040518082815260200191505060405180910390a27fd1dc370699ae69fb860ed754789a4327413ec1cd379b93f2cbedf449a26b0e856000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600554604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050565b60016020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561181357600080fd5b6102c65a03f1151561182457600080fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156118fb57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561195957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561199557600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080828402905060008414806119fa57508284828115156119f757fe5b04145b1515611a0257fe5b8091505092915050565b6000808284811515611a1a57fe5b0490508091505092915050565b6000611a416202a300600754611a7e90919063ffffffff16565b421015611a7557611a6e611a5f600584611a0c90919063ffffffff16565b83611a7e90919063ffffffff16565b9050611a79565b8190505b919050565b6000808284019050838110151515611a9257fe5b8091505092915050565b611aee81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7e90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b4681600254611a7e90919063ffffffff16565b6002819055505050565b6000828211151515611b5e57fe5b8183039050929150505600a165627a7a72305820ec0d82a406896ccf20989b3d6e650abe4dc104e400837f1f58e67ef499493ae90029",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000008d69d00910d0b2afb2a99ed6c16c8129fa8e1751",
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000e819f024b41358d2c08e3a868a5c5dd0566078d4",
+ "0x0000000000000000000000000000000000000000000000000000000000000007": "0x000000000000000000000000000000000000000000000000000000005a388981",
+ "0x0000000000000000000000000000000000000000000000000000000000000008": "0x000000000000000000000000000000000000000000000000000000005a3b38e6"
+ }
+ },
+ "0xd4fcab9f0a6dc0493af47c864f6f17a8a5e2e826": {
+ "balance": "0x2a2dd979a35cf000",
+ "code": "0x",
+ "nonce": "0",
+ "storage": {}
+ },
+ "0xe819f024b41358d2c08e3a868a5c5dd0566078d4": {
+ "balance": "0x0",
+ "code": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d0578063313ce5671461024957806342966c681461027257806370a08231146102ad5780638da5cb5b146102fa57806395d89b411461034f578063a9059cbb146103dd578063dd62ed3e14610437578063f2fde38b146104a3575b600080fd5b34156100ca57600080fd5b6100d26104dc565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610515565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba61069c565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506106a2565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b61025c610952565b6040518082815260200191505060405180910390f35b341561027d57600080fd5b6102936004808035906020019091905050610957565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610abe565b6040518082815260200191505060405180910390f35b341561030557600080fd5b61030d610b07565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035a57600080fd5b610362610b2d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103a2578082015181840152602081019050610387565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103e857600080fd5b61041d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b66565b604051808215151515815260200191505060405180910390f35b341561044257600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d01565b6040518082815260200191505060405180910390f35b34156104ae57600080fd5b6104da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d88565b005b6040805190810160405280600b81526020017f416c6c436f6465436f696e00000000000000000000000000000000000000000081525081565b6000808214806105a157506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15156105ac57600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b600080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061077683600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e5f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061080b83600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e7d90919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506108618382610e7d90919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b600681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b557600080fd5b610a0782600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e7d90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a5f82600054610e7d90919063ffffffff16565b60008190555060003373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600481526020017f414c4c430000000000000000000000000000000000000000000000000000000081525081565b6000610bba82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e7d90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610c4f82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e5f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610de457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e5c5780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000808284019050838110151515610e7357fe5b8091505092915050565b6000828211151515610e8b57fe5b8183039050929150505600a165627a7a7230582059f3ea3df0b054e9ab711f37969684ba83fe38f255ffe2c8d850d951121c51100029",
+ "nonce": "1",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "3956606365",
+ "extraData": "0x566961425443",
+ "gasLimit": "5418523",
+ "hash": "0x6f37eb930a25da673ea1bb80fd9e32ddac19cdf7cd4bb2eac62cc13598624077",
+ "miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
+ "mixHash": "0x10971cde68c587c750c23b8589ae868ce82c2c646636b97e7d9856470c5297c7",
+ "nonce": "0x810f923ff4b450a1",
+ "number": "2295103",
+ "stateRoot": "0xff403612573d76dfdaf4fea2429b77dbe9764021ae0e38dc8ac79a3cf551179e",
+ "timestamp": "1513681246",
+ "totalDifficulty": "7162347056825919"
+ },
+ "input": "0xf86d808504e3b292008307dfa69433056b5dcac09a9b4becad0e1dcf92c19bd0af76880e92596fd62900008029a0e5f27bb66431f7081bb7f1f242003056d7f3f35414c352cd3d1848b52716dac2a07d0be78980edb0bd2a0678fc53aa90ea9558ce346b0d947967216918ac74ccea",
+ "result": {
+ "calls": [
+ {
+ "error": "invalid opcode 0xfe",
+ "from": "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76",
+ "gas": "0x75fe3",
+ "gasUsed": "0x75fe3",
+ "input": "0xa9059cbb000000000000000000000000d4fcab9f0a6dc0493af47c864f6f17a8a5e2e82600000000000000000000000000000000000000000000000000000000000002f4",
+ "to": "0xe819f024b41358d2c08e3a868a5c5dd0566078d4",
+ "type": "CALL",
+ "value": "0x0"
+ }
+ ],
+ "error": "execution reverted",
+ "from": "0xd4fcab9f0a6dc0493af47c864f6f17a8a5e2e826",
+ "gas": "0x78d9e",
+ "gasUsed": "0x76fc0",
+ "input": "0x",
+ "to": "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76",
+ "type": "CALL",
+ "value": "0xe92596fd6290000"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_oog.json b/eth/tracers/testdata/call_tracer_oog.json
new file mode 100644
index 000000000..de4fed6ab
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_oog.json
@@ -0,0 +1,60 @@
+{
+ "context": {
+ "difficulty": "3699098917",
+ "gasLimit": "5258985",
+ "miner": "0xd049bfd667cb46aa3ef5df0da3e57db3be39e511",
+ "number": "2294631",
+ "timestamp": "1513675366"
+ },
+ "genesis": {
+ "alloc": {
+ "0x43064693d3d38ad6a7cb579e0d6d9718c8aa6b62": {
+ "balance": "0x0",
+ "code": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d0578063313ce5671461024957806342966c68146102785780635a3b7e42146102b357806370a082311461034157806379cc67901461038e57806395d89b41146103e8578063a9059cbb14610476578063dd62ed3e146104b8575b600080fd5b34156100ca57600080fd5b6100d2610524565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061055d565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba6105ea565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f0565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b61025c610910565b604051808260ff1660ff16815260200191505060405180910390f35b341561028357600080fd5b6102996004808035906020019091905050610915565b604051808215151515815260200191505060405180910390f35b34156102be57600080fd5b6102c6610a18565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103065780820151818401526020810190506102eb565b50505050905090810190601f1680156103335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a51565b6040518082815260200191505060405180910390f35b341561039957600080fd5b6103ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a69565b604051808215151515815260200191505060405180910390f35b34156103f357600080fd5b6103fb610bf8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561043b578082015181840152602081019050610420565b50505050905090810190601f1680156104685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561048157600080fd5b6104b6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c31565b005b34156104c357600080fd5b61050e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e34565b6040518082815260200191505060405180910390f35b6040805190810160405280600881526020017f446f70616d696e6500000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001905092915050565b60005481565b6000808373ffffffffffffffffffffffffffffffffffffffff161415151561061757600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561066557600080fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401101515156106f157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561077c57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561096557600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160008082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a260019050919050565b6040805190810160405280600981526020017f446f706d6e20302e32000000000000000000000000000000000000000000000081525081565b60016020528060005260406000206000915090505481565b600081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610ab957600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610b4457600080fd5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160008082825403925050819055508273ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a26001905092915050565b6040805190810160405280600581526020017f444f504d4e00000000000000000000000000000000000000000000000000000081525081565b60008273ffffffffffffffffffffffffffffffffffffffff1614151515610c5757600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610ca557600080fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110151515610d3157fe5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60026020528160005260406000206020528060005260406000206000915091505054815600a165627a7a723058206d93424f4e7b11929b8276a269038402c10c0ddf21800e999916ddd9dff4a7630029",
+ "nonce": "1",
+ "storage": {
+ "0x296b66049cc4f9c8bf3d4f14752add261d1a980b39bdd194a7897baf39ac7579": "0x0000000000000000000000000000000000000000033b2e3c9fc9653f9e72b1e0"
+ }
+ },
+ "0x94194bc2aaf494501d7880b61274a169f6502a54": {
+ "balance": "0xea8c39a876d19888d",
+ "code": "0x",
+ "nonce": "265",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "3699098917",
+ "extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
+ "gasLimit": "5263953",
+ "hash": "0x03a0f62a8106793dafcfae7b75fd2654322062d585a19cea568314d7205790dc",
+ "miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
+ "mixHash": "0x15482cc64b7c00a947f5bf015dfc010db1a6a668c74df61974d6a7848c174408",
+ "nonce": "0xd1bdb150f6fd170e",
+ "number": "2294630",
+ "stateRoot": "0x1ab1a534e84cc787cda1db21e0d5920ab06017948075b759166cfea7274657a1",
+ "timestamp": "1513675347",
+ "totalDifficulty": "7160543502214733"
+ },
+ "input": "0xf8ab820109855d21dba00082ca1d9443064693d3d38ad6a7cb579e0d6d9718c8aa6b6280b844a9059cbb000000000000000000000000e77b1ac803616503510bed0086e3a7be2627a69900000000000000000000000000000000000000000000000000000009502f90001ba0ce3ad83f5530136467b7c2bb225f406bd170f4ad59c254e5103c34eeabb5bd69a0455154527224a42ab405cacf0fe92918a75641ce4152f8db292019a5527aa956",
+ "result": {
+ "error": "out of gas",
+ "from": "0x94194bc2aaf494501d7880b61274a169f6502a54",
+ "gas": "0x7045",
+ "gasUsed": "0x7045",
+ "input": "0xa9059cbb000000000000000000000000e77b1ac803616503510bed0086e3a7be2627a69900000000000000000000000000000000000000000000000000000009502f9000",
+ "to": "0x43064693d3d38ad6a7cb579e0d6d9718c8aa6b62",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_revert.json b/eth/tracers/testdata/call_tracer_revert.json
new file mode 100644
index 000000000..059040a1c
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_revert.json
@@ -0,0 +1,58 @@
+{
+ "context": {
+ "difficulty": "3665057456",
+ "gasLimit": "5232723",
+ "miner": "0xf4d8e706cfb25c0decbbdd4d2e2cc10c66376a3f",
+ "number": "2294501",
+ "timestamp": "1513673601"
+ },
+ "genesis": {
+ "alloc": {
+ "0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9": {
+ "balance": "0x2a3fc32bcc019283",
+ "code": "0x",
+ "nonce": "10",
+ "storage": {}
+ },
+ "0xabbcd5b340c80b5f1c0545c04c987b87310296ae": {
+ "balance": "0x0",
+ "code": "0x606060405236156100755763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632d0335ab811461007a578063548db174146100ab5780637f649783146100fc578063b092145e1461014d578063c3f44c0a14610186578063c47cf5de14610203575b600080fd5b341561008557600080fd5b610099600160a060020a0360043516610270565b60405190815260200160405180910390f35b34156100b657600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061028f95505050505050565b005b341561010757600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061029e95505050505050565b005b341561015857600080fd5b610172600160a060020a03600435811690602435166102ad565b604051901515815260200160405180910390f35b341561019157600080fd5b6100fa6004803560ff1690602480359160443591606435600160a060020a0316919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506102cd915050565b005b341561020e57600080fd5b61025460046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061056a95505050505050565b604051600160a060020a03909116815260200160405180910390f35b600160a060020a0381166000908152602081905260409020545b919050565b61029a816000610594565b5b50565b61029a816001610594565b5b50565b600160209081526000928352604080842090915290825290205460ff1681565b60008080600160a060020a038416158061030d5750600160a060020a038085166000908152600160209081526040808320339094168352929052205460ff165b151561031857600080fd5b6103218561056a565b600160a060020a038116600090815260208190526040808220549295507f19000000000000000000000000000000000000000000000000000000000000009230918891908b908b90517fff000000000000000000000000000000000000000000000000000000000000008089168252871660018201526c01000000000000000000000000600160a060020a038088168202600284015286811682026016840152602a8301869052841602604a820152605e810182805190602001908083835b6020831061040057805182525b601f1990920191602091820191016103e0565b6001836020036101000a0380198251168184511617909252505050919091019850604097505050505050505051809103902091506001828a8a8a6040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561049957600080fd5b5050602060405103519050600160a060020a03838116908216146104bc57600080fd5b600160a060020a0380841660009081526020819052604090819020805460010190559087169086905180828051906020019080838360005b8381101561050d5780820151818401525b6020016104f4565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050151561055e57600080fd5b5b505050505050505050565b600060248251101561057e5750600061028a565b600160a060020a0360248301511690505b919050565b60005b825181101561060157600160a060020a033316600090815260016020526040812083918584815181106105c657fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790555b600101610597565b5b5050505600a165627a7a723058200027e8b695e9d2dea9f3629519022a69f3a1d23055ce86406e686ea54f31ee9c0029",
+ "nonce": "1",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "3672229776",
+ "extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
+ "gasLimit": "5227619",
+ "hash": "0xa07b3d6c6bf63f5f981016db9f2d1d93033833f2c17e8bf7209e85f1faf08076",
+ "miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
+ "mixHash": "0x806e151ce2817be922e93e8d5921fa0f0d0fd213d6b2b9a3fa17458e74a163d0",
+ "nonce": "0xbc5d43adc2c30c7d",
+ "number": "2294500",
+ "stateRoot": "0xca645b335888352ef9d8b1ef083e9019648180b259026572e3139717270de97d",
+ "timestamp": "1513673552",
+ "totalDifficulty": "7160066586979149"
+ },
+ "input": "0xf9018b0a8505d21dba00832dc6c094abbcd5b340c80b5f1c0545c04c987b87310296ae80b9012473b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988000000000000000000000000000000000000000000000000000000000000000000000000000000001ba0fd659d76a4edbd2a823e324c93f78ad6803b30ff4a9c8bce71ba82798975c70ca06571eecc0b765688ec6c78942c5ee8b585e00988c0141b518287e9be919bc48a",
+ "result": {
+ "error": "execution reverted",
+ "from": "0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9",
+ "gas": "0x2d55e8",
+ "gasUsed": "0xc3",
+ "input": "0x73b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a98800000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "to": "0xabbcd5b340c80b5f1c0545c04c987b87310296ae",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_simple.json b/eth/tracers/testdata/call_tracer_simple.json
new file mode 100644
index 000000000..b46432122
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_simple.json
@@ -0,0 +1,78 @@
+{
+ "context": {
+ "difficulty": "3502894804",
+ "gasLimit": "4722976",
+ "miner": "0x1585936b53834b021f68cc13eeefdec2efc8e724",
+ "number": "2289806",
+ "timestamp": "1513601314"
+ },
+ "genesis": {
+ "alloc": {
+ "0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5": {
+ "balance": "0x0",
+ "code": "0x",
+ "nonce": "22",
+ "storage": {}
+ },
+ "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe": {
+ "balance": "0x4d87094125a369d9bd5",
+ "code": "0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb",
+ "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000",
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000003c",
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000005a37b834"
+ }
+ },
+ "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb": {
+ "balance": "0x1780d77678137ac1b775",
+ "code": "0x",
+ "nonce": "29072",
+ "storage": {}
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "3509749784",
+ "extraData": "0x4554482e45544846414e532e4f52472d4641313738394444",
+ "gasLimit": "4727564",
+ "hash": "0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440",
+ "miner": "0xbbf5029fd710d227630c8b7d338051b8e76d50b3",
+ "mixHash": "0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada",
+ "nonce": "0x4eb12e19c16d43da",
+ "number": "2289805",
+ "stateRoot": "0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f",
+ "timestamp": "1513601261",
+ "totalDifficulty": "7143276353481064"
+ },
+ "input": "0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4",
+ "result": {
+ "calls": [
+ {
+ "from": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
+ "input": "0x",
+ "to": "0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
+ "type": "CALL",
+ "value": "0x6f05b59d3b20000"
+ }
+ ],
+ "from": "0xb436ba50d378d4bbc8660d312a13df6af6e89dfb",
+ "gas": "0x10738",
+ "gasUsed": "0x3ef9",
+ "input": "0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5",
+ "output": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "to": "0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/testdata/call_tracer_throw.json b/eth/tracers/testdata/call_tracer_throw.json
new file mode 100644
index 000000000..60d4d1071
--- /dev/null
+++ b/eth/tracers/testdata/call_tracer_throw.json
@@ -0,0 +1,62 @@
+{
+ "context": {
+ "difficulty": "117009631",
+ "gasLimit": "4712388",
+ "miner": "0x294e5d6c39a36ce38af1dca70c1060f78dee8070",
+ "number": "25009",
+ "timestamp": "1479891666"
+ },
+ "genesis": {
+ "alloc": {
+ "0x70c9217d814985faef62b124420f8dfbddd96433": {
+ "balance": "0x4ecd70668f5d854a",
+ "code": "0x",
+ "nonce": "1638",
+ "storage": {}
+ },
+ "0xc212e03b9e060e36facad5fd8f4435412ca22e6b": {
+ "balance": "0x0",
+ "code": "0x606060405236156101745760e060020a600035046302d05d3f811461017c57806304a7fdbc1461018e5780630e90f957146101fb5780630fb5a6b41461021257806314baa1b61461021b57806317fc45e21461023a5780632b096926146102435780632e94420f1461025b578063325a19f11461026457806336da44681461026d5780633f81a2c01461027f5780633fc306821461029757806345ecd3d7146102d45780634665096d146102dd5780634e71d92d146102e657806351a34eb8146103085780636111bb951461032d5780636f265b93146103445780637e9014e11461034d57806390ba009114610360578063927df5e014610393578063a7f437791461046c578063ad8f50081461046e578063bc6d909414610477578063bdec3ad114610557578063c19d93fb1461059a578063c9503fe2146105ad578063e0a73a93146105b6578063ea71b02d146105bf578063ea8a1af0146105d1578063ee4a96f9146105f3578063f1ff78a01461065c575b61046c610002565b610665600054600160a060020a031681565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600554600090600160a060020a0390811633909116146106a857610002565b61068260015460a060020a900460ff166000145b90565b61069660085481565b61046c600435600154600160a060020a03166000141561072157610002565b610696600d5481565b610696600435600f8160068110156100025750015481565b61069660045481565b61069660035481565b610665600554600160a060020a031681565b61069660043560158160068110156100025750015481565b6106966004355b600b54600f5460009160028202808203928083039290810191018386101561078357601054840186900394505b50505050919050565b61069660025481565b61069660095481565b61046c600554600090600160a060020a03908116339091161461085857610002565b61046c600435600554600090600160a060020a03908116339091161461092e57610002565b6106826001805460a060020a900460ff161461020f565b610696600b5481565b61068260075460a060020a900460ff1681565b6106966004355b600b54601554600091600282028082039280830392908101910183861015610a6c5760165494506102cb565b61046c6004356024356044356040805160015460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b02600483015291516000928392600160a060020a03919091169163e16c7d9891602481810192602092909190829003018187876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610b4657610002565b005b610696600a5481565b61046c60006000600060006000600160009054906101000a9004600160a060020a0316600160a060020a031663e16c7d986040518160e060020a028152600401808060b260020a691858d8dbdd5b9d18dd1b0281526020015060200190506020604051808303816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f1757610002565b61046c5b60015b60058160ff16101561071e57600f6001820160ff166006811015610002578101549060ff83166006811015610002570154101561129057610002565b61069660015460a060020a900460ff1681565b61069660065481565b610696600c5481565b610665600754600160a060020a031681565b61046c600554600090600160a060020a0390811633909116146112c857610002565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600154600090600160a060020a03168114156113fb57610002565b610696600e5481565b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060005b60068160ff16101561070857828160ff166006811015610002576020020151600f60ff831660068110156100025701558160ff82166006811015610002576020020151601560ff831660068110156100025701556001016106ac565b61071061055b565b505050565b600e8054820190555b50565b6040805160015460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061071557610002565b83861015801561079257508286105b156107b457600f546010546011548689039082030291909104900394506102cb565b8286101580156107c55750600b5486105b156107e757600f546011546012548589039082030291909104900394506102cb565b600b5486108015906107f857508186105b1561081d57600b54600f546012546013549289039281039290920204900394506102cb565b81861015801561082c57508086105b1561084e57600f546013546014548489039082030291909104900394506102cb565b60145494506102cb565b60015460a060020a900460ff1660001461087157610002565b600254600a01431161088257610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663771d50e16040518160e060020a0281526004018090506000604051808303816000876161da5a03f1156100025750505050565b60015460a060020a900460ff1660001461094757610002565b600254600a01431161095857610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180517f51a34eb8000000000000000000000000000000000000000000000000000000008252600482018690529151919350600160a060020a03841692506351a34eb8916024808301926000929190829003018183876161da5a03f11561000257505050600b8290554360025560408051838152905130600160a060020a0316917fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff919081900360200190a25050565b838610158015610a7b57508286105b15610a9d576015546016546017548689039082900302919091040194506102cb565b828610158015610aae5750600b5486105b15610ad0576015546017546018548589039082900302919091040194506102cb565b600b548610801590610ae157508186105b15610b0657600b546015546018546019549289039281900392909202040194506102cb565b818610158015610b1557508086105b15610b3757601554601954601a548489039082900302919091040194506102cb565b601a54860181900394506102cb565b60015460a060020a900460ff16600014610b5f57610002565b6001805460a060020a60ff02191660a060020a17908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919450600160a060020a038516925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604080518051600a556005547ffebf661200000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015216602482015260448101879052905163febf661291606480820192600092909190829003018183876161da5a03f115610002575050508215610cc7576007805473ffffffffffffffffffffffffffffffffffffffff191633179055610dbb565b6040805160055460065460e060020a63599efa6b028352600160a060020a039182166004840152602483015291519184169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050604080516006547f56ccb6f000000000000000000000000000000000000000000000000000000000825233600160a060020a03166004830152602482015290516356ccb6f091604480820192600092909190829003018183876161da5a03f115610002575050600580546007805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551633179055505b6007805460a060020a60ff02191660a060020a87810291909117918290556008544301600955900460ff1615610df757600a54610e039061029e565b600a54610e0b90610367565b600c55610e0f565b600c555b600c54670de0b6b3a7640000850204600d55600754600554604080517f759297bb000000000000000000000000000000000000000000000000000000008152600160a060020a039384166004820152918316602483015260448201879052519184169163759297bb91606481810192600092909190829003018183876161da5a03f11561000257505060408051600754600a54600d54600554600c5460a060020a850460ff161515865260208601929092528486019290925260608401529251600160a060020a0391821694509281169230909116917f3b3d1986083d191be01d28623dc19604728e29ae28bdb9ba52757fdee1a18de2919081900360800190a45050505050565b600954431015610f2657610002565b6001805460a060020a900460ff1614610f3e57610002565b6001805460a060020a60ff0219167402000000000000000000000000000000000000000017908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919750600160a060020a038816925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604051516007549095506000945060a060020a900460ff1615905061105c57600a5484111561105757600a54600d54670de0b6b3a7640000918603020492505b61107e565b600a5484101561107e57600a54600d54670de0b6b3a764000091869003020492505b60065483111561108e5760065492505b6006548390039150600083111561111857604080516005546007547f5928d37f000000000000000000000000000000000000000000000000000000008352600160a060020a0391821660048401528116602483015260448201869052915191871691635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505b600082111561117a576040805160055460e060020a63599efa6b028252600160a060020a0390811660048301526024820185905291519187169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050505b6040805185815260208101849052808201859052905130600160a060020a0316917f89e690b1d5aaae14f3e85f108dc92d9ab3763a58d45aed8b59daedbbae8fe794919081900360600190a260008311156112285784600160a060020a0316634cc927d785336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611282565b84600160a060020a0316634cc927d7600a60005054336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f115610002575050505b600054600160a060020a0316ff5b60156001820160ff166006811015610002578101549060ff8316600681101561000257015411156112c057610002565b60010161055e565b60015460a060020a900460ff166000146112e157610002565b600254600a0143116112f257610002565b6001546040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f11561000257505060408051805160055460065460e060020a63599efa6b028452600160a060020a03918216600485015260248401529251909450918416925063599efa6b916044808301926000929190829003018183876161da5a03f1156100025750505080600160a060020a0316632b68bb2d6040518160e060020a0281526004018090506000604051808303816000876161da5a03f115610002575050600054600160a060020a03169050ff5b6001546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602480830192602092919082900301816000876161da5a03f11561000257505060405151151590506106a85761000256",
+ "nonce": "1",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396",
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000061a9",
+ "0x0000000000000000000000000000000000000000000000000000000000000005": "0x00000000000000000000000070c9217d814985faef62b124420f8dfbddd96433"
+ }
+ }
+ },
+ "config": {
+ "byzantiumBlock": 1700000,
+ "chainId": 3,
+ "daoForkSupport": true,
+ "eip150Block": 0,
+ "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d",
+ "eip155Block": 10,
+ "eip158Block": 10,
+ "ethash": {},
+ "homesteadBlock": 0
+ },
+ "difficulty": "117066792",
+ "extraData": "0xd783010502846765746887676f312e372e33856c696e7578",
+ "gasLimit": "4712388",
+ "hash": "0xe23e8d4562a1045b70cbc99fefb20c101a8f0fc8559a80d65fea8896e2f1d46e",
+ "miner": "0x71842f946b98800fe6feb49f0ae4e253259031c9",
+ "mixHash": "0x0aada9d6e93dd4db0d09c0488dc0a048fca2ccdc1f3fc7b83ba2a8d393a3a4ff",
+ "nonce": "0x70849d5838dee2e9",
+ "number": "25008",
+ "stateRoot": "0x1e01d2161794768c5b917069e73d86e8dca80cd7f3168c0597de420ab93a3b7b",
+ "timestamp": "1479891641",
+ "totalDifficulty": "1896347038589"
+ },
+ "input": "0xf88b8206668504a817c8008303d09094c212e03b9e060e36facad5fd8f4435412ca22e6b80a451a34eb8000000000000000000000000000000000000000000000027fad02094277c000029a0692a3b4e7b2842f8dd7832e712c21e09f451f416c8976d5b8d02e8c0c2b4bea9a07645e90fc421b63dd755767fd93d3c03b4ec0c4d8fafa059558d08cf11d59750",
+ "result": {
+ "error": "invalid jump destination (PUSH1) 2",
+ "from": "0x70c9217d814985faef62b124420f8dfbddd96433",
+ "gas": "0x37b38",
+ "gasUsed": "0x37b38",
+ "input": "0x51a34eb8000000000000000000000000000000000000000000000027fad02094277c0000",
+ "to": "0xc212e03b9e060e36facad5fd8f4435412ca22e6b",
+ "type": "CALL",
+ "value": "0x0"
+ }
+}
diff --git a/eth/tracers/tracer.go b/eth/tracers/tracer.go
new file mode 100644
index 000000000..f3f848fc1
--- /dev/null
+++ b/eth/tracers/tracer.go
@@ -0,0 +1,618 @@
+// Copyright 2016 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package tracers
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "math/big"
+ "sync/atomic"
+ "time"
+ "unsafe"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/log"
+ duktape "gopkg.in/olebedev/go-duktape.v3"
+)
+
+// bigIntegerJS is the minified version of https://github.com/peterolson/BigInteger.js.
+const bigIntegerJS = `var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT<n&&n<MAX_INT}function smallToArray(n){if(n<1e7)return[n];if(n<1e14)return[n%1e7,Math.floor(n/1e7)];return[n%1e7,Math.floor(n/1e7)%1e7,Math.floor(n/1e14)]}function arrayToSmall(arr){trim(arr);var length=arr.length;if(length<4&&compareAbs(arr,MAX_INT_ARR)<0){switch(length){case 0:return 0;case 1:return arr[0];case 2:return arr[0]+arr[1]*BASE;default:return arr[0]+(arr[1]+arr[2]*BASE)*BASE}}return arr}function trim(v){var i=v.length;while(v[--i]===0);v.length=i+1}function createArray(length){var x=new Array(length);var i=-1;while(++i<length){x[i]=0}return x}function truncate(n){if(n>0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i<l_b;i++){sum=a[i]+b[i]+carry;carry=sum>=base?1:0;r[i]=sum-carry*base}while(i<l_a){sum=a[i]+carry;carry=sum===base?1:0;r[i++]=sum-carry*base}if(carry>0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i<l;i++){sum=a[i]-base+carry;carry=Math.floor(sum/base);r[i]=sum-carry*base;carry+=1}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i<b_l;i++){difference=a[i]-borrow-b[i];if(difference<0){difference+=base;borrow=1}else borrow=0;r[i]=difference}for(i=b_l;i<a_l;i++){difference=a[i]-borrow;if(difference<0)difference+=base;else{r[i++]=difference;break}r[i]=difference}for(;i<a_l;i++){r[i]=a[i]}trim(r);return r}function subtractAny(a,b,sign){var value;if(compareAbs(a,b)>=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i<l;i++){difference=a[i]+carry;carry=Math.floor(difference/base);difference%=base;r[i]=difference<0?difference+base:difference}r=arrayToSmall(r);if(typeof r==="number"){if(sign)r=-r;return new SmallInteger(r)}return new BigInteger(r,sign)}BigInteger.prototype.subtract=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.add(n.negate())}var a=this.value,b=n.value;if(n.isSmall)return subtractSmall(a,Math.abs(b),this.sign);return subtractAny(a,b,this.sign)};BigInteger.prototype.minus=BigInteger.prototype.subtract;SmallInteger.prototype.subtract=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.add(n.negate())}var b=n.value;if(n.isSmall){return new SmallInteger(a-b)}return subtractSmall(b,Math.abs(a),a>=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i<a_l;++i){a_i=a[i];for(var j=0;j<b_l;++j){b_j=b[j];product=a_i*b_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}function multiplySmall(a,b){var l=a.length,r=new Array(l),base=BASE,carry=0,product,i;for(i=0;i<l;i++){product=a[i]*b+carry;carry=Math.floor(product/base);r[i]=product-carry*base}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs<BASE){return new BigInteger(multiplySmall(a,abs),sign)}b=smallToArray(abs)}if(useKaratsuba(a.length,b.length))return new BigInteger(multiplyKaratsuba(a,b),sign);return new BigInteger(multiplyLong(a,b),sign)};BigInteger.prototype.times=BigInteger.prototype.multiply;function multiplySmallAndArray(a,b,sign){if(a<BASE){return new BigInteger(multiplySmall(b,a),sign)}return new BigInteger(multiplyLong(b,smallToArray(a)),sign)}SmallInteger.prototype._multiplyBySmall=function(a){if(isPrecise(a.value*this.value)){return new SmallInteger(a.value*this.value)}return multiplySmallAndArray(Math.abs(a.value),smallToArray(Math.abs(this.value)),this.sign!==a.sign)};BigInteger.prototype._multiplyBySmall=function(a){if(a.value===0)return Integer[0];if(a.value===1)return this;if(a.value===-1)return this.negate();return multiplySmallAndArray(Math.abs(a.value),this.value,this.sign!==a.sign)};SmallInteger.prototype.multiply=function(v){return parseValue(v)._multiplyBySmall(this)};SmallInteger.prototype.times=SmallInteger.prototype.multiply;function square(a){var l=a.length,r=createArray(l+l),base=BASE,product,carry,i,a_i,a_j;for(i=0;i<l;i++){a_i=a[i];for(var j=0;j<l;j++){a_j=a[j];product=a_i*a_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}BigInteger.prototype.square=function(){return new BigInteger(square(this.value),false)};SmallInteger.prototype.square=function(){var value=this.value*this.value;if(isPrecise(value))return new SmallInteger(value);return new BigInteger(square(smallToArray(Math.abs(this.value))),false)};function divMod1(a,b){var a_l=a.length,b_l=b.length,base=BASE,result=createArray(b.length),divisorMostSignificantDigit=b[b_l-1],lambda=Math.ceil(base/(2*divisorMostSignificantDigit)),remainder=multiplySmall(a,lambda),divisor=multiplySmall(b,lambda),quotientDigit,shift,carry,borrow,i,l,q;if(remainder.length<=a_l)remainder.push(0);divisor.push(0);divisorMostSignificantDigit=divisor[b_l-1];for(shift=a_l-b_l;shift>=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;i<l;i++){carry+=quotientDigit*divisor[i];q=Math.floor(carry/base);borrow+=remainder[shift+i]-(carry-q*base);carry=q;if(borrow<0){remainder[shift+i]=borrow+base;borrow=-1}else{remainder[shift+i]=borrow;borrow=0}}while(borrow!==0){quotientDigit-=1;carry=0;for(i=0;i<l;i++){carry+=remainder[shift+i]-base+divisor[i];if(carry<0){remainder[shift+i]=carry+base;carry=0}else{remainder[shift+i]=carry;carry=1}}borrow+=carry}result[shift]=quotientDigit}remainder=divModSmall(remainder,lambda)[0];return[arrayToSmall(result),arrayToSmall(remainder)]}function divMod2(a,b){var a_l=a.length,b_l=b.length,result=[],part=[],base=BASE,guess,xlen,highx,highy,check;while(a_l){part.unshift(a[--a_l]);trim(part);if(compareAbs(part,b)<0){result.push(0);continue}xlen=part.length;highx=part[xlen-1]*base+part[xlen-2];highy=b[b_l-1]*base+b[b_l-2];if(xlen>b_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(abs<BASE){value=divModSmall(a,abs);quotient=arrayToSmall(value[0]);var remainder=value[1];if(self.sign)remainder=-remainder;if(typeof quotient==="number"){if(self.sign!==n.sign)quotient=-quotient;return[new SmallInteger(quotient),new SmallInteger(remainder)]}return[new BigInteger(quotient,self.sign!==n.sign),new SmallInteger(remainder)]}b=smallToArray(abs)}var comparison=compareAbs(a,b);if(comparison===-1)return[Integer[0],self];if(comparison===0)return[Integer[self.sign===n.sign?1:-1],Integer[0]];if(a.length+b.length<=200)value=divMod1(a,b);else value=divMod2(a,b);quotient=value[0];var qSign=self.sign!==n.sign,mod=value[1],mSign=self.sign;if(typeof quotient==="number"){if(qSign)quotient=-quotient;quotient=new SmallInteger(quotient)}else quotient=new BigInteger(quotient,qSign);if(typeof mod==="number"){if(mSign)mod=-mod;mod=new SmallInteger(mod)}else mod=new BigInteger(mod,mSign);return[quotient,mod]}BigInteger.prototype.divmod=function(v){var result=divModAny(this,v);return{quotient:result[0],remainder:result[1]}};SmallInteger.prototype.divmod=BigInteger.prototype.divmod;BigInteger.prototype.divide=function(v){return divModAny(this,v)[0]};SmallInteger.prototype.over=SmallInteger.prototype.divide=BigInteger.prototype.over=BigInteger.prototype.divide;BigInteger.prototype.mod=function(v){return divModAny(this,v)[1]};SmallInteger.prototype.remainder=SmallInteger.prototype.mod=BigInteger.prototype.remainder=BigInteger.prototype.mod;BigInteger.prototype.pow=function(v){var n=parseValue(v),a=this.value,b=n.value,value,x,y;if(b===0)return Integer[1];if(a===0)return Integer[0];if(a===1)return Integer[1];if(a===-1)return n.isEven()?Integer[1]:Integer[-1];if(n.sign){return Integer[0]}if(!n.isSmall)throw new Error("The exponent "+n.toString()+" is too large.");if(this.isSmall){if(isPrecise(value=Math.pow(a,b)))return new SmallInteger(truncate(value))}x=this;y=Integer[1];while(true){if(b&1===1){y=y.times(x);--b}if(b===0)break;b/=2;x=x.square()}return y};SmallInteger.prototype.pow=BigInteger.prototype.pow;BigInteger.prototype.modPow=function(exp,mod){exp=parseValue(exp);mod=parseValue(mod);if(mod.isZero())throw new Error("Cannot take modPow with modulus 0");var r=Integer[1],base=this.mod(mod);while(exp.isPositive()){if(base.isZero())return Integer[0];if(exp.isOdd())r=r.multiply(base).mod(mod);exp=exp.divide(2);base=base.square().mod(mod)}return r};SmallInteger.prototype.modPow=BigInteger.prototype.modPow;function compareAbs(a,b){if(a.length!==b.length){return a.length>b.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i<a.length;i++){x=bigInt(a[i]).modPow(b,n);if(x.equals(Integer[1])||x.equals(nPrev))continue;for(t=true,d=b;t&&d.lesser(nPrev);d=d.multiply(2)){x=x.square().mod(n);if(x.equals(nPrev))t=false}if(t)return false}return true};SmallInteger.prototype.isPrime=BigInteger.prototype.isPrime;BigInteger.prototype.isProbablePrime=function(iterations){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var t=iterations===undefined?5:iterations;for(var i=0;i<t;i++){var a=bigInt.randBetween(2,n.minus(2));if(!a.modPow(n.prev(),n).isUnit())return false}return true};SmallInteger.prototype.isProbablePrime=BigInteger.prototype.isProbablePrime;BigInteger.prototype.modInv=function(n){var t=bigInt.zero,newT=bigInt.one,r=parseValue(n),newR=this.abs(),q,lastT,lastR;while(!newR.equals(bigInt.zero)){q=r.divide(newR);lastT=t;lastR=r;t=newT;r=newR;newT=lastT.subtract(q.multiply(newT));newR=lastR.subtract(q.multiply(newR))}if(!r.equals(1))throw new Error(this.toString()+" and "+n.toString()+" are not co-prime");if(t.compare(0)===-1){t=t.add(n)}if(this.isNegative()){return t.negate()}return t};SmallInteger.prototype.modInv=BigInteger.prototype.modInv;BigInteger.prototype.next=function(){var value=this.value;if(this.sign){return subtractSmall(value,1,this.sign)}return new BigInteger(addSmall(value,1),this.sign)};SmallInteger.prototype.next=function(){var value=this.value;if(value+1<MAX_INT)return new SmallInteger(value+1);return new BigInteger(MAX_INT_ARR,false)};BigInteger.prototype.prev=function(){var value=this.value;if(this.sign){return new BigInteger(addSmall(value,1),true)}return subtractSmall(value,1,this.sign)};SmallInteger.prototype.prev=function(){var value=this.value;if(value-1>-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n==="number"||typeof n==="string")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit<top)restricted=false}result=arrayToSmall(result);return low.add(typeof result==="number"?new SmallInteger(result):new BigInteger(result,false))}var parseBase=function(text,base){var length=text.length;var i;var absBase=Math.abs(base);for(var i=0;i<length;i++){var c=text[i].toLowerCase();if(c==="-")continue;if(/[a-z0-9]/.test(c)){if(/[0-9]/.test(c)&&+c>=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+" is not a valid digit in base "+base+".")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+" is not a valid digit in base "+base+".")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i<text.length;i++){var c=text[i].toLowerCase(),charCode=c.charCodeAt(0);if(48<=charCode&&charCode<=57)digits.push(parseValue(c));else if(97<=charCode&&charCode<=122)digits.push(parseValue(c.charCodeAt(0)-87));else if(c==="<"){var start=i;do{i++}while(text[i]!==">");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){var v=digit.value;if(typeof v==="number")v=[v];if(v.length===1&&v[0]<=35){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(v[0])}return"<"+v+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return"0";throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return"0";if(n.isNegative())return new Array(1-n).join("10");return"1"+new Array(+n).join("01")}var minusSign="";if(n.isNegative()&&base.isPositive()){minusSign="-";n=n.abs()}if(base.equals(1)){if(n.isZero())return"0";return minusSign+new Array(+n+1).join(1)}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(stringify(digit))}out.push(stringify(left));return minusSign+out.reverse().join("")}BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBase(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBase(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return+this.toString()};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw"Invalid integer: "+v}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define("big-integer",[],function(){return bigInt})}; bigInt`
+
+// makeSlice convert an unsafe memory pointer with the given type into a Go byte
+// slice.
+//
+// Note, the returned slice uses the same memory area as the input arguments.
+// If those are duktape stack items, popping them off **will** make the slice
+// contents change.
+func makeSlice(ptr unsafe.Pointer, size uint) []byte {
+ var sl = struct {
+ addr uintptr
+ len int
+ cap int
+ }{uintptr(ptr), int(size), int(size)}
+
+ return *(*[]byte)(unsafe.Pointer(&sl))
+}
+
+// popSlice pops a buffer off the JavaScript stack and returns it as a slice.
+func popSlice(ctx *duktape.Context) []byte {
+ blob := common.CopyBytes(makeSlice(ctx.GetBuffer(-1)))
+ ctx.Pop()
+ return blob
+}
+
+// pushBigInt create a JavaScript BigInteger in the VM.
+func pushBigInt(n *big.Int, ctx *duktape.Context) {
+ ctx.GetGlobalString("bigInt")
+ ctx.PushString(n.String())
+ ctx.Call(1)
+}
+
+// opWrapper provides a JavaScript wrapper around OpCode.
+type opWrapper struct {
+ op vm.OpCode
+}
+
+// pushObject assembles a JSVM object wrapping a swappable opcode and pushes it
+// onto the VM stack.
+func (ow *opWrapper) pushObject(vm *duktape.Context) {
+ obj := vm.PushObject()
+
+ vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(int(ow.op)); return 1 })
+ vm.PutPropString(obj, "toNumber")
+
+ vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushString(ow.op.String()); return 1 })
+ vm.PutPropString(obj, "toString")
+
+ vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushBoolean(ow.op.IsPush()); return 1 })
+ vm.PutPropString(obj, "isPush")
+}
+
+// memoryWrapper provides a JavaScript wrapper around vm.Memory.
+type memoryWrapper struct {
+ memory *vm.Memory
+}
+
+// slice returns the requested range of memory as a byte slice.
+func (mw *memoryWrapper) slice(begin, end int64) []byte {
+ if mw.memory.Len() < int(end) {
+ // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go
+ // runtime goes belly up https://github.com/golang/go/issues/15639.
+ log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", begin, "size", end-begin)
+ return nil
+ }
+ return mw.memory.Get(begin, end-begin)
+}
+
+// getUint returns the 32 bytes at the specified address interpreted as a uint.
+func (mw *memoryWrapper) getUint(addr int64) *big.Int {
+ if mw.memory.Len() < int(addr)+32 {
+ // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go
+ // runtime goes belly up https://github.com/golang/go/issues/15639.
+ log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", addr, "size", 32)
+ return new(big.Int)
+ }
+ return new(big.Int).SetBytes(mw.memory.GetPtr(addr, 32))
+}
+
+// pushObject assembles a JSVM object wrapping a swappable memory and pushes it
+// onto the VM stack.
+func (mw *memoryWrapper) pushObject(vm *duktape.Context) {
+ obj := vm.PushObject()
+
+ // Generate the `slice` method which takes two ints and returns a buffer
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ blob := mw.slice(int64(ctx.GetInt(-2)), int64(ctx.GetInt(-1)))
+ ctx.Pop2()
+
+ ptr := ctx.PushFixedBuffer(len(blob))
+ copy(makeSlice(ptr, uint(len(blob))), blob[:])
+ return 1
+ })
+ vm.PutPropString(obj, "slice")
+
+ // Generate the `getUint` method which takes an int and returns a bigint
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ offset := int64(ctx.GetInt(-1))
+ ctx.Pop()
+
+ pushBigInt(mw.getUint(offset), ctx)
+ return 1
+ })
+ vm.PutPropString(obj, "getUint")
+}
+
+// stackWrapper provides a JavaScript wrapper around vm.Stack.
+type stackWrapper struct {
+ stack *vm.Stack
+}
+
+// peek returns the nth-from-the-top element of the stack.
+func (sw *stackWrapper) peek(idx int) *big.Int {
+ if len(sw.stack.Data()) <= idx {
+ // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go
+ // runtime goes belly up https://github.com/golang/go/issues/15639.
+ log.Warn("Tracer accessed out of bound stack", "size", len(sw.stack.Data()), "index", idx)
+ return new(big.Int)
+ }
+ return sw.stack.Data()[len(sw.stack.Data())-idx-1]
+}
+
+// pushObject assembles a JSVM object wrapping a swappable stack and pushes it
+// onto the VM stack.
+func (sw *stackWrapper) pushObject(vm *duktape.Context) {
+ obj := vm.PushObject()
+
+ vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(len(sw.stack.Data())); return 1 })
+ vm.PutPropString(obj, "length")
+
+ // Generate the `peek` method which takes an int and returns a bigint
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ offset := ctx.GetInt(-1)
+ ctx.Pop()
+
+ pushBigInt(sw.peek(offset), ctx)
+ return 1
+ })
+ vm.PutPropString(obj, "peek")
+}
+
+// dbWrapper provides a JavaScript wrapper around vm.Database.
+type dbWrapper struct {
+ db vm.StateDB
+}
+
+// pushObject assembles a JSVM object wrapping a swappable database and pushes it
+// onto the VM stack.
+func (dw *dbWrapper) pushObject(vm *duktape.Context) {
+ obj := vm.PushObject()
+
+ // Push the wrapper for statedb.GetBalance
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ pushBigInt(dw.db.GetBalance(common.BytesToAddress(popSlice(ctx))), ctx)
+ return 1
+ })
+ vm.PutPropString(obj, "getBalance")
+
+ // Push the wrapper for statedb.GetNonce
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ ctx.PushInt(int(dw.db.GetNonce(common.BytesToAddress(popSlice(ctx)))))
+ return 1
+ })
+ vm.PutPropString(obj, "getNonce")
+
+ // Push the wrapper for statedb.GetCode
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ code := dw.db.GetCode(common.BytesToAddress(popSlice(ctx)))
+
+ ptr := ctx.PushFixedBuffer(len(code))
+ copy(makeSlice(ptr, uint(len(code))), code[:])
+ return 1
+ })
+ vm.PutPropString(obj, "getCode")
+
+ // Push the wrapper for statedb.GetState
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ hash := popSlice(ctx)
+ addr := popSlice(ctx)
+
+ state := dw.db.GetState(common.BytesToAddress(addr), common.BytesToHash(hash))
+
+ ptr := ctx.PushFixedBuffer(len(state))
+ copy(makeSlice(ptr, uint(len(state))), state[:])
+ return 1
+ })
+ vm.PutPropString(obj, "getState")
+
+ // Push the wrapper for statedb.Exists
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ ctx.PushBoolean(dw.db.Exist(common.BytesToAddress(popSlice(ctx))))
+ return 1
+ })
+ vm.PutPropString(obj, "exists")
+}
+
+// contractWrapper provides a JavaScript wrapper around vm.Contract
+type contractWrapper struct {
+ contract *vm.Contract
+}
+
+// pushObject assembles a JSVM object wrapping a swappable contract and pushes it
+// onto the VM stack.
+func (cw *contractWrapper) pushObject(vm *duktape.Context) {
+ obj := vm.PushObject()
+
+ // Push the wrapper for contract.Caller
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ ptr := ctx.PushFixedBuffer(20)
+ copy(makeSlice(ptr, 20), cw.contract.Caller().Bytes())
+ return 1
+ })
+ vm.PutPropString(obj, "getCaller")
+
+ // Push the wrapper for contract.Address
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ ptr := ctx.PushFixedBuffer(20)
+ copy(makeSlice(ptr, 20), cw.contract.Address().Bytes())
+ return 1
+ })
+ vm.PutPropString(obj, "getAddress")
+
+ // Push the wrapper for contract.Value
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ pushBigInt(cw.contract.Value(), ctx)
+ return 1
+ })
+ vm.PutPropString(obj, "getValue")
+
+ // Push the wrapper for contract.Input
+ vm.PushGoFunction(func(ctx *duktape.Context) int {
+ blob := cw.contract.Input
+
+ ptr := ctx.PushFixedBuffer(len(blob))
+ copy(makeSlice(ptr, uint(len(blob))), blob[:])
+ return 1
+ })
+ vm.PutPropString(obj, "getInput")
+}
+
+// Tracer provides an implementation of Tracer that evaluates a Javascript
+// function for each VM execution step.
+type Tracer struct {
+ inited bool // Flag whether the context was already inited from the EVM
+
+ vm *duktape.Context // Javascript VM instance
+
+ tracerObject int // Stack index of the tracer JavaScript object
+ stateObject int // Stack index of the global state to pull arguments from
+
+ opWrapper *opWrapper // Wrapper around the VM opcode
+ stackWrapper *stackWrapper // Wrapper around the VM stack
+ memoryWrapper *memoryWrapper // Wrapper around the VM memory
+ contractWrapper *contractWrapper // Wrapper around the contract object
+ dbWrapper *dbWrapper // Wrapper around the VM environment
+
+ pcValue *uint // Swappable pc value wrapped by a log accessor
+ gasValue *uint // Swappable gas value wrapped by a log accessor
+ costValue *uint // Swappable cost value wrapped by a log accessor
+ depthValue *uint // Swappable depth value wrapped by a log accessor
+ errorValue *string // Swappable error value wrapped by a log accessor
+
+ ctx map[string]interface{} // Transaction context gathered throughout execution
+ err error // Error, if one has occurred
+
+ interrupt uint32 // Atomic flag to signal execution interruption
+ reason error // Textual reason for the interruption
+}
+
+// New instantiates a new tracer instance. code specifies a Javascript snippet,
+// which must evaluate to an expression returning an object with 'step', 'fault'
+// and 'result' functions.
+func New(code string) (*Tracer, error) {
+ // Resolve any tracers by name and assemble the tracer object
+ if tracer, ok := tracer(code); ok {
+ code = tracer
+ }
+ tracer := &Tracer{
+ vm: duktape.New(),
+ ctx: make(map[string]interface{}),
+ opWrapper: new(opWrapper),
+ stackWrapper: new(stackWrapper),
+ memoryWrapper: new(memoryWrapper),
+ contractWrapper: new(contractWrapper),
+ dbWrapper: new(dbWrapper),
+ pcValue: new(uint),
+ gasValue: new(uint),
+ costValue: new(uint),
+ depthValue: new(uint),
+ }
+ // Set up builtins for this environment
+ tracer.vm.PushGlobalGoFunction("toHex", func(ctx *duktape.Context) int {
+ ctx.PushString(hexutil.Encode(popSlice(ctx)))
+ return 1
+ })
+ tracer.vm.PushGlobalGoFunction("toWord", func(ctx *duktape.Context) int {
+ var word common.Hash
+ if ptr, size := ctx.GetBuffer(-1); ptr != nil {
+ word = common.BytesToHash(makeSlice(ptr, size))
+ } else {
+ word = common.HexToHash(ctx.GetString(-1))
+ }
+ ctx.Pop()
+ copy(makeSlice(ctx.PushFixedBuffer(32), 32), word[:])
+ return 1
+ })
+ tracer.vm.PushGlobalGoFunction("toAddress", func(ctx *duktape.Context) int {
+ var addr common.Address
+ if ptr, size := ctx.GetBuffer(-1); ptr != nil {
+ addr = common.BytesToAddress(makeSlice(ptr, size))
+ } else {
+ addr = common.HexToAddress(ctx.GetString(-1))
+ }
+ ctx.Pop()
+ copy(makeSlice(ctx.PushFixedBuffer(20), 20), addr[:])
+ return 1
+ })
+ tracer.vm.PushGlobalGoFunction("toContract", func(ctx *duktape.Context) int {
+ var from common.Address
+ if ptr, size := ctx.GetBuffer(-2); ptr != nil {
+ from = common.BytesToAddress(makeSlice(ptr, size))
+ } else {
+ from = common.HexToAddress(ctx.GetString(-2))
+ }
+ nonce := uint64(ctx.GetInt(-1))
+ ctx.Pop2()
+
+ contract := crypto.CreateAddress(from, nonce)
+ copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:])
+ return 1
+ })
+ tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int {
+ _, ok := vm.PrecompiledContractsByzantium[common.BytesToAddress(popSlice(ctx))]
+ ctx.PushBoolean(ok)
+ return 1
+ })
+ tracer.vm.PushGlobalGoFunction("slice", func(ctx *duktape.Context) int {
+ start, end := ctx.GetInt(-2), ctx.GetInt(-1)
+ ctx.Pop2()
+
+ blob := popSlice(ctx)
+ size := end - start
+
+ if start < 0 || start > end || end > len(blob) {
+ // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go
+ // runtime goes belly up https://github.com/golang/go/issues/15639.
+ log.Warn("Tracer accessed out of bound memory", "available", len(blob), "offset", start, "size", size)
+ ctx.PushFixedBuffer(0)
+ return 1
+ }
+ copy(makeSlice(ctx.PushFixedBuffer(size), uint(size)), blob[start:end])
+ return 1
+ })
+ // Push the JavaScript tracer as object #0 onto the JSVM stack and validate it
+ if err := tracer.vm.PevalString("(" + code + ")"); err != nil {
+ log.Warn("Failed to compile tracer", "err", err)
+ return nil, err
+ }
+ tracer.tracerObject = 0 // yeah, nice, eval can't return the index itself
+
+ if !tracer.vm.GetPropString(tracer.tracerObject, "step") {
+ return nil, fmt.Errorf("Trace object must expose a function step()")
+ }
+ tracer.vm.Pop()
+
+ if !tracer.vm.GetPropString(tracer.tracerObject, "fault") {
+ return nil, fmt.Errorf("Trace object must expose a function fault()")
+ }
+ tracer.vm.Pop()
+
+ if !tracer.vm.GetPropString(tracer.tracerObject, "result") {
+ return nil, fmt.Errorf("Trace object must expose a function result()")
+ }
+ tracer.vm.Pop()
+
+ // Tracer is valid, inject the big int library to access large numbers
+ tracer.vm.EvalString(bigIntegerJS)
+ tracer.vm.PutGlobalString("bigInt")
+
+ // Push the global environment state as object #1 into the JSVM stack
+ tracer.stateObject = tracer.vm.PushObject()
+
+ logObject := tracer.vm.PushObject()
+
+ tracer.opWrapper.pushObject(tracer.vm)
+ tracer.vm.PutPropString(logObject, "op")
+
+ tracer.stackWrapper.pushObject(tracer.vm)
+ tracer.vm.PutPropString(logObject, "stack")
+
+ tracer.memoryWrapper.pushObject(tracer.vm)
+ tracer.vm.PutPropString(logObject, "memory")
+
+ tracer.contractWrapper.pushObject(tracer.vm)
+ tracer.vm.PutPropString(logObject, "contract")
+
+ tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.pcValue); return 1 })
+ tracer.vm.PutPropString(logObject, "getPC")
+
+ tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.gasValue); return 1 })
+ tracer.vm.PutPropString(logObject, "getGas")
+
+ tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.costValue); return 1 })
+ tracer.vm.PutPropString(logObject, "getCost")
+
+ tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.depthValue); return 1 })
+ tracer.vm.PutPropString(logObject, "getDepth")
+
+ tracer.vm.PushGoFunction(func(ctx *duktape.Context) int {
+ if tracer.errorValue != nil {
+ ctx.PushString(*tracer.errorValue)
+ } else {
+ ctx.PushUndefined()
+ }
+ return 1
+ })
+ tracer.vm.PutPropString(logObject, "getError")
+
+ tracer.vm.PutPropString(tracer.stateObject, "log")
+
+ tracer.dbWrapper.pushObject(tracer.vm)
+ tracer.vm.PutPropString(tracer.stateObject, "db")
+
+ return tracer, nil
+}
+
+// Stop terminates execution of the tracer at the first opportune moment.
+func (jst *Tracer) Stop(err error) {
+ jst.reason = err
+ atomic.StoreUint32(&jst.interrupt, 1)
+}
+
+// call executes a method on a JS object, catching any errors, formatting and
+// returning them as error objects.
+func (jst *Tracer) call(method string, args ...string) (json.RawMessage, error) {
+ // Execute the JavaScript call and return any error
+ jst.vm.PushString(method)
+ for _, arg := range args {
+ jst.vm.GetPropString(jst.stateObject, arg)
+ }
+ code := jst.vm.PcallProp(jst.tracerObject, len(args))
+ defer jst.vm.Pop()
+
+ if code != 0 {
+ err := jst.vm.SafeToString(-1)
+ return nil, errors.New(err)
+ }
+ // No error occurred, extract return value and return
+ return json.RawMessage(jst.vm.JsonEncode(-1)), nil
+}
+
+func wrapError(context string, err error) error {
+ var message string
+ switch err := err.(type) {
+ default:
+ message = err.Error()
+ }
+ return fmt.Errorf("%v in server-side tracer function '%v'", message, context)
+}
+
+// CaptureStart implements the Tracer interface to initialize the tracing operation.
+func (jst *Tracer) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error {
+ jst.ctx["type"] = "CALL"
+ if create {
+ jst.ctx["type"] = "CREATE"
+ }
+ jst.ctx["from"] = from
+ jst.ctx["to"] = to
+ jst.ctx["input"] = input
+ jst.ctx["gas"] = gas
+ jst.ctx["value"] = value
+
+ return nil
+}
+
+// CaptureState implements the Tracer interface to trace a single step of VM execution.
+func (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {
+ if jst.err == nil {
+ // Initialize the context if it wasn't done yet
+ if !jst.inited {
+ jst.ctx["block"] = env.BlockNumber.Uint64()
+ jst.inited = true
+ }
+ // If tracing was interrupted, set the error and stop
+ if atomic.LoadUint32(&jst.interrupt) > 0 {
+ jst.err = jst.reason
+ return nil
+ }
+ jst.opWrapper.op = op
+ jst.stackWrapper.stack = stack
+ jst.memoryWrapper.memory = memory
+ jst.contractWrapper.contract = contract
+ jst.dbWrapper.db = env.StateDB
+
+ *jst.pcValue = uint(pc)
+ *jst.gasValue = uint(gas)
+ *jst.costValue = uint(cost)
+ *jst.depthValue = uint(depth)
+
+ jst.errorValue = nil
+ if err != nil {
+ jst.errorValue = new(string)
+ *jst.errorValue = err.Error()
+ }
+ _, err := jst.call("step", "log", "db")
+ if err != nil {
+ jst.err = wrapError("step", err)
+ }
+ }
+ return nil
+}
+
+// CaptureFault implements the Tracer interface to trace an execution fault
+// while running an opcode.
+func (jst *Tracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {
+ if jst.err == nil {
+ // Apart from the error, everything matches the previous invocation
+ jst.errorValue = new(string)
+ *jst.errorValue = err.Error()
+
+ _, err := jst.call("fault", "log", "db")
+ if err != nil {
+ jst.err = wrapError("fault", err)
+ }
+ }
+ return nil
+}
+
+// CaptureEnd is called after the call finishes to finalize the tracing.
+func (jst *Tracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {
+ jst.ctx["output"] = output
+ jst.ctx["gasUsed"] = gasUsed
+ jst.ctx["time"] = t.String()
+
+ if err != nil {
+ jst.ctx["error"] = err.Error()
+ }
+ return nil
+}
+
+// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error
+func (jst *Tracer) GetResult() (json.RawMessage, error) {
+ // Transform the context into a JavaScript object and inject into the state
+ obj := jst.vm.PushObject()
+
+ for key, val := range jst.ctx {
+ switch val := val.(type) {
+ case uint64:
+ jst.vm.PushUint(uint(val))
+
+ case string:
+ jst.vm.PushString(val)
+
+ case []byte:
+ ptr := jst.vm.PushFixedBuffer(len(val))
+ copy(makeSlice(ptr, uint(len(val))), val[:])
+
+ case common.Address:
+ ptr := jst.vm.PushFixedBuffer(20)
+ copy(makeSlice(ptr, 20), val[:])
+
+ case *big.Int:
+ pushBigInt(val, jst.vm)
+
+ default:
+ panic(fmt.Sprintf("unsupported type: %T", val))
+ }
+ jst.vm.PutPropString(obj, key)
+ }
+ jst.vm.PutPropString(jst.stateObject, "ctx")
+
+ // Finalize the trace and return the results
+ result, err := jst.call("result", "ctx", "db")
+ if err != nil {
+ jst.err = wrapError("result", err)
+ }
+ // Clean up the JavaScript environment
+ jst.vm.DestroyHeap()
+ jst.vm.Destroy()
+
+ return result, jst.err
+}
diff --git a/internal/ethapi/tracer_test.go b/eth/tracers/tracer_test.go
index 5093dafd6..7224a1489 100644
--- a/internal/ethapi/tracer_test.go
+++ b/eth/tracers/tracer_test.go
@@ -14,12 +14,13 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-package ethapi
+package tracers
import (
+ "bytes"
+ "encoding/json"
"errors"
"math/big"
- "reflect"
"testing"
"time"
@@ -42,22 +43,21 @@ func (account) ReturnGas(*big.Int) {}
func (account) SetCode(common.Hash, []byte) {}
func (account) ForEachStorage(cb func(key, value common.Hash) bool) {}
-func runTrace(tracer *JavascriptTracer) (interface{}, error) {
- env := vm.NewEVM(vm.Context{}, nil, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer})
+func runTrace(tracer *Tracer) (json.RawMessage, error) {
+ env := vm.NewEVM(vm.Context{BlockNumber: big.NewInt(1)}, nil, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer})
contract := vm.NewContract(account{}, account{}, big.NewInt(0), 10000)
contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x1, 0x0}
- _, err := env.Interpreter().Run(0, contract, []byte{})
+ _, err := env.Interpreter().Run(contract, []byte{})
if err != nil {
return nil, err
}
-
return tracer.GetResult()
}
func TestTracing(t *testing.T) {
- tracer, err := NewJavascriptTracer("{count: 0, step: function() { this.count += 1; }, result: function() { return this.count; }}")
+ tracer, err := New("{count: 0, step: function() { this.count += 1; }, fault: function() {}, result: function() { return this.count; }}")
if err != nil {
t.Fatal(err)
}
@@ -66,18 +66,13 @@ func TestTracing(t *testing.T) {
if err != nil {
t.Fatal(err)
}
-
- value, ok := ret.(float64)
- if !ok {
- t.Errorf("Expected return value to be float64, was %T", ret)
- }
- if value != 3 {
- t.Errorf("Expected return value to be 3, got %v", value)
+ if !bytes.Equal(ret, []byte("3")) {
+ t.Errorf("Expected return value to be 3, got %s", string(ret))
}
}
func TestStack(t *testing.T) {
- tracer, err := NewJavascriptTracer("{depths: [], step: function(log) { this.depths.push(log.stack.length()); }, result: function() { return this.depths; }}")
+ tracer, err := New("{depths: [], step: function(log) { this.depths.push(log.stack.length()); }, fault: function() {}, result: function() { return this.depths; }}")
if err != nil {
t.Fatal(err)
}
@@ -86,15 +81,13 @@ func TestStack(t *testing.T) {
if err != nil {
t.Fatal(err)
}
-
- expected := []int{0, 1, 2}
- if !reflect.DeepEqual(ret, expected) {
- t.Errorf("Expected return value to be %#v, got %#v", expected, ret)
+ if !bytes.Equal(ret, []byte("[0,1,2]")) {
+ t.Errorf("Expected return value to be [0,1,2], got %s", string(ret))
}
}
func TestOpcodes(t *testing.T) {
- tracer, err := NewJavascriptTracer("{opcodes: [], step: function(log) { this.opcodes.push(log.op.toString()); }, result: function() { return this.opcodes; }}")
+ tracer, err := New("{opcodes: [], step: function(log) { this.opcodes.push(log.op.toString()); }, fault: function() {}, result: function() { return this.opcodes; }}")
if err != nil {
t.Fatal(err)
}
@@ -103,16 +96,16 @@ func TestOpcodes(t *testing.T) {
if err != nil {
t.Fatal(err)
}
-
- expected := []string{"PUSH1", "PUSH1", "STOP"}
- if !reflect.DeepEqual(ret, expected) {
- t.Errorf("Expected return value to be %#v, got %#v", expected, ret)
+ if !bytes.Equal(ret, []byte("[\"PUSH1\",\"PUSH1\",\"STOP\"]")) {
+ t.Errorf("Expected return value to be [\"PUSH1\",\"PUSH1\",\"STOP\"], got %s", string(ret))
}
}
func TestHalt(t *testing.T) {
+ t.Skip("duktape doesn't support abortion")
+
timeout := errors.New("stahp")
- tracer, err := NewJavascriptTracer("{step: function() { while(1); }, result: function() { return null; }}")
+ tracer, err := New("{step: function() { while(1); }, result: function() { return null; }}")
if err != nil {
t.Fatal(err)
}
@@ -128,12 +121,12 @@ func TestHalt(t *testing.T) {
}
func TestHaltBetweenSteps(t *testing.T) {
- tracer, err := NewJavascriptTracer("{step: function() {}, result: function() { return null; }}")
+ tracer, err := New("{step: function() {}, fault: function() {}, result: function() { return null; }}")
if err != nil {
t.Fatal(err)
}
- env := vm.NewEVM(vm.Context{}, nil, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer})
+ env := vm.NewEVM(vm.Context{BlockNumber: big.NewInt(1)}, nil, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer})
contract := vm.NewContract(&account{}, &account{}, big.NewInt(0), 0)
tracer.CaptureState(env, 0, 0, 0, 0, nil, nil, contract, 0, nil)
@@ -141,7 +134,7 @@ func TestHaltBetweenSteps(t *testing.T) {
tracer.Stop(timeout)
tracer.CaptureState(env, 0, 0, 0, 0, nil, nil, contract, 0, nil)
- if _, err := tracer.GetResult(); err.Error() != "stahp in server-side tracer function 'step'" {
+ if _, err := tracer.GetResult(); err.Error() != timeout.Error() {
t.Errorf("Expected timeout error, got %v", err)
}
}
diff --git a/eth/tracers/tracers.go b/eth/tracers/tracers.go
new file mode 100644
index 000000000..4e1ef23ad
--- /dev/null
+++ b/eth/tracers/tracers.go
@@ -0,0 +1,53 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// Package tracers is a collection of JavaScript transaction tracers.
+package tracers
+
+import (
+ "strings"
+ "unicode"
+
+ "github.com/ethereum/go-ethereum/eth/tracers/internal/tracers"
+)
+
+// all contains all the built in JavaScript tracers by name.
+var all = make(map[string]string)
+
+// camel converts a snake cased input string into a camel cased output.
+func camel(str string) string {
+ pieces := strings.Split(str, "_")
+ for i := 1; i < len(pieces); i++ {
+ pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:]
+ }
+ return strings.Join(pieces, "")
+}
+
+// init retrieves the JavaScript transaction tracers included in go-ethereum.
+func init() {
+ for _, file := range tracers.AssetNames() {
+ name := camel(strings.TrimSuffix(file, ".js"))
+ all[name] = string(tracers.MustAsset(file))
+ }
+}
+
+// tracer retrieves a specific JavaScript tracer by name.
+func tracer(name string) (string, bool) {
+ if tracer, ok := all[name]; ok {
+ return tracer, true
+ }
+ return "", false
+}
diff --git a/eth/tracers/tracers_test.go b/eth/tracers/tracers_test.go
new file mode 100644
index 000000000..bf8120228
--- /dev/null
+++ b/eth/tracers/tracers_test.go
@@ -0,0 +1,194 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package tracers
+
+import (
+ "encoding/json"
+ "io/ioutil"
+ "math/big"
+ "path/filepath"
+ "reflect"
+ "strings"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/ethereum/go-ethereum/common/math"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/rlp"
+ "github.com/ethereum/go-ethereum/tests"
+)
+
+// To generate a new callTracer test, copy paste the makeTest method below into
+// a Geth console and call it with a transaction hash you which to export.
+
+/*
+// makeTest generates a callTracer test by running a prestate reassembled and a
+// call trace run, assembling all the gathered information into a test case.
+var makeTest = function(tx, rewind) {
+ // Generate the genesis block from the block, transaction and prestate data
+ var block = eth.getBlock(eth.getTransaction(tx).blockHash);
+ var genesis = eth.getBlock(block.parentHash);
+
+ delete genesis.gasUsed;
+ delete genesis.logsBloom;
+ delete genesis.parentHash;
+ delete genesis.receiptsRoot;
+ delete genesis.sha3Uncles;
+ delete genesis.size;
+ delete genesis.transactions;
+ delete genesis.transactionsRoot;
+ delete genesis.uncles;
+
+ genesis.gasLimit = genesis.gasLimit.toString();
+ genesis.number = genesis.number.toString();
+ genesis.timestamp = genesis.timestamp.toString();
+
+ genesis.alloc = debug.traceTransaction(tx, {tracer: "prestateTracer", rewind: rewind});
+ for (var key in genesis.alloc) {
+ genesis.alloc[key].nonce = genesis.alloc[key].nonce.toString();
+ }
+ genesis.config = admin.nodeInfo.protocols.eth.config;
+
+ // Generate the call trace and produce the test input
+ var result = debug.traceTransaction(tx, {tracer: "callTracer", rewind: rewind});
+ delete result.time;
+
+ console.log(JSON.stringify({
+ genesis: genesis,
+ context: {
+ number: block.number.toString(),
+ difficulty: block.difficulty,
+ timestamp: block.timestamp.toString(),
+ gasLimit: block.gasLimit.toString(),
+ miner: block.miner,
+ },
+ input: eth.getRawTransaction(tx),
+ result: result,
+ }, null, 2));
+}
+*/
+
+// callTrace is the result of a callTracer run.
+type callTrace struct {
+ Type string `json:"type"`
+ From common.Address `json:"from"`
+ To common.Address `json:"to"`
+ Input hexutil.Bytes `json:"input"`
+ Output hexutil.Bytes `json:"output"`
+ Gas *hexutil.Uint64 `json:"gas,omitempty"`
+ GasUsed *hexutil.Uint64 `json:"gasUsed,omitempty"`
+ Value *hexutil.Big `json:"value,omitempty"`
+ Error string `json:"error,omitempty"`
+ Calls []callTrace `json:"calls,omitempty"`
+}
+
+type callContext struct {
+ Number math.HexOrDecimal64 `json:"number"`
+ Difficulty *math.HexOrDecimal256 `json:"difficulty"`
+ Time math.HexOrDecimal64 `json:"timestamp"`
+ GasLimit math.HexOrDecimal64 `json:"gasLimit"`
+ Miner common.Address `json:"miner"`
+}
+
+// callTracerTest defines a single test to check the call tracer against.
+type callTracerTest struct {
+ Genesis *core.Genesis `json:"genesis"`
+ Context *callContext `json:"context"`
+ Input string `json:"input"`
+ Result *callTrace `json:"result"`
+}
+
+// Iterates over all the input-output datasets in the tracer test harness and
+// runs the JavaScript tracers against them.
+func TestCallTracer(t *testing.T) {
+ files, err := ioutil.ReadDir("testdata")
+ if err != nil {
+ t.Fatalf("failed to retrieve tracer test suite: %v", err)
+ }
+ for _, file := range files {
+ if !strings.HasPrefix(file.Name(), "call_tracer_") {
+ continue
+ }
+ file := file // capture range variable
+ t.Run(camel(strings.TrimSuffix(strings.TrimPrefix(file.Name(), "call_tracer_"), ".json")), func(t *testing.T) {
+ t.Parallel()
+
+ // Call tracer test found, read if from disk
+ blob, err := ioutil.ReadFile(filepath.Join("testdata", file.Name()))
+ if err != nil {
+ t.Fatalf("failed to read testcase: %v", err)
+ }
+ test := new(callTracerTest)
+ if err := json.Unmarshal(blob, test); err != nil {
+ t.Fatalf("failed to parse testcase: %v", err)
+ }
+ // Configure a blockchain with the given prestate
+ tx := new(types.Transaction)
+ if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil {
+ t.Fatalf("failed to parse testcase input: %v", err)
+ }
+ signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)))
+ origin, _ := signer.Sender(tx)
+
+ context := vm.Context{
+ CanTransfer: core.CanTransfer,
+ Transfer: core.Transfer,
+ Origin: origin,
+ Coinbase: test.Context.Miner,
+ BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)),
+ Time: new(big.Int).SetUint64(uint64(test.Context.Time)),
+ Difficulty: (*big.Int)(test.Context.Difficulty),
+ GasLimit: uint64(test.Context.GasLimit),
+ GasPrice: tx.GasPrice(),
+ }
+ db, _ := ethdb.NewMemDatabase()
+ statedb := tests.MakePreState(db, test.Genesis.Alloc)
+
+ // Create the tracer, the EVM environment and run it
+ tracer, err := New("callTracer")
+ if err != nil {
+ t.Fatalf("failed to create call tracer: %v", err)
+ }
+ evm := vm.NewEVM(context, statedb, test.Genesis.Config, vm.Config{Debug: true, Tracer: tracer})
+
+ msg, err := tx.AsMessage(signer)
+ if err != nil {
+ t.Fatalf("failed to prepare transaction for tracing: %v", err)
+ }
+ st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
+ if _, _, _, err = st.TransitionDb(); err != nil {
+ t.Fatalf("failed to execute transaction: %v", err)
+ }
+ // Retrieve the trace result and compare against the etalon
+ res, err := tracer.GetResult()
+ if err != nil {
+ t.Fatalf("failed to retrieve trace result: %v", err)
+ }
+ ret := new(callTrace)
+ if err := json.Unmarshal(res, ret); err != nil {
+ t.Fatalf("failed to unmarshal trace result: %v", err)
+ }
+ if !reflect.DeepEqual(ret, test.Result) {
+ t.Fatalf("trace mismatch: have %+v, want %+v", ret, test.Result)
+ }
+ })
+ }
+}
diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go
index 7f73ab113..87a912901 100644
--- a/ethclient/ethclient.go
+++ b/ethclient/ethclient.go
@@ -455,13 +455,13 @@ func (ec *Client) SuggestGasPrice(ctx context.Context) (*big.Int, error) {
// the current pending state of the backend blockchain. There is no guarantee that this is
// the true gas limit requirement as other transactions may be added or removed by miners,
// but it should provide a basis for setting a reasonable default.
-func (ec *Client) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (*big.Int, error) {
- var hex hexutil.Big
+func (ec *Client) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) {
+ var hex hexutil.Uint64
err := ec.c.CallContext(ctx, &hex, "eth_estimateGas", toCallArg(msg))
if err != nil {
- return nil, err
+ return 0, err
}
- return (*big.Int)(&hex), nil
+ return uint64(hex), nil
}
// SendTransaction injects a signed transaction into the pending pool for execution.
@@ -487,8 +487,8 @@ func toCallArg(msg ethereum.CallMsg) interface{} {
if msg.Value != nil {
arg["value"] = (*hexutil.Big)(msg.Value)
}
- if msg.Gas != nil {
- arg["gas"] = (*hexutil.Big)(msg.Gas)
+ if msg.Gas != 0 {
+ arg["gas"] = hexutil.Uint64(msg.Gas)
}
if msg.GasPrice != nil {
arg["gasPrice"] = (*hexutil.Big)(msg.GasPrice)
diff --git a/ethdb/database.go b/ethdb/database.go
index 93755dd7e..d86585f07 100644
--- a/ethdb/database.go
+++ b/ethdb/database.go
@@ -299,6 +299,11 @@ func (b *ldbBatch) ValueSize() int {
return b.size
}
+func (b *ldbBatch) Reset() {
+ b.b.Reset()
+ b.size = 0
+}
+
type table struct {
db Database
prefix string
@@ -358,3 +363,7 @@ func (tb *tableBatch) Write() error {
func (tb *tableBatch) ValueSize() int {
return tb.batch.ValueSize()
}
+
+func (tb *tableBatch) Reset() {
+ tb.batch.Reset()
+}
diff --git a/ethdb/interface.go b/ethdb/interface.go
index 99a5b770d..537312003 100644
--- a/ethdb/interface.go
+++ b/ethdb/interface.go
@@ -41,4 +41,6 @@ type Batch interface {
Putter
ValueSize() int // amount of data in the batch
Write() error
+ // Reset resets the batch for reuse
+ Reset()
}
diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go
index 699bd0c9f..8efd7bf84 100644
--- a/ethdb/memory_database.go
+++ b/ethdb/memory_database.go
@@ -37,6 +37,12 @@ func NewMemDatabase() (*MemDatabase, error) {
}, nil
}
+func NewMemDatabaseWithCap(size int) (*MemDatabase, error) {
+ return &MemDatabase{
+ db: make(map[string][]byte, size),
+ }, nil
+}
+
func (db *MemDatabase) Put(key []byte, value []byte) error {
db.lock.Lock()
defer db.lock.Unlock()
@@ -74,14 +80,6 @@ func (db *MemDatabase) Keys() [][]byte {
return keys
}
-/*
-func (db *MemDatabase) GetKeys() []*common.Key {
- data, _ := db.Get([]byte("KeyRing"))
-
- return []*common.Key{common.NewKeyFromBytes(data)}
-}
-*/
-
func (db *MemDatabase) Delete(key []byte) error {
db.lock.Lock()
defer db.lock.Unlock()
@@ -96,6 +94,8 @@ func (db *MemDatabase) NewBatch() Batch {
return &memBatch{db: db}
}
+func (db *MemDatabase) Len() int { return len(db.db) }
+
type kv struct{ k, v []byte }
type memBatch struct {
@@ -123,3 +123,8 @@ func (b *memBatch) Write() error {
func (b *memBatch) ValueSize() int {
return b.size
}
+
+func (b *memBatch) Reset() {
+ b.writes = b.writes[:0]
+ b.size = 0
+}
diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go
index 7065d7162..ae7e25265 100644
--- a/ethstats/ethstats.go
+++ b/ethstats/ethstats.go
@@ -374,10 +374,10 @@ func (s *Service) login(conn *websocket.Conn) error {
var network, protocol string
if info := infos.Protocols["eth"]; info != nil {
- network = fmt.Sprintf("%d", info.(*eth.EthNodeInfo).Network)
+ network = fmt.Sprintf("%d", info.(*eth.NodeInfo).Network)
protocol = fmt.Sprintf("eth/%d", eth.ProtocolVersions[0])
} else {
- network = fmt.Sprintf("%d", infos.Protocols["les"].(*eth.EthNodeInfo).Network)
+ network = fmt.Sprintf("%d", infos.Protocols["les"].(*les.NodeInfo).Network)
protocol = fmt.Sprintf("les/%d", les.ClientProtocolVersions[0])
}
auth := &authMsg{
@@ -473,8 +473,8 @@ type blockStats struct {
ParentHash common.Hash `json:"parentHash"`
Timestamp *big.Int `json:"timestamp"`
Miner common.Address `json:"miner"`
- GasUsed *big.Int `json:"gasUsed"`
- GasLimit *big.Int `json:"gasLimit"`
+ GasUsed uint64 `json:"gasUsed"`
+ GasLimit uint64 `json:"gasLimit"`
Diff string `json:"difficulty"`
TotalDiff string `json:"totalDifficulty"`
Txs []txStats `json:"transactions"`
@@ -559,8 +559,8 @@ func (s *Service) assembleBlockStats(block *types.Block) *blockStats {
ParentHash: header.ParentHash,
Timestamp: header.Time,
Miner: author,
- GasUsed: new(big.Int).Set(header.GasUsed),
- GasLimit: new(big.Int).Set(header.GasLimit),
+ GasUsed: header.GasUsed,
+ GasLimit: header.GasLimit,
Diff: header.Difficulty.String(),
TotalDiff: td.String(),
Txs: txs,
@@ -613,6 +613,7 @@ func (s *Service) reportHistory(conn *websocket.Conn, list []uint64) error {
}
// Ran out of blocks, cut the report short and send
history = history[len(history)-i:]
+ break
}
// Assemble the history report and send it to the server
if len(history) > 0 {
diff --git a/interfaces.go b/interfaces.go
index 67f236ef7..1ae1eba48 100644
--- a/interfaces.go
+++ b/interfaces.go
@@ -115,7 +115,7 @@ type ChainSyncReader interface {
type CallMsg struct {
From common.Address // the sender of the 'transaction'
To *common.Address // the destination contract (nil for contract creation)
- Gas *big.Int // if nil, the call executes with near-infinite gas
+ Gas uint64 // if 0, the call executes with near-infinite gas
GasPrice *big.Int // wei <-> gas exchange ratio
Value *big.Int // amount of wei sent along with the call
Data []byte // input data, usually an ABI-encoded contract method invocation
@@ -200,7 +200,7 @@ type PendingContractCaller interface {
// true gas limit requirement as other transactions may be added or removed by miners, but
// it should provide a basis for setting a reasonable default.
type GasEstimator interface {
- EstimateGas(ctx context.Context, call CallMsg) (usedGas *big.Int, err error)
+ EstimateGas(ctx context.Context, call CallMsg) (uint64, error)
}
// A PendingStateEventer provides access to real time notifications about changes to the
diff --git a/internal/cmdtest/test_cmd.go b/internal/cmdtest/test_cmd.go
index 541e51c4c..fae61cfe3 100644
--- a/internal/cmdtest/test_cmd.go
+++ b/internal/cmdtest/test_cmd.go
@@ -25,6 +25,7 @@ import (
"os"
"os/exec"
"regexp"
+ "strings"
"sync"
"testing"
"text/template"
@@ -141,9 +142,10 @@ func (tt *TestCmd) matchExactOutput(want []byte) error {
// Note that an arbitrary amount of output may be consumed by the
// regular expression. This usually means that expect cannot be used
// after ExpectRegexp.
-func (tt *TestCmd) ExpectRegexp(resource string) (*regexp.Regexp, []string) {
+func (tt *TestCmd) ExpectRegexp(regex string) (*regexp.Regexp, []string) {
+ regex = strings.TrimPrefix(regex, "\n")
var (
- re = regexp.MustCompile(resource)
+ re = regexp.MustCompile(regex)
rtee = &runeTee{in: tt.stdout}
matches []int
)
@@ -151,7 +153,7 @@ func (tt *TestCmd) ExpectRegexp(resource string) (*regexp.Regexp, []string) {
output := rtee.buf.Bytes()
if matches == nil {
tt.Fatalf("Output did not match:\n---------------- (stdout text)\n%s\n---------------- (regular expression)\n%s",
- output, resource)
+ output, regex)
return re, nil
}
tt.Logf("Matched stdout text:\n%s", output)
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go
index fe0ed8170..314086335 100644
--- a/internal/ethapi/api.go
+++ b/internal/ethapi/api.go
@@ -17,6 +17,7 @@
package ethapi
import (
+ "bytes"
"context"
"errors"
"fmt"
@@ -44,7 +45,6 @@ import (
)
const (
- defaultGas = 90000
defaultGasPrice = 50 * params.Shannon
)
@@ -333,28 +333,19 @@ func (s *PrivateAccountAPI) LockAccount(addr common.Address) bool {
return fetchKeystore(s.am).Lock(addr) == nil
}
-// SendTransaction will create a transaction from the given arguments and
-// tries to sign it with the key associated with args.To. If the given passwd isn't
-// able to decrypt the key it fails.
-func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs, passwd string) (common.Hash, error) {
+// signTransactions sets defaults and signs the given transaction
+// NOTE: the caller needs to ensure that the nonceLock is held, if applicable,
+// and release it after the transaction has been submitted to the tx pool
+func (s *PrivateAccountAPI) signTransaction(ctx context.Context, args SendTxArgs, passwd string) (*types.Transaction, error) {
// Look up the wallet containing the requested signer
account := accounts.Account{Address: args.From}
-
wallet, err := s.am.Find(account)
if err != nil {
- return common.Hash{}, err
- }
-
- if args.Nonce == nil {
- // Hold the addresse's mutex around signing to prevent concurrent assignment of
- // the same nonce to multiple accounts.
- s.nonceLock.LockAddr(args.From)
- defer s.nonceLock.UnlockAddr(args.From)
+ return nil, err
}
-
// Set some sanity defaults and terminate on failure
if err := args.setDefaults(ctx, s.b); err != nil {
- return common.Hash{}, err
+ return nil, err
}
// Assemble the transaction and sign with the wallet
tx := args.toTransaction()
@@ -363,13 +354,53 @@ func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs
if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) {
chainID = config.ChainId
}
- signed, err := wallet.SignTxWithPassphrase(account, passwd, tx, chainID)
+ return wallet.SignTxWithPassphrase(account, passwd, tx, chainID)
+}
+
+// SendTransaction will create a transaction from the given arguments and
+// tries to sign it with the key associated with args.To. If the given passwd isn't
+// able to decrypt the key it fails.
+func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs, passwd string) (common.Hash, error) {
+ if args.Nonce == nil {
+ // Hold the addresse's mutex around signing to prevent concurrent assignment of
+ // the same nonce to multiple accounts.
+ s.nonceLock.LockAddr(args.From)
+ defer s.nonceLock.UnlockAddr(args.From)
+ }
+ signed, err := s.signTransaction(ctx, args, passwd)
if err != nil {
return common.Hash{}, err
}
return submitTransaction(ctx, s.b, signed)
}
+// SignTransaction will create a transaction from the given arguments and
+// tries to sign it with the key associated with args.To. If the given passwd isn't
+// able to decrypt the key it fails. The transaction is returned in RLP-form, not broadcast
+// to other nodes
+func (s *PrivateAccountAPI) SignTransaction(ctx context.Context, args SendTxArgs, passwd string) (*SignTransactionResult, error) {
+ // No need to obtain the noncelock mutex, since we won't be sending this
+ // tx into the transaction pool, but right back to the user
+ if args.Gas == nil {
+ return nil, fmt.Errorf("gas not specified")
+ }
+ if args.GasPrice == nil {
+ return nil, fmt.Errorf("gasPrice not specified")
+ }
+ if args.Nonce == nil {
+ return nil, fmt.Errorf("nonce not specified")
+ }
+ signed, err := s.signTransaction(ctx, args, passwd)
+ if err != nil {
+ return nil, err
+ }
+ data, err := rlp.EncodeToBytes(signed)
+ if err != nil {
+ return nil, err
+ }
+ return &SignTransactionResult{data, signed}, nil
+}
+
// signHash is a helper function that calculates a hash for the given message that can be
// safely used to calculate a signature from.
//
@@ -574,18 +605,18 @@ func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.A
type CallArgs struct {
From common.Address `json:"from"`
To *common.Address `json:"to"`
- Gas hexutil.Big `json:"gas"`
+ Gas hexutil.Uint64 `json:"gas"`
GasPrice hexutil.Big `json:"gasPrice"`
Value hexutil.Big `json:"value"`
Data hexutil.Bytes `json:"data"`
}
-func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config) ([]byte, *big.Int, bool, error) {
+func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config) ([]byte, uint64, bool, error) {
defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now())
state, header, err := s.b.StateAndHeaderByNumber(ctx, blockNr)
if state == nil || err != nil {
- return nil, common.Big0, false, err
+ return nil, 0, false, err
}
// Set sender address or use a default if none specified
addr := args.From
@@ -597,9 +628,9 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr
}
}
// Set default gas & gas price if none were set
- gas, gasPrice := args.Gas.ToInt(), args.GasPrice.ToInt()
- if gas.Sign() == 0 {
- gas = big.NewInt(50000000)
+ gas, gasPrice := uint64(args.Gas), args.GasPrice.ToInt()
+ if gas == 0 {
+ gas = 50000000
}
if gasPrice.Sign() == 0 {
gasPrice = new(big.Int).SetUint64(defaultGasPrice)
@@ -623,7 +654,7 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr
// Get a new instance of the EVM.
evm, vmError, err := s.b.GetEVM(ctx, msg, state, header, vmCfg)
if err != nil {
- return nil, common.Big0, false, err
+ return nil, 0, false, err
}
// Wait for the context to be done and cancel the evm. Even if the
// EVM has finished, cancelling may be done (repeatedly)
@@ -634,10 +665,10 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr
// Setup the gas pool (also for unmetered requests)
// and apply the message.
- gp := new(core.GasPool).AddGas(math.MaxBig256)
+ gp := new(core.GasPool).AddGas(math.MaxUint64)
res, gas, failed, err := core.ApplyMessage(evm, msg, gp)
if err := vmError(); err != nil {
- return nil, common.Big0, false, err
+ return nil, 0, false, err
}
return res, gas, failed, err
}
@@ -651,28 +682,29 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr r
// EstimateGas returns an estimate of the amount of gas needed to execute the
// given transaction against the current pending block.
-func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (*hexutil.Big, error) {
- // Determine the lowest and highest possible gas limits to binary search in between
+func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) {
+ // Binary search the gas requirement, as it may be higher than the amount used
var (
lo uint64 = params.TxGas - 1
hi uint64
cap uint64
)
- if (*big.Int)(&args.Gas).Uint64() >= params.TxGas {
- hi = (*big.Int)(&args.Gas).Uint64()
+ if uint64(args.Gas) >= params.TxGas {
+ hi = uint64(args.Gas)
} else {
// Retrieve the current pending block to act as the gas ceiling
block, err := s.b.BlockByNumber(ctx, rpc.PendingBlockNumber)
if err != nil {
- return nil, err
+ return 0, err
}
- hi = block.GasLimit().Uint64()
+ hi = block.GasLimit()
}
cap = hi
// Create a helper to check if a gas allowance results in an executable transaction
executable := func(gas uint64) bool {
- (*big.Int)(&args.Gas).SetUint64(gas)
+ args.Gas = hexutil.Uint64(gas)
+
_, _, failed, err := s.doCall(ctx, args, rpc.PendingBlockNumber, vm.Config{})
if err != nil || failed {
return false
@@ -691,17 +723,17 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (*
// Reject the transaction as invalid if it still fails at the highest allowance
if hi == cap {
if !executable(hi) {
- return nil, fmt.Errorf("gas required exceeds allowance or always failing transaction")
+ return 0, fmt.Errorf("gas required exceeds allowance or always failing transaction")
}
}
- return (*hexutil.Big)(new(big.Int).SetUint64(hi)), nil
+ return hexutil.Uint64(hi), nil
}
// ExecutionResult groups all structured logs emitted by the EVM
// while replaying a transaction in debug mode as well as transaction
// execution status, the amount of gas used and the return value
type ExecutionResult struct {
- Gas *big.Int `json:"gas"`
+ Gas uint64 `json:"gas"`
Failed bool `json:"failed"`
ReturnValue string `json:"returnValue"`
StructLogs []StructLogRes `json:"structLogs"`
@@ -776,9 +808,9 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx
"difficulty": (*hexutil.Big)(head.Difficulty),
"totalDifficulty": (*hexutil.Big)(s.b.GetTd(b.Hash())),
"extraData": hexutil.Bytes(head.Extra),
- "size": hexutil.Uint64(uint64(b.Size().Int64())),
- "gasLimit": (*hexutil.Big)(head.GasLimit),
- "gasUsed": (*hexutil.Big)(head.GasUsed),
+ "size": hexutil.Uint64(b.Size()),
+ "gasLimit": hexutil.Uint64(head.GasLimit),
+ "gasUsed": hexutil.Uint64(head.GasUsed),
"timestamp": (*hexutil.Big)(head.Time),
"transactionsRoot": head.TxHash,
"receiptsRoot": head.ReceiptHash,
@@ -821,7 +853,7 @@ type RPCTransaction struct {
BlockHash common.Hash `json:"blockHash"`
BlockNumber *hexutil.Big `json:"blockNumber"`
From common.Address `json:"from"`
- Gas *hexutil.Big `json:"gas"`
+ Gas hexutil.Uint64 `json:"gas"`
GasPrice *hexutil.Big `json:"gasPrice"`
Hash common.Hash `json:"hash"`
Input hexutil.Bytes `json:"input"`
@@ -846,7 +878,7 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber
result := &RPCTransaction{
From: from,
- Gas: (*hexutil.Big)(tx.Gas()),
+ Gas: hexutil.Uint64(tx.Gas()),
GasPrice: (*hexutil.Big)(tx.GasPrice()),
Hash: tx.Hash(),
Input: hexutil.Bytes(tx.Data()),
@@ -1003,9 +1035,12 @@ func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context,
func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) {
tx, blockHash, blockNumber, index := core.GetTransaction(s.b.ChainDb(), hash)
if tx == nil {
- return nil, nil
+ return nil, errors.New("unknown transaction")
}
receipt, _, _, _ := core.GetReceipt(s.b.ChainDb(), hash) // Old receipts don't have the lookup data available
+ if receipt == nil {
+ return nil, errors.New("unknown receipt")
+ }
var signer types.Signer = types.FrontierSigner{}
if tx.Protected() {
@@ -1020,8 +1055,8 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[
"transactionIndex": hexutil.Uint64(index),
"from": from,
"to": tx.To(),
- "gasUsed": (*hexutil.Big)(receipt.GasUsed),
- "cumulativeGasUsed": (*hexutil.Big)(receipt.CumulativeGasUsed),
+ "gasUsed": hexutil.Uint64(receipt.GasUsed),
+ "cumulativeGasUsed": hexutil.Uint64(receipt.CumulativeGasUsed),
"contractAddress": nil,
"logs": receipt.Logs,
"logsBloom": receipt.Bloom,
@@ -1064,17 +1099,21 @@ func (s *PublicTransactionPoolAPI) sign(addr common.Address, tx *types.Transacti
type SendTxArgs struct {
From common.Address `json:"from"`
To *common.Address `json:"to"`
- Gas *hexutil.Big `json:"gas"`
+ Gas *hexutil.Uint64 `json:"gas"`
GasPrice *hexutil.Big `json:"gasPrice"`
Value *hexutil.Big `json:"value"`
- Data hexutil.Bytes `json:"data"`
Nonce *hexutil.Uint64 `json:"nonce"`
+ // We accept "data" and "input" for backwards-compatibility reasons. "input" is the
+ // newer name and should be preferred by clients.
+ Data *hexutil.Bytes `json:"data"`
+ Input *hexutil.Bytes `json:"input"`
}
// setDefaults is a helper function that fills in default values for unspecified tx fields.
func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error {
if args.Gas == nil {
- args.Gas = (*hexutil.Big)(big.NewInt(defaultGas))
+ args.Gas = new(hexutil.Uint64)
+ *(*uint64)(args.Gas) = 90000
}
if args.GasPrice == nil {
price, err := b.SuggestPrice(ctx)
@@ -1093,14 +1132,23 @@ func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error {
}
args.Nonce = (*hexutil.Uint64)(&nonce)
}
+ if args.Data != nil && args.Input != nil && !bytes.Equal(*args.Data, *args.Input) {
+ return errors.New(`Both "data" and "input" are set and not equal. Please use "input" to pass transaction call data.`)
+ }
return nil
}
func (args *SendTxArgs) toTransaction() *types.Transaction {
+ var input []byte
+ if args.Data != nil {
+ input = *args.Data
+ } else if args.Input != nil {
+ input = *args.Input
+ }
if args.To == nil {
- return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), (*big.Int)(args.Gas), (*big.Int)(args.GasPrice), args.Data)
+ return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input)
}
- return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), (*big.Int)(args.Gas), (*big.Int)(args.GasPrice), args.Data)
+ return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input)
}
// submitTransaction is a helper function that submits tx to txPool and logs a message.
@@ -1204,11 +1252,14 @@ type SignTransactionResult struct {
// The node needs to have the private key of the account corresponding with
// the given from address and it needs to be unlocked.
func (s *PublicTransactionPoolAPI) SignTransaction(ctx context.Context, args SendTxArgs) (*SignTransactionResult, error) {
+ if args.Gas == nil {
+ return nil, fmt.Errorf("gas not specified")
+ }
+ if args.GasPrice == nil {
+ return nil, fmt.Errorf("gasPrice not specified")
+ }
if args.Nonce == nil {
- // Hold the addresse's mutex around signing to prevent concurrent assignment of
- // the same nonce to multiple accounts.
- s.nonceLock.LockAddr(args.From)
- defer s.nonceLock.UnlockAddr(args.From)
+ return nil, fmt.Errorf("nonce not specified")
}
if err := args.setDefaults(ctx, s.b); err != nil {
return nil, err
@@ -1248,7 +1299,7 @@ func (s *PublicTransactionPoolAPI) PendingTransactions() ([]*RPCTransaction, err
// Resend accepts an existing transaction and a new gas price and limit. It will remove
// the given transaction from the pool and reinsert it with the new gas price and limit.
-func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxArgs, gasPrice, gasLimit *hexutil.Big) (common.Hash, error) {
+func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxArgs, gasPrice *hexutil.Big, gasLimit *hexutil.Uint64) (common.Hash, error) {
if sendArgs.Nonce == nil {
return common.Hash{}, fmt.Errorf("missing transaction nonce in transaction spec")
}
diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go
index 368fa4872..af95d7906 100644
--- a/internal/ethapi/backend.go
+++ b/internal/ethapi/backend.go
@@ -37,13 +37,14 @@ import (
// Backend interface provides the common API services (that are provided by
// both full and light clients) with access to necessary functions.
type Backend interface {
- // general Ethereum API
+ // General Ethereum API
Downloader() *downloader.Downloader
ProtocolVersion() int
SuggestPrice(ctx context.Context) (*big.Int, error)
ChainDb() ethdb.Database
EventMux() *event.TypeMux
AccountManager() *accounts.Manager
+
// BlockChain API
SetHead(number uint64)
HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error)
diff --git a/internal/ethapi/tracer.go b/internal/ethapi/tracer.go
deleted file mode 100644
index 71cafc6e9..000000000
--- a/internal/ethapi/tracer.go
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2016 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-package ethapi
-
-import (
- "encoding/json"
- "errors"
- "fmt"
- "math/big"
- "time"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/core/vm"
- "github.com/robertkrimen/otto"
-)
-
-// fakeBig is used to provide an interface to Javascript for 'big.NewInt'
-type fakeBig struct{}
-
-// NewInt creates a new big.Int with the specified int64 value.
-func (fb *fakeBig) NewInt(x int64) *big.Int {
- return big.NewInt(x)
-}
-
-// OpCodeWrapper provides a JavaScript-friendly wrapper around OpCode, to convince Otto to treat it
-// as an object, instead of a number.
-type opCodeWrapper struct {
- op vm.OpCode
-}
-
-// toNumber returns the ID of this opcode as an integer
-func (ocw *opCodeWrapper) toNumber() int {
- return int(ocw.op)
-}
-
-// toString returns the string representation of the opcode
-func (ocw *opCodeWrapper) toString() string {
- return ocw.op.String()
-}
-
-// isPush returns true if the op is a Push
-func (ocw *opCodeWrapper) isPush() bool {
- return ocw.op.IsPush()
-}
-
-// MarshalJSON serializes the opcode as JSON
-func (ocw *opCodeWrapper) MarshalJSON() ([]byte, error) {
- return json.Marshal(ocw.op.String())
-}
-
-// toValue returns an otto.Value for the opCodeWrapper
-func (ocw *opCodeWrapper) toValue(vm *otto.Otto) otto.Value {
- value, _ := vm.ToValue(ocw)
- obj := value.Object()
- obj.Set("toNumber", ocw.toNumber)
- obj.Set("toString", ocw.toString)
- obj.Set("isPush", ocw.isPush)
- return value
-}
-
-// memoryWrapper provides a JS wrapper around vm.Memory
-type memoryWrapper struct {
- memory *vm.Memory
-}
-
-// slice returns the requested range of memory as a byte slice
-func (mw *memoryWrapper) slice(begin, end int64) []byte {
- return mw.memory.Get(begin, end-begin)
-}
-
-// getUint returns the 32 bytes at the specified address interpreted
-// as an unsigned integer
-func (mw *memoryWrapper) getUint(addr int64) *big.Int {
- ret := big.NewInt(0)
- ret.SetBytes(mw.memory.GetPtr(addr, 32))
- return ret
-}
-
-// toValue returns an otto.Value for the memoryWrapper
-func (mw *memoryWrapper) toValue(vm *otto.Otto) otto.Value {
- value, _ := vm.ToValue(mw)
- obj := value.Object()
- obj.Set("slice", mw.slice)
- obj.Set("getUint", mw.getUint)
- return value
-}
-
-// stackWrapper provides a JS wrapper around vm.Stack
-type stackWrapper struct {
- stack *vm.Stack
-}
-
-// peek returns the nth-from-the-top element of the stack.
-func (sw *stackWrapper) peek(idx int) *big.Int {
- return sw.stack.Data()[len(sw.stack.Data())-idx-1]
-}
-
-// length returns the length of the stack
-func (sw *stackWrapper) length() int {
- return len(sw.stack.Data())
-}
-
-// toValue returns an otto.Value for the stackWrapper
-func (sw *stackWrapper) toValue(vm *otto.Otto) otto.Value {
- value, _ := vm.ToValue(sw)
- obj := value.Object()
- obj.Set("peek", sw.peek)
- obj.Set("length", sw.length)
- return value
-}
-
-// dbWrapper provides a JS wrapper around vm.Database
-type dbWrapper struct {
- db vm.StateDB
-}
-
-// getBalance retrieves an account's balance
-func (dw *dbWrapper) getBalance(addr []byte) *big.Int {
- return dw.db.GetBalance(common.BytesToAddress(addr))
-}
-
-// getNonce retrieves an account's nonce
-func (dw *dbWrapper) getNonce(addr []byte) uint64 {
- return dw.db.GetNonce(common.BytesToAddress(addr))
-}
-
-// getCode retrieves an account's code
-func (dw *dbWrapper) getCode(addr []byte) []byte {
- return dw.db.GetCode(common.BytesToAddress(addr))
-}
-
-// getState retrieves an account's state data for the given hash
-func (dw *dbWrapper) getState(addr []byte, hash common.Hash) common.Hash {
- return dw.db.GetState(common.BytesToAddress(addr), hash)
-}
-
-// exists returns true iff the account exists
-func (dw *dbWrapper) exists(addr []byte) bool {
- return dw.db.Exist(common.BytesToAddress(addr))
-}
-
-// toValue returns an otto.Value for the dbWrapper
-func (dw *dbWrapper) toValue(vm *otto.Otto) otto.Value {
- value, _ := vm.ToValue(dw)
- obj := value.Object()
- obj.Set("getBalance", dw.getBalance)
- obj.Set("getNonce", dw.getNonce)
- obj.Set("getCode", dw.getCode)
- obj.Set("getState", dw.getState)
- obj.Set("exists", dw.exists)
- return value
-}
-
-// contractWrapper provides a JS wrapper around vm.Contract
-type contractWrapper struct {
- contract *vm.Contract
-}
-
-func (c *contractWrapper) caller() common.Address {
- return c.contract.Caller()
-}
-
-func (c *contractWrapper) address() common.Address {
- return c.contract.Address()
-}
-
-func (c *contractWrapper) value() *big.Int {
- return c.contract.Value()
-}
-
-func (c *contractWrapper) calldata() []byte {
- return c.contract.Input
-}
-
-func (c *contractWrapper) toValue(vm *otto.Otto) otto.Value {
- value, _ := vm.ToValue(c)
- obj := value.Object()
- obj.Set("caller", c.caller)
- obj.Set("address", c.address)
- obj.Set("value", c.value)
- obj.Set("calldata", c.calldata)
- return value
-}
-
-// JavascriptTracer provides an implementation of Tracer that evaluates a
-// Javascript function for each VM execution step.
-type JavascriptTracer struct {
- vm *otto.Otto // Javascript VM instance
- traceobj *otto.Object // User-supplied object to call
- op *opCodeWrapper // Wrapper around the VM opcode
- log map[string]interface{} // (Reusable) map for the `log` arg to `step`
- logvalue otto.Value // JS view of `log`
- memory *memoryWrapper // Wrapper around the VM memory
- stack *stackWrapper // Wrapper around the VM stack
- db *dbWrapper // Wrapper around the VM environment
- dbvalue otto.Value // JS view of `db`
- contract *contractWrapper // Wrapper around the contract object
- err error // Error, if one has occurred
- result interface{} // Final result to return to the user
-}
-
-// NewJavascriptTracer instantiates a new JavascriptTracer instance.
-// code specifies a Javascript snippet, which must evaluate to an expression
-// returning an object with 'step' and 'result' functions.
-func NewJavascriptTracer(code string) (*JavascriptTracer, error) {
- vm := otto.New()
- vm.Interrupt = make(chan func(), 1)
-
- // Set up builtins for this environment
- vm.Set("big", &fakeBig{})
- vm.Set("toHex", hexutil.Encode)
-
- jstracer, err := vm.Object("(" + code + ")")
- if err != nil {
- return nil, err
- }
- // Check the required functions exist
- step, err := jstracer.Get("step")
- if err != nil {
- return nil, err
- }
- if !step.IsFunction() {
- return nil, fmt.Errorf("Trace object must expose a function step()")
- }
-
- result, err := jstracer.Get("result")
- if err != nil {
- return nil, err
- }
- if !result.IsFunction() {
- return nil, fmt.Errorf("Trace object must expose a function result()")
- }
- // Create the persistent log object
- var (
- op = new(opCodeWrapper)
- mem = new(memoryWrapper)
- stack = new(stackWrapper)
- db = new(dbWrapper)
- contract = new(contractWrapper)
- )
- log := map[string]interface{}{
- "op": op.toValue(vm),
- "memory": mem.toValue(vm),
- "stack": stack.toValue(vm),
- "contract": contract.toValue(vm),
- }
- logvalue, _ := vm.ToValue(log)
-
- return &JavascriptTracer{
- vm: vm,
- traceobj: jstracer,
- op: op,
- log: log,
- logvalue: logvalue,
- memory: mem,
- stack: stack,
- db: db,
- dbvalue: db.toValue(vm),
- contract: contract,
- err: nil,
- }, nil
-}
-
-// Stop terminates execution of any JavaScript
-func (jst *JavascriptTracer) Stop(err error) {
- jst.vm.Interrupt <- func() {
- panic(err)
- }
-}
-
-// callSafely executes a method on a JS object, catching any panics and
-// returning them as error objects.
-func (jst *JavascriptTracer) callSafely(method string, argumentList ...interface{}) (ret interface{}, err error) {
- defer func() {
- if caught := recover(); caught != nil {
- switch caught := caught.(type) {
- case error:
- err = caught
- case string:
- err = errors.New(caught)
- case fmt.Stringer:
- err = errors.New(caught.String())
- default:
- panic(caught)
- }
- }
- }()
-
- value, err := jst.traceobj.Call(method, argumentList...)
- ret, _ = value.Export()
- return ret, err
-}
-
-func wrapError(context string, err error) error {
- var message string
- switch err := err.(type) {
- case *otto.Error:
- message = err.String()
- default:
- message = err.Error()
- }
- return fmt.Errorf("%v in server-side tracer function '%v'", message, context)
-}
-
-// CaptureState implements the Tracer interface to trace a single step of VM execution
-func (jst *JavascriptTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {
- if jst.err == nil {
- jst.op.op = op
- jst.memory.memory = memory
- jst.stack.stack = stack
- jst.db.db = env.StateDB
- jst.contract.contract = contract
-
- jst.log["pc"] = pc
- jst.log["gas"] = gas
- jst.log["cost"] = cost
- jst.log["depth"] = depth
- jst.log["account"] = contract.Address()
-
- delete(jst.log, "error")
- if err != nil {
- jst.log["error"] = err
- }
- _, err := jst.callSafely("step", jst.logvalue, jst.dbvalue)
- if err != nil {
- jst.err = wrapError("step", err)
- }
- }
- return nil
-}
-
-// CaptureEnd is called after the call finishes
-func (jst *JavascriptTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {
- //TODO! @Arachnid please figure out of there's anything we can use this method for
- return nil
-}
-
-// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error
-func (jst *JavascriptTracer) GetResult() (result interface{}, err error) {
- if jst.err != nil {
- return nil, jst.err
- }
-
- result, err = jst.callSafely("result")
- if err != nil {
- err = wrapError("result", err)
- }
- return
-}
diff --git a/internal/jsre/deps/bindata.go b/internal/jsre/deps/bindata.go
index c7dde7137..7454c7cfc 100644
--- a/internal/jsre/deps/bindata.go
+++ b/internal/jsre/deps/bindata.go
@@ -1,8 +1,7 @@
-// Code generated by go-bindata.
+// Code generated by go-bindata. DO NOT EDIT.
// sources:
// bignumber.js
// web3.js
-// DO NOT EDIT!
package deps
@@ -113,8 +112,8 @@ func web3Js() (*asset, error) {
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
@@ -139,8 +138,8 @@ func MustAsset(name string) []byte {
// It returns an error if the asset could not be found or
// could not be loaded.
func AssetInfo(name string) (os.FileInfo, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
@@ -162,7 +161,8 @@ func AssetNames() []string {
// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
"bignumber.js": bignumberJs,
- "web3.js": web3Js,
+
+ "web3.js": web3Js,
}
// AssetDir returns the file names below a certain
@@ -181,8 +181,8 @@ var _bindata = map[string]func() (*asset, error){
func AssetDir(name string) ([]string, error) {
node := _bintree
if len(name) != 0 {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- pathList := strings.Split(cannonicalName, "/")
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(canonicalName, "/")
for _, p := range pathList {
node = node.Children[p]
if node == nil {
@@ -228,11 +228,7 @@ func RestoreAsset(dir, name string) error {
if err != nil {
return err
}
- err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
- if err != nil {
- return err
- }
- return nil
+ return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
}
// RestoreAssets restores an asset under the given directory recursively
@@ -253,6 +249,6 @@ func RestoreAssets(dir, name string) error {
}
func _filePath(dir, name string) string {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
}
diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go
index ef0d2b4e6..a6b81b4c2 100644
--- a/internal/web3ext/web3ext.go
+++ b/internal/web3ext/web3ext.go
@@ -197,26 +197,6 @@ web3._extend({
params: 1
}),
new web3._extend.Method({
- name: 'traceBlock',
- call: 'debug_traceBlock',
- params: 1
- }),
- new web3._extend.Method({
- name: 'traceBlockFromFile',
- call: 'debug_traceBlockFromFile',
- params: 1
- }),
- new web3._extend.Method({
- name: 'traceBlockByNumber',
- call: 'debug_traceBlockByNumber',
- params: 1
- }),
- new web3._extend.Method({
- name: 'traceBlockByHash',
- call: 'debug_traceBlockByHash',
- params: 1
- }),
- new web3._extend.Method({
name: 'seedHash',
call: 'debug_seedHash',
params: 1
@@ -333,6 +313,30 @@ web3._extend({
params: 1
}),
new web3._extend.Method({
+ name: 'traceBlock',
+ call: 'debug_traceBlock',
+ params: 2,
+ inputFormatter: [null, null]
+ }),
+ new web3._extend.Method({
+ name: 'traceBlockFromFile',
+ call: 'debug_traceBlockFromFile',
+ params: 2,
+ inputFormatter: [null, null]
+ }),
+ new web3._extend.Method({
+ name: 'traceBlockByNumber',
+ call: 'debug_traceBlockByNumber',
+ params: 2,
+ inputFormatter: [null, null]
+ }),
+ new web3._extend.Method({
+ name: 'traceBlockByHash',
+ call: 'debug_traceBlockByHash',
+ params: 2,
+ inputFormatter: [null, null]
+ }),
+ new web3._extend.Method({
name: 'traceTransaction',
call: 'debug_traceTransaction',
params: 2,
@@ -513,6 +517,12 @@ web3._extend({
call: 'personal_deriveAccount',
params: 3
}),
+ new web3._extend.Method({
+ name: 'signTransaction',
+ call: 'personal_signTransaction',
+ params: 2,
+ inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null]
+ }),
],
properties: [
new web3._extend.Property({
diff --git a/les/backend.go b/les/backend.go
index 7180b81d7..6a324cb04 100644
--- a/les/backend.go
+++ b/les/backend.go
@@ -46,6 +46,8 @@ import (
)
type LightEthereum struct {
+ config *eth.Config
+
odr *LesOdr
relay *LesTxRelay
chainConfig *params.ChainConfig
@@ -92,6 +94,7 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) {
quitSync := make(chan struct{})
leth := &LightEthereum{
+ config: config,
chainConfig: chainConfig,
chainDb: chainDb,
eventMux: ctx.EventMux,
@@ -221,11 +224,10 @@ func (s *LightEthereum) Start(srvr *p2p.Server) error {
s.startBloomHandlers()
log.Warn("Light client mode is an experimental feature")
s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.networkId)
- // search the topic belonging to the oldest supported protocol because
- // servers always advertise all supported protocols
- protocolVersion := ClientProtocolVersions[len(ClientProtocolVersions)-1]
+ // clients are searching for the first advertised protocol in the list
+ protocolVersion := AdvertiseProtocolVersions[0]
s.serverPool.start(srvr, lesTopic(s.blockchain.Genesis().Hash(), protocolVersion))
- s.protocolManager.Start()
+ s.protocolManager.Start(s.config.LightPeers)
return nil
}
diff --git a/les/handler.go b/les/handler.go
index 613fbb79f..5c93133fb 100644
--- a/les/handler.go
+++ b/les/handler.go
@@ -18,7 +18,6 @@
package les
import (
- "bytes"
"encoding/binary"
"errors"
"fmt"
@@ -32,7 +31,6 @@ import (
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/eth/downloader"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
@@ -73,17 +71,17 @@ func errResp(code errCode, format string, v ...interface{}) error {
}
type BlockChain interface {
+ Config() *params.ChainConfig
HasHeader(hash common.Hash, number uint64) bool
GetHeader(hash common.Hash, number uint64) *types.Header
GetHeaderByHash(hash common.Hash) *types.Header
CurrentHeader() *types.Header
- GetTdByHash(hash common.Hash) *big.Int
+ GetTd(hash common.Hash, number uint64) *big.Int
+ State() (*state.StateDB, error)
InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error)
Rollback(chain []common.Hash)
- Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash)
GetHeaderByNumber(number uint64) *types.Header
GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash
- LastBlockHash() common.Hash
Genesis() *types.Block
SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription
}
@@ -111,6 +109,7 @@ type ProtocolManager struct {
downloader *downloader.Downloader
fetcher *lightFetcher
peers *peerSet
+ maxPeers int
SubProtocols []p2p.Protocol
@@ -218,7 +217,9 @@ func (pm *ProtocolManager) removePeer(id string) {
pm.peers.Unregister(id)
}
-func (pm *ProtocolManager) Start() {
+func (pm *ProtocolManager) Start(maxPeers int) {
+ pm.maxPeers = maxPeers
+
if pm.lightSync {
go pm.syncer()
} else {
@@ -259,12 +260,21 @@ func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgRea
// handle is the callback invoked to manage the life cycle of a les peer. When
// this function terminates, the peer is disconnected.
func (pm *ProtocolManager) handle(p *peer) error {
+ if pm.peers.Len() >= pm.maxPeers {
+ return p2p.DiscTooManyPeers
+ }
+
p.Log().Debug("Light Ethereum peer connected", "name", p.Name())
// Execute the LES handshake
- td, head, genesis := pm.blockchain.Status()
- headNum := core.GetBlockNumber(pm.chainDb, head)
- if err := p.Handshake(td, head, headNum, genesis, pm.server); err != nil {
+ var (
+ genesis = pm.blockchain.Genesis()
+ head = pm.blockchain.CurrentHeader()
+ hash = head.Hash()
+ number = head.Number.Uint64()
+ td = pm.blockchain.GetTd(hash, number)
+ )
+ if err := p.Handshake(td, hash, number, genesis.Hash(), pm.server); err != nil {
p.Log().Debug("Light Ethereum handshake failed", "err", err)
return err
}
@@ -454,14 +464,14 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
case query.Reverse:
// Number based traversal towards the genesis block
if query.Origin.Number >= query.Skip+1 {
- query.Origin.Number -= (query.Skip + 1)
+ query.Origin.Number -= query.Skip + 1
} else {
unknown = true
}
case !query.Reverse:
// Number based traversal towards the leaf block
- query.Origin.Number += (query.Skip + 1)
+ query.Origin.Number += query.Skip + 1
}
}
@@ -569,17 +579,19 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
for _, req := range req.Reqs {
// Retrieve the requested state entry, stopping if enough was found
if header := core.GetHeader(pm.chainDb, req.BHash, core.GetBlockNumber(pm.chainDb, req.BHash)); header != nil {
- if trie, _ := trie.New(header.Root, pm.chainDb); trie != nil {
- sdata := trie.Get(req.AccKey)
- var acc state.Account
- if err := rlp.DecodeBytes(sdata, &acc); err == nil {
- entry, _ := pm.chainDb.Get(acc.CodeHash)
- if bytes+len(entry) >= softResponseLimit {
- break
- }
- data = append(data, entry)
- bytes += len(entry)
- }
+ statedb, err := pm.blockchain.State()
+ if err != nil {
+ continue
+ }
+ account, err := pm.getAccount(statedb, header.Root, common.BytesToHash(req.AccKey))
+ if err != nil {
+ continue
+ }
+ code, _ := statedb.Database().TrieDB().Node(common.BytesToHash(account.CodeHash))
+
+ data = append(data, code)
+ if bytes += len(code); bytes >= softResponseLimit {
+ break
}
}
}
@@ -691,25 +703,29 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
return errResp(ErrRequestRejected, "")
}
for _, req := range req.Reqs {
- if bytes >= softResponseLimit {
- break
- }
// Retrieve the requested state entry, stopping if enough was found
if header := core.GetHeader(pm.chainDb, req.BHash, core.GetBlockNumber(pm.chainDb, req.BHash)); header != nil {
- if tr, _ := trie.New(header.Root, pm.chainDb); tr != nil {
- if len(req.AccKey) > 0 {
- sdata := tr.Get(req.AccKey)
- tr = nil
- var acc state.Account
- if err := rlp.DecodeBytes(sdata, &acc); err == nil {
- tr, _ = trie.New(acc.Root, pm.chainDb)
- }
+ statedb, err := pm.blockchain.State()
+ if err != nil {
+ continue
+ }
+ var trie state.Trie
+ if len(req.AccKey) > 0 {
+ account, err := pm.getAccount(statedb, header.Root, common.BytesToHash(req.AccKey))
+ if err != nil {
+ continue
}
- if tr != nil {
- var proof light.NodeList
- tr.Prove(req.Key, 0, &proof)
- proofs = append(proofs, proof)
- bytes += proof.DataSize()
+ trie, _ = statedb.Database().OpenStorageTrie(common.BytesToHash(req.AccKey), account.Root)
+ } else {
+ trie, _ = statedb.Database().OpenTrie(header.Root)
+ }
+ if trie != nil {
+ var proof light.NodeList
+ trie.Prove(req.Key, 0, &proof)
+
+ proofs = append(proofs, proof)
+ if bytes += proof.DataSize(); bytes >= softResponseLimit {
+ break
}
}
}
@@ -730,9 +746,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
}
// Gather state data until the fetch or network limits is reached
var (
- lastBHash common.Hash
- lastAccKey []byte
- tr, str *trie.Trie
+ lastBHash common.Hash
+ statedb *state.StateDB
+ root common.Hash
)
reqCnt := len(req.Reqs)
if reject(uint64(reqCnt), MaxProofsFetch) {
@@ -742,35 +758,36 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
nodes := light.NewNodeSet()
for _, req := range req.Reqs {
- if nodes.DataSize() >= softResponseLimit {
- break
- }
- if tr == nil || req.BHash != lastBHash {
+ // Look up the state belonging to the request
+ if statedb == nil || req.BHash != lastBHash {
+ statedb, root, lastBHash = nil, common.Hash{}, req.BHash
+
if header := core.GetHeader(pm.chainDb, req.BHash, core.GetBlockNumber(pm.chainDb, req.BHash)); header != nil {
- tr, _ = trie.New(header.Root, pm.chainDb)
- } else {
- tr = nil
+ statedb, _ = pm.blockchain.State()
+ root = header.Root
}
- lastBHash = req.BHash
- str = nil
}
- if tr != nil {
- if len(req.AccKey) > 0 {
- if str == nil || !bytes.Equal(req.AccKey, lastAccKey) {
- sdata := tr.Get(req.AccKey)
- str = nil
- var acc state.Account
- if err := rlp.DecodeBytes(sdata, &acc); err == nil {
- str, _ = trie.New(acc.Root, pm.chainDb)
- }
- lastAccKey = common.CopyBytes(req.AccKey)
- }
- if str != nil {
- str.Prove(req.Key, req.FromLevel, nodes)
- }
- } else {
- tr.Prove(req.Key, req.FromLevel, nodes)
+ if statedb == nil {
+ continue
+ }
+ // Pull the account or storage trie of the request
+ var trie state.Trie
+ if len(req.AccKey) > 0 {
+ account, err := pm.getAccount(statedb, root, common.BytesToHash(req.AccKey))
+ if err != nil {
+ continue
}
+ trie, _ = statedb.Database().OpenStorageTrie(common.BytesToHash(req.AccKey), account.Root)
+ } else {
+ trie, _ = statedb.Database().OpenTrie(root)
+ }
+ if trie == nil {
+ continue
+ }
+ // Prove the user's request from the account or stroage trie
+ trie.Prove(req.Key, req.FromLevel, nodes)
+ if nodes.DataSize() >= softResponseLimit {
+ break
}
}
proofs := nodes.NodeList()
@@ -839,23 +856,29 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
if reject(uint64(reqCnt), MaxHelperTrieProofsFetch) {
return errResp(ErrRequestRejected, "")
}
- trieDb := ethdb.NewTable(pm.chainDb, light.ChtTablePrefix)
for _, req := range req.Reqs {
- if bytes >= softResponseLimit {
- break
- }
-
if header := pm.blockchain.GetHeaderByNumber(req.BlockNum); header != nil {
- sectionHead := core.GetCanonicalHash(pm.chainDb, (req.ChtNum+1)*light.ChtV1Frequency-1)
- if root := light.GetChtRoot(pm.chainDb, req.ChtNum, sectionHead); root != (common.Hash{}) {
- if tr, _ := trie.New(root, trieDb); tr != nil {
- var encNumber [8]byte
- binary.BigEndian.PutUint64(encNumber[:], req.BlockNum)
- var proof light.NodeList
- tr.Prove(encNumber[:], 0, &proof)
- proofs = append(proofs, ChtResp{Header: header, Proof: proof})
- bytes += proof.DataSize() + estHeaderRlpSize
+ sectionHead := core.GetCanonicalHash(pm.chainDb, req.ChtNum*light.ChtV1Frequency-1)
+ if root := light.GetChtRoot(pm.chainDb, req.ChtNum-1, sectionHead); root != (common.Hash{}) {
+ statedb, err := pm.blockchain.State()
+ if err != nil {
+ continue
+ }
+ trie, err := statedb.Database().OpenTrie(root)
+ if err != nil {
+ continue
}
+ var encNumber [8]byte
+ binary.BigEndian.PutUint64(encNumber[:], req.BlockNum)
+
+ var proof light.NodeList
+ trie.Prove(encNumber[:], 0, &proof)
+
+ proofs = append(proofs, ChtResp{Header: header, Proof: proof})
+ if bytes += proof.DataSize() + estHeaderRlpSize; bytes >= softResponseLimit {
+ break
+ }
+
}
}
}
@@ -887,25 +910,21 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
lastIdx uint64
lastType uint
root common.Hash
- tr *trie.Trie
+ statedb *state.StateDB
+ trie state.Trie
)
nodes := light.NewNodeSet()
for _, req := range req.Reqs {
- if nodes.DataSize()+auxBytes >= softResponseLimit {
- break
- }
- if tr == nil || req.HelperTrieType != lastType || req.TrieIdx != lastIdx {
- var prefix string
- root, prefix = pm.getHelperTrie(req.HelperTrieType, req.TrieIdx)
- if root != (common.Hash{}) {
- if t, err := trie.New(root, ethdb.NewTable(pm.chainDb, prefix)); err == nil {
- tr = t
+ if trie == nil || req.HelperTrieType != lastType || req.TrieIdx != lastIdx {
+ statedb, trie, lastType, lastIdx = nil, nil, req.HelperTrieType, req.TrieIdx
+
+ if root, _ = pm.getHelperTrie(req.HelperTrieType, req.TrieIdx); root != (common.Hash{}) {
+ if statedb, _ = pm.blockchain.State(); statedb != nil {
+ trie, _ = statedb.Database().OpenTrie(root)
}
}
- lastType = req.HelperTrieType
- lastIdx = req.TrieIdx
}
if req.AuxReq == auxRoot {
var data []byte
@@ -915,8 +934,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
auxData = append(auxData, data)
auxBytes += len(data)
} else {
- if tr != nil {
- tr.Prove(req.Key, req.FromLevel, nodes)
+ if trie != nil {
+ trie.Prove(req.Key, req.FromLevel, nodes)
}
if req.AuxReq != 0 {
data := pm.getHelperTrieAuxData(req)
@@ -924,6 +943,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
auxBytes += len(data)
}
}
+ if nodes.DataSize()+auxBytes >= softResponseLimit {
+ break
+ }
}
proofs := nodes.NodeList()
bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost)
@@ -1014,7 +1036,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
for i, stat := range stats {
if stat.Status == core.TxStatusUnknown {
if errs := pm.txpool.AddRemotes([]*types.Transaction{req.Txs[i]}); errs[0] != nil {
- stats[i].Error = errs[0]
+ stats[i].Error = errs[0].Error()
continue
}
stats[i] = pm.txStatus([]common.Hash{hashes[i]})[0]
@@ -1055,7 +1077,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
p.Log().Trace("Received tx status response")
var resp struct {
ReqID, BV uint64
- Status []core.TxStatus
+ Status []txStatus
}
if err := msg.Decode(&resp); err != nil {
return errResp(ErrDecode, "msg %v: %v", msg, err)
@@ -1080,6 +1102,23 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
return nil
}
+// getAccount retrieves an account from the state based at root.
+func (pm *ProtocolManager) getAccount(statedb *state.StateDB, root, hash common.Hash) (state.Account, error) {
+ trie, err := trie.New(root, statedb.Database().TrieDB())
+ if err != nil {
+ return state.Account{}, err
+ }
+ blob, err := trie.TryGet(hash[:])
+ if err != nil {
+ return state.Account{}, err
+ }
+ var account state.Account
+ if err = rlp.DecodeBytes(blob, &account); err != nil {
+ return state.Account{}, err
+ }
+ return account, nil
+}
+
// getHelperTrie returns the post-processed trie root for the given trie ID and section index
func (pm *ProtocolManager) getHelperTrie(id uint, idx uint64) (common.Hash, string) {
switch id {
@@ -1123,13 +1162,27 @@ func (pm *ProtocolManager) txStatus(hashes []common.Hash) []txStatus {
return stats
}
+// NodeInfo represents a short summary of the Ethereum sub-protocol metadata
+// known about the host peer.
+type NodeInfo struct {
+ Network uint64 `json:"network"` // Ethereum network ID (1=Frontier, 2=Morden, Ropsten=3, Rinkeby=4)
+ Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain
+ Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block
+ Config *params.ChainConfig `json:"config"` // Chain configuration for the fork rules
+ Head common.Hash `json:"head"` // SHA3 hash of the host's best owned block
+}
+
// NodeInfo retrieves some protocol metadata about the running host node.
-func (self *ProtocolManager) NodeInfo() *eth.EthNodeInfo {
- return &eth.EthNodeInfo{
+func (self *ProtocolManager) NodeInfo() *NodeInfo {
+ head := self.blockchain.CurrentHeader()
+ hash := head.Hash()
+
+ return &NodeInfo{
Network: self.networkId,
- Difficulty: self.blockchain.GetTdByHash(self.blockchain.LastBlockHash()),
+ Difficulty: self.blockchain.GetTd(hash, head.Number.Uint64()),
Genesis: self.blockchain.Genesis().Hash(),
- Head: self.blockchain.LastBlockHash(),
+ Config: self.blockchain.Config(),
+ Head: hash,
}
}
diff --git a/les/handler_test.go b/les/handler_test.go
index a9dac89b4..e5446c031 100644
--- a/les/handler_test.go
+++ b/les/handler_test.go
@@ -24,6 +24,7 @@ import (
"time"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
@@ -358,7 +359,7 @@ func testGetProofs(t *testing.T, protocol int) {
for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ {
header := bc.GetHeaderByNumber(i)
root := header.Root
- trie, _ := trie.New(root, db)
+ trie, _ := trie.New(root, trie.NewDatabase(db))
for _, acc := range accounts {
req := ProofReq{
@@ -442,16 +443,16 @@ func TestTransactionStatusLes2(t *testing.T) {
signer := types.HomesteadSigner{}
// test error status by sending an underpriced transaction
- tx0, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey)
- test(tx0, true, txStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced})
+ tx0, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey)
+ test(tx0, true, txStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced.Error()})
- tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey)
+ tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey)
test(tx1, false, txStatus{Status: core.TxStatusUnknown}) // query before sending, should be unknown
test(tx1, true, txStatus{Status: core.TxStatusPending}) // send valid processable tx, should return pending
test(tx1, true, txStatus{Status: core.TxStatusPending}) // adding it again should not return an error
- tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey)
- tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey)
+ tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey)
+ tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey)
// send transactions in the wrong order, tx3 should be queued
test(tx3, true, txStatus{Status: core.TxStatusQueued})
test(tx2, true, txStatus{Status: core.TxStatusPending})
@@ -459,7 +460,7 @@ func TestTransactionStatusLes2(t *testing.T) {
test(tx3, false, txStatus{Status: core.TxStatusPending})
// generate and add a block with tx1 and tx2 included
- gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 1, func(i int, block *core.BlockGen) {
+ gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), db, 1, func(i int, block *core.BlockGen) {
block.AddTx(tx1)
block.AddTx(tx2)
})
@@ -483,7 +484,7 @@ func TestTransactionStatusLes2(t *testing.T) {
test(tx2, false, txStatus{Status: core.TxStatusIncluded, Lookup: &core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}})
// create a reorg that rolls them back
- gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 2, func(i int, block *core.BlockGen) {})
+ gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), db, 2, func(i int, block *core.BlockGen) {})
if _, err := chain.InsertChain(gchain); err != nil {
panic(err)
}
diff --git a/les/helper_test.go b/les/helper_test.go
index a06f84cca..bf08e1e2f 100644
--- a/les/helper_test.go
+++ b/les/helper_test.go
@@ -56,8 +56,6 @@ var (
testContractDeployed = uint64(2)
testBufLimit = uint64(100)
-
- bigTxGas = new(big.Int).SetUint64(params.TxGas)
)
/*
@@ -81,17 +79,17 @@ func testChainGen(i int, block *core.BlockGen) {
switch i {
case 0:
// In block 1, the test bank sends account #1 some ether.
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey)
block.AddTx(tx)
case 1:
// In block 2, the test bank sends some more ether to account #1.
// acc1Addr passes it on to account #2.
// acc1Addr creates a test contract.
- tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, testBankKey)
+ tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, testBankKey)
nonce := block.TxNonce(acc1Addr)
- tx2, _ := types.SignTx(types.NewTransaction(nonce, acc2Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, acc1Key)
+ tx2, _ := types.SignTx(types.NewTransaction(nonce, acc2Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, acc1Key)
nonce++
- tx3, _ := types.SignTx(types.NewContractCreation(nonce, big.NewInt(0), big.NewInt(200000), big.NewInt(0), testContractCode), signer, acc1Key)
+ tx3, _ := types.SignTx(types.NewContractCreation(nonce, big.NewInt(0), 200000, big.NewInt(0), testContractCode), signer, acc1Key)
testContractAddr = crypto.CreateAddress(acc1Addr, nonce)
block.AddTx(tx1)
block.AddTx(tx2)
@@ -101,7 +99,7 @@ func testChainGen(i int, block *core.BlockGen) {
block.SetCoinbase(acc2Addr)
block.SetExtra([]byte("yeehaw"))
data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001")
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), big.NewInt(100000), nil, data), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey)
block.AddTx(tx)
case 3:
// Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data).
@@ -112,7 +110,7 @@ func testChainGen(i int, block *core.BlockGen) {
b3.Extra = []byte("foo")
block.AddUncle(b3)
data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002")
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), big.NewInt(100000), nil, data), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey)
block.AddTx(tx)
}
}
@@ -148,8 +146,8 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor
if lightSync {
chain, _ = light.NewLightChain(odr, gspec.Config, engine)
} else {
- blockchain, _ := core.NewBlockChain(db, gspec.Config, engine, vm.Config{})
- gchain, _ := core.GenerateChain(gspec.Config, genesis, db, blocks, generator)
+ blockchain, _ := core.NewBlockChain(db, nil, gspec.Config, engine, vm.Config{})
+ gchain, _ := core.GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, blocks, generator)
if _, err := blockchain.InsertChain(gchain); err != nil {
panic(err)
}
@@ -178,7 +176,7 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor
srv.fcManager = flowcontrol.NewClientManager(50, 10, 1000000000)
srv.fcCostStats = newCostStats(nil)
}
- pm.Start()
+ pm.Start(1000)
return pm, nil
}
@@ -229,9 +227,12 @@ func newTestPeer(t *testing.T, name string, version int, pm *ProtocolManager, sh
}
// Execute any implicitly requested handshakes and return
if shake {
- td, head, genesis := pm.blockchain.Status()
- headNum := pm.blockchain.CurrentHeader().Number.Uint64()
- tp.handshake(t, td, head, headNum, genesis)
+ var (
+ genesis = pm.blockchain.Genesis()
+ head = pm.blockchain.CurrentHeader()
+ td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64())
+ )
+ tp.handshake(t, td, head.Hash(), head.Number.Uint64(), genesis.Hash())
}
return tp, errc
}
diff --git a/les/odr_test.go b/les/odr_test.go
index 865f5d83e..88e121cda 100644
--- a/les/odr_test.go
+++ b/les/odr_test.go
@@ -101,7 +101,6 @@ func odrAccounts(ctx context.Context, db ethdb.Database, config *params.ChainCon
res = append(res, rlp...)
}
}
-
return res
}
@@ -129,13 +128,13 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai
from := statedb.GetOrNewStateObject(testBankAddress)
from.SetBalance(math.MaxBig256)
- msg := callmsg{types.NewMessage(from.Address(), &testContractAddr, 0, new(big.Int), big.NewInt(100000), new(big.Int), data, false)}
+ msg := callmsg{types.NewMessage(from.Address(), &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)}
context := core.NewEVMContext(msg, header, bc, nil)
vmenv := vm.NewEVM(context, statedb, config, vm.Config{})
//vmenv := core.NewEnv(statedb, config, bc, msg, header, vm.Config{})
- gp := new(core.GasPool).AddGas(math.MaxBig256)
+ gp := new(core.GasPool).AddGas(math.MaxUint64)
ret, _, _, _ := core.ApplyMessage(vmenv, msg, gp)
res = append(res, ret...)
}
@@ -143,10 +142,10 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai
header := lc.GetHeaderByHash(bhash)
state := light.NewState(ctx, header, lc.Odr())
state.SetBalance(testBankAddress, math.MaxBig256)
- msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), big.NewInt(100000), new(big.Int), data, false)}
+ msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)}
context := core.NewEVMContext(msg, header, lc, nil)
vmenv := vm.NewEVM(context, state, config, vm.Config{})
- gp := new(core.GasPool).AddGas(math.MaxBig256)
+ gp := new(core.GasPool).AddGas(math.MaxUint64)
ret, _, _, _ := core.ApplyMessage(vmenv, msg, gp)
if state.Error() == nil {
res = append(res, ret...)
diff --git a/les/peer.go b/les/peer.go
index 04d747a6b..b72c80d35 100644
--- a/les/peer.go
+++ b/les/peer.go
@@ -296,7 +296,7 @@ func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, reqs []HelperTrieReq)
}
blockNum := binary.BigEndian.Uint64(req.Key)
// convert HelperTrie request to old CHT request
- reqsV1[i] = ChtReq{ChtNum: (req.TrieIdx+1)*(light.ChtFrequency/light.ChtV1Frequency) - 1, BlockNum: blockNum, FromLevel: req.FromLevel}
+ reqsV1[i] = ChtReq{ChtNum: (req.TrieIdx + 1) * (light.ChtFrequency / light.ChtV1Frequency), BlockNum: blockNum, FromLevel: req.FromLevel}
}
return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqsV1)
case lpv2:
diff --git a/les/protocol.go b/les/protocol.go
index 05e6654d6..e1c4625bc 100644
--- a/les/protocol.go
+++ b/les/protocol.go
@@ -41,8 +41,9 @@ const (
// Supported versions of the les protocol (first is primary)
var (
- ClientProtocolVersions = []uint{lpv2, lpv1}
- ServerProtocolVersions = []uint{lpv2, lpv1}
+ ClientProtocolVersions = []uint{lpv2, lpv1}
+ ServerProtocolVersions = []uint{lpv2, lpv1}
+ AdvertiseProtocolVersions = []uint{lpv2} // clients are searching for the first advertised protocol in the list
)
// Number of implemented message corresponding to different protocol versions.
@@ -223,6 +224,6 @@ type proofsData [][]rlp.RawValue
type txStatus struct {
Status core.TxStatus
- Lookup *core.TxLookupEntry
- Error error
+ Lookup *core.TxLookupEntry `rlp:"nil"`
+ Error string
}
diff --git a/les/server.go b/les/server.go
index d8f93cd87..85ebbf898 100644
--- a/les/server.go
+++ b/les/server.go
@@ -38,6 +38,7 @@ import (
)
type LesServer struct {
+ config *eth.Config
protocolManager *ProtocolManager
fcManager *flowcontrol.ClientManager // nil if our node is client only
fcCostStats *requestCostStats
@@ -56,12 +57,13 @@ func NewLesServer(eth *eth.Ethereum, config *eth.Config) (*LesServer, error) {
return nil, err
}
- lesTopics := make([]discv5.Topic, len(ServerProtocolVersions))
- for i, pv := range ServerProtocolVersions {
+ lesTopics := make([]discv5.Topic, len(AdvertiseProtocolVersions))
+ for i, pv := range AdvertiseProtocolVersions {
lesTopics[i] = lesTopic(eth.BlockChain().Genesis().Hash(), pv)
}
srv := &LesServer{
+ config: config,
protocolManager: pm,
quitSync: quitSync,
lesTopics: lesTopics,
@@ -108,7 +110,7 @@ func (s *LesServer) Protocols() []p2p.Protocol {
// Start starts the LES server
func (s *LesServer) Start(srvr *p2p.Server) {
- s.protocolManager.Start()
+ s.protocolManager.Start(s.config.LightPeers)
for _, topic := range s.lesTopics {
topic := topic
go func() {
diff --git a/les/serverpool.go b/les/serverpool.go
index dc1ea6bf0..a84c29c3a 100644
--- a/les/serverpool.go
+++ b/les/serverpool.go
@@ -618,7 +618,7 @@ func (e *knownEntry) Weight() int64 {
if e.state != psNotConnected || !e.known || e.delayedRetry {
return 0
}
- return int64(1000000000 * e.connectStats.recentAvg() * math.Exp(-float64(e.lastConnected.fails)*failDropLn-e.responseStats.recentAvg()/float64(responseScoreTC)-e.delayStats.recentAvg()/float64(delayScoreTC)) * math.Pow((1-e.timeoutStats.recentAvg()), timeoutPow))
+ return int64(1000000000 * e.connectStats.recentAvg() * math.Exp(-float64(e.lastConnected.fails)*failDropLn-e.responseStats.recentAvg()/float64(responseScoreTC)-e.delayStats.recentAvg()/float64(delayScoreTC)) * math.Pow(1-e.timeoutStats.recentAvg(), timeoutPow))
}
// poolEntryAddress is a separate object because currently it is necessary to remember
diff --git a/light/lightchain.go b/light/lightchain.go
index 30baeaccb..24529ef82 100644
--- a/light/lightchain.go
+++ b/light/lightchain.go
@@ -18,6 +18,7 @@ package light
import (
"context"
+ "errors"
"math/big"
"sync"
"sync/atomic"
@@ -26,6 +27,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
@@ -169,32 +171,13 @@ func (bc *LightChain) SetHead(head uint64) {
}
// GasLimit returns the gas limit of the current HEAD block.
-func (self *LightChain) GasLimit() *big.Int {
+func (self *LightChain) GasLimit() uint64 {
self.mu.RLock()
defer self.mu.RUnlock()
return self.hc.CurrentHeader().GasLimit
}
-// LastBlockHash return the hash of the HEAD block.
-func (self *LightChain) LastBlockHash() common.Hash {
- self.mu.RLock()
- defer self.mu.RUnlock()
-
- return self.hc.CurrentHeader().Hash()
-}
-
-// Status returns status information about the current chain such as the HEAD Td,
-// the HEAD hash and the hash of the genesis block.
-func (self *LightChain) Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash) {
- self.mu.RLock()
- defer self.mu.RUnlock()
-
- header := self.hc.CurrentHeader()
- hash := header.Hash()
- return self.GetTd(hash, header.Number.Uint64()), hash, self.genesisBlock.Hash()
-}
-
// Reset purges the entire blockchain, restoring it to its genesis state.
func (bc *LightChain) Reset() {
bc.ResetWithGenesisBlock(bc.genesisBlock)
@@ -231,6 +214,11 @@ func (bc *LightChain) Genesis() *types.Block {
return bc.genesisBlock
}
+// State returns a new mutable state based on the current HEAD block.
+func (bc *LightChain) State() (*state.StateDB, error) {
+ return nil, errors.New("not implemented, needs client/server interface split")
+}
+
// GetBody retrieves a block body (transactions and uncles) from the database
// or ODR service by hash, caching it if found.
func (self *LightChain) GetBody(ctx context.Context, hash common.Hash) (*types.Body, error) {
@@ -337,7 +325,7 @@ func (self *LightChain) postChainEvents(events []interface{}) {
for _, event := range events {
switch ev := event.(type) {
case core.ChainEvent:
- if self.LastBlockHash() == ev.Hash {
+ if self.CurrentHeader().Hash() == ev.Hash {
self.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block})
}
self.chainFeed.Send(ev)
@@ -393,7 +381,7 @@ func (self *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int)
return err
}
i, err := self.hc.InsertHeaderChain(chain, whFunc, start)
- go self.postChainEvents(events)
+ self.postChainEvents(events)
return i, err
}
@@ -457,6 +445,9 @@ func (self *LightChain) GetHeaderByNumberOdr(ctx context.Context, number uint64)
return GetHeaderByNumber(ctx, self.odr, number)
}
+// Config retrieves the header chain's chain configuration.
+func (self *LightChain) Config() *params.ChainConfig { return self.hc.Config() }
+
func (self *LightChain) SyncCht(ctx context.Context) bool {
if self.odr.ChtIndexer() == nil {
return false
diff --git a/light/lightchain_test.go b/light/lightchain_test.go
index 40a4d396a..0af7551d4 100644
--- a/light/lightchain_test.go
+++ b/light/lightchain_test.go
@@ -37,7 +37,7 @@ var (
// makeHeaderChain creates a deterministic chain of headers rooted at parent.
func makeHeaderChain(parent *types.Header, n int, db ethdb.Database, seed int) []*types.Header {
- blocks, _ := core.GenerateChain(params.TestChainConfig, types.NewBlockWithHeader(parent), db, n, func(i int, b *core.BlockGen) {
+ blocks, _ := core.GenerateChain(params.TestChainConfig, types.NewBlockWithHeader(parent), ethash.NewFaker(), db, n, func(i int, b *core.BlockGen) {
b.SetCoinbase(common.Address{0: byte(seed), 19: byte(i)})
})
headers := make([]*types.Header, len(blocks))
diff --git a/light/nodeset.go b/light/nodeset.go
index c530a4fbe..ffdb71bb7 100644
--- a/light/nodeset.go
+++ b/light/nodeset.go
@@ -22,8 +22,8 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/rlp"
- "github.com/ethereum/go-ethereum/trie"
)
// NodeSet stores a set of trie nodes. It implements trie.Database and can also
@@ -99,7 +99,7 @@ func (db *NodeSet) NodeList() NodeList {
}
// Store writes the contents of the set to the given database
-func (db *NodeSet) Store(target trie.Database) {
+func (db *NodeSet) Store(target ethdb.Putter) {
db.lock.RLock()
defer db.lock.RUnlock()
@@ -108,11 +108,11 @@ func (db *NodeSet) Store(target trie.Database) {
}
}
-// NodeList stores an ordered list of trie nodes. It implements trie.DatabaseWriter.
+// NodeList stores an ordered list of trie nodes. It implements ethdb.Putter.
type NodeList []rlp.RawValue
// Store writes the contents of the list to the given database
-func (n NodeList) Store(db trie.Database) {
+func (n NodeList) Store(db ethdb.Putter) {
for _, node := range n {
db.Put(crypto.Keccak256(node), node)
}
diff --git a/light/odr_test.go b/light/odr_test.go
index e6afb1a48..d3f9374fd 100644
--- a/light/odr_test.go
+++ b/light/odr_test.go
@@ -50,8 +50,6 @@ var (
testContractCode = common.Hex2Bytes("606060405260cc8060106000396000f360606040526000357c01000000000000000000000000000000000000000000000000000000009004806360cd2685146041578063c16431b914606b57603f565b005b6055600480803590602001909190505060a9565b6040518082815260200191505060405180910390f35b60886004808035906020019091908035906020019091905050608a565b005b80600060005083606481101560025790900160005b50819055505b5050565b6000600060005082606481101560025790900160005b5054905060c7565b91905056")
testContractAddr common.Address
-
- bigTxGas = new(big.Int).SetUint64(params.TxGas)
)
type testOdr struct {
@@ -76,7 +74,7 @@ func (odr *testOdr) Retrieve(ctx context.Context, req OdrRequest) error {
case *ReceiptsRequest:
req.Receipts = core.GetBlockReceipts(odr.sdb, req.Hash, core.GetBlockNumber(odr.sdb, req.Hash))
case *TrieRequest:
- t, _ := trie.New(req.Id.Root, odr.sdb)
+ t, _ := trie.New(req.Id.Root, trie.NewDatabase(odr.sdb))
nodes := NewNodeSet()
t.Prove(req.Key, 0, nodes)
req.Proof = nodes
@@ -178,10 +176,10 @@ func odrContractCall(ctx context.Context, db ethdb.Database, bc *core.BlockChain
// Perform read-only call.
st.SetBalance(testBankAddress, math.MaxBig256)
- msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), big.NewInt(1000000), new(big.Int), data, false)}
+ msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), 1000000, new(big.Int), data, false)}
context := core.NewEVMContext(msg, header, chain, nil)
vmenv := vm.NewEVM(context, st, config, vm.Config{})
- gp := new(core.GasPool).AddGas(math.MaxBig256)
+ gp := new(core.GasPool).AddGas(math.MaxUint64)
ret, _, _, _ := core.ApplyMessage(vmenv, msg, gp)
res = append(res, ret...)
if st.Error() != nil {
@@ -196,17 +194,17 @@ func testChainGen(i int, block *core.BlockGen) {
switch i {
case 0:
// In block 1, the test bank sends account #1 some ether.
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey)
block.AddTx(tx)
case 1:
// In block 2, the test bank sends some more ether to account #1.
// acc1Addr passes it on to account #2.
// acc1Addr creates a test contract.
- tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, testBankKey)
+ tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, testBankKey)
nonce := block.TxNonce(acc1Addr)
- tx2, _ := types.SignTx(types.NewTransaction(nonce, acc2Addr, big.NewInt(1000), bigTxGas, nil, nil), signer, acc1Key)
+ tx2, _ := types.SignTx(types.NewTransaction(nonce, acc2Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, acc1Key)
nonce++
- tx3, _ := types.SignTx(types.NewContractCreation(nonce, big.NewInt(0), big.NewInt(1000000), big.NewInt(0), testContractCode), signer, acc1Key)
+ tx3, _ := types.SignTx(types.NewContractCreation(nonce, big.NewInt(0), 1000000, big.NewInt(0), testContractCode), signer, acc1Key)
testContractAddr = crypto.CreateAddress(acc1Addr, nonce)
block.AddTx(tx1)
block.AddTx(tx2)
@@ -216,7 +214,7 @@ func testChainGen(i int, block *core.BlockGen) {
block.SetCoinbase(acc2Addr)
block.SetExtra([]byte("yeehaw"))
data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001")
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), big.NewInt(100000), nil, data), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey)
block.AddTx(tx)
case 3:
// Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data).
@@ -227,7 +225,7 @@ func testChainGen(i int, block *core.BlockGen) {
b3.Extra = []byte("foo")
block.AddUncle(b3)
data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002")
- tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), big.NewInt(100000), nil, data), signer, testBankKey)
+ tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey)
block.AddTx(tx)
}
}
@@ -241,8 +239,8 @@ func testChainOdr(t *testing.T, protocol int, fn odrTestFn) {
)
gspec.MustCommit(ldb)
// Assemble the test environment
- blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{})
- gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, sdb, 4, testChainGen)
+ blockchain, _ := core.NewBlockChain(sdb, nil, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{})
+ gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), sdb, 4, testChainGen)
if _, err := blockchain.InsertChain(gchain); err != nil {
t.Fatal(err)
}
diff --git a/light/postprocess.go b/light/postprocess.go
index e7e513880..bbac58d12 100644
--- a/light/postprocess.go
+++ b/light/postprocess.go
@@ -53,18 +53,18 @@ type trustedCheckpoint struct {
var (
mainnetCheckpoint = trustedCheckpoint{
name: "ETH mainnet",
- sectionIdx: 129,
- sectionHead: common.HexToHash("64100587c8ec9a76870056d07cb0f58622552d16de6253a59cac4b580c899501"),
- chtRoot: common.HexToHash("bb4fb4076cbe6923c8a8ce8f158452bbe19564959313466989fda095a60884ca"),
- bloomTrieRoot: common.HexToHash("0db524b2c4a2a9520a42fd842b02d2e8fb58ff37c75cf57bd0eb82daeace6716"),
+ sectionIdx: 150,
+ sectionHead: common.HexToHash("1e2e67f289565cbe7bd4367f7960dbd73a3f7c53439e1047cd7ba331c8109e39"),
+ chtRoot: common.HexToHash("f2a6c9ca143d647b44523cc249f1072c8912358ab873a77a5fdc792b8df99e80"),
+ bloomTrieRoot: common.HexToHash("c018952fa1513c97857e79fbb9a37acaf8432d5b85e52a78eca7dff5fd5900ee"),
}
ropstenCheckpoint = trustedCheckpoint{
name: "Ropsten testnet",
- sectionIdx: 50,
- sectionHead: common.HexToHash("00bd65923a1aa67f85e6b4ae67835784dd54be165c37f056691723c55bf016bd"),
- chtRoot: common.HexToHash("6f56dc61936752cc1f8c84b4addabdbe6a1c19693de3f21cb818362df2117f03"),
- bloomTrieRoot: common.HexToHash("aca7d7c504d22737242effc3fdc604a762a0af9ced898036b5986c3a15220208"),
+ sectionIdx: 75,
+ sectionHead: common.HexToHash("12e68324f4578ea3e8e7fb3968167686729396c9279287fa1f1a8b51bb2d05b4"),
+ chtRoot: common.HexToHash("3e51dc095c69fa654a4cac766e0afff7357515b4b3c3a379c675f810363e54be"),
+ bloomTrieRoot: common.HexToHash("33e3a70b33c1d73aa698d496a80615e98ed31fa8f56969876180553b32333339"),
}
)
@@ -113,7 +113,8 @@ func StoreChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead, root common
// ChtIndexerBackend implements core.ChainIndexerBackend
type ChtIndexerBackend struct {
- db, cdb ethdb.Database
+ diskdb ethdb.Database
+ triedb *trie.Database
section, sectionSize uint64
lastHash common.Hash
trie *trie.Trie
@@ -121,8 +122,6 @@ type ChtIndexerBackend struct {
// NewBloomTrieIndexer creates a BloomTrie chain indexer
func NewChtIndexer(db ethdb.Database, clientMode bool) *core.ChainIndexer {
- cdb := ethdb.NewTable(db, ChtTablePrefix)
- idb := ethdb.NewTable(db, "chtIndex-")
var sectionSize, confirmReq uint64
if clientMode {
sectionSize = ChtFrequency
@@ -131,17 +130,23 @@ func NewChtIndexer(db ethdb.Database, clientMode bool) *core.ChainIndexer {
sectionSize = ChtV1Frequency
confirmReq = HelperTrieProcessConfirmations
}
- return core.NewChainIndexer(db, idb, &ChtIndexerBackend{db: db, cdb: cdb, sectionSize: sectionSize}, sectionSize, confirmReq, time.Millisecond*100, "cht")
+ idb := ethdb.NewTable(db, "chtIndex-")
+ backend := &ChtIndexerBackend{
+ diskdb: db,
+ triedb: trie.NewDatabase(ethdb.NewTable(db, ChtTablePrefix)),
+ sectionSize: sectionSize,
+ }
+ return core.NewChainIndexer(db, idb, backend, sectionSize, confirmReq, time.Millisecond*100, "cht")
}
// Reset implements core.ChainIndexerBackend
func (c *ChtIndexerBackend) Reset(section uint64, lastSectionHead common.Hash) error {
var root common.Hash
if section > 0 {
- root = GetChtRoot(c.db, section-1, lastSectionHead)
+ root = GetChtRoot(c.diskdb, section-1, lastSectionHead)
}
var err error
- c.trie, err = trie.New(root, c.cdb)
+ c.trie, err = trie.New(root, c.triedb)
c.section = section
return err
}
@@ -151,7 +156,7 @@ func (c *ChtIndexerBackend) Process(header *types.Header) {
hash, num := header.Hash(), header.Number.Uint64()
c.lastHash = hash
- td := core.GetTd(c.db, hash, num)
+ td := core.GetTd(c.diskdb, hash, num)
if td == nil {
panic(nil)
}
@@ -163,17 +168,16 @@ func (c *ChtIndexerBackend) Process(header *types.Header) {
// Commit implements core.ChainIndexerBackend
func (c *ChtIndexerBackend) Commit() error {
- batch := c.cdb.NewBatch()
- root, err := c.trie.CommitTo(batch)
+ root, err := c.trie.Commit(nil)
if err != nil {
return err
- } else {
- batch.Write()
- if ((c.section+1)*c.sectionSize)%ChtFrequency == 0 {
- log.Info("Storing CHT", "idx", c.section*c.sectionSize/ChtFrequency, "sectionHead", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root))
- }
- StoreChtRoot(c.db, c.section, c.lastHash, root)
}
+ c.triedb.Commit(root, false)
+
+ if ((c.section+1)*c.sectionSize)%ChtFrequency == 0 {
+ log.Info("Storing CHT", "idx", c.section*c.sectionSize/ChtFrequency, "sectionHead", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root))
+ }
+ StoreChtRoot(c.diskdb, c.section, c.lastHash, root)
return nil
}
@@ -205,7 +209,8 @@ func StoreBloomTrieRoot(db ethdb.Database, sectionIdx uint64, sectionHead, root
// BloomTrieIndexerBackend implements core.ChainIndexerBackend
type BloomTrieIndexerBackend struct {
- db, cdb ethdb.Database
+ diskdb ethdb.Database
+ triedb *trie.Database
section, parentSectionSize, bloomTrieRatio uint64
trie *trie.Trie
sectionHeads []common.Hash
@@ -213,9 +218,12 @@ type BloomTrieIndexerBackend struct {
// NewBloomTrieIndexer creates a BloomTrie chain indexer
func NewBloomTrieIndexer(db ethdb.Database, clientMode bool) *core.ChainIndexer {
- cdb := ethdb.NewTable(db, BloomTrieTablePrefix)
+ backend := &BloomTrieIndexerBackend{
+ diskdb: db,
+ triedb: trie.NewDatabase(ethdb.NewTable(db, BloomTrieTablePrefix)),
+ }
idb := ethdb.NewTable(db, "bltIndex-")
- backend := &BloomTrieIndexerBackend{db: db, cdb: cdb}
+
var confirmReq uint64
if clientMode {
backend.parentSectionSize = BloomTrieFrequency
@@ -233,10 +241,10 @@ func NewBloomTrieIndexer(db ethdb.Database, clientMode bool) *core.ChainIndexer
func (b *BloomTrieIndexerBackend) Reset(section uint64, lastSectionHead common.Hash) error {
var root common.Hash
if section > 0 {
- root = GetBloomTrieRoot(b.db, section-1, lastSectionHead)
+ root = GetBloomTrieRoot(b.diskdb, section-1, lastSectionHead)
}
var err error
- b.trie, err = trie.New(root, b.cdb)
+ b.trie, err = trie.New(root, b.triedb)
b.section = section
return err
}
@@ -259,7 +267,7 @@ func (b *BloomTrieIndexerBackend) Commit() error {
binary.BigEndian.PutUint64(encKey[2:10], b.section)
var decomp []byte
for j := uint64(0); j < b.bloomTrieRatio; j++ {
- data, err := core.GetBloomBits(b.db, i, b.section*b.bloomTrieRatio+j, b.sectionHeads[j])
+ data, err := core.GetBloomBits(b.diskdb, i, b.section*b.bloomTrieRatio+j, b.sectionHeads[j])
if err != nil {
return err
}
@@ -279,17 +287,15 @@ func (b *BloomTrieIndexerBackend) Commit() error {
b.trie.Delete(encKey[:])
}
}
-
- batch := b.cdb.NewBatch()
- root, err := b.trie.CommitTo(batch)
+ root, err := b.trie.Commit(nil)
if err != nil {
return err
- } else {
- batch.Write()
- sectionHead := b.sectionHeads[b.bloomTrieRatio-1]
- log.Info("Storing BloomTrie", "section", b.section, "sectionHead", fmt.Sprintf("%064x", sectionHead), "root", fmt.Sprintf("%064x", root), "compression ratio", float64(compSize)/float64(decompSize))
- StoreBloomTrieRoot(b.db, b.section, sectionHead, root)
}
+ b.triedb.Commit(root, false)
+
+ sectionHead := b.sectionHeads[b.bloomTrieRatio-1]
+ log.Info("Storing BloomTrie", "section", b.section, "sectionHead", fmt.Sprintf("%064x", sectionHead), "root", fmt.Sprintf("%064x", root), "compression ratio", float64(compSize)/float64(decompSize))
+ StoreBloomTrieRoot(b.diskdb, b.section, sectionHead, root)
return nil
}
diff --git a/light/trie.go b/light/trie.go
index 7502b6e5d..c07e99461 100644
--- a/light/trie.go
+++ b/light/trie.go
@@ -18,12 +18,14 @@ package light
import (
"context"
+ "errors"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/trie"
)
@@ -83,6 +85,10 @@ func (db *odrDatabase) ContractCodeSize(addrHash, codeHash common.Hash) (int, er
return len(code), err
}
+func (db *odrDatabase) TrieDB() *trie.Database {
+ return nil
+}
+
type odrTrie struct {
db *odrDatabase
id *TrieID
@@ -113,11 +119,11 @@ func (t *odrTrie) TryDelete(key []byte) error {
})
}
-func (t *odrTrie) CommitTo(db trie.DatabaseWriter) (common.Hash, error) {
+func (t *odrTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) {
if t.trie == nil {
return t.id.Root, nil
}
- return t.trie.CommitTo(db)
+ return t.trie.Commit(onleaf)
}
func (t *odrTrie) Hash() common.Hash {
@@ -135,13 +141,17 @@ func (t *odrTrie) GetKey(sha []byte) []byte {
return nil
}
+func (t *odrTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error {
+ return errors.New("not implemented, needs client/server interface split")
+}
+
// do tries and retries to execute a function until it returns with no error or
// an error type other than MissingNodeError
func (t *odrTrie) do(key []byte, fn func() error) error {
for {
var err error
if t.trie == nil {
- t.trie, err = trie.New(t.id.Root, t.db.backend.Database())
+ t.trie, err = trie.New(t.id.Root, trie.NewDatabase(t.db.backend.Database()))
}
if err == nil {
err = fn()
@@ -151,7 +161,7 @@ func (t *odrTrie) do(key []byte, fn func() error) error {
}
r := &TrieRequest{Id: t.id, Key: key}
if err := t.db.backend.Retrieve(t.db.ctx, r); err != nil {
- return fmt.Errorf("can't fetch trie key %x: %v", key, err)
+ return err
}
}
}
@@ -167,7 +177,7 @@ func newNodeIterator(t *odrTrie, startkey []byte) trie.NodeIterator {
// Open the actual non-ODR trie if that hasn't happened yet.
if t.trie == nil {
it.do(func() error {
- t, err := trie.New(t.id.Root, t.db.backend.Database())
+ t, err := trie.New(t.id.Root, trie.NewDatabase(t.db.backend.Database()))
if err == nil {
it.t.trie = t
}
diff --git a/light/trie_test.go b/light/trie_test.go
index 5f45c01af..0d6b2cc1d 100644
--- a/light/trie_test.go
+++ b/light/trie_test.go
@@ -40,8 +40,8 @@ func TestNodeIterator(t *testing.T) {
genesis = gspec.MustCommit(fulldb)
)
gspec.MustCommit(lightdb)
- blockchain, _ := core.NewBlockChain(fulldb, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{})
- gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, fulldb, 4, testChainGen)
+ blockchain, _ := core.NewBlockChain(fulldb, nil, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{})
+ gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), fulldb, 4, testChainGen)
if _, err := blockchain.InsertChain(gchain); err != nil {
panic(err)
}
diff --git a/light/txpool.go b/light/txpool.go
index bd215b992..ca41490bd 100644
--- a/light/txpool.go
+++ b/light/txpool.go
@@ -358,7 +358,7 @@ func (pool *TxPool) validateTx(ctx context.Context, tx *types.Transaction) error
// Check the transaction doesn't exceed the current
// block limit gas.
header := pool.chain.GetHeaderByHash(pool.head)
- if header.GasLimit.Cmp(tx.Gas()) < 0 {
+ if header.GasLimit < tx.Gas() {
return core.ErrGasLimit
}
@@ -376,10 +376,13 @@ func (pool *TxPool) validateTx(ctx context.Context, tx *types.Transaction) error
}
// Should supply enough intrinsic gas
- if tx.Gas().Cmp(core.IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead)) < 0 {
+ gas, err := core.IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead)
+ if err != nil {
+ return err
+ }
+ if tx.Gas() < gas {
return core.ErrIntrinsicGas
}
-
return currentState.Error()
}
diff --git a/light/txpool_test.go b/light/txpool_test.go
index fe7936ac2..13d7d3ceb 100644
--- a/light/txpool_test.go
+++ b/light/txpool_test.go
@@ -77,7 +77,7 @@ func txPoolTestChainGen(i int, block *core.BlockGen) {
func TestTxPool(t *testing.T) {
for i := range testTx {
- testTx[i], _ = types.SignTx(types.NewTransaction(uint64(i), acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), types.HomesteadSigner{}, testBankKey)
+ testTx[i], _ = types.SignTx(types.NewTransaction(uint64(i), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), types.HomesteadSigner{}, testBankKey)
}
var (
@@ -88,8 +88,8 @@ func TestTxPool(t *testing.T) {
)
gspec.MustCommit(ldb)
// Assemble the test environment
- blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{})
- gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, sdb, poolTestBlocks, txPoolTestChainGen)
+ blockchain, _ := core.NewBlockChain(sdb, nil, params.TestChainConfig, ethash.NewFullFaker(), vm.Config{})
+ gchain, _ := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), sdb, poolTestBlocks, txPoolTestChainGen)
if _, err := blockchain.InsertChain(gchain); err != nil {
panic(err)
}
diff --git a/miner/worker.go b/miner/worker.go
index c1f848e32..15395ae0b 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -309,7 +309,7 @@ func (self *worker) wait() {
for _, log := range work.state.Logs() {
log.BlockHash = block.Hash()
}
- stat, err := self.chain.WriteBlockAndState(block, work.receipts, work.state)
+ stat, err := self.chain.WriteBlockWithState(block, work.receipts, work.state)
if err != nil {
log.Error("Failed writing block to chain", "err", err)
continue
@@ -413,7 +413,6 @@ func (self *worker) commitNewWork() {
ParentHash: parent.Hash(),
Number: num.Add(num, common.Big1),
GasLimit: core.CalcGasLimit(parent),
- GasUsed: new(big.Int),
Extra: self.extra,
Time: big.NewInt(tstamp),
}
@@ -513,6 +512,11 @@ func (env *Work) commitTransactions(mux *event.TypeMux, txs *types.TransactionsB
var coalescedLogs []*types.Log
for {
+ // If we don't have enough gas for any further transactions then we're done
+ if gp.Gas() < params.TxGas {
+ log.Trace("Not enough gas for further transactions", "gp", gp)
+ break
+ }
// Retrieve the next transaction and abort if all done
tx := txs.Peek()
if tx == nil {
@@ -588,7 +592,7 @@ func (env *Work) commitTransactions(mux *event.TypeMux, txs *types.TransactionsB
func (env *Work) commitTransaction(tx *types.Transaction, bc *core.BlockChain, coinbase common.Address, gp *core.GasPool) (error, []*types.Log) {
snap := env.state.Snapshot()
- receipt, _, err := core.ApplyTransaction(env.config, bc, &coinbase, gp, env.state, env.header, tx, env.header.GasUsed, vm.Config{})
+ receipt, _, err := core.ApplyTransaction(env.config, bc, &coinbase, gp, env.state, env.header, tx, &env.header.GasUsed, vm.Config{})
if err != nil {
env.state.RevertToSnapshot(snap)
return err, nil
diff --git a/mobile/android_test.go b/mobile/android_test.go
index 345e009b4..3d3bd66d0 100644
--- a/mobile/android_test.go
+++ b/mobile/android_test.go
@@ -72,7 +72,7 @@ public class AndroidTest extends InstrumentationTestCase {
Transaction tx = new Transaction(
1, new Address("0x0000000000000000000000000000000000000000"),
- new BigInt(0), new BigInt(0), new BigInt(1), null); // Random empty transaction
+ new BigInt(0), 0, new BigInt(1), null); // Random empty transaction
BigInt chain = new BigInt(1); // Chain identifier of the main net
// Sign a transaction with a single authorization
@@ -164,12 +164,17 @@ func TestAndroid(t *testing.T) {
t.Skip("command gradle not found, skipping")
}
if sdk := os.Getenv("ANDROID_HOME"); sdk == "" {
- t.Skip("ANDROID_HOME environment var not set, skipping")
+ // Android SDK not explicitly given, try to auto-resolve
+ autopath := filepath.Join(os.Getenv("HOME"), "Android", "Sdk")
+ if _, err := os.Stat(autopath); err != nil {
+ t.Skip("ANDROID_HOME environment var not set, skipping")
+ }
+ os.Setenv("ANDROID_HOME", autopath)
}
if _, err := exec.Command("which", "gomobile").CombinedOutput(); err != nil {
t.Log("gomobile missing, installing it...")
- if _, err := exec.Command("go", "install", "golang.org/x/mobile/cmd/gomobile").CombinedOutput(); err != nil {
- t.Fatalf("install failed: %v", err)
+ if out, err := exec.Command("go", "get", "golang.org/x/mobile/cmd/gomobile").CombinedOutput(); err != nil {
+ t.Fatalf("install failed: %v\n%s", err, string(out))
}
t.Log("initializing gomobile...")
start := time.Now()
@@ -239,7 +244,7 @@ const gradleConfig = `buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.5.0'
+ classpath 'com.android.tools.build:gradle:2.2.3'
}
}
allprojects {
diff --git a/mobile/bind.go b/mobile/bind.go
index 7b79bedaf..7a1bf9e60 100644
--- a/mobile/bind.go
+++ b/mobile/bind.go
@@ -77,7 +77,7 @@ func (opts *TransactOpts) GetFrom() *Address { return &Address{opts.opts.From
func (opts *TransactOpts) GetNonce() int64 { return opts.opts.Nonce.Int64() }
func (opts *TransactOpts) GetValue() *BigInt { return &BigInt{opts.opts.Value} }
func (opts *TransactOpts) GetGasPrice() *BigInt { return &BigInt{opts.opts.GasPrice} }
-func (opts *TransactOpts) GetGasLimit() int64 { return opts.opts.GasLimit.Int64() }
+func (opts *TransactOpts) GetGasLimit() int64 { return int64(opts.opts.GasLimit) }
// GetSigner cannot be reliably implemented without identity preservation (https://github.com/golang/go/issues/16876)
// func (opts *TransactOpts) GetSigner() Signer { return &signer{opts.opts.Signer} }
@@ -99,7 +99,7 @@ func (opts *TransactOpts) SetSigner(s Signer) {
}
func (opts *TransactOpts) SetValue(value *BigInt) { opts.opts.Value = value.bigint }
func (opts *TransactOpts) SetGasPrice(price *BigInt) { opts.opts.GasPrice = price.bigint }
-func (opts *TransactOpts) SetGasLimit(limit int64) { opts.opts.GasLimit = big.NewInt(limit) }
+func (opts *TransactOpts) SetGasLimit(limit int64) { opts.opts.GasLimit = uint64(limit) }
func (opts *TransactOpts) SetContext(context *Context) { opts.opts.Context = context.context }
// BoundContract is the base wrapper object that reflects a contract on the
@@ -138,7 +138,7 @@ func BindContract(address *Address, abiJSON string, client *EthereumClient) (con
return nil, err
}
return &BoundContract{
- contract: bind.NewBoundContract(address.address, parsed, client.client, client.client),
+ contract: bind.NewBoundContract(address.address, parsed, client.client, client.client, client.client),
address: address.address,
}, nil
}
diff --git a/mobile/ethclient.go b/mobile/ethclient.go
index 758863b6d..66399c6b5 100644
--- a/mobile/ethclient.go
+++ b/mobile/ethclient.go
@@ -298,9 +298,9 @@ func (ec *EthereumClient) SuggestGasPrice(ctx *Context) (price *BigInt, _ error)
// the current pending state of the backend blockchain. There is no guarantee that this is
// the true gas limit requirement as other transactions may be added or removed by miners,
// but it should provide a basis for setting a reasonable default.
-func (ec *EthereumClient) EstimateGas(ctx *Context, msg *CallMsg) (gas *BigInt, _ error) {
+func (ec *EthereumClient) EstimateGas(ctx *Context, msg *CallMsg) (gas int64, _ error) {
rawGas, err := ec.client.EstimateGas(ctx.context, msg.msg)
- return &BigInt{rawGas}, err
+ return int64(rawGas), err
}
// SendTransaction injects a signed transaction into the pending pool for execution.
diff --git a/mobile/ethereum.go b/mobile/ethereum.go
index c9bb3013c..0eb1d9055 100644
--- a/mobile/ethereum.go
+++ b/mobile/ethereum.go
@@ -20,7 +20,6 @@ package geth
import (
"errors"
- "math/big"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
@@ -49,7 +48,7 @@ func NewCallMsg() *CallMsg {
}
func (msg *CallMsg) GetFrom() *Address { return &Address{msg.msg.From} }
-func (msg *CallMsg) GetGas() int64 { return msg.msg.Gas.Int64() }
+func (msg *CallMsg) GetGas() int64 { return int64(msg.msg.Gas) }
func (msg *CallMsg) GetGasPrice() *BigInt { return &BigInt{msg.msg.GasPrice} }
func (msg *CallMsg) GetValue() *BigInt { return &BigInt{msg.msg.Value} }
func (msg *CallMsg) GetData() []byte { return msg.msg.Data }
@@ -61,7 +60,7 @@ func (msg *CallMsg) GetTo() *Address {
}
func (msg *CallMsg) SetFrom(address *Address) { msg.msg.From = address.address }
-func (msg *CallMsg) SetGas(gas int64) { msg.msg.Gas = big.NewInt(gas) }
+func (msg *CallMsg) SetGas(gas int64) { msg.msg.Gas = uint64(gas) }
func (msg *CallMsg) SetGasPrice(price *BigInt) { msg.msg.GasPrice = price.bigint }
func (msg *CallMsg) SetValue(value *BigInt) { msg.msg.Value = value.bigint }
func (msg *CallMsg) SetData(data []byte) { msg.msg.Data = common.CopyBytes(data) }
diff --git a/mobile/geth.go b/mobile/geth.go
index 7b39faade..7e3b8f491 100644
--- a/mobile/geth.go
+++ b/mobile/geth.go
@@ -116,7 +116,6 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) {
P2P: p2p.Config{
NoDiscovery: true,
DiscoveryV5: true,
- DiscoveryV5Addr: ":0",
BootstrapNodesV5: config.BootstrapNodes.nodes,
ListenAddr: ":0",
NAT: nat.Any(),
diff --git a/mobile/types.go b/mobile/types.go
index b7f8a3bc1..4790afcef 100644
--- a/mobile/types.go
+++ b/mobile/types.go
@@ -112,8 +112,8 @@ func (h *Header) GetReceiptHash() *Hash { return &Hash{h.header.ReceiptHash} }
func (h *Header) GetBloom() *Bloom { return &Bloom{h.header.Bloom} }
func (h *Header) GetDifficulty() *BigInt { return &BigInt{h.header.Difficulty} }
func (h *Header) GetNumber() int64 { return h.header.Number.Int64() }
-func (h *Header) GetGasLimit() int64 { return h.header.GasLimit.Int64() }
-func (h *Header) GetGasUsed() int64 { return h.header.GasUsed.Int64() }
+func (h *Header) GetGasLimit() int64 { return int64(h.header.GasLimit) }
+func (h *Header) GetGasUsed() int64 { return int64(h.header.GasUsed) }
func (h *Header) GetTime() int64 { return h.header.Time.Int64() }
func (h *Header) GetExtra() []byte { return h.header.Extra }
func (h *Header) GetMixDigest() *Hash { return &Hash{h.header.MixDigest} }
@@ -189,8 +189,8 @@ func (b *Block) GetReceiptHash() *Hash { return &Hash{b.block.ReceiptHash()} }
func (b *Block) GetBloom() *Bloom { return &Bloom{b.block.Bloom()} }
func (b *Block) GetDifficulty() *BigInt { return &BigInt{b.block.Difficulty()} }
func (b *Block) GetNumber() int64 { return b.block.Number().Int64() }
-func (b *Block) GetGasLimit() int64 { return b.block.GasLimit().Int64() }
-func (b *Block) GetGasUsed() int64 { return b.block.GasUsed().Int64() }
+func (b *Block) GetGasLimit() int64 { return int64(b.block.GasLimit()) }
+func (b *Block) GetGasUsed() int64 { return int64(b.block.GasUsed()) }
func (b *Block) GetTime() int64 { return b.block.Time().Int64() }
func (b *Block) GetExtra() []byte { return b.block.Extra() }
func (b *Block) GetMixDigest() *Hash { return &Hash{b.block.MixDigest()} }
@@ -212,8 +212,8 @@ type Transaction struct {
}
// NewTransaction creates a new transaction with the given properties.
-func NewTransaction(nonce int64, to *Address, amount, gasLimit, gasPrice *BigInt, data []byte) *Transaction {
- return &Transaction{types.NewTransaction(uint64(nonce), to.address, amount.bigint, gasLimit.bigint, gasPrice.bigint, common.CopyBytes(data))}
+func NewTransaction(nonce int64, to *Address, amount *BigInt, gasLimit int64, gasPrice *BigInt, data []byte) *Transaction {
+ return &Transaction{types.NewTransaction(uint64(nonce), to.address, amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))}
}
// NewTransactionFromRLP parses a transaction from an RLP data dump.
@@ -256,7 +256,7 @@ func (tx *Transaction) String() string {
}
func (tx *Transaction) GetData() []byte { return tx.tx.Data() }
-func (tx *Transaction) GetGas() int64 { return tx.tx.Gas().Int64() }
+func (tx *Transaction) GetGas() int64 { return int64(tx.tx.Gas()) }
func (tx *Transaction) GetGasPrice() *BigInt { return &BigInt{tx.tx.GasPrice()} }
func (tx *Transaction) GetValue() *BigInt { return &BigInt{tx.tx.Value()} }
func (tx *Transaction) GetNonce() int64 { return int64(tx.tx.Nonce()) }
@@ -353,10 +353,10 @@ func (r *Receipt) String() string {
return r.receipt.String()
}
-func (r *Receipt) GetPostState() []byte { return r.receipt.PostState }
-func (r *Receipt) GetCumulativeGasUsed() *BigInt { return &BigInt{r.receipt.CumulativeGasUsed} }
-func (r *Receipt) GetBloom() *Bloom { return &Bloom{r.receipt.Bloom} }
-func (r *Receipt) GetLogs() *Logs { return &Logs{r.receipt.Logs} }
-func (r *Receipt) GetTxHash() *Hash { return &Hash{r.receipt.TxHash} }
-func (r *Receipt) GetContractAddress() *Address { return &Address{r.receipt.ContractAddress} }
-func (r *Receipt) GetGasUsed() *BigInt { return &BigInt{r.receipt.GasUsed} }
+func (r *Receipt) GetPostState() []byte { return r.receipt.PostState }
+func (r *Receipt) GetCumulativeGasUsed() int64 { return int64(r.receipt.CumulativeGasUsed) }
+func (r *Receipt) GetBloom() *Bloom { return &Bloom{r.receipt.Bloom} }
+func (r *Receipt) GetLogs() *Logs { return &Logs{r.receipt.Logs} }
+func (r *Receipt) GetTxHash() *Hash { return &Hash{r.receipt.TxHash} }
+func (r *Receipt) GetContractAddress() *Address { return &Address{r.receipt.ContractAddress} }
+func (r *Receipt) GetGasUsed() int64 { return int64(r.receipt.GasUsed) }
diff --git a/node/defaults.go b/node/defaults.go
index 848f08e05..d4e148683 100644
--- a/node/defaults.go
+++ b/node/defaults.go
@@ -41,10 +41,9 @@ var DefaultConfig = Config{
WSPort: DefaultWSPort,
WSModules: []string{"net", "web3"},
P2P: p2p.Config{
- ListenAddr: ":30303",
- DiscoveryV5Addr: ":30304",
- MaxPeers: 25,
- NAT: nat.Any(),
+ ListenAddr: ":30303",
+ MaxPeers: 25,
+ NAT: nat.Any(),
},
}
diff --git a/p2p/discover/database.go b/p2p/discover/database.go
index 7206a63c6..b136609f2 100644
--- a/p2p/discover/database.go
+++ b/p2p/discover/database.go
@@ -226,14 +226,14 @@ func (db *nodeDB) ensureExpirer() {
// expirer should be started in a go routine, and is responsible for looping ad
// infinitum and dropping stale data from the database.
func (db *nodeDB) expirer() {
- tick := time.Tick(nodeDBCleanupCycle)
+ tick := time.NewTicker(nodeDBCleanupCycle)
+ defer tick.Stop()
for {
select {
- case <-tick:
+ case <-tick.C:
if err := db.expireNodes(); err != nil {
log.Error("Failed to expire nodedb items", "err", err)
}
-
case <-db.quit:
return
}
diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go
index f9eb99ee3..60436952d 100644
--- a/p2p/discover/udp.go
+++ b/p2p/discover/udp.go
@@ -210,17 +210,15 @@ type reply struct {
matched chan<- bool
}
+// ReadPacket is sent to the unhandled channel when it could not be processed
+type ReadPacket struct {
+ Data []byte
+ Addr *net.UDPAddr
+}
+
// ListenUDP returns a new table that listens for UDP packets on laddr.
-func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBPath string, netrestrict *netutil.Netlist) (*Table, error) {
- addr, err := net.ResolveUDPAddr("udp", laddr)
- if err != nil {
- return nil, err
- }
- conn, err := net.ListenUDP("udp", addr)
- if err != nil {
- return nil, err
- }
- tab, _, err := newUDP(priv, conn, natm, nodeDBPath, netrestrict)
+func ListenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr, unhandled chan ReadPacket, nodeDBPath string, netrestrict *netutil.Netlist) (*Table, error) {
+ tab, _, err := newUDP(priv, conn, realaddr, unhandled, nodeDBPath, netrestrict)
if err != nil {
return nil, err
}
@@ -228,7 +226,7 @@ func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBP
return tab, nil
}
-func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath string, netrestrict *netutil.Netlist) (*Table, *udp, error) {
+func newUDP(priv *ecdsa.PrivateKey, c conn, realaddr *net.UDPAddr, unhandled chan ReadPacket, nodeDBPath string, netrestrict *netutil.Netlist) (*Table, *udp, error) {
udp := &udp{
conn: c,
priv: priv,
@@ -237,16 +235,6 @@ func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath strin
gotreply: make(chan reply),
addpending: make(chan *pending),
}
- realaddr := c.LocalAddr().(*net.UDPAddr)
- if natm != nil {
- if !realaddr.IP.IsLoopback() {
- go nat.Map(natm, udp.closing, "udp", realaddr.Port, realaddr.Port, "ethereum discovery")
- }
- // TODO: react to external IP changes over time.
- if ext, err := natm.ExternalIP(); err == nil {
- realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}
- }
- }
// TODO: separate TCP port
udp.ourEndpoint = makeEndpoint(realaddr, uint16(realaddr.Port))
tab, err := newTable(udp, PubkeyID(&priv.PublicKey), realaddr, nodeDBPath)
@@ -256,7 +244,7 @@ func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath strin
udp.Table = tab
go udp.loop()
- go udp.readLoop()
+ go udp.readLoop(unhandled)
return udp.Table, udp, nil
}
@@ -492,8 +480,11 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) ([]byte,
}
// readLoop runs in its own goroutine. it handles incoming UDP packets.
-func (t *udp) readLoop() {
+func (t *udp) readLoop(unhandled chan ReadPacket) {
defer t.conn.Close()
+ if unhandled != nil {
+ defer close(unhandled)
+ }
// Discovery packets are defined to be no larger than 1280 bytes.
// Packets larger than this size will be cut at the end and treated
// as invalid because their hash won't match.
@@ -509,7 +500,12 @@ func (t *udp) readLoop() {
log.Debug("UDP read error", "err", err)
return
}
- t.handlePacket(from, buf[:nbytes])
+ if t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil {
+ select {
+ case unhandled <- ReadPacket{buf[:nbytes], from}:
+ default:
+ }
+ }
}
}
diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go
index 21e8b561d..b81caf839 100644
--- a/p2p/discover/udp_test.go
+++ b/p2p/discover/udp_test.go
@@ -70,7 +70,8 @@ func newUDPTest(t *testing.T) *udpTest {
remotekey: newkey(),
remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303},
}
- test.table, test.udp, _ = newUDP(test.localkey, test.pipe, nil, "", nil)
+ realaddr := test.pipe.LocalAddr().(*net.UDPAddr)
+ test.table, test.udp, _ = newUDP(test.localkey, test.pipe, realaddr, nil, "", nil)
return test
}
diff --git a/p2p/discv5/database.go b/p2p/discv5/database.go
index a3b044ec1..3c2d5744c 100644
--- a/p2p/discv5/database.go
+++ b/p2p/discv5/database.go
@@ -239,14 +239,14 @@ func (db *nodeDB) ensureExpirer() {
// expirer should be started in a go routine, and is responsible for looping ad
// infinitum and dropping stale data from the database.
func (db *nodeDB) expirer() {
- tick := time.Tick(nodeDBCleanupCycle)
+ tick := time.NewTicker(nodeDBCleanupCycle)
+ defer tick.Stop()
for {
select {
- case <-tick:
+ case <-tick.C:
if err := db.expireNodes(); err != nil {
log.Error(fmt.Sprintf("Failed to expire nodedb items: %v", err))
}
-
case <-db.quit:
return
}
diff --git a/p2p/discv5/net.go b/p2p/discv5/net.go
index 2fbb60824..f9baf126f 100644
--- a/p2p/discv5/net.go
+++ b/p2p/discv5/net.go
@@ -29,7 +29,6 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto/sha3"
"github.com/ethereum/go-ethereum/log"
- "github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/p2p/netutil"
"github.com/ethereum/go-ethereum/rlp"
)
@@ -51,16 +50,9 @@ const (
const testTopic = "foo"
const (
- printDebugLogs = false
printTestImgLogs = false
)
-func debugLog(s string) {
- if printDebugLogs {
- fmt.Println(s)
- }
-}
-
// Network manages the table and all protocol interaction.
type Network struct {
db *nodeDB // database of known nodes
@@ -141,7 +133,7 @@ type timeoutEvent struct {
node *Node
}
-func newNetwork(conn transport, ourPubkey ecdsa.PublicKey, natm nat.Interface, dbPath string, netrestrict *netutil.Netlist) (*Network, error) {
+func newNetwork(conn transport, ourPubkey ecdsa.PublicKey, dbPath string, netrestrict *netutil.Netlist) (*Network, error) {
ourID := PubkeyID(&ourPubkey)
var db *nodeDB
@@ -388,14 +380,14 @@ func (net *Network) loop() {
}
}()
resetNextTicket := func() {
- t, timeout := net.ticketStore.nextFilteredTicket()
- if t != nextTicket {
- nextTicket = t
+ ticket, timeout := net.ticketStore.nextFilteredTicket()
+ if nextTicket != ticket {
+ nextTicket = ticket
if nextRegisterTimer != nil {
nextRegisterTimer.Stop()
nextRegisterTime = nil
}
- if t != nil {
+ if ticket != nil {
nextRegisterTimer = time.NewTimer(timeout)
nextRegisterTime = nextRegisterTimer.C
}
@@ -423,13 +415,13 @@ loop:
select {
case <-net.closeReq:
- debugLog("<-net.closeReq")
+ log.Trace("<-net.closeReq")
break loop
// Ingress packet handling.
case pkt := <-net.read:
//fmt.Println("read", pkt.ev)
- debugLog("<-net.read")
+ log.Trace("<-net.read")
n := net.internNode(&pkt)
prestate := n.state
status := "ok"
@@ -444,7 +436,7 @@ loop:
// State transition timeouts.
case timeout := <-net.timeout:
- debugLog("<-net.timeout")
+ log.Trace("<-net.timeout")
if net.timeoutTimers[timeout] == nil {
// Stale timer (was aborted).
continue
@@ -462,20 +454,20 @@ loop:
// Querying.
case q := <-net.queryReq:
- debugLog("<-net.queryReq")
+ log.Trace("<-net.queryReq")
if !q.start(net) {
q.remote.deferQuery(q)
}
// Interacting with the table.
case f := <-net.tableOpReq:
- debugLog("<-net.tableOpReq")
+ log.Trace("<-net.tableOpReq")
f()
net.tableOpResp <- struct{}{}
// Topic registration stuff.
case req := <-net.topicRegisterReq:
- debugLog("<-net.topicRegisterReq")
+ log.Trace("<-net.topicRegisterReq")
if !req.add {
net.ticketStore.removeRegisterTopic(req.topic)
continue
@@ -486,7 +478,7 @@ loop:
// determination for new topics.
// if topicRegisterLookupDone == nil {
if topicRegisterLookupTarget.target == (common.Hash{}) {
- debugLog("topicRegisterLookupTarget == null")
+ log.Trace("topicRegisterLookupTarget == null")
if topicRegisterLookupTick.Stop() {
<-topicRegisterLookupTick.C
}
@@ -496,7 +488,7 @@ loop:
}
case nodes := <-topicRegisterLookupDone:
- debugLog("<-topicRegisterLookupDone")
+ log.Trace("<-topicRegisterLookupDone")
net.ticketStore.registerLookupDone(topicRegisterLookupTarget, nodes, func(n *Node) []byte {
net.ping(n, n.addr())
return n.pingEcho
@@ -507,7 +499,7 @@ loop:
topicRegisterLookupDone = nil
case <-topicRegisterLookupTick.C:
- debugLog("<-topicRegisterLookupTick")
+ log.Trace("<-topicRegisterLookupTick")
if (topicRegisterLookupTarget.target == common.Hash{}) {
target, delay := net.ticketStore.nextRegisterLookup()
topicRegisterLookupTarget = target
@@ -520,14 +512,14 @@ loop:
}
case <-nextRegisterTime:
- debugLog("<-nextRegisterTime")
+ log.Trace("<-nextRegisterTime")
net.ticketStore.ticketRegistered(*nextTicket)
//fmt.Println("sendTopicRegister", nextTicket.t.node.addr().String(), nextTicket.t.topics, nextTicket.idx, nextTicket.t.pong)
net.conn.sendTopicRegister(nextTicket.t.node, nextTicket.t.topics, nextTicket.idx, nextTicket.t.pong)
case req := <-net.topicSearchReq:
if refreshDone == nil {
- debugLog("<-net.topicSearchReq")
+ log.Trace("<-net.topicSearchReq")
info, ok := searchInfo[req.topic]
if ok {
if req.delay == time.Duration(0) {
@@ -588,7 +580,7 @@ loop:
})
case <-statsDump.C:
- debugLog("<-statsDump.C")
+ log.Trace("<-statsDump.C")
/*r, ok := net.ticketStore.radius[testTopic]
if !ok {
fmt.Printf("(%x) no radius @ %v\n", net.tab.self.ID[:8], time.Now())
@@ -617,7 +609,7 @@ loop:
// Periodic / lookup-initiated bucket refresh.
case <-refreshTimer.C:
- debugLog("<-refreshTimer.C")
+ log.Trace("<-refreshTimer.C")
// TODO: ideally we would start the refresh timer after
// fallback nodes have been set for the first time.
if refreshDone == nil {
@@ -631,7 +623,7 @@ loop:
bucketRefreshTimer.Reset(bucketRefreshInterval)
}()
case newNursery := <-net.refreshReq:
- debugLog("<-net.refreshReq")
+ log.Trace("<-net.refreshReq")
if newNursery != nil {
net.nursery = newNursery
}
@@ -641,7 +633,7 @@ loop:
}
net.refreshResp <- refreshDone
case <-refreshDone:
- debugLog("<-net.refreshDone")
+ log.Trace("<-net.refreshDone")
refreshDone = nil
list := searchReqWhenRefreshDone
searchReqWhenRefreshDone = nil
@@ -652,7 +644,7 @@ loop:
}()
}
}
- debugLog("loop stopped")
+ log.Trace("loop stopped")
log.Debug(fmt.Sprintf("shutting down"))
if net.conn != nil {
@@ -1109,14 +1101,14 @@ func (net *Network) ping(n *Node, addr *net.UDPAddr) {
//fmt.Println(" not sent")
return
}
- debugLog(fmt.Sprintf("ping(node = %x)", n.ID[:8]))
+ log.Trace("Pinging remote node", "node", n.ID)
n.pingTopics = net.ticketStore.regTopicSet()
n.pingEcho = net.conn.sendPing(n, addr, n.pingTopics)
net.timedEvent(respTimeout, n, pongTimeout)
}
func (net *Network) handlePing(n *Node, pkt *ingressPacket) {
- debugLog(fmt.Sprintf("handlePing(node = %x)", n.ID[:8]))
+ log.Trace("Handling remote ping", "node", n.ID)
ping := pkt.data.(*ping)
n.TCP = ping.From.TCP
t := net.topictab.getTicket(n, ping.Topics)
@@ -1131,7 +1123,7 @@ func (net *Network) handlePing(n *Node, pkt *ingressPacket) {
}
func (net *Network) handleKnownPong(n *Node, pkt *ingressPacket) error {
- debugLog(fmt.Sprintf("handleKnownPong(node = %x)", n.ID[:8]))
+ log.Trace("Handling known pong", "node", n.ID)
net.abortTimedEvent(n, pongTimeout)
now := mclock.Now()
ticket, err := pongToTicket(now, n.pingTopics, n, pkt)
@@ -1139,9 +1131,8 @@ func (net *Network) handleKnownPong(n *Node, pkt *ingressPacket) error {
// fmt.Printf("(%x) ticket: %+v\n", net.tab.self.ID[:8], pkt.data)
net.ticketStore.addTicket(now, pkt.data.(*pong).ReplyTok, ticket)
} else {
- debugLog(fmt.Sprintf(" error: %v", err))
+ log.Trace("Failed to convert pong to ticket", "err", err)
}
-
n.pingEcho = nil
n.pingTopics = nil
return err
diff --git a/p2p/discv5/net_test.go b/p2p/discv5/net_test.go
index bd234f5ba..369282ca9 100644
--- a/p2p/discv5/net_test.go
+++ b/p2p/discv5/net_test.go
@@ -28,7 +28,7 @@ import (
func TestNetwork_Lookup(t *testing.T) {
key, _ := crypto.GenerateKey()
- network, err := newNetwork(lookupTestnet, key.PublicKey, nil, "", nil)
+ network, err := newNetwork(lookupTestnet, key.PublicKey, "", nil)
if err != nil {
t.Fatal(err)
}
diff --git a/p2p/discv5/node.go b/p2p/discv5/node.go
index 2db7a508f..fd88a55b1 100644
--- a/p2p/discv5/node.go
+++ b/p2p/discv5/node.go
@@ -273,6 +273,11 @@ func (n NodeID) GoString() string {
return fmt.Sprintf("discover.HexID(\"%x\")", n[:])
}
+// TerminalString returns a shortened hex string for terminal logging.
+func (n NodeID) TerminalString() string {
+ return hex.EncodeToString(n[:8])
+}
+
// HexID converts a hex string to a NodeID.
// The string may be prefixed with 0x.
func HexID(in string) (NodeID, error) {
diff --git a/p2p/discv5/nodeevent_string.go b/p2p/discv5/nodeevent_string.go
index fde9045c5..eb696fb8b 100644
--- a/p2p/discv5/nodeevent_string.go
+++ b/p2p/discv5/nodeevent_string.go
@@ -1,8 +1,8 @@
-// Code generated by "stringer -type nodeEvent"; DO NOT EDIT
+// Code generated by "stringer -type=nodeEvent"; DO NOT EDIT.
package discv5
-import "fmt"
+import "strconv"
const (
_nodeEvent_name_0 = "invalidEventpingPacketpongPacketfindnodePacketneighborsPacketfindnodeHashPackettopicRegisterPackettopicQueryPackettopicNodesPacket"
@@ -22,6 +22,6 @@ func (i nodeEvent) String() string {
i -= 265
return _nodeEvent_name_1[_nodeEvent_index_1[i]:_nodeEvent_index_1[i+1]]
default:
- return fmt.Sprintf("nodeEvent(%d)", i)
+ return "nodeEvent(" + strconv.FormatInt(int64(i), 10) + ")"
}
}
diff --git a/p2p/discv5/sim_test.go b/p2p/discv5/sim_test.go
index bf57872e2..543faecd4 100644
--- a/p2p/discv5/sim_test.go
+++ b/p2p/discv5/sim_test.go
@@ -282,7 +282,7 @@ func (s *simulation) launchNode(log bool) *Network {
addr := &net.UDPAddr{IP: ip, Port: 30303}
transport := &simTransport{joinTime: time.Now(), sender: id, senderAddr: addr, sim: s, priv: key}
- net, err := newNetwork(transport, key.PublicKey, nil, "<no database>", nil)
+ net, err := newNetwork(transport, key.PublicKey, "<no database>", nil)
if err != nil {
panic("cannot launch new node: " + err.Error())
}
diff --git a/p2p/discv5/ticket.go b/p2p/discv5/ticket.go
index 193cef4be..37ce8d23c 100644
--- a/p2p/discv5/ticket.go
+++ b/p2p/discv5/ticket.go
@@ -28,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/mclock"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/log"
)
const (
@@ -128,8 +129,11 @@ type ticketStore struct {
// Contains buckets (for each absolute minute) of tickets
// that can be used in that minute.
// This is only set if the topic is being registered.
- tickets map[Topic]topicTickets
- regtopics []Topic
+ tickets map[Topic]*topicTickets
+
+ regQueue []Topic // Topic registration queue for round robin attempts
+ regSet map[Topic]struct{} // Topic registration queue contents for fast filling
+
nodes map[*Node]*ticket
nodeLastReq map[*Node]reqInfo
@@ -152,14 +156,16 @@ type sentQuery struct {
}
type topicTickets struct {
- buckets map[timeBucket][]ticketRef
- nextLookup, nextReg mclock.AbsTime
+ buckets map[timeBucket][]ticketRef
+ nextLookup mclock.AbsTime
+ nextReg mclock.AbsTime
}
func newTicketStore() *ticketStore {
return &ticketStore{
radius: make(map[Topic]*topicRadius),
- tickets: make(map[Topic]topicTickets),
+ tickets: make(map[Topic]*topicTickets),
+ regSet: make(map[Topic]struct{}),
nodes: make(map[*Node]*ticket),
nodeLastReq: make(map[*Node]reqInfo),
searchTopicMap: make(map[Topic]searchTopic),
@@ -169,13 +175,13 @@ func newTicketStore() *ticketStore {
// addTopic starts tracking a topic. If register is true,
// the local node will register the topic and tickets will be collected.
-func (s *ticketStore) addTopic(t Topic, register bool) {
- debugLog(fmt.Sprintf(" addTopic(%v, %v)", t, register))
- if s.radius[t] == nil {
- s.radius[t] = newTopicRadius(t)
+func (s *ticketStore) addTopic(topic Topic, register bool) {
+ log.Trace("Adding discovery topic", "topic", topic, "register", register)
+ if s.radius[topic] == nil {
+ s.radius[topic] = newTopicRadius(topic)
}
- if register && s.tickets[t].buckets == nil {
- s.tickets[t] = topicTickets{buckets: make(map[timeBucket][]ticketRef)}
+ if register && s.tickets[topic] == nil {
+ s.tickets[topic] = &topicTickets{buckets: make(map[timeBucket][]ticketRef)}
}
}
@@ -194,7 +200,11 @@ func (s *ticketStore) removeSearchTopic(t Topic) {
// removeRegisterTopic deletes all tickets for the given topic.
func (s *ticketStore) removeRegisterTopic(topic Topic) {
- debugLog(fmt.Sprintf(" removeRegisterTopic(%v)", topic))
+ log.Trace("Removing discovery topic", "topic", topic)
+ if s.tickets[topic] == nil {
+ log.Warn("Removing non-existent discovery topic", "topic", topic)
+ return
+ }
for _, list := range s.tickets[topic].buckets {
for _, ref := range list {
ref.t.refCnt--
@@ -216,23 +226,35 @@ func (s *ticketStore) regTopicSet() []Topic {
}
// nextRegisterLookup returns the target of the next lookup for ticket collection.
-func (s *ticketStore) nextRegisterLookup() (lookup lookupInfo, delay time.Duration) {
- debugLog("nextRegisterLookup()")
- firstTopic, ok := s.iterRegTopics()
- for topic := firstTopic; ok; {
- debugLog(fmt.Sprintf(" checking topic %v, len(s.tickets[topic]) = %d", topic, len(s.tickets[topic].buckets)))
- if s.tickets[topic].buckets != nil && s.needMoreTickets(topic) {
- next := s.radius[topic].nextTarget(false)
- debugLog(fmt.Sprintf(" %x 1s", next.target[:8]))
- return next, 100 * time.Millisecond
+func (s *ticketStore) nextRegisterLookup() (lookupInfo, time.Duration) {
+ // Queue up any new topics (or discarded ones), preserving iteration order
+ for topic := range s.tickets {
+ if _, ok := s.regSet[topic]; !ok {
+ s.regQueue = append(s.regQueue, topic)
+ s.regSet[topic] = struct{}{}
+ }
+ }
+ // Iterate over the set of all topics and look up the next suitable one
+ for len(s.regQueue) > 0 {
+ // Fetch the next topic from the queue, and ensure it still exists
+ topic := s.regQueue[0]
+ s.regQueue = s.regQueue[1:]
+ delete(s.regSet, topic)
+
+ if s.tickets[topic] == nil {
+ continue
}
- topic, ok = s.iterRegTopics()
- if topic == firstTopic {
- break // We have checked all topics.
+ // If the topic needs more tickets, return it
+ if s.tickets[topic].nextLookup < mclock.Now() {
+ next, delay := s.radius[topic].nextTarget(false), 100*time.Millisecond
+ log.Trace("Found discovery topic to register", "topic", topic, "target", next.target, "delay", delay)
+ return next, delay
}
}
- debugLog(" null, 40s")
- return lookupInfo{}, 40 * time.Second
+ // No registration topics found or all exhausted, sleep
+ delay := 40 * time.Second
+ log.Trace("No topic found to register", "delay", delay)
+ return lookupInfo{}, delay
}
func (s *ticketStore) nextSearchLookup(topic Topic) lookupInfo {
@@ -246,40 +268,22 @@ func (s *ticketStore) nextSearchLookup(topic Topic) lookupInfo {
return target
}
-// iterRegTopics returns topics to register in arbitrary order.
-// The second return value is false if there are no topics.
-func (s *ticketStore) iterRegTopics() (Topic, bool) {
- debugLog("iterRegTopics()")
- if len(s.regtopics) == 0 {
- if len(s.tickets) == 0 {
- debugLog(" false")
- return "", false
- }
- // Refill register list.
- for t := range s.tickets {
- s.regtopics = append(s.regtopics, t)
- }
+// ticketsInWindow returns the tickets of a given topic in the registration window.
+func (s *ticketStore) ticketsInWindow(topic Topic) []ticketRef {
+ // Sanity check that the topic still exists before operating on it
+ if s.tickets[topic] == nil {
+ log.Warn("Listing non-existing discovery tickets", "topic", topic)
+ return nil
}
- topic := s.regtopics[len(s.regtopics)-1]
- s.regtopics = s.regtopics[:len(s.regtopics)-1]
- debugLog(" " + string(topic) + " true")
- return topic, true
-}
-
-func (s *ticketStore) needMoreTickets(t Topic) bool {
- return s.tickets[t].nextLookup < mclock.Now()
-}
+ // Gather all the tickers in the next time window
+ var tickets []ticketRef
-// ticketsInWindow returns the tickets of a given topic in the registration window.
-func (s *ticketStore) ticketsInWindow(t Topic) []ticketRef {
- ltBucket := s.lastBucketFetched
- var res []ticketRef
- tickets := s.tickets[t].buckets
- for g := ltBucket; g < ltBucket+timeWindow; g++ {
- res = append(res, tickets[g]...)
+ buckets := s.tickets[topic].buckets
+ for idx := timeBucket(0); idx < timeWindow; idx++ {
+ tickets = append(tickets, buckets[s.lastBucketFetched+idx]...)
}
- debugLog(fmt.Sprintf("ticketsInWindow(%v) = %v", t, len(res)))
- return res
+ log.Trace("Retrieved discovery registration tickets", "topic", topic, "from", s.lastBucketFetched, "tickets", len(tickets))
+ return tickets
}
func (s *ticketStore) removeExcessTickets(t Topic) {
@@ -317,53 +321,55 @@ func (s ticketRefByWaitTime) Swap(i, j int) {
func (s *ticketStore) addTicketRef(r ticketRef) {
topic := r.t.topics[r.idx]
- t := s.tickets[topic]
- if t.buckets == nil {
+ tickets := s.tickets[topic]
+ if tickets == nil {
+ log.Warn("Adding ticket to non-existent topic", "topic", topic)
return
}
bucket := timeBucket(r.t.regTime[r.idx] / mclock.AbsTime(ticketTimeBucketLen))
- t.buckets[bucket] = append(t.buckets[bucket], r)
+ tickets.buckets[bucket] = append(tickets.buckets[bucket], r)
r.t.refCnt++
min := mclock.Now() - mclock.AbsTime(collectFrequency)*maxCollectDebt
- if t.nextLookup < min {
- t.nextLookup = min
+ if tickets.nextLookup < min {
+ tickets.nextLookup = min
}
- t.nextLookup += mclock.AbsTime(collectFrequency)
- s.tickets[topic] = t
+ tickets.nextLookup += mclock.AbsTime(collectFrequency)
//s.removeExcessTickets(topic)
}
-func (s *ticketStore) nextFilteredTicket() (t *ticketRef, wait time.Duration) {
+func (s *ticketStore) nextFilteredTicket() (*ticketRef, time.Duration) {
now := mclock.Now()
for {
- t, wait = s.nextRegisterableTicket()
- if t == nil {
- return
+ ticket, wait := s.nextRegisterableTicket()
+ if ticket == nil {
+ return ticket, wait
}
+ log.Trace("Found discovery ticket to register", "node", ticket.t.node, "serial", ticket.t.serial, "wait", wait)
+
regTime := now + mclock.AbsTime(wait)
- topic := t.t.topics[t.idx]
- if regTime >= s.tickets[topic].nextReg {
- return
+ topic := ticket.t.topics[ticket.idx]
+ if s.tickets[topic] != nil && regTime >= s.tickets[topic].nextReg {
+ return ticket, wait
}
- s.removeTicketRef(*t)
+ s.removeTicketRef(*ticket)
}
}
-func (s *ticketStore) ticketRegistered(t ticketRef) {
+func (s *ticketStore) ticketRegistered(ref ticketRef) {
now := mclock.Now()
- topic := t.t.topics[t.idx]
- tt := s.tickets[topic]
+ topic := ref.t.topics[ref.idx]
+ tickets := s.tickets[topic]
min := now - mclock.AbsTime(registerFrequency)*maxRegisterDebt
- if min > tt.nextReg {
- tt.nextReg = min
+ if min > tickets.nextReg {
+ tickets.nextReg = min
}
- tt.nextReg += mclock.AbsTime(registerFrequency)
- s.tickets[topic] = tt
+ tickets.nextReg += mclock.AbsTime(registerFrequency)
+ s.tickets[topic] = tickets
- s.removeTicketRef(t)
+ s.removeTicketRef(ref)
}
// nextRegisterableTicket returns the next ticket that can be used
@@ -374,16 +380,7 @@ func (s *ticketStore) ticketRegistered(t ticketRef) {
//
// A ticket can be returned more than once with <= zero wait time in case
// the ticket contains multiple topics.
-func (s *ticketStore) nextRegisterableTicket() (t *ticketRef, wait time.Duration) {
- defer func() {
- if t == nil {
- debugLog(" nil")
- } else {
- debugLog(fmt.Sprintf(" node = %x sn = %v wait = %v", t.t.node.ID[:8], t.t.serial, wait))
- }
- }()
-
- debugLog("nextRegisterableTicket()")
+func (s *ticketStore) nextRegisterableTicket() (*ticketRef, time.Duration) {
now := mclock.Now()
if s.nextTicketCached != nil {
return s.nextTicketCached, time.Duration(s.nextTicketCached.topicRegTime() - now)
@@ -412,9 +409,8 @@ func (s *ticketStore) nextRegisterableTicket() (t *ticketRef, wait time.Duration
return nil, 0
}
if nextTicket.t != nil {
- wait = time.Duration(nextTicket.topicRegTime() - now)
s.nextTicketCached = &nextTicket
- return &nextTicket, wait
+ return &nextTicket, time.Duration(nextTicket.topicRegTime() - now)
}
s.lastBucketFetched = bucket
}
@@ -422,14 +418,20 @@ func (s *ticketStore) nextRegisterableTicket() (t *ticketRef, wait time.Duration
// removeTicket removes a ticket from the ticket store
func (s *ticketStore) removeTicketRef(ref ticketRef) {
- debugLog(fmt.Sprintf("removeTicketRef(node = %x sn = %v)", ref.t.node.ID[:8], ref.t.serial))
+ log.Trace("Removing discovery ticket reference", "node", ref.t.node.ID, "serial", ref.t.serial)
+
+ // Make nextRegisterableTicket return the next available ticket.
+ s.nextTicketCached = nil
+
topic := ref.topic()
- tickets := s.tickets[topic].buckets
+ tickets := s.tickets[topic]
+
if tickets == nil {
+ log.Trace("Removing tickets from unknown topic", "topic", topic)
return
}
bucket := timeBucket(ref.t.regTime[ref.idx] / mclock.AbsTime(ticketTimeBucketLen))
- list := tickets[bucket]
+ list := tickets.buckets[bucket]
idx := -1
for i, bt := range list {
if bt.t == ref.t {
@@ -442,18 +444,15 @@ func (s *ticketStore) removeTicketRef(ref ticketRef) {
}
list = append(list[:idx], list[idx+1:]...)
if len(list) != 0 {
- tickets[bucket] = list
+ tickets.buckets[bucket] = list
} else {
- delete(tickets, bucket)
+ delete(tickets.buckets, bucket)
}
ref.t.refCnt--
if ref.t.refCnt == 0 {
delete(s.nodes, ref.t.node)
delete(s.nodeLastReq, ref.t.node)
}
-
- // Make nextRegisterableTicket return the next available ticket.
- s.nextTicketCached = nil
}
type lookupInfo struct {
@@ -523,21 +522,21 @@ func (s *ticketStore) adjustWithTicket(now mclock.AbsTime, targetHash common.Has
}
}
-func (s *ticketStore) addTicket(localTime mclock.AbsTime, pingHash []byte, t *ticket) {
- debugLog(fmt.Sprintf("add(node = %x sn = %v)", t.node.ID[:8], t.serial))
+func (s *ticketStore) addTicket(localTime mclock.AbsTime, pingHash []byte, ticket *ticket) {
+ log.Trace("Adding discovery ticket", "node", ticket.node.ID, "serial", ticket.serial)
- lastReq, ok := s.nodeLastReq[t.node]
+ lastReq, ok := s.nodeLastReq[ticket.node]
if !(ok && bytes.Equal(pingHash, lastReq.pingHash)) {
return
}
- s.adjustWithTicket(localTime, lastReq.lookup.target, t)
+ s.adjustWithTicket(localTime, lastReq.lookup.target, ticket)
- if lastReq.lookup.radiusLookup || s.nodes[t.node] != nil {
+ if lastReq.lookup.radiusLookup || s.nodes[ticket.node] != nil {
return
}
topic := lastReq.lookup.topic
- topicIdx := t.findIdx(topic)
+ topicIdx := ticket.findIdx(topic)
if topicIdx == -1 {
return
}
@@ -548,29 +547,29 @@ func (s *ticketStore) addTicket(localTime mclock.AbsTime, pingHash []byte, t *ti
}
if _, ok := s.tickets[topic]; ok {
- wait := t.regTime[topicIdx] - localTime
+ wait := ticket.regTime[topicIdx] - localTime
rnd := rand.ExpFloat64()
if rnd > 10 {
rnd = 10
}
if float64(wait) < float64(keepTicketConst)+float64(keepTicketExp)*rnd {
// use the ticket to register this topic
- //fmt.Println("addTicket", t.node.ID[:8], t.node.addr().String(), t.serial, t.pong)
- s.addTicketRef(ticketRef{t, topicIdx})
+ //fmt.Println("addTicket", ticket.node.ID[:8], ticket.node.addr().String(), ticket.serial, ticket.pong)
+ s.addTicketRef(ticketRef{ticket, topicIdx})
}
}
- if t.refCnt > 0 {
+ if ticket.refCnt > 0 {
s.nextTicketCached = nil
- s.nodes[t.node] = t
+ s.nodes[ticket.node] = ticket
}
}
func (s *ticketStore) getNodeTicket(node *Node) *ticket {
if s.nodes[node] == nil {
- debugLog(fmt.Sprintf("getNodeTicket(%x) sn = nil", node.ID[:8]))
+ log.Trace("Retrieving node ticket", "node", node.ID, "serial", nil)
} else {
- debugLog(fmt.Sprintf("getNodeTicket(%x) sn = %v", node.ID[:8], s.nodes[node].serial))
+ log.Trace("Retrieving node ticket", "node", node.ID, "serial", s.nodes[node].serial)
}
return s.nodes[node]
}
@@ -643,7 +642,7 @@ func (s *ticketStore) gotTopicNodes(from *Node, hash common.Hash, nodes []rpcNod
if ip.IsUnspecified() || ip.IsLoopback() {
ip = from.IP
}
- n := NewNode(node.ID, ip, node.UDP-1, node.TCP-1) // subtract one from port while discv5 is running in test mode on UDPport+1
+ n := NewNode(node.ID, ip, node.UDP, node.TCP)
select {
case chn <- n:
default:
diff --git a/p2p/discv5/topic.go b/p2p/discv5/topic.go
index b6bea013c..e7a7f8e02 100644
--- a/p2p/discv5/topic.go
+++ b/p2p/discv5/topic.go
@@ -24,6 +24,7 @@ import (
"time"
"github.com/ethereum/go-ethereum/common/mclock"
+ "github.com/ethereum/go-ethereum/log"
)
const (
@@ -235,7 +236,7 @@ func (t *topicTable) deleteEntry(e *topicEntry) {
// It is assumed that topics and waitPeriods have the same length.
func (t *topicTable) useTicket(node *Node, serialNo uint32, topics []Topic, idx int, issueTime uint64, waitPeriods []uint32) (registered bool) {
- debugLog(fmt.Sprintf("useTicket %v %v %v", serialNo, topics, waitPeriods))
+ log.Trace("Using discovery ticket", "serial", serialNo, "topics", topics, "waits", waitPeriods)
//fmt.Println("useTicket", serialNo, topics, waitPeriods)
t.collectGarbage()
diff --git a/p2p/discv5/udp.go b/p2p/discv5/udp.go
index 26087cd8e..543771817 100644
--- a/p2p/discv5/udp.go
+++ b/p2p/discv5/udp.go
@@ -37,7 +37,7 @@ const Version = 4
// Errors
var (
errPacketTooSmall = errors.New("too small")
- errBadHash = errors.New("bad hash")
+ errBadPrefix = errors.New("bad prefix")
errExpired = errors.New("expired")
errUnsolicitedReply = errors.New("unsolicited reply")
errUnknownNode = errors.New("unknown node")
@@ -145,10 +145,11 @@ type (
}
)
-const (
- macSize = 256 / 8
- sigSize = 520 / 8
- headSize = macSize + sigSize // space of packet frame data
+var (
+ versionPrefix = []byte("temporary discovery v5")
+ versionPrefixSize = len(versionPrefix)
+ sigSize = 520 / 8
+ headSize = versionPrefixSize + sigSize // space of packet frame data
)
// Neighbors replies are sent across multiple packets to
@@ -237,30 +238,23 @@ type udp struct {
}
// ListenUDP returns a new table that listens for UDP packets on laddr.
-func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) {
- transport, err := listenUDP(priv, laddr)
+func ListenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) {
+ transport, err := listenUDP(priv, conn, realaddr)
if err != nil {
return nil, err
}
- net, err := newNetwork(transport, priv.PublicKey, natm, nodeDBPath, netrestrict)
+ net, err := newNetwork(transport, priv.PublicKey, nodeDBPath, netrestrict)
if err != nil {
return nil, err
}
+ log.Info("UDP listener up", "net", net.tab.self)
transport.net = net
go transport.readLoop()
return net, nil
}
-func listenUDP(priv *ecdsa.PrivateKey, laddr string) (*udp, error) {
- addr, err := net.ResolveUDPAddr("udp", laddr)
- if err != nil {
- return nil, err
- }
- conn, err := net.ListenUDP("udp", addr)
- if err != nil {
- return nil, err
- }
- return &udp{conn: conn, priv: priv, ourEndpoint: makeEndpoint(addr, uint16(addr.Port))}, nil
+func listenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr) (*udp, error) {
+ return &udp{conn: conn, priv: priv, ourEndpoint: makeEndpoint(realaddr, uint16(realaddr.Port))}, nil
}
func (t *udp) localAddr() *net.UDPAddr {
@@ -372,11 +366,9 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (p, hash
log.Error(fmt.Sprint("could not sign packet:", err))
return nil, nil, err
}
- copy(packet[macSize:], sig)
- // add the hash to the front. Note: this doesn't protect the
- // packet in any way.
- hash = crypto.Keccak256(packet[macSize:])
- copy(packet, hash)
+ copy(packet, versionPrefix)
+ copy(packet[versionPrefixSize:], sig)
+ hash = crypto.Keccak256(packet[versionPrefixSize:])
return packet, hash, nil
}
@@ -420,17 +412,16 @@ func decodePacket(buffer []byte, pkt *ingressPacket) error {
}
buf := make([]byte, len(buffer))
copy(buf, buffer)
- hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:]
- shouldhash := crypto.Keccak256(buf[macSize:])
- if !bytes.Equal(hash, shouldhash) {
- return errBadHash
+ prefix, sig, sigdata := buf[:versionPrefixSize], buf[versionPrefixSize:headSize], buf[headSize:]
+ if !bytes.Equal(prefix, versionPrefix) {
+ return errBadPrefix
}
fromID, err := recoverNodeID(crypto.Keccak256(buf[headSize:]), sig)
if err != nil {
return err
}
pkt.rawData = buf
- pkt.hash = hash
+ pkt.hash = crypto.Keccak256(buf[versionPrefixSize:])
pkt.remoteID = fromID
switch pkt.ev = nodeEvent(sigdata[0]); pkt.ev {
case pingPacket:
diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go
new file mode 100644
index 000000000..2c3afb43e
--- /dev/null
+++ b/p2p/enr/enr.go
@@ -0,0 +1,290 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+// Package enr implements Ethereum Node Records as defined in EIP-778. A node record holds
+// arbitrary information about a node on the peer-to-peer network.
+//
+// Records contain named keys. To store and retrieve key/values in a record, use the Entry
+// interface.
+//
+// Records must be signed before transmitting them to another node. Decoding a record verifies
+// its signature. When creating a record, set the entries you want, then call Sign to add the
+// signature. Modifying a record invalidates the signature.
+//
+// Package enr supports the "secp256k1-keccak" identity scheme.
+package enr
+
+import (
+ "bytes"
+ "crypto/ecdsa"
+ "errors"
+ "fmt"
+ "io"
+ "sort"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/crypto/sha3"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+const SizeLimit = 300 // maximum encoded size of a node record in bytes
+
+const ID_SECP256k1_KECCAK = ID("secp256k1-keccak") // the default identity scheme
+
+var (
+ errNoID = errors.New("unknown or unspecified identity scheme")
+ errInvalidSigsize = errors.New("invalid signature size")
+ errInvalidSig = errors.New("invalid signature")
+ errNotSorted = errors.New("record key/value pairs are not sorted by key")
+ errDuplicateKey = errors.New("record contains duplicate key")
+ errIncompletePair = errors.New("record contains incomplete k/v pair")
+ errTooBig = fmt.Errorf("record bigger than %d bytes", SizeLimit)
+ errEncodeUnsigned = errors.New("can't encode unsigned record")
+ errNotFound = errors.New("no such key in record")
+)
+
+// Record represents a node record. The zero value is an empty record.
+type Record struct {
+ seq uint64 // sequence number
+ signature []byte // the signature
+ raw []byte // RLP encoded record
+ pairs []pair // sorted list of all key/value pairs
+}
+
+// pair is a key/value pair in a record.
+type pair struct {
+ k string
+ v rlp.RawValue
+}
+
+// Signed reports whether the record has a valid signature.
+func (r *Record) Signed() bool {
+ return r.signature != nil
+}
+
+// Seq returns the sequence number.
+func (r *Record) Seq() uint64 {
+ return r.seq
+}
+
+// SetSeq updates the record sequence number. This invalidates any signature on the record.
+// Calling SetSeq is usually not required because signing the redord increments the
+// sequence number.
+func (r *Record) SetSeq(s uint64) {
+ r.signature = nil
+ r.raw = nil
+ r.seq = s
+}
+
+// Load retrieves the value of a key/value pair. The given Entry must be a pointer and will
+// be set to the value of the entry in the record.
+//
+// Errors returned by Load are wrapped in KeyError. You can distinguish decoding errors
+// from missing keys using the IsNotFound function.
+func (r *Record) Load(e Entry) error {
+ i := sort.Search(len(r.pairs), func(i int) bool { return r.pairs[i].k >= e.ENRKey() })
+ if i < len(r.pairs) && r.pairs[i].k == e.ENRKey() {
+ if err := rlp.DecodeBytes(r.pairs[i].v, e); err != nil {
+ return &KeyError{Key: e.ENRKey(), Err: err}
+ }
+ return nil
+ }
+ return &KeyError{Key: e.ENRKey(), Err: errNotFound}
+}
+
+// Set adds or updates the given entry in the record.
+// It panics if the value can't be encoded.
+func (r *Record) Set(e Entry) {
+ r.signature = nil
+ r.raw = nil
+ blob, err := rlp.EncodeToBytes(e)
+ if err != nil {
+ panic(fmt.Errorf("enr: can't encode %s: %v", e.ENRKey(), err))
+ }
+
+ i := sort.Search(len(r.pairs), func(i int) bool { return r.pairs[i].k >= e.ENRKey() })
+
+ if i < len(r.pairs) && r.pairs[i].k == e.ENRKey() {
+ // element is present at r.pairs[i]
+ r.pairs[i].v = blob
+ return
+ } else if i < len(r.pairs) {
+ // insert pair before i-th elem
+ el := pair{e.ENRKey(), blob}
+ r.pairs = append(r.pairs, pair{})
+ copy(r.pairs[i+1:], r.pairs[i:])
+ r.pairs[i] = el
+ return
+ }
+
+ // element should be placed at the end of r.pairs
+ r.pairs = append(r.pairs, pair{e.ENRKey(), blob})
+}
+
+// EncodeRLP implements rlp.Encoder. Encoding fails if
+// the record is unsigned.
+func (r Record) EncodeRLP(w io.Writer) error {
+ if !r.Signed() {
+ return errEncodeUnsigned
+ }
+ _, err := w.Write(r.raw)
+ return err
+}
+
+// DecodeRLP implements rlp.Decoder. Decoding verifies the signature.
+func (r *Record) DecodeRLP(s *rlp.Stream) error {
+ raw, err := s.Raw()
+ if err != nil {
+ return err
+ }
+ if len(raw) > SizeLimit {
+ return errTooBig
+ }
+
+ // Decode the RLP container.
+ dec := Record{raw: raw}
+ s = rlp.NewStream(bytes.NewReader(raw), 0)
+ if _, err := s.List(); err != nil {
+ return err
+ }
+ if err = s.Decode(&dec.signature); err != nil {
+ return err
+ }
+ if err = s.Decode(&dec.seq); err != nil {
+ return err
+ }
+ // The rest of the record contains sorted k/v pairs.
+ var prevkey string
+ for i := 0; ; i++ {
+ var kv pair
+ if err := s.Decode(&kv.k); err != nil {
+ if err == rlp.EOL {
+ break
+ }
+ return err
+ }
+ if err := s.Decode(&kv.v); err != nil {
+ if err == rlp.EOL {
+ return errIncompletePair
+ }
+ return err
+ }
+ if i > 0 {
+ if kv.k == prevkey {
+ return errDuplicateKey
+ }
+ if kv.k < prevkey {
+ return errNotSorted
+ }
+ }
+ dec.pairs = append(dec.pairs, kv)
+ prevkey = kv.k
+ }
+ if err := s.ListEnd(); err != nil {
+ return err
+ }
+
+ // Verify signature.
+ if err = dec.verifySignature(); err != nil {
+ return err
+ }
+ *r = dec
+ return nil
+}
+
+type s256raw []byte
+
+func (s256raw) ENRKey() string { return "secp256k1" }
+
+// NodeAddr returns the node address. The return value will be nil if the record is
+// unsigned.
+func (r *Record) NodeAddr() []byte {
+ var entry s256raw
+ if r.Load(&entry) != nil {
+ return nil
+ }
+ return crypto.Keccak256(entry)
+}
+
+// Sign signs the record with the given private key. It updates the record's identity
+// scheme, public key and increments the sequence number. Sign returns an error if the
+// encoded record is larger than the size limit.
+func (r *Record) Sign(privkey *ecdsa.PrivateKey) error {
+ r.seq = r.seq + 1
+ r.Set(ID_SECP256k1_KECCAK)
+ r.Set(Secp256k1(privkey.PublicKey))
+ return r.signAndEncode(privkey)
+}
+
+func (r *Record) appendPairs(list []interface{}) []interface{} {
+ list = append(list, r.seq)
+ for _, p := range r.pairs {
+ list = append(list, p.k, p.v)
+ }
+ return list
+}
+
+func (r *Record) signAndEncode(privkey *ecdsa.PrivateKey) error {
+ // Put record elements into a flat list. Leave room for the signature.
+ list := make([]interface{}, 1, len(r.pairs)*2+2)
+ list = r.appendPairs(list)
+
+ // Sign the tail of the list.
+ h := sha3.NewKeccak256()
+ rlp.Encode(h, list[1:])
+ sig, err := crypto.Sign(h.Sum(nil), privkey)
+ if err != nil {
+ return err
+ }
+ sig = sig[:len(sig)-1] // remove v
+
+ // Put signature in front.
+ r.signature, list[0] = sig, sig
+ r.raw, err = rlp.EncodeToBytes(list)
+ if err != nil {
+ return err
+ }
+ if len(r.raw) > SizeLimit {
+ return errTooBig
+ }
+ return nil
+}
+
+func (r *Record) verifySignature() error {
+ // Get identity scheme, public key, signature.
+ var id ID
+ var entry s256raw
+ if err := r.Load(&id); err != nil {
+ return err
+ } else if id != ID_SECP256k1_KECCAK {
+ return errNoID
+ }
+ if err := r.Load(&entry); err != nil {
+ return err
+ } else if len(entry) != 33 {
+ return fmt.Errorf("invalid public key")
+ }
+
+ // Verify the signature.
+ list := make([]interface{}, 0, len(r.pairs)*2+1)
+ list = r.appendPairs(list)
+ h := sha3.NewKeccak256()
+ rlp.Encode(h, list)
+ if !crypto.VerifySignature(entry, h.Sum(nil), r.signature) {
+ return errInvalidSig
+ }
+ return nil
+}
diff --git a/p2p/enr/enr_test.go b/p2p/enr/enr_test.go
new file mode 100644
index 000000000..ce7767d10
--- /dev/null
+++ b/p2p/enr/enr_test.go
@@ -0,0 +1,318 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package enr
+
+import (
+ "bytes"
+ "encoding/hex"
+ "fmt"
+ "math/rand"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/rlp"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+var (
+ privkey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+ pubkey = &privkey.PublicKey
+)
+
+var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
+
+func randomString(strlen int) string {
+ b := make([]byte, strlen)
+ rnd.Read(b)
+ return string(b)
+}
+
+// TestGetSetID tests encoding/decoding and setting/getting of the ID key.
+func TestGetSetID(t *testing.T) {
+ id := ID("someid")
+ var r Record
+ r.Set(id)
+
+ var id2 ID
+ require.NoError(t, r.Load(&id2))
+ assert.Equal(t, id, id2)
+}
+
+// TestGetSetIP4 tests encoding/decoding and setting/getting of the IP4 key.
+func TestGetSetIP4(t *testing.T) {
+ ip := IP4{192, 168, 0, 3}
+ var r Record
+ r.Set(ip)
+
+ var ip2 IP4
+ require.NoError(t, r.Load(&ip2))
+ assert.Equal(t, ip, ip2)
+}
+
+// TestGetSetIP6 tests encoding/decoding and setting/getting of the IP6 key.
+func TestGetSetIP6(t *testing.T) {
+ ip := IP6{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}
+ var r Record
+ r.Set(ip)
+
+ var ip2 IP6
+ require.NoError(t, r.Load(&ip2))
+ assert.Equal(t, ip, ip2)
+}
+
+// TestGetSetDiscPort tests encoding/decoding and setting/getting of the DiscPort key.
+func TestGetSetDiscPort(t *testing.T) {
+ port := DiscPort(30309)
+ var r Record
+ r.Set(port)
+
+ var port2 DiscPort
+ require.NoError(t, r.Load(&port2))
+ assert.Equal(t, port, port2)
+}
+
+// TestGetSetSecp256k1 tests encoding/decoding and setting/getting of the Secp256k1 key.
+func TestGetSetSecp256k1(t *testing.T) {
+ var r Record
+ if err := r.Sign(privkey); err != nil {
+ t.Fatal(err)
+ }
+
+ var pk Secp256k1
+ require.NoError(t, r.Load(&pk))
+ assert.EqualValues(t, pubkey, &pk)
+}
+
+func TestLoadErrors(t *testing.T) {
+ var r Record
+ ip4 := IP4{127, 0, 0, 1}
+ r.Set(ip4)
+
+ // Check error for missing keys.
+ var ip6 IP6
+ err := r.Load(&ip6)
+ if !IsNotFound(err) {
+ t.Error("IsNotFound should return true for missing key")
+ }
+ assert.Equal(t, &KeyError{Key: ip6.ENRKey(), Err: errNotFound}, err)
+
+ // Check error for invalid keys.
+ var list []uint
+ err = r.Load(WithEntry(ip4.ENRKey(), &list))
+ kerr, ok := err.(*KeyError)
+ if !ok {
+ t.Fatalf("expected KeyError, got %T", err)
+ }
+ assert.Equal(t, kerr.Key, ip4.ENRKey())
+ assert.Error(t, kerr.Err)
+ if IsNotFound(err) {
+ t.Error("IsNotFound should return false for decoding errors")
+ }
+}
+
+// TestSortedGetAndSet tests that Set produced a sorted pairs slice.
+func TestSortedGetAndSet(t *testing.T) {
+ type pair struct {
+ k string
+ v uint32
+ }
+
+ for _, tt := range []struct {
+ input []pair
+ want []pair
+ }{
+ {
+ input: []pair{{"a", 1}, {"c", 2}, {"b", 3}},
+ want: []pair{{"a", 1}, {"b", 3}, {"c", 2}},
+ },
+ {
+ input: []pair{{"a", 1}, {"c", 2}, {"b", 3}, {"d", 4}, {"a", 5}, {"bb", 6}},
+ want: []pair{{"a", 5}, {"b", 3}, {"bb", 6}, {"c", 2}, {"d", 4}},
+ },
+ {
+ input: []pair{{"c", 2}, {"b", 3}, {"d", 4}, {"a", 5}, {"bb", 6}},
+ want: []pair{{"a", 5}, {"b", 3}, {"bb", 6}, {"c", 2}, {"d", 4}},
+ },
+ } {
+ var r Record
+ for _, i := range tt.input {
+ r.Set(WithEntry(i.k, &i.v))
+ }
+ for i, w := range tt.want {
+ // set got's key from r.pair[i], so that we preserve order of pairs
+ got := pair{k: r.pairs[i].k}
+ assert.NoError(t, r.Load(WithEntry(w.k, &got.v)))
+ assert.Equal(t, w, got)
+ }
+ }
+}
+
+// TestDirty tests record signature removal on setting of new key/value pair in record.
+func TestDirty(t *testing.T) {
+ var r Record
+
+ if r.Signed() {
+ t.Error("Signed returned true for zero record")
+ }
+ if _, err := rlp.EncodeToBytes(r); err != errEncodeUnsigned {
+ t.Errorf("expected errEncodeUnsigned, got %#v", err)
+ }
+
+ require.NoError(t, r.Sign(privkey))
+ if !r.Signed() {
+ t.Error("Signed return false for signed record")
+ }
+ _, err := rlp.EncodeToBytes(r)
+ assert.NoError(t, err)
+
+ r.SetSeq(3)
+ if r.Signed() {
+ t.Error("Signed returned true for modified record")
+ }
+ if _, err := rlp.EncodeToBytes(r); err != errEncodeUnsigned {
+ t.Errorf("expected errEncodeUnsigned, got %#v", err)
+ }
+}
+
+// TestGetSetOverwrite tests value overwrite when setting a new value with an existing key in record.
+func TestGetSetOverwrite(t *testing.T) {
+ var r Record
+
+ ip := IP4{192, 168, 0, 3}
+ r.Set(ip)
+
+ ip2 := IP4{192, 168, 0, 4}
+ r.Set(ip2)
+
+ var ip3 IP4
+ require.NoError(t, r.Load(&ip3))
+ assert.Equal(t, ip2, ip3)
+}
+
+// TestSignEncodeAndDecode tests signing, RLP encoding and RLP decoding of a record.
+func TestSignEncodeAndDecode(t *testing.T) {
+ var r Record
+ r.Set(DiscPort(30303))
+ r.Set(IP4{127, 0, 0, 1})
+ require.NoError(t, r.Sign(privkey))
+
+ blob, err := rlp.EncodeToBytes(r)
+ require.NoError(t, err)
+
+ var r2 Record
+ require.NoError(t, rlp.DecodeBytes(blob, &r2))
+ assert.Equal(t, r, r2)
+
+ blob2, err := rlp.EncodeToBytes(r2)
+ require.NoError(t, err)
+ assert.Equal(t, blob, blob2)
+}
+
+func TestNodeAddr(t *testing.T) {
+ var r Record
+ if addr := r.NodeAddr(); addr != nil {
+ t.Errorf("wrong address on empty record: got %v, want %v", addr, nil)
+ }
+
+ require.NoError(t, r.Sign(privkey))
+ expected := "caaa1485d83b18b32ed9ad666026151bf0cae8a0a88c857ae2d4c5be2daa6726"
+ assert.Equal(t, expected, hex.EncodeToString(r.NodeAddr()))
+}
+
+var pyRecord, _ = hex.DecodeString("f896b840954dc36583c1f4b69ab59b1375f362f06ee99f3723cd77e64b6de6d211c27d7870642a79d4516997f94091325d2a7ca6215376971455fb221d34f35b277149a1018664697363763582765f82696490736563703235366b312d6b656363616b83697034847f00000189736563703235366b31a103ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138")
+
+// TestPythonInterop checks that we can decode and verify a record produced by the Python
+// implementation.
+func TestPythonInterop(t *testing.T) {
+ var r Record
+ if err := rlp.DecodeBytes(pyRecord, &r); err != nil {
+ t.Fatalf("can't decode: %v", err)
+ }
+
+ var (
+ wantAddr, _ = hex.DecodeString("caaa1485d83b18b32ed9ad666026151bf0cae8a0a88c857ae2d4c5be2daa6726")
+ wantSeq = uint64(1)
+ wantIP = IP4{127, 0, 0, 1}
+ wantDiscport = DiscPort(30303)
+ )
+ if r.Seq() != wantSeq {
+ t.Errorf("wrong seq: got %d, want %d", r.Seq(), wantSeq)
+ }
+ if addr := r.NodeAddr(); !bytes.Equal(addr, wantAddr) {
+ t.Errorf("wrong addr: got %x, want %x", addr, wantAddr)
+ }
+ want := map[Entry]interface{}{new(IP4): &wantIP, new(DiscPort): &wantDiscport}
+ for k, v := range want {
+ desc := fmt.Sprintf("loading key %q", k.ENRKey())
+ if assert.NoError(t, r.Load(k), desc) {
+ assert.Equal(t, k, v, desc)
+ }
+ }
+}
+
+// TestRecordTooBig tests that records bigger than SizeLimit bytes cannot be signed.
+func TestRecordTooBig(t *testing.T) {
+ var r Record
+ key := randomString(10)
+
+ // set a big value for random key, expect error
+ r.Set(WithEntry(key, randomString(300)))
+ if err := r.Sign(privkey); err != errTooBig {
+ t.Fatalf("expected to get errTooBig, got %#v", err)
+ }
+
+ // set an acceptable value for random key, expect no error
+ r.Set(WithEntry(key, randomString(100)))
+ require.NoError(t, r.Sign(privkey))
+}
+
+// TestSignEncodeAndDecodeRandom tests encoding/decoding of records containing random key/value pairs.
+func TestSignEncodeAndDecodeRandom(t *testing.T) {
+ var r Record
+
+ // random key/value pairs for testing
+ pairs := map[string]uint32{}
+ for i := 0; i < 10; i++ {
+ key := randomString(7)
+ value := rnd.Uint32()
+ pairs[key] = value
+ r.Set(WithEntry(key, &value))
+ }
+
+ require.NoError(t, r.Sign(privkey))
+ _, err := rlp.EncodeToBytes(r)
+ require.NoError(t, err)
+
+ for k, v := range pairs {
+ desc := fmt.Sprintf("key %q", k)
+ var got uint32
+ buf := WithEntry(k, &got)
+ require.NoError(t, r.Load(buf), desc)
+ require.Equal(t, v, got, desc)
+ }
+}
+
+func BenchmarkDecode(b *testing.B) {
+ var r Record
+ for i := 0; i < b.N; i++ {
+ rlp.DecodeBytes(pyRecord, &r)
+ }
+ b.StopTimer()
+ r.NodeAddr()
+}
diff --git a/p2p/enr/entries.go b/p2p/enr/entries.go
new file mode 100644
index 000000000..7591e6eff
--- /dev/null
+++ b/p2p/enr/entries.go
@@ -0,0 +1,160 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package enr
+
+import (
+ "crypto/ecdsa"
+ "fmt"
+ "io"
+ "net"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+// Entry is implemented by known node record entry types.
+//
+// To define a new entry that is to be included in a node record,
+// create a Go type that satisfies this interface. The type should
+// also implement rlp.Decoder if additional checks are needed on the value.
+type Entry interface {
+ ENRKey() string
+}
+
+type generic struct {
+ key string
+ value interface{}
+}
+
+func (g generic) ENRKey() string { return g.key }
+
+func (g generic) EncodeRLP(w io.Writer) error {
+ return rlp.Encode(w, g.value)
+}
+
+func (g *generic) DecodeRLP(s *rlp.Stream) error {
+ return s.Decode(g.value)
+}
+
+// WithEntry wraps any value with a key name. It can be used to set and load arbitrary values
+// in a record. The value v must be supported by rlp. To use WithEntry with Load, the value
+// must be a pointer.
+func WithEntry(k string, v interface{}) Entry {
+ return &generic{key: k, value: v}
+}
+
+// DiscPort is the "discv5" key, which holds the UDP port for discovery v5.
+type DiscPort uint16
+
+func (v DiscPort) ENRKey() string { return "discv5" }
+
+// ID is the "id" key, which holds the name of the identity scheme.
+type ID string
+
+func (v ID) ENRKey() string { return "id" }
+
+// IP4 is the "ip4" key, which holds a 4-byte IPv4 address.
+type IP4 net.IP
+
+func (v IP4) ENRKey() string { return "ip4" }
+
+// EncodeRLP implements rlp.Encoder.
+func (v IP4) EncodeRLP(w io.Writer) error {
+ ip4 := net.IP(v).To4()
+ if ip4 == nil {
+ return fmt.Errorf("invalid IPv4 address: %v", v)
+ }
+ return rlp.Encode(w, ip4)
+}
+
+// DecodeRLP implements rlp.Decoder.
+func (v *IP4) DecodeRLP(s *rlp.Stream) error {
+ if err := s.Decode((*net.IP)(v)); err != nil {
+ return err
+ }
+ if len(*v) != 4 {
+ return fmt.Errorf("invalid IPv4 address, want 4 bytes: %v", *v)
+ }
+ return nil
+}
+
+// IP6 is the "ip6" key, which holds a 16-byte IPv6 address.
+type IP6 net.IP
+
+func (v IP6) ENRKey() string { return "ip6" }
+
+// EncodeRLP implements rlp.Encoder.
+func (v IP6) EncodeRLP(w io.Writer) error {
+ ip6 := net.IP(v)
+ return rlp.Encode(w, ip6)
+}
+
+// DecodeRLP implements rlp.Decoder.
+func (v *IP6) DecodeRLP(s *rlp.Stream) error {
+ if err := s.Decode((*net.IP)(v)); err != nil {
+ return err
+ }
+ if len(*v) != 16 {
+ return fmt.Errorf("invalid IPv6 address, want 16 bytes: %v", *v)
+ }
+ return nil
+}
+
+// Secp256k1 is the "secp256k1" key, which holds a public key.
+type Secp256k1 ecdsa.PublicKey
+
+func (v Secp256k1) ENRKey() string { return "secp256k1" }
+
+// EncodeRLP implements rlp.Encoder.
+func (v Secp256k1) EncodeRLP(w io.Writer) error {
+ return rlp.Encode(w, crypto.CompressPubkey((*ecdsa.PublicKey)(&v)))
+}
+
+// DecodeRLP implements rlp.Decoder.
+func (v *Secp256k1) DecodeRLP(s *rlp.Stream) error {
+ buf, err := s.Bytes()
+ if err != nil {
+ return err
+ }
+ pk, err := crypto.DecompressPubkey(buf)
+ if err != nil {
+ return err
+ }
+ *v = (Secp256k1)(*pk)
+ return nil
+}
+
+// KeyError is an error related to a key.
+type KeyError struct {
+ Key string
+ Err error
+}
+
+// Error implements error.
+func (err *KeyError) Error() string {
+ if err.Err == errNotFound {
+ return fmt.Sprintf("missing ENR key %q", err.Key)
+ }
+ return fmt.Sprintf("ENR key %q: %v", err.Key, err.Err)
+}
+
+// IsNotFound reports whether the given error means that a key/value pair is
+// missing from a record.
+func IsNotFound(err error) bool {
+ kerr, ok := err.(*KeyError)
+ return ok && kerr.Err == errNotFound
+}
diff --git a/p2p/server.go b/p2p/server.go
index 922df55ba..2cff94ea5 100644
--- a/p2p/server.go
+++ b/p2p/server.go
@@ -78,9 +78,6 @@ type Config struct {
// protocol should be started or not.
DiscoveryV5 bool `toml:",omitempty"`
- // Listener address for the V5 discovery protocol UDP traffic.
- DiscoveryV5Addr string `toml:",omitempty"`
-
// Name sets the node name of this server.
// Use common.MakeName to create a name that follows existing conventions.
Name string `toml:"-"`
@@ -354,6 +351,32 @@ func (srv *Server) Stop() {
srv.loopWG.Wait()
}
+// sharedUDPConn implements a shared connection. Write sends messages to the underlying connection while read returns
+// messages that were found unprocessable and sent to the unhandled channel by the primary listener.
+type sharedUDPConn struct {
+ *net.UDPConn
+ unhandled chan discover.ReadPacket
+}
+
+// ReadFromUDP implements discv5.conn
+func (s *sharedUDPConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) {
+ packet, ok := <-s.unhandled
+ if !ok {
+ return 0, nil, fmt.Errorf("Connection was closed")
+ }
+ l := len(packet.Data)
+ if l > len(b) {
+ l = len(b)
+ }
+ copy(b[:l], packet.Data[:l])
+ return l, packet.Addr, nil
+}
+
+// Close implements discv5.conn
+func (s *sharedUDPConn) Close() error {
+ return nil
+}
+
// Start starts running the server.
// Servers can not be re-used after stopping.
func (srv *Server) Start() (err error) {
@@ -388,9 +411,43 @@ func (srv *Server) Start() (err error) {
srv.peerOp = make(chan peerOpFunc)
srv.peerOpDone = make(chan struct{})
+ var (
+ conn *net.UDPConn
+ sconn *sharedUDPConn
+ realaddr *net.UDPAddr
+ unhandled chan discover.ReadPacket
+ )
+
+ if !srv.NoDiscovery || srv.DiscoveryV5 {
+ addr, err := net.ResolveUDPAddr("udp", srv.ListenAddr)
+ if err != nil {
+ return err
+ }
+ conn, err = net.ListenUDP("udp", addr)
+ if err != nil {
+ return err
+ }
+
+ realaddr = conn.LocalAddr().(*net.UDPAddr)
+ if srv.NAT != nil {
+ if !realaddr.IP.IsLoopback() {
+ go nat.Map(srv.NAT, srv.quit, "udp", realaddr.Port, realaddr.Port, "ethereum discovery")
+ }
+ // TODO: react to external IP changes over time.
+ if ext, err := srv.NAT.ExternalIP(); err == nil {
+ realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}
+ }
+ }
+ }
+
+ if !srv.NoDiscovery && srv.DiscoveryV5 {
+ unhandled = make(chan discover.ReadPacket, 100)
+ sconn = &sharedUDPConn{conn, unhandled}
+ }
+
// node table
if !srv.NoDiscovery {
- ntab, err := discover.ListenUDP(srv.PrivateKey, srv.ListenAddr, srv.NAT, srv.NodeDatabase, srv.NetRestrict)
+ ntab, err := discover.ListenUDP(srv.PrivateKey, conn, realaddr, unhandled, srv.NodeDatabase, srv.NetRestrict)
if err != nil {
return err
}
@@ -401,7 +458,15 @@ func (srv *Server) Start() (err error) {
}
if srv.DiscoveryV5 {
- ntab, err := discv5.ListenUDP(srv.PrivateKey, srv.DiscoveryV5Addr, srv.NAT, "", srv.NetRestrict) //srv.NodeDatabase)
+ var (
+ ntab *discv5.Network
+ err error
+ )
+ if sconn != nil {
+ ntab, err = discv5.ListenUDP(srv.PrivateKey, sconn, realaddr, "", srv.NetRestrict) //srv.NodeDatabase)
+ } else {
+ ntab, err = discv5.ListenUDP(srv.PrivateKey, conn, realaddr, "", srv.NetRestrict) //srv.NodeDatabase)
+ }
if err != nil {
return err
}
diff --git a/params/bootnodes.go b/params/bootnodes.go
index 82ab6d48c..f6cbadfc0 100644
--- a/params/bootnodes.go
+++ b/params/bootnodes.go
@@ -26,15 +26,17 @@ var MainnetBootnodes = []string{
"enode://158f8aab45f6d19c6cbf4a089c2670541a8da11978a2f90dbf6a502a4a3bab80d288afdbeb7ec0ef6d92de563767f3b1ea9e8e334ca711e9f8e2df5a0385e8e6@13.75.154.138:30303", // AU
"enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303", // SG
- // Ethereum Foundation Cpp Bootnodes
+ // Ethereum Foundation C++ Bootnodes
"enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303", // DE
}
// TestnetBootnodes are the enode URLs of the P2P bootstrap nodes running on the
// Ropsten test network.
var TestnetBootnodes = []string{
- "enode://6ce05930c72abc632c58e2e4324f7c7ea478cec0ed4fa2528982cf34483094e9cbc9216e7aa349691242576d552a2a56aaeae426c5303ded677ce455ba1acd9d@13.84.180.240:30303", // US-TX
- "enode://20c9ad97c081d63397d7b685a412227a40e23c8bdc6688c6f37e97cfbc22d2b4d1db1510d8f61e6a8866ad7f0e17c02b14182d37ea7c3c8b9c2683aeb6b733a1@52.169.14.227:30303", // IE
+ "enode://6ce05930c72abc632c58e2e4324f7c7ea478cec0ed4fa2528982cf34483094e9cbc9216e7aa349691242576d552a2a56aaeae426c5303ded677ce455ba1acd9d@13.84.180.240:30303", // US-TX
+ "enode://20c9ad97c081d63397d7b685a412227a40e23c8bdc6688c6f37e97cfbc22d2b4d1db1510d8f61e6a8866ad7f0e17c02b14182d37ea7c3c8b9c2683aeb6b733a1@52.169.14.227:30303", // IE
+ "enode://6332792c4a00e3e4ee0926ed89e0d27ef985424d97b6a45bf0f23e51f0dcb5e66b875777506458aea7af6f9e4ffb69f43f3778ee73c81ed9d34c51c4b16b0b0f@52.232.243.152:30303", // Parity
+ "enode://94c15d1b9e2fe7ce56e458b9a3b672ef11894ddedd0c6f247e0f1d3487f52b66208fb4aeb8179fce6e3a749ea93ed147c37976d67af557508d199d9594c35f09@192.81.208.223:30303", // @gpip
}
// RinkebyBootnodes are the enode URLs of the P2P bootstrap nodes running on the
@@ -42,19 +44,14 @@ var TestnetBootnodes = []string{
var RinkebyBootnodes = []string{
"enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303", // IE
"enode://343149e4feefa15d882d9fe4ac7d88f885bd05ebb735e547f12e12080a9fa07c8014ca6fd7f373123488102fe5e34111f8509cf0b7de3f5b44339c9f25e87cb8@52.3.158.184:30303", // INFURA
-}
-
-// RinkebyV5Bootnodes are the enode URLs of the P2P bootstrap nodes running on the
-// Rinkeby test network for the experimental RLPx v5 topic-discovery network.
-var RinkebyV5Bootnodes = []string{
- "enode://a24ac7c5484ef4ed0c5eb2d36620ba4e4aa13b8c84684e1b4aab0cebea2ae45cb4d375b77eab56516d34bfbd3c1a833fc51296ff084b770b94fb9028c4d25ccf@52.169.42.101:30303?discport=30304", // IE
- "enode://343149e4feefa15d882d9fe4ac7d88f885bd05ebb735e547f12e12080a9fa07c8014ca6fd7f373123488102fe5e34111f8509cf0b7de3f5b44339c9f25e87cb8@52.3.158.184:30303?discport=30304", // INFURA
+ "enode://b6b28890b006743680c52e64e0d16db57f28124885595fa03a562be1d2bf0f3a1da297d56b13da25fb992888fd556d4c1a27b1f39d531bde7de1921c90061cc6@159.89.28.211:30303", // AKASHA
}
// DiscoveryV5Bootnodes are the enode URLs of the P2P bootstrap nodes for the
// experimental RLPx v5 topic-discovery network.
var DiscoveryV5Bootnodes = []string{
- "enode://0cc5f5ffb5d9098c8b8c62325f3797f56509bff942704687b6530992ac706e2cb946b90a34f1f19548cd3c7baccbcaea354531e5983c7d1bc0dee16ce4b6440b@40.118.3.223:30305",
- "enode://1c7a64d76c0334b0418c004af2f67c50e36a3be60b5e4790bdac0439d21603469a85fad36f2473c9a80eb043ae60936df905fa28f1ff614c3e5dc34f15dcd2dc@40.118.3.223:30308",
- "enode://85c85d7143ae8bb96924f2b54f1b3e70d8c4d367af305325d30a61385a432f247d2c75c45c6b4a60335060d072d7f5b35dd1d4c45f76941f62a4f83b6e75daaf@40.118.3.223:30309",
+ "enode://06051a5573c81934c9554ef2898eb13b33a34b94cf36b202b69fde139ca17a85051979867720d4bdae4323d4943ddf9aeeb6643633aa656e0be843659795007a@35.177.226.168:30303",
+ "enode://0cc5f5ffb5d9098c8b8c62325f3797f56509bff942704687b6530992ac706e2cb946b90a34f1f19548cd3c7baccbcaea354531e5983c7d1bc0dee16ce4b6440b@40.118.3.223:30304",
+ "enode://1c7a64d76c0334b0418c004af2f67c50e36a3be60b5e4790bdac0439d21603469a85fad36f2473c9a80eb043ae60936df905fa28f1ff614c3e5dc34f15dcd2dc@40.118.3.223:30306",
+ "enode://85c85d7143ae8bb96924f2b54f1b3e70d8c4d367af305325d30a61385a432f247d2c75c45c6b4a60335060d072d7f5b35dd1d4c45f76941f62a4f83b6e75daaf@40.118.3.223:30307",
}
diff --git a/params/protocol_params.go b/params/protocol_params.go
index c56faf56f..5a0b14d61 100644
--- a/params/protocol_params.go
+++ b/params/protocol_params.go
@@ -18,7 +18,15 @@ package params
import "math/big"
+var (
+ TargetGasLimit uint64 = GenesisGasLimit // The artificial target
+)
+
const (
+ GasLimitBoundDivisor uint64 = 1024 // The bound divisor of the gas limit, used in update calculations.
+ MinGasLimit uint64 = 5000 // Minimum the gas limit may ever be.
+ GenesisGasLimit uint64 = 4712388 // Gas limit of the Genesis block.
+
MaximumExtraDataSize uint64 = 32 // Maximum size extra data may be after Genesis.
ExpByteGas uint64 = 10 // Times ceil(log256(exponent)) for the EXP instruction.
SloadGas uint64 = 50 // Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added.
@@ -72,12 +80,8 @@ const (
)
var (
- GasLimitBoundDivisor = big.NewInt(1024) // The bound divisor of the gas limit, used in update calculations.
- MinGasLimit = big.NewInt(5000) // Minimum the gas limit may ever be.
- GenesisGasLimit = big.NewInt(4712388) // Gas limit of the Genesis block.
- TargetGasLimit = new(big.Int).Set(GenesisGasLimit) // The artificial target
- DifficultyBoundDivisor = big.NewInt(2048) // The bound divisor of the difficulty, used in the update calculations.
- GenesisDifficulty = big.NewInt(131072) // Difficulty of the Genesis block.
- MinimumDifficulty = big.NewInt(131072) // The minimum that the difficulty may ever be.
- DurationLimit = big.NewInt(13) // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not.
+ DifficultyBoundDivisor = big.NewInt(2048) // The bound divisor of the difficulty, used in the update calculations.
+ GenesisDifficulty = big.NewInt(131072) // Difficulty of the Genesis block.
+ MinimumDifficulty = big.NewInt(131072) // The minimum that the difficulty may ever be.
+ DurationLimit = big.NewInt(13) // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not.
)
diff --git a/rpc/http.go b/rpc/http.go
index a26559b12..6717899b5 100644
--- a/rpc/http.go
+++ b/rpc/http.go
@@ -65,8 +65,9 @@ func (hc *httpConn) Close() error {
return nil
}
-// DialHTTP creates a new RPC clients that connection to an RPC server over HTTP.
-func DialHTTP(endpoint string) (*Client, error) {
+// DialHTTPWithClient creates a new RPC client that connects to an RPC server over HTTP
+// using the provided HTTP Client.
+func DialHTTPWithClient(endpoint string, client *http.Client) (*Client, error) {
req, err := http.NewRequest(http.MethodPost, endpoint, nil)
if err != nil {
return nil, err
@@ -76,10 +77,15 @@ func DialHTTP(endpoint string) (*Client, error) {
initctx := context.Background()
return newClient(initctx, func(context.Context) (net.Conn, error) {
- return &httpConn{client: new(http.Client), req: req, closed: make(chan struct{})}, nil
+ return &httpConn{client: client, req: req, closed: make(chan struct{})}, nil
})
}
+// DialHTTP creates a new RPC client that connects to an RPC server over HTTP.
+func DialHTTP(endpoint string) (*Client, error) {
+ return DialHTTPWithClient(endpoint, new(http.Client))
+}
+
func (c *Client) sendHTTP(ctx context.Context, op *requestOp, msg interface{}) error {
hc := c.writeConn.(*httpConn)
respBody, err := hc.doRequest(ctx, msg)
@@ -177,7 +183,7 @@ func validateRequest(r *http.Request) (int, error) {
return http.StatusRequestEntityTooLarge, err
}
mt, _, err := mime.ParseMediaType(r.Header.Get("content-type"))
- if err != nil || mt != contentType {
+ if r.Method != http.MethodOptions && (err != nil || mt != contentType) {
err := fmt.Errorf("invalid content type, only %s is supported", contentType)
return http.StatusUnsupportedMediaType, err
}
diff --git a/swarm/api/api.go b/swarm/api/api.go
index c143d8a3f..fdf76d390 100644
--- a/swarm/api/api.go
+++ b/swarm/api/api.go
@@ -159,7 +159,7 @@ func (self *Api) Resolve(uri *URI) (storage.Key, error) {
// if the URI is immutable, check if the address is a hash
isHash := hashMatcher.MatchString(uri.Addr)
- if uri.Immutable() {
+ if uri.Immutable() || uri.DeprecatedImmutable() {
if !isHash {
return nil, fmt.Errorf("immutable address not a content hash: %q", uri.Addr)
}
diff --git a/swarm/api/api_test.go b/swarm/api/api_test.go
index dbe7c1dac..4ee26bd8a 100644
--- a/swarm/api/api_test.go
+++ b/swarm/api/api_test.go
@@ -216,7 +216,7 @@ func TestAPIResolve(t *testing.T) {
api := &Api{dns: x.dns}
uri := &URI{Addr: x.addr, Scheme: "bzz"}
if x.immutable {
- uri.Scheme = "bzzi"
+ uri.Scheme = "bzz-immutable"
}
res, err := api.Resolve(uri)
if err == nil {
diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go
index 7952d3fb6..8165d52d7 100644
--- a/swarm/api/client/client.go
+++ b/swarm/api/client/client.go
@@ -57,7 +57,7 @@ func (c *Client) UploadRaw(r io.Reader, size int64) (string, error) {
if size <= 0 {
return "", errors.New("data size must be greater than zero")
}
- req, err := http.NewRequest("POST", c.Gateway+"/bzzr:/", r)
+ req, err := http.NewRequest("POST", c.Gateway+"/bzz-raw:/", r)
if err != nil {
return "", err
}
@@ -79,7 +79,7 @@ func (c *Client) UploadRaw(r io.Reader, size int64) (string, error) {
// DownloadRaw downloads raw data from swarm
func (c *Client) DownloadRaw(hash string) (io.ReadCloser, error) {
- uri := c.Gateway + "/bzzr:/" + hash
+ uri := c.Gateway + "/bzz-raw:/" + hash
res, err := http.DefaultClient.Get(uri)
if err != nil {
return nil, err
@@ -269,7 +269,7 @@ func (c *Client) DownloadManifest(hash string) (*api.Manifest, error) {
//
// where entries ending with "/" are common prefixes.
func (c *Client) List(hash, prefix string) (*api.ManifestList, error) {
- res, err := http.DefaultClient.Get(c.Gateway + "/bzz:/" + hash + "/" + prefix + "?list=true")
+ res, err := http.DefaultClient.Get(c.Gateway + "/bzz-list:/" + hash + "/" + prefix)
if err != nil {
return nil, err
}
diff --git a/swarm/api/http/roundtripper.go b/swarm/api/http/roundtripper.go
index 328177a21..019431771 100644
--- a/swarm/api/http/roundtripper.go
+++ b/swarm/api/http/roundtripper.go
@@ -35,8 +35,8 @@ import (
client := httpclient.New()
// for (private) swarm proxy running locally
client.RegisterScheme("bzz", &http.RoundTripper{Port: port})
-client.RegisterScheme("bzzi", &http.RoundTripper{Port: port})
-client.RegisterScheme("bzzr", &http.RoundTripper{Port: port})
+client.RegisterScheme("bzz-immutable", &http.RoundTripper{Port: port})
+client.RegisterScheme("bzz-raw", &http.RoundTripper{Port: port})
The port you give the Roundtripper is the port the swarm proxy is listening on.
If Host is left empty, localhost is assumed.
diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go
index 65f6afab7..74341899d 100644
--- a/swarm/api/http/server.go
+++ b/swarm/api/http/server.go
@@ -86,7 +86,7 @@ type Request struct {
uri *api.URI
}
-// HandlePostRaw handles a POST request to a raw bzzr:/ URI, stores the request
+// HandlePostRaw handles a POST request to a raw bzz-raw:/ URI, stores the request
// body in swarm and returns the resulting storage key as a text/plain response
func (s *Server) HandlePostRaw(w http.ResponseWriter, r *Request) {
if r.uri.Path != "" {
@@ -290,9 +290,12 @@ func (s *Server) HandleDelete(w http.ResponseWriter, r *Request) {
fmt.Fprint(w, newKey)
}
-// HandleGetRaw handles a GET request to bzzr://<key> and responds with
-// the raw content stored at the given storage key
-func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) {
+// HandleGet handles a GET request to
+// - bzz-raw://<key> and responds with the raw content stored at the
+// given storage key
+// - bzz-hash://<key> and responds with the hash of the content stored
+// at the given storage key as a text/plain response
+func (s *Server) HandleGet(w http.ResponseWriter, r *Request) {
key, err := s.api.Resolve(r.uri)
if err != nil {
s.Error(w, r, fmt.Errorf("error resolving %s: %s", r.uri.Addr, err))
@@ -345,15 +348,22 @@ func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) {
return
}
- // allow the request to overwrite the content type using a query
- // parameter
- contentType := "application/octet-stream"
- if typ := r.URL.Query().Get("content_type"); typ != "" {
- contentType = typ
- }
- w.Header().Set("Content-Type", contentType)
+ switch {
+ case r.uri.Raw():
+ // allow the request to overwrite the content type using a query
+ // parameter
+ contentType := "application/octet-stream"
+ if typ := r.URL.Query().Get("content_type"); typ != "" {
+ contentType = typ
+ }
+ w.Header().Set("Content-Type", contentType)
- http.ServeContent(w, &r.Request, "", time.Now(), reader)
+ http.ServeContent(w, &r.Request, "", time.Now(), reader)
+ case r.uri.Hash():
+ w.Header().Set("Content-Type", "text/plain")
+ w.WriteHeader(http.StatusOK)
+ fmt.Fprint(w, key)
+ }
}
// HandleGetFiles handles a GET request to bzz:/<manifest> with an Accept
@@ -424,14 +434,13 @@ func (s *Server) HandleGetFiles(w http.ResponseWriter, r *Request) {
}
}
-// HandleGetList handles a GET request to bzz:/<manifest>/<path> which has
-// the "list" query parameter set to "true" and returns a list of all files
-// contained in <manifest> under <path> grouped into common prefixes using
-// "/" as a delimiter
+// HandleGetList handles a GET request to bzz-list:/<manifest>/<path> and returns
+// a list of all files contained in <manifest> under <path> grouped into
+// common prefixes using "/" as a delimiter
func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) {
// ensure the root path has a trailing slash so that relative URLs work
if r.uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") {
- http.Redirect(w, &r.Request, r.URL.Path+"/?list=true", http.StatusMovedPermanently)
+ http.Redirect(w, &r.Request, r.URL.Path+"/", http.StatusMovedPermanently)
return
}
@@ -453,7 +462,11 @@ func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) {
if strings.Contains(r.Header.Get("Accept"), "text/html") {
w.Header().Set("Content-Type", "text/html")
err := htmlListTemplate.Execute(w, &htmlListData{
- URI: r.uri,
+ URI: &api.URI{
+ Scheme: "bzz",
+ Addr: r.uri.Addr,
+ Path: r.uri.Path,
+ },
List: &list,
})
if err != nil {
@@ -589,7 +602,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "POST":
- if uri.Raw() {
+ if uri.Raw() || uri.DeprecatedRaw() {
s.HandlePostRaw(w, req)
} else {
s.HandlePostFiles(w, req)
@@ -601,7 +614,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// new manifest leaving the existing one intact, so it isn't
// strictly a traditional PUT request which replaces content
// at a URI, and POST is more ubiquitous)
- if uri.Raw() {
+ if uri.Raw() || uri.DeprecatedRaw() {
ShowError(w, r, fmt.Sprintf("No PUT to %s allowed.", uri), http.StatusBadRequest)
return
} else {
@@ -609,25 +622,25 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
case "DELETE":
- if uri.Raw() {
+ if uri.Raw() || uri.DeprecatedRaw() {
ShowError(w, r, fmt.Sprintf("No DELETE to %s allowed.", uri), http.StatusBadRequest)
return
}
s.HandleDelete(w, req)
case "GET":
- if uri.Raw() {
- s.HandleGetRaw(w, req)
+ if uri.Raw() || uri.Hash() || uri.DeprecatedRaw() {
+ s.HandleGet(w, req)
return
}
- if r.Header.Get("Accept") == "application/x-tar" {
- s.HandleGetFiles(w, req)
+ if uri.List() {
+ s.HandleGetList(w, req)
return
}
- if r.URL.Query().Get("list") == "true" {
- s.HandleGetList(w, req)
+ if r.Header.Get("Accept") == "application/x-tar" {
+ s.HandleGetFiles(w, req)
return
}
diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go
index ffeaf6e0d..305d5cf7d 100644
--- a/swarm/api/http/server_test.go
+++ b/swarm/api/http/server_test.go
@@ -33,7 +33,7 @@ import (
"github.com/ethereum/go-ethereum/swarm/testutil"
)
-func TestBzzrGetPath(t *testing.T) {
+func TestBzzGetPath(t *testing.T) {
var err error
@@ -70,7 +70,7 @@ func TestBzzrGetPath(t *testing.T) {
wg.Wait()
}
- _, err = http.Get(srv.URL + "/bzzr:/" + common.ToHex(key[0])[2:] + "/a")
+ _, err = http.Get(srv.URL + "/bzz-raw:/" + common.ToHex(key[0])[2:] + "/a")
if err != nil {
t.Fatalf("Failed to connect to proxy: %v", err)
}
@@ -79,7 +79,7 @@ func TestBzzrGetPath(t *testing.T) {
var resp *http.Response
var respbody []byte
- url := srv.URL + "/bzzr:/"
+ url := srv.URL + "/bzz-raw:/"
if k[:] != "" {
url += common.ToHex(key[0])[2:] + "/" + k[1:] + "?content_type=text/plain"
}
@@ -104,16 +104,140 @@ func TestBzzrGetPath(t *testing.T) {
}
}
+ for k, v := range testrequests {
+ var resp *http.Response
+ var respbody []byte
+
+ url := srv.URL + "/bzz-hash:/"
+ if k[:] != "" {
+ url += common.ToHex(key[0])[2:] + "/" + k[1:]
+ }
+ resp, err = http.Get(url)
+ if err != nil {
+ t.Fatalf("Request failed: %v", err)
+ }
+ defer resp.Body.Close()
+ respbody, err = ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatalf("Read request body: %v", err)
+ }
+
+ if string(respbody) != key[v].String() {
+ isexpectedfailrequest := false
+
+ for _, r := range expectedfailrequests {
+ if k[:] == r {
+ isexpectedfailrequest = true
+ }
+ }
+ if !isexpectedfailrequest {
+ t.Fatalf("Response body does not match, expected: %v, got %v", key[v], string(respbody))
+ }
+ }
+ }
+
+ for _, c := range []struct {
+ path string
+ json string
+ html string
+ }{
+ {
+ path: "/",
+ json: `{"common_prefixes":["a/"]}`,
+ html: "<!DOCTYPE html>\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/</title>\n</head>\n\n<body>\n <h1>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/</h1>\n <hr>\n <table>\n <thead>\n <tr>\n\t<th>Path</th>\n\t<th>Type</th>\n\t<th>Size</th>\n </tr>\n </thead>\n\n <tbody>\n \n\t<tr>\n\t <td><a href=\"a/\">a/</a></td>\n\t <td>DIR</td>\n\t <td>-</td>\n\t</tr>\n \n\n \n </table>\n <hr>\n</body>\n",
+ },
+ {
+ path: "/a/",
+ json: `{"common_prefixes":["a/b/"],"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/a","mod_time":"0001-01-01T00:00:00Z"}]}`,
+ html: "<!DOCTYPE html>\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/</title>\n</head>\n\n<body>\n <h1>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/</h1>\n <hr>\n <table>\n <thead>\n <tr>\n\t<th>Path</th>\n\t<th>Type</th>\n\t<th>Size</th>\n </tr>\n </thead>\n\n <tbody>\n \n\t<tr>\n\t <td><a href=\"b/\">b/</a></td>\n\t <td>DIR</td>\n\t <td>-</td>\n\t</tr>\n \n\n \n\t<tr>\n\t <td><a href=\"a\">a</a></td>\n\t <td></td>\n\t <td>0</td>\n\t</tr>\n \n </table>\n <hr>\n</body>\n",
+ },
+ {
+ path: "/a/b/",
+ json: `{"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/b","mod_time":"0001-01-01T00:00:00Z"},{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/c","mod_time":"0001-01-01T00:00:00Z"}]}`,
+ html: "<!DOCTYPE html>\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/b/</title>\n</head>\n\n<body>\n <h1>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/b/</h1>\n <hr>\n <table>\n <thead>\n <tr>\n\t<th>Path</th>\n\t<th>Type</th>\n\t<th>Size</th>\n </tr>\n </thead>\n\n <tbody>\n \n\n \n\t<tr>\n\t <td><a href=\"b\">b</a></td>\n\t <td></td>\n\t <td>0</td>\n\t</tr>\n \n\t<tr>\n\t <td><a href=\"c\">c</a></td>\n\t <td></td>\n\t <td>0</td>\n\t</tr>\n \n </table>\n <hr>\n</body>\n",
+ },
+ {
+ path: "/x",
+ },
+ {
+ path: "",
+ },
+ } {
+ k := c.path
+ url := srv.URL + "/bzz-list:/"
+ if k[:] != "" {
+ url += common.ToHex(key[0])[2:] + "/" + k[1:]
+ }
+ t.Run("json list "+c.path, func(t *testing.T) {
+ resp, err := http.Get(url)
+ if err != nil {
+ t.Fatalf("HTTP request: %v", err)
+ }
+ defer resp.Body.Close()
+ respbody, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatalf("Read response body: %v", err)
+ }
+
+ body := strings.TrimSpace(string(respbody))
+ if body != c.json {
+ isexpectedfailrequest := false
+
+ for _, r := range expectedfailrequests {
+ if k[:] == r {
+ isexpectedfailrequest = true
+ }
+ }
+ if !isexpectedfailrequest {
+ t.Errorf("Response list body %q does not match, expected: %v, got %v", k, c.json, body)
+ }
+ }
+ })
+ t.Run("html list "+c.path, func(t *testing.T) {
+ req, err := http.NewRequest(http.MethodGet, url, nil)
+ if err != nil {
+ t.Fatalf("New request: %v", err)
+ }
+ req.Header.Set("Accept", "text/html")
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ t.Fatalf("HTTP request: %v", err)
+ }
+ defer resp.Body.Close()
+ respbody, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatalf("Read response body: %v", err)
+ }
+
+ if string(respbody) != c.html {
+ isexpectedfailrequest := false
+
+ for _, r := range expectedfailrequests {
+ if k[:] == r {
+ isexpectedfailrequest = true
+ }
+ }
+ if !isexpectedfailrequest {
+ t.Errorf("Response list body %q does not match, expected: %q, got %q", k, c.html, string(respbody))
+ }
+ }
+ })
+ }
+
nonhashtests := []string{
srv.URL + "/bzz:/name",
- srv.URL + "/bzzi:/nonhash",
- srv.URL + "/bzzr:/nonhash",
+ srv.URL + "/bzz-immutable:/nonhash",
+ srv.URL + "/bzz-raw:/nonhash",
+ srv.URL + "/bzz-list:/nonhash",
+ srv.URL + "/bzz-hash:/nonhash",
}
nonhashresponses := []string{
"error resolving name: no DNS to resolve name: &#34;name&#34;",
"error resolving nonhash: immutable address not a content hash: &#34;nonhash&#34;",
"error resolving nonhash: no DNS to resolve name: &#34;nonhash&#34;",
+ "error resolving nonhash: no DNS to resolve name: &#34;nonhash&#34;",
+ "error resolving nonhash: no DNS to resolve name: &#34;nonhash&#34;",
}
for i, url := range nonhashtests {
diff --git a/swarm/api/http/templates.go b/swarm/api/http/templates.go
index 9ae434a7e..53ce7b5a2 100644
--- a/swarm/api/http/templates.go
+++ b/swarm/api/http/templates.go
@@ -52,7 +52,7 @@ var htmlListTemplate = template.Must(template.New("html-list").Funcs(template.Fu
<tbody>
{{ range .List.CommonPrefixes }}
<tr>
- <td><a href="{{ basename . }}/?list=true">{{ basename . }}/</a></td>
+ <td><a href="{{ basename . }}/">{{ basename . }}/</a></td>
<td>DIR</td>
<td>-</td>
</tr>
diff --git a/swarm/api/uri.go b/swarm/api/uri.go
index caed4212d..d8aafedf4 100644
--- a/swarm/api/uri.go
+++ b/swarm/api/uri.go
@@ -26,10 +26,18 @@ import (
type URI struct {
// Scheme has one of the following values:
//
- // * bzz - an entry in a swarm manifest
+ // * bzz - an entry in a swarm manifest
+ // * bzz-raw - raw swarm content
+ // * bzz-immutable - immutable URI of an entry in a swarm manifest
+ // (address is not resolved)
+ // * bzz-list - list of all files contained in a swarm manifest
+ //
+ // Deprecated Schemes:
// * bzzr - raw swarm content
// * bzzi - immutable URI of an entry in a swarm manifest
// (address is not resolved)
+ // * bzz-hash - hash of swarm content
+ //
Scheme string
// Addr is either a hexadecimal storage key or it an address which
@@ -50,7 +58,8 @@ type URI struct {
// * <scheme>://<addr>
// * <scheme>://<addr>/<path>
//
-// with scheme one of bzz, bzzr or bzzi
+// with scheme one of bzz, bzz-raw, bzz-immutable, bzz-list or bzz-hash
+// or deprecated ones bzzr and bzzi
func Parse(rawuri string) (*URI, error) {
u, err := url.Parse(rawuri)
if err != nil {
@@ -60,7 +69,7 @@ func Parse(rawuri string) (*URI, error) {
// check the scheme is valid
switch uri.Scheme {
- case "bzz", "bzzi", "bzzr":
+ case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzzr", "bzzi":
default:
return nil, fmt.Errorf("unknown scheme %q", u.Scheme)
}
@@ -84,13 +93,29 @@ func Parse(rawuri string) (*URI, error) {
}
func (u *URI) Raw() bool {
- return u.Scheme == "bzzr"
+ return u.Scheme == "bzz-raw"
}
func (u *URI) Immutable() bool {
+ return u.Scheme == "bzz-immutable"
+}
+
+func (u *URI) List() bool {
+ return u.Scheme == "bzz-list"
+}
+
+func (u *URI) DeprecatedRaw() bool {
+ return u.Scheme == "bzzr"
+}
+
+func (u *URI) DeprecatedImmutable() bool {
return u.Scheme == "bzzi"
}
+func (u *URI) Hash() bool {
+ return u.Scheme == "bzz-hash"
+}
+
func (u *URI) String() string {
return u.Scheme + ":/" + u.Addr + "/" + u.Path
}
diff --git a/swarm/api/uri_test.go b/swarm/api/uri_test.go
index 7d4160601..137b4505d 100644
--- a/swarm/api/uri_test.go
+++ b/swarm/api/uri_test.go
@@ -23,11 +23,15 @@ import (
func TestParseURI(t *testing.T) {
type test struct {
- uri string
- expectURI *URI
- expectErr bool
- expectRaw bool
- expectImmutable bool
+ uri string
+ expectURI *URI
+ expectErr bool
+ expectRaw bool
+ expectImmutable bool
+ expectList bool
+ expectHash bool
+ expectDeprecatedRaw bool
+ expectDeprecatedImmutable bool
}
tests := []test{
{
@@ -47,13 +51,13 @@ func TestParseURI(t *testing.T) {
expectURI: &URI{Scheme: "bzz"},
},
{
- uri: "bzzi:",
- expectURI: &URI{Scheme: "bzzi"},
+ uri: "bzz-immutable:",
+ expectURI: &URI{Scheme: "bzz-immutable"},
expectImmutable: true,
},
{
- uri: "bzzr:",
- expectURI: &URI{Scheme: "bzzr"},
+ uri: "bzz-raw:",
+ expectURI: &URI{Scheme: "bzz-raw"},
expectRaw: true,
},
{
@@ -69,18 +73,18 @@ func TestParseURI(t *testing.T) {
expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"},
},
{
- uri: "bzzr:/",
- expectURI: &URI{Scheme: "bzzr"},
+ uri: "bzz-raw:/",
+ expectURI: &URI{Scheme: "bzz-raw"},
expectRaw: true,
},
{
- uri: "bzzr:/abc123",
- expectURI: &URI{Scheme: "bzzr", Addr: "abc123"},
+ uri: "bzz-raw:/abc123",
+ expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123"},
expectRaw: true,
},
{
- uri: "bzzr:/abc123/path/to/entry",
- expectURI: &URI{Scheme: "bzzr", Addr: "abc123", Path: "path/to/entry"},
+ uri: "bzz-raw:/abc123/path/to/entry",
+ expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123", Path: "path/to/entry"},
expectRaw: true,
},
{
@@ -95,6 +99,46 @@ func TestParseURI(t *testing.T) {
uri: "bzz://abc123/path/to/entry",
expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"},
},
+ {
+ uri: "bzz-hash:",
+ expectURI: &URI{Scheme: "bzz-hash"},
+ expectHash: true,
+ },
+ {
+ uri: "bzz-hash:/",
+ expectURI: &URI{Scheme: "bzz-hash"},
+ expectHash: true,
+ },
+ {
+ uri: "bzz-list:",
+ expectURI: &URI{Scheme: "bzz-list"},
+ expectList: true,
+ },
+ {
+ uri: "bzz-list:/",
+ expectURI: &URI{Scheme: "bzz-list"},
+ expectList: true,
+ },
+ {
+ uri: "bzzr:",
+ expectURI: &URI{Scheme: "bzzr"},
+ expectDeprecatedRaw: true,
+ },
+ {
+ uri: "bzzr:/",
+ expectURI: &URI{Scheme: "bzzr"},
+ expectDeprecatedRaw: true,
+ },
+ {
+ uri: "bzzi:",
+ expectURI: &URI{Scheme: "bzzi"},
+ expectDeprecatedImmutable: true,
+ },
+ {
+ uri: "bzzi:/",
+ expectURI: &URI{Scheme: "bzzi"},
+ expectDeprecatedImmutable: true,
+ },
}
for _, x := range tests {
actual, err := Parse(x.uri)
@@ -116,5 +160,17 @@ func TestParseURI(t *testing.T) {
if actual.Immutable() != x.expectImmutable {
t.Fatalf("expected %s immutable to be %t, got %t", x.uri, x.expectImmutable, actual.Immutable())
}
+ if actual.List() != x.expectList {
+ t.Fatalf("expected %s list to be %t, got %t", x.uri, x.expectList, actual.List())
+ }
+ if actual.Hash() != x.expectHash {
+ t.Fatalf("expected %s hash to be %t, got %t", x.uri, x.expectHash, actual.Hash())
+ }
+ if actual.DeprecatedRaw() != x.expectDeprecatedRaw {
+ t.Fatalf("expected %s deprecated raw to be %t, got %t", x.uri, x.expectDeprecatedRaw, actual.DeprecatedRaw())
+ }
+ if actual.DeprecatedImmutable() != x.expectDeprecatedImmutable {
+ t.Fatalf("expected %s deprecated immutable to be %t, got %t", x.uri, x.expectDeprecatedImmutable, actual.DeprecatedImmutable())
+ }
}
}
diff --git a/swarm/dev/scripts/random-uploads.sh b/swarm/dev/scripts/random-uploads.sh
index db7887e3c..563a51bef 100755
--- a/swarm/dev/scripts/random-uploads.sh
+++ b/swarm/dev/scripts/random-uploads.sh
@@ -46,7 +46,7 @@ main() {
}
do_random_upload() {
- curl -fsSL -X POST --data-binary "$(random_data)" "http://${addr}/bzzr:/"
+ curl -fsSL -X POST --data-binary "$(random_data)" "http://${addr}/bzz-raw:/"
}
random_data() {
diff --git a/swarm/storage/chunker_test.go b/swarm/storage/chunker_test.go
index 6178a7bb1..6b828970b 100644
--- a/swarm/storage/chunker_test.go
+++ b/swarm/storage/chunker_test.go
@@ -60,7 +60,7 @@ func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, c
for {
select {
case <-timeout:
- return errors.New(("Split timeout error"))
+ return errors.New("Split timeout error")
case <-quitC:
return nil
case chunk := <-chunkC:
@@ -97,7 +97,7 @@ func (self *chunkerTester) Append(chunker Splitter, rootKey Key, data io.Reader,
for {
select {
case <-timeout:
- return errors.New(("Append timeout error"))
+ return errors.New("Append timeout error")
case <-quitC:
return nil
case chunk := <-chunkC:
@@ -146,7 +146,7 @@ func (self *chunkerTester) Join(chunker Chunker, key Key, c int, chunkC chan *Ch
for {
select {
case <-timeout:
- return errors.New(("Join timeout error"))
+ return errors.New("Join timeout error")
case chunk, ok := <-chunkC:
if !ok {
close(quitC)
@@ -155,7 +155,7 @@ func (self *chunkerTester) Join(chunker Chunker, key Key, c int, chunkC chan *Ch
// this just mocks the behaviour of a chunk store retrieval
stored, success := self.chunks[chunk.Key.String()]
if !success {
- return errors.New(("Not found"))
+ return errors.New("Not found")
}
chunk.SData = stored.SData
chunk.Size = int64(binary.LittleEndian.Uint64(chunk.SData[0:8]))
diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go
index f2e85cb5b..19d493405 100644
--- a/swarm/storage/pyramid.go
+++ b/swarm/storage/pyramid.go
@@ -338,7 +338,7 @@ func (self *PyramidChunker) loadTree(chunkLevel [][]*TreeEntry, key Key, chunkC
chunkLevel[depth-1] = append(chunkLevel[depth-1], newEntry)
// Add the rest of the tree
- for lvl := (depth - 1); lvl >= 1; lvl-- {
+ for lvl := depth - 1; lvl >= 1; lvl-- {
//TODO(jmozah): instead of loading finished branches and then trim in the end,
//avoid loading them in the first place
diff --git a/tests/block_test_util.go b/tests/block_test_util.go
index a789e6d88..beba48483 100644
--- a/tests/block_test_util.go
+++ b/tests/block_test_util.go
@@ -77,8 +77,8 @@ type btHeader struct {
UncleHash common.Hash
ExtraData []byte
Difficulty *big.Int
- GasLimit *big.Int
- GasUsed *big.Int
+ GasLimit uint64
+ GasUsed uint64
Timestamp *big.Int
}
@@ -86,8 +86,8 @@ type btHeaderMarshaling struct {
ExtraData hexutil.Bytes
Number *math.HexOrDecimal256
Difficulty *math.HexOrDecimal256
- GasLimit *math.HexOrDecimal256
- GasUsed *math.HexOrDecimal256
+ GasLimit math.HexOrDecimal64
+ GasUsed math.HexOrDecimal64
Timestamp *math.HexOrDecimal256
}
@@ -110,7 +110,7 @@ func (t *BlockTest) Run() error {
return fmt.Errorf("genesis block state root does not match test: computed=%x, test=%x", gblock.Root().Bytes()[:6], t.json.Genesis.StateRoot[:6])
}
- chain, err := core.NewBlockChain(db, config, ethash.NewShared(), vm.Config{})
+ chain, err := core.NewBlockChain(db, nil, config, ethash.NewShared(), vm.Config{})
if err != nil {
return err
}
@@ -120,7 +120,7 @@ func (t *BlockTest) Run() error {
if err != nil {
return err
}
- cmlast := chain.LastBlockHash()
+ cmlast := chain.CurrentBlock().Hash()
if common.Hash(t.json.BestBlock) != cmlast {
return fmt.Errorf("last block hash validation mismatch: want: %x, have: %x", t.json.BestBlock, cmlast)
}
@@ -141,8 +141,8 @@ func (t *BlockTest) genesis(config *params.ChainConfig) *core.Genesis {
Timestamp: t.json.Genesis.Timestamp.Uint64(),
ParentHash: t.json.Genesis.ParentHash,
ExtraData: t.json.Genesis.ExtraData,
- GasLimit: t.json.Genesis.GasLimit.Uint64(),
- GasUsed: t.json.Genesis.GasUsed.Uint64(),
+ GasLimit: t.json.Genesis.GasLimit,
+ GasUsed: t.json.Genesis.GasUsed,
Difficulty: t.json.Genesis.Difficulty,
Mixhash: t.json.Genesis.MixHash,
Coinbase: t.json.Genesis.Coinbase,
@@ -234,11 +234,11 @@ func validateHeader(h *btHeader, h2 *types.Header) error {
if h.Difficulty.Cmp(h2.Difficulty) != 0 {
return fmt.Errorf("Difficulty: want: %v have: %v", h.Difficulty, h2.Difficulty)
}
- if h.GasLimit.Cmp(h2.GasLimit) != 0 {
- return fmt.Errorf("GasLimit: want: %v have: %v", h.GasLimit, h2.GasLimit)
+ if h.GasLimit != h2.GasLimit {
+ return fmt.Errorf("GasLimit: want: %d have: %d", h.GasLimit, h2.GasLimit)
}
- if h.GasUsed.Cmp(h2.GasUsed) != 0 {
- return fmt.Errorf("GasUsed: want: %v have: %v", h.GasUsed, h2.GasUsed)
+ if h.GasUsed != h2.GasUsed {
+ return fmt.Errorf("GasUsed: want: %d have: %d", h.GasUsed, h2.GasUsed)
}
if h.Timestamp.Cmp(h2.Time) != 0 {
return fmt.Errorf("Timestamp: want: %v have: %v", h.Timestamp, h2.Time)
diff --git a/tests/gen_btheader.go b/tests/gen_btheader.go
index 5d65e0dbc..5cfd4bd0a 100644
--- a/tests/gen_btheader.go
+++ b/tests/gen_btheader.go
@@ -29,8 +29,8 @@ func (b btHeader) MarshalJSON() ([]byte, error) {
UncleHash common.Hash
ExtraData hexutil.Bytes
Difficulty *math.HexOrDecimal256
- GasLimit *math.HexOrDecimal256
- GasUsed *math.HexOrDecimal256
+ GasLimit math.HexOrDecimal64
+ GasUsed math.HexOrDecimal64
Timestamp *math.HexOrDecimal256
}
var enc btHeader
@@ -47,8 +47,8 @@ func (b btHeader) MarshalJSON() ([]byte, error) {
enc.UncleHash = b.UncleHash
enc.ExtraData = b.ExtraData
enc.Difficulty = (*math.HexOrDecimal256)(b.Difficulty)
- enc.GasLimit = (*math.HexOrDecimal256)(b.GasLimit)
- enc.GasUsed = (*math.HexOrDecimal256)(b.GasUsed)
+ enc.GasLimit = math.HexOrDecimal64(b.GasLimit)
+ enc.GasUsed = math.HexOrDecimal64(b.GasUsed)
enc.Timestamp = (*math.HexOrDecimal256)(b.Timestamp)
return json.Marshal(&enc)
}
@@ -66,10 +66,10 @@ func (b *btHeader) UnmarshalJSON(input []byte) error {
StateRoot *common.Hash
TransactionsTrie *common.Hash
UncleHash *common.Hash
- ExtraData hexutil.Bytes
+ ExtraData *hexutil.Bytes
Difficulty *math.HexOrDecimal256
- GasLimit *math.HexOrDecimal256
- GasUsed *math.HexOrDecimal256
+ GasLimit *math.HexOrDecimal64
+ GasUsed *math.HexOrDecimal64
Timestamp *math.HexOrDecimal256
}
var dec btHeader
@@ -110,16 +110,16 @@ func (b *btHeader) UnmarshalJSON(input []byte) error {
b.UncleHash = *dec.UncleHash
}
if dec.ExtraData != nil {
- b.ExtraData = dec.ExtraData
+ b.ExtraData = *dec.ExtraData
}
if dec.Difficulty != nil {
b.Difficulty = (*big.Int)(dec.Difficulty)
}
if dec.GasLimit != nil {
- b.GasLimit = (*big.Int)(dec.GasLimit)
+ b.GasLimit = uint64(*dec.GasLimit)
}
if dec.GasUsed != nil {
- b.GasUsed = (*big.Int)(dec.GasUsed)
+ b.GasUsed = uint64(*dec.GasUsed)
}
if dec.Timestamp != nil {
b.Timestamp = (*big.Int)(dec.Timestamp)
diff --git a/tests/gen_stenv.go b/tests/gen_stenv.go
index c780524bc..1d4baf2fd 100644
--- a/tests/gen_stenv.go
+++ b/tests/gen_stenv.go
@@ -17,14 +17,14 @@ func (s stEnv) MarshalJSON() ([]byte, error) {
type stEnv struct {
Coinbase common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"`
Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"`
- GasLimit *math.HexOrDecimal256 `json:"currentGasLimit" gencodec:"required"`
+ GasLimit math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"`
Number math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"`
Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
}
var enc stEnv
enc.Coinbase = common.UnprefixedAddress(s.Coinbase)
enc.Difficulty = (*math.HexOrDecimal256)(s.Difficulty)
- enc.GasLimit = (*math.HexOrDecimal256)(s.GasLimit)
+ enc.GasLimit = math.HexOrDecimal64(s.GasLimit)
enc.Number = math.HexOrDecimal64(s.Number)
enc.Timestamp = math.HexOrDecimal64(s.Timestamp)
return json.Marshal(&enc)
@@ -34,7 +34,7 @@ func (s *stEnv) UnmarshalJSON(input []byte) error {
type stEnv struct {
Coinbase *common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"`
Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"`
- GasLimit *math.HexOrDecimal256 `json:"currentGasLimit" gencodec:"required"`
+ GasLimit *math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"`
Number *math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"`
Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
}
@@ -53,7 +53,7 @@ func (s *stEnv) UnmarshalJSON(input []byte) error {
if dec.GasLimit == nil {
return errors.New("missing required field 'currentGasLimit' for stEnv")
}
- s.GasLimit = (*big.Int)(dec.GasLimit)
+ s.GasLimit = uint64(*dec.GasLimit)
if dec.Number == nil {
return errors.New("missing required field 'currentNumber' for stEnv")
}
diff --git a/tests/gen_sttransaction.go b/tests/gen_sttransaction.go
index 5a489d00b..451ffcbf4 100644
--- a/tests/gen_sttransaction.go
+++ b/tests/gen_sttransaction.go
@@ -46,7 +46,7 @@ func (s *stTransaction) UnmarshalJSON(input []byte) error {
Data []string `json:"data"`
GasLimit []math.HexOrDecimal64 `json:"gasLimit"`
Value []string `json:"value"`
- PrivateKey hexutil.Bytes `json:"secretKey"`
+ PrivateKey *hexutil.Bytes `json:"secretKey"`
}
var dec stTransaction
if err := json.Unmarshal(input, &dec); err != nil {
@@ -74,7 +74,7 @@ func (s *stTransaction) UnmarshalJSON(input []byte) error {
s.Value = dec.Value
}
if dec.PrivateKey != nil {
- s.PrivateKey = dec.PrivateKey
+ s.PrivateKey = *dec.PrivateKey
}
return nil
}
diff --git a/tests/gen_tttransaction.go b/tests/gen_tttransaction.go
index b6759be91..2948842d9 100644
--- a/tests/gen_tttransaction.go
+++ b/tests/gen_tttransaction.go
@@ -17,7 +17,7 @@ var _ = (*ttTransactionMarshaling)(nil)
func (t ttTransaction) MarshalJSON() ([]byte, error) {
type ttTransaction struct {
Data hexutil.Bytes `gencodec:"required"`
- GasLimit *math.HexOrDecimal256 `gencodec:"required"`
+ GasLimit math.HexOrDecimal64 `gencodec:"required"`
GasPrice *math.HexOrDecimal256 `gencodec:"required"`
Nonce math.HexOrDecimal64 `gencodec:"required"`
Value *math.HexOrDecimal256 `gencodec:"required"`
@@ -28,7 +28,7 @@ func (t ttTransaction) MarshalJSON() ([]byte, error) {
}
var enc ttTransaction
enc.Data = t.Data
- enc.GasLimit = (*math.HexOrDecimal256)(t.GasLimit)
+ enc.GasLimit = math.HexOrDecimal64(t.GasLimit)
enc.GasPrice = (*math.HexOrDecimal256)(t.GasPrice)
enc.Nonce = math.HexOrDecimal64(t.Nonce)
enc.Value = (*math.HexOrDecimal256)(t.Value)
@@ -41,8 +41,8 @@ func (t ttTransaction) MarshalJSON() ([]byte, error) {
func (t *ttTransaction) UnmarshalJSON(input []byte) error {
type ttTransaction struct {
- Data hexutil.Bytes `gencodec:"required"`
- GasLimit *math.HexOrDecimal256 `gencodec:"required"`
+ Data *hexutil.Bytes `gencodec:"required"`
+ GasLimit *math.HexOrDecimal64 `gencodec:"required"`
GasPrice *math.HexOrDecimal256 `gencodec:"required"`
Nonce *math.HexOrDecimal64 `gencodec:"required"`
Value *math.HexOrDecimal256 `gencodec:"required"`
@@ -58,11 +58,11 @@ func (t *ttTransaction) UnmarshalJSON(input []byte) error {
if dec.Data == nil {
return errors.New("missing required field 'data' for ttTransaction")
}
- t.Data = dec.Data
+ t.Data = *dec.Data
if dec.GasLimit == nil {
return errors.New("missing required field 'gasLimit' for ttTransaction")
}
- t.GasLimit = (*big.Int)(dec.GasLimit)
+ t.GasLimit = uint64(*dec.GasLimit)
if dec.GasPrice == nil {
return errors.New("missing required field 'gasPrice' for ttTransaction")
}
diff --git a/tests/gen_vmexec.go b/tests/gen_vmexec.go
index dd2d3d94e..a5f01cf45 100644
--- a/tests/gen_vmexec.go
+++ b/tests/gen_vmexec.go
@@ -42,8 +42,8 @@ func (v *vmExec) UnmarshalJSON(input []byte) error {
Address *common.UnprefixedAddress `json:"address" gencodec:"required"`
Caller *common.UnprefixedAddress `json:"caller" gencodec:"required"`
Origin *common.UnprefixedAddress `json:"origin" gencodec:"required"`
- Code hexutil.Bytes `json:"code" gencodec:"required"`
- Data hexutil.Bytes `json:"data" gencodec:"required"`
+ Code *hexutil.Bytes `json:"code" gencodec:"required"`
+ Data *hexutil.Bytes `json:"data" gencodec:"required"`
Value *math.HexOrDecimal256 `json:"value" gencodec:"required"`
GasLimit *math.HexOrDecimal64 `json:"gas" gencodec:"required"`
GasPrice *math.HexOrDecimal256 `json:"gasPrice" gencodec:"required"`
@@ -67,11 +67,11 @@ func (v *vmExec) UnmarshalJSON(input []byte) error {
if dec.Code == nil {
return errors.New("missing required field 'code' for vmExec")
}
- v.Code = dec.Code
+ v.Code = *dec.Code
if dec.Data == nil {
return errors.New("missing required field 'data' for vmExec")
}
- v.Data = dec.Data
+ v.Data = *dec.Data
if dec.Value == nil {
return errors.New("missing required field 'value' for vmExec")
}
diff --git a/tests/state_test.go b/tests/state_test.go
index 5a67b290d..100c776c1 100644
--- a/tests/state_test.go
+++ b/tests/state_test.go
@@ -39,16 +39,12 @@ func TestState(t *testing.T) {
st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/EIP158`, "bug in test")
st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test")
st.fails(`^stRevertTest/RevertPrefoundEmptyOOG\.json/Byzantium`, "bug in test")
- st.fails(`^stRandom/randomStatetest645\.json/EIP150/.*`, "known bug #15119")
- st.fails(`^stRandom/randomStatetest645\.json/Frontier/.*`, "known bug #15119")
- st.fails(`^stRandom/randomStatetest645\.json/Homestead/.*`, "known bug #15119")
- st.fails(`^stRandom/randomStatetest644\.json/EIP150/.*`, "known bug #15119")
- st.fails(`^stRandom/randomStatetest644\.json/Frontier/.*`, "known bug #15119")
- st.fails(`^stRandom/randomStatetest644\.json/Homestead/.*`, "known bug #15119")
+ st.fails(`^stRandom2/randomStatetest64[45]\.json/(EIP150|Frontier|Homestead)/.*`, "known bug #15119")
st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/EIP158/2`, "known bug ")
st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/EIP158/3`, "known bug ")
st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/Byzantium/2`, "known bug ")
st.fails(`^stCreateTest/TransactionCollisionToEmpty\.json/Byzantium/3`, "known bug ")
+
st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) {
for _, subtest := range test.Subtests() {
subtest := subtest
@@ -68,8 +64,7 @@ func TestState(t *testing.T) {
}
// Transactions with gasLimit above this value will not get a VM trace on failure.
-//const traceErrorLimit = 400000
-const traceErrorLimit = 0
+const traceErrorLimit = 400000
func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) {
err := test(vm.Config{})
@@ -93,4 +88,6 @@ func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) {
} else {
t.Log("EVM operation log:\n" + buf.String())
}
+ t.Logf("EVM output: 0x%x", tracer.Output())
+ t.Logf("EVM error: %v", tracer.Error())
}
diff --git a/tests/state_test_util.go b/tests/state_test_util.go
index 352f840d9..18280d2a4 100644
--- a/tests/state_test_util.go
+++ b/tests/state_test_util.go
@@ -76,7 +76,7 @@ type stPostState struct {
type stEnv struct {
Coinbase common.Address `json:"currentCoinbase" gencodec:"required"`
Difficulty *big.Int `json:"currentDifficulty" gencodec:"required"`
- GasLimit *big.Int `json:"currentGasLimit" gencodec:"required"`
+ GasLimit uint64 `json:"currentGasLimit" gencodec:"required"`
Number uint64 `json:"currentNumber" gencodec:"required"`
Timestamp uint64 `json:"currentTimestamp" gencodec:"required"`
}
@@ -84,7 +84,7 @@ type stEnv struct {
type stEnvMarshaling struct {
Coinbase common.UnprefixedAddress
Difficulty *math.HexOrDecimal256
- GasLimit *math.HexOrDecimal256
+ GasLimit math.HexOrDecimal64
Number math.HexOrDecimal64
Timestamp math.HexOrDecimal64
}
@@ -125,9 +125,9 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD
if !ok {
return nil, UnsupportedForkError{subtest.Fork}
}
- block, _ := t.genesis(config).ToBlock()
+ block := t.genesis(config).ToBlock(nil)
db, _ := ethdb.NewMemDatabase()
- statedb := makePreState(db, t.json.Pre)
+ statedb := MakePreState(db, t.json.Pre)
post := t.json.Post[subtest.Fork][subtest.Index]
msg, err := t.json.Tx.toMessage(post)
@@ -147,7 +147,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD
if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) {
return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs)
}
- root, _ := statedb.CommitTo(db, config.IsEIP158(block.Number()))
+ root, _ := statedb.Commit(config.IsEIP158(block.Number()))
if root != common.Hash(post.Root) {
return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root)
}
@@ -158,7 +158,7 @@ func (t *StateTest) gasLimit(subtest StateSubtest) uint64 {
return t.json.Tx.GasLimit[t.json.Post[subtest.Fork][subtest.Index].Indexes.Gas]
}
-func makePreState(db ethdb.Database, accounts core.GenesisAlloc) *state.StateDB {
+func MakePreState(db ethdb.Database, accounts core.GenesisAlloc) *state.StateDB {
sdb := state.NewDatabase(db)
statedb, _ := state.New(common.Hash{}, sdb)
for addr, a := range accounts {
@@ -170,7 +170,7 @@ func makePreState(db ethdb.Database, accounts core.GenesisAlloc) *state.StateDB
}
}
// Commit and re-open to start with a clean state.
- root, _ := statedb.CommitTo(db, false)
+ root, _ := statedb.Commit(false)
statedb, _ = state.New(root, sdb)
return statedb
}
@@ -180,7 +180,7 @@ func (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis {
Config: config,
Coinbase: t.json.Env.Coinbase,
Difficulty: t.json.Env.Difficulty,
- GasLimit: t.json.Env.GasLimit.Uint64(),
+ GasLimit: t.json.Env.GasLimit,
Number: t.json.Env.Number,
Timestamp: t.json.Env.Timestamp,
Alloc: t.json.Pre,
@@ -233,7 +233,7 @@ func (tx *stTransaction) toMessage(ps stPostState) (core.Message, error) {
return nil, fmt.Errorf("invalid tx data %q", dataHex)
}
- msg := types.NewMessage(from, to, tx.Nonce, value, new(big.Int).SetUint64(gasLimit), tx.GasPrice, data, true)
+ msg := types.NewMessage(from, to, tx.Nonce, value, gasLimit, tx.GasPrice, data, true)
return msg, nil
}
diff --git a/tests/testdata b/tests/testdata
-Subproject 37f555fbc091fbf761aa6f02227132fb31f0681
+Subproject 2bb0c3da3bbb15c528bcef2a7e5ac4bd73f81f8
diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go
index 472b3d6f2..2028d2a27 100644
--- a/tests/transaction_test_util.go
+++ b/tests/transaction_test_util.go
@@ -46,7 +46,7 @@ type ttJSON struct {
type ttTransaction struct {
Data []byte `gencodec:"required"`
- GasLimit *big.Int `gencodec:"required"`
+ GasLimit uint64 `gencodec:"required"`
GasPrice *big.Int `gencodec:"required"`
Nonce uint64 `gencodec:"required"`
Value *big.Int `gencodec:"required"`
@@ -58,7 +58,7 @@ type ttTransaction struct {
type ttTransactionMarshaling struct {
Data hexutil.Bytes
- GasLimit *math.HexOrDecimal256
+ GasLimit math.HexOrDecimal64
GasPrice *math.HexOrDecimal256
Nonce math.HexOrDecimal64
Value *math.HexOrDecimal256
@@ -100,8 +100,8 @@ func (tt *ttTransaction) verify(signer types.Signer, tx *types.Transaction) erro
if !bytes.Equal(tx.Data(), tt.Data) {
return fmt.Errorf("Tx input data mismatch: got %x want %x", tx.Data(), tt.Data)
}
- if tx.Gas().Cmp(tt.GasLimit) != 0 {
- return fmt.Errorf("GasLimit mismatch: got %v, want %v", tx.Gas(), tt.GasLimit)
+ if tx.Gas() != tt.GasLimit {
+ return fmt.Errorf("GasLimit mismatch: got %d, want %d", tx.Gas(), tt.GasLimit)
}
if tx.GasPrice().Cmp(tt.GasPrice) != 0 {
return fmt.Errorf("GasPrice mismatch: got %v, want %v", tx.GasPrice(), tt.GasPrice)
diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go
index 0aa37955c..b365167a6 100644
--- a/tests/vm_test_util.go
+++ b/tests/vm_test_util.go
@@ -80,7 +80,7 @@ type vmExecMarshaling struct {
func (t *VMTest) Run(vmconfig vm.Config) error {
db, _ := ethdb.NewMemDatabase()
- statedb := makePreState(db, t.json.Pre)
+ statedb := MakePreState(db, t.json.Pre)
ret, gasRemaining, err := t.exec(statedb, vmconfig)
if t.json.GasRemaining == nil {
diff --git a/trie/database.go b/trie/database.go
new file mode 100644
index 000000000..d79120813
--- /dev/null
+++ b/trie/database.go
@@ -0,0 +1,355 @@
+// Copyright 2017 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package trie
+
+import (
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/log"
+)
+
+// secureKeyPrefix is the database key prefix used to store trie node preimages.
+var secureKeyPrefix = []byte("secure-key-")
+
+// secureKeyLength is the length of the above prefix + 32byte hash.
+const secureKeyLength = 11 + 32
+
+// DatabaseReader wraps the Get and Has method of a backing store for the trie.
+type DatabaseReader interface {
+ // Get retrieves the value associated with key form the database.
+ Get(key []byte) (value []byte, err error)
+
+ // Has retrieves whether a key is present in the database.
+ Has(key []byte) (bool, error)
+}
+
+// Database is an intermediate write layer between the trie data structures and
+// the disk database. The aim is to accumulate trie writes in-memory and only
+// periodically flush a couple tries to disk, garbage collecting the remainder.
+type Database struct {
+ diskdb ethdb.Database // Persistent storage for matured trie nodes
+
+ nodes map[common.Hash]*cachedNode // Data and references relationships of a node
+ preimages map[common.Hash][]byte // Preimages of nodes from the secure trie
+ seckeybuf [secureKeyLength]byte // Ephemeral buffer for calculating preimage keys
+
+ gctime time.Duration // Time spent on garbage collection since last commit
+ gcnodes uint64 // Nodes garbage collected since last commit
+ gcsize common.StorageSize // Data storage garbage collected since last commit
+
+ nodesSize common.StorageSize // Storage size of the nodes cache
+ preimagesSize common.StorageSize // Storage size of the preimages cache
+
+ lock sync.RWMutex
+}
+
+// cachedNode is all the information we know about a single cached node in the
+// memory database write layer.
+type cachedNode struct {
+ blob []byte // Cached data block of the trie node
+ parents int // Number of live nodes referencing this one
+ children map[common.Hash]int // Children referenced by this nodes
+}
+
+// NewDatabase creates a new trie database to store ephemeral trie content before
+// its written out to disk or garbage collected.
+func NewDatabase(diskdb ethdb.Database) *Database {
+ return &Database{
+ diskdb: diskdb,
+ nodes: map[common.Hash]*cachedNode{
+ {}: {children: make(map[common.Hash]int)},
+ },
+ preimages: make(map[common.Hash][]byte),
+ }
+}
+
+// DiskDB retrieves the persistent storage backing the trie database.
+func (db *Database) DiskDB() DatabaseReader {
+ return db.diskdb
+}
+
+// Insert writes a new trie node to the memory database if it's yet unknown. The
+// method will make a copy of the slice.
+func (db *Database) Insert(hash common.Hash, blob []byte) {
+ db.lock.Lock()
+ defer db.lock.Unlock()
+
+ db.insert(hash, blob)
+}
+
+// insert is the private locked version of Insert.
+func (db *Database) insert(hash common.Hash, blob []byte) {
+ if _, ok := db.nodes[hash]; ok {
+ return
+ }
+ db.nodes[hash] = &cachedNode{
+ blob: common.CopyBytes(blob),
+ children: make(map[common.Hash]int),
+ }
+ db.nodesSize += common.StorageSize(common.HashLength + len(blob))
+}
+
+// insertPreimage writes a new trie node pre-image to the memory database if it's
+// yet unknown. The method will make a copy of the slice.
+//
+// Note, this method assumes that the database's lock is held!
+func (db *Database) insertPreimage(hash common.Hash, preimage []byte) {
+ if _, ok := db.preimages[hash]; ok {
+ return
+ }
+ db.preimages[hash] = common.CopyBytes(preimage)
+ db.preimagesSize += common.StorageSize(common.HashLength + len(preimage))
+}
+
+// Node retrieves a cached trie node from memory. If it cannot be found cached,
+// the method queries the persistent database for the content.
+func (db *Database) Node(hash common.Hash) ([]byte, error) {
+ // Retrieve the node from cache if available
+ db.lock.RLock()
+ node := db.nodes[hash]
+ db.lock.RUnlock()
+
+ if node != nil {
+ return node.blob, nil
+ }
+ // Content unavailable in memory, attempt to retrieve from disk
+ return db.diskdb.Get(hash[:])
+}
+
+// preimage retrieves a cached trie node pre-image from memory. If it cannot be
+// found cached, the method queries the persistent database for the content.
+func (db *Database) preimage(hash common.Hash) ([]byte, error) {
+ // Retrieve the node from cache if available
+ db.lock.RLock()
+ preimage := db.preimages[hash]
+ db.lock.RUnlock()
+
+ if preimage != nil {
+ return preimage, nil
+ }
+ // Content unavailable in memory, attempt to retrieve from disk
+ return db.diskdb.Get(db.secureKey(hash[:]))
+}
+
+// secureKey returns the database key for the preimage of key, as an ephemeral
+// buffer. The caller must not hold onto the return value because it will become
+// invalid on the next call.
+func (db *Database) secureKey(key []byte) []byte {
+ buf := append(db.seckeybuf[:0], secureKeyPrefix...)
+ buf = append(buf, key...)
+ return buf
+}
+
+// Nodes retrieves the hashes of all the nodes cached within the memory database.
+// This method is extremely expensive and should only be used to validate internal
+// states in test code.
+func (db *Database) Nodes() []common.Hash {
+ db.lock.RLock()
+ defer db.lock.RUnlock()
+
+ var hashes = make([]common.Hash, 0, len(db.nodes))
+ for hash := range db.nodes {
+ if hash != (common.Hash{}) { // Special case for "root" references/nodes
+ hashes = append(hashes, hash)
+ }
+ }
+ return hashes
+}
+
+// Reference adds a new reference from a parent node to a child node.
+func (db *Database) Reference(child common.Hash, parent common.Hash) {
+ db.lock.RLock()
+ defer db.lock.RUnlock()
+
+ db.reference(child, parent)
+}
+
+// reference is the private locked version of Reference.
+func (db *Database) reference(child common.Hash, parent common.Hash) {
+ // If the node does not exist, it's a node pulled from disk, skip
+ node, ok := db.nodes[child]
+ if !ok {
+ return
+ }
+ // If the reference already exists, only duplicate for roots
+ if _, ok = db.nodes[parent].children[child]; ok && parent != (common.Hash{}) {
+ return
+ }
+ node.parents++
+ db.nodes[parent].children[child]++
+}
+
+// Dereference removes an existing reference from a parent node to a child node.
+func (db *Database) Dereference(child common.Hash, parent common.Hash) {
+ db.lock.Lock()
+ defer db.lock.Unlock()
+
+ nodes, storage, start := len(db.nodes), db.nodesSize, time.Now()
+ db.dereference(child, parent)
+
+ db.gcnodes += uint64(nodes - len(db.nodes))
+ db.gcsize += storage - db.nodesSize
+ db.gctime += time.Since(start)
+
+ log.Debug("Dereferenced trie from memory database", "nodes", nodes-len(db.nodes), "size", storage-db.nodesSize, "time", time.Since(start),
+ "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.nodes), "livesize", db.nodesSize)
+}
+
+// dereference is the private locked version of Dereference.
+func (db *Database) dereference(child common.Hash, parent common.Hash) {
+ // Dereference the parent-child
+ node := db.nodes[parent]
+
+ node.children[child]--
+ if node.children[child] == 0 {
+ delete(node.children, child)
+ }
+ // If the node does not exist, it's a previously committed node.
+ node, ok := db.nodes[child]
+ if !ok {
+ return
+ }
+ // If there are no more references to the child, delete it and cascade
+ node.parents--
+ if node.parents == 0 {
+ for hash := range node.children {
+ db.dereference(hash, child)
+ }
+ delete(db.nodes, child)
+ db.nodesSize -= common.StorageSize(common.HashLength + len(node.blob))
+ }
+}
+
+// Commit iterates over all the children of a particular node, writes them out
+// to disk, forcefully tearing down all references in both directions.
+//
+// As a side effect, all pre-images accumulated up to this point are also written.
+func (db *Database) Commit(node common.Hash, report bool) error {
+ // Create a database batch to flush persistent data out. It is important that
+ // outside code doesn't see an inconsistent state (referenced data removed from
+ // memory cache during commit but not yet in persistent storage). This is ensured
+ // by only uncaching existing data when the database write finalizes.
+ db.lock.RLock()
+
+ start := time.Now()
+ batch := db.diskdb.NewBatch()
+
+ // Move all of the accumulated preimages into a write batch
+ for hash, preimage := range db.preimages {
+ if err := batch.Put(db.secureKey(hash[:]), preimage); err != nil {
+ log.Error("Failed to commit preimage from trie database", "err", err)
+ db.lock.RUnlock()
+ return err
+ }
+ if batch.ValueSize() > ethdb.IdealBatchSize {
+ if err := batch.Write(); err != nil {
+ return err
+ }
+ batch.Reset()
+ }
+ }
+ // Move the trie itself into the batch, flushing if enough data is accumulated
+ nodes, storage := len(db.nodes), db.nodesSize+db.preimagesSize
+ if err := db.commit(node, batch); err != nil {
+ log.Error("Failed to commit trie from trie database", "err", err)
+ db.lock.RUnlock()
+ return err
+ }
+ // Write batch ready, unlock for readers during persistence
+ if err := batch.Write(); err != nil {
+ log.Error("Failed to write trie to disk", "err", err)
+ db.lock.RUnlock()
+ return err
+ }
+ db.lock.RUnlock()
+
+ // Write successful, clear out the flushed data
+ db.lock.Lock()
+ defer db.lock.Unlock()
+
+ db.preimages = make(map[common.Hash][]byte)
+ db.preimagesSize = 0
+
+ db.uncache(node)
+
+ logger := log.Info
+ if !report {
+ logger = log.Debug
+ }
+ logger("Persisted trie from memory database", "nodes", nodes-len(db.nodes), "size", storage-db.nodesSize, "time", time.Since(start),
+ "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.nodes), "livesize", db.nodesSize)
+
+ // Reset the garbage collection statistics
+ db.gcnodes, db.gcsize, db.gctime = 0, 0, 0
+
+ return nil
+}
+
+// commit is the private locked version of Commit.
+func (db *Database) commit(hash common.Hash, batch ethdb.Batch) error {
+ // If the node does not exist, it's a previously committed node
+ node, ok := db.nodes[hash]
+ if !ok {
+ return nil
+ }
+ for child := range node.children {
+ if err := db.commit(child, batch); err != nil {
+ return err
+ }
+ }
+ if err := batch.Put(hash[:], node.blob); err != nil {
+ return err
+ }
+ // If we've reached an optimal match size, commit and start over
+ if batch.ValueSize() >= ethdb.IdealBatchSize {
+ if err := batch.Write(); err != nil {
+ return err
+ }
+ batch.Reset()
+ }
+ return nil
+}
+
+// uncache is the post-processing step of a commit operation where the already
+// persisted trie is removed from the cache. The reason behind the two-phase
+// commit is to ensure consistent data availability while moving from memory
+// to disk.
+func (db *Database) uncache(hash common.Hash) {
+ // If the node does not exist, we're done on this path
+ node, ok := db.nodes[hash]
+ if !ok {
+ return
+ }
+ // Otherwise uncache the node's subtries and remove the node itself too
+ for child := range node.children {
+ db.uncache(child)
+ }
+ delete(db.nodes, hash)
+ db.nodesSize -= common.StorageSize(common.HashLength + len(node.blob))
+}
+
+// Size returns the current storage size of the memory cache in front of the
+// persistent database layer.
+func (db *Database) Size() common.StorageSize {
+ db.lock.RLock()
+ defer db.lock.RUnlock()
+
+ return db.nodesSize + db.preimagesSize
+}
diff --git a/trie/hasher.go b/trie/hasher.go
index 5186d7669..2fc44787a 100644
--- a/trie/hasher.go
+++ b/trie/hasher.go
@@ -26,51 +26,34 @@ import (
"github.com/ethereum/go-ethereum/rlp"
)
-// calculator is a utility used by the hasher to calculate the hash value of the tree node.
-type calculator struct {
- sha hash.Hash
- buffer *bytes.Buffer
-}
-
-// calculatorPool is a set of temporary calculators that may be individually saved and retrieved.
-var calculatorPool = sync.Pool{
- New: func() interface{} {
- return &calculator{buffer: new(bytes.Buffer), sha: sha3.NewKeccak256()}
- },
-}
-
-// hasher hasher is used to calculate the hash value of the whole tree.
type hasher struct {
+ tmp *bytes.Buffer
+ sha hash.Hash
cachegen uint16
cachelimit uint16
- threaded bool
- mu sync.Mutex
+ onleaf LeafCallback
}
-func newHasher(cachegen, cachelimit uint16) *hasher {
- h := &hasher{
- cachegen: cachegen,
- cachelimit: cachelimit,
- }
- return h
+// hashers live in a global db.
+var hasherPool = sync.Pool{
+ New: func() interface{} {
+ return &hasher{tmp: new(bytes.Buffer), sha: sha3.NewKeccak256()}
+ },
}
-// newCalculator retrieves a cleaned calculator from calculator pool.
-func (h *hasher) newCalculator() *calculator {
- calculator := calculatorPool.Get().(*calculator)
- calculator.buffer.Reset()
- calculator.sha.Reset()
- return calculator
+func newHasher(cachegen, cachelimit uint16, onleaf LeafCallback) *hasher {
+ h := hasherPool.Get().(*hasher)
+ h.cachegen, h.cachelimit, h.onleaf = cachegen, cachelimit, onleaf
+ return h
}
-// returnCalculator returns a no longer used calculator to the pool.
-func (h *hasher) returnCalculator(calculator *calculator) {
- calculatorPool.Put(calculator)
+func returnHasherToPool(h *hasher) {
+ hasherPool.Put(h)
}
// hash collapses a node down into a hash node, also returning a copy of the
// original node initialized with the computed hash to replace the original one.
-func (h *hasher) hash(n node, db DatabaseWriter, force bool) (node, node, error) {
+func (h *hasher) hash(n node, db *Database, force bool) (node, node, error) {
// If we're not storing the node, just hashing, use available cached data
if hash, dirty := n.cache(); hash != nil {
if db == nil {
@@ -117,7 +100,7 @@ func (h *hasher) hash(n node, db DatabaseWriter, force bool) (node, node, error)
// hashChildren replaces the children of a node with their hashes if the encoded
// size of the child is larger than a hash, returning the collapsed node as well
// as a replacement for the original node with the child hashes cached in.
-func (h *hasher) hashChildren(original node, db DatabaseWriter) (node, node, error) {
+func (h *hasher) hashChildren(original node, db *Database) (node, node, error) {
var err error
switch n := original.(type) {
@@ -142,49 +125,16 @@ func (h *hasher) hashChildren(original node, db DatabaseWriter) (node, node, err
// Hash the full node's children, caching the newly hashed subtrees
collapsed, cached := n.copy(), n.copy()
- // hashChild is a helper to hash a single child, which is called either on the
- // same thread as the caller or in a goroutine for the toplevel branching.
- hashChild := func(index int, wg *sync.WaitGroup) {
- if wg != nil {
- defer wg.Done()
- }
- // Ensure that nil children are encoded as empty strings.
- if collapsed.Children[index] == nil {
- collapsed.Children[index] = valueNode(nil)
- return
- }
- // Hash all other children properly
- var herr error
- collapsed.Children[index], cached.Children[index], herr = h.hash(n.Children[index], db, false)
- if herr != nil {
- h.mu.Lock() // rarely if ever locked, no congenstion
- err = herr
- h.mu.Unlock()
+ for i := 0; i < 16; i++ {
+ if n.Children[i] != nil {
+ collapsed.Children[i], cached.Children[i], err = h.hash(n.Children[i], db, false)
+ if err != nil {
+ return original, original, err
+ }
+ } else {
+ collapsed.Children[i] = valueNode(nil) // Ensure that nil children are encoded as empty strings.
}
}
- // If we're not running in threaded mode yet, span a goroutine for each child
- if !h.threaded {
- // Disable further threading
- h.threaded = true
-
- // Hash all the children concurrently
- var wg sync.WaitGroup
- for i := 0; i < 16; i++ {
- wg.Add(1)
- go hashChild(i, &wg)
- }
- wg.Wait()
-
- // Reenable threading for subsequent hash calls
- h.threaded = false
- } else {
- for i := 0; i < 16; i++ {
- hashChild(i, nil)
- }
- }
- if err != nil {
- return original, original, err
- }
cached.Children[16] = n.Children[16]
if collapsed.Children[16] == nil {
collapsed.Children[16] = valueNode(nil)
@@ -197,34 +147,66 @@ func (h *hasher) hashChildren(original node, db DatabaseWriter) (node, node, err
}
}
-func (h *hasher) store(n node, db DatabaseWriter, force bool) (node, error) {
+// store hashes the node n and if we have a storage layer specified, it writes
+// the key/value pair to it and tracks any node->child references as well as any
+// node->external trie references.
+func (h *hasher) store(n node, db *Database, force bool) (node, error) {
// Don't store hashes or empty nodes.
if _, isHash := n.(hashNode); n == nil || isHash {
return n, nil
}
- calculator := h.newCalculator()
- defer h.returnCalculator(calculator)
-
// Generate the RLP encoding of the node
- if err := rlp.Encode(calculator.buffer, n); err != nil {
+ h.tmp.Reset()
+ if err := rlp.Encode(h.tmp, n); err != nil {
panic("encode error: " + err.Error())
}
- if calculator.buffer.Len() < 32 && !force {
+ if h.tmp.Len() < 32 && !force {
return n, nil // Nodes smaller than 32 bytes are stored inside their parent
}
// Larger nodes are replaced by their hash and stored in the database.
hash, _ := n.cache()
if hash == nil {
- calculator.sha.Write(calculator.buffer.Bytes())
- hash = hashNode(calculator.sha.Sum(nil))
+ h.sha.Reset()
+ h.sha.Write(h.tmp.Bytes())
+ hash = hashNode(h.sha.Sum(nil))
}
if db != nil {
- // db might be a leveldb batch, which is not safe for concurrent writes
- h.mu.Lock()
- err := db.Put(hash, calculator.buffer.Bytes())
- h.mu.Unlock()
+ // We are pooling the trie nodes into an intermediate memory cache
+ db.lock.Lock()
- return hash, err
+ hash := common.BytesToHash(hash)
+ db.insert(hash, h.tmp.Bytes())
+
+ // Track all direct parent->child node references
+ switch n := n.(type) {
+ case *shortNode:
+ if child, ok := n.Val.(hashNode); ok {
+ db.reference(common.BytesToHash(child), hash)
+ }
+ case *fullNode:
+ for i := 0; i < 16; i++ {
+ if child, ok := n.Children[i].(hashNode); ok {
+ db.reference(common.BytesToHash(child), hash)
+ }
+ }
+ }
+ db.lock.Unlock()
+
+ // Track external references from account->storage trie
+ if h.onleaf != nil {
+ switch n := n.(type) {
+ case *shortNode:
+ if child, ok := n.Val.(valueNode); ok {
+ h.onleaf(child, hash)
+ }
+ case *fullNode:
+ for i := 0; i < 16; i++ {
+ if child, ok := n.Children[i].(valueNode); ok {
+ h.onleaf(child, hash)
+ }
+ }
+ }
+ }
}
return hash, nil
}
diff --git a/trie/iterator_test.go b/trie/iterator_test.go
index 4808d8b0c..dce1c78b5 100644
--- a/trie/iterator_test.go
+++ b/trie/iterator_test.go
@@ -42,7 +42,7 @@ func TestIterator(t *testing.T) {
all[val.k] = val.v
trie.Update([]byte(val.k), []byte(val.v))
}
- trie.Commit()
+ trie.Commit(nil)
found := make(map[string]string)
it := NewIterator(trie.NodeIterator(nil))
@@ -109,11 +109,18 @@ func TestNodeIteratorCoverage(t *testing.T) {
}
// Cross check the hashes and the database itself
for hash := range hashes {
- if _, err := db.Get(hash.Bytes()); err != nil {
+ if _, err := db.Node(hash); err != nil {
t.Errorf("failed to retrieve reported node %x: %v", hash, err)
}
}
- for _, key := range db.(*ethdb.MemDatabase).Keys() {
+ for hash, obj := range db.nodes {
+ if obj != nil && hash != (common.Hash{}) {
+ if _, ok := hashes[hash]; !ok {
+ t.Errorf("state entry not reported %x", hash)
+ }
+ }
+ }
+ for _, key := range db.diskdb.(*ethdb.MemDatabase).Keys() {
if _, ok := hashes[common.BytesToHash(key)]; !ok {
t.Errorf("state entry not reported %x", key)
}
@@ -191,13 +198,13 @@ func TestDifferenceIterator(t *testing.T) {
for _, val := range testdata1 {
triea.Update([]byte(val.k), []byte(val.v))
}
- triea.Commit()
+ triea.Commit(nil)
trieb := newEmpty()
for _, val := range testdata2 {
trieb.Update([]byte(val.k), []byte(val.v))
}
- trieb.Commit()
+ trieb.Commit(nil)
found := make(map[string]string)
di, _ := NewDifferenceIterator(triea.NodeIterator(nil), trieb.NodeIterator(nil))
@@ -227,13 +234,13 @@ func TestUnionIterator(t *testing.T) {
for _, val := range testdata1 {
triea.Update([]byte(val.k), []byte(val.v))
}
- triea.Commit()
+ triea.Commit(nil)
trieb := newEmpty()
for _, val := range testdata2 {
trieb.Update([]byte(val.k), []byte(val.v))
}
- trieb.Commit()
+ trieb.Commit(nil)
di, _ := NewUnionIterator([]NodeIterator{triea.NodeIterator(nil), trieb.NodeIterator(nil)})
it := NewIterator(di)
@@ -278,43 +285,75 @@ func TestIteratorNoDups(t *testing.T) {
}
// This test checks that nodeIterator.Next can be retried after inserting missing trie nodes.
-func TestIteratorContinueAfterError(t *testing.T) {
- db, _ := ethdb.NewMemDatabase()
- tr, _ := New(common.Hash{}, db)
+func TestIteratorContinueAfterErrorDisk(t *testing.T) { testIteratorContinueAfterError(t, false) }
+func TestIteratorContinueAfterErrorMemonly(t *testing.T) { testIteratorContinueAfterError(t, true) }
+
+func testIteratorContinueAfterError(t *testing.T, memonly bool) {
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+
+ tr, _ := New(common.Hash{}, triedb)
for _, val := range testdata1 {
tr.Update([]byte(val.k), []byte(val.v))
}
- tr.Commit()
+ tr.Commit(nil)
+ if !memonly {
+ triedb.Commit(tr.Hash(), true)
+ }
wantNodeCount := checkIteratorNoDups(t, tr.NodeIterator(nil), nil)
- keys := db.Keys()
- t.Log("node count", wantNodeCount)
+ var (
+ diskKeys [][]byte
+ memKeys []common.Hash
+ )
+ if memonly {
+ memKeys = triedb.Nodes()
+ } else {
+ diskKeys = diskdb.Keys()
+ }
for i := 0; i < 20; i++ {
// Create trie that will load all nodes from DB.
- tr, _ := New(tr.Hash(), db)
+ tr, _ := New(tr.Hash(), triedb)
// Remove a random node from the database. It can't be the root node
// because that one is already loaded.
- var rkey []byte
+ var (
+ rkey common.Hash
+ rval []byte
+ robj *cachedNode
+ )
for {
- if rkey = keys[rand.Intn(len(keys))]; !bytes.Equal(rkey, tr.Hash().Bytes()) {
+ if memonly {
+ rkey = memKeys[rand.Intn(len(memKeys))]
+ } else {
+ copy(rkey[:], diskKeys[rand.Intn(len(diskKeys))])
+ }
+ if rkey != tr.Hash() {
break
}
}
- rval, _ := db.Get(rkey)
- db.Delete(rkey)
-
+ if memonly {
+ robj = triedb.nodes[rkey]
+ delete(triedb.nodes, rkey)
+ } else {
+ rval, _ = diskdb.Get(rkey[:])
+ diskdb.Delete(rkey[:])
+ }
// Iterate until the error is hit.
seen := make(map[string]bool)
it := tr.NodeIterator(nil)
checkIteratorNoDups(t, it, seen)
missing, ok := it.Error().(*MissingNodeError)
- if !ok || !bytes.Equal(missing.NodeHash[:], rkey) {
+ if !ok || missing.NodeHash != rkey {
t.Fatal("didn't hit missing node, got", it.Error())
}
// Add the node back and continue iteration.
- db.Put(rkey, rval)
+ if memonly {
+ triedb.nodes[rkey] = robj
+ } else {
+ diskdb.Put(rkey[:], rval)
+ }
checkIteratorNoDups(t, it, seen)
if it.Error() != nil {
t.Fatal("unexpected error", it.Error())
@@ -328,21 +367,41 @@ func TestIteratorContinueAfterError(t *testing.T) {
// Similar to the test above, this one checks that failure to create nodeIterator at a
// certain key prefix behaves correctly when Next is called. The expectation is that Next
// should retry seeking before returning true for the first time.
-func TestIteratorContinueAfterSeekError(t *testing.T) {
+func TestIteratorContinueAfterSeekErrorDisk(t *testing.T) {
+ testIteratorContinueAfterSeekError(t, false)
+}
+func TestIteratorContinueAfterSeekErrorMemonly(t *testing.T) {
+ testIteratorContinueAfterSeekError(t, true)
+}
+
+func testIteratorContinueAfterSeekError(t *testing.T, memonly bool) {
// Commit test trie to db, then remove the node containing "bars".
- db, _ := ethdb.NewMemDatabase()
- ctr, _ := New(common.Hash{}, db)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+
+ ctr, _ := New(common.Hash{}, triedb)
for _, val := range testdata1 {
ctr.Update([]byte(val.k), []byte(val.v))
}
- root, _ := ctr.Commit()
+ root, _ := ctr.Commit(nil)
+ if !memonly {
+ triedb.Commit(root, true)
+ }
barNodeHash := common.HexToHash("05041990364eb72fcb1127652ce40d8bab765f2bfe53225b1170d276cc101c2e")
- barNode, _ := db.Get(barNodeHash[:])
- db.Delete(barNodeHash[:])
-
+ var (
+ barNodeBlob []byte
+ barNodeObj *cachedNode
+ )
+ if memonly {
+ barNodeObj = triedb.nodes[barNodeHash]
+ delete(triedb.nodes, barNodeHash)
+ } else {
+ barNodeBlob, _ = diskdb.Get(barNodeHash[:])
+ diskdb.Delete(barNodeHash[:])
+ }
// Create a new iterator that seeks to "bars". Seeking can't proceed because
// the node is missing.
- tr, _ := New(root, db)
+ tr, _ := New(root, triedb)
it := tr.NodeIterator([]byte("bars"))
missing, ok := it.Error().(*MissingNodeError)
if !ok {
@@ -350,10 +409,12 @@ func TestIteratorContinueAfterSeekError(t *testing.T) {
} else if missing.NodeHash != barNodeHash {
t.Fatal("wrong node missing")
}
-
// Reinsert the missing node.
- db.Put(barNodeHash[:], barNode[:])
-
+ if memonly {
+ triedb.nodes[barNodeHash] = barNodeObj
+ } else {
+ diskdb.Put(barNodeHash[:], barNodeBlob)
+ }
// Check that iteration produces the right set of values.
if err := checkIteratorOrder(testdata1[2:], NewIterator(it)); err != nil {
t.Fatal(err)
diff --git a/trie/proof.go b/trie/proof.go
index 5e886a259..508e4a6cf 100644
--- a/trie/proof.go
+++ b/trie/proof.go
@@ -22,20 +22,19 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rlp"
)
-// Prove constructs a merkle proof for key. The result contains all
-// encoded nodes on the path to the value at key. The value itself is
-// also included in the last node and can be retrieved by verifying
-// the proof.
+// Prove constructs a merkle proof for key. The result contains all encoded nodes
+// on the path to the value at key. The value itself is also included in the last
+// node and can be retrieved by verifying the proof.
//
-// If the trie does not contain a value for key, the returned proof
-// contains all nodes of the longest existing prefix of the key
-// (at least the root node), ending with the node that proves the
-// absence of the key.
-func (t *Trie) Prove(key []byte, fromLevel uint, proofDb DatabaseWriter) error {
+// If the trie does not contain a value for key, the returned proof contains all
+// nodes of the longest existing prefix of the key (at least the root node), ending
+// with the node that proves the absence of the key.
+func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error {
// Collect all nodes on the path to key.
key = keybytesToHex(key)
nodes := []node{}
@@ -66,7 +65,7 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb DatabaseWriter) error {
panic(fmt.Sprintf("%T: invalid node: %v", tn, tn))
}
}
- hasher := newHasher(0, 0)
+ hasher := newHasher(0, 0, nil)
for i, n := range nodes {
// Don't bother checking for errors here since hasher panics
// if encoding doesn't work and we're not writing to any database.
@@ -89,19 +88,29 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb DatabaseWriter) error {
return nil
}
-// VerifyProof checks merkle proofs. The given proof must contain the
-// value for key in a trie with the given root hash. VerifyProof
-// returns an error if the proof contains invalid trie nodes or the
-// wrong value.
+// Prove constructs a merkle proof for key. The result contains all encoded nodes
+// on the path to the value at key. The value itself is also included in the last
+// node and can be retrieved by verifying the proof.
+//
+// If the trie does not contain a value for key, the returned proof contains all
+// nodes of the longest existing prefix of the key (at least the root node), ending
+// with the node that proves the absence of the key.
+func (t *SecureTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error {
+ return t.trie.Prove(key, fromLevel, proofDb)
+}
+
+// VerifyProof checks merkle proofs. The given proof must contain the value for
+// key in a trie with the given root hash. VerifyProof returns an error if the
+// proof contains invalid trie nodes or the wrong value.
func VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (value []byte, err error, nodes int) {
key = keybytesToHex(key)
- wantHash := rootHash[:]
+ wantHash := rootHash
for i := 0; ; i++ {
- buf, _ := proofDb.Get(wantHash)
+ buf, _ := proofDb.Get(wantHash[:])
if buf == nil {
- return nil, fmt.Errorf("proof node %d (hash %064x) missing", i, wantHash[:]), i
+ return nil, fmt.Errorf("proof node %d (hash %064x) missing", i, wantHash), i
}
- n, err := decodeNode(wantHash, buf, 0)
+ n, err := decodeNode(wantHash[:], buf, 0)
if err != nil {
return nil, fmt.Errorf("bad proof node %d: %v", i, err), i
}
@@ -112,7 +121,7 @@ func VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (valu
return nil, nil, i
case hashNode:
key = keyrest
- wantHash = cld
+ copy(wantHash[:], cld)
case valueNode:
return cld, nil, i + 1
}
diff --git a/trie/secure_trie.go b/trie/secure_trie.go
index 1fde45165..3881ee18a 100644
--- a/trie/secure_trie.go
+++ b/trie/secure_trie.go
@@ -23,10 +23,6 @@ import (
"github.com/ethereum/go-ethereum/log"
)
-var secureKeyPrefix = []byte("secure-key-")
-
-const secureKeyLength = 11 + 32 // Length of the above prefix + 32byte hash
-
// SecureTrie wraps a trie with key hashing. In a secure trie, all
// access operations hash the key using keccak256. This prevents
// calling code from creating long chains of nodes that
@@ -39,25 +35,25 @@ const secureKeyLength = 11 + 32 // Length of the above prefix + 32byte hash
// SecureTrie is not safe for concurrent use.
type SecureTrie struct {
trie Trie
- hashKeyBuf [secureKeyLength]byte
- secKeyBuf [200]byte
+ hashKeyBuf [common.HashLength]byte
secKeyCache map[string][]byte
secKeyCacheOwner *SecureTrie // Pointer to self, replace the key cache on mismatch
}
-// NewSecure creates a trie with an existing root node from db.
+// NewSecure creates a trie with an existing root node from a backing database
+// and optional intermediate in-memory node pool.
//
// If root is the zero hash or the sha3 hash of an empty string, the
// trie is initially empty. Otherwise, New will panic if db is nil
// and returns MissingNodeError if the root node cannot be found.
//
-// Accessing the trie loads nodes from db on demand.
+// Accessing the trie loads nodes from the database or node pool on demand.
// Loaded nodes are kept around until their 'cache generation' expires.
// A new cache generation is created by each call to Commit.
// cachelimit sets the number of past cache generations to keep.
-func NewSecure(root common.Hash, db Database, cachelimit uint16) (*SecureTrie, error) {
+func NewSecure(root common.Hash, db *Database, cachelimit uint16) (*SecureTrie, error) {
if db == nil {
- panic("NewSecure called with nil database")
+ panic("trie.NewSecure called without a database")
}
trie, err := New(root, db)
if err != nil {
@@ -135,7 +131,7 @@ func (t *SecureTrie) GetKey(shaKey []byte) []byte {
if key, ok := t.getSecKeyCache()[string(shaKey)]; ok {
return key
}
- key, _ := t.trie.db.Get(t.secKey(shaKey))
+ key, _ := t.trie.db.preimage(common.BytesToHash(shaKey))
return key
}
@@ -144,8 +140,19 @@ func (t *SecureTrie) GetKey(shaKey []byte) []byte {
//
// Committing flushes nodes from memory. Subsequent Get calls will load nodes
// from the database.
-func (t *SecureTrie) Commit() (root common.Hash, err error) {
- return t.CommitTo(t.trie.db)
+func (t *SecureTrie) Commit(onleaf LeafCallback) (root common.Hash, err error) {
+ // Write all the pre-images to the actual disk database
+ if len(t.getSecKeyCache()) > 0 {
+ t.trie.db.lock.Lock()
+ for hk, key := range t.secKeyCache {
+ t.trie.db.insertPreimage(common.BytesToHash([]byte(hk)), key)
+ }
+ t.trie.db.lock.Unlock()
+
+ t.secKeyCache = make(map[string][]byte)
+ }
+ // Commit the trie to its intermediate node database
+ return t.trie.Commit(onleaf)
}
func (t *SecureTrie) Hash() common.Hash {
@@ -167,42 +174,15 @@ func (t *SecureTrie) NodeIterator(start []byte) NodeIterator {
return t.trie.NodeIterator(start)
}
-// CommitTo writes all nodes and the secure hash pre-images to the given database.
-// Nodes are stored with their sha3 hash as the key.
-//
-// Committing flushes nodes from memory. Subsequent Get calls will load nodes from
-// the trie's database. Calling code must ensure that the changes made to db are
-// written back to the trie's attached database before using the trie.
-func (t *SecureTrie) CommitTo(db DatabaseWriter) (root common.Hash, err error) {
- if len(t.getSecKeyCache()) > 0 {
- for hk, key := range t.secKeyCache {
- if err := db.Put(t.secKey([]byte(hk)), key); err != nil {
- return common.Hash{}, err
- }
- }
- t.secKeyCache = make(map[string][]byte)
- }
- return t.trie.CommitTo(db)
-}
-
-// secKey returns the database key for the preimage of key, as an ephemeral buffer.
-// The caller must not hold onto the return value because it will become
-// invalid on the next call to hashKey or secKey.
-func (t *SecureTrie) secKey(key []byte) []byte {
- buf := append(t.secKeyBuf[:0], secureKeyPrefix...)
- buf = append(buf, key...)
- return buf
-}
-
// hashKey returns the hash of key as an ephemeral buffer.
// The caller must not hold onto the return value because it will become
// invalid on the next call to hashKey or secKey.
func (t *SecureTrie) hashKey(key []byte) []byte {
- h := newHasher(0, 0)
- calculator := h.newCalculator()
- calculator.sha.Write(key)
- buf := calculator.sha.Sum(t.hashKeyBuf[:0])
- h.returnCalculator(calculator)
+ h := newHasher(0, 0, nil)
+ h.sha.Reset()
+ h.sha.Write(key)
+ buf := h.sha.Sum(t.hashKeyBuf[:0])
+ returnHasherToPool(h)
return buf
}
diff --git a/trie/secure_trie_test.go b/trie/secure_trie_test.go
index d74102e2a..aedf5a1cd 100644
--- a/trie/secure_trie_test.go
+++ b/trie/secure_trie_test.go
@@ -28,16 +28,20 @@ import (
)
func newEmptySecure() *SecureTrie {
- db, _ := ethdb.NewMemDatabase()
- trie, _ := NewSecure(common.Hash{}, db, 0)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+
+ trie, _ := NewSecure(common.Hash{}, triedb, 0)
return trie
}
// makeTestSecureTrie creates a large enough secure trie for testing.
-func makeTestSecureTrie() (ethdb.Database, *SecureTrie, map[string][]byte) {
+func makeTestSecureTrie() (*Database, *SecureTrie, map[string][]byte) {
// Create an empty trie
- db, _ := ethdb.NewMemDatabase()
- trie, _ := NewSecure(common.Hash{}, db, 0)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+
+ trie, _ := NewSecure(common.Hash{}, triedb, 0)
// Fill it with some arbitrary data
content := make(map[string][]byte)
@@ -58,10 +62,10 @@ func makeTestSecureTrie() (ethdb.Database, *SecureTrie, map[string][]byte) {
trie.Update(key, val)
}
}
- trie.Commit()
+ trie.Commit(nil)
// Return the generated trie
- return db, trie, content
+ return triedb, trie, content
}
func TestSecureDelete(t *testing.T) {
@@ -137,7 +141,7 @@ func TestSecureTrieConcurrency(t *testing.T) {
tries[index].Update(key, val)
}
}
- tries[index].Commit()
+ tries[index].Commit(nil)
}(i)
}
// Wait for all threads to finish
diff --git a/trie/sync.go b/trie/sync.go
index fea10051f..b573a9f73 100644
--- a/trie/sync.go
+++ b/trie/sync.go
@@ -21,6 +21,7 @@ import (
"fmt"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/ethdb"
"gopkg.in/karalabe/cookiejar.v2/collections/prque"
)
@@ -42,7 +43,7 @@ type request struct {
depth int // Depth level within the trie the node is located to prioritise DFS
deps int // Number of dependencies before allowed to commit this node
- callback TrieSyncLeafCallback // Callback to invoke if a leaf node it reached on this branch
+ callback LeafCallback // Callback to invoke if a leaf node it reached on this branch
}
// SyncResult is a simple list to return missing nodes along with their request
@@ -67,11 +68,6 @@ func newSyncMemBatch() *syncMemBatch {
}
}
-// TrieSyncLeafCallback is a callback type invoked when a trie sync reaches a
-// leaf node. It's used by state syncing to check if the leaf node requires some
-// further data syncing.
-type TrieSyncLeafCallback func(leaf []byte, parent common.Hash) error
-
// TrieSync is the main state trie synchronisation scheduler, which provides yet
// unknown trie hashes to retrieve, accepts node data associated with said hashes
// and reconstructs the trie step by step until all is done.
@@ -83,7 +79,7 @@ type TrieSync struct {
}
// NewTrieSync creates a new trie data download scheduler.
-func NewTrieSync(root common.Hash, database DatabaseReader, callback TrieSyncLeafCallback) *TrieSync {
+func NewTrieSync(root common.Hash, database DatabaseReader, callback LeafCallback) *TrieSync {
ts := &TrieSync{
database: database,
membatch: newSyncMemBatch(),
@@ -95,7 +91,7 @@ func NewTrieSync(root common.Hash, database DatabaseReader, callback TrieSyncLea
}
// AddSubTrie registers a new trie to the sync code, rooted at the designated parent.
-func (s *TrieSync) AddSubTrie(root common.Hash, depth int, parent common.Hash, callback TrieSyncLeafCallback) {
+func (s *TrieSync) AddSubTrie(root common.Hash, depth int, parent common.Hash, callback LeafCallback) {
// Short circuit if the trie is empty or already known
if root == emptyRoot {
return
@@ -217,7 +213,7 @@ func (s *TrieSync) Process(results []SyncResult) (bool, int, error) {
// Commit flushes the data stored in the internal membatch out to persistent
// storage, returning th enumber of items written and any occurred error.
-func (s *TrieSync) Commit(dbw DatabaseWriter) (int, error) {
+func (s *TrieSync) Commit(dbw ethdb.Putter) (int, error) {
// Dump the membatch into a database dbw
for i, key := range s.membatch.order {
if err := dbw.Put(key[:], s.membatch.batch[key]); err != nil {
diff --git a/trie/sync_test.go b/trie/sync_test.go
index ec16a25bd..4a720612b 100644
--- a/trie/sync_test.go
+++ b/trie/sync_test.go
@@ -25,10 +25,11 @@ import (
)
// makeTestTrie create a sample test trie to test node-wise reconstruction.
-func makeTestTrie() (ethdb.Database, *Trie, map[string][]byte) {
+func makeTestTrie() (*Database, *Trie, map[string][]byte) {
// Create an empty trie
- db, _ := ethdb.NewMemDatabase()
- trie, _ := New(common.Hash{}, db)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ trie, _ := New(common.Hash{}, triedb)
// Fill it with some arbitrary data
content := make(map[string][]byte)
@@ -49,15 +50,15 @@ func makeTestTrie() (ethdb.Database, *Trie, map[string][]byte) {
trie.Update(key, val)
}
}
- trie.Commit()
+ trie.Commit(nil)
// Return the generated trie
- return db, trie, content
+ return triedb, trie, content
}
// checkTrieContents cross references a reconstructed trie with an expected data
// content map.
-func checkTrieContents(t *testing.T, db Database, root []byte, content map[string][]byte) {
+func checkTrieContents(t *testing.T, db *Database, root []byte, content map[string][]byte) {
// Check root availability and trie contents
trie, err := New(common.BytesToHash(root), db)
if err != nil {
@@ -74,7 +75,7 @@ func checkTrieContents(t *testing.T, db Database, root []byte, content map[strin
}
// checkTrieConsistency checks that all nodes in a trie are indeed present.
-func checkTrieConsistency(db Database, root common.Hash) error {
+func checkTrieConsistency(db *Database, root common.Hash) error {
// Create and iterate a trie rooted in a subnode
trie, err := New(root, db)
if err != nil {
@@ -88,12 +89,18 @@ func checkTrieConsistency(db Database, root common.Hash) error {
// Tests that an empty trie is not scheduled for syncing.
func TestEmptyTrieSync(t *testing.T) {
- emptyA, _ := New(common.Hash{}, nil)
- emptyB, _ := New(emptyRoot, nil)
+ diskdbA, _ := ethdb.NewMemDatabase()
+ triedbA := NewDatabase(diskdbA)
+
+ diskdbB, _ := ethdb.NewMemDatabase()
+ triedbB := NewDatabase(diskdbB)
+
+ emptyA, _ := New(common.Hash{}, triedbA)
+ emptyB, _ := New(emptyRoot, triedbB)
for i, trie := range []*Trie{emptyA, emptyB} {
- db, _ := ethdb.NewMemDatabase()
- if req := NewTrieSync(common.BytesToHash(trie.Root()), db, nil).Missing(1); len(req) != 0 {
+ diskdb, _ := ethdb.NewMemDatabase()
+ if req := NewTrieSync(trie.Hash(), diskdb, nil).Missing(1); len(req) != 0 {
t.Errorf("test %d: content requested for empty trie: %v", i, req)
}
}
@@ -109,14 +116,15 @@ func testIterativeTrieSync(t *testing.T, batch int) {
srcDb, srcTrie, srcData := makeTestTrie()
// Create a destination trie and sync with the scheduler
- dstDb, _ := ethdb.NewMemDatabase()
- sched := NewTrieSync(common.BytesToHash(srcTrie.Root()), dstDb, nil)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ sched := NewTrieSync(srcTrie.Hash(), diskdb, nil)
queue := append([]common.Hash{}, sched.Missing(batch)...)
for len(queue) > 0 {
results := make([]SyncResult, len(queue))
for i, hash := range queue {
- data, err := srcDb.Get(hash.Bytes())
+ data, err := srcDb.Node(hash)
if err != nil {
t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
}
@@ -125,13 +133,13 @@ func testIterativeTrieSync(t *testing.T, batch int) {
if _, index, err := sched.Process(results); err != nil {
t.Fatalf("failed to process result #%d: %v", index, err)
}
- if index, err := sched.Commit(dstDb); err != nil {
+ if index, err := sched.Commit(diskdb); err != nil {
t.Fatalf("failed to commit data #%d: %v", index, err)
}
queue = append(queue[:0], sched.Missing(batch)...)
}
// Cross check that the two tries are in sync
- checkTrieContents(t, dstDb, srcTrie.Root(), srcData)
+ checkTrieContents(t, triedb, srcTrie.Root(), srcData)
}
// Tests that the trie scheduler can correctly reconstruct the state even if only
@@ -141,15 +149,16 @@ func TestIterativeDelayedTrieSync(t *testing.T) {
srcDb, srcTrie, srcData := makeTestTrie()
// Create a destination trie and sync with the scheduler
- dstDb, _ := ethdb.NewMemDatabase()
- sched := NewTrieSync(common.BytesToHash(srcTrie.Root()), dstDb, nil)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ sched := NewTrieSync(srcTrie.Hash(), diskdb, nil)
queue := append([]common.Hash{}, sched.Missing(10000)...)
for len(queue) > 0 {
// Sync only half of the scheduled nodes
results := make([]SyncResult, len(queue)/2+1)
for i, hash := range queue[:len(results)] {
- data, err := srcDb.Get(hash.Bytes())
+ data, err := srcDb.Node(hash)
if err != nil {
t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
}
@@ -158,13 +167,13 @@ func TestIterativeDelayedTrieSync(t *testing.T) {
if _, index, err := sched.Process(results); err != nil {
t.Fatalf("failed to process result #%d: %v", index, err)
}
- if index, err := sched.Commit(dstDb); err != nil {
+ if index, err := sched.Commit(diskdb); err != nil {
t.Fatalf("failed to commit data #%d: %v", index, err)
}
queue = append(queue[len(results):], sched.Missing(10000)...)
}
// Cross check that the two tries are in sync
- checkTrieContents(t, dstDb, srcTrie.Root(), srcData)
+ checkTrieContents(t, triedb, srcTrie.Root(), srcData)
}
// Tests that given a root hash, a trie can sync iteratively on a single thread,
@@ -178,8 +187,9 @@ func testIterativeRandomTrieSync(t *testing.T, batch int) {
srcDb, srcTrie, srcData := makeTestTrie()
// Create a destination trie and sync with the scheduler
- dstDb, _ := ethdb.NewMemDatabase()
- sched := NewTrieSync(common.BytesToHash(srcTrie.Root()), dstDb, nil)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ sched := NewTrieSync(srcTrie.Hash(), diskdb, nil)
queue := make(map[common.Hash]struct{})
for _, hash := range sched.Missing(batch) {
@@ -189,7 +199,7 @@ func testIterativeRandomTrieSync(t *testing.T, batch int) {
// Fetch all the queued nodes in a random order
results := make([]SyncResult, 0, len(queue))
for hash := range queue {
- data, err := srcDb.Get(hash.Bytes())
+ data, err := srcDb.Node(hash)
if err != nil {
t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
}
@@ -199,7 +209,7 @@ func testIterativeRandomTrieSync(t *testing.T, batch int) {
if _, index, err := sched.Process(results); err != nil {
t.Fatalf("failed to process result #%d: %v", index, err)
}
- if index, err := sched.Commit(dstDb); err != nil {
+ if index, err := sched.Commit(diskdb); err != nil {
t.Fatalf("failed to commit data #%d: %v", index, err)
}
queue = make(map[common.Hash]struct{})
@@ -208,7 +218,7 @@ func testIterativeRandomTrieSync(t *testing.T, batch int) {
}
}
// Cross check that the two tries are in sync
- checkTrieContents(t, dstDb, srcTrie.Root(), srcData)
+ checkTrieContents(t, triedb, srcTrie.Root(), srcData)
}
// Tests that the trie scheduler can correctly reconstruct the state even if only
@@ -218,8 +228,9 @@ func TestIterativeRandomDelayedTrieSync(t *testing.T) {
srcDb, srcTrie, srcData := makeTestTrie()
// Create a destination trie and sync with the scheduler
- dstDb, _ := ethdb.NewMemDatabase()
- sched := NewTrieSync(common.BytesToHash(srcTrie.Root()), dstDb, nil)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ sched := NewTrieSync(srcTrie.Hash(), diskdb, nil)
queue := make(map[common.Hash]struct{})
for _, hash := range sched.Missing(10000) {
@@ -229,7 +240,7 @@ func TestIterativeRandomDelayedTrieSync(t *testing.T) {
// Sync only half of the scheduled nodes, even those in random order
results := make([]SyncResult, 0, len(queue)/2+1)
for hash := range queue {
- data, err := srcDb.Get(hash.Bytes())
+ data, err := srcDb.Node(hash)
if err != nil {
t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
}
@@ -243,7 +254,7 @@ func TestIterativeRandomDelayedTrieSync(t *testing.T) {
if _, index, err := sched.Process(results); err != nil {
t.Fatalf("failed to process result #%d: %v", index, err)
}
- if index, err := sched.Commit(dstDb); err != nil {
+ if index, err := sched.Commit(diskdb); err != nil {
t.Fatalf("failed to commit data #%d: %v", index, err)
}
for _, result := range results {
@@ -254,7 +265,7 @@ func TestIterativeRandomDelayedTrieSync(t *testing.T) {
}
}
// Cross check that the two tries are in sync
- checkTrieContents(t, dstDb, srcTrie.Root(), srcData)
+ checkTrieContents(t, triedb, srcTrie.Root(), srcData)
}
// Tests that a trie sync will not request nodes multiple times, even if they
@@ -264,8 +275,9 @@ func TestDuplicateAvoidanceTrieSync(t *testing.T) {
srcDb, srcTrie, srcData := makeTestTrie()
// Create a destination trie and sync with the scheduler
- dstDb, _ := ethdb.NewMemDatabase()
- sched := NewTrieSync(common.BytesToHash(srcTrie.Root()), dstDb, nil)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ sched := NewTrieSync(srcTrie.Hash(), diskdb, nil)
queue := append([]common.Hash{}, sched.Missing(0)...)
requested := make(map[common.Hash]struct{})
@@ -273,7 +285,7 @@ func TestDuplicateAvoidanceTrieSync(t *testing.T) {
for len(queue) > 0 {
results := make([]SyncResult, len(queue))
for i, hash := range queue {
- data, err := srcDb.Get(hash.Bytes())
+ data, err := srcDb.Node(hash)
if err != nil {
t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
}
@@ -287,13 +299,13 @@ func TestDuplicateAvoidanceTrieSync(t *testing.T) {
if _, index, err := sched.Process(results); err != nil {
t.Fatalf("failed to process result #%d: %v", index, err)
}
- if index, err := sched.Commit(dstDb); err != nil {
+ if index, err := sched.Commit(diskdb); err != nil {
t.Fatalf("failed to commit data #%d: %v", index, err)
}
queue = append(queue[:0], sched.Missing(0)...)
}
// Cross check that the two tries are in sync
- checkTrieContents(t, dstDb, srcTrie.Root(), srcData)
+ checkTrieContents(t, triedb, srcTrie.Root(), srcData)
}
// Tests that at any point in time during a sync, only complete sub-tries are in
@@ -303,8 +315,9 @@ func TestIncompleteTrieSync(t *testing.T) {
srcDb, srcTrie, _ := makeTestTrie()
// Create a destination trie and sync with the scheduler
- dstDb, _ := ethdb.NewMemDatabase()
- sched := NewTrieSync(common.BytesToHash(srcTrie.Root()), dstDb, nil)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+ sched := NewTrieSync(srcTrie.Hash(), diskdb, nil)
added := []common.Hash{}
queue := append([]common.Hash{}, sched.Missing(1)...)
@@ -312,7 +325,7 @@ func TestIncompleteTrieSync(t *testing.T) {
// Fetch a batch of trie nodes
results := make([]SyncResult, len(queue))
for i, hash := range queue {
- data, err := srcDb.Get(hash.Bytes())
+ data, err := srcDb.Node(hash)
if err != nil {
t.Fatalf("failed to retrieve node data for %x: %v", hash, err)
}
@@ -322,7 +335,7 @@ func TestIncompleteTrieSync(t *testing.T) {
if _, index, err := sched.Process(results); err != nil {
t.Fatalf("failed to process result #%d: %v", index, err)
}
- if index, err := sched.Commit(dstDb); err != nil {
+ if index, err := sched.Commit(diskdb); err != nil {
t.Fatalf("failed to commit data #%d: %v", index, err)
}
for _, result := range results {
@@ -330,7 +343,7 @@ func TestIncompleteTrieSync(t *testing.T) {
}
// Check that all known sub-tries in the synced trie are complete
for _, root := range added {
- if err := checkTrieConsistency(dstDb, root); err != nil {
+ if err := checkTrieConsistency(triedb, root); err != nil {
t.Fatalf("trie inconsistent: %v", err)
}
}
@@ -340,12 +353,12 @@ func TestIncompleteTrieSync(t *testing.T) {
// Sanity check that removing any node from the database is detected
for _, node := range added[1:] {
key := node.Bytes()
- value, _ := dstDb.Get(key)
+ value, _ := diskdb.Get(key)
- dstDb.Delete(key)
- if err := checkTrieConsistency(dstDb, added[0]); err == nil {
+ diskdb.Delete(key)
+ if err := checkTrieConsistency(triedb, added[0]); err == nil {
t.Fatalf("trie inconsistency not caught, missing: %x", key)
}
- dstDb.Put(key, value)
+ diskdb.Put(key, value)
}
}
diff --git a/trie/trie.go b/trie/trie.go
index c211e7554..e37a1ae10 100644
--- a/trie/trie.go
+++ b/trie/trie.go
@@ -22,16 +22,17 @@ import (
"fmt"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/crypto/sha3"
+ "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/rcrowley/go-metrics"
)
var (
- // This is the known root hash of an empty trie.
+ // emptyRoot is the known root hash of an empty trie.
emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
- // This is the known hash of an empty state trie entry.
- emptyState common.Hash
+
+ // emptyState is the known hash of an empty state trie entry.
+ emptyState = crypto.Keccak256Hash(nil)
)
var (
@@ -53,29 +54,10 @@ func CacheUnloads() int64 {
return cacheUnloadCounter.Count()
}
-func init() {
- sha3.NewKeccak256().Sum(emptyState[:0])
-}
-
-// Database must be implemented by backing stores for the trie.
-type Database interface {
- DatabaseReader
- DatabaseWriter
-}
-
-// DatabaseReader wraps the Get method of a backing store for the trie.
-type DatabaseReader interface {
- Get(key []byte) (value []byte, err error)
- Has(key []byte) (bool, error)
-}
-
-// DatabaseWriter wraps the Put method of a backing store for the trie.
-type DatabaseWriter interface {
- // Put stores the mapping key->value in the database.
- // Implementations must not hold onto the value bytes, the trie
- // will reuse the slice across calls to Put.
- Put(key, value []byte) error
-}
+// LeafCallback is a callback type invoked when a trie operation reaches a leaf
+// node. It's used by state sync and commit to allow handling external references
+// between account and storage tries.
+type LeafCallback func(leaf []byte, parent common.Hash) error
// Trie is a Merkle Patricia Trie.
// The zero value is an empty trie with no database.
@@ -83,8 +65,8 @@ type DatabaseWriter interface {
//
// Trie is not safe for concurrent use.
type Trie struct {
+ db *Database
root node
- db Database
originalRoot common.Hash
// Cache generation values.
@@ -111,12 +93,15 @@ func (t *Trie) newFlag() nodeFlag {
// trie is initially empty and does not require a database. Otherwise,
// New will panic if db is nil and returns a MissingNodeError if root does
// not exist in the database. Accessing the trie loads nodes from db on demand.
-func New(root common.Hash, db Database) (*Trie, error) {
- trie := &Trie{db: db, originalRoot: root}
+func New(root common.Hash, db *Database) (*Trie, error) {
+ if db == nil {
+ panic("trie.New called without a database")
+ }
+ trie := &Trie{
+ db: db,
+ originalRoot: root,
+ }
if (root != common.Hash{}) && root != emptyRoot {
- if db == nil {
- panic("trie.New: cannot use existing root without a database")
- }
rootnode, err := trie.resolveHash(root[:], nil)
if err != nil {
return nil, err
@@ -447,12 +432,13 @@ func (t *Trie) resolve(n node, prefix []byte) (node, error) {
func (t *Trie) resolveHash(n hashNode, prefix []byte) (node, error) {
cacheMissCounter.Inc(1)
- enc, err := t.db.Get(n)
+ hash := common.BytesToHash(n)
+
+ enc, err := t.db.Node(hash)
if err != nil || enc == nil {
- return nil, &MissingNodeError{NodeHash: common.BytesToHash(n), Path: prefix}
+ return nil, &MissingNodeError{NodeHash: hash, Path: prefix}
}
- dec := mustDecodeNode(n, enc, t.cachegen)
- return dec, nil
+ return mustDecodeNode(n, enc, t.cachegen), nil
}
// Root returns the root hash of the trie.
@@ -462,44 +448,31 @@ func (t *Trie) Root() []byte { return t.Hash().Bytes() }
// Hash returns the root hash of the trie. It does not write to the
// database and can be used even if the trie doesn't have one.
func (t *Trie) Hash() common.Hash {
- hash, cached, _ := t.hashRoot(nil)
+ hash, cached, _ := t.hashRoot(nil, nil)
t.root = cached
return common.BytesToHash(hash.(hashNode))
}
-// Commit writes all nodes to the trie's database.
-// Nodes are stored with their sha3 hash as the key.
-//
-// Committing flushes nodes from memory.
-// Subsequent Get calls will load nodes from the database.
-func (t *Trie) Commit() (root common.Hash, err error) {
+// Commit writes all nodes to the trie's memory database, tracking the internal
+// and external (for account tries) references.
+func (t *Trie) Commit(onleaf LeafCallback) (root common.Hash, err error) {
if t.db == nil {
- panic("Commit called on trie with nil database")
+ panic("commit called on trie with nil database")
}
- return t.CommitTo(t.db)
-}
-
-// CommitTo writes all nodes to the given database.
-// Nodes are stored with their sha3 hash as the key.
-//
-// Committing flushes nodes from memory. Subsequent Get calls will
-// load nodes from the trie's database. Calling code must ensure that
-// the changes made to db are written back to the trie's attached
-// database before using the trie.
-func (t *Trie) CommitTo(db DatabaseWriter) (root common.Hash, err error) {
- hash, cached, err := t.hashRoot(db)
+ hash, cached, err := t.hashRoot(t.db, onleaf)
if err != nil {
- return (common.Hash{}), err
+ return common.Hash{}, err
}
t.root = cached
t.cachegen++
return common.BytesToHash(hash.(hashNode)), nil
}
-func (t *Trie) hashRoot(db DatabaseWriter) (node, node, error) {
+func (t *Trie) hashRoot(db *Database, onleaf LeafCallback) (node, node, error) {
if t.root == nil {
return hashNode(emptyRoot.Bytes()), nil, nil
}
- h := newHasher(t.cachegen, t.cachelimit)
+ h := newHasher(t.cachegen, t.cachelimit, onleaf)
+ defer returnHasherToPool(h)
return h.hash(t.root, db, true)
}
diff --git a/trie/trie_test.go b/trie/trie_test.go
index 1e28c3bc4..997222628 100644
--- a/trie/trie_test.go
+++ b/trie/trie_test.go
@@ -43,8 +43,8 @@ func init() {
// Used for testing
func newEmpty() *Trie {
- db, _ := ethdb.NewMemDatabase()
- trie, _ := New(common.Hash{}, db)
+ diskdb, _ := ethdb.NewMemDatabase()
+ trie, _ := New(common.Hash{}, NewDatabase(diskdb))
return trie
}
@@ -68,8 +68,8 @@ func TestNull(t *testing.T) {
}
func TestMissingRoot(t *testing.T) {
- db, _ := ethdb.NewMemDatabase()
- trie, err := New(common.HexToHash("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), db)
+ diskdb, _ := ethdb.NewMemDatabase()
+ trie, err := New(common.HexToHash("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), NewDatabase(diskdb))
if trie != nil {
t.Error("New returned non-nil trie for invalid root")
}
@@ -78,70 +78,75 @@ func TestMissingRoot(t *testing.T) {
}
}
-func TestMissingNode(t *testing.T) {
- db, _ := ethdb.NewMemDatabase()
- trie, _ := New(common.Hash{}, db)
+func TestMissingNodeDisk(t *testing.T) { testMissingNode(t, false) }
+func TestMissingNodeMemonly(t *testing.T) { testMissingNode(t, true) }
+
+func testMissingNode(t *testing.T, memonly bool) {
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+
+ trie, _ := New(common.Hash{}, triedb)
updateString(trie, "120000", "qwerqwerqwerqwerqwerqwerqwerqwer")
updateString(trie, "123456", "asdfasdfasdfasdfasdfasdfasdfasdf")
- root, _ := trie.Commit()
+ root, _ := trie.Commit(nil)
+ if !memonly {
+ triedb.Commit(root, true)
+ }
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
_, err := trie.TryGet([]byte("120000"))
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
_, err = trie.TryGet([]byte("120099"))
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
_, err = trie.TryGet([]byte("123456"))
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
err = trie.TryUpdate([]byte("120099"), []byte("zxcvzxcvzxcvzxcvzxcvzxcvzxcvzxcv"))
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
err = trie.TryDelete([]byte("123456"))
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
- db.Delete(common.FromHex("e1d943cc8f061a0c0b98162830b970395ac9315654824bf21b73b891365262f9"))
+ hash := common.HexToHash("0xe1d943cc8f061a0c0b98162830b970395ac9315654824bf21b73b891365262f9")
+ if memonly {
+ delete(triedb.nodes, hash)
+ } else {
+ diskdb.Delete(hash[:])
+ }
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
_, err = trie.TryGet([]byte("120000"))
if _, ok := err.(*MissingNodeError); !ok {
t.Errorf("Wrong error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
_, err = trie.TryGet([]byte("120099"))
if _, ok := err.(*MissingNodeError); !ok {
t.Errorf("Wrong error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
_, err = trie.TryGet([]byte("123456"))
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
err = trie.TryUpdate([]byte("120099"), []byte("zxcv"))
if _, ok := err.(*MissingNodeError); !ok {
t.Errorf("Wrong error: %v", err)
}
-
- trie, _ = New(root, db)
+ trie, _ = New(root, triedb)
err = trie.TryDelete([]byte("123456"))
if _, ok := err.(*MissingNodeError); !ok {
t.Errorf("Wrong error: %v", err)
@@ -165,7 +170,7 @@ func TestInsert(t *testing.T) {
updateString(trie, "A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
exp = common.HexToHash("d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab")
- root, err := trie.Commit()
+ root, err := trie.Commit(nil)
if err != nil {
t.Fatalf("commit error: %v", err)
}
@@ -194,7 +199,7 @@ func TestGet(t *testing.T) {
if i == 1 {
return
}
- trie.Commit()
+ trie.Commit(nil)
}
}
@@ -263,7 +268,7 @@ func TestReplication(t *testing.T) {
for _, val := range vals {
updateString(trie, val.k, val.v)
}
- exp, err := trie.Commit()
+ exp, err := trie.Commit(nil)
if err != nil {
t.Fatalf("commit error: %v", err)
}
@@ -278,7 +283,7 @@ func TestReplication(t *testing.T) {
t.Errorf("trie2 doesn't have %q => %q", kv.k, kv.v)
}
}
- hash, err := trie2.Commit()
+ hash, err := trie2.Commit(nil)
if err != nil {
t.Fatalf("commit error: %v", err)
}
@@ -314,7 +319,7 @@ func TestLargeValue(t *testing.T) {
}
type countingDB struct {
- Database
+ ethdb.Database
gets map[string]int
}
@@ -332,19 +337,20 @@ func TestCacheUnload(t *testing.T) {
key2 := "---some other branch"
updateString(trie, key1, "this is the branch of key1.")
updateString(trie, key2, "this is the branch of key2.")
- root, _ := trie.Commit()
+
+ root, _ := trie.Commit(nil)
+ trie.db.Commit(root, true)
// Commit the trie repeatedly and access key1.
// The branch containing it is loaded from DB exactly two times:
// in the 0th and 6th iteration.
- db := &countingDB{Database: trie.db, gets: make(map[string]int)}
- trie, _ = New(root, db)
+ db := &countingDB{Database: trie.db.diskdb, gets: make(map[string]int)}
+ trie, _ = New(root, NewDatabase(db))
trie.SetCacheLimit(5)
for i := 0; i < 12; i++ {
getString(trie, key1)
- trie.Commit()
+ trie.Commit(nil)
}
-
// Check that it got loaded two times.
for dbkey, count := range db.gets {
if count != 2 {
@@ -407,8 +413,10 @@ func (randTest) Generate(r *rand.Rand, size int) reflect.Value {
}
func runRandTest(rt randTest) bool {
- db, _ := ethdb.NewMemDatabase()
- tr, _ := New(common.Hash{}, db)
+ diskdb, _ := ethdb.NewMemDatabase()
+ triedb := NewDatabase(diskdb)
+
+ tr, _ := New(common.Hash{}, triedb)
values := make(map[string]string) // tracks content of the trie
for i, step := range rt {
@@ -426,23 +434,23 @@ func runRandTest(rt randTest) bool {
rt[i].err = fmt.Errorf("mismatch for key 0x%x, got 0x%x want 0x%x", step.key, v, want)
}
case opCommit:
- _, rt[i].err = tr.Commit()
+ _, rt[i].err = tr.Commit(nil)
case opHash:
tr.Hash()
case opReset:
- hash, err := tr.Commit()
+ hash, err := tr.Commit(nil)
if err != nil {
rt[i].err = err
return false
}
- newtr, err := New(hash, db)
+ newtr, err := New(hash, triedb)
if err != nil {
rt[i].err = err
return false
}
tr = newtr
case opItercheckhash:
- checktr, _ := New(common.Hash{}, nil)
+ checktr, _ := New(common.Hash{}, triedb)
it := NewIterator(tr.NodeIterator(nil))
for it.Next() {
checktr.Update(it.Key, it.Value)
@@ -524,7 +532,7 @@ func benchGet(b *testing.B, commit bool) {
}
binary.LittleEndian.PutUint64(k, benchElemCount/2)
if commit {
- trie.Commit()
+ trie.Commit(nil)
}
b.ResetTimer()
@@ -534,7 +542,7 @@ func benchGet(b *testing.B, commit bool) {
b.StopTimer()
if commit {
- ldb := trie.db.(*ethdb.LDBDatabase)
+ ldb := trie.db.diskdb.(*ethdb.LDBDatabase)
ldb.Close()
os.RemoveAll(ldb.Path())
}
@@ -585,16 +593,16 @@ func BenchmarkHash(b *testing.B) {
trie.Hash()
}
-func tempDB() (string, Database) {
+func tempDB() (string, *Database) {
dir, err := ioutil.TempDir("", "trie-bench")
if err != nil {
panic(fmt.Sprintf("can't create temporary directory: %v", err))
}
- db, err := ethdb.NewLDBDatabase(dir, 256, 0)
+ diskdb, err := ethdb.NewLDBDatabase(dir, 256, 0)
if err != nil {
panic(fmt.Sprintf("can't create temporary database: %v", err))
}
- return dir, db
+ return dir, NewDatabase(diskdb)
}
func getString(trie *Trie, k string) []byte {
diff --git a/vendor/github.com/StackExchange/wmi/LICENSE b/vendor/github.com/StackExchange/wmi/LICENSE
new file mode 100644
index 000000000..ae80b6720
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Stack Exchange
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/StackExchange/wmi/README.md b/vendor/github.com/StackExchange/wmi/README.md
new file mode 100644
index 000000000..426d1a46b
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/README.md
@@ -0,0 +1,6 @@
+wmi
+===
+
+Package wmi provides a WQL interface to Windows WMI.
+
+Note: It interfaces with WMI on the local machine, therefore it only runs on Windows.
diff --git a/vendor/github.com/StackExchange/wmi/swbemservices.go b/vendor/github.com/StackExchange/wmi/swbemservices.go
new file mode 100644
index 000000000..9765a53f7
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/swbemservices.go
@@ -0,0 +1,260 @@
+// +build windows
+
+package wmi
+
+import (
+ "fmt"
+ "reflect"
+ "runtime"
+ "sync"
+
+ "github.com/go-ole/go-ole"
+ "github.com/go-ole/go-ole/oleutil"
+)
+
+// SWbemServices is used to access wmi. See https://msdn.microsoft.com/en-us/library/aa393719(v=vs.85).aspx
+type SWbemServices struct {
+ //TODO: track namespace. Not sure if we can re connect to a different namespace using the same instance
+ cWMIClient *Client //This could also be an embedded struct, but then we would need to branch on Client vs SWbemServices in the Query method
+ sWbemLocatorIUnknown *ole.IUnknown
+ sWbemLocatorIDispatch *ole.IDispatch
+ queries chan *queryRequest
+ closeError chan error
+ lQueryorClose sync.Mutex
+}
+
+type queryRequest struct {
+ query string
+ dst interface{}
+ args []interface{}
+ finished chan error
+}
+
+// InitializeSWbemServices will return a new SWbemServices object that can be used to query WMI
+func InitializeSWbemServices(c *Client, connectServerArgs ...interface{}) (*SWbemServices, error) {
+ //fmt.Println("InitializeSWbemServices: Starting")
+ //TODO: implement connectServerArgs as optional argument for init with connectServer call
+ s := new(SWbemServices)
+ s.cWMIClient = c
+ s.queries = make(chan *queryRequest)
+ initError := make(chan error)
+ go s.process(initError)
+
+ err, ok := <-initError
+ if ok {
+ return nil, err //Send error to caller
+ }
+ //fmt.Println("InitializeSWbemServices: Finished")
+ return s, nil
+}
+
+// Close will clear and release all of the SWbemServices resources
+func (s *SWbemServices) Close() error {
+ s.lQueryorClose.Lock()
+ if s == nil || s.sWbemLocatorIDispatch == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices is not Initialized")
+ }
+ if s.queries == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices has been closed")
+ }
+ //fmt.Println("Close: sending close request")
+ var result error
+ ce := make(chan error)
+ s.closeError = ce //Race condition if multiple callers to close. May need to lock here
+ close(s.queries) //Tell background to shut things down
+ s.lQueryorClose.Unlock()
+ err, ok := <-ce
+ if ok {
+ result = err
+ }
+ //fmt.Println("Close: finished")
+ return result
+}
+
+func (s *SWbemServices) process(initError chan error) {
+ //fmt.Println("process: starting background thread initialization")
+ //All OLE/WMI calls must happen on the same initialized thead, so lock this goroutine
+ runtime.LockOSThread()
+ defer runtime.LockOSThread()
+
+ err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
+ if err != nil {
+ oleCode := err.(*ole.OleError).Code()
+ if oleCode != ole.S_OK && oleCode != S_FALSE {
+ initError <- fmt.Errorf("ole.CoInitializeEx error: %v", err)
+ return
+ }
+ }
+ defer ole.CoUninitialize()
+
+ unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
+ if err != nil {
+ initError <- fmt.Errorf("CreateObject SWbemLocator error: %v", err)
+ return
+ } else if unknown == nil {
+ initError <- ErrNilCreateObject
+ return
+ }
+ defer unknown.Release()
+ s.sWbemLocatorIUnknown = unknown
+
+ dispatch, err := s.sWbemLocatorIUnknown.QueryInterface(ole.IID_IDispatch)
+ if err != nil {
+ initError <- fmt.Errorf("SWbemLocator QueryInterface error: %v", err)
+ return
+ }
+ defer dispatch.Release()
+ s.sWbemLocatorIDispatch = dispatch
+
+ // we can't do the ConnectServer call outside the loop unless we find a way to track and re-init the connectServerArgs
+ //fmt.Println("process: initialized. closing initError")
+ close(initError)
+ //fmt.Println("process: waiting for queries")
+ for q := range s.queries {
+ //fmt.Printf("process: new query: len(query)=%d\n", len(q.query))
+ errQuery := s.queryBackground(q)
+ //fmt.Println("process: s.queryBackground finished")
+ if errQuery != nil {
+ q.finished <- errQuery
+ }
+ close(q.finished)
+ }
+ //fmt.Println("process: queries channel closed")
+ s.queries = nil //set channel to nil so we know it is closed
+ //TODO: I think the Release/Clear calls can panic if things are in a bad state.
+ //TODO: May need to recover from panics and send error to method caller instead.
+ close(s.closeError)
+}
+
+// Query runs the WQL query using a SWbemServices instance and appends the values to dst.
+//
+// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in
+// the query must have the same name in dst. Supported types are all signed and
+// unsigned integers, time.Time, string, bool, or a pointer to one of those.
+// Array types are not supported.
+//
+// By default, the local machine and default namespace are used. These can be
+// changed using connectServerArgs. See
+// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.
+func (s *SWbemServices) Query(query string, dst interface{}, connectServerArgs ...interface{}) error {
+ s.lQueryorClose.Lock()
+ if s == nil || s.sWbemLocatorIDispatch == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices is not Initialized")
+ }
+ if s.queries == nil {
+ s.lQueryorClose.Unlock()
+ return fmt.Errorf("SWbemServices has been closed")
+ }
+
+ //fmt.Println("Query: Sending query request")
+ qr := queryRequest{
+ query: query,
+ dst: dst,
+ args: connectServerArgs,
+ finished: make(chan error),
+ }
+ s.queries <- &qr
+ s.lQueryorClose.Unlock()
+ err, ok := <-qr.finished
+ if ok {
+ //fmt.Println("Query: Finished with error")
+ return err //Send error to caller
+ }
+ //fmt.Println("Query: Finished")
+ return nil
+}
+
+func (s *SWbemServices) queryBackground(q *queryRequest) error {
+ if s == nil || s.sWbemLocatorIDispatch == nil {
+ return fmt.Errorf("SWbemServices is not Initialized")
+ }
+ wmi := s.sWbemLocatorIDispatch //Should just rename in the code, but this will help as we break things apart
+ //fmt.Println("queryBackground: Starting")
+
+ dv := reflect.ValueOf(q.dst)
+ if dv.Kind() != reflect.Ptr || dv.IsNil() {
+ return ErrInvalidEntityType
+ }
+ dv = dv.Elem()
+ mat, elemType := checkMultiArg(dv)
+ if mat == multiArgTypeInvalid {
+ return ErrInvalidEntityType
+ }
+
+ // service is a SWbemServices
+ serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", q.args...)
+ if err != nil {
+ return err
+ }
+ service := serviceRaw.ToIDispatch()
+ defer serviceRaw.Clear()
+
+ // result is a SWBemObjectSet
+ resultRaw, err := oleutil.CallMethod(service, "ExecQuery", q.query)
+ if err != nil {
+ return err
+ }
+ result := resultRaw.ToIDispatch()
+ defer resultRaw.Clear()
+
+ count, err := oleInt64(result, "Count")
+ if err != nil {
+ return err
+ }
+
+ enumProperty, err := result.GetProperty("_NewEnum")
+ if err != nil {
+ return err
+ }
+ defer enumProperty.Clear()
+
+ enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)
+ if err != nil {
+ return err
+ }
+ if enum == nil {
+ return fmt.Errorf("can't get IEnumVARIANT, enum is nil")
+ }
+ defer enum.Release()
+
+ // Initialize a slice with Count capacity
+ dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count)))
+
+ var errFieldMismatch error
+ for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) {
+ if err != nil {
+ return err
+ }
+
+ err := func() error {
+ // item is a SWbemObject, but really a Win32_Process
+ item := itemRaw.ToIDispatch()
+ defer item.Release()
+
+ ev := reflect.New(elemType)
+ if err = s.cWMIClient.loadEntity(ev.Interface(), item); err != nil {
+ if _, ok := err.(*ErrFieldMismatch); ok {
+ // We continue loading entities even in the face of field mismatch errors.
+ // If we encounter any other error, that other error is returned. Otherwise,
+ // an ErrFieldMismatch is returned.
+ errFieldMismatch = err
+ } else {
+ return err
+ }
+ }
+ if mat != multiArgTypeStructPtr {
+ ev = ev.Elem()
+ }
+ dv.Set(reflect.Append(dv, ev))
+ return nil
+ }()
+ if err != nil {
+ return err
+ }
+ }
+ //fmt.Println("queryBackground: Finished")
+ return errFieldMismatch
+}
diff --git a/vendor/github.com/StackExchange/wmi/wmi.go b/vendor/github.com/StackExchange/wmi/wmi.go
new file mode 100644
index 000000000..a951b1258
--- /dev/null
+++ b/vendor/github.com/StackExchange/wmi/wmi.go
@@ -0,0 +1,486 @@
+// +build windows
+
+/*
+Package wmi provides a WQL interface for WMI on Windows.
+
+Example code to print names of running processes:
+
+ type Win32_Process struct {
+ Name string
+ }
+
+ func main() {
+ var dst []Win32_Process
+ q := wmi.CreateQuery(&dst, "")
+ err := wmi.Query(q, &dst)
+ if err != nil {
+ log.Fatal(err)
+ }
+ for i, v := range dst {
+ println(i, v.Name)
+ }
+ }
+
+*/
+package wmi
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "log"
+ "os"
+ "reflect"
+ "runtime"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/go-ole/go-ole"
+ "github.com/go-ole/go-ole/oleutil"
+)
+
+var l = log.New(os.Stdout, "", log.LstdFlags)
+
+var (
+ ErrInvalidEntityType = errors.New("wmi: invalid entity type")
+ // ErrNilCreateObject is the error returned if CreateObject returns nil even
+ // if the error was nil.
+ ErrNilCreateObject = errors.New("wmi: create object returned nil")
+ lock sync.Mutex
+)
+
+// S_FALSE is returned by CoInitializeEx if it was already called on this thread.
+const S_FALSE = 0x00000001
+
+// QueryNamespace invokes Query with the given namespace on the local machine.
+func QueryNamespace(query string, dst interface{}, namespace string) error {
+ return Query(query, dst, nil, namespace)
+}
+
+// Query runs the WQL query and appends the values to dst.
+//
+// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in
+// the query must have the same name in dst. Supported types are all signed and
+// unsigned integers, time.Time, string, bool, or a pointer to one of those.
+// Array types are not supported.
+//
+// By default, the local machine and default namespace are used. These can be
+// changed using connectServerArgs. See
+// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.
+//
+// Query is a wrapper around DefaultClient.Query.
+func Query(query string, dst interface{}, connectServerArgs ...interface{}) error {
+ if DefaultClient.SWbemServicesClient == nil {
+ return DefaultClient.Query(query, dst, connectServerArgs...)
+ }
+ return DefaultClient.SWbemServicesClient.Query(query, dst, connectServerArgs...)
+}
+
+// A Client is an WMI query client.
+//
+// Its zero value (DefaultClient) is a usable client.
+type Client struct {
+ // NonePtrZero specifies if nil values for fields which aren't pointers
+ // should be returned as the field types zero value.
+ //
+ // Setting this to true allows stucts without pointer fields to be used
+ // without the risk failure should a nil value returned from WMI.
+ NonePtrZero bool
+
+ // PtrNil specifies if nil values for pointer fields should be returned
+ // as nil.
+ //
+ // Setting this to true will set pointer fields to nil where WMI
+ // returned nil, otherwise the types zero value will be returned.
+ PtrNil bool
+
+ // AllowMissingFields specifies that struct fields not present in the
+ // query result should not result in an error.
+ //
+ // Setting this to true allows custom queries to be used with full
+ // struct definitions instead of having to define multiple structs.
+ AllowMissingFields bool
+
+ // SWbemServiceClient is an optional SWbemServices object that can be
+ // initialized and then reused across multiple queries. If it is null
+ // then the method will initialize a new temporary client each time.
+ SWbemServicesClient *SWbemServices
+}
+
+// DefaultClient is the default Client and is used by Query, QueryNamespace
+var DefaultClient = &Client{}
+
+// Query runs the WQL query and appends the values to dst.
+//
+// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in
+// the query must have the same name in dst. Supported types are all signed and
+// unsigned integers, time.Time, string, bool, or a pointer to one of those.
+// Array types are not supported.
+//
+// By default, the local machine and default namespace are used. These can be
+// changed using connectServerArgs. See
+// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.
+func (c *Client) Query(query string, dst interface{}, connectServerArgs ...interface{}) error {
+ dv := reflect.ValueOf(dst)
+ if dv.Kind() != reflect.Ptr || dv.IsNil() {
+ return ErrInvalidEntityType
+ }
+ dv = dv.Elem()
+ mat, elemType := checkMultiArg(dv)
+ if mat == multiArgTypeInvalid {
+ return ErrInvalidEntityType
+ }
+
+ lock.Lock()
+ defer lock.Unlock()
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
+ if err != nil {
+ oleCode := err.(*ole.OleError).Code()
+ if oleCode != ole.S_OK && oleCode != S_FALSE {
+ return err
+ }
+ }
+ defer ole.CoUninitialize()
+
+ unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
+ if err != nil {
+ return err
+ } else if unknown == nil {
+ return ErrNilCreateObject
+ }
+ defer unknown.Release()
+
+ wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
+ if err != nil {
+ return err
+ }
+ defer wmi.Release()
+
+ // service is a SWbemServices
+ serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", connectServerArgs...)
+ if err != nil {
+ return err
+ }
+ service := serviceRaw.ToIDispatch()
+ defer serviceRaw.Clear()
+
+ // result is a SWBemObjectSet
+ resultRaw, err := oleutil.CallMethod(service, "ExecQuery", query)
+ if err != nil {
+ return err
+ }
+ result := resultRaw.ToIDispatch()
+ defer resultRaw.Clear()
+
+ count, err := oleInt64(result, "Count")
+ if err != nil {
+ return err
+ }
+
+ enumProperty, err := result.GetProperty("_NewEnum")
+ if err != nil {
+ return err
+ }
+ defer enumProperty.Clear()
+
+ enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)
+ if err != nil {
+ return err
+ }
+ if enum == nil {
+ return fmt.Errorf("can't get IEnumVARIANT, enum is nil")
+ }
+ defer enum.Release()
+
+ // Initialize a slice with Count capacity
+ dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count)))
+
+ var errFieldMismatch error
+ for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) {
+ if err != nil {
+ return err
+ }
+
+ err := func() error {
+ // item is a SWbemObject, but really a Win32_Process
+ item := itemRaw.ToIDispatch()
+ defer item.Release()
+
+ ev := reflect.New(elemType)
+ if err = c.loadEntity(ev.Interface(), item); err != nil {
+ if _, ok := err.(*ErrFieldMismatch); ok {
+ // We continue loading entities even in the face of field mismatch errors.
+ // If we encounter any other error, that other error is returned. Otherwise,
+ // an ErrFieldMismatch is returned.
+ errFieldMismatch = err
+ } else {
+ return err
+ }
+ }
+ if mat != multiArgTypeStructPtr {
+ ev = ev.Elem()
+ }
+ dv.Set(reflect.Append(dv, ev))
+ return nil
+ }()
+ if err != nil {
+ return err
+ }
+ }
+ return errFieldMismatch
+}
+
+// ErrFieldMismatch is returned when a field is to be loaded into a different
+// type than the one it was stored from, or when a field is missing or
+// unexported in the destination struct.
+// StructType is the type of the struct pointed to by the destination argument.
+type ErrFieldMismatch struct {
+ StructType reflect.Type
+ FieldName string
+ Reason string
+}
+
+func (e *ErrFieldMismatch) Error() string {
+ return fmt.Sprintf("wmi: cannot load field %q into a %q: %s",
+ e.FieldName, e.StructType, e.Reason)
+}
+
+var timeType = reflect.TypeOf(time.Time{})
+
+// loadEntity loads a SWbemObject into a struct pointer.
+func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismatch error) {
+ v := reflect.ValueOf(dst).Elem()
+ for i := 0; i < v.NumField(); i++ {
+ f := v.Field(i)
+ of := f
+ isPtr := f.Kind() == reflect.Ptr
+ if isPtr {
+ ptr := reflect.New(f.Type().Elem())
+ f.Set(ptr)
+ f = f.Elem()
+ }
+ n := v.Type().Field(i).Name
+ if !f.CanSet() {
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "CanSet() is false",
+ }
+ }
+ prop, err := oleutil.GetProperty(src, n)
+ if err != nil {
+ if !c.AllowMissingFields {
+ errFieldMismatch = &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "no such struct field",
+ }
+ }
+ continue
+ }
+ defer prop.Clear()
+
+ switch val := prop.Value().(type) {
+ case int8, int16, int32, int64, int:
+ v := reflect.ValueOf(val).Int()
+ switch f.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ f.SetInt(v)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ f.SetUint(uint64(v))
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not an integer class",
+ }
+ }
+ case uint8, uint16, uint32, uint64:
+ v := reflect.ValueOf(val).Uint()
+ switch f.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ f.SetInt(int64(v))
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ f.SetUint(v)
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not an integer class",
+ }
+ }
+ case string:
+ switch f.Kind() {
+ case reflect.String:
+ f.SetString(val)
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ iv, err := strconv.ParseInt(val, 10, 64)
+ if err != nil {
+ return err
+ }
+ f.SetInt(iv)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ uv, err := strconv.ParseUint(val, 10, 64)
+ if err != nil {
+ return err
+ }
+ f.SetUint(uv)
+ case reflect.Struct:
+ switch f.Type() {
+ case timeType:
+ if len(val) == 25 {
+ mins, err := strconv.Atoi(val[22:])
+ if err != nil {
+ return err
+ }
+ val = val[:22] + fmt.Sprintf("%02d%02d", mins/60, mins%60)
+ }
+ t, err := time.Parse("20060102150405.000000-0700", val)
+ if err != nil {
+ return err
+ }
+ f.Set(reflect.ValueOf(t))
+ }
+ }
+ case bool:
+ switch f.Kind() {
+ case reflect.Bool:
+ f.SetBool(val)
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not a bool",
+ }
+ }
+ case float32:
+ switch f.Kind() {
+ case reflect.Float32:
+ f.SetFloat(float64(val))
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: "not a Float32",
+ }
+ }
+ default:
+ if f.Kind() == reflect.Slice {
+ switch f.Type().Elem().Kind() {
+ case reflect.String:
+ safeArray := prop.ToArray()
+ if safeArray != nil {
+ arr := safeArray.ToValueArray()
+ fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr))
+ for i, v := range arr {
+ s := fArr.Index(i)
+ s.SetString(v.(string))
+ }
+ f.Set(fArr)
+ }
+ case reflect.Uint8:
+ safeArray := prop.ToArray()
+ if safeArray != nil {
+ arr := safeArray.ToValueArray()
+ fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr))
+ for i, v := range arr {
+ s := fArr.Index(i)
+ s.SetUint(reflect.ValueOf(v).Uint())
+ }
+ f.Set(fArr)
+ }
+ default:
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: fmt.Sprintf("unsupported slice type (%T)", val),
+ }
+ }
+ } else {
+ typeof := reflect.TypeOf(val)
+ if typeof == nil && (isPtr || c.NonePtrZero) {
+ if (isPtr && c.PtrNil) || (!isPtr && c.NonePtrZero) {
+ of.Set(reflect.Zero(of.Type()))
+ }
+ break
+ }
+ return &ErrFieldMismatch{
+ StructType: of.Type(),
+ FieldName: n,
+ Reason: fmt.Sprintf("unsupported type (%T)", val),
+ }
+ }
+ }
+ }
+ return errFieldMismatch
+}
+
+type multiArgType int
+
+const (
+ multiArgTypeInvalid multiArgType = iota
+ multiArgTypeStruct
+ multiArgTypeStructPtr
+)
+
+// checkMultiArg checks that v has type []S, []*S for some struct type S.
+//
+// It returns what category the slice's elements are, and the reflect.Type
+// that represents S.
+func checkMultiArg(v reflect.Value) (m multiArgType, elemType reflect.Type) {
+ if v.Kind() != reflect.Slice {
+ return multiArgTypeInvalid, nil
+ }
+ elemType = v.Type().Elem()
+ switch elemType.Kind() {
+ case reflect.Struct:
+ return multiArgTypeStruct, elemType
+ case reflect.Ptr:
+ elemType = elemType.Elem()
+ if elemType.Kind() == reflect.Struct {
+ return multiArgTypeStructPtr, elemType
+ }
+ }
+ return multiArgTypeInvalid, nil
+}
+
+func oleInt64(item *ole.IDispatch, prop string) (int64, error) {
+ v, err := oleutil.GetProperty(item, prop)
+ if err != nil {
+ return 0, err
+ }
+ defer v.Clear()
+
+ i := int64(v.Val)
+ return i, nil
+}
+
+// CreateQuery returns a WQL query string that queries all columns of src. where
+// is an optional string that is appended to the query, to be used with WHERE
+// clauses. In such a case, the "WHERE" string should appear at the beginning.
+func CreateQuery(src interface{}, where string) string {
+ var b bytes.Buffer
+ b.WriteString("SELECT ")
+ s := reflect.Indirect(reflect.ValueOf(src))
+ t := s.Type()
+ if s.Kind() == reflect.Slice {
+ t = t.Elem()
+ }
+ if t.Kind() != reflect.Struct {
+ return ""
+ }
+ var fields []string
+ for i := 0; i < t.NumField(); i++ {
+ fields = append(fields, t.Field(i).Name)
+ }
+ b.WriteString(strings.Join(fields, ", "))
+ b.WriteString(" FROM ")
+ b.WriteString(t.Name())
+ b.WriteString(" " + where)
+ return b.String()
+}
diff --git a/vendor/github.com/elastic/gosigar/CHANGELOG.md b/vendor/github.com/elastic/gosigar/CHANGELOG.md
new file mode 100644
index 000000000..12695e10e
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/CHANGELOG.md
@@ -0,0 +1,102 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+## [Unreleased]
+
+### Added
+
+### Fixed
+
+### Changed
+
+### Deprecated
+
+## [0.8.0]
+
+### Added
+- Added partial `getrusage` support for Windows to retrieve system CPU time and user CPU time. #95
+- Added full `getrusage` support for Unix. #95
+
+## [0.7.0]
+
+### Added
+- Added method stubs for process handling for operating system that are not supported
+ by gosigar. All methods return `ErrNotImplemented` on such systems. #88
+
+### Fixed
+- Fix freebsd build by using the common version of Get(pid). #91
+
+### Changed
+- Fixed issues in cgroup package by adding missing error checks and closing
+ file handles. #92
+
+## [0.6.0]
+
+### Added
+- Added method stubs to enable compilation for operating systems that are not
+ supported by gosigar. All methods return `ErrNotImplemented` on these unsupported
+ operating systems. #83
+- FreeBSD returns `ErrNotImplemented` for `ProcTime.Get`. #83
+
+### Changed
+- OpenBSD returns `ErrNotImplemented` for `ProcTime.Get` instead of `nil`. #83
+- Fixed incorrect `Mem.Used` calculation under linux. #82
+- Fixed `ProcState` on Linux and FreeBSD when process names contain parentheses. #81
+
+### Removed
+- Remove NetBSD build from sigar_unix.go as it is not supported by gosigar. #83
+
+## [0.5.0]
+
+### Changed
+- Fixed Trim environment variables when comparing values in the test suite. #79
+- Make `kern_procargs` more robust under darwin when we cannot retrieve
+ all the information about a process. #78
+
+## [0.4.0]
+
+### Changed
+- Fixed Windows issue that caused a hang during `init()` if WMI wasn't ready. #74
+
+## [0.3.0]
+
+### Added
+- Read `MemAvailable` value for kernel 3.14+ #71
+
+## [0.2.0]
+
+### Added
+- Added `ErrCgroupsMissing` to indicate that /proc/cgroups is missing which is
+ an indicator that cgroups were disabled at compile time. #64
+
+### Changed
+- Changed `cgroup.SupportedSubsystems()` to honor the "enabled" column in the
+ /proc/cgroups file. #64
+
+## [0.1.0]
+
+### Added
+- Added `CpuList` implementation for Windows that returns CPU timing information
+ on a per CPU basis. #55
+- Added `Uptime` implementation for Windows. #55
+- Added `Swap` implementation for Windows based on page file metrics. #55
+- Added support to `github.com/gosigar/sys/windows` for querying and enabling
+ privileges in a process token.
+- Added utility code for interfacing with linux NETLINK_INET_DIAG. #60
+- Added `ProcEnv` for getting a process's environment variables. #61
+
+### Changed
+- Changed several `OpenProcess` calls on Windows to request the lowest possible
+ access privileges. #50
+- Removed cgo usage from Windows code.
+- Added OS version checks to `ProcArgs.Get` on Windows because the
+ `Win32_Process` WMI query is not available prior to Windows vista. On XP and
+ Windows 2003, this method returns `ErrNotImplemented`. #55
+
+### Fixed
+- Fixed value of `Mem.ActualFree` and `Mem.ActualUsed` on Windows. #49
+- Fixed `ProcTime.StartTime` on Windows to report value in milliseconds since
+ Unix epoch. #51
+- Fixed `ProcStatus.PPID` value is wrong on Windows. #55
+- Fixed `ProcStatus.Username` error on Windows XP #56
diff --git a/vendor/github.com/elastic/gosigar/LICENSE b/vendor/github.com/elastic/gosigar/LICENSE
new file mode 100644
index 000000000..11069edd7
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/vendor/github.com/elastic/gosigar/NOTICE b/vendor/github.com/elastic/gosigar/NOTICE
new file mode 100644
index 000000000..fda553b5c
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/NOTICE
@@ -0,0 +1,9 @@
+Copyright (c) [2009-2011] VMware, Inc. All Rights Reserved.
+
+This product is licensed to you under the Apache License, Version 2.0 (the "License").
+You may not use this product except in compliance with the License.
+
+This product includes a number of subcomponents with
+separate copyright notices and license terms. Your use of these
+subcomponents is subject to the terms and conditions of the
+subcomponent's license, as noted in the LICENSE file. \ No newline at end of file
diff --git a/vendor/github.com/elastic/gosigar/README.md b/vendor/github.com/elastic/gosigar/README.md
new file mode 100644
index 000000000..2482620a8
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/README.md
@@ -0,0 +1,57 @@
+# Go sigar [![Build Status](https://travis-ci.org/elastic/gosigar.svg?branch=master)](https://travis-ci.org/elastic/gosigar) [![Build status](https://ci.appveyor.com/api/projects/status/4yh6sa7u97ek5uib/branch/master?svg=true)](https://ci.appveyor.com/project/elastic-beats/gosigar/branch/master)
+
+
+## Overview
+
+Go sigar is a golang implementation of the
+[sigar API](https://github.com/hyperic/sigar). The Go version of
+sigar has a very similar interface, but is being written from scratch
+in pure go/cgo, rather than cgo bindings for libsigar.
+
+## Test drive
+
+ $ go get github.com/elastic/gosigar
+ $ cd $GOPATH/src/github.com/elastic/gosigar/examples/ps
+ $ go build
+ $ ./ps
+
+## Supported platforms
+
+The features vary by operating system.
+
+| Feature | Linux | Darwin | Windows | OpenBSD | FreeBSD |
+|-----------------|:-----:|:------:|:-------:|:-------:|:-------:|
+| Cpu | X | X | X | X | X |
+| CpuList | X | X | | X | X |
+| FDUsage | X | | | | X |
+| FileSystemList | X | X | X | X | X |
+| FileSystemUsage | X | X | X | X | X |
+| LoadAverage | X | X | | X | X |
+| Mem | X | X | X | X | X |
+| ProcArgs | X | X | X | | X |
+| ProcEnv | X | X | | | X |
+| ProcExe | X | X | | | X |
+| ProcFDUsage | X | | | | X |
+| ProcList | X | X | X | | X |
+| ProcMem | X | X | X | | X |
+| ProcState | X | X | X | | X |
+| ProcTime | X | X | X | | X |
+| Swap | X | X | | X | X |
+| Uptime | X | X | | X | X |
+
+## OS Specific Notes
+
+### FreeBSD
+
+Mount both `linprocfs` and `procfs` for compatability. Consider adding these
+mounts to your `/etc/fstab` file so they are mounted automatically at boot.
+
+```
+sudo mount -t procfs proc /proc
+sudo mkdir -p /compat/linux/proc
+sudo mount -t linprocfs /dev/null /compat/linux/proc
+```
+
+## License
+
+Apache 2.0
diff --git a/vendor/github.com/elastic/gosigar/Vagrantfile b/vendor/github.com/elastic/gosigar/Vagrantfile
new file mode 100644
index 000000000..6fd990c14
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/Vagrantfile
@@ -0,0 +1,25 @@
+# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
+VAGRANTFILE_API_VERSION = "2"
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+ config.vm.box = "hashicorp/precise64"
+ config.vm.provision "shell", inline: "mkdir -p /home/vagrant/go"
+ config.vm.synced_folder ".", "/home/vagrant/go/src/github.com/cloudfoundry/gosigar"
+ config.vm.provision "shell", inline: "chown -R vagrant:vagrant /home/vagrant/go"
+ install_go = <<-BASH
+ set -e
+
+if [ ! -d "/usr/local/go" ]; then
+ cd /tmp && wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz
+ cd /usr/local
+ tar xvzf /tmp/go1.3.3.linux-amd64.tar.gz
+ echo 'export GOPATH=/home/vagrant/go; export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin' >> /home/vagrant/.bashrc
+fi
+export GOPATH=/home/vagrant/go
+export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin
+/usr/local/go/bin/go get -u github.com/onsi/ginkgo/ginkgo
+/usr/local/go/bin/go get -u github.com/onsi/gomega;
+BASH
+ config.vm.provision "shell", inline: 'apt-get install -y git-core'
+ config.vm.provision "shell", inline: install_go
+end
diff --git a/vendor/github.com/elastic/gosigar/codecov.yml b/vendor/github.com/elastic/gosigar/codecov.yml
new file mode 100644
index 000000000..76ade0fdb
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/codecov.yml
@@ -0,0 +1,21 @@
+# Enable coverage report message for diff on commit
+coverage:
+ status:
+ project: off
+ patch:
+ default:
+ # basic
+ target: auto
+ threshold: null
+ base: auto
+ # advanced
+ branches: null
+ if_no_uploads: error
+ if_not_found: success
+ if_ci_failed: error
+ only_pulls: false
+ flags: null
+ paths: null
+
+# Disable comments on Pull Requests
+comment: false
diff --git a/vendor/github.com/elastic/gosigar/concrete_sigar.go b/vendor/github.com/elastic/gosigar/concrete_sigar.go
new file mode 100644
index 000000000..685aa6ded
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/concrete_sigar.go
@@ -0,0 +1,83 @@
+package gosigar
+
+import (
+ "time"
+)
+
+type ConcreteSigar struct{}
+
+func (c *ConcreteSigar) CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) {
+ // samplesCh is buffered to 1 value to immediately return first CPU sample
+ samplesCh := make(chan Cpu, 1)
+
+ stopCh := make(chan struct{})
+
+ go func() {
+ var cpuUsage Cpu
+
+ // Immediately provide non-delta value.
+ // samplesCh is buffered to 1 value, so it will not block.
+ cpuUsage.Get()
+ samplesCh <- cpuUsage
+
+ ticker := time.NewTicker(collectionInterval)
+
+ for {
+ select {
+ case <-ticker.C:
+ previousCpuUsage := cpuUsage
+
+ cpuUsage.Get()
+
+ select {
+ case samplesCh <- cpuUsage.Delta(previousCpuUsage):
+ default:
+ // Include default to avoid channel blocking
+ }
+
+ case <-stopCh:
+ return
+ }
+ }
+ }()
+
+ return samplesCh, stopCh
+}
+
+func (c *ConcreteSigar) GetLoadAverage() (LoadAverage, error) {
+ l := LoadAverage{}
+ err := l.Get()
+ return l, err
+}
+
+func (c *ConcreteSigar) GetMem() (Mem, error) {
+ m := Mem{}
+ err := m.Get()
+ return m, err
+}
+
+func (c *ConcreteSigar) GetSwap() (Swap, error) {
+ s := Swap{}
+ err := s.Get()
+ return s, err
+}
+
+func (c *ConcreteSigar) GetFileSystemUsage(path string) (FileSystemUsage, error) {
+ f := FileSystemUsage{}
+ err := f.Get(path)
+ return f, err
+}
+
+func (c *ConcreteSigar) GetFDUsage() (FDUsage, error) {
+ fd := FDUsage{}
+ err := fd.Get()
+ return fd, err
+}
+
+// GetRusage return the resource usage of the process
+// Possible params: 0 = RUSAGE_SELF, 1 = RUSAGE_CHILDREN, 2 = RUSAGE_THREAD
+func (c *ConcreteSigar) GetRusage(who int) (Rusage, error) {
+ r := Rusage{}
+ err := r.Get(who)
+ return r, err
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_darwin.go b/vendor/github.com/elastic/gosigar/sigar_darwin.go
new file mode 100644
index 000000000..f989f5160
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_darwin.go
@@ -0,0 +1,494 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+/*
+#include <stdlib.h>
+#include <sys/sysctl.h>
+#include <sys/mount.h>
+#include <mach/mach_init.h>
+#include <mach/mach_host.h>
+#include <mach/host_info.h>
+#include <libproc.h>
+#include <mach/processor_info.h>
+#include <mach/vm_map.h>
+*/
+import "C"
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+ "io"
+ "os/user"
+ "runtime"
+ "strconv"
+ "syscall"
+ "time"
+ "unsafe"
+)
+
+func (self *LoadAverage) Get() error {
+ avg := []C.double{0, 0, 0}
+
+ C.getloadavg(&avg[0], C.int(len(avg)))
+
+ self.One = float64(avg[0])
+ self.Five = float64(avg[1])
+ self.Fifteen = float64(avg[2])
+
+ return nil
+}
+
+func (self *Uptime) Get() error {
+ tv := syscall.Timeval32{}
+
+ if err := sysctlbyname("kern.boottime", &tv); err != nil {
+ return err
+ }
+
+ self.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds()
+
+ return nil
+}
+
+func (self *Mem) Get() error {
+ var vmstat C.vm_statistics_data_t
+
+ if err := sysctlbyname("hw.memsize", &self.Total); err != nil {
+ return err
+ }
+
+ if err := vm_info(&vmstat); err != nil {
+ return err
+ }
+
+ kern := uint64(vmstat.inactive_count) << 12
+ self.Free = uint64(vmstat.free_count) << 12
+
+ self.Used = self.Total - self.Free
+ self.ActualFree = self.Free + kern
+ self.ActualUsed = self.Used - kern
+
+ return nil
+}
+
+type xsw_usage struct {
+ Total, Avail, Used uint64
+}
+
+func (self *Swap) Get() error {
+ sw_usage := xsw_usage{}
+
+ if err := sysctlbyname("vm.swapusage", &sw_usage); err != nil {
+ return err
+ }
+
+ self.Total = sw_usage.Total
+ self.Used = sw_usage.Used
+ self.Free = sw_usage.Avail
+
+ return nil
+}
+
+func (self *Cpu) Get() error {
+ var count C.mach_msg_type_number_t = C.HOST_CPU_LOAD_INFO_COUNT
+ var cpuload C.host_cpu_load_info_data_t
+
+ status := C.host_statistics(C.host_t(C.mach_host_self()),
+ C.HOST_CPU_LOAD_INFO,
+ C.host_info_t(unsafe.Pointer(&cpuload)),
+ &count)
+
+ if status != C.KERN_SUCCESS {
+ return fmt.Errorf("host_statistics error=%d", status)
+ }
+
+ self.User = uint64(cpuload.cpu_ticks[C.CPU_STATE_USER])
+ self.Sys = uint64(cpuload.cpu_ticks[C.CPU_STATE_SYSTEM])
+ self.Idle = uint64(cpuload.cpu_ticks[C.CPU_STATE_IDLE])
+ self.Nice = uint64(cpuload.cpu_ticks[C.CPU_STATE_NICE])
+
+ return nil
+}
+
+func (self *CpuList) Get() error {
+ var count C.mach_msg_type_number_t
+ var cpuload *C.processor_cpu_load_info_data_t
+ var ncpu C.natural_t
+
+ status := C.host_processor_info(C.host_t(C.mach_host_self()),
+ C.PROCESSOR_CPU_LOAD_INFO,
+ &ncpu,
+ (*C.processor_info_array_t)(unsafe.Pointer(&cpuload)),
+ &count)
+
+ if status != C.KERN_SUCCESS {
+ return fmt.Errorf("host_processor_info error=%d", status)
+ }
+
+ // jump through some cgo casting hoops and ensure we properly free
+ // the memory that cpuload points to
+ target := C.vm_map_t(C.mach_task_self_)
+ address := C.vm_address_t(uintptr(unsafe.Pointer(cpuload)))
+ defer C.vm_deallocate(target, address, C.vm_size_t(ncpu))
+
+ // the body of struct processor_cpu_load_info
+ // aka processor_cpu_load_info_data_t
+ var cpu_ticks [C.CPU_STATE_MAX]uint32
+
+ // copy the cpuload array to a []byte buffer
+ // where we can binary.Read the data
+ size := int(ncpu) * binary.Size(cpu_ticks)
+ buf := C.GoBytes(unsafe.Pointer(cpuload), C.int(size))
+
+ bbuf := bytes.NewBuffer(buf)
+
+ self.List = make([]Cpu, 0, ncpu)
+
+ for i := 0; i < int(ncpu); i++ {
+ cpu := Cpu{}
+
+ err := binary.Read(bbuf, binary.LittleEndian, &cpu_ticks)
+ if err != nil {
+ return err
+ }
+
+ cpu.User = uint64(cpu_ticks[C.CPU_STATE_USER])
+ cpu.Sys = uint64(cpu_ticks[C.CPU_STATE_SYSTEM])
+ cpu.Idle = uint64(cpu_ticks[C.CPU_STATE_IDLE])
+ cpu.Nice = uint64(cpu_ticks[C.CPU_STATE_NICE])
+
+ self.List = append(self.List, cpu)
+ }
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *FileSystemList) Get() error {
+ num, err := syscall.Getfsstat(nil, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ buf := make([]syscall.Statfs_t, num)
+
+ _, err = syscall.Getfsstat(buf, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ fslist := make([]FileSystem, 0, num)
+
+ for i := 0; i < num; i++ {
+ fs := FileSystem{}
+
+ fs.DirName = bytePtrToString(&buf[i].Mntonname[0])
+ fs.DevName = bytePtrToString(&buf[i].Mntfromname[0])
+ fs.SysTypeName = bytePtrToString(&buf[i].Fstypename[0])
+
+ fslist = append(fslist, fs)
+ }
+
+ self.List = fslist
+
+ return err
+}
+
+func (self *ProcList) Get() error {
+ n := C.proc_listpids(C.PROC_ALL_PIDS, 0, nil, 0)
+ if n <= 0 {
+ return syscall.EINVAL
+ }
+ buf := make([]byte, n)
+ n = C.proc_listpids(C.PROC_ALL_PIDS, 0, unsafe.Pointer(&buf[0]), n)
+ if n <= 0 {
+ return syscall.ENOMEM
+ }
+
+ var pid int32
+ num := int(n) / binary.Size(pid)
+ list := make([]int, 0, num)
+ bbuf := bytes.NewBuffer(buf)
+
+ for i := 0; i < num; i++ {
+ if err := binary.Read(bbuf, binary.LittleEndian, &pid); err != nil {
+ return err
+ }
+ if pid == 0 {
+ continue
+ }
+
+ list = append(list, int(pid))
+ }
+
+ self.List = list
+
+ return nil
+}
+
+func (self *ProcState) Get(pid int) error {
+ info := C.struct_proc_taskallinfo{}
+
+ if err := task_info(pid, &info); err != nil {
+ return err
+ }
+
+ self.Name = C.GoString(&info.pbsd.pbi_comm[0])
+
+ switch info.pbsd.pbi_status {
+ case C.SIDL:
+ self.State = RunStateIdle
+ case C.SRUN:
+ self.State = RunStateRun
+ case C.SSLEEP:
+ self.State = RunStateSleep
+ case C.SSTOP:
+ self.State = RunStateStop
+ case C.SZOMB:
+ self.State = RunStateZombie
+ default:
+ self.State = RunStateUnknown
+ }
+
+ self.Ppid = int(info.pbsd.pbi_ppid)
+
+ self.Pgid = int(info.pbsd.pbi_pgid)
+
+ self.Tty = int(info.pbsd.e_tdev)
+
+ self.Priority = int(info.ptinfo.pti_priority)
+
+ self.Nice = int(info.pbsd.pbi_nice)
+
+ // Get process username. Fallback to UID if username is not available.
+ uid := strconv.Itoa(int(info.pbsd.pbi_uid))
+ user, err := user.LookupId(uid)
+ if err == nil && user.Username != "" {
+ self.Username = user.Username
+ } else {
+ self.Username = uid
+ }
+
+ return nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ info := C.struct_proc_taskallinfo{}
+
+ if err := task_info(pid, &info); err != nil {
+ return err
+ }
+
+ self.Size = uint64(info.ptinfo.pti_virtual_size)
+ self.Resident = uint64(info.ptinfo.pti_resident_size)
+ self.PageFaults = uint64(info.ptinfo.pti_faults)
+
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ info := C.struct_proc_taskallinfo{}
+
+ if err := task_info(pid, &info); err != nil {
+ return err
+ }
+
+ self.User =
+ uint64(info.ptinfo.pti_total_user) / uint64(time.Millisecond)
+
+ self.Sys =
+ uint64(info.ptinfo.pti_total_system) / uint64(time.Millisecond)
+
+ self.Total = self.User + self.Sys
+
+ self.StartTime = (uint64(info.pbsd.pbi_start_tvsec) * 1000) +
+ (uint64(info.pbsd.pbi_start_tvusec) / 1000)
+
+ return nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ var args []string
+
+ argv := func(arg string) {
+ args = append(args, arg)
+ }
+
+ err := kern_procargs(pid, nil, argv, nil)
+
+ self.List = args
+
+ return err
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ if self.Vars == nil {
+ self.Vars = map[string]string{}
+ }
+
+ env := func(k, v string) {
+ self.Vars[k] = v
+ }
+
+ return kern_procargs(pid, nil, nil, env)
+}
+
+func (self *ProcExe) Get(pid int) error {
+ exe := func(arg string) {
+ self.Name = arg
+ }
+
+ return kern_procargs(pid, exe, nil, nil)
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+// wrapper around sysctl KERN_PROCARGS2
+// callbacks params are optional,
+// up to the caller as to which pieces of data they want
+func kern_procargs(pid int,
+ exe func(string),
+ argv func(string),
+ env func(string, string)) error {
+
+ mib := []C.int{C.CTL_KERN, C.KERN_PROCARGS2, C.int(pid)}
+ argmax := uintptr(C.ARG_MAX)
+ buf := make([]byte, argmax)
+ err := sysctl(mib, &buf[0], &argmax, nil, 0)
+ if err != nil {
+ return nil
+ }
+
+ bbuf := bytes.NewBuffer(buf)
+ bbuf.Truncate(int(argmax))
+
+ var argc int32
+ binary.Read(bbuf, binary.LittleEndian, &argc)
+
+ path, err := bbuf.ReadBytes(0)
+ if err != nil {
+ return fmt.Errorf("Error reading the argv[0]: %v", err)
+ }
+ if exe != nil {
+ exe(string(chop(path)))
+ }
+
+ // skip trailing \0's
+ for {
+ c, err := bbuf.ReadByte()
+ if err != nil {
+ return fmt.Errorf("Error skipping nils: %v", err)
+ }
+ if c != 0 {
+ bbuf.UnreadByte()
+ break // start of argv[0]
+ }
+ }
+
+ for i := 0; i < int(argc); i++ {
+ arg, err := bbuf.ReadBytes(0)
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ return fmt.Errorf("Error reading args: %v", err)
+ }
+ if argv != nil {
+ argv(string(chop(arg)))
+ }
+ }
+
+ if env == nil {
+ return nil
+ }
+
+ delim := []byte{61} // "="
+
+ for {
+ line, err := bbuf.ReadBytes(0)
+ if err == io.EOF || line[0] == 0 {
+ break
+ }
+ if err != nil {
+ return fmt.Errorf("Error reading args: %v", err)
+ }
+ pair := bytes.SplitN(chop(line), delim, 2)
+
+ if len(pair) != 2 {
+ return fmt.Errorf("Error reading process information for PID: %d", pid)
+ }
+
+ env(string(pair[0]), string(pair[1]))
+ }
+
+ return nil
+}
+
+// XXX copied from zsyscall_darwin_amd64.go
+func sysctl(mib []C.int, old *byte, oldlen *uintptr,
+ new *byte, newlen uintptr) (err error) {
+ var p0 unsafe.Pointer
+ p0 = unsafe.Pointer(&mib[0])
+ _, _, e1 := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p0),
+ uintptr(len(mib)),
+ uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)),
+ uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
+func vm_info(vmstat *C.vm_statistics_data_t) error {
+ var count C.mach_msg_type_number_t = C.HOST_VM_INFO_COUNT
+
+ status := C.host_statistics(
+ C.host_t(C.mach_host_self()),
+ C.HOST_VM_INFO,
+ C.host_info_t(unsafe.Pointer(vmstat)),
+ &count)
+
+ if status != C.KERN_SUCCESS {
+ return fmt.Errorf("host_statistics=%d", status)
+ }
+
+ return nil
+}
+
+// generic Sysctl buffer unmarshalling
+func sysctlbyname(name string, data interface{}) (err error) {
+ val, err := syscall.Sysctl(name)
+ if err != nil {
+ return err
+ }
+
+ buf := []byte(val)
+
+ switch v := data.(type) {
+ case *uint64:
+ *v = *(*uint64)(unsafe.Pointer(&buf[0]))
+ return
+ }
+
+ bbuf := bytes.NewBuffer([]byte(val))
+ return binary.Read(bbuf, binary.LittleEndian, data)
+}
+
+func task_info(pid int, info *C.struct_proc_taskallinfo) error {
+ size := C.int(unsafe.Sizeof(*info))
+ ptr := unsafe.Pointer(info)
+
+ n := C.proc_pidinfo(C.int(pid), C.PROC_PIDTASKALLINFO, 0, ptr, size)
+ if n != size {
+ return fmt.Errorf("Could not read process info for pid %d", pid)
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_format.go b/vendor/github.com/elastic/gosigar/sigar_format.go
new file mode 100644
index 000000000..ac56c9873
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_format.go
@@ -0,0 +1,126 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "strconv"
+ "time"
+)
+
+// Go version of apr_strfsize
+func FormatSize(size uint64) string {
+ ord := []string{"K", "M", "G", "T", "P", "E"}
+ o := 0
+ buf := new(bytes.Buffer)
+ w := bufio.NewWriter(buf)
+
+ if size < 973 {
+ fmt.Fprintf(w, "%3d ", size)
+ w.Flush()
+ return buf.String()
+ }
+
+ for {
+ remain := size & 1023
+ size >>= 10
+
+ if size >= 973 {
+ o++
+ continue
+ }
+
+ if size < 9 || (size == 9 && remain < 973) {
+ remain = ((remain * 5) + 256) / 512
+ if remain >= 10 {
+ size++
+ remain = 0
+ }
+
+ fmt.Fprintf(w, "%d.%d%s", size, remain, ord[o])
+ break
+ }
+
+ if remain >= 512 {
+ size++
+ }
+
+ fmt.Fprintf(w, "%3d%s", size, ord[o])
+ break
+ }
+
+ w.Flush()
+ return buf.String()
+}
+
+func FormatPercent(percent float64) string {
+ return strconv.FormatFloat(percent, 'f', -1, 64) + "%"
+}
+
+func (self *FileSystemUsage) UsePercent() float64 {
+ b_used := (self.Total - self.Free) / 1024
+ b_avail := self.Avail / 1024
+ utotal := b_used + b_avail
+ used := b_used
+
+ if utotal != 0 {
+ u100 := used * 100
+ pct := u100 / utotal
+ if u100%utotal != 0 {
+ pct += 1
+ }
+ return (float64(pct) / float64(100)) * 100.0
+ }
+
+ return 0.0
+}
+
+func (self *Uptime) Format() string {
+ buf := new(bytes.Buffer)
+ w := bufio.NewWriter(buf)
+ uptime := uint64(self.Length)
+
+ days := uptime / (60 * 60 * 24)
+
+ if days != 0 {
+ s := ""
+ if days > 1 {
+ s = "s"
+ }
+ fmt.Fprintf(w, "%d day%s, ", days, s)
+ }
+
+ minutes := uptime / 60
+ hours := minutes / 60
+ hours %= 24
+ minutes %= 60
+
+ fmt.Fprintf(w, "%2d:%02d", hours, minutes)
+
+ w.Flush()
+ return buf.String()
+}
+
+func (self *ProcTime) FormatStartTime() string {
+ if self.StartTime == 0 {
+ return "00:00"
+ }
+ start := time.Unix(int64(self.StartTime)/1000, 0)
+ format := "Jan02"
+ if time.Since(start).Seconds() < (60 * 60 * 24) {
+ format = "15:04"
+ }
+ return start.Format(format)
+}
+
+func (self *ProcTime) FormatTotal() string {
+ t := self.Total / 1000
+ ss := t % 60
+ t /= 60
+ mm := t % 60
+ t /= 60
+ hh := t % 24
+ return fmt.Sprintf("%02d:%02d:%02d", hh, mm, ss)
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_freebsd.go b/vendor/github.com/elastic/gosigar/sigar_freebsd.go
new file mode 100644
index 000000000..602b4a0aa
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_freebsd.go
@@ -0,0 +1,108 @@
+// Copied and modified from sigar_linux.go.
+
+package gosigar
+
+import (
+ "io/ioutil"
+ "strconv"
+ "strings"
+ "unsafe"
+)
+
+/*
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <sys/ucred.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <time.h>
+*/
+import "C"
+
+func init() {
+ system.ticks = uint64(C.sysconf(C._SC_CLK_TCK))
+
+ Procd = "/compat/linux/proc"
+
+ getLinuxBootTime()
+}
+
+func getMountTableFileName() string {
+ return Procd + "/mtab"
+}
+
+func (self *Uptime) Get() error {
+ ts := C.struct_timespec{}
+
+ if _, err := C.clock_gettime(C.CLOCK_UPTIME, &ts); err != nil {
+ return err
+ }
+
+ self.Length = float64(ts.tv_sec) + 1e-9*float64(ts.tv_nsec)
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ val := C.uint32_t(0)
+ sc := C.size_t(4)
+
+ name := C.CString("kern.openfiles")
+ _, err := C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)
+ C.free(unsafe.Pointer(name))
+ if err != nil {
+ return err
+ }
+ self.Open = uint64(val)
+
+ name = C.CString("kern.maxfiles")
+ _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)
+ C.free(unsafe.Pointer(name))
+ if err != nil {
+ return err
+ }
+ self.Max = uint64(val)
+
+ self.Unused = self.Max - self.Open
+
+ return nil
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ err := readFile("/proc/"+strconv.Itoa(pid)+"/rlimit", func(line string) bool {
+ if strings.HasPrefix(line, "nofile") {
+ fields := strings.Fields(line)
+ if len(fields) == 3 {
+ self.SoftLimit, _ = strconv.ParseUint(fields[1], 10, 64)
+ self.HardLimit, _ = strconv.ParseUint(fields[2], 10, 64)
+ }
+ return false
+ }
+ return true
+ })
+ if err != nil {
+ return err
+ }
+
+ // linprocfs only provides this information for this process (self).
+ fds, err := ioutil.ReadDir(procFileName(pid, "fd"))
+ if err != nil {
+ return err
+ }
+ self.Open = uint64(len(fds))
+
+ return nil
+}
+
+func parseCpuStat(self *Cpu, line string) error {
+ fields := strings.Fields(line)
+
+ self.User, _ = strtoull(fields[1])
+ self.Nice, _ = strtoull(fields[2])
+ self.Sys, _ = strtoull(fields[3])
+ self.Idle, _ = strtoull(fields[4])
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_interface.go b/vendor/github.com/elastic/gosigar/sigar_interface.go
new file mode 100644
index 000000000..a956af604
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_interface.go
@@ -0,0 +1,197 @@
+package gosigar
+
+import (
+ "time"
+)
+
+type ErrNotImplemented struct {
+ OS string
+}
+
+func (e ErrNotImplemented) Error() string {
+ return "not implemented on " + e.OS
+}
+
+func IsNotImplemented(err error) bool {
+ switch err.(type) {
+ case ErrNotImplemented, *ErrNotImplemented:
+ return true
+ default:
+ return false
+ }
+}
+
+type Sigar interface {
+ CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{})
+ GetLoadAverage() (LoadAverage, error)
+ GetMem() (Mem, error)
+ GetSwap() (Swap, error)
+ GetFileSystemUsage(string) (FileSystemUsage, error)
+ GetFDUsage() (FDUsage, error)
+ GetRusage(who int) (Rusage, error)
+}
+
+type Cpu struct {
+ User uint64
+ Nice uint64
+ Sys uint64
+ Idle uint64
+ Wait uint64
+ Irq uint64
+ SoftIrq uint64
+ Stolen uint64
+}
+
+func (cpu *Cpu) Total() uint64 {
+ return cpu.User + cpu.Nice + cpu.Sys + cpu.Idle +
+ cpu.Wait + cpu.Irq + cpu.SoftIrq + cpu.Stolen
+}
+
+func (cpu Cpu) Delta(other Cpu) Cpu {
+ return Cpu{
+ User: cpu.User - other.User,
+ Nice: cpu.Nice - other.Nice,
+ Sys: cpu.Sys - other.Sys,
+ Idle: cpu.Idle - other.Idle,
+ Wait: cpu.Wait - other.Wait,
+ Irq: cpu.Irq - other.Irq,
+ SoftIrq: cpu.SoftIrq - other.SoftIrq,
+ Stolen: cpu.Stolen - other.Stolen,
+ }
+}
+
+type LoadAverage struct {
+ One, Five, Fifteen float64
+}
+
+type Uptime struct {
+ Length float64
+}
+
+type Mem struct {
+ Total uint64
+ Used uint64
+ Free uint64
+ ActualFree uint64
+ ActualUsed uint64
+}
+
+type Swap struct {
+ Total uint64
+ Used uint64
+ Free uint64
+}
+
+type CpuList struct {
+ List []Cpu
+}
+
+type FDUsage struct {
+ Open uint64
+ Unused uint64
+ Max uint64
+}
+
+type FileSystem struct {
+ DirName string
+ DevName string
+ TypeName string
+ SysTypeName string
+ Options string
+ Flags uint32
+}
+
+type FileSystemList struct {
+ List []FileSystem
+}
+
+type FileSystemUsage struct {
+ Total uint64
+ Used uint64
+ Free uint64
+ Avail uint64
+ Files uint64
+ FreeFiles uint64
+}
+
+type ProcList struct {
+ List []int
+}
+
+type RunState byte
+
+const (
+ RunStateSleep = 'S'
+ RunStateRun = 'R'
+ RunStateStop = 'T'
+ RunStateZombie = 'Z'
+ RunStateIdle = 'D'
+ RunStateUnknown = '?'
+)
+
+type ProcState struct {
+ Name string
+ Username string
+ State RunState
+ Ppid int
+ Pgid int
+ Tty int
+ Priority int
+ Nice int
+ Processor int
+}
+
+type ProcMem struct {
+ Size uint64
+ Resident uint64
+ Share uint64
+ MinorFaults uint64
+ MajorFaults uint64
+ PageFaults uint64
+}
+
+type ProcTime struct {
+ StartTime uint64
+ User uint64
+ Sys uint64
+ Total uint64
+}
+
+type ProcArgs struct {
+ List []string
+}
+
+type ProcEnv struct {
+ Vars map[string]string
+}
+
+type ProcExe struct {
+ Name string
+ Cwd string
+ Root string
+}
+
+type ProcFDUsage struct {
+ Open uint64
+ SoftLimit uint64
+ HardLimit uint64
+}
+
+type Rusage struct {
+ Utime time.Duration
+ Stime time.Duration
+ Maxrss int64
+ Ixrss int64
+ Idrss int64
+ Isrss int64
+ Minflt int64
+ Majflt int64
+ Nswap int64
+ Inblock int64
+ Oublock int64
+ Msgsnd int64
+ Msgrcv int64
+ Nsignals int64
+ Nvcsw int64
+ Nivcsw int64
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_linux.go b/vendor/github.com/elastic/gosigar/sigar_linux.go
new file mode 100644
index 000000000..cb1d3525b
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_linux.go
@@ -0,0 +1,84 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "io/ioutil"
+ "strconv"
+ "strings"
+ "syscall"
+)
+
+func init() {
+ system.ticks = 100 // C.sysconf(C._SC_CLK_TCK)
+
+ Procd = "/proc"
+
+ getLinuxBootTime()
+}
+
+func getMountTableFileName() string {
+ return "/etc/mtab"
+}
+
+func (self *Uptime) Get() error {
+ sysinfo := syscall.Sysinfo_t{}
+
+ if err := syscall.Sysinfo(&sysinfo); err != nil {
+ return err
+ }
+
+ self.Length = float64(sysinfo.Uptime)
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ return readFile(Procd+"/sys/fs/file-nr", func(line string) bool {
+ fields := strings.Fields(line)
+ if len(fields) == 3 {
+ self.Open, _ = strconv.ParseUint(fields[0], 10, 64)
+ self.Unused, _ = strconv.ParseUint(fields[1], 10, 64)
+ self.Max, _ = strconv.ParseUint(fields[2], 10, 64)
+ }
+ return false
+ })
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ err := readFile(procFileName(pid, "limits"), func(line string) bool {
+ if strings.HasPrefix(line, "Max open files") {
+ fields := strings.Fields(line)
+ if len(fields) == 6 {
+ self.SoftLimit, _ = strconv.ParseUint(fields[3], 10, 64)
+ self.HardLimit, _ = strconv.ParseUint(fields[4], 10, 64)
+ }
+ return false
+ }
+ return true
+ })
+ if err != nil {
+ return err
+ }
+ fds, err := ioutil.ReadDir(procFileName(pid, "fd"))
+ if err != nil {
+ return err
+ }
+ self.Open = uint64(len(fds))
+ return nil
+}
+
+func parseCpuStat(self *Cpu, line string) error {
+ fields := strings.Fields(line)
+
+ self.User, _ = strtoull(fields[1])
+ self.Nice, _ = strtoull(fields[2])
+ self.Sys, _ = strtoull(fields[3])
+ self.Idle, _ = strtoull(fields[4])
+ self.Wait, _ = strtoull(fields[5])
+ self.Irq, _ = strtoull(fields[6])
+ self.SoftIrq, _ = strtoull(fields[7])
+ self.Stolen, _ = strtoull(fields[8])
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_linux_common.go b/vendor/github.com/elastic/gosigar/sigar_linux_common.go
new file mode 100644
index 000000000..8e5e7856f
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_linux_common.go
@@ -0,0 +1,468 @@
+// Copyright (c) 2012 VMware, Inc.
+
+// +build freebsd linux
+
+package gosigar
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "os/user"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "syscall"
+)
+
+var system struct {
+ ticks uint64
+ btime uint64
+}
+
+var Procd string
+
+func getLinuxBootTime() {
+ // grab system boot time
+ readFile(Procd+"/stat", func(line string) bool {
+ if strings.HasPrefix(line, "btime") {
+ system.btime, _ = strtoull(line[6:])
+ return false // stop reading
+ }
+ return true
+ })
+}
+
+func (self *LoadAverage) Get() error {
+ line, err := ioutil.ReadFile(Procd + "/loadavg")
+ if err != nil {
+ return nil
+ }
+
+ fields := strings.Fields(string(line))
+
+ self.One, _ = strconv.ParseFloat(fields[0], 64)
+ self.Five, _ = strconv.ParseFloat(fields[1], 64)
+ self.Fifteen, _ = strconv.ParseFloat(fields[2], 64)
+
+ return nil
+}
+
+func (self *Mem) Get() error {
+
+ table, err := parseMeminfo()
+ if err != nil {
+ return err
+ }
+
+ self.Total, _ = table["MemTotal"]
+ self.Free, _ = table["MemFree"]
+ buffers, _ := table["Buffers"]
+ cached, _ := table["Cached"]
+
+ if available, ok := table["MemAvailable"]; ok {
+ // MemAvailable is in /proc/meminfo (kernel 3.14+)
+ self.ActualFree = available
+ } else {
+ self.ActualFree = self.Free + buffers + cached
+ }
+
+ self.Used = self.Total - self.Free
+ self.ActualUsed = self.Total - self.ActualFree
+
+ return nil
+}
+
+func (self *Swap) Get() error {
+
+ table, err := parseMeminfo()
+ if err != nil {
+ return err
+ }
+ self.Total, _ = table["SwapTotal"]
+ self.Free, _ = table["SwapFree"]
+
+ self.Used = self.Total - self.Free
+ return nil
+}
+
+func (self *Cpu) Get() error {
+ return readFile(Procd+"/stat", func(line string) bool {
+ if len(line) > 4 && line[0:4] == "cpu " {
+ parseCpuStat(self, line)
+ return false
+ }
+ return true
+
+ })
+}
+
+func (self *CpuList) Get() error {
+ capacity := len(self.List)
+ if capacity == 0 {
+ capacity = 4
+ }
+ list := make([]Cpu, 0, capacity)
+
+ err := readFile(Procd+"/stat", func(line string) bool {
+ if len(line) > 3 && line[0:3] == "cpu" && line[3] != ' ' {
+ cpu := Cpu{}
+ parseCpuStat(&cpu, line)
+ list = append(list, cpu)
+ }
+ return true
+ })
+
+ self.List = list
+
+ return err
+}
+
+func (self *FileSystemList) Get() error {
+ capacity := len(self.List)
+ if capacity == 0 {
+ capacity = 10
+ }
+ fslist := make([]FileSystem, 0, capacity)
+
+ err := readFile(getMountTableFileName(), func(line string) bool {
+ fields := strings.Fields(line)
+
+ fs := FileSystem{}
+ fs.DevName = fields[0]
+ fs.DirName = fields[1]
+ fs.SysTypeName = fields[2]
+ fs.Options = fields[3]
+
+ fslist = append(fslist, fs)
+
+ return true
+ })
+
+ self.List = fslist
+
+ return err
+}
+
+func (self *ProcList) Get() error {
+ dir, err := os.Open(Procd)
+ if err != nil {
+ return err
+ }
+ defer dir.Close()
+
+ const readAllDirnames = -1 // see os.File.Readdirnames doc
+
+ names, err := dir.Readdirnames(readAllDirnames)
+ if err != nil {
+ return err
+ }
+
+ capacity := len(names)
+ list := make([]int, 0, capacity)
+
+ for _, name := range names {
+ if name[0] < '0' || name[0] > '9' {
+ continue
+ }
+ pid, err := strconv.Atoi(name)
+ if err == nil {
+ list = append(list, pid)
+ }
+ }
+
+ self.List = list
+
+ return nil
+}
+
+func (self *ProcState) Get(pid int) error {
+ data, err := readProcFile(pid, "stat")
+ if err != nil {
+ return err
+ }
+
+ // Extract the comm value with is surrounded by parentheses.
+ lIdx := bytes.Index(data, []byte("("))
+ rIdx := bytes.LastIndex(data, []byte(")"))
+ if lIdx < 0 || rIdx < 0 || lIdx >= rIdx || rIdx+2 >= len(data) {
+ return fmt.Errorf("failed to extract comm for pid %d from '%v'", pid, string(data))
+ }
+ self.Name = string(data[lIdx+1 : rIdx])
+
+ // Extract the rest of the fields that we are interested in.
+ fields := bytes.Fields(data[rIdx+2:])
+ if len(fields) <= 36 {
+ return fmt.Errorf("expected more stat fields for pid %d from '%v'", pid, string(data))
+ }
+
+ interests := bytes.Join([][]byte{
+ fields[0], // state
+ fields[1], // ppid
+ fields[2], // pgrp
+ fields[4], // tty_nr
+ fields[15], // priority
+ fields[16], // nice
+ fields[36], // processor (last processor executed on)
+ }, []byte(" "))
+
+ var state string
+ _, err = fmt.Fscan(bytes.NewBuffer(interests),
+ &state,
+ &self.Ppid,
+ &self.Pgid,
+ &self.Tty,
+ &self.Priority,
+ &self.Nice,
+ &self.Processor,
+ )
+ if err != nil {
+ return fmt.Errorf("failed to parse stat fields for pid %d from '%v': %v", pid, string(data), err)
+ }
+ self.State = RunState(state[0])
+
+ // Read /proc/[pid]/status to get the uid, then lookup uid to get username.
+ status, err := getProcStatus(pid)
+ if err != nil {
+ return fmt.Errorf("failed to read process status for pid %d: %v", pid, err)
+ }
+ uids, err := getUIDs(status)
+ if err != nil {
+ return fmt.Errorf("failed to read process status for pid %d: %v", pid, err)
+ }
+ user, err := user.LookupId(uids[0])
+ if err == nil {
+ self.Username = user.Username
+ } else {
+ self.Username = uids[0]
+ }
+
+ return nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ contents, err := readProcFile(pid, "statm")
+ if err != nil {
+ return err
+ }
+
+ fields := strings.Fields(string(contents))
+
+ size, _ := strtoull(fields[0])
+ self.Size = size << 12
+
+ rss, _ := strtoull(fields[1])
+ self.Resident = rss << 12
+
+ share, _ := strtoull(fields[2])
+ self.Share = share << 12
+
+ contents, err = readProcFile(pid, "stat")
+ if err != nil {
+ return err
+ }
+
+ fields = strings.Fields(string(contents))
+
+ self.MinorFaults, _ = strtoull(fields[10])
+ self.MajorFaults, _ = strtoull(fields[12])
+ self.PageFaults = self.MinorFaults + self.MajorFaults
+
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ contents, err := readProcFile(pid, "stat")
+ if err != nil {
+ return err
+ }
+
+ fields := strings.Fields(string(contents))
+
+ user, _ := strtoull(fields[13])
+ sys, _ := strtoull(fields[14])
+ // convert to millis
+ self.User = user * (1000 / system.ticks)
+ self.Sys = sys * (1000 / system.ticks)
+ self.Total = self.User + self.Sys
+
+ // convert to millis
+ self.StartTime, _ = strtoull(fields[21])
+ self.StartTime /= system.ticks
+ self.StartTime += system.btime
+ self.StartTime *= 1000
+
+ return nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ contents, err := readProcFile(pid, "cmdline")
+ if err != nil {
+ return err
+ }
+
+ bbuf := bytes.NewBuffer(contents)
+
+ var args []string
+
+ for {
+ arg, err := bbuf.ReadBytes(0)
+ if err == io.EOF {
+ break
+ }
+ args = append(args, string(chop(arg)))
+ }
+
+ self.List = args
+
+ return nil
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ contents, err := readProcFile(pid, "environ")
+ if err != nil {
+ return err
+ }
+
+ if self.Vars == nil {
+ self.Vars = map[string]string{}
+ }
+
+ pairs := bytes.Split(contents, []byte{0})
+ for _, kv := range pairs {
+ parts := bytes.SplitN(kv, []byte{'='}, 2)
+ if len(parts) != 2 {
+ continue
+ }
+
+ key := string(bytes.TrimSpace(parts[0]))
+ if key == "" {
+ continue
+ }
+
+ self.Vars[key] = string(bytes.TrimSpace(parts[1]))
+ }
+
+ return nil
+}
+
+func (self *ProcExe) Get(pid int) error {
+ fields := map[string]*string{
+ "exe": &self.Name,
+ "cwd": &self.Cwd,
+ "root": &self.Root,
+ }
+
+ for name, field := range fields {
+ val, err := os.Readlink(procFileName(pid, name))
+
+ if err != nil {
+ return err
+ }
+
+ *field = val
+ }
+
+ return nil
+}
+
+func parseMeminfo() (map[string]uint64, error) {
+ table := map[string]uint64{}
+
+ err := readFile(Procd+"/meminfo", func(line string) bool {
+ fields := strings.Split(line, ":")
+
+ if len(fields) != 2 {
+ return true // skip on errors
+ }
+
+ num := strings.TrimLeft(fields[1], " ")
+ val, err := strtoull(strings.Fields(num)[0])
+ if err != nil {
+ return true // skip on errors
+ }
+ table[fields[0]] = val * 1024 //in bytes
+
+ return true
+ })
+ return table, err
+}
+
+func readFile(file string, handler func(string) bool) error {
+ contents, err := ioutil.ReadFile(file)
+ if err != nil {
+ return err
+ }
+
+ reader := bufio.NewReader(bytes.NewBuffer(contents))
+
+ for {
+ line, _, err := reader.ReadLine()
+ if err == io.EOF {
+ break
+ }
+ if !handler(string(line)) {
+ break
+ }
+ }
+
+ return nil
+}
+
+func strtoull(val string) (uint64, error) {
+ return strconv.ParseUint(val, 10, 64)
+}
+
+func procFileName(pid int, name string) string {
+ return Procd + "/" + strconv.Itoa(pid) + "/" + name
+}
+
+func readProcFile(pid int, name string) ([]byte, error) {
+ path := procFileName(pid, name)
+ contents, err := ioutil.ReadFile(path)
+
+ if err != nil {
+ if perr, ok := err.(*os.PathError); ok {
+ if perr.Err == syscall.ENOENT {
+ return nil, syscall.ESRCH
+ }
+ }
+ }
+
+ return contents, err
+}
+
+// getProcStatus reads /proc/[pid]/status which contains process status
+// information in human readable form.
+func getProcStatus(pid int) (map[string]string, error) {
+ status := make(map[string]string, 42)
+ path := filepath.Join(Procd, strconv.Itoa(pid), "status")
+ err := readFile(path, func(line string) bool {
+ fields := strings.SplitN(line, ":", 2)
+ if len(fields) == 2 {
+ status[fields[0]] = strings.TrimSpace(fields[1])
+ }
+
+ return true
+ })
+ return status, err
+}
+
+// getUIDs reads the "Uid" value from status and splits it into four values --
+// real, effective, saved set, and file system UIDs.
+func getUIDs(status map[string]string) ([]string, error) {
+ uidLine, ok := status["Uid"]
+ if !ok {
+ return nil, fmt.Errorf("Uid not found in proc status")
+ }
+
+ uidStrs := strings.Fields(uidLine)
+ if len(uidStrs) != 4 {
+ return nil, fmt.Errorf("Uid line ('%s') did not contain four values", uidLine)
+ }
+
+ return uidStrs, nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_openbsd.go b/vendor/github.com/elastic/gosigar/sigar_openbsd.go
new file mode 100644
index 000000000..4f1383a6b
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_openbsd.go
@@ -0,0 +1,418 @@
+// Copyright (c) 2016 Jasper Lievisse Adriaanse <j@jasper.la>.
+
+// +build openbsd
+
+package gosigar
+
+/*
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/mount.h>
+#include <sys/sched.h>
+#include <sys/swap.h>
+#include <stdlib.h>
+#include <unistd.h>
+*/
+import "C"
+
+//import "github.com/davecgh/go-spew/spew"
+
+import (
+ "runtime"
+ "syscall"
+ "time"
+ "unsafe"
+)
+
+type Uvmexp struct {
+ pagesize uint32
+ pagemask uint32
+ pageshift uint32
+ npages uint32
+ free uint32
+ active uint32
+ inactive uint32
+ paging uint32
+ wired uint32
+ zeropages uint32
+ reserve_pagedaemon uint32
+ reserve_kernel uint32
+ anonpages uint32
+ vnodepages uint32
+ vtextpages uint32
+ freemin uint32
+ freetarg uint32
+ inactarg uint32
+ wiredmax uint32
+ anonmin uint32
+ vtextmin uint32
+ vnodemin uint32
+ anonminpct uint32
+ vtextmi uint32
+ npct uint32
+ vnodeminpct uint32
+ nswapdev uint32
+ swpages uint32
+ swpginuse uint32
+ swpgonly uint32
+ nswget uint32
+ nanon uint32
+ nanonneeded uint32
+ nfreeanon uint32
+ faults uint32
+ traps uint32
+ intrs uint32
+ swtch uint32
+ softs uint32
+ syscalls uint32
+ pageins uint32
+ obsolete_swapins uint32
+ obsolete_swapouts uint32
+ pgswapin uint32
+ pgswapout uint32
+ forks uint32
+ forks_ppwait uint32
+ forks_sharevm uint32
+ pga_zerohit uint32
+ pga_zeromiss uint32
+ zeroaborts uint32
+ fltnoram uint32
+ fltnoanon uint32
+ fltpgwait uint32
+ fltpgrele uint32
+ fltrelck uint32
+ fltrelckok uint32
+ fltanget uint32
+ fltanretry uint32
+ fltamcopy uint32
+ fltnamap uint32
+ fltnomap uint32
+ fltlget uint32
+ fltget uint32
+ flt_anon uint32
+ flt_acow uint32
+ flt_obj uint32
+ flt_prcopy uint32
+ flt_przero uint32
+ pdwoke uint32
+ pdrevs uint32
+ pdswout uint32
+ pdfreed uint32
+ pdscans uint32
+ pdanscan uint32
+ pdobscan uint32
+ pdreact uint32
+ pdbusy uint32
+ pdpageouts uint32
+ pdpending uint32
+ pddeact uint32
+ pdreanon uint32
+ pdrevnode uint32
+ pdrevtext uint32
+ fpswtch uint32
+ kmapent uint32
+}
+
+type Bcachestats struct {
+ numbufs uint64
+ numbufpages uint64
+ numdirtypages uint64
+ numcleanpages uint64
+ pendingwrites uint64
+ pendingreads uint64
+ numwrites uint64
+ numreads uint64
+ cachehits uint64
+ busymapped uint64
+ dmapages uint64
+ highpages uint64
+ delwribufs uint64
+ kvaslots uint64
+ kvaslots_avail uint64
+}
+
+type Swapent struct {
+ se_dev C.dev_t
+ se_flags int32
+ se_nblks int32
+ se_inuse int32
+ se_priority int32
+ sw_path []byte
+}
+
+func (self *FileSystemList) Get() error {
+ num, err := syscall.Getfsstat(nil, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ buf := make([]syscall.Statfs_t, num)
+
+ _, err = syscall.Getfsstat(buf, C.MNT_NOWAIT)
+ if err != nil {
+ return err
+ }
+
+ fslist := make([]FileSystem, 0, num)
+
+ for i := 0; i < num; i++ {
+ fs := FileSystem{}
+
+ fs.DirName = bytePtrToString(&buf[i].F_mntonname[0])
+ fs.DevName = bytePtrToString(&buf[i].F_mntfromname[0])
+ fs.SysTypeName = bytePtrToString(&buf[i].F_fstypename[0])
+
+ fslist = append(fslist, fs)
+ }
+
+ self.List = fslist
+
+ return err
+}
+
+func (self *FileSystemUsage) Get(path string) error {
+ stat := syscall.Statfs_t{}
+ err := syscall.Statfs(path, &stat)
+ if err != nil {
+ return err
+ }
+
+ self.Total = uint64(stat.F_blocks) * uint64(stat.F_bsize)
+ self.Free = uint64(stat.F_bfree) * uint64(stat.F_bsize)
+ self.Avail = uint64(stat.F_bavail) * uint64(stat.F_bsize)
+ self.Used = self.Total - self.Free
+ self.Files = stat.F_files
+ self.FreeFiles = stat.F_ffree
+
+ return nil
+}
+
+func (self *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *LoadAverage) Get() error {
+ avg := []C.double{0, 0, 0}
+
+ C.getloadavg(&avg[0], C.int(len(avg)))
+
+ self.One = float64(avg[0])
+ self.Five = float64(avg[1])
+ self.Fifteen = float64(avg[2])
+
+ return nil
+}
+
+func (self *Uptime) Get() error {
+ tv := syscall.Timeval{}
+ mib := [2]int32{C.CTL_KERN, C.KERN_BOOTTIME}
+
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ // Now perform the actual sysctl(3) call, storing the result in tv
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&tv)), uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ self.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds()
+
+ return nil
+}
+
+func (self *Mem) Get() error {
+ n := uintptr(0)
+
+ var uvmexp Uvmexp
+ mib := [2]int32{C.CTL_VM, C.VM_UVMEXP}
+ n = uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&uvmexp)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ var bcachestats Bcachestats
+ mib3 := [3]int32{C.CTL_VFS, C.VFS_GENERIC, C.VFS_BCACHESTAT}
+ n = uintptr(0)
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, uintptr(unsafe.Pointer(&bcachestats)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ self.Total = uint64(uvmexp.npages) << uvmexp.pageshift
+ self.Used = uint64(uvmexp.npages-uvmexp.free) << uvmexp.pageshift
+ self.Free = uint64(uvmexp.free) << uvmexp.pageshift
+
+ self.ActualFree = self.Free + (uint64(bcachestats.numbufpages) << uvmexp.pageshift)
+ self.ActualUsed = self.Used - (uint64(bcachestats.numbufpages) << uvmexp.pageshift)
+
+ return nil
+}
+
+func (self *Swap) Get() error {
+ nswap := C.swapctl(C.SWAP_NSWAP, unsafe.Pointer(uintptr(0)), 0)
+
+ // If there are no swap devices, nothing to do here.
+ if nswap == 0 {
+ return nil
+ }
+
+ swdev := make([]Swapent, nswap)
+
+ rnswap := C.swapctl(C.SWAP_STATS, unsafe.Pointer(&swdev[0]), nswap)
+ if rnswap == 0 {
+ return nil
+ }
+
+ for i := 0; i < int(nswap); i++ {
+ if swdev[i].se_flags&C.SWF_ENABLE == 2 {
+ self.Used = self.Used + uint64(swdev[i].se_inuse/(1024/C.DEV_BSIZE))
+ self.Total = self.Total + uint64(swdev[i].se_nblks/(1024/C.DEV_BSIZE))
+ }
+ }
+
+ self.Free = self.Total - self.Used
+
+ return nil
+}
+
+func (self *Cpu) Get() error {
+ load := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE}
+
+ mib := [2]int32{C.CTL_KERN, C.KERN_CPTIME}
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&load)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ self.User = uint64(load[0])
+ self.Nice = uint64(load[1])
+ self.Sys = uint64(load[2])
+ self.Irq = uint64(load[3])
+ self.Idle = uint64(load[4])
+
+ return nil
+}
+
+func (self *CpuList) Get() error {
+ mib := [2]int32{C.CTL_HW, C.HW_NCPU}
+ var ncpu int
+
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ // Now perform the actual sysctl(3) call, storing the result in ncpu
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&ncpu)), uintptr(unsafe.Pointer(&n)), 0, 0)
+
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ load := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE}
+
+ self.List = make([]Cpu, ncpu)
+ for curcpu := range self.List {
+ sysctlCptime(ncpu, curcpu, &load)
+ fillCpu(&self.List[curcpu], load)
+ }
+
+ return nil
+}
+
+func (self *ProcList) Get() error {
+ return nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcState) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcExe) Get(pid int) error {
+ return nil
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func fillCpu(cpu *Cpu, load [C.CPUSTATES]C.long) {
+ cpu.User = uint64(load[0])
+ cpu.Nice = uint64(load[1])
+ cpu.Sys = uint64(load[2])
+ cpu.Irq = uint64(load[3])
+ cpu.Idle = uint64(load[4])
+}
+
+func sysctlCptime(ncpu int, curcpu int, load *[C.CPUSTATES]C.long) error {
+ var mib []int32
+
+ // Use the correct mib based on the number of CPUs and fill out the
+ // current CPU number in case of SMP. (0 indexed cf. self.List)
+ if ncpu == 0 {
+ mib = []int32{C.CTL_KERN, C.KERN_CPTIME}
+ } else {
+ mib = []int32{C.CTL_KERN, C.KERN_CPTIME2, int32(curcpu)}
+ }
+
+ len := len(mib)
+
+ n := uintptr(0)
+ // First we determine how much memory we'll need to pass later on (via `n`)
+ _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), uintptr(unsafe.Pointer(load)), uintptr(unsafe.Pointer(&n)), 0, 0)
+ if errno != 0 || n == 0 {
+ return nil
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_stub.go b/vendor/github.com/elastic/gosigar/sigar_stub.go
new file mode 100644
index 000000000..0b858f1c0
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_stub.go
@@ -0,0 +1,71 @@
+// +build !darwin,!freebsd,!linux,!openbsd,!windows
+
+package gosigar
+
+import (
+ "runtime"
+)
+
+func (c *Cpu) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (l *LoadAverage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (m *Mem) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (s *Swap) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (f *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcTime) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *FileSystemUsage) Get(path string) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *CpuList) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcState) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcExe) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcMem) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcFDUsage) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcEnv) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcList) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (p *ProcArgs) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Rusage) Get(int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_unix.go b/vendor/github.com/elastic/gosigar/sigar_unix.go
new file mode 100644
index 000000000..3f3a9f7ff
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_unix.go
@@ -0,0 +1,69 @@
+// Copyright (c) 2012 VMware, Inc.
+
+// +build darwin freebsd linux
+
+package gosigar
+
+import (
+ "syscall"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+func (self *FileSystemUsage) Get(path string) error {
+ stat := syscall.Statfs_t{}
+ err := syscall.Statfs(path, &stat)
+ if err != nil {
+ return err
+ }
+
+ self.Total = uint64(stat.Blocks) * uint64(stat.Bsize)
+ self.Free = uint64(stat.Bfree) * uint64(stat.Bsize)
+ self.Avail = uint64(stat.Bavail) * uint64(stat.Bsize)
+ self.Used = self.Total - self.Free
+ self.Files = stat.Files
+ self.FreeFiles = uint64(stat.Ffree)
+
+ return nil
+}
+
+func (r *Rusage) Get(who int) error {
+ ru, err := getResourceUsage(who)
+ if err != nil {
+ return err
+ }
+
+ uTime := convertRtimeToDur(ru.Utime)
+ sTime := convertRtimeToDur(ru.Stime)
+
+ r.Utime = uTime
+ r.Stime = sTime
+ r.Maxrss = int64(ru.Maxrss)
+ r.Ixrss = int64(ru.Ixrss)
+ r.Idrss = int64(ru.Idrss)
+ r.Isrss = int64(ru.Isrss)
+ r.Minflt = int64(ru.Minflt)
+ r.Majflt = int64(ru.Majflt)
+ r.Nswap = int64(ru.Nswap)
+ r.Inblock = int64(ru.Inblock)
+ r.Oublock = int64(ru.Oublock)
+ r.Msgsnd = int64(ru.Msgsnd)
+ r.Msgrcv = int64(ru.Msgrcv)
+ r.Nsignals = int64(ru.Nsignals)
+ r.Nvcsw = int64(ru.Nvcsw)
+ r.Nivcsw = int64(ru.Nivcsw)
+
+ return nil
+}
+
+func getResourceUsage(who int) (unix.Rusage, error) {
+ r := unix.Rusage{}
+ err := unix.Getrusage(who, &r)
+
+ return r, err
+}
+
+func convertRtimeToDur(t unix.Timeval) time.Duration {
+ return time.Duration(t.Nano())
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_util.go b/vendor/github.com/elastic/gosigar/sigar_util.go
new file mode 100644
index 000000000..bf93b02b2
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_util.go
@@ -0,0 +1,22 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "unsafe"
+)
+
+func bytePtrToString(ptr *int8) string {
+ bytes := (*[10000]byte)(unsafe.Pointer(ptr))
+
+ n := 0
+ for bytes[n] != 0 {
+ n++
+ }
+
+ return string(bytes[0:n])
+}
+
+func chop(buf []byte) []byte {
+ return buf[0 : len(buf)-1]
+}
diff --git a/vendor/github.com/elastic/gosigar/sigar_windows.go b/vendor/github.com/elastic/gosigar/sigar_windows.go
new file mode 100644
index 000000000..0cdf928d1
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sigar_windows.go
@@ -0,0 +1,437 @@
+// Copyright (c) 2012 VMware, Inc.
+
+package gosigar
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "sync"
+ "syscall"
+ "time"
+
+ "github.com/StackExchange/wmi"
+ "github.com/elastic/gosigar/sys/windows"
+ "github.com/pkg/errors"
+)
+
+// Win32_Process represents a process on the Windows operating system. If
+// additional fields are added here (that match the Windows struct) they will
+// automatically be populated when calling getWin32Process.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx
+type Win32_Process struct {
+ CommandLine string
+}
+
+// Win32_OperatingSystem WMI class represents a Windows-based operating system
+// installed on a computer.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx
+type Win32_OperatingSystem struct {
+ LastBootUpTime time.Time
+}
+
+var (
+ // version is Windows version of the host OS.
+ version = windows.GetWindowsVersion()
+
+ // processQueryLimitedInfoAccess is set to PROCESS_QUERY_INFORMATION for Windows
+ // 2003 and XP where PROCESS_QUERY_LIMITED_INFORMATION is unknown. For all newer
+ // OS versions it is set to PROCESS_QUERY_LIMITED_INFORMATION.
+ processQueryLimitedInfoAccess = windows.PROCESS_QUERY_LIMITED_INFORMATION
+
+ // bootTime is the time when the OS was last booted. This value may be nil
+ // on operating systems that do not support the WMI query used to obtain it.
+ bootTime *time.Time
+ bootTimeLock sync.Mutex
+)
+
+func init() {
+ if !version.IsWindowsVistaOrGreater() {
+ // PROCESS_QUERY_LIMITED_INFORMATION cannot be used on 2003 or XP.
+ processQueryLimitedInfoAccess = syscall.PROCESS_QUERY_INFORMATION
+ }
+}
+
+func (self *LoadAverage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *FDUsage) Get() error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcEnv) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcExe) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *ProcFDUsage) Get(pid int) error {
+ return ErrNotImplemented{runtime.GOOS}
+}
+
+func (self *Uptime) Get() error {
+ // Minimum supported OS is Windows Vista.
+ if !version.IsWindowsVistaOrGreater() {
+ return ErrNotImplemented{runtime.GOOS}
+ }
+
+ bootTimeLock.Lock()
+ defer bootTimeLock.Unlock()
+ if bootTime == nil {
+ os, err := getWin32OperatingSystem()
+ if err != nil {
+ return errors.Wrap(err, "failed to get boot time using WMI")
+ }
+ bootTime = &os.LastBootUpTime
+ }
+
+ self.Length = time.Since(*bootTime).Seconds()
+ return nil
+}
+
+func (self *Mem) Get() error {
+ memoryStatusEx, err := windows.GlobalMemoryStatusEx()
+ if err != nil {
+ return errors.Wrap(err, "GlobalMemoryStatusEx failed")
+ }
+
+ self.Total = memoryStatusEx.TotalPhys
+ self.Free = memoryStatusEx.AvailPhys
+ self.Used = self.Total - self.Free
+ self.ActualFree = self.Free
+ self.ActualUsed = self.Used
+ return nil
+}
+
+func (self *Swap) Get() error {
+ memoryStatusEx, err := windows.GlobalMemoryStatusEx()
+ if err != nil {
+ return errors.Wrap(err, "GlobalMemoryStatusEx failed")
+ }
+
+ self.Total = memoryStatusEx.TotalPageFile
+ self.Free = memoryStatusEx.AvailPageFile
+ self.Used = self.Total - self.Free
+ return nil
+}
+
+func (self *Cpu) Get() error {
+ idle, kernel, user, err := windows.GetSystemTimes()
+ if err != nil {
+ return errors.Wrap(err, "GetSystemTimes failed")
+ }
+
+ // CPU times are reported in milliseconds by gosigar.
+ self.Idle = uint64(idle / time.Millisecond)
+ self.Sys = uint64(kernel / time.Millisecond)
+ self.User = uint64(user / time.Millisecond)
+ return nil
+}
+
+func (self *CpuList) Get() error {
+ cpus, err := windows.NtQuerySystemProcessorPerformanceInformation()
+ if err != nil {
+ return errors.Wrap(err, "NtQuerySystemProcessorPerformanceInformation failed")
+ }
+
+ self.List = make([]Cpu, 0, len(cpus))
+ for _, cpu := range cpus {
+ self.List = append(self.List, Cpu{
+ Idle: uint64(cpu.IdleTime / time.Millisecond),
+ Sys: uint64(cpu.KernelTime / time.Millisecond),
+ User: uint64(cpu.UserTime / time.Millisecond),
+ })
+ }
+ return nil
+}
+
+func (self *FileSystemList) Get() error {
+ drives, err := windows.GetLogicalDriveStrings()
+ if err != nil {
+ return errors.Wrap(err, "GetLogicalDriveStrings failed")
+ }
+
+ for _, drive := range drives {
+ dt, err := windows.GetDriveType(drive)
+ if err != nil {
+ return errors.Wrapf(err, "GetDriveType failed")
+ }
+
+ self.List = append(self.List, FileSystem{
+ DirName: drive,
+ DevName: drive,
+ TypeName: dt.String(),
+ })
+ }
+ return nil
+}
+
+// Get retrieves a list of all process identifiers (PIDs) in the system.
+func (self *ProcList) Get() error {
+ pids, err := windows.EnumProcesses()
+ if err != nil {
+ return errors.Wrap(err, "EnumProcesses failed")
+ }
+
+ // Convert uint32 PIDs to int.
+ self.List = make([]int, 0, len(pids))
+ for _, pid := range pids {
+ self.List = append(self.List, int(pid))
+ }
+ return nil
+}
+
+func (self *ProcState) Get(pid int) error {
+ var errs []error
+
+ var err error
+ self.Name, err = getProcName(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getProcName failed"))
+ }
+
+ self.State, err = getProcStatus(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getProcStatus failed"))
+ }
+
+ self.Ppid, err = getParentPid(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getParentPid failed"))
+ }
+
+ self.Username, err = getProcCredName(pid)
+ if err != nil {
+ errs = append(errs, errors.Wrap(err, "getProcCredName failed"))
+ }
+
+ if len(errs) > 0 {
+ errStrs := make([]string, 0, len(errs))
+ for _, e := range errs {
+ errStrs = append(errStrs, e.Error())
+ }
+ return errors.New(strings.Join(errStrs, "; "))
+ }
+ return nil
+}
+
+// getProcName returns the process name associated with the PID.
+func getProcName(pid int) (string, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ filename, err := windows.GetProcessImageFileName(handle)
+ if err != nil {
+ return "", errors.Wrapf(err, "GetProcessImageFileName failed for pid=%v", pid)
+ }
+
+ return filepath.Base(filename), nil
+}
+
+// getProcStatus returns the status of a process.
+func getProcStatus(pid int) (RunState, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return RunStateUnknown, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ var exitCode uint32
+ err = syscall.GetExitCodeProcess(handle, &exitCode)
+ if err != nil {
+ return RunStateUnknown, errors.Wrapf(err, "GetExitCodeProcess failed for pid=%v")
+ }
+
+ if exitCode == 259 { //still active
+ return RunStateRun, nil
+ }
+ return RunStateSleep, nil
+}
+
+// getParentPid returns the parent process ID of a process.
+func getParentPid(pid int) (int, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return RunStateUnknown, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ procInfo, err := windows.NtQueryProcessBasicInformation(handle)
+ if err != nil {
+ return 0, errors.Wrapf(err, "NtQueryProcessBasicInformation failed for pid=%v", pid)
+ }
+
+ return int(procInfo.InheritedFromUniqueProcessID), nil
+}
+
+func getProcCredName(pid int) (string, error) {
+ handle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid))
+ if err != nil {
+ return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ // Find process token via win32.
+ var token syscall.Token
+ err = syscall.OpenProcessToken(handle, syscall.TOKEN_QUERY, &token)
+ if err != nil {
+ return "", errors.Wrapf(err, "OpenProcessToken failed for pid=%v", pid)
+ }
+
+ // Find the token user.
+ tokenUser, err := token.GetTokenUser()
+ if err != nil {
+ return "", errors.Wrapf(err, "GetTokenInformation failed for pid=%v", pid)
+ }
+
+ // Close token to prevent handle leaks.
+ err = token.Close()
+ if err != nil {
+ return "", errors.Wrapf(err, "failed while closing process token handle for pid=%v", pid)
+ }
+
+ // Look up domain account by SID.
+ account, domain, _, err := tokenUser.User.Sid.LookupAccount("")
+ if err != nil {
+ sid, sidErr := tokenUser.User.Sid.String()
+ if sidErr != nil {
+ return "", errors.Wrapf(err, "failed while looking up account name for pid=%v", pid)
+ }
+ return "", errors.Wrapf(err, "failed while looking up account name for SID=%v of pid=%v", sid, pid)
+ }
+
+ return fmt.Sprintf(`%s\%s`, domain, account), nil
+}
+
+func (self *ProcMem) Get(pid int) error {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess|windows.PROCESS_VM_READ, false, uint32(pid))
+ if err != nil {
+ return errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ counters, err := windows.GetProcessMemoryInfo(handle)
+ if err != nil {
+ return errors.Wrapf(err, "GetProcessMemoryInfo failed for pid=%v", pid)
+ }
+
+ self.Resident = uint64(counters.WorkingSetSize)
+ self.Size = uint64(counters.PrivateUsage)
+ return nil
+}
+
+func (self *ProcTime) Get(pid int) error {
+ cpu, err := getProcTimes(pid)
+ if err != nil {
+ return err
+ }
+
+ // Windows epoch times are expressed as time elapsed since midnight on
+ // January 1, 1601 at Greenwich, England. This converts the Filetime to
+ // unix epoch in milliseconds.
+ self.StartTime = uint64(cpu.CreationTime.Nanoseconds() / 1e6)
+
+ // Convert to millis.
+ self.User = uint64(windows.FiletimeToDuration(&cpu.UserTime).Nanoseconds() / 1e6)
+ self.Sys = uint64(windows.FiletimeToDuration(&cpu.KernelTime).Nanoseconds() / 1e6)
+ self.Total = self.User + self.Sys
+
+ return nil
+}
+
+func getProcTimes(pid int) (*syscall.Rusage, error) {
+ handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))
+ if err != nil {
+ return nil, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid)
+ }
+ defer syscall.CloseHandle(handle)
+
+ var cpu syscall.Rusage
+ if err := syscall.GetProcessTimes(handle, &cpu.CreationTime, &cpu.ExitTime, &cpu.KernelTime, &cpu.UserTime); err != nil {
+ return nil, errors.Wrapf(err, "GetProcessTimes failed for pid=%v", pid)
+ }
+
+ return &cpu, nil
+}
+
+func (self *ProcArgs) Get(pid int) error {
+ // The minimum supported client for Win32_Process is Windows Vista.
+ if !version.IsWindowsVistaOrGreater() {
+ return ErrNotImplemented{runtime.GOOS}
+ }
+
+ process, err := getWin32Process(int32(pid))
+ if err != nil {
+ return errors.Wrapf(err, "ProcArgs failed for pid=%v", pid)
+ }
+
+ self.List = []string{process.CommandLine}
+ return nil
+}
+
+func (self *FileSystemUsage) Get(path string) error {
+ freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, err := windows.GetDiskFreeSpaceEx(path)
+ if err != nil {
+ return errors.Wrap(err, "GetDiskFreeSpaceEx failed")
+ }
+
+ self.Total = totalNumberOfBytes
+ self.Free = totalNumberOfFreeBytes
+ self.Used = self.Total - self.Free
+ self.Avail = freeBytesAvailable
+ return nil
+}
+
+// getWin32Process gets information about the process with the given process ID.
+// It uses a WMI query to get the information from the local system.
+func getWin32Process(pid int32) (Win32_Process, error) {
+ var dst []Win32_Process
+ query := fmt.Sprintf("WHERE ProcessId = %d", pid)
+ q := wmi.CreateQuery(&dst, query)
+ err := wmi.Query(q, &dst)
+ if err != nil {
+ return Win32_Process{}, fmt.Errorf("could not get Win32_Process %s: %v", query, err)
+ }
+ if len(dst) < 1 {
+ return Win32_Process{}, fmt.Errorf("could not get Win32_Process %s: Process not found", query)
+ }
+ return dst[0], nil
+}
+
+func getWin32OperatingSystem() (Win32_OperatingSystem, error) {
+ var dst []Win32_OperatingSystem
+ q := wmi.CreateQuery(&dst, "")
+ err := wmi.Query(q, &dst)
+ if err != nil {
+ return Win32_OperatingSystem{}, errors.Wrap(err, "wmi query for Win32_OperatingSystem failed")
+ }
+ if len(dst) != 1 {
+ return Win32_OperatingSystem{}, errors.New("wmi query for Win32_OperatingSystem failed")
+ }
+ return dst[0], nil
+}
+
+func (self *Rusage) Get(who int) error {
+ if who != 0 {
+ return ErrNotImplemented{runtime.GOOS}
+ }
+
+ pid := os.Getpid()
+ cpu, err := getProcTimes(pid)
+ if err != nil {
+ return err
+ }
+
+ self.Utime = windows.FiletimeToDuration(&cpu.UserTime)
+ self.Stime = windows.FiletimeToDuration(&cpu.KernelTime)
+
+ return nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/doc.go b/vendor/github.com/elastic/gosigar/sys/windows/doc.go
new file mode 100644
index 000000000..dda57aa83
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/doc.go
@@ -0,0 +1,2 @@
+// Package windows contains various Windows system call.
+package windows
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go b/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go
new file mode 100644
index 000000000..85de365e1
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go
@@ -0,0 +1,132 @@
+// +build windows
+
+package windows
+
+import (
+ "bytes"
+ "encoding/binary"
+ "io"
+ "runtime"
+ "syscall"
+ "time"
+ "unsafe"
+
+ "github.com/pkg/errors"
+)
+
+// On both 32-bit and 64-bit systems NtQuerySystemInformation expects the
+// size of SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION to be 48.
+const sizeofSystemProcessorPerformanceInformation = 48
+
+// ProcessBasicInformation is an equivalent representation of
+// PROCESS_BASIC_INFORMATION in the Windows API.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
+type ProcessBasicInformation struct {
+ ExitStatus uint
+ PebBaseAddress uintptr
+ AffinityMask uint
+ BasePriority uint
+ UniqueProcessID uint
+ InheritedFromUniqueProcessID uint
+}
+
+// NtQueryProcessBasicInformation queries basic information about the process
+// associated with the given handle (provided by OpenProcess). It uses the
+// NtQueryInformationProcess function to collect the data.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx
+func NtQueryProcessBasicInformation(handle syscall.Handle) (ProcessBasicInformation, error) {
+ var processBasicInfo ProcessBasicInformation
+ processBasicInfoPtr := (*byte)(unsafe.Pointer(&processBasicInfo))
+ size := uint32(unsafe.Sizeof(processBasicInfo))
+ ntStatus, _ := _NtQueryInformationProcess(handle, 0, processBasicInfoPtr, size, nil)
+ if ntStatus != 0 {
+ return ProcessBasicInformation{}, errors.Errorf("NtQueryInformationProcess failed, NTSTATUS=0x%X", ntStatus)
+ }
+
+ return processBasicInfo, nil
+}
+
+// SystemProcessorPerformanceInformation contains CPU performance information
+// for a single CPU.
+type SystemProcessorPerformanceInformation struct {
+ IdleTime time.Duration // Amount of time spent idle.
+ KernelTime time.Duration // Kernel time does NOT include time spent in idle.
+ UserTime time.Duration // Amount of time spent executing in user mode.
+}
+
+// _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION is an equivalent representation of
+// SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION in the Windows API. This struct is
+// used internally with NtQuerySystemInformation call and is not exported. The
+// exported equivalent is SystemProcessorPerformanceInformation.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx
+type _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION struct {
+ IdleTime int64
+ KernelTime int64
+ UserTime int64
+ Reserved1 [2]int64
+ Reserved2 uint32
+}
+
+// NtQuerySystemProcessorPerformanceInformation queries CPU performance
+// information for each CPU. It uses the NtQuerySystemInformation function to
+// collect the SystemProcessorPerformanceInformation.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx
+func NtQuerySystemProcessorPerformanceInformation() ([]SystemProcessorPerformanceInformation, error) {
+ // NTSTATUS code for success.
+ // https://msdn.microsoft.com/en-us/library/cc704588.aspx
+ const STATUS_SUCCESS = 0
+
+ // From the _SYSTEM_INFORMATION_CLASS enum.
+ // http://processhacker.sourceforge.net/doc/ntexapi_8h.html#ad5d815b48e8f4da1ef2eb7a2f18a54e0
+ const systemProcessorPerformanceInformation = 8
+
+ // Create a buffer large enough to hold an entry for each processor.
+ b := make([]byte, runtime.NumCPU()*sizeofSystemProcessorPerformanceInformation)
+
+ // Query the performance information. Note that this function uses 0 to
+ // indicate success. Most other Windows functions use non-zero for success.
+ var returnLength uint32
+ ntStatus, _ := _NtQuerySystemInformation(systemProcessorPerformanceInformation, &b[0], uint32(len(b)), &returnLength)
+ if ntStatus != STATUS_SUCCESS {
+ return nil, errors.Errorf("NtQuerySystemInformation failed, NTSTATUS=0x%X, bufLength=%v, returnLength=%v", ntStatus, len(b), returnLength)
+ }
+
+ return readSystemProcessorPerformanceInformationBuffer(b)
+}
+
+// readSystemProcessorPerformanceInformationBuffer reads from a buffer
+// containing SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION data. The buffer should
+// contain one entry for each CPU.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx
+func readSystemProcessorPerformanceInformationBuffer(b []byte) ([]SystemProcessorPerformanceInformation, error) {
+ n := len(b) / sizeofSystemProcessorPerformanceInformation
+ r := bytes.NewReader(b)
+
+ rtn := make([]SystemProcessorPerformanceInformation, 0, n)
+ for i := 0; i < n; i++ {
+ _, err := r.Seek(int64(i*sizeofSystemProcessorPerformanceInformation), io.SeekStart)
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to seek to cpuN=%v in buffer", i)
+ }
+
+ times := make([]uint64, 3)
+ for j := range times {
+ err := binary.Read(r, binary.LittleEndian, &times[j])
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed reading cpu times for cpuN=%v", i)
+ }
+ }
+
+ idleTime := time.Duration(times[0] * 100)
+ kernelTime := time.Duration(times[1] * 100)
+ userTime := time.Duration(times[2] * 100)
+
+ rtn = append(rtn, SystemProcessorPerformanceInformation{
+ IdleTime: idleTime,
+ KernelTime: kernelTime - idleTime, // Subtract out idle time from kernel time.
+ UserTime: userTime,
+ })
+ }
+
+ return rtn, nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/privileges.go b/vendor/github.com/elastic/gosigar/sys/windows/privileges.go
new file mode 100644
index 000000000..28c78fd22
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/privileges.go
@@ -0,0 +1,272 @@
+// +build windows
+
+package windows
+
+import (
+ "bytes"
+ "encoding/binary"
+ "encoding/json"
+ "fmt"
+ "runtime"
+ "strings"
+ "sync"
+ "syscall"
+
+ "github.com/pkg/errors"
+ "golang.org/x/sys/windows"
+)
+
+// Cache of privilege names to LUIDs.
+var (
+ privNames = make(map[string]int64)
+ privNameMutex sync.Mutex
+)
+
+const (
+ // SeDebugPrivilege is the name of the privilege used to debug programs.
+ SeDebugPrivilege = "SeDebugPrivilege"
+)
+
+// Errors returned by AdjustTokenPrivileges.
+const (
+ ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300
+)
+
+// Attribute bits for privileges.
+const (
+ _SE_PRIVILEGE_ENABLED_BY_DEFAULT uint32 = 0x00000001
+ _SE_PRIVILEGE_ENABLED uint32 = 0x00000002
+ _SE_PRIVILEGE_REMOVED uint32 = 0x00000004
+ _SE_PRIVILEGE_USED_FOR_ACCESS uint32 = 0x80000000
+)
+
+// Privilege contains information about a single privilege associated with a
+// Token.
+type Privilege struct {
+ LUID int64 `json:"-"` // Locally unique identifier (guaranteed only until the system is restarted).
+ Name string `json:"-"`
+ EnabledByDefault bool `json:"enabled_by_default,omitempty"`
+ Enabled bool `json:"enabled"`
+ Removed bool `json:"removed,omitempty"`
+ Used bool `json:"used,omitempty"`
+}
+
+func (p Privilege) String() string {
+ var buf bytes.Buffer
+ buf.WriteString(p.Name)
+ buf.WriteString("=(")
+
+ opts := make([]string, 0, 4)
+ if p.EnabledByDefault {
+ opts = append(opts, "Default")
+ }
+ if p.Enabled {
+ opts = append(opts, "Enabled")
+ }
+ if !p.EnabledByDefault && !p.Enabled {
+ opts = append(opts, "Disabled")
+ }
+ if p.Removed {
+ opts = append(opts, "Removed")
+ }
+ if p.Used {
+ opts = append(opts, "Used")
+ }
+
+ buf.WriteString(strings.Join(opts, ", "))
+ buf.WriteString(")")
+
+ // Example: SeDebugPrivilege=(Default, Enabled)
+ return buf.String()
+}
+
+// User represent the information about a Windows account.
+type User struct {
+ SID string
+ Account string
+ Domain string
+ Type uint32
+}
+
+func (u User) String() string {
+ return fmt.Sprintf(`User:%v\%v, SID:%v, Type:%v`, u.Domain, u.Account, u.SID, u.Type)
+}
+
+// DebugInfo contains general debug info about the current process.
+type DebugInfo struct {
+ OSVersion Version // OS version info.
+ Arch string // Architecture of the machine.
+ NumCPU int // Number of CPUs.
+ User User // User that this process is running as.
+ ProcessPrivs map[string]Privilege // Privileges held by the process.
+}
+
+func (d DebugInfo) String() string {
+ bytes, _ := json.Marshal(d)
+ return string(bytes)
+}
+
+// LookupPrivilegeName looks up a privilege name given a LUID value.
+func LookupPrivilegeName(systemName string, luid int64) (string, error) {
+ buf := make([]uint16, 256)
+ bufSize := uint32(len(buf))
+ err := _LookupPrivilegeName(systemName, &luid, &buf[0], &bufSize)
+ if err != nil {
+ return "", errors.Wrapf(err, "LookupPrivilegeName failed for luid=%v", luid)
+ }
+
+ return syscall.UTF16ToString(buf), nil
+}
+
+// mapPrivileges maps privilege names to LUID values.
+func mapPrivileges(names []string) ([]int64, error) {
+ var privileges []int64
+ privNameMutex.Lock()
+ defer privNameMutex.Unlock()
+ for _, name := range names {
+ p, ok := privNames[name]
+ if !ok {
+ err := _LookupPrivilegeValue("", name, &p)
+ if err != nil {
+ return nil, errors.Wrapf(err, "LookupPrivilegeValue failed on '%v'", name)
+ }
+ privNames[name] = p
+ }
+ privileges = append(privileges, p)
+ }
+ return privileges, nil
+}
+
+// EnableTokenPrivileges enables the specified privileges in the given
+// Token. The token must have TOKEN_ADJUST_PRIVILEGES access. If the token
+// does not already contain the privilege it cannot be enabled.
+func EnableTokenPrivileges(token syscall.Token, privileges ...string) error {
+ privValues, err := mapPrivileges(privileges)
+ if err != nil {
+ return err
+ }
+
+ var b bytes.Buffer
+ binary.Write(&b, binary.LittleEndian, uint32(len(privValues)))
+ for _, p := range privValues {
+ binary.Write(&b, binary.LittleEndian, p)
+ binary.Write(&b, binary.LittleEndian, uint32(_SE_PRIVILEGE_ENABLED))
+ }
+
+ success, err := _AdjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(b.Len()), nil, nil)
+ if !success {
+ return err
+ }
+ if err == ERROR_NOT_ALL_ASSIGNED {
+ return errors.Wrap(err, "error not all privileges were assigned")
+ }
+
+ return nil
+}
+
+// GetTokenPrivileges returns a list of privileges associated with a token.
+// The provided token must have at a minimum TOKEN_QUERY access. This is a
+// wrapper around the GetTokenInformation function.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx
+func GetTokenPrivileges(token syscall.Token) (map[string]Privilege, error) {
+ // Determine the required buffer size.
+ var size uint32
+ syscall.GetTokenInformation(token, syscall.TokenPrivileges, nil, 0, &size)
+
+ // This buffer will receive a TOKEN_PRIVILEGE structure.
+ b := bytes.NewBuffer(make([]byte, size))
+ err := syscall.GetTokenInformation(token, syscall.TokenPrivileges, &b.Bytes()[0], uint32(b.Len()), &size)
+ if err != nil {
+ return nil, errors.Wrap(err, "GetTokenInformation failed")
+ }
+
+ var privilegeCount uint32
+ err = binary.Read(b, binary.LittleEndian, &privilegeCount)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to read PrivilegeCount")
+ }
+
+ rtn := make(map[string]Privilege, privilegeCount)
+ for i := 0; i < int(privilegeCount); i++ {
+ var luid int64
+ err = binary.Read(b, binary.LittleEndian, &luid)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to read LUID value")
+ }
+
+ var attributes uint32
+ err = binary.Read(b, binary.LittleEndian, &attributes)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to read attributes")
+ }
+
+ name, err := LookupPrivilegeName("", luid)
+ if err != nil {
+ return nil, errors.Wrapf(err, "LookupPrivilegeName failed for LUID=%v", luid)
+ }
+
+ rtn[name] = Privilege{
+ LUID: luid,
+ Name: name,
+ EnabledByDefault: (attributes & _SE_PRIVILEGE_ENABLED_BY_DEFAULT) > 0,
+ Enabled: (attributes & _SE_PRIVILEGE_ENABLED) > 0,
+ Removed: (attributes & _SE_PRIVILEGE_REMOVED) > 0,
+ Used: (attributes & _SE_PRIVILEGE_USED_FOR_ACCESS) > 0,
+ }
+ }
+
+ return rtn, nil
+}
+
+// GetTokenUser returns the User associated with the given Token.
+func GetTokenUser(token syscall.Token) (User, error) {
+ tokenUser, err := token.GetTokenUser()
+ if err != nil {
+ return User{}, errors.Wrap(err, "GetTokenUser failed")
+ }
+
+ var user User
+ user.SID, err = tokenUser.User.Sid.String()
+ if err != nil {
+ return user, errors.Wrap(err, "ConvertSidToStringSid failed")
+ }
+
+ user.Account, user.Domain, user.Type, err = tokenUser.User.Sid.LookupAccount("")
+ if err != nil {
+ return user, errors.Wrap(err, "LookupAccountSid failed")
+ }
+
+ return user, nil
+}
+
+// GetDebugInfo returns general debug info about the current process.
+func GetDebugInfo() (*DebugInfo, error) {
+ h, err := windows.GetCurrentProcess()
+ if err != nil {
+ return nil, err
+ }
+
+ var token syscall.Token
+ err = syscall.OpenProcessToken(syscall.Handle(h), syscall.TOKEN_QUERY, &token)
+ if err != nil {
+ return nil, err
+ }
+
+ privs, err := GetTokenPrivileges(token)
+ if err != nil {
+ return nil, err
+ }
+
+ user, err := GetTokenUser(token)
+ if err != nil {
+ return nil, err
+ }
+
+ return &DebugInfo{
+ User: user,
+ ProcessPrivs: privs,
+ OSVersion: GetWindowsVersion(),
+ Arch: runtime.GOARCH,
+ NumCPU: runtime.NumCPU(),
+ }, nil
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go b/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go
new file mode 100644
index 000000000..88df0febf
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go
@@ -0,0 +1,385 @@
+package windows
+
+import (
+ "fmt"
+ "syscall"
+ "time"
+ "unsafe"
+
+ "github.com/pkg/errors"
+)
+
+var (
+ sizeofUint32 = 4
+ sizeofProcessEntry32 = uint32(unsafe.Sizeof(ProcessEntry32{}))
+ sizeofProcessMemoryCountersEx = uint32(unsafe.Sizeof(ProcessMemoryCountersEx{}))
+ sizeofMemoryStatusEx = uint32(unsafe.Sizeof(MemoryStatusEx{}))
+)
+
+// Process-specific access rights. Others are declared in the syscall package.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx
+const (
+ PROCESS_QUERY_LIMITED_INFORMATION uint32 = 0x1000
+ PROCESS_VM_READ uint32 = 0x0010
+)
+
+// MAX_PATH is the maximum length for a path in Windows.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
+const MAX_PATH = 260
+
+// DriveType represents a type of drive (removable, fixed, CD-ROM, RAM disk, or
+// network drive).
+type DriveType uint32
+
+// Drive types as returned by GetDriveType.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx
+const (
+ DRIVE_UNKNOWN DriveType = iota
+ DRIVE_NO_ROOT_DIR
+ DRIVE_REMOVABLE
+ DRIVE_FIXED
+ DRIVE_REMOTE
+ DRIVE_CDROM
+ DRIVE_RAMDISK
+)
+
+func (dt DriveType) String() string {
+ names := map[DriveType]string{
+ DRIVE_UNKNOWN: "unknown",
+ DRIVE_NO_ROOT_DIR: "invalid",
+ DRIVE_REMOVABLE: "removable",
+ DRIVE_FIXED: "fixed",
+ DRIVE_REMOTE: "remote",
+ DRIVE_CDROM: "cdrom",
+ DRIVE_RAMDISK: "ramdisk",
+ }
+
+ name, found := names[dt]
+ if !found {
+ return "unknown DriveType value"
+ }
+ return name
+}
+
+// Flags that can be used with CreateToolhelp32Snapshot.
+const (
+ TH32CS_INHERIT uint32 = 0x80000000 // Indicates that the snapshot handle is to be inheritable.
+ TH32CS_SNAPHEAPLIST uint32 = 0x00000001 // Includes all heaps of the process specified in th32ProcessID in the snapshot.
+ TH32CS_SNAPMODULE uint32 = 0x00000008 // Includes all modules of the process specified in th32ProcessID in the snapshot.
+ TH32CS_SNAPMODULE32 uint32 = 0x00000010 // Includes all 32-bit modules of the process specified in th32ProcessID in the snapshot when called from a 64-bit process.
+ TH32CS_SNAPPROCESS uint32 = 0x00000002 // Includes all processes in the system in the snapshot.
+ TH32CS_SNAPTHREAD uint32 = 0x00000004 // Includes all threads in the system in the snapshot.
+)
+
+// ProcessEntry32 is an equivalent representation of PROCESSENTRY32 in the
+// Windows API. It contains a process's information. Do not modify or reorder.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx
+type ProcessEntry32 struct {
+ size uint32
+ CntUsage uint32
+ ProcessID uint32
+ DefaultHeapID uintptr
+ ModuleID uint32
+ CntThreads uint32
+ ParentProcessID uint32
+ PriorityClassBase int32
+ Flags uint32
+ exeFile [MAX_PATH]uint16
+}
+
+// ExeFile returns the name of the executable file for the process. It does
+// not contain the full path.
+func (p ProcessEntry32) ExeFile() string {
+ return syscall.UTF16ToString(p.exeFile[:])
+}
+
+func (p ProcessEntry32) String() string {
+ return fmt.Sprintf("{CntUsage:%v ProcessID:%v DefaultHeapID:%v ModuleID:%v "+
+ "CntThreads:%v ParentProcessID:%v PriorityClassBase:%v Flags:%v ExeFile:%v",
+ p.CntUsage, p.ProcessID, p.DefaultHeapID, p.ModuleID, p.CntThreads,
+ p.ParentProcessID, p.PriorityClassBase, p.Flags, p.ExeFile())
+}
+
+// MemoryStatusEx is an equivalent representation of MEMORYSTATUSEX in the
+// Windows API. It contains information about the current state of both physical
+// and virtual memory, including extended memory.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770
+type MemoryStatusEx struct {
+ length uint32
+ MemoryLoad uint32
+ TotalPhys uint64
+ AvailPhys uint64
+ TotalPageFile uint64
+ AvailPageFile uint64
+ TotalVirtual uint64
+ AvailVirtual uint64
+ AvailExtendedVirtual uint64
+}
+
+// ProcessMemoryCountersEx is an equivalent representation of
+// PROCESS_MEMORY_COUNTERS_EX in the Windows API.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684874(v=vs.85).aspx
+type ProcessMemoryCountersEx struct {
+ cb uint32
+ PageFaultCount uint32
+ PeakWorkingSetSize uintptr
+ WorkingSetSize uintptr
+ QuotaPeakPagedPoolUsage uintptr
+ QuotaPagedPoolUsage uintptr
+ QuotaPeakNonPagedPoolUsage uintptr
+ QuotaNonPagedPoolUsage uintptr
+ PagefileUsage uintptr
+ PeakPagefileUsage uintptr
+ PrivateUsage uintptr
+}
+
+// GetLogicalDriveStrings returns a list of drives in the system.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364975(v=vs.85).aspx
+func GetLogicalDriveStrings() ([]string, error) {
+ // Determine the size of the buffer required to receive all drives.
+ bufferLength, err := _GetLogicalDriveStringsW(0, nil)
+ if err != nil {
+ return nil, errors.Wrap(err, "GetLogicalDriveStringsW failed to get buffer length")
+ }
+ if bufferLength < 0 {
+ return nil, errors.New("GetLogicalDriveStringsW returned an invalid buffer length")
+ }
+
+ buffer := make([]uint16, bufferLength)
+ _, err = _GetLogicalDriveStringsW(uint32(len(buffer)), &buffer[0])
+ if err != nil {
+ return nil, errors.Wrap(err, "GetLogicalDriveStringsW failed")
+ }
+
+ // Split the uint16 slice at null-terminators.
+ var startIdx int
+ var drivesUTF16 [][]uint16
+ for i, value := range buffer {
+ if value == 0 {
+ drivesUTF16 = append(drivesUTF16, buffer[startIdx:i])
+ startIdx = i + 1
+ }
+ }
+
+ // Convert the utf16 slices to strings.
+ drives := make([]string, 0, len(drivesUTF16))
+ for _, driveUTF16 := range drivesUTF16 {
+ if len(driveUTF16) > 0 {
+ drives = append(drives, syscall.UTF16ToString(driveUTF16))
+ }
+ }
+
+ return drives, nil
+}
+
+// GlobalMemoryStatusEx retrieves information about the system's current usage
+// of both physical and virtual memory.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx
+func GlobalMemoryStatusEx() (MemoryStatusEx, error) {
+ memoryStatusEx := MemoryStatusEx{length: sizeofMemoryStatusEx}
+ err := _GlobalMemoryStatusEx(&memoryStatusEx)
+ if err != nil {
+ return MemoryStatusEx{}, errors.Wrap(err, "GlobalMemoryStatusEx failed")
+ }
+
+ return memoryStatusEx, nil
+}
+
+// GetProcessMemoryInfo retrieves information about the memory usage of the
+// specified process.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx
+func GetProcessMemoryInfo(handle syscall.Handle) (ProcessMemoryCountersEx, error) {
+ processMemoryCountersEx := ProcessMemoryCountersEx{cb: sizeofProcessMemoryCountersEx}
+ err := _GetProcessMemoryInfo(handle, &processMemoryCountersEx, processMemoryCountersEx.cb)
+ if err != nil {
+ return ProcessMemoryCountersEx{}, errors.Wrap(err, "GetProcessMemoryInfo failed")
+ }
+
+ return processMemoryCountersEx, nil
+}
+
+// GetProcessImageFileName Retrieves the name of the executable file for the
+// specified process.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683217(v=vs.85).aspx
+func GetProcessImageFileName(handle syscall.Handle) (string, error) {
+ buffer := make([]uint16, MAX_PATH)
+ _, err := _GetProcessImageFileName(handle, &buffer[0], uint32(len(buffer)))
+ if err != nil {
+ return "", errors.Wrap(err, "GetProcessImageFileName failed")
+ }
+
+ return syscall.UTF16ToString(buffer), nil
+}
+
+// GetSystemTimes retrieves system timing information. On a multiprocessor
+// system, the values returned are the sum of the designated times across all
+// processors. The returned kernel time does not include the system idle time.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724400(v=vs.85).aspx
+func GetSystemTimes() (idle, kernel, user time.Duration, err error) {
+ var idleTime, kernelTime, userTime syscall.Filetime
+ err = _GetSystemTimes(&idleTime, &kernelTime, &userTime)
+ if err != nil {
+ return 0, 0, 0, errors.Wrap(err, "GetSystemTimes failed")
+ }
+
+ idle = FiletimeToDuration(&idleTime)
+ kernel = FiletimeToDuration(&kernelTime) // Kernel time includes idle time so we subtract it out.
+ user = FiletimeToDuration(&userTime)
+
+ return idle, kernel - idle, user, nil
+}
+
+// FiletimeToDuration converts a Filetime to a time.Duration. Do not use this
+// method to convert a Filetime to an actual clock time, for that use
+// Filetime.Nanosecond().
+func FiletimeToDuration(ft *syscall.Filetime) time.Duration {
+ n := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals
+ return time.Duration(n * 100)
+}
+
+// GetDriveType Determines whether a disk drive is a removable, fixed, CD-ROM,
+// RAM disk, or network drive. A trailing backslash is required on the
+// rootPathName.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939
+func GetDriveType(rootPathName string) (DriveType, error) {
+ rootPathNamePtr, err := syscall.UTF16PtrFromString(rootPathName)
+ if err != nil {
+ return DRIVE_UNKNOWN, errors.Wrapf(err, "UTF16PtrFromString failed for rootPathName=%v", rootPathName)
+ }
+
+ dt, err := _GetDriveType(rootPathNamePtr)
+ if err != nil {
+ return DRIVE_UNKNOWN, errors.Wrapf(err, "GetDriveType failed for rootPathName=%v", rootPathName)
+ }
+
+ return dt, nil
+}
+
+// EnumProcesses retrieves the process identifier for each process object in the
+// system. This function can return a max of 65536 PIDs. If there are more
+// processes than that then this will not return them all.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682629(v=vs.85).aspx
+func EnumProcesses() ([]uint32, error) {
+ enumProcesses := func(size int) ([]uint32, error) {
+ var (
+ pids = make([]uint32, size)
+ sizeBytes = len(pids) * sizeofUint32
+ bytesWritten uint32
+ )
+
+ err := _EnumProcesses(&pids[0], uint32(sizeBytes), &bytesWritten)
+
+ pidsWritten := int(bytesWritten) / sizeofUint32
+ if int(bytesWritten)%sizeofUint32 != 0 || pidsWritten > len(pids) {
+ return nil, errors.Errorf("EnumProcesses returned an invalid bytesWritten value of %v", bytesWritten)
+ }
+ pids = pids[:pidsWritten]
+
+ return pids, err
+ }
+
+ // Retry the EnumProcesses call with larger arrays if needed.
+ size := 2048
+ var pids []uint32
+ for tries := 0; tries < 5; tries++ {
+ var err error
+ pids, err = enumProcesses(size)
+ if err != nil {
+ return nil, errors.Wrap(err, "EnumProcesses failed")
+ }
+
+ if len(pids) < size {
+ break
+ }
+
+ // Increase the size the pids array and retry the enumProcesses call
+ // because the array wasn't large enough to hold all of the processes.
+ size *= 2
+ }
+
+ return pids, nil
+}
+
+// GetDiskFreeSpaceEx retrieves information about the amount of space that is
+// available on a disk volume, which is the total amount of space, the total
+// amount of free space, and the total amount of free space available to the
+// user that is associated with the calling thread.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx
+func GetDiskFreeSpaceEx(directoryName string) (freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64, err error) {
+ directoryNamePtr, err := syscall.UTF16PtrFromString(directoryName)
+ if err != nil {
+ return 0, 0, 0, errors.Wrapf(err, "UTF16PtrFromString failed for directoryName=%v", directoryName)
+ }
+
+ err = _GetDiskFreeSpaceEx(directoryNamePtr, &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes)
+ if err != nil {
+ return 0, 0, 0, err
+ }
+
+ return freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, nil
+}
+
+// CreateToolhelp32Snapshot takes a snapshot of the specified processes, as well
+// as the heaps, modules, and threads used by these processes.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
+func CreateToolhelp32Snapshot(flags, pid uint32) (syscall.Handle, error) {
+ h, err := _CreateToolhelp32Snapshot(flags, pid)
+ if err != nil {
+ return syscall.InvalidHandle, err
+ }
+ if h == syscall.InvalidHandle {
+ return syscall.InvalidHandle, syscall.GetLastError()
+ }
+
+ return h, nil
+}
+
+// Process32First retrieves information about the first process encountered in a
+// system snapshot.
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834
+func Process32First(handle syscall.Handle) (ProcessEntry32, error) {
+ processEntry32 := ProcessEntry32{size: sizeofProcessEntry32}
+ err := _Process32First(handle, &processEntry32)
+ if err != nil {
+ return ProcessEntry32{}, errors.Wrap(err, "Process32First failed")
+ }
+
+ return processEntry32, nil
+}
+
+// Process32Next retrieves information about the next process recorded in a
+// system snapshot. When there are no more processes to iterate then
+// syscall.ERROR_NO_MORE_FILES is returned (use errors.Cause() to unwrap).
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836
+func Process32Next(handle syscall.Handle) (ProcessEntry32, error) {
+ processEntry32 := ProcessEntry32{size: sizeofProcessEntry32}
+ err := _Process32Next(handle, &processEntry32)
+ if err != nil {
+ return ProcessEntry32{}, errors.Wrap(err, "Process32Next failed")
+ }
+
+ return processEntry32, nil
+}
+
+// Use "GOOS=windows go generate -v -x ." to generate the source.
+
+// Add -trace to enable debug prints around syscalls.
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
+
+// Windows API calls
+//sys _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) = kernel32.GlobalMemoryStatusEx
+//sys _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) = kernel32.GetLogicalDriveStringsW
+//sys _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) = psapi.GetProcessMemoryInfo
+//sys _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) = psapi.GetProcessImageFileNameW
+//sys _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) = kernel32.GetSystemTimes
+//sys _GetDriveType(rootPathName *uint16) (dt DriveType, err error) = kernel32.GetDriveTypeW
+//sys _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses
+//sys _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = kernel32.GetDiskFreeSpaceExW
+//sys _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32FirstW
+//sys _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32NextW
+//sys _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) = kernel32.CreateToolhelp32Snapshot
+//sys _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQuerySystemInformation
+//sys _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQueryInformationProcess
+//sys _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW
+//sys _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) = advapi32.LookupPrivilegeValueW
+//sys _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/version.go b/vendor/github.com/elastic/gosigar/sys/windows/version.go
new file mode 100644
index 000000000..d0bca89c1
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/version.go
@@ -0,0 +1,43 @@
+// +build windows
+
+package windows
+
+import (
+ "fmt"
+ "syscall"
+)
+
+// Version identifies a Windows version by major, minor, and build number.
+type Version struct {
+ Major int
+ Minor int
+ Build int
+}
+
+// GetWindowsVersion returns the Windows version information. Applications not
+// manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version
+// value (6.2).
+//
+// For a table of version numbers see:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx
+func GetWindowsVersion() Version {
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
+ ver, err := syscall.GetVersion()
+ if err != nil {
+ // GetVersion should never return an error.
+ panic(fmt.Errorf("GetVersion failed: %v", err))
+ }
+
+ return Version{
+ Major: int(ver & 0xFF),
+ Minor: int(ver >> 8 & 0xFF),
+ Build: int(ver >> 16),
+ }
+}
+
+// IsWindowsVistaOrGreater returns true if the Windows version is Vista or
+// greater.
+func (v Version) IsWindowsVistaOrGreater() bool {
+ // Vista is 6.0.
+ return v.Major >= 6 && v.Minor >= 0
+}
diff --git a/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go b/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go
new file mode 100644
index 000000000..53fae4e3b
--- /dev/null
+++ b/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go
@@ -0,0 +1,260 @@
+// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
+
+package windows
+
+import "unsafe"
+import "syscall"
+
+var _ unsafe.Pointer
+
+var (
+ modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+ modpsapi = syscall.NewLazyDLL("psapi.dll")
+ modntdll = syscall.NewLazyDLL("ntdll.dll")
+ modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
+
+ procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
+ procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW")
+ procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo")
+ procGetProcessImageFileNameW = modpsapi.NewProc("GetProcessImageFileNameW")
+ procGetSystemTimes = modkernel32.NewProc("GetSystemTimes")
+ procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW")
+ procEnumProcesses = modpsapi.NewProc("EnumProcesses")
+ procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW")
+ procProcess32FirstW = modkernel32.NewProc("Process32FirstW")
+ procProcess32NextW = modkernel32.NewProc("Process32NextW")
+ procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
+ procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation")
+ procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess")
+ procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW")
+ procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW")
+ procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges")
+)
+
+func _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) {
+ r1, _, e1 := syscall.Syscall(procGlobalMemoryStatusEx.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0)
+ length = uint32(r0)
+ if length == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(psmemCounters)), uintptr(cb))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetProcessImageFileNameW.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(outImageFileName)), uintptr(size))
+ length = uint32(r0)
+ if length == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetSystemTimes.Addr(), 3, uintptr(unsafe.Pointer(idleTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetDriveType(rootPathName *uint16) (dt DriveType, err error) {
+ r0, _, e1 := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0)
+ dt = DriveType(r0)
+ if dt == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(processIds)), uintptr(sizeBytes), uintptr(unsafe.Pointer(bytesReturned)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) {
+ r1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailable)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) {
+ r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) {
+ r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processID), 0)
+ handle = syscall.Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) {
+ r0, _, e1 := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInformationClass), uintptr(unsafe.Pointer(systemInformation)), uintptr(systemInformationLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)
+ ntstatus = uint32(r0)
+ if ntstatus == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) {
+ r0, _, e1 := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInformationClass), uintptr(unsafe.Pointer(processInformation)), uintptr(processInformationLength), uintptr(unsafe.Pointer(returnLength)), 0)
+ ntstatus = uint32(r0)
+ if ntstatus == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(systemName)
+ if err != nil {
+ return
+ }
+ return __LookupPrivilegeName(_p0, luid, buffer, size)
+}
+
+func __LookupPrivilegeName(systemName *uint16, luid *int64, buffer *uint16, size *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(systemName)
+ if err != nil {
+ return
+ }
+ var _p1 *uint16
+ _p1, err = syscall.UTF16PtrFromString(name)
+ if err != nil {
+ return
+ }
+ return __LookupPrivilegeValue(_p0, _p1, luid)
+}
+
+func __LookupPrivilegeValue(systemName *uint16, name *uint16, luid *int64) (err error) {
+ r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {
+ var _p0 uint32
+ if releaseAll {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize)))
+ success = r0 != 0
+ if true {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/ChangeLog.md b/vendor/github.com/go-ole/go-ole/ChangeLog.md
new file mode 100644
index 000000000..4ba6a8c64
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/ChangeLog.md
@@ -0,0 +1,49 @@
+# Version 1.x.x
+
+* **Add more test cases and reference new test COM server project.** (Placeholder for future additions)
+
+# Version 1.2.0-alphaX
+
+**Minimum supported version is now Go 1.4. Go 1.1 support is deprecated, but should still build.**
+
+ * Added CI configuration for Travis-CI and AppVeyor.
+ * Added test InterfaceID and ClassID for the COM Test Server project.
+ * Added more inline documentation (#83).
+ * Added IEnumVARIANT implementation (#88).
+ * Added IEnumVARIANT test cases (#99, #100, #101).
+ * Added support for retrieving `time.Time` from VARIANT (#92).
+ * Added test case for IUnknown (#64).
+ * Added test case for IDispatch (#64).
+ * Added test cases for scalar variants (#64, #76).
+
+# Version 1.1.1
+
+ * Fixes for Linux build.
+ * Fixes for Windows build.
+
+# Version 1.1.0
+
+The change to provide building on all platforms is a new feature. The increase in minor version reflects that and allows those who wish to stay on 1.0.x to continue to do so. Support for 1.0.x will be limited to bug fixes.
+
+ * Move GUID out of variables.go into its own file to make new documentation available.
+ * Move OleError out of ole.go into its own file to make new documentation available.
+ * Add documentation to utility functions.
+ * Add documentation to variant receiver functions.
+ * Add documentation to ole structures.
+ * Make variant available to other systems outside of Windows.
+ * Make OLE structures available to other systems outside of Windows.
+
+## New Features
+
+ * Library should now be built on all platforms supported by Go. Library will NOOP on any platform that is not Windows.
+ * More functions are now documented and available on godoc.org.
+
+# Version 1.0.1
+
+ 1. Fix package references from repository location change.
+
+# Version 1.0.0
+
+This version is stable enough for use. The COM API is still incomplete, but provides enough functionality for accessing COM servers using IDispatch interface.
+
+There is no changelog for this version. Check commits for history.
diff --git a/vendor/github.com/go-ole/go-ole/LICENSE b/vendor/github.com/go-ole/go-ole/LICENSE
new file mode 100644
index 000000000..623ec06f9
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright © 2013-2017 Yasuhiro Matsumoto, <mattn.jp@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the “Software”), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/go-ole/go-ole/README.md b/vendor/github.com/go-ole/go-ole/README.md
new file mode 100644
index 000000000..0ea9db33c
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/README.md
@@ -0,0 +1,46 @@
+#Go OLE
+
+[![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28)
+[![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole)
+[![GoDoc](https://godoc.org/github.com/go-ole/go-ole?status.svg)](https://godoc.org/github.com/go-ole/go-ole)
+
+Go bindings for Windows COM using shared libraries instead of cgo.
+
+By Yasuhiro Matsumoto.
+
+## Install
+
+To experiment with go-ole, you can just compile and run the example program:
+
+```
+go get github.com/go-ole/go-ole
+cd /path/to/go-ole/
+go test
+
+cd /path/to/go-ole/example/excel
+go run excel.go
+```
+
+## Continuous Integration
+
+Continuous integration configuration has been added for both Travis-CI and AppVeyor. You will have to add these to your own account for your fork in order for it to run.
+
+**Travis-CI**
+
+Travis-CI was added to check builds on Linux to ensure that `go get` works when cross building. Currently, Travis-CI is not used to test cross-building, but this may be changed in the future. It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server.
+
+**AppVeyor**
+
+AppVeyor is used to build on Windows using the (in-development) test COM server. It is currently only used to test the build and ensure that the code works on Windows. It will be used to register a COM server and then run the test cases based on the test COM server.
+
+The tests currently do run and do pass and this should be maintained with commits.
+
+##Versioning
+
+Go OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch.
+
+This contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed.
+
+##LICENSE
+
+Under the MIT License: http://mattn.mit-license.org/2013
diff --git a/vendor/github.com/go-ole/go-ole/appveyor.yml b/vendor/github.com/go-ole/go-ole/appveyor.yml
new file mode 100644
index 000000000..0d557ac2f
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/appveyor.yml
@@ -0,0 +1,54 @@
+# Notes:
+# - Minimal appveyor.yml file is an empty file. All sections are optional.
+# - Indent each level of configuration with 2 spaces. Do not use tabs!
+# - All section names are case-sensitive.
+# - Section names should be unique on each level.
+
+version: "1.3.0.{build}-alpha-{branch}"
+
+os: Windows Server 2012 R2
+
+branches:
+ only:
+ - master
+ - v1.2
+ - v1.1
+ - v1.0
+
+skip_tags: true
+
+clone_folder: c:\gopath\src\github.com\go-ole\go-ole
+
+environment:
+ GOPATH: c:\gopath
+ matrix:
+ - GOARCH: amd64
+ GOVERSION: 1.5
+ GOROOT: c:\go
+ DOWNLOADPLATFORM: "x64"
+
+install:
+ - choco install mingw
+ - SET PATH=c:\tools\mingw64\bin;%PATH%
+ # - Download COM Server
+ - ps: Start-FileDownload "https://github.com/go-ole/test-com-server/releases/download/v1.0.2/test-com-server-${env:DOWNLOADPLATFORM}.zip"
+ - 7z e test-com-server-%DOWNLOADPLATFORM%.zip -oc:\gopath\src\github.com\go-ole\go-ole > NUL
+ - c:\gopath\src\github.com\go-ole\go-ole\build\register-assembly.bat
+ # - set
+ - go version
+ - go env
+ - go get -u golang.org/x/tools/cmd/cover
+ - go get -u golang.org/x/tools/cmd/godoc
+ - go get -u golang.org/x/tools/cmd/stringer
+
+build_script:
+ - cd c:\gopath\src\github.com\go-ole\go-ole
+ - go get -v -t ./...
+ - go build
+ - go test -v -cover ./...
+
+# disable automatic tests
+test: off
+
+# disable deployment
+deploy: off
diff --git a/vendor/github.com/go-ole/go-ole/com.go b/vendor/github.com/go-ole/go-ole/com.go
new file mode 100644
index 000000000..75ebbf13f
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/com.go
@@ -0,0 +1,329 @@
+// +build windows
+
+package ole
+
+import (
+ "errors"
+ "syscall"
+ "time"
+ "unicode/utf16"
+ "unsafe"
+)
+
+var (
+ procCoInitialize, _ = modole32.FindProc("CoInitialize")
+ procCoInitializeEx, _ = modole32.FindProc("CoInitializeEx")
+ procCoUninitialize, _ = modole32.FindProc("CoUninitialize")
+ procCoCreateInstance, _ = modole32.FindProc("CoCreateInstance")
+ procCoTaskMemFree, _ = modole32.FindProc("CoTaskMemFree")
+ procCLSIDFromProgID, _ = modole32.FindProc("CLSIDFromProgID")
+ procCLSIDFromString, _ = modole32.FindProc("CLSIDFromString")
+ procStringFromCLSID, _ = modole32.FindProc("StringFromCLSID")
+ procStringFromIID, _ = modole32.FindProc("StringFromIID")
+ procIIDFromString, _ = modole32.FindProc("IIDFromString")
+ procGetUserDefaultLCID, _ = modkernel32.FindProc("GetUserDefaultLCID")
+ procCopyMemory, _ = modkernel32.FindProc("RtlMoveMemory")
+ procVariantInit, _ = modoleaut32.FindProc("VariantInit")
+ procVariantClear, _ = modoleaut32.FindProc("VariantClear")
+ procVariantTimeToSystemTime, _ = modoleaut32.FindProc("VariantTimeToSystemTime")
+ procSysAllocString, _ = modoleaut32.FindProc("SysAllocString")
+ procSysAllocStringLen, _ = modoleaut32.FindProc("SysAllocStringLen")
+ procSysFreeString, _ = modoleaut32.FindProc("SysFreeString")
+ procSysStringLen, _ = modoleaut32.FindProc("SysStringLen")
+ procCreateDispTypeInfo, _ = modoleaut32.FindProc("CreateDispTypeInfo")
+ procCreateStdDispatch, _ = modoleaut32.FindProc("CreateStdDispatch")
+ procGetActiveObject, _ = modoleaut32.FindProc("GetActiveObject")
+
+ procGetMessageW, _ = moduser32.FindProc("GetMessageW")
+ procDispatchMessageW, _ = moduser32.FindProc("DispatchMessageW")
+)
+
+// coInitialize initializes COM library on current thread.
+//
+// MSDN documentation suggests that this function should not be called. Call
+// CoInitializeEx() instead. The reason has to do with threading and this
+// function is only for single-threaded apartments.
+//
+// That said, most users of the library have gotten away with just this
+// function. If you are experiencing threading issues, then use
+// CoInitializeEx().
+func coInitialize() (err error) {
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/ms678543(v=vs.85).aspx
+ // Suggests that no value should be passed to CoInitialized.
+ // Could just be Call() since the parameter is optional. <-- Needs testing to be sure.
+ hr, _, _ := procCoInitialize.Call(uintptr(0))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// coInitializeEx initializes COM library with concurrency model.
+func coInitializeEx(coinit uint32) (err error) {
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx
+ // Suggests that the first parameter is not only optional but should always be NULL.
+ hr, _, _ := procCoInitializeEx.Call(uintptr(0), uintptr(coinit))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// CoInitialize initializes COM library on current thread.
+//
+// MSDN documentation suggests that this function should not be called. Call
+// CoInitializeEx() instead. The reason has to do with threading and this
+// function is only for single-threaded apartments.
+//
+// That said, most users of the library have gotten away with just this
+// function. If you are experiencing threading issues, then use
+// CoInitializeEx().
+func CoInitialize(p uintptr) (err error) {
+ // p is ignored and won't be used.
+ // Avoid any variable not used errors.
+ p = uintptr(0)
+ return coInitialize()
+}
+
+// CoInitializeEx initializes COM library with concurrency model.
+func CoInitializeEx(p uintptr, coinit uint32) (err error) {
+ // Avoid any variable not used errors.
+ p = uintptr(0)
+ return coInitializeEx(coinit)
+}
+
+// CoUninitialize uninitializes COM Library.
+func CoUninitialize() {
+ procCoUninitialize.Call()
+}
+
+// CoTaskMemFree frees memory pointer.
+func CoTaskMemFree(memptr uintptr) {
+ procCoTaskMemFree.Call(memptr)
+}
+
+// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier.
+//
+// The Programmatic Identifier must be registered, because it will be looked up
+// in the Windows Registry. The registry entry has the following keys: CLSID,
+// Insertable, Protocol and Shell
+// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx).
+//
+// programID identifies the class id with less precision and is not guaranteed
+// to be unique. These are usually found in the registry under
+// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of
+// "Program.Component.Version" with version being optional.
+//
+// CLSIDFromProgID in Windows API.
+func CLSIDFromProgID(progId string) (clsid *GUID, err error) {
+ var guid GUID
+ lpszProgID := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId)))
+ hr, _, _ := procCLSIDFromProgID.Call(lpszProgID, uintptr(unsafe.Pointer(&guid)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ clsid = &guid
+ return
+}
+
+// CLSIDFromString retrieves Class ID from string representation.
+//
+// This is technically the string version of the GUID and will convert the
+// string to object.
+//
+// CLSIDFromString in Windows API.
+func CLSIDFromString(str string) (clsid *GUID, err error) {
+ var guid GUID
+ lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))
+ hr, _, _ := procCLSIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ clsid = &guid
+ return
+}
+
+// StringFromCLSID returns GUID formated string from GUID object.
+func StringFromCLSID(clsid *GUID) (str string, err error) {
+ var p *uint16
+ hr, _, _ := procStringFromCLSID.Call(uintptr(unsafe.Pointer(clsid)), uintptr(unsafe.Pointer(&p)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ str = LpOleStrToString(p)
+ return
+}
+
+// IIDFromString returns GUID from program ID.
+func IIDFromString(progId string) (clsid *GUID, err error) {
+ var guid GUID
+ lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId)))
+ hr, _, _ := procIIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ clsid = &guid
+ return
+}
+
+// StringFromIID returns GUID formatted string from GUID object.
+func StringFromIID(iid *GUID) (str string, err error) {
+ var p *uint16
+ hr, _, _ := procStringFromIID.Call(uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(&p)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ str = LpOleStrToString(p)
+ return
+}
+
+// CreateInstance of single uninitialized object with GUID.
+func CreateInstance(clsid *GUID, iid *GUID) (unk *IUnknown, err error) {
+ if iid == nil {
+ iid = IID_IUnknown
+ }
+ hr, _, _ := procCoCreateInstance.Call(
+ uintptr(unsafe.Pointer(clsid)),
+ 0,
+ CLSCTX_SERVER,
+ uintptr(unsafe.Pointer(iid)),
+ uintptr(unsafe.Pointer(&unk)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// GetActiveObject retrieves pointer to active object.
+func GetActiveObject(clsid *GUID, iid *GUID) (unk *IUnknown, err error) {
+ if iid == nil {
+ iid = IID_IUnknown
+ }
+ hr, _, _ := procGetActiveObject.Call(
+ uintptr(unsafe.Pointer(clsid)),
+ uintptr(unsafe.Pointer(iid)),
+ uintptr(unsafe.Pointer(&unk)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// VariantInit initializes variant.
+func VariantInit(v *VARIANT) (err error) {
+ hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// VariantClear clears value in Variant settings to VT_EMPTY.
+func VariantClear(v *VARIANT) (err error) {
+ hr, _, _ := procVariantClear.Call(uintptr(unsafe.Pointer(v)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// SysAllocString allocates memory for string and copies string into memory.
+func SysAllocString(v string) (ss *int16) {
+ pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))))
+ ss = (*int16)(unsafe.Pointer(pss))
+ return
+}
+
+// SysAllocStringLen copies up to length of given string returning pointer.
+func SysAllocStringLen(v string) (ss *int16) {
+ utf16 := utf16.Encode([]rune(v + "\x00"))
+ ptr := &utf16[0]
+
+ pss, _, _ := procSysAllocStringLen.Call(uintptr(unsafe.Pointer(ptr)), uintptr(len(utf16)-1))
+ ss = (*int16)(unsafe.Pointer(pss))
+ return
+}
+
+// SysFreeString frees string system memory. This must be called with SysAllocString.
+func SysFreeString(v *int16) (err error) {
+ hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// SysStringLen is the length of the system allocated string.
+func SysStringLen(v *int16) uint32 {
+ l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v)))
+ return uint32(l)
+}
+
+// CreateStdDispatch provides default IDispatch implementation for IUnknown.
+//
+// This handles default IDispatch implementation for objects. It haves a few
+// limitations with only supporting one language. It will also only return
+// default exception codes.
+func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (disp *IDispatch, err error) {
+ hr, _, _ := procCreateStdDispatch.Call(
+ uintptr(unsafe.Pointer(unk)),
+ v,
+ uintptr(unsafe.Pointer(ptinfo)),
+ uintptr(unsafe.Pointer(&disp)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch.
+//
+// This will not handle the full implementation of the interface.
+func CreateDispTypeInfo(idata *INTERFACEDATA) (pptinfo *IUnknown, err error) {
+ hr, _, _ := procCreateDispTypeInfo.Call(
+ uintptr(unsafe.Pointer(idata)),
+ uintptr(GetUserDefaultLCID()),
+ uintptr(unsafe.Pointer(&pptinfo)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// copyMemory moves location of a block of memory.
+func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {
+ procCopyMemory.Call(uintptr(dest), uintptr(src), uintptr(length))
+}
+
+// GetUserDefaultLCID retrieves current user default locale.
+func GetUserDefaultLCID() (lcid uint32) {
+ ret, _, _ := procGetUserDefaultLCID.Call()
+ lcid = uint32(ret)
+ return
+}
+
+// GetMessage in message queue from runtime.
+//
+// This function appears to block. PeekMessage does not block.
+func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, err error) {
+ r0, _, err := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), uintptr(hwnd), uintptr(MsgFilterMin), uintptr(MsgFilterMax))
+ ret = int32(r0)
+ return
+}
+
+// DispatchMessage to window procedure.
+func DispatchMessage(msg *Msg) (ret int32) {
+ r0, _, _ := procDispatchMessageW.Call(uintptr(unsafe.Pointer(msg)))
+ ret = int32(r0)
+ return
+}
+
+// GetVariantDate converts COM Variant Time value to Go time.Time.
+func GetVariantDate(value float64) (time.Time, error) {
+ var st syscall.Systemtime
+ r, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st)))
+ if r != 0 {
+ return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil
+ }
+ return time.Now(), errors.New("Could not convert to time, passing current time.")
+}
diff --git a/vendor/github.com/go-ole/go-ole/com_func.go b/vendor/github.com/go-ole/go-ole/com_func.go
new file mode 100644
index 000000000..425aad323
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/com_func.go
@@ -0,0 +1,174 @@
+// +build !windows
+
+package ole
+
+import (
+ "time"
+ "unsafe"
+)
+
+// coInitialize initializes COM library on current thread.
+//
+// MSDN documentation suggests that this function should not be called. Call
+// CoInitializeEx() instead. The reason has to do with threading and this
+// function is only for single-threaded apartments.
+//
+// That said, most users of the library have gotten away with just this
+// function. If you are experiencing threading issues, then use
+// CoInitializeEx().
+func coInitialize() error {
+ return NewError(E_NOTIMPL)
+}
+
+// coInitializeEx initializes COM library with concurrency model.
+func coInitializeEx(coinit uint32) error {
+ return NewError(E_NOTIMPL)
+}
+
+// CoInitialize initializes COM library on current thread.
+//
+// MSDN documentation suggests that this function should not be called. Call
+// CoInitializeEx() instead. The reason has to do with threading and this
+// function is only for single-threaded apartments.
+//
+// That said, most users of the library have gotten away with just this
+// function. If you are experiencing threading issues, then use
+// CoInitializeEx().
+func CoInitialize(p uintptr) error {
+ return NewError(E_NOTIMPL)
+}
+
+// CoInitializeEx initializes COM library with concurrency model.
+func CoInitializeEx(p uintptr, coinit uint32) error {
+ return NewError(E_NOTIMPL)
+}
+
+// CoUninitialize uninitializes COM Library.
+func CoUninitialize() {}
+
+// CoTaskMemFree frees memory pointer.
+func CoTaskMemFree(memptr uintptr) {}
+
+// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier.
+//
+// The Programmatic Identifier must be registered, because it will be looked up
+// in the Windows Registry. The registry entry has the following keys: CLSID,
+// Insertable, Protocol and Shell
+// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx).
+//
+// programID identifies the class id with less precision and is not guaranteed
+// to be unique. These are usually found in the registry under
+// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of
+// "Program.Component.Version" with version being optional.
+//
+// CLSIDFromProgID in Windows API.
+func CLSIDFromProgID(progId string) (*GUID, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// CLSIDFromString retrieves Class ID from string representation.
+//
+// This is technically the string version of the GUID and will convert the
+// string to object.
+//
+// CLSIDFromString in Windows API.
+func CLSIDFromString(str string) (*GUID, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// StringFromCLSID returns GUID formated string from GUID object.
+func StringFromCLSID(clsid *GUID) (string, error) {
+ return "", NewError(E_NOTIMPL)
+}
+
+// IIDFromString returns GUID from program ID.
+func IIDFromString(progId string) (*GUID, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// StringFromIID returns GUID formatted string from GUID object.
+func StringFromIID(iid *GUID) (string, error) {
+ return "", NewError(E_NOTIMPL)
+}
+
+// CreateInstance of single uninitialized object with GUID.
+func CreateInstance(clsid *GUID, iid *GUID) (*IUnknown, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// GetActiveObject retrieves pointer to active object.
+func GetActiveObject(clsid *GUID, iid *GUID) (*IUnknown, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// VariantInit initializes variant.
+func VariantInit(v *VARIANT) error {
+ return NewError(E_NOTIMPL)
+}
+
+// VariantClear clears value in Variant settings to VT_EMPTY.
+func VariantClear(v *VARIANT) error {
+ return NewError(E_NOTIMPL)
+}
+
+// SysAllocString allocates memory for string and copies string into memory.
+func SysAllocString(v string) *int16 {
+ u := int16(0)
+ return &u
+}
+
+// SysAllocStringLen copies up to length of given string returning pointer.
+func SysAllocStringLen(v string) *int16 {
+ u := int16(0)
+ return &u
+}
+
+// SysFreeString frees string system memory. This must be called with SysAllocString.
+func SysFreeString(v *int16) error {
+ return NewError(E_NOTIMPL)
+}
+
+// SysStringLen is the length of the system allocated string.
+func SysStringLen(v *int16) uint32 {
+ return uint32(0)
+}
+
+// CreateStdDispatch provides default IDispatch implementation for IUnknown.
+//
+// This handles default IDispatch implementation for objects. It haves a few
+// limitations with only supporting one language. It will also only return
+// default exception codes.
+func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (*IDispatch, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch.
+//
+// This will not handle the full implementation of the interface.
+func CreateDispTypeInfo(idata *INTERFACEDATA) (*IUnknown, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// copyMemory moves location of a block of memory.
+func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {}
+
+// GetUserDefaultLCID retrieves current user default locale.
+func GetUserDefaultLCID() uint32 {
+ return uint32(0)
+}
+
+// GetMessage in message queue from runtime.
+//
+// This function appears to block. PeekMessage does not block.
+func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (int32, error) {
+ return int32(0), NewError(E_NOTIMPL)
+}
+
+// DispatchMessage to window procedure.
+func DispatchMessage(msg *Msg) int32 {
+ return int32(0)
+}
+
+func GetVariantDate(value float64) (time.Time, error) {
+ return time.Now(), NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/connect.go b/vendor/github.com/go-ole/go-ole/connect.go
new file mode 100644
index 000000000..b2ac2ec67
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/connect.go
@@ -0,0 +1,192 @@
+package ole
+
+// Connection contains IUnknown for fluent interface interaction.
+//
+// Deprecated. Use oleutil package instead.
+type Connection struct {
+ Object *IUnknown // Access COM
+}
+
+// Initialize COM.
+func (*Connection) Initialize() (err error) {
+ return coInitialize()
+}
+
+// Uninitialize COM.
+func (*Connection) Uninitialize() {
+ CoUninitialize()
+}
+
+// Create IUnknown object based first on ProgId and then from String.
+func (c *Connection) Create(progId string) (err error) {
+ var clsid *GUID
+ clsid, err = CLSIDFromProgID(progId)
+ if err != nil {
+ clsid, err = CLSIDFromString(progId)
+ if err != nil {
+ return
+ }
+ }
+
+ unknown, err := CreateInstance(clsid, IID_IUnknown)
+ if err != nil {
+ return
+ }
+ c.Object = unknown
+
+ return
+}
+
+// Release IUnknown object.
+func (c *Connection) Release() {
+ c.Object.Release()
+}
+
+// Load COM object from list of programIDs or strings.
+func (c *Connection) Load(names ...string) (errors []error) {
+ var tempErrors []error = make([]error, len(names))
+ var numErrors int = 0
+ for _, name := range names {
+ err := c.Create(name)
+ if err != nil {
+ tempErrors = append(tempErrors, err)
+ numErrors += 1
+ continue
+ }
+ break
+ }
+
+ copy(errors, tempErrors[0:numErrors])
+ return
+}
+
+// Dispatch returns Dispatch object.
+func (c *Connection) Dispatch() (object *Dispatch, err error) {
+ dispatch, err := c.Object.QueryInterface(IID_IDispatch)
+ if err != nil {
+ return
+ }
+ object = &Dispatch{dispatch}
+ return
+}
+
+// Dispatch stores IDispatch object.
+type Dispatch struct {
+ Object *IDispatch // Dispatch object.
+}
+
+// Call method on IDispatch with parameters.
+func (d *Dispatch) Call(method string, params ...interface{}) (result *VARIANT, err error) {
+ id, err := d.GetId(method)
+ if err != nil {
+ return
+ }
+
+ result, err = d.Invoke(id, DISPATCH_METHOD, params)
+ return
+}
+
+// MustCall method on IDispatch with parameters.
+func (d *Dispatch) MustCall(method string, params ...interface{}) (result *VARIANT) {
+ id, err := d.GetId(method)
+ if err != nil {
+ panic(err)
+ }
+
+ result, err = d.Invoke(id, DISPATCH_METHOD, params)
+ if err != nil {
+ panic(err)
+ }
+
+ return
+}
+
+// Get property on IDispatch with parameters.
+func (d *Dispatch) Get(name string, params ...interface{}) (result *VARIANT, err error) {
+ id, err := d.GetId(name)
+ if err != nil {
+ return
+ }
+ result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params)
+ return
+}
+
+// MustGet property on IDispatch with parameters.
+func (d *Dispatch) MustGet(name string, params ...interface{}) (result *VARIANT) {
+ id, err := d.GetId(name)
+ if err != nil {
+ panic(err)
+ }
+
+ result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params)
+ if err != nil {
+ panic(err)
+ }
+ return
+}
+
+// Set property on IDispatch with parameters.
+func (d *Dispatch) Set(name string, params ...interface{}) (result *VARIANT, err error) {
+ id, err := d.GetId(name)
+ if err != nil {
+ return
+ }
+ result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params)
+ return
+}
+
+// MustSet property on IDispatch with parameters.
+func (d *Dispatch) MustSet(name string, params ...interface{}) (result *VARIANT) {
+ id, err := d.GetId(name)
+ if err != nil {
+ panic(err)
+ }
+
+ result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params)
+ if err != nil {
+ panic(err)
+ }
+ return
+}
+
+// GetId retrieves ID of name on IDispatch.
+func (d *Dispatch) GetId(name string) (id int32, err error) {
+ var dispid []int32
+ dispid, err = d.Object.GetIDsOfName([]string{name})
+ if err != nil {
+ return
+ }
+ id = dispid[0]
+ return
+}
+
+// GetIds retrieves all IDs of names on IDispatch.
+func (d *Dispatch) GetIds(names ...string) (dispid []int32, err error) {
+ dispid, err = d.Object.GetIDsOfName(names)
+ return
+}
+
+// Invoke IDispatch on DisplayID of dispatch type with parameters.
+//
+// There have been problems where if send cascading params..., it would error
+// out because the parameters would be empty.
+func (d *Dispatch) Invoke(id int32, dispatch int16, params []interface{}) (result *VARIANT, err error) {
+ if len(params) < 1 {
+ result, err = d.Object.Invoke(id, dispatch)
+ } else {
+ result, err = d.Object.Invoke(id, dispatch, params...)
+ }
+ return
+}
+
+// Release IDispatch object.
+func (d *Dispatch) Release() {
+ d.Object.Release()
+}
+
+// Connect initializes COM and attempts to load IUnknown based on given names.
+func Connect(names ...string) (connection *Connection) {
+ connection.Initialize()
+ connection.Load(names...)
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/constants.go b/vendor/github.com/go-ole/go-ole/constants.go
new file mode 100644
index 000000000..fd0c6d74b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/constants.go
@@ -0,0 +1,153 @@
+package ole
+
+const (
+ CLSCTX_INPROC_SERVER = 1
+ CLSCTX_INPROC_HANDLER = 2
+ CLSCTX_LOCAL_SERVER = 4
+ CLSCTX_INPROC_SERVER16 = 8
+ CLSCTX_REMOTE_SERVER = 16
+ CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER
+ CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER
+ CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER
+)
+
+const (
+ COINIT_APARTMENTTHREADED = 0x2
+ COINIT_MULTITHREADED = 0x0
+ COINIT_DISABLE_OLE1DDE = 0x4
+ COINIT_SPEED_OVER_MEMORY = 0x8
+)
+
+const (
+ DISPATCH_METHOD = 1
+ DISPATCH_PROPERTYGET = 2
+ DISPATCH_PROPERTYPUT = 4
+ DISPATCH_PROPERTYPUTREF = 8
+)
+
+const (
+ S_OK = 0x00000000
+ E_UNEXPECTED = 0x8000FFFF
+ E_NOTIMPL = 0x80004001
+ E_OUTOFMEMORY = 0x8007000E
+ E_INVALIDARG = 0x80070057
+ E_NOINTERFACE = 0x80004002
+ E_POINTER = 0x80004003
+ E_HANDLE = 0x80070006
+ E_ABORT = 0x80004004
+ E_FAIL = 0x80004005
+ E_ACCESSDENIED = 0x80070005
+ E_PENDING = 0x8000000A
+
+ CO_E_CLASSSTRING = 0x800401F3
+)
+
+const (
+ CC_FASTCALL = iota
+ CC_CDECL
+ CC_MSCPASCAL
+ CC_PASCAL = CC_MSCPASCAL
+ CC_MACPASCAL
+ CC_STDCALL
+ CC_FPFASTCALL
+ CC_SYSCALL
+ CC_MPWCDECL
+ CC_MPWPASCAL
+ CC_MAX = CC_MPWPASCAL
+)
+
+type VT uint16
+
+const (
+ VT_EMPTY VT = 0x0
+ VT_NULL VT = 0x1
+ VT_I2 VT = 0x2
+ VT_I4 VT = 0x3
+ VT_R4 VT = 0x4
+ VT_R8 VT = 0x5
+ VT_CY VT = 0x6
+ VT_DATE VT = 0x7
+ VT_BSTR VT = 0x8
+ VT_DISPATCH VT = 0x9
+ VT_ERROR VT = 0xa
+ VT_BOOL VT = 0xb
+ VT_VARIANT VT = 0xc
+ VT_UNKNOWN VT = 0xd
+ VT_DECIMAL VT = 0xe
+ VT_I1 VT = 0x10
+ VT_UI1 VT = 0x11
+ VT_UI2 VT = 0x12
+ VT_UI4 VT = 0x13
+ VT_I8 VT = 0x14
+ VT_UI8 VT = 0x15
+ VT_INT VT = 0x16
+ VT_UINT VT = 0x17
+ VT_VOID VT = 0x18
+ VT_HRESULT VT = 0x19
+ VT_PTR VT = 0x1a
+ VT_SAFEARRAY VT = 0x1b
+ VT_CARRAY VT = 0x1c
+ VT_USERDEFINED VT = 0x1d
+ VT_LPSTR VT = 0x1e
+ VT_LPWSTR VT = 0x1f
+ VT_RECORD VT = 0x24
+ VT_INT_PTR VT = 0x25
+ VT_UINT_PTR VT = 0x26
+ VT_FILETIME VT = 0x40
+ VT_BLOB VT = 0x41
+ VT_STREAM VT = 0x42
+ VT_STORAGE VT = 0x43
+ VT_STREAMED_OBJECT VT = 0x44
+ VT_STORED_OBJECT VT = 0x45
+ VT_BLOB_OBJECT VT = 0x46
+ VT_CF VT = 0x47
+ VT_CLSID VT = 0x48
+ VT_BSTR_BLOB VT = 0xfff
+ VT_VECTOR VT = 0x1000
+ VT_ARRAY VT = 0x2000
+ VT_BYREF VT = 0x4000
+ VT_RESERVED VT = 0x8000
+ VT_ILLEGAL VT = 0xffff
+ VT_ILLEGALMASKED VT = 0xfff
+ VT_TYPEMASK VT = 0xfff
+)
+
+const (
+ DISPID_UNKNOWN = -1
+ DISPID_VALUE = 0
+ DISPID_PROPERTYPUT = -3
+ DISPID_NEWENUM = -4
+ DISPID_EVALUATE = -5
+ DISPID_CONSTRUCTOR = -6
+ DISPID_DESTRUCTOR = -7
+ DISPID_COLLECT = -8
+)
+
+const (
+ TKIND_ENUM = 1
+ TKIND_RECORD = 2
+ TKIND_MODULE = 3
+ TKIND_INTERFACE = 4
+ TKIND_DISPATCH = 5
+ TKIND_COCLASS = 6
+ TKIND_ALIAS = 7
+ TKIND_UNION = 8
+ TKIND_MAX = 9
+)
+
+// Safe Array Feature Flags
+
+const (
+ FADF_AUTO = 0x0001
+ FADF_STATIC = 0x0002
+ FADF_EMBEDDED = 0x0004
+ FADF_FIXEDSIZE = 0x0010
+ FADF_RECORD = 0x0020
+ FADF_HAVEIID = 0x0040
+ FADF_HAVEVARTYPE = 0x0080
+ FADF_BSTR = 0x0100
+ FADF_UNKNOWN = 0x0200
+ FADF_DISPATCH = 0x0400
+ FADF_VARIANT = 0x0800
+ FADF_RESERVED = 0xF008
+)
diff --git a/vendor/github.com/go-ole/go-ole/error.go b/vendor/github.com/go-ole/go-ole/error.go
new file mode 100644
index 000000000..096b456d3
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/error.go
@@ -0,0 +1,51 @@
+package ole
+
+// OleError stores COM errors.
+type OleError struct {
+ hr uintptr
+ description string
+ subError error
+}
+
+// NewError creates new error with HResult.
+func NewError(hr uintptr) *OleError {
+ return &OleError{hr: hr}
+}
+
+// NewErrorWithDescription creates new COM error with HResult and description.
+func NewErrorWithDescription(hr uintptr, description string) *OleError {
+ return &OleError{hr: hr, description: description}
+}
+
+// NewErrorWithSubError creates new COM error with parent error.
+func NewErrorWithSubError(hr uintptr, description string, err error) *OleError {
+ return &OleError{hr: hr, description: description, subError: err}
+}
+
+// Code is the HResult.
+func (v *OleError) Code() uintptr {
+ return uintptr(v.hr)
+}
+
+// String description, either manually set or format message with error code.
+func (v *OleError) String() string {
+ if v.description != "" {
+ return errstr(int(v.hr)) + " (" + v.description + ")"
+ }
+ return errstr(int(v.hr))
+}
+
+// Error implements error interface.
+func (v *OleError) Error() string {
+ return v.String()
+}
+
+// Description retrieves error summary, if there is one.
+func (v *OleError) Description() string {
+ return v.description
+}
+
+// SubError returns parent error, if there is one.
+func (v *OleError) SubError() error {
+ return v.subError
+}
diff --git a/vendor/github.com/go-ole/go-ole/error_func.go b/vendor/github.com/go-ole/go-ole/error_func.go
new file mode 100644
index 000000000..8a2ffaa27
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/error_func.go
@@ -0,0 +1,8 @@
+// +build !windows
+
+package ole
+
+// errstr converts error code to string.
+func errstr(errno int) string {
+ return ""
+}
diff --git a/vendor/github.com/go-ole/go-ole/error_windows.go b/vendor/github.com/go-ole/go-ole/error_windows.go
new file mode 100644
index 000000000..d0e8e6859
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/error_windows.go
@@ -0,0 +1,24 @@
+// +build windows
+
+package ole
+
+import (
+ "fmt"
+ "syscall"
+ "unicode/utf16"
+)
+
+// errstr converts error code to string.
+func errstr(errno int) string {
+ // ask windows for the remaining errors
+ var flags uint32 = syscall.FORMAT_MESSAGE_FROM_SYSTEM | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS
+ b := make([]uint16, 300)
+ n, err := syscall.FormatMessage(flags, 0, uint32(errno), 0, b, nil)
+ if err != nil {
+ return fmt.Sprintf("error %d (FormatMessage failed with: %v)", errno, err)
+ }
+ // trim terminating \r and \n
+ for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- {
+ }
+ return string(utf16.Decode(b[:n]))
+}
diff --git a/vendor/github.com/go-ole/go-ole/guid.go b/vendor/github.com/go-ole/go-ole/guid.go
new file mode 100644
index 000000000..8d20f68fb
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/guid.go
@@ -0,0 +1,284 @@
+package ole
+
+var (
+ // IID_NULL is null Interface ID, used when no other Interface ID is known.
+ IID_NULL = NewGUID("{00000000-0000-0000-0000-000000000000}")
+
+ // IID_IUnknown is for IUnknown interfaces.
+ IID_IUnknown = NewGUID("{00000000-0000-0000-C000-000000000046}")
+
+ // IID_IDispatch is for IDispatch interfaces.
+ IID_IDispatch = NewGUID("{00020400-0000-0000-C000-000000000046}")
+
+ // IID_IEnumVariant is for IEnumVariant interfaces
+ IID_IEnumVariant = NewGUID("{00020404-0000-0000-C000-000000000046}")
+
+ // IID_IConnectionPointContainer is for IConnectionPointContainer interfaces.
+ IID_IConnectionPointContainer = NewGUID("{B196B284-BAB4-101A-B69C-00AA00341D07}")
+
+ // IID_IConnectionPoint is for IConnectionPoint interfaces.
+ IID_IConnectionPoint = NewGUID("{B196B286-BAB4-101A-B69C-00AA00341D07}")
+
+ // IID_IInspectable is for IInspectable interfaces.
+ IID_IInspectable = NewGUID("{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}")
+
+ // IID_IProvideClassInfo is for IProvideClassInfo interfaces.
+ IID_IProvideClassInfo = NewGUID("{B196B283-BAB4-101A-B69C-00AA00341D07}")
+)
+
+// These are for testing and not part of any library.
+var (
+ // IID_ICOMTestString is for ICOMTestString interfaces.
+ //
+ // {E0133EB4-C36F-469A-9D3D-C66B84BE19ED}
+ IID_ICOMTestString = NewGUID("{E0133EB4-C36F-469A-9D3D-C66B84BE19ED}")
+
+ // IID_ICOMTestInt8 is for ICOMTestInt8 interfaces.
+ //
+ // {BEB06610-EB84-4155-AF58-E2BFF53680B4}
+ IID_ICOMTestInt8 = NewGUID("{BEB06610-EB84-4155-AF58-E2BFF53680B4}")
+
+ // IID_ICOMTestInt16 is for ICOMTestInt16 interfaces.
+ //
+ // {DAA3F9FA-761E-4976-A860-8364CE55F6FC}
+ IID_ICOMTestInt16 = NewGUID("{DAA3F9FA-761E-4976-A860-8364CE55F6FC}")
+
+ // IID_ICOMTestInt32 is for ICOMTestInt32 interfaces.
+ //
+ // {E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}
+ IID_ICOMTestInt32 = NewGUID("{E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}")
+
+ // IID_ICOMTestInt64 is for ICOMTestInt64 interfaces.
+ //
+ // {8D437CBC-B3ED-485C-BC32-C336432A1623}
+ IID_ICOMTestInt64 = NewGUID("{8D437CBC-B3ED-485C-BC32-C336432A1623}")
+
+ // IID_ICOMTestFloat is for ICOMTestFloat interfaces.
+ //
+ // {BF1ED004-EA02-456A-AA55-2AC8AC6B054C}
+ IID_ICOMTestFloat = NewGUID("{BF1ED004-EA02-456A-AA55-2AC8AC6B054C}")
+
+ // IID_ICOMTestDouble is for ICOMTestDouble interfaces.
+ //
+ // {BF908A81-8687-4E93-999F-D86FAB284BA0}
+ IID_ICOMTestDouble = NewGUID("{BF908A81-8687-4E93-999F-D86FAB284BA0}")
+
+ // IID_ICOMTestBoolean is for ICOMTestBoolean interfaces.
+ //
+ // {D530E7A6-4EE8-40D1-8931-3D63B8605010}
+ IID_ICOMTestBoolean = NewGUID("{D530E7A6-4EE8-40D1-8931-3D63B8605010}")
+
+ // IID_ICOMEchoTestObject is for ICOMEchoTestObject interfaces.
+ //
+ // {6485B1EF-D780-4834-A4FE-1EBB51746CA3}
+ IID_ICOMEchoTestObject = NewGUID("{6485B1EF-D780-4834-A4FE-1EBB51746CA3}")
+
+ // IID_ICOMTestTypes is for ICOMTestTypes interfaces.
+ //
+ // {CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}
+ IID_ICOMTestTypes = NewGUID("{CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}")
+
+ // CLSID_COMEchoTestObject is for COMEchoTestObject class.
+ //
+ // {3C24506A-AE9E-4D50-9157-EF317281F1B0}
+ CLSID_COMEchoTestObject = NewGUID("{3C24506A-AE9E-4D50-9157-EF317281F1B0}")
+
+ // CLSID_COMTestScalarClass is for COMTestScalarClass class.
+ //
+ // {865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}
+ CLSID_COMTestScalarClass = NewGUID("{865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}")
+)
+
+const hextable = "0123456789ABCDEF"
+const emptyGUID = "{00000000-0000-0000-0000-000000000000}"
+
+// GUID is Windows API specific GUID type.
+//
+// This exists to match Windows GUID type for direct passing for COM.
+// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx.
+type GUID struct {
+ Data1 uint32
+ Data2 uint16
+ Data3 uint16
+ Data4 [8]byte
+}
+
+// NewGUID converts the given string into a globally unique identifier that is
+// compliant with the Windows API.
+//
+// The supplied string may be in any of these formats:
+//
+// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
+//
+// The conversion of the supplied string is not case-sensitive.
+func NewGUID(guid string) *GUID {
+ d := []byte(guid)
+ var d1, d2, d3, d4a, d4b []byte
+
+ switch len(d) {
+ case 38:
+ if d[0] != '{' || d[37] != '}' {
+ return nil
+ }
+ d = d[1:37]
+ fallthrough
+ case 36:
+ if d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' {
+ return nil
+ }
+ d1 = d[0:8]
+ d2 = d[9:13]
+ d3 = d[14:18]
+ d4a = d[19:23]
+ d4b = d[24:36]
+ case 32:
+ d1 = d[0:8]
+ d2 = d[8:12]
+ d3 = d[12:16]
+ d4a = d[16:20]
+ d4b = d[20:32]
+ default:
+ return nil
+ }
+
+ var g GUID
+ var ok1, ok2, ok3, ok4 bool
+ g.Data1, ok1 = decodeHexUint32(d1)
+ g.Data2, ok2 = decodeHexUint16(d2)
+ g.Data3, ok3 = decodeHexUint16(d3)
+ g.Data4, ok4 = decodeHexByte64(d4a, d4b)
+ if ok1 && ok2 && ok3 && ok4 {
+ return &g
+ }
+ return nil
+}
+
+func decodeHexUint32(src []byte) (value uint32, ok bool) {
+ var b1, b2, b3, b4 byte
+ var ok1, ok2, ok3, ok4 bool
+ b1, ok1 = decodeHexByte(src[0], src[1])
+ b2, ok2 = decodeHexByte(src[2], src[3])
+ b3, ok3 = decodeHexByte(src[4], src[5])
+ b4, ok4 = decodeHexByte(src[6], src[7])
+ value = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4)
+ ok = ok1 && ok2 && ok3 && ok4
+ return
+}
+
+func decodeHexUint16(src []byte) (value uint16, ok bool) {
+ var b1, b2 byte
+ var ok1, ok2 bool
+ b1, ok1 = decodeHexByte(src[0], src[1])
+ b2, ok2 = decodeHexByte(src[2], src[3])
+ value = (uint16(b1) << 8) | uint16(b2)
+ ok = ok1 && ok2
+ return
+}
+
+func decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) {
+ var ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool
+ value[0], ok1 = decodeHexByte(s1[0], s1[1])
+ value[1], ok2 = decodeHexByte(s1[2], s1[3])
+ value[2], ok3 = decodeHexByte(s2[0], s2[1])
+ value[3], ok4 = decodeHexByte(s2[2], s2[3])
+ value[4], ok5 = decodeHexByte(s2[4], s2[5])
+ value[5], ok6 = decodeHexByte(s2[6], s2[7])
+ value[6], ok7 = decodeHexByte(s2[8], s2[9])
+ value[7], ok8 = decodeHexByte(s2[10], s2[11])
+ ok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8
+ return
+}
+
+func decodeHexByte(c1, c2 byte) (value byte, ok bool) {
+ var n1, n2 byte
+ var ok1, ok2 bool
+ n1, ok1 = decodeHexChar(c1)
+ n2, ok2 = decodeHexChar(c2)
+ value = (n1 << 4) | n2
+ ok = ok1 && ok2
+ return
+}
+
+func decodeHexChar(c byte) (byte, bool) {
+ switch {
+ case '0' <= c && c <= '9':
+ return c - '0', true
+ case 'a' <= c && c <= 'f':
+ return c - 'a' + 10, true
+ case 'A' <= c && c <= 'F':
+ return c - 'A' + 10, true
+ }
+
+ return 0, false
+}
+
+// String converts the GUID to string form. It will adhere to this pattern:
+//
+// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
+//
+// If the GUID is nil, the string representation of an empty GUID is returned:
+//
+// {00000000-0000-0000-0000-000000000000}
+func (guid *GUID) String() string {
+ if guid == nil {
+ return emptyGUID
+ }
+
+ var c [38]byte
+ c[0] = '{'
+ putUint32Hex(c[1:9], guid.Data1)
+ c[9] = '-'
+ putUint16Hex(c[10:14], guid.Data2)
+ c[14] = '-'
+ putUint16Hex(c[15:19], guid.Data3)
+ c[19] = '-'
+ putByteHex(c[20:24], guid.Data4[0:2])
+ c[24] = '-'
+ putByteHex(c[25:37], guid.Data4[2:8])
+ c[37] = '}'
+ return string(c[:])
+}
+
+func putUint32Hex(b []byte, v uint32) {
+ b[0] = hextable[byte(v>>24)>>4]
+ b[1] = hextable[byte(v>>24)&0x0f]
+ b[2] = hextable[byte(v>>16)>>4]
+ b[3] = hextable[byte(v>>16)&0x0f]
+ b[4] = hextable[byte(v>>8)>>4]
+ b[5] = hextable[byte(v>>8)&0x0f]
+ b[6] = hextable[byte(v)>>4]
+ b[7] = hextable[byte(v)&0x0f]
+}
+
+func putUint16Hex(b []byte, v uint16) {
+ b[0] = hextable[byte(v>>8)>>4]
+ b[1] = hextable[byte(v>>8)&0x0f]
+ b[2] = hextable[byte(v)>>4]
+ b[3] = hextable[byte(v)&0x0f]
+}
+
+func putByteHex(dst, src []byte) {
+ for i := 0; i < len(src); i++ {
+ dst[i*2] = hextable[src[i]>>4]
+ dst[i*2+1] = hextable[src[i]&0x0f]
+ }
+}
+
+// IsEqualGUID compares two GUID.
+//
+// Not constant time comparison.
+func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool {
+ return guid1.Data1 == guid2.Data1 &&
+ guid1.Data2 == guid2.Data2 &&
+ guid1.Data3 == guid2.Data3 &&
+ guid1.Data4[0] == guid2.Data4[0] &&
+ guid1.Data4[1] == guid2.Data4[1] &&
+ guid1.Data4[2] == guid2.Data4[2] &&
+ guid1.Data4[3] == guid2.Data4[3] &&
+ guid1.Data4[4] == guid2.Data4[4] &&
+ guid1.Data4[5] == guid2.Data4[5] &&
+ guid1.Data4[6] == guid2.Data4[6] &&
+ guid1.Data4[7] == guid2.Data4[7]
+}
diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go
new file mode 100644
index 000000000..9e6c49f41
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go
@@ -0,0 +1,20 @@
+package ole
+
+import "unsafe"
+
+type IConnectionPoint struct {
+ IUnknown
+}
+
+type IConnectionPointVtbl struct {
+ IUnknownVtbl
+ GetConnectionInterface uintptr
+ GetConnectionPointContainer uintptr
+ Advise uintptr
+ Unadvise uintptr
+ EnumConnections uintptr
+}
+
+func (v *IConnectionPoint) VTable() *IConnectionPointVtbl {
+ return (*IConnectionPointVtbl)(unsafe.Pointer(v.RawVTable))
+}
diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go
new file mode 100644
index 000000000..5414dc3cd
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go
@@ -0,0 +1,21 @@
+// +build !windows
+
+package ole
+
+import "unsafe"
+
+func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 {
+ return int32(0)
+}
+
+func (v *IConnectionPoint) Advise(unknown *IUnknown) (uint32, error) {
+ return uint32(0), NewError(E_NOTIMPL)
+}
+
+func (v *IConnectionPoint) Unadvise(cookie uint32) error {
+ return NewError(E_NOTIMPL)
+}
+
+func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) (err error) {
+ return NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go
new file mode 100644
index 000000000..32bc18324
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go
@@ -0,0 +1,43 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 {
+ // XXX: This doesn't look like it does what it's supposed to
+ return release((*IUnknown)(unsafe.Pointer(v)))
+}
+
+func (v *IConnectionPoint) Advise(unknown *IUnknown) (cookie uint32, err error) {
+ hr, _, _ := syscall.Syscall(
+ v.VTable().Advise,
+ 3,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(unsafe.Pointer(unknown)),
+ uintptr(unsafe.Pointer(&cookie)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func (v *IConnectionPoint) Unadvise(cookie uint32) (err error) {
+ hr, _, _ := syscall.Syscall(
+ v.VTable().Unadvise,
+ 2,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(cookie),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) error {
+ return NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go
new file mode 100644
index 000000000..165860d19
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go
@@ -0,0 +1,17 @@
+package ole
+
+import "unsafe"
+
+type IConnectionPointContainer struct {
+ IUnknown
+}
+
+type IConnectionPointContainerVtbl struct {
+ IUnknownVtbl
+ EnumConnectionPoints uintptr
+ FindConnectionPoint uintptr
+}
+
+func (v *IConnectionPointContainer) VTable() *IConnectionPointContainerVtbl {
+ return (*IConnectionPointContainerVtbl)(unsafe.Pointer(v.RawVTable))
+}
diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go
new file mode 100644
index 000000000..5dfa42aae
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go
@@ -0,0 +1,11 @@
+// +build !windows
+
+package ole
+
+func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error {
+ return NewError(E_NOTIMPL)
+}
+
+func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) error {
+ return NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go
new file mode 100644
index 000000000..ad30d79ef
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go
@@ -0,0 +1,25 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error {
+ return NewError(E_NOTIMPL)
+}
+
+func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) (err error) {
+ hr, _, _ := syscall.Syscall(
+ v.VTable().FindConnectionPoint,
+ 3,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(unsafe.Pointer(iid)),
+ uintptr(unsafe.Pointer(point)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/idispatch.go b/vendor/github.com/go-ole/go-ole/idispatch.go
new file mode 100644
index 000000000..d4af12409
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/idispatch.go
@@ -0,0 +1,94 @@
+package ole
+
+import "unsafe"
+
+type IDispatch struct {
+ IUnknown
+}
+
+type IDispatchVtbl struct {
+ IUnknownVtbl
+ GetTypeInfoCount uintptr
+ GetTypeInfo uintptr
+ GetIDsOfNames uintptr
+ Invoke uintptr
+}
+
+func (v *IDispatch) VTable() *IDispatchVtbl {
+ return (*IDispatchVtbl)(unsafe.Pointer(v.RawVTable))
+}
+
+func (v *IDispatch) GetIDsOfName(names []string) (dispid []int32, err error) {
+ dispid, err = getIDsOfName(v, names)
+ return
+}
+
+func (v *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) {
+ result, err = invoke(v, dispid, dispatch, params...)
+ return
+}
+
+func (v *IDispatch) GetTypeInfoCount() (c uint32, err error) {
+ c, err = getTypeInfoCount(v)
+ return
+}
+
+func (v *IDispatch) GetTypeInfo() (tinfo *ITypeInfo, err error) {
+ tinfo, err = getTypeInfo(v)
+ return
+}
+
+// GetSingleIDOfName is a helper that returns single display ID for IDispatch name.
+//
+// This replaces the common pattern of attempting to get a single name from the list of available
+// IDs. It gives the first ID, if it is available.
+func (v *IDispatch) GetSingleIDOfName(name string) (displayID int32, err error) {
+ var displayIDs []int32
+ displayIDs, err = v.GetIDsOfName([]string{name})
+ if err != nil {
+ return
+ }
+ displayID = displayIDs[0]
+ return
+}
+
+// InvokeWithOptionalArgs accepts arguments as an array, works like Invoke.
+//
+// Accepts name and will attempt to retrieve Display ID to pass to Invoke.
+//
+// Passing params as an array is a workaround that could be fixed in later versions of Go that
+// prevent passing empty params. During testing it was discovered that this is an acceptable way of
+// getting around not being able to pass params normally.
+func (v *IDispatch) InvokeWithOptionalArgs(name string, dispatch int16, params []interface{}) (result *VARIANT, err error) {
+ displayID, err := v.GetSingleIDOfName(name)
+ if err != nil {
+ return
+ }
+
+ if len(params) < 1 {
+ result, err = v.Invoke(displayID, dispatch)
+ } else {
+ result, err = v.Invoke(displayID, dispatch, params...)
+ }
+
+ return
+}
+
+// CallMethod invokes named function with arguments on object.
+func (v *IDispatch) CallMethod(name string, params ...interface{}) (*VARIANT, error) {
+ return v.InvokeWithOptionalArgs(name, DISPATCH_METHOD, params)
+}
+
+// GetProperty retrieves the property with the name with the ability to pass arguments.
+//
+// Most of the time you will not need to pass arguments as most objects do not allow for this
+// feature. Or at least, should not allow for this feature. Some servers don't follow best practices
+// and this is provided for those edge cases.
+func (v *IDispatch) GetProperty(name string, params ...interface{}) (*VARIANT, error) {
+ return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYGET, params)
+}
+
+// PutProperty attempts to mutate a property in the object.
+func (v *IDispatch) PutProperty(name string, params ...interface{}) (*VARIANT, error) {
+ return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYPUT, params)
+}
diff --git a/vendor/github.com/go-ole/go-ole/idispatch_func.go b/vendor/github.com/go-ole/go-ole/idispatch_func.go
new file mode 100644
index 000000000..b8fbbe319
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/idispatch_func.go
@@ -0,0 +1,19 @@
+// +build !windows
+
+package ole
+
+func getIDsOfName(disp *IDispatch, names []string) ([]int32, error) {
+ return []int32{}, NewError(E_NOTIMPL)
+}
+
+func getTypeInfoCount(disp *IDispatch) (uint32, error) {
+ return uint32(0), NewError(E_NOTIMPL)
+}
+
+func getTypeInfo(disp *IDispatch) (*ITypeInfo, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (*VARIANT, error) {
+ return nil, NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/idispatch_windows.go b/vendor/github.com/go-ole/go-ole/idispatch_windows.go
new file mode 100644
index 000000000..020e4f51b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/idispatch_windows.go
@@ -0,0 +1,197 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+ "time"
+ "unsafe"
+)
+
+func getIDsOfName(disp *IDispatch, names []string) (dispid []int32, err error) {
+ wnames := make([]*uint16, len(names))
+ for i := 0; i < len(names); i++ {
+ wnames[i] = syscall.StringToUTF16Ptr(names[i])
+ }
+ dispid = make([]int32, len(names))
+ namelen := uint32(len(names))
+ hr, _, _ := syscall.Syscall6(
+ disp.VTable().GetIDsOfNames,
+ 6,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(unsafe.Pointer(IID_NULL)),
+ uintptr(unsafe.Pointer(&wnames[0])),
+ uintptr(namelen),
+ uintptr(GetUserDefaultLCID()),
+ uintptr(unsafe.Pointer(&dispid[0])))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func getTypeInfoCount(disp *IDispatch) (c uint32, err error) {
+ hr, _, _ := syscall.Syscall(
+ disp.VTable().GetTypeInfoCount,
+ 2,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(unsafe.Pointer(&c)),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func getTypeInfo(disp *IDispatch) (tinfo *ITypeInfo, err error) {
+ hr, _, _ := syscall.Syscall(
+ disp.VTable().GetTypeInfo,
+ 3,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(GetUserDefaultLCID()),
+ uintptr(unsafe.Pointer(&tinfo)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) {
+ var dispparams DISPPARAMS
+
+ if dispatch&DISPATCH_PROPERTYPUT != 0 {
+ dispnames := [1]int32{DISPID_PROPERTYPUT}
+ dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))
+ dispparams.cNamedArgs = 1
+ } else if dispatch&DISPATCH_PROPERTYPUTREF != 0 {
+ dispnames := [1]int32{DISPID_PROPERTYPUT}
+ dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))
+ dispparams.cNamedArgs = 1
+ }
+ var vargs []VARIANT
+ if len(params) > 0 {
+ vargs = make([]VARIANT, len(params))
+ for i, v := range params {
+ //n := len(params)-i-1
+ n := len(params) - i - 1
+ VariantInit(&vargs[n])
+ switch vv := v.(type) {
+ case bool:
+ if vv {
+ vargs[n] = NewVariant(VT_BOOL, 0xffff)
+ } else {
+ vargs[n] = NewVariant(VT_BOOL, 0)
+ }
+ case *bool:
+ vargs[n] = NewVariant(VT_BOOL|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*bool)))))
+ case uint8:
+ vargs[n] = NewVariant(VT_I1, int64(v.(uint8)))
+ case *uint8:
+ vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8)))))
+ case int8:
+ vargs[n] = NewVariant(VT_I1, int64(v.(int8)))
+ case *int8:
+ vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8)))))
+ case int16:
+ vargs[n] = NewVariant(VT_I2, int64(v.(int16)))
+ case *int16:
+ vargs[n] = NewVariant(VT_I2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int16)))))
+ case uint16:
+ vargs[n] = NewVariant(VT_UI2, int64(v.(uint16)))
+ case *uint16:
+ vargs[n] = NewVariant(VT_UI2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint16)))))
+ case int32:
+ vargs[n] = NewVariant(VT_I4, int64(v.(int32)))
+ case *int32:
+ vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int32)))))
+ case uint32:
+ vargs[n] = NewVariant(VT_UI4, int64(v.(uint32)))
+ case *uint32:
+ vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint32)))))
+ case int64:
+ vargs[n] = NewVariant(VT_I8, int64(v.(int64)))
+ case *int64:
+ vargs[n] = NewVariant(VT_I8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int64)))))
+ case uint64:
+ vargs[n] = NewVariant(VT_UI8, int64(uintptr(v.(uint64))))
+ case *uint64:
+ vargs[n] = NewVariant(VT_UI8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint64)))))
+ case int:
+ vargs[n] = NewVariant(VT_I4, int64(v.(int)))
+ case *int:
+ vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int)))))
+ case uint:
+ vargs[n] = NewVariant(VT_UI4, int64(v.(uint)))
+ case *uint:
+ vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint)))))
+ case float32:
+ vargs[n] = NewVariant(VT_R4, *(*int64)(unsafe.Pointer(&vv)))
+ case *float32:
+ vargs[n] = NewVariant(VT_R4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float32)))))
+ case float64:
+ vargs[n] = NewVariant(VT_R8, *(*int64)(unsafe.Pointer(&vv)))
+ case *float64:
+ vargs[n] = NewVariant(VT_R8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float64)))))
+ case string:
+ vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(v.(string))))))
+ case *string:
+ vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*string)))))
+ case time.Time:
+ s := vv.Format("2006-01-02 15:04:05")
+ vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(s)))))
+ case *time.Time:
+ s := vv.Format("2006-01-02 15:04:05")
+ vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(&s))))
+ case *IDispatch:
+ vargs[n] = NewVariant(VT_DISPATCH, int64(uintptr(unsafe.Pointer(v.(*IDispatch)))))
+ case **IDispatch:
+ vargs[n] = NewVariant(VT_DISPATCH|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(**IDispatch)))))
+ case nil:
+ vargs[n] = NewVariant(VT_NULL, 0)
+ case *VARIANT:
+ vargs[n] = NewVariant(VT_VARIANT|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*VARIANT)))))
+ case []byte:
+ safeByteArray := safeArrayFromByteSlice(v.([]byte))
+ vargs[n] = NewVariant(VT_ARRAY|VT_UI1, int64(uintptr(unsafe.Pointer(safeByteArray))))
+ defer VariantClear(&vargs[n])
+ case []string:
+ safeByteArray := safeArrayFromStringSlice(v.([]string))
+ vargs[n] = NewVariant(VT_ARRAY|VT_BSTR, int64(uintptr(unsafe.Pointer(safeByteArray))))
+ defer VariantClear(&vargs[n])
+ default:
+ panic("unknown type")
+ }
+ }
+ dispparams.rgvarg = uintptr(unsafe.Pointer(&vargs[0]))
+ dispparams.cArgs = uint32(len(params))
+ }
+
+ result = new(VARIANT)
+ var excepInfo EXCEPINFO
+ VariantInit(result)
+ hr, _, _ := syscall.Syscall9(
+ disp.VTable().Invoke,
+ 9,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(dispid),
+ uintptr(unsafe.Pointer(IID_NULL)),
+ uintptr(GetUserDefaultLCID()),
+ uintptr(dispatch),
+ uintptr(unsafe.Pointer(&dispparams)),
+ uintptr(unsafe.Pointer(result)),
+ uintptr(unsafe.Pointer(&excepInfo)),
+ 0)
+ if hr != 0 {
+ err = NewErrorWithSubError(hr, BstrToString(excepInfo.bstrDescription), excepInfo)
+ }
+ for i, varg := range vargs {
+ n := len(params) - i - 1
+ if varg.VT == VT_BSTR && varg.Val != 0 {
+ SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val)))))
+ }
+ if varg.VT == (VT_BSTR|VT_BYREF) && varg.Val != 0 {
+ *(params[n].(*string)) = LpOleStrToString(*(**uint16)(unsafe.Pointer(uintptr(varg.Val))))
+ }
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant.go b/vendor/github.com/go-ole/go-ole/ienumvariant.go
new file mode 100644
index 000000000..243389754
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/ienumvariant.go
@@ -0,0 +1,19 @@
+package ole
+
+import "unsafe"
+
+type IEnumVARIANT struct {
+ IUnknown
+}
+
+type IEnumVARIANTVtbl struct {
+ IUnknownVtbl
+ Next uintptr
+ Skip uintptr
+ Reset uintptr
+ Clone uintptr
+}
+
+func (v *IEnumVARIANT) VTable() *IEnumVARIANTVtbl {
+ return (*IEnumVARIANTVtbl)(unsafe.Pointer(v.RawVTable))
+}
diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go
new file mode 100644
index 000000000..c14848199
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go
@@ -0,0 +1,19 @@
+// +build !windows
+
+package ole
+
+func (enum *IEnumVARIANT) Clone() (*IEnumVARIANT, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+func (enum *IEnumVARIANT) Reset() error {
+ return NewError(E_NOTIMPL)
+}
+
+func (enum *IEnumVARIANT) Skip(celt uint) error {
+ return NewError(E_NOTIMPL)
+}
+
+func (enum *IEnumVARIANT) Next(celt uint) (VARIANT, uint, error) {
+ return NewVariant(VT_NULL, int64(0)), 0, NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go
new file mode 100644
index 000000000..4781f3b8b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go
@@ -0,0 +1,63 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+func (enum *IEnumVARIANT) Clone() (cloned *IEnumVARIANT, err error) {
+ hr, _, _ := syscall.Syscall(
+ enum.VTable().Clone,
+ 2,
+ uintptr(unsafe.Pointer(enum)),
+ uintptr(unsafe.Pointer(&cloned)),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func (enum *IEnumVARIANT) Reset() (err error) {
+ hr, _, _ := syscall.Syscall(
+ enum.VTable().Reset,
+ 1,
+ uintptr(unsafe.Pointer(enum)),
+ 0,
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func (enum *IEnumVARIANT) Skip(celt uint) (err error) {
+ hr, _, _ := syscall.Syscall(
+ enum.VTable().Skip,
+ 2,
+ uintptr(unsafe.Pointer(enum)),
+ uintptr(celt),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func (enum *IEnumVARIANT) Next(celt uint) (array VARIANT, length uint, err error) {
+ hr, _, _ := syscall.Syscall6(
+ enum.VTable().Next,
+ 4,
+ uintptr(unsafe.Pointer(enum)),
+ uintptr(celt),
+ uintptr(unsafe.Pointer(&array)),
+ uintptr(unsafe.Pointer(&length)),
+ 0,
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/iinspectable.go b/vendor/github.com/go-ole/go-ole/iinspectable.go
new file mode 100644
index 000000000..f4a19e253
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iinspectable.go
@@ -0,0 +1,18 @@
+package ole
+
+import "unsafe"
+
+type IInspectable struct {
+ IUnknown
+}
+
+type IInspectableVtbl struct {
+ IUnknownVtbl
+ GetIIds uintptr
+ GetRuntimeClassName uintptr
+ GetTrustLevel uintptr
+}
+
+func (v *IInspectable) VTable() *IInspectableVtbl {
+ return (*IInspectableVtbl)(unsafe.Pointer(v.RawVTable))
+}
diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_func.go b/vendor/github.com/go-ole/go-ole/iinspectable_func.go
new file mode 100644
index 000000000..348829bf0
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iinspectable_func.go
@@ -0,0 +1,15 @@
+// +build !windows
+
+package ole
+
+func (v *IInspectable) GetIids() ([]*GUID, error) {
+ return []*GUID{}, NewError(E_NOTIMPL)
+}
+
+func (v *IInspectable) GetRuntimeClassName() (string, error) {
+ return "", NewError(E_NOTIMPL)
+}
+
+func (v *IInspectable) GetTrustLevel() (uint32, error) {
+ return uint32(0), NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go
new file mode 100644
index 000000000..4519a4aa4
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go
@@ -0,0 +1,72 @@
+// +build windows
+
+package ole
+
+import (
+ "bytes"
+ "encoding/binary"
+ "reflect"
+ "syscall"
+ "unsafe"
+)
+
+func (v *IInspectable) GetIids() (iids []*GUID, err error) {
+ var count uint32
+ var array uintptr
+ hr, _, _ := syscall.Syscall(
+ v.VTable().GetIIds,
+ 3,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(unsafe.Pointer(&count)),
+ uintptr(unsafe.Pointer(&array)))
+ if hr != 0 {
+ err = NewError(hr)
+ return
+ }
+ defer CoTaskMemFree(array)
+
+ iids = make([]*GUID, count)
+ byteCount := count * uint32(unsafe.Sizeof(GUID{}))
+ slicehdr := reflect.SliceHeader{Data: array, Len: int(byteCount), Cap: int(byteCount)}
+ byteSlice := *(*[]byte)(unsafe.Pointer(&slicehdr))
+ reader := bytes.NewReader(byteSlice)
+ for i := range iids {
+ guid := GUID{}
+ err = binary.Read(reader, binary.LittleEndian, &guid)
+ if err != nil {
+ return
+ }
+ iids[i] = &guid
+ }
+ return
+}
+
+func (v *IInspectable) GetRuntimeClassName() (s string, err error) {
+ var hstring HString
+ hr, _, _ := syscall.Syscall(
+ v.VTable().GetRuntimeClassName,
+ 2,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(unsafe.Pointer(&hstring)),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ return
+ }
+ s = hstring.String()
+ DeleteHString(hstring)
+ return
+}
+
+func (v *IInspectable) GetTrustLevel() (level uint32, err error) {
+ hr, _, _ := syscall.Syscall(
+ v.VTable().GetTrustLevel,
+ 2,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(unsafe.Pointer(&level)),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go
new file mode 100644
index 000000000..25f3a6f24
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go
@@ -0,0 +1,21 @@
+package ole
+
+import "unsafe"
+
+type IProvideClassInfo struct {
+ IUnknown
+}
+
+type IProvideClassInfoVtbl struct {
+ IUnknownVtbl
+ GetClassInfo uintptr
+}
+
+func (v *IProvideClassInfo) VTable() *IProvideClassInfoVtbl {
+ return (*IProvideClassInfoVtbl)(unsafe.Pointer(v.RawVTable))
+}
+
+func (v *IProvideClassInfo) GetClassInfo() (cinfo *ITypeInfo, err error) {
+ cinfo, err = getClassInfo(v)
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go
new file mode 100644
index 000000000..7e3cb63ea
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go
@@ -0,0 +1,7 @@
+// +build !windows
+
+package ole
+
+func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) {
+ return nil, NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go
new file mode 100644
index 000000000..2ad016394
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go
@@ -0,0 +1,21 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) {
+ hr, _, _ := syscall.Syscall(
+ disp.VTable().GetClassInfo,
+ 2,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(unsafe.Pointer(&tinfo)),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo.go b/vendor/github.com/go-ole/go-ole/itypeinfo.go
new file mode 100644
index 000000000..dd3c5e21b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/itypeinfo.go
@@ -0,0 +1,34 @@
+package ole
+
+import "unsafe"
+
+type ITypeInfo struct {
+ IUnknown
+}
+
+type ITypeInfoVtbl struct {
+ IUnknownVtbl
+ GetTypeAttr uintptr
+ GetTypeComp uintptr
+ GetFuncDesc uintptr
+ GetVarDesc uintptr
+ GetNames uintptr
+ GetRefTypeOfImplType uintptr
+ GetImplTypeFlags uintptr
+ GetIDsOfNames uintptr
+ Invoke uintptr
+ GetDocumentation uintptr
+ GetDllEntry uintptr
+ GetRefTypeInfo uintptr
+ AddressOfMember uintptr
+ CreateInstance uintptr
+ GetMops uintptr
+ GetContainingTypeLib uintptr
+ ReleaseTypeAttr uintptr
+ ReleaseFuncDesc uintptr
+ ReleaseVarDesc uintptr
+}
+
+func (v *ITypeInfo) VTable() *ITypeInfoVtbl {
+ return (*ITypeInfoVtbl)(unsafe.Pointer(v.RawVTable))
+}
diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go
new file mode 100644
index 000000000..8364a659b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go
@@ -0,0 +1,7 @@
+// +build !windows
+
+package ole
+
+func (v *ITypeInfo) GetTypeAttr() (*TYPEATTR, error) {
+ return nil, NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go
new file mode 100644
index 000000000..54782b3da
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go
@@ -0,0 +1,21 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+func (v *ITypeInfo) GetTypeAttr() (tattr *TYPEATTR, err error) {
+ hr, _, _ := syscall.Syscall(
+ uintptr(v.VTable().GetTypeAttr),
+ 2,
+ uintptr(unsafe.Pointer(v)),
+ uintptr(unsafe.Pointer(&tattr)),
+ 0)
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/iunknown.go b/vendor/github.com/go-ole/go-ole/iunknown.go
new file mode 100644
index 000000000..108f28ea6
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iunknown.go
@@ -0,0 +1,57 @@
+package ole
+
+import "unsafe"
+
+type IUnknown struct {
+ RawVTable *interface{}
+}
+
+type IUnknownVtbl struct {
+ QueryInterface uintptr
+ AddRef uintptr
+ Release uintptr
+}
+
+type UnknownLike interface {
+ QueryInterface(iid *GUID) (disp *IDispatch, err error)
+ AddRef() int32
+ Release() int32
+}
+
+func (v *IUnknown) VTable() *IUnknownVtbl {
+ return (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable))
+}
+
+func (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error {
+ return reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj)
+}
+
+func (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) {
+ err = v.PutQueryInterface(interfaceID, &dispatch)
+ return
+}
+
+func (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) {
+ err = v.PutQueryInterface(interfaceID, &enum)
+ return
+}
+
+func (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) {
+ return queryInterface(v, iid)
+}
+
+func (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) {
+ unk, err := queryInterface(v, iid)
+ if err != nil {
+ panic(err)
+ }
+ return unk
+}
+
+func (v *IUnknown) AddRef() int32 {
+ return addRef(v)
+}
+
+func (v *IUnknown) Release() int32 {
+ return release(v)
+}
diff --git a/vendor/github.com/go-ole/go-ole/iunknown_func.go b/vendor/github.com/go-ole/go-ole/iunknown_func.go
new file mode 100644
index 000000000..d0a62cfd7
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iunknown_func.go
@@ -0,0 +1,19 @@
+// +build !windows
+
+package ole
+
+func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) {
+ return NewError(E_NOTIMPL)
+}
+
+func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+func addRef(unk *IUnknown) int32 {
+ return 0
+}
+
+func release(unk *IUnknown) int32 {
+ return 0
+}
diff --git a/vendor/github.com/go-ole/go-ole/iunknown_windows.go b/vendor/github.com/go-ole/go-ole/iunknown_windows.go
new file mode 100644
index 000000000..ede5bb8c1
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/iunknown_windows.go
@@ -0,0 +1,58 @@
+// +build windows
+
+package ole
+
+import (
+ "reflect"
+ "syscall"
+ "unsafe"
+)
+
+func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) {
+ selfValue := reflect.ValueOf(self).Elem()
+ objValue := reflect.ValueOf(obj).Elem()
+
+ hr, _, _ := syscall.Syscall(
+ method,
+ 3,
+ selfValue.UnsafeAddr(),
+ uintptr(unsafe.Pointer(interfaceID)),
+ objValue.Addr().Pointer())
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) {
+ hr, _, _ := syscall.Syscall(
+ unk.VTable().QueryInterface,
+ 3,
+ uintptr(unsafe.Pointer(unk)),
+ uintptr(unsafe.Pointer(iid)),
+ uintptr(unsafe.Pointer(&disp)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func addRef(unk *IUnknown) int32 {
+ ret, _, _ := syscall.Syscall(
+ unk.VTable().AddRef,
+ 1,
+ uintptr(unsafe.Pointer(unk)),
+ 0,
+ 0)
+ return int32(ret)
+}
+
+func release(unk *IUnknown) int32 {
+ ret, _, _ := syscall.Syscall(
+ unk.VTable().Release,
+ 1,
+ uintptr(unsafe.Pointer(unk)),
+ 0,
+ 0)
+ return int32(ret)
+}
diff --git a/vendor/github.com/go-ole/go-ole/ole.go b/vendor/github.com/go-ole/go-ole/ole.go
new file mode 100644
index 000000000..e2ae4f4bb
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/ole.go
@@ -0,0 +1,157 @@
+package ole
+
+import (
+ "fmt"
+ "strings"
+)
+
+// DISPPARAMS are the arguments that passed to methods or property.
+type DISPPARAMS struct {
+ rgvarg uintptr
+ rgdispidNamedArgs uintptr
+ cArgs uint32
+ cNamedArgs uint32
+}
+
+// EXCEPINFO defines exception info.
+type EXCEPINFO struct {
+ wCode uint16
+ wReserved uint16
+ bstrSource *uint16
+ bstrDescription *uint16
+ bstrHelpFile *uint16
+ dwHelpContext uint32
+ pvReserved uintptr
+ pfnDeferredFillIn uintptr
+ scode uint32
+}
+
+// WCode return wCode in EXCEPINFO.
+func (e EXCEPINFO) WCode() uint16 {
+ return e.wCode
+}
+
+// SCODE return scode in EXCEPINFO.
+func (e EXCEPINFO) SCODE() uint32 {
+ return e.scode
+}
+
+// String convert EXCEPINFO to string.
+func (e EXCEPINFO) String() string {
+ var src, desc, hlp string
+ if e.bstrSource == nil {
+ src = "<nil>"
+ } else {
+ src = BstrToString(e.bstrSource)
+ }
+
+ if e.bstrDescription == nil {
+ desc = "<nil>"
+ } else {
+ desc = BstrToString(e.bstrDescription)
+ }
+
+ if e.bstrHelpFile == nil {
+ hlp = "<nil>"
+ } else {
+ hlp = BstrToString(e.bstrHelpFile)
+ }
+
+ return fmt.Sprintf(
+ "wCode: %#x, bstrSource: %v, bstrDescription: %v, bstrHelpFile: %v, dwHelpContext: %#x, scode: %#x",
+ e.wCode, src, desc, hlp, e.dwHelpContext, e.scode,
+ )
+}
+
+// Error implements error interface and returns error string.
+func (e EXCEPINFO) Error() string {
+ if e.bstrDescription != nil {
+ return strings.TrimSpace(BstrToString(e.bstrDescription))
+ }
+
+ src := "Unknown"
+ if e.bstrSource != nil {
+ src = BstrToString(e.bstrSource)
+ }
+
+ code := e.scode
+ if e.wCode != 0 {
+ code = uint32(e.wCode)
+ }
+
+ return fmt.Sprintf("%v: %#x", src, code)
+}
+
+// PARAMDATA defines parameter data type.
+type PARAMDATA struct {
+ Name *int16
+ Vt uint16
+}
+
+// METHODDATA defines method info.
+type METHODDATA struct {
+ Name *uint16
+ Data *PARAMDATA
+ Dispid int32
+ Meth uint32
+ CC int32
+ CArgs uint32
+ Flags uint16
+ VtReturn uint32
+}
+
+// INTERFACEDATA defines interface info.
+type INTERFACEDATA struct {
+ MethodData *METHODDATA
+ CMembers uint32
+}
+
+// Point is 2D vector type.
+type Point struct {
+ X int32
+ Y int32
+}
+
+// Msg is message between processes.
+type Msg struct {
+ Hwnd uint32
+ Message uint32
+ Wparam int32
+ Lparam int32
+ Time uint32
+ Pt Point
+}
+
+// TYPEDESC defines data type.
+type TYPEDESC struct {
+ Hreftype uint32
+ VT uint16
+}
+
+// IDLDESC defines IDL info.
+type IDLDESC struct {
+ DwReserved uint32
+ WIDLFlags uint16
+}
+
+// TYPEATTR defines type info.
+type TYPEATTR struct {
+ Guid GUID
+ Lcid uint32
+ dwReserved uint32
+ MemidConstructor int32
+ MemidDestructor int32
+ LpstrSchema *uint16
+ CbSizeInstance uint32
+ Typekind int32
+ CFuncs uint16
+ CVars uint16
+ CImplTypes uint16
+ CbSizeVft uint16
+ CbAlignment uint16
+ WTypeFlags uint16
+ WMajorVerNum uint16
+ WMinorVerNum uint16
+ TdescAlias TYPEDESC
+ IdldescType IDLDESC
+}
diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection.go b/vendor/github.com/go-ole/go-ole/oleutil/connection.go
new file mode 100644
index 000000000..60df73cda
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/oleutil/connection.go
@@ -0,0 +1,100 @@
+// +build windows
+
+package oleutil
+
+import (
+ "reflect"
+ "unsafe"
+
+ ole "github.com/go-ole/go-ole"
+)
+
+type stdDispatch struct {
+ lpVtbl *stdDispatchVtbl
+ ref int32
+ iid *ole.GUID
+ iface interface{}
+ funcMap map[string]int32
+}
+
+type stdDispatchVtbl struct {
+ pQueryInterface uintptr
+ pAddRef uintptr
+ pRelease uintptr
+ pGetTypeInfoCount uintptr
+ pGetTypeInfo uintptr
+ pGetIDsOfNames uintptr
+ pInvoke uintptr
+}
+
+func dispQueryInterface(this *ole.IUnknown, iid *ole.GUID, punk **ole.IUnknown) uint32 {
+ pthis := (*stdDispatch)(unsafe.Pointer(this))
+ *punk = nil
+ if ole.IsEqualGUID(iid, ole.IID_IUnknown) ||
+ ole.IsEqualGUID(iid, ole.IID_IDispatch) {
+ dispAddRef(this)
+ *punk = this
+ return ole.S_OK
+ }
+ if ole.IsEqualGUID(iid, pthis.iid) {
+ dispAddRef(this)
+ *punk = this
+ return ole.S_OK
+ }
+ return ole.E_NOINTERFACE
+}
+
+func dispAddRef(this *ole.IUnknown) int32 {
+ pthis := (*stdDispatch)(unsafe.Pointer(this))
+ pthis.ref++
+ return pthis.ref
+}
+
+func dispRelease(this *ole.IUnknown) int32 {
+ pthis := (*stdDispatch)(unsafe.Pointer(this))
+ pthis.ref--
+ return pthis.ref
+}
+
+func dispGetIDsOfNames(this *ole.IUnknown, iid *ole.GUID, wnames []*uint16, namelen int, lcid int, pdisp []int32) uintptr {
+ pthis := (*stdDispatch)(unsafe.Pointer(this))
+ names := make([]string, len(wnames))
+ for i := 0; i < len(names); i++ {
+ names[i] = ole.LpOleStrToString(wnames[i])
+ }
+ for n := 0; n < namelen; n++ {
+ if id, ok := pthis.funcMap[names[n]]; ok {
+ pdisp[n] = id
+ }
+ }
+ return ole.S_OK
+}
+
+func dispGetTypeInfoCount(pcount *int) uintptr {
+ if pcount != nil {
+ *pcount = 0
+ }
+ return ole.S_OK
+}
+
+func dispGetTypeInfo(ptypeif *uintptr) uintptr {
+ return ole.E_NOTIMPL
+}
+
+func dispInvoke(this *ole.IDispatch, dispid int32, riid *ole.GUID, lcid int, flags int16, dispparams *ole.DISPPARAMS, result *ole.VARIANT, pexcepinfo *ole.EXCEPINFO, nerr *uint) uintptr {
+ pthis := (*stdDispatch)(unsafe.Pointer(this))
+ found := ""
+ for name, id := range pthis.funcMap {
+ if id == dispid {
+ found = name
+ }
+ }
+ if found != "" {
+ rv := reflect.ValueOf(pthis.iface).Elem()
+ rm := rv.MethodByName(found)
+ rr := rm.Call([]reflect.Value{})
+ println(len(rr))
+ return ole.S_OK
+ }
+ return ole.E_NOTIMPL
+}
diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go
new file mode 100644
index 000000000..8818fb827
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go
@@ -0,0 +1,10 @@
+// +build !windows
+
+package oleutil
+
+import ole "github.com/go-ole/go-ole"
+
+// ConnectObject creates a connection point between two services for communication.
+func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (uint32, error) {
+ return 0, ole.NewError(ole.E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go
new file mode 100644
index 000000000..ab9c0d8dc
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go
@@ -0,0 +1,58 @@
+// +build windows
+
+package oleutil
+
+import (
+ "reflect"
+ "syscall"
+ "unsafe"
+
+ ole "github.com/go-ole/go-ole"
+)
+
+// ConnectObject creates a connection point between two services for communication.
+func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) {
+ unknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer)
+ if err != nil {
+ return
+ }
+
+ container := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown))
+ var point *ole.IConnectionPoint
+ err = container.FindConnectionPoint(iid, &point)
+ if err != nil {
+ return
+ }
+ if edisp, ok := idisp.(*ole.IUnknown); ok {
+ cookie, err = point.Advise(edisp)
+ container.Release()
+ if err != nil {
+ return
+ }
+ }
+ rv := reflect.ValueOf(disp).Elem()
+ if rv.Type().Kind() == reflect.Struct {
+ dest := &stdDispatch{}
+ dest.lpVtbl = &stdDispatchVtbl{}
+ dest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface)
+ dest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef)
+ dest.lpVtbl.pRelease = syscall.NewCallback(dispRelease)
+ dest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount)
+ dest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo)
+ dest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames)
+ dest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke)
+ dest.iface = disp
+ dest.iid = iid
+ cookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest)))
+ container.Release()
+ if err != nil {
+ point.Release()
+ return
+ }
+ return
+ }
+
+ container.Release()
+
+ return 0, ole.NewError(ole.E_INVALIDARG)
+}
diff --git a/vendor/github.com/go-ole/go-ole/oleutil/go-get.go b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go
new file mode 100644
index 000000000..58347628f
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go
@@ -0,0 +1,6 @@
+// This file is here so go get succeeds as without it errors with:
+// no buildable Go source files in ...
+//
+// +build !windows
+
+package oleutil
diff --git a/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go b/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go
new file mode 100644
index 000000000..f7803c1e3
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go
@@ -0,0 +1,127 @@
+package oleutil
+
+import ole "github.com/go-ole/go-ole"
+
+// ClassIDFrom retrieves class ID whether given is program ID or application string.
+func ClassIDFrom(programID string) (classID *ole.GUID, err error) {
+ return ole.ClassIDFrom(programID)
+}
+
+// CreateObject creates object from programID based on interface type.
+//
+// Only supports IUnknown.
+//
+// Program ID can be either program ID or application string.
+func CreateObject(programID string) (unknown *ole.IUnknown, err error) {
+ classID, err := ole.ClassIDFrom(programID)
+ if err != nil {
+ return
+ }
+
+ unknown, err = ole.CreateInstance(classID, ole.IID_IUnknown)
+ if err != nil {
+ return
+ }
+
+ return
+}
+
+// GetActiveObject retrieves active object for program ID and interface ID based
+// on interface type.
+//
+// Only supports IUnknown.
+//
+// Program ID can be either program ID or application string.
+func GetActiveObject(programID string) (unknown *ole.IUnknown, err error) {
+ classID, err := ole.ClassIDFrom(programID)
+ if err != nil {
+ return
+ }
+
+ unknown, err = ole.GetActiveObject(classID, ole.IID_IUnknown)
+ if err != nil {
+ return
+ }
+
+ return
+}
+
+// CallMethod calls method on IDispatch with parameters.
+func CallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
+ return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_METHOD, params)
+}
+
+// MustCallMethod calls method on IDispatch with parameters or panics.
+func MustCallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
+ r, err := CallMethod(disp, name, params...)
+ if err != nil {
+ panic(err.Error())
+ }
+ return r
+}
+
+// GetProperty retrieves property from IDispatch.
+func GetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
+ return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYGET, params)
+}
+
+// MustGetProperty retrieves property from IDispatch or panics.
+func MustGetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
+ r, err := GetProperty(disp, name, params...)
+ if err != nil {
+ panic(err.Error())
+ }
+ return r
+}
+
+// PutProperty mutates property.
+func PutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
+ return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUT, params)
+}
+
+// MustPutProperty mutates property or panics.
+func MustPutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
+ r, err := PutProperty(disp, name, params...)
+ if err != nil {
+ panic(err.Error())
+ }
+ return r
+}
+
+// PutPropertyRef mutates property reference.
+func PutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
+ return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUTREF, params)
+}
+
+// MustPutPropertyRef mutates property reference or panics.
+func MustPutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
+ r, err := PutPropertyRef(disp, name, params...)
+ if err != nil {
+ panic(err.Error())
+ }
+ return r
+}
+
+func ForEach(disp *ole.IDispatch, f func(v *ole.VARIANT) error) error {
+ newEnum, err := disp.GetProperty("_NewEnum")
+ if err != nil {
+ return err
+ }
+ defer newEnum.Clear()
+
+ enum, err := newEnum.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)
+ if err != nil {
+ return err
+ }
+ defer enum.Release()
+
+ for item, length, err := enum.Next(1); length > 0; item, length, err = enum.Next(1) {
+ if err != nil {
+ return err
+ }
+ if ferr := f(&item); ferr != nil {
+ return ferr
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/go-ole/go-ole/safearray.go b/vendor/github.com/go-ole/go-ole/safearray.go
new file mode 100644
index 000000000..a5201b56c
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/safearray.go
@@ -0,0 +1,27 @@
+// Package is meant to retrieve and process safe array data returned from COM.
+
+package ole
+
+// SafeArrayBound defines the SafeArray boundaries.
+type SafeArrayBound struct {
+ Elements uint32
+ LowerBound int32
+}
+
+// SafeArray is how COM handles arrays.
+type SafeArray struct {
+ Dimensions uint16
+ FeaturesFlag uint16
+ ElementsSize uint32
+ LocksAmount uint32
+ Data uint32
+ Bounds [16]byte
+}
+
+// SAFEARRAY is obsolete, exists for backwards compatibility.
+// Use SafeArray
+type SAFEARRAY SafeArray
+
+// SAFEARRAYBOUND is obsolete, exists for backwards compatibility.
+// Use SafeArrayBound
+type SAFEARRAYBOUND SafeArrayBound
diff --git a/vendor/github.com/go-ole/go-ole/safearray_func.go b/vendor/github.com/go-ole/go-ole/safearray_func.go
new file mode 100644
index 000000000..8ff0baa41
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/safearray_func.go
@@ -0,0 +1,211 @@
+// +build !windows
+
+package ole
+
+import (
+ "unsafe"
+)
+
+// safeArrayAccessData returns raw array pointer.
+//
+// AKA: SafeArrayAccessData in Windows API.
+func safeArrayAccessData(safearray *SafeArray) (uintptr, error) {
+ return uintptr(0), NewError(E_NOTIMPL)
+}
+
+// safeArrayUnaccessData releases raw array.
+//
+// AKA: SafeArrayUnaccessData in Windows API.
+func safeArrayUnaccessData(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayAllocData allocates SafeArray.
+//
+// AKA: SafeArrayAllocData in Windows API.
+func safeArrayAllocData(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayAllocDescriptor allocates SafeArray.
+//
+// AKA: SafeArrayAllocDescriptor in Windows API.
+func safeArrayAllocDescriptor(dimensions uint32) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayAllocDescriptorEx allocates SafeArray.
+//
+// AKA: SafeArrayAllocDescriptorEx in Windows API.
+func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayCopy returns copy of SafeArray.
+//
+// AKA: SafeArrayCopy in Windows API.
+func safeArrayCopy(original *SafeArray) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayCopyData duplicates SafeArray into another SafeArray object.
+//
+// AKA: SafeArrayCopyData in Windows API.
+func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayCreate creates SafeArray.
+//
+// AKA: SafeArrayCreate in Windows API.
+func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayCreateEx creates SafeArray.
+//
+// AKA: SafeArrayCreateEx in Windows API.
+func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayCreateVector creates SafeArray.
+//
+// AKA: SafeArrayCreateVector in Windows API.
+func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayCreateVectorEx creates SafeArray.
+//
+// AKA: SafeArrayCreateVectorEx in Windows API.
+func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (*SafeArray, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayDestroy destroys SafeArray object.
+//
+// AKA: SafeArrayDestroy in Windows API.
+func safeArrayDestroy(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayDestroyData destroys SafeArray object.
+//
+// AKA: SafeArrayDestroyData in Windows API.
+func safeArrayDestroyData(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayDestroyDescriptor destroys SafeArray object.
+//
+// AKA: SafeArrayDestroyDescriptor in Windows API.
+func safeArrayDestroyDescriptor(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayGetDim is the amount of dimensions in the SafeArray.
+//
+// SafeArrays may have multiple dimensions. Meaning, it could be
+// multidimensional array.
+//
+// AKA: SafeArrayGetDim in Windows API.
+func safeArrayGetDim(safearray *SafeArray) (*uint32, error) {
+ u := uint32(0)
+ return &u, NewError(E_NOTIMPL)
+}
+
+// safeArrayGetElementSize is the element size in bytes.
+//
+// AKA: SafeArrayGetElemsize in Windows API.
+func safeArrayGetElementSize(safearray *SafeArray) (*uint32, error) {
+ u := uint32(0)
+ return &u, NewError(E_NOTIMPL)
+}
+
+// safeArrayGetElement retrieves element at given index.
+func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayGetElement retrieves element at given index and converts to string.
+func safeArrayGetElementString(safearray *SafeArray, index int64) (string, error) {
+ return "", NewError(E_NOTIMPL)
+}
+
+// safeArrayGetIID is the InterfaceID of the elements in the SafeArray.
+//
+// AKA: SafeArrayGetIID in Windows API.
+func safeArrayGetIID(safearray *SafeArray) (*GUID, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArrayGetLBound returns lower bounds of SafeArray.
+//
+// SafeArrays may have multiple dimensions. Meaning, it could be
+// multidimensional array.
+//
+// AKA: SafeArrayGetLBound in Windows API.
+func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int64, error) {
+ return int64(0), NewError(E_NOTIMPL)
+}
+
+// safeArrayGetUBound returns upper bounds of SafeArray.
+//
+// SafeArrays may have multiple dimensions. Meaning, it could be
+// multidimensional array.
+//
+// AKA: SafeArrayGetUBound in Windows API.
+func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int64, error) {
+ return int64(0), NewError(E_NOTIMPL)
+}
+
+// safeArrayGetVartype returns data type of SafeArray.
+//
+// AKA: SafeArrayGetVartype in Windows API.
+func safeArrayGetVartype(safearray *SafeArray) (uint16, error) {
+ return uint16(0), NewError(E_NOTIMPL)
+}
+
+// safeArrayLock locks SafeArray for reading to modify SafeArray.
+//
+// This must be called during some calls to ensure that another process does not
+// read or write to the SafeArray during editing.
+//
+// AKA: SafeArrayLock in Windows API.
+func safeArrayLock(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayUnlock unlocks SafeArray for reading.
+//
+// AKA: SafeArrayUnlock in Windows API.
+func safeArrayUnlock(safearray *SafeArray) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayPutElement stores the data element at the specified location in the
+// array.
+//
+// AKA: SafeArrayPutElement in Windows API.
+func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) error {
+ return NewError(E_NOTIMPL)
+}
+
+// safeArrayGetRecordInfo accesses IRecordInfo info for custom types.
+//
+// AKA: SafeArrayGetRecordInfo in Windows API.
+//
+// XXX: Must implement IRecordInfo interface for this to return.
+func safeArrayGetRecordInfo(safearray *SafeArray) (interface{}, error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// safeArraySetRecordInfo mutates IRecordInfo info for custom types.
+//
+// AKA: SafeArraySetRecordInfo in Windows API.
+//
+// XXX: Must implement IRecordInfo interface for this to return.
+func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) error {
+ return NewError(E_NOTIMPL)
+}
diff --git a/vendor/github.com/go-ole/go-ole/safearray_windows.go b/vendor/github.com/go-ole/go-ole/safearray_windows.go
new file mode 100644
index 000000000..b27936e24
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/safearray_windows.go
@@ -0,0 +1,337 @@
+// +build windows
+
+package ole
+
+import (
+ "unsafe"
+)
+
+var (
+ procSafeArrayAccessData, _ = modoleaut32.FindProc("SafeArrayAccessData")
+ procSafeArrayAllocData, _ = modoleaut32.FindProc("SafeArrayAllocData")
+ procSafeArrayAllocDescriptor, _ = modoleaut32.FindProc("SafeArrayAllocDescriptor")
+ procSafeArrayAllocDescriptorEx, _ = modoleaut32.FindProc("SafeArrayAllocDescriptorEx")
+ procSafeArrayCopy, _ = modoleaut32.FindProc("SafeArrayCopy")
+ procSafeArrayCopyData, _ = modoleaut32.FindProc("SafeArrayCopyData")
+ procSafeArrayCreate, _ = modoleaut32.FindProc("SafeArrayCreate")
+ procSafeArrayCreateEx, _ = modoleaut32.FindProc("SafeArrayCreateEx")
+ procSafeArrayCreateVector, _ = modoleaut32.FindProc("SafeArrayCreateVector")
+ procSafeArrayCreateVectorEx, _ = modoleaut32.FindProc("SafeArrayCreateVectorEx")
+ procSafeArrayDestroy, _ = modoleaut32.FindProc("SafeArrayDestroy")
+ procSafeArrayDestroyData, _ = modoleaut32.FindProc("SafeArrayDestroyData")
+ procSafeArrayDestroyDescriptor, _ = modoleaut32.FindProc("SafeArrayDestroyDescriptor")
+ procSafeArrayGetDim, _ = modoleaut32.FindProc("SafeArrayGetDim")
+ procSafeArrayGetElement, _ = modoleaut32.FindProc("SafeArrayGetElement")
+ procSafeArrayGetElemsize, _ = modoleaut32.FindProc("SafeArrayGetElemsize")
+ procSafeArrayGetIID, _ = modoleaut32.FindProc("SafeArrayGetIID")
+ procSafeArrayGetLBound, _ = modoleaut32.FindProc("SafeArrayGetLBound")
+ procSafeArrayGetUBound, _ = modoleaut32.FindProc("SafeArrayGetUBound")
+ procSafeArrayGetVartype, _ = modoleaut32.FindProc("SafeArrayGetVartype")
+ procSafeArrayLock, _ = modoleaut32.FindProc("SafeArrayLock")
+ procSafeArrayPtrOfIndex, _ = modoleaut32.FindProc("SafeArrayPtrOfIndex")
+ procSafeArrayUnaccessData, _ = modoleaut32.FindProc("SafeArrayUnaccessData")
+ procSafeArrayUnlock, _ = modoleaut32.FindProc("SafeArrayUnlock")
+ procSafeArrayPutElement, _ = modoleaut32.FindProc("SafeArrayPutElement")
+ //procSafeArrayRedim, _ = modoleaut32.FindProc("SafeArrayRedim") // TODO
+ //procSafeArraySetIID, _ = modoleaut32.FindProc("SafeArraySetIID") // TODO
+ procSafeArrayGetRecordInfo, _ = modoleaut32.FindProc("SafeArrayGetRecordInfo")
+ procSafeArraySetRecordInfo, _ = modoleaut32.FindProc("SafeArraySetRecordInfo")
+)
+
+// safeArrayAccessData returns raw array pointer.
+//
+// AKA: SafeArrayAccessData in Windows API.
+// Todo: Test
+func safeArrayAccessData(safearray *SafeArray) (element uintptr, err error) {
+ err = convertHresultToError(
+ procSafeArrayAccessData.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&element))))
+ return
+}
+
+// safeArrayUnaccessData releases raw array.
+//
+// AKA: SafeArrayUnaccessData in Windows API.
+func safeArrayUnaccessData(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayUnaccessData.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayAllocData allocates SafeArray.
+//
+// AKA: SafeArrayAllocData in Windows API.
+func safeArrayAllocData(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayAllocData.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayAllocDescriptor allocates SafeArray.
+//
+// AKA: SafeArrayAllocDescriptor in Windows API.
+func safeArrayAllocDescriptor(dimensions uint32) (safearray *SafeArray, err error) {
+ err = convertHresultToError(
+ procSafeArrayAllocDescriptor.Call(uintptr(dimensions), uintptr(unsafe.Pointer(&safearray))))
+ return
+}
+
+// safeArrayAllocDescriptorEx allocates SafeArray.
+//
+// AKA: SafeArrayAllocDescriptorEx in Windows API.
+func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (safearray *SafeArray, err error) {
+ err = convertHresultToError(
+ procSafeArrayAllocDescriptorEx.Call(
+ uintptr(variantType),
+ uintptr(dimensions),
+ uintptr(unsafe.Pointer(&safearray))))
+ return
+}
+
+// safeArrayCopy returns copy of SafeArray.
+//
+// AKA: SafeArrayCopy in Windows API.
+func safeArrayCopy(original *SafeArray) (safearray *SafeArray, err error) {
+ err = convertHresultToError(
+ procSafeArrayCopy.Call(
+ uintptr(unsafe.Pointer(original)),
+ uintptr(unsafe.Pointer(&safearray))))
+ return
+}
+
+// safeArrayCopyData duplicates SafeArray into another SafeArray object.
+//
+// AKA: SafeArrayCopyData in Windows API.
+func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) (err error) {
+ err = convertHresultToError(
+ procSafeArrayCopyData.Call(
+ uintptr(unsafe.Pointer(original)),
+ uintptr(unsafe.Pointer(duplicate))))
+ return
+}
+
+// safeArrayCreate creates SafeArray.
+//
+// AKA: SafeArrayCreate in Windows API.
+func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (safearray *SafeArray, err error) {
+ sa, _, err := procSafeArrayCreate.Call(
+ uintptr(variantType),
+ uintptr(dimensions),
+ uintptr(unsafe.Pointer(bounds)))
+ safearray = (*SafeArray)(unsafe.Pointer(&sa))
+ return
+}
+
+// safeArrayCreateEx creates SafeArray.
+//
+// AKA: SafeArrayCreateEx in Windows API.
+func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (safearray *SafeArray, err error) {
+ sa, _, err := procSafeArrayCreateEx.Call(
+ uintptr(variantType),
+ uintptr(dimensions),
+ uintptr(unsafe.Pointer(bounds)),
+ extra)
+ safearray = (*SafeArray)(unsafe.Pointer(sa))
+ return
+}
+
+// safeArrayCreateVector creates SafeArray.
+//
+// AKA: SafeArrayCreateVector in Windows API.
+func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (safearray *SafeArray, err error) {
+ sa, _, err := procSafeArrayCreateVector.Call(
+ uintptr(variantType),
+ uintptr(lowerBound),
+ uintptr(length))
+ safearray = (*SafeArray)(unsafe.Pointer(sa))
+ return
+}
+
+// safeArrayCreateVectorEx creates SafeArray.
+//
+// AKA: SafeArrayCreateVectorEx in Windows API.
+func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (safearray *SafeArray, err error) {
+ sa, _, err := procSafeArrayCreateVectorEx.Call(
+ uintptr(variantType),
+ uintptr(lowerBound),
+ uintptr(length),
+ extra)
+ safearray = (*SafeArray)(unsafe.Pointer(sa))
+ return
+}
+
+// safeArrayDestroy destroys SafeArray object.
+//
+// AKA: SafeArrayDestroy in Windows API.
+func safeArrayDestroy(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayDestroy.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayDestroyData destroys SafeArray object.
+//
+// AKA: SafeArrayDestroyData in Windows API.
+func safeArrayDestroyData(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayDestroyData.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayDestroyDescriptor destroys SafeArray object.
+//
+// AKA: SafeArrayDestroyDescriptor in Windows API.
+func safeArrayDestroyDescriptor(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayDestroyDescriptor.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayGetDim is the amount of dimensions in the SafeArray.
+//
+// SafeArrays may have multiple dimensions. Meaning, it could be
+// multidimensional array.
+//
+// AKA: SafeArrayGetDim in Windows API.
+func safeArrayGetDim(safearray *SafeArray) (dimensions *uint32, err error) {
+ l, _, err := procSafeArrayGetDim.Call(uintptr(unsafe.Pointer(safearray)))
+ dimensions = (*uint32)(unsafe.Pointer(l))
+ return
+}
+
+// safeArrayGetElementSize is the element size in bytes.
+//
+// AKA: SafeArrayGetElemsize in Windows API.
+func safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) {
+ l, _, err := procSafeArrayGetElemsize.Call(uintptr(unsafe.Pointer(safearray)))
+ length = (*uint32)(unsafe.Pointer(l))
+ return
+}
+
+// safeArrayGetElement retrieves element at given index.
+func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error {
+ return convertHresultToError(
+ procSafeArrayGetElement.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&index)),
+ uintptr(pv)))
+}
+
+// safeArrayGetElementString retrieves element at given index and converts to string.
+func safeArrayGetElementString(safearray *SafeArray, index int64) (str string, err error) {
+ var element *int16
+ err = convertHresultToError(
+ procSafeArrayGetElement.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&index)),
+ uintptr(unsafe.Pointer(&element))))
+ str = BstrToString(*(**uint16)(unsafe.Pointer(&element)))
+ SysFreeString(element)
+ return
+}
+
+// safeArrayGetIID is the InterfaceID of the elements in the SafeArray.
+//
+// AKA: SafeArrayGetIID in Windows API.
+func safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) {
+ err = convertHresultToError(
+ procSafeArrayGetIID.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&guid))))
+ return
+}
+
+// safeArrayGetLBound returns lower bounds of SafeArray.
+//
+// SafeArrays may have multiple dimensions. Meaning, it could be
+// multidimensional array.
+//
+// AKA: SafeArrayGetLBound in Windows API.
+func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int64, err error) {
+ err = convertHresultToError(
+ procSafeArrayGetLBound.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(dimension),
+ uintptr(unsafe.Pointer(&lowerBound))))
+ return
+}
+
+// safeArrayGetUBound returns upper bounds of SafeArray.
+//
+// SafeArrays may have multiple dimensions. Meaning, it could be
+// multidimensional array.
+//
+// AKA: SafeArrayGetUBound in Windows API.
+func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int64, err error) {
+ err = convertHresultToError(
+ procSafeArrayGetUBound.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(dimension),
+ uintptr(unsafe.Pointer(&upperBound))))
+ return
+}
+
+// safeArrayGetVartype returns data type of SafeArray.
+//
+// AKA: SafeArrayGetVartype in Windows API.
+func safeArrayGetVartype(safearray *SafeArray) (varType uint16, err error) {
+ err = convertHresultToError(
+ procSafeArrayGetVartype.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&varType))))
+ return
+}
+
+// safeArrayLock locks SafeArray for reading to modify SafeArray.
+//
+// This must be called during some calls to ensure that another process does not
+// read or write to the SafeArray during editing.
+//
+// AKA: SafeArrayLock in Windows API.
+func safeArrayLock(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayLock.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayUnlock unlocks SafeArray for reading.
+//
+// AKA: SafeArrayUnlock in Windows API.
+func safeArrayUnlock(safearray *SafeArray) (err error) {
+ err = convertHresultToError(procSafeArrayUnlock.Call(uintptr(unsafe.Pointer(safearray))))
+ return
+}
+
+// safeArrayPutElement stores the data element at the specified location in the
+// array.
+//
+// AKA: SafeArrayPutElement in Windows API.
+func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) (err error) {
+ err = convertHresultToError(
+ procSafeArrayPutElement.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&index)),
+ uintptr(unsafe.Pointer(element))))
+ return
+}
+
+// safeArrayGetRecordInfo accesses IRecordInfo info for custom types.
+//
+// AKA: SafeArrayGetRecordInfo in Windows API.
+//
+// XXX: Must implement IRecordInfo interface for this to return.
+func safeArrayGetRecordInfo(safearray *SafeArray) (recordInfo interface{}, err error) {
+ err = convertHresultToError(
+ procSafeArrayGetRecordInfo.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&recordInfo))))
+ return
+}
+
+// safeArraySetRecordInfo mutates IRecordInfo info for custom types.
+//
+// AKA: SafeArraySetRecordInfo in Windows API.
+//
+// XXX: Must implement IRecordInfo interface for this to return.
+func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) (err error) {
+ err = convertHresultToError(
+ procSafeArraySetRecordInfo.Call(
+ uintptr(unsafe.Pointer(safearray)),
+ uintptr(unsafe.Pointer(&recordInfo))))
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/safearrayconversion.go b/vendor/github.com/go-ole/go-ole/safearrayconversion.go
new file mode 100644
index 000000000..ffeb2b97b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/safearrayconversion.go
@@ -0,0 +1,140 @@
+// Helper for converting SafeArray to array of objects.
+
+package ole
+
+import (
+ "unsafe"
+)
+
+type SafeArrayConversion struct {
+ Array *SafeArray
+}
+
+func (sac *SafeArrayConversion) ToStringArray() (strings []string) {
+ totalElements, _ := sac.TotalElements(0)
+ strings = make([]string, totalElements)
+
+ for i := int64(0); i < totalElements; i++ {
+ strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i)
+ }
+
+ return
+}
+
+func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) {
+ totalElements, _ := sac.TotalElements(0)
+ bytes = make([]byte, totalElements)
+
+ for i := int64(0); i < totalElements; i++ {
+ safeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)]))
+ }
+
+ return
+}
+
+func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) {
+ totalElements, _ := sac.TotalElements(0)
+ values = make([]interface{}, totalElements)
+ vt, _ := safeArrayGetVartype(sac.Array)
+
+ for i := 0; i < int(totalElements); i++ {
+ switch VT(vt) {
+ case VT_BOOL:
+ var v bool
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_I1:
+ var v int8
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_I2:
+ var v int16
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_I4:
+ var v int32
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_I8:
+ var v int64
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_UI1:
+ var v uint8
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_UI2:
+ var v uint16
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_UI4:
+ var v uint32
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_UI8:
+ var v uint64
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_R4:
+ var v float32
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_R8:
+ var v float64
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_BSTR:
+ var v string
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v
+ case VT_VARIANT:
+ var v VARIANT
+ safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))
+ values[i] = v.Value()
+ default:
+ // TODO
+ }
+ }
+
+ return
+}
+
+func (sac *SafeArrayConversion) GetType() (varType uint16, err error) {
+ return safeArrayGetVartype(sac.Array)
+}
+
+func (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) {
+ return safeArrayGetDim(sac.Array)
+}
+
+func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) {
+ return safeArrayGetElementSize(sac.Array)
+}
+
+func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int64, err error) {
+ if index < 1 {
+ index = 1
+ }
+
+ // Get array bounds
+ var LowerBounds int64
+ var UpperBounds int64
+
+ LowerBounds, err = safeArrayGetLBound(sac.Array, index)
+ if err != nil {
+ return
+ }
+
+ UpperBounds, err = safeArrayGetUBound(sac.Array, index)
+ if err != nil {
+ return
+ }
+
+ totalElements = UpperBounds - LowerBounds + 1
+ return
+}
+
+// Release Safe Array memory
+func (sac *SafeArrayConversion) Release() {
+ safeArrayDestroy(sac.Array)
+}
diff --git a/vendor/github.com/go-ole/go-ole/safearrayslices.go b/vendor/github.com/go-ole/go-ole/safearrayslices.go
new file mode 100644
index 000000000..a9fa885f1
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/safearrayslices.go
@@ -0,0 +1,33 @@
+// +build windows
+
+package ole
+
+import (
+ "unsafe"
+)
+
+func safeArrayFromByteSlice(slice []byte) *SafeArray {
+ array, _ := safeArrayCreateVector(VT_UI1, 0, uint32(len(slice)))
+
+ if array == nil {
+ panic("Could not convert []byte to SAFEARRAY")
+ }
+
+ for i, v := range slice {
+ safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(&v)))
+ }
+ return array
+}
+
+func safeArrayFromStringSlice(slice []string) *SafeArray {
+ array, _ := safeArrayCreateVector(VT_BSTR, 0, uint32(len(slice)))
+
+ if array == nil {
+ panic("Could not convert []string to SAFEARRAY")
+ }
+ // SysAllocStringLen(s)
+ for i, v := range slice {
+ safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(SysAllocStringLen(v))))
+ }
+ return array
+}
diff --git a/vendor/github.com/go-ole/go-ole/utility.go b/vendor/github.com/go-ole/go-ole/utility.go
new file mode 100644
index 000000000..99ee82dc3
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/utility.go
@@ -0,0 +1,101 @@
+package ole
+
+import (
+ "unicode/utf16"
+ "unsafe"
+)
+
+// ClassIDFrom retrieves class ID whether given is program ID or application string.
+//
+// Helper that provides check against both Class ID from Program ID and Class ID from string. It is
+// faster, if you know which you are using, to use the individual functions, but this will check
+// against available functions for you.
+func ClassIDFrom(programID string) (classID *GUID, err error) {
+ classID, err = CLSIDFromProgID(programID)
+ if err != nil {
+ classID, err = CLSIDFromString(programID)
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
+// BytePtrToString converts byte pointer to a Go string.
+func BytePtrToString(p *byte) string {
+ a := (*[10000]uint8)(unsafe.Pointer(p))
+ i := 0
+ for a[i] != 0 {
+ i++
+ }
+ return string(a[:i])
+}
+
+// UTF16PtrToString is alias for LpOleStrToString.
+//
+// Kept for compatibility reasons.
+func UTF16PtrToString(p *uint16) string {
+ return LpOleStrToString(p)
+}
+
+// LpOleStrToString converts COM Unicode to Go string.
+func LpOleStrToString(p *uint16) string {
+ if p == nil {
+ return ""
+ }
+
+ length := lpOleStrLen(p)
+ a := make([]uint16, length)
+
+ ptr := unsafe.Pointer(p)
+
+ for i := 0; i < int(length); i++ {
+ a[i] = *(*uint16)(ptr)
+ ptr = unsafe.Pointer(uintptr(ptr) + 2)
+ }
+
+ return string(utf16.Decode(a))
+}
+
+// BstrToString converts COM binary string to Go string.
+func BstrToString(p *uint16) string {
+ if p == nil {
+ return ""
+ }
+ length := SysStringLen((*int16)(unsafe.Pointer(p)))
+ a := make([]uint16, length)
+
+ ptr := unsafe.Pointer(p)
+
+ for i := 0; i < int(length); i++ {
+ a[i] = *(*uint16)(ptr)
+ ptr = unsafe.Pointer(uintptr(ptr) + 2)
+ }
+ return string(utf16.Decode(a))
+}
+
+// lpOleStrLen returns the length of Unicode string.
+func lpOleStrLen(p *uint16) (length int64) {
+ if p == nil {
+ return 0
+ }
+
+ ptr := unsafe.Pointer(p)
+
+ for i := 0; ; i++ {
+ if 0 == *(*uint16)(ptr) {
+ length = int64(i)
+ break
+ }
+ ptr = unsafe.Pointer(uintptr(ptr) + 2)
+ }
+ return
+}
+
+// convertHresultToError converts syscall to error, if call is unsuccessful.
+func convertHresultToError(hr uintptr, r2 uintptr, ignore error) (err error) {
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
diff --git a/vendor/github.com/go-ole/go-ole/variables.go b/vendor/github.com/go-ole/go-ole/variables.go
new file mode 100644
index 000000000..ebe00f1cf
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/variables.go
@@ -0,0 +1,16 @@
+// +build windows
+
+package ole
+
+import (
+ "syscall"
+)
+
+var (
+ modcombase = syscall.NewLazyDLL("combase.dll")
+ modkernel32, _ = syscall.LoadDLL("kernel32.dll")
+ modole32, _ = syscall.LoadDLL("ole32.dll")
+ modoleaut32, _ = syscall.LoadDLL("oleaut32.dll")
+ modmsvcrt, _ = syscall.LoadDLL("msvcrt.dll")
+ moduser32, _ = syscall.LoadDLL("user32.dll")
+)
diff --git a/vendor/github.com/go-ole/go-ole/variant.go b/vendor/github.com/go-ole/go-ole/variant.go
new file mode 100644
index 000000000..36969725e
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/variant.go
@@ -0,0 +1,105 @@
+package ole
+
+import "unsafe"
+
+// NewVariant returns new variant based on type and value.
+func NewVariant(vt VT, val int64) VARIANT {
+ return VARIANT{VT: vt, Val: val}
+}
+
+// ToIUnknown converts Variant to Unknown object.
+func (v *VARIANT) ToIUnknown() *IUnknown {
+ if v.VT != VT_UNKNOWN {
+ return nil
+ }
+ return (*IUnknown)(unsafe.Pointer(uintptr(v.Val)))
+}
+
+// ToIDispatch converts variant to dispatch object.
+func (v *VARIANT) ToIDispatch() *IDispatch {
+ if v.VT != VT_DISPATCH {
+ return nil
+ }
+ return (*IDispatch)(unsafe.Pointer(uintptr(v.Val)))
+}
+
+// ToArray converts variant to SafeArray helper.
+func (v *VARIANT) ToArray() *SafeArrayConversion {
+ if v.VT != VT_SAFEARRAY {
+ if v.VT&VT_ARRAY == 0 {
+ return nil
+ }
+ }
+ var safeArray *SafeArray = (*SafeArray)(unsafe.Pointer(uintptr(v.Val)))
+ return &SafeArrayConversion{safeArray}
+}
+
+// ToString converts variant to Go string.
+func (v *VARIANT) ToString() string {
+ if v.VT != VT_BSTR {
+ return ""
+ }
+ return BstrToString(*(**uint16)(unsafe.Pointer(&v.Val)))
+}
+
+// Clear the memory of variant object.
+func (v *VARIANT) Clear() error {
+ return VariantClear(v)
+}
+
+// Value returns variant value based on its type.
+//
+// Currently supported types: 2- and 4-byte integers, strings, bools.
+// Note that 64-bit integers, datetimes, and other types are stored as strings
+// and will be returned as strings.
+//
+// Needs to be further converted, because this returns an interface{}.
+func (v *VARIANT) Value() interface{} {
+ switch v.VT {
+ case VT_I1:
+ return int8(v.Val)
+ case VT_UI1:
+ return uint8(v.Val)
+ case VT_I2:
+ return int16(v.Val)
+ case VT_UI2:
+ return uint16(v.Val)
+ case VT_I4:
+ return int32(v.Val)
+ case VT_UI4:
+ return uint32(v.Val)
+ case VT_I8:
+ return int64(v.Val)
+ case VT_UI8:
+ return uint64(v.Val)
+ case VT_INT:
+ return int(v.Val)
+ case VT_UINT:
+ return uint(v.Val)
+ case VT_INT_PTR:
+ return uintptr(v.Val) // TODO
+ case VT_UINT_PTR:
+ return uintptr(v.Val)
+ case VT_R4:
+ return *(*float32)(unsafe.Pointer(&v.Val))
+ case VT_R8:
+ return *(*float64)(unsafe.Pointer(&v.Val))
+ case VT_BSTR:
+ return v.ToString()
+ case VT_DATE:
+ // VT_DATE type will either return float64 or time.Time.
+ d := float64(v.Val)
+ date, err := GetVariantDate(d)
+ if err != nil {
+ return d
+ }
+ return date
+ case VT_UNKNOWN:
+ return v.ToIUnknown()
+ case VT_DISPATCH:
+ return v.ToIDispatch()
+ case VT_BOOL:
+ return v.Val != 0
+ }
+ return nil
+}
diff --git a/vendor/github.com/go-ole/go-ole/variant_386.go b/vendor/github.com/go-ole/go-ole/variant_386.go
new file mode 100644
index 000000000..e73736bf3
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/variant_386.go
@@ -0,0 +1,11 @@
+// +build 386
+
+package ole
+
+type VARIANT struct {
+ VT VT // 2
+ wReserved1 uint16 // 4
+ wReserved2 uint16 // 6
+ wReserved3 uint16 // 8
+ Val int64 // 16
+}
diff --git a/vendor/github.com/go-ole/go-ole/variant_amd64.go b/vendor/github.com/go-ole/go-ole/variant_amd64.go
new file mode 100644
index 000000000..dccdde132
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/variant_amd64.go
@@ -0,0 +1,12 @@
+// +build amd64
+
+package ole
+
+type VARIANT struct {
+ VT VT // 2
+ wReserved1 uint16 // 4
+ wReserved2 uint16 // 6
+ wReserved3 uint16 // 8
+ Val int64 // 16
+ _ [8]byte // 24
+}
diff --git a/vendor/github.com/go-ole/go-ole/variant_s390x.go b/vendor/github.com/go-ole/go-ole/variant_s390x.go
new file mode 100644
index 000000000..9874ca66b
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/variant_s390x.go
@@ -0,0 +1,12 @@
+// +build s390x
+
+package ole
+
+type VARIANT struct {
+ VT VT // 2
+ wReserved1 uint16 // 4
+ wReserved2 uint16 // 6
+ wReserved3 uint16 // 8
+ Val int64 // 16
+ _ [8]byte // 24
+}
diff --git a/vendor/github.com/go-ole/go-ole/vt_string.go b/vendor/github.com/go-ole/go-ole/vt_string.go
new file mode 100644
index 000000000..729b4a04d
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/vt_string.go
@@ -0,0 +1,58 @@
+// generated by stringer -output vt_string.go -type VT; DO NOT EDIT
+
+package ole
+
+import "fmt"
+
+const (
+ _VT_name_0 = "VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCHVT_ERRORVT_BOOLVT_VARIANTVT_UNKNOWNVT_DECIMAL"
+ _VT_name_1 = "VT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTR"
+ _VT_name_2 = "VT_RECORDVT_INT_PTRVT_UINT_PTR"
+ _VT_name_3 = "VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSID"
+ _VT_name_4 = "VT_BSTR_BLOBVT_VECTOR"
+ _VT_name_5 = "VT_ARRAY"
+ _VT_name_6 = "VT_BYREF"
+ _VT_name_7 = "VT_RESERVED"
+ _VT_name_8 = "VT_ILLEGAL"
+)
+
+var (
+ _VT_index_0 = [...]uint8{0, 8, 15, 20, 25, 30, 35, 40, 47, 54, 65, 73, 80, 90, 100, 110}
+ _VT_index_1 = [...]uint8{0, 5, 11, 17, 23, 28, 34, 40, 47, 54, 64, 70, 82, 91, 105, 113, 122}
+ _VT_index_2 = [...]uint8{0, 9, 19, 30}
+ _VT_index_3 = [...]uint8{0, 11, 18, 27, 37, 55, 71, 85, 90, 98}
+ _VT_index_4 = [...]uint8{0, 12, 21}
+ _VT_index_5 = [...]uint8{0, 8}
+ _VT_index_6 = [...]uint8{0, 8}
+ _VT_index_7 = [...]uint8{0, 11}
+ _VT_index_8 = [...]uint8{0, 10}
+)
+
+func (i VT) String() string {
+ switch {
+ case 0 <= i && i <= 14:
+ return _VT_name_0[_VT_index_0[i]:_VT_index_0[i+1]]
+ case 16 <= i && i <= 31:
+ i -= 16
+ return _VT_name_1[_VT_index_1[i]:_VT_index_1[i+1]]
+ case 36 <= i && i <= 38:
+ i -= 36
+ return _VT_name_2[_VT_index_2[i]:_VT_index_2[i+1]]
+ case 64 <= i && i <= 72:
+ i -= 64
+ return _VT_name_3[_VT_index_3[i]:_VT_index_3[i+1]]
+ case 4095 <= i && i <= 4096:
+ i -= 4095
+ return _VT_name_4[_VT_index_4[i]:_VT_index_4[i+1]]
+ case i == 8192:
+ return _VT_name_5
+ case i == 16384:
+ return _VT_name_6
+ case i == 32768:
+ return _VT_name_7
+ case i == 65535:
+ return _VT_name_8
+ default:
+ return fmt.Sprintf("VT(%d)", i)
+ }
+}
diff --git a/vendor/github.com/go-ole/go-ole/winrt.go b/vendor/github.com/go-ole/go-ole/winrt.go
new file mode 100644
index 000000000..4e9eca732
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/winrt.go
@@ -0,0 +1,99 @@
+// +build windows
+
+package ole
+
+import (
+ "reflect"
+ "syscall"
+ "unicode/utf8"
+ "unsafe"
+)
+
+var (
+ procRoInitialize = modcombase.NewProc("RoInitialize")
+ procRoActivateInstance = modcombase.NewProc("RoActivateInstance")
+ procRoGetActivationFactory = modcombase.NewProc("RoGetActivationFactory")
+ procWindowsCreateString = modcombase.NewProc("WindowsCreateString")
+ procWindowsDeleteString = modcombase.NewProc("WindowsDeleteString")
+ procWindowsGetStringRawBuffer = modcombase.NewProc("WindowsGetStringRawBuffer")
+)
+
+func RoInitialize(thread_type uint32) (err error) {
+ hr, _, _ := procRoInitialize.Call(uintptr(thread_type))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func RoActivateInstance(clsid string) (ins *IInspectable, err error) {
+ hClsid, err := NewHString(clsid)
+ if err != nil {
+ return nil, err
+ }
+ defer DeleteHString(hClsid)
+
+ hr, _, _ := procRoActivateInstance.Call(
+ uintptr(unsafe.Pointer(hClsid)),
+ uintptr(unsafe.Pointer(&ins)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) {
+ hClsid, err := NewHString(clsid)
+ if err != nil {
+ return nil, err
+ }
+ defer DeleteHString(hClsid)
+
+ hr, _, _ := procRoGetActivationFactory.Call(
+ uintptr(unsafe.Pointer(hClsid)),
+ uintptr(unsafe.Pointer(iid)),
+ uintptr(unsafe.Pointer(&ins)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// HString is handle string for pointers.
+type HString uintptr
+
+// NewHString returns a new HString for Go string.
+func NewHString(s string) (hstring HString, err error) {
+ u16 := syscall.StringToUTF16Ptr(s)
+ len := uint32(utf8.RuneCountInString(s))
+ hr, _, _ := procWindowsCreateString.Call(
+ uintptr(unsafe.Pointer(u16)),
+ uintptr(len),
+ uintptr(unsafe.Pointer(&hstring)))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// DeleteHString deletes HString.
+func DeleteHString(hstring HString) (err error) {
+ hr, _, _ := procWindowsDeleteString.Call(uintptr(hstring))
+ if hr != 0 {
+ err = NewError(hr)
+ }
+ return
+}
+
+// String returns Go string value of HString.
+func (h HString) String() string {
+ var u16buf uintptr
+ var u16len uint32
+ u16buf, _, _ = procWindowsGetStringRawBuffer.Call(
+ uintptr(h),
+ uintptr(unsafe.Pointer(&u16len)))
+
+ u16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)}
+ u16 := *(*[]uint16)(unsafe.Pointer(&u16hdr))
+ return syscall.UTF16ToString(u16)
+}
diff --git a/vendor/github.com/go-ole/go-ole/winrt_doc.go b/vendor/github.com/go-ole/go-ole/winrt_doc.go
new file mode 100644
index 000000000..52e6d74c9
--- /dev/null
+++ b/vendor/github.com/go-ole/go-ole/winrt_doc.go
@@ -0,0 +1,36 @@
+// +build !windows
+
+package ole
+
+// RoInitialize
+func RoInitialize(thread_type uint32) (err error) {
+ return NewError(E_NOTIMPL)
+}
+
+// RoActivateInstance
+func RoActivateInstance(clsid string) (ins *IInspectable, err error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// RoGetActivationFactory
+func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) {
+ return nil, NewError(E_NOTIMPL)
+}
+
+// HString is handle string for pointers.
+type HString uintptr
+
+// NewHString returns a new HString for Go string.
+func NewHString(s string) (hstring HString, err error) {
+ return HString(uintptr(0)), NewError(E_NOTIMPL)
+}
+
+// DeleteHString deletes HString.
+func DeleteHString(hstring HString) (err error) {
+ return NewError(E_NOTIMPL)
+}
+
+// String returns Go string value of HString.
+func (h HString) String() string {
+ return ""
+}
diff --git a/vendor/github.com/pkg/errors/LICENSE b/vendor/github.com/pkg/errors/LICENSE
new file mode 100644
index 000000000..835ba3e75
--- /dev/null
+++ b/vendor/github.com/pkg/errors/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2015, Dave Cheney <dave@cheney.net>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md
new file mode 100644
index 000000000..6483ba2af
--- /dev/null
+++ b/vendor/github.com/pkg/errors/README.md
@@ -0,0 +1,52 @@
+# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) [![Sourcegraph](https://sourcegraph.com/github.com/pkg/errors/-/badge.svg)](https://sourcegraph.com/github.com/pkg/errors?badge)
+
+Package errors provides simple error handling primitives.
+
+`go get github.com/pkg/errors`
+
+The traditional error handling idiom in Go is roughly akin to
+```go
+if err != nil {
+ return err
+}
+```
+which applied recursively up the call stack results in error reports without context or debugging information. The errors package allows programmers to add context to the failure path in their code in a way that does not destroy the original value of the error.
+
+## Adding context to an error
+
+The errors.Wrap function returns a new error that adds context to the original error. For example
+```go
+_, err := ioutil.ReadAll(r)
+if err != nil {
+ return errors.Wrap(err, "read failed")
+}
+```
+## Retrieving the cause of an error
+
+Using `errors.Wrap` constructs a stack of errors, adding context to the preceding error. Depending on the nature of the error it may be necessary to reverse the operation of errors.Wrap to retrieve the original error for inspection. Any error value which implements this interface can be inspected by `errors.Cause`.
+```go
+type causer interface {
+ Cause() error
+}
+```
+`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example:
+```go
+switch err := errors.Cause(err).(type) {
+case *MyError:
+ // handle specifically
+default:
+ // unknown error
+}
+```
+
+[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors).
+
+## Contributing
+
+We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high.
+
+Before proposing a change, please discuss your change by raising an issue.
+
+## License
+
+BSD-2-Clause
diff --git a/vendor/github.com/pkg/errors/appveyor.yml b/vendor/github.com/pkg/errors/appveyor.yml
new file mode 100644
index 000000000..a932eade0
--- /dev/null
+++ b/vendor/github.com/pkg/errors/appveyor.yml
@@ -0,0 +1,32 @@
+version: build-{build}.{branch}
+
+clone_folder: C:\gopath\src\github.com\pkg\errors
+shallow_clone: true # for startup speed
+
+environment:
+ GOPATH: C:\gopath
+
+platform:
+ - x64
+
+# http://www.appveyor.com/docs/installed-software
+install:
+ # some helpful output for debugging builds
+ - go version
+ - go env
+ # pre-installed MinGW at C:\MinGW is 32bit only
+ # but MSYS2 at C:\msys64 has mingw64
+ - set PATH=C:\msys64\mingw64\bin;%PATH%
+ - gcc --version
+ - g++ --version
+
+build_script:
+ - go install -v ./...
+
+test_script:
+ - set PATH=C:\gopath\bin;%PATH%
+ - go test -v ./...
+
+#artifacts:
+# - path: '%GOPATH%\bin\*.exe'
+deploy: off
diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go
new file mode 100644
index 000000000..842ee8045
--- /dev/null
+++ b/vendor/github.com/pkg/errors/errors.go
@@ -0,0 +1,269 @@
+// Package errors provides simple error handling primitives.
+//
+// The traditional error handling idiom in Go is roughly akin to
+//
+// if err != nil {
+// return err
+// }
+//
+// which applied recursively up the call stack results in error reports
+// without context or debugging information. The errors package allows
+// programmers to add context to the failure path in their code in a way
+// that does not destroy the original value of the error.
+//
+// Adding context to an error
+//
+// The errors.Wrap function returns a new error that adds context to the
+// original error by recording a stack trace at the point Wrap is called,
+// and the supplied message. For example
+//
+// _, err := ioutil.ReadAll(r)
+// if err != nil {
+// return errors.Wrap(err, "read failed")
+// }
+//
+// If additional control is required the errors.WithStack and errors.WithMessage
+// functions destructure errors.Wrap into its component operations of annotating
+// an error with a stack trace and an a message, respectively.
+//
+// Retrieving the cause of an error
+//
+// Using errors.Wrap constructs a stack of errors, adding context to the
+// preceding error. Depending on the nature of the error it may be necessary
+// to reverse the operation of errors.Wrap to retrieve the original error
+// for inspection. Any error value which implements this interface
+//
+// type causer interface {
+// Cause() error
+// }
+//
+// can be inspected by errors.Cause. errors.Cause will recursively retrieve
+// the topmost error which does not implement causer, which is assumed to be
+// the original cause. For example:
+//
+// switch err := errors.Cause(err).(type) {
+// case *MyError:
+// // handle specifically
+// default:
+// // unknown error
+// }
+//
+// causer interface is not exported by this package, but is considered a part
+// of stable public API.
+//
+// Formatted printing of errors
+//
+// All error values returned from this package implement fmt.Formatter and can
+// be formatted by the fmt package. The following verbs are supported
+//
+// %s print the error. If the error has a Cause it will be
+// printed recursively
+// %v see %s
+// %+v extended format. Each Frame of the error's StackTrace will
+// be printed in detail.
+//
+// Retrieving the stack trace of an error or wrapper
+//
+// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are
+// invoked. This information can be retrieved with the following interface.
+//
+// type stackTracer interface {
+// StackTrace() errors.StackTrace
+// }
+//
+// Where errors.StackTrace is defined as
+//
+// type StackTrace []Frame
+//
+// The Frame type represents a call site in the stack trace. Frame supports
+// the fmt.Formatter interface that can be used for printing information about
+// the stack trace of this error. For example:
+//
+// if err, ok := err.(stackTracer); ok {
+// for _, f := range err.StackTrace() {
+// fmt.Printf("%+s:%d", f)
+// }
+// }
+//
+// stackTracer interface is not exported by this package, but is considered a part
+// of stable public API.
+//
+// See the documentation for Frame.Format for more details.
+package errors
+
+import (
+ "fmt"
+ "io"
+)
+
+// New returns an error with the supplied message.
+// New also records the stack trace at the point it was called.
+func New(message string) error {
+ return &fundamental{
+ msg: message,
+ stack: callers(),
+ }
+}
+
+// Errorf formats according to a format specifier and returns the string
+// as a value that satisfies error.
+// Errorf also records the stack trace at the point it was called.
+func Errorf(format string, args ...interface{}) error {
+ return &fundamental{
+ msg: fmt.Sprintf(format, args...),
+ stack: callers(),
+ }
+}
+
+// fundamental is an error that has a message and a stack, but no caller.
+type fundamental struct {
+ msg string
+ *stack
+}
+
+func (f *fundamental) Error() string { return f.msg }
+
+func (f *fundamental) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ if s.Flag('+') {
+ io.WriteString(s, f.msg)
+ f.stack.Format(s, verb)
+ return
+ }
+ fallthrough
+ case 's':
+ io.WriteString(s, f.msg)
+ case 'q':
+ fmt.Fprintf(s, "%q", f.msg)
+ }
+}
+
+// WithStack annotates err with a stack trace at the point WithStack was called.
+// If err is nil, WithStack returns nil.
+func WithStack(err error) error {
+ if err == nil {
+ return nil
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
+type withStack struct {
+ error
+ *stack
+}
+
+func (w *withStack) Cause() error { return w.error }
+
+func (w *withStack) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ if s.Flag('+') {
+ fmt.Fprintf(s, "%+v", w.Cause())
+ w.stack.Format(s, verb)
+ return
+ }
+ fallthrough
+ case 's':
+ io.WriteString(s, w.Error())
+ case 'q':
+ fmt.Fprintf(s, "%q", w.Error())
+ }
+}
+
+// Wrap returns an error annotating err with a stack trace
+// at the point Wrap is called, and the supplied message.
+// If err is nil, Wrap returns nil.
+func Wrap(err error, message string) error {
+ if err == nil {
+ return nil
+ }
+ err = &withMessage{
+ cause: err,
+ msg: message,
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
+// Wrapf returns an error annotating err with a stack trace
+// at the point Wrapf is call, and the format specifier.
+// If err is nil, Wrapf returns nil.
+func Wrapf(err error, format string, args ...interface{}) error {
+ if err == nil {
+ return nil
+ }
+ err = &withMessage{
+ cause: err,
+ msg: fmt.Sprintf(format, args...),
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
+// WithMessage annotates err with a new message.
+// If err is nil, WithMessage returns nil.
+func WithMessage(err error, message string) error {
+ if err == nil {
+ return nil
+ }
+ return &withMessage{
+ cause: err,
+ msg: message,
+ }
+}
+
+type withMessage struct {
+ cause error
+ msg string
+}
+
+func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() }
+func (w *withMessage) Cause() error { return w.cause }
+
+func (w *withMessage) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ if s.Flag('+') {
+ fmt.Fprintf(s, "%+v\n", w.Cause())
+ io.WriteString(s, w.msg)
+ return
+ }
+ fallthrough
+ case 's', 'q':
+ io.WriteString(s, w.Error())
+ }
+}
+
+// Cause returns the underlying cause of the error, if possible.
+// An error value has a cause if it implements the following
+// interface:
+//
+// type causer interface {
+// Cause() error
+// }
+//
+// If the error does not implement Cause, the original error will
+// be returned. If the error is nil, nil will be returned without further
+// investigation.
+func Cause(err error) error {
+ type causer interface {
+ Cause() error
+ }
+
+ for err != nil {
+ cause, ok := err.(causer)
+ if !ok {
+ break
+ }
+ err = cause.Cause()
+ }
+ return err
+}
diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go
new file mode 100644
index 000000000..b485761a7
--- /dev/null
+++ b/vendor/github.com/pkg/errors/stack.go
@@ -0,0 +1,187 @@
+package errors
+
+import (
+ "fmt"
+ "io"
+ "path"
+ "runtime"
+ "strings"
+)
+
+// Frame represents a program counter inside a stack frame.
+type Frame uintptr
+
+// pc returns the program counter for this frame;
+// multiple frames may have the same PC value.
+func (f Frame) pc() uintptr { return uintptr(f) - 1 }
+
+// file returns the full path to the file that contains the
+// function for this Frame's pc.
+func (f Frame) file() string {
+ fn := runtime.FuncForPC(f.pc())
+ if fn == nil {
+ return "unknown"
+ }
+ file, _ := fn.FileLine(f.pc())
+ return file
+}
+
+// line returns the line number of source code of the
+// function for this Frame's pc.
+func (f Frame) line() int {
+ fn := runtime.FuncForPC(f.pc())
+ if fn == nil {
+ return 0
+ }
+ _, line := fn.FileLine(f.pc())
+ return line
+}
+
+// Format formats the frame according to the fmt.Formatter interface.
+//
+// %s source file
+// %d source line
+// %n function name
+// %v equivalent to %s:%d
+//
+// Format accepts flags that alter the printing of some verbs, as follows:
+//
+// %+s function name and path of source file relative to the compile time
+// GOPATH separated by \n\t (<funcname>\n\t<path>)
+// %+v equivalent to %+s:%d
+func (f Frame) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 's':
+ switch {
+ case s.Flag('+'):
+ pc := f.pc()
+ fn := runtime.FuncForPC(pc)
+ if fn == nil {
+ io.WriteString(s, "unknown")
+ } else {
+ file, _ := fn.FileLine(pc)
+ fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file)
+ }
+ default:
+ io.WriteString(s, path.Base(f.file()))
+ }
+ case 'd':
+ fmt.Fprintf(s, "%d", f.line())
+ case 'n':
+ name := runtime.FuncForPC(f.pc()).Name()
+ io.WriteString(s, funcname(name))
+ case 'v':
+ f.Format(s, 's')
+ io.WriteString(s, ":")
+ f.Format(s, 'd')
+ }
+}
+
+// StackTrace is stack of Frames from innermost (newest) to outermost (oldest).
+type StackTrace []Frame
+
+// Format formats the stack of Frames according to the fmt.Formatter interface.
+//
+// %s lists source files for each Frame in the stack
+// %v lists the source file and line number for each Frame in the stack
+//
+// Format accepts flags that alter the printing of some verbs, as follows:
+//
+// %+v Prints filename, function, and line number for each Frame in the stack.
+func (st StackTrace) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ switch {
+ case s.Flag('+'):
+ for _, f := range st {
+ fmt.Fprintf(s, "\n%+v", f)
+ }
+ case s.Flag('#'):
+ fmt.Fprintf(s, "%#v", []Frame(st))
+ default:
+ fmt.Fprintf(s, "%v", []Frame(st))
+ }
+ case 's':
+ fmt.Fprintf(s, "%s", []Frame(st))
+ }
+}
+
+// stack represents a stack of program counters.
+type stack []uintptr
+
+func (s *stack) Format(st fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ switch {
+ case st.Flag('+'):
+ for _, pc := range *s {
+ f := Frame(pc)
+ fmt.Fprintf(st, "\n%+v", f)
+ }
+ }
+ }
+}
+
+func (s *stack) StackTrace() StackTrace {
+ f := make([]Frame, len(*s))
+ for i := 0; i < len(f); i++ {
+ f[i] = Frame((*s)[i])
+ }
+ return f
+}
+
+func callers() *stack {
+ const depth = 32
+ var pcs [depth]uintptr
+ n := runtime.Callers(3, pcs[:])
+ var st stack = pcs[0:n]
+ return &st
+}
+
+// funcname removes the path prefix component of a function's name reported by func.Name().
+func funcname(name string) string {
+ i := strings.LastIndex(name, "/")
+ name = name[i+1:]
+ i = strings.Index(name, ".")
+ return name[i+1:]
+}
+
+func trimGOPATH(name, file string) string {
+ // Here we want to get the source file path relative to the compile time
+ // GOPATH. As of Go 1.6.x there is no direct way to know the compiled
+ // GOPATH at runtime, but we can infer the number of path segments in the
+ // GOPATH. We note that fn.Name() returns the function name qualified by
+ // the import path, which does not include the GOPATH. Thus we can trim
+ // segments from the beginning of the file path until the number of path
+ // separators remaining is one more than the number of path separators in
+ // the function name. For example, given:
+ //
+ // GOPATH /home/user
+ // file /home/user/src/pkg/sub/file.go
+ // fn.Name() pkg/sub.Type.Method
+ //
+ // We want to produce:
+ //
+ // pkg/sub/file.go
+ //
+ // From this we can easily see that fn.Name() has one less path separator
+ // than our desired output. We count separators from the end of the file
+ // path until it finds two more than in the function name and then move
+ // one character forward to preserve the initial path segment without a
+ // leading separator.
+ const sep = "/"
+ goal := strings.Count(name, sep) + 2
+ i := len(file)
+ for n := 0; n < goal; n++ {
+ i = strings.LastIndex(file[:i], sep)
+ if i == -1 {
+ // not enough separators found, set i so that the slice expression
+ // below leaves file unmodified
+ i = -len(sep)
+ break
+ }
+ }
+ // get back to 0 or trim the leading separator
+ file = file[i+len(sep):]
+ return file
+}
diff --git a/vendor/github.com/rjeczalik/notify/README.md b/vendor/github.com/rjeczalik/notify/README.md
index a728d1dd0..02a5f3290 100644
--- a/vendor/github.com/rjeczalik/notify/README.md
+++ b/vendor/github.com/rjeczalik/notify/README.md
@@ -18,4 +18,4 @@ Filesystem event notification library on steroids. (under active development)
- [github.com/rjeczalik/cmd/notify](https://godoc.org/github.com/rjeczalik/cmd/notify)
- [github.com/cortesi/devd](https://github.com/cortesi/devd)
- [github.com/cortesi/modd](https://github.com/cortesi/modd)
-
+- [github.com/syncthing/syncthing-inotify](https://github.com/syncthing/syncthing-inotify)
diff --git a/vendor/github.com/rjeczalik/notify/appveyor.yml b/vendor/github.com/rjeczalik/notify/appveyor.yml
index 8e762d05c..a495bd7c7 100644
--- a/vendor/github.com/rjeczalik/notify/appveyor.yml
+++ b/vendor/github.com/rjeczalik/notify/appveyor.yml
@@ -16,7 +16,7 @@ install:
build_script:
- go tool vet -all .
- go build ./...
- - go test -v -race ./...
+ - go test -v -timeout 60s -race ./...
test: off
diff --git a/vendor/github.com/rjeczalik/notify/debug.go b/vendor/github.com/rjeczalik/notify/debug.go
index bd9bc468d..2a3eb3370 100644
--- a/vendor/github.com/rjeczalik/notify/debug.go
+++ b/vendor/github.com/rjeczalik/notify/debug.go
@@ -2,10 +2,52 @@
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
-// +build !debug
-
package notify
-func dbgprint(...interface{}) {}
+import (
+ "log"
+ "os"
+ "runtime"
+ "strings"
+)
+
+var dbgprint func(...interface{})
+
+var dbgprintf func(string, ...interface{})
+
+var dbgcallstack func(max int) []string
-func dbgprintf(string, ...interface{}) {}
+func init() {
+ if _, ok := os.LookupEnv("NOTIFY_DEBUG"); ok || debugTag {
+ log.SetOutput(os.Stdout)
+ log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)
+ dbgprint = func(v ...interface{}) {
+ v = append([]interface{}{"[D] "}, v...)
+ log.Println(v...)
+ }
+ dbgprintf = func(format string, v ...interface{}) {
+ format = "[D] " + format
+ log.Printf(format, v...)
+ }
+ dbgcallstack = func(max int) []string {
+ pc, stack := make([]uintptr, max), make([]string, 0, max)
+ runtime.Callers(2, pc)
+ for _, pc := range pc {
+ if f := runtime.FuncForPC(pc); f != nil {
+ fname := f.Name()
+ idx := strings.LastIndex(fname, string(os.PathSeparator))
+ if idx != -1 {
+ stack = append(stack, fname[idx+1:])
+ } else {
+ stack = append(stack, fname)
+ }
+ }
+ }
+ return stack
+ }
+ return
+ }
+ dbgprint = func(v ...interface{}) {}
+ dbgprintf = func(format string, v ...interface{}) {}
+ dbgcallstack = func(max int) []string { return nil }
+}
diff --git a/vendor/github.com/rjeczalik/notify/debug_debug.go b/vendor/github.com/rjeczalik/notify/debug_debug.go
index f0622917f..6fca891ab 100644
--- a/vendor/github.com/rjeczalik/notify/debug_debug.go
+++ b/vendor/github.com/rjeczalik/notify/debug_debug.go
@@ -6,38 +6,4 @@
package notify
-import (
- "fmt"
- "os"
- "runtime"
- "strings"
-)
-
-func dbgprint(v ...interface{}) {
- fmt.Printf("[D] ")
- fmt.Print(v...)
- fmt.Printf("\n\n")
-}
-
-func dbgprintf(format string, v ...interface{}) {
- fmt.Printf("[D] ")
- fmt.Printf(format, v...)
- fmt.Printf("\n\n")
-}
-
-func dbgcallstack(max int) []string {
- pc, stack := make([]uintptr, max), make([]string, 0, max)
- runtime.Callers(2, pc)
- for _, pc := range pc {
- if f := runtime.FuncForPC(pc); f != nil {
- fname := f.Name()
- idx := strings.LastIndex(fname, string(os.PathSeparator))
- if idx != -1 {
- stack = append(stack, fname[idx+1:])
- } else {
- stack = append(stack, fname)
- }
- }
- }
- return stack
-}
+var debugTag bool = true
diff --git a/vendor/github.com/rjeczalik/notify/debug_nodebug.go b/vendor/github.com/rjeczalik/notify/debug_nodebug.go
new file mode 100644
index 000000000..be391a276
--- /dev/null
+++ b/vendor/github.com/rjeczalik/notify/debug_nodebug.go
@@ -0,0 +1,9 @@
+// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+// +build !debug
+
+package notify
+
+var debugTag bool = false
diff --git a/vendor/github.com/rjeczalik/notify/doc.go b/vendor/github.com/rjeczalik/notify/doc.go
index 8a99ddda6..60543c083 100644
--- a/vendor/github.com/rjeczalik/notify/doc.go
+++ b/vendor/github.com/rjeczalik/notify/doc.go
@@ -12,11 +12,14 @@
// source file.
//
// On top of filesystem watchers notify maintains a watchpoint tree, which provides
-// strategy for creating and closing filesystem watches and dispatching filesystem
+// a strategy for creating and closing filesystem watches and dispatching filesystem
// events to user channels.
//
// An event set is just an event list joint using bitwise OR operator
// into a single event value.
+// Both the platform-independent (see Constants) and specific events can be used.
+// Refer to the event_*.go source files for information about the available
+// events.
//
// A filesystem watch or just a watch is platform-specific entity which represents
// a single path registered for notifications for specific event set. Setting a watch
@@ -35,6 +38,6 @@
// A watchpoint is a list of user channel and event set pairs for particular
// path (watchpoint tree's node). A single watchpoint can contain multiple
// different user channels registered to listen for one or more events. A single
-// user channel can be registered in one or more watchpoints, recurisve and
+// user channel can be registered in one or more watchpoints, recursive and
// non-recursive ones as well.
package notify
diff --git a/vendor/github.com/rjeczalik/notify/event.go b/vendor/github.com/rjeczalik/notify/event.go
index e045edcec..c12884197 100644
--- a/vendor/github.com/rjeczalik/notify/event.go
+++ b/vendor/github.com/rjeczalik/notify/event.go
@@ -73,7 +73,7 @@ func (e Event) String() string {
//
// https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/index.html#//apple_ref/doc/constant_group/FSEventStreamEventFlags
//
-// Under Linux (inotify) Sys() always returns a non-nil *syscall.InotifyEvent
+// Under Linux (inotify) Sys() always returns a non-nil *unix.InotifyEvent
// value, defined as:
//
// type InotifyEvent struct {
diff --git a/vendor/github.com/rjeczalik/notify/event_inotify.go b/vendor/github.com/rjeczalik/notify/event_inotify.go
index 82954a9b3..1f32bb73e 100644
--- a/vendor/github.com/rjeczalik/notify/event_inotify.go
+++ b/vendor/github.com/rjeczalik/notify/event_inotify.go
@@ -6,7 +6,7 @@
package notify
-import "syscall"
+import "golang.org/x/sys/unix"
// Platform independent event values.
const (
@@ -25,18 +25,18 @@ const (
// Inotify specific masks are legal, implemented events that are guaranteed to
// work with notify package on linux-based systems.
const (
- InAccess = Event(syscall.IN_ACCESS) // File was accessed
- InModify = Event(syscall.IN_MODIFY) // File was modified
- InAttrib = Event(syscall.IN_ATTRIB) // Metadata changed
- InCloseWrite = Event(syscall.IN_CLOSE_WRITE) // Writtable file was closed
- InCloseNowrite = Event(syscall.IN_CLOSE_NOWRITE) // Unwrittable file closed
- InOpen = Event(syscall.IN_OPEN) // File was opened
- InMovedFrom = Event(syscall.IN_MOVED_FROM) // File was moved from X
- InMovedTo = Event(syscall.IN_MOVED_TO) // File was moved to Y
- InCreate = Event(syscall.IN_CREATE) // Subfile was created
- InDelete = Event(syscall.IN_DELETE) // Subfile was deleted
- InDeleteSelf = Event(syscall.IN_DELETE_SELF) // Self was deleted
- InMoveSelf = Event(syscall.IN_MOVE_SELF) // Self was moved
+ InAccess = Event(unix.IN_ACCESS) // File was accessed
+ InModify = Event(unix.IN_MODIFY) // File was modified
+ InAttrib = Event(unix.IN_ATTRIB) // Metadata changed
+ InCloseWrite = Event(unix.IN_CLOSE_WRITE) // Writtable file was closed
+ InCloseNowrite = Event(unix.IN_CLOSE_NOWRITE) // Unwrittable file closed
+ InOpen = Event(unix.IN_OPEN) // File was opened
+ InMovedFrom = Event(unix.IN_MOVED_FROM) // File was moved from X
+ InMovedTo = Event(unix.IN_MOVED_TO) // File was moved to Y
+ InCreate = Event(unix.IN_CREATE) // Subfile was created
+ InDelete = Event(unix.IN_DELETE) // Subfile was deleted
+ InDeleteSelf = Event(unix.IN_DELETE_SELF) // Self was deleted
+ InMoveSelf = Event(unix.IN_MOVE_SELF) // Self was moved
)
var osestr = map[Event]string{
@@ -56,15 +56,15 @@ var osestr = map[Event]string{
// Inotify behavior events are not **currently** supported by notify package.
const (
- inDontFollow = Event(syscall.IN_DONT_FOLLOW)
- inExclUnlink = Event(syscall.IN_EXCL_UNLINK)
- inMaskAdd = Event(syscall.IN_MASK_ADD)
- inOneshot = Event(syscall.IN_ONESHOT)
- inOnlydir = Event(syscall.IN_ONLYDIR)
+ inDontFollow = Event(unix.IN_DONT_FOLLOW)
+ inExclUnlink = Event(unix.IN_EXCL_UNLINK)
+ inMaskAdd = Event(unix.IN_MASK_ADD)
+ inOneshot = Event(unix.IN_ONESHOT)
+ inOnlydir = Event(unix.IN_ONLYDIR)
)
type event struct {
- sys syscall.InotifyEvent
+ sys unix.InotifyEvent
path string
event Event
}
@@ -72,4 +72,4 @@ type event struct {
func (e *event) Event() Event { return e.event }
func (e *event) Path() string { return e.path }
func (e *event) Sys() interface{} { return &e.sys }
-func (e *event) isDir() (bool, error) { return e.sys.Mask&syscall.IN_ISDIR != 0, nil }
+func (e *event) isDir() (bool, error) { return e.sys.Mask&unix.IN_ISDIR != 0, nil }
diff --git a/vendor/github.com/rjeczalik/notify/event_readdcw.go b/vendor/github.com/rjeczalik/notify/event_readdcw.go
index 11ead9e29..f7b82de0c 100644
--- a/vendor/github.com/rjeczalik/notify/event_readdcw.go
+++ b/vendor/github.com/rjeczalik/notify/event_readdcw.go
@@ -27,7 +27,11 @@ const (
dirmarker
)
-// ReadDirectoryChangesW filters.
+// ReadDirectoryChangesW filters
+// On Windows the following events can be passed to Watch. A different set of
+// events (see actions below) are received on the channel passed to Watch.
+// For more information refer to
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx
const (
FileNotifyChangeFileName = Event(syscall.FILE_NOTIFY_CHANGE_FILE_NAME)
FileNotifyChangeDirName = Event(syscall.FILE_NOTIFY_CHANGE_DIR_NAME)
@@ -48,7 +52,13 @@ const (
// this flag should be declared in: http://golang.org/src/pkg/syscall/ztypes_windows.go
const syscallFileNotifyChangeSecurity = 0x00000100
-// ReadDirectoryChangesW actions.
+// ReadDirectoryChangesW actions
+// The following events are returned on the channel passed to Watch, but cannot
+// be passed to Watch itself (see filters above). You can find a table showing
+// the relation between actions and filteres at
+// https://github.com/rjeczalik/notify/issues/10#issuecomment-66179535
+// The msdn documentation on actions is part of
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364391(v=vs.85).aspx
const (
FileActionAdded = Event(syscall.FILE_ACTION_ADDED) << 12
FileActionRemoved = Event(syscall.FILE_ACTION_REMOVED) << 12
diff --git a/vendor/github.com/rjeczalik/notify/node.go b/vendor/github.com/rjeczalik/notify/node.go
index 29c1bb20a..aced8b9c4 100644
--- a/vendor/github.com/rjeczalik/notify/node.go
+++ b/vendor/github.com/rjeczalik/notify/node.go
@@ -6,7 +6,6 @@ package notify
import (
"errors"
- "fmt"
"io/ioutil"
"os"
"path/filepath"
@@ -71,7 +70,11 @@ Traverse:
case errSkip:
continue Traverse
default:
- return fmt.Errorf("error while traversing %q: %v", nd.Name, err)
+ return &os.PathError{
+ Op: "error while traversing",
+ Path: nd.Name,
+ Err: err,
+ }
}
// TODO(rjeczalik): tolerate open failures - add failed names to
// AddDirError and notify users which names are not added to the tree.
diff --git a/vendor/github.com/rjeczalik/notify/watcher_fen.go b/vendor/github.com/rjeczalik/notify/watcher_fen.go
index dd069f2a2..dfe77f2f1 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_fen.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_fen.go
@@ -33,14 +33,7 @@ type fen struct {
// watched is a data structure representing watched file/directory.
type watched struct {
- // p is a path to watched file/directory
- p string
- // fi provides information about watched file/dir
- fi os.FileInfo
- // eDir represents events watched directly
- eDir Event
- // eNonDir represents events watched indirectly
- eNonDir Event
+ trgWatched
}
// Stop implements trigger.
@@ -55,7 +48,7 @@ func (f *fen) Close() (err error) {
// NewWatched implements trigger.
func (*fen) NewWatched(p string, fi os.FileInfo) (*watched, error) {
- return &watched{p: p, fi: fi}, nil
+ return &watched{trgWatched{p: p, fi: fi}}, nil
}
// Record implements trigger.
diff --git a/vendor/github.com/rjeczalik/notify/watcher_fsevents.go b/vendor/github.com/rjeczalik/notify/watcher_fsevents.go
index 9062c17c7..7d9b97b65 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_fsevents.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_fsevents.go
@@ -12,8 +12,6 @@ import (
"sync/atomic"
)
-// TODO(rjeczalik): get rid of calls to canonical, it's tree responsibility
-
const (
failure = uint32(FSEventsMustScanSubDirs | FSEventsUserDropped | FSEventsKernelDropped)
filter = uint32(FSEventsCreated | FSEventsRemoved | FSEventsRenamed |
@@ -189,9 +187,6 @@ func newWatcher(c chan<- EventInfo) watcher {
}
func (fse *fsevents) watch(path string, event Event, isrec int32) (err error) {
- if path, err = canonical(path); err != nil {
- return err
- }
if _, ok := fse.watches[path]; ok {
return errAlreadyWatched
}
@@ -211,9 +206,6 @@ func (fse *fsevents) watch(path string, event Event, isrec int32) (err error) {
}
func (fse *fsevents) unwatch(path string) (err error) {
- if path, err = canonical(path); err != nil {
- return
- }
w, ok := fse.watches[path]
if !ok {
return errNotWatched
diff --git a/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go b/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go
index 5be64632e..2248a1b12 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go
@@ -26,9 +26,9 @@ import "C"
import (
"errors"
"os"
+ "runtime"
"sync"
"sync/atomic"
- "time"
"unsafe"
)
@@ -48,7 +48,7 @@ var wg sync.WaitGroup // used to wait until the runloop starts
// started and is ready via the wg. It also serves purpose of a dummy source,
// thanks to it the runloop does not return as it also has at least one source
// registered.
-var source = C.CFRunLoopSourceCreate(nil, 0, &C.CFRunLoopSourceContext{
+var source = C.CFRunLoopSourceCreate(refZero, 0, &C.CFRunLoopSourceContext{
perform: (C.CFRunLoopPerformCallBack)(C.gosource),
})
@@ -63,6 +63,10 @@ var (
func init() {
wg.Add(1)
go func() {
+ // There is exactly one run loop per thread. Lock this goroutine to its
+ // thread to ensure that it's not rescheduled on a different thread while
+ // setting up the run loop.
+ runtime.LockOSThread()
runloop = C.CFRunLoopGetCurrent()
C.CFRunLoopAddSource(runloop, source, C.kCFRunLoopDefaultMode)
C.CFRunLoopRun()
@@ -73,7 +77,6 @@ func init() {
//export gosource
func gosource(unsafe.Pointer) {
- time.Sleep(time.Second)
wg.Done()
}
@@ -159,8 +162,8 @@ func (s *stream) Start() error {
return nil
}
wg.Wait()
- p := C.CFStringCreateWithCStringNoCopy(nil, C.CString(s.path), C.kCFStringEncodingUTF8, nil)
- path := C.CFArrayCreate(nil, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil)
+ p := C.CFStringCreateWithCStringNoCopy(refZero, C.CString(s.path), C.kCFStringEncodingUTF8, refZero)
+ path := C.CFArrayCreate(refZero, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil)
ctx := C.FSEventStreamContext{}
ref := C.EventStreamCreate(&ctx, C.uintptr_t(s.info), path, C.FSEventStreamEventId(atomic.LoadUint64(&since)), latency, flags)
if ref == nilstream {
diff --git a/vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.10.go b/vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.10.go
new file mode 100644
index 000000000..0edd3782f
--- /dev/null
+++ b/vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.10.go
@@ -0,0 +1,9 @@
+// Copyright (c) 2017 The Notify Authors. All rights reserved.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+// +build darwin,!kqueue,go1.10
+
+package notify
+
+const refZero = 0
diff --git a/vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.9.go b/vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.9.go
new file mode 100644
index 000000000..b81c3c185
--- /dev/null
+++ b/vendor/github.com/rjeczalik/notify/watcher_fsevents_go1.9.go
@@ -0,0 +1,14 @@
+// Copyright (c) 2017 The Notify Authors. All rights reserved.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+// +build darwin,!kqueue,cgo,!go1.10
+
+package notify
+
+/*
+#include <CoreServices/CoreServices.h>
+*/
+import "C"
+
+var refZero = (*C.struct___CFAllocator)(nil)
diff --git a/vendor/github.com/rjeczalik/notify/watcher_inotify.go b/vendor/github.com/rjeczalik/notify/watcher_inotify.go
index 3ceaa8f3a..d082baca0 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_inotify.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_inotify.go
@@ -13,14 +13,15 @@ import (
"runtime"
"sync"
"sync/atomic"
- "syscall"
"unsafe"
+
+ "golang.org/x/sys/unix"
)
// eventBufferSize defines the size of the buffer given to read(2) function. One
// should not depend on this value, since it was arbitrary chosen and may be
// changed in the future.
-const eventBufferSize = 64 * (syscall.SizeofInotifyEvent + syscall.PathMax + 1)
+const eventBufferSize = 64 * (unix.SizeofInotifyEvent + unix.PathMax + 1)
// consumersCount defines the number of consumers in producer-consumer based
// implementation. Each consumer is run in a separate goroutine and has read
@@ -43,7 +44,7 @@ type inotify struct {
fd int32 // inotify file descriptor
pipefd []int // pipe's read and write descriptors
epfd int // epoll descriptor
- epes []syscall.EpollEvent // epoll events
+ epes []unix.EpollEvent // epoll events
buffer [eventBufferSize]byte // inotify event buffer
wg sync.WaitGroup // wait group used to close main loop
c chan<- EventInfo // event dispatcher channel
@@ -56,13 +57,13 @@ func newWatcher(c chan<- EventInfo) watcher {
fd: invalidDescriptor,
pipefd: []int{invalidDescriptor, invalidDescriptor},
epfd: invalidDescriptor,
- epes: make([]syscall.EpollEvent, 0),
+ epes: make([]unix.EpollEvent, 0),
c: c,
}
runtime.SetFinalizer(i, func(i *inotify) {
i.epollclose()
if i.fd != invalidDescriptor {
- syscall.Close(int(i.fd))
+ unix.Close(int(i.fd))
}
})
return i
@@ -82,13 +83,13 @@ func (i *inotify) Rewatch(path string, _, newevent Event) error {
// one. If called for the first time, this function initializes inotify filesystem
// monitor and starts producer-consumers goroutines.
func (i *inotify) watch(path string, e Event) (err error) {
- if e&^(All|Event(syscall.IN_ALL_EVENTS)) != 0 {
+ if e&^(All|Event(unix.IN_ALL_EVENTS)) != 0 {
return errors.New("notify: unknown event")
}
if err = i.lazyinit(); err != nil {
return
}
- iwd, err := syscall.InotifyAddWatch(int(i.fd), path, encode(e))
+ iwd, err := unix.InotifyAddWatch(int(i.fd), path, encode(e))
if err != nil {
return
}
@@ -119,13 +120,13 @@ func (i *inotify) lazyinit() error {
i.Lock()
defer i.Unlock()
if atomic.LoadInt32(&i.fd) == invalidDescriptor {
- fd, err := syscall.InotifyInit()
+ fd, err := unix.InotifyInit1(unix.IN_CLOEXEC)
if err != nil {
return err
}
i.fd = int32(fd)
if err = i.epollinit(); err != nil {
- _, _ = i.epollclose(), syscall.Close(int(fd)) // Ignore errors.
+ _, _ = i.epollclose(), unix.Close(int(fd)) // Ignore errors.
i.fd = invalidDescriptor
return err
}
@@ -145,33 +146,33 @@ func (i *inotify) lazyinit() error {
// with inotify event queue and the read end of the pipe are added to epoll set.
// Note that `fd` member must be set before this function is called.
func (i *inotify) epollinit() (err error) {
- if i.epfd, err = syscall.EpollCreate1(0); err != nil {
+ if i.epfd, err = unix.EpollCreate1(0); err != nil {
return
}
- if err = syscall.Pipe(i.pipefd); err != nil {
+ if err = unix.Pipe(i.pipefd); err != nil {
return
}
- i.epes = []syscall.EpollEvent{
- {Events: syscall.EPOLLIN, Fd: i.fd},
- {Events: syscall.EPOLLIN, Fd: int32(i.pipefd[0])},
+ i.epes = []unix.EpollEvent{
+ {Events: unix.EPOLLIN, Fd: i.fd},
+ {Events: unix.EPOLLIN, Fd: int32(i.pipefd[0])},
}
- if err = syscall.EpollCtl(i.epfd, syscall.EPOLL_CTL_ADD, int(i.fd), &i.epes[0]); err != nil {
+ if err = unix.EpollCtl(i.epfd, unix.EPOLL_CTL_ADD, int(i.fd), &i.epes[0]); err != nil {
return
}
- return syscall.EpollCtl(i.epfd, syscall.EPOLL_CTL_ADD, i.pipefd[0], &i.epes[1])
+ return unix.EpollCtl(i.epfd, unix.EPOLL_CTL_ADD, i.pipefd[0], &i.epes[1])
}
// epollclose closes the file descriptor created by the call to epoll_create(2)
// and two file descriptors opened by pipe(2) function.
func (i *inotify) epollclose() (err error) {
if i.epfd != invalidDescriptor {
- if err = syscall.Close(i.epfd); err == nil {
+ if err = unix.Close(i.epfd); err == nil {
i.epfd = invalidDescriptor
}
}
for n, fd := range i.pipefd {
if fd != invalidDescriptor {
- switch e := syscall.Close(fd); {
+ switch e := unix.Close(fd); {
case e != nil && err == nil:
err = e
case e == nil:
@@ -187,10 +188,10 @@ func (i *inotify) epollclose() (err error) {
// one of the event's consumers. If pipe fd became ready, loop function closes
// all file descriptors opened by lazyinit method and returns afterwards.
func (i *inotify) loop(esch chan<- []*event) {
- epes := make([]syscall.EpollEvent, 1)
+ epes := make([]unix.EpollEvent, 1)
fd := atomic.LoadInt32(&i.fd)
for {
- switch _, err := syscall.EpollWait(i.epfd, epes, -1); err {
+ switch _, err := unix.EpollWait(i.epfd, epes, -1); err {
case nil:
switch epes[0].Fd {
case fd:
@@ -199,17 +200,17 @@ func (i *inotify) loop(esch chan<- []*event) {
case int32(i.pipefd[0]):
i.Lock()
defer i.Unlock()
- if err = syscall.Close(int(fd)); err != nil && err != syscall.EINTR {
+ if err = unix.Close(int(fd)); err != nil && err != unix.EINTR {
panic("notify: close(2) error " + err.Error())
}
atomic.StoreInt32(&i.fd, invalidDescriptor)
- if err = i.epollclose(); err != nil && err != syscall.EINTR {
+ if err = i.epollclose(); err != nil && err != unix.EINTR {
panic("notify: epollclose error " + err.Error())
}
close(esch)
return
}
- case syscall.EINTR:
+ case unix.EINTR:
continue
default: // We should never reach this line.
panic("notify: epoll_wait(2) error " + err.Error())
@@ -220,22 +221,22 @@ func (i *inotify) loop(esch chan<- []*event) {
// read reads events from an inotify file descriptor. It does not handle errors
// returned from read(2) function since they are not critical to watcher logic.
func (i *inotify) read() (es []*event) {
- n, err := syscall.Read(int(i.fd), i.buffer[:])
- if err != nil || n < syscall.SizeofInotifyEvent {
+ n, err := unix.Read(int(i.fd), i.buffer[:])
+ if err != nil || n < unix.SizeofInotifyEvent {
return
}
- var sys *syscall.InotifyEvent
- nmin := n - syscall.SizeofInotifyEvent
+ var sys *unix.InotifyEvent
+ nmin := n - unix.SizeofInotifyEvent
for pos, path := 0, ""; pos <= nmin; {
- sys = (*syscall.InotifyEvent)(unsafe.Pointer(&i.buffer[pos]))
- pos += syscall.SizeofInotifyEvent
+ sys = (*unix.InotifyEvent)(unsafe.Pointer(&i.buffer[pos]))
+ pos += unix.SizeofInotifyEvent
if path = ""; sys.Len > 0 {
endpos := pos + int(sys.Len)
path = string(bytes.TrimRight(i.buffer[pos:endpos], "\x00"))
pos = endpos
}
es = append(es, &event{
- sys: syscall.InotifyEvent{
+ sys: unix.InotifyEvent{
Wd: sys.Wd,
Mask: sys.Mask,
Cookie: sys.Cookie,
@@ -268,7 +269,7 @@ func (i *inotify) transform(es []*event) []*event {
var multi []*event
i.RLock()
for idx, e := range es {
- if e.sys.Mask&(syscall.IN_IGNORED|syscall.IN_Q_OVERFLOW) != 0 {
+ if e.sys.Mask&(unix.IN_IGNORED|unix.IN_Q_OVERFLOW) != 0 {
es[idx] = nil
continue
}
@@ -317,7 +318,7 @@ func encode(e Event) uint32 {
// can be nil when the event should not be passed on.
func decode(mask Event, e *event) (syse *event) {
if sysmask := uint32(mask) & e.sys.Mask; sysmask != 0 {
- syse = &event{sys: syscall.InotifyEvent{
+ syse = &event{sys: unix.InotifyEvent{
Wd: e.sys.Wd,
Mask: e.sys.Mask,
Cookie: e.sys.Cookie,
@@ -357,7 +358,7 @@ func (i *inotify) Unwatch(path string) (err error) {
return errors.New("notify: path " + path + " is already watched")
}
fd := atomic.LoadInt32(&i.fd)
- if _, err = syscall.InotifyRmWatch(int(fd), uint32(iwd)); err != nil {
+ if err = removeInotifyWatch(fd, iwd); err != nil {
return
}
i.Lock()
@@ -377,12 +378,12 @@ func (i *inotify) Close() (err error) {
return nil
}
for iwd := range i.m {
- if _, e := syscall.InotifyRmWatch(int(i.fd), uint32(iwd)); e != nil && err == nil {
+ if e := removeInotifyWatch(i.fd, iwd); e != nil && err == nil {
err = e
}
delete(i.m, iwd)
}
- switch _, errwrite := syscall.Write(i.pipefd[1], []byte{0x00}); {
+ switch _, errwrite := unix.Write(i.pipefd[1], []byte{0x00}); {
case errwrite != nil && err == nil:
err = errwrite
fallthrough
@@ -394,3 +395,11 @@ func (i *inotify) Close() (err error) {
}
return
}
+
+// if path was removed, notify already removed the watch and returns EINVAL error
+func removeInotifyWatch(fd int32, iwd int32) (err error) {
+ if _, err = unix.InotifyRmWatch(int(fd), uint32(iwd)); err != nil && err != unix.EINVAL {
+ return
+ }
+ return nil
+}
diff --git a/vendor/github.com/rjeczalik/notify/watcher_kqueue.go b/vendor/github.com/rjeczalik/notify/watcher_kqueue.go
index 6d500b700..22e3c2c4a 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_kqueue.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_kqueue.go
@@ -36,16 +36,9 @@ type kq struct {
// watched is a data structure representing watched file/directory.
type watched struct {
- // p is a path to watched file/directory.
- p string
+ trgWatched
// fd is a file descriptor for watched file/directory.
fd int
- // fi provides information about watched file/dir.
- fi os.FileInfo
- // eDir represents events watched directly.
- eDir Event
- // eNonDir represents events watched indirectly.
- eNonDir Event
}
// Stop implements trigger.
@@ -66,7 +59,10 @@ func (*kq) NewWatched(p string, fi os.FileInfo) (*watched, error) {
if err != nil {
return nil, err
}
- return &watched{fd: fd, p: p, fi: fi}, nil
+ return &watched{
+ trgWatched: trgWatched{p: p, fi: fi},
+ fd: fd,
+ }, nil
}
// Record implements trigger.
diff --git a/vendor/github.com/rjeczalik/notify/watcher_readdcw.go b/vendor/github.com/rjeczalik/notify/watcher_readdcw.go
index 5923bfdda..1494fcd79 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_readdcw.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_readdcw.go
@@ -284,16 +284,18 @@ func (r *readdcw) watch(path string, event Event, recursive bool) (err error) {
return
}
r.Lock()
+ defer r.Unlock()
if wd, ok = r.m[path]; ok {
- r.Unlock()
+ dbgprint("watch: exists already")
return
}
if wd, err = newWatched(r.cph, uint32(event), recursive, path); err != nil {
- r.Unlock()
return
}
r.m[path] = wd
- r.Unlock()
+ dbgprint("watch: new watch added")
+ } else {
+ dbgprint("watch: exists already")
}
return nil
}
@@ -337,33 +339,32 @@ func (r *readdcw) loop() {
continue
}
overEx := (*overlappedEx)(unsafe.Pointer(overlapped))
- if n == 0 {
- r.loopstate(overEx)
- } else {
+ if n != 0 {
r.loopevent(n, overEx)
if err = overEx.parent.readDirChanges(); err != nil {
// TODO: error handling
}
}
+ r.loopstate(overEx)
}
}
// TODO(pknap) : doc
func (r *readdcw) loopstate(overEx *overlappedEx) {
- filter := atomic.LoadUint32(&overEx.parent.parent.filter)
+ r.Lock()
+ defer r.Unlock()
+ filter := overEx.parent.parent.filter
if filter&onlyMachineStates == 0 {
return
}
if overEx.parent.parent.count--; overEx.parent.parent.count == 0 {
switch filter & onlyMachineStates {
case stateRewatch:
- r.Lock()
+ dbgprint("loopstate rewatch")
overEx.parent.parent.recreate(r.cph)
- r.Unlock()
case stateUnwatch:
- r.Lock()
+ dbgprint("loopstate unwatch")
delete(r.m, syscall.UTF16ToString(overEx.parent.pathw))
- r.Unlock()
case stateCPClose:
default:
panic(`notify: windows loopstate logic error`)
@@ -450,8 +451,8 @@ func (r *readdcw) rewatch(path string, oldevent, newevent uint32, recursive bool
}
var wd *watched
r.Lock()
- if wd, err = r.nonStateWatched(path); err != nil {
- r.Unlock()
+ defer r.Unlock()
+ if wd, err = r.nonStateWatchedLocked(path); err != nil {
return
}
if wd.filter&(onlyNotifyChanges|onlyNGlobalEvents) != oldevent {
@@ -462,21 +463,19 @@ func (r *readdcw) rewatch(path string, oldevent, newevent uint32, recursive bool
if err = wd.closeHandle(); err != nil {
wd.filter = oldevent
wd.recursive = recursive
- r.Unlock()
return
}
- r.Unlock()
return
}
// TODO : pknap
-func (r *readdcw) nonStateWatched(path string) (wd *watched, err error) {
+func (r *readdcw) nonStateWatchedLocked(path string) (wd *watched, err error) {
wd, ok := r.m[path]
if !ok || wd == nil {
err = errors.New(`notify: ` + path + ` path is unwatched`)
return
}
- if filter := atomic.LoadUint32(&wd.filter); filter&onlyMachineStates != 0 {
+ if wd.filter&onlyMachineStates != 0 {
err = errors.New(`notify: another re/unwatching operation in progress`)
return
}
@@ -497,17 +496,26 @@ func (r *readdcw) RecursiveUnwatch(path string) error {
func (r *readdcw) unwatch(path string) (err error) {
var wd *watched
r.Lock()
- if wd, err = r.nonStateWatched(path); err != nil {
- r.Unlock()
+ defer r.Unlock()
+ if wd, err = r.nonStateWatchedLocked(path); err != nil {
return
}
wd.filter |= stateUnwatch
if err = wd.closeHandle(); err != nil {
wd.filter &^= stateUnwatch
- r.Unlock()
return
}
- r.Unlock()
+ if _, attrErr := syscall.GetFileAttributes(&wd.pathw[0]); attrErr != nil {
+ for _, g := range wd.digrip {
+ if g != nil {
+ dbgprint("unwatch: posting")
+ if err = syscall.PostQueuedCompletionStatus(r.cph, 0, 0, (*syscall.Overlapped)(unsafe.Pointer(g.ovlapped))); err != nil {
+ wd.filter &^= stateUnwatch
+ return
+ }
+ }
+ }
+ }
return
}
diff --git a/vendor/github.com/rjeczalik/notify/watcher_trigger.go b/vendor/github.com/rjeczalik/notify/watcher_trigger.go
index d079d59b0..78151f909 100644
--- a/vendor/github.com/rjeczalik/notify/watcher_trigger.go
+++ b/vendor/github.com/rjeczalik/notify/watcher_trigger.go
@@ -23,6 +23,7 @@
package notify
import (
+ "fmt"
"os"
"path/filepath"
"strings"
@@ -56,6 +57,19 @@ type trigger interface {
IsStop(n interface{}, err error) bool
}
+// trgWatched is a the base data structure representing watched file/directory.
+// The platform specific full data structure (watched) must embed this type.
+type trgWatched struct {
+ // p is a path to watched file/directory.
+ p string
+ // fi provides information about watched file/dir.
+ fi os.FileInfo
+ // eDir represents events watched directly.
+ eDir Event
+ // eNonDir represents events watched indirectly.
+ eNonDir Event
+}
+
// encode Event to native representation. Implementation is to be provided by
// platform specific implementation.
var encode func(Event, bool) int64
@@ -117,6 +131,9 @@ func (t *trg) Close() (err error) {
dbgprintf("trg: closing native watch failed: %q\n", e)
err = nonil(err, e)
}
+ if remaining := len(t.pthLkp); remaining != 0 {
+ err = nonil(err, fmt.Errorf("Not all watches were removed: len(t.pthLkp) == %v", len(t.pthLkp)))
+ }
t.Unlock()
return
}
@@ -175,7 +192,7 @@ func decode(o int64, w Event) (e Event) {
func (t *trg) watch(p string, e Event, fi os.FileInfo) error {
if err := t.singlewatch(p, e, dir, fi); err != nil {
if err != errAlreadyWatched {
- return nil
+ return err
}
}
if fi.IsDir() {
@@ -361,7 +378,7 @@ func (t *trg) singleunwatch(p string, direct mode) error {
}
if w.eNonDir|w.eDir != 0 {
mod := dir
- if w.eNonDir == 0 {
+ if w.eNonDir != 0 {
mod = ndir
}
if err := t.singlewatch(p, w.eNonDir|w.eDir, mod,
diff --git a/vendor/github.com/syndtr/goleveldb/.travis.yml b/vendor/github.com/syndtr/goleveldb/.travis.yml
deleted file mode 100644
index 82de37735..000000000
--- a/vendor/github.com/syndtr/goleveldb/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: go
-
-go:
- - 1.4
- - 1.5
- - 1.6
- - 1.7
- - tip
-
-script:
- - go test -timeout 1h ./...
- - go test -timeout 30m -race -run "TestDB_(Concurrent|GoleveldbIssue74)" ./leveldb
diff --git a/vendor/github.com/syndtr/goleveldb/README.md b/vendor/github.com/syndtr/goleveldb/README.md
index 259286f55..41a47614c 100644
--- a/vendor/github.com/syndtr/goleveldb/README.md
+++ b/vendor/github.com/syndtr/goleveldb/README.md
@@ -10,13 +10,15 @@ Installation
Requirements
-----------
-* Need at least `go1.4` or newer.
+* Need at least `go1.5` or newer.
Usage
-----------
Create or open a database:
```go
+// The returned DB instance is safe for concurrent use. Which mean that all
+// DB's methods may be called concurrently from multiple goroutine.
db, err := leveldb.OpenFile("path/to/db", nil)
...
defer db.Close()
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go
index b0cdcb3d0..ea5595eb3 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/db.go
@@ -32,6 +32,11 @@ type DB struct {
// Need 64-bit alignment.
seq uint64
+ // Stats. Need 64-bit alignment.
+ cWriteDelay int64 // The cumulative duration of write delays
+ cWriteDelayN int32 // The cumulative number of write delays
+ aliveSnaps, aliveIters int32
+
// Session.
s *session
@@ -49,9 +54,6 @@ type DB struct {
snapsMu sync.Mutex
snapsList *list.List
- // Stats.
- aliveSnaps, aliveIters int32
-
// Write.
batchPool sync.Pool
writeMergeC chan writeMerge
@@ -321,7 +323,7 @@ func recoverTable(s *session, o *opt.Options) error {
}
}
err = iter.Error()
- if err != nil {
+ if err != nil && !errors.IsCorrupted(err) {
return
}
err = tw.Close()
@@ -392,7 +394,7 @@ func recoverTable(s *session, o *opt.Options) error {
}
imax = append(imax[:0], key...)
}
- if err := iter.Error(); err != nil {
+ if err := iter.Error(); err != nil && !errors.IsCorrupted(err) {
iter.Release()
return err
}
@@ -904,6 +906,8 @@ func (db *DB) GetSnapshot() (*Snapshot, error) {
// Returns the number of files at level 'n'.
// leveldb.stats
// Returns statistics of the underlying DB.
+// leveldb.writedelay
+// Returns cumulative write delay caused by compaction.
// leveldb.sstables
// Returns sstables list for each level.
// leveldb.blockpool
@@ -955,6 +959,9 @@ func (db *DB) GetProperty(name string) (value string, err error) {
level, len(tables), float64(tables.size())/1048576.0, duration.Seconds(),
float64(read)/1048576.0, float64(write)/1048576.0)
}
+ case p == "writedelay":
+ writeDelayN, writeDelay := atomic.LoadInt32(&db.cWriteDelayN), time.Duration(atomic.LoadInt64(&db.cWriteDelay))
+ value = fmt.Sprintf("DelayN:%d Delay:%s", writeDelayN, writeDelay)
case p == "sstables":
for level, tables := range v.levels {
value += fmt.Sprintf("--- level %d ---\n", level)
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
index 5b6cb487d..31f4bc5ef 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
@@ -7,6 +7,7 @@
package leveldb
import (
+ "sync/atomic"
"time"
"github.com/syndtr/goleveldb/leveldb/memdb"
@@ -117,6 +118,8 @@ func (db *DB) flush(n int) (mdb *memDB, mdbFree int, err error) {
db.writeDelayN++
} else if db.writeDelayN > 0 {
db.logf("db@write was delayed N·%d T·%v", db.writeDelayN, db.writeDelay)
+ atomic.AddInt32(&db.cWriteDelayN, int32(db.writeDelayN))
+ atomic.AddInt64(&db.cWriteDelay, int64(db.writeDelay))
db.writeDelay = 0
db.writeDelayN = 0
}
@@ -143,7 +146,7 @@ func (db *DB) unlockWrite(overflow bool, merged int, err error) {
}
}
-// ourBatch if defined should equal with batch.
+// ourBatch is batch that we can modify.
func (db *DB) writeLocked(batch, ourBatch *Batch, merge, sync bool) error {
// Try to flush memdb. This method would also trying to throttle writes
// if it is too fast and compaction cannot catch-up.
@@ -212,6 +215,11 @@ func (db *DB) writeLocked(batch, ourBatch *Batch, merge, sync bool) error {
}
}
+ // Release ourBatch if any.
+ if ourBatch != nil {
+ defer db.batchPool.Put(ourBatch)
+ }
+
// Seq number.
seq := db.seq + 1
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.lock b/vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.lock
new file mode 100644
index 000000000..c1b0e0a3f
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.lock
@@ -0,0 +1,21 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+ branch = "v1"
+ name = "gopkg.in/check.v1"
+ packages = ["."]
+ revision = "20d25e2804050c1cd24a7eea1e7a6447dd0e74ec"
+
+[[projects]]
+ branch = "v3"
+ name = "gopkg.in/olebedev/go-duktape.v3"
+ packages = ["."]
+ revision = "391c1c40178e77a6003d889b96e0e41129aeb894"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ inputs-digest = "043f802c0b40e2622bf784443d3e3959f0d01e9a795e3bfe30a72060dec10c63"
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.toml b/vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.toml
new file mode 100644
index 000000000..ea8dc6de3
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.toml
@@ -0,0 +1,3 @@
+[[constraint]]
+ branch = "v1"
+ name = "gopkg.in/check.v1" \ No newline at end of file
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/LICENSE.md b/vendor/gopkg.in/olebedev/go-duktape.v3/LICENSE.md
new file mode 100644
index 000000000..785c85309
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Oleg Lebedev
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/README.md b/vendor/gopkg.in/olebedev/go-duktape.v3/README.md
new file mode 100644
index 000000000..2ddaad5e1
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/README.md
@@ -0,0 +1,124 @@
+# Duktape bindings for Go(Golang)
+
+[![wercker status](https://app.wercker.com/status/3a5bb2e639a4b4efaf4c8bf7cab7442d/s "wercker status")](https://app.wercker.com/project/bykey/3a5bb2e639a4b4efaf4c8bf7cab7442d)
+[![Travis status](https://travis-ci.org/olebedev/go-duktape.svg?branch=v3)](https://travis-ci.org/olebedev/go-duktape)
+[![Appveyor status](https://ci.appveyor.com/api/projects/status/github/olebedev/go-duktape?branch=v3&svg=true)](https://ci.appveyor.com/project/olebedev/go-duktape/branch/v3)
+[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/olebedev/go-duktape?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+
+[Duktape](http://duktape.org/index.html) is a thin, embeddable javascript engine.
+Most of the [api](http://duktape.org/api.html) is implemented.
+The exceptions are listed [here](https://github.com/olebedev/go-duktape/blob/master/api.go#L1566).
+
+### Usage
+
+The package is fully go-getable, no need to install any external C libraries.
+So, just type `go get gopkg.in/olebedev/go-duktape.v3` to install.
+
+
+```go
+package main
+
+import "fmt"
+import "gopkg.in/olebedev/go-duktape.v3"
+
+func main() {
+ ctx := duktape.New()
+ ctx.PevalString(`2 + 3`)
+ result := ctx.GetNumber(-1)
+ ctx.Pop()
+ fmt.Println("result is:", result)
+ // To prevent memory leaks, don't forget to clean up after
+ // yourself when you're done using a context.
+ ctx.DestroyHeap()
+}
+```
+
+### Go specific notes
+
+Bindings between Go and Javascript contexts are not fully functional.
+However, binding a Go function to the Javascript context is available:
+```go
+package main
+
+import "fmt"
+import "gopkg.in/olebedev/go-duktape.v3"
+
+func main() {
+ ctx := duktape.New()
+ ctx.PushGlobalGoFunction("log", func(c *duktape.Context) int {
+ fmt.Println(c.SafeToString(-1))
+ return 0
+ })
+ ctx.PevalString(`log('Go lang Go!')`)
+}
+```
+then run it.
+```bash
+$ go run *.go
+Go lang Go!
+$
+```
+
+### Timers
+
+There is a method to inject timers to the global scope:
+```go
+package main
+
+import "fmt"
+import "gopkg.in/olebedev/go-duktape.v3"
+
+func main() {
+ ctx := duktape.New()
+
+ // Let's inject `setTimeout`, `setInterval`, `clearTimeout`,
+ // `clearInterval` into global scope.
+ ctx.PushTimers()
+
+ ch := make(chan string)
+ ctx.PushGlobalGoFunction("second", func(_ *Context) int {
+ ch <- "second step"
+ return 0
+ })
+ ctx.PevalString(`
+ setTimeout(second, 0);
+ print('first step');
+ `)
+ fmt.Println(<-ch)
+}
+```
+then run it
+```bash
+$ go run *.go
+first step
+second step
+$
+```
+
+Also you can `FlushTimers()`.
+
+### Command line tool
+
+Install `go get gopkg.in/olebedev/go-duktape.v3/...`.
+Execute file.js: `$GOPATH/bin/go-duk file.js`.
+
+### Benchmarks
+| prog | time |
+| ------------|-------|
+|[otto](https://github.com/robertkrimen/otto)|200.13s|
+|[anko](https://github.com/mattn/anko)|231.19s|
+|[agora](https://github.com/PuerkitoBio/agora/)|149.33s|
+|[GopherLua](https://github.com/yuin/gopher-lua/)|8.39s|
+|**go-duktape**|**9.80s**|
+
+More details are [here](https://github.com/olebedev/go-duktape/wiki/Benchmarks).
+
+### Status
+
+The package is not fully tested, so be careful.
+
+
+### Contribution
+
+Pull requests are welcome! Also, if you want to discuss something send a pull request with proposal and changes.
+__Convention:__ fork the repository and make changes on your fork in a feature branch.
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/api.go b/vendor/gopkg.in/olebedev/go-duktape.v3/api.go
new file mode 100644
index 000000000..6617ec23d
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/api.go
@@ -0,0 +1,1616 @@
+package duktape
+
+/*
+#cgo !windows CFLAGS: -std=c99 -O3 -Wall -fomit-frame-pointer -fstrict-aliasing
+#cgo windows CFLAGS: -O3 -Wall -fomit-frame-pointer -fstrict-aliasing
+
+#include "duktape.h"
+#include "duk_logging.h"
+#include "duk_v1_compat.h"
+#include "duk_print_alert.h"
+static void _duk_eval_string(duk_context *ctx, const char *str) {
+ duk_eval_string(ctx, str);
+}
+static void _duk_compile(duk_context *ctx, duk_uint_t flags) {
+ duk_compile(ctx, flags);
+}
+static void _duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) {
+ duk_compile_file(ctx, flags, path);
+}
+static void _duk_compile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {
+ duk_compile_lstring(ctx, flags, src, len);
+}
+static void _duk_compile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {
+ duk_compile_lstring_filename(ctx, flags, src, len);
+}
+static void _duk_compile_string(duk_context *ctx, duk_uint_t flags, const char *src) {
+ duk_compile_string(ctx, flags, src);
+}
+static void _duk_compile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src) {
+ duk_compile_string_filename(ctx, flags, src);
+}
+static void _duk_dump_context_stderr(duk_context *ctx) {
+ duk_dump_context_stderr(ctx);
+}
+static void _duk_dump_context_stdout(duk_context *ctx) {
+ duk_dump_context_stdout(ctx);
+}
+static void _duk_eval(duk_context *ctx) {
+ duk_eval(ctx);
+}
+static void _duk_eval_file(duk_context *ctx, const char *path) {
+ duk_eval_file(ctx, path);
+}
+static void _duk_eval_file_noresult(duk_context *ctx, const char *path) {
+ duk_eval_file_noresult(ctx, path);
+}
+static void _duk_eval_lstring(duk_context *ctx, const char *src, duk_size_t len) {
+ duk_eval_lstring(ctx, src, len);
+}
+static void _duk_eval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len) {
+ duk_eval_lstring_noresult(ctx, src, len);
+}
+static void _duk_eval_noresult(duk_context *ctx) {
+ duk_eval_noresult(ctx);
+}
+static void _duk_eval_string_noresult(duk_context *ctx, const char *src) {
+ duk_eval_string_noresult(ctx, src);
+}
+static duk_bool_t _duk_is_error(duk_context *ctx, duk_idx_t index) {
+ return duk_is_error(ctx, index);
+}
+static duk_bool_t _duk_is_object_coercible(duk_context *ctx, duk_idx_t index) {
+ return duk_is_object_coercible(ctx, index);
+}
+static duk_int_t _duk_pcompile(duk_context *ctx, duk_uint_t flags) {
+ return duk_pcompile(ctx, flags);
+}
+static duk_int_t _duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) {
+ return duk_pcompile_file(ctx, flags, path);
+}
+static duk_int_t _duk_pcompile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {
+ return duk_pcompile_lstring(ctx, flags, src, len);
+}
+static duk_int_t _duk_pcompile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {
+ return duk_pcompile_lstring_filename(ctx, flags, src, len);
+}
+static duk_int_t _duk_pcompile_string(duk_context *ctx, duk_uint_t flags, const char *src) {
+ return duk_pcompile_string(ctx, flags, src);
+}
+static duk_int_t _duk_pcompile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src) {
+ return duk_pcompile_string_filename(ctx, flags, src);
+}
+static duk_int_t _duk_peval(duk_context *ctx) {
+ return duk_peval(ctx);
+}
+static duk_int_t _duk_peval_file(duk_context *ctx, const char *path) {
+ return duk_peval_file(ctx, path);
+}
+static duk_int_t _duk_peval_file_noresult(duk_context *ctx, const char *path) {
+ return duk_peval_file_noresult(ctx, path);
+}
+static duk_int_t _duk_peval_lstring(duk_context *ctx, const char *src, duk_size_t len) {
+ return duk_peval_lstring(ctx, src, len);
+}
+static duk_int_t _duk_peval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len) {
+ return duk_peval_lstring_noresult(ctx, src, len);
+}
+static duk_int_t _duk_peval_noresult(duk_context *ctx) {
+ return duk_peval_noresult(ctx);
+}
+static duk_int_t _duk_peval_string(duk_context *ctx, const char *src) {
+ return duk_peval_string(ctx, src);
+}
+static duk_int_t _duk_peval_string_noresult(duk_context *ctx, const char *src) {
+ return duk_peval_string_noresult(ctx, src);
+}
+static const char *_duk_push_string_file(duk_context *ctx, const char *path) {
+ return duk_push_string_file(ctx, path);
+}
+static duk_idx_t _duk_push_thread(duk_context *ctx) {
+ return duk_push_thread(ctx);
+}
+static duk_idx_t _duk_push_thread_new_globalenv(duk_context *ctx) {
+ return duk_push_thread_new_globalenv(ctx);
+}
+static void _duk_require_object_coercible(duk_context *ctx, duk_idx_t index) {
+ duk_require_object_coercible(ctx, index);
+}
+static void _duk_require_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask) {
+ duk_require_type_mask(ctx, index, mask);
+}
+static const char *_duk_safe_to_string(duk_context *ctx, duk_idx_t index) {
+ return duk_safe_to_string(ctx, index);
+}
+static void _duk_xcopy_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count) {
+ duk_xcopy_top(to_ctx, from_ctx, count);
+}
+static void _duk_xmove_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count) {
+ duk_xmove_top(to_ctx, from_ctx, count);
+}
+static void *_duk_to_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) {
+ return duk_to_buffer(ctx, index, out_size);
+}
+static void *_duk_to_dynamic_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) {
+ return duk_to_dynamic_buffer(ctx, index, out_size);
+}
+static void *_duk_to_fixed_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) {
+ return duk_to_fixed_buffer(ctx, index, out_size);
+}
+static duk_int_t _duk_is_primitive(duk_context *ctx, duk_idx_t index) {
+ return duk_is_primitive(ctx, index);
+}
+static void *_duk_push_buffer(duk_context *ctx, duk_size_t size, duk_bool_t dynamic) {
+ return duk_push_buffer(ctx, size, dynamic);
+}
+static void *_duk_push_fixed_buffer(duk_context *ctx, duk_size_t size) {
+ return duk_push_fixed_buffer(ctx, size);
+}
+static void *_duk_push_dynamic_buffer(duk_context *ctx, duk_size_t size) {
+ return duk_push_dynamic_buffer(ctx, size);
+}
+static void _duk_error(duk_context *ctx, duk_errcode_t err_code, const char *str) {
+ duk_error(ctx, err_code, "%s", str);
+}
+static void _duk_push_error_object(duk_context *ctx, duk_errcode_t err_code, const char *str) {
+ duk_push_error_object(ctx, err_code, "%s", str);
+}
+static void _duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *text) {
+ duk_error_raw(ctx, err_code, filename, line, text);
+}
+static void _duk_log(duk_context *ctx, duk_int_t level, const char *str) {
+ duk_log(ctx, level, "%s", str);
+}
+static void _duk_push_external_buffer(duk_context *ctx) {
+ duk_push_external_buffer(ctx);
+}
+*/
+import "C"
+import (
+ "fmt"
+ "unsafe"
+)
+
+// See: http://duktape.org/api.html#duk_alloc
+func (d *Context) Alloc(size int) unsafe.Pointer {
+ return C.duk_alloc(d.duk_context, C.duk_size_t(size))
+}
+
+// See: http://duktape.org/api.html#duk_alloc_raw
+func (d *Context) AllocRaw(size int) unsafe.Pointer {
+ return C.duk_alloc_raw(d.duk_context, C.duk_size_t(size))
+}
+
+// See: http://duktape.org/api.html#duk_base64_decode
+func (d *Context) Base64Decode(index int) {
+ C.duk_base64_decode(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_base64_encode
+func (d *Context) Base64Encode(index int) string {
+ if s := C.duk_base64_encode(d.duk_context, C.duk_idx_t(index)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_call
+func (d *Context) Call(nargs int) {
+ C.duk_call(d.duk_context, C.duk_idx_t(nargs))
+}
+
+// See: http://duktape.org/api.html#duk_call_method
+func (d *Context) CallMethod(nargs int) {
+ C.duk_call_method(d.duk_context, C.duk_idx_t(nargs))
+}
+
+// See: http://duktape.org/api.html#duk_call_prop
+func (d *Context) CallProp(objIndex int, nargs int) {
+ C.duk_call_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_idx_t(nargs))
+}
+
+// See: http://duktape.org/api.html#duk_check_stack
+func (d *Context) CheckStack(extra int) bool {
+ return int(C.duk_check_stack(d.duk_context, C.duk_idx_t(extra))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_check_stack_top
+func (d *Context) CheckStackTop(top int) bool {
+ return int(C.duk_check_stack_top(d.duk_context, C.duk_idx_t(top))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_check_type
+func (d *Context) CheckType(index int, typ int) bool {
+ return int(C.duk_check_type(d.duk_context, C.duk_idx_t(index), C.duk_int_t(typ))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_check_type_mask
+func (d *Context) CheckTypeMask(index int, mask uint) bool {
+ return int(C.duk_check_type_mask(d.duk_context, C.duk_idx_t(index), C.duk_uint_t(mask))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_compact
+func (d *Context) Compact(objIndex int) {
+ C.duk_compact(d.duk_context, C.duk_idx_t(objIndex))
+}
+
+// See: http://duktape.org/api.html#duk_compile
+func (d *Context) Compile(flags uint) {
+ C._duk_compile(d.duk_context, C.duk_uint_t(flags))
+}
+
+// See: http://duktape.org/api.html#duk_compile_file
+func (d *Context) CompileFile(flags uint, path string) {
+ __path__ := C.CString(path)
+ C._duk_compile_file(d.duk_context, C.duk_uint_t(flags), __path__)
+ C.free(unsafe.Pointer(__path__))
+}
+
+// See: http://duktape.org/api.html#duk_compile_lstring
+func (d *Context) CompileLstring(flags uint, src string, len int) {
+ __src__ := C.CString(src)
+ C._duk_compile_lstring(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len))
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_compile_lstring_filename
+func (d *Context) CompileLstringFilename(flags uint, src string, len int) {
+ __src__ := C.CString(src)
+ C._duk_compile_lstring_filename(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len))
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_compile_string
+func (d *Context) CompileString(flags uint, src string) {
+ __src__ := C.CString(src)
+ C._duk_compile_string(d.duk_context, C.duk_uint_t(flags), __src__)
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_compile_string_filename
+func (d *Context) CompileStringFilename(flags uint, src string) {
+ __src__ := C.CString(src)
+ C._duk_compile_string_filename(d.duk_context, C.duk_uint_t(flags), __src__)
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_concat
+func (d *Context) Concat(count int) {
+ C.duk_concat(d.duk_context, C.duk_idx_t(count))
+}
+
+// See: http://duktape.org/api.html#duk_copy
+func (d *Context) Copy(fromIndex int, toIndex int) {
+ C.duk_copy(d.duk_context, C.duk_idx_t(fromIndex), C.duk_idx_t(toIndex))
+}
+
+// See: http://duktape.org/api.html#duk_del_prop
+func (d *Context) DelProp(objIndex int) bool {
+ return int(C.duk_del_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_del_prop_index
+func (d *Context) DelPropIndex(objIndex int, arrIndex uint) bool {
+ return int(C.duk_del_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_del_prop_string
+func (d *Context) DelPropString(objIndex int, key string) bool {
+ __key__ := C.CString(key)
+ result := int(C.duk_del_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1
+ C.free(unsafe.Pointer(__key__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_def_prop
+func (d *Context) DefProp(objIndex int, flags uint) {
+ C.duk_def_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_uint_t(flags))
+}
+
+// See: http://duktape.org/api.html#duk_destroy_heap
+func (d *Context) DestroyHeap() {
+ d.Gc(0)
+ C.duk_destroy_heap(d.duk_context)
+ d.duk_context = nil
+}
+
+// See: http://duktape.org/api.html#duk_dump_context_stderr
+func (d *Context) DumpContextStderr() {
+ C._duk_dump_context_stderr(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_dump_context_stdout
+func (d *Context) DumpContextStdout() {
+ C._duk_dump_context_stdout(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_dup
+func (d *Context) Dup(fromIndex int) {
+ C.duk_dup(d.duk_context, C.duk_idx_t(fromIndex))
+}
+
+// See: http://duktape.org/api.html#duk_dup_top
+func (d *Context) DupTop() {
+ C.duk_dup_top(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_enum
+func (d *Context) Enum(objIndex int, enumFlags uint) {
+ C.duk_enum(d.duk_context, C.duk_idx_t(objIndex), C.duk_uint_t(enumFlags))
+}
+
+// See: http://duktape.org/api.html#duk_equals
+func (d *Context) Equals(index1 int, index2 int) bool {
+ return int(C.duk_equals(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))) == 1
+}
+
+// Error pushes a new Error object to the stack and throws it. This will call
+// fmt.Sprint, forwarding arguments after the error code, to produce the
+// Error's message.
+//
+// See: http://duktape.org/api.html#duk_error
+func (d *Context) Error(errCode int, str string) {
+ __str__ := C.CString(str)
+ C._duk_error(d.duk_context, C.duk_errcode_t(errCode), __str__)
+ C.free(unsafe.Pointer(__str__))
+}
+
+func (d *Context) ErrorRaw(errCode int, filename string, line int, errMsg string) {
+ __filename__ := C.CString(filename)
+ __errMsg__ := C.CString(errMsg)
+ C._duk_error_raw(d.duk_context, C.duk_errcode_t(errCode), __filename__, C.duk_int_t(line), __errMsg__)
+ C.free(unsafe.Pointer(__filename__))
+ C.free(unsafe.Pointer(__errMsg__))
+}
+
+// Errorf pushes a new Error object to the stack and throws it. This will call
+// fmt.Sprintf, forwarding the format string and additional arguments, to
+// produce the Error's message.
+//
+// See: http://duktape.org/api.html#duk_error
+func (d *Context) Errorf(errCode int, format string, a ...interface{}) {
+ str := fmt.Sprintf(format, a...)
+ __str__ := C.CString(str)
+ C._duk_error(d.duk_context, C.duk_errcode_t(errCode), __str__)
+ C.free(unsafe.Pointer(__str__))
+}
+
+// See: http://duktape.org/api.html#duk_eval
+func (d *Context) Eval() {
+ C._duk_eval(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_eval_file
+func (d *Context) EvalFile(path string) {
+ __path__ := C.CString(path)
+ C._duk_eval_file(d.duk_context, __path__)
+ C.free(unsafe.Pointer(__path__))
+}
+
+// See: http://duktape.org/api.html#duk_eval_file_noresult
+func (d *Context) EvalFileNoresult(path string) {
+ __path__ := C.CString(path)
+ C._duk_eval_file_noresult(d.duk_context, __path__)
+ C.free(unsafe.Pointer(__path__))
+}
+
+// See: http://duktape.org/api.html#duk_eval_lstring
+func (d *Context) EvalLstring(src string, len int) {
+ __src__ := C.CString(src)
+ C._duk_eval_lstring(d.duk_context, __src__, C.duk_size_t(len))
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_eval_lstring_noresult
+func (d *Context) EvalLstringNoresult(src string, len int) {
+ __src__ := C.CString(src)
+ C._duk_eval_lstring_noresult(d.duk_context, __src__, C.duk_size_t(len))
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_eval_noresult
+func (d *Context) EvalNoresult() {
+ C._duk_eval_noresult(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_eval_string
+func (d *Context) EvalString(src string) {
+ __src__ := C.CString(src)
+ C._duk_eval_string(d.duk_context, __src__)
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_eval_string_noresult
+func (d *Context) EvalStringNoresult(src string) {
+ __src__ := C.CString(src)
+ C._duk_eval_string_noresult(d.duk_context, __src__)
+ C.free(unsafe.Pointer(__src__))
+}
+
+// See: http://duktape.org/api.html#duk_fatal
+func (d *Context) Fatal(errCode int, errMsg string) {
+ __errMsg__ := C.CString(errMsg)
+ defer C.free(unsafe.Pointer(__errMsg__))
+ C.duk_fatal_raw(d.duk_context, __errMsg__)
+}
+
+// See: http://duktape.org/api.html#duk_gc
+func (d *Context) Gc(flags uint) {
+ C.duk_gc(d.duk_context, C.duk_uint_t(flags))
+}
+
+// See: http://duktape.org/api.html#duk_get_boolean
+func (d *Context) GetBoolean(index int) bool {
+ return int(C.duk_get_boolean(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_get_buffer
+func (d *Context) GetBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {
+ rawPtr = C.duk_get_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))
+ return rawPtr, outSize
+}
+
+// See: http://duktape.org/api.html#duk_get_context
+func (d *Context) GetContext(index int) *Context {
+ return contextFromPointer(C.duk_get_context(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_current_magic
+func (d *Context) GetCurrentMagic() int {
+ return int(C.duk_get_current_magic(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_get_error_code
+func (d *Context) GetErrorCode(index int) int {
+ code := int(C.duk_get_error_code(d.duk_context, C.duk_idx_t(index)))
+ return code
+}
+
+// See: http://duktape.org/api.html#duk_get_finalizer
+func (d *Context) GetFinalizer(index int) {
+ C.duk_get_finalizer(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_get_global_string
+func (d *Context) GetGlobalString(key string) bool {
+ __key__ := C.CString(key)
+ result := int(C.duk_get_global_string(d.duk_context, __key__)) == 1
+ C.free(unsafe.Pointer(__key__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_get_heapptr
+func (d *Context) GetHeapptr(index int) unsafe.Pointer {
+ return unsafe.Pointer(C.duk_get_heapptr(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_int
+func (d *Context) GetInt(index int) int {
+ return int(C.duk_get_int(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_length
+func (d *Context) GetLength(index int) int {
+ return int(C.duk_get_length(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_lstring
+func (d *Context) GetLstring(index int) string {
+ if s := C.duk_get_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_get_magic
+func (d *Context) GetMagic(index int) int {
+ return int(C.duk_get_magic(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_number
+func (d *Context) GetNumber(index int) float64 {
+ return float64(C.duk_get_number(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_pointer
+func (d *Context) GetPointer(index int) unsafe.Pointer {
+ return C.duk_get_pointer(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_get_prop
+func (d *Context) GetProp(objIndex int) bool {
+ return int(C.duk_get_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_get_prop_index
+func (d *Context) GetPropIndex(objIndex int, arrIndex uint) bool {
+ return int(C.duk_get_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_get_prop_string
+func (d *Context) GetPropString(objIndex int, key string) bool {
+ __key__ := C.CString(key)
+ result := int(C.duk_get_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1
+ C.free(unsafe.Pointer(__key__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_get_prototype
+func (d *Context) GetPrototype(index int) {
+ C.duk_get_prototype(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_get_string
+func (d *Context) GetString(i int) string {
+ if s := C.duk_get_string(d.duk_context, C.duk_idx_t(i)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_get_top
+func (d *Context) GetTop() int {
+ return int(C.duk_get_top(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_get_top_index
+func (d *Context) GetTopIndex() int {
+ return int(C.duk_get_top_index(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_get_type
+func (d *Context) GetType(index int) Type {
+ return Type(C.duk_get_type(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_type_mask
+func (d *Context) GetTypeMask(index int) uint {
+ return uint(C.duk_get_type_mask(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_get_uint
+func (d *Context) GetUint(index int) uint {
+ return uint(C.duk_get_uint(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_has_prop
+func (d *Context) HasProp(objIndex int) bool {
+ return int(C.duk_has_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_has_prop_index
+func (d *Context) HasPropIndex(objIndex int, arrIndex uint) bool {
+ return int(C.duk_has_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_has_prop_string
+func (d *Context) HasPropString(objIndex int, key string) bool {
+ __key__ := C.CString(key)
+ result := int(C.duk_has_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1
+ C.free(unsafe.Pointer(__key__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_hex_decode
+func (d *Context) HexDecode(index int) {
+ C.duk_hex_decode(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_hex_encode
+func (d *Context) HexEncode(index int) string {
+ if s := C.duk_hex_encode(d.duk_context, C.duk_idx_t(index)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_insert
+func (d *Context) Insert(toIndex int) {
+ C.duk_insert(d.duk_context, C.duk_idx_t(toIndex))
+}
+
+// See: http://duktape.org/api.html#duk_is_array
+func (d *Context) IsArray(index int) bool {
+ return int(C.duk_is_array(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_boolean
+func (d *Context) IsBoolean(index int) bool {
+ return int(C.duk_is_boolean(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_bound_function
+func (d *Context) IsBoundFunction(index int) bool {
+ return int(C.duk_is_bound_function(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_buffer
+func (d *Context) IsBuffer(index int) bool {
+ return int(C.duk_is_buffer(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_c_function
+func (d *Context) IsCFunction(index int) bool {
+ return int(C.duk_is_c_function(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_callable
+func (d *Context) IsCallable(index int) bool {
+ return int(C.duk_is_function(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_constructor_call
+func (d *Context) IsConstructorCall() bool {
+ return int(C.duk_is_constructor_call(d.duk_context)) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_dynamic_buffer
+func (d *Context) IsDynamicBuffer(index int) bool {
+ return int(C.duk_is_dynamic_buffer(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_ecmascript_function
+func (d *Context) IsEcmascriptFunction(index int) bool {
+ return int(C.duk_is_ecmascript_function(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_fixed_buffer
+func (d *Context) IsFixedBuffer(index int) bool {
+ return int(C.duk_is_fixed_buffer(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_function
+func (d *Context) IsFunction(index int) bool {
+ return int(C.duk_is_function(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_nan
+func (d *Context) IsNan(index int) bool {
+ return int(C.duk_is_nan(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_null
+func (d *Context) IsNull(index int) bool {
+ return int(C.duk_is_null(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_null_or_undefined
+func (d *Context) IsNullOrUndefined(index int) bool {
+ return d.IsNull(index) || d.IsUndefined(index)
+}
+
+// See: http://duktape.org/api.html#duk_is_number
+func (d *Context) IsNumber(index int) bool {
+ return int(C.duk_is_number(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_object
+func (d *Context) IsObject(index int) bool {
+ return int(C.duk_is_object(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_error
+func (d *Context) IsError(index int) bool {
+ return int(C._duk_is_error(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_object_coercible
+func (d *Context) IsObjectCoercible(index int) bool {
+ return int(C._duk_is_object_coercible(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_pointer
+func (d *Context) IsPointer(index int) bool {
+ return int(C.duk_is_pointer(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_primitive
+func (d *Context) IsPrimitive(index int) bool {
+ return int(C._duk_is_primitive(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_strict_call
+func (d *Context) IsStrictCall() bool {
+ return int(C.duk_is_strict_call(d.duk_context)) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_string
+func (d *Context) IsString(index int) bool {
+ return int(C.duk_is_string(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_thread
+func (d *Context) IsThread(index int) bool {
+ return int(C.duk_is_thread(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_undefined
+func (d *Context) IsUndefined(index int) bool {
+ return int(C.duk_is_undefined(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_valid_index
+func (d *Context) IsValidIndex(index int) bool {
+ return int(C.duk_is_valid_index(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_join
+func (d *Context) Join(count int) {
+ C.duk_join(d.duk_context, C.duk_idx_t(count))
+}
+
+// See: http://duktape.org/api.html#duk_json_decode
+func (d *Context) JsonDecode(index int) {
+ C.duk_json_decode(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_json_encode
+func (d *Context) JsonEncode(index int) string {
+ if s := C.duk_json_encode(d.duk_context, C.duk_idx_t(index)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_new
+func (d *Context) New(nargs int) {
+ C.duk_new(d.duk_context, C.duk_idx_t(nargs))
+}
+
+// See: http://duktape.org/api.html#duk_next
+func (d *Context) Next(enumIndex int, getValue bool) bool {
+ var __getValue__ int
+ if getValue {
+ __getValue__ = 1
+ }
+ return int(C.duk_next(d.duk_context, C.duk_idx_t(enumIndex), C.duk_bool_t(__getValue__))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_normalize_index
+func (d *Context) NormalizeIndex(index int) int {
+ return int(C.duk_normalize_index(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_pcall
+func (d *Context) Pcall(nargs int) int {
+ return int(C.duk_pcall(d.duk_context, C.duk_idx_t(nargs)))
+}
+
+// See: http://duktape.org/api.html#duk_pcall_method
+func (d *Context) PcallMethod(nargs int) int {
+ return int(C.duk_pcall_method(d.duk_context, C.duk_idx_t(nargs)))
+}
+
+// See: http://duktape.org/api.html#duk_pcall_prop
+func (d *Context) PcallProp(objIndex int, nargs int) int {
+ return int(C.duk_pcall_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_idx_t(nargs)))
+}
+
+// See: http://duktape.org/api.html#duk_pcompile
+func (d *Context) Pcompile(flags uint) error {
+ result := int(C._duk_pcompile(d.duk_context, C.duk_uint_t(flags)))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_pcompile_file
+func (d *Context) PcompileFile(flags uint, path string) error {
+ __path__ := C.CString(path)
+ result := int(C._duk_pcompile_file(d.duk_context, C.duk_uint_t(flags), __path__))
+ C.free(unsafe.Pointer(__path__))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_pcompile_lstring
+func (d *Context) PcompileLstring(flags uint, src string, len int) error {
+ __src__ := C.CString(src)
+ result := int(C._duk_pcompile_lstring(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len)))
+ C.free(unsafe.Pointer(__src__))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_pcompile_lstring_filename
+func (d *Context) PcompileLstringFilename(flags uint, src string, len int) error {
+ __src__ := C.CString(src)
+ result := int(C._duk_pcompile_lstring_filename(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len)))
+ C.free(unsafe.Pointer(__src__))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_pcompile_string
+func (d *Context) PcompileString(flags uint, src string) error {
+ __src__ := C.CString(src)
+ result := int(C._duk_pcompile_string(d.duk_context, C.duk_uint_t(flags), __src__))
+ C.free(unsafe.Pointer(__src__))
+ fmt.Println("result herhehreh", result)
+ return nil //d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_pcompile_string_filename
+func (d *Context) PcompileStringFilename(flags uint, src string) error {
+ __src__ := C.CString(src)
+ result := int(C._duk_pcompile_string_filename(d.duk_context, C.duk_uint_t(flags), __src__))
+ C.free(unsafe.Pointer(__src__))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_peval
+func (d *Context) Peval() error {
+ result := int(C._duk_peval(d.duk_context))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_peval_file
+func (d *Context) PevalFile(path string) error {
+ __path__ := C.CString(path)
+ result := int(C._duk_peval_file(d.duk_context, __path__))
+ C.free(unsafe.Pointer(__path__))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_peval_file_noresult
+func (d *Context) PevalFileNoresult(path string) int {
+ __path__ := C.CString(path)
+ result := int(C._duk_peval_file_noresult(d.duk_context, __path__))
+ C.free(unsafe.Pointer(__path__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_peval_lstring
+func (d *Context) PevalLstring(src string, len int) error {
+ __src__ := C.CString(src)
+ result := int(C._duk_peval_lstring(d.duk_context, __src__, C.duk_size_t(len)))
+ C.free(unsafe.Pointer(__src__))
+ return d.castStringToError(result)
+
+}
+
+// See: http://duktape.org/api.html#duk_peval_lstring_noresult
+func (d *Context) PevalLstringNoresult(src string, len int) int {
+ __src__ := C.CString(src)
+ result := int(C._duk_peval_lstring_noresult(d.duk_context, __src__, C.duk_size_t(len)))
+ C.free(unsafe.Pointer(__src__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_peval_noresult
+func (d *Context) PevalNoresult() int {
+ return int(C._duk_peval_noresult(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_peval_string
+func (d *Context) PevalString(src string) error {
+ __src__ := C.CString(src)
+ result := int(C._duk_peval_string(d.duk_context, __src__))
+ C.free(unsafe.Pointer(__src__))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_peval_string_noresult
+func (d *Context) PevalStringNoresult(src string) int {
+ __src__ := C.CString(src)
+ result := int(C._duk_peval_string_noresult(d.duk_context, __src__))
+ C.free(unsafe.Pointer(__src__))
+ return result
+}
+
+func (d *Context) castStringToError(result int) error {
+ if result == 0 {
+ return nil
+ }
+
+ err := &Error{}
+ for _, key := range []string{"name", "message", "fileName", "lineNumber", "stack"} {
+ d.GetPropString(-1, key)
+
+ switch key {
+ case "name":
+ err.Type = d.SafeToString(-1)
+ case "message":
+ err.Message = d.SafeToString(-1)
+ case "fileName":
+ err.FileName = d.SafeToString(-1)
+ case "lineNumber":
+ if d.IsNumber(-1) {
+ err.LineNumber = d.GetInt(-1)
+ }
+ case "stack":
+ err.Stack = d.SafeToString(-1)
+ }
+
+ d.Pop()
+ }
+
+ return err
+}
+
+// See: http://duktape.org/api.html#duk_pop
+func (d *Context) Pop() {
+ if d.GetTop() == 0 {
+ return
+ }
+ C.duk_pop(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_pop_2
+func (d *Context) Pop2() {
+ d.PopN(2)
+}
+
+// See: http://duktape.org/api.html#duk_pop_3
+func (d *Context) Pop3() {
+ d.PopN(3)
+}
+
+// See: http://duktape.org/api.html#duk_pop_n
+func (d *Context) PopN(count int) {
+ if d.GetTop() < count || count < 1 {
+ return
+ }
+ C.duk_pop_n(d.duk_context, C.duk_idx_t(count))
+}
+
+// See: http://duktape.org/api.html#duk_push_array
+func (d *Context) PushArray() int {
+ return int(C.duk_push_array(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_push_boolean
+func (d *Context) PushBoolean(val bool) {
+ var __val__ int
+ if val {
+ __val__ = 1
+ }
+ C.duk_push_boolean(d.duk_context, C.duk_bool_t(__val__))
+}
+
+// See: http://duktape.org/api.html#duk_push_buffer
+func (d *Context) PushBuffer(size int, dynamic bool) unsafe.Pointer {
+ var __dynamic__ int
+ if dynamic {
+ __dynamic__ = 1
+ }
+ return C._duk_push_buffer(d.duk_context, C.duk_size_t(size), C.duk_bool_t(__dynamic__))
+}
+
+// See: http://duktape.org/api.html#duk_push_c_function
+func (d *Context) PushCFunction(fn *[0]byte, nargs int64) int {
+ return int(C.duk_push_c_function(d.duk_context, fn, C.duk_idx_t(nargs)))
+}
+
+// See: http://duktape.org/api.html#duk_push_context_dump
+func (d *Context) PushContextDump() {
+ C.duk_push_context_dump(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_current_function
+func (d *Context) PushCurrentFunction() {
+ C.duk_push_current_function(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_current_thread
+func (d *Context) PushCurrentThread() {
+ C.duk_push_current_thread(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_dynamic_buffer
+func (d *Context) PushDynamicBuffer(size int) unsafe.Pointer {
+ return C._duk_push_dynamic_buffer(d.duk_context, C.duk_size_t(size))
+}
+
+// See: http://duktape.org/api.html#duk_push_error_object
+func (d *Context) PushErrorObject(errCode int, format string, value interface{}) {
+ __str__ := C.CString(fmt.Sprintf(format, value))
+ C._duk_push_error_object(d.duk_context, C.duk_errcode_t(errCode), __str__)
+ C.free(unsafe.Pointer(__str__))
+}
+
+// See: http://duktape.org/api.html#duk_push_false
+func (d *Context) PushFalse() {
+ C.duk_push_false(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_fixed_buffer
+func (d *Context) PushFixedBuffer(size int) unsafe.Pointer {
+ return C._duk_push_fixed_buffer(d.duk_context, C.duk_size_t(size))
+}
+
+// See: http://duktape.org/api.html#duk_push_global_object
+func (d *Context) PushGlobalObject() {
+ C.duk_push_global_object(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_global_stash
+func (d *Context) PushGlobalStash() {
+ C.duk_push_global_stash(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_heapptr
+func (d *Context) PushHeapptr(ptr unsafe.Pointer) {
+ C.duk_push_heapptr(d.duk_context, ptr)
+}
+
+// See: http://duktape.org/api.html#duk_push_heap_stash
+func (d *Context) PushHeapStash() {
+ C.duk_push_heap_stash(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_int
+func (d *Context) PushInt(val int) {
+ C.duk_push_int(d.duk_context, C.duk_int_t(val))
+}
+
+// See: http://duktape.org/api.html#duk_push_lstring
+func (d *Context) PushLstring(str string, len int) string {
+ __str__ := C.CString(str)
+ var result string
+ if s := C.duk_push_lstring(d.duk_context, __str__, C.duk_size_t(len)); s != nil {
+ result = C.GoString(s)
+ }
+ C.free(unsafe.Pointer(__str__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_push_nan
+func (d *Context) PushNan() {
+ C.duk_push_nan(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_null
+func (d *Context) PushNull() {
+ C.duk_push_null(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_number
+func (d *Context) PushNumber(val float64) {
+ C.duk_push_number(d.duk_context, C.duk_double_t(val))
+}
+
+// See: http://duktape.org/api.html#duk_push_object
+func (d *Context) PushObject() int {
+ return int(C.duk_push_object(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_push_string
+func (d *Context) PushString(str string) string {
+ __str__ := C.CString(str)
+ var result string
+ if s := C.duk_push_string(d.duk_context, __str__); s != nil {
+ result = C.GoString(s)
+ }
+ C.free(unsafe.Pointer(__str__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_push_string_file
+func (d *Context) PushStringFile(path string) string {
+ __path__ := C.CString(path)
+ var result string
+ if s := C._duk_push_string_file(d.duk_context, __path__); s != nil {
+ result = C.GoString(s)
+ }
+ C.free(unsafe.Pointer(__path__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_push_this
+func (d *Context) PushThis() {
+ C.duk_push_this(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_thread
+func (d *Context) PushThread() int {
+ return int(C._duk_push_thread(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_push_thread_new_globalenv
+func (d *Context) PushThreadNewGlobalenv() int {
+ return int(C._duk_push_thread_new_globalenv(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_push_thread_stash
+func (d *Context) PushThreadStash(targetCtx *Context) {
+ C.duk_push_thread_stash(d.duk_context, targetCtx.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_true
+func (d *Context) PushTrue() {
+ C.duk_push_true(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_push_uint
+func (d *Context) PushUint(val uint) {
+ C.duk_push_uint(d.duk_context, C.duk_uint_t(val))
+}
+
+// See: http://duktape.org/api.html#duk_push_undefined
+func (d *Context) PushUndefined() {
+ C.duk_push_undefined(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_put_global_string
+func (d *Context) PutGlobalString(key string) bool {
+ __key__ := C.CString(key)
+ result := int(C.duk_put_global_string(d.duk_context, __key__)) == 1
+ C.free(unsafe.Pointer(__key__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_put_prop
+func (d *Context) PutProp(objIndex int) bool {
+ return int(C.duk_put_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_put_prop_index
+func (d *Context) PutPropIndex(objIndex int, arrIndex uint) bool {
+ return int(C.duk_put_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_put_prop_string
+func (d *Context) PutPropString(objIndex int, key string) bool {
+ __key__ := C.CString(key)
+ result := int(C.duk_put_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1
+ C.free(unsafe.Pointer(__key__))
+ return result
+}
+
+// See: http://duktape.org/api.html#duk_remove
+func (d *Context) Remove(index int) {
+ C.duk_remove(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_replace
+func (d *Context) Replace(toIndex int) {
+ C.duk_replace(d.duk_context, C.duk_idx_t(toIndex))
+}
+
+// See: http://duktape.org/api.html#duk_require_boolean
+func (d *Context) RequireBoolean(index int) bool {
+ return int(C.duk_require_boolean(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_require_buffer
+func (d *Context) RequireBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {
+ rawPtr = C.duk_require_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))
+ return rawPtr, outSize
+}
+
+// See: http://duktape.org/api.html#duk_require_callable
+func (d *Context) RequireCallable(index int) {
+ // At present, duk_require_callable is a macro that just calls duk_require_function.
+ // cgo does not support such macros we have to call it directly.
+ C.duk_require_function(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_require_context
+func (d *Context) RequireContext(index int) *Context {
+ return contextFromPointer(C.duk_require_context(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_require_function
+func (d *Context) RequireFunction(index int) {
+ C.duk_require_function(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_require_heapptr
+func (d *Context) RequireHeapptr(index int) unsafe.Pointer {
+ return unsafe.Pointer(C.duk_require_heapptr(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_require_int
+func (d *Context) RequireInt(index int) int {
+ return int(C.duk_require_int(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_require_lstring
+func (d *Context) RequireLstring(index int) string {
+ if s := C.duk_require_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_require_normalize_index
+func (d *Context) RequireNormalizeIndex(index int) int {
+ return int(C.duk_require_normalize_index(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_require_null
+func (d *Context) RequireNull(index int) {
+ C.duk_require_null(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_require_number
+func (d *Context) RequireNumber(index int) float64 {
+ return float64(C.duk_require_number(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_require_object_coercible
+func (d *Context) RequireObjectCoercible(index int) {
+ C._duk_require_object_coercible(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_require_pointer
+func (d *Context) RequirePointer(index int) unsafe.Pointer {
+ return C.duk_require_pointer(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_require_stack
+func (d *Context) RequireStack(extra int) {
+ C.duk_require_stack(d.duk_context, C.duk_idx_t(extra))
+}
+
+// See: http://duktape.org/api.html#duk_require_stack_top
+func (d *Context) RequireStackTop(top int) {
+ C.duk_require_stack_top(d.duk_context, C.duk_idx_t(top))
+}
+
+// See: http://duktape.org/api.html#duk_require_string
+func (d *Context) RequireString(index int) string {
+ if s := C.duk_require_string(d.duk_context, C.duk_idx_t(index)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_require_top_index
+func (d *Context) RequireTopIndex() int {
+ return int(C.duk_require_top_index(d.duk_context))
+}
+
+// See: http://duktape.org/api.html#duk_require_type_mask
+func (d *Context) RequireTypeMask(index int, mask uint) {
+ C._duk_require_type_mask(d.duk_context, C.duk_idx_t(index), C.duk_uint_t(mask))
+}
+
+// See: http://duktape.org/api.html#duk_require_uint
+func (d *Context) RequireUint(index int) uint {
+ return uint(C.duk_require_uint(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_require_undefined
+func (d *Context) RequireUndefined(index int) {
+ C.duk_require_undefined(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_require_valid_index
+func (d *Context) RequireValidIndex(index int) {
+ C.duk_require_valid_index(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_resize_buffer
+func (d *Context) ResizeBuffer(index int, newSize int) unsafe.Pointer {
+ return C.duk_resize_buffer(d.duk_context, C.duk_idx_t(index), C.duk_size_t(newSize))
+}
+
+// See: http://duktape.org/api.html#duk_safe_call
+func (d *Context) SafeCall(fn, args *[0]byte, nargs, nrets int) int {
+ return int(C.duk_safe_call(
+ d.duk_context,
+ fn,
+ unsafe.Pointer(&args),
+ C.duk_idx_t(nargs),
+ C.duk_idx_t(nrets),
+ ))
+}
+
+// See: http://duktape.org/api.html#duk_safe_to_lstring
+func (d *Context) SafeToLstring(index int) string {
+ if s := C.duk_safe_to_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_safe_to_string
+func (d *Context) SafeToString(index int) string {
+ if s := C._duk_safe_to_string(d.duk_context, C.duk_idx_t(index)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_set_finalizer
+func (d *Context) SetFinalizer(index int) {
+ C.duk_set_finalizer(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_set_global_object
+func (d *Context) SetGlobalObject() {
+ C.duk_set_global_object(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_set_magic
+func (d *Context) SetMagic(index int, magic int) {
+ C.duk_set_magic(d.duk_context, C.duk_idx_t(index), C.duk_int_t(magic))
+}
+
+// See: http://duktape.org/api.html#duk_set_prototype
+func (d *Context) SetPrototype(index int) {
+ C.duk_set_prototype(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_set_top
+func (d *Context) SetTop(index int) {
+ C.duk_set_top(d.duk_context, C.duk_idx_t(index))
+}
+
+func (d *Context) StrictEquals(index1 int, index2 int) bool {
+ return int(C.duk_strict_equals(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_substring
+func (d *Context) Substring(index int, startCharOffset int, endCharOffset int) {
+ C.duk_substring(d.duk_context, C.duk_idx_t(index), C.duk_size_t(startCharOffset), C.duk_size_t(endCharOffset))
+}
+
+// See: http://duktape.org/api.html#duk_swap
+func (d *Context) Swap(index1 int, index2 int) {
+ C.duk_swap(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))
+}
+
+// See: http://duktape.org/api.html#duk_swap_top
+func (d *Context) SwapTop(index int) {
+ C.duk_swap_top(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_throw
+func (d *Context) Throw() {
+ C.duk_throw_raw(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_to_boolean
+func (d *Context) ToBoolean(index int) bool {
+ return int(C.duk_to_boolean(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_to_buffer
+func (d *Context) ToBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {
+ rawPtr = C._duk_to_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))
+ return rawPtr, outSize
+}
+
+// See: http://duktape.org/api.html#duk_to_defaultvalue
+func (d *Context) ToDefaultvalue(index int, hint int) {
+ C.duk_to_defaultvalue(d.duk_context, C.duk_idx_t(index), C.duk_int_t(hint))
+}
+
+// See: http://duktape.org/api.html#duk_to_dynamic_buffer
+func (d *Context) ToDynamicBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {
+ rawPtr = C._duk_to_dynamic_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))
+ return rawPtr, outSize
+}
+
+// See: http://duktape.org/api.html#duk_to_fixed_buffer
+func (d *Context) ToFixedBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {
+ rawPtr = C._duk_to_fixed_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))
+ return rawPtr, outSize
+}
+
+// See: http://duktape.org/api.html#duk_to_int
+func (d *Context) ToInt(index int) int {
+ return int(C.duk_to_int(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_to_int32
+func (d *Context) ToInt32(index int) int32 {
+ return int32(C.duk_to_int32(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_to_lstring
+func (d *Context) ToLstring(index int) string {
+ if s := C.duk_to_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_to_null
+func (d *Context) ToNull(index int) {
+ C.duk_to_null(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_to_number
+func (d *Context) ToNumber(index int) float64 {
+ return float64(C.duk_to_number(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_to_object
+func (d *Context) ToObject(index int) {
+ C.duk_to_object(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_to_pointer
+func (d *Context) ToPointer(index int) unsafe.Pointer {
+ return C.duk_to_pointer(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_to_primitive
+func (d *Context) ToPrimitive(index int, hint int) {
+ C.duk_to_primitive(d.duk_context, C.duk_idx_t(index), C.duk_int_t(hint))
+}
+
+// See: http://duktape.org/api.html#duk_to_string
+func (d *Context) ToString(index int) string {
+ if s := C.duk_to_string(d.duk_context, C.duk_idx_t(index)); s != nil {
+ return C.GoString(s)
+ }
+ return ""
+}
+
+// See: http://duktape.org/api.html#duk_to_uint
+func (d *Context) ToUint(index int) uint {
+ return uint(C.duk_to_uint(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_to_uint16
+func (d *Context) ToUint16(index int) uint16 {
+ return uint16(C.duk_to_uint16(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_to_uint32
+func (d *Context) ToUint32(index int) uint32 {
+ return uint32(C.duk_to_uint32(d.duk_context, C.duk_idx_t(index)))
+}
+
+// See: http://duktape.org/api.html#duk_to_undefined
+func (d *Context) ToUndefined(index int) {
+ C.duk_to_undefined(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_trim
+func (d *Context) Trim(index int) {
+ C.duk_trim(d.duk_context, C.duk_idx_t(index))
+}
+
+// See: http://duktape.org/api.html#duk_xcopy_top
+func (d *Context) XcopyTop(fromCtx *Context, count int) {
+ C._duk_xcopy_top(d.duk_context, fromCtx.duk_context, C.duk_idx_t(count))
+}
+
+// See: http://duktape.org/api.html#duk_xmove_top
+func (d *Context) XmoveTop(fromCtx *Context, count int) {
+ C._duk_xmove_top(d.duk_context, fromCtx.duk_context, C.duk_idx_t(count))
+}
+
+// See: http://duktape.org/api.html#duk_push_pointer
+func (d *Context) PushPointer(p unsafe.Pointer) {
+ C.duk_push_pointer(d.duk_context, p)
+}
+
+//---[ Duktape 1.3 API ]--- //
+// See: http://duktape.org/api.html#duk_debugger_attach
+func (d *Context) DebuggerAttach(
+ readFn,
+ writeFn,
+ peekFn,
+ readFlushFn,
+ writeFlushFn,
+ detachedFn *[0]byte,
+ uData unsafe.Pointer) {
+ C.duk_debugger_attach(
+ d.duk_context,
+ readFn,
+ writeFn,
+ peekFn,
+ readFlushFn,
+ writeFlushFn,
+ nil,
+ detachedFn,
+ uData,
+ )
+}
+
+// See: http://duktape.org/api.html#duk_debugger_cooperate
+func (d *Context) DebuggerCooperate() {
+ C.duk_debugger_cooperate(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_debugger_detach
+func (d *Context) DebuggerDetach() {
+ C.duk_debugger_detach(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_dump_function
+func (d *Context) DumpFunction() {
+ C.duk_dump_function(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_error_va
+func (d *Context) ErrorVa(errCode int, a ...interface{}) {
+ str := fmt.Sprint(a...)
+ d.Error(errCode, str)
+}
+
+// See: http://duktape.org/api.html#duk_instanceof
+func (d *Context) Instanceof(idx1, idx2 int) bool {
+ return int(C.duk_instanceof(d.duk_context, C.duk_idx_t(idx1), C.duk_idx_t(idx2))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_is_lightfunc
+func (d *Context) IsLightfunc(index int) bool {
+ return int(C.duk_is_lightfunc(d.duk_context, C.duk_idx_t(index))) == 1
+}
+
+// See: http://duktape.org/api.html#duk_load_function
+func (d *Context) LoadFunction() {
+ C.duk_load_function(d.duk_context)
+}
+
+// See: http://duktape.org/api.html#duk_log
+func (d *Context) Log(loglevel int, format string, value interface{}) {
+ __str__ := C.CString(fmt.Sprintf(format, value))
+ C._duk_log(d.duk_context, C.duk_int_t(loglevel), __str__)
+ C.free(unsafe.Pointer(__str__))
+}
+
+// See: http://duktape.org/api.html#duk_log_va
+func (d *Context) LogVa(logLevel int, format string, values ...interface{}) {
+ __str__ := C.CString(fmt.Sprintf(format, values...))
+ C._duk_log(d.duk_context, C.duk_int_t(logLevel), __str__)
+ C.free(unsafe.Pointer(__str__))
+}
+
+// See: http://duktape.org/api.html#duk_pnew
+func (d *Context) Pnew(nargs int) error {
+ result := int(C.duk_pnew(d.duk_context, C.duk_idx_t(nargs)))
+ return d.castStringToError(result)
+}
+
+// See: http://duktape.org/api.html#duk_push_buffer_object
+func (d *Context) PushBufferObject(bufferIdx, size, length int, flags uint) {
+ C.duk_push_buffer_object(
+ d.duk_context,
+ C.duk_idx_t(bufferIdx),
+ C.duk_size_t(size),
+ C.duk_size_t(length),
+ C.duk_uint_t(flags),
+ )
+}
+
+// See: http://duktape.org/api.html#duk_push_c_lightfunc
+func (d *Context) PushCLightfunc(fn *[0]byte, nargs, length, magic int) int {
+ return int(C.duk_push_c_lightfunc(
+ d.duk_context,
+ fn,
+ C.duk_idx_t(nargs),
+ C.duk_idx_t(length),
+ C.duk_int_t(magic),
+ ))
+}
+
+// See: http://duktape.org/api.html#duk_push_error_object_va
+func (d *Context) PushErrorObjectVa(errCode int, format string, values ...interface{}) {
+ __str__ := C.CString(fmt.Sprintf(format, values...))
+ C._duk_push_error_object(d.duk_context, C.duk_errcode_t(errCode), __str__)
+ C.free(unsafe.Pointer(__str__))
+}
+
+// See: http://duktape.org/api.html#duk_push_external_buffer
+func (d *Context) PushExternalBuffer() {
+ C._duk_push_external_buffer(d.duk_context)
+}
+
+/**
+ * Unimplemented.
+ *
+ * CharCodeAt see: http://duktape.org/api.html#duk_char_code_at
+ * CreateHeap see: http://duktape.org/api.html#duk_create_heap
+ * DecodeString see: http://duktape.org/api.html#duk_decode_string
+ * Free see: http://duktape.org/api.html#duk_free
+ * FreeRaw see: http://duktape.org/api.html#duk_free_raw
+ * GetCFunction see: http://duktape.org/api.html#duk_get_c_function
+ * GetMemoryFunctions see: http://duktape.org/api.html#duk_get_memory_functions
+ * MapString see: http://duktape.org/api.html#duk_map_string
+ * PushSprintf see: http://duktape.org/api.html#duk_push_sprintf
+ * PushVsprintf see: http://duktape.org/api.html#duk_push_vsprintf
+ * PutFunctionList see: http://duktape.org/api.html#duk_put_function_list
+ * PutNumberList see: http://duktape.org/api.html#duk_put_number_list
+ * Realloc see: http://duktape.org/api.html#duk_realloc
+ * ReallocRaw see: http://duktape.org/api.html#duk_realloc_raw
+ * RequireCFunction see: http://duktape.org/api.html#duk_require_c_function
+ * ConfigBuffer see: http://duktape.org/api.html#duk_config_buffer
+ * GetBufferData see: http://duktape.org/api.html#duk_get_buffer_data
+ * StealBuffer see: http://duktape.org/api.html#duk_steal_buffer
+ * RequireBufferData see: http://duktape.org/api.html#duk_require_buffer_data
+ * IsEvalError see: http://duktape.org/api.html#duk_is_eval_error
+ */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/appveyor.yml b/vendor/gopkg.in/olebedev/go-duktape.v3/appveyor.yml
new file mode 100644
index 000000000..7d38d58b1
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/appveyor.yml
@@ -0,0 +1,34 @@
+os: Visual Studio 2015
+
+clone_folder: C:\gopath\src\gopkg.in/olebedev/go-duktape.v3
+clone_depth: 5
+version: "{branch}.{build}"
+environment:
+ global:
+ GOPATH: C:\gopath
+ CC: gcc.exe
+ matrix:
+ - DUKTAPE_ARCH: amd64
+ MSYS2_ARCH: x86_64
+ MSYS2_BITS: 64
+ MSYSTEM: MINGW64
+ PATH: C:\msys64\mingw64\bin\;C:\Program Files (x86)\NSIS\;%PATH%
+ - DUKTAPE_ARCH: 386
+ MSYS2_ARCH: i686
+ MSYS2_BITS: 32
+ MSYSTEM: MINGW32
+ PATH: C:\msys64\mingw32\bin\;C:\Program Files (x86)\NSIS\;%PATH%
+
+install:
+ - rmdir C:\go /s /q
+ - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.2.windows-%DUKTAPE_ARCH%.zip
+ - 7z x go1.9.2.windows-%DUKTAPE_ARCH%.zip -y -oC:\ > NUL
+ - go version
+ - gcc --version
+
+build_script:
+ - go get -t
+ - go install ./...
+
+test_script:
+ - go test ./...
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/conts.go b/vendor/gopkg.in/olebedev/go-duktape.v3/conts.go
new file mode 100644
index 000000000..f3dbd8bc8
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/conts.go
@@ -0,0 +1,121 @@
+package duktape
+
+const (
+ CompileEval uint = 1 << iota
+ CompileFunction
+ CompileStrict
+ CompileSafe
+ CompileNoResult
+ CompileNoSource
+ CompileStrlen
+)
+
+const (
+ TypeNone Type = iota
+ TypeUndefined
+ TypeNull
+ TypeBoolean
+ TypeNumber
+ TypeString
+ TypeObject
+ TypeBuffer
+ TypePointer
+ TypeLightFunc
+)
+
+const (
+ TypeMaskNone uint = 1 << iota
+ TypeMaskUndefined
+ TypeMaskNull
+ TypeMaskBoolean
+ TypeMaskNumber
+ TypeMaskString
+ TypeMaskObject
+ TypeMaskBuffer
+ TypeMaskPointer
+ TypeMaskLightFunc
+)
+
+const (
+ EnumIncludeNonenumerable uint = 1 << iota
+ EnumIncludeInternal
+ EnumOwnPropertiesOnly
+ EnumArrayIndicesOnly
+ EnumSortArrayIndices
+ NoProxyBehavior
+)
+
+const (
+ ErrNone int = 0
+
+ // Internal to Duktape
+ ErrUnimplemented int = 50 + iota
+ ErrUnsupported
+ ErrInternal
+ ErrAlloc
+ ErrAssertion
+ ErrAPI
+ ErrUncaughtError
+)
+
+const (
+ // Common prototypes
+ ErrError int = 1 + iota
+ ErrEval
+ ErrRange
+ ErrReference
+ ErrSyntax
+ ErrType
+ ErrURI
+)
+
+const (
+ // Returned error values
+ ErrRetUnimplemented int = -(ErrUnimplemented + iota)
+ ErrRetUnsupported
+ ErrRetInternal
+ ErrRetAlloc
+ ErrRetAssertion
+ ErrRetAPI
+ ErrRetUncaughtError
+)
+
+const (
+ ErrRetError int = -(ErrError + iota)
+ ErrRetEval
+ ErrRetRange
+ ErrRetReference
+ ErrRetSyntax
+ ErrRetType
+ ErrRetURI
+)
+
+const (
+ ExecSuccess = iota
+ ExecError
+)
+
+const (
+ LogTrace int = iota
+ LogDebug
+ LogInfo
+ LogWarn
+ LogError
+ LogFatal
+)
+
+const (
+ BufobjDuktapeAuffer = 0
+ BufobjNodejsAuffer = 1
+ BufobjArraybuffer = 2
+ BufobjDataview = 3
+ BufobjInt8array = 4
+ BufobjUint8array = 5
+ BufobjUint8clampedarray = 6
+ BufobjInt16array = 7
+ BufobjUint16array = 8
+ BufobjInt32array = 9
+ BufobjUint32array = 10
+ BufobjFloat32array = 11
+ BufobjFloat64array = 12
+)
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.c
new file mode 100755
index 000000000..750fa71df
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.c
@@ -0,0 +1,612 @@
+/*
+ * Pool allocator for low memory targets.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include "duktape.h"
+#include "duk_alloc_pool.h"
+
+/* Define to enable some debug printfs. */
+/* #define DUK_ALLOC_POOL_DEBUG */
+
+/* Define to enable approximate waste tracking. */
+/* #define DUK_ALLOC_POOL_TRACK_WASTE */
+
+/* Define to track global highwater for used and waste bytes. VERY SLOW, only
+ * useful for manual testing.
+ */
+/* #define DUK_ALLOC_POOL_TRACK_HIGHWATER */
+
+#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)
+#if 0 /* This extern declaration is provided by duktape.h, array provided by duktape.c. */
+extern const void * const duk_rom_compressed_pointers[];
+#endif
+const void *duk_alloc_pool_romptr_low = NULL;
+const void *duk_alloc_pool_romptr_high = NULL;
+static void duk__alloc_pool_romptr_init(void);
+#endif
+
+#if defined(DUK_USE_HEAPPTR16)
+void *duk_alloc_pool_ptrcomp_base = NULL;
+#endif
+
+#if defined(DUK_ALLOC_POOL_DEBUG)
+static void duk__alloc_pool_dprintf(const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+#endif
+
+/*
+ * Pool initialization
+ */
+
+void *duk_alloc_pool_init(char *buffer,
+ size_t size,
+ const duk_pool_config *configs,
+ duk_pool_state *states,
+ int num_pools,
+ duk_pool_global *global) {
+ double t_min, t_max, t_curr, x;
+ int step, i, j, n;
+ size_t total;
+ char *p;
+
+ /* XXX: check that 'size' is not too large when using pointer
+ * compression.
+ */
+
+ /* To optimize pool counts first come up with a 't' which still allows
+ * total pool size to fit within user provided region. After that
+ * sprinkle any remaining bytes to the counts. Binary search with a
+ * fixed step count; last round uses 't_min' as 't_curr' to ensure it
+ * succeeds.
+ */
+
+ t_min = 0.0; /* Unless config is insane, this should always be "good". */
+ t_max = 1e6;
+
+ for (step = 0; ; step++) {
+ if (step >= 100) {
+ /* Force "known good", rerun config, and break out.
+ * Deals with rounding corner cases where t_curr is
+ * persistently "bad" even though t_min is a valid
+ * solution.
+ */
+ t_curr = t_min;
+ } else {
+ t_curr = (t_min + t_max) / 2.0;
+ }
+
+ for (i = 0, total = 0; i < num_pools; i++) {
+ states[i].size = configs[i].size;
+
+ /* Target bytes = A*t + B ==> target count = (A*t + B) / block_size.
+ * Rely on A and B being small enough so that 'x' won't wrap.
+ */
+ x = ((double) configs[i].a * t_curr + (double) configs[i].b) / (double) configs[i].size;
+
+ states[i].count = (unsigned int) x;
+ total += (size_t) states[i].size * (size_t) states[i].count;
+ if (total > size) {
+ goto bad;
+ }
+ }
+
+ /* t_curr is good. */
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool_init: step=%d, t=[%lf %lf %lf] -> total %ld/%ld (good)\n",
+ step, t_min, t_curr, t_max, (long) total, (long) size);
+#endif
+ if (step >= 100) {
+ /* Keep state[] initialization state. The state was
+ * created using the highest 't_min'.
+ */
+ break;
+ }
+ t_min = t_curr;
+ continue;
+
+ bad:
+ /* t_curr is bad. */
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool_init: step=%d, t=[%lf %lf %lf] -> total %ld/%ld (bad)\n",
+ step, t_min, t_curr, t_max, (long) total, (long) size);
+#endif
+
+ if (step >= 1000) {
+ /* Cannot find any good solution; shouldn't happen
+ * unless config is bad or 'size' is so small that
+ * even a baseline allocation won't fit.
+ */
+ return NULL;
+ }
+ t_max = t_curr;
+ /* continue */
+ }
+
+ /* The base configuration is now good; sprinkle any leftovers to
+ * pools in descending order. Note that for good t_curr, 'total'
+ * indicates allocated bytes so far and 'size - total' indicates
+ * leftovers.
+ */
+ for (i = num_pools - 1; i >= 0; i--) {
+ while (size - total >= states[i].size) {
+ /* Ignore potential wrapping of states[i].count as the count
+ * is 32 bits and shouldn't wrap in practice.
+ */
+ states[i].count++;
+ total += states[i].size;
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool_init: sprinkle %ld bytes (%ld left after) to pool index %ld, new count %ld\n",
+ (long) states[i].size, (long) (size - total), (long) i, (long) states[i].count);
+#endif
+ }
+ }
+
+ /* Pool counts are final. Allocate the user supplied region based
+ * on the final counts, initialize free lists for each block size,
+ * and otherwise finalize 'state' for use.
+ */
+ p = buffer;
+ global->num_pools = num_pools;
+ global->states = states;
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool_init: global highwater mark tracking enabled, THIS IS VERY SLOW!\n");
+#endif
+ global->hwm_used_bytes = 0U;
+ global->hwm_waste_bytes = 0U;
+#endif
+#if defined(DUK_ALLOC_POOL_TRACK_WASTE)
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool_init: approximate waste tracking enabled\n");
+#endif
+#endif
+
+#if defined(DUK_USE_HEAPPTR16)
+ /* Register global base value for pointer compression, assumes
+ * a single active pool -4 allows a single subtract to be used and
+ * still ensures no non-NULL pointer encodes to zero.
+ */
+ duk_alloc_pool_ptrcomp_base = (void *) (p - 4);
+#endif
+
+ for (i = 0; i < num_pools; i++) {
+ n = (int) states[i].count;
+ if (n > 0) {
+ states[i].first = (duk_pool_free *) p;
+ for (j = 0; j < n; j++) {
+ char *p_next = p + states[i].size;
+ ((duk_pool_free *) p)->next =
+ (j == n - 1) ? (duk_pool_free *) NULL : (duk_pool_free *) p_next;
+ p = p_next;
+ }
+ } else {
+ states[i].first = (duk_pool_free *) NULL;
+ }
+ states[i].alloc_end = p;
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+ states[i].hwm_used_count = 0;
+#endif
+ /* All members of 'state' now initialized. */
+
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool_init: block size %5ld, count %5ld, %8ld total bytes, "
+ "end %p\n",
+ (long) states[i].size, (long) states[i].count,
+ (long) states[i].size * (long) states[i].count,
+ (void *) states[i].alloc_end);
+#endif
+ }
+
+#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)
+ /* ROM pointer compression precomputation. Assumes a single active
+ * pool.
+ */
+ duk__alloc_pool_romptr_init();
+#endif
+
+ /* Use 'global' as udata. */
+ return (void *) global;
+}
+
+/*
+ * Misc helpers
+ */
+
+#if defined(DUK_ALLOC_POOL_TRACK_WASTE)
+static void duk__alloc_pool_set_waste_marker(void *ptr, size_t used, size_t size) {
+ /* Rely on the base pointer and size being divisible by 4 and thus
+ * aligned. Use 32-bit markers: a 4-byte resolution is good enough,
+ * and comparing 32 bits at a time makes false waste estimates less
+ * likely than when comparing as bytes.
+ */
+ duk_uint32_t *p, *p_start, *p_end;
+ size_t used_round;
+
+ used_round = (used + 3U) & ~0x03U; /* round up to 4 */
+ p_end = (duk_uint32_t *) ((duk_uint8_t *) ptr + size);
+ p_start = (duk_uint32_t *) ((duk_uint8_t *) ptr + used_round);
+ p = (duk_uint32_t *) p_start;
+ while (p != p_end) {
+ *p++ = DUK_ALLOC_POOL_WASTE_MARKER;
+ }
+}
+#else /* DUK_ALLOC_POOL_TRACK_WASTE */
+static void duk__alloc_pool_set_waste_marker(void *ptr, size_t used, size_t size) {
+ (void) ptr; (void) used; (void) size;
+}
+#endif /* DUK_ALLOC_POOL_TRACK_WASTE */
+
+#if defined(DUK_ALLOC_POOL_TRACK_WASTE)
+static size_t duk__alloc_pool_get_waste_estimate(void *ptr, size_t size) {
+ duk_uint32_t *p, *p_end, *p_start;
+
+ /* Assumes size is >= 4. */
+ p_start = (duk_uint32_t *) ptr;
+ p_end = (duk_uint32_t *) ((duk_uint8_t *) ptr + size);
+ p = p_end;
+
+ /* This scan may cause harmless valgrind complaints: there may be
+ * uninitialized bytes within the legitimate allocation or between
+ * the start of the waste marker and the end of the allocation.
+ */
+ do {
+ p--;
+ if (*p == DUK_ALLOC_POOL_WASTE_MARKER) {
+ ;
+ } else {
+ return (size_t) (p_end - p - 1) * 4U;
+ }
+ } while (p != p_start);
+
+ return size;
+}
+#else /* DUK_ALLOC_POOL_TRACK_WASTE */
+static size_t duk__alloc_pool_get_waste_estimate(void *ptr, size_t size) {
+ (void) ptr; (void) size;
+ return 0;
+}
+#endif /* DUK_ALLOC_POOL_TRACK_WASTE */
+
+static int duk__alloc_pool_ptr_in_freelist(duk_pool_state *s, void *ptr) {
+ duk_pool_free *curr;
+
+ for (curr = s->first; curr != NULL; curr = curr->next) {
+ if ((void *) curr == ptr) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void duk_alloc_pool_get_pool_stats(duk_pool_state *s, duk_pool_stats *res) {
+ void *curr;
+ size_t free_count;
+ size_t used_count;
+ size_t waste_bytes;
+
+ curr = s->alloc_end - (s->size * s->count);
+ free_count = 0U;
+ waste_bytes = 0U;
+ while (curr != s->alloc_end) {
+ if (duk__alloc_pool_ptr_in_freelist(s, curr)) {
+ free_count++;
+ } else {
+ waste_bytes += duk__alloc_pool_get_waste_estimate(curr, s->size);
+ }
+ curr = curr + s->size;
+ }
+ used_count = (size_t) (s->count - free_count);
+
+ res->used_count = used_count;
+ res->used_bytes = (size_t) (used_count * s->size);
+ res->free_count = free_count;
+ res->free_bytes = (size_t) (free_count * s->size);
+ res->waste_bytes = waste_bytes;
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+ res->hwm_used_count = s->hwm_used_count;
+#else
+ res->hwm_used_count = 0U;
+#endif
+}
+
+void duk_alloc_pool_get_global_stats(duk_pool_global *g, duk_pool_global_stats *res) {
+ int i;
+ size_t total_used = 0U;
+ size_t total_free = 0U;
+ size_t total_waste = 0U;
+
+ for (i = 0; i < g->num_pools; i++) {
+ duk_pool_state *s = &g->states[i];
+ duk_pool_stats stats;
+
+ duk_alloc_pool_get_pool_stats(s, &stats);
+
+ total_used += stats.used_bytes;
+ total_free += stats.free_bytes;
+ total_waste += stats.waste_bytes;
+ }
+
+ res->used_bytes = total_used;
+ res->free_bytes = total_free;
+ res->waste_bytes = total_waste;
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+ res->hwm_used_bytes = g->hwm_used_bytes;
+ res->hwm_waste_bytes = g->hwm_waste_bytes;
+#else
+ res->hwm_used_bytes = 0U;
+ res->hwm_waste_bytes = 0U;
+#endif
+}
+
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+static void duk__alloc_pool_update_highwater(duk_pool_global *g) {
+ int i;
+ size_t total_used = 0U;
+ size_t total_free = 0U;
+ size_t total_waste = 0U;
+
+ /* Per pool highwater used count, useful to checking if a pool is
+ * too small.
+ */
+ for (i = 0; i < g->num_pools; i++) {
+ duk_pool_state *s = &g->states[i];
+ duk_pool_stats stats;
+
+ duk_alloc_pool_get_pool_stats(s, &stats);
+ if (stats.used_count > s->hwm_used_count) {
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk__alloc_pool_update_highwater: pool %ld (%ld bytes) highwater updated: count %ld -> %ld\n",
+ (long) i, (long) s->size,
+ (long) s->hwm_used_count, (long) stats.used_count);
+#endif
+ s->hwm_used_count = stats.used_count;
+ }
+
+ total_used += stats.used_bytes;
+ total_free += stats.free_bytes;
+ total_waste += stats.waste_bytes;
+ }
+
+ /* Global highwater mark for used and waste bytes. Both fields are
+ * updated from the same snapshot based on highest used count.
+ * This is VERY, VERY slow and only useful for development.
+ * (Note that updating HWM states for pools individually and then
+ * summing them won't create a consistent global snapshot. There
+ * are still easy ways to make this much, much faster.)
+ */
+ if (total_used > g->hwm_used_bytes) {
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk__alloc_pool_update_highwater: global highwater updated: used=%ld, bytes=%ld -> "
+ "used=%ld, bytes=%ld\n",
+ (long) g->hwm_used_bytes, (long) g->hwm_waste_bytes,
+ (long) total_used, (long) total_waste);
+#endif
+ g->hwm_used_bytes = total_used;
+ g->hwm_waste_bytes = total_waste;
+ }
+}
+#else /* DUK_ALLOC_POOL_TRACK_HIGHWATER */
+static void duk__alloc_pool_update_highwater(duk_pool_global *g) {
+ (void) g;
+}
+#endif /* DUK_ALLOC_POOL_TRACK_HIGHWATER */
+
+/*
+ * Allocation providers
+ */
+
+void *duk_alloc_pool(void *udata, duk_size_t size) {
+ duk_pool_global *g = (duk_pool_global *) udata;
+ int i, n;
+
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_alloc_pool: %p %ld\n", udata, (long) size);
+#endif
+
+ if (size == 0) {
+ return NULL;
+ }
+
+ for (i = 0, n = g->num_pools; i < n; i++) {
+ duk_pool_state *st = g->states + i;
+
+ if (size <= st->size) {
+ duk_pool_free *res = st->first;
+ if (res != NULL) {
+ st->first = res->next;
+ duk__alloc_pool_set_waste_marker((void *) res, size, st->size);
+ duk__alloc_pool_update_highwater(g);
+ return (void *) res;
+ }
+ }
+
+ /* Allocation doesn't fit or no free entries, try to borrow
+ * from the next block size. There's no support for preventing
+ * a borrow at present.
+ */
+ }
+
+ return NULL;
+}
+
+void *duk_realloc_pool(void *udata, void *ptr, duk_size_t size) {
+ duk_pool_global *g = (duk_pool_global *) udata;
+ int i, j, n;
+
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_realloc_pool: %p %p %ld\n", udata, ptr, (long) size);
+#endif
+
+ if (ptr == NULL) {
+ return duk_alloc_pool(udata, size);
+ }
+ if (size == 0) {
+ duk_free_pool(udata, ptr);
+ return NULL;
+ }
+
+ /* Non-NULL pointers are necessarily from the pool so we should
+ * always be able to find the allocation.
+ */
+
+ for (i = 0, n = g->num_pools; i < n; i++) {
+ duk_pool_state *st = g->states + i;
+ char *new_ptr;
+
+ /* Because 'ptr' is assumed to be in the pool and pools are
+ * allocated in sequence, it suffices to check for end pointer
+ * only.
+ */
+ if ((char *) ptr >= st->alloc_end) {
+ continue;
+ }
+
+ if (size <= st->size) {
+ /* Allocation still fits existing allocation. Check if
+ * we can shrink the allocation to a smaller block size
+ * (smallest possible).
+ */
+ for (j = 0; j < i; j++) {
+ duk_pool_state *st2 = g->states + j;
+
+ if (size <= st2->size) {
+ new_ptr = (char *) st2->first;
+ if (new_ptr != NULL) {
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_realloc_pool: shrink, block size %ld -> %ld\n",
+ (long) st->size, (long) st2->size);
+#endif
+ st2->first = ((duk_pool_free *) new_ptr)->next;
+ memcpy((void *) new_ptr, (const void *) ptr, (size_t) size);
+ ((duk_pool_free *) ptr)->next = st->first;
+ st->first = (duk_pool_free *) ptr;
+ duk__alloc_pool_set_waste_marker((void *) new_ptr, size, st2->size);
+ duk__alloc_pool_update_highwater(g);
+ return (void *) new_ptr;
+ }
+ }
+ }
+
+ /* Failed to shrink; return existing pointer. */
+ duk__alloc_pool_set_waste_marker((void *) ptr, size, st->size);
+ return ptr;
+ }
+
+ /* Find first free larger block. */
+ for (j = i + 1; j < n; j++) {
+ duk_pool_state *st2 = g->states + j;
+
+ if (size <= st2->size) {
+ new_ptr = (char *) st2->first;
+ if (new_ptr != NULL) {
+ st2->first = ((duk_pool_free *) new_ptr)->next;
+ memcpy((void *) new_ptr, (const void *) ptr, (size_t) st->size);
+ ((duk_pool_free *) ptr)->next = st->first;
+ st->first = (duk_pool_free *) ptr;
+ duk__alloc_pool_set_waste_marker((void *) new_ptr, size, st2->size);
+ duk__alloc_pool_update_highwater(g);
+ return (void *) new_ptr;
+ }
+ }
+ }
+
+ /* Failed to resize. */
+ return NULL;
+ }
+
+ /* We should never be here because 'ptr' should be a valid pool
+ * entry and thus always found above.
+ */
+ return NULL;
+}
+
+void duk_free_pool(void *udata, void *ptr) {
+ duk_pool_global *g = (duk_pool_global *) udata;
+ int i, n;
+
+#if defined(DUK_ALLOC_POOL_DEBUG)
+ duk__alloc_pool_dprintf("duk_free_pool: %p %p\n", udata, ptr);
+#endif
+
+ if (ptr == NULL) {
+ return;
+ }
+
+ for (i = 0, n = g->num_pools; i < n; i++) {
+ duk_pool_state *st = g->states + i;
+
+ /* Enough to check end address only. */
+ if ((char *) ptr >= st->alloc_end) {
+ continue;
+ }
+
+ ((duk_pool_free *) ptr)->next = st->first;
+ st->first = (duk_pool_free *) ptr;
+#if 0 /* never necessary when freeing */
+ duk__alloc_pool_update_highwater(g);
+#endif
+ return;
+ }
+
+ /* We should never be here because 'ptr' should be a valid pool
+ * entry and thus always found above.
+ */
+}
+
+/*
+ * Pointer compression
+ */
+
+#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)
+static void duk__alloc_pool_romptr_init(void) {
+ /* Scan ROM pointer range for faster detection of "is 'p' a ROM pointer"
+ * later on.
+ */
+ const void * const * ptrs = (const void * const *) duk_rom_compressed_pointers;
+ duk_alloc_pool_romptr_low = duk_alloc_pool_romptr_high = (const void *) *ptrs;
+ while (*ptrs) {
+ if (*ptrs > duk_alloc_pool_romptr_high) {
+ duk_alloc_pool_romptr_high = (const void *) *ptrs;
+ }
+ if (*ptrs < duk_alloc_pool_romptr_low) {
+ duk_alloc_pool_romptr_low = (const void *) *ptrs;
+ }
+ ptrs++;
+ }
+}
+#endif
+
+/* Encode/decode functions are defined in the header to allow inlining. */
+
+#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)
+duk_uint16_t duk_alloc_pool_enc16_rom(void *ptr) {
+ /* The if-condition should be the fastest possible check
+ * for "is 'ptr' in ROM?". If pointer is in ROM, we'd like
+ * to compress it quickly. Here we just scan a ~1K array
+ * which is very bad for performance.
+ */
+ const void * const * ptrs = duk_rom_compressed_pointers;
+ while (*ptrs) {
+ if (*ptrs == ptr) {
+ return DUK_ALLOC_POOL_ROMPTR_FIRST + (duk_uint16_t) (ptrs - duk_rom_compressed_pointers);
+ }
+ ptrs++;
+ }
+
+ /* We should really never be here: Duktape should only be
+ * compressing pointers which are in the ROM compressed
+ * pointers list, which are known at 'make dist' time.
+ * We go on, causing a pointer compression error.
+ */
+ return 0;
+}
+#endif
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.h
new file mode 100755
index 000000000..286ec0166
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.h
@@ -0,0 +1,223 @@
+#if !defined(DUK_ALLOC_POOL_H_INCLUDED)
+#define DUK_ALLOC_POOL_H_INCLUDED
+
+#include "duktape.h"
+
+/* 32-bit (big endian) marker used at the end of pool entries so that wasted
+ * space can be detected. Waste tracking must be enabled explicitly.
+ */
+#if defined(DUK_ALLOC_POOL_TRACK_WASTE)
+#define DUK_ALLOC_POOL_WASTE_MARKER 0xedcb2345UL
+#endif
+
+/* Pointer compression with ROM strings/objects:
+ *
+ * For now, use DUK_USE_ROM_OBJECTS to signal the need for compressed ROM
+ * pointers. DUK_USE_ROM_PTRCOMP_FIRST is provided for the ROM pointer
+ * compression range minimum to avoid duplication in user code.
+ */
+#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16)
+#define DUK_ALLOC_POOL_ROMPTR_COMPRESSION
+#define DUK_ALLOC_POOL_ROMPTR_FIRST DUK_USE_ROM_PTRCOMP_FIRST
+
+/* This extern declaration is provided by duktape.h, array provided by duktape.c.
+ * Because duk_config.h may include this file (to get the inline functions) we
+ * need to forward declare this also here.
+ */
+extern const void * const duk_rom_compressed_pointers[];
+#endif
+
+/* Pool configuration for a certain block size. */
+typedef struct {
+ unsigned int size; /* must be divisible by 4 and >= sizeof(void *) */
+ unsigned int a; /* bytes (not count) to allocate: a*t + b, t is an arbitrary scale parameter */
+ unsigned int b;
+} duk_pool_config;
+
+/* Freelist entry, must fit into the smallest block size. */
+struct duk_pool_free;
+typedef struct duk_pool_free duk_pool_free;
+struct duk_pool_free {
+ duk_pool_free *next;
+};
+
+/* Pool state for a certain block size. */
+typedef struct {
+ duk_pool_free *first;
+ char *alloc_end;
+ unsigned int size;
+ unsigned int count;
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+ unsigned int hwm_used_count;
+#endif
+} duk_pool_state;
+
+/* Statistics for a certain pool. */
+typedef struct {
+ size_t used_count;
+ size_t used_bytes;
+ size_t free_count;
+ size_t free_bytes;
+ size_t waste_bytes;
+ size_t hwm_used_count;
+} duk_pool_stats;
+
+/* Top level state for all pools. Pointer to this struct is used as the allocator
+ * userdata pointer.
+ */
+typedef struct {
+ int num_pools;
+ duk_pool_state *states;
+#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)
+ size_t hwm_used_bytes;
+ size_t hwm_waste_bytes;
+#endif
+} duk_pool_global;
+
+/* Statistics for the entire set of pools. */
+typedef struct {
+ size_t used_bytes;
+ size_t free_bytes;
+ size_t waste_bytes;
+ size_t hwm_used_bytes;
+ size_t hwm_waste_bytes;
+} duk_pool_global_stats;
+
+/* Initialize a pool allocator, arguments:
+ * - buffer and size: continuous region to use for pool, must align to 4
+ * - config: configuration for pools in ascending block size
+ * - state: state for pools, matches config order
+ * - num_pools: number of entries in 'config' and 'state'
+ * - global: global state structure
+ *
+ * The 'config', 'state', and 'global' pointers must be valid beyond the init
+ * call, as long as the pool is used.
+ *
+ * Returns a void pointer to be used as userdata for the allocator functions.
+ * Concretely the return value will be "(void *) global", i.e. the global
+ * state struct. If pool init fails, the return value will be NULL.
+ */
+void *duk_alloc_pool_init(char *buffer,
+ size_t size,
+ const duk_pool_config *configs,
+ duk_pool_state *states,
+ int num_pools,
+ duk_pool_global *global);
+
+/* Duktape allocation providers. Typing matches Duktape requirements. */
+void *duk_alloc_pool(void *udata, duk_size_t size);
+void *duk_realloc_pool(void *udata, void *ptr, duk_size_t size);
+void duk_free_pool(void *udata, void *ptr);
+
+/* Stats. */
+void duk_alloc_pool_get_pool_stats(duk_pool_state *s, duk_pool_stats *res);
+void duk_alloc_pool_get_global_stats(duk_pool_global *g, duk_pool_global_stats *res);
+
+/* Duktape pointer compression global state (assumes single pool). */
+#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16)
+extern const void *duk_alloc_pool_romptr_low;
+extern const void *duk_alloc_pool_romptr_high;
+duk_uint16_t duk_alloc_pool_enc16_rom(void *ptr);
+#endif
+#if defined(DUK_USE_HEAPPTR16)
+extern void *duk_alloc_pool_ptrcomp_base;
+#endif
+
+#if 0
+duk_uint16_t duk_alloc_pool_enc16(void *ptr);
+void *duk_alloc_pool_dec16(duk_uint16_t val);
+#endif
+
+/* Inlined pointer compression functions. Gcc and clang -Os won't in
+ * practice inline these without an "always inline" attribute because it's
+ * more size efficient (by a few kB) to use explicit calls instead. Having
+ * these defined inline here allows performance optimized builds to inline
+ * pointer compression operations.
+ *
+ * Pointer compression assumes there's a single globally registered memory
+ * pool which makes pointer compression more efficient. This would be easy
+ * to fix by adding a userdata pointer to the compression functions and
+ * plumbing the heap userdata from the compression/decompression macros.
+ */
+
+/* DUK_ALWAYS_INLINE is not a public API symbol so it may go away in even a
+ * minor update. But it's pragmatic for this extra because it handles many
+ * compilers via duk_config.h detection. Check that the macro exists so that
+ * if it's gone, we can still compile.
+ */
+#if defined(DUK_ALWAYS_INLINE)
+#define DUK__ALLOC_POOL_ALWAYS_INLINE DUK_ALWAYS_INLINE
+#else
+#define DUK__ALLOC_POOL_ALWAYS_INLINE /* nop */
+#endif
+
+#if defined(DUK_USE_HEAPPTR16)
+static DUK__ALLOC_POOL_ALWAYS_INLINE duk_uint16_t duk_alloc_pool_enc16(void *ptr) {
+ if (ptr == NULL) {
+ /* With 'return 0' gcc and clang -Os generate inefficient code.
+ * For example, gcc -Os generates:
+ *
+ * 0804911d <duk_alloc_pool_enc16>:
+ * 804911d: 55 push %ebp
+ * 804911e: 85 c0 test %eax,%eax
+ * 8049120: 89 e5 mov %esp,%ebp
+ * 8049122: 74 0b je 804912f <duk_alloc_pool_enc16+0x12>
+ * 8049124: 2b 05 e4 90 07 08 sub 0x80790e4,%eax
+ * 804912a: c1 e8 02 shr $0x2,%eax
+ * 804912d: eb 02 jmp 8049131 <duk_alloc_pool_enc16+0x14>
+ * 804912f: 31 c0 xor %eax,%eax
+ * 8049131: 5d pop %ebp
+ * 8049132: c3 ret
+ *
+ * The NULL path checks %eax for zero; if it is zero, a zero
+ * is unnecessarily loaded into %eax again. The non-zero path
+ * has an unnecessary jump as a side effect of this.
+ *
+ * Using 'return (duk_uint16_t) (intptr_t) ptr;' generates similarly
+ * inefficient code; not sure how to make the result better.
+ */
+ return 0;
+ }
+#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)
+ if (ptr >= duk_alloc_pool_romptr_low && ptr <= duk_alloc_pool_romptr_high) {
+ /* This is complex enough now to need a separate function. */
+ return duk_alloc_pool_enc16_rom(ptr);
+ }
+#endif
+ return (duk_uint16_t) (((size_t) ((char *) ptr - (char *) duk_alloc_pool_ptrcomp_base)) >> 2);
+}
+
+static DUK__ALLOC_POOL_ALWAYS_INLINE void *duk_alloc_pool_dec16(duk_uint16_t val) {
+ if (val == 0) {
+ /* As with enc16 the gcc and clang -Os output is inefficient,
+ * e.g. gcc -Os:
+ *
+ * 08049133 <duk_alloc_pool_dec16>:
+ * 8049133: 55 push %ebp
+ * 8049134: 66 85 c0 test %ax,%ax
+ * 8049137: 89 e5 mov %esp,%ebp
+ * 8049139: 74 0e je 8049149 <duk_alloc_pool_dec16+0x16>
+ * 804913b: 8b 15 e4 90 07 08 mov 0x80790e4,%edx
+ * 8049141: 0f b7 c0 movzwl %ax,%eax
+ * 8049144: 8d 04 82 lea (%edx,%eax,4),%eax
+ * 8049147: eb 02 jmp 804914b <duk_alloc_pool_dec16+0x18>
+ * 8049149: 31 c0 xor %eax,%eax
+ * 804914b: 5d pop %ebp
+ * 804914c: c3 ret
+ */
+ return NULL;
+ }
+#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)
+ if (val >= DUK_ALLOC_POOL_ROMPTR_FIRST) {
+ /* This is a blind lookup, could check index validity.
+ * Duktape should never decompress a pointer which would
+ * be out-of-bounds here.
+ */
+ return (void *) (intptr_t) (duk_rom_compressed_pointers[val - DUK_ALLOC_POOL_ROMPTR_FIRST]);
+ }
+#endif
+ return (void *) ((char *) duk_alloc_pool_ptrcomp_base + (((size_t) val) << 2));
+}
+#endif
+
+#endif /* DUK_ALLOC_POOL_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_config.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_config.h
new file mode 100755
index 000000000..3f217ef7d
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_config.h
@@ -0,0 +1,3672 @@
+/*
+ * duk_config.h configuration header generated by genconfig.py.
+ *
+ * Git commit: a459cf3c9bd1779fc01b435d69302b742675a08f
+ * Git describe: v2.2.0
+ * Git branch: master
+ *
+ * Supported platforms:
+ * - Mac OSX, iPhone, Darwin
+ * - Orbis
+ * - OpenBSD
+ * - Generic BSD
+ * - Atari ST TOS
+ * - AmigaOS
+ * - Durango (XboxOne)
+ * - Windows
+ * - Flashplayer (Crossbridge)
+ * - QNX
+ * - TI-Nspire
+ * - Emscripten
+ * - Linux
+ * - Solaris
+ * - AIX
+ * - HPUX
+ * - Generic POSIX
+ * - Cygwin
+ * - Generic UNIX
+ * - Generic fallback
+ *
+ * Supported architectures:
+ * - x86
+ * - x64
+ * - x32
+ * - ARM 32-bit
+ * - ARM 64-bit
+ * - MIPS 32-bit
+ * - MIPS 64-bit
+ * - PowerPC 32-bit
+ * - PowerPC 64-bit
+ * - SPARC 32-bit
+ * - SPARC 64-bit
+ * - SuperH
+ * - Motorola 68k
+ * - Emscripten
+ * - Generic
+ *
+ * Supported compilers:
+ * - Clang
+ * - GCC
+ * - MSVC
+ * - Emscripten
+ * - TinyC
+ * - VBCC
+ * - Bruce's C compiler
+ * - Generic
+ *
+ */
+
+#if !defined(DUK_CONFIG_H_INCLUDED)
+#define DUK_CONFIG_H_INCLUDED
+
+/*
+ * Intermediate helper defines
+ */
+
+/* DLL build detection */
+/* not configured for DLL build */
+#undef DUK_F_DLL_BUILD
+
+/* Apple OSX, iOS */
+#if defined(__APPLE__)
+#define DUK_F_APPLE
+#endif
+
+/* FreeBSD */
+#if defined(__FreeBSD__) || defined(__FreeBSD)
+#define DUK_F_FREEBSD
+#endif
+
+/* Orbis (PS4) variant */
+#if defined(DUK_F_FREEBSD) && defined(__ORBIS__)
+#define DUK_F_ORBIS
+#endif
+
+/* OpenBSD */
+#if defined(__OpenBSD__) || defined(__OpenBSD)
+#define DUK_F_OPENBSD
+#endif
+
+/* NetBSD */
+#if defined(__NetBSD__) || defined(__NetBSD)
+#define DUK_F_NETBSD
+#endif
+
+/* BSD variant */
+#if defined(DUK_F_FREEBSD) || defined(DUK_F_NETBSD) || defined(DUK_F_OPENBSD) || \
+ defined(__bsdi__) || defined(__DragonFly__)
+#define DUK_F_BSD
+#endif
+
+/* Atari ST TOS. __TOS__ defined by PureC. No platform define in VBCC
+ * apparently, so to use with VBCC user must define __TOS__ manually.
+ */
+#if defined(__TOS__)
+#define DUK_F_TOS
+#endif
+
+/* Motorola 68K. Not defined by VBCC, so user must define one of these
+ * manually when using VBCC.
+ */
+#if defined(__m68k__) || defined(M68000) || defined(__MC68K__)
+#define DUK_F_M68K
+#endif
+
+/* AmigaOS. Neither AMIGA nor __amigaos__ is defined on VBCC, so user must
+ * define 'AMIGA' manually when using VBCC.
+ */
+#if defined(AMIGA) || defined(__amigaos__)
+#define DUK_F_AMIGAOS
+#endif
+
+/* PowerPC */
+#if defined(__powerpc) || defined(__powerpc__) || defined(__PPC__)
+#define DUK_F_PPC
+#if defined(__PPC64__) || defined(__LP64__) || defined(_LP64)
+#define DUK_F_PPC64
+#else
+#define DUK_F_PPC32
+#endif
+#endif
+
+/* Durango (Xbox One) */
+#if defined(_DURANGO) || defined(_XBOX_ONE)
+#define DUK_F_DURANGO
+#endif
+
+/* Windows, both 32-bit and 64-bit */
+#if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64) || \
+ defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__)
+#define DUK_F_WINDOWS
+#if defined(_WIN64) || defined(WIN64)
+#define DUK_F_WIN64
+#else
+#define DUK_F_WIN32
+#endif
+#endif
+
+/* Flash player (e.g. Crossbridge) */
+#if defined(__FLASHPLAYER__)
+#define DUK_F_FLASHPLAYER
+#endif
+
+/* QNX */
+#if defined(__QNX__)
+#define DUK_F_QNX
+#endif
+
+/* TI-Nspire (using Ndless) */
+#if defined(_TINSPIRE)
+#define DUK_F_TINSPIRE
+#endif
+
+/* Emscripten (provided explicitly by user), improve if possible */
+#if defined(EMSCRIPTEN)
+#define DUK_F_EMSCRIPTEN
+#endif
+
+/* BCC (Bruce's C compiler): this is a "torture target" for compilation */
+#if defined(__BCC__) || defined(__BCC_VERSION__)
+#define DUK_F_BCC
+#endif
+
+/* Linux */
+#if defined(__linux) || defined(__linux__) || defined(linux)
+#define DUK_F_LINUX
+#endif
+
+/* illumos / Solaris */
+#if defined(__sun) && defined(__SVR4)
+#define DUK_F_SUN
+#if defined(__SUNPRO_C) && (__SUNPRO_C < 0x550)
+#define DUK_F_OLD_SOLARIS
+/* Defines _ILP32 / _LP64 required by DUK_F_X86/DUK_F_X64. Platforms
+ * are processed before architectures, so this happens before the
+ * DUK_F_X86/DUK_F_X64 detection is emitted.
+ */
+#include <sys/isa_defs.h>
+#endif
+#endif
+
+/* AIX */
+#if defined(_AIX)
+/* defined(__xlc__) || defined(__IBMC__): works but too wide */
+#define DUK_F_AIX
+#endif
+
+/* HPUX */
+#if defined(__hpux)
+#define DUK_F_HPUX
+#if defined(__ia64)
+#define DUK_F_HPUX_ITANIUM
+#endif
+#endif
+
+/* POSIX */
+#if defined(__posix)
+#define DUK_F_POSIX
+#endif
+
+/* Cygwin */
+#if defined(__CYGWIN__)
+#define DUK_F_CYGWIN
+#endif
+
+/* Generic Unix (includes Cygwin) */
+#if defined(__unix) || defined(__unix__) || defined(unix) || \
+ defined(DUK_F_LINUX) || defined(DUK_F_BSD)
+#define DUK_F_UNIX
+#endif
+
+/* C++ */
+#undef DUK_F_CPP
+#if defined(__cplusplus)
+#define DUK_F_CPP
+#endif
+
+/* Intel x86 (32-bit), x64 (64-bit) or x32 (64-bit but 32-bit pointers),
+ * define only one of DUK_F_X86, DUK_F_X64, DUK_F_X32.
+ * https://sites.google.com/site/x32abi/
+ *
+ * With DUK_F_OLD_SOLARIS the <sys/isa_defs.h> header must be included
+ * before this.
+ */
+#if defined(__amd64__) || defined(__amd64) || \
+ defined(__x86_64__) || defined(__x86_64) || \
+ defined(_M_X64) || defined(_M_AMD64)
+#if defined(__ILP32__) || defined(_ILP32)
+#define DUK_F_X32
+#else
+#define DUK_F_X64
+#endif
+#elif defined(i386) || defined(__i386) || defined(__i386__) || \
+ defined(__i486__) || defined(__i586__) || defined(__i686__) || \
+ defined(__IA32__) || defined(_M_IX86) || defined(__X86__) || \
+ defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__)
+#if defined(__LP64__) || defined(_LP64)
+/* This should not really happen, but would indicate x64. */
+#define DUK_F_X64
+#else
+#define DUK_F_X86
+#endif
+#endif
+
+/* ARM */
+#if defined(__arm__) || defined(__thumb__) || defined(_ARM) || defined(_M_ARM) || defined(__aarch64__)
+#define DUK_F_ARM
+#if defined(__LP64__) || defined(_LP64) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__)
+#define DUK_F_ARM64
+#else
+#define DUK_F_ARM32
+#endif
+#endif
+
+/* MIPS. Related defines: __MIPSEB__, __MIPSEL__, __mips_isa_rev, __LP64__ */
+#if defined(__mips__) || defined(mips) || defined(_MIPS_ISA) || \
+ defined(_R3000) || defined(_R4000) || defined(_R5900) || \
+ defined(_MIPS_ISA_MIPS1) || defined(_MIPS_ISA_MIPS2) || \
+ defined(_MIPS_ISA_MIPS3) || defined(_MIPS_ISA_MIPS4) || \
+ defined(__mips) || defined(__MIPS__)
+#define DUK_F_MIPS
+#if defined(__LP64__) || defined(_LP64) || defined(__mips64) || \
+ defined(__mips64__) || defined(__mips_n64)
+#define DUK_F_MIPS64
+#else
+#define DUK_F_MIPS32
+#endif
+#endif
+
+/* SPARC */
+#if defined(sparc) || defined(__sparc) || defined(__sparc__)
+#define DUK_F_SPARC
+#if defined(__LP64__) || defined(_LP64)
+#define DUK_F_SPARC64
+#else
+#define DUK_F_SPARC32
+#endif
+#endif
+
+/* SuperH */
+#if defined(__sh__) || \
+ defined(__sh1__) || defined(__SH1__) || \
+ defined(__sh2__) || defined(__SH2__) || \
+ defined(__sh3__) || defined(__SH3__) || \
+ defined(__sh4__) || defined(__SH4__) || \
+ defined(__sh5__) || defined(__SH5__)
+#define DUK_F_SUPERH
+#endif
+
+/* Clang */
+#if defined(__clang__)
+#define DUK_F_CLANG
+#endif
+
+/* C99 or above */
+#undef DUK_F_C99
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
+#define DUK_F_C99
+#endif
+
+/* C++11 or above */
+#undef DUK_F_CPP11
+#if defined(__cplusplus) && (__cplusplus >= 201103L)
+#define DUK_F_CPP11
+#endif
+
+/* GCC. Clang also defines __GNUC__ so don't detect GCC if using Clang. */
+#if defined(__GNUC__) && !defined(__clang__) && !defined(DUK_F_CLANG)
+#define DUK_F_GCC
+#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
+/* Convenience, e.g. gcc 4.5.1 == 40501; http://stackoverflow.com/questions/6031819/emulating-gccs-builtin-unreachable */
+#define DUK_F_GCC_VERSION (__GNUC__ * 10000L + __GNUC_MINOR__ * 100L + __GNUC_PATCHLEVEL__)
+#else
+#error cannot figure out gcc version
+#endif
+#endif
+
+/* MinGW. Also GCC flags (DUK_F_GCC) are enabled now. */
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#define DUK_F_MINGW
+#endif
+
+/* MSVC */
+#if defined(_MSC_VER)
+/* MSVC preprocessor defines: http://msdn.microsoft.com/en-us/library/b0084kay.aspx
+ * _MSC_FULL_VER includes the build number, but it has at least two formats, see e.g.
+ * BOOST_MSVC_FULL_VER in http://www.boost.org/doc/libs/1_52_0/boost/config/compiler/visualc.hpp
+ */
+#define DUK_F_MSVC
+#if defined(_MSC_FULL_VER)
+#if (_MSC_FULL_VER > 100000000)
+#define DUK_F_MSVC_FULL_VER _MSC_FULL_VER
+#else
+#define DUK_F_MSCV_FULL_VER (_MSC_FULL_VER * 10)
+#endif
+#endif
+#endif /* _MSC_VER */
+
+/* TinyC */
+#if defined(__TINYC__)
+/* http://bellard.org/tcc/tcc-doc.html#SEC9 */
+#define DUK_F_TINYC
+#endif
+
+/* VBCC */
+#if defined(__VBCC__)
+#define DUK_F_VBCC
+#endif
+
+#if defined(ANDROID) || defined(__ANDROID__)
+#define DUK_F_ANDROID
+#endif
+
+/* Atari Mint */
+#if defined(__MINT__)
+#define DUK_F_MINT
+#endif
+
+/*
+ * Platform autodetection
+ */
+
+/* Workaround for older C++ compilers before including <inttypes.h>,
+ * see e.g.: https://sourceware.org/bugzilla/show_bug.cgi?id=15366
+ */
+#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)
+#define __STDC_LIMIT_MACROS
+#endif
+#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)
+#define __STDC_CONSTANT_MACROS
+#endif
+
+#if defined(DUK_F_APPLE)
+/* --- Mac OSX, iPhone, Darwin --- */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <TargetConditionals.h>
+#include <architecture/byte_order.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+/* http://stackoverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor */
+#if TARGET_IPHONE_SIMULATOR
+#define DUK_USE_OS_STRING "iphone-sim"
+#elif TARGET_OS_IPHONE
+#define DUK_USE_OS_STRING "iphone"
+#elif TARGET_OS_MAC
+#define DUK_USE_OS_STRING "osx"
+#else
+#define DUK_USE_OS_STRING "osx-unknown"
+#endif
+
+/* Use _setjmp() on Apple by default, see GH-55. */
+#define DUK_JMPBUF_TYPE jmp_buf
+#define DUK_SETJMP(jb) _setjmp((jb))
+#define DUK_LONGJMP(jb) _longjmp((jb), 1)
+#elif defined(DUK_F_ORBIS)
+/* --- Orbis --- */
+/* Orbis = PS4 */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_S
+/* no parsing (not an error) */
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <machine/endian.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "orbis"
+#elif defined(DUK_F_OPENBSD)
+/* --- OpenBSD --- */
+/* http://www.monkey.org/openbsd/archive/ports/0401/msg00089.html */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <sys/endian.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "openbsd"
+#elif defined(DUK_F_BSD)
+/* --- Generic BSD --- */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <sys/endian.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "bsd"
+#elif defined(DUK_F_TOS)
+/* --- Atari ST TOS --- */
+#define DUK_USE_DATE_NOW_TIME
+#define DUK_USE_DATE_TZO_GMTIME
+/* no parsing (not an error) */
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <time.h>
+
+#define DUK_USE_OS_STRING "tos"
+
+/* TOS on M68K is always big endian. */
+#if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_M68K)
+#define DUK_USE_BYTEORDER 3
+#endif
+#elif defined(DUK_F_AMIGAOS)
+/* --- AmigaOS --- */
+#if defined(DUK_F_M68K)
+/* AmigaOS on M68k */
+#define DUK_USE_DATE_NOW_TIME
+#define DUK_USE_DATE_TZO_GMTIME
+/* no parsing (not an error) */
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <time.h>
+#elif defined(DUK_F_PPC)
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <time.h>
+#if !defined(UINTPTR_MAX)
+#define UINTPTR_MAX UINT_MAX
+#endif
+#else
+#error AmigaOS but not M68K/PPC, not supported now
+#endif
+
+#define DUK_USE_OS_STRING "amigaos"
+
+/* AmigaOS on M68K or PPC is always big endian. */
+#if !defined(DUK_USE_BYTEORDER) && (defined(DUK_F_M68K) || defined(DUK_F_PPC))
+#define DUK_USE_BYTEORDER 3
+#endif
+#elif defined(DUK_F_DURANGO)
+/* --- Durango (XboxOne) --- */
+/* Durango = XboxOne
+ * Configuration is nearly identical to Windows, except for
+ * DUK_USE_DATE_TZO_WINDOWS.
+ */
+
+/* Initial fix: disable secure CRT related warnings when compiling Duktape
+ * itself (must be defined before including Windows headers). Don't define
+ * for user code including duktape.h.
+ */
+#if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS)
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+/* MSVC does not have sys/param.h */
+#define DUK_USE_DATE_NOW_WINDOWS
+#define DUK_USE_DATE_TZO_WINDOWS_NO_DST
+/* Note: PRS and FMT are intentionally left undefined for now. This means
+ * there is no platform specific date parsing/formatting but there is still
+ * the ISO 8601 standard format.
+ */
+#if defined(DUK_COMPILING_DUKTAPE)
+/* Only include when compiling Duktape to avoid polluting application build
+ * with a lot of unnecessary defines.
+ */
+#include <windows.h>
+#endif
+
+#define DUK_USE_OS_STRING "durango"
+
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+#elif defined(DUK_F_WINDOWS)
+/* --- Windows --- */
+/* Windows version can't obviously be determined at compile time,
+ * but _WIN32_WINNT indicates the minimum version targeted:
+ * - https://msdn.microsoft.com/en-us/library/6sehtctf.aspx
+ */
+
+/* Initial fix: disable secure CRT related warnings when compiling Duktape
+ * itself (must be defined before including Windows headers). Don't define
+ * for user code including duktape.h.
+ */
+#if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS)
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+/* Windows 32-bit and 64-bit are currently the same. */
+/* MSVC does not have sys/param.h */
+
+#if defined(DUK_COMPILING_DUKTAPE)
+/* Only include when compiling Duktape to avoid polluting application build
+ * with a lot of unnecessary defines.
+ */
+#include <windows.h>
+#endif
+
+/* GetSystemTimePreciseAsFileTime() available from Windows 8:
+ * https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx
+ */
+#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) || defined(DUK_USE_DATE_NOW_WINDOWS)
+/* User forced provider. */
+#else
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)
+#define DUK_USE_DATE_NOW_WINDOWS_SUBMS
+#else
+#define DUK_USE_DATE_NOW_WINDOWS
+#endif
+#endif
+
+#define DUK_USE_DATE_TZO_WINDOWS
+
+/* Note: PRS and FMT are intentionally left undefined for now. This means
+ * there is no platform specific date parsing/formatting but there is still
+ * the ISO 8601 standard format.
+ */
+
+/* QueryPerformanceCounter() may go backwards in Windows XP, so enable for
+ * Vista and later: https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions
+ */
+#if !defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) && \
+ defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+#define DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC
+#endif
+
+#define DUK_USE_OS_STRING "windows"
+
+/* On Windows, assume we're little endian. Even Itanium which has a
+ * configurable endianness runs little endian in Windows.
+ */
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+#elif defined(DUK_F_FLASHPLAYER)
+/* --- Flashplayer (Crossbridge) --- */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <endian.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "flashplayer"
+
+#if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_FLASHPLAYER)
+#define DUK_USE_BYTEORDER 1
+#endif
+#elif defined(DUK_F_QNX)
+/* --- QNX --- */
+#if defined(DUK_F_QNX) && defined(DUK_COMPILING_DUKTAPE)
+/* See: /opt/qnx650/target/qnx6/usr/include/sys/platform.h */
+#define _XOPEN_SOURCE 600
+#define _POSIX_C_SOURCE 200112L
+#endif
+
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "qnx"
+#elif defined(DUK_F_TINSPIRE)
+/* --- TI-Nspire --- */
+#if defined(DUK_COMPILING_DUKTAPE) && !defined(_XOPEN_SOURCE)
+#define _XOPEN_SOURCE /* e.g. strptime */
+#endif
+
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "tinspire"
+#elif defined(DUK_F_EMSCRIPTEN)
+/* --- Emscripten --- */
+#if defined(DUK_COMPILING_DUKTAPE)
+#if !defined(_POSIX_C_SOURCE)
+#define _POSIX_C_SOURCE 200809L
+#endif
+#if !defined(_GNU_SOURCE)
+#define _GNU_SOURCE /* e.g. getdate_r */
+#endif
+#if !defined(_XOPEN_SOURCE)
+#define _XOPEN_SOURCE /* e.g. strptime */
+#endif
+#endif /* DUK_COMPILING_DUKTAPE */
+
+#include <sys/types.h>
+#if defined(DUK_F_BCC)
+/* no endian.h */
+#else
+#include <endian.h>
+#endif /* DUK_F_BCC */
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+#include <stdint.h>
+
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+
+#define DUK_USE_OS_STRING "emscripten"
+#elif defined(DUK_F_LINUX)
+/* --- Linux --- */
+#if defined(DUK_COMPILING_DUKTAPE)
+#if !defined(_POSIX_C_SOURCE)
+#define _POSIX_C_SOURCE 200809L
+#endif
+#if !defined(_GNU_SOURCE)
+#define _GNU_SOURCE /* e.g. getdate_r */
+#endif
+#if !defined(_XOPEN_SOURCE)
+#define _XOPEN_SOURCE /* e.g. strptime */
+#endif
+#endif /* DUK_COMPILING_DUKTAPE */
+
+#include <sys/types.h>
+#if defined(DUK_F_BCC)
+/* no endian.h or stdint.h */
+#else
+#include <endian.h>
+#include <stdint.h>
+#endif /* DUK_F_BCC */
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+
+#if 0 /* XXX: safe condition? */
+#define DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME
+#endif
+
+#define DUK_USE_OS_STRING "linux"
+#elif defined(DUK_F_SUN)
+/* --- Solaris --- */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+
+#include <sys/types.h>
+#if defined(DUK_F_OLD_SOLARIS)
+/* Old Solaris with no endian.h, stdint.h */
+#define DUK_F_NO_STDINT_H
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 3
+#endif
+#else /* DUK_F_OLD_SOLARIS */
+#include <ast/endian.h>
+#endif /* DUK_F_OLD_SOLARIS */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "solaris"
+#elif defined(DUK_F_AIX)
+/* --- AIX --- */
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 3
+#endif
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "aix"
+#elif defined(DUK_F_HPUX)
+/* --- HPUX --- */
+#define DUK_F_NO_STDINT_H
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 3
+#endif
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "hpux"
+#elif defined(DUK_F_POSIX)
+/* --- Generic POSIX --- */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <endian.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_USE_OS_STRING "posix"
+#elif defined(DUK_F_CYGWIN)
+/* --- Cygwin --- */
+/* don't use strptime() for now */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <sys/types.h>
+#include <endian.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define DUK_JMPBUF_TYPE jmp_buf
+#define DUK_SETJMP(jb) _setjmp((jb))
+#define DUK_LONGJMP(jb) _longjmp((jb), 1)
+
+#define DUK_USE_OS_STRING "windows"
+#elif defined(DUK_F_UNIX)
+/* --- Generic UNIX --- */
+#define DUK_USE_DATE_NOW_GETTIMEOFDAY
+#define DUK_USE_DATE_TZO_GMTIME_R
+#define DUK_USE_DATE_PRS_STRPTIME
+#define DUK_USE_DATE_FMT_STRFTIME
+#include <time.h>
+#include <sys/time.h>
+#define DUK_USE_OS_STRING "unknown"
+#else
+/* --- Generic fallback --- */
+/* The most portable current time provider is time(), but it only has a
+ * one second resolution.
+ */
+#define DUK_USE_DATE_NOW_TIME
+
+/* The most portable way to figure out local time offset is gmtime(),
+ * but it's not thread safe so use with caution.
+ */
+#define DUK_USE_DATE_TZO_GMTIME
+
+/* Avoid custom date parsing and formatting for portability. */
+#undef DUK_USE_DATE_PRS_STRPTIME
+#undef DUK_USE_DATE_FMT_STRFTIME
+
+/* Rely on C89 headers only; time.h must be here. */
+#include <time.h>
+
+#define DUK_USE_OS_STRING "unknown"
+#endif /* autodetect platform */
+
+/* Shared includes: C89 */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h> /* varargs */
+#include <setjmp.h>
+#include <stddef.h> /* e.g. ptrdiff_t */
+#include <math.h>
+#include <limits.h>
+
+/* date.h is omitted, and included per platform */
+
+/* Shared includes: stdint.h is C99 */
+#if defined(DUK_F_NO_STDINT_H)
+/* stdint.h not available */
+#else
+/* Technically C99 (C++11) but found in many systems. On some systems
+ * __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS must be defined before
+ * including stdint.h (see above).
+ */
+#include <stdint.h>
+#endif
+
+#if defined(DUK_F_CPP)
+#include <exception> /* std::exception */
+#endif
+
+/*
+ * Architecture autodetection
+ */
+
+#if defined(DUK_F_X86)
+/* --- x86 --- */
+#define DUK_USE_ARCH_STRING "x86"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+/* XXX: This is technically not guaranteed because it's possible to configure
+ * an x86 to require aligned accesses with Alignment Check (AC) flag.
+ */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 1
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_X64)
+/* --- x64 --- */
+#define DUK_USE_ARCH_STRING "x64"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+/* XXX: This is technically not guaranteed because it's possible to configure
+ * an x86 to require aligned accesses with Alignment Check (AC) flag.
+ */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 1
+#endif
+#undef DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_X32)
+/* --- x32 --- */
+#define DUK_USE_ARCH_STRING "x32"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+/* XXX: This is technically not guaranteed because it's possible to configure
+ * an x86 to require aligned accesses with Alignment Check (AC) flag.
+ */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 1
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_ARM32)
+/* --- ARM 32-bit --- */
+#define DUK_USE_ARCH_STRING "arm32"
+/* Byte order varies, so rely on autodetect. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 4
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_ARM64)
+/* --- ARM 64-bit --- */
+#define DUK_USE_ARCH_STRING "arm64"
+/* Byte order varies, so rely on autodetect. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#undef DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_MIPS32)
+/* --- MIPS 32-bit --- */
+#define DUK_USE_ARCH_STRING "mips32"
+/* MIPS byte order varies so rely on autodetection. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_MIPS64)
+/* --- MIPS 64-bit --- */
+#define DUK_USE_ARCH_STRING "mips64"
+/* MIPS byte order varies so rely on autodetection. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#undef DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_PPC32)
+/* --- PowerPC 32-bit --- */
+#define DUK_USE_ARCH_STRING "ppc32"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 3
+#endif
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_PPC64)
+/* --- PowerPC 64-bit --- */
+#define DUK_USE_ARCH_STRING "ppc64"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 3
+#endif
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#undef DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_SPARC32)
+/* --- SPARC 32-bit --- */
+#define DUK_USE_ARCH_STRING "sparc32"
+/* SPARC byte order varies so rely on autodetection. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_SPARC64)
+/* --- SPARC 64-bit --- */
+#define DUK_USE_ARCH_STRING "sparc64"
+/* SPARC byte order varies so rely on autodetection. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#undef DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_SUPERH)
+/* --- SuperH --- */
+#define DUK_USE_ARCH_STRING "sh"
+/* Byte order varies, rely on autodetection. */
+/* Based on 'make checkalign' there are no alignment requirements on
+ * Linux SH4, but align by 4 is probably a good basic default.
+ */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 4
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_M68K)
+/* --- Motorola 68k --- */
+#define DUK_USE_ARCH_STRING "m68k"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 3
+#endif
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#define DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#elif defined(DUK_F_EMSCRIPTEN)
+/* --- Emscripten --- */
+#define DUK_USE_ARCH_STRING "emscripten"
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+#undef DUK_USE_PACKED_TVAL
+#define DUK_F_PACKED_TVAL_PROVIDED
+#else
+/* --- Generic --- */
+/* These are necessary wild guesses. */
+#define DUK_USE_ARCH_STRING "generic"
+/* Rely on autodetection for byte order, alignment, and packed tval. */
+#endif /* autodetect architecture */
+
+/*
+ * Compiler autodetection
+ */
+
+#if defined(DUK_F_CLANG)
+/* --- Clang --- */
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+/* C99 / C++11 and above: rely on va_copy() which is required. */
+#define DUK_VA_COPY(dest,src) va_copy(dest,src)
+#else
+/* Clang: assume we have __va_copy() in non-C99 mode. */
+#define DUK_VA_COPY(dest,src) __va_copy(dest,src)
+#endif
+
+#define DUK_NORETURN(decl) decl __attribute__((noreturn))
+
+#if defined(__clang__) && defined(__has_builtin)
+#if __has_builtin(__builtin_unreachable)
+#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0)
+#endif
+#endif
+
+#define DUK_USE_BRANCH_HINTS
+#define DUK_LIKELY(x) __builtin_expect((x), 1)
+#define DUK_UNLIKELY(x) __builtin_expect((x), 0)
+#if defined(__clang__) && defined(__has_builtin)
+#if __has_builtin(__builtin_unpredictable)
+#define DUK_UNPREDICTABLE(x) __builtin_unpredictable((x))
+#endif
+#endif
+
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_NOINLINE __attribute__((noinline))
+#define DUK_INLINE inline
+#define DUK_ALWAYS_INLINE inline __attribute__((always_inline))
+#endif
+
+/* DUK_HOT */
+/* DUK_COLD */
+
+#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)
+/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're
+ * compiling Duktape or the application.
+ */
+#if defined(DUK_COMPILING_DUKTAPE)
+#define DUK_EXTERNAL_DECL extern __declspec(dllexport)
+#define DUK_EXTERNAL __declspec(dllexport)
+#else
+#define DUK_EXTERNAL_DECL extern __declspec(dllimport)
+#define DUK_EXTERNAL should_not_happen
+#endif
+#if defined(DUK_SINGLE_FILE)
+#define DUK_INTERNAL_DECL static
+#define DUK_INTERNAL static
+#else
+#define DUK_INTERNAL_DECL extern
+#define DUK_INTERNAL /*empty*/
+#endif
+#define DUK_LOCAL_DECL static
+#define DUK_LOCAL static
+#else
+#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern
+#define DUK_EXTERNAL __attribute__ ((visibility("default")))
+#if defined(DUK_SINGLE_FILE)
+#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)
+/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and
+ * Clang. Based on documentation it should suffice to have the attribute
+ * in the declaration only, but in practice some warnings are generated unless
+ * the attribute is also applied to the definition.
+ */
+#define DUK_INTERNAL_DECL static __attribute__ ((unused))
+#define DUK_INTERNAL static __attribute__ ((unused))
+#else
+#define DUK_INTERNAL_DECL static
+#define DUK_INTERNAL static
+#endif
+#else
+#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)
+#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern
+#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused))
+#else
+#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern
+#define DUK_INTERNAL __attribute__ ((visibility("hidden")))
+#endif
+#endif
+#define DUK_LOCAL_DECL static
+#define DUK_LOCAL static
+#endif
+
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "clang"
+#else
+#define DUK_USE_COMPILER_STRING "clang"
+#endif
+
+#undef DUK_USE_VARIADIC_MACROS
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_USE_VARIADIC_MACROS
+#endif
+
+#define DUK_USE_UNION_INITIALIZERS
+
+#undef DUK_USE_FLEX_C99
+#undef DUK_USE_FLEX_ZEROSIZE
+#undef DUK_USE_FLEX_ONESIZE
+#if defined(DUK_F_C99)
+#define DUK_USE_FLEX_C99
+#else
+#define DUK_USE_FLEX_ZEROSIZE
+#endif
+
+#undef DUK_USE_GCC_PRAGMAS
+#define DUK_USE_PACK_CLANG_ATTR
+#elif defined(DUK_F_GCC)
+/* --- GCC --- */
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+/* C99 / C++11 and above: rely on va_copy() which is required. */
+#define DUK_VA_COPY(dest,src) va_copy(dest,src)
+#else
+/* GCC: assume we have __va_copy() in non-C99 mode. */
+#define DUK_VA_COPY(dest,src) __va_copy(dest,src)
+#endif
+
+#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 20500L)
+/* since gcc-2.5 */
+#define DUK_NORETURN(decl) decl __attribute__((noreturn))
+#endif
+
+#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)
+/* since gcc-4.5 */
+#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0)
+#endif
+
+#define DUK_USE_BRANCH_HINTS
+#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)
+/* GCC: test not very accurate; enable only in relatively recent builds
+ * because of bugs in gcc-4.4 (http://lists.debian.org/debian-gcc/2010/04/msg00000.html)
+ */
+#define DUK_LIKELY(x) __builtin_expect((x), 1)
+#define DUK_UNLIKELY(x) __builtin_expect((x), 0)
+#endif
+/* XXX: equivalent of clang __builtin_unpredictable? */
+
+#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \
+ defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 30101)
+#define DUK_NOINLINE __attribute__((noinline))
+#define DUK_INLINE inline
+#define DUK_ALWAYS_INLINE inline __attribute__((always_inline))
+#endif
+
+#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \
+ defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40300)
+#define DUK_HOT __attribute__((hot))
+#define DUK_COLD __attribute__((cold))
+#endif
+
+#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)
+/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're
+ * compiling Duktape or the application.
+ */
+#if defined(DUK_COMPILING_DUKTAPE)
+#define DUK_EXTERNAL_DECL extern __declspec(dllexport)
+#define DUK_EXTERNAL __declspec(dllexport)
+#else
+#define DUK_EXTERNAL_DECL extern __declspec(dllimport)
+#define DUK_EXTERNAL should_not_happen
+#endif
+#if defined(DUK_SINGLE_FILE)
+#define DUK_INTERNAL_DECL static
+#define DUK_INTERNAL static
+#else
+#define DUK_INTERNAL_DECL extern
+#define DUK_INTERNAL /*empty*/
+#endif
+#define DUK_LOCAL_DECL static
+#define DUK_LOCAL static
+#elif defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40000)
+#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern
+#define DUK_EXTERNAL __attribute__ ((visibility("default")))
+#if defined(DUK_SINGLE_FILE)
+#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)
+/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and
+ * Clang. Based on documentation it should suffice to have the attribute
+ * in the declaration only, but in practice some warnings are generated unless
+ * the attribute is also applied to the definition.
+ */
+#define DUK_INTERNAL_DECL static __attribute__ ((unused))
+#define DUK_INTERNAL static __attribute__ ((unused))
+#else
+#define DUK_INTERNAL_DECL static
+#define DUK_INTERNAL static
+#endif
+#else
+#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)
+#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern
+#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused))
+#else
+#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern
+#define DUK_INTERNAL __attribute__ ((visibility("hidden")))
+#endif
+#endif
+#define DUK_LOCAL_DECL static
+#define DUK_LOCAL static
+#endif
+
+#if defined(DUK_F_MINGW)
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "mingw++"
+#else
+#define DUK_USE_COMPILER_STRING "mingw"
+#endif
+#else
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "g++"
+#else
+#define DUK_USE_COMPILER_STRING "gcc"
+#endif
+#endif
+
+#undef DUK_USE_VARIADIC_MACROS
+#if defined(DUK_F_C99) || (defined(DUK_F_CPP11) && defined(__GNUC__))
+#define DUK_USE_VARIADIC_MACROS
+#endif
+
+#define DUK_USE_UNION_INITIALIZERS
+
+#undef DUK_USE_FLEX_C99
+#undef DUK_USE_FLEX_ZEROSIZE
+#undef DUK_USE_FLEX_ONESIZE
+#if defined(DUK_F_C99)
+#define DUK_USE_FLEX_C99
+#else
+#define DUK_USE_FLEX_ZEROSIZE
+#endif
+
+#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40600)
+#define DUK_USE_GCC_PRAGMAS
+#else
+#undef DUK_USE_GCC_PRAGMAS
+#endif
+
+#define DUK_USE_PACK_GCC_ATTR
+#elif defined(DUK_F_MSVC)
+/* --- MSVC --- */
+/* http://msdn.microsoft.com/en-us/library/aa235362(VS.60).aspx */
+#define DUK_NORETURN(decl) __declspec(noreturn) decl
+
+/* XXX: DUK_UNREACHABLE for msvc? */
+
+#undef DUK_USE_BRANCH_HINTS
+
+/* XXX: DUK_LIKELY, DUK_UNLIKELY for msvc? */
+/* XXX: DUK_NOINLINE, DUK_INLINE, DUK_ALWAYS_INLINE for msvc? */
+
+#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)
+/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're
+ * compiling Duktape or the application.
+ */
+#if defined(DUK_COMPILING_DUKTAPE)
+#define DUK_EXTERNAL_DECL extern __declspec(dllexport)
+#define DUK_EXTERNAL __declspec(dllexport)
+#else
+#define DUK_EXTERNAL_DECL extern __declspec(dllimport)
+#define DUK_EXTERNAL should_not_happen
+#endif
+#if defined(DUK_SINGLE_FILE)
+#define DUK_INTERNAL_DECL static
+#define DUK_INTERNAL static
+#else
+#define DUK_INTERNAL_DECL extern
+#define DUK_INTERNAL /*empty*/
+#endif
+#define DUK_LOCAL_DECL static
+#define DUK_LOCAL static
+#endif
+
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "msvc++"
+#else
+#define DUK_USE_COMPILER_STRING "msvc"
+#endif
+
+#undef DUK_USE_VARIADIC_MACROS
+#if defined(DUK_F_C99)
+#define DUK_USE_VARIADIC_MACROS
+#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+/* VS2005+ should have variadic macros even when they're not C99. */
+#define DUK_USE_VARIADIC_MACROS
+#endif
+
+#undef DUK_USE_UNION_INITIALIZERS
+#if defined(_MSC_VER) && (_MSC_VER >= 1800)
+/* VS2013+ supports union initializers but there's a bug involving union-inside-struct:
+ * https://connect.microsoft.com/VisualStudio/feedback/details/805981
+ * The bug was fixed (at least) in VS2015 so check for VS2015 for now:
+ * https://blogs.msdn.microsoft.com/vcblog/2015/07/01/c-compiler-front-end-fixes-in-vs2015/
+ * Manually tested using VS2013, CL reports 18.00.31101, so enable for VS2013 too.
+ */
+#define DUK_USE_UNION_INITIALIZERS
+#endif
+
+#undef DUK_USE_FLEX_C99
+#undef DUK_USE_FLEX_ZEROSIZE
+#undef DUK_USE_FLEX_ONESIZE
+#if defined(DUK_F_C99)
+#define DUK_USE_FLEX_C99
+#else
+#define DUK_USE_FLEX_ZEROSIZE
+#endif
+
+#undef DUK_USE_GCC_PRAGMAS
+
+#define DUK_USE_PACK_MSVC_PRAGMA
+
+/* These have been tested from VS2008 onwards; may work in older VS versions
+ * too but not enabled by default.
+ */
+#if defined(_MSC_VER) && (_MSC_VER >= 1500)
+#define DUK_NOINLINE __declspec(noinline)
+#define DUK_INLINE __inline
+#define DUK_ALWAYS_INLINE __forceinline
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+#define DUK_SNPRINTF snprintf
+#define DUK_VSNPRINTF vsnprintf
+#else
+/* (v)snprintf() is missing before MSVC 2015. Note that _(v)snprintf() does
+ * NOT NUL terminate on truncation, but Duktape code never assumes that.
+ * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
+ */
+#define DUK_SNPRINTF _snprintf
+#define DUK_VSNPRINTF _vsnprintf
+#endif
+
+/* Avoid warning when doing DUK_UNREF(some_function). */
+#if defined(_MSC_VER) && (_MSC_VER < 1500)
+#pragma warning(disable: 4100 4101 4550 4551)
+#define DUK_UNREF(x)
+#else
+#define DUK_UNREF(x) do { __pragma(warning(suppress:4100 4101 4550 4551)) (x); } while (0)
+#endif
+
+/* Older versions of MSVC don't support the LL/ULL suffix. */
+#define DUK_U64_CONSTANT(x) x##ui64
+#define DUK_I64_CONSTANT(x) x##i64
+#elif defined(DUK_F_EMSCRIPTEN)
+/* --- Emscripten --- */
+#define DUK_NORETURN(decl) decl __attribute__((noreturn))
+
+#if defined(__clang__) && defined(__has_builtin)
+#if __has_builtin(__builtin_unreachable)
+#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0)
+#endif
+#endif
+
+#define DUK_USE_BRANCH_HINTS
+#define DUK_LIKELY(x) __builtin_expect((x), 1)
+#define DUK_UNLIKELY(x) __builtin_expect((x), 0)
+#if defined(__clang__) && defined(__has_builtin)
+#if __has_builtin(__builtin_unpredictable)
+#define DUK_UNPREDICTABLE(x) __builtin_unpredictable((x))
+#endif
+#endif
+
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_NOINLINE __attribute__((noinline))
+#define DUK_INLINE inline
+#define DUK_ALWAYS_INLINE inline __attribute__((always_inline))
+#endif
+
+#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern
+#define DUK_EXTERNAL __attribute__ ((visibility("default")))
+#if defined(DUK_SINGLE_FILE)
+#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)
+/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and
+ * Clang. Based on documentation it should suffice to have the attribute
+ * in the declaration only, but in practice some warnings are generated unless
+ * the attribute is also applied to the definition.
+ */
+#define DUK_INTERNAL_DECL static __attribute__ ((unused))
+#define DUK_INTERNAL static __attribute__ ((unused))
+#else
+#define DUK_INTERNAL_DECL static
+#define DUK_INTERNAL static
+#endif
+#else
+#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)
+#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern
+#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused))
+#else
+#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern
+#define DUK_INTERNAL __attribute__ ((visibility("hidden")))
+#endif
+#endif
+#define DUK_LOCAL_DECL static
+#define DUK_LOCAL static
+
+#define DUK_USE_COMPILER_STRING "emscripten"
+
+#undef DUK_USE_VARIADIC_MACROS
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_USE_VARIADIC_MACROS
+#endif
+
+#define DUK_USE_UNION_INITIALIZERS
+
+#undef DUK_USE_FLEX_C99
+#undef DUK_USE_FLEX_ZEROSIZE
+#undef DUK_USE_FLEX_ONESIZE
+#if defined(DUK_F_C99)
+#define DUK_USE_FLEX_C99
+#else
+#define DUK_USE_FLEX_ZEROSIZE
+#endif
+
+#undef DUK_USE_GCC_PRAGMAS
+#define DUK_USE_PACK_CLANG_ATTR
+#elif defined(DUK_F_TINYC)
+/* --- TinyC --- */
+#undef DUK_USE_BRANCH_HINTS
+
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "tinyc++"
+#else
+#define DUK_USE_COMPILER_STRING "tinyc"
+#endif
+
+/* http://bellard.org/tcc/tcc-doc.html#SEC7 */
+#define DUK_USE_VARIADIC_MACROS
+
+#define DUK_USE_UNION_INITIALIZERS
+
+/* Most portable, wastes space */
+#define DUK_USE_FLEX_ONESIZE
+
+/* Most portable, potentially wastes space */
+#define DUK_USE_PACK_DUMMY_MEMBER
+#elif defined(DUK_F_VBCC)
+/* --- VBCC --- */
+#undef DUK_USE_BRANCH_HINTS
+
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "vbcc-c++"
+#else
+#define DUK_USE_COMPILER_STRING "vbcc"
+#endif
+
+#undef DUK_USE_VARIADIC_MACROS
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_USE_VARIADIC_MACROS
+#endif
+
+/* VBCC supports C99 so check only for C99 for union initializer support.
+ * Designated union initializers would possibly work even without a C99 check.
+ */
+#undef DUK_USE_UNION_INITIALIZERS
+#if defined(DUK_F_C99)
+#define DUK_USE_UNION_INITIALIZERS
+#endif
+
+#define DUK_USE_FLEX_ZEROSIZE
+#define DUK_USE_PACK_DUMMY_MEMBER
+#elif defined(DUK_F_BCC)
+/* --- Bruce's C compiler --- */
+#undef DUK_USE_BRANCH_HINTS
+
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "bcc++"
+#else
+#define DUK_USE_COMPILER_STRING "bcc"
+#endif
+
+/* Most portable */
+#undef DUK_USE_VARIADIC_MACROS
+
+/* Most portable, wastes space */
+#undef DUK_USE_UNION_INITIALIZERS
+
+/* Most portable, wastes space */
+#define DUK_USE_FLEX_ONESIZE
+
+/* Most portable, potentially wastes space */
+#define DUK_USE_PACK_DUMMY_MEMBER
+
+/* BCC, assume we're on x86. */
+#if !defined(DUK_USE_BYTEORDER)
+#define DUK_USE_BYTEORDER 1
+#endif
+#else
+/* --- Generic --- */
+#undef DUK_USE_BRANCH_HINTS
+
+#if defined(DUK_F_CPP)
+#define DUK_USE_COMPILER_STRING "generic-c++"
+#else
+#define DUK_USE_COMPILER_STRING "generic"
+#endif
+
+#undef DUK_USE_VARIADIC_MACROS
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_USE_VARIADIC_MACROS
+#endif
+
+/* C++ doesn't have standard designated union initializers ({ .foo = 1 }). */
+#undef DUK_USE_UNION_INITIALIZERS
+#if defined(DUK_F_C99)
+#define DUK_USE_UNION_INITIALIZERS
+#endif
+
+/* Most portable, wastes space */
+#define DUK_USE_FLEX_ONESIZE
+
+/* Most portable, potentially wastes space */
+#define DUK_USE_PACK_DUMMY_MEMBER
+#endif /* autodetect compiler */
+
+/* uclibc */
+#if defined(__UCLIBC__)
+#define DUK_F_UCLIBC
+#endif
+
+/*
+ * Wrapper typedefs and constants for integer types, also sanity check types.
+ *
+ * C99 typedefs are quite good but not always available, and we want to avoid
+ * forcibly redefining the C99 typedefs. So, there are Duktape wrappers for
+ * all C99 typedefs and Duktape code should only use these typedefs. Type
+ * detection when C99 is not supported is best effort and may end up detecting
+ * some types incorrectly.
+ *
+ * Pointer sizes are a portability problem: pointers to different types may
+ * have a different size and function pointers are very difficult to manage
+ * portably.
+ *
+ * http://en.wikipedia.org/wiki/C_data_types#Fixed-width_integer_types
+ *
+ * Note: there's an interesting corner case when trying to define minimum
+ * signed integer value constants which leads to the current workaround of
+ * defining e.g. -0x80000000 as (-0x7fffffffL - 1L). See doc/code-issues.txt
+ * for a longer discussion.
+ *
+ * Note: avoid typecasts and computations in macro integer constants as they
+ * can then no longer be used in macro relational expressions (such as
+ * #if DUK_SIZE_MAX < 0xffffffffUL). There is internal code which relies on
+ * being able to compare DUK_SIZE_MAX against a limit.
+ */
+
+/* XXX: add feature options to force basic types from outside? */
+
+#if !defined(INT_MAX)
+#error INT_MAX not defined
+#endif
+
+/* Check that architecture is two's complement, standard C allows e.g.
+ * INT_MIN to be -2**31+1 (instead of -2**31).
+ */
+#if defined(INT_MAX) && defined(INT_MIN)
+#if INT_MAX != -(INT_MIN + 1)
+#error platform does not seem complement of two
+#endif
+#else
+#error cannot check complement of two
+#endif
+
+/* Pointer size determination based on __WORDSIZE or architecture when
+ * that's not available.
+ */
+#if defined(DUK_F_X86) || defined(DUK_F_X32) || \
+ defined(DUK_F_M68K) || defined(DUK_F_PPC32) || \
+ defined(DUK_F_BCC) || \
+ (defined(__WORDSIZE) && (__WORDSIZE == 32)) || \
+ ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \
+ defined(DUK_F_HPUX)) && defined(_ILP32)) || \
+ defined(DUK_F_ARM32)
+#define DUK_F_32BIT_PTRS
+#elif defined(DUK_F_X64) || \
+ (defined(__WORDSIZE) && (__WORDSIZE == 64)) || \
+ ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \
+ defined(DUK_F_HPUX)) && defined(_LP64)) || \
+ defined(DUK_F_ARM64)
+#define DUK_F_64BIT_PTRS
+#else
+/* not sure, not needed with C99 anyway */
+#endif
+
+/* Intermediate define for 'have inttypes.h' */
+#undef DUK_F_HAVE_INTTYPES
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
+ !(defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC))
+/* vbcc + AmigaOS has C99 but no inttypes.h */
+#define DUK_F_HAVE_INTTYPES
+#elif defined(__cplusplus) && (__cplusplus >= 201103L)
+/* C++11 apparently ratified stdint.h */
+#define DUK_F_HAVE_INTTYPES
+#endif
+
+/* Basic integer typedefs and limits, preferably from inttypes.h, otherwise
+ * through automatic detection.
+ */
+#if defined(DUK_F_HAVE_INTTYPES)
+/* C99 or compatible */
+
+#define DUK_F_HAVE_64BIT
+#include <inttypes.h>
+
+typedef uint8_t duk_uint8_t;
+typedef int8_t duk_int8_t;
+typedef uint16_t duk_uint16_t;
+typedef int16_t duk_int16_t;
+typedef uint32_t duk_uint32_t;
+typedef int32_t duk_int32_t;
+typedef uint64_t duk_uint64_t;
+typedef int64_t duk_int64_t;
+typedef uint_least8_t duk_uint_least8_t;
+typedef int_least8_t duk_int_least8_t;
+typedef uint_least16_t duk_uint_least16_t;
+typedef int_least16_t duk_int_least16_t;
+typedef uint_least32_t duk_uint_least32_t;
+typedef int_least32_t duk_int_least32_t;
+typedef uint_least64_t duk_uint_least64_t;
+typedef int_least64_t duk_int_least64_t;
+typedef uint_fast8_t duk_uint_fast8_t;
+typedef int_fast8_t duk_int_fast8_t;
+typedef uint_fast16_t duk_uint_fast16_t;
+typedef int_fast16_t duk_int_fast16_t;
+typedef uint_fast32_t duk_uint_fast32_t;
+typedef int_fast32_t duk_int_fast32_t;
+typedef uint_fast64_t duk_uint_fast64_t;
+typedef int_fast64_t duk_int_fast64_t;
+typedef uintptr_t duk_uintptr_t;
+typedef intptr_t duk_intptr_t;
+typedef uintmax_t duk_uintmax_t;
+typedef intmax_t duk_intmax_t;
+
+#define DUK_UINT8_MIN 0
+#define DUK_UINT8_MAX UINT8_MAX
+#define DUK_INT8_MIN INT8_MIN
+#define DUK_INT8_MAX INT8_MAX
+#define DUK_UINT_LEAST8_MIN 0
+#define DUK_UINT_LEAST8_MAX UINT_LEAST8_MAX
+#define DUK_INT_LEAST8_MIN INT_LEAST8_MIN
+#define DUK_INT_LEAST8_MAX INT_LEAST8_MAX
+#define DUK_UINT_FAST8_MIN 0
+#define DUK_UINT_FAST8_MAX UINT_FAST8_MAX
+#define DUK_INT_FAST8_MIN INT_FAST8_MIN
+#define DUK_INT_FAST8_MAX INT_FAST8_MAX
+#define DUK_UINT16_MIN 0
+#define DUK_UINT16_MAX UINT16_MAX
+#define DUK_INT16_MIN INT16_MIN
+#define DUK_INT16_MAX INT16_MAX
+#define DUK_UINT_LEAST16_MIN 0
+#define DUK_UINT_LEAST16_MAX UINT_LEAST16_MAX
+#define DUK_INT_LEAST16_MIN INT_LEAST16_MIN
+#define DUK_INT_LEAST16_MAX INT_LEAST16_MAX
+#define DUK_UINT_FAST16_MIN 0
+#define DUK_UINT_FAST16_MAX UINT_FAST16_MAX
+#define DUK_INT_FAST16_MIN INT_FAST16_MIN
+#define DUK_INT_FAST16_MAX INT_FAST16_MAX
+#define DUK_UINT32_MIN 0
+#define DUK_UINT32_MAX UINT32_MAX
+#define DUK_INT32_MIN INT32_MIN
+#define DUK_INT32_MAX INT32_MAX
+#define DUK_UINT_LEAST32_MIN 0
+#define DUK_UINT_LEAST32_MAX UINT_LEAST32_MAX
+#define DUK_INT_LEAST32_MIN INT_LEAST32_MIN
+#define DUK_INT_LEAST32_MAX INT_LEAST32_MAX
+#define DUK_UINT_FAST32_MIN 0
+#define DUK_UINT_FAST32_MAX UINT_FAST32_MAX
+#define DUK_INT_FAST32_MIN INT_FAST32_MIN
+#define DUK_INT_FAST32_MAX INT_FAST32_MAX
+#define DUK_UINT64_MIN 0
+#define DUK_UINT64_MAX UINT64_MAX
+#define DUK_INT64_MIN INT64_MIN
+#define DUK_INT64_MAX INT64_MAX
+#define DUK_UINT_LEAST64_MIN 0
+#define DUK_UINT_LEAST64_MAX UINT_LEAST64_MAX
+#define DUK_INT_LEAST64_MIN INT_LEAST64_MIN
+#define DUK_INT_LEAST64_MAX INT_LEAST64_MAX
+#define DUK_UINT_FAST64_MIN 0
+#define DUK_UINT_FAST64_MAX UINT_FAST64_MAX
+#define DUK_INT_FAST64_MIN INT_FAST64_MIN
+#define DUK_INT_FAST64_MAX INT_FAST64_MAX
+
+#define DUK_UINTPTR_MIN 0
+#define DUK_UINTPTR_MAX UINTPTR_MAX
+#define DUK_INTPTR_MIN INTPTR_MIN
+#define DUK_INTPTR_MAX INTPTR_MAX
+
+#define DUK_UINTMAX_MIN 0
+#define DUK_UINTMAX_MAX UINTMAX_MAX
+#define DUK_INTMAX_MIN INTMAX_MIN
+#define DUK_INTMAX_MAX INTMAX_MAX
+
+#define DUK_SIZE_MIN 0
+#define DUK_SIZE_MAX SIZE_MAX
+#undef DUK_SIZE_MAX_COMPUTED
+
+#else /* C99 types */
+
+/* When C99 types are not available, we use heuristic detection to get
+ * the basic 8, 16, 32, and (possibly) 64 bit types. The fast/least
+ * types are then assumed to be exactly the same for now: these could
+ * be improved per platform but C99 types are very often now available.
+ * 64-bit types are not available on all platforms; this is OK at least
+ * on 32-bit platforms.
+ *
+ * This detection code is necessarily a bit hacky and can provide typedefs
+ * and defines that won't work correctly on some exotic platform.
+ */
+
+#if (defined(CHAR_BIT) && (CHAR_BIT == 8)) || \
+ (defined(UCHAR_MAX) && (UCHAR_MAX == 255))
+typedef unsigned char duk_uint8_t;
+typedef signed char duk_int8_t;
+#else
+#error cannot detect 8-bit type
+#endif
+
+#if defined(USHRT_MAX) && (USHRT_MAX == 65535UL)
+typedef unsigned short duk_uint16_t;
+typedef signed short duk_int16_t;
+#elif defined(UINT_MAX) && (UINT_MAX == 65535UL)
+/* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */
+typedef unsigned int duk_uint16_t;
+typedef signed int duk_int16_t;
+#else
+#error cannot detect 16-bit type
+#endif
+
+#if defined(UINT_MAX) && (UINT_MAX == 4294967295UL)
+typedef unsigned int duk_uint32_t;
+typedef signed int duk_int32_t;
+#elif defined(ULONG_MAX) && (ULONG_MAX == 4294967295UL)
+/* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */
+typedef unsigned long duk_uint32_t;
+typedef signed long duk_int32_t;
+#else
+#error cannot detect 32-bit type
+#endif
+
+/* 64-bit type detection is a bit tricky.
+ *
+ * ULLONG_MAX is a standard define. __LONG_LONG_MAX__ and __ULONG_LONG_MAX__
+ * are used by at least GCC (even if system headers don't provide ULLONG_MAX).
+ * Some GCC variants may provide __LONG_LONG_MAX__ but not __ULONG_LONG_MAX__.
+ *
+ * ULL / LL constants are rejected / warned about by some compilers, even if
+ * the compiler has a 64-bit type and the compiler/system headers provide an
+ * unsupported constant (ULL/LL)! Try to avoid using ULL / LL constants.
+ * As a side effect we can only check that e.g. ULONG_MAX is larger than 32
+ * bits but can't be sure it is exactly 64 bits. Self tests will catch such
+ * cases.
+ */
+#undef DUK_F_HAVE_64BIT
+#if !defined(DUK_F_HAVE_64BIT) && defined(ULONG_MAX)
+#if (ULONG_MAX > 4294967295UL)
+#define DUK_F_HAVE_64BIT
+typedef unsigned long duk_uint64_t;
+typedef signed long duk_int64_t;
+#endif
+#endif
+#if !defined(DUK_F_HAVE_64BIT) && defined(ULLONG_MAX)
+#if (ULLONG_MAX > 4294967295UL)
+#define DUK_F_HAVE_64BIT
+typedef unsigned long long duk_uint64_t;
+typedef signed long long duk_int64_t;
+#endif
+#endif
+#if !defined(DUK_F_HAVE_64BIT) && defined(__ULONG_LONG_MAX__)
+#if (__ULONG_LONG_MAX__ > 4294967295UL)
+#define DUK_F_HAVE_64BIT
+typedef unsigned long long duk_uint64_t;
+typedef signed long long duk_int64_t;
+#endif
+#endif
+#if !defined(DUK_F_HAVE_64BIT) && defined(__LONG_LONG_MAX__)
+#if (__LONG_LONG_MAX__ > 2147483647L)
+#define DUK_F_HAVE_64BIT
+typedef unsigned long long duk_uint64_t;
+typedef signed long long duk_int64_t;
+#endif
+#endif
+#if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MINGW)
+#define DUK_F_HAVE_64BIT
+typedef unsigned long duk_uint64_t;
+typedef signed long duk_int64_t;
+#endif
+#if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MSVC)
+#define DUK_F_HAVE_64BIT
+typedef unsigned __int64 duk_uint64_t;
+typedef signed __int64 duk_int64_t;
+#endif
+#if !defined(DUK_F_HAVE_64BIT)
+/* cannot detect 64-bit type, not always needed so don't error */
+#endif
+
+typedef duk_uint8_t duk_uint_least8_t;
+typedef duk_int8_t duk_int_least8_t;
+typedef duk_uint16_t duk_uint_least16_t;
+typedef duk_int16_t duk_int_least16_t;
+typedef duk_uint32_t duk_uint_least32_t;
+typedef duk_int32_t duk_int_least32_t;
+typedef duk_uint8_t duk_uint_fast8_t;
+typedef duk_int8_t duk_int_fast8_t;
+typedef duk_uint16_t duk_uint_fast16_t;
+typedef duk_int16_t duk_int_fast16_t;
+typedef duk_uint32_t duk_uint_fast32_t;
+typedef duk_int32_t duk_int_fast32_t;
+#if defined(DUK_F_HAVE_64BIT)
+typedef duk_uint64_t duk_uint_least64_t;
+typedef duk_int64_t duk_int_least64_t;
+typedef duk_uint64_t duk_uint_fast64_t;
+typedef duk_int64_t duk_int_fast64_t;
+#endif
+#if defined(DUK_F_HAVE_64BIT)
+typedef duk_uint64_t duk_uintmax_t;
+typedef duk_int64_t duk_intmax_t;
+#else
+typedef duk_uint32_t duk_uintmax_t;
+typedef duk_int32_t duk_intmax_t;
+#endif
+
+/* Note: the funny looking computations for signed minimum 16-bit, 32-bit, and
+ * 64-bit values are intentional as the obvious forms (e.g. -0x80000000L) are
+ * -not- portable. See code-issues.txt for a detailed discussion.
+ */
+#define DUK_UINT8_MIN 0UL
+#define DUK_UINT8_MAX 0xffUL
+#define DUK_INT8_MIN (-0x80L)
+#define DUK_INT8_MAX 0x7fL
+#define DUK_UINT_LEAST8_MIN 0UL
+#define DUK_UINT_LEAST8_MAX 0xffUL
+#define DUK_INT_LEAST8_MIN (-0x80L)
+#define DUK_INT_LEAST8_MAX 0x7fL
+#define DUK_UINT_FAST8_MIN 0UL
+#define DUK_UINT_FAST8_MAX 0xffUL
+#define DUK_INT_FAST8_MIN (-0x80L)
+#define DUK_INT_FAST8_MAX 0x7fL
+#define DUK_UINT16_MIN 0UL
+#define DUK_UINT16_MAX 0xffffUL
+#define DUK_INT16_MIN (-0x7fffL - 1L)
+#define DUK_INT16_MAX 0x7fffL
+#define DUK_UINT_LEAST16_MIN 0UL
+#define DUK_UINT_LEAST16_MAX 0xffffUL
+#define DUK_INT_LEAST16_MIN (-0x7fffL - 1L)
+#define DUK_INT_LEAST16_MAX 0x7fffL
+#define DUK_UINT_FAST16_MIN 0UL
+#define DUK_UINT_FAST16_MAX 0xffffUL
+#define DUK_INT_FAST16_MIN (-0x7fffL - 1L)
+#define DUK_INT_FAST16_MAX 0x7fffL
+#define DUK_UINT32_MIN 0UL
+#define DUK_UINT32_MAX 0xffffffffUL
+#define DUK_INT32_MIN (-0x7fffffffL - 1L)
+#define DUK_INT32_MAX 0x7fffffffL
+#define DUK_UINT_LEAST32_MIN 0UL
+#define DUK_UINT_LEAST32_MAX 0xffffffffUL
+#define DUK_INT_LEAST32_MIN (-0x7fffffffL - 1L)
+#define DUK_INT_LEAST32_MAX 0x7fffffffL
+#define DUK_UINT_FAST32_MIN 0UL
+#define DUK_UINT_FAST32_MAX 0xffffffffUL
+#define DUK_INT_FAST32_MIN (-0x7fffffffL - 1L)
+#define DUK_INT_FAST32_MAX 0x7fffffffL
+
+/* 64-bit constants. Since LL / ULL constants are not always available,
+ * use computed values. These values can't be used in preprocessor
+ * comparisons; flag them as such.
+ */
+#if defined(DUK_F_HAVE_64BIT)
+#define DUK_UINT64_MIN ((duk_uint64_t) 0)
+#define DUK_UINT64_MAX ((duk_uint64_t) -1)
+#define DUK_INT64_MIN ((duk_int64_t) (~(DUK_UINT64_MAX >> 1)))
+#define DUK_INT64_MAX ((duk_int64_t) (DUK_UINT64_MAX >> 1))
+#define DUK_UINT_LEAST64_MIN DUK_UINT64_MIN
+#define DUK_UINT_LEAST64_MAX DUK_UINT64_MAX
+#define DUK_INT_LEAST64_MIN DUK_INT64_MIN
+#define DUK_INT_LEAST64_MAX DUK_INT64_MAX
+#define DUK_UINT_FAST64_MIN DUK_UINT64_MIN
+#define DUK_UINT_FAST64_MAX DUK_UINT64_MAX
+#define DUK_INT_FAST64_MIN DUK_INT64_MIN
+#define DUK_INT_FAST64_MAX DUK_INT64_MAX
+#define DUK_UINT64_MIN_COMPUTED
+#define DUK_UINT64_MAX_COMPUTED
+#define DUK_INT64_MIN_COMPUTED
+#define DUK_INT64_MAX_COMPUTED
+#define DUK_UINT_LEAST64_MIN_COMPUTED
+#define DUK_UINT_LEAST64_MAX_COMPUTED
+#define DUK_INT_LEAST64_MIN_COMPUTED
+#define DUK_INT_LEAST64_MAX_COMPUTED
+#define DUK_UINT_FAST64_MIN_COMPUTED
+#define DUK_UINT_FAST64_MAX_COMPUTED
+#define DUK_INT_FAST64_MIN_COMPUTED
+#define DUK_INT_FAST64_MAX_COMPUTED
+#endif
+
+#if defined(DUK_F_HAVE_64BIT)
+#define DUK_UINTMAX_MIN DUK_UINT64_MIN
+#define DUK_UINTMAX_MAX DUK_UINT64_MAX
+#define DUK_INTMAX_MIN DUK_INT64_MIN
+#define DUK_INTMAX_MAX DUK_INT64_MAX
+#define DUK_UINTMAX_MIN_COMPUTED
+#define DUK_UINTMAX_MAX_COMPUTED
+#define DUK_INTMAX_MIN_COMPUTED
+#define DUK_INTMAX_MAX_COMPUTED
+#else
+#define DUK_UINTMAX_MIN 0UL
+#define DUK_UINTMAX_MAX 0xffffffffUL
+#define DUK_INTMAX_MIN (-0x7fffffffL - 1L)
+#define DUK_INTMAX_MAX 0x7fffffffL
+#endif
+
+/* This detection is not very reliable. */
+#if defined(DUK_F_32BIT_PTRS)
+typedef duk_int32_t duk_intptr_t;
+typedef duk_uint32_t duk_uintptr_t;
+#define DUK_UINTPTR_MIN DUK_UINT32_MIN
+#define DUK_UINTPTR_MAX DUK_UINT32_MAX
+#define DUK_INTPTR_MIN DUK_INT32_MIN
+#define DUK_INTPTR_MAX DUK_INT32_MAX
+#elif defined(DUK_F_64BIT_PTRS) && defined(DUK_F_HAVE_64BIT)
+typedef duk_int64_t duk_intptr_t;
+typedef duk_uint64_t duk_uintptr_t;
+#define DUK_UINTPTR_MIN DUK_UINT64_MIN
+#define DUK_UINTPTR_MAX DUK_UINT64_MAX
+#define DUK_INTPTR_MIN DUK_INT64_MIN
+#define DUK_INTPTR_MAX DUK_INT64_MAX
+#define DUK_UINTPTR_MIN_COMPUTED
+#define DUK_UINTPTR_MAX_COMPUTED
+#define DUK_INTPTR_MIN_COMPUTED
+#define DUK_INTPTR_MAX_COMPUTED
+#else
+#error cannot determine intptr type
+#endif
+
+/* SIZE_MAX may be missing so use an approximate value for it. */
+#undef DUK_SIZE_MAX_COMPUTED
+#if !defined(SIZE_MAX)
+#define DUK_SIZE_MAX_COMPUTED
+#define SIZE_MAX ((size_t) (-1))
+#endif
+#define DUK_SIZE_MIN 0
+#define DUK_SIZE_MAX SIZE_MAX
+
+#endif /* C99 types */
+
+/* A few types are assumed to always exist. */
+typedef size_t duk_size_t;
+typedef ptrdiff_t duk_ptrdiff_t;
+
+/* The best type for an "all around int" in Duktape internals is "at least
+ * 32 bit signed integer" which is most convenient. Same for unsigned type.
+ * Prefer 'int' when large enough, as it is almost always a convenient type.
+ */
+#if defined(UINT_MAX) && (UINT_MAX >= 0xffffffffUL)
+typedef int duk_int_t;
+typedef unsigned int duk_uint_t;
+#define DUK_INT_MIN INT_MIN
+#define DUK_INT_MAX INT_MAX
+#define DUK_UINT_MIN 0
+#define DUK_UINT_MAX UINT_MAX
+#else
+typedef duk_int_fast32_t duk_int_t;
+typedef duk_uint_fast32_t duk_uint_t;
+#define DUK_INT_MIN DUK_INT_FAST32_MIN
+#define DUK_INT_MAX DUK_INT_FAST32_MAX
+#define DUK_UINT_MIN DUK_UINT_FAST32_MIN
+#define DUK_UINT_MAX DUK_UINT_FAST32_MAX
+#endif
+
+/* Same as 'duk_int_t' but guaranteed to be a 'fast' variant if this
+ * distinction matters for the CPU. These types are used mainly in the
+ * executor where it might really matter.
+ */
+typedef duk_int_fast32_t duk_int_fast_t;
+typedef duk_uint_fast32_t duk_uint_fast_t;
+#define DUK_INT_FAST_MIN DUK_INT_FAST32_MIN
+#define DUK_INT_FAST_MAX DUK_INT_FAST32_MAX
+#define DUK_UINT_FAST_MIN DUK_UINT_FAST32_MIN
+#define DUK_UINT_FAST_MAX DUK_UINT_FAST32_MAX
+
+/* Small integers (16 bits or more) can fall back to the 'int' type, but
+ * have a typedef so they are marked "small" explicitly.
+ */
+typedef int duk_small_int_t;
+typedef unsigned int duk_small_uint_t;
+#define DUK_SMALL_INT_MIN INT_MIN
+#define DUK_SMALL_INT_MAX INT_MAX
+#define DUK_SMALL_UINT_MIN 0
+#define DUK_SMALL_UINT_MAX UINT_MAX
+
+/* Fast variants of small integers, again for really fast paths like the
+ * executor.
+ */
+typedef duk_int_fast16_t duk_small_int_fast_t;
+typedef duk_uint_fast16_t duk_small_uint_fast_t;
+#define DUK_SMALL_INT_FAST_MIN DUK_INT_FAST16_MIN
+#define DUK_SMALL_INT_FAST_MAX DUK_INT_FAST16_MAX
+#define DUK_SMALL_UINT_FAST_MIN DUK_UINT_FAST16_MIN
+#define DUK_SMALL_UINT_FAST_MAX DUK_UINT_FAST16_MAX
+
+/* Boolean values are represented with the platform 'unsigned int'. */
+typedef duk_small_uint_t duk_bool_t;
+#define DUK_BOOL_MIN DUK_SMALL_INT_MIN
+#define DUK_BOOL_MAX DUK_SMALL_INT_MAX
+
+/* Index values must have at least 32-bit signed range. */
+typedef duk_int_t duk_idx_t;
+#define DUK_IDX_MIN DUK_INT_MIN
+#define DUK_IDX_MAX DUK_INT_MAX
+
+/* Unsigned index variant. */
+typedef duk_uint_t duk_uidx_t;
+#define DUK_UIDX_MIN DUK_UINT_MIN
+#define DUK_UIDX_MAX DUK_UINT_MAX
+
+/* Array index values, could be exact 32 bits.
+ * Currently no need for signed duk_arridx_t.
+ */
+typedef duk_uint_t duk_uarridx_t;
+#define DUK_UARRIDX_MIN DUK_UINT_MIN
+#define DUK_UARRIDX_MAX DUK_UINT_MAX
+
+/* Duktape/C function return value, platform int is enough for now to
+ * represent 0, 1, or negative error code. Must be compatible with
+ * assigning truth values (e.g. duk_ret_t rc = (foo == bar);).
+ */
+typedef duk_small_int_t duk_ret_t;
+#define DUK_RET_MIN DUK_SMALL_INT_MIN
+#define DUK_RET_MAX DUK_SMALL_INT_MAX
+
+/* Error codes are represented with platform int. High bits are used
+ * for flags and such, so 32 bits are needed.
+ */
+typedef duk_int_t duk_errcode_t;
+#define DUK_ERRCODE_MIN DUK_INT_MIN
+#define DUK_ERRCODE_MAX DUK_INT_MAX
+
+/* Codepoint type. Must be 32 bits or more because it is used also for
+ * internal codepoints. The type is signed because negative codepoints
+ * are used as internal markers (e.g. to mark EOF or missing argument).
+ * (X)UTF-8/CESU-8 encode/decode take and return an unsigned variant to
+ * ensure duk_uint32_t casts back and forth nicely. Almost everything
+ * else uses the signed one.
+ */
+typedef duk_int_t duk_codepoint_t;
+typedef duk_uint_t duk_ucodepoint_t;
+#define DUK_CODEPOINT_MIN DUK_INT_MIN
+#define DUK_CODEPOINT_MAX DUK_INT_MAX
+#define DUK_UCODEPOINT_MIN DUK_UINT_MIN
+#define DUK_UCODEPOINT_MAX DUK_UINT_MAX
+
+/* IEEE float/double typedef. */
+typedef float duk_float_t;
+typedef double duk_double_t;
+
+/* We're generally assuming that we're working on a platform with a 32-bit
+ * address space. If DUK_SIZE_MAX is a typecast value (which is necessary
+ * if SIZE_MAX is missing), the check must be avoided because the
+ * preprocessor can't do a comparison.
+ */
+#if !defined(DUK_SIZE_MAX)
+#error DUK_SIZE_MAX is undefined, probably missing SIZE_MAX
+#elif !defined(DUK_SIZE_MAX_COMPUTED)
+#if DUK_SIZE_MAX < 0xffffffffUL
+/* On some systems SIZE_MAX can be smaller than max unsigned 32-bit value
+ * which seems incorrect if size_t is (at least) an unsigned 32-bit type.
+ * However, it doesn't seem useful to error out compilation if this is the
+ * case.
+ */
+#endif
+#endif
+
+/* Type used in public API declarations and user code. Typedef maps to
+ * 'struct duk_hthread' like the 'duk_hthread' typedef which is used
+ * exclusively in internals.
+ */
+typedef struct duk_hthread duk_context;
+
+/* Check whether we should use 64-bit integers or not.
+ *
+ * Quite incomplete now. Use 64-bit types if detected (C99 or other detection)
+ * unless they are known to be unreliable. For instance, 64-bit types are
+ * available on VBCC but seem to misbehave.
+ */
+#if defined(DUK_F_HAVE_64BIT) && !defined(DUK_F_VBCC)
+#define DUK_USE_64BIT_OPS
+#else
+#undef DUK_USE_64BIT_OPS
+#endif
+
+/*
+ * Fill-ins for platform, architecture, and compiler
+ */
+
+/* An abort()-like primitive is needed by the default fatal error handler. */
+#if !defined(DUK_ABORT)
+#define DUK_ABORT abort
+#endif
+
+#if !defined(DUK_SETJMP)
+#define DUK_JMPBUF_TYPE jmp_buf
+#define DUK_SETJMP(jb) setjmp((jb))
+#define DUK_LONGJMP(jb) longjmp((jb), 1)
+#endif
+
+#if 0
+/* sigsetjmp() alternative */
+#define DUK_JMPBUF_TYPE sigjmp_buf
+#define DUK_SETJMP(jb) sigsetjmp((jb))
+#define DUK_LONGJMP(jb) siglongjmp((jb), 1)
+#endif
+
+/* Special naming to avoid conflict with e.g. DUK_FREE() in duk_heap.h
+ * (which is unfortunately named). May sometimes need replacement, e.g.
+ * some compilers don't handle zero length or NULL correctly in realloc().
+ */
+#if !defined(DUK_ANSI_MALLOC)
+#define DUK_ANSI_MALLOC malloc
+#endif
+#if !defined(DUK_ANSI_REALLOC)
+#define DUK_ANSI_REALLOC realloc
+#endif
+#if !defined(DUK_ANSI_CALLOC)
+#define DUK_ANSI_CALLOC calloc
+#endif
+#if !defined(DUK_ANSI_FREE)
+#define DUK_ANSI_FREE free
+#endif
+
+/* ANSI C (various versions) and some implementations require that the
+ * pointer arguments to memset(), memcpy(), and memmove() be valid values
+ * even when byte size is 0 (even a NULL pointer is considered invalid in
+ * this context). Zero-size operations as such are allowed, as long as their
+ * pointer arguments point to a valid memory area. The DUK_MEMSET(),
+ * DUK_MEMCPY(), and DUK_MEMMOVE() macros require this same behavior, i.e.:
+ * (1) pointers must be valid and non-NULL, (2) zero size must otherwise be
+ * allowed. If these are not fulfilled, a macro wrapper is needed.
+ *
+ * http://stackoverflow.com/questions/5243012/is-it-guaranteed-to-be-safe-to-perform-memcpy0-0-0
+ * http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-October/011065.html
+ *
+ * Not sure what's the required behavior when a pointer points just past the
+ * end of a buffer, which often happens in practice (e.g. zero size memmoves).
+ * For example, if allocation size is 3, the following pointer would not
+ * technically point to a valid memory byte:
+ *
+ * <-- alloc -->
+ * | 0 | 1 | 2 | .....
+ * ^-- p=3, points after last valid byte (2)
+ */
+#if !defined(DUK_MEMCPY)
+#if defined(DUK_F_UCLIBC)
+/* Old uclibcs have a broken memcpy so use memmove instead (this is overly wide
+ * now on purpose): http://lists.uclibc.org/pipermail/uclibc-cvs/2008-October/025511.html
+ */
+#define DUK_MEMCPY memmove
+#else
+#define DUK_MEMCPY memcpy
+#endif
+#endif
+#if !defined(DUK_MEMMOVE)
+#define DUK_MEMMOVE memmove
+#endif
+#if !defined(DUK_MEMCMP)
+#define DUK_MEMCMP memcmp
+#endif
+#if !defined(DUK_MEMSET)
+#define DUK_MEMSET memset
+#endif
+#if !defined(DUK_STRLEN)
+#define DUK_STRLEN strlen
+#endif
+#if !defined(DUK_STRCMP)
+#define DUK_STRCMP strcmp
+#endif
+#if !defined(DUK_STRNCMP)
+#define DUK_STRNCMP strncmp
+#endif
+#if !defined(DUK_SPRINTF)
+#define DUK_SPRINTF sprintf
+#endif
+#if !defined(DUK_SNPRINTF)
+/* snprintf() is technically not part of C89 but usually available. */
+#define DUK_SNPRINTF snprintf
+#endif
+#if !defined(DUK_VSPRINTF)
+#define DUK_VSPRINTF vsprintf
+#endif
+#if !defined(DUK_VSNPRINTF)
+/* vsnprintf() is technically not part of C89 but usually available. */
+#define DUK_VSNPRINTF vsnprintf
+#endif
+#if !defined(DUK_SSCANF)
+#define DUK_SSCANF sscanf
+#endif
+#if !defined(DUK_VSSCANF)
+#define DUK_VSSCANF vsscanf
+#endif
+#if !defined(DUK_MEMZERO)
+#define DUK_MEMZERO(p,n) DUK_MEMSET((p), 0, (n))
+#endif
+
+#if !defined(DUK_DOUBLE_INFINITY)
+#undef DUK_USE_COMPUTED_INFINITY
+#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION < 40600)
+/* GCC older than 4.6: avoid overflow warnings related to using INFINITY */
+#define DUK_DOUBLE_INFINITY (__builtin_inf())
+#elif defined(INFINITY)
+#define DUK_DOUBLE_INFINITY ((double) INFINITY)
+#elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \
+ !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX)
+#define DUK_DOUBLE_INFINITY (1.0 / 0.0)
+#else
+/* In VBCC (1.0 / 0.0) results in a warning and 0.0 instead of infinity.
+ * Use a computed infinity (initialized when a heap is created at the
+ * latest).
+ */
+#define DUK_USE_COMPUTED_INFINITY
+#define DUK_DOUBLE_INFINITY duk_computed_infinity
+#endif
+#endif
+
+#if !defined(DUK_DOUBLE_NAN)
+#undef DUK_USE_COMPUTED_NAN
+#if defined(NAN)
+#define DUK_DOUBLE_NAN NAN
+#elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \
+ !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX)
+#define DUK_DOUBLE_NAN (0.0 / 0.0)
+#else
+/* In VBCC (0.0 / 0.0) results in a warning and 0.0 instead of NaN.
+ * In MSVC (VS2010 Express) (0.0 / 0.0) results in a compile error.
+ * Use a computed NaN (initialized when a heap is created at the
+ * latest).
+ */
+#define DUK_USE_COMPUTED_NAN
+#define DUK_DOUBLE_NAN duk_computed_nan
+#endif
+#endif
+
+/* Many platforms are missing fpclassify() and friends, so use replacements
+ * if necessary. The replacement constants (FP_NAN etc) can be anything but
+ * match Linux constants now.
+ */
+#undef DUK_USE_REPL_FPCLASSIFY
+#undef DUK_USE_REPL_SIGNBIT
+#undef DUK_USE_REPL_ISFINITE
+#undef DUK_USE_REPL_ISNAN
+#undef DUK_USE_REPL_ISINF
+
+/* Complex condition broken into separate parts. */
+#undef DUK_F_USE_REPL_ALL
+#if !(defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO) && \
+ defined(FP_SUBNORMAL) && defined(FP_NORMAL))
+/* Missing some obvious constants. */
+#define DUK_F_USE_REPL_ALL
+#elif defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC)
+/* VBCC is missing the built-ins even in C99 mode (perhaps a header issue). */
+#define DUK_F_USE_REPL_ALL
+#elif defined(DUK_F_AMIGAOS) && defined(DUK_F_M68K)
+/* AmigaOS + M68K seems to have math issues even when using GCC cross
+ * compilation. Use replacements for all AmigaOS versions on M68K
+ * regardless of compiler.
+ */
+#define DUK_F_USE_REPL_ALL
+#elif defined(DUK_F_FREEBSD) && defined(DUK_F_CLANG)
+/* Placeholder fix for (detection is wider than necessary):
+ * http://llvm.org/bugs/show_bug.cgi?id=17788
+ */
+#define DUK_F_USE_REPL_ALL
+#elif defined(DUK_F_UCLIBC)
+/* At least some uclibc versions have broken floating point math. For
+ * example, fpclassify() can incorrectly classify certain NaN formats.
+ * To be safe, use replacements.
+ */
+#define DUK_F_USE_REPL_ALL
+#elif defined(DUK_F_AIX)
+/* Older versions may be missing isnan(), etc. */
+#define DUK_F_USE_REPL_ALL
+#endif
+
+#if defined(DUK_F_USE_REPL_ALL)
+#define DUK_USE_REPL_FPCLASSIFY
+#define DUK_USE_REPL_SIGNBIT
+#define DUK_USE_REPL_ISFINITE
+#define DUK_USE_REPL_ISNAN
+#define DUK_USE_REPL_ISINF
+#define DUK_FPCLASSIFY duk_repl_fpclassify
+#define DUK_SIGNBIT duk_repl_signbit
+#define DUK_ISFINITE duk_repl_isfinite
+#define DUK_ISNAN duk_repl_isnan
+#define DUK_ISINF duk_repl_isinf
+#define DUK_FP_NAN 0
+#define DUK_FP_INFINITE 1
+#define DUK_FP_ZERO 2
+#define DUK_FP_SUBNORMAL 3
+#define DUK_FP_NORMAL 4
+#else
+#define DUK_FPCLASSIFY fpclassify
+#define DUK_SIGNBIT signbit
+#define DUK_ISFINITE isfinite
+#define DUK_ISNAN isnan
+#define DUK_ISINF isinf
+#define DUK_FP_NAN FP_NAN
+#define DUK_FP_INFINITE FP_INFINITE
+#define DUK_FP_ZERO FP_ZERO
+#define DUK_FP_SUBNORMAL FP_SUBNORMAL
+#define DUK_FP_NORMAL FP_NORMAL
+#endif
+
+#if defined(DUK_F_USE_REPL_ALL)
+#undef DUK_F_USE_REPL_ALL
+#endif
+
+/* These functions don't currently need replacement but are wrapped for
+ * completeness. Because these are used as function pointers, they need
+ * to be defined as concrete C functions (not macros).
+ */
+#if !defined(DUK_FABS)
+#define DUK_FABS fabs
+#endif
+#if !defined(DUK_FLOOR)
+#define DUK_FLOOR floor
+#endif
+#if !defined(DUK_CEIL)
+#define DUK_CEIL ceil
+#endif
+#if !defined(DUK_FMOD)
+#define DUK_FMOD fmod
+#endif
+#if !defined(DUK_POW)
+#define DUK_POW pow
+#endif
+#if !defined(DUK_ACOS)
+#define DUK_ACOS acos
+#endif
+#if !defined(DUK_ASIN)
+#define DUK_ASIN asin
+#endif
+#if !defined(DUK_ATAN)
+#define DUK_ATAN atan
+#endif
+#if !defined(DUK_ATAN2)
+#define DUK_ATAN2 atan2
+#endif
+#if !defined(DUK_SIN)
+#define DUK_SIN sin
+#endif
+#if !defined(DUK_COS)
+#define DUK_COS cos
+#endif
+#if !defined(DUK_TAN)
+#define DUK_TAN tan
+#endif
+#if !defined(DUK_EXP)
+#define DUK_EXP exp
+#endif
+#if !defined(DUK_LOG)
+#define DUK_LOG log
+#endif
+#if !defined(DUK_SQRT)
+#define DUK_SQRT sqrt
+#endif
+
+/* The functions below exist only in C99/C++11 or later and need a workaround
+ * for platforms that don't include them. MSVC isn't detected as C99, but
+ * these functions also exist in MSVC 2013 and later so include a clause for
+ * that too. Android doesn't have log2; disable all of these for Android.
+ */
+#if (defined(DUK_F_C99) || defined(DUK_F_CPP11) || (defined(_MSC_VER) && (_MSC_VER >= 1800))) && \
+ !defined(DUK_F_ANDROID) && !defined(DUK_F_MINT)
+#if !defined(DUK_CBRT)
+#define DUK_CBRT cbrt
+#endif
+#if !defined(DUK_LOG2)
+#define DUK_LOG2 log2
+#endif
+#if !defined(DUK_LOG10)
+#define DUK_LOG10 log10
+#endif
+#if !defined(DUK_TRUNC)
+#define DUK_TRUNC trunc
+#endif
+#endif /* DUK_F_C99 etc */
+
+/* NetBSD 6.0 x86 (at least) has a few problems with pow() semantics,
+ * see test-bug-netbsd-math-pow.js. MinGW has similar (but different)
+ * issues, see test-bug-mingw-math-issues.js. Enable pow() workarounds
+ * for these targets.
+ */
+#undef DUK_USE_POW_WORKAROUNDS
+#if defined(DUK_F_NETBSD) || defined(DUK_F_MINGW)
+#define DUK_USE_POW_WORKAROUNDS
+#endif
+
+/* Similar workarounds for atan2() semantics issues. MinGW issues are
+ * documented in test-bug-mingw-math-issues.js.
+ */
+#undef DUK_USE_ATAN2_WORKAROUNDS
+#if defined(DUK_F_MINGW)
+#define DUK_USE_ATAN2_WORKAROUNDS
+#endif
+
+/* Rely as little as possible on compiler behavior for NaN comparison,
+ * signed zero handling, etc. Currently never activated but may be needed
+ * for broken compilers.
+ */
+#undef DUK_USE_PARANOID_MATH
+
+/* There was a curious bug where test-bi-date-canceling.js would fail e.g.
+ * on 64-bit Ubuntu, gcc-4.8.1, -m32, and no -std=c99. Some date computations
+ * using doubles would be optimized which then broke some corner case tests.
+ * The problem goes away by adding 'volatile' to the datetime computations.
+ * Not sure what the actual triggering conditions are, but using this on
+ * non-C99 systems solves the known issues and has relatively little cost
+ * on other platforms.
+ */
+#undef DUK_USE_PARANOID_DATE_COMPUTATION
+#if !defined(DUK_F_C99)
+#define DUK_USE_PARANOID_DATE_COMPUTATION
+#endif
+
+/*
+ * Byte order and double memory layout detection
+ *
+ * Endianness detection is a major portability hassle because the macros
+ * and headers are not standardized. There's even variance across UNIX
+ * platforms. Even with "standard" headers, details like underscore count
+ * varies between platforms, e.g. both __BYTE_ORDER and _BYTE_ORDER are used
+ * (Crossbridge has a single underscore, for instance).
+ *
+ * The checks below are structured with this in mind: several approaches are
+ * used, and at the end we check if any of them worked. This allows generic
+ * approaches to be tried first, and platform/compiler specific hacks tried
+ * last. As a last resort, the user can force a specific endianness, as it's
+ * not likely that automatic detection will work on the most exotic platforms.
+ *
+ * Duktape supports little and big endian machines. There's also support
+ * for a hybrid used by some ARM machines where integers are little endian
+ * but IEEE double values use a mixed order (12345678 -> 43218765). This
+ * byte order for doubles is referred to as "mixed endian".
+ */
+
+/* GCC and Clang provide endianness defines as built-in predefines, with
+ * leading and trailing double underscores (e.g. __BYTE_ORDER__). See
+ * output of "make gccpredefs" and "make clangpredefs". Clang doesn't
+ * seem to provide __FLOAT_WORD_ORDER__; assume not mixed endian for clang.
+ * http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
+ */
+#if !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__)
+#if defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#define DUK_USE_BYTEORDER 1
+#elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define DUK_USE_BYTEORDER 2
+#elif !defined(__FLOAT_WORD_ORDER__)
+/* Float word order not known, assume not a hybrid. */
+#define DUK_USE_BYTEORDER 1
+#else
+/* Byte order is little endian but cannot determine IEEE double word order. */
+#endif /* float word order */
+#elif defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+#if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define DUK_USE_BYTEORDER 3
+#elif !defined(__FLOAT_WORD_ORDER__)
+/* Float word order not known, assume not a hybrid. */
+#define DUK_USE_BYTEORDER 3
+#else
+/* Byte order is big endian but cannot determine IEEE double word order. */
+#endif /* float word order */
+#else
+/* Cannot determine byte order; __ORDER_PDP_ENDIAN__ is related to 32-bit
+ * integer ordering and is not relevant.
+ */
+#endif /* integer byte order */
+#endif /* !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__) */
+
+/* More or less standard endianness predefines provided by header files.
+ * The ARM hybrid case is detected by assuming that __FLOAT_WORD_ORDER
+ * will be big endian, see: http://lists.mysql.com/internals/443.
+ * On some platforms some defines may be present with an empty value which
+ * causes comparisons to fail: https://github.com/svaarala/duktape/issues/453.
+ */
+#if !defined(DUK_USE_BYTEORDER)
+#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN) || \
+ defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN) || \
+ defined(__LITTLE_ENDIAN__)
+#if defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) || \
+ defined(_FLOAT_WORD_ORDER) && defined(_LITTLE_ENDIAN) && (_FLOAT_WORD_ORDER == _LITTLE_ENDIAN)
+#define DUK_USE_BYTEORDER 1
+#elif defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \
+ defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN)
+#define DUK_USE_BYTEORDER 2
+#elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER)
+/* Float word order not known, assume not a hybrid. */
+#define DUK_USE_BYTEORDER 1
+#else
+/* Byte order is little endian but cannot determine IEEE double word order. */
+#endif /* float word order */
+#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN) || \
+ defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN) || \
+ defined(__BIG_ENDIAN__)
+#if defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \
+ defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN)
+#define DUK_USE_BYTEORDER 3
+#elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER)
+/* Float word order not known, assume not a hybrid. */
+#define DUK_USE_BYTEORDER 3
+#else
+/* Byte order is big endian but cannot determine IEEE double word order. */
+#endif /* float word order */
+#else
+/* Cannot determine byte order. */
+#endif /* integer byte order */
+#endif /* !defined(DUK_USE_BYTEORDER) */
+
+/* QNX gcc cross compiler seems to define e.g. __LITTLEENDIAN__ or __BIGENDIAN__:
+ * $ /opt/qnx650/host/linux/x86/usr/bin/i486-pc-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian
+ * 67:#define __LITTLEENDIAN__ 1
+ * $ /opt/qnx650/host/linux/x86/usr/bin/mips-unknown-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian
+ * 81:#define __BIGENDIAN__ 1
+ * $ /opt/qnx650/host/linux/x86/usr/bin/arm-unknown-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian
+ * 70:#define __LITTLEENDIAN__ 1
+ */
+#if !defined(DUK_USE_BYTEORDER)
+#if defined(__LITTLEENDIAN__)
+#define DUK_USE_BYTEORDER 1
+#elif defined(__BIGENDIAN__)
+#define DUK_USE_BYTEORDER 3
+#endif
+#endif
+
+/*
+ * Alignment requirement and support for unaligned accesses
+ *
+ * Assume unaligned accesses are not supported unless specifically allowed
+ * in the target platform. Some platforms may support unaligned accesses
+ * but alignment to 4 or 8 may still be desirable.
+ */
+
+/* If not provided, use safe default for alignment. */
+#if !defined(DUK_USE_ALIGN_BY)
+#define DUK_USE_ALIGN_BY 8
+#endif
+
+/* Compiler specific hackery needed to force struct size to match aligment,
+ * see e.g. duk_hbuffer.h.
+ *
+ * http://stackoverflow.com/questions/11130109/c-struct-size-alignment
+ * http://stackoverflow.com/questions/10951039/specifying-64-bit-alignment
+ */
+#if !(defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_GCC_ATTR) || \
+ defined(DUK_USE_PACK_CLANG_ATTR) || defined(DUK_USE_PACK_DUMMY_MEMBER))
+#define DUK_USE_PACK_DUMMY_MEMBER
+#endif
+
+#if !defined(DUK_VA_COPY)
+/* We need va_copy() which is defined in C99 / C++11, so an awkward
+ * replacement is needed for pre-C99 / pre-C++11 environments. This
+ * will quite likely need portability hacks for some non-C99
+ * environments.
+ */
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+/* C99 / C++11 and above: rely on va_copy() which is required.
+ * Omit parenthesis on macro right side on purpose to minimize differences
+ * to direct use.
+ */
+#define DUK_VA_COPY(dest,src) va_copy(dest,src)
+#else
+/* Pre-C99: va_list type is implementation dependent. This replacement
+ * assumes it is a plain value so that a simple assignment will work.
+ * This is not the case on all platforms (it may be a single-array element,
+ * for instance).
+ */
+#define DUK_VA_COPY(dest,src) do { (dest) = (src); } while (0)
+#endif
+#endif
+
+#if !defined(DUK_MACRO_STRINGIFY)
+/* Macro hackery to convert e.g. __LINE__ to a string without formatting,
+ * see: http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string
+ */
+#define DUK_MACRO_STRINGIFY_HELPER(x) #x
+#define DUK_MACRO_STRINGIFY(x) DUK_MACRO_STRINGIFY_HELPER(x)
+#endif
+
+#if !defined(DUK_CAUSE_SEGFAULT)
+/* This can be used for testing; valgrind will then indicate the C call stack
+ * leading to the call site.
+ */
+#define DUK_CAUSE_SEGFAULT() do { *((volatile duk_uint32_t *) NULL) = (duk_uint32_t) 0xdeadbeefUL; } while (0)
+#endif
+#if !defined(DUK_UNREF)
+/* Macro for suppressing warnings for potentially unreferenced variables.
+ * The variables can be actually unreferenced or unreferenced in some
+ * specific cases only; for instance, if a variable is only debug printed,
+ * it is unreferenced when debug printing is disabled. May cause warnings
+ * for volatile arguments.
+ */
+#define DUK_UNREF(x) do { (void) (x); } while (0)
+#endif
+#if !defined(DUK_NORETURN)
+#define DUK_NORETURN(decl) decl
+#endif
+#if !defined(DUK_UNREACHABLE)
+/* Don't know how to declare unreachable point, so don't do it; this
+ * may cause some spurious compilation warnings (e.g. "variable used
+ * uninitialized").
+ */
+#define DUK_UNREACHABLE() do { } while (0)
+#endif
+#if !defined(DUK_LOSE_CONST)
+/* Convert any input pointer into a "void *", losing a const qualifier.
+ * This is not fully portable because casting through duk_uintptr_t may
+ * not work on all architectures (e.g. those with long, segmented pointers).
+ */
+#define DUK_LOSE_CONST(src) ((void *) (duk_uintptr_t) (src))
+#endif
+
+#if !defined(DUK_LIKELY)
+#define DUK_LIKELY(x) (x)
+#endif
+#if !defined(DUK_UNLIKELY)
+#define DUK_UNLIKELY(x) (x)
+#endif
+#if !defined(DUK_UNPREDICTABLE)
+#define DUK_UNPREDICTABLE(x) (x)
+#endif
+
+#if !defined(DUK_NOINLINE)
+#define DUK_NOINLINE /*nop*/
+#endif
+#if !defined(DUK_INLINE)
+#define DUK_INLINE /*nop*/
+#endif
+#if !defined(DUK_ALWAYS_INLINE)
+#define DUK_ALWAYS_INLINE /*nop*/
+#endif
+
+#if !defined(DUK_HOT)
+#define DUK_HOT /*nop*/
+#endif
+#if !defined(DUK_COLD)
+#define DUK_COLD /*nop*/
+#endif
+
+#if !defined(DUK_EXTERNAL_DECL)
+#define DUK_EXTERNAL_DECL extern
+#endif
+#if !defined(DUK_EXTERNAL)
+#define DUK_EXTERNAL /*empty*/
+#endif
+#if !defined(DUK_INTERNAL_DECL)
+#if defined(DUK_SINGLE_FILE)
+#define DUK_INTERNAL_DECL static
+#else
+#define DUK_INTERNAL_DECL extern
+#endif
+#endif
+#if !defined(DUK_INTERNAL)
+#if defined(DUK_SINGLE_FILE)
+#define DUK_INTERNAL static
+#else
+#define DUK_INTERNAL /*empty*/
+#endif
+#endif
+#if !defined(DUK_LOCAL_DECL)
+#define DUK_LOCAL_DECL static
+#endif
+#if !defined(DUK_LOCAL)
+#define DUK_LOCAL static
+#endif
+
+#if !defined(DUK_FILE_MACRO)
+#define DUK_FILE_MACRO __FILE__
+#endif
+#if !defined(DUK_LINE_MACRO)
+#define DUK_LINE_MACRO __LINE__
+#endif
+#if !defined(DUK_FUNC_MACRO)
+#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
+#define DUK_FUNC_MACRO __func__
+#elif defined(__FUNCTION__)
+#define DUK_FUNC_MACRO __FUNCTION__
+#else
+#define DUK_FUNC_MACRO "unknown"
+#endif
+#endif
+
+#if !defined(DUK_BSWAP32)
+#define DUK_BSWAP32(x) \
+ ((((duk_uint32_t) (x)) >> 24) | \
+ ((((duk_uint32_t) (x)) >> 8) & 0xff00UL) | \
+ ((((duk_uint32_t) (x)) << 8) & 0xff0000UL) | \
+ (((duk_uint32_t) (x)) << 24))
+#endif
+#if !defined(DUK_BSWAP16)
+#define DUK_BSWAP16(x) \
+ ((duk_uint16_t) (x) >> 8) | \
+ ((duk_uint16_t) (x) << 8)
+#endif
+
+/* DUK_USE_VARIADIC_MACROS: required from compilers, so no fill-in. */
+/* DUK_USE_UNION_INITIALIZERS: required from compilers, so no fill-in. */
+
+#if !(defined(DUK_USE_FLEX_C99) || defined(DUK_USE_FLEX_ZEROSIZE) || defined(DUK_USE_FLEX_ONESIZE))
+#if defined(DUK_F_C99)
+#define DUK_USE_FLEX_C99
+#else
+#define DUK_USE_FLEX_ZEROSIZE /* Not standard but common enough */
+#endif
+#endif
+
+#if !(defined(DUK_USE_PACK_GCC_ATTR) || defined(DUK_USE_PACK_CLANG_ATTR) || \
+ defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_DUMMY_MEMBER))
+#define DUK_USE_PACK_DUMMY_MEMBER
+#endif
+
+#if 0 /* not defined by default */
+#undef DUK_USE_GCC_PRAGMAS
+#endif
+
+#if !defined(DUK_U64_CONSTANT)
+#define DUK_U64_CONSTANT(x) x##ULL
+#endif
+#if !defined(DUK_I64_CONSTANT)
+#define DUK_I64_CONSTANT(x) x##LL
+#endif
+
+/* Workaround for GH-323: avoid inlining control when compiling from
+ * multiple sources, as it causes compiler portability trouble.
+ */
+#if !defined(DUK_SINGLE_FILE)
+#undef DUK_NOINLINE
+#undef DUK_INLINE
+#undef DUK_ALWAYS_INLINE
+#define DUK_NOINLINE /*nop*/
+#define DUK_INLINE /*nop*/
+#define DUK_ALWAYS_INLINE /*nop*/
+#endif
+
+/*
+ * Check whether or not a packed duk_tval representation is possible.
+ * What's basically required is that pointers are 32-bit values
+ * (sizeof(void *) == 4). Best effort check, not always accurate.
+ * If guess goes wrong, crashes may result; self tests also verify
+ * the guess.
+ */
+
+/* Explicit marker needed; may be 'defined', 'undefined, 'or 'not provided'. */
+#if !defined(DUK_F_PACKED_TVAL_PROVIDED)
+#undef DUK_F_PACKED_TVAL_POSSIBLE
+
+/* Strict C99 case: DUK_UINTPTR_MAX (= UINTPTR_MAX) should be very reliable */
+#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX)
+#if (DUK_UINTPTR_MAX <= 0xffffffffUL)
+#define DUK_F_PACKED_TVAL_POSSIBLE
+#endif
+#endif
+
+/* Non-C99 case, still relying on DUK_UINTPTR_MAX, as long as it is not a computed value */
+#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX) && !defined(DUK_UINTPTR_MAX_COMPUTED)
+#if (DUK_UINTPTR_MAX <= 0xffffffffUL)
+#define DUK_F_PACKED_TVAL_POSSIBLE
+#endif
+#endif
+
+/* DUK_SIZE_MAX (= SIZE_MAX) is often reliable */
+#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_SIZE_MAX) && !defined(DUK_SIZE_MAX_COMPUTED)
+#if (DUK_SIZE_MAX <= 0xffffffffUL)
+#define DUK_F_PACKED_TVAL_POSSIBLE
+#endif
+#endif
+
+#undef DUK_USE_PACKED_TVAL
+#if defined(DUK_F_PACKED_TVAL_POSSIBLE)
+#define DUK_USE_PACKED_TVAL
+#endif
+
+#undef DUK_F_PACKED_TVAL_POSSIBLE
+#endif /* DUK_F_PACKED_TVAL_PROVIDED */
+/* Object property allocation layout has implications for memory and code
+ * footprint and generated code size/speed. The best layout also depends
+ * on whether the platform has alignment requirements or benefits from
+ * having mostly aligned accesses.
+ */
+#undef DUK_USE_HOBJECT_LAYOUT_1
+#undef DUK_USE_HOBJECT_LAYOUT_2
+#undef DUK_USE_HOBJECT_LAYOUT_3
+#if (DUK_USE_ALIGN_BY == 1)
+/* On platforms without any alignment issues, layout 1 is preferable
+ * because it compiles to slightly less code and provides direct access
+ * to property keys.
+ */
+#define DUK_USE_HOBJECT_LAYOUT_1
+#else
+/* On other platforms use layout 2, which requires some padding but
+ * is a bit more natural than layout 3 in ordering the entries. Layout
+ * 3 is currently not used.
+ */
+#define DUK_USE_HOBJECT_LAYOUT_2
+#endif
+
+/* GCC/clang inaccurate math would break compliance and probably duk_tval,
+ * so refuse to compile. Relax this if -ffast-math is tested to work.
+ */
+#if defined(__FAST_MATH__)
+#error __FAST_MATH__ defined, refusing to compile
+#endif
+
+/*
+ * Autogenerated defaults
+ */
+
+#define DUK_USE_ARRAY_BUILTIN
+#define DUK_USE_ARRAY_FASTPATH
+#define DUK_USE_ARRAY_PROP_FASTPATH
+#undef DUK_USE_ASSERTIONS
+#define DUK_USE_AUGMENT_ERROR_CREATE
+#define DUK_USE_AUGMENT_ERROR_THROW
+#define DUK_USE_AVOID_PLATFORM_FUNCPTRS
+#define DUK_USE_BASE64_FASTPATH
+#define DUK_USE_BOOLEAN_BUILTIN
+#define DUK_USE_BUFFEROBJECT_SUPPORT
+#undef DUK_USE_BUFLEN16
+#define DUK_USE_BYTECODE_DUMP_SUPPORT
+#define DUK_USE_CACHE_ACTIVATION
+#define DUK_USE_CACHE_CATCHER
+#define DUK_USE_CALLSTACK_LIMIT 10000
+#define DUK_USE_COMMONJS_MODULES
+#define DUK_USE_COMPILER_RECLIMIT 2500
+#define DUK_USE_COROUTINE_SUPPORT
+#undef DUK_USE_CPP_EXCEPTIONS
+#undef DUK_USE_DATAPTR16
+#undef DUK_USE_DATAPTR_DEC16
+#undef DUK_USE_DATAPTR_ENC16
+#define DUK_USE_DATE_BUILTIN
+#undef DUK_USE_DATE_FORMAT_STRING
+#undef DUK_USE_DATE_GET_LOCAL_TZOFFSET
+#undef DUK_USE_DATE_GET_NOW
+#undef DUK_USE_DATE_PARSE_STRING
+#undef DUK_USE_DATE_PRS_GETDATE
+#undef DUK_USE_DEBUG
+#undef DUK_USE_DEBUGGER_DUMPHEAP
+#undef DUK_USE_DEBUGGER_INSPECT
+#undef DUK_USE_DEBUGGER_PAUSE_UNCAUGHT
+#undef DUK_USE_DEBUGGER_SUPPORT
+#define DUK_USE_DEBUGGER_THROW_NOTIFY
+#undef DUK_USE_DEBUGGER_TRANSPORT_TORTURE
+#define DUK_USE_DEBUG_BUFSIZE 65536L
+#define DUK_USE_DEBUG_LEVEL 0
+#undef DUK_USE_DEBUG_WRITE
+#define DUK_USE_DOUBLE_LINKED_HEAP
+#define DUK_USE_DUKTAPE_BUILTIN
+#define DUK_USE_ENCODING_BUILTINS
+#define DUK_USE_ERRCREATE
+#define DUK_USE_ERRTHROW
+#define DUK_USE_ES6
+#define DUK_USE_ES6_OBJECT_PROTO_PROPERTY
+#define DUK_USE_ES6_OBJECT_SETPROTOTYPEOF
+#define DUK_USE_ES6_PROXY
+#define DUK_USE_ES6_REGEXP_SYNTAX
+#define DUK_USE_ES6_UNICODE_ESCAPE
+#define DUK_USE_ES7
+#define DUK_USE_ES7_EXP_OPERATOR
+#define DUK_USE_ES8
+#define DUK_USE_ES9
+#define DUK_USE_ESBC_LIMITS
+#define DUK_USE_ESBC_MAX_BYTES 2147418112L
+#define DUK_USE_ESBC_MAX_LINENUMBER 2147418112L
+#undef DUK_USE_EXEC_FUN_LOCAL
+#undef DUK_USE_EXEC_INDIRECT_BOUND_CHECK
+#undef DUK_USE_EXEC_PREFER_SIZE
+#define DUK_USE_EXEC_REGCONST_OPTIMIZE
+#undef DUK_USE_EXEC_TIMEOUT_CHECK
+#undef DUK_USE_EXPLICIT_NULL_INIT
+#undef DUK_USE_EXTSTR_FREE
+#undef DUK_USE_EXTSTR_INTERN_CHECK
+#undef DUK_USE_FASTINT
+#define DUK_USE_FAST_REFCOUNT_DEFAULT
+#undef DUK_USE_FATAL_HANDLER
+#define DUK_USE_FATAL_MAXLEN 128
+#define DUK_USE_FINALIZER_SUPPORT
+#undef DUK_USE_FINALIZER_TORTURE
+#undef DUK_USE_FUNCPTR16
+#undef DUK_USE_FUNCPTR_DEC16
+#undef DUK_USE_FUNCPTR_ENC16
+#define DUK_USE_FUNCTION_BUILTIN
+#define DUK_USE_FUNC_FILENAME_PROPERTY
+#define DUK_USE_FUNC_NAME_PROPERTY
+#undef DUK_USE_GC_TORTURE
+#undef DUK_USE_GET_MONOTONIC_TIME
+#undef DUK_USE_GET_RANDOM_DOUBLE
+#undef DUK_USE_GLOBAL_BINDING
+#define DUK_USE_GLOBAL_BUILTIN
+#undef DUK_USE_HEAPPTR16
+#undef DUK_USE_HEAPPTR_DEC16
+#undef DUK_USE_HEAPPTR_ENC16
+#define DUK_USE_HEX_FASTPATH
+#define DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT 2
+#define DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT 9
+#define DUK_USE_HOBJECT_ARRAY_MINGROW_ADD 16
+#define DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR 8
+#define DUK_USE_HOBJECT_ENTRY_MINGROW_ADD 16
+#define DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR 8
+#define DUK_USE_HOBJECT_HASH_PART
+#define DUK_USE_HOBJECT_HASH_PROP_LIMIT 8
+#define DUK_USE_HSTRING_ARRIDX
+#define DUK_USE_HSTRING_CLEN
+#undef DUK_USE_HSTRING_EXTDATA
+#define DUK_USE_HSTRING_LAZY_CLEN
+#define DUK_USE_HTML_COMMENTS
+#define DUK_USE_IDCHAR_FASTPATH
+#undef DUK_USE_INJECT_HEAP_ALLOC_ERROR
+#undef DUK_USE_INTERRUPT_COUNTER
+#undef DUK_USE_INTERRUPT_DEBUG_FIXUP
+#define DUK_USE_JC
+#define DUK_USE_JSON_BUILTIN
+#define DUK_USE_JSON_DECNUMBER_FASTPATH
+#define DUK_USE_JSON_DECSTRING_FASTPATH
+#define DUK_USE_JSON_DEC_RECLIMIT 1000
+#define DUK_USE_JSON_EATWHITE_FASTPATH
+#define DUK_USE_JSON_ENC_RECLIMIT 1000
+#define DUK_USE_JSON_QUOTESTRING_FASTPATH
+#undef DUK_USE_JSON_STRINGIFY_FASTPATH
+#define DUK_USE_JSON_SUPPORT
+#define DUK_USE_JX
+#define DUK_USE_LEXER_SLIDING_WINDOW
+#undef DUK_USE_LIGHTFUNC_BUILTINS
+#define DUK_USE_MARK_AND_SWEEP_RECLIMIT 256
+#define DUK_USE_MATH_BUILTIN
+#define DUK_USE_NATIVE_CALL_RECLIMIT 1000
+#define DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER
+#define DUK_USE_NONSTD_ARRAY_MAP_TRAILER
+#define DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT
+#undef DUK_USE_NONSTD_FUNC_CALLER_PROPERTY
+#undef DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY
+#define DUK_USE_NONSTD_FUNC_STMT
+#define DUK_USE_NONSTD_GETTER_KEY_ARGUMENT
+#define DUK_USE_NONSTD_JSON_ESC_U2028_U2029
+#define DUK_USE_NONSTD_SETTER_KEY_ARGUMENT
+#define DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT
+#define DUK_USE_NUMBER_BUILTIN
+#define DUK_USE_OBJECT_BUILTIN
+#undef DUK_USE_OBJSIZES16
+#undef DUK_USE_PARANOID_ERRORS
+#define DUK_USE_PC2LINE
+#define DUK_USE_PERFORMANCE_BUILTIN
+#undef DUK_USE_PREFER_SIZE
+#undef DUK_USE_PROMISE_BUILTIN
+#define DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS
+#undef DUK_USE_REFCOUNT16
+#define DUK_USE_REFCOUNT32
+#define DUK_USE_REFERENCE_COUNTING
+#define DUK_USE_REFLECT_BUILTIN
+#define DUK_USE_REGEXP_CANON_BITMAP
+#undef DUK_USE_REGEXP_CANON_WORKAROUND
+#define DUK_USE_REGEXP_COMPILER_RECLIMIT 10000
+#define DUK_USE_REGEXP_EXECUTOR_RECLIMIT 10000
+#define DUK_USE_REGEXP_SUPPORT
+#undef DUK_USE_ROM_GLOBAL_CLONE
+#undef DUK_USE_ROM_GLOBAL_INHERIT
+#undef DUK_USE_ROM_OBJECTS
+#define DUK_USE_ROM_PTRCOMP_FIRST 63488L
+#undef DUK_USE_ROM_STRINGS
+#define DUK_USE_SECTION_B
+#undef DUK_USE_SELF_TESTS
+#define DUK_USE_SHEBANG_COMMENTS
+#undef DUK_USE_SHUFFLE_TORTURE
+#define DUK_USE_SOURCE_NONBMP
+#undef DUK_USE_STRHASH16
+#undef DUK_USE_STRHASH_DENSE
+#define DUK_USE_STRHASH_SKIP_SHIFT 5
+#define DUK_USE_STRICT_DECL
+#undef DUK_USE_STRICT_UTF8_SOURCE
+#define DUK_USE_STRING_BUILTIN
+#undef DUK_USE_STRLEN16
+#define DUK_USE_STRTAB_GROW_LIMIT 17
+#define DUK_USE_STRTAB_MAXSIZE 268435456L
+#define DUK_USE_STRTAB_MINSIZE 1024
+#undef DUK_USE_STRTAB_PTRCOMP
+#define DUK_USE_STRTAB_RESIZE_CHECK_MASK 255
+#define DUK_USE_STRTAB_SHRINK_LIMIT 6
+#undef DUK_USE_STRTAB_TORTURE
+#undef DUK_USE_SYMBOL_BUILTIN
+#define DUK_USE_TAILCALL
+#define DUK_USE_TARGET_INFO "unknown"
+#define DUK_USE_TRACEBACKS
+#define DUK_USE_TRACEBACK_DEPTH 10
+#define DUK_USE_USER_DECLARE() /* no user declarations */
+#define DUK_USE_VALSTACK_GROW_SHIFT 2
+#define DUK_USE_VALSTACK_LIMIT 1000000L
+#define DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT 2
+#define DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT 4
+#undef DUK_USE_VALSTACK_UNSAFE
+#define DUK_USE_VERBOSE_ERRORS
+#define DUK_USE_VERBOSE_EXECUTOR_ERRORS
+#define DUK_USE_VOLUNTARY_GC
+#define DUK_USE_ZERO_BUFFER_DATA
+
+/*
+ * You may add overriding #define/#undef directives below for
+ * customization. You of course cannot un-#include or un-typedef
+ * anything; these require direct changes above.
+ */
+
+/* __OVERRIDE_DEFINES__ */
+
+/*
+ * Date provider selection
+ *
+ * User may define DUK_USE_DATE_GET_NOW() etc directly, in which case we'll
+ * rely on an external provider. If this is not done, revert to previous
+ * behavior and use Unix/Windows built-in provider.
+ */
+
+#if defined(DUK_COMPILING_DUKTAPE)
+
+#if defined(DUK_USE_DATE_GET_NOW)
+/* External provider already defined. */
+#elif defined(DUK_USE_DATE_NOW_GETTIMEOFDAY)
+#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_gettimeofday()
+#elif defined(DUK_USE_DATE_NOW_TIME)
+#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_time()
+#elif defined(DUK_USE_DATE_NOW_WINDOWS)
+#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_windows()
+#elif defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS)
+#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_windows_subms()
+#else
+#error no provider for DUK_USE_DATE_GET_NOW()
+#endif
+
+#if defined(DUK_USE_DATE_GET_LOCAL_TZOFFSET)
+/* External provider already defined. */
+#elif defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME)
+#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_gmtime((d))
+#elif defined(DUK_USE_DATE_TZO_WINDOWS)
+#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_windows((d))
+#elif defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST)
+#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_windows_no_dst((d))
+#else
+#error no provider for DUK_USE_DATE_GET_LOCAL_TZOFFSET()
+#endif
+
+#if defined(DUK_USE_DATE_PARSE_STRING)
+/* External provider already defined. */
+#elif defined(DUK_USE_DATE_PRS_STRPTIME)
+#define DUK_USE_DATE_PARSE_STRING(ctx,str) duk_bi_date_parse_string_strptime((ctx), (str))
+#elif defined(DUK_USE_DATE_PRS_GETDATE)
+#define DUK_USE_DATE_PARSE_STRING(ctx,str) duk_bi_date_parse_string_getdate((ctx), (str))
+#else
+/* No provider for DUK_USE_DATE_PARSE_STRING(), fall back to ISO 8601 only. */
+#endif
+
+#if defined(DUK_USE_DATE_FORMAT_STRING)
+/* External provider already defined. */
+#elif defined(DUK_USE_DATE_FMT_STRFTIME)
+#define DUK_USE_DATE_FORMAT_STRING(ctx,parts,tzoffset,flags) \
+ duk_bi_date_format_parts_strftime((ctx), (parts), (tzoffset), (flags))
+#else
+/* No provider for DUK_USE_DATE_FORMAT_STRING(), fall back to ISO 8601 only. */
+#endif
+
+#if defined(DUK_USE_GET_MONOTONIC_TIME)
+/* External provider already defined. */
+#elif defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME)
+#define DUK_USE_GET_MONOTONIC_TIME(ctx) duk_bi_date_get_monotonic_time_clock_gettime()
+#elif defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC)
+#define DUK_USE_GET_MONOTONIC_TIME(ctx) duk_bi_date_get_monotonic_time_windows_qpc()
+#else
+/* No provider for DUK_USE_GET_MONOTONIC_TIME(), fall back to DUK_USE_DATE_GET_NOW(). */
+#endif
+
+#endif /* DUK_COMPILING_DUKTAPE */
+
+/*
+ * Checks for legacy feature options (DUK_OPT_xxx)
+ */
+
+#if defined(DUK_OPT_ASSERTIONS)
+#error unsupported legacy feature option DUK_OPT_ASSERTIONS used
+#endif
+#if defined(DUK_OPT_BUFFEROBJECT_SUPPORT)
+#error unsupported legacy feature option DUK_OPT_BUFFEROBJECT_SUPPORT used
+#endif
+#if defined(DUK_OPT_BUFLEN16)
+#error unsupported legacy feature option DUK_OPT_BUFLEN16 used
+#endif
+#if defined(DUK_OPT_DATAPTR16)
+#error unsupported legacy feature option DUK_OPT_DATAPTR16 used
+#endif
+#if defined(DUK_OPT_DATAPTR_DEC16)
+#error unsupported legacy feature option DUK_OPT_DATAPTR_DEC16 used
+#endif
+#if defined(DUK_OPT_DATAPTR_ENC16)
+#error unsupported legacy feature option DUK_OPT_DATAPTR_ENC16 used
+#endif
+#if defined(DUK_OPT_DDDPRINT)
+#error unsupported legacy feature option DUK_OPT_DDDPRINT used
+#endif
+#if defined(DUK_OPT_DDPRINT)
+#error unsupported legacy feature option DUK_OPT_DDPRINT used
+#endif
+#if defined(DUK_OPT_DEBUG)
+#error unsupported legacy feature option DUK_OPT_DEBUG used
+#endif
+#if defined(DUK_OPT_DEBUGGER_DUMPHEAP)
+#error unsupported legacy feature option DUK_OPT_DEBUGGER_DUMPHEAP used
+#endif
+#if defined(DUK_OPT_DEBUGGER_FWD_LOGGING)
+#error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_LOGGING used
+#endif
+#if defined(DUK_OPT_DEBUGGER_FWD_PRINTALERT)
+#error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_PRINTALERT used
+#endif
+#if defined(DUK_OPT_DEBUGGER_SUPPORT)
+#error unsupported legacy feature option DUK_OPT_DEBUGGER_SUPPORT used
+#endif
+#if defined(DUK_OPT_DEBUGGER_TRANSPORT_TORTURE)
+#error unsupported legacy feature option DUK_OPT_DEBUGGER_TRANSPORT_TORTURE used
+#endif
+#if defined(DUK_OPT_DEBUG_BUFSIZE)
+#error unsupported legacy feature option DUK_OPT_DEBUG_BUFSIZE used
+#endif
+#if defined(DUK_OPT_DECLARE)
+#error unsupported legacy feature option DUK_OPT_DECLARE used
+#endif
+#if defined(DUK_OPT_DEEP_C_STACK)
+#error unsupported legacy feature option DUK_OPT_DEEP_C_STACK used
+#endif
+#if defined(DUK_OPT_DLL_BUILD)
+#error unsupported legacy feature option DUK_OPT_DLL_BUILD used
+#endif
+#if defined(DUK_OPT_DPRINT)
+#error unsupported legacy feature option DUK_OPT_DPRINT used
+#endif
+#if defined(DUK_OPT_DPRINT_COLORS)
+#error unsupported legacy feature option DUK_OPT_DPRINT_COLORS used
+#endif
+#if defined(DUK_OPT_DPRINT_RDTSC)
+#error unsupported legacy feature option DUK_OPT_DPRINT_RDTSC used
+#endif
+#if defined(DUK_OPT_EXEC_TIMEOUT_CHECK)
+#error unsupported legacy feature option DUK_OPT_EXEC_TIMEOUT_CHECK used
+#endif
+#if defined(DUK_OPT_EXTERNAL_STRINGS)
+#error unsupported legacy feature option DUK_OPT_EXTERNAL_STRINGS used
+#endif
+#if defined(DUK_OPT_EXTSTR_FREE)
+#error unsupported legacy feature option DUK_OPT_EXTSTR_FREE used
+#endif
+#if defined(DUK_OPT_EXTSTR_INTERN_CHECK)
+#error unsupported legacy feature option DUK_OPT_EXTSTR_INTERN_CHECK used
+#endif
+#if defined(DUK_OPT_FASTINT)
+#error unsupported legacy feature option DUK_OPT_FASTINT used
+#endif
+#if defined(DUK_OPT_FORCE_ALIGN)
+#error unsupported legacy feature option DUK_OPT_FORCE_ALIGN used
+#endif
+#if defined(DUK_OPT_FORCE_BYTEORDER)
+#error unsupported legacy feature option DUK_OPT_FORCE_BYTEORDER used
+#endif
+#if defined(DUK_OPT_FUNCPTR16)
+#error unsupported legacy feature option DUK_OPT_FUNCPTR16 used
+#endif
+#if defined(DUK_OPT_FUNCPTR_DEC16)
+#error unsupported legacy feature option DUK_OPT_FUNCPTR_DEC16 used
+#endif
+#if defined(DUK_OPT_FUNCPTR_ENC16)
+#error unsupported legacy feature option DUK_OPT_FUNCPTR_ENC16 used
+#endif
+#if defined(DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY)
+#error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY used
+#endif
+#if defined(DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY)
+#error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY used
+#endif
+#if defined(DUK_OPT_GC_TORTURE)
+#error unsupported legacy feature option DUK_OPT_GC_TORTURE used
+#endif
+#if defined(DUK_OPT_HAVE_CUSTOM_H)
+#error unsupported legacy feature option DUK_OPT_HAVE_CUSTOM_H used
+#endif
+#if defined(DUK_OPT_HEAPPTR16)
+#error unsupported legacy feature option DUK_OPT_HEAPPTR16 used
+#endif
+#if defined(DUK_OPT_HEAPPTR_DEC16)
+#error unsupported legacy feature option DUK_OPT_HEAPPTR_DEC16 used
+#endif
+#if defined(DUK_OPT_HEAPPTR_ENC16)
+#error unsupported legacy feature option DUK_OPT_HEAPPTR_ENC16 used
+#endif
+#if defined(DUK_OPT_INTERRUPT_COUNTER)
+#error unsupported legacy feature option DUK_OPT_INTERRUPT_COUNTER used
+#endif
+#if defined(DUK_OPT_JSON_STRINGIFY_FASTPATH)
+#error unsupported legacy feature option DUK_OPT_JSON_STRINGIFY_FASTPATH used
+#endif
+#if defined(DUK_OPT_LIGHTFUNC_BUILTINS)
+#error unsupported legacy feature option DUK_OPT_LIGHTFUNC_BUILTINS used
+#endif
+#if defined(DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY)
+#error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY used
+#endif
+#if defined(DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY)
+#error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY used
+#endif
+#if defined(DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT)
+#error unsupported legacy feature option DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT used
+#endif
+#if defined(DUK_OPT_NO_AUGMENT_ERRORS)
+#error unsupported legacy feature option DUK_OPT_NO_AUGMENT_ERRORS used
+#endif
+#if defined(DUK_OPT_NO_BROWSER_LIKE)
+#error unsupported legacy feature option DUK_OPT_NO_BROWSER_LIKE used
+#endif
+#if defined(DUK_OPT_NO_BUFFEROBJECT_SUPPORT)
+#error unsupported legacy feature option DUK_OPT_NO_BUFFEROBJECT_SUPPORT used
+#endif
+#if defined(DUK_OPT_NO_BYTECODE_DUMP_SUPPORT)
+#error unsupported legacy feature option DUK_OPT_NO_BYTECODE_DUMP_SUPPORT used
+#endif
+#if defined(DUK_OPT_NO_COMMONJS_MODULES)
+#error unsupported legacy feature option DUK_OPT_NO_COMMONJS_MODULES used
+#endif
+#if defined(DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY)
+#error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY used
+#endif
+#if defined(DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF)
+#error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF used
+#endif
+#if defined(DUK_OPT_NO_ES6_PROXY)
+#error unsupported legacy feature option DUK_OPT_NO_ES6_PROXY used
+#endif
+#if defined(DUK_OPT_NO_FILE_IO)
+#error unsupported legacy feature option DUK_OPT_NO_FILE_IO used
+#endif
+#if defined(DUK_OPT_NO_FUNC_STMT)
+#error unsupported legacy feature option DUK_OPT_NO_FUNC_STMT used
+#endif
+#if defined(DUK_OPT_NO_JC)
+#error unsupported legacy feature option DUK_OPT_NO_JC used
+#endif
+#if defined(DUK_OPT_NO_JSONC)
+#error unsupported legacy feature option DUK_OPT_NO_JSONC used
+#endif
+#if defined(DUK_OPT_NO_JSONX)
+#error unsupported legacy feature option DUK_OPT_NO_JSONX used
+#endif
+#if defined(DUK_OPT_NO_JX)
+#error unsupported legacy feature option DUK_OPT_NO_JX used
+#endif
+#if defined(DUK_OPT_NO_MARK_AND_SWEEP)
+#error unsupported legacy feature option DUK_OPT_NO_MARK_AND_SWEEP used
+#endif
+#if defined(DUK_OPT_NO_MS_STRINGTABLE_RESIZE)
+#error unsupported legacy feature option DUK_OPT_NO_MS_STRINGTABLE_RESIZE used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_FUNC_STMT)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_FUNC_STMT used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029 used
+#endif
+#if defined(DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT)
+#error unsupported legacy feature option DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT used
+#endif
+#if defined(DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY)
+#error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY used
+#endif
+#if defined(DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF)
+#error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF used
+#endif
+#if defined(DUK_OPT_NO_OCTAL_SUPPORT)
+#error unsupported legacy feature option DUK_OPT_NO_OCTAL_SUPPORT used
+#endif
+#if defined(DUK_OPT_NO_PACKED_TVAL)
+#error unsupported legacy feature option DUK_OPT_NO_PACKED_TVAL used
+#endif
+#if defined(DUK_OPT_NO_PC2LINE)
+#error unsupported legacy feature option DUK_OPT_NO_PC2LINE used
+#endif
+#if defined(DUK_OPT_NO_REFERENCE_COUNTING)
+#error unsupported legacy feature option DUK_OPT_NO_REFERENCE_COUNTING used
+#endif
+#if defined(DUK_OPT_NO_REGEXP_SUPPORT)
+#error unsupported legacy feature option DUK_OPT_NO_REGEXP_SUPPORT used
+#endif
+#if defined(DUK_OPT_NO_SECTION_B)
+#error unsupported legacy feature option DUK_OPT_NO_SECTION_B used
+#endif
+#if defined(DUK_OPT_NO_SOURCE_NONBMP)
+#error unsupported legacy feature option DUK_OPT_NO_SOURCE_NONBMP used
+#endif
+#if defined(DUK_OPT_NO_STRICT_DECL)
+#error unsupported legacy feature option DUK_OPT_NO_STRICT_DECL used
+#endif
+#if defined(DUK_OPT_NO_TRACEBACKS)
+#error unsupported legacy feature option DUK_OPT_NO_TRACEBACKS used
+#endif
+#if defined(DUK_OPT_NO_VERBOSE_ERRORS)
+#error unsupported legacy feature option DUK_OPT_NO_VERBOSE_ERRORS used
+#endif
+#if defined(DUK_OPT_NO_VOLUNTARY_GC)
+#error unsupported legacy feature option DUK_OPT_NO_VOLUNTARY_GC used
+#endif
+#if defined(DUK_OPT_NO_ZERO_BUFFER_DATA)
+#error unsupported legacy feature option DUK_OPT_NO_ZERO_BUFFER_DATA used
+#endif
+#if defined(DUK_OPT_OBJSIZES16)
+#error unsupported legacy feature option DUK_OPT_OBJSIZES16 used
+#endif
+#if defined(DUK_OPT_PANIC_HANDLER)
+#error unsupported legacy feature option DUK_OPT_PANIC_HANDLER used
+#endif
+#if defined(DUK_OPT_REFCOUNT16)
+#error unsupported legacy feature option DUK_OPT_REFCOUNT16 used
+#endif
+#if defined(DUK_OPT_SEGFAULT_ON_PANIC)
+#error unsupported legacy feature option DUK_OPT_SEGFAULT_ON_PANIC used
+#endif
+#if defined(DUK_OPT_SELF_TESTS)
+#error unsupported legacy feature option DUK_OPT_SELF_TESTS used
+#endif
+#if defined(DUK_OPT_SETJMP)
+#error unsupported legacy feature option DUK_OPT_SETJMP used
+#endif
+#if defined(DUK_OPT_SHUFFLE_TORTURE)
+#error unsupported legacy feature option DUK_OPT_SHUFFLE_TORTURE used
+#endif
+#if defined(DUK_OPT_SIGSETJMP)
+#error unsupported legacy feature option DUK_OPT_SIGSETJMP used
+#endif
+#if defined(DUK_OPT_STRHASH16)
+#error unsupported legacy feature option DUK_OPT_STRHASH16 used
+#endif
+#if defined(DUK_OPT_STRICT_UTF8_SOURCE)
+#error unsupported legacy feature option DUK_OPT_STRICT_UTF8_SOURCE used
+#endif
+#if defined(DUK_OPT_STRLEN16)
+#error unsupported legacy feature option DUK_OPT_STRLEN16 used
+#endif
+#if defined(DUK_OPT_STRTAB_CHAIN)
+#error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN used
+#endif
+#if defined(DUK_OPT_STRTAB_CHAIN_SIZE)
+#error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN_SIZE used
+#endif
+#if defined(DUK_OPT_TARGET_INFO)
+#error unsupported legacy feature option DUK_OPT_TARGET_INFO used
+#endif
+#if defined(DUK_OPT_TRACEBACK_DEPTH)
+#error unsupported legacy feature option DUK_OPT_TRACEBACK_DEPTH used
+#endif
+#if defined(DUK_OPT_UNDERSCORE_SETJMP)
+#error unsupported legacy feature option DUK_OPT_UNDERSCORE_SETJMP used
+#endif
+#if defined(DUK_OPT_USER_INITJS)
+#error unsupported legacy feature option DUK_OPT_USER_INITJS used
+#endif
+
+/*
+ * Checks for config option consistency (DUK_USE_xxx)
+ */
+
+#if defined(DUK_USE_32BIT_PTRS)
+#error unsupported config option used (option has been removed): DUK_USE_32BIT_PTRS
+#endif
+#if defined(DUK_USE_ALIGN_4)
+#error unsupported config option used (option has been removed): DUK_USE_ALIGN_4
+#endif
+#if defined(DUK_USE_ALIGN_8)
+#error unsupported config option used (option has been removed): DUK_USE_ALIGN_8
+#endif
+#if defined(DUK_USE_BROWSER_LIKE)
+#error unsupported config option used (option has been removed): DUK_USE_BROWSER_LIKE
+#endif
+#if defined(DUK_USE_BUILTIN_INITJS)
+#error unsupported config option used (option has been removed): DUK_USE_BUILTIN_INITJS
+#endif
+#if defined(DUK_USE_BYTEORDER_FORCED)
+#error unsupported config option used (option has been removed): DUK_USE_BYTEORDER_FORCED
+#endif
+#if defined(DUK_USE_DATAPTR_DEC16) && !defined(DUK_USE_DATAPTR16)
+#error config option DUK_USE_DATAPTR_DEC16 requires option DUK_USE_DATAPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_DATAPTR_ENC16) && !defined(DUK_USE_DATAPTR16)
+#error config option DUK_USE_DATAPTR_ENC16 requires option DUK_USE_DATAPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_DDDPRINT)
+#error unsupported config option used (option has been removed): DUK_USE_DDDPRINT
+#endif
+#if defined(DUK_USE_DDPRINT)
+#error unsupported config option used (option has been removed): DUK_USE_DDPRINT
+#endif
+#if defined(DUK_USE_DEBUGGER_FWD_LOGGING)
+#error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_LOGGING
+#endif
+#if defined(DUK_USE_DEBUGGER_FWD_PRINTALERT)
+#error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_PRINTALERT
+#endif
+#if defined(DUK_USE_DEBUGGER_SUPPORT) && !defined(DUK_USE_INTERRUPT_COUNTER)
+#error config option DUK_USE_DEBUGGER_SUPPORT requires option DUK_USE_INTERRUPT_COUNTER (which is missing)
+#endif
+#if defined(DUK_USE_DEEP_C_STACK)
+#error unsupported config option used (option has been removed): DUK_USE_DEEP_C_STACK
+#endif
+#if defined(DUK_USE_DOUBLE_BE)
+#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_BE
+#endif
+#if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_LE)
+#error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_LE (which is also defined)
+#endif
+#if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_ME)
+#error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_ME (which is also defined)
+#endif
+#if defined(DUK_USE_DOUBLE_LE)
+#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_LE
+#endif
+#if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_BE)
+#error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_BE (which is also defined)
+#endif
+#if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_ME)
+#error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_ME (which is also defined)
+#endif
+#if defined(DUK_USE_DOUBLE_ME)
+#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_ME
+#endif
+#if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_LE)
+#error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_LE (which is also defined)
+#endif
+#if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_BE)
+#error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_BE (which is also defined)
+#endif
+#if defined(DUK_USE_DPRINT)
+#error unsupported config option used (option has been removed): DUK_USE_DPRINT
+#endif
+#if defined(DUK_USE_DPRINT) && !defined(DUK_USE_DEBUG)
+#error config option DUK_USE_DPRINT requires option DUK_USE_DEBUG (which is missing)
+#endif
+#if defined(DUK_USE_DPRINT_COLORS)
+#error unsupported config option used (option has been removed): DUK_USE_DPRINT_COLORS
+#endif
+#if defined(DUK_USE_DPRINT_RDTSC)
+#error unsupported config option used (option has been removed): DUK_USE_DPRINT_RDTSC
+#endif
+#if defined(DUK_USE_ES6_REGEXP_BRACES)
+#error unsupported config option used (option has been removed): DUK_USE_ES6_REGEXP_BRACES
+#endif
+#if defined(DUK_USE_ESBC_MAX_BYTES) && !defined(DUK_USE_ESBC_LIMITS)
+#error config option DUK_USE_ESBC_MAX_BYTES requires option DUK_USE_ESBC_LIMITS (which is missing)
+#endif
+#if defined(DUK_USE_ESBC_MAX_LINENUMBER) && !defined(DUK_USE_ESBC_LIMITS)
+#error config option DUK_USE_ESBC_MAX_LINENUMBER requires option DUK_USE_ESBC_LIMITS (which is missing)
+#endif
+#if defined(DUK_USE_EXEC_TIMEOUT_CHECK) && !defined(DUK_USE_INTERRUPT_COUNTER)
+#error config option DUK_USE_EXEC_TIMEOUT_CHECK requires option DUK_USE_INTERRUPT_COUNTER (which is missing)
+#endif
+#if defined(DUK_USE_EXTSTR_FREE) && !defined(DUK_USE_HSTRING_EXTDATA)
+#error config option DUK_USE_EXTSTR_FREE requires option DUK_USE_HSTRING_EXTDATA (which is missing)
+#endif
+#if defined(DUK_USE_EXTSTR_INTERN_CHECK) && !defined(DUK_USE_HSTRING_EXTDATA)
+#error config option DUK_USE_EXTSTR_INTERN_CHECK requires option DUK_USE_HSTRING_EXTDATA (which is missing)
+#endif
+#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_64BIT_OPS)
+#error config option DUK_USE_FASTINT requires option DUK_USE_64BIT_OPS (which is missing)
+#endif
+#if defined(DUK_USE_FILE_IO)
+#error unsupported config option used (option has been removed): DUK_USE_FILE_IO
+#endif
+#if defined(DUK_USE_FULL_TVAL)
+#error unsupported config option used (option has been removed): DUK_USE_FULL_TVAL
+#endif
+#if defined(DUK_USE_FUNCPTR_DEC16) && !defined(DUK_USE_FUNCPTR16)
+#error config option DUK_USE_FUNCPTR_DEC16 requires option DUK_USE_FUNCPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_FUNCPTR_ENC16) && !defined(DUK_USE_FUNCPTR16)
+#error config option DUK_USE_FUNCPTR_ENC16 requires option DUK_USE_FUNCPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS)
+#error unsupported config option used (option has been removed): DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS
+#endif
+#if defined(DUK_USE_HEAPPTR16) && defined(DUK_USE_DEBUG)
+#error config option DUK_USE_HEAPPTR16 conflicts with option DUK_USE_DEBUG (which is also defined)
+#endif
+#if defined(DUK_USE_HEAPPTR_DEC16) && !defined(DUK_USE_HEAPPTR16)
+#error config option DUK_USE_HEAPPTR_DEC16 requires option DUK_USE_HEAPPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_HEAPPTR_ENC16) && !defined(DUK_USE_HEAPPTR16)
+#error config option DUK_USE_HEAPPTR_ENC16 requires option DUK_USE_HEAPPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_INTEGER_BE)
+#error unsupported config option used (option has been removed): DUK_USE_INTEGER_BE
+#endif
+#if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_LE)
+#error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_LE (which is also defined)
+#endif
+#if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_ME)
+#error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_ME (which is also defined)
+#endif
+#if defined(DUK_USE_INTEGER_LE)
+#error unsupported config option used (option has been removed): DUK_USE_INTEGER_LE
+#endif
+#if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_BE)
+#error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_BE (which is also defined)
+#endif
+#if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_ME)
+#error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_ME (which is also defined)
+#endif
+#if defined(DUK_USE_INTEGER_ME)
+#error unsupported config option used (option has been removed): DUK_USE_INTEGER_ME
+#endif
+#if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_LE)
+#error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_LE (which is also defined)
+#endif
+#if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_BE)
+#error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_BE (which is also defined)
+#endif
+#if defined(DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE)
+#error unsupported config option used (option has been removed): DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE
+#endif
+#if defined(DUK_USE_MARK_AND_SWEEP)
+#error unsupported config option used (option has been removed): DUK_USE_MARK_AND_SWEEP
+#endif
+#if defined(DUK_USE_MATH_FMAX)
+#error unsupported config option used (option has been removed): DUK_USE_MATH_FMAX
+#endif
+#if defined(DUK_USE_MATH_FMIN)
+#error unsupported config option used (option has been removed): DUK_USE_MATH_FMIN
+#endif
+#if defined(DUK_USE_MATH_ROUND)
+#error unsupported config option used (option has been removed): DUK_USE_MATH_ROUND
+#endif
+#if defined(DUK_USE_MS_STRINGTABLE_RESIZE)
+#error unsupported config option used (option has been removed): DUK_USE_MS_STRINGTABLE_RESIZE
+#endif
+#if defined(DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE)
+#error unsupported config option used (option has been removed): DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE
+#endif
+#if defined(DUK_USE_NO_DOUBLE_ALIASING_SELFTEST)
+#error unsupported config option used (option has been removed): DUK_USE_NO_DOUBLE_ALIASING_SELFTEST
+#endif
+#if defined(DUK_USE_OCTAL_SUPPORT)
+#error unsupported config option used (option has been removed): DUK_USE_OCTAL_SUPPORT
+#endif
+#if defined(DUK_USE_PACKED_TVAL_POSSIBLE)
+#error unsupported config option used (option has been removed): DUK_USE_PACKED_TVAL_POSSIBLE
+#endif
+#if defined(DUK_USE_PANIC_ABORT)
+#error unsupported config option used (option has been removed): DUK_USE_PANIC_ABORT
+#endif
+#if defined(DUK_USE_PANIC_EXIT)
+#error unsupported config option used (option has been removed): DUK_USE_PANIC_EXIT
+#endif
+#if defined(DUK_USE_PANIC_HANDLER)
+#error unsupported config option used (option has been removed): DUK_USE_PANIC_HANDLER
+#endif
+#if defined(DUK_USE_PANIC_SEGFAULT)
+#error unsupported config option used (option has been removed): DUK_USE_PANIC_SEGFAULT
+#endif
+#if defined(DUK_USE_POW_NETBSD_WORKAROUND)
+#error unsupported config option used (option has been removed): DUK_USE_POW_NETBSD_WORKAROUND
+#endif
+#if defined(DUK_USE_RDTSC)
+#error unsupported config option used (option has been removed): DUK_USE_RDTSC
+#endif
+#if defined(DUK_USE_REFZERO_FINALIZER_TORTURE)
+#error unsupported config option used (option has been removed): DUK_USE_REFZERO_FINALIZER_TORTURE
+#endif
+#if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_STRINGS)
+#error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_STRINGS (which is missing)
+#endif
+#if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_OBJECTS)
+#error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_OBJECTS (which is missing)
+#endif
+#if defined(DUK_USE_ROM_GLOBAL_CLONE) && defined(DUK_USE_ROM_GLOBAL_INHERIT)
+#error config option DUK_USE_ROM_GLOBAL_CLONE conflicts with option DUK_USE_ROM_GLOBAL_INHERIT (which is also defined)
+#endif
+#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_STRINGS)
+#error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_STRINGS (which is missing)
+#endif
+#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_OBJECTS)
+#error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_OBJECTS (which is missing)
+#endif
+#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && defined(DUK_USE_ROM_GLOBAL_CLONE)
+#error config option DUK_USE_ROM_GLOBAL_INHERIT conflicts with option DUK_USE_ROM_GLOBAL_CLONE (which is also defined)
+#endif
+#if defined(DUK_USE_ROM_OBJECTS) && !defined(DUK_USE_ROM_STRINGS)
+#error config option DUK_USE_ROM_OBJECTS requires option DUK_USE_ROM_STRINGS (which is missing)
+#endif
+#if defined(DUK_USE_ROM_STRINGS) && !defined(DUK_USE_ROM_OBJECTS)
+#error config option DUK_USE_ROM_STRINGS requires option DUK_USE_ROM_OBJECTS (which is missing)
+#endif
+#if defined(DUK_USE_SETJMP)
+#error unsupported config option used (option has been removed): DUK_USE_SETJMP
+#endif
+#if defined(DUK_USE_SIGSETJMP)
+#error unsupported config option used (option has been removed): DUK_USE_SIGSETJMP
+#endif
+#if defined(DUK_USE_STRTAB_CHAIN)
+#error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN
+#endif
+#if defined(DUK_USE_STRTAB_CHAIN_SIZE)
+#error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN_SIZE
+#endif
+#if defined(DUK_USE_STRTAB_CHAIN_SIZE) && !defined(DUK_USE_STRTAB_CHAIN)
+#error config option DUK_USE_STRTAB_CHAIN_SIZE requires option DUK_USE_STRTAB_CHAIN (which is missing)
+#endif
+#if defined(DUK_USE_STRTAB_PROBE)
+#error unsupported config option used (option has been removed): DUK_USE_STRTAB_PROBE
+#endif
+#if defined(DUK_USE_STRTAB_PTRCOMP) && !defined(DUK_USE_HEAPPTR16)
+#error config option DUK_USE_STRTAB_PTRCOMP requires option DUK_USE_HEAPPTR16 (which is missing)
+#endif
+#if defined(DUK_USE_TAILCALL) && defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+#error config option DUK_USE_TAILCALL conflicts with option DUK_USE_NONSTD_FUNC_CALLER_PROPERTY (which is also defined)
+#endif
+#if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)
+#error unsupported config option used (option has been removed): DUK_USE_UNALIGNED_ACCESSES_POSSIBLE
+#endif
+#if defined(DUK_USE_UNDERSCORE_SETJMP)
+#error unsupported config option used (option has been removed): DUK_USE_UNDERSCORE_SETJMP
+#endif
+#if defined(DUK_USE_USER_INITJS)
+#error unsupported config option used (option has been removed): DUK_USE_USER_INITJS
+#endif
+
+#if defined(DUK_USE_CPP_EXCEPTIONS) && !defined(__cplusplus)
+#error DUK_USE_CPP_EXCEPTIONS enabled but not compiling with a C++ compiler
+#endif
+
+/*
+ * Convert DUK_USE_BYTEORDER, from whatever source, into currently used
+ * internal defines. If detection failed, #error out.
+ */
+
+#if defined(DUK_USE_BYTEORDER)
+#if (DUK_USE_BYTEORDER == 1)
+#define DUK_USE_INTEGER_LE
+#define DUK_USE_DOUBLE_LE
+#elif (DUK_USE_BYTEORDER == 2)
+#define DUK_USE_INTEGER_LE /* integer endianness is little on purpose */
+#define DUK_USE_DOUBLE_ME
+#elif (DUK_USE_BYTEORDER == 3)
+#define DUK_USE_INTEGER_BE
+#define DUK_USE_DOUBLE_BE
+#else
+#error unsupported: byte order invalid
+#endif /* byte order */
+#else
+#error unsupported: byte order detection failed
+#endif /* defined(DUK_USE_BYTEORDER) */
+
+#endif /* DUK_CONFIG_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.c
new file mode 100755
index 000000000..9a29903cf
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.c
@@ -0,0 +1,163 @@
+/*
+ * Minimal 'console' binding.
+ *
+ * https://github.com/DeveloperToolsWG/console-object/blob/master/api.md
+ * https://developers.google.com/web/tools/chrome-devtools/debug/console/console-reference
+ * https://developer.mozilla.org/en/docs/Web/API/console
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "duktape.h"
+#include "duk_console.h"
+
+/* XXX: Add some form of log level filtering. */
+
+/* XXX: For now logs everything to stdout, V8/Node.js logs debug/info level
+ * to stdout, warn and above to stderr. Should this extra do the same?
+ */
+
+/* XXX: Should all output be written via e.g. console.write(formattedMsg)?
+ * This would make it easier for user code to redirect all console output
+ * to a custom backend.
+ */
+
+/* XXX: Init console object using duk_def_prop() when that call is available. */
+
+static duk_ret_t duk__console_log_helper(duk_context *ctx, const char *error_name) {
+ duk_idx_t i, n;
+ duk_uint_t flags;
+
+ flags = (duk_uint_t) duk_get_current_magic(ctx);
+
+ n = duk_get_top(ctx);
+
+ duk_get_global_string(ctx, "console");
+ duk_get_prop_string(ctx, -1, "format");
+
+ for (i = 0; i < n; i++) {
+ if (duk_check_type_mask(ctx, i, DUK_TYPE_MASK_OBJECT)) {
+ /* Slow path formatting. */
+ duk_dup(ctx, -1); /* console.format */
+ duk_dup(ctx, i);
+ duk_call(ctx, 1);
+ duk_replace(ctx, i); /* arg[i] = console.format(arg[i]); */
+ }
+ }
+
+ duk_pop_2(ctx);
+
+ duk_push_string(ctx, " ");
+ duk_insert(ctx, 0);
+ duk_join(ctx, n);
+
+ if (error_name) {
+ duk_push_error_object(ctx, DUK_ERR_ERROR, "%s", duk_require_string(ctx, -1));
+ duk_push_string(ctx, "name");
+ duk_push_string(ctx, error_name);
+ duk_def_prop(ctx, -3, DUK_DEFPROP_FORCE | DUK_DEFPROP_HAVE_VALUE); /* to get e.g. 'Trace: 1 2 3' */
+ duk_get_prop_string(ctx, -1, "stack");
+ }
+
+ fprintf(stdout, "%s\n", duk_to_string(ctx, -1));
+ if (flags & DUK_CONSOLE_FLUSH) {
+ fflush(stdout);
+ }
+ return 0;
+}
+
+static duk_ret_t duk__console_assert(duk_context *ctx) {
+ if (duk_to_boolean(ctx, 0)) {
+ return 0;
+ }
+ duk_remove(ctx, 0);
+
+ return duk__console_log_helper(ctx, "AssertionError");
+}
+
+static duk_ret_t duk__console_log(duk_context *ctx) {
+ return duk__console_log_helper(ctx, NULL);
+}
+
+static duk_ret_t duk__console_trace(duk_context *ctx) {
+ return duk__console_log_helper(ctx, "Trace");
+}
+
+static duk_ret_t duk__console_info(duk_context *ctx) {
+ return duk__console_log_helper(ctx, NULL);
+}
+
+static duk_ret_t duk__console_warn(duk_context *ctx) {
+ return duk__console_log_helper(ctx, NULL);
+}
+
+static duk_ret_t duk__console_error(duk_context *ctx) {
+ return duk__console_log_helper(ctx, "Error");
+}
+
+static duk_ret_t duk__console_dir(duk_context *ctx) {
+ /* For now, just share the formatting of .log() */
+ return duk__console_log_helper(ctx, 0);
+}
+
+static void duk__console_reg_vararg_func(duk_context *ctx, duk_c_function func, const char *name, duk_uint_t flags) {
+ duk_push_c_function(ctx, func, DUK_VARARGS);
+ duk_push_string(ctx, "name");
+ duk_push_string(ctx, name);
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE); /* Improve stacktraces by displaying function name */
+ duk_set_magic(ctx, -1, (duk_int_t) flags);
+ duk_put_prop_string(ctx, -2, name);
+}
+
+void duk_console_init(duk_context *ctx, duk_uint_t flags) {
+ duk_push_object(ctx);
+
+ /* Custom function to format objects; user can replace.
+ * For now, try JX-formatting and if that fails, fall back
+ * to ToString(v).
+ */
+ duk_eval_string(ctx,
+ "(function (E) {"
+ "return function format(v){"
+ "try{"
+ "return E('jx',v);"
+ "}catch(e){"
+ "return String(v);" /* String() allows symbols, ToString() internal algorithm doesn't. */
+ "}"
+ "};"
+ "})(Duktape.enc)");
+ duk_put_prop_string(ctx, -2, "format");
+
+ duk__console_reg_vararg_func(ctx, duk__console_assert, "assert", flags);
+ duk__console_reg_vararg_func(ctx, duk__console_log, "log", flags);
+ duk__console_reg_vararg_func(ctx, duk__console_log, "debug", flags); /* alias to console.log */
+ duk__console_reg_vararg_func(ctx, duk__console_trace, "trace", flags);
+ duk__console_reg_vararg_func(ctx, duk__console_info, "info", flags);
+ duk__console_reg_vararg_func(ctx, duk__console_warn, "warn", flags);
+ duk__console_reg_vararg_func(ctx, duk__console_error, "error", flags);
+ duk__console_reg_vararg_func(ctx, duk__console_error, "exception", flags); /* alias to console.error */
+ duk__console_reg_vararg_func(ctx, duk__console_dir, "dir", flags);
+
+ duk_put_global_string(ctx, "console");
+
+ /* Proxy wrapping: ensures any undefined console method calls are
+ * ignored silently. This is required specifically by the
+ * DeveloperToolsWG proposal (and is implemented also by Firefox:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=629607).
+ */
+
+ if (flags & DUK_CONSOLE_PROXY_WRAPPER) {
+ /* Tolerate errors: Proxy may be disabled. */
+ duk_peval_string_noresult(ctx,
+ "(function(){"
+ "var D=function(){};"
+ "console=new Proxy(console,{"
+ "get:function(t,k){"
+ "var v=t[k];"
+ "return typeof v==='function'?v:D;"
+ "}"
+ "});"
+ "})();"
+ );
+ }
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.h
new file mode 100755
index 000000000..1488a95fa
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.h
@@ -0,0 +1,14 @@
+#if !defined(DUK_CONSOLE_H_INCLUDED)
+#define DUK_CONSOLE_H_INCLUDED
+
+#include "duktape.h"
+
+/* Use a proxy wrapper to make undefined methods (console.foo()) no-ops. */
+#define DUK_CONSOLE_PROXY_WRAPPER (1 << 0)
+
+/* Flush output after every call. */
+#define DUK_CONSOLE_FLUSH (1 << 1)
+
+extern void duk_console_init(duk_context *ctx, duk_uint_t flags);
+
+#endif /* DUK_CONSOLE_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.c
new file mode 100755
index 000000000..9be2c1c27
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.c
@@ -0,0 +1,380 @@
+/*
+ * Logging support
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include "duktape.h"
+#include "duk_logging.h"
+
+/* XXX: uses stderr always for now, configurable? */
+
+#define DUK_LOGGING_FLUSH /* Duktape 1.x: flush stderr */
+
+/* 3-letter log level strings. */
+static const char duk__log_level_strings[] = {
+ 'T', 'R', 'C', 'D', 'B', 'G', 'I', 'N', 'F',
+ 'W', 'R', 'N', 'E', 'R', 'R', 'F', 'T', 'L'
+};
+
+/* Log method names. */
+static const char *duk__log_method_names[] = {
+ "trace", "debug", "info", "warn", "error", "fatal"
+};
+
+/* Constructor. */
+static duk_ret_t duk__logger_constructor(duk_context *ctx) {
+ duk_idx_t nargs;
+
+ /* Calling as a non-constructor is not meaningful. */
+ if (!duk_is_constructor_call(ctx)) {
+ return DUK_RET_TYPE_ERROR;
+ }
+
+ nargs = duk_get_top(ctx);
+ duk_set_top(ctx, 1);
+
+ duk_push_this(ctx);
+
+ /* [ name this ] */
+
+ if (nargs == 0) {
+ /* Automatic defaulting of logger name from caller. This
+ * would work poorly with tail calls, but constructor calls
+ * are currently never tail calls, so tail calls are not an
+ * issue now.
+ */
+
+ duk_inspect_callstack_entry(ctx, -2);
+ if (duk_is_object(ctx, -1)) {
+ if (duk_get_prop_string(ctx, -1, "function")) {
+ if (duk_get_prop_string(ctx, -1, "fileName")) {
+ if (duk_is_string(ctx, -1)) {
+ duk_replace(ctx, 0);
+ }
+ }
+ }
+ }
+ /* Leave values on stack on purpose, ignored below. */
+
+ /* Stripping the filename might be a good idea
+ * ("/foo/bar/quux.js" -> logger name "quux"),
+ * but now used verbatim.
+ */
+ }
+ /* The stack is unbalanced here on purpose; we only rely on the
+ * initial two values: [ name this ].
+ */
+
+ if (duk_is_string(ctx, 0)) {
+ duk_dup(ctx, 0);
+ duk_put_prop_string(ctx, 1, "n");
+ } else {
+ /* don't set 'n' at all, inherited value is used as name */
+ }
+
+ duk_compact(ctx, 1);
+
+ return 0; /* keep default instance */
+}
+
+/* Default function to format objects. Tries to use toLogString() but falls
+ * back to toString(). Any errors are propagated out without catching.
+ */
+static duk_ret_t duk__logger_prototype_fmt(duk_context *ctx) {
+ if (duk_get_prop_string(ctx, 0, "toLogString")) {
+ /* [ arg toLogString ] */
+
+ duk_dup(ctx, 0);
+ duk_call_method(ctx, 0);
+
+ /* [ arg result ] */
+ return 1;
+ }
+
+ /* [ arg undefined ] */
+ duk_pop(ctx);
+ duk_to_string(ctx, 0);
+ return 1;
+}
+
+/* Default function to write a formatted log line. Writes to stderr,
+ * appending a newline to the log line.
+ *
+ * The argument is a buffer; avoid coercing the buffer to a string to
+ * avoid string table traffic.
+ */
+static duk_ret_t duk__logger_prototype_raw(duk_context *ctx) {
+ const char *data;
+ duk_size_t data_len;
+
+ data = (const char *) duk_require_buffer(ctx, 0, &data_len);
+ fwrite((const void *) data, 1, data_len, stderr);
+ fputc((int) '\n', stderr);
+#if defined(DUK_LOGGING_FLUSH)
+ fflush(stderr);
+#endif
+ return 0;
+}
+
+/* Log frontend shared helper, magic value indicates log level. Provides
+ * frontend functions: trace(), debug(), info(), warn(), error(), fatal().
+ * This needs to have small footprint, reasonable performance, minimal
+ * memory churn, etc.
+ */
+static duk_ret_t duk__logger_prototype_log_shared(duk_context *ctx) {
+ duk_double_t now;
+ duk_time_components comp;
+ duk_small_int_t entry_lev;
+ duk_small_int_t logger_lev;
+ duk_int_t nargs;
+ duk_int_t i;
+ duk_size_t tot_len;
+ const duk_uint8_t *arg_str;
+ duk_size_t arg_len;
+ duk_uint8_t *buf, *p;
+ const duk_uint8_t *q;
+ duk_uint8_t date_buf[32]; /* maximum format length is 24+1 (NUL), round up. */
+ duk_size_t date_len;
+ duk_small_int_t rc;
+
+ /* XXX: sanitize to printable (and maybe ASCII) */
+ /* XXX: better multiline */
+
+ /*
+ * Logger arguments are:
+ *
+ * magic: log level (0-5)
+ * this: logger
+ * stack: plain log args
+ *
+ * We want to minimize memory churn so a two-pass approach
+ * is used: first pass formats arguments and computes final
+ * string length, second pass copies strings into a buffer
+ * allocated directly with the correct size. If the backend
+ * function plays nice, it won't coerce the buffer to a string
+ * (and thus intern it).
+ */
+
+ entry_lev = duk_get_current_magic(ctx);
+ if (entry_lev < DUK_LOG_TRACE || entry_lev > DUK_LOG_FATAL) {
+ /* Should never happen, check just in case. */
+ return 0;
+ }
+ nargs = duk_get_top(ctx);
+
+ /* [ arg1 ... argN this ] */
+
+ /*
+ * Log level check
+ */
+
+ duk_push_this(ctx);
+
+ duk_get_prop_string(ctx, -1, "l");
+ logger_lev = (duk_small_int_t) duk_get_int(ctx, -1);
+ if (entry_lev < logger_lev) {
+ return 0;
+ }
+ /* log level could be popped but that's not necessary */
+
+ now = duk_get_now(ctx);
+ duk_time_to_components(ctx, now, &comp);
+ sprintf((char *) date_buf, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ",
+ (int) comp.year, (int) comp.month + 1, (int) comp.day,
+ (int) comp.hours, (int) comp.minutes, (int) comp.seconds,
+ (int) comp.milliseconds);
+
+ date_len = strlen((const char *) date_buf);
+
+ duk_get_prop_string(ctx, -2, "n");
+ duk_to_string(ctx, -1);
+
+ /* [ arg1 ... argN this loggerLevel loggerName ] */
+
+ /*
+ * Pass 1
+ */
+
+ /* Line format: <time> <entryLev> <loggerName>: <msg> */
+
+ tot_len = 0;
+ tot_len += 3 + /* separators: space, space, colon */
+ 3 + /* level string */
+ date_len + /* time */
+ duk_get_length(ctx, -1); /* loggerName */
+
+ for (i = 0; i < nargs; i++) {
+ /* When formatting an argument to a string, errors may happen from multiple
+ * causes. In general we want to catch obvious errors like a toLogString()
+ * throwing an error, but we don't currently try to catch every possible
+ * error. In particular, internal errors (like out of memory or stack) are
+ * not caught. Also, we expect Error toString() to not throw an error.
+ */
+ if (duk_is_object(ctx, i)) {
+ /* duk_pcall_prop() may itself throw an error, but we're content
+ * in catching the obvious errors (like toLogString() throwing an
+ * error).
+ */
+ duk_push_string(ctx, "fmt");
+ duk_dup(ctx, i);
+ /* [ arg1 ... argN this loggerLevel loggerName 'fmt' arg ] */
+ /* call: this.fmt(arg) */
+ rc = duk_pcall_prop(ctx, -5 /*obj_index*/, 1 /*nargs*/);
+ if (rc) {
+ /* Keep the error as the result (coercing it might fail below,
+ * but we don't catch that now).
+ */
+ ;
+ }
+ duk_replace(ctx, i);
+ }
+ (void) duk_to_lstring(ctx, i, &arg_len);
+ tot_len++; /* sep (even before first one) */
+ tot_len += arg_len;
+ }
+
+ /*
+ * Pass 2
+ */
+
+ /* XXX: Here it'd be nice if we didn't need to allocate a new fixed
+ * buffer for every write. This would be possible if raw() took a
+ * buffer and a length. We could then use a preallocated buffer for
+ * most log writes and request raw() to write a partial buffer.
+ */
+
+ buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, tot_len);
+ p = buf;
+
+ memcpy((void *) p, (const void *) date_buf, (size_t) date_len);
+ p += date_len;
+ *p++ = (duk_uint8_t) ' ';
+
+ q = (const duk_uint8_t *) duk__log_level_strings + (entry_lev * 3);
+ memcpy((void *) p, (const void *) q, (size_t) 3);
+ p += 3;
+
+ *p++ = (duk_uint8_t) ' ';
+
+ arg_str = (const duk_uint8_t *) duk_get_lstring(ctx, -2, &arg_len);
+ memcpy((void *) p, (const void *) arg_str, (size_t) arg_len);
+ p += arg_len;
+
+ *p++ = (duk_uint8_t) ':';
+
+ for (i = 0; i < nargs; i++) {
+ *p++ = (duk_uint8_t) ' ';
+
+ arg_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &arg_len);
+ memcpy((void *) p, (const void *) arg_str, (size_t) arg_len);
+ p += arg_len;
+ }
+
+ /* [ arg1 ... argN this loggerLevel loggerName buffer ] */
+
+ /* Call this.raw(msg); look up through the instance allows user to override
+ * the raw() function in the instance or in the prototype for maximum
+ * flexibility.
+ */
+ duk_push_string(ctx, "raw");
+ duk_dup(ctx, -2);
+ /* [ arg1 ... argN this loggerLevel loggerName buffer 'raw' buffer ] */
+ duk_call_prop(ctx, -6, 1); /* this.raw(buffer) */
+
+ return 0;
+}
+
+void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap) {
+ if (level < 0) {
+ level = 0;
+ } else if (level > (int) (sizeof(duk__log_method_names) / sizeof(const char *)) - 1) {
+ level = (int) (sizeof(duk__log_method_names) / sizeof(const char *)) - 1;
+ }
+
+ duk_push_global_stash(ctx);
+ duk_get_prop_string(ctx, -1, "\xff" "logger:constructor"); /* fixed at init time */
+ duk_get_prop_string(ctx, -1, "clog");
+ duk_get_prop_string(ctx, -1, duk__log_method_names[level]);
+ duk_dup(ctx, -2);
+ duk_push_vsprintf(ctx, fmt, ap);
+
+ /* [ ... stash Logger clog logfunc clog(=this) msg ] */
+
+ duk_call_method(ctx, 1 /*nargs*/);
+
+ /* [ ... stash Logger clog res ] */
+
+ duk_pop_n(ctx, 4);
+}
+
+void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...) {
+ va_list ap;
+
+ va_start(ap, fmt);
+ duk_log_va(ctx, level, fmt, ap);
+ va_end(ap);
+}
+
+void duk_logging_init(duk_context *ctx, duk_uint_t flags) {
+ /* XXX: Add .name property for logger functions (useful for stack traces if they throw). */
+
+ (void) flags;
+
+ duk_eval_string(ctx,
+ "(function(cons,prot){"
+ "Object.defineProperty(Duktape,'Logger',{value:cons,writable:true,configurable:true});"
+ "Object.defineProperty(cons,'prototype',{value:prot});"
+ "Object.defineProperty(cons,'clog',{value:new Duktape.Logger('C'),writable:true,configurable:true});"
+ "});");
+
+ duk_push_c_function(ctx, duk__logger_constructor, DUK_VARARGS /*nargs*/); /* Duktape.Logger */
+ duk_push_object(ctx); /* Duktape.Logger.prototype */
+
+ /* [ ... func Duktape.Logger Duktape.Logger.prototype ] */
+
+ duk_push_string(ctx, "name");
+ duk_push_string(ctx, "Logger");
+ duk_def_prop(ctx, -4, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);
+
+ duk_dup_top(ctx);
+ duk_put_prop_string(ctx, -2, "constructor");
+ duk_push_int(ctx, 2);
+ duk_put_prop_string(ctx, -2, "l");
+ duk_push_string(ctx, "anon");
+ duk_put_prop_string(ctx, -2, "n");
+ duk_push_c_function(ctx, duk__logger_prototype_fmt, 1 /*nargs*/);
+ duk_put_prop_string(ctx, -2, "fmt");
+ duk_push_c_function(ctx, duk__logger_prototype_raw, 1 /*nargs*/);
+ duk_put_prop_string(ctx, -2, "raw");
+ duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);
+ duk_set_magic(ctx, -1, 0); /* magic=0: trace */
+ duk_put_prop_string(ctx, -2, "trace");
+ duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);
+ duk_set_magic(ctx, -1, 1); /* magic=1: debug */
+ duk_put_prop_string(ctx, -2, "debug");
+ duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);
+ duk_set_magic(ctx, -1, 2); /* magic=2: info */
+ duk_put_prop_string(ctx, -2, "info");
+ duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);
+ duk_set_magic(ctx, -1, 3); /* magic=3: warn */
+ duk_put_prop_string(ctx, -2, "warn");
+ duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);
+ duk_set_magic(ctx, -1, 4); /* magic=4: error */
+ duk_put_prop_string(ctx, -2, "error");
+ duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);
+ duk_set_magic(ctx, -1, 5); /* magic=5: fatal */
+ duk_put_prop_string(ctx, -2, "fatal");
+
+ /* [ ... func Duktape.Logger Duktape.Logger.prototype ] */
+
+ /* XXX: when using ROM built-ins, "Duktape" is read-only by default so
+ * setting Duktape.Logger will now fail.
+ */
+
+ /* [ ... func Duktape.Logger Duktape.Logger.prototype ] */
+
+ duk_call(ctx, 2);
+ duk_pop(ctx);
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.h
new file mode 100755
index 000000000..741fc9cb1
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.h
@@ -0,0 +1,20 @@
+#if !defined(DUK_LOGGING_H_INCLUDED)
+#define DUK_LOGGING_H_INCLUDED
+
+#include "duktape.h"
+
+/* Log levels */
+#define DUK_LOG_TRACE 0
+#define DUK_LOG_DEBUG 1
+#define DUK_LOG_INFO 2
+#define DUK_LOG_WARN 3
+#define DUK_LOG_ERROR 4
+#define DUK_LOG_FATAL 5
+
+/* No flags at the moment. */
+
+extern void duk_logging_init(duk_context *ctx, duk_uint_t flags);
+extern void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap);
+extern void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...);
+
+#endif /* DUK_LOGGING_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.c
new file mode 100755
index 000000000..e4b6e43ab
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.c
@@ -0,0 +1,312 @@
+/*
+ * Minimal vsnprintf(), snprintf(), sprintf(), and sscanf() for Duktape.
+ * The supported conversion formats narrowly match what Duktape needs.
+ */
+
+#include <stdarg.h> /* va_list etc */
+#include <stddef.h> /* size_t */
+#include <stdint.h> /* SIZE_MAX */
+
+/* Write character with bound checking. Offset 'off' is updated regardless
+ * of whether an actual write is made. This is necessary to satisfy snprintf()
+ * return value semantics.
+ */
+#define DUK__WRITE_CHAR(c) do { \
+ if (off < size) { \
+ str[off] = (char) c; \
+ } \
+ off++; \
+ } while (0)
+
+/* Digits up to radix 16. */
+static const char duk__format_digits[16] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+};
+
+/* Format an unsigned long with various options. An unsigned long is large
+ * enough for formatting all supported types.
+ */
+static size_t duk__format_long(char *str,
+ size_t size,
+ size_t off,
+ int fixed_length,
+ char pad,
+ int radix,
+ int neg_sign,
+ unsigned long v) {
+ char buf[24]; /* 2^64 = 18446744073709552000, length 20 */
+ char *required;
+ char *p;
+ int i;
+
+ /* Format in reverse order first. Ensure at least one digit is output
+ * to handle '0' correctly. Note that space padding and zero padding
+ * handle negative sign differently:
+ *
+ * %9d and -321 => ' -321'
+ * %09d and -321 => '-00000321'
+ */
+
+ for (i = 0; i < (int) sizeof(buf); i++) {
+ buf[i] = pad; /* compiles into memset() equivalent, avoid memset() dependency */
+ }
+
+ p = buf;
+ do {
+ *p++ = duk__format_digits[v % radix];
+ v /= radix;
+ } while (v != 0);
+
+ required = buf + fixed_length;
+ if (p < required && pad == (char) '0') {
+ /* Zero padding and we didn't reach maximum length: place
+ * negative sign at the last position. We can't get here
+ * with fixed_length == 0 so that required[-1] is safe.
+ *
+ * Technically we should only do this for 'neg_sign == 1',
+ * but it's OK to advance the pointer even when that's not
+ * the case.
+ */
+ p = required - 1;
+ }
+ if (neg_sign) {
+ *p++ = (char) '-';
+ }
+ if (p < required) {
+ p = required;
+ }
+
+ /* Now [buf,p[ contains the result in reverse; copy into place. */
+
+ while (p > buf) {
+ p--;
+ DUK__WRITE_CHAR(*p);
+ }
+
+ return off;
+}
+
+/* Parse a pointer. Must parse whatever is produced by '%p' in sprintf(). */
+static int duk__parse_pointer(const char *str, void **out) {
+ const unsigned char *p;
+ unsigned char ch;
+ int count;
+ int limit;
+ long val; /* assume void * fits into long */
+
+ /* We only need to parse what our minimal printf() produces, so that
+ * we can check for a '0x' prefix, and assume all hex digits are
+ * lowercase.
+ */
+
+ p = (const unsigned char *) str;
+ if (p[0] != (unsigned char) '0' || p[1] != (unsigned char) 'x') {
+ return 0;
+ }
+ p += 2;
+
+ for (val = 0, count = 0, limit = sizeof(void *) * 2; count < limit; count++) {
+ ch = *p++;
+
+ val <<= 4;
+ if (ch >= (unsigned char) '0' && ch <= (unsigned char) '9') {
+ val += ch - (unsigned char) '0';
+ } else if (ch >= (unsigned char) 'a' && ch <= (unsigned char) 'f') {
+ val += ch - (unsigned char) 'a' + 0x0a;
+ } else {
+ return 0;
+ }
+ }
+
+ /* The input may end at a NUL or garbage may follow. As long as we
+ * parse the '%p' correctly, garbage is allowed to follow, and the
+ * JX pointer parsing also relies on that.
+ */
+
+ *out = (void *) val;
+ return 1;
+}
+
+/* Minimal vsnprintf() entry point. */
+int duk_minimal_vsnprintf(char *str, size_t size, const char *format, va_list ap) {
+ size_t off = 0;
+ const char *p;
+#if 0
+ const char *p_tmp;
+ const char *p_fmt_start;
+#endif
+ char c;
+ char pad;
+ int fixed_length;
+ int is_long;
+
+ /* Assume str != NULL unless size == 0.
+ * Assume format != NULL.
+ */
+
+ p = format;
+ for (;;) {
+ c = *p++;
+ if (c == (char) 0) {
+ break;
+ }
+ if (c != (char) '%') {
+ DUK__WRITE_CHAR(c);
+ continue;
+ }
+
+ /* Start format sequence. Scan flags and format specifier. */
+
+#if 0
+ p_fmt_start = p - 1;
+#endif
+ is_long = 0;
+ pad = ' ';
+ fixed_length = 0;
+ for (;;) {
+ c = *p++;
+ if (c == (char) 'l') {
+ is_long = 1;
+ } else if (c == (char) '0') {
+ /* Only support pad character '0'. */
+ pad = '0';
+ } else if (c >= (char) '1' && c <= (char) '9') {
+ /* Only support fixed lengths 1-9. */
+ fixed_length = (int) (c - (char) '0');
+ } else if (c == (char) 'd') {
+ long v;
+ int neg_sign = 0;
+ if (is_long) {
+ v = va_arg(ap, long);
+ } else {
+ v = (long) va_arg(ap, int);
+ }
+ if (v < 0) {
+ neg_sign = 1;
+ v = -v;
+ }
+ off = duk__format_long(str, size, off, fixed_length, pad, 10, neg_sign, (unsigned long) v);
+ break;
+ } else if (c == (char) 'u') {
+ unsigned long v;
+ if (is_long) {
+ v = va_arg(ap, unsigned long);
+ } else {
+ v = (unsigned long) va_arg(ap, unsigned int);
+ }
+ off = duk__format_long(str, size, off, fixed_length, pad, 10, 0, v);
+ break;
+ } else if (c == (char) 'x') {
+ unsigned long v;
+ if (is_long) {
+ v = va_arg(ap, unsigned long);
+ } else {
+ v = (unsigned long) va_arg(ap, unsigned int);
+ }
+ off = duk__format_long(str, size, off, fixed_length, pad, 16, 0, v);
+ break;
+ } else if (c == (char) 'c') {
+ char v;
+ v = (char) va_arg(ap, int); /* intentionally not 'char' */
+ DUK__WRITE_CHAR(v);
+ break;
+ } else if (c == (char) 's') {
+ const char *v;
+ char c_tmp;
+ v = va_arg(ap, const char *);
+ if (v) {
+ for (;;) {
+ c_tmp = *v++;
+ if (c_tmp) {
+ DUK__WRITE_CHAR(c_tmp);
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+ } else if (c == (char) 'p') {
+ /* Assume a void * can be represented by 'long'. This is not
+ * always the case. NULL pointer is printed out as 0x0000...
+ */
+ void *v;
+ v = va_arg(ap, void *);
+ DUK__WRITE_CHAR('0');
+ DUK__WRITE_CHAR('x');
+ off = duk__format_long(str, size, off, sizeof(void *) * 2, '0', 16, 0, (unsigned long) v);
+ break;
+ } else {
+ /* Unrecognized, bail out early. We could also emit the format
+ * specifier verbatim, but it'd be a waste of footprint because
+ * this case should never happen in practice.
+ */
+#if 0
+ DUK__WRITE_CHAR('!');
+#endif
+#if 0
+ for (p_tmp = p_fmt_start; p_tmp != p; p_tmp++) {
+ DUK__WRITE_CHAR(*p_tmp);
+ }
+ break;
+#endif
+ goto finish;
+ }
+ }
+ }
+
+ finish:
+ if (off < size) {
+ str[off] = (char) 0; /* No increment for 'off', not counted in return value. */
+ } else if (size > 0) {
+ /* Forced termination. */
+ str[size - 1] = 0;
+ }
+
+ return (int) off;
+}
+
+/* Minimal snprintf() entry point. */
+int duk_minimal_snprintf(char *str, size_t size, const char *format, ...) {
+ va_list ap;
+ int ret;
+
+ va_start(ap, format);
+ ret = duk_minimal_vsnprintf(str, size, format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+/* Minimal sprintf() entry point. */
+int duk_minimal_sprintf(char *str, const char *format, ...) {
+ va_list ap;
+ int ret;
+
+ va_start(ap, format);
+ ret = duk_minimal_vsnprintf(str, SIZE_MAX, format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+/* Minimal sscanf() entry point. */
+int duk_minimal_sscanf(const char *str, const char *format, ...) {
+ va_list ap;
+ int ret;
+ void **out;
+
+ /* Only the exact "%p" format is supported. */
+ if (format[0] != (char) '%' ||
+ format[1] != (char) 'p' ||
+ format[2] != (char) 0) {
+ }
+
+ va_start(ap, format);
+ out = va_arg(ap, void **);
+ ret = duk__parse_pointer(str, out);
+ va_end(ap);
+
+ return ret;
+}
+
+#undef DUK__WRITE_CHAR
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.h
new file mode 100755
index 000000000..f0aa6b586
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.h
@@ -0,0 +1,12 @@
+#if !defined(DUK_MINIMAL_PRINTF_H_INCLUDED)
+#define DUK_MINIMAL_PRINTF_H_INCLUDED
+
+#include <stdarg.h> /* va_list etc */
+#include <stddef.h> /* size_t */
+
+extern int duk_minimal_sprintf(char *str, const char *format, ...);
+extern int duk_minimal_snprintf(char *str, size_t size, const char *format, ...);
+extern int duk_minimal_vsnprintf(char *str, size_t size, const char *format, va_list ap);
+extern int duk_minimal_sscanf(const char *str, const char *format, ...);
+
+#endif /* DUK_MINIMAL_PRINTF_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.c
new file mode 100755
index 000000000..e2616ba19
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.c
@@ -0,0 +1,471 @@
+/*
+ * Duktape 1.x compatible module loading framework
+ */
+
+#include "duktape.h"
+#include "duk_module_duktape.h"
+
+/* (v)snprintf() is missing before MSVC 2015. Note that _(v)snprintf() does
+ * NOT NUL terminate on truncation, but that's OK here.
+ * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
+ */
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+#define snprintf _snprintf
+#endif
+
+#if 0 /* Enable manually */
+#define DUK__ASSERT(x) do { \
+ if (!(x)) { \
+ fprintf(stderr, "ASSERTION FAILED at %s:%d: " #x "\n", __FILE__, __LINE__); \
+ fflush(stderr); \
+ } \
+ } while (0)
+#define DUK__ASSERT_TOP(ctx,val) do { \
+ DUK__ASSERT(duk_get_top((ctx)) == (val)); \
+ } while (0)
+#else
+#define DUK__ASSERT(x) do { (void) (x); } while (0)
+#define DUK__ASSERT_TOP(ctx,val) do { (void) ctx; (void) (val); } while (0)
+#endif
+
+static void duk__resolve_module_id(duk_context *ctx, const char *req_id, const char *mod_id) {
+ duk_uint8_t buf[DUK_COMMONJS_MODULE_ID_LIMIT];
+ duk_uint8_t *p;
+ duk_uint8_t *q;
+ duk_uint8_t *q_last; /* last component */
+ duk_int_t int_rc;
+
+ DUK__ASSERT(req_id != NULL);
+ /* mod_id may be NULL */
+
+ /*
+ * A few notes on the algorithm:
+ *
+ * - Terms are not allowed to begin with a period unless the term
+ * is either '.' or '..'. This simplifies implementation (and
+ * is within CommonJS modules specification).
+ *
+ * - There are few output bound checks here. This is on purpose:
+ * the resolution input is length checked and the output is never
+ * longer than the input. The resolved output is written directly
+ * over the input because it's never longer than the input at any
+ * point in the algorithm.
+ *
+ * - Non-ASCII characters are processed as individual bytes and
+ * need no special treatment. However, U+0000 terminates the
+ * algorithm; this is not an issue because U+0000 is not a
+ * desirable term character anyway.
+ */
+
+ /*
+ * Set up the resolution input which is the requested ID directly
+ * (if absolute or no current module path) or with current module
+ * ID prepended (if relative and current module path exists).
+ *
+ * Suppose current module is 'foo/bar' and relative path is './quux'.
+ * The 'bar' component must be replaced so the initial input here is
+ * 'foo/bar/.././quux'.
+ */
+
+ if (mod_id != NULL && req_id[0] == '.') {
+ int_rc = snprintf((char *) buf, sizeof(buf), "%s/../%s", mod_id, req_id);
+ } else {
+ int_rc = snprintf((char *) buf, sizeof(buf), "%s", req_id);
+ }
+ if (int_rc >= (duk_int_t) sizeof(buf) || int_rc < 0) {
+ /* Potentially truncated, NUL not guaranteed in any case.
+ * The (int_rc < 0) case should not occur in practice.
+ */
+ goto resolve_error;
+ }
+ DUK__ASSERT(strlen((const char *) buf) < sizeof(buf)); /* at most sizeof(buf) - 1 */
+
+ /*
+ * Resolution loop. At the top of the loop we're expecting a valid
+ * term: '.', '..', or a non-empty identifier not starting with a period.
+ */
+
+ p = buf;
+ q = buf;
+ for (;;) {
+ duk_uint_fast8_t c;
+
+ /* Here 'p' always points to the start of a term.
+ *
+ * We can also unconditionally reset q_last here: if this is
+ * the last (non-empty) term q_last will have the right value
+ * on loop exit.
+ */
+
+ DUK__ASSERT(p >= q); /* output is never longer than input during resolution */
+
+ q_last = q;
+
+ c = *p++;
+ if (c == 0) {
+ goto resolve_error;
+ } else if (c == '.') {
+ c = *p++;
+ if (c == '/') {
+ /* Term was '.' and is eaten entirely (including dup slashes). */
+ goto eat_dup_slashes;
+ }
+ if (c == '.' && *p == '/') {
+ /* Term was '..', backtrack resolved name by one component.
+ * q[-1] = previous slash (or beyond start of buffer)
+ * q[-2] = last char of previous component (or beyond start of buffer)
+ */
+ p++; /* eat (first) input slash */
+ DUK__ASSERT(q >= buf);
+ if (q == buf) {
+ goto resolve_error;
+ }
+ DUK__ASSERT(*(q - 1) == '/');
+ q--; /* Backtrack to last output slash (dups already eliminated). */
+ for (;;) {
+ /* Backtrack to previous slash or start of buffer. */
+ DUK__ASSERT(q >= buf);
+ if (q == buf) {
+ break;
+ }
+ if (*(q - 1) == '/') {
+ break;
+ }
+ q--;
+ }
+ goto eat_dup_slashes;
+ }
+ goto resolve_error;
+ } else if (c == '/') {
+ /* e.g. require('/foo'), empty terms not allowed */
+ goto resolve_error;
+ } else {
+ for (;;) {
+ /* Copy term name until end or '/'. */
+ *q++ = c;
+ c = *p++;
+ if (c == 0) {
+ /* This was the last term, and q_last was
+ * updated to match this term at loop top.
+ */
+ goto loop_done;
+ } else if (c == '/') {
+ *q++ = '/';
+ break;
+ } else {
+ /* write on next loop */
+ }
+ }
+ }
+
+ eat_dup_slashes:
+ for (;;) {
+ /* eat dup slashes */
+ c = *p;
+ if (c != '/') {
+ break;
+ }
+ p++;
+ }
+ }
+ loop_done:
+ /* Output #1: resolved absolute name. */
+ DUK__ASSERT(q >= buf);
+ duk_push_lstring(ctx, (const char *) buf, (size_t) (q - buf));
+
+ /* Output #2: last component name. */
+ DUK__ASSERT(q >= q_last);
+ DUK__ASSERT(q_last >= buf);
+ duk_push_lstring(ctx, (const char *) q_last, (size_t) (q - q_last));
+ return;
+
+ resolve_error:
+ (void) duk_type_error(ctx, "cannot resolve module id: %s", (const char *) req_id);
+}
+
+/* Stack indices for better readability. */
+#define DUK__IDX_REQUESTED_ID 0 /* module id requested */
+#define DUK__IDX_REQUIRE 1 /* current require() function */
+#define DUK__IDX_REQUIRE_ID 2 /* the base ID of the current require() function, resolution base */
+#define DUK__IDX_RESOLVED_ID 3 /* resolved, normalized absolute module ID */
+#define DUK__IDX_LASTCOMP 4 /* last component name in resolved path */
+#define DUK__IDX_DUKTAPE 5 /* Duktape object */
+#define DUK__IDX_MODLOADED 6 /* Duktape.modLoaded[] module cache */
+#define DUK__IDX_UNDEFINED 7 /* 'undefined', artifact of lookup */
+#define DUK__IDX_FRESH_REQUIRE 8 /* new require() function for module, updated resolution base */
+#define DUK__IDX_EXPORTS 9 /* default exports table */
+#define DUK__IDX_MODULE 10 /* module object containing module.exports, etc */
+
+static duk_ret_t duk__require(duk_context *ctx) {
+ const char *str_req_id; /* requested identifier */
+ const char *str_mod_id; /* require.id of current module */
+ duk_int_t pcall_rc;
+
+ /* NOTE: we try to minimize code size by avoiding unnecessary pops,
+ * so the stack looks a bit cluttered in this function. DUK__ASSERT_TOP()
+ * assertions are used to ensure stack configuration is correct at each
+ * step.
+ */
+
+ /*
+ * Resolve module identifier into canonical absolute form.
+ */
+
+ str_req_id = duk_require_string(ctx, DUK__IDX_REQUESTED_ID);
+ duk_push_current_function(ctx);
+ duk_get_prop_string(ctx, -1, "id");
+ str_mod_id = duk_get_string(ctx, DUK__IDX_REQUIRE_ID); /* ignore non-strings */
+ duk__resolve_module_id(ctx, str_req_id, str_mod_id);
+ str_req_id = NULL;
+ str_mod_id = NULL;
+
+ /* [ requested_id require require.id resolved_id last_comp ] */
+ DUK__ASSERT_TOP(ctx, DUK__IDX_LASTCOMP + 1);
+
+ /*
+ * Cached module check.
+ *
+ * If module has been loaded or its loading has already begun without
+ * finishing, return the same cached value (module.exports). The
+ * value is registered when module load starts so that circular
+ * references can be supported to some extent.
+ */
+
+ duk_push_global_stash(ctx);
+ duk_get_prop_string(ctx, -1, "\xff" "module:Duktape");
+ duk_remove(ctx, -2); /* Lookup stashed, original 'Duktape' object. */
+ duk_get_prop_string(ctx, DUK__IDX_DUKTAPE, "modLoaded"); /* Duktape.modLoaded */
+ duk_require_type_mask(ctx, DUK__IDX_MODLOADED, DUK_TYPE_MASK_OBJECT);
+ DUK__ASSERT_TOP(ctx, DUK__IDX_MODLOADED + 1);
+
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID);
+ if (duk_get_prop(ctx, DUK__IDX_MODLOADED)) {
+ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded Duktape.modLoaded[id] ] */
+ duk_get_prop_string(ctx, -1, "exports"); /* return module.exports */
+ return 1;
+ }
+ DUK__ASSERT_TOP(ctx, DUK__IDX_UNDEFINED + 1);
+
+ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined ] */
+
+ /*
+ * Module not loaded (and loading not started previously).
+ *
+ * Create a new require() function with 'id' set to resolved ID
+ * of module being loaded. Also create 'exports' and 'module'
+ * tables but don't register exports to the loaded table yet.
+ * We don't want to do that unless the user module search callbacks
+ * succeeds in finding the module.
+ */
+
+ /* Fresh require: require.id is left configurable (but not writable)
+ * so that is not easy to accidentally tweak it, but it can still be
+ * done with Object.defineProperty().
+ *
+ * XXX: require.id could also be just made non-configurable, as there
+ * is no practical reason to touch it (at least from Ecmascript code).
+ */
+ duk_push_c_function(ctx, duk__require, 1 /*nargs*/);
+ duk_push_string(ctx, "name");
+ duk_push_string(ctx, "require");
+ duk_def_prop(ctx, DUK__IDX_FRESH_REQUIRE, DUK_DEFPROP_HAVE_VALUE); /* not writable, not enumerable, not configurable */
+ duk_push_string(ctx, "id");
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID);
+ duk_def_prop(ctx, DUK__IDX_FRESH_REQUIRE, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_CONFIGURABLE); /* a fresh require() with require.id = resolved target module id */
+
+ /* Module table:
+ * - module.exports: initial exports table (may be replaced by user)
+ * - module.id is non-writable and non-configurable, as the CommonJS
+ * spec suggests this if possible
+ * - module.filename: not set, defaults to resolved ID if not explicitly
+ * set by modSearch() (note capitalization, not .fileName, matches Node.js)
+ * - module.name: not set, defaults to last component of resolved ID if
+ * not explicitly set by modSearch()
+ */
+ duk_push_object(ctx); /* exports */
+ duk_push_object(ctx); /* module */
+ duk_push_string(ctx, "exports");
+ duk_dup(ctx, DUK__IDX_EXPORTS);
+ duk_def_prop(ctx, DUK__IDX_MODULE, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE); /* module.exports = exports */
+ duk_push_string(ctx, "id");
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID); /* resolved id: require(id) must return this same module */
+ duk_def_prop(ctx, DUK__IDX_MODULE, DUK_DEFPROP_HAVE_VALUE); /* module.id = resolved_id; not writable, not enumerable, not configurable */
+ duk_compact(ctx, DUK__IDX_MODULE); /* module table remains registered to modLoaded, minimize its size */
+ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 1);
+
+ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module ] */
+
+ /* Register the module table early to modLoaded[] so that we can
+ * support circular references even in modSearch(). If an error
+ * is thrown, we'll delete the reference.
+ */
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID);
+ duk_dup(ctx, DUK__IDX_MODULE);
+ duk_put_prop(ctx, DUK__IDX_MODLOADED); /* Duktape.modLoaded[resolved_id] = module */
+
+ /*
+ * Call user provided module search function and build the wrapped
+ * module source code (if necessary). The module search function
+ * can be used to implement pure Ecmacsript, pure C, and mixed
+ * Ecmascript/C modules.
+ *
+ * The module search function can operate on the exports table directly
+ * (e.g. DLL code can register values to it). It can also return a
+ * string which is interpreted as module source code (if a non-string
+ * is returned the module is assumed to be a pure C one). If a module
+ * cannot be found, an error must be thrown by the user callback.
+ *
+ * Because Duktape.modLoaded[] already contains the module being
+ * loaded, circular references for C modules should also work
+ * (although expected to be quite rare).
+ */
+
+ duk_push_string(ctx, "(function(require,exports,module){");
+
+ /* Duktape.modSearch(resolved_id, fresh_require, exports, module). */
+ duk_get_prop_string(ctx, DUK__IDX_DUKTAPE, "modSearch"); /* Duktape.modSearch */
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID);
+ duk_dup(ctx, DUK__IDX_FRESH_REQUIRE);
+ duk_dup(ctx, DUK__IDX_EXPORTS);
+ duk_dup(ctx, DUK__IDX_MODULE); /* [ ... Duktape.modSearch resolved_id last_comp fresh_require exports module ] */
+ pcall_rc = duk_pcall(ctx, 4 /*nargs*/); /* -> [ ... source ] */
+ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 3);
+
+ if (pcall_rc != DUK_EXEC_SUCCESS) {
+ /* Delete entry in Duktape.modLoaded[] and rethrow. */
+ goto delete_rethrow;
+ }
+
+ /* If user callback did not return source code, module loading
+ * is finished (user callback initialized exports table directly).
+ */
+ if (!duk_is_string(ctx, -1)) {
+ /* User callback did not return source code, so module loading
+ * is finished: just update modLoaded with final module.exports
+ * and we're done.
+ */
+ goto return_exports;
+ }
+
+ /* Finish the wrapped module source. Force module.filename as the
+ * function .fileName so it gets set for functions defined within a
+ * module. This also ensures loggers created within the module get
+ * the module ID (or overridden filename) as their default logger name.
+ * (Note capitalization: .filename matches Node.js while .fileName is
+ * used elsewhere in Duktape.)
+ */
+ duk_push_string(ctx, "\n})"); /* Newline allows module last line to contain a // comment. */
+ duk_concat(ctx, 3);
+ if (!duk_get_prop_string(ctx, DUK__IDX_MODULE, "filename")) {
+ /* module.filename for .fileName, default to resolved ID if
+ * not present.
+ */
+ duk_pop(ctx);
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID);
+ }
+ pcall_rc = duk_pcompile(ctx, DUK_COMPILE_EVAL);
+ if (pcall_rc != DUK_EXEC_SUCCESS) {
+ goto delete_rethrow;
+ }
+ pcall_rc = duk_pcall(ctx, 0); /* -> eval'd function wrapper (not called yet) */
+ if (pcall_rc != DUK_EXEC_SUCCESS) {
+ goto delete_rethrow;
+ }
+
+ /* Module has now evaluated to a wrapped module function. Force its
+ * .name to match module.name (defaults to last component of resolved
+ * ID) so that it is shown in stack traces too. Note that we must not
+ * introduce an actual name binding into the function scope (which is
+ * usually the case with a named function) because it would affect the
+ * scope seen by the module and shadow accesses to globals of the same name.
+ * This is now done by compiling the function as anonymous and then forcing
+ * its .name without setting a "has name binding" flag.
+ */
+
+ duk_push_string(ctx, "name");
+ if (!duk_get_prop_string(ctx, DUK__IDX_MODULE, "name")) {
+ /* module.name for .name, default to last component if
+ * not present.
+ */
+ duk_pop(ctx);
+ duk_dup(ctx, DUK__IDX_LASTCOMP);
+ }
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);
+
+ /*
+ * Call the wrapped module function.
+ *
+ * Use a protected call so that we can update Duktape.modLoaded[resolved_id]
+ * even if the module throws an error.
+ */
+
+ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module mod_func ] */
+ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 2);
+
+ duk_dup(ctx, DUK__IDX_EXPORTS); /* exports (this binding) */
+ duk_dup(ctx, DUK__IDX_FRESH_REQUIRE); /* fresh require (argument) */
+ duk_get_prop_string(ctx, DUK__IDX_MODULE, "exports"); /* relookup exports from module.exports in case it was changed by modSearch */
+ duk_dup(ctx, DUK__IDX_MODULE); /* module (argument) */
+ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 6);
+
+ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module mod_func exports fresh_require exports module ] */
+
+ pcall_rc = duk_pcall_method(ctx, 3 /*nargs*/);
+ if (pcall_rc != DUK_EXEC_SUCCESS) {
+ /* Module loading failed. Node.js will forget the module
+ * registration so that another require() will try to load
+ * the module again. Mimic that behavior.
+ */
+ goto delete_rethrow;
+ }
+
+ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module result(ignored) ] */
+ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 2);
+
+ /* fall through */
+
+ return_exports:
+ duk_get_prop_string(ctx, DUK__IDX_MODULE, "exports");
+ duk_compact(ctx, -1); /* compact the exports table */
+ return 1; /* return module.exports */
+
+ delete_rethrow:
+ duk_dup(ctx, DUK__IDX_RESOLVED_ID);
+ duk_del_prop(ctx, DUK__IDX_MODLOADED); /* delete Duktape.modLoaded[resolved_id] */
+ (void) duk_throw(ctx); /* rethrow original error */
+ return 0; /* not reachable */
+}
+
+void duk_module_duktape_init(duk_context *ctx) {
+ /* Stash 'Duktape' in case it's modified. */
+ duk_push_global_stash(ctx);
+ duk_get_global_string(ctx, "Duktape");
+ duk_put_prop_string(ctx, -2, "\xff" "module:Duktape");
+ duk_pop(ctx);
+
+ /* Register `require` as a global function. */
+ duk_eval_string(ctx,
+ "(function(req){"
+ "var D=Object.defineProperty;"
+ "D(req,'name',{value:'require'});"
+ "D(this,'require',{value:req,writable:true,configurable:true});"
+ "D(Duktape,'modLoaded',{value:Object.create(null),writable:true,configurable:true});"
+ "})");
+ duk_push_c_function(ctx, duk__require, 1 /*nargs*/);
+ duk_call(ctx, 1);
+ duk_pop(ctx);
+}
+
+#undef DUK__ASSERT
+#undef DUK__ASSERT_TOP
+#undef DUK__IDX_REQUESTED_ID
+#undef DUK__IDX_REQUIRE
+#undef DUK__IDX_REQUIRE_ID
+#undef DUK__IDX_RESOLVED_ID
+#undef DUK__IDX_LASTCOMP
+#undef DUK__IDX_DUKTAPE
+#undef DUK__IDX_MODLOADED
+#undef DUK__IDX_UNDEFINED
+#undef DUK__IDX_FRESH_REQUIRE
+#undef DUK__IDX_EXPORTS
+#undef DUK__IDX_MODULE
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.h
new file mode 100755
index 000000000..8c8808104
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.h
@@ -0,0 +1,14 @@
+#if !defined(DUK_MODULE_DUKTAPE_H_INCLUDED)
+#define DUK_MODULE_DUKTAPE_H_INCLUDED
+
+#include "duktape.h"
+
+/* Maximum length of CommonJS module identifier to resolve. Length includes
+ * both current module ID, requested (possibly relative) module ID, and a
+ * slash in between.
+ */
+#define DUK_COMMONJS_MODULE_ID_LIMIT 256
+
+extern void duk_module_duktape_init(duk_context *ctx);
+
+#endif /* DUK_MODULE_DUKTAPE_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.c
new file mode 100755
index 000000000..9dd48bf53
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.c
@@ -0,0 +1,333 @@
+/*
+ * Node.js-like module loading framework for Duktape
+ *
+ * https://nodejs.org/api/modules.html
+ */
+
+#include "duktape.h"
+#include "duk_module_node.h"
+
+#if DUK_VERSION >= 19999
+static duk_int_t duk__eval_module_source(duk_context *ctx, void *udata);
+#else
+static duk_int_t duk__eval_module_source(duk_context *ctx);
+#endif
+static void duk__push_module_object(duk_context *ctx, const char *id, duk_bool_t main);
+
+static duk_bool_t duk__get_cached_module(duk_context *ctx, const char *id) {
+ duk_push_global_stash(ctx);
+ (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache");
+ if (duk_get_prop_string(ctx, -1, id)) {
+ duk_remove(ctx, -2);
+ duk_remove(ctx, -2);
+ return 1;
+ } else {
+ duk_pop_3(ctx);
+ return 0;
+ }
+}
+
+/* Place a `module` object on the top of the value stack into the require cache
+ * based on its `.id` property. As a convenience to the caller, leave the
+ * object on top of the value stack afterwards.
+ */
+static void duk__put_cached_module(duk_context *ctx) {
+ /* [ ... module ] */
+
+ duk_push_global_stash(ctx);
+ (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache");
+ duk_dup(ctx, -3);
+
+ /* [ ... module stash req_cache module ] */
+
+ (void) duk_get_prop_string(ctx, -1, "id");
+ duk_dup(ctx, -2);
+ duk_put_prop(ctx, -4);
+
+ duk_pop_3(ctx); /* [ ... module ] */
+}
+
+static void duk__del_cached_module(duk_context *ctx, const char *id) {
+ duk_push_global_stash(ctx);
+ (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache");
+ duk_del_prop_string(ctx, -1, id);
+ duk_pop_2(ctx);
+}
+
+static duk_ret_t duk__handle_require(duk_context *ctx) {
+ /*
+ * Value stack handling here is a bit sloppy but should be correct.
+ * Call handling will clean up any extra garbage for us.
+ */
+
+ const char *id;
+ const char *parent_id;
+ duk_idx_t module_idx;
+ duk_idx_t stash_idx;
+ duk_int_t ret;
+
+ duk_push_global_stash(ctx);
+ stash_idx = duk_normalize_index(ctx, -1);
+
+ duk_push_current_function(ctx);
+ (void) duk_get_prop_string(ctx, -1, "\xff" "moduleId");
+ parent_id = duk_require_string(ctx, -1);
+ (void) parent_id; /* not used directly; suppress warning */
+
+ /* [ id stash require parent_id ] */
+
+ id = duk_require_string(ctx, 0);
+
+ (void) duk_get_prop_string(ctx, stash_idx, "\xff" "modResolve");
+ duk_dup(ctx, 0); /* module ID */
+ duk_dup(ctx, -3); /* parent ID */
+ duk_call(ctx, 2);
+
+ /* [ ... stash ... resolved_id ] */
+
+ id = duk_require_string(ctx, -1);
+
+ if (duk__get_cached_module(ctx, id)) {
+ goto have_module; /* use the cached module */
+ }
+
+ duk__push_module_object(ctx, id, 0 /*main*/);
+ duk__put_cached_module(ctx); /* module remains on stack */
+
+ /*
+ * From here on out, we have to be careful not to throw. If it can't be
+ * avoided, the error must be caught and the module removed from the
+ * require cache before rethrowing. This allows the application to
+ * reattempt loading the module.
+ */
+
+ module_idx = duk_normalize_index(ctx, -1);
+
+ /* [ ... stash ... resolved_id module ] */
+
+ (void) duk_get_prop_string(ctx, stash_idx, "\xff" "modLoad");
+ duk_dup(ctx, -3); /* resolved ID */
+ (void) duk_get_prop_string(ctx, module_idx, "exports");
+ duk_dup(ctx, module_idx);
+ ret = duk_pcall(ctx, 3);
+ if (ret != DUK_EXEC_SUCCESS) {
+ duk__del_cached_module(ctx, id);
+ (void) duk_throw(ctx); /* rethrow */
+ }
+
+ if (duk_is_string(ctx, -1)) {
+ duk_int_t ret;
+
+ /* [ ... module source ] */
+
+#if DUK_VERSION >= 19999
+ ret = duk_safe_call(ctx, duk__eval_module_source, NULL, 2, 1);
+#else
+ ret = duk_safe_call(ctx, duk__eval_module_source, 2, 1);
+#endif
+ if (ret != DUK_EXEC_SUCCESS) {
+ duk__del_cached_module(ctx, id);
+ (void) duk_throw(ctx); /* rethrow */
+ }
+ } else if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+ } else {
+ duk__del_cached_module(ctx, id);
+ (void) duk_type_error(ctx, "invalid module load callback return value");
+ }
+
+ /* fall through */
+
+ have_module:
+ /* [ ... module ] */
+
+ (void) duk_get_prop_string(ctx, -1, "exports");
+ return 1;
+}
+
+static void duk__push_require_function(duk_context *ctx, const char *id) {
+ duk_push_c_function(ctx, duk__handle_require, 1);
+ duk_push_string(ctx, "name");
+ duk_push_string(ctx, "require");
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE);
+ duk_push_string(ctx, id);
+ duk_put_prop_string(ctx, -2, "\xff" "moduleId");
+
+ /* require.cache */
+ duk_push_global_stash(ctx);
+ (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache");
+ duk_put_prop_string(ctx, -3, "cache");
+ duk_pop(ctx);
+
+ /* require.main */
+ duk_push_global_stash(ctx);
+ (void) duk_get_prop_string(ctx, -1, "\xff" "mainModule");
+ duk_put_prop_string(ctx, -3, "main");
+ duk_pop(ctx);
+}
+
+static void duk__push_module_object(duk_context *ctx, const char *id, duk_bool_t main) {
+ duk_push_object(ctx);
+
+ /* Set this as the main module, if requested */
+ if (main) {
+ duk_push_global_stash(ctx);
+ duk_dup(ctx, -2);
+ duk_put_prop_string(ctx, -2, "\xff" "mainModule");
+ duk_pop(ctx);
+ }
+
+ /* Node.js uses the canonicalized filename of a module for both module.id
+ * and module.filename. We have no concept of a file system here, so just
+ * use the module ID for both values.
+ */
+ duk_push_string(ctx, id);
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, "filename");
+ duk_put_prop_string(ctx, -2, "id");
+
+ /* module.exports = {} */
+ duk_push_object(ctx);
+ duk_put_prop_string(ctx, -2, "exports");
+
+ /* module.loaded = false */
+ duk_push_false(ctx);
+ duk_put_prop_string(ctx, -2, "loaded");
+
+ /* module.require */
+ duk__push_require_function(ctx, id);
+ duk_put_prop_string(ctx, -2, "require");
+}
+
+#if DUK_VERSION >= 19999
+static duk_int_t duk__eval_module_source(duk_context *ctx, void *udata) {
+#else
+static duk_int_t duk__eval_module_source(duk_context *ctx) {
+#endif
+ const char *src;
+
+ /*
+ * Stack: [ ... module source ]
+ */
+
+#if DUK_VERSION >= 19999
+ (void) udata;
+#endif
+
+ /* Wrap the module code in a function expression. This is the simplest
+ * way to implement CommonJS closure semantics and matches the behavior of
+ * e.g. Node.js.
+ */
+ duk_push_string(ctx, "(function(exports,require,module,__filename,__dirname){");
+ src = duk_require_string(ctx, -2);
+ duk_push_string(ctx, (src[0] == '#' && src[1] == '!') ? "//" : ""); /* Shebang support. */
+ duk_dup(ctx, -3); /* source */
+ duk_push_string(ctx, "\n})"); /* Newline allows module last line to contain a // comment. */
+ duk_concat(ctx, 4);
+
+ /* [ ... module source func_src ] */
+
+ (void) duk_get_prop_string(ctx, -3, "filename");
+ duk_compile(ctx, DUK_COMPILE_EVAL);
+ duk_call(ctx, 0);
+
+ /* [ ... module source func ] */
+
+ /* Set name for the wrapper function. */
+ duk_push_string(ctx, "name");
+ duk_push_string(ctx, "main");
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);
+
+ /* call the function wrapper */
+ (void) duk_get_prop_string(ctx, -3, "exports"); /* exports */
+ (void) duk_get_prop_string(ctx, -4, "require"); /* require */
+ duk_dup(ctx, -5); /* module */
+ (void) duk_get_prop_string(ctx, -6, "filename"); /* __filename */
+ duk_push_undefined(ctx); /* __dirname */
+ duk_call(ctx, 5);
+
+ /* [ ... module source result(ignore) ] */
+
+ /* module.loaded = true */
+ duk_push_true(ctx);
+ duk_put_prop_string(ctx, -4, "loaded");
+
+ /* [ ... module source retval ] */
+
+ duk_pop_2(ctx);
+
+ /* [ ... module ] */
+
+ return 1;
+}
+
+/* Load a module as the 'main' module. */
+duk_ret_t duk_module_node_peval_main(duk_context *ctx, const char *path) {
+ /*
+ * Stack: [ ... source ]
+ */
+
+ duk__push_module_object(ctx, path, 1 /*main*/);
+ /* [ ... source module ] */
+
+ duk_dup(ctx, 0);
+ /* [ ... source module source ] */
+
+#if DUK_VERSION >= 19999
+ return duk_safe_call(ctx, duk__eval_module_source, NULL, 2, 1);
+#else
+ return duk_safe_call(ctx, duk__eval_module_source, 2, 1);
+#endif
+}
+
+void duk_module_node_init(duk_context *ctx) {
+ /*
+ * Stack: [ ... options ] => [ ... ]
+ */
+
+ duk_idx_t options_idx;
+
+ duk_require_object_coercible(ctx, -1); /* error before setting up requireCache */
+ options_idx = duk_require_normalize_index(ctx, -1);
+
+ /* Initialize the require cache to a fresh object. */
+ duk_push_global_stash(ctx);
+#if DUK_VERSION >= 19999
+ duk_push_bare_object(ctx);
+#else
+ duk_push_object(ctx);
+ duk_push_undefined(ctx);
+ duk_set_prototype(ctx, -2);
+#endif
+ duk_put_prop_string(ctx, -2, "\xff" "requireCache");
+ duk_pop(ctx);
+
+ /* Stash callbacks for later use. User code can overwrite them later
+ * on directly by accessing the global stash.
+ */
+ duk_push_global_stash(ctx);
+ duk_get_prop_string(ctx, options_idx, "resolve");
+ duk_require_function(ctx, -1);
+ duk_put_prop_string(ctx, -2, "\xff" "modResolve");
+ duk_get_prop_string(ctx, options_idx, "load");
+ duk_require_function(ctx, -1);
+ duk_put_prop_string(ctx, -2, "\xff" "modLoad");
+ duk_pop(ctx);
+
+ /* Stash main module. */
+ duk_push_global_stash(ctx);
+ duk_push_undefined(ctx);
+ duk_put_prop_string(ctx, -2, "\xff" "mainModule");
+ duk_pop(ctx);
+
+ /* register `require` as a global function. */
+ duk_push_global_object(ctx);
+ duk_push_string(ctx, "require");
+ duk__push_require_function(ctx, "");
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE |
+ DUK_DEFPROP_SET_WRITABLE |
+ DUK_DEFPROP_SET_CONFIGURABLE);
+ duk_pop(ctx);
+
+ duk_pop(ctx); /* pop argument */
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.h
new file mode 100755
index 000000000..aeaeaa646
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.h
@@ -0,0 +1,9 @@
+#if !defined(DUK_MODULE_NODE_H_INCLUDED)
+#define DUK_MODULE_NODE_H_INCLUDED
+
+#include "duktape.h"
+
+extern duk_ret_t duk_module_node_peval_main(duk_context *ctx, const char *path);
+extern void duk_module_node_init(duk_context *ctx);
+
+#endif /* DUK_MODULE_NODE_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.c
new file mode 100755
index 000000000..ec1259ff6
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.c
@@ -0,0 +1,127 @@
+/*
+ * Duktape 1.x compatible print() and alert() bindings.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "duktape.h"
+#include "duk_print_alert.h"
+
+#define DUK_PRINT_ALERT_FLUSH /* Flush after stdout/stderr write (Duktape 1.x: yes) */
+#undef DUK_PRINT_ALERT_SMALL /* Prefer smaller footprint (but slower and more memory churn) */
+
+#if defined(DUK_PRINT_ALERT_SMALL)
+static duk_ret_t duk__print_alert_helper(duk_context *ctx, FILE *fh) {
+ duk_idx_t nargs;
+
+ nargs = duk_get_top(ctx);
+
+ /* If argument count is 1 and first argument is a buffer, write the buffer
+ * as raw data into the file without a newline; this allows exact control
+ * over stdout/stderr without an additional entrypoint (useful for now).
+ * Otherwise current print/alert semantics are to ToString() coerce
+ * arguments, join them with a single space, and append a newline.
+ */
+
+ if (nargs == 1 && duk_is_buffer(ctx, 0)) {
+ buf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf);
+ fwrite((const void *) buf, 1, (size_t) sz_buf, fh);
+ } else {
+ duk_push_string(ctx, " ");
+ duk_insert(ctx, 0);
+ duk_concat(ctx, nargs);
+ fprintf(fh, "%s\n", duk_require_string(ctx, -1));
+ }
+
+#if defined(DUK_PRINT_ALERT_FLUSH)
+ fflush(fh);
+#endif
+
+ return 0;
+}
+#else
+/* Faster, less churn, higher footprint option. */
+static duk_ret_t duk__print_alert_helper(duk_context *ctx, FILE *fh) {
+ duk_idx_t nargs;
+ const duk_uint8_t *buf;
+ duk_size_t sz_buf;
+ const char nl = (const char) '\n';
+ duk_uint8_t buf_stack[256];
+
+ nargs = duk_get_top(ctx);
+
+ /* If argument count is 1 and first argument is a buffer, write the buffer
+ * as raw data into the file without a newline; this allows exact control
+ * over stdout/stderr without an additional entrypoint (useful for now).
+ * Otherwise current print/alert semantics are to ToString() coerce
+ * arguments, join them with a single space, and append a newline.
+ */
+
+ if (nargs == 1 && duk_is_buffer(ctx, 0)) {
+ buf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf);
+ } else if (nargs > 0) {
+ duk_idx_t i;
+ duk_size_t sz_str;
+ const duk_uint8_t *p_str;
+ duk_uint8_t *p;
+
+ sz_buf = (duk_size_t) nargs; /* spaces (nargs - 1) + newline */
+ for (i = 0; i < nargs; i++) {
+ (void) duk_to_lstring(ctx, i, &sz_str);
+ sz_buf += sz_str;
+ }
+
+ if (sz_buf <= sizeof(buf_stack)) {
+ p = (duk_uint8_t *) buf_stack;
+ } else {
+ p = (duk_uint8_t *) duk_push_fixed_buffer(ctx, sz_buf);
+ }
+
+ buf = (const duk_uint8_t *) p;
+ for (i = 0; i < nargs; i++) {
+ p_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &sz_str);
+ memcpy((void *) p, (const void *) p_str, sz_str);
+ p += sz_str;
+ *p++ = (duk_uint8_t) (i == nargs - 1 ? '\n' : ' ');
+ }
+ } else {
+ buf = (const duk_uint8_t *) &nl;
+ sz_buf = 1;
+ }
+
+ /* 'buf' contains the string to write, 'sz_buf' contains the length
+ * (which may be zero).
+ */
+
+ if (sz_buf > 0) {
+ fwrite((const void *) buf, 1, (size_t) sz_buf, fh);
+#if defined(DUK_PRINT_ALERT_FLUSH)
+ fflush(fh);
+#endif
+ }
+
+ return 0;
+}
+#endif
+
+static duk_ret_t duk__print(duk_context *ctx) {
+ return duk__print_alert_helper(ctx, stdout);
+}
+
+static duk_ret_t duk__alert(duk_context *ctx) {
+ return duk__print_alert_helper(ctx, stderr);
+}
+
+void duk_print_alert_init(duk_context *ctx, duk_uint_t flags) {
+ (void) flags; /* unused at the moment */
+
+ /* XXX: use duk_def_prop_list(). */
+ duk_push_global_object(ctx);
+ duk_push_string(ctx, "print");
+ duk_push_c_function(ctx, duk__print, DUK_VARARGS);
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE);
+ duk_push_string(ctx, "alert");
+ duk_push_c_function(ctx, duk__alert, DUK_VARARGS);
+ duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE);
+ duk_pop(ctx);
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.h
new file mode 100755
index 000000000..fe0407368
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.h
@@ -0,0 +1,10 @@
+#if !defined(DUK_PRINT_ALERT_H_INCLUDED)
+#define DUK_PRINT_ALERT_H_INCLUDED
+
+#include "duktape.h"
+
+/* No flags at the moment. */
+
+extern void duk_print_alert_init(duk_context *ctx, duk_uint_t flags);
+
+#endif /* DUK_PRINT_ALERT_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c
new file mode 100755
index 000000000..e4a44db72
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c
@@ -0,0 +1,131 @@
+#include <stdio.h>
+#include "duktape.h"
+#include "duk_v1_compat.h"
+
+/*
+ * duk_dump_context_{stdout,stderr}()
+ */
+
+void duk_dump_context_stdout(duk_context *ctx) {
+ duk_push_context_dump(ctx);
+ fprintf(stdout, "%s\n", duk_safe_to_string(ctx, -1));
+ duk_pop(ctx);
+}
+
+void duk_dump_context_stderr(duk_context *ctx) {
+ duk_push_context_dump(ctx);
+ fprintf(stderr, "%s\n", duk_safe_to_string(ctx, -1));
+ duk_pop(ctx);
+}
+
+/*
+ * duk_push_string_file() and duk_push_string_file_raw()
+ */
+
+const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags) {
+ FILE *f = NULL;
+ char *buf;
+ long sz; /* ANSI C typing */
+
+ if (!path) {
+ goto fail;
+ }
+ f = fopen(path, "rb");
+ if (!f) {
+ goto fail;
+ }
+ if (fseek(f, 0, SEEK_END) < 0) {
+ goto fail;
+ }
+ sz = ftell(f);
+ if (sz < 0) {
+ goto fail;
+ }
+ if (fseek(f, 0, SEEK_SET) < 0) {
+ goto fail;
+ }
+ buf = (char *) duk_push_fixed_buffer(ctx, (duk_size_t) sz);
+ if ((size_t) fread(buf, 1, (size_t) sz, f) != (size_t) sz) {
+ duk_pop(ctx);
+ goto fail;
+ }
+ (void) fclose(f); /* ignore fclose() error */
+ return duk_buffer_to_string(ctx, -1);
+
+ fail:
+ if (f) {
+ (void) fclose(f); /* ignore fclose() error */
+ }
+
+ if (flags & DUK_STRING_PUSH_SAFE) {
+ duk_push_undefined(ctx);
+ } else {
+ (void) duk_type_error(ctx, "read file error");
+ }
+ return NULL;
+}
+
+/*
+ * duk_eval_file(), duk_compile_file(), and their variants
+ */
+
+void duk_eval_file(duk_context *ctx, const char *path) {
+ duk_push_string_file_raw(ctx, path, 0);
+ duk_push_string(ctx, path);
+ duk_compile(ctx, DUK_COMPILE_EVAL);
+ duk_push_global_object(ctx); /* 'this' binding */
+ duk_call_method(ctx, 0);
+}
+
+void duk_eval_file_noresult(duk_context *ctx, const char *path) {
+ duk_eval_file(ctx, path);
+ duk_pop(ctx);
+}
+
+duk_int_t duk_peval_file(duk_context *ctx, const char *path) {
+ duk_int_t rc;
+
+ duk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE);
+ duk_push_string(ctx, path);
+ rc = duk_pcompile(ctx, DUK_COMPILE_EVAL);
+ if (rc != 0) {
+ return rc;
+ }
+ duk_push_global_object(ctx); /* 'this' binding */
+ rc = duk_pcall_method(ctx, 0);
+ return rc;
+}
+
+duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path) {
+ duk_int_t rc;
+
+ rc = duk_peval_file(ctx, path);
+ duk_pop(ctx);
+ return rc;
+}
+
+void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) {
+ duk_push_string_file_raw(ctx, path, 0);
+ duk_push_string(ctx, path);
+ duk_compile(ctx, flags);
+}
+
+duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) {
+ duk_int_t rc;
+
+ duk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE);
+ duk_push_string(ctx, path);
+ rc = duk_pcompile(ctx, flags);
+ return rc;
+}
+
+/*
+ * duk_to_defaultvalue()
+ */
+
+void duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint) {
+ duk_require_type_mask(ctx, idx, DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_BUFFER |
+ DUK_TYPE_MASK_LIGHTFUNC);
+ duk_to_primitive(ctx, idx, hint);
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.h
new file mode 100755
index 000000000..884883c85
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.h
@@ -0,0 +1,28 @@
+#if !defined(DUK_V1_COMPAT_INCLUDED)
+#define DUK_V1_COMPAT_INCLUDED
+
+#include "duktape.h"
+
+/* Straight flag rename */
+#if !defined(DUK_ENUM_INCLUDE_INTERNAL)
+#define DUK_ENUM_INCLUDE_INTERNAL DUK_ENUM_INCLUDE_HIDDEN
+#endif
+
+/* Flags for duk_push_string_file_raw() */
+#define DUK_STRING_PUSH_SAFE (1 << 0) /* no error if file does not exist */
+
+extern void duk_dump_context_stdout(duk_context *ctx);
+extern void duk_dump_context_stderr(duk_context *ctx);
+extern const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags);
+extern void duk_eval_file(duk_context *ctx, const char *path);
+extern void duk_eval_file_noresult(duk_context *ctx, const char *path);
+extern duk_int_t duk_peval_file(duk_context *ctx, const char *path);
+extern duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path);
+extern void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path);
+extern duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path);
+extern void duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint);
+
+#define duk_push_string_file(ctx,path) \
+ duk_push_string_file_raw((ctx), (path), 0)
+
+#endif /* DUK_V1_COMPAT_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.c b/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.c
new file mode 100755
index 000000000..05e4b1d99
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.c
@@ -0,0 +1,95118 @@
+/*
+ * Single source autogenerated distributable for Duktape 2.2.0.
+ *
+ * Git commit a459cf3c9bd1779fc01b435d69302b742675a08f (v2.2.0).
+ * Git branch master.
+ *
+ * See Duktape AUTHORS.rst and LICENSE.txt for copyright and
+ * licensing information.
+ */
+
+/* LICENSE.txt */
+/*
+* ===============
+* Duktape license
+* ===============
+*
+* (http://opensource.org/licenses/MIT)
+*
+* Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst)
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+* THE SOFTWARE.
+*/
+
+/* AUTHORS.rst */
+/*
+* ===============
+* Duktape authors
+* ===============
+*
+* Copyright
+* =========
+*
+* Duktape copyrights are held by its authors. Each author has a copyright
+* to their contribution, and agrees to irrevocably license the contribution
+* under the Duktape ``LICENSE.txt``.
+*
+* Authors
+* =======
+*
+* Please include an e-mail address, a link to your GitHub profile, or something
+* similar to allow your contribution to be identified accurately.
+*
+* The following people have contributed code, website contents, or Wiki contents,
+* and agreed to irrevocably license their contributions under the Duktape
+* ``LICENSE.txt`` (in order of appearance):
+*
+* * Sami Vaarala <sami.vaarala@iki.fi>
+* * Niki Dobrev
+* * Andreas \u00d6man <andreas@lonelycoder.com>
+* * L\u00e1szl\u00f3 Lang\u00f3 <llango.u-szeged@partner.samsung.com>
+* * Legimet <legimet.calc@gmail.com>
+* * Karl Skomski <karl@skomski.com>
+* * Bruce Pascoe <fatcerberus1@gmail.com>
+* * Ren\u00e9 Hollander <rene@rene8888.at>
+* * Julien Hamaide (https://github.com/crazyjul)
+* * Sebastian G\u00f6tte (https://github.com/jaseg)
+* * Tomasz Magulski (https://github.com/magul)
+* * \D. Bohdan (https://github.com/dbohdan)
+* * Ond\u0159ej Jirman (https://github.com/megous)
+* * Sa\u00fal Ibarra Corretg\u00e9 <saghul@gmail.com>
+* * Jeremy HU <huxingyi@msn.com>
+* * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr)
+* * Harold Brenes (https://github.com/harold-b)
+* * Oliver Crow (https://github.com/ocrow)
+* * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski)
+* * Brett Vickers (https://github.com/beevik)
+* * Dominik Okwieka (https://github.com/okitec)
+* * Remko Tron\u00e7on (https://el-tramo.be)
+* * Romero Malaquias (rbsm@ic.ufal.br)
+* * Michael Drake <michael.drake@codethink.co.uk>
+* * Steven Don (https://github.com/shdon)
+* * Simon Stone (https://github.com/sstone1)
+* * \J. McC. (https://github.com/jmhmccr)
+*
+* Other contributions
+* ===================
+*
+* The following people have contributed something other than code (e.g. reported
+* bugs, provided ideas, etc; roughly in order of appearance):
+*
+* * Greg Burns
+* * Anthony Rabine
+* * Carlos Costa
+* * Aur\u00e9lien Bouilland
+* * Preet Desai (Pris Matic)
+* * judofyr (http://www.reddit.com/user/judofyr)
+* * Jason Woofenden
+* * Micha\u0142 Przyby\u015b
+* * Anthony Howe
+* * Conrad Pankoff
+* * Jim Schimpf
+* * Rajaran Gaunker (https://github.com/zimbabao)
+* * Andreas \u00d6man
+* * Doug Sanden
+* * Josh Engebretson (https://github.com/JoshEngebretson)
+* * Remo Eichenberger (https://github.com/remoe)
+* * Mamod Mehyar (https://github.com/mamod)
+* * David Demelier (https://github.com/markand)
+* * Tim Caswell (https://github.com/creationix)
+* * Mitchell Blank Jr (https://github.com/mitchblank)
+* * https://github.com/yushli
+* * Seo Sanghyeon (https://github.com/sanxiyn)
+* * Han ChoongWoo (https://github.com/tunz)
+* * Joshua Peek (https://github.com/josh)
+* * Bruce E. Pascoe (https://github.com/fatcerberus)
+* * https://github.com/Kelledin
+* * https://github.com/sstruchtrup
+* * Michael Drake (https://github.com/tlsa)
+* * https://github.com/chris-y
+* * Laurent Zubiaur (https://github.com/lzubiaur)
+* * Neil Kolban (https://github.com/nkolban)
+*
+* If you are accidentally missing from this list, send me an e-mail
+* (``sami.vaarala@iki.fi``) and I'll fix the omission.
+*/
+
+#line 1 "duk_replacements.c"
+/*
+ * Replacements for missing platform functions.
+ *
+ * Unlike the originals, fpclassify() and signbit() replacements don't
+ * work on any floating point types, only doubles. The C typing here
+ * mimics the standard prototypes.
+ */
+
+/* #include duk_internal.h */
+#line 1 "duk_internal.h"
+/*
+ * Top-level include file to be used for all (internal) source files.
+ *
+ * Source files should not include individual header files, as they
+ * have not been designed to be individually included.
+ */
+
+#if !defined(DUK_INTERNAL_H_INCLUDED)
+#define DUK_INTERNAL_H_INCLUDED
+
+/*
+ * The 'duktape.h' header provides the public API, but also handles all
+ * compiler and platform specific feature detection, Duktape feature
+ * resolution, inclusion of system headers, etc. These have been merged
+ * because the public API is also dependent on e.g. detecting appropriate
+ * C types which is quite platform/compiler specific especially for a non-C99
+ * build. The public API is also dependent on the resolved feature set.
+ *
+ * Some actions taken by the merged header (such as including system headers)
+ * are not appropriate for building a user application. The define
+ * DUK_COMPILING_DUKTAPE allows the merged header to skip/include some
+ * sections depending on what is being built.
+ */
+
+#define DUK_COMPILING_DUKTAPE
+#include "duktape.h"
+
+/*
+ * User declarations, e.g. prototypes for user functions used by Duktape
+ * macros.
+ */
+
+DUK_USE_USER_DECLARE()
+
+/*
+ * Duktape includes (other than duk_features.h)
+ *
+ * The header files expect to be included in an order which satisfies header
+ * dependencies correctly (the headers themselves don't include any other
+ * includes). Forward declarations are used to break circular struct/typedef
+ * dependencies.
+ */
+
+/* #include duk_dblunion.h */
+#line 1 "duk_dblunion.h"
+/*
+ * Union to access IEEE double memory representation, indexes for double
+ * memory representation, and some macros for double manipulation.
+ *
+ * Also used by packed duk_tval. Use a union for bit manipulation to
+ * minimize aliasing issues in practice. The C99 standard does not
+ * guarantee that this should work, but it's a very widely supported
+ * practice for low level manipulation.
+ *
+ * IEEE double format summary:
+ *
+ * seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
+ * A B C D E F G H
+ *
+ * s sign bit
+ * eee... exponent field
+ * fff... fraction
+ *
+ * See http://en.wikipedia.org/wiki/Double_precision_floating-point_format.
+ *
+ * NaNs are represented as exponent 0x7ff and mantissa != 0. The NaN is a
+ * signaling NaN when the highest bit of the mantissa is zero, and a quiet
+ * NaN when the highest bit is set.
+ *
+ * At least three memory layouts are relevant here:
+ *
+ * A B C D E F G H Big endian (e.g. 68k) DUK_USE_DOUBLE_BE
+ * H G F E D C B A Little endian (e.g. x86) DUK_USE_DOUBLE_LE
+ * D C B A H G F E Mixed/cross endian (e.g. ARM) DUK_USE_DOUBLE_ME
+ *
+ * ARM is a special case: ARM double values are in mixed/cross endian
+ * format while ARM duk_uint64_t values are in standard little endian
+ * format (H G F E D C B A). When a double is read as a duk_uint64_t
+ * from memory, the register will contain the (logical) value
+ * E F G H A B C D. This requires some special handling below.
+ *
+ * Indexes of various types (8-bit, 16-bit, 32-bit) in memory relative to
+ * the logical (big endian) order:
+ *
+ * byte order duk_uint8_t duk_uint16_t duk_uint32_t
+ * BE 01234567 0123 01
+ * LE 76543210 3210 10
+ * ME (ARM) 32107654 1032 01
+ *
+ * Some processors may alter NaN values in a floating point load+store.
+ * For instance, on X86 a FLD + FSTP may convert a signaling NaN to a
+ * quiet one. This is catastrophic when NaN space is used in packed
+ * duk_tval values. See: misc/clang_aliasing.c.
+ */
+
+#if !defined(DUK_DBLUNION_H_INCLUDED)
+#define DUK_DBLUNION_H_INCLUDED
+
+/*
+ * Union for accessing double parts, also serves as packed duk_tval
+ */
+
+union duk_double_union {
+ double d;
+ float f[2];
+#if defined(DUK_USE_64BIT_OPS)
+ duk_uint64_t ull[1];
+#endif
+ duk_uint32_t ui[2];
+ duk_uint16_t us[4];
+ duk_uint8_t uc[8];
+#if defined(DUK_USE_PACKED_TVAL)
+ void *vp[2]; /* used by packed duk_tval, assumes sizeof(void *) == 4 */
+#endif
+};
+
+typedef union duk_double_union duk_double_union;
+
+/*
+ * Indexes of various types with respect to big endian (logical) layout
+ */
+
+#if defined(DUK_USE_DOUBLE_LE)
+#if defined(DUK_USE_64BIT_OPS)
+#define DUK_DBL_IDX_ULL0 0
+#endif
+#define DUK_DBL_IDX_UI0 1
+#define DUK_DBL_IDX_UI1 0
+#define DUK_DBL_IDX_US0 3
+#define DUK_DBL_IDX_US1 2
+#define DUK_DBL_IDX_US2 1
+#define DUK_DBL_IDX_US3 0
+#define DUK_DBL_IDX_UC0 7
+#define DUK_DBL_IDX_UC1 6
+#define DUK_DBL_IDX_UC2 5
+#define DUK_DBL_IDX_UC3 4
+#define DUK_DBL_IDX_UC4 3
+#define DUK_DBL_IDX_UC5 2
+#define DUK_DBL_IDX_UC6 1
+#define DUK_DBL_IDX_UC7 0
+#define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */
+#define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */
+#elif defined(DUK_USE_DOUBLE_BE)
+#if defined(DUK_USE_64BIT_OPS)
+#define DUK_DBL_IDX_ULL0 0
+#endif
+#define DUK_DBL_IDX_UI0 0
+#define DUK_DBL_IDX_UI1 1
+#define DUK_DBL_IDX_US0 0
+#define DUK_DBL_IDX_US1 1
+#define DUK_DBL_IDX_US2 2
+#define DUK_DBL_IDX_US3 3
+#define DUK_DBL_IDX_UC0 0
+#define DUK_DBL_IDX_UC1 1
+#define DUK_DBL_IDX_UC2 2
+#define DUK_DBL_IDX_UC3 3
+#define DUK_DBL_IDX_UC4 4
+#define DUK_DBL_IDX_UC5 5
+#define DUK_DBL_IDX_UC6 6
+#define DUK_DBL_IDX_UC7 7
+#define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */
+#define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */
+#elif defined(DUK_USE_DOUBLE_ME)
+#if defined(DUK_USE_64BIT_OPS)
+#define DUK_DBL_IDX_ULL0 0 /* not directly applicable, byte order differs from a double */
+#endif
+#define DUK_DBL_IDX_UI0 0
+#define DUK_DBL_IDX_UI1 1
+#define DUK_DBL_IDX_US0 1
+#define DUK_DBL_IDX_US1 0
+#define DUK_DBL_IDX_US2 3
+#define DUK_DBL_IDX_US3 2
+#define DUK_DBL_IDX_UC0 3
+#define DUK_DBL_IDX_UC1 2
+#define DUK_DBL_IDX_UC2 1
+#define DUK_DBL_IDX_UC3 0
+#define DUK_DBL_IDX_UC4 7
+#define DUK_DBL_IDX_UC5 6
+#define DUK_DBL_IDX_UC6 5
+#define DUK_DBL_IDX_UC7 4
+#define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */
+#define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */
+#else
+#error internal error
+#endif
+
+/*
+ * Helper macros for reading/writing memory representation parts, used
+ * by duk_numconv.c and duk_tval.h.
+ */
+
+#define DUK_DBLUNION_SET_DOUBLE(u,v) do { \
+ (u)->d = (v); \
+ } while (0)
+
+#define DUK_DBLUNION_SET_HIGH32(u,v) do { \
+ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \
+ } while (0)
+
+#if defined(DUK_USE_64BIT_OPS)
+#if defined(DUK_USE_DOUBLE_ME)
+#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \
+ (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \
+ } while (0)
+#else
+#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \
+ (u)->ull[DUK_DBL_IDX_ULL0] = ((duk_uint64_t) (v)) << 32; \
+ } while (0)
+#endif
+#else /* DUK_USE_64BIT_OPS */
+#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \
+ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \
+ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0; \
+ } while (0)
+#endif /* DUK_USE_64BIT_OPS */
+
+#define DUK_DBLUNION_SET_LOW32(u,v) do { \
+ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \
+ } while (0)
+
+#define DUK_DBLUNION_GET_DOUBLE(u) ((u)->d)
+#define DUK_DBLUNION_GET_HIGH32(u) ((u)->ui[DUK_DBL_IDX_UI0])
+#define DUK_DBLUNION_GET_LOW32(u) ((u)->ui[DUK_DBL_IDX_UI1])
+
+#if defined(DUK_USE_64BIT_OPS)
+#if defined(DUK_USE_DOUBLE_ME)
+#define DUK_DBLUNION_SET_UINT64(u,v) do { \
+ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) ((v) >> 32); \
+ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \
+ } while (0)
+#define DUK_DBLUNION_GET_UINT64(u) \
+ ((((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI0]) << 32) | \
+ ((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI1]))
+#else
+#define DUK_DBLUNION_SET_UINT64(u,v) do { \
+ (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \
+ } while (0)
+#define DUK_DBLUNION_GET_UINT64(u) ((u)->ull[DUK_DBL_IDX_ULL0])
+#endif
+#define DUK_DBLUNION_SET_INT64(u,v) DUK_DBLUNION_SET_UINT64((u), (duk_uint64_t) (v))
+#define DUK_DBLUNION_GET_INT64(u) ((duk_int64_t) DUK_DBLUNION_GET_UINT64((u)))
+#endif /* DUK_USE_64BIT_OPS */
+
+/*
+ * Double NaN manipulation macros related to NaN normalization needed when
+ * using the packed duk_tval representation. NaN normalization is necessary
+ * to keep double values compatible with the duk_tval format.
+ *
+ * When packed duk_tval is used, the NaN space is used to store pointers
+ * and other tagged values in addition to NaNs. Actual NaNs are normalized
+ * to a specific quiet NaN. The macros below are used by the implementation
+ * to check and normalize NaN values when they might be created. The macros
+ * are essentially NOPs when the non-packed duk_tval representation is used.
+ *
+ * A FULL check is exact and checks all bits. A NOTFULL check is used by
+ * the packed duk_tval and works correctly for all NaNs except those that
+ * begin with 0x7ff0. Since the 'normalized NaN' values used with packed
+ * duk_tval begin with 0x7ff8, the partial check is reliable when packed
+ * duk_tval is used. The 0x7ff8 prefix means the normalized NaN will be a
+ * quiet NaN regardless of its remaining lower bits.
+ *
+ * The ME variant below is specifically for ARM byte order, which has the
+ * feature that while doubles have a mixed byte order (32107654), unsigned
+ * long long values has a little endian byte order (76543210). When writing
+ * a logical double value through a ULL pointer, the 32-bit words need to be
+ * swapped; hence the #if defined()s below for ULL writes with DUK_USE_DOUBLE_ME.
+ * This is not full ARM support but suffices for some environments.
+ */
+
+#if defined(DUK_USE_64BIT_OPS)
+#if defined(DUK_USE_DOUBLE_ME)
+/* Macros for 64-bit ops + mixed endian doubles. */
+#define DUK__DBLUNION_SET_NAN_FULL(u) do { \
+ (u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x000000007ff80000); \
+ } while (0)
+#define DUK__DBLUNION_IS_NAN_FULL(u) \
+ ((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000)) && \
+ ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0xffffffff000fffff)) != 0))
+#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff80000))
+#define DUK__DBLUNION_IS_ANYINF(u) \
+ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x000000007ff00000))
+#define DUK__DBLUNION_IS_POSINF(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff00000))
+#define DUK__DBLUNION_IS_NEGINF(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x00000000fff00000))
+#define DUK__DBLUNION_IS_ANYZERO(u) \
+ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x0000000000000000))
+#define DUK__DBLUNION_IS_POSZERO(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000))
+#define DUK__DBLUNION_IS_NEGZERO(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000080000000))
+#else
+/* Macros for 64-bit ops + big/little endian doubles. */
+#define DUK__DBLUNION_SET_NAN_FULL(u) do { \
+ (u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x7ff8000000000000); \
+ } while (0)
+#define DUK__DBLUNION_IS_NAN_FULL(u) \
+ ((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000)) && \
+ ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0x000fffffffffffff)) != 0))
+#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff8000000000000))
+#define DUK__DBLUNION_IS_ANYINF(u) \
+ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x7ff0000000000000))
+#define DUK__DBLUNION_IS_POSINF(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff0000000000000))
+#define DUK__DBLUNION_IS_NEGINF(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0xfff0000000000000))
+#define DUK__DBLUNION_IS_ANYZERO(u) \
+ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x0000000000000000))
+#define DUK__DBLUNION_IS_POSZERO(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000))
+#define DUK__DBLUNION_IS_NEGZERO(u) \
+ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x8000000000000000))
+#endif
+#else /* DUK_USE_64BIT_OPS */
+/* Macros for no 64-bit ops, any endianness. */
+#define DUK__DBLUNION_SET_NAN_FULL(u) do { \
+ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) 0x7ff80000UL; \
+ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0x00000000UL; \
+ } while (0)
+#define DUK__DBLUNION_IS_NAN_FULL(u) \
+ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL) && \
+ (((u)->ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) != 0 || \
+ (u)->ui[DUK_DBL_IDX_UI1] != 0))
+#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \
+ (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff80000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#define DUK__DBLUNION_IS_ANYINF(u) \
+ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x7ff00000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#define DUK__DBLUNION_IS_POSINF(u) \
+ (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff00000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#define DUK__DBLUNION_IS_NEGINF(u) \
+ (((u)->ui[DUK_DBL_IDX_UI0] == 0xfff00000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#define DUK__DBLUNION_IS_ANYZERO(u) \
+ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x00000000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#define DUK__DBLUNION_IS_POSZERO(u) \
+ (((u)->ui[DUK_DBL_IDX_UI0] == 0x00000000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#define DUK__DBLUNION_IS_NEGZERO(u) \
+ (((u)->ui[DUK_DBL_IDX_UI0] == 0x80000000UL) && \
+ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))
+#endif /* DUK_USE_64BIT_OPS */
+
+#define DUK__DBLUNION_SET_NAN_NOTFULL(u) do { \
+ (u)->us[DUK_DBL_IDX_US0] = 0x7ff8UL; \
+ } while (0)
+
+#define DUK__DBLUNION_IS_NAN_NOTFULL(u) \
+ /* E == 0x7ff, topmost four bits of F != 0 => assume NaN */ \
+ ((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \
+ (((u)->us[DUK_DBL_IDX_US0] & 0x000fUL) != 0x0000UL))
+
+#define DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL(u) \
+ /* E == 0x7ff, F == 8 => normalized NaN */ \
+ ((u)->us[DUK_DBL_IDX_US0] == 0x7ff8UL)
+
+#define DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL(u) do { \
+ if (DUK__DBLUNION_IS_NAN_FULL((u))) { \
+ DUK__DBLUNION_SET_NAN_FULL((u)); \
+ } \
+ } while (0)
+
+#define DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL(u) do { \
+ if (DUK__DBLUNION_IS_NAN_NOTFULL((u))) { \
+ DUK__DBLUNION_SET_NAN_NOTFULL((u)); \
+ } \
+ } while (0)
+
+/* Concrete macros for NaN handling used by the implementation internals.
+ * Chosen so that they match the duk_tval representation: with a packed
+ * duk_tval, ensure NaNs are properly normalized; with a non-packed duk_tval
+ * these are essentially NOPs.
+ */
+
+#if defined(DUK_USE_PACKED_TVAL)
+#if defined(DUK_USE_FULL_TVAL)
+#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL((u))
+#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u))
+#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NORMALIZED_NAN_FULL((u))
+#define DUK_DBLUNION_SET_NAN(d) DUK__DBLUNION_SET_NAN_FULL((d))
+#else
+#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL((u))
+#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_NOTFULL((u))
+#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL((u))
+#define DUK_DBLUNION_SET_NAN(d) DUK__DBLUNION_SET_NAN_NOTFULL((d))
+#endif
+#define DUK_DBLUNION_IS_NORMALIZED(u) \
+ (!DUK_DBLUNION_IS_NAN((u)) || /* either not a NaN */ \
+ DUK_DBLUNION_IS_NORMALIZED_NAN((u))) /* or is a normalized NaN */
+#else /* DUK_USE_PACKED_TVAL */
+#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) /* nop: no need to normalize */
+#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */
+#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */
+#define DUK_DBLUNION_IS_NORMALIZED(u) 1 /* all doubles are considered normalized */
+#define DUK_DBLUNION_SET_NAN(u) do { \
+ /* in non-packed representation we don't care about which NaN is used */ \
+ (u)->d = DUK_DOUBLE_NAN; \
+ } while (0)
+#endif /* DUK_USE_PACKED_TVAL */
+
+#define DUK_DBLUNION_IS_ANYINF(u) DUK__DBLUNION_IS_ANYINF((u))
+#define DUK_DBLUNION_IS_POSINF(u) DUK__DBLUNION_IS_POSINF((u))
+#define DUK_DBLUNION_IS_NEGINF(u) DUK__DBLUNION_IS_NEGINF((u))
+
+#define DUK_DBLUNION_IS_ANYZERO(u) DUK__DBLUNION_IS_ANYZERO((u))
+#define DUK_DBLUNION_IS_POSZERO(u) DUK__DBLUNION_IS_POSZERO((u))
+#define DUK_DBLUNION_IS_NEGZERO(u) DUK__DBLUNION_IS_NEGZERO((u))
+
+/* XXX: native 64-bit byteswaps when available */
+
+/* 64-bit byteswap, same operation independent of target endianness. */
+#define DUK_DBLUNION_BSWAP64(u) do { \
+ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \
+ duk__bswaptmp1 = (u)->ui[0]; \
+ duk__bswaptmp2 = (u)->ui[1]; \
+ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \
+ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \
+ (u)->ui[0] = duk__bswaptmp2; \
+ (u)->ui[1] = duk__bswaptmp1; \
+ } while (0)
+
+/* Byteswap an IEEE double in the duk_double_union from host to network
+ * order. For a big endian target this is a no-op.
+ */
+#if defined(DUK_USE_DOUBLE_LE)
+#define DUK_DBLUNION_DOUBLE_HTON(u) do { \
+ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \
+ duk__bswaptmp1 = (u)->ui[0]; \
+ duk__bswaptmp2 = (u)->ui[1]; \
+ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \
+ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \
+ (u)->ui[0] = duk__bswaptmp2; \
+ (u)->ui[1] = duk__bswaptmp1; \
+ } while (0)
+#elif defined(DUK_USE_DOUBLE_ME)
+#define DUK_DBLUNION_DOUBLE_HTON(u) do { \
+ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \
+ duk__bswaptmp1 = (u)->ui[0]; \
+ duk__bswaptmp2 = (u)->ui[1]; \
+ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \
+ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \
+ (u)->ui[0] = duk__bswaptmp1; \
+ (u)->ui[1] = duk__bswaptmp2; \
+ } while (0)
+#elif defined(DUK_USE_DOUBLE_BE)
+#define DUK_DBLUNION_DOUBLE_HTON(u) do { } while (0)
+#else
+#error internal error, double endianness insane
+#endif
+
+/* Reverse operation is the same. */
+#define DUK_DBLUNION_DOUBLE_NTOH(u) DUK_DBLUNION_DOUBLE_HTON((u))
+
+/* Some sign bit helpers. */
+#if defined(DUK_USE_64BIT_OPS)
+#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000)) != 0)
+#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] >> 63U))
+#else
+#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] & 0x80000000UL) != 0)
+#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] >> 31U))
+#endif
+
+#endif /* DUK_DBLUNION_H_INCLUDED */
+/* #include duk_replacements.h */
+#line 1 "duk_replacements.h"
+#if !defined(DUK_REPLACEMENTS_H_INCLUDED)
+#define DUK_REPLACEMENTS_H_INCLUDED
+
+#if !defined(DUK_SINGLE_FILE)
+#if defined(DUK_USE_COMPUTED_INFINITY)
+DUK_INTERNAL_DECL double duk_computed_infinity;
+#endif
+#if defined(DUK_USE_COMPUTED_NAN)
+DUK_INTERNAL_DECL double duk_computed_nan;
+#endif
+#endif /* !DUK_SINGLE_FILE */
+
+#if defined(DUK_USE_REPL_FPCLASSIFY)
+DUK_INTERNAL_DECL int duk_repl_fpclassify(double x);
+#endif
+#if defined(DUK_USE_REPL_SIGNBIT)
+DUK_INTERNAL_DECL int duk_repl_signbit(double x);
+#endif
+#if defined(DUK_USE_REPL_ISFINITE)
+DUK_INTERNAL_DECL int duk_repl_isfinite(double x);
+#endif
+#if defined(DUK_USE_REPL_ISNAN)
+DUK_INTERNAL_DECL int duk_repl_isnan(double x);
+#endif
+#if defined(DUK_USE_REPL_ISINF)
+DUK_INTERNAL_DECL int duk_repl_isinf(double x);
+#endif
+
+#endif /* DUK_REPLACEMENTS_H_INCLUDED */
+/* #include duk_jmpbuf.h */
+#line 1 "duk_jmpbuf.h"
+/*
+ * Wrapper for jmp_buf.
+ *
+ * This is used because jmp_buf is an array type for backward compatibility.
+ * Wrapping jmp_buf in a struct makes pointer references, sizeof, etc,
+ * behave more intuitively.
+ *
+ * http://en.wikipedia.org/wiki/Setjmp.h#Member_types
+ */
+
+#if !defined(DUK_JMPBUF_H_INCLUDED)
+#define DUK_JMPBUF_H_INCLUDED
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+struct duk_jmpbuf {
+ duk_small_int_t dummy; /* unused */
+};
+#else
+struct duk_jmpbuf {
+ DUK_JMPBUF_TYPE jb;
+};
+#endif
+
+#endif /* DUK_JMPBUF_H_INCLUDED */
+/* #include duk_exception.h */
+#line 1 "duk_exception.h"
+/*
+ * Exception for Duktape internal throws when C++ exceptions are used
+ * for long control transfers.
+ *
+ * Doesn't inherit from any exception base class to minimize the chance
+ * that user code would accidentally catch this exception.
+ */
+
+#if !defined(DUK_EXCEPTION_H_INCLUDED)
+#define DUK_EXCEPTION_H_INCLUDED
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+class duk_internal_exception {
+ /* intentionally empty */
+};
+#endif
+
+#endif /* DUK_EXCEPTION_H_INCLUDED */
+/* #include duk_forwdecl.h */
+#line 1 "duk_forwdecl.h"
+/*
+ * Forward declarations for all Duktape structures.
+ */
+
+#if !defined(DUK_FORWDECL_H_INCLUDED)
+#define DUK_FORWDECL_H_INCLUDED
+
+/*
+ * Forward declarations
+ */
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+class duk_internal_exception;
+#else
+struct duk_jmpbuf;
+#endif
+
+/* duk_tval intentionally skipped */
+struct duk_heaphdr;
+struct duk_heaphdr_string;
+struct duk_harray;
+struct duk_hstring;
+struct duk_hstring_external;
+struct duk_hobject;
+struct duk_hcompfunc;
+struct duk_hnatfunc;
+struct duk_hboundfunc;
+struct duk_hthread;
+struct duk_hbufobj;
+struct duk_hdecenv;
+struct duk_hobjenv;
+struct duk_hproxy;
+struct duk_hbuffer;
+struct duk_hbuffer_fixed;
+struct duk_hbuffer_dynamic;
+struct duk_hbuffer_external;
+
+struct duk_propaccessor;
+union duk_propvalue;
+struct duk_propdesc;
+
+struct duk_heap;
+struct duk_breakpoint;
+
+struct duk_activation;
+struct duk_catcher;
+struct duk_strcache;
+struct duk_ljstate;
+struct duk_strtab_entry;
+
+#if defined(DUK_USE_DEBUG)
+struct duk_fixedbuffer;
+#endif
+
+struct duk_bitdecoder_ctx;
+struct duk_bitencoder_ctx;
+struct duk_bufwriter_ctx;
+
+struct duk_token;
+struct duk_re_token;
+struct duk_lexer_point;
+struct duk_lexer_ctx;
+struct duk_lexer_codepoint;
+
+struct duk_compiler_instr;
+struct duk_compiler_func;
+struct duk_compiler_ctx;
+
+struct duk_re_matcher_ctx;
+struct duk_re_compiler_ctx;
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+/* no typedef */
+#else
+typedef struct duk_jmpbuf duk_jmpbuf;
+#endif
+
+/* duk_tval intentionally skipped */
+typedef struct duk_heaphdr duk_heaphdr;
+typedef struct duk_heaphdr_string duk_heaphdr_string;
+typedef struct duk_harray duk_harray;
+typedef struct duk_hstring duk_hstring;
+typedef struct duk_hstring_external duk_hstring_external;
+typedef struct duk_hobject duk_hobject;
+typedef struct duk_hcompfunc duk_hcompfunc;
+typedef struct duk_hnatfunc duk_hnatfunc;
+typedef struct duk_hboundfunc duk_hboundfunc;
+typedef struct duk_hthread duk_hthread;
+typedef struct duk_hbufobj duk_hbufobj;
+typedef struct duk_hdecenv duk_hdecenv;
+typedef struct duk_hobjenv duk_hobjenv;
+typedef struct duk_hproxy duk_hproxy;
+typedef struct duk_hbuffer duk_hbuffer;
+typedef struct duk_hbuffer_fixed duk_hbuffer_fixed;
+typedef struct duk_hbuffer_dynamic duk_hbuffer_dynamic;
+typedef struct duk_hbuffer_external duk_hbuffer_external;
+
+typedef struct duk_propaccessor duk_propaccessor;
+typedef union duk_propvalue duk_propvalue;
+typedef struct duk_propdesc duk_propdesc;
+
+typedef struct duk_heap duk_heap;
+typedef struct duk_breakpoint duk_breakpoint;
+
+typedef struct duk_activation duk_activation;
+typedef struct duk_catcher duk_catcher;
+typedef struct duk_strcache duk_strcache;
+typedef struct duk_ljstate duk_ljstate;
+typedef struct duk_strtab_entry duk_strtab_entry;
+
+#if defined(DUK_USE_DEBUG)
+typedef struct duk_fixedbuffer duk_fixedbuffer;
+#endif
+
+typedef struct duk_bitdecoder_ctx duk_bitdecoder_ctx;
+typedef struct duk_bitencoder_ctx duk_bitencoder_ctx;
+typedef struct duk_bufwriter_ctx duk_bufwriter_ctx;
+
+typedef struct duk_token duk_token;
+typedef struct duk_re_token duk_re_token;
+typedef struct duk_lexer_point duk_lexer_point;
+typedef struct duk_lexer_ctx duk_lexer_ctx;
+typedef struct duk_lexer_codepoint duk_lexer_codepoint;
+
+typedef struct duk_compiler_instr duk_compiler_instr;
+typedef struct duk_compiler_func duk_compiler_func;
+typedef struct duk_compiler_ctx duk_compiler_ctx;
+
+typedef struct duk_re_matcher_ctx duk_re_matcher_ctx;
+typedef struct duk_re_compiler_ctx duk_re_compiler_ctx;
+
+#endif /* DUK_FORWDECL_H_INCLUDED */
+/* #include duk_tval.h */
+#line 1 "duk_tval.h"
+/*
+ * Tagged type definition (duk_tval) and accessor macros.
+ *
+ * Access all fields through the accessor macros, as the representation
+ * is quite tricky.
+ *
+ * There are two packed type alternatives: an 8-byte representation
+ * based on an IEEE double (preferred for compactness), and a 12-byte
+ * representation (portability). The latter is needed also in e.g.
+ * 64-bit environments (it usually pads to 16 bytes per value).
+ *
+ * Selecting the tagged type format involves many trade-offs (memory
+ * use, size and performance of generated code, portability, etc).
+ *
+ * NB: because macro arguments are often expressions, macros should
+ * avoid evaluating their argument more than once.
+ */
+
+#if !defined(DUK_TVAL_H_INCLUDED)
+#define DUK_TVAL_H_INCLUDED
+
+/* sanity */
+#if !defined(DUK_USE_DOUBLE_LE) && !defined(DUK_USE_DOUBLE_ME) && !defined(DUK_USE_DOUBLE_BE)
+#error unsupported: cannot determine byte order variant
+#endif
+
+#if defined(DUK_USE_PACKED_TVAL)
+/* ======================================================================== */
+
+/*
+ * Packed 8-byte representation
+ */
+
+/* use duk_double_union as duk_tval directly */
+typedef union duk_double_union duk_tval;
+typedef struct {
+ duk_uint16_t a;
+ duk_uint16_t b;
+ duk_uint16_t c;
+ duk_uint16_t d;
+} duk_tval_unused;
+
+/* tags */
+#define DUK_TAG_NORMALIZED_NAN 0x7ff8UL /* the NaN variant we use */
+/* avoid tag 0xfff0, no risk of confusion with negative infinity */
+#define DUK_TAG_MIN 0xfff1UL
+#if defined(DUK_USE_FASTINT)
+#define DUK_TAG_FASTINT 0xfff1UL /* embed: integer value */
+#endif
+#define DUK_TAG_UNUSED 0xfff2UL /* marker; not actual tagged value */
+#define DUK_TAG_UNDEFINED 0xfff3UL /* embed: nothing */
+#define DUK_TAG_NULL 0xfff4UL /* embed: nothing */
+#define DUK_TAG_BOOLEAN 0xfff5UL /* embed: 0 or 1 (false or true) */
+/* DUK_TAG_NUMBER would logically go here, but it has multiple 'tags' */
+#define DUK_TAG_POINTER 0xfff6UL /* embed: void ptr */
+#define DUK_TAG_LIGHTFUNC 0xfff7UL /* embed: func ptr */
+#define DUK_TAG_STRING 0xfff8UL /* embed: duk_hstring ptr */
+#define DUK_TAG_OBJECT 0xfff9UL /* embed: duk_hobject ptr */
+#define DUK_TAG_BUFFER 0xfffaUL /* embed: duk_hbuffer ptr */
+#define DUK_TAG_MAX 0xfffaUL
+
+/* for convenience */
+#define DUK_XTAG_BOOLEAN_FALSE 0xfff50000UL
+#define DUK_XTAG_BOOLEAN_TRUE 0xfff50001UL
+
+#define DUK_TVAL_IS_VALID_TAG(tv) \
+ (DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN)
+
+/* DUK_TVAL_UNUSED initializer for duk_tval_unused, works for any endianness. */
+#define DUK_TVAL_UNUSED_INITIALIZER() \
+ { DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED }
+
+/* two casts to avoid gcc warning: "warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]" */
+#if defined(DUK_USE_64BIT_OPS)
+#if defined(DUK_USE_DOUBLE_ME)
+#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \
+ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 16) | (((duk_uint64_t) (duk_uint32_t) (h)) << 32); \
+ } while (0)
+#else
+#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \
+ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 48) | ((duk_uint64_t) (duk_uint32_t) (h)); \
+ } while (0)
+#endif
+#else /* DUK_USE_64BIT_OPS */
+#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) (tag)) << 16; \
+ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (h); \
+ } while (0)
+#endif /* DUK_USE_64BIT_OPS */
+
+#if defined(DUK_USE_64BIT_OPS)
+/* Double casting for pointer to avoid gcc warning (cast from pointer to integer of different size) */
+#if defined(DUK_USE_DOUBLE_ME)
+#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \
+ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 16) | \
+ ((duk_uint64_t) (flags)) | \
+ (((duk_uint64_t) (duk_uint32_t) (fp)) << 32); \
+ } while (0)
+#else
+#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \
+ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 48) | \
+ (((duk_uint64_t) (flags)) << 32) | \
+ ((duk_uint64_t) (duk_uint32_t) (fp)); \
+ } while (0)
+#endif
+#else /* DUK_USE_64BIT_OPS */
+#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->ui[DUK_DBL_IDX_UI0] = (((duk_uint32_t) DUK_TAG_LIGHTFUNC) << 16) | ((duk_uint32_t) (flags)); \
+ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (fp); \
+ } while (0)
+#endif /* DUK_USE_64BIT_OPS */
+
+#if defined(DUK_USE_FASTINT)
+/* Note: masking is done for 'i' to deal with negative numbers correctly */
+#if defined(DUK_USE_DOUBLE_ME)
+#define DUK__TVAL_SET_I48(tv,i) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16 | (((duk_uint32_t) ((i) >> 32)) & 0x0000ffffUL); \
+ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \
+ } while (0)
+#define DUK__TVAL_SET_U32(tv,i) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16; \
+ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \
+ } while (0)
+#else
+#define DUK__TVAL_SET_I48(tv,i) do { \
+ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (((duk_uint64_t) (i)) & DUK_U64_CONSTANT(0x0000ffffffffffff)); \
+ } while (0)
+#define DUK__TVAL_SET_U32(tv,i) do { \
+ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (duk_uint64_t) (i); \
+ } while (0)
+#endif
+
+/* This needs to go through a cast because sign extension is needed. */
+#define DUK__TVAL_SET_I32(tv,i) do { \
+ duk_int64_t duk__tmp = (duk_int64_t) (i); \
+ DUK_TVAL_SET_I48((tv), duk__tmp); \
+ } while (0)
+
+/* XXX: Clumsy sign extend and masking of 16 topmost bits. */
+#if defined(DUK_USE_DOUBLE_ME)
+#define DUK__TVAL_GET_FASTINT(tv) (((duk_int64_t) ((((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI0]) << 32) | ((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI1]))) << 16 >> 16)
+#else
+#define DUK__TVAL_GET_FASTINT(tv) ((((duk_int64_t) (tv)->ull[DUK_DBL_IDX_ULL0]) << 16) >> 16)
+#endif
+#define DUK__TVAL_GET_FASTINT_U32(tv) ((tv)->ui[DUK_DBL_IDX_UI1])
+#define DUK__TVAL_GET_FASTINT_I32(tv) ((duk_int32_t) (tv)->ui[DUK_DBL_IDX_UI1])
+#endif /* DUK_USE_FASTINT */
+
+#define DUK_TVAL_SET_UNDEFINED(tv) do { \
+ (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNDEFINED; \
+ } while (0)
+#define DUK_TVAL_SET_UNUSED(tv) do { \
+ (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNUSED; \
+ } while (0)
+#define DUK_TVAL_SET_NULL(tv) do { \
+ (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_NULL; \
+ } while (0)
+
+#define DUK_TVAL_SET_BOOLEAN(tv,val) DUK_DBLUNION_SET_HIGH32((tv), (((duk_uint32_t) DUK_TAG_BOOLEAN) << 16) | ((duk_uint32_t) (val)))
+
+#define DUK_TVAL_SET_NAN(tv) DUK_DBLUNION_SET_NAN_FULL((tv))
+
+/* Assumes that caller has normalized NaNs, otherwise trouble ahead. */
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_SET_DOUBLE(tv,d) do { \
+ duk_double_t duk__dblval; \
+ duk__dblval = (d); \
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \
+ DUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \
+ } while (0)
+#define DUK_TVAL_SET_I48(tv,i) DUK__TVAL_SET_I48((tv), (i))
+#define DUK_TVAL_SET_I32(tv,i) DUK__TVAL_SET_I32((tv), (i))
+#define DUK_TVAL_SET_U32(tv,i) DUK__TVAL_SET_U32((tv), (i))
+#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) duk_tval_set_number_chkfast_fast((tv), (d))
+#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) duk_tval_set_number_chkfast_slow((tv), (d))
+#define DUK_TVAL_SET_NUMBER(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d))
+#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { \
+ duk_tval *duk__tv; \
+ duk_double_t duk__d; \
+ duk__tv = (tv); \
+ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \
+ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \
+ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \
+ } \
+ } while (0)
+#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { \
+ duk_tval *duk__tv; \
+ duk_double_t duk__d; \
+ duk__tv = (tv); \
+ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \
+ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \
+ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \
+ } \
+ } while (0)
+#else /* DUK_USE_FASTINT */
+#define DUK_TVAL_SET_DOUBLE(tv,d) do { \
+ duk_double_t duk__dblval; \
+ duk__dblval = (d); \
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \
+ DUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \
+ } while (0)
+#define DUK_TVAL_SET_I48(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) /* XXX: fast int-to-double */
+#define DUK_TVAL_SET_I32(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i))
+#define DUK_TVAL_SET_U32(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i))
+#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d))
+#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d))
+#define DUK_TVAL_SET_NUMBER(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d))
+#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { } while (0)
+#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { } while (0)
+#endif /* DUK_USE_FASTINT */
+
+#define DUK_TVAL_SET_FASTINT(tv,i) DUK_TVAL_SET_I48((tv), (i)) /* alias */
+
+#define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags) DUK__TVAL_SET_LIGHTFUNC((tv), (fp), (flags))
+#define DUK_TVAL_SET_STRING(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_STRING)
+#define DUK_TVAL_SET_OBJECT(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_OBJECT)
+#define DUK_TVAL_SET_BUFFER(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_BUFFER)
+#define DUK_TVAL_SET_POINTER(tv,p) DUK__TVAL_SET_TAGGEDPOINTER((tv), (p), DUK_TAG_POINTER)
+
+#define DUK_TVAL_SET_TVAL(tv,x) do { *(tv) = *(x); } while (0)
+
+/* getters */
+#define DUK_TVAL_GET_BOOLEAN(tv) ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US1])
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->d)
+#define DUK_TVAL_GET_FASTINT(tv) DUK__TVAL_GET_FASTINT((tv))
+#define DUK_TVAL_GET_FASTINT_U32(tv) DUK__TVAL_GET_FASTINT_U32((tv))
+#define DUK_TVAL_GET_FASTINT_I32(tv) DUK__TVAL_GET_FASTINT_I32((tv))
+#define DUK_TVAL_GET_NUMBER(tv) duk_tval_get_number_packed((tv))
+#else
+#define DUK_TVAL_GET_NUMBER(tv) ((tv)->d)
+#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->d)
+#endif
+#define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags) do { \
+ (out_flags) = (tv)->ui[DUK_DBL_IDX_UI0] & 0xffffUL; \
+ (out_fp) = (duk_c_function) (tv)->ui[DUK_DBL_IDX_UI1]; \
+ } while (0)
+#define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((duk_c_function) ((tv)->ui[DUK_DBL_IDX_UI1]))
+#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv) (((duk_small_uint_t) (tv)->ui[DUK_DBL_IDX_UI0]) & 0xffffUL)
+#define DUK_TVAL_GET_STRING(tv) ((duk_hstring *) (tv)->vp[DUK_DBL_IDX_VP1])
+#define DUK_TVAL_GET_OBJECT(tv) ((duk_hobject *) (tv)->vp[DUK_DBL_IDX_VP1])
+#define DUK_TVAL_GET_BUFFER(tv) ((duk_hbuffer *) (tv)->vp[DUK_DBL_IDX_VP1])
+#define DUK_TVAL_GET_POINTER(tv) ((void *) (tv)->vp[DUK_DBL_IDX_VP1])
+#define DUK_TVAL_GET_HEAPHDR(tv) ((duk_heaphdr *) (tv)->vp[DUK_DBL_IDX_VP1])
+
+/* decoding */
+#define DUK_TVAL_GET_TAG(tv) ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US0])
+
+#define DUK_TVAL_IS_UNDEFINED(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNDEFINED)
+#define DUK_TVAL_IS_UNUSED(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNUSED)
+#define DUK_TVAL_IS_NULL(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_NULL)
+#define DUK_TVAL_IS_BOOLEAN(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BOOLEAN)
+#define DUK_TVAL_IS_BOOLEAN_TRUE(tv) ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_TRUE)
+#define DUK_TVAL_IS_BOOLEAN_FALSE(tv) ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_FALSE)
+#define DUK_TVAL_IS_LIGHTFUNC(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_LIGHTFUNC)
+#define DUK_TVAL_IS_STRING(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_STRING)
+#define DUK_TVAL_IS_OBJECT(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_OBJECT)
+#define DUK_TVAL_IS_BUFFER(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BUFFER)
+#define DUK_TVAL_IS_POINTER(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_POINTER)
+#if defined(DUK_USE_FASTINT)
+/* 0xfff0 is -Infinity */
+#define DUK_TVAL_IS_DOUBLE(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL)
+#define DUK_TVAL_IS_FASTINT(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_FASTINT)
+#define DUK_TVAL_IS_NUMBER(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff1UL)
+#else
+#define DUK_TVAL_IS_NUMBER(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL)
+#define DUK_TVAL_IS_DOUBLE(tv) DUK_TVAL_IS_NUMBER((tv))
+#endif
+
+/* This is performance critical because it appears in every DECREF. */
+#define DUK_TVAL_IS_HEAP_ALLOCATED(tv) (DUK_TVAL_GET_TAG((tv)) >= DUK_TAG_STRING)
+
+#if defined(DUK_USE_FASTINT)
+DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_packed(duk_tval *tv);
+#endif
+
+#else /* DUK_USE_PACKED_TVAL */
+/* ======================================================================== */
+
+/*
+ * Portable 12-byte representation
+ */
+
+/* Note: not initializing all bytes is normally not an issue: Duktape won't
+ * read or use the uninitialized bytes so valgrind won't issue warnings.
+ * In some special cases a harmless valgrind warning may be issued though.
+ * For example, the DumpHeap debugger command writes out a compiled function's
+ * 'data' area as is, including any uninitialized bytes, which causes a
+ * valgrind warning.
+ */
+
+typedef struct duk_tval_struct duk_tval;
+
+struct duk_tval_struct {
+ duk_small_uint_t t;
+ duk_small_uint_t v_extra;
+ union {
+ duk_double_t d;
+ duk_small_int_t i;
+#if defined(DUK_USE_FASTINT)
+ duk_int64_t fi; /* if present, forces 16-byte duk_tval */
+#endif
+ void *voidptr;
+ duk_hstring *hstring;
+ duk_hobject *hobject;
+ duk_hcompfunc *hcompfunc;
+ duk_hnatfunc *hnatfunc;
+ duk_hthread *hthread;
+ duk_hbuffer *hbuffer;
+ duk_heaphdr *heaphdr;
+ duk_c_function lightfunc;
+ } v;
+};
+
+typedef struct {
+ duk_small_uint_t t;
+ duk_small_uint_t v_extra;
+ /* The rest of the fields don't matter except for debug dumps and such
+ * for which a partial initializer may trigger out-ot-bounds memory
+ * reads. Include a double field which is usually as large or larger
+ * than pointers (not always however).
+ */
+ duk_double_t d;
+} duk_tval_unused;
+
+#define DUK_TVAL_UNUSED_INITIALIZER() \
+ { DUK_TAG_UNUSED, 0, 0.0 }
+
+#define DUK_TAG_MIN 0
+#define DUK_TAG_NUMBER 0 /* DUK_TAG_NUMBER only defined for non-packed duk_tval */
+#if defined(DUK_USE_FASTINT)
+#define DUK_TAG_FASTINT 1
+#endif
+#define DUK_TAG_UNDEFINED 2
+#define DUK_TAG_NULL 3
+#define DUK_TAG_BOOLEAN 4
+#define DUK_TAG_POINTER 5
+#define DUK_TAG_LIGHTFUNC 6
+#define DUK_TAG_UNUSED 7 /* marker; not actual tagged type */
+#define DUK_TAG_STRING 8 /* first heap allocated, match bit boundary */
+#define DUK_TAG_OBJECT 9
+#define DUK_TAG_BUFFER 10
+#define DUK_TAG_MAX 10
+
+#define DUK_TVAL_IS_VALID_TAG(tv) \
+ (DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN)
+
+/* DUK_TAG_NUMBER is intentionally first, as it is the default clause in code
+ * to support the 8-byte representation. Further, it is a non-heap-allocated
+ * type so it should come before DUK_TAG_STRING. Finally, it should not break
+ * the tag value ranges covered by case-clauses in a switch-case.
+ */
+
+/* setters */
+#define DUK_TVAL_SET_UNDEFINED(tv) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_UNDEFINED; \
+ } while (0)
+
+#define DUK_TVAL_SET_UNUSED(tv) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_UNUSED; \
+ } while (0)
+
+#define DUK_TVAL_SET_NULL(tv) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_NULL; \
+ } while (0)
+
+#define DUK_TVAL_SET_BOOLEAN(tv,val) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_BOOLEAN; \
+ duk__tv->v.i = (duk_small_int_t) (val); \
+ } while (0)
+
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_SET_DOUBLE(tv,val) do { \
+ duk_tval *duk__tv; \
+ duk_double_t duk__dblval; \
+ duk__dblval = (val); \
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_NUMBER; \
+ duk__tv->v.d = duk__dblval; \
+ } while (0)
+#define DUK_TVAL_SET_I48(tv,val) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_FASTINT; \
+ duk__tv->v.fi = (val); \
+ } while (0)
+#define DUK_TVAL_SET_U32(tv,val) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_FASTINT; \
+ duk__tv->v.fi = (duk_int64_t) (val); \
+ } while (0)
+#define DUK_TVAL_SET_I32(tv,val) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_FASTINT; \
+ duk__tv->v.fi = (duk_int64_t) (val); \
+ } while (0)
+#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \
+ duk_tval_set_number_chkfast_fast((tv), (d))
+#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \
+ duk_tval_set_number_chkfast_slow((tv), (d))
+#define DUK_TVAL_SET_NUMBER(tv,val) \
+ DUK_TVAL_SET_DOUBLE((tv), (val))
+#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { \
+ duk_tval *duk__tv; \
+ duk_double_t duk__d; \
+ duk__tv = (tv); \
+ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \
+ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \
+ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \
+ } \
+ } while (0)
+#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { \
+ duk_tval *duk__tv; \
+ duk_double_t duk__d; \
+ duk__tv = (tv); \
+ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \
+ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \
+ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \
+ } \
+ } while (0)
+#else /* DUK_USE_FASTINT */
+#define DUK_TVAL_SET_DOUBLE(tv,d) \
+ DUK_TVAL_SET_NUMBER((tv), (d))
+#define DUK_TVAL_SET_I48(tv,val) \
+ DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) /* XXX: fast int-to-double */
+#define DUK_TVAL_SET_U32(tv,val) \
+ DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val))
+#define DUK_TVAL_SET_I32(tv,val) \
+ DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val))
+#define DUK_TVAL_SET_NUMBER(tv,val) do { \
+ duk_tval *duk__tv; \
+ duk_double_t duk__dblval; \
+ duk__dblval = (val); \
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_NUMBER; \
+ duk__tv->v.d = duk__dblval; \
+ } while (0)
+#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \
+ DUK_TVAL_SET_NUMBER((tv), (d))
+#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \
+ DUK_TVAL_SET_NUMBER((tv), (d))
+#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { } while (0)
+#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { } while (0)
+#endif /* DUK_USE_FASTINT */
+
+#define DUK_TVAL_SET_FASTINT(tv,i) \
+ DUK_TVAL_SET_I48((tv), (i)) /* alias */
+
+#define DUK_TVAL_SET_POINTER(tv,hptr) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_POINTER; \
+ duk__tv->v.voidptr = (hptr); \
+ } while (0)
+
+#define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_LIGHTFUNC; \
+ duk__tv->v_extra = (flags); \
+ duk__tv->v.lightfunc = (duk_c_function) (fp); \
+ } while (0)
+
+#define DUK_TVAL_SET_STRING(tv,hptr) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_STRING; \
+ duk__tv->v.hstring = (hptr); \
+ } while (0)
+
+#define DUK_TVAL_SET_OBJECT(tv,hptr) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_OBJECT; \
+ duk__tv->v.hobject = (hptr); \
+ } while (0)
+
+#define DUK_TVAL_SET_BUFFER(tv,hptr) do { \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_BUFFER; \
+ duk__tv->v.hbuffer = (hptr); \
+ } while (0)
+
+#define DUK_TVAL_SET_NAN(tv) do { \
+ /* in non-packed representation we don't care about which NaN is used */ \
+ duk_tval *duk__tv; \
+ duk__tv = (tv); \
+ duk__tv->t = DUK_TAG_NUMBER; \
+ duk__tv->v.d = DUK_DOUBLE_NAN; \
+ } while (0)
+
+#define DUK_TVAL_SET_TVAL(tv,x) do { *(tv) = *(x); } while (0)
+
+/* getters */
+#define DUK_TVAL_GET_BOOLEAN(tv) ((duk_small_uint_t) (tv)->v.i)
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->v.d)
+#define DUK_TVAL_GET_FASTINT(tv) ((tv)->v.fi)
+#define DUK_TVAL_GET_FASTINT_U32(tv) ((duk_uint32_t) ((tv)->v.fi))
+#define DUK_TVAL_GET_FASTINT_I32(tv) ((duk_int32_t) ((tv)->v.fi))
+#if 0
+#define DUK_TVAL_GET_NUMBER(tv) (DUK_TVAL_IS_FASTINT((tv)) ? \
+ (duk_double_t) DUK_TVAL_GET_FASTINT((tv)) : \
+ DUK_TVAL_GET_DOUBLE((tv)))
+#define DUK_TVAL_GET_NUMBER(tv) duk_tval_get_number_unpacked((tv))
+#else
+/* This seems reasonable overall. */
+#define DUK_TVAL_GET_NUMBER(tv) (DUK_TVAL_IS_FASTINT((tv)) ? \
+ duk_tval_get_number_unpacked_fastint((tv)) : \
+ DUK_TVAL_GET_DOUBLE((tv)))
+#endif
+#else
+#define DUK_TVAL_GET_NUMBER(tv) ((tv)->v.d)
+#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->v.d)
+#endif /* DUK_USE_FASTINT */
+#define DUK_TVAL_GET_POINTER(tv) ((tv)->v.voidptr)
+#define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags) do { \
+ (out_flags) = (duk_uint32_t) (tv)->v_extra; \
+ (out_fp) = (tv)->v.lightfunc; \
+ } while (0)
+#define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((tv)->v.lightfunc)
+#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv) ((duk_small_uint_t) ((tv)->v_extra))
+#define DUK_TVAL_GET_STRING(tv) ((tv)->v.hstring)
+#define DUK_TVAL_GET_OBJECT(tv) ((tv)->v.hobject)
+#define DUK_TVAL_GET_BUFFER(tv) ((tv)->v.hbuffer)
+#define DUK_TVAL_GET_HEAPHDR(tv) ((tv)->v.heaphdr)
+
+/* decoding */
+#define DUK_TVAL_GET_TAG(tv) ((tv)->t)
+#define DUK_TVAL_IS_UNDEFINED(tv) ((tv)->t == DUK_TAG_UNDEFINED)
+#define DUK_TVAL_IS_UNUSED(tv) ((tv)->t == DUK_TAG_UNUSED)
+#define DUK_TVAL_IS_NULL(tv) ((tv)->t == DUK_TAG_NULL)
+#define DUK_TVAL_IS_BOOLEAN(tv) ((tv)->t == DUK_TAG_BOOLEAN)
+#define DUK_TVAL_IS_BOOLEAN_TRUE(tv) (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i != 0))
+#define DUK_TVAL_IS_BOOLEAN_FALSE(tv) (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i == 0))
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_IS_DOUBLE(tv) ((tv)->t == DUK_TAG_NUMBER)
+#define DUK_TVAL_IS_FASTINT(tv) ((tv)->t == DUK_TAG_FASTINT)
+#define DUK_TVAL_IS_NUMBER(tv) ((tv)->t == DUK_TAG_NUMBER || \
+ (tv)->t == DUK_TAG_FASTINT)
+#else
+#define DUK_TVAL_IS_NUMBER(tv) ((tv)->t == DUK_TAG_NUMBER)
+#define DUK_TVAL_IS_DOUBLE(tv) DUK_TVAL_IS_NUMBER((tv))
+#endif /* DUK_USE_FASTINT */
+#define DUK_TVAL_IS_POINTER(tv) ((tv)->t == DUK_TAG_POINTER)
+#define DUK_TVAL_IS_LIGHTFUNC(tv) ((tv)->t == DUK_TAG_LIGHTFUNC)
+#define DUK_TVAL_IS_STRING(tv) ((tv)->t == DUK_TAG_STRING)
+#define DUK_TVAL_IS_OBJECT(tv) ((tv)->t == DUK_TAG_OBJECT)
+#define DUK_TVAL_IS_BUFFER(tv) ((tv)->t == DUK_TAG_BUFFER)
+
+/* This is performance critical because it's needed for every DECREF.
+ * Take advantage of the fact that the first heap allocated tag is 8,
+ * so that bit 3 is set for all heap allocated tags (and never set for
+ * non-heap-allocated tags).
+ */
+#if 0
+#define DUK_TVAL_IS_HEAP_ALLOCATED(tv) ((tv)->t >= DUK_TAG_STRING)
+#endif
+#define DUK_TVAL_IS_HEAP_ALLOCATED(tv) ((tv)->t & 0x08)
+
+#if defined(DUK_USE_FASTINT)
+#if 0
+DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked(duk_tval *tv);
+#endif
+DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv);
+#endif
+
+#endif /* DUK_USE_PACKED_TVAL */
+
+/*
+ * Convenience (independent of representation)
+ */
+
+#define DUK_TVAL_SET_BOOLEAN_TRUE(tv) DUK_TVAL_SET_BOOLEAN((tv), 1)
+#define DUK_TVAL_SET_BOOLEAN_FALSE(tv) DUK_TVAL_SET_BOOLEAN((tv), 0)
+
+#define DUK_TVAL_STRING_IS_SYMBOL(tv) \
+ DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING((tv)))
+
+/* Lightfunc flags packing and unpacking. */
+/* Sign extend: 0x0000##00 -> 0x##000000 -> sign extend to 0xssssss##.
+ * Avoid signed shifts due to portability limitations.
+ */
+#define DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags) \
+ ((duk_int32_t) (duk_int8_t) (((duk_uint16_t) (lf_flags)) >> 8))
+#define DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags) \
+ (((lf_flags) >> 4) & 0x0fU)
+#define DUK_LFUNC_FLAGS_GET_NARGS(lf_flags) \
+ ((lf_flags) & 0x0fU)
+#define DUK_LFUNC_FLAGS_PACK(magic,length,nargs) \
+ ((((duk_small_uint_t) (magic)) & 0xffU) << 8) | ((length) << 4) | (nargs)
+
+#define DUK_LFUNC_NARGS_VARARGS 0x0f /* varargs marker */
+#define DUK_LFUNC_NARGS_MIN 0x00
+#define DUK_LFUNC_NARGS_MAX 0x0e /* max, excl. varargs marker */
+#define DUK_LFUNC_LENGTH_MIN 0x00
+#define DUK_LFUNC_LENGTH_MAX 0x0f
+#define DUK_LFUNC_MAGIC_MIN (-0x80)
+#define DUK_LFUNC_MAGIC_MAX 0x7f
+
+/* fastint constants etc */
+#if defined(DUK_USE_FASTINT)
+#define DUK_FASTINT_MIN (DUK_I64_CONSTANT(-0x800000000000))
+#define DUK_FASTINT_MAX (DUK_I64_CONSTANT(0x7fffffffffff))
+#define DUK_FASTINT_BITS 48
+
+DUK_INTERNAL_DECL void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x);
+DUK_INTERNAL_DECL void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x);
+#endif
+
+#endif /* DUK_TVAL_H_INCLUDED */
+/* #include duk_builtins.h */
+#line 1 "duk_builtins.h"
+/*
+ * Automatically generated by genbuiltins.py, do not edit!
+ */
+
+#if !defined(DUK_BUILTINS_H_INCLUDED)
+#define DUK_BUILTINS_H_INCLUDED
+
+#if defined(DUK_USE_ROM_STRINGS)
+#error ROM support not enabled, rerun configure.py with --rom-support
+#else /* DUK_USE_ROM_STRINGS */
+#define DUK_STRIDX_UC_UNDEFINED 0 /* 'Undefined' */
+#define DUK_HEAP_STRING_UC_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_UNDEFINED)
+#define DUK_HTHREAD_STRING_UC_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_UNDEFINED)
+#define DUK_STRIDX_UC_NULL 1 /* 'Null' */
+#define DUK_HEAP_STRING_UC_NULL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NULL)
+#define DUK_HTHREAD_STRING_UC_NULL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NULL)
+#define DUK_STRIDX_UC_SYMBOL 2 /* 'Symbol' */
+#define DUK_HEAP_STRING_UC_SYMBOL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_SYMBOL)
+#define DUK_HTHREAD_STRING_UC_SYMBOL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_SYMBOL)
+#define DUK_STRIDX_UC_ARGUMENTS 3 /* 'Arguments' */
+#define DUK_HEAP_STRING_UC_ARGUMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ARGUMENTS)
+#define DUK_HTHREAD_STRING_UC_ARGUMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ARGUMENTS)
+#define DUK_STRIDX_UC_OBJECT 4 /* 'Object' */
+#define DUK_HEAP_STRING_UC_OBJECT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_OBJECT)
+#define DUK_HTHREAD_STRING_UC_OBJECT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_OBJECT)
+#define DUK_STRIDX_UC_FUNCTION 5 /* 'Function' */
+#define DUK_HEAP_STRING_UC_FUNCTION(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_FUNCTION)
+#define DUK_HTHREAD_STRING_UC_FUNCTION(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_FUNCTION)
+#define DUK_STRIDX_ARRAY 6 /* 'Array' */
+#define DUK_HEAP_STRING_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY)
+#define DUK_HTHREAD_STRING_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY)
+#define DUK_STRIDX_UC_STRING 7 /* 'String' */
+#define DUK_HEAP_STRING_UC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_STRING)
+#define DUK_HTHREAD_STRING_UC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_STRING)
+#define DUK_STRIDX_UC_BOOLEAN 8 /* 'Boolean' */
+#define DUK_HEAP_STRING_UC_BOOLEAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BOOLEAN)
+#define DUK_HTHREAD_STRING_UC_BOOLEAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BOOLEAN)
+#define DUK_STRIDX_UC_NUMBER 9 /* 'Number' */
+#define DUK_HEAP_STRING_UC_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NUMBER)
+#define DUK_HTHREAD_STRING_UC_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NUMBER)
+#define DUK_STRIDX_DATE 10 /* 'Date' */
+#define DUK_HEAP_STRING_DATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATE)
+#define DUK_HTHREAD_STRING_DATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATE)
+#define DUK_STRIDX_REG_EXP 11 /* 'RegExp' */
+#define DUK_HEAP_STRING_REG_EXP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_REG_EXP)
+#define DUK_HTHREAD_STRING_REG_EXP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_REG_EXP)
+#define DUK_STRIDX_UC_ERROR 12 /* 'Error' */
+#define DUK_HEAP_STRING_UC_ERROR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ERROR)
+#define DUK_HTHREAD_STRING_UC_ERROR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ERROR)
+#define DUK_STRIDX_MATH 13 /* 'Math' */
+#define DUK_HEAP_STRING_MATH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MATH)
+#define DUK_HTHREAD_STRING_MATH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MATH)
+#define DUK_STRIDX_JSON 14 /* 'JSON' */
+#define DUK_HEAP_STRING_JSON(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON)
+#define DUK_HTHREAD_STRING_JSON(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON)
+#define DUK_STRIDX_EMPTY_STRING 15 /* '' */
+#define DUK_HEAP_STRING_EMPTY_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EMPTY_STRING)
+#define DUK_HTHREAD_STRING_EMPTY_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EMPTY_STRING)
+#define DUK_STRIDX_ARRAY_BUFFER 16 /* 'ArrayBuffer' */
+#define DUK_HEAP_STRING_ARRAY_BUFFER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY_BUFFER)
+#define DUK_HTHREAD_STRING_ARRAY_BUFFER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY_BUFFER)
+#define DUK_STRIDX_DATA_VIEW 17 /* 'DataView' */
+#define DUK_HEAP_STRING_DATA_VIEW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA_VIEW)
+#define DUK_HTHREAD_STRING_DATA_VIEW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA_VIEW)
+#define DUK_STRIDX_INT8_ARRAY 18 /* 'Int8Array' */
+#define DUK_HEAP_STRING_INT8_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT8_ARRAY)
+#define DUK_HTHREAD_STRING_INT8_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT8_ARRAY)
+#define DUK_STRIDX_UINT8_ARRAY 19 /* 'Uint8Array' */
+#define DUK_HEAP_STRING_UINT8_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_ARRAY)
+#define DUK_HTHREAD_STRING_UINT8_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_ARRAY)
+#define DUK_STRIDX_UINT8_CLAMPED_ARRAY 20 /* 'Uint8ClampedArray' */
+#define DUK_HEAP_STRING_UINT8_CLAMPED_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_CLAMPED_ARRAY)
+#define DUK_HTHREAD_STRING_UINT8_CLAMPED_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_CLAMPED_ARRAY)
+#define DUK_STRIDX_INT16_ARRAY 21 /* 'Int16Array' */
+#define DUK_HEAP_STRING_INT16_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT16_ARRAY)
+#define DUK_HTHREAD_STRING_INT16_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT16_ARRAY)
+#define DUK_STRIDX_UINT16_ARRAY 22 /* 'Uint16Array' */
+#define DUK_HEAP_STRING_UINT16_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT16_ARRAY)
+#define DUK_HTHREAD_STRING_UINT16_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT16_ARRAY)
+#define DUK_STRIDX_INT32_ARRAY 23 /* 'Int32Array' */
+#define DUK_HEAP_STRING_INT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT32_ARRAY)
+#define DUK_HTHREAD_STRING_INT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT32_ARRAY)
+#define DUK_STRIDX_UINT32_ARRAY 24 /* 'Uint32Array' */
+#define DUK_HEAP_STRING_UINT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT32_ARRAY)
+#define DUK_HTHREAD_STRING_UINT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT32_ARRAY)
+#define DUK_STRIDX_FLOAT32_ARRAY 25 /* 'Float32Array' */
+#define DUK_HEAP_STRING_FLOAT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT32_ARRAY)
+#define DUK_HTHREAD_STRING_FLOAT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT32_ARRAY)
+#define DUK_STRIDX_FLOAT64_ARRAY 26 /* 'Float64Array' */
+#define DUK_HEAP_STRING_FLOAT64_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT64_ARRAY)
+#define DUK_HTHREAD_STRING_FLOAT64_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT64_ARRAY)
+#define DUK_STRIDX_GLOBAL 27 /* 'global' */
+#define DUK_HEAP_STRING_GLOBAL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GLOBAL)
+#define DUK_HTHREAD_STRING_GLOBAL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GLOBAL)
+#define DUK_STRIDX_OBJ_ENV 28 /* 'ObjEnv' */
+#define DUK_HEAP_STRING_OBJ_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OBJ_ENV)
+#define DUK_HTHREAD_STRING_OBJ_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OBJ_ENV)
+#define DUK_STRIDX_DEC_ENV 29 /* 'DecEnv' */
+#define DUK_HEAP_STRING_DEC_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEC_ENV)
+#define DUK_HTHREAD_STRING_DEC_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEC_ENV)
+#define DUK_STRIDX_UC_BUFFER 30 /* 'Buffer' */
+#define DUK_HEAP_STRING_UC_BUFFER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BUFFER)
+#define DUK_HTHREAD_STRING_UC_BUFFER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BUFFER)
+#define DUK_STRIDX_UC_POINTER 31 /* 'Pointer' */
+#define DUK_HEAP_STRING_UC_POINTER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_POINTER)
+#define DUK_HTHREAD_STRING_UC_POINTER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_POINTER)
+#define DUK_STRIDX_UC_THREAD 32 /* 'Thread' */
+#define DUK_HEAP_STRING_UC_THREAD(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_THREAD)
+#define DUK_HTHREAD_STRING_UC_THREAD(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_THREAD)
+#define DUK_STRIDX_EVAL 33 /* 'eval' */
+#define DUK_HEAP_STRING_EVAL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EVAL)
+#define DUK_HTHREAD_STRING_EVAL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EVAL)
+#define DUK_STRIDX_VALUE 34 /* 'value' */
+#define DUK_HEAP_STRING_VALUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE)
+#define DUK_HTHREAD_STRING_VALUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE)
+#define DUK_STRIDX_WRITABLE 35 /* 'writable' */
+#define DUK_HEAP_STRING_WRITABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WRITABLE)
+#define DUK_HTHREAD_STRING_WRITABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WRITABLE)
+#define DUK_STRIDX_CONFIGURABLE 36 /* 'configurable' */
+#define DUK_HEAP_STRING_CONFIGURABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONFIGURABLE)
+#define DUK_HTHREAD_STRING_CONFIGURABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONFIGURABLE)
+#define DUK_STRIDX_ENUMERABLE 37 /* 'enumerable' */
+#define DUK_HEAP_STRING_ENUMERABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUMERABLE)
+#define DUK_HTHREAD_STRING_ENUMERABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUMERABLE)
+#define DUK_STRIDX_JOIN 38 /* 'join' */
+#define DUK_HEAP_STRING_JOIN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JOIN)
+#define DUK_HTHREAD_STRING_JOIN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JOIN)
+#define DUK_STRIDX_TO_LOCALE_STRING 39 /* 'toLocaleString' */
+#define DUK_HEAP_STRING_TO_LOCALE_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_LOCALE_STRING)
+#define DUK_HTHREAD_STRING_TO_LOCALE_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_LOCALE_STRING)
+#define DUK_STRIDX_VALUE_OF 40 /* 'valueOf' */
+#define DUK_HEAP_STRING_VALUE_OF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE_OF)
+#define DUK_HTHREAD_STRING_VALUE_OF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE_OF)
+#define DUK_STRIDX_TO_UTC_STRING 41 /* 'toUTCString' */
+#define DUK_HEAP_STRING_TO_UTC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_UTC_STRING)
+#define DUK_HTHREAD_STRING_TO_UTC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_UTC_STRING)
+#define DUK_STRIDX_TO_ISO_STRING 42 /* 'toISOString' */
+#define DUK_HEAP_STRING_TO_ISO_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_ISO_STRING)
+#define DUK_HTHREAD_STRING_TO_ISO_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_ISO_STRING)
+#define DUK_STRIDX_TO_GMT_STRING 43 /* 'toGMTString' */
+#define DUK_HEAP_STRING_TO_GMT_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_GMT_STRING)
+#define DUK_HTHREAD_STRING_TO_GMT_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_GMT_STRING)
+#define DUK_STRIDX_SOURCE 44 /* 'source' */
+#define DUK_HEAP_STRING_SOURCE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SOURCE)
+#define DUK_HTHREAD_STRING_SOURCE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SOURCE)
+#define DUK_STRIDX_IGNORE_CASE 45 /* 'ignoreCase' */
+#define DUK_HEAP_STRING_IGNORE_CASE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IGNORE_CASE)
+#define DUK_HTHREAD_STRING_IGNORE_CASE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IGNORE_CASE)
+#define DUK_STRIDX_MULTILINE 46 /* 'multiline' */
+#define DUK_HEAP_STRING_MULTILINE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MULTILINE)
+#define DUK_HTHREAD_STRING_MULTILINE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MULTILINE)
+#define DUK_STRIDX_LAST_INDEX 47 /* 'lastIndex' */
+#define DUK_HEAP_STRING_LAST_INDEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LAST_INDEX)
+#define DUK_HTHREAD_STRING_LAST_INDEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LAST_INDEX)
+#define DUK_STRIDX_FLAGS 48 /* 'flags' */
+#define DUK_HEAP_STRING_FLAGS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLAGS)
+#define DUK_HTHREAD_STRING_FLAGS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLAGS)
+#define DUK_STRIDX_INDEX 49 /* 'index' */
+#define DUK_HEAP_STRING_INDEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INDEX)
+#define DUK_HTHREAD_STRING_INDEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INDEX)
+#define DUK_STRIDX_PROTOTYPE 50 /* 'prototype' */
+#define DUK_HEAP_STRING_PROTOTYPE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTOTYPE)
+#define DUK_HTHREAD_STRING_PROTOTYPE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTOTYPE)
+#define DUK_STRIDX_CONSTRUCTOR 51 /* 'constructor' */
+#define DUK_HEAP_STRING_CONSTRUCTOR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCTOR)
+#define DUK_HTHREAD_STRING_CONSTRUCTOR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCTOR)
+#define DUK_STRIDX_MESSAGE 52 /* 'message' */
+#define DUK_HEAP_STRING_MESSAGE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MESSAGE)
+#define DUK_HTHREAD_STRING_MESSAGE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MESSAGE)
+#define DUK_STRIDX_LC_BOOLEAN 53 /* 'boolean' */
+#define DUK_HEAP_STRING_LC_BOOLEAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_BOOLEAN)
+#define DUK_HTHREAD_STRING_LC_BOOLEAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_BOOLEAN)
+#define DUK_STRIDX_LC_NUMBER 54 /* 'number' */
+#define DUK_HEAP_STRING_LC_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NUMBER)
+#define DUK_HTHREAD_STRING_LC_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NUMBER)
+#define DUK_STRIDX_LC_STRING 55 /* 'string' */
+#define DUK_HEAP_STRING_LC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_STRING)
+#define DUK_HTHREAD_STRING_LC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_STRING)
+#define DUK_STRIDX_LC_SYMBOL 56 /* 'symbol' */
+#define DUK_HEAP_STRING_LC_SYMBOL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_SYMBOL)
+#define DUK_HTHREAD_STRING_LC_SYMBOL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_SYMBOL)
+#define DUK_STRIDX_LC_OBJECT 57 /* 'object' */
+#define DUK_HEAP_STRING_LC_OBJECT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_OBJECT)
+#define DUK_HTHREAD_STRING_LC_OBJECT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_OBJECT)
+#define DUK_STRIDX_LC_UNDEFINED 58 /* 'undefined' */
+#define DUK_HEAP_STRING_LC_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_UNDEFINED)
+#define DUK_HTHREAD_STRING_LC_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_UNDEFINED)
+#define DUK_STRIDX_NAN 59 /* 'NaN' */
+#define DUK_HEAP_STRING_NAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAN)
+#define DUK_HTHREAD_STRING_NAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAN)
+#define DUK_STRIDX_INFINITY 60 /* 'Infinity' */
+#define DUK_HEAP_STRING_INFINITY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INFINITY)
+#define DUK_HTHREAD_STRING_INFINITY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INFINITY)
+#define DUK_STRIDX_MINUS_INFINITY 61 /* '-Infinity' */
+#define DUK_HEAP_STRING_MINUS_INFINITY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_INFINITY)
+#define DUK_HTHREAD_STRING_MINUS_INFINITY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_INFINITY)
+#define DUK_STRIDX_MINUS_ZERO 62 /* '-0' */
+#define DUK_HEAP_STRING_MINUS_ZERO(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_ZERO)
+#define DUK_HTHREAD_STRING_MINUS_ZERO(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_ZERO)
+#define DUK_STRIDX_COMMA 63 /* ',' */
+#define DUK_HEAP_STRING_COMMA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMMA)
+#define DUK_HTHREAD_STRING_COMMA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMMA)
+#define DUK_STRIDX_NEWLINE_4SPACE 64 /* '\n ' */
+#define DUK_HEAP_STRING_NEWLINE_4SPACE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEWLINE_4SPACE)
+#define DUK_HTHREAD_STRING_NEWLINE_4SPACE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEWLINE_4SPACE)
+#define DUK_STRIDX_BRACKETED_ELLIPSIS 65 /* '[...]' */
+#define DUK_HEAP_STRING_BRACKETED_ELLIPSIS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BRACKETED_ELLIPSIS)
+#define DUK_HTHREAD_STRING_BRACKETED_ELLIPSIS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BRACKETED_ELLIPSIS)
+#define DUK_STRIDX_INVALID_DATE 66 /* 'Invalid Date' */
+#define DUK_HEAP_STRING_INVALID_DATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INVALID_DATE)
+#define DUK_HTHREAD_STRING_INVALID_DATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INVALID_DATE)
+#define DUK_STRIDX_LC_ARGUMENTS 67 /* 'arguments' */
+#define DUK_HEAP_STRING_LC_ARGUMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_ARGUMENTS)
+#define DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_ARGUMENTS)
+#define DUK_STRIDX_CALLEE 68 /* 'callee' */
+#define DUK_HEAP_STRING_CALLEE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLEE)
+#define DUK_HTHREAD_STRING_CALLEE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLEE)
+#define DUK_STRIDX_CALLER 69 /* 'caller' */
+#define DUK_HEAP_STRING_CALLER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLER)
+#define DUK_HTHREAD_STRING_CALLER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLER)
+#define DUK_STRIDX_APPLY 70 /* 'apply' */
+#define DUK_HEAP_STRING_APPLY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_APPLY)
+#define DUK_HTHREAD_STRING_APPLY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_APPLY)
+#define DUK_STRIDX_CONSTRUCT 71 /* 'construct' */
+#define DUK_HEAP_STRING_CONSTRUCT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCT)
+#define DUK_HTHREAD_STRING_CONSTRUCT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCT)
+#define DUK_STRIDX_DELETE_PROPERTY 72 /* 'deleteProperty' */
+#define DUK_HEAP_STRING_DELETE_PROPERTY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE_PROPERTY)
+#define DUK_HTHREAD_STRING_DELETE_PROPERTY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE_PROPERTY)
+#define DUK_STRIDX_GET 73 /* 'get' */
+#define DUK_HEAP_STRING_GET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GET)
+#define DUK_HTHREAD_STRING_GET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GET)
+#define DUK_STRIDX_HAS 74 /* 'has' */
+#define DUK_HEAP_STRING_HAS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HAS)
+#define DUK_HTHREAD_STRING_HAS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HAS)
+#define DUK_STRIDX_OWN_KEYS 75 /* 'ownKeys' */
+#define DUK_HEAP_STRING_OWN_KEYS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OWN_KEYS)
+#define DUK_HTHREAD_STRING_OWN_KEYS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OWN_KEYS)
+#define DUK_STRIDX_SET_PROTOTYPE_OF 76 /* 'setPrototypeOf' */
+#define DUK_HEAP_STRING_SET_PROTOTYPE_OF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET_PROTOTYPE_OF)
+#define DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET_PROTOTYPE_OF)
+#define DUK_STRIDX___PROTO__ 77 /* '__proto__' */
+#define DUK_HEAP_STRING___PROTO__(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX___PROTO__)
+#define DUK_HTHREAD_STRING___PROTO__(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX___PROTO__)
+#define DUK_STRIDX_TO_STRING 78 /* 'toString' */
+#define DUK_HEAP_STRING_TO_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_STRING)
+#define DUK_HTHREAD_STRING_TO_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_STRING)
+#define DUK_STRIDX_TO_JSON 79 /* 'toJSON' */
+#define DUK_HEAP_STRING_TO_JSON(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_JSON)
+#define DUK_HTHREAD_STRING_TO_JSON(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_JSON)
+#define DUK_STRIDX_TYPE 80 /* 'type' */
+#define DUK_HEAP_STRING_TYPE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPE)
+#define DUK_HTHREAD_STRING_TYPE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPE)
+#define DUK_STRIDX_DATA 81 /* 'data' */
+#define DUK_HEAP_STRING_DATA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA)
+#define DUK_HTHREAD_STRING_DATA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA)
+#define DUK_STRIDX_LENGTH 82 /* 'length' */
+#define DUK_HEAP_STRING_LENGTH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LENGTH)
+#define DUK_HTHREAD_STRING_LENGTH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LENGTH)
+#define DUK_STRIDX_SET 83 /* 'set' */
+#define DUK_HEAP_STRING_SET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET)
+#define DUK_HTHREAD_STRING_SET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET)
+#define DUK_STRIDX_STACK 84 /* 'stack' */
+#define DUK_HEAP_STRING_STACK(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STACK)
+#define DUK_HTHREAD_STRING_STACK(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STACK)
+#define DUK_STRIDX_PC 85 /* 'pc' */
+#define DUK_HEAP_STRING_PC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PC)
+#define DUK_HTHREAD_STRING_PC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PC)
+#define DUK_STRIDX_LINE_NUMBER 86 /* 'lineNumber' */
+#define DUK_HEAP_STRING_LINE_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LINE_NUMBER)
+#define DUK_HTHREAD_STRING_LINE_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LINE_NUMBER)
+#define DUK_STRIDX_INT_TRACEDATA 87 /* '\x82Tracedata' */
+#define DUK_HEAP_STRING_INT_TRACEDATA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TRACEDATA)
+#define DUK_HTHREAD_STRING_INT_TRACEDATA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TRACEDATA)
+#define DUK_STRIDX_NAME 88 /* 'name' */
+#define DUK_HEAP_STRING_NAME(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAME)
+#define DUK_HTHREAD_STRING_NAME(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAME)
+#define DUK_STRIDX_FILE_NAME 89 /* 'fileName' */
+#define DUK_HEAP_STRING_FILE_NAME(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FILE_NAME)
+#define DUK_HTHREAD_STRING_FILE_NAME(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FILE_NAME)
+#define DUK_STRIDX_LC_POINTER 90 /* 'pointer' */
+#define DUK_HEAP_STRING_LC_POINTER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_POINTER)
+#define DUK_HTHREAD_STRING_LC_POINTER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_POINTER)
+#define DUK_STRIDX_INT_TARGET 91 /* '\x82Target' */
+#define DUK_HEAP_STRING_INT_TARGET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TARGET)
+#define DUK_HTHREAD_STRING_INT_TARGET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TARGET)
+#define DUK_STRIDX_INT_NEXT 92 /* '\x82Next' */
+#define DUK_HEAP_STRING_INT_NEXT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_NEXT)
+#define DUK_HTHREAD_STRING_INT_NEXT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_NEXT)
+#define DUK_STRIDX_INT_BYTECODE 93 /* '\x82Bytecode' */
+#define DUK_HEAP_STRING_INT_BYTECODE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_BYTECODE)
+#define DUK_HTHREAD_STRING_INT_BYTECODE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_BYTECODE)
+#define DUK_STRIDX_INT_FORMALS 94 /* '\x82Formals' */
+#define DUK_HEAP_STRING_INT_FORMALS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FORMALS)
+#define DUK_HTHREAD_STRING_INT_FORMALS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FORMALS)
+#define DUK_STRIDX_INT_VARMAP 95 /* '\x82Varmap' */
+#define DUK_HEAP_STRING_INT_VARMAP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARMAP)
+#define DUK_HTHREAD_STRING_INT_VARMAP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARMAP)
+#define DUK_STRIDX_INT_SOURCE 96 /* '\x82Source' */
+#define DUK_HEAP_STRING_INT_SOURCE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_SOURCE)
+#define DUK_HTHREAD_STRING_INT_SOURCE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_SOURCE)
+#define DUK_STRIDX_INT_PC2LINE 97 /* '\x82Pc2line' */
+#define DUK_HEAP_STRING_INT_PC2LINE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_PC2LINE)
+#define DUK_HTHREAD_STRING_INT_PC2LINE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_PC2LINE)
+#define DUK_STRIDX_INT_MAP 98 /* '\x82Map' */
+#define DUK_HEAP_STRING_INT_MAP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_MAP)
+#define DUK_HTHREAD_STRING_INT_MAP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_MAP)
+#define DUK_STRIDX_INT_VARENV 99 /* '\x82Varenv' */
+#define DUK_HEAP_STRING_INT_VARENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARENV)
+#define DUK_HTHREAD_STRING_INT_VARENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARENV)
+#define DUK_STRIDX_INT_FINALIZER 100 /* '\x82Finalizer' */
+#define DUK_HEAP_STRING_INT_FINALIZER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FINALIZER)
+#define DUK_HTHREAD_STRING_INT_FINALIZER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FINALIZER)
+#define DUK_STRIDX_INT_VALUE 101 /* '\x82Value' */
+#define DUK_HEAP_STRING_INT_VALUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VALUE)
+#define DUK_HTHREAD_STRING_INT_VALUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VALUE)
+#define DUK_STRIDX_COMPILE 102 /* 'compile' */
+#define DUK_HEAP_STRING_COMPILE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMPILE)
+#define DUK_HTHREAD_STRING_COMPILE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMPILE)
+#define DUK_STRIDX_INPUT 103 /* 'input' */
+#define DUK_HEAP_STRING_INPUT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INPUT)
+#define DUK_HTHREAD_STRING_INPUT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INPUT)
+#define DUK_STRIDX_ERR_CREATE 104 /* 'errCreate' */
+#define DUK_HEAP_STRING_ERR_CREATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_CREATE)
+#define DUK_HTHREAD_STRING_ERR_CREATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_CREATE)
+#define DUK_STRIDX_ERR_THROW 105 /* 'errThrow' */
+#define DUK_HEAP_STRING_ERR_THROW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_THROW)
+#define DUK_HTHREAD_STRING_ERR_THROW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_THROW)
+#define DUK_STRIDX_ENV 106 /* 'env' */
+#define DUK_HEAP_STRING_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENV)
+#define DUK_HTHREAD_STRING_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENV)
+#define DUK_STRIDX_HEX 107 /* 'hex' */
+#define DUK_HEAP_STRING_HEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HEX)
+#define DUK_HTHREAD_STRING_HEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HEX)
+#define DUK_STRIDX_BASE64 108 /* 'base64' */
+#define DUK_HEAP_STRING_BASE64(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BASE64)
+#define DUK_HTHREAD_STRING_BASE64(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BASE64)
+#define DUK_STRIDX_JX 109 /* 'jx' */
+#define DUK_HEAP_STRING_JX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JX)
+#define DUK_HTHREAD_STRING_JX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JX)
+#define DUK_STRIDX_JC 110 /* 'jc' */
+#define DUK_HEAP_STRING_JC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JC)
+#define DUK_HTHREAD_STRING_JC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JC)
+#define DUK_STRIDX_JSON_EXT_UNDEFINED 111 /* '{"_undef":true}' */
+#define DUK_HEAP_STRING_JSON_EXT_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_UNDEFINED)
+#define DUK_HTHREAD_STRING_JSON_EXT_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_UNDEFINED)
+#define DUK_STRIDX_JSON_EXT_NAN 112 /* '{"_nan":true}' */
+#define DUK_HEAP_STRING_JSON_EXT_NAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NAN)
+#define DUK_HTHREAD_STRING_JSON_EXT_NAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NAN)
+#define DUK_STRIDX_JSON_EXT_POSINF 113 /* '{"_inf":true}' */
+#define DUK_HEAP_STRING_JSON_EXT_POSINF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_POSINF)
+#define DUK_HTHREAD_STRING_JSON_EXT_POSINF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_POSINF)
+#define DUK_STRIDX_JSON_EXT_NEGINF 114 /* '{"_ninf":true}' */
+#define DUK_HEAP_STRING_JSON_EXT_NEGINF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NEGINF)
+#define DUK_HTHREAD_STRING_JSON_EXT_NEGINF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NEGINF)
+#define DUK_STRIDX_JSON_EXT_FUNCTION1 115 /* '{"_func":true}' */
+#define DUK_HEAP_STRING_JSON_EXT_FUNCTION1(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION1)
+#define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION1(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION1)
+#define DUK_STRIDX_JSON_EXT_FUNCTION2 116 /* '{_func:true}' */
+#define DUK_HEAP_STRING_JSON_EXT_FUNCTION2(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION2)
+#define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION2(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION2)
+#define DUK_STRIDX_BREAK 117 /* 'break' */
+#define DUK_HEAP_STRING_BREAK(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BREAK)
+#define DUK_HTHREAD_STRING_BREAK(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BREAK)
+#define DUK_STRIDX_CASE 118 /* 'case' */
+#define DUK_HEAP_STRING_CASE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CASE)
+#define DUK_HTHREAD_STRING_CASE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CASE)
+#define DUK_STRIDX_CATCH 119 /* 'catch' */
+#define DUK_HEAP_STRING_CATCH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CATCH)
+#define DUK_HTHREAD_STRING_CATCH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CATCH)
+#define DUK_STRIDX_CONTINUE 120 /* 'continue' */
+#define DUK_HEAP_STRING_CONTINUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONTINUE)
+#define DUK_HTHREAD_STRING_CONTINUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONTINUE)
+#define DUK_STRIDX_DEBUGGER 121 /* 'debugger' */
+#define DUK_HEAP_STRING_DEBUGGER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEBUGGER)
+#define DUK_HTHREAD_STRING_DEBUGGER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEBUGGER)
+#define DUK_STRIDX_DEFAULT 122 /* 'default' */
+#define DUK_HEAP_STRING_DEFAULT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEFAULT)
+#define DUK_HTHREAD_STRING_DEFAULT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEFAULT)
+#define DUK_STRIDX_DELETE 123 /* 'delete' */
+#define DUK_HEAP_STRING_DELETE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE)
+#define DUK_HTHREAD_STRING_DELETE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE)
+#define DUK_STRIDX_DO 124 /* 'do' */
+#define DUK_HEAP_STRING_DO(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DO)
+#define DUK_HTHREAD_STRING_DO(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DO)
+#define DUK_STRIDX_ELSE 125 /* 'else' */
+#define DUK_HEAP_STRING_ELSE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ELSE)
+#define DUK_HTHREAD_STRING_ELSE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ELSE)
+#define DUK_STRIDX_FINALLY 126 /* 'finally' */
+#define DUK_HEAP_STRING_FINALLY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FINALLY)
+#define DUK_HTHREAD_STRING_FINALLY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FINALLY)
+#define DUK_STRIDX_FOR 127 /* 'for' */
+#define DUK_HEAP_STRING_FOR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FOR)
+#define DUK_HTHREAD_STRING_FOR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FOR)
+#define DUK_STRIDX_LC_FUNCTION 128 /* 'function' */
+#define DUK_HEAP_STRING_LC_FUNCTION(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_FUNCTION)
+#define DUK_HTHREAD_STRING_LC_FUNCTION(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_FUNCTION)
+#define DUK_STRIDX_IF 129 /* 'if' */
+#define DUK_HEAP_STRING_IF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IF)
+#define DUK_HTHREAD_STRING_IF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IF)
+#define DUK_STRIDX_IN 130 /* 'in' */
+#define DUK_HEAP_STRING_IN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IN)
+#define DUK_HTHREAD_STRING_IN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IN)
+#define DUK_STRIDX_INSTANCEOF 131 /* 'instanceof' */
+#define DUK_HEAP_STRING_INSTANCEOF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INSTANCEOF)
+#define DUK_HTHREAD_STRING_INSTANCEOF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INSTANCEOF)
+#define DUK_STRIDX_NEW 132 /* 'new' */
+#define DUK_HEAP_STRING_NEW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEW)
+#define DUK_HTHREAD_STRING_NEW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEW)
+#define DUK_STRIDX_RETURN 133 /* 'return' */
+#define DUK_HEAP_STRING_RETURN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_RETURN)
+#define DUK_HTHREAD_STRING_RETURN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_RETURN)
+#define DUK_STRIDX_SWITCH 134 /* 'switch' */
+#define DUK_HEAP_STRING_SWITCH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SWITCH)
+#define DUK_HTHREAD_STRING_SWITCH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SWITCH)
+#define DUK_STRIDX_THIS 135 /* 'this' */
+#define DUK_HEAP_STRING_THIS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THIS)
+#define DUK_HTHREAD_STRING_THIS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THIS)
+#define DUK_STRIDX_THROW 136 /* 'throw' */
+#define DUK_HEAP_STRING_THROW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THROW)
+#define DUK_HTHREAD_STRING_THROW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THROW)
+#define DUK_STRIDX_TRY 137 /* 'try' */
+#define DUK_HEAP_STRING_TRY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRY)
+#define DUK_HTHREAD_STRING_TRY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRY)
+#define DUK_STRIDX_TYPEOF 138 /* 'typeof' */
+#define DUK_HEAP_STRING_TYPEOF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPEOF)
+#define DUK_HTHREAD_STRING_TYPEOF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPEOF)
+#define DUK_STRIDX_VAR 139 /* 'var' */
+#define DUK_HEAP_STRING_VAR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VAR)
+#define DUK_HTHREAD_STRING_VAR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VAR)
+#define DUK_STRIDX_CONST 140 /* 'const' */
+#define DUK_HEAP_STRING_CONST(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONST)
+#define DUK_HTHREAD_STRING_CONST(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONST)
+#define DUK_STRIDX_VOID 141 /* 'void' */
+#define DUK_HEAP_STRING_VOID(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VOID)
+#define DUK_HTHREAD_STRING_VOID(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VOID)
+#define DUK_STRIDX_WHILE 142 /* 'while' */
+#define DUK_HEAP_STRING_WHILE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WHILE)
+#define DUK_HTHREAD_STRING_WHILE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WHILE)
+#define DUK_STRIDX_WITH 143 /* 'with' */
+#define DUK_HEAP_STRING_WITH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WITH)
+#define DUK_HTHREAD_STRING_WITH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WITH)
+#define DUK_STRIDX_CLASS 144 /* 'class' */
+#define DUK_HEAP_STRING_CLASS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CLASS)
+#define DUK_HTHREAD_STRING_CLASS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CLASS)
+#define DUK_STRIDX_ENUM 145 /* 'enum' */
+#define DUK_HEAP_STRING_ENUM(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUM)
+#define DUK_HTHREAD_STRING_ENUM(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUM)
+#define DUK_STRIDX_EXPORT 146 /* 'export' */
+#define DUK_HEAP_STRING_EXPORT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXPORT)
+#define DUK_HTHREAD_STRING_EXPORT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXPORT)
+#define DUK_STRIDX_EXTENDS 147 /* 'extends' */
+#define DUK_HEAP_STRING_EXTENDS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXTENDS)
+#define DUK_HTHREAD_STRING_EXTENDS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXTENDS)
+#define DUK_STRIDX_IMPORT 148 /* 'import' */
+#define DUK_HEAP_STRING_IMPORT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPORT)
+#define DUK_HTHREAD_STRING_IMPORT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPORT)
+#define DUK_STRIDX_SUPER 149 /* 'super' */
+#define DUK_HEAP_STRING_SUPER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SUPER)
+#define DUK_HTHREAD_STRING_SUPER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SUPER)
+#define DUK_STRIDX_LC_NULL 150 /* 'null' */
+#define DUK_HEAP_STRING_LC_NULL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NULL)
+#define DUK_HTHREAD_STRING_LC_NULL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NULL)
+#define DUK_STRIDX_TRUE 151 /* 'true' */
+#define DUK_HEAP_STRING_TRUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRUE)
+#define DUK_HTHREAD_STRING_TRUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRUE)
+#define DUK_STRIDX_FALSE 152 /* 'false' */
+#define DUK_HEAP_STRING_FALSE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FALSE)
+#define DUK_HTHREAD_STRING_FALSE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FALSE)
+#define DUK_STRIDX_IMPLEMENTS 153 /* 'implements' */
+#define DUK_HEAP_STRING_IMPLEMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPLEMENTS)
+#define DUK_HTHREAD_STRING_IMPLEMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPLEMENTS)
+#define DUK_STRIDX_INTERFACE 154 /* 'interface' */
+#define DUK_HEAP_STRING_INTERFACE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INTERFACE)
+#define DUK_HTHREAD_STRING_INTERFACE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INTERFACE)
+#define DUK_STRIDX_LET 155 /* 'let' */
+#define DUK_HEAP_STRING_LET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LET)
+#define DUK_HTHREAD_STRING_LET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LET)
+#define DUK_STRIDX_PACKAGE 156 /* 'package' */
+#define DUK_HEAP_STRING_PACKAGE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PACKAGE)
+#define DUK_HTHREAD_STRING_PACKAGE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PACKAGE)
+#define DUK_STRIDX_PRIVATE 157 /* 'private' */
+#define DUK_HEAP_STRING_PRIVATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PRIVATE)
+#define DUK_HTHREAD_STRING_PRIVATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PRIVATE)
+#define DUK_STRIDX_PROTECTED 158 /* 'protected' */
+#define DUK_HEAP_STRING_PROTECTED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTECTED)
+#define DUK_HTHREAD_STRING_PROTECTED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTECTED)
+#define DUK_STRIDX_PUBLIC 159 /* 'public' */
+#define DUK_HEAP_STRING_PUBLIC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PUBLIC)
+#define DUK_HTHREAD_STRING_PUBLIC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PUBLIC)
+#define DUK_STRIDX_STATIC 160 /* 'static' */
+#define DUK_HEAP_STRING_STATIC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STATIC)
+#define DUK_HTHREAD_STRING_STATIC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STATIC)
+#define DUK_STRIDX_YIELD 161 /* 'yield' */
+#define DUK_HEAP_STRING_YIELD(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_YIELD)
+#define DUK_HTHREAD_STRING_YIELD(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_YIELD)
+
+#define DUK_HEAP_NUM_STRINGS 162
+#define DUK_STRIDX_START_RESERVED 117
+#define DUK_STRIDX_START_STRICT_RESERVED 153
+#define DUK_STRIDX_END_RESERVED 162 /* exclusive endpoint */
+
+/* To convert a heap stridx to a token number, subtract
+ * DUK_STRIDX_START_RESERVED and add DUK_TOK_START_RESERVED.
+ */
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_uint8_t duk_strings_data[892];
+#endif /* !DUK_SINGLE_FILE */
+#define DUK_STRDATA_MAX_STRLEN 17
+#define DUK_STRDATA_DATA_LENGTH 892
+#endif /* DUK_USE_ROM_STRINGS */
+
+#if defined(DUK_USE_ROM_OBJECTS)
+#error RAM support not enabled, rerun configure.py with --ram-support
+#else /* DUK_USE_ROM_OBJECTS */
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_constructor_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_type_error_thrower(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_proxy_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_dataview_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_constructor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_eval(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_int(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_float(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_nan(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_finite(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri_component(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri_component(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_escape(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_unescape(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_getprototype_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_setprototype_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_keys_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_assign(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_create(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_property(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_properties(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_extensible(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_value_of(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_has_own_property(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_to_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_apply(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_call(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_bind(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_length(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_name(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor_is_array(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_to_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_join_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_concat(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_pop(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_push(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reverse(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_shift(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_slice(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_sort(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_splice(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_unshift(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_iter_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_char_code(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_code_point(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_to_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_at(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_code_at(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_concat(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_locale_compare(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_match(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_replace(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_search(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_slice(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_split(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substring(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_trim(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_repeat(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_includes(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substr(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_value_of(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_fixed(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_exponential(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_precision(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_parse(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_utc(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_now(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_to_json(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_value_of(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_time(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_exec(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_test(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_tostring(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_flags(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_setter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_setter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_to_string(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_onearg_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_twoarg_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_clz32(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_hypot(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_imul(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_max(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_min(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_random(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_sign(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_parse(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_stringify(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_info(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_act(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_gc(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_fin(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_enc(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_dec(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_compact(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_yield(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_resume(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_current(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_apply(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_construct(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_delete_property(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_get(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_has(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_set(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_isview(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_slice_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_buffer_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_readfield(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_writefield(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_set(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_allocplain(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_plainof(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_concat(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_compare_shared(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_fill(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_copy(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_write(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encode(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_context *ctx);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_performance_now(duk_context *ctx);
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_c_function duk_bi_native_functions[176];
+#endif /* !DUK_SINGLE_FILE */
+#define DUK_BIDX_GLOBAL 0
+#define DUK_BIDX_GLOBAL_ENV 1
+#define DUK_BIDX_OBJECT_CONSTRUCTOR 2
+#define DUK_BIDX_OBJECT_PROTOTYPE 3
+#define DUK_BIDX_FUNCTION_CONSTRUCTOR 4
+#define DUK_BIDX_FUNCTION_PROTOTYPE 5
+#define DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE 6
+#define DUK_BIDX_ARRAY_CONSTRUCTOR 7
+#define DUK_BIDX_ARRAY_PROTOTYPE 8
+#define DUK_BIDX_STRING_CONSTRUCTOR 9
+#define DUK_BIDX_STRING_PROTOTYPE 10
+#define DUK_BIDX_BOOLEAN_CONSTRUCTOR 11
+#define DUK_BIDX_BOOLEAN_PROTOTYPE 12
+#define DUK_BIDX_NUMBER_CONSTRUCTOR 13
+#define DUK_BIDX_NUMBER_PROTOTYPE 14
+#define DUK_BIDX_DATE_CONSTRUCTOR 15
+#define DUK_BIDX_DATE_PROTOTYPE 16
+#define DUK_BIDX_REGEXP_CONSTRUCTOR 17
+#define DUK_BIDX_REGEXP_PROTOTYPE 18
+#define DUK_BIDX_ERROR_CONSTRUCTOR 19
+#define DUK_BIDX_ERROR_PROTOTYPE 20
+#define DUK_BIDX_EVAL_ERROR_CONSTRUCTOR 21
+#define DUK_BIDX_EVAL_ERROR_PROTOTYPE 22
+#define DUK_BIDX_RANGE_ERROR_CONSTRUCTOR 23
+#define DUK_BIDX_RANGE_ERROR_PROTOTYPE 24
+#define DUK_BIDX_REFERENCE_ERROR_CONSTRUCTOR 25
+#define DUK_BIDX_REFERENCE_ERROR_PROTOTYPE 26
+#define DUK_BIDX_SYNTAX_ERROR_CONSTRUCTOR 27
+#define DUK_BIDX_SYNTAX_ERROR_PROTOTYPE 28
+#define DUK_BIDX_TYPE_ERROR_CONSTRUCTOR 29
+#define DUK_BIDX_TYPE_ERROR_PROTOTYPE 30
+#define DUK_BIDX_URI_ERROR_CONSTRUCTOR 31
+#define DUK_BIDX_URI_ERROR_PROTOTYPE 32
+#define DUK_BIDX_TYPE_ERROR_THROWER 33
+#define DUK_BIDX_DUKTAPE 34
+#define DUK_BIDX_THREAD_PROTOTYPE 35
+#define DUK_BIDX_POINTER_PROTOTYPE 36
+#define DUK_BIDX_DOUBLE_ERROR 37
+#define DUK_BIDX_SYMBOL_PROTOTYPE 38
+#define DUK_BIDX_ARRAYBUFFER_PROTOTYPE 39
+#define DUK_BIDX_DATAVIEW_PROTOTYPE 40
+#define DUK_BIDX_INT8ARRAY_PROTOTYPE 41
+#define DUK_BIDX_UINT8ARRAY_PROTOTYPE 42
+#define DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE 43
+#define DUK_BIDX_INT16ARRAY_PROTOTYPE 44
+#define DUK_BIDX_UINT16ARRAY_PROTOTYPE 45
+#define DUK_BIDX_INT32ARRAY_PROTOTYPE 46
+#define DUK_BIDX_UINT32ARRAY_PROTOTYPE 47
+#define DUK_BIDX_FLOAT32ARRAY_PROTOTYPE 48
+#define DUK_BIDX_FLOAT64ARRAY_PROTOTYPE 49
+#define DUK_BIDX_NODEJS_BUFFER_PROTOTYPE 50
+#define DUK_NUM_BUILTINS 51
+#define DUK_NUM_BIDX_BUILTINS 51
+#define DUK_NUM_ALL_BUILTINS 76
+#if defined(DUK_USE_DOUBLE_LE)
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972];
+#endif /* !DUK_SINGLE_FILE */
+#define DUK_BUILTINS_DATA_LENGTH 3972
+#elif defined(DUK_USE_DOUBLE_BE)
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972];
+#endif /* !DUK_SINGLE_FILE */
+#define DUK_BUILTINS_DATA_LENGTH 3972
+#elif defined(DUK_USE_DOUBLE_ME)
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972];
+#endif /* !DUK_SINGLE_FILE */
+#define DUK_BUILTINS_DATA_LENGTH 3972
+#else
+#error invalid endianness defines
+#endif
+#endif /* DUK_USE_ROM_OBJECTS */
+#endif /* DUK_BUILTINS_H_INCLUDED */
+#line 51 "duk_internal.h"
+
+/* #include duk_util.h */
+#line 1 "duk_util.h"
+/*
+ * Utilities
+ */
+
+#if !defined(DUK_UTIL_H_INCLUDED)
+#define DUK_UTIL_H_INCLUDED
+
+#if defined(DUK_USE_GET_RANDOM_DOUBLE)
+#define DUK_UTIL_GET_RANDOM_DOUBLE(thr) DUK_USE_GET_RANDOM_DOUBLE((thr)->heap_udata)
+#else
+#define DUK_UTIL_GET_RANDOM_DOUBLE(thr) duk_util_tinyrandom_get_double(thr)
+#endif
+
+/*
+ * Some useful constants
+ */
+
+#define DUK_DOUBLE_2TO32 4294967296.0
+#define DUK_DOUBLE_2TO31 2147483648.0
+#define DUK_DOUBLE_LOG2E 1.4426950408889634
+#define DUK_DOUBLE_LOG10E 0.4342944819032518
+
+/*
+ * Endian conversion
+ */
+
+#if defined(DUK_USE_INTEGER_LE)
+#define DUK_HTON32(x) DUK_BSWAP32((x))
+#define DUK_NTOH32(x) DUK_BSWAP32((x))
+#define DUK_HTON16(x) DUK_BSWAP16((x))
+#define DUK_NTOH16(x) DUK_BSWAP16((x))
+#elif defined(DUK_USE_INTEGER_BE)
+#define DUK_HTON32(x) (x)
+#define DUK_NTOH32(x) (x)
+#define DUK_HTON16(x) (x)
+#define DUK_NTOH16(x) (x)
+#else
+#error internal error, endianness defines broken
+#endif
+
+/*
+ * Bitstream decoder
+ */
+
+struct duk_bitdecoder_ctx {
+ const duk_uint8_t *data;
+ duk_size_t offset;
+ duk_size_t length;
+ duk_uint32_t currval;
+ duk_small_int_t currbits;
+};
+
+#define DUK_BD_BITPACKED_STRING_MAXLEN 256
+
+/*
+ * Bitstream encoder
+ */
+
+struct duk_bitencoder_ctx {
+ duk_uint8_t *data;
+ duk_size_t offset;
+ duk_size_t length;
+ duk_uint32_t currval;
+ duk_small_int_t currbits;
+ duk_small_int_t truncated;
+};
+
+/*
+ * Raw write/read macros for big endian, unaligned basic values.
+ * Caller ensures there's enough space. The macros update the pointer
+ * argument automatically on resizes. The idiom seems a bit odd, but
+ * leads to compact code.
+ */
+
+#define DUK_RAW_WRITE_U8(ptr,val) do { \
+ *(ptr)++ = (duk_uint8_t) (val); \
+ } while (0)
+#define DUK_RAW_WRITE_U16_BE(ptr,val) duk_raw_write_u16_be(&(ptr), (duk_uint16_t) (val))
+#define DUK_RAW_WRITE_U32_BE(ptr,val) duk_raw_write_u32_be(&(ptr), (duk_uint32_t) (val))
+#define DUK_RAW_WRITE_DOUBLE_BE(ptr,val) duk_raw_write_double_be(&(ptr), (duk_double_t) (val))
+#define DUK_RAW_WRITE_XUTF8(ptr,val) do { \
+ /* 'ptr' is evaluated both as LHS and RHS. */ \
+ duk_uint8_t *duk__ptr; \
+ duk_small_int_t duk__len; \
+ duk__ptr = (duk_uint8_t *) (ptr); \
+ duk__len = duk_unicode_encode_xutf8((duk_ucodepoint_t) (val), duk__ptr); \
+ duk__ptr += duk__len; \
+ (ptr) = duk__ptr; \
+ } while (0)
+#define DUK_RAW_WRITE_CESU8(ptr,val) do { \
+ /* 'ptr' is evaluated both as LHS and RHS. */ \
+ duk_uint8_t *duk__ptr; \
+ duk_small_int_t duk__len; \
+ duk__ptr = (duk_uint8_t *) (ptr); \
+ duk__len = duk_unicode_encode_cesu8((duk_ucodepoint_t) (val), duk__ptr); \
+ duk__ptr += duk__len; \
+ (ptr) = duk__ptr; \
+ } while (0)
+
+#define DUK_RAW_READ_U8(ptr) ((duk_uint8_t) (*(ptr)++))
+#define DUK_RAW_READ_U16_BE(ptr) duk_raw_read_u16_be(&(ptr));
+#define DUK_RAW_READ_U32_BE(ptr) duk_raw_read_u32_be(&(ptr));
+#define DUK_RAW_READ_DOUBLE_BE(ptr) duk_raw_read_double_be(&(ptr));
+
+/*
+ * Buffer writer (dynamic buffer only)
+ *
+ * Helper for writing to a dynamic buffer with a concept of a "slack" area
+ * to reduce resizes. You can ensure there is enough space beforehand and
+ * then write for a while without further checks, relying on a stable data
+ * pointer. Slack handling is automatic so call sites only indicate how
+ * much data they need right now.
+ *
+ * There are several ways to write using bufwriter. The best approach
+ * depends mainly on how much performance matters over code footprint.
+ * The key issues are (1) ensuring there is space and (2) keeping the
+ * pointers consistent. Fast code should ensure space for multiple writes
+ * with one ensure call. Fastest inner loop code can temporarily borrow
+ * the 'p' pointer but must write it back eventually.
+ *
+ * Be careful to ensure all macro arguments (other than static pointers like
+ * 'thr' and 'bw_ctx') are evaluated exactly once, using temporaries if
+ * necessary (if that's not possible, there should be a note near the macro).
+ * Buffer write arguments often contain arithmetic etc so this is
+ * particularly important here.
+ */
+
+/* XXX: Migrate bufwriter and other read/write helpers to its own header? */
+
+struct duk_bufwriter_ctx {
+ duk_uint8_t *p;
+ duk_uint8_t *p_base;
+ duk_uint8_t *p_limit;
+ duk_hbuffer_dynamic *buf;
+};
+
+#if defined(DUK_USE_PREFER_SIZE)
+#define DUK_BW_SLACK_ADD 64
+#define DUK_BW_SLACK_SHIFT 4 /* 2^4 -> 1/16 = 6.25% slack */
+#else
+#define DUK_BW_SLACK_ADD 64
+#define DUK_BW_SLACK_SHIFT 2 /* 2^2 -> 1/4 = 25% slack */
+#endif
+
+/* Initialization and finalization (compaction), converting to other types. */
+
+#define DUK_BW_INIT_PUSHBUF(thr,bw_ctx,sz) do { \
+ duk_bw_init_pushbuf((thr), (bw_ctx), (sz)); \
+ } while (0)
+#define DUK_BW_INIT_WITHBUF(thr,bw_ctx,buf) do { \
+ duk_bw_init((thr), (bw_ctx), (buf)); \
+ } while (0)
+#define DUK_BW_COMPACT(thr,bw_ctx) do { \
+ /* Make underlying buffer compact to match DUK_BW_GET_SIZE(). */ \
+ duk_bw_compact((thr), (bw_ctx)); \
+ } while (0)
+#define DUK_BW_PUSH_AS_STRING(thr,bw_ctx) do { \
+ duk_push_lstring((thr), \
+ (const char *) (bw_ctx)->p_base, \
+ (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \
+ } while (0)
+/* Pointers may be NULL for a while when 'buf' size is zero and before any
+ * ENSURE calls have been made. Once an ENSURE has been made, the pointers
+ * are required to be non-NULL so that it's always valid to use memcpy() and
+ * memmove(), even for zero size.
+ */
+#define DUK_BW_ASSERT_VALID_EXPR(thr,bw_ctx) \
+ DUK_ASSERT_EXPR((bw_ctx) != NULL && \
+ (bw_ctx)->buf != NULL && \
+ ((DUK_HBUFFER_DYNAMIC_GET_SIZE((bw_ctx)->buf) == 0) || \
+ ((bw_ctx)->p != NULL && \
+ (bw_ctx)->p_base != NULL && \
+ (bw_ctx)->p_limit != NULL && \
+ (bw_ctx)->p_limit >= (bw_ctx)->p_base && \
+ (bw_ctx)->p >= (bw_ctx)->p_base && \
+ (bw_ctx)->p <= (bw_ctx)->p_limit)))
+#define DUK_BW_ASSERT_VALID(thr,bw_ctx) do { \
+ DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)); \
+ } while (0)
+
+/* Working with the pointer and current size. */
+
+#define DUK_BW_GET_PTR(thr,bw_ctx) \
+ ((bw_ctx)->p)
+#define DUK_BW_SET_PTR(thr,bw_ctx,ptr) do { \
+ (bw_ctx)->p = (ptr); \
+ } while (0)
+#define DUK_BW_ADD_PTR(thr,bw_ctx,delta) do { \
+ (bw_ctx)->p += (delta); \
+ } while (0)
+#define DUK_BW_GET_BASEPTR(thr,bw_ctx) \
+ ((bw_ctx)->p_base)
+#define DUK_BW_GET_LIMITPTR(thr,bw_ctx) \
+ ((bw_ctx)->p_limit)
+#define DUK_BW_GET_SIZE(thr,bw_ctx) \
+ ((duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base))
+#define DUK_BW_SET_SIZE(thr,bw_ctx,sz) do { \
+ DUK_ASSERT((duk_size_t) (sz) <= (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \
+ (bw_ctx)->p = (bw_ctx)->p_base + (sz); \
+ } while (0)
+#define DUK_BW_RESET_SIZE(thr,bw_ctx) do { \
+ /* Reset to zero size, keep current limit. */ \
+ (bw_ctx)->p = (bw_ctx)->p_base; \
+ } while (0)
+#define DUK_BW_GET_BUFFER(thr,bw_ctx) \
+ ((bw_ctx)->buf)
+
+/* Ensuring (reserving) space. */
+
+#define DUK_BW_ENSURE(thr,bw_ctx,sz) do { \
+ duk_size_t duk__sz, duk__space; \
+ DUK_BW_ASSERT_VALID((thr), (bw_ctx)); \
+ duk__sz = (sz); \
+ duk__space = (duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p); \
+ if (duk__space < duk__sz) { \
+ (void) duk_bw_resize((thr), (bw_ctx), duk__sz); \
+ } \
+ } while (0)
+/* NOTE: Multiple evaluation of 'ptr' in this macro. */
+/* XXX: Rework to use an always-inline function? */
+#define DUK_BW_ENSURE_RAW(thr,bw_ctx,sz,ptr) \
+ (((duk_size_t) ((bw_ctx)->p_limit - (ptr)) >= (sz)) ? \
+ (ptr) : \
+ ((bw_ctx)->p = (ptr), duk_bw_resize((thr),(bw_ctx),(sz))))
+#define DUK_BW_ENSURE_GETPTR(thr,bw_ctx,sz) \
+ DUK_BW_ENSURE_RAW((thr), (bw_ctx), (sz), (bw_ctx)->p)
+#define DUK_BW_ASSERT_SPACE_EXPR(thr,bw_ctx,sz) \
+ (DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)), \
+ DUK_ASSERT_EXPR((duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p) >= (duk_size_t) (sz)))
+#define DUK_BW_ASSERT_SPACE(thr,bw_ctx,sz) do { \
+ DUK_BW_ASSERT_SPACE_EXPR((thr), (bw_ctx), (sz)); \
+ } while (0)
+
+/* Miscellaneous. */
+
+#define DUK_BW_SETPTR_AND_COMPACT(thr,bw_ctx,ptr) do { \
+ (bw_ctx)->p = (ptr); \
+ duk_bw_compact((thr), (bw_ctx)); \
+ } while (0)
+
+/* Fast write calls which assume you control the slack beforehand.
+ * Multibyte write variants exist and use a temporary write pointer
+ * because byte writes alias with anything: with a stored pointer
+ * explicit pointer load/stores get generated (e.g. gcc -Os).
+ */
+
+#define DUK_BW_WRITE_RAW_U8(thr,bw_ctx,val) do { \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 1); \
+ *(bw_ctx)->p++ = (duk_uint8_t) (val); \
+ } while (0)
+#define DUK_BW_WRITE_RAW_U8_2(thr,bw_ctx,val1,val2) do { \
+ duk_uint8_t *duk__p; \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 2); \
+ duk__p = (bw_ctx)->p; \
+ *duk__p++ = (duk_uint8_t) (val1); \
+ *duk__p++ = (duk_uint8_t) (val2); \
+ (bw_ctx)->p = duk__p; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_U8_3(thr,bw_ctx,val1,val2,val3) do { \
+ duk_uint8_t *duk__p; \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 3); \
+ duk__p = (bw_ctx)->p; \
+ *duk__p++ = (duk_uint8_t) (val1); \
+ *duk__p++ = (duk_uint8_t) (val2); \
+ *duk__p++ = (duk_uint8_t) (val3); \
+ (bw_ctx)->p = duk__p; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \
+ duk_uint8_t *duk__p; \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 4); \
+ duk__p = (bw_ctx)->p; \
+ *duk__p++ = (duk_uint8_t) (val1); \
+ *duk__p++ = (duk_uint8_t) (val2); \
+ *duk__p++ = (duk_uint8_t) (val3); \
+ *duk__p++ = (duk_uint8_t) (val4); \
+ (bw_ctx)->p = duk__p; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \
+ duk_uint8_t *duk__p; \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 5); \
+ duk__p = (bw_ctx)->p; \
+ *duk__p++ = (duk_uint8_t) (val1); \
+ *duk__p++ = (duk_uint8_t) (val2); \
+ *duk__p++ = (duk_uint8_t) (val3); \
+ *duk__p++ = (duk_uint8_t) (val4); \
+ *duk__p++ = (duk_uint8_t) (val5); \
+ (bw_ctx)->p = duk__p; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \
+ duk_uint8_t *duk__p; \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 6); \
+ duk__p = (bw_ctx)->p; \
+ *duk__p++ = (duk_uint8_t) (val1); \
+ *duk__p++ = (duk_uint8_t) (val2); \
+ *duk__p++ = (duk_uint8_t) (val3); \
+ *duk__p++ = (duk_uint8_t) (val4); \
+ *duk__p++ = (duk_uint8_t) (val5); \
+ *duk__p++ = (duk_uint8_t) (val6); \
+ (bw_ctx)->p = duk__p; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_XUTF8(thr,bw_ctx,cp) do { \
+ duk_ucodepoint_t duk__cp; \
+ duk_small_int_t duk__enc_len; \
+ duk__cp = (duk_ucodepoint_t) (cp); \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_xutf8_length(duk__cp)); \
+ duk__enc_len = duk_unicode_encode_xutf8(duk__cp, (bw_ctx)->p); \
+ (bw_ctx)->p += duk__enc_len; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_CESU8(thr,bw_ctx,cp) do { \
+ duk_ucodepoint_t duk__cp; \
+ duk_small_int_t duk__enc_len; \
+ duk__cp = (duk_ucodepoint_t) (cp); \
+ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_cesu8_length(duk__cp)); \
+ duk__enc_len = duk_unicode_encode_cesu8(duk__cp, (bw_ctx)->p); \
+ (bw_ctx)->p += duk__enc_len; \
+ } while (0)
+/* XXX: add temporary duk__p pointer here too; sharing */
+#define DUK_BW_WRITE_RAW_BYTES(thr,bw_ctx,valptr,valsz) do { \
+ const void *duk__valptr; \
+ duk_size_t duk__valsz; \
+ duk__valptr = (const void *) (valptr); \
+ duk__valsz = (duk_size_t) (valsz); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \
+ (bw_ctx)->p += duk__valsz; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_CSTRING(thr,bw_ctx,val) do { \
+ const duk_uint8_t *duk__val; \
+ duk_size_t duk__val_len; \
+ duk__val = (const duk_uint8_t *) (val); \
+ duk__val_len = DUK_STRLEN((const char *) duk__val); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_HSTRING(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_HBUFFER(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HBUFFER_GET_SIZE((val)); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_HBUFFER_FIXED(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_RAW_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+
+/* Append bytes from a slice already in the buffer. */
+#define DUK_BW_WRITE_RAW_SLICE(thr,bw,dst_off,dst_len) \
+ duk_bw_write_raw_slice((thr), (bw), (dst_off), (dst_len))
+
+/* Insert bytes in the middle of the buffer from an external buffer. */
+#define DUK_BW_INSERT_RAW_BYTES(thr,bw,dst_off,buf,len) \
+ duk_bw_insert_raw_bytes((thr), (bw), (dst_off), (buf), (len))
+
+/* Insert bytes in the middle of the buffer from a slice already
+ * in the buffer. Source offset is interpreted "before" the operation.
+ */
+#define DUK_BW_INSERT_RAW_SLICE(thr,bw,dst_off,src_off,len) \
+ duk_bw_insert_raw_slice((thr), (bw), (dst_off), (src_off), (len))
+
+/* Insert a reserved area somewhere in the buffer; caller fills it.
+ * Evaluates to a (duk_uint_t *) pointing to the start of the reserved
+ * area for convenience.
+ */
+#define DUK_BW_INSERT_RAW_AREA(thr,bw,off,len) \
+ duk_bw_insert_raw_area((thr), (bw), (off), (len))
+
+/* Remove a slice from inside buffer. */
+#define DUK_BW_REMOVE_RAW_SLICE(thr,bw,off,len) \
+ duk_bw_remove_raw_slice((thr), (bw), (off), (len))
+
+/* Safe write calls which will ensure space first. */
+
+#define DUK_BW_WRITE_ENSURE_U8(thr,bw_ctx,val) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), 1); \
+ DUK_BW_WRITE_RAW_U8((thr), (bw_ctx), (val)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_U8_2(thr,bw_ctx,val1,val2) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), 2); \
+ DUK_BW_WRITE_RAW_U8_2((thr), (bw_ctx), (val1), (val2)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_U8_3(thr,bw_ctx,val1,val2,val3) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), 3); \
+ DUK_BW_WRITE_RAW_U8_3((thr), (bw_ctx), (val1), (val2), (val3)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), 4); \
+ DUK_BW_WRITE_RAW_U8_4((thr), (bw_ctx), (val1), (val2), (val3), (val4)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), 5); \
+ DUK_BW_WRITE_RAW_U8_5((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), 6); \
+ DUK_BW_WRITE_RAW_U8_6((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5), (val6)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_XUTF8(thr,bw_ctx,cp) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_XUTF8_LENGTH); \
+ DUK_BW_WRITE_RAW_XUTF8((thr), (bw_ctx), (cp)); \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_CESU8(thr,bw_ctx,cp) do { \
+ DUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_CESU8_LENGTH); \
+ DUK_BW_WRITE_RAW_CESU8((thr), (bw_ctx), (cp)); \
+ } while (0)
+/* XXX: add temporary duk__p pointer here too; sharing */
+#define DUK_BW_WRITE_ENSURE_BYTES(thr,bw_ctx,valptr,valsz) do { \
+ const void *duk__valptr; \
+ duk_size_t duk__valsz; \
+ duk__valptr = (const void *) (valptr); \
+ duk__valsz = (duk_size_t) (valsz); \
+ DUK_BW_ENSURE((thr), (bw_ctx), duk__valsz); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \
+ (bw_ctx)->p += duk__valsz; \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_CSTRING(thr,bw_ctx,val) do { \
+ const duk_uint8_t *duk__val; \
+ duk_size_t duk__val_len; \
+ duk__val = (const duk_uint8_t *) (val); \
+ duk__val_len = DUK_STRLEN((const char *) duk__val); \
+ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_HSTRING(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \
+ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_HBUFFER(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HBUFFER_GET_SIZE((val)); \
+ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_HBUFFER_FIXED(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \
+ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+#define DUK_BW_WRITE_ENSURE_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \
+ duk_size_t duk__val_len; \
+ duk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \
+ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \
+ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \
+ (bw_ctx)->p += duk__val_len; \
+ } while (0)
+
+#define DUK_BW_WRITE_ENSURE_SLICE(thr,bw,dst_off,dst_len) \
+ duk_bw_write_ensure_slice((thr), (bw), (dst_off), (dst_len))
+#define DUK_BW_INSERT_ENSURE_BYTES(thr,bw,dst_off,buf,len) \
+ duk_bw_insert_ensure_bytes((thr), (bw), (dst_off), (buf), (len))
+#define DUK_BW_INSERT_ENSURE_SLICE(thr,bw,dst_off,src_off,len) \
+ duk_bw_insert_ensure_slice((thr), (bw), (dst_off), (src_off), (len))
+#define DUK_BW_INSERT_ENSURE_AREA(thr,bw,off,len) \
+ /* Evaluates to (duk_uint8_t *) pointing to start of area. */ \
+ duk_bw_insert_ensure_area((thr), (bw), (off), (len))
+#define DUK_BW_REMOVE_ENSURE_SLICE(thr,bw,off,len) \
+ /* No difference between raw/ensure because the buffer shrinks. */ \
+ DUK_BW_REMOVE_RAW_SLICE((thr), (bw), (off), (len))
+
+/*
+ * Externs and prototypes
+ */
+
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_uint8_t duk_lc_digits[36];
+DUK_INTERNAL_DECL const duk_uint8_t duk_uc_nybbles[16];
+DUK_INTERNAL_DECL const duk_int8_t duk_hex_dectab[256];
+#if defined(DUK_USE_HEX_FASTPATH)
+DUK_INTERNAL_DECL const duk_int16_t duk_hex_dectab_shift4[256];
+DUK_INTERNAL_DECL const duk_uint16_t duk_hex_enctab[256];
+#endif
+#if defined(DUK_USE_BASE64_FASTPATH)
+DUK_INTERNAL_DECL const duk_uint8_t duk_base64_enctab[64];
+DUK_INTERNAL_DECL const duk_int8_t duk_base64_dectab[256];
+#endif
+#endif /* !DUK_SINGLE_FILE */
+
+/* Note: assumes that duk_util_probe_steps size is 32 */
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL duk_uint8_t duk_util_probe_steps[32];
+#endif /* !DUK_SINGLE_FILE */
+#endif
+
+#if defined(DUK_USE_STRHASH_DENSE)
+DUK_INTERNAL_DECL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed);
+#endif
+
+DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits);
+DUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx);
+DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value);
+DUK_INTERNAL_DECL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value);
+DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx);
+DUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out);
+
+DUK_INTERNAL_DECL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits);
+DUK_INTERNAL_DECL void duk_be_finish(duk_bitencoder_ctx *ctx);
+
+#if !defined(DUK_USE_GET_RANDOM_DOUBLE)
+DUK_INTERNAL_DECL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr);
+#endif
+
+DUK_INTERNAL_DECL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf);
+DUK_INTERNAL_DECL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size);
+DUK_INTERNAL_DECL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz);
+DUK_INTERNAL_DECL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx);
+DUK_INTERNAL_DECL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len);
+DUK_INTERNAL_DECL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len);
+DUK_INTERNAL_DECL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len);
+DUK_INTERNAL_DECL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len);
+DUK_INTERNAL_DECL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len);
+DUK_INTERNAL_DECL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len);
+DUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len);
+DUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len);
+DUK_INTERNAL_DECL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len);
+/* No duk_bw_remove_ensure_slice(), functionality would be identical. */
+
+DUK_INTERNAL_DECL duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p);
+DUK_INTERNAL_DECL duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p);
+DUK_INTERNAL_DECL duk_double_t duk_raw_read_double_be(duk_uint8_t **p);
+DUK_INTERNAL_DECL void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val);
+DUK_INTERNAL_DECL void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val);
+DUK_INTERNAL_DECL void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val);
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT) /* For now only needed by the debugger. */
+DUK_INTERNAL_DECL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len);
+#endif
+
+DUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival);
+DUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_anyinf(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_posinf(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_neginf(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x);
+DUK_INTERNAL_DECL duk_small_uint_t duk_double_signbit(duk_double_t x);
+DUK_INTERNAL_DECL duk_double_t duk_double_trunc_towards_zero(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y);
+DUK_INTERNAL_DECL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y);
+DUK_INTERNAL_DECL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y);
+
+#endif /* DUK_UTIL_H_INCLUDED */
+/* #include duk_strings.h */
+#line 1 "duk_strings.h"
+/*
+ * Shared string macros.
+ *
+ * Using shared macros helps minimize strings data size because it's easy
+ * to check if an existing string could be used. String constants don't
+ * need to be all defined here; defining a string here makes sense if there's
+ * a high chance the string could be reused. Also, using macros allows
+ * a call site express the exact string needed, but the macro may map to an
+ * approximate string to reduce unique string count. Macros can also be
+ * more easily tuned for low memory targets than #if defined()s throughout
+ * the code base.
+ *
+ * Because format strings behave differently in the call site (they need to
+ * be followed by format arguments), they use a special prefix DUK_STR_FMT_.
+ *
+ * On some compilers using explicit shared strings is preferable; on others
+ * it may be better to use straight literals because the compiler will combine
+ * them anyway, and such strings won't end up unnecessarily in a symbol table.
+ */
+
+#if !defined(DUK_ERRMSG_H_INCLUDED)
+#define DUK_ERRMSG_H_INCLUDED
+
+/* Mostly API and built-in method related */
+#define DUK_STR_INTERNAL_ERROR "internal error"
+#define DUK_STR_UNSUPPORTED "unsupported"
+#define DUK_STR_INVALID_COUNT "invalid count"
+#define DUK_STR_INVALID_ARGS "invalid args"
+#define DUK_STR_INVALID_STATE "invalid state"
+#define DUK_STR_INVALID_INPUT "invalid input"
+#define DUK_STR_INVALID_LENGTH "invalid length"
+#define DUK_STR_NOT_CONSTRUCTABLE "not constructable"
+#define DUK_STR_CONSTRUCT_ONLY "constructor requires 'new'"
+#define DUK_STR_NOT_CALLABLE "not callable"
+#define DUK_STR_NOT_EXTENSIBLE "not extensible"
+#define DUK_STR_NOT_WRITABLE "not writable"
+#define DUK_STR_NOT_CONFIGURABLE "not configurable"
+#define DUK_STR_INVALID_CONTEXT "invalid context"
+#define DUK_STR_INVALID_INDEX "invalid args"
+#define DUK_STR_PUSH_BEYOND_ALLOC_STACK "cannot push beyond allocated stack"
+#define DUK_STR_NOT_UNDEFINED "unexpected type"
+#define DUK_STR_NOT_NULL "unexpected type"
+#define DUK_STR_NOT_BOOLEAN "unexpected type"
+#define DUK_STR_NOT_NUMBER "unexpected type"
+#define DUK_STR_NOT_STRING "unexpected type"
+#define DUK_STR_NOT_OBJECT "unexpected type"
+#define DUK_STR_NOT_POINTER "unexpected type"
+#define DUK_STR_NOT_BUFFER "not buffer" /* still in use with verbose messages */
+#define DUK_STR_UNEXPECTED_TYPE "unexpected type"
+#define DUK_STR_NOT_THREAD "unexpected type"
+#define DUK_STR_NOT_COMPFUNC "unexpected type"
+#define DUK_STR_NOT_NATFUNC "unexpected type"
+#define DUK_STR_NOT_C_FUNCTION "unexpected type"
+#define DUK_STR_NOT_FUNCTION "unexpected type"
+#define DUK_STR_NOT_REGEXP "unexpected type"
+#define DUK_STR_TOPRIMITIVE_FAILED "coercion to primitive failed"
+#define DUK_STR_NUMBER_OUTSIDE_RANGE "number outside range"
+#define DUK_STR_NOT_OBJECT_COERCIBLE "not object coercible"
+#define DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL "cannot number coerce Symbol"
+#define DUK_STR_CANNOT_STRING_COERCE_SYMBOL "cannot string coerce Symbol"
+#define DUK_STR_STRING_TOO_LONG "string too long"
+#define DUK_STR_BUFFER_TOO_LONG "buffer too long"
+#define DUK_STR_ALLOC_FAILED "alloc failed"
+#define DUK_STR_WRONG_BUFFER_TYPE "wrong buffer type"
+#define DUK_STR_BASE64_ENCODE_FAILED "base64 encode failed"
+#define DUK_STR_SOURCE_DECODE_FAILED "source decode failed"
+#define DUK_STR_UTF8_DECODE_FAILED "utf-8 decode failed"
+#define DUK_STR_BASE64_DECODE_FAILED "base64 decode failed"
+#define DUK_STR_HEX_DECODE_FAILED "hex decode failed"
+#define DUK_STR_INVALID_BYTECODE "invalid bytecode"
+#define DUK_STR_NO_SOURCECODE "no sourcecode"
+#define DUK_STR_RESULT_TOO_LONG "result too long"
+#define DUK_STR_INVALID_CFUNC_RC "invalid C function rc"
+#define DUK_STR_INVALID_INSTANCEOF_RVAL "invalid instanceof rval"
+#define DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO "instanceof rval has no .prototype"
+
+/* JSON */
+#define DUK_STR_FMT_PTR "%p"
+#define DUK_STR_FMT_INVALID_JSON "invalid json (at offset %ld)"
+#define DUK_STR_JSONDEC_RECLIMIT "json decode recursion limit"
+#define DUK_STR_JSONENC_RECLIMIT "json encode recursion limit"
+#define DUK_STR_CYCLIC_INPUT "cyclic input"
+
+/* Object property access */
+#define DUK_STR_INVALID_BASE "invalid base value"
+#define DUK_STR_STRICT_CALLER_READ "cannot read strict 'caller'"
+#define DUK_STR_PROXY_REJECTED "proxy rejected"
+#define DUK_STR_INVALID_ARRAY_LENGTH "invalid array length"
+#define DUK_STR_SETTER_UNDEFINED "setter undefined"
+#define DUK_STR_INVALID_DESCRIPTOR "invalid descriptor"
+
+/* Proxy */
+#define DUK_STR_PROXY_REVOKED "proxy revoked"
+#define DUK_STR_INVALID_TRAP_RESULT "invalid trap result"
+
+/* Variables */
+
+/* Lexer */
+#define DUK_STR_INVALID_ESCAPE "invalid escape"
+#define DUK_STR_UNTERMINATED_STRING "unterminated string"
+#define DUK_STR_UNTERMINATED_COMMENT "unterminated comment"
+#define DUK_STR_UNTERMINATED_REGEXP "unterminated regexp"
+#define DUK_STR_TOKEN_LIMIT "token limit"
+#define DUK_STR_REGEXP_SUPPORT_DISABLED "regexp support disabled"
+#define DUK_STR_INVALID_NUMBER_LITERAL "invalid number literal"
+#define DUK_STR_INVALID_TOKEN "invalid token"
+
+/* Compiler */
+#define DUK_STR_PARSE_ERROR "parse error"
+#define DUK_STR_DUPLICATE_LABEL "duplicate label"
+#define DUK_STR_INVALID_LABEL "invalid label"
+#define DUK_STR_INVALID_ARRAY_LITERAL "invalid array literal"
+#define DUK_STR_INVALID_OBJECT_LITERAL "invalid object literal"
+#define DUK_STR_INVALID_VAR_DECLARATION "invalid variable declaration"
+#define DUK_STR_CANNOT_DELETE_IDENTIFIER "cannot delete identifier"
+#define DUK_STR_INVALID_EXPRESSION "invalid expression"
+#define DUK_STR_INVALID_LVALUE "invalid lvalue"
+#define DUK_STR_INVALID_NEWTARGET "invalid new.target"
+#define DUK_STR_EXPECTED_IDENTIFIER "expected identifier"
+#define DUK_STR_EMPTY_EXPR_NOT_ALLOWED "empty expression not allowed"
+#define DUK_STR_INVALID_FOR "invalid for statement"
+#define DUK_STR_INVALID_SWITCH "invalid switch statement"
+#define DUK_STR_INVALID_BREAK_CONT_LABEL "invalid break/continue label"
+#define DUK_STR_INVALID_RETURN "invalid return"
+#define DUK_STR_INVALID_TRY "invalid try"
+#define DUK_STR_INVALID_THROW "invalid throw"
+#define DUK_STR_WITH_IN_STRICT_MODE "with in strict mode"
+#define DUK_STR_FUNC_STMT_NOT_ALLOWED "function statement not allowed"
+#define DUK_STR_UNTERMINATED_STMT "unterminated statement"
+#define DUK_STR_INVALID_ARG_NAME "invalid argument name"
+#define DUK_STR_INVALID_FUNC_NAME "invalid function name"
+#define DUK_STR_INVALID_GETSET_NAME "invalid getter/setter name"
+#define DUK_STR_FUNC_NAME_REQUIRED "function name required"
+
+/* RegExp */
+#define DUK_STR_INVALID_QUANTIFIER "invalid regexp quantifier"
+#define DUK_STR_INVALID_QUANTIFIER_NO_ATOM "quantifier without preceding atom"
+#define DUK_STR_INVALID_QUANTIFIER_VALUES "quantifier values invalid (qmin > qmax)"
+#define DUK_STR_QUANTIFIER_TOO_MANY_COPIES "quantifier requires too many atom copies"
+#define DUK_STR_UNEXPECTED_CLOSING_PAREN "unexpected closing parenthesis"
+#define DUK_STR_UNEXPECTED_END_OF_PATTERN "unexpected end of pattern"
+#define DUK_STR_UNEXPECTED_REGEXP_TOKEN "unexpected token in regexp"
+#define DUK_STR_INVALID_REGEXP_FLAGS "invalid regexp flags"
+#define DUK_STR_INVALID_REGEXP_ESCAPE "invalid regexp escape"
+#define DUK_STR_INVALID_BACKREFS "invalid backreference(s)"
+#define DUK_STR_INVALID_REGEXP_CHARACTER "invalid regexp character"
+#define DUK_STR_INVALID_REGEXP_GROUP "invalid regexp group"
+#define DUK_STR_UNTERMINATED_CHARCLASS "unterminated character class"
+#define DUK_STR_INVALID_RANGE "invalid range"
+
+/* Limits */
+#define DUK_STR_VALSTACK_LIMIT "valstack limit"
+#define DUK_STR_CALLSTACK_LIMIT "callstack limit"
+#define DUK_STR_PROTOTYPE_CHAIN_LIMIT "prototype chain limit"
+#define DUK_STR_BOUND_CHAIN_LIMIT "function call bound chain limit"
+#define DUK_STR_C_CALLSTACK_LIMIT "C call stack depth limit"
+#define DUK_STR_COMPILER_RECURSION_LIMIT "compiler recursion limit"
+#define DUK_STR_BYTECODE_LIMIT "bytecode limit"
+#define DUK_STR_REG_LIMIT "register limit"
+#define DUK_STR_TEMP_LIMIT "temp limit"
+#define DUK_STR_CONST_LIMIT "const limit"
+#define DUK_STR_FUNC_LIMIT "function limit"
+#define DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT "regexp compiler recursion limit"
+#define DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT "regexp executor recursion limit"
+#define DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT "regexp step limit"
+
+#endif /* DUK_ERRMSG_H_INCLUDED */
+/* #include duk_js_bytecode.h */
+#line 1 "duk_js_bytecode.h"
+/*
+ * Ecmascript bytecode
+ */
+
+#if !defined(DUK_JS_BYTECODE_H_INCLUDED)
+#define DUK_JS_BYTECODE_H_INCLUDED
+
+/*
+ * Bytecode instruction layout
+ * ===========================
+ *
+ * Instructions are unsigned 32-bit integers divided as follows:
+ *
+ * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !
+ * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!
+ * +-----------------------------------------------+---------------+
+ * ! C ! B ! A ! OP !
+ * +-----------------------------------------------+---------------+
+ *
+ * OP (8 bits): opcode (DUK_OP_*), access should be fastest
+ * consecutive opcodes allocated when opcode needs flags
+ * A (8 bits): typically a target register number
+ * B (8 bits): typically first source register/constant number
+ * C (8 bits): typically second source register/constant number
+ *
+ * Some instructions combine BC or ABC together for larger parameter values.
+ * Signed integers (e.g. jump offsets) are encoded as unsigned, with an
+ * opcode specific bias.
+ *
+ * Some opcodes have flags which are handled by allocating consecutive
+ * opcodes to make space for 1-N flags. Flags can also be e.g. in the 'A'
+ * field when there's room for the specific opcode.
+ *
+ * For example, if three flags were needed, they could be allocated from
+ * the opcode field as follows:
+ *
+ * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !
+ * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!
+ * +-----------------------------------------------+---------------+
+ * ! C ! B ! A ! OP !Z!Y!X!
+ * +-----------------------------------------------+---------------+
+ *
+ * Some opcodes accept a reg/const argument which is handled by allocating
+ * flags in the OP field, see DUK_BC_ISREG() and DUK_BC_ISCONST(). The
+ * following convention is shared by most opcodes, so that the compiler
+ * can handle reg/const flagging without opcode specific code paths:
+ *
+ * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !
+ * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!
+ * +-----------------------------------------------+---------------+
+ * ! C ! B ! A ! OP !Y!X!
+ * +-----------------------------------------------+---------------+
+ *
+ * X 1=B is const, 0=B is reg
+ * Y 1=C is const, 0=C is reg
+ *
+ * In effect OP, OP + 1, OP + 2, and OP + 3 are allocated from the
+ * 8-bit opcode space for a single logical opcode. The base opcode
+ * number should be divisible by 4. If the opcode is called 'FOO'
+ * the following opcode constants would be defined:
+ *
+ * DUK_OP_FOO 100 // base opcode number
+ * DUK_OP_FOO_RR 100 // FOO, B=reg, C=reg
+ * DUK_OP_FOO_CR 101 // FOO, B=const, C=reg
+ * DUK_OP_FOO_RC 102 // FOO, B=reg, C=const
+ * DUK_OP_FOO_CC 103 // FOO, B=const, C=const
+ *
+ * If only B or C is a reg/const, the unused opcode combinations can be
+ * used for other opcodes (which take no reg/const argument). However,
+ * such opcode values are initially reserved, at least while opcode space
+ * is available. For example, if 'BAR' uses B for a register field and
+ * C is a reg/const:
+ *
+ * DUK_OP_BAR 116 // base opcode number
+ * DUK_OP_BAR_RR 116 // BAR, B=reg, C=reg
+ * DUK_OP_BAR_CR_UNUSED 117 // unused, could be repurposed
+ * DUK_OP_BAR_RC 118 // BAR, B=reg, C=const
+ * DUK_OP_BAR_CC_UNUSED 119 // unused, could be repurposed
+ *
+ * Macro naming is a bit misleading, e.g. "ABC" in macro name but the
+ * field layout is concretely "CBA" in the register.
+ */
+
+typedef duk_uint32_t duk_instr_t;
+
+#define DUK_BC_SHIFT_OP 0
+#define DUK_BC_SHIFT_A 8
+#define DUK_BC_SHIFT_B 16
+#define DUK_BC_SHIFT_C 24
+#define DUK_BC_SHIFT_BC DUK_BC_SHIFT_B
+#define DUK_BC_SHIFT_ABC DUK_BC_SHIFT_A
+
+#define DUK_BC_UNSHIFTED_MASK_OP 0xffUL
+#define DUK_BC_UNSHIFTED_MASK_A 0xffUL
+#define DUK_BC_UNSHIFTED_MASK_B 0xffUL
+#define DUK_BC_UNSHIFTED_MASK_C 0xffUL
+#define DUK_BC_UNSHIFTED_MASK_BC 0xffffUL
+#define DUK_BC_UNSHIFTED_MASK_ABC 0xffffffUL
+
+#define DUK_BC_SHIFTED_MASK_OP (DUK_BC_UNSHIFTED_MASK_OP << DUK_BC_SHIFT_OP)
+#define DUK_BC_SHIFTED_MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK_BC_SHIFT_A)
+#define DUK_BC_SHIFTED_MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK_BC_SHIFT_B)
+#define DUK_BC_SHIFTED_MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK_BC_SHIFT_C)
+#define DUK_BC_SHIFTED_MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK_BC_SHIFT_BC)
+#define DUK_BC_SHIFTED_MASK_ABC (DUK_BC_UNSHIFTED_MASK_ABC << DUK_BC_SHIFT_ABC)
+
+#define DUK_DEC_OP(x) ((x) & 0xffUL)
+#define DUK_DEC_A(x) (((x) >> 8) & 0xffUL)
+#define DUK_DEC_B(x) (((x) >> 16) & 0xffUL)
+#define DUK_DEC_C(x) (((x) >> 24) & 0xffUL)
+#define DUK_DEC_BC(x) (((x) >> 16) & 0xffffUL)
+#define DUK_DEC_ABC(x) (((x) >> 8) & 0xffffffUL)
+
+#define DUK_ENC_OP(op) ((duk_instr_t) (op))
+#define DUK_ENC_OP_ABC(op,abc) ((duk_instr_t) ( \
+ (((duk_instr_t) (abc)) << 8) | \
+ ((duk_instr_t) (op)) \
+ ))
+#define DUK_ENC_OP_A_BC(op,a,bc) ((duk_instr_t) ( \
+ (((duk_instr_t) (bc)) << 16) | \
+ (((duk_instr_t) (a)) << 8) | \
+ ((duk_instr_t) (op)) \
+ ))
+#define DUK_ENC_OP_A_B_C(op,a,b,c) ((duk_instr_t) ( \
+ (((duk_instr_t) (c)) << 24) | \
+ (((duk_instr_t) (b)) << 16) | \
+ (((duk_instr_t) (a)) << 8) | \
+ ((duk_instr_t) (op)) \
+ ))
+#define DUK_ENC_OP_A_B(op,a,b) DUK_ENC_OP_A_B_C((op),(a),(b),0)
+#define DUK_ENC_OP_A(op,a) DUK_ENC_OP_A_B_C((op),(a),0,0)
+#define DUK_ENC_OP_BC(op,bc) DUK_ENC_OP_A_BC((op),0,(bc))
+
+/* Get opcode base value with B/C reg/const flags cleared. */
+#define DUK_BC_NOREGCONST_OP(op) ((op) & 0xfc)
+
+/* Constants should be signed so that signed arithmetic involving them
+ * won't cause values to be coerced accidentally to unsigned.
+ */
+#define DUK_BC_OP_MIN 0
+#define DUK_BC_OP_MAX 0xffL
+#define DUK_BC_A_MIN 0
+#define DUK_BC_A_MAX 0xffL
+#define DUK_BC_B_MIN 0
+#define DUK_BC_B_MAX 0xffL
+#define DUK_BC_C_MIN 0
+#define DUK_BC_C_MAX 0xffL
+#define DUK_BC_BC_MIN 0
+#define DUK_BC_BC_MAX 0xffffL
+#define DUK_BC_ABC_MIN 0
+#define DUK_BC_ABC_MAX 0xffffffL
+
+/* Masks for B/C reg/const indicator in opcode field. */
+#define DUK_BC_REGCONST_B (0x01UL)
+#define DUK_BC_REGCONST_C (0x02UL)
+
+/* Misc. masks for opcode field. */
+#define DUK_BC_INCDECP_FLAG_DEC (0x04UL)
+#define DUK_BC_INCDECP_FLAG_POST (0x08UL)
+
+/* Opcodes. */
+#define DUK_OP_LDREG 0
+#define DUK_OP_STREG 1
+#define DUK_OP_JUMP 2
+#define DUK_OP_LDCONST 3
+#define DUK_OP_LDINT 4
+#define DUK_OP_LDINTX 5
+#define DUK_OP_LDTHIS 6
+#define DUK_OP_LDUNDEF 7
+#define DUK_OP_LDNULL 8
+#define DUK_OP_LDTRUE 9
+#define DUK_OP_LDFALSE 10
+#define DUK_OP_GETVAR 11
+#define DUK_OP_BNOT 12
+#define DUK_OP_LNOT 13
+#define DUK_OP_UNM 14
+#define DUK_OP_UNP 15
+#define DUK_OP_EQ 16
+#define DUK_OP_EQ_RR 16
+#define DUK_OP_EQ_CR 17
+#define DUK_OP_EQ_RC 18
+#define DUK_OP_EQ_CC 19
+#define DUK_OP_NEQ 20
+#define DUK_OP_NEQ_RR 20
+#define DUK_OP_NEQ_CR 21
+#define DUK_OP_NEQ_RC 22
+#define DUK_OP_NEQ_CC 23
+#define DUK_OP_SEQ 24
+#define DUK_OP_SEQ_RR 24
+#define DUK_OP_SEQ_CR 25
+#define DUK_OP_SEQ_RC 26
+#define DUK_OP_SEQ_CC 27
+#define DUK_OP_SNEQ 28
+#define DUK_OP_SNEQ_RR 28
+#define DUK_OP_SNEQ_CR 29
+#define DUK_OP_SNEQ_RC 30
+#define DUK_OP_SNEQ_CC 31
+#define DUK_OP_GT 32
+#define DUK_OP_GT_RR 32
+#define DUK_OP_GT_CR 33
+#define DUK_OP_GT_RC 34
+#define DUK_OP_GT_CC 35
+#define DUK_OP_GE 36
+#define DUK_OP_GE_RR 36
+#define DUK_OP_GE_CR 37
+#define DUK_OP_GE_RC 38
+#define DUK_OP_GE_CC 39
+#define DUK_OP_LT 40
+#define DUK_OP_LT_RR 40
+#define DUK_OP_LT_CR 41
+#define DUK_OP_LT_RC 42
+#define DUK_OP_LT_CC 43
+#define DUK_OP_LE 44
+#define DUK_OP_LE_RR 44
+#define DUK_OP_LE_CR 45
+#define DUK_OP_LE_RC 46
+#define DUK_OP_LE_CC 47
+#define DUK_OP_IFTRUE 48
+#define DUK_OP_IFTRUE_R 48
+#define DUK_OP_IFTRUE_C 49
+#define DUK_OP_IFFALSE 50
+#define DUK_OP_IFFALSE_R 50
+#define DUK_OP_IFFALSE_C 51
+#define DUK_OP_ADD 52
+#define DUK_OP_ADD_RR 52
+#define DUK_OP_ADD_CR 53
+#define DUK_OP_ADD_RC 54
+#define DUK_OP_ADD_CC 55
+#define DUK_OP_SUB 56
+#define DUK_OP_SUB_RR 56
+#define DUK_OP_SUB_CR 57
+#define DUK_OP_SUB_RC 58
+#define DUK_OP_SUB_CC 59
+#define DUK_OP_MUL 60
+#define DUK_OP_MUL_RR 60
+#define DUK_OP_MUL_CR 61
+#define DUK_OP_MUL_RC 62
+#define DUK_OP_MUL_CC 63
+#define DUK_OP_DIV 64
+#define DUK_OP_DIV_RR 64
+#define DUK_OP_DIV_CR 65
+#define DUK_OP_DIV_RC 66
+#define DUK_OP_DIV_CC 67
+#define DUK_OP_MOD 68
+#define DUK_OP_MOD_RR 68
+#define DUK_OP_MOD_CR 69
+#define DUK_OP_MOD_RC 70
+#define DUK_OP_MOD_CC 71
+#define DUK_OP_EXP 72
+#define DUK_OP_EXP_RR 72
+#define DUK_OP_EXP_CR 73
+#define DUK_OP_EXP_RC 74
+#define DUK_OP_EXP_CC 75
+#define DUK_OP_BAND 76
+#define DUK_OP_BAND_RR 76
+#define DUK_OP_BAND_CR 77
+#define DUK_OP_BAND_RC 78
+#define DUK_OP_BAND_CC 79
+#define DUK_OP_BOR 80
+#define DUK_OP_BOR_RR 80
+#define DUK_OP_BOR_CR 81
+#define DUK_OP_BOR_RC 82
+#define DUK_OP_BOR_CC 83
+#define DUK_OP_BXOR 84
+#define DUK_OP_BXOR_RR 84
+#define DUK_OP_BXOR_CR 85
+#define DUK_OP_BXOR_RC 86
+#define DUK_OP_BXOR_CC 87
+#define DUK_OP_BASL 88
+#define DUK_OP_BASL_RR 88
+#define DUK_OP_BASL_CR 89
+#define DUK_OP_BASL_RC 90
+#define DUK_OP_BASL_CC 91
+#define DUK_OP_BLSR 92
+#define DUK_OP_BLSR_RR 92
+#define DUK_OP_BLSR_CR 93
+#define DUK_OP_BLSR_RC 94
+#define DUK_OP_BLSR_CC 95
+#define DUK_OP_BASR 96
+#define DUK_OP_BASR_RR 96
+#define DUK_OP_BASR_CR 97
+#define DUK_OP_BASR_RC 98
+#define DUK_OP_BASR_CC 99
+#define DUK_OP_INSTOF 100
+#define DUK_OP_INSTOF_RR 100
+#define DUK_OP_INSTOF_CR 101
+#define DUK_OP_INSTOF_RC 102
+#define DUK_OP_INSTOF_CC 103
+#define DUK_OP_IN 104
+#define DUK_OP_IN_RR 104
+#define DUK_OP_IN_CR 105
+#define DUK_OP_IN_RC 106
+#define DUK_OP_IN_CC 107
+#define DUK_OP_GETPROP 108
+#define DUK_OP_GETPROP_RR 108
+#define DUK_OP_GETPROP_CR 109
+#define DUK_OP_GETPROP_RC 110
+#define DUK_OP_GETPROP_CC 111
+#define DUK_OP_PUTPROP 112
+#define DUK_OP_PUTPROP_RR 112
+#define DUK_OP_PUTPROP_CR 113
+#define DUK_OP_PUTPROP_RC 114
+#define DUK_OP_PUTPROP_CC 115
+#define DUK_OP_DELPROP 116
+#define DUK_OP_DELPROP_RR 116
+#define DUK_OP_DELPROP_CR_UNUSED 117 /* unused now */
+#define DUK_OP_DELPROP_RC 118
+#define DUK_OP_DELPROP_CC_UNUSED 119 /* unused now */
+#define DUK_OP_PREINCR 120 /* pre/post opcode values have constraints, */
+#define DUK_OP_PREDECR 121 /* see duk_js_executor.c and duk_js_compiler.c. */
+#define DUK_OP_POSTINCR 122
+#define DUK_OP_POSTDECR 123
+#define DUK_OP_PREINCV 124
+#define DUK_OP_PREDECV 125
+#define DUK_OP_POSTINCV 126
+#define DUK_OP_POSTDECV 127
+#define DUK_OP_PREINCP 128 /* pre/post inc/dec prop opcodes have constraints */
+#define DUK_OP_PREINCP_RR 128
+#define DUK_OP_PREINCP_CR 129
+#define DUK_OP_PREINCP_RC 130
+#define DUK_OP_PREINCP_CC 131
+#define DUK_OP_PREDECP 132
+#define DUK_OP_PREDECP_RR 132
+#define DUK_OP_PREDECP_CR 133
+#define DUK_OP_PREDECP_RC 134
+#define DUK_OP_PREDECP_CC 135
+#define DUK_OP_POSTINCP 136
+#define DUK_OP_POSTINCP_RR 136
+#define DUK_OP_POSTINCP_CR 137
+#define DUK_OP_POSTINCP_RC 138
+#define DUK_OP_POSTINCP_CC 139
+#define DUK_OP_POSTDECP 140
+#define DUK_OP_POSTDECP_RR 140
+#define DUK_OP_POSTDECP_CR 141
+#define DUK_OP_POSTDECP_RC 142
+#define DUK_OP_POSTDECP_CC 143
+#define DUK_OP_DECLVAR 144
+#define DUK_OP_DECLVAR_RR 144
+#define DUK_OP_DECLVAR_CR 145
+#define DUK_OP_DECLVAR_RC 146
+#define DUK_OP_DECLVAR_CC 147
+#define DUK_OP_REGEXP 148
+#define DUK_OP_REGEXP_RR 148
+#define DUK_OP_REGEXP_CR 149
+#define DUK_OP_REGEXP_RC 150
+#define DUK_OP_REGEXP_CC 151
+#define DUK_OP_CLOSURE 152
+#define DUK_OP_TYPEOF 153
+#define DUK_OP_TYPEOFID 154
+#define DUK_OP_PUTVAR 155
+#define DUK_OP_DELVAR 156
+#define DUK_OP_RETREG 157
+#define DUK_OP_RETUNDEF 158
+#define DUK_OP_RETCONST 159
+#define DUK_OP_RETCONSTN 160 /* return const without incref (e.g. number) */
+#define DUK_OP_LABEL 161
+#define DUK_OP_ENDLABEL 162
+#define DUK_OP_BREAK 163
+#define DUK_OP_CONTINUE 164
+#define DUK_OP_TRYCATCH 165
+#define DUK_OP_ENDTRY 166
+#define DUK_OP_ENDCATCH 167
+#define DUK_OP_ENDFIN 168
+#define DUK_OP_THROW 169
+#define DUK_OP_INVLHS 170
+#define DUK_OP_CSREG 171
+#define DUK_OP_CSVAR 172
+#define DUK_OP_CSVAR_RR 172
+#define DUK_OP_CSVAR_CR 173
+#define DUK_OP_CSVAR_RC 174
+#define DUK_OP_CSVAR_CC 175
+#define DUK_OP_CALL0 176 /* DUK_OP_CALL0 & 0x0F must be zero. */
+#define DUK_OP_CALL1 177
+#define DUK_OP_CALL2 178
+#define DUK_OP_CALL3 179
+#define DUK_OP_CALL4 180
+#define DUK_OP_CALL5 181
+#define DUK_OP_CALL6 182
+#define DUK_OP_CALL7 183
+#define DUK_OP_CALL8 184
+#define DUK_OP_CALL9 185
+#define DUK_OP_CALL10 186
+#define DUK_OP_CALL11 187
+#define DUK_OP_CALL12 188
+#define DUK_OP_CALL13 189
+#define DUK_OP_CALL14 190
+#define DUK_OP_CALL15 191
+#define DUK_OP_NEWOBJ 192
+#define DUK_OP_NEWARR 193
+#define DUK_OP_MPUTOBJ 194
+#define DUK_OP_MPUTOBJI 195
+#define DUK_OP_INITSET 196
+#define DUK_OP_INITGET 197
+#define DUK_OP_MPUTARR 198
+#define DUK_OP_MPUTARRI 199
+#define DUK_OP_SETALEN 200
+#define DUK_OP_INITENUM 201
+#define DUK_OP_NEXTENUM 202
+#define DUK_OP_NEWTARGET 203
+#define DUK_OP_DEBUGGER 204
+#define DUK_OP_NOP 205
+#define DUK_OP_INVALID 206
+#define DUK_OP_UNUSED207 207
+#define DUK_OP_GETPROPC 208
+#define DUK_OP_GETPROPC_RR 208
+#define DUK_OP_GETPROPC_CR 209
+#define DUK_OP_GETPROPC_RC 210
+#define DUK_OP_GETPROPC_CC 211
+#define DUK_OP_UNUSED212 212
+#define DUK_OP_UNUSED213 213
+#define DUK_OP_UNUSED214 214
+#define DUK_OP_UNUSED215 215
+#define DUK_OP_UNUSED216 216
+#define DUK_OP_UNUSED217 217
+#define DUK_OP_UNUSED218 218
+#define DUK_OP_UNUSED219 219
+#define DUK_OP_UNUSED220 220
+#define DUK_OP_UNUSED221 221
+#define DUK_OP_UNUSED222 222
+#define DUK_OP_UNUSED223 223
+#define DUK_OP_UNUSED224 224
+#define DUK_OP_UNUSED225 225
+#define DUK_OP_UNUSED226 226
+#define DUK_OP_UNUSED227 227
+#define DUK_OP_UNUSED228 228
+#define DUK_OP_UNUSED229 229
+#define DUK_OP_UNUSED230 230
+#define DUK_OP_UNUSED231 231
+#define DUK_OP_UNUSED232 232
+#define DUK_OP_UNUSED233 233
+#define DUK_OP_UNUSED234 234
+#define DUK_OP_UNUSED235 235
+#define DUK_OP_UNUSED236 236
+#define DUK_OP_UNUSED237 237
+#define DUK_OP_UNUSED238 238
+#define DUK_OP_UNUSED239 239
+#define DUK_OP_UNUSED240 240
+#define DUK_OP_UNUSED241 241
+#define DUK_OP_UNUSED242 242
+#define DUK_OP_UNUSED243 243
+#define DUK_OP_UNUSED244 244
+#define DUK_OP_UNUSED245 245
+#define DUK_OP_UNUSED246 246
+#define DUK_OP_UNUSED247 247
+#define DUK_OP_UNUSED248 248
+#define DUK_OP_UNUSED249 249
+#define DUK_OP_UNUSED250 250
+#define DUK_OP_UNUSED251 251
+#define DUK_OP_UNUSED252 252
+#define DUK_OP_UNUSED253 253
+#define DUK_OP_UNUSED254 254
+#define DUK_OP_UNUSED255 255
+#define DUK_OP_NONE 256 /* dummy value used as marker (doesn't fit in 8-bit field) */
+
+/* XXX: Allocate flags from opcode field? Would take 16 opcode slots
+ * but avoids shuffling in more cases. Maybe not worth it.
+ */
+/* DUK_OP_TRYCATCH flags in A. */
+#define DUK_BC_TRYCATCH_FLAG_HAVE_CATCH (1U << 0)
+#define DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY (1U << 1)
+#define DUK_BC_TRYCATCH_FLAG_CATCH_BINDING (1U << 2)
+#define DUK_BC_TRYCATCH_FLAG_WITH_BINDING (1U << 3)
+
+/* DUK_OP_DECLVAR flags in A; bottom bits are reserved for propdesc flags
+ * (DUK_PROPDESC_FLAG_XXX).
+ */
+#define DUK_BC_DECLVAR_FLAG_FUNC_DECL (1U << 4) /* function declaration */
+
+/* DUK_OP_CALLn flags, part of opcode field. Three lowest bits must match
+ * DUK_CALL_FLAG_xxx directly.
+ */
+#define DUK_BC_CALL_FLAG_TAILCALL (1U << 0)
+#define DUK_BC_CALL_FLAG_CONSTRUCT (1U << 1)
+#define DUK_BC_CALL_FLAG_CALLED_AS_EVAL (1U << 2)
+#define DUK_BC_CALL_FLAG_INDIRECT (1U << 3)
+
+/* Misc constants and helper macros. */
+#define DUK_BC_LDINT_BIAS (1L << 15)
+#define DUK_BC_LDINTX_SHIFT 16
+#define DUK_BC_JUMP_BIAS (1L << 23)
+
+#endif /* DUK_JS_BYTECODE_H_INCLUDED */
+/* #include duk_lexer.h */
+#line 1 "duk_lexer.h"
+/*
+ * Lexer defines.
+ */
+
+#if !defined(DUK_LEXER_H_INCLUDED)
+#define DUK_LEXER_H_INCLUDED
+
+typedef void (*duk_re_range_callback)(void *user, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct);
+
+/*
+ * A token is interpreted as any possible production of InputElementDiv
+ * and InputElementRegExp, see E5 Section 7 in its entirety. Note that
+ * the E5 "Token" production does not cover all actual tokens of the
+ * language (which is explicitly stated in the specification, Section 7.5).
+ * Null and boolean literals are defined as part of both ReservedWord
+ * (E5 Section 7.6.1) and Literal (E5 Section 7.8) productions. Here,
+ * null and boolean values have literal tokens, and are not reserved
+ * words.
+ *
+ * Decimal literal negative/positive sign is -not- part of DUK_TOK_NUMBER.
+ * The number tokens always have a non-negative value. The unary minus
+ * operator in "-1.0" is optimized during compilation to yield a single
+ * negative constant.
+ *
+ * Token numbering is free except that reserved words are required to be
+ * in a continuous range and in a particular order. See genstrings.py.
+ */
+
+#define DUK_LEXER_INITCTX(ctx) duk_lexer_initctx((ctx))
+
+#define DUK_LEXER_SETPOINT(ctx,pt) duk_lexer_setpoint((ctx), (pt))
+
+#define DUK_LEXER_GETPOINT(ctx,pt) duk_lexer_getpoint((ctx), (pt))
+
+/* Currently 6 characters of lookup are actually needed (duk_lexer.c). */
+#define DUK_LEXER_WINDOW_SIZE 6
+#if defined(DUK_USE_LEXER_SLIDING_WINDOW)
+#define DUK_LEXER_BUFFER_SIZE 64
+#endif
+
+#define DUK_TOK_MINVAL 0
+
+/* returned after EOF (infinite amount) */
+#define DUK_TOK_EOF 0
+
+/* identifier names (E5 Section 7.6) */
+#define DUK_TOK_IDENTIFIER 1
+
+/* reserved words: keywords */
+#define DUK_TOK_START_RESERVED 2
+#define DUK_TOK_BREAK 2
+#define DUK_TOK_CASE 3
+#define DUK_TOK_CATCH 4
+#define DUK_TOK_CONTINUE 5
+#define DUK_TOK_DEBUGGER 6
+#define DUK_TOK_DEFAULT 7
+#define DUK_TOK_DELETE 8
+#define DUK_TOK_DO 9
+#define DUK_TOK_ELSE 10
+#define DUK_TOK_FINALLY 11
+#define DUK_TOK_FOR 12
+#define DUK_TOK_FUNCTION 13
+#define DUK_TOK_IF 14
+#define DUK_TOK_IN 15
+#define DUK_TOK_INSTANCEOF 16
+#define DUK_TOK_NEW 17
+#define DUK_TOK_RETURN 18
+#define DUK_TOK_SWITCH 19
+#define DUK_TOK_THIS 20
+#define DUK_TOK_THROW 21
+#define DUK_TOK_TRY 22
+#define DUK_TOK_TYPEOF 23
+#define DUK_TOK_VAR 24
+#define DUK_TOK_CONST 25
+#define DUK_TOK_VOID 26
+#define DUK_TOK_WHILE 27
+#define DUK_TOK_WITH 28
+
+/* reserved words: future reserved words */
+#define DUK_TOK_CLASS 29
+#define DUK_TOK_ENUM 30
+#define DUK_TOK_EXPORT 31
+#define DUK_TOK_EXTENDS 32
+#define DUK_TOK_IMPORT 33
+#define DUK_TOK_SUPER 34
+
+/* "null", "true", and "false" are always reserved words.
+ * Note that "get" and "set" are not!
+ */
+#define DUK_TOK_NULL 35
+#define DUK_TOK_TRUE 36
+#define DUK_TOK_FALSE 37
+
+/* reserved words: additional future reserved words in strict mode */
+#define DUK_TOK_START_STRICT_RESERVED 38 /* inclusive */
+#define DUK_TOK_IMPLEMENTS 38
+#define DUK_TOK_INTERFACE 39
+#define DUK_TOK_LET 40
+#define DUK_TOK_PACKAGE 41
+#define DUK_TOK_PRIVATE 42
+#define DUK_TOK_PROTECTED 43
+#define DUK_TOK_PUBLIC 44
+#define DUK_TOK_STATIC 45
+#define DUK_TOK_YIELD 46
+
+#define DUK_TOK_END_RESERVED 47 /* exclusive */
+
+/* "get" and "set" are tokens but NOT ReservedWords. They are currently
+ * parsed and identifiers and these defines are actually now unused.
+ */
+#define DUK_TOK_GET 47
+#define DUK_TOK_SET 48
+
+/* punctuators (unlike the spec, also includes "/" and "/=") */
+#define DUK_TOK_LCURLY 49
+#define DUK_TOK_RCURLY 50
+#define DUK_TOK_LBRACKET 51
+#define DUK_TOK_RBRACKET 52
+#define DUK_TOK_LPAREN 53
+#define DUK_TOK_RPAREN 54
+#define DUK_TOK_PERIOD 55
+#define DUK_TOK_SEMICOLON 56
+#define DUK_TOK_COMMA 57
+#define DUK_TOK_LT 58
+#define DUK_TOK_GT 59
+#define DUK_TOK_LE 60
+#define DUK_TOK_GE 61
+#define DUK_TOK_EQ 62
+#define DUK_TOK_NEQ 63
+#define DUK_TOK_SEQ 64
+#define DUK_TOK_SNEQ 65
+#define DUK_TOK_ADD 66
+#define DUK_TOK_SUB 67
+#define DUK_TOK_MUL 68
+#define DUK_TOK_DIV 69
+#define DUK_TOK_MOD 70
+#define DUK_TOK_EXP 71
+#define DUK_TOK_INCREMENT 72
+#define DUK_TOK_DECREMENT 73
+#define DUK_TOK_ALSHIFT 74 /* named "arithmetic" because result is signed */
+#define DUK_TOK_ARSHIFT 75
+#define DUK_TOK_RSHIFT 76
+#define DUK_TOK_BAND 77
+#define DUK_TOK_BOR 78
+#define DUK_TOK_BXOR 79
+#define DUK_TOK_LNOT 80
+#define DUK_TOK_BNOT 81
+#define DUK_TOK_LAND 82
+#define DUK_TOK_LOR 83
+#define DUK_TOK_QUESTION 84
+#define DUK_TOK_COLON 85
+#define DUK_TOK_EQUALSIGN 86
+#define DUK_TOK_ADD_EQ 87
+#define DUK_TOK_SUB_EQ 88
+#define DUK_TOK_MUL_EQ 89
+#define DUK_TOK_DIV_EQ 90
+#define DUK_TOK_MOD_EQ 91
+#define DUK_TOK_EXP_EQ 92
+#define DUK_TOK_ALSHIFT_EQ 93
+#define DUK_TOK_ARSHIFT_EQ 94
+#define DUK_TOK_RSHIFT_EQ 95
+#define DUK_TOK_BAND_EQ 96
+#define DUK_TOK_BOR_EQ 97
+#define DUK_TOK_BXOR_EQ 98
+
+/* literals (E5 Section 7.8), except null, true, false, which are treated
+ * like reserved words (above).
+ */
+#define DUK_TOK_NUMBER 99
+#define DUK_TOK_STRING 100
+#define DUK_TOK_REGEXP 101
+
+#define DUK_TOK_MAXVAL 101 /* inclusive */
+
+#define DUK_TOK_INVALID DUK_SMALL_UINT_MAX
+
+/* Convert heap string index to a token (reserved words) */
+#define DUK_STRIDX_TO_TOK(x) ((x) - DUK_STRIDX_START_RESERVED + DUK_TOK_START_RESERVED)
+
+/* Sanity check */
+#if (DUK_TOK_MAXVAL > 255)
+#error DUK_TOK_MAXVAL too large, code assumes it fits into 8 bits
+#endif
+
+/* Sanity checks for string and token defines */
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_BREAK) != DUK_TOK_BREAK)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CASE) != DUK_TOK_CASE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CATCH) != DUK_TOK_CATCH)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONTINUE) != DUK_TOK_CONTINUE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEBUGGER) != DUK_TOK_DEBUGGER)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEFAULT) != DUK_TOK_DEFAULT)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DELETE) != DUK_TOK_DELETE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DO) != DUK_TOK_DO)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ELSE) != DUK_TOK_ELSE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FINALLY) != DUK_TOK_FINALLY)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FOR) != DUK_TOK_FOR)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_FUNCTION) != DUK_TOK_FUNCTION)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IF) != DUK_TOK_IF)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IN) != DUK_TOK_IN)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INSTANCEOF) != DUK_TOK_INSTANCEOF)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_NEW) != DUK_TOK_NEW)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_RETURN) != DUK_TOK_RETURN)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SWITCH) != DUK_TOK_SWITCH)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THIS) != DUK_TOK_THIS)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THROW) != DUK_TOK_THROW)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRY) != DUK_TOK_TRY)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TYPEOF) != DUK_TOK_TYPEOF)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VAR) != DUK_TOK_VAR)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VOID) != DUK_TOK_VOID)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WHILE) != DUK_TOK_WHILE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WITH) != DUK_TOK_WITH)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CLASS) != DUK_TOK_CLASS)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONST) != DUK_TOK_CONST)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ENUM) != DUK_TOK_ENUM)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXPORT) != DUK_TOK_EXPORT)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXTENDS) != DUK_TOK_EXTENDS)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPORT) != DUK_TOK_IMPORT)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SUPER) != DUK_TOK_SUPER)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_NULL) != DUK_TOK_NULL)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRUE) != DUK_TOK_TRUE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FALSE) != DUK_TOK_FALSE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPLEMENTS) != DUK_TOK_IMPLEMENTS)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INTERFACE) != DUK_TOK_INTERFACE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LET) != DUK_TOK_LET)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PACKAGE) != DUK_TOK_PACKAGE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PRIVATE) != DUK_TOK_PRIVATE)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PROTECTED) != DUK_TOK_PROTECTED)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PUBLIC) != DUK_TOK_PUBLIC)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_STATIC) != DUK_TOK_STATIC)
+#error mismatch in token defines
+#endif
+#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_YIELD) != DUK_TOK_YIELD)
+#error mismatch in token defines
+#endif
+
+/* Regexp tokens */
+#define DUK_RETOK_EOF 0
+#define DUK_RETOK_DISJUNCTION 1
+#define DUK_RETOK_QUANTIFIER 2
+#define DUK_RETOK_ASSERT_START 3
+#define DUK_RETOK_ASSERT_END 4
+#define DUK_RETOK_ASSERT_WORD_BOUNDARY 5
+#define DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY 6
+#define DUK_RETOK_ASSERT_START_POS_LOOKAHEAD 7
+#define DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD 8
+#define DUK_RETOK_ATOM_PERIOD 9
+#define DUK_RETOK_ATOM_CHAR 10
+#define DUK_RETOK_ATOM_DIGIT 11 /* assumptions in regexp compiler */
+#define DUK_RETOK_ATOM_NOT_DIGIT 12 /* -""- */
+#define DUK_RETOK_ATOM_WHITE 13 /* -""- */
+#define DUK_RETOK_ATOM_NOT_WHITE 14 /* -""- */
+#define DUK_RETOK_ATOM_WORD_CHAR 15 /* -""- */
+#define DUK_RETOK_ATOM_NOT_WORD_CHAR 16 /* -""- */
+#define DUK_RETOK_ATOM_BACKREFERENCE 17
+#define DUK_RETOK_ATOM_START_CAPTURE_GROUP 18
+#define DUK_RETOK_ATOM_START_NONCAPTURE_GROUP 19
+#define DUK_RETOK_ATOM_START_CHARCLASS 20
+#define DUK_RETOK_ATOM_START_CHARCLASS_INVERTED 21
+#define DUK_RETOK_ATOM_END_GROUP 22
+
+/* Constants for duk_lexer_ctx.buf. */
+#define DUK_LEXER_TEMP_BUF_LIMIT 256
+
+/* A token value. Can be memcpy()'d, but note that slot1/slot2 values are on the valstack.
+ * Some fields (like num, str1, str2) are only valid for specific token types and may have
+ * stale values otherwise.
+ */
+struct duk_token {
+ duk_small_uint_t t; /* token type (with reserved word identification) */
+ duk_small_uint_t t_nores; /* token type (with reserved words as DUK_TOK_IDENTIFER) */
+ duk_double_t num; /* numeric value of token */
+ duk_hstring *str1; /* string 1 of token (borrowed, stored to ctx->slot1_idx) */
+ duk_hstring *str2; /* string 2 of token (borrowed, stored to ctx->slot2_idx) */
+ duk_size_t start_offset; /* start byte offset of token in lexer input */
+ duk_int_t start_line; /* start line of token (first char) */
+ duk_int_t num_escapes; /* number of escapes and line continuations (for directive prologue) */
+ duk_bool_t lineterm; /* token was preceded by a lineterm */
+ duk_bool_t allow_auto_semi; /* token allows automatic semicolon insertion (eof or preceded by newline) */
+};
+
+#define DUK_RE_QUANTIFIER_INFINITE ((duk_uint32_t) 0xffffffffUL)
+
+/* A regexp token value. */
+struct duk_re_token {
+ duk_small_uint_t t; /* token type */
+ duk_small_uint_t greedy;
+ duk_uint32_t num; /* numeric value (character, count) */
+ duk_uint32_t qmin;
+ duk_uint32_t qmax;
+};
+
+/* A structure for 'snapshotting' a point for rewinding */
+struct duk_lexer_point {
+ duk_size_t offset;
+ duk_int_t line;
+};
+
+/* Lexer codepoint with additional info like offset/line number */
+struct duk_lexer_codepoint {
+ duk_codepoint_t codepoint;
+ duk_size_t offset;
+ duk_int_t line;
+};
+
+/* Lexer context. Same context is used for Ecmascript and Regexp parsing. */
+struct duk_lexer_ctx {
+#if defined(DUK_USE_LEXER_SLIDING_WINDOW)
+ duk_lexer_codepoint *window; /* unicode code points, window[0] is always next, points to 'buffer' */
+ duk_lexer_codepoint buffer[DUK_LEXER_BUFFER_SIZE];
+#else
+ duk_lexer_codepoint window[DUK_LEXER_WINDOW_SIZE]; /* unicode code points, window[0] is always next */
+#endif
+
+ duk_hthread *thr; /* thread; minimizes argument passing */
+
+ const duk_uint8_t *input; /* input string (may be a user pointer) */
+ duk_size_t input_length; /* input byte length */
+ duk_size_t input_offset; /* input offset for window leading edge (not window[0]) */
+ duk_int_t input_line; /* input linenumber at input_offset (not window[0]), init to 1 */
+
+ duk_idx_t slot1_idx; /* valstack slot for 1st token value */
+ duk_idx_t slot2_idx; /* valstack slot for 2nd token value */
+ duk_idx_t buf_idx; /* valstack slot for temp buffer */
+ duk_hbuffer_dynamic *buf; /* temp accumulation buffer */
+ duk_bufwriter_ctx bw; /* bufwriter for temp accumulation */
+
+ duk_int_t token_count; /* number of tokens parsed */
+ duk_int_t token_limit; /* maximum token count before error (sanity backstop) */
+
+ duk_small_uint_t flags; /* lexer flags, use compiler flag defines for now */
+};
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx);
+
+DUK_INTERNAL_DECL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt);
+DUK_INTERNAL_DECL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt);
+
+DUK_INTERNAL_DECL
+void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx,
+ duk_token *out_token,
+ duk_bool_t strict_mode,
+ duk_bool_t regexp_mode);
+#if defined(DUK_USE_REGEXP_SUPPORT)
+DUK_INTERNAL_DECL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token);
+DUK_INTERNAL_DECL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata);
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+#endif /* DUK_LEXER_H_INCLUDED */
+/* #include duk_js_compiler.h */
+#line 1 "duk_js_compiler.h"
+/*
+ * Ecmascript compiler.
+ */
+
+#if !defined(DUK_JS_COMPILER_H_INCLUDED)
+#define DUK_JS_COMPILER_H_INCLUDED
+
+/* ecmascript compiler limits */
+#define DUK_COMPILER_TOKEN_LIMIT 100000000L /* 1e8: protects against deeply nested inner functions */
+
+/* maximum loopcount for peephole optimization */
+#define DUK_COMPILER_PEEPHOLE_MAXITER 3
+
+/* maximum bytecode length in instructions */
+#define DUK_COMPILER_MAX_BYTECODE_LENGTH (256L * 1024L * 1024L) /* 1 GB */
+
+/*
+ * Compiler intermediate values
+ *
+ * Intermediate values describe either plain values (e.g. strings or
+ * numbers) or binary operations which have not yet been coerced into
+ * either a left-hand-side or right-hand-side role (e.g. object property).
+ */
+
+#define DUK_IVAL_NONE 0 /* no value */
+#define DUK_IVAL_PLAIN 1 /* register, constant, or value */
+#define DUK_IVAL_ARITH 2 /* binary arithmetic; DUK_OP_ADD, DUK_OP_EQ, other binary ops */
+#define DUK_IVAL_PROP 3 /* property access */
+#define DUK_IVAL_VAR 4 /* variable access */
+
+#define DUK_ISPEC_NONE 0 /* no value */
+#define DUK_ISPEC_VALUE 1 /* value resides in 'valstack_idx' */
+#define DUK_ISPEC_REGCONST 2 /* value resides in a register or constant */
+
+/* Bit mask which indicates that a regconst is a constant instead of a register.
+ * Chosen so that when a regconst is cast to duk_int32_t, all consts are
+ * negative values.
+ */
+#define DUK_REGCONST_CONST_MARKER DUK_INT32_MIN /* = -0x80000000 */
+
+/* Type to represent a reg/const reference during compilation, with <0
+ * indicating a constant. Some call sites also use -1 to indicate 'none'.
+ */
+typedef duk_int32_t duk_regconst_t;
+
+typedef struct {
+ duk_small_uint_t t; /* DUK_ISPEC_XXX */
+ duk_regconst_t regconst;
+ duk_idx_t valstack_idx; /* always set; points to a reserved valstack slot */
+} duk_ispec;
+
+typedef struct {
+ /*
+ * PLAIN: x1
+ * ARITH: x1 <op> x2
+ * PROP: x1.x2
+ * VAR: x1 (name)
+ */
+
+ /* XXX: can be optimized for smaller footprint esp. on 32-bit environments */
+ duk_small_uint_t t; /* DUK_IVAL_XXX */
+ duk_small_uint_t op; /* bytecode opcode for binary ops */
+ duk_ispec x1;
+ duk_ispec x2;
+} duk_ivalue;
+
+/*
+ * Bytecode instruction representation during compilation
+ *
+ * Contains the actual instruction and (optionally) debug info.
+ */
+
+struct duk_compiler_instr {
+ duk_instr_t ins;
+#if defined(DUK_USE_PC2LINE)
+ duk_uint32_t line;
+#endif
+};
+
+/*
+ * Compiler state
+ */
+
+#define DUK_LABEL_FLAG_ALLOW_BREAK (1U << 0)
+#define DUK_LABEL_FLAG_ALLOW_CONTINUE (1U << 1)
+
+#define DUK_DECL_TYPE_VAR 0
+#define DUK_DECL_TYPE_FUNC 1
+
+/* XXX: optimize to 16 bytes */
+typedef struct {
+ duk_small_uint_t flags;
+ duk_int_t label_id; /* numeric label_id (-1 reserved as marker) */
+ duk_hstring *h_label; /* borrowed label name */
+ duk_int_t catch_depth; /* catch depth at point of definition */
+ duk_int_t pc_label; /* pc of label statement:
+ * pc+1: break jump site
+ * pc+2: continue jump site
+ */
+
+ /* Fast jumps (which avoid longjmp) jump directly to the jump sites
+ * which are always known even while the iteration/switch statement
+ * is still being parsed. A final peephole pass "straightens out"
+ * the jumps.
+ */
+} duk_labelinfo;
+
+/* Compiling state of one function, eventually converted to duk_hcompfunc */
+struct duk_compiler_func {
+ /* These pointers are at the start of the struct so that they pack
+ * nicely. Mixing pointers and integer values is bad on some
+ * platforms (e.g. if int is 32 bits and pointers are 64 bits).
+ */
+
+ duk_bufwriter_ctx bw_code; /* bufwriter for code */
+
+ duk_hstring *h_name; /* function name (borrowed reference), ends up in _name */
+ /* h_code: held in bw_code */
+ duk_hobject *h_consts; /* array */
+ duk_hobject *h_funcs; /* array of function templates: [func1, offset1, line1, func2, offset2, line2]
+ * offset/line points to closing brace to allow skipping on pass 2
+ */
+ duk_hobject *h_decls; /* array of declarations: [ name1, val1, name2, val2, ... ]
+ * valN = (typeN) | (fnum << 8), where fnum is inner func number (0 for vars)
+ * record function and variable declarations in pass 1
+ */
+ duk_hobject *h_labelnames; /* array of active label names */
+ duk_hbuffer_dynamic *h_labelinfos; /* C array of duk_labelinfo */
+ duk_hobject *h_argnames; /* array of formal argument names (-> _Formals) */
+ duk_hobject *h_varmap; /* variable map for pass 2 (identifier -> register number or null (unmapped)) */
+
+ /* Value stack indices for tracking objects. */
+ /* code_idx: not needed */
+ duk_idx_t consts_idx;
+ duk_idx_t funcs_idx;
+ duk_idx_t decls_idx;
+ duk_idx_t labelnames_idx;
+ duk_idx_t labelinfos_idx;
+ duk_idx_t argnames_idx;
+ duk_idx_t varmap_idx;
+
+ /* Temp reg handling. */
+ duk_regconst_t temp_first; /* first register that is a temporary (below: variables) */
+ duk_regconst_t temp_next; /* next temporary register to allocate */
+ duk_regconst_t temp_max; /* highest value of temp_reg (temp_max - 1 is highest used reg) */
+
+ /* Shuffle registers if large number of regs/consts. */
+ duk_regconst_t shuffle1;
+ duk_regconst_t shuffle2;
+ duk_regconst_t shuffle3;
+
+ /* Stats for current expression being parsed. */
+ duk_int_t nud_count;
+ duk_int_t led_count;
+ duk_int_t paren_level; /* parenthesis count, 0 = top level */
+ duk_bool_t expr_lhs; /* expression is left-hand-side compatible */
+ duk_bool_t allow_in; /* current paren level allows 'in' token */
+
+ /* Misc. */
+ duk_int_t stmt_next; /* statement id allocation (running counter) */
+ duk_int_t label_next; /* label id allocation (running counter) */
+ duk_int_t catch_depth; /* catch stack depth */
+ duk_int_t with_depth; /* with stack depth (affects identifier lookups) */
+ duk_int_t fnum_next; /* inner function numbering */
+ duk_int_t num_formals; /* number of formal arguments */
+ duk_regconst_t reg_stmt_value; /* register for writing value of 'non-empty' statements (global or eval code), -1 is marker */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_int_t min_line; /* XXX: typing (duk_hcompfunc has duk_uint32_t) */
+ duk_int_t max_line;
+#endif
+
+ /* Status booleans. */
+ duk_uint8_t is_function; /* is an actual function (not global/eval code) */
+ duk_uint8_t is_eval; /* is eval code */
+ duk_uint8_t is_global; /* is global code */
+ duk_uint8_t is_namebinding; /* needs a name binding */
+ duk_uint8_t is_constructable; /* result is constructable */
+ duk_uint8_t is_setget; /* is a setter/getter */
+ duk_uint8_t is_strict; /* function is strict */
+ duk_uint8_t is_notail; /* function must not be tail called */
+ duk_uint8_t in_directive_prologue; /* parsing in "directive prologue", recognize directives */
+ duk_uint8_t in_scanning; /* parsing in "scanning" phase (first pass) */
+ duk_uint8_t may_direct_eval; /* function may call direct eval */
+ duk_uint8_t id_access_arguments; /* function refers to 'arguments' identifier */
+ duk_uint8_t id_access_slow; /* function makes one or more slow path accesses that won't match own static variables */
+ duk_uint8_t id_access_slow_own; /* function makes one or more slow path accesses that may match own static variables */
+ duk_uint8_t is_arguments_shadowed; /* argument/function declaration shadows 'arguments' */
+ duk_uint8_t needs_shuffle; /* function needs shuffle registers */
+ duk_uint8_t reject_regexp_in_adv; /* reject RegExp literal on next advance() call; needed for handling IdentifierName productions */
+};
+
+struct duk_compiler_ctx {
+ duk_hthread *thr;
+
+ /* filename being compiled (ends up in functions' '_filename' property) */
+ duk_hstring *h_filename; /* borrowed reference */
+
+ /* lexing (tokenization) state (contains two valstack slot indices) */
+ duk_lexer_ctx lex;
+
+ /* current and previous token for parsing */
+ duk_token prev_token;
+ duk_token curr_token;
+ duk_idx_t tok11_idx; /* curr_token slot1 (matches 'lex' slot1_idx) */
+ duk_idx_t tok12_idx; /* curr_token slot2 (matches 'lex' slot2_idx) */
+ duk_idx_t tok21_idx; /* prev_token slot1 */
+ duk_idx_t tok22_idx; /* prev_token slot2 */
+
+ /* recursion limit */
+ duk_int_t recursion_depth;
+ duk_int_t recursion_limit;
+
+ /* code emission temporary */
+ duk_int_t emit_jumpslot_pc;
+
+ /* current function being compiled (embedded instead of pointer for more compact access) */
+ duk_compiler_func curr_func;
+};
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags);
+
+#endif /* DUK_JS_COMPILER_H_INCLUDED */
+/* #include duk_regexp.h */
+#line 1 "duk_regexp.h"
+/*
+ * Regular expression structs, constants, and bytecode defines.
+ */
+
+#if !defined(DUK_REGEXP_H_INCLUDED)
+#define DUK_REGEXP_H_INCLUDED
+
+/* maximum bytecode copies for {n,m} quantifiers */
+#define DUK_RE_MAX_ATOM_COPIES 1000
+
+/* regexp compilation limits */
+#define DUK_RE_COMPILE_TOKEN_LIMIT 100000000L /* 1e8 */
+
+/* regexp execution limits */
+#define DUK_RE_EXECUTE_STEPS_LIMIT 1000000000L /* 1e9 */
+
+/* regexp opcodes */
+#define DUK_REOP_MATCH 1
+#define DUK_REOP_CHAR 2
+#define DUK_REOP_PERIOD 3
+#define DUK_REOP_RANGES 4
+#define DUK_REOP_INVRANGES 5
+#define DUK_REOP_JUMP 6
+#define DUK_REOP_SPLIT1 7
+#define DUK_REOP_SPLIT2 8
+#define DUK_REOP_SQMINIMAL 9
+#define DUK_REOP_SQGREEDY 10
+#define DUK_REOP_SAVE 11
+#define DUK_REOP_WIPERANGE 12
+#define DUK_REOP_LOOKPOS 13
+#define DUK_REOP_LOOKNEG 14
+#define DUK_REOP_BACKREFERENCE 15
+#define DUK_REOP_ASSERT_START 16
+#define DUK_REOP_ASSERT_END 17
+#define DUK_REOP_ASSERT_WORD_BOUNDARY 18
+#define DUK_REOP_ASSERT_NOT_WORD_BOUNDARY 19
+
+/* flags */
+#define DUK_RE_FLAG_GLOBAL (1U << 0)
+#define DUK_RE_FLAG_IGNORE_CASE (1U << 1)
+#define DUK_RE_FLAG_MULTILINE (1U << 2)
+
+struct duk_re_matcher_ctx {
+ duk_hthread *thr;
+
+ duk_uint32_t re_flags;
+ const duk_uint8_t *input;
+ const duk_uint8_t *input_end;
+ const duk_uint8_t *bytecode;
+ const duk_uint8_t *bytecode_end;
+ const duk_uint8_t **saved; /* allocated from valstack (fixed buffer) */
+ duk_uint32_t nsaved;
+ duk_uint32_t recursion_depth;
+ duk_uint32_t recursion_limit;
+ duk_uint32_t steps_count;
+ duk_uint32_t steps_limit;
+};
+
+struct duk_re_compiler_ctx {
+ duk_hthread *thr;
+
+ duk_uint32_t re_flags;
+ duk_lexer_ctx lex;
+ duk_re_token curr_token;
+ duk_bufwriter_ctx bw;
+ duk_uint32_t captures; /* highest capture number emitted so far (used as: ++captures) */
+ duk_uint32_t highest_backref;
+ duk_uint32_t recursion_depth;
+ duk_uint32_t recursion_limit;
+ duk_uint32_t nranges; /* internal temporary value, used for char classes */
+};
+
+/*
+ * Prototypes
+ */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+DUK_INTERNAL_DECL void duk_regexp_compile(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_regexp_create_instance(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_regexp_match(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_regexp_match_force_global(duk_hthread *thr); /* hacky helper for String.prototype.split() */
+#endif
+
+#endif /* DUK_REGEXP_H_INCLUDED */
+/* #include duk_heaphdr.h */
+#line 1 "duk_heaphdr.h"
+/*
+ * Heap header definition and assorted macros, including ref counting.
+ * Access all fields through the accessor macros.
+ */
+
+#if !defined(DUK_HEAPHDR_H_INCLUDED)
+#define DUK_HEAPHDR_H_INCLUDED
+
+/*
+ * Common heap header
+ *
+ * All heap objects share the same flags and refcount fields. Objects other
+ * than strings also need to have a single or double linked list pointers
+ * for insertion into the "heap allocated" list. Strings have single linked
+ * list pointers for string table chaining.
+ *
+ * Technically, 'h_refcount' must be wide enough to guarantee that it cannot
+ * wrap; otherwise objects might be freed incorrectly after wrapping. The
+ * default refcount field is 32 bits even on 64-bit systems: while that's in
+ * theory incorrect, the Duktape heap needs to be larger than 64GB for the
+ * count to actually wrap (assuming 16-byte duk_tvals). This is very unlikely
+ * to ever be an issue, but if it is, disabling DUK_USE_REFCOUNT32 causes
+ * Duktape to use size_t for refcounts which should always be safe.
+ *
+ * Heap header size on 32-bit platforms: 8 bytes without reference counting,
+ * 16 bytes with reference counting.
+ *
+ * Note that 'raw' macros such as DUK_HEAPHDR_GET_REFCOUNT() are not
+ * defined without DUK_USE_REFERENCE_COUNTING, so caller must #if defined()
+ * around them.
+ */
+
+/* XXX: macro for shared header fields (avoids some padding issues) */
+
+struct duk_heaphdr {
+ duk_uint32_t h_flags;
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+#if defined(DUK_USE_ASSERTIONS)
+ /* When assertions enabled, used by mark-and-sweep for refcount
+ * validation. Largest reasonable type; also detects overflows.
+ */
+ duk_size_t h_assert_refcount;
+#endif
+#if defined(DUK_USE_REFCOUNT16)
+ duk_uint16_t h_refcount;
+#elif defined(DUK_USE_REFCOUNT32)
+ duk_uint32_t h_refcount;
+#else
+ duk_size_t h_refcount;
+#endif
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t h_next16;
+#else
+ duk_heaphdr *h_next;
+#endif
+
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+ /* refcounting requires direct heap frees, which in turn requires a dual linked heap */
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t h_prev16;
+#else
+ duk_heaphdr *h_prev;
+#endif
+#endif
+
+ /* When DUK_USE_HEAPPTR16 (and DUK_USE_REFCOUNT16) is in use, the
+ * struct won't align nicely to 4 bytes. This 16-bit extra field
+ * is added to make the alignment clean; the field can be used by
+ * heap objects when 16-bit packing is used. This field is now
+ * conditional to DUK_USE_HEAPPTR16 only, but it is intended to be
+ * used with DUK_USE_REFCOUNT16 and DUK_USE_DOUBLE_LINKED_HEAP;
+ * this only matter to low memory environments anyway.
+ */
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t h_extra16;
+#endif
+};
+
+struct duk_heaphdr_string {
+ /* 16 bits would be enough for shared heaphdr flags and duk_hstring
+ * flags. The initial parts of duk_heaphdr_string and duk_heaphdr
+ * must match so changing the flags field size here would be quite
+ * awkward. However, to minimize struct size, we can pack at least
+ * 16 bits of duk_hstring data into the flags field.
+ */
+ duk_uint32_t h_flags;
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+#if defined(DUK_USE_ASSERTIONS)
+ /* When assertions enabled, used by mark-and-sweep for refcount
+ * validation. Largest reasonable type; also detects overflows.
+ */
+ duk_size_t h_assert_refcount;
+#endif
+#if defined(DUK_USE_REFCOUNT16)
+ duk_uint16_t h_refcount;
+ duk_uint16_t h_strextra16; /* round out to 8 bytes */
+#elif defined(DUK_USE_REFCOUNT32)
+ duk_uint32_t h_refcount;
+#else
+ duk_size_t h_refcount;
+#endif
+#else
+ duk_uint16_t h_strextra16;
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+ duk_hstring *h_next;
+ /* No 'h_prev' pointer for strings. */
+};
+
+#define DUK_HEAPHDR_FLAGS_TYPE_MASK 0x00000003UL
+#define DUK_HEAPHDR_FLAGS_FLAG_MASK (~DUK_HEAPHDR_FLAGS_TYPE_MASK)
+
+ /* 2 bits for heap type */
+#define DUK_HEAPHDR_FLAGS_HEAP_START 2 /* 5 heap flags */
+#define DUK_HEAPHDR_FLAGS_USER_START 7 /* 25 user flags */
+
+#define DUK_HEAPHDR_HEAP_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_HEAP_START + (n))
+#define DUK_HEAPHDR_USER_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_USER_START + (n))
+#define DUK_HEAPHDR_HEAP_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_HEAP_START + (n)))
+#define DUK_HEAPHDR_USER_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_USER_START + (n)))
+
+#define DUK_HEAPHDR_FLAG_REACHABLE DUK_HEAPHDR_HEAP_FLAG(0) /* mark-and-sweep: reachable */
+#define DUK_HEAPHDR_FLAG_TEMPROOT DUK_HEAPHDR_HEAP_FLAG(1) /* mark-and-sweep: children not processed */
+#define DUK_HEAPHDR_FLAG_FINALIZABLE DUK_HEAPHDR_HEAP_FLAG(2) /* mark-and-sweep: finalizable (on current pass) */
+#define DUK_HEAPHDR_FLAG_FINALIZED DUK_HEAPHDR_HEAP_FLAG(3) /* mark-and-sweep: finalized (on previous pass) */
+#define DUK_HEAPHDR_FLAG_READONLY DUK_HEAPHDR_HEAP_FLAG(4) /* read-only object, in code section */
+
+#define DUK_HTYPE_MIN 0
+#define DUK_HTYPE_STRING 0
+#define DUK_HTYPE_OBJECT 1
+#define DUK_HTYPE_BUFFER 2
+#define DUK_HTYPE_MAX 2
+
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HEAPHDR_GET_NEXT(heap,h) \
+ ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_next16))
+#define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \
+ (h)->h_next16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) val); \
+ } while (0)
+#else
+#define DUK_HEAPHDR_GET_NEXT(heap,h) ((h)->h_next)
+#define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \
+ (h)->h_next = (val); \
+ } while (0)
+#endif
+
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HEAPHDR_GET_PREV(heap,h) \
+ ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_prev16))
+#define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \
+ (h)->h_prev16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (val)); \
+ } while (0)
+#else
+#define DUK_HEAPHDR_GET_PREV(heap,h) ((h)->h_prev)
+#define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \
+ (h)->h_prev = (val); \
+ } while (0)
+#endif
+#endif
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+#define DUK_HEAPHDR_GET_REFCOUNT(h) ((h)->h_refcount)
+#define DUK_HEAPHDR_SET_REFCOUNT(h,val) do { \
+ (h)->h_refcount = (val); \
+ DUK_ASSERT((h)->h_refcount == (val)); /* No truncation. */ \
+ } while (0)
+#define DUK_HEAPHDR_PREINC_REFCOUNT(h) (++(h)->h_refcount) /* result: updated refcount */
+#define DUK_HEAPHDR_PREDEC_REFCOUNT(h) (--(h)->h_refcount) /* result: updated refcount */
+#else
+/* refcount macros not defined without refcounting, caller must #if defined() now */
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+/*
+ * Note: type is treated as a field separate from flags, so some masking is
+ * involved in the macros below.
+ */
+
+#define DUK_HEAPHDR_GET_FLAGS_RAW(h) ((h)->h_flags)
+#define DUK_HEAPHDR_SET_FLAGS_RAW(h,val) do { \
+ (h)->h_flags = (val); } \
+ }
+#define DUK_HEAPHDR_GET_FLAGS(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_FLAG_MASK)
+#define DUK_HEAPHDR_SET_FLAGS(h,val) do { \
+ (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) | (val); \
+ } while (0)
+#define DUK_HEAPHDR_GET_TYPE(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_TYPE_MASK)
+#define DUK_HEAPHDR_SET_TYPE(h,val) do { \
+ (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_TYPE_MASK)) | (val); \
+ } while (0)
+
+/* Comparison for type >= DUK_HTYPE_MIN skipped; because DUK_HTYPE_MIN is zero
+ * and the comparison is unsigned, it's always true and generates warnings.
+ */
+#define DUK_HEAPHDR_HTYPE_VALID(h) ( \
+ DUK_HEAPHDR_GET_TYPE((h)) <= DUK_HTYPE_MAX \
+ )
+
+#define DUK_HEAPHDR_SET_TYPE_AND_FLAGS(h,tval,fval) do { \
+ (h)->h_flags = ((tval) & DUK_HEAPHDR_FLAGS_TYPE_MASK) | \
+ ((fval) & DUK_HEAPHDR_FLAGS_FLAG_MASK); \
+ } while (0)
+
+#define DUK_HEAPHDR_SET_FLAG_BITS(h,bits) do { \
+ DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \
+ (h)->h_flags |= (bits); \
+ } while (0)
+
+#define DUK_HEAPHDR_CLEAR_FLAG_BITS(h,bits) do { \
+ DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \
+ (h)->h_flags &= ~((bits)); \
+ } while (0)
+
+#define DUK_HEAPHDR_CHECK_FLAG_BITS(h,bits) (((h)->h_flags & (bits)) != 0)
+
+#define DUK_HEAPHDR_SET_REACHABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)
+#define DUK_HEAPHDR_CLEAR_REACHABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)
+#define DUK_HEAPHDR_HAS_REACHABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)
+
+#define DUK_HEAPHDR_SET_TEMPROOT(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)
+#define DUK_HEAPHDR_CLEAR_TEMPROOT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)
+#define DUK_HEAPHDR_HAS_TEMPROOT(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)
+
+#define DUK_HEAPHDR_SET_FINALIZABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)
+#define DUK_HEAPHDR_CLEAR_FINALIZABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)
+#define DUK_HEAPHDR_HAS_FINALIZABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)
+
+#define DUK_HEAPHDR_SET_FINALIZED(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)
+#define DUK_HEAPHDR_CLEAR_FINALIZED(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)
+#define DUK_HEAPHDR_HAS_FINALIZED(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)
+
+#define DUK_HEAPHDR_SET_READONLY(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)
+#define DUK_HEAPHDR_CLEAR_READONLY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)
+#define DUK_HEAPHDR_HAS_READONLY(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)
+
+/* get or set a range of flags; m=first bit number, n=number of bits */
+#define DUK_HEAPHDR_GET_FLAG_RANGE(h,m,n) (((h)->h_flags >> (m)) & ((1UL << (n)) - 1UL))
+
+#define DUK_HEAPHDR_SET_FLAG_RANGE(h,m,n,v) do { \
+ (h)->h_flags = \
+ ((h)->h_flags & (~(((1UL << (n)) - 1UL) << (m)))) \
+ | ((v) << (m)); \
+ } while (0)
+
+/* init pointer fields to null */
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+#define DUK_HEAPHDR_INIT_NULLS(h) do { \
+ DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \
+ DUK_HEAPHDR_SET_PREV((h), (void *) NULL); \
+ } while (0)
+#else
+#define DUK_HEAPHDR_INIT_NULLS(h) do { \
+ DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \
+ } while (0)
+#endif
+
+#define DUK_HEAPHDR_STRING_INIT_NULLS(h) do { \
+ (h)->h_next = NULL; \
+ } while (0)
+
+/*
+ * Type tests
+ */
+
+/* Take advantage of the fact that for DUK_HTYPE_xxx numbers the lowest bit
+ * is only set for DUK_HTYPE_OBJECT (= 1).
+ */
+#if 0
+#define DUK_HEAPHDR_IS_OBJECT(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_OBJECT)
+#endif
+#define DUK_HEAPHDR_IS_OBJECT(h) ((h)->h_flags & 0x01UL)
+#define DUK_HEAPHDR_IS_STRING(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_STRING)
+#define DUK_HEAPHDR_IS_BUFFER(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_BUFFER)
+
+/*
+ * Assert helpers
+ */
+
+/* Check that prev/next links are consistent: if e.g. h->prev is != NULL,
+ * h->prev->next should point back to h.
+ */
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_ASSERTIONS)
+#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do { \
+ if ((h) != NULL) { \
+ duk_heaphdr *h__prev, *h__next; \
+ h__prev = DUK_HEAPHDR_GET_PREV((heap), (h)); \
+ h__next = DUK_HEAPHDR_GET_NEXT((heap), (h)); \
+ DUK_ASSERT(h__prev == NULL || (DUK_HEAPHDR_GET_NEXT((heap), h__prev) == (h))); \
+ DUK_ASSERT(h__next == NULL || (DUK_HEAPHDR_GET_PREV((heap), h__next) == (h))); \
+ } \
+ } while (0)
+#else
+#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do {} while (0)
+#endif
+
+#define DUK_ASSERT_HEAPHDR_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((h))); \
+ } while (0)
+
+#endif /* DUK_HEAPHDR_H_INCLUDED */
+/* #include duk_refcount.h */
+#line 1 "duk_refcount.h"
+/*
+ * Reference counting helper macros. The macros take a thread argument
+ * and must thus always be executed in a specific thread context. The
+ * thread argument is not really needed anymore: DECREF can operate with
+ * a heap pointer only, and INCREF needs neither.
+ */
+
+#if !defined(DUK_REFCOUNT_H_INCLUDED)
+#define DUK_REFCOUNT_H_INCLUDED
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+
+#if defined(DUK_USE_ROM_OBJECTS)
+/* With ROM objects "needs refcount update" is true when the value is
+ * heap allocated and is not a ROM object.
+ */
+/* XXX: double evaluation for 'tv' argument. */
+#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) \
+ (DUK_TVAL_IS_HEAP_ALLOCATED((tv)) && !DUK_HEAPHDR_HAS_READONLY(DUK_TVAL_GET_HEAPHDR((tv))))
+#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) (!DUK_HEAPHDR_HAS_READONLY((h)))
+#else /* DUK_USE_ROM_OBJECTS */
+/* Without ROM objects "needs refcount update" == is heap allocated. */
+#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) DUK_TVAL_IS_HEAP_ALLOCATED((tv))
+#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 1
+#endif /* DUK_USE_ROM_OBJECTS */
+
+/* Fast variants, inline refcount operations except for refzero handling.
+ * Can be used explicitly when speed is always more important than size.
+ * For a good compiler and a single file build, these are basically the
+ * same as a forced inline.
+ */
+#define DUK_TVAL_INCREF_FAST(thr,tv) do { \
+ duk_tval *duk__tv = (tv); \
+ DUK_ASSERT(duk__tv != NULL); \
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \
+ duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \
+ DUK_ASSERT(duk__h != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
+ DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0); /* No wrapping. */ \
+ } \
+ } while (0)
+#define DUK_TVAL_DECREF_FAST(thr,tv) do { \
+ duk_tval *duk__tv = (tv); \
+ DUK_ASSERT(duk__tv != NULL); \
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \
+ duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \
+ DUK_ASSERT(duk__h != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \
+ duk_heaphdr_refzero((thr), duk__h); \
+ } \
+ } \
+ } while (0)
+#define DUK_TVAL_DECREF_NORZ_FAST(thr,tv) do { \
+ duk_tval *duk__tv = (tv); \
+ DUK_ASSERT(duk__tv != NULL); \
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \
+ duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \
+ DUK_ASSERT(duk__h != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \
+ duk_heaphdr_refzero_norz((thr), duk__h); \
+ } \
+ } \
+ } while (0)
+#define DUK_HEAPHDR_INCREF_FAST(thr,h) do { \
+ duk_heaphdr *duk__h = (duk_heaphdr *) (h); \
+ DUK_ASSERT(duk__h != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
+ if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \
+ DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0); /* No wrapping. */ \
+ } \
+ } while (0)
+#define DUK_HEAPHDR_DECREF_FAST_RAW(thr,h,rzcall,rzcast) do { \
+ duk_heaphdr *duk__h = (duk_heaphdr *) (h); \
+ DUK_ASSERT(duk__h != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \
+ if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \
+ (rzcall)((thr), (rzcast) duk__h); \
+ } \
+ } \
+ } while (0)
+#define DUK_HEAPHDR_DECREF_FAST(thr,h) \
+ DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *)
+#define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) \
+ DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *)
+
+/* Slow variants, call to a helper to reduce code size.
+ * Can be used explicitly when size is always more important than speed.
+ */
+#define DUK_TVAL_INCREF_SLOW(thr,tv) do { duk_tval_incref((tv)); } while (0)
+#define DUK_TVAL_DECREF_SLOW(thr,tv) do { duk_tval_decref((thr), (tv)); } while (0)
+#define DUK_TVAL_DECREF_NORZ_SLOW(thr,tv) do { duk_tval_decref_norz((thr), (tv)); } while (0)
+#define DUK_HEAPHDR_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)
+#define DUK_HEAPHDR_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HSTRING_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)
+#define DUK_HSTRING_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HBUFFER_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)
+#define DUK_HBUFFER_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HOBJECT_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)
+#define DUK_HOBJECT_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)
+#define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)
+
+/* Default variants. Selection depends on speed/size preference.
+ * Concretely: with gcc 4.8.1 -Os x64 the difference in final binary
+ * is about +1kB for _FAST variants.
+ */
+#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
+/* XXX: It would be nice to specialize for specific duk_hobject subtypes
+ * but current refzero queue handling prevents that.
+ */
+#define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_FAST((thr),(tv))
+#define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_FAST((thr),(tv))
+#define DUK_TVAL_DECREF_NORZ(thr,tv) DUK_TVAL_DECREF_NORZ_FAST((thr),(tv))
+#define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_FAST((thr),(h))
+#define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *)
+#define DUK_HEAPHDR_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *)
+#define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
+#define DUK_HSTRING_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *)
+#define DUK_HSTRING_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *) /* no 'norz' variant */
+#define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
+#define DUK_HOBJECT_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)
+#define DUK_HOBJECT_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)
+#define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
+#define DUK_HBUFFER_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *)
+#define DUK_HBUFFER_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *) /* no 'norz' variant */
+#define DUK_HCOMPFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HCOMPFUNC_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)
+#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)
+#define DUK_HNATFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HNATFUNC_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)
+#define DUK_HNATFUNC_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)
+#define DUK_HBUFOBJ_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HBUFOBJ_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)
+#define DUK_HBUFOBJ_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)
+#define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HTHREAD_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)
+#define DUK_HTHREAD_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)
+#else
+#define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_SLOW((thr),(tv))
+#define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_SLOW((thr),(tv))
+#define DUK_TVAL_DECREF_NORZ(thr,tv) DUK_TVAL_DECREF_NORZ_SLOW((thr),(tv))
+#define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_SLOW((thr),(h))
+#define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_SLOW((thr),(h))
+#define DUK_HEAPHDR_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_NORZ_SLOW((thr),(h))
+#define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
+#define DUK_HSTRING_DECREF(thr,h) DUK_HSTRING_DECREF_SLOW((thr),(h))
+#define DUK_HSTRING_DECREF_NORZ(thr,h) DUK_HSTRING_DECREF_NORZ_SLOW((thr),(h))
+#define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
+#define DUK_HOBJECT_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(h))
+#define DUK_HOBJECT_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(h))
+#define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
+#define DUK_HBUFFER_DECREF(thr,h) DUK_HBUFFER_DECREF_SLOW((thr),(h))
+#define DUK_HBUFFER_DECREF_NORZ(thr,h) DUK_HBUFFER_DECREF_NORZ_SLOW((thr),(h))
+#define DUK_HCOMPFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HCOMPFUNC_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HNATFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HNATFUNC_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HNATFUNC_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HBUFOBJ_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HBUFOBJ_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HBUFOB_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
+#define DUK_HTHREAD_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)
+#define DUK_HTHREAD_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)
+#endif
+
+/* Convenience for some situations; the above macros don't allow NULLs
+ * for performance reasons. Macros cover only actually needed cases.
+ */
+#define DUK_HEAPHDR_INCREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HEAPHDR_INCREF((thr), (duk_heaphdr *) (h)); \
+ } \
+ } while (0)
+#define DUK_HEAPHDR_DECREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HEAPHDR_DECREF((thr), (duk_heaphdr *) (h)); \
+ } \
+ } while (0)
+#define DUK_HEAPHDR_DECREF_NORZ_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HEAPHDR_DECREF_NORZ((thr), (duk_heaphdr *) (h)); \
+ } \
+ } while (0)
+#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HOBJECT_INCREF((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HOBJECT_DECREF((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HOBJECT_DECREF_NORZ((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HBUFFER_INCREF((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HBUFFER_DECREF((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HBUFFER_DECREF_NORZ((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HTHREAD_INCREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HTHREAD_INCREF((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HTHREAD_DECREF_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HTHREAD_DECREF((thr), (h)); \
+ } \
+ } while (0)
+#define DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr,h) do { \
+ if ((h) != NULL) { \
+ DUK_HTHREAD_DECREF_NORZ((thr), (h)); \
+ } \
+ } while (0)
+
+/* Called after one or more DECREF NORZ calls to handle pending side effects.
+ * At present DECREF NORZ does freeing inline but doesn't execute finalizers,
+ * so these macros check for pending finalizers and execute them. The FAST
+ * variant is performance critical.
+ */
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+#define DUK_REFZERO_CHECK_FAST(thr) do { \
+ duk_refzero_check_fast((thr)); \
+ } while (0)
+#define DUK_REFZERO_CHECK_SLOW(thr) do { \
+ duk_refzero_check_slow((thr)); \
+ } while (0)
+#else /* DUK_USE_FINALIZER_SUPPORT */
+#define DUK_REFZERO_CHECK_FAST(thr) do { } while (0)
+#define DUK_REFZERO_CHECK_SLOW(thr) do { } while (0)
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+/*
+ * Macros to set a duk_tval and update refcount of the target (decref the
+ * old value and incref the new value if necessary). This is both performance
+ * and footprint critical; any changes made should be measured for size/speed.
+ */
+
+#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_UNDEFINED(tv__dst); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_UNDEFINED(tv__dst); \
+ DUK_TVAL_DECREF_NORZ((thr), &tv__tmp); \
+ } while (0)
+
+#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_UNUSED(tv__dst); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_NULL(tv__dst); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_NAN(tv__dst); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_I48(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_I32(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_U32(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+#else
+#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \
+ DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval))
+#endif /* DUK_USE_FASTINT */
+
+#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_STRING(tv__dst, (newval)); \
+ DUK_HSTRING_INCREF((thr), (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \
+ DUK_HOBJECT_INCREF((thr), (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \
+ DUK_HBUFFER_INCREF((thr), (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_POINTER(tv__dst, (newval)); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+/* DUK_TVAL_SET_TVAL_UPDREF() is used a lot in executor, property lookups,
+ * etc, so it's very important for performance. Measure when changing.
+ *
+ * NOTE: the source and destination duk_tval pointers may be the same, and
+ * the macros MUST deal with that correctly.
+ */
+
+/* Original idiom used, minimal code size. */
+#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \
+ duk_tval *tv__dst, *tv__src; duk_tval tv__tmp; \
+ tv__dst = (tvptr_dst); tv__src = (tvptr_src); \
+ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
+ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
+ DUK_TVAL_INCREF((thr), tv__src); \
+ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \
+ } while (0)
+
+/* Faster alternative: avoid making a temporary copy of tvptr_dst and use
+ * fast incref/decref macros.
+ */
+#define DUK_TVAL_SET_TVAL_UPDREF_ALT1(thr,tvptr_dst,tvptr_src) do { \
+ duk_tval *tv__dst, *tv__src; duk_heaphdr *h__obj; \
+ tv__dst = (tvptr_dst); tv__src = (tvptr_src); \
+ DUK_TVAL_INCREF_FAST((thr), tv__src); \
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv__dst)) { \
+ h__obj = DUK_TVAL_GET_HEAPHDR(tv__dst); \
+ DUK_ASSERT(h__obj != NULL); \
+ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
+ DUK_HEAPHDR_DECREF_FAST((thr), h__obj); /* side effects */ \
+ } else { \
+ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
+ } \
+ } while (0)
+
+/* XXX: no optimized variants yet */
+#define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0
+#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0
+#define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0
+#define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0
+#define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0
+#define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0
+#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0
+#define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0
+#define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_I48_UPDREF_ALT0
+#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_I32_UPDREF_ALT0
+#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_U32_UPDREF_ALT0
+#else
+#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF /* XXX: fast int-to-double */
+#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
+#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
+#endif /* DUK_USE_FASTINT */
+#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_I48_UPDREF /* convenience */
+#define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0
+#define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0
+#define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0
+#define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0
+#define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0
+
+#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
+/* Optimized for speed. */
+#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT1
+#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT1
+#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0
+#else
+/* Optimized for size. */
+#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0
+#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0
+#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0
+#endif
+
+#else /* DUK_USE_REFERENCE_COUNTING */
+
+#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) 0
+#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 0
+
+#define DUK_TVAL_INCREF_FAST(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_DECREF_FAST(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_DECREF_NORZ_FAST(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_INCREF_SLOW(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_DECREF_SLOW(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_DECREF_NORZ_SLOW(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_INCREF(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_DECREF(thr,v) do {} while (0) /* nop */
+#define DUK_TVAL_DECREF_NORZ(thr,v) do {} while (0) /* nop */
+#define DUK_HEAPHDR_INCREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_DECREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_INCREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_DECREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HEAPHDR_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_INCREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_DECREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_INCREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_DECREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HSTRING_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_INCREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_INCREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_INCREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_INCREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+
+#define DUK_HCOMPFUNC_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HCOMPFUNC_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HNATFUNC_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HNATFUNC_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HNATFUNC_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFOBJ_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFOBJ_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFOBJ_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HTHREAD_INCREF(thr,h) do {} while (0) /* nop */
+#define DUK_HTHREAD_DECREF(thr,h) do {} while (0) /* nop */
+#define DUK_HTHREAD_DECREF_NORZ(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do {} while (0) /* nop */
+#define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do {} while (0) /* nop */
+#define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do {} while (0) /* nop */
+
+#define DUK_REFZERO_CHECK_FAST(thr) do {} while (0) /* nop */
+#define DUK_REFZERO_CHECK_SLOW(thr) do {} while (0) /* nop */
+
+#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_UNDEFINED(tv__dst); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_UNUSED(tv__dst); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_NULL(tv__dst); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_NAN(tv__dst); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_I48(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_I32(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_U32(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+#else
+#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \
+ DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval))
+#endif /* DUK_USE_FASTINT */
+
+#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_STRING(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
+ duk_tval *tv__dst; tv__dst = (tvptr_dst); \
+ DUK_TVAL_SET_POINTER(tv__dst, (newval)); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \
+ duk_tval *tv__dst, *tv__src; \
+ tv__dst = (tvptr_dst); tv__src = (tvptr_src); \
+ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
+ DUK_UNREF((thr)); \
+ } while (0)
+
+#define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0
+#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0
+#define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0
+#define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0
+#define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0
+#define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0
+#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0
+#define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0
+#define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0
+#if defined(DUK_USE_FASTINT)
+#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_I48_UPDREF_ALT0
+#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_I32_UPDREF_ALT0
+#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_U32_UPDREF_ALT0
+#else
+#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF /* XXX: fast-int-to-double */
+#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
+#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
+#endif /* DUK_USE_FASTINT */
+#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_I48_UPDREF /* convenience */
+#define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0
+#define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0
+#define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0
+#define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0
+#define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0
+
+#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0
+#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0
+#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0
+
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+/*
+ * Some convenience macros that don't have optimized implementations now.
+ */
+
+#define DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr,tv_dst,tv_src) do { \
+ duk_hthread *duk__thr = (thr); \
+ duk_tval *duk__dst = (tv_dst); \
+ duk_tval *duk__src = (tv_src); \
+ DUK_UNREF(duk__thr); \
+ DUK_TVAL_DECREF_NORZ(thr, duk__dst); \
+ DUK_TVAL_SET_TVAL(duk__dst, duk__src); \
+ DUK_TVAL_INCREF(thr, duk__dst); \
+ } while (0)
+
+#define DUK_TVAL_SET_U32_UPDREF_NORZ(thr,tv_dst,val) do { \
+ duk_hthread *duk__thr = (thr); \
+ duk_tval *duk__dst = (tv_dst); \
+ duk_uint32_t duk__val = (duk_uint32_t) (val); \
+ DUK_UNREF(duk__thr); \
+ DUK_TVAL_DECREF_NORZ(thr, duk__dst); \
+ DUK_TVAL_SET_U32(duk__dst, duk__val); \
+ } while (0)
+
+/*
+ * Prototypes
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL_DECL void duk_refzero_check_slow(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_refzero_check_fast(duk_hthread *thr);
+#endif
+DUK_INTERNAL_DECL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr);
+DUK_INTERNAL_DECL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h);
+#if 0 /* Not needed: fast path handles inline; slow path uses duk_heaphdr_decref() which is needed anyway. */
+DUK_INTERNAL_DECL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h);
+DUK_INTERNAL_DECL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h);
+DUK_INTERNAL_DECL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h);
+DUK_INTERNAL_DECL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h);
+DUK_INTERNAL_DECL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h);
+DUK_INTERNAL_DECL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h);
+#endif
+DUK_INTERNAL_DECL void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h);
+DUK_INTERNAL_DECL void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h);
+#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
+DUK_INTERNAL_DECL void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h); /* no 'norz' variant */
+DUK_INTERNAL_DECL void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h); /* no 'norz' variant */
+DUK_INTERNAL_DECL void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h);
+DUK_INTERNAL_DECL void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h);
+#else
+DUK_INTERNAL_DECL void duk_tval_incref(duk_tval *tv);
+DUK_INTERNAL_DECL void duk_tval_decref(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL void duk_heaphdr_incref(duk_heaphdr *h);
+DUK_INTERNAL_DECL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h);
+DUK_INTERNAL_DECL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h);
+#endif
+#else /* DUK_USE_REFERENCE_COUNTING */
+/* no refcounting */
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+#endif /* DUK_REFCOUNT_H_INCLUDED */
+/* #include duk_api_internal.h */
+#line 1 "duk_api_internal.h"
+/*
+ * Internal API calls which have (stack and other) semantics similar
+ * to the public API.
+ */
+
+#if !defined(DUK_API_INTERNAL_H_INCLUDED)
+#define DUK_API_INTERNAL_H_INCLUDED
+
+#define DUK_INTERNAL_SYMBOL(x) ("\x82" x)
+
+/* duk_push_sprintf constants */
+#define DUK_PUSH_SPRINTF_INITIAL_SIZE 256L
+#define DUK_PUSH_SPRINTF_SANITY_LIMIT (1L * 1024L * 1024L * 1024L)
+
+/* Flag ORed to err_code to indicate __FILE__ / __LINE__ is not
+ * blamed as source of error for error fileName / lineNumber.
+ */
+#define DUK_ERRCODE_FLAG_NOBLAME_FILELINE (1L << 24)
+
+/* Current convention is to use duk_size_t for value stack sizes and global indices,
+ * and duk_idx_t for local frame indices.
+ */
+DUK_INTERNAL_DECL void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes);
+DUK_INTERNAL_DECL duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes);
+DUK_INTERNAL_DECL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug);
+
+DUK_INTERNAL_DECL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count);
+
+DUK_INTERNAL_DECL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count);
+
+DUK_INTERNAL_DECL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start);
+
+DUK_INTERNAL_DECL void duk_dup_0(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_dup_1(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_dup_2(duk_hthread *thr);
+/* duk_dup_m1() would be same as duk_dup_top() */
+DUK_INTERNAL_DECL void duk_dup_m2(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_dup_m3(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_dup_m4(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL void duk_remove_m2(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count);
+DUK_INTERNAL_DECL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count);
+
+DUK_INTERNAL_DECL duk_int_t duk_get_type_tval(duk_tval *tv);
+DUK_INTERNAL_DECL duk_uint_t duk_get_type_mask_tval(duk_tval *tv);
+
+#if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS)
+DUK_INTERNAL_DECL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx);
+#endif
+DUK_INTERNAL_DECL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL void duk_push_tval(duk_hthread *thr, duk_tval *tv);
+
+/* Push the current 'this' binding; throw TypeError if binding is not object
+ * coercible (CheckObjectCoercible).
+ */
+DUK_INTERNAL_DECL void duk_push_this_check_object_coercible(duk_hthread *thr);
+
+/* duk_push_this() + CheckObjectCoercible() + duk_to_object() */
+DUK_INTERNAL_DECL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr);
+
+/* duk_push_this() + CheckObjectCoercible() + duk_to_string() */
+DUK_INTERNAL_DECL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr);
+
+DUK_INTERNAL_DECL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i);
+
+/* Get a borrowed duk_tval pointer to the current 'this' binding. Caller must
+ * make sure there's an active callstack entry. Note that the returned pointer
+ * is unstable with regards to side effects.
+ */
+DUK_INTERNAL_DECL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr);
+
+/* XXX: add fastint support? */
+#define duk_push_u64(thr,val) \
+ duk_push_number((thr), (duk_double_t) (val))
+#define duk_push_i64(thr,val) \
+ duk_push_number((thr), (duk_double_t) (val))
+
+/* duk_push_(u)int() is guaranteed to support at least (un)signed 32-bit range */
+#define duk_push_u32(thr,val) \
+ duk_push_uint((thr), (duk_uint_t) (val))
+#define duk_push_i32(thr,val) \
+ duk_push_int((thr), (duk_int_t) (val))
+
+/* sometimes stack and array indices need to go on the stack */
+#define duk_push_idx(thr,val) \
+ duk_push_int((thr), (duk_int_t) (val))
+#define duk_push_uarridx(thr,val) \
+ duk_push_uint((thr), (duk_uint_t) (val))
+#define duk_push_size_t(thr,val) \
+ duk_push_uint((thr), (duk_uint_t) (val)) /* XXX: assumed to fit for now */
+
+DUK_INTERNAL_DECL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv);
+
+DUK_INTERNAL_DECL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len, duk_bool_t throw_flag, duk_bool_t *out_isbuffer);
+
+DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum);
+
+DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask);
+DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask);
+DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask);
+#define duk_require_hobject_promote_lfunc(thr,idx) \
+ duk_require_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC)
+#define duk_get_hobject_promote_lfunc(thr,idx) \
+ duk_get_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC)
+
+#if 0 /*unused*/
+DUK_INTERNAL_DECL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx);
+#endif
+
+DUK_INTERNAL_DECL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv);
+
+DUK_INTERNAL_DECL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hstring *duk_to_hstring_m1(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_double_t duk_to_number_m1(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_double_t duk_to_number_m2(duk_hthread *thr);
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT) /* only needed by debugger for now */
+DUK_INTERNAL_DECL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx);
+#endif
+DUK_INTERNAL_DECL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv);
+
+DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped); /* out_clamped=NULL, RangeError if outside range */
+DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval);
+DUK_INTERNAL_DECL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL_DECL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx);
+#endif
+DUK_INTERNAL_DECL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len);
+DUK_INTERNAL_DECL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx);
+
+DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum);
+
+DUK_INTERNAL_DECL void duk_push_hstring(duk_hthread *thr, duk_hstring *h);
+DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx);
+DUK_INTERNAL_DECL void duk_push_hstring_empty(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_push_hobject(duk_hthread *thr, duk_hobject *h);
+DUK_INTERNAL_DECL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h);
+#define duk_push_hthread(thr,h) \
+ duk_push_hobject((thr), (duk_hobject *) (h))
+#define duk_push_hnatfunc(thr,h) \
+ duk_push_hobject((thr), (duk_hobject *) (h))
+DUK_INTERNAL_DECL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx);
+DUK_INTERNAL_DECL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx);
+DUK_INTERNAL_DECL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto);
+DUK_INTERNAL_DECL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs);
+DUK_INTERNAL_DECL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs);
+
+/* XXX: duk_push_harray() and duk_push_hcompfunc() are inconsistent with
+ * duk_push_hobject() etc which don't create a new value.
+ */
+DUK_INTERNAL_DECL duk_harray *duk_push_harray(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size);
+DUK_INTERNAL_DECL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size);
+
+DUK_INTERNAL_DECL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz);
+DUK_INTERNAL_DECL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags);
+DUK_INTERNAL_DECL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv);
+#if 0 /* not used yet */
+DUK_INTERNAL_DECL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h);
+#endif
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL_DECL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx);
+#endif
+
+DUK_INTERNAL_DECL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len);
+DUK_INTERNAL_DECL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len);
+
+DUK_INTERNAL_DECL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv);
+
+/* The duk_xxx_prop_stridx_short() variants expect their arguments to be short
+ * enough to be packed into a single 32-bit integer argument. Argument limits
+ * vary per call; typically 16 bits are assigned to the signed value stack index
+ * and the stridx. In practice these work well for footprint with constant
+ * arguments and such call sites are also easiest to verify to be correct.
+ */
+
+DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [val] */
+DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);
+#define duk_get_prop_stridx_short(thr,obj_idx,stridx) \
+ (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \
+ DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \
+ duk_get_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))
+DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop); /* [] -> [] */
+
+DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [val] -> [] */
+DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);
+#define duk_put_prop_stridx_short(thr,obj_idx,stridx) \
+ (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \
+ DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \
+ duk_put_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))
+
+DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */
+#if 0 /* Too few call sites to be useful. */
+DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);
+#define duk_del_prop_stridx_short(thr,obj_idx,stridx) \
+ (DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \
+ DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \
+ duk_del_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))
+#endif
+#define duk_del_prop_stridx_short(thr,obj_idx,stridx) \
+ duk_del_prop_stridx((thr), (obj_idx), (stridx))
+
+DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */
+#if 0 /* Too few call sites to be useful. */
+DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);
+#define duk_has_prop_stridx_short(thr,obj_idx,stridx) \
+ (DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \
+ DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \
+ duk_has_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))
+#endif
+#define duk_has_prop_stridx_short(thr,obj_idx,stridx) \
+ duk_has_prop_stridx((thr), (obj_idx), (stridx))
+
+DUK_INTERNAL_DECL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags); /* [key val] -> [] */
+
+DUK_INTERNAL_DECL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags); /* [val] -> [] */
+
+/* XXX: Because stridx and desc_flags have a limited range, this call could
+ * always pack stridx and desc_flags into a single argument.
+ */
+DUK_INTERNAL_DECL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags); /* [val] -> [] */
+DUK_INTERNAL_DECL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);
+#define duk_xdef_prop_stridx_short(thr,obj_idx,stridx,desc_flags) \
+ (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x80L && (duk_int_t) (obj_idx) <= 0x7fL), \
+ DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \
+ DUK_ASSERT_EXPR((duk_int_t) (desc_flags) >= 0 && (duk_int_t) (desc_flags) <= 0xffL), \
+ duk_xdef_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 24) + (((duk_uint_t) (stridx)) << 8) + (duk_uint_t) (desc_flags)))
+
+#define duk_xdef_prop_wec(thr,obj_idx) \
+ duk_xdef_prop((thr), (obj_idx), DUK_PROPDESC_FLAGS_WEC)
+#define duk_xdef_prop_index_wec(thr,obj_idx,arr_idx) \
+ duk_xdef_prop_index((thr), (obj_idx), (arr_idx), DUK_PROPDESC_FLAGS_WEC)
+#define duk_xdef_prop_stridx_wec(thr,obj_idx,stridx) \
+ duk_xdef_prop_stridx((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC)
+#define duk_xdef_prop_stridx_short_wec(thr,obj_idx,stridx) \
+ duk_xdef_prop_stridx_short((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC)
+
+#if 0 /*unused*/
+DUK_INTERNAL_DECL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags); /* [] -> [] */
+#endif
+
+DUK_INTERNAL_DECL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */
+
+DUK_INTERNAL_DECL void duk_pack(duk_hthread *thr, duk_idx_t count);
+DUK_INTERNAL_DECL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx);
+#if 0
+DUK_INTERNAL_DECL void duk_unpack(duk_hthread *thr);
+#endif
+
+DUK_INTERNAL_DECL void duk_require_constructor_call(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h);
+
+DUK_INTERNAL_DECL void duk_resolve_nonbound_function(duk_hthread *thr);
+
+DUK_INTERNAL_DECL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top);
+DUK_INTERNAL_DECL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count);
+DUK_INTERNAL_DECL void duk_pop_unsafe(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_pop_2_unsafe(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_pop_3_unsafe(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count);
+DUK_INTERNAL_DECL void duk_pop_nodecref_unsafe(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_pop_2_nodecref_unsafe(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_pop_3_nodecref_unsafe(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_pop_undefined(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_compact_m1(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze);
+
+DUK_INTERNAL_DECL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx);
+DUK_INTERNAL_DECL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count);
+
+DUK_INTERNAL_DECL void duk_concat_2(duk_hthread *thr);
+
+DUK_INTERNAL_DECL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags);
+
+/* Raw internal valstack access macros: access is unsafe so call site
+ * must have a guarantee that the index is valid. When that is the case,
+ * using these macro results in faster and smaller code than duk_get_tval().
+ * Both 'ctx' and 'idx' are evaluted multiple times, but only for asserts.
+ */
+#define DUK_ASSERT_VALID_NEGIDX(thr,idx) \
+ (DUK_ASSERT_EXPR((duk_int_t) (idx) < 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx))))
+#define DUK_ASSERT_VALID_POSIDX(thr,idx) \
+ (DUK_ASSERT_EXPR((duk_int_t) (idx) >= 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx))))
+#define DUK_GET_TVAL_NEGIDX(thr,idx) \
+ (DUK_ASSERT_VALID_NEGIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_top + (idx))
+#define DUK_GET_TVAL_POSIDX(thr,idx) \
+ (DUK_ASSERT_VALID_POSIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_bottom + (idx))
+#define DUK_GET_HOBJECT_NEGIDX(thr,idx) \
+ (DUK_ASSERT_VALID_NEGIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_top + (idx)))
+#define DUK_GET_HOBJECT_POSIDX(thr,idx) \
+ (DUK_ASSERT_VALID_POSIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_bottom + (idx)))
+
+#define DUK_GET_THIS_TVAL_PTR(thr) \
+ (DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \
+ (thr)->valstack_bottom - 1)
+
+DUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr);
+
+#endif /* DUK_API_INTERNAL_H_INCLUDED */
+/* #include duk_hstring.h */
+#line 1 "duk_hstring.h"
+/*
+ * Heap string representation.
+ *
+ * Strings are byte sequences ordinarily stored in extended UTF-8 format,
+ * allowing values larger than the official UTF-8 range (used internally)
+ * and also allowing UTF-8 encoding of surrogate pairs (CESU-8 format).
+ * Strings may also be invalid UTF-8 altogether which is the case e.g. with
+ * strings used as internal property names and raw buffers converted to
+ * strings. In such cases the 'clen' field contains an inaccurate value.
+ *
+ * Ecmascript requires support for 32-bit long strings. However, since each
+ * 16-bit codepoint can take 3 bytes in CESU-8, this representation can only
+ * support about 1.4G codepoint long strings in extreme cases. This is not
+ * really a practical issue.
+ */
+
+#if !defined(DUK_HSTRING_H_INCLUDED)
+#define DUK_HSTRING_H_INCLUDED
+
+/* Impose a maximum string length for now. Restricted artificially to
+ * ensure adding a heap header length won't overflow size_t. The limit
+ * should be synchronized with DUK_HBUFFER_MAX_BYTELEN.
+ *
+ * E5.1 makes provisions to support strings longer than 4G characters.
+ * This limit should be eliminated on 64-bit platforms (and increased
+ * closer to maximum support on 32-bit platforms).
+ */
+
+#if defined(DUK_USE_STRLEN16)
+#define DUK_HSTRING_MAX_BYTELEN (0x0000ffffUL)
+#else
+#define DUK_HSTRING_MAX_BYTELEN (0x7fffffffUL)
+#endif
+
+/* XXX: could add flags for "is valid CESU-8" (Ecmascript compatible strings),
+ * "is valid UTF-8", "is valid extended UTF-8" (internal strings are not,
+ * regexp bytecode is), and "contains non-BMP characters". These are not
+ * needed right now.
+ */
+
+#define DUK_HSTRING_FLAG_ASCII DUK_HEAPHDR_USER_FLAG(0) /* string is ASCII, clen == blen */
+#define DUK_HSTRING_FLAG_ARRIDX DUK_HEAPHDR_USER_FLAG(1) /* string is a valid array index */
+#define DUK_HSTRING_FLAG_SYMBOL DUK_HEAPHDR_USER_FLAG(2) /* string is a symbol (invalid utf-8) */
+#define DUK_HSTRING_FLAG_HIDDEN DUK_HEAPHDR_USER_FLAG(3) /* string is a hidden symbol (implies symbol, Duktape 1.x internal string) */
+#define DUK_HSTRING_FLAG_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(4) /* string is a reserved word (non-strict) */
+#define DUK_HSTRING_FLAG_STRICT_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(5) /* string is a reserved word (strict) */
+#define DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS DUK_HEAPHDR_USER_FLAG(6) /* string is 'eval' or 'arguments' */
+#define DUK_HSTRING_FLAG_EXTDATA DUK_HEAPHDR_USER_FLAG(7) /* string data is external (duk_hstring_external) */
+
+#define DUK_HSTRING_HAS_ASCII(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)
+#define DUK_HSTRING_HAS_ARRIDX(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)
+#define DUK_HSTRING_HAS_SYMBOL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL)
+#define DUK_HSTRING_HAS_HIDDEN(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN)
+#define DUK_HSTRING_HAS_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)
+#define DUK_HSTRING_HAS_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)
+#define DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)
+#define DUK_HSTRING_HAS_EXTDATA(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)
+
+#define DUK_HSTRING_SET_ASCII(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)
+#define DUK_HSTRING_SET_ARRIDX(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)
+#define DUK_HSTRING_SET_SYMBOL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL)
+#define DUK_HSTRING_SET_HIDDEN(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN)
+#define DUK_HSTRING_SET_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)
+#define DUK_HSTRING_SET_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)
+#define DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)
+#define DUK_HSTRING_SET_EXTDATA(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)
+
+#define DUK_HSTRING_CLEAR_ASCII(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)
+#define DUK_HSTRING_CLEAR_ARRIDX(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)
+#define DUK_HSTRING_CLEAR_SYMBOL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL)
+#define DUK_HSTRING_CLEAR_HIDDEN(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN)
+#define DUK_HSTRING_CLEAR_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)
+#define DUK_HSTRING_CLEAR_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)
+#define DUK_HSTRING_CLEAR_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)
+#define DUK_HSTRING_CLEAR_EXTDATA(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)
+
+#if 0 /* Slightly smaller code without explicit flag, but explicit flag
+ * is very useful when 'clen' is dropped.
+ */
+#define DUK_HSTRING_IS_ASCII(x) (DUK_HSTRING_GET_BYTELEN((x)) == DUK_HSTRING_GET_CHARLEN((x)))
+#endif
+#define DUK_HSTRING_IS_ASCII(x) DUK_HSTRING_HAS_ASCII((x)) /* lazily set! */
+#define DUK_HSTRING_IS_EMPTY(x) (DUK_HSTRING_GET_BYTELEN((x)) == 0)
+
+#if defined(DUK_USE_STRHASH16)
+#define DUK_HSTRING_GET_HASH(x) ((x)->hdr.h_flags >> 16)
+#define DUK_HSTRING_SET_HASH(x,v) do { \
+ (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | ((v) << 16); \
+ } while (0)
+#else
+#define DUK_HSTRING_GET_HASH(x) ((x)->hash)
+#define DUK_HSTRING_SET_HASH(x,v) do { \
+ (x)->hash = (v); \
+ } while (0)
+#endif
+
+#if defined(DUK_USE_STRLEN16)
+#define DUK_HSTRING_GET_BYTELEN(x) ((x)->hdr.h_strextra16)
+#define DUK_HSTRING_SET_BYTELEN(x,v) do { \
+ (x)->hdr.h_strextra16 = (v); \
+ } while (0)
+#if defined(DUK_USE_HSTRING_CLEN)
+#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x))
+#define DUK_HSTRING_SET_CHARLEN(x,v) do { \
+ (x)->clen16 = (v); \
+ } while (0)
+#else
+#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x))
+#define DUK_HSTRING_SET_CHARLEN(x,v) do { \
+ DUK_ASSERT(0); /* should never be called */ \
+ } while (0)
+#endif
+#else
+#define DUK_HSTRING_GET_BYTELEN(x) ((x)->blen)
+#define DUK_HSTRING_SET_BYTELEN(x,v) do { \
+ (x)->blen = (v); \
+ } while (0)
+#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x))
+#define DUK_HSTRING_SET_CHARLEN(x,v) do { \
+ (x)->clen = (v); \
+ } while (0)
+#endif
+
+#if defined(DUK_USE_HSTRING_EXTDATA)
+#define DUK_HSTRING_GET_EXTDATA(x) \
+ ((x)->extdata)
+#define DUK_HSTRING_GET_DATA(x) \
+ (DUK_HSTRING_HAS_EXTDATA((x)) ? \
+ DUK_HSTRING_GET_EXTDATA((const duk_hstring_external *) (x)) : ((const duk_uint8_t *) ((x) + 1)))
+#else
+#define DUK_HSTRING_GET_DATA(x) \
+ ((const duk_uint8_t *) ((x) + 1))
+#endif
+
+#define DUK_HSTRING_GET_DATA_END(x) \
+ (DUK_HSTRING_GET_DATA((x)) + (x)->blen)
+
+/* Marker value; in E5 2^32-1 is not a valid array index (2^32-2 is highest
+ * valid).
+ */
+#define DUK_HSTRING_NO_ARRAY_INDEX (0xffffffffUL)
+
+#if defined(DUK_USE_HSTRING_ARRIDX)
+#define DUK_HSTRING_GET_ARRIDX_FAST(h) ((h)->arridx)
+#define DUK_HSTRING_GET_ARRIDX_SLOW(h) ((h)->arridx)
+#else
+/* Get array index related to string (or return DUK_HSTRING_NO_ARRAY_INDEX);
+ * avoids helper call if string has no array index value.
+ */
+#define DUK_HSTRING_GET_ARRIDX_FAST(h) \
+ (DUK_HSTRING_HAS_ARRIDX((h)) ? duk_js_to_arrayindex_hstring_fast_known((h)) : DUK_HSTRING_NO_ARRAY_INDEX)
+
+/* Slower but more compact variant. */
+#define DUK_HSTRING_GET_ARRIDX_SLOW(h) \
+ (duk_js_to_arrayindex_hstring_fast((h)))
+#endif
+
+/* XXX: these actually fit into duk_hstring */
+#define DUK_SYMBOL_TYPE_HIDDEN 0
+#define DUK_SYMBOL_TYPE_GLOBAL 1
+#define DUK_SYMBOL_TYPE_LOCAL 2
+#define DUK_SYMBOL_TYPE_WELLKNOWN 3
+
+/*
+ * Misc
+ */
+
+struct duk_hstring {
+ /* Smaller heaphdr than for other objects, because strings are held
+ * in string intern table which requires no link pointers. Much of
+ * the 32-bit flags field is unused by flags, so we can stuff a 16-bit
+ * field in there.
+ */
+ duk_heaphdr_string hdr;
+
+ /* String hash. */
+#if defined(DUK_USE_STRHASH16)
+ /* If 16-bit hash is in use, stuff it into duk_heaphdr_string flags. */
+#else
+ duk_uint32_t hash;
+#endif
+
+ /* Precomputed array index (or DUK_HSTRING_NO_ARRAY_INDEX). */
+#if defined(DUK_USE_HSTRING_ARRIDX)
+ duk_uarridx_t arridx;
+#endif
+
+ /* Length in bytes (not counting NUL term). */
+#if defined(DUK_USE_STRLEN16)
+ /* placed in duk_heaphdr_string */
+#else
+ duk_uint32_t blen;
+#endif
+
+ /* Length in codepoints (must be E5 compatible). */
+#if defined(DUK_USE_STRLEN16)
+#if defined(DUK_USE_HSTRING_CLEN)
+ duk_uint16_t clen16;
+#else
+ /* computed live */
+#endif
+#else
+ duk_uint32_t clen;
+#endif
+
+ /*
+ * String data of 'blen+1' bytes follows (+1 for NUL termination
+ * convenience for C API). No alignment needs to be guaranteed
+ * for strings, but fields above should guarantee alignment-by-4
+ * (but not alignment-by-8).
+ */
+};
+
+/* The external string struct is defined even when the feature is inactive. */
+struct duk_hstring_external {
+ duk_hstring str;
+
+ /*
+ * For an external string, the NUL-terminated string data is stored
+ * externally. The user must guarantee that data behind this pointer
+ * doesn't change while it's used.
+ */
+
+ const duk_uint8_t *extdata;
+};
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware);
+DUK_INTERNAL_DECL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr);
+DUK_INTERNAL_DECL duk_size_t duk_hstring_get_charlen(duk_hstring *h);
+#if !defined(DUK_USE_HSTRING_LAZY_CLEN)
+DUK_INTERNAL_DECL void duk_hstring_init_charlen(duk_hstring *h);
+#endif
+
+#endif /* DUK_HSTRING_H_INCLUDED */
+/* #include duk_hobject.h */
+#line 1 "duk_hobject.h"
+/*
+ * Heap object representation.
+ *
+ * Heap objects are used for Ecmascript objects, arrays, and functions,
+ * but also for internal control like declarative and object environment
+ * records. Compiled functions, native functions, and threads are also
+ * objects but with an extended C struct.
+ *
+ * Objects provide the required Ecmascript semantics and exotic behaviors
+ * especially for property access.
+ *
+ * Properties are stored in three conceptual parts:
+ *
+ * 1. A linear 'entry part' contains ordered key-value-attributes triples
+ * and is the main method of string properties.
+ *
+ * 2. An optional linear 'array part' is used for array objects to store a
+ * (dense) range of [0,N[ array indexed entries with default attributes
+ * (writable, enumerable, configurable). If the array part would become
+ * sparse or non-default attributes are required, the array part is
+ * abandoned and moved to the 'entry part'.
+ *
+ * 3. An optional 'hash part' is used to optimize lookups of the entry
+ * part; it is used only for objects with sufficiently many properties
+ * and can be abandoned without loss of information.
+ *
+ * These three conceptual parts are stored in a single memory allocated area.
+ * This minimizes memory allocation overhead but also means that all three
+ * parts are resized together, and makes property access a bit complicated.
+ */
+
+#if !defined(DUK_HOBJECT_H_INCLUDED)
+#define DUK_HOBJECT_H_INCLUDED
+
+/* Object flags. Make sure this stays in sync with debugger object
+ * inspection code.
+ */
+
+/* XXX: some flags are object subtype specific (e.g. common to all function
+ * subtypes, duk_harray, etc) and could be reused for different subtypes.
+ */
+#define DUK_HOBJECT_FLAG_EXTENSIBLE DUK_HEAPHDR_USER_FLAG(0) /* object is extensible */
+#define DUK_HOBJECT_FLAG_CONSTRUCTABLE DUK_HEAPHDR_USER_FLAG(1) /* object is constructable */
+#define DUK_HOBJECT_FLAG_CALLABLE DUK_HEAPHDR_USER_FLAG(2) /* object is callable */
+#define DUK_HOBJECT_FLAG_BOUNDFUNC DUK_HEAPHDR_USER_FLAG(3) /* object established using Function.prototype.bind() */
+#define DUK_HOBJECT_FLAG_COMPFUNC DUK_HEAPHDR_USER_FLAG(4) /* object is a compiled function (duk_hcompfunc) */
+#define DUK_HOBJECT_FLAG_NATFUNC DUK_HEAPHDR_USER_FLAG(5) /* object is a native function (duk_hnatfunc) */
+#define DUK_HOBJECT_FLAG_BUFOBJ DUK_HEAPHDR_USER_FLAG(6) /* object is a buffer object (duk_hbufobj) (always exotic) */
+#define DUK_HOBJECT_FLAG_FASTREFS DUK_HEAPHDR_USER_FLAG(7) /* object has no fields needing DECREF/marking beyond base duk_hobject header */
+#define DUK_HOBJECT_FLAG_ARRAY_PART DUK_HEAPHDR_USER_FLAG(8) /* object has an array part (a_size may still be 0) */
+#define DUK_HOBJECT_FLAG_STRICT DUK_HEAPHDR_USER_FLAG(9) /* function: function object is strict */
+#define DUK_HOBJECT_FLAG_NOTAIL DUK_HEAPHDR_USER_FLAG(10) /* function: function must not be tail called */
+#define DUK_HOBJECT_FLAG_NEWENV DUK_HEAPHDR_USER_FLAG(11) /* function: create new environment when called (see duk_hcompfunc) */
+#define DUK_HOBJECT_FLAG_NAMEBINDING DUK_HEAPHDR_USER_FLAG(12) /* function: create binding for func name (function templates only, used for named function expressions) */
+#define DUK_HOBJECT_FLAG_CREATEARGS DUK_HEAPHDR_USER_FLAG(13) /* function: create an arguments object on function call */
+#define DUK_HOBJECT_FLAG_HAVE_FINALIZER DUK_HEAPHDR_USER_FLAG(14) /* object has a callable (own) finalizer property */
+#define DUK_HOBJECT_FLAG_EXOTIC_ARRAY DUK_HEAPHDR_USER_FLAG(15) /* 'Array' object, array length and index exotic behavior */
+#define DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ DUK_HEAPHDR_USER_FLAG(16) /* 'String' object, array index exotic behavior */
+#define DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS DUK_HEAPHDR_USER_FLAG(17) /* 'Arguments' object and has arguments exotic behavior (non-strict callee) */
+#define DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ DUK_HEAPHDR_USER_FLAG(18) /* 'Proxy' object */
+#define DUK_HOBJECT_FLAG_SPECIAL_CALL DUK_HEAPHDR_USER_FLAG(19) /* special casing in call behavior, for .call(), .apply(), etc. */
+
+#define DUK_HOBJECT_FLAG_CLASS_BASE DUK_HEAPHDR_USER_FLAG_NUMBER(20)
+#define DUK_HOBJECT_FLAG_CLASS_BITS 5
+
+#define DUK_HOBJECT_GET_CLASS_NUMBER(h) \
+ DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS)
+#define DUK_HOBJECT_SET_CLASS_NUMBER(h,v) \
+ DUK_HEAPHDR_SET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS, (v))
+
+#define DUK_HOBJECT_GET_CLASS_MASK(h) \
+ (1UL << DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS))
+
+/* Macro for creating flag initializer from a class number.
+ * Unsigned type cast is needed to avoid warnings about coercing
+ * a signed integer to an unsigned one; the largest class values
+ * have the highest bit (bit 31) set which causes this.
+ */
+#define DUK_HOBJECT_CLASS_AS_FLAGS(v) (((duk_uint_t) (v)) << DUK_HOBJECT_FLAG_CLASS_BASE)
+
+/* E5 Section 8.6.2 + custom classes */
+#define DUK_HOBJECT_CLASS_NONE 0
+#define DUK_HOBJECT_CLASS_OBJECT 1
+#define DUK_HOBJECT_CLASS_ARRAY 2
+#define DUK_HOBJECT_CLASS_FUNCTION 3
+#define DUK_HOBJECT_CLASS_ARGUMENTS 4
+#define DUK_HOBJECT_CLASS_BOOLEAN 5
+#define DUK_HOBJECT_CLASS_DATE 6
+#define DUK_HOBJECT_CLASS_ERROR 7
+#define DUK_HOBJECT_CLASS_JSON 8
+#define DUK_HOBJECT_CLASS_MATH 9
+#define DUK_HOBJECT_CLASS_NUMBER 10
+#define DUK_HOBJECT_CLASS_REGEXP 11
+#define DUK_HOBJECT_CLASS_STRING 12
+#define DUK_HOBJECT_CLASS_GLOBAL 13
+#define DUK_HOBJECT_CLASS_SYMBOL 14
+#define DUK_HOBJECT_CLASS_OBJENV 15 /* custom */
+#define DUK_HOBJECT_CLASS_DECENV 16 /* custom */
+#define DUK_HOBJECT_CLASS_POINTER 17 /* custom */
+#define DUK_HOBJECT_CLASS_THREAD 18 /* custom; implies DUK_HOBJECT_IS_THREAD */
+#define DUK_HOBJECT_CLASS_BUFOBJ_MIN 19
+#define DUK_HOBJECT_CLASS_ARRAYBUFFER 19 /* implies DUK_HOBJECT_IS_BUFOBJ */
+#define DUK_HOBJECT_CLASS_DATAVIEW 20
+#define DUK_HOBJECT_CLASS_INT8ARRAY 21
+#define DUK_HOBJECT_CLASS_UINT8ARRAY 22
+#define DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY 23
+#define DUK_HOBJECT_CLASS_INT16ARRAY 24
+#define DUK_HOBJECT_CLASS_UINT16ARRAY 25
+#define DUK_HOBJECT_CLASS_INT32ARRAY 26
+#define DUK_HOBJECT_CLASS_UINT32ARRAY 27
+#define DUK_HOBJECT_CLASS_FLOAT32ARRAY 28
+#define DUK_HOBJECT_CLASS_FLOAT64ARRAY 29
+#define DUK_HOBJECT_CLASS_BUFOBJ_MAX 29
+#define DUK_HOBJECT_CLASS_MAX 29
+
+/* Class masks. */
+#define DUK_HOBJECT_CMASK_ALL ((1UL << (DUK_HOBJECT_CLASS_MAX + 1)) - 1UL)
+#define DUK_HOBJECT_CMASK_NONE (1UL << DUK_HOBJECT_CLASS_NONE)
+#define DUK_HOBJECT_CMASK_ARGUMENTS (1UL << DUK_HOBJECT_CLASS_ARGUMENTS)
+#define DUK_HOBJECT_CMASK_ARRAY (1UL << DUK_HOBJECT_CLASS_ARRAY)
+#define DUK_HOBJECT_CMASK_BOOLEAN (1UL << DUK_HOBJECT_CLASS_BOOLEAN)
+#define DUK_HOBJECT_CMASK_DATE (1UL << DUK_HOBJECT_CLASS_DATE)
+#define DUK_HOBJECT_CMASK_ERROR (1UL << DUK_HOBJECT_CLASS_ERROR)
+#define DUK_HOBJECT_CMASK_FUNCTION (1UL << DUK_HOBJECT_CLASS_FUNCTION)
+#define DUK_HOBJECT_CMASK_JSON (1UL << DUK_HOBJECT_CLASS_JSON)
+#define DUK_HOBJECT_CMASK_MATH (1UL << DUK_HOBJECT_CLASS_MATH)
+#define DUK_HOBJECT_CMASK_NUMBER (1UL << DUK_HOBJECT_CLASS_NUMBER)
+#define DUK_HOBJECT_CMASK_OBJECT (1UL << DUK_HOBJECT_CLASS_OBJECT)
+#define DUK_HOBJECT_CMASK_REGEXP (1UL << DUK_HOBJECT_CLASS_REGEXP)
+#define DUK_HOBJECT_CMASK_STRING (1UL << DUK_HOBJECT_CLASS_STRING)
+#define DUK_HOBJECT_CMASK_GLOBAL (1UL << DUK_HOBJECT_CLASS_GLOBAL)
+#define DUK_HOBJECT_CMASK_SYMBOL (1UL << DUK_HOBJECT_CLASS_SYMBOL)
+#define DUK_HOBJECT_CMASK_OBJENV (1UL << DUK_HOBJECT_CLASS_OBJENV)
+#define DUK_HOBJECT_CMASK_DECENV (1UL << DUK_HOBJECT_CLASS_DECENV)
+#define DUK_HOBJECT_CMASK_POINTER (1UL << DUK_HOBJECT_CLASS_POINTER)
+#define DUK_HOBJECT_CMASK_ARRAYBUFFER (1UL << DUK_HOBJECT_CLASS_ARRAYBUFFER)
+#define DUK_HOBJECT_CMASK_DATAVIEW (1UL << DUK_HOBJECT_CLASS_DATAVIEW)
+#define DUK_HOBJECT_CMASK_INT8ARRAY (1UL << DUK_HOBJECT_CLASS_INT8ARRAY)
+#define DUK_HOBJECT_CMASK_UINT8ARRAY (1UL << DUK_HOBJECT_CLASS_UINT8ARRAY)
+#define DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY (1UL << DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY)
+#define DUK_HOBJECT_CMASK_INT16ARRAY (1UL << DUK_HOBJECT_CLASS_INT16ARRAY)
+#define DUK_HOBJECT_CMASK_UINT16ARRAY (1UL << DUK_HOBJECT_CLASS_UINT16ARRAY)
+#define DUK_HOBJECT_CMASK_INT32ARRAY (1UL << DUK_HOBJECT_CLASS_INT32ARRAY)
+#define DUK_HOBJECT_CMASK_UINT32ARRAY (1UL << DUK_HOBJECT_CLASS_UINT32ARRAY)
+#define DUK_HOBJECT_CMASK_FLOAT32ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT32ARRAY)
+#define DUK_HOBJECT_CMASK_FLOAT64ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT64ARRAY)
+
+#define DUK_HOBJECT_CMASK_ALL_BUFOBJS \
+ (DUK_HOBJECT_CMASK_ARRAYBUFFER | \
+ DUK_HOBJECT_CMASK_DATAVIEW | \
+ DUK_HOBJECT_CMASK_INT8ARRAY | \
+ DUK_HOBJECT_CMASK_UINT8ARRAY | \
+ DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY | \
+ DUK_HOBJECT_CMASK_INT16ARRAY | \
+ DUK_HOBJECT_CMASK_UINT16ARRAY | \
+ DUK_HOBJECT_CMASK_INT32ARRAY | \
+ DUK_HOBJECT_CMASK_UINT32ARRAY | \
+ DUK_HOBJECT_CMASK_FLOAT32ARRAY | \
+ DUK_HOBJECT_CMASK_FLOAT64ARRAY)
+
+#define DUK_HOBJECT_IS_OBJENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_OBJENV)
+#define DUK_HOBJECT_IS_DECENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DECENV)
+#define DUK_HOBJECT_IS_ENV(h) (DUK_HOBJECT_IS_OBJENV((h)) || DUK_HOBJECT_IS_DECENV((h)))
+#define DUK_HOBJECT_IS_ARRAY(h) DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)) /* Rely on class Array <=> exotic Array */
+#define DUK_HOBJECT_IS_BOUNDFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)
+#define DUK_HOBJECT_IS_COMPFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)
+#define DUK_HOBJECT_IS_NATFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#define DUK_HOBJECT_IS_BUFOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)
+#else
+#define DUK_HOBJECT_IS_BUFOBJ(h) 0
+#endif
+#define DUK_HOBJECT_IS_THREAD(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_THREAD)
+#if defined(DUK_USE_ES6_PROXY)
+#define DUK_HOBJECT_IS_PROXY(h) DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((h))
+#else
+#define DUK_HOBJECT_IS_PROXY(h) 0
+#endif
+
+#define DUK_HOBJECT_IS_NONBOUND_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \
+ DUK_HOBJECT_FLAG_COMPFUNC | \
+ DUK_HOBJECT_FLAG_NATFUNC)
+
+#define DUK_HOBJECT_IS_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \
+ DUK_HOBJECT_FLAG_BOUNDFUNC | \
+ DUK_HOBJECT_FLAG_COMPFUNC | \
+ DUK_HOBJECT_FLAG_NATFUNC)
+
+#define DUK_HOBJECT_IS_CALLABLE(h) DUK_HOBJECT_HAS_CALLABLE((h))
+
+/* Object has any exotic behavior(s). */
+#define DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \
+ DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS | \
+ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \
+ DUK_HOBJECT_FLAG_BUFOBJ | \
+ DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
+#define DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS)
+
+/* Object has any virtual properties (not counting Proxy behavior). */
+#define DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \
+ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \
+ DUK_HOBJECT_FLAG_BUFOBJ)
+#define DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS)
+
+#define DUK_HOBJECT_HAS_EXTENSIBLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)
+#define DUK_HOBJECT_HAS_CONSTRUCTABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)
+#define DUK_HOBJECT_HAS_CALLABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE)
+#define DUK_HOBJECT_HAS_BOUNDFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)
+#define DUK_HOBJECT_HAS_COMPFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)
+#define DUK_HOBJECT_HAS_NATFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#define DUK_HOBJECT_HAS_BUFOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)
+#else
+#define DUK_HOBJECT_HAS_BUFOBJ(h) 0
+#endif
+#define DUK_HOBJECT_HAS_FASTREFS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS)
+#define DUK_HOBJECT_HAS_ARRAY_PART(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)
+#define DUK_HOBJECT_HAS_STRICT(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)
+#define DUK_HOBJECT_HAS_NOTAIL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)
+#define DUK_HOBJECT_HAS_NEWENV(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)
+#define DUK_HOBJECT_HAS_NAMEBINDING(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)
+#define DUK_HOBJECT_HAS_CREATEARGS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)
+#define DUK_HOBJECT_HAS_HAVE_FINALIZER(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER)
+#define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)
+#define DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)
+#define DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)
+#if defined(DUK_USE_ES6_PROXY)
+#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
+#else
+#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) 0
+#endif
+#define DUK_HOBJECT_HAS_SPECIAL_CALL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL)
+
+#define DUK_HOBJECT_SET_EXTENSIBLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)
+#define DUK_HOBJECT_SET_CONSTRUCTABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)
+#define DUK_HOBJECT_SET_CALLABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE)
+#define DUK_HOBJECT_SET_BOUNDFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)
+#define DUK_HOBJECT_SET_COMPFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)
+#define DUK_HOBJECT_SET_NATFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#define DUK_HOBJECT_SET_BUFOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)
+#endif
+#define DUK_HOBJECT_SET_FASTREFS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS)
+#define DUK_HOBJECT_SET_ARRAY_PART(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)
+#define DUK_HOBJECT_SET_STRICT(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)
+#define DUK_HOBJECT_SET_NOTAIL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)
+#define DUK_HOBJECT_SET_NEWENV(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)
+#define DUK_HOBJECT_SET_NAMEBINDING(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)
+#define DUK_HOBJECT_SET_CREATEARGS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)
+#define DUK_HOBJECT_SET_HAVE_FINALIZER(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER)
+#define DUK_HOBJECT_SET_EXOTIC_ARRAY(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)
+#define DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)
+#define DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)
+#if defined(DUK_USE_ES6_PROXY)
+#define DUK_HOBJECT_SET_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
+#endif
+#define DUK_HOBJECT_SET_SPECIAL_CALL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL)
+
+#define DUK_HOBJECT_CLEAR_EXTENSIBLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)
+#define DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)
+#define DUK_HOBJECT_CLEAR_CALLABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE)
+#define DUK_HOBJECT_CLEAR_BOUNDFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)
+#define DUK_HOBJECT_CLEAR_COMPFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)
+#define DUK_HOBJECT_CLEAR_NATFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#define DUK_HOBJECT_CLEAR_BUFOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)
+#endif
+#define DUK_HOBJECT_CLEAR_FASTREFS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS)
+#define DUK_HOBJECT_CLEAR_ARRAY_PART(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)
+#define DUK_HOBJECT_CLEAR_STRICT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)
+#define DUK_HOBJECT_CLEAR_NOTAIL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)
+#define DUK_HOBJECT_CLEAR_NEWENV(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)
+#define DUK_HOBJECT_CLEAR_NAMEBINDING(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)
+#define DUK_HOBJECT_CLEAR_CREATEARGS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)
+#define DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER)
+#define DUK_HOBJECT_CLEAR_EXOTIC_ARRAY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)
+#define DUK_HOBJECT_CLEAR_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)
+#define DUK_HOBJECT_CLEAR_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)
+#if defined(DUK_USE_ES6_PROXY)
+#define DUK_HOBJECT_CLEAR_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
+#endif
+#define DUK_HOBJECT_CLEAR_SPECIAL_CALL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL)
+
+/* Object can/cannot use FASTREFS, i.e. has no strong reference fields beyond
+ * duk_hobject base header. This is used just for asserts so doesn't need to
+ * be optimized.
+ */
+#define DUK_HOBJECT_PROHIBITS_FASTREFS(h) \
+ (DUK_HOBJECT_IS_COMPFUNC((h)) || DUK_HOBJECT_IS_DECENV((h)) || DUK_HOBJECT_IS_OBJENV((h)) || \
+ DUK_HOBJECT_IS_BUFOBJ((h)) || DUK_HOBJECT_IS_THREAD((h)) || DUK_HOBJECT_IS_PROXY((h)) || \
+ DUK_HOBJECT_IS_BOUNDFUNC((h)))
+#define DUK_HOBJECT_ALLOWS_FASTREFS(h) (!DUK_HOBJECT_PROHIBITS_FASTREFS((h)))
+
+/* Flags used for property attributes in duk_propdesc and packed flags.
+ * Must fit into 8 bits.
+ */
+#define DUK_PROPDESC_FLAG_WRITABLE (1U << 0) /* E5 Section 8.6.1 */
+#define DUK_PROPDESC_FLAG_ENUMERABLE (1U << 1) /* E5 Section 8.6.1 */
+#define DUK_PROPDESC_FLAG_CONFIGURABLE (1U << 2) /* E5 Section 8.6.1 */
+#define DUK_PROPDESC_FLAG_ACCESSOR (1U << 3) /* accessor */
+#define DUK_PROPDESC_FLAG_VIRTUAL (1U << 4) /* property is virtual: used in duk_propdesc, never stored
+ * (used by e.g. buffer virtual properties)
+ */
+#define DUK_PROPDESC_FLAGS_MASK (DUK_PROPDESC_FLAG_WRITABLE | \
+ DUK_PROPDESC_FLAG_ENUMERABLE | \
+ DUK_PROPDESC_FLAG_CONFIGURABLE | \
+ DUK_PROPDESC_FLAG_ACCESSOR)
+
+/* Additional flags which are passed in the same flags argument as property
+ * flags but are not stored in object properties.
+ */
+#define DUK_PROPDESC_FLAG_NO_OVERWRITE (1U << 4) /* internal define property: skip write silently if exists */
+
+/* Convenience defines for property attributes. */
+#define DUK_PROPDESC_FLAGS_NONE 0
+#define DUK_PROPDESC_FLAGS_W (DUK_PROPDESC_FLAG_WRITABLE)
+#define DUK_PROPDESC_FLAGS_E (DUK_PROPDESC_FLAG_ENUMERABLE)
+#define DUK_PROPDESC_FLAGS_C (DUK_PROPDESC_FLAG_CONFIGURABLE)
+#define DUK_PROPDESC_FLAGS_WE (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE)
+#define DUK_PROPDESC_FLAGS_WC (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE)
+#define DUK_PROPDESC_FLAGS_EC (DUK_PROPDESC_FLAG_ENUMERABLE | DUK_PROPDESC_FLAG_CONFIGURABLE)
+#define DUK_PROPDESC_FLAGS_WEC (DUK_PROPDESC_FLAG_WRITABLE | \
+ DUK_PROPDESC_FLAG_ENUMERABLE | \
+ DUK_PROPDESC_FLAG_CONFIGURABLE)
+
+/* Flags for duk_hobject_get_own_propdesc() and variants. */
+#define DUK_GETDESC_FLAG_PUSH_VALUE (1U << 0) /* push value to stack */
+#define DUK_GETDESC_FLAG_IGNORE_PROTOLOOP (1U << 1) /* don't throw for prototype loop */
+
+/*
+ * Macro for object validity check
+ *
+ * Assert for currently guaranteed relations between flags, for instance.
+ */
+
+#define DUK_ASSERT_HOBJECT_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE((h)) || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FUNCTION); \
+ DUK_ASSERT(!DUK_HOBJECT_IS_BUFOBJ((h)) || \
+ (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAYBUFFER || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DATAVIEW || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT8ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT16ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT16ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT32ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT32ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT32ARRAY || \
+ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT64ARRAY)); \
+ /* Object is an Array <=> object has exotic array behavior */ \
+ DUK_ASSERT((DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAY && DUK_HOBJECT_HAS_EXOTIC_ARRAY((h))) || \
+ (DUK_HOBJECT_GET_CLASS_NUMBER((h)) != DUK_HOBJECT_CLASS_ARRAY && !DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)))); \
+ } while (0)
+
+/*
+ * Macros to access the 'props' allocation.
+ */
+
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HOBJECT_GET_PROPS(heap,h) \
+ ((duk_uint8_t *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (h))->h_extra16))
+#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \
+ ((duk_heaphdr *) (h))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \
+ } while (0)
+#else
+#define DUK_HOBJECT_GET_PROPS(heap,h) \
+ ((h)->props)
+#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \
+ (h)->props = (duk_uint8_t *) (x); \
+ } while (0)
+#endif
+
+#if defined(DUK_USE_HOBJECT_LAYOUT_1)
+/* LAYOUT 1 */
+#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \
+ ((duk_hstring **) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) \
+ ))
+#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \
+ ((duk_propvalue *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_hstring *) \
+ ))
+#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \
+ ((duk_uint8_t *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \
+ ))
+#define DUK_HOBJECT_A_GET_BASE(heap,h) \
+ ((duk_tval *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) \
+ ))
+#define DUK_HOBJECT_H_GET_BASE(heap,h) \
+ ((duk_uint32_t *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
+ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
+ ))
+#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \
+ ( \
+ (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
+ (n_arr) * sizeof(duk_tval) + \
+ (n_hash) * sizeof(duk_uint32_t) \
+ )
+#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \
+ (set_e_k) = (duk_hstring **) (void *) (p_base); \
+ (set_e_pv) = (duk_propvalue *) (void *) ((set_e_k) + (n_ent)); \
+ (set_e_f) = (duk_uint8_t *) (void *) ((set_e_pv) + (n_ent)); \
+ (set_a) = (duk_tval *) (void *) ((set_e_f) + (n_ent)); \
+ (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \
+ } while (0)
+#elif defined(DUK_USE_HOBJECT_LAYOUT_2)
+/* LAYOUT 2 */
+#if (DUK_USE_ALIGN_BY == 4)
+#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((4 - (e_sz)) & 0x03)
+#elif (DUK_USE_ALIGN_BY == 8)
+#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((8 - (e_sz)) & 0x07)
+#elif (DUK_USE_ALIGN_BY == 1)
+#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) 0
+#else
+#error invalid DUK_USE_ALIGN_BY
+#endif
+#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \
+ ((duk_hstring **) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \
+ ))
+#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \
+ ((duk_propvalue *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) \
+ ))
+#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \
+ ((duk_uint8_t *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \
+ ))
+#define DUK_HOBJECT_A_GET_BASE(heap,h) \
+ ((duk_tval *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
+ DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) \
+ ))
+#define DUK_HOBJECT_H_GET_BASE(heap,h) \
+ ((duk_uint32_t *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
+ DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) + \
+ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
+ ))
+#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \
+ ( \
+ (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
+ DUK_HOBJECT_E_FLAG_PADDING((n_ent)) + \
+ (n_arr) * sizeof(duk_tval) + \
+ (n_hash) * sizeof(duk_uint32_t) \
+ )
+#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \
+ (set_e_pv) = (duk_propvalue *) (void *) (p_base); \
+ (set_e_k) = (duk_hstring **) (void *) ((set_e_pv) + (n_ent)); \
+ (set_e_f) = (duk_uint8_t *) (void *) ((set_e_k) + (n_ent)); \
+ (set_a) = (duk_tval *) (void *) (((duk_uint8_t *) (set_e_f)) + \
+ sizeof(duk_uint8_t) * (n_ent) + \
+ DUK_HOBJECT_E_FLAG_PADDING((n_ent))); \
+ (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \
+ } while (0)
+#elif defined(DUK_USE_HOBJECT_LAYOUT_3)
+/* LAYOUT 3 */
+#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \
+ ((duk_hstring **) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) + \
+ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
+ ))
+#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \
+ ((duk_propvalue *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) \
+ ))
+#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \
+ ((duk_uint8_t *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \
+ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) + \
+ DUK_HOBJECT_GET_HSIZE((h)) * sizeof(duk_uint32_t) \
+ ))
+#define DUK_HOBJECT_A_GET_BASE(heap,h) \
+ ((duk_tval *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \
+ ))
+#define DUK_HOBJECT_H_GET_BASE(heap,h) \
+ ((duk_uint32_t *) (void *) ( \
+ DUK_HOBJECT_GET_PROPS((heap), (h)) + \
+ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \
+ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
+ ))
+#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \
+ ( \
+ (n_ent) * (sizeof(duk_propvalue) + sizeof(duk_hstring *) + sizeof(duk_uint8_t)) + \
+ (n_arr) * sizeof(duk_tval) + \
+ (n_hash) * sizeof(duk_uint32_t) \
+ )
+#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \
+ (set_e_pv) = (duk_propvalue *) (void *) (p_base); \
+ (set_a) = (duk_tval *) (void *) ((set_e_pv) + (n_ent)); \
+ (set_e_k) = (duk_hstring **) (void *) ((set_a) + (n_arr)); \
+ (set_h) = (duk_uint32_t *) (void *) ((set_e_k) + (n_ent)); \
+ (set_e_f) = (duk_uint8_t *) (void *) ((set_h) + (n_hash)); \
+ } while (0)
+#else
+#error invalid hobject layout defines
+#endif /* hobject property layout */
+
+#define DUK_HOBJECT_P_ALLOC_SIZE(h) \
+ DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE((h)), DUK_HOBJECT_GET_ASIZE((h)), DUK_HOBJECT_GET_HSIZE((h)))
+
+#define DUK_HOBJECT_E_GET_KEY(heap,h,i) (DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_E_GET_KEY_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_E_GET_VALUE(heap,h,i) (DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_E_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_E_GET_VALUE_TVAL(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v)
+#define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v)
+#define DUK_HOBJECT_E_GET_VALUE_GETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get)
+#define DUK_HOBJECT_E_GET_VALUE_GETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get)
+#define DUK_HOBJECT_E_GET_VALUE_SETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set)
+#define DUK_HOBJECT_E_GET_VALUE_SETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set)
+#define DUK_HOBJECT_E_GET_FLAGS(heap,h,i) (DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_E_GET_FLAGS_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_A_GET_VALUE(heap,h,i) (DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_A_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_H_GET_INDEX(heap,h,i) (DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)])
+#define DUK_HOBJECT_H_GET_INDEX_PTR(heap,h,i) (&DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)])
+
+#define DUK_HOBJECT_E_SET_KEY(heap,h,i,k) do { \
+ DUK_HOBJECT_E_GET_KEY((heap), (h), (i)) = (k); \
+ } while (0)
+#define DUK_HOBJECT_E_SET_VALUE(heap,h,i,v) do { \
+ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)) = (v); \
+ } while (0)
+#define DUK_HOBJECT_E_SET_VALUE_TVAL(heap,h,i,v) do { \
+ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v = (v); \
+ } while (0)
+#define DUK_HOBJECT_E_SET_VALUE_GETTER(heap,h,i,v) do { \
+ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get = (v); \
+ } while (0)
+#define DUK_HOBJECT_E_SET_VALUE_SETTER(heap,h,i,v) do { \
+ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set = (v); \
+ } while (0)
+#define DUK_HOBJECT_E_SET_FLAGS(heap,h,i,f) do { \
+ DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) = (duk_uint8_t) (f); \
+ } while (0)
+#define DUK_HOBJECT_A_SET_VALUE(heap,h,i,v) do { \
+ DUK_HOBJECT_A_GET_VALUE((heap), (h), (i)) = (v); \
+ } while (0)
+#define DUK_HOBJECT_A_SET_VALUE_TVAL(heap,h,i,v) \
+ DUK_HOBJECT_A_SET_VALUE((heap), (h), (i), (v)) /* alias for above */
+#define DUK_HOBJECT_H_SET_INDEX(heap,h,i,v) do { \
+ DUK_HOBJECT_H_GET_INDEX((heap), (h), (i)) = (v); \
+ } while (0)
+
+#define DUK_HOBJECT_E_SET_FLAG_BITS(heap,h,i,mask) do { \
+ DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] |= (mask); \
+ } while (0)
+
+#define DUK_HOBJECT_E_CLEAR_FLAG_BITS(heap,h,i,mask) do { \
+ DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] &= ~(mask); \
+ } while (0)
+
+#define DUK_HOBJECT_E_SLOT_IS_WRITABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_WRITABLE) != 0)
+#define DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ENUMERABLE) != 0)
+#define DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0)
+#define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ACCESSOR) != 0)
+
+#define DUK_HOBJECT_E_SLOT_SET_WRITABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE)
+#define DUK_HOBJECT_E_SLOT_SET_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE)
+#define DUK_HOBJECT_E_SLOT_SET_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE)
+#define DUK_HOBJECT_E_SLOT_SET_ACCESSOR(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR)
+
+#define DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE)
+#define DUK_HOBJECT_E_SLOT_CLEAR_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE)
+#define DUK_HOBJECT_E_SLOT_CLEAR_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE)
+#define DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR)
+
+#define DUK_PROPDESC_IS_WRITABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_WRITABLE) != 0)
+#define DUK_PROPDESC_IS_ENUMERABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_ENUMERABLE) != 0)
+#define DUK_PROPDESC_IS_CONFIGURABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0)
+#define DUK_PROPDESC_IS_ACCESSOR(p) (((p)->flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0)
+
+#define DUK_HOBJECT_HASHIDX_UNUSED 0xffffffffUL
+#define DUK_HOBJECT_HASHIDX_DELETED 0xfffffffeUL
+
+/*
+ * Macros for accessing size fields
+ */
+
+#if defined(DUK_USE_OBJSIZES16)
+#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size16)
+#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size16 = (v); } while (0)
+#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next16)
+#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next16 = (v); } while (0)
+#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next16++)
+#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size16)
+#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size16 = (v); } while (0)
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size16)
+#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size16 = (v); } while (0)
+#else
+#define DUK_HOBJECT_GET_HSIZE(h) 0
+#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0)
+#endif
+#else
+#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size)
+#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size = (v); } while (0)
+#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next)
+#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next = (v); } while (0)
+#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next++)
+#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size)
+#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size = (v); } while (0)
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size)
+#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size = (v); } while (0)
+#else
+#define DUK_HOBJECT_GET_HSIZE(h) 0
+#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0)
+#endif
+#endif
+
+/*
+ * Misc
+ */
+
+/* Maximum prototype traversal depth. Sanity limit which handles e.g.
+ * prototype loops (even complex ones like 1->2->3->4->2->3->4->2->3->4).
+ */
+#define DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY 10000L
+
+/*
+ * Ecmascript [[Class]]
+ */
+
+/* range check not necessary because all 4-bit values are mapped */
+#define DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(n) duk_class_number_to_stridx[(n)]
+
+#define DUK_HOBJECT_GET_CLASS_STRING(heap,h) \
+ DUK_HEAP_GET_STRING( \
+ (heap), \
+ DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(DUK_HOBJECT_GET_CLASS_NUMBER((h))) \
+ )
+
+/*
+ * Macros for property handling
+ */
+
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \
+ ((duk_hobject *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->prototype16))
+#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \
+ (h)->prototype16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \
+ } while (0)
+#else
+#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \
+ ((h)->prototype)
+#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \
+ (h)->prototype = (x); \
+ } while (0)
+#endif
+
+/* Set prototype, DECREF earlier value, INCREF new value (tolerating NULLs). */
+#define DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr,h,p) duk_hobject_set_prototype_updref((thr), (h), (p))
+
+/* Set initial prototype, assume NULL previous prototype, INCREF new value,
+ * tolerate NULL.
+ */
+#define DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr,h,proto) do { \
+ duk_hthread *duk__thr = (thr); \
+ duk_hobject *duk__obj = (h); \
+ duk_hobject *duk__proto = (proto); \
+ DUK_UNREF(duk__thr); \
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(duk__thr->heap, duk__obj) == NULL); \
+ DUK_HOBJECT_SET_PROTOTYPE(duk__thr->heap, duk__obj, duk__proto); \
+ DUK_HOBJECT_INCREF_ALLOWNULL(duk__thr, duk__proto); \
+ } while (0)
+
+/*
+ * Finalizer check
+ */
+
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((heap), (h))
+#else
+#define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((h))
+#endif
+
+/*
+ * Resizing and hash behavior
+ */
+
+/* Sanity limit on max number of properties (allocated, not necessarily used).
+ * This is somewhat arbitrary, but if we're close to 2**32 properties some
+ * algorithms will fail (e.g. hash size selection, next prime selection).
+ * Also, we use negative array/entry table indices to indicate 'not found',
+ * so anything above 0x80000000 will cause trouble now.
+ */
+#if defined(DUK_USE_OBJSIZES16)
+#define DUK_HOBJECT_MAX_PROPERTIES 0x0000ffffUL
+#else
+#define DUK_HOBJECT_MAX_PROPERTIES 0x3fffffffUL /* 2**30-1 ~= 1G properties */
+#endif
+
+/* internal align target for props allocation, must be 2*n for some n */
+#if (DUK_USE_ALIGN_BY == 4)
+#define DUK_HOBJECT_ALIGN_TARGET 4
+#elif (DUK_USE_ALIGN_BY == 8)
+#define DUK_HOBJECT_ALIGN_TARGET 8
+#elif (DUK_USE_ALIGN_BY == 1)
+#define DUK_HOBJECT_ALIGN_TARGET 1
+#else
+#error invalid DUK_USE_ALIGN_BY
+#endif
+
+/*
+ * PC-to-line constants
+ */
+
+#define DUK_PC2LINE_SKIP 64
+
+/* maximum length for a SKIP-1 diffstream: 35 bits per entry, rounded up to bytes */
+#define DUK_PC2LINE_MAX_DIFF_LENGTH (((DUK_PC2LINE_SKIP - 1) * 35 + 7) / 8)
+
+/*
+ * Struct defs
+ */
+
+struct duk_propaccessor {
+ duk_hobject *get;
+ duk_hobject *set;
+};
+
+union duk_propvalue {
+ /* The get/set pointers could be 16-bit pointer compressed but it
+ * would make no difference on 32-bit platforms because duk_tval is
+ * 8 bytes or more anyway.
+ */
+ duk_tval v;
+ duk_propaccessor a;
+};
+
+struct duk_propdesc {
+ /* read-only values 'lifted' for ease of use */
+ duk_small_uint_t flags;
+ duk_hobject *get;
+ duk_hobject *set;
+
+ /* for updating (all are set to < 0 for virtual properties) */
+ duk_int_t e_idx; /* prop index in 'entry part', < 0 if not there */
+ duk_int_t h_idx; /* prop index in 'hash part', < 0 if not there */
+ duk_int_t a_idx; /* prop index in 'array part', < 0 if not there */
+};
+
+struct duk_hobject {
+ duk_heaphdr hdr;
+
+ /*
+ * 'props' contains {key,value,flags} entries, optional array entries, and
+ * an optional hash lookup table for non-array entries in a single 'sliced'
+ * allocation. There are several layout options, which differ slightly in
+ * generated code size/speed and alignment/padding; duk_features.h selects
+ * the layout used.
+ *
+ * Layout 1 (DUK_USE_HOBJECT_LAYOUT_1):
+ *
+ * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable)
+ * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable)
+ * e_size * sizeof(duk_uint8_t) bytes of entry flags (e_next gc reachable)
+ * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable)
+ * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size),
+ * 0xffffffffUL = unused, 0xfffffffeUL = deleted
+ *
+ * Layout 2 (DUK_USE_HOBJECT_LAYOUT_2):
+ *
+ * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable)
+ * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable)
+ * e_size * sizeof(duk_uint8_t) + pad bytes of entry flags (e_next gc reachable)
+ * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable)
+ * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size),
+ * 0xffffffffUL = unused, 0xfffffffeUL = deleted
+ *
+ * Layout 3 (DUK_USE_HOBJECT_LAYOUT_3):
+ *
+ * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable)
+ * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable)
+ * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable)
+ * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size),
+ * 0xffffffffUL = unused, 0xfffffffeUL = deleted
+ * e_size * sizeof(duk_uint8_t) bytes of entry flags (e_next gc reachable)
+ *
+ * In layout 1, the 'e_next' count is rounded to 4 or 8 on platforms
+ * requiring 4 or 8 byte alignment. This ensures proper alignment
+ * for the entries, at the cost of memory footprint. However, it's
+ * probably preferable to use another layout on such platforms instead.
+ *
+ * In layout 2, the key and value parts are swapped to avoid padding
+ * the key array on platforms requiring alignment by 8. The flags part
+ * is padded to get alignment for array entries. The 'e_next' count does
+ * not need to be rounded as in layout 1.
+ *
+ * In layout 3, entry values and array values are always aligned properly,
+ * and assuming pointers are at most 8 bytes, so are the entry keys. Hash
+ * indices will be properly aligned (assuming pointers are at least 4 bytes).
+ * Finally, flags don't need additional alignment. This layout provides
+ * compact allocations without padding (even on platforms with alignment
+ * requirements) at the cost of a bit slower lookups.
+ *
+ * Objects with few keys don't have a hash index; keys are looked up linearly,
+ * which is cache efficient because the keys are consecutive. Larger objects
+ * have a hash index part which contains integer indexes to the entries part.
+ *
+ * A single allocation reduces memory allocation overhead but requires more
+ * work when any part needs to be resized. A sliced allocation for entries
+ * makes linear key matching faster on most platforms (more locality) and
+ * skimps on flags size (which would be followed by 3 bytes of padding in
+ * most architectures if entries were placed in a struct).
+ *
+ * 'props' also contains internal properties distinguished with a non-BMP
+ * prefix. Often used properties should be placed early in 'props' whenever
+ * possible to make accessing them as fast a possible.
+ */
+
+#if defined(DUK_USE_HEAPPTR16)
+ /* Located in duk_heaphdr h_extra16. Subclasses of duk_hobject (like
+ * duk_hcompfunc) are not free to use h_extra16 for this reason.
+ */
+#else
+ duk_uint8_t *props;
+#endif
+
+ /* prototype: the only internal property lifted outside 'e' as it is so central */
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t prototype16;
+#else
+ duk_hobject *prototype;
+#endif
+
+#if defined(DUK_USE_OBJSIZES16)
+ duk_uint16_t e_size16;
+ duk_uint16_t e_next16;
+ duk_uint16_t a_size16;
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ duk_uint16_t h_size16;
+#endif
+#else
+ duk_uint32_t e_size; /* entry part size */
+ duk_uint32_t e_next; /* index for next new key ([0,e_next[ are gc reachable) */
+ duk_uint32_t a_size; /* array part size (entirely gc reachable) */
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ duk_uint32_t h_size; /* hash part size or 0 if unused */
+#endif
+#endif
+};
+
+/*
+ * Exposed data
+ */
+
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL duk_uint8_t duk_class_number_to_stridx[32];
+#endif /* !DUK_SINGLE_FILE */
+
+/*
+ * Prototypes
+ */
+
+/* alloc and init */
+DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL_DECL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+#endif
+DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+DUK_INTERNAL_DECL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags);
+
+/* resize */
+DUK_INTERNAL_DECL void duk_hobject_realloc_props(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t new_e_size,
+ duk_uint32_t new_a_size,
+ duk_uint32_t new_h_size,
+ duk_bool_t abandon_array);
+DUK_INTERNAL_DECL void duk_hobject_resize_entrypart(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t new_e_size);
+#if 0 /*unused*/
+DUK_INTERNAL_DECL void duk_hobject_resize_arraypart(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t new_a_size);
+#endif
+
+/* low-level property functions */
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx);
+DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key);
+DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs);
+DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags);
+
+/* XXX: when optimizing for guaranteed property slots, use a guaranteed
+ * slot for internal value; this call can then access it directly.
+ */
+#define duk_hobject_get_internal_value_tval_ptr(heap,obj) \
+ duk_hobject_find_existing_entry_tval_ptr((heap), (obj), DUK_HEAP_STRING_INT_VALUE((heap)))
+
+/* core property functions */
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key);
+
+/* internal property functions */
+#define DUK_DELPROP_FLAG_THROW (1U << 0)
+#define DUK_DELPROP_FLAG_FORCE (1U << 1)
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key);
+DUK_INTERNAL_DECL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags);
+DUK_INTERNAL_DECL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags);
+DUK_INTERNAL_DECL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj);
+#if defined(DUK_USE_HEAPPTR16)
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj);
+#else
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj);
+#endif
+
+/* helpers for defineProperty() and defineProperties() */
+DUK_INTERNAL_DECL void duk_hobject_prepare_property_descriptor(duk_hthread *thr,
+ duk_idx_t idx_in,
+ duk_uint_t *out_defprop_flags,
+ duk_idx_t *out_idx_value,
+ duk_hobject **out_getter,
+ duk_hobject **out_setter);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr,
+ duk_uint_t defprop_flags,
+ duk_hobject *obj,
+ duk_hstring *key,
+ duk_idx_t idx_value,
+ duk_hobject *get,
+ duk_hobject *set,
+ duk_bool_t throw_flag);
+
+/* Object built-in methods */
+DUK_INTERNAL_DECL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx);
+DUK_INTERNAL_DECL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags);
+
+/* internal properties */
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv);
+DUK_INTERNAL_DECL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj);
+
+/* hobject management functions */
+DUK_INTERNAL_DECL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj);
+
+/* ES2015 proxy */
+#if defined(DUK_USE_ES6_PROXY)
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler);
+DUK_INTERNAL_DECL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj);
+#endif
+
+/* enumeration */
+DUK_INTERNAL_DECL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags);
+DUK_INTERNAL_DECL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags);
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value);
+
+/* macros */
+DUK_INTERNAL_DECL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p);
+
+/* pc2line */
+#if defined(DUK_USE_PC2LINE)
+DUK_INTERNAL_DECL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length);
+DUK_INTERNAL_DECL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc);
+#endif
+
+/* misc */
+DUK_INTERNAL_DECL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop);
+
+#if !defined(DUK_USE_OBJECT_BUILTIN)
+/* These declarations are needed when related built-in is disabled and
+ * genbuiltins.py won't automatically emit the declerations.
+ */
+DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_hthread *thr);
+#endif
+
+#endif /* DUK_HOBJECT_H_INCLUDED */
+/* #include duk_hcompfunc.h */
+#line 1 "duk_hcompfunc.h"
+/*
+ * Heap compiled function (Ecmascript function) representation.
+ *
+ * There is a single data buffer containing the Ecmascript function's
+ * bytecode, constants, and inner functions.
+ */
+
+#if !defined(DUK_HCOMPFUNC_H_INCLUDED)
+#define DUK_HCOMPFUNC_H_INCLUDED
+
+/*
+ * Field accessor macros
+ */
+
+/* XXX: casts could be improved, especially for GET/SET DATA */
+
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HCOMPFUNC_GET_DATA(heap,h) \
+ ((duk_hbuffer_fixed *) (void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->data16))
+#define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \
+ (h)->data16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_FUNCS(heap,h) \
+ ((duk_hobject **) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->funcs16)))
+#define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v) do { \
+ (h)->funcs16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_BYTECODE(heap,h) \
+ ((duk_instr_t *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->bytecode16)))
+#define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v) do { \
+ (h)->bytecode16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_LEXENV(heap,h) \
+ ((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->lex_env16)))
+#define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v) do { \
+ (h)->lex_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_VARENV(heap,h) \
+ ((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->var_env16)))
+#define DUK_HCOMPFUNC_SET_VARENV(heap,h,v) do { \
+ (h)->var_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \
+ } while (0)
+#else
+#define DUK_HCOMPFUNC_GET_DATA(heap,h) ((duk_hbuffer_fixed *) (void *) (h)->data)
+#define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \
+ (h)->data = (duk_hbuffer *) (v); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_FUNCS(heap,h) ((h)->funcs)
+#define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v) do { \
+ (h)->funcs = (v); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_BYTECODE(heap,h) ((h)->bytecode)
+#define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v) do { \
+ (h)->bytecode = (v); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_LEXENV(heap,h) ((h)->lex_env)
+#define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v) do { \
+ (h)->lex_env = (v); \
+ } while (0)
+#define DUK_HCOMPFUNC_GET_VARENV(heap,h) ((h)->var_env)
+#define DUK_HCOMPFUNC_SET_VARENV(heap,h,v) do { \
+ (h)->var_env = (v); \
+ } while (0)
+#endif
+
+/*
+ * Accessor macros for function specific data areas
+ */
+
+/* Note: assumes 'data' is always a fixed buffer */
+#define DUK_HCOMPFUNC_GET_BUFFER_BASE(heap,h) \
+ DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h)))
+
+#define DUK_HCOMPFUNC_GET_CONSTS_BASE(heap,h) \
+ ((duk_tval *) (void *) DUK_HCOMPFUNC_GET_BUFFER_BASE((heap), (h)))
+
+#define DUK_HCOMPFUNC_GET_FUNCS_BASE(heap,h) \
+ DUK_HCOMPFUNC_GET_FUNCS((heap), (h))
+
+#define DUK_HCOMPFUNC_GET_CODE_BASE(heap,h) \
+ DUK_HCOMPFUNC_GET_BYTECODE((heap), (h))
+
+#define DUK_HCOMPFUNC_GET_CONSTS_END(heap,h) \
+ ((duk_tval *) (void *) DUK_HCOMPFUNC_GET_FUNCS((heap), (h)))
+
+#define DUK_HCOMPFUNC_GET_FUNCS_END(heap,h) \
+ ((duk_hobject **) (void *) DUK_HCOMPFUNC_GET_BYTECODE((heap), (h)))
+
+/* XXX: double evaluation of DUK_HCOMPFUNC_GET_DATA() */
+#define DUK_HCOMPFUNC_GET_CODE_END(heap,h) \
+ ((duk_instr_t *) (void *) (DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h))) + \
+ DUK_HBUFFER_GET_SIZE((duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA((heap), h))))
+
+#define DUK_HCOMPFUNC_GET_CONSTS_SIZE(heap,h) \
+ ( \
+ (duk_size_t) \
+ ( \
+ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_END((heap), (h))) - \
+ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_BASE((heap), (h))) \
+ ) \
+ )
+
+#define DUK_HCOMPFUNC_GET_FUNCS_SIZE(heap,h) \
+ ( \
+ (duk_size_t) \
+ ( \
+ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_END((heap), (h))) - \
+ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_BASE((heap), (h))) \
+ ) \
+ )
+
+#define DUK_HCOMPFUNC_GET_CODE_SIZE(heap,h) \
+ ( \
+ (duk_size_t) \
+ ( \
+ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_END((heap),(h))) - \
+ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_BASE((heap),(h))) \
+ ) \
+ )
+
+#define DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap,h) \
+ ((duk_size_t) (DUK_HCOMPFUNC_GET_CONSTS_SIZE((heap), (h)) / sizeof(duk_tval)))
+
+#define DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap,h) \
+ ((duk_size_t) (DUK_HCOMPFUNC_GET_FUNCS_SIZE((heap), (h)) / sizeof(duk_hobject *)))
+
+#define DUK_HCOMPFUNC_GET_CODE_COUNT(heap,h) \
+ ((duk_size_t) (DUK_HCOMPFUNC_GET_CODE_SIZE((heap), (h)) / sizeof(duk_instr_t)))
+
+/*
+ * Validity assert
+ */
+
+#define DUK_ASSERT_HCOMPFUNC_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ } while (0)
+
+/*
+ * Main struct
+ */
+
+struct duk_hcompfunc {
+ /* shared object part */
+ duk_hobject obj;
+
+ /*
+ * Pointers to function data area for faster access. Function
+ * data is a buffer shared between all closures of the same
+ * "template" function. The data buffer is always fixed (non-
+ * dynamic, hence stable), with a layout as follows:
+ *
+ * constants (duk_tval)
+ * inner functions (duk_hobject *)
+ * bytecode (duk_instr_t)
+ *
+ * Note: bytecode end address can be computed from 'data' buffer
+ * size. It is not strictly necessary functionally, assuming
+ * bytecode never jumps outside its allocated area. However,
+ * it's a safety/robustness feature for avoiding the chance of
+ * executing random data as bytecode due to a compiler error.
+ *
+ * Note: values in the data buffer must be incref'd (they will
+ * be decref'd on release) for every compiledfunction referring
+ * to the 'data' element.
+ */
+
+ /* Data area, fixed allocation, stable data ptrs. */
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t data16;
+#else
+ duk_hbuffer *data;
+#endif
+
+ /* No need for constants pointer (= same as data).
+ *
+ * When using 16-bit packing alignment to 4 is nice. 'funcs' will be
+ * 4-byte aligned because 'constants' are duk_tvals. For now the
+ * inner function pointers are not compressed, so that 'bytecode' will
+ * also be 4-byte aligned.
+ */
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t funcs16;
+ duk_uint16_t bytecode16;
+#else
+ duk_hobject **funcs;
+ duk_instr_t *bytecode;
+#endif
+
+ /* Lexenv: lexical environment of closure, NULL for templates.
+ * Varenv: variable environment of closure, NULL for templates.
+ */
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t lex_env16;
+ duk_uint16_t var_env16;
+#else
+ duk_hobject *lex_env;
+ duk_hobject *var_env;
+#endif
+
+ /*
+ * 'nregs' registers are allocated on function entry, at most 'nargs'
+ * are initialized to arguments, and the rest to undefined. Arguments
+ * above 'nregs' are not mapped to registers. All registers in the
+ * active stack range must be initialized because they are GC reachable.
+ * 'nargs' is needed so that if the function is given more than 'nargs'
+ * arguments, the additional arguments do not 'clobber' registers
+ * beyond 'nregs' which must be consistently initialized to undefined.
+ *
+ * Usually there is no need to know which registers are mapped to
+ * local variables. Registers may be allocated to variable in any
+ * way (even including gaps). However, a register-variable mapping
+ * must be the same for the duration of the function execution and
+ * the register cannot be used for anything else.
+ *
+ * When looking up variables by name, the '_Varmap' map is used.
+ * When an activation closes, registers mapped to arguments are
+ * copied into the environment record based on the same map. The
+ * reverse map (from register to variable) is not currently needed
+ * at run time, except for debugging, so it is not maintained.
+ */
+
+ duk_uint16_t nregs; /* regs to allocate */
+ duk_uint16_t nargs; /* number of arguments allocated to regs */
+
+ /*
+ * Additional control information is placed into the object itself
+ * as internal properties to avoid unnecessary fields for the
+ * majority of functions. The compiler tries to omit internal
+ * control fields when possible.
+ *
+ * Function templates:
+ *
+ * {
+ * name: "func", // declaration, named function expressions
+ * fileName: <debug info for creating nice errors>
+ * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 },
+ * _Formals: [ "arg1", "arg2" ],
+ * _Source: "function func(arg1, arg2) { ... }",
+ * _Pc2line: <debug info for pc-to-line mapping>,
+ * }
+ *
+ * Function instances:
+ *
+ * {
+ * length: 2,
+ * prototype: { constructor: <func> },
+ * caller: <thrower>,
+ * arguments: <thrower>,
+ * name: "func", // declaration, named function expressions
+ * fileName: <debug info for creating nice errors>
+ * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 },
+ * _Formals: [ "arg1", "arg2" ],
+ * _Source: "function func(arg1, arg2) { ... }",
+ * _Pc2line: <debug info for pc-to-line mapping>,
+ * }
+ *
+ * More detailed description of these properties can be found
+ * in the documentation.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ /* Line number range for function. Needed during debugging to
+ * determine active breakpoints.
+ */
+ duk_uint32_t start_line;
+ duk_uint32_t end_line;
+#endif
+};
+
+#endif /* DUK_HCOMPFUNC_H_INCLUDED */
+/* #include duk_hnatfunc.h */
+#line 1 "duk_hnatfunc.h"
+/*
+ * Heap native function representation.
+ */
+
+#if !defined(DUK_HNATFUNC_H_INCLUDED)
+#define DUK_HNATFUNC_H_INCLUDED
+
+#define DUK_HNATFUNC_NARGS_VARARGS ((duk_int16_t) -1)
+#define DUK_HNATFUNC_NARGS_MAX ((duk_int16_t) 0x7fff)
+
+struct duk_hnatfunc {
+ /* shared object part */
+ duk_hobject obj;
+
+ duk_c_function func;
+ duk_int16_t nargs;
+ duk_int16_t magic;
+
+ /* The 'magic' field allows an opaque 16-bit field to be accessed by the
+ * Duktape/C function. This allows, for instance, the same native function
+ * to be used for a set of very similar functions, with the 'magic' field
+ * providing the necessary non-argument flags / values to guide the behavior
+ * of the native function. The value is signed on purpose: it is easier to
+ * convert a signed value to unsigned (simply AND with 0xffff) than vice
+ * versa.
+ *
+ * Note: cannot place nargs/magic into the heaphdr flags, because
+ * duk_hobject takes almost all flags already.
+ */
+};
+
+#endif /* DUK_HNATFUNC_H_INCLUDED */
+/* #include duk_hboundfunc.h */
+#line 1 "duk_hboundfunc.h"
+/*
+ * Bound function representation.
+ */
+
+#if !defined(DUK_HBOUNDFUNC_H_INCLUDED)
+#define DUK_HBOUNDFUNC_H_INCLUDED
+
+/* Artificial limit for args length. Ensures arithmetic won't overflow
+ * 32 bits when combining bound functions.
+ */
+#define DUK_HBOUNDFUNC_MAX_ARGS 0x20000000UL
+
+#define DUK_ASSERT_HBOUNDFUNC_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT(DUK_HOBJECT_IS_BOUNDFUNC((duk_hobject *) (h))); \
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&(h)->target) || \
+ (DUK_TVAL_IS_OBJECT(&(h)->target) && \
+ DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&(h)->target)))); \
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(&(h)->this_binding)); \
+ DUK_ASSERT((h)->nargs == 0 || (h)->args != NULL); \
+ } while (0)
+
+struct duk_hboundfunc {
+ /* Shared object part. */
+ duk_hobject obj;
+
+ /* Final target function, stored as duk_tval so that lightfunc can be
+ * represented too.
+ */
+ duk_tval target;
+
+ /* This binding. */
+ duk_tval this_binding;
+
+ /* Arguments to prepend. */
+ duk_tval *args; /* Separate allocation. */
+ duk_idx_t nargs;
+};
+
+#endif /* DUK_HBOUNDFUNC_H_INCLUDED */
+/* #include duk_hbufobj.h */
+#line 1 "duk_hbufobj.h"
+/*
+ * Heap Buffer object representation. Used for all Buffer variants.
+ */
+
+#if !defined(DUK_HBUFOBJ_H_INCLUDED)
+#define DUK_HBUFOBJ_H_INCLUDED
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+
+/* All element accessors are host endian now (driven by TypedArray spec). */
+#define DUK_HBUFOBJ_ELEM_UINT8 0
+#define DUK_HBUFOBJ_ELEM_UINT8CLAMPED 1
+#define DUK_HBUFOBJ_ELEM_INT8 2
+#define DUK_HBUFOBJ_ELEM_UINT16 3
+#define DUK_HBUFOBJ_ELEM_INT16 4
+#define DUK_HBUFOBJ_ELEM_UINT32 5
+#define DUK_HBUFOBJ_ELEM_INT32 6
+#define DUK_HBUFOBJ_ELEM_FLOAT32 7
+#define DUK_HBUFOBJ_ELEM_FLOAT64 8
+#define DUK_HBUFOBJ_ELEM_MAX 8
+
+#define DUK_ASSERT_HBUFOBJ_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT((h)->shift <= 3); \
+ DUK_ASSERT((h)->elem_type <= DUK_HBUFOBJ_ELEM_MAX); \
+ DUK_ASSERT(((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8) || \
+ ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8CLAMPED) || \
+ ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT8) || \
+ ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT16) || \
+ ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT16) || \
+ ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT32) || \
+ ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT32) || \
+ ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT32) || \
+ ((h)->shift == 3 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT64)); \
+ DUK_ASSERT((h)->is_typedarray == 0 || (h)->is_typedarray == 1); \
+ DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) (h))); \
+ if ((h)->buf == NULL) { \
+ DUK_ASSERT((h)->offset == 0); \
+ DUK_ASSERT((h)->length == 0); \
+ } else { \
+ /* No assertions for offset or length; in particular, \
+ * it's OK for length to be longer than underlying \
+ * buffer. Just ensure they don't wrap when added. \
+ */ \
+ DUK_ASSERT((h)->offset + (h)->length >= (h)->offset); \
+ } \
+ } while (0)
+
+/* Get the current data pointer (caller must ensure buf != NULL) as a
+ * duk_uint8_t ptr.
+ */
+#define DUK_HBUFOBJ_GET_SLICE_BASE(heap,h) \
+ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \
+ (((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR((heap), (h)->buf)) + (h)->offset))
+
+/* True if slice is full, i.e. offset is zero and length covers the entire
+ * buffer. This status may change independently of the duk_hbufobj if
+ * the underlying buffer is dynamic and changes without the hbufobj
+ * being changed.
+ */
+#define DUK_HBUFOBJ_FULL_SLICE(h) \
+ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \
+ ((h)->offset == 0 && (h)->length == DUK_HBUFFER_GET_SIZE((h)->buf)))
+
+/* Validate that the whole slice [0,length[ is contained in the underlying
+ * buffer. Caller must ensure 'buf' != NULL.
+ */
+#define DUK_HBUFOBJ_VALID_SLICE(h) \
+ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \
+ ((h)->offset + (h)->length <= DUK_HBUFFER_GET_SIZE((h)->buf)))
+
+/* Validate byte read/write for virtual 'offset', i.e. check that the
+ * offset, taking into account h->offset, is within the underlying
+ * buffer size. This is a safety check which is needed to ensure
+ * that even a misconfigured duk_hbufobj never causes memory unsafe
+ * behavior (e.g. if an underlying dynamic buffer changes after being
+ * setup). Caller must ensure 'buf' != NULL.
+ */
+#define DUK_HBUFOBJ_VALID_BYTEOFFSET_INCL(h,off) \
+ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \
+ ((h)->offset + (off) < DUK_HBUFFER_GET_SIZE((h)->buf)))
+
+#define DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h,off) \
+ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \
+ ((h)->offset + (off) <= DUK_HBUFFER_GET_SIZE((h)->buf)))
+
+/* Clamp an input byte length (already assumed to be within the nominal
+ * duk_hbufobj 'length') to the current dynamic buffer limits to yield
+ * a byte length limit that's safe for memory accesses. This value can
+ * be invalidated by any side effect because it may trigger a user
+ * callback that resizes the underlying buffer.
+ */
+#define DUK_HBUFOBJ_CLAMP_BYTELENGTH(h,len) \
+ (DUK_ASSERT_EXPR((h) != NULL), \
+ duk_hbufobj_clamp_bytelength((h), (len)))
+
+/* Typed arrays have virtual indices, ArrayBuffer and DataView do not. */
+#define DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h) ((h)->is_typedarray)
+
+struct duk_hbufobj {
+ /* Shared object part. */
+ duk_hobject obj;
+
+ /* Underlying buffer (refcounted), may be NULL. */
+ duk_hbuffer *buf;
+
+ /* .buffer reference to an ArrayBuffer, may be NULL. */
+ duk_hobject *buf_prop;
+
+ /* Slice and accessor information.
+ *
+ * Because the underlying buffer may be dynamic, these may be
+ * invalidated by the buffer being modified so that both offset
+ * and length should be validated before every access. Behavior
+ * when the underlying buffer has changed doesn't need to be clean:
+ * virtual 'length' doesn't need to be affected, reads can return
+ * zero/NaN, and writes can be ignored.
+ *
+ * Note that a data pointer cannot be precomputed because 'buf' may
+ * be dynamic and its pointer unstable.
+ */
+
+ duk_uint_t offset; /* byte offset to buf */
+ duk_uint_t length; /* byte index limit for element access, exclusive */
+ duk_uint8_t shift; /* element size shift:
+ * 0 = u8/i8
+ * 1 = u16/i16
+ * 2 = u32/i32/float
+ * 3 = double
+ */
+ duk_uint8_t elem_type; /* element type */
+ duk_uint8_t is_typedarray;
+};
+
+DUK_INTERNAL_DECL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len);
+DUK_INTERNAL_DECL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf);
+DUK_INTERNAL_DECL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size);
+DUK_INTERNAL_DECL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size);
+DUK_INTERNAL_DECL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx);
+
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+#endif /* DUK_HBUFOBJ_H_INCLUDED */
+/* #include duk_hthread.h */
+#line 1 "duk_hthread.h"
+/*
+ * Heap thread object representation.
+ *
+ * duk_hthread is also the 'context' for public API functions via a
+ * different typedef. Most API calls operate on the topmost frame
+ * of the value stack only.
+ */
+
+#if !defined(DUK_HTHREAD_H_INCLUDED)
+#define DUK_HTHREAD_H_INCLUDED
+
+/*
+ * Stack constants
+ */
+
+/* Initial valstack size, roughly 0.7kiB. */
+#define DUK_VALSTACK_INITIAL_SIZE 96U
+
+/* Internal extra elements assumed on function entry, always added to
+ * user-defined 'extra' for e.g. the duk_check_stack() call.
+ */
+#define DUK_VALSTACK_INTERNAL_EXTRA 32U
+
+/* Number of elements guaranteed to be user accessible (in addition to call
+ * arguments) on Duktape/C function entry. This is the major public API
+ * commitment.
+ */
+#define DUK_VALSTACK_API_ENTRY_MINIMUM DUK_API_ENTRY_STACK
+
+/*
+ * Activation defines
+ */
+
+#define DUK_ACT_FLAG_STRICT (1U << 0) /* function executes in strict mode */
+#define DUK_ACT_FLAG_TAILCALLED (1U << 1) /* activation has tail called one or more times */
+#define DUK_ACT_FLAG_CONSTRUCT (1U << 2) /* function executes as a constructor (called via "new") */
+#define DUK_ACT_FLAG_PREVENT_YIELD (1U << 3) /* activation prevents yield (native call or "new") */
+#define DUK_ACT_FLAG_DIRECT_EVAL (1U << 4) /* activation is a direct eval call */
+#define DUK_ACT_FLAG_CONSTRUCT_PROXY (1U << 5) /* activation is for Proxy 'construct' call, special return value handling */
+#define DUK_ACT_FLAG_BREAKPOINT_ACTIVE (1U << 6) /* activation has active breakpoint(s) */
+
+#define DUK_ACT_GET_FUNC(act) ((act)->func)
+
+/*
+ * Flags for __FILE__ / __LINE__ registered into tracedata
+ */
+
+#define DUK_TB_FLAG_NOBLAME_FILELINE (1U << 0) /* don't report __FILE__ / __LINE__ as fileName/lineNumber */
+
+/*
+ * Catcher defines
+ */
+
+/* XXX: remove catcher type entirely */
+
+/* flags field: LLLLLLFT, L = label (24 bits), F = flags (4 bits), T = type (4 bits) */
+#define DUK_CAT_TYPE_MASK 0x0000000fUL
+#define DUK_CAT_TYPE_BITS 4
+#define DUK_CAT_LABEL_MASK 0xffffff00UL
+#define DUK_CAT_LABEL_BITS 24
+#define DUK_CAT_LABEL_SHIFT 8
+
+#define DUK_CAT_FLAG_CATCH_ENABLED (1U << 4) /* catch part will catch */
+#define DUK_CAT_FLAG_FINALLY_ENABLED (1U << 5) /* finally part will catch */
+#define DUK_CAT_FLAG_CATCH_BINDING_ENABLED (1U << 6) /* request to create catch binding */
+#define DUK_CAT_FLAG_LEXENV_ACTIVE (1U << 7) /* catch or with binding is currently active */
+
+#define DUK_CAT_TYPE_UNKNOWN 0
+#define DUK_CAT_TYPE_TCF 1
+#define DUK_CAT_TYPE_LABEL 2
+
+#define DUK_CAT_GET_TYPE(c) ((c)->flags & DUK_CAT_TYPE_MASK)
+#define DUK_CAT_GET_LABEL(c) (((c)->flags & DUK_CAT_LABEL_MASK) >> DUK_CAT_LABEL_SHIFT)
+
+#define DUK_CAT_HAS_CATCH_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_ENABLED)
+#define DUK_CAT_HAS_FINALLY_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_FINALLY_ENABLED)
+#define DUK_CAT_HAS_CATCH_BINDING_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_BINDING_ENABLED)
+#define DUK_CAT_HAS_LEXENV_ACTIVE(c) ((c)->flags & DUK_CAT_FLAG_LEXENV_ACTIVE)
+
+#define DUK_CAT_SET_CATCH_ENABLED(c) do { \
+ (c)->flags |= DUK_CAT_FLAG_CATCH_ENABLED; \
+ } while (0)
+#define DUK_CAT_SET_FINALLY_ENABLED(c) do { \
+ (c)->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; \
+ } while (0)
+#define DUK_CAT_SET_CATCH_BINDING_ENABLED(c) do { \
+ (c)->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \
+ } while (0)
+#define DUK_CAT_SET_LEXENV_ACTIVE(c) do { \
+ (c)->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; \
+ } while (0)
+
+#define DUK_CAT_CLEAR_CATCH_ENABLED(c) do { \
+ (c)->flags &= ~DUK_CAT_FLAG_CATCH_ENABLED; \
+ } while (0)
+#define DUK_CAT_CLEAR_FINALLY_ENABLED(c) do { \
+ (c)->flags &= ~DUK_CAT_FLAG_FINALLY_ENABLED; \
+ } while (0)
+#define DUK_CAT_CLEAR_CATCH_BINDING_ENABLED(c) do { \
+ (c)->flags &= ~DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \
+ } while (0)
+#define DUK_CAT_CLEAR_LEXENV_ACTIVE(c) do { \
+ (c)->flags &= ~DUK_CAT_FLAG_LEXENV_ACTIVE; \
+ } while (0)
+
+/*
+ * Thread defines
+ */
+
+#if defined(DUK_USE_ROM_STRINGS)
+#define DUK_HTHREAD_GET_STRING(thr,idx) \
+ ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)]))
+#else /* DUK_USE_ROM_STRINGS */
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HTHREAD_GET_STRING(thr,idx) \
+ ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((thr)->heap->heap_udata, (thr)->strs16[(idx)]))
+#else
+#define DUK_HTHREAD_GET_STRING(thr,idx) \
+ ((thr)->strs[(idx)])
+#endif
+#endif /* DUK_USE_ROM_STRINGS */
+
+/* values for the state field */
+#define DUK_HTHREAD_STATE_INACTIVE 1 /* thread not currently running */
+#define DUK_HTHREAD_STATE_RUNNING 2 /* thread currently running (only one at a time) */
+#define DUK_HTHREAD_STATE_RESUMED 3 /* thread resumed another thread (active but not running) */
+#define DUK_HTHREAD_STATE_YIELDED 4 /* thread has yielded */
+#define DUK_HTHREAD_STATE_TERMINATED 5 /* thread has terminated */
+
+/* Executor interrupt default interval when nothing else requires a
+ * smaller value. The default interval must be small enough to allow
+ * for reasonable execution timeout checking but large enough to keep
+ * impact on execution performance low.
+ */
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+#define DUK_HTHREAD_INTCTR_DEFAULT (256L * 1024L)
+#endif
+
+/*
+ * Assert context is valid: non-NULL pointer, fields look sane.
+ *
+ * This is used by public API call entrypoints to catch invalid 'ctx' pointers
+ * as early as possible; invalid 'ctx' pointers cause very odd and difficult to
+ * diagnose behavior so it's worth checking even when the check is not 100%.
+ */
+
+/* Assertions for internals. */
+#define DUK_ASSERT_HTHREAD_VALID(thr) do { \
+ DUK_ASSERT((thr) != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) (thr)) == DUK_HTYPE_OBJECT); \
+ DUK_ASSERT(DUK_HOBJECT_IS_THREAD((duk_hobject *) (thr))); \
+ DUK_ASSERT((thr)->unused1 == 0); \
+ DUK_ASSERT((thr)->unused2 == 0); \
+ } while (0)
+
+/* Assertions for public API calls; a bit stronger. */
+#define DUK_ASSERT_CTX_VALID(thr) do { \
+ DUK_ASSERT((thr) != NULL); \
+ DUK_ASSERT_HTHREAD_VALID((thr)); \
+ DUK_ASSERT((thr)->valstack != NULL); \
+ DUK_ASSERT((thr)->valstack_bottom != NULL); \
+ DUK_ASSERT((thr)->valstack_top != NULL); \
+ DUK_ASSERT((thr)->valstack_end != NULL); \
+ DUK_ASSERT((thr)->valstack_alloc_end != NULL); \
+ DUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack); \
+ DUK_ASSERT((thr)->valstack_end >= (thr)->valstack); \
+ DUK_ASSERT((thr)->valstack_top >= (thr)->valstack); \
+ DUK_ASSERT((thr)->valstack_top >= (thr)->valstack_bottom); \
+ DUK_ASSERT((thr)->valstack_end >= (thr)->valstack_top); \
+ DUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack_end); \
+ } while (0)
+
+/* Assertions for API call entry specifically. Checks 'ctx' but also may
+ * check internal state (e.g. not in a debugger transport callback).
+ */
+#define DUK_ASSERT_API_ENTRY(thr) do { \
+ DUK_ASSERT_CTX_VALID((thr)); \
+ DUK_ASSERT((thr)->heap != NULL); \
+ DUK_ASSERT((thr)->heap->dbg_calling_transport == 0); \
+ } while (0)
+
+/*
+ * Assertion helpers.
+ */
+
+#define DUK_ASSERT_STRIDX_VALID(val) \
+ DUK_ASSERT((duk_uint_t) (val) < DUK_HEAP_NUM_STRINGS)
+
+#define DUK_ASSERT_BIDX_VALID(val) \
+ DUK_ASSERT((duk_uint_t) (val) < DUK_NUM_BUILTINS)
+
+/*
+ * Misc
+ */
+
+/* Fast access to 'this' binding. Assumes there's a call in progress. */
+#define DUK_HTHREAD_THIS_PTR(thr) \
+ (DUK_ASSERT_EXPR((thr) != NULL), \
+ DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \
+ (thr)->valstack_bottom - 1)
+
+/*
+ * Struct defines
+ */
+
+/* Fields are ordered for alignment/packing. */
+struct duk_activation {
+ duk_tval tv_func; /* borrowed: full duk_tval for function being executed; for lightfuncs */
+ duk_hobject *func; /* borrowed: function being executed; for bound function calls, this is the final, real function, NULL for lightfuncs */
+ duk_activation *parent; /* previous (parent) activation (or NULL if none) */
+ duk_hobject *var_env; /* current variable environment (may be NULL if delayed) */
+ duk_hobject *lex_env; /* current lexical environment (may be NULL if delayed) */
+ duk_catcher *cat; /* current catcher (or NULL) */
+
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ /* Previous value of 'func' caller, restored when unwound. Only in use
+ * when 'func' is non-strict.
+ */
+ duk_hobject *prev_caller;
+#endif
+
+ duk_instr_t *curr_pc; /* next instruction to execute (points to 'func' bytecode, stable pointer), NULL for native calls */
+
+ /* bottom_byteoff and retval_byteoff are only used for book-keeping
+ * of Ecmascript-initiated calls, to allow returning to an Ecmascript
+ * function properly.
+ */
+
+ /* Bottom of valstack for this activation, used to reset
+ * valstack_bottom on return; offset is absolute. There's
+ * no need to track 'top' because native call handling deals
+ * with that using locals, and for Ecmascript returns 'nregs'
+ * indicates the necessary top.
+ */
+ duk_size_t bottom_byteoff;
+
+ /* Return value when returning to this activation (points to caller
+ * reg, not callee reg); offset is absolute (only set if activation is
+ * not topmost).
+ *
+ * Note: bottom_byteoff is always set, while retval_byteoff is only
+ * applicable for activations below the topmost one. Currently
+ * retval_byteoff for the topmost activation is considered garbage
+ * (and it not initialized on entry or cleared on return; may contain
+ * previous or garbage values).
+ */
+ duk_size_t retval_byteoff;
+
+ /* Current 'this' binding is the value just below bottom.
+ * Previously, 'this' binding was handled with an index to the
+ * (calling) valstack. This works for everything except tail
+ * calls, which must not "accumulate" valstack temps.
+ */
+
+ /* Value stack reserve (valstack_end) byte offset to be restored
+ * when returning to this activation. Only used by the bytecode
+ * executor.
+ */
+ duk_size_t reserve_byteoff;
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_uint32_t prev_line; /* needed for stepping */
+#endif
+
+ duk_small_uint_t flags;
+};
+
+struct duk_catcher {
+ duk_catcher *parent; /* previous (parent) catcher (or NULL if none) */
+ duk_hstring *h_varname; /* borrowed reference to catch variable name (or NULL if none) */
+ /* (reference is valid as long activation exists) */
+ duk_instr_t *pc_base; /* resume execution from pc_base or pc_base+1 (points to 'func' bytecode, stable pointer) */
+ duk_size_t idx_base; /* idx_base and idx_base+1 get completion value and type */
+ duk_uint32_t flags; /* type and control flags, label number */
+ /* XXX: could pack 'flags' and 'idx_base' to same value in practice,
+ * on 32-bit targets this would make duk_catcher 16 bytes.
+ */
+};
+
+struct duk_hthread {
+ /* Shared object part */
+ duk_hobject obj;
+
+ /* Pointer to bytecode executor's 'curr_pc' variable. Used to copy
+ * the current PC back into the topmost activation when activation
+ * state is about to change (or "syncing" is otherwise needed). This
+ * is rather awkward but important for performance, see execution.rst.
+ */
+ duk_instr_t **ptr_curr_pc;
+
+ /* Backpointers. */
+ duk_heap *heap;
+
+ /* Current strictness flag: affects API calls. */
+ duk_uint8_t strict;
+
+ /* Thread state. */
+ duk_uint8_t state;
+ duk_uint8_t unused1;
+ duk_uint8_t unused2;
+
+ /* XXX: Valstack and callstack are currently assumed to have non-NULL
+ * pointers. Relaxing this would not lead to big benefits (except
+ * perhaps for terminated threads).
+ */
+
+ /* Value stack: these are expressed as pointers for faster stack
+ * manipulation. [valstack,valstack_top[ is GC-reachable,
+ * [valstack_top,valstack_alloc_end[ is not GC-reachable but kept
+ * initialized as 'undefined'. [valstack,valstack_end[ is the
+ * guaranteed/reserved space and the valstack cannot be resized to
+ * a smaller size. [valstack_end,valstack_alloc_end[ is currently
+ * allocated slack that can be used to grow the current guaranteed
+ * space but may be shrunk away without notice.
+ *
+ *
+ * <----------------------- guaranteed --->
+ * <---- slack --->
+ * <--- frame --->
+ * .-------------+=============+----------+--------------.
+ * |xxxxxxxxxxxxx|yyyyyyyyyyyyy|uuuuuuuuuu|uuuuuuuuuuuuuu|
+ * `-------------+=============+----------+--------------'
+ *
+ * ^ ^ ^ ^ ^
+ * | | | | |
+ * valstack bottom top end alloc_end
+ *
+ * xxx = arbitrary values, below current frame
+ * yyy = arbitrary values, inside current frame
+ * uuu = outside active value stack, initialized to 'undefined'
+ */
+ duk_tval *valstack; /* start of valstack allocation */
+ duk_tval *valstack_end; /* end of valstack reservation/guarantee (exclusive) */
+ duk_tval *valstack_alloc_end; /* end of valstack allocation */
+ duk_tval *valstack_bottom; /* bottom of current frame */
+ duk_tval *valstack_top; /* top of current frame (exclusive) */
+
+ /* Call stack, represented as a linked list starting from the current
+ * activation (or NULL if nothing is active).
+ */
+ duk_activation *callstack_curr; /* current activation (or NULL if none) */
+ duk_size_t callstack_top; /* number of activation records in callstack (0 if none) */
+ duk_size_t callstack_preventcount; /* number of activation records in callstack preventing a yield */
+
+ /* Yield/resume book-keeping. */
+ duk_hthread *resumer; /* who resumed us (if any) */
+
+ /* Current compiler state (if any), used for augmenting SyntaxErrors. */
+ duk_compiler_ctx *compile_ctx;
+
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+ /* Interrupt counter for triggering a slow path check for execution
+ * timeout, debugger interaction such as breakpoints, etc. The value
+ * is valid for the current running thread, and both the init and
+ * counter values are copied whenever a thread switch occurs. It's
+ * important for the counter to be conveniently accessible for the
+ * bytecode executor inner loop for performance reasons.
+ */
+ duk_int_t interrupt_counter; /* countdown state */
+ duk_int_t interrupt_init; /* start value for current countdown */
+#endif
+
+ /* Builtin-objects; may or may not be shared with other threads,
+ * threads existing in different "compartments" will have different
+ * built-ins. Must be stored on a per-thread basis because there
+ * is no intermediate structure for a thread group / compartment.
+ * This takes quite a lot of space, currently 43x4 = 172 bytes on
+ * 32-bit platforms.
+ *
+ * In some cases the builtins array could be ROM based, but it's
+ * sometimes edited (e.g. for sandboxing) so it's better to keep
+ * this array in RAM.
+ */
+ duk_hobject *builtins[DUK_NUM_BUILTINS];
+
+ /* Convenience copies from heap/vm for faster access. */
+#if defined(DUK_USE_ROM_STRINGS)
+ /* No field needed when strings are in ROM. */
+#else
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t *strs16;
+#else
+ duk_hstring **strs;
+#endif
+#endif
+};
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to);
+DUK_INTERNAL_DECL void duk_hthread_create_builtin_objects(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_hthread_terminate(duk_hthread *thr);
+
+DUK_INTERNAL_DECL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act);
+DUK_INTERNAL_DECL void duk_hthread_activation_unwind_norz(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level);
+
+DUK_INTERNAL_DECL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat);
+DUK_INTERNAL_DECL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act);
+DUK_INTERNAL_DECL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act);
+
+#if defined(DUK_USE_FINALIZER_TORTURE)
+DUK_INTERNAL_DECL void duk_hthread_valstack_torture_realloc(duk_hthread *thr);
+#endif
+
+DUK_INTERNAL_DECL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud); /* indirect allocs */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act);
+#endif
+DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act);
+DUK_INTERNAL_DECL void duk_hthread_sync_currpc(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_hthread_sync_and_null_currpc(duk_hthread *thr);
+
+#endif /* DUK_HTHREAD_H_INCLUDED */
+/* #include duk_harray.h */
+#line 1 "duk_harray.h"
+/*
+ * Array object representation, used for actual Array instances.
+ *
+ * All objects with the exotic array behavior (which must coincide with having
+ * internal class array) MUST be duk_harrays. No other object can be a
+ * duk_harray. However, duk_harrays may not always have an array part.
+ */
+
+#if !defined(DUK_HARRAY_H_INCLUDED)
+#define DUK_HARRAY_H_INCLUDED
+
+#define DUK_ASSERT_HARRAY_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) (h))); \
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY((duk_hobject *) (h))); \
+ } while (0)
+
+#define DUK_HARRAY_LENGTH_WRITABLE(h) (!(h)->length_nonwritable)
+#define DUK_HARRAY_LENGTH_NONWRITABLE(h) ((h)->length_nonwritable)
+#define DUK_HARRAY_SET_LENGTH_WRITABLE(h) do { (h)->length_nonwritable = 0; } while (0)
+#define DUK_HARRAY_SET_LENGTH_NONWRITABLE(h) do { (h)->length_nonwritable = 1; } while (0)
+
+struct duk_harray {
+ /* Shared object part. */
+ duk_hobject obj;
+
+ /* Array .length.
+ *
+ * At present Array .length may be smaller, equal, or even larger
+ * than the allocated underlying array part. Fast path code must
+ * always take this into account carefully.
+ */
+ duk_uint32_t length;
+
+ /* Array .length property attributes. The property is always
+ * non-enumerable and non-configurable. It's initially writable
+ * but per Object.defineProperty() rules it can be made non-writable
+ * even if it is non-configurable. Thus we need to track the
+ * writability explicitly.
+ *
+ * XXX: this field to be eliminated and moved into duk_hobject
+ * flags field to save space.
+ */
+ duk_bool_t length_nonwritable;
+};
+
+#endif /* DUK_HARRAY_H_INCLUDED */
+/* #include duk_henv.h */
+#line 1 "duk_henv.h"
+/*
+ * Environment object representation.
+ */
+
+#if !defined(DUK_HENV_H_INCLUDED)
+#define DUK_HENV_H_INCLUDED
+
+#define DUK_ASSERT_HDECENV_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) (h))); \
+ DUK_ASSERT((h)->thread == NULL || (h)->varmap != NULL); \
+ } while (0)
+
+#define DUK_ASSERT_HOBJENV_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT(DUK_HOBJECT_IS_OBJENV((duk_hobject *) (h))); \
+ DUK_ASSERT((h)->target != NULL); \
+ DUK_ASSERT((h)->has_this == 0 || (h)->has_this == 1); \
+ } while (0)
+
+struct duk_hdecenv {
+ /* Shared object part. */
+ duk_hobject obj;
+
+ /* These control variables provide enough information to access live
+ * variables for a closure that is still open. If thread == NULL,
+ * the record is closed and the identifiers are in the property table.
+ */
+ duk_hthread *thread;
+ duk_hobject *varmap;
+ duk_size_t regbase_byteoff;
+};
+
+struct duk_hobjenv {
+ /* Shared object part. */
+ duk_hobject obj;
+
+ /* Target object and 'this' binding for object binding. */
+ duk_hobject *target;
+
+ /* The 'target' object is used as a this binding in only some object
+ * environments. For example, the global environment does not provide
+ * a this binding, but a with statement does.
+ */
+ duk_bool_t has_this;
+};
+
+#endif /* DUK_HENV_H_INCLUDED */
+/* #include duk_hbuffer.h */
+#line 1 "duk_hbuffer.h"
+/*
+ * Heap buffer representation.
+ *
+ * Heap allocated user data buffer which is either:
+ *
+ * 1. A fixed size buffer (data follows header statically)
+ * 2. A dynamic size buffer (data pointer follows header)
+ *
+ * The data pointer for a variable size buffer of zero size may be NULL.
+ */
+
+#if !defined(DUK_HBUFFER_H_INCLUDED)
+#define DUK_HBUFFER_H_INCLUDED
+
+/*
+ * Flags
+ *
+ * Fixed buffer: 0
+ * Dynamic buffer: DUK_HBUFFER_FLAG_DYNAMIC
+ * External buffer: DUK_HBUFFER_FLAG_DYNAMIC | DUK_HBUFFER_FLAG_EXTERNAL
+ */
+
+#define DUK_HBUFFER_FLAG_DYNAMIC DUK_HEAPHDR_USER_FLAG(0) /* buffer is behind a pointer, dynamic or external */
+#define DUK_HBUFFER_FLAG_EXTERNAL DUK_HEAPHDR_USER_FLAG(1) /* buffer pointer is to an externally allocated buffer */
+
+#define DUK_HBUFFER_HAS_DYNAMIC(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC)
+#define DUK_HBUFFER_HAS_EXTERNAL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL)
+
+#define DUK_HBUFFER_SET_DYNAMIC(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC)
+#define DUK_HBUFFER_SET_EXTERNAL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL)
+
+#define DUK_HBUFFER_CLEAR_DYNAMIC(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC)
+#define DUK_HBUFFER_CLEAR_EXTERNAL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL)
+
+/*
+ * Misc defines
+ */
+
+/* Impose a maximum buffer length for now. Restricted artificially to
+ * ensure resize computations or adding a heap header length won't
+ * overflow size_t and that a signed duk_int_t can hold a buffer
+ * length. The limit should be synchronized with DUK_HSTRING_MAX_BYTELEN.
+ */
+
+#if defined(DUK_USE_BUFLEN16)
+#define DUK_HBUFFER_MAX_BYTELEN (0x0000ffffUL)
+#else
+/* Intentionally not 0x7fffffffUL; at least JSON code expects that
+ * 2*len + 2 fits in 32 bits.
+ */
+#define DUK_HBUFFER_MAX_BYTELEN (0x7ffffffeUL)
+#endif
+
+/*
+ * Field access
+ */
+
+#if defined(DUK_USE_BUFLEN16)
+/* size stored in duk_heaphdr unused flag bits */
+#define DUK_HBUFFER_GET_SIZE(x) ((x)->hdr.h_flags >> 16)
+#define DUK_HBUFFER_SET_SIZE(x,v) do { \
+ duk_size_t duk__v; \
+ duk__v = (v); \
+ DUK_ASSERT(duk__v <= 0xffffUL); \
+ (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | (((duk_uint32_t) duk__v) << 16); \
+ } while (0)
+#define DUK_HBUFFER_ADD_SIZE(x,dv) do { \
+ (x)->hdr.h_flags += ((dv) << 16); \
+ } while (0)
+#define DUK_HBUFFER_SUB_SIZE(x,dv) do { \
+ (x)->hdr.h_flags -= ((dv) << 16); \
+ } while (0)
+#else
+#define DUK_HBUFFER_GET_SIZE(x) (((duk_hbuffer *) (x))->size)
+#define DUK_HBUFFER_SET_SIZE(x,v) do { \
+ ((duk_hbuffer *) (x))->size = (v); \
+ } while (0)
+#define DUK_HBUFFER_ADD_SIZE(x,dv) do { \
+ (x)->size += (dv); \
+ } while (0)
+#define DUK_HBUFFER_SUB_SIZE(x,dv) do { \
+ (x)->size -= (dv); \
+ } while (0)
+#endif
+
+#define DUK_HBUFFER_FIXED_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x))
+#define DUK_HBUFFER_FIXED_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x))
+
+#define DUK_HBUFFER_DYNAMIC_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x))
+#define DUK_HBUFFER_DYNAMIC_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v))
+#define DUK_HBUFFER_DYNAMIC_ADD_SIZE(x,dv) DUK_HBUFFER_ADD_SIZE((duk_hbuffer *) (x), (dv))
+#define DUK_HBUFFER_DYNAMIC_SUB_SIZE(x,dv) DUK_HBUFFER_SUB_SIZE((duk_hbuffer *) (x), (dv))
+
+#define DUK_HBUFFER_EXTERNAL_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x))
+#define DUK_HBUFFER_EXTERNAL_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v))
+
+#define DUK_HBUFFER_FIXED_GET_DATA_PTR(heap,x) ((duk_uint8_t *) (((duk_hbuffer_fixed *) (x)) + 1))
+
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) \
+ ((void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (x))->h_extra16))
+#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v) do { \
+ ((duk_heaphdr *) (x))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \
+ } while (0)
+#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x) do { \
+ ((duk_heaphdr *) (x))->h_extra16 = 0; /* assume 0 <=> NULL */ \
+ } while (0)
+#else
+#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) ((x)->curr_alloc)
+#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v) do { \
+ (x)->curr_alloc = (void *) (v); \
+ } while (0)
+#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x) do { \
+ (x)->curr_alloc = (void *) NULL; \
+ } while (0)
+#endif
+
+/* No pointer compression because pointer is potentially outside of
+ * Duktape heap.
+ */
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \
+ ((void *) (x)->curr_alloc)
+#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v) do { \
+ (x)->curr_alloc = (void *) (v); \
+ } while (0)
+#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x) do { \
+ (x)->curr_alloc = (void *) NULL; \
+ } while (0)
+#else
+#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \
+ ((void *) (x)->curr_alloc)
+#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v) do { \
+ (x)->curr_alloc = (void *) (v); \
+ } while (0)
+#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x) do { \
+ (x)->curr_alloc = (void *) NULL; \
+ } while (0)
+#endif
+
+/* Get a pointer to the current buffer contents (matching current allocation
+ * size). May be NULL for zero size dynamic/external buffer.
+ */
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HBUFFER_GET_DATA_PTR(heap,x) ( \
+ DUK_HBUFFER_HAS_DYNAMIC((x)) ? \
+ ( \
+ DUK_HBUFFER_HAS_EXTERNAL((x)) ? \
+ DUK_HBUFFER_EXTERNAL_GET_DATA_PTR((heap), (duk_hbuffer_external *) (x)) : \
+ DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) \
+ ) : \
+ DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \
+ )
+#else
+/* Without heap pointer compression duk_hbuffer_dynamic and duk_hbuffer_external
+ * have the same layout so checking for fixed vs. dynamic (or external) is enough.
+ */
+#define DUK_HBUFFER_GET_DATA_PTR(heap,x) ( \
+ DUK_HBUFFER_HAS_DYNAMIC((x)) ? \
+ DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) : \
+ DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \
+ )
+#endif
+
+/*
+ * Structs
+ */
+
+/* Shared prefix for all buffer types. */
+struct duk_hbuffer {
+ duk_heaphdr hdr;
+
+ /* It's not strictly necessary to track the current size, but
+ * it is useful for writing robust native code.
+ */
+
+ /* Current size. */
+#if defined(DUK_USE_BUFLEN16)
+ /* Stored in duk_heaphdr unused flags. */
+#else
+ duk_size_t size;
+#endif
+
+ /*
+ * Data following the header depends on the DUK_HBUFFER_FLAG_DYNAMIC
+ * flag.
+ *
+ * If the flag is clear (the buffer is a fixed size one), the buffer
+ * data follows the header directly, consisting of 'size' bytes.
+ *
+ * If the flag is set, the actual buffer is allocated separately, and
+ * a few control fields follow the header. Specifically:
+ *
+ * - a "void *" pointing to the current allocation
+ * - a duk_size_t indicating the full allocated size (always >= 'size')
+ *
+ * If DUK_HBUFFER_FLAG_EXTERNAL is set, the buffer has been allocated
+ * by user code, so that Duktape won't be able to resize it and won't
+ * free it. This allows buffers to point to e.g. an externally
+ * allocated structure such as a frame buffer.
+ *
+ * Unlike strings, no terminator byte (NUL) is guaranteed after the
+ * data. This would be convenient, but would pad aligned user buffers
+ * unnecessarily upwards in size. For instance, if user code requested
+ * a 64-byte dynamic buffer, 65 bytes would actually be allocated which
+ * would then potentially round upwards to perhaps 68 or 72 bytes.
+ */
+};
+
+/* Fixed buffer; data follows struct, with proper alignment guaranteed by
+ * struct size.
+ */
+#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA)
+#pragma pack(push, 8)
+#endif
+struct duk_hbuffer_fixed {
+ /* A union is used here as a portable struct size / alignment trick:
+ * by adding a 32-bit or a 64-bit (unused) union member, the size of
+ * the struct is effectively forced to be a multiple of 4 or 8 bytes
+ * (respectively) without increasing the size of the struct unless
+ * necessary.
+ */
+ union {
+ struct {
+ duk_heaphdr hdr;
+#if defined(DUK_USE_BUFLEN16)
+ /* Stored in duk_heaphdr unused flags. */
+#else
+ duk_size_t size;
+#endif
+ } s;
+#if (DUK_USE_ALIGN_BY == 4)
+ duk_uint32_t dummy_for_align4;
+#elif (DUK_USE_ALIGN_BY == 8)
+ duk_double_t dummy_for_align8;
+#elif (DUK_USE_ALIGN_BY == 1)
+ /* no extra padding */
+#else
+#error invalid DUK_USE_ALIGN_BY
+#endif
+ } u;
+
+ /*
+ * Data follows the struct header. The struct size is padded by the
+ * compiler based on the struct members. This guarantees that the
+ * buffer data will be aligned-by-4 but not necessarily aligned-by-8.
+ *
+ * On platforms where alignment does not matter, the struct padding
+ * could be removed (if there is any). On platforms where alignment
+ * by 8 is required, the struct size must be forced to be a multiple
+ * of 8 by some means. Without it, some user code may break, and also
+ * Duktape itself breaks (e.g. the compiler stores duk_tvals in a
+ * dynamic buffer).
+ */
+}
+#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_GCC_ATTR)
+__attribute__ ((aligned (8)))
+#elif (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_CLANG_ATTR)
+__attribute__ ((aligned (8)))
+#endif
+;
+#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA)
+#pragma pack(pop)
+#endif
+
+/* Dynamic buffer with 'curr_alloc' pointing to a dynamic area allocated using
+ * heap allocation primitives. Also used for external buffers when low memory
+ * options are not used.
+ */
+struct duk_hbuffer_dynamic {
+ duk_heaphdr hdr;
+
+#if defined(DUK_USE_BUFLEN16)
+ /* Stored in duk_heaphdr unused flags. */
+#else
+ duk_size_t size;
+#endif
+
+#if defined(DUK_USE_HEAPPTR16)
+ /* Stored in duk_heaphdr h_extra16. */
+#else
+ void *curr_alloc; /* may be NULL if alloc_size == 0 */
+#endif
+
+ /*
+ * Allocation size for 'curr_alloc' is alloc_size. There is no
+ * automatic NUL terminator for buffers (see above for rationale).
+ *
+ * 'curr_alloc' is explicitly allocated with heap allocation
+ * primitives and will thus always have alignment suitable for
+ * e.g. duk_tval and an IEEE double.
+ */
+};
+
+/* External buffer with 'curr_alloc' managed by user code and pointing to an
+ * arbitrary address. When heap pointer compression is not used, this struct
+ * has the same layout as duk_hbuffer_dynamic.
+ */
+struct duk_hbuffer_external {
+ duk_heaphdr hdr;
+
+#if defined(DUK_USE_BUFLEN16)
+ /* Stored in duk_heaphdr unused flags. */
+#else
+ duk_size_t size;
+#endif
+
+ /* Cannot be compressed as a heap pointer because may point to
+ * an arbitrary address.
+ */
+ void *curr_alloc; /* may be NULL if alloc_size == 0 */
+};
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata);
+DUK_INTERNAL_DECL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud); /* indirect allocs */
+
+/* dynamic buffer ops */
+DUK_INTERNAL_DECL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size);
+DUK_INTERNAL_DECL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf);
+
+#endif /* DUK_HBUFFER_H_INCLUDED */
+/* #include duk_hproxy.h */
+#line 1 "duk_hproxy.h"
+/*
+ * Proxy object representation.
+ */
+
+#if !defined(DUK_HPROXY_H_INCLUDED)
+#define DUK_HPROXY_H_INCLUDED
+
+#define DUK_ASSERT_HPROXY_VALID(h) do { \
+ DUK_ASSERT((h) != NULL); \
+ DUK_ASSERT((h)->target != NULL); \
+ DUK_ASSERT((h)->handler != NULL); \
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((duk_hobject *) (h))); \
+ } while (0)
+
+struct duk_hproxy {
+ /* Shared object part. */
+ duk_hobject obj;
+
+ /* Proxy target object. */
+ duk_hobject *target;
+
+ /* Proxy handlers (traps). */
+ duk_hobject *handler;
+};
+
+#endif /* DUK_HPROXY_H_INCLUDED */
+/* #include duk_heap.h */
+#line 1 "duk_heap.h"
+/*
+ * Heap structure.
+ *
+ * Heap contains allocated heap objects, interned strings, and built-in
+ * strings for one or more threads.
+ */
+
+#if !defined(DUK_HEAP_H_INCLUDED)
+#define DUK_HEAP_H_INCLUDED
+
+/* alloc function typedefs in duktape.h */
+
+/*
+ * Heap flags
+ */
+
+#define DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED (1U << 0) /* mark-and-sweep marking reached a recursion limit and must use multi-pass marking */
+#define DUK_HEAP_FLAG_INTERRUPT_RUNNING (1U << 1) /* executor interrupt running (used to avoid nested interrupts) */
+#define DUK_HEAP_FLAG_FINALIZER_NORESCUE (1U << 2) /* heap destruction ongoing, finalizer rescue no longer possible */
+#define DUK_HEAP_FLAG_DEBUGGER_PAUSED (1U << 3) /* debugger is paused: talk with debug client until step/resume */
+
+#define DUK__HEAP_HAS_FLAGS(heap,bits) ((heap)->flags & (bits))
+#define DUK__HEAP_SET_FLAGS(heap,bits) do { \
+ (heap)->flags |= (bits); \
+ } while (0)
+#define DUK__HEAP_CLEAR_FLAGS(heap,bits) do { \
+ (heap)->flags &= ~(bits); \
+ } while (0)
+
+#define DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)
+#define DUK_HEAP_HAS_INTERRUPT_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)
+#define DUK_HEAP_HAS_FINALIZER_NORESCUE(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)
+#define DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED)
+
+#define DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)
+#define DUK_HEAP_SET_INTERRUPT_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)
+#define DUK_HEAP_SET_FINALIZER_NORESCUE(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)
+#define DUK_HEAP_SET_DEBUGGER_PAUSED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED)
+
+#define DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)
+#define DUK_HEAP_CLEAR_INTERRUPT_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)
+#define DUK_HEAP_CLEAR_FINALIZER_NORESCUE(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)
+#define DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED)
+
+/*
+ * Longjmp types, also double as identifying continuation type for a rethrow (in 'finally')
+ */
+
+#define DUK_LJ_TYPE_UNKNOWN 0 /* unused */
+#define DUK_LJ_TYPE_THROW 1 /* value1 -> error object */
+#define DUK_LJ_TYPE_YIELD 2 /* value1 -> yield value, iserror -> error / normal */
+#define DUK_LJ_TYPE_RESUME 3 /* value1 -> resume value, value2 -> resumee thread, iserror -> error/normal */
+#define DUK_LJ_TYPE_BREAK 4 /* value1 -> label number, pseudo-type to indicate a break continuation (for ENDFIN) */
+#define DUK_LJ_TYPE_CONTINUE 5 /* value1 -> label number, pseudo-type to indicate a continue continuation (for ENDFIN) */
+#define DUK_LJ_TYPE_RETURN 6 /* value1 -> return value, pseudo-type to indicate a return continuation (for ENDFIN) */
+#define DUK_LJ_TYPE_NORMAL 7 /* no value, pseudo-type to indicate a normal continuation (for ENDFIN) */
+
+/*
+ * Mark-and-sweep flags
+ *
+ * These are separate from heap level flags now but could be merged.
+ * The heap structure only contains a 'base mark-and-sweep flags'
+ * field and the GC caller can impose further flags.
+ */
+
+/* Emergency mark-and-sweep: try extra hard, even at the cost of
+ * performance.
+ */
+#define DUK_MS_FLAG_EMERGENCY (1U << 0)
+
+/* Voluntary mark-and-sweep: triggered periodically. */
+#define DUK_MS_FLAG_VOLUNTARY (1U << 1)
+
+/* Postpone rescue decisions for reachable objects with FINALIZED set.
+ * Used during finalize_list processing to avoid incorrect rescue
+ * decisions due to finalize_list being a reachability root.
+ */
+#define DUK_MS_FLAG_POSTPONE_RESCUE (1U << 2)
+
+/* Don't compact objects; needed during object property table resize
+ * to prevent a recursive resize. It would suffice to protect only the
+ * current object being resized, but this is not yet implemented.
+ */
+#define DUK_MS_FLAG_NO_OBJECT_COMPACTION (1U << 3)
+
+/*
+ * Thread switching
+ *
+ * To switch heap->curr_thread, use the macro below so that interrupt counters
+ * get updated correctly. The macro allows a NULL target thread because that
+ * happens e.g. in call handling.
+ */
+
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+#define DUK_HEAP_SWITCH_THREAD(heap,newthr) duk_heap_switch_thread((heap), (newthr))
+#else
+#define DUK_HEAP_SWITCH_THREAD(heap,newthr) do { \
+ (heap)->curr_thread = (newthr); \
+ } while (0)
+#endif
+
+/*
+ * Stats
+ */
+
+#if defined(DUK_USE_DEBUG)
+#define DUK_STATS_INC(heap,fieldname) do { \
+ (heap)->fieldname += 1; \
+ } while (0)
+#else
+#define DUK_STATS_INC(heap,fieldname) do {} while (0)
+#endif
+
+/*
+ * Other heap related defines
+ */
+
+/* Mark-and-sweep interval is relative to combined count of objects and
+ * strings kept in the heap during the latest mark-and-sweep pass.
+ * Fixed point .8 multiplier and .0 adder. Trigger count (interval) is
+ * decreased by each (re)allocation attempt (regardless of size), and each
+ * refzero processed object.
+ *
+ * 'SKIP' indicates how many (re)allocations to wait until a retry if
+ * GC is skipped because there is no thread do it with yet (happens
+ * only during init phases).
+ */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 12800L /* 50x heap size */
+#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L
+#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L
+#else
+#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 256L /* 1x heap size */
+#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L
+#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L
+#endif
+
+/* GC torture. */
+#if defined(DUK_USE_GC_TORTURE)
+#define DUK_GC_TORTURE(heap) do { duk_heap_mark_and_sweep((heap), 0); } while (0)
+#else
+#define DUK_GC_TORTURE(heap) do { } while (0)
+#endif
+
+/* Stringcache is used for speeding up char-offset-to-byte-offset
+ * translations for non-ASCII strings.
+ */
+#define DUK_HEAP_STRCACHE_SIZE 4
+#define DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT 16 /* strings up to the this length are not cached */
+
+/* Some list management macros. */
+#define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap,hdr) duk_heap_insert_into_heap_allocated((heap), (hdr))
+#if defined(DUK_USE_REFERENCE_COUNTING)
+#define DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap,hdr) duk_heap_remove_from_heap_allocated((heap), (hdr))
+#endif
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+#define DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap,hdr) duk_heap_insert_into_finalize_list((heap), (hdr))
+#define DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap,hdr) duk_heap_remove_from_finalize_list((heap), (hdr))
+#endif
+
+/*
+ * Built-in strings
+ */
+
+/* heap string indices are autogenerated in duk_strings.h */
+#if defined(DUK_USE_ROM_STRINGS)
+#define DUK_HEAP_GET_STRING(heap,idx) \
+ ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)]))
+#else /* DUK_USE_ROM_STRINGS */
+#if defined(DUK_USE_HEAPPTR16)
+#define DUK_HEAP_GET_STRING(heap,idx) \
+ ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (heap)->strs16[(idx)]))
+#else
+#define DUK_HEAP_GET_STRING(heap,idx) \
+ ((heap)->strs[(idx)])
+#endif
+#endif /* DUK_USE_ROM_STRINGS */
+
+/*
+ * Raw memory calls: relative to heap, but no GC interaction
+ */
+
+#define DUK_ALLOC_RAW(heap,size) \
+ ((heap)->alloc_func((heap)->heap_udata, (size)))
+
+#define DUK_REALLOC_RAW(heap,ptr,newsize) \
+ ((heap)->realloc_func((heap)->heap_udata, (void *) (ptr), (newsize)))
+
+#define DUK_FREE_RAW(heap,ptr) \
+ ((heap)->free_func((heap)->heap_udata, (void *) (ptr)))
+
+/*
+ * Memory calls: relative to heap, GC interaction, but no error throwing.
+ *
+ * XXX: Currently a mark-and-sweep triggered by memory allocation will run
+ * using the heap->heap_thread. This thread is also used for running
+ * mark-and-sweep finalization; this is not ideal because it breaks the
+ * isolation between multiple global environments.
+ *
+ * Notes:
+ *
+ * - DUK_FREE() is required to ignore NULL and any other possible return
+ * value of a zero-sized alloc/realloc (same as ANSI C free()).
+ *
+ * - There is no DUK_REALLOC_ZEROED because we don't assume to know the
+ * old size. Caller must zero the reallocated memory.
+ *
+ * - DUK_REALLOC_INDIRECT() must be used when a mark-and-sweep triggered
+ * by an allocation failure might invalidate the original 'ptr', thus
+ * causing a realloc retry to use an invalid pointer. Example: we're
+ * reallocating the value stack and a finalizer resizes the same value
+ * stack during mark-and-sweep. The indirect variant requests for the
+ * current location of the pointer being reallocated using a callback
+ * right before every realloc attempt; this circuitous approach is used
+ * to avoid strict aliasing issues in a more straightforward indirect
+ * pointer (void **) approach. Note: the pointer in the storage
+ * location is read but is NOT updated; the caller must do that.
+ */
+
+/* callback for indirect reallocs, request for current pointer */
+typedef void *(*duk_mem_getptr)(duk_heap *heap, void *ud);
+
+#define DUK_ALLOC(heap,size) duk_heap_mem_alloc((heap), (size))
+#define DUK_ALLOC_ZEROED(heap,size) duk_heap_mem_alloc_zeroed((heap), (size))
+#define DUK_REALLOC(heap,ptr,newsize) duk_heap_mem_realloc((heap), (ptr), (newsize))
+#define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize) duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize))
+#define DUK_FREE(heap,ptr) duk_heap_mem_free((heap), (ptr))
+
+/*
+ * Checked allocation, relative to a thread
+ *
+ * DUK_FREE_CHECKED() doesn't actually throw, but accepts a 'thr' argument
+ * for convenience.
+ */
+
+#define DUK_ALLOC_CHECKED(thr,size) duk_heap_mem_alloc_checked((thr), (size))
+#define DUK_ALLOC_CHECKED_ZEROED(thr,size) duk_heap_mem_alloc_checked_zeroed((thr), (size))
+#define DUK_FREE_CHECKED(thr,ptr) duk_heap_mem_free((thr)->heap, (ptr))
+
+/*
+ * Memory constants
+ */
+
+#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT 10 /* Retry allocation after mark-and-sweep for this
+ * many times. A single mark-and-sweep round is
+ * not guaranteed to free all unreferenced memory
+ * because of finalization (in fact, ANY number of
+ * rounds is strictly not enough).
+ */
+
+#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT 3 /* Starting from this round, use emergency mode
+ * for mark-and-sweep.
+ */
+
+/*
+ * Debugger support
+ */
+
+/* Maximum number of breakpoints. Only breakpoints that are set are
+ * consulted so increasing this has no performance impact.
+ */
+#define DUK_HEAP_MAX_BREAKPOINTS 16
+
+/* Opcode interval for a Date-based status/peek rate limit check. Only
+ * relevant when debugger is attached. Requesting a timestamp may be a
+ * slow operation on some platforms so this shouldn't be too low. On the
+ * other hand a high value makes Duktape react to a pause request slowly.
+ */
+#define DUK_HEAP_DBG_RATELIMIT_OPCODES 4000
+
+/* Milliseconds between status notify and transport peeks. */
+#define DUK_HEAP_DBG_RATELIMIT_MILLISECS 200
+
+/* Debugger pause flags. */
+#define DUK_PAUSE_FLAG_ONE_OPCODE (1U << 0) /* pause when a single opcode has been executed */
+#define DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE (1U << 1) /* one opcode pause actually active; artifact of current implementation */
+#define DUK_PAUSE_FLAG_LINE_CHANGE (1U << 2) /* pause when current line number changes */
+#define DUK_PAUSE_FLAG_FUNC_ENTRY (1U << 3) /* pause when entering a function */
+#define DUK_PAUSE_FLAG_FUNC_EXIT (1U << 4) /* pause when exiting current function */
+#define DUK_PAUSE_FLAG_CAUGHT_ERROR (1U << 5) /* pause when about to throw an error that is caught */
+#define DUK_PAUSE_FLAG_UNCAUGHT_ERROR (1U << 6) /* pause when about to throw an error that won't be caught */
+
+struct duk_breakpoint {
+ duk_hstring *filename;
+ duk_uint32_t line;
+};
+
+/*
+ * String cache should ideally be at duk_hthread level, but that would
+ * cause string finalization to slow down relative to the number of
+ * threads; string finalization must check the string cache for "weak"
+ * references to the string being finalized to avoid dead pointers.
+ *
+ * Thus, string caches are now at the heap level now.
+ */
+
+struct duk_strcache {
+ duk_hstring *h;
+ duk_uint32_t bidx;
+ duk_uint32_t cidx;
+};
+
+/*
+ * Longjmp state, contains the information needed to perform a longjmp.
+ * Longjmp related values are written to value1, value2, and iserror.
+ */
+
+struct duk_ljstate {
+ duk_jmpbuf *jmpbuf_ptr; /* current setjmp() catchpoint */
+ duk_small_uint_t type; /* longjmp type */
+ duk_bool_t iserror; /* isError flag for yield */
+ duk_tval value1; /* 1st related value (type specific) */
+ duk_tval value2; /* 2nd related value (type specific) */
+};
+
+#define DUK_ASSERT_LJSTATE_UNSET(heap) do { \
+ DUK_ASSERT(heap != NULL); \
+ DUK_ASSERT(heap->lj.type == DUK_LJ_TYPE_UNKNOWN); \
+ DUK_ASSERT(heap->lj.iserror == 0); \
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value1)); \
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value2)); \
+ } while (0)
+#define DUK_ASSERT_LJSTATE_SET(heap) do { \
+ DUK_ASSERT(heap != NULL); \
+ DUK_ASSERT(heap->lj.type != DUK_LJ_TYPE_UNKNOWN); \
+ } while (0)
+
+/*
+ * Main heap structure
+ */
+
+struct duk_heap {
+ duk_small_uint_t flags;
+
+ /* Allocator functions. */
+ duk_alloc_function alloc_func;
+ duk_realloc_function realloc_func;
+ duk_free_function free_func;
+
+ /* Heap udata, used for allocator functions but also for other heap
+ * level callbacks like fatal function, pointer compression, etc.
+ */
+ void *heap_udata;
+
+ /* Fatal error handling, called e.g. when a longjmp() is needed but
+ * lj.jmpbuf_ptr is NULL. fatal_func must never return; it's not
+ * declared as "noreturn" because doing that for typedefs is a bit
+ * challenging portability-wise.
+ */
+ duk_fatal_function fatal_func;
+
+ /* Main list of allocated heap objects. Objects are either here,
+ * in finalize_list waiting for processing, or in refzero_list
+ * temporarily while a DECREF refzero cascade finishes.
+ */
+ duk_heaphdr *heap_allocated;
+
+ /* Temporary work list for freeing a cascade of objects when a DECREF
+ * (or DECREF_NORZ) encounters a zero refcount. Using a work list
+ * allows fixed C stack size when refcounts go to zero for a chain of
+ * objects. Outside of DECREF this is always a NULL because DECREF is
+ * processed without side effects (only memory free calls).
+ */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_heaphdr *refzero_list;
+#endif
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ /* Work list for objects to be finalized. */
+ duk_heaphdr *finalize_list;
+#if defined(DUK_USE_ASSERTIONS)
+ /* Object whose finalizer is executing right now (no nesting). */
+ duk_heaphdr *currently_finalizing;
+#endif
+#endif
+
+ /* Freelist for duk_activations and duk_catchers. */
+#if defined(DUK_USE_CACHE_ACTIVATION)
+ duk_activation *activation_free;
+#endif
+#if defined(DUK_USE_CACHE_CATCHER)
+ duk_catcher *catcher_free;
+#endif
+
+ /* Voluntary mark-and-sweep trigger counter. Intentionally signed
+ * because we continue decreasing the value when voluntary GC cannot
+ * run.
+ */
+#if defined(DUK_USE_VOLUNTARY_GC)
+ duk_int_t ms_trigger_counter;
+#endif
+
+ /* Mark-and-sweep recursion control: too deep recursion causes
+ * multi-pass processing to avoid growing C stack without bound.
+ */
+ duk_uint_t ms_recursion_depth;
+
+ /* Mark-and-sweep flags automatically active (used for critical sections). */
+ duk_small_uint_t ms_base_flags;
+
+ /* Mark-and-sweep running flag. Prevents re-entry, and also causes
+ * refzero events to be ignored (= objects won't be queued to refzero_list).
+ */
+ duk_uint_t ms_running;
+
+ /* Mark-and-sweep prevent count, stacking. Used to avoid M&S side
+ * effects (besides finalizers which are controlled separately) such
+ * as compacting the string table or object property tables. This
+ * is also bumped when ms_running is set to prevent recursive re-entry.
+ * Can also be bumped when mark-and-sweep is not running.
+ */
+ duk_uint_t ms_prevent_count;
+
+ /* Finalizer processing prevent count, stacking. Bumped when finalizers
+ * are processed to prevent recursive finalizer processing (first call site
+ * processing finalizers handles all finalizers until the list is empty).
+ * Can also be bumped explicitly to prevent finalizer execution.
+ */
+ duk_uint_t pf_prevent_count;
+
+ /* When processing finalize_list, don't actually run finalizers but
+ * queue finalizable objects back to heap_allocated as is. This is
+ * used during heap destruction to deal with finalizers that keep
+ * on creating more finalizable garbage.
+ */
+ duk_uint_t pf_skip_finalizers;
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* Set when we're in a critical path where an error throw would cause
+ * e.g. sandboxing/protected call violations or state corruption. This
+ * is just used for asserts.
+ */
+ duk_bool_t error_not_allowed;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* Set when heap is still being initialized, helps with writing
+ * some assertions.
+ */
+ duk_bool_t heap_initializing;
+#endif
+
+ /* Marker for detecting internal "double faults", errors thrown when
+ * we're trying to create an error object, see duk_error_throw.c.
+ */
+ duk_bool_t creating_error;
+
+ /* Marker for indicating we're calling a user error augmentation
+ * (errCreate/errThrow) function. Errors created/thrown during
+ * such a call are not augmented.
+ */
+#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ duk_bool_t augmenting_error;
+#endif
+
+ /* Longjmp state. */
+ duk_ljstate lj;
+
+ /* Heap thread, used internally and for finalization. */
+ duk_hthread *heap_thread;
+
+ /* Current running thread. */
+ duk_hthread *curr_thread;
+
+ /* Heap level "stash" object (e.g., various reachability roots). */
+ duk_hobject *heap_object;
+
+ /* duk_handle_call / duk_handle_safe_call recursion depth limiting */
+ duk_int_t call_recursion_depth;
+ duk_int_t call_recursion_limit;
+
+ /* Mix-in value for computing string hashes; should be reasonably unpredictable. */
+ duk_uint32_t hash_seed;
+
+ /* Random number state for duk_util_tinyrandom.c. */
+#if !defined(DUK_USE_GET_RANDOM_DOUBLE)
+#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS)
+ duk_uint32_t rnd_state; /* State for Shamir's three-op algorithm */
+#else
+ duk_uint64_t rnd_state[2]; /* State for xoroshiro128+ */
+#endif
+#endif
+
+ /* Counter for unique local symbol creation. */
+ /* XXX: When 64-bit types are available, it would be more efficient to
+ * use a duk_uint64_t at least for incrementing but maybe also for
+ * string formatting in the Symbol constructor.
+ */
+ duk_uint32_t sym_counter[2];
+
+ /* For manual debugging: instruction count based on executor and
+ * interrupt counter book-keeping. Inspect debug logs to see how
+ * they match up.
+ */
+#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)
+ duk_int_t inst_count_exec;
+ duk_int_t inst_count_interrupt;
+#endif
+
+ /* Debugger state. */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ /* Callbacks and udata; dbg_read_cb != NULL is used to indicate attached state. */
+ duk_debug_read_function dbg_read_cb; /* required, NULL implies detached */
+ duk_debug_write_function dbg_write_cb; /* required */
+ duk_debug_peek_function dbg_peek_cb;
+ duk_debug_read_flush_function dbg_read_flush_cb;
+ duk_debug_write_flush_function dbg_write_flush_cb;
+ duk_debug_request_function dbg_request_cb;
+ duk_debug_detached_function dbg_detached_cb;
+ void *dbg_udata;
+
+ /* The following are only relevant when debugger is attached. */
+ duk_bool_t dbg_processing; /* currently processing messages or breakpoints: don't enter message processing recursively (e.g. no breakpoints when processing debugger eval) */
+ duk_bool_t dbg_state_dirty; /* resend state next time executor is about to run */
+ duk_bool_t dbg_force_restart; /* force executor restart to recheck breakpoints; used to handle function returns (see GH-303) */
+ duk_bool_t dbg_detaching; /* debugger detaching; used to avoid calling detach handler recursively */
+ duk_small_uint_t dbg_pause_flags; /* flags for automatic pause behavior */
+ duk_activation *dbg_pause_act; /* activation related to pause behavior (pause on line change, function entry/exit) */
+ duk_uint32_t dbg_pause_startline; /* starting line number for line change related pause behavior */
+ duk_breakpoint dbg_breakpoints[DUK_HEAP_MAX_BREAKPOINTS]; /* breakpoints: [0,breakpoint_count[ gc reachable */
+ duk_small_uint_t dbg_breakpoint_count;
+ duk_breakpoint *dbg_breakpoints_active[DUK_HEAP_MAX_BREAKPOINTS + 1]; /* currently active breakpoints: NULL term, borrowed pointers */
+ /* XXX: make active breakpoints actual copies instead of pointers? */
+
+ /* These are for rate limiting Status notifications and transport peeking. */
+ duk_uint_t dbg_exec_counter; /* cumulative opcode execution count (overflows are OK) */
+ duk_uint_t dbg_last_counter; /* value of dbg_exec_counter when we last did a Date-based check */
+ duk_double_t dbg_last_time; /* time when status/peek was last done (Date-based rate limit) */
+
+ /* Used to support single-byte stream lookahead. */
+ duk_bool_t dbg_have_next_byte;
+ duk_uint8_t dbg_next_byte;
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+#if defined(DUK_USE_ASSERTIONS)
+ duk_bool_t dbg_calling_transport; /* transport call in progress, calling into Duktape forbidden */
+#endif
+
+ /* String intern table (weak refs). */
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *strtable16;
+#else
+ duk_hstring **strtable;
+#endif
+ duk_uint32_t st_mask; /* mask for lookup, st_size - 1 */
+ duk_uint32_t st_size; /* stringtable size */
+#if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE)
+ duk_uint32_t st_count; /* string count for resize load factor checks */
+#endif
+ duk_bool_t st_resizing; /* string table is being resized; avoid recursive resize */
+
+ /* String access cache (codepoint offset -> byte offset) for fast string
+ * character looping; 'weak' reference which needs special handling in GC.
+ */
+ duk_strcache strcache[DUK_HEAP_STRCACHE_SIZE];
+
+ /* Built-in strings. */
+#if defined(DUK_USE_ROM_STRINGS)
+ /* No field needed when strings are in ROM. */
+#else
+#if defined(DUK_USE_HEAPPTR16)
+ duk_uint16_t strs16[DUK_HEAP_NUM_STRINGS];
+#else
+ duk_hstring *strs[DUK_HEAP_NUM_STRINGS];
+#endif
+#endif
+
+ /* Stats. */
+#if defined(DUK_USE_DEBUG)
+ duk_int_t stats_exec_opcodes;
+ duk_int_t stats_exec_interrupt;
+ duk_int_t stats_exec_throw;
+ duk_int_t stats_call_all;
+ duk_int_t stats_call_tailcall;
+ duk_int_t stats_call_ecmatoecma;
+ duk_int_t stats_safecall_all;
+ duk_int_t stats_safecall_nothrow;
+ duk_int_t stats_safecall_throw;
+ duk_int_t stats_ms_try_count;
+ duk_int_t stats_ms_skip_count;
+ duk_int_t stats_ms_emergency_count;
+ duk_int_t stats_strtab_intern_hit;
+ duk_int_t stats_strtab_intern_miss;
+ duk_int_t stats_strtab_resize_check;
+ duk_int_t stats_strtab_resize_grow;
+ duk_int_t stats_strtab_resize_shrink;
+ duk_int_t stats_object_realloc_props;
+ duk_int_t stats_object_abandon_array;
+ duk_int_t stats_getownpropdesc_count;
+ duk_int_t stats_getownpropdesc_hit;
+ duk_int_t stats_getownpropdesc_miss;
+ duk_int_t stats_getpropdesc_count;
+ duk_int_t stats_getpropdesc_hit;
+ duk_int_t stats_getpropdesc_miss;
+ duk_int_t stats_getprop_all;
+ duk_int_t stats_getprop_arrayidx;
+ duk_int_t stats_getprop_bufobjidx;
+ duk_int_t stats_getprop_bufferidx;
+ duk_int_t stats_getprop_bufferlen;
+ duk_int_t stats_getprop_stringidx;
+ duk_int_t stats_getprop_stringlen;
+ duk_int_t stats_getprop_proxy;
+ duk_int_t stats_getprop_arguments;
+ duk_int_t stats_putprop_all;
+ duk_int_t stats_putprop_arrayidx;
+ duk_int_t stats_putprop_bufobjidx;
+ duk_int_t stats_putprop_bufferidx;
+ duk_int_t stats_putprop_proxy;
+ duk_int_t stats_getvar_all;
+ duk_int_t stats_putvar_all;
+#endif
+};
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL
+duk_heap *duk_heap_alloc(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *heap_udata,
+ duk_fatal_function fatal_func);
+DUK_INTERNAL_DECL void duk_heap_free(duk_heap *heap);
+DUK_INTERNAL_DECL void duk_free_hobject(duk_heap *heap, duk_hobject *h);
+DUK_INTERNAL_DECL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h);
+DUK_INTERNAL_DECL void duk_free_hstring(duk_heap *heap, duk_hstring *h);
+DUK_INTERNAL_DECL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr);
+
+DUK_INTERNAL_DECL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+DUK_INTERNAL_DECL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr);
+#endif
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL_DECL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr);
+DUK_INTERNAL_DECL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr);
+#endif
+#if defined(DUK_USE_ASSERTIONS)
+DUK_INTERNAL_DECL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr);
+#endif
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+DUK_INTERNAL_DECL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr);
+#endif
+
+DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen);
+DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t len);
+DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val);
+DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+DUK_INTERNAL_DECL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h);
+#endif
+DUK_INTERNAL_DECL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev);
+DUK_INTERNAL_DECL void duk_heap_strtable_force_resize(duk_heap *heap);
+DUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap);
+#if defined(DUK_USE_DEBUG)
+DUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap);
+#endif
+
+DUK_INTERNAL_DECL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h);
+DUK_INTERNAL_DECL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset);
+
+#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)
+DUK_INTERNAL_DECL void *duk_default_alloc_function(void *udata, duk_size_t size);
+DUK_INTERNAL_DECL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize);
+DUK_INTERNAL_DECL void duk_default_free_function(void *udata, void *ptr);
+#endif
+
+DUK_INTERNAL_DECL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size);
+DUK_INTERNAL_DECL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size);
+DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size);
+DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size);
+DUK_INTERNAL_DECL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize);
+DUK_INTERNAL_DECL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize);
+DUK_INTERNAL_DECL void duk_heap_mem_free(duk_heap *heap, void *ptr);
+
+DUK_INTERNAL_DECL void duk_heap_free_freelists(duk_heap *heap);
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL_DECL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj);
+DUK_INTERNAL_DECL void duk_heap_process_finalize_list(duk_heap *heap);
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+DUK_INTERNAL_DECL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags);
+
+DUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len);
+
+#endif /* DUK_HEAP_H_INCLUDED */
+/* #include duk_debugger.h */
+#line 1 "duk_debugger.h"
+#if !defined(DUK_DEBUGGER_H_INCLUDED)
+#define DUK_DEBUGGER_H_INCLUDED
+
+/* Debugger protocol version is defined in the public API header. */
+
+/* Initial bytes for markers. */
+#define DUK_DBG_IB_EOM 0x00
+#define DUK_DBG_IB_REQUEST 0x01
+#define DUK_DBG_IB_REPLY 0x02
+#define DUK_DBG_IB_ERROR 0x03
+#define DUK_DBG_IB_NOTIFY 0x04
+
+/* Other initial bytes. */
+#define DUK_DBG_IB_INT4 0x10
+#define DUK_DBG_IB_STR4 0x11
+#define DUK_DBG_IB_STR2 0x12
+#define DUK_DBG_IB_BUF4 0x13
+#define DUK_DBG_IB_BUF2 0x14
+#define DUK_DBG_IB_UNUSED 0x15
+#define DUK_DBG_IB_UNDEFINED 0x16
+#define DUK_DBG_IB_NULL 0x17
+#define DUK_DBG_IB_TRUE 0x18
+#define DUK_DBG_IB_FALSE 0x19
+#define DUK_DBG_IB_NUMBER 0x1a
+#define DUK_DBG_IB_OBJECT 0x1b
+#define DUK_DBG_IB_POINTER 0x1c
+#define DUK_DBG_IB_LIGHTFUNC 0x1d
+#define DUK_DBG_IB_HEAPPTR 0x1e
+/* The short string/integer initial bytes starting from 0x60 don't have
+ * defines now.
+ */
+
+/* Error codes. */
+#define DUK_DBG_ERR_UNKNOWN 0x00
+#define DUK_DBG_ERR_UNSUPPORTED 0x01
+#define DUK_DBG_ERR_TOOMANY 0x02
+#define DUK_DBG_ERR_NOTFOUND 0x03
+#define DUK_DBG_ERR_APPLICATION 0x04
+
+/* Commands and notifys initiated by Duktape. */
+#define DUK_DBG_CMD_STATUS 0x01
+#define DUK_DBG_CMD_UNUSED_2 0x02 /* Duktape 1.x: print notify */
+#define DUK_DBG_CMD_UNUSED_3 0x03 /* Duktape 1.x: alert notify */
+#define DUK_DBG_CMD_UNUSED_4 0x04 /* Duktape 1.x: log notify */
+#define DUK_DBG_CMD_THROW 0x05
+#define DUK_DBG_CMD_DETACHING 0x06
+#define DUK_DBG_CMD_APPNOTIFY 0x07
+
+/* Commands initiated by debug client. */
+#define DUK_DBG_CMD_BASICINFO 0x10
+#define DUK_DBG_CMD_TRIGGERSTATUS 0x11
+#define DUK_DBG_CMD_PAUSE 0x12
+#define DUK_DBG_CMD_RESUME 0x13
+#define DUK_DBG_CMD_STEPINTO 0x14
+#define DUK_DBG_CMD_STEPOVER 0x15
+#define DUK_DBG_CMD_STEPOUT 0x16
+#define DUK_DBG_CMD_LISTBREAK 0x17
+#define DUK_DBG_CMD_ADDBREAK 0x18
+#define DUK_DBG_CMD_DELBREAK 0x19
+#define DUK_DBG_CMD_GETVAR 0x1a
+#define DUK_DBG_CMD_PUTVAR 0x1b
+#define DUK_DBG_CMD_GETCALLSTACK 0x1c
+#define DUK_DBG_CMD_GETLOCALS 0x1d
+#define DUK_DBG_CMD_EVAL 0x1e
+#define DUK_DBG_CMD_DETACH 0x1f
+#define DUK_DBG_CMD_DUMPHEAP 0x20
+#define DUK_DBG_CMD_GETBYTECODE 0x21
+#define DUK_DBG_CMD_APPREQUEST 0x22
+#define DUK_DBG_CMD_GETHEAPOBJINFO 0x23
+#define DUK_DBG_CMD_GETOBJPROPDESC 0x24
+#define DUK_DBG_CMD_GETOBJPROPDESCRANGE 0x25
+
+/* The low 8 bits map directly to duk_hobject.h DUK_PROPDESC_FLAG_xxx.
+ * The remaining flags are specific to the debugger.
+ */
+#define DUK_DBG_PROPFLAG_SYMBOL (1U << 8)
+#define DUK_DBG_PROPFLAG_HIDDEN (1U << 9)
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_INTERNAL_DECL void duk_debug_do_detach(duk_heap *heap);
+
+DUK_INTERNAL_DECL duk_bool_t duk_debug_read_peek(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_debug_write_flush(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length);
+DUK_INTERNAL_DECL void duk_debug_skip_byte(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length);
+DUK_INTERNAL_DECL duk_uint8_t duk_debug_read_byte(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_int32_t duk_debug_read_int(duk_hthread *thr);
+DUK_INTERNAL_DECL duk_hstring *duk_debug_read_hstring(duk_hthread *thr);
+/* XXX: exposed duk_debug_read_pointer */
+/* XXX: exposed duk_debug_read_buffer */
+/* XXX: exposed duk_debug_read_hbuffer */
+#if 0
+DUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr);
+#endif
+#if defined(DUK_USE_DEBUGGER_INSPECT)
+DUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr);
+#endif
+DUK_INTERNAL_DECL duk_tval *duk_debug_read_tval(duk_hthread *thr);
+
+DUK_INTERNAL_DECL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length);
+DUK_INTERNAL_DECL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x);
+DUK_INTERNAL_DECL void duk_debug_write_unused(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_debug_write_undefined(duk_hthread *thr);
+#if defined(DUK_USE_DEBUGGER_INSPECT)
+DUK_INTERNAL_DECL void duk_debug_write_null(duk_hthread *thr);
+#endif
+DUK_INTERNAL_DECL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val);
+DUK_INTERNAL_DECL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x);
+DUK_INTERNAL_DECL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x);
+DUK_INTERNAL_DECL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length);
+DUK_INTERNAL_DECL void duk_debug_write_cstring(duk_hthread *thr, const char *data);
+DUK_INTERNAL_DECL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h);
+DUK_INTERNAL_DECL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length);
+DUK_INTERNAL_DECL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h);
+DUK_INTERNAL_DECL void duk_debug_write_pointer(duk_hthread *thr, void *ptr);
+#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT)
+DUK_INTERNAL_DECL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h);
+#endif
+DUK_INTERNAL_DECL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj);
+DUK_INTERNAL_DECL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv);
+#if 0 /* unused */
+DUK_INTERNAL_DECL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command);
+#endif
+DUK_INTERNAL_DECL void duk_debug_write_reply(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg);
+DUK_INTERNAL_DECL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command);
+DUK_INTERNAL_DECL void duk_debug_write_eom(duk_hthread *thr);
+
+DUK_INTERNAL_DECL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr);
+DUK_INTERNAL_DECL void duk_debug_send_status(duk_hthread *thr);
+#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)
+DUK_INTERNAL_DECL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal);
+#endif
+
+DUK_INTERNAL_DECL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc);
+DUK_INTERNAL_DECL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block);
+
+DUK_INTERNAL_DECL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line);
+DUK_INTERNAL_DECL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index);
+
+DUK_INTERNAL_DECL duk_bool_t duk_debug_is_attached(duk_heap *heap);
+DUK_INTERNAL_DECL duk_bool_t duk_debug_is_paused(duk_heap *heap);
+DUK_INTERNAL_DECL void duk_debug_set_paused(duk_heap *heap);
+DUK_INTERNAL_DECL void duk_debug_clear_paused(duk_heap *heap);
+DUK_INTERNAL_DECL void duk_debug_clear_pause_state(duk_heap *heap);
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+#endif /* DUK_DEBUGGER_H_INCLUDED */
+/* #include duk_debug.h */
+#line 1 "duk_debug.h"
+/*
+ * Debugging macros, DUK_DPRINT() and its variants in particular.
+ *
+ * DUK_DPRINT() allows formatted debug prints, and supports standard
+ * and Duktape specific formatters. See duk_debug_vsnprintf.c for details.
+ *
+ * DUK_D(x), DUK_DD(x), and DUK_DDD(x) are used together with log macros
+ * for technical reasons. They are concretely used to hide 'x' from the
+ * compiler when the corresponding log level is disabled. This allows
+ * clean builds on non-C99 compilers, at the cost of more verbose code.
+ * Examples:
+ *
+ * DUK_D(DUK_DPRINT("foo"));
+ * DUK_DD(DUK_DDPRINT("foo"));
+ * DUK_DDD(DUK_DDDPRINT("foo"));
+ *
+ * This approach is preferable to the old "double parentheses" hack because
+ * double parentheses make the C99 solution worse: __FILE__ and __LINE__ can
+ * no longer be added transparently without going through globals, which
+ * works poorly with threading.
+ */
+
+#if !defined(DUK_DEBUG_H_INCLUDED)
+#define DUK_DEBUG_H_INCLUDED
+
+#if defined(DUK_USE_DEBUG)
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0)
+#define DUK_D(x) x
+#else
+#define DUK_D(x) do { } while (0) /* omit */
+#endif
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)
+#define DUK_DD(x) x
+#else
+#define DUK_DD(x) do { } while (0) /* omit */
+#endif
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+#define DUK_DDD(x) x
+#else
+#define DUK_DDD(x) do { } while (0) /* omit */
+#endif
+
+/*
+ * Exposed debug macros: debugging enabled
+ */
+
+#if defined(DUK_USE_VARIADIC_MACROS)
+
+/* Note: combining __FILE__, __LINE__, and __func__ into fmt would be
+ * possible compile time, but waste some space with shared function names.
+ */
+#define DUK__DEBUG_LOG(lev,...) duk_debug_log((duk_int_t) (lev), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, DUK_FUNC_MACRO, __VA_ARGS__);
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0)
+#define DUK_DPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DEBUG, __VA_ARGS__)
+#else
+#define DUK_DPRINT(...)
+#endif
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)
+#define DUK_DDPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DDEBUG, __VA_ARGS__)
+#else
+#define DUK_DDPRINT(...)
+#endif
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+#define DUK_DDDPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DDDEBUG, __VA_ARGS__)
+#else
+#define DUK_DDDPRINT(...)
+#endif
+
+#else /* DUK_USE_VARIADIC_MACROS */
+
+#define DUK__DEBUG_STASH(lev) \
+ (void) DUK_SNPRINTF(duk_debug_file_stash, DUK_DEBUG_STASH_SIZE, "%s", (const char *) DUK_FILE_MACRO), \
+ (void) (duk_debug_file_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \
+ (void) (duk_debug_line_stash = (duk_int_t) DUK_LINE_MACRO), \
+ (void) DUK_SNPRINTF(duk_debug_func_stash, DUK_DEBUG_STASH_SIZE, "%s", (const char *) DUK_FUNC_MACRO), \
+ (void) (duk_debug_func_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \
+ (void) (duk_debug_level_stash = (lev))
+
+/* Without variadic macros resort to comma expression trickery to handle debug
+ * prints. This generates a lot of harmless warnings. These hacks are not
+ * needed normally because DUK_D() and friends will hide the entire debug log
+ * statement from the compiler.
+ */
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0)
+#define DUK_DPRINT DUK__DEBUG_STASH(DUK_LEVEL_DEBUG), (void) duk_debug_log /* args go here in parens */
+#else
+#define DUK_DPRINT 0 && /* args go here as a comma expression in parens */
+#endif
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)
+#define DUK_DDPRINT DUK__DEBUG_STASH(DUK_LEVEL_DDEBUG), (void) duk_debug_log /* args go here in parens */
+#else
+#define DUK_DDPRINT 0 && /* args */
+#endif
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+#define DUK_DDDPRINT DUK__DEBUG_STASH(DUK_LEVEL_DDDEBUG), (void) duk_debug_log /* args go here in parens */
+#else
+#define DUK_DDDPRINT 0 && /* args */
+#endif
+
+#endif /* DUK_USE_VARIADIC_MACROS */
+
+#else /* DUK_USE_DEBUG */
+
+/*
+ * Exposed debug macros: debugging disabled
+ */
+
+#define DUK_D(x) do { } while (0) /* omit */
+#define DUK_DD(x) do { } while (0) /* omit */
+#define DUK_DDD(x) do { } while (0) /* omit */
+
+#if defined(DUK_USE_VARIADIC_MACROS)
+
+#define DUK_DPRINT(...)
+#define DUK_DDPRINT(...)
+#define DUK_DDDPRINT(...)
+
+#else /* DUK_USE_VARIADIC_MACROS */
+
+#define DUK_DPRINT 0 && /* args go here as a comma expression in parens */
+#define DUK_DDPRINT 0 && /* args */
+#define DUK_DDDPRINT 0 && /* args */
+
+#endif /* DUK_USE_VARIADIC_MACROS */
+
+#endif /* DUK_USE_DEBUG */
+
+/*
+ * Structs
+ */
+
+#if defined(DUK_USE_DEBUG)
+struct duk_fixedbuffer {
+ duk_uint8_t *buffer;
+ duk_size_t length;
+ duk_size_t offset;
+ duk_bool_t truncated;
+};
+#endif
+
+/*
+ * Prototypes
+ */
+
+#if defined(DUK_USE_DEBUG)
+DUK_INTERNAL_DECL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap);
+#if 0 /*unused*/
+DUK_INTERNAL_DECL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...);
+#endif
+DUK_INTERNAL_DECL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size);
+
+#if defined(DUK_USE_VARIADIC_MACROS)
+DUK_INTERNAL_DECL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...);
+#else /* DUK_USE_VARIADIC_MACROS */
+/* parameter passing, not thread safe */
+#define DUK_DEBUG_STASH_SIZE 128
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE];
+DUK_INTERNAL_DECL duk_int_t duk_debug_line_stash;
+DUK_INTERNAL_DECL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE];
+DUK_INTERNAL_DECL duk_int_t duk_debug_level_stash;
+#endif
+DUK_INTERNAL_DECL void duk_debug_log(const char *fmt, ...);
+#endif /* DUK_USE_VARIADIC_MACROS */
+
+DUK_INTERNAL_DECL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length);
+DUK_INTERNAL_DECL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x);
+DUK_INTERNAL_DECL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x);
+DUK_INTERNAL_DECL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...);
+DUK_INTERNAL_DECL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size);
+DUK_INTERNAL_DECL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb);
+
+#endif /* DUK_USE_DEBUG */
+
+#endif /* DUK_DEBUG_H_INCLUDED */
+/* #include duk_error.h */
+#line 1 "duk_error.h"
+/*
+ * Error handling macros, assertion macro, error codes.
+ *
+ * There are three types of 'errors':
+ *
+ * 1. Ordinary errors relative to a thread, cause a longjmp, catchable.
+ * 2. Fatal errors relative to a heap, cause fatal handler to be called.
+ * 3. Fatal errors without context, cause the default (not heap specific)
+ * fatal handler to be called.
+ *
+ * Fatal errors without context are used by debug code such as assertions.
+ * By providing a fatal error handler for a Duktape heap, user code can
+ * avoid fatal errors without context in non-debug builds.
+ */
+
+#if !defined(DUK_ERROR_H_INCLUDED)
+#define DUK_ERROR_H_INCLUDED
+
+/*
+ * Error codes: defined in duktape.h
+ *
+ * Error codes are used as a shorthand to throw exceptions from inside
+ * the implementation. The appropriate Ecmascript object is constructed
+ * based on the code. Ecmascript code throws objects directly. The error
+ * codes are defined in the public API header because they are also used
+ * by calling code.
+ */
+
+/*
+ * Normal error
+ *
+ * Normal error is thrown with a longjmp() through the current setjmp()
+ * catchpoint record in the duk_heap. The 'curr_thread' of the duk_heap
+ * identifies the throwing thread.
+ *
+ * Error formatting is usually unnecessary. The error macros provide a
+ * zero argument version (no formatting) and separate macros for small
+ * argument counts. Variadic macros are not used to avoid portability
+ * issues and avoid the need for stash-based workarounds when they're not
+ * available. Vararg calls are avoided for non-formatted error calls
+ * because vararg call sites are larger than normal, and there are a lot
+ * of call sites with no formatting.
+ *
+ * Note that special formatting provided by debug macros is NOT available.
+ *
+ * The _RAW variants allow the caller to specify file and line. This makes
+ * it easier to write checked calls which want to use the call site of the
+ * checked function, not the error macro call inside the checked function.
+ */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+
+/* Because there are quite many call sites, pack error code (require at most
+ * 8-bit) into a single argument.
+ */
+#define DUK_ERROR(thr,err,msg) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \
+ } while (0)
+#define DUK_ERROR_RAW(thr,file,line,err,msg) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \
+ } while (0)
+
+#define DUK_ERROR_FMT1(thr,err,fmt,arg1) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \
+ } while (0)
+#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \
+ } while (0)
+
+#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \
+ } while (0)
+#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \
+ } while (0)
+
+#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \
+ } while (0)
+#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \
+ } while (0)
+
+#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \
+ } while (0)
+#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) do { \
+ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
+ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
+ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \
+ } while (0)
+
+#else /* DUK_USE_VERBOSE_ERRORS */
+
+#define DUK_ERROR(thr,err,msg) duk_err_handle_error((thr), (err))
+#define DUK_ERROR_RAW(thr,file,line,err,msg) duk_err_handle_error((thr), (err))
+
+#define DUK_ERROR_FMT1(thr,err,fmt,arg1) DUK_ERROR((thr),(err),(fmt))
+#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
+
+#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) DUK_ERROR((thr),(err),(fmt))
+#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
+
+#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) DUK_ERROR((thr),(err),(fmt))
+#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
+
+#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR((thr),(err),(fmt))
+#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
+
+#endif /* DUK_USE_VERBOSE_ERRORS */
+
+/*
+ * Fatal error without context
+ *
+ * The macro is an expression to make it compatible with DUK_ASSERT_EXPR().
+ */
+
+#define DUK_FATAL_WITHOUT_CONTEXT(msg) \
+ duk_default_fatal_handler(NULL, (msg))
+
+/*
+ * Error throwing helpers
+ *
+ * The goal is to provide verbose and configurable error messages. Call
+ * sites should be clean in source code and compile to a small footprint.
+ * Small footprint is also useful for performance because small cold paths
+ * reduce code cache pressure. Adding macros here only makes sense if there
+ * are enough call sites to get concrete benefits.
+ *
+ * DUK_ERROR_xxx() macros are generic and can be used anywhere.
+ *
+ * DUK_DCERROR_xxx() macros can only be used in Duktape/C functions where
+ * the "return DUK_RET_xxx;" shorthand is available for low memory targets.
+ * The DUK_DCERROR_xxx() macros always either throw or perform a
+ * 'return DUK_RET_xxx' from the calling function.
+ */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+/* Verbose errors with key/value summaries (non-paranoid) or without key/value
+ * summaries (paranoid, for some security sensitive environments), the paranoid
+ * vs. non-paranoid distinction affects only a few specific errors.
+ */
+#if defined(DUK_USE_PARANOID_ERRORS)
+#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \
+ duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \
+ } while (0)
+#else /* DUK_USE_PARANOID_ERRORS */
+#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \
+ duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \
+ } while (0)
+#endif /* DUK_USE_PARANOID_ERRORS */
+
+#define DUK_ERROR_INTERNAL(thr) do { \
+ duk_err_error_internal((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
+ } while (0)
+#define DUK_DCERROR_INTERNAL(thr) do { \
+ DUK_ERROR_INTERNAL((thr)); \
+ return 0; \
+ } while (0)
+#define DUK_ERROR_ALLOC_FAILED(thr) do { \
+ duk_err_error_alloc_failed((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
+ } while (0)
+#define DUK_ERROR_UNSUPPORTED(thr) do { \
+ DUK_ERROR((thr), DUK_ERR_ERROR, DUK_STR_UNSUPPORTED); \
+ } while (0)
+#define DUK_ERROR_ERROR(thr,msg) do { \
+ duk_err_error((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \
+ } while (0)
+#define DUK_ERROR_RANGE_INDEX(thr,idx) do { \
+ duk_err_range_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx)); \
+ } while (0)
+#define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \
+ duk_err_range_push_beyond((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
+ } while (0)
+#define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \
+ DUK_ERROR_RANGE((thr), DUK_STR_INVALID_ARGS); \
+ } while (0)
+#define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \
+ DUK_ERROR_RANGE_INVALID_ARGS((thr)); \
+ return 0; \
+ } while (0)
+#define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \
+ DUK_ERROR_RANGE((thr), DUK_STR_INVALID_COUNT); \
+ } while (0)
+#define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \
+ DUK_ERROR_RANGE_INVALID_COUNT((thr)); \
+ return 0; \
+ } while (0)
+#define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \
+ DUK_ERROR_RANGE((thr), DUK_STR_INVALID_LENGTH); \
+ } while (0)
+#define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \
+ DUK_ERROR_RANGE_INVALID_LENGTH((thr)); \
+ return 0; \
+ } while (0)
+#define DUK_ERROR_RANGE(thr,msg) do { \
+ duk_err_range((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \
+ } while (0)
+#define DUK_ERROR_EVAL(thr,msg) do { \
+ DUK_ERROR((thr), DUK_ERR_EVAL_ERROR, (msg)); \
+ } while (0)
+#define DUK_ERROR_REFERENCE(thr,msg) do { \
+ DUK_ERROR((thr), DUK_ERR_REFERENCE_ERROR, (msg)); \
+ } while (0)
+#define DUK_ERROR_SYNTAX(thr,msg) do { \
+ DUK_ERROR((thr), DUK_ERR_SYNTAX_ERROR, (msg)); \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \
+ duk_err_type_invalid_args((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
+ } while (0)
+#define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \
+ DUK_ERROR_TYPE_INVALID_ARGS((thr)); \
+ return 0; \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \
+ duk_err_type_invalid_state((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
+ } while (0)
+#define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \
+ DUK_ERROR_TYPE_INVALID_STATE((thr)); \
+ return 0; \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \
+ duk_err_type_invalid_trap_result((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
+ } while (0)
+#define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \
+ DUK_ERROR_TYPE((thr), DUK_STR_INVALID_TRAP_RESULT); \
+ } while (0)
+#define DUK_ERROR_TYPE(thr,msg) do { \
+ DUK_ERROR((thr), DUK_ERR_TYPE_ERROR, (msg)); \
+ } while (0)
+#define DUK_ERROR_URI(thr,msg) do { \
+ DUK_ERROR((thr), DUK_ERR_URI_ERROR, (msg)); \
+ } while (0)
+#else /* DUK_USE_VERBOSE_ERRORS */
+/* Non-verbose errors for low memory targets: no file, line, or message. */
+
+#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \
+ duk_err_type((thr)); \
+ } while (0)
+
+#define DUK_ERROR_INTERNAL(thr) do { \
+ duk_err_error((thr)); \
+ } while (0)
+#define DUK_DCERROR_INTERNAL(thr) do { \
+ DUK_UNREF((thr)); \
+ return DUK_RET_ERROR; \
+ } while (0)
+#define DUK_ERROR_ALLOC_FAILED(thr) do { \
+ duk_err_error((thr)); \
+ } while (0)
+#define DUK_ERROR_UNSUPPORTED(thr) do { \
+ duk_err_error((thr)); \
+ } while (0)
+#define DUK_ERROR_ERROR(thr,msg) do { \
+ duk_err_error((thr)); \
+ } while (0)
+#define DUK_ERROR_RANGE_INDEX(thr,idx) do { \
+ duk_err_range((thr)); \
+ } while (0)
+#define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \
+ duk_err_range((thr)); \
+ } while (0)
+#define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \
+ duk_err_range((thr)); \
+ } while (0)
+#define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \
+ DUK_UNREF((thr)); \
+ return DUK_RET_RANGE_ERROR; \
+ } while (0)
+#define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \
+ duk_err_range((thr)); \
+ } while (0)
+#define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \
+ DUK_UNREF((thr)); \
+ return DUK_RET_RANGE_ERROR; \
+ } while (0)
+#define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \
+ duk_err_range((thr)); \
+ } while (0)
+#define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \
+ DUK_UNREF((thr)); \
+ return DUK_RET_RANGE_ERROR; \
+ } while (0)
+#define DUK_ERROR_RANGE(thr,msg) do { \
+ duk_err_range((thr)); \
+ } while (0)
+#define DUK_ERROR_EVAL(thr,msg) do { \
+ duk_err_eval((thr)); \
+ } while (0)
+#define DUK_ERROR_REFERENCE(thr,msg) do { \
+ duk_err_reference((thr)); \
+ } while (0)
+#define DUK_ERROR_SYNTAX(thr,msg) do { \
+ duk_err_syntax((thr)); \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \
+ duk_err_type((thr)); \
+ } while (0)
+#define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \
+ DUK_UNREF((thr)); \
+ return DUK_RET_TYPE_ERROR; \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \
+ duk_err_type((thr)); \
+ } while (0)
+#define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \
+ duk_err_type((thr)); \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \
+ duk_err_type((thr)); \
+ } while (0)
+#define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \
+ DUK_UNREF((thr)); \
+ return DUK_RET_TYPE_ERROR; \
+ } while (0)
+#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \
+ duk_err_type((thr)); \
+ } while (0)
+#define DUK_ERROR_TYPE(thr,msg) do { \
+ duk_err_type((thr)); \
+ } while (0)
+#define DUK_ERROR_URI(thr,msg) do { \
+ duk_err_uri((thr)); \
+ } while (0)
+#endif /* DUK_USE_VERBOSE_ERRORS */
+
+/*
+ * Assert macro: failure causes a fatal error.
+ *
+ * NOTE: since the assert macro doesn't take a heap/context argument, there's
+ * no way to look up a heap/context specific fatal error handler which may have
+ * been given by the application. Instead, assertion failures always use the
+ * internal default fatal error handler; it can be replaced via duk_config.h
+ * and then applies to all Duktape heaps.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+
+/* The message should be a compile time constant without formatting (less risk);
+ * we don't care about assertion text size because they're not used in production
+ * builds.
+ */
+#define DUK_ASSERT(x) do { \
+ if (!(x)) { \
+ DUK_FATAL_WITHOUT_CONTEXT("assertion failed: " #x \
+ " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"); \
+ } \
+ } while (0)
+
+/* Assertion compatible inside a comma expression, evaluates to void. */
+#define DUK_ASSERT_EXPR(x) \
+ ((void) ((x) ? 0 : (DUK_FATAL_WITHOUT_CONTEXT("assertion failed: " #x \
+ " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"), 0)))
+
+#else /* DUK_USE_ASSERTIONS */
+
+#define DUK_ASSERT(x) do { /* assertion omitted */ } while (0)
+
+#define DUK_ASSERT_EXPR(x) ((void) 0)
+
+#endif /* DUK_USE_ASSERTIONS */
+
+/* this variant is used when an assert would generate a compile warning by
+ * being always true (e.g. >= 0 comparison for an unsigned value
+ */
+#define DUK_ASSERT_DISABLE(x) do { /* assertion disabled */ } while (0)
+
+/*
+ * Assertion helpers
+ */
+
+#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)
+#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) do { \
+ DUK_ASSERT((h) == NULL || DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) (h)) > 0); \
+ } while (0)
+#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) do { \
+ if ((tv) != NULL && DUK_TVAL_IS_HEAP_ALLOCATED((tv))) { \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(DUK_TVAL_GET_HEAPHDR((tv))) > 0); \
+ } \
+ } while (0)
+#else
+#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) /* no refcount check */
+#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) /* no refcount check */
+#endif
+
+#define DUK_ASSERT_TOP(ctx,n) DUK_ASSERT((duk_idx_t) duk_get_top((ctx)) == (duk_idx_t) (n))
+
+#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_PACKED_TVAL)
+#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) do { \
+ duk_double_union duk__assert_tmp_du; \
+ duk__assert_tmp_du.d = (dval); \
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&duk__assert_tmp_du)); \
+ } while (0)
+#else
+#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) /* nop */
+#endif
+
+#define DUK_ASSERT_VS_SPACE(thr) \
+ DUK_ASSERT(thr->valstack_top < thr->valstack_end)
+
+/*
+ * Helper to initialize a memory area (e.g. struct) with garbage when
+ * assertions enabled.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+#define DUK_ASSERT_SET_GARBAGE(ptr,size) do { \
+ DUK_MEMSET((void *) (ptr), 0x5a, size); \
+ } while (0)
+#else
+#define DUK_ASSERT_SET_GARBAGE(ptr,size) do {} while (0)
+#endif
+
+/*
+ * Helper for valstack space
+ *
+ * Caller of DUK_ASSERT_VALSTACK_SPACE() estimates the number of free stack entries
+ * required for its own use, and any child calls which are not (a) Duktape API calls
+ * or (b) Duktape calls which involve extending the valstack (e.g. getter call).
+ */
+
+#define DUK_VALSTACK_ASSERT_EXTRA 5 /* this is added to checks to allow for Duktape
+ * API calls in addition to function's own use
+ */
+#if defined(DUK_USE_ASSERTIONS)
+#define DUK_ASSERT_VALSTACK_SPACE(thr,n) do { \
+ DUK_ASSERT((thr) != NULL); \
+ DUK_ASSERT((thr)->valstack_end - (thr)->valstack_top >= (n) + DUK_VALSTACK_ASSERT_EXTRA); \
+ } while (0)
+#else
+#define DUK_ASSERT_VALSTACK_SPACE(thr,n) /* no valstack space check */
+#endif
+
+/*
+ * Prototypes
+ */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...));
+#else /* DUK_USE_VERBOSE_ERRORS */
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code));
+#endif /* DUK_USE_VERBOSE_ERRORS */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line));
+#else
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code));
+#endif
+
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc));
+
+#define DUK_AUGMENT_FLAG_NOBLAME_FILELINE (1U << 0) /* if set, don't blame C file/line for .fileName and .lineNumber */
+#define DUK_AUGMENT_FLAG_SKIP_ONE (1U << 1) /* if set, skip topmost activation in traceback construction */
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+DUK_INTERNAL_DECL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *filename, duk_int_t line, duk_small_uint_t flags);
+#endif
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+DUK_INTERNAL_DECL void duk_err_augment_error_throw(duk_hthread *thr);
+#endif
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+#if defined(DUK_USE_PARANOID_ERRORS)
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name));
+#else
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name));
+#endif
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber));
+#else /* DUK_VERBOSE_ERRORS */
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_eval(duk_hthread *thr));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_reference(duk_hthread *thr));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_syntax(duk_hthread *thr));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type(duk_hthread *thr));
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_uri(duk_hthread *thr));
+#endif /* DUK_VERBOSE_ERRORS */
+
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_longjmp(duk_hthread *thr));
+
+DUK_NORETURN(DUK_INTERNAL_DECL void duk_default_fatal_handler(void *udata, const char *msg));
+
+DUK_INTERNAL_DECL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_INTERNAL_DECL void duk_err_check_debugger_integration(duk_hthread *thr);
+#endif
+
+DUK_INTERNAL_DECL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t err_code);
+
+#endif /* DUK_ERROR_H_INCLUDED */
+/* #include duk_unicode.h */
+#line 1 "duk_unicode.h"
+/*
+ * Unicode helpers
+ */
+
+#if !defined(DUK_UNICODE_H_INCLUDED)
+#define DUK_UNICODE_H_INCLUDED
+
+/*
+ * UTF-8 / XUTF-8 / CESU-8 constants
+ */
+
+#define DUK_UNICODE_MAX_XUTF8_LENGTH 7 /* up to 36 bit codepoints */
+#define DUK_UNICODE_MAX_XUTF8_BMP_LENGTH 3 /* all codepoints up to U+FFFF */
+#define DUK_UNICODE_MAX_CESU8_LENGTH 6 /* all codepoints up to U+10FFFF */
+#define DUK_UNICODE_MAX_CESU8_BMP_LENGTH 3 /* all codepoints up to U+FFFF */
+
+/*
+ * Useful Unicode codepoints
+ *
+ * Integer constants must be signed to avoid unexpected coercions
+ * in comparisons.
+ */
+
+#define DUK_UNICODE_CP_ZWNJ 0x200cL /* zero-width non-joiner */
+#define DUK_UNICODE_CP_ZWJ 0x200dL /* zero-width joiner */
+#define DUK_UNICODE_CP_REPLACEMENT_CHARACTER 0xfffdL /* http://en.wikipedia.org/wiki/Replacement_character#Replacement_character */
+
+/*
+ * ASCII character constants
+ *
+ * C character literals like 'x' have a platform specific value and do
+ * not match ASCII (UTF-8) values on e.g. EBCDIC platforms. So, use
+ * these (admittedly awkward) constants instead. These constants must
+ * also have signed values to avoid unexpected coercions in comparisons.
+ *
+ * http://en.wikipedia.org/wiki/ASCII
+ */
+
+#define DUK_ASC_NUL 0x00
+#define DUK_ASC_SOH 0x01
+#define DUK_ASC_STX 0x02
+#define DUK_ASC_ETX 0x03
+#define DUK_ASC_EOT 0x04
+#define DUK_ASC_ENQ 0x05
+#define DUK_ASC_ACK 0x06
+#define DUK_ASC_BEL 0x07
+#define DUK_ASC_BS 0x08
+#define DUK_ASC_HT 0x09
+#define DUK_ASC_LF 0x0a
+#define DUK_ASC_VT 0x0b
+#define DUK_ASC_FF 0x0c
+#define DUK_ASC_CR 0x0d
+#define DUK_ASC_SO 0x0e
+#define DUK_ASC_SI 0x0f
+#define DUK_ASC_DLE 0x10
+#define DUK_ASC_DC1 0x11
+#define DUK_ASC_DC2 0x12
+#define DUK_ASC_DC3 0x13
+#define DUK_ASC_DC4 0x14
+#define DUK_ASC_NAK 0x15
+#define DUK_ASC_SYN 0x16
+#define DUK_ASC_ETB 0x17
+#define DUK_ASC_CAN 0x18
+#define DUK_ASC_EM 0x19
+#define DUK_ASC_SUB 0x1a
+#define DUK_ASC_ESC 0x1b
+#define DUK_ASC_FS 0x1c
+#define DUK_ASC_GS 0x1d
+#define DUK_ASC_RS 0x1e
+#define DUK_ASC_US 0x1f
+#define DUK_ASC_SPACE 0x20
+#define DUK_ASC_EXCLAMATION 0x21
+#define DUK_ASC_DOUBLEQUOTE 0x22
+#define DUK_ASC_HASH 0x23
+#define DUK_ASC_DOLLAR 0x24
+#define DUK_ASC_PERCENT 0x25
+#define DUK_ASC_AMP 0x26
+#define DUK_ASC_SINGLEQUOTE 0x27
+#define DUK_ASC_LPAREN 0x28
+#define DUK_ASC_RPAREN 0x29
+#define DUK_ASC_STAR 0x2a
+#define DUK_ASC_PLUS 0x2b
+#define DUK_ASC_COMMA 0x2c
+#define DUK_ASC_MINUS 0x2d
+#define DUK_ASC_PERIOD 0x2e
+#define DUK_ASC_SLASH 0x2f
+#define DUK_ASC_0 0x30
+#define DUK_ASC_1 0x31
+#define DUK_ASC_2 0x32
+#define DUK_ASC_3 0x33
+#define DUK_ASC_4 0x34
+#define DUK_ASC_5 0x35
+#define DUK_ASC_6 0x36
+#define DUK_ASC_7 0x37
+#define DUK_ASC_8 0x38
+#define DUK_ASC_9 0x39
+#define DUK_ASC_COLON 0x3a
+#define DUK_ASC_SEMICOLON 0x3b
+#define DUK_ASC_LANGLE 0x3c
+#define DUK_ASC_EQUALS 0x3d
+#define DUK_ASC_RANGLE 0x3e
+#define DUK_ASC_QUESTION 0x3f
+#define DUK_ASC_ATSIGN 0x40
+#define DUK_ASC_UC_A 0x41
+#define DUK_ASC_UC_B 0x42
+#define DUK_ASC_UC_C 0x43
+#define DUK_ASC_UC_D 0x44
+#define DUK_ASC_UC_E 0x45
+#define DUK_ASC_UC_F 0x46
+#define DUK_ASC_UC_G 0x47
+#define DUK_ASC_UC_H 0x48
+#define DUK_ASC_UC_I 0x49
+#define DUK_ASC_UC_J 0x4a
+#define DUK_ASC_UC_K 0x4b
+#define DUK_ASC_UC_L 0x4c
+#define DUK_ASC_UC_M 0x4d
+#define DUK_ASC_UC_N 0x4e
+#define DUK_ASC_UC_O 0x4f
+#define DUK_ASC_UC_P 0x50
+#define DUK_ASC_UC_Q 0x51
+#define DUK_ASC_UC_R 0x52
+#define DUK_ASC_UC_S 0x53
+#define DUK_ASC_UC_T 0x54
+#define DUK_ASC_UC_U 0x55
+#define DUK_ASC_UC_V 0x56
+#define DUK_ASC_UC_W 0x57
+#define DUK_ASC_UC_X 0x58
+#define DUK_ASC_UC_Y 0x59
+#define DUK_ASC_UC_Z 0x5a
+#define DUK_ASC_LBRACKET 0x5b
+#define DUK_ASC_BACKSLASH 0x5c
+#define DUK_ASC_RBRACKET 0x5d
+#define DUK_ASC_CARET 0x5e
+#define DUK_ASC_UNDERSCORE 0x5f
+#define DUK_ASC_GRAVE 0x60
+#define DUK_ASC_LC_A 0x61
+#define DUK_ASC_LC_B 0x62
+#define DUK_ASC_LC_C 0x63
+#define DUK_ASC_LC_D 0x64
+#define DUK_ASC_LC_E 0x65
+#define DUK_ASC_LC_F 0x66
+#define DUK_ASC_LC_G 0x67
+#define DUK_ASC_LC_H 0x68
+#define DUK_ASC_LC_I 0x69
+#define DUK_ASC_LC_J 0x6a
+#define DUK_ASC_LC_K 0x6b
+#define DUK_ASC_LC_L 0x6c
+#define DUK_ASC_LC_M 0x6d
+#define DUK_ASC_LC_N 0x6e
+#define DUK_ASC_LC_O 0x6f
+#define DUK_ASC_LC_P 0x70
+#define DUK_ASC_LC_Q 0x71
+#define DUK_ASC_LC_R 0x72
+#define DUK_ASC_LC_S 0x73
+#define DUK_ASC_LC_T 0x74
+#define DUK_ASC_LC_U 0x75
+#define DUK_ASC_LC_V 0x76
+#define DUK_ASC_LC_W 0x77
+#define DUK_ASC_LC_X 0x78
+#define DUK_ASC_LC_Y 0x79
+#define DUK_ASC_LC_Z 0x7a
+#define DUK_ASC_LCURLY 0x7b
+#define DUK_ASC_PIPE 0x7c
+#define DUK_ASC_RCURLY 0x7d
+#define DUK_ASC_TILDE 0x7e
+#define DUK_ASC_DEL 0x7f
+
+/*
+ * Miscellaneous
+ */
+
+/* Uppercase A is 0x41, lowercase a is 0x61; OR 0x20 to convert uppercase
+ * to lowercase.
+ */
+#define DUK_LOWERCASE_CHAR_ASCII(x) ((x) | 0x20)
+
+/*
+ * Unicode tables
+ */
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_ids_noa[1036];
+#else
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_ids_noabmp[625];
+#endif
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_ids_m_let_noa[42];
+#else
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_ids_m_let_noabmp[24];
+#endif
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_idp_m_ids_noa[530];
+#else
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357];
+#endif
+
+/*
+ * Automatically generated by extract_caseconv.py, do not edit!
+ */
+
+extern const duk_uint8_t duk_unicode_caseconv_uc[1386];
+extern const duk_uint8_t duk_unicode_caseconv_lc[680];
+
+#if defined(DUK_USE_REGEXP_CANON_WORKAROUND)
+/*
+ * Automatically generated by extract_caseconv.py, do not edit!
+ */
+
+extern const duk_uint16_t duk_unicode_re_canon_lookup[65536];
+#endif
+
+#if defined(DUK_USE_REGEXP_CANON_BITMAP)
+/*
+ * Automatically generated by extract_caseconv.py, do not edit!
+ */
+
+#define DUK_CANON_BITMAP_BLKSIZE 32
+#define DUK_CANON_BITMAP_BLKSHIFT 5
+#define DUK_CANON_BITMAP_BLKMASK 31
+extern const duk_uint8_t duk_unicode_re_canon_bitmap[256];
+#endif
+
+/*
+ * Extern
+ */
+
+/* duk_unicode_support.c */
+#if !defined(DUK_SINGLE_FILE)
+DUK_INTERNAL_DECL const duk_uint8_t duk_unicode_xutf8_markers[7];
+DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_digit[2];
+DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_white[22];
+DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_wordchar[8];
+DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_digit[4];
+DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_white[24];
+DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10];
+DUK_INTERNAL_DECL const duk_int8_t duk_is_idchar_tab[128];
+#endif /* !DUK_SINGLE_FILE */
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp);
+#if defined(DUK_USE_ASSERTIONS)
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp);
+#endif
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp);
+DUK_INTERNAL_DECL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end);
+DUK_INTERNAL_DECL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp);
+DUK_INTERNAL_DECL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase);
+#if defined(DUK_USE_REGEXP_SUPPORT)
+DUK_INTERNAL_DECL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp);
+DUK_INTERNAL_DECL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t cp);
+#endif
+
+#endif /* DUK_UNICODE_H_INCLUDED */
+/* #include duk_json.h */
+#line 1 "duk_json.h"
+/*
+ * Defines for JSON, especially duk_bi_json.c.
+ */
+
+#if !defined(DUK_JSON_H_INCLUDED)
+#define DUK_JSON_H_INCLUDED
+
+/* Encoding/decoding flags */
+#define DUK_JSON_FLAG_ASCII_ONLY (1U << 0) /* escape any non-ASCII characters */
+#define DUK_JSON_FLAG_AVOID_KEY_QUOTES (1U << 1) /* avoid key quotes when key is an ASCII Identifier */
+#define DUK_JSON_FLAG_EXT_CUSTOM (1U << 2) /* extended types: custom encoding */
+#define DUK_JSON_FLAG_EXT_COMPATIBLE (1U << 3) /* extended types: compatible encoding */
+
+/* How much stack to require on entry to object/array encode */
+#define DUK_JSON_ENC_REQSTACK 32
+
+/* How much stack to require on entry to object/array decode */
+#define DUK_JSON_DEC_REQSTACK 32
+
+/* How large a loop detection stack to use */
+#define DUK_JSON_ENC_LOOPARRAY 64
+
+/* Encoding state. Heap object references are all borrowed. */
+typedef struct {
+ duk_hthread *thr;
+ duk_bufwriter_ctx bw; /* output bufwriter */
+ duk_hobject *h_replacer; /* replacer function */
+ duk_hstring *h_gap; /* gap (if empty string, NULL) */
+ duk_idx_t idx_proplist; /* explicit PropertyList */
+ duk_idx_t idx_loop; /* valstack index of loop detection object */
+ duk_small_uint_t flags;
+ duk_small_uint_t flag_ascii_only;
+ duk_small_uint_t flag_avoid_key_quotes;
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ duk_small_uint_t flag_ext_custom;
+ duk_small_uint_t flag_ext_compatible;
+ duk_small_uint_t flag_ext_custom_or_compatible;
+#endif
+ duk_uint_t recursion_depth;
+ duk_uint_t recursion_limit;
+ duk_uint_t mask_for_undefined; /* type bit mask: types which certainly produce 'undefined' */
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ duk_small_uint_t stridx_custom_undefined;
+ duk_small_uint_t stridx_custom_nan;
+ duk_small_uint_t stridx_custom_neginf;
+ duk_small_uint_t stridx_custom_posinf;
+ duk_small_uint_t stridx_custom_function;
+#endif
+ duk_hobject *visiting[DUK_JSON_ENC_LOOPARRAY]; /* indexed by recursion_depth */
+} duk_json_enc_ctx;
+
+typedef struct {
+ duk_hthread *thr;
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_start;
+ const duk_uint8_t *p_end;
+ duk_idx_t idx_reviver;
+ duk_small_uint_t flags;
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ duk_small_uint_t flag_ext_custom;
+ duk_small_uint_t flag_ext_compatible;
+ duk_small_uint_t flag_ext_custom_or_compatible;
+#endif
+ duk_int_t recursion_depth;
+ duk_int_t recursion_limit;
+} duk_json_dec_ctx;
+
+#endif /* DUK_JSON_H_INCLUDED */
+/* #include duk_js.h */
+#line 1 "duk_js.h"
+/*
+ * Ecmascript execution, support primitives.
+ */
+
+#if !defined(DUK_JS_H_INCLUDED)
+#define DUK_JS_H_INCLUDED
+
+/* Flags for call handling. Lowest flags must match bytecode DUK_BC_CALL_FLAG_xxx 1:1. */
+#define DUK_CALL_FLAG_TAILCALL (1U << 0) /* setup for a tail call */
+#define DUK_CALL_FLAG_CONSTRUCT (1U << 1) /* constructor call (i.e. called as 'new Foo()') */
+#define DUK_CALL_FLAG_CALLED_AS_EVAL (1U << 2) /* call was made using the identifier 'eval' */
+#define DUK_CALL_FLAG_ALLOW_ECMATOECMA (1U << 3) /* ecma-to-ecma call with executor reuse is possible */
+#define DUK_CALL_FLAG_DIRECT_EVAL (1U << 4) /* call is a direct eval call */
+#define DUK_CALL_FLAG_CONSTRUCT_PROXY (1U << 5) /* handled via 'construct' proxy trap, check return value invariant(s) */
+#define DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED (1U << 6) /* prototype of 'default instance' updated, temporary flag in call handling */
+
+/* Flags for duk_js_equals_helper(). */
+#define DUK_EQUALS_FLAG_SAMEVALUE (1U << 0) /* use SameValue instead of non-strict equality */
+#define DUK_EQUALS_FLAG_STRICT (1U << 1) /* use strict equality instead of non-strict equality */
+
+/* Flags for duk_js_compare_helper(). */
+#define DUK_COMPARE_FLAG_NEGATE (1U << 0) /* negate result */
+#define DUK_COMPARE_FLAG_EVAL_LEFT_FIRST (1U << 1) /* eval left argument first */
+
+/* conversions, coercions, comparison, etc */
+DUK_INTERNAL_DECL duk_bool_t duk_js_toboolean(duk_tval *tv);
+DUK_INTERNAL_DECL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL duk_double_t duk_js_tointeger_number(duk_double_t x);
+DUK_INTERNAL_DECL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv);
+DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen);
+#if !defined(DUK_USE_HSTRING_ARRIDX)
+DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h);
+DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h);
+#endif
+DUK_INTERNAL_DECL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags);
+DUK_INTERNAL_DECL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2);
+DUK_INTERNAL_DECL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2);
+#if 0 /* unused */
+DUK_INTERNAL_DECL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2);
+#endif
+DUK_INTERNAL_DECL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags);
+DUK_INTERNAL_DECL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y);
+DUK_INTERNAL_DECL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y);
+DUK_INTERNAL_DECL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x);
+
+/* arithmetic */
+DUK_INTERNAL_DECL double duk_js_arith_pow(double x, double y);
+DUK_INTERNAL_DECL double duk_js_arith_mod(double x, double y);
+
+#define duk_js_equals(thr,tv_x,tv_y) \
+ duk_js_equals_helper((thr), (tv_x), (tv_y), 0)
+#define duk_js_strict_equals(tv_x,tv_y) \
+ duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_STRICT)
+#define duk_js_samevalue(tv_x,tv_y) \
+ duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_SAMEVALUE)
+
+/* E5 Sections 11.8.1, 11.8.5; x < y */
+#define duk_js_lessthan(thr,tv_x,tv_y) \
+ duk_js_compare_helper((thr), (tv_x), (tv_Y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST)
+
+/* E5 Sections 11.8.2, 11.8.5; x > y --> y < x */
+#define duk_js_greaterthan(thr,tv_x,tv_y) \
+ duk_js_compare_helper((thr), (tv_y), (tv_x), 0)
+
+/* E5 Sections 11.8.3, 11.8.5; x <= y --> not (x > y) --> not (y < x) */
+#define duk_js_lessthanorequal(thr,tv_x,tv_y) \
+ duk_js_compare_helper((thr), (tv_y), (tv_x), DUK_COMPARE_FLAG_NEGATE)
+
+/* E5 Sections 11.8.4, 11.8.5; x >= y --> not (x < y) */
+#define duk_js_greaterthanorequal(thr,tv_x,tv_y) \
+ duk_js_compare_helper((thr), (tv_x), (tv_y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE)
+
+/* identifiers and environment handling */
+#if 0 /*unused*/
+DUK_INTERNAL duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name);
+#endif
+DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag);
+DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag);
+DUK_INTERNAL_DECL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict);
+DUK_INTERNAL_DECL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict);
+#if 0 /*unused*/
+DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name);
+#endif
+DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name);
+DUK_INTERNAL_DECL duk_bool_t duk_js_declvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_small_uint_t prop_flags, duk_bool_t is_func_decl);
+DUK_INTERNAL_DECL void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, duk_activation *act);
+DUK_INTERNAL_DECL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env);
+DUK_INTERNAL_DECL duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_hobject *func, duk_size_t bottom_byteoff);
+DUK_INTERNAL_DECL void duk_js_push_closure(duk_hthread *thr,
+ duk_hcompfunc *fun_temp,
+ duk_hobject *outer_var_env,
+ duk_hobject *outer_lex_env,
+ duk_bool_t add_auto_proto);
+
+/* call handling */
+DUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t call_flags);
+DUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags);
+DUK_INTERNAL_DECL duk_int_t duk_handle_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t num_stack_args, duk_idx_t num_stack_res);
+DUK_INTERNAL_DECL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant);
+#if defined(DUK_USE_VERBOSE_ERRORS)
+DUK_INTERNAL_DECL void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key);
+#endif
+
+/* bytecode execution */
+DUK_INTERNAL_DECL void duk_js_execute_bytecode(duk_hthread *exec_thr);
+
+#endif /* DUK_JS_H_INCLUDED */
+/* #include duk_numconv.h */
+#line 1 "duk_numconv.h"
+/*
+ * Number-to-string conversion. The semantics of these is very tightly
+ * bound with the Ecmascript semantics required for call sites.
+ */
+
+#if !defined(DUK_NUMCONV_H_INCLUDED)
+#define DUK_NUMCONV_H_INCLUDED
+
+/* Output a specified number of digits instead of using the shortest
+ * form. Used for toPrecision() and toFixed().
+ */
+#define DUK_N2S_FLAG_FIXED_FORMAT (1U << 0)
+
+/* Force exponential format. Used for toExponential(). */
+#define DUK_N2S_FLAG_FORCE_EXP (1U << 1)
+
+/* If number would need zero padding (for whole number part), use
+ * exponential format instead. E.g. if input number is 12300, 3
+ * digits are generated ("123"), output "1.23e+4" instead of "12300".
+ * Used for toPrecision().
+ */
+#define DUK_N2S_FLAG_NO_ZERO_PAD (1U << 2)
+
+/* Digit count indicates number of fractions (i.e. an absolute
+ * digit index instead of a relative one). Used together with
+ * DUK_N2S_FLAG_FIXED_FORMAT for toFixed().
+ */
+#define DUK_N2S_FLAG_FRACTION_DIGITS (1U << 3)
+
+/*
+ * String-to-number conversion
+ */
+
+/* Maximum exponent value when parsing numbers. This is not strictly
+ * compliant as there should be no upper limit, but as we parse the
+ * exponent without a bigint, impose some limit.
+ */
+#define DUK_S2N_MAX_EXPONENT 1000000000
+
+/* Trim white space (= allow leading and trailing whitespace) */
+#define DUK_S2N_FLAG_TRIM_WHITE (1U << 0)
+
+/* Allow exponent */
+#define DUK_S2N_FLAG_ALLOW_EXP (1U << 1)
+
+/* Allow trailing garbage (e.g. treat "123foo" as "123) */
+#define DUK_S2N_FLAG_ALLOW_GARBAGE (1U << 2)
+
+/* Allow leading plus sign */
+#define DUK_S2N_FLAG_ALLOW_PLUS (1U << 3)
+
+/* Allow leading minus sign */
+#define DUK_S2N_FLAG_ALLOW_MINUS (1U << 4)
+
+/* Allow 'Infinity' */
+#define DUK_S2N_FLAG_ALLOW_INF (1U << 5)
+
+/* Allow fraction part */
+#define DUK_S2N_FLAG_ALLOW_FRAC (1U << 6)
+
+/* Allow naked fraction (e.g. ".123") */
+#define DUK_S2N_FLAG_ALLOW_NAKED_FRAC (1U << 7)
+
+/* Allow empty fraction (e.g. "123.") */
+#define DUK_S2N_FLAG_ALLOW_EMPTY_FRAC (1U << 8)
+
+/* Allow empty string to be interpreted as 0 */
+#define DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO (1U << 9)
+
+/* Allow leading zeroes (e.g. "0123" -> "123") */
+#define DUK_S2N_FLAG_ALLOW_LEADING_ZERO (1U << 10)
+
+/* Allow automatic detection of hex base ("0x" or "0X" prefix),
+ * overrides radix argument and forces integer mode.
+ */
+#define DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT (1U << 11)
+
+/* Allow automatic detection of legacy octal base ("0n"),
+ * overrides radix argument and forces integer mode.
+ */
+#define DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT (1U << 12)
+
+/* Allow automatic detection of ES2015 octal base ("0o123"),
+ * overrides radix argument and forces integer mode.
+ */
+#define DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT (1U << 13)
+
+/* Allow automatic detection of ES2015 binary base ("0b10001"),
+ * overrides radix argument and forces integer mode.
+ */
+#define DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT (1U << 14)
+
+/*
+ * Prototypes
+ */
+
+DUK_INTERNAL_DECL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags);
+DUK_INTERNAL_DECL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags);
+
+#endif /* DUK_NUMCONV_H_INCLUDED */
+/* #include duk_bi_protos.h */
+#line 1 "duk_bi_protos.h"
+/*
+ * Prototypes for built-in functions not automatically covered by the
+ * header declarations emitted by genbuiltins.py.
+ */
+
+#if !defined(DUK_BUILTIN_PROTOS_H_INCLUDED)
+#define DUK_BUILTIN_PROTOS_H_INCLUDED
+
+/* Buffer size needed for ISO 8601 formatting.
+ * Accurate value is 32 + 1 for NUL termination:
+ * >>> len('+123456-01-23T12:34:56.123+12:34')
+ * 32
+ * Include additional space to be safe.
+ */
+#define DUK_BI_DATE_ISO8601_BUFSIZE 40
+
+/* Helpers exposed for internal use */
+DUK_INTERNAL_DECL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags);
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags);
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year);
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x);
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t year);
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x);
+/* Built-in providers */
+#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY)
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_gettimeofday(void);
+#endif
+#if defined(DUK_USE_DATE_NOW_TIME)
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_time(void);
+#endif
+#if defined(DUK_USE_DATE_NOW_WINDOWS)
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows(void);
+#endif
+#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS)
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows_subms(void);
+#endif
+#if defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME)
+DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d);
+#endif
+#if defined(DUK_USE_DATE_TZO_WINDOWS)
+DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d);
+#endif
+#if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST)
+DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d);
+#endif
+#if defined(DUK_USE_DATE_PRS_STRPTIME)
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str);
+#endif
+#if defined(DUK_USE_DATE_PRS_GETDATE)
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str);
+#endif
+#if defined(DUK_USE_DATE_FMT_STRFTIME)
+DUK_INTERNAL_DECL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags);
+#endif
+
+#if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME)
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void);
+#endif
+#if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC)
+DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void);
+#endif
+
+DUK_INTERNAL_DECL
+void duk_bi_json_parse_helper(duk_hthread *thr,
+ duk_idx_t idx_value,
+ duk_idx_t idx_reviver,
+ duk_small_uint_t flags);
+DUK_INTERNAL_DECL
+void duk_bi_json_stringify_helper(duk_hthread *thr,
+ duk_idx_t idx_value,
+ duk_idx_t idx_replacer,
+ duk_idx_t idx_space,
+ duk_small_uint_t flags);
+
+DUK_INTERNAL_DECL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr);
+
+#if defined(DUK_USE_ES6_PROXY)
+DUK_INTERNAL_DECL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags);
+#endif
+
+#endif /* DUK_BUILTIN_PROTOS_H_INCLUDED */
+/* #include duk_selftest.h */
+#line 1 "duk_selftest.h"
+/*
+ * Selftest code
+ */
+
+#if !defined(DUK_SELFTEST_H_INCLUDED)
+#define DUK_SELFTEST_H_INCLUDED
+
+#if defined(DUK_USE_SELF_TESTS)
+DUK_INTERNAL_DECL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *udata);
+#endif
+
+#endif /* DUK_SELFTEST_H_INCLUDED */
+#line 82 "duk_internal.h"
+
+#endif /* DUK_INTERNAL_H_INCLUDED */
+#line 10 "duk_replacements.c"
+
+#if defined(DUK_USE_COMPUTED_NAN)
+DUK_INTERNAL double duk_computed_nan;
+#endif
+
+#if defined(DUK_USE_COMPUTED_INFINITY)
+DUK_INTERNAL double duk_computed_infinity;
+#endif
+
+#if defined(DUK_USE_REPL_FPCLASSIFY)
+DUK_INTERNAL int duk_repl_fpclassify(double x) {
+ duk_double_union u;
+ duk_uint_fast16_t expt;
+ duk_small_int_t mzero;
+
+ u.d = x;
+ expt = (duk_uint_fast16_t) (u.us[DUK_DBL_IDX_US0] & 0x7ff0UL);
+ if (expt > 0x0000UL && expt < 0x7ff0UL) {
+ /* expt values [0x001,0x7fe] = normal */
+ return DUK_FP_NORMAL;
+ }
+
+ mzero = (u.ui[DUK_DBL_IDX_UI1] == 0 && (u.ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) == 0);
+ if (expt == 0x0000UL) {
+ /* expt 0x000 is zero/subnormal */
+ if (mzero) {
+ return DUK_FP_ZERO;
+ } else {
+ return DUK_FP_SUBNORMAL;
+ }
+ } else {
+ /* expt 0xfff is infinite/nan */
+ if (mzero) {
+ return DUK_FP_INFINITE;
+ } else {
+ return DUK_FP_NAN;
+ }
+ }
+}
+#endif
+
+#if defined(DUK_USE_REPL_SIGNBIT)
+DUK_INTERNAL int duk_repl_signbit(double x) {
+ duk_double_union u;
+ u.d = x;
+ return (int) (u.uc[DUK_DBL_IDX_UC0] & 0x80UL);
+}
+#endif
+
+#if defined(DUK_USE_REPL_ISFINITE)
+DUK_INTERNAL int duk_repl_isfinite(double x) {
+ int c = DUK_FPCLASSIFY(x);
+ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+#endif
+
+#if defined(DUK_USE_REPL_ISNAN)
+DUK_INTERNAL int duk_repl_isnan(double x) {
+ int c = DUK_FPCLASSIFY(x);
+ return (c == DUK_FP_NAN);
+}
+#endif
+
+#if defined(DUK_USE_REPL_ISINF)
+DUK_INTERNAL int duk_repl_isinf(double x) {
+ int c = DUK_FPCLASSIFY(x);
+ return (c == DUK_FP_INFINITE);
+}
+#endif
+#line 1 "duk_debug_macros.c"
+/*
+ * Debugging macro calls.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_DEBUG)
+
+/*
+ * Debugging enabled
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#if !defined(DUK_USE_DEBUG_WRITE)
+#error debugging enabled (DUK_USE_DEBUG) but DUK_USE_DEBUG_WRITE not defined
+#endif
+
+#define DUK__DEBUG_BUFSIZE DUK_USE_DEBUG_BUFSIZE
+
+#if defined(DUK_USE_VARIADIC_MACROS)
+
+DUK_INTERNAL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...) {
+ va_list ap;
+ long arg_level;
+ const char *arg_file;
+ long arg_line;
+ const char *arg_func;
+ const char *arg_msg;
+ char buf[DUK__DEBUG_BUFSIZE];
+
+ va_start(ap, fmt);
+
+ DUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE);
+ duk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap);
+
+ arg_level = (long) level;
+ arg_file = (const char *) file;
+ arg_line = (long) line;
+ arg_func = (const char *) func;
+ arg_msg = (const char *) buf;
+ DUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg);
+
+ va_end(ap);
+}
+
+#else /* DUK_USE_VARIADIC_MACROS */
+
+DUK_INTERNAL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE];
+DUK_INTERNAL duk_int_t duk_debug_line_stash;
+DUK_INTERNAL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE];
+DUK_INTERNAL duk_int_t duk_debug_level_stash;
+
+DUK_INTERNAL void duk_debug_log(const char *fmt, ...) {
+ va_list ap;
+ long arg_level;
+ const char *arg_file;
+ long arg_line;
+ const char *arg_func;
+ const char *arg_msg;
+ char buf[DUK__DEBUG_BUFSIZE];
+
+ va_start(ap, fmt);
+
+ DUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE);
+ duk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap);
+
+ arg_level = (long) duk_debug_level_stash;
+ arg_file = (const char *) duk_debug_file_stash;
+ arg_line = (long) duk_debug_line_stash;
+ arg_func = (const char *) duk_debug_func_stash;
+ arg_msg = (const char *) buf;
+ DUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg);
+
+ va_end(ap);
+}
+
+#endif /* DUK_USE_VARIADIC_MACROS */
+
+#else /* DUK_USE_DEBUG */
+
+/*
+ * Debugging disabled
+ */
+
+#endif /* DUK_USE_DEBUG */
+
+/* automatic undefs */
+#undef DUK__DEBUG_BUFSIZE
+#line 1 "duk_builtins.c"
+/*
+ * Automatically generated by genbuiltins.py, do not edit!
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_ASSERTIONS)
+#define DUK__REFCINIT(refc) 0 /*h_assert_refcount*/, (refc) /*actual*/
+#else
+#define DUK__REFCINIT(refc) (refc) /*actual*/
+#endif
+
+#if defined(DUK_USE_ROM_STRINGS)
+#error ROM support not enabled, rerun configure.py with --rom-support
+#else /* DUK_USE_ROM_STRINGS */
+DUK_INTERNAL const duk_uint8_t duk_strings_data[892] = {
+79,40,209,144,168,105,6,78,54,139,89,185,44,48,46,90,120,8,154,140,35,103,
+35,113,193,73,5,52,112,180,104,166,135,52,188,4,98,12,27,146,156,80,211,31,
+129,115,150,64,52,220,109,24,18,68,156,24,38,67,114,36,55,9,119,151,132,
+140,93,18,113,128,153,201,212,201,205,2,248,8,196,24,224,104,82,146,40,224,
+193,48,114,168,37,147,196,54,123,28,4,98,12,43,148,67,103,177,192,70,32,
+196,121,68,54,123,28,18,192,199,144,124,4,98,12,43,136,108,244,117,184,8,
+196,24,95,40,134,207,71,91,128,140,65,133,113,13,158,158,151,1,24,131,11,
+229,16,217,233,233,112,17,136,48,206,21,110,4,244,244,184,8,196,24,103,10,
+183,2,122,218,156,4,98,12,24,203,112,64,179,113,193,79,8,218,155,131,32,
+184,70,212,220,13,10,82,68,252,123,144,217,146,38,228,207,18,0,100,37,64,
+178,212,11,161,17,104,162,96,10,200,193,57,165,65,169,16,5,100,81,27,70,18,
+32,10,200,68,185,13,116,221,197,184,64,89,57,41,197,13,49,234,5,208,156,
+113,87,55,118,147,20,187,56,161,166,92,221,212,73,210,236,226,134,153,115,
+119,76,201,203,179,138,26,99,73,212,136,136,164,25,174,137,56,32,72,137,
+101,23,52,45,13,34,86,9,79,136,104,201,114,149,96,52,138,134,140,151,75,
+226,233,186,120,121,22,39,54,83,141,5,55,68,236,36,164,3,16,225,115,150,64,
+52,205,163,2,72,154,83,138,26,99,75,12,11,150,103,5,36,20,211,70,140,133,
+67,72,49,241,160,227,81,196,52,168,106,39,132,252,183,136,105,80,212,79,2,
+249,110,128,126,88,95,133,109,237,237,237,151,235,127,46,249,119,203,190,
+186,206,33,181,2,208,61,190,12,19,34,65,19,81,132,108,228,97,1,107,33,12,
+32,45,100,137,64,247,175,9,19,155,41,198,130,155,134,69,146,100,227,226,
+231,146,51,192,204,73,140,224,145,221,102,241,68,196,157,34,79,143,139,166,
+233,225,228,227,138,157,173,167,197,211,118,214,210,38,238,74,113,67,76,
+105,187,169,147,154,73,225,228,32,193,48,25,100,105,166,113,200,147,44,166,
+1,40,79,18,150,134,147,141,163,2,72,171,115,147,136,4,65,130,96,35,64,194,
+32,168,89,56,208,48,135,123,144,217,146,39,220,228,193,19,18,101,220,227,
+73,121,167,115,129,196,200,39,12,136,220,225,93,22,1,114,62,231,42,8,176,
+15,62,231,36,234,68,68,70,231,30,45,37,161,164,38,231,24,7,159,115,149,4,
+72,218,171,115,133,67,64,180,100,145,54,231,42,5,208,135,19,152,244,44,133,
+67,95,73,164,145,143,5,18,2,100,65,35,30,76,241,117,134,70,212,103,37,204,
+16,72,154,218,130,77,196,145,63,127,123,106,141,25,11,189,243,169,198,132,
+251,235,119,247,182,154,6,239,124,234,113,161,62,250,221,253,237,164,52,
+187,223,58,156,104,79,190,187,127,123,105,168,105,119,190,117,56,208,159,
+125,118,254,246,209,104,209,111,124,234,113,161,62,250,205,253,162,209,162,
+249,212,227,66,125,244,161,137,0,162,8,18,33,68,9,136,232,19,155,52,54,132,
+64,200,26,24,196,137,198,66,130,139,153,134,69,146,100,16,220,66,46,68,57,
+80,208,45,120,25,93,20,22,141,20,208,230,137,5,18,26,164,54,83,3,68,71,20,
+109,37,141,18,78,145,105,165,100,76,71,36,206,137,22,103,139,172,57,199,6,
+158,30,71,20,117,4,74,39,54,83,37,92,129,150,199,66,200,75,34,103,40,150,9,
+72,132,109,24,98,93,238,140,206,75,204,141,28,140,134,61,209,153,101,71,
+146,36,109,22,178,78,52,33,74,5,200,138,67,30,178,48,141,156,146,134,204,
+145,40,4,65,172,147,59,192,37,0,196,59,226,138,130,100,75,226,233,144,83,
+32,204,250,5,104,17,165,48,77,2,46,16,69,140,
+};
+#endif /* DUK_USE_ROM_STRINGS */
+
+#if defined(DUK_USE_ROM_OBJECTS)
+#error ROM support not enabled, rerun configure.py with --rom-support
+#else /* DUK_USE_ROM_OBJECTS */
+/* native functions: 176 */
+DUK_INTERNAL const duk_c_function duk_bi_native_functions[176] = {
+ NULL,
+ duk_bi_array_constructor,
+ duk_bi_array_constructor_is_array,
+ duk_bi_array_prototype_concat,
+ duk_bi_array_prototype_indexof_shared,
+ duk_bi_array_prototype_iter_shared,
+ duk_bi_array_prototype_join_shared,
+ duk_bi_array_prototype_pop,
+ duk_bi_array_prototype_push,
+ duk_bi_array_prototype_reduce_shared,
+ duk_bi_array_prototype_reverse,
+ duk_bi_array_prototype_shift,
+ duk_bi_array_prototype_slice,
+ duk_bi_array_prototype_sort,
+ duk_bi_array_prototype_splice,
+ duk_bi_array_prototype_to_string,
+ duk_bi_array_prototype_unshift,
+ duk_bi_arraybuffer_constructor,
+ duk_bi_arraybuffer_isview,
+ duk_bi_boolean_constructor,
+ duk_bi_boolean_prototype_tostring_shared,
+ duk_bi_buffer_compare_shared,
+ duk_bi_buffer_readfield,
+ duk_bi_buffer_slice_shared,
+ duk_bi_buffer_writefield,
+ duk_bi_dataview_constructor,
+ duk_bi_date_constructor,
+ duk_bi_date_constructor_now,
+ duk_bi_date_constructor_parse,
+ duk_bi_date_constructor_utc,
+ duk_bi_date_prototype_get_shared,
+ duk_bi_date_prototype_get_timezone_offset,
+ duk_bi_date_prototype_set_shared,
+ duk_bi_date_prototype_set_time,
+ duk_bi_date_prototype_to_json,
+ duk_bi_date_prototype_tostring_shared,
+ duk_bi_date_prototype_value_of,
+ duk_bi_duktape_object_act,
+ duk_bi_duktape_object_compact,
+ duk_bi_duktape_object_dec,
+ duk_bi_duktape_object_enc,
+ duk_bi_duktape_object_fin,
+ duk_bi_duktape_object_gc,
+ duk_bi_duktape_object_info,
+ duk_bi_error_constructor_shared,
+ duk_bi_error_prototype_filename_getter,
+ duk_bi_error_prototype_filename_setter,
+ duk_bi_error_prototype_linenumber_getter,
+ duk_bi_error_prototype_linenumber_setter,
+ duk_bi_error_prototype_stack_getter,
+ duk_bi_error_prototype_stack_setter,
+ duk_bi_error_prototype_to_string,
+ duk_bi_function_constructor,
+ duk_bi_function_prototype,
+ duk_bi_function_prototype_apply,
+ duk_bi_function_prototype_bind,
+ duk_bi_function_prototype_call,
+ duk_bi_function_prototype_to_string,
+ duk_bi_global_object_decode_uri,
+ duk_bi_global_object_decode_uri_component,
+ duk_bi_global_object_encode_uri,
+ duk_bi_global_object_encode_uri_component,
+ duk_bi_global_object_escape,
+ duk_bi_global_object_eval,
+ duk_bi_global_object_is_finite,
+ duk_bi_global_object_is_nan,
+ duk_bi_global_object_parse_float,
+ duk_bi_global_object_parse_int,
+ duk_bi_global_object_unescape,
+ duk_bi_json_object_parse,
+ duk_bi_json_object_stringify,
+ duk_bi_math_object_clz32,
+ duk_bi_math_object_hypot,
+ duk_bi_math_object_imul,
+ duk_bi_math_object_max,
+ duk_bi_math_object_min,
+ duk_bi_math_object_onearg_shared,
+ duk_bi_math_object_random,
+ duk_bi_math_object_sign,
+ duk_bi_math_object_twoarg_shared,
+ duk_bi_native_function_length,
+ duk_bi_native_function_name,
+ duk_bi_nodejs_buffer_byte_length,
+ duk_bi_nodejs_buffer_concat,
+ duk_bi_nodejs_buffer_constructor,
+ duk_bi_nodejs_buffer_copy,
+ duk_bi_nodejs_buffer_fill,
+ duk_bi_nodejs_buffer_is_buffer,
+ duk_bi_nodejs_buffer_is_encoding,
+ duk_bi_nodejs_buffer_tojson,
+ duk_bi_nodejs_buffer_tostring,
+ duk_bi_nodejs_buffer_write,
+ duk_bi_number_constructor,
+ duk_bi_number_prototype_to_exponential,
+ duk_bi_number_prototype_to_fixed,
+ duk_bi_number_prototype_to_locale_string,
+ duk_bi_number_prototype_to_precision,
+ duk_bi_number_prototype_to_string,
+ duk_bi_number_prototype_value_of,
+ duk_bi_object_constructor,
+ duk_bi_object_constructor_assign,
+ duk_bi_object_constructor_create,
+ duk_bi_object_constructor_define_properties,
+ duk_bi_object_constructor_define_property,
+ duk_bi_object_constructor_get_own_property_descriptor,
+ duk_bi_object_constructor_is,
+ duk_bi_object_constructor_is_extensible,
+ duk_bi_object_constructor_is_sealed_frozen_shared,
+ duk_bi_object_constructor_keys_shared,
+ duk_bi_object_constructor_prevent_extensions,
+ duk_bi_object_constructor_seal_freeze_shared,
+ duk_bi_object_getprototype_shared,
+ duk_bi_object_prototype_defineaccessor,
+ duk_bi_object_prototype_has_own_property,
+ duk_bi_object_prototype_is_prototype_of,
+ duk_bi_object_prototype_lookupaccessor,
+ duk_bi_object_prototype_property_is_enumerable,
+ duk_bi_object_prototype_to_locale_string,
+ duk_bi_object_prototype_to_string,
+ duk_bi_object_prototype_value_of,
+ duk_bi_object_setprototype_shared,
+ duk_bi_performance_now,
+ duk_bi_pointer_constructor,
+ duk_bi_pointer_prototype_tostring_shared,
+ duk_bi_proxy_constructor,
+ duk_bi_reflect_apply,
+ duk_bi_reflect_construct,
+ duk_bi_reflect_object_delete_property,
+ duk_bi_reflect_object_get,
+ duk_bi_reflect_object_has,
+ duk_bi_reflect_object_set,
+ duk_bi_regexp_constructor,
+ duk_bi_regexp_prototype_exec,
+ duk_bi_regexp_prototype_flags,
+ duk_bi_regexp_prototype_shared_getter,
+ duk_bi_regexp_prototype_test,
+ duk_bi_regexp_prototype_tostring,
+ duk_bi_string_constructor,
+ duk_bi_string_constructor_from_char_code,
+ duk_bi_string_constructor_from_code_point,
+ duk_bi_string_prototype_caseconv_shared,
+ duk_bi_string_prototype_char_at,
+ duk_bi_string_prototype_char_code_at,
+ duk_bi_string_prototype_concat,
+ duk_bi_string_prototype_includes,
+ duk_bi_string_prototype_indexof_shared,
+ duk_bi_string_prototype_locale_compare,
+ duk_bi_string_prototype_match,
+ duk_bi_string_prototype_repeat,
+ duk_bi_string_prototype_replace,
+ duk_bi_string_prototype_search,
+ duk_bi_string_prototype_slice,
+ duk_bi_string_prototype_split,
+ duk_bi_string_prototype_startswith_endswith,
+ duk_bi_string_prototype_substr,
+ duk_bi_string_prototype_substring,
+ duk_bi_string_prototype_to_string,
+ duk_bi_string_prototype_trim,
+ duk_bi_textdecoder_constructor,
+ duk_bi_textdecoder_prototype_decode,
+ duk_bi_textdecoder_prototype_shared_getter,
+ duk_bi_textencoder_constructor,
+ duk_bi_textencoder_prototype_encode,
+ duk_bi_textencoder_prototype_encoding_getter,
+ duk_bi_thread_constructor,
+ duk_bi_thread_current,
+ duk_bi_thread_resume,
+ duk_bi_thread_yield,
+ duk_bi_type_error_thrower,
+ duk_bi_typedarray_buffer_getter,
+ duk_bi_typedarray_bytelength_getter,
+ duk_bi_typedarray_byteoffset_getter,
+ duk_bi_typedarray_constructor,
+ duk_bi_typedarray_set,
+ duk_bi_uint8array_allocplain,
+ duk_bi_uint8array_plainof,
+};
+#if defined(DUK_USE_DOUBLE_LE)
+DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = {
+144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242,
+252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33,
+167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228,
+64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46,
+142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240,
+242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0,
+1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132,
+33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17,
+13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192,
+0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188,
+0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85,
+217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225,
+146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,0,0,
+0,0,3,225,255,51,0,0,0,0,0,0,3,193,255,47,18,1,172,19,120,71,10,25,196,136,
+113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,2,
+185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,130,
+249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,138,
+9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,190,15,
+38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,53,64,
+243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,124,
+35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,116,
+88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,240,70,
+68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,51,132,
+9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,105,27,
+60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,117,204,
+123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,65,112,
+152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,39,199,
+89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,58,205,
+227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,133,18,
+2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,39,31,23,
+60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,18,84,141,
+159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,194,197,
+217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,32,130,
+166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,151,21,0,
+100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,214,111,
+31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,10,62,
+46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,52,
+156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142,
+214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173,
+165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6,
+143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62,
+180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129,
+54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0,
+178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87,
+129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104,
+201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71,
+132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232,
+46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35,
+193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194,
+133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56,
+9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14,
+134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184,
+64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6,
+145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67,
+77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113,
+110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113,
+110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2,
+127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4,
+33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207,
+4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,255,255,255,255,
+239,127,19,214,33,187,85,2,232,72,0,32,0,0,0,0,0,0,25,136,0,0,0,0,0,0,31,
+15,228,122,247,73,19,69,73,180,134,149,13,68,241,0,0,0,0,0,0,3,193,252,143,
+90,67,2,104,169,54,144,210,161,168,158,32,0,0,0,0,0,0,120,127,142,73,78,20,
+0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68,
+13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,
+222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,
+112,164,0,0,0,0,0,0,124,63,226,117,119,128,25,55,112,96,153,57,41,197,13,
+53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,
+22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,
+113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,
+97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,
+190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,
+206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,
+76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,
+39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,
+39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,
+163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,
+100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,
+11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,
+157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,
+178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,
+9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,
+49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,
+34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,
+137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,
+199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,
+147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,
+54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,
+7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,
+89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,
+131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,
+231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,
+228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,
+235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,
+64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,
+168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,
+19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,0,0,0,0,93,105,160,91,
+60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,
+110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,
+36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,
+139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,
+28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,
+92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,
+100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,
+69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,
+68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,
+49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,
+98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,
+249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,
+136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,
+16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,
+194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,
+89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,104,71,161,196,201,45,167,146,59,
+68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,136,71,161,196,201,45,167,146,
+59,68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,168,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,200,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,232,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,8,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,40,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,72,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,0,0,0,1,2,1,135,52,102,32,76,72,1,246,136,235,
+103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,
+171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,
+158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,
+246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,
+37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,
+75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,
+39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,
+129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,
+17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,
+207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,
+207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,
+78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,
+146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,
+104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,
+146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,
+217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,
+162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,
+77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,
+117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,
+162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,
+102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,
+72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,
+52,171,138,69,133,95,130,160,4,234,219,163,161,0,89,86,214,238,197,172,9,0,
+31,86,221,40,29,231,63,95,200,69,220,199,225,122,183,27,72,144,63,160,138,
+217,81,197,125,207,195,117,110,54,142,129,32,7,114,147,10,189,229,237,159,
+130,235,209,0,96,181,17,83,236,132,37,0,63,101,8,207,71,107,74,6,105,219,
+251,52,245,7,49,248,94,202,17,158,148,12,211,183,246,105,234,15,99,242,159,
+129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,
+192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,
+27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,
+32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,
+188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,
+13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,
+72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,
+81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,
+153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,
+128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,
+164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,
+120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,
+16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,
+100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,
+108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,
+10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,
+138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,
+80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,
+48,141,156,0,0,0,0,0,0,15,3,243,49,135,16,143,67,137,146,91,79,36,118,136,
+178,48,141,156,0,0,0,0,0,0,15,3,245,20,5,173,194,227,214,4,55,0,0,21,196,7,
+122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,
+69,145,132,108,224,0,0,0,0,0,0,120,31,153,140,72,132,122,28,76,146,218,121,
+35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,80,132,122,28,76,146,218,
+121,35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,88,132,122,28,76,146,
+218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,96,132,122,28,76,
+146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,104,132,122,
+28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,112,
+132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,16,32,16,
+113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224,
+104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131,
+165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3,
+154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232,
+147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0,
+};
+#elif defined(DUK_USE_DOUBLE_BE)
+DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = {
+144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242,
+252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33,
+167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228,
+64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46,
+142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240,
+242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0,
+1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132,
+33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17,
+13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192,
+0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188,
+0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85,
+217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225,
+146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,1,255,
+224,0,0,0,0,0,3,51,1,255,192,0,0,0,0,0,3,47,18,1,172,19,120,71,10,25,196,
+136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,
+2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,
+130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,
+138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,
+190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,
+53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,
+124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,
+116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,
+240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,
+51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,
+105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,
+117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,
+65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,
+39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,
+58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,
+133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,
+39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,
+18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,
+194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,
+32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,
+151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,
+214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,
+10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,
+52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142,
+214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173,
+165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6,
+143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62,
+180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129,
+54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0,
+178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87,
+129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104,
+201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71,
+132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232,
+46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35,
+193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194,
+133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56,
+9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14,
+134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184,
+64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6,
+145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67,
+77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113,
+110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113,
+110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2,
+127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4,
+33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207,
+4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,127,239,255,255,255,255,
+255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,0,0,0,57,136,15,255,0,0,0,0,0,
+0,4,122,247,73,19,69,73,180,134,149,13,68,241,1,255,192,0,0,0,0,0,0,143,90,
+67,2,104,169,54,144,210,161,168,158,32,127,248,0,0,0,0,0,0,14,73,78,20,0,0,
+0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68,13,
+155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,222,
+17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,112,
+164,63,252,0,0,0,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13,53,224,
+65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,22,78,
+12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,113,67,
+77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,97,47,
+128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,190,
+96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,206,
+185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,76,
+150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,39,
+195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,39,
+198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,163,
+18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,100,40,
+15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,11,90,
+36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,157,160,
+3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,178,166,
+74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,9,205,
+28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,49,13,
+164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,34,79,
+135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,137,62,
+12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,199,54,
+103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,147,225,
+104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,54,223,
+224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,7,38,
+193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,89,
+252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,131,
+64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,231,
+197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,228,
+74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,235,1,
+64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,64,
+174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,168,
+167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,19,
+177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,32,105,221,0,0,0,0,0,91,60,
+149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,110,
+20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,36,14,
+100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,139,
+163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,28,1,
+204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,92,
+203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,100,
+73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,69,
+49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,68,
+152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,49,
+39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,98,
+79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,249,
+68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,136,
+108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,16,
+217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,194,
+173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,89,24,
+70,206,1,255,128,0,0,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59,68,89,
+24,70,206,1,255,128,0,0,0,0,0,1,153,51,136,71,161,196,201,45,167,146,59,68,
+89,24,70,206,1,255,128,0,0,0,0,0,1,153,51,168,71,161,196,201,45,167,146,59,
+68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,200,71,161,196,201,45,167,146,59,
+68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,232,71,161,196,201,45,167,146,59,
+68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,8,71,161,196,201,45,167,146,59,
+68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,40,71,161,196,201,45,167,146,59,
+68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,72,71,161,196,201,45,167,146,59,
+68,89,24,70,206,2,1,0,0,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235,103,
+177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,171,37,
+20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,158,142,
+183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,246,136,
+235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,37,20,
+138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,75,161,
+37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,39,208,
+146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,129,89,
+58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,17,214,
+207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,207,
+161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,207,
+98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,78,
+209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,146,
+155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,104,
+142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,146,
+155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,217,
+233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,162,
+137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,77,
+156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,117,
+179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,162,
+100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,102,
+53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,72,
+16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,32,2,
+223,133,69,138,43,180,132,234,219,163,161,1,0,9,174,198,238,213,84,88,31,
+86,221,40,7,252,197,200,95,223,71,61,225,122,183,27,72,144,15,253,197,81,
+217,74,224,191,131,117,110,54,142,129,32,31,237,229,189,138,147,114,135,2,
+235,209,1,0,36,135,237,81,16,180,96,63,101,8,207,71,107,74,1,255,53,4,243,
+51,249,222,104,94,202,17,158,148,3,255,106,9,230,103,243,188,210,159,129,
+228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,192,25,
+106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,27,165,
+171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,32,24,
+157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,188,8,
+134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,13,65,
+74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,72,1,
+98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,81,
+129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,153,
+78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,128,0,
+10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,164,237,
+35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,120,96,
+196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,16,113,
+137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,100,108,
+144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,108,185,
+36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,10,4,28,
+200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,138,89,
+18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,80,17,42,
+4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,48,141,156,
+3,255,0,0,0,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136,178,48,141,
+156,3,255,0,0,0,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7,122,192,134,
+241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,69,145,132,
+108,224,31,248,0,0,0,0,0,0,25,140,72,132,122,28,76,146,218,121,35,180,69,
+145,132,108,224,32,0,0,0,0,0,0,0,25,140,80,132,122,28,76,146,218,121,35,
+180,69,145,132,108,224,32,0,0,0,0,0,0,0,25,140,88,132,122,28,76,146,218,
+121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,96,132,122,28,76,146,
+218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,104,132,122,28,
+76,146,218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,112,132,
+122,28,76,146,218,121,35,180,69,145,132,108,224,32,16,0,0,0,0,0,0,16,113,
+225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224,104,
+82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131,165,
+1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3,154,
+102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232,147,
+161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0,
+};
+#elif defined(DUK_USE_DOUBLE_ME)
+DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = {
+144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242,
+252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33,
+167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228,
+64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46,
+142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240,
+242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0,
+1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132,
+33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17,
+13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192,
+0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188,
+0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85,
+217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225,
+146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,3,
+225,252,0,0,0,3,51,0,0,3,193,252,0,0,0,3,47,18,1,172,19,120,71,10,25,196,
+136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,
+2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,
+130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,
+138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,
+190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,
+53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,
+124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,
+116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,
+240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,
+51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,
+105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,
+117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,
+65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,
+39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,
+58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,
+133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,
+39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,
+18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,
+194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,
+32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,
+151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,
+214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,
+10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,
+52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142,
+214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173,
+165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6,
+143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62,
+180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129,
+54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0,
+178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87,
+129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104,
+201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71,
+132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232,
+46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35,
+193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194,
+133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56,
+9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14,
+134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184,
+64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6,
+145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67,
+77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113,
+110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113,
+110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2,
+127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4,
+33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207,
+4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,239,127,255,255,
+255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,32,0,0,25,136,0,0,31,15,224,0,
+0,0,4,122,247,73,19,69,73,180,134,149,13,68,241,0,0,3,193,252,0,0,0,0,143,
+90,67,2,104,169,54,144,210,161,168,158,32,0,0,120,127,128,0,0,0,14,73,78,
+20,0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,
+68,13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,
+222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,
+112,164,0,0,124,63,128,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13,
+53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,
+22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,
+113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,
+97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,
+190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,
+206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,
+76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,
+39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,
+39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,
+163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,
+100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,
+11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,
+157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,
+178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,
+9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,
+49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,
+34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,
+137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,
+199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,
+147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,
+54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,
+7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,
+89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,
+131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,
+231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,
+228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,
+235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,
+64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,
+168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,
+19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,93,105,160,0,0,0,0,91,
+60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,
+110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,
+36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,
+139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,
+28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,
+92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,
+100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,
+69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,
+68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,
+49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,
+98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,
+249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,
+136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,
+16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,
+194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,
+89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59,
+68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,136,71,161,196,201,45,167,146,
+59,68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,168,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,200,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,232,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,8,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,40,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,72,71,161,196,201,45,167,
+146,59,68,89,24,70,206,0,0,1,2,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235,
+103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,
+171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,
+158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,
+246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,
+37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,
+75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,
+39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,
+129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,
+17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,
+207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,
+207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,
+78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,
+146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,
+104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,
+146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,
+217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,
+162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,
+77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,
+117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,
+162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,
+102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,
+72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,5,
+95,130,160,52,171,138,69,132,234,219,163,161,2,197,172,9,0,89,86,214,236,
+31,86,221,40,8,69,220,199,253,231,63,95,193,122,183,27,72,144,17,197,125,
+207,255,160,138,217,67,117,110,54,142,129,32,61,229,237,159,135,114,147,10,
+130,235,209,3,236,132,37,0,96,181,17,80,63,101,8,207,71,107,74,4,245,7,49,
+254,105,219,251,48,94,202,17,158,148,9,234,15,99,252,211,183,246,98,159,
+129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,
+192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,
+27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,
+32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,
+188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,
+13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,
+72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,
+81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,
+153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,
+128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,
+164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,
+120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,
+16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,
+100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,
+108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,
+10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,
+138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,
+80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,
+48,141,156,0,0,15,3,240,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136,
+178,48,141,156,0,0,15,3,240,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7,
+122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,
+69,145,132,108,224,0,0,120,31,128,0,0,0,25,140,72,132,122,28,76,146,218,
+121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,80,132,122,28,76,146,
+218,121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,88,132,122,28,76,
+146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,96,132,122,
+28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,104,
+132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,
+140,112,132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,16,32,0,0,
+0,0,16,113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,
+18,224,104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,
+70,131,165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,
+7,78,3,154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,
+232,147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0,
+};
+#else
+#error invalid endianness defines
+#endif
+#endif /* DUK_USE_ROM_OBJECTS */
+
+/* automatic undefs */
+#undef DUK__REFCINIT
+#line 1 "duk_error_macros.c"
+/*
+ * Error and fatal handling.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#define DUK__ERRFMT_BUFSIZE 256 /* size for formatting buffers */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+
+DUK_INTERNAL DUK_COLD void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...) {
+ va_list ap;
+ char msg[DUK__ERRFMT_BUFSIZE];
+ va_start(ap, fmt);
+ (void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap);
+ msg[sizeof(msg) - 1] = (char) 0;
+ duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL));
+ va_end(ap); /* dead code, but ensures portability (see Linux man page notes) */
+}
+
+DUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg) {
+ duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL));
+}
+
+#else /* DUK_USE_VERBOSE_ERRORS */
+
+DUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code) {
+ duk_err_create_and_throw(thr, code);
+}
+
+#endif /* DUK_USE_VERBOSE_ERRORS */
+
+/*
+ * Error throwing helpers
+ */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+#if defined(DUK_USE_PARANOID_ERRORS)
+DUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) {
+ DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)",
+ expect_name, duk_get_type_name(thr, idx), (long) idx);
+}
+#else
+DUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) {
+ DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)",
+ expect_name, duk_push_string_readable(thr, idx), (long) idx);
+}
+#endif
+DUK_INTERNAL DUK_COLD void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_INTERNAL_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_ALLOC_FAILED);
+}
+DUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, message);
+}
+DUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, message);
+}
+DUK_INTERNAL DUK_COLD void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx) {
+ DUK_ERROR_RAW_FMT1(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, "invalid stack index %ld", (long) (idx));
+}
+DUK_INTERNAL DUK_COLD void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK);
+}
+DUK_INTERNAL DUK_COLD void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_ARGS);
+}
+DUK_INTERNAL DUK_COLD void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_STATE);
+}
+DUK_INTERNAL DUK_COLD void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
+ DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_TRAP_RESULT);
+}
+#else
+/* The file/line arguments are NULL and 0, they're ignored by DUK_ERROR_RAW()
+ * when non-verbose errors are used.
+ */
+
+DUK_NORETURN(DUK_LOCAL_DECL void duk__err_shared(duk_hthread *thr, duk_errcode_t code));
+DUK_LOCAL void duk__err_shared(duk_hthread *thr, duk_errcode_t code) {
+ DUK_ERROR_RAW(thr, NULL, 0, code, NULL);
+}
+DUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_RANGE_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_eval(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_EVAL_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_reference(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_REFERENCE_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_syntax(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_SYNTAX_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_type(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_TYPE_ERROR);
+}
+DUK_INTERNAL DUK_COLD void duk_err_uri(duk_hthread *thr) {
+ duk__err_shared(thr, DUK_ERR_URI_ERROR);
+}
+#endif
+
+/*
+ * Default fatal error handler
+ */
+
+DUK_INTERNAL DUK_COLD void duk_default_fatal_handler(void *udata, const char *msg) {
+ DUK_UNREF(udata);
+ DUK_UNREF(msg);
+
+#if defined(DUK_USE_FATAL_HANDLER)
+ /* duk_config.h provided a custom default fatal handler. */
+ DUK_D(DUK_DPRINT("custom default fatal error handler called: %s", msg ? msg : "NULL"));
+ DUK_USE_FATAL_HANDLER(udata, msg);
+#else
+ /* Default behavior is to abort() on error. There's no printout
+ * which makes this awkward, so it's always recommended to use an
+ * explicit fatal error handler.
+ *
+ * ====================================================================
+ * NOTE: If you are seeing this, you are most likely dealing with an
+ * uncaught error. You should provide a fatal error handler in Duktape
+ * heap creation, and should consider using a protected call as your
+ * first call into an empty Duktape context to properly handle errors.
+ * See:
+ * - http://duktape.org/guide.html#error-handling
+ * - http://wiki.duktape.org/HowtoFatalErrors.html
+ * - http://duktape.org/api.html#taglist-protected
+ * ====================================================================
+ */
+ DUK_D(DUK_DPRINT("built-in default fatal error handler called: %s", msg ? msg : "NULL"));
+ DUK_ABORT();
+#endif
+
+ DUK_D(DUK_DPRINT("fatal error handler returned, enter forever loop"));
+ for (;;) {
+ /* Loop forever to ensure we don't return. */
+ }
+}
+
+/* automatic undefs */
+#undef DUK__ERRFMT_BUFSIZE
+#line 1 "duk_unicode_support.c"
+/*
+ * Various Unicode help functions for character classification predicates,
+ * case conversion, decoding, etc.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Fast path tables
+ */
+
+#if defined(DUK_USE_IDCHAR_FASTPATH)
+DUK_INTERNAL const duk_int8_t duk_is_idchar_tab[128] = {
+ /* 0: not IdentifierStart or IdentifierPart
+ * 1: IdentifierStart and IdentifierPart
+ * -1: IdentifierPart only
+ */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00...0x0f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10...0x1f */
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20...0x2f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, /* 0x30...0x3f */
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40...0x4f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 0x50...0x5f */
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60...0x6f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 /* 0x70...0x7f */
+};
+#endif
+
+/*
+ * XUTF-8 and CESU-8 encoding/decoding
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp) {
+ duk_uint_fast32_t x = (duk_uint_fast32_t) cp;
+ if (x < 0x80UL) {
+ /* 7 bits */
+ return 1;
+ } else if (x < 0x800UL) {
+ /* 11 bits */
+ return 2;
+ } else if (x < 0x10000UL) {
+ /* 16 bits */
+ return 3;
+ } else if (x < 0x200000UL) {
+ /* 21 bits */
+ return 4;
+ } else if (x < 0x4000000UL) {
+ /* 26 bits */
+ return 5;
+ } else if (x < (duk_ucodepoint_t) 0x80000000UL) {
+ /* 31 bits */
+ return 6;
+ } else {
+ /* 36 bits */
+ return 7;
+ }
+}
+
+#if defined(DUK_USE_ASSERTIONS)
+DUK_INTERNAL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp) {
+ duk_uint_fast32_t x = (duk_uint_fast32_t) cp;
+ if (x < 0x80UL) {
+ /* 7 bits */
+ return 1;
+ } else if (x < 0x800UL) {
+ /* 11 bits */
+ return 2;
+ } else if (x < 0x10000UL) {
+ /* 16 bits */
+ return 3;
+ } else {
+ /* Encoded as surrogate pair, each encoding to 3 bytes for
+ * 6 bytes total. Codepoints above U+10FFFF encode as 6 bytes
+ * too, see duk_unicode_encode_cesu8().
+ */
+ return 3 + 3;
+ }
+}
+#endif /* DUK_USE_ASSERTIONS */
+
+DUK_INTERNAL const duk_uint8_t duk_unicode_xutf8_markers[7] = {
+ 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe
+};
+
+/* Encode to extended UTF-8; 'out' must have space for at least
+ * DUK_UNICODE_MAX_XUTF8_LENGTH bytes. Allows encoding of any
+ * 32-bit (unsigned) codepoint.
+ */
+DUK_INTERNAL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out) {
+ duk_uint_fast32_t x = (duk_uint_fast32_t) cp;
+ duk_small_int_t len;
+ duk_uint8_t marker;
+ duk_small_int_t i;
+
+ len = duk_unicode_get_xutf8_length(cp);
+ DUK_ASSERT(len > 0);
+
+ marker = duk_unicode_xutf8_markers[len - 1]; /* 64-bit OK because always >= 0 */
+
+ i = len;
+ DUK_ASSERT(i > 0);
+ do {
+ i--;
+ if (i > 0) {
+ out[i] = (duk_uint8_t) (0x80 + (x & 0x3f));
+ x >>= 6;
+ } else {
+ /* Note: masking of 'x' is not necessary because of
+ * range check and shifting -> no bits overlapping
+ * the marker should be set.
+ */
+ out[0] = (duk_uint8_t) (marker + x);
+ }
+ } while (i > 0);
+
+ return len;
+}
+
+/* Encode to CESU-8; 'out' must have space for at least
+ * DUK_UNICODE_MAX_CESU8_LENGTH bytes; codepoints above U+10FFFF
+ * will encode to garbage but won't overwrite the output buffer.
+ */
+DUK_INTERNAL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out) {
+ duk_uint_fast32_t x = (duk_uint_fast32_t) cp;
+ duk_small_int_t len;
+
+ if (x < 0x80UL) {
+ out[0] = (duk_uint8_t) x;
+ len = 1;
+ } else if (x < 0x800UL) {
+ out[0] = (duk_uint8_t) (0xc0 + ((x >> 6) & 0x1f));
+ out[1] = (duk_uint8_t) (0x80 + (x & 0x3f));
+ len = 2;
+ } else if (x < 0x10000UL) {
+ /* surrogate pairs get encoded here */
+ out[0] = (duk_uint8_t) (0xe0 + ((x >> 12) & 0x0f));
+ out[1] = (duk_uint8_t) (0x80 + ((x >> 6) & 0x3f));
+ out[2] = (duk_uint8_t) (0x80 + (x & 0x3f));
+ len = 3;
+ } else {
+ /*
+ * Unicode codepoints above U+FFFF are encoded as surrogate
+ * pairs here. This ensures that all CESU-8 codepoints are
+ * 16-bit values as expected in Ecmascript. The surrogate
+ * pairs always get a 3-byte encoding (each) in CESU-8.
+ * See: http://en.wikipedia.org/wiki/Surrogate_pair
+ *
+ * 20-bit codepoint, 10 bits (A and B) per surrogate pair:
+ *
+ * x = 0b00000000 0000AAAA AAAAAABB BBBBBBBB
+ * sp1 = 0b110110AA AAAAAAAA (0xd800 + ((x >> 10) & 0x3ff))
+ * sp2 = 0b110111BB BBBBBBBB (0xdc00 + (x & 0x3ff))
+ *
+ * Encoded into CESU-8:
+ *
+ * sp1 -> 0b11101101 (0xe0 + ((sp1 >> 12) & 0x0f))
+ * -> 0b1010AAAA (0x80 + ((sp1 >> 6) & 0x3f))
+ * -> 0b10AAAAAA (0x80 + (sp1 & 0x3f))
+ * sp2 -> 0b11101101 (0xe0 + ((sp2 >> 12) & 0x0f))
+ * -> 0b1011BBBB (0x80 + ((sp2 >> 6) & 0x3f))
+ * -> 0b10BBBBBB (0x80 + (sp2 & 0x3f))
+ *
+ * Note that 0x10000 must be subtracted first. The code below
+ * avoids the sp1, sp2 temporaries which saves around 20 bytes
+ * of code.
+ */
+
+ x -= 0x10000UL;
+
+ out[0] = (duk_uint8_t) (0xed);
+ out[1] = (duk_uint8_t) (0xa0 + ((x >> 16) & 0x0f));
+ out[2] = (duk_uint8_t) (0x80 + ((x >> 10) & 0x3f));
+ out[3] = (duk_uint8_t) (0xed);
+ out[4] = (duk_uint8_t) (0xb0 + ((x >> 6) & 0x0f));
+ out[5] = (duk_uint8_t) (0x80 + (x & 0x3f));
+ len = 6;
+ }
+
+ return len;
+}
+
+/* Decode helper. Return zero on error. */
+DUK_INTERNAL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp) {
+ const duk_uint8_t *p;
+ duk_uint32_t res;
+ duk_uint_fast8_t ch;
+ duk_small_int_t n;
+
+ DUK_UNREF(thr);
+
+ p = *ptr;
+ if (p < ptr_start || p >= ptr_end) {
+ goto fail;
+ }
+
+ /*
+ * UTF-8 decoder which accepts longer than standard byte sequences.
+ * This allows full 32-bit code points to be used.
+ */
+
+ ch = (duk_uint_fast8_t) (*p++);
+ if (ch < 0x80) {
+ /* 0xxx xxxx [7 bits] */
+ res = (duk_uint32_t) (ch & 0x7f);
+ n = 0;
+ } else if (ch < 0xc0) {
+ /* 10xx xxxx -> invalid */
+ goto fail;
+ } else if (ch < 0xe0) {
+ /* 110x xxxx 10xx xxxx [11 bits] */
+ res = (duk_uint32_t) (ch & 0x1f);
+ n = 1;
+ } else if (ch < 0xf0) {
+ /* 1110 xxxx 10xx xxxx 10xx xxxx [16 bits] */
+ res = (duk_uint32_t) (ch & 0x0f);
+ n = 2;
+ } else if (ch < 0xf8) {
+ /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx [21 bits] */
+ res = (duk_uint32_t) (ch & 0x07);
+ n = 3;
+ } else if (ch < 0xfc) {
+ /* 1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [26 bits] */
+ res = (duk_uint32_t) (ch & 0x03);
+ n = 4;
+ } else if (ch < 0xfe) {
+ /* 1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [31 bits] */
+ res = (duk_uint32_t) (ch & 0x01);
+ n = 5;
+ } else if (ch < 0xff) {
+ /* 1111 1110 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [36 bits] */
+ res = (duk_uint32_t) (0);
+ n = 6;
+ } else {
+ /* 8-byte format could be:
+ * 1111 1111 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [41 bits]
+ *
+ * However, this format would not have a zero bit following the
+ * leading one bits and would not allow 0xFF to be used as an
+ * "invalid xutf-8" marker for internal keys. Further, 8-byte
+ * encodings (up to 41 bit code points) are not currently needed.
+ */
+ goto fail;
+ }
+
+ DUK_ASSERT(p >= ptr_start); /* verified at beginning */
+ if (p + n > ptr_end) {
+ /* check pointer at end */
+ goto fail;
+ }
+
+ while (n > 0) {
+ DUK_ASSERT(p >= ptr_start && p < ptr_end);
+ ch = (duk_uint_fast8_t) (*p++);
+#if 0
+ if (ch & 0xc0 != 0x80) {
+ /* not a continuation byte */
+ p--;
+ *ptr = p;
+ *out_cp = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;
+ return 1;
+ }
+#endif
+ res = (res << 6) + (duk_uint32_t) (ch & 0x3f);
+ n--;
+ }
+
+ *ptr = p;
+ *out_cp = res;
+ return 1;
+
+ fail:
+ return 0;
+}
+
+/* used by e.g. duk_regexp_executor.c, string built-ins */
+DUK_INTERNAL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end) {
+ duk_ucodepoint_t cp;
+
+ if (duk_unicode_decode_xutf8(thr, ptr, ptr_start, ptr_end, &cp)) {
+ return cp;
+ }
+ DUK_ERROR_INTERNAL(thr);
+ DUK_UNREACHABLE();
+ return 0;
+}
+
+/* Compute (extended) utf-8 length without codepoint encoding validation,
+ * used for string interning.
+ *
+ * NOTE: This algorithm is performance critical, more so than string hashing
+ * in some cases. It is needed when interning a string and needs to scan
+ * every byte of the string with no skipping. Having an ASCII fast path
+ * is useful if possible in the algorithm. The current algorithms were
+ * chosen from several variants, based on x64 gcc -O2 testing. See:
+ * https://github.com/svaarala/duktape/pull/422
+ *
+ * NOTE: must match tools/dukutil.py:duk_unicode_unvalidated_utf8_length().
+ */
+
+#if defined(DUK_USE_PREFER_SIZE)
+/* Small variant; roughly 150 bytes smaller than the fast variant. */
+DUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) {
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_end;
+ duk_size_t ncont;
+ duk_size_t clen;
+
+ p = data;
+ p_end = data + blen;
+ ncont = 0;
+ while (p != p_end) {
+ duk_uint8_t x;
+ x = *p++;
+ if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) {
+ ncont++;
+ }
+ }
+
+ DUK_ASSERT(ncont <= blen);
+ clen = blen - ncont;
+ DUK_ASSERT(clen <= blen);
+ return clen;
+}
+#else /* DUK_USE_PREFER_SIZE */
+/* This seems like a good overall approach. Fast path for ASCII in 4 byte
+ * blocks.
+ */
+DUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) {
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_end;
+ const duk_uint32_t *p32_end;
+ const duk_uint32_t *p32;
+ duk_size_t ncont;
+ duk_size_t clen;
+
+ ncont = 0; /* number of continuation (non-initial) bytes in [0x80,0xbf] */
+ p = data;
+ p_end = data + blen;
+ if (blen < 16) {
+ goto skip_fastpath;
+ }
+
+ /* Align 'p' to 4; the input data may have arbitrary alignment.
+ * End of string check not needed because blen >= 16.
+ */
+ while (((duk_size_t) (const void *) p) & 0x03U) {
+ duk_uint8_t x;
+ x = *p++;
+ if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) {
+ ncont++;
+ }
+ }
+
+ /* Full, aligned 4-byte reads. */
+ p32_end = (const duk_uint32_t *) (const void *) (p + ((duk_size_t) (p_end - p) & (duk_size_t) (~0x03)));
+ p32 = (const duk_uint32_t *) (const void *) p;
+ while (p32 != (const duk_uint32_t *) p32_end) {
+ duk_uint32_t x;
+ x = *p32++;
+ if (DUK_LIKELY((x & 0x80808080UL) == 0)) {
+ ; /* ASCII fast path */
+ } else {
+ /* Flip highest bit of each byte which changes
+ * the bit pattern 10xxxxxx into 00xxxxxx which
+ * allows an easy bit mask test.
+ */
+ x ^= 0x80808080UL;
+ if (DUK_UNLIKELY(!(x & 0xc0000000UL))) {
+ ncont++;
+ }
+ if (DUK_UNLIKELY(!(x & 0x00c00000UL))) {
+ ncont++;
+ }
+ if (DUK_UNLIKELY(!(x & 0x0000c000UL))) {
+ ncont++;
+ }
+ if (DUK_UNLIKELY(!(x & 0x000000c0UL))) {
+ ncont++;
+ }
+ }
+ }
+ p = (const duk_uint8_t *) p32;
+ /* Fall through to handle the rest. */
+
+ skip_fastpath:
+ while (p != p_end) {
+ duk_uint8_t x;
+ x = *p++;
+ if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) {
+ ncont++;
+ }
+ }
+
+ DUK_ASSERT(ncont <= blen);
+ clen = blen - ncont;
+ DUK_ASSERT(clen <= blen);
+ return clen;
+}
+#endif /* DUK_USE_PREFER_SIZE */
+
+/*
+ * Unicode range matcher
+ *
+ * Matches a codepoint against a packed bitstream of character ranges.
+ * Used for slow path Unicode matching.
+ */
+
+/* Must match tools/extract_chars.py, generate_match_table3(). */
+DUK_LOCAL duk_uint32_t duk__uni_decode_value(duk_bitdecoder_ctx *bd_ctx) {
+ duk_uint32_t t;
+
+ t = (duk_uint32_t) duk_bd_decode(bd_ctx, 4);
+ if (t <= 0x0eU) {
+ return t;
+ }
+ t = (duk_uint32_t) duk_bd_decode(bd_ctx, 8);
+ if (t <= 0xfdU) {
+ return t + 0x0f;
+ }
+ if (t == 0xfeU) {
+ t = (duk_uint32_t) duk_bd_decode(bd_ctx, 12);
+ return t + 0x0fU + 0xfeU;
+ } else {
+ t = (duk_uint32_t) duk_bd_decode(bd_ctx, 24);
+ return t + 0x0fU + 0xfeU + 0x1000UL;
+ }
+}
+
+DUK_LOCAL duk_small_int_t duk__uni_range_match(const duk_uint8_t *unitab, duk_size_t unilen, duk_codepoint_t cp) {
+ duk_bitdecoder_ctx bd_ctx;
+ duk_codepoint_t prev_re;
+
+ DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));
+ bd_ctx.data = (const duk_uint8_t *) unitab;
+ bd_ctx.length = (duk_size_t) unilen;
+
+ prev_re = 0;
+ for (;;) {
+ duk_codepoint_t r1, r2;
+ r1 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx);
+ if (r1 == 0) {
+ break;
+ }
+ r2 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx);
+
+ r1 = prev_re + r1;
+ r2 = r1 + r2;
+ prev_re = r2;
+
+ /* [r1,r2] is the range */
+
+ DUK_DDD(DUK_DDDPRINT("duk__uni_range_match: cp=%06lx range=[0x%06lx,0x%06lx]",
+ (unsigned long) cp, (unsigned long) r1, (unsigned long) r2));
+ if (cp >= r1 && cp <= r2) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * "WhiteSpace" production check.
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp) {
+ /*
+ * E5 Section 7.2 specifies six characters specifically as
+ * white space:
+ *
+ * 0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;
+ * 000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;
+ * 000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
+ * 0020;SPACE;Zs;0;WS;;;;;N;;;;;
+ * 00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+ * FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+ *
+ * It also specifies any Unicode category 'Zs' characters as white
+ * space. These can be extracted with the "tools/extract_chars.py" script.
+ * Current result:
+ *
+ * RAW OUTPUT:
+ * ===========
+ * 0020;SPACE;Zs;0;WS;;;;;N;;;;;
+ * 00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+ * 1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+ * 180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;
+ * 2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+ * 2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+ * 2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+ * 2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
+ * 205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+ * 3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+ *
+ * RANGES:
+ * =======
+ * 0x0020
+ * 0x00a0
+ * 0x1680
+ * 0x180e
+ * 0x2000 ... 0x200a
+ * 0x202f
+ * 0x205f
+ * 0x3000
+ *
+ * A manual decoder (below) is probably most compact for this.
+ */
+
+ duk_uint_fast8_t lo;
+ duk_uint_fast32_t hi;
+
+ /* cp == -1 (EOF) never matches and causes return value 0 */
+
+ lo = (duk_uint_fast8_t) (cp & 0xff);
+ hi = (duk_uint_fast32_t) (cp >> 8); /* does not fit into an uchar */
+
+ if (hi == 0x0000UL) {
+ if (lo == 0x09U || lo == 0x0bU || lo == 0x0cU ||
+ lo == 0x20U || lo == 0xa0U) {
+ return 1;
+ }
+ } else if (hi == 0x0020UL) {
+ if (lo <= 0x0aU || lo == 0x2fU || lo == 0x5fU) {
+ return 1;
+ }
+ } else if (cp == 0x1680L || cp == 0x180eL || cp == 0x3000L ||
+ cp == 0xfeffL) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * "LineTerminator" production check.
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp) {
+ /*
+ * E5 Section 7.3
+ *
+ * A LineTerminatorSequence essentially merges <CR> <LF> sequences
+ * into a single line terminator. This must be handled by the caller.
+ */
+
+ if (cp == 0x000aL || cp == 0x000dL || cp == 0x2028L ||
+ cp == 0x2029L) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * "IdentifierStart" production check.
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp) {
+ /*
+ * E5 Section 7.6:
+ *
+ * IdentifierStart:
+ * UnicodeLetter
+ * $
+ * _
+ * \ UnicodeEscapeSequence
+ *
+ * IdentifierStart production has one multi-character production:
+ *
+ * \ UnicodeEscapeSequence
+ *
+ * The '\' character is -not- matched by this function. Rather, the caller
+ * should decode the escape and then call this function to check whether the
+ * decoded character is acceptable (see discussion in E5 Section 7.6).
+ *
+ * The "UnicodeLetter" alternative of the production allows letters
+ * from various Unicode categories. These can be extracted with the
+ * "tools/extract_chars.py" script.
+ *
+ * Because the result has hundreds of Unicode codepoint ranges, matching
+ * for any values >= 0x80 are done using a very slow range-by-range scan
+ * and a packed range format.
+ *
+ * The ASCII portion (codepoints 0x00 ... 0x7f) is fast-pathed below because
+ * it matters the most. The ASCII related ranges of IdentifierStart are:
+ *
+ * 0x0041 ... 0x005a ['A' ... 'Z']
+ * 0x0061 ... 0x007a ['a' ... 'z']
+ * 0x0024 ['$']
+ * 0x005f ['_']
+ */
+
+ /* ASCII (and EOF) fast path -- quick accept and reject */
+ if (cp <= 0x7fL) {
+#if defined(DUK_USE_IDCHAR_FASTPATH)
+ return (cp >= 0) && (duk_is_idchar_tab[cp] > 0);
+#else
+ if ((cp >= 'a' && cp <= 'z') ||
+ (cp >= 'A' && cp <= 'Z') ||
+ cp == '_' || cp == '$') {
+ return 1;
+ }
+ return 0;
+#endif
+ }
+
+ /* Non-ASCII slow path (range-by-range linear comparison), very slow */
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+ if (duk__uni_range_match(duk_unicode_ids_noa,
+ (duk_size_t) sizeof(duk_unicode_ids_noa),
+ (duk_codepoint_t) cp)) {
+ return 1;
+ }
+ return 0;
+#else
+ if (cp < 0x10000L) {
+ if (duk__uni_range_match(duk_unicode_ids_noabmp,
+ sizeof(duk_unicode_ids_noabmp),
+ (duk_codepoint_t) cp)) {
+ return 1;
+ }
+ return 0;
+ } else {
+ /* without explicit non-BMP support, assume non-BMP characters
+ * are always accepted as identifier characters.
+ */
+ return 1;
+ }
+#endif
+}
+
+/*
+ * "IdentifierPart" production check.
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp) {
+ /*
+ * E5 Section 7.6:
+ *
+ * IdentifierPart:
+ * IdentifierStart
+ * UnicodeCombiningMark
+ * UnicodeDigit
+ * UnicodeConnectorPunctuation
+ * <ZWNJ> [U+200C]
+ * <ZWJ> [U+200D]
+ *
+ * IdentifierPart production has one multi-character production
+ * as part of its IdentifierStart alternative. The '\' character
+ * of an escape sequence is not matched here, see discussion in
+ * duk_unicode_is_identifier_start().
+ *
+ * To match non-ASCII characters (codepoints >= 0x80), a very slow
+ * linear range-by-range scan is used. The codepoint is first compared
+ * to the IdentifierStart ranges, and if it doesn't match, then to a
+ * set consisting of code points in IdentifierPart but not in
+ * IdentifierStart. This is done to keep the unicode range data small,
+ * at the expense of speed.
+ *
+ * The ASCII fast path consists of:
+ *
+ * 0x0030 ... 0x0039 ['0' ... '9', UnicodeDigit]
+ * 0x0041 ... 0x005a ['A' ... 'Z', IdentifierStart]
+ * 0x0061 ... 0x007a ['a' ... 'z', IdentifierStart]
+ * 0x0024 ['$', IdentifierStart]
+ * 0x005f ['_', IdentifierStart and
+ * UnicodeConnectorPunctuation]
+ *
+ * UnicodeCombiningMark has no code points <= 0x7f.
+ *
+ * The matching code reuses the "identifier start" tables, and then
+ * consults a separate range set for characters in "identifier part"
+ * but not in "identifier start". These can be extracted with the
+ * "tools/extract_chars.py" script.
+ *
+ * UnicodeCombiningMark -> categories Mn, Mc
+ * UnicodeDigit -> categories Nd
+ * UnicodeConnectorPunctuation -> categories Pc
+ */
+
+ /* ASCII (and EOF) fast path -- quick accept and reject */
+ if (cp <= 0x7fL) {
+#if defined(DUK_USE_IDCHAR_FASTPATH)
+ return (cp >= 0) && (duk_is_idchar_tab[cp] != 0);
+#else
+ if ((cp >= 'a' && cp <= 'z') ||
+ (cp >= 'A' && cp <= 'Z') ||
+ (cp >= '0' && cp <= '9') ||
+ cp == '_' || cp == '$') {
+ return 1;
+ }
+ return 0;
+#endif
+ }
+
+ /* Non-ASCII slow path (range-by-range linear comparison), very slow */
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+ if (duk__uni_range_match(duk_unicode_ids_noa,
+ sizeof(duk_unicode_ids_noa),
+ (duk_codepoint_t) cp) ||
+ duk__uni_range_match(duk_unicode_idp_m_ids_noa,
+ sizeof(duk_unicode_idp_m_ids_noa),
+ (duk_codepoint_t) cp)) {
+ return 1;
+ }
+ return 0;
+#else
+ if (cp < 0x10000L) {
+ if (duk__uni_range_match(duk_unicode_ids_noabmp,
+ sizeof(duk_unicode_ids_noabmp),
+ (duk_codepoint_t) cp) ||
+ duk__uni_range_match(duk_unicode_idp_m_ids_noabmp,
+ sizeof(duk_unicode_idp_m_ids_noabmp),
+ (duk_codepoint_t) cp)) {
+ return 1;
+ }
+ return 0;
+ } else {
+ /* without explicit non-BMP support, assume non-BMP characters
+ * are always accepted as identifier characters.
+ */
+ return 1;
+ }
+#endif
+}
+
+/*
+ * Unicode letter check.
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp) {
+ /*
+ * Unicode letter is now taken to be the categories:
+ *
+ * Lu, Ll, Lt, Lm, Lo
+ *
+ * (Not sure if this is exactly correct.)
+ *
+ * The ASCII fast path consists of:
+ *
+ * 0x0041 ... 0x005a ['A' ... 'Z']
+ * 0x0061 ... 0x007a ['a' ... 'z']
+ */
+
+ /* ASCII (and EOF) fast path -- quick accept and reject */
+ if (cp <= 0x7fL) {
+ if ((cp >= 'a' && cp <= 'z') ||
+ (cp >= 'A' && cp <= 'Z')) {
+ return 1;
+ }
+ return 0;
+ }
+
+ /* Non-ASCII slow path (range-by-range linear comparison), very slow */
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+ if (duk__uni_range_match(duk_unicode_ids_noa,
+ sizeof(duk_unicode_ids_noa),
+ (duk_codepoint_t) cp) &&
+ !duk__uni_range_match(duk_unicode_ids_m_let_noa,
+ sizeof(duk_unicode_ids_m_let_noa),
+ (duk_codepoint_t) cp)) {
+ return 1;
+ }
+ return 0;
+#else
+ if (cp < 0x10000L) {
+ if (duk__uni_range_match(duk_unicode_ids_noabmp,
+ sizeof(duk_unicode_ids_noabmp),
+ (duk_codepoint_t) cp) &&
+ !duk__uni_range_match(duk_unicode_ids_m_let_noabmp,
+ sizeof(duk_unicode_ids_m_let_noabmp),
+ (duk_codepoint_t) cp)) {
+ return 1;
+ }
+ return 0;
+ } else {
+ /* without explicit non-BMP support, assume non-BMP characters
+ * are always accepted as letters.
+ */
+ return 1;
+ }
+#endif
+}
+
+/*
+ * Complex case conversion helper which decodes a bit-packed conversion
+ * control stream generated by tools/extract_caseconv.py. The conversion
+ * is very slow because it runs through the conversion data in a linear
+ * fashion to save space (which is why ASCII characters have a special
+ * fast path before arriving here).
+ *
+ * The particular bit counts etc have been determined experimentally to
+ * be small but still sufficient, and must match the Python script
+ * (tools/extract_caseconv.py).
+ *
+ * The return value is the case converted codepoint or -1 if the conversion
+ * results in multiple characters (this is useful for regexp Canonicalization
+ * operation). If 'buf' is not NULL, the result codepoint(s) are also
+ * appended to the hbuffer.
+ *
+ * Context and locale specific rules must be checked before consulting
+ * this function.
+ */
+
+DUK_LOCAL
+duk_codepoint_t duk__slow_case_conversion(duk_hthread *thr,
+ duk_bufwriter_ctx *bw,
+ duk_codepoint_t cp,
+ duk_bitdecoder_ctx *bd_ctx) {
+ duk_small_int_t skip = 0;
+ duk_small_int_t n;
+ duk_small_int_t t;
+ duk_small_int_t count;
+ duk_codepoint_t tmp_cp;
+ duk_codepoint_t start_i;
+ duk_codepoint_t start_o;
+
+ DUK_ASSERT(bd_ctx != NULL);
+ DUK_UNREF(thr);
+
+ DUK_DDD(DUK_DDDPRINT("slow case conversion for codepoint: %ld", (long) cp));
+
+ /* range conversion with a "skip" */
+ DUK_DDD(DUK_DDDPRINT("checking ranges"));
+ for (;;) {
+ skip++;
+ n = (duk_small_int_t) duk_bd_decode(bd_ctx, 6);
+ if (n == 0x3f) {
+ /* end marker */
+ break;
+ }
+ DUK_DDD(DUK_DDDPRINT("skip=%ld, n=%ld", (long) skip, (long) n));
+
+ while (n--) {
+ start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);
+ start_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);
+ count = (duk_small_int_t) duk_bd_decode(bd_ctx, 7);
+ DUK_DDD(DUK_DDDPRINT("range: start_i=%ld, start_o=%ld, count=%ld, skip=%ld",
+ (long) start_i, (long) start_o, (long) count, (long) skip));
+
+ if (cp >= start_i) {
+ tmp_cp = cp - start_i; /* always >= 0 */
+ if (tmp_cp < (duk_codepoint_t) count * (duk_codepoint_t) skip &&
+ (tmp_cp % (duk_codepoint_t) skip) == 0) {
+ DUK_DDD(DUK_DDDPRINT("range matches input codepoint"));
+ cp = start_o + tmp_cp;
+ goto single;
+ }
+ }
+ }
+ }
+
+ /* 1:1 conversion */
+ n = (duk_small_int_t) duk_bd_decode(bd_ctx, 7);
+ DUK_DDD(DUK_DDDPRINT("checking 1:1 conversions (count %ld)", (long) n));
+ while (n--) {
+ start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);
+ start_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);
+ DUK_DDD(DUK_DDDPRINT("1:1 conversion %ld -> %ld", (long) start_i, (long) start_o));
+ if (cp == start_i) {
+ DUK_DDD(DUK_DDDPRINT("1:1 matches input codepoint"));
+ cp = start_o;
+ goto single;
+ }
+ }
+
+ /* complex, multicharacter conversion */
+ n = (duk_small_int_t) duk_bd_decode(bd_ctx, 7);
+ DUK_DDD(DUK_DDDPRINT("checking 1:n conversions (count %ld)", (long) n));
+ while (n--) {
+ start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);
+ t = (duk_small_int_t) duk_bd_decode(bd_ctx, 2);
+ DUK_DDD(DUK_DDDPRINT("1:n conversion %ld -> %ld chars", (long) start_i, (long) t));
+ if (cp == start_i) {
+ DUK_DDD(DUK_DDDPRINT("1:n matches input codepoint"));
+ if (bw != NULL) {
+ while (t--) {
+ tmp_cp = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);
+ DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) tmp_cp);
+ }
+ }
+ return -1;
+ } else {
+ while (t--) {
+ (void) duk_bd_decode(bd_ctx, 16);
+ }
+ }
+ }
+
+ /* default: no change */
+ DUK_DDD(DUK_DDDPRINT("no rule matches, output is same as input"));
+ /* fall through */
+
+ single:
+ if (bw != NULL) {
+ DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp);
+ }
+ return cp;
+}
+
+/*
+ * Case conversion helper, with context/local sensitivity.
+ * For proper case conversion, one needs to know the character
+ * and the preceding and following characters, as well as
+ * locale/language.
+ */
+
+/* XXX: add 'language' argument when locale/language sensitive rule
+ * support added.
+ */
+DUK_LOCAL
+duk_codepoint_t duk__case_transform_helper(duk_hthread *thr,
+ duk_bufwriter_ctx *bw,
+ duk_codepoint_t cp,
+ duk_codepoint_t prev,
+ duk_codepoint_t next,
+ duk_bool_t uppercase) {
+ duk_bitdecoder_ctx bd_ctx;
+
+ /* fast path for ASCII */
+ if (cp < 0x80L) {
+ /* XXX: there are language sensitive rules for the ASCII range.
+ * If/when language/locale support is implemented, they need to
+ * be implemented here for the fast path. There are no context
+ * sensitive rules for ASCII range.
+ */
+
+ if (uppercase) {
+ if (cp >= 'a' && cp <= 'z') {
+ cp = cp - 'a' + 'A';
+ }
+ } else {
+ if (cp >= 'A' && cp <= 'Z') {
+ cp = cp - 'A' + 'a';
+ }
+ }
+
+ if (bw != NULL) {
+ DUK_BW_WRITE_RAW_U8(thr, bw, (duk_uint8_t) cp);
+ }
+ return cp;
+ }
+
+ /* context and locale specific rules which cannot currently be represented
+ * in the caseconv bitstream: hardcoded rules in C
+ */
+ if (uppercase) {
+ /* XXX: turkish / azeri */
+ } else {
+ /*
+ * Final sigma context specific rule. This is a rather tricky
+ * rule and this handling is probably not 100% correct now.
+ * The rule is not locale/language specific so it is supported.
+ */
+
+ if (cp == 0x03a3L && /* U+03A3 = GREEK CAPITAL LETTER SIGMA */
+ duk_unicode_is_letter(prev) && /* prev exists and is not a letter */
+ !duk_unicode_is_letter(next)) { /* next does not exist or next is not a letter */
+ /* Capital sigma occurred at "end of word", lowercase to
+ * U+03C2 = GREEK SMALL LETTER FINAL SIGMA. Otherwise
+ * fall through and let the normal rules lowercase it to
+ * U+03C3 = GREEK SMALL LETTER SIGMA.
+ */
+ cp = 0x03c2L;
+ goto singlechar;
+ }
+
+ /* XXX: lithuanian not implemented */
+ /* XXX: lithuanian, explicit dot rules */
+ /* XXX: turkish / azeri, lowercase rules */
+ }
+
+ /* 1:1 or special conversions, but not locale/context specific: script generated rules */
+ DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));
+ if (uppercase) {
+ bd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_uc;
+ bd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_uc);
+ } else {
+ bd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_lc;
+ bd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_lc);
+ }
+ return duk__slow_case_conversion(thr, bw, cp, &bd_ctx);
+
+ singlechar:
+ if (bw != NULL) {
+ DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp);
+ }
+ return cp;
+
+ /* unused now, not needed until Turkish/Azeri */
+#if 0
+ nochar:
+ return -1;
+#endif
+}
+
+/*
+ * Replace valstack top with case converted version.
+ */
+
+DUK_INTERNAL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase) {
+ duk_hstring *h_input;
+ duk_bufwriter_ctx bw_alloc;
+ duk_bufwriter_ctx *bw;
+ const duk_uint8_t *p, *p_start, *p_end;
+ duk_codepoint_t prev, curr, next;
+
+ h_input = duk_require_hstring(thr, -1); /* Accept symbols. */
+ DUK_ASSERT(h_input != NULL);
+
+ bw = &bw_alloc;
+ DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input));
+
+ /* [ ... input buffer ] */
+
+ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);
+ p = p_start;
+
+ prev = -1; DUK_UNREF(prev);
+ curr = -1;
+ next = -1;
+ for (;;) {
+ prev = curr;
+ curr = next;
+ next = -1;
+ if (p < p_end) {
+ next = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end);
+ } else {
+ /* end of input and last char has been processed */
+ if (curr < 0) {
+ break;
+ }
+ }
+
+ /* on first round, skip */
+ if (curr >= 0) {
+ /* XXX: could add a fast path to process chunks of input codepoints,
+ * but relative benefit would be quite small.
+ */
+
+ /* Ensure space for maximum multi-character result; estimate is overkill. */
+ DUK_BW_ENSURE(thr, bw, 8 * DUK_UNICODE_MAX_XUTF8_LENGTH);
+
+ duk__case_transform_helper(thr,
+ bw,
+ (duk_codepoint_t) curr,
+ prev,
+ next,
+ uppercase);
+ }
+ }
+
+ DUK_BW_COMPACT(thr, bw);
+ (void) duk_buffer_to_string(thr, -1); /* Safe, output is encoded. */
+ /* invalidates h_buf pointer */
+ duk_remove_m2(thr);
+}
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+
+/*
+ * Canonicalize() abstract operation needed for canonicalization of individual
+ * codepoints during regexp compilation and execution, see E5 Section 15.10.2.8.
+ * Note that codepoints are canonicalized one character at a time, so no context
+ * specific rules can apply. Locale specific rules can apply, though.
+ */
+
+DUK_INTERNAL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp) {
+#if defined(DUK_USE_REGEXP_CANON_WORKAROUND)
+ /* Fast canonicalization lookup at the cost of 128kB footprint. */
+ DUK_ASSERT(cp >= 0);
+ DUK_UNREF(thr);
+ if (DUK_LIKELY(cp < 0x10000L)) {
+ return (duk_codepoint_t) duk_unicode_re_canon_lookup[cp];
+ }
+ return cp;
+#else /* DUK_USE_REGEXP_CANON_WORKAROUND */
+ duk_codepoint_t y;
+
+ y = duk__case_transform_helper(thr,
+ NULL, /* NULL is allowed, no output */
+ cp, /* curr char */
+ -1, /* prev char */
+ -1, /* next char */
+ 1); /* uppercase */
+
+ if ((y < 0) || (cp >= 0x80 && y < 0x80)) {
+ /* multiple codepoint conversion or non-ASCII mapped to ASCII
+ * --> leave as is.
+ */
+ return cp;
+ }
+
+ return y;
+#endif /* DUK_USE_REGEXP_CANON_WORKAROUND */
+}
+
+/*
+ * E5 Section 15.10.2.6 "IsWordChar" abstract operation. Assume
+ * x < 0 for characters read outside the string.
+ */
+
+DUK_INTERNAL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t x) {
+ /*
+ * Note: the description in E5 Section 15.10.2.6 has a typo, it
+ * contains 'A' twice and lacks 'a'; the intent is [0-9a-zA-Z_].
+ */
+ if ((x >= '0' && x <= '9') ||
+ (x >= 'a' && x <= 'z') ||
+ (x >= 'A' && x <= 'Z') ||
+ (x == '_')) {
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Regexp range tables
+ */
+
+/* exposed because lexer needs these too */
+DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_digit[2] = {
+ (duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL,
+};
+DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_white[22] = {
+ (duk_uint16_t) 0x0009UL, (duk_uint16_t) 0x000DUL,
+ (duk_uint16_t) 0x0020UL, (duk_uint16_t) 0x0020UL,
+ (duk_uint16_t) 0x00A0UL, (duk_uint16_t) 0x00A0UL,
+ (duk_uint16_t) 0x1680UL, (duk_uint16_t) 0x1680UL,
+ (duk_uint16_t) 0x180EUL, (duk_uint16_t) 0x180EUL,
+ (duk_uint16_t) 0x2000UL, (duk_uint16_t) 0x200AUL,
+ (duk_uint16_t) 0x2028UL, (duk_uint16_t) 0x2029UL,
+ (duk_uint16_t) 0x202FUL, (duk_uint16_t) 0x202FUL,
+ (duk_uint16_t) 0x205FUL, (duk_uint16_t) 0x205FUL,
+ (duk_uint16_t) 0x3000UL, (duk_uint16_t) 0x3000UL,
+ (duk_uint16_t) 0xFEFFUL, (duk_uint16_t) 0xFEFFUL,
+};
+DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_wordchar[8] = {
+ (duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL,
+ (duk_uint16_t) 0x0041UL, (duk_uint16_t) 0x005AUL,
+ (duk_uint16_t) 0x005FUL, (duk_uint16_t) 0x005FUL,
+ (duk_uint16_t) 0x0061UL, (duk_uint16_t) 0x007AUL,
+};
+DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_digit[4] = {
+ (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL,
+ (duk_uint16_t) 0x003AUL, (duk_uint16_t) 0xFFFFUL,
+};
+DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_white[24] = {
+ (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x0008UL,
+ (duk_uint16_t) 0x000EUL, (duk_uint16_t) 0x001FUL,
+ (duk_uint16_t) 0x0021UL, (duk_uint16_t) 0x009FUL,
+ (duk_uint16_t) 0x00A1UL, (duk_uint16_t) 0x167FUL,
+ (duk_uint16_t) 0x1681UL, (duk_uint16_t) 0x180DUL,
+ (duk_uint16_t) 0x180FUL, (duk_uint16_t) 0x1FFFUL,
+ (duk_uint16_t) 0x200BUL, (duk_uint16_t) 0x2027UL,
+ (duk_uint16_t) 0x202AUL, (duk_uint16_t) 0x202EUL,
+ (duk_uint16_t) 0x2030UL, (duk_uint16_t) 0x205EUL,
+ (duk_uint16_t) 0x2060UL, (duk_uint16_t) 0x2FFFUL,
+ (duk_uint16_t) 0x3001UL, (duk_uint16_t) 0xFEFEUL,
+ (duk_uint16_t) 0xFF00UL, (duk_uint16_t) 0xFFFFUL,
+};
+DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10] = {
+ (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL,
+ (duk_uint16_t) 0x003AUL, (duk_uint16_t) 0x0040UL,
+ (duk_uint16_t) 0x005BUL, (duk_uint16_t) 0x005EUL,
+ (duk_uint16_t) 0x0060UL, (duk_uint16_t) 0x0060UL,
+ (duk_uint16_t) 0x007BUL, (duk_uint16_t) 0xFFFFUL,
+};
+
+#endif /* DUK_USE_REGEXP_SUPPORT */
+#line 1 "duk_util_misc.c"
+/*
+ * Misc util stuff
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Lowercase digits for radix values 2 to 36. Also doubles as lowercase
+ * hex nybble table.
+ */
+
+DUK_INTERNAL const duk_uint8_t duk_lc_digits[36] = {
+ DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3,
+ DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7,
+ DUK_ASC_8, DUK_ASC_9, DUK_ASC_LC_A, DUK_ASC_LC_B,
+ DUK_ASC_LC_C, DUK_ASC_LC_D, DUK_ASC_LC_E, DUK_ASC_LC_F,
+ DUK_ASC_LC_G, DUK_ASC_LC_H, DUK_ASC_LC_I, DUK_ASC_LC_J,
+ DUK_ASC_LC_K, DUK_ASC_LC_L, DUK_ASC_LC_M, DUK_ASC_LC_N,
+ DUK_ASC_LC_O, DUK_ASC_LC_P, DUK_ASC_LC_Q, DUK_ASC_LC_R,
+ DUK_ASC_LC_S, DUK_ASC_LC_T, DUK_ASC_LC_U, DUK_ASC_LC_V,
+ DUK_ASC_LC_W, DUK_ASC_LC_X, DUK_ASC_LC_Y, DUK_ASC_LC_Z
+};
+
+DUK_INTERNAL const duk_uint8_t duk_uc_nybbles[16] = {
+ DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3,
+ DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7,
+ DUK_ASC_8, DUK_ASC_9, DUK_ASC_UC_A, DUK_ASC_UC_B,
+ DUK_ASC_UC_C, DUK_ASC_UC_D, DUK_ASC_UC_E, DUK_ASC_UC_F
+};
+
+/*
+ * Table for hex decoding ASCII hex digits
+ */
+
+DUK_INTERNAL const duk_int8_t duk_hex_dectab[256] = {
+ /* -1 if invalid */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2f */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0x30-0x3f */
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5f */
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x60-0x6f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x7f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x8f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x9f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xaf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xbf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xcf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xdf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xef */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0-0xff */
+};
+
+#if defined(DUK_USE_HEX_FASTPATH)
+/* Preshifted << 4. Must use 16-bit entry to allow negative value signaling. */
+DUK_INTERNAL const duk_int16_t duk_hex_dectab_shift4[256] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2f */
+ 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, -1, -1, -1, -1, -1, -1, /* 0x30-0x3f */
+ -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5f */
+ -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x60-0x6f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x7f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x8f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x9f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xaf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xbf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xcf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xdf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xef */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0-0xff */
+};
+#endif
+
+/*
+ * Table for hex encoding bytes
+ */
+
+#if defined(DUK_USE_HEX_FASTPATH)
+/* Lookup to encode one byte directly into 2 characters:
+ *
+ * def genhextab(bswap):
+ * for i in xrange(256):
+ * t = chr(i).encode('hex')
+ * if bswap:
+ * t = t[1] + t[0]
+ * print('0x' + t.encode('hex') + 'U')
+ * print('big endian'); genhextab(False)
+ * print('little endian'); genhextab(True)
+*/
+DUK_INTERNAL const duk_uint16_t duk_hex_enctab[256] = {
+#if defined(DUK_USE_INTEGER_BE)
+ 0x3030U, 0x3031U, 0x3032U, 0x3033U, 0x3034U, 0x3035U, 0x3036U, 0x3037U,
+ 0x3038U, 0x3039U, 0x3061U, 0x3062U, 0x3063U, 0x3064U, 0x3065U, 0x3066U,
+ 0x3130U, 0x3131U, 0x3132U, 0x3133U, 0x3134U, 0x3135U, 0x3136U, 0x3137U,
+ 0x3138U, 0x3139U, 0x3161U, 0x3162U, 0x3163U, 0x3164U, 0x3165U, 0x3166U,
+ 0x3230U, 0x3231U, 0x3232U, 0x3233U, 0x3234U, 0x3235U, 0x3236U, 0x3237U,
+ 0x3238U, 0x3239U, 0x3261U, 0x3262U, 0x3263U, 0x3264U, 0x3265U, 0x3266U,
+ 0x3330U, 0x3331U, 0x3332U, 0x3333U, 0x3334U, 0x3335U, 0x3336U, 0x3337U,
+ 0x3338U, 0x3339U, 0x3361U, 0x3362U, 0x3363U, 0x3364U, 0x3365U, 0x3366U,
+ 0x3430U, 0x3431U, 0x3432U, 0x3433U, 0x3434U, 0x3435U, 0x3436U, 0x3437U,
+ 0x3438U, 0x3439U, 0x3461U, 0x3462U, 0x3463U, 0x3464U, 0x3465U, 0x3466U,
+ 0x3530U, 0x3531U, 0x3532U, 0x3533U, 0x3534U, 0x3535U, 0x3536U, 0x3537U,
+ 0x3538U, 0x3539U, 0x3561U, 0x3562U, 0x3563U, 0x3564U, 0x3565U, 0x3566U,
+ 0x3630U, 0x3631U, 0x3632U, 0x3633U, 0x3634U, 0x3635U, 0x3636U, 0x3637U,
+ 0x3638U, 0x3639U, 0x3661U, 0x3662U, 0x3663U, 0x3664U, 0x3665U, 0x3666U,
+ 0x3730U, 0x3731U, 0x3732U, 0x3733U, 0x3734U, 0x3735U, 0x3736U, 0x3737U,
+ 0x3738U, 0x3739U, 0x3761U, 0x3762U, 0x3763U, 0x3764U, 0x3765U, 0x3766U,
+ 0x3830U, 0x3831U, 0x3832U, 0x3833U, 0x3834U, 0x3835U, 0x3836U, 0x3837U,
+ 0x3838U, 0x3839U, 0x3861U, 0x3862U, 0x3863U, 0x3864U, 0x3865U, 0x3866U,
+ 0x3930U, 0x3931U, 0x3932U, 0x3933U, 0x3934U, 0x3935U, 0x3936U, 0x3937U,
+ 0x3938U, 0x3939U, 0x3961U, 0x3962U, 0x3963U, 0x3964U, 0x3965U, 0x3966U,
+ 0x6130U, 0x6131U, 0x6132U, 0x6133U, 0x6134U, 0x6135U, 0x6136U, 0x6137U,
+ 0x6138U, 0x6139U, 0x6161U, 0x6162U, 0x6163U, 0x6164U, 0x6165U, 0x6166U,
+ 0x6230U, 0x6231U, 0x6232U, 0x6233U, 0x6234U, 0x6235U, 0x6236U, 0x6237U,
+ 0x6238U, 0x6239U, 0x6261U, 0x6262U, 0x6263U, 0x6264U, 0x6265U, 0x6266U,
+ 0x6330U, 0x6331U, 0x6332U, 0x6333U, 0x6334U, 0x6335U, 0x6336U, 0x6337U,
+ 0x6338U, 0x6339U, 0x6361U, 0x6362U, 0x6363U, 0x6364U, 0x6365U, 0x6366U,
+ 0x6430U, 0x6431U, 0x6432U, 0x6433U, 0x6434U, 0x6435U, 0x6436U, 0x6437U,
+ 0x6438U, 0x6439U, 0x6461U, 0x6462U, 0x6463U, 0x6464U, 0x6465U, 0x6466U,
+ 0x6530U, 0x6531U, 0x6532U, 0x6533U, 0x6534U, 0x6535U, 0x6536U, 0x6537U,
+ 0x6538U, 0x6539U, 0x6561U, 0x6562U, 0x6563U, 0x6564U, 0x6565U, 0x6566U,
+ 0x6630U, 0x6631U, 0x6632U, 0x6633U, 0x6634U, 0x6635U, 0x6636U, 0x6637U,
+ 0x6638U, 0x6639U, 0x6661U, 0x6662U, 0x6663U, 0x6664U, 0x6665U, 0x6666U
+#else /* DUK_USE_INTEGER_BE */
+ 0x3030U, 0x3130U, 0x3230U, 0x3330U, 0x3430U, 0x3530U, 0x3630U, 0x3730U,
+ 0x3830U, 0x3930U, 0x6130U, 0x6230U, 0x6330U, 0x6430U, 0x6530U, 0x6630U,
+ 0x3031U, 0x3131U, 0x3231U, 0x3331U, 0x3431U, 0x3531U, 0x3631U, 0x3731U,
+ 0x3831U, 0x3931U, 0x6131U, 0x6231U, 0x6331U, 0x6431U, 0x6531U, 0x6631U,
+ 0x3032U, 0x3132U, 0x3232U, 0x3332U, 0x3432U, 0x3532U, 0x3632U, 0x3732U,
+ 0x3832U, 0x3932U, 0x6132U, 0x6232U, 0x6332U, 0x6432U, 0x6532U, 0x6632U,
+ 0x3033U, 0x3133U, 0x3233U, 0x3333U, 0x3433U, 0x3533U, 0x3633U, 0x3733U,
+ 0x3833U, 0x3933U, 0x6133U, 0x6233U, 0x6333U, 0x6433U, 0x6533U, 0x6633U,
+ 0x3034U, 0x3134U, 0x3234U, 0x3334U, 0x3434U, 0x3534U, 0x3634U, 0x3734U,
+ 0x3834U, 0x3934U, 0x6134U, 0x6234U, 0x6334U, 0x6434U, 0x6534U, 0x6634U,
+ 0x3035U, 0x3135U, 0x3235U, 0x3335U, 0x3435U, 0x3535U, 0x3635U, 0x3735U,
+ 0x3835U, 0x3935U, 0x6135U, 0x6235U, 0x6335U, 0x6435U, 0x6535U, 0x6635U,
+ 0x3036U, 0x3136U, 0x3236U, 0x3336U, 0x3436U, 0x3536U, 0x3636U, 0x3736U,
+ 0x3836U, 0x3936U, 0x6136U, 0x6236U, 0x6336U, 0x6436U, 0x6536U, 0x6636U,
+ 0x3037U, 0x3137U, 0x3237U, 0x3337U, 0x3437U, 0x3537U, 0x3637U, 0x3737U,
+ 0x3837U, 0x3937U, 0x6137U, 0x6237U, 0x6337U, 0x6437U, 0x6537U, 0x6637U,
+ 0x3038U, 0x3138U, 0x3238U, 0x3338U, 0x3438U, 0x3538U, 0x3638U, 0x3738U,
+ 0x3838U, 0x3938U, 0x6138U, 0x6238U, 0x6338U, 0x6438U, 0x6538U, 0x6638U,
+ 0x3039U, 0x3139U, 0x3239U, 0x3339U, 0x3439U, 0x3539U, 0x3639U, 0x3739U,
+ 0x3839U, 0x3939U, 0x6139U, 0x6239U, 0x6339U, 0x6439U, 0x6539U, 0x6639U,
+ 0x3061U, 0x3161U, 0x3261U, 0x3361U, 0x3461U, 0x3561U, 0x3661U, 0x3761U,
+ 0x3861U, 0x3961U, 0x6161U, 0x6261U, 0x6361U, 0x6461U, 0x6561U, 0x6661U,
+ 0x3062U, 0x3162U, 0x3262U, 0x3362U, 0x3462U, 0x3562U, 0x3662U, 0x3762U,
+ 0x3862U, 0x3962U, 0x6162U, 0x6262U, 0x6362U, 0x6462U, 0x6562U, 0x6662U,
+ 0x3063U, 0x3163U, 0x3263U, 0x3363U, 0x3463U, 0x3563U, 0x3663U, 0x3763U,
+ 0x3863U, 0x3963U, 0x6163U, 0x6263U, 0x6363U, 0x6463U, 0x6563U, 0x6663U,
+ 0x3064U, 0x3164U, 0x3264U, 0x3364U, 0x3464U, 0x3564U, 0x3664U, 0x3764U,
+ 0x3864U, 0x3964U, 0x6164U, 0x6264U, 0x6364U, 0x6464U, 0x6564U, 0x6664U,
+ 0x3065U, 0x3165U, 0x3265U, 0x3365U, 0x3465U, 0x3565U, 0x3665U, 0x3765U,
+ 0x3865U, 0x3965U, 0x6165U, 0x6265U, 0x6365U, 0x6465U, 0x6565U, 0x6665U,
+ 0x3066U, 0x3166U, 0x3266U, 0x3366U, 0x3466U, 0x3566U, 0x3666U, 0x3766U,
+ 0x3866U, 0x3966U, 0x6166U, 0x6266U, 0x6366U, 0x6466U, 0x6566U, 0x6666U
+#endif /* DUK_USE_INTEGER_BE */
+};
+#endif /* DUK_USE_HEX_FASTPATH */
+
+/*
+ * Table for base-64 encoding
+ */
+
+#if defined(DUK_USE_BASE64_FASTPATH)
+DUK_INTERNAL const duk_uint8_t duk_base64_enctab[64] = {
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* A...P */
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* Q...f */
+ 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, /* g...v */
+ 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f /* w.../ */
+};
+#endif /* DUK_USE_BASE64_FASTPATH */
+
+/*
+ * Table for base-64 decoding
+ */
+
+#if defined(DUK_USE_BASE64_FASTPATH)
+DUK_INTERNAL const duk_int8_t duk_base64_dectab[256] = {
+ /* -1 = error, -2 = allowed whitespace, -3 = padding ('='), 0...63 decoded bytes */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -2, -1, -1, /* 0x00...0x0f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10...0x1f */
+ -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, /* 0x20...0x2f */
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -3, -1, -1, /* 0x30...0x3f */
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 0x40...0x4f */
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, /* 0x50...0x5f */
+ -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 0x60...0x6f */
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, /* 0x70...0x7f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80...0x8f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90...0x9f */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0...0xaf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0...0xbf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0...0xcf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0...0xdf */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0...0xef */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0...0xff */
+};
+#endif /* DUK_USE_BASE64_FASTPATH */
+
+/*
+ * Arbitrary byteswap for potentially unaligned values
+ *
+ * Used to byteswap pointers e.g. in debugger code.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT) /* For now only needed by the debugger. */
+DUK_INTERNAL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len) {
+ duk_uint8_t tmp;
+ duk_uint8_t *q = p + len - 1;
+
+ while (p - q < 0) {
+ tmp = *p;
+ *p = *q;
+ *q = tmp;
+ p++;
+ q--;
+ }
+}
+#endif
+
+/*
+ * Miscellaneous coercion / clamping helpers.
+ */
+
+/* Check whether a duk_double_t is a whole number in the 32-bit range (reject
+ * negative zero), and if so, return a duk_int32_t.
+ * For compiler use: don't allow negative zero as it will cause trouble with
+ * LDINT+LDINTX, positive zero is OK.
+ */
+DUK_INTERNAL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival) {
+ duk_int32_t t;
+
+ t = (duk_int32_t) x;
+ if (!((duk_double_t) t == x)) {
+ return 0;
+ }
+ if (t == 0) {
+ duk_double_union du;
+ du.d = x;
+ if (DUK_DBLUNION_HAS_SIGNBIT(&du)) {
+ return 0;
+ }
+ }
+ *ival = t;
+ return 1;
+}
+
+/* Check whether a duk_double_t is a whole number in the 32-bit range, and if
+ * so, return a duk_int32_t.
+ */
+DUK_INTERNAL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival) {
+ duk_int32_t t;
+
+ t = (duk_int32_t) x;
+ if (!((duk_double_t) t == x)) {
+ return 0;
+ }
+ *ival = t;
+ return 1;
+}
+
+/*
+ * IEEE double checks
+ */
+
+DUK_INTERNAL duk_bool_t duk_double_is_anyinf(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ return DUK_DBLUNION_IS_ANYINF(&du);
+}
+
+DUK_INTERNAL duk_bool_t duk_double_is_posinf(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ return DUK_DBLUNION_IS_POSINF(&du);
+}
+
+DUK_INTERNAL duk_bool_t duk_double_is_neginf(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ return DUK_DBLUNION_IS_NEGINF(&du);
+}
+
+DUK_INTERNAL duk_bool_t duk_double_is_nan(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ /* Assumes we're dealing with a Duktape internal NaN which is
+ * NaN normalized if duk_tval requires it.
+ */
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ return DUK_DBLUNION_IS_NAN(&du);
+}
+
+DUK_INTERNAL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ /* Assumes we're dealing with a Duktape internal NaN which is
+ * NaN normalized if duk_tval requires it.
+ */
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ return DUK_DBLUNION_IS_NAN(&du) || DUK_DBLUNION_IS_ANYZERO(&du);
+}
+
+DUK_INTERNAL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ /* If exponent is 0x7FF the argument is either a NaN or an
+ * infinity. We don't need to check any other fields.
+ */
+#if defined(DUK_USE_64BIT_OPS)
+#if defined(DUK_USE_DOUBLE_ME)
+ return (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000);
+#else
+ return (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000);
+#endif
+#else
+ return (du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL;
+#endif
+}
+
+DUK_INTERNAL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x) {
+ duk_double_union du;
+#if defined(DUK_USE_64BIT_OPS)
+ duk_uint64_t t;
+#else
+ duk_uint32_t t;
+#endif
+ du.d = x;
+#if defined(DUK_USE_64BIT_OPS)
+#if defined(DUK_USE_DOUBLE_ME)
+ t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000);
+ if (t == DUK_U64_CONSTANT(0x0000000000000000)) {
+ t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x0000000080000000);
+ return t == 0;
+ }
+ if (t == DUK_U64_CONSTANT(0x000000007ff00000)) {
+ return 1;
+ }
+#else
+ t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000);
+ if (t == DUK_U64_CONSTANT(0x0000000000000000)) {
+ t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000);
+ return t == 0;
+ }
+ if (t == DUK_U64_CONSTANT(0x7ff0000000000000)) {
+ return 1;
+ }
+#endif
+#else
+ t = du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL;
+ if (t == 0x00000000UL) {
+ return DUK_DBLUNION_IS_ANYZERO(&du);
+ }
+ if (t == 0x7ff00000UL) {
+ return 1;
+ }
+#endif
+ return 0;
+}
+
+DUK_INTERNAL duk_small_uint_t duk_double_signbit(duk_double_t x) {
+ duk_double_union du;
+ du.d = x;
+ return (duk_small_uint_t) DUK_DBLUNION_GET_SIGNBIT(&du);
+}
+
+DUK_INTERNAL duk_double_t duk_double_trunc_towards_zero(duk_double_t x) {
+ /* XXX: optimize */
+ duk_small_uint_t s = duk_double_signbit(x);
+ x = DUK_FLOOR(DUK_FABS(x)); /* truncate towards zero */
+ if (s) {
+ x = -x;
+ }
+ return x;
+}
+
+DUK_INTERNAL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y) {
+ duk_double_union du1;
+ duk_double_union du2;
+ du1.d = x;
+ du2.d = y;
+
+ return (((du1.ui[DUK_DBL_IDX_UI0] ^ du2.ui[DUK_DBL_IDX_UI0]) & 0x80000000UL) == 0);
+}
+
+DUK_INTERNAL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y) {
+ /* Doesn't replicate fmin() behavior exactly: for fmin() if one
+ * argument is a NaN, the other argument should be returned.
+ * Duktape doesn't rely on this behavior so the replacement can
+ * be simplified.
+ */
+ return (x < y ? x : y);
+}
+
+DUK_INTERNAL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y) {
+ /* Doesn't replicate fmax() behavior exactly: for fmax() if one
+ * argument is a NaN, the other argument should be returned.
+ * Duktape doesn't rely on this behavior so the replacement can
+ * be simplified.
+ */
+ return (x > y ? x : y);
+}
+#line 1 "duk_hobject_class.c"
+/*
+ * Hobject Ecmascript [[Class]].
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if (DUK_STRIDX_UC_ARGUMENTS > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_BOOLEAN > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_DATE > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_ERROR > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_FUNCTION > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_JSON > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_MATH > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_NUMBER > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_OBJECT > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_REG_EXP > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_STRING > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_GLOBAL > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_OBJ_ENV > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_DEC_ENV > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_POINTER > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UC_THREAD > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_ARRAY_BUFFER > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_DATA_VIEW > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_INT8_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UINT8_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UINT8_CLAMPED_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_INT16_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UINT16_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_INT32_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_UINT32_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_FLOAT32_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_FLOAT64_ARRAY > 255)
+#error constant too large
+#endif
+#if (DUK_STRIDX_EMPTY_STRING > 255)
+#error constant too large
+#endif
+
+/* Note: assumes that these string indexes are 8-bit, genstrings.py must ensure that */
+DUK_INTERNAL duk_uint8_t duk_class_number_to_stridx[32] = {
+ DUK_STRIDX_EMPTY_STRING, /* NONE, intentionally empty */
+ DUK_STRIDX_UC_OBJECT,
+ DUK_STRIDX_ARRAY,
+ DUK_STRIDX_UC_FUNCTION,
+ DUK_STRIDX_UC_ARGUMENTS,
+ DUK_STRIDX_UC_BOOLEAN,
+ DUK_STRIDX_DATE,
+ DUK_STRIDX_UC_ERROR,
+ DUK_STRIDX_JSON,
+ DUK_STRIDX_MATH,
+ DUK_STRIDX_UC_NUMBER,
+ DUK_STRIDX_REG_EXP,
+ DUK_STRIDX_UC_STRING,
+ DUK_STRIDX_GLOBAL,
+ DUK_STRIDX_UC_SYMBOL,
+ DUK_STRIDX_OBJ_ENV,
+ DUK_STRIDX_DEC_ENV,
+ DUK_STRIDX_UC_POINTER,
+ DUK_STRIDX_UC_THREAD,
+ DUK_STRIDX_ARRAY_BUFFER,
+ DUK_STRIDX_DATA_VIEW,
+ DUK_STRIDX_INT8_ARRAY,
+ DUK_STRIDX_UINT8_ARRAY,
+ DUK_STRIDX_UINT8_CLAMPED_ARRAY,
+ DUK_STRIDX_INT16_ARRAY,
+ DUK_STRIDX_UINT16_ARRAY,
+ DUK_STRIDX_INT32_ARRAY,
+ DUK_STRIDX_UINT32_ARRAY,
+ DUK_STRIDX_FLOAT32_ARRAY,
+ DUK_STRIDX_FLOAT64_ARRAY,
+ DUK_STRIDX_EMPTY_STRING, /* UNUSED, intentionally empty */
+ DUK_STRIDX_EMPTY_STRING, /* UNUSED, intentionally empty */
+};
+#line 1 "duk_alloc_default.c"
+/*
+ * Default allocation functions.
+ *
+ * Assumes behavior such as malloc allowing zero size, yielding
+ * a NULL or a unique pointer which is a no-op for free.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)
+DUK_INTERNAL void *duk_default_alloc_function(void *udata, duk_size_t size) {
+ void *res;
+ DUK_UNREF(udata);
+ res = DUK_ANSI_MALLOC(size);
+ DUK_DDD(DUK_DDDPRINT("default alloc function: %lu -> %p",
+ (unsigned long) size, (void *) res));
+ return res;
+}
+
+DUK_INTERNAL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize) {
+ void *res;
+ DUK_UNREF(udata);
+ res = DUK_ANSI_REALLOC(ptr, newsize);
+ DUK_DDD(DUK_DDDPRINT("default realloc function: %p %lu -> %p",
+ (void *) ptr, (unsigned long) newsize, (void *) res));
+ return res;
+}
+
+DUK_INTERNAL void duk_default_free_function(void *udata, void *ptr) {
+ DUK_DDD(DUK_DDDPRINT("default free function: %p", (void *) ptr));
+ DUK_UNREF(udata);
+ DUK_ANSI_FREE(ptr);
+}
+#endif /* DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS */
+#line 1 "duk_api_buffer.c"
+/*
+ * Buffer
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_EXTERNAL void *duk_resize_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t new_size) {
+ duk_hbuffer_dynamic *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx);
+ DUK_ASSERT(h != NULL);
+
+ if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) {
+ DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE);
+ }
+
+ /* maximum size check is handled by callee */
+ duk_hbuffer_resize(thr, h, new_size);
+
+ return DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h);
+}
+
+DUK_EXTERNAL void *duk_steal_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {
+ duk_hbuffer_dynamic *h;
+ void *ptr;
+ duk_size_t sz;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx);
+ DUK_ASSERT(h != NULL);
+
+ if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) {
+ DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE);
+ }
+
+ /* Forget the previous allocation, setting size to 0 and alloc to
+ * NULL. Caller is responsible for freeing the previous allocation.
+ * Getting the allocation and clearing it is done in the same API
+ * call to avoid any chance of a realloc.
+ */
+ ptr = DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h);
+ sz = DUK_HBUFFER_DYNAMIC_GET_SIZE(h);
+ if (out_size) {
+ *out_size = sz;
+ }
+ DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(thr->heap, h);
+ DUK_HBUFFER_DYNAMIC_SET_SIZE(h, 0);
+
+ return ptr;
+}
+
+DUK_EXTERNAL void duk_config_buffer(duk_hthread *thr, duk_idx_t idx, void *ptr, duk_size_t len) {
+ duk_hbuffer_external *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hbuffer_external *) duk_require_hbuffer(thr, idx);
+ DUK_ASSERT(h != NULL);
+
+ if (!DUK_HBUFFER_HAS_EXTERNAL(h)) {
+ DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE);
+ }
+ DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h));
+
+ DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(thr->heap, h, ptr);
+ DUK_HBUFFER_EXTERNAL_SET_SIZE(h, len);
+}
+#line 1 "duk_api_bytecode.c"
+/*
+ * Bytecode dump/load
+ *
+ * The bytecode load primitive is more important performance-wise than the
+ * dump primitive.
+ *
+ * Unlike most Duktape API calls, bytecode dump/load is not guaranteed to be
+ * memory safe for invalid arguments - caller beware! There's little point
+ * in trying to achieve memory safety unless bytecode instructions are also
+ * validated which is not easy to do with indirect register references etc.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_BYTECODE_DUMP_SUPPORT)
+
+#define DUK__SER_MARKER 0xbf
+#define DUK__SER_STRING 0x00
+#define DUK__SER_NUMBER 0x01
+#define DUK__BYTECODE_INITIAL_ALLOC 256
+#define DUK__NO_FORMALS 0xffffffffUL
+
+/*
+ * Dump/load helpers, xxx_raw() helpers do no buffer checks
+ */
+
+DUK_LOCAL duk_uint8_t *duk__load_string_raw(duk_hthread *thr, duk_uint8_t *p) {
+ duk_uint32_t len;
+
+ len = DUK_RAW_READ_U32_BE(p);
+ duk_push_lstring(thr, (const char *) p, len);
+ p += len;
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__load_buffer_raw(duk_hthread *thr, duk_uint8_t *p) {
+ duk_uint32_t len;
+ duk_uint8_t *buf;
+
+ len = DUK_RAW_READ_U32_BE(p);
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len);
+ DUK_ASSERT(buf != NULL);
+ DUK_MEMCPY((void *) buf, (const void *) p, (size_t) len);
+ p += len;
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_hstring_raw(duk_uint8_t *p, duk_hstring *h) {
+ duk_size_t len;
+ duk_uint32_t tmp32;
+
+ DUK_ASSERT(h != NULL);
+
+ len = DUK_HSTRING_GET_BYTELEN(h);
+ DUK_ASSERT(len <= 0xffffffffUL); /* string limits */
+ tmp32 = (duk_uint32_t) len;
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ DUK_MEMCPY((void *) p,
+ (const void *) DUK_HSTRING_GET_DATA(h),
+ len);
+ p += len;
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_hbuffer_raw(duk_hthread *thr, duk_uint8_t *p, duk_hbuffer *h) {
+ duk_size_t len;
+ duk_uint32_t tmp32;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h != NULL);
+ DUK_UNREF(thr);
+
+ len = DUK_HBUFFER_GET_SIZE(h);
+ DUK_ASSERT(len <= 0xffffffffUL); /* buffer limits */
+ tmp32 = (duk_uint32_t) len;
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ DUK_MEMCPY((void *) p,
+ (const void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h),
+ len);
+ p += len;
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_string_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) {
+ duk_hstring *h_str;
+ duk_tval *tv;
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx));
+ if (tv != NULL && DUK_TVAL_IS_STRING(tv)) {
+ h_str = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h_str != NULL);
+ } else {
+ h_str = DUK_HTHREAD_STRING_EMPTY_STRING(thr);
+ DUK_ASSERT(h_str != NULL);
+ }
+ DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(h_str), p);
+ p = duk__dump_hstring_raw(p, h_str);
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_buffer_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) {
+ duk_tval *tv;
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx));
+ if (tv != NULL && DUK_TVAL_IS_BUFFER(tv)) {
+ duk_hbuffer *h_buf;
+ h_buf = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h_buf != NULL);
+ DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HBUFFER_GET_SIZE(h_buf), p);
+ p = duk__dump_hbuffer_raw(thr, p, h_buf);
+ } else {
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);
+ DUK_RAW_WRITE_U32_BE(p, 0);
+ }
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_uint32_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx, duk_uint32_t def_value) {
+ duk_tval *tv;
+ duk_uint32_t val;
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx));
+ if (tv != NULL && DUK_TVAL_IS_NUMBER(tv)) {
+ val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv);
+ } else {
+ val = def_value;
+ }
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);
+ DUK_RAW_WRITE_U32_BE(p, val);
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_varmap(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) {
+ duk_tval *tv;
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_VARMAP(thr));
+ if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+ duk_uint_fast32_t i;
+
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ /* We know _Varmap only has own properties so walk property
+ * table directly. We also know _Varmap is dense and all
+ * values are numbers; assert for these. GC and finalizers
+ * shouldn't affect _Varmap so side effects should be fine.
+ */
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) {
+ duk_hstring *key;
+ duk_tval *tv_val;
+ duk_uint32_t val;
+
+ key = DUK_HOBJECT_E_GET_KEY(thr->heap, h, i);
+ DUK_ASSERT(key != NULL); /* _Varmap is dense */
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h, i));
+ tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h, i);
+ DUK_ASSERT(tv_val != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_val)); /* known to be number; in fact an integer */
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_val));
+ DUK_ASSERT(DUK_TVAL_GET_FASTINT(tv_val) == (duk_int64_t) DUK_TVAL_GET_FASTINT_U32(tv_val)); /* known to be 32-bit */
+ val = DUK_TVAL_GET_FASTINT_U32(tv_val);
+#else
+ val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv_val);
+#endif
+
+ DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(key) + 4U, p);
+ p = duk__dump_hstring_raw(p, key);
+ DUK_RAW_WRITE_U32_BE(p, val);
+ }
+ }
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);
+ DUK_RAW_WRITE_U32_BE(p, 0); /* end of _Varmap */
+ return p;
+}
+
+DUK_LOCAL duk_uint8_t *duk__dump_formals(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) {
+ duk_tval *tv;
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_FORMALS(thr));
+ if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) {
+ duk_harray *h;
+ duk_uint32_t i;
+
+ /* Here we rely on _Formals being a dense array containing
+ * strings. This should be the case unless _Formals has been
+ * tweaked by the application (which we don't support right
+ * now).
+ */
+ h = (duk_harray *) DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) h));
+ DUK_ASSERT(h->length <= DUK_HOBJECT_GET_ASIZE((duk_hobject *) h));
+
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);
+ DUK_ASSERT(h->length != DUK__NO_FORMALS); /* limits */
+ DUK_RAW_WRITE_U32_BE(p, h->length);
+
+ for (i = 0; i < h->length; i++) {
+ duk_tval *tv_val;
+ duk_hstring *varname;
+
+ tv_val = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, (duk_hobject *) h, i);
+ DUK_ASSERT(tv_val != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv_val));
+
+ varname = DUK_TVAL_GET_STRING(tv_val);
+ DUK_ASSERT(varname != NULL);
+ DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(varname) >= 1);
+
+ DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(varname), p);
+ p = duk__dump_hstring_raw(p, varname);
+ }
+ } else {
+ DUK_DD(DUK_DDPRINT("dumping function without _Formals, emit marker to indicate missing _Formals"));
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);
+ DUK_RAW_WRITE_U32_BE(p, DUK__NO_FORMALS); /* marker: no formals */
+ }
+ return p;
+}
+
+static duk_uint8_t *duk__dump_func(duk_hthread *thr, duk_hcompfunc *func, duk_bufwriter_ctx *bw_ctx, duk_uint8_t *p) {
+ duk_tval *tv, *tv_end;
+ duk_instr_t *ins, *ins_end;
+ duk_hobject **fn, **fn_end;
+ duk_hstring *h_str;
+ duk_uint32_t count_instr;
+ duk_uint32_t tmp32;
+ duk_uint16_t tmp16;
+ duk_double_t d;
+
+ DUK_DD(DUK_DDPRINT("dumping function %p to %p: "
+ "consts=[%p,%p[ (%ld bytes, %ld items), "
+ "funcs=[%p,%p[ (%ld bytes, %ld items), "
+ "code=[%p,%p[ (%ld bytes, %ld items)",
+ (void *) func,
+ (void *) p,
+ (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func),
+ (void *) DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func),
+ (long) DUK_HCOMPFUNC_GET_CONSTS_SIZE(thr->heap, func),
+ (long) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func),
+ (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func),
+ (void *) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func),
+ (long) DUK_HCOMPFUNC_GET_FUNCS_SIZE(thr->heap, func),
+ (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func),
+ (void *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func),
+ (void *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func),
+ (long) DUK_HCOMPFUNC_GET_CODE_SIZE(thr->heap, func),
+ (long) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func)));
+
+ DUK_ASSERT(DUK_USE_ESBC_MAX_BYTES <= 0x7fffffffUL); /* ensures no overflow */
+ count_instr = (duk_uint32_t) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func);
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 3U * 4U + 2U * 2U + 3U * 4U + count_instr * 4U, p);
+
+ /* Fixed header info. */
+ tmp32 = count_instr;
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ tmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func);
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ tmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func);
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ tmp16 = func->nregs;
+ DUK_RAW_WRITE_U16_BE(p, tmp16);
+ tmp16 = func->nargs;
+ DUK_RAW_WRITE_U16_BE(p, tmp16);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ tmp32 = func->start_line;
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ tmp32 = func->end_line;
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+#else
+ DUK_RAW_WRITE_U32_BE(p, 0);
+ DUK_RAW_WRITE_U32_BE(p, 0);
+#endif
+ tmp32 = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) func); /* masks flags, only duk_hobject flags */
+ tmp32 &= ~(DUK_HOBJECT_FLAG_HAVE_FINALIZER); /* finalizer flag is lost */
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+
+ /* Bytecode instructions: endian conversion needed unless
+ * platform is big endian.
+ */
+ ins = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func);
+ ins_end = DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func);
+ DUK_ASSERT((duk_size_t) (ins_end - ins) == (duk_size_t) count_instr);
+#if defined(DUK_USE_INTEGER_BE)
+ DUK_MEMCPY((void *) p, (const void *) ins, (size_t) (ins_end - ins));
+ p += (size_t) (ins_end - ins);
+#else
+ while (ins != ins_end) {
+ tmp32 = (duk_uint32_t) (*ins);
+ DUK_RAW_WRITE_U32_BE(p, tmp32);
+ ins++;
+ }
+#endif
+
+ /* Constants: variable size encoding. */
+ tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func);
+ tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func);
+ while (tv != tv_end) {
+ /* constants are strings or numbers now */
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv) ||
+ DUK_TVAL_IS_NUMBER(tv));
+
+ if (DUK_TVAL_IS_STRING(tv)) {
+ h_str = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h_str != NULL);
+ DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 4U + DUK_HSTRING_GET_BYTELEN(h_str), p),
+ *p++ = DUK__SER_STRING;
+ p = duk__dump_hstring_raw(p, h_str);
+ } else {
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 8U, p);
+ *p++ = DUK__SER_NUMBER;
+ d = DUK_TVAL_GET_NUMBER(tv);
+ DUK_RAW_WRITE_DOUBLE_BE(p, d);
+ }
+ tv++;
+ }
+
+ /* Inner functions recursively. */
+ fn = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func);
+ fn_end = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func);
+ while (fn != fn_end) {
+ /* XXX: This causes recursion up to inner function depth
+ * which is normally not an issue, e.g. mark-and-sweep uses
+ * a recursion limiter to avoid C stack issues. Avoiding
+ * this would mean some sort of a work list or just refusing
+ * to serialize deep functions.
+ */
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(*fn));
+ p = duk__dump_func(thr, (duk_hcompfunc *) *fn, bw_ctx, p);
+ fn++;
+ }
+
+ /* Lexenv and varenv are not dumped. */
+
+ /* Object extra properties.
+ *
+ * There are some difference between function templates and functions.
+ * For example, function templates don't have .length and nargs is
+ * normally used to instantiate the functions.
+ */
+
+ p = duk__dump_uint32_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_LENGTH, (duk_uint32_t) func->nargs);
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_NAME);
+#endif
+#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)
+ p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_FILE_NAME);
+#endif
+#if defined(DUK_USE_PC2LINE)
+ p = duk__dump_buffer_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_INT_PC2LINE);
+#endif
+ p = duk__dump_varmap(thr, p, bw_ctx, (duk_hobject *) func);
+ p = duk__dump_formals(thr, p, bw_ctx, (duk_hobject *) func);
+
+ DUK_DD(DUK_DDPRINT("serialized function %p -> final pointer %p", (void *) func, (void *) p));
+
+ return p;
+}
+
+/* Load a function from bytecode. The function object returned here must
+ * match what is created by duk_js_push_closure() with respect to its flags,
+ * properties, etc.
+ *
+ * NOTE: there are intentionally no input buffer length / bound checks.
+ * Adding them would be easy but wouldn't ensure memory safety as untrusted
+ * or broken bytecode is unsafe during execution unless the opcodes themselves
+ * are validated (which is quite complex, especially for indirect opcodes).
+ */
+
+#define DUK__ASSERT_LEFT(n) do { \
+ DUK_ASSERT((duk_size_t) (p_end - p) >= (duk_size_t) (n)); \
+ } while (0)
+
+static duk_uint8_t *duk__load_func(duk_hthread *thr, duk_uint8_t *p, duk_uint8_t *p_end) {
+ duk_hcompfunc *h_fun;
+ duk_hbuffer *h_data;
+ duk_size_t data_size;
+ duk_uint32_t count_instr, count_const, count_funcs;
+ duk_uint32_t n;
+ duk_uint32_t tmp32;
+ duk_small_uint_t const_type;
+ duk_uint8_t *fun_data;
+ duk_uint8_t *q;
+ duk_idx_t idx_base;
+ duk_tval *tv1;
+ duk_uarridx_t arr_idx;
+ duk_uarridx_t arr_limit;
+ duk_hobject *func_env;
+ duk_bool_t need_pop;
+
+ /* XXX: There's some overlap with duk_js_closure() here, but
+ * seems difficult to share code. Ensure that the final function
+ * looks the same as created by duk_js_closure().
+ */
+
+ DUK_ASSERT(thr != NULL);
+
+ DUK_DD(DUK_DDPRINT("loading function, p=%p, p_end=%p", (void *) p, (void *) p_end));
+
+ DUK__ASSERT_LEFT(3 * 4);
+ count_instr = DUK_RAW_READ_U32_BE(p);
+ count_const = DUK_RAW_READ_U32_BE(p);
+ count_funcs = DUK_RAW_READ_U32_BE(p);
+
+ data_size = sizeof(duk_tval) * count_const +
+ sizeof(duk_hobject *) * count_funcs +
+ sizeof(duk_instr_t) * count_instr;
+
+ DUK_DD(DUK_DDPRINT("instr=%ld, const=%ld, funcs=%ld, data_size=%ld",
+ (long) count_instr, (long) count_const,
+ (long) count_const, (long) data_size));
+
+ /* Value stack is used to ensure reachability of constants and
+ * inner functions being loaded. Require enough space to handle
+ * large functions correctly.
+ */
+ duk_require_stack(thr, (duk_idx_t) (2 + count_const + count_funcs));
+ idx_base = duk_get_top(thr);
+
+ /* Push function object, init flags etc. This must match
+ * duk_js_push_closure() quite carefully.
+ */
+ h_fun = duk_push_hcompfunc(thr);
+ DUK_ASSERT(h_fun != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) h_fun));
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun) == NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, h_fun) == NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, h_fun) == NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+
+ h_fun->nregs = DUK_RAW_READ_U16_BE(p);
+ h_fun->nargs = DUK_RAW_READ_U16_BE(p);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ h_fun->start_line = DUK_RAW_READ_U32_BE(p);
+ h_fun->end_line = DUK_RAW_READ_U32_BE(p);
+#else
+ p += 8; /* skip line info */
+#endif
+
+ /* duk_hcompfunc flags; quite version specific */
+ tmp32 = DUK_RAW_READ_U32_BE(p);
+ DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) h_fun, tmp32); /* masks flags to only change duk_hobject flags */
+
+ /* standard prototype (no need to set here, already set) */
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+#if 0
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &h_fun->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+#endif
+
+ /* assert just a few critical flags */
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h_fun) == DUK_HTYPE_OBJECT);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&h_fun->obj));
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&h_fun->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&h_fun->obj));
+ DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&h_fun->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&h_fun->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&h_fun->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&h_fun->obj));
+
+ /* Create function 'data' buffer but don't attach it yet. */
+ fun_data = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, data_size);
+ DUK_ASSERT(fun_data != NULL);
+
+ /* Load bytecode instructions. */
+ DUK_ASSERT(sizeof(duk_instr_t) == 4);
+ DUK__ASSERT_LEFT(count_instr * sizeof(duk_instr_t));
+#if defined(DUK_USE_INTEGER_BE)
+ q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs;
+ DUK_MEMCPY((void *) q,
+ (const void *) p,
+ sizeof(duk_instr_t) * count_instr);
+ p += sizeof(duk_instr_t) * count_instr;
+#else
+ q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs;
+ for (n = count_instr; n > 0; n--) {
+ *((duk_instr_t *) (void *) q) = DUK_RAW_READ_U32_BE(p);
+ q += sizeof(duk_instr_t);
+ }
+#endif
+
+ /* Load constants onto value stack but don't yet copy to buffer. */
+ for (n = count_const; n > 0; n--) {
+ DUK__ASSERT_LEFT(1);
+ const_type = DUK_RAW_READ_U8(p);
+ switch (const_type) {
+ case DUK__SER_STRING: {
+ p = duk__load_string_raw(thr, p);
+ break;
+ }
+ case DUK__SER_NUMBER: {
+ /* Important to do a fastint check so that constants are
+ * properly read back as fastints.
+ */
+ duk_tval tv_tmp;
+ duk_double_t val;
+ DUK__ASSERT_LEFT(8);
+ val = DUK_RAW_READ_DOUBLE_BE(p);
+ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(&tv_tmp, val);
+ duk_push_tval(thr, &tv_tmp);
+ break;
+ }
+ default: {
+ goto format_error;
+ }
+ }
+ }
+
+ /* Load inner functions to value stack, but don't yet copy to buffer. */
+ for (n = count_funcs; n > 0; n--) {
+ p = duk__load_func(thr, p, p_end);
+ if (p == NULL) {
+ goto format_error;
+ }
+ }
+
+ /* With constants and inner functions on value stack, we can now
+ * atomically finish the function 'data' buffer, bump refcounts,
+ * etc.
+ *
+ * Here we take advantage of the value stack being just a duk_tval
+ * array: we can just memcpy() the constants as long as we incref
+ * them afterwards.
+ */
+
+ h_data = (duk_hbuffer *) duk_known_hbuffer(thr, idx_base + 1);
+ DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC(h_data));
+ DUK_HCOMPFUNC_SET_DATA(thr->heap, h_fun, h_data);
+ DUK_HBUFFER_INCREF(thr, h_data);
+
+ tv1 = duk_get_tval(thr, idx_base + 2); /* may be NULL if no constants or inner funcs */
+ DUK_ASSERT((count_const == 0 && count_funcs == 0) || tv1 != NULL);
+
+ q = fun_data;
+ if (count_const > 0) {
+ /* Explicit zero size check to avoid NULL 'tv1'. */
+ DUK_MEMCPY((void *) q, (const void *) tv1, sizeof(duk_tval) * count_const);
+ for (n = count_const; n > 0; n--) {
+ DUK_TVAL_INCREF_FAST(thr, (duk_tval *) (void *) q); /* no side effects */
+ q += sizeof(duk_tval);
+ }
+ tv1 += count_const;
+ }
+
+ DUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_fun, (duk_hobject **) (void *) q);
+ for (n = count_funcs; n > 0; n--) {
+ duk_hobject *h_obj;
+
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1));
+ h_obj = DUK_TVAL_GET_OBJECT(tv1);
+ DUK_ASSERT(h_obj != NULL);
+ tv1++;
+ DUK_HOBJECT_INCREF(thr, h_obj);
+
+ *((duk_hobject **) (void *) q) = h_obj;
+ q += sizeof(duk_hobject *);
+ }
+
+ DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_fun, (duk_instr_t *) (void *) q);
+
+ /* The function object is now reachable and refcounts are fine,
+ * so we can pop off all the temporaries.
+ */
+ DUK_DDD(DUK_DDDPRINT("function is reachable, reset top; func: %!iT", duk_get_tval(thr, idx_base)));
+ duk_set_top(thr, idx_base + 1);
+
+ /* Setup function properties. */
+ tmp32 = DUK_RAW_READ_U32_BE(p);
+ duk_push_u32(thr, tmp32);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);
+
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ p = duk__load_string_raw(thr, p); /* -> [ func funcname ] */
+ func_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ DUK_ASSERT(func_env != NULL);
+ need_pop = 0;
+ if (DUK_HOBJECT_HAS_NAMEBINDING((duk_hobject *) h_fun)) {
+ /* Original function instance/template had NAMEBINDING.
+ * Must create a lexical environment on loading to allow
+ * recursive functions like 'function foo() { foo(); }'.
+ */
+ duk_hdecenv *new_env;
+
+ new_env = duk_hdecenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
+ DUK_ASSERT(new_env != NULL);
+ DUK_ASSERT(new_env->thread == NULL); /* Closed. */
+ DUK_ASSERT(new_env->varmap == NULL);
+ DUK_ASSERT(new_env->regbase_byteoff == 0);
+ DUK_ASSERT_HDECENV_VALID(new_env);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, func_env);
+ DUK_HOBJECT_INCREF(thr, func_env);
+
+ func_env = (duk_hobject *) new_env;
+
+ duk_push_hobject(thr, (duk_hobject *) new_env);
+
+ duk_dup_m2(thr); /* -> [ func funcname env funcname ] */
+ duk_dup(thr, idx_base); /* -> [ func funcname env funcname func ] */
+ duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ func funcname env ] */
+
+ need_pop = 1; /* Need to pop env, but -after- updating h_fun and increfs. */
+ }
+ DUK_ASSERT(func_env != NULL);
+ DUK_HCOMPFUNC_SET_LEXENV(thr->heap, h_fun, func_env);
+ DUK_HCOMPFUNC_SET_VARENV(thr->heap, h_fun, func_env);
+ DUK_HOBJECT_INCREF(thr, func_env);
+ DUK_HOBJECT_INCREF(thr, func_env);
+ if (need_pop) {
+ duk_pop(thr);
+ }
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);
+#endif /* DUK_USE_FUNC_NAME_PROPERTY */
+
+#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)
+ p = duk__load_string_raw(thr, p);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C);
+#endif /* DUK_USE_FUNC_FILENAME_PROPERTY */
+
+ if (DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_fun)) {
+ /* Restore empty external .prototype only for constructable
+ * functions.
+ */
+ duk_push_object(thr);
+ duk_dup_m2(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* func.prototype.constructor = func */
+ duk_compact_m1(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W);
+ }
+
+#if defined(DUK_USE_PC2LINE)
+ p = duk__load_buffer_raw(thr, p);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_WC);
+#endif /* DUK_USE_PC2LINE */
+
+ duk_push_object(thr); /* _Varmap */
+ for (;;) {
+ /* XXX: awkward */
+ p = duk__load_string_raw(thr, p);
+ if (duk_get_length(thr, -1) == 0) {
+ duk_pop(thr);
+ break;
+ }
+ tmp32 = DUK_RAW_READ_U32_BE(p);
+ duk_push_u32(thr, tmp32);
+ duk_put_prop(thr, -3);
+ }
+ duk_compact_m1(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE);
+
+ /* _Formals may have been missing in the original function, which is
+ * handled using a marker length.
+ */
+ arr_limit = DUK_RAW_READ_U32_BE(p);
+ if (arr_limit != DUK__NO_FORMALS) {
+ duk_push_array(thr); /* _Formals */
+ for (arr_idx = 0; arr_idx < arr_limit; arr_idx++) {
+ p = duk__load_string_raw(thr, p);
+ duk_put_prop_index(thr, -2, arr_idx);
+ }
+ duk_compact_m1(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE);
+ } else {
+ DUK_DD(DUK_DDPRINT("no _Formals in dumped function"));
+ }
+
+ /* Return with final function pushed on stack top. */
+ DUK_DD(DUK_DDPRINT("final loaded function: %!iT", duk_get_tval(thr, -1)));
+ DUK_ASSERT_TOP(thr, idx_base + 1);
+ return p;
+
+ format_error:
+ return NULL;
+}
+
+DUK_EXTERNAL void duk_dump_function(duk_hthread *thr) {
+ duk_hcompfunc *func;
+ duk_bufwriter_ctx bw_ctx_alloc;
+ duk_bufwriter_ctx *bw_ctx = &bw_ctx_alloc;
+ duk_uint8_t *p;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Bound functions don't have all properties so we'd either need to
+ * lookup the non-bound target function or reject bound functions.
+ * For now, bound functions are rejected with TypeError.
+ */
+ func = duk_require_hcompfunc(thr, -1);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&func->obj));
+
+ /* Estimating the result size beforehand would be costly, so
+ * start with a reasonable size and extend as needed.
+ */
+ DUK_BW_INIT_PUSHBUF(thr, bw_ctx, DUK__BYTECODE_INITIAL_ALLOC);
+ p = DUK_BW_GET_PTR(thr, bw_ctx);
+ *p++ = DUK__SER_MARKER;
+ p = duk__dump_func(thr, func, bw_ctx, p);
+ DUK_BW_SET_PTR(thr, bw_ctx, p);
+ DUK_BW_COMPACT(thr, bw_ctx);
+
+ DUK_DD(DUK_DDPRINT("serialized result: %!T", duk_get_tval(thr, -1)));
+
+ duk_remove_m2(thr); /* [ ... func buf ] -> [ ... buf ] */
+}
+
+DUK_EXTERNAL void duk_load_function(duk_hthread *thr) {
+ duk_uint8_t *p_buf, *p, *p_end;
+ duk_size_t sz;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ p_buf = (duk_uint8_t *) duk_require_buffer(thr, -1, &sz);
+ DUK_ASSERT(p_buf != NULL);
+
+ /* The caller is responsible for being sure that bytecode being loaded
+ * is valid and trusted. Invalid bytecode can cause memory unsafe
+ * behavior directly during loading or later during bytecode execution
+ * (instruction validation would be quite complex to implement).
+ *
+ * This signature check is the only sanity check for detecting
+ * accidental invalid inputs. The initial byte ensures no ordinary
+ * string or Symbol will be accepted by accident.
+ */
+ p = p_buf;
+ p_end = p_buf + sz;
+ if (sz < 1 || p[0] != DUK__SER_MARKER) {
+ goto format_error;
+ }
+ p++;
+
+ p = duk__load_func(thr, p, p_end);
+ if (p == NULL) {
+ goto format_error;
+ }
+
+ duk_remove_m2(thr); /* [ ... buf func ] -> [ ... func ] */
+ return;
+
+ format_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BYTECODE);
+}
+
+#else /* DUK_USE_BYTECODE_DUMP_SUPPORT */
+
+DUK_EXTERNAL void duk_dump_function(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+
+DUK_EXTERNAL void duk_load_function(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+
+#endif /* DUK_USE_BYTECODE_DUMP_SUPPORT */
+
+/* automatic undefs */
+#undef DUK__ASSERT_LEFT
+#undef DUK__BYTECODE_INITIAL_ALLOC
+#undef DUK__NO_FORMALS
+#undef DUK__SER_MARKER
+#undef DUK__SER_NUMBER
+#undef DUK__SER_STRING
+#line 1 "duk_api_call.c"
+/*
+ * Calls.
+ *
+ * Protected variants should avoid ever throwing an error. Must be careful
+ * to catch errors related to value stack manipulation and property lookup,
+ * not just the call itself.
+ *
+ * The only exception is when arguments are insane, e.g. nargs/nrets are out
+ * of bounds; in such cases an error is thrown for two reasons. First, we
+ * can't always respect the value stack input/output guarantees in such cases
+ * so the caller would end up with the value stack in an unexpected state.
+ * Second, an attempt to create an error might itself fail (although this
+ * could be avoided by pushing a preallocated object/string or a primitive
+ * value).
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Helpers
+ */
+
+struct duk__pcall_prop_args {
+ duk_idx_t obj_idx;
+ duk_idx_t nargs;
+ duk_small_uint_t call_flags;
+};
+typedef struct duk__pcall_prop_args duk__pcall_prop_args;
+
+struct duk__pcall_method_args {
+ duk_idx_t nargs;
+ duk_small_uint_t call_flags;
+};
+typedef struct duk__pcall_method_args duk__pcall_method_args;
+
+struct duk__pcall_args {
+ duk_idx_t nargs;
+ duk_small_uint_t call_flags;
+};
+typedef struct duk__pcall_args duk__pcall_args;
+
+/* Compute and validate idx_func for a certain 'nargs' and 'other'
+ * parameter count (1 or 2, depending on whether 'this' binding is
+ * present).
+ */
+DUK_LOCAL duk_idx_t duk__call_get_idx_func(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) {
+ duk_idx_t idx_func;
+
+ /* XXX: byte arithmetic? */
+
+ DUK_ASSERT(other >= 0);
+
+ idx_func = duk_get_top(thr) - nargs - other;
+ if (DUK_UNLIKELY((idx_func | nargs) < 0)) { /* idx_func < 0 || nargs < 0; OR sign bits */
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ /* unreachable */
+ }
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+ return idx_func;
+}
+
+/* Compute idx_func, assume index will be valid. This is a valid assumption
+ * for protected calls: nargs < 0 is checked explicitly and duk_safe_call()
+ * validates the argument count.
+ */
+DUK_LOCAL duk_idx_t duk__call_get_idx_func_unvalidated(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) {
+ duk_idx_t idx_func;
+
+ /* XXX: byte arithmetic? */
+
+ DUK_ASSERT(nargs >= 0);
+ DUK_ASSERT(other >= 0);
+
+ idx_func = duk_get_top(thr) - nargs - other;
+ DUK_ASSERT(idx_func >= 0);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+ return idx_func;
+}
+
+/* Prepare value stack for a method call through an object property.
+ * May currently throw an error e.g. when getting the property.
+ */
+DUK_LOCAL void duk__call_prop_prep_stack(duk_hthread *thr, duk_idx_t normalized_obj_idx, duk_idx_t nargs) {
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(nargs >= 0);
+
+ DUK_DDD(DUK_DDDPRINT("duk__call_prop_prep_stack, normalized_obj_idx=%ld, nargs=%ld, stacktop=%ld",
+ (long) normalized_obj_idx, (long) nargs, (long) duk_get_top(thr)));
+
+ /* [... key arg1 ... argN] */
+
+ /* duplicate key */
+ duk_dup(thr, -nargs - 1); /* Note: -nargs alone would fail for nargs == 0, this is OK */
+ (void) duk_get_prop(thr, normalized_obj_idx);
+
+ DUK_DDD(DUK_DDDPRINT("func: %!T", (duk_tval *) duk_get_tval(thr, -1)));
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ if (DUK_UNLIKELY(!duk_is_callable(thr, -1))) {
+ duk_tval *tv_targ;
+ duk_tval *tv_base;
+ duk_tval *tv_key;
+
+ tv_targ = DUK_GET_TVAL_NEGIDX(thr, -1);
+ tv_base = DUK_GET_TVAL_POSIDX(thr, normalized_obj_idx);
+ tv_key = DUK_GET_TVAL_NEGIDX(thr, -nargs - 2);
+ DUK_ASSERT(tv_targ >= thr->valstack_bottom && tv_targ < thr->valstack_top);
+ DUK_ASSERT(tv_base >= thr->valstack_bottom && tv_base < thr->valstack_top);
+ DUK_ASSERT(tv_key >= thr->valstack_bottom && tv_key < thr->valstack_top);
+
+ duk_call_setup_propcall_error(thr, tv_targ, tv_base, tv_key);
+ }
+#endif
+
+ /* [... key arg1 ... argN func] */
+
+ duk_replace(thr, -nargs - 2);
+
+ /* [... func arg1 ... argN] */
+
+ duk_dup(thr, normalized_obj_idx);
+ duk_insert(thr, -nargs - 1);
+
+ /* [... func this arg1 ... argN] */
+}
+
+DUK_EXTERNAL void duk_call(duk_hthread *thr, duk_idx_t nargs) {
+ duk_small_uint_t call_flags;
+ duk_idx_t idx_func;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx_func = duk__call_get_idx_func(thr, nargs, 1);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+
+ duk_insert_undefined(thr, idx_func + 1);
+
+ call_flags = 0; /* not protected, respect reclimit, not constructor */
+ duk_handle_call_unprotected(thr, idx_func, call_flags);
+}
+
+DUK_EXTERNAL void duk_call_method(duk_hthread *thr, duk_idx_t nargs) {
+ duk_small_uint_t call_flags;
+ duk_idx_t idx_func;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx_func = duk__call_get_idx_func(thr, nargs, 2);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+
+ call_flags = 0; /* not protected, respect reclimit, not constructor */
+ duk_handle_call_unprotected(thr, idx_func, call_flags);
+}
+
+DUK_EXTERNAL void duk_call_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) {
+ /*
+ * XXX: if duk_handle_call() took values through indices, this could be
+ * made much more sensible. However, duk_handle_call() needs to fudge
+ * the 'this' and 'func' values to handle bound functions, which is now
+ * done "in-place", so this is not a trivial change.
+ */
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx); /* make absolute */
+ if (DUK_UNLIKELY(nargs < 0)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ duk__call_prop_prep_stack(thr, obj_idx, nargs);
+
+ duk_call_method(thr, nargs);
+}
+
+DUK_LOCAL duk_ret_t duk__pcall_raw(duk_hthread *thr, void *udata) {
+ duk__pcall_args *args;
+ duk_idx_t idx_func;
+ duk_int_t ret;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(udata != NULL);
+
+ args = (duk__pcall_args *) udata;
+ idx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 1);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+
+ duk_insert_undefined(thr, idx_func + 1);
+
+ ret = duk_handle_call_unprotected(thr, idx_func, args->call_flags);
+ DUK_ASSERT(ret == 0);
+ DUK_UNREF(ret);
+
+ return 1;
+}
+
+DUK_EXTERNAL duk_int_t duk_pcall(duk_hthread *thr, duk_idx_t nargs) {
+ duk__pcall_args args;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ args.nargs = nargs;
+ if (DUK_UNLIKELY(nargs < 0)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return DUK_EXEC_ERROR; /* unreachable */
+ }
+ args.call_flags = 0;
+
+ return duk_safe_call(thr, duk__pcall_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/);
+}
+
+DUK_LOCAL duk_ret_t duk__pcall_method_raw(duk_hthread *thr, void *udata) {
+ duk__pcall_method_args *args;
+ duk_idx_t idx_func;
+ duk_int_t ret;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(udata != NULL);
+
+ args = (duk__pcall_method_args *) udata;
+
+ idx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 2);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+
+ ret = duk_handle_call_unprotected(thr, idx_func, args->call_flags);
+ DUK_ASSERT(ret == 0);
+ DUK_UNREF(ret);
+
+ return 1;
+}
+
+DUK_INTERNAL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags) {
+ duk__pcall_method_args args;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ args.nargs = nargs;
+ if (DUK_UNLIKELY(nargs < 0)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return DUK_EXEC_ERROR; /* unreachable */
+ }
+ args.call_flags = call_flags;
+
+ return duk_safe_call(thr, duk__pcall_method_raw, (void *) &args /*udata*/, nargs + 2 /*nargs*/, 1 /*nrets*/);
+}
+
+DUK_EXTERNAL duk_int_t duk_pcall_method(duk_hthread *thr, duk_idx_t nargs) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk_pcall_method_flags(thr, nargs, 0);
+}
+
+DUK_LOCAL duk_ret_t duk__pcall_prop_raw(duk_hthread *thr, void *udata) {
+ duk__pcall_prop_args *args;
+ duk_idx_t obj_idx;
+ duk_int_t ret;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(udata != NULL);
+
+ args = (duk__pcall_prop_args *) udata;
+
+ obj_idx = duk_require_normalize_index(thr, args->obj_idx); /* make absolute */
+ duk__call_prop_prep_stack(thr, obj_idx, args->nargs);
+
+ ret = duk_handle_call_unprotected_nargs(thr, args->nargs, args->call_flags);
+ DUK_ASSERT(ret == 0);
+ DUK_UNREF(ret);
+ return 1;
+}
+
+DUK_EXTERNAL duk_int_t duk_pcall_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) {
+ duk__pcall_prop_args args;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ args.obj_idx = obj_idx;
+ args.nargs = nargs;
+ if (DUK_UNLIKELY(nargs < 0)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return DUK_EXEC_ERROR; /* unreachable */
+ }
+ args.call_flags = 0;
+
+ return duk_safe_call(thr, duk__pcall_prop_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/);
+}
+
+DUK_EXTERNAL duk_int_t duk_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets) {
+ duk_int_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* nargs condition; fail if: top - bottom < nargs
+ * <=> top < bottom + nargs
+ * nrets condition; fail if: end - (top - nargs) < nrets
+ * <=> end - top + nargs < nrets
+ * <=> end + nargs < top + nrets
+ */
+ /* XXX: check for any reserve? */
+
+ if (DUK_UNLIKELY((nargs | nrets) < 0 || /* nargs < 0 || nrets < 0; OR sign bits */
+ thr->valstack_top < thr->valstack_bottom + nargs || /* nargs too large compared to top */
+ thr->valstack_end + nargs < thr->valstack_top + nrets)) { /* nrets too large compared to reserve */
+ DUK_D(DUK_DPRINT("not enough stack reserve for safe call or invalid arguments: "
+ "nargs=%ld < 0 (?), nrets=%ld < 0 (?), top=%ld < bottom=%ld + nargs=%ld (?), "
+ "end=%ld + nargs=%ld < top=%ld + nrets=%ld (?)",
+ (long) nargs,
+ (long) nrets,
+ (long) (thr->valstack_top - thr->valstack),
+ (long) (thr->valstack_bottom - thr->valstack),
+ (long) nargs,
+ (long) (thr->valstack_end - thr->valstack),
+ (long) nargs,
+ (long) (thr->valstack_top - thr->valstack),
+ (long) nrets));
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return DUK_EXEC_ERROR; /* unreachable */
+ }
+
+ rc = duk_handle_safe_call(thr, /* thread */
+ func, /* func */
+ udata, /* udata */
+ nargs, /* num_stack_args */
+ nrets); /* num_stack_res */
+
+ return rc;
+}
+
+DUK_EXTERNAL void duk_new(duk_hthread *thr, duk_idx_t nargs) {
+ duk_idx_t idx_func;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx_func = duk__call_get_idx_func(thr, nargs, 1);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+
+ duk_push_object(thr); /* default instance; internal proto updated by call handling */
+ duk_insert(thr, idx_func + 1);
+
+ duk_handle_call_unprotected(thr, idx_func, DUK_CALL_FLAG_CONSTRUCT);
+}
+
+DUK_LOCAL duk_ret_t duk__pnew_helper(duk_hthread *thr, void *udata) {
+ duk_idx_t nargs;
+
+ DUK_ASSERT(udata != NULL);
+ nargs = *((duk_idx_t *) udata);
+
+ duk_new(thr, nargs);
+ return 1;
+}
+
+DUK_EXTERNAL duk_int_t duk_pnew(duk_hthread *thr, duk_idx_t nargs) {
+ duk_int_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* For now, just use duk_safe_call() to wrap duk_new(). We can't
+ * simply use a protected duk_handle_call() because pushing the
+ * default instance might throw.
+ */
+
+ if (DUK_UNLIKELY(nargs < 0)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return DUK_EXEC_ERROR; /* unreachable */
+ }
+
+ rc = duk_safe_call(thr, duk__pnew_helper, (void *) &nargs /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/);
+ return rc;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_constructor_call(duk_hthread *thr) {
+ duk_activation *act;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ act = thr->callstack_curr;
+ if (act != NULL) {
+ return ((act->flags & DUK_ACT_FLAG_CONSTRUCT) != 0 ? 1 : 0);
+ }
+ return 0;
+}
+
+/* XXX: Make this obsolete by adding a function flag for rejecting a
+ * non-constructor call automatically?
+ */
+DUK_INTERNAL void duk_require_constructor_call(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (!duk_is_constructor_call(thr)) {
+ DUK_ERROR_TYPE(thr, DUK_STR_CONSTRUCT_ONLY);
+ }
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_strict_call(duk_hthread *thr) {
+ duk_activation *act;
+
+ /* For user code this could just return 1 (strict) always
+ * because all Duktape/C functions are considered strict,
+ * and strict is also the default when nothing is running.
+ * However, Duktape may call this function internally when
+ * the current activation is an Ecmascript function, so
+ * this cannot be replaced by a 'return 1' without fixing
+ * the internal call sites.
+ */
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ act = thr->callstack_curr;
+ if (act != NULL) {
+ return ((act->flags & DUK_ACT_FLAG_STRICT) != 0 ? 1 : 0);
+ } else {
+ /* Strict by default. */
+ return 1;
+ }
+}
+
+/*
+ * Duktape/C function magic
+ */
+
+DUK_EXTERNAL duk_int_t duk_get_current_magic(duk_hthread *thr) {
+ duk_activation *act;
+ duk_hobject *func;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ act = thr->callstack_curr;
+ if (act) {
+ func = DUK_ACT_GET_FUNC(act);
+ if (!func) {
+ duk_tval *tv = &act->tv_func;
+ duk_small_uint_t lf_flags;
+ lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv);
+ return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags);
+ }
+ DUK_ASSERT(func != NULL);
+
+ if (DUK_HOBJECT_IS_NATFUNC(func)) {
+ duk_hnatfunc *nf = (duk_hnatfunc *) func;
+ return (duk_int_t) nf->magic;
+ }
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_int_t duk_get_magic(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (!DUK_HOBJECT_HAS_NATFUNC(h)) {
+ goto type_error;
+ }
+ return (duk_int_t) ((duk_hnatfunc *) h)->magic;
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ duk_small_uint_t lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv);
+ return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags);
+ }
+
+ /* fall through */
+ type_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE);
+ return 0;
+}
+
+DUK_EXTERNAL void duk_set_magic(duk_hthread *thr, duk_idx_t idx, duk_int_t magic) {
+ duk_hnatfunc *nf;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ nf = duk_require_hnatfunc(thr, idx);
+ DUK_ASSERT(nf != NULL);
+ nf->magic = (duk_int16_t) magic;
+}
+
+/*
+ * Misc helpers
+ */
+
+/* Resolve a bound function on value stack top to a non-bound target
+ * (leave other values as is).
+ */
+DUK_INTERNAL void duk_resolve_nonbound_function(duk_hthread *thr) {
+ duk_tval *tv;
+
+ DUK_ASSERT_HTHREAD_VALID(thr);
+
+ tv = DUK_GET_TVAL_NEGIDX(thr, -1);
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_HOBJECT_HAS_BOUNDFUNC(h)) {
+ duk_push_tval(thr, &((duk_hboundfunc *) h)->target);
+ duk_replace(thr, -2);
+#if 0
+ DUK_TVAL_SET_TVAL(tv, &((duk_hboundfunc *) h)->target);
+ DUK_TVAL_INCREF(thr, tv);
+ DUK_HOBJECT_DECREF_NORZ(thr, h);
+#endif
+ /* Rely on Function.prototype.bind() on never creating a bound
+ * function whose target is not proper. This is now safe
+ * because the target is not even an internal property but a
+ * struct member.
+ */
+ DUK_ASSERT(duk_is_lightfunc(thr, -1) || duk_is_callable(thr, -1));
+ }
+ }
+
+ /* Lightfuncs cannot be bound but are always callable and
+ * constructable.
+ */
+}
+#line 1 "duk_api_codec.c"
+/*
+ * Encoding and decoding basic formats: hex, base64.
+ *
+ * These are in-place operations which may allow an optimized implementation.
+ *
+ * Base-64: https://tools.ietf.org/html/rfc4648#section-4
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Shared handling for encode/decode argument. Fast path handling for
+ * buffer and string values because they're the most common. In particular,
+ * avoid creating a temporary string or buffer when possible.
+ */
+DUK_LOCAL const duk_uint8_t *duk__prep_codec_arg(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {
+ void *ptr;
+ duk_bool_t isbuffer;
+
+ DUK_ASSERT(duk_is_valid_index(thr, idx)); /* checked by caller */
+
+ /* XXX: with def_ptr set to a stack related pointer, isbuffer could
+ * be removed from the helper?
+ */
+ ptr = duk_get_buffer_data_raw(thr, idx, out_len, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, &isbuffer);
+ if (isbuffer) {
+ DUK_ASSERT(*out_len == 0 || ptr != NULL);
+ return (const duk_uint8_t *) ptr;
+ }
+ return (const duk_uint8_t *) duk_to_lstring(thr, idx, out_len);
+}
+
+#if defined(DUK_USE_BASE64_FASTPATH)
+DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) {
+ duk_uint_t t;
+ duk_size_t n_full, n_full3, n_final;
+ const duk_uint8_t *src_end_fast;
+
+ n_full = srclen / 3; /* full 3-byte -> 4-char conversions */
+ n_full3 = n_full * 3;
+ n_final = srclen - n_full3;
+ DUK_ASSERT_DISABLE(n_final >= 0);
+ DUK_ASSERT(n_final <= 2);
+
+ src_end_fast = src + n_full3;
+ while (DUK_UNLIKELY(src != src_end_fast)) {
+ t = (duk_uint_t) (*src++);
+ t = (t << 8) + (duk_uint_t) (*src++);
+ t = (t << 8) + (duk_uint_t) (*src++);
+
+ *dst++ = duk_base64_enctab[t >> 18];
+ *dst++ = duk_base64_enctab[(t >> 12) & 0x3f];
+ *dst++ = duk_base64_enctab[(t >> 6) & 0x3f];
+ *dst++ = duk_base64_enctab[t & 0x3f];
+
+#if 0 /* Tested: not faster on x64 */
+ /* aaaaaabb bbbbcccc ccdddddd */
+ dst[0] = duk_base64_enctab[(src[0] >> 2) & 0x3f];
+ dst[1] = duk_base64_enctab[((src[0] << 4) & 0x30) | ((src[1] >> 4) & 0x0f)];
+ dst[2] = duk_base64_enctab[((src[1] << 2) & 0x3f) | ((src[2] >> 6) & 0x03)];
+ dst[3] = duk_base64_enctab[src[2] & 0x3f];
+ src += 3; dst += 4;
+#endif
+ }
+
+ switch (n_final) {
+ /* case 0: nop */
+ case 1: {
+ /* XX== */
+ t = (duk_uint_t) (*src++);
+ *dst++ = duk_base64_enctab[t >> 2]; /* XXXXXX-- */
+ *dst++ = duk_base64_enctab[(t << 4) & 0x3f]; /* ------XX */
+ *dst++ = DUK_ASC_EQUALS;
+ *dst++ = DUK_ASC_EQUALS;
+ break;
+ }
+ case 2: {
+ /* XXX= */
+ t = (duk_uint_t) (*src++);
+ t = (t << 8) + (duk_uint_t) (*src++);
+ *dst++ = duk_base64_enctab[t >> 10]; /* XXXXXX-- -------- */
+ *dst++ = duk_base64_enctab[(t >> 4) & 0x3f]; /* ------XX XXXX---- */
+ *dst++ = duk_base64_enctab[(t << 2) & 0x3f]; /* -------- ----XXXX */
+ *dst++ = DUK_ASC_EQUALS;
+ break;
+ }
+ }
+}
+#else /* DUK_USE_BASE64_FASTPATH */
+DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) {
+ duk_small_uint_t i, snip;
+ duk_uint_t t;
+ duk_uint_fast8_t x, y;
+ const duk_uint8_t *src_end;
+
+ src_end = src + srclen;
+
+ while (src < src_end) {
+ /* read 3 bytes into 't', padded by zero */
+ snip = 4;
+ t = 0;
+ for (i = 0; i < 3; i++) {
+ t = t << 8;
+ if (src >= src_end) {
+ snip--;
+ } else {
+ t += (duk_uint_t) (*src++);
+ }
+ }
+
+ /*
+ * Missing bytes snip base64 example
+ * 0 4 XXXX
+ * 1 3 XXX=
+ * 2 2 XX==
+ */
+
+ DUK_ASSERT(snip >= 2 && snip <= 4);
+
+ for (i = 0; i < 4; i++) {
+ x = (duk_uint_fast8_t) ((t >> 18) & 0x3f);
+ t = t << 6;
+
+ /* A straightforward 64-byte lookup would be faster
+ * and cleaner, but this is shorter.
+ */
+ if (i >= snip) {
+ y = '=';
+ } else if (x <= 25) {
+ y = x + 'A';
+ } else if (x <= 51) {
+ y = x - 26 + 'a';
+ } else if (x <= 61) {
+ y = x - 52 + '0';
+ } else if (x == 62) {
+ y = '+';
+ } else {
+ y = '/';
+ }
+
+ *dst++ = (duk_uint8_t) y;
+ }
+ }
+}
+#endif /* DUK_USE_BASE64_FASTPATH */
+
+#if defined(DUK_USE_BASE64_FASTPATH)
+DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) {
+ duk_int_t x;
+ duk_int_t t;
+ duk_small_uint_t n_equal;
+ duk_small_uint_t n_chars;
+ const duk_uint8_t *src_end;
+ const duk_uint8_t *src_end_safe;
+
+ src_end = src + srclen;
+ src_end_safe = src_end - 4; /* if 'src < src_end_safe', safe to read 4 bytes */
+
+ /* Innermost fast path processes 4 valid base-64 characters at a time
+ * but bails out on whitespace, padding chars ('=') and invalid chars.
+ * Once the slow path segment has been processed, we return to the
+ * inner fast path again. This handles e.g. base64 with newlines
+ * reasonably well because the majority of a line is in the fast path.
+ */
+ for (;;) {
+ /* Fast path, handle units with just actual encoding characters. */
+
+ while (src <= src_end_safe) {
+ /* The lookup byte is intentionally sign extended to (at least)
+ * 32 bits and then ORed. This ensures that is at least 1 byte
+ * is negative, the highest bit of 't' will be set at the end
+ * and we don't need to check every byte.
+ */
+ DUK_DDD(DUK_DDDPRINT("fast loop: src=%p, src_end_safe=%p, src_end=%p",
+ (const void *) src, (const void *) src_end_safe, (const void *) src_end));
+
+ t = (duk_int_t) duk_base64_dectab[*src++];
+ t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++];
+ t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++];
+ t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++];
+
+ if (DUK_UNLIKELY(t < 0)) {
+ DUK_DDD(DUK_DDDPRINT("fast loop unit was not clean, process one slow path unit"));
+ src -= 4;
+ break;
+ }
+
+ DUK_ASSERT(t <= 0xffffffL);
+ DUK_ASSERT((t >> 24) == 0);
+ *dst++ = (duk_uint8_t) (t >> 16);
+ *dst++ = (duk_uint8_t) ((t >> 8) & 0xff);
+ *dst++ = (duk_uint8_t) (t & 0xff);
+ }
+
+ /* Handle one slow path unit (or finish if we're done). */
+
+ n_equal = 0;
+ n_chars = 0;
+ t = 0;
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("slow loop: src=%p, src_end=%p, n_chars=%ld, n_equal=%ld, t=%ld",
+ (const void *) src, (const void *) src_end, (long) n_chars, (long) n_equal, (long) t));
+
+ if (DUK_UNLIKELY(src >= src_end)) {
+ goto done; /* two level break */
+ }
+
+ x = duk_base64_dectab[*src++];
+ if (DUK_UNLIKELY(x < 0)) {
+ if (x == -2) {
+ continue; /* allowed ascii whitespace */
+ } else if (x == -3) {
+ n_equal++;
+ t <<= 6;
+ } else {
+ DUK_ASSERT(x == -1);
+ goto decode_error;
+ }
+ } else {
+ DUK_ASSERT(x >= 0 && x <= 63);
+ if (n_equal > 0) {
+ /* Don't allow actual chars after equal sign. */
+ goto decode_error;
+ }
+ t = (t << 6) + x;
+ }
+
+ if (DUK_UNLIKELY(n_chars == 3)) {
+ /* Emit 3 bytes and backtrack if there was padding. There's
+ * always space for the whole 3 bytes so no check needed.
+ */
+ DUK_ASSERT(t <= 0xffffffL);
+ DUK_ASSERT((t >> 24) == 0);
+ *dst++ = (duk_uint8_t) (t >> 16);
+ *dst++ = (duk_uint8_t) ((t >> 8) & 0xff);
+ *dst++ = (duk_uint8_t) (t & 0xff);
+
+ if (DUK_UNLIKELY(n_equal > 0)) {
+ DUK_ASSERT(n_equal <= 4);
+
+ /* There may be whitespace between the equal signs. */
+ if (n_equal == 1) {
+ /* XXX= */
+ dst -= 1;
+ } else if (n_equal == 2) {
+ /* XX== */
+ dst -= 2;
+ } else {
+ goto decode_error; /* invalid padding */
+ }
+
+ /* Continue parsing after padding, allows concatenated,
+ * padded base64.
+ */
+ }
+ break; /* back to fast loop */
+ } else {
+ n_chars++;
+ }
+ }
+ }
+ done:
+ DUK_DDD(DUK_DDDPRINT("done; src=%p, src_end=%p, n_chars=%ld",
+ (const void *) src, (const void *) src_end, (long) n_chars));
+
+ DUK_ASSERT(src == src_end);
+
+ if (n_chars != 0) {
+ /* Here we'd have the option of decoding unpadded base64
+ * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not
+ * accepted.
+ */
+ goto decode_error;
+ }
+
+ *out_dst_final = dst;
+ return 1;
+
+ decode_error:
+ return 0;
+}
+#else /* DUK_USE_BASE64_FASTPATH */
+DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) {
+ duk_uint_t t;
+ duk_uint_fast8_t x, y;
+ duk_small_uint_t group_idx;
+ duk_small_uint_t n_equal;
+ const duk_uint8_t *src_end;
+
+ src_end = src + srclen;
+ t = 0;
+ group_idx = 0;
+ n_equal = 0;
+
+ while (src < src_end) {
+ x = *src++;
+
+ if (x >= 'A' && x <= 'Z') {
+ y = x - 'A' + 0;
+ } else if (x >= 'a' && x <= 'z') {
+ y = x - 'a' + 26;
+ } else if (x >= '0' && x <= '9') {
+ y = x - '0' + 52;
+ } else if (x == '+') {
+ y = 62;
+ } else if (x == '/') {
+ y = 63;
+ } else if (x == '=') {
+ /* We don't check the zero padding bytes here right now
+ * (that they're actually zero). This seems to be common
+ * behavior for base-64 decoders.
+ */
+
+ n_equal++;
+ t <<= 6; /* shift in zeroes */
+ goto skip_add;
+ } else if (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20) {
+ /* allow basic ASCII whitespace */
+ continue;
+ } else {
+ goto decode_error;
+ }
+
+ if (n_equal > 0) {
+ /* Don't allow mixed padding and actual chars. */
+ goto decode_error;
+ }
+ t = (t << 6) + y;
+ skip_add:
+
+ if (group_idx == 3) {
+ /* output 3 bytes from 't' */
+ *dst++ = (duk_uint8_t) ((t >> 16) & 0xff);
+ *dst++ = (duk_uint8_t) ((t >> 8) & 0xff);
+ *dst++ = (duk_uint8_t) (t & 0xff);
+
+ if (DUK_UNLIKELY(n_equal > 0)) {
+ /* Backtrack. */
+ DUK_ASSERT(n_equal <= 4);
+ if (n_equal == 1) {
+ dst -= 1;
+ } else if (n_equal == 2) {
+ dst -= 2;
+ } else {
+ goto decode_error; /* invalid padding */
+ }
+
+ /* Here we can choose either to end parsing and ignore
+ * whatever follows, or to continue parsing in case
+ * multiple (possibly padded) base64 strings have been
+ * concatenated. Currently, keep on parsing.
+ */
+ n_equal = 0;
+ }
+
+ t = 0;
+ group_idx = 0;
+ } else {
+ group_idx++;
+ }
+ }
+
+ if (group_idx != 0) {
+ /* Here we'd have the option of decoding unpadded base64
+ * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not
+ * accepted.
+ */
+ goto decode_error;
+ }
+
+ *out_dst_final = dst;
+ return 1;
+
+ decode_error:
+ return 0;
+}
+#endif /* DUK_USE_BASE64_FASTPATH */
+
+DUK_EXTERNAL const char *duk_base64_encode(duk_hthread *thr, duk_idx_t idx) {
+ const duk_uint8_t *src;
+ duk_size_t srclen;
+ duk_size_t dstlen;
+ duk_uint8_t *dst;
+ const char *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* XXX: optimize for string inputs: no need to coerce to a buffer
+ * which makes a copy of the input.
+ */
+
+ idx = duk_require_normalize_index(thr, idx);
+ src = duk__prep_codec_arg(thr, idx, &srclen);
+ /* Note: for srclen=0, src may be NULL */
+
+ /* Computation must not wrap; this limit works for 32-bit size_t:
+ * >>> srclen = 3221225469
+ * >>> '%x' % ((srclen + 2) / 3 * 4)
+ * 'fffffffc'
+ */
+ if (srclen > 3221225469UL) {
+ goto type_error;
+ }
+ dstlen = (srclen + 2) / 3 * 4;
+ dst = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, dstlen);
+
+ duk__base64_encode_helper((const duk_uint8_t *) src, srclen, dst);
+
+ ret = duk_buffer_to_string(thr, -1); /* Safe, result is ASCII. */
+ duk_replace(thr, idx);
+ return ret;
+
+ type_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_BASE64_ENCODE_FAILED);
+ return NULL; /* never here */
+}
+
+DUK_EXTERNAL void duk_base64_decode(duk_hthread *thr, duk_idx_t idx) {
+ const duk_uint8_t *src;
+ duk_size_t srclen;
+ duk_size_t dstlen;
+ duk_uint8_t *dst;
+ duk_uint8_t *dst_final;
+ duk_bool_t retval;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* XXX: optimize for buffer inputs: no need to coerce to a string
+ * which causes an unnecessary interning.
+ */
+
+ idx = duk_require_normalize_index(thr, idx);
+ src = duk__prep_codec_arg(thr, idx, &srclen);
+
+ /* Computation must not wrap, only srclen + 3 is at risk of
+ * wrapping because after that the number gets smaller.
+ * This limit works for 32-bit size_t:
+ * 0x100000000 - 3 - 1 = 4294967292
+ */
+ if (srclen > 4294967292UL) {
+ goto type_error;
+ }
+ dstlen = (srclen + 3) / 4 * 3; /* upper limit, assuming no whitespace etc */
+ dst = (duk_uint8_t *) duk_push_dynamic_buffer(thr, dstlen);
+ /* Note: for dstlen=0, dst may be NULL */
+
+ retval = duk__base64_decode_helper((const duk_uint8_t *) src, srclen, dst, &dst_final);
+ if (!retval) {
+ goto type_error;
+ }
+
+ /* XXX: convert to fixed buffer? */
+ (void) duk_resize_buffer(thr, -1, (duk_size_t) (dst_final - dst));
+ duk_replace(thr, idx);
+ return;
+
+ type_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_BASE64_DECODE_FAILED);
+}
+
+DUK_EXTERNAL const char *duk_hex_encode(duk_hthread *thr, duk_idx_t idx) {
+ const duk_uint8_t *inp;
+ duk_size_t len;
+ duk_size_t i;
+ duk_uint8_t *buf;
+ const char *ret;
+#if defined(DUK_USE_HEX_FASTPATH)
+ duk_size_t len_safe;
+ duk_uint16_t *p16;
+#endif
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+ inp = duk__prep_codec_arg(thr, idx, &len);
+ DUK_ASSERT(inp != NULL || len == 0);
+
+ /* Fixed buffer, no zeroing because we'll fill all the data. */
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len * 2);
+ DUK_ASSERT(buf != NULL);
+
+#if defined(DUK_USE_HEX_FASTPATH)
+ DUK_ASSERT((((duk_size_t) buf) & 0x01U) == 0); /* pointer is aligned, guaranteed for fixed buffer */
+ p16 = (duk_uint16_t *) (void *) buf;
+ len_safe = len & ~0x03U;
+ for (i = 0; i < len_safe; i += 4) {
+ p16[0] = duk_hex_enctab[inp[i]];
+ p16[1] = duk_hex_enctab[inp[i + 1]];
+ p16[2] = duk_hex_enctab[inp[i + 2]];
+ p16[3] = duk_hex_enctab[inp[i + 3]];
+ p16 += 4;
+ }
+ for (; i < len; i++) {
+ *p16++ = duk_hex_enctab[inp[i]];
+ }
+#else /* DUK_USE_HEX_FASTPATH */
+ for (i = 0; i < len; i++) {
+ duk_small_uint_t t;
+ t = (duk_small_uint_t) inp[i];
+ buf[i*2 + 0] = duk_lc_digits[t >> 4];
+ buf[i*2 + 1] = duk_lc_digits[t & 0x0f];
+ }
+#endif /* DUK_USE_HEX_FASTPATH */
+
+ /* XXX: Using a string return value forces a string intern which is
+ * not always necessary. As a rough performance measure, hex encode
+ * time for tests/perf/test-hex-encode.js dropped from ~35s to ~15s
+ * without string coercion. Change to returning a buffer and let the
+ * caller coerce to string if necessary?
+ */
+
+ ret = duk_buffer_to_string(thr, -1); /* Safe, result is ASCII. */
+ duk_replace(thr, idx);
+ return ret;
+}
+
+DUK_EXTERNAL void duk_hex_decode(duk_hthread *thr, duk_idx_t idx) {
+ const duk_uint8_t *inp;
+ duk_size_t len;
+ duk_size_t i;
+ duk_int_t t;
+ duk_uint8_t *buf;
+#if defined(DUK_USE_HEX_FASTPATH)
+ duk_int_t chk;
+ duk_uint8_t *p;
+ duk_size_t len_safe;
+#endif
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+ inp = duk__prep_codec_arg(thr, idx, &len);
+ DUK_ASSERT(inp != NULL || len == 0);
+
+ if (len & 0x01) {
+ goto type_error;
+ }
+
+ /* Fixed buffer, no zeroing because we'll fill all the data. */
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len / 2);
+ DUK_ASSERT(buf != NULL);
+
+#if defined(DUK_USE_HEX_FASTPATH)
+ p = buf;
+ len_safe = len & ~0x07U;
+ for (i = 0; i < len_safe; i += 8) {
+ t = ((duk_int_t) duk_hex_dectab_shift4[inp[i]]) |
+ ((duk_int_t) duk_hex_dectab[inp[i + 1]]);
+ chk = t;
+ p[0] = (duk_uint8_t) t;
+ t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 2]]) |
+ ((duk_int_t) duk_hex_dectab[inp[i + 3]]);
+ chk |= t;
+ p[1] = (duk_uint8_t) t;
+ t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 4]]) |
+ ((duk_int_t) duk_hex_dectab[inp[i + 5]]);
+ chk |= t;
+ p[2] = (duk_uint8_t) t;
+ t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 6]]) |
+ ((duk_int_t) duk_hex_dectab[inp[i + 7]]);
+ chk |= t;
+ p[3] = (duk_uint8_t) t;
+ p += 4;
+
+ /* Check if any lookup above had a negative result. */
+ if (DUK_UNLIKELY(chk < 0)) {
+ goto type_error;
+ }
+ }
+ for (; i < len; i += 2) {
+ t = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) |
+ ((duk_int_t) duk_hex_dectab[inp[i + 1]]);
+ if (DUK_UNLIKELY(t < 0)) {
+ goto type_error;
+ }
+ *p++ = (duk_uint8_t) t;
+ }
+#else /* DUK_USE_HEX_FASTPATH */
+ for (i = 0; i < len; i += 2) {
+ /* For invalid characters the value -1 gets extended to
+ * at least 16 bits. If either nybble is invalid, the
+ * resulting 't' will be < 0.
+ */
+ t = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) |
+ ((duk_int_t) duk_hex_dectab[inp[i + 1]]);
+ if (DUK_UNLIKELY(t < 0)) {
+ goto type_error;
+ }
+ buf[i >> 1] = (duk_uint8_t) t;
+ }
+#endif /* DUK_USE_HEX_FASTPATH */
+
+ duk_replace(thr, idx);
+ return;
+
+ type_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_HEX_DECODE_FAILED);
+}
+
+#if defined(DUK_USE_JSON_SUPPORT)
+DUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t top_at_entry;
+#endif
+ const char *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+#if defined(DUK_USE_ASSERTIONS)
+ top_at_entry = duk_get_top(thr);
+#endif
+
+ idx = duk_require_normalize_index(thr, idx);
+ duk_bi_json_stringify_helper(thr,
+ idx /*idx_value*/,
+ DUK_INVALID_INDEX /*idx_replacer*/,
+ DUK_INVALID_INDEX /*idx_space*/,
+ 0 /*flags*/);
+ DUK_ASSERT(duk_is_string(thr, -1));
+ duk_replace(thr, idx);
+ ret = duk_get_string(thr, idx);
+
+ DUK_ASSERT(duk_get_top(thr) == top_at_entry);
+
+ return ret;
+}
+
+DUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t top_at_entry;
+#endif
+
+ DUK_ASSERT_API_ENTRY(thr);
+#if defined(DUK_USE_ASSERTIONS)
+ top_at_entry = duk_get_top(thr);
+#endif
+
+ idx = duk_require_normalize_index(thr, idx);
+ duk_bi_json_parse_helper(thr,
+ idx /*idx_value*/,
+ DUK_INVALID_INDEX /*idx_reviver*/,
+ 0 /*flags*/);
+ duk_replace(thr, idx);
+
+ DUK_ASSERT(duk_get_top(thr) == top_at_entry);
+}
+#else /* DUK_USE_JSON_SUPPORT */
+DUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(idx);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+
+DUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(idx);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+#endif /* DUK_USE_JSON_SUPPORT */
+#line 1 "duk_api_compile.c"
+/*
+ * Compilation and evaluation
+ */
+
+/* #include duk_internal.h -> already included */
+
+typedef struct duk__compile_raw_args duk__compile_raw_args;
+struct duk__compile_raw_args {
+ duk_size_t src_length; /* should be first on 64-bit platforms */
+ const duk_uint8_t *src_buffer;
+ duk_uint_t flags;
+};
+
+/* Eval is just a wrapper now. */
+DUK_EXTERNAL duk_int_t duk_eval_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) {
+ duk_int_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Note: strictness is *not* inherited from the current Duktape/C.
+ * This would be confusing because the current strictness state
+ * depends on whether we're running inside a Duktape/C activation
+ * (= strict mode) or outside of any activation (= non-strict mode).
+ * See tests/api/test-eval-strictness.c for more discussion.
+ */
+
+ /* [ ... source? filename? ] (depends on flags) */
+
+ rc = duk_compile_raw(thr, src_buffer, src_length, flags | DUK_COMPILE_EVAL); /* may be safe, or non-safe depending on flags */
+
+ /* [ ... closure/error ] */
+
+ if (rc != DUK_EXEC_SUCCESS) {
+ rc = DUK_EXEC_ERROR;
+ goto got_rc;
+ }
+
+ duk_push_global_object(thr); /* explicit 'this' binding, see GH-164 */
+
+ if (flags & DUK_COMPILE_SAFE) {
+ rc = duk_pcall_method(thr, 0);
+ } else {
+ duk_call_method(thr, 0);
+ rc = DUK_EXEC_SUCCESS;
+ }
+
+ /* [ ... result/error ] */
+
+ got_rc:
+ if (flags & DUK_COMPILE_NORESULT) {
+ duk_pop(thr);
+ }
+
+ return rc;
+}
+
+/* Helper which can be called both directly and with duk_safe_call(). */
+DUK_LOCAL duk_ret_t duk__do_compile(duk_hthread *thr, void *udata) {
+ duk__compile_raw_args *comp_args;
+ duk_uint_t flags;
+ duk_hcompfunc *h_templ;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(udata != NULL);
+
+ /* Note: strictness is not inherited from the current Duktape/C
+ * context. Otherwise it would not be possible to compile
+ * non-strict code inside a Duktape/C activation (which is
+ * always strict now). See tests/api/test-eval-strictness.c
+ * for discussion.
+ */
+
+ /* [ ... source? filename? ] (depends on flags) */
+
+ comp_args = (duk__compile_raw_args *) udata;
+ flags = comp_args->flags;
+
+ if (flags & DUK_COMPILE_NOFILENAME) {
+ /* Automatic filename: 'eval' or 'input'. */
+ duk_push_hstring_stridx(thr, (flags & DUK_COMPILE_EVAL) ? DUK_STRIDX_EVAL : DUK_STRIDX_INPUT);
+ }
+
+ /* [ ... source? filename ] */
+
+ if (!comp_args->src_buffer) {
+ duk_hstring *h_sourcecode;
+
+ h_sourcecode = duk_get_hstring(thr, -2);
+ if ((flags & DUK_COMPILE_NOSOURCE) || /* args incorrect */
+ (h_sourcecode == NULL)) { /* e.g. duk_push_string_file_raw() pushed undefined */
+ DUK_ERROR_TYPE(thr, DUK_STR_NO_SOURCECODE);
+ }
+ DUK_ASSERT(h_sourcecode != NULL);
+ comp_args->src_buffer = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode);
+ comp_args->src_length = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode);
+ }
+ DUK_ASSERT(comp_args->src_buffer != NULL);
+
+ if (flags & DUK_COMPILE_FUNCTION) {
+ flags |= DUK_COMPILE_EVAL | DUK_COMPILE_FUNCEXPR;
+ }
+
+ /* [ ... source? filename ] */
+
+ duk_js_compile(thr, comp_args->src_buffer, comp_args->src_length, flags);
+
+ /* [ ... source? func_template ] */
+
+ if (flags & DUK_COMPILE_NOSOURCE) {
+ ;
+ } else {
+ duk_remove_m2(thr);
+ }
+
+ /* [ ... func_template ] */
+
+ h_templ = (duk_hcompfunc *) duk_known_hobject(thr, -1);
+ duk_js_push_closure(thr,
+ h_templ,
+ thr->builtins[DUK_BIDX_GLOBAL_ENV],
+ thr->builtins[DUK_BIDX_GLOBAL_ENV],
+ 1 /*add_auto_proto*/);
+ duk_remove_m2(thr); /* -> [ ... closure ] */
+
+ /* [ ... closure ] */
+
+ return 1;
+}
+
+DUK_EXTERNAL duk_int_t duk_compile_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) {
+ duk__compile_raw_args comp_args_alloc;
+ duk__compile_raw_args *comp_args = &comp_args_alloc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if ((flags & DUK_COMPILE_STRLEN) && (src_buffer != NULL)) {
+ /* String length is computed here to avoid multiple evaluation
+ * of a macro argument in the calling side.
+ */
+ src_length = DUK_STRLEN(src_buffer);
+ }
+
+ comp_args->src_buffer = (const duk_uint8_t *) src_buffer;
+ comp_args->src_length = src_length;
+ comp_args->flags = flags;
+
+ /* [ ... source? filename? ] (depends on flags) */
+
+ if (flags & DUK_COMPILE_SAFE) {
+ duk_int_t rc;
+ duk_int_t nargs;
+ duk_int_t nrets = 1;
+
+ /* Arguments can be: [ source? filename? &comp_args] so that
+ * nargs is 1 to 3. Call site encodes the correct nargs count
+ * directly into flags.
+ */
+ nargs = flags & 0x07;
+ DUK_ASSERT(nargs == ((flags & DUK_COMPILE_NOSOURCE) ? 0 : 1) +
+ ((flags & DUK_COMPILE_NOFILENAME) ? 0 : 1));
+ rc = duk_safe_call(thr, duk__do_compile, (void *) comp_args, nargs, nrets);
+
+ /* [ ... closure ] */
+ return rc;
+ }
+
+ (void) duk__do_compile(thr, (void *) comp_args);
+
+ /* [ ... closure ] */
+ return DUK_EXEC_SUCCESS;
+}
+#line 1 "duk_api_debug.c"
+/*
+ * Debugging related API calls
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_JSON_SUPPORT)
+DUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) {
+ duk_idx_t idx;
+ duk_idx_t top;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* We don't duk_require_stack() here now, but rely on the caller having
+ * enough space.
+ */
+
+ top = duk_get_top(thr);
+ duk_push_array(thr);
+ for (idx = 0; idx < top; idx++) {
+ duk_dup(thr, idx);
+ duk_put_prop_index(thr, -2, (duk_uarridx_t) idx);
+ }
+
+ /* XXX: conversion errors should not propagate outwards.
+ * Perhaps values need to be coerced individually?
+ */
+ duk_bi_json_stringify_helper(thr,
+ duk_get_top_index(thr), /*idx_value*/
+ DUK_INVALID_INDEX, /*idx_replacer*/
+ DUK_INVALID_INDEX, /*idx_space*/
+ DUK_JSON_FLAG_EXT_CUSTOM |
+ DUK_JSON_FLAG_ASCII_ONLY |
+ DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/);
+
+ duk_push_sprintf(thr, "ctx: top=%ld, stack=%s", (long) top, (const char *) duk_safe_to_string(thr, -1));
+ duk_replace(thr, -3); /* [ ... arr jsonx(arr) res ] -> [ ... res jsonx(arr) ] */
+ duk_pop(thr);
+ DUK_ASSERT(duk_is_string(thr, -1));
+}
+#else /* DUK_USE_JSON_SUPPORT */
+DUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+#endif /* DUK_USE_JSON_SUPPORT */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+
+DUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr,
+ duk_debug_read_function read_cb,
+ duk_debug_write_function write_cb,
+ duk_debug_peek_function peek_cb,
+ duk_debug_read_flush_function read_flush_cb,
+ duk_debug_write_flush_function write_flush_cb,
+ duk_debug_request_function request_cb,
+ duk_debug_detached_function detached_cb,
+ void *udata) {
+ duk_heap *heap;
+ const char *str;
+ duk_size_t len;
+
+ /* XXX: should there be an error or an automatic detach if
+ * already attached?
+ */
+
+ DUK_D(DUK_DPRINT("application called duk_debugger_attach()"));
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(read_cb != NULL);
+ DUK_ASSERT(write_cb != NULL);
+ /* Other callbacks are optional. */
+
+ heap = thr->heap;
+ heap->dbg_read_cb = read_cb;
+ heap->dbg_write_cb = write_cb;
+ heap->dbg_peek_cb = peek_cb;
+ heap->dbg_read_flush_cb = read_flush_cb;
+ heap->dbg_write_flush_cb = write_flush_cb;
+ heap->dbg_request_cb = request_cb;
+ heap->dbg_detached_cb = detached_cb;
+ heap->dbg_udata = udata;
+ heap->dbg_have_next_byte = 0;
+
+ /* Start in paused state. */
+ heap->dbg_processing = 0;
+ heap->dbg_state_dirty = 0;
+ heap->dbg_force_restart = 0;
+ heap->dbg_pause_flags = 0;
+ heap->dbg_pause_act = NULL;
+ heap->dbg_pause_startline = 0;
+ heap->dbg_exec_counter = 0;
+ heap->dbg_last_counter = 0;
+ heap->dbg_last_time = 0.0;
+ duk_debug_set_paused(heap); /* XXX: overlap with fields above */
+
+ /* Send version identification and flush right afterwards. Note that
+ * we must write raw, unframed bytes here.
+ */
+ duk_push_sprintf(thr, "%ld %ld %s %s\n",
+ (long) DUK_DEBUG_PROTOCOL_VERSION,
+ (long) DUK_VERSION,
+ (const char *) DUK_GIT_DESCRIBE,
+ (const char *) DUK_USE_TARGET_INFO);
+ str = duk_get_lstring(thr, -1, &len);
+ DUK_ASSERT(str != NULL);
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) str, len);
+ duk_debug_write_flush(thr);
+ duk_pop(thr);
+}
+
+DUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) {
+ DUK_D(DUK_DPRINT("application called duk_debugger_detach()"));
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->heap != NULL);
+
+ /* Can be called multiple times with no harm. */
+ duk_debug_do_detach(thr->heap);
+}
+
+DUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) {
+ duk_bool_t processed_messages;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->heap != NULL);
+
+ if (!duk_debug_is_attached(thr->heap)) {
+ return;
+ }
+ if (thr->callstack_curr != NULL || thr->heap->dbg_processing) {
+ /* Calling duk_debugger_cooperate() while Duktape is being
+ * called into is not supported. This is not a 100% check
+ * but prevents any damage in most cases.
+ */
+ return;
+ }
+
+ processed_messages = duk_debug_process_messages(thr, 1 /*no_block*/);
+ DUK_UNREF(processed_messages);
+}
+
+DUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) {
+ duk_idx_t top;
+ duk_idx_t idx;
+ duk_bool_t ret = 0;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->heap != NULL);
+
+ DUK_D(DUK_DPRINT("application called duk_debugger_notify() with nvalues=%ld", (long) nvalues));
+
+ top = duk_get_top(thr);
+ if (top < nvalues) {
+ DUK_ERROR_RANGE(thr, "not enough stack values for notify");
+ return ret; /* unreachable */
+ }
+ if (duk_debug_is_attached(thr->heap)) {
+ duk_debug_write_notify(thr, DUK_DBG_CMD_APPNOTIFY);
+ for (idx = top - nvalues; idx < top; idx++) {
+ duk_tval *tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ duk_debug_write_tval(thr, tv);
+ }
+ duk_debug_write_eom(thr);
+
+ /* Return non-zero (true) if we have a good reason to believe
+ * the notify was delivered; if we're still attached at least
+ * a transport error was not indicated by the transport write
+ * callback. This is not a 100% guarantee of course.
+ */
+ if (duk_debug_is_attached(thr->heap)) {
+ ret = 1;
+ }
+ }
+ duk_pop_n(thr, nvalues);
+ return ret;
+}
+
+DUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->heap != NULL);
+
+ DUK_D(DUK_DPRINT("application called duk_debugger_pause()"));
+
+ /* Treat like a debugger statement: ignore when not attached. */
+ if (duk_debug_is_attached(thr->heap)) {
+ if (duk_debug_is_paused(thr->heap)) {
+ DUK_D(DUK_DPRINT("duk_debugger_pause() called when already paused; ignoring"));
+ } else {
+ duk_debug_set_paused(thr->heap);
+
+ /* Pause on the next opcode executed. This is always safe to do even
+ * inside the debugger message loop: the interrupt counter will be reset
+ * to its proper value when the message loop exits.
+ */
+ thr->interrupt_init = 1;
+ thr->interrupt_counter = 0;
+ }
+ }
+}
+
+#else /* DUK_USE_DEBUGGER_SUPPORT */
+
+DUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr,
+ duk_debug_read_function read_cb,
+ duk_debug_write_function write_cb,
+ duk_debug_peek_function peek_cb,
+ duk_debug_read_flush_function read_flush_cb,
+ duk_debug_write_flush_function write_flush_cb,
+ duk_debug_request_function request_cb,
+ duk_debug_detached_function detached_cb,
+ void *udata) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(read_cb);
+ DUK_UNREF(write_cb);
+ DUK_UNREF(peek_cb);
+ DUK_UNREF(read_flush_cb);
+ DUK_UNREF(write_flush_cb);
+ DUK_UNREF(request_cb);
+ DUK_UNREF(detached_cb);
+ DUK_UNREF(udata);
+ DUK_ERROR_TYPE(thr, "no debugger support");
+}
+
+DUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ERROR_TYPE(thr, "no debugger support");
+}
+
+DUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) {
+ /* nop */
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(thr);
+}
+
+DUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) {
+ duk_idx_t top;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ top = duk_get_top(thr);
+ if (top < nvalues) {
+ DUK_ERROR_RANGE_INVALID_COUNT(thr);
+ return 0; /* unreachable */
+ }
+
+ /* No debugger support, just pop values. */
+ duk_pop_n(thr, nvalues);
+ return 0;
+}
+
+DUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) {
+ /* Treat like debugger statement: nop */
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(thr);
+}
+
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+#line 1 "duk_api_heap.c"
+/*
+ * Heap creation and destruction
+ */
+
+/* #include duk_internal.h -> already included */
+
+typedef struct duk_internal_thread_state duk_internal_thread_state;
+
+struct duk_internal_thread_state {
+ duk_ljstate lj;
+ duk_bool_t creating_error;
+ duk_hthread *curr_thread;
+ duk_int_t call_recursion_depth;
+};
+
+DUK_EXTERNAL duk_hthread *duk_create_heap(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *heap_udata,
+ duk_fatal_function fatal_handler) {
+ duk_heap *heap = NULL;
+ duk_hthread *thr;
+
+ /* Assume that either all memory funcs are NULL or non-NULL, mixed
+ * cases will now be unsafe.
+ */
+
+ /* XXX: just assert non-NULL values here and make caller arguments
+ * do the defaulting to the default implementations (smaller code)?
+ */
+
+ if (!alloc_func) {
+ DUK_ASSERT(realloc_func == NULL);
+ DUK_ASSERT(free_func == NULL);
+#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)
+ alloc_func = duk_default_alloc_function;
+ realloc_func = duk_default_realloc_function;
+ free_func = duk_default_free_function;
+#else
+ DUK_D(DUK_DPRINT("no allocation functions given and no default providers"));
+ return NULL;
+#endif
+ } else {
+ DUK_ASSERT(realloc_func != NULL);
+ DUK_ASSERT(free_func != NULL);
+ }
+
+ if (!fatal_handler) {
+ fatal_handler = duk_default_fatal_handler;
+ }
+
+ DUK_ASSERT(alloc_func != NULL);
+ DUK_ASSERT(realloc_func != NULL);
+ DUK_ASSERT(free_func != NULL);
+ DUK_ASSERT(fatal_handler != NULL);
+
+ heap = duk_heap_alloc(alloc_func, realloc_func, free_func, heap_udata, fatal_handler);
+ if (!heap) {
+ return NULL;
+ }
+ thr = heap->heap_thread;
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ return thr;
+}
+
+DUK_EXTERNAL void duk_destroy_heap(duk_hthread *thr) {
+ duk_heap *heap;
+
+ if (!thr) {
+ return;
+ }
+ DUK_ASSERT_API_ENTRY(thr);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ duk_heap_free(heap);
+}
+
+DUK_EXTERNAL void duk_suspend(duk_hthread *thr, duk_thread_state *state) {
+ duk_internal_thread_state *snapshot = (duk_internal_thread_state *) (void *) state;
+ duk_heap *heap;
+ duk_ljstate *lj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(state != NULL); /* unvalidated */
+
+ /* Currently not supported when called from within a finalizer.
+ * If that is done, the finalizer will remain running indefinitely,
+ * preventing other finalizers from executing. The assert is a bit
+ * wider, checking that it would be OK to run pending finalizers.
+ */
+ DUK_ASSERT(thr->heap->pf_prevent_count == 0);
+
+ /* Currently not supported to duk_suspend() from an errCreate()
+ * call.
+ */
+ DUK_ASSERT(thr->heap->creating_error == 0);
+
+ heap = thr->heap;
+ lj = &heap->lj;
+
+ duk_push_tval(thr, &lj->value1);
+ duk_push_tval(thr, &lj->value2);
+
+ /* XXX: creating_error == 0 is asserted above, so no need to store. */
+ DUK_MEMCPY((void *) &snapshot->lj, (const void *) lj, sizeof(duk_ljstate));
+ snapshot->creating_error = heap->creating_error;
+ snapshot->curr_thread = heap->curr_thread;
+ snapshot->call_recursion_depth = heap->call_recursion_depth;
+
+ lj->jmpbuf_ptr = NULL;
+ lj->type = DUK_LJ_TYPE_UNKNOWN;
+ DUK_TVAL_SET_UNDEFINED(&lj->value1);
+ DUK_TVAL_SET_UNDEFINED(&lj->value2);
+ heap->creating_error = 0;
+ heap->curr_thread = NULL;
+ heap->call_recursion_depth = 0;
+}
+
+DUK_EXTERNAL void duk_resume(duk_hthread *thr, const duk_thread_state *state) {
+ const duk_internal_thread_state *snapshot = (const duk_internal_thread_state *) (const void *) state;
+ duk_heap *heap;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(state != NULL); /* unvalidated */
+
+ /* Shouldn't be necessary if duk_suspend() is called before
+ * duk_resume(), but assert in case API sequence is incorrect.
+ */
+ DUK_ASSERT(thr->heap->pf_prevent_count == 0);
+ DUK_ASSERT(thr->heap->creating_error == 0);
+
+ heap = thr->heap;
+
+ DUK_MEMCPY((void *) &heap->lj, (const void *) &snapshot->lj, sizeof(duk_ljstate));
+ heap->creating_error = snapshot->creating_error;
+ heap->curr_thread = snapshot->curr_thread;
+ heap->call_recursion_depth = snapshot->call_recursion_depth;
+
+ duk_pop_2(thr);
+}
+
+/* XXX: better place for this */
+DUK_EXTERNAL void duk_set_global_object(duk_hthread *thr) {
+ duk_hobject *h_glob;
+ duk_hobject *h_prev_glob;
+ duk_hobjenv *h_env;
+ duk_hobject *h_prev_env;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_D(DUK_DPRINT("replace global object with: %!T", duk_get_tval(thr, -1)));
+
+ h_glob = duk_require_hobject(thr, -1);
+ DUK_ASSERT(h_glob != NULL);
+
+ /*
+ * Replace global object.
+ */
+
+ h_prev_glob = thr->builtins[DUK_BIDX_GLOBAL];
+ DUK_UNREF(h_prev_glob);
+ thr->builtins[DUK_BIDX_GLOBAL] = h_glob;
+ DUK_HOBJECT_INCREF(thr, h_glob);
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_glob); /* side effects, in theory (referenced by global env) */
+
+ /*
+ * Replace lexical environment for global scope
+ *
+ * Create a new object environment for the global lexical scope.
+ * We can't just reset the _Target property of the current one,
+ * because the lexical scope is shared by other threads with the
+ * same (initial) built-ins.
+ */
+
+ h_env = duk_hobjenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));
+ DUK_ASSERT(h_env != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_env) == NULL);
+
+ DUK_ASSERT(h_env->target == NULL);
+ DUK_ASSERT(h_glob != NULL);
+ h_env->target = h_glob;
+ DUK_HOBJECT_INCREF(thr, h_glob);
+ DUK_ASSERT(h_env->has_this == 0);
+
+ /* [ ... new_glob ] */
+
+ h_prev_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ thr->builtins[DUK_BIDX_GLOBAL_ENV] = (duk_hobject *) h_env;
+ DUK_HOBJECT_INCREF(thr, (duk_hobject *) h_env);
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_env); /* side effects */
+ DUK_UNREF(h_env); /* without refcounts */
+ DUK_UNREF(h_prev_env);
+
+ /* [ ... new_glob ] */
+
+ duk_pop(thr);
+
+ /* [ ... ] */
+}
+#line 1 "duk_api_inspect.c"
+/*
+ * Inspection
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* For footprint efficient multiple value setting: arrays are much better than
+ * varargs, format string with parsing is often better than string pointer arrays.
+ */
+DUK_LOCAL void duk__inspect_multiple_uint(duk_hthread *thr, const char *fmt, duk_int_t *vals) {
+ duk_int_t val;
+ const char *p;
+ const char *p_curr;
+ duk_size_t len;
+
+ for (p = fmt;;) {
+ len = DUK_STRLEN(p);
+ p_curr = p;
+ p += len + 1;
+ if (len == 0) {
+ /* Double NUL (= empty key) terminates. */
+ break;
+ }
+ val = *vals++;
+ if (val >= 0) {
+ /* Negative values are markers to skip key. */
+ duk_push_string(thr, p_curr);
+ duk_push_int(thr, val);
+ duk_put_prop(thr, -3);
+ }
+ }
+}
+
+/* Raw helper to extract internal information / statistics about a value.
+ * The return value is an object with properties that are version specific.
+ * The properties must not expose anything that would lead to security
+ * issues (e.g. exposing compiled function 'data' buffer might be an issue).
+ * Currently only counts and sizes and such are given so there shouldn't
+ * be security implications.
+ */
+
+#define DUK__IDX_TYPE 0
+#define DUK__IDX_ITAG 1
+#define DUK__IDX_REFC 2
+#define DUK__IDX_HBYTES 3
+#define DUK__IDX_CLASS 4
+#define DUK__IDX_PBYTES 5
+#define DUK__IDX_ESIZE 6
+#define DUK__IDX_ENEXT 7
+#define DUK__IDX_ASIZE 8
+#define DUK__IDX_HSIZE 9
+#define DUK__IDX_BCBYTES 10
+#define DUK__IDX_DBYTES 11
+#define DUK__IDX_TSTATE 12
+#define DUK__IDX_VARIANT 13
+
+DUK_EXTERNAL void duk_inspect_value(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_heaphdr *h;
+ /* The temporary values should be in an array rather than individual
+ * variables which (in practice) ensures that the compiler won't map
+ * them to registers and emit a lot of unnecessary shuffling code.
+ */
+ duk_int_t vals[14];
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Assume two's complement and set everything to -1. */
+ DUK_MEMSET((void *) &vals, (int) 0xff, sizeof(vals));
+ DUK_ASSERT(vals[DUK__IDX_TYPE] == -1); /* spot check one */
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ h = (DUK_TVAL_IS_HEAP_ALLOCATED(tv) ? DUK_TVAL_GET_HEAPHDR(tv) : NULL);
+
+ vals[DUK__IDX_TYPE] = duk_get_type_tval(tv);
+ vals[DUK__IDX_ITAG] = (duk_int_t) DUK_TVAL_GET_TAG(tv);
+
+ duk_push_bare_object(thr); /* Invalidates 'tv'. */
+ tv = NULL;
+
+ if (h == NULL) {
+ goto finish;
+ }
+ duk_push_pointer(thr, (void *) h);
+ duk_put_prop_string(thr, -2, "hptr");
+
+#if 0
+ /* Covers a lot of information, e.g. buffer and string variants. */
+ duk_push_uint(thr, (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h));
+ duk_put_prop_string(thr, -2, "hflags");
+#endif
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ vals[DUK__IDX_REFC] = (duk_int_t) DUK_HEAPHDR_GET_REFCOUNT(h);
+#endif
+ vals[DUK__IDX_VARIANT] = 0;
+
+ /* Heaphdr size and additional allocation size, followed by
+ * type specific stuff (with varying value count).
+ */
+ switch ((duk_small_int_t) DUK_HEAPHDR_GET_TYPE(h)) {
+ case DUK_HTYPE_STRING: {
+ duk_hstring *h_str = (duk_hstring *) h;
+ vals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hstring) + DUK_HSTRING_GET_BYTELEN(h_str) + 1);
+#if defined(DUK_USE_HSTRING_EXTDATA)
+ if (DUK_HSTRING_HAS_EXTDATA(h_str)) {
+ vals[DUK__IDX_VARIANT] = 1;
+ }
+#endif
+ break;
+ }
+ case DUK_HTYPE_OBJECT: {
+ duk_hobject *h_obj = (duk_hobject *) h;
+
+ /* XXX: variants here are maybe pointless; class is enough? */
+ if (DUK_HOBJECT_IS_ARRAY(h_obj)) {
+ vals[DUK__IDX_HBYTES] = sizeof(duk_harray);
+ } else if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) {
+ vals[DUK__IDX_HBYTES] = sizeof(duk_hcompfunc);
+ } else if (DUK_HOBJECT_IS_NATFUNC(h_obj)) {
+ vals[DUK__IDX_HBYTES] = sizeof(duk_hnatfunc);
+ } else if (DUK_HOBJECT_IS_THREAD(h_obj)) {
+ vals[DUK__IDX_HBYTES] = sizeof(duk_hthread);
+ vals[DUK__IDX_TSTATE] = ((duk_hthread *) h_obj)->state;
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ } else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {
+ vals[DUK__IDX_HBYTES] = sizeof(duk_hbufobj);
+ /* XXX: some size information */
+#endif
+ } else {
+ vals[DUK__IDX_HBYTES] = (duk_small_uint_t) sizeof(duk_hobject);
+ }
+
+ vals[DUK__IDX_CLASS] = (duk_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h_obj);
+ vals[DUK__IDX_PBYTES] = (duk_int_t) DUK_HOBJECT_P_ALLOC_SIZE(h_obj),
+ vals[DUK__IDX_ESIZE] = (duk_int_t) DUK_HOBJECT_GET_ESIZE(h_obj);
+ vals[DUK__IDX_ENEXT] = (duk_int_t) DUK_HOBJECT_GET_ENEXT(h_obj);
+ vals[DUK__IDX_ASIZE] = (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj);
+ vals[DUK__IDX_HSIZE] = (duk_int_t) DUK_HOBJECT_GET_HSIZE(h_obj);
+
+ /* Note: e_next indicates the number of gc-reachable entries
+ * in the entry part, and also indicates the index where the
+ * next new property would be inserted. It does *not* indicate
+ * the number of non-NULL keys present in the object. That
+ * value could be counted separately but requires a pass through
+ * the key list.
+ */
+
+ if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) {
+ duk_hbuffer *h_data = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, (duk_hcompfunc *) h_obj);
+ vals[DUK__IDX_BCBYTES] = (duk_int_t) (h_data ? DUK_HBUFFER_GET_SIZE(h_data) : 0);
+ }
+ break;
+ }
+ case DUK_HTYPE_BUFFER: {
+ duk_hbuffer *h_buf = (duk_hbuffer *) h;
+
+ if (DUK_HBUFFER_HAS_DYNAMIC(h_buf)) {
+ if (DUK_HBUFFER_HAS_EXTERNAL(h_buf)) {
+ vals[DUK__IDX_VARIANT] = 2; /* buffer variant 2: external */
+ vals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_external));
+ } else {
+ /* When alloc_size == 0 the second allocation may not
+ * actually exist.
+ */
+ vals[DUK__IDX_VARIANT] = 1; /* buffer variant 1: dynamic */
+ vals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_dynamic));
+ }
+ vals[DUK__IDX_DBYTES] = (duk_int_t) (DUK_HBUFFER_GET_SIZE(h_buf));
+ } else {
+ DUK_ASSERT(vals[DUK__IDX_VARIANT] == 0); /* buffer variant 0: fixed */
+ vals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hbuffer_fixed) + DUK_HBUFFER_GET_SIZE(h_buf));
+ }
+ break;
+ }
+ }
+
+ finish:
+ duk__inspect_multiple_uint(thr,
+ "type" "\x00" "itag" "\x00" "refc" "\x00" "hbytes" "\x00" "class" "\x00"
+ "pbytes" "\x00" "esize" "\x00" "enext" "\x00" "asize" "\x00" "hsize" "\x00"
+ "bcbytes" "\x00" "dbytes" "\x00" "tstate" "\x00" "variant" "\x00" "\x00",
+ (duk_int_t *) &vals);
+}
+
+DUK_EXTERNAL void duk_inspect_callstack_entry(duk_hthread *thr, duk_int_t level) {
+ duk_activation *act;
+ duk_uint_fast32_t pc;
+ duk_uint_fast32_t line;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* -1 = top callstack entry
+ * -2 = caller of level -1
+ * etc
+ */
+ act = duk_hthread_get_activation_for_level(thr, level);
+ if (act == NULL) {
+ duk_push_undefined(thr);
+ return;
+ }
+ duk_push_bare_object(thr);
+
+ /* Relevant PC is just before current one because PC is
+ * post-incremented. This should match what error augment
+ * code does.
+ */
+ pc = duk_hthread_get_act_prev_pc(thr, act);
+
+ duk_push_tval(thr, &act->tv_func);
+
+ duk_push_uint(thr, (duk_uint_t) pc);
+ duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_PC);
+
+#if defined(DUK_USE_PC2LINE)
+ line = duk_hobject_pc2line_query(thr, -1, pc);
+#else
+ line = 0;
+#endif
+ duk_push_uint(thr, (duk_uint_t) line);
+ duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_LINE_NUMBER);
+
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_LC_FUNCTION);
+ /* Providing access to e.g. act->lex_env would be dangerous: these
+ * internal structures must never be accessible to the application.
+ * Duktape relies on them having consistent data, and this consistency
+ * is only asserted for, not checked for.
+ */
+}
+
+/* automatic undefs */
+#undef DUK__IDX_ASIZE
+#undef DUK__IDX_BCBYTES
+#undef DUK__IDX_CLASS
+#undef DUK__IDX_DBYTES
+#undef DUK__IDX_ENEXT
+#undef DUK__IDX_ESIZE
+#undef DUK__IDX_HBYTES
+#undef DUK__IDX_HSIZE
+#undef DUK__IDX_ITAG
+#undef DUK__IDX_PBYTES
+#undef DUK__IDX_REFC
+#undef DUK__IDX_TSTATE
+#undef DUK__IDX_TYPE
+#undef DUK__IDX_VARIANT
+#line 1 "duk_api_memory.c"
+/*
+ * Memory calls.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_EXTERNAL void *duk_alloc_raw(duk_hthread *thr, duk_size_t size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return DUK_ALLOC_RAW(thr->heap, size);
+}
+
+DUK_EXTERNAL void duk_free_raw(duk_hthread *thr, void *ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_FREE_RAW(thr->heap, ptr);
+}
+
+DUK_EXTERNAL void *duk_realloc_raw(duk_hthread *thr, void *ptr, duk_size_t size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return DUK_REALLOC_RAW(thr->heap, ptr, size);
+}
+
+DUK_EXTERNAL void *duk_alloc(duk_hthread *thr, duk_size_t size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return DUK_ALLOC(thr->heap, size);
+}
+
+DUK_EXTERNAL void duk_free(duk_hthread *thr, void *ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_FREE_CHECKED(thr, ptr);
+}
+
+DUK_EXTERNAL void *duk_realloc(duk_hthread *thr, void *ptr, duk_size_t size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /*
+ * Note: since this is an exposed API call, there should be
+ * no way a mark-and-sweep could have a side effect on the
+ * memory allocation behind 'ptr'; the pointer should never
+ * be something that Duktape wants to change.
+ *
+ * Thus, no need to use DUK_REALLOC_INDIRECT (and we don't
+ * have the storage location here anyway).
+ */
+
+ return DUK_REALLOC(thr->heap, ptr, size);
+}
+
+DUK_EXTERNAL void duk_get_memory_functions(duk_hthread *thr, duk_memory_functions *out_funcs) {
+ duk_heap *heap;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(out_funcs != NULL);
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+
+ heap = thr->heap;
+ out_funcs->alloc_func = heap->alloc_func;
+ out_funcs->realloc_func = heap->realloc_func;
+ out_funcs->free_func = heap->free_func;
+ out_funcs->udata = heap->heap_udata;
+}
+
+DUK_EXTERNAL void duk_gc(duk_hthread *thr, duk_uint_t flags) {
+ duk_heap *heap;
+ duk_small_uint_t ms_flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ DUK_D(DUK_DPRINT("mark-and-sweep requested by application"));
+ DUK_ASSERT(DUK_GC_COMPACT == DUK_MS_FLAG_EMERGENCY); /* Compact flag is 1:1 with emergency flag which forces compaction. */
+ ms_flags = (duk_small_uint_t) flags;
+ duk_heap_mark_and_sweep(heap, ms_flags);
+}
+#line 1 "duk_api_object.c"
+/*
+ * Object handling: property access and other support functions.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Property handling
+ *
+ * The API exposes only the most common property handling functions.
+ * The caller can invoke Ecmascript built-ins for full control (e.g.
+ * defineProperty, getOwnPropertyDescriptor).
+ */
+
+DUK_EXTERNAL duk_bool_t duk_get_prop(duk_hthread *thr, duk_idx_t obj_idx) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_bool_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Note: copying tv_obj and tv_key to locals to shield against a valstack
+ * resize is not necessary for a property get right now.
+ */
+
+ tv_obj = duk_require_tval(thr, obj_idx);
+ tv_key = duk_require_tval(thr, -1);
+
+ rc = duk_hobject_getprop(thr, tv_obj, tv_key);
+ DUK_ASSERT(rc == 0 || rc == 1);
+ /* a value is left on stack regardless of rc */
+
+ duk_remove_m2(thr); /* remove key */
+ DUK_ASSERT(duk_is_undefined(thr, -1) || rc == 1);
+ return rc; /* 1 if property found, 0 otherwise */
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_string(thr, key);
+ return duk_get_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_lstring(thr, key, key_len);
+ return duk_get_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_uarridx(thr, arr_idx);
+ return duk_get_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */
+ return duk_get_prop(thr, obj_idx);
+}
+
+DUK_INTERNAL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));
+ return duk_get_prop(thr, obj_idx);
+}
+
+DUK_INTERNAL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {
+ return duk_get_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),
+ (duk_small_uint_t) (packed_args & 0xffffUL));
+}
+
+DUK_INTERNAL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop) {
+ duk_bool_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+
+ rc = duk_get_prop_stridx(thr, obj_idx, stridx);
+ if (out_has_prop) {
+ *out_has_prop = rc;
+ }
+ rc = duk_to_boolean(thr, -1);
+ DUK_ASSERT(rc == 0 || rc == 1);
+ duk_pop(thr);
+ return rc;
+}
+
+DUK_LOCAL duk_bool_t duk__put_prop_shared(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t idx_key) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_tval *tv_val;
+ duk_bool_t throw_flag;
+ duk_bool_t rc;
+
+ /* Note: copying tv_obj and tv_key to locals to shield against a valstack
+ * resize is not necessary for a property put right now (putprop protects
+ * against it internally).
+ */
+
+ /* Key and value indices are either (-2, -1) or (-1, -2). Given idx_key,
+ * idx_val is always (idx_key ^ 0x01).
+ */
+ DUK_ASSERT((idx_key == -2 && (idx_key ^ 1) == -1) ||
+ (idx_key == -1 && (idx_key ^ 1) == -2));
+ /* XXX: Direct access; faster validation. */
+ tv_obj = duk_require_tval(thr, obj_idx);
+ tv_key = duk_require_tval(thr, idx_key);
+ tv_val = duk_require_tval(thr, idx_key ^ 1);
+ throw_flag = duk_is_strict_call(thr);
+
+ rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, throw_flag);
+ DUK_ASSERT(rc == 0 || rc == 1);
+
+ duk_pop_2(thr); /* remove key and value */
+ return rc; /* 1 if property found, 0 otherwise */
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_prop(duk_hthread *thr, duk_idx_t obj_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__put_prop_shared(thr, obj_idx, -2);
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ /* Careful here and with other duk_put_prop_xxx() helpers: the
+ * target object and the property value may be in the same value
+ * stack slot (unusual, but still conceptually clear).
+ */
+ obj_idx = duk_normalize_index(thr, obj_idx);
+ (void) duk_push_string(thr, key);
+ return duk__put_prop_shared(thr, obj_idx, -1);
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_normalize_index(thr, obj_idx);
+ (void) duk_push_lstring(thr, key, key_len);
+ return duk__put_prop_shared(thr, obj_idx, -1);
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_uarridx(thr, arr_idx);
+ return duk__put_prop_shared(thr, obj_idx, -1);
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */
+ return duk__put_prop_shared(thr, obj_idx, -1);
+}
+
+
+DUK_INTERNAL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));
+ return duk__put_prop_shared(thr, obj_idx, -1);
+}
+
+DUK_INTERNAL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {
+ return duk_put_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),
+ (duk_small_uint_t) (packed_args & 0xffffUL));
+}
+
+DUK_EXTERNAL duk_bool_t duk_del_prop(duk_hthread *thr, duk_idx_t obj_idx) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_bool_t throw_flag;
+ duk_bool_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Note: copying tv_obj and tv_key to locals to shield against a valstack
+ * resize is not necessary for a property delete right now.
+ */
+
+ tv_obj = duk_require_tval(thr, obj_idx);
+ tv_key = duk_require_tval(thr, -1);
+ throw_flag = duk_is_strict_call(thr);
+
+ rc = duk_hobject_delprop(thr, tv_obj, tv_key, throw_flag);
+ DUK_ASSERT(rc == 0 || rc == 1);
+
+ duk_pop(thr); /* remove key */
+ return rc;
+}
+
+DUK_EXTERNAL duk_bool_t duk_del_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_string(thr, key);
+ return duk_del_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_del_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_lstring(thr, key, key_len);
+ return duk_del_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_del_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_uarridx(thr, arr_idx);
+ return duk_del_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_del_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */
+ return duk_del_prop(thr, obj_idx);
+}
+
+DUK_INTERNAL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));
+ return duk_del_prop(thr, obj_idx);
+}
+
+#if 0
+DUK_INTERNAL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {
+ return duk_del_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),
+ (duk_small_uint_t) (packed_args & 0xffffUL));
+}
+#endif
+
+DUK_EXTERNAL duk_bool_t duk_has_prop(duk_hthread *thr, duk_idx_t obj_idx) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_bool_t rc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Note: copying tv_obj and tv_key to locals to shield against a valstack
+ * resize is not necessary for a property existence check right now.
+ */
+
+ tv_obj = duk_require_tval(thr, obj_idx);
+ tv_key = duk_require_tval(thr, -1);
+
+ rc = duk_hobject_hasprop(thr, tv_obj, tv_key);
+ DUK_ASSERT(rc == 0 || rc == 1);
+
+ duk_pop(thr); /* remove key */
+ return rc; /* 1 if property found, 0 otherwise */
+}
+
+DUK_EXTERNAL duk_bool_t duk_has_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_string(thr, key);
+ return duk_has_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_has_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(key != NULL);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_lstring(thr, key, key_len);
+ return duk_has_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_has_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_uarridx(thr, arr_idx);
+ return duk_has_prop(thr, obj_idx);
+}
+
+DUK_EXTERNAL duk_bool_t duk_has_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */
+ return duk_has_prop(thr, obj_idx);
+}
+
+DUK_INTERNAL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));
+ return duk_has_prop(thr, obj_idx);
+}
+
+#if 0
+DUK_INTERNAL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {
+ return duk_has_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),
+ (duk_small_uint_t) (packed_args & 0xffffUL));
+}
+#endif
+
+/* Define own property without inheritance lookups and such. This differs from
+ * [[DefineOwnProperty]] because special behaviors (like Array 'length') are
+ * not invoked by this method. The caller must be careful to invoke any such
+ * behaviors if necessary.
+ */
+DUK_INTERNAL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags) {
+ duk_hobject *obj;
+ duk_hstring *key;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_require_hobject(thr, obj_idx);
+ DUK_ASSERT(obj != NULL);
+ key = duk_to_property_key_hstring(thr, -2);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(duk_require_tval(thr, -1) != NULL);
+
+ duk_hobject_define_property_internal(thr, obj, key, desc_flags);
+
+ duk_pop(thr); /* pop key */
+}
+
+DUK_INTERNAL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags) {
+ duk_hobject *obj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_require_hobject(thr, obj_idx);
+ DUK_ASSERT(obj != NULL);
+
+ duk_hobject_define_property_internal_arridx(thr, obj, arr_idx, desc_flags);
+ /* value popped by call */
+}
+
+DUK_INTERNAL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags) {
+ duk_hobject *obj;
+ duk_hstring *key;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+
+ obj = duk_require_hobject(thr, obj_idx);
+ DUK_ASSERT(obj != NULL);
+ key = DUK_HTHREAD_GET_STRING(thr, stridx);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(duk_require_tval(thr, -1) != NULL);
+
+ duk_hobject_define_property_internal(thr, obj, key, desc_flags);
+ /* value popped by call */
+}
+
+DUK_INTERNAL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {
+ duk_xdef_prop_stridx(thr, (duk_idx_t) (duk_int8_t) (packed_args >> 24),
+ (duk_small_uint_t) (packed_args >> 8) & 0xffffUL,
+ (duk_small_uint_t) (packed_args & 0xffL));
+}
+
+#if 0 /*unused*/
+DUK_INTERNAL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags) {
+ duk_hobject *obj;
+ duk_hstring *key;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ DUK_ASSERT_BIDX_VALID(builtin_idx);
+
+ obj = duk_require_hobject(thr, obj_idx);
+ DUK_ASSERT(obj != NULL);
+ key = DUK_HTHREAD_GET_STRING(thr, stridx);
+ DUK_ASSERT(key != NULL);
+
+ duk_push_hobject(thr, thr->builtins[builtin_idx]);
+ duk_hobject_define_property_internal(thr, obj, key, desc_flags);
+ /* value popped by call */
+}
+#endif
+
+/* This is a rare property helper; it sets the global thrower (E5 Section 13.2.3)
+ * setter/getter into an object property. This is needed by the 'arguments'
+ * object creation code, function instance creation code, and Function.prototype.bind().
+ */
+
+DUK_INTERNAL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ duk_push_hstring_stridx(thr, stridx);
+ duk_push_hobject_bidx(thr, DUK_BIDX_TYPE_ERROR_THROWER);
+ duk_dup_top(thr);
+ duk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_SETTER | DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_FORCE); /* attributes always 0 */
+}
+
+/* Object.getOwnPropertyDescriptor() equivalent C binding. */
+DUK_EXTERNAL void duk_get_prop_desc(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(flags); /* no flags defined yet */
+
+ duk_hobject_object_get_own_property_descriptor(thr, obj_idx); /* [ ... key ] -> [ ... desc ] */
+}
+
+/* Object.defineProperty() equivalent C binding. */
+DUK_EXTERNAL void duk_def_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) {
+ duk_idx_t idx_base;
+ duk_hobject *obj;
+ duk_hstring *key;
+ duk_idx_t idx_value;
+ duk_hobject *get;
+ duk_hobject *set;
+ duk_uint_t is_data_desc;
+ duk_uint_t is_acc_desc;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_require_hobject(thr, obj_idx);
+
+ is_data_desc = flags & (DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE);
+ is_acc_desc = flags & (DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);
+ if (is_data_desc && is_acc_desc) {
+ /* "Have" flags must not be conflicting so that they would
+ * apply to both a plain property and an accessor at the same
+ * time.
+ */
+ goto fail_invalid_desc;
+ }
+
+ idx_base = duk_get_top_index(thr);
+ if (flags & DUK_DEFPROP_HAVE_SETTER) {
+ duk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_LIGHTFUNC);
+ set = duk_get_hobject_promote_lfunc(thr, idx_base);
+ if (set != NULL && !DUK_HOBJECT_IS_CALLABLE(set)) {
+ goto fail_not_callable;
+ }
+ idx_base--;
+ } else {
+ set = NULL;
+ }
+ if (flags & DUK_DEFPROP_HAVE_GETTER) {
+ duk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_LIGHTFUNC);
+ get = duk_get_hobject_promote_lfunc(thr, idx_base);
+ if (get != NULL && !DUK_HOBJECT_IS_CALLABLE(get)) {
+ goto fail_not_callable;
+ }
+ idx_base--;
+ } else {
+ get = NULL;
+ }
+ if (flags & DUK_DEFPROP_HAVE_VALUE) {
+ idx_value = idx_base;
+ idx_base--;
+ } else {
+ idx_value = (duk_idx_t) -1;
+ }
+ key = duk_to_property_key_hstring(thr, idx_base);
+ DUK_ASSERT(key != NULL);
+
+ duk_require_valid_index(thr, idx_base);
+
+ duk_hobject_define_property_helper(thr,
+ flags /*defprop_flags*/,
+ obj,
+ key,
+ idx_value,
+ get,
+ set,
+ 1 /*throw_flag*/);
+
+ /* Clean up stack */
+
+ duk_set_top(thr, idx_base);
+
+ /* [ ... obj ... ] */
+
+ return;
+
+ fail_invalid_desc:
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR);
+ return;
+
+ fail_not_callable:
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE);
+ return;
+}
+
+/*
+ * Object related
+ *
+ * Note: seal() and freeze() are accessible through Ecmascript bindings,
+ * and are not exposed through the API.
+ */
+
+DUK_EXTERNAL void duk_compact(duk_hthread *thr, duk_idx_t obj_idx) {
+ duk_hobject *obj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_get_hobject(thr, obj_idx);
+ if (obj) {
+ /* Note: this may fail, caller should protect the call if necessary */
+ duk_hobject_compact_props(thr, obj);
+ }
+}
+
+DUK_INTERNAL void duk_compact_m1(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_compact(thr, -1);
+}
+
+/* XXX: the duk_hobject_enum.c stack APIs should be reworked */
+
+DUK_EXTERNAL void duk_enum(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t enum_flags) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_dup(thr, obj_idx);
+ duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ duk_hobject_enumerator_create(thr, enum_flags); /* [target] -> [enum] */
+}
+
+DUK_EXTERNAL duk_bool_t duk_next(duk_hthread *thr, duk_idx_t enum_index, duk_bool_t get_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_require_hobject(thr, enum_index);
+ duk_dup(thr, enum_index);
+ return duk_hobject_enumerator_next(thr, get_value);
+}
+
+DUK_INTERNAL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze) {
+ duk_tval *tv;
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, obj_idx);
+ DUK_ASSERT(tv != NULL);
+
+ /* Seal/freeze are quite rare in practice so it'd be nice to get the
+ * correct behavior simply via automatic promotion (at the cost of some
+ * memory churn). However, the promoted objects don't behave the same,
+ * e.g. promoted lightfuncs are extensible.
+ */
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_BUFFER:
+ /* Plain buffer: already sealed, but not frozen (and can't be frozen
+ * because index properties can't be made non-writable.
+ */
+ if (is_freeze) {
+ goto fail_cannot_freeze;
+ }
+ break;
+ case DUK_TAG_LIGHTFUNC:
+ /* Lightfunc: already sealed and frozen, success. */
+ break;
+ case DUK_TAG_OBJECT:
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (is_freeze && DUK_HOBJECT_IS_BUFOBJ(h)) {
+ /* Buffer objects cannot be frozen because there's no internal
+ * support for making virtual array indices non-writable.
+ */
+ DUK_DD(DUK_DDPRINT("cannot freeze a buffer object"));
+ goto fail_cannot_freeze;
+ }
+ duk_hobject_object_seal_freeze_helper(thr, h, is_freeze);
+
+ /* Sealed and frozen objects cannot gain any more properties,
+ * so this is a good time to compact them.
+ */
+ duk_hobject_compact_props(thr, h);
+ break;
+ default:
+ /* ES2015 Sections 19.1.2.5, 19.1.2.17 */
+ break;
+ }
+ return;
+
+ fail_cannot_freeze:
+ DUK_ERROR_TYPE_INVALID_ARGS(thr); /* XXX: proper error message */
+}
+
+DUK_EXTERNAL void duk_seal(duk_hthread *thr, duk_idx_t obj_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_seal_freeze_raw(thr, obj_idx, 0 /*is_freeze*/);
+}
+
+DUK_EXTERNAL void duk_freeze(duk_hthread *thr, duk_idx_t obj_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_seal_freeze_raw(thr, obj_idx, 1 /*is_freeze*/);
+}
+
+/*
+ * Helpers for writing multiple properties
+ */
+
+DUK_EXTERNAL void duk_put_function_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_function_list_entry *funcs) {
+ const duk_function_list_entry *ent = funcs;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ if (ent != NULL) {
+ while (ent->key != NULL) {
+ duk_push_c_function(thr, ent->value, ent->nargs);
+ duk_put_prop_string(thr, obj_idx, ent->key);
+ ent++;
+ }
+ }
+}
+
+DUK_EXTERNAL void duk_put_number_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_number_list_entry *numbers) {
+ const duk_number_list_entry *ent = numbers;
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj_idx = duk_require_normalize_index(thr, obj_idx);
+ if (ent != NULL) {
+ while (ent->key != NULL) {
+ tv = thr->valstack_top++;
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); /* value stack init policy */
+ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv, ent->value); /* no need for decref/incref */
+ duk_put_prop_string(thr, obj_idx, ent->key);
+ ent++;
+ }
+ }
+}
+
+/*
+ * Shortcut for accessing global object properties
+ */
+
+DUK_EXTERNAL duk_bool_t duk_get_global_string(duk_hthread *thr, const char *key) {
+ duk_bool_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);
+
+ /* XXX: direct implementation */
+
+ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);
+ ret = duk_get_prop_string(thr, -1, key);
+ duk_remove_m2(thr);
+ return ret;
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) {
+ duk_bool_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);
+
+ /* XXX: direct implementation */
+
+ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);
+ ret = duk_get_prop_lstring(thr, -1, key, key_len);
+ duk_remove_m2(thr);
+ return ret;
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_global_string(duk_hthread *thr, const char *key) {
+ duk_bool_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);
+
+ /* XXX: direct implementation */
+
+ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);
+ duk_insert(thr, -2);
+ ret = duk_put_prop_string(thr, -2, key); /* [ ... global val ] -> [ ... global ] */
+ duk_pop(thr);
+ return ret;
+}
+
+DUK_EXTERNAL duk_bool_t duk_put_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) {
+ duk_bool_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);
+
+ /* XXX: direct implementation */
+
+ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);
+ duk_insert(thr, -2);
+ ret = duk_put_prop_lstring(thr, -2, key, key_len); /* [ ... global val ] -> [ ... global ] */
+ duk_pop(thr);
+ return ret;
+}
+
+/*
+ * Object prototype
+ */
+
+DUK_EXTERNAL void duk_get_prototype(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *obj;
+ duk_hobject *proto;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_require_hobject(thr, idx);
+ DUK_ASSERT(obj != NULL);
+
+ /* XXX: shared helper for duk_push_hobject_or_undefined()? */
+ proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, obj);
+ if (proto) {
+ duk_push_hobject(thr, proto);
+ } else {
+ duk_push_undefined(thr);
+ }
+}
+
+DUK_EXTERNAL void duk_set_prototype(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *obj;
+ duk_hobject *proto;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_require_hobject(thr, idx);
+ DUK_ASSERT(obj != NULL);
+ duk_require_type_mask(thr, -1, DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_OBJECT);
+ proto = duk_get_hobject(thr, -1);
+ /* proto can also be NULL here (allowed explicitly) */
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); /* XXX: "read only object"? */
+ return;
+ }
+#endif
+
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, obj, proto);
+
+ duk_pop(thr);
+}
+
+/*
+ * Object finalizer
+ */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+/* XXX: these could be implemented as macros calling an internal function
+ * directly.
+ * XXX: same issue as with Duktape.fin: there's no way to delete the property
+ * now (just set it to undefined).
+ */
+DUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_get_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER);
+}
+
+DUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+ duk_bool_t callable;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_require_hobject(thr, idx); /* Get before 'put' so that 'idx' is correct. */
+ callable = duk_is_callable(thr, -1);
+ duk_put_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER);
+
+ /* In addition to setting the finalizer property, keep a "have
+ * finalizer" flag in duk_hobject in sync so that refzero can do
+ * a very quick finalizer check by walking the prototype chain
+ * and checking the flag alone. (Note that this means that just
+ * setting _Finalizer on an object won't affect finalizer checks.)
+ *
+ * NOTE: if the argument is a Proxy object, this flag will be set
+ * on the Proxy, not the target. As a result, the target won't get
+ * a finalizer flag and the Proxy also won't be finalized as there's
+ * an explicit Proxy check in finalization now.
+ */
+ if (callable) {
+ DUK_HOBJECT_SET_HAVE_FINALIZER(h);
+ } else {
+ DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h);
+ }
+}
+#else /* DUK_USE_FINALIZER_SUPPORT */
+DUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(idx);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+
+DUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(idx);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+#line 1 "duk_api_stack.c"
+/*
+ * API calls related to general value stack manipulation: resizing the value
+ * stack, pushing and popping values, type checking and reading values,
+ * coercing values, etc.
+ *
+ * Also contains internal functions (such as duk_get_tval()), defined
+ * in duk_api_internal.h, with semantics similar to the public API.
+ */
+
+/* XXX: repetition of stack pre-checks -> helper or macro or inline */
+/* XXX: shared api error strings, and perhaps even throw code for rare cases? */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Forward declarations
+ */
+
+DUK_LOCAL_DECL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx);
+
+/*
+ * Global state for working around missing variadic macros
+ */
+
+#if !defined(DUK_USE_VARIADIC_MACROS)
+DUK_EXTERNAL const char *duk_api_global_filename = NULL;
+DUK_EXTERNAL duk_int_t duk_api_global_line = 0;
+#endif
+
+/*
+ * Misc helpers
+ */
+
+DUK_LOCAL const char * const duk__symbol_type_strings[4] = {
+ "hidden", "global", "local", "wellknown"
+};
+
+#if !defined(DUK_USE_PACKED_TVAL)
+DUK_LOCAL const duk_uint_t duk__type_from_tag[] = {
+ DUK_TYPE_NUMBER,
+ DUK_TYPE_NUMBER, /* fastint */
+ DUK_TYPE_UNDEFINED,
+ DUK_TYPE_NULL,
+ DUK_TYPE_BOOLEAN,
+ DUK_TYPE_POINTER,
+ DUK_TYPE_LIGHTFUNC,
+ DUK_TYPE_NONE,
+ DUK_TYPE_STRING,
+ DUK_TYPE_OBJECT,
+ DUK_TYPE_BUFFER,
+};
+DUK_LOCAL const duk_uint_t duk__type_mask_from_tag[] = {
+ DUK_TYPE_MASK_NUMBER,
+ DUK_TYPE_MASK_NUMBER, /* fastint */
+ DUK_TYPE_MASK_UNDEFINED,
+ DUK_TYPE_MASK_NULL,
+ DUK_TYPE_MASK_BOOLEAN,
+ DUK_TYPE_MASK_POINTER,
+ DUK_TYPE_MASK_LIGHTFUNC,
+ DUK_TYPE_MASK_NONE,
+ DUK_TYPE_MASK_STRING,
+ DUK_TYPE_MASK_OBJECT,
+ DUK_TYPE_MASK_BUFFER,
+};
+#endif /* !DUK_USE_PACKED_TVAL */
+
+/* Assert that there's room for one value. */
+#define DUK__ASSERT_SPACE() do { \
+ DUK_ASSERT(!(thr->valstack_top >= thr->valstack_end)); \
+ } while (0)
+
+/* Check that there's room to push one value. */
+#if defined(DUK_USE_VALSTACK_UNSAFE)
+/* Faster but value stack overruns are memory unsafe. */
+#define DUK__CHECK_SPACE() DUK__ASSERT_SPACE()
+#else
+#define DUK__CHECK_SPACE() do { \
+ if (DUK_UNLIKELY(thr->valstack_top >= thr->valstack_end)) { \
+ DUK_ERROR_RANGE_PUSH_BEYOND(thr); \
+ } \
+ } while (0)
+#endif
+
+DUK_LOCAL duk_small_uint_t duk__get_symbol_type(duk_hstring *h) {
+ const duk_uint8_t *data;
+ duk_size_t len;
+
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HSTRING_HAS_SYMBOL(h));
+ DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(h) >= 1); /* always true, symbol prefix */
+
+ data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);
+ len = DUK_HSTRING_GET_BYTELEN(h);
+ DUK_ASSERT(len >= 1);
+
+ /* XXX: differentiate between 0x82 and 0xff (hidden vs. internal?)? */
+
+ if (data[0] == 0xffU) {
+ return DUK_SYMBOL_TYPE_HIDDEN;
+ } else if (data[0] == 0x82U) {
+ return DUK_SYMBOL_TYPE_HIDDEN;
+ } else if (data[0] == 0x80U) {
+ return DUK_SYMBOL_TYPE_GLOBAL;
+ } else if (data[len - 1] != 0xffU) {
+ return DUK_SYMBOL_TYPE_LOCAL;
+ } else {
+ return DUK_SYMBOL_TYPE_WELLKNOWN;
+ }
+}
+
+DUK_LOCAL const char *duk__get_symbol_type_string(duk_hstring *h) {
+ duk_small_uint_t idx;
+ idx = duk__get_symbol_type(h);
+ DUK_ASSERT(idx < sizeof(duk__symbol_type_strings));
+ return duk__symbol_type_strings[idx];
+}
+
+DUK_LOCAL_DECL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag);
+
+DUK_LOCAL duk_int_t duk__api_coerce_d2i(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value, duk_bool_t require) {
+ duk_tval *tv;
+ duk_small_int_t c;
+ duk_double_t d;
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ /*
+ * Special cases like NaN and +/- Infinity are handled explicitly
+ * because a plain C coercion from double to int handles these cases
+ * in undesirable ways. For instance, NaN may coerce to INT_MIN
+ * (not zero), and INT_MAX + 1 may coerce to INT_MIN (not INT_MAX).
+ *
+ * This double-to-int coercion differs from ToInteger() because it
+ * has a finite range (ToInteger() allows e.g. +/- Infinity). It
+ * also differs from ToInt32() because the INT_MIN/INT_MAX clamping
+ * depends on the size of the int type on the platform. In particular,
+ * on platforms with a 64-bit int type, the full range is allowed.
+ */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ duk_int64_t t = DUK_TVAL_GET_FASTINT(tv);
+#if (DUK_INT_MAX <= 0x7fffffffL)
+ /* Clamping only necessary for 32-bit ints. */
+ if (t < DUK_INT_MIN) {
+ t = DUK_INT_MIN;
+ } else if (t > DUK_INT_MAX) {
+ t = DUK_INT_MAX;
+ }
+#endif
+ return (duk_int_t) t;
+ }
+#endif
+
+ if (DUK_TVAL_IS_NUMBER(tv)) {
+ d = DUK_TVAL_GET_NUMBER(tv);
+ c = (duk_small_int_t) DUK_FPCLASSIFY(d);
+ if (c == DUK_FP_NAN) {
+ return 0;
+ } else if (d < (duk_double_t) DUK_INT_MIN) {
+ /* covers -Infinity */
+ return DUK_INT_MIN;
+ } else if (d > (duk_double_t) DUK_INT_MAX) {
+ /* covers +Infinity */
+ return DUK_INT_MAX;
+ } else {
+ /* coerce towards zero */
+ return (duk_int_t) d;
+ }
+ }
+
+ if (require) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER);
+ /* not reachable */
+ }
+
+ return def_value;
+}
+
+DUK_LOCAL duk_uint_t duk__api_coerce_d2ui(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value, duk_bool_t require) {
+ duk_tval *tv;
+ duk_small_int_t c;
+ duk_double_t d;
+
+ /* Same as above but for unsigned int range. */
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ duk_int64_t t = DUK_TVAL_GET_FASTINT(tv);
+ if (t < 0) {
+ t = 0;
+ }
+#if (DUK_UINT_MAX <= 0xffffffffUL)
+ /* Clamping only necessary for 32-bit ints. */
+ else if (t > DUK_UINT_MAX) {
+ t = DUK_UINT_MAX;
+ }
+#endif
+ return (duk_uint_t) t;
+ }
+#endif
+
+ if (DUK_TVAL_IS_NUMBER(tv)) {
+ d = DUK_TVAL_GET_NUMBER(tv);
+ c = (duk_small_int_t) DUK_FPCLASSIFY(d);
+ if (c == DUK_FP_NAN) {
+ return 0;
+ } else if (d < 0.0) {
+ /* covers -Infinity */
+ return (duk_uint_t) 0;
+ } else if (d > (duk_double_t) DUK_UINT_MAX) {
+ /* covers +Infinity */
+ return (duk_uint_t) DUK_UINT_MAX;
+ } else {
+ /* coerce towards zero */
+ return (duk_uint_t) d;
+ }
+ }
+
+ if (require) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER);
+ /* not reachable */
+ }
+
+ return def_value;
+}
+
+/*
+ * Stack index validation/normalization and getting a stack duk_tval ptr.
+ *
+ * These are called by many API entrypoints so the implementations must be
+ * fast and "inlined".
+ *
+ * There's some repetition because of this; keep the functions in sync.
+ */
+
+DUK_EXTERNAL duk_idx_t duk_normalize_index(duk_hthread *thr, duk_idx_t idx) {
+ duk_uidx_t vs_size;
+ duk_uidx_t uidx;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ /* Care must be taken to avoid pointer wrapping in the index
+ * validation. For instance, on a 32-bit platform with 8-byte
+ * duk_tval the index 0x20000000UL would wrap the memory space
+ * once.
+ */
+
+ /* Assume value stack sizes (in elements) fits into duk_idx_t. */
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);
+ DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */
+
+ if (idx < 0) {
+ uidx = vs_size + (duk_uidx_t) idx;
+ } else {
+ /* since index non-negative */
+ DUK_ASSERT(idx != DUK_INVALID_INDEX);
+ uidx = (duk_uidx_t) idx;
+ }
+
+ /* DUK_INVALID_INDEX won't be accepted as a valid index. */
+ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);
+
+ if (DUK_LIKELY(uidx < vs_size)) {
+ return (duk_idx_t) uidx;
+ }
+ return DUK_INVALID_INDEX;
+}
+
+DUK_EXTERNAL duk_idx_t duk_require_normalize_index(duk_hthread *thr, duk_idx_t idx) {
+ duk_uidx_t vs_size;
+ duk_uidx_t uidx;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);
+ DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */
+
+ if (idx < 0) {
+ uidx = vs_size + (duk_uidx_t) idx;
+ } else {
+ DUK_ASSERT(idx != DUK_INVALID_INDEX);
+ uidx = (duk_uidx_t) idx;
+ }
+
+ /* DUK_INVALID_INDEX won't be accepted as a valid index. */
+ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);
+
+ if (DUK_LIKELY(uidx < vs_size)) {
+ return (duk_idx_t) uidx;
+ }
+ DUK_ERROR_RANGE_INDEX(thr, idx);
+ return 0; /* unreachable */
+}
+
+DUK_INTERNAL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx) {
+ duk_uidx_t vs_size;
+ duk_uidx_t uidx;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);
+ DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */
+
+ if (idx < 0) {
+ uidx = vs_size + (duk_uidx_t) idx;
+ } else {
+ DUK_ASSERT(idx != DUK_INVALID_INDEX);
+ uidx = (duk_uidx_t) idx;
+ }
+
+ /* DUK_INVALID_INDEX won't be accepted as a valid index. */
+ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);
+
+ if (DUK_LIKELY(uidx < vs_size)) {
+ return thr->valstack_bottom + uidx;
+ }
+ return NULL;
+}
+
+/* Variant of duk_get_tval() which is guaranteed to return a valid duk_tval
+ * pointer. When duk_get_tval() would return NULL, this variant returns a
+ * pointer to a duk_tval with tag DUK_TAG_UNUSED. This allows the call site
+ * to avoid an unnecessary NULL check which sometimes leads to better code.
+ * The return duk_tval is read only (at least for the UNUSED value).
+ */
+DUK_LOCAL const duk_tval_unused duk__const_tval_unused = DUK_TVAL_UNUSED_INITIALIZER();
+
+DUK_INTERNAL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval(thr, idx);
+ if (tv != NULL) {
+ return tv;
+ }
+ return (duk_tval *) DUK_LOSE_CONST(&duk__const_tval_unused);
+}
+
+DUK_INTERNAL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx) {
+ duk_uidx_t vs_size;
+ duk_uidx_t uidx;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);
+ DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */
+
+ /* Use unsigned arithmetic to optimize comparison. */
+ if (idx < 0) {
+ uidx = vs_size + (duk_uidx_t) idx;
+ } else {
+ DUK_ASSERT(idx != DUK_INVALID_INDEX);
+ uidx = (duk_uidx_t) idx;
+ }
+
+ /* DUK_INVALID_INDEX won't be accepted as a valid index. */
+ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);
+
+ if (DUK_LIKELY(uidx < vs_size)) {
+ return thr->valstack_bottom + uidx;
+ }
+ DUK_ERROR_RANGE_INDEX(thr, idx);
+ return NULL;
+}
+
+/* Non-critical. */
+DUK_EXTERNAL duk_bool_t duk_is_valid_index(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ return (duk_normalize_index(thr, idx) >= 0);
+}
+
+/* Non-critical. */
+DUK_EXTERNAL void duk_require_valid_index(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ if (DUK_UNLIKELY(duk_normalize_index(thr, idx) < 0)) {
+ DUK_ERROR_RANGE_INDEX(thr, idx);
+ return; /* unreachable */
+ }
+}
+
+/*
+ * Value stack top handling
+ */
+
+DUK_EXTERNAL duk_idx_t duk_get_top(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+}
+
+/* Internal helper to get current top but to require a minimum top value
+ * (TypeError if not met).
+ */
+DUK_INTERNAL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top) {
+ duk_idx_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ if (DUK_UNLIKELY(ret < min_top)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+ return ret;
+}
+
+/* Set stack top within currently allocated range, but don't reallocate.
+ * This is performance critical especially for call handling, so whenever
+ * changing, profile and look at generated code.
+ */
+DUK_EXTERNAL void duk_set_top(duk_hthread *thr, duk_idx_t idx) {
+ duk_uidx_t vs_size;
+ duk_uidx_t vs_limit;
+ duk_uidx_t uidx;
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_INVALID_INDEX < 0);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_bottom);
+ vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);
+ vs_limit = (duk_uidx_t) (thr->valstack_end - thr->valstack_bottom);
+
+ if (idx < 0) {
+ /* Negative indices are always within allocated stack but
+ * must not go below zero index.
+ */
+ uidx = vs_size + (duk_uidx_t) idx;
+ } else {
+ /* Positive index can be higher than valstack top but must
+ * not go above allocated stack (equality is OK).
+ */
+ uidx = (duk_uidx_t) idx;
+ }
+
+ /* DUK_INVALID_INDEX won't be accepted as a valid index. */
+ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);
+ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_limit);
+
+#if defined(DUK_USE_VALSTACK_UNSAFE)
+ DUK_ASSERT(uidx <= vs_limit);
+ DUK_UNREF(vs_limit);
+#else
+ if (DUK_UNLIKELY(uidx > vs_limit)) {
+ DUK_ERROR_RANGE_INDEX(thr, idx);
+ return; /* unreachable */
+ }
+#endif
+ DUK_ASSERT(uidx <= vs_limit);
+
+ /* Handle change in value stack top. Respect value stack
+ * initialization policy: 'undefined' above top. Note that
+ * DECREF may cause a side effect that reallocates valstack,
+ * so must relookup after DECREF.
+ */
+
+ if (uidx >= vs_size) {
+ /* Stack size increases or stays the same. */
+#if defined(DUK_USE_ASSERTIONS)
+ duk_uidx_t count;
+
+ count = uidx - vs_size;
+ while (count != 0) {
+ count--;
+ tv = thr->valstack_top + count;
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));
+ }
+#endif
+ thr->valstack_top = thr->valstack_bottom + uidx;
+ } else {
+ /* Stack size decreases. */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_uidx_t count;
+ duk_tval *tv_end;
+
+ count = vs_size - uidx;
+ DUK_ASSERT(count > 0);
+ tv = thr->valstack_top;
+ tv_end = tv - count;
+ DUK_ASSERT(tv > tv_end); /* Because count > 0. */
+ do {
+ tv--;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);
+ } while (tv != tv_end);
+ thr->valstack_top = tv_end;
+ DUK_REFZERO_CHECK_FAST(thr);
+#else /* DUK_USE_REFERENCE_COUNTING */
+ duk_uidx_t count;
+ duk_tval *tv_end;
+
+ count = vs_size - uidx;
+ tv = thr->valstack_top;
+ tv_end = tv - count;
+ DUK_ASSERT(tv > tv_end);
+ do {
+ tv--;
+ DUK_TVAL_SET_UNDEFINED(tv);
+ } while (tv != tv_end);
+ thr->valstack_top = tv_end;
+#endif /* DUK_USE_REFERENCE_COUNTING */
+ }
+}
+
+/* Internal variant with a non-negative index and no runtime size checks. */
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_set_top(thr, idx);
+}
+#else /* DUK_USE_PREFER_SIZE */
+DUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) {
+ duk_uidx_t uidx;
+ duk_uidx_t vs_size;
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_bottom);
+ DUK_ASSERT(idx >= 0);
+ DUK_ASSERT(idx <= (duk_idx_t) (thr->valstack_end - thr->valstack_bottom));
+
+ /* XXX: byte arithmetic */
+ uidx = (duk_uidx_t) idx;
+ vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);
+
+ if (uidx >= vs_size) {
+ /* Stack size increases or stays the same. */
+#if defined(DUK_USE_ASSERTIONS)
+ duk_uidx_t count;
+
+ count = uidx - vs_size;
+ while (count != 0) {
+ count--;
+ tv = thr->valstack_top + count;
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));
+ }
+#endif
+ thr->valstack_top = thr->valstack_bottom + uidx;
+ } else {
+ /* Stack size decreases. */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_uidx_t count;
+ duk_tval *tv_end;
+
+ count = vs_size - uidx;
+ DUK_ASSERT(count > 0);
+ tv = thr->valstack_top;
+ tv_end = tv - count;
+ DUK_ASSERT(tv > tv_end); /* Because count > 0. */
+ do {
+ tv--;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);
+ } while (tv != tv_end);
+ thr->valstack_top = tv_end;
+ DUK_REFZERO_CHECK_FAST(thr);
+#else /* DUK_USE_REFERENCE_COUNTING */
+ duk_uidx_t count;
+ duk_tval *tv_end;
+
+ count = vs_size - uidx;
+ tv = thr->valstack_top;
+ tv_end = tv - count;
+ DUK_ASSERT(tv > tv_end);
+ do {
+ tv--;
+ DUK_TVAL_SET_UNDEFINED(tv);
+ } while (tv != tv_end);
+ thr->valstack_top = tv_end;
+#endif /* DUK_USE_REFERENCE_COUNTING */
+ }
+}
+#endif /* DUK_USE_PREFER_SIZE */
+
+/* Internal helper: set top to 'top', and set [idx_wipe_start,top[ to
+ * 'undefined' (doing nothing if idx_wipe_start == top). Indices are
+ * positive and within value stack reserve. This is used by call handling.
+ */
+DUK_INTERNAL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(top >= 0);
+ DUK_ASSERT(idx_wipe_start >= 0);
+ DUK_ASSERT(idx_wipe_start <= top);
+ DUK_ASSERT(thr->valstack_bottom + top <= thr->valstack_end);
+ DUK_ASSERT(thr->valstack_bottom + idx_wipe_start <= thr->valstack_end);
+
+ duk_set_top_unsafe(thr, idx_wipe_start);
+ duk_set_top_unsafe(thr, top);
+}
+
+DUK_EXTERNAL duk_idx_t duk_get_top_index(duk_hthread *thr) {
+ duk_idx_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1;
+ if (DUK_UNLIKELY(ret < 0)) {
+ /* Return invalid index; if caller uses this without checking
+ * in another API call, the index won't map to a valid stack
+ * entry.
+ */
+ return DUK_INVALID_INDEX;
+ }
+ return ret;
+}
+
+/* Internal variant: call assumes there is at least one element on the value
+ * stack frame; this is only asserted for.
+ */
+DUK_INTERNAL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr) {
+ duk_idx_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1;
+ return ret;
+}
+
+DUK_EXTERNAL duk_idx_t duk_require_top_index(duk_hthread *thr) {
+ duk_idx_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1;
+ if (DUK_UNLIKELY(ret < 0)) {
+ DUK_ERROR_RANGE_INDEX(thr, -1);
+ return 0; /* unreachable */
+ }
+ return ret;
+}
+
+/*
+ * Value stack resizing.
+ *
+ * This resizing happens above the current "top": the value stack can be
+ * grown or shrunk, but the "top" is not affected. The value stack cannot
+ * be resized to a size below the current reserve.
+ *
+ * The low level reallocation primitive must carefully recompute all value
+ * stack pointers, and must also work if ALL pointers are NULL. The resize
+ * is quite tricky because the valstack realloc may cause a mark-and-sweep,
+ * which may run finalizers. Running finalizers may resize the valstack
+ * recursively (the same value stack we're working on). So, after realloc
+ * returns, we know that the valstack bottom, top, and reserve should still
+ * be the same (there should not be live values above the "top"), but its
+ * underlying size, alloc_end, and base pointer may have changed.
+ *
+ * 'new_size' is known to be <= DUK_USE_VALSTACK_LIMIT, which ensures that
+ * size_t and pointer arithmetic won't wrap in duk__resize_valstack().
+ */
+
+/* Low level valstack resize primitive, used for both grow and shrink. All
+ * adjustments for slack etc have already been done. Doesn't throw but does
+ * have allocation side effects.
+ */
+DUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__resize_valstack(duk_hthread *thr, duk_size_t new_size) {
+ duk_tval *pre_valstack;
+ duk_tval *pre_bottom;
+ duk_tval *pre_top;
+ duk_tval *pre_end;
+ duk_tval *pre_alloc_end;
+ duk_ptrdiff_t ptr_diff;
+ duk_tval *new_valstack;
+ duk_size_t new_alloc_size;
+ duk_tval *tv_prev_alloc_end;
+ duk_tval *p;
+
+ DUK_ASSERT_HTHREAD_VALID(thr);
+ DUK_ASSERT(thr->valstack_bottom >= thr->valstack);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_top);
+ DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) <= new_size); /* can't resize below 'top' */
+ DUK_ASSERT(new_size <= DUK_USE_VALSTACK_LIMIT); /* valstack limit caller has check, prevents wrapping */
+ DUK_ASSERT(new_size <= DUK_SIZE_MAX / sizeof(duk_tval)); /* specific assert for wrapping */
+
+ /* Pre-realloc pointer copies for asserts and debug logs. */
+ pre_valstack = thr->valstack;
+ pre_bottom = thr->valstack_bottom;
+ pre_top = thr->valstack_top;
+ pre_end = thr->valstack_end;
+ pre_alloc_end = thr->valstack_alloc_end;
+
+ DUK_UNREF(pre_valstack);
+ DUK_UNREF(pre_bottom);
+ DUK_UNREF(pre_top);
+ DUK_UNREF(pre_end);
+ DUK_UNREF(pre_alloc_end);
+
+ /* If finalizer torture enabled, force base pointer change every time
+ * when it would be allowed.
+ */
+#if defined(DUK_USE_FINALIZER_TORTURE)
+ if (thr->heap->pf_prevent_count == 0) {
+ duk_hthread_valstack_torture_realloc(thr);
+ }
+#endif
+
+ /* Allocate a new valstack using DUK_REALLOC_DIRECT() to deal with
+ * a side effect changing the base pointer.
+ */
+ new_alloc_size = sizeof(duk_tval) * new_size;
+ new_valstack = (duk_tval *) DUK_REALLOC_INDIRECT(thr->heap, duk_hthread_get_valstack_ptr, (void *) thr, new_alloc_size);
+ if (DUK_UNLIKELY(new_valstack == NULL)) {
+ /* Because new_size != 0, if condition doesn't need to be
+ * (new_valstack != NULL || new_size == 0).
+ */
+ DUK_ASSERT(new_size != 0);
+ DUK_D(DUK_DPRINT("failed to resize valstack to %lu entries (%lu bytes)",
+ (unsigned long) new_size, (unsigned long) new_alloc_size));
+ return 0;
+ }
+
+ /* Debug log any changes in pointer(s) by side effects. These don't
+ * necessarily imply any incorrect behavior, but should be rare in
+ * practice.
+ */
+#if defined(DUK_USE_DEBUG)
+ if (thr->valstack != pre_valstack) {
+ DUK_D(DUK_DPRINT("valstack base pointer changed during valstack resize: %p -> %p",
+ (void *) pre_valstack, (void *) thr->valstack));
+ }
+ if (thr->valstack_bottom != pre_bottom) {
+ DUK_D(DUK_DPRINT("valstack bottom pointer changed during valstack resize: %p -> %p",
+ (void *) pre_bottom, (void *) thr->valstack_bottom));
+ }
+ if (thr->valstack_top != pre_top) {
+ DUK_D(DUK_DPRINT("valstack top pointer changed during valstack resize: %p -> %p",
+ (void *) pre_top, (void *) thr->valstack_top));
+ }
+ if (thr->valstack_end != pre_end) {
+ DUK_D(DUK_DPRINT("valstack end pointer changed during valstack resize: %p -> %p",
+ (void *) pre_end, (void *) thr->valstack_end));
+ }
+ if (thr->valstack_alloc_end != pre_alloc_end) {
+ DUK_D(DUK_DPRINT("valstack alloc_end pointer changed during valstack resize: %p -> %p",
+ (void *) pre_alloc_end, (void *) thr->valstack_alloc_end));
+ }
+#endif
+
+ /* Assertions: offsets for bottom, top, and end (reserve) must not
+ * have changed even with side effects because they are always
+ * restored in unwind. For alloc_end there's no guarantee: it may
+ * have grown or shrunk (but remain above 'end').
+ */
+ DUK_ASSERT(thr->valstack_bottom - thr->valstack == pre_bottom - pre_valstack);
+ DUK_ASSERT(thr->valstack_top - thr->valstack == pre_top - pre_valstack);
+ DUK_ASSERT(thr->valstack_end - thr->valstack == pre_end - pre_valstack);
+ DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);
+
+ /* Write new pointers. Most pointers can be handled as a pointer
+ * difference.
+ */
+ ptr_diff = (duk_ptrdiff_t) ((duk_uint8_t *) new_valstack - (duk_uint8_t *) thr->valstack);
+ tv_prev_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_alloc_end + ptr_diff);
+ thr->valstack = new_valstack;
+ thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + ptr_diff);
+ thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + ptr_diff);
+ thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_end + ptr_diff);
+ thr->valstack_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) new_valstack + new_alloc_size);
+
+ /* Assertions: pointer sanity after pointer updates. */
+ DUK_ASSERT(thr->valstack_bottom >= thr->valstack);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_top);
+ DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);
+
+ DUK_D(DUK_DPRINT("resized valstack %lu -> %lu elements (%lu -> %lu bytes): "
+ "base=%p -> %p, bottom=%p -> %p (%ld), top=%p -> %p (%ld), "
+ "end=%p -> %p (%ld), alloc_end=%p -> %p (%ld);"
+ " tv_prev_alloc_end=%p (-> %ld inits; <0 means shrink)",
+ (unsigned long) (pre_alloc_end - pre_valstack),
+ (unsigned long) new_size,
+ (unsigned long) ((duk_uint8_t *) pre_alloc_end - (duk_uint8_t *) pre_valstack),
+ (unsigned long) new_alloc_size,
+ (void *) pre_valstack, (void *) thr->valstack,
+ (void *) pre_bottom, (void *) thr->valstack_bottom, (long) (thr->valstack_bottom - thr->valstack),
+ (void *) pre_top, (void *) thr->valstack_top, (long) (thr->valstack_top - thr->valstack),
+ (void *) pre_end, (void *) thr->valstack_end, (long) (thr->valstack_end - thr->valstack),
+ (void *) pre_alloc_end, (void *) thr->valstack_alloc_end, (long) (thr->valstack_alloc_end - thr->valstack),
+ (void *) tv_prev_alloc_end, (long) (thr->valstack_alloc_end - tv_prev_alloc_end)));
+
+ /* If allocation grew, init any new slots to 'undefined'. */
+ p = tv_prev_alloc_end;
+ while (p < thr->valstack_alloc_end) {
+ /* Never executed if new size is smaller. */
+ DUK_TVAL_SET_UNDEFINED(p);
+ p++;
+ }
+
+ /* Assert for value stack initialization policy. */
+#if defined(DUK_USE_ASSERTIONS)
+ p = thr->valstack_top;
+ while (p < thr->valstack_alloc_end) {
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(p));
+ p++;
+ }
+#endif
+
+ return 1;
+}
+
+DUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__valstack_grow(duk_hthread *thr, duk_size_t min_bytes, duk_bool_t throw_on_error) {
+ duk_size_t min_size;
+ duk_size_t new_size;
+
+ DUK_ASSERT(min_bytes / sizeof(duk_tval) * sizeof(duk_tval) == min_bytes);
+ min_size = min_bytes / sizeof(duk_tval); /* from bytes to slots */
+
+#if defined(DUK_USE_VALSTACK_GROW_SHIFT)
+ /* New size is minimum size plus a proportional slack, e.g. shift of
+ * 2 means a 25% slack.
+ */
+ new_size = min_size + (min_size >> DUK_USE_VALSTACK_GROW_SHIFT);
+#else
+ /* New size is tight with no slack. This is sometimes preferred in
+ * low memory environments.
+ */
+ new_size = min_size;
+#endif
+
+ if (DUK_UNLIKELY(new_size > DUK_USE_VALSTACK_LIMIT || new_size < min_size /*wrap*/)) {
+ /* Note: may be triggered even if minimal new_size would not reach the limit,
+ * plan limit accordingly.
+ */
+ if (throw_on_error) {
+ DUK_ERROR_RANGE(thr, DUK_STR_VALSTACK_LIMIT);
+ }
+ return 0;
+ }
+
+ if (duk__resize_valstack(thr, new_size) == 0) {
+ if (throw_on_error) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+ return 0;
+ }
+
+ thr->valstack_end = thr->valstack + min_size;
+ DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);
+
+ return 1;
+}
+
+/* Hot, inlined value stack grow check. Because value stack almost never
+ * grows, the actual resize call is in a NOINLINE helper.
+ */
+DUK_INTERNAL DUK_INLINE void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes) {
+ duk_tval *tv;
+
+ tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes);
+ if (DUK_LIKELY(thr->valstack_end >= tv)) {
+ return;
+ }
+ if (DUK_LIKELY(thr->valstack_alloc_end >= tv)) {
+ /* Values in [valstack_top,valstack_alloc_end[ are initialized
+ * to 'undefined' so we can just move the end pointer.
+ */
+ thr->valstack_end = tv;
+ return;
+ }
+ (void) duk__valstack_grow(thr, min_bytes, 1 /*throw_on_error*/);
+}
+
+/* Hot, inlined value stack grow check which doesn't throw. */
+DUK_INTERNAL DUK_INLINE duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes) {
+ duk_tval *tv;
+
+ tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes);
+ if (DUK_LIKELY(thr->valstack_end >= tv)) {
+ return 1;
+ }
+ if (DUK_LIKELY(thr->valstack_alloc_end >= tv)) {
+ thr->valstack_end = tv;
+ return 1;
+ }
+ return duk__valstack_grow(thr, min_bytes, 0 /*throw_on_error*/);
+}
+
+/* Value stack shrink check, called from mark-and-sweep. */
+DUK_INTERNAL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug) {
+ duk_size_t alloc_bytes;
+ duk_size_t reserve_bytes;
+ duk_size_t shrink_bytes;
+
+ alloc_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack);
+ reserve_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);
+ DUK_ASSERT(alloc_bytes >= reserve_bytes);
+
+ /* We're free to shrink the value stack allocation down to
+ * reserve_bytes but not more. If 'snug' (emergency GC)
+ * shrink whatever we can. Otherwise only shrink if the new
+ * size would be considerably smaller.
+ */
+
+#if defined(DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT)
+ if (snug) {
+ shrink_bytes = reserve_bytes;
+ } else {
+ duk_size_t proportion, slack;
+
+ /* Require that value stack shrinks by at least X% of its
+ * current size. For example, shift of 2 means at least
+ * 25%. The proportion is computed as bytes and may not
+ * be a multiple of sizeof(duk_tval); that's OK here.
+ */
+ proportion = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT;
+ if (alloc_bytes - reserve_bytes < proportion) {
+ /* Too little would be freed, do nothing. */
+ return;
+ }
+
+ /* Keep a slack after shrinking. The slack is again a
+ * proportion of the current size (the proportion should
+ * of course be smaller than the check proportion above).
+ */
+#if defined(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT)
+ DUK_ASSERT(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT > DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT);
+ slack = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT;
+#else
+ slack = 0;
+#endif
+ shrink_bytes = reserve_bytes +
+ slack / sizeof(duk_tval) * sizeof(duk_tval); /* multiple of duk_tval */
+ }
+#else /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */
+ /* Always snug, useful in some low memory environments. */
+ DUK_UNREF(snug);
+ shrink_bytes = reserve_bytes;
+#endif /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */
+
+ DUK_D(DUK_DPRINT("valstack shrink check: alloc_bytes=%ld, reserve_bytes=%ld, shrink_bytes=%ld (unvalidated)",
+ (long) alloc_bytes, (long) reserve_bytes, (long) shrink_bytes));
+ DUK_ASSERT(shrink_bytes >= reserve_bytes);
+ if (shrink_bytes >= alloc_bytes) {
+ /* Skip if shrink target is same as current one (or higher,
+ * though that shouldn't happen in practice).
+ */
+ return;
+ }
+ DUK_ASSERT(shrink_bytes / sizeof(duk_tval) * sizeof(duk_tval) == shrink_bytes);
+
+ DUK_D(DUK_DPRINT("valstack shrink check: decided to shrink, snug: %ld", (long) snug));
+
+ duk__resize_valstack(thr, shrink_bytes / sizeof(duk_tval));
+}
+
+DUK_EXTERNAL duk_bool_t duk_check_stack(duk_hthread *thr, duk_idx_t extra) {
+ duk_size_t min_new_bytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr != NULL);
+
+ if (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) {
+ if (extra < 0) {
+ /* Clamping to zero makes the API more robust to calling code
+ * calculation errors.
+ */
+ extra = 0;
+ } else {
+ /* Cause grow check to fail without wrapping arithmetic. */
+ extra = DUK_USE_VALSTACK_LIMIT;
+ }
+ }
+
+ min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) +
+ sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA);
+ return duk_valstack_grow_check_nothrow(thr, min_new_bytes);
+}
+
+DUK_EXTERNAL void duk_require_stack(duk_hthread *thr, duk_idx_t extra) {
+ duk_size_t min_new_bytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr != NULL);
+
+ if (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) {
+ if (extra < 0) {
+ /* Clamping to zero makes the API more robust to calling code
+ * calculation errors.
+ */
+ extra = 0;
+ } else {
+ /* Cause grow check to fail without wrapping arithmetic. */
+ extra = DUK_USE_VALSTACK_LIMIT;
+ }
+ }
+
+ min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) +
+ sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA);
+ duk_valstack_grow_check_throw(thr, min_new_bytes);
+}
+
+DUK_EXTERNAL duk_bool_t duk_check_stack_top(duk_hthread *thr, duk_idx_t top) {
+ duk_size_t min_new_bytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) {
+ if (top < 0) {
+ /* Clamping to zero makes the API more robust to calling code
+ * calculation errors.
+ */
+ top = 0;
+ } else {
+ /* Cause grow check to fail without wrapping arithmetic. */
+ top = DUK_USE_VALSTACK_LIMIT;
+ }
+ }
+
+ DUK_ASSERT(top >= 0);
+ min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) +
+ sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA);
+ return duk_valstack_grow_check_nothrow(thr, min_new_bytes);
+}
+
+DUK_EXTERNAL void duk_require_stack_top(duk_hthread *thr, duk_idx_t top) {
+ duk_size_t min_new_bytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) {
+ if (top < 0) {
+ /* Clamping to zero makes the API more robust to calling code
+ * calculation errors.
+ */
+ top = 0;
+ } else {
+ /* Cause grow check to fail without wrapping arithmetic. */
+ top = DUK_USE_VALSTACK_LIMIT;
+ }
+ }
+
+ DUK_ASSERT(top >= 0);
+ min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) +
+ sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA);
+ duk_valstack_grow_check_throw(thr, min_new_bytes);
+}
+
+/*
+ * Basic stack manipulation: swap, dup, insert, replace, etc
+ */
+
+DUK_EXTERNAL void duk_swap(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {
+ duk_tval *tv1;
+ duk_tval *tv2;
+ duk_tval tv_tmp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv1 = duk_require_tval(thr, idx1);
+ DUK_ASSERT(tv1 != NULL);
+ tv2 = duk_require_tval(thr, idx2);
+ DUK_ASSERT(tv2 != NULL);
+
+ /* If tv1==tv2 this is a NOP, no check is needed */
+ DUK_TVAL_SET_TVAL(&tv_tmp, tv1);
+ DUK_TVAL_SET_TVAL(tv1, tv2);
+ DUK_TVAL_SET_TVAL(tv2, &tv_tmp);
+}
+
+DUK_EXTERNAL void duk_swap_top(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_swap(thr, idx, -1);
+}
+
+DUK_EXTERNAL void duk_dup(duk_hthread *thr, duk_idx_t from_idx) {
+ duk_tval *tv_from;
+ duk_tval *tv_to;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+
+ tv_from = duk_require_tval(thr, from_idx);
+ tv_to = thr->valstack_top++;
+ DUK_ASSERT(tv_from != NULL);
+ DUK_ASSERT(tv_to != NULL);
+ DUK_TVAL_SET_TVAL(tv_to, tv_from);
+ DUK_TVAL_INCREF(thr, tv_to); /* no side effects */
+}
+
+DUK_EXTERNAL void duk_dup_top(duk_hthread *thr) {
+#if defined(DUK_USE_PREFER_SIZE)
+ duk_dup(thr, -1);
+#else
+ duk_tval *tv_from;
+ duk_tval *tv_to;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+
+ if (DUK_UNLIKELY(thr->valstack_top - thr->valstack_bottom <= 0)) {
+ DUK_ERROR_RANGE_INDEX(thr, -1);
+ return; /* unreachable */
+ }
+ tv_from = thr->valstack_top - 1;
+ tv_to = thr->valstack_top++;
+ DUK_ASSERT(tv_from != NULL);
+ DUK_ASSERT(tv_to != NULL);
+ DUK_TVAL_SET_TVAL(tv_to, tv_from);
+ DUK_TVAL_INCREF(thr, tv_to); /* no side effects */
+#endif
+}
+
+DUK_INTERNAL void duk_dup_0(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_dup(thr, 0);
+}
+DUK_INTERNAL void duk_dup_1(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_dup(thr, 1);
+}
+DUK_INTERNAL void duk_dup_2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_dup(thr, 2);
+}
+DUK_INTERNAL void duk_dup_m2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_dup(thr, -2);
+}
+DUK_INTERNAL void duk_dup_m3(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_dup(thr, -3);
+}
+DUK_INTERNAL void duk_dup_m4(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_dup(thr, -4);
+}
+
+DUK_EXTERNAL void duk_insert(duk_hthread *thr, duk_idx_t to_idx) {
+ duk_tval *p;
+ duk_tval *q;
+ duk_tval tv_tmp;
+ duk_size_t nbytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ p = duk_require_tval(thr, to_idx);
+ DUK_ASSERT(p != NULL);
+ q = duk_require_tval(thr, -1);
+ DUK_ASSERT(q != NULL);
+
+ DUK_ASSERT(q >= p);
+
+ /* nbytes
+ * <--------->
+ * [ ... | p | x | x | q ]
+ * => [ ... | q | p | x | x ]
+ */
+
+ nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */
+
+ DUK_DDD(DUK_DDDPRINT("duk_insert: to_idx=%ld, p=%p, q=%p, nbytes=%lu",
+ (long) to_idx, (void *) p, (void *) q, (unsigned long) nbytes));
+
+ /* No net refcount changes. */
+
+ if (nbytes > 0) {
+ DUK_TVAL_SET_TVAL(&tv_tmp, q);
+ DUK_ASSERT(nbytes > 0);
+ DUK_MEMMOVE((void *) (p + 1), (const void *) p, (size_t) nbytes);
+ DUK_TVAL_SET_TVAL(p, &tv_tmp);
+ } else {
+ /* nop: insert top to top */
+ DUK_ASSERT(nbytes == 0);
+ DUK_ASSERT(p == q);
+ }
+}
+
+DUK_INTERNAL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(idx >= 0); /* Doesn't support negative indices. */
+
+ duk_push_undefined(thr);
+ duk_insert(thr, idx);
+}
+
+DUK_INTERNAL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) {
+ duk_tval *tv, *tv_end;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(idx >= 0); /* Doesn't support negative indices or count. */
+ DUK_ASSERT(count >= 0);
+
+ tv = duk_reserve_gap(thr, idx, count);
+ tv_end = tv + count;
+ while (tv != tv_end) {
+ DUK_TVAL_SET_UNDEFINED(tv);
+ tv++;
+ }
+}
+
+DUK_EXTERNAL void duk_replace(duk_hthread *thr, duk_idx_t to_idx) {
+ duk_tval *tv1;
+ duk_tval *tv2;
+ duk_tval tv_tmp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv1 = duk_require_tval(thr, -1);
+ DUK_ASSERT(tv1 != NULL);
+ tv2 = duk_require_tval(thr, to_idx);
+ DUK_ASSERT(tv2 != NULL);
+
+ /* For tv1 == tv2, both pointing to stack top, the end result
+ * is same as duk_pop(thr).
+ */
+ DUK_TVAL_SET_TVAL(&tv_tmp, tv2);
+ DUK_TVAL_SET_TVAL(tv2, tv1);
+ DUK_TVAL_SET_UNDEFINED(tv1);
+ thr->valstack_top--;
+ DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */
+}
+
+DUK_EXTERNAL void duk_copy(duk_hthread *thr, duk_idx_t from_idx, duk_idx_t to_idx) {
+ duk_tval *tv1;
+ duk_tval *tv2;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv1 = duk_require_tval(thr, from_idx);
+ DUK_ASSERT(tv1 != NULL);
+ tv2 = duk_require_tval(thr, to_idx);
+ DUK_ASSERT(tv2 != NULL);
+
+ /* For tv1 == tv2, this is a no-op (no explicit check needed). */
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv2, tv1); /* side effects */
+}
+
+DUK_EXTERNAL void duk_remove(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *p;
+ duk_tval *q;
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_tval tv_tmp;
+#endif
+ duk_size_t nbytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ p = duk_require_tval(thr, idx);
+ DUK_ASSERT(p != NULL);
+ q = duk_require_tval(thr, -1);
+ DUK_ASSERT(q != NULL);
+
+ DUK_ASSERT(q >= p);
+
+ /* nbytes zero size case
+ * <--------->
+ * [ ... | p | x | x | q ] [ ... | p==q ]
+ * => [ ... | x | x | q ] [ ... ]
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* use a temp: decref only when valstack reachable values are correct */
+ DUK_TVAL_SET_TVAL(&tv_tmp, p);
+#endif
+
+ nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */
+ DUK_MEMMOVE((void *) p, (const void *) (p + 1), (size_t) nbytes); /* zero size not an issue: pointers are valid */
+
+ DUK_TVAL_SET_UNDEFINED(q);
+ thr->valstack_top--;
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */
+#endif
+}
+
+DUK_INTERNAL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_remove(thr, idx); /* XXX: no optimization for now */
+}
+
+DUK_INTERNAL void duk_remove_m2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_remove(thr, -2);
+}
+
+DUK_INTERNAL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) {
+#if defined(DUK_USE_PREFER_SIZE)
+ /* XXX: maybe too slow even when preferring size? */
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(count >= 0);
+ DUK_ASSERT(idx >= 0);
+
+ while (count-- > 0) {
+ duk_remove(thr, idx);
+ }
+#else /* DUK_USE_PREFER_SIZE */
+ duk_tval *tv_src;
+ duk_tval *tv_dst;
+ duk_tval *tv_newtop;
+ duk_tval *tv;
+ duk_size_t bytes;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(count >= 0);
+ DUK_ASSERT(idx >= 0);
+
+ tv_dst = thr->valstack_bottom + idx;
+ DUK_ASSERT(tv_dst <= thr->valstack_top);
+ tv_src = tv_dst + count;
+ DUK_ASSERT(tv_src <= thr->valstack_top);
+ bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src);
+
+ for (tv = tv_dst; tv < tv_src; tv++) {
+ DUK_TVAL_DECREF_NORZ(thr, tv);
+ }
+
+ DUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, bytes);
+
+ tv_newtop = thr->valstack_top - count;
+ for (tv = tv_newtop; tv < thr->valstack_top; tv++) {
+ DUK_TVAL_SET_UNDEFINED(tv);
+ }
+ thr->valstack_top = tv_newtop;
+
+ /* When not preferring size, only NORZ macros are used; caller
+ * is expected to DUK_REFZERO_CHECK().
+ */
+#endif /* DUK_USE_PREFER_SIZE */
+}
+
+DUK_INTERNAL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_remove_n(thr, idx, count); /* XXX: no optimization for now */
+}
+
+/*
+ * Stack slice primitives
+ */
+
+DUK_EXTERNAL void duk_xcopymove_raw(duk_hthread *to_thr, duk_hthread *from_thr, duk_idx_t count, duk_bool_t is_copy) {
+ void *src;
+ duk_size_t nbytes;
+ duk_tval *p;
+ duk_tval *q;
+
+ /* XXX: several pointer comparison issues here */
+
+ DUK_ASSERT_API_ENTRY(to_thr);
+ DUK_ASSERT_CTX_VALID(to_thr);
+ DUK_ASSERT_CTX_VALID(from_thr);
+ DUK_ASSERT(to_thr->heap == from_thr->heap);
+
+ if (DUK_UNLIKELY(to_thr == from_thr)) {
+ DUK_ERROR_TYPE(to_thr, DUK_STR_INVALID_CONTEXT);
+ return;
+ }
+ if (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) DUK_USE_VALSTACK_LIMIT)) {
+ /* Maximum value check ensures 'nbytes' won't wrap below.
+ * Also handles negative count.
+ */
+ DUK_ERROR_RANGE_INVALID_COUNT(to_thr);
+ return;
+ }
+ DUK_ASSERT(count >= 0);
+
+ nbytes = sizeof(duk_tval) * (duk_size_t) count;
+ if (DUK_UNLIKELY(nbytes == 0)) {
+ return;
+ }
+ DUK_ASSERT(to_thr->valstack_top <= to_thr->valstack_end);
+ if (DUK_UNLIKELY((duk_size_t) ((duk_uint8_t *) to_thr->valstack_end - (duk_uint8_t *) to_thr->valstack_top) < nbytes)) {
+ DUK_ERROR_RANGE_PUSH_BEYOND(to_thr);
+ }
+ src = (void *) ((duk_uint8_t *) from_thr->valstack_top - nbytes);
+ if (DUK_UNLIKELY(src < (void *) from_thr->valstack_bottom)) {
+ DUK_ERROR_RANGE_INVALID_COUNT(to_thr);
+ }
+
+ /* copy values (no overlap even if to_thr == from_thr; that's not
+ * allowed now anyway)
+ */
+ DUK_ASSERT(nbytes > 0);
+ DUK_MEMCPY((void *) to_thr->valstack_top, (const void *) src, (size_t) nbytes);
+
+ p = to_thr->valstack_top;
+ to_thr->valstack_top = (duk_tval *) (void *) (((duk_uint8_t *) p) + nbytes);
+
+ if (is_copy) {
+ /* Incref copies, keep originals. */
+ q = to_thr->valstack_top;
+ while (p < q) {
+ DUK_TVAL_INCREF(to_thr, p); /* no side effects */
+ p++;
+ }
+ } else {
+ /* No net refcount change. */
+ p = from_thr->valstack_top;
+ q = (duk_tval *) (void *) (((duk_uint8_t *) p) - nbytes);
+ from_thr->valstack_top = q;
+
+ while (p > q) {
+ p--;
+ DUK_TVAL_SET_UNDEFINED(p);
+ /* XXX: fast primitive to set a bunch of values to UNDEFINED */
+ }
+ }
+}
+
+/* Internal helper: reserve a gap of 'count' elements at 'idx_base' and return a
+ * pointer to the gap. Values in the gap are garbage and MUST be initialized by
+ * the caller before any side effects may occur. The caller must ensure there's
+ * enough stack reserve for 'count' values.
+ */
+DUK_INTERNAL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count) {
+ duk_tval *tv_src;
+ duk_tval *tv_dst;
+ duk_size_t gap_bytes;
+ duk_size_t copy_bytes;
+
+ /* Caller is responsible for ensuring there's enough preallocated
+ * value stack.
+ */
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(count >= 0);
+ DUK_ASSERT((duk_size_t) (thr->valstack_end - thr->valstack_top) >= (duk_size_t) count);
+
+ tv_src = thr->valstack_bottom + idx_base;
+ gap_bytes = (duk_size_t) count * sizeof(duk_tval);
+ tv_dst = (duk_tval *) (void *) ((duk_uint8_t *) tv_src + gap_bytes);
+ copy_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src);
+ thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + gap_bytes);
+ DUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, copy_bytes);
+
+ /* Values in the gap are left as garbage: caller must fill them in
+ * and INCREF them before any side effects.
+ */
+ return tv_src;
+}
+
+/*
+ * Get/opt/require
+ */
+
+DUK_EXTERNAL void duk_require_undefined(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_UNDEFINED(tv))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "undefined", DUK_STR_NOT_UNDEFINED);
+ }
+}
+
+DUK_EXTERNAL void duk_require_null(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_NULL(tv))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "null", DUK_STR_NOT_NULL);
+ }
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__get_boolean_raw(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) {
+ duk_bool_t ret;
+ duk_tval *tv;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_BOOLEAN(tv)) {
+ ret = DUK_TVAL_GET_BOOLEAN(tv);
+ DUK_ASSERT(ret == 0 || ret == 1);
+ } else {
+ ret = def_value;
+ /* Not guaranteed to be 0 or 1. */
+ }
+
+ return ret;
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_boolean(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk__get_boolean_raw(thr, idx, 0); /* default: false */
+}
+
+DUK_EXTERNAL duk_bool_t duk_get_boolean_default(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk__get_boolean_raw(thr, idx, def_value);
+}
+
+DUK_EXTERNAL duk_bool_t duk_require_boolean(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_bool_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_LIKELY(DUK_TVAL_IS_BOOLEAN(tv))) {
+ ret = DUK_TVAL_GET_BOOLEAN(tv);
+ DUK_ASSERT(ret == 0 || ret == 1);
+ return ret;
+ } else {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "boolean", DUK_STR_NOT_BOOLEAN);
+ }
+}
+
+DUK_EXTERNAL duk_bool_t duk_opt_boolean(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_boolean(thr, idx);
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE duk_double_t duk__get_number_raw(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) {
+ duk_double_union ret;
+ duk_tval *tv;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ ret.d = (duk_double_t) DUK_TVAL_GET_FASTINT(tv); /* XXX: cast trick */
+ }
+ else
+#endif
+ if (DUK_TVAL_IS_DOUBLE(tv)) {
+ /* When using packed duk_tval, number must be in NaN-normalized form
+ * for it to be a duk_tval, so no need to normalize. NOP for unpacked
+ * duk_tval.
+ */
+ ret.d = DUK_TVAL_GET_DOUBLE(tv);
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret));
+ } else {
+ ret.d = def_value;
+ /* Default value (including NaN) may not be normalized. */
+ }
+
+ return ret.d;
+}
+
+DUK_EXTERNAL duk_double_t duk_get_number(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_number_raw(thr, idx, DUK_DOUBLE_NAN); /* default: NaN */
+}
+
+DUK_EXTERNAL duk_double_t duk_get_number_default(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_number_raw(thr, idx, def_value);
+}
+
+DUK_EXTERNAL duk_double_t duk_require_number(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_double_union ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_NUMBER(tv))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER);
+ }
+
+ ret.d = DUK_TVAL_GET_NUMBER(tv);
+
+ /* When using packed duk_tval, number must be in NaN-normalized form
+ * for it to be a duk_tval, so no need to normalize. NOP for unpacked
+ * duk_tval.
+ */
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret));
+ return ret.d;
+}
+
+DUK_EXTERNAL duk_double_t duk_opt_number(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ /* User provided default is not NaN normalized. */
+ return def_value;
+ }
+ return duk_require_number(thr, idx);
+}
+
+DUK_EXTERNAL duk_int_t duk_get_int(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/);
+}
+
+DUK_EXTERNAL duk_uint_t duk_get_uint(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/);
+}
+
+DUK_EXTERNAL duk_int_t duk_get_int_default(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_int_t) duk__api_coerce_d2i(thr, idx, def_value, 0 /*require*/);
+}
+
+DUK_EXTERNAL duk_uint_t duk_get_uint_default(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, def_value, 0 /*require*/);
+}
+
+DUK_EXTERNAL duk_int_t duk_require_int(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 1 /*require*/);
+}
+
+DUK_EXTERNAL duk_uint_t duk_require_uint(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 1 /*require*/);
+}
+
+DUK_EXTERNAL duk_int_t duk_opt_int(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_int(thr, idx);
+}
+
+DUK_EXTERNAL duk_uint_t duk_opt_uint(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_uint(thr, idx);
+}
+
+DUK_EXTERNAL const char *duk_get_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {
+ duk_hstring *h;
+ const char *ret;
+ duk_size_t len;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_get_hstring(thr, idx);
+ if (h != NULL) {
+ len = DUK_HSTRING_GET_BYTELEN(h);
+ ret = (const char *) DUK_HSTRING_GET_DATA(h);
+ } else {
+ len = 0;
+ ret = NULL;
+ }
+
+ if (out_len != NULL) {
+ *out_len = len;
+ }
+ return ret;
+}
+
+DUK_EXTERNAL const char *duk_require_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_require_hstring(thr, idx);
+ DUK_ASSERT(h != NULL);
+ if (out_len) {
+ *out_len = DUK_HSTRING_GET_BYTELEN(h);
+ }
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+}
+
+DUK_INTERNAL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_require_hstring_notsymbol(thr, idx);
+ DUK_ASSERT(h != NULL);
+ if (out_len) {
+ *out_len = DUK_HSTRING_GET_BYTELEN(h);
+ }
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+}
+
+DUK_EXTERNAL const char *duk_get_string(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_get_hstring(thr, idx);
+ if (h != NULL) {
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+ } else {
+ return NULL;
+ }
+}
+
+DUK_EXTERNAL const char *duk_opt_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ if (out_len != NULL) {
+ *out_len = def_len;
+ }
+ return def_ptr;
+ }
+ return duk_require_lstring(thr, idx, out_len);
+}
+
+DUK_EXTERNAL const char *duk_opt_string(duk_hthread *thr, duk_idx_t idx, const char *def_ptr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_ptr;
+ }
+ return duk_require_string(thr, idx);
+}
+
+DUK_EXTERNAL const char *duk_get_lstring_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) {
+ duk_hstring *h;
+ const char *ret;
+ duk_size_t len;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_get_hstring(thr, idx);
+ if (h != NULL) {
+ len = DUK_HSTRING_GET_BYTELEN(h);
+ ret = (const char *) DUK_HSTRING_GET_DATA(h);
+ } else {
+ len = def_len;
+ ret = def_ptr;
+ }
+
+ if (out_len != NULL) {
+ *out_len = len;
+ }
+ return ret;
+}
+
+DUK_EXTERNAL const char *duk_get_string_default(duk_hthread *thr, duk_idx_t idx, const char *def_value) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_get_hstring(thr, idx);
+ if (h != NULL) {
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+ } else {
+ return def_value;
+ }
+}
+
+DUK_INTERNAL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_get_hstring_notsymbol(thr, idx);
+ if (h) {
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+ } else {
+ return NULL;
+ }
+}
+
+DUK_EXTERNAL const char *duk_require_string(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk_require_lstring(thr, idx, NULL);
+}
+
+DUK_INTERNAL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_require_hstring_notsymbol(thr, idx);
+ DUK_ASSERT(h != NULL);
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+}
+
+DUK_EXTERNAL void duk_require_object(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT);
+ }
+}
+
+DUK_LOCAL void *duk__get_pointer_raw(duk_hthread *thr, duk_idx_t idx, void *def_value) {
+ duk_tval *tv;
+ void *p;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (!DUK_TVAL_IS_POINTER(tv)) {
+ return def_value;
+ }
+
+ p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */
+ return p;
+}
+
+DUK_EXTERNAL void *duk_get_pointer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_pointer_raw(thr, idx, NULL /*def_value*/);
+}
+
+DUK_EXTERNAL void *duk_opt_pointer(duk_hthread *thr, duk_idx_t idx, void *def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_pointer(thr, idx);
+}
+
+DUK_EXTERNAL void *duk_get_pointer_default(duk_hthread *thr, duk_idx_t idx, void *def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_pointer_raw(thr, idx, def_value);
+}
+
+DUK_EXTERNAL void *duk_require_pointer(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ void *p;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Note: here we must be wary of the fact that a pointer may be
+ * valid and be a NULL.
+ */
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_POINTER(tv))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "pointer", DUK_STR_NOT_POINTER);
+ }
+ p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */
+ return p;
+}
+
+#if 0 /*unused*/
+DUK_INTERNAL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_heaphdr *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (!DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {
+ return NULL;
+ }
+
+ h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ return (void *) h;
+}
+#endif
+
+DUK_LOCAL void *duk__get_buffer_helper(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag) {
+ duk_hbuffer *h;
+ void *ret;
+ duk_size_t len;
+ duk_tval *tv;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ if (out_size != NULL) {
+ *out_size = 0;
+ }
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_LIKELY(DUK_TVAL_IS_BUFFER(tv))) {
+ h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+
+ len = DUK_HBUFFER_GET_SIZE(h);
+ ret = DUK_HBUFFER_GET_DATA_PTR(thr->heap, h);
+ } else {
+ if (throw_flag) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER);
+ }
+ len = def_size;
+ ret = def_ptr;
+ }
+
+ if (out_size != NULL) {
+ *out_size = len;
+ }
+ return ret;
+}
+
+DUK_EXTERNAL void *duk_get_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/);
+}
+
+DUK_EXTERNAL void *duk_opt_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ if (out_size != NULL) {
+ *out_size = def_size;
+ }
+ return def_ptr;
+ }
+ return duk_require_buffer(thr, idx, out_size);
+}
+
+DUK_EXTERNAL void *duk_get_buffer_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk__get_buffer_helper(thr, idx, out_size, def_ptr, def_len, 0 /*throw_flag*/);
+}
+
+DUK_EXTERNAL void *duk_require_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/);
+}
+
+/* Get the active buffer data area for a plain buffer or a buffer object.
+ * Return NULL if the the value is not a buffer. Note that a buffer may
+ * have a NULL data pointer when its size is zero, the optional 'out_isbuffer'
+ * argument allows caller to detect this reliably.
+ */
+DUK_INTERNAL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag, duk_bool_t *out_isbuffer) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (out_isbuffer != NULL) {
+ *out_isbuffer = 0;
+ }
+ if (out_size != NULL) {
+ *out_size = def_size;
+ }
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_BUFFER(tv)) {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+ if (out_size != NULL) {
+ *out_size = DUK_HBUFFER_GET_SIZE(h);
+ }
+ if (out_isbuffer != NULL) {
+ *out_isbuffer = 1;
+ }
+ return (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); /* may be NULL (but only if size is 0) */
+ }
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ else if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_HOBJECT_IS_BUFOBJ(h)) {
+ /* XXX: this is probably a useful shared helper: for a
+ * duk_hbufobj, get a validated buffer pointer/length.
+ */
+ duk_hbufobj *h_bufobj = (duk_hbufobj *) h;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ if (h_bufobj->buf != NULL &&
+ DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) {
+ duk_uint8_t *p;
+
+ p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf);
+ if (out_size != NULL) {
+ *out_size = (duk_size_t) h_bufobj->length;
+ }
+ if (out_isbuffer != NULL) {
+ *out_isbuffer = 1;
+ }
+ return (void *) (p + h_bufobj->offset);
+ }
+ /* if slice not fully valid, treat as error */
+ }
+ }
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+ if (throw_flag) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER);
+ }
+ return def_ptr;
+}
+
+DUK_EXTERNAL void *duk_get_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, NULL);
+}
+
+DUK_EXTERNAL void *duk_get_buffer_data_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_get_buffer_data_raw(thr, idx, out_size, def_ptr, def_size, 0 /*throw_flag*/, NULL);
+}
+
+DUK_EXTERNAL void *duk_opt_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ if (out_size != NULL) {
+ *out_size = def_size;
+ }
+ return def_ptr;
+ }
+ return duk_require_buffer_data(thr, idx, out_size);
+}
+
+DUK_EXTERNAL void *duk_require_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/, NULL);
+}
+
+/* Raw helper for getting a value from the stack, checking its tag.
+ * The tag cannot be a number because numbers don't have an internal
+ * tag in the packed representation.
+ */
+
+DUK_LOCAL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag) {
+ duk_tval *tv;
+ duk_heaphdr *ret;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_GET_TAG(tv) != tag) {
+ return (duk_heaphdr *) NULL;
+ }
+
+ ret = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(ret != NULL); /* tagged null pointers should never occur */
+ return ret;
+
+}
+
+DUK_INTERNAL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);
+}
+
+DUK_INTERNAL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);
+ if (DUK_UNLIKELY(h && DUK_HSTRING_HAS_SYMBOL(h))) {
+ return NULL;
+ }
+ return h;
+}
+
+DUK_INTERNAL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);
+ if (DUK_UNLIKELY(h == NULL)) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "string", DUK_STR_NOT_STRING);
+ }
+ return h;
+}
+
+DUK_INTERNAL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);
+ if (DUK_UNLIKELY(h == NULL || DUK_HSTRING_HAS_SYMBOL(h))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "string", DUK_STR_NOT_STRING);
+ }
+ return h;
+}
+
+DUK_INTERNAL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+}
+
+DUK_INTERNAL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(h == NULL)) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT);
+ }
+ return h;
+}
+
+DUK_INTERNAL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER);
+}
+
+DUK_INTERNAL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx) {
+ duk_hbuffer *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER);
+ if (DUK_UNLIKELY(h == NULL)) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER);
+ }
+ return h;
+}
+
+DUK_INTERNAL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_THREAD(h))) {
+ h = NULL;
+ }
+ return (duk_hthread *) h;
+}
+
+DUK_INTERNAL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_THREAD(h)))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "thread", DUK_STR_NOT_THREAD);
+ }
+ return (duk_hthread *) h;
+}
+
+DUK_INTERNAL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_COMPFUNC(h))) {
+ h = NULL;
+ }
+ return (duk_hcompfunc *) h;
+}
+
+DUK_INTERNAL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_COMPFUNC(h)))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "compiledfunction", DUK_STR_NOT_COMPFUNC);
+ }
+ return (duk_hcompfunc *) h;
+}
+
+DUK_INTERNAL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_NATFUNC(h))) {
+ h = NULL;
+ }
+ return (duk_hnatfunc *) h;
+}
+
+DUK_INTERNAL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_NATFUNC(h)))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "nativefunction", DUK_STR_NOT_NATFUNC);
+ }
+ return (duk_hnatfunc *) h;
+}
+
+DUK_EXTERNAL duk_c_function duk_get_c_function(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_hobject *h;
+ duk_hnatfunc *f;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) {
+ return NULL;
+ }
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ if (DUK_UNLIKELY(!DUK_HOBJECT_IS_NATFUNC(h))) {
+ return NULL;
+ }
+ DUK_ASSERT(DUK_HOBJECT_HAS_NATFUNC(h));
+ f = (duk_hnatfunc *) h;
+
+ return f->func;
+}
+
+DUK_EXTERNAL duk_c_function duk_opt_c_function(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_c_function(thr, idx);
+}
+
+DUK_EXTERNAL duk_c_function duk_get_c_function_default(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) {
+ duk_c_function ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = duk_get_c_function(thr, idx);
+ if (ret != NULL) {
+ return ret;
+ }
+
+ return def_value;
+}
+
+DUK_EXTERNAL duk_c_function duk_require_c_function(duk_hthread *thr, duk_idx_t idx) {
+ duk_c_function ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = duk_get_c_function(thr, idx);
+ if (DUK_UNLIKELY(!ret)) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "nativefunction", DUK_STR_NOT_NATFUNC);
+ }
+ return ret;
+}
+
+DUK_EXTERNAL void duk_require_function(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ if (DUK_UNLIKELY(!duk_is_function(thr, idx))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "function", DUK_STR_NOT_FUNCTION);
+ }
+}
+
+DUK_INTERNAL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_require_hobject_accept_mask(thr, idx, DUK_TYPE_MASK_LIGHTFUNC);
+ if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_HAS_CONSTRUCTABLE(h))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "constructable", DUK_STR_NOT_CONSTRUCTABLE);
+ }
+ /* Lightfuncs (h == NULL) are constructable. */
+}
+
+DUK_EXTERNAL duk_hthread *duk_get_context(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk_get_hthread(thr, idx);
+}
+
+DUK_EXTERNAL duk_hthread *duk_require_context(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk_require_hthread(thr, idx);
+}
+
+DUK_EXTERNAL duk_hthread *duk_opt_context(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_context(thr, idx);
+}
+
+DUK_EXTERNAL duk_hthread *duk_get_context_default(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) {
+ duk_hthread *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = duk_get_context(thr, idx);
+ if (ret != NULL) {
+ return ret;
+ }
+
+ return def_value;
+}
+
+DUK_EXTERNAL void *duk_get_heapptr(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ void *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) {
+ return (void *) NULL;
+ }
+
+ ret = (void *) DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(ret != NULL);
+ return ret;
+}
+
+DUK_EXTERNAL void *duk_opt_heapptr(duk_hthread *thr, duk_idx_t idx, void *def_value) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {
+ return def_value;
+ }
+ return duk_require_heapptr(thr, idx);
+}
+
+DUK_EXTERNAL void *duk_get_heapptr_default(duk_hthread *thr, duk_idx_t idx, void *def_value) {
+ void *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = duk_get_heapptr(thr, idx);
+ if (ret != NULL) {
+ return ret;
+ }
+
+ return def_value;
+}
+
+DUK_EXTERNAL void *duk_require_heapptr(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ void *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "heapobject", DUK_STR_UNEXPECTED_TYPE);
+ }
+
+ ret = (void *) DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(ret != NULL);
+ return ret;
+}
+
+/* Internal helper for getting/requiring a duk_hobject with possible promotion. */
+DUK_LOCAL duk_hobject *duk__get_hobject_promote_mask_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {
+ duk_uint_t val_mask;
+ duk_hobject *res;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ res = duk_get_hobject(thr, idx); /* common case, not promoted */
+ if (DUK_LIKELY(res != NULL)) {
+ DUK_ASSERT(res != NULL);
+ return res;
+ }
+
+ val_mask = duk_get_type_mask(thr, idx);
+ if (val_mask & type_mask) {
+ if (type_mask & DUK_TYPE_MASK_PROMOTE) {
+ res = duk_to_hobject(thr, idx);
+ DUK_ASSERT(res != NULL);
+ return res;
+ } else {
+ return NULL; /* accept without promoting */
+ }
+ }
+
+ if (type_mask & DUK_TYPE_MASK_THROW) {
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT);
+ }
+ return NULL;
+}
+
+/* Get a duk_hobject * at 'idx'; if the value is not an object but matches the
+ * supplied 'type_mask', promote it to an object and return the duk_hobject *.
+ * This is useful for call sites which want an object but also accept a plain
+ * buffer and/or a lightfunc which gets automatically promoted to an object.
+ * Return value is NULL if value is neither an object nor a plain type allowed
+ * by the mask.
+ */
+DUK_INTERNAL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_PROMOTE);
+}
+
+/* Like duk_get_hobject_promote_mask() but throw a TypeError instead of
+ * returning a NULL.
+ */
+DUK_INTERNAL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW | DUK_TYPE_MASK_PROMOTE);
+}
+
+/* Require a duk_hobject * at 'idx'; if the value is not an object but matches the
+ * supplied 'type_mask', return a NULL instead. Otherwise throw a TypeError.
+ */
+DUK_INTERNAL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW);
+}
+
+DUK_INTERNAL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_DISABLE(classnum >= 0); /* unsigned */
+ DUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) != classnum)) {
+ h = NULL;
+ }
+ return h;
+}
+
+DUK_INTERNAL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_DISABLE(classnum >= 0); /* unsigned */
+ DUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX);
+
+ h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);
+ if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) == classnum))) {
+ duk_hstring *h_class;
+ h_class = DUK_HTHREAD_GET_STRING(thr, DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum));
+ DUK_UNREF(h_class);
+
+ DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, (const char *) DUK_HSTRING_GET_DATA(h_class), DUK_STR_UNEXPECTED_TYPE);
+ }
+ return h;
+}
+
+DUK_EXTERNAL duk_size_t duk_get_length(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL:
+ case DUK_TAG_BOOLEAN:
+ case DUK_TAG_POINTER:
+ return 0;
+#if defined(DUK_USE_PREFER_SIZE)
+ /* String and buffer have a virtual non-configurable .length property
+ * which is within size_t range so it can be looked up without specific
+ * type checks. Lightfuncs inherit from %NativeFunctionPrototype%
+ * which provides an inherited .length accessor; it could be overwritten
+ * to produce unexpected types or values, but just number convert and
+ * duk_size_t cast for now.
+ */
+ case DUK_TAG_STRING:
+ case DUK_TAG_BUFFER:
+ case DUK_TAG_LIGHTFUNC: {
+ duk_size_t ret;
+ duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);
+ ret = (duk_size_t) duk_to_number_m1(thr);
+ duk_pop_unsafe(thr);
+ return ret;
+ }
+#else /* DUK_USE_PREFER_SIZE */
+ case DUK_TAG_STRING: {
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ return 0;
+ }
+ return (duk_size_t) DUK_HSTRING_GET_CHARLEN(h);
+ }
+ case DUK_TAG_BUFFER: {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+ return (duk_size_t) DUK_HBUFFER_GET_SIZE(h);
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ /* We could look up the length from the lightfunc duk_tval,
+ * but since Duktape 2.2 lightfunc .length comes from
+ * %NativeFunctionPrototype% which can be overridden, so
+ * look up the property explicitly.
+ */
+ duk_size_t ret;
+ duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);
+ ret = (duk_size_t) duk_to_number_m1(thr);
+ duk_pop_unsafe(thr);
+ return ret;
+ }
+#endif /* DUK_USE_PREFER_SIZE */
+ case DUK_TAG_OBJECT: {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ return (duk_size_t) duk_hobject_get_length(thr, h);
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default:
+ /* number or 'unused' */
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv) || DUK_TVAL_IS_UNUSED(tv));
+ return 0;
+ }
+
+ DUK_UNREACHABLE();
+}
+
+/*
+ * duk_known_xxx() helpers
+ *
+ * Used internally when we're 100% sure that a certain index is valid and
+ * contains an object of a certain type. For example, if we duk_push_object()
+ * we can then safely duk_known_hobject(thr, -1). These helpers just assert
+ * for the index and type, and if the assumptions are not valid, memory unsafe
+ * behavior happens.
+ */
+
+DUK_LOCAL duk_heaphdr *duk__known_heaphdr(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_heaphdr *h;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ if (idx < 0) {
+ tv = thr->valstack_top + idx;
+ } else {
+ tv = thr->valstack_bottom + idx;
+ }
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_ASSERT(tv < thr->valstack_top);
+ h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ return h;
+}
+
+DUK_INTERNAL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(duk_get_hstring(thr, idx) != NULL);
+ return (duk_hstring *) duk__known_heaphdr(thr, idx);
+}
+
+DUK_INTERNAL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(duk_get_hobject(thr, idx) != NULL);
+ return (duk_hobject *) duk__known_heaphdr(thr, idx);
+}
+
+DUK_INTERNAL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(duk_get_hbuffer(thr, idx) != NULL);
+ return (duk_hbuffer *) duk__known_heaphdr(thr, idx);
+}
+
+DUK_INTERNAL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(duk_get_hcompfunc(thr, idx) != NULL);
+ return (duk_hcompfunc *) duk__known_heaphdr(thr, idx);
+}
+
+DUK_INTERNAL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(duk_get_hnatfunc(thr, idx) != NULL);
+ return (duk_hnatfunc *) duk__known_heaphdr(thr, idx);
+}
+
+DUK_EXTERNAL void duk_set_length(duk_hthread *thr, duk_idx_t idx, duk_size_t len) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_normalize_index(thr, idx);
+ duk_push_uint(thr, (duk_uint_t) len);
+ duk_put_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);
+}
+
+/*
+ * Conversions and coercions
+ *
+ * The conversion/coercions are in-place operations on the value stack.
+ * Some operations are implemented here directly, while others call a
+ * helper in duk_js_ops.c after validating arguments.
+ */
+
+/* E5 Section 8.12.8 */
+
+DUK_LOCAL duk_bool_t duk__defaultvalue_coerce_attempt(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t func_stridx) {
+ if (duk_get_prop_stridx(thr, idx, func_stridx)) {
+ /* [ ... func ] */
+ if (duk_is_callable(thr, -1)) {
+ duk_dup(thr, idx); /* -> [ ... func this ] */
+ duk_call_method(thr, 0); /* -> [ ... retval ] */
+ if (duk_is_primitive(thr, -1)) {
+ duk_replace(thr, idx);
+ return 1;
+ }
+ /* [ ... retval ]; popped below */
+ }
+ }
+ duk_pop_unsafe(thr); /* [ ... func/retval ] -> [ ... ] */
+ return 0;
+}
+
+DUK_EXTERNAL void duk_to_undefined(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */
+}
+
+DUK_EXTERNAL void duk_to_null(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ DUK_TVAL_SET_NULL_UPDREF(thr, tv); /* side effects */
+}
+
+/* E5 Section 9.1 */
+DUK_EXTERNAL void duk_to_primitive(duk_hthread *thr, duk_idx_t idx, duk_int_t hint) {
+ /* inline initializer for coercers[] is not allowed by old compilers like BCC */
+ duk_small_uint_t coercers[2];
+ duk_small_uint_t class_number;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(hint == DUK_HINT_NONE || hint == DUK_HINT_NUMBER || hint == DUK_HINT_STRING);
+
+ idx = duk_require_normalize_index(thr, idx);
+
+ if (!duk_check_type_mask(thr, idx, DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_LIGHTFUNC |
+ DUK_TYPE_MASK_BUFFER)) {
+ /* Any other values stay as is. */
+ DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */
+ return;
+ }
+
+ class_number = duk_get_class_number(thr, idx);
+
+ /* XXX: Symbol objects normally coerce via the ES2015-revised ToPrimitive()
+ * algorithm which consults value[@@toPrimitive] and avoids calling
+ * .valueOf() and .toString(). Before that is implemented, special
+ * case Symbol objects to behave as if they had the default @@toPrimitive
+ * algorithm of E6 Section 19.4.3.4, i.e. return the plain symbol value
+ * with no further side effects.
+ */
+
+ if (class_number == DUK_HOBJECT_CLASS_SYMBOL) {
+ duk_hobject *h_obj;
+ duk_hstring *h_str;
+
+ /* XXX: pretty awkward, index based API for internal value access? */
+ h_obj = duk_known_hobject(thr, idx);
+ h_str = duk_hobject_get_internal_value_string(thr->heap, h_obj);
+ if (h_str) {
+ duk_push_hstring(thr, h_str);
+ duk_replace(thr, idx);
+ return;
+ }
+ }
+
+
+ /* Objects are coerced based on E5 specification.
+ * Lightfuncs are coerced because they behave like
+ * objects even if they're internally a primitive
+ * type. Same applies to plain buffers, which behave
+ * like ArrayBuffer objects since Duktape 2.x.
+ */
+
+ coercers[0] = DUK_STRIDX_VALUE_OF;
+ coercers[1] = DUK_STRIDX_TO_STRING;
+
+ if (hint == DUK_HINT_NONE) {
+ if (class_number == DUK_HOBJECT_CLASS_DATE) {
+ hint = DUK_HINT_STRING;
+ } else {
+ hint = DUK_HINT_NUMBER;
+ }
+ }
+
+ if (hint == DUK_HINT_STRING) {
+ coercers[0] = DUK_STRIDX_TO_STRING;
+ coercers[1] = DUK_STRIDX_VALUE_OF;
+ }
+
+ if (duk__defaultvalue_coerce_attempt(thr, idx, coercers[0])) {
+ DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */
+ return;
+ }
+
+ if (duk__defaultvalue_coerce_attempt(thr, idx, coercers[1])) {
+ DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */
+ return;
+ }
+
+ DUK_ERROR_TYPE(thr, DUK_STR_TOPRIMITIVE_FAILED);
+}
+
+/* E5 Section 9.2 */
+DUK_EXTERNAL duk_bool_t duk_to_boolean(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_bool_t val;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+ tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ val = duk_js_toboolean(tv);
+ DUK_ASSERT(val == 0 || val == 1);
+
+ /* Note: no need to re-lookup tv, conversion is side effect free. */
+ DUK_ASSERT(tv != NULL);
+ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, val); /* side effects */
+ return val;
+}
+
+DUK_EXTERNAL duk_double_t duk_to_number(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_double_t d;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* XXX: No need to normalize; the whole operation could be inlined here to
+ * avoid 'tv' re-lookup.
+ */
+ idx = duk_require_normalize_index(thr, idx);
+ tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ d = duk_js_tonumber(thr, tv); /* XXX: fastint coercion? now result will always be a non-fastint */
+
+ /* ToNumber() may have side effects so must relookup 'tv'. */
+ tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d); /* side effects */
+ return d;
+}
+
+DUK_INTERNAL duk_double_t duk_to_number_m1(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_to_number(thr, -1);
+}
+DUK_INTERNAL duk_double_t duk_to_number_m2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_to_number(thr, -2);
+}
+
+DUK_INTERNAL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv) {
+#if defined(DUK_USE_PREFER_SIZE)
+ duk_double_t res;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_push_tval(thr, tv);
+ res = duk_to_number_m1(thr);
+ duk_pop_unsafe(thr);
+ return res;
+#else
+ duk_double_t res;
+ duk_tval *tv_dst;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ASSERT_SPACE();
+
+ tv_dst = thr->valstack_top++;
+ DUK_TVAL_SET_TVAL(tv_dst, tv);
+ DUK_TVAL_INCREF(thr, tv_dst); /* decref not necessary */
+ res = duk_to_number_m1(thr); /* invalidates tv_dst */
+
+ tv_dst = --thr->valstack_top;
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_dst));
+ DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_dst)); /* plain number */
+ DUK_TVAL_SET_UNDEFINED(tv_dst); /* valstack init policy */
+
+ return res;
+#endif
+}
+
+/* XXX: combine all the integer conversions: they share everything
+ * but the helper function for coercion.
+ */
+
+typedef duk_double_t (*duk__toint_coercer)(duk_hthread *thr, duk_tval *tv);
+
+DUK_LOCAL duk_double_t duk__to_int_uint_helper(duk_hthread *thr, duk_idx_t idx, duk__toint_coercer coerce_func) {
+ duk_tval *tv;
+ duk_double_t d;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+#if defined(DUK_USE_FASTINT)
+ /* If argument is a fastint, guarantee that it remains one.
+ * There's no downgrade check for other cases.
+ */
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ /* XXX: Unnecessary conversion back and forth. */
+ return (duk_double_t) DUK_TVAL_GET_FASTINT(tv);
+ }
+#endif
+ d = coerce_func(thr, tv);
+
+ /* XXX: fastint? */
+
+ /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */
+ tv = duk_require_tval(thr, idx);
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d); /* side effects */
+ return d;
+}
+
+DUK_EXTERNAL duk_int_t duk_to_int(duk_hthread *thr, duk_idx_t idx) {
+ /* Value coercion (in stack): ToInteger(), E5 Section 9.4,
+ * API return value coercion: custom.
+ */
+ DUK_ASSERT_API_ENTRY(thr);
+ (void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger);
+ return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/);
+}
+
+DUK_EXTERNAL duk_uint_t duk_to_uint(duk_hthread *thr, duk_idx_t idx) {
+ /* Value coercion (in stack): ToInteger(), E5 Section 9.4,
+ * API return value coercion: custom.
+ */
+ DUK_ASSERT_API_ENTRY(thr);
+ (void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger);
+ return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/);
+}
+
+DUK_EXTERNAL duk_int32_t duk_to_int32(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_int32_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ ret = duk_js_toint32(thr, tv);
+
+ /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */
+ tv = duk_require_tval(thr, idx);
+ DUK_TVAL_SET_I32_UPDREF(thr, tv, ret); /* side effects */
+ return ret;
+}
+
+DUK_EXTERNAL duk_uint32_t duk_to_uint32(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_uint32_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ ret = duk_js_touint32(thr, tv);
+
+ /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */
+ tv = duk_require_tval(thr, idx);
+ DUK_TVAL_SET_U32_UPDREF(thr, tv, ret); /* side effects */
+ return ret;
+}
+
+DUK_EXTERNAL duk_uint16_t duk_to_uint16(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_uint16_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ ret = duk_js_touint16(thr, tv);
+
+ /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */
+ tv = duk_require_tval(thr, idx);
+ DUK_TVAL_SET_U32_UPDREF(thr, tv, ret); /* side effects */
+ return ret;
+}
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+/* Special coercion for Uint8ClampedArray. */
+DUK_INTERNAL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx) {
+ duk_double_t d;
+ duk_double_t t;
+ duk_uint8_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* XXX: Simplify this algorithm, should be possible to come up with
+ * a shorter and faster algorithm by inspecting IEEE representation
+ * directly.
+ */
+
+ d = duk_to_number(thr, idx);
+ if (d <= 0.0) {
+ return 0;
+ } else if (d >= 255) {
+ return 255;
+ } else if (DUK_ISNAN(d)) {
+ /* Avoid NaN-to-integer coercion as it is compiler specific. */
+ return 0;
+ }
+
+ t = d - DUK_FLOOR(d);
+ if (t == 0.5) {
+ /* Exact halfway, round to even. */
+ ret = (duk_uint8_t) d;
+ ret = (ret + 1) & 0xfe; /* Example: d=3.5, t=0.5 -> ret = (3 + 1) & 0xfe = 4 & 0xfe = 4
+ * Example: d=4.5, t=0.5 -> ret = (4 + 1) & 0xfe = 5 & 0xfe = 4
+ */
+ } else {
+ /* Not halfway, round to nearest. */
+ ret = (duk_uint8_t) (d + 0.5);
+ }
+ return ret;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+DUK_EXTERNAL const char *duk_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ (void) duk_to_string(thr, idx);
+ DUK_ASSERT(duk_is_string(thr, idx));
+ return duk_require_lstring(thr, idx, out_len);
+}
+
+DUK_LOCAL duk_ret_t duk__safe_to_string_raw(duk_hthread *thr, void *udata) {
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_UNREF(udata);
+
+ duk_to_string(thr, -1);
+ return 1;
+}
+
+DUK_EXTERNAL const char *duk_safe_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+
+ /* We intentionally ignore the duk_safe_call() return value and only
+ * check the output type. This way we don't also need to check that
+ * the returned value is indeed a string in the success case.
+ */
+
+ duk_dup(thr, idx);
+ (void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/);
+ if (!duk_is_string(thr, -1)) {
+ /* Error: try coercing error to string once. */
+ (void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/);
+ if (!duk_is_string(thr, -1)) {
+ /* Double error */
+ duk_pop_unsafe(thr);
+ duk_push_hstring_stridx(thr, DUK_STRIDX_UC_ERROR);
+ } else {
+ ;
+ }
+ } else {
+ /* String; may be a symbol, accepted. */
+ ;
+ }
+ DUK_ASSERT(duk_is_string(thr, -1));
+
+ duk_replace(thr, idx);
+ DUK_ASSERT(duk_get_string(thr, idx) != NULL);
+ return duk_get_lstring(thr, idx, out_len);
+}
+
+DUK_INTERNAL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_to_primitive(thr, idx, DUK_HINT_STRING); /* needed for e.g. Symbol objects */
+ h = duk_get_hstring(thr, idx);
+ if (h == NULL) {
+ /* The "is string?" check may seem unnecessary, but as things
+ * are duk_to_hstring() invokes ToString() which fails for
+ * symbols. But since symbols are already strings for Duktape
+ * C API, we check for that before doing the coercion.
+ */
+ h = duk_to_hstring(thr, idx);
+ }
+ DUK_ASSERT(h != NULL);
+ return h;
+}
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT) /* only needed by debugger for now */
+DUK_INTERNAL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ (void) duk_safe_to_string(thr, idx);
+ DUK_ASSERT(duk_is_string(thr, idx));
+ DUK_ASSERT(duk_get_hstring(thr, idx) != NULL);
+ return duk_known_hstring(thr, idx);
+}
+#endif
+
+/* Push Object.prototype.toString() output for 'tv'. */
+DUK_INTERNAL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv) {
+ duk_small_uint_t stridx;
+ duk_hstring *h_strclass;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNUSED: /* Treat like 'undefined', shouldn't happen. */
+ case DUK_TAG_UNDEFINED: {
+ stridx = DUK_STRIDX_UC_UNDEFINED;
+ break;
+ }
+ case DUK_TAG_NULL: {
+ stridx = DUK_STRIDX_UC_NULL;
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ stridx = DUK_STRIDX_UC_BOOLEAN;
+ break;
+ }
+ case DUK_TAG_POINTER: {
+ stridx = DUK_STRIDX_UC_POINTER;
+ break;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ stridx = DUK_STRIDX_UC_FUNCTION;
+ break;
+ }
+ case DUK_TAG_STRING: {
+ duk_hstring *h;
+ h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ stridx = DUK_STRIDX_UC_SYMBOL;
+ } else {
+ stridx = DUK_STRIDX_UC_STRING;
+ }
+ break;
+ }
+ case DUK_TAG_OBJECT: {
+ duk_hobject *h;
+ duk_small_uint_t classnum;
+
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ classnum = DUK_HOBJECT_GET_CLASS_NUMBER(h);
+ stridx = DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum);
+
+ /* XXX: This is not entirely correct anymore; in ES2015 the
+ * default lookup should use @@toStringTag to come up with
+ * e.g. [object Symbol], [object Uint8Array], etc. See
+ * ES2015 Section 19.1.3.6. The downside of implementing that
+ * directly is that the @@toStringTag lookup may have side
+ * effects, so all call sites must be checked for that.
+ * Some may need a side-effect free lookup, e.g. avoiding
+ * getters which are not typical.
+ */
+ break;
+ }
+ case DUK_TAG_BUFFER: {
+ stridx = DUK_STRIDX_UINT8_ARRAY;
+ break;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+ /* Fall through to generic number case. */
+#endif
+ default: {
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* number (maybe fastint) */
+ stridx = DUK_STRIDX_UC_NUMBER;
+ break;
+ }
+ }
+ h_strclass = DUK_HTHREAD_GET_STRING(thr, stridx);
+ DUK_ASSERT(h_strclass != NULL);
+
+ duk_push_sprintf(thr, "[object %s]", (const char *) DUK_HSTRING_GET_DATA(h_strclass));
+}
+
+/* XXX: other variants like uint, u32 etc */
+DUK_INTERNAL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped) {
+ duk_tval *tv;
+ duk_tval tv_tmp;
+ duk_double_t d, dmin, dmax;
+ duk_int_t res;
+ duk_bool_t clamped = 0;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ d = duk_js_tointeger(thr, tv); /* E5 Section 9.4, ToInteger() */
+
+ dmin = (duk_double_t) minval;
+ dmax = (duk_double_t) maxval;
+
+ if (d < dmin) {
+ clamped = 1;
+ res = minval;
+ d = dmin;
+ } else if (d > dmax) {
+ clamped = 1;
+ res = maxval;
+ d = dmax;
+ } else {
+ res = (duk_int_t) d;
+ }
+ DUK_UNREF(d); /* SCANBUILD: with suitable dmin/dmax limits 'd' is unused */
+ /* 'd' and 'res' agree here */
+
+ /* Relookup in case duk_js_tointeger() ends up e.g. coercing an object. */
+ tv = duk_get_tval(thr, idx);
+ DUK_ASSERT(tv != NULL); /* not popped by side effect */
+ DUK_TVAL_SET_TVAL(&tv_tmp, tv);
+#if defined(DUK_USE_FASTINT)
+#if (DUK_INT_MAX <= 0x7fffffffL)
+ DUK_TVAL_SET_I32(tv, res);
+#else
+ /* Clamping needed if duk_int_t is 64 bits. */
+ if (res >= DUK_FASTINT_MIN && res <= DUK_FASTINT_MAX) {
+ DUK_TVAL_SET_FASTINT(tv, res);
+ } else {
+ DUK_TVAL_SET_NUMBER(tv, d);
+ }
+#endif
+#else
+ DUK_TVAL_SET_NUMBER(tv, d); /* no need to incref */
+#endif
+ DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */
+
+ if (out_clamped) {
+ *out_clamped = clamped;
+ } else {
+ /* coerced value is updated to value stack even when RangeError thrown */
+ if (clamped) {
+ DUK_ERROR_RANGE(thr, DUK_STR_NUMBER_OUTSIDE_RANGE);
+ }
+ }
+
+ return res;
+}
+
+DUK_INTERNAL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_idx_t minval, duk_idx_t maxval) {
+ duk_bool_t dummy;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk_to_int_clamped_raw(thr, idx, minval, maxval, &dummy);
+}
+
+DUK_INTERNAL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_to_int_clamped_raw(thr, idx, minval, maxval, NULL); /* out_clamped==NULL -> RangeError if outside range */
+}
+
+DUK_EXTERNAL const char *duk_to_string(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+ tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED: {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_LC_UNDEFINED);
+ break;
+ }
+ case DUK_TAG_NULL: {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL);
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ if (DUK_TVAL_GET_BOOLEAN(tv)) {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_TRUE);
+ } else {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_FALSE);
+ }
+ break;
+ }
+ case DUK_TAG_STRING: {
+ /* Nop for actual strings, TypeError for Symbols.
+ * Because various internals rely on ToString() coercion of
+ * internal strings, -allow- (NOP) string coercion for hidden
+ * symbols.
+ */
+#if 1
+ duk_hstring *h;
+ h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_STRING_COERCE_SYMBOL);
+ } else {
+ goto skip_replace;
+ }
+#else
+ goto skip_replace;
+#endif
+ }
+ case DUK_TAG_BUFFER: /* Go through Uint8Array.prototype.toString() for coercion. */
+ case DUK_TAG_OBJECT: {
+ /* Plain buffers: go through ArrayBuffer.prototype.toString()
+ * for coercion.
+ *
+ * Symbol objects: duk_to_primitive() results in a plain symbol
+ * value, and duk_to_string() then causes a TypeError.
+ */
+ duk_to_primitive(thr, idx, DUK_HINT_STRING);
+ DUK_ASSERT(!duk_is_buffer(thr, idx)); /* ToPrimitive() must guarantee */
+ DUK_ASSERT(!duk_is_object(thr, idx));
+ return duk_to_string(thr, idx); /* Note: recursive call */
+ }
+ case DUK_TAG_POINTER: {
+ void *ptr = DUK_TVAL_GET_POINTER(tv);
+ if (ptr != NULL) {
+ duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) ptr);
+ } else {
+ /* Represent a null pointer as 'null' to be consistent with
+ * the JX format variant. Native '%p' format for a NULL
+ * pointer may be e.g. '(nil)'.
+ */
+ duk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL);
+ }
+ break;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ /* Should match Function.prototype.toString() */
+ duk_push_lightfunc_tostring(thr, tv);
+ break;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ /* number */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ duk_push_tval(thr, tv);
+ duk_numconv_stringify(thr,
+ 10 /*radix*/,
+ 0 /*precision:shortest*/,
+ 0 /*force_exponential*/);
+ break;
+ }
+ }
+
+ duk_replace(thr, idx);
+
+ skip_replace:
+ DUK_ASSERT(duk_is_string(thr, idx));
+ return duk_require_string(thr, idx);
+}
+
+DUK_INTERNAL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_to_string(thr, idx);
+ ret = duk_get_hstring(thr, idx);
+ DUK_ASSERT(ret != NULL);
+ return ret;
+}
+
+DUK_INTERNAL duk_hstring *duk_to_hstring_m1(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_to_hstring(thr, -1);
+}
+
+DUK_INTERNAL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ret = duk_get_hstring(thr, idx);
+ if (DUK_UNLIKELY(ret && DUK_HSTRING_HAS_SYMBOL(ret))) {
+ return ret;
+ }
+ return duk_to_hstring(thr, idx);
+}
+
+/* Convert a plain buffer or any buffer object into a string, using the buffer
+ * bytes 1:1 in the internal string representation. For views the active byte
+ * slice (not element slice interpreted as an initializer) is used. This is
+ * necessary in Duktape 2.x because ToString(plainBuffer) no longer creates a
+ * string with the same bytes as in the buffer but rather (usually)
+ * '[object ArrayBuffer]'.
+ */
+DUK_EXTERNAL const char *duk_buffer_to_string(duk_hthread *thr, duk_idx_t idx) {
+ void *ptr_src;
+ duk_size_t len;
+ const char *res;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+
+ ptr_src = duk_require_buffer_data(thr, idx, &len);
+ DUK_ASSERT(ptr_src != NULL || len == 0);
+
+ res = duk_push_lstring(thr, (const char *) ptr_src, len);
+ duk_replace(thr, idx);
+ return res;
+}
+
+DUK_EXTERNAL void *duk_to_buffer_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, duk_uint_t mode) {
+ duk_hbuffer *h_buf;
+ const duk_uint8_t *src_data;
+ duk_size_t src_size;
+ duk_uint8_t *dst_data;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+
+ h_buf = duk_get_hbuffer(thr, idx);
+ if (h_buf != NULL) {
+ /* Buffer is kept as is, with the fixed/dynamic nature of the
+ * buffer only changed if requested. An external buffer
+ * is converted into a non-external dynamic buffer in a
+ * duk_to_dynamic_buffer() call.
+ */
+ duk_uint_t tmp;
+ duk_uint8_t *tmp_ptr;
+
+ tmp_ptr = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf);
+ src_data = (const duk_uint8_t *) tmp_ptr;
+ src_size = DUK_HBUFFER_GET_SIZE(h_buf);
+
+ tmp = (DUK_HBUFFER_HAS_DYNAMIC(h_buf) ? DUK_BUF_MODE_DYNAMIC : DUK_BUF_MODE_FIXED);
+ if ((tmp == mode && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)) ||
+ mode == DUK_BUF_MODE_DONTCARE) {
+ /* Note: src_data may be NULL if input is a zero-size
+ * dynamic buffer.
+ */
+ dst_data = tmp_ptr;
+ goto skip_copy;
+ }
+ } else {
+ /* Non-buffer value is first ToString() coerced, then converted
+ * to a buffer (fixed buffer is used unless a dynamic buffer is
+ * explicitly requested). Symbols are rejected with a TypeError.
+ * XXX: C API could maybe allow symbol-to-buffer coercion?
+ */
+ src_data = (const duk_uint8_t *) duk_to_lstring(thr, idx, &src_size);
+ }
+
+ dst_data = (duk_uint8_t *) duk_push_buffer(thr, src_size, (mode == DUK_BUF_MODE_DYNAMIC) /*dynamic*/);
+ if (DUK_LIKELY(src_size > 0)) {
+ /* When src_size == 0, src_data may be NULL (if source
+ * buffer is dynamic), and dst_data may be NULL (if
+ * target buffer is dynamic). Avoid zero-size memcpy()
+ * with an invalid pointer.
+ */
+ DUK_MEMCPY((void *) dst_data, (const void *) src_data, (size_t) src_size);
+ }
+ duk_replace(thr, idx);
+ skip_copy:
+
+ if (out_size) {
+ *out_size = src_size;
+ }
+ return dst_data;
+}
+
+DUK_EXTERNAL void *duk_to_pointer(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ void *res;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+ tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL:
+ case DUK_TAG_BOOLEAN:
+ res = NULL;
+ break;
+ case DUK_TAG_POINTER:
+ res = DUK_TVAL_GET_POINTER(tv);
+ break;
+ case DUK_TAG_STRING:
+ case DUK_TAG_OBJECT:
+ case DUK_TAG_BUFFER:
+ /* Heap allocated: return heap pointer which is NOT useful
+ * for the caller, except for debugging.
+ */
+ res = (void *) DUK_TVAL_GET_HEAPHDR(tv);
+ break;
+ case DUK_TAG_LIGHTFUNC:
+ /* Function pointers do not always cast correctly to void *
+ * (depends on memory and segmentation model for instance),
+ * so they coerce to NULL.
+ */
+ res = NULL;
+ break;
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default:
+ /* number */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ res = NULL;
+ break;
+ }
+
+ duk_push_pointer(thr, res);
+ duk_replace(thr, idx);
+ return res;
+}
+
+DUK_LOCAL void duk__push_func_from_lightfunc(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) {
+ duk_idx_t nargs;
+ duk_uint_t flags = 0; /* shared flags for a subset of types */
+ duk_small_uint_t lf_len;
+ duk_hnatfunc *nf;
+
+ nargs = (duk_idx_t) DUK_LFUNC_FLAGS_GET_NARGS(lf_flags);
+ if (nargs == DUK_LFUNC_NARGS_VARARGS) {
+ nargs = (duk_idx_t) DUK_VARARGS;
+ }
+
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_CONSTRUCTABLE |
+ DUK_HOBJECT_FLAG_CALLABLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_NATFUNC |
+ DUK_HOBJECT_FLAG_NEWENV |
+ DUK_HOBJECT_FLAG_STRICT |
+ DUK_HOBJECT_FLAG_NOTAIL |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);
+ (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE);
+
+ lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags);
+ if ((duk_idx_t) lf_len != nargs) {
+ /* Explicit length is only needed if it differs from 'nargs'. */
+ duk_push_int(thr, (duk_int_t) lf_len);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE);
+ }
+
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ duk_push_lightfunc_name_raw(thr, func, lf_flags);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);
+#endif
+
+ nf = duk_known_hnatfunc(thr, -1);
+ nf->magic = (duk_int16_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags);
+}
+
+DUK_EXTERNAL void duk_to_object(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_uint_t flags = 0; /* shared flags for a subset of types */
+ duk_small_int_t proto = 0;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx);
+ tv = DUK_GET_TVAL_POSIDX(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+#if !defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ case DUK_TAG_BUFFER: /* With no bufferobject support, don't object coerce. */
+#endif
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL: {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE);
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BOOLEAN);
+ proto = DUK_BIDX_BOOLEAN_PROTOTYPE;
+ goto create_object;
+ }
+ case DUK_TAG_STRING: {
+ duk_hstring *h;
+ h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_SYMBOL);
+ proto = DUK_BIDX_SYMBOL_PROTOTYPE;
+ } else {
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING);
+ proto = DUK_BIDX_STRING_PROTOTYPE;
+ }
+ goto create_object;
+ }
+ case DUK_TAG_OBJECT: {
+ /* nop */
+ break;
+ }
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ case DUK_TAG_BUFFER: {
+ /* A plain buffer object coerces to a full ArrayBuffer which
+ * is not fully transparent behavior (ToObject() should be a
+ * nop for an object). This behavior matches lightfuncs which
+ * also coerce to an equivalent Function object. There are
+ * also downsides to defining ToObject(plainBuffer) as a no-op;
+ * for example duk_to_hobject() could result in a NULL pointer.
+ */
+ duk_hbuffer *h_buf;
+
+ h_buf = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h_buf != NULL);
+ duk_hbufobj_push_uint8array_from_plain(thr, h_buf);
+ goto replace_value;
+ }
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+ case DUK_TAG_POINTER: {
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER);
+ proto = DUK_BIDX_POINTER_PROTOTYPE;
+ goto create_object;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ /* Lightfunc coerces to a Function instance with concrete
+ * properties. Since 'length' is virtual for Duktape/C
+ * functions, don't need to define that. The result is made
+ * extensible to mimic what happens to strings in object
+ * coercion:
+ *
+ * > Object.isExtensible(Object('foo'))
+ * true
+ */
+ duk_small_uint_t lf_flags;
+ duk_c_function func;
+
+ DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);
+ duk__push_func_from_lightfunc(thr, func, lf_flags);
+ goto replace_value;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_NUMBER);
+ proto = DUK_BIDX_NUMBER_PROTOTYPE;
+ goto create_object;
+ }
+ }
+ DUK_ASSERT(duk_is_object(thr, idx));
+ return;
+
+ create_object:
+ (void) duk_push_object_helper(thr, flags, proto);
+
+ /* Note: Boolean prototype's internal value property is not writable,
+ * but duk_xdef_prop_stridx() disregards the write protection. Boolean
+ * instances are immutable.
+ *
+ * String and buffer special behaviors are already enabled which is not
+ * ideal, but a write to the internal value is not affected by them.
+ */
+ duk_dup(thr, idx);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);
+
+ replace_value:
+ duk_replace(thr, idx);
+ DUK_ASSERT(duk_is_object(thr, idx));
+}
+
+DUK_INTERNAL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_to_object(thr, idx);
+ ret = duk_known_hobject(thr, idx);
+ return ret;
+}
+
+/*
+ * Type checking
+ */
+
+DUK_LOCAL duk_bool_t duk__tag_check(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t tag) {
+ duk_tval *tv;
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ return (DUK_TVAL_GET_TAG(tv) == tag);
+}
+
+DUK_LOCAL duk_bool_t duk__obj_flag_any_default_false(duk_hthread *thr, duk_idx_t idx, duk_uint_t flag_mask) {
+ duk_hobject *obj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_get_hobject(thr, idx);
+ if (obj) {
+ return (DUK_HEAPHDR_CHECK_FLAG_BITS((duk_heaphdr *) obj, flag_mask) ? 1 : 0);
+ }
+ return 0;
+}
+
+DUK_INTERNAL duk_int_t duk_get_type_tval(duk_tval *tv) {
+ DUK_ASSERT(tv != NULL);
+
+#if defined(DUK_USE_PACKED_TVAL)
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNUSED:
+ return DUK_TYPE_NONE;
+ case DUK_TAG_UNDEFINED:
+ return DUK_TYPE_UNDEFINED;
+ case DUK_TAG_NULL:
+ return DUK_TYPE_NULL;
+ case DUK_TAG_BOOLEAN:
+ return DUK_TYPE_BOOLEAN;
+ case DUK_TAG_STRING:
+ return DUK_TYPE_STRING;
+ case DUK_TAG_OBJECT:
+ return DUK_TYPE_OBJECT;
+ case DUK_TAG_BUFFER:
+ return DUK_TYPE_BUFFER;
+ case DUK_TAG_POINTER:
+ return DUK_TYPE_POINTER;
+ case DUK_TAG_LIGHTFUNC:
+ return DUK_TYPE_LIGHTFUNC;
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default:
+ /* Note: number has no explicit tag (in 8-byte representation) */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ return DUK_TYPE_NUMBER;
+ }
+#else /* DUK_USE_PACKED_TVAL */
+ DUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv));
+ DUK_ASSERT(sizeof(duk__type_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1);
+ return (duk_int_t) duk__type_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN];
+#endif /* DUK_USE_PACKED_TVAL */
+}
+
+DUK_EXTERNAL duk_int_t duk_get_type(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ return duk_get_type_tval(tv);
+}
+
+#if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS)
+DUK_LOCAL const char * const duk__type_names[] = {
+ "none",
+ "undefined",
+ "null",
+ "boolean",
+ "number",
+ "string",
+ "object",
+ "buffer",
+ "pointer",
+ "lightfunc"
+};
+
+DUK_INTERNAL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx) {
+ duk_int_t type_tag;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ type_tag = duk_get_type(thr, idx);
+ DUK_ASSERT(type_tag >= DUK_TYPE_MIN && type_tag <= DUK_TYPE_MAX);
+ DUK_ASSERT(DUK_TYPE_MIN == 0 && sizeof(duk__type_names) / sizeof(const char *) == DUK_TYPE_MAX + 1);
+
+ return duk__type_names[type_tag];
+}
+#endif /* DUK_USE_VERBOSE_ERRORS && DUK_USE_PARANOID_ERRORS */
+
+DUK_INTERNAL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_hobject *obj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_OBJECT:
+ obj = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(obj != NULL);
+ return DUK_HOBJECT_GET_CLASS_NUMBER(obj);
+ case DUK_TAG_BUFFER:
+ /* Buffers behave like Uint8Array objects. */
+ return DUK_HOBJECT_CLASS_UINT8ARRAY;
+ case DUK_TAG_LIGHTFUNC:
+ /* Lightfuncs behave like Function objects. */
+ return DUK_HOBJECT_CLASS_FUNCTION;
+ default:
+ /* Primitive or UNUSED, no class number. */
+ return DUK_HOBJECT_CLASS_NONE;
+ }
+}
+
+DUK_EXTERNAL duk_bool_t duk_check_type(duk_hthread *thr, duk_idx_t idx, duk_int_t type) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return (duk_get_type(thr, idx) == type) ? 1 : 0;
+}
+
+DUK_INTERNAL duk_uint_t duk_get_type_mask_tval(duk_tval *tv) {
+ DUK_ASSERT(tv != NULL);
+
+#if defined(DUK_USE_PACKED_TVAL)
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNUSED:
+ return DUK_TYPE_MASK_NONE;
+ case DUK_TAG_UNDEFINED:
+ return DUK_TYPE_MASK_UNDEFINED;
+ case DUK_TAG_NULL:
+ return DUK_TYPE_MASK_NULL;
+ case DUK_TAG_BOOLEAN:
+ return DUK_TYPE_MASK_BOOLEAN;
+ case DUK_TAG_STRING:
+ return DUK_TYPE_MASK_STRING;
+ case DUK_TAG_OBJECT:
+ return DUK_TYPE_MASK_OBJECT;
+ case DUK_TAG_BUFFER:
+ return DUK_TYPE_MASK_BUFFER;
+ case DUK_TAG_POINTER:
+ return DUK_TYPE_MASK_POINTER;
+ case DUK_TAG_LIGHTFUNC:
+ return DUK_TYPE_MASK_LIGHTFUNC;
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default:
+ /* Note: number has no explicit tag (in 8-byte representation) */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ return DUK_TYPE_MASK_NUMBER;
+ }
+#else /* DUK_USE_PACKED_TVAL */
+ DUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv));
+ DUK_ASSERT(sizeof(duk__type_mask_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1);
+ return duk__type_mask_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN];
+#endif /* DUK_USE_PACKED_TVAL */
+}
+
+DUK_EXTERNAL duk_uint_t duk_get_type_mask(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ return duk_get_type_mask_tval(tv);
+}
+
+DUK_EXTERNAL duk_bool_t duk_check_type_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t mask) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (DUK_LIKELY((duk_get_type_mask(thr, idx) & mask) != 0U)) {
+ return 1;
+ }
+ if (mask & DUK_TYPE_MASK_THROW) {
+ DUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE);
+ DUK_UNREACHABLE();
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_undefined(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_UNDEFINED);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_null(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_NULL);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_boolean(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_BOOLEAN);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_number(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /*
+ * Number is special because it doesn't have a specific
+ * tag in the 8-byte representation.
+ */
+
+ /* XXX: shorter version for unpacked representation? */
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ return DUK_TVAL_IS_NUMBER(tv);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_nan(duk_hthread *thr, duk_idx_t idx) {
+ /* XXX: This will now return false for non-numbers, even though they would
+ * coerce to NaN (as a general rule). In particular, duk_get_number()
+ * returns a NaN for non-numbers, so should this function also return
+ * true for non-numbers?
+ */
+
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+
+ /* XXX: for packed duk_tval an explicit "is number" check is unnecessary */
+ if (!DUK_TVAL_IS_NUMBER(tv)) {
+ return 0;
+ }
+ return (duk_bool_t) DUK_ISNAN(DUK_TVAL_GET_NUMBER(tv));
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_string(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_STRING);
+}
+
+DUK_INTERNAL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_get_hstring_notsymbol(thr, idx) != NULL;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_object(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_OBJECT);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_buffer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_BUFFER);
+}
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_BUFFER(tv)) {
+ return 1;
+ } else if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_HOBJECT_IS_BUFOBJ(h)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+#else /* DUK_USE_BUFFEROBJECT_SUPPORT */
+DUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ return duk_is_buffer(thr, idx);
+}
+
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+DUK_EXTERNAL duk_bool_t duk_is_pointer(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_POINTER);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_lightfunc(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__tag_check(thr, idx, DUK_TAG_LIGHTFUNC);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_symbol(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ h = duk_get_hstring(thr, idx);
+ /* Use DUK_LIKELY() here because caller may be more likely to type
+ * check an expected symbol than not.
+ */
+ if (DUK_LIKELY(h != NULL && DUK_HSTRING_HAS_SYMBOL(h))) {
+ return 1;
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_array(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *obj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_get_hobject(thr, idx);
+ if (obj) {
+ return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_ARRAY ? 1 : 0);
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_function(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ return DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0;
+ }
+ if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ return 1;
+ }
+ return 0;
+}
+
+DUK_INTERNAL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_UNREF(thr);
+
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ return DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0;
+ }
+ if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ return 1;
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_constructable(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ return DUK_HOBJECT_HAS_CONSTRUCTABLE(h) ? 1 : 0;
+ }
+ if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ return 1;
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_c_function(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__obj_flag_any_default_false(thr,
+ idx,
+ DUK_HOBJECT_FLAG_NATFUNC);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_ecmascript_function(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__obj_flag_any_default_false(thr,
+ idx,
+ DUK_HOBJECT_FLAG_COMPFUNC);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_bound_function(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__obj_flag_any_default_false(thr,
+ idx,
+ DUK_HOBJECT_FLAG_BOUNDFUNC);
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_thread(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *obj;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ obj = duk_get_hobject(thr, idx);
+ if (obj) {
+ return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_THREAD ? 1 : 0);
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_fixed_buffer(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_BUFFER(tv)) {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+ return (DUK_HBUFFER_HAS_DYNAMIC(h) ? 0 : 1);
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_dynamic_buffer(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_BUFFER(tv)) {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+ return (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0);
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_bool_t duk_is_external_buffer(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_get_tval_or_unused(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_BUFFER(tv)) {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+ return (DUK_HBUFFER_HAS_DYNAMIC(h) && DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0);
+ }
+ return 0;
+}
+
+DUK_EXTERNAL duk_errcode_t duk_get_error_code(duk_hthread *thr, duk_idx_t idx) {
+ duk_hobject *h;
+ duk_uint_t sanity;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_get_hobject(thr, idx);
+
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ if (!h) {
+ return DUK_ERR_NONE;
+ }
+
+ /* XXX: something more convenient? */
+
+ if (h == thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]) {
+ return DUK_ERR_EVAL_ERROR;
+ }
+ if (h == thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]) {
+ return DUK_ERR_RANGE_ERROR;
+ }
+ if (h == thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]) {
+ return DUK_ERR_REFERENCE_ERROR;
+ }
+ if (h == thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]) {
+ return DUK_ERR_SYNTAX_ERROR;
+ }
+ if (h == thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]) {
+ return DUK_ERR_TYPE_ERROR;
+ }
+ if (h == thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]) {
+ return DUK_ERR_URI_ERROR;
+ }
+ if (h == thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]) {
+ return DUK_ERR_ERROR;
+ }
+
+ h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);
+ } while (--sanity > 0);
+
+ return DUK_ERR_NONE;
+}
+
+/*
+ * Pushers
+ */
+
+DUK_INTERNAL void duk_push_tval(duk_hthread *thr, duk_tval *tv) {
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(tv != NULL);
+
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_TVAL(tv_slot, tv);
+ DUK_TVAL_INCREF(thr, tv); /* no side effects */
+}
+
+DUK_EXTERNAL void duk_push_undefined(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK__CHECK_SPACE();
+
+ /* Because value stack init policy is 'undefined above top',
+ * we don't need to write, just assert.
+ */
+ thr->valstack_top++;
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1));
+}
+
+DUK_EXTERNAL void duk_push_null(duk_hthread *thr) {
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_NULL(tv_slot);
+}
+
+DUK_EXTERNAL void duk_push_boolean(duk_hthread *thr, duk_bool_t val) {
+ duk_tval *tv_slot;
+ duk_small_int_t b;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ b = (val ? 1 : 0); /* ensure value is 1 or 0 (not other non-zero) */
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_BOOLEAN(tv_slot, b);
+}
+
+DUK_EXTERNAL void duk_push_true(duk_hthread *thr) {
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_BOOLEAN_TRUE(tv_slot);
+}
+
+DUK_EXTERNAL void duk_push_false(duk_hthread *thr) {
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_BOOLEAN_FALSE(tv_slot);
+}
+
+/* normalize NaN which may not match our canonical internal NaN */
+DUK_EXTERNAL void duk_push_number(duk_hthread *thr, duk_double_t val) {
+ duk_tval *tv_slot;
+ duk_double_union du;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ du.d = val;
+ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_NUMBER(tv_slot, du.d);
+}
+
+DUK_EXTERNAL void duk_push_int(duk_hthread *thr, duk_int_t val) {
+#if defined(DUK_USE_FASTINT)
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+#if DUK_INT_MAX <= 0x7fffffffL
+ DUK_TVAL_SET_I32(tv_slot, (duk_int32_t) val);
+#else
+ if (val >= DUK_FASTINT_MIN && val <= DUK_FASTINT_MAX) {
+ DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val);
+ } else {
+ duk_double_t = (duk_double_t) val;
+ DUK_TVAL_SET_NUMBER(tv_slot, d);
+ }
+#endif
+#else /* DUK_USE_FASTINT */
+ duk_tval *tv_slot;
+ duk_double_t d;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ d = (duk_double_t) val;
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_NUMBER(tv_slot, d);
+#endif /* DUK_USE_FASTINT */
+}
+
+DUK_EXTERNAL void duk_push_uint(duk_hthread *thr, duk_uint_t val) {
+#if defined(DUK_USE_FASTINT)
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+#if DUK_UINT_MAX <= 0xffffffffUL
+ DUK_TVAL_SET_U32(tv_slot, (duk_uint32_t) val);
+#else
+ if (val <= DUK_FASTINT_MAX) { /* val is unsigned so >= 0 */
+ /* XXX: take advantage of val being unsigned, no need to mask */
+ DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val);
+ } else {
+ duk_double_t = (duk_double_t) val;
+ DUK_TVAL_SET_NUMBER(tv_slot, d);
+ }
+#endif
+#else /* DUK_USE_FASTINT */
+ duk_tval *tv_slot;
+ duk_double_t d;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ d = (duk_double_t) val;
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_NUMBER(tv_slot, d);
+#endif /* DUK_USE_FASTINT */
+}
+
+DUK_EXTERNAL void duk_push_nan(duk_hthread *thr) {
+ duk_tval *tv_slot;
+ duk_double_union du;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ DUK_DBLUNION_SET_NAN(&du);
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_NUMBER(tv_slot, du.d);
+}
+
+DUK_EXTERNAL const char *duk_push_lstring(duk_hthread *thr, const char *str, duk_size_t len) {
+ duk_hstring *h;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* check stack before interning (avoid hanging temp) */
+ DUK__CHECK_SPACE();
+
+ /* NULL with zero length represents an empty string; NULL with higher
+ * length is also now trated like an empty string although it is
+ * a bit dubious. This is unlike duk_push_string() which pushes a
+ * 'null' if the input string is a NULL.
+ */
+ if (!str) {
+ len = 0;
+ }
+
+ /* Check for maximum string length */
+ if (DUK_UNLIKELY(len > DUK_HSTRING_MAX_BYTELEN)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_STRING_TOO_LONG);
+ }
+
+ h = duk_heap_strtable_intern_checked(thr, (const duk_uint8_t *) str, (duk_uint32_t) len);
+ DUK_ASSERT(h != NULL);
+
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_STRING(tv_slot, h);
+ DUK_HSTRING_INCREF(thr, h); /* no side effects */
+
+ return (const char *) DUK_HSTRING_GET_DATA(h);
+}
+
+DUK_EXTERNAL const char *duk_push_string(duk_hthread *thr, const char *str) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (str) {
+ return duk_push_lstring(thr, str, DUK_STRLEN(str));
+ } else {
+ duk_push_null(thr);
+ return NULL;
+ }
+}
+
+DUK_EXTERNAL void duk_push_pointer(duk_hthread *thr, void *val) {
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__CHECK_SPACE();
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_POINTER(tv_slot, val);
+}
+
+DUK_INTERNAL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i) {
+ duk_hstring *h_tmp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* XXX: this could be a direct DUK_SPRINTF to a buffer followed by duk_push_string() */
+ duk_push_uint(thr, (duk_uint_t) i);
+ h_tmp = duk_to_hstring_m1(thr);
+ DUK_ASSERT(h_tmp != NULL);
+ return h_tmp;
+}
+
+DUK_LOCAL void duk__push_this_helper(duk_hthread *thr, duk_small_uint_t check_object_coercible) {
+ duk_tval *tv_slot;
+
+ DUK__CHECK_SPACE();
+
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* because of valstack init policy */
+ tv_slot = thr->valstack_top++;
+
+ if (DUK_UNLIKELY(thr->callstack_curr == NULL)) {
+ if (check_object_coercible) {
+ goto type_error;
+ }
+ /* 'undefined' already on stack top */
+ } else {
+ duk_tval *tv;
+
+ /* 'this' binding is just before current activation's bottom */
+ DUK_ASSERT(thr->valstack_bottom > thr->valstack);
+ tv = thr->valstack_bottom - 1;
+ if (check_object_coercible &&
+ (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv))) {
+ /* XXX: better macro for DUK_TVAL_IS_UNDEFINED_OR_NULL(tv) */
+ goto type_error;
+ }
+
+ DUK_TVAL_SET_TVAL(tv_slot, tv);
+ DUK_TVAL_INCREF(thr, tv);
+ }
+ return;
+
+ type_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE);
+}
+
+DUK_EXTERNAL void duk_push_this(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk__push_this_helper(thr, 0 /*check_object_coercible*/);
+}
+
+DUK_INTERNAL void duk_push_this_check_object_coercible(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk__push_this_helper(thr, 1 /*check_object_coercible*/);
+}
+
+DUK_INTERNAL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk__push_this_helper(thr, 1 /*check_object_coercible*/);
+ h = duk_to_hobject(thr, -1);
+ DUK_ASSERT(h != NULL);
+ return h;
+}
+
+DUK_INTERNAL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk__push_this_helper(thr, 1 /*check_object_coercible*/);
+ return duk_to_hstring_m1(thr); /* This will reject all Symbol values; accepts Symbol objects. */
+}
+
+DUK_INTERNAL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_ASSERT(thr->callstack_top > 0); /* caller required to know */
+ DUK_ASSERT(thr->callstack_curr != NULL); /* caller required to know */
+ DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* consequence of above */
+ DUK_ASSERT(thr->valstack_bottom - 1 >= thr->valstack); /* 'this' binding exists */
+
+ return thr->valstack_bottom - 1;
+}
+
+DUK_EXTERNAL void duk_push_current_function(duk_hthread *thr) {
+ duk_activation *act;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ act = thr->callstack_curr;
+ if (act != NULL) {
+ duk_push_tval(thr, &act->tv_func);
+ } else {
+ duk_push_undefined(thr);
+ }
+}
+
+DUK_EXTERNAL void duk_push_current_thread(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ if (thr->heap->curr_thread) {
+ duk_push_hobject(thr, (duk_hobject *) thr->heap->curr_thread);
+ } else {
+ duk_push_undefined(thr);
+ }
+}
+
+DUK_EXTERNAL void duk_push_global_object(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL);
+}
+
+/* XXX: size optimize */
+DUK_LOCAL void duk__push_stash(duk_hthread *thr) {
+ if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE)) {
+ DUK_DDD(DUK_DDDPRINT("creating heap/global/thread stash on first use"));
+ duk_pop_unsafe(thr);
+ duk_push_bare_object(thr);
+ duk_dup_top(thr);
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_C); /* [ ... parent stash stash ] -> [ ... parent stash ] */
+ }
+ duk_remove_m2(thr);
+}
+
+DUK_EXTERNAL void duk_push_heap_stash(duk_hthread *thr) {
+ duk_heap *heap;
+ DUK_ASSERT_API_ENTRY(thr);
+ heap = thr->heap;
+ DUK_ASSERT(heap->heap_object != NULL);
+ duk_push_hobject(thr, heap->heap_object);
+ duk__push_stash(thr);
+}
+
+DUK_EXTERNAL void duk_push_global_stash(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_push_global_object(thr);
+ duk__push_stash(thr);
+}
+
+DUK_EXTERNAL void duk_push_thread_stash(duk_hthread *thr, duk_hthread *target_thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ if (DUK_UNLIKELY(target_thr == NULL)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return; /* not reached */
+ }
+ duk_push_hobject(thr, (duk_hobject *) target_thr);
+ duk__push_stash(thr);
+}
+
+/* XXX: duk_ssize_t would be useful here */
+DUK_LOCAL duk_int_t duk__try_push_vsprintf(duk_hthread *thr, void *buf, duk_size_t sz, const char *fmt, va_list ap) {
+ duk_int_t len;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_UNREF(thr);
+
+ /* NUL terminator handling doesn't matter here */
+ len = DUK_VSNPRINTF((char *) buf, sz, fmt, ap);
+ if (len < (duk_int_t) sz) {
+ /* Return value of 'sz' or more indicates output was (potentially)
+ * truncated.
+ */
+ return (duk_int_t) len;
+ }
+ return -1;
+}
+
+DUK_EXTERNAL const char *duk_push_vsprintf(duk_hthread *thr, const char *fmt, va_list ap) {
+ duk_uint8_t stack_buf[DUK_PUSH_SPRINTF_INITIAL_SIZE];
+ duk_size_t sz = DUK_PUSH_SPRINTF_INITIAL_SIZE;
+ duk_bool_t pushed_buf = 0;
+ void *buf;
+ duk_int_t len; /* XXX: duk_ssize_t */
+ const char *res;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* special handling of fmt==NULL */
+ if (!fmt) {
+ duk_hstring *h_str;
+ duk_push_hstring_empty(thr);
+ h_str = duk_known_hstring(thr, -1);
+ return (const char *) DUK_HSTRING_GET_DATA(h_str);
+ }
+
+ /* initial estimate based on format string */
+ sz = DUK_STRLEN(fmt) + 16; /* format plus something to avoid just missing */
+ if (sz < DUK_PUSH_SPRINTF_INITIAL_SIZE) {
+ sz = DUK_PUSH_SPRINTF_INITIAL_SIZE;
+ }
+ DUK_ASSERT(sz > 0);
+
+ /* Try to make do with a stack buffer to avoid allocating a temporary buffer.
+ * This works 99% of the time which is quite nice.
+ */
+ for (;;) {
+ va_list ap_copy; /* copied so that 'ap' can be reused */
+
+ if (sz <= sizeof(stack_buf)) {
+ buf = stack_buf;
+ } else if (!pushed_buf) {
+ pushed_buf = 1;
+ buf = duk_push_dynamic_buffer(thr, sz);
+ } else {
+ buf = duk_resize_buffer(thr, -1, sz);
+ }
+ DUK_ASSERT(buf != NULL);
+
+ DUK_VA_COPY(ap_copy, ap);
+ len = duk__try_push_vsprintf(thr, buf, sz, fmt, ap_copy);
+ va_end(ap_copy);
+ if (len >= 0) {
+ break;
+ }
+
+ /* failed, resize and try again */
+ sz = sz * 2;
+ if (DUK_UNLIKELY(sz >= DUK_PUSH_SPRINTF_SANITY_LIMIT)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG);
+ }
+ }
+
+ /* Cannot use duk_buffer_to_string() on the buffer because it is
+ * usually larger than 'len'; 'buf' is also usually a stack buffer.
+ */
+ res = duk_push_lstring(thr, (const char *) buf, (duk_size_t) len); /* [ buf? res ] */
+ if (pushed_buf) {
+ duk_remove_m2(thr);
+ }
+ return res;
+}
+
+DUK_EXTERNAL const char *duk_push_sprintf(duk_hthread *thr, const char *fmt, ...) {
+ va_list ap;
+ const char *ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* allow fmt==NULL */
+ va_start(ap, fmt);
+ ret = duk_push_vsprintf(thr, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+DUK_INTERNAL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) {
+ duk_tval *tv_slot;
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(prototype_bidx == -1 ||
+ (prototype_bidx >= 0 && prototype_bidx < DUK_NUM_BUILTINS));
+
+ DUK__CHECK_SPACE();
+
+ h = duk_hobject_alloc(thr, hobject_flags_and_class);
+ DUK_ASSERT(h != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("created object with flags: 0x%08lx", (unsigned long) h->hdr.h_flags));
+
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_OBJECT(tv_slot, h);
+ DUK_HOBJECT_INCREF(thr, h); /* no side effects */
+ thr->valstack_top++;
+
+ /* object is now reachable */
+
+ if (prototype_bidx >= 0) {
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, thr->builtins[prototype_bidx]);
+ } else {
+ DUK_ASSERT(prototype_bidx == -1);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h) == NULL);
+ }
+
+ return h;
+}
+
+DUK_INTERNAL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto) {
+ duk_hobject *h;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h = duk_push_object_helper(thr, hobject_flags_and_class, -1);
+ DUK_ASSERT(h != NULL);
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, proto);
+ return h;
+}
+
+DUK_EXTERNAL duk_idx_t duk_push_object(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),
+ DUK_BIDX_OBJECT_PROTOTYPE);
+ return duk_get_top_index_unsafe(thr);
+}
+
+DUK_EXTERNAL duk_idx_t duk_push_array(duk_hthread *thr) {
+ duk_uint_t flags;
+ duk_harray *obj;
+ duk_idx_t ret;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_ARRAY_PART |
+ DUK_HOBJECT_FLAG_EXOTIC_ARRAY |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAY);
+
+ obj = duk_harray_alloc(thr, flags);
+ DUK_ASSERT(obj != NULL);
+
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_ARRAY_PROTOTYPE]);
+
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);
+ DUK_HOBJECT_INCREF(thr, obj); /* XXX: could preallocate with refcount = 1 */
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ thr->valstack_top++;
+
+ DUK_ASSERT(obj->length == 0); /* Array .length starts at zero. */
+ return ret;
+}
+
+DUK_INTERNAL duk_harray *duk_push_harray(duk_hthread *thr) {
+ /* XXX: API call could do this directly, cast to void in API macro. */
+ duk_harray *a;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ (void) duk_push_array(thr);
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(thr->valstack_top - 1));
+ a = (duk_harray *) DUK_TVAL_GET_OBJECT(thr->valstack_top - 1);
+ DUK_ASSERT(a != NULL);
+ return a;
+}
+
+/* Push a duk_harray with preallocated size (.length also set to match size).
+ * Caller may then populate array part of the duk_harray directly.
+ */
+DUK_INTERNAL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size) {
+ duk_harray *a;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ a = duk_push_harray(thr);
+
+ duk_hobject_realloc_props(thr,
+ (duk_hobject *) a,
+ 0,
+ size,
+ 0,
+ 0);
+ a->length = size;
+ return a;
+}
+
+DUK_INTERNAL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size) {
+ duk_harray *a;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ a = duk_push_harray_with_size(thr, size);
+ DUK_ASSERT(a != NULL);
+ return DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a);
+}
+
+DUK_EXTERNAL duk_idx_t duk_push_thread_raw(duk_hthread *thr, duk_uint_t flags) {
+ duk_hthread *obj;
+ duk_idx_t ret;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK__CHECK_SPACE();
+
+ obj = duk_hthread_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));
+ DUK_ASSERT(obj != NULL);
+ obj->state = DUK_HTHREAD_STATE_INACTIVE;
+#if defined(DUK_USE_ROM_STRINGS)
+ /* Nothing to initialize, strs[] is in ROM. */
+#else
+#if defined(DUK_USE_HEAPPTR16)
+ obj->strs16 = thr->strs16;
+#else
+ obj->strs = thr->strs;
+#endif
+#endif
+ DUK_DDD(DUK_DDDPRINT("created thread object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags));
+
+ /* make the new thread reachable */
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);
+ DUK_HTHREAD_INCREF(thr, obj);
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ thr->valstack_top++;
+
+ /* important to do this *after* pushing, to make the thread reachable for gc */
+ if (DUK_UNLIKELY(!duk_hthread_init_stacks(thr->heap, obj))) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+
+ /* initialize built-ins - either by copying or creating new ones */
+ if (flags & DUK_THREAD_NEW_GLOBAL_ENV) {
+ duk_hthread_create_builtin_objects(obj);
+ } else {
+ duk_hthread_copy_builtin_objects(thr, obj);
+ }
+
+ /* default prototype */
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, obj->builtins[DUK_BIDX_THREAD_PROTOTYPE]);
+
+ /* Initial stack size satisfies the stack slack constraints so there
+ * is no need to require stack here.
+ */
+ DUK_ASSERT(DUK_VALSTACK_INITIAL_SIZE >=
+ DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);
+
+ return ret;
+}
+
+DUK_INTERNAL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr) {
+ duk_hcompfunc *obj;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK__CHECK_SPACE();
+
+ /* Template functions are not strictly constructable (they don't
+ * have a "prototype" property for instance), so leave the
+ * DUK_HOBJECT_FLAG_CONSRUCTABLE flag cleared here.
+ */
+
+ obj = duk_hcompfunc_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_CALLABLE |
+ DUK_HOBJECT_FLAG_COMPFUNC |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION));
+ if (DUK_UNLIKELY(obj == NULL)) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("created compiled function object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags));
+
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);
+ DUK_HOBJECT_INCREF(thr, obj);
+ thr->valstack_top++;
+
+ /* default prototype */
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL);
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+
+ return obj;
+}
+
+DUK_INTERNAL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr) {
+ duk_hboundfunc *obj;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK__CHECK_SPACE();
+ obj = duk_hboundfunc_alloc(thr->heap,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BOUNDFUNC |
+ DUK_HOBJECT_FLAG_CONSTRUCTABLE |
+ DUK_HOBJECT_FLAG_CALLABLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION));
+ if (!obj) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+
+ tv_slot = thr->valstack_top++;
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);
+ DUK_HOBJECT_INCREF(thr, obj);
+
+ /* Prototype is left as NULL because the caller always sets it (and
+ * it depends on the target function).
+ */
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL);
+
+ return obj;
+}
+
+DUK_LOCAL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx) {
+ duk_hnatfunc *obj;
+ duk_idx_t ret;
+ duk_tval *tv_slot;
+ duk_int16_t func_nargs;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ DUK__CHECK_SPACE();
+
+ if (DUK_UNLIKELY(func == NULL)) {
+ goto api_error;
+ }
+ if (nargs >= 0 && nargs < DUK_HNATFUNC_NARGS_MAX) {
+ func_nargs = (duk_int16_t) nargs;
+ } else if (nargs == DUK_VARARGS) {
+ func_nargs = DUK_HNATFUNC_NARGS_VARARGS;
+ } else {
+ goto api_error;
+ }
+
+ obj = duk_hnatfunc_alloc(thr, flags);
+ DUK_ASSERT(obj != NULL);
+
+ obj->func = func;
+ obj->nargs = func_nargs;
+
+ DUK_DDD(DUK_DDDPRINT("created native function object with flags: 0x%08lx, nargs=%ld",
+ (unsigned long) obj->obj.hdr.h_flags, (long) obj->nargs));
+
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);
+ DUK_HOBJECT_INCREF(thr, obj);
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ thr->valstack_top++;
+
+ DUK_ASSERT_BIDX_VALID(proto_bidx);
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[proto_bidx]);
+ return ret;
+
+ api_error:
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return 0; /* not reached */
+}
+
+DUK_EXTERNAL duk_idx_t duk_push_c_function(duk_hthread *thr, duk_c_function func, duk_int_t nargs) {
+ duk_uint_t flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_CONSTRUCTABLE |
+ DUK_HOBJECT_FLAG_CALLABLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_NATFUNC |
+ DUK_HOBJECT_FLAG_NEWENV |
+ DUK_HOBJECT_FLAG_STRICT |
+ DUK_HOBJECT_FLAG_NOTAIL |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);
+
+ /* Default prototype is a Duktape specific %NativeFunctionPrototype%
+ * which provides .length and .name getters.
+ */
+ return duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE);
+}
+
+DUK_INTERNAL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs) {
+ duk_uint_t flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_CONSTRUCTABLE |
+ DUK_HOBJECT_FLAG_CALLABLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_NATFUNC |
+ DUK_HOBJECT_FLAG_NEWENV |
+ DUK_HOBJECT_FLAG_STRICT |
+ DUK_HOBJECT_FLAG_NOTAIL |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);
+
+ /* Must use Function.prototype for standard built-in functions. */
+ (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE);
+}
+
+DUK_INTERNAL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs) {
+ duk_uint_t flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_CALLABLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_NATFUNC |
+ DUK_HOBJECT_FLAG_NEWENV |
+ DUK_HOBJECT_FLAG_STRICT |
+ DUK_HOBJECT_FLAG_NOTAIL |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);
+
+ /* Must use Function.prototype for standard built-in functions. */
+ (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE);
+}
+
+DUK_EXTERNAL duk_idx_t duk_push_c_lightfunc(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic) {
+ duk_small_uint_t lf_flags;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK__CHECK_SPACE();
+
+ if (nargs >= DUK_LFUNC_NARGS_MIN && nargs <= DUK_LFUNC_NARGS_MAX) {
+ /* as is */
+ } else if (nargs == DUK_VARARGS) {
+ nargs = DUK_LFUNC_NARGS_VARARGS;
+ } else {
+ goto api_error;
+ }
+ if (DUK_UNLIKELY(!(length >= DUK_LFUNC_LENGTH_MIN && length <= DUK_LFUNC_LENGTH_MAX))) {
+ goto api_error;
+ }
+ if (DUK_UNLIKELY(!(magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX))) {
+ goto api_error;
+ }
+
+ lf_flags = DUK_LFUNC_FLAGS_PACK((duk_small_int_t) magic, (duk_small_uint_t) length, (duk_small_uint_t) nargs);
+ tv_slot = thr->valstack_top++;
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_slot));
+ DUK_TVAL_SET_LIGHTFUNC(tv_slot, func, lf_flags);
+ DUK_ASSERT(tv_slot >= thr->valstack_bottom);
+ return (duk_idx_t) (tv_slot - thr->valstack_bottom);
+
+ api_error:
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return 0; /* not reached */
+}
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) {
+ duk_hbufobj *obj;
+ duk_tval *tv_slot;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(prototype_bidx >= 0);
+
+ DUK__CHECK_SPACE();
+
+ obj = duk_hbufobj_alloc(thr, hobject_flags_and_class);
+ DUK_ASSERT(obj != NULL);
+
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[prototype_bidx]);
+ DUK_ASSERT_HBUFOBJ_VALID(obj);
+
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);
+ DUK_HOBJECT_INCREF(thr, obj);
+ thr->valstack_top++;
+
+ return obj;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/* XXX: There's quite a bit of overlap with buffer creation handling in
+ * duk_bi_buffer.c. Look for overlap and refactor.
+ */
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#define DUK__PACK_ARGS(classnum,protobidx,elemtype,elemshift,istypedarray) \
+ (((classnum) << 24) | ((protobidx) << 16) | ((elemtype) << 8) | ((elemshift) << 4) | (istypedarray))
+
+static const duk_uint32_t duk__bufobj_flags_lookup[] = {
+ /* Node.js Buffers are Uint8Array instances which inherit from Buffer.prototype. */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_ARRAYBUFFER, DUK_BIDX_ARRAYBUFFER_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_ARRAYBUFFER */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_NODEJS_BUFFER */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_DATAVIEW, DUK_BIDX_DATAVIEW_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_DATAVIEW */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT8ARRAY, DUK_BIDX_INT8ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT8, 0, 1), /* DUK_BUFOBJ_INT8ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_UINT8ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_UINT8ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8CLAMPED, 0, 1), /* DUK_BUFOBJ_UINT8CLAMPEDARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT16ARRAY, DUK_BIDX_INT16ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT16, 1, 1), /* DUK_BUFOBJ_INT16ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT16ARRAY, DUK_BIDX_UINT16ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT16, 1, 1), /* DUK_BUFOBJ_UINT16ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT32ARRAY, DUK_BIDX_INT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT32, 2, 1), /* DUK_BUFOBJ_INT32ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT32ARRAY, DUK_BIDX_UINT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT32, 2, 1), /* DUK_BUFOBJ_UINT32ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT32ARRAY, DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_FLOAT32, 2, 1), /* DUK_BUFOBJ_FLOAT32ARRAY */
+ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT64ARRAY, DUK_BIDX_FLOAT64ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_FLOAT64, 3, 1) /* DUK_BUFOBJ_FLOAT64ARRAY */
+};
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) {
+ duk_hbufobj *h_bufobj;
+ duk_hbuffer *h_val;
+ duk_hobject *h_arraybuf;
+ duk_uint32_t tmp;
+ duk_uint_t classnum;
+ duk_uint_t protobidx;
+ duk_uint_t lookupidx;
+ duk_uint_t uint_offset, uint_length, uint_added;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* The underlying types for offset/length in duk_hbufobj is
+ * duk_uint_t; make sure argument values fit.
+ */
+ uint_offset = (duk_uint_t) byte_offset;
+ uint_length = (duk_uint_t) byte_length;
+ if (sizeof(duk_size_t) != sizeof(duk_uint_t)) {
+ if (DUK_UNLIKELY((duk_size_t) uint_offset != byte_offset || (duk_size_t) uint_length != byte_length)) {
+ goto range_error;
+ }
+ }
+
+ DUK_ASSERT_DISABLE(flags >= 0); /* flags is unsigned */
+ lookupidx = flags;
+ if (DUK_UNLIKELY(lookupidx >= sizeof(duk__bufobj_flags_lookup) / sizeof(duk_uint32_t))) {
+ goto arg_error;
+ }
+ tmp = duk__bufobj_flags_lookup[lookupidx];
+ classnum = tmp >> 24;
+ protobidx = (tmp >> 16) & 0xff;
+
+ h_arraybuf = duk_get_hobject(thr, idx_buffer);
+ if (h_arraybuf != NULL && /* argument is an object */
+ flags != DUK_BUFOBJ_ARRAYBUFFER && /* creating a view */
+ DUK_HOBJECT_GET_CLASS_NUMBER(h_arraybuf) == DUK_HOBJECT_CLASS_ARRAYBUFFER /* argument is ArrayBuffer */) {
+ duk_uint_t tmp_offset;
+
+ DUK_ASSERT_HBUFOBJ_VALID((duk_hbufobj *) h_arraybuf);
+ h_val = ((duk_hbufobj *) h_arraybuf)->buf;
+ if (DUK_UNLIKELY(h_val == NULL)) {
+ goto arg_error;
+ }
+
+ tmp_offset = uint_offset + ((duk_hbufobj *) h_arraybuf)->offset;
+ if (DUK_UNLIKELY(tmp_offset < uint_offset)) {
+ goto range_error;
+ }
+ uint_offset = tmp_offset;
+
+ /* Note intentional difference to new TypedArray(): we allow
+ * caller to create an uncovered typed array (which is memory
+ * safe); new TypedArray() rejects it.
+ */
+ } else {
+ /* Handle unexpected object arguments here too, for nice error
+ * messages.
+ */
+ h_arraybuf = NULL;
+ h_val = duk_require_hbuffer(thr, idx_buffer);
+ }
+
+ /* Wrap check for offset+length. */
+ uint_added = uint_offset + uint_length;
+ if (DUK_UNLIKELY(uint_added < uint_offset)) {
+ goto range_error;
+ }
+ DUK_ASSERT(uint_added >= uint_offset && uint_added >= uint_length);
+
+ DUK_ASSERT(h_val != NULL);
+
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(classnum),
+ (duk_small_int_t) protobidx);
+ DUK_ASSERT(h_bufobj != NULL);
+
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ h_bufobj->buf_prop = h_arraybuf;
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, h_arraybuf);
+ h_bufobj->offset = uint_offset;
+ h_bufobj->length = uint_length;
+ h_bufobj->shift = (tmp >> 4) & 0x0f;
+ h_bufobj->elem_type = (tmp >> 8) & 0xff;
+ h_bufobj->is_typedarray = tmp & 0x0f;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ /* TypedArray views need an automatic ArrayBuffer which must be
+ * provided as .buffer property of the view. The ArrayBuffer is
+ * referenced via duk_hbufobj->buf_prop and an inherited .buffer
+ * accessor returns it. The ArrayBuffer is created lazily on first
+ * access if necessary so we don't need to do anything more here.
+ */
+ return;
+
+ range_error:
+ DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS);
+ return; /* not reached */
+
+ arg_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_ARGS);
+ return; /* not reached */
+}
+#else /* DUK_USE_BUFFEROBJECT_SUPPORT */
+DUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(idx_buffer);
+ DUK_UNREF(byte_offset);
+ DUK_UNREF(byte_length);
+ DUK_UNREF(flags);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+DUK_EXTERNAL duk_idx_t duk_push_error_object_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) {
+ duk_hobject *proto;
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ duk_small_uint_t augment_flags;
+#endif
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr != NULL);
+ DUK_UNREF(filename);
+ DUK_UNREF(line);
+
+ /* Error code also packs a tracedata related flag. */
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ augment_flags = 0;
+ if (err_code & DUK_ERRCODE_FLAG_NOBLAME_FILELINE) {
+ augment_flags = DUK_AUGMENT_FLAG_NOBLAME_FILELINE;
+ }
+#endif
+ err_code = err_code & (~DUK_ERRCODE_FLAG_NOBLAME_FILELINE);
+
+ /* error gets its 'name' from the prototype */
+ proto = duk_error_prototype_from_code(thr, err_code);
+ (void) duk_push_object_helper_proto(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR),
+ proto);
+
+ /* ... and its 'message' from an instance property */
+ if (fmt) {
+ duk_push_vsprintf(thr, fmt, ap);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC);
+ } else {
+ /* If no explicit message given, put error code into message field
+ * (as a number). This is not fully in keeping with the Ecmascript
+ * error model because messages are supposed to be strings (Error
+ * constructors use ToString() on their argument). However, it's
+ * probably more useful than having a separate 'code' property.
+ */
+ duk_push_int(thr, err_code);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC);
+ }
+
+ /* XXX: .code = err_code disabled, not sure if useful */
+
+ /* Creation time error augmentation */
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ /* filename may be NULL in which case file/line is not recorded */
+ duk_err_augment_error_create(thr, thr, filename, line, augment_flags); /* may throw an error */
+#endif
+
+ return duk_get_top_index_unsafe(thr);
+}
+
+DUK_EXTERNAL duk_idx_t duk_push_error_object_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) {
+ va_list ap;
+ duk_idx_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ va_start(ap, fmt);
+ ret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+#if !defined(DUK_USE_VARIADIC_MACROS)
+DUK_EXTERNAL duk_idx_t duk_push_error_object_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) {
+ const char *filename = duk_api_global_filename;
+ duk_int_t line = duk_api_global_line;
+ va_list ap;
+ duk_idx_t ret;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_api_global_filename = NULL;
+ duk_api_global_line = 0;
+ va_start(ap, fmt);
+ ret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+#endif /* DUK_USE_VARIADIC_MACROS */
+
+DUK_EXTERNAL void *duk_push_buffer_raw(duk_hthread *thr, duk_size_t size, duk_small_uint_t flags) {
+ duk_tval *tv_slot;
+ duk_hbuffer *h;
+ void *buf_data;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK__CHECK_SPACE();
+
+ /* Check for maximum buffer length. */
+ if (DUK_UNLIKELY(size > DUK_HBUFFER_MAX_BYTELEN)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG);
+ }
+
+ h = duk_hbuffer_alloc(thr->heap, size, flags, &buf_data);
+ if (DUK_UNLIKELY(h == NULL)) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+
+ tv_slot = thr->valstack_top;
+ DUK_TVAL_SET_BUFFER(tv_slot, h);
+ DUK_HBUFFER_INCREF(thr, h);
+ thr->valstack_top++;
+
+ return (void *) buf_data;
+}
+
+DUK_INTERNAL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_push_buffer_raw(thr, len, DUK_BUF_FLAG_NOZERO);
+}
+
+DUK_INTERNAL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len) {
+ void *ptr;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ ptr = duk_push_buffer_raw(thr, len, 0);
+#if !defined(DUK_USE_ZERO_BUFFER_DATA)
+ /* ES2015 requires zeroing even when DUK_USE_ZERO_BUFFER_DATA
+ * is not set.
+ */
+ DUK_MEMZERO((void *) ptr, (size_t) len);
+#endif
+ return ptr;
+}
+
+#if defined(DUK_USE_ES6_PROXY)
+DUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) {
+ duk_hobject *h_target;
+ duk_hobject *h_handler;
+ duk_hproxy *h_proxy;
+ duk_tval *tv_slot;
+ duk_uint_t flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(proxy_flags);
+
+ /* DUK__CHECK_SPACE() unnecessary because the Proxy is written to
+ * value stack in-place.
+ */
+#if 0
+ DUK__CHECK_SPACE();
+#endif
+
+ /* Reject a proxy object as the target because it would need
+ * special handling in property lookups. (ES2015 has no such
+ * restriction.)
+ */
+ h_target = duk_require_hobject_promote_mask(thr, -2, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ DUK_ASSERT(h_target != NULL);
+ if (DUK_HOBJECT_IS_PROXY(h_target)) {
+ goto fail_args;
+ }
+
+ /* Reject a proxy object as the handler because it would cause
+ * potentially unbounded recursion. (ES2015 has no such
+ * restriction.)
+ *
+ * There's little practical reason to use a lightfunc or a plain
+ * buffer as the handler table: one could only provide traps via
+ * their prototype objects (Function.prototype and ArrayBuffer.prototype).
+ * Even so, as lightfuncs and plain buffers mimic their object
+ * counterparts, they're promoted and accepted here.
+ */
+ h_handler = duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ DUK_ASSERT(h_handler != NULL);
+ if (DUK_HOBJECT_IS_PROXY(h_handler)) {
+ goto fail_args;
+ }
+
+ /* XXX: Proxy object currently has no prototype, so ToPrimitive()
+ * coercion fails which is a bit confusing.
+ */
+
+ /* CALLABLE and CONSTRUCTABLE flags are copied from the (initial)
+ * target, see ES2015 Sections 9.5.15 and 9.5.13.
+ */
+ flags = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h_target) &
+ (DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE);
+ flags |= DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ;
+ if (flags & DUK_HOBJECT_FLAG_CALLABLE) {
+ flags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION) |
+ DUK_HOBJECT_FLAG_SPECIAL_CALL;
+ } else {
+ flags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT);
+ }
+
+ h_proxy = duk_hproxy_alloc(thr, flags);
+ DUK_ASSERT(h_proxy != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_proxy) == NULL);
+
+ /* Initialize Proxy target and handler references; avoid INCREF
+ * by stealing the value stack refcounts via direct value stack
+ * manipulation. INCREF is needed for the Proxy itself however.
+ */
+ DUK_ASSERT(h_target != NULL);
+ h_proxy->target = h_target;
+ DUK_ASSERT(h_handler != NULL);
+ h_proxy->handler = h_handler;
+ DUK_ASSERT_HPROXY_VALID(h_proxy);
+
+ DUK_ASSERT(duk_get_hobject(thr, -2) == h_target);
+ DUK_ASSERT(duk_get_hobject(thr, -1) == h_handler);
+ tv_slot = thr->valstack_top - 2;
+ DUK_ASSERT(tv_slot >= thr->valstack_bottom);
+ DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) h_proxy);
+ DUK_HOBJECT_INCREF(thr, (duk_hobject *) h_proxy);
+ tv_slot++;
+ DUK_TVAL_SET_UNDEFINED(tv_slot); /* [ ... target handler ] -> [ ... proxy undefined ] */
+ thr->valstack_top = tv_slot; /* -> [ ... proxy ] */
+
+ DUK_DD(DUK_DDPRINT("created Proxy: %!iT", duk_get_tval(thr, -1)));
+
+ return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom - 1);
+
+ fail_args:
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+}
+#else /* DUK_USE_ES6_PROXY */
+DUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(proxy_flags);
+ DUK_ERROR_UNSUPPORTED(thr);
+}
+#endif /* DUK_USE_ES6_PROXY */
+
+#if defined(DUK_USE_ASSERTIONS)
+DUK_LOCAL void duk__validate_push_heapptr(duk_hthread *thr, void *ptr) {
+ duk_heaphdr *h;
+ duk_heaphdr *curr;
+ duk_bool_t found = 0;
+
+ h = (duk_heaphdr *) ptr;
+ if (h == NULL) {
+ /* Allowed. */
+ return;
+ }
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));
+
+ /* One particular problem case is where an object has been
+ * queued for finalization but the finalizer hasn't yet been
+ * executed.
+ *
+ * Corner case: we're running in a finalizer for object X, and
+ * user code calls duk_push_heapptr() for X itself. In this
+ * case X will be in finalize_list, and we can detect the case
+ * by seeing that X's FINALIZED flag is set (which is done before
+ * the finalizer starts executing).
+ */
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ for (curr = thr->heap->finalize_list;
+ curr != NULL;
+ curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) {
+ /* FINALIZABLE is set for all objects on finalize_list
+ * except for an object being finalized right now. So
+ * can't assert here.
+ */
+#if 0
+ DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr));
+#endif
+
+ if (curr == h) {
+ if (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h)) {
+ /* Object is currently being finalized. */
+ DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */
+ found = 1;
+ } else {
+ /* Not being finalized but on finalize_list,
+ * allowed since Duktape 2.1.
+ */
+ DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */
+ found = 1;
+ }
+ }
+ }
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Because refzero_list is now processed to completion inline with
+ * no side effects, it's always empty here.
+ */
+ DUK_ASSERT(thr->heap->refzero_list == NULL);
+#endif
+
+ /* If not present in finalize_list (or refzero_list), it
+ * must be either in heap_allocated or the string table.
+ */
+ if (DUK_HEAPHDR_IS_STRING(h)) {
+ duk_uint32_t i;
+ duk_hstring *str;
+ duk_heap *heap = thr->heap;
+
+ DUK_ASSERT(found == 0);
+ for (i = 0; i < heap->st_size; i++) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ str = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]);
+#else
+ str = heap->strtable[i];
+#endif
+ while (str != NULL) {
+ if (str == (duk_hstring *) h) {
+ DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */
+ found = 1;
+ break;
+ }
+ str = str->hdr.h_next;
+ }
+ }
+ DUK_ASSERT(found != 0);
+ } else {
+ for (curr = thr->heap->heap_allocated;
+ curr != NULL;
+ curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) {
+ if (curr == h) {
+ DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */
+ found = 1;
+ }
+ }
+ DUK_ASSERT(found != 0);
+ }
+}
+#endif /* DUK_USE_ASSERTIONS */
+
+DUK_EXTERNAL duk_idx_t duk_push_heapptr(duk_hthread *thr, void *ptr) {
+ duk_idx_t ret;
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Reviving an object using a heap pointer is a dangerous API
+ * operation: if the application doesn't guarantee that the
+ * pointer target is always reachable, difficult-to-diagnose
+ * problems may ensue. Try to validate the 'ptr' argument to
+ * the extent possible.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ duk__validate_push_heapptr(thr, ptr);
+#endif
+
+ DUK__CHECK_SPACE();
+
+ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ tv = thr->valstack_top++;
+
+ if (ptr == NULL) {
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));
+ return ret;
+ }
+
+ DUK_ASSERT_HEAPHDR_VALID((duk_heaphdr *) ptr);
+
+ /* If the argument is on finalize_list it has technically been
+ * unreachable before duk_push_heapptr() but it's still safe to
+ * push it. Starting from Duktape 2.1 allow application code to
+ * do so. There are two main cases:
+ *
+ * (1) The object is on the finalize_list and we're called by
+ * the finalizer for the object being finalized. In this
+ * case do nothing: finalize_list handling will deal with
+ * the object queueing. This is detected by the object not
+ * having a FINALIZABLE flag despite being on the finalize_list;
+ * the flag is cleared for the object being finalized only.
+ *
+ * (2) The object is on the finalize_list but is not currently
+ * being processed. In this case the object can be queued
+ * back to heap_allocated with a few flags cleared, in effect
+ * cancelling the finalizer.
+ */
+ if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) ptr))) {
+ duk_heaphdr *curr;
+
+ DUK_D(DUK_DPRINT("duk_push_heapptr() with a pointer on finalize_list, autorescue"));
+
+ curr = (duk_heaphdr *) ptr;
+ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr);
+
+ /* Because FINALIZED is set prior to finalizer call, it will
+ * be set for the object being currently finalized, but not
+ * for other objects on finalize_list.
+ */
+ DUK_HEAPHDR_CLEAR_FINALIZED(curr);
+
+ /* Dequeue object from finalize_list and queue it back to
+ * heap_allocated.
+ */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); /* Preincremented on finalize_list insert. */
+ DUK_HEAPHDR_PREDEC_REFCOUNT(curr);
+#endif
+ DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(thr->heap, curr);
+ DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(thr->heap, curr);
+
+ /* Continue with the rest. */
+ }
+
+ switch (DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr)) {
+ case DUK_HTYPE_STRING:
+ DUK_TVAL_SET_STRING(tv, (duk_hstring *) ptr);
+ break;
+ case DUK_HTYPE_OBJECT:
+ DUK_TVAL_SET_OBJECT(tv, (duk_hobject *) ptr);
+ break;
+ default:
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr) == DUK_HTYPE_BUFFER);
+ DUK_TVAL_SET_BUFFER(tv, (duk_hbuffer *) ptr);
+ break;
+ }
+
+ DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) ptr);
+
+ return ret;
+}
+
+/* Push object with no prototype, i.e. a "bare" object. */
+DUK_EXTERNAL duk_idx_t duk_push_bare_object(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),
+ -1); /* no prototype */
+ return duk_get_top_index_unsafe(thr);
+}
+
+DUK_INTERNAL void duk_push_hstring(duk_hthread *thr, duk_hstring *h) {
+ duk_tval tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(h != NULL);
+
+ DUK_TVAL_SET_STRING(&tv, h);
+ duk_push_tval(thr, &tv);
+}
+
+DUK_INTERNAL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));
+}
+
+DUK_INTERNAL void duk_push_hstring_empty(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, DUK_STRIDX_EMPTY_STRING));
+}
+
+DUK_INTERNAL void duk_push_hobject(duk_hthread *thr, duk_hobject *h) {
+ duk_tval tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(h != NULL);
+
+ DUK_TVAL_SET_OBJECT(&tv, h);
+ duk_push_tval(thr, &tv);
+}
+
+DUK_INTERNAL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h) {
+ duk_tval tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(h != NULL);
+
+ DUK_TVAL_SET_BUFFER(&tv, h);
+ duk_push_tval(thr, &tv);
+}
+
+DUK_INTERNAL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(builtin_idx >= 0 && builtin_idx < DUK_NUM_BUILTINS);
+ DUK_ASSERT(thr->builtins[builtin_idx] != NULL);
+
+ duk_push_hobject(thr, thr->builtins[builtin_idx]);
+}
+
+/*
+ * Poppers
+ */
+
+DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_n_unsafe_raw(duk_hthread *thr, duk_idx_t count) {
+ duk_tval *tv;
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_tval *tv_end;
+#endif
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(count >= 0);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count);
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ tv = thr->valstack_top;
+ tv_end = tv - count;
+ while (tv != tv_end) {
+ tv--;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);
+ }
+ thr->valstack_top = tv;
+ DUK_REFZERO_CHECK_FAST(thr);
+#else
+ tv = thr->valstack_top;
+ while (count > 0) {
+ count--;
+ tv--;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_TVAL_SET_UNDEFINED(tv);
+ }
+ thr->valstack_top = tv;
+#endif
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+
+DUK_EXTERNAL void duk_pop_n(duk_hthread *thr, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+
+ if (DUK_UNLIKELY((duk_uidx_t) (thr->valstack_top - thr->valstack_bottom) < (duk_uidx_t) count)) {
+ DUK_ERROR_RANGE_INVALID_COUNT(thr);
+ return;
+ }
+ DUK_ASSERT(count >= 0);
+
+ duk__pop_n_unsafe_raw(thr, count);
+}
+
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n(thr, count);
+}
+#else /* DUK_USE_PREFER_SIZE */
+DUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk__pop_n_unsafe_raw(thr, count);
+}
+#endif /* DUK_USE_PREFER_SIZE */
+
+/* Pop N elements without DECREF (in effect "stealing" any actual refcounts). */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+DUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(count >= 0);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count);
+
+ tv = thr->valstack_top;
+ while (count > 0) {
+ count--;
+ tv--;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_TVAL_SET_UNDEFINED(tv);
+ }
+ thr->valstack_top = tv;
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+#else /* DUK_USE_REFERENCE_COUNTING */
+DUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_unsafe(thr, count);
+}
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+/* Popping one element is called so often that when footprint is not an issue,
+ * compile a specialized function for it.
+ */
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_EXTERNAL void duk_pop(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n(thr, 1);
+}
+DUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_unsafe(thr, 1);
+}
+DUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_nodecref_unsafe(thr, 1);
+}
+#else /* DUK_USE_PREFER_SIZE */
+DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_unsafe_raw(duk_hthread *thr) {
+ duk_tval *tv;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(thr->valstack_top != thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1);
+
+ tv = --thr->valstack_top;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */
+#else
+ DUK_TVAL_SET_UNDEFINED(tv);
+#endif
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+DUK_EXTERNAL void duk_pop(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ if (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) {
+ DUK_ERROR_RANGE_INVALID_COUNT(thr);
+ }
+
+ duk__pop_unsafe_raw(thr);
+}
+DUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk__pop_unsafe_raw(thr);
+}
+DUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->valstack_top != thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1);
+
+ tv = --thr->valstack_top;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+ DUK_TVAL_SET_UNDEFINED(tv);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+#endif /* !DUK_USE_PREFER_SIZE */
+
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_nodecref_unsafe(thr);
+}
+#else /* DUK_USE_PREFER_SIZE */
+DUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->valstack_top != thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1);
+
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1));
+ thr->valstack_top--;
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+#endif /* !DUK_USE_PREFER_SIZE */
+
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_EXTERNAL void duk_pop_2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n(thr, 2);
+}
+DUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_unsafe(thr, 2);
+}
+DUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_nodecref_unsafe(thr, 2);
+}
+#else
+DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_2_unsafe_raw(duk_hthread *thr) {
+ duk_tval *tv;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(thr->valstack_top != thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2);
+
+ tv = --thr->valstack_top;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */
+#else
+ DUK_TVAL_SET_UNDEFINED(tv);
+#endif
+ tv = --thr->valstack_top;
+ DUK_ASSERT(tv >= thr->valstack_bottom);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */
+#else
+ DUK_TVAL_SET_UNDEFINED(tv);
+#endif
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+DUK_EXTERNAL void duk_pop_2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ if (DUK_UNLIKELY(thr->valstack_top - 2 < thr->valstack_bottom)) {
+ DUK_ERROR_RANGE_INVALID_COUNT(thr);
+ }
+
+ duk__pop_2_unsafe_raw(thr);
+}
+DUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk__pop_2_unsafe_raw(thr);
+}
+DUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->valstack_top != thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2);
+
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1));
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 2));
+ thr->valstack_top -= 2;
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+}
+#endif /* !DUK_USE_PREFER_SIZE */
+
+DUK_EXTERNAL void duk_pop_3(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n(thr, 3);
+}
+
+DUK_INTERNAL void duk_pop_3_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_unsafe(thr, 3);
+}
+
+DUK_INTERNAL void duk_pop_3_nodecref_unsafe(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_pop_n_nodecref_unsafe(thr, 3);
+}
+
+/*
+ * Pack and unpack (pack value stack entries into an array and vice versa)
+ */
+
+/* XXX: pack index range? array index offset? */
+DUK_INTERNAL void duk_pack(duk_hthread *thr, duk_idx_t count) {
+ duk_tval *tv_src;
+ duk_tval *tv_dst;
+ duk_tval *tv_curr;
+ duk_tval *tv_limit;
+ duk_idx_t top;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ top = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ DUK_ASSERT(top >= 0);
+ if (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) top)) {
+ /* Also handles negative count. */
+ DUK_ERROR_RANGE_INVALID_COUNT(thr);
+ return;
+ }
+ DUK_ASSERT(count >= 0);
+
+ /* Wrapping is controlled by the check above: value stack top can be
+ * at most DUK_USE_VALSTACK_LIMIT which is low enough so that
+ * multiplying with sizeof(duk_tval) won't wrap.
+ */
+ DUK_ASSERT(count >= 0 && count <= (duk_idx_t) DUK_USE_VALSTACK_LIMIT);
+ DUK_ASSERT((duk_size_t) count <= DUK_SIZE_MAX / sizeof(duk_tval)); /* no wrapping */
+
+ tv_dst = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count); /* XXX: uninitialized would be OK */
+ DUK_ASSERT(count == 0 || tv_dst != NULL);
+
+ /* Copy value stack values directly to the array part without
+ * any refcount updates: net refcount changes are zero.
+ */
+
+ tv_src = thr->valstack_top - count - 1;
+ DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, (size_t) count * sizeof(duk_tval));
+
+ /* Overwrite result array to final value stack location and wipe
+ * the rest; no refcount operations needed.
+ */
+
+ tv_dst = tv_src; /* when count == 0, same as tv_src (OK) */
+ tv_src = thr->valstack_top - 1;
+ DUK_TVAL_SET_TVAL(tv_dst, tv_src);
+
+ /* XXX: internal helper to wipe a value stack segment? */
+ tv_curr = tv_dst + 1;
+ tv_limit = thr->valstack_top;
+ while (tv_curr != tv_limit) {
+ /* Wipe policy: keep as 'undefined'. */
+ DUK_TVAL_SET_UNDEFINED(tv_curr);
+ tv_curr++;
+ }
+ thr->valstack_top = tv_dst + 1;
+}
+
+DUK_INTERNAL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv = duk_require_tval(thr, idx);
+ if (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv))) {
+ duk_hobject *h;
+ duk_uint32_t len;
+ duk_uint32_t i;
+
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ DUK_UNREF(h);
+
+#if defined(DUK_USE_ARRAY_FASTPATH) /* close enough */
+ if (DUK_LIKELY(DUK_HOBJECT_IS_ARRAY(h) &&
+ ((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h))) {
+ duk_harray *h_arr;
+ duk_tval *tv_src;
+ duk_tval *tv_dst;
+
+ h_arr = (duk_harray *) h;
+ len = h_arr->length;
+ if (DUK_UNLIKELY(len >= 0x80000000UL)) {
+ goto fail_over_2g;
+ }
+ duk_require_stack(thr, (duk_idx_t) len);
+
+ /* The potential allocation in duk_require_stack() may
+ * run a finalizer which modifies the argArray so that
+ * e.g. becomes sparse. So, we need to recheck that the
+ * array didn't change size and that there's still a
+ * valid backing array part.
+ *
+ * XXX: alternatively, could prevent finalizers for the
+ * duration.
+ */
+ if (DUK_UNLIKELY(len != h_arr->length ||
+ h_arr->length > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr))) {
+ goto skip_fast;
+ }
+
+ /* Main fast path: arguments array is almost always
+ * an actual array (though it might also be an arguments
+ * object).
+ */
+
+ DUK_DDD(DUK_DDDPRINT("fast path for %ld elements", (long) h_arr->length));
+ tv_src = DUK_HOBJECT_A_GET_BASE(thr->heap, h);
+ tv_dst = thr->valstack_top;
+ while (len-- > 0) {
+ DUK_ASSERT(tv_dst < thr->valstack_end);
+ if (DUK_UNLIKELY(DUK_TVAL_IS_UNUSED(tv_src))) {
+ /* Gaps are very unlikely. Skip over them,
+ * without an ancestor lookup (technically
+ * not compliant).
+ */
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_dst)); /* valstack policy */
+ } else {
+ DUK_TVAL_SET_TVAL(tv_dst, tv_src);
+ DUK_TVAL_INCREF(thr, tv_dst);
+ }
+ tv_src++;
+ tv_dst++;
+ }
+ DUK_ASSERT(tv_dst <= thr->valstack_end);
+ thr->valstack_top = tv_dst;
+ return (duk_idx_t) h_arr->length;
+ }
+ skip_fast:
+#endif /* DUK_USE_ARRAY_FASTPATH */
+
+ /* Slow path: actual lookups. The initial 'length' lookup
+ * decides the output length, regardless of side effects that
+ * may resize or change the argArray while we read the
+ * indices.
+ */
+ idx = duk_normalize_index(thr, idx);
+ duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);
+ len = duk_to_uint32(thr, -1); /* ToUint32() coercion required */
+ if (DUK_UNLIKELY(len >= 0x80000000UL)) {
+ goto fail_over_2g;
+ }
+ duk_pop_unsafe(thr);
+ DUK_DDD(DUK_DDDPRINT("slow path for %ld elements", (long) len));
+
+ duk_require_stack(thr, (duk_idx_t) len);
+ for (i = 0; i < len; i++) {
+ duk_get_prop_index(thr, idx, (duk_uarridx_t) i);
+ }
+ return (duk_idx_t) len;
+ } else if (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv)) {
+ return 0;
+ }
+
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ return 0;
+
+ fail_over_2g:
+ DUK_ERROR_RANGE_INVALID_LENGTH(thr);
+ return 0;
+}
+
+/*
+ * Error throwing
+ */
+
+DUK_EXTERNAL void duk_throw_raw(duk_hthread *thr) {
+ duk_tval *tv_val;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr->valstack_bottom >= thr->valstack);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_top);
+
+ if (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ /* Errors are augmented when they are created, not when they are
+ * thrown or re-thrown. The current error handler, however, runs
+ * just before an error is thrown.
+ */
+
+ /* Sync so that augmentation sees up-to-date activations, NULL
+ * thr->ptr_curr_pc so that it's not used if side effects occur
+ * in augmentation or longjmp handling.
+ */
+ duk_hthread_sync_and_null_currpc(thr);
+
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+ DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (before throw augment)", (duk_tval *) duk_get_tval(thr, -1)));
+ duk_err_augment_error_throw(thr);
+#endif
+ DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (after throw augment)", (duk_tval *) duk_get_tval(thr, -1)));
+
+ tv_val = DUK_GET_TVAL_NEGIDX(thr, -1);
+ duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, tv_val);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_err_check_debugger_integration(thr);
+#endif
+
+ /* thr->heap->lj.jmpbuf_ptr is checked by duk_err_longjmp() so we don't
+ * need to check that here. If the value is NULL, a fatal error occurs
+ * because we can't return.
+ */
+
+ duk_err_longjmp(thr);
+ DUK_UNREACHABLE();
+}
+
+DUK_EXTERNAL void duk_fatal_raw(duk_hthread *thr, const char *err_msg) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(thr->heap->fatal_func != NULL);
+
+ DUK_D(DUK_DPRINT("fatal error occurred: %s", err_msg ? err_msg : "NULL"));
+
+ /* fatal_func should be noreturn, but noreturn declarations on function
+ * pointers has a very spotty support apparently so it's not currently
+ * done.
+ */
+ thr->heap->fatal_func(thr->heap->heap_udata, err_msg);
+
+ /* If the fatal handler returns, all bets are off. It'd be nice to
+ * print something here but since we don't want to depend on stdio,
+ * there's no way to do so portably.
+ */
+ DUK_D(DUK_DPRINT("fatal error handler returned, all bets are off!"));
+ for (;;) {
+ /* loop forever, don't return (function marked noreturn) */
+ }
+}
+
+DUK_EXTERNAL void duk_error_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);
+ (void) duk_throw(thr);
+}
+
+DUK_EXTERNAL void duk_error_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) {
+ va_list ap;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ va_start(ap, fmt);
+ duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);
+ va_end(ap);
+ (void) duk_throw(thr);
+}
+
+#if !defined(DUK_USE_VARIADIC_MACROS)
+DUK_NORETURN(DUK_LOCAL_DECL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap));
+
+DUK_LOCAL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap) {
+ const char *filename;
+ duk_int_t line;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ filename = duk_api_global_filename;
+ line = duk_api_global_line;
+ duk_api_global_filename = NULL;
+ duk_api_global_line = 0;
+
+ duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);
+ (void) duk_throw(thr);
+}
+
+#define DUK__ERROR_STASH_SHARED(code) do { \
+ va_list ap; \
+ va_start(ap, fmt); \
+ duk__throw_error_from_stash(thr, (code), fmt, ap); \
+ va_end(ap); \
+ /* Never reached; if return 0 here, gcc/clang will complain. */ \
+ } while (0)
+
+DUK_EXTERNAL duk_ret_t duk_error_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(err_code);
+}
+DUK_EXTERNAL duk_ret_t duk_generic_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_ERROR);
+}
+DUK_EXTERNAL duk_ret_t duk_eval_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_EVAL_ERROR);
+}
+DUK_EXTERNAL duk_ret_t duk_range_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_RANGE_ERROR);
+}
+DUK_EXTERNAL duk_ret_t duk_reference_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_REFERENCE_ERROR);
+}
+DUK_EXTERNAL duk_ret_t duk_syntax_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_SYNTAX_ERROR);
+}
+DUK_EXTERNAL duk_ret_t duk_type_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_TYPE_ERROR);
+}
+DUK_EXTERNAL duk_ret_t duk_uri_error_stash(duk_hthread *thr, const char *fmt, ...) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK__ERROR_STASH_SHARED(DUK_ERR_URI_ERROR);
+}
+#endif /* DUK_USE_VARIADIC_MACROS */
+
+/*
+ * Comparison
+ */
+
+DUK_EXTERNAL duk_bool_t duk_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {
+ duk_tval *tv1, *tv2;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv1 = duk_get_tval(thr, idx1);
+ tv2 = duk_get_tval(thr, idx2);
+ if ((tv1 == NULL) || (tv2 == NULL)) {
+ return 0;
+ }
+
+ /* Coercion may be needed, the helper handles that by pushing the
+ * tagged values to the stack.
+ */
+ return duk_js_equals(thr, tv1, tv2);
+}
+
+DUK_EXTERNAL duk_bool_t duk_strict_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {
+ duk_tval *tv1, *tv2;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv1 = duk_get_tval(thr, idx1);
+ tv2 = duk_get_tval(thr, idx2);
+ if ((tv1 == NULL) || (tv2 == NULL)) {
+ return 0;
+ }
+
+ /* No coercions or other side effects, so safe */
+ return duk_js_strict_equals(tv1, tv2);
+}
+
+DUK_EXTERNAL duk_bool_t duk_samevalue(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {
+ duk_tval *tv1, *tv2;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ tv1 = duk_get_tval(thr, idx1);
+ tv2 = duk_get_tval(thr, idx2);
+ if ((tv1 == NULL) || (tv2 == NULL)) {
+ return 0;
+ }
+
+ /* No coercions or other side effects, so safe */
+ return duk_js_samevalue(tv1, tv2);
+}
+
+/*
+ * instanceof
+ */
+
+DUK_EXTERNAL duk_bool_t duk_instanceof(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {
+ duk_tval *tv1, *tv2;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* Index validation is strict, which differs from duk_equals().
+ * The strict behavior mimics how instanceof itself works, e.g.
+ * it is a TypeError if rval is not a -callable- object. It would
+ * be somewhat inconsistent if rval would be allowed to be
+ * non-existent without a TypeError.
+ */
+ tv1 = duk_require_tval(thr, idx1);
+ DUK_ASSERT(tv1 != NULL);
+ tv2 = duk_require_tval(thr, idx2);
+ DUK_ASSERT(tv2 != NULL);
+
+ return duk_js_instanceof(thr, tv1, tv2);
+}
+
+/*
+ * Lightfunc
+ */
+
+DUK_INTERNAL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) {
+ /* Lightfunc name, includes Duktape/C native function pointer, which
+ * can often be used to locate the function from a symbol table.
+ * The name also includes the 16-bit duk_tval flags field because it
+ * includes the magic value. Because a single native function often
+ * provides different functionality depending on the magic value, it
+ * seems reasonably to include it in the name.
+ *
+ * On the other hand, a complicated name increases string table
+ * pressure in low memory environments (but only when function name
+ * is accessed).
+ */
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk_push_sprintf(thr, "light_");
+ duk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func));
+ duk_push_sprintf(thr, "_%04x", (unsigned int) lf_flags);
+ duk_concat(thr, 3);
+}
+
+DUK_INTERNAL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv) {
+ duk_c_function func;
+ duk_small_uint_t lf_flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv));
+
+ DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);
+ duk_push_lightfunc_name_raw(thr, func, lf_flags);
+}
+
+DUK_INTERNAL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv) {
+ duk_c_function func;
+ duk_small_uint_t lf_flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv));
+
+ DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); /* read before 'tv' potentially invalidated */
+ duk_push_string(thr, "function ");
+ duk_push_lightfunc_name_raw(thr, func, lf_flags);
+ duk_push_string(thr, "() { [lightfunc code] }");
+ duk_concat(thr, 3);
+}
+
+/*
+ * Function pointers
+ *
+ * Printing function pointers is non-portable, so we do that by hex printing
+ * bytes from memory.
+ */
+
+DUK_INTERNAL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz) {
+ duk_uint8_t buf[32 * 2];
+ duk_uint8_t *p, *q;
+ duk_small_uint_t i;
+ duk_small_uint_t t;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(sz <= 32); /* sanity limit for function pointer size */
+
+ p = buf;
+#if defined(DUK_USE_INTEGER_LE)
+ q = ptr + sz;
+#else
+ q = ptr;
+#endif
+ for (i = 0; i < sz; i++) {
+#if defined(DUK_USE_INTEGER_LE)
+ t = *(--q);
+#else
+ t = *(q++);
+#endif
+ *p++ = duk_lc_digits[t >> 4];
+ *p++ = duk_lc_digits[t & 0x0f];
+ }
+
+ duk_push_lstring(thr, (const char *) buf, sz * 2);
+}
+
+/*
+ * Push readable string summarizing duk_tval. The operation is side effect
+ * free and will only throw from internal errors (e.g. out of memory).
+ * This is used by e.g. property access code to summarize a key/base safely,
+ * and is not intended to be fast (but small and safe).
+ */
+
+/* String limits for summary strings. */
+#define DUK__READABLE_SUMMARY_MAXCHARS 96 /* maximum supported by helper */
+#define DUK__READABLE_STRING_MAXCHARS 32 /* for strings/symbols */
+#define DUK__READABLE_ERRMSG_MAXCHARS 96 /* for error messages */
+
+/* String sanitizer which escapes ASCII control characters and a few other
+ * ASCII characters, passes Unicode as is, and replaces invalid UTF-8 with
+ * question marks. No errors are thrown for any input string, except in out
+ * of memory situations.
+ */
+DUK_LOCAL void duk__push_hstring_readable_unicode(duk_hthread *thr, duk_hstring *h_input, duk_small_uint_t maxchars) {
+ const duk_uint8_t *p, *p_start, *p_end;
+ duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH * DUK__READABLE_SUMMARY_MAXCHARS +
+ 2 /*quotes*/ + 3 /*periods*/];
+ duk_uint8_t *q;
+ duk_ucodepoint_t cp;
+ duk_small_uint_t nchars;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(h_input != NULL);
+ DUK_ASSERT(maxchars <= DUK__READABLE_SUMMARY_MAXCHARS);
+
+ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);
+ p = p_start;
+ q = buf;
+
+ nchars = 0;
+ *q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE;
+ for (;;) {
+ if (p >= p_end) {
+ break;
+ }
+ if (nchars == maxchars) {
+ *q++ = (duk_uint8_t) DUK_ASC_PERIOD;
+ *q++ = (duk_uint8_t) DUK_ASC_PERIOD;
+ *q++ = (duk_uint8_t) DUK_ASC_PERIOD;
+ break;
+ }
+ if (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) {
+ if (cp < 0x20 || cp == 0x7f || cp == DUK_ASC_SINGLEQUOTE || cp == DUK_ASC_BACKSLASH) {
+ DUK_ASSERT(DUK_UNICODE_MAX_XUTF8_LENGTH >= 4); /* estimate is valid */
+ DUK_ASSERT((cp >> 4) <= 0x0f);
+ *q++ = (duk_uint8_t) DUK_ASC_BACKSLASH;
+ *q++ = (duk_uint8_t) DUK_ASC_LC_X;
+ *q++ = (duk_uint8_t) duk_lc_digits[cp >> 4];
+ *q++ = (duk_uint8_t) duk_lc_digits[cp & 0x0f];
+ } else {
+ q += duk_unicode_encode_xutf8(cp, q);
+ }
+ } else {
+ p++; /* advance manually */
+ *q++ = (duk_uint8_t) DUK_ASC_QUESTION;
+ }
+ nchars++;
+ }
+ *q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE;
+
+ duk_push_lstring(thr, (const char *) buf, (duk_size_t) (q - buf));
+}
+
+DUK_LOCAL const char *duk__push_string_tval_readable(duk_hthread *thr, duk_tval *tv, duk_bool_t error_aware) {
+ DUK_ASSERT_CTX_VALID(thr);
+ /* 'tv' may be NULL */
+
+ if (tv == NULL) {
+ duk_push_string(thr, "none");
+ } else {
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_STRING: {
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv);
+ if (DUK_HSTRING_HAS_SYMBOL(h)) {
+ /* XXX: string summary produces question marks
+ * so this is not very ideal.
+ */
+ duk_push_string(thr, "[Symbol ");
+ duk_push_string(thr, duk__get_symbol_type_string(h));
+ duk_push_string(thr, " ");
+ duk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS);
+ duk_push_string(thr, "]");
+ duk_concat(thr, 5);
+ break;
+ }
+ duk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS);
+ break;
+ }
+ case DUK_TAG_OBJECT: {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ if (error_aware &&
+ duk_hobject_prototype_chain_contains(thr, h, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) {
+ /* Get error message in a side effect free way if
+ * possible; if not, summarize as a generic object.
+ * Error message currently gets quoted.
+ */
+ /* XXX: better internal getprop call; get without side effects
+ * but traverse inheritance chain.
+ */
+ duk_tval *tv_msg;
+ tv_msg = duk_hobject_find_existing_entry_tval_ptr(thr->heap, h, DUK_HTHREAD_STRING_MESSAGE(thr));
+ if (tv_msg != NULL && DUK_TVAL_IS_STRING(tv_msg)) {
+ /* It's critical to avoid recursion so
+ * only summarize a string .message.
+ */
+ duk__push_hstring_readable_unicode(thr, DUK_TVAL_GET_STRING(tv_msg), DUK__READABLE_ERRMSG_MAXCHARS);
+ break;
+ }
+ }
+ duk_push_class_string_tval(thr, tv);
+ break;
+ }
+ case DUK_TAG_BUFFER: {
+ /* While plain buffers mimic Uint8Arrays, they summarize differently.
+ * This is useful so that the summarized string accurately reflects the
+ * internal type which may matter for figuring out bugs etc.
+ */
+ /* XXX: Hex encoded, length limited buffer summary here? */
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h != NULL);
+ duk_push_sprintf(thr, "[buffer:%ld]", (long) DUK_HBUFFER_GET_SIZE(h));
+ break;
+ }
+ case DUK_TAG_POINTER: {
+ /* Surround with parentheses like in JX, ensures NULL pointer
+ * is distinguishable from null value ("(null)" vs "null").
+ */
+ duk_push_tval(thr, tv);
+ duk_push_sprintf(thr, "(%s)", duk_to_string(thr, -1));
+ duk_remove_m2(thr);
+ break;
+ }
+ default: {
+ duk_push_tval(thr, tv);
+ break;
+ }
+ }
+ }
+
+ return duk_to_string(thr, -1);
+}
+DUK_INTERNAL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__push_string_tval_readable(thr, tv, 0 /*error_aware*/);
+}
+
+DUK_INTERNAL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk_push_string_tval_readable(thr, duk_get_tval(thr, idx));
+}
+
+DUK_INTERNAL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv) {
+ DUK_ASSERT_API_ENTRY(thr);
+ return duk__push_string_tval_readable(thr, tv, 1 /*error_aware*/);
+}
+
+DUK_INTERNAL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h) {
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_end;
+ const duk_uint8_t *q;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* .toString() */
+ duk_push_string(thr, "Symbol(");
+ p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);
+ p_end = p + DUK_HSTRING_GET_BYTELEN(h);
+ DUK_ASSERT(p[0] == 0xff || (p[0] & 0xc0) == 0x80);
+ p++;
+ for (q = p; q < p_end; q++) {
+ if (*q == 0xffU) {
+ /* Terminate either at end-of-string (but NUL MUST
+ * be accepted without terminating description) or
+ * 0xFF, which is used to mark start of unique trailer
+ * (and cannot occur in CESU-8 / extended UTF-8).
+ */
+ break;
+ }
+ }
+ duk_push_lstring(thr, (const char *) p, (duk_size_t) (q - p));
+ duk_push_string(thr, ")");
+ duk_concat(thr, 3);
+}
+
+/*
+ * Functions
+ */
+
+#if 0 /* not used yet */
+DUK_INTERNAL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h) {
+ duk_c_function func;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h));
+
+ duk_push_sprintf(thr, "native_");
+ func = h->func;
+ duk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func));
+ duk_push_sprintf(thr, "_%04x_%04x",
+ (unsigned int) (duk_uint16_t) h->nargs,
+ (unsigned int) (duk_uint16_t) h->magic);
+ duk_concat(thr, 3);
+}
+#endif
+
+/*
+ * duk_tval slice copy
+ */
+
+DUK_INTERNAL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count) {
+ duk_tval *tv;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(thr);
+ DUK_ASSERT(count * sizeof(duk_tval) >= count); /* no wrap */
+ DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, count * sizeof(duk_tval));
+
+ tv = tv_dst;
+ while (count-- > 0) {
+ DUK_TVAL_INCREF(thr, tv);
+ tv++;
+ }
+}
+
+/* automatic undefs */
+#undef DUK__ASSERT_SPACE
+#undef DUK__CHECK_SPACE
+#undef DUK__ERROR_STASH_SHARED
+#undef DUK__PACK_ARGS
+#undef DUK__READABLE_ERRMSG_MAXCHARS
+#undef DUK__READABLE_STRING_MAXCHARS
+#undef DUK__READABLE_SUMMARY_MAXCHARS
+#line 1 "duk_api_string.c"
+/*
+ * String manipulation
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_LOCAL void duk__concat_and_join_helper(duk_hthread *thr, duk_idx_t count_in, duk_bool_t is_join) {
+ duk_uint_t count;
+ duk_uint_t i;
+ duk_size_t idx;
+ duk_size_t len;
+ duk_hstring *h;
+ duk_uint8_t *buf;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ if (DUK_UNLIKELY(count_in <= 0)) {
+ if (count_in < 0) {
+ DUK_ERROR_RANGE_INVALID_COUNT(thr);
+ return;
+ }
+ DUK_ASSERT(count_in == 0);
+ duk_push_hstring_empty(thr);
+ return;
+ }
+ count = (duk_uint_t) count_in;
+
+ if (is_join) {
+ duk_size_t t1, t2, limit;
+ h = duk_to_hstring(thr, -((duk_idx_t) count) - 1);
+ DUK_ASSERT(h != NULL);
+
+ /* A bit tricky overflow test, see doc/code-issues.rst. */
+ t1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h);
+ t2 = (duk_size_t) (count - 1);
+ limit = (duk_size_t) DUK_HSTRING_MAX_BYTELEN;
+ if (DUK_UNLIKELY(t2 != 0 && t1 > limit / t2)) {
+ /* Combined size of separators already overflows. */
+ goto error_overflow;
+ }
+ len = (duk_size_t) (t1 * t2);
+ } else {
+ len = (duk_size_t) 0;
+ }
+
+ for (i = count; i >= 1; i--) {
+ duk_size_t new_len;
+ h = duk_to_hstring(thr, -((duk_idx_t) i));
+ new_len = len + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h);
+
+ /* Impose a string maximum length, need to handle overflow
+ * correctly.
+ */
+ if (new_len < len || /* wrapped */
+ new_len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN) {
+ goto error_overflow;
+ }
+ len = new_len;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("join/concat %lu strings, total length %lu bytes",
+ (unsigned long) count, (unsigned long) len));
+
+ /* Use stack allocated buffer to ensure reachability in errors
+ * (e.g. intern error).
+ */
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len);
+ DUK_ASSERT(buf != NULL);
+
+ /* [ ... (sep) str1 str2 ... strN buf ] */
+
+ idx = 0;
+ for (i = count; i >= 1; i--) {
+ if (is_join && i != count) {
+ h = duk_require_hstring(thr, -((duk_idx_t) count) - 2); /* extra -1 for buffer */
+ DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));
+ idx += DUK_HSTRING_GET_BYTELEN(h);
+ }
+ h = duk_require_hstring(thr, -((duk_idx_t) i) - 1); /* extra -1 for buffer */
+ DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));
+ idx += DUK_HSTRING_GET_BYTELEN(h);
+ }
+
+ DUK_ASSERT(idx == len);
+
+ /* [ ... (sep) str1 str2 ... strN buf ] */
+
+ /* Get rid of the strings early to minimize memory use before intern. */
+
+ if (is_join) {
+ duk_replace(thr, -((duk_idx_t) count) - 2); /* overwrite sep */
+ duk_pop_n(thr, (duk_idx_t) count);
+ } else {
+ duk_replace(thr, -((duk_idx_t) count) - 1); /* overwrite str1 */
+ duk_pop_n(thr, (duk_idx_t) (count - 1));
+ }
+
+ /* [ ... buf ] */
+
+ (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */
+
+ /* [ ... res ] */
+ return;
+
+ error_overflow:
+ DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG);
+}
+
+DUK_EXTERNAL void duk_concat(duk_hthread *thr, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk__concat_and_join_helper(thr, count, 0 /*is_join*/);
+}
+
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_INTERNAL void duk_concat_2(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ duk_concat(thr, 2);
+}
+#else /* DUK_USE_PREFER_SIZE */
+DUK_INTERNAL void duk_concat_2(duk_hthread *thr) {
+ duk_hstring *h1;
+ duk_hstring *h2;
+ duk_uint8_t *buf;
+ duk_size_t len1;
+ duk_size_t len2;
+ duk_size_t len;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(duk_get_top(thr) >= 2); /* Trusted caller. */
+
+ h1 = duk_to_hstring(thr, -2);
+ h2 = duk_to_hstring(thr, -1);
+ len1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1);
+ len2 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2);
+ len = len1 + len2;
+ if (DUK_UNLIKELY(len < len1 || /* wrapped */
+ len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN)) {
+ goto error_overflow;
+ }
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len);
+ DUK_ASSERT(buf != NULL);
+
+ DUK_MEMCPY((void *) buf, (const void *) DUK_HSTRING_GET_DATA(h1), (size_t) len1);
+ DUK_MEMCPY((void *) (buf + len1), (const void *) DUK_HSTRING_GET_DATA(h2), (size_t) len2);
+ (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */
+
+ /* [ ... str1 str2 buf ] */
+
+ duk_replace(thr, -3);
+ duk_pop_unsafe(thr);
+ return;
+
+ error_overflow:
+ DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG);
+}
+#endif /* DUK_USE_PREFER_SIZE */
+
+DUK_EXTERNAL void duk_join(duk_hthread *thr, duk_idx_t count) {
+ DUK_ASSERT_API_ENTRY(thr);
+
+ duk__concat_and_join_helper(thr, count, 1 /*is_join*/);
+}
+
+/* XXX: could map/decode be unified with duk_unicode_support.c code?
+ * Case conversion needs also the character surroundings though.
+ */
+
+DUK_EXTERNAL void duk_decode_string(duk_hthread *thr, duk_idx_t idx, duk_decode_char_function callback, void *udata) {
+ duk_hstring *h_input;
+ const duk_uint8_t *p, *p_start, *p_end;
+ duk_codepoint_t cp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ h_input = duk_require_hstring(thr, idx); /* Accept symbols. */
+ DUK_ASSERT(h_input != NULL);
+
+ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);
+ p = p_start;
+
+ for (;;) {
+ if (p >= p_end) {
+ break;
+ }
+ cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end);
+ callback(udata, cp);
+ }
+}
+
+DUK_EXTERNAL void duk_map_string(duk_hthread *thr, duk_idx_t idx, duk_map_char_function callback, void *udata) {
+ duk_hstring *h_input;
+ duk_bufwriter_ctx bw_alloc;
+ duk_bufwriter_ctx *bw;
+ const duk_uint8_t *p, *p_start, *p_end;
+ duk_codepoint_t cp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_normalize_index(thr, idx);
+
+ h_input = duk_require_hstring(thr, idx); /* Accept symbols. */
+ DUK_ASSERT(h_input != NULL);
+
+ bw = &bw_alloc;
+ DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* Reasonable output estimate. */
+
+ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);
+ p = p_start;
+
+ for (;;) {
+ /* XXX: could write output in chunks with fewer ensure calls,
+ * but relative benefit would be small here.
+ */
+
+ if (p >= p_end) {
+ break;
+ }
+ cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end);
+ cp = callback(udata, cp);
+
+ DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp);
+ }
+
+ DUK_BW_COMPACT(thr, bw);
+ (void) duk_buffer_to_string(thr, -1); /* Safe, extended UTF-8 encoded. */
+ duk_replace(thr, idx);
+}
+
+DUK_EXTERNAL void duk_substring(duk_hthread *thr, duk_idx_t idx, duk_size_t start_offset, duk_size_t end_offset) {
+ duk_hstring *h;
+ duk_hstring *res;
+ duk_size_t start_byte_offset;
+ duk_size_t end_byte_offset;
+ duk_size_t charlen;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx); /* Accept symbols. */
+ h = duk_require_hstring(thr, idx);
+ DUK_ASSERT(h != NULL);
+
+ charlen = DUK_HSTRING_GET_CHARLEN(h);
+ if (end_offset >= charlen) {
+ end_offset = charlen;
+ }
+ if (start_offset > end_offset) {
+ start_offset = end_offset;
+ }
+
+ DUK_ASSERT_DISABLE(start_offset >= 0);
+ DUK_ASSERT(start_offset <= end_offset && start_offset <= DUK_HSTRING_GET_CHARLEN(h));
+ DUK_ASSERT_DISABLE(end_offset >= 0);
+ DUK_ASSERT(end_offset >= start_offset && end_offset <= DUK_HSTRING_GET_CHARLEN(h));
+
+ /* Guaranteed by string limits. */
+ DUK_ASSERT(start_offset <= DUK_UINT32_MAX);
+ DUK_ASSERT(end_offset <= DUK_UINT32_MAX);
+
+ start_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) start_offset);
+ end_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) end_offset);
+
+ DUK_ASSERT(end_byte_offset >= start_byte_offset);
+ DUK_ASSERT(end_byte_offset - start_byte_offset <= DUK_UINT32_MAX); /* Guaranteed by string limits. */
+
+ /* No size check is necessary. */
+ res = duk_heap_strtable_intern_checked(thr,
+ DUK_HSTRING_GET_DATA(h) + start_byte_offset,
+ (duk_uint32_t) (end_byte_offset - start_byte_offset));
+
+ duk_push_hstring(thr, res);
+ duk_replace(thr, idx);
+}
+
+/* XXX: this is quite clunky. Add Unicode helpers to scan backwards and
+ * forwards with a callback to process codepoints?
+ */
+DUK_EXTERNAL void duk_trim(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+ const duk_uint8_t *p, *p_start, *p_end, *p_tmp1, *p_tmp2; /* pointers for scanning */
+ const duk_uint8_t *q_start, *q_end; /* start (incl) and end (excl) of trimmed part */
+ duk_codepoint_t cp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ idx = duk_require_normalize_index(thr, idx); /* Accept symbols. */
+ h = duk_require_hstring(thr, idx);
+ DUK_ASSERT(h != NULL);
+
+ p_start = DUK_HSTRING_GET_DATA(h);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h);
+
+ p = p_start;
+ while (p < p_end) {
+ p_tmp1 = p;
+ cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp1, p_start, p_end);
+ if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) {
+ break;
+ }
+ p = p_tmp1;
+ }
+ q_start = p;
+ if (p == p_end) {
+ /* Entire string is whitespace. */
+ q_end = p;
+ goto scan_done;
+ }
+
+ p = p_end;
+ while (p > p_start) {
+ p_tmp1 = p;
+ while (p > p_start) {
+ p--;
+ if (((*p) & 0xc0) != 0x80) {
+ break;
+ }
+ }
+ p_tmp2 = p;
+
+ cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp2, p_start, p_end);
+ if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) {
+ p = p_tmp1;
+ break;
+ }
+ }
+ q_end = p;
+
+ scan_done:
+ /* This may happen when forward and backward scanning disagree
+ * (possible for non-extended-UTF-8 strings).
+ */
+ if (q_end < q_start) {
+ q_end = q_start;
+ }
+
+ DUK_ASSERT(q_start >= p_start && q_start <= p_end);
+ DUK_ASSERT(q_end >= p_start && q_end <= p_end);
+ DUK_ASSERT(q_end >= q_start);
+
+ DUK_DDD(DUK_DDDPRINT("trim: p_start=%p, p_end=%p, q_start=%p, q_end=%p",
+ (const void *) p_start, (const void *) p_end,
+ (const void *) q_start, (const void *) q_end));
+
+ if (q_start == p_start && q_end == p_end) {
+ DUK_DDD(DUK_DDDPRINT("nothing was trimmed: avoid interning (hashing etc)"));
+ return;
+ }
+
+ duk_push_lstring(thr, (const char *) q_start, (duk_size_t) (q_end - q_start));
+ duk_replace(thr, idx);
+}
+
+DUK_EXTERNAL duk_codepoint_t duk_char_code_at(duk_hthread *thr, duk_idx_t idx, duk_size_t char_offset) {
+ duk_hstring *h;
+ duk_ucodepoint_t cp;
+
+ DUK_ASSERT_API_ENTRY(thr);
+
+ /* XXX: Share code with String.prototype.charCodeAt? Main difference
+ * is handling of clamped offsets.
+ */
+
+ h = duk_require_hstring(thr, idx); /* Accept symbols. */
+ DUK_ASSERT(h != NULL);
+
+ DUK_ASSERT_DISABLE(char_offset >= 0); /* Always true, arg is unsigned. */
+ if (char_offset >= DUK_HSTRING_GET_CHARLEN(h)) {
+ return 0;
+ }
+
+ DUK_ASSERT(char_offset <= DUK_UINT_MAX); /* Guaranteed by string limits. */
+ cp = duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) char_offset, 0 /*surrogate_aware*/);
+ return (duk_codepoint_t) cp;
+}
+#line 1 "duk_api_time.c"
+/*
+ * Date/time.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr) {
+ /* Ecmascript time, with millisecond fractions. Exposed via
+ * duk_get_now() for example.
+ */
+ DUK_UNREF(thr);
+ return (duk_double_t) DUK_USE_DATE_GET_NOW(thr);
+}
+
+DUK_INTERNAL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr) {
+ /* Ecmascript time without millisecond fractions. Exposed via
+ * the Date built-in which doesn't allow fractions.
+ */
+ DUK_UNREF(thr);
+ return (duk_double_t) DUK_FLOOR(DUK_USE_DATE_GET_NOW(thr));
+}
+
+DUK_INTERNAL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr) {
+ DUK_UNREF(thr);
+#if defined(DUK_USE_GET_MONOTONIC_TIME)
+ return (duk_double_t) DUK_USE_GET_MONOTONIC_TIME(thr);
+#else
+ return (duk_double_t) DUK_USE_DATE_GET_NOW(thr);
+#endif
+}
+
+DUK_EXTERNAL duk_double_t duk_get_now(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(thr);
+
+ /* This API intentionally allows millisecond fractions. */
+ return duk_time_get_ecmascript_time(thr);
+}
+
+#if 0 /* XXX: worth exposing? */
+DUK_EXTERNAL duk_double_t duk_get_monotonic_time(duk_hthread *thr) {
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_UNREF(thr);
+
+ return duk_time_get_monotonic_time(thr);
+}
+#endif
+
+DUK_EXTERNAL void duk_time_to_components(duk_hthread *thr, duk_double_t timeval, duk_time_components *comp) {
+ duk_int_t parts[DUK_DATE_IDX_NUM_PARTS];
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ duk_uint_t flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(comp != NULL); /* XXX: or check? */
+ DUK_UNREF(thr);
+
+ /* Convert as one-based, but change month to zero-based to match the
+ * Ecmascript Date built-in behavior 1:1.
+ */
+ flags = DUK_DATE_FLAG_ONEBASED | DUK_DATE_FLAG_NAN_TO_ZERO;
+
+ duk_bi_date_timeval_to_parts(timeval, parts, dparts, flags);
+
+ /* XXX: sub-millisecond accuracy for the API */
+
+ DUK_ASSERT(dparts[DUK_DATE_IDX_MONTH] >= 1.0 && dparts[DUK_DATE_IDX_MONTH] <= 12.0);
+ comp->year = dparts[DUK_DATE_IDX_YEAR];
+ comp->month = dparts[DUK_DATE_IDX_MONTH] - 1.0;
+ comp->day = dparts[DUK_DATE_IDX_DAY];
+ comp->hours = dparts[DUK_DATE_IDX_HOUR];
+ comp->minutes = dparts[DUK_DATE_IDX_MINUTE];
+ comp->seconds = dparts[DUK_DATE_IDX_SECOND];
+ comp->milliseconds = dparts[DUK_DATE_IDX_MILLISECOND];
+ comp->weekday = dparts[DUK_DATE_IDX_WEEKDAY];
+}
+
+DUK_EXTERNAL duk_double_t duk_components_to_time(duk_hthread *thr, duk_time_components *comp) {
+ duk_double_t d;
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ duk_uint_t flags;
+
+ DUK_ASSERT_API_ENTRY(thr);
+ DUK_ASSERT(comp != NULL); /* XXX: or check? */
+ DUK_UNREF(thr);
+
+ /* Match Date constructor behavior (with UTC time). Month is given
+ * as zero-based. Day-of-month is given as one-based so normalize
+ * it to zero-based as the internal conversion helpers expects all
+ * components to be zero-based.
+ */
+ flags = 0;
+
+ /* XXX: expensive conversion; use array format in API instead, or unify
+ * time provider and time API to use same struct?
+ */
+
+ dparts[DUK_DATE_IDX_YEAR] = comp->year;
+ dparts[DUK_DATE_IDX_MONTH] = comp->month;
+ dparts[DUK_DATE_IDX_DAY] = comp->day - 1.0;
+ dparts[DUK_DATE_IDX_HOUR] = comp->hours;
+ dparts[DUK_DATE_IDX_MINUTE] = comp->minutes;
+ dparts[DUK_DATE_IDX_SECOND] = comp->seconds;
+ dparts[DUK_DATE_IDX_MILLISECOND] = comp->milliseconds;
+ dparts[DUK_DATE_IDX_WEEKDAY] = 0; /* ignored */
+
+ d = duk_bi_date_get_timeval_from_dparts(dparts, flags);
+
+ return d;
+}
+#line 1 "duk_bi_array.c"
+/*
+ * Array built-ins
+ *
+ * Most Array built-ins are intentionally generic in Ecmascript, and are
+ * intended to work even when the 'this' binding is not an Array instance.
+ * This Ecmascript feature is also used by much real world code. For this
+ * reason the implementations here don't assume exotic Array behavior or
+ * e.g. presence of a .length property. However, some algorithms have a
+ * fast path for duk_harray backed actual Array instances, enabled when
+ * footprint is not a concern.
+ *
+ * XXX: the "Throw" flag should be set for (almost?) all [[Put]] and
+ * [[Delete]] operations, but it's currently false throughout. Go through
+ * all put/delete cases and check throw flag use. Need a new API primitive
+ * which allows throws flag to be specified.
+ *
+ * XXX: array lengths above 2G won't work reliably. There are many places
+ * where one needs a full signed 32-bit range ([-0xffffffff, 0xffffffff],
+ * i.e. -33- bits). Although array 'length' cannot be written to be outside
+ * the unsigned 32-bit range (E5.1 Section 15.4.5.1 throws a RangeError if so)
+ * some intermediate values may be above 0xffffffff and this may not be always
+ * correctly handled now (duk_uint32_t is not enough for all algorithms).
+ * For instance, push() can legitimately write entries beyond length 0xffffffff
+ * and cause a RangeError only at the end. To do this properly, the current
+ * push() implementation tracks the array index using a 'double' instead of a
+ * duk_uint32_t (which is somewhat awkward). See test-bi-array-push-maxlen.js.
+ *
+ * On using "put" vs. "def" prop
+ * =============================
+ *
+ * Code below must be careful to use the appropriate primitive as it matters
+ * for compliance. When using "put" there may be inherited properties in
+ * Array.prototype which cause side effects when values are written. When
+ * using "define" there are no such side effects, and many test262 test cases
+ * check for this (for real world code, such side effects are very rare).
+ * Both "put" and "define" are used in the E5.1 specification; as a rule,
+ * "put" is used when modifying an existing array (or a non-array 'this'
+ * binding) and "define" for setting values into a fresh result array.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Perform an intermediate join when this many elements have been pushed
+ * on the value stack.
+ */
+#define DUK__ARRAY_MID_JOIN_LIMIT 4096
+
+#if defined(DUK_USE_ARRAY_BUILTIN)
+
+/*
+ * Shared helpers.
+ */
+
+/* Shared entry code for many Array built-ins: the 'this' binding is pushed
+ * on the value stack and object coerced, and the current .length is returned.
+ * Note that length is left on stack (it could be popped, but that's not
+ * usually necessary because call handling will clean it up automatically).
+ */
+DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32(duk_hthread *thr) {
+ duk_uint32_t len;
+
+ /* XXX: push more directly? */
+ (void) duk_push_this_coercible_to_object(thr);
+ DUK_ASSERT_HOBJECT_VALID(duk_get_hobject(thr, -1));
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_LENGTH);
+ len = duk_to_uint32(thr, -1);
+
+ /* -> [ ... ToObject(this) ToUint32(length) ] */
+ return len;
+}
+
+DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32_limited(duk_hthread *thr) {
+ /* Range limited to [0, 0x7fffffff] range, i.e. range that can be
+ * represented with duk_int32_t. Use this when the method doesn't
+ * handle the full 32-bit unsigned range correctly.
+ */
+ duk_uint32_t ret = duk__push_this_obj_len_u32(thr);
+ if (DUK_UNLIKELY(ret >= 0x80000000UL)) {
+ DUK_ERROR_RANGE_INVALID_LENGTH(thr);
+ }
+ return ret;
+}
+
+#if defined(DUK_USE_ARRAY_FASTPATH)
+/* Check if 'this' binding is an Array instance (duk_harray) which satisfies
+ * a few other guarantees for fast path operation. The fast path doesn't
+ * need to handle all operations, even for duk_harrays, but must handle a
+ * significant fraction to improve performance. Return a non-NULL duk_harray
+ * pointer when all fast path criteria are met, NULL otherwise.
+ */
+DUK_LOCAL duk_harray *duk__arraypart_fastpath_this(duk_hthread *thr) {
+ duk_tval *tv;
+ duk_hobject *h;
+ duk_uint_t flags_mask, flags_bits, flags_value;
+
+ DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* because call in progress */
+ tv = DUK_GET_THIS_TVAL_PTR(thr);
+
+ /* Fast path requires that 'this' is a duk_harray. Read only arrays
+ * (ROM backed) are also rejected for simplicity.
+ */
+ if (!DUK_TVAL_IS_OBJECT(tv)) {
+ DUK_DD(DUK_DDPRINT("reject array fast path: not an object"));
+ return NULL;
+ }
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ flags_mask = DUK_HOBJECT_FLAG_ARRAY_PART | \
+ DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \
+ DUK_HEAPHDR_FLAG_READONLY;
+ flags_bits = DUK_HOBJECT_FLAG_ARRAY_PART | \
+ DUK_HOBJECT_FLAG_EXOTIC_ARRAY;
+ flags_value = DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) h);
+ if ((flags_value & flags_mask) != flags_bits) {
+ DUK_DD(DUK_DDPRINT("reject array fast path: object flag check failed"));
+ return NULL;
+ }
+
+ /* In some cases a duk_harray's 'length' may be larger than the
+ * current array part allocation. Avoid the fast path in these
+ * cases, so that all fast path code can safely assume that all
+ * items in the range [0,length[ are backed by the current array
+ * part allocation.
+ */
+ if (((duk_harray *) h)->length > DUK_HOBJECT_GET_ASIZE(h)) {
+ DUK_DD(DUK_DDPRINT("reject array fast path: length > array part size"));
+ return NULL;
+ }
+
+ /* Guarantees for fast path. */
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0 || DUK_HOBJECT_A_GET_BASE(thr->heap, h) != NULL);
+ DUK_ASSERT(((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h));
+
+ DUK_DD(DUK_DDPRINT("array fast path allowed for: %!O", (duk_heaphdr *) h));
+ return (duk_harray *) h;
+}
+#endif /* DUK_USE_ARRAY_FASTPATH */
+
+/*
+ * Constructor
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_constructor(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_harray *a;
+ duk_double_t d;
+ duk_uint32_t len;
+ duk_uint32_t len_prealloc;
+
+ nargs = duk_get_top(thr);
+
+ if (nargs == 1 && duk_is_number(thr, 0)) {
+ /* XXX: expensive check (also shared elsewhere - so add a shared internal API call?) */
+ d = duk_get_number(thr, 0);
+ len = duk_to_uint32(thr, 0);
+ if (((duk_double_t) len) != d) {
+ DUK_DCERROR_RANGE_INVALID_LENGTH(thr);
+ }
+
+ /* For small lengths create a dense preallocated array.
+ * For large arrays preallocate an initial part.
+ */
+ len_prealloc = len < 64 ? len : 64;
+ a = duk_push_harray_with_size(thr, len_prealloc);
+ DUK_ASSERT(a != NULL);
+ a->length = len;
+ return 1;
+ }
+
+ duk_pack(thr, nargs);
+ return 1;
+}
+
+/*
+ * isArray()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_constructor_is_array(duk_hthread *thr) {
+ duk_hobject *h;
+
+ h = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_ARRAY);
+ duk_push_boolean(thr, (h != NULL));
+ return 1;
+}
+
+/*
+ * toString()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_to_string(duk_hthread *thr) {
+ (void) duk_push_this_coercible_to_object(thr);
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_JOIN);
+
+ /* [ ... this func ] */
+ if (!duk_is_callable(thr, -1)) {
+ /* Fall back to the initial (original) Object.toString(). We don't
+ * currently have pointers to the built-in functions, only the top
+ * level global objects (like "Array") so this is now done in a bit
+ * of a hacky manner. It would be cleaner to push the (original)
+ * function and use duk_call_method().
+ */
+
+ /* XXX: 'this' will be ToObject() coerced twice, which is incorrect
+ * but should have no visible side effects.
+ */
+ DUK_DDD(DUK_DDDPRINT("this.join is not callable, fall back to (original) Object.toString"));
+ duk_set_top(thr, 0);
+ return duk_bi_object_prototype_to_string(thr); /* has access to 'this' binding */
+ }
+
+ /* [ ... this func ] */
+
+ duk_insert(thr, -2);
+
+ /* [ ... func this ] */
+
+ DUK_DDD(DUK_DDDPRINT("calling: func=%!iT, this=%!iT",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_call_method(thr, 0);
+
+ return 1;
+}
+
+/*
+ * concat()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_concat(duk_hthread *thr) {
+ duk_idx_t i, n;
+ duk_uarridx_t idx, idx_last;
+ duk_uarridx_t j, len;
+ duk_hobject *h;
+
+ /* XXX: the insert here is a bit expensive if there are a lot of items.
+ * It could also be special cased in the outermost for loop quite easily
+ * (as the element is dup()'d anyway).
+ */
+
+ (void) duk_push_this_coercible_to_object(thr);
+ duk_insert(thr, 0);
+ n = duk_get_top(thr);
+ duk_push_array(thr); /* -> [ ToObject(this) item1 ... itemN arr ] */
+
+ /* NOTE: The Array special behaviors are NOT invoked by duk_xdef_prop_index()
+ * (which differs from the official algorithm). If no error is thrown, this
+ * doesn't matter as the length is updated at the end. However, if an error
+ * is thrown, the length will be unset. That shouldn't matter because the
+ * caller won't get a reference to the intermediate value.
+ */
+
+ idx = 0;
+ idx_last = 0;
+ for (i = 0; i < n; i++) {
+ DUK_ASSERT_TOP(thr, n + 1);
+
+ /* [ ToObject(this) item1 ... itemN arr ] */
+
+ duk_dup(thr, i);
+ h = duk_get_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_ARRAY);
+ if (!h) {
+ duk_xdef_prop_index_wec(thr, -2, idx++);
+ idx_last = idx;
+ continue;
+ }
+
+ /* [ ToObject(this) item1 ... itemN arr item(i) ] */
+
+ /* XXX: an array can have length higher than 32 bits; this is not handled
+ * correctly now.
+ */
+ len = (duk_uarridx_t) duk_get_length(thr, -1);
+ for (j = 0; j < len; j++) {
+ if (duk_get_prop_index(thr, -1, j)) {
+ /* [ ToObject(this) item1 ... itemN arr item(i) item(i)[j] ] */
+ duk_xdef_prop_index_wec(thr, -3, idx++);
+ idx_last = idx;
+ } else {
+ idx++;
+ duk_pop_undefined(thr);
+#if defined(DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER)
+ /* According to E5.1 Section 15.4.4.4 nonexistent trailing
+ * elements do not affect 'length' of the result. Test262
+ * and other engines disagree, so update idx_last here too.
+ */
+ idx_last = idx;
+#else
+ /* Strict standard behavior, ignore trailing elements for
+ * result 'length'.
+ */
+#endif
+ }
+ }
+ duk_pop_unsafe(thr);
+ }
+
+ /* The E5.1 Section 15.4.4.4 algorithm doesn't set the length explicitly
+ * in the end, but because we're operating with an internal value which
+ * is known to be an array, this should be equivalent.
+ */
+ duk_push_uarridx(thr, idx_last);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
+
+ DUK_ASSERT_TOP(thr, n + 1);
+ return 1;
+}
+
+/*
+ * join(), toLocaleString()
+ *
+ * Note: checking valstack is necessary, but only in the per-element loop.
+ *
+ * Note: the trivial approach of pushing all the elements on the value stack
+ * and then calling duk_join() fails when the array contains a large number
+ * of elements. This problem can't be offloaded to duk_join() because the
+ * elements to join must be handled here and have special handling. Current
+ * approach is to do intermediate joins with very large number of elements.
+ * There is no fancy handling; the prefix gets re-joined multiple times.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_join_shared(duk_hthread *thr) {
+ duk_uint32_t len, count;
+ duk_uint32_t idx;
+ duk_small_int_t to_locale_string = duk_get_current_magic(thr);
+ duk_idx_t valstack_required;
+
+ /* For join(), nargs is 1. For toLocaleString(), nargs is 0 and
+ * setting the top essentially pushes an undefined to the stack,
+ * thus defaulting to a comma separator.
+ */
+ duk_set_top(thr, 1);
+ if (duk_is_undefined(thr, 0)) {
+ duk_pop_undefined(thr);
+ duk_push_hstring_stridx(thr, DUK_STRIDX_COMMA);
+ } else {
+ duk_to_string(thr, 0);
+ }
+
+ len = duk__push_this_obj_len_u32(thr);
+
+ /* [ sep ToObject(this) len ] */
+
+ DUK_DDD(DUK_DDDPRINT("sep=%!T, this=%!T, len=%lu",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1),
+ (unsigned long) len));
+
+ /* The extra (+4) is tight. */
+ valstack_required = (duk_idx_t) ((len >= DUK__ARRAY_MID_JOIN_LIMIT ?
+ DUK__ARRAY_MID_JOIN_LIMIT : len) + 4);
+ duk_require_stack(thr, valstack_required);
+
+ duk_dup_0(thr);
+
+ /* [ sep ToObject(this) len sep ] */
+
+ count = 0;
+ idx = 0;
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("join idx=%ld", (long) idx));
+ if (count >= DUK__ARRAY_MID_JOIN_LIMIT || /* intermediate join to avoid valstack overflow */
+ idx >= len) { /* end of loop (careful with len==0) */
+ /* [ sep ToObject(this) len sep str0 ... str(count-1) ] */
+ DUK_DDD(DUK_DDDPRINT("mid/final join, count=%ld, idx=%ld, len=%ld",
+ (long) count, (long) idx, (long) len));
+ duk_join(thr, (duk_idx_t) count); /* -> [ sep ToObject(this) len str ] */
+ duk_dup_0(thr); /* -> [ sep ToObject(this) len str sep ] */
+ duk_insert(thr, -2); /* -> [ sep ToObject(this) len sep str ] */
+ count = 1;
+ }
+ if (idx >= len) {
+ /* if true, the stack already contains the final result */
+ break;
+ }
+
+ duk_get_prop_index(thr, 1, (duk_uarridx_t) idx);
+ if (duk_is_null_or_undefined(thr, -1)) {
+ duk_pop_nodecref_unsafe(thr);
+ duk_push_hstring_empty(thr);
+ } else {
+ if (to_locale_string) {
+ duk_to_object(thr, -1);
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_LOCALE_STRING);
+ duk_insert(thr, -2); /* -> [ ... toLocaleString ToObject(val) ] */
+ duk_call_method(thr, 0);
+ }
+ duk_to_string(thr, -1);
+ }
+
+ count++;
+ idx++;
+ }
+
+ /* [ sep ToObject(this) len sep result ] */
+
+ return 1;
+}
+
+/*
+ * pop(), push()
+ */
+
+#if defined(DUK_USE_ARRAY_FASTPATH)
+DUK_LOCAL duk_ret_t duk__array_pop_fastpath(duk_hthread *thr, duk_harray *h_arr) {
+ duk_tval *tv_arraypart;
+ duk_tval *tv_val;
+ duk_uint32_t len;
+
+ tv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr);
+ len = h_arr->length;
+ if (len <= 0) {
+ /* nop, return undefined */
+ return 0;
+ }
+
+ len--;
+ h_arr->length = len;
+
+ /* Fast path doesn't check for an index property inherited from
+ * Array.prototype. This is quite often acceptable; if not,
+ * disable fast path.
+ */
+ DUK_ASSERT_VS_SPACE(thr);
+ tv_val = tv_arraypart + len;
+ if (DUK_TVAL_IS_UNUSED(tv_val)) {
+ /* No net refcount change. Value stack already has
+ * 'undefined' based on value stack init policy.
+ */
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));
+ DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv_val));
+ } else {
+ /* No net refcount change. */
+ DUK_TVAL_SET_TVAL(thr->valstack_top, tv_val);
+ DUK_TVAL_SET_UNUSED(tv_val);
+ }
+ thr->valstack_top++;
+
+ /* XXX: there's no shrink check in the fast path now */
+
+ return 1;
+}
+#endif /* DUK_USE_ARRAY_FASTPATH */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_pop(duk_hthread *thr) {
+ duk_uint32_t len;
+ duk_uint32_t idx;
+#if defined(DUK_USE_ARRAY_FASTPATH)
+ duk_harray *h_arr;
+#endif
+
+ DUK_ASSERT_TOP(thr, 0);
+
+#if defined(DUK_USE_ARRAY_FASTPATH)
+ h_arr = duk__arraypart_fastpath_this(thr);
+ if (h_arr) {
+ return duk__array_pop_fastpath(thr, h_arr);
+ }
+#endif
+
+ /* XXX: Merge fastpath check into a related call (push this, coerce length, etc)? */
+
+ len = duk__push_this_obj_len_u32(thr);
+ if (len == 0) {
+ duk_push_int(thr, 0);
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);
+ return 0;
+ }
+ idx = len - 1;
+
+ duk_get_prop_index(thr, 0, (duk_uarridx_t) idx);
+ duk_del_prop_index(thr, 0, (duk_uarridx_t) idx);
+ duk_push_u32(thr, idx);
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);
+ return 1;
+}
+
+#if defined(DUK_USE_ARRAY_FASTPATH)
+DUK_LOCAL duk_ret_t duk__array_push_fastpath(duk_hthread *thr, duk_harray *h_arr) {
+ duk_tval *tv_arraypart;
+ duk_tval *tv_src;
+ duk_tval *tv_dst;
+ duk_uint32_t len;
+ duk_idx_t i, n;
+
+ len = h_arr->length;
+ tv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr);
+
+ n = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);
+ DUK_ASSERT(n >= 0);
+ DUK_ASSERT((duk_uint32_t) n <= DUK_UINT32_MAX);
+ if (DUK_UNLIKELY(len + (duk_uint32_t) n < len)) {
+ DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw"));
+ DUK_DCERROR_RANGE_INVALID_LENGTH(thr); /* != 0 return value returned as is by caller */
+ }
+ if (len + (duk_uint32_t) n > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr)) {
+ /* Array part would need to be extended. Rely on slow path
+ * for now.
+ *
+ * XXX: Rework hobject code a bit and add extend support.
+ */
+ return 0;
+ }
+
+ tv_src = thr->valstack_bottom;
+ tv_dst = tv_arraypart + len;
+ for (i = 0; i < n; i++) {
+ /* No net refcount change; reset value stack values to
+ * undefined to satisfy value stack init policy.
+ */
+ DUK_TVAL_SET_TVAL(tv_dst, tv_src);
+ DUK_TVAL_SET_UNDEFINED(tv_src);
+ tv_src++;
+ tv_dst++;
+ }
+ thr->valstack_top = thr->valstack_bottom;
+ len += (duk_uint32_t) n;
+ h_arr->length = len;
+
+ DUK_ASSERT((duk_uint_t) len == len);
+ duk_push_uint(thr, (duk_uint_t) len);
+ return 1;
+}
+#endif /* DUK_USE_ARRAY_FASTPATH */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_push(duk_hthread *thr) {
+ /* Note: 'this' is not necessarily an Array object. The push()
+ * algorithm is supposed to work for other kinds of objects too,
+ * so the algorithm has e.g. an explicit update for the 'length'
+ * property which is normally "magical" in arrays.
+ */
+
+ duk_uint32_t len;
+ duk_idx_t i, n;
+#if defined(DUK_USE_ARRAY_FASTPATH)
+ duk_harray *h_arr;
+#endif
+
+#if defined(DUK_USE_ARRAY_FASTPATH)
+ h_arr = duk__arraypart_fastpath_this(thr);
+ if (h_arr) {
+ duk_ret_t rc;
+ rc = duk__array_push_fastpath(thr, h_arr);
+ if (rc != 0) {
+ return rc;
+ }
+ DUK_DD(DUK_DDPRINT("array push() fast path exited, resize case"));
+ }
+#endif
+
+ n = duk_get_top(thr);
+ len = duk__push_this_obj_len_u32(thr);
+
+ /* [ arg1 ... argN obj length ] */
+
+ /* Technically Array.prototype.push() can create an Array with length
+ * longer than 2^32-1, i.e. outside the 32-bit range. The final length
+ * is *not* wrapped to 32 bits in the specification.
+ *
+ * This implementation tracks length with a uint32 because it's much
+ * more practical.
+ *
+ * See: test-bi-array-push-maxlen.js.
+ */
+
+ if (len + (duk_uint32_t) n < len) {
+ DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw"));
+ DUK_DCERROR_RANGE_INVALID_LENGTH(thr);
+ }
+
+ for (i = 0; i < n; i++) {
+ duk_dup(thr, i);
+ duk_put_prop_index(thr, -3, (duk_uarridx_t) (len + (duk_uint32_t) i));
+ }
+ len += (duk_uint32_t) n;
+
+ duk_push_u32(thr, len);
+ duk_dup_top(thr);
+ duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH);
+
+ /* [ arg1 ... argN obj length new_length ] */
+ return 1;
+}
+
+/*
+ * sort()
+ *
+ * Currently qsort with random pivot. This is now really, really slow,
+ * because there is no fast path for array parts.
+ *
+ * Signed indices are used because qsort() leaves and degenerate cases
+ * may use a negative offset.
+ */
+
+DUK_LOCAL duk_small_int_t duk__array_sort_compare(duk_hthread *thr, duk_int_t idx1, duk_int_t idx2) {
+ duk_bool_t have1, have2;
+ duk_bool_t undef1, undef2;
+ duk_small_int_t ret;
+ duk_idx_t idx_obj = 1; /* fixed offsets in valstack */
+ duk_idx_t idx_fn = 0;
+ duk_hstring *h1, *h2;
+
+ /* Fast exit if indices are identical. This is valid for a non-existent property,
+ * for an undefined value, and almost always for ToString() coerced comparison of
+ * arbitrary values (corner cases where this is not the case include e.g. a an
+ * object with varying ToString() coercion).
+ *
+ * The specification does not prohibit "caching" of values read from the array, so
+ * assuming equality for comparing an index with itself falls into the category of
+ * "caching".
+ *
+ * Also, compareFn may be inconsistent, so skipping a call to compareFn here may
+ * have an effect on the final result. The specification does not require any
+ * specific behavior for inconsistent compare functions, so again, this fast path
+ * is OK.
+ */
+
+ if (idx1 == idx2) {
+ DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld -> indices identical, quick exit",
+ (long) idx1, (long) idx2));
+ return 0;
+ }
+
+ have1 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx1);
+ have2 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx2);
+
+ DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld, have1=%ld, have2=%ld, val1=%!T, val2=%!T",
+ (long) idx1, (long) idx2, (long) have1, (long) have2,
+ (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));
+
+ if (have1) {
+ if (have2) {
+ ;
+ } else {
+ ret = -1;
+ goto pop_ret;
+ }
+ } else {
+ if (have2) {
+ ret = 1;
+ goto pop_ret;
+ } else {
+ ret = 0;
+ goto pop_ret;
+ }
+ }
+
+ undef1 = duk_is_undefined(thr, -2);
+ undef2 = duk_is_undefined(thr, -1);
+ if (undef1) {
+ if (undef2) {
+ ret = 0;
+ goto pop_ret;
+ } else {
+ ret = 1;
+ goto pop_ret;
+ }
+ } else {
+ if (undef2) {
+ ret = -1;
+ goto pop_ret;
+ } else {
+ ;
+ }
+ }
+
+ if (!duk_is_undefined(thr, idx_fn)) {
+ duk_double_t d;
+
+ /* No need to check callable; duk_call() will do that. */
+ duk_dup(thr, idx_fn); /* -> [ ... x y fn ] */
+ duk_insert(thr, -3); /* -> [ ... fn x y ] */
+ duk_call(thr, 2); /* -> [ ... res ] */
+
+ /* ES5 is a bit vague about what to do if the return value is
+ * not a number. ES2015 provides a concrete description:
+ * http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare.
+ */
+
+ d = duk_to_number_m1(thr);
+ if (d < 0.0) {
+ ret = -1;
+ } else if (d > 0.0) {
+ ret = 1;
+ } else {
+ /* Because NaN compares to false, NaN is handled here
+ * without an explicit check above.
+ */
+ ret = 0;
+ }
+
+ duk_pop_nodecref_unsafe(thr);
+ DUK_DDD(DUK_DDDPRINT("-> result %ld (from comparefn, after coercion)", (long) ret));
+ return ret;
+ }
+
+ /* string compare is the default (a bit oddly) */
+
+ /* XXX: any special handling for plain array; causes repeated coercion now? */
+ h1 = duk_to_hstring(thr, -2);
+ h2 = duk_to_hstring_m1(thr);
+ DUK_ASSERT(h1 != NULL);
+ DUK_ASSERT(h2 != NULL);
+
+ ret = duk_js_string_compare(h1, h2); /* retval is directly usable */
+ goto pop_ret;
+
+ pop_ret:
+ duk_pop_2_unsafe(thr);
+ DUK_DDD(DUK_DDDPRINT("-> result %ld", (long) ret));
+ return ret;
+}
+
+DUK_LOCAL void duk__array_sort_swap(duk_hthread *thr, duk_int_t l, duk_int_t r) {
+ duk_bool_t have_l, have_r;
+ duk_idx_t idx_obj = 1; /* fixed offset in valstack */
+
+ if (l == r) {
+ return;
+ }
+
+ /* swap elements; deal with non-existent elements correctly */
+ have_l = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) l);
+ have_r = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) r);
+
+ if (have_r) {
+ /* right exists, [[Put]] regardless whether or not left exists */
+ duk_put_prop_index(thr, idx_obj, (duk_uarridx_t) l);
+ } else {
+ duk_del_prop_index(thr, idx_obj, (duk_uarridx_t) l);
+ duk_pop_undefined(thr);
+ }
+
+ if (have_l) {
+ duk_put_prop_index(thr, idx_obj, (duk_uarridx_t) r);
+ } else {
+ duk_del_prop_index(thr, idx_obj, (duk_uarridx_t) r);
+ duk_pop_undefined(thr);
+ }
+}
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+/* Debug print which visualizes the qsort partitioning process. */
+DUK_LOCAL void duk__debuglog_qsort_state(duk_hthread *thr, duk_int_t lo, duk_int_t hi, duk_int_t pivot) {
+ char buf[4096];
+ char *ptr = buf;
+ duk_int_t i, n;
+ n = (duk_int_t) duk_get_length(thr, 1);
+ if (n > 4000) {
+ n = 4000;
+ }
+ *ptr++ = '[';
+ for (i = 0; i < n; i++) {
+ if (i == pivot) {
+ *ptr++ = '|';
+ } else if (i == lo) {
+ *ptr++ = '<';
+ } else if (i == hi) {
+ *ptr++ = '>';
+ } else if (i >= lo && i <= hi) {
+ *ptr++ = '-';
+ } else {
+ *ptr++ = ' ';
+ }
+ }
+ *ptr++ = ']';
+ *ptr++ = '\0';
+
+ DUK_DDD(DUK_DDDPRINT("%s (lo=%ld, hi=%ld, pivot=%ld)",
+ (const char *) buf, (long) lo, (long) hi, (long) pivot));
+}
+#endif
+
+DUK_LOCAL void duk__array_qsort(duk_hthread *thr, duk_int_t lo, duk_int_t hi) {
+ duk_int_t p, l, r;
+
+ /* The lo/hi indices may be crossed and hi < 0 is possible at entry. */
+
+ DUK_DDD(DUK_DDDPRINT("duk__array_qsort: lo=%ld, hi=%ld, obj=%!T",
+ (long) lo, (long) hi, (duk_tval *) duk_get_tval(thr, 1)));
+
+ DUK_ASSERT_TOP(thr, 3);
+
+ /* In some cases it may be that lo > hi, or hi < 0; these
+ * degenerate cases happen e.g. for empty arrays, and in
+ * recursion leaves.
+ */
+
+ /* trivial cases */
+ if (hi - lo < 1) {
+ DUK_DDD(DUK_DDDPRINT("degenerate case, return immediately"));
+ return;
+ }
+ DUK_ASSERT(hi > lo);
+ DUK_ASSERT(hi - lo + 1 >= 2);
+
+ /* randomized pivot selection */
+ p = lo + (duk_int_t) (DUK_UTIL_GET_RANDOM_DOUBLE(thr) * (duk_double_t) (hi - lo + 1));
+ DUK_ASSERT(p >= lo && p <= hi);
+ DUK_DDD(DUK_DDDPRINT("lo=%ld, hi=%ld, chose pivot p=%ld", (long) lo, (long) hi, (long) p));
+
+ /* move pivot out of the way */
+ duk__array_sort_swap(thr, p, lo);
+ p = lo;
+ DUK_DDD(DUK_DDDPRINT("pivot moved out of the way: %!T", (duk_tval *) duk_get_tval(thr, 1)));
+
+ l = lo + 1;
+ r = hi;
+ for (;;) {
+ /* find elements to swap */
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("left scan: l=%ld, r=%ld, p=%ld",
+ (long) l, (long) r, (long) p));
+ if (l >= hi) {
+ break;
+ }
+ if (duk__array_sort_compare(thr, l, p) >= 0) { /* !(l < p) */
+ break;
+ }
+ l++;
+ }
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("right scan: l=%ld, r=%ld, p=%ld",
+ (long) l, (long) r, (long) p));
+ if (r <= lo) {
+ break;
+ }
+ if (duk__array_sort_compare(thr, p, r) >= 0) { /* !(p < r) */
+ break;
+ }
+ r--;
+ }
+ if (l >= r) {
+ goto done;
+ }
+ DUK_ASSERT(l < r);
+
+ DUK_DDD(DUK_DDDPRINT("swap %ld and %ld", (long) l, (long) r));
+
+ duk__array_sort_swap(thr, l, r);
+
+ DUK_DDD(DUK_DDDPRINT("after swap: %!T", (duk_tval *) duk_get_tval(thr, 1)));
+ l++;
+ r--;
+ }
+ done:
+ /* Note that 'l' and 'r' may cross, i.e. r < l */
+ DUK_ASSERT(l >= lo && l <= hi);
+ DUK_ASSERT(r >= lo && r <= hi);
+
+ /* XXX: there's no explicit recursion bound here now. For the average
+ * qsort recursion depth O(log n) that's not really necessary: e.g. for
+ * 2**32 recursion depth would be about 32 which is OK. However, qsort
+ * worst case recursion depth is O(n) which may be a problem.
+ */
+
+ /* move pivot to its final place */
+ DUK_DDD(DUK_DDDPRINT("before final pivot swap: %!T", (duk_tval *) duk_get_tval(thr, 1)));
+ duk__array_sort_swap(thr, lo, r);
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ duk__debuglog_qsort_state(thr, lo, hi, r);
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("recurse: pivot=%ld, obj=%!T", (long) r, (duk_tval *) duk_get_tval(thr, 1)));
+ duk__array_qsort(thr, lo, r - 1);
+ duk__array_qsort(thr, r + 1, hi);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_sort(duk_hthread *thr) {
+ duk_uint32_t len;
+
+ /* XXX: len >= 0x80000000 won't work below because a signed type
+ * is needed by qsort.
+ */
+ len = duk__push_this_obj_len_u32_limited(thr);
+
+ /* stack[0] = compareFn
+ * stack[1] = ToObject(this)
+ * stack[2] = ToUint32(length)
+ */
+
+ if (len > 0) {
+ /* avoid degenerate cases, so that (len - 1) won't underflow */
+ duk__array_qsort(thr, (duk_int_t) 0, (duk_int_t) (len - 1));
+ }
+
+ DUK_ASSERT_TOP(thr, 3);
+ duk_pop_nodecref_unsafe(thr);
+ return 1; /* return ToObject(this) */
+}
+
+/*
+ * splice()
+ */
+
+/* XXX: this compiles to over 500 bytes now, even without special handling
+ * for an array part. Uses signed ints so does not handle full array range correctly.
+ */
+
+/* XXX: can shift() / unshift() use the same helper?
+ * shift() is (close to?) <--> splice(0, 1)
+ * unshift is (close to?) <--> splice(0, 0, [items])?
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_splice(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_uint32_t len_u32;
+ duk_int_t len;
+ duk_bool_t have_delcount;
+ duk_int_t item_count;
+ duk_int_t act_start;
+ duk_int_t del_count;
+ duk_int_t i, n;
+
+ DUK_UNREF(have_delcount);
+
+ nargs = duk_get_top(thr);
+ if (nargs < 2) {
+ duk_set_top(thr, 2);
+ nargs = 2;
+ have_delcount = 0;
+ } else {
+ have_delcount = 1;
+ }
+
+ /* XXX: len >= 0x80000000 won't work below because we need to be
+ * able to represent -len.
+ */
+ len_u32 = duk__push_this_obj_len_u32_limited(thr);
+ len = (duk_int_t) len_u32;
+ DUK_ASSERT(len >= 0);
+
+ act_start = duk_to_int_clamped(thr, 0, -len, len);
+ if (act_start < 0) {
+ act_start = len + act_start;
+ }
+ DUK_ASSERT(act_start >= 0 && act_start <= len);
+
+#if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT)
+ if (have_delcount) {
+#endif
+ del_count = duk_to_int_clamped(thr, 1, 0, len - act_start);
+#if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT)
+ } else {
+ /* E5.1 standard behavior when deleteCount is not given would be
+ * to treat it just like if 'undefined' was given, which coerces
+ * ultimately to 0. Real world behavior is to splice to the end
+ * of array, see test-bi-array-proto-splice-no-delcount.js.
+ */
+ del_count = len - act_start;
+ }
+#endif
+
+ DUK_ASSERT(nargs >= 2);
+ item_count = (duk_int_t) (nargs - 2);
+
+ DUK_ASSERT(del_count >= 0 && del_count <= len - act_start);
+ DUK_ASSERT(del_count + act_start <= len);
+
+ /* For now, restrict result array into 32-bit length range. */
+ if (((duk_double_t) len) - ((duk_double_t) del_count) + ((duk_double_t) item_count) > (duk_double_t) DUK_UINT32_MAX) {
+ DUK_D(DUK_DPRINT("Array.prototype.splice() would go beyond 32-bit length, throw"));
+ DUK_DCERROR_RANGE_INVALID_LENGTH(thr);
+ }
+
+ duk_push_array(thr);
+
+ /* stack[0] = start
+ * stack[1] = deleteCount
+ * stack[2...nargs-1] = items
+ * stack[nargs] = ToObject(this) -3
+ * stack[nargs+1] = ToUint32(length) -2
+ * stack[nargs+2] = result array -1
+ */
+
+ DUK_ASSERT_TOP(thr, nargs + 3);
+
+ /* Step 9: copy elements-to-be-deleted into the result array */
+
+ for (i = 0; i < del_count; i++) {
+ if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (act_start + i))) {
+ duk_xdef_prop_index_wec(thr, -2, (duk_uarridx_t) i); /* throw flag irrelevant (false in std alg) */
+ } else {
+ duk_pop_undefined(thr);
+ }
+ }
+ duk_push_u32(thr, (duk_uint32_t) del_count);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
+
+ /* Steps 12 and 13: reorganize elements to make room for itemCount elements */
+
+ if (item_count < del_count) {
+ /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 1
+ * -> [ A B F G H ] (conceptual intermediate step)
+ * -> [ A B . F G H ] (placeholder marked)
+ * [ A B C F G H ] (actual result at this point, C will be replaced)
+ */
+
+ DUK_ASSERT_TOP(thr, nargs + 3);
+
+ n = len - del_count;
+ for (i = act_start; i < n; i++) {
+ if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) {
+ duk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count));
+ } else {
+ duk_pop_undefined(thr);
+ duk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count));
+ }
+ }
+
+ DUK_ASSERT_TOP(thr, nargs + 3);
+
+ /* loop iterator init and limit changed from standard algorithm */
+ n = len - del_count + item_count;
+ for (i = len - 1; i >= n; i--) {
+ duk_del_prop_index(thr, -3, (duk_uarridx_t) i);
+ }
+
+ DUK_ASSERT_TOP(thr, nargs + 3);
+ } else if (item_count > del_count) {
+ /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 4
+ * -> [ A B F G H ] (conceptual intermediate step)
+ * -> [ A B . . . . F G H ] (placeholder marked)
+ * [ A B C D E F F G H ] (actual result at this point)
+ */
+
+ DUK_ASSERT_TOP(thr, nargs + 3);
+
+ /* loop iterator init and limit changed from standard algorithm */
+ for (i = len - del_count - 1; i >= act_start; i--) {
+ if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) {
+ duk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count));
+ } else {
+ duk_pop_undefined(thr);
+ duk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count));
+ }
+ }
+
+ DUK_ASSERT_TOP(thr, nargs + 3);
+ } else {
+ /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 3
+ * -> [ A B F G H ] (conceptual intermediate step)
+ * -> [ A B . . . F G H ] (placeholder marked)
+ * [ A B C D E F G H ] (actual result at this point)
+ */
+ }
+ DUK_ASSERT_TOP(thr, nargs + 3);
+
+ /* Step 15: insert itemCount elements into the hole made above */
+
+ for (i = 0; i < item_count; i++) {
+ duk_dup(thr, i + 2); /* args start at index 2 */
+ duk_put_prop_index(thr, -4, (duk_uarridx_t) (act_start + i));
+ }
+
+ /* Step 16: update length; note that the final length may be above 32 bit range
+ * (but we checked above that this isn't the case here)
+ */
+
+ duk_push_u32(thr, (duk_uint32_t) (len - del_count + item_count));
+ duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH);
+
+ /* result array is already at the top of stack */
+ DUK_ASSERT_TOP(thr, nargs + 3);
+ return 1;
+}
+
+/*
+ * reverse()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reverse(duk_hthread *thr) {
+ duk_uint32_t len;
+ duk_uint32_t middle;
+ duk_uint32_t lower, upper;
+ duk_bool_t have_lower, have_upper;
+
+ len = duk__push_this_obj_len_u32(thr);
+ middle = len / 2;
+
+ /* If len <= 1, middle will be 0 and for-loop bails out
+ * immediately (0 < 0 -> false).
+ */
+
+ for (lower = 0; lower < middle; lower++) {
+ DUK_ASSERT(len >= 2);
+ DUK_ASSERT_TOP(thr, 2);
+
+ DUK_ASSERT(len >= lower + 1);
+ upper = len - lower - 1;
+
+ have_lower = duk_get_prop_index(thr, -2, (duk_uarridx_t) lower);
+ have_upper = duk_get_prop_index(thr, -3, (duk_uarridx_t) upper);
+
+ /* [ ToObject(this) ToUint32(length) lowerValue upperValue ] */
+
+ if (have_upper) {
+ duk_put_prop_index(thr, -4, (duk_uarridx_t) lower);
+ } else {
+ duk_del_prop_index(thr, -4, (duk_uarridx_t) lower);
+ duk_pop_undefined(thr);
+ }
+
+ if (have_lower) {
+ duk_put_prop_index(thr, -3, (duk_uarridx_t) upper);
+ } else {
+ duk_del_prop_index(thr, -3, (duk_uarridx_t) upper);
+ duk_pop_undefined(thr);
+ }
+
+ DUK_ASSERT_TOP(thr, 2);
+ }
+
+ DUK_ASSERT_TOP(thr, 2);
+ duk_pop_unsafe(thr); /* -> [ ToObject(this) ] */
+ return 1;
+}
+
+/*
+ * slice()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_slice(duk_hthread *thr) {
+ duk_uint32_t len_u32;
+ duk_int_t len;
+ duk_int_t start, end;
+ duk_int_t i;
+ duk_uarridx_t idx;
+ duk_uint32_t res_length = 0;
+
+ /* XXX: len >= 0x80000000 won't work below because we need to be
+ * able to represent -len.
+ */
+ len_u32 = duk__push_this_obj_len_u32_limited(thr);
+ len = (duk_int_t) len_u32;
+ DUK_ASSERT(len >= 0);
+
+ duk_push_array(thr);
+
+ /* stack[0] = start
+ * stack[1] = end
+ * stack[2] = ToObject(this)
+ * stack[3] = ToUint32(length)
+ * stack[4] = result array
+ */
+
+ start = duk_to_int_clamped(thr, 0, -len, len);
+ if (start < 0) {
+ start = len + start;
+ }
+ /* XXX: could duk_is_undefined() provide defaulting undefined to 'len'
+ * (the upper limit)?
+ */
+ if (duk_is_undefined(thr, 1)) {
+ end = len;
+ } else {
+ end = duk_to_int_clamped(thr, 1, -len, len);
+ if (end < 0) {
+ end = len + end;
+ }
+ }
+ DUK_ASSERT(start >= 0 && start <= len);
+ DUK_ASSERT(end >= 0 && end <= len);
+
+ idx = 0;
+ for (i = start; i < end; i++) {
+ DUK_ASSERT_TOP(thr, 5);
+ if (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) {
+ duk_xdef_prop_index_wec(thr, 4, idx);
+ res_length = idx + 1;
+ } else {
+ duk_pop_undefined(thr);
+ }
+ idx++;
+ DUK_ASSERT_TOP(thr, 5);
+ }
+
+ duk_push_u32(thr, res_length);
+ duk_xdef_prop_stridx_short(thr, 4, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
+
+ DUK_ASSERT_TOP(thr, 5);
+ return 1;
+}
+
+/*
+ * shift()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_shift(duk_hthread *thr) {
+ duk_uint32_t len;
+ duk_uint32_t i;
+
+ len = duk__push_this_obj_len_u32(thr);
+ if (len == 0) {
+ duk_push_int(thr, 0);
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);
+ return 0;
+ }
+
+ duk_get_prop_index(thr, 0, 0);
+
+ /* stack[0] = object (this)
+ * stack[1] = ToUint32(length)
+ * stack[2] = elem at index 0 (retval)
+ */
+
+ for (i = 1; i < len; i++) {
+ DUK_ASSERT_TOP(thr, 3);
+ if (duk_get_prop_index(thr, 0, (duk_uarridx_t) i)) {
+ /* fromPresent = true */
+ duk_put_prop_index(thr, 0, (duk_uarridx_t) (i - 1));
+ } else {
+ /* fromPresent = false */
+ duk_del_prop_index(thr, 0, (duk_uarridx_t) (i - 1));
+ duk_pop_undefined(thr);
+ }
+ }
+ duk_del_prop_index(thr, 0, (duk_uarridx_t) (len - 1));
+
+ duk_push_u32(thr, (duk_uint32_t) (len - 1));
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);
+
+ DUK_ASSERT_TOP(thr, 3);
+ return 1;
+}
+
+/*
+ * unshift()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_unshift(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_uint32_t len;
+ duk_uint32_t i;
+
+ nargs = duk_get_top(thr);
+ len = duk__push_this_obj_len_u32(thr);
+
+ /* stack[0...nargs-1] = unshift args (vararg)
+ * stack[nargs] = ToObject(this)
+ * stack[nargs+1] = ToUint32(length)
+ */
+
+ DUK_ASSERT_TOP(thr, nargs + 2);
+
+ /* Note: unshift() may operate on indices above unsigned 32-bit range
+ * and the final length may be >= 2**32. However, we restrict the
+ * final result to 32-bit range for practicality.
+ */
+
+ if (len + (duk_uint32_t) nargs < len) {
+ DUK_D(DUK_DPRINT("Array.prototype.unshift() would go beyond 32-bit length, throw"));
+ DUK_DCERROR_RANGE_INVALID_LENGTH(thr);
+ }
+
+ i = len;
+ while (i > 0) {
+ DUK_ASSERT_TOP(thr, nargs + 2);
+ i--;
+ /* k+argCount-1; note that may be above 32-bit range */
+
+ if (duk_get_prop_index(thr, -2, (duk_uarridx_t) i)) {
+ /* fromPresent = true */
+ /* [ ... ToObject(this) ToUint32(length) val ] */
+ duk_put_prop_index(thr, -3, (duk_uarridx_t) (i + (duk_uint32_t) nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */
+ } else {
+ /* fromPresent = false */
+ /* [ ... ToObject(this) ToUint32(length) val ] */
+ duk_pop_undefined(thr);
+ duk_del_prop_index(thr, -2, (duk_uarridx_t) (i + (duk_uint32_t) nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */
+ }
+ DUK_ASSERT_TOP(thr, nargs + 2);
+ }
+
+ for (i = 0; i < (duk_uint32_t) nargs; i++) {
+ DUK_ASSERT_TOP(thr, nargs + 2);
+ duk_dup(thr, (duk_idx_t) i); /* -> [ ... ToObject(this) ToUint32(length) arg[i] ] */
+ duk_put_prop_index(thr, -3, (duk_uarridx_t) i);
+ DUK_ASSERT_TOP(thr, nargs + 2);
+ }
+
+ DUK_ASSERT_TOP(thr, nargs + 2);
+ duk_push_u32(thr, len + (duk_uint32_t) nargs);
+ duk_dup_top(thr); /* -> [ ... ToObject(this) ToUint32(length) final_len final_len ] */
+ duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH);
+ return 1;
+}
+
+/*
+ * indexOf(), lastIndexOf()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_int_t i, len;
+ duk_int_t from_idx;
+ duk_small_int_t idx_step = duk_get_current_magic(thr); /* idx_step is +1 for indexOf, -1 for lastIndexOf */
+
+ /* lastIndexOf() needs to be a vararg function because we must distinguish
+ * between an undefined fromIndex and a "not given" fromIndex; indexOf() is
+ * made vararg for symmetry although it doesn't strictly need to be.
+ */
+
+ nargs = duk_get_top(thr);
+ duk_set_top(thr, 2);
+
+ /* XXX: must be able to represent -len */
+ len = (duk_int_t) duk__push_this_obj_len_u32_limited(thr);
+ if (len == 0) {
+ goto not_found;
+ }
+
+ /* Index clamping is a bit tricky, we must ensure that we'll only iterate
+ * through elements that exist and that the specific requirements from E5.1
+ * Sections 15.4.4.14 and 15.4.4.15 are fulfilled; especially:
+ *
+ * - indexOf: clamp to [-len,len], negative handling -> [0,len],
+ * if clamped result is len, for-loop bails out immediately
+ *
+ * - lastIndexOf: clamp to [-len-1, len-1], negative handling -> [-1, len-1],
+ * if clamped result is -1, for-loop bails out immediately
+ *
+ * If fromIndex is not given, ToInteger(undefined) = 0, which is correct
+ * for indexOf() but incorrect for lastIndexOf(). Hence special handling,
+ * and why lastIndexOf() needs to be a vararg function.
+ */
+
+ if (nargs >= 2) {
+ /* indexOf: clamp fromIndex to [-len, len]
+ * (if fromIndex == len, for-loop terminates directly)
+ *
+ * lastIndexOf: clamp fromIndex to [-len - 1, len - 1]
+ * (if clamped to -len-1 -> fromIndex becomes -1, terminates for-loop directly)
+ */
+ from_idx = duk_to_int_clamped(thr,
+ 1,
+ (idx_step > 0 ? -len : -len - 1),
+ (idx_step > 0 ? len : len - 1));
+ if (from_idx < 0) {
+ /* for lastIndexOf, result may be -1 (mark immediate termination) */
+ from_idx = len + from_idx;
+ }
+ } else {
+ /* for indexOf, ToInteger(undefined) would be 0, i.e. correct, but
+ * handle both indexOf and lastIndexOf specially here.
+ */
+ if (idx_step > 0) {
+ from_idx = 0;
+ } else {
+ from_idx = len - 1;
+ }
+ }
+
+ /* stack[0] = searchElement
+ * stack[1] = fromIndex
+ * stack[2] = object
+ * stack[3] = length (not needed, but not popped above)
+ */
+
+ for (i = from_idx; i >= 0 && i < len; i += idx_step) {
+ DUK_ASSERT_TOP(thr, 4);
+
+ if (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) {
+ DUK_ASSERT_TOP(thr, 5);
+ if (duk_strict_equals(thr, 0, 4)) {
+ duk_push_int(thr, i);
+ return 1;
+ }
+ }
+
+ duk_pop_unsafe(thr);
+ }
+
+ not_found:
+ duk_push_int(thr, -1);
+ return 1;
+}
+
+/*
+ * every(), some(), forEach(), map(), filter()
+ */
+
+#define DUK__ITER_EVERY 0
+#define DUK__ITER_SOME 1
+#define DUK__ITER_FOREACH 2
+#define DUK__ITER_MAP 3
+#define DUK__ITER_FILTER 4
+
+/* XXX: This helper is a bit awkward because the handling for the different iteration
+ * callers is quite different. This now compiles to a bit less than 500 bytes, so with
+ * 5 callers the net result is about 100 bytes / caller.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_iter_shared(duk_hthread *thr) {
+ duk_uint32_t len;
+ duk_uint32_t i;
+ duk_uarridx_t k;
+ duk_bool_t bval;
+ duk_small_int_t iter_type = duk_get_current_magic(thr);
+ duk_uint32_t res_length = 0;
+
+ /* each call this helper serves has nargs==2 */
+ DUK_ASSERT_TOP(thr, 2);
+
+ len = duk__push_this_obj_len_u32(thr);
+ duk_require_callable(thr, 0);
+ /* if thisArg not supplied, behave as if undefined was supplied */
+
+ if (iter_type == DUK__ITER_MAP || iter_type == DUK__ITER_FILTER) {
+ duk_push_array(thr);
+ } else {
+ duk_push_undefined(thr);
+ }
+
+ /* stack[0] = callback
+ * stack[1] = thisArg
+ * stack[2] = object
+ * stack[3] = ToUint32(length) (unused, but avoid unnecessary pop)
+ * stack[4] = result array (or undefined)
+ */
+
+ k = 0; /* result index for filter() */
+ for (i = 0; i < len; i++) {
+ DUK_ASSERT_TOP(thr, 5);
+
+ if (!duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) {
+#if defined(DUK_USE_NONSTD_ARRAY_MAP_TRAILER)
+ /* Real world behavior for map(): trailing non-existent
+ * elements don't invoke the user callback, but are still
+ * counted towards result 'length'.
+ */
+ if (iter_type == DUK__ITER_MAP) {
+ res_length = i + 1;
+ }
+#else
+ /* Standard behavior for map(): trailing non-existent
+ * elements don't invoke the user callback and are not
+ * counted towards result 'length'.
+ */
+#endif
+ duk_pop_undefined(thr);
+ continue;
+ }
+
+ /* The original value needs to be preserved for filter(), hence
+ * this funny order. We can't re-get the value because of side
+ * effects.
+ */
+
+ duk_dup_0(thr);
+ duk_dup_1(thr);
+ duk_dup_m3(thr);
+ duk_push_u32(thr, i);
+ duk_dup_2(thr); /* [ ... val callback thisArg val i obj ] */
+ duk_call_method(thr, 3); /* -> [ ... val retval ] */
+
+ switch (iter_type) {
+ case DUK__ITER_EVERY:
+ bval = duk_to_boolean(thr, -1);
+ if (!bval) {
+ /* stack top contains 'false' */
+ return 1;
+ }
+ break;
+ case DUK__ITER_SOME:
+ bval = duk_to_boolean(thr, -1);
+ if (bval) {
+ /* stack top contains 'true' */
+ return 1;
+ }
+ break;
+ case DUK__ITER_FOREACH:
+ /* nop */
+ break;
+ case DUK__ITER_MAP:
+ duk_dup_top(thr);
+ duk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) i); /* retval to result[i] */
+ res_length = i + 1;
+ break;
+ case DUK__ITER_FILTER:
+ bval = duk_to_boolean(thr, -1);
+ if (bval) {
+ duk_dup_m2(thr); /* orig value */
+ duk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) k);
+ k++;
+ res_length = k;
+ }
+ break;
+ default:
+ DUK_UNREACHABLE();
+ break;
+ }
+ duk_pop_2_unsafe(thr);
+
+ DUK_ASSERT_TOP(thr, 5);
+ }
+
+ switch (iter_type) {
+ case DUK__ITER_EVERY:
+ duk_push_true(thr);
+ break;
+ case DUK__ITER_SOME:
+ duk_push_false(thr);
+ break;
+ case DUK__ITER_FOREACH:
+ duk_push_undefined(thr);
+ break;
+ case DUK__ITER_MAP:
+ case DUK__ITER_FILTER:
+ DUK_ASSERT_TOP(thr, 5);
+ DUK_ASSERT(duk_is_array(thr, -1)); /* topmost element is the result array already */
+ duk_push_u32(thr, res_length);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);
+ break;
+ default:
+ DUK_UNREACHABLE();
+ break;
+ }
+
+ return 1;
+}
+
+/*
+ * reduce(), reduceRight()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_bool_t have_acc;
+ duk_uint32_t i, len;
+ duk_small_int_t idx_step = duk_get_current_magic(thr); /* idx_step is +1 for reduce, -1 for reduceRight */
+
+ /* We're a varargs function because we need to detect whether
+ * initialValue was given or not.
+ */
+ nargs = duk_get_top(thr);
+ DUK_DDD(DUK_DDDPRINT("nargs=%ld", (long) nargs));
+
+ duk_set_top(thr, 2);
+ len = duk__push_this_obj_len_u32(thr);
+ duk_require_callable(thr, 0);
+
+ /* stack[0] = callback fn
+ * stack[1] = initialValue
+ * stack[2] = object (coerced this)
+ * stack[3] = length (not needed, but not popped above)
+ * stack[4] = accumulator
+ */
+
+ have_acc = 0;
+ if (nargs >= 2) {
+ duk_dup_1(thr);
+ have_acc = 1;
+ }
+ DUK_DDD(DUK_DDDPRINT("have_acc=%ld, acc=%!T",
+ (long) have_acc, (duk_tval *) duk_get_tval(thr, 3)));
+
+ /* For len == 0, i is initialized to len - 1 which underflows.
+ * The condition (i < len) will then exit the for-loop on the
+ * first round which is correct. Similarly, loop termination
+ * happens by i underflowing.
+ */
+
+ for (i = (idx_step >= 0 ? 0 : len - 1);
+ i < len; /* i >= 0 would always be true */
+ i += (duk_uint32_t) idx_step) {
+ DUK_DDD(DUK_DDDPRINT("i=%ld, len=%ld, have_acc=%ld, top=%ld, acc=%!T",
+ (long) i, (long) len, (long) have_acc,
+ (long) duk_get_top(thr),
+ (duk_tval *) duk_get_tval(thr, 4)));
+
+ DUK_ASSERT((have_acc && duk_get_top(thr) == 5) ||
+ (!have_acc && duk_get_top(thr) == 4));
+
+ if (!duk_has_prop_index(thr, 2, (duk_uarridx_t) i)) {
+ continue;
+ }
+
+ if (!have_acc) {
+ DUK_ASSERT_TOP(thr, 4);
+ duk_get_prop_index(thr, 2, (duk_uarridx_t) i);
+ have_acc = 1;
+ DUK_ASSERT_TOP(thr, 5);
+ } else {
+ DUK_ASSERT_TOP(thr, 5);
+ duk_dup_0(thr);
+ duk_dup(thr, 4);
+ duk_get_prop_index(thr, 2, (duk_uarridx_t) i);
+ duk_push_u32(thr, i);
+ duk_dup_2(thr);
+ DUK_DDD(DUK_DDDPRINT("calling reduce function: func=%!T, prev=%!T, curr=%!T, idx=%!T, obj=%!T",
+ (duk_tval *) duk_get_tval(thr, -5), (duk_tval *) duk_get_tval(thr, -4),
+ (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_call(thr, 4);
+ DUK_DDD(DUK_DDDPRINT("-> result: %!T", (duk_tval *) duk_get_tval(thr, -1)));
+ duk_replace(thr, 4);
+ DUK_ASSERT_TOP(thr, 5);
+ }
+ }
+
+ if (!have_acc) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ DUK_ASSERT_TOP(thr, 5);
+ return 1;
+}
+
+#endif /* DUK_USE_ARRAY_BUILTIN */
+
+/* automatic undefs */
+#undef DUK__ARRAY_MID_JOIN_LIMIT
+#undef DUK__ITER_EVERY
+#undef DUK__ITER_FILTER
+#undef DUK__ITER_FOREACH
+#undef DUK__ITER_MAP
+#undef DUK__ITER_SOME
+#line 1 "duk_bi_boolean.c"
+/*
+ * Boolean built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_BOOLEAN_BUILTIN)
+
+/* Shared helper to provide toString() and valueOf(). Checks 'this', gets
+ * the primitive value to stack top, and optionally coerces with ToString().
+ */
+DUK_INTERNAL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_hthread *thr) {
+ duk_tval *tv;
+ duk_hobject *h;
+ duk_small_int_t coerce_tostring = duk_get_current_magic(thr);
+
+ /* XXX: there is room to use a shared helper here, many built-ins
+ * check the 'this' type, and if it's an object, check its class,
+ * then get its internal value, etc.
+ */
+
+ duk_push_this(thr);
+ tv = duk_get_tval(thr, -1);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_BOOLEAN(tv)) {
+ goto type_ok;
+ } else if (DUK_TVAL_IS_OBJECT(tv)) {
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_BOOLEAN) {
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);
+ DUK_ASSERT(duk_is_boolean(thr, -1));
+ goto type_ok;
+ }
+ }
+
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ /* never here */
+
+ type_ok:
+ if (coerce_tostring) {
+ duk_to_string(thr, -1);
+ }
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_boolean_constructor(duk_hthread *thr) {
+ duk_hobject *h_this;
+
+ duk_to_boolean(thr, 0);
+
+ if (duk_is_constructor_call(thr)) {
+ /* XXX: helper; rely on Boolean.prototype as being non-writable, non-configurable */
+ duk_push_this(thr);
+ h_this = duk_known_hobject(thr, -1);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]);
+
+ DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_BOOLEAN);
+
+ duk_dup_0(thr); /* -> [ val obj val ] */
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); /* XXX: proper flags? */
+ } /* unbalanced stack */
+
+ return 1;
+}
+
+#endif /* DUK_USE_BOOLEAN_BUILTIN */
+#line 1 "duk_bi_buffer.c"
+/*
+ * ES2015 TypedArray and Node.js Buffer built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Helpers for buffer handling, enabled with DUK_USE_BUFFEROBJECT_SUPPORT.
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+/* Map class number (minus DUK_HOBJECT_CLASS_BUFOBJ_MIN) to a bidx for the
+ * default internal prototype.
+ */
+static const duk_uint8_t duk__buffer_proto_from_classnum[] = {
+ DUK_BIDX_ARRAYBUFFER_PROTOTYPE,
+ DUK_BIDX_DATAVIEW_PROTOTYPE,
+ DUK_BIDX_INT8ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT8ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE,
+ DUK_BIDX_INT16ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT16ARRAY_PROTOTYPE,
+ DUK_BIDX_INT32ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT32ARRAY_PROTOTYPE,
+ DUK_BIDX_FLOAT32ARRAY_PROTOTYPE,
+ DUK_BIDX_FLOAT64ARRAY_PROTOTYPE
+};
+
+/* Map DUK_HBUFOBJ_ELEM_xxx to duk_hobject class number.
+ * Sync with duk_hbufobj.h and duk_hobject.h.
+ */
+static const duk_uint8_t duk__buffer_class_from_elemtype[9] = {
+ DUK_HOBJECT_CLASS_UINT8ARRAY,
+ DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY,
+ DUK_HOBJECT_CLASS_INT8ARRAY,
+ DUK_HOBJECT_CLASS_UINT16ARRAY,
+ DUK_HOBJECT_CLASS_INT16ARRAY,
+ DUK_HOBJECT_CLASS_UINT32ARRAY,
+ DUK_HOBJECT_CLASS_INT32ARRAY,
+ DUK_HOBJECT_CLASS_FLOAT32ARRAY,
+ DUK_HOBJECT_CLASS_FLOAT64ARRAY
+};
+
+/* Map DUK_HBUFOBJ_ELEM_xxx to prototype object built-in index.
+ * Sync with duk_hbufobj.h.
+ */
+static const duk_uint8_t duk__buffer_proto_from_elemtype[9] = {
+ DUK_BIDX_UINT8ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE,
+ DUK_BIDX_INT8ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT16ARRAY_PROTOTYPE,
+ DUK_BIDX_INT16ARRAY_PROTOTYPE,
+ DUK_BIDX_UINT32ARRAY_PROTOTYPE,
+ DUK_BIDX_INT32ARRAY_PROTOTYPE,
+ DUK_BIDX_FLOAT32ARRAY_PROTOTYPE,
+ DUK_BIDX_FLOAT64ARRAY_PROTOTYPE
+};
+
+/* Map DUK__FLD_xxx to byte size. */
+static const duk_uint8_t duk__buffer_nbytes_from_fldtype[6] = {
+ 1, /* DUK__FLD_8BIT */
+ 2, /* DUK__FLD_16BIT */
+ 4, /* DUK__FLD_32BIT */
+ 4, /* DUK__FLD_FLOAT */
+ 8, /* DUK__FLD_DOUBLE */
+ 0 /* DUK__FLD_VARINT; not relevant here */
+};
+
+/* Bitfield for each DUK_HBUFOBJ_ELEM_xxx indicating which element types
+ * are compatible with a blind byte copy for the TypedArray set() method (also
+ * used for TypedArray constructor). Array index is target buffer elem type,
+ * bitfield indicates compatible source types. The types must have same byte
+ * size and they must be coercion compatible.
+ */
+#if !defined(DUK_USE_PREFER_SIZE)
+static duk_uint16_t duk__buffer_elemtype_copy_compatible[9] = {
+ /* xxx -> DUK_HBUFOBJ_ELEM_UINT8 */
+ (1U << DUK_HBUFOBJ_ELEM_UINT8) |
+ (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) |
+ (1U << DUK_HBUFOBJ_ELEM_INT8),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_UINT8CLAMPED
+ * Note: INT8 is -not- copy compatible, e.g. -1 would coerce to 0x00.
+ */
+ (1U << DUK_HBUFOBJ_ELEM_UINT8) |
+ (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_INT8 */
+ (1U << DUK_HBUFOBJ_ELEM_UINT8) |
+ (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) |
+ (1U << DUK_HBUFOBJ_ELEM_INT8),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_UINT16 */
+ (1U << DUK_HBUFOBJ_ELEM_UINT16) |
+ (1U << DUK_HBUFOBJ_ELEM_INT16),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_INT16 */
+ (1U << DUK_HBUFOBJ_ELEM_UINT16) |
+ (1U << DUK_HBUFOBJ_ELEM_INT16),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_UINT32 */
+ (1U << DUK_HBUFOBJ_ELEM_UINT32) |
+ (1U << DUK_HBUFOBJ_ELEM_INT32),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_INT32 */
+ (1U << DUK_HBUFOBJ_ELEM_UINT32) |
+ (1U << DUK_HBUFOBJ_ELEM_INT32),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_FLOAT32 */
+ (1U << DUK_HBUFOBJ_ELEM_FLOAT32),
+
+ /* xxx -> DUK_HBUFOBJ_ELEM_FLOAT64 */
+ (1U << DUK_HBUFOBJ_ELEM_FLOAT64)
+};
+#endif /* !DUK_USE_PREFER_SIZE */
+
+DUK_LOCAL duk_hbufobj *duk__hbufobj_promote_this(duk_hthread *thr) {
+ duk_tval *tv_dst;
+ duk_hbufobj *res;
+
+ duk_push_this(thr);
+ DUK_ASSERT(duk_is_buffer(thr, -1));
+ res = (duk_hbufobj *) duk_to_hobject(thr, -1);
+ DUK_ASSERT_HBUFOBJ_VALID(res);
+ DUK_DD(DUK_DDPRINT("promoted 'this' automatically to an ArrayBuffer: %!iT", duk_get_tval(thr, -1)));
+
+ tv_dst = duk_get_borrowed_this_tval(thr);
+ DUK_TVAL_SET_OBJECT_UPDREF(thr, tv_dst, (duk_hobject *) res);
+ duk_pop(thr);
+
+ return res;
+}
+
+#define DUK__BUFOBJ_FLAG_THROW (1 << 0)
+#define DUK__BUFOBJ_FLAG_PROMOTE (1 << 1)
+
+/* Shared helper. When DUK__BUFOBJ_FLAG_PROMOTE is given, the return value is
+ * always a duk_hbufobj *. Without the flag the return value can also be a
+ * plain buffer, and the caller must check for it using DUK_HEAPHDR_IS_BUFFER().
+ */
+DUK_LOCAL duk_heaphdr *duk__getrequire_bufobj_this(duk_hthread *thr, duk_small_uint_t flags) {
+ duk_tval *tv;
+ duk_hbufobj *h_this;
+
+ DUK_ASSERT(thr != NULL);
+
+ tv = duk_get_borrowed_this_tval(thr);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h_this = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h_this != NULL);
+ if (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_this)) {
+ DUK_ASSERT_HBUFOBJ_VALID(h_this);
+ return (duk_heaphdr *) h_this;
+ }
+ } else if (DUK_TVAL_IS_BUFFER(tv)) {
+ if (flags & DUK__BUFOBJ_FLAG_PROMOTE) {
+ /* Promote a plain buffer to a Uint8Array. This is very
+ * inefficient but allows plain buffer to be used wherever an
+ * Uint8Array is used with very small cost; hot path functions
+ * like index read/write calls should provide direct buffer
+ * support to avoid promotion.
+ */
+ /* XXX: make this conditional to a flag if call sites need it? */
+ h_this = duk__hbufobj_promote_this(thr);
+ DUK_ASSERT(h_this != NULL);
+ DUK_ASSERT_HBUFOBJ_VALID(h_this);
+ return (duk_heaphdr *) h_this;
+ } else {
+ /* XXX: ugly, share return pointer for duk_hbuffer. */
+ return (duk_heaphdr *) DUK_TVAL_GET_BUFFER(tv);
+ }
+ }
+
+ if (flags & DUK__BUFOBJ_FLAG_THROW) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER);
+ }
+ return NULL;
+}
+
+/* Check that 'this' is a duk_hbufobj and return a pointer to it. */
+DUK_LOCAL duk_hbufobj *duk__get_bufobj_this(duk_hthread *thr) {
+ return (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_PROMOTE);
+}
+
+/* Check that 'this' is a duk_hbufobj and return a pointer to it
+ * (NULL if not).
+ */
+DUK_LOCAL duk_hbufobj *duk__require_bufobj_this(duk_hthread *thr) {
+ return (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW | DUK__BUFOBJ_FLAG_PROMOTE);
+}
+
+/* Check that value is a duk_hbufobj and return a pointer to it. */
+DUK_LOCAL duk_hbufobj *duk__require_bufobj_value(duk_hthread *thr, duk_idx_t idx) {
+ duk_tval *tv;
+ duk_hbufobj *h_obj;
+
+ /* Don't accept relative indices now. */
+ DUK_ASSERT(idx >= 0);
+
+ tv = duk_require_tval(thr, idx);
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h_obj = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h_obj != NULL);
+ if (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_obj)) {
+ DUK_ASSERT_HBUFOBJ_VALID(h_obj);
+ return h_obj;
+ }
+ } else if (DUK_TVAL_IS_BUFFER(tv)) {
+ h_obj = (duk_hbufobj *) duk_to_hobject(thr, idx);
+ DUK_ASSERT(h_obj != NULL);
+ DUK_ASSERT_HBUFOBJ_VALID(h_obj);
+ return h_obj;
+ }
+
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER);
+ return NULL; /* not reachable */
+}
+
+DUK_LOCAL void duk__set_bufobj_buffer(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_hbuffer *h_val) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h_bufobj != NULL);
+ DUK_ASSERT(h_bufobj->buf == NULL); /* no need to decref */
+ DUK_ASSERT(h_val != NULL);
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+ DUK_UNREF(thr);
+
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ h_bufobj->length = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_val);
+ DUK_ASSERT(h_bufobj->shift == 0);
+ DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8);
+ DUK_ASSERT(h_bufobj->is_typedarray == 0);
+
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+}
+
+/* Shared offset/length coercion helper. */
+DUK_LOCAL void duk__resolve_offset_opt_length(duk_hthread *thr,
+ duk_hbufobj *h_bufarg,
+ duk_idx_t idx_offset,
+ duk_idx_t idx_length,
+ duk_uint_t *out_offset,
+ duk_uint_t *out_length,
+ duk_bool_t throw_flag) {
+ duk_int_t offset_signed;
+ duk_int_t length_signed;
+ duk_uint_t offset;
+ duk_uint_t length;
+
+ offset_signed = duk_to_int(thr, idx_offset);
+ if (offset_signed < 0) {
+ goto fail_range;
+ }
+ offset = (duk_uint_t) offset_signed;
+ if (offset > h_bufarg->length) {
+ goto fail_range;
+ }
+ DUK_ASSERT_DISABLE(offset >= 0); /* unsigned */
+ DUK_ASSERT(offset <= h_bufarg->length);
+
+ if (duk_is_undefined(thr, idx_length)) {
+ DUK_ASSERT(h_bufarg->length >= offset);
+ length = h_bufarg->length - offset; /* >= 0 */
+ } else {
+ length_signed = duk_to_int(thr, idx_length);
+ if (length_signed < 0) {
+ goto fail_range;
+ }
+ length = (duk_uint_t) length_signed;
+ DUK_ASSERT(h_bufarg->length >= offset);
+ if (length > h_bufarg->length - offset) {
+ /* Unlike for negative arguments, some call sites
+ * want length to be clamped if it's positive.
+ */
+ if (throw_flag) {
+ goto fail_range;
+ } else {
+ length = h_bufarg->length - offset;
+ }
+ }
+ }
+ DUK_ASSERT_DISABLE(length >= 0); /* unsigned */
+ DUK_ASSERT(offset + length <= h_bufarg->length);
+
+ *out_offset = offset;
+ *out_length = length;
+ return;
+
+ fail_range:
+ DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS);
+}
+
+/* Shared lenient buffer length clamping helper. No negative indices, no
+ * element/byte shifting.
+ */
+DUK_LOCAL void duk__clamp_startend_nonegidx_noshift(duk_hthread *thr,
+ duk_int_t buffer_length,
+ duk_idx_t idx_start,
+ duk_idx_t idx_end,
+ duk_int_t *out_start_offset,
+ duk_int_t *out_end_offset) {
+ duk_int_t start_offset;
+ duk_int_t end_offset;
+
+ DUK_ASSERT(out_start_offset != NULL);
+ DUK_ASSERT(out_end_offset != NULL);
+
+ /* undefined coerces to zero which is correct */
+ start_offset = duk_to_int_clamped(thr, idx_start, 0, buffer_length);
+ if (duk_is_undefined(thr, idx_end)) {
+ end_offset = buffer_length;
+ } else {
+ end_offset = duk_to_int_clamped(thr, idx_end, start_offset, buffer_length);
+ }
+
+ DUK_ASSERT(start_offset >= 0);
+ DUK_ASSERT(start_offset <= buffer_length);
+ DUK_ASSERT(end_offset >= 0);
+ DUK_ASSERT(end_offset <= buffer_length);
+ DUK_ASSERT(start_offset <= end_offset);
+
+ *out_start_offset = start_offset;
+ *out_end_offset = end_offset;
+}
+
+/* Shared lenient buffer length clamping helper. Indices are treated as
+ * element indices (though output values are byte offsets) which only
+ * really matters for TypedArray views as other buffer object have a zero
+ * shift. Negative indices are counted from end of input slice; crossed
+ * indices are clamped to zero length; and final indices are clamped
+ * against input slice. Used for e.g. ArrayBuffer slice().
+ */
+DUK_LOCAL void duk__clamp_startend_negidx_shifted(duk_hthread *thr,
+ duk_int_t buffer_length,
+ duk_uint8_t buffer_shift,
+ duk_idx_t idx_start,
+ duk_idx_t idx_end,
+ duk_int_t *out_start_offset,
+ duk_int_t *out_end_offset) {
+ duk_int_t start_offset;
+ duk_int_t end_offset;
+
+ DUK_ASSERT(out_start_offset != NULL);
+ DUK_ASSERT(out_end_offset != NULL);
+
+ buffer_length >>= buffer_shift; /* as (full) elements */
+
+ /* Resolve start/end offset as element indices first; arguments
+ * at idx_start/idx_end are element offsets. Working with element
+ * indices first also avoids potential for wrapping.
+ */
+
+ start_offset = duk_to_int(thr, idx_start);
+ if (start_offset < 0) {
+ start_offset = buffer_length + start_offset;
+ }
+ if (duk_is_undefined(thr, idx_end)) {
+ end_offset = buffer_length;
+ } else {
+ end_offset = duk_to_int(thr, idx_end);
+ if (end_offset < 0) {
+ end_offset = buffer_length + end_offset;
+ }
+ }
+ /* Note: start_offset/end_offset can still be < 0 here. */
+
+ if (start_offset < 0) {
+ start_offset = 0;
+ } else if (start_offset > buffer_length) {
+ start_offset = buffer_length;
+ }
+ if (end_offset < start_offset) {
+ end_offset = start_offset;
+ } else if (end_offset > buffer_length) {
+ end_offset = buffer_length;
+ }
+ DUK_ASSERT(start_offset >= 0);
+ DUK_ASSERT(start_offset <= buffer_length);
+ DUK_ASSERT(end_offset >= 0);
+ DUK_ASSERT(end_offset <= buffer_length);
+ DUK_ASSERT(start_offset <= end_offset);
+
+ /* Convert indices to byte offsets. */
+ start_offset <<= buffer_shift;
+ end_offset <<= buffer_shift;
+
+ *out_start_offset = start_offset;
+ *out_end_offset = end_offset;
+}
+
+DUK_INTERNAL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx) {
+ if (duk_is_buffer(thr, idx)) {
+ duk_to_object(thr, idx);
+ }
+}
+
+DUK_INTERNAL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf) {
+ /* Push Uint8Array which will share the same underlying buffer as
+ * the plain buffer argument. Also create an ArrayBuffer with the
+ * same backing for the result .buffer property.
+ */
+
+ duk_push_hbuffer(thr, h_buf);
+ duk_push_buffer_object(thr, -1, 0, (duk_size_t) DUK_HBUFFER_GET_SIZE(h_buf), DUK_BUFOBJ_UINT8ARRAY);
+ duk_remove_m2(thr);
+
+#if 0
+ /* More verbose equivalent; maybe useful if e.g. .buffer is omitted. */
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY),
+ DUK_BIDX_UINT8ARRAY_PROTOTYPE);
+ DUK_ASSERT(h_bufobj != NULL);
+ duk__set_bufobj_buffer(thr, h_bufobj, h_buf);
+ h_bufobj->is_typedarray = 1;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ h_arrbuf = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER),
+ DUK_BIDX_ARRAYBUFFER_PROTOTYPE);
+ DUK_ASSERT(h_arrbuf != NULL);
+ duk__set_bufobj_buffer(thr, h_arrbuf, h_buf);
+ DUK_ASSERT(h_arrbuf->is_typedarray == 0);
+ DUK_ASSERT_HBUFOBJ_VALID(h_arrbuf);
+
+ DUK_ASSERT(h_bufobj->buf_prop == NULL);
+ h_bufobj->buf_prop = (duk_hobject *) h_arrbuf;
+ DUK_ASSERT(h_arrbuf != NULL);
+ DUK_HBUFOBJ_INCREF(thr, h_arrbuf);
+ duk_pop(thr);
+#endif
+}
+
+/* Indexed read helper for buffer objects, also called from outside this file. */
+DUK_INTERNAL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) {
+ duk_double_union du;
+
+ DUK_MEMCPY((void *) du.uc, (const void *) p, (size_t) elem_size);
+
+ switch (h_bufobj->elem_type) {
+ case DUK_HBUFOBJ_ELEM_UINT8:
+ case DUK_HBUFOBJ_ELEM_UINT8CLAMPED:
+ duk_push_uint(thr, (duk_uint_t) du.uc[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_INT8:
+ duk_push_int(thr, (duk_int_t) (duk_int8_t) du.uc[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_UINT16:
+ duk_push_uint(thr, (duk_uint_t) du.us[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_INT16:
+ duk_push_int(thr, (duk_int_t) (duk_int16_t) du.us[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_UINT32:
+ duk_push_uint(thr, (duk_uint_t) du.ui[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_INT32:
+ duk_push_int(thr, (duk_int_t) (duk_int32_t) du.ui[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_FLOAT32:
+ duk_push_number(thr, (duk_double_t) du.f[0]);
+ break;
+ case DUK_HBUFOBJ_ELEM_FLOAT64:
+ duk_push_number(thr, (duk_double_t) du.d);
+ break;
+ default:
+ DUK_UNREACHABLE();
+ }
+}
+
+/* Indexed write helper for buffer objects, also called from outside this file. */
+DUK_INTERNAL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) {
+ duk_double_union du;
+
+ /* NOTE! Caller must ensure that any side effects from the
+ * coercions below are safe. If that cannot be guaranteed
+ * (which is normally the case), caller must coerce the
+ * argument using duk_to_number() before any pointer
+ * validations; the result of duk_to_number() always coerces
+ * without side effects here.
+ */
+
+ switch (h_bufobj->elem_type) {
+ case DUK_HBUFOBJ_ELEM_UINT8:
+ du.uc[0] = (duk_uint8_t) duk_to_uint32(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_UINT8CLAMPED:
+ du.uc[0] = (duk_uint8_t) duk_to_uint8clamped(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_INT8:
+ du.uc[0] = (duk_uint8_t) duk_to_int32(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_UINT16:
+ du.us[0] = (duk_uint16_t) duk_to_uint32(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_INT16:
+ du.us[0] = (duk_uint16_t) duk_to_int32(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_UINT32:
+ du.ui[0] = (duk_uint32_t) duk_to_uint32(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_INT32:
+ du.ui[0] = (duk_uint32_t) duk_to_int32(thr, -1);
+ break;
+ case DUK_HBUFOBJ_ELEM_FLOAT32:
+ du.f[0] = (duk_float_t) duk_to_number_m1(thr);
+ break;
+ case DUK_HBUFOBJ_ELEM_FLOAT64:
+ du.d = (duk_double_t) duk_to_number_m1(thr);
+ break;
+ default:
+ DUK_UNREACHABLE();
+ }
+
+ DUK_MEMCPY((void *) p, (const void *) du.uc, (size_t) elem_size);
+}
+
+/* Helper to create a fixed buffer from argument value at index 0.
+ * Node.js and allocPlain() compatible.
+ */
+DUK_LOCAL duk_hbuffer *duk__hbufobj_fixed_from_argvalue(duk_hthread *thr) {
+ duk_int_t len;
+ duk_int_t i;
+ duk_size_t buf_size;
+ duk_uint8_t *buf;
+
+ switch (duk_get_type(thr, 0)) {
+ case DUK_TYPE_NUMBER: {
+ len = duk_to_int_clamped(thr, 0, 0, DUK_INT_MAX);
+ (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len);
+ break;
+ }
+ case DUK_TYPE_BUFFER: { /* Treat like Uint8Array. */
+ goto slow_copy;
+ }
+ case DUK_TYPE_OBJECT: {
+ duk_hobject *h;
+ duk_hbufobj *h_bufobj;
+
+ /* For Node.js Buffers "Passing an ArrayBuffer returns a Buffer
+ * that shares allocated memory with the given ArrayBuffer."
+ * https://nodejs.org/api/buffer.html#buffer_buffer_from_buffer_alloc_and_buffer_allocunsafe
+ */
+
+ h = duk_known_hobject(thr, 0);
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAYBUFFER) {
+ DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(h));
+ h_bufobj = (duk_hbufobj *) h;
+ if (DUK_UNLIKELY(h_bufobj->buf == NULL)) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+ if (DUK_UNLIKELY(h_bufobj->offset != 0 || h_bufobj->length != DUK_HBUFFER_GET_SIZE(h_bufobj->buf))) {
+ /* No support for ArrayBuffers with slice
+ * offset/length.
+ */
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+ duk_push_hbuffer(thr, h_bufobj->buf);
+ return h_bufobj->buf;
+ }
+ goto slow_copy;
+ }
+ case DUK_TYPE_STRING: {
+ /* ignore encoding for now */
+ duk_require_hstring_notsymbol(thr, 0);
+ duk_dup_0(thr);
+ (void) duk_to_buffer(thr, -1, &buf_size);
+ break;
+ }
+ default:
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ done:
+ DUK_ASSERT(duk_is_buffer(thr, -1));
+ return duk_known_hbuffer(thr, -1);
+
+ slow_copy:
+ /* XXX: fast path for typed arrays and other buffer objects? */
+
+ (void) duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);
+ len = duk_to_int_clamped(thr, -1, 0, DUK_INT_MAX);
+ duk_pop(thr);
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len); /* no zeroing, all indices get initialized */
+ for (i = 0; i < len; i++) {
+ /* XXX: fast path for array or buffer arguments? */
+ duk_get_prop_index(thr, 0, (duk_uarridx_t) i);
+ buf[i] = (duk_uint8_t) (duk_to_uint32(thr, -1) & 0xffU);
+ duk_pop(thr);
+ }
+ goto done;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer constructor
+ *
+ * Node.js Buffers are just Uint8Arrays with internal prototype set to
+ * Buffer.prototype so they're handled otherwise the same as Uint8Array.
+ * However, the constructor arguments are very different so a separate
+ * constructor entry point is used.
+ */
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_hthread *thr) {
+ duk_hbuffer *h_buf;
+
+ h_buf = duk__hbufobj_fixed_from_argvalue(thr);
+ DUK_ASSERT(h_buf != NULL);
+
+ duk_push_buffer_object(thr,
+ -1,
+ 0,
+ DUK_HBUFFER_FIXED_GET_SIZE((duk_hbuffer_fixed *) h_buf),
+ DUK_BUFOBJ_UINT8ARRAY);
+ duk_push_hobject_bidx(thr, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE);
+ duk_set_prototype(thr, -2);
+
+ /* XXX: a more direct implementation */
+
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * ArrayBuffer, DataView, and TypedArray constructors
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_constructor(duk_hthread *thr) {
+ duk_hbufobj *h_bufobj;
+ duk_hbuffer *h_val;
+ duk_int_t len;
+
+ DUK_ASSERT_CTX_VALID(thr);
+
+ duk_require_constructor_call(thr);
+
+ len = duk_to_int(thr, 0);
+ if (len < 0) {
+ goto fail_length;
+ }
+ (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len);
+ h_val = (duk_hbuffer *) duk_known_hbuffer(thr, -1);
+
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER),
+ DUK_BIDX_ARRAYBUFFER_PROTOTYPE);
+ DUK_ASSERT(h_bufobj != NULL);
+
+ duk__set_bufobj_buffer(thr, h_bufobj, h_val);
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ return 1;
+
+ fail_length:
+ DUK_DCERROR_RANGE_INVALID_LENGTH(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+
+/* Format of magic, bits:
+ * 0...1: elem size shift (0-3)
+ * 2...5: elem type (DUK_HBUFOBJ_ELEM_xxx)
+ *
+ * XXX: add prototype bidx explicitly to magic instead of using a mapping?
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) {
+ duk_tval *tv;
+ duk_hobject *h_obj;
+ duk_hbufobj *h_bufobj = NULL;
+ duk_hbufobj *h_bufarg = NULL;
+ duk_hbuffer *h_val;
+ duk_small_uint_t magic;
+ duk_small_uint_t shift;
+ duk_small_uint_t elem_type;
+ duk_small_uint_t elem_size;
+ duk_small_uint_t class_num;
+ duk_small_uint_t proto_bidx;
+ duk_uint_t align_mask;
+ duk_uint_t elem_length;
+ duk_int_t elem_length_signed;
+ duk_uint_t byte_length;
+ duk_small_uint_t copy_mode;
+
+ /* XXX: The same copy helpers could be shared with at least some
+ * buffer functions.
+ */
+
+ duk_require_constructor_call(thr);
+
+ /* We could fit built-in index into magic but that'd make the magic
+ * number dependent on built-in numbering (genbuiltins.py doesn't
+ * handle that yet). So map both class and prototype from the
+ * element type.
+ */
+ magic = (duk_small_uint_t) duk_get_current_magic(thr);
+ shift = magic & 0x03U; /* bits 0...1: shift */
+ elem_type = (magic >> 2) & 0x0fU; /* bits 2...5: type */
+ elem_size = 1U << shift;
+ align_mask = elem_size - 1;
+ DUK_ASSERT(elem_type < sizeof(duk__buffer_proto_from_elemtype) / sizeof(duk_uint8_t));
+ proto_bidx = duk__buffer_proto_from_elemtype[elem_type];
+ DUK_ASSERT(proto_bidx < DUK_NUM_BUILTINS);
+ DUK_ASSERT(elem_type < sizeof(duk__buffer_class_from_elemtype) / sizeof(duk_uint8_t));
+ class_num = duk__buffer_class_from_elemtype[elem_type];
+
+ DUK_DD(DUK_DDPRINT("typedarray constructor, magic=%d, shift=%d, elem_type=%d, "
+ "elem_size=%d, proto_bidx=%d, class_num=%d",
+ (int) magic, (int) shift, (int) elem_type, (int) elem_size,
+ (int) proto_bidx, (int) class_num));
+
+ /* Argument variants. When the argument is an ArrayBuffer a view to
+ * the same buffer is created; otherwise a new ArrayBuffer is always
+ * created.
+ */
+
+ /* XXX: initial iteration to treat a plain buffer like an ArrayBuffer:
+ * coerce to an ArrayBuffer object and use that as .buffer. The underlying
+ * buffer will be the same but result .buffer !== inputPlainBuffer.
+ */
+ duk_hbufobj_promote_plain(thr, 0);
+
+ tv = duk_get_tval(thr, 0);
+ DUK_ASSERT(tv != NULL); /* arg count */
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h_obj = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h_obj != NULL);
+
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_ARRAYBUFFER) {
+ /* ArrayBuffer: unlike any other argument variant, create
+ * a view into the existing buffer.
+ */
+
+ duk_int_t byte_offset_signed;
+ duk_uint_t byte_offset;
+
+ h_bufarg = (duk_hbufobj *) h_obj;
+
+ byte_offset_signed = duk_to_int(thr, 1);
+ if (byte_offset_signed < 0) {
+ goto fail_arguments;
+ }
+ byte_offset = (duk_uint_t) byte_offset_signed;
+ if (byte_offset > h_bufarg->length ||
+ (byte_offset & align_mask) != 0) {
+ /* Must be >= 0 and multiple of element size. */
+ goto fail_arguments;
+ }
+ if (duk_is_undefined(thr, 2)) {
+ DUK_ASSERT(h_bufarg->length >= byte_offset);
+ byte_length = h_bufarg->length - byte_offset;
+ if ((byte_length & align_mask) != 0) {
+ /* Must be element size multiple from
+ * start offset to end of buffer.
+ */
+ goto fail_arguments;
+ }
+ elem_length = (byte_length >> shift);
+ } else {
+ elem_length_signed = duk_to_int(thr, 2);
+ if (elem_length_signed < 0) {
+ goto fail_arguments;
+ }
+ elem_length = (duk_uint_t) elem_length_signed;
+ byte_length = elem_length << shift;
+ if ((byte_length >> shift) != elem_length) {
+ /* Byte length would overflow. */
+ /* XXX: easier check with less code? */
+ goto fail_arguments;
+ }
+ DUK_ASSERT(h_bufarg->length >= byte_offset);
+ if (byte_length > h_bufarg->length - byte_offset) {
+ /* Not enough data. */
+ goto fail_arguments;
+ }
+ }
+ DUK_UNREF(elem_length);
+ DUK_ASSERT_DISABLE(byte_offset >= 0);
+ DUK_ASSERT(byte_offset <= h_bufarg->length);
+ DUK_ASSERT_DISABLE(byte_length >= 0);
+ DUK_ASSERT(byte_offset + byte_length <= h_bufarg->length);
+ DUK_ASSERT((elem_length << shift) == byte_length);
+
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(class_num),
+ (duk_small_int_t) proto_bidx);
+ h_val = h_bufarg->buf;
+ if (h_val == NULL) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ h_bufobj->offset = h_bufarg->offset + byte_offset;
+ h_bufobj->length = byte_length;
+ h_bufobj->shift = (duk_uint8_t) shift;
+ h_bufobj->elem_type = (duk_uint8_t) elem_type;
+ h_bufobj->is_typedarray = 1;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ /* Set .buffer to the argument ArrayBuffer. */
+ DUK_ASSERT(h_bufobj->buf_prop == NULL);
+ h_bufobj->buf_prop = (duk_hobject *) h_bufarg;
+ DUK_ASSERT(h_bufarg != NULL);
+ DUK_HBUFOBJ_INCREF(thr, h_bufarg);
+ return 1;
+ } else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {
+ /* TypedArray (or other non-ArrayBuffer duk_hbufobj).
+ * Conceptually same behavior as for an Array-like argument,
+ * with a few fast paths.
+ */
+
+ h_bufarg = (duk_hbufobj *) h_obj;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufarg);
+ elem_length_signed = (duk_int_t) (h_bufarg->length >> h_bufarg->shift);
+ if (h_bufarg->buf == NULL) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ /* Select copy mode. Must take into account element
+ * compatibility and validity of the underlying source
+ * buffer.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("selecting copy mode for bufobj arg, "
+ "src byte_length=%ld, src shift=%d, "
+ "src/dst elem_length=%ld; "
+ "dst shift=%d -> dst byte_length=%ld",
+ (long) h_bufarg->length, (int) h_bufarg->shift,
+ (long) elem_length_signed, (int) shift,
+ (long) (elem_length_signed << shift)));
+
+ copy_mode = 2; /* default is explicit index read/write copy */
+#if !defined(DUK_USE_PREFER_SIZE)
+ /* With a size optimized build copy_mode 2 is enough.
+ * Modes 0 and 1 are faster but conceptually the same.
+ */
+ DUK_ASSERT(elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t));
+ if (DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) {
+ if ((duk__buffer_elemtype_copy_compatible[elem_type] & (1 << h_bufarg->elem_type)) != 0) {
+ DUK_DDD(DUK_DDDPRINT("source/target are copy compatible, memcpy"));
+ DUK_ASSERT(shift == h_bufarg->shift); /* byte sizes will match */
+ copy_mode = 0;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("source/target not copy compatible but valid, fast copy"));
+ copy_mode = 1;
+ }
+ }
+#endif /* !DUK_USE_PREFER_SIZE */
+ } else {
+ /* Array or Array-like */
+ elem_length_signed = (duk_int_t) duk_get_length(thr, 0);
+ copy_mode = 2;
+ }
+ } else {
+ /* Non-object argument is simply int coerced, matches
+ * V8 behavior (except for "null", which we coerce to
+ * 0 but V8 TypeErrors).
+ */
+ elem_length_signed = duk_to_int(thr, 0);
+ copy_mode = 3;
+ }
+ if (elem_length_signed < 0) {
+ goto fail_arguments;
+ }
+ elem_length = (duk_uint_t) elem_length_signed;
+ byte_length = (duk_uint_t) (elem_length << shift);
+ if ((byte_length >> shift) != elem_length) {
+ /* Byte length would overflow. */
+ /* XXX: easier check with less code? */
+ goto fail_arguments;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("elem_length=%ld, byte_length=%ld",
+ (long) elem_length, (long) byte_length));
+
+ /* ArrayBuffer argument is handled specially above; the rest of the
+ * argument variants are handled by shared code below.
+ *
+ * ArrayBuffer in h_bufobj->buf_prop is intentionally left unset.
+ * It will be automatically created by the .buffer accessor on
+ * first access.
+ */
+
+ /* Push the resulting view object on top of a plain fixed buffer. */
+ (void) duk_push_fixed_buffer(thr, byte_length);
+ h_val = duk_known_hbuffer(thr, -1);
+ DUK_ASSERT(h_val != NULL);
+
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(class_num),
+ (duk_small_int_t) proto_bidx);
+
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ DUK_ASSERT(h_bufobj->offset == 0);
+ h_bufobj->length = byte_length;
+ h_bufobj->shift = (duk_uint8_t) shift;
+ h_bufobj->elem_type = (duk_uint8_t) elem_type;
+ h_bufobj->is_typedarray = 1;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ /* Copy values, the copy method depends on the arguments.
+ *
+ * Copy mode decision may depend on the validity of the underlying
+ * buffer of the source argument; there must be no harmful side effects
+ * from there to here for copy_mode to still be valid.
+ */
+ DUK_DDD(DUK_DDDPRINT("copy mode: %d", (int) copy_mode));
+ switch (copy_mode) {
+ /* Copy modes 0 and 1 can be omitted in size optimized build,
+ * copy mode 2 handles them (but more slowly).
+ */
+#if !defined(DUK_USE_PREFER_SIZE)
+ case 0: {
+ /* Use byte copy. */
+
+ duk_uint8_t *p_src;
+ duk_uint8_t *p_dst;
+
+ DUK_ASSERT(h_bufobj != NULL);
+ DUK_ASSERT(h_bufobj->buf != NULL);
+ DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj));
+ DUK_ASSERT(h_bufarg != NULL);
+ DUK_ASSERT(h_bufarg->buf != NULL);
+ DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg));
+
+ p_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj);
+ p_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg);
+
+ DUK_DDD(DUK_DDDPRINT("using memcpy: p_src=%p, p_dst=%p, byte_length=%ld",
+ (void *) p_src, (void *) p_dst, (long) byte_length));
+
+ DUK_MEMCPY((void *) p_dst, (const void *) p_src, (size_t) byte_length);
+ break;
+ }
+ case 1: {
+ /* Copy values through direct validated reads and writes. */
+
+ duk_small_uint_t src_elem_size;
+ duk_small_uint_t dst_elem_size;
+ duk_uint8_t *p_src;
+ duk_uint8_t *p_src_end;
+ duk_uint8_t *p_dst;
+
+ DUK_ASSERT(h_bufobj != NULL);
+ DUK_ASSERT(h_bufobj->buf != NULL);
+ DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj));
+ DUK_ASSERT(h_bufarg != NULL);
+ DUK_ASSERT(h_bufarg->buf != NULL);
+ DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg));
+
+ src_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift);
+ dst_elem_size = elem_size;
+
+ p_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg);
+ p_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj);
+ p_src_end = p_src + h_bufarg->length;
+
+ DUK_DDD(DUK_DDDPRINT("using fast copy: p_src=%p, p_src_end=%p, p_dst=%p, "
+ "src_elem_size=%d, dst_elem_size=%d",
+ (void *) p_src, (void *) p_src_end, (void *) p_dst,
+ (int) src_elem_size, (int) dst_elem_size));
+
+ while (p_src != p_src_end) {
+ DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: "
+ "p_src=%p, p_src_end=%p, p_dst=%p",
+ (void *) p_src, (void *) p_src_end, (void *) p_dst));
+ /* A validated read() is always a number, so it's write coercion
+ * is always side effect free an won't invalidate pointers etc.
+ */
+ duk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size);
+ duk_hbufobj_validated_write(thr, h_bufobj, p_dst, dst_elem_size);
+ duk_pop(thr);
+ p_src += src_elem_size;
+ p_dst += dst_elem_size;
+ }
+ break;
+ }
+#endif /* !DUK_USE_PREFER_SIZE */
+ case 2: {
+ /* Copy values by index reads and writes. Let virtual
+ * property handling take care of coercion.
+ */
+ duk_uint_t i;
+
+ DUK_DDD(DUK_DDDPRINT("using slow copy"));
+
+ for (i = 0; i < elem_length; i++) {
+ duk_get_prop_index(thr, 0, (duk_uarridx_t) i);
+ duk_put_prop_index(thr, -2, (duk_uarridx_t) i);
+ }
+ break;
+ }
+ default:
+ case 3: {
+ /* No copy, leave zero bytes in the buffer. There's no
+ * ambiguity with Float32/Float64 because zero bytes also
+ * represent 0.0.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("using no copy"));
+ break;
+ }
+ }
+
+ return 1;
+
+ fail_arguments:
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#else /* DUK_USE_BUFFEROBJECT_SUPPORT */
+/* When bufferobject support is disabled, new Uint8Array() could still be
+ * supported to create a plain fixed buffer. Disabled for now.
+ */
+#if 0
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) {
+ duk_int_t elem_length_signed;
+ duk_uint_t byte_length;
+
+ /* XXX: The same copy helpers could be shared with at least some
+ * buffer functions.
+ */
+
+ duk_require_constructor_call(thr);
+
+ elem_length_signed = duk_require_int(thr, 0);
+ if (elem_length_signed < 0) {
+ goto fail_arguments;
+ }
+ byte_length = (duk_uint_t) elem_length_signed;
+
+ (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) byte_length);
+ return 1;
+
+ fail_arguments:
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#endif /* 0 */
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_dataview_constructor(duk_hthread *thr) {
+ duk_hbufobj *h_bufarg;
+ duk_hbufobj *h_bufobj;
+ duk_hbuffer *h_val;
+ duk_uint_t offset;
+ duk_uint_t length;
+
+ duk_require_constructor_call(thr);
+
+ h_bufarg = duk__require_bufobj_value(thr, 0);
+ DUK_ASSERT(h_bufarg != NULL);
+ if (DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufarg) != DUK_HOBJECT_CLASS_ARRAYBUFFER) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ duk__resolve_offset_opt_length(thr, h_bufarg, 1, 2, &offset, &length, 1 /*throw_flag*/);
+ DUK_ASSERT(offset <= h_bufarg->length);
+ DUK_ASSERT(offset + length <= h_bufarg->length);
+
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATAVIEW),
+ DUK_BIDX_DATAVIEW_PROTOTYPE);
+
+ h_val = h_bufarg->buf;
+ if (h_val == NULL) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ h_bufobj->offset = h_bufarg->offset + offset;
+ h_bufobj->length = length;
+ DUK_ASSERT(h_bufobj->shift == 0);
+ DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8);
+ DUK_ASSERT(h_bufobj->is_typedarray == 0);
+
+ DUK_ASSERT(h_bufobj->buf_prop == NULL);
+ h_bufobj->buf_prop = (duk_hobject *) h_bufarg;
+ DUK_ASSERT(h_bufarg != NULL);
+ DUK_HBUFOBJ_INCREF(thr, h_bufarg);
+
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * ArrayBuffer.isView()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_isview(duk_hthread *thr) {
+ duk_hobject *h_obj;
+ duk_bool_t ret = 0;
+
+ if (duk_is_buffer(thr, 0)) {
+ ret = 1;
+ } else {
+ h_obj = duk_get_hobject(thr, 0);
+ if (h_obj != NULL && DUK_HOBJECT_IS_BUFOBJ(h_obj)) {
+ /* DataView needs special casing: ArrayBuffer.isView() is
+ * true, but ->is_typedarray is 0.
+ */
+ ret = ((duk_hbufobj *) h_obj)->is_typedarray ||
+ (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_DATAVIEW);
+ }
+ }
+ duk_push_boolean(thr, ret);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Uint8Array.allocPlain()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_uint8array_allocplain(duk_hthread *thr) {
+ duk__hbufobj_fixed_from_argvalue(thr);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Uint8Array.plainOf()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_uint8array_plainof(duk_hthread *thr) {
+ duk_hbufobj *h_bufobj;
+
+#if !defined(DUK_USE_PREFER_SIZE)
+ /* Avoid churn if argument is already a plain buffer. */
+ if (duk_is_buffer(thr, 0)) {
+ return 1;
+ }
+#endif
+
+ /* Promotes plain buffers to ArrayBuffers, so for a plain buffer
+ * argument we'll create a pointless temporary (but still work
+ * correctly).
+ */
+ h_bufobj = duk__require_bufobj_value(thr, 0);
+ if (h_bufobj->buf == NULL) {
+ duk_push_undefined(thr);
+ } else {
+ duk_push_hbuffer(thr, h_bufobj->buf);
+ }
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer: toString([encoding], [start], [end])
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_hthread *thr) {
+ duk_hbufobj *h_this;
+ duk_int_t start_offset, end_offset;
+ duk_uint8_t *buf_slice;
+ duk_size_t slice_length;
+
+ h_this = duk__get_bufobj_this(thr);
+ if (h_this == NULL) {
+ /* XXX: happens e.g. when evaluating: String(Buffer.prototype). */
+ duk_push_string(thr, "[object Object]");
+ return 1;
+ }
+ DUK_ASSERT_HBUFOBJ_VALID(h_this);
+
+ /* Ignore encoding for now. */
+
+ duk__clamp_startend_nonegidx_noshift(thr,
+ (duk_int_t) h_this->length,
+ 1 /*idx_start*/,
+ 2 /*idx_end*/,
+ &start_offset,
+ &end_offset);
+
+ slice_length = (duk_size_t) (end_offset - start_offset);
+ buf_slice = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, slice_length); /* all bytes initialized below */
+ DUK_ASSERT(buf_slice != NULL);
+
+ /* Neutered or uncovered, TypeError. */
+ if (h_this->buf == NULL ||
+ !DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length)) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ /* XXX: ideally we wouldn't make a copy but a view into the buffer for the
+ * decoding process. Or the decoding helper could be changed to accept
+ * the slice info (a buffer pointer is NOT a good approach because guaranteeing
+ * its stability is difficult).
+ */
+
+ DUK_ASSERT(DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length));
+ DUK_MEMCPY((void *) buf_slice,
+ (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset),
+ (size_t) slice_length);
+
+ /* Use the equivalent of: new TextEncoder().encode(this) to convert the
+ * string. Result will be valid UTF-8; non-CESU-8 inputs are currently
+ * interpreted loosely. Value stack convention is a bit odd for now.
+ */
+ duk_replace(thr, 0);
+ duk_set_top(thr, 1);
+ return duk_textdecoder_decode_utf8_nodejs(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.prototype: toJSON()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_hthread *thr) {
+ duk_hbufobj *h_this;
+ duk_uint8_t *buf;
+ duk_uint_t i, n;
+ duk_tval *tv;
+
+ h_this = duk__require_bufobj_this(thr);
+ DUK_ASSERT(h_this != NULL);
+
+ if (h_this->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_this)) {
+ /* Serialize uncovered backing buffer as a null; doesn't
+ * really matter as long we're memory safe.
+ */
+ duk_push_null(thr);
+ return 1;
+ }
+
+ duk_push_object(thr);
+ duk_push_hstring_stridx(thr, DUK_STRIDX_UC_BUFFER);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_TYPE);
+
+ /* XXX: uninitialized would be OK */
+ DUK_ASSERT_DISABLE((duk_size_t) h_this->length <= (duk_size_t) DUK_UINT32_MAX);
+ tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) h_this->length); /* XXX: needs revision with >4G buffers */
+
+ DUK_ASSERT(h_this->buf != NULL);
+ buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this);
+ for (i = 0, n = h_this->length; i < n; i++) {
+ DUK_TVAL_SET_U32(tv + i, (duk_uint32_t) buf[i]); /* no need for decref or incref */
+ }
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_DATA);
+
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.prototype.equals()
+ * Node.js Buffer.prototype.compare()
+ * Node.js Buffer.compare()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_buffer_compare_shared(duk_hthread *thr) {
+ duk_small_uint_t magic;
+ duk_hbufobj *h_bufarg1;
+ duk_hbufobj *h_bufarg2;
+ duk_small_int_t comp_res;
+
+ /* XXX: keep support for plain buffers and non-Node.js buffers? */
+
+ magic = (duk_small_uint_t) duk_get_current_magic(thr);
+ if (magic & 0x02U) {
+ /* Static call style. */
+ h_bufarg1 = duk__require_bufobj_value(thr, 0);
+ h_bufarg2 = duk__require_bufobj_value(thr, 1);
+ } else {
+ h_bufarg1 = duk__require_bufobj_this(thr);
+ h_bufarg2 = duk__require_bufobj_value(thr, 0);
+ }
+ DUK_ASSERT(h_bufarg1 != NULL);
+ DUK_ASSERT(h_bufarg2 != NULL);
+
+ /* We want to compare the slice/view areas of the arguments.
+ * If either slice/view is invalid (underlying buffer is shorter)
+ * ensure equals() is false, but otherwise the only thing that
+ * matters is to be memory safe.
+ */
+
+ if (DUK_HBUFOBJ_VALID_SLICE(h_bufarg1) &&
+ DUK_HBUFOBJ_VALID_SLICE(h_bufarg2)) {
+ comp_res = duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg1->buf) + h_bufarg1->offset,
+ (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg2->buf) + h_bufarg2->offset,
+ (duk_size_t) h_bufarg1->length,
+ (duk_size_t) h_bufarg2->length);
+ } else {
+ comp_res = -1; /* either nonzero value is ok */
+ }
+
+ if (magic & 0x01U) {
+ /* compare: similar to string comparison but for buffer data. */
+ duk_push_int(thr, comp_res);
+ } else {
+ /* equals */
+ duk_push_boolean(thr, (comp_res == 0));
+ }
+
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.prototype.fill()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_fill(duk_hthread *thr) {
+ duk_hbufobj *h_this;
+ const duk_uint8_t *fill_str_ptr;
+ duk_size_t fill_str_len;
+ duk_uint8_t fill_value;
+ duk_int_t fill_offset;
+ duk_int_t fill_end;
+ duk_size_t fill_length;
+ duk_uint8_t *p;
+
+ h_this = duk__require_bufobj_this(thr);
+ DUK_ASSERT(h_this != NULL);
+ if (h_this->buf == NULL) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ /* [ value offset end ] */
+
+ if (duk_is_string_notsymbol(thr, 0)) {
+ fill_str_ptr = (const duk_uint8_t *) duk_get_lstring(thr, 0, &fill_str_len);
+ DUK_ASSERT(fill_str_ptr != NULL);
+ } else {
+ /* Symbols get ToNumber() coerced and cause TypeError. */
+ fill_value = (duk_uint8_t) duk_to_uint32(thr, 0);
+ fill_str_ptr = (const duk_uint8_t *) &fill_value;
+ fill_str_len = 1;
+ }
+
+ /* Fill offset handling is more lenient than in Node.js. */
+
+ duk__clamp_startend_nonegidx_noshift(thr,
+ (duk_int_t) h_this->length,
+ 1 /*idx_start*/,
+ 2 /*idx_end*/,
+ &fill_offset,
+ &fill_end);
+
+ DUK_DDD(DUK_DDDPRINT("fill: fill_value=%02x, fill_offset=%ld, fill_end=%ld, view length=%ld",
+ (unsigned int) fill_value, (long) fill_offset, (long) fill_end, (long) h_this->length));
+
+ DUK_ASSERT(fill_end - fill_offset >= 0);
+ DUK_ASSERT(h_this->buf != NULL);
+
+ p = (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + fill_offset);
+ fill_length = (duk_size_t) (fill_end - fill_offset);
+ if (fill_str_len == 1) {
+ /* Handle single character fills as memset() even when
+ * the fill data comes from a one-char argument.
+ */
+ DUK_MEMSET((void *) p, (int) fill_str_ptr[0], (size_t) fill_length);
+ } else if (fill_str_len > 1) {
+ duk_size_t i, n, t;
+
+ for (i = 0, n = (duk_size_t) (fill_end - fill_offset), t = 0; i < n; i++) {
+ p[i] = fill_str_ptr[t++];
+ if (t >= fill_str_len) {
+ t = 0;
+ }
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("zero size fill pattern, ignore silently"));
+ }
+
+ /* Return the Buffer to allow chaining: b.fill(0x11).fill(0x22, 3, 5).toString() */
+ duk_push_this(thr);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.prototype.write(string, [offset], [length], [encoding])
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_write(duk_hthread *thr) {
+ duk_hbufobj *h_this;
+ duk_uint_t offset;
+ duk_uint_t length;
+ const duk_uint8_t *str_data;
+ duk_size_t str_len;
+
+ /* XXX: very inefficient support for plain buffers */
+ h_this = duk__require_bufobj_this(thr);
+ DUK_ASSERT(h_this != NULL);
+
+ /* Argument must be a string, e.g. a buffer is not allowed. */
+ str_data = (const duk_uint8_t *) duk_require_lstring_notsymbol(thr, 0, &str_len);
+
+ duk__resolve_offset_opt_length(thr, h_this, 1, 2, &offset, &length, 0 /*throw_flag*/);
+ DUK_ASSERT(offset <= h_this->length);
+ DUK_ASSERT(offset + length <= h_this->length);
+
+ /* XXX: encoding is ignored now. */
+
+ if (length > str_len) {
+ length = (duk_uint_t) str_len;
+ }
+
+ if (DUK_HBUFOBJ_VALID_SLICE(h_this)) {
+ /* Cannot overlap. */
+ DUK_MEMCPY((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset),
+ (const void *) str_data,
+ (size_t) length);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("write() target buffer is not covered, silent ignore"));
+ }
+
+ duk_push_uint(thr, length);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.prototype.copy()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_copy(duk_hthread *thr) {
+ duk_hbufobj *h_this;
+ duk_hbufobj *h_bufarg;
+ duk_int_t source_length;
+ duk_int_t target_length;
+ duk_int_t target_start, source_start, source_end;
+ duk_uint_t target_ustart, source_ustart, source_uend;
+ duk_uint_t copy_size = 0;
+
+ /* [ targetBuffer targetStart sourceStart sourceEnd ] */
+
+ h_this = duk__require_bufobj_this(thr);
+ h_bufarg = duk__require_bufobj_value(thr, 0);
+ DUK_ASSERT(h_this != NULL);
+ DUK_ASSERT(h_bufarg != NULL);
+ source_length = (duk_int_t) h_this->length;
+ target_length = (duk_int_t) h_bufarg->length;
+
+ target_start = duk_to_int(thr, 1);
+ source_start = duk_to_int(thr, 2);
+ if (duk_is_undefined(thr, 3)) {
+ source_end = source_length;
+ } else {
+ source_end = duk_to_int(thr, 3);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("checking copy args: target_start=%ld, target_length=%ld, "
+ "source_start=%ld, source_end=%ld, source_length=%ld",
+ (long) target_start, (long) h_bufarg->length,
+ (long) source_start, (long) source_end, (long) source_length));
+
+ /* This behavior mostly mimics Node.js now. */
+
+ if (source_start < 0 || source_end < 0 || target_start < 0) {
+ /* Negative offsets cause a RangeError. */
+ goto fail_bounds;
+ }
+ source_ustart = (duk_uint_t) source_start;
+ source_uend = (duk_uint_t) source_end;
+ target_ustart = (duk_uint_t) target_start;
+ if (source_ustart >= source_uend || /* crossed offsets or zero size */
+ source_ustart >= (duk_uint_t) source_length || /* source out-of-bounds (but positive) */
+ target_ustart >= (duk_uint_t) target_length) { /* target out-of-bounds (but positive) */
+ goto silent_ignore;
+ }
+ if (source_uend >= (duk_uint_t) source_length) {
+ /* Source end clamped silently to available length. */
+ source_uend = (duk_uint_t) source_length;
+ }
+ copy_size = source_uend - source_ustart;
+ if (target_ustart + copy_size > (duk_uint_t) target_length) {
+ /* Clamp to target's end if too long.
+ *
+ * NOTE: there's no overflow possibility in the comparison;
+ * both target_ustart and copy_size are >= 0 and based on
+ * values in duk_int_t range. Adding them as duk_uint_t
+ * values is then guaranteed not to overflow.
+ */
+ DUK_ASSERT(target_ustart + copy_size >= target_ustart); /* no overflow */
+ DUK_ASSERT(target_ustart + copy_size >= copy_size); /* no overflow */
+ copy_size = (duk_uint_t) target_length - target_ustart;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("making copy: target_ustart=%lu source_ustart=%lu copy_size=%lu",
+ (unsigned long) target_ustart, (unsigned long) source_ustart,
+ (unsigned long) copy_size));
+
+ DUK_ASSERT(copy_size >= 1);
+ DUK_ASSERT(source_ustart <= (duk_uint_t) source_length);
+ DUK_ASSERT(source_ustart + copy_size <= (duk_uint_t) source_length);
+ DUK_ASSERT(target_ustart <= (duk_uint_t) target_length);
+ DUK_ASSERT(target_ustart + copy_size <= (duk_uint_t) target_length);
+
+ /* Ensure copy is covered by underlying buffers. */
+ DUK_ASSERT(h_bufarg->buf != NULL); /* length check */
+ DUK_ASSERT(h_this->buf != NULL); /* length check */
+ if (DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufarg, target_ustart + copy_size) &&
+ DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, source_ustart + copy_size)) {
+ /* Must use memmove() because copy area may overlap (source and target
+ * buffer may be the same, or from different slices.
+ */
+ DUK_MEMMOVE((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg) + target_ustart),
+ (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + source_ustart),
+ (size_t) copy_size);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("buffer copy not covered by underlying buffer(s), ignoring"));
+ }
+
+ silent_ignore:
+ /* Return value is like write(), number of bytes written.
+ * The return value matters because of code like:
+ * "off += buf.copy(...)".
+ */
+ duk_push_uint(thr, copy_size);
+ return 1;
+
+ fail_bounds:
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * TypedArray.prototype.set()
+ *
+ * TypedArray set() is pretty interesting to implement because:
+ *
+ * - The source argument may be a plain array or a typedarray. If the
+ * source is a TypedArray, values are decoded and re-encoded into the
+ * target (not as a plain byte copy). This may happen even when the
+ * element byte size is the same, e.g. integer values may be re-encoded
+ * into floats.
+ *
+ * - Source and target may refer to the same underlying buffer, so that
+ * the set() operation may overlap. The specification requires that this
+ * must work as if a copy was made before the operation. Note that this
+ * is NOT a simple memmove() situation because the source and target
+ * byte sizes may be different -- e.g. a 4-byte source (Int8Array) may
+ * expand to a 16-byte target (Uint32Array) so that the target overlaps
+ * the source both from beginning and the end (unlike in typical memmove).
+ *
+ * - Even if 'buf' pointers of the source and target differ, there's no
+ * guarantee that their memory areas don't overlap. This may be the
+ * case with external buffers.
+ *
+ * Even so, it is nice to optimize for the common case:
+ *
+ * - Source and target separate buffers or non-overlapping.
+ *
+ * - Source and target have a compatible type so that a plain byte copy
+ * is possible. Note that while e.g. uint8 and int8 are compatible
+ * (coercion one way or another doesn't change the byte representation),
+ * e.g. int8 and uint8clamped are NOT compatible when writing int8
+ * values into uint8clamped typedarray (-1 would clamp to 0 for instance).
+ *
+ * See test-bi-typedarray-proto-set.js.
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_set(duk_hthread *thr) {
+ duk_hbufobj *h_this;
+ duk_hobject *h_obj;
+ duk_uarridx_t i, n;
+ duk_int_t offset_signed;
+ duk_uint_t offset_elems;
+ duk_uint_t offset_bytes;
+
+ h_this = duk__require_bufobj_this(thr);
+ DUK_ASSERT(h_this != NULL);
+ DUK_ASSERT_HBUFOBJ_VALID(h_this);
+
+ if (h_this->buf == NULL) {
+ DUK_DDD(DUK_DDDPRINT("source neutered, skip copy"));
+ return 0;
+ }
+
+ duk_hbufobj_promote_plain(thr, 0);
+ h_obj = duk_require_hobject(thr, 0);
+
+ /* XXX: V8 throws a TypeError for negative values. Would it
+ * be more useful to interpret negative offsets here from the
+ * end of the buffer too?
+ */
+ offset_signed = duk_to_int(thr, 1);
+ if (offset_signed < 0) {
+ /* For some reason this is a TypeError (at least in V8). */
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+ offset_elems = (duk_uint_t) offset_signed;
+ offset_bytes = offset_elems << h_this->shift;
+ if ((offset_bytes >> h_this->shift) != offset_elems) {
+ /* Byte length would overflow. */
+ /* XXX: easier check with less code? */
+ goto fail_args;
+ }
+ if (offset_bytes > h_this->length) {
+ /* Equality may be OK but >length not. Checking
+ * this explicitly avoids some overflow cases
+ * below.
+ */
+ goto fail_args;
+ }
+ DUK_ASSERT(offset_bytes <= h_this->length);
+
+ /* Fast path: source is a TypedArray (or any bufobj). */
+
+ if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {
+ duk_hbufobj *h_bufarg;
+#if !defined(DUK_USE_PREFER_SIZE)
+ duk_uint16_t comp_mask;
+#endif
+ duk_small_int_t no_overlap = 0;
+ duk_uint_t src_length;
+ duk_uint_t dst_length;
+ duk_uint_t dst_length_elems;
+ duk_uint8_t *p_src_base;
+ duk_uint8_t *p_src_end;
+ duk_uint8_t *p_src;
+ duk_uint8_t *p_dst_base;
+ duk_uint8_t *p_dst;
+ duk_small_uint_t src_elem_size;
+ duk_small_uint_t dst_elem_size;
+
+ h_bufarg = (duk_hbufobj *) h_obj;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufarg);
+
+ if (h_bufarg->buf == NULL) {
+ DUK_DDD(DUK_DDDPRINT("target neutered, skip copy"));
+ return 0;
+ }
+
+ /* Nominal size check. */
+ src_length = h_bufarg->length; /* bytes in source */
+ dst_length_elems = (src_length >> h_bufarg->shift); /* elems in source and dest */
+ dst_length = dst_length_elems << h_this->shift; /* bytes in dest */
+ if ((dst_length >> h_this->shift) != dst_length_elems) {
+ /* Byte length would overflow. */
+ /* XXX: easier check with less code? */
+ goto fail_args;
+ }
+ DUK_DDD(DUK_DDDPRINT("nominal size check: src_length=%ld, dst_length=%ld",
+ (long) src_length, (long) dst_length));
+ DUK_ASSERT(offset_bytes <= h_this->length);
+ if (dst_length > h_this->length - offset_bytes) {
+ /* Overflow not an issue because subtraction is used on the right
+ * side and guaranteed to be >= 0.
+ */
+ DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length"));
+ goto fail_args;
+ }
+ if (!DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, offset_bytes + dst_length)) {
+ DUK_DDD(DUK_DDDPRINT("copy not covered by underlying target buffer, ignore"));
+ return 0;
+ }
+
+ p_src_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg);
+ p_dst_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset_bytes;
+
+ /* Check actual underlying buffers for validity and that they
+ * cover the copy. No side effects are allowed after the check
+ * so that the validity status doesn't change.
+ */
+ if (!DUK_HBUFOBJ_VALID_SLICE(h_this) ||
+ !DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) {
+ /* The condition could be more narrow and check for the
+ * copy area only, but there's no need for fine grained
+ * behavior when the underlying buffer is misconfigured.
+ */
+ DUK_DDD(DUK_DDDPRINT("source and/or target not covered by underlying buffer, skip copy"));
+ return 0;
+ }
+
+ /* We want to do a straight memory copy if possible: this is
+ * an important operation because .set() is the TypedArray
+ * way to copy chunks of memory. However, because set()
+ * conceptually works in terms of elements, not all views are
+ * compatible with direct byte copying.
+ *
+ * If we do manage a direct copy, the "overlap issue" handled
+ * below can just be solved using memmove() because the source
+ * and destination element sizes are necessarily equal.
+ */
+
+#if !defined(DUK_USE_PREFER_SIZE)
+ DUK_ASSERT(h_this->elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t));
+ comp_mask = duk__buffer_elemtype_copy_compatible[h_this->elem_type];
+ if (comp_mask & (1 << h_bufarg->elem_type)) {
+ DUK_ASSERT(src_length == dst_length);
+
+ DUK_DDD(DUK_DDDPRINT("fast path: able to use memmove() because views are compatible"));
+ DUK_MEMMOVE((void *) p_dst_base, (const void *) p_src_base, (size_t) dst_length);
+ return 0;
+ }
+ DUK_DDD(DUK_DDDPRINT("fast path: views are not compatible with a byte copy, copy by item"));
+#endif /* !DUK_USE_PREFER_SIZE */
+
+ /* We want to avoid making a copy to process set() but that's
+ * not always possible: the source and the target may overlap
+ * and because element sizes are different, the overlap cannot
+ * always be handled with a memmove() or choosing the copy
+ * direction in a certain way. For example, if source type is
+ * uint8 and target type is uint32, the target area may exceed
+ * the source area from both ends!
+ *
+ * Note that because external buffers may point to the same
+ * memory areas, we must ultimately make this check using
+ * pointers.
+ *
+ * NOTE: careful with side effects: any side effect may cause
+ * a buffer resize (or external buffer pointer/length update)!
+ */
+
+ DUK_DDD(DUK_DDDPRINT("overlap check: p_src_base=%p, src_length=%ld, "
+ "p_dst_base=%p, dst_length=%ld",
+ (void *) p_src_base, (long) src_length,
+ (void *) p_dst_base, (long) dst_length));
+
+ if (p_src_base >= p_dst_base + dst_length || /* source starts after dest ends */
+ p_src_base + src_length <= p_dst_base) { /* source ends before dest starts */
+ no_overlap = 1;
+ }
+
+ if (!no_overlap) {
+ /* There's overlap: the desired end result is that
+ * conceptually a copy is made to avoid "trampling"
+ * of source data by destination writes. We make
+ * an actual temporary copy to handle this case.
+ */
+ duk_uint8_t *p_src_copy;
+
+ DUK_DDD(DUK_DDDPRINT("there is overlap, make a copy of the source"));
+ p_src_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_length);
+ DUK_ASSERT(p_src_copy != NULL);
+ DUK_MEMCPY((void *) p_src_copy, (const void *) p_src_base, (size_t) src_length);
+
+ p_src_base = p_src_copy; /* use p_src_base from now on */
+ }
+ /* Value stack intentionally mixed size here. */
+
+ DUK_DDD(DUK_DDDPRINT("after overlap check: p_src_base=%p, src_length=%ld, "
+ "p_dst_base=%p, dst_length=%ld, valstack top=%ld",
+ (void *) p_src_base, (long) src_length,
+ (void *) p_dst_base, (long) dst_length,
+ (long) duk_get_top(thr)));
+
+ /* Ready to make the copy. We must proceed element by element
+ * and must avoid any side effects that might cause the buffer
+ * validity check above to become invalid.
+ *
+ * Although we work through the value stack here, only plain
+ * numbers are handled which should be side effect safe.
+ */
+
+ src_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift);
+ dst_elem_size = (duk_small_uint_t) (1U << h_this->shift);
+ p_src = p_src_base;
+ p_dst = p_dst_base;
+ p_src_end = p_src_base + src_length;
+
+ while (p_src != p_src_end) {
+ DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: "
+ "p_src=%p, p_src_end=%p, p_dst=%p",
+ (void *) p_src, (void *) p_src_end, (void *) p_dst));
+ /* A validated read() is always a number, so it's write coercion
+ * is always side effect free an won't invalidate pointers etc.
+ */
+ duk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size);
+ duk_hbufobj_validated_write(thr, h_this, p_dst, dst_elem_size);
+ duk_pop(thr);
+ p_src += src_elem_size;
+ p_dst += dst_elem_size;
+ }
+
+ return 0;
+ } else {
+ /* Slow path: quite slow, but we save space by using the property code
+ * to write coerce target values. We don't need to worry about overlap
+ * here because the source is not a TypedArray.
+ *
+ * We could use the bufobj write coercion helper but since the
+ * property read may have arbitrary side effects, full validity checks
+ * would be needed for every element anyway.
+ */
+
+ n = (duk_uarridx_t) duk_get_length(thr, 0);
+ DUK_ASSERT(offset_bytes <= h_this->length);
+ if ((n << h_this->shift) > h_this->length - offset_bytes) {
+ /* Overflow not an issue because subtraction is used on the right
+ * side and guaranteed to be >= 0.
+ */
+ DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length"));
+ goto fail_args;
+ }
+
+ /* There's no need to check for buffer validity status for the
+ * target here: the property access code will do that for each
+ * element. Moreover, if we did check the validity here, side
+ * effects from reading the source argument might invalidate
+ * the results anyway.
+ */
+
+ DUK_ASSERT_TOP(thr, 2);
+ duk_push_this(thr);
+
+ for (i = 0; i < n; i++) {
+ duk_get_prop_index(thr, 0, i);
+ duk_put_prop_index(thr, 2, offset_elems + i);
+ }
+ }
+
+ return 0;
+
+ fail_args:
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.prototype.slice([start], [end])
+ * ArrayBuffer.prototype.slice(begin, [end])
+ * TypedArray.prototype.subarray(begin, [end])
+ *
+ * The API calls are almost identical; negative indices are counted from end
+ * of buffer, and final indices are clamped (allowing crossed indices). Main
+ * differences:
+ *
+ * - Copy/view behavior; Node.js .slice() and TypedArray .subarray() create
+ * views, ArrayBuffer .slice() creates a copy
+ *
+ * - Resulting object has a different class and prototype depending on the
+ * call (or 'this' argument)
+ *
+ * - TypedArray .subarray() arguments are element indices, not byte offsets
+ *
+ * - Plain buffer argument creates a plain buffer slice
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_LOCAL void duk__arraybuffer_plain_slice(duk_hthread *thr, duk_hbuffer *h_val) {
+ duk_int_t start_offset, end_offset;
+ duk_uint_t slice_length;
+ duk_uint8_t *p_copy;
+ duk_size_t copy_length;
+
+ duk__clamp_startend_negidx_shifted(thr,
+ (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val),
+ 0 /*buffer_shift*/,
+ 0 /*idx_start*/,
+ 1 /*idx_end*/,
+ &start_offset,
+ &end_offset);
+ DUK_ASSERT(end_offset <= (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val));
+ DUK_ASSERT(start_offset >= 0);
+ DUK_ASSERT(end_offset >= start_offset);
+ slice_length = (duk_uint_t) (end_offset - start_offset);
+
+ p_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) slice_length);
+ DUK_ASSERT(p_copy != NULL);
+ copy_length = slice_length;
+
+ DUK_MEMCPY((void *) p_copy,
+ (const void *) ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_val) + start_offset),
+ copy_length);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+/* Shared helper for slice/subarray operation.
+ * Magic: 0x01=isView, 0x02=copy, 0x04=Node.js Buffer special handling.
+ */
+DUK_INTERNAL duk_ret_t duk_bi_buffer_slice_shared(duk_hthread *thr) {
+ duk_small_int_t magic;
+ duk_small_uint_t res_class_num;
+ duk_small_int_t res_proto_bidx;
+ duk_hbufobj *h_this;
+ duk_hbufobj *h_bufobj;
+ duk_hbuffer *h_val;
+ duk_int_t start_offset, end_offset;
+ duk_uint_t slice_length;
+ duk_tval *tv;
+
+ /* [ start end ] */
+
+ magic = duk_get_current_magic(thr);
+
+ tv = duk_get_borrowed_this_tval(thr);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_BUFFER(tv)) {
+ /* For plain buffers return a plain buffer slice. */
+ h_val = DUK_TVAL_GET_BUFFER(tv);
+ DUK_ASSERT(h_val != NULL);
+
+ if (magic & 0x02) {
+ /* Make copy: ArrayBuffer.prototype.slice() uses this. */
+ duk__arraybuffer_plain_slice(thr, h_val);
+ return 1;
+ } else {
+ /* View into existing buffer: cannot be done if the
+ * result is a plain buffer because there's no slice
+ * info. So return an ArrayBuffer instance; coerce
+ * the 'this' binding into an object and behave as if
+ * the original call was for an Object-coerced plain
+ * buffer (handled automatically by duk__require_bufobj_this()).
+ */
+
+ DUK_DDD(DUK_DDDPRINT("slice() doesn't handle view into plain buffer, coerce 'this' to ArrayBuffer object"));
+ /* fall through */
+ }
+ }
+ tv = NULL; /* No longer valid nor needed. */
+
+ h_this = duk__require_bufobj_this(thr);
+
+ /* Slice offsets are element (not byte) offsets, which only matters
+ * for TypedArray views, Node.js Buffer and ArrayBuffer have shift
+ * zero so byte and element offsets are the same. Negative indices
+ * are counted from end of slice, crossed indices are allowed (and
+ * result in zero length result), and final values are clamped
+ * against the current slice. There's intentionally no check
+ * against the underlying buffer here.
+ */
+
+ duk__clamp_startend_negidx_shifted(thr,
+ (duk_int_t) h_this->length,
+ (duk_uint8_t) h_this->shift,
+ 0 /*idx_start*/,
+ 1 /*idx_end*/,
+ &start_offset,
+ &end_offset);
+ DUK_ASSERT(end_offset >= start_offset);
+ DUK_ASSERT(start_offset >= 0);
+ DUK_ASSERT(end_offset >= 0);
+ slice_length = (duk_uint_t) (end_offset - start_offset);
+
+ /* The resulting buffer object gets the same class and prototype as
+ * the buffer in 'this', e.g. if the input is a Uint8Array the
+ * result is a Uint8Array; if the input is a Float32Array, the
+ * result is a Float32Array. The result internal prototype should
+ * be the default prototype for the class (e.g. initial value of
+ * Uint8Array.prototype), not copied from the argument (Duktape 1.x
+ * did that).
+ *
+ * Node.js Buffers have special handling: they're Uint8Arrays as far
+ * as the internal class is concerned, so the new Buffer should also
+ * be an Uint8Array but inherit from Buffer.prototype.
+ */
+ res_class_num = DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_this);
+ DUK_ASSERT(res_class_num >= DUK_HOBJECT_CLASS_BUFOBJ_MIN); /* type check guarantees */
+ DUK_ASSERT(res_class_num <= DUK_HOBJECT_CLASS_BUFOBJ_MAX);
+ res_proto_bidx = duk__buffer_proto_from_classnum[res_class_num - DUK_HOBJECT_CLASS_BUFOBJ_MIN];
+ if (magic & 0x04) {
+ res_proto_bidx = DUK_BIDX_NODEJS_BUFFER_PROTOTYPE;
+ }
+ h_bufobj = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(res_class_num),
+ res_proto_bidx);
+ DUK_ASSERT(h_bufobj != NULL);
+
+ DUK_ASSERT(h_bufobj->length == 0);
+ h_bufobj->shift = h_this->shift; /* inherit */
+ h_bufobj->elem_type = h_this->elem_type; /* inherit */
+ h_bufobj->is_typedarray = magic & 0x01;
+ DUK_ASSERT(h_bufobj->is_typedarray == 0 || h_bufobj->is_typedarray == 1);
+
+ h_val = h_this->buf;
+ if (h_val == NULL) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ if (magic & 0x02) {
+ /* non-zero: make copy */
+ duk_uint8_t *p_copy;
+ duk_size_t copy_length;
+
+ p_copy = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, (duk_size_t) slice_length); /* must be zeroed, not all bytes always copied */
+ DUK_ASSERT(p_copy != NULL);
+
+ /* Copy slice, respecting underlying buffer limits; remainder
+ * is left as zero.
+ */
+ copy_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, slice_length);
+ DUK_MEMCPY((void *) p_copy,
+ (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset),
+ copy_length);
+
+ h_val = duk_known_hbuffer(thr, -1);
+
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ h_bufobj->length = slice_length;
+ DUK_ASSERT(h_bufobj->offset == 0);
+
+ duk_pop(thr); /* reachable so pop OK */
+ } else {
+ h_bufobj->buf = h_val;
+ DUK_HBUFFER_INCREF(thr, h_val);
+ h_bufobj->length = slice_length;
+ h_bufobj->offset = h_this->offset + (duk_uint_t) start_offset;
+
+ /* Copy the .buffer property, needed for TypedArray.prototype.subarray().
+ *
+ * XXX: limit copy only for TypedArray classes specifically?
+ */
+
+ DUK_ASSERT(h_bufobj->buf_prop == NULL);
+ h_bufobj->buf_prop = h_this->buf_prop; /* may be NULL */
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, (duk_hobject *) h_bufobj->buf_prop);
+ }
+ /* unbalanced stack on purpose */
+
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.isEncoding()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_hthread *thr) {
+ const char *encoding;
+
+ /* only accept lowercase 'utf8' now. */
+
+ encoding = duk_to_string(thr, 0);
+ DUK_ASSERT(duk_is_string(thr, 0)); /* guaranteed by duk_to_string() */
+ duk_push_boolean(thr, DUK_STRCMP(encoding, "utf8") == 0);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.isBuffer()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_hthread *thr) {
+ duk_hobject *h;
+ duk_hobject *h_proto;
+ duk_bool_t ret = 0;
+
+ DUK_ASSERT(duk_get_top(thr) >= 1); /* nargs */
+ h = duk_get_hobject(thr, 0);
+ if (h != NULL) {
+ h_proto = thr->builtins[DUK_BIDX_NODEJS_BUFFER_PROTOTYPE];
+ DUK_ASSERT(h_proto != NULL);
+
+ h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);
+ if (h != NULL) {
+ ret = duk_hobject_prototype_chain_contains(thr, h, h_proto, 0 /*ignore_loop*/);
+ }
+ }
+
+ duk_push_boolean(thr, ret);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.byteLength()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_hthread *thr) {
+ const char *str;
+ duk_size_t len;
+
+ /* At the moment Buffer(<str>) will just use the string bytes as
+ * is (ignoring encoding), so we return the string length here
+ * unconditionally.
+ */
+
+ /* XXX: to be revised; Old Node.js behavior just coerces any buffer
+ * values to string:
+ * $ node
+ * > Buffer.byteLength(new Uint32Array(10))
+ * 20
+ * > Buffer.byteLength(new Uint32Array(100))
+ * 20
+ * (The 20 comes from '[object Uint32Array]'.length
+ */
+
+ str = duk_to_lstring(thr, 0, &len);
+ DUK_UNREF(str);
+ duk_push_size_t(thr, len);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Node.js Buffer.concat()
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_concat(duk_hthread *thr) {
+ duk_hobject *h_arg;
+ duk_uint_t total_length;
+ duk_hbufobj *h_bufobj;
+ duk_hbufobj *h_bufres;
+ duk_hbuffer *h_val;
+ duk_uint_t i, n;
+ duk_uint8_t *p;
+ duk_size_t space_left;
+ duk_size_t copy_size;
+
+ /* Node.js accepts only actual Arrays. */
+ h_arg = duk_require_hobject(thr, 0);
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h_arg) != DUK_HOBJECT_CLASS_ARRAY) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ /* Compute result length and validate argument buffers. */
+ n = (duk_uint_t) duk_get_length(thr, 0);
+ total_length = 0;
+ for (i = 0; i < n; i++) {
+ /* Neutered checks not necessary here: neutered buffers have
+ * zero 'length' so we'll effectively skip them.
+ */
+ DUK_ASSERT_TOP(thr, 2); /* [ array totalLength ] */
+ duk_get_prop_index(thr, 0, (duk_uarridx_t) i); /* -> [ array totalLength buf ] */
+ h_bufobj = duk__require_bufobj_value(thr, 2);
+ DUK_ASSERT(h_bufobj != NULL);
+ total_length += h_bufobj->length;
+ if (DUK_UNLIKELY(total_length < h_bufobj->length)) {
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr); /* Wrapped. */
+ }
+ duk_pop(thr);
+ }
+ /* In Node.js v0.12.1 a 1-element array is special and won't create a
+ * copy, this was fixed later so an explicit check no longer needed.
+ */
+
+ /* User totalLength overrides a computed length, but we'll check
+ * every copy in the copy loop. Note that duk_to_int() can
+ * technically have arbitrary side effects so we need to recheck
+ * the buffers in the copy loop.
+ */
+ if (!duk_is_undefined(thr, 1) && n > 0) {
+ /* For n == 0, Node.js ignores totalLength argument and
+ * returns a zero length buffer.
+ */
+ duk_int_t total_length_signed;
+ total_length_signed = duk_to_int(thr, 1);
+ if (total_length_signed < 0) {
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+ }
+ total_length = (duk_uint_t) total_length_signed;
+ }
+
+ h_bufres = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY),
+ DUK_BIDX_NODEJS_BUFFER_PROTOTYPE);
+ DUK_ASSERT(h_bufres != NULL);
+
+ p = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, total_length); /* must be zeroed, all bytes not necessarily written over */
+ DUK_ASSERT(p != NULL);
+ space_left = (duk_size_t) total_length;
+
+ for (i = 0; i < n; i++) {
+ DUK_ASSERT_TOP(thr, 4); /* [ array totalLength bufres buf ] */
+
+ duk_get_prop_index(thr, 0, (duk_uarridx_t) i);
+ h_bufobj = duk__require_bufobj_value(thr, 4);
+ DUK_ASSERT(h_bufobj != NULL);
+
+ copy_size = h_bufobj->length;
+ if (copy_size > space_left) {
+ copy_size = space_left;
+ }
+
+ if (h_bufobj->buf != NULL &&
+ DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) {
+ DUK_MEMCPY((void *) p,
+ (const void *) DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj),
+ copy_size);
+ } else {
+ /* Just skip, leaving zeroes in the result. */
+ ;
+ }
+ p += copy_size;
+ space_left -= copy_size;
+
+ duk_pop(thr);
+ }
+
+ h_val = duk_known_hbuffer(thr, -1);
+
+ duk__set_bufobj_buffer(thr, h_bufres, h_val);
+ h_bufres->is_typedarray = 1;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufres);
+
+ duk_pop(thr); /* pop plain buffer, now reachable through h_bufres */
+
+ return 1; /* return h_bufres */
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Shared readfield and writefield methods
+ *
+ * The readfield/writefield methods need support for endianness and field
+ * types. All offsets are byte based so no offset shifting is needed.
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+/* Format of magic, bits:
+ * 0...1: field type; 0=uint8, 1=uint16, 2=uint32, 3=float, 4=double, 5=unused, 6=unused, 7=unused
+ * 3: endianness: 0=little, 1=big
+ * 4: signed: 1=yes, 0=no
+ * 5: typedarray: 1=yes, 0=no
+ */
+#define DUK__FLD_8BIT 0
+#define DUK__FLD_16BIT 1
+#define DUK__FLD_32BIT 2
+#define DUK__FLD_FLOAT 3
+#define DUK__FLD_DOUBLE 4
+#define DUK__FLD_VARINT 5
+#define DUK__FLD_BIGENDIAN (1 << 3)
+#define DUK__FLD_SIGNED (1 << 4)
+#define DUK__FLD_TYPEDARRAY (1 << 5)
+
+/* XXX: split into separate functions for each field type? */
+DUK_INTERNAL duk_ret_t duk_bi_buffer_readfield(duk_hthread *thr) {
+ duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr);
+ duk_small_int_t magic_ftype;
+ duk_small_int_t magic_bigendian;
+ duk_small_int_t magic_signed;
+ duk_small_int_t magic_typedarray;
+ duk_small_int_t endswap;
+ duk_hbufobj *h_this;
+ duk_bool_t no_assert;
+ duk_int_t offset_signed;
+ duk_uint_t offset;
+ duk_uint_t buffer_length;
+ duk_uint_t check_length;
+ duk_uint8_t *buf;
+ duk_double_union du;
+
+ magic_ftype = magic & 0x0007;
+ magic_bigendian = magic & 0x0008;
+ magic_signed = magic & 0x0010;
+ magic_typedarray = magic & 0x0020;
+
+ h_this = duk__require_bufobj_this(thr); /* XXX: very inefficient for plain buffers */
+ DUK_ASSERT(h_this != NULL);
+ buffer_length = h_this->length;
+
+ /* [ offset noAssert ], when ftype != DUK__FLD_VARINT */
+ /* [ offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */
+ /* [ offset littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */
+
+ /* Handle TypedArray vs. Node.js Buffer arg differences */
+ if (magic_typedarray) {
+ no_assert = 0;
+#if defined(DUK_USE_INTEGER_LE)
+ endswap = !duk_to_boolean(thr, 1); /* 1=little endian */
+#else
+ endswap = duk_to_boolean(thr, 1); /* 1=little endian */
+#endif
+ } else {
+ no_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 2 : 1);
+#if defined(DUK_USE_INTEGER_LE)
+ endswap = magic_bigendian;
+#else
+ endswap = !magic_bigendian;
+#endif
+ }
+
+ /* Offset is coerced first to signed integer range and then to unsigned.
+ * This ensures we can add a small byte length (1-8) to the offset in
+ * bound checks and not wrap.
+ */
+ offset_signed = duk_to_int(thr, 0);
+ offset = (duk_uint_t) offset_signed;
+ if (offset_signed < 0) {
+ goto fail_bounds;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("readfield, buffer_length=%ld, offset=%ld, no_assert=%d, "
+ "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, "
+ "endswap=%d",
+ (long) buffer_length, (long) offset, (int) no_assert,
+ (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3),
+ (int) (magic_signed >> 4), (int) endswap));
+
+ /* Update 'buffer_length' to be the effective, safe limit which
+ * takes into account the underlying buffer. This value will be
+ * potentially invalidated by any side effect.
+ */
+ check_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length);
+ DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld",
+ (long) buffer_length, (long) check_length));
+
+ if (h_this->buf) {
+ buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this);
+ } else {
+ /* Neutered. We could go into the switch-case safely with
+ * buf == NULL because check_length == 0. To avoid scanbuild
+ * warnings, fail directly instead.
+ */
+ DUK_ASSERT(check_length == 0);
+ goto fail_neutered;
+ }
+ DUK_ASSERT(buf != NULL);
+
+ switch (magic_ftype) {
+ case DUK__FLD_8BIT: {
+ duk_uint8_t tmp;
+ if (offset + 1U > check_length) {
+ goto fail_bounds;
+ }
+ tmp = buf[offset];
+ if (magic_signed) {
+ duk_push_int(thr, (duk_int_t) ((duk_int8_t) tmp));
+ } else {
+ duk_push_uint(thr, (duk_uint_t) tmp);
+ }
+ break;
+ }
+ case DUK__FLD_16BIT: {
+ duk_uint16_t tmp;
+ if (offset + 2U > check_length) {
+ goto fail_bounds;
+ }
+ DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 2);
+ tmp = du.us[0];
+ if (endswap) {
+ tmp = DUK_BSWAP16(tmp);
+ }
+ if (magic_signed) {
+ duk_push_int(thr, (duk_int_t) ((duk_int16_t) tmp));
+ } else {
+ duk_push_uint(thr, (duk_uint_t) tmp);
+ }
+ break;
+ }
+ case DUK__FLD_32BIT: {
+ duk_uint32_t tmp;
+ if (offset + 4U > check_length) {
+ goto fail_bounds;
+ }
+ DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4);
+ tmp = du.ui[0];
+ if (endswap) {
+ tmp = DUK_BSWAP32(tmp);
+ }
+ if (magic_signed) {
+ duk_push_int(thr, (duk_int_t) ((duk_int32_t) tmp));
+ } else {
+ duk_push_uint(thr, (duk_uint_t) tmp);
+ }
+ break;
+ }
+ case DUK__FLD_FLOAT: {
+ duk_uint32_t tmp;
+ if (offset + 4U > check_length) {
+ goto fail_bounds;
+ }
+ DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4);
+ if (endswap) {
+ tmp = du.ui[0];
+ tmp = DUK_BSWAP32(tmp);
+ du.ui[0] = tmp;
+ }
+ duk_push_number(thr, (duk_double_t) du.f[0]);
+ break;
+ }
+ case DUK__FLD_DOUBLE: {
+ if (offset + 8U > check_length) {
+ goto fail_bounds;
+ }
+ DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 8);
+ if (endswap) {
+ DUK_DBLUNION_BSWAP64(&du);
+ }
+ duk_push_number(thr, (duk_double_t) du.d);
+ break;
+ }
+ case DUK__FLD_VARINT: {
+ /* Node.js Buffer variable width integer field. We don't really
+ * care about speed here, so aim for shortest algorithm.
+ */
+ duk_int_t field_bytelen;
+ duk_int_t i, i_step, i_end;
+#if defined(DUK_USE_64BIT_OPS)
+ duk_int64_t tmp;
+ duk_small_uint_t shift_tmp;
+#else
+ duk_double_t tmp;
+ duk_small_int_t highbyte;
+#endif
+ const duk_uint8_t *p;
+
+ field_bytelen = duk_get_int(thr, 1); /* avoid side effects! */
+ if (field_bytelen < 1 || field_bytelen > 6) {
+ goto fail_field_length;
+ }
+ if (offset + (duk_uint_t) field_bytelen > check_length) {
+ goto fail_bounds;
+ }
+ p = (const duk_uint8_t *) (buf + offset);
+
+ /* Slow gathering of value using either 64-bit arithmetic
+ * or IEEE doubles if 64-bit types not available. Handling
+ * of negative numbers is a bit non-obvious in both cases.
+ */
+
+ if (magic_bigendian) {
+ /* Gather in big endian */
+ i = 0;
+ i_step = 1;
+ i_end = field_bytelen; /* one i_step over */
+ } else {
+ /* Gather in little endian */
+ i = field_bytelen - 1;
+ i_step = -1;
+ i_end = -1; /* one i_step over */
+ }
+
+#if defined(DUK_USE_64BIT_OPS)
+ tmp = 0;
+ do {
+ DUK_ASSERT(i >= 0 && i < field_bytelen);
+ tmp = (tmp << 8) + (duk_int64_t) p[i];
+ i += i_step;
+ } while (i != i_end);
+
+ if (magic_signed) {
+ /* Shift to sign extend. */
+ shift_tmp = (duk_small_uint_t) (64U - (duk_small_uint_t) field_bytelen * 8U);
+ tmp = (tmp << shift_tmp) >> shift_tmp;
+ }
+
+ duk_push_i64(thr, tmp);
+#else
+ highbyte = p[i];
+ if (magic_signed && (highbyte & 0x80) != 0) {
+ /* 0xff => 255 - 256 = -1; 0x80 => 128 - 256 = -128 */
+ tmp = (duk_double_t) (highbyte - 256);
+ } else {
+ tmp = (duk_double_t) highbyte;
+ }
+ for (;;) {
+ i += i_step;
+ if (i == i_end) {
+ break;
+ }
+ DUK_ASSERT(i >= 0 && i < field_bytelen);
+ tmp = (tmp * 256.0) + (duk_double_t) p[i];
+ }
+
+ duk_push_number(thr, tmp);
+#endif
+ break;
+ }
+ default: { /* should never happen but default here */
+ goto fail_bounds;
+ }
+ }
+
+ return 1;
+
+ fail_neutered:
+ fail_field_length:
+ fail_bounds:
+ if (no_assert) {
+ /* Node.js return value for noAssert out-of-bounds reads is
+ * usually (but not always) NaN. Return NaN consistently.
+ */
+ duk_push_nan(thr);
+ return 1;
+ }
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+/* XXX: split into separate functions for each field type? */
+DUK_INTERNAL duk_ret_t duk_bi_buffer_writefield(duk_hthread *thr) {
+ duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr);
+ duk_small_int_t magic_ftype;
+ duk_small_int_t magic_bigendian;
+ duk_small_int_t magic_signed;
+ duk_small_int_t magic_typedarray;
+ duk_small_int_t endswap;
+ duk_hbufobj *h_this;
+ duk_bool_t no_assert;
+ duk_int_t offset_signed;
+ duk_uint_t offset;
+ duk_uint_t buffer_length;
+ duk_uint_t check_length;
+ duk_uint8_t *buf;
+ duk_double_union du;
+ duk_int_t nbytes = 0;
+
+ magic_ftype = magic & 0x0007;
+ magic_bigendian = magic & 0x0008;
+ magic_signed = magic & 0x0010;
+ magic_typedarray = magic & 0x0020;
+ DUK_UNREF(magic_signed);
+
+ h_this = duk__require_bufobj_this(thr); /* XXX: very inefficient for plain buffers */
+ DUK_ASSERT(h_this != NULL);
+ buffer_length = h_this->length;
+
+ /* [ value offset noAssert ], when ftype != DUK__FLD_VARINT */
+ /* [ value offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */
+ /* [ offset value littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */
+
+ /* Handle TypedArray vs. Node.js Buffer arg differences */
+ if (magic_typedarray) {
+ no_assert = 0;
+#if defined(DUK_USE_INTEGER_LE)
+ endswap = !duk_to_boolean(thr, 2); /* 1=little endian */
+#else
+ endswap = duk_to_boolean(thr, 2); /* 1=little endian */
+#endif
+ duk_swap(thr, 0, 1); /* offset/value order different from Node.js */
+ } else {
+ no_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 3 : 2);
+#if defined(DUK_USE_INTEGER_LE)
+ endswap = magic_bigendian;
+#else
+ endswap = !magic_bigendian;
+#endif
+ }
+
+ /* Offset is coerced first to signed integer range and then to unsigned.
+ * This ensures we can add a small byte length (1-8) to the offset in
+ * bound checks and not wrap.
+ */
+ offset_signed = duk_to_int(thr, 1);
+ offset = (duk_uint_t) offset_signed;
+
+ /* We need 'nbytes' even for a failed offset; return value must be
+ * (offset + nbytes) even when write fails due to invalid offset.
+ */
+ if (magic_ftype != DUK__FLD_VARINT) {
+ DUK_ASSERT(magic_ftype >= 0 && magic_ftype < (duk_small_int_t) (sizeof(duk__buffer_nbytes_from_fldtype) / sizeof(duk_uint8_t)));
+ nbytes = duk__buffer_nbytes_from_fldtype[magic_ftype];
+ } else {
+ nbytes = duk_get_int(thr, 2);
+ if (nbytes < 1 || nbytes > 6) {
+ goto fail_field_length;
+ }
+ }
+ DUK_ASSERT(nbytes >= 1 && nbytes <= 8);
+
+ /* Now we can check offset validity. */
+ if (offset_signed < 0) {
+ goto fail_bounds;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("writefield, value=%!T, buffer_length=%ld, offset=%ld, no_assert=%d, "
+ "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, "
+ "endswap=%d",
+ duk_get_tval(thr, 0), (long) buffer_length, (long) offset, (int) no_assert,
+ (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3),
+ (int) (magic_signed >> 4), (int) endswap));
+
+ /* Coerce value to a number before computing check_length, so that
+ * the field type specific coercion below can't have side effects
+ * that would invalidate check_length.
+ */
+ duk_to_number(thr, 0);
+
+ /* Update 'buffer_length' to be the effective, safe limit which
+ * takes into account the underlying buffer. This value will be
+ * potentially invalidated by any side effect.
+ */
+ check_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length);
+ DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld",
+ (long) buffer_length, (long) check_length));
+
+ if (h_this->buf) {
+ buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this);
+ } else {
+ /* Neutered. We could go into the switch-case safely with
+ * buf == NULL because check_length == 0. To avoid scanbuild
+ * warnings, fail directly instead.
+ */
+ DUK_ASSERT(check_length == 0);
+ goto fail_neutered;
+ }
+ DUK_ASSERT(buf != NULL);
+
+ switch (magic_ftype) {
+ case DUK__FLD_8BIT: {
+ if (offset + 1U > check_length) {
+ goto fail_bounds;
+ }
+ /* sign doesn't matter when writing */
+ buf[offset] = (duk_uint8_t) duk_to_uint32(thr, 0);
+ break;
+ }
+ case DUK__FLD_16BIT: {
+ duk_uint16_t tmp;
+ if (offset + 2U > check_length) {
+ goto fail_bounds;
+ }
+ tmp = (duk_uint16_t) duk_to_uint32(thr, 0);
+ if (endswap) {
+ tmp = DUK_BSWAP16(tmp);
+ }
+ du.us[0] = tmp;
+ /* sign doesn't matter when writing */
+ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 2);
+ break;
+ }
+ case DUK__FLD_32BIT: {
+ duk_uint32_t tmp;
+ if (offset + 4U > check_length) {
+ goto fail_bounds;
+ }
+ tmp = (duk_uint32_t) duk_to_uint32(thr, 0);
+ if (endswap) {
+ tmp = DUK_BSWAP32(tmp);
+ }
+ du.ui[0] = tmp;
+ /* sign doesn't matter when writing */
+ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4);
+ break;
+ }
+ case DUK__FLD_FLOAT: {
+ duk_uint32_t tmp;
+ if (offset + 4U > check_length) {
+ goto fail_bounds;
+ }
+ du.f[0] = (duk_float_t) duk_to_number(thr, 0);
+ if (endswap) {
+ tmp = du.ui[0];
+ tmp = DUK_BSWAP32(tmp);
+ du.ui[0] = tmp;
+ }
+ /* sign doesn't matter when writing */
+ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4);
+ break;
+ }
+ case DUK__FLD_DOUBLE: {
+ if (offset + 8U > check_length) {
+ goto fail_bounds;
+ }
+ du.d = (duk_double_t) duk_to_number(thr, 0);
+ if (endswap) {
+ DUK_DBLUNION_BSWAP64(&du);
+ }
+ /* sign doesn't matter when writing */
+ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 8);
+ break;
+ }
+ case DUK__FLD_VARINT: {
+ /* Node.js Buffer variable width integer field. We don't really
+ * care about speed here, so aim for shortest algorithm.
+ */
+ duk_int_t field_bytelen;
+ duk_int_t i, i_step, i_end;
+#if defined(DUK_USE_64BIT_OPS)
+ duk_int64_t tmp;
+#else
+ duk_double_t tmp;
+#endif
+ duk_uint8_t *p;
+
+ field_bytelen = (duk_int_t) nbytes;
+ if (offset + (duk_uint_t) field_bytelen > check_length) {
+ goto fail_bounds;
+ }
+
+ /* Slow writing of value using either 64-bit arithmetic
+ * or IEEE doubles if 64-bit types not available. There's
+ * no special sign handling when writing varints.
+ */
+
+ if (magic_bigendian) {
+ /* Write in big endian */
+ i = field_bytelen; /* one i_step added at top of loop */
+ i_step = -1;
+ i_end = 0;
+ } else {
+ /* Write in little endian */
+ i = -1; /* one i_step added at top of loop */
+ i_step = 1;
+ i_end = field_bytelen - 1;
+ }
+
+ /* XXX: The duk_to_number() cast followed by integer coercion
+ * is platform specific so NaN, +/- Infinity, and out-of-bounds
+ * values result in platform specific output now.
+ * See: test-bi-nodejs-buffer-proto-varint-special.js
+ */
+
+#if defined(DUK_USE_64BIT_OPS)
+ tmp = (duk_int64_t) duk_to_number(thr, 0);
+ p = (duk_uint8_t *) (buf + offset);
+ do {
+ i += i_step;
+ DUK_ASSERT(i >= 0 && i < field_bytelen);
+ p[i] = (duk_uint8_t) (tmp & 0xff);
+ tmp = tmp >> 8; /* unnecessary shift for last byte */
+ } while (i != i_end);
+#else
+ tmp = duk_to_number(thr, 0);
+ p = (duk_uint8_t *) (buf + offset);
+ do {
+ i += i_step;
+ tmp = DUK_FLOOR(tmp);
+ DUK_ASSERT(i >= 0 && i < field_bytelen);
+ p[i] = (duk_uint8_t) (DUK_FMOD(tmp, 256.0));
+ tmp = tmp / 256.0; /* unnecessary div for last byte */
+ } while (i != i_end);
+#endif
+ break;
+ }
+ default: { /* should never happen but default here */
+ goto fail_bounds;
+ }
+ }
+
+ /* Node.js Buffer: return offset + #bytes written (i.e. next
+ * write offset).
+ */
+ if (magic_typedarray) {
+ /* For TypedArrays 'undefined' return value is specified
+ * by ES2015 (matches V8).
+ */
+ return 0;
+ }
+ duk_push_uint(thr, offset + (duk_uint_t) nbytes);
+ return 1;
+
+ fail_neutered:
+ fail_field_length:
+ fail_bounds:
+ if (no_assert) {
+ /* Node.js return value for failed writes is offset + #bytes
+ * that would have been written.
+ */
+ /* XXX: for negative input offsets, 'offset' will be a large
+ * positive value so the result here is confusing.
+ */
+ if (magic_typedarray) {
+ return 0;
+ }
+ duk_push_uint(thr, offset + (duk_uint_t) nbytes);
+ return 1;
+ }
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * Accessors for .buffer, .byteLength, .byteOffset
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_LOCAL duk_hbufobj *duk__autospawn_arraybuffer(duk_hthread *thr, duk_hbuffer *h_buf) {
+ duk_hbufobj *h_res;
+
+ h_res = duk_push_bufobj_raw(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_BUFOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER),
+ DUK_BIDX_ARRAYBUFFER_PROTOTYPE);
+ DUK_ASSERT(h_res != NULL);
+ DUK_UNREF(h_res);
+
+ duk__set_bufobj_buffer(thr, h_res, h_buf);
+ DUK_ASSERT_HBUFOBJ_VALID(h_res);
+ DUK_ASSERT(h_res->buf_prop == NULL);
+ return h_res;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) {
+ duk_hbufobj *h_bufobj;
+
+ h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/);
+ DUK_ASSERT(h_bufobj != NULL);
+ if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) {
+ DUK_DD(DUK_DDPRINT("autospawn ArrayBuffer for plain buffer"));
+ (void) duk__autospawn_arraybuffer(thr, (duk_hbuffer *) h_bufobj);
+ return 1;
+ } else {
+ if (h_bufobj->buf_prop == NULL &&
+ DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufobj) != DUK_HOBJECT_CLASS_ARRAYBUFFER &&
+ h_bufobj->buf != NULL) {
+ duk_hbufobj *h_arrbuf;
+
+ DUK_DD(DUK_DDPRINT("autospawn ArrayBuffer for typed array or DataView"));
+ h_arrbuf = duk__autospawn_arraybuffer(thr, h_bufobj->buf);
+
+ if (h_bufobj->buf_prop == NULL) {
+ /* Must recheck buf_prop, in case ArrayBuffer
+ * alloc had a side effect which already filled
+ * it!
+ */
+
+ /* Set ArrayBuffer's .byteOffset and .byteLength based
+ * on the view so that Arraybuffer[view.byteOffset]
+ * matches view[0].
+ */
+ h_arrbuf->offset = 0;
+ DUK_ASSERT(h_bufobj->offset + h_bufobj->length >= h_bufobj->offset); /* Wrap check on creation. */
+ h_arrbuf->length = h_bufobj->offset + h_bufobj->length;
+ DUK_ASSERT(h_arrbuf->buf_prop == NULL);
+
+ DUK_ASSERT(h_bufobj->buf_prop == NULL);
+ h_bufobj->buf_prop = (duk_hobject *) h_arrbuf;
+ DUK_HBUFOBJ_INCREF(thr, h_arrbuf); /* Now reachable and accounted for. */
+ }
+
+ /* Left on stack; pushed for the second time below (OK). */
+ }
+ if (h_bufobj->buf_prop) {
+ duk_push_hobject(thr, h_bufobj->buf_prop);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) {
+ duk_hbufobj *h_bufobj;
+
+ h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/);
+ DUK_ASSERT(h_bufobj != NULL);
+ if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) {
+ duk_push_uint(thr, 0);
+ } else {
+ /* If neutered must return 0; offset is zeroed during
+ * neutering.
+ */
+ duk_push_uint(thr, h_bufobj->offset);
+ }
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) {
+ duk_hbufobj *h_bufobj;
+
+ h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/);
+ DUK_ASSERT(h_bufobj != NULL);
+ if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) {
+ duk_hbuffer *h_buf;
+
+ h_buf = (duk_hbuffer *) h_bufobj;
+ DUK_ASSERT(DUK_HBUFFER_GET_SIZE(h_buf) <= DUK_UINT_MAX); /* Buffer limits. */
+ duk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf));
+ } else {
+ /* If neutered must return 0; length is zeroed during
+ * neutering.
+ */
+ duk_push_uint(thr, h_bufobj->length);
+ }
+ return 1;
+}
+#else /* DUK_USE_BUFFEROBJECT_SUPPORT */
+/* No .buffer getter without ArrayBuffer support. */
+#if 0
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) {
+ return 0;
+}
+#endif
+
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) {
+ duk_push_uint(thr, 0);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) {
+ duk_hbuffer *h_buf;
+
+ /* XXX: helper? */
+ duk_push_this(thr);
+ h_buf = duk_require_hbuffer(thr, -1);
+ duk_push_uint(thr, DUK_HBUFFER_GET_SIZE(h_buf));
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/* automatic undefs */
+#undef DUK__BUFOBJ_FLAG_PROMOTE
+#undef DUK__BUFOBJ_FLAG_THROW
+#undef DUK__FLD_16BIT
+#undef DUK__FLD_32BIT
+#undef DUK__FLD_8BIT
+#undef DUK__FLD_BIGENDIAN
+#undef DUK__FLD_DOUBLE
+#undef DUK__FLD_FLOAT
+#undef DUK__FLD_SIGNED
+#undef DUK__FLD_TYPEDARRAY
+#undef DUK__FLD_VARINT
+#line 1 "duk_bi_date.c"
+/*
+ * Date built-ins
+ *
+ * Unlike most built-ins, Date has some platform dependencies for getting
+ * UTC time, converting between UTC and local time, and parsing and
+ * formatting time values. These are all abstracted behind DUK_USE_xxx
+ * config options. There are built-in platform specific providers for
+ * POSIX and Windows, but external providers can also be used.
+ *
+ * See doc/datetime.rst.
+ *
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* XXX: currently defines unnecessary symbols when DUK_USE_DATE_BUILTIN is disabled. */
+
+/*
+ * Forward declarations
+ */
+
+DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset);
+DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags);
+DUK_LOCAL_DECL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val);
+DUK_LOCAL_DECL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags);
+
+/*
+ * Other file level defines
+ */
+
+/* Debug macro to print all parts and dparts (used manually because of debug level). */
+#define DUK__DPRINT_PARTS_AND_DPARTS(parts,dparts) do { \
+ DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld, dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \
+ (long) (parts)[0], (long) (parts)[1], \
+ (long) (parts)[2], (long) (parts)[3], \
+ (long) (parts)[4], (long) (parts)[5], \
+ (long) (parts)[6], (long) (parts)[7], \
+ (double) (dparts)[0], (double) (dparts)[1], \
+ (double) (dparts)[2], (double) (dparts)[3], \
+ (double) (dparts)[4], (double) (dparts)[5], \
+ (double) (dparts)[6], (double) (dparts)[7])); \
+ } while (0)
+#define DUK__DPRINT_PARTS(parts) do { \
+ DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld", \
+ (long) (parts)[0], (long) (parts)[1], \
+ (long) (parts)[2], (long) (parts)[3], \
+ (long) (parts)[4], (long) (parts)[5], \
+ (long) (parts)[6], (long) (parts)[7])); \
+ } while (0)
+#define DUK__DPRINT_DPARTS(dparts) do { \
+ DUK_D(DUK_DPRINT("dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \
+ (double) (dparts)[0], (double) (dparts)[1], \
+ (double) (dparts)[2], (double) (dparts)[3], \
+ (double) (dparts)[4], (double) (dparts)[5], \
+ (double) (dparts)[6], (double) (dparts)[7])); \
+ } while (0)
+
+/* Equivalent year for DST calculations outside [1970,2038[ range, see
+ * E5 Section 15.9.1.8. Equivalent year has the same leap-year-ness and
+ * starts with the same weekday on Jan 1.
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=351066
+ */
+#define DUK__YEAR(x) ((duk_uint8_t) ((x) - 1970))
+DUK_LOCAL duk_uint8_t duk__date_equivyear[14] = {
+#if 1
+ /* This is based on V8 EquivalentYear() algorithm (see util/genequivyear.py):
+ * http://code.google.com/p/v8/source/browse/trunk/src/date.h#146
+ */
+
+ /* non-leap year: sunday, monday, ... */
+ DUK__YEAR(2023), DUK__YEAR(2035), DUK__YEAR(2019), DUK__YEAR(2031),
+ DUK__YEAR(2015), DUK__YEAR(2027), DUK__YEAR(2011),
+
+ /* leap year: sunday, monday, ... */
+ DUK__YEAR(2012), DUK__YEAR(2024), DUK__YEAR(2008), DUK__YEAR(2020),
+ DUK__YEAR(2032), DUK__YEAR(2016), DUK__YEAR(2028)
+#endif
+
+#if 0
+ /* This is based on Rhino EquivalentYear() algorithm:
+ * https://github.com/mozilla/rhino/blob/f99cc11d616f0cdda2c42bde72b3484df6182947/src/org/mozilla/javascript/NativeDate.java
+ */
+
+ /* non-leap year: sunday, monday, ... */
+ DUK__YEAR(1978), DUK__YEAR(1973), DUK__YEAR(1985), DUK__YEAR(1986),
+ DUK__YEAR(1981), DUK__YEAR(1971), DUK__YEAR(1977),
+
+ /* leap year: sunday, monday, ... */
+ DUK__YEAR(1984), DUK__YEAR(1996), DUK__YEAR(1980), DUK__YEAR(1992),
+ DUK__YEAR(1976), DUK__YEAR(1988), DUK__YEAR(1972)
+#endif
+};
+
+/*
+ * ISO 8601 subset parser.
+ */
+
+/* Parser part count. */
+#define DUK__NUM_ISO8601_PARSER_PARTS 9
+
+/* Parser part indices. */
+#define DUK__PI_YEAR 0
+#define DUK__PI_MONTH 1
+#define DUK__PI_DAY 2
+#define DUK__PI_HOUR 3
+#define DUK__PI_MINUTE 4
+#define DUK__PI_SECOND 5
+#define DUK__PI_MILLISECOND 6
+#define DUK__PI_TZHOUR 7
+#define DUK__PI_TZMINUTE 8
+
+/* Parser part masks. */
+#define DUK__PM_YEAR (1 << DUK__PI_YEAR)
+#define DUK__PM_MONTH (1 << DUK__PI_MONTH)
+#define DUK__PM_DAY (1 << DUK__PI_DAY)
+#define DUK__PM_HOUR (1 << DUK__PI_HOUR)
+#define DUK__PM_MINUTE (1 << DUK__PI_MINUTE)
+#define DUK__PM_SECOND (1 << DUK__PI_SECOND)
+#define DUK__PM_MILLISECOND (1 << DUK__PI_MILLISECOND)
+#define DUK__PM_TZHOUR (1 << DUK__PI_TZHOUR)
+#define DUK__PM_TZMINUTE (1 << DUK__PI_TZMINUTE)
+
+/* Parser separator indices. */
+#define DUK__SI_PLUS 0
+#define DUK__SI_MINUS 1
+#define DUK__SI_T 2
+#define DUK__SI_SPACE 3
+#define DUK__SI_COLON 4
+#define DUK__SI_PERIOD 5
+#define DUK__SI_Z 6
+#define DUK__SI_NUL 7
+
+/* Parser separator masks. */
+#define DUK__SM_PLUS (1 << DUK__SI_PLUS)
+#define DUK__SM_MINUS (1 << DUK__SI_MINUS)
+#define DUK__SM_T (1 << DUK__SI_T)
+#define DUK__SM_SPACE (1 << DUK__SI_SPACE)
+#define DUK__SM_COLON (1 << DUK__SI_COLON)
+#define DUK__SM_PERIOD (1 << DUK__SI_PERIOD)
+#define DUK__SM_Z (1 << DUK__SI_Z)
+#define DUK__SM_NUL (1 << DUK__SI_NUL)
+
+/* Rule control flags. */
+#define DUK__CF_NEG (1 << 0) /* continue matching, set neg_tzoffset flag */
+#define DUK__CF_ACCEPT (1 << 1) /* accept string */
+#define DUK__CF_ACCEPT_NUL (1 << 2) /* accept string if next char is NUL (otherwise reject) */
+
+#define DUK__PACK_RULE(partmask,sepmask,nextpart,flags) \
+ ((duk_uint32_t) (partmask) + \
+ (((duk_uint32_t) (sepmask)) << 9) + \
+ (((duk_uint32_t) (nextpart)) << 17) + \
+ (((duk_uint32_t) (flags)) << 21))
+
+#define DUK__UNPACK_RULE(rule,var_nextidx,var_flags) do { \
+ (var_nextidx) = (duk_small_uint_t) (((rule) >> 17) & 0x0f); \
+ (var_flags) = (duk_small_uint_t) ((rule) >> 21); \
+ } while (0)
+
+#define DUK__RULE_MASK_PART_SEP 0x1ffffUL
+
+/* Matching separator index is used in the control table */
+DUK_LOCAL const duk_uint8_t duk__parse_iso8601_seps[] = {
+ DUK_ASC_PLUS /*0*/, DUK_ASC_MINUS /*1*/, DUK_ASC_UC_T /*2*/, DUK_ASC_SPACE /*3*/,
+ DUK_ASC_COLON /*4*/, DUK_ASC_PERIOD /*5*/, DUK_ASC_UC_Z /*6*/, DUK_ASC_NUL /*7*/
+};
+
+/* Rule table: first matching rule is used to determine what to do next. */
+DUK_LOCAL const duk_uint32_t duk__parse_iso8601_control[] = {
+ DUK__PACK_RULE(DUK__PM_YEAR, DUK__SM_MINUS, DUK__PI_MONTH, 0),
+ DUK__PACK_RULE(DUK__PM_MONTH, DUK__SM_MINUS, DUK__PI_DAY, 0),
+ DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY, DUK__SM_T | DUK__SM_SPACE, DUK__PI_HOUR, 0),
+ DUK__PACK_RULE(DUK__PM_HOUR, DUK__SM_COLON, DUK__PI_MINUTE, 0),
+ DUK__PACK_RULE(DUK__PM_MINUTE, DUK__SM_COLON, DUK__PI_SECOND, 0),
+ DUK__PACK_RULE(DUK__PM_SECOND, DUK__SM_PERIOD, DUK__PI_MILLISECOND, 0),
+ DUK__PACK_RULE(DUK__PM_TZHOUR, DUK__SM_COLON, DUK__PI_TZMINUTE, 0),
+ DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_PLUS, DUK__PI_TZHOUR, 0),
+ DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_MINUS, DUK__PI_TZHOUR, DUK__CF_NEG),
+ DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_Z, 0, DUK__CF_ACCEPT_NUL),
+ DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND | DUK__PM_TZHOUR /*Note2*/ | DUK__PM_TZMINUTE, DUK__SM_NUL, 0, DUK__CF_ACCEPT)
+
+ /* Note1: the specification doesn't require matching a time form with
+ * just hours ("HH"), but we accept it here, e.g. "2012-01-02T12Z".
+ *
+ * Note2: the specification doesn't require matching a timezone offset
+ * with just hours ("HH"), but accept it here, e.g. "2012-01-02T03:04:05+02"
+ */
+};
+
+DUK_LOCAL duk_bool_t duk__parse_string_iso8601_subset(duk_hthread *thr, const char *str) {
+ duk_int_t parts[DUK__NUM_ISO8601_PARSER_PARTS];
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ duk_double_t d;
+ const duk_uint8_t *p;
+ duk_small_uint_t part_idx = 0;
+ duk_int_t accum = 0;
+ duk_small_uint_t ndigits = 0;
+ duk_bool_t neg_year = 0;
+ duk_bool_t neg_tzoffset = 0;
+ duk_uint_fast8_t ch;
+ duk_small_uint_t i;
+
+ /* During parsing, month and day are one-based; set defaults here. */
+ DUK_MEMZERO(parts, sizeof(parts));
+ DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] == 0); /* don't care value, year is mandatory */
+ parts[DUK_DATE_IDX_MONTH] = 1;
+ parts[DUK_DATE_IDX_DAY] = 1;
+
+ /* Special handling for year sign. */
+ p = (const duk_uint8_t *) str;
+ ch = p[0];
+ if (ch == DUK_ASC_PLUS) {
+ p++;
+ } else if (ch == DUK_ASC_MINUS) {
+ neg_year = 1;
+ p++;
+ }
+
+ for (;;) {
+ ch = *p++;
+ DUK_DDD(DUK_DDDPRINT("parsing, part_idx=%ld, char=%ld ('%c')",
+ (long) part_idx, (long) ch,
+ (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : DUK_ASC_QUESTION)));
+
+ if (ch >= DUK_ASC_0 && ch <= DUK_ASC_9) {
+ if (ndigits >= 9) {
+ DUK_DDD(DUK_DDDPRINT("too many digits -> reject"));
+ goto reject;
+ }
+ if (part_idx == DUK__PI_MILLISECOND && ndigits >= 3) {
+ /* ignore millisecond fractions after 3 */
+ } else {
+ accum = accum * 10 + ((duk_int_t) ch) - ((duk_int_t) DUK_ASC_0) + 0x00;
+ ndigits++;
+ }
+ } else {
+ duk_uint_fast32_t match_val;
+ duk_small_uint_t sep_idx;
+
+ if (ndigits <= 0) {
+ goto reject;
+ }
+ if (part_idx == DUK__PI_MILLISECOND) {
+ /* complete the millisecond field */
+ while (ndigits < 3) {
+ accum *= 10;
+ ndigits++;
+ }
+ }
+ parts[part_idx] = accum;
+ DUK_DDD(DUK_DDDPRINT("wrote part %ld -> value %ld", (long) part_idx, (long) accum));
+
+ accum = 0;
+ ndigits = 0;
+
+ for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t)); i++) {
+ if (duk__parse_iso8601_seps[i] == ch) {
+ break;
+ }
+ }
+ if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t))) {
+ DUK_DDD(DUK_DDDPRINT("separator character doesn't match -> reject"));
+ goto reject;
+ }
+
+ sep_idx = i;
+ match_val = (1UL << part_idx) + (1UL << (sep_idx + 9)); /* match against rule part/sep bits */
+
+ for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t)); i++) {
+ duk_uint_fast32_t rule = duk__parse_iso8601_control[i];
+ duk_small_uint_t nextpart;
+ duk_small_uint_t cflags;
+
+ DUK_DDD(DUK_DDDPRINT("part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, considering rule=0x%08lx",
+ (long) part_idx, (long) sep_idx,
+ (unsigned long) match_val, (unsigned long) rule));
+
+ if ((rule & match_val) != match_val) {
+ continue;
+ }
+
+ DUK__UNPACK_RULE(rule, nextpart, cflags);
+
+ DUK_DDD(DUK_DDDPRINT("rule match -> part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, "
+ "rule=0x%08lx -> nextpart=%ld, cflags=0x%02lx",
+ (long) part_idx, (long) sep_idx,
+ (unsigned long) match_val, (unsigned long) rule,
+ (long) nextpart, (unsigned long) cflags));
+
+ if (cflags & DUK__CF_NEG) {
+ neg_tzoffset = 1;
+ }
+
+ if (cflags & DUK__CF_ACCEPT) {
+ goto accept;
+ }
+
+ if (cflags & DUK__CF_ACCEPT_NUL) {
+ DUK_ASSERT(*(p - 1) != (char) 0);
+ if (*p == DUK_ASC_NUL) {
+ goto accept;
+ }
+ goto reject;
+ }
+
+ part_idx = nextpart;
+ break;
+ } /* rule match */
+
+ if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t))) {
+ DUK_DDD(DUK_DDDPRINT("no rule matches -> reject"));
+ goto reject;
+ }
+
+ if (ch == 0) {
+ /* This shouldn't be necessary, but check just in case
+ * to avoid any chance of overruns.
+ */
+ DUK_DDD(DUK_DDDPRINT("NUL after rule matching (should not happen) -> reject"));
+ goto reject;
+ }
+ } /* if-digit-else-ctrl */
+ } /* char loop */
+
+ /* We should never exit the loop above. */
+ DUK_UNREACHABLE();
+
+ reject:
+ DUK_DDD(DUK_DDDPRINT("reject"));
+ return 0;
+
+ accept:
+ DUK_DDD(DUK_DDDPRINT("accept"));
+
+ /* Apply timezone offset to get the main parts in UTC */
+ if (neg_year) {
+ parts[DUK__PI_YEAR] = -parts[DUK__PI_YEAR];
+ }
+ if (neg_tzoffset) {
+ parts[DUK__PI_HOUR] += parts[DUK__PI_TZHOUR];
+ parts[DUK__PI_MINUTE] += parts[DUK__PI_TZMINUTE];
+ } else {
+ parts[DUK__PI_HOUR] -= parts[DUK__PI_TZHOUR];
+ parts[DUK__PI_MINUTE] -= parts[DUK__PI_TZMINUTE];
+ }
+ parts[DUK__PI_MONTH] -= 1; /* zero-based month */
+ parts[DUK__PI_DAY] -= 1; /* zero-based day */
+
+ /* Use double parts, they tolerate unnormalized time.
+ *
+ * Note: DUK_DATE_IDX_WEEKDAY is initialized with a bogus value (DUK__PI_TZHOUR)
+ * on purpose. It won't be actually used by duk_bi_date_get_timeval_from_dparts(),
+ * but will make the value initialized just in case, and avoid any
+ * potential for Valgrind issues.
+ */
+ for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) {
+ DUK_DDD(DUK_DDDPRINT("part[%ld] = %ld", (long) i, (long) parts[i]));
+ dparts[i] = parts[i];
+ }
+
+ d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/);
+ duk_push_number(thr, d);
+ return 1;
+}
+
+/*
+ * Date/time parsing helper.
+ *
+ * Parse a datetime string into a time value. We must first try to parse
+ * the input according to the standard format in E5.1 Section 15.9.1.15.
+ * If that fails, we can try to parse using custom parsing, which can
+ * either be platform neutral (custom code) or platform specific (using
+ * existing platform API calls).
+ *
+ * Note in particular that we must parse whatever toString(), toUTCString(),
+ * and toISOString() can produce; see E5.1 Section 15.9.4.2.
+ *
+ * Returns 1 to allow tail calling.
+ *
+ * There is much room for improvement here with respect to supporting
+ * alternative datetime formats. For instance, V8 parses '2012-01-01' as
+ * UTC and '2012/01/01' as local time.
+ */
+
+DUK_LOCAL duk_ret_t duk__parse_string(duk_hthread *thr, const char *str) {
+ /* XXX: there is a small risk here: because the ISO 8601 parser is
+ * very loose, it may end up parsing some datetime values which
+ * would be better parsed with a platform specific parser.
+ */
+
+ DUK_ASSERT(str != NULL);
+ DUK_DDD(DUK_DDDPRINT("parse datetime from string '%s'", (const char *) str));
+
+ if (duk__parse_string_iso8601_subset(thr, str) != 0) {
+ return 1;
+ }
+
+#if defined(DUK_USE_DATE_PARSE_STRING)
+ /* Contract, either:
+ * - Push value on stack and return 1
+ * - Don't push anything on stack and return 0
+ */
+
+ if (DUK_USE_DATE_PARSE_STRING(thr, str) != 0) {
+ return 1;
+ }
+#else
+ /* No platform-specific parsing, this is not an error. */
+#endif
+
+ duk_push_nan(thr);
+ return 1;
+}
+
+/*
+ * Calendar helpers
+ *
+ * Some helpers are used for getters and can operate on normalized values
+ * which can be represented with 32-bit signed integers. Other helpers are
+ * needed by setters and operate on un-normalized double values, must watch
+ * out for non-finite numbers etc.
+ */
+
+DUK_LOCAL duk_uint8_t duk__days_in_month[12] = {
+ (duk_uint8_t) 31, (duk_uint8_t) 28, (duk_uint8_t) 31, (duk_uint8_t) 30,
+ (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 31,
+ (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31
+};
+
+/* Maximum iteration count for computing UTC-to-local time offset when
+ * creating an Ecmascript time value from local parts.
+ */
+#define DUK__LOCAL_TZOFFSET_MAXITER 4
+
+/* Because 'day since epoch' can be negative and is used to compute weekday
+ * using a modulo operation, add this multiple of 7 to avoid negative values
+ * when year is below 1970 epoch. Ecmascript time values are restricted to
+ * +/- 100 million days from epoch, so this adder fits nicely into 32 bits.
+ * Round to a multiple of 7 (= floor(100000000 / 7) * 7) and add margin.
+ */
+#define DUK__WEEKDAY_MOD_ADDER (20000000 * 7) /* 0x08583b00 */
+
+DUK_INTERNAL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year) {
+ if ((year % 4) != 0) {
+ return 0;
+ }
+ if ((year % 100) != 0) {
+ return 1;
+ }
+ if ((year % 400) != 0) {
+ return 0;
+ }
+ return 1;
+}
+
+DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x) {
+ return (x >= -DUK_DATE_MSEC_100M_DAYS && x <= DUK_DATE_MSEC_100M_DAYS);
+}
+
+DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x) {
+ return (x >= -DUK_DATE_MSEC_100M_DAYS_LEEWAY && x <= DUK_DATE_MSEC_100M_DAYS_LEEWAY);
+}
+
+DUK_INTERNAL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t x) {
+ return (x >= DUK_DATE_MIN_ECMA_YEAR && x <= DUK_DATE_MAX_ECMA_YEAR);
+}
+
+DUK_LOCAL duk_double_t duk__timeclip(duk_double_t x) {
+ if (!DUK_ISFINITE(x)) {
+ return DUK_DOUBLE_NAN;
+ }
+
+ if (!duk_bi_date_timeval_in_valid_range(x)) {
+ return DUK_DOUBLE_NAN;
+ }
+
+ x = duk_js_tointeger_number(x);
+
+ /* Here we'd have the option to normalize -0 to +0. */
+ return x;
+}
+
+/* Integer division which floors also negative values correctly. */
+DUK_LOCAL duk_int_t duk__div_floor(duk_int_t a, duk_int_t b) {
+ DUK_ASSERT(b > 0);
+ if (a >= 0) {
+ return a / b;
+ } else {
+ /* e.g. a = -4, b = 5 --> -4 - 5 + 1 / 5 --> -8 / 5 --> -1
+ * a = -5, b = 5 --> -5 - 5 + 1 / 5 --> -9 / 5 --> -1
+ * a = -6, b = 5 --> -6 - 5 + 1 / 5 --> -10 / 5 --> -2
+ */
+ return (a - b + 1) / b;
+ }
+}
+
+/* Compute day number of the first day of a given year. */
+DUK_LOCAL duk_int_t duk__day_from_year(duk_int_t year) {
+ /* Note: in integer arithmetic, (x / 4) is same as floor(x / 4) for non-negative
+ * values, but is incorrect for negative ones.
+ */
+ return 365 * (year - 1970)
+ + duk__div_floor(year - 1969, 4)
+ - duk__div_floor(year - 1901, 100)
+ + duk__div_floor(year - 1601, 400);
+}
+
+/* Given a day number, determine year and day-within-year. */
+DUK_LOCAL duk_int_t duk__year_from_day(duk_int_t day, duk_small_int_t *out_day_within_year) {
+ duk_int_t year;
+ duk_int_t diff_days;
+
+ /* estimate year upwards (towards positive infinity), then back down;
+ * two iterations should be enough
+ */
+
+ if (day >= 0) {
+ year = 1970 + day / 365;
+ } else {
+ year = 1970 + day / 366;
+ }
+
+ for (;;) {
+ diff_days = duk__day_from_year(year) - day;
+ DUK_DDD(DUK_DDDPRINT("year=%ld day=%ld, diff_days=%ld", (long) year, (long) day, (long) diff_days));
+ if (diff_days <= 0) {
+ DUK_ASSERT(-diff_days < 366); /* fits into duk_small_int_t */
+ *out_day_within_year = -diff_days;
+ DUK_DDD(DUK_DDDPRINT("--> year=%ld, day-within-year=%ld",
+ (long) year, (long) *out_day_within_year));
+ DUK_ASSERT(*out_day_within_year >= 0);
+ DUK_ASSERT(*out_day_within_year < (duk_bi_date_is_leap_year(year) ? 366 : 365));
+ return year;
+ }
+
+ /* Note: this is very tricky; we must never 'overshoot' the
+ * correction downwards.
+ */
+ year -= 1 + (diff_days - 1) / 366; /* conservative */
+ }
+}
+
+/* Given a (year, month, day-within-month) triple, compute day number.
+ * The input triple is un-normalized and may contain non-finite values.
+ */
+DUK_LOCAL duk_double_t duk__make_day(duk_double_t year, duk_double_t month, duk_double_t day) {
+ duk_int_t day_num;
+ duk_bool_t is_leap;
+ duk_small_int_t i, n;
+
+ /* Assume that year, month, day are all coerced to whole numbers.
+ * They may also be NaN or infinity, in which case this function
+ * must return NaN or infinity to ensure time value becomes NaN.
+ * If 'day' is NaN, the final return will end up returning a NaN,
+ * so it doesn't need to be checked here.
+ */
+
+ if (!DUK_ISFINITE(year) || !DUK_ISFINITE(month)) {
+ return DUK_DOUBLE_NAN;
+ }
+
+ year += DUK_FLOOR(month / 12.0);
+
+ month = DUK_FMOD(month, 12.0);
+ if (month < 0.0) {
+ /* handle negative values */
+ month += 12.0;
+ }
+
+ /* The algorithm in E5.1 Section 15.9.1.12 normalizes month, but
+ * does not normalize the day-of-month (nor check whether or not
+ * it is finite) because it's not necessary for finding the day
+ * number which matches the (year,month) pair.
+ *
+ * We assume that duk__day_from_year() is exact here.
+ *
+ * Without an explicit infinity / NaN check in the beginning,
+ * day_num would be a bogus integer here.
+ *
+ * It's possible for 'year' to be out of integer range here.
+ * If so, we need to return NaN without integer overflow.
+ * This fixes test-bug-setyear-overflow.js.
+ */
+
+ if (!duk_bi_date_year_in_valid_range(year)) {
+ DUK_DD(DUK_DDPRINT("year not in ecmascript valid range, avoid integer overflow: %lf", (double) year));
+ return DUK_DOUBLE_NAN;
+ }
+ day_num = duk__day_from_year((duk_int_t) year);
+ is_leap = duk_bi_date_is_leap_year((duk_int_t) year);
+
+ n = (duk_small_int_t) month;
+ for (i = 0; i < n; i++) {
+ day_num += duk__days_in_month[i];
+ if (i == 1 && is_leap) {
+ day_num++;
+ }
+ }
+
+ /* If 'day' is NaN, returns NaN. */
+ return (duk_double_t) day_num + day;
+}
+
+/* Split time value into parts. The time value may contain fractions (it may
+ * come from duk_time_to_components() API call) which are truncated. Possible
+ * local time adjustment has already been applied when reading the time value.
+ */
+DUK_INTERNAL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags) {
+ duk_double_t d1, d2;
+ duk_int_t t1, t2;
+ duk_int_t day_since_epoch;
+ duk_int_t year; /* does not fit into 16 bits */
+ duk_small_int_t day_in_year;
+ duk_small_int_t month;
+ duk_small_int_t day;
+ duk_small_int_t dim;
+ duk_int_t jan1_since_epoch;
+ duk_small_int_t jan1_weekday;
+ duk_int_t equiv_year;
+ duk_small_uint_t i;
+ duk_bool_t is_leap;
+ duk_small_int_t arridx;
+
+ DUK_ASSERT(DUK_ISFINITE(d)); /* caller checks */
+ d = DUK_FLOOR(d); /* remove fractions if present */
+ DUK_ASSERT(DUK_FLOOR(d) == d);
+
+ /* The timevalue must be in valid Ecmascript range, but since a local
+ * time offset can be applied, we need to allow a +/- 24h leeway to
+ * the value. In other words, although the UTC time is within the
+ * Ecmascript range, the local part values can be just outside of it.
+ */
+ DUK_UNREF(duk_bi_date_timeval_in_leeway_range);
+ DUK_ASSERT(duk_bi_date_timeval_in_leeway_range(d));
+
+ /* These computations are guaranteed to be exact for the valid
+ * E5 time value range, assuming milliseconds without fractions.
+ */
+ d1 = (duk_double_t) DUK_FMOD(d, (double) DUK_DATE_MSEC_DAY);
+ if (d1 < 0.0) {
+ /* deal with negative values */
+ d1 += (duk_double_t) DUK_DATE_MSEC_DAY;
+ }
+ d2 = DUK_FLOOR((double) (d / (duk_double_t) DUK_DATE_MSEC_DAY));
+ DUK_ASSERT(d2 * ((duk_double_t) DUK_DATE_MSEC_DAY) + d1 == d);
+ /* now expected to fit into a 32-bit integer */
+ t1 = (duk_int_t) d1;
+ t2 = (duk_int_t) d2;
+ day_since_epoch = t2;
+ DUK_ASSERT((duk_double_t) t1 == d1);
+ DUK_ASSERT((duk_double_t) t2 == d2);
+
+ /* t1 = milliseconds within day (fits 32 bit)
+ * t2 = day number from epoch (fits 32 bit, may be negative)
+ */
+
+ parts[DUK_DATE_IDX_MILLISECOND] = t1 % 1000; t1 /= 1000;
+ parts[DUK_DATE_IDX_SECOND] = t1 % 60; t1 /= 60;
+ parts[DUK_DATE_IDX_MINUTE] = t1 % 60; t1 /= 60;
+ parts[DUK_DATE_IDX_HOUR] = t1;
+ DUK_ASSERT(parts[DUK_DATE_IDX_MILLISECOND] >= 0 && parts[DUK_DATE_IDX_MILLISECOND] <= 999);
+ DUK_ASSERT(parts[DUK_DATE_IDX_SECOND] >= 0 && parts[DUK_DATE_IDX_SECOND] <= 59);
+ DUK_ASSERT(parts[DUK_DATE_IDX_MINUTE] >= 0 && parts[DUK_DATE_IDX_MINUTE] <= 59);
+ DUK_ASSERT(parts[DUK_DATE_IDX_HOUR] >= 0 && parts[DUK_DATE_IDX_HOUR] <= 23);
+
+ DUK_DDD(DUK_DDDPRINT("d=%lf, d1=%lf, d2=%lf, t1=%ld, t2=%ld, parts: hour=%ld min=%ld sec=%ld msec=%ld",
+ (double) d, (double) d1, (double) d2, (long) t1, (long) t2,
+ (long) parts[DUK_DATE_IDX_HOUR],
+ (long) parts[DUK_DATE_IDX_MINUTE],
+ (long) parts[DUK_DATE_IDX_SECOND],
+ (long) parts[DUK_DATE_IDX_MILLISECOND]));
+
+ /* This assert depends on the input parts representing time inside
+ * the Ecmascript range.
+ */
+ DUK_ASSERT(t2 + DUK__WEEKDAY_MOD_ADDER >= 0);
+ parts[DUK_DATE_IDX_WEEKDAY] = (t2 + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */
+ DUK_ASSERT(parts[DUK_DATE_IDX_WEEKDAY] >= 0 && parts[DUK_DATE_IDX_WEEKDAY] <= 6);
+
+ year = duk__year_from_day(t2, &day_in_year);
+ day = day_in_year;
+ is_leap = duk_bi_date_is_leap_year(year);
+ for (month = 0; month < 12; month++) {
+ dim = duk__days_in_month[month];
+ if (month == 1 && is_leap) {
+ dim++;
+ }
+ DUK_DDD(DUK_DDDPRINT("month=%ld, dim=%ld, day=%ld",
+ (long) month, (long) dim, (long) day));
+ if (day < dim) {
+ break;
+ }
+ day -= dim;
+ }
+ DUK_DDD(DUK_DDDPRINT("final month=%ld", (long) month));
+ DUK_ASSERT(month >= 0 && month <= 11);
+ DUK_ASSERT(day >= 0 && day <= 31);
+
+ /* Equivalent year mapping, used to avoid DST trouble when platform
+ * may fail to provide reasonable DST answers for dates outside the
+ * ordinary range (e.g. 1970-2038). An equivalent year has the same
+ * leap-year-ness as the original year and begins on the same weekday
+ * (Jan 1).
+ *
+ * The year 2038 is avoided because there seem to be problems with it
+ * on some platforms. The year 1970 is also avoided as there were
+ * practical problems with it; an equivalent year is used for it too,
+ * which breaks some DST computations for 1970 right now, see e.g.
+ * test-bi-date-tzoffset-brute-fi.js.
+ */
+ if ((flags & DUK_DATE_FLAG_EQUIVYEAR) && (year < 1971 || year > 2037)) {
+ DUK_ASSERT(is_leap == 0 || is_leap == 1);
+
+ jan1_since_epoch = day_since_epoch - day_in_year; /* day number for Jan 1 since epoch */
+ DUK_ASSERT(jan1_since_epoch + DUK__WEEKDAY_MOD_ADDER >= 0);
+ jan1_weekday = (jan1_since_epoch + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */
+ DUK_ASSERT(jan1_weekday >= 0 && jan1_weekday <= 6);
+ arridx = jan1_weekday;
+ if (is_leap) {
+ arridx += 7;
+ }
+ DUK_ASSERT(arridx >= 0 && arridx < (duk_small_int_t) (sizeof(duk__date_equivyear) / sizeof(duk_uint8_t)));
+
+ equiv_year = (duk_int_t) duk__date_equivyear[arridx] + 1970;
+ year = equiv_year;
+ DUK_DDD(DUK_DDDPRINT("equiv year mapping, year=%ld, day_in_year=%ld, day_since_epoch=%ld, "
+ "jan1_since_epoch=%ld, jan1_weekday=%ld -> equiv year %ld",
+ (long) year, (long) day_in_year, (long) day_since_epoch,
+ (long) jan1_since_epoch, (long) jan1_weekday, (long) equiv_year));
+ }
+
+ parts[DUK_DATE_IDX_YEAR] = year;
+ parts[DUK_DATE_IDX_MONTH] = month;
+ parts[DUK_DATE_IDX_DAY] = day;
+
+ if (flags & DUK_DATE_FLAG_ONEBASED) {
+ parts[DUK_DATE_IDX_MONTH]++; /* zero-based -> one-based */
+ parts[DUK_DATE_IDX_DAY]++; /* -""- */
+ }
+
+ if (dparts != NULL) {
+ for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) {
+ dparts[i] = (duk_double_t) parts[i];
+ }
+ }
+}
+
+/* Compute time value from (double) parts. The parts can be either UTC
+ * or local time; if local, they need to be (conceptually) converted into
+ * UTC time. The parts may represent valid or invalid time, and may be
+ * wildly out of range (but may cancel each other and still come out in
+ * the valid Date range).
+ */
+DUK_INTERNAL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags) {
+#if defined(DUK_USE_PARANOID_DATE_COMPUTATION)
+ /* See comments below on MakeTime why these are volatile. */
+ volatile duk_double_t tmp_time;
+ volatile duk_double_t tmp_day;
+ volatile duk_double_t d;
+#else
+ duk_double_t tmp_time;
+ duk_double_t tmp_day;
+ duk_double_t d;
+#endif
+ duk_small_uint_t i;
+ duk_int_t tzoff, tzoffprev1, tzoffprev2;
+
+ /* Expects 'this' at top of stack on entry. */
+
+ /* Coerce all finite parts with ToInteger(). ToInteger() must not
+ * be called for NaN/Infinity because it will convert e.g. NaN to
+ * zero. If ToInteger() has already been called, this has no side
+ * effects and is idempotent.
+ *
+ * Don't read dparts[DUK_DATE_IDX_WEEKDAY]; it will cause Valgrind
+ * issues if the value is uninitialized.
+ */
+ for (i = 0; i <= DUK_DATE_IDX_MILLISECOND; i++) {
+ /* SCANBUILD: scan-build complains here about assigned value
+ * being garbage or undefined. This is correct but operating
+ * on undefined values has no ill effect and is ignored by the
+ * caller in the case where this happens.
+ */
+ d = dparts[i];
+ if (DUK_ISFINITE(d)) {
+ dparts[i] = duk_js_tointeger_number(d);
+ }
+ }
+
+ /* Use explicit steps in computation to try to ensure that
+ * computation happens with intermediate results coerced to
+ * double values (instead of using something more accurate).
+ * E.g. E5.1 Section 15.9.1.11 requires use of IEEE 754
+ * rules (= Ecmascript '+' and '*' operators).
+ *
+ * Without 'volatile' even this approach fails on some platform
+ * and compiler combinations. For instance, gcc 4.8.1 on Ubuntu
+ * 64-bit, with -m32 and without -std=c99, test-bi-date-canceling.js
+ * would fail because of some optimizations when computing tmp_time
+ * (MakeTime below). Adding 'volatile' to tmp_time solved this
+ * particular problem (annoyingly, also adding debug prints or
+ * running the executable under valgrind hides it).
+ */
+
+ /* MakeTime */
+ tmp_time = 0.0;
+ tmp_time += dparts[DUK_DATE_IDX_HOUR] * ((duk_double_t) DUK_DATE_MSEC_HOUR);
+ tmp_time += dparts[DUK_DATE_IDX_MINUTE] * ((duk_double_t) DUK_DATE_MSEC_MINUTE);
+ tmp_time += dparts[DUK_DATE_IDX_SECOND] * ((duk_double_t) DUK_DATE_MSEC_SECOND);
+ tmp_time += dparts[DUK_DATE_IDX_MILLISECOND];
+
+ /* MakeDay */
+ tmp_day = duk__make_day(dparts[DUK_DATE_IDX_YEAR], dparts[DUK_DATE_IDX_MONTH], dparts[DUK_DATE_IDX_DAY]);
+
+ /* MakeDate */
+ d = tmp_day * ((duk_double_t) DUK_DATE_MSEC_DAY) + tmp_time;
+
+ DUK_DDD(DUK_DDDPRINT("time=%lf day=%lf --> timeval=%lf",
+ (double) tmp_time, (double) tmp_day, (double) d));
+
+ /* Optional UTC conversion. */
+ if (flags & DUK_DATE_FLAG_LOCALTIME) {
+ /* DUK_USE_DATE_GET_LOCAL_TZOFFSET() needs to be called with a
+ * time value computed from UTC parts. At this point we only
+ * have 'd' which is a time value computed from local parts, so
+ * it is off by the UTC-to-local time offset which we don't know
+ * yet. The current solution for computing the UTC-to-local
+ * time offset is to iterate a few times and detect a fixed
+ * point or a two-cycle loop (or a sanity iteration limit),
+ * see test-bi-date-local-parts.js and test-bi-date-tzoffset-basic-fi.js.
+ *
+ * E5.1 Section 15.9.1.9:
+ * UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)
+ *
+ * For NaN/inf, DUK_USE_DATE_GET_LOCAL_TZOFFSET() returns 0.
+ */
+
+#if 0
+ /* Old solution: don't iterate, incorrect */
+ tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);
+ DUK_DDD(DUK_DDDPRINT("tzoffset w/o iteration, tzoff=%ld", (long) tzoff));
+ d -= tzoff * 1000L;
+ DUK_UNREF(tzoffprev1);
+ DUK_UNREF(tzoffprev2);
+#endif
+
+ /* Iteration solution */
+ tzoff = 0;
+ tzoffprev1 = 999999999L; /* invalid value which never matches */
+ for (i = 0; i < DUK__LOCAL_TZOFFSET_MAXITER; i++) {
+ tzoffprev2 = tzoffprev1;
+ tzoffprev1 = tzoff;
+ tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d - tzoff * 1000L);
+ DUK_DDD(DUK_DDDPRINT("tzoffset iteration, i=%d, tzoff=%ld, tzoffprev1=%ld tzoffprev2=%ld",
+ (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2));
+ if (tzoff == tzoffprev1) {
+ DUK_DDD(DUK_DDDPRINT("tzoffset iteration finished, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld",
+ (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2));
+ break;
+ } else if (tzoff == tzoffprev2) {
+ /* Two value cycle, see e.g. test-bi-date-tzoffset-basic-fi.js.
+ * In these cases, favor a higher tzoffset to get a consistent
+ * result which is independent of iteration count. Not sure if
+ * this is a generically correct solution.
+ */
+ DUK_DDD(DUK_DDDPRINT("tzoffset iteration two-value cycle, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld",
+ (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2));
+ if (tzoffprev1 > tzoff) {
+ tzoff = tzoffprev1;
+ }
+ break;
+ }
+ }
+ DUK_DDD(DUK_DDDPRINT("tzoffset iteration, tzoff=%ld", (long) tzoff));
+ d -= tzoff * 1000L;
+ }
+
+ /* TimeClip(), which also handles Infinity -> NaN conversion */
+ d = duk__timeclip(d);
+
+ return d;
+}
+
+/*
+ * API oriented helpers
+ */
+
+/* Push 'this' binding, check that it is a Date object; then push the
+ * internal time value. At the end, stack is: [ ... this timeval ].
+ * Returns the time value. Local time adjustment is done if requested.
+ */
+DUK_LOCAL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset) {
+ duk_hobject *h;
+ duk_double_t d;
+ duk_int_t tzoffset = 0;
+
+ duk_push_this(thr);
+ h = duk_get_hobject(thr, -1); /* XXX: getter with class check, useful in built-ins */
+ if (h == NULL || DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_DATE) {
+ DUK_ERROR_TYPE(thr, "expected Date");
+ }
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);
+ d = duk_to_number_m1(thr);
+ duk_pop(thr);
+
+ if (DUK_ISNAN(d)) {
+ if (flags & DUK_DATE_FLAG_NAN_TO_ZERO) {
+ d = 0.0;
+ }
+ if (flags & DUK_DATE_FLAG_NAN_TO_RANGE_ERROR) {
+ DUK_ERROR_RANGE(thr, "Invalid Date");
+ }
+ }
+ /* if no NaN handling flag, may still be NaN here, but not Inf */
+ DUK_ASSERT(!DUK_ISINF(d));
+
+ if (flags & DUK_DATE_FLAG_LOCALTIME) {
+ /* Note: DST adjustment is determined using UTC time.
+ * If 'd' is NaN, tzoffset will be 0.
+ */
+ tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); /* seconds */
+ d += tzoffset * 1000L;
+ }
+ if (out_tzoffset) {
+ *out_tzoffset = tzoffset;
+ }
+
+ /* [ ... this ] */
+ return d;
+}
+
+DUK_LOCAL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags) {
+ return duk__push_this_get_timeval_tzoffset(thr, flags, NULL);
+}
+
+/* Set timeval to 'this' from dparts, push the new time value onto the
+ * value stack and return 1 (caller can then tail call us). Expects
+ * the value stack to contain 'this' on the stack top.
+ */
+DUK_LOCAL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags) {
+ duk_double_t d;
+
+ /* [ ... this ] */
+
+ d = duk_bi_date_get_timeval_from_dparts(dparts, flags);
+ duk_push_number(thr, d); /* -> [ ... this timeval_new ] */
+ duk_dup_top(thr); /* -> [ ... this timeval_new timeval_new ] */
+ duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE);
+
+ /* stack top: new time value, return 1 to allow tail calls */
+ return 1;
+}
+
+/* 'out_buf' must be at least DUK_BI_DATE_ISO8601_BUFSIZE long. */
+DUK_LOCAL void duk__format_parts_iso8601(duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags, duk_uint8_t *out_buf) {
+ char yearstr[8]; /* "-123456\0" */
+ char tzstr[8]; /* "+11:22\0" */
+ char sep = (flags & DUK_DATE_FLAG_SEP_T) ? DUK_ASC_UC_T : DUK_ASC_SPACE;
+
+ DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12);
+ DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31);
+ DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= -999999 && parts[DUK_DATE_IDX_YEAR] <= 999999);
+
+ /* Note: %06d for positive value, %07d for negative value to include
+ * sign and 6 digits.
+ */
+ DUK_SNPRINTF(yearstr,
+ sizeof(yearstr),
+ (parts[DUK_DATE_IDX_YEAR] >= 0 && parts[DUK_DATE_IDX_YEAR] <= 9999) ? "%04ld" :
+ ((parts[DUK_DATE_IDX_YEAR] >= 0) ? "+%06ld" : "%07ld"),
+ (long) parts[DUK_DATE_IDX_YEAR]);
+ yearstr[sizeof(yearstr) - 1] = (char) 0;
+
+ if (flags & DUK_DATE_FLAG_LOCALTIME) {
+ /* tzoffset seconds are dropped; 16 bits suffice for
+ * time offset in minutes
+ */
+ const char *fmt;
+ duk_small_int_t tmp, arg_hours, arg_minutes;
+
+ if (tzoffset >= 0) {
+ tmp = tzoffset;
+ fmt = "+%02d:%02d";
+ } else {
+ tmp = -tzoffset;
+ fmt = "-%02d:%02d";
+ }
+ tmp = tmp / 60;
+ arg_hours = tmp / 60;
+ arg_minutes = tmp % 60;
+ DUK_ASSERT(arg_hours <= 24); /* Even less is actually guaranteed for a valid tzoffset. */
+ arg_hours = arg_hours & 0x3f; /* For [0,24] this is a no-op, but fixes GCC 7 warning, see https://github.com/svaarala/duktape/issues/1602. */
+
+ DUK_SNPRINTF(tzstr, sizeof(tzstr), fmt, (int) arg_hours, (int) arg_minutes);
+ tzstr[sizeof(tzstr) - 1] = (char) 0;
+ } else {
+ tzstr[0] = DUK_ASC_UC_Z;
+ tzstr[1] = (char) 0;
+ }
+
+ /* Unlike year, the other parts fit into 16 bits so %d format
+ * is portable.
+ */
+ if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) {
+ DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d%c%02d:%02d:%02d.%03d%s",
+ (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY], (int) sep,
+ (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE],
+ (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], (const char *) tzstr);
+ } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) {
+ DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d",
+ (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY]);
+ } else {
+ DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME);
+ DUK_SPRINTF((char *) out_buf, "%02d:%02d:%02d.%03d%s",
+ (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE],
+ (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND],
+ (const char *) tzstr);
+ }
+}
+
+/* Helper for string conversion calls: check 'this' binding, get the
+ * internal time value, and format date and/or time in a few formats.
+ * Return value allows tail calls.
+ */
+DUK_LOCAL duk_ret_t duk__to_string_helper(duk_hthread *thr, duk_small_uint_t flags) {
+ duk_double_t d;
+ duk_int_t parts[DUK_DATE_IDX_NUM_PARTS];
+ duk_int_t tzoffset; /* seconds, doesn't fit into 16 bits */
+ duk_bool_t rc;
+ duk_uint8_t buf[DUK_BI_DATE_ISO8601_BUFSIZE];
+
+ DUK_UNREF(rc); /* unreferenced with some options */
+
+ d = duk__push_this_get_timeval_tzoffset(thr, flags, &tzoffset);
+ if (DUK_ISNAN(d)) {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_INVALID_DATE);
+ return 1;
+ }
+ DUK_ASSERT(DUK_ISFINITE(d));
+
+ /* formatters always get one-based month/day-of-month */
+ duk_bi_date_timeval_to_parts(d, parts, NULL, DUK_DATE_FLAG_ONEBASED);
+ DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12);
+ DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31);
+
+ if (flags & DUK_DATE_FLAG_TOSTRING_LOCALE) {
+ /* try locale specific formatter; if it refuses to format the
+ * string, fall back to an ISO 8601 formatted value in local
+ * time.
+ */
+#if defined(DUK_USE_DATE_FORMAT_STRING)
+ /* Contract, either:
+ * - Push string to value stack and return 1
+ * - Don't push anything and return 0
+ */
+
+ rc = DUK_USE_DATE_FORMAT_STRING(thr, parts, tzoffset, flags);
+ if (rc != 0) {
+ return 1;
+ }
+#else
+ /* No locale specific formatter; this is OK, we fall back
+ * to ISO 8601.
+ */
+#endif
+ }
+
+ /* Different calling convention than above used because the helper
+ * is shared.
+ */
+ duk__format_parts_iso8601(parts, tzoffset, flags, buf);
+ duk_push_string(thr, (const char *) buf);
+ return 1;
+}
+
+/* Helper for component getter calls: check 'this' binding, get the
+ * internal time value, split it into parts (either as UTC time or
+ * local time), push a specified component as a return value to the
+ * value stack and return 1 (caller can then tail call us).
+ */
+DUK_LOCAL duk_ret_t duk__get_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_idx) {
+ duk_double_t d;
+ duk_int_t parts[DUK_DATE_IDX_NUM_PARTS];
+ duk_small_uint_t idx_part = (duk_small_uint_t) (flags_and_idx >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */
+
+ DUK_ASSERT_DISABLE(idx_part >= 0); /* unsigned */
+ DUK_ASSERT(idx_part < DUK_DATE_IDX_NUM_PARTS);
+
+ d = duk__push_this_get_timeval(thr, flags_and_idx);
+ if (DUK_ISNAN(d)) {
+ duk_push_nan(thr);
+ return 1;
+ }
+ DUK_ASSERT(DUK_ISFINITE(d));
+
+ duk_bi_date_timeval_to_parts(d, parts, NULL, flags_and_idx); /* no need to mask idx portion */
+
+ /* Setter APIs detect special year numbers (0...99) and apply a +1900
+ * only in certain cases. The legacy getYear() getter applies -1900
+ * unconditionally.
+ */
+ duk_push_int(thr, (flags_and_idx & DUK_DATE_FLAG_SUB1900) ? parts[idx_part] - 1900 : parts[idx_part]);
+ return 1;
+}
+
+/* Helper for component setter calls: check 'this' binding, get the
+ * internal time value, split it into parts (either as UTC time or
+ * local time), modify one or more components as specified, recompute
+ * the time value, set it as the internal value. Finally, push the
+ * new time value as a return value to the value stack and return 1
+ * (caller can then tail call us).
+ */
+DUK_LOCAL duk_ret_t duk__set_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_maxnargs) {
+ duk_double_t d;
+ duk_int_t parts[DUK_DATE_IDX_NUM_PARTS];
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ duk_idx_t nargs;
+ duk_small_uint_t maxnargs = (duk_small_uint_t) (flags_and_maxnargs >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */
+ duk_small_uint_t idx_first, idx;
+ duk_small_uint_t i;
+
+ nargs = duk_get_top(thr);
+ d = duk__push_this_get_timeval(thr, flags_and_maxnargs);
+ DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d));
+
+ if (DUK_ISFINITE(d)) {
+ duk_bi_date_timeval_to_parts(d, parts, dparts, flags_and_maxnargs);
+ } else {
+ /* NaN timevalue: we need to coerce the arguments, but
+ * the resulting internal timestamp needs to remain NaN.
+ * This works but is not pretty: parts and dparts will
+ * be partially uninitialized, but we only write to them.
+ */
+ }
+
+ /*
+ * Determining which datetime components to overwrite based on
+ * stack arguments is a bit complicated, but important to factor
+ * out from setters themselves for compactness.
+ *
+ * If DUK_DATE_FLAG_TIMESETTER, maxnargs indicates setter type:
+ *
+ * 1 -> millisecond
+ * 2 -> second, [millisecond]
+ * 3 -> minute, [second], [millisecond]
+ * 4 -> hour, [minute], [second], [millisecond]
+ *
+ * Else:
+ *
+ * 1 -> date
+ * 2 -> month, [date]
+ * 3 -> year, [month], [date]
+ *
+ * By comparing nargs and maxnargs (and flags) we know which
+ * components to override. We rely on part index ordering.
+ */
+
+ if (flags_and_maxnargs & DUK_DATE_FLAG_TIMESETTER) {
+ DUK_ASSERT(maxnargs >= 1 && maxnargs <= 4);
+ idx_first = DUK_DATE_IDX_MILLISECOND - (maxnargs - 1);
+ } else {
+ DUK_ASSERT(maxnargs >= 1 && maxnargs <= 3);
+ idx_first = DUK_DATE_IDX_DAY - (maxnargs - 1);
+ }
+ DUK_ASSERT_DISABLE(idx_first >= 0); /* unsigned */
+ DUK_ASSERT(idx_first < DUK_DATE_IDX_NUM_PARTS);
+
+ for (i = 0; i < maxnargs; i++) {
+ if ((duk_idx_t) i >= nargs) {
+ /* no argument given -> leave components untouched */
+ break;
+ }
+ idx = idx_first + i;
+ DUK_ASSERT_DISABLE(idx >= 0); /* unsigned */
+ DUK_ASSERT(idx < DUK_DATE_IDX_NUM_PARTS);
+
+ if (idx == DUK_DATE_IDX_YEAR && (flags_and_maxnargs & DUK_DATE_FLAG_YEAR_FIXUP)) {
+ duk__twodigit_year_fixup(thr, (duk_idx_t) i);
+ }
+
+ dparts[idx] = duk_to_number(thr, (duk_idx_t) i);
+
+ if (idx == DUK_DATE_IDX_DAY) {
+ /* Day-of-month is one-based in the API, but zero-based
+ * internally, so fix here. Note that month is zero-based
+ * both in the API and internally.
+ */
+ /* SCANBUILD: complains about use of uninitialized values.
+ * The complaint is correct, but operating in undefined
+ * values here is intentional in some cases and the caller
+ * ignores the results.
+ */
+ dparts[idx] -= 1.0;
+ }
+ }
+
+ /* Leaves new timevalue on stack top and returns 1, which is correct
+ * for part setters.
+ */
+ if (DUK_ISFINITE(d)) {
+ return duk__set_this_timeval_from_dparts(thr, dparts, flags_and_maxnargs);
+ } else {
+ /* Internal timevalue is already NaN, so don't touch it. */
+ duk_push_nan(thr);
+ return 1;
+ }
+}
+
+/* Apply ToNumber() to specified index; if ToInteger(val) in [0,99], add
+ * 1900 and replace value at idx_val.
+ */
+DUK_LOCAL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val) {
+ duk_double_t d;
+
+ /* XXX: idx_val would fit into 16 bits, but using duk_small_uint_t
+ * might not generate better code due to casting.
+ */
+
+ /* E5 Sections 15.9.3.1, B.2.4, B.2.5 */
+ duk_to_number(thr, idx_val);
+ if (duk_is_nan(thr, idx_val)) {
+ return;
+ }
+ duk_dup(thr, idx_val);
+ duk_to_int(thr, -1);
+ d = duk_get_number(thr, -1); /* get as double to handle huge numbers correctly */
+ if (d >= 0.0 && d <= 99.0) {
+ d += 1900.0;
+ duk_push_number(thr, d);
+ duk_replace(thr, idx_val);
+ }
+ duk_pop(thr);
+}
+
+/* Set datetime parts from stack arguments, defaulting any missing values.
+ * Day-of-week is not set; it is not required when setting the time value.
+ */
+DUK_LOCAL void duk__set_parts_from_args(duk_hthread *thr, duk_double_t *dparts, duk_idx_t nargs) {
+ duk_double_t d;
+ duk_small_uint_t i;
+ duk_small_uint_t idx;
+
+ /* Causes a ToNumber() coercion, but doesn't break coercion order since
+ * year is coerced first anyway.
+ */
+ duk__twodigit_year_fixup(thr, 0);
+
+ /* There are at most 7 args, but we use 8 here so that also
+ * DUK_DATE_IDX_WEEKDAY gets initialized (to zero) to avoid the potential
+ * for any Valgrind gripes later.
+ */
+ for (i = 0; i < 8; i++) {
+ /* Note: rely on index ordering */
+ idx = DUK_DATE_IDX_YEAR + i;
+ if ((duk_idx_t) i < nargs) {
+ d = duk_to_number(thr, (duk_idx_t) i);
+ if (idx == DUK_DATE_IDX_DAY) {
+ /* Convert day from one-based to zero-based (internal). This may
+ * cause the day part to be negative, which is OK.
+ */
+ d -= 1.0;
+ }
+ } else {
+ /* All components default to 0 except day-of-month which defaults
+ * to 1. However, because our internal day-of-month is zero-based,
+ * it also defaults to zero here.
+ */
+ d = 0.0;
+ }
+ dparts[idx] = d;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("parts from args -> %lf %lf %lf %lf %lf %lf %lf %lf",
+ (double) dparts[0], (double) dparts[1],
+ (double) dparts[2], (double) dparts[3],
+ (double) dparts[4], (double) dparts[5],
+ (double) dparts[6], (double) dparts[7]));
+}
+
+/*
+ * Indirect magic value lookup for Date methods.
+ *
+ * Date methods don't put their control flags into the function magic value
+ * because they wouldn't fit into a LIGHTFUNC's magic field. Instead, the
+ * magic value is set to an index pointing to the array of control flags
+ * below.
+ *
+ * This must be kept in strict sync with genbuiltins.py!
+ */
+
+static duk_uint16_t duk__date_magics[] = {
+ /* 0: toString */
+ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME,
+
+ /* 1: toDateString */
+ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_LOCALTIME,
+
+ /* 2: toTimeString */
+ DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME,
+
+ /* 3: toLocaleString */
+ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME,
+
+ /* 4: toLocaleDateString */
+ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME,
+
+ /* 5: toLocaleTimeString */
+ DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME,
+
+ /* 6: toUTCString */
+ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME,
+
+ /* 7: toISOString */
+ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_NAN_TO_RANGE_ERROR + DUK_DATE_FLAG_SEP_T,
+
+ /* 8: getFullYear */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 9: getUTCFullYear */
+ 0 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 10: getMonth */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 11: getUTCMonth */
+ 0 + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 12: getDate */
+ DUK_DATE_FLAG_ONEBASED + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 13: getUTCDate */
+ DUK_DATE_FLAG_ONEBASED + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 14: getDay */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 15: getUTCDay */
+ 0 + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 16: getHours */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 17: getUTCHours */
+ 0 + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 18: getMinutes */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 19: getUTCMinutes */
+ 0 + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 20: getSeconds */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 21: getUTCSeconds */
+ 0 + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 22: getMilliseconds */
+ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 23: getUTCMilliseconds */
+ 0 + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 24: setMilliseconds */
+ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 25: setUTCMilliseconds */
+ DUK_DATE_FLAG_TIMESETTER + (1 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 26: setSeconds */
+ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 27: setUTCSeconds */
+ DUK_DATE_FLAG_TIMESETTER + (2 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 28: setMinutes */
+ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 29: setUTCMinutes */
+ DUK_DATE_FLAG_TIMESETTER + (3 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 30: setHours */
+ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (4 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 31: setUTCHours */
+ DUK_DATE_FLAG_TIMESETTER + (4 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 32: setDate */
+ DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 33: setUTCDate */
+ 0 + (1 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 34: setMonth */
+ DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 35: setUTCMonth */
+ 0 + (2 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 36: setFullYear */
+ DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 37: setUTCFullYear */
+ DUK_DATE_FLAG_NAN_TO_ZERO + (3 << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 38: getYear */
+ DUK_DATE_FLAG_LOCALTIME + DUK_DATE_FLAG_SUB1900 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT),
+
+ /* 39: setYear */
+ DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_YEAR_FIXUP + (3 << DUK_DATE_FLAG_VALUE_SHIFT),
+};
+
+DUK_LOCAL duk_small_uint_t duk__date_get_indirect_magic(duk_hthread *thr) {
+ duk_small_uint_t magicidx = (duk_small_uint_t) duk_get_current_magic(thr);
+ DUK_ASSERT(magicidx < (duk_small_int_t) (sizeof(duk__date_magics) / sizeof(duk_uint16_t)));
+ return (duk_small_uint_t) duk__date_magics[magicidx];
+}
+
+#if defined(DUK_USE_DATE_BUILTIN)
+/*
+ * Constructor calls
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_date_constructor(duk_hthread *thr) {
+ duk_idx_t nargs = duk_get_top(thr);
+ duk_bool_t is_cons = duk_is_constructor_call(thr);
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ duk_double_t d;
+
+ DUK_DDD(DUK_DDDPRINT("Date constructor, nargs=%ld, is_cons=%ld", (long) nargs, (long) is_cons));
+
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATE),
+ DUK_BIDX_DATE_PROTOTYPE);
+
+ /* Unlike most built-ins, the internal [[PrimitiveValue]] of a Date
+ * is mutable.
+ */
+
+ if (nargs == 0 || !is_cons) {
+ d = duk__timeclip(duk_time_get_ecmascript_time_nofrac(thr));
+ duk_push_number(thr, d);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W);
+ if (!is_cons) {
+ /* called as a normal function: return new Date().toString() */
+ duk_to_string(thr, -1);
+ }
+ return 1;
+ } else if (nargs == 1) {
+ const char *str;
+ duk_to_primitive(thr, 0, DUK_HINT_NONE);
+ str = duk_get_string_notsymbol(thr, 0);
+ if (str) {
+ duk__parse_string(thr, str);
+ duk_replace(thr, 0); /* may be NaN */
+ }
+ d = duk__timeclip(duk_to_number(thr, 0)); /* symbols fail here */
+ duk_push_number(thr, d);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W);
+ return 1;
+ }
+
+ duk__set_parts_from_args(thr, dparts, nargs);
+
+ /* Parts are in local time, convert when setting. */
+
+ (void) duk__set_this_timeval_from_dparts(thr, dparts, DUK_DATE_FLAG_LOCALTIME /*flags*/); /* -> [ ... this timeval ] */
+ duk_pop(thr); /* -> [ ... this ] */
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_constructor_parse(duk_hthread *thr) {
+ return duk__parse_string(thr, duk_to_string(thr, 0));
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_constructor_utc(duk_hthread *thr) {
+ duk_idx_t nargs = duk_get_top(thr);
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ duk_double_t d;
+
+ /* Behavior for nargs < 2 is implementation dependent: currently we'll
+ * set a NaN time value (matching V8 behavior) in this case.
+ */
+
+ if (nargs < 2) {
+ duk_push_nan(thr);
+ } else {
+ duk__set_parts_from_args(thr, dparts, nargs);
+ d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/);
+ duk_push_number(thr, d);
+ }
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_constructor_now(duk_hthread *thr) {
+ duk_double_t d;
+
+ d = duk_time_get_ecmascript_time_nofrac(thr);
+ DUK_ASSERT(duk__timeclip(d) == d); /* TimeClip() should never be necessary */
+ duk_push_number(thr, d);
+ return 1;
+}
+
+/*
+ * String/JSON conversions
+ *
+ * Human readable conversions are now basically ISO 8601 with a space
+ * (instead of 'T') as the date/time separator. This is a good baseline
+ * and is platform independent.
+ *
+ * A shared native helper to provide many conversions. Magic value contains
+ * a set of flags. The helper provides:
+ *
+ * toString()
+ * toDateString()
+ * toTimeString()
+ * toLocaleString()
+ * toLocaleDateString()
+ * toLocaleTimeString()
+ * toUTCString()
+ * toISOString()
+ *
+ * Notes:
+ *
+ * - Date.prototype.toGMTString() and Date.prototype.toUTCString() are
+ * required to be the same Ecmascript function object (!), so it is
+ * omitted from here.
+ *
+ * - Date.prototype.toUTCString(): E5.1 specification does not require a
+ * specific format, but result should be human readable. The
+ * specification suggests using ISO 8601 format with a space (instead
+ * of 'T') separator if a more human readable format is not available.
+ *
+ * - Date.prototype.toISOString(): unlike other conversion functions,
+ * toISOString() requires a RangeError for invalid date values.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_hthread *thr) {
+ duk_small_uint_t flags = duk__date_get_indirect_magic(thr);
+ return duk__to_string_helper(thr, flags);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_value_of(duk_hthread *thr) {
+ /* This native function is also used for Date.prototype.getTime()
+ * as their behavior is identical.
+ */
+
+ duk_double_t d = duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ this ] */
+ DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d));
+ duk_push_number(thr, d);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_to_json(duk_hthread *thr) {
+ /* Note: toJSON() is a generic function which works even if 'this'
+ * is not a Date. The sole argument is ignored.
+ */
+
+ duk_push_this(thr);
+ duk_to_object(thr, -1);
+
+ duk_dup_top(thr);
+ duk_to_primitive(thr, -1, DUK_HINT_NUMBER);
+ if (duk_is_number(thr, -1)) {
+ duk_double_t d = duk_get_number(thr, -1);
+ if (!DUK_ISFINITE(d)) {
+ duk_push_null(thr);
+ return 1;
+ }
+ }
+ duk_pop(thr);
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_ISO_STRING);
+ duk_dup_m2(thr); /* -> [ O toIsoString O ] */
+ duk_call_method(thr, 0);
+ return 1;
+}
+
+/*
+ * Getters.
+ *
+ * Implementing getters is quite easy. The internal time value is either
+ * NaN, or represents milliseconds (without fractions) from Jan 1, 1970.
+ * The internal time value can be converted to integer parts, and each
+ * part will be normalized and will fit into a 32-bit signed integer.
+ *
+ * A shared native helper to provide all getters. Magic value contains
+ * a set of flags and also packs the date component index argument. The
+ * helper provides:
+ *
+ * getFullYear()
+ * getUTCFullYear()
+ * getMonth()
+ * getUTCMonth()
+ * getDate()
+ * getUTCDate()
+ * getDay()
+ * getUTCDay()
+ * getHours()
+ * getUTCHours()
+ * getMinutes()
+ * getUTCMinutes()
+ * getSeconds()
+ * getUTCSeconds()
+ * getMilliseconds()
+ * getUTCMilliseconds()
+ * getYear()
+ *
+ * Notes:
+ *
+ * - Date.prototype.getDate(): 'date' means day-of-month, and is
+ * zero-based in internal calculations but public API expects it to
+ * be one-based.
+ *
+ * - Date.prototype.getTime() and Date.prototype.valueOf() have identical
+ * behavior. They have separate function objects, but share the same C
+ * function (duk_bi_date_prototype_value_of).
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_shared(duk_hthread *thr) {
+ duk_small_uint_t flags_and_idx = duk__date_get_indirect_magic(thr);
+ return duk__get_part_helper(thr, flags_and_idx);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_hthread *thr) {
+ /*
+ * Return (t - LocalTime(t)) in minutes:
+ *
+ * t - LocalTime(t) = t - (t + LocalTZA + DaylightSavingTA(t))
+ * = -(LocalTZA + DaylightSavingTA(t))
+ *
+ * where DaylightSavingTA() is checked for time 't'.
+ *
+ * Note that the sign of the result is opposite to common usage,
+ * e.g. for EE(S)T which normally is +2h or +3h from UTC, this
+ * function returns -120 or -180.
+ *
+ */
+
+ duk_double_t d;
+ duk_int_t tzoffset;
+
+ /* Note: DST adjustment is determined using UTC time. */
+ d = duk__push_this_get_timeval(thr, 0 /*flags*/);
+ DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d));
+ if (DUK_ISNAN(d)) {
+ duk_push_nan(thr);
+ } else {
+ DUK_ASSERT(DUK_ISFINITE(d));
+ tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);
+ duk_push_int(thr, -tzoffset / 60);
+ }
+ return 1;
+}
+
+/*
+ * Setters.
+ *
+ * Setters are a bit more complicated than getters. Component setters
+ * break down the current time value into its (normalized) component
+ * parts, replace one or more components with -unnormalized- new values,
+ * and the components are then converted back into a time value. As an
+ * example of using unnormalized values:
+ *
+ * var d = new Date(1234567890);
+ *
+ * is equivalent to:
+ *
+ * var d = new Date(0);
+ * d.setUTCMilliseconds(1234567890);
+ *
+ * A shared native helper to provide almost all setters. Magic value
+ * contains a set of flags and also packs the "maxnargs" argument. The
+ * helper provides:
+ *
+ * setMilliseconds()
+ * setUTCMilliseconds()
+ * setSeconds()
+ * setUTCSeconds()
+ * setMinutes()
+ * setUTCMinutes()
+ * setHours()
+ * setUTCHours()
+ * setDate()
+ * setUTCDate()
+ * setMonth()
+ * setUTCMonth()
+ * setFullYear()
+ * setUTCFullYear()
+ * setYear()
+ *
+ * Notes:
+ *
+ * - Date.prototype.setYear() (Section B addition): special year check
+ * is omitted. NaN / Infinity will just flow through and ultimately
+ * result in a NaN internal time value.
+ *
+ * - Date.prototype.setYear() does not have optional arguments for
+ * setting month and day-in-month (like setFullYear()), but we indicate
+ * 'maxnargs' to be 3 to get the year written to the correct component
+ * index in duk__set_part_helper(). The function has nargs == 1, so only
+ * the year will be set regardless of actual argument count.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_shared(duk_hthread *thr) {
+ duk_small_uint_t flags_and_maxnargs = duk__date_get_indirect_magic(thr);
+ return duk__set_part_helper(thr, flags_and_maxnargs);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_time(duk_hthread *thr) {
+ duk_double_t d;
+
+ (void) duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ timeval this ] */
+ d = duk__timeclip(duk_to_number(thr, 0));
+ duk_push_number(thr, d);
+ duk_dup_top(thr);
+ duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE); /* -> [ timeval this timeval ] */
+
+ return 1;
+}
+
+#endif /* DUK_USE_DATE_BUILTIN */
+
+/* automatic undefs */
+#undef DUK__CF_ACCEPT
+#undef DUK__CF_ACCEPT_NUL
+#undef DUK__CF_NEG
+#undef DUK__DPRINT_DPARTS
+#undef DUK__DPRINT_PARTS
+#undef DUK__DPRINT_PARTS_AND_DPARTS
+#undef DUK__LOCAL_TZOFFSET_MAXITER
+#undef DUK__NUM_ISO8601_PARSER_PARTS
+#undef DUK__PACK_RULE
+#undef DUK__PI_DAY
+#undef DUK__PI_HOUR
+#undef DUK__PI_MILLISECOND
+#undef DUK__PI_MINUTE
+#undef DUK__PI_MONTH
+#undef DUK__PI_SECOND
+#undef DUK__PI_TZHOUR
+#undef DUK__PI_TZMINUTE
+#undef DUK__PI_YEAR
+#undef DUK__PM_DAY
+#undef DUK__PM_HOUR
+#undef DUK__PM_MILLISECOND
+#undef DUK__PM_MINUTE
+#undef DUK__PM_MONTH
+#undef DUK__PM_SECOND
+#undef DUK__PM_TZHOUR
+#undef DUK__PM_TZMINUTE
+#undef DUK__PM_YEAR
+#undef DUK__RULE_MASK_PART_SEP
+#undef DUK__SI_COLON
+#undef DUK__SI_MINUS
+#undef DUK__SI_NUL
+#undef DUK__SI_PERIOD
+#undef DUK__SI_PLUS
+#undef DUK__SI_SPACE
+#undef DUK__SI_T
+#undef DUK__SI_Z
+#undef DUK__SM_COLON
+#undef DUK__SM_MINUS
+#undef DUK__SM_NUL
+#undef DUK__SM_PERIOD
+#undef DUK__SM_PLUS
+#undef DUK__SM_SPACE
+#undef DUK__SM_T
+#undef DUK__SM_Z
+#undef DUK__UNPACK_RULE
+#undef DUK__WEEKDAY_MOD_ADDER
+#undef DUK__YEAR
+#line 1 "duk_bi_date_unix.c"
+/*
+ * Unix-like Date providers
+ *
+ * Generally useful Unix / POSIX / ANSI Date providers.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* The necessary #includes are in place in duk_config.h. */
+
+/* Buffer sizes for some UNIX calls. Larger than strictly necessary
+ * to avoid Valgrind errors.
+ */
+#define DUK__STRPTIME_BUF_SIZE 64
+#define DUK__STRFTIME_BUF_SIZE 64
+
+#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY)
+/* Get current Ecmascript time (= UNIX/Posix time, but in milliseconds). */
+DUK_INTERNAL duk_double_t duk_bi_date_get_now_gettimeofday(void) {
+ struct timeval tv;
+ duk_double_t d;
+
+ if (gettimeofday(&tv, NULL) != 0) {
+ DUK_D(DUK_DPRINT("gettimeofday() failed"));
+ return 0.0;
+ }
+
+ /* As of Duktape 2.2.0 allow fractions. */
+ d = ((duk_double_t) tv.tv_sec) * 1000.0 +
+ ((duk_double_t) tv.tv_usec) / 1000.0;
+
+ return d;
+}
+#endif /* DUK_USE_DATE_NOW_GETTIMEOFDAY */
+
+#if defined(DUK_USE_DATE_NOW_TIME)
+/* Not a very good provider: only full seconds are available. */
+DUK_INTERNAL duk_double_t duk_bi_date_get_now_time(void) {
+ time_t t;
+
+ t = time(NULL);
+ if (t == (time_t) -1) {
+ DUK_D(DUK_DPRINT("time() failed"));
+ return 0.0;
+ }
+ return ((duk_double_t) t) * 1000.0;
+}
+#endif /* DUK_USE_DATE_NOW_TIME */
+
+#if defined(DUK_USE_DATE_TZO_GMTIME) || defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S)
+/* Get local time offset (in seconds) for a certain (UTC) instant 'd'. */
+DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d) {
+ time_t t, t1, t2;
+ duk_int_t parts[DUK_DATE_IDX_NUM_PARTS];
+ duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];
+ struct tm tms[2];
+#if defined(DUK_USE_DATE_TZO_GMTIME)
+ struct tm *tm_ptr;
+#endif
+
+ /* For NaN/inf, the return value doesn't matter. */
+ if (!DUK_ISFINITE(d)) {
+ return 0;
+ }
+
+ /* If not within Ecmascript range, some integer time calculations
+ * won't work correctly (and some asserts will fail), so bail out
+ * if so. This fixes test-bug-date-insane-setyear.js. There is
+ * a +/- 24h leeway in this range check to avoid a test262 corner
+ * case documented in test-bug-date-timeval-edges.js.
+ */
+ if (!duk_bi_date_timeval_in_leeway_range(d)) {
+ DUK_DD(DUK_DDPRINT("timeval not within valid range, skip tzoffset computation to avoid integer overflows"));
+ return 0;
+ }
+
+ /*
+ * This is a bit tricky to implement portably. The result depends
+ * on the timestamp (specifically, DST depends on the timestamp).
+ * If e.g. UNIX APIs are used, they'll have portability issues with
+ * very small and very large years.
+ *
+ * Current approach:
+ *
+ * - Stay within portable UNIX limits by using equivalent year mapping.
+ * Avoid year 1970 and 2038 as some conversions start to fail, at
+ * least on some platforms. Avoiding 1970 means that there are
+ * currently DST discrepancies for 1970.
+ *
+ * - Create a UTC and local time breakdowns from 't'. Then create
+ * a time_t using gmtime() and localtime() and compute the time
+ * difference between the two.
+ *
+ * Equivalent year mapping (E5 Section 15.9.1.8):
+ *
+ * If the host environment provides functionality for determining
+ * daylight saving time, the implementation of ECMAScript is free
+ * to map the year in question to an equivalent year (same
+ * leap-year-ness and same starting week day for the year) for which
+ * the host environment provides daylight saving time information.
+ * The only restriction is that all equivalent years should produce
+ * the same result.
+ *
+ * This approach is quite reasonable but not entirely correct, e.g.
+ * the specification also states (E5 Section 15.9.1.8):
+ *
+ * The implementation of ECMAScript should not try to determine
+ * whether the exact time was subject to daylight saving time, but
+ * just whether daylight saving time would have been in effect if
+ * the _current daylight saving time algorithm_ had been used at the
+ * time. This avoids complications such as taking into account the
+ * years that the locale observed daylight saving time year round.
+ *
+ * Since we rely on the platform APIs for conversions between local
+ * time and UTC, we can't guarantee the above. Rather, if the platform
+ * has historical DST rules they will be applied. This seems to be the
+ * general preferred direction in Ecmascript standardization (or at least
+ * implementations) anyway, and even the equivalent year mapping should
+ * be disabled if the platform is known to handle DST properly for the
+ * full Ecmascript range.
+ *
+ * The following has useful discussion and links:
+ *
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=351066
+ */
+
+ duk_bi_date_timeval_to_parts(d, parts, dparts, DUK_DATE_FLAG_EQUIVYEAR /*flags*/);
+ DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= 1970 && parts[DUK_DATE_IDX_YEAR] <= 2038);
+
+ d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/);
+ DUK_ASSERT(d >= 0 && d < 2147483648.0 * 1000.0); /* unsigned 31-bit range */
+ t = (time_t) (d / 1000.0);
+ DUK_DDD(DUK_DDDPRINT("timeval: %lf -> time_t %ld", (double) d, (long) t));
+
+ DUK_MEMZERO((void *) tms, sizeof(struct tm) * 2);
+
+#if defined(DUK_USE_DATE_TZO_GMTIME_R)
+ (void) gmtime_r(&t, &tms[0]);
+ (void) localtime_r(&t, &tms[1]);
+#elif defined(DUK_USE_DATE_TZO_GMTIME_S)
+ (void) gmtime_s(&t, &tms[0]);
+ (void) localtime_s(&t, &tms[1]);
+#elif defined(DUK_USE_DATE_TZO_GMTIME)
+ tm_ptr = gmtime(&t);
+ DUK_MEMCPY((void *) &tms[0], tm_ptr, sizeof(struct tm));
+ tm_ptr = localtime(&t);
+ DUK_MEMCPY((void *) &tms[1], tm_ptr, sizeof(struct tm));
+#else
+#error internal error
+#endif
+ DUK_DDD(DUK_DDDPRINT("gmtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld,"
+ "wday:%ld,yday:%ld,isdst:%ld}",
+ (long) tms[0].tm_sec, (long) tms[0].tm_min, (long) tms[0].tm_hour,
+ (long) tms[0].tm_mday, (long) tms[0].tm_mon, (long) tms[0].tm_year,
+ (long) tms[0].tm_wday, (long) tms[0].tm_yday, (long) tms[0].tm_isdst));
+ DUK_DDD(DUK_DDDPRINT("localtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld,"
+ "wday:%ld,yday:%ld,isdst:%ld}",
+ (long) tms[1].tm_sec, (long) tms[1].tm_min, (long) tms[1].tm_hour,
+ (long) tms[1].tm_mday, (long) tms[1].tm_mon, (long) tms[1].tm_year,
+ (long) tms[1].tm_wday, (long) tms[1].tm_yday, (long) tms[1].tm_isdst));
+
+ /* tm_isdst is both an input and an output to mktime(), use 0 to
+ * avoid DST handling in mktime():
+ * - https://github.com/svaarala/duktape/issues/406
+ * - http://stackoverflow.com/questions/8558919/mktime-and-tm-isdst
+ */
+ tms[0].tm_isdst = 0;
+ tms[1].tm_isdst = 0;
+ t1 = mktime(&tms[0]); /* UTC */
+ t2 = mktime(&tms[1]); /* local */
+ if (t1 == (time_t) -1 || t2 == (time_t) -1) {
+ /* This check used to be for (t < 0) but on some platforms
+ * time_t is unsigned and apparently the proper way to detect
+ * an mktime() error return is the cast above. See e.g.:
+ * http://pubs.opengroup.org/onlinepubs/009695299/functions/mktime.html
+ */
+ goto mktime_error;
+ }
+ DUK_DDD(DUK_DDDPRINT("t1=%ld (utc), t2=%ld (local)", (long) t1, (long) t2));
+
+ /* Compute final offset in seconds, positive if local time ahead of
+ * UTC (returned value is UTC-to-local offset).
+ *
+ * difftime() returns a double, so coercion to int generates quite
+ * a lot of code. Direct subtraction is not portable, however.
+ * XXX: allow direct subtraction on known platforms.
+ */
+#if 0
+ return (duk_int_t) (t2 - t1);
+#endif
+ return (duk_int_t) difftime(t2, t1);
+
+ mktime_error:
+ /* XXX: return something more useful, so that caller can throw? */
+ DUK_D(DUK_DPRINT("mktime() failed, d=%lf", (double) d));
+ return 0;
+}
+#endif /* DUK_USE_DATE_TZO_GMTIME */
+
+#if defined(DUK_USE_DATE_PRS_STRPTIME)
+DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str) {
+ struct tm tm;
+ time_t t;
+ char buf[DUK__STRPTIME_BUF_SIZE];
+
+ /* Copy to buffer with slack to avoid Valgrind gripes from strptime. */
+ DUK_ASSERT(str != NULL);
+ DUK_MEMZERO(buf, sizeof(buf)); /* valgrind whine without this */
+ DUK_SNPRINTF(buf, sizeof(buf), "%s", (const char *) str);
+ buf[sizeof(buf) - 1] = (char) 0;
+
+ DUK_DDD(DUK_DDDPRINT("parsing: '%s'", (const char *) buf));
+
+ DUK_MEMZERO(&tm, sizeof(tm));
+ if (strptime((const char *) buf, "%c", &tm) != NULL) {
+ DUK_DDD(DUK_DDDPRINT("before mktime: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld,"
+ "wday:%ld,yday:%ld,isdst:%ld}",
+ (long) tm.tm_sec, (long) tm.tm_min, (long) tm.tm_hour,
+ (long) tm.tm_mday, (long) tm.tm_mon, (long) tm.tm_year,
+ (long) tm.tm_wday, (long) tm.tm_yday, (long) tm.tm_isdst));
+ tm.tm_isdst = -1; /* negative: dst info not available */
+
+ t = mktime(&tm);
+ DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t));
+ if (t >= 0) {
+ duk_push_number(thr, ((duk_double_t) t) * 1000.0);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+#endif /* DUK_USE_DATE_PRS_STRPTIME */
+
+#if defined(DUK_USE_DATE_PRS_GETDATE)
+DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str) {
+ struct tm tm;
+ duk_small_int_t rc;
+ time_t t;
+
+ /* For this to work, DATEMSK must be set, so this is not very
+ * convenient for an embeddable interpreter.
+ */
+
+ DUK_MEMZERO(&tm, sizeof(struct tm));
+ rc = (duk_small_int_t) getdate_r(str, &tm);
+ DUK_DDD(DUK_DDDPRINT("getdate_r() -> %ld", (long) rc));
+
+ if (rc == 0) {
+ t = mktime(&tm);
+ DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t));
+ if (t >= 0) {
+ duk_push_number(thr, (duk_double_t) t);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+#endif /* DUK_USE_DATE_PRS_GETDATE */
+
+#if defined(DUK_USE_DATE_FMT_STRFTIME)
+DUK_INTERNAL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags) {
+ char buf[DUK__STRFTIME_BUF_SIZE];
+ struct tm tm;
+ const char *fmt;
+
+ DUK_UNREF(tzoffset);
+
+ /* If the platform doesn't support the entire Ecmascript range, we need
+ * to return 0 so that the caller can fall back to the default formatter.
+ *
+ * For now, assume that if time_t is 8 bytes or more, the whole Ecmascript
+ * range is supported. For smaller time_t values (4 bytes in practice),
+ * assumes that the signed 32-bit range is supported.
+ *
+ * XXX: detect this more correctly per platform. The size of time_t is
+ * probably not an accurate guarantee of strftime() supporting or not
+ * supporting a large time range (the full Ecmascript range).
+ */
+ if (sizeof(time_t) < 8 &&
+ (parts[DUK_DATE_IDX_YEAR] < 1970 || parts[DUK_DATE_IDX_YEAR] > 2037)) {
+ /* be paranoid for 32-bit time values (even avoiding negative ones) */
+ return 0;
+ }
+
+ DUK_MEMZERO(&tm, sizeof(tm));
+ tm.tm_sec = parts[DUK_DATE_IDX_SECOND];
+ tm.tm_min = parts[DUK_DATE_IDX_MINUTE];
+ tm.tm_hour = parts[DUK_DATE_IDX_HOUR];
+ tm.tm_mday = parts[DUK_DATE_IDX_DAY]; /* already one-based */
+ tm.tm_mon = parts[DUK_DATE_IDX_MONTH] - 1; /* one-based -> zero-based */
+ tm.tm_year = parts[DUK_DATE_IDX_YEAR] - 1900;
+ tm.tm_wday = parts[DUK_DATE_IDX_WEEKDAY];
+ tm.tm_isdst = 0;
+
+ DUK_MEMZERO(buf, sizeof(buf));
+ if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) {
+ fmt = "%c";
+ } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) {
+ fmt = "%x";
+ } else {
+ DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME);
+ fmt = "%X";
+ }
+ (void) strftime(buf, sizeof(buf) - 1, fmt, &tm);
+ DUK_ASSERT(buf[sizeof(buf) - 1] == 0);
+
+ duk_push_string(thr, buf);
+ return 1;
+}
+#endif /* DUK_USE_DATE_FMT_STRFTIME */
+
+#if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME)
+DUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void) {
+ struct timespec ts;
+
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
+ return (duk_double_t) ts.tv_sec * 1000.0 + (duk_double_t) ts.tv_nsec / 1000000.0;
+ } else {
+ DUK_D(DUK_DPRINT("clock_gettime(CLOCK_MONOTONIC) failed"));
+ return 0.0;
+ }
+}
+#endif
+
+/* automatic undefs */
+#undef DUK__STRFTIME_BUF_SIZE
+#undef DUK__STRPTIME_BUF_SIZE
+#line 1 "duk_bi_date_windows.c"
+/*
+ * Windows Date providers
+ *
+ * Platform specific links:
+ *
+ * - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473(v=vs.85).aspx
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* The necessary #includes are in place in duk_config.h. */
+
+#if defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS)
+/* Shared Windows helpers. */
+DUK_LOCAL void duk__convert_systime_to_ularge(const SYSTEMTIME *st, ULARGE_INTEGER *res) {
+ FILETIME ft;
+ if (SystemTimeToFileTime(st, &ft) == 0) {
+ DUK_D(DUK_DPRINT("SystemTimeToFileTime() failed, returning 0"));
+ res->QuadPart = 0;
+ } else {
+ res->LowPart = ft.dwLowDateTime;
+ res->HighPart = ft.dwHighDateTime;
+ }
+}
+
+DUK_LOCAL void duk__convert_filetime_to_ularge(const FILETIME *ft, ULARGE_INTEGER *res) {
+ res->LowPart = ft->dwLowDateTime;
+ res->HighPart = ft->dwHighDateTime;
+}
+
+DUK_LOCAL void duk__set_systime_jan1970(SYSTEMTIME *st) {
+ DUK_MEMZERO((void *) st, sizeof(*st));
+ st->wYear = 1970;
+ st->wMonth = 1;
+ st->wDayOfWeek = 4; /* not sure whether or not needed; Thursday */
+ st->wDay = 1;
+ DUK_ASSERT(st->wHour == 0);
+ DUK_ASSERT(st->wMinute == 0);
+ DUK_ASSERT(st->wSecond == 0);
+ DUK_ASSERT(st->wMilliseconds == 0);
+}
+#endif /* defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) */
+
+#if defined(DUK_USE_DATE_NOW_WINDOWS)
+DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows(void) {
+ /* Suggested step-by-step method from documentation of RtlTimeToSecondsSince1970:
+ * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724928(v=vs.85).aspx
+ */
+ SYSTEMTIME st1, st2;
+ ULARGE_INTEGER tmp1, tmp2;
+
+ GetSystemTime(&st1);
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1);
+
+ duk__set_systime_jan1970(&st2);
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2);
+
+ /* Difference is in 100ns units, convert to milliseconds, keeping
+ * fractions since Duktape 2.2.0. This is only theoretical because
+ * SYSTEMTIME is limited to milliseconds.
+ */
+ return (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0;
+}
+#endif /* DUK_USE_DATE_NOW_WINDOWS */
+
+#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS)
+DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows_subms(void) {
+ /* Variant of the basic algorithm using GetSystemTimePreciseAsFileTime()
+ * for more accuracy.
+ */
+ FILETIME ft1;
+ SYSTEMTIME st2;
+ ULARGE_INTEGER tmp1, tmp2;
+
+ GetSystemTimePreciseAsFileTime(&ft1);
+ duk__convert_filetime_to_ularge((const FILETIME *) &ft1, &tmp1);
+
+ duk__set_systime_jan1970(&st2);
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2);
+
+ /* Difference is in 100ns units, convert to milliseconds, keeping
+ * fractions since Duktape 2.2.0.
+ */
+ return (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0;
+}
+#endif /* DUK_USE_DATE_NOW_WINDOWS */
+
+#if defined(DUK_USE_DATE_TZO_WINDOWS)
+DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d) {
+ SYSTEMTIME st1;
+ SYSTEMTIME st2;
+ SYSTEMTIME st3;
+ ULARGE_INTEGER tmp1;
+ ULARGE_INTEGER tmp2;
+ ULARGE_INTEGER tmp3;
+ FILETIME ft1;
+
+ /* XXX: handling of timestamps outside Windows supported range.
+ * How does Windows deal with dates before 1600? Does windows
+ * support all Ecmascript years (like -200000 and +200000)?
+ * Should equivalent year mapping be used here too? If so, use
+ * a shared helper (currently integrated into timeval-to-parts).
+ */
+
+ /* Use the approach described in "Remarks" of FileTimeToLocalFileTime:
+ * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724277(v=vs.85).aspx
+ */
+
+ duk__set_systime_jan1970(&st1);
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1);
+ tmp2.QuadPart = (ULONGLONG) (d * 10000.0); /* millisec -> 100ns units since jan 1, 1970 */
+ tmp2.QuadPart += tmp1.QuadPart; /* input 'd' in Windows UTC, 100ns units */
+
+ ft1.dwLowDateTime = tmp2.LowPart;
+ ft1.dwHighDateTime = tmp2.HighPart;
+ FileTimeToSystemTime((const FILETIME *) &ft1, &st2);
+ if (SystemTimeToTzSpecificLocalTime((LPTIME_ZONE_INFORMATION) NULL, &st2, &st3) == 0) {
+ DUK_D(DUK_DPRINT("SystemTimeToTzSpecificLocalTime() failed, return tzoffset 0"));
+ return 0;
+ }
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st3, &tmp3);
+
+ /* Positive if local time ahead of UTC. */
+ return (duk_int_t) (((LONGLONG) tmp3.QuadPart - (LONGLONG) tmp2.QuadPart) / DUK_I64_CONSTANT(10000000)); /* seconds */
+}
+#endif /* DUK_USE_DATE_TZO_WINDOWS */
+
+#if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST)
+DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d) {
+ SYSTEMTIME st1;
+ SYSTEMTIME st2;
+ FILETIME ft1;
+ FILETIME ft2;
+ ULARGE_INTEGER tmp1;
+ ULARGE_INTEGER tmp2;
+
+ /* Do a similar computation to duk_bi_date_get_local_tzoffset_windows
+ * but without accounting for daylight savings time. Use this on
+ * Windows platforms (like Durango) that don't support the
+ * SystemTimeToTzSpecificLocalTime() call.
+ */
+
+ /* current time not needed for this computation */
+ DUK_UNREF(d);
+
+ duk__set_systime_jan1970(&st1);
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1);
+
+ ft1.dwLowDateTime = tmp1.LowPart;
+ ft1.dwHighDateTime = tmp1.HighPart;
+ FileTimeToLocalFileTime((const FILETIME *) &ft1, &ft2);
+
+ FileTimeToSystemTime((const FILETIME *) &ft2, &st2);
+ duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2);
+
+ return (duk_int_t) (((LONGLONG) tmp2.QuadPart - (LONGLONG) tmp1.QuadPart) / DUK_I64_CONSTANT(10000000)); /* seconds */
+}
+#endif /* DUK_USE_DATE_TZO_WINDOWS_NO_DST */
+
+#if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC)
+DUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void) {
+ LARGE_INTEGER count, freq;
+
+ /* There are legacy issues with QueryPerformanceCounter():
+ * - Potential jumps: https://support.microsoft.com/en-us/help/274323/performance-counter-value-may-unexpectedly-leap-forward
+ * - Differences between cores (XP): https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions
+ *
+ * We avoid these by enabling QPC by default only for Vista or later.
+ */
+
+ if (QueryPerformanceCounter(&count) && QueryPerformanceFrequency(&freq)) {
+ /* XXX: QueryPerformanceFrequency() can be cached */
+ return (duk_double_t) count.QuadPart / (duk_double_t) freq.QuadPart * 1000.0;
+ } else {
+ /* MSDN: "On systems that run Windows XP or later, the function
+ * will always succeed and will thus never return zero."
+ * Provide minimal error path just in case user enables this
+ * feature in pre-XP Windows.
+ */
+ return 0.0;
+ }
+}
+#endif /* DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC */
+#line 1 "duk_bi_duktape.c"
+/*
+ * Duktape built-ins
+ *
+ * Size optimization note: it might seem that vararg multipurpose functions
+ * like fin(), enc(), and dec() are not very size optimal, but using a single
+ * user-visible Ecmascript function saves a lot of run-time footprint; each
+ * Function instance takes >100 bytes. Using a shared native helper and a
+ * 'magic' value won't save much if there are multiple Function instances
+ * anyway.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_DUKTAPE_BUILTIN)
+
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_info(duk_hthread *thr) {
+ duk_inspect_value(thr, -1);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_act(duk_hthread *thr) {
+ duk_int_t level;
+
+ level = duk_to_int(thr, 0);
+ duk_inspect_callstack_entry(thr, level);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_gc(duk_hthread *thr) {
+ duk_small_uint_t flags;
+
+ flags = (duk_small_uint_t) duk_get_uint(thr, 0);
+ duk_heap_mark_and_sweep(thr->heap, flags);
+
+ /* XXX: Not sure what the best return value would be in the API.
+ * Return true for now.
+ */
+ duk_push_true(thr);
+ return 1;
+}
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_fin(duk_hthread *thr) {
+ (void) duk_require_hobject(thr, 0);
+ if (duk_get_top(thr) >= 2) {
+ /* Set: currently a finalizer is disabled by setting it to
+ * undefined; this does not remove the property at the moment.
+ * The value could be type checked to be either a function
+ * or something else; if something else, the property could
+ * be deleted. Must use duk_set_finalizer() to keep
+ * DUK_HOBJECT_FLAG_HAVE_FINALIZER in sync.
+ */
+ duk_set_top(thr, 2);
+ duk_set_finalizer(thr, 0);
+ return 0;
+ } else {
+ /* Get. */
+ DUK_ASSERT(duk_get_top(thr) == 1);
+ duk_get_finalizer(thr, 0);
+ return 1;
+ }
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_enc(duk_hthread *thr) {
+ duk_hstring *h_str;
+
+ /* Vararg function: must be careful to check/require arguments.
+ * The JSON helpers accept invalid indices and treat them like
+ * non-existent optional parameters.
+ */
+
+ h_str = duk_require_hstring(thr, 0); /* Could reject symbols, but no point: won't match comparisons. */
+ duk_require_valid_index(thr, 1);
+
+ if (h_str == DUK_HTHREAD_STRING_HEX(thr)) {
+ duk_set_top(thr, 2);
+ duk_hex_encode(thr, 1);
+ DUK_ASSERT_TOP(thr, 2);
+ } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) {
+ duk_set_top(thr, 2);
+ duk_base64_encode(thr, 1);
+ DUK_ASSERT_TOP(thr, 2);
+#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX)
+ } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) {
+ duk_bi_json_stringify_helper(thr,
+ 1 /*idx_value*/,
+ 2 /*idx_replacer*/,
+ 3 /*idx_space*/,
+ DUK_JSON_FLAG_EXT_CUSTOM |
+ DUK_JSON_FLAG_ASCII_ONLY |
+ DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/);
+#endif
+#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC)
+ } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) {
+ duk_bi_json_stringify_helper(thr,
+ 1 /*idx_value*/,
+ 2 /*idx_replacer*/,
+ 3 /*idx_space*/,
+ DUK_JSON_FLAG_EXT_COMPATIBLE |
+ DUK_JSON_FLAG_ASCII_ONLY /*flags*/);
+#endif
+ } else {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_dec(duk_hthread *thr) {
+ duk_hstring *h_str;
+
+ /* Vararg function: must be careful to check/require arguments.
+ * The JSON helpers accept invalid indices and treat them like
+ * non-existent optional parameters.
+ */
+
+ h_str = duk_require_hstring(thr, 0); /* Could reject symbols, but no point: won't match comparisons */
+ duk_require_valid_index(thr, 1);
+
+ if (h_str == DUK_HTHREAD_STRING_HEX(thr)) {
+ duk_set_top(thr, 2);
+ duk_hex_decode(thr, 1);
+ DUK_ASSERT_TOP(thr, 2);
+ } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) {
+ duk_set_top(thr, 2);
+ duk_base64_decode(thr, 1);
+ DUK_ASSERT_TOP(thr, 2);
+#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX)
+ } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) {
+ duk_bi_json_parse_helper(thr,
+ 1 /*idx_value*/,
+ 2 /*idx_replacer*/,
+ DUK_JSON_FLAG_EXT_CUSTOM /*flags*/);
+#endif
+#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC)
+ } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) {
+ duk_bi_json_parse_helper(thr,
+ 1 /*idx_value*/,
+ 2 /*idx_replacer*/,
+ DUK_JSON_FLAG_EXT_COMPATIBLE /*flags*/);
+#endif
+ } else {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+ return 1;
+}
+
+/*
+ * Compact an object
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_duktape_object_compact(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 1);
+ duk_compact(thr, 0);
+ return 1; /* return the argument object */
+}
+
+#endif /* DUK_USE_DUKTAPE_BUILTIN */
+#line 1 "duk_bi_encoding.c"
+/*
+ * WHATWG Encoding API built-ins
+ *
+ * API specification: https://encoding.spec.whatwg.org/#api
+ * Web IDL: https://www.w3.org/TR/WebIDL/
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Data structures for encoding/decoding
+ */
+
+typedef struct {
+ duk_uint8_t *out; /* where to write next byte(s) */
+ duk_codepoint_t lead; /* lead surrogate */
+} duk__encode_context;
+
+typedef struct {
+ /* UTF-8 decoding state */
+ duk_codepoint_t codepoint; /* built up incrementally */
+ duk_uint8_t upper; /* max value of next byte (decode error otherwise) */
+ duk_uint8_t lower; /* min value of next byte (ditto) */
+ duk_uint8_t needed; /* how many more bytes we need */
+ duk_uint8_t bom_handled; /* BOM seen or no longer expected */
+
+ /* Decoder configuration */
+ duk_uint8_t fatal;
+ duk_uint8_t ignore_bom;
+} duk__decode_context;
+
+/* The signed duk_codepoint_t type is used to signal a decoded codepoint
+ * (>= 0) or various other states using negative values.
+ */
+#define DUK__CP_CONTINUE (-1) /* continue to next byte, no completed codepoint */
+#define DUK__CP_ERROR (-2) /* decoding error */
+#define DUK__CP_RETRY (-3) /* decoding error; retry last byte */
+
+/*
+ * Raw helpers for encoding/decoding
+ */
+
+/* Emit UTF-8 (= CESU-8) encoded U+FFFD (replacement char), i.e. ef bf bd. */
+DUK_LOCAL duk_uint8_t *duk__utf8_emit_repl(duk_uint8_t *ptr) {
+ *ptr++ = 0xef;
+ *ptr++ = 0xbf;
+ *ptr++ = 0xbd;
+ return ptr;
+}
+
+DUK_LOCAL void duk__utf8_decode_init(duk__decode_context *dec_ctx) {
+ /* (Re)init the decoding state of 'dec_ctx' but leave decoder
+ * configuration fields untouched.
+ */
+ dec_ctx->codepoint = 0x0000L;
+ dec_ctx->upper = 0xbf;
+ dec_ctx->lower = 0x80;
+ dec_ctx->needed = 0;
+ dec_ctx->bom_handled = 0;
+}
+
+DUK_LOCAL duk_codepoint_t duk__utf8_decode_next(duk__decode_context *dec_ctx, duk_uint8_t x) {
+ /*
+ * UTF-8 algorithm based on the Encoding specification:
+ * https://encoding.spec.whatwg.org/#utf-8-decoder
+ *
+ * Two main states: decoding initial byte vs. decoding continuation
+ * bytes. Shortest length encoding is validated by restricting the
+ * allowed range of first continuation byte using 'lower' and 'upper'.
+ */
+
+ if (dec_ctx->needed == 0) {
+ /* process initial byte */
+ if (x <= 0x7f) {
+ /* U+0000-U+007F, 1 byte (ASCII) */
+ return (duk_codepoint_t) x;
+ } else if (x >= 0xc2 && x <= 0xdf) {
+ /* U+0080-U+07FF, 2 bytes */
+ dec_ctx->needed = 1;
+ dec_ctx->codepoint = x & 0x1f;
+ DUK_ASSERT(dec_ctx->lower == 0x80);
+ DUK_ASSERT(dec_ctx->upper == 0xbf);
+ return DUK__CP_CONTINUE;
+ } else if (x >= 0xe0 && x <= 0xef) {
+ /* U+0800-U+FFFF, 3 bytes */
+ if (x == 0xe0) {
+ dec_ctx->lower = 0xa0;
+ DUK_ASSERT(dec_ctx->upper == 0xbf);
+ } else if (x == 0xed) {
+ DUK_ASSERT(dec_ctx->lower == 0x80);
+ dec_ctx->upper = 0x9f;
+ }
+ dec_ctx->needed = 2;
+ dec_ctx->codepoint = x & 0x0f;
+ return DUK__CP_CONTINUE;
+ } else if (x >= 0xf0 && x <= 0xf4) {
+ /* U+010000-U+10FFFF, 4 bytes */
+ if (x == 0xf0) {
+ dec_ctx->lower = 0x90;
+ DUK_ASSERT(dec_ctx->upper == 0xbf);
+ } else if (x == 0xf4) {
+ DUK_ASSERT(dec_ctx->lower == 0x80);
+ dec_ctx->upper = 0x8f;
+ }
+ dec_ctx->needed = 3;
+ dec_ctx->codepoint = x & 0x07;
+ return DUK__CP_CONTINUE;
+ } else {
+ /* not a legal initial byte */
+ return DUK__CP_ERROR;
+ }
+ } else {
+ /* process continuation byte */
+ if (x >= dec_ctx->lower && x <= dec_ctx->upper) {
+ dec_ctx->lower = 0x80;
+ dec_ctx->upper = 0xbf;
+ dec_ctx->codepoint = (dec_ctx->codepoint << 6) | (x & 0x3f);
+ if (--dec_ctx->needed > 0) {
+ /* need more bytes */
+ return DUK__CP_CONTINUE;
+ } else {
+ /* got a codepoint */
+ duk_codepoint_t ret;
+ DUK_ASSERT(dec_ctx->codepoint <= 0x10ffffL); /* Decoding rules guarantee. */
+ ret = dec_ctx->codepoint;
+ dec_ctx->codepoint = 0x0000L;
+ dec_ctx->needed = 0;
+ return ret;
+ }
+ } else {
+ /* We just encountered an illegal UTF-8 continuation byte. This might
+ * be the initial byte of the next character; if we return a plain
+ * error status and the decoder is in replacement mode, the character
+ * will be masked. We still need to alert the caller to the error
+ * though.
+ */
+ dec_ctx->codepoint = 0x0000L;
+ dec_ctx->needed = 0;
+ dec_ctx->lower = 0x80;
+ dec_ctx->upper = 0xbf;
+ return DUK__CP_RETRY;
+ }
+ }
+}
+
+#if defined(DUK_USE_ENCODING_BUILTINS)
+DUK_LOCAL void duk__utf8_encode_char(void *udata, duk_codepoint_t codepoint) {
+ duk__encode_context *enc_ctx;
+
+ DUK_ASSERT(codepoint >= 0);
+ enc_ctx = (duk__encode_context *) udata;
+ DUK_ASSERT(enc_ctx != NULL);
+
+#if !defined(DUK_USE_PREFER_SIZE)
+ if (codepoint <= 0x7f && enc_ctx->lead == 0x0000L) {
+ /* Fast path for ASCII. */
+ *enc_ctx->out++ = (duk_uint8_t) codepoint;
+ return;
+ }
+#endif
+
+ if (DUK_UNLIKELY(codepoint > 0x10ffffL)) {
+ /* cannot legally encode in UTF-8 */
+ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;
+ } else if (codepoint >= 0xd800L && codepoint <= 0xdfffL) {
+ if (codepoint <= 0xdbffL) {
+ /* high surrogate */
+ duk_codepoint_t prev_lead = enc_ctx->lead;
+ enc_ctx->lead = codepoint;
+ if (prev_lead == 0x0000L) {
+ /* high surrogate, no output */
+ return;
+ } else {
+ /* consecutive high surrogates, consider first one unpaired */
+ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;
+ }
+ } else {
+ /* low surrogate */
+ if (enc_ctx->lead != 0x0000L) {
+ codepoint = (duk_codepoint_t) (0x010000L + ((enc_ctx->lead - 0xd800L) << 10) + (codepoint - 0xdc00L));
+ enc_ctx->lead = 0x0000L;
+ } else {
+ /* unpaired low surrogate */
+ DUK_ASSERT(enc_ctx->lead == 0x0000L);
+ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;
+ }
+ }
+ } else {
+ if (enc_ctx->lead != 0x0000L) {
+ /* unpaired high surrogate: emit replacement character and the input codepoint */
+ enc_ctx->lead = 0x0000L;
+ enc_ctx->out = duk__utf8_emit_repl(enc_ctx->out);
+ }
+ }
+
+ /* Codepoint may be original input, a decoded surrogate pair, or may
+ * have been replaced with U+FFFD.
+ */
+ enc_ctx->out += duk_unicode_encode_xutf8((duk_ucodepoint_t) codepoint, enc_ctx->out);
+}
+#endif /* DUK_USE_ENCODING_BUILTINS */
+
+/* Shared helper for buffer-to-string using a TextDecoder() compatible UTF-8
+ * decoder.
+ */
+DUK_LOCAL duk_ret_t duk__decode_helper(duk_hthread *thr, duk__decode_context *dec_ctx) {
+ const duk_uint8_t *input;
+ duk_size_t len = 0;
+ duk_size_t len_tmp;
+ duk_bool_t stream = 0;
+ duk_codepoint_t codepoint;
+ duk_uint8_t *output;
+ const duk_uint8_t *in;
+ duk_uint8_t *out;
+
+ DUK_ASSERT(dec_ctx != NULL);
+
+ /* Careful with input buffer pointer: any side effects involving
+ * code execution (e.g. getters, coercion calls, and finalizers)
+ * may cause a resize and invalidate a pointer we've read. This
+ * is why the pointer is actually looked up at the last minute.
+ * Argument validation must still happen first to match WHATWG
+ * required side effect order.
+ */
+
+ if (duk_is_undefined(thr, 0)) {
+ duk_push_fixed_buffer_nozero(thr, 0);
+ duk_replace(thr, 0);
+ }
+ (void) duk_require_buffer_data(thr, 0, &len); /* Need 'len', avoid pointer. */
+
+ if (duk_check_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_NULL |
+ DUK_TYPE_MASK_NONE)) {
+ /* Use defaults, treat missing value like undefined. */
+ } else {
+ duk_require_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_NULL |
+ DUK_TYPE_MASK_LIGHTFUNC |
+ DUK_TYPE_MASK_BUFFER |
+ DUK_TYPE_MASK_OBJECT);
+ if (duk_get_prop_string(thr, 1, "stream")) {
+ stream = duk_to_boolean(thr, -1);
+ }
+ }
+
+ /* Allowance is 3*len in the general case because all bytes may potentially
+ * become U+FFFD. If the first byte completes a non-BMP codepoint it will
+ * decode to a CESU-8 surrogate pair (6 bytes) so we allow 3 extra bytes to
+ * compensate: (1*3)+3 = 6. Non-BMP codepoints are safe otherwise because
+ * the 4->6 expansion is well under the 3x allowance.
+ *
+ * XXX: As with TextEncoder, need a better buffer allocation strategy here.
+ */
+ if (len >= (DUK_HBUFFER_MAX_BYTELEN / 3) - 3) {
+ DUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG);
+ }
+ output = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, 3 + (3 * len)); /* used parts will be always manually written over */
+
+ input = (const duk_uint8_t *) duk_get_buffer_data(thr, 0, &len_tmp);
+ DUK_ASSERT(input != NULL || len == 0);
+ if (DUK_UNLIKELY(len != len_tmp)) {
+ /* Very unlikely but possible: source buffer was resized by
+ * a side effect when fixed buffer was pushed. Output buffer
+ * may not be large enough to hold output, so just fail if
+ * length has changed.
+ */
+ DUK_D(DUK_DPRINT("input buffer resized by side effect, fail"));
+ goto fail_type;
+ }
+
+ /* From this point onwards it's critical that no side effect occur
+ * which may disturb 'input': finalizer execution, property accesses,
+ * active coercions, etc. Even an allocation related mark-and-sweep
+ * may affect the pointer because it may trigger a pending finalizer.
+ */
+
+ in = input;
+ out = output;
+ while (in < input + len) {
+ codepoint = duk__utf8_decode_next(dec_ctx, *in++);
+ if (codepoint < 0) {
+ if (codepoint == DUK__CP_CONTINUE) {
+ continue;
+ }
+
+ /* Decoding error with or without retry. */
+ DUK_ASSERT(codepoint == DUK__CP_ERROR || codepoint == DUK__CP_RETRY);
+ if (codepoint == DUK__CP_RETRY) {
+ --in; /* retry last byte */
+ }
+ /* replacement mode: replace with U+FFFD */
+ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;
+ if (dec_ctx->fatal) {
+ /* fatal mode: throw a TypeError */
+ goto fail_type;
+ }
+ /* Continue with 'codepoint', Unicode replacement. */
+ }
+ DUK_ASSERT(codepoint >= 0x0000L && codepoint <= 0x10ffffL);
+
+ if (!dec_ctx->bom_handled) {
+ dec_ctx->bom_handled = 1;
+ if (codepoint == 0xfeffL && !dec_ctx->ignore_bom) {
+ continue;
+ }
+ }
+
+ out += duk_unicode_encode_cesu8((duk_ucodepoint_t) codepoint, out);
+ DUK_ASSERT(out <= output + (3 + (3 * len)));
+ }
+
+ if (!stream) {
+ if (dec_ctx->needed != 0) {
+ /* truncated sequence at end of buffer */
+ if (dec_ctx->fatal) {
+ goto fail_type;
+ } else {
+ out += duk_unicode_encode_cesu8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, out);
+ DUK_ASSERT(out <= output + (3 + (3 * len)));
+ }
+ }
+ duk__utf8_decode_init(dec_ctx); /* Initialize decoding state for potential reuse. */
+ }
+
+ /* Output buffer is fixed and thus stable even if there had been
+ * side effects (which there shouldn't be).
+ */
+ duk_push_lstring(thr, (const char *) output, (duk_size_t) (out - output));
+ return 1;
+
+ fail_type:
+ DUK_ERROR_TYPE(thr, DUK_STR_UTF8_DECODE_FAILED);
+ DUK_UNREACHABLE();
+}
+
+/*
+ * Built-in bindings
+ */
+
+#if defined(DUK_USE_ENCODING_BUILTINS)
+DUK_INTERNAL duk_ret_t duk_bi_textencoder_constructor(duk_hthread *thr) {
+ /* TextEncoder currently requires no persistent state, so the constructor
+ * does nothing on purpose.
+ */
+
+ duk_require_constructor_call(thr);
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_hthread *thr) {
+ duk_push_string(thr, "utf-8");
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encode(duk_hthread *thr) {
+ duk__encode_context enc_ctx;
+ duk_size_t len;
+ duk_size_t final_len;
+ duk_uint8_t *output;
+
+ DUK_ASSERT_TOP(thr, 1);
+ if (duk_is_undefined(thr, 0)) {
+ len = 0;
+ } else {
+ duk_hstring *h_input;
+
+ h_input = duk_to_hstring(thr, 0);
+ DUK_ASSERT(h_input != NULL);
+
+ len = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_input);
+ if (len >= DUK_HBUFFER_MAX_BYTELEN / 3) {
+ DUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG);
+ }
+ }
+
+ /* Allowance is 3*len because all bytes can potentially be replaced with
+ * U+FFFD -- which rather inconveniently encodes to 3 bytes in UTF-8.
+ * Rely on dynamic buffer data pointer stability: no other code has
+ * access to the data pointer.
+ *
+ * XXX: The buffer allocation strategy used here is rather inefficient.
+ * Maybe switch to a chunk-based strategy, or preprocess the string to
+ * figure out the space needed ahead of time?
+ */
+ DUK_ASSERT(3 * len >= len);
+ output = (duk_uint8_t *) duk_push_dynamic_buffer(thr, 3 * len);
+
+ if (len > 0) {
+ DUK_ASSERT(duk_is_string(thr, 0)); /* True if len > 0. */
+
+ /* XXX: duk_decode_string() is used to process the input
+ * string. For standard Ecmascript strings, represented
+ * internally as CESU-8, this is fine. However, behavior
+ * beyond CESU-8 is not very strict: codepoints using an
+ * extended form of UTF-8 are also accepted, and invalid
+ * codepoint sequences (which are allowed in Duktape strings)
+ * are not handled as well as they could (e.g. invalid
+ * continuation bytes may mask following codepoints).
+ * This is how Ecmascript code would also see such strings.
+ * Maybe replace duk_decode_string() with an explicit strict
+ * CESU-8 decoder here?
+ */
+ enc_ctx.lead = 0x0000L;
+ enc_ctx.out = output;
+ duk_decode_string(thr, 0, duk__utf8_encode_char, (void *) &enc_ctx);
+ if (enc_ctx.lead != 0x0000L) {
+ /* unpaired high surrogate at end of string */
+ enc_ctx.out = duk__utf8_emit_repl(enc_ctx.out);
+ DUK_ASSERT(enc_ctx.out <= output + (3 * len));
+ }
+
+ /* The output buffer is usually very much oversized, so shrink it to
+ * actually needed size. Pointer stability assumed up to this point.
+ */
+ DUK_ASSERT_TOP(thr, 2);
+ DUK_ASSERT(output == (duk_uint8_t *) duk_get_buffer_data(thr, -1, NULL));
+
+ final_len = (duk_size_t) (enc_ctx.out - output);
+ duk_resize_buffer(thr, -1, final_len);
+ /* 'output' and 'enc_ctx.out' are potentially invalidated by the resize. */
+ } else {
+ final_len = 0;
+ }
+
+ /* Standard WHATWG output is a Uint8Array. Here the Uint8Array will
+ * be backed by a dynamic buffer which differs from e.g. Uint8Arrays
+ * created as 'new Uint8Array(N)'. Ecmascript code won't see the
+ * difference but C code will. When bufferobjects are not supported,
+ * returns a plain dynamic buffer.
+ */
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ duk_push_buffer_object(thr, -1, 0, final_len, DUK_BUFOBJ_UINT8ARRAY);
+#endif
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_textdecoder_constructor(duk_hthread *thr) {
+ duk__decode_context *dec_ctx;
+ duk_bool_t fatal = 0;
+ duk_bool_t ignore_bom = 0;
+
+ DUK_ASSERT_TOP(thr, 2);
+ duk_require_constructor_call(thr);
+ if (!duk_is_undefined(thr, 0)) {
+ /* XXX: For now ignore 'label' (encoding identifier). */
+ duk_to_string(thr, 0);
+ }
+ if (!duk_is_null_or_undefined(thr, 1)) {
+ if (duk_get_prop_string(thr, 1, "fatal")) {
+ fatal = duk_to_boolean(thr, -1);
+ }
+ if (duk_get_prop_string(thr, 1, "ignoreBOM")) {
+ ignore_bom = duk_to_boolean(thr, -1);
+ }
+ }
+
+ duk_push_this(thr);
+
+ /* The decode context is not assumed to be zeroed; all fields are
+ * initialized explicitly.
+ */
+ dec_ctx = (duk__decode_context *) duk_push_fixed_buffer(thr, sizeof(duk__decode_context));
+ dec_ctx->fatal = (duk_uint8_t) fatal;
+ dec_ctx->ignore_bom = (duk_uint8_t) ignore_bom;
+ duk__utf8_decode_init(dec_ctx); /* Initializes remaining fields. */
+
+ duk_put_prop_string(thr, -2, DUK_INTERNAL_SYMBOL("Context"));
+ return 0;
+}
+
+/* Get TextDecoder context from 'this'; leaves garbage on stack. */
+DUK_LOCAL duk__decode_context *duk__get_textdecoder_context(duk_hthread *thr) {
+ duk__decode_context *dec_ctx;
+ duk_push_this(thr);
+ duk_get_prop_string(thr, -1, DUK_INTERNAL_SYMBOL("Context"));
+ dec_ctx = (duk__decode_context *) duk_require_buffer(thr, -1, NULL);
+ DUK_ASSERT(dec_ctx != NULL);
+ return dec_ctx;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_hthread *thr) {
+ duk__decode_context *dec_ctx;
+ duk_int_t magic;
+
+ dec_ctx = duk__get_textdecoder_context(thr);
+ magic = duk_get_current_magic(thr);
+ switch (magic) {
+ case 0:
+ /* Encoding is now fixed, so _Context lookup is only needed to
+ * validate the 'this' binding (TypeError if not TextDecoder-like).
+ */
+ duk_push_string(thr, "utf-8");
+ break;
+ case 1:
+ duk_push_boolean(thr, dec_ctx->fatal);
+ break;
+ default:
+ duk_push_boolean(thr, dec_ctx->ignore_bom);
+ break;
+ }
+
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_hthread *thr) {
+ duk__decode_context *dec_ctx;
+
+ dec_ctx = duk__get_textdecoder_context(thr);
+ return duk__decode_helper(thr, dec_ctx);
+}
+#endif /* DUK_USE_ENCODING_BUILTINS */
+
+/*
+ * Internal helper for Node.js Buffer
+ */
+
+/* Internal helper used for Node.js Buffer .toString(). Value stack convention
+ * is currently odd: it mimics TextDecoder .decode() so that argument must be at
+ * index 0, and decode options (not present for Buffer) at index 1. Return value
+ * is a Duktape/C function return value.
+ */
+DUK_INTERNAL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr) {
+ duk__decode_context dec_ctx;
+
+ dec_ctx.fatal = 0; /* use replacement chars */
+ dec_ctx.ignore_bom = 1; /* ignore BOMs (matches Node.js Buffer .toString()) */
+ duk__utf8_decode_init(&dec_ctx);
+
+ return duk__decode_helper(thr, &dec_ctx);
+}
+
+/* automatic undefs */
+#undef DUK__CP_CONTINUE
+#undef DUK__CP_ERROR
+#undef DUK__CP_RETRY
+#line 1 "duk_bi_error.c"
+/*
+ * Error built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL duk_ret_t duk_bi_error_constructor_shared(duk_hthread *thr) {
+ /* Behavior for constructor and non-constructor call is
+ * the same except for augmenting the created error. When
+ * called as a constructor, the caller (duk_new()) will handle
+ * augmentation; when called as normal function, we need to do
+ * it here.
+ */
+
+ duk_small_int_t bidx_prototype = duk_get_current_magic(thr);
+
+ /* same for both error and each subclass like TypeError */
+ duk_uint_t flags_and_class = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR);
+
+ (void) duk_push_object_helper(thr, flags_and_class, bidx_prototype);
+
+ /* If message is undefined, the own property 'message' is not set at
+ * all to save property space. An empty message is inherited anyway.
+ */
+ if (!duk_is_undefined(thr, 0)) {
+ duk_to_string(thr, 0);
+ duk_dup_0(thr); /* [ message error message ] */
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC);
+ }
+
+ /* Augment the error if called as a normal function. __FILE__ and __LINE__
+ * are not desirable in this case.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ if (!duk_is_constructor_call(thr)) {
+ duk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE);
+ }
+#endif
+
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_to_string(duk_hthread *thr) {
+ /* XXX: optimize with more direct internal access */
+
+ duk_push_this(thr);
+ (void) duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+
+ /* [ ... this ] */
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME);
+ if (duk_is_undefined(thr, -1)) {
+ duk_pop(thr);
+ duk_push_string(thr, "Error");
+ } else {
+ duk_to_string(thr, -1);
+ }
+
+ /* [ ... this name ] */
+
+ /* XXX: Are steps 6 and 7 in E5 Section 15.11.4.4 duplicated by
+ * accident or are they actually needed? The first ToString()
+ * could conceivably return 'undefined'.
+ */
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE);
+ if (duk_is_undefined(thr, -1)) {
+ duk_pop(thr);
+ duk_push_hstring_empty(thr);
+ } else {
+ duk_to_string(thr, -1);
+ }
+
+ /* [ ... this name message ] */
+
+ if (duk_get_length(thr, -2) == 0) {
+ /* name is empty -> return message */
+ return 1;
+ }
+ if (duk_get_length(thr, -1) == 0) {
+ /* message is empty -> return name */
+ duk_pop(thr);
+ return 1;
+ }
+ duk_push_string(thr, ": ");
+ duk_insert(thr, -2); /* ... name ': ' message */
+ duk_concat(thr, 3);
+
+ return 1;
+}
+
+#if defined(DUK_USE_TRACEBACKS)
+
+/*
+ * Traceback handling
+ *
+ * The unified helper decodes the traceback and produces various requested
+ * outputs. It should be optimized for size, and may leave garbage on stack,
+ * only the topmost return value matters. For instance, traceback separator
+ * and decoded strings are pushed even when looking for filename only.
+ *
+ * NOTE: although _Tracedata is an internal property, user code can currently
+ * write to the array (or replace it with something other than an array).
+ * The code below must tolerate arbitrary _Tracedata. It can throw errors
+ * etc, but cannot cause a segfault or memory unsafe behavior.
+ */
+
+/* constants arbitrary, chosen for small loads */
+#define DUK__OUTPUT_TYPE_TRACEBACK (-1)
+#define DUK__OUTPUT_TYPE_FILENAME 0
+#define DUK__OUTPUT_TYPE_LINENUMBER 1
+
+DUK_LOCAL duk_ret_t duk__error_getter_helper(duk_hthread *thr, duk_small_int_t output_type) {
+ duk_idx_t idx_td;
+ duk_small_int_t i; /* traceback depth fits into 16 bits */
+ duk_small_int_t t; /* stack type fits into 16 bits */
+ duk_small_int_t count_func = 0; /* traceback depth ensures fits into 16 bits */
+ const char *str_tailcall = " tailcall";
+ const char *str_strict = " strict";
+ const char *str_construct = " construct";
+ const char *str_prevyield = " preventsyield";
+ const char *str_directeval = " directeval";
+ const char *str_empty = "";
+
+ DUK_ASSERT_TOP(thr, 0); /* fixed arg count */
+
+ duk_push_this(thr);
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TRACEDATA);
+ idx_td = duk_get_top_index(thr);
+
+ duk_push_hstring_stridx(thr, DUK_STRIDX_NEWLINE_4SPACE);
+ duk_push_this(thr);
+
+ /* [ ... this tracedata sep this ] */
+
+ /* XXX: skip null filename? */
+
+ if (duk_check_type(thr, idx_td, DUK_TYPE_OBJECT)) {
+ /* Current tracedata contains 2 entries per callstack entry. */
+ for (i = 0; ; i += 2) {
+ duk_int_t pc;
+ duk_uint_t line;
+ duk_uint_t flags;
+ duk_double_t d;
+ const char *funcname;
+ const char *filename;
+ duk_hobject *h_func;
+ duk_hstring *h_name;
+
+ duk_require_stack(thr, 5);
+ duk_get_prop_index(thr, idx_td, (duk_uarridx_t) i);
+ duk_get_prop_index(thr, idx_td, (duk_uarridx_t) (i + 1));
+ d = duk_to_number_m1(thr);
+ pc = (duk_int_t) DUK_FMOD(d, DUK_DOUBLE_2TO32);
+ flags = (duk_uint_t) DUK_FLOOR(d / DUK_DOUBLE_2TO32);
+ t = (duk_small_int_t) duk_get_type(thr, -2);
+
+ if (t == DUK_TYPE_OBJECT || t == DUK_TYPE_LIGHTFUNC) {
+ /*
+ * Ecmascript/native function call or lightfunc call
+ */
+
+ count_func++;
+
+ /* [ ... v1(func) v2(pc+flags) ] */
+
+ /* These may be systematically omitted by Duktape
+ * with certain config options, but allow user to
+ * set them on a case-by-case basis.
+ */
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME);
+ duk_get_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME);
+
+#if defined(DUK_USE_PC2LINE)
+ line = (duk_uint_t) duk_hobject_pc2line_query(thr, -4, (duk_uint_fast32_t) pc);
+#else
+ line = 0;
+#endif
+
+ /* [ ... v1 v2 name filename ] */
+
+ /* When looking for .fileName/.lineNumber, blame first
+ * function which has a .fileName.
+ */
+ if (duk_is_string_notsymbol(thr, -1)) {
+ if (output_type == DUK__OUTPUT_TYPE_FILENAME) {
+ return 1;
+ } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) {
+ duk_push_uint(thr, line);
+ return 1;
+ }
+ }
+
+ /* XXX: Change 'anon' handling here too, to use empty string for anonymous functions? */
+ /* XXX: Could be improved by coercing to a readable duk_tval (especially string escaping) */
+ h_name = duk_get_hstring_notsymbol(thr, -2); /* may be NULL */
+ funcname = (h_name == NULL || h_name == DUK_HTHREAD_STRING_EMPTY_STRING(thr)) ?
+ "[anon]" : (const char *) DUK_HSTRING_GET_DATA(h_name);
+ filename = duk_get_string_notsymbol(thr, -1);
+ filename = filename ? filename : "";
+ DUK_ASSERT(funcname != NULL);
+ DUK_ASSERT(filename != NULL);
+
+ h_func = duk_get_hobject(thr, -4); /* NULL for lightfunc */
+
+ if (h_func == NULL) {
+ duk_push_sprintf(thr, "at %s light%s%s%s%s%s",
+ (const char *) funcname,
+ (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));
+ } else if (DUK_HOBJECT_HAS_NATFUNC(h_func)) {
+ duk_push_sprintf(thr, "at %s (%s) native%s%s%s%s%s",
+ (const char *) funcname,
+ (const char *) filename,
+ (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));
+ } else {
+ duk_push_sprintf(thr, "at %s (%s:%lu)%s%s%s%s%s",
+ (const char *) funcname,
+ (const char *) filename,
+ (unsigned long) line,
+ (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),
+ (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));
+ }
+ duk_replace(thr, -5); /* [ ... v1 v2 name filename str ] -> [ ... str v2 name filename ] */
+ duk_pop_3(thr); /* -> [ ... str ] */
+ } else if (t == DUK_TYPE_STRING) {
+ const char *str_file;
+
+ /*
+ * __FILE__ / __LINE__ entry, here 'pc' is line number directly.
+ * Sometimes __FILE__ / __LINE__ is reported as the source for
+ * the error (fileName, lineNumber), sometimes not.
+ */
+
+ /* [ ... v1(filename) v2(line+flags) ] */
+
+ /* When looking for .fileName/.lineNumber, blame compilation
+ * or C call site unless flagged not to do so.
+ */
+ if (!(flags & DUK_TB_FLAG_NOBLAME_FILELINE)) {
+ if (output_type == DUK__OUTPUT_TYPE_FILENAME) {
+ duk_pop(thr);
+ return 1;
+ } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) {
+ duk_push_int(thr, pc);
+ return 1;
+ }
+ }
+
+ /* Tracedata is trusted but avoid any risk of using a NULL
+ * for %s format because it has undefined behavior. Symbols
+ * don't need to be explicitly rejected as they pose no memory
+ * safety issues.
+ */
+ str_file = (const char *) duk_get_string(thr, -2);
+ duk_push_sprintf(thr, "at [anon] (%s:%ld) internal",
+ (const char *) (str_file ? str_file : "null"), (long) pc);
+ duk_replace(thr, -3); /* [ ... v1 v2 str ] -> [ ... str v2 ] */
+ duk_pop(thr); /* -> [ ... str ] */
+ } else {
+ /* unknown, ignore */
+ duk_pop_2(thr);
+ break;
+ }
+ }
+
+ if (count_func >= DUK_USE_TRACEBACK_DEPTH) {
+ /* Possibly truncated; there is no explicit truncation
+ * marker so this is the best we can do.
+ */
+
+ duk_push_hstring_stridx(thr, DUK_STRIDX_BRACKETED_ELLIPSIS);
+ }
+ }
+
+ /* [ ... this tracedata sep this str1 ... strN ] */
+
+ if (output_type != DUK__OUTPUT_TYPE_TRACEBACK) {
+ return 0;
+ } else {
+ /* The 'this' after 'sep' will get ToString() coerced by
+ * duk_join() automatically. We don't want to do that
+ * coercion when providing .fileName or .lineNumber (GH-254).
+ */
+ duk_join(thr, duk_get_top(thr) - (idx_td + 2) /*count, not including sep*/);
+ return 1;
+ }
+}
+
+/* XXX: Output type could be encoded into native function 'magic' value to
+ * save space. For setters the stridx could be encoded into 'magic'.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) {
+ return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_TRACEBACK);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) {
+ return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_FILENAME);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) {
+ return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_LINENUMBER);
+}
+
+#else /* DUK_USE_TRACEBACKS */
+
+/*
+ * Traceback handling when tracebacks disabled.
+ *
+ * The fileName / lineNumber stubs are now necessary because built-in
+ * data will include the accessor properties in Error.prototype. If those
+ * are removed for builds without tracebacks, these can also be removed.
+ * 'stack' should still be present and produce a ToString() equivalent:
+ * this is useful for user code which prints a stacktrace and expects to
+ * see something useful. A normal stacktrace also begins with a ToString()
+ * of the error so this makes sense.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) {
+ /* XXX: remove this native function and map 'stack' accessor
+ * to the toString() implementation directly.
+ */
+ return duk_bi_error_prototype_to_string(thr);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) {
+ DUK_UNREF(thr);
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) {
+ DUK_UNREF(thr);
+ return 0;
+}
+
+#endif /* DUK_USE_TRACEBACKS */
+
+DUK_LOCAL duk_ret_t duk__error_setter_helper(duk_hthread *thr, duk_small_uint_t stridx_key) {
+ /* Attempt to write 'stack', 'fileName', 'lineNumber' works as if
+ * user code called Object.defineProperty() to create an overriding
+ * own property. This allows user code to overwrite .fileName etc
+ * intuitively as e.g. "err.fileName = 'dummy'" as one might expect.
+ * See https://github.com/svaarala/duktape/issues/387.
+ */
+
+ DUK_ASSERT_TOP(thr, 1); /* fixed arg count: value */
+
+ duk_push_this(thr);
+ duk_push_hstring_stridx(thr, stridx_key);
+ duk_dup_0(thr);
+
+ /* [ ... obj key value ] */
+
+ DUK_DD(DUK_DDPRINT("error setter: %!T %!T %!T",
+ duk_get_tval(thr, -3), duk_get_tval(thr, -2), duk_get_tval(thr, -1)));
+
+ duk_def_prop(thr, -3, DUK_DEFPROP_HAVE_VALUE |
+ DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE |
+ DUK_DEFPROP_HAVE_ENUMERABLE | /*not enumerable*/
+ DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE);
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_setter(duk_hthread *thr) {
+ return duk__error_setter_helper(thr, DUK_STRIDX_STACK);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_setter(duk_hthread *thr) {
+ return duk__error_setter_helper(thr, DUK_STRIDX_FILE_NAME);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_hthread *thr) {
+ return duk__error_setter_helper(thr, DUK_STRIDX_LINE_NUMBER);
+}
+
+/* automatic undefs */
+#undef DUK__OUTPUT_TYPE_FILENAME
+#undef DUK__OUTPUT_TYPE_LINENUMBER
+#undef DUK__OUTPUT_TYPE_TRACEBACK
+#line 1 "duk_bi_function.c"
+/*
+ * Function built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Needed even when Function built-in is disabled. */
+DUK_INTERNAL duk_ret_t duk_bi_function_prototype(duk_hthread *thr) {
+ /* ignore arguments, return undefined (E5 Section 15.3.4) */
+ DUK_UNREF(thr);
+ return 0;
+}
+
+#if defined(DUK_USE_FUNCTION_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_function_constructor(duk_hthread *thr) {
+ duk_hstring *h_sourcecode;
+ duk_idx_t nargs;
+ duk_idx_t i;
+ duk_small_uint_t comp_flags;
+ duk_hcompfunc *func;
+ duk_hobject *outer_lex_env;
+ duk_hobject *outer_var_env;
+
+ /* normal and constructor calls have identical semantics */
+
+ nargs = duk_get_top(thr);
+ for (i = 0; i < nargs; i++) {
+ duk_to_string(thr, i); /* Rejects Symbols during coercion. */
+ }
+
+ if (nargs == 0) {
+ duk_push_hstring_empty(thr);
+ duk_push_hstring_empty(thr);
+ } else if (nargs == 1) {
+ /* XXX: cover this with the generic >1 case? */
+ duk_push_hstring_empty(thr);
+ } else {
+ duk_insert(thr, 0); /* [ arg1 ... argN-1 body] -> [body arg1 ... argN-1] */
+ duk_push_string(thr, ",");
+ duk_insert(thr, 1);
+ duk_join(thr, nargs - 1);
+ }
+
+ /* [ body formals ], formals is comma separated list that needs to be parsed */
+
+ DUK_ASSERT_TOP(thr, 2);
+
+ /* XXX: this placeholder is not always correct, but use for now.
+ * It will fail in corner cases; see test-dev-func-cons-args.js.
+ */
+ duk_push_string(thr, "function(");
+ duk_dup_1(thr);
+ duk_push_string(thr, "){");
+ duk_dup_0(thr);
+ duk_push_string(thr, "}");
+ duk_concat(thr, 5);
+
+ /* [ body formals source ] */
+
+ DUK_ASSERT_TOP(thr, 3);
+
+ /* strictness is not inherited, intentional */
+ comp_flags = DUK_COMPILE_FUNCEXPR;
+
+ duk_push_hstring_stridx(thr, DUK_STRIDX_COMPILE); /* XXX: copy from caller? */ /* XXX: ignored now */
+ h_sourcecode = duk_require_hstring(thr, -2); /* no symbol check needed; -2 is concat'd code */
+ duk_js_compile(thr,
+ (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode),
+ (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode),
+ comp_flags);
+
+ /* Force .name to 'anonymous' (ES2015). */
+ duk_push_string(thr, "anonymous");
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);
+
+ func = (duk_hcompfunc *) duk_known_hobject(thr, -1);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func));
+ DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) func));
+
+ /* [ body formals source template ] */
+
+ /* only outer_lex_env matters, as functions always get a new
+ * variable declaration environment.
+ */
+
+ outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+
+ duk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 1 /*add_auto_proto*/);
+
+ /* [ body formals source template closure ] */
+
+ return 1;
+}
+#endif /* DUK_USE_FUNCTION_BUILTIN */
+
+#if defined(DUK_USE_FUNCTION_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_function_prototype_to_string(duk_hthread *thr) {
+ duk_tval *tv;
+
+ /*
+ * E5 Section 15.3.4.2 places few requirements on the output of
+ * this function: the result is implementation dependent, must
+ * follow FunctionDeclaration syntax (in particular, must have a
+ * name even for anonymous functions or functions with empty name).
+ * The output does NOT need to compile into anything useful.
+ *
+ * E6 Section 19.2.3.5 changes the requirements completely: the
+ * result must either eval() to a functionally equivalent object
+ * OR eval() to a SyntaxError.
+ *
+ * We opt for the SyntaxError approach for now, with a syntax that
+ * mimics V8's native function syntax:
+ *
+ * 'function cos() { [native code] }'
+ *
+ * but extended with [ecmascript code], [bound code], and
+ * [lightfunc code].
+ */
+
+ duk_push_this(thr);
+ tv = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv);
+ const char *func_name;
+
+ /* Function name: missing/undefined is mapped to empty string,
+ * otherwise coerce to string. No handling for invalid identifier
+ * characters or e.g. '{' in the function name. This doesn't
+ * really matter as long as a SyntaxError results. Technically
+ * if the name contained a suitable prefix followed by '//' it
+ * might cause the result to parse without error.
+ */
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME);
+ if (duk_is_undefined(thr, -1)) {
+ func_name = "";
+ } else {
+ func_name = duk_to_string(thr, -1);
+ DUK_ASSERT(func_name != NULL);
+ }
+
+ if (DUK_HOBJECT_IS_COMPFUNC(obj)) {
+ duk_push_sprintf(thr, "function %s() { [ecmascript code] }", (const char *) func_name);
+ } else if (DUK_HOBJECT_IS_NATFUNC(obj)) {
+ duk_push_sprintf(thr, "function %s() { [native code] }", (const char *) func_name);
+ } else if (DUK_HOBJECT_IS_BOUNDFUNC(obj)) {
+ duk_push_sprintf(thr, "function %s() { [bound code] }", (const char *) func_name);
+ } else {
+ goto type_error;
+ }
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ duk_push_lightfunc_tostring(thr, tv);
+ } else {
+ goto type_error;
+ }
+
+ return 1;
+
+ type_error:
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+}
+#endif
+
+/* Always present because the native function pointer is needed in call
+ * handling.
+ */
+DUK_INTERNAL duk_ret_t duk_bi_function_prototype_call(duk_hthread *thr) {
+ /* .call() is dealt with in call handling by simulating its
+ * effects so this function is actually never called.
+ */
+ DUK_UNREF(thr);
+ return DUK_RET_TYPE_ERROR;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_function_prototype_apply(duk_hthread *thr) {
+ /* Like .call(), never actually called. */
+ DUK_UNREF(thr);
+ return DUK_RET_TYPE_ERROR;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_reflect_apply(duk_hthread *thr) {
+ /* Like .call(), never actually called. */
+ DUK_UNREF(thr);
+ return DUK_RET_TYPE_ERROR;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_reflect_construct(duk_hthread *thr) {
+ /* Like .call(), never actually called. */
+ DUK_UNREF(thr);
+ return DUK_RET_TYPE_ERROR;
+}
+
+#if defined(DUK_USE_FUNCTION_BUILTIN)
+/* Create a bound function which points to a target function which may
+ * be bound or non-bound. If the target is bound, the argument lists
+ * and 'this' binding of the functions are merged and the resulting
+ * function points directly to the non-bound target.
+ */
+DUK_INTERNAL duk_ret_t duk_bi_function_prototype_bind(duk_hthread *thr) {
+ duk_hboundfunc *h_bound;
+ duk_idx_t nargs; /* bound args, not counting 'this' binding */
+ duk_idx_t bound_nargs;
+ duk_int_t bound_len;
+ duk_tval *tv_prevbound;
+ duk_idx_t n_prevbound;
+ duk_tval *tv_res;
+ duk_tval *tv_tmp;
+
+ /* XXX: C API call, e.g. duk_push_bound_function(thr, target_idx, nargs); */
+
+ /* Vararg function, careful arg handling, e.g. thisArg may not
+ * be present.
+ */
+ nargs = duk_get_top(thr) - 1; /* actual args, not counting 'this' binding */
+ if (nargs < 0) {
+ nargs++;
+ duk_push_undefined(thr);
+ }
+ DUK_ASSERT(nargs >= 0);
+
+ /* Limit 'nargs' for bound functions to guarantee arithmetic
+ * below will never wrap.
+ */
+ if (nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) {
+ DUK_DCERROR_RANGE_INVALID_COUNT(thr);
+ }
+
+ duk_push_this(thr);
+ duk_require_callable(thr, -1);
+
+ /* [ thisArg arg1 ... argN func ] (thisArg+args == nargs+1 total) */
+ DUK_ASSERT_TOP(thr, nargs + 2);
+
+ /* Create bound function object. */
+ h_bound = duk_push_hboundfunc(thr);
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->target));
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->this_binding));
+ DUK_ASSERT(h_bound->args == NULL);
+ DUK_ASSERT(h_bound->nargs == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_bound) == NULL);
+
+ /* [ thisArg arg1 ... argN func boundFunc ] */
+
+ /* If the target is a bound function, argument lists must be
+ * merged. The 'this' binding closest to the target function
+ * wins because in call handling the 'this' gets replaced over
+ * and over again until we call the non-bound function.
+ */
+ tv_prevbound = NULL;
+ n_prevbound = 0;
+ tv_tmp = DUK_GET_TVAL_POSIDX(thr, 0);
+ DUK_TVAL_SET_TVAL(&h_bound->this_binding, tv_tmp);
+ tv_tmp = DUK_GET_TVAL_NEGIDX(thr, -2);
+ DUK_TVAL_SET_TVAL(&h_bound->target, tv_tmp);
+
+ if (DUK_TVAL_IS_OBJECT(tv_tmp)) {
+ duk_hobject *h_target;
+ duk_hobject *bound_proto;
+
+ h_target = DUK_TVAL_GET_OBJECT(tv_tmp);
+ DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(h_target));
+
+ /* Internal prototype must be copied from the target.
+ * For lightfuncs Function.prototype is used and is already
+ * in place.
+ */
+ bound_proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_target);
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto);
+
+ /* The 'strict' flag is copied to get the special [[Get]] of E5.1
+ * Section 15.3.5.4 to apply when a 'caller' value is a strict bound
+ * function. Not sure if this is correct, because the specification
+ * is a bit ambiguous on this point but it would make sense.
+ */
+ /* Strictness is inherited from target. */
+ if (DUK_HOBJECT_HAS_STRICT(h_target)) {
+ DUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound);
+ }
+
+ if (DUK_HOBJECT_HAS_BOUNDFUNC(h_target)) {
+ duk_hboundfunc *h_boundtarget;
+
+ h_boundtarget = (duk_hboundfunc *) h_target;
+
+ /* The final function should always be non-bound, unless
+ * there's a bug in the internals. Assert for it.
+ */
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&h_boundtarget->target) ||
+ (DUK_TVAL_IS_OBJECT(&h_boundtarget->target) &&
+ DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&h_boundtarget->target)) &&
+ !DUK_HOBJECT_IS_BOUNDFUNC(DUK_TVAL_GET_OBJECT(&h_boundtarget->target))));
+
+ DUK_TVAL_SET_TVAL(&h_bound->target, &h_boundtarget->target);
+ DUK_TVAL_SET_TVAL(&h_bound->this_binding, &h_boundtarget->this_binding);
+
+ tv_prevbound = h_boundtarget->args;
+ n_prevbound = h_boundtarget->nargs;
+ }
+ } else {
+ /* Lightfuncs are always strict. */
+ duk_hobject *bound_proto;
+
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_tmp));
+ DUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound);
+ bound_proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE];
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto);
+ }
+
+ DUK_TVAL_INCREF(thr, &h_bound->target); /* old values undefined, no decref needed */
+ DUK_TVAL_INCREF(thr, &h_bound->this_binding);
+
+ bound_nargs = n_prevbound + nargs;
+ if (bound_nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) {
+ DUK_DCERROR_RANGE_INVALID_COUNT(thr);
+ }
+ tv_res = (duk_tval *) DUK_ALLOC_CHECKED(thr, ((duk_size_t) bound_nargs) * sizeof(duk_tval));
+ DUK_ASSERT(tv_res != NULL);
+ DUK_ASSERT(h_bound->args == NULL);
+ DUK_ASSERT(h_bound->nargs == 0);
+ h_bound->args = tv_res;
+ h_bound->nargs = bound_nargs;
+
+ DUK_ASSERT(n_prevbound >= 0);
+ duk_copy_tvals_incref(thr, tv_res, tv_prevbound, (duk_size_t) n_prevbound);
+ DUK_ASSERT(nargs >= 0);
+ duk_copy_tvals_incref(thr, tv_res + n_prevbound, DUK_GET_TVAL_POSIDX(thr, 1), (duk_size_t) nargs);
+
+ /* [ thisArg arg1 ... argN func boundFunc ] */
+
+ /* Bound function 'length' property is interesting.
+ * For lightfuncs, simply read the virtual property.
+ */
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH);
+ bound_len = duk_get_int(thr, -1); /* ES2015: no coercion */
+ if (bound_len < nargs) {
+ bound_len = 0;
+ } else {
+ bound_len -= nargs;
+ }
+ if (sizeof(duk_int_t) > 4 && bound_len > (duk_int_t) DUK_UINT32_MAX) {
+ bound_len = (duk_int_t) DUK_UINT32_MAX;
+ }
+ duk_pop(thr);
+ DUK_ASSERT(bound_len >= 0);
+ tv_tmp = thr->valstack_top++;
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_tmp));
+ DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_tmp));
+ DUK_TVAL_SET_U32(tv_tmp, (duk_uint32_t) bound_len); /* in-place update, fastint */
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); /* attrs in E6 Section 9.2.4 */
+
+ /* XXX: could these be virtual? */
+ /* Caller and arguments must use the same thrower, [[ThrowTypeError]]. */
+ duk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_CALLER);
+ duk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_LC_ARGUMENTS);
+
+ /* Function name and fileName (non-standard). */
+ duk_push_string(thr, "bound "); /* ES2015 19.2.3.2. */
+ duk_get_prop_stridx(thr, -3, DUK_STRIDX_NAME);
+ if (!duk_is_string_notsymbol(thr, -1)) {
+ /* ES2015 has requirement to check that .name of target is a string
+ * (also must check for Symbol); if not, targetName should be the
+ * empty string. ES2015 19.2.3.2.
+ */
+ duk_pop(thr);
+ duk_push_hstring_empty(thr);
+ }
+ duk_concat(thr, 2);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);
+#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C);
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("created bound function: %!iT", (duk_tval *) duk_get_tval(thr, -1)));
+
+ return 1;
+}
+#endif /* DUK_USE_FUNCTION_BUILTIN */
+
+/* %NativeFunctionPrototype% .length getter. */
+DUK_INTERNAL duk_ret_t duk_bi_native_function_length(duk_hthread *thr) {
+ duk_tval *tv;
+ duk_hnatfunc *h;
+ duk_int16_t func_nargs;
+
+ tv = duk_get_borrowed_this_tval(thr);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) {
+ goto fail_type;
+ }
+ func_nargs = h->nargs;
+ duk_push_int(thr, func_nargs == DUK_HNATFUNC_NARGS_VARARGS ? 0 : func_nargs);
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ duk_small_uint_t lf_flags;
+ duk_small_uint_t lf_len;
+
+ lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv);
+ lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags);
+ duk_push_uint(thr, lf_len);
+ } else {
+ goto fail_type;
+ }
+ return 1;
+
+ fail_type:
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+}
+
+/* %NativeFunctionPrototype% .name getter. */
+DUK_INTERNAL duk_ret_t duk_bi_native_function_name(duk_hthread *thr) {
+ duk_tval *tv;
+ duk_hnatfunc *h;
+
+ tv = duk_get_borrowed_this_tval(thr);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ if (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) {
+ goto fail_type;
+ }
+#if 0
+ duk_push_hnatfunc_name(thr, h);
+#endif
+ duk_push_hstring_empty(thr);
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {
+ duk_push_lightfunc_name(thr, tv);
+ } else {
+ goto fail_type;
+ }
+ return 1;
+
+ fail_type:
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+}
+#line 1 "duk_bi_global.c"
+/*
+ * Global object built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Encoding/decoding helpers
+ */
+
+/* XXX: Could add fast path (for each transform callback) with direct byte
+ * lookups (no shifting) and no explicit check for x < 0x80 before table
+ * lookup.
+ */
+
+/* Macros for creating and checking bitmasks for character encoding.
+ * Bit number is a bit counterintuitive, but minimizes code size.
+ */
+#define DUK__MKBITS(a,b,c,d,e,f,g,h) ((duk_uint8_t) ( \
+ ((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | \
+ ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7) \
+ ))
+#define DUK__CHECK_BITMASK(table,cp) ((table)[(cp) >> 3] & (1 << ((cp) & 0x07)))
+
+/* E5.1 Section 15.1.3.3: uriReserved + uriUnescaped + '#' */
+DUK_LOCAL const duk_uint8_t duk__encode_uriunescaped_table[16] = {
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */
+ DUK__MKBITS(0, 1, 0, 1, 1, 0, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x20-0x2f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */
+ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */
+};
+
+/* E5.1 Section 15.1.3.4: uriUnescaped */
+DUK_LOCAL const duk_uint8_t duk__encode_uricomponent_unescaped_table[16] = {
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */
+ DUK__MKBITS(0, 1, 0, 0, 0, 0, 0, 1), DUK__MKBITS(1, 1, 1, 0, 0, 1, 1, 0), /* 0x20-0x2f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */
+ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */
+ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */
+};
+
+/* E5.1 Section 15.1.3.1: uriReserved + '#' */
+DUK_LOCAL const duk_uint8_t duk__decode_uri_reserved_table[16] = {
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */
+ DUK__MKBITS(0, 0, 0, 1, 1, 0, 1, 0), DUK__MKBITS(0, 0, 0, 1, 1, 0, 0, 1), /* 0x20-0x2f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */
+ DUK__MKBITS(1, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */
+};
+
+/* E5.1 Section 15.1.3.2: empty */
+DUK_LOCAL const duk_uint8_t duk__decode_uri_component_reserved_table[16] = {
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x20-0x2f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */
+};
+
+#if defined(DUK_USE_SECTION_B)
+/* E5.1 Section B.2.2, step 7. */
+DUK_LOCAL const duk_uint8_t duk__escape_unescaped_table[16] = {
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */
+ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 1, 1), /* 0x20-0x2f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */
+ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */
+ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 0) /* 0x70-0x7f */
+};
+#endif /* DUK_USE_SECTION_B */
+
+typedef struct {
+ duk_hthread *thr;
+ duk_hstring *h_str;
+ duk_bufwriter_ctx bw;
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_start;
+ const duk_uint8_t *p_end;
+} duk__transform_context;
+
+typedef void (*duk__transform_callback)(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp);
+
+/* XXX: refactor and share with other code */
+DUK_LOCAL duk_small_int_t duk__decode_hex_escape(const duk_uint8_t *p, duk_small_int_t n) {
+ duk_small_int_t ch;
+ duk_small_int_t t = 0;
+
+ while (n > 0) {
+ t = t * 16;
+ ch = (duk_small_int_t) duk_hex_dectab[*p++];
+ if (DUK_LIKELY(ch >= 0)) {
+ t += ch;
+ } else {
+ return -1;
+ }
+ n--;
+ }
+ return t;
+}
+
+DUK_LOCAL int duk__transform_helper(duk_hthread *thr, duk__transform_callback callback, const void *udata) {
+ duk__transform_context tfm_ctx_alloc;
+ duk__transform_context *tfm_ctx = &tfm_ctx_alloc;
+ duk_codepoint_t cp;
+
+ tfm_ctx->thr = thr;
+
+ tfm_ctx->h_str = duk_to_hstring(thr, 0);
+ DUK_ASSERT(tfm_ctx->h_str != NULL);
+
+ DUK_BW_INIT_PUSHBUF(thr, &tfm_ctx->bw, DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str)); /* initial size guess */
+
+ tfm_ctx->p_start = DUK_HSTRING_GET_DATA(tfm_ctx->h_str);
+ tfm_ctx->p_end = tfm_ctx->p_start + DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str);
+ tfm_ctx->p = tfm_ctx->p_start;
+
+ while (tfm_ctx->p < tfm_ctx->p_end) {
+ cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end);
+ callback(tfm_ctx, udata, cp);
+ }
+
+ DUK_BW_COMPACT(thr, &tfm_ctx->bw);
+
+ (void) duk_buffer_to_string(thr, -1); /* Safe if transform is safe. */
+ return 1;
+}
+
+DUK_LOCAL void duk__transform_callback_encode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {
+ duk_uint8_t xutf8_buf[DUK_UNICODE_MAX_XUTF8_LENGTH];
+ duk_small_int_t len;
+ duk_codepoint_t cp1, cp2;
+ duk_small_int_t i, t;
+ const duk_uint8_t *unescaped_table = (const duk_uint8_t *) udata;
+
+ /* UTF-8 encoded bytes escaped as %xx%xx%xx... -> 3 * nbytes.
+ * Codepoint range is restricted so this is a slightly too large
+ * but doesn't matter.
+ */
+ DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 3 * DUK_UNICODE_MAX_XUTF8_LENGTH);
+
+ if (cp < 0) {
+ goto uri_error;
+ } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(unescaped_table, cp)) {
+ DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp);
+ return;
+ } else if (cp >= 0xdc00L && cp <= 0xdfffL) {
+ goto uri_error;
+ } else if (cp >= 0xd800L && cp <= 0xdbffL) {
+ /* Needs lookahead */
+ if (duk_unicode_decode_xutf8(tfm_ctx->thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end, (duk_ucodepoint_t *) &cp2) == 0) {
+ goto uri_error;
+ }
+ if (!(cp2 >= 0xdc00L && cp2 <= 0xdfffL)) {
+ goto uri_error;
+ }
+ cp1 = cp;
+ cp = (duk_codepoint_t) (((cp1 - 0xd800L) << 10) + (cp2 - 0xdc00L) + 0x10000L);
+ } else if (cp > 0x10ffffL) {
+ /* Although we can allow non-BMP characters (they'll decode
+ * back into surrogate pairs), we don't allow extended UTF-8
+ * characters; they would encode to URIs which won't decode
+ * back because of strict UTF-8 checks in URI decoding.
+ * (However, we could just as well allow them here.)
+ */
+ goto uri_error;
+ } else {
+ /* Non-BMP characters within valid UTF-8 range: encode as is.
+ * They'll decode back into surrogate pairs if the escaped
+ * output is decoded.
+ */
+ ;
+ }
+
+ len = duk_unicode_encode_xutf8((duk_ucodepoint_t) cp, xutf8_buf);
+ for (i = 0; i < len; i++) {
+ t = (duk_small_int_t) xutf8_buf[i];
+ DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr,
+ &tfm_ctx->bw,
+ DUK_ASC_PERCENT,
+ (duk_uint8_t) duk_uc_nybbles[t >> 4],
+ (duk_uint8_t) duk_uc_nybbles[t & 0x0f]);
+ }
+
+ return;
+
+ uri_error:
+ DUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT);
+}
+
+DUK_LOCAL void duk__transform_callback_decode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {
+ const duk_uint8_t *reserved_table = (const duk_uint8_t *) udata;
+ duk_small_uint_t utf8_blen;
+ duk_codepoint_t min_cp;
+ duk_small_int_t t; /* must be signed */
+ duk_small_uint_t i;
+
+ /* Maximum write size: XUTF8 path writes max DUK_UNICODE_MAX_XUTF8_LENGTH,
+ * percent escape path writes max two times CESU-8 encoded BMP length.
+ */
+ DUK_BW_ENSURE(tfm_ctx->thr,
+ &tfm_ctx->bw,
+ (DUK_UNICODE_MAX_XUTF8_LENGTH >= 2 * DUK_UNICODE_MAX_CESU8_BMP_LENGTH ?
+ DUK_UNICODE_MAX_XUTF8_LENGTH : DUK_UNICODE_MAX_CESU8_BMP_LENGTH));
+
+ if (cp == (duk_codepoint_t) '%') {
+ const duk_uint8_t *p = tfm_ctx->p;
+ duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */
+
+ DUK_DDD(DUK_DDDPRINT("percent encoding, left=%ld", (long) left));
+
+ if (left < 2) {
+ goto uri_error;
+ }
+
+ t = duk__decode_hex_escape(p, 2);
+ DUK_DDD(DUK_DDDPRINT("first byte: %ld", (long) t));
+ if (t < 0) {
+ goto uri_error;
+ }
+
+ if (t < 0x80) {
+ if (DUK__CHECK_BITMASK(reserved_table, t)) {
+ /* decode '%xx' to '%xx' if decoded char in reserved set */
+ DUK_ASSERT(tfm_ctx->p - 1 >= tfm_ctx->p_start);
+ DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr,
+ &tfm_ctx->bw,
+ DUK_ASC_PERCENT,
+ p[0],
+ p[1]);
+ } else {
+ DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) t);
+ }
+ tfm_ctx->p += 2;
+ return;
+ }
+
+ /* Decode UTF-8 codepoint from a sequence of hex escapes. The
+ * first byte of the sequence has been decoded to 't'.
+ *
+ * Note that UTF-8 validation must be strict according to the
+ * specification: E5.1 Section 15.1.3, decode algorithm step
+ * 4.d.vii.8. URIError from non-shortest encodings is also
+ * specifically noted in the spec.
+ */
+
+ DUK_ASSERT(t >= 0x80);
+ if (t < 0xc0) {
+ /* continuation byte */
+ goto uri_error;
+ } else if (t < 0xe0) {
+ /* 110x xxxx; 2 bytes */
+ utf8_blen = 2;
+ min_cp = 0x80L;
+ cp = t & 0x1f;
+ } else if (t < 0xf0) {
+ /* 1110 xxxx; 3 bytes */
+ utf8_blen = 3;
+ min_cp = 0x800L;
+ cp = t & 0x0f;
+ } else if (t < 0xf8) {
+ /* 1111 0xxx; 4 bytes */
+ utf8_blen = 4;
+ min_cp = 0x10000L;
+ cp = t & 0x07;
+ } else {
+ /* extended utf-8 not allowed for URIs */
+ goto uri_error;
+ }
+
+ if (left < utf8_blen * 3 - 1) {
+ /* '%xx%xx...%xx', p points to char after first '%' */
+ goto uri_error;
+ }
+
+ p += 3;
+ for (i = 1; i < utf8_blen; i++) {
+ /* p points to digit part ('%xy', p points to 'x') */
+ t = duk__decode_hex_escape(p, 2);
+ DUK_DDD(DUK_DDDPRINT("i=%ld utf8_blen=%ld cp=%ld t=0x%02lx",
+ (long) i, (long) utf8_blen, (long) cp, (unsigned long) t));
+ if (t < 0) {
+ goto uri_error;
+ }
+ if ((t & 0xc0) != 0x80) {
+ goto uri_error;
+ }
+ cp = (cp << 6) + (t & 0x3f);
+ p += 3;
+ }
+ p--; /* p overshoots */
+ tfm_ctx->p = p;
+
+ DUK_DDD(DUK_DDDPRINT("final cp=%ld, min_cp=%ld", (long) cp, (long) min_cp));
+
+ if (cp < min_cp || cp > 0x10ffffL || (cp >= 0xd800L && cp <= 0xdfffL)) {
+ goto uri_error;
+ }
+
+ /* The E5.1 algorithm checks whether or not a decoded codepoint
+ * is below 0x80 and perhaps may be in the "reserved" set.
+ * This seems pointless because the single byte UTF-8 case is
+ * handled separately, and non-shortest encodings are rejected.
+ * So, 'cp' cannot be below 0x80 here, and thus cannot be in
+ * the reserved set.
+ */
+
+ /* utf-8 validation ensures these */
+ DUK_ASSERT(cp >= 0x80L && cp <= 0x10ffffL);
+
+ if (cp >= 0x10000L) {
+ cp -= 0x10000L;
+ DUK_ASSERT(cp < 0x100000L);
+
+ DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp >> 10) + 0xd800L));
+ DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp & 0x03ffL) + 0xdc00L));
+ } else {
+ DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp);
+ }
+ } else {
+ DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp);
+ }
+ return;
+
+ uri_error:
+ DUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT);
+}
+
+#if defined(DUK_USE_SECTION_B)
+DUK_LOCAL void duk__transform_callback_escape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {
+ DUK_UNREF(udata);
+
+ DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 6);
+
+ if (cp < 0) {
+ goto esc_error;
+ } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(duk__escape_unescaped_table, cp)) {
+ DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp);
+ } else if (cp < 0x100L) {
+ DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr,
+ &tfm_ctx->bw,
+ (duk_uint8_t) DUK_ASC_PERCENT,
+ (duk_uint8_t) duk_uc_nybbles[cp >> 4],
+ (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]);
+ } else if (cp < 0x10000L) {
+ DUK_BW_WRITE_RAW_U8_6(tfm_ctx->thr,
+ &tfm_ctx->bw,
+ (duk_uint8_t) DUK_ASC_PERCENT,
+ (duk_uint8_t) DUK_ASC_LC_U,
+ (duk_uint8_t) duk_uc_nybbles[cp >> 12],
+ (duk_uint8_t) duk_uc_nybbles[(cp >> 8) & 0x0f],
+ (duk_uint8_t) duk_uc_nybbles[(cp >> 4) & 0x0f],
+ (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]);
+ } else {
+ /* Characters outside BMP cannot be escape()'d. We could
+ * encode them as surrogate pairs (for codepoints inside
+ * valid UTF-8 range, but not extended UTF-8). Because
+ * escape() and unescape() are legacy functions, we don't.
+ */
+ goto esc_error;
+ }
+
+ return;
+
+ esc_error:
+ DUK_ERROR_TYPE(tfm_ctx->thr, DUK_STR_INVALID_INPUT);
+}
+
+DUK_LOCAL void duk__transform_callback_unescape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {
+ duk_small_int_t t;
+
+ DUK_UNREF(udata);
+
+ if (cp == (duk_codepoint_t) '%') {
+ const duk_uint8_t *p = tfm_ctx->p;
+ duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */
+
+ if (left >= 5 && p[0] == 'u' &&
+ ((t = duk__decode_hex_escape(p + 1, 4)) >= 0)) {
+ cp = (duk_codepoint_t) t;
+ tfm_ctx->p += 5;
+ } else if (left >= 2 &&
+ ((t = duk__decode_hex_escape(p, 2)) >= 0)) {
+ cp = (duk_codepoint_t) t;
+ tfm_ctx->p += 2;
+ }
+ }
+
+ DUK_BW_WRITE_ENSURE_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp);
+}
+#endif /* DUK_USE_SECTION_B */
+
+/*
+ * Eval
+ *
+ * Eval needs to handle both a "direct eval" and an "indirect eval".
+ * Direct eval handling needs access to the caller's activation so that its
+ * lexical environment can be accessed. A direct eval is only possible from
+ * Ecmascript code; an indirect eval call is possible also from C code.
+ * When an indirect eval call is made from C code, there may not be a
+ * calling activation at all which needs careful handling.
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_global_object_eval(duk_hthread *thr) {
+ duk_hstring *h;
+ duk_activation *act_caller;
+ duk_activation *act_eval;
+ duk_hcompfunc *func;
+ duk_hobject *outer_lex_env;
+ duk_hobject *outer_var_env;
+ duk_bool_t this_to_global = 1;
+ duk_small_uint_t comp_flags;
+ duk_int_t level = -2;
+ duk_small_uint_t call_flags;
+
+ DUK_ASSERT(duk_get_top(thr) == 1 || duk_get_top(thr) == 2); /* 2 when called by debugger */
+ DUK_ASSERT(thr->callstack_top >= 1); /* at least this function exists */
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT((thr->callstack_curr->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0 || /* indirect eval */
+ (thr->callstack_top >= 2)); /* if direct eval, calling activation must exist */
+
+ /*
+ * callstack_top - 1 --> this function
+ * callstack_top - 2 --> caller (may not exist)
+ *
+ * If called directly from C, callstack_top might be 1. If calling
+ * activation doesn't exist, call must be indirect.
+ */
+
+ h = duk_get_hstring_notsymbol(thr, 0);
+ if (!h) {
+ /* Symbol must be returned as is, like any non-string values. */
+ return 1; /* return arg as-is */
+ }
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ /* NOTE: level is used only by the debugger and should never be present
+ * for an Ecmascript eval().
+ */
+ DUK_ASSERT(level == -2); /* by default, use caller's environment */
+ if (duk_get_top(thr) >= 2 && duk_is_number(thr, 1)) {
+ level = duk_get_int(thr, 1);
+ }
+ DUK_ASSERT(level <= -2); /* This is guaranteed by debugger code. */
+#endif
+
+ /* [ source ] */
+
+ comp_flags = DUK_COMPILE_EVAL;
+ act_eval = thr->callstack_curr; /* this function */
+ DUK_ASSERT(act_eval != NULL);
+ act_caller = duk_hthread_get_activation_for_level(thr, level);
+ if (act_caller != NULL) {
+ /* Have a calling activation, check for direct eval (otherwise
+ * assume indirect eval.
+ */
+ if ((act_caller->flags & DUK_ACT_FLAG_STRICT) &&
+ (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL)) {
+ /* Only direct eval inherits strictness from calling code
+ * (E5.1 Section 10.1.1).
+ */
+ comp_flags |= DUK_COMPILE_STRICT;
+ }
+ } else {
+ DUK_ASSERT((act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0);
+ }
+
+ duk_push_hstring_stridx(thr, DUK_STRIDX_INPUT); /* XXX: copy from caller? */
+ duk_js_compile(thr,
+ (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h),
+ (duk_size_t) DUK_HSTRING_GET_BYTELEN(h),
+ comp_flags);
+ func = (duk_hcompfunc *) duk_known_hobject(thr, -1);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func));
+
+ /* [ source template ] */
+
+ /* E5 Section 10.4.2 */
+
+ if (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) {
+ DUK_ASSERT(thr->callstack_top >= 2);
+ DUK_ASSERT(act_caller != NULL);
+ if (act_caller->lex_env == NULL) {
+ DUK_ASSERT(act_caller->var_env == NULL);
+ DUK_DDD(DUK_DDDPRINT("delayed environment initialization"));
+
+ /* this may have side effects, so re-lookup act */
+ duk_js_init_activation_environment_records_delayed(thr, act_caller);
+ }
+ DUK_ASSERT(act_caller->lex_env != NULL);
+ DUK_ASSERT(act_caller->var_env != NULL);
+
+ this_to_global = 0;
+
+ if (DUK_HOBJECT_HAS_STRICT((duk_hobject *) func)) {
+ duk_hdecenv *new_env;
+ duk_hobject *act_lex_env;
+
+ DUK_DDD(DUK_DDDPRINT("direct eval call to a strict function -> "
+ "var_env and lex_env to a fresh env, "
+ "this_binding to caller's this_binding"));
+
+ act_lex_env = act_caller->lex_env;
+
+ new_env = duk_hdecenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
+ DUK_ASSERT(new_env != NULL);
+ duk_push_hobject(thr, (duk_hobject *) new_env);
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act_lex_env);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, act_lex_env);
+ DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", (duk_heaphdr *) new_env));
+
+ outer_lex_env = (duk_hobject *) new_env;
+ outer_var_env = (duk_hobject *) new_env;
+
+ duk_insert(thr, 0); /* stash to bottom of value stack to keep new_env reachable for duration of eval */
+
+ /* compiler's responsibility */
+ DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("direct eval call to a non-strict function -> "
+ "var_env and lex_env to caller's envs, "
+ "this_binding to caller's this_binding"));
+
+ outer_lex_env = act_caller->lex_env;
+ outer_var_env = act_caller->var_env;
+
+ /* compiler's responsibility */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func));
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("indirect eval call -> var_env and lex_env to "
+ "global object, this_binding to global object"));
+
+ this_to_global = 1;
+ outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ }
+
+ /* Eval code doesn't need an automatic .prototype object. */
+ duk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 0 /*add_auto_proto*/);
+
+ /* [ env? source template closure ] */
+
+ if (this_to_global) {
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);
+ duk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL);
+ } else {
+ duk_tval *tv;
+ DUK_ASSERT(thr->callstack_top >= 2);
+ DUK_ASSERT(act_caller != NULL);
+ tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act_caller->bottom_byteoff - sizeof(duk_tval)); /* this is just beneath bottom */
+ DUK_ASSERT(tv >= thr->valstack);
+ duk_push_tval(thr, tv);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("eval -> lex_env=%!iO, var_env=%!iO, this_binding=%!T",
+ (duk_heaphdr *) outer_lex_env,
+ (duk_heaphdr *) outer_var_env,
+ duk_get_tval(thr, -1)));
+
+ /* [ env? source template closure this ] */
+
+ call_flags = 0;
+ if (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) {
+ /* Set DIRECT_EVAL flag for the call; it's not strictly
+ * needed for the 'inner' eval call (the eval body) but
+ * current new.target implementation expects to find it
+ * so it can traverse direct eval chains up to the real
+ * calling function.
+ */
+ call_flags |= DUK_CALL_FLAG_DIRECT_EVAL;
+ }
+ duk_handle_call_unprotected_nargs(thr, 0, call_flags);
+
+ /* [ env? source template result ] */
+
+ return 1;
+}
+
+/*
+ * Parsing of ints and floats
+ */
+
+#if defined(DUK_USE_GLOBAL_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_int(duk_hthread *thr) {
+ duk_int32_t radix;
+ duk_small_uint_t s2n_flags;
+
+ DUK_ASSERT_TOP(thr, 2);
+ duk_to_string(thr, 0); /* Reject symbols. */
+
+ radix = duk_to_int32(thr, 1);
+
+ /* While parseInt() recognizes 0xdeadbeef, it doesn't recognize
+ * ES2015 0o123 or 0b10001.
+ */
+ s2n_flags = DUK_S2N_FLAG_TRIM_WHITE |
+ DUK_S2N_FLAG_ALLOW_GARBAGE |
+ DUK_S2N_FLAG_ALLOW_PLUS |
+ DUK_S2N_FLAG_ALLOW_MINUS |
+ DUK_S2N_FLAG_ALLOW_LEADING_ZERO |
+ DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT;
+
+ /* Specification stripPrefix maps to DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT.
+ *
+ * Don't autodetect octals (from leading zeroes), require user code to
+ * provide an explicit radix 8 for parsing octal. See write-up from Mozilla:
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt#ECMAScript_5_Removes_Octal_Interpretation
+ */
+
+ if (radix != 0) {
+ if (radix < 2 || radix > 36) {
+ goto ret_nan;
+ }
+ if (radix != 16) {
+ s2n_flags &= ~DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT;
+ }
+ } else {
+ radix = 10;
+ }
+
+ duk_dup_0(thr);
+ duk_numconv_parse(thr, (duk_small_int_t) radix, s2n_flags);
+ return 1;
+
+ ret_nan:
+ duk_push_nan(thr);
+ return 1;
+}
+#endif /* DUK_USE_GLOBAL_BUILTIN */
+
+#if defined(DUK_USE_GLOBAL_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_float(duk_hthread *thr) {
+ duk_small_uint_t s2n_flags;
+
+ DUK_ASSERT_TOP(thr, 1);
+ duk_to_string(thr, 0); /* Reject symbols. */
+
+ /* XXX: check flags */
+ s2n_flags = DUK_S2N_FLAG_TRIM_WHITE |
+ DUK_S2N_FLAG_ALLOW_EXP |
+ DUK_S2N_FLAG_ALLOW_GARBAGE |
+ DUK_S2N_FLAG_ALLOW_PLUS |
+ DUK_S2N_FLAG_ALLOW_MINUS |
+ DUK_S2N_FLAG_ALLOW_INF |
+ DUK_S2N_FLAG_ALLOW_FRAC |
+ DUK_S2N_FLAG_ALLOW_NAKED_FRAC |
+ DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |
+ DUK_S2N_FLAG_ALLOW_LEADING_ZERO;
+
+ duk_numconv_parse(thr, 10 /*radix*/, s2n_flags);
+ return 1;
+}
+#endif /* DUK_USE_GLOBAL_BUILTIN */
+
+/*
+ * Number checkers
+ */
+
+#if defined(DUK_USE_GLOBAL_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_global_object_is_nan(duk_hthread *thr) {
+ duk_double_t d = duk_to_number(thr, 0);
+ duk_push_boolean(thr, (duk_bool_t) DUK_ISNAN(d));
+ return 1;
+}
+#endif /* DUK_USE_GLOBAL_BUILTIN */
+
+#if defined(DUK_USE_GLOBAL_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_global_object_is_finite(duk_hthread *thr) {
+ duk_double_t d = duk_to_number(thr, 0);
+ duk_push_boolean(thr, (duk_bool_t) DUK_ISFINITE(d));
+ return 1;
+}
+#endif /* DUK_USE_GLOBAL_BUILTIN */
+
+/*
+ * URI handling
+ */
+
+#if defined(DUK_USE_GLOBAL_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri(duk_hthread *thr) {
+ return duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_reserved_table);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri_component(duk_hthread *thr) {
+ return duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_component_reserved_table);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri(duk_hthread *thr) {
+ return duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uriunescaped_table);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri_component(duk_hthread *thr) {
+ return duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uricomponent_unescaped_table);
+}
+
+#if defined(DUK_USE_SECTION_B)
+DUK_INTERNAL duk_ret_t duk_bi_global_object_escape(duk_hthread *thr) {
+ return duk__transform_helper(thr, duk__transform_callback_escape, (const void *) NULL);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_global_object_unescape(duk_hthread *thr) {
+ return duk__transform_helper(thr, duk__transform_callback_unescape, (const void *) NULL);
+}
+#endif /* DUK_USE_SECTION_B */
+#endif /* DUK_USE_GLOBAL_BUILTIN */
+
+/* automatic undefs */
+#undef DUK__CHECK_BITMASK
+#undef DUK__MKBITS
+#line 1 "duk_bi_json.c"
+/*
+ * JSON built-ins.
+ *
+ * See doc/json.rst.
+ *
+ * Codepoints are handled as duk_uint_fast32_t to ensure that the full
+ * unsigned 32-bit range is supported. This matters to e.g. JX.
+ *
+ * Input parsing doesn't do an explicit end-of-input check at all. This is
+ * safe: input string data is always NUL-terminated (0x00) and valid JSON
+ * inputs never contain plain NUL characters, so that as long as syntax checks
+ * are correct, we'll never read past the NUL. This approach reduces code size
+ * and improves parsing performance, but it's critical that syntax checks are
+ * indeed correct!
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_JSON_SUPPORT)
+
+/*
+ * Local defines and forward declarations.
+ */
+
+#define DUK__JSON_DECSTR_BUFSIZE 128
+#define DUK__JSON_DECSTR_CHUNKSIZE 64
+#define DUK__JSON_ENCSTR_CHUNKSIZE 64
+#define DUK__JSON_STRINGIFY_BUFSIZE 128
+#define DUK__JSON_MAX_ESC_LEN 10 /* '\Udeadbeef' */
+
+DUK_LOCAL_DECL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx);
+#if defined(DUK_USE_JX)
+DUK_LOCAL_DECL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx);
+#endif
+DUK_LOCAL_DECL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n);
+DUK_LOCAL_DECL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx);
+DUK_LOCAL_DECL void duk__dec_string(duk_json_dec_ctx *js_ctx);
+#if defined(DUK_USE_JX)
+DUK_LOCAL_DECL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_pointer(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_buffer(duk_json_dec_ctx *js_ctx);
+#endif
+DUK_LOCAL_DECL void duk__dec_number(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_object(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_array(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_value(duk_json_dec_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx);
+
+DUK_LOCAL_DECL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch);
+DUK_LOCAL_DECL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2);
+DUK_LOCAL_DECL void duk__unemit_1(duk_json_enc_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h);
+#if defined(DUK_USE_FASTINT)
+DUK_LOCAL_DECL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *p);
+#endif
+DUK_LOCAL_DECL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx);
+DUK_LOCAL_DECL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q);
+DUK_LOCAL_DECL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k);
+DUK_LOCAL_DECL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str);
+DUK_LOCAL_DECL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top);
+DUK_LOCAL_DECL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top);
+DUK_LOCAL_DECL void duk__enc_object(duk_json_enc_ctx *js_ctx);
+DUK_LOCAL_DECL void duk__enc_array(duk_json_enc_ctx *js_ctx);
+DUK_LOCAL_DECL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder);
+DUK_LOCAL_DECL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv);
+DUK_LOCAL_DECL void duk__enc_double(duk_json_enc_ctx *js_ctx);
+#if defined(DUK_USE_FASTINT)
+DUK_LOCAL_DECL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv);
+#endif
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+DUK_LOCAL_DECL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h);
+DUK_LOCAL_DECL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_LOCAL_DECL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj);
+#endif
+#endif
+#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)
+DUK_LOCAL_DECL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h);
+#endif
+DUK_LOCAL_DECL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth);
+
+/*
+ * Helper tables
+ */
+
+#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH)
+DUK_LOCAL const duk_uint8_t duk__json_quotestr_lookup[256] = {
+ /* 0x00 ... 0x7f: as is
+ * 0x80: escape generically
+ * 0x81: slow path
+ * 0xa0 ... 0xff: backslash + one char
+ */
+
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xe2, 0xf4, 0xee, 0x80, 0xe6, 0xf2, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x20, 0x21, 0xa2, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0xdc, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81
+};
+#else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */
+DUK_LOCAL const duk_uint8_t duk__json_quotestr_esc[14] = {
+ DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL,
+ DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL,
+ DUK_ASC_LC_B, DUK_ASC_LC_T, DUK_ASC_LC_N, DUK_ASC_NUL,
+ DUK_ASC_LC_F, DUK_ASC_LC_R
+};
+#endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */
+
+#if defined(DUK_USE_JSON_DECSTRING_FASTPATH)
+DUK_LOCAL const duk_uint8_t duk__json_decstr_lookup[256] = {
+ /* 0x00: slow path
+ * other: as is
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x21, 0x00, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x00, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+#endif /* DUK_USE_JSON_DECSTRING_FASTPATH */
+
+#if defined(DUK_USE_JSON_EATWHITE_FASTPATH)
+DUK_LOCAL const duk_uint8_t duk__json_eatwhite_lookup[256] = {
+ /* 0x00: finish (non-white)
+ * 0x01: continue
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+#endif /* DUK_USE_JSON_EATWHITE_FASTPATH */
+
+#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH)
+DUK_LOCAL const duk_uint8_t duk__json_decnumber_lookup[256] = {
+ /* 0x00: finish (not part of number)
+ * 0x01: continue
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+#endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */
+
+/*
+ * Parsing implementation.
+ *
+ * JSON lexer is now separate from duk_lexer.c because there are numerous
+ * small differences making it difficult to share the lexer.
+ *
+ * The parser here works with raw bytes directly; this works because all
+ * JSON delimiters are ASCII characters. Invalid xUTF-8 encoded values
+ * inside strings will be passed on without normalization; this is not a
+ * compliance concern because compliant inputs will always be valid
+ * CESU-8 encodings.
+ */
+
+DUK_LOCAL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx) {
+ /* Shared handler to minimize parser size. Cause will be
+ * hidden, unfortunately, but we'll have an offset which
+ * is often quite enough.
+ */
+ DUK_ERROR_FMT1(js_ctx->thr, DUK_ERR_SYNTAX_ERROR, DUK_STR_FMT_INVALID_JSON,
+ (long) (js_ctx->p - js_ctx->p_start));
+}
+
+DUK_LOCAL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx) {
+ const duk_uint8_t *p;
+ duk_uint8_t t;
+
+ p = js_ctx->p;
+ for (;;) {
+ DUK_ASSERT(p <= js_ctx->p_end);
+ t = *p;
+
+#if defined(DUK_USE_JSON_EATWHITE_FASTPATH)
+ /* This fast path is pretty marginal in practice.
+ * XXX: candidate for removal.
+ */
+ DUK_ASSERT(duk__json_eatwhite_lookup[0x00] == 0x00); /* end-of-input breaks */
+ if (duk__json_eatwhite_lookup[t] == 0) {
+ break;
+ }
+#else /* DUK_USE_JSON_EATWHITE_FASTPATH */
+ if (!(t == 0x20 || t == 0x0a || t == 0x0d || t == 0x09)) {
+ /* NUL also comes here. Comparison order matters, 0x20
+ * is most common whitespace.
+ */
+ break;
+ }
+#endif /* DUK_USE_JSON_EATWHITE_FASTPATH */
+ p++;
+ }
+ js_ctx->p = p;
+}
+
+#if defined(DUK_USE_JX)
+DUK_LOCAL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx) {
+ DUK_ASSERT(js_ctx->p <= js_ctx->p_end);
+ return *js_ctx->p;
+}
+#endif
+
+DUK_LOCAL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx) {
+ DUK_ASSERT(js_ctx->p <= js_ctx->p_end);
+ return *js_ctx->p++;
+}
+
+DUK_LOCAL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx) {
+ duk__dec_eat_white(js_ctx);
+ return duk__dec_get(js_ctx);
+}
+
+/* For JX, expressing the whole unsigned 32-bit range matters. */
+DUK_LOCAL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n) {
+ duk_small_uint_t i;
+ duk_uint_fast32_t res = 0;
+ duk_uint8_t x;
+ duk_small_int_t t;
+
+ for (i = 0; i < n; i++) {
+ /* XXX: share helper from lexer; duk_lexer.c / hexval(). */
+
+ x = duk__dec_get(js_ctx);
+ DUK_DDD(DUK_DDDPRINT("decode_hex_escape: i=%ld, n=%ld, res=%ld, x=%ld",
+ (long) i, (long) n, (long) res, (long) x));
+
+ /* x == 0x00 (EOF) causes syntax_error */
+ DUK_ASSERT(duk_hex_dectab[0] == -1);
+ t = duk_hex_dectab[x & 0xff];
+ if (DUK_LIKELY(t >= 0)) {
+ res = (res * 16) + (duk_uint_fast32_t) t;
+ } else {
+ /* catches EOF and invalid digits */
+ goto syntax_error;
+ }
+ }
+
+ DUK_DDD(DUK_DDDPRINT("final hex decoded value: %ld", (long) res));
+ return res;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+ return 0;
+}
+
+DUK_LOCAL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx) {
+ duk_hstring *h;
+ const duk_uint8_t *p;
+ duk_uint8_t x, y;
+
+ /* First character has already been eaten and checked by the caller.
+ * We can scan until a NUL in stridx string because no built-in strings
+ * have internal NULs.
+ */
+
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx);
+ DUK_ASSERT(h != NULL);
+
+ p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h) + 1;
+ DUK_ASSERT(*(js_ctx->p - 1) == *(p - 1)); /* first character has been matched */
+
+ for (;;) {
+ x = *p;
+ if (x == 0) {
+ break;
+ }
+ y = duk__dec_get(js_ctx);
+ if (x != y) {
+ /* Catches EOF of JSON input. */
+ goto syntax_error;
+ }
+ p++;
+ }
+
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+
+DUK_LOCAL duk_small_int_t duk__dec_string_escape(duk_json_dec_ctx *js_ctx, duk_uint8_t **ext_p) {
+ duk_uint_fast32_t cp;
+
+ /* EOF (-1) will be cast to an unsigned value first
+ * and then re-cast for the switch. In any case, it
+ * will match the default case (syntax error).
+ */
+ cp = (duk_uint_fast32_t) duk__dec_get(js_ctx);
+ switch (cp) {
+ case DUK_ASC_BACKSLASH: break;
+ case DUK_ASC_DOUBLEQUOTE: break;
+ case DUK_ASC_SLASH: break;
+ case DUK_ASC_LC_T: cp = 0x09; break;
+ case DUK_ASC_LC_N: cp = 0x0a; break;
+ case DUK_ASC_LC_R: cp = 0x0d; break;
+ case DUK_ASC_LC_F: cp = 0x0c; break;
+ case DUK_ASC_LC_B: cp = 0x08; break;
+ case DUK_ASC_LC_U: {
+ cp = duk__dec_decode_hex_escape(js_ctx, 4);
+ break;
+ }
+#if defined(DUK_USE_JX)
+ case DUK_ASC_UC_U: {
+ if (js_ctx->flag_ext_custom) {
+ cp = duk__dec_decode_hex_escape(js_ctx, 8);
+ } else {
+ return 1; /* syntax error */
+ }
+ break;
+ }
+ case DUK_ASC_LC_X: {
+ if (js_ctx->flag_ext_custom) {
+ cp = duk__dec_decode_hex_escape(js_ctx, 2);
+ } else {
+ return 1; /* syntax error */
+ }
+ break;
+ }
+#endif /* DUK_USE_JX */
+ default:
+ /* catches EOF (0x00) */
+ return 1; /* syntax error */
+ }
+
+ DUK_RAW_WRITE_XUTF8(*ext_p, cp);
+
+ return 0;
+}
+
+DUK_LOCAL void duk__dec_string(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_bufwriter_ctx bw_alloc;
+ duk_bufwriter_ctx *bw;
+ duk_uint8_t *q;
+
+ /* '"' was eaten by caller */
+
+ /* Note that we currently parse -bytes-, not codepoints.
+ * All non-ASCII extended UTF-8 will encode to bytes >= 0x80,
+ * so they'll simply pass through (valid UTF-8 or not).
+ */
+
+ bw = &bw_alloc;
+ DUK_BW_INIT_PUSHBUF(js_ctx->thr, bw, DUK__JSON_DECSTR_BUFSIZE);
+ q = DUK_BW_GET_PTR(js_ctx->thr, bw);
+
+#if defined(DUK_USE_JSON_DECSTRING_FASTPATH)
+ for (;;) {
+ duk_small_uint_t safe;
+ duk_uint8_t b, x;
+ const duk_uint8_t *p;
+
+ /* Select a safe loop count where no output checks are
+ * needed assuming we won't encounter escapes. Input
+ * bound checks are not necessary as a NUL (guaranteed)
+ * will cause a SyntaxError before we read out of bounds.
+ */
+
+ safe = DUK__JSON_DECSTR_CHUNKSIZE;
+
+ /* Ensure space for 1:1 output plus one escape. */
+ q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, safe + DUK_UNICODE_MAX_XUTF8_LENGTH, q);
+
+ p = js_ctx->p; /* temp copy, write back for next loop */
+ for (;;) {
+ if (safe == 0) {
+ js_ctx->p = p;
+ break;
+ }
+ safe--;
+
+ /* End of input (NUL) goes through slow path and causes SyntaxError. */
+ DUK_ASSERT(duk__json_decstr_lookup[0] == 0x00);
+
+ b = *p++;
+ x = (duk_small_int_t) duk__json_decstr_lookup[b];
+ if (DUK_LIKELY(x != 0)) {
+ /* Fast path, decode as is. */
+ *q++ = b;
+ } else if (b == DUK_ASC_DOUBLEQUOTE) {
+ js_ctx->p = p;
+ goto found_quote;
+ } else if (b == DUK_ASC_BACKSLASH) {
+ /* We've ensured space for one escaped input; then
+ * bail out and recheck (this makes escape handling
+ * quite slow but it's uncommon).
+ */
+ js_ctx->p = p;
+ if (duk__dec_string_escape(js_ctx, &q) != 0) {
+ goto syntax_error;
+ }
+ break;
+ } else {
+ js_ctx->p = p;
+ goto syntax_error;
+ }
+ }
+ }
+ found_quote:
+#else /* DUK_USE_JSON_DECSTRING_FASTPATH */
+ for (;;) {
+ duk_uint8_t x;
+
+ q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, DUK_UNICODE_MAX_XUTF8_LENGTH, q);
+
+ x = duk__dec_get(js_ctx);
+
+ if (x == DUK_ASC_DOUBLEQUOTE) {
+ break;
+ } else if (x == DUK_ASC_BACKSLASH) {
+ if (duk__dec_string_escape(js_ctx, &q) != 0) {
+ goto syntax_error;
+ }
+ } else if (x < 0x20) {
+ /* catches EOF (NUL) */
+ goto syntax_error;
+ } else {
+ *q++ = (duk_uint8_t) x;
+ }
+ }
+#endif /* DUK_USE_JSON_DECSTRING_FASTPATH */
+
+ DUK_BW_SETPTR_AND_COMPACT(js_ctx->thr, bw, q);
+ (void) duk_buffer_to_string(thr, -1); /* Safe if input string is safe. */
+
+ /* [ ... str ] */
+
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+
+#if defined(DUK_USE_JX)
+/* Decode a plain string consisting entirely of identifier characters.
+ * Used to parse plain keys (e.g. "foo: 123").
+ */
+DUK_LOCAL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ const duk_uint8_t *p;
+ duk_small_int_t x;
+
+ /* Caller has already eaten the first char so backtrack one byte. */
+
+ js_ctx->p--; /* safe */
+ p = js_ctx->p;
+
+ /* Here again we parse bytes, and non-ASCII UTF-8 will cause end of
+ * parsing (which is correct except if there are non-shortest encodings).
+ * There is also no need to check explicitly for end of input buffer as
+ * the input is NUL padded and NUL will exit the parsing loop.
+ *
+ * Because no unescaping takes place, we can just scan to the end of the
+ * plain string and intern from the input buffer.
+ */
+
+ for (;;) {
+ x = *p;
+
+ /* There is no need to check the first character specially here
+ * (i.e. reject digits): the caller only accepts valid initial
+ * characters and won't call us if the first character is a digit.
+ * This also ensures that the plain string won't be empty.
+ */
+
+ if (!duk_unicode_is_identifier_part((duk_codepoint_t) x)) {
+ break;
+ }
+ p++;
+ }
+
+ duk_push_lstring(thr, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p));
+ js_ctx->p = p;
+
+ /* [ ... str ] */
+}
+#endif /* DUK_USE_JX */
+
+#if defined(DUK_USE_JX)
+DUK_LOCAL void duk__dec_pointer(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ const duk_uint8_t *p;
+ duk_small_int_t x;
+ void *voidptr;
+
+ /* Caller has already eaten the first character ('(') which we don't need. */
+
+ p = js_ctx->p;
+
+ for (;;) {
+ x = *p;
+
+ /* Assume that the native representation never contains a closing
+ * parenthesis.
+ */
+
+ if (x == DUK_ASC_RPAREN) {
+ break;
+ } else if (x <= 0) {
+ /* NUL term or -1 (EOF), NUL check would suffice */
+ goto syntax_error;
+ }
+ p++;
+ }
+
+ /* There is no need to NUL delimit the sscanf() call: trailing garbage is
+ * ignored and there is always a NUL terminator which will force an error
+ * if no error is encountered before it. It's possible that the scan
+ * would scan further than between [js_ctx->p,p[ though and we'd advance
+ * by less than the scanned value.
+ *
+ * Because pointers are platform specific, a failure to scan a pointer
+ * results in a null pointer which is a better placeholder than a missing
+ * value or an error.
+ */
+
+ voidptr = NULL;
+ (void) DUK_SSCANF((const char *) js_ctx->p, DUK_STR_FMT_PTR, &voidptr);
+ duk_push_pointer(thr, voidptr);
+ js_ctx->p = p + 1; /* skip ')' */
+
+ /* [ ... ptr ] */
+
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+#endif /* DUK_USE_JX */
+
+#if defined(DUK_USE_JX)
+DUK_LOCAL void duk__dec_buffer(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ const duk_uint8_t *p;
+ duk_uint8_t *buf;
+ duk_size_t src_len;
+ duk_small_int_t x;
+
+ /* Caller has already eaten the first character ('|') which we don't need. */
+
+ p = js_ctx->p;
+
+ /* XXX: Would be nice to share the fast path loop from duk_hex_decode()
+ * and avoid creating a temporary buffer. However, there are some
+ * differences which prevent trivial sharing:
+ *
+ * - Pipe char detection
+ * - EOF detection
+ * - Unknown length of input and output
+ *
+ * The best approach here would be a bufwriter and a reasonaly sized
+ * safe inner loop (e.g. 64 output bytes at a time).
+ */
+
+ for (;;) {
+ x = *p;
+
+ /* This loop intentionally does not ensure characters are valid
+ * ([0-9a-fA-F]) because the hex decode call below will do that.
+ */
+ if (x == DUK_ASC_PIPE) {
+ break;
+ } else if (x <= 0) {
+ /* NUL term or -1 (EOF), NUL check would suffice */
+ goto syntax_error;
+ }
+ p++;
+ }
+
+ /* XXX: this is not very nice; unnecessary copy is made. */
+ src_len = (duk_size_t) (p - js_ctx->p);
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_len);
+ DUK_ASSERT(buf != NULL);
+ DUK_MEMCPY((void *) buf, (const void *) js_ctx->p, src_len);
+ duk_hex_decode(thr, -1);
+
+ js_ctx->p = p + 1; /* skip '|' */
+
+ /* [ ... buf ] */
+
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+#endif /* DUK_USE_JX */
+
+/* Parse a number, other than NaN or +/- Infinity */
+DUK_LOCAL void duk__dec_number(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ const duk_uint8_t *p_start;
+ const duk_uint8_t *p;
+ duk_uint8_t x;
+ duk_small_uint_t s2n_flags;
+
+ DUK_DDD(DUK_DDDPRINT("parse_number"));
+
+ p_start = js_ctx->p;
+
+ /* First pass parse is very lenient (e.g. allows '1.2.3') and extracts a
+ * string for strict number parsing.
+ */
+
+ p = js_ctx->p;
+ for (;;) {
+ x = *p;
+
+ DUK_DDD(DUK_DDDPRINT("parse_number: p_start=%p, p=%p, p_end=%p, x=%ld",
+ (const void *) p_start, (const void *) p,
+ (const void *) js_ctx->p_end, (long) x));
+
+#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH)
+ /* This fast path is pretty marginal in practice.
+ * XXX: candidate for removal.
+ */
+ DUK_ASSERT(duk__json_decnumber_lookup[0x00] == 0x00); /* end-of-input breaks */
+ if (duk__json_decnumber_lookup[x] == 0) {
+ break;
+ }
+#else /* DUK_USE_JSON_DECNUMBER_FASTPATH */
+ if (!((x >= DUK_ASC_0 && x <= DUK_ASC_9) ||
+ (x == DUK_ASC_PERIOD || x == DUK_ASC_LC_E ||
+ x == DUK_ASC_UC_E || x == DUK_ASC_MINUS || x == DUK_ASC_PLUS))) {
+ /* Plus sign must be accepted for positive exponents
+ * (e.g. '1.5e+2'). This clause catches NULs.
+ */
+ break;
+ }
+#endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */
+ p++; /* safe, because matched (NUL causes a break) */
+ }
+ js_ctx->p = p;
+
+ DUK_ASSERT(js_ctx->p > p_start);
+ duk_push_lstring(thr, (const char *) p_start, (duk_size_t) (p - p_start));
+
+ s2n_flags = DUK_S2N_FLAG_ALLOW_EXP |
+ DUK_S2N_FLAG_ALLOW_MINUS | /* but don't allow leading plus */
+ DUK_S2N_FLAG_ALLOW_FRAC;
+
+ DUK_DDD(DUK_DDDPRINT("parse_number: string before parsing: %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_numconv_parse(thr, 10 /*radix*/, s2n_flags);
+ if (duk_is_nan(thr, -1)) {
+ duk__dec_syntax_error(js_ctx);
+ }
+ DUK_ASSERT(duk_is_number(thr, -1));
+ DUK_DDD(DUK_DDDPRINT("parse_number: final number: %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* [ ... num ] */
+}
+
+DUK_LOCAL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_require_stack(thr, DUK_JSON_DEC_REQSTACK);
+
+ /* c recursion check */
+
+ DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ if (js_ctx->recursion_depth >= js_ctx->recursion_limit) {
+ DUK_ERROR_RANGE(thr, DUK_STR_JSONDEC_RECLIMIT);
+ }
+ js_ctx->recursion_depth++;
+}
+
+DUK_LOCAL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx) {
+ /* c recursion check */
+
+ DUK_ASSERT(js_ctx->recursion_depth > 0);
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ js_ctx->recursion_depth--;
+}
+
+DUK_LOCAL void duk__dec_object(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_int_t key_count; /* XXX: a "first" flag would suffice */
+ duk_uint8_t x;
+
+ DUK_DDD(DUK_DDDPRINT("parse_object"));
+
+ duk__dec_objarr_entry(js_ctx);
+
+ duk_push_object(thr);
+
+ /* Initial '{' has been checked and eaten by caller. */
+
+ key_count = 0;
+ for (;;) {
+ x = duk__dec_get_nonwhite(js_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("parse_object: obj=%!T, x=%ld, key_count=%ld",
+ (duk_tval *) duk_get_tval(thr, -1),
+ (long) x, (long) key_count));
+
+ /* handle comma and closing brace */
+
+ if (x == DUK_ASC_COMMA && key_count > 0) {
+ /* accept comma, expect new value */
+ x = duk__dec_get_nonwhite(js_ctx);
+ } else if (x == DUK_ASC_RCURLY) {
+ /* eat closing brace */
+ break;
+ } else if (key_count == 0) {
+ /* accept anything, expect first value (EOF will be
+ * caught by key parsing below.
+ */
+ ;
+ } else {
+ /* catches EOF (NUL) and initial comma */
+ goto syntax_error;
+ }
+
+ /* parse key and value */
+
+ if (x == DUK_ASC_DOUBLEQUOTE) {
+ duk__dec_string(js_ctx);
+#if defined(DUK_USE_JX)
+ } else if (js_ctx->flag_ext_custom &&
+ duk_unicode_is_identifier_start((duk_codepoint_t) x)) {
+ duk__dec_plain_string(js_ctx);
+#endif
+ } else {
+ goto syntax_error;
+ }
+
+ /* [ ... obj key ] */
+
+ x = duk__dec_get_nonwhite(js_ctx);
+ if (x != DUK_ASC_COLON) {
+ goto syntax_error;
+ }
+
+ duk__dec_value(js_ctx);
+
+ /* [ ... obj key val ] */
+
+ duk_xdef_prop_wec(thr, -3);
+
+ /* [ ... obj ] */
+
+ key_count++;
+ }
+
+ /* [ ... obj ] */
+
+ DUK_DDD(DUK_DDDPRINT("parse_object: final object is %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk__dec_objarr_exit(js_ctx);
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+
+DUK_LOCAL void duk__dec_array(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_uarridx_t arr_idx;
+ duk_uint8_t x;
+
+ DUK_DDD(DUK_DDDPRINT("parse_array"));
+
+ duk__dec_objarr_entry(js_ctx);
+
+ duk_push_array(thr);
+
+ /* Initial '[' has been checked and eaten by caller. */
+
+ arr_idx = 0;
+ for (;;) {
+ x = duk__dec_get_nonwhite(js_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("parse_array: arr=%!T, x=%ld, arr_idx=%ld",
+ (duk_tval *) duk_get_tval(thr, -1),
+ (long) x, (long) arr_idx));
+
+ /* handle comma and closing bracket */
+
+ if ((x == DUK_ASC_COMMA) && (arr_idx != 0)) {
+ /* accept comma, expect new value */
+ ;
+ } else if (x == DUK_ASC_RBRACKET) {
+ /* eat closing bracket */
+ break;
+ } else if (arr_idx == 0) {
+ /* accept anything, expect first value (EOF will be
+ * caught by duk__dec_value() below.
+ */
+ js_ctx->p--; /* backtrack (safe) */
+ } else {
+ /* catches EOF (NUL) and initial comma */
+ goto syntax_error;
+ }
+
+ /* parse value */
+
+ duk__dec_value(js_ctx);
+
+ /* [ ... arr val ] */
+
+ duk_xdef_prop_index_wec(thr, -2, arr_idx);
+ arr_idx++;
+ }
+
+ /* Must set 'length' explicitly when using duk_xdef_prop_xxx() to
+ * set the values.
+ */
+
+ duk_set_length(thr, -1, arr_idx);
+
+ /* [ ... arr ] */
+
+ DUK_DDD(DUK_DDDPRINT("parse_array: final array is %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk__dec_objarr_exit(js_ctx);
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+
+DUK_LOCAL void duk__dec_value(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_uint8_t x;
+
+ x = duk__dec_get_nonwhite(js_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("parse_value: initial x=%ld", (long) x));
+
+ /* Note: duk__dec_req_stridx() backtracks one char */
+
+ if (x == DUK_ASC_DOUBLEQUOTE) {
+ duk__dec_string(js_ctx);
+ } else if ((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x == DUK_ASC_MINUS)) {
+#if defined(DUK_USE_JX)
+ if (js_ctx->flag_ext_custom && x == DUK_ASC_MINUS && duk__dec_peek(js_ctx) == DUK_ASC_UC_I) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_MINUS_INFINITY); /* "-Infinity", '-' has been eaten */
+ duk_push_number(thr, -DUK_DOUBLE_INFINITY);
+ } else {
+#else
+ { /* unconditional block */
+#endif
+ /* We already ate 'x', so backup one byte. */
+ js_ctx->p--; /* safe */
+ duk__dec_number(js_ctx);
+ }
+ } else if (x == DUK_ASC_LC_T) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_TRUE);
+ duk_push_true(thr);
+ } else if (x == DUK_ASC_LC_F) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_FALSE);
+ duk_push_false(thr);
+ } else if (x == DUK_ASC_LC_N) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_NULL);
+ duk_push_null(thr);
+#if defined(DUK_USE_JX)
+ } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LC_U) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_UNDEFINED);
+ duk_push_undefined(thr);
+ } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_N) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_NAN);
+ duk_push_nan(thr);
+ } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_I) {
+ duk__dec_req_stridx(js_ctx, DUK_STRIDX_INFINITY);
+ duk_push_number(thr, DUK_DOUBLE_INFINITY);
+ } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LPAREN) {
+ duk__dec_pointer(js_ctx);
+ } else if (js_ctx->flag_ext_custom && x == DUK_ASC_PIPE) {
+ duk__dec_buffer(js_ctx);
+#endif
+ } else if (x == DUK_ASC_LCURLY) {
+ duk__dec_object(js_ctx);
+ } else if (x == DUK_ASC_LBRACKET) {
+ duk__dec_array(js_ctx);
+ } else {
+ /* catches EOF (NUL) */
+ goto syntax_error;
+ }
+
+ duk__dec_eat_white(js_ctx);
+
+ /* [ ... val ] */
+ return;
+
+ syntax_error:
+ duk__dec_syntax_error(js_ctx);
+ DUK_UNREACHABLE();
+}
+
+/* Recursive value reviver, implements the Walk() algorithm. No C recursion
+ * check is done here because the initial parsing step will already ensure
+ * there is a reasonable limit on C recursion depth and hence object depth.
+ */
+DUK_LOCAL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_hobject *h;
+ duk_uarridx_t i, arr_len;
+
+ DUK_DDD(DUK_DDDPRINT("walk: top=%ld, holder=%!T, name=%!T",
+ (long) duk_get_top(thr),
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk_dup_top(thr);
+ duk_get_prop(thr, -3); /* -> [ ... holder name val ] */
+
+ h = duk_get_hobject(thr, -1);
+ if (h != NULL) {
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) {
+ arr_len = (duk_uarridx_t) duk_get_length(thr, -1);
+ for (i = 0; i < arr_len; i++) {
+ /* [ ... holder name val ] */
+
+ DUK_DDD(DUK_DDDPRINT("walk: array, top=%ld, i=%ld, arr_len=%ld, holder=%!T, name=%!T, val=%!T",
+ (long) duk_get_top(thr), (long) i, (long) arr_len,
+ (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk_dup_top(thr);
+ (void) duk_push_uint_to_hstring(thr, (duk_uint_t) i); /* -> [ ... holder name val val ToString(i) ] */
+ duk__dec_reviver_walk(js_ctx); /* -> [ ... holder name val new_elem ] */
+
+ if (duk_is_undefined(thr, -1)) {
+ duk_pop(thr);
+ duk_del_prop_index(thr, -1, i);
+ } else {
+ /* XXX: duk_xdef_prop_index_wec() would be more appropriate
+ * here but it currently makes some assumptions that might
+ * not hold (e.g. that previous property is not an accessor).
+ */
+ duk_put_prop_index(thr, -2, i);
+ }
+ }
+ } else {
+ /* [ ... holder name val ] */
+ duk_enum(thr, -1, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/);
+ while (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) {
+ DUK_DDD(DUK_DDDPRINT("walk: object, top=%ld, holder=%!T, name=%!T, val=%!T, enum=%!iT, obj_key=%!T",
+ (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -5),
+ (duk_tval *) duk_get_tval(thr, -4), (duk_tval *) duk_get_tval(thr, -3),
+ (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* [ ... holder name val enum obj_key ] */
+ duk_dup_m3(thr);
+ duk_dup_m2(thr);
+
+ /* [ ... holder name val enum obj_key val obj_key ] */
+ duk__dec_reviver_walk(js_ctx);
+
+ /* [ ... holder name val enum obj_key new_elem ] */
+ if (duk_is_undefined(thr, -1)) {
+ duk_pop(thr);
+ duk_del_prop(thr, -3);
+ } else {
+ /* XXX: duk_xdef_prop_index_wec() would be more appropriate
+ * here but it currently makes some assumptions that might
+ * not hold (e.g. that previous property is not an accessor).
+ *
+ * Using duk_put_prop() works incorrectly with '__proto__'
+ * if the own property with that name has been deleted. This
+ * does not happen normally, but a clever reviver can trigger
+ * that, see complex reviver case in: test-bug-json-parse-__proto__.js.
+ */
+ duk_put_prop(thr, -4);
+ }
+ }
+ duk_pop(thr); /* pop enum */
+ }
+ }
+
+ /* [ ... holder name val ] */
+
+ duk_dup(thr, js_ctx->idx_reviver);
+ duk_insert(thr, -4); /* -> [ ... reviver holder name val ] */
+ duk_call_method(thr, 2); /* -> [ ... res ] */
+
+ DUK_DDD(DUK_DDDPRINT("walk: top=%ld, result=%!T",
+ (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -1)));
+}
+
+/*
+ * Stringify implementation.
+ */
+
+#define DUK__EMIT_1(js_ctx,ch) duk__emit_1((js_ctx), (duk_uint_fast8_t) (ch))
+#define DUK__EMIT_2(js_ctx,ch1,ch2) duk__emit_2((js_ctx), (duk_uint_fast8_t) (ch1), (duk_uint_fast8_t) (ch2))
+#define DUK__EMIT_HSTR(js_ctx,h) duk__emit_hstring((js_ctx), (h))
+#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC)
+#define DUK__EMIT_CSTR(js_ctx,p) duk__emit_cstring((js_ctx), (p))
+#endif
+#define DUK__EMIT_STRIDX(js_ctx,i) duk__emit_stridx((js_ctx), (i))
+#define DUK__UNEMIT_1(js_ctx) duk__unemit_1((js_ctx))
+
+DUK_LOCAL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch) {
+ DUK_BW_WRITE_ENSURE_U8(js_ctx->thr, &js_ctx->bw, ch);
+}
+
+DUK_LOCAL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2) {
+ DUK_BW_WRITE_ENSURE_U8_2(js_ctx->thr, &js_ctx->bw, ch1, ch2);
+}
+
+DUK_LOCAL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h) {
+ DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h);
+}
+
+#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC)
+DUK_LOCAL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *str) {
+ DUK_BW_WRITE_ENSURE_CSTRING(js_ctx->thr, &js_ctx->bw, str);
+}
+#endif
+
+DUK_LOCAL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx) {
+ duk_hstring *h;
+
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx);
+ DUK_ASSERT(h != NULL);
+
+ DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h);
+}
+
+DUK_LOCAL void duk__unemit_1(duk_json_enc_ctx *js_ctx) {
+ DUK_ASSERT(DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw) >= 1);
+ DUK_BW_ADD_PTR(js_ctx->thr, &js_ctx->bw, -1);
+}
+
+#define DUK__MKESC(nybbles,esc1,esc2) \
+ (((duk_uint_fast32_t) (nybbles)) << 16) | \
+ (((duk_uint_fast32_t) (esc1)) << 8) | \
+ ((duk_uint_fast32_t) (esc2))
+
+DUK_LOCAL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q) {
+ duk_uint_fast32_t tmp;
+ duk_small_uint_t dig;
+
+ DUK_UNREF(js_ctx);
+
+ /* Caller ensures space for at least DUK__JSON_MAX_ESC_LEN. */
+
+ /* Select appropriate escape format automatically, and set 'tmp' to a
+ * value encoding both the escape format character and the nybble count:
+ *
+ * (nybble_count << 16) | (escape_char1) | (escape_char2)
+ */
+
+#if defined(DUK_USE_JX)
+ if (DUK_LIKELY(cp < 0x100UL)) {
+ if (DUK_UNLIKELY(js_ctx->flag_ext_custom != 0U)) {
+ tmp = DUK__MKESC(2, DUK_ASC_BACKSLASH, DUK_ASC_LC_X);
+ } else {
+ tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U);
+ }
+ } else
+#endif
+ if (DUK_LIKELY(cp < 0x10000UL)) {
+ tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U);
+ } else {
+#if defined(DUK_USE_JX)
+ if (DUK_LIKELY(js_ctx->flag_ext_custom != 0U)) {
+ tmp = DUK__MKESC(8, DUK_ASC_BACKSLASH, DUK_ASC_UC_U);
+ } else
+#endif
+ {
+ /* In compatible mode and standard JSON mode, output
+ * something useful for non-BMP characters. This won't
+ * roundtrip but will still be more or less readable and
+ * more useful than an error.
+ */
+ tmp = DUK__MKESC(8, DUK_ASC_UC_U, DUK_ASC_PLUS);
+ }
+ }
+
+ *q++ = (duk_uint8_t) ((tmp >> 8) & 0xff);
+ *q++ = (duk_uint8_t) (tmp & 0xff);
+
+ tmp = tmp >> 16;
+ while (tmp > 0) {
+ tmp--;
+ dig = (duk_small_uint_t) ((cp >> (4 * tmp)) & 0x0f);
+ *q++ = duk_lc_digits[dig];
+ }
+
+ return q;
+}
+
+DUK_LOCAL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k) {
+ const duk_int8_t *p, *p_start, *p_end; /* Note: intentionally signed. */
+ duk_size_t k_len;
+ duk_codepoint_t cp;
+
+ DUK_ASSERT(k != NULL);
+
+ /* Accept ASCII strings which conform to identifier requirements
+ * as being emitted without key quotes. Since we only accept ASCII
+ * there's no need for actual decoding: 'p' is intentionally signed
+ * so that bytes >= 0x80 extend to negative values and are rejected
+ * as invalid identifier codepoints.
+ */
+
+ if (js_ctx->flag_avoid_key_quotes) {
+ k_len = DUK_HSTRING_GET_BYTELEN(k);
+ p_start = (const duk_int8_t *) DUK_HSTRING_GET_DATA(k);
+ p_end = p_start + k_len;
+ p = p_start;
+
+ if (p == p_end) {
+ /* Zero length string is not accepted without quotes */
+ goto quote_normally;
+ }
+ cp = (duk_codepoint_t) (*p++);
+ if (DUK_UNLIKELY(!duk_unicode_is_identifier_start(cp))) {
+ goto quote_normally;
+ }
+ while (p < p_end) {
+ cp = (duk_codepoint_t) (*p++);
+ if (DUK_UNLIKELY(!duk_unicode_is_identifier_part(cp))) {
+ goto quote_normally;
+ }
+ }
+
+ /* This seems faster than emitting bytes one at a time and
+ * then potentially rewinding.
+ */
+ DUK__EMIT_HSTR(js_ctx, k);
+ return;
+ }
+
+ quote_normally:
+ duk__enc_quote_string(js_ctx, k);
+}
+
+/* The Quote(value) operation: quote a string.
+ *
+ * Stack policy: [ ] -> [ ].
+ */
+
+DUK_LOCAL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str) {
+ duk_hthread *thr = js_ctx->thr;
+ const duk_uint8_t *p, *p_start, *p_end, *p_now, *p_tmp;
+ duk_uint8_t *q;
+ duk_ucodepoint_t cp; /* typed for duk_unicode_decode_xutf8() */
+
+ DUK_DDD(DUK_DDDPRINT("duk__enc_quote_string: h_str=%!O", (duk_heaphdr *) h_str));
+
+ DUK_ASSERT(h_str != NULL);
+ p_start = DUK_HSTRING_GET_DATA(h_str);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_str);
+ p = p_start;
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE);
+
+ /* Encode string in small chunks, estimating the maximum expansion so that
+ * there's no need to ensure space while processing the chunk.
+ */
+
+ while (p < p_end) {
+ duk_size_t left, now, space;
+
+ left = (duk_size_t) (p_end - p);
+ now = (left > DUK__JSON_ENCSTR_CHUNKSIZE ?
+ DUK__JSON_ENCSTR_CHUNKSIZE : left);
+
+ /* Maximum expansion per input byte is 6:
+ * - invalid UTF-8 byte causes "\uXXXX" to be emitted (6/1 = 6).
+ * - 2-byte UTF-8 encodes as "\uXXXX" (6/2 = 3).
+ * - 4-byte UTF-8 encodes as "\Uxxxxxxxx" (10/4 = 2.5).
+ */
+ space = now * 6;
+ q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space);
+
+ p_now = p + now;
+
+ while (p < p_now) {
+#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH)
+ duk_uint8_t b;
+
+ b = duk__json_quotestr_lookup[*p++];
+ if (DUK_LIKELY(b < 0x80)) {
+ /* Most input bytes go through here. */
+ *q++ = b;
+ } else if (b >= 0xa0) {
+ *q++ = DUK_ASC_BACKSLASH;
+ *q++ = (duk_uint8_t) (b - 0x80);
+ } else if (b == 0x80) {
+ cp = (duk_ucodepoint_t) (*(p - 1));
+ q = duk__emit_esc_auto_fast(js_ctx, cp, q);
+ } else if (b == 0x7f && js_ctx->flag_ascii_only) {
+ /* 0x7F is special */
+ DUK_ASSERT(b == 0x81);
+ cp = (duk_ucodepoint_t) 0x7f;
+ q = duk__emit_esc_auto_fast(js_ctx, cp, q);
+ } else {
+ DUK_ASSERT(b == 0x81);
+ p--;
+
+ /* slow path is shared */
+#else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */
+ cp = *p;
+
+ if (DUK_LIKELY(cp <= 0x7f)) {
+ /* ascii fast path: avoid decoding utf-8 */
+ p++;
+ if (cp == 0x22 || cp == 0x5c) {
+ /* double quote or backslash */
+ *q++ = DUK_ASC_BACKSLASH;
+ *q++ = (duk_uint8_t) cp;
+ } else if (cp < 0x20) {
+ duk_uint_fast8_t esc_char;
+
+ /* This approach is a bit shorter than a straight
+ * if-else-ladder and also a bit faster.
+ */
+ if (cp < (sizeof(duk__json_quotestr_esc) / sizeof(duk_uint8_t)) &&
+ (esc_char = duk__json_quotestr_esc[cp]) != 0) {
+ *q++ = DUK_ASC_BACKSLASH;
+ *q++ = (duk_uint8_t) esc_char;
+ } else {
+ q = duk__emit_esc_auto_fast(js_ctx, cp, q);
+ }
+ } else if (cp == 0x7f && js_ctx->flag_ascii_only) {
+ q = duk__emit_esc_auto_fast(js_ctx, cp, q);
+ } else {
+ /* any other printable -> as is */
+ *q++ = (duk_uint8_t) cp;
+ }
+ } else {
+ /* slow path is shared */
+#endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */
+
+ /* slow path decode */
+
+ /* If XUTF-8 decoding fails, treat the offending byte as a codepoint directly
+ * and go forward one byte. This is of course very lossy, but allows some kind
+ * of output to be produced even for internal strings which don't conform to
+ * XUTF-8. All standard Ecmascript strings are always CESU-8, so this behavior
+ * does not violate the Ecmascript specification. The behavior is applied to
+ * all modes, including Ecmascript standard JSON. Because the current XUTF-8
+ * decoding is not very strict, this behavior only really affects initial bytes
+ * and truncated codepoints.
+ *
+ * Another alternative would be to scan forwards to start of next codepoint
+ * (or end of input) and emit just one replacement codepoint.
+ */
+
+ p_tmp = p;
+ if (!duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) {
+ /* Decode failed. */
+ cp = *p_tmp;
+ p = p_tmp + 1;
+ }
+
+#if defined(DUK_USE_NONSTD_JSON_ESC_U2028_U2029)
+ if (js_ctx->flag_ascii_only || cp == 0x2028 || cp == 0x2029) {
+#else
+ if (js_ctx->flag_ascii_only) {
+#endif
+ q = duk__emit_esc_auto_fast(js_ctx, cp, q);
+ } else {
+ /* as is */
+ DUK_RAW_WRITE_XUTF8(q, cp);
+ }
+ }
+ }
+
+ DUK_BW_SET_PTR(thr, &js_ctx->bw, q);
+ }
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE);
+}
+
+/* Encode a double (checked by caller) from stack top. Stack top may be
+ * replaced by serialized string but is not popped (caller does that).
+ */
+DUK_LOCAL void duk__enc_double(duk_json_enc_ctx *js_ctx) {
+ duk_hthread *thr;
+ duk_tval *tv;
+ duk_double_t d;
+ duk_small_int_t c;
+ duk_small_int_t s;
+ duk_small_uint_t stridx;
+ duk_small_uint_t n2s_flags;
+ duk_hstring *h_str;
+
+ DUK_ASSERT(js_ctx != NULL);
+ thr = js_ctx->thr;
+ DUK_ASSERT(thr != NULL);
+
+ /* Caller must ensure 'tv' is indeed a double and not a fastint! */
+ tv = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));
+ d = DUK_TVAL_GET_DOUBLE(tv);
+
+ c = (duk_small_int_t) DUK_FPCLASSIFY(d);
+ s = (duk_small_int_t) DUK_SIGNBIT(d);
+ DUK_UNREF(s);
+
+ if (DUK_LIKELY(!(c == DUK_FP_INFINITE || c == DUK_FP_NAN))) {
+ DUK_ASSERT(DUK_ISFINITE(d));
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ /* Negative zero needs special handling in JX/JC because
+ * it would otherwise serialize to '0', not '-0'.
+ */
+ if (DUK_UNLIKELY(c == DUK_FP_ZERO && s != 0 &&
+ (js_ctx->flag_ext_custom_or_compatible))) {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_ZERO); /* '-0' */
+ } else
+#endif /* DUK_USE_JX || DUK_USE_JC */
+ {
+ n2s_flags = 0;
+ /* [ ... number ] -> [ ... string ] */
+ duk_numconv_stringify(thr, 10 /*radix*/, 0 /*digits*/, n2s_flags);
+ }
+ h_str = duk_known_hstring(thr, -1);
+ DUK__EMIT_HSTR(js_ctx, h_str);
+ return;
+ }
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (!(js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |
+ DUK_JSON_FLAG_EXT_COMPATIBLE))) {
+ stridx = DUK_STRIDX_LC_NULL;
+ } else if (c == DUK_FP_NAN) {
+ stridx = js_ctx->stridx_custom_nan;
+ } else if (s == 0) {
+ stridx = js_ctx->stridx_custom_posinf;
+ } else {
+ stridx = js_ctx->stridx_custom_neginf;
+ }
+#else
+ stridx = DUK_STRIDX_LC_NULL;
+#endif
+ DUK__EMIT_STRIDX(js_ctx, stridx);
+}
+
+#if defined(DUK_USE_FASTINT)
+/* Encode a fastint from duk_tval ptr, no value stack effects. */
+DUK_LOCAL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv) {
+ duk_int64_t v;
+
+ /* Fastint range is signed 48-bit so longest value is -2^47 = -140737488355328
+ * (16 chars long), longest signed 64-bit value is -2^63 = -9223372036854775808
+ * (20 chars long). Alloc space for 64-bit range to be safe.
+ */
+ duk_uint8_t buf[20 + 1];
+
+ /* Caller must ensure 'tv' is indeed a fastint! */
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));
+ v = DUK_TVAL_GET_FASTINT(tv);
+
+ /* XXX: There are no format strings in duk_config.h yet, could add
+ * one for formatting duk_int64_t. For now, assumes "%lld" and that
+ * "long long" type exists. Could also rely on C99 directly but that
+ * won't work for older MSVC.
+ */
+ DUK_SPRINTF((char *) buf, "%lld", (long long) v);
+ DUK__EMIT_CSTR(js_ctx, (const char *) buf);
+}
+#endif
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+#if defined(DUK_USE_HEX_FASTPATH)
+DUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) {
+ duk_uint8_t *q;
+ duk_uint16_t *q16;
+ duk_small_uint_t x;
+ duk_size_t i, len_safe;
+#if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)
+ duk_bool_t shift_dst;
+#endif
+
+ /* Unlike in duk_hex_encode() 'dst' is not necessarily aligned by 2.
+ * For platforms where unaligned accesses are not allowed, shift 'dst'
+ * ahead by 1 byte to get alignment and then DUK_MEMMOVE() the result
+ * in place. The faster encoding loop makes up the difference.
+ * There's always space for one extra byte because a terminator always
+ * follows the hex data and that's been accounted for by the caller.
+ */
+
+#if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)
+ q16 = (duk_uint16_t *) (void *) dst;
+#else
+ shift_dst = (duk_bool_t) (((duk_size_t) dst) & 0x01U);
+ if (shift_dst) {
+ DUK_DD(DUK_DDPRINT("unaligned accesses not possible, dst not aligned -> step to dst + 1"));
+ q16 = (duk_uint16_t *) (void *) (dst + 1);
+ } else {
+ DUK_DD(DUK_DDPRINT("unaligned accesses not possible, dst is aligned"));
+ q16 = (duk_uint16_t *) (void *) dst;
+ }
+ DUK_ASSERT((((duk_size_t) q16) & 0x01U) == 0);
+#endif
+
+ len_safe = src_len & ~0x03U;
+ for (i = 0; i < len_safe; i += 4) {
+ q16[0] = duk_hex_enctab[src[i]];
+ q16[1] = duk_hex_enctab[src[i + 1]];
+ q16[2] = duk_hex_enctab[src[i + 2]];
+ q16[3] = duk_hex_enctab[src[i + 3]];
+ q16 += 4;
+ }
+ q = (duk_uint8_t *) q16;
+
+#if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)
+ if (shift_dst) {
+ q--;
+ DUK_MEMMOVE((void *) dst, (const void *) (dst + 1), 2 * len_safe);
+ DUK_ASSERT(dst + 2 * len_safe == q);
+ }
+#endif
+
+ for (; i < src_len; i++) {
+ x = src[i];
+ *q++ = duk_lc_digits[x >> 4];
+ *q++ = duk_lc_digits[x & 0x0f];
+ }
+
+ return q;
+}
+#else /* DUK_USE_HEX_FASTPATH */
+DUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) {
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_end;
+ duk_uint8_t *q;
+ duk_small_uint_t x;
+
+ p = src;
+ p_end = src + src_len;
+ q = dst;
+ while (p != p_end) {
+ x = *p++;
+ *q++ = duk_lc_digits[x >> 4];
+ *q++ = duk_lc_digits[x & 0x0f];
+ }
+
+ return q;
+}
+#endif /* DUK_USE_HEX_FASTPATH */
+
+DUK_LOCAL void duk__enc_buffer_data(duk_json_enc_ctx *js_ctx, duk_uint8_t *buf_data, duk_size_t buf_len) {
+ duk_hthread *thr;
+ duk_uint8_t *q;
+ duk_size_t space;
+
+ thr = js_ctx->thr;
+
+ DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */
+ DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible);
+
+ /* Buffer values are encoded in (lowercase) hex to make the
+ * binary data readable. Base64 or similar would be more
+ * compact but less readable, and the point of JX/JC
+ * variants is to be as useful to a programmer as possible.
+ */
+
+ /* The #if defined() clutter here needs to handle the three
+ * cases: (1) JX+JC, (2) JX only, (3) JC only.
+ */
+
+ /* Note: space must cater for both JX and JC. */
+ space = 9 + buf_len * 2 + 2;
+ DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7ffffffeUL);
+ DUK_ASSERT((space - 2) / 2 >= buf_len); /* overflow not possible, buffer limits */
+ q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space);
+
+#if defined(DUK_USE_JX) && defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom)
+#endif
+#if defined(DUK_USE_JX)
+ {
+ *q++ = DUK_ASC_PIPE;
+ q = duk__enc_buffer_data_hex(buf_data, buf_len, q);
+ *q++ = DUK_ASC_PIPE;
+
+ }
+#endif
+#if defined(DUK_USE_JX) && defined(DUK_USE_JC)
+ else
+#endif
+#if defined(DUK_USE_JC)
+ {
+ DUK_ASSERT(js_ctx->flag_ext_compatible);
+ DUK_MEMCPY((void *) q, (const void *) "{\"_buf\":\"", 9); /* len: 9 */
+ q += 9;
+ q = duk__enc_buffer_data_hex(buf_data, buf_len, q);
+ *q++ = DUK_ASC_DOUBLEQUOTE;
+ *q++ = DUK_ASC_RCURLY;
+ }
+#endif
+
+ DUK_BW_SET_PTR(thr, &js_ctx->bw, q);
+}
+
+DUK_LOCAL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) {
+ duk__enc_buffer_data(js_ctx,
+ (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h),
+ (duk_size_t) DUK_HBUFFER_GET_SIZE(h));
+}
+#endif /* DUK_USE_JX || DUK_USE_JC */
+
+#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)
+DUK_LOCAL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) {
+ duk_size_t i, n;
+ const duk_uint8_t *buf;
+ duk_uint8_t *q;
+
+ n = DUK_HBUFFER_GET_SIZE(h);
+ if (n == 0) {
+ DUK__EMIT_2(js_ctx, DUK_ASC_LCURLY, DUK_ASC_RCURLY);
+ return;
+ }
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);
+
+ /* Maximum encoded length with 32-bit index: 1 + 10 + 2 + 3 + 1 + 1 = 18,
+ * with 64-bit index: 1 + 20 + 2 + 3 + 1 + 1 = 28. 32 has some slack.
+ *
+ * Note that because the output buffer is reallocated from time to time,
+ * side effects (such as finalizers) affecting the buffer 'h' must be
+ * disabled. This is the case in the JSON.stringify() fast path.
+ */
+
+ buf = (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h);
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ for (i = 0; i < n; i++) {
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth + 1);
+ q = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, 32);
+ q += DUK_SPRINTF((char *) q, "\"%lu\": %u,", (unsigned long) i, (unsigned int) buf[i]);
+ DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q);
+ }
+ } else {
+ q = DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw);
+ for (i = 0; i < n; i++) {
+ q = DUK_BW_ENSURE_RAW(js_ctx->thr, &js_ctx->bw, 32, q);
+ q += DUK_SPRINTF((char *) q, "\"%lu\":%u,", (unsigned long) i, (unsigned int) buf[i]);
+ }
+ DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q);
+ }
+ DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
+
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
+ }
+ DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);
+}
+#endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+DUK_LOCAL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr) {
+ char buf[64]; /* XXX: how to figure correct size? */
+ const char *fmt;
+
+ DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */
+ DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible);
+
+ DUK_MEMZERO(buf, sizeof(buf));
+
+ /* The #if defined() clutter here needs to handle the three
+ * cases: (1) JX+JC, (2) JX only, (3) JC only.
+ */
+#if defined(DUK_USE_JX) && defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom)
+#endif
+#if defined(DUK_USE_JX)
+ {
+ fmt = ptr ? "(%p)" : "(null)";
+ }
+#endif
+#if defined(DUK_USE_JX) && defined(DUK_USE_JC)
+ else
+#endif
+#if defined(DUK_USE_JC)
+ {
+ DUK_ASSERT(js_ctx->flag_ext_compatible);
+ fmt = ptr ? "{\"_ptr\":\"%p\"}" : "{\"_ptr\":\"null\"}";
+ }
+#endif
+
+ /* When ptr == NULL, the format argument is unused. */
+ DUK_SNPRINTF(buf, sizeof(buf) - 1, fmt, ptr); /* must not truncate */
+ DUK__EMIT_CSTR(js_ctx, buf);
+}
+#endif /* DUK_USE_JX || DUK_USE_JC */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+DUK_LOCAL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj) {
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ if (h_bufobj->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) {
+ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
+ } else {
+ /* Handle both full and partial slice (as long as covered). */
+ duk__enc_buffer_data(js_ctx,
+ (duk_uint8_t *) DUK_HBUFOBJ_GET_SLICE_BASE(js_ctx->thr->heap, h_bufobj),
+ (duk_size_t) h_bufobj->length);
+ }
+}
+#endif /* DUK_USE_JX || DUK_USE_JC */
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/* Indent helper. Calling code relies on js_ctx->recursion_depth also being
+ * directly related to indent depth.
+ */
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) {
+ DUK_ASSERT(js_ctx->h_gap != NULL);
+ DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */
+
+ DUK__EMIT_1(js_ctx, 0x0a);
+ while (depth-- > 0) {
+ DUK__EMIT_HSTR(js_ctx, js_ctx->h_gap);
+ }
+}
+#else /* DUK_USE_PREFER_SIZE */
+DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) {
+ const duk_uint8_t *gap_data;
+ duk_size_t gap_len;
+ duk_size_t avail_bytes; /* bytes of indent available for copying */
+ duk_size_t need_bytes; /* bytes of indent still needed */
+ duk_uint8_t *p_start;
+ duk_uint8_t *p;
+
+ DUK_ASSERT(js_ctx->h_gap != NULL);
+ DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */
+
+ DUK__EMIT_1(js_ctx, 0x0a);
+ if (DUK_UNLIKELY(depth == 0)) {
+ return;
+ }
+
+ /* To handle deeper indents efficiently, make use of copies we've
+ * already emitted. In effect we can emit a sequence of 1, 2, 4,
+ * 8, etc copies, and then finish the last run. Byte counters
+ * avoid multiply with gap_len on every loop.
+ */
+
+ gap_data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(js_ctx->h_gap);
+ gap_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap);
+ DUK_ASSERT(gap_len > 0);
+
+ need_bytes = gap_len * depth;
+ p = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, need_bytes);
+ p_start = p;
+
+ DUK_MEMCPY((void *) p, (const void *) gap_data, (size_t) gap_len);
+ p += gap_len;
+ avail_bytes = gap_len;
+ DUK_ASSERT(need_bytes >= gap_len);
+ need_bytes -= gap_len;
+
+ while (need_bytes >= avail_bytes) {
+ DUK_MEMCPY((void *) p, (const void *) p_start, (size_t) avail_bytes);
+ p += avail_bytes;
+ need_bytes -= avail_bytes;
+ avail_bytes <<= 1;
+ }
+
+ DUK_ASSERT(need_bytes < avail_bytes); /* need_bytes may be zero */
+ DUK_MEMCPY((void *) p, (const void *) p_start, (size_t) need_bytes);
+ p += need_bytes;
+ /*avail_bytes += need_bytes*/
+
+ DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, p);
+}
+#endif /* DUK_USE_PREFER_SIZE */
+
+/* Shared entry handling for object/array serialization. */
+DUK_LOCAL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_hobject *h_target;
+ duk_uint_fast32_t i, n;
+
+ *entry_top = duk_get_top(thr);
+
+ duk_require_stack(thr, DUK_JSON_ENC_REQSTACK);
+
+ /* Loop check using a hybrid approach: a fixed-size visited[] array
+ * with overflow in a loop check object.
+ */
+
+ h_target = duk_known_hobject(thr, -1); /* object or array */
+
+ n = js_ctx->recursion_depth;
+ if (DUK_UNLIKELY(n > DUK_JSON_ENC_LOOPARRAY)) {
+ n = DUK_JSON_ENC_LOOPARRAY;
+ }
+ for (i = 0; i < n; i++) {
+ if (DUK_UNLIKELY(js_ctx->visiting[i] == h_target)) {
+ DUK_DD(DUK_DDPRINT("slow path loop detect"));
+ DUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT);
+ }
+ }
+ if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) {
+ js_ctx->visiting[js_ctx->recursion_depth] = h_target;
+ } else {
+ duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target);
+ duk_dup_top(thr); /* -> [ ... voidp voidp ] */
+ if (duk_has_prop(thr, js_ctx->idx_loop)) {
+ DUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT);
+ }
+ duk_push_true(thr); /* -> [ ... voidp true ] */
+ duk_put_prop(thr, js_ctx->idx_loop); /* -> [ ... ] */
+ }
+
+ /* C recursion check. */
+
+ DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ if (js_ctx->recursion_depth >= js_ctx->recursion_limit) {
+ DUK_ERROR_RANGE(thr, DUK_STR_JSONENC_RECLIMIT);
+ }
+ js_ctx->recursion_depth++;
+
+ DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T",
+ (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop)));
+}
+
+/* Shared exit handling for object/array serialization. */
+DUK_LOCAL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_hobject *h_target;
+
+ /* C recursion check. */
+
+ DUK_ASSERT(js_ctx->recursion_depth > 0);
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ js_ctx->recursion_depth--;
+
+ /* Loop check. */
+
+ h_target = duk_known_hobject(thr, *entry_top - 1); /* original target at entry_top - 1 */
+
+ if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) {
+ /* Previous entry was inside visited[], nothing to do. */
+ } else {
+ duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target);
+ duk_del_prop(thr, js_ctx->idx_loop); /* -> [ ... ] */
+ }
+
+ /* Restore stack top after unbalanced code paths. */
+ duk_set_top(thr, *entry_top);
+
+ DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T",
+ (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop)));
+}
+
+/* The JO(value) operation: encode object.
+ *
+ * Stack policy: [ object ] -> [ object ].
+ */
+DUK_LOCAL void duk__enc_object(duk_json_enc_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_hstring *h_key;
+ duk_idx_t entry_top;
+ duk_idx_t idx_obj;
+ duk_idx_t idx_keys;
+ duk_bool_t emitted;
+ duk_uarridx_t arr_len, i;
+ duk_size_t prev_size;
+
+ DUK_DDD(DUK_DDDPRINT("duk__enc_object: obj=%!T", (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk__enc_objarr_entry(js_ctx, &entry_top);
+
+ idx_obj = entry_top - 1;
+
+ if (js_ctx->idx_proplist >= 0) {
+ idx_keys = js_ctx->idx_proplist;
+ } else {
+ /* XXX: would be nice to enumerate an object at specified index */
+ duk_dup(thr, idx_obj);
+ (void) duk_hobject_get_enumerated_keys(thr, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); /* [ ... target ] -> [ ... target keys ] */
+ idx_keys = duk_require_normalize_index(thr, -1);
+ /* leave stack unbalanced on purpose */
+ }
+
+ DUK_DDD(DUK_DDDPRINT("idx_keys=%ld, h_keys=%!T",
+ (long) idx_keys, (duk_tval *) duk_get_tval(thr, idx_keys)));
+
+ /* Steps 8-10 have been merged to avoid a "partial" variable. */
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);
+
+ /* XXX: keys is an internal object with all keys to be processed
+ * in its (gapless) array part. Because nobody can touch the keys
+ * object, we could iterate its array part directly (keeping in mind
+ * that it can be reallocated).
+ */
+
+ arr_len = (duk_uarridx_t) duk_get_length(thr, idx_keys);
+ emitted = 0;
+ for (i = 0; i < arr_len; i++) {
+ duk_get_prop_index(thr, idx_keys, i); /* -> [ ... key ] */
+
+ DUK_DDD(DUK_DDDPRINT("object property loop: holder=%!T, key=%!T",
+ (duk_tval *) duk_get_tval(thr, idx_obj),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ h_key = duk_known_hstring(thr, -1);
+ DUK_ASSERT(h_key != NULL);
+ DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(h_key)); /* proplist filtering; enum options */
+
+ prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw);
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
+ duk__enc_key_autoquote(js_ctx, h_key);
+ DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE);
+ } else {
+ duk__enc_key_autoquote(js_ctx, h_key);
+ DUK__EMIT_1(js_ctx, DUK_ASC_COLON);
+ }
+
+ /* [ ... key ] */
+
+ if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_obj) == 0)) {
+ /* Value would yield 'undefined', so skip key altogether.
+ * Side effects have already happened.
+ */
+ DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size);
+ } else {
+ DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
+ emitted = 1;
+ }
+
+ /* [ ... ] */
+ }
+
+ if (emitted) {
+ DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
+ DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ DUK_ASSERT(js_ctx->recursion_depth >= 1);
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);
+ }
+ }
+ DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);
+
+ duk__enc_objarr_exit(js_ctx, &entry_top);
+
+ DUK_ASSERT_TOP(thr, entry_top);
+}
+
+/* The JA(value) operation: encode array.
+ *
+ * Stack policy: [ array ] -> [ array ].
+ */
+DUK_LOCAL void duk__enc_array(duk_json_enc_ctx *js_ctx) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_idx_t entry_top;
+ duk_idx_t idx_arr;
+ duk_bool_t emitted;
+ duk_uarridx_t i, arr_len;
+
+ DUK_DDD(DUK_DDDPRINT("duk__enc_array: array=%!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk__enc_objarr_entry(js_ctx, &entry_top);
+
+ idx_arr = entry_top - 1;
+
+ /* Steps 8-10 have been merged to avoid a "partial" variable. */
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET);
+
+ arr_len = (duk_uarridx_t) duk_get_length(thr, idx_arr);
+ emitted = 0;
+ for (i = 0; i < arr_len; i++) {
+ DUK_DDD(DUK_DDDPRINT("array entry loop: array=%!T, index=%ld, arr_len=%ld",
+ (duk_tval *) duk_get_tval(thr, idx_arr),
+ (long) i, (long) arr_len));
+
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ DUK_ASSERT(js_ctx->recursion_depth >= 1);
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
+ }
+
+ (void) duk_push_uint_to_hstring(thr, (duk_uint_t) i); /* -> [ ... key ] */
+
+ /* [ ... key ] */
+
+ if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_arr) == 0)) {
+ /* Value would normally be omitted, replace with 'null'. */
+ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
+ } else {
+ ;
+ }
+
+ /* [ ... ] */
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
+ emitted = 1;
+ }
+
+ if (emitted) {
+ DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
+ DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ DUK_ASSERT(js_ctx->recursion_depth >= 1);
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);
+ }
+ }
+ DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET);
+
+ duk__enc_objarr_exit(js_ctx, &entry_top);
+
+ DUK_ASSERT_TOP(thr, entry_top);
+}
+
+/* The Str(key, holder) operation.
+ *
+ * Stack policy: [ ... key ] -> [ ... ]
+ */
+DUK_LOCAL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder) {
+ duk_hthread *thr = js_ctx->thr;
+ duk_tval *tv;
+ duk_tval *tv_holder;
+ duk_tval *tv_key;
+ duk_small_int_t c;
+
+ DUK_DDD(DUK_DDDPRINT("duk__enc_value: idx_holder=%ld, holder=%!T, key=%!T",
+ (long) idx_holder, (duk_tval *) duk_get_tval(thr, idx_holder),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ tv_holder = DUK_GET_TVAL_POSIDX(thr, idx_holder);
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_holder));
+ tv_key = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv_key));
+ DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING(tv_key))); /* Caller responsible. */
+ (void) duk_hobject_getprop(thr, tv_holder, tv_key);
+
+ /* -> [ ... key val ] */
+
+ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* Standard JSON checks for .toJSON() only for actual objects; for
+ * example, setting Number.prototype.toJSON and then serializing a
+ * number won't invoke the .toJSON() method. However, lightfuncs and
+ * plain buffers mimic objects so we check for their .toJSON() method.
+ */
+ if (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_LIGHTFUNC |
+ DUK_TYPE_MASK_BUFFER)) {
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_JSON);
+ if (duk_is_callable(thr, -1)) { /* toJSON() can also be a lightfunc */
+ DUK_DDD(DUK_DDDPRINT("value is object, has callable toJSON() -> call it"));
+ /* XXX: duk_dup_unvalidated(thr, -2) etc. */
+ duk_dup_m2(thr); /* -> [ ... key val toJSON val ] */
+ duk_dup_m4(thr); /* -> [ ... key val toJSON val key ] */
+ duk_call_method(thr, 1); /* -> [ ... key val val' ] */
+ duk_remove_m2(thr); /* -> [ ... key val' ] */
+ } else {
+ duk_pop(thr); /* -> [ ... key val ] */
+ }
+ }
+
+ /* [ ... key val ] */
+
+ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1)));
+
+ if (js_ctx->h_replacer) {
+ /* XXX: Here a "slice copy" would be useful. */
+ DUK_DDD(DUK_DDDPRINT("replacer is set, call replacer"));
+ duk_push_hobject(thr, js_ctx->h_replacer); /* -> [ ... key val replacer ] */
+ duk_dup(thr, idx_holder); /* -> [ ... key val replacer holder ] */
+ duk_dup_m4(thr); /* -> [ ... key val replacer holder key ] */
+ duk_dup_m4(thr); /* -> [ ... key val replacer holder key val ] */
+ duk_call_method(thr, 2); /* -> [ ... key val val' ] */
+ duk_remove_m2(thr); /* -> [ ... key val' ] */
+ }
+
+ /* [ ... key val ] */
+
+ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1)));
+
+ tv = DUK_GET_TVAL_NEGIDX(thr, -1);
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (DUK_HOBJECT_IS_BUFOBJ(h) &&
+ js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE)) {
+ /* With JX/JC a bufferobject gets serialized specially. */
+ duk_hbufobj *h_bufobj;
+ h_bufobj = (duk_hbufobj *) h;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+ duk__enc_bufobj(js_ctx, h_bufobj);
+ goto pop2_emitted;
+ }
+ /* Otherwise bufferobjects get serialized as normal objects. */
+#endif /* JX || JC */
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+ c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h);
+ switch (c) {
+ case DUK_HOBJECT_CLASS_NUMBER: {
+ DUK_DDD(DUK_DDDPRINT("value is a Number object -> coerce with ToNumber()"));
+ duk_to_number_m1(thr);
+ /* The coercion potentially invokes user .valueOf() and .toString()
+ * but can't result in a function value because ToPrimitive() would
+ * reject such a result: test-dev-json-stringify-coercion-1.js.
+ */
+ DUK_ASSERT(!duk_is_callable(thr, -1));
+ break;
+ }
+ case DUK_HOBJECT_CLASS_STRING: {
+ DUK_DDD(DUK_DDDPRINT("value is a String object -> coerce with ToString()"));
+ duk_to_string(thr, -1);
+ /* Same coercion behavior as for Number. */
+ DUK_ASSERT(!duk_is_callable(thr, -1));
+ break;
+ }
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ case DUK_HOBJECT_CLASS_POINTER:
+#endif
+ case DUK_HOBJECT_CLASS_BOOLEAN: {
+ DUK_DDD(DUK_DDDPRINT("value is a Boolean/Buffer/Pointer object -> get internal value"));
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);
+ duk_remove_m2(thr);
+ break;
+ }
+ default: {
+ /* Normal object which doesn't get automatically coerced to a
+ * primitive value. Functions are checked for specially. The
+ * primitive value coercions for Number, String, Pointer, and
+ * Boolean can't result in functions so suffices to check here.
+ * Symbol objects are handled like plain objects (their primitive
+ * value is NOT looked up like for e.g. String objects).
+ */
+ DUK_ASSERT(h != NULL);
+ if (DUK_HOBJECT_IS_CALLABLE(h)) {
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |
+ DUK_JSON_FLAG_EXT_COMPATIBLE)) {
+ /* We only get here when doing non-standard JSON encoding */
+ DUK_DDD(DUK_DDDPRINT("-> function allowed, serialize to custom format"));
+ DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);
+ DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);
+ goto pop2_emitted;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)"));
+ goto pop2_undef;
+ }
+#else /* DUK_USE_JX || DUK_USE_JC */
+ DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)"));
+ goto pop2_undef;
+#endif /* DUK_USE_JX || DUK_USE_JC */
+ }
+ }
+ } /* end switch */
+ }
+
+ /* [ ... key val ] */
+
+ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1)));
+
+ if (duk_check_type_mask(thr, -1, js_ctx->mask_for_undefined)) {
+ /* will result in undefined */
+ DUK_DDD(DUK_DDDPRINT("-> will result in undefined (type mask check)"));
+ goto pop2_undef;
+ }
+ tv = DUK_GET_TVAL_NEGIDX(thr, -1);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ /* When JX/JC not in use, the type mask above will avoid this case if needed. */
+ case DUK_TAG_UNDEFINED: {
+ DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);
+ break;
+ }
+#endif
+ case DUK_TAG_NULL: {
+ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ?
+ DUK_STRIDX_TRUE : DUK_STRIDX_FALSE);
+ break;
+ }
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ /* When JX/JC not in use, the type mask above will avoid this case if needed. */
+ case DUK_TAG_POINTER: {
+ duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv));
+ break;
+ }
+#endif /* DUK_USE_JX || DUK_USE_JC */
+ case DUK_TAG_STRING: {
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ goto pop2_undef;
+ }
+ duk__enc_quote_string(js_ctx, h);
+ break;
+ }
+ case DUK_TAG_OBJECT: {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ /* Function values are handled completely above (including
+ * coercion results):
+ */
+ DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE(h));
+
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) {
+ duk__enc_array(js_ctx);
+ } else {
+ duk__enc_object(js_ctx);
+ }
+ break;
+ }
+ /* Because plain buffers mimics Uint8Array, they have enumerable
+ * index properties [0,byteLength[. Because JSON only serializes
+ * enumerable own properties, no properties can be serialized for
+ * plain buffers (all virtual properties are non-enumerable). However,
+ * there may be a .toJSON() method which was already handled above.
+ */
+ case DUK_TAG_BUFFER: {
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom_or_compatible) {
+ duk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv));
+ break;
+ }
+#endif
+
+ /* Could implement a fastpath, but the fast path would need
+ * to handle realloc side effects correctly.
+ */
+ duk_to_object(thr, -1);
+ duk__enc_object(js_ctx);
+ break;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ /* We only get here when doing non-standard JSON encoding */
+ DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);
+ DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);
+#else
+ /* Standard JSON omits functions */
+ DUK_UNREACHABLE();
+#endif
+ break;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+ /* Number serialization has a significant impact relative to
+ * other fast path code, so careful fast path for fastints.
+ */
+ duk__enc_fastint_tval(js_ctx, tv);
+ break;
+#endif
+ default: {
+ /* number */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ /* XXX: A fast path for usual integers would be useful when
+ * fastint support is not enabled.
+ */
+ duk__enc_double(js_ctx);
+ break;
+ }
+ }
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ pop2_emitted:
+#endif
+ duk_pop_2(thr); /* [ ... key val ] -> [ ... ] */
+ return 1; /* emitted */
+
+ pop2_undef:
+ duk_pop_2(thr); /* [ ... key val ] -> [ ... ] */
+ return 0; /* not emitted */
+}
+
+/* E5 Section 15.12.3, main algorithm, step 4.b.ii steps 1-4. */
+DUK_LOCAL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv) {
+ duk_small_int_t c;
+
+ /* XXX: some kind of external internal type checker?
+ * - type mask; symbol flag; class mask
+ */
+ DUK_ASSERT(tv != NULL);
+ if (DUK_TVAL_IS_STRING(tv)) {
+ duk_hstring *h;
+ h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ return 0;
+ }
+ return 1;
+ } else if (DUK_TVAL_IS_NUMBER(tv)) {
+ return 1;
+ } else if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h;
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h);
+ if (c == DUK_HOBJECT_CLASS_STRING || c == DUK_HOBJECT_CLASS_NUMBER) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * JSON.stringify() fast path
+ *
+ * Otherwise supports full JSON, JX, and JC features, but bails out on any
+ * possible side effect which might change the value being serialized. The
+ * fast path can take advantage of the fact that the value being serialized
+ * is unchanged so that we can walk directly through property tables etc.
+ */
+
+#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)
+DUK_LOCAL duk_bool_t duk__json_stringify_fast_value(duk_json_enc_ctx *js_ctx, duk_tval *tv) {
+ duk_uint_fast32_t i, n;
+
+ DUK_DDD(DUK_DDDPRINT("stringify fast: %!T", tv));
+
+ DUK_ASSERT(js_ctx != NULL);
+ DUK_ASSERT(js_ctx->thr != NULL);
+
+#if 0 /* disabled for now */
+ restart_match:
+#endif
+
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED: {
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible) {
+ DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);
+ break;
+ } else {
+ goto emit_undefined;
+ }
+#else
+ goto emit_undefined;
+#endif
+ }
+ case DUK_TAG_NULL: {
+ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ?
+ DUK_STRIDX_TRUE : DUK_STRIDX_FALSE);
+ break;
+ }
+ case DUK_TAG_STRING: {
+ duk_hstring *h;
+ h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ goto emit_undefined;
+ }
+ duk__enc_quote_string(js_ctx, h);
+ break;
+ }
+ case DUK_TAG_OBJECT: {
+ duk_hobject *obj;
+ duk_tval *tv_val;
+ duk_bool_t emitted = 0;
+ duk_uint32_t c_bit, c_all, c_array, c_unbox, c_undef,
+ c_func, c_bufobj, c_object, c_abort;
+
+ /* For objects JSON.stringify() only looks for own, enumerable
+ * properties which is nice for the fast path here.
+ *
+ * For arrays JSON.stringify() uses [[Get]] so it will actually
+ * inherit properties during serialization! This fast path
+ * supports gappy arrays as long as there's no actual inherited
+ * property (which might be a getter etc).
+ *
+ * Since recursion only happens for objects, we can have both
+ * recursion and loop checks here. We use a simple, depth-limited
+ * loop check in the fast path because the object-based tracking
+ * is very slow (when tested, it accounted for 50% of fast path
+ * execution time for input data with a lot of small objects!).
+ */
+
+ /* XXX: for real world code, could just ignore array inheritance
+ * and only look at array own properties.
+ */
+
+ /* We rely on a few object flag / class number relationships here,
+ * assert for them.
+ */
+
+ obj = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT_HOBJECT_VALID(obj);
+
+ /* Once recursion depth is increased, exit path must decrease
+ * it (though it's OK to abort the fast path).
+ */
+
+ DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ if (js_ctx->recursion_depth >= js_ctx->recursion_limit) {
+ DUK_DD(DUK_DDPRINT("fast path recursion limit"));
+ DUK_ERROR_RANGE(js_ctx->thr, DUK_STR_JSONDEC_RECLIMIT);
+ }
+
+ for (i = 0, n = (duk_uint_fast32_t) js_ctx->recursion_depth; i < n; i++) {
+ if (DUK_UNLIKELY(js_ctx->visiting[i] == obj)) {
+ DUK_DD(DUK_DDPRINT("fast path loop detect"));
+ DUK_ERROR_TYPE(js_ctx->thr, DUK_STR_CYCLIC_INPUT);
+ }
+ }
+
+ /* Guaranteed by recursion_limit setup so we don't have to
+ * check twice.
+ */
+ DUK_ASSERT(js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY);
+ js_ctx->visiting[js_ctx->recursion_depth] = obj;
+ js_ctx->recursion_depth++;
+
+ /* If object has a .toJSON() property, we can't be certain
+ * that it wouldn't mutate any value arbitrarily, so bail
+ * out of the fast path.
+ *
+ * If an object is a Proxy we also can't avoid side effects
+ * so abandon.
+ */
+ /* XXX: non-callable .toJSON() doesn't need to cause an abort
+ * but does at the moment, probably not worth fixing.
+ */
+ if (duk_hobject_hasprop_raw(js_ctx->thr, obj, DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr)) ||
+ DUK_HOBJECT_IS_PROXY(obj)) {
+ DUK_DD(DUK_DDPRINT("object has a .toJSON property or object is a Proxy, abort fast path"));
+ goto abort_fastpath;
+ }
+
+ /* We could use a switch-case for the class number but it turns out
+ * a small if-else ladder on class masks is better. The if-ladder
+ * should be in order of relevancy.
+ */
+
+ /* XXX: move masks to js_ctx? they don't change during one
+ * fast path invocation.
+ */
+ DUK_ASSERT(DUK_HOBJECT_CLASS_MAX <= 31);
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom_or_compatible) {
+ c_all = DUK_HOBJECT_CMASK_ALL;
+ c_array = DUK_HOBJECT_CMASK_ARRAY;
+ c_unbox = DUK_HOBJECT_CMASK_NUMBER |
+ DUK_HOBJECT_CMASK_STRING |
+ DUK_HOBJECT_CMASK_BOOLEAN |
+ DUK_HOBJECT_CMASK_POINTER; /* Symbols are not unboxed. */
+ c_func = DUK_HOBJECT_CMASK_FUNCTION;
+ c_bufobj = DUK_HOBJECT_CMASK_ALL_BUFOBJS;
+ c_undef = 0;
+ c_abort = 0;
+ c_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort);
+ }
+ else
+#endif
+ {
+ c_all = DUK_HOBJECT_CMASK_ALL;
+ c_array = DUK_HOBJECT_CMASK_ARRAY;
+ c_unbox = DUK_HOBJECT_CMASK_NUMBER |
+ DUK_HOBJECT_CMASK_STRING |
+ DUK_HOBJECT_CMASK_BOOLEAN; /* Symbols are not unboxed. */
+ c_func = 0;
+ c_bufobj = 0;
+ c_undef = DUK_HOBJECT_CMASK_FUNCTION |
+ DUK_HOBJECT_CMASK_POINTER;
+ /* As the fast path doesn't currently properly support
+ * duk_hbufobj virtual properties, abort fast path if
+ * we encounter them in plain JSON mode.
+ */
+ c_abort = DUK_HOBJECT_CMASK_ALL_BUFOBJS;
+ c_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort);
+ }
+
+ c_bit = (duk_uint32_t) DUK_HOBJECT_GET_CLASS_MASK(obj);
+ if (c_bit & c_object) {
+ /* All other object types. */
+ DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);
+
+ /* A non-Array object should not have an array part in practice.
+ * But since it is supported internally (and perhaps used at some
+ * point), check and abandon if that's the case.
+ */
+ if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ DUK_DD(DUK_DDPRINT("non-Array object has array part, abort fast path"));
+ goto abort_fastpath;
+ }
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ duk_hstring *k;
+ duk_size_t prev_size;
+
+ k = DUK_HOBJECT_E_GET_KEY(js_ctx->thr->heap, obj, i);
+ if (!k) {
+ continue;
+ }
+ if (DUK_HSTRING_HAS_ARRIDX(k)) {
+ /* If an object has array index keys we would need
+ * to sort them into the ES2015 enumeration order to
+ * be consistent with the slow path. Abort the fast
+ * path and handle in the slow path for now.
+ */
+ DUK_DD(DUK_DDPRINT("property key is an array index, abort fast path"));
+ goto abort_fastpath;
+ }
+ if (!DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(js_ctx->thr->heap, obj, i)) {
+ continue;
+ }
+ if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(js_ctx->thr->heap, obj, i)) {
+ /* Getter might have arbitrary side effects,
+ * so bail out.
+ */
+ DUK_DD(DUK_DDPRINT("property is an accessor, abort fast path"));
+ goto abort_fastpath;
+ }
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) {
+ continue;
+ }
+
+ tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(js_ctx->thr->heap, obj, i);
+
+ prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw);
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
+ duk__enc_key_autoquote(js_ctx, k);
+ DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE);
+ } else {
+ duk__enc_key_autoquote(js_ctx, k);
+ DUK__EMIT_1(js_ctx, DUK_ASC_COLON);
+ }
+
+ if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) {
+ DUK_DD(DUK_DDPRINT("prop value not supported, rewind key and colon"));
+ DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size);
+ } else {
+ DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
+ emitted = 1;
+ }
+ }
+
+ /* If any non-Array value had enumerable virtual own
+ * properties, they should be serialized here (actually,
+ * before the explicit properties). Standard types don't.
+ */
+
+ if (emitted) {
+ DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
+ DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ DUK_ASSERT(js_ctx->recursion_depth >= 1);
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);
+ }
+ }
+ DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);
+ } else if (c_bit & c_array) {
+ duk_uint_fast32_t arr_len;
+ duk_uint_fast32_t asize;
+
+ DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET);
+
+ /* Assume arrays are dense in the fast path. */
+ if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ DUK_DD(DUK_DDPRINT("Array object is sparse, abort fast path"));
+ goto abort_fastpath;
+ }
+
+ arr_len = (duk_uint_fast32_t) ((duk_harray *) obj)->length;
+ asize = (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(obj);
+ /* Array part may be larger than 'length'; if so, iterate
+ * only up to array 'length'. Array part may also be smaller
+ * than 'length' in some cases.
+ */
+ for (i = 0; i < arr_len; i++) {
+ duk_tval *tv_arrval;
+ duk_hstring *h_tmp;
+ duk_bool_t has_inherited;
+
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
+ }
+
+ if (DUK_LIKELY(i < asize)) {
+ tv_arrval = DUK_HOBJECT_A_GET_VALUE_PTR(js_ctx->thr->heap, obj, i);
+ if (DUK_LIKELY(!DUK_TVAL_IS_UNUSED(tv_arrval))) {
+ /* Expected case: element is present. */
+ if (duk__json_stringify_fast_value(js_ctx, tv_arrval) == 0) {
+ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
+ }
+ goto elem_done;
+ }
+ }
+
+ /* Gap in array; check for inherited property,
+ * bail out if one exists. This should be enough
+ * to support gappy arrays for all practical code.
+ */
+
+ h_tmp = duk_push_uint_to_hstring(js_ctx->thr, (duk_uint_t) i);
+ has_inherited = duk_hobject_hasprop_raw(js_ctx->thr, obj, h_tmp);
+ duk_pop(js_ctx->thr);
+ if (has_inherited) {
+ DUK_D(DUK_DPRINT("gap in array, conflicting inherited property, abort fast path"));
+ goto abort_fastpath;
+ }
+
+ /* Ordinary gap, undefined encodes to 'null' in
+ * standard JSON, but JX/JC use their form for
+ * undefined to better preserve the typing.
+ */
+ DUK_D(DUK_DPRINT("gap in array, no conflicting inherited property, remain on fast path"));
+#if defined(DUK_USE_JX)
+ DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);
+#else
+ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
+#endif
+ /* fall through */
+
+ elem_done:
+ DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
+ emitted = 1;
+ }
+
+ if (emitted) {
+ DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
+ DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
+ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
+ DUK_ASSERT(js_ctx->recursion_depth >= 1);
+ duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);
+ }
+ }
+ DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET);
+ } else if (c_bit & c_unbox) {
+ /* Certain boxed types are required to go through
+ * automatic unboxing. Rely on internal value being
+ * sane (to avoid infinite recursion).
+ */
+ DUK_ASSERT((c_bit & DUK_HOBJECT_CMASK_SYMBOL) == 0); /* Symbols are not unboxed. */
+
+#if 1
+ /* The code below is incorrect if .toString() or .valueOf() have
+ * have been overridden. The correct approach would be to look up
+ * the method(s) and if they resolve to the built-in function we
+ * can safely bypass it and look up the internal value directly.
+ * Unimplemented for now, abort fast path for boxed values.
+ */
+ goto abort_fastpath;
+#else /* disabled */
+ /* Disabled until fixed, see above. */
+ duk_tval *tv_internal;
+
+ DUK_DD(DUK_DDPRINT("auto unboxing in fast path"));
+
+ tv_internal = duk_hobject_get_internal_value_tval_ptr(js_ctx->thr->heap, obj);
+ DUK_ASSERT(tv_internal != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv_internal) ||
+ DUK_TVAL_IS_NUMBER(tv_internal) ||
+ DUK_TVAL_IS_BOOLEAN(tv_internal) ||
+ DUK_TVAL_IS_POINTER(tv_internal));
+
+ tv = tv_internal;
+ DUK_ASSERT(js_ctx->recursion_depth > 0);
+ js_ctx->recursion_depth--; /* required to keep recursion depth correct */
+ goto restart_match;
+#endif /* disabled */
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ } else if (c_bit & c_func) {
+ DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ } else if (c_bit & c_bufobj) {
+ duk__enc_bufobj(js_ctx, (duk_hbufobj *) obj);
+#endif
+#endif
+ } else if (c_bit & c_abort) {
+ DUK_DD(DUK_DDPRINT("abort fast path for unsupported type"));
+ goto abort_fastpath;
+ } else {
+ DUK_ASSERT((c_bit & c_undef) != 0);
+
+ /* Must decrease recursion depth before returning. */
+ DUK_ASSERT(js_ctx->recursion_depth > 0);
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ js_ctx->recursion_depth--;
+ goto emit_undefined;
+ }
+
+ DUK_ASSERT(js_ctx->recursion_depth > 0);
+ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
+ js_ctx->recursion_depth--;
+ break;
+ }
+ case DUK_TAG_BUFFER: {
+ /* Plain buffers are treated like Uint8Arrays: they have
+ * enumerable indices. Other virtual properties are not
+ * enumerable, and inherited properties are not serialized.
+ * However, there can be a replacer (not relevant here) or
+ * a .toJSON() method (which we need to check for explicitly).
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ if (duk_hobject_hasprop_raw(js_ctx->thr,
+ js_ctx->thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE],
+ DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr))) {
+ DUK_DD(DUK_DDPRINT("value is a plain buffer and there's an inherited .toJSON, abort fast path"));
+ goto abort_fastpath;
+ }
+#endif
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom_or_compatible) {
+ duk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv));
+ break;
+ }
+#endif
+
+ /* Plain buffers mimic Uint8Arrays, and have enumerable index
+ * properties.
+ */
+ duk__enc_buffer_json_fastpath(js_ctx, DUK_TVAL_GET_BUFFER(tv));
+ break;
+ }
+ case DUK_TAG_POINTER: {
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flag_ext_custom_or_compatible) {
+ duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv));
+ break;
+ } else {
+ goto emit_undefined;
+ }
+#else
+ goto emit_undefined;
+#endif
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ /* A lightfunc might also inherit a .toJSON() so just bail out. */
+ /* XXX: Could just lookup .toJSON() and continue in fast path,
+ * as it would almost never be defined.
+ */
+ DUK_DD(DUK_DDPRINT("value is a lightfunc, abort fast path"));
+ goto abort_fastpath;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT: {
+ /* Number serialization has a significant impact relative to
+ * other fast path code, so careful fast path for fastints.
+ */
+ duk__enc_fastint_tval(js_ctx, tv);
+ break;
+ }
+#endif
+ default: {
+ /* XXX: A fast path for usual integers would be useful when
+ * fastint support is not enabled.
+ */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+
+ /* XXX: Stack discipline is annoying, could be changed in numconv. */
+ duk_push_tval(js_ctx->thr, tv);
+ duk__enc_double(js_ctx);
+ duk_pop(js_ctx->thr);
+
+#if 0
+ /* Could also rely on native sprintf(), but it will handle
+ * values like NaN, Infinity, -0, exponent notation etc in
+ * a JSON-incompatible way.
+ */
+ duk_double_t d;
+ char buf[64];
+
+ DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));
+ d = DUK_TVAL_GET_DOUBLE(tv);
+ DUK_SPRINTF(buf, "%lg", d);
+ DUK__EMIT_CSTR(js_ctx, buf);
+#endif
+ }
+ }
+ return 1; /* not undefined */
+
+ emit_undefined:
+ return 0; /* value was undefined/unsupported */
+
+ abort_fastpath:
+ /* Error message doesn't matter: the error is ignored anyway. */
+ DUK_DD(DUK_DDPRINT("aborting fast path"));
+ DUK_ERROR_INTERNAL(js_ctx->thr);
+ return 0; /* unreachable */
+}
+
+DUK_LOCAL duk_ret_t duk__json_stringify_fast(duk_hthread *thr, void *udata) {
+ duk_json_enc_ctx *js_ctx;
+ duk_tval *tv;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(udata != NULL);
+
+ js_ctx = (duk_json_enc_ctx *) udata;
+ DUK_ASSERT(js_ctx != NULL);
+
+ tv = DUK_GET_TVAL_NEGIDX(thr, -1);
+ if (duk__json_stringify_fast_value(js_ctx, tv) == 0) {
+ DUK_DD(DUK_DDPRINT("top level value not supported, fail fast path"));
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr); /* Error message is ignored, so doesn't matter. */
+ }
+
+ return 0;
+}
+#endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */
+
+/*
+ * Top level wrappers
+ */
+
+DUK_INTERNAL
+void duk_bi_json_parse_helper(duk_hthread *thr,
+ duk_idx_t idx_value,
+ duk_idx_t idx_reviver,
+ duk_small_uint_t flags) {
+ duk_json_dec_ctx js_ctx_alloc;
+ duk_json_dec_ctx *js_ctx = &js_ctx_alloc;
+ duk_hstring *h_text;
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t entry_top = duk_get_top(thr);
+#endif
+
+ /* negative top-relative indices not allowed now */
+ DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0);
+ DUK_ASSERT(idx_reviver == DUK_INVALID_INDEX || idx_reviver >= 0);
+
+ DUK_DDD(DUK_DDDPRINT("JSON parse start: text=%!T, reviver=%!T, flags=0x%08lx, stack_top=%ld",
+ (duk_tval *) duk_get_tval(thr, idx_value),
+ (duk_tval *) duk_get_tval(thr, idx_reviver),
+ (unsigned long) flags,
+ (long) duk_get_top(thr)));
+
+ DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc));
+ js_ctx->thr = thr;
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ /* nothing now */
+#endif
+ js_ctx->recursion_limit = DUK_USE_JSON_DEC_RECLIMIT;
+ DUK_ASSERT(js_ctx->recursion_depth == 0);
+
+ /* Flag handling currently assumes that flags are consistent. This is OK
+ * because the call sites are now strictly controlled.
+ */
+
+ js_ctx->flags = flags;
+#if defined(DUK_USE_JX)
+ js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM;
+#endif
+#if defined(DUK_USE_JC)
+ js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE;
+#endif
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE);
+#endif
+
+ h_text = duk_to_hstring(thr, idx_value); /* coerce in-place; rejects Symbols */
+ DUK_ASSERT(h_text != NULL);
+
+ /* JSON parsing code is allowed to read [p_start,p_end]: p_end is
+ * valid and points to the string NUL terminator (which is always
+ * guaranteed for duk_hstrings.
+ */
+ js_ctx->p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text);
+ js_ctx->p = js_ctx->p_start;
+ js_ctx->p_end = ((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text)) +
+ DUK_HSTRING_GET_BYTELEN(h_text);
+ DUK_ASSERT(*(js_ctx->p_end) == 0x00);
+
+ duk__dec_value(js_ctx); /* -> [ ... value ] */
+
+ /* Trailing whitespace has been eaten by duk__dec_value(), so if
+ * we're not at end of input here, it's a SyntaxError.
+ */
+
+ if (js_ctx->p != js_ctx->p_end) {
+ duk__dec_syntax_error(js_ctx);
+ }
+
+ if (duk_is_callable(thr, idx_reviver)) {
+ DUK_DDD(DUK_DDDPRINT("applying reviver: %!T",
+ (duk_tval *) duk_get_tval(thr, idx_reviver)));
+
+ js_ctx->idx_reviver = idx_reviver;
+
+ duk_push_object(thr);
+ duk_dup_m2(thr); /* -> [ ... val root val ] */
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING); /* default attrs ok */
+ duk_push_hstring_stridx(thr, DUK_STRIDX_EMPTY_STRING); /* -> [ ... val root "" ] */
+
+ DUK_DDD(DUK_DDDPRINT("start reviver walk, root=%!T, name=%!T",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ duk__dec_reviver_walk(js_ctx); /* [ ... val root "" ] -> [ ... val val' ] */
+ duk_remove_m2(thr); /* -> [ ... val' ] */
+ } else {
+ DUK_DDD(DUK_DDDPRINT("reviver does not exist or is not callable: %!T",
+ (duk_tval *) duk_get_tval(thr, idx_reviver)));
+ }
+
+ /* Final result is at stack top. */
+
+ DUK_DDD(DUK_DDDPRINT("JSON parse end: text=%!T, reviver=%!T, flags=0x%08lx, result=%!T, stack_top=%ld",
+ (duk_tval *) duk_get_tval(thr, idx_value),
+ (duk_tval *) duk_get_tval(thr, idx_reviver),
+ (unsigned long) flags,
+ (duk_tval *) duk_get_tval(thr, -1),
+ (long) duk_get_top(thr)));
+
+ DUK_ASSERT(duk_get_top(thr) == entry_top + 1);
+}
+
+DUK_INTERNAL
+void duk_bi_json_stringify_helper(duk_hthread *thr,
+ duk_idx_t idx_value,
+ duk_idx_t idx_replacer,
+ duk_idx_t idx_space,
+ duk_small_uint_t flags) {
+ duk_json_enc_ctx js_ctx_alloc;
+ duk_json_enc_ctx *js_ctx = &js_ctx_alloc;
+ duk_hobject *h;
+ duk_idx_t idx_holder;
+ duk_idx_t entry_top;
+
+ /* negative top-relative indices not allowed now */
+ DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0);
+ DUK_ASSERT(idx_replacer == DUK_INVALID_INDEX || idx_replacer >= 0);
+ DUK_ASSERT(idx_space == DUK_INVALID_INDEX || idx_space >= 0);
+
+ DUK_DDD(DUK_DDDPRINT("JSON stringify start: value=%!T, replacer=%!T, space=%!T, flags=0x%08lx, stack_top=%ld",
+ (duk_tval *) duk_get_tval(thr, idx_value),
+ (duk_tval *) duk_get_tval(thr, idx_replacer),
+ (duk_tval *) duk_get_tval(thr, idx_space),
+ (unsigned long) flags,
+ (long) duk_get_top(thr)));
+
+ entry_top = duk_get_top(thr);
+
+ /*
+ * Context init
+ */
+
+ DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc));
+ js_ctx->thr = thr;
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ js_ctx->h_replacer = NULL;
+ js_ctx->h_gap = NULL;
+#endif
+ js_ctx->idx_proplist = -1;
+
+ /* Flag handling currently assumes that flags are consistent. This is OK
+ * because the call sites are now strictly controlled.
+ */
+
+ js_ctx->flags = flags;
+ js_ctx->flag_ascii_only = flags & DUK_JSON_FLAG_ASCII_ONLY;
+ js_ctx->flag_avoid_key_quotes = flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES;
+#if defined(DUK_USE_JX)
+ js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM;
+#endif
+#if defined(DUK_USE_JC)
+ js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE;
+#endif
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE);
+#endif
+
+ /* The #if defined() clutter here handles the JX/JC enable/disable
+ * combinations properly.
+ */
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_NULL; /* standard JSON; array gaps */
+#if defined(DUK_USE_JX)
+ if (flags & DUK_JSON_FLAG_EXT_CUSTOM) {
+ js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_UNDEFINED;
+ js_ctx->stridx_custom_nan = DUK_STRIDX_NAN;
+ js_ctx->stridx_custom_neginf = DUK_STRIDX_MINUS_INFINITY;
+ js_ctx->stridx_custom_posinf = DUK_STRIDX_INFINITY;
+ js_ctx->stridx_custom_function =
+ (flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES) ?
+ DUK_STRIDX_JSON_EXT_FUNCTION2 :
+ DUK_STRIDX_JSON_EXT_FUNCTION1;
+ }
+#endif /* DUK_USE_JX */
+#if defined(DUK_USE_JX) && defined(DUK_USE_JC)
+ else
+#endif /* DUK_USE_JX && DUK_USE_JC */
+#if defined(DUK_USE_JC)
+ if (js_ctx->flags & DUK_JSON_FLAG_EXT_COMPATIBLE) {
+ js_ctx->stridx_custom_undefined = DUK_STRIDX_JSON_EXT_UNDEFINED;
+ js_ctx->stridx_custom_nan = DUK_STRIDX_JSON_EXT_NAN;
+ js_ctx->stridx_custom_neginf = DUK_STRIDX_JSON_EXT_NEGINF;
+ js_ctx->stridx_custom_posinf = DUK_STRIDX_JSON_EXT_POSINF;
+ js_ctx->stridx_custom_function = DUK_STRIDX_JSON_EXT_FUNCTION1;
+ }
+#endif /* DUK_USE_JC */
+#endif /* DUK_USE_JX || DUK_USE_JC */
+
+#if defined(DUK_USE_JX) || defined(DUK_USE_JC)
+ if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |
+ DUK_JSON_FLAG_EXT_COMPATIBLE)) {
+ DUK_ASSERT(js_ctx->mask_for_undefined == 0); /* already zero */
+ }
+ else
+#endif /* DUK_USE_JX || DUK_USE_JC */
+ {
+ /* Plain buffer is treated like ArrayBuffer and serialized.
+ * Lightfuncs are treated like objects, but JSON explicitly
+ * skips serializing Function objects so we can just reject
+ * lightfuncs here.
+ */
+ js_ctx->mask_for_undefined = DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_POINTER |
+ DUK_TYPE_MASK_LIGHTFUNC;
+ }
+
+ DUK_BW_INIT_PUSHBUF(thr, &js_ctx->bw, DUK__JSON_STRINGIFY_BUFSIZE);
+
+ js_ctx->idx_loop = duk_push_bare_object(thr);
+ DUK_ASSERT(js_ctx->idx_loop >= 0);
+
+ /* [ ... buf loop ] */
+
+ /*
+ * Process replacer/proplist (2nd argument to JSON.stringify)
+ */
+
+ h = duk_get_hobject(thr, idx_replacer);
+ if (h != NULL) {
+ if (DUK_HOBJECT_IS_CALLABLE(h)) {
+ js_ctx->h_replacer = h;
+ } else if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) {
+ /* Here the specification requires correct array index enumeration
+ * which is a bit tricky for sparse arrays (it is handled by the
+ * enum setup code). We now enumerate ancestors too, although the
+ * specification is not very clear on whether that is required.
+ */
+
+ duk_uarridx_t plist_idx = 0;
+ duk_small_uint_t enum_flags;
+
+ js_ctx->idx_proplist = duk_push_array(thr); /* XXX: array internal? */
+
+ enum_flags = DUK_ENUM_ARRAY_INDICES_ONLY |
+ DUK_ENUM_SORT_ARRAY_INDICES; /* expensive flag */
+ duk_enum(thr, idx_replacer, enum_flags);
+ while (duk_next(thr, -1 /*enum_index*/, 1 /*get_value*/)) {
+ /* [ ... proplist enum_obj key val ] */
+ if (duk__enc_allow_into_proplist(duk_get_tval(thr, -1))) {
+ /* XXX: duplicates should be eliminated here */
+ DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> accept",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_to_string(thr, -1); /* extra coercion of strings is OK */
+ duk_put_prop_index(thr, -4, plist_idx); /* -> [ ... proplist enum_obj key ] */
+ plist_idx++;
+ duk_pop(thr);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> reject",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_pop_2(thr);
+ }
+ }
+ duk_pop(thr); /* pop enum */
+
+ /* [ ... proplist ] */
+ }
+ }
+
+ /* [ ... buf loop (proplist) ] */
+
+ /*
+ * Process space (3rd argument to JSON.stringify)
+ */
+
+ h = duk_get_hobject(thr, idx_space);
+ if (h != NULL) {
+ duk_small_uint_t c = DUK_HOBJECT_GET_CLASS_NUMBER(h);
+ if (c == DUK_HOBJECT_CLASS_NUMBER) {
+ duk_to_number(thr, idx_space);
+ } else if (c == DUK_HOBJECT_CLASS_STRING) {
+ duk_to_string(thr, idx_space);
+ }
+ }
+
+ if (duk_is_number(thr, idx_space)) {
+ duk_small_int_t nspace;
+ /* spaces[] must be static to allow initializer with old compilers like BCC */
+ static const char spaces[10] = {
+ DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE,
+ DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE,
+ DUK_ASC_SPACE, DUK_ASC_SPACE
+ }; /* XXX: helper */
+
+ /* ToInteger() coercion; NaN -> 0, infinities are clamped to 0 and 10 */
+ nspace = (duk_small_int_t) duk_to_int_clamped(thr, idx_space, 0 /*minval*/, 10 /*maxval*/);
+ DUK_ASSERT(nspace >= 0 && nspace <= 10);
+
+ duk_push_lstring(thr, spaces, (duk_size_t) nspace);
+ js_ctx->h_gap = duk_known_hstring(thr, -1);
+ DUK_ASSERT(js_ctx->h_gap != NULL);
+ } else if (duk_is_string_notsymbol(thr, idx_space)) {
+ duk_dup(thr, idx_space);
+ duk_substring(thr, -1, 0, 10); /* clamp to 10 chars */
+ js_ctx->h_gap = duk_known_hstring(thr, -1);
+ } else {
+ /* nop */
+ }
+
+ if (js_ctx->h_gap != NULL) {
+ /* If gap is empty, behave as if not given at all. Check
+ * against byte length because character length is more
+ * expensive.
+ */
+ if (DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) == 0) {
+ js_ctx->h_gap = NULL;
+ }
+ }
+
+ /* [ ... buf loop (proplist) (gap) ] */
+
+ /*
+ * Fast path: assume no mutation, iterate object property tables
+ * directly; bail out if that assumption doesn't hold.
+ */
+
+#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)
+ if (js_ctx->h_replacer == NULL && /* replacer is a mutation risk */
+ js_ctx->idx_proplist == -1) { /* proplist is very rare */
+ duk_int_t pcall_rc;
+ duk_small_uint_t prev_ms_base_flags;
+
+ DUK_DD(DUK_DDPRINT("try JSON.stringify() fast path"));
+
+ /* Use recursion_limit to ensure we don't overwrite js_ctx->visiting[]
+ * array so we don't need two counter checks in the fast path. The
+ * slow path has a much larger recursion limit which we'll use if
+ * necessary.
+ */
+ DUK_ASSERT(DUK_USE_JSON_ENC_RECLIMIT >= DUK_JSON_ENC_LOOPARRAY);
+ js_ctx->recursion_limit = DUK_JSON_ENC_LOOPARRAY;
+ DUK_ASSERT(js_ctx->recursion_depth == 0);
+
+ /* Execute the fast path in a protected call. If any error is thrown,
+ * fall back to the slow path. This includes e.g. recursion limit
+ * because the fast path has a smaller recursion limit (and simpler,
+ * limited loop detection).
+ */
+
+ duk_dup(thr, idx_value);
+
+ /* Must prevent finalizers which may have arbitrary side effects. */
+ prev_ms_base_flags = thr->heap->ms_base_flags;
+ thr->heap->ms_base_flags |=
+ DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* Avoid attempt to compact any objects. */
+ thr->heap->pf_prevent_count++; /* Prevent finalizers. */
+ DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */
+
+ pcall_rc = duk_safe_call(thr, duk__json_stringify_fast, (void *) js_ctx /*udata*/, 1 /*nargs*/, 0 /*nret*/);
+
+ DUK_ASSERT(thr->heap->pf_prevent_count > 0);
+ thr->heap->pf_prevent_count--;
+ thr->heap->ms_base_flags = prev_ms_base_flags;
+
+ if (pcall_rc == DUK_EXEC_SUCCESS) {
+ DUK_DD(DUK_DDPRINT("fast path successful"));
+ DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw);
+ goto replace_finished;
+ }
+
+ /* We come here for actual aborts (like encountering .toJSON())
+ * but also for recursion/loop errors. Bufwriter size can be
+ * kept because we'll probably need at least as much as we've
+ * allocated so far.
+ */
+ DUK_D(DUK_DPRINT("fast path failed, serialize using slow path instead"));
+ DUK_BW_RESET_SIZE(thr, &js_ctx->bw);
+ js_ctx->recursion_depth = 0;
+ }
+#endif
+
+ /*
+ * Create wrapper object and serialize
+ */
+
+ idx_holder = duk_push_object(thr);
+ duk_dup(thr, idx_value);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING);
+
+ DUK_DDD(DUK_DDDPRINT("before: flags=0x%08lx, loop=%!T, replacer=%!O, "
+ "proplist=%!T, gap=%!O, holder=%!T",
+ (unsigned long) js_ctx->flags,
+ (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop),
+ (duk_heaphdr *) js_ctx->h_replacer,
+ (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL),
+ (duk_heaphdr *) js_ctx->h_gap,
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* serialize the wrapper with empty string key */
+
+ duk_push_hstring_empty(thr);
+
+ /* [ ... buf loop (proplist) (gap) holder "" ] */
+
+ js_ctx->recursion_limit = DUK_USE_JSON_ENC_RECLIMIT;
+ DUK_ASSERT(js_ctx->recursion_depth == 0);
+
+ if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_holder) == 0)) { /* [ ... holder key ] -> [ ... holder ] */
+ /* Result is undefined. */
+ duk_push_undefined(thr);
+ } else {
+ /* Convert buffer to result string. */
+ DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("after: flags=0x%08lx, loop=%!T, replacer=%!O, "
+ "proplist=%!T, gap=%!O, holder=%!T",
+ (unsigned long) js_ctx->flags,
+ (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop),
+ (duk_heaphdr *) js_ctx->h_replacer,
+ (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL),
+ (duk_heaphdr *) js_ctx->h_gap,
+ (duk_tval *) duk_get_tval(thr, idx_holder)));
+
+ /* The stack has a variable shape here, so force it to the
+ * desired one explicitly.
+ */
+
+#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)
+ replace_finished:
+#endif
+ duk_replace(thr, entry_top);
+ duk_set_top(thr, entry_top + 1);
+
+ DUK_DDD(DUK_DDDPRINT("JSON stringify end: value=%!T, replacer=%!T, space=%!T, "
+ "flags=0x%08lx, result=%!T, stack_top=%ld",
+ (duk_tval *) duk_get_tval(thr, idx_value),
+ (duk_tval *) duk_get_tval(thr, idx_replacer),
+ (duk_tval *) duk_get_tval(thr, idx_space),
+ (unsigned long) flags,
+ (duk_tval *) duk_get_tval(thr, -1),
+ (long) duk_get_top(thr)));
+
+ DUK_ASSERT(duk_get_top(thr) == entry_top + 1);
+}
+
+#if defined(DUK_USE_JSON_BUILTIN)
+
+/*
+ * Entry points
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_json_object_parse(duk_hthread *thr) {
+ duk_bi_json_parse_helper(thr,
+ 0 /*idx_value*/,
+ 1 /*idx_replacer*/,
+ 0 /*flags*/);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_json_object_stringify(duk_hthread *thr) {
+ duk_bi_json_stringify_helper(thr,
+ 0 /*idx_value*/,
+ 1 /*idx_replacer*/,
+ 2 /*idx_space*/,
+ 0 /*flags*/);
+ return 1;
+}
+
+#endif /* DUK_USE_JSON_BUILTIN */
+
+#endif /* DUK_USE_JSON_SUPPORT */
+
+/* automatic undefs */
+#undef DUK__EMIT_1
+#undef DUK__EMIT_2
+#undef DUK__EMIT_CSTR
+#undef DUK__EMIT_HSTR
+#undef DUK__EMIT_STRIDX
+#undef DUK__JSON_DECSTR_BUFSIZE
+#undef DUK__JSON_DECSTR_CHUNKSIZE
+#undef DUK__JSON_ENCSTR_CHUNKSIZE
+#undef DUK__JSON_MAX_ESC_LEN
+#undef DUK__JSON_STRINGIFY_BUFSIZE
+#undef DUK__MKESC
+#undef DUK__UNEMIT_1
+#line 1 "duk_bi_math.c"
+/*
+ * Math built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_MATH_BUILTIN)
+
+/*
+ * Use static helpers which can work with math.h functions matching
+ * the following signatures. This is not portable if any of these math
+ * functions is actually a macro.
+ *
+ * Typing here is intentionally 'double' wherever values interact with
+ * the standard library APIs.
+ */
+
+typedef double (*duk__one_arg_func)(double);
+typedef double (*duk__two_arg_func)(double, double);
+
+DUK_LOCAL duk_ret_t duk__math_minmax(duk_hthread *thr, duk_double_t initial, duk__two_arg_func min_max) {
+ duk_idx_t n = duk_get_top(thr);
+ duk_idx_t i;
+ duk_double_t res = initial;
+ duk_double_t t;
+
+ /*
+ * Note: fmax() does not match the E5 semantics. E5 requires
+ * that if -any- input to Math.max() is a NaN, the result is a
+ * NaN. fmax() will return a NaN only if -both- inputs are NaN.
+ * Same applies to fmin().
+ *
+ * Note: every input value must be coerced with ToNumber(), even
+ * if we know the result will be a NaN anyway: ToNumber() may have
+ * side effects for which even order of evaluation matters.
+ */
+
+ for (i = 0; i < n; i++) {
+ t = duk_to_number(thr, i);
+ if (DUK_FPCLASSIFY(t) == DUK_FP_NAN || DUK_FPCLASSIFY(res) == DUK_FP_NAN) {
+ /* Note: not normalized, but duk_push_number() will normalize */
+ res = (duk_double_t) DUK_DOUBLE_NAN;
+ } else {
+ res = (duk_double_t) min_max(res, (double) t);
+ }
+ }
+
+ duk_push_number(thr, res);
+ return 1;
+}
+
+DUK_LOCAL double duk__fmin_fixed(double x, double y) {
+ /* fmin() with args -0 and +0 is not guaranteed to return
+ * -0 as Ecmascript requires.
+ */
+ if (x == 0 && y == 0) {
+ duk_double_union du1, du2;
+ du1.d = x;
+ du2.d = y;
+
+ /* Already checked to be zero so these must hold, and allow us
+ * to check for "x is -0 or y is -0" by ORing the high parts
+ * for comparison.
+ */
+ DUK_ASSERT(du1.ui[DUK_DBL_IDX_UI0] == 0 || du1.ui[DUK_DBL_IDX_UI0] == 0x80000000UL);
+ DUK_ASSERT(du2.ui[DUK_DBL_IDX_UI0] == 0 || du2.ui[DUK_DBL_IDX_UI0] == 0x80000000UL);
+
+ /* XXX: what's the safest way of creating a negative zero? */
+ if ((du1.ui[DUK_DBL_IDX_UI0] | du2.ui[DUK_DBL_IDX_UI0]) != 0) {
+ /* Enter here if either x or y (or both) is -0. */
+ return -0.0;
+ } else {
+ return +0.0;
+ }
+ }
+ return duk_double_fmin(x, y);
+}
+
+DUK_LOCAL double duk__fmax_fixed(double x, double y) {
+ /* fmax() with args -0 and +0 is not guaranteed to return
+ * +0 as Ecmascript requires.
+ */
+ if (x == 0 && y == 0) {
+ if (DUK_SIGNBIT(x) == 0 || DUK_SIGNBIT(y) == 0) {
+ return +0.0;
+ } else {
+ return -0.0;
+ }
+ }
+ return duk_double_fmax(x, y);
+}
+
+#if defined(DUK_USE_ES6)
+DUK_LOCAL double duk__cbrt(double x) {
+ /* cbrt() is C99. To avoid hassling embedders with the need to provide a
+ * cube root function, we can get by with pow(). The result is not
+ * identical, but that's OK: ES2015 says it's implementation-dependent.
+ */
+
+#if defined(DUK_CBRT)
+ /* cbrt() matches ES2015 requirements. */
+ return DUK_CBRT(x);
+#else
+ duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x);
+
+ /* pow() does not, however. */
+ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) {
+ return x;
+ }
+ if (DUK_SIGNBIT(x)) {
+ return -DUK_POW(-x, 1.0 / 3.0);
+ } else {
+ return DUK_POW(x, 1.0 / 3.0);
+ }
+#endif
+}
+
+DUK_LOCAL double duk__log2(double x) {
+#if defined(DUK_LOG2)
+ return DUK_LOG2(x);
+#else
+ return DUK_LOG(x) * DUK_DOUBLE_LOG2E;
+#endif
+}
+
+DUK_LOCAL double duk__log10(double x) {
+#if defined(DUK_LOG10)
+ return DUK_LOG10(x);
+#else
+ return DUK_LOG(x) * DUK_DOUBLE_LOG10E;
+#endif
+}
+
+DUK_LOCAL double duk__trunc(double x) {
+#if defined(DUK_TRUNC)
+ return DUK_TRUNC(x);
+#else
+ /* Handles -0 correctly: -0.0 matches 'x >= 0.0' but floor()
+ * is required to return -0 when the argument is -0.
+ */
+ return x >= 0.0 ? DUK_FLOOR(x) : DUK_CEIL(x);
+#endif
+}
+#endif /* DUK_USE_ES6 */
+
+DUK_LOCAL double duk__round_fixed(double x) {
+ /* Numbers half-way between integers must be rounded towards +Infinity,
+ * e.g. -3.5 must be rounded to -3 (not -4). When rounded to zero, zero
+ * sign must be set appropriately. E5.1 Section 15.8.2.15.
+ *
+ * Note that ANSI C round() is "round to nearest integer, away from zero",
+ * which is incorrect for negative values. Here we make do with floor().
+ */
+
+ duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) {
+ return x;
+ }
+
+ /*
+ * x is finite and non-zero
+ *
+ * -1.6 -> floor(-1.1) -> -2
+ * -1.5 -> floor(-1.0) -> -1 (towards +Inf)
+ * -1.4 -> floor(-0.9) -> -1
+ * -0.5 -> -0.0 (special case)
+ * -0.1 -> -0.0 (special case)
+ * +0.1 -> +0.0 (special case)
+ * +0.5 -> floor(+1.0) -> 1 (towards +Inf)
+ * +1.4 -> floor(+1.9) -> 1
+ * +1.5 -> floor(+2.0) -> 2 (towards +Inf)
+ * +1.6 -> floor(+2.1) -> 2
+ */
+
+ if (x >= -0.5 && x < 0.5) {
+ /* +0.5 is handled by floor, this is on purpose */
+ if (x < 0.0) {
+ return -0.0;
+ } else {
+ return +0.0;
+ }
+ }
+
+ return DUK_FLOOR(x + 0.5);
+}
+
+/* Wrappers for calling standard math library methods. These may be required
+ * on platforms where one or more of the math built-ins are defined as macros
+ * or inline functions and are thus not suitable to be used as function pointers.
+ */
+#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS)
+DUK_LOCAL double duk__fabs(double x) {
+ return DUK_FABS(x);
+}
+DUK_LOCAL double duk__acos(double x) {
+ return DUK_ACOS(x);
+}
+DUK_LOCAL double duk__asin(double x) {
+ return DUK_ASIN(x);
+}
+DUK_LOCAL double duk__atan(double x) {
+ return DUK_ATAN(x);
+}
+DUK_LOCAL double duk__ceil(double x) {
+ return DUK_CEIL(x);
+}
+DUK_LOCAL double duk__cos(double x) {
+ return DUK_COS(x);
+}
+DUK_LOCAL double duk__exp(double x) {
+ return DUK_EXP(x);
+}
+DUK_LOCAL double duk__floor(double x) {
+ return DUK_FLOOR(x);
+}
+DUK_LOCAL double duk__log(double x) {
+ return DUK_LOG(x);
+}
+DUK_LOCAL double duk__sin(double x) {
+ return DUK_SIN(x);
+}
+DUK_LOCAL double duk__sqrt(double x) {
+ return DUK_SQRT(x);
+}
+DUK_LOCAL double duk__tan(double x) {
+ return DUK_TAN(x);
+}
+DUK_LOCAL double duk__atan2_fixed(double x, double y) {
+#if defined(DUK_USE_ATAN2_WORKAROUNDS)
+ /* Specific fixes to common atan2() implementation issues:
+ * - test-bug-mingw-math-issues.js
+ */
+ if (DUK_ISINF(x) && DUK_ISINF(y)) {
+ if (DUK_SIGNBIT(x)) {
+ if (DUK_SIGNBIT(y)) {
+ return -2.356194490192345;
+ } else {
+ return -0.7853981633974483;
+ }
+ } else {
+ if (DUK_SIGNBIT(y)) {
+ return 2.356194490192345;
+ } else {
+ return 0.7853981633974483;
+ }
+ }
+ }
+#else
+ /* Some ISO C assumptions. */
+ DUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == 0.7853981633974483);
+ DUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == -0.7853981633974483);
+ DUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == 2.356194490192345);
+ DUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == -2.356194490192345);
+#endif
+
+ return DUK_ATAN2(x, y);
+}
+#endif /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */
+
+/* order must match constants in genbuiltins.py */
+DUK_LOCAL const duk__one_arg_func duk__one_arg_funcs[] = {
+#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS)
+ duk__fabs,
+ duk__acos,
+ duk__asin,
+ duk__atan,
+ duk__ceil,
+ duk__cos,
+ duk__exp,
+ duk__floor,
+ duk__log,
+ duk__round_fixed,
+ duk__sin,
+ duk__sqrt,
+ duk__tan,
+#if defined(DUK_USE_ES6)
+ duk__cbrt,
+ duk__log2,
+ duk__log10,
+ duk__trunc
+#endif
+#else /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */
+ DUK_FABS,
+ DUK_ACOS,
+ DUK_ASIN,
+ DUK_ATAN,
+ DUK_CEIL,
+ DUK_COS,
+ DUK_EXP,
+ DUK_FLOOR,
+ DUK_LOG,
+ duk__round_fixed,
+ DUK_SIN,
+ DUK_SQRT,
+ DUK_TAN,
+#if defined(DUK_USE_ES6)
+ duk__cbrt,
+ duk__log2,
+ duk__log10,
+ duk__trunc
+#endif
+#endif /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */
+};
+
+/* order must match constants in genbuiltins.py */
+DUK_LOCAL const duk__two_arg_func duk__two_arg_funcs[] = {
+#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS)
+ duk__atan2_fixed,
+ duk_js_arith_pow
+#else
+ duk__atan2_fixed,
+ duk_js_arith_pow
+#endif
+};
+
+DUK_INTERNAL duk_ret_t duk_bi_math_object_onearg_shared(duk_hthread *thr) {
+ duk_small_int_t fun_idx = duk_get_current_magic(thr);
+ duk__one_arg_func fun;
+ duk_double_t arg1;
+
+ DUK_ASSERT(fun_idx >= 0);
+ DUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__one_arg_funcs) / sizeof(duk__one_arg_func)));
+ arg1 = duk_to_number(thr, 0);
+ fun = duk__one_arg_funcs[fun_idx];
+ duk_push_number(thr, (duk_double_t) fun((double) arg1));
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_math_object_twoarg_shared(duk_hthread *thr) {
+ duk_small_int_t fun_idx = duk_get_current_magic(thr);
+ duk__two_arg_func fun;
+ duk_double_t arg1;
+ duk_double_t arg2;
+
+ DUK_ASSERT(fun_idx >= 0);
+ DUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__two_arg_funcs) / sizeof(duk__two_arg_func)));
+ arg1 = duk_to_number(thr, 0); /* explicit ordered evaluation to match coercion semantics */
+ arg2 = duk_to_number(thr, 1);
+ fun = duk__two_arg_funcs[fun_idx];
+ duk_push_number(thr, (duk_double_t) fun((double) arg1, (double) arg2));
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_math_object_max(duk_hthread *thr) {
+ return duk__math_minmax(thr, -DUK_DOUBLE_INFINITY, duk__fmax_fixed);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_math_object_min(duk_hthread *thr) {
+ return duk__math_minmax(thr, DUK_DOUBLE_INFINITY, duk__fmin_fixed);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_math_object_random(duk_hthread *thr) {
+ duk_push_number(thr, (duk_double_t) DUK_UTIL_GET_RANDOM_DOUBLE(thr));
+ return 1;
+}
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_math_object_hypot(duk_hthread *thr) {
+ /*
+ * E6 Section 20.2.2.18: Math.hypot
+ *
+ * - If no arguments are passed, the result is +0.
+ * - If any argument is +inf, the result is +inf.
+ * - If any argument is -inf, the result is +inf.
+ * - If no argument is +inf or -inf, and any argument is NaN, the result is
+ * NaN.
+ * - If all arguments are either +0 or -0, the result is +0.
+ */
+
+ duk_idx_t nargs;
+ duk_idx_t i;
+ duk_bool_t found_nan;
+ duk_double_t max;
+ duk_double_t sum, summand;
+ duk_double_t comp, prelim;
+ duk_double_t t;
+
+ nargs = duk_get_top(thr);
+
+ /* Find the highest value. Also ToNumber() coerces. */
+ max = 0.0;
+ found_nan = 0;
+ for (i = 0; i < nargs; i++) {
+ t = DUK_FABS(duk_to_number(thr, i));
+ if (DUK_FPCLASSIFY(t) == DUK_FP_NAN) {
+ found_nan = 1;
+ } else {
+ max = duk_double_fmax(max, t);
+ }
+ }
+
+ /* Early return cases. */
+ if (max == DUK_DOUBLE_INFINITY) {
+ duk_push_number(thr, DUK_DOUBLE_INFINITY);
+ return 1;
+ } else if (found_nan) {
+ duk_push_number(thr, DUK_DOUBLE_NAN);
+ return 1;
+ } else if (max == 0.0) {
+ duk_push_number(thr, 0.0);
+ /* Otherwise we'd divide by zero. */
+ return 1;
+ }
+
+ /* Use Kahan summation and normalize to the highest value to minimize
+ * floating point rounding error and avoid overflow.
+ *
+ * https://en.wikipedia.org/wiki/Kahan_summation_algorithm
+ */
+ sum = 0.0;
+ comp = 0.0;
+ for (i = 0; i < nargs; i++) {
+ t = DUK_FABS(duk_get_number(thr, i)) / max;
+ summand = (t * t) - comp;
+ prelim = sum + summand;
+ comp = (prelim - sum) - summand;
+ sum = prelim;
+ }
+
+ duk_push_number(thr, (duk_double_t) DUK_SQRT(sum) * max);
+ return 1;
+}
+#endif /* DUK_USE_ES6 */
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_math_object_sign(duk_hthread *thr) {
+ duk_double_t d;
+
+ d = duk_to_number(thr, 0);
+ if (duk_double_is_nan(d)) {
+ DUK_ASSERT(duk_is_nan(thr, -1));
+ return 1; /* NaN input -> return NaN */
+ }
+ if (d == 0.0) {
+ /* Zero sign kept, i.e. -0 -> -0, +0 -> +0. */
+ return 1;
+ }
+ duk_push_int(thr, (d > 0.0 ? 1 : -1));
+ return 1;
+}
+#endif /* DUK_USE_ES6 */
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_math_object_clz32(duk_hthread *thr) {
+ duk_uint32_t x;
+ duk_small_uint_t i;
+
+#if defined(DUK_USE_PREFER_SIZE)
+ duk_uint32_t mask;
+
+ x = duk_to_uint32(thr, 0);
+ for (i = 0, mask = 0x80000000UL; mask != 0; mask >>= 1) {
+ if (x & mask) {
+ break;
+ }
+ i++;
+ }
+ DUK_ASSERT(i <= 32);
+ duk_push_uint(thr, i);
+ return 1;
+#else /* DUK_USE_PREFER_SIZE */
+ i = 0;
+ x = duk_to_uint32(thr, 0);
+ if (x & 0xffff0000UL) {
+ x >>= 16;
+ } else {
+ i += 16;
+ }
+ if (x & 0x0000ff00UL) {
+ x >>= 8;
+ } else {
+ i += 8;
+ }
+ if (x & 0x000000f0UL) {
+ x >>= 4;
+ } else {
+ i += 4;
+ }
+ if (x & 0x0000000cUL) {
+ x >>= 2;
+ } else {
+ i += 2;
+ }
+ if (x & 0x00000002UL) {
+ x >>= 1;
+ } else {
+ i += 1;
+ }
+ if (x & 0x00000001UL) {
+ ;
+ } else {
+ i += 1;
+ }
+ DUK_ASSERT(i <= 32);
+ duk_push_uint(thr, i);
+ return 1;
+#endif /* DUK_USE_PREFER_SIZE */
+}
+#endif /* DUK_USE_ES6 */
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_math_object_imul(duk_hthread *thr) {
+ duk_uint32_t x, y, z;
+
+ x = duk_to_uint32(thr, 0);
+ y = duk_to_uint32(thr, 1);
+ z = x * y;
+
+ /* While arguments are ToUint32() coerced and the multiplication
+ * is unsigned as such, the final result is curiously interpreted
+ * as a signed 32-bit value.
+ */
+ duk_push_i32(thr, (duk_int32_t) z);
+ return 1;
+}
+#endif /* DUK_USE_ES6 */
+
+#endif /* DUK_USE_MATH_BUILTIN */
+#line 1 "duk_bi_number.c"
+/*
+ * Number built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_NUMBER_BUILTIN)
+
+DUK_LOCAL duk_double_t duk__push_this_number_plain(duk_hthread *thr) {
+ duk_hobject *h;
+
+ /* Number built-in accepts a plain number or a Number object (whose
+ * internal value is operated on). Other types cause TypeError.
+ */
+
+ duk_push_this(thr);
+ if (duk_is_number(thr, -1)) {
+ DUK_DDD(DUK_DDDPRINT("plain number value: %!T", (duk_tval *) duk_get_tval(thr, -1)));
+ goto done;
+ }
+ h = duk_get_hobject(thr, -1);
+ if (!h ||
+ (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_NUMBER)) {
+ DUK_DDD(DUK_DDDPRINT("unacceptable this value: %!T", (duk_tval *) duk_get_tval(thr, -1)));
+ DUK_ERROR_TYPE(thr, "number expected");
+ }
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);
+ DUK_ASSERT(duk_is_number(thr, -1));
+ DUK_DDD(DUK_DDDPRINT("number object: %!T, internal value: %!T",
+ (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));
+ duk_remove_m2(thr);
+
+ done:
+ return duk_get_number(thr, -1);
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_number_constructor(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_hobject *h_this;
+
+ /*
+ * The Number constructor uses ToNumber(arg) for number coercion
+ * (coercing an undefined argument to NaN). However, if the
+ * argument is not given at all, +0 must be used instead. To do
+ * this, a vararg function is used.
+ */
+
+ nargs = duk_get_top(thr);
+ if (nargs == 0) {
+ duk_push_int(thr, 0);
+ }
+ duk_to_number(thr, 0);
+ duk_set_top(thr, 1);
+ DUK_ASSERT_TOP(thr, 1);
+
+ if (!duk_is_constructor_call(thr)) {
+ return 1;
+ }
+
+ /*
+ * E5 Section 15.7.2.1 requires that the constructed object
+ * must have the original Number.prototype as its internal
+ * prototype. However, since Number.prototype is non-writable
+ * and non-configurable, this doesn't have to be enforced here:
+ * The default object (bound to 'this') is OK, though we have
+ * to change its class.
+ *
+ * Internal value set to ToNumber(arg) or +0; if no arg given,
+ * ToNumber(undefined) = NaN, so special treatment is needed
+ * (above). String internal value is immutable.
+ */
+
+ /* XXX: helper */
+ duk_push_this(thr);
+ h_this = duk_known_hobject(thr, -1);
+ DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_NUMBER);
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]);
+ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_this) == DUK_HOBJECT_CLASS_NUMBER);
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_this));
+
+ duk_dup_0(thr); /* -> [ val obj val ] */
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);
+ return 0; /* no return value -> don't replace created value */
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_number_prototype_value_of(duk_hthread *thr) {
+ (void) duk__push_this_number_plain(thr);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_string(duk_hthread *thr) {
+ duk_small_int_t radix;
+ duk_small_uint_t n2s_flags;
+
+ (void) duk__push_this_number_plain(thr);
+ if (duk_is_undefined(thr, 0)) {
+ radix = 10;
+ } else {
+ radix = (duk_small_int_t) duk_to_int_check_range(thr, 0, 2, 36);
+ }
+ DUK_DDD(DUK_DDDPRINT("radix=%ld", (long) radix));
+
+ n2s_flags = 0;
+
+ duk_numconv_stringify(thr,
+ radix /*radix*/,
+ 0 /*digits*/,
+ n2s_flags /*flags*/);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_hthread *thr) {
+ /* XXX: just use toString() for now; permitted although not recommended.
+ * nargs==1, so radix is passed to toString().
+ */
+ return duk_bi_number_prototype_to_string(thr);
+}
+
+/*
+ * toFixed(), toExponential(), toPrecision()
+ */
+
+/* XXX: shared helper for toFixed(), toExponential(), toPrecision()? */
+
+DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_fixed(duk_hthread *thr) {
+ duk_small_int_t frac_digits;
+ duk_double_t d;
+ duk_small_int_t c;
+ duk_small_uint_t n2s_flags;
+
+ frac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20);
+ d = duk__push_this_number_plain(thr);
+
+ c = (duk_small_int_t) DUK_FPCLASSIFY(d);
+ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {
+ goto use_to_string;
+ }
+
+ if (d >= 1.0e21 || d <= -1.0e21) {
+ goto use_to_string;
+ }
+
+ n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT |
+ DUK_N2S_FLAG_FRACTION_DIGITS;
+
+ duk_numconv_stringify(thr,
+ 10 /*radix*/,
+ frac_digits /*digits*/,
+ n2s_flags /*flags*/);
+ return 1;
+
+ use_to_string:
+ DUK_ASSERT_TOP(thr, 2);
+ duk_to_string(thr, -1);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_exponential(duk_hthread *thr) {
+ duk_bool_t frac_undefined;
+ duk_small_int_t frac_digits;
+ duk_double_t d;
+ duk_small_int_t c;
+ duk_small_uint_t n2s_flags;
+
+ d = duk__push_this_number_plain(thr);
+
+ frac_undefined = duk_is_undefined(thr, 0);
+ duk_to_int(thr, 0); /* for side effects */
+
+ c = (duk_small_int_t) DUK_FPCLASSIFY(d);
+ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {
+ goto use_to_string;
+ }
+
+ frac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20);
+
+ n2s_flags = DUK_N2S_FLAG_FORCE_EXP |
+ (frac_undefined ? 0 : DUK_N2S_FLAG_FIXED_FORMAT);
+
+ duk_numconv_stringify(thr,
+ 10 /*radix*/,
+ frac_digits + 1 /*leading digit + fractions*/,
+ n2s_flags /*flags*/);
+ return 1;
+
+ use_to_string:
+ DUK_ASSERT_TOP(thr, 2);
+ duk_to_string(thr, -1);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_precision(duk_hthread *thr) {
+ /* The specification has quite awkward order of coercion and
+ * checks for toPrecision(). The operations below are a bit
+ * reordered, within constraints of observable side effects.
+ */
+
+ duk_double_t d;
+ duk_small_int_t prec;
+ duk_small_int_t c;
+ duk_small_uint_t n2s_flags;
+
+ DUK_ASSERT_TOP(thr, 1);
+
+ d = duk__push_this_number_plain(thr);
+ if (duk_is_undefined(thr, 0)) {
+ goto use_to_string;
+ }
+ DUK_ASSERT_TOP(thr, 2);
+
+ duk_to_int(thr, 0); /* for side effects */
+
+ c = (duk_small_int_t) DUK_FPCLASSIFY(d);
+ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {
+ goto use_to_string;
+ }
+
+ prec = (duk_small_int_t) duk_to_int_check_range(thr, 0, 1, 21);
+
+ n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT |
+ DUK_N2S_FLAG_NO_ZERO_PAD;
+
+ duk_numconv_stringify(thr,
+ 10 /*radix*/,
+ prec /*digits*/,
+ n2s_flags /*flags*/);
+ return 1;
+
+ use_to_string:
+ /* Used when precision is undefined; also used for NaN (-> "NaN"),
+ * and +/- infinity (-> "Infinity", "-Infinity").
+ */
+
+ DUK_ASSERT_TOP(thr, 2);
+ duk_to_string(thr, -1);
+ return 1;
+}
+
+#endif /* DUK_USE_NUMBER_BUILTIN */
+#line 1 "duk_bi_object.c"
+/*
+ * Object built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Needed even when Object built-in disabled. */
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr) {
+ duk_tval *tv;
+ tv = DUK_HTHREAD_THIS_PTR(thr);
+ /* XXX: This is not entirely correct anymore; in ES2015 the
+ * default lookup should use @@toStringTag to come up with
+ * e.g. [object Symbol].
+ */
+ duk_push_class_string_tval(thr, tv);
+ return 1;
+}
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor(duk_hthread *thr) {
+ duk_uint_t arg_mask;
+
+ arg_mask = duk_get_type_mask(thr, 0);
+
+ if (!duk_is_constructor_call(thr) && /* not a constructor call */
+ ((arg_mask & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) == 0)) { /* and argument not null or undefined */
+ duk_to_object(thr, 0);
+ return 1;
+ }
+
+ /* Pointer and buffer primitive values are treated like other
+ * primitives values which have a fully fledged object counterpart:
+ * promote to an object value. Lightfuncs and plain buffers are
+ * coerced with ToObject() even they could also be returned as is.
+ */
+ if (arg_mask & (DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_STRING |
+ DUK_TYPE_MASK_BOOLEAN |
+ DUK_TYPE_MASK_NUMBER |
+ DUK_TYPE_MASK_POINTER |
+ DUK_TYPE_MASK_BUFFER |
+ DUK_TYPE_MASK_LIGHTFUNC)) {
+ /* For DUK_TYPE_OBJECT the coercion is a no-op and could
+ * be checked for explicitly, but Object(obj) calls are
+ * not very common so opt for minimal footprint.
+ */
+ duk_to_object(thr, 0);
+ return 1;
+ }
+
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),
+ DUK_BIDX_OBJECT_PROTOTYPE);
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_assign(duk_hthread *thr) {
+ duk_idx_t nargs;
+ duk_int_t idx;
+
+ nargs = duk_get_top_require_min(thr, 1 /*min_top*/);
+
+ duk_to_object(thr, 0);
+ for (idx = 1; idx < nargs; idx++) {
+ /* E7 19.1.2.1 (step 4a) */
+ if (duk_is_null_or_undefined(thr, idx)) {
+ continue;
+ }
+
+ /* duk_enum() respects ES2015+ [[OwnPropertyKeys]] ordering, which is
+ * convenient here.
+ */
+ duk_to_object(thr, idx);
+ duk_enum(thr, idx, DUK_ENUM_OWN_PROPERTIES_ONLY);
+ while (duk_next(thr, -1, 1 /*get_value*/)) {
+ /* [ target ... enum key value ] */
+ duk_put_prop(thr, 0);
+ /* [ target ... enum ] */
+ }
+ /* Could pop enumerator, but unnecessary because of duk_set_top()
+ * below.
+ */
+ }
+
+ duk_set_top(thr, 1);
+ return 1;
+}
+#endif
+
+#if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 2);
+ duk_push_boolean(thr, duk_samevalue(thr, 0, 1));
+ return 1;
+}
+#endif
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_create(duk_hthread *thr) {
+ duk_hobject *proto;
+
+ DUK_ASSERT_TOP(thr, 2);
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ duk_hbufobj_promote_plain(thr, 0);
+#endif
+ proto = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_NULL);
+ DUK_ASSERT(proto != NULL || duk_is_null(thr, 0));
+
+ (void) duk_push_object_helper_proto(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),
+ proto);
+
+ if (!duk_is_undefined(thr, 1)) {
+ /* [ O Properties obj ] */
+
+ duk_replace(thr, 0);
+
+ /* [ obj Properties ] */
+
+ /* Just call the "original" Object.defineProperties() to
+ * finish up.
+ */
+
+ return duk_bi_object_constructor_define_properties(thr);
+ }
+
+ /* [ O Properties obj ] */
+
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_properties(duk_hthread *thr) {
+ duk_small_uint_t pass;
+ duk_uint_t defprop_flags;
+ duk_hobject *obj;
+ duk_idx_t idx_value;
+ duk_hobject *get;
+ duk_hobject *set;
+
+ /* Lightfunc and plain buffer handling by ToObject() coercion. */
+ obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ DUK_ASSERT(obj != NULL);
+
+ duk_to_object(thr, 1); /* properties object */
+
+ DUK_DDD(DUK_DDDPRINT("target=%!iT, properties=%!iT",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1)));
+
+ /*
+ * Two pass approach to processing the property descriptors.
+ * On first pass validate and normalize all descriptors before
+ * any changes are made to the target object. On second pass
+ * make the actual modifications to the target object.
+ *
+ * Right now we'll just use the same normalize/validate helper
+ * on both passes, ignoring its outputs on the first pass.
+ */
+
+ for (pass = 0; pass < 2; pass++) {
+ duk_set_top(thr, 2); /* -> [ hobject props ] */
+ duk_enum(thr, 1, DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_INCLUDE_SYMBOLS /*enum_flags*/);
+
+ for (;;) {
+ duk_hstring *key;
+
+ /* [ hobject props enum(props) ] */
+
+ duk_set_top(thr, 3);
+
+ if (!duk_next(thr, 2, 1 /*get_value*/)) {
+ break;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("-> key=%!iT, desc=%!iT",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* [ hobject props enum(props) key desc ] */
+
+ duk_hobject_prepare_property_descriptor(thr,
+ 4 /*idx_desc*/,
+ &defprop_flags,
+ &idx_value,
+ &get,
+ &set);
+
+ /* [ hobject props enum(props) key desc [multiple values] ] */
+
+ if (pass == 0) {
+ continue;
+ }
+
+ /* This allows symbols on purpose. */
+ key = duk_known_hstring(thr, 3);
+ DUK_ASSERT(key != NULL);
+
+ duk_hobject_define_property_helper(thr,
+ defprop_flags,
+ obj,
+ key,
+ idx_value,
+ get,
+ set,
+ 1 /*throw_flag*/);
+ }
+ }
+
+ /*
+ * Return target object
+ */
+
+ duk_dup_0(thr);
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 1);
+
+ duk_seal_freeze_raw(thr, 0, (duk_bool_t) duk_get_current_magic(thr) /*is_freeze*/);
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_hthread *thr) {
+ duk_hobject *h;
+ duk_bool_t is_frozen;
+ duk_uint_t mask;
+
+ is_frozen = (duk_bool_t) duk_get_current_magic(thr);
+ mask = duk_get_type_mask(thr, 0);
+ if (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) {
+ DUK_ASSERT(is_frozen == 0 || is_frozen == 1);
+ duk_push_boolean(thr, (mask & DUK_TYPE_MASK_LIGHTFUNC) ?
+ 1 : /* lightfunc always frozen and sealed */
+ (is_frozen ^ 1)); /* buffer sealed but not frozen (index props writable) */
+ } else {
+ /* ES2015 Sections 19.1.2.12, 19.1.2.13: anything other than an object
+ * is considered to be already sealed and frozen.
+ */
+ h = duk_get_hobject(thr, 0);
+ duk_push_boolean(thr, (h == NULL) ||
+ duk_hobject_object_is_sealed_frozen_helper(thr, h, is_frozen /*is_frozen*/));
+ }
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 0);
+ (void) duk_push_this_coercible_to_object(thr);
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_TO_STRING);
+#if 0 /* This is mentioned explicitly in the E5.1 spec, but duk_call_method() checks for it in practice. */
+ duk_require_callable(thr, 1);
+#endif
+ duk_dup_0(thr); /* -> [ O toString O ] */
+ duk_call_method(thr, 0); /* XXX: call method tail call? */
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_value_of(duk_hthread *thr) {
+ /* For lightfuncs and plain buffers, returns Object() coerced. */
+ (void) duk_push_this_coercible_to_object(thr);
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_hthread *thr) {
+ duk_hobject *h_v;
+ duk_hobject *h_obj;
+
+ DUK_ASSERT_TOP(thr, 1);
+
+ h_v = duk_get_hobject(thr, 0);
+ if (!h_v) {
+ duk_push_false(thr); /* XXX: tail call: return duk_push_false(thr) */
+ return 1;
+ }
+
+ h_obj = duk_push_this_coercible_to_object(thr);
+ DUK_ASSERT(h_obj != NULL);
+
+ /* E5.1 Section 15.2.4.6, step 3.a, lookup proto once before compare.
+ * Prototype loops should cause an error to be thrown.
+ */
+ duk_push_boolean(thr, duk_hobject_prototype_chain_contains(thr, DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_v), h_obj, 0 /*ignore_loop*/));
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_has_own_property(duk_hthread *thr) {
+ return (duk_ret_t) duk_hobject_object_ownprop_helper(thr, 0 /*required_desc_flags*/);
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_hthread *thr) {
+ return (duk_ret_t) duk_hobject_object_ownprop_helper(thr, DUK_PROPDESC_FLAG_ENUMERABLE /*required_desc_flags*/);
+}
+#endif /* DUK_USE_OBJECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+/* Shared helper to implement Object.getPrototypeOf,
+ * Object.prototype.__proto__ getter, and Reflect.getPrototypeOf.
+ *
+ * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__
+ */
+DUK_INTERNAL duk_ret_t duk_bi_object_getprototype_shared(duk_hthread *thr) {
+ /*
+ * magic = 0: __proto__ getter
+ * magic = 1: Object.getPrototypeOf()
+ * magic = 2: Reflect.getPrototypeOf()
+ */
+
+ duk_hobject *h;
+ duk_hobject *proto;
+ duk_tval *tv;
+ duk_int_t magic;
+
+ magic = duk_get_current_magic(thr);
+
+ if (magic == 0) {
+ DUK_ASSERT_TOP(thr, 0);
+ duk_push_this_coercible_to_object(thr);
+ }
+ DUK_ASSERT(duk_get_top(thr) >= 1);
+ if (magic < 2) {
+ /* ES2015 Section 19.1.2.9, step 1 */
+ duk_to_object(thr, 0);
+ }
+ tv = DUK_GET_TVAL_POSIDX(thr, 0);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_BUFFER:
+ proto = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];
+ break;
+ case DUK_TAG_LIGHTFUNC:
+ proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE];
+ break;
+ case DUK_TAG_OBJECT:
+ h = DUK_TVAL_GET_OBJECT(tv);
+ proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);
+ break;
+ default:
+ /* This implicitly handles CheckObjectCoercible() caused
+ * TypeError.
+ */
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+ if (proto != NULL) {
+ duk_push_hobject(thr, proto);
+ } else {
+ duk_push_null(thr);
+ }
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+/* Shared helper to implement ES2015 Object.setPrototypeOf,
+ * Object.prototype.__proto__ setter, and Reflect.setPrototypeOf.
+ *
+ * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__
+ * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.setprototypeof
+ */
+DUK_INTERNAL duk_ret_t duk_bi_object_setprototype_shared(duk_hthread *thr) {
+ /*
+ * magic = 0: __proto__ setter
+ * magic = 1: Object.setPrototypeOf()
+ * magic = 2: Reflect.setPrototypeOf()
+ */
+
+ duk_hobject *h_obj;
+ duk_hobject *h_new_proto;
+ duk_hobject *h_curr;
+ duk_ret_t ret_success = 1; /* retval for success path */
+ duk_uint_t mask;
+ duk_int_t magic;
+
+ /* Preliminaries for __proto__ and setPrototypeOf (E6 19.1.2.18 steps 1-4). */
+ magic = duk_get_current_magic(thr);
+ if (magic == 0) {
+ duk_push_this_check_object_coercible(thr);
+ duk_insert(thr, 0);
+ if (!duk_check_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT)) {
+ return 0;
+ }
+
+ /* __proto__ setter returns 'undefined' on success unlike the
+ * setPrototypeOf() call which returns the target object.
+ */
+ ret_success = 0;
+ } else {
+ if (magic == 1) {
+ duk_require_object_coercible(thr, 0);
+ } else {
+ duk_require_hobject_accept_mask(thr, 0,
+ DUK_TYPE_MASK_LIGHTFUNC |
+ DUK_TYPE_MASK_BUFFER);
+ }
+ duk_require_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT);
+ }
+
+ h_new_proto = duk_get_hobject(thr, 1);
+ /* h_new_proto may be NULL */
+
+ mask = duk_get_type_mask(thr, 0);
+ if (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) {
+ duk_hobject *curr_proto;
+ curr_proto = thr->builtins[(mask & DUK_TYPE_MASK_LIGHTFUNC) ?
+ DUK_BIDX_FUNCTION_PROTOTYPE :
+ DUK_BIDX_UINT8ARRAY_PROTOTYPE];
+ if (h_new_proto == curr_proto) {
+ goto skip;
+ }
+ goto fail_nonextensible;
+ }
+ h_obj = duk_get_hobject(thr, 0);
+ if (h_obj == NULL) {
+ goto skip;
+ }
+ DUK_ASSERT(h_obj != NULL);
+
+ /* [[SetPrototypeOf]] standard behavior, E6 9.1.2. */
+ /* TODO: implement Proxy object support here */
+
+ if (h_new_proto == DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_obj)) {
+ goto skip;
+ }
+ if (!DUK_HOBJECT_HAS_EXTENSIBLE(h_obj)) {
+ goto fail_nonextensible;
+ }
+ for (h_curr = h_new_proto; h_curr != NULL; h_curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_curr)) {
+ /* Loop prevention. */
+ if (h_curr == h_obj) {
+ goto fail_loop;
+ }
+ }
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h_obj, h_new_proto);
+ /* fall thru */
+
+ skip:
+ duk_set_top(thr, 1);
+ if (magic == 2) {
+ duk_push_true(thr);
+ }
+ return ret_success;
+
+ fail_nonextensible:
+ fail_loop:
+ if (magic != 2) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ } else {
+ duk_push_false(thr);
+ return 1;
+ }
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_property(duk_hthread *thr) {
+ /*
+ * magic = 0: Object.defineProperty()
+ * magic = 1: Reflect.defineProperty()
+ */
+
+ duk_hobject *obj;
+ duk_hstring *key;
+ duk_hobject *get;
+ duk_hobject *set;
+ duk_idx_t idx_value;
+ duk_uint_t defprop_flags;
+ duk_small_uint_t magic;
+ duk_bool_t throw_flag;
+ duk_bool_t ret;
+
+ DUK_ASSERT(thr != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("Object.defineProperty(): ctx=%p obj=%!T key=%!T desc=%!T",
+ (void *) thr,
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1),
+ (duk_tval *) duk_get_tval(thr, 2)));
+
+ /* [ obj key desc ] */
+
+ magic = (duk_small_uint_t) duk_get_current_magic(thr);
+
+ /* Lightfuncs are currently supported by coercing to a temporary
+ * Function object; changes will be allowed (the coerced value is
+ * extensible) but will be lost. Same for plain buffers.
+ */
+ obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ DUK_ASSERT(obj != NULL);
+ key = duk_to_property_key_hstring(thr, 1);
+ (void) duk_require_hobject(thr, 2);
+
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(duk_get_hobject(thr, 2) != NULL);
+
+ /*
+ * Validate and convert argument property descriptor (an Ecmascript
+ * object) into a set of defprop_flags and possibly property value,
+ * getter, and/or setter values on the value stack.
+ *
+ * Lightfunc set/get values are coerced to full Functions.
+ */
+
+ duk_hobject_prepare_property_descriptor(thr,
+ 2 /*idx_desc*/,
+ &defprop_flags,
+ &idx_value,
+ &get,
+ &set);
+
+ /*
+ * Use Object.defineProperty() helper for the actual operation.
+ */
+
+ DUK_ASSERT(magic == 0U || magic == 1U);
+ throw_flag = magic ^ 1U;
+ ret = duk_hobject_define_property_helper(thr,
+ defprop_flags,
+ obj,
+ key,
+ idx_value,
+ get,
+ set,
+ throw_flag);
+
+ /* Ignore the normalize/validate helper outputs on the value stack,
+ * they're popped automatically.
+ */
+
+ if (magic == 0U) {
+ /* Object.defineProperty(): return target object. */
+ duk_push_hobject(thr, obj);
+ } else {
+ /* Reflect.defineProperty(): return success/fail. */
+ duk_push_boolean(thr, ret);
+ }
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 2);
+
+ /* ES2015 Section 19.1.2.6, step 1 */
+ if (duk_get_current_magic(thr) == 0) {
+ duk_to_object(thr, 0);
+ }
+
+ /* [ obj key ] */
+
+ duk_hobject_object_get_own_property_descriptor(thr, -2);
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_extensible(duk_hthread *thr) {
+ /*
+ * magic = 0: Object.isExtensible()
+ * magic = 1: Reflect.isExtensible()
+ */
+
+ duk_hobject *h;
+
+ if (duk_get_current_magic(thr) == 0) {
+ h = duk_get_hobject(thr, 0);
+ } else {
+ /* Reflect.isExtensible(): throw if non-object, but we accept lightfuncs
+ * and plain buffers here because they pretend to be objects.
+ */
+ h = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ }
+
+ duk_push_boolean(thr, (h != NULL) && DUK_HOBJECT_HAS_EXTENSIBLE(h));
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+/* Shared helper for various key/symbol listings, magic:
+ * 0=Object.keys()
+ * 1=Object.getOwnPropertyNames(),
+ * 2=Object.getOwnPropertySymbols(),
+ * 3=Reflect.ownKeys()
+ */
+DUK_LOCAL const duk_small_uint_t duk__object_keys_enum_flags[4] = {
+ /* Object.keys() */
+ DUK_ENUM_OWN_PROPERTIES_ONLY |
+ DUK_ENUM_NO_PROXY_BEHAVIOR,
+
+ /* Object.getOwnPropertyNames() */
+ DUK_ENUM_INCLUDE_NONENUMERABLE |
+ DUK_ENUM_OWN_PROPERTIES_ONLY |
+ DUK_ENUM_NO_PROXY_BEHAVIOR,
+
+ /* Object.getOwnPropertySymbols() */
+ DUK_ENUM_INCLUDE_SYMBOLS |
+ DUK_ENUM_OWN_PROPERTIES_ONLY |
+ DUK_ENUM_EXCLUDE_STRINGS |
+ DUK_ENUM_INCLUDE_NONENUMERABLE |
+ DUK_ENUM_NO_PROXY_BEHAVIOR,
+
+ /* Reflect.ownKeys() */
+ DUK_ENUM_INCLUDE_SYMBOLS |
+ DUK_ENUM_OWN_PROPERTIES_ONLY |
+ DUK_ENUM_INCLUDE_NONENUMERABLE |
+ DUK_ENUM_NO_PROXY_BEHAVIOR
+};
+
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_keys_shared(duk_hthread *thr) {
+ duk_hobject *obj;
+#if defined(DUK_USE_ES6_PROXY)
+ duk_hobject *h_proxy_target;
+ duk_hobject *h_proxy_handler;
+ duk_hobject *h_trap_result;
+#endif
+ duk_small_uint_t enum_flags;
+ duk_int_t magic;
+
+ DUK_ASSERT_TOP(thr, 1);
+
+ magic = duk_get_current_magic(thr);
+ if (magic == 3) {
+ /* ES2015 Section 26.1.11 requires a TypeError for non-objects. Lightfuncs
+ * and plain buffers pretend to be objects, so accept those too.
+ */
+ obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ } else {
+ /* ES2015: ToObject coerce. */
+ obj = duk_to_hobject(thr, 0);
+ }
+ DUK_ASSERT(obj != NULL);
+ DUK_UNREF(obj);
+
+ /* XXX: proxy chains */
+
+#if defined(DUK_USE_ES6_PROXY)
+ /* XXX: better sharing of code between proxy target call sites */
+ if (DUK_LIKELY(!duk_hobject_proxy_check(obj,
+ &h_proxy_target,
+ &h_proxy_handler))) {
+ goto skip_proxy;
+ }
+
+ duk_push_hobject(thr, h_proxy_handler);
+ if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) {
+ /* Careful with reachability here: don't pop 'obj' before pushing
+ * proxy target.
+ */
+ DUK_DDD(DUK_DDDPRINT("no ownKeys trap, get keys of target instead"));
+ duk_pop_2(thr);
+ duk_push_hobject(thr, h_proxy_target);
+ duk_replace(thr, 0);
+ DUK_ASSERT_TOP(thr, 1);
+ goto skip_proxy;
+ }
+
+ /* [ obj handler trap ] */
+ duk_insert(thr, -2);
+ duk_push_hobject(thr, h_proxy_target); /* -> [ obj trap handler target ] */
+ duk_call_method(thr, 1 /*nargs*/); /* -> [ obj trap_result ] */
+ h_trap_result = duk_require_hobject(thr, -1);
+ DUK_UNREF(h_trap_result);
+
+ magic = duk_get_current_magic(thr);
+ DUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t)));
+ enum_flags = duk__object_keys_enum_flags[magic];
+
+ duk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags);
+ return 1;
+
+ skip_proxy:
+#endif /* DUK_USE_ES6_PROXY */
+
+ DUK_ASSERT_TOP(thr, 1);
+ magic = duk_get_current_magic(thr);
+ DUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t)));
+ enum_flags = duk__object_keys_enum_flags[magic];
+ return duk_hobject_get_enumerated_keys(thr, enum_flags);
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_hthread *thr) {
+ /*
+ * magic = 0: Object.preventExtensions()
+ * magic = 1: Reflect.preventExtensions()
+ */
+
+ duk_hobject *h;
+ duk_uint_t mask;
+ duk_int_t magic;
+
+ magic = duk_get_current_magic(thr);
+
+ /* Silent success for lightfuncs and plain buffers always. */
+ mask = DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER;
+
+ /* Object.preventExtensions() silent success for non-object. */
+ if (magic == 0) {
+ mask |= DUK_TYPE_MASK_UNDEFINED |
+ DUK_TYPE_MASK_NULL |
+ DUK_TYPE_MASK_BOOLEAN |
+ DUK_TYPE_MASK_NUMBER |
+ DUK_TYPE_MASK_STRING |
+ DUK_TYPE_MASK_POINTER;
+ }
+
+ if (duk_check_type_mask(thr, 0, mask)) {
+ /* Not an object, already non-extensible so always success. */
+ goto done;
+ }
+ h = duk_require_hobject(thr, 0);
+ DUK_ASSERT(h != NULL);
+
+ DUK_HOBJECT_CLEAR_EXTENSIBLE(h);
+
+ /* A non-extensible object cannot gain any more properties,
+ * so this is a good time to compact.
+ */
+ duk_hobject_compact_props(thr, h);
+
+ done:
+ if (magic == 1) {
+ duk_push_true(thr);
+ }
+ return 1;
+}
+#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */
+
+/*
+ * __defineGetter__, __defineSetter__, __lookupGetter__, __lookupSetter__
+ */
+
+#if defined(DUK_USE_ES8)
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_hthread *thr) {
+ duk_push_this(thr);
+ duk_insert(thr, 0);
+ duk_to_object(thr, 0);
+ duk_require_callable(thr, 2);
+
+ /* [ ToObject(this) key getter/setter ] */
+
+ /* ToPropertyKey() coercion is not needed, duk_def_prop() does it. */
+ duk_def_prop(thr, 0, DUK_DEFPROP_SET_ENUMERABLE |
+ DUK_DEFPROP_SET_CONFIGURABLE |
+ (duk_get_current_magic(thr) ? DUK_DEFPROP_HAVE_SETTER : DUK_DEFPROP_HAVE_GETTER));
+ return 0;
+}
+DUK_INTERNAL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_hthread *thr) {
+ duk_uint_t sanity;
+
+ duk_push_this(thr);
+ duk_to_object(thr, -1);
+
+ /* XXX: Prototype walk (with sanity) should be a core property
+ * operation, could add a flag to e.g. duk_get_prop_desc().
+ */
+
+ /* ToPropertyKey() coercion is not needed, duk_get_prop_desc() does it. */
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ while (!duk_is_undefined(thr, -1)) {
+ /* [ key obj ] */
+ duk_dup(thr, 0);
+ duk_get_prop_desc(thr, 1, 0 /*flags*/);
+ if (!duk_is_undefined(thr, -1)) {
+ duk_get_prop_stridx(thr, -1, (duk_get_current_magic(thr) != 0 ? DUK_STRIDX_SET : DUK_STRIDX_GET));
+ return 1;
+ }
+ duk_pop(thr);
+
+ if (DUK_UNLIKELY(sanity-- == 0)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+
+ duk_get_prototype(thr, -1);
+ duk_remove(thr, -2);
+ }
+ return 1;
+}
+#endif /* DUK_USE_ES8 */
+#line 1 "duk_bi_performance.c"
+/*
+ * High resolution time API (performance.now() et al)
+ *
+ * API specification: https://encoding.spec.whatwg.org/#ap://www.w3.org/TR/hr-time/
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_PERFORMANCE_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_performance_now(duk_hthread *thr) {
+ /* From API spec:
+ * The DOMHighResTimeStamp type is used to store a time value in
+ * milliseconds, measured relative from the time origin, global
+ * monotonic clock, or a time value that represents a duration
+ * between two DOMHighResTimeStamp's.
+ */
+ duk_push_number(thr, duk_time_get_monotonic_time(thr));
+ return 1;
+}
+
+#if 0 /* Missing until semantics decided. */
+DUK_INTERNAL duk_ret_t duk_bi_performance_timeorigin_getter(duk_hthread *thr) {
+ /* No decision yet how to handle timeOrigins, e.g. should one be
+ * initialized per heap, or per global object set. See
+ * https://www.w3.org/TR/hr-time/#time-origin.
+ */
+ duk_push_uint(thr, 0);
+ return 1;
+}
+#endif /* 0 */
+#endif /* DUK_USE_PERFORMANCE_BUILTIN */
+#line 1 "duk_bi_pointer.c"
+/*
+ * Pointer built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Constructor
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_pointer_constructor(duk_hthread *thr) {
+ /* XXX: this behavior is quite useless now; it would be nice to be able
+ * to create pointer values from e.g. numbers or strings. Numbers are
+ * problematic on 64-bit platforms though. Hex encoded strings?
+ */
+ if (duk_get_top(thr) == 0) {
+ duk_push_pointer(thr, NULL);
+ } else {
+ duk_to_pointer(thr, 0);
+ }
+ DUK_ASSERT(duk_is_pointer(thr, 0));
+ duk_set_top(thr, 1);
+
+ if (duk_is_constructor_call(thr)) {
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER),
+ DUK_BIDX_POINTER_PROTOTYPE);
+
+ /* Pointer object internal value is immutable */
+ duk_dup_0(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);
+ }
+ /* Note: unbalanced stack on purpose */
+
+ return 1;
+}
+
+/*
+ * toString(), valueOf()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_hthread *thr) {
+ duk_tval *tv;
+ duk_small_int_t to_string = duk_get_current_magic(thr);
+
+ duk_push_this(thr);
+ tv = duk_require_tval(thr, -1);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_POINTER(tv)) {
+ /* nop */
+ } else if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ /* Must be a "pointer object", i.e. class "Pointer" */
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_POINTER) {
+ goto type_error;
+ }
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);
+ } else {
+ goto type_error;
+ }
+
+ if (to_string) {
+ duk_to_string(thr, -1);
+ }
+ return 1;
+
+ type_error:
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+}
+#line 1 "duk_bi_promise.c"
+/*
+ * Promise built-in
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_PROMISE_BUILTIN)
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_constructor(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_all(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_race(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_reject(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_resolve(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_catch(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_promise_then(duk_hthread *thr) {
+ DUK_ERROR_TYPE(thr, "unimplemented");
+ return 0;
+}
+
+#endif /* DUK_USE_PROMISE_BUILTIN */
+#line 1 "duk_bi_proxy.c"
+/*
+ * Proxy built-in (ES2015)
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_ES6_PROXY)
+/* Post-process a Proxy ownKeys() result at stack top. Push a cleaned up
+ * array of valid result keys (strings or symbols). TypeError for invalid
+ * values. Flags are shared with duk_enum().
+ */
+DUK_INTERNAL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags) {
+ duk_uarridx_t i, len, idx;
+ duk_propdesc desc;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(h_proxy_target != NULL);
+
+ len = (duk_uarridx_t) duk_get_length(thr, -1);
+ idx = 0;
+ duk_push_array(thr);
+ /* XXX: preallocated dense array, fill in directly */
+ for (i = 0; i < len; i++) {
+ duk_hstring *h;
+
+ /* [ obj trap_result res_arr ] */
+ (void) duk_get_prop_index(thr, -2, i);
+ h = duk_get_hstring(thr, -1);
+ if (h == NULL) {
+ DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr);
+ }
+
+ if (!(flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) {
+ /* No support for 'getOwnPropertyDescriptor' trap yet,
+ * so check enumerability always from target object
+ * descriptor.
+ */
+ if (duk_hobject_get_own_propdesc(thr, h_proxy_target, duk_known_hstring(thr, -1), &desc, 0 /*flags*/)) {
+ if ((desc.flags & DUK_PROPDESC_FLAG_ENUMERABLE) == 0) {
+ DUK_DDD(DUK_DDDPRINT("ignore non-enumerable property: %!T", duk_get_tval(thr, -1)));
+ goto skip_key;
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("ignore non-existent property: %!T", duk_get_tval(thr, -1)));
+ goto skip_key;
+ }
+ }
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ if (!(flags & DUK_ENUM_INCLUDE_SYMBOLS)) {
+ DUK_DDD(DUK_DDDPRINT("ignore symbol property: %!T", duk_get_tval(thr, -1)));
+ goto skip_key;
+ }
+ if (DUK_HSTRING_HAS_HIDDEN(h) && !(flags & DUK_ENUM_INCLUDE_HIDDEN)) {
+ DUK_DDD(DUK_DDDPRINT("ignore hidden symbol property: %!T", duk_get_tval(thr, -1)));
+ goto skip_key;
+ }
+ } else {
+ if (flags & DUK_ENUM_EXCLUDE_STRINGS) {
+ DUK_DDD(DUK_DDDPRINT("ignore string property: %!T", duk_get_tval(thr, -1)));
+ goto skip_key;
+ }
+ }
+
+ /* [ obj trap_result res_arr propname ] */
+ duk_put_prop_index(thr, -2, idx++);
+ continue;
+
+ skip_key:
+ duk_pop(thr);
+ continue;
+ }
+
+ /* XXX: Missing trap result validation for non-configurable target keys
+ * (must be present), for non-extensible target all target keys must be
+ * present and no extra keys can be present.
+ * http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys
+ */
+
+ /* XXX: The key enumerability check should trigger the "getOwnPropertyDescriptor"
+ * trap which has not yet been implemented. In the absence of such a trap,
+ * the enumerability should be checked from the target object; this is
+ * handled above.
+ */
+}
+#endif /* DUK_USE_ES6_PROXY */
+
+#if defined(DUK_USE_ES6_PROXY)
+DUK_INTERNAL duk_ret_t duk_bi_proxy_constructor(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 2); /* [ target handler ] */
+
+ duk_require_constructor_call(thr);
+ duk_push_proxy(thr, 0 /*flags*/); /* [ target handler ] -> [ proxy ] */
+ return 1; /* replacement */
+}
+#endif /* DUK_USE_ES6_PROXY */
+#line 1 "duk_bi_reflect.c"
+/*
+ * 'Reflect' built-in (ES2016 Section 26.1)
+ * http://www.ecma-international.org/ecma-262/7.0/#sec-reflect-object
+ *
+ * Many Reflect built-in functions are provided by shared helpers in
+ * duk_bi_object.c or duk_bi_function.c.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_REFLECT_BUILTIN)
+DUK_INTERNAL duk_ret_t duk_bi_reflect_object_delete_property(duk_hthread *thr) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_bool_t ret;
+
+ DUK_ASSERT_TOP(thr, 2);
+ (void) duk_require_hobject(thr, 0);
+ (void) duk_to_string(thr, 1);
+
+ /* [ target key ] */
+
+ DUK_ASSERT(thr != NULL);
+ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0);
+ tv_key = DUK_GET_TVAL_POSIDX(thr, 1);
+ ret = duk_hobject_delprop(thr, tv_obj, tv_key, 0 /*throw_flag*/);
+ duk_push_boolean(thr, ret);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_reflect_object_get(duk_hthread *thr) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_idx_t nargs;
+
+ DUK_ASSERT(thr != NULL);
+ nargs = duk_get_top_require_min(thr, 2 /*min_top*/);
+ (void) duk_require_hobject(thr, 0);
+ (void) duk_to_string(thr, 1);
+ if (nargs >= 3 && !duk_strict_equals(thr, 0, 2)) {
+ /* XXX: [[Get]] receiver currently unsupported */
+ DUK_ERROR_UNSUPPORTED(thr);
+ }
+
+ /* [ target key receiver? ...? ] */
+
+ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0);
+ tv_key = DUK_GET_TVAL_POSIDX(thr, 1);
+ (void) duk_hobject_getprop(thr, tv_obj, tv_key); /* This could also be a duk_get_prop(). */
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_reflect_object_has(duk_hthread *thr) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_bool_t ret;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT_TOP(thr, 2);
+ (void) duk_require_hobject(thr, 0);
+ (void) duk_to_string(thr, 1);
+
+ /* [ target key ] */
+
+ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0);
+ tv_key = DUK_GET_TVAL_POSIDX(thr, 1);
+ ret = duk_hobject_hasprop(thr, tv_obj, tv_key);
+ duk_push_boolean(thr, ret);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_reflect_object_set(duk_hthread *thr) {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_tval *tv_val;
+ duk_idx_t nargs;
+ duk_bool_t ret;
+
+ DUK_ASSERT(thr != NULL);
+ nargs = duk_get_top_require_min(thr, 3 /*min_top*/);
+ (void) duk_require_hobject(thr, 0);
+ (void) duk_to_string(thr, 1);
+ if (nargs >= 4 && !duk_strict_equals(thr, 0, 3)) {
+ /* XXX: [[Set]] receiver currently unsupported */
+ DUK_ERROR_UNSUPPORTED(thr);
+ }
+
+ /* [ target key value receiver? ...? ] */
+
+ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0);
+ tv_key = DUK_GET_TVAL_POSIDX(thr, 1);
+ tv_val = DUK_GET_TVAL_POSIDX(thr, 2);
+ ret = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, 0 /*throw_flag*/);
+ duk_push_boolean(thr, ret);
+ return 1;
+}
+#endif /* DUK_USE_REFLECT_BUILTIN */
+#line 1 "duk_bi_regexp.c"
+/*
+ * RegExp built-ins
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+
+DUK_LOCAL void duk__get_this_regexp(duk_hthread *thr) {
+ duk_hobject *h;
+
+ duk_push_this(thr);
+ h = duk_require_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_REGEXP);
+ DUK_ASSERT(h != NULL);
+ DUK_UNREF(h);
+ duk_insert(thr, 0); /* prepend regexp to valstack 0 index */
+}
+
+/* XXX: much to improve (code size) */
+DUK_INTERNAL duk_ret_t duk_bi_regexp_constructor(duk_hthread *thr) {
+ duk_hobject *h_pattern;
+
+ DUK_ASSERT_TOP(thr, 2);
+ h_pattern = duk_get_hobject(thr, 0);
+
+ if (!duk_is_constructor_call(thr) &&
+ h_pattern != NULL &&
+ DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP &&
+ duk_is_undefined(thr, 1)) {
+ /* Called as a function, pattern has [[Class]] "RegExp" and
+ * flags is undefined -> return object as is.
+ */
+ /* XXX: ES2015 has a NewTarget SameValue() check which is not
+ * yet implemented.
+ */
+ duk_dup_0(thr);
+ return 1;
+ }
+
+ /* Else functionality is identical for function call and constructor
+ * call.
+ */
+
+ if (h_pattern != NULL &&
+ DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP) {
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_SOURCE);
+ if (duk_is_undefined(thr, 1)) {
+ /* In ES5 one would need to read the flags individually;
+ * in ES2015 just read .flags.
+ */
+ duk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS);
+ } else {
+ /* In ES2015 allowed; overrides argument RegExp flags. */
+ duk_dup_1(thr);
+ }
+ } else {
+ if (duk_is_undefined(thr, 0)) {
+ duk_push_hstring_empty(thr);
+ } else {
+ duk_dup_0(thr);
+ duk_to_string(thr, -1); /* Rejects Symbols. */
+ }
+ if (duk_is_undefined(thr, 1)) {
+ duk_push_hstring_empty(thr);
+ } else {
+ duk_dup_1(thr);
+ duk_to_string(thr, -1); /* Rejects Symbols. */
+ }
+
+ /* [ ... pattern flags ] */
+ }
+
+ DUK_DDD(DUK_DDDPRINT("RegExp constructor/function call, pattern=%!T, flags=%!T",
+ (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* [ ... pattern flags ] (both uncoerced) */
+
+ duk_to_string(thr, -2);
+ duk_to_string(thr, -1);
+ duk_regexp_compile(thr);
+
+ /* [ ... bytecode escaped_source ] */
+
+ duk_regexp_create_instance(thr);
+
+ /* [ ... RegExp ] */
+
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_exec(duk_hthread *thr) {
+ duk__get_this_regexp(thr);
+
+ /* [ regexp input ] */
+
+ duk_regexp_match(thr);
+
+ /* [ result ] */
+
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_test(duk_hthread *thr) {
+ duk__get_this_regexp(thr);
+
+ /* [ regexp input ] */
+
+ /* result object is created and discarded; wasteful but saves code space */
+ duk_regexp_match(thr);
+
+ /* [ result ] */
+
+ duk_push_boolean(thr, (duk_is_null(thr, -1) ? 0 : 1));
+
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_tostring(duk_hthread *thr) {
+ /* This must be generic in ES2015 and later. */
+ DUK_ASSERT_TOP(thr, 0);
+ duk_push_this(thr);
+ duk_push_string(thr, "/");
+ duk_get_prop_stridx(thr, 0, DUK_STRIDX_SOURCE);
+ duk_dup_m2(thr); /* another "/" */
+ duk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS);
+ duk_concat(thr, 4);
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_flags(duk_hthread *thr) {
+ /* .flags is ES2015 but present even when ES2015 bindings are
+ * disabled because the constructor relies on it.
+ */
+ duk_uint8_t buf[8]; /* enough for all flags + NUL */
+ duk_uint8_t *p = buf;
+
+ /* .flags is generic and works on any object. */
+ duk_push_this(thr);
+ (void) duk_require_hobject(thr, -1);
+ if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL)) {
+ *p++ = DUK_ASC_LC_G;
+ }
+ if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_IGNORE_CASE, NULL)) {
+ *p++ = DUK_ASC_LC_I;
+ }
+ if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_MULTILINE, NULL)) {
+ *p++ = DUK_ASC_LC_M;
+ }
+ /* .unicode: to be added */
+ /* .sticky: to be added */
+ *p++ = DUK_ASC_NUL;
+ DUK_ASSERT((duk_size_t) (p - buf) <= sizeof(buf));
+
+ duk_push_string(thr, (const char *) buf);
+ return 1;
+}
+
+/* Shared helper for providing .source, .global, .multiline, etc getters. */
+DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_hthread *thr) {
+ duk_hstring *h_bc;
+ duk_small_uint_t re_flags;
+ duk_hobject *h;
+ duk_int_t magic;
+
+ DUK_ASSERT_TOP(thr, 0);
+
+ duk_push_this(thr);
+ h = duk_require_hobject(thr, -1);
+ magic = duk_get_current_magic(thr);
+
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_REGEXP) {
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_SOURCE);
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_BYTECODE);
+ h_bc = duk_require_hstring(thr, -1);
+ re_flags = (duk_small_uint_t) DUK_HSTRING_GET_DATA(h_bc)[0]; /* Safe even if h_bc length is 0 (= NUL) */
+ duk_pop(thr);
+ } else if (h == thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]) {
+ /* In ES2015 and ES2016 a TypeError would be thrown here.
+ * However, this had real world issues so ES2017 draft
+ * allows RegExp.prototype specifically, returning '(?:)'
+ * for .source and undefined for all flags.
+ */
+ if (magic != 16 /* .source */) {
+ return 0;
+ }
+ duk_push_string(thr, "(?:)"); /* .source handled by switch-case */
+ re_flags = 0;
+ } else {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+ }
+
+ /* [ regexp source ] */
+
+ switch (magic) {
+ case 0: { /* global */
+ duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_GLOBAL));
+ break;
+ }
+ case 1: { /* ignoreCase */
+ duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_IGNORE_CASE));
+ break;
+ }
+ case 2: { /* multiline */
+ duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_MULTILINE));
+ break;
+ }
+#if 0
+ /* Don't provide until implemented to avoid interfering with feature
+ * detection in user code.
+ */
+ case 3: /* sticky */
+ case 4: { /* unicode */
+ duk_push_false(thr);
+ break;
+ }
+#endif
+ default: { /* source */
+ /* leave 'source' on top */
+ break;
+ }
+ }
+
+ return 1;
+}
+
+#endif /* DUK_USE_REGEXP_SUPPORT */
+#line 1 "duk_bi_string.c"
+/*
+ * String built-ins
+ *
+ * Most String built-ins must only accept strings (or String objects).
+ * Symbols, represented internally as strings, must be generally rejected.
+ * The duk_push_this_coercible_to_string() helper does this automatically.
+ */
+
+/* XXX: There are several limitations in the current implementation for
+ * strings with >= 0x80000000UL characters. In some cases one would need
+ * to be able to represent the range [-0xffffffff,0xffffffff] and so on.
+ * Generally character and byte length are assumed to fit into signed 32
+ * bits (< 0x80000000UL). Places with issues are not marked explicitly
+ * below in all cases, look for signed type usage (duk_int_t etc) for
+ * offsets/lengths.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_STRING_BUILTIN)
+
+/*
+ * Helpers
+ */
+
+DUK_LOCAL duk_hstring *duk__str_tostring_notregexp(duk_hthread *thr, duk_idx_t idx) {
+ duk_hstring *h;
+
+ if (duk_get_class_number(thr, idx) == DUK_HOBJECT_CLASS_REGEXP) {
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+ h = duk_to_hstring(thr, idx);
+ DUK_ASSERT(h != NULL);
+
+ return h;
+}
+
+DUK_LOCAL duk_int_t duk__str_search_shared(duk_hthread *thr, duk_hstring *h_this, duk_hstring *h_search, duk_int_t start_cpos, duk_bool_t backwards) {
+ duk_int_t cpos;
+ duk_int_t bpos;
+ const duk_uint8_t *p_start, *p_end, *p;
+ const duk_uint8_t *q_start;
+ duk_int_t q_blen;
+ duk_uint8_t firstbyte;
+ duk_uint8_t t;
+
+ cpos = start_cpos;
+
+ /* Empty searchstring always matches; cpos must be clamped here.
+ * (If q_blen were < 0 due to clamped coercion, it would also be
+ * caught here.)
+ */
+ q_start = DUK_HSTRING_GET_DATA(h_search);
+ q_blen = (duk_int_t) DUK_HSTRING_GET_BYTELEN(h_search);
+ if (q_blen <= 0) {
+ return cpos;
+ }
+ DUK_ASSERT(q_blen > 0);
+
+ bpos = (duk_int_t) duk_heap_strcache_offset_char2byte(thr, h_this, (duk_uint32_t) cpos);
+
+ p_start = DUK_HSTRING_GET_DATA(h_this);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_this);
+ p = p_start + bpos;
+
+ /* This loop is optimized for size. For speed, there should be
+ * two separate loops, and we should ensure that memcmp() can be
+ * used without an extra "will searchstring fit" check. Doing
+ * the preconditioning for 'p' and 'p_end' is easy but cpos
+ * must be updated if 'p' is wound back (backward scanning).
+ */
+
+ firstbyte = q_start[0]; /* leading byte of match string */
+ while (p <= p_end && p >= p_start) {
+ t = *p;
+
+ /* For Ecmascript strings, this check can only match for
+ * initial UTF-8 bytes (not continuation bytes). For other
+ * strings all bets are off.
+ */
+
+ if ((t == firstbyte) && ((duk_size_t) (p_end - p) >= (duk_size_t) q_blen)) {
+ DUK_ASSERT(q_blen > 0); /* no issues with memcmp() zero size, even if broken */
+ if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) {
+ return cpos;
+ }
+ }
+
+ /* track cpos while scanning */
+ if (backwards) {
+ /* when going backwards, we decrement cpos 'early';
+ * 'p' may point to a continuation byte of the char
+ * at offset 'cpos', but that's OK because we'll
+ * backtrack all the way to the initial byte.
+ */
+ if ((t & 0xc0) != 0x80) {
+ cpos--;
+ }
+ p--;
+ } else {
+ if ((t & 0xc0) != 0x80) {
+ cpos++;
+ }
+ p++;
+ }
+ }
+
+ /* Not found. Empty string case is handled specially above. */
+ return -1;
+}
+
+/*
+ * Constructor
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_constructor(duk_hthread *thr) {
+ duk_hstring *h;
+ duk_uint_t flags;
+
+ /* String constructor needs to distinguish between an argument not given at all
+ * vs. given as 'undefined'. We're a vararg function to handle this properly.
+ */
+
+ /* XXX: copy current activation flags to thr, including current magic,
+ * is_constructor_call etc. This takes a few bytes in duk_hthread but
+ * makes call sites smaller (there are >30 is_constructor_call and get
+ * current magic call sites.
+ */
+
+ if (duk_get_top(thr) == 0) {
+ duk_push_hstring_empty(thr);
+ } else {
+ h = duk_to_hstring_acceptsymbol(thr, 0);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h) && !duk_is_constructor_call(thr))) {
+ duk_push_symbol_descriptive_string(thr, h);
+ duk_replace(thr, 0);
+ }
+ }
+ duk_to_string(thr, 0); /* catches symbol argument for constructor call */
+ DUK_ASSERT(duk_is_string(thr, 0));
+ duk_set_top(thr, 1); /* Top may be 1 or larger. */
+
+ if (duk_is_constructor_call(thr)) {
+ /* String object internal value is immutable */
+ flags = DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING);
+ duk_push_object_helper(thr, flags, DUK_BIDX_STRING_PROTOTYPE);
+ duk_dup_0(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);
+ }
+ /* Note: unbalanced stack on purpose */
+
+ return 1;
+}
+
+DUK_LOCAL duk_ret_t duk__construct_from_codepoints(duk_hthread *thr, duk_bool_t nonbmp) {
+ duk_bufwriter_ctx bw_alloc;
+ duk_bufwriter_ctx *bw;
+ duk_idx_t i, n;
+ duk_ucodepoint_t cp;
+
+ /* XXX: It would be nice to build the string directly but ToUint16()
+ * coercion is needed so a generic helper would not be very
+ * helpful (perhaps coerce the value stack first here and then
+ * build a string from a duk_tval number sequence in one go?).
+ */
+
+ n = duk_get_top(thr);
+
+ bw = &bw_alloc;
+ DUK_BW_INIT_PUSHBUF(thr, bw, (duk_size_t) n); /* initial estimate for ASCII only codepoints */
+
+ for (i = 0; i < n; i++) {
+ /* XXX: could improve bufwriter handling to write multiple codepoints
+ * with one ensure call but the relative benefit would be quite small.
+ */
+
+ if (nonbmp) {
+ /* ES2015 requires that (1) SameValue(cp, ToInteger(cp)) and
+ * (2) cp >= 0 and cp <= 0x10ffff. This check does not
+ * implement the steps exactly but the outcome should be
+ * the same.
+ */
+ duk_int32_t i32 = 0;
+ if (!duk_is_whole_get_int32(duk_to_number(thr, i), &i32) ||
+ i32 < 0 || i32 > 0x10ffffL) {
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+ }
+ DUK_ASSERT(i32 >= 0 && i32 <= 0x10ffffL);
+ cp = (duk_ucodepoint_t) i32;
+ DUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp);
+ } else {
+#if defined(DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT)
+ /* ToUint16() coercion is mandatory in the E5.1 specification, but
+ * this non-compliant behavior makes more sense because we support
+ * non-BMP codepoints. Don't use CESU-8 because that'd create
+ * surrogate pairs.
+ */
+ cp = (duk_ucodepoint_t) duk_to_uint32(thr, i);
+ DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp);
+#else
+ cp = (duk_ucodepoint_t) duk_to_uint16(thr, i);
+ DUK_ASSERT(cp >= 0 && cp <= 0x10ffffL);
+ DUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp);
+#endif
+ }
+ }
+
+ DUK_BW_COMPACT(thr, bw);
+ (void) duk_buffer_to_string(thr, -1); /* Safe, extended UTF-8 or CESU-8 encoded. */
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_char_code(duk_hthread *thr) {
+ return duk__construct_from_codepoints(thr, 0 /*nonbmp*/);
+}
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_code_point(duk_hthread *thr) {
+ return duk__construct_from_codepoints(thr, 1 /*nonbmp*/);
+}
+#endif
+
+/*
+ * toString(), valueOf()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_to_string(duk_hthread *thr) {
+ duk_tval *tv;
+
+ duk_push_this(thr);
+ tv = duk_require_tval(thr, -1);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_IS_STRING(tv)) {
+ /* return as is */
+ } else if (DUK_TVAL_IS_OBJECT(tv)) {
+ duk_hobject *h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+
+ /* Must be a "string object", i.e. class "String" */
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_STRING) {
+ goto type_error;
+ }
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);
+ DUK_ASSERT(duk_is_string(thr, -1));
+ } else {
+ goto type_error;
+ }
+
+ (void) duk_require_hstring_notsymbol(thr, -1); /* Reject symbols (and wrapped symbols). */
+ return 1;
+
+ type_error:
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+}
+
+/*
+ * Character and charcode access
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_at(duk_hthread *thr) {
+ duk_int_t pos;
+
+ /* XXX: faster implementation */
+
+ (void) duk_push_this_coercible_to_string(thr);
+ pos = duk_to_int(thr, 0);
+ duk_substring(thr, -1, (duk_size_t) pos, (duk_size_t) (pos + 1));
+ return 1;
+}
+
+/* Magic: 0=charCodeAt, 1=codePointAt */
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_code_at(duk_hthread *thr) {
+ duk_int_t pos;
+ duk_hstring *h;
+ duk_bool_t clamped;
+ duk_uint32_t cp;
+ duk_int_t magic;
+
+ /* XXX: faster implementation */
+
+ DUK_DDD(DUK_DDDPRINT("arg=%!T", (duk_tval *) duk_get_tval(thr, 0)));
+
+ h = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h != NULL);
+
+ pos = duk_to_int_clamped_raw(thr,
+ 0 /*index*/,
+ 0 /*min(incl)*/,
+ (duk_int_t) DUK_HSTRING_GET_CHARLEN(h) - 1 /*max(incl)*/,
+ &clamped /*out_clamped*/);
+#if defined(DUK_USE_ES6)
+ magic = duk_get_current_magic(thr);
+#else
+ DUK_ASSERT(duk_get_current_magic(thr) == 0);
+ magic = 0;
+#endif
+ if (clamped) {
+ /* For out-of-bounds indices .charCodeAt() returns NaN and
+ * .codePointAt() returns undefined.
+ */
+ if (magic != 0) {
+ return 0;
+ }
+ duk_push_nan(thr);
+ } else {
+ DUK_ASSERT(pos >= 0);
+ cp = (duk_uint32_t) duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) pos, (duk_bool_t) magic /*surrogate_aware*/);
+ duk_push_u32(thr, cp);
+ }
+ return 1;
+}
+
+/*
+ * substring(), substr(), slice()
+ */
+
+/* XXX: any chance of merging these three similar but still slightly
+ * different algorithms so that footprint would be reduced?
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_substring(duk_hthread *thr) {
+ duk_hstring *h;
+ duk_int_t start_pos, end_pos;
+ duk_int_t len;
+
+ h = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h != NULL);
+ len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);
+
+ /* [ start end str ] */
+
+ start_pos = duk_to_int_clamped(thr, 0, 0, len);
+ if (duk_is_undefined(thr, 1)) {
+ end_pos = len;
+ } else {
+ end_pos = duk_to_int_clamped(thr, 1, 0, len);
+ }
+ DUK_ASSERT(start_pos >= 0 && start_pos <= len);
+ DUK_ASSERT(end_pos >= 0 && end_pos <= len);
+
+ if (start_pos > end_pos) {
+ duk_int_t tmp = start_pos;
+ start_pos = end_pos;
+ end_pos = tmp;
+ }
+
+ DUK_ASSERT(end_pos >= start_pos);
+
+ duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos);
+ return 1;
+}
+
+#if defined(DUK_USE_SECTION_B)
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_substr(duk_hthread *thr) {
+ duk_hstring *h;
+ duk_int_t start_pos, end_pos;
+ duk_int_t len;
+
+ /* Unlike non-obsolete String calls, substr() algorithm in E5.1
+ * specification will happily coerce undefined and null to strings
+ * ("undefined" and "null").
+ */
+ duk_push_this(thr);
+ h = duk_to_hstring_m1(thr); /* Reject Symbols. */
+ DUK_ASSERT(h != NULL);
+ len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);
+
+ /* [ start length str ] */
+
+ /* The implementation for computing of start_pos and end_pos differs
+ * from the standard algorithm, but is intended to result in the exactly
+ * same behavior. This is not always obvious.
+ */
+
+ /* combines steps 2 and 5; -len ensures max() not needed for step 5 */
+ start_pos = duk_to_int_clamped(thr, 0, -len, len);
+ if (start_pos < 0) {
+ start_pos = len + start_pos;
+ }
+ DUK_ASSERT(start_pos >= 0 && start_pos <= len);
+
+ /* combines steps 3, 6; step 7 is not needed */
+ if (duk_is_undefined(thr, 1)) {
+ end_pos = len;
+ } else {
+ DUK_ASSERT(start_pos <= len);
+ end_pos = start_pos + duk_to_int_clamped(thr, 1, 0, len - start_pos);
+ }
+ DUK_ASSERT(start_pos >= 0 && start_pos <= len);
+ DUK_ASSERT(end_pos >= 0 && end_pos <= len);
+ DUK_ASSERT(end_pos >= start_pos);
+
+ duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos);
+ return 1;
+}
+#endif /* DUK_USE_SECTION_B */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_slice(duk_hthread *thr) {
+ duk_hstring *h;
+ duk_int_t start_pos, end_pos;
+ duk_int_t len;
+
+ h = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h != NULL);
+ len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);
+
+ /* [ start end str ] */
+
+ start_pos = duk_to_int_clamped(thr, 0, -len, len);
+ if (start_pos < 0) {
+ start_pos = len + start_pos;
+ }
+ if (duk_is_undefined(thr, 1)) {
+ end_pos = len;
+ } else {
+ end_pos = duk_to_int_clamped(thr, 1, -len, len);
+ if (end_pos < 0) {
+ end_pos = len + end_pos;
+ }
+ }
+ DUK_ASSERT(start_pos >= 0 && start_pos <= len);
+ DUK_ASSERT(end_pos >= 0 && end_pos <= len);
+
+ if (end_pos < start_pos) {
+ end_pos = start_pos;
+ }
+
+ DUK_ASSERT(end_pos >= start_pos);
+
+ duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos);
+ return 1;
+}
+
+/*
+ * Case conversion
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_hthread *thr) {
+ duk_small_int_t uppercase = duk_get_current_magic(thr);
+
+ (void) duk_push_this_coercible_to_string(thr);
+ duk_unicode_case_convert_string(thr, (duk_bool_t) uppercase);
+ return 1;
+}
+
+/*
+ * indexOf() and lastIndexOf()
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_hthread *thr) {
+ duk_hstring *h_this;
+ duk_hstring *h_search;
+ duk_int_t clen_this;
+ duk_int_t cpos;
+ duk_small_uint_t is_lastindexof = (duk_small_uint_t) duk_get_current_magic(thr); /* 0=indexOf, 1=lastIndexOf */
+
+ h_this = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h_this != NULL);
+ clen_this = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h_this);
+
+ h_search = duk_to_hstring(thr, 0);
+ DUK_ASSERT(h_search != NULL);
+
+ duk_to_number(thr, 1);
+ if (duk_is_nan(thr, 1) && is_lastindexof) {
+ /* indexOf: NaN should cause pos to be zero.
+ * lastIndexOf: NaN should cause pos to be +Infinity
+ * (and later be clamped to len).
+ */
+ cpos = clen_this;
+ } else {
+ cpos = duk_to_int_clamped(thr, 1, 0, clen_this);
+ }
+
+ cpos = duk__str_search_shared(thr, h_this, h_search, cpos, is_lastindexof /*backwards*/);
+ duk_push_int(thr, cpos);
+ return 1;
+}
+
+/*
+ * replace()
+ */
+
+/* XXX: the current implementation works but is quite clunky; it compiles
+ * to almost 1,4kB of x86 code so it needs to be simplified (better approach,
+ * shared helpers, etc). Some ideas for refactoring:
+ *
+ * - a primitive to convert a string into a regexp matcher (reduces matching
+ * code at the cost of making matching much slower)
+ * - use replace() as a basic helper for match() and split(), which are both
+ * much simpler
+ * - API call to get_prop and to_boolean
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_replace(duk_hthread *thr) {
+ duk_hstring *h_input;
+ duk_hstring *h_match;
+ duk_hstring *h_search;
+ duk_hobject *h_re;
+ duk_bufwriter_ctx bw_alloc;
+ duk_bufwriter_ctx *bw;
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_bool_t is_regexp;
+ duk_bool_t is_global;
+#endif
+ duk_bool_t is_repl_func;
+ duk_uint32_t match_start_coff, match_start_boff;
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_int_t match_caps;
+#endif
+ duk_uint32_t prev_match_end_boff;
+ const duk_uint8_t *r_start, *r_end, *r; /* repl string scan */
+ duk_size_t tmp_sz;
+
+ DUK_ASSERT_TOP(thr, 2);
+ h_input = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h_input != NULL);
+
+ bw = &bw_alloc;
+ DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* input size is good output starting point */
+
+ DUK_ASSERT_TOP(thr, 4);
+
+ /* stack[0] = search value
+ * stack[1] = replace value
+ * stack[2] = input string
+ * stack[3] = result buffer
+ */
+
+ h_re = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP);
+ if (h_re) {
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ is_regexp = 1;
+ is_global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL);
+
+ if (is_global) {
+ /* start match from beginning */
+ duk_push_int(thr, 0);
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ }
+#else /* DUK_USE_REGEXP_SUPPORT */
+ DUK_DCERROR_UNSUPPORTED(thr);
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ } else {
+ duk_to_string(thr, 0); /* rejects symbols */
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ is_regexp = 0;
+ is_global = 0;
+#endif
+ }
+
+ if (duk_is_function(thr, 1)) {
+ is_repl_func = 1;
+ r_start = NULL;
+ r_end = NULL;
+ } else {
+ duk_hstring *h_repl;
+
+ is_repl_func = 0;
+ h_repl = duk_to_hstring(thr, 1); /* reject symbols */
+ DUK_ASSERT(h_repl != NULL);
+ r_start = DUK_HSTRING_GET_DATA(h_repl);
+ r_end = r_start + DUK_HSTRING_GET_BYTELEN(h_repl);
+ }
+
+ prev_match_end_boff = 0;
+
+ for (;;) {
+ /*
+ * If matching with a regexp:
+ * - non-global RegExp: lastIndex not touched on a match, zeroed
+ * on a non-match
+ * - global RegExp: on match, lastIndex will be updated by regexp
+ * executor to point to next char after the matching part (so that
+ * characters in the matching part are not matched again)
+ *
+ * If matching with a string:
+ * - always non-global match, find first occurrence
+ *
+ * We need:
+ * - The character offset of start-of-match for the replacer function
+ * - The byte offsets for start-of-match and end-of-match to implement
+ * the replacement values $&, $`, and $', and to copy non-matching
+ * input string portions (including header and trailer) verbatim.
+ *
+ * NOTE: the E5.1 specification is a bit vague how the RegExp should
+ * behave in the replacement process; e.g. is matching done first for
+ * all matches (in the global RegExp case) before any replacer calls
+ * are made? See: test-bi-string-proto-replace.js for discussion.
+ */
+
+ DUK_ASSERT_TOP(thr, 4);
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ if (is_regexp) {
+ duk_dup_0(thr);
+ duk_dup_2(thr);
+ duk_regexp_match(thr); /* [ ... regexp input ] -> [ res_obj ] */
+ if (!duk_is_object(thr, -1)) {
+ duk_pop(thr);
+ break;
+ }
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX);
+ DUK_ASSERT(duk_is_number(thr, -1));
+ match_start_coff = duk_get_uint(thr, -1);
+ duk_pop(thr);
+
+ duk_get_prop_index(thr, -1, 0);
+ DUK_ASSERT(duk_is_string(thr, -1));
+ h_match = duk_known_hstring(thr, -1);
+ duk_pop(thr); /* h_match is borrowed, remains reachable through match_obj */
+
+ if (DUK_HSTRING_GET_BYTELEN(h_match) == 0) {
+ /* This should be equivalent to match() algorithm step 8.f.iii.2:
+ * detect an empty match and allow it, but don't allow it twice.
+ */
+ duk_uint32_t last_index;
+
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ last_index = (duk_uint32_t) duk_get_uint(thr, -1);
+ DUK_DDD(DUK_DDDPRINT("empty match, bump lastIndex: %ld -> %ld",
+ (long) last_index, (long) (last_index + 1)));
+ duk_pop(thr);
+ duk_push_uint(thr, (duk_uint_t) (last_index + 1));
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ }
+
+ DUK_ASSERT(duk_get_length(thr, -1) <= DUK_INT_MAX); /* string limits */
+ match_caps = (duk_int_t) duk_get_length(thr, -1);
+ } else {
+#else /* DUK_USE_REGEXP_SUPPORT */
+ { /* unconditionally */
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ const duk_uint8_t *p_start, *p_end, *p; /* input string scan */
+ const duk_uint8_t *q_start; /* match string */
+ duk_size_t q_blen;
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ DUK_ASSERT(!is_global); /* single match always */
+#endif
+
+ p_start = DUK_HSTRING_GET_DATA(h_input);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);
+ p = p_start;
+
+ h_search = duk_known_hstring(thr, 0);
+ q_start = DUK_HSTRING_GET_DATA(h_search);
+ q_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_search);
+
+ p_end -= q_blen; /* ensure full memcmp() fits in while */
+
+ match_start_coff = 0;
+
+ while (p <= p_end) {
+ DUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input));
+ if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) {
+ duk_dup_0(thr);
+ h_match = duk_known_hstring(thr, -1);
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ match_caps = 0;
+#endif
+ goto found;
+ }
+
+ /* track utf-8 non-continuation bytes */
+ if ((p[0] & 0xc0) != 0x80) {
+ match_start_coff++;
+ }
+ p++;
+ }
+
+ /* not found */
+ break;
+ }
+ found:
+
+ /* stack[0] = search value
+ * stack[1] = replace value
+ * stack[2] = input string
+ * stack[3] = result buffer
+ * stack[4] = regexp match OR match string
+ */
+
+ match_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff);
+
+ tmp_sz = (duk_size_t) (match_start_boff - prev_match_end_boff);
+ DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz);
+
+ prev_match_end_boff = match_start_boff + DUK_HSTRING_GET_BYTELEN(h_match);
+
+ if (is_repl_func) {
+ duk_idx_t idx_args;
+ duk_hstring *h_repl;
+
+ /* regexp res_obj is at index 4 */
+
+ duk_dup_1(thr);
+ idx_args = duk_get_top(thr);
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ if (is_regexp) {
+ duk_int_t idx;
+ duk_require_stack(thr, match_caps + 2);
+ for (idx = 0; idx < match_caps; idx++) {
+ /* match followed by capture(s) */
+ duk_get_prop_index(thr, 4, (duk_uarridx_t) idx);
+ }
+ } else {
+#else /* DUK_USE_REGEXP_SUPPORT */
+ { /* unconditionally */
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ /* match == search string, by definition */
+ duk_dup_0(thr);
+ }
+ duk_push_uint(thr, (duk_uint_t) match_start_coff);
+ duk_dup_2(thr);
+
+ /* [ ... replacer match [captures] match_char_offset input ] */
+
+ duk_call(thr, duk_get_top(thr) - idx_args);
+ h_repl = duk_to_hstring_m1(thr); /* -> [ ... repl_value ] */
+ DUK_ASSERT(h_repl != NULL);
+
+ DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_repl);
+
+ duk_pop(thr); /* repl_value */
+ } else {
+ r = r_start;
+
+ while (r < r_end) {
+ duk_int_t ch1;
+ duk_int_t ch2;
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_int_t ch3;
+#endif
+ duk_size_t left;
+
+ ch1 = *r++;
+ if (ch1 != DUK_ASC_DOLLAR) {
+ goto repl_write;
+ }
+ DUK_ASSERT(r <= r_end);
+ left = (duk_size_t) (r_end - r);
+
+ if (left <= 0) {
+ goto repl_write;
+ }
+
+ ch2 = r[0];
+ switch (ch2) {
+ case DUK_ASC_DOLLAR: {
+ ch1 = (1 << 8) + DUK_ASC_DOLLAR;
+ goto repl_write;
+ }
+ case DUK_ASC_AMP: {
+ DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_match);
+ r++;
+ continue;
+ }
+ case DUK_ASC_GRAVE: {
+ tmp_sz = (duk_size_t) match_start_boff;
+ DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input), tmp_sz);
+ r++;
+ continue;
+ }
+ case DUK_ASC_SINGLEQUOTE: {
+ duk_uint32_t match_end_boff;
+
+ /* Use match charlen instead of bytelen, just in case the input and
+ * match codepoint encodings would have different lengths.
+ */
+ /* XXX: charlen computed here, and also in char2byte helper. */
+ match_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr,
+ h_input,
+ match_start_coff + (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_match));
+
+ tmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - match_end_boff);
+ DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + match_end_boff, tmp_sz);
+ r++;
+ continue;
+ }
+ default: {
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_int_t capnum, captmp, capadv;
+ /* XXX: optional check, match_caps is zero if no regexp,
+ * so dollar will be interpreted literally anyway.
+ */
+
+ if (!is_regexp) {
+ goto repl_write;
+ }
+
+ if (!(ch2 >= DUK_ASC_0 && ch2 <= DUK_ASC_9)) {
+ goto repl_write;
+ }
+ capnum = ch2 - DUK_ASC_0;
+ capadv = 1;
+
+ if (left >= 2) {
+ ch3 = r[1];
+ if (ch3 >= DUK_ASC_0 && ch3 <= DUK_ASC_9) {
+ captmp = capnum * 10 + (ch3 - DUK_ASC_0);
+ if (captmp < match_caps) {
+ capnum = captmp;
+ capadv = 2;
+ }
+ }
+ }
+
+ if (capnum > 0 && capnum < match_caps) {
+ DUK_ASSERT(is_regexp != 0); /* match_caps == 0 without regexps */
+
+ /* regexp res_obj is at offset 4 */
+ duk_get_prop_index(thr, 4, (duk_uarridx_t) capnum);
+ if (duk_is_string(thr, -1)) {
+ duk_hstring *h_tmp_str;
+
+ h_tmp_str = duk_known_hstring(thr, -1);
+
+ DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_tmp_str);
+ } else {
+ /* undefined -> skip (replaced with empty) */
+ }
+ duk_pop(thr);
+ r += capadv;
+ continue;
+ } else {
+ goto repl_write;
+ }
+#else /* DUK_USE_REGEXP_SUPPORT */
+ goto repl_write; /* unconditionally */
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ } /* default case */
+ } /* switch (ch2) */
+
+ repl_write:
+ /* ch1 = (r_increment << 8) + byte */
+
+ DUK_BW_WRITE_ENSURE_U8(thr, bw, (duk_uint8_t) (ch1 & 0xff));
+ r += ch1 >> 8;
+ } /* while repl */
+ } /* if (is_repl_func) */
+
+ duk_pop(thr); /* pop regexp res_obj or match string */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ if (!is_global) {
+#else
+ { /* unconditionally; is_global==0 */
+#endif
+ break;
+ }
+ }
+
+ /* trailer */
+ tmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff);
+ DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz);
+
+ DUK_ASSERT_TOP(thr, 4);
+ DUK_BW_COMPACT(thr, bw);
+ (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */
+ return 1;
+}
+
+/*
+ * split()
+ */
+
+/* XXX: very messy now, but works; clean up, remove unused variables (nomimally
+ * used so compiler doesn't complain).
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_split(duk_hthread *thr) {
+ duk_hstring *h_input;
+ duk_hstring *h_sep;
+ duk_uint32_t limit;
+ duk_uint32_t arr_idx;
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_bool_t is_regexp;
+#endif
+ duk_bool_t matched; /* set to 1 if any match exists (needed for empty input special case) */
+ duk_uint32_t prev_match_end_coff, prev_match_end_boff;
+ duk_uint32_t match_start_boff, match_start_coff;
+ duk_uint32_t match_end_boff, match_end_coff;
+
+ h_input = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h_input != NULL);
+
+ duk_push_array(thr);
+
+ if (duk_is_undefined(thr, 1)) {
+ limit = 0xffffffffUL;
+ } else {
+ limit = duk_to_uint32(thr, 1);
+ }
+
+ if (limit == 0) {
+ return 1;
+ }
+
+ /* If the separator is a RegExp, make a "clone" of it. The specification
+ * algorithm calls [[Match]] directly for specific indices; we emulate this
+ * by tweaking lastIndex and using a "force global" variant of duk_regexp_match()
+ * which will use global-style matching even when the RegExp itself is non-global.
+ */
+
+ if (duk_is_undefined(thr, 0)) {
+ /* The spec algorithm first does "R = ToString(separator)" before checking
+ * whether separator is undefined. Since this is side effect free, we can
+ * skip the ToString() here.
+ */
+ duk_dup_2(thr);
+ duk_put_prop_index(thr, 3, 0);
+ return 1;
+ } else if (duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP) != NULL) {
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR);
+ duk_dup_0(thr);
+ duk_new(thr, 1); /* [ ... RegExp val ] -> [ ... res ] */
+ duk_replace(thr, 0);
+ /* lastIndex is initialized to zero by new RegExp() */
+ is_regexp = 1;
+#else
+ DUK_DCERROR_UNSUPPORTED(thr);
+#endif
+ } else {
+ duk_to_string(thr, 0);
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ is_regexp = 0;
+#endif
+ }
+
+ /* stack[0] = separator (string or regexp)
+ * stack[1] = limit
+ * stack[2] = input string
+ * stack[3] = result array
+ */
+
+ prev_match_end_boff = 0;
+ prev_match_end_coff = 0;
+ arr_idx = 0;
+ matched = 0;
+
+ for (;;) {
+ /*
+ * The specification uses RegExp [[Match]] to attempt match at specific
+ * offsets. We don't have such a primitive, so we use an actual RegExp
+ * and tweak lastIndex. Since the RegExp may be non-global, we use a
+ * special variant which forces global-like behavior for matching.
+ */
+
+ DUK_ASSERT_TOP(thr, 4);
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ if (is_regexp) {
+ duk_dup_0(thr);
+ duk_dup_2(thr);
+ duk_regexp_match_force_global(thr); /* [ ... regexp input ] -> [ res_obj ] */
+ if (!duk_is_object(thr, -1)) {
+ duk_pop(thr);
+ break;
+ }
+ matched = 1;
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX);
+ DUK_ASSERT(duk_is_number(thr, -1));
+ match_start_coff = duk_get_uint(thr, -1);
+ match_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff);
+ duk_pop(thr);
+
+ if (match_start_coff == DUK_HSTRING_GET_CHARLEN(h_input)) {
+ /* don't allow an empty match at the end of the string */
+ duk_pop(thr);
+ break;
+ }
+
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ DUK_ASSERT(duk_is_number(thr, -1));
+ match_end_coff = duk_get_uint(thr, -1);
+ match_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_end_coff);
+ duk_pop(thr);
+
+ /* empty match -> bump and continue */
+ if (prev_match_end_boff == match_end_boff) {
+ duk_push_uint(thr, (duk_uint_t) (match_end_coff + 1));
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ duk_pop(thr);
+ continue;
+ }
+ } else {
+#else /* DUK_USE_REGEXP_SUPPORT */
+ { /* unconditionally */
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ const duk_uint8_t *p_start, *p_end, *p; /* input string scan */
+ const duk_uint8_t *q_start; /* match string */
+ duk_size_t q_blen, q_clen;
+
+ p_start = DUK_HSTRING_GET_DATA(h_input);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);
+ p = p_start + prev_match_end_boff;
+
+ h_sep = duk_known_hstring(thr, 0); /* symbol already rejected above */
+ q_start = DUK_HSTRING_GET_DATA(h_sep);
+ q_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sep);
+ q_clen = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_sep);
+
+ p_end -= q_blen; /* ensure full memcmp() fits in while */
+
+ match_start_coff = prev_match_end_coff;
+
+ if (q_blen == 0) {
+ /* Handle empty separator case: it will always match, and always
+ * triggers the check in step 13.c.iii initially. Note that we
+ * must skip to either end of string or start of first codepoint,
+ * skipping over any continuation bytes!
+ *
+ * Don't allow an empty string to match at the end of the input.
+ */
+
+ matched = 1; /* empty separator can always match */
+
+ match_start_coff++;
+ p++;
+ while (p < p_end) {
+ if ((p[0] & 0xc0) != 0x80) {
+ goto found;
+ }
+ p++;
+ }
+ goto not_found;
+ }
+
+ DUK_ASSERT(q_blen > 0 && q_clen > 0);
+ while (p <= p_end) {
+ DUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input));
+ DUK_ASSERT(q_blen > 0); /* no issues with empty memcmp() */
+ if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) {
+ /* never an empty match, so step 13.c.iii can't be triggered */
+ goto found;
+ }
+
+ /* track utf-8 non-continuation bytes */
+ if ((p[0] & 0xc0) != 0x80) {
+ match_start_coff++;
+ }
+ p++;
+ }
+
+ not_found:
+ /* not found */
+ break;
+
+ found:
+ matched = 1;
+ match_start_boff = (duk_uint32_t) (p - p_start);
+ match_end_coff = (duk_uint32_t) (match_start_coff + q_clen); /* constrained by string length */
+ match_end_boff = (duk_uint32_t) (match_start_boff + q_blen); /* ditto */
+
+ /* empty match (may happen with empty separator) -> bump and continue */
+ if (prev_match_end_boff == match_end_boff) {
+ prev_match_end_boff++;
+ prev_match_end_coff++;
+ continue;
+ }
+ } /* if (is_regexp) */
+
+ /* stack[0] = separator (string or regexp)
+ * stack[1] = limit
+ * stack[2] = input string
+ * stack[3] = result array
+ * stack[4] = regexp res_obj (if is_regexp)
+ */
+
+ DUK_DDD(DUK_DDDPRINT("split; match_start b=%ld,c=%ld, match_end b=%ld,c=%ld, prev_end b=%ld,c=%ld",
+ (long) match_start_boff, (long) match_start_coff,
+ (long) match_end_boff, (long) match_end_coff,
+ (long) prev_match_end_boff, (long) prev_match_end_coff));
+
+ duk_push_lstring(thr,
+ (const char *) (DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff),
+ (duk_size_t) (match_start_boff - prev_match_end_boff));
+ duk_put_prop_index(thr, 3, arr_idx);
+ arr_idx++;
+ if (arr_idx >= limit) {
+ goto hit_limit;
+ }
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ if (is_regexp) {
+ duk_size_t i, len;
+
+ len = duk_get_length(thr, 4);
+ for (i = 1; i < len; i++) {
+ DUK_ASSERT(i <= DUK_UARRIDX_MAX); /* cannot have >4G captures */
+ duk_get_prop_index(thr, 4, (duk_uarridx_t) i);
+ duk_put_prop_index(thr, 3, arr_idx);
+ arr_idx++;
+ if (arr_idx >= limit) {
+ goto hit_limit;
+ }
+ }
+
+ duk_pop(thr);
+ /* lastIndex already set up for next match */
+ } else {
+#else /* DUK_USE_REGEXP_SUPPORT */
+ { /* unconditionally */
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ /* no action */
+ }
+
+ prev_match_end_boff = match_end_boff;
+ prev_match_end_coff = match_end_coff;
+ continue;
+ } /* for */
+
+ /* Combined step 11 (empty string special case) and 14-15. */
+
+ DUK_DDD(DUK_DDDPRINT("split trailer; prev_end b=%ld,c=%ld",
+ (long) prev_match_end_boff, (long) prev_match_end_coff));
+
+ if (DUK_HSTRING_GET_BYTELEN(h_input) > 0 || !matched) {
+ /* Add trailer if:
+ * a) non-empty input
+ * b) empty input and no (zero size) match found (step 11)
+ */
+
+ duk_push_lstring(thr,
+ (const char *) DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff,
+ (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff));
+ duk_put_prop_index(thr, 3, arr_idx);
+ /* No arr_idx update or limit check */
+ }
+
+ return 1;
+
+ hit_limit:
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ if (is_regexp) {
+ duk_pop(thr);
+ }
+#endif
+
+ return 1;
+}
+
+/*
+ * Various
+ */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+DUK_LOCAL void duk__to_regexp_helper(duk_hthread *thr, duk_idx_t idx, duk_bool_t force_new) {
+ duk_hobject *h;
+
+ /* Shared helper for match() steps 3-4, search() steps 3-4. */
+
+ DUK_ASSERT(idx >= 0);
+
+ if (force_new) {
+ goto do_new;
+ }
+
+ h = duk_get_hobject_with_class(thr, idx, DUK_HOBJECT_CLASS_REGEXP);
+ if (!h) {
+ goto do_new;
+ }
+ return;
+
+ do_new:
+ duk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR);
+ duk_dup(thr, idx);
+ duk_new(thr, 1); /* [ ... RegExp val ] -> [ ... res ] */
+ duk_replace(thr, idx);
+}
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_search(duk_hthread *thr) {
+ /* Easiest way to implement the search required by the specification
+ * is to do a RegExp test() with lastIndex forced to zero. To avoid
+ * side effects on the argument, "clone" the RegExp if a RegExp was
+ * given as input.
+ *
+ * The global flag of the RegExp should be ignored; setting lastIndex
+ * to zero (which happens when "cloning" the RegExp) should have an
+ * equivalent effect.
+ */
+
+ DUK_ASSERT_TOP(thr, 1);
+ (void) duk_push_this_coercible_to_string(thr); /* at index 1 */
+ duk__to_regexp_helper(thr, 0 /*index*/, 1 /*force_new*/);
+
+ /* stack[0] = regexp
+ * stack[1] = string
+ */
+
+ /* Avoid using RegExp.prototype methods, as they're writable and
+ * configurable and may have been changed.
+ */
+
+ duk_dup_0(thr);
+ duk_dup_1(thr); /* [ ... re_obj input ] */
+ duk_regexp_match(thr); /* -> [ ... res_obj ] */
+
+ if (!duk_is_object(thr, -1)) {
+ duk_push_int(thr, -1);
+ return 1;
+ }
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX);
+ DUK_ASSERT(duk_is_number(thr, -1));
+ return 1;
+}
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_match(duk_hthread *thr) {
+ duk_bool_t global;
+ duk_int_t prev_last_index;
+ duk_int_t this_index;
+ duk_int_t arr_idx;
+
+ DUK_ASSERT_TOP(thr, 1);
+ (void) duk_push_this_coercible_to_string(thr);
+ duk__to_regexp_helper(thr, 0 /*index*/, 0 /*force_new*/);
+ global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL);
+ DUK_ASSERT_TOP(thr, 2);
+
+ /* stack[0] = regexp
+ * stack[1] = string
+ */
+
+ if (!global) {
+ duk_regexp_match(thr); /* -> [ res_obj ] */
+ return 1; /* return 'res_obj' */
+ }
+
+ /* Global case is more complex. */
+
+ /* [ regexp string ] */
+
+ duk_push_int(thr, 0);
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ duk_push_array(thr);
+
+ /* [ regexp string res_arr ] */
+
+ prev_last_index = 0;
+ arr_idx = 0;
+
+ for (;;) {
+ DUK_ASSERT_TOP(thr, 3);
+
+ duk_dup_0(thr);
+ duk_dup_1(thr);
+ duk_regexp_match(thr); /* -> [ ... regexp string ] -> [ ... res_obj ] */
+
+ if (!duk_is_object(thr, -1)) {
+ duk_pop(thr);
+ break;
+ }
+
+ duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ DUK_ASSERT(duk_is_number(thr, -1));
+ this_index = duk_get_int(thr, -1);
+ duk_pop(thr);
+
+ if (this_index == prev_last_index) {
+ this_index++;
+ duk_push_int(thr, this_index);
+ duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);
+ }
+ prev_last_index = this_index;
+
+ duk_get_prop_index(thr, -1, 0); /* match string */
+ duk_put_prop_index(thr, 2, (duk_uarridx_t) arr_idx);
+ arr_idx++;
+ duk_pop(thr); /* res_obj */
+ }
+
+ if (arr_idx == 0) {
+ duk_push_null(thr);
+ }
+
+ return 1; /* return 'res_arr' or 'null' */
+}
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_concat(duk_hthread *thr) {
+ /* duk_concat() coerces arguments with ToString() in correct order */
+ (void) duk_push_this_coercible_to_string(thr);
+ duk_insert(thr, 0); /* this is relatively expensive */
+ duk_concat(thr, duk_get_top(thr));
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_trim(duk_hthread *thr) {
+ DUK_ASSERT_TOP(thr, 0);
+ (void) duk_push_this_coercible_to_string(thr);
+ duk_trim(thr, 0);
+ DUK_ASSERT_TOP(thr, 1);
+ return 1;
+}
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_repeat(duk_hthread *thr) {
+ duk_hstring *h_input;
+ duk_size_t input_blen;
+ duk_size_t result_len;
+ duk_int_t count_signed;
+ duk_uint_t count;
+ const duk_uint8_t *src;
+ duk_uint8_t *buf;
+ duk_uint8_t *p;
+ duk_double_t d;
+#if !defined(DUK_USE_PREFER_SIZE)
+ duk_size_t copy_size;
+ duk_uint8_t *p_end;
+#endif
+
+ DUK_ASSERT_TOP(thr, 1);
+ h_input = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h_input != NULL);
+ input_blen = DUK_HSTRING_GET_BYTELEN(h_input);
+
+ /* Count is ToNumber() coerced; +Infinity must be always rejected
+ * (even if input string is zero length), as well as negative values
+ * and -Infinity. -Infinity doesn't require an explicit check
+ * because duk_get_int() clamps it to DUK_INT_MIN which gets rejected
+ * as a negative value (regardless of input string length).
+ */
+ d = duk_to_number(thr, 0);
+ if (duk_double_is_posinf(d)) {
+ goto fail_range;
+ }
+ count_signed = duk_get_int(thr, 0);
+ if (count_signed < 0) {
+ goto fail_range;
+ }
+ count = (duk_uint_t) count_signed;
+
+ /* Overflow check for result length. */
+ result_len = count * input_blen;
+ if (count != 0 && result_len / count != input_blen) {
+ goto fail_range;
+ }
+
+ /* Temporary fixed buffer, later converted to string. */
+ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, result_len);
+ src = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);
+
+#if defined(DUK_USE_PREFER_SIZE)
+ p = buf;
+ while (count-- > 0) {
+ DUK_MEMCPY((void *) p, (const void *) src, input_blen); /* copy size may be zero */
+ p += input_blen;
+ }
+#else /* DUK_USE_PREFER_SIZE */
+ /* Take advantage of already copied pieces to speed up the process
+ * especially for small repeated strings.
+ */
+ p = buf;
+ p_end = p + result_len;
+ copy_size = input_blen;
+ for (;;) {
+ duk_size_t remain = (duk_size_t) (p_end - p);
+ DUK_DDD(DUK_DDDPRINT("remain=%ld, copy_size=%ld, input_blen=%ld, result_len=%ld",
+ (long) remain, (long) copy_size, (long) input_blen,
+ (long) result_len));
+ if (remain <= copy_size) {
+ /* If result_len is zero, this case is taken and does
+ * a zero size copy.
+ */
+ DUK_MEMCPY((void *) p, (const void *) src, remain);
+ break;
+ } else {
+ DUK_MEMCPY((void *) p, (const void *) src, copy_size);
+ p += copy_size;
+ }
+
+ src = (const duk_uint8_t *) buf; /* Use buf as source for larger copies. */
+ copy_size = (duk_size_t) (p - buf);
+ }
+#endif /* DUK_USE_PREFER_SIZE */
+
+ /* XXX: It would be useful to be able to create a duk_hstring with
+ * a certain byte size whose data area wasn't initialized and which
+ * wasn't in the string table yet. This would allow a string to be
+ * constructed directly without a buffer temporary and when it was
+ * finished, it could be injected into the string table. Currently
+ * this isn't possible because duk_hstrings are only tracked by the
+ * intern table (they are not in heap_allocated).
+ */
+
+ duk_buffer_to_string(thr, -1); /* Safe if input is safe. */
+ return 1;
+
+ fail_range:
+ DUK_DCERROR_RANGE_INVALID_ARGS(thr);
+}
+#endif /* DUK_USE_ES6 */
+
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_locale_compare(duk_hthread *thr) {
+ duk_hstring *h1;
+ duk_hstring *h2;
+ duk_size_t h1_len, h2_len, prefix_len;
+ duk_small_int_t ret = 0;
+ duk_small_int_t rc;
+
+ /* The current implementation of localeCompare() is simply a codepoint
+ * by codepoint comparison, implemented with a simple string compare
+ * because UTF-8 should preserve codepoint ordering (assuming valid
+ * shortest UTF-8 encoding).
+ *
+ * The specification requires that the return value must be related
+ * to the sort order: e.g. negative means that 'this' comes before
+ * 'that' in sort order. We assume an ascending sort order.
+ */
+
+ /* XXX: could share code with duk_js_ops.c, duk_js_compare_helper */
+
+ h1 = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h1 != NULL);
+
+ h2 = duk_to_hstring(thr, 0);
+ DUK_ASSERT(h2 != NULL);
+
+ h1_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1);
+ h2_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2);
+ prefix_len = (h1_len <= h2_len ? h1_len : h2_len);
+
+ /* Zero size compare not an issue with DUK_MEMCMP. */
+ rc = (duk_small_int_t) DUK_MEMCMP((const void *) DUK_HSTRING_GET_DATA(h1),
+ (const void *) DUK_HSTRING_GET_DATA(h2),
+ (size_t) prefix_len);
+
+ if (rc < 0) {
+ ret = -1;
+ goto done;
+ } else if (rc > 0) {
+ ret = 1;
+ goto done;
+ }
+
+ /* prefix matches, lengths matter now */
+ if (h1_len > h2_len) {
+ ret = 1;
+ goto done;
+ } else if (h1_len == h2_len) {
+ DUK_ASSERT(ret == 0);
+ goto done;
+ }
+ ret = -1;
+ goto done;
+
+ done:
+ duk_push_int(thr, (duk_int_t) ret);
+ return 1;
+}
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_hthread *thr) {
+ duk_int_t magic;
+ duk_hstring *h;
+ duk_hstring *h_search;
+ duk_size_t blen_search;
+ const duk_uint8_t *p_cmp_start;
+ duk_bool_t result;
+
+ h = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h != NULL);
+
+ h_search = duk__str_tostring_notregexp(thr, 0);
+ DUK_ASSERT(h_search != NULL);
+
+ magic = duk_get_current_magic(thr);
+
+ p_cmp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);
+ blen_search = DUK_HSTRING_GET_BYTELEN(h_search);
+
+ if (duk_is_undefined(thr, 1)) {
+ if (magic) {
+ p_cmp_start += DUK_HSTRING_GET_BYTELEN(h) - blen_search;
+ } else {
+ /* p_cmp_start already OK */
+ }
+ } else {
+ duk_int_t len;
+ duk_int_t pos;
+
+ DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= DUK_INT_MAX);
+ len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);
+ pos = duk_to_int_clamped(thr, 1, 0, len);
+ DUK_ASSERT(pos >= 0 && pos <= len);
+
+ if (magic) {
+ p_cmp_start -= blen_search; /* Conceptually subtracted last, but do already here. */
+ }
+ DUK_ASSERT(pos >= 0 && pos <= len);
+
+ p_cmp_start += duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) pos);
+ }
+
+ /* The main comparison can be done using a memcmp() rather than
+ * doing codepoint comparisons: for CESU-8 strings there is a
+ * canonical representation for every codepoint. But we do need
+ * to deal with the char/byte offset translation to find the
+ * comparison range.
+ */
+
+ result = 0;
+ if (p_cmp_start >= DUK_HSTRING_GET_DATA(h) &&
+ (duk_size_t) (p_cmp_start - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h)) + blen_search <= DUK_HSTRING_GET_BYTELEN(h)) {
+ if (DUK_MEMCMP((const void *) p_cmp_start,
+ (const void *) DUK_HSTRING_GET_DATA(h_search),
+ (size_t) blen_search) == 0) {
+ result = 1;
+ }
+ }
+
+ duk_push_boolean(thr, result);
+ return 1;
+}
+#endif /* DUK_USE_ES6 */
+
+#if defined(DUK_USE_ES6)
+DUK_INTERNAL duk_ret_t duk_bi_string_prototype_includes(duk_hthread *thr) {
+ duk_hstring *h;
+ duk_hstring *h_search;
+ duk_int_t len;
+ duk_int_t pos;
+
+ h = duk_push_this_coercible_to_string(thr);
+ DUK_ASSERT(h != NULL);
+
+ h_search = duk__str_tostring_notregexp(thr, 0);
+ DUK_ASSERT(h_search != NULL);
+
+ len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);
+ pos = duk_to_int_clamped(thr, 1, 0, len);
+ DUK_ASSERT(pos >= 0 && pos <= len);
+
+ pos = duk__str_search_shared(thr, h, h_search, pos, 0 /*backwards*/);
+ duk_push_boolean(thr, pos >= 0);
+ return 1;
+}
+#endif /* DUK_USE_ES6 */
+#endif /* DUK_USE_STRING_BUILTIN */
+#line 1 "duk_bi_symbol.c"
+/*
+ * Symbol built-in
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_SYMBOL_BUILTIN)
+
+/*
+ * Constructor
+ */
+
+DUK_INTERNAL duk_ret_t duk_bi_symbol_constructor_shared(duk_hthread *thr) {
+ const duk_uint8_t *desc;
+ duk_size_t len;
+ duk_uint8_t *buf;
+ duk_uint8_t *p;
+ duk_int_t magic;
+
+ magic = duk_get_current_magic(thr);
+ if (duk_is_undefined(thr, 0) && (magic == 0)) {
+ /* Symbol() accepts undefined and empty string, but they are
+ * treated differently.
+ */
+ desc = NULL;
+ len = 0;
+ } else {
+ /* Symbol.for() coerces undefined to 'undefined' */
+ desc = (const duk_uint8_t *) duk_to_lstring(thr, 0, &len);
+ }
+
+ /* Maximum symbol data length:
+ * +1 initial byte (0x80 or 0x81)
+ * +len description
+ * +1 0xff after description, before unique suffix
+ * +17 autogenerated unique suffix: 'ffffffff-ffffffff' is longest
+ * +1 0xff after unique suffix for symbols with undefined description
+ */
+ buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, 1 + len + 1 + 17 + 1);
+ p = buf + 1;
+ DUK_ASSERT(desc != NULL || len == 0); /* may be NULL if len is 0 */
+ DUK_MEMCPY((void *) p, (const void *) desc, len);
+ p += len;
+ if (magic == 0) {
+ /* Symbol(): create unique symbol. Use two 32-bit values
+ * to avoid dependency on 64-bit types and 64-bit integer
+ * formatting (at least for now).
+ */
+ if (++thr->heap->sym_counter[0] == 0) {
+ thr->heap->sym_counter[1]++;
+ }
+ p += DUK_SPRINTF((char *) p, "\xFF" "%lx-%lx",
+ (unsigned long) thr->heap->sym_counter[1],
+ (unsigned long) thr->heap->sym_counter[0]);
+ if (desc == NULL) {
+ /* Special case for 'undefined' description, trailing
+ * 0xff distinguishes from empty string description,
+ * but needs minimal special case handling elsewhere.
+ */
+ *p++ = 0xff;
+ }
+ buf[0] = 0x81;
+ } else {
+ /* Symbol.for(): create a global symbol */
+ buf[0] = 0x80;
+ }
+
+ duk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf));
+ DUK_DDD(DUK_DDDPRINT("created symbol: %!T", duk_get_tval(thr, -1)));
+ return 1;
+}
+
+DUK_LOCAL duk_hstring *duk__auto_unbox_symbol(duk_hthread *thr, duk_tval *tv_arg) {
+ duk_tval *tv;
+ duk_tval tv_val;
+ duk_hobject *h_obj;
+ duk_hstring *h_str;
+
+ DUK_ASSERT(tv_arg != NULL);
+
+ /* XXX: add internal helper: duk_auto_unbox_tval(thr, tv, mask); */
+ /* XXX: add internal helper: duk_auto_unbox(thr, tv, idx); */
+
+ tv = tv_arg;
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ h_obj = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h_obj != NULL);
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_SYMBOL) {
+ if (!duk_hobject_get_internal_value(thr->heap, h_obj, &tv_val)) {
+ return NULL;
+ }
+ tv = &tv_val;
+ } else {
+ return NULL;
+ }
+ }
+
+ if (!DUK_TVAL_IS_STRING(tv)) {
+ return NULL;
+ }
+ h_str = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h_str != NULL);
+
+ /* Here symbol is more expected than not. */
+ if (DUK_UNLIKELY(!DUK_HSTRING_HAS_SYMBOL(h_str))) {
+ return NULL;
+ }
+
+ return h_str;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_symbol_tostring_shared(duk_hthread *thr) {
+ duk_hstring *h_str;
+
+ h_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr));
+ if (h_str == NULL) {
+ return DUK_RET_TYPE_ERROR;
+ }
+
+ if (duk_get_current_magic(thr) == 0) {
+ /* .toString() */
+ duk_push_symbol_descriptive_string(thr, h_str);
+ } else {
+ /* .valueOf() */
+ duk_push_hstring(thr, h_str);
+ }
+ return 1;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_symbol_key_for(duk_hthread *thr) {
+ duk_hstring *h;
+ const duk_uint8_t *p;
+
+ /* Argument must be a symbol but not checked here. The initial byte
+ * check will catch non-symbol strings.
+ */
+ h = duk_require_hstring(thr, 0);
+ DUK_ASSERT(h != NULL);
+
+ p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);
+ DUK_ASSERT(p != NULL);
+
+ /* Even for zero length strings there's at least one NUL byte so
+ * we can safely check the initial byte.
+ */
+ if (p[0] == 0x80) {
+ /* Global symbol, return its key (bytes just after the initial byte). */
+ duk_push_lstring(thr, (const char *) (p + 1), (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h) - 1));
+ return 1;
+ } else if (p[0] == 0x81 || p[0] == 0x82 || p[0] == 0xff) {
+ /* Local symbol or hidden symbol, return undefined. */
+ return 0;
+ }
+
+ /* Covers normal strings and unknown initial bytes. */
+ return DUK_RET_TYPE_ERROR;
+}
+
+DUK_INTERNAL duk_ret_t duk_bi_symbol_toprimitive(duk_hthread *thr) {
+ duk_hstring *h_str;
+
+ h_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr));
+ if (h_str == NULL) {
+ return DUK_RET_TYPE_ERROR;
+ }
+ duk_push_hstring(thr, h_str);
+ return 1;
+}
+
+#endif /* DUK_USE_SYMBOL_BUILTIN */
+#line 1 "duk_bi_thread.c"
+/*
+ * Thread builtins
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Constructor
+ */
+
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_thread_constructor(duk_hthread *thr) {
+ duk_hthread *new_thr;
+ duk_hobject *func;
+
+ /* Check that the argument is callable; this is not 100% because we
+ * don't allow native functions to be a thread's initial function.
+ * Resume will reject such functions in any case.
+ */
+ /* XXX: need a duk_require_func_promote_lfunc() */
+ func = duk_require_hobject_promote_lfunc(thr, 0);
+ DUK_ASSERT(func != NULL);
+ duk_require_callable(thr, 0);
+
+ duk_push_thread(thr);
+ new_thr = (duk_hthread *) duk_known_hobject(thr, -1);
+ new_thr->state = DUK_HTHREAD_STATE_INACTIVE;
+
+ /* push initial function call to new thread stack; this is
+ * picked up by resume().
+ */
+ duk_push_hobject(new_thr, func);
+
+ return 1; /* return thread */
+}
+#endif
+
+/*
+ * Resume a thread.
+ *
+ * The thread must be in resumable state, either (a) new thread which hasn't
+ * yet started, or (b) a thread which has previously yielded. This method
+ * must be called from an Ecmascript function.
+ *
+ * Args:
+ * - thread
+ * - value
+ * - isError (defaults to false)
+ *
+ * Note: yield and resume handling is currently asymmetric.
+ */
+
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_thread_resume(duk_hthread *ctx) {
+ duk_hthread *thr = (duk_hthread *) ctx;
+ duk_hthread *thr_resume;
+ duk_hobject *caller_func;
+ duk_small_uint_t is_error;
+
+ DUK_DDD(DUK_DDDPRINT("Duktape.Thread.resume(): thread=%!T, value=%!T, is_error=%!T",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1),
+ (duk_tval *) duk_get_tval(thr, 2)));
+
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);
+ DUK_ASSERT(thr->heap->curr_thread == thr);
+
+ thr_resume = duk_require_hthread(thr, 0);
+ is_error = (duk_small_uint_t) duk_to_boolean(thr, 2);
+ duk_set_top(thr, 2);
+
+ /* [ thread value ] */
+
+ /*
+ * Thread state and calling context checks
+ */
+
+ if (thr->callstack_top < 2) {
+ DUK_DD(DUK_DDPRINT("resume state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.resume)"));
+ goto state_error;
+ }
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); /* us */
+ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL); /* caller */
+
+ caller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent);
+ if (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) {
+ DUK_DD(DUK_DDPRINT("resume state invalid: caller must be Ecmascript code"));
+ goto state_error;
+ }
+
+ /* Note: there is no requirement that: 'thr->callstack_preventcount == 1'
+ * like for yield.
+ */
+
+ if (thr_resume->state != DUK_HTHREAD_STATE_INACTIVE &&
+ thr_resume->state != DUK_HTHREAD_STATE_YIELDED) {
+ DUK_DD(DUK_DDPRINT("resume state invalid: target thread must be INACTIVE or YIELDED"));
+ goto state_error;
+ }
+
+ DUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE ||
+ thr_resume->state == DUK_HTHREAD_STATE_YIELDED);
+
+ /* Further state-dependent pre-checks */
+
+ if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) {
+ /* no pre-checks now, assume a previous yield() has left things in
+ * tip-top shape (longjmp handler will assert for these).
+ */
+ } else {
+ duk_hobject *h_fun;
+
+ DUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE);
+
+ /* The initial function must be an Ecmascript function (but
+ * can be bound). We must make sure of that before we longjmp
+ * because an error in the RESUME handler call processing will
+ * not be handled very cleanly.
+ */
+ if ((thr_resume->callstack_top != 0) ||
+ (thr_resume->valstack_top - thr_resume->valstack != 1)) {
+ goto state_error;
+ }
+
+ duk_push_tval(thr, DUK_GET_TVAL_NEGIDX(thr_resume, -1));
+ duk_resolve_nonbound_function(thr);
+ h_fun = duk_require_hobject(thr, -1); /* reject lightfuncs on purpose */
+ if (!DUK_HOBJECT_IS_CALLABLE(h_fun) || !DUK_HOBJECT_IS_COMPFUNC(h_fun)) {
+ goto state_error;
+ }
+ duk_pop(thr);
+ }
+
+ /*
+ * The error object has been augmented with a traceback and other
+ * info from its creation point -- usually another thread. The
+ * error handler is called here right before throwing, but it also
+ * runs in the resumer's thread. It might be nice to get a traceback
+ * from the resumee but this is not the case now.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+ if (is_error) {
+ DUK_ASSERT_TOP(thr, 2); /* value (error) is at stack top */
+ duk_err_augment_error_throw(thr); /* in resumer's context */
+ }
+#endif
+
+#if defined(DUK_USE_DEBUG)
+ if (is_error) {
+ DUK_DDD(DUK_DDDPRINT("RESUME ERROR: thread=%!T, value=%!T",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1)));
+ } else if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) {
+ DUK_DDD(DUK_DDDPRINT("RESUME NORMAL: thread=%!T, value=%!T",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1)));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("RESUME INITIAL: thread=%!T, value=%!T",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1)));
+ }
+#endif
+
+ thr->heap->lj.type = DUK_LJ_TYPE_RESUME;
+
+ /* lj value2: thread */
+ DUK_ASSERT(thr->valstack_bottom < thr->valstack_top);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value2, &thr->valstack_bottom[0]); /* side effects */
+
+ /* lj value1: value */
+ DUK_ASSERT(thr->valstack_bottom + 1 < thr->valstack_top);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[1]); /* side effects */
+ DUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1);
+
+ thr->heap->lj.iserror = is_error;
+
+ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* call is from executor, so we know we have a jmpbuf */
+ duk_err_longjmp(thr); /* execution resumes in bytecode executor */
+ DUK_UNREACHABLE();
+ /* Never here, fall through to error (from compiler point of view). */
+
+ state_error:
+ DUK_DCERROR_TYPE_INVALID_STATE(thr);
+}
+#endif
+
+/*
+ * Yield the current thread.
+ *
+ * The thread must be in yieldable state: it must have a resumer, and there
+ * must not be any yield-preventing calls (native calls and constructor calls,
+ * currently) in the thread's call stack (otherwise a resume would not be
+ * possible later). This method must be called from an Ecmascript function.
+ *
+ * Args:
+ * - value
+ * - isError (defaults to false)
+ *
+ * Note: yield and resume handling is currently asymmetric.
+ */
+
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_thread_yield(duk_hthread *thr) {
+ duk_hobject *caller_func;
+ duk_small_uint_t is_error;
+
+ DUK_DDD(DUK_DDDPRINT("Duktape.Thread.yield(): value=%!T, is_error=%!T",
+ (duk_tval *) duk_get_tval(thr, 0),
+ (duk_tval *) duk_get_tval(thr, 1)));
+
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);
+ DUK_ASSERT(thr->heap->curr_thread == thr);
+
+ is_error = (duk_small_uint_t) duk_to_boolean(thr, 1);
+ duk_set_top(thr, 1);
+
+ /* [ value ] */
+
+ /*
+ * Thread state and calling context checks
+ */
+
+ if (!thr->resumer) {
+ DUK_DD(DUK_DDPRINT("yield state invalid: current thread must have a resumer"));
+ goto state_error;
+ }
+ DUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED);
+
+ if (thr->callstack_top < 2) {
+ DUK_DD(DUK_DDPRINT("yield state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.yield)"));
+ goto state_error;
+ }
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); /* us */
+ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL); /* caller */
+
+ caller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent);
+ if (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) {
+ DUK_DD(DUK_DDPRINT("yield state invalid: caller must be Ecmascript code"));
+ goto state_error;
+ }
+
+ DUK_ASSERT(thr->callstack_preventcount >= 1); /* should never be zero, because we (Duktape.Thread.yield) are on the stack */
+ if (thr->callstack_preventcount != 1) {
+ /* Note: the only yield-preventing call is Duktape.Thread.yield(), hence check for 1, not 0 */
+ DUK_DD(DUK_DDPRINT("yield state invalid: there must be no yield-preventing calls in current thread callstack (preventcount is %ld)",
+ (long) thr->callstack_preventcount));
+ goto state_error;
+ }
+
+ /*
+ * The error object has been augmented with a traceback and other
+ * info from its creation point -- usually the current thread.
+ * The error handler, however, is called right before throwing
+ * and runs in the yielder's thread.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+ if (is_error) {
+ DUK_ASSERT_TOP(thr, 1); /* value (error) is at stack top */
+ duk_err_augment_error_throw(thr); /* in yielder's context */
+ }
+#endif
+
+#if defined(DUK_USE_DEBUG)
+ if (is_error) {
+ DUK_DDD(DUK_DDDPRINT("YIELD ERROR: value=%!T",
+ (duk_tval *) duk_get_tval(thr, 0)));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("YIELD NORMAL: value=%!T",
+ (duk_tval *) duk_get_tval(thr, 0)));
+ }
+#endif
+
+ /*
+ * Process yield
+ *
+ * After longjmp(), processing continues in bytecode executor longjmp
+ * handler, which will e.g. update thr->resumer to NULL.
+ */
+
+ thr->heap->lj.type = DUK_LJ_TYPE_YIELD;
+
+ /* lj value1: value */
+ DUK_ASSERT(thr->valstack_bottom < thr->valstack_top);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[0]); /* side effects */
+ DUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1);
+
+ thr->heap->lj.iserror = is_error;
+
+ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* call is from executor, so we know we have a jmpbuf */
+ duk_err_longjmp(thr); /* execution resumes in bytecode executor */
+ DUK_UNREACHABLE();
+ /* Never here, fall through to error (from compiler point of view). */
+
+ state_error:
+ DUK_DCERROR_TYPE_INVALID_STATE(thr);
+}
+#endif
+
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+DUK_INTERNAL duk_ret_t duk_bi_thread_current(duk_hthread *thr) {
+ duk_push_current_thread(thr);
+ return 1;
+}
+#endif
+#line 1 "duk_bi_thrower.c"
+/*
+ * Type error thrower, E5 Section 13.2.3.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL duk_ret_t duk_bi_type_error_thrower(duk_hthread *thr) {
+ DUK_DCERROR_TYPE_INVALID_ARGS(thr);
+}
+#line 1 "duk_debug_fixedbuffer.c"
+/*
+ * Fixed buffer helper useful for debugging, requires no allocation
+ * which is critical for debugging.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_DEBUG)
+
+DUK_INTERNAL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length) {
+ duk_size_t avail;
+ duk_size_t copylen;
+
+ avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset));
+ if (length > avail) {
+ copylen = avail;
+ fb->truncated = 1;
+ } else {
+ copylen = length;
+ }
+ DUK_MEMCPY(fb->buffer + fb->offset, buffer, copylen);
+ fb->offset += copylen;
+}
+
+DUK_INTERNAL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x) {
+ duk_fb_put_bytes(fb, (const duk_uint8_t *) &x, 1);
+}
+
+DUK_INTERNAL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x) {
+ duk_fb_put_bytes(fb, (const duk_uint8_t *) x, (duk_size_t) DUK_STRLEN(x));
+}
+
+DUK_INTERNAL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...) {
+ duk_size_t avail;
+ va_list ap;
+
+ va_start(ap, fmt);
+ avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset));
+ if (avail > 0) {
+ duk_int_t res = (duk_int_t) DUK_VSNPRINTF((char *) (fb->buffer + fb->offset), avail, fmt, ap);
+ if (res < 0) {
+ /* error */
+ } else if ((duk_size_t) res >= avail) {
+ /* (maybe) truncated */
+ fb->offset += avail;
+ if ((duk_size_t) res > avail) {
+ /* actual chars dropped (not just NUL term) */
+ fb->truncated = 1;
+ }
+ } else {
+ /* normal */
+ fb->offset += (duk_size_t) res;
+ }
+ }
+ va_end(ap);
+}
+
+DUK_INTERNAL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size) {
+ char buf[64+1];
+ duk_debug_format_funcptr(buf, sizeof(buf), fptr, fptr_size);
+ buf[sizeof(buf) - 1] = (char) 0;
+ duk_fb_put_cstring(fb, buf);
+}
+
+DUK_INTERNAL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb) {
+ return (fb->offset >= fb->length);
+}
+
+#endif /* DUK_USE_DEBUG */
+#line 1 "duk_debug_vsnprintf.c"
+/*
+ * Custom formatter for debug printing, allowing Duktape specific data
+ * structures (such as tagged values and heap objects) to be printed with
+ * a nice format string. Because debug printing should not affect execution
+ * state, formatting here must be independent of execution (see implications
+ * below) and must not allocate memory.
+ *
+ * Custom format tags begin with a '%!' to safely distinguish them from
+ * standard format tags. The following conversions are supported:
+ *
+ * %!T tagged value (duk_tval *)
+ * %!O heap object (duk_heaphdr *)
+ * %!I decoded bytecode instruction
+ * %!C bytecode instruction opcode name (arg is long)
+ *
+ * Everything is serialized in a JSON-like manner. The default depth is one
+ * level, internal prototype is not followed, and internal properties are not
+ * serialized. The following modifiers change this behavior:
+ *
+ * @ print pointers
+ * # print binary representations (where applicable)
+ * d deep traversal of own properties (not prototype)
+ * p follow prototype chain (useless without 'd')
+ * i include internal properties (other than prototype)
+ * x hexdump buffers
+ * h heavy formatting
+ *
+ * For instance, the following serializes objects recursively, but does not
+ * follow the prototype chain nor print internal properties: "%!dO".
+ *
+ * Notes:
+ *
+ * * Standard snprintf return value semantics seem to vary. This
+ * implementation returns the number of bytes it actually wrote
+ * (excluding the null terminator). If retval == buffer size,
+ * output was truncated (except for corner cases).
+ *
+ * * Output format is intentionally different from Ecmascript
+ * formatting requirements, as formatting here serves debugging
+ * of internals.
+ *
+ * * Depth checking (and updating) is done in each type printer
+ * separately, to allow them to call each other freely.
+ *
+ * * Some pathological structures might take ages to print (e.g.
+ * self recursion with 100 properties pointing to the object
+ * itself). To guard against these, each printer also checks
+ * whether the output buffer is full; if so, early exit.
+ *
+ * * Reference loops are detected using a loop stack.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_DEBUG)
+
+/* #include stdio.h -> already included */
+/* #include stdarg.h -> already included */
+#include <string.h>
+
+/* list of conversion specifiers that terminate a format tag;
+ * this is unfortunately guesswork.
+ */
+#define DUK__ALLOWED_STANDARD_SPECIFIERS "diouxXeEfFgGaAcsCSpnm"
+
+/* maximum length of standard format tag that we support */
+#define DUK__MAX_FORMAT_TAG_LENGTH 32
+
+/* heapobj recursion depth when deep printing is selected */
+#define DUK__DEEP_DEPTH_LIMIT 8
+
+/* maximum recursion depth for loop detection stacks */
+#define DUK__LOOP_STACK_DEPTH 256
+
+/* must match bytecode defines now; build autogenerate? */
+DUK_LOCAL const char * const duk__bc_optab[256] = {
+ "LDREG", "STREG", "JUMP", "LDCONST", "LDINT", "LDINTX", "LDTHIS", "LDUNDEF",
+ "LDNULL", "LDTRUE", "LDFALSE", "GETVAR", "BNOT", "LNOT", "UNM", "UNP",
+ "EQ_RR", "EQ_CR", "EQ_RC", "EQ_CC", "NEQ_RR", "NEQ_CR", "NEQ_RC", "NEQ_CC",
+ "SEQ_RR", "SEQ_CR", "SEQ_RC", "SEQ_CC", "SNEQ_RR", "SNEQ_CR", "SNEQ_RC", "SNEQ_CC",
+
+ "GT_RR", "GT_CR", "GT_RC", "GT_CC", "GE_RR", "GE_CR", "GE_RC", "GE_CC",
+ "LT_RR", "LT_CR", "LT_RC", "LT_CC", "LE_RR", "LE_CR", "LE_RC", "LE_CC",
+ "IFTRUE_R", "IFTRUE_C", "IFFALSE_R", "IFFALSE_C", "ADD_RR", "ADD_CR", "ADD_RC", "ADD_CC",
+ "SUB_RR", "SUB_CR", "SUB_RC", "SUB_CC", "MUL_RR", "MUL_CR", "MUL_RC", "MUL_CC",
+
+ "DIV_RR", "DIV_CR", "DIV_RC", "DIV_CC", "MOD_RR", "MOD_CR", "MOD_RC", "MOD_CC",
+ "EXP_RR", "EXP_CR", "EXP_RC", "EXP_CC", "BAND_RR", "BAND_CR", "BAND_RC", "BAND_CC",
+ "BOR_RR", "BOR_CR", "BOR_RC", "BOR_CC", "BXOR_RR", "BXOR_CR", "BXOR_RC", "BXOR_CC",
+ "BASL_RR", "BASL_CR", "BASL_RC", "BASL_CC", "BLSR_RR", "BLSR_CR", "BLSR_RC", "BLSR_CC",
+
+ "BASR_RR", "BASR_CR", "BASR_RC", "BASR_CC", "INSTOF_RR", "INSTOF_CR", "INSTOF_RC", "INSTOF_CC",
+ "IN_RR", "IN_CR", "IN_RC", "IN_CC", "GETPROP_RR", "GETPROP_CR", "GETPROP_RC", "GETPROP_CC",
+ "PUTPROP_RR", "PUTPROP_CR", "PUTPROP_RC", "PUTPROP_CC", "DELPROP_RR", "DELPROP_CR", "DELPROP_RC", "DELPROP_CC",
+ "PREINCR", "PREDECR", "POSTINCR", "POSTDECR", "PREINCV", "PREDECV", "POSTINCV", "POSTDECV",
+
+ "PREINCP_RR", "PREINCP_CR", "PREINCP_RC", "PREINCP_CC", "PREDECP_RR", "PREDECP_CR", "PREDECP_RC", "PREDECP_CC",
+ "POSTINCP_RR", "POSTINCP_CR", "POSTINCP_RC", "POSTINCP_CC", "POSTDECP_RR", "POSTDECP_CR", "POSTDECP_RC", "POSTDECP_CC",
+ "DECLVAR_RR", "DECLVAR_CR", "DECLVAR_RC", "DECLVAR_CC", "REGEXP_RR", "REGEXP_RC", "REGEXP_CR", "REGEXP_CC",
+ "CLOSURE", "TYPEOF", "TYPEOFID", "PUTVAR", "DELVAR", "RETREG", "RETUNDEF", "RETCONST",
+
+ "RETCONSTN", "LABEL", "ENDLABEL", "BREAK", "CONTINUE", "TRYCATCH", "ENDTRY", "ENDCATCH",
+ "ENDFIN", "THROW", "INVLHS", "CSREG", "CSVAR_RR", "CSVAR_CR", "CSVAR_RC", "CSVAR_CC",
+ "CALL0", "CALL1", "CALL2", "CALL3", "CALL4", "CALL5", "CALL6", "CALL7",
+ "CALL8", "CALL9", "CALL10", "CALL11", "CALL12", "CALL13", "CALL14", "CALL15",
+
+ "NEWOBJ", "NEWARR", "MPUTOBJ", "MPUTOBJI", "INITSET", "INITGET", "MPUTARR", "MPUTARRI",
+ "SETALEN", "INITENUM", "NEXTENUM", "NEWTARGET", "DEBUGGER", "NOP", "INVALID", "UNUSED207",
+ "GETPROPC_RR", "GETPROPC_CR", "GETPROPC_RC", "GETPROPC_CC", "UNUSED212", "UNUSED213", "UNUSED214", "UNUSED215",
+ "UNUSED216", "UNUSED217", "UNUSED218", "UNUSED219", "UNUSED220", "UNUSED221", "UNUSED222", "UNUSED223",
+
+ "UNUSED224", "UNUSED225", "UNUSED226", "UNUSED227", "UNUSED228", "UNUSED229", "UNUSED230", "UNUSED231",
+ "UNUSED232", "UNUSED233", "UNUSED234", "UNUSED235", "UNUSED236", "UNUSED237", "UNUSED238", "UNUSED239",
+ "UNUSED240", "UNUSED241", "UNUSED242", "UNUSED243", "UNUSED244", "UNUSED245", "UNUSED246", "UNUSED247",
+ "UNUSED248", "UNUSED249", "UNUSED250", "UNUSED251", "UNUSED252", "UNUSED253", "UNUSED254", "UNUSED255"
+};
+
+typedef struct duk__dprint_state duk__dprint_state;
+struct duk__dprint_state {
+ duk_fixedbuffer *fb;
+
+ /* loop_stack_index could be perhaps be replaced by 'depth', but it's nice
+ * to not couple these two mechanisms unnecessarily.
+ */
+ duk_hobject *loop_stack[DUK__LOOP_STACK_DEPTH];
+ duk_int_t loop_stack_index;
+ duk_int_t loop_stack_limit;
+
+ duk_int_t depth;
+ duk_int_t depth_limit;
+
+ duk_bool_t pointer;
+ duk_bool_t heavy;
+ duk_bool_t binary;
+ duk_bool_t follow_proto;
+ duk_bool_t internal;
+ duk_bool_t hexdump;
+};
+
+/* helpers */
+DUK_LOCAL_DECL void duk__print_hstring(duk__dprint_state *st, duk_hstring *k, duk_bool_t quotes);
+DUK_LOCAL_DECL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h);
+DUK_LOCAL_DECL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h);
+DUK_LOCAL_DECL void duk__print_tval(duk__dprint_state *st, duk_tval *tv);
+DUK_LOCAL_DECL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins);
+DUK_LOCAL_DECL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h);
+DUK_LOCAL_DECL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h);
+DUK_LOCAL_DECL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h);
+
+DUK_LOCAL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h) {
+ duk_fixedbuffer *fb = st->fb;
+
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "(%p)", (void *) h);
+ }
+
+ if (!h) {
+ return;
+ }
+
+ if (st->binary) {
+ duk_size_t i;
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET);
+ for (i = 0; i < (duk_size_t) sizeof(*h); i++) {
+ duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]);
+ }
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET);
+ }
+
+#if defined(DUK_USE_REFERENCE_COUNTING) /* currently implicitly also DUK_USE_DOUBLE_LINKED_HEAP */
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "[h_next=%p,h_prev=%p,h_refcount=%lu,h_flags=%08lx,type=%ld,"
+ "reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]",
+ (void *) DUK_HEAPHDR_GET_NEXT(NULL, h),
+ (void *) DUK_HEAPHDR_GET_PREV(NULL, h),
+ (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(h),
+ (unsigned long) DUK_HEAPHDR_GET_FLAGS(h),
+ (long) DUK_HEAPHDR_GET_TYPE(h),
+ (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0));
+ }
+#else
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "[h_next=%p,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]",
+ (void *) DUK_HEAPHDR_GET_NEXT(NULL, h),
+ (unsigned long) DUK_HEAPHDR_GET_FLAGS(h),
+ (long) DUK_HEAPHDR_GET_TYPE(h),
+ (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0));
+ }
+#endif
+}
+
+DUK_LOCAL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h) {
+ duk_fixedbuffer *fb = st->fb;
+
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "(%p)", (void *) h);
+ }
+
+ if (!h) {
+ return;
+ }
+
+ if (st->binary) {
+ duk_size_t i;
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET);
+ for (i = 0; i < (duk_size_t) sizeof(*h); i++) {
+ duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]);
+ }
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET);
+ }
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "[h_refcount=%lu,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]",
+ (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h),
+ (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h),
+ (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h),
+ (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0));
+ }
+#else
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "[h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]",
+ (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h),
+ (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h),
+ (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0),
+ (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0));
+ }
+#endif
+}
+
+DUK_LOCAL void duk__print_hstring(duk__dprint_state *st, duk_hstring *h, duk_bool_t quotes) {
+ duk_fixedbuffer *fb = st->fb;
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_end;
+
+ /* terminal type: no depth check */
+
+ if (duk_fb_is_full(fb)) {
+ return;
+ }
+
+ duk__print_shared_heaphdr_string(st, &h->hdr);
+
+ if (!h) {
+ duk_fb_put_cstring(fb, "NULL");
+ return;
+ }
+
+ p = DUK_HSTRING_GET_DATA(h);
+ p_end = p + DUK_HSTRING_GET_BYTELEN(h);
+
+ if (p_end > p && p[0] == DUK_ASC_UNDERSCORE) {
+ /* If property key begins with underscore, encode it with
+ * forced quotes (e.g. "_Foo") to distinguish it from encoded
+ * internal properties (e.g. \x82Bar -> _Bar).
+ */
+ quotes = 1;
+ }
+
+ if (quotes) {
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE);
+ }
+ while (p < p_end) {
+ duk_uint8_t ch = *p++;
+
+ /* two special escapes: '\' and '"', other printables as is */
+ if (ch == '\\') {
+ duk_fb_sprintf(fb, "\\\\");
+ } else if (ch == '"') {
+ duk_fb_sprintf(fb, "\\\"");
+ } else if (ch >= 0x20 && ch <= 0x7e) {
+ duk_fb_put_byte(fb, ch);
+ } else if (ch == 0x82 && !quotes) {
+ /* encode \x82Bar as _Bar if no quotes are
+ * applied, this is for readable internal keys.
+ */
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_UNDERSCORE);
+ } else {
+ duk_fb_sprintf(fb, "\\x%02lx", (unsigned long) ch);
+ }
+ }
+ if (quotes) {
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE);
+ }
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* XXX: limit to quoted strings only, to save keys from being cluttered? */
+ duk_fb_sprintf(fb, "/%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr));
+#endif
+}
+
+#define DUK__COMMA() do { \
+ if (first) { \
+ first = 0; \
+ } else { \
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA); \
+ } \
+ } while (0)
+
+DUK_LOCAL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h) {
+ duk_fixedbuffer *fb = st->fb;
+ duk_uint_fast32_t i;
+ duk_tval *tv;
+ duk_hstring *key;
+ duk_bool_t first = 1;
+ const char *brace1 = "{";
+ const char *brace2 = "}";
+ duk_bool_t pushed_loopstack = 0;
+
+ if (duk_fb_is_full(fb)) {
+ return;
+ }
+
+ duk__print_shared_heaphdr(st, &h->hdr);
+
+ if (h && DUK_HOBJECT_HAS_ARRAY_PART(h)) {
+ brace1 = "[";
+ brace2 = "]";
+ }
+
+ if (!h) {
+ duk_fb_put_cstring(fb, "NULL");
+ goto finished;
+ }
+
+ if (st->depth >= st->depth_limit) {
+ const char *subtype = "generic";
+
+ if (DUK_HOBJECT_IS_COMPFUNC(h)) {
+ subtype = "compfunc";
+ } else if (DUK_HOBJECT_IS_NATFUNC(h)) {
+ subtype = "natfunc";
+ } else if (DUK_HOBJECT_IS_THREAD(h)) {
+ subtype = "thread";
+ } else if (DUK_HOBJECT_IS_BUFOBJ(h)) {
+ subtype = "bufobj";
+ } else if (DUK_HOBJECT_IS_ARRAY(h)) {
+ subtype = "array";
+ }
+ duk_fb_sprintf(fb, "%sobject/%s %p%s", (const char *) brace1, subtype, (void *) h, (const char *) brace2);
+ return;
+ }
+
+ for (i = 0; i < (duk_uint_fast32_t) st->loop_stack_index; i++) {
+ if (st->loop_stack[i] == h) {
+ duk_fb_sprintf(fb, "%sLOOP:%p%s", (const char *) brace1, (void *) h, (const char *) brace2);
+ return;
+ }
+ }
+
+ /* after this, return paths should 'goto finished' for decrement */
+ st->depth++;
+
+ if (st->loop_stack_index >= st->loop_stack_limit) {
+ duk_fb_sprintf(fb, "%sOUT-OF-LOOP-STACK%s", (const char *) brace1, (const char *) brace2);
+ goto finished;
+ }
+ st->loop_stack[st->loop_stack_index++] = h;
+ pushed_loopstack = 1;
+
+ /*
+ * Notation: double underscore used for internal properties which are not
+ * stored in the property allocation (e.g. '__valstack').
+ */
+
+ duk_fb_put_cstring(fb, brace1);
+
+ if (DUK_HOBJECT_GET_PROPS(NULL, h)) {
+ duk_uint32_t a_limit;
+
+ a_limit = DUK_HOBJECT_GET_ASIZE(h);
+ if (st->internal) {
+ /* dump all allocated entries, unused entries print as 'unused',
+ * note that these may extend beyond current 'length' and look
+ * a bit funny.
+ */
+ } else {
+ /* leave out trailing 'unused' elements */
+ while (a_limit > 0) {
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, a_limit - 1);
+ if (!DUK_TVAL_IS_UNUSED(tv)) {
+ break;
+ }
+ a_limit--;
+ }
+ }
+
+ for (i = 0; i < a_limit; i++) {
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, i);
+ DUK__COMMA();
+ duk__print_tval(st, tv);
+ }
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(h); i++) {
+ key = DUK_HOBJECT_E_GET_KEY(NULL, h, i);
+ if (!key) {
+ continue;
+ }
+ if (!st->internal && DUK_HSTRING_HAS_HIDDEN(key)) {
+ continue;
+ }
+ DUK__COMMA();
+ duk__print_hstring(st, key, 0);
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COLON);
+ if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(NULL, h, i)) {
+ duk_fb_sprintf(fb, "[get:%p,set:%p]",
+ (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.get,
+ (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.set);
+ } else {
+ tv = &DUK_HOBJECT_E_GET_VALUE(NULL, h, i).v;
+ duk__print_tval(st, tv);
+ }
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "<%02lx>", (unsigned long) DUK_HOBJECT_E_GET_FLAGS(NULL, h, i));
+ }
+ }
+ }
+ if (st->internal) {
+ if (DUK_HOBJECT_IS_ARRAY(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__array:true");
+ }
+ if (DUK_HOBJECT_HAS_EXTENSIBLE(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__extensible:true");
+ }
+ if (DUK_HOBJECT_HAS_CONSTRUCTABLE(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__constructable:true");
+ }
+ if (DUK_HOBJECT_HAS_BOUNDFUNC(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__boundfunc:true");
+ }
+ if (DUK_HOBJECT_HAS_COMPFUNC(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__compfunc:true");
+ }
+ if (DUK_HOBJECT_HAS_NATFUNC(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__natfunc:true");
+ }
+ if (DUK_HOBJECT_HAS_BUFOBJ(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__bufobj:true");
+ }
+ if (DUK_HOBJECT_IS_THREAD(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__thread:true");
+ }
+ if (DUK_HOBJECT_HAS_ARRAY_PART(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__array_part:true");
+ }
+ if (DUK_HOBJECT_HAS_STRICT(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__strict:true");
+ }
+ if (DUK_HOBJECT_HAS_NOTAIL(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__notail:true");
+ }
+ if (DUK_HOBJECT_HAS_NEWENV(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__newenv:true");
+ }
+ if (DUK_HOBJECT_HAS_NAMEBINDING(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__namebinding:true");
+ }
+ if (DUK_HOBJECT_HAS_CREATEARGS(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__createargs:true");
+ }
+ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_array:true");
+ }
+ if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_stringobj:true");
+ }
+ if (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_arguments:true");
+ }
+ if (DUK_HOBJECT_IS_BUFOBJ(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_bufobj:true");
+ }
+ if (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_proxyobj:true");
+ }
+ }
+
+ if (st->internal && DUK_HOBJECT_IS_ARRAY(h)) {
+ duk_harray *a = (duk_harray *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__length:%ld", (long) a->length);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__length_nonwritable:%ld", (long) a->length_nonwritable);
+ } else if (st->internal && DUK_HOBJECT_IS_COMPFUNC(h)) {
+ duk_hcompfunc *f = (duk_hcompfunc *) h;
+ DUK__COMMA(); duk_fb_put_cstring(fb, "__data:");
+ duk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f));
+ DUK__COMMA(); duk_fb_put_cstring(fb, "__lexenv:"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_LEXENV(NULL, f));
+ DUK__COMMA(); duk_fb_put_cstring(fb, "__varenv:"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_VARENV(NULL, f));
+ DUK__COMMA(); duk_fb_sprintf(fb, "__nregs:%ld", (long) f->nregs);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__nargs:%ld", (long) f->nargs);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ DUK__COMMA(); duk_fb_sprintf(fb, "__start_line:%ld", (long) f->start_line);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__end_line:%ld", (long) f->end_line);
+#endif
+ DUK__COMMA(); duk_fb_put_cstring(fb, "__data:");
+ duk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f));
+ } else if (st->internal && DUK_HOBJECT_IS_NATFUNC(h)) {
+ duk_hnatfunc *f = (duk_hnatfunc *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__func:");
+ duk_fb_put_funcptr(fb, (duk_uint8_t *) &f->func, sizeof(f->func));
+ DUK__COMMA(); duk_fb_sprintf(fb, "__nargs:%ld", (long) f->nargs);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__magic:%ld", (long) f->magic);
+ } else if (st->internal && DUK_HOBJECT_IS_DECENV(h)) {
+ duk_hdecenv *e = (duk_hdecenv *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__thread:"); duk__print_hobject(st, (duk_hobject *) e->thread);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__varmap:"); duk__print_hobject(st, (duk_hobject *) e->varmap);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__regbase_byteoff:%ld", (long) e->regbase_byteoff);
+ } else if (st->internal && DUK_HOBJECT_IS_OBJENV(h)) {
+ duk_hobjenv *e = (duk_hobjenv *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__target:"); duk__print_hobject(st, (duk_hobject *) e->target);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__has_this:%ld", (long) e->has_this);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ } else if (st->internal && DUK_HOBJECT_IS_BUFOBJ(h)) {
+ duk_hbufobj *b = (duk_hbufobj *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__buf:");
+ duk__print_hbuffer(st, (duk_hbuffer *) b->buf);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__buf_prop:");
+ duk__print_hobject(st, (duk_hobject *) b->buf_prop);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__offset:%ld", (long) b->offset);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__length:%ld", (long) b->length);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__shift:%ld", (long) b->shift);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__elemtype:%ld", (long) b->elem_type);
+#endif
+ } else if (st->internal && DUK_HOBJECT_IS_PROXY(h)) {
+ duk_hproxy *p = (duk_hproxy *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__target:");
+ duk__print_hobject(st, p->target);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__handler:");
+ duk__print_hobject(st, p->handler);
+ } else if (st->internal && DUK_HOBJECT_IS_THREAD(h)) {
+ duk_hthread *t = (duk_hthread *) h;
+ DUK__COMMA(); duk_fb_sprintf(fb, "__ptr_curr_pc:%p", (void *) t->ptr_curr_pc);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__heap:%p", (void *) t->heap);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__strict:%ld", (long) t->strict);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__state:%ld", (long) t->state);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__unused1:%ld", (long) t->unused1);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__unused2:%ld", (long) t->unused2);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__valstack:%p", (void *) t->valstack);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_end:%p/%ld", (void *) t->valstack_end, (long) (t->valstack_end - t->valstack));
+ DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_alloc_end:%p/%ld", (void *) t->valstack_alloc_end, (long) (t->valstack_alloc_end - t->valstack));
+ DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_bottom:%p/%ld", (void *) t->valstack_bottom, (long) (t->valstack_bottom - t->valstack));
+ DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_top:%p/%ld", (void *) t->valstack_top, (long) (t->valstack_top - t->valstack));
+ DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_curr:%p", (void *) t->callstack_curr);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_top:%ld", (long) t->callstack_top);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_preventcount:%ld", (long) t->callstack_preventcount);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__resumer:"); duk__print_hobject(st, (duk_hobject *) t->resumer);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__compile_ctx:%p", (void *) t->compile_ctx);
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+ DUK__COMMA(); duk_fb_sprintf(fb, "__interrupt_counter:%ld", (long) t->interrupt_counter);
+ DUK__COMMA(); duk_fb_sprintf(fb, "__interrupt_init:%ld", (long) t->interrupt_init);
+#endif
+
+ /* XXX: print built-ins array? */
+
+ }
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ if (st->internal) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__refcount:%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h));
+ }
+#endif
+ if (st->internal) {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__class:%ld", (long) DUK_HOBJECT_GET_CLASS_NUMBER(h));
+ }
+
+ DUK__COMMA(); duk_fb_sprintf(fb, "__heapptr:%p", (void *) h); /* own pointer */
+
+ /* prototype should be last, for readability */
+ if (DUK_HOBJECT_GET_PROTOTYPE(NULL, h)) {
+ if (st->follow_proto) {
+ DUK__COMMA(); duk_fb_put_cstring(fb, "__prototype:"); duk__print_hobject(st, DUK_HOBJECT_GET_PROTOTYPE(NULL, h));
+ } else {
+ DUK__COMMA(); duk_fb_sprintf(fb, "__prototype:%p", (void *) DUK_HOBJECT_GET_PROTOTYPE(NULL, h));
+ }
+ }
+
+ duk_fb_put_cstring(fb, brace2);
+
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ if (st->heavy && DUK_HOBJECT_GET_HSIZE(h) > 0) {
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE);
+ for (i = 0; i < DUK_HOBJECT_GET_HSIZE(h); i++) {
+ duk_uint_t h_idx = DUK_HOBJECT_H_GET_INDEX(NULL, h, i);
+ if (i > 0) {
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA);
+ }
+ if (h_idx == DUK_HOBJECT_HASHIDX_UNUSED) {
+ duk_fb_sprintf(fb, "u");
+ } else if (h_idx == DUK_HOBJECT_HASHIDX_DELETED) {
+ duk_fb_sprintf(fb, "d");
+ } else {
+ duk_fb_sprintf(fb, "%ld", (long) h_idx);
+ }
+ }
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE);
+ }
+#endif
+
+ finished:
+ st->depth--;
+ if (pushed_loopstack) {
+ st->loop_stack_index--;
+ st->loop_stack[st->loop_stack_index] = NULL;
+ }
+}
+
+DUK_LOCAL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h) {
+ duk_fixedbuffer *fb = st->fb;
+ duk_size_t i, n;
+ duk_uint8_t *p;
+
+ if (duk_fb_is_full(fb)) {
+ return;
+ }
+
+ /* terminal type: no depth check */
+
+ if (!h) {
+ duk_fb_put_cstring(fb, "NULL");
+ return;
+ }
+
+ if (DUK_HBUFFER_HAS_DYNAMIC(h)) {
+ if (DUK_HBUFFER_HAS_EXTERNAL(h)) {
+ duk_hbuffer_external *g = (duk_hbuffer_external *) h;
+ duk_fb_sprintf(fb, "buffer:external:%p:%ld",
+ (void *) DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(NULL, g),
+ (long) DUK_HBUFFER_EXTERNAL_GET_SIZE(g));
+ } else {
+ duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h;
+ duk_fb_sprintf(fb, "buffer:dynamic:%p:%ld",
+ (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(NULL, g),
+ (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(g));
+ }
+ } else {
+ duk_fb_sprintf(fb, "buffer:fixed:%ld", (long) DUK_HBUFFER_GET_SIZE(h));
+ }
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_fb_sprintf(fb, "/%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr));
+#endif
+
+ if (st->hexdump) {
+ duk_fb_sprintf(fb, "=[");
+ n = DUK_HBUFFER_GET_SIZE(h);
+ p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(NULL, h);
+ for (i = 0; i < n; i++) {
+ duk_fb_sprintf(fb, "%02lx", (unsigned long) p[i]);
+ }
+ duk_fb_sprintf(fb, "]");
+ }
+}
+
+DUK_LOCAL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h) {
+ duk_fixedbuffer *fb = st->fb;
+
+ if (duk_fb_is_full(fb)) {
+ return;
+ }
+
+ if (!h) {
+ duk_fb_put_cstring(fb, "NULL");
+ return;
+ }
+
+ switch (DUK_HEAPHDR_GET_TYPE(h)) {
+ case DUK_HTYPE_STRING:
+ duk__print_hstring(st, (duk_hstring *) h, 1);
+ break;
+ case DUK_HTYPE_OBJECT:
+ duk__print_hobject(st, (duk_hobject *) h);
+ break;
+ case DUK_HTYPE_BUFFER:
+ duk__print_hbuffer(st, (duk_hbuffer *) h);
+ break;
+ default:
+ duk_fb_sprintf(fb, "[unknown htype %ld]", (long) DUK_HEAPHDR_GET_TYPE(h));
+ break;
+ }
+}
+
+DUK_LOCAL void duk__print_tval(duk__dprint_state *st, duk_tval *tv) {
+ duk_fixedbuffer *fb = st->fb;
+
+ if (duk_fb_is_full(fb)) {
+ return;
+ }
+
+ /* depth check is done when printing an actual type */
+
+ if (st->heavy) {
+ duk_fb_sprintf(fb, "(%p)", (void *) tv);
+ }
+
+ if (!tv) {
+ duk_fb_put_cstring(fb, "NULL");
+ return;
+ }
+
+ if (st->binary) {
+ duk_size_t i;
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET);
+ for (i = 0; i < (duk_size_t) sizeof(*tv); i++) {
+ duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)tv)[i]);
+ }
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET);
+ }
+
+ if (st->heavy) {
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE);
+ }
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED: {
+ duk_fb_put_cstring(fb, "undefined");
+ break;
+ }
+ case DUK_TAG_UNUSED: {
+ duk_fb_put_cstring(fb, "unused");
+ break;
+ }
+ case DUK_TAG_NULL: {
+ duk_fb_put_cstring(fb, "null");
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ duk_fb_put_cstring(fb, DUK_TVAL_GET_BOOLEAN(tv) ? "true" : "false");
+ break;
+ }
+ case DUK_TAG_STRING: {
+ /* Note: string is a terminal heap object, so no depth check here */
+ duk__print_hstring(st, DUK_TVAL_GET_STRING(tv), 1);
+ break;
+ }
+ case DUK_TAG_OBJECT: {
+ duk__print_hobject(st, DUK_TVAL_GET_OBJECT(tv));
+ break;
+ }
+ case DUK_TAG_BUFFER: {
+ duk__print_hbuffer(st, DUK_TVAL_GET_BUFFER(tv));
+ break;
+ }
+ case DUK_TAG_POINTER: {
+ duk_fb_sprintf(fb, "pointer:%p", (void *) DUK_TVAL_GET_POINTER(tv));
+ break;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ duk_c_function func;
+ duk_small_uint_t lf_flags;
+
+ DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);
+ duk_fb_sprintf(fb, "lightfunc:");
+ duk_fb_put_funcptr(fb, (duk_uint8_t *) &func, sizeof(func));
+ duk_fb_sprintf(fb, ":%04lx", (long) lf_flags);
+ break;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ duk_fb_sprintf(fb, "%.18g_F", (double) DUK_TVAL_GET_NUMBER(tv));
+ break;
+#endif
+ default: {
+ /* IEEE double is approximately 16 decimal digits; print a couple extra */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ duk_fb_sprintf(fb, "%.18g", (double) DUK_TVAL_GET_NUMBER(tv));
+ break;
+ }
+ }
+ if (st->heavy) {
+ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE);
+ }
+}
+
+DUK_LOCAL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins) {
+ duk_fixedbuffer *fb = st->fb;
+ duk_small_int_t op;
+ const char *op_name;
+
+ op = (duk_small_int_t) DUK_DEC_OP(ins);
+ op_name = duk__bc_optab[op];
+
+ /* XXX: option to fix opcode length so it lines up nicely */
+
+ if (op == DUK_OP_JUMP) {
+ duk_int_t diff1 = (duk_int_t) (DUK_DEC_ABC(ins) - DUK_BC_JUMP_BIAS); /* from next pc */
+ duk_int_t diff2 = diff1 + 1; /* from curr pc */
+
+ duk_fb_sprintf(fb, "%s %ld (to pc%c%ld)",
+ (const char *) op_name, (long) diff1,
+ (int) (diff2 >= 0 ? '+' : '-'), /* char format: use int */
+ (long) (diff2 >= 0 ? diff2 : -diff2));
+ } else {
+ duk_fb_sprintf(fb, "%s %ld, %ld, %ld",
+ (const char *) op_name, (long) DUK_DEC_A(ins),
+ (long) DUK_DEC_B(ins), (long) DUK_DEC_C(ins));
+ }
+}
+
+DUK_LOCAL void duk__print_opcode(duk__dprint_state *st, duk_small_int_t opcode) {
+ duk_fixedbuffer *fb = st->fb;
+
+ if (opcode < DUK_BC_OP_MIN || opcode > DUK_BC_OP_MAX) {
+ duk_fb_sprintf(fb, "?(%ld)", (long) opcode);
+ } else {
+ duk_fb_sprintf(fb, "%s", (const char *) duk__bc_optab[opcode]);
+ }
+}
+
+DUK_INTERNAL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap) {
+ duk_fixedbuffer fb;
+ const char *p = format;
+ const char *p_end = p + DUK_STRLEN(format);
+ duk_int_t retval;
+
+ DUK_MEMZERO(&fb, sizeof(fb));
+ fb.buffer = (duk_uint8_t *) str;
+ fb.length = size;
+ fb.offset = 0;
+ fb.truncated = 0;
+
+ while (p < p_end) {
+ char ch = *p++;
+ const char *p_begfmt = NULL;
+ duk_bool_t got_exclamation = 0;
+ duk_bool_t got_long = 0; /* %lf, %ld etc */
+ duk__dprint_state st;
+
+ if (ch != DUK_ASC_PERCENT) {
+ duk_fb_put_byte(&fb, (duk_uint8_t) ch);
+ continue;
+ }
+
+ /*
+ * Format tag parsing. Since we don't understand all the
+ * possible format tags allowed, we just scan for a terminating
+ * specifier and keep track of relevant modifiers that we do
+ * understand. See man 3 printf.
+ */
+
+ DUK_MEMZERO(&st, sizeof(st));
+ st.fb = &fb;
+ st.depth = 0;
+ st.depth_limit = 1;
+ st.loop_stack_index = 0;
+ st.loop_stack_limit = DUK__LOOP_STACK_DEPTH;
+
+ p_begfmt = p - 1;
+ while (p < p_end) {
+ ch = *p++;
+
+ if (ch == DUK_ASC_STAR) {
+ /* unsupported: would consume multiple args */
+ goto format_error;
+ } else if (ch == DUK_ASC_PERCENT) {
+ duk_fb_put_byte(&fb, (duk_uint8_t) DUK_ASC_PERCENT);
+ break;
+ } else if (ch == DUK_ASC_EXCLAMATION) {
+ got_exclamation = 1;
+ } else if (!got_exclamation && ch == DUK_ASC_LC_L) {
+ got_long = 1;
+ } else if (got_exclamation && ch == DUK_ASC_LC_D) {
+ st.depth_limit = DUK__DEEP_DEPTH_LIMIT;
+ } else if (got_exclamation && ch == DUK_ASC_LC_P) {
+ st.follow_proto = 1;
+ } else if (got_exclamation && ch == DUK_ASC_LC_I) {
+ st.internal = 1;
+ } else if (got_exclamation && ch == DUK_ASC_LC_X) {
+ st.hexdump = 1;
+ } else if (got_exclamation && ch == DUK_ASC_LC_H) {
+ st.heavy = 1;
+ } else if (got_exclamation && ch == DUK_ASC_ATSIGN) {
+ st.pointer = 1;
+ } else if (got_exclamation && ch == DUK_ASC_HASH) {
+ st.binary = 1;
+ } else if (got_exclamation && ch == DUK_ASC_UC_T) {
+ duk_tval *t = va_arg(ap, duk_tval *);
+ if (st.pointer && !st.heavy) {
+ duk_fb_sprintf(&fb, "(%p)", (void *) t);
+ }
+ duk__print_tval(&st, t);
+ break;
+ } else if (got_exclamation && ch == DUK_ASC_UC_O) {
+ duk_heaphdr *t = va_arg(ap, duk_heaphdr *);
+ if (st.pointer && !st.heavy) {
+ duk_fb_sprintf(&fb, "(%p)", (void *) t);
+ }
+ duk__print_heaphdr(&st, t);
+ break;
+ } else if (got_exclamation && ch == DUK_ASC_UC_I) {
+ duk_instr_t t = va_arg(ap, duk_instr_t);
+ duk__print_instr(&st, t);
+ break;
+ } else if (got_exclamation && ch == DUK_ASC_UC_C) {
+ long t = va_arg(ap, long);
+ duk__print_opcode(&st, (duk_small_int_t) t);
+ break;
+ } else if (!got_exclamation && strchr(DUK__ALLOWED_STANDARD_SPECIFIERS, (int) ch)) {
+ char fmtbuf[DUK__MAX_FORMAT_TAG_LENGTH];
+ duk_size_t fmtlen;
+
+ DUK_ASSERT(p >= p_begfmt);
+ fmtlen = (duk_size_t) (p - p_begfmt);
+ if (fmtlen >= sizeof(fmtbuf)) {
+ /* format is too large, abort */
+ goto format_error;
+ }
+ DUK_MEMZERO(fmtbuf, sizeof(fmtbuf));
+ DUK_MEMCPY(fmtbuf, p_begfmt, fmtlen);
+
+ /* assume exactly 1 arg, which is why '*' is forbidden; arg size still
+ * depends on type though.
+ */
+
+ if (ch == DUK_ASC_LC_F || ch == DUK_ASC_LC_G || ch == DUK_ASC_LC_E) {
+ /* %f and %lf both consume a 'long' */
+ double arg = va_arg(ap, double);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_D && got_long) {
+ /* %ld */
+ long arg = va_arg(ap, long);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_D) {
+ /* %d; only 16 bits are guaranteed */
+ int arg = va_arg(ap, int);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_U && got_long) {
+ /* %lu */
+ unsigned long arg = va_arg(ap, unsigned long);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_U) {
+ /* %u; only 16 bits are guaranteed */
+ unsigned int arg = va_arg(ap, unsigned int);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_X && got_long) {
+ /* %lx */
+ unsigned long arg = va_arg(ap, unsigned long);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_X) {
+ /* %x; only 16 bits are guaranteed */
+ unsigned int arg = va_arg(ap, unsigned int);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else if (ch == DUK_ASC_LC_S) {
+ /* %s */
+ const char *arg = va_arg(ap, const char *);
+ if (arg == NULL) {
+ /* '%s' and NULL is not portable, so special case
+ * it for debug printing.
+ */
+ duk_fb_sprintf(&fb, "NULL");
+ } else {
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ }
+ } else if (ch == DUK_ASC_LC_P) {
+ /* %p */
+ void *arg = va_arg(ap, void *);
+ if (arg == NULL) {
+ /* '%p' and NULL is portable, but special case it
+ * anyway to get a standard NULL marker in logs.
+ */
+ duk_fb_sprintf(&fb, "NULL");
+ } else {
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ }
+ } else if (ch == DUK_ASC_LC_C) {
+ /* '%c', passed concretely as int */
+ int arg = va_arg(ap, int);
+ duk_fb_sprintf(&fb, fmtbuf, arg);
+ } else {
+ /* Should not happen. */
+ duk_fb_sprintf(&fb, "INVALID-FORMAT(%s)", (const char *) fmtbuf);
+ }
+ break;
+ } else {
+ /* ignore */
+ }
+ }
+ }
+ goto done;
+
+ format_error:
+ duk_fb_put_cstring(&fb, "FMTERR");
+ /* fall through */
+
+ done:
+ retval = (duk_int_t) fb.offset;
+ duk_fb_put_byte(&fb, (duk_uint8_t) 0);
+
+ /* return total chars written excluding terminator */
+ return retval;
+}
+
+#if 0 /*unused*/
+DUK_INTERNAL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...) {
+ duk_int_t retval;
+ va_list ap;
+ va_start(ap, format);
+ retval = duk_debug_vsnprintf(str, size, format, ap);
+ va_end(ap);
+ return retval;
+}
+#endif
+
+/* Formatting function pointers is tricky: there is no standard pointer for
+ * function pointers and the size of a function pointer may depend on the
+ * specific pointer type. This helper formats a function pointer based on
+ * its memory layout to get something useful on most platforms.
+ */
+DUK_INTERNAL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size) {
+ duk_size_t i;
+ duk_uint8_t *p = (duk_uint8_t *) buf;
+ duk_uint8_t *p_end = (duk_uint8_t *) (buf + buf_size - 1);
+
+ DUK_MEMZERO(buf, buf_size);
+
+ for (i = 0; i < fptr_size; i++) {
+ duk_int_t left = (duk_int_t) (p_end - p);
+ duk_uint8_t ch;
+ if (left <= 0) {
+ break;
+ }
+
+ /* Quite approximate but should be useful for little and big endian. */
+#if defined(DUK_USE_INTEGER_BE)
+ ch = fptr[i];
+#else
+ ch = fptr[fptr_size - 1 - i];
+#endif
+ p += DUK_SNPRINTF((char *) p, (duk_size_t) left, "%02lx", (unsigned long) ch);
+ }
+}
+
+#endif /* DUK_USE_DEBUG */
+
+/* automatic undefs */
+#undef DUK__ALLOWED_STANDARD_SPECIFIERS
+#undef DUK__COMMA
+#undef DUK__DEEP_DEPTH_LIMIT
+#undef DUK__LOOP_STACK_DEPTH
+#undef DUK__MAX_FORMAT_TAG_LENGTH
+#line 1 "duk_debugger.c"
+/*
+ * Duktape debugger
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+
+/*
+ * Assert helpers
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+#define DUK__DBG_TPORT_ENTER() do { \
+ DUK_ASSERT(heap->dbg_calling_transport == 0); \
+ heap->dbg_calling_transport = 1; \
+ } while (0)
+#define DUK__DBG_TPORT_EXIT() do { \
+ DUK_ASSERT(heap->dbg_calling_transport == 1); \
+ heap->dbg_calling_transport = 0; \
+ } while (0)
+#else
+#define DUK__DBG_TPORT_ENTER() do {} while (0)
+#define DUK__DBG_TPORT_EXIT() do {} while (0)
+#endif
+
+/*
+ * Helper structs
+ */
+
+typedef union {
+ void *p;
+ duk_uint_t b[1];
+ /* Use b[] to access the size of the union, which is strictly not
+ * correct. Can't use fixed size unless there's feature detection
+ * for pointer byte size.
+ */
+} duk__ptr_union;
+
+/*
+ * Detach handling
+ */
+
+#define DUK__SET_CONN_BROKEN(thr,reason) do { \
+ /* For now shared handler is fine. */ \
+ duk__debug_do_detach1((thr)->heap, (reason)); \
+ } while (0)
+
+DUK_LOCAL void duk__debug_do_detach1(duk_heap *heap, duk_int_t reason) {
+ /* Can be called multiple times with no harm. Mark the transport
+ * bad (dbg_read_cb == NULL) and clear state except for the detached
+ * callback and the udata field. The detached callback is delayed
+ * to the message loop so that it can be called between messages;
+ * this avoids corner cases related to immediate debugger reattach
+ * inside the detached callback.
+ */
+
+ if (heap->dbg_detaching) {
+ DUK_D(DUK_DPRINT("debugger already detaching, ignore detach1"));
+ return;
+ }
+
+ DUK_D(DUK_DPRINT("debugger transport detaching, marking transport broken"));
+
+ heap->dbg_detaching = 1; /* prevent multiple in-progress detaches */
+
+ if (heap->dbg_write_cb != NULL) {
+ duk_hthread *thr;
+
+ thr = heap->heap_thread;
+ DUK_ASSERT(thr != NULL);
+
+ duk_debug_write_notify(thr, DUK_DBG_CMD_DETACHING);
+ duk_debug_write_int(thr, reason);
+ duk_debug_write_eom(thr);
+ }
+
+ heap->dbg_read_cb = NULL;
+ heap->dbg_write_cb = NULL;
+ heap->dbg_peek_cb = NULL;
+ heap->dbg_read_flush_cb = NULL;
+ heap->dbg_write_flush_cb = NULL;
+ heap->dbg_request_cb = NULL;
+ /* heap->dbg_detached_cb: keep */
+ /* heap->dbg_udata: keep */
+ /* heap->dbg_processing: keep on purpose to avoid debugger re-entry in detaching state */
+ heap->dbg_state_dirty = 0;
+ heap->dbg_force_restart = 0;
+ heap->dbg_pause_flags = 0;
+ heap->dbg_pause_act = NULL;
+ heap->dbg_pause_startline = 0;
+ heap->dbg_have_next_byte = 0;
+ duk_debug_clear_paused(heap); /* XXX: some overlap with field inits above */
+ heap->dbg_state_dirty = 0; /* XXX: clear_paused sets dirty; rework? */
+
+ /* Ensure there are no stale active breakpoint pointers.
+ * Breakpoint list is currently kept - we could empty it
+ * here but we'd need to handle refcounts correctly, and
+ * we'd need a 'thr' reference for that.
+ *
+ * XXX: clear breakpoint on either attach or detach?
+ */
+ heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL;
+}
+
+DUK_LOCAL void duk__debug_do_detach2(duk_heap *heap) {
+ duk_debug_detached_function detached_cb;
+ void *detached_udata;
+ duk_hthread *thr;
+
+ thr = heap->heap_thread;
+ if (thr == NULL) {
+ DUK_ASSERT(heap->dbg_detached_cb == NULL);
+ return;
+ }
+
+ /* Safe to call multiple times. */
+
+ detached_cb = heap->dbg_detached_cb;
+ detached_udata = heap->dbg_udata;
+ heap->dbg_detached_cb = NULL;
+ heap->dbg_udata = NULL;
+
+ if (detached_cb) {
+ /* Careful here: state must be wiped before the call
+ * so that we can cleanly handle a re-attach from
+ * inside the callback.
+ */
+ DUK_D(DUK_DPRINT("detached during message loop, delayed call to detached_cb"));
+ detached_cb(thr, detached_udata);
+ }
+
+ heap->dbg_detaching = 0;
+}
+
+DUK_INTERNAL void duk_debug_do_detach(duk_heap *heap) {
+ duk__debug_do_detach1(heap, 0);
+ duk__debug_do_detach2(heap);
+}
+
+/* Called on a read/write error: NULL all callbacks except the detached
+ * callback so that we never accidentally call them after a read/write
+ * error has been indicated. This is especially important for the transport
+ * I/O callbacks to fulfill guaranteed callback semantics.
+ */
+DUK_LOCAL void duk__debug_null_most_callbacks(duk_hthread *thr) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+
+ heap = thr->heap;
+ DUK_D(DUK_DPRINT("transport read/write error, NULL all callbacks expected detached"));
+ heap->dbg_read_cb = NULL;
+ heap->dbg_write_cb = NULL; /* this is especially critical to avoid another write call in detach1() */
+ heap->dbg_peek_cb = NULL;
+ heap->dbg_read_flush_cb = NULL;
+ heap->dbg_write_flush_cb = NULL;
+ heap->dbg_request_cb = NULL;
+ /* keep heap->dbg_detached_cb */
+}
+
+/*
+ * Pause handling
+ */
+
+DUK_LOCAL void duk__debug_set_pause_state(duk_hthread *thr, duk_heap *heap, duk_small_uint_t pause_flags) {
+ duk_uint_fast32_t line;
+
+ line = duk_debug_curr_line(thr);
+ if (line == 0) {
+ /* No line info for current function. */
+ duk_small_uint_t updated_flags;
+
+ updated_flags = pause_flags & ~(DUK_PAUSE_FLAG_LINE_CHANGE);
+ DUK_D(DUK_DPRINT("no line info for current activation, disable line-based pause flags: 0x%08lx -> 0x%08lx",
+ (long) pause_flags, (long) updated_flags));
+ pause_flags = updated_flags;
+ }
+
+ heap->dbg_pause_flags = pause_flags;
+ heap->dbg_pause_act = thr->callstack_curr;
+ heap->dbg_pause_startline = (duk_uint32_t) line;
+ heap->dbg_state_dirty = 1;
+
+ DUK_D(DUK_DPRINT("set state for automatic pause triggers, flags=0x%08lx, act=%p, startline=%ld",
+ (long) heap->dbg_pause_flags, (void *) heap->dbg_pause_act,
+ (long) heap->dbg_pause_startline));
+}
+
+/*
+ * Debug connection peek and flush primitives
+ */
+
+DUK_INTERNAL duk_bool_t duk_debug_read_peek(duk_hthread *thr) {
+ duk_heap *heap;
+ duk_bool_t ret;
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ if (heap->dbg_read_cb == NULL) {
+ DUK_D(DUK_DPRINT("attempt to peek in detached state, return zero (= no data)"));
+ return 0;
+ }
+ if (heap->dbg_peek_cb == NULL) {
+ DUK_DD(DUK_DDPRINT("no peek callback, return zero (= no data)"));
+ return 0;
+ }
+
+ DUK__DBG_TPORT_ENTER();
+ ret = (duk_bool_t) (heap->dbg_peek_cb(heap->dbg_udata) > 0);
+ DUK__DBG_TPORT_EXIT();
+ return ret;
+}
+
+DUK_INTERNAL void duk_debug_read_flush(duk_hthread *thr) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ if (heap->dbg_read_cb == NULL) {
+ DUK_D(DUK_DPRINT("attempt to read flush in detached state, ignore"));
+ return;
+ }
+ if (heap->dbg_read_flush_cb == NULL) {
+ DUK_DD(DUK_DDPRINT("no read flush callback, ignore"));
+ return;
+ }
+
+ DUK__DBG_TPORT_ENTER();
+ heap->dbg_read_flush_cb(heap->dbg_udata);
+ DUK__DBG_TPORT_EXIT();
+}
+
+DUK_INTERNAL void duk_debug_write_flush(duk_hthread *thr) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ if (heap->dbg_read_cb == NULL) {
+ DUK_D(DUK_DPRINT("attempt to write flush in detached state, ignore"));
+ return;
+ }
+ if (heap->dbg_write_flush_cb == NULL) {
+ DUK_DD(DUK_DDPRINT("no write flush callback, ignore"));
+ return;
+ }
+
+ DUK__DBG_TPORT_ENTER();
+ heap->dbg_write_flush_cb(heap->dbg_udata);
+ DUK__DBG_TPORT_EXIT();
+}
+
+/*
+ * Debug connection skip primitives
+ */
+
+/* Skip fully. */
+DUK_INTERNAL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length) {
+ duk_uint8_t dummy[64];
+ duk_size_t now;
+
+ DUK_ASSERT(thr != NULL);
+
+ while (length > 0) {
+ now = (length > sizeof(dummy) ? sizeof(dummy) : length);
+ duk_debug_read_bytes(thr, dummy, now);
+ length -= now;
+ }
+}
+
+DUK_INTERNAL void duk_debug_skip_byte(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+
+ (void) duk_debug_read_byte(thr);
+}
+
+/*
+ * Debug connection read primitives
+ */
+
+/* Peek ahead in the stream one byte. */
+DUK_INTERNAL uint8_t duk_debug_peek_byte(duk_hthread *thr) {
+ /* It is important not to call this if the last byte read was an EOM.
+ * Reading ahead in this scenario would cause unnecessary blocking if
+ * another message is not available.
+ */
+
+ duk_uint8_t x;
+
+ x = duk_debug_read_byte(thr);
+ thr->heap->dbg_have_next_byte = 1;
+ thr->heap->dbg_next_byte = x;
+ return x;
+}
+
+/* Read fully. */
+DUK_INTERNAL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length) {
+ duk_heap *heap;
+ duk_uint8_t *p;
+ duk_size_t left;
+ duk_size_t got;
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ if (heap->dbg_read_cb == NULL) {
+ DUK_D(DUK_DPRINT("attempt to read %ld bytes in detached state, return zero data", (long) length));
+ goto fail;
+ }
+
+ /* NOTE: length may be zero */
+ p = data;
+ if (length >= 1 && heap->dbg_have_next_byte) {
+ heap->dbg_have_next_byte = 0;
+ *p++ = heap->dbg_next_byte;
+ }
+ for (;;) {
+ left = (duk_size_t) ((data + length) - p);
+ if (left == 0) {
+ break;
+ }
+ DUK_ASSERT(heap->dbg_read_cb != NULL);
+ DUK_ASSERT(left >= 1);
+#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE)
+ left = 1;
+#endif
+ DUK__DBG_TPORT_ENTER();
+ got = heap->dbg_read_cb(heap->dbg_udata, (char *) p, left);
+ DUK__DBG_TPORT_EXIT();
+
+ if (got == 0 || got > left) {
+ DUK_D(DUK_DPRINT("connection error during read, return zero data"));
+ duk__debug_null_most_callbacks(thr); /* avoid calling write callback in detach1() */
+ DUK__SET_CONN_BROKEN(thr, 1);
+ goto fail;
+ }
+ p += got;
+ }
+ return;
+
+ fail:
+ DUK_MEMZERO((void *) data, (size_t) length);
+}
+
+DUK_INTERNAL duk_uint8_t duk_debug_read_byte(duk_hthread *thr) {
+ duk_uint8_t x;
+
+ x = 0; /* just in case callback is broken and won't write 'x' */
+ duk_debug_read_bytes(thr, &x, 1);
+ return x;
+}
+
+DUK_LOCAL duk_uint32_t duk__debug_read_uint32_raw(duk_hthread *thr) {
+ duk_uint8_t buf[4];
+
+ DUK_ASSERT(thr != NULL);
+
+ duk_debug_read_bytes(thr, buf, 4);
+ return ((duk_uint32_t) buf[0] << 24) |
+ ((duk_uint32_t) buf[1] << 16) |
+ ((duk_uint32_t) buf[2] << 8) |
+ (duk_uint32_t) buf[3];
+}
+
+DUK_LOCAL duk_int32_t duk__debug_read_int32_raw(duk_hthread *thr) {
+ return (duk_int32_t) duk__debug_read_uint32_raw(thr);
+}
+
+DUK_LOCAL duk_uint16_t duk__debug_read_uint16_raw(duk_hthread *thr) {
+ duk_uint8_t buf[2];
+
+ DUK_ASSERT(thr != NULL);
+
+ duk_debug_read_bytes(thr, buf, 2);
+ return ((duk_uint16_t) buf[0] << 8) |
+ (duk_uint16_t) buf[1];
+}
+
+DUK_INTERNAL duk_int32_t duk_debug_read_int(duk_hthread *thr) {
+ duk_small_uint_t x;
+ duk_small_uint_t t;
+
+ DUK_ASSERT(thr != NULL);
+
+ x = duk_debug_read_byte(thr);
+ if (x >= 0xc0) {
+ t = duk_debug_read_byte(thr);
+ return (duk_int32_t) (((x - 0xc0) << 8) + t);
+ } else if (x >= 0x80) {
+ return (duk_int32_t) (x - 0x80);
+ } else if (x == DUK_DBG_IB_INT4) {
+ return (duk_int32_t) duk__debug_read_uint32_raw(thr);
+ }
+
+ DUK_D(DUK_DPRINT("debug connection error: failed to decode int"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return 0;
+}
+
+DUK_LOCAL duk_hstring *duk__debug_read_hstring_raw(duk_hthread *thr, duk_uint32_t len) {
+ duk_uint8_t buf[31];
+ duk_uint8_t *p;
+
+ if (len <= sizeof(buf)) {
+ duk_debug_read_bytes(thr, buf, (duk_size_t) len);
+ duk_push_lstring(thr, (const char *) buf, (duk_size_t) len);
+ } else {
+ p = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len); /* zero for paranoia */
+ DUK_ASSERT(p != NULL);
+ duk_debug_read_bytes(thr, p, (duk_size_t) len);
+ (void) duk_buffer_to_string(thr, -1); /* Safety relies on debug client, which is OK. */
+ }
+
+ return duk_require_hstring(thr, -1);
+}
+
+DUK_INTERNAL duk_hstring *duk_debug_read_hstring(duk_hthread *thr) {
+ duk_small_uint_t x;
+ duk_uint32_t len;
+
+ DUK_ASSERT(thr != NULL);
+
+ x = duk_debug_read_byte(thr);
+ if (x >= 0x60 && x <= 0x7f) {
+ /* For short strings, use a fixed temp buffer. */
+ len = (duk_uint32_t) (x - 0x60);
+ } else if (x == DUK_DBG_IB_STR2) {
+ len = (duk_uint32_t) duk__debug_read_uint16_raw(thr);
+ } else if (x == DUK_DBG_IB_STR4) {
+ len = (duk_uint32_t) duk__debug_read_uint32_raw(thr);
+ } else {
+ goto fail;
+ }
+
+ return duk__debug_read_hstring_raw(thr, len);
+
+ fail:
+ DUK_D(DUK_DPRINT("debug connection error: failed to decode int"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ duk_push_hstring_empty(thr); /* always push some string */
+ return duk_require_hstring(thr, -1);
+}
+
+DUK_LOCAL duk_hbuffer *duk__debug_read_hbuffer_raw(duk_hthread *thr, duk_uint32_t len) {
+ duk_uint8_t *p;
+
+ p = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len); /* zero for paranoia */
+ DUK_ASSERT(p != NULL);
+ duk_debug_read_bytes(thr, p, (duk_size_t) len);
+
+ return duk_require_hbuffer(thr, -1);
+}
+
+DUK_LOCAL void *duk__debug_read_pointer_raw(duk_hthread *thr) {
+ duk_small_uint_t x;
+ duk__ptr_union pu;
+
+ DUK_ASSERT(thr != NULL);
+
+ x = duk_debug_read_byte(thr);
+ if (x != sizeof(pu)) {
+ goto fail;
+ }
+ duk_debug_read_bytes(thr, (duk_uint8_t *) &pu.p, sizeof(pu));
+#if defined(DUK_USE_INTEGER_LE)
+ duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu));
+#endif
+ return (void *) pu.p;
+
+ fail:
+ DUK_D(DUK_DPRINT("debug connection error: failed to decode pointer"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return (void *) NULL;
+}
+
+DUK_LOCAL duk_double_t duk__debug_read_double_raw(duk_hthread *thr) {
+ duk_double_union du;
+
+ DUK_ASSERT(sizeof(du.uc) == 8);
+ duk_debug_read_bytes(thr, (duk_uint8_t *) du.uc, sizeof(du.uc));
+ DUK_DBLUNION_DOUBLE_NTOH(&du);
+ return du.d;
+}
+
+#if 0
+DUK_INTERNAL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr) {
+ duk_small_uint_t x;
+
+ DUK_ASSERT(thr != NULL);
+
+ x = duk_debug_read_byte(thr);
+ if (x != DUK_DBG_IB_HEAPPTR) {
+ goto fail;
+ }
+
+ return (duk_heaphdr *) duk__debug_read_pointer_raw(thr);
+
+ fail:
+ DUK_D(DUK_DPRINT("debug connection error: failed to decode heapptr"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return NULL;
+}
+#endif
+
+DUK_INTERNAL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr) {
+ duk_small_uint_t x;
+
+ DUK_ASSERT(thr != NULL);
+
+ x = duk_debug_read_byte(thr);
+ switch (x) {
+ case DUK_DBG_IB_OBJECT:
+ case DUK_DBG_IB_POINTER:
+ case DUK_DBG_IB_HEAPPTR:
+ /* Accept any pointer-like value; for 'object' dvalue, read
+ * and ignore the class number.
+ */
+ if (x == DUK_DBG_IB_OBJECT) {
+ duk_debug_skip_byte(thr);
+ }
+ break;
+ default:
+ goto fail;
+ }
+
+ return (duk_heaphdr *) duk__debug_read_pointer_raw(thr);
+
+ fail:
+ DUK_D(DUK_DPRINT("debug connection error: failed to decode any pointer (object, pointer, heapptr)"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return NULL;
+}
+
+DUK_INTERNAL duk_tval *duk_debug_read_tval(duk_hthread *thr) {
+ duk_uint8_t x;
+ duk_uint_t t;
+ duk_uint32_t len;
+
+ DUK_ASSERT(thr != NULL);
+
+ x = duk_debug_read_byte(thr);
+
+ if (x >= 0xc0) {
+ t = (duk_uint_t) (x - 0xc0);
+ t = (t << 8) + duk_debug_read_byte(thr);
+ duk_push_uint(thr, (duk_uint_t) t);
+ goto return_ptr;
+ }
+ if (x >= 0x80) {
+ duk_push_uint(thr, (duk_uint_t) (x - 0x80));
+ goto return_ptr;
+ }
+ if (x >= 0x60) {
+ len = (duk_uint32_t) (x - 0x60);
+ duk__debug_read_hstring_raw(thr, len);
+ goto return_ptr;
+ }
+
+ switch (x) {
+ case DUK_DBG_IB_INT4: {
+ duk_int32_t i = duk__debug_read_int32_raw(thr);
+ duk_push_i32(thr, i);
+ break;
+ }
+ case DUK_DBG_IB_STR4: {
+ len = duk__debug_read_uint32_raw(thr);
+ duk__debug_read_hstring_raw(thr, len);
+ break;
+ }
+ case DUK_DBG_IB_STR2: {
+ len = duk__debug_read_uint16_raw(thr);
+ duk__debug_read_hstring_raw(thr, len);
+ break;
+ }
+ case DUK_DBG_IB_BUF4: {
+ len = duk__debug_read_uint32_raw(thr);
+ duk__debug_read_hbuffer_raw(thr, len);
+ break;
+ }
+ case DUK_DBG_IB_BUF2: {
+ len = duk__debug_read_uint16_raw(thr);
+ duk__debug_read_hbuffer_raw(thr, len);
+ break;
+ }
+ case DUK_DBG_IB_UNDEFINED: {
+ duk_push_undefined(thr);
+ break;
+ }
+ case DUK_DBG_IB_NULL: {
+ duk_push_null(thr);
+ break;
+ }
+ case DUK_DBG_IB_TRUE: {
+ duk_push_true(thr);
+ break;
+ }
+ case DUK_DBG_IB_FALSE: {
+ duk_push_false(thr);
+ break;
+ }
+ case DUK_DBG_IB_NUMBER: {
+ duk_double_t d;
+ d = duk__debug_read_double_raw(thr);
+ duk_push_number(thr, d);
+ break;
+ }
+ case DUK_DBG_IB_OBJECT: {
+ duk_heaphdr *h;
+ duk_debug_skip_byte(thr);
+ h = (duk_heaphdr *) duk__debug_read_pointer_raw(thr);
+ duk_push_heapptr(thr, (void *) h);
+ break;
+ }
+ case DUK_DBG_IB_POINTER: {
+ void *ptr;
+ ptr = duk__debug_read_pointer_raw(thr);
+ duk_push_pointer(thr, ptr);
+ break;
+ }
+ case DUK_DBG_IB_LIGHTFUNC: {
+ /* XXX: Not needed for now, so not implemented. Note that
+ * function pointers may have different size/layout than
+ * a void pointer.
+ */
+ DUK_D(DUK_DPRINT("reading lightfunc values unimplemented"));
+ goto fail;
+ }
+ case DUK_DBG_IB_HEAPPTR: {
+ duk_heaphdr *h;
+ h = (duk_heaphdr *) duk__debug_read_pointer_raw(thr);
+ duk_push_heapptr(thr, (void *) h);
+ break;
+ }
+ case DUK_DBG_IB_UNUSED: /* unused: not accepted in inbound messages */
+ default:
+ goto fail;
+ }
+
+ return_ptr:
+ return DUK_GET_TVAL_NEGIDX(thr, -1);
+
+ fail:
+ DUK_D(DUK_DPRINT("debug connection error: failed to decode tval"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return NULL;
+}
+
+/*
+ * Debug connection write primitives
+ */
+
+/* Write fully. */
+DUK_INTERNAL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length) {
+ duk_heap *heap;
+ const duk_uint8_t *p;
+ duk_size_t left;
+ duk_size_t got;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(length == 0 || data != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ if (heap->dbg_write_cb == NULL) {
+ DUK_D(DUK_DPRINT("attempt to write %ld bytes in detached state, ignore", (long) length));
+ return;
+ }
+ if (length == 0) {
+ /* Avoid doing an actual write callback with length == 0,
+ * because that's reserved for a write flush.
+ */
+ return;
+ }
+ DUK_ASSERT(data != NULL);
+
+ p = data;
+ for (;;) {
+ left = (duk_size_t) ((data + length) - p);
+ if (left == 0) {
+ break;
+ }
+ DUK_ASSERT(heap->dbg_write_cb != NULL);
+ DUK_ASSERT(left >= 1);
+#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE)
+ left = 1;
+#endif
+ DUK__DBG_TPORT_ENTER();
+ got = heap->dbg_write_cb(heap->dbg_udata, (const char *) p, left);
+ DUK__DBG_TPORT_EXIT();
+
+ if (got == 0 || got > left) {
+ duk__debug_null_most_callbacks(thr); /* avoid calling write callback in detach1() */
+ DUK_D(DUK_DPRINT("connection error during write"));
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return;
+ }
+ p += got;
+ }
+}
+
+DUK_INTERNAL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x) {
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) &x, 1);
+}
+
+DUK_INTERNAL void duk_debug_write_unused(duk_hthread *thr) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_UNUSED);
+}
+
+DUK_INTERNAL void duk_debug_write_undefined(duk_hthread *thr) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED);
+}
+
+#if defined(DUK_USE_DEBUGGER_INSPECT)
+DUK_INTERNAL void duk_debug_write_null(duk_hthread *thr) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_NULL);
+}
+#endif
+
+DUK_INTERNAL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val) {
+ duk_debug_write_byte(thr, val ? DUK_DBG_IB_TRUE : DUK_DBG_IB_FALSE);
+}
+
+/* Write signed 32-bit integer. */
+DUK_INTERNAL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x) {
+ duk_uint8_t buf[5];
+ duk_size_t len;
+
+ DUK_ASSERT(thr != NULL);
+
+ if (x >= 0 && x <= 0x3fL) {
+ buf[0] = (duk_uint8_t) (0x80 + x);
+ len = 1;
+ } else if (x >= 0 && x <= 0x3fffL) {
+ buf[0] = (duk_uint8_t) (0xc0 + (x >> 8));
+ buf[1] = (duk_uint8_t) (x & 0xff);
+ len = 2;
+ } else {
+ /* Signed integers always map to 4 bytes now. */
+ buf[0] = (duk_uint8_t) DUK_DBG_IB_INT4;
+ buf[1] = (duk_uint8_t) ((x >> 24) & 0xff);
+ buf[2] = (duk_uint8_t) ((x >> 16) & 0xff);
+ buf[3] = (duk_uint8_t) ((x >> 8) & 0xff);
+ buf[4] = (duk_uint8_t) (x & 0xff);
+ len = 5;
+ }
+ duk_debug_write_bytes(thr, buf, len);
+}
+
+/* Write unsigned 32-bit integer. */
+DUK_INTERNAL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x) {
+ /* The debugger protocol doesn't support a plain integer encoding for
+ * the full 32-bit unsigned range (only 32-bit signed). For now,
+ * unsigned 32-bit values simply written as signed ones. This is not
+ * a concrete issue except for 32-bit heaphdr fields. Proper solutions
+ * would be to (a) write such integers as IEEE doubles or (b) add an
+ * unsigned 32-bit dvalue.
+ */
+ if (x >= 0x80000000UL) {
+ DUK_D(DUK_DPRINT("writing unsigned integer 0x%08lx as signed integer",
+ (long) x));
+ }
+ duk_debug_write_int(thr, (duk_int32_t) x);
+}
+
+DUK_INTERNAL void duk_debug_write_strbuf(duk_hthread *thr, const char *data, duk_size_t length, duk_uint8_t marker_base) {
+ duk_uint8_t buf[5];
+ duk_size_t buflen;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(length == 0 || data != NULL);
+
+ if (length <= 0x1fUL && marker_base == DUK_DBG_IB_STR4) {
+ /* For strings, special form for short lengths. */
+ buf[0] = (duk_uint8_t) (0x60 + length);
+ buflen = 1;
+ } else if (length <= 0xffffUL) {
+ buf[0] = (duk_uint8_t) (marker_base + 1);
+ buf[1] = (duk_uint8_t) (length >> 8);
+ buf[2] = (duk_uint8_t) (length & 0xff);
+ buflen = 3;
+ } else {
+ buf[0] = (duk_uint8_t) marker_base;
+ buf[1] = (duk_uint8_t) (length >> 24);
+ buf[2] = (duk_uint8_t) ((length >> 16) & 0xff);
+ buf[3] = (duk_uint8_t) ((length >> 8) & 0xff);
+ buf[4] = (duk_uint8_t) (length & 0xff);
+ buflen = 5;
+ }
+
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) buf, buflen);
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) data, length);
+}
+
+DUK_INTERNAL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length) {
+ duk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_STR4);
+}
+
+DUK_INTERNAL void duk_debug_write_cstring(duk_hthread *thr, const char *data) {
+ DUK_ASSERT(thr != NULL);
+
+ duk_debug_write_string(thr,
+ data,
+ data ? DUK_STRLEN(data) : 0);
+}
+
+DUK_INTERNAL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h) {
+ DUK_ASSERT(thr != NULL);
+
+ /* XXX: differentiate null pointer from empty string? */
+ duk_debug_write_string(thr,
+ (h != NULL ? (const char *) DUK_HSTRING_GET_DATA(h) : NULL),
+ (h != NULL ? (duk_size_t) DUK_HSTRING_GET_BYTELEN(h) : 0));
+}
+
+DUK_LOCAL void duk__debug_write_hstring_safe_top(duk_hthread *thr) {
+ duk_debug_write_hstring(thr, duk_safe_to_hstring(thr, -1));
+}
+
+DUK_INTERNAL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length) {
+ duk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_BUF4);
+}
+
+DUK_INTERNAL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h) {
+ DUK_ASSERT(thr != NULL);
+
+ duk_debug_write_buffer(thr,
+ (h != NULL ? (const char *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h) : NULL),
+ (h != NULL ? (duk_size_t) DUK_HBUFFER_GET_SIZE(h) : 0));
+}
+
+DUK_LOCAL void duk__debug_write_pointer_raw(duk_hthread *thr, void *ptr, duk_uint8_t ibyte) {
+ duk_uint8_t buf[2];
+ duk__ptr_union pu;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(sizeof(ptr) >= 1 && sizeof(ptr) <= 16);
+ /* ptr may be NULL */
+
+ buf[0] = ibyte;
+ buf[1] = sizeof(pu);
+ duk_debug_write_bytes(thr, buf, 2);
+ pu.p = (void *) ptr;
+#if defined(DUK_USE_INTEGER_LE)
+ duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu));
+#endif
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu));
+}
+
+DUK_INTERNAL void duk_debug_write_pointer(duk_hthread *thr, void *ptr) {
+ duk__debug_write_pointer_raw(thr, ptr, DUK_DBG_IB_POINTER);
+}
+
+#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT)
+DUK_INTERNAL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h) {
+ duk__debug_write_pointer_raw(thr, (void *) h, DUK_DBG_IB_HEAPPTR);
+}
+#endif /* DUK_USE_DEBUGGER_DUMPHEAP || DUK_USE_DEBUGGER_INSPECT */
+
+DUK_INTERNAL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj) {
+ duk_uint8_t buf[3];
+ duk__ptr_union pu;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(sizeof(obj) >= 1 && sizeof(obj) <= 16);
+ DUK_ASSERT(obj != NULL);
+
+ buf[0] = DUK_DBG_IB_OBJECT;
+ buf[1] = (duk_uint8_t) DUK_HOBJECT_GET_CLASS_NUMBER(obj);
+ buf[2] = sizeof(pu);
+ duk_debug_write_bytes(thr, buf, 3);
+ pu.p = (void *) obj;
+#if defined(DUK_USE_INTEGER_LE)
+ duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu));
+#endif
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu));
+}
+
+DUK_INTERNAL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv) {
+ duk_c_function lf_func;
+ duk_small_uint_t lf_flags;
+ duk_uint8_t buf[4];
+ duk_double_union du1;
+ duk_double_union du2;
+ duk_int32_t i32;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED:
+ duk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED);
+ break;
+ case DUK_TAG_UNUSED:
+ duk_debug_write_byte(thr, DUK_DBG_IB_UNUSED);
+ break;
+ case DUK_TAG_NULL:
+ duk_debug_write_byte(thr, DUK_DBG_IB_NULL);
+ break;
+ case DUK_TAG_BOOLEAN:
+ DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 ||
+ DUK_TVAL_GET_BOOLEAN(tv) == 1);
+ duk_debug_write_boolean(thr, DUK_TVAL_GET_BOOLEAN(tv));
+ break;
+ case DUK_TAG_POINTER:
+ duk_debug_write_pointer(thr, (void *) DUK_TVAL_GET_POINTER(tv));
+ break;
+ case DUK_TAG_LIGHTFUNC:
+ DUK_TVAL_GET_LIGHTFUNC(tv, lf_func, lf_flags);
+ buf[0] = DUK_DBG_IB_LIGHTFUNC;
+ buf[1] = (duk_uint8_t) (lf_flags >> 8);
+ buf[2] = (duk_uint8_t) (lf_flags & 0xff);
+ buf[3] = sizeof(lf_func);
+ duk_debug_write_bytes(thr, buf, 4);
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) &lf_func, sizeof(lf_func));
+ break;
+ case DUK_TAG_STRING:
+ duk_debug_write_hstring(thr, DUK_TVAL_GET_STRING(tv));
+ break;
+ case DUK_TAG_OBJECT:
+ duk_debug_write_hobject(thr, DUK_TVAL_GET_OBJECT(tv));
+ break;
+ case DUK_TAG_BUFFER:
+ duk_debug_write_hbuffer(thr, DUK_TVAL_GET_BUFFER(tv));
+ break;
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default:
+ /* Numbers are normalized to big (network) endian. We can
+ * (but are not required) to use integer dvalues when there's
+ * no loss of precision.
+ *
+ * XXX: share check with other code; this check is slow but
+ * reliable and doesn't require careful exponent/mantissa
+ * mask tricks as in the fastint downgrade code.
+ */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ du1.d = DUK_TVAL_GET_NUMBER(tv);
+ i32 = (duk_int32_t) du1.d;
+ du2.d = (duk_double_t) i32;
+
+ DUK_DD(DUK_DDPRINT("i32=%ld du1=%02x%02x%02x%02x%02x%02x%02x%02x "
+ "du2=%02x%02x%02x%02x%02x%02x%02x%02x",
+ (long) i32,
+ (unsigned int) du1.uc[0], (unsigned int) du1.uc[1],
+ (unsigned int) du1.uc[2], (unsigned int) du1.uc[3],
+ (unsigned int) du1.uc[4], (unsigned int) du1.uc[5],
+ (unsigned int) du1.uc[6], (unsigned int) du1.uc[7],
+ (unsigned int) du2.uc[0], (unsigned int) du2.uc[1],
+ (unsigned int) du2.uc[2], (unsigned int) du2.uc[3],
+ (unsigned int) du2.uc[4], (unsigned int) du2.uc[5],
+ (unsigned int) du2.uc[6], (unsigned int) du2.uc[7]));
+
+ if (DUK_MEMCMP((const void *) du1.uc, (const void *) du2.uc, sizeof(du1.uc)) == 0) {
+ duk_debug_write_int(thr, i32);
+ } else {
+ DUK_DBLUNION_DOUBLE_HTON(&du1);
+ duk_debug_write_byte(thr, DUK_DBG_IB_NUMBER);
+ duk_debug_write_bytes(thr, (const duk_uint8_t *) du1.uc, sizeof(du1.uc));
+ }
+ }
+}
+
+#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
+/* Variant for writing duk_tvals so that any heap allocated values are
+ * written out as tagged heap pointers.
+ */
+DUK_LOCAL void duk__debug_write_tval_heapptr(duk_hthread *thr, duk_tval *tv) {
+ if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {
+ duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);
+ duk_debug_write_heapptr(thr, h);
+ } else {
+ duk_debug_write_tval(thr, tv);
+ }
+}
+#endif /* DUK_USE_DEBUGGER_DUMPHEAP */
+
+/*
+ * Debug connection message write helpers
+ */
+
+#if 0 /* unused */
+DUK_INTERNAL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_REQUEST);
+ duk_debug_write_int(thr, command);
+}
+#endif
+
+DUK_INTERNAL void duk_debug_write_reply(duk_hthread *thr) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_REPLY);
+}
+
+DUK_INTERNAL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg) {
+ /* Allow NULL 'msg' */
+ duk_debug_write_byte(thr, DUK_DBG_IB_ERROR);
+ duk_debug_write_int(thr, (duk_int32_t) err_code);
+ duk_debug_write_cstring(thr, msg);
+ duk_debug_write_eom(thr);
+}
+
+DUK_INTERNAL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_NOTIFY);
+ duk_debug_write_int(thr, (duk_int32_t) command);
+}
+
+DUK_INTERNAL void duk_debug_write_eom(duk_hthread *thr) {
+ duk_debug_write_byte(thr, DUK_DBG_IB_EOM);
+
+ /* As an initial implementation, write flush after every EOM (and the
+ * version identifier). A better implementation would flush only when
+ * Duktape is finished processing messages so that a flush only happens
+ * after all outbound messages are finished on that occasion.
+ */
+ duk_debug_write_flush(thr);
+}
+
+/*
+ * Status message and helpers
+ */
+
+DUK_INTERNAL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr) {
+ duk_activation *act;
+ duk_uint_fast32_t line;
+ duk_uint_fast32_t pc;
+
+ act = thr->callstack_curr;
+ if (act == NULL) {
+ return 0;
+ }
+
+ /* We're conceptually between two opcodes; act->pc indicates the next
+ * instruction to be executed. This is usually the correct pc/line to
+ * indicate in Status. (For the 'debugger' statement this now reports
+ * the pc/line after the debugger statement because the debugger opcode
+ * has already been executed.)
+ */
+
+ pc = duk_hthread_get_act_curr_pc(thr, act);
+
+ /* XXX: this should be optimized to be a raw query and avoid valstack
+ * operations if possible.
+ */
+ duk_push_tval(thr, &act->tv_func);
+ line = duk_hobject_pc2line_query(thr, -1, pc);
+ duk_pop(thr);
+ return line;
+}
+
+DUK_INTERNAL void duk_debug_send_status(duk_hthread *thr) {
+ duk_activation *act;
+
+ duk_debug_write_notify(thr, DUK_DBG_CMD_STATUS);
+ duk_debug_write_int(thr, (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) ? 1 : 0));
+
+ act = thr->callstack_curr;
+ if (act == NULL) {
+ duk_debug_write_undefined(thr);
+ duk_debug_write_undefined(thr);
+ duk_debug_write_int(thr, 0);
+ duk_debug_write_int(thr, 0);
+ } else {
+ duk_push_tval(thr, &act->tv_func);
+ duk_get_prop_string(thr, -1, "fileName");
+ duk__debug_write_hstring_safe_top(thr);
+ duk_get_prop_string(thr, -2, "name");
+ duk__debug_write_hstring_safe_top(thr);
+ duk_pop_3(thr);
+ /* Report next pc/line to be executed. */
+ duk_debug_write_uint(thr, (duk_uint32_t) duk_debug_curr_line(thr));
+ duk_debug_write_uint(thr, (duk_uint32_t) duk_hthread_get_act_curr_pc(thr, act));
+ }
+
+ duk_debug_write_eom(thr);
+}
+
+#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)
+DUK_INTERNAL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal) {
+ /*
+ * NFY <int: 5> <int: fatal> <str: msg> <str: filename> <int: linenumber> EOM
+ */
+
+ duk_activation *act;
+ duk_uint32_t pc;
+
+ DUK_ASSERT(thr->valstack_top > thr->valstack); /* At least: ... [err] */
+
+ duk_debug_write_notify(thr, DUK_DBG_CMD_THROW);
+ duk_debug_write_int(thr, (duk_int32_t) fatal);
+
+ /* Report thrown value to client coerced to string */
+ duk_dup_top(thr);
+ duk__debug_write_hstring_safe_top(thr);
+ duk_pop(thr);
+
+ if (duk_is_error(thr, -1)) {
+ /* Error instance, use augmented error data directly */
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME);
+ duk__debug_write_hstring_safe_top(thr);
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER);
+ duk_debug_write_uint(thr, duk_get_uint(thr, -1));
+ duk_pop_2(thr);
+ } else {
+ /* For anything other than an Error instance, we calculate the
+ * error location directly from the current activation if one
+ * exists.
+ */
+ act = thr->callstack_curr;
+ if (act != NULL) {
+ duk_push_tval(thr, &act->tv_func);
+ duk_get_prop_string(thr, -1, "fileName");
+ duk__debug_write_hstring_safe_top(thr);
+ pc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr, act);
+ duk_debug_write_uint(thr, (duk_uint32_t) duk_hobject_pc2line_query(thr, -2, pc));
+ duk_pop_2(thr);
+ } else {
+ /* Can happen if duk_throw() is called on an empty
+ * callstack.
+ */
+ duk_debug_write_cstring(thr, "");
+ duk_debug_write_uint(thr, 0);
+ }
+ }
+
+ duk_debug_write_eom(thr);
+}
+#endif /* DUK_USE_DEBUGGER_THROW_NOTIFY */
+
+/*
+ * Debug message processing
+ */
+
+/* Skip dvalue. */
+DUK_LOCAL duk_bool_t duk__debug_skip_dvalue(duk_hthread *thr) {
+ duk_uint8_t x;
+ duk_uint32_t len;
+
+ x = duk_debug_read_byte(thr);
+
+ if (x >= 0xc0) {
+ duk_debug_skip_byte(thr);
+ return 0;
+ }
+ if (x >= 0x80) {
+ return 0;
+ }
+ if (x >= 0x60) {
+ duk_debug_skip_bytes(thr, (duk_size_t) (x - 0x60));
+ return 0;
+ }
+ switch(x) {
+ case DUK_DBG_IB_EOM:
+ return 1; /* Return 1: got EOM */
+ case DUK_DBG_IB_REQUEST:
+ case DUK_DBG_IB_REPLY:
+ case DUK_DBG_IB_ERROR:
+ case DUK_DBG_IB_NOTIFY:
+ break;
+ case DUK_DBG_IB_INT4:
+ (void) duk__debug_read_uint32_raw(thr);
+ break;
+ case DUK_DBG_IB_STR4:
+ case DUK_DBG_IB_BUF4:
+ len = duk__debug_read_uint32_raw(thr);
+ duk_debug_skip_bytes(thr, len);
+ break;
+ case DUK_DBG_IB_STR2:
+ case DUK_DBG_IB_BUF2:
+ len = duk__debug_read_uint16_raw(thr);
+ duk_debug_skip_bytes(thr, len);
+ break;
+ case DUK_DBG_IB_UNUSED:
+ case DUK_DBG_IB_UNDEFINED:
+ case DUK_DBG_IB_NULL:
+ case DUK_DBG_IB_TRUE:
+ case DUK_DBG_IB_FALSE:
+ break;
+ case DUK_DBG_IB_NUMBER:
+ duk_debug_skip_bytes(thr, 8);
+ break;
+ case DUK_DBG_IB_OBJECT:
+ duk_debug_skip_byte(thr);
+ len = duk_debug_read_byte(thr);
+ duk_debug_skip_bytes(thr, len);
+ break;
+ case DUK_DBG_IB_POINTER:
+ case DUK_DBG_IB_HEAPPTR:
+ len = duk_debug_read_byte(thr);
+ duk_debug_skip_bytes(thr, len);
+ break;
+ case DUK_DBG_IB_LIGHTFUNC:
+ duk_debug_skip_bytes(thr, 2);
+ len = duk_debug_read_byte(thr);
+ duk_debug_skip_bytes(thr, len);
+ break;
+ default:
+ goto fail;
+ }
+
+ return 0;
+
+ fail:
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return 1; /* Pretend like we got EOM */
+}
+
+/* Skip dvalues to EOM. */
+DUK_LOCAL void duk__debug_skip_to_eom(duk_hthread *thr) {
+ for (;;) {
+ if (duk__debug_skip_dvalue(thr)) {
+ break;
+ }
+ }
+}
+
+/* Read and validate a call stack index. If index is invalid, write out an
+ * error message and return zero.
+ */
+DUK_LOCAL duk_int32_t duk__debug_read_validate_csindex(duk_hthread *thr) {
+ duk_int32_t level;
+ level = duk_debug_read_int(thr);
+ if (level >= 0 || -level > (duk_int32_t) thr->callstack_top) {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index");
+ return 0; /* zero indicates failure */
+ }
+ return level;
+}
+
+/* Read a call stack index and lookup the corresponding duk_activation.
+ * If index is invalid, write out an error message and return NULL.
+ */
+DUK_LOCAL duk_activation *duk__debug_read_level_get_activation(duk_hthread *thr) {
+ duk_activation *act;
+ duk_int32_t level;
+
+ level = duk_debug_read_int(thr);
+ act = duk_hthread_get_activation_for_level(thr, level);
+ if (act == NULL) {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index");
+ }
+ return act;
+}
+
+/*
+ * Simple commands
+ */
+
+DUK_LOCAL void duk__debug_handle_basic_info(duk_hthread *thr, duk_heap *heap) {
+ DUK_UNREF(heap);
+ DUK_D(DUK_DPRINT("debug command Version"));
+
+ duk_debug_write_reply(thr);
+ duk_debug_write_int(thr, DUK_VERSION);
+ duk_debug_write_cstring(thr, DUK_GIT_DESCRIBE);
+ duk_debug_write_cstring(thr, DUK_USE_TARGET_INFO);
+#if defined(DUK_USE_DOUBLE_LE)
+ duk_debug_write_int(thr, 1);
+#elif defined(DUK_USE_DOUBLE_ME)
+ duk_debug_write_int(thr, 2);
+#elif defined(DUK_USE_DOUBLE_BE)
+ duk_debug_write_int(thr, 3);
+#else
+ duk_debug_write_int(thr, 0);
+#endif
+ duk_debug_write_int(thr, (duk_int_t) sizeof(void *));
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_trigger_status(duk_hthread *thr, duk_heap *heap) {
+ DUK_UNREF(heap);
+ DUK_D(DUK_DPRINT("debug command TriggerStatus"));
+
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+ heap->dbg_state_dirty = 1;
+}
+
+DUK_LOCAL void duk__debug_handle_pause(duk_hthread *thr, duk_heap *heap) {
+ DUK_D(DUK_DPRINT("debug command Pause"));
+ duk_debug_set_paused(heap);
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_resume(duk_hthread *thr, duk_heap *heap) {
+ duk_small_uint_t pause_flags;
+
+ DUK_D(DUK_DPRINT("debug command Resume"));
+
+ duk_debug_clear_paused(heap);
+
+ pause_flags = 0;
+#if 0 /* manual testing */
+ pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE;
+ pause_flags |= DUK_PAUSE_FLAG_CAUGHT_ERROR;
+ pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR;
+#endif
+#if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT)
+ pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR;
+#endif
+
+ duk__debug_set_pause_state(thr, heap, pause_flags);
+
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_step(duk_hthread *thr, duk_heap *heap, duk_int32_t cmd) {
+ duk_small_uint_t pause_flags;
+
+ DUK_D(DUK_DPRINT("debug command StepInto/StepOver/StepOut: %d", (int) cmd));
+
+ if (cmd == DUK_DBG_CMD_STEPINTO) {
+ pause_flags = DUK_PAUSE_FLAG_LINE_CHANGE |
+ DUK_PAUSE_FLAG_FUNC_ENTRY |
+ DUK_PAUSE_FLAG_FUNC_EXIT;
+ } else if (cmd == DUK_DBG_CMD_STEPOVER) {
+ pause_flags = DUK_PAUSE_FLAG_LINE_CHANGE |
+ DUK_PAUSE_FLAG_FUNC_EXIT;
+ } else {
+ DUK_ASSERT(cmd == DUK_DBG_CMD_STEPOUT);
+ pause_flags = DUK_PAUSE_FLAG_FUNC_EXIT;
+ }
+#if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT)
+ pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR;
+#endif
+
+ /* If current activation doesn't have line information, line-based
+ * pause flags are automatically disabled. As a result, e.g.
+ * StepInto will then pause on (native) function entry or exit.
+ */
+ duk_debug_clear_paused(heap);
+ duk__debug_set_pause_state(thr, heap, pause_flags);
+
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_list_break(duk_hthread *thr, duk_heap *heap) {
+ duk_small_int_t i;
+
+ DUK_D(DUK_DPRINT("debug command ListBreak"));
+ duk_debug_write_reply(thr);
+ for (i = 0; i < (duk_small_int_t) heap->dbg_breakpoint_count; i++) {
+ duk_debug_write_hstring(thr, heap->dbg_breakpoints[i].filename);
+ duk_debug_write_uint(thr, (duk_uint32_t) heap->dbg_breakpoints[i].line);
+ }
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_add_break(duk_hthread *thr, duk_heap *heap) {
+ duk_hstring *filename;
+ duk_uint32_t linenumber;
+ duk_small_int_t idx;
+
+ DUK_UNREF(heap);
+
+ filename = duk_debug_read_hstring(thr);
+ linenumber = (duk_uint32_t) duk_debug_read_int(thr);
+ DUK_D(DUK_DPRINT("debug command AddBreak: %!O:%ld", (duk_hobject *) filename, (long) linenumber));
+ idx = duk_debug_add_breakpoint(thr, filename, linenumber);
+ if (idx >= 0) {
+ duk_debug_write_reply(thr);
+ duk_debug_write_int(thr, (duk_int32_t) idx);
+ duk_debug_write_eom(thr);
+ } else {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_TOOMANY, "no space for breakpoint");
+ }
+}
+
+DUK_LOCAL void duk__debug_handle_del_break(duk_hthread *thr, duk_heap *heap) {
+ duk_small_uint_t idx;
+
+ DUK_UNREF(heap);
+
+ DUK_D(DUK_DPRINT("debug command DelBreak"));
+ idx = (duk_small_uint_t) duk_debug_read_int(thr);
+ if (duk_debug_remove_breakpoint(thr, idx)) {
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+ } else {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid breakpoint index");
+ }
+}
+
+DUK_LOCAL void duk__debug_handle_get_var(duk_hthread *thr, duk_heap *heap) {
+ duk_activation *act;
+ duk_hstring *str;
+ duk_bool_t rc;
+
+ DUK_UNREF(heap);
+ DUK_D(DUK_DPRINT("debug command GetVar"));
+
+ act = duk__debug_read_level_get_activation(thr);
+ if (act == NULL) {
+ return;
+ }
+ str = duk_debug_read_hstring(thr); /* push to stack */
+ DUK_ASSERT(str != NULL);
+
+ rc = duk_js_getvar_activation(thr, act, str, 0);
+
+ duk_debug_write_reply(thr);
+ if (rc) {
+ duk_debug_write_int(thr, 1);
+ DUK_ASSERT(duk_get_tval(thr, -2) != NULL);
+ duk_debug_write_tval(thr, duk_get_tval(thr, -2));
+ } else {
+ duk_debug_write_int(thr, 0);
+ duk_debug_write_unused(thr);
+ }
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_put_var(duk_hthread *thr, duk_heap *heap) {
+ duk_activation *act;
+ duk_hstring *str;
+ duk_tval *tv;
+
+ DUK_UNREF(heap);
+ DUK_D(DUK_DPRINT("debug command PutVar"));
+
+ act = duk__debug_read_level_get_activation(thr);
+ if (act == NULL) {
+ return;
+ }
+ str = duk_debug_read_hstring(thr); /* push to stack */
+ DUK_ASSERT(str != NULL);
+ tv = duk_debug_read_tval(thr);
+ if (tv == NULL) {
+ /* detached */
+ return;
+ }
+
+ duk_js_putvar_activation(thr, act, str, tv, 0);
+
+ /* XXX: Current putvar implementation doesn't have a success flag,
+ * add one and send to debug client?
+ */
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_get_call_stack(duk_hthread *thr, duk_heap *heap) {
+ duk_hthread *curr_thr = thr;
+ duk_activation *curr_act;
+ duk_uint_fast32_t pc;
+ duk_uint_fast32_t line;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_UNREF(heap);
+
+ duk_debug_write_reply(thr);
+ while (curr_thr != NULL) {
+ for (curr_act = curr_thr->callstack_curr; curr_act != NULL; curr_act = curr_act->parent) {
+ /* PC/line semantics here are:
+ * - For callstack top we're conceptually between two
+ * opcodes and current PC indicates next line to
+ * execute, so report that (matches Status).
+ * - For other activations we're conceptually still
+ * executing the instruction at PC-1, so report that
+ * (matches error stacktrace behavior).
+ * - See: https://github.com/svaarala/duktape/issues/281
+ */
+
+ /* XXX: optimize to use direct reads, i.e. avoid
+ * value stack operations.
+ */
+ duk_push_tval(thr, &curr_act->tv_func);
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME);
+ duk__debug_write_hstring_safe_top(thr);
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME);
+ duk__debug_write_hstring_safe_top(thr);
+ pc = duk_hthread_get_act_curr_pc(thr, curr_act);
+ if (curr_act != curr_thr->callstack_curr && pc > 0) {
+ pc--;
+ }
+ line = duk_hobject_pc2line_query(thr, -3, pc);
+ duk_debug_write_uint(thr, (duk_uint32_t) line);
+ duk_debug_write_uint(thr, (duk_uint32_t) pc);
+ duk_pop_3(thr);
+ }
+ curr_thr = curr_thr->resumer;
+ }
+ /* SCANBUILD: warning about 'thr' potentially being NULL here,
+ * warning is incorrect because thr != NULL always here.
+ */
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_get_locals(duk_hthread *thr, duk_heap *heap) {
+ duk_activation *act;
+ duk_hstring *varname;
+
+ DUK_UNREF(heap);
+
+ act = duk__debug_read_level_get_activation(thr);
+ if (act == NULL) {
+ return;
+ }
+
+ duk_debug_write_reply(thr);
+
+ /* XXX: several nice-to-have improvements here:
+ * - Use direct reads avoiding value stack operations
+ * - Avoid triggering getters, indicate getter values to debug client
+ * - If side effects are possible, add error catching
+ */
+
+ duk_push_tval(thr, &act->tv_func);
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VARMAP);
+ if (duk_is_object(thr, -1)) {
+ duk_enum(thr, -1, 0 /*enum_flags*/);
+ while (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) {
+ varname = duk_known_hstring(thr, -1);
+
+ duk_js_getvar_activation(thr, act, varname, 0 /*throw_flag*/);
+ /* [ ... func varmap enum key value this ] */
+ duk_debug_write_hstring(thr, duk_get_hstring(thr, -3));
+ duk_debug_write_tval(thr, duk_get_tval(thr, -2));
+ duk_pop_3(thr); /* -> [ ... func varmap enum ] */
+ }
+ } else {
+ DUK_D(DUK_DPRINT("varmap is not an object in GetLocals, ignore"));
+ }
+
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_eval(duk_hthread *thr, duk_heap *heap) {
+ duk_small_uint_t call_flags;
+ duk_int_t call_ret;
+ duk_small_int_t eval_err;
+ duk_bool_t direct_eval;
+ duk_int32_t level;
+ duk_idx_t idx_func;
+
+ DUK_UNREF(heap);
+
+ DUK_D(DUK_DPRINT("debug command Eval"));
+
+ /* The eval code is executed within the lexical environment of a specified
+ * activation. For now, use global object eval() function, with the eval
+ * considered a 'direct call to eval'.
+ *
+ * Callstack index for debug commands only affects scope -- the callstack
+ * as seen by, e.g. Duktape.act() will be the same regardless.
+ */
+
+ /* nargs == 2 so we can pass a callstack index to eval(). */
+ idx_func = duk_get_top(thr);
+ duk_push_c_function(thr, duk_bi_global_object_eval, 2 /*nargs*/);
+ duk_push_undefined(thr); /* 'this' binding shouldn't matter here */
+
+ /* Read callstack index, if non-null. */
+ if (duk_debug_peek_byte(thr) == DUK_DBG_IB_NULL) {
+ direct_eval = 0;
+ level = -1; /* Not needed, but silences warning. */
+ (void) duk_debug_read_byte(thr);
+ } else {
+ direct_eval = 1;
+ level = duk__debug_read_validate_csindex(thr);
+ if (level == 0) {
+ return;
+ }
+ }
+
+ DUK_ASSERT(!direct_eval ||
+ (level < 0 && -level <= (duk_int32_t) thr->callstack_top));
+
+ (void) duk_debug_read_hstring(thr);
+ if (direct_eval) {
+ duk_push_int(thr, level - 1); /* compensate for eval() call */
+ }
+
+ /* [ ... eval "eval" eval_input level? ] */
+
+ call_flags = 0;
+ if (direct_eval) {
+ duk_activation *act;
+ duk_hobject *fun;
+
+ act = duk_hthread_get_activation_for_level(thr, level);
+ if (act != NULL) {
+ fun = DUK_ACT_GET_FUNC(act);
+ if (fun != NULL && DUK_HOBJECT_IS_COMPFUNC(fun)) {
+ /* Direct eval requires that there's a current
+ * activation and it is an Ecmascript function.
+ * When Eval is executed from e.g. cooperate API
+ * call we'll need to do an indirect eval instead.
+ */
+ call_flags |= DUK_CALL_FLAG_DIRECT_EVAL;
+ }
+ }
+ }
+
+ call_ret = duk_pcall_method_flags(thr, duk_get_top(thr) - (idx_func + 2), call_flags);
+
+ if (call_ret == DUK_EXEC_SUCCESS) {
+ eval_err = 0;
+ /* Use result value as is. */
+ } else {
+ /* For errors a string coerced result is most informative
+ * right now, as the debug client doesn't have the capability
+ * to traverse the error object.
+ */
+ eval_err = 1;
+ duk_safe_to_string(thr, -1);
+ }
+
+ /* [ ... result ] */
+
+ duk_debug_write_reply(thr);
+ duk_debug_write_int(thr, (duk_int32_t) eval_err);
+ DUK_ASSERT(duk_get_tval(thr, -1) != NULL);
+ duk_debug_write_tval(thr, duk_get_tval(thr, -1));
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_detach(duk_hthread *thr, duk_heap *heap) {
+ DUK_UNREF(heap);
+ DUK_D(DUK_DPRINT("debug command Detach"));
+
+ duk_debug_write_reply(thr);
+ duk_debug_write_eom(thr);
+
+ DUK_D(DUK_DPRINT("debug connection detached, mark broken"));
+ DUK__SET_CONN_BROKEN(thr, 0); /* not an error */
+}
+
+DUK_LOCAL void duk__debug_handle_apprequest(duk_hthread *thr, duk_heap *heap) {
+ duk_idx_t old_top;
+
+ DUK_D(DUK_DPRINT("debug command AppRequest"));
+
+ old_top = duk_get_top(thr); /* save stack top */
+
+ if (heap->dbg_request_cb != NULL) {
+ duk_idx_t nrets;
+ duk_idx_t nvalues = 0;
+ duk_idx_t top, idx;
+
+ /* Read tvals from the message and push them onto the valstack,
+ * then call the request callback to process the request.
+ */
+ while (duk_debug_peek_byte(thr) != DUK_DBG_IB_EOM) {
+ duk_tval *tv;
+ if (!duk_check_stack(thr, 1)) {
+ DUK_D(DUK_DPRINT("failed to allocate space for request dvalue(s)"));
+ goto fail;
+ }
+ tv = duk_debug_read_tval(thr); /* push to stack */
+ if (tv == NULL) {
+ /* detached */
+ return;
+ }
+ nvalues++;
+ }
+ DUK_ASSERT(duk_get_top(thr) == old_top + nvalues);
+
+ /* Request callback should push values for reply to client onto valstack */
+ DUK_D(DUK_DPRINT("calling into AppRequest request_cb with nvalues=%ld, old_top=%ld, top=%ld",
+ (long) nvalues, (long) old_top, (long) duk_get_top(thr)));
+ nrets = heap->dbg_request_cb(thr, heap->dbg_udata, nvalues);
+ DUK_D(DUK_DPRINT("returned from AppRequest request_cb; nvalues=%ld -> nrets=%ld, old_top=%ld, top=%ld",
+ (long) nvalues, (long) nrets, (long) old_top, (long) duk_get_top(thr)));
+ if (nrets >= 0) {
+ DUK_ASSERT(duk_get_top(thr) >= old_top + nrets);
+ if (duk_get_top(thr) < old_top + nrets) {
+ DUK_D(DUK_DPRINT("AppRequest callback doesn't match value stack configuration, "
+ "top=%ld < old_top=%ld + nrets=%ld; "
+ "this might mean it's unsafe to continue!",
+ (long) duk_get_top(thr), (long) old_top, (long) nrets));
+ goto fail;
+ }
+
+ /* Reply with tvals pushed by request callback */
+ duk_debug_write_byte(thr, DUK_DBG_IB_REPLY);
+ top = duk_get_top(thr);
+ for (idx = top - nrets; idx < top; idx++) {
+ duk_debug_write_tval(thr, DUK_GET_TVAL_POSIDX(thr, idx));
+ }
+ duk_debug_write_eom(thr);
+ } else {
+ DUK_ASSERT(duk_get_top(thr) >= old_top + 1);
+ if (duk_get_top(thr) < old_top + 1) {
+ DUK_D(DUK_DPRINT("request callback return value doesn't match value stack configuration"));
+ goto fail;
+ }
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_APPLICATION, duk_get_string(thr, -1));
+ }
+
+ duk_set_top(thr, old_top); /* restore stack top */
+ } else {
+ DUK_D(DUK_DPRINT("no request callback, treat AppRequest as unsupported"));
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, "AppRequest unsupported by target");
+ }
+
+ return;
+
+ fail:
+ duk_set_top(thr, old_top); /* restore stack top */
+ DUK__SET_CONN_BROKEN(thr, 1);
+}
+
+/*
+ * DumpHeap command
+ */
+
+#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
+/* XXX: this has some overlap with object inspection; remove this and make
+ * DumpHeap return lists of heapptrs instead?
+ */
+DUK_LOCAL void duk__debug_dump_heaphdr(duk_hthread *thr, duk_heap *heap, duk_heaphdr *hdr) {
+ DUK_UNREF(heap);
+
+ duk_debug_write_heapptr(thr, hdr);
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_TYPE(hdr));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_FLAGS_RAW(hdr));
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_REFCOUNT(hdr));
+#else
+ duk_debug_write_int(thr, (duk_int32_t) -1);
+#endif
+
+ switch (DUK_HEAPHDR_GET_TYPE(hdr)) {
+ case DUK_HTYPE_STRING: {
+ duk_hstring *h = (duk_hstring *) hdr;
+
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_BYTELEN(h));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_CHARLEN(h));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_HASH(h));
+ duk_debug_write_hstring(thr, h);
+ break;
+ }
+ case DUK_HTYPE_OBJECT: {
+ duk_hobject *h = (duk_hobject *) hdr;
+ duk_hstring *k;
+ duk_uint_fast32_t i;
+
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_CLASS_NUMBER(h));
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ESIZE(h));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ENEXT(h));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ASIZE(h));
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_HSIZE(h));
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) {
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_E_GET_FLAGS(heap, h, i));
+ k = DUK_HOBJECT_E_GET_KEY(heap, h, i);
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) k);
+ if (k == NULL) {
+ duk_debug_write_int(thr, 0); /* isAccessor */
+ duk_debug_write_unused(thr);
+ continue;
+ }
+ if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) {
+ duk_debug_write_int(thr, 1); /* isAccessor */
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get);
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set);
+ } else {
+ duk_debug_write_int(thr, 0); /* isAccessor */
+
+ duk__debug_write_tval_heapptr(thr, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v);
+ }
+ }
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) {
+ /* Note: array dump will include elements beyond
+ * 'length'.
+ */
+ duk__debug_write_tval_heapptr(thr, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i));
+ }
+ break;
+ }
+ case DUK_HTYPE_BUFFER: {
+ duk_hbuffer *h = (duk_hbuffer *) hdr;
+
+ duk_debug_write_uint(thr, (duk_uint32_t) DUK_HBUFFER_GET_SIZE(h));
+ duk_debug_write_buffer(thr, (const char *) DUK_HBUFFER_GET_DATA_PTR(heap, h), (duk_size_t) DUK_HBUFFER_GET_SIZE(h));
+ break;
+ }
+ default: {
+ DUK_D(DUK_DPRINT("invalid htype: %d", (int) DUK_HEAPHDR_GET_TYPE(hdr)));
+ }
+ }
+}
+
+DUK_LOCAL void duk__debug_dump_heap_allocated(duk_hthread *thr, duk_heap *heap) {
+ duk_heaphdr *hdr;
+
+ hdr = heap->heap_allocated;
+ while (hdr != NULL) {
+ duk__debug_dump_heaphdr(thr, heap, hdr);
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+}
+
+DUK_LOCAL void duk__debug_dump_strtab(duk_hthread *thr, duk_heap *heap) {
+ duk_uint32_t i;
+ duk_hstring *h;
+
+ for (i = 0; i < heap->st_size; i++) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ h = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]);
+#else
+ h = heap->strtable[i];
+#endif
+ while (h != NULL) {
+ duk__debug_dump_heaphdr(thr, heap, (duk_heaphdr *) h);
+ h = h->hdr.h_next;
+ }
+ }
+}
+
+DUK_LOCAL void duk__debug_handle_dump_heap(duk_hthread *thr, duk_heap *heap) {
+ DUK_D(DUK_DPRINT("debug command DumpHeap"));
+
+ duk_debug_write_reply(thr);
+ duk__debug_dump_heap_allocated(thr, heap);
+ duk__debug_dump_strtab(thr, heap);
+ duk_debug_write_eom(thr);
+}
+#endif /* DUK_USE_DEBUGGER_DUMPHEAP */
+
+DUK_LOCAL void duk__debug_handle_get_bytecode(duk_hthread *thr, duk_heap *heap) {
+ duk_activation *act;
+ duk_hcompfunc *fun = NULL;
+ duk_size_t i, n;
+ duk_tval *tv;
+ duk_hobject **fn;
+ duk_int32_t level = -1;
+ duk_uint8_t ibyte;
+
+ DUK_UNREF(heap);
+
+ DUK_D(DUK_DPRINT("debug command GetBytecode"));
+
+ ibyte = duk_debug_peek_byte(thr);
+ if (ibyte != DUK_DBG_IB_EOM) {
+ tv = duk_debug_read_tval(thr);
+ if (tv == NULL) {
+ /* detached */
+ return;
+ }
+ if (DUK_TVAL_IS_OBJECT(tv)) {
+ /* tentative, checked later */
+ fun = (duk_hcompfunc *) DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(fun != NULL);
+ } else if (DUK_TVAL_IS_NUMBER(tv)) {
+ level = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv);
+ } else {
+ DUK_D(DUK_DPRINT("invalid argument to GetBytecode: %!T", tv));
+ goto fail_args;
+ }
+ }
+
+ if (fun == NULL) {
+ act = duk_hthread_get_activation_for_level(thr, level);
+ if (act == NULL) {
+ goto fail_index;
+ }
+ fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+ }
+
+ if (fun == NULL || !DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)) {
+ DUK_D(DUK_DPRINT("invalid argument to GetBytecode: %!O", fun));
+ goto fail_args;
+ }
+ DUK_ASSERT(fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun));
+
+ duk_debug_write_reply(thr);
+ n = DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap, fun);
+ duk_debug_write_int(thr, (duk_int32_t) n);
+ tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, fun);
+ for (i = 0; i < n; i++) {
+ duk_debug_write_tval(thr, tv);
+ tv++;
+ }
+ n = DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap, fun);
+ duk_debug_write_int(thr, (duk_int32_t) n);
+ fn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, fun);
+ for (i = 0; i < n; i++) {
+ duk_debug_write_hobject(thr, *fn);
+ fn++;
+ }
+ duk_debug_write_string(thr,
+ (const char *) DUK_HCOMPFUNC_GET_CODE_BASE(heap, fun),
+ (duk_size_t) DUK_HCOMPFUNC_GET_CODE_SIZE(heap, fun));
+ duk_debug_write_eom(thr);
+ return;
+
+ fail_args:
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid argument");
+ return;
+
+ fail_index:
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index");
+ return;
+}
+
+/*
+ * Object inspection commands: GetHeapObjInfo, GetObjPropDesc,
+ * GetObjPropDescRange
+ */
+
+#if defined(DUK_USE_DEBUGGER_INSPECT)
+
+#if 0 /* pruned */
+DUK_LOCAL const char * const duk__debug_getinfo_heaphdr_keys[] = {
+ "reachable",
+ "temproot",
+ "finalizable",
+ "finalized",
+ "readonly"
+ /* NULL not needed here */
+};
+DUK_LOCAL duk_uint_t duk__debug_getinfo_heaphdr_masks[] = {
+ DUK_HEAPHDR_FLAG_REACHABLE,
+ DUK_HEAPHDR_FLAG_TEMPROOT,
+ DUK_HEAPHDR_FLAG_FINALIZABLE,
+ DUK_HEAPHDR_FLAG_FINALIZED,
+ DUK_HEAPHDR_FLAG_READONLY,
+ 0 /* terminator */
+};
+#endif
+DUK_LOCAL const char * const duk__debug_getinfo_hstring_keys[] = {
+#if 0
+ "arridx",
+ "symbol",
+ "hidden",
+ "reserved_word",
+ "strict_reserved_word",
+ "eval_or_arguments",
+#endif
+ "extdata"
+ /* NULL not needed here */
+};
+DUK_LOCAL duk_uint_t duk__debug_getinfo_hstring_masks[] = {
+#if 0
+ DUK_HSTRING_FLAG_ARRIDX,
+ DUK_HSTRING_FLAG_SYMBOL,
+ DUK_HSTRING_FLAG_HIDDEN,
+ DUK_HSTRING_FLAG_RESERVED_WORD,
+ DUK_HSTRING_FLAG_STRICT_RESERVED_WORD,
+ DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS,
+#endif
+ DUK_HSTRING_FLAG_EXTDATA,
+ 0 /* terminator */
+};
+DUK_LOCAL const char * const duk__debug_getinfo_hobject_keys[] = {
+ "extensible",
+ "constructable",
+ "callable",
+ "boundfunc",
+ "compfunc",
+ "natfunc",
+ "bufobj",
+ "fastrefs",
+ "array_part",
+ "strict",
+ "notail",
+ "newenv",
+ "namebinding",
+ "createargs",
+ "have_finalizer",
+ "exotic_array",
+ "exotic_stringobj",
+ "exotic_arguments",
+ "exotic_proxyobj",
+ "special_call"
+ /* NULL not needed here */
+};
+DUK_LOCAL duk_uint_t duk__debug_getinfo_hobject_masks[] = {
+ DUK_HOBJECT_FLAG_EXTENSIBLE,
+ DUK_HOBJECT_FLAG_CONSTRUCTABLE,
+ DUK_HOBJECT_FLAG_CALLABLE,
+ DUK_HOBJECT_FLAG_BOUNDFUNC,
+ DUK_HOBJECT_FLAG_COMPFUNC,
+ DUK_HOBJECT_FLAG_NATFUNC,
+ DUK_HOBJECT_FLAG_BUFOBJ,
+ DUK_HOBJECT_FLAG_FASTREFS,
+ DUK_HOBJECT_FLAG_ARRAY_PART,
+ DUK_HOBJECT_FLAG_STRICT,
+ DUK_HOBJECT_FLAG_NOTAIL,
+ DUK_HOBJECT_FLAG_NEWENV,
+ DUK_HOBJECT_FLAG_NAMEBINDING,
+ DUK_HOBJECT_FLAG_CREATEARGS,
+ DUK_HOBJECT_FLAG_HAVE_FINALIZER,
+ DUK_HOBJECT_FLAG_EXOTIC_ARRAY,
+ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ,
+ DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS,
+ DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ,
+ DUK_HOBJECT_FLAG_SPECIAL_CALL,
+ 0 /* terminator */
+};
+DUK_LOCAL const char * const duk__debug_getinfo_hbuffer_keys[] = {
+ "dynamic",
+ "external"
+ /* NULL not needed here */
+};
+DUK_LOCAL duk_uint_t duk__debug_getinfo_hbuffer_masks[] = {
+ DUK_HBUFFER_FLAG_DYNAMIC,
+ DUK_HBUFFER_FLAG_EXTERNAL,
+ 0 /* terminator */
+};
+
+DUK_LOCAL void duk__debug_getinfo_flags_key(duk_hthread *thr, const char *key) {
+ duk_debug_write_uint(thr, 0);
+ duk_debug_write_cstring(thr, key);
+}
+
+DUK_LOCAL void duk__debug_getinfo_prop_uint(duk_hthread *thr, const char *key, duk_uint_t val) {
+ duk_debug_write_uint(thr, 0);
+ duk_debug_write_cstring(thr, key);
+ duk_debug_write_uint(thr, val);
+}
+
+DUK_LOCAL void duk__debug_getinfo_prop_int(duk_hthread *thr, const char *key, duk_int_t val) {
+ duk_debug_write_uint(thr, 0);
+ duk_debug_write_cstring(thr, key);
+ duk_debug_write_int(thr, val);
+}
+
+DUK_LOCAL void duk__debug_getinfo_prop_bool(duk_hthread *thr, const char *key, duk_bool_t val) {
+ duk_debug_write_uint(thr, 0);
+ duk_debug_write_cstring(thr, key);
+ duk_debug_write_boolean(thr, val);
+}
+
+DUK_LOCAL void duk__debug_getinfo_bitmask(duk_hthread *thr, const char * const * keys, duk_uint_t *masks, duk_uint_t flags) {
+ const char *key;
+ duk_uint_t mask;
+
+ for (;;) {
+ mask = *masks++;
+ if (mask == 0) {
+ break;
+ }
+ key = *keys++;
+ DUK_ASSERT(key != NULL);
+
+ DUK_DD(DUK_DDPRINT("inspect bitmask: key=%s, mask=0x%08lx, flags=0x%08lx", key, (unsigned long) mask, (unsigned long) flags));
+ duk__debug_getinfo_prop_bool(thr, key, flags & mask);
+ }
+}
+
+/* Inspect a property using a virtual index into a conceptual property list
+ * consisting of (1) all array part items from [0,a_size[ (even when above
+ * .length) and (2) all entry part items from [0,e_next[. Unused slots are
+ * indicated using dvalue 'unused'.
+ */
+DUK_LOCAL duk_bool_t duk__debug_getprop_index(duk_hthread *thr, duk_heap *heap, duk_hobject *h_obj, duk_uint_t idx) {
+ duk_uint_t a_size;
+ duk_tval *tv;
+ duk_hstring *h_key;
+ duk_hobject *h_getset;
+ duk_uint_t flags;
+
+ DUK_UNREF(heap);
+
+ a_size = DUK_HOBJECT_GET_ASIZE(h_obj);
+ if (idx < a_size) {
+ duk_debug_write_uint(thr, DUK_PROPDESC_FLAGS_WEC);
+ duk_debug_write_uint(thr, idx);
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, h_obj, idx);
+ duk_debug_write_tval(thr, tv);
+ return 1;
+ }
+
+ idx -= a_size;
+ if (idx >= DUK_HOBJECT_GET_ENEXT(h_obj)) {
+ return 0;
+ }
+
+ h_key = DUK_HOBJECT_E_GET_KEY(heap, h_obj, idx);
+ if (h_key == NULL) {
+ duk_debug_write_uint(thr, 0);
+ duk_debug_write_null(thr);
+ duk_debug_write_unused(thr);
+ return 1;
+ }
+
+ flags = DUK_HOBJECT_E_GET_FLAGS(heap, h_obj, idx);
+ if (DUK_HSTRING_HAS_SYMBOL(h_key)) {
+ flags |= DUK_DBG_PROPFLAG_SYMBOL;
+ }
+ if (DUK_HSTRING_HAS_HIDDEN(h_key)) {
+ flags |= DUK_DBG_PROPFLAG_HIDDEN;
+ }
+ duk_debug_write_uint(thr, flags);
+ duk_debug_write_hstring(thr, h_key);
+ if (flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ h_getset = DUK_HOBJECT_E_GET_VALUE_GETTER(heap, h_obj, idx);
+ if (h_getset) {
+ duk_debug_write_hobject(thr, h_getset);
+ } else {
+ duk_debug_write_null(thr);
+ }
+ h_getset = DUK_HOBJECT_E_GET_VALUE_SETTER(heap, h_obj, idx);
+ if (h_getset) {
+ duk_debug_write_hobject(thr, h_getset);
+ } else {
+ duk_debug_write_null(thr);
+ }
+ } else {
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, h_obj, idx);
+ duk_debug_write_tval(thr, tv);
+ }
+ return 1;
+}
+
+DUK_LOCAL void duk__debug_handle_get_heap_obj_info(duk_hthread *thr, duk_heap *heap) {
+ duk_heaphdr *h;
+
+ DUK_D(DUK_DPRINT("debug command GetHeapObjInfo"));
+ DUK_UNREF(heap);
+
+ DUK_ASSERT(sizeof(duk__debug_getinfo_hstring_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hstring_masks) / sizeof(duk_uint_t) - 1);
+ DUK_ASSERT(sizeof(duk__debug_getinfo_hobject_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hobject_masks) / sizeof(duk_uint_t) - 1);
+ DUK_ASSERT(sizeof(duk__debug_getinfo_hbuffer_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hbuffer_masks) / sizeof(duk_uint_t) - 1);
+
+ h = duk_debug_read_any_ptr(thr);
+ if (!h) {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid target");
+ return;
+ }
+
+ duk_debug_write_reply(thr);
+
+ /* As with all inspection code, we rely on the debug client providing
+ * a valid, non-stale pointer: there's no portable way to safely
+ * validate the pointer here.
+ */
+
+ duk__debug_getinfo_flags_key(thr, "heapptr");
+ duk_debug_write_heapptr(thr, h);
+
+ /* XXX: comes out as signed now */
+ duk__debug_getinfo_prop_uint(thr, "heaphdr_flags", (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h));
+ duk__debug_getinfo_prop_uint(thr, "heaphdr_type", (duk_uint_t) DUK_HEAPHDR_GET_TYPE(h));
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk__debug_getinfo_prop_uint(thr, "refcount", (duk_uint_t) DUK_HEAPHDR_GET_REFCOUNT(h));
+#endif
+#if 0 /* pruned */
+ duk__debug_getinfo_bitmask(thr,
+ duk__debug_getinfo_heaphdr_keys,
+ duk__debug_getinfo_heaphdr_masks,
+ DUK_HEAPHDR_GET_FLAGS_RAW(h));
+#endif
+
+ switch (DUK_HEAPHDR_GET_TYPE(h)) {
+ case DUK_HTYPE_STRING: {
+ duk_hstring *h_str;
+
+ h_str = (duk_hstring *) h;
+ duk__debug_getinfo_bitmask(thr,
+ duk__debug_getinfo_hstring_keys,
+ duk__debug_getinfo_hstring_masks,
+ DUK_HEAPHDR_GET_FLAGS_RAW(h));
+ duk__debug_getinfo_prop_uint(thr, "bytelen", (duk_uint_t) DUK_HSTRING_GET_BYTELEN(h_str));
+ duk__debug_getinfo_prop_uint(thr, "charlen", (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_str));
+ duk__debug_getinfo_prop_uint(thr, "hash", (duk_uint_t) DUK_HSTRING_GET_HASH(h_str));
+ duk__debug_getinfo_flags_key(thr, "data");
+ duk_debug_write_hstring(thr, h_str);
+ break;
+ }
+ case DUK_HTYPE_OBJECT: {
+ duk_hobject *h_obj;
+ duk_hobject *h_proto;
+
+ h_obj = (duk_hobject *) h;
+ h_proto = DUK_HOBJECT_GET_PROTOTYPE(heap, h_obj);
+
+ /* duk_hobject specific fields. */
+ duk__debug_getinfo_bitmask(thr,
+ duk__debug_getinfo_hobject_keys,
+ duk__debug_getinfo_hobject_masks,
+ DUK_HEAPHDR_GET_FLAGS_RAW(h));
+ duk__debug_getinfo_prop_uint(thr, "class_number", DUK_HOBJECT_GET_CLASS_NUMBER(h_obj));
+ duk__debug_getinfo_flags_key(thr, "class_name");
+ duk_debug_write_hstring(thr, DUK_HOBJECT_GET_CLASS_STRING(heap, h_obj));
+ duk__debug_getinfo_flags_key(thr, "prototype");
+ if (h_proto != NULL) {
+ duk_debug_write_hobject(thr, h_proto);
+ } else {
+ duk_debug_write_null(thr);
+ }
+ duk__debug_getinfo_flags_key(thr, "props");
+ duk_debug_write_pointer(thr, (void *) DUK_HOBJECT_GET_PROPS(heap, h_obj));
+ duk__debug_getinfo_prop_uint(thr, "e_size", (duk_uint_t) DUK_HOBJECT_GET_ESIZE(h_obj));
+ duk__debug_getinfo_prop_uint(thr, "e_next", (duk_uint_t) DUK_HOBJECT_GET_ENEXT(h_obj));
+ duk__debug_getinfo_prop_uint(thr, "a_size", (duk_uint_t) DUK_HOBJECT_GET_ASIZE(h_obj));
+ duk__debug_getinfo_prop_uint(thr, "h_size", (duk_uint_t) DUK_HOBJECT_GET_HSIZE(h_obj));
+
+ if (DUK_HOBJECT_IS_ARRAY(h_obj)) {
+ duk_harray *h_arr;
+ h_arr = (duk_harray *) h_obj;
+
+ duk__debug_getinfo_prop_uint(thr, "length", (duk_uint_t) h_arr->length);
+ duk__debug_getinfo_prop_bool(thr, "length_nonwritable", h_arr->length_nonwritable);
+ }
+
+ if (DUK_HOBJECT_IS_NATFUNC(h_obj)) {
+ duk_hnatfunc *h_fun;
+ h_fun = (duk_hnatfunc *) h_obj;
+
+ duk__debug_getinfo_prop_int(thr, "nargs", h_fun->nargs);
+ duk__debug_getinfo_prop_int(thr, "magic", h_fun->magic);
+ duk__debug_getinfo_prop_bool(thr, "varargs", h_fun->magic == DUK_HNATFUNC_NARGS_VARARGS);
+ /* Native function pointer may be different from a void pointer,
+ * and we serialize it from memory directly now (no byte swapping etc).
+ */
+ duk__debug_getinfo_flags_key(thr, "funcptr");
+ duk_debug_write_buffer(thr, (const char *) &h_fun->func, sizeof(h_fun->func));
+ }
+
+ if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) {
+ duk_hcompfunc *h_fun;
+ duk_hbuffer *h_buf;
+ duk_hobject *h_lexenv;
+ duk_hobject *h_varenv;
+ h_fun = (duk_hcompfunc *) h_obj;
+
+ duk__debug_getinfo_prop_int(thr, "nregs", h_fun->nregs);
+ duk__debug_getinfo_prop_int(thr, "nargs", h_fun->nargs);
+
+ duk__debug_getinfo_flags_key(thr, "lex_env");
+ h_lexenv = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, h_fun);
+ if (h_lexenv != NULL) {
+ duk_debug_write_hobject(thr, h_lexenv);
+ } else {
+ duk_debug_write_null(thr);
+ }
+ duk__debug_getinfo_flags_key(thr, "var_env");
+ h_varenv = DUK_HCOMPFUNC_GET_VARENV(thr->heap, h_fun);
+ if (h_varenv != NULL) {
+ duk_debug_write_hobject(thr, h_varenv);
+ } else {
+ duk_debug_write_null(thr);
+ }
+
+ duk__debug_getinfo_prop_uint(thr, "start_line", h_fun->start_line);
+ duk__debug_getinfo_prop_uint(thr, "end_line", h_fun->end_line);
+ h_buf = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun);
+ if (h_buf != NULL) {
+ duk__debug_getinfo_flags_key(thr, "data");
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) h_buf);
+ }
+ }
+
+ if (DUK_HOBJECT_IS_BOUNDFUNC(h_obj)) {
+ duk_hboundfunc *h_bfun;
+ h_bfun = (duk_hboundfunc *) h_obj;
+
+ duk__debug_getinfo_flags_key(thr, "target");
+ duk_debug_write_tval(thr, &h_bfun->target);
+ duk__debug_getinfo_flags_key(thr, "this_binding");
+ duk_debug_write_tval(thr, &h_bfun->this_binding);
+ duk__debug_getinfo_flags_key(thr, "nargs");
+ duk_debug_write_int(thr, h_bfun->nargs);
+ /* h_bfun->args not exposed now */
+ }
+
+ if (DUK_HOBJECT_IS_THREAD(h_obj)) {
+ /* XXX: Currently no inspection of threads, e.g. value stack, call
+ * stack, catch stack, etc.
+ */
+ duk_hthread *h_thr;
+ h_thr = (duk_hthread *) h_obj;
+ DUK_UNREF(h_thr);
+ }
+
+ if (DUK_HOBJECT_IS_DECENV(h_obj)) {
+ duk_hdecenv *h_env;
+ h_env = (duk_hdecenv *) h_obj;
+
+ duk__debug_getinfo_flags_key(thr, "thread");
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->thread));
+ duk__debug_getinfo_flags_key(thr, "varmap");
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->varmap));
+ duk__debug_getinfo_prop_uint(thr, "regbase", (duk_uint_t) h_env->regbase_byteoff);
+ }
+
+ if (DUK_HOBJECT_IS_OBJENV(h_obj)) {
+ duk_hobjenv *h_env;
+ h_env = (duk_hobjenv *) h_obj;
+
+ duk__debug_getinfo_flags_key(thr, "target");
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->target));
+ duk__debug_getinfo_prop_bool(thr, "has_this", h_env->has_this);
+ }
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {
+ duk_hbufobj *h_bufobj;
+ h_bufobj = (duk_hbufobj *) h_obj;
+
+ duk__debug_getinfo_prop_uint(thr, "slice_offset", h_bufobj->offset);
+ duk__debug_getinfo_prop_uint(thr, "slice_length", h_bufobj->length);
+ duk__debug_getinfo_prop_uint(thr, "elem_shift", (duk_uint_t) h_bufobj->shift);
+ duk__debug_getinfo_prop_uint(thr, "elem_type", (duk_uint_t) h_bufobj->elem_type);
+ duk__debug_getinfo_prop_bool(thr, "is_typedarray", (duk_uint_t) h_bufobj->is_typedarray);
+ if (h_bufobj->buf != NULL) {
+ duk__debug_getinfo_flags_key(thr, "buffer");
+ duk_debug_write_heapptr(thr, (duk_heaphdr *) h_bufobj->buf);
+ }
+ }
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+ break;
+ }
+ case DUK_HTYPE_BUFFER: {
+ duk_hbuffer *h_buf;
+
+ h_buf = (duk_hbuffer *) h;
+ duk__debug_getinfo_bitmask(thr,
+ duk__debug_getinfo_hbuffer_keys,
+ duk__debug_getinfo_hbuffer_masks,
+ DUK_HEAPHDR_GET_FLAGS_RAW(h));
+ duk__debug_getinfo_prop_uint(thr, "size", (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf));
+ duk__debug_getinfo_flags_key(thr, "dataptr");
+ duk_debug_write_pointer(thr, (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf));
+ duk__debug_getinfo_flags_key(thr, "data");
+ duk_debug_write_hbuffer(thr, h_buf); /* tolerates NULL h_buf */
+ break;
+ }
+ default: {
+ /* Since we already started writing the reply, just emit nothing. */
+ DUK_D(DUK_DPRINT("inspect target pointer has invalid heaphdr type"));
+ }
+ }
+
+ duk_debug_write_eom(thr);
+}
+
+DUK_LOCAL void duk__debug_handle_get_obj_prop_desc(duk_hthread *thr, duk_heap *heap) {
+ duk_heaphdr *h;
+ duk_hobject *h_obj;
+ duk_hstring *h_key;
+ duk_propdesc desc;
+
+ DUK_D(DUK_DPRINT("debug command GetObjPropDesc"));
+ DUK_UNREF(heap);
+
+ h = duk_debug_read_any_ptr(thr);
+ if (!h) {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid target");
+ return;
+ }
+ h_key = duk_debug_read_hstring(thr);
+ if (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT || h_key == NULL) {
+ goto fail_args;
+ }
+ h_obj = (duk_hobject *) h;
+
+ if (duk_hobject_get_own_propdesc(thr, h_obj, h_key, &desc, 0 /*flags*/)) {
+ duk_int_t virtual_idx;
+ duk_bool_t rc;
+
+ /* To use the shared helper need the virtual index. */
+ DUK_ASSERT(desc.e_idx >= 0 || desc.a_idx >= 0);
+ virtual_idx = (desc.a_idx >= 0 ? desc.a_idx :
+ (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj) + desc.e_idx);
+
+ duk_debug_write_reply(thr);
+ rc = duk__debug_getprop_index(thr, heap, h_obj, (duk_uint_t) virtual_idx);
+ DUK_ASSERT(rc == 1);
+ DUK_UNREF(rc);
+ duk_debug_write_eom(thr);
+ } else {
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "not found");
+ }
+ return;
+
+ fail_args:
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid args");
+}
+
+DUK_LOCAL void duk__debug_handle_get_obj_prop_desc_range(duk_hthread *thr, duk_heap *heap) {
+ duk_heaphdr *h;
+ duk_hobject *h_obj;
+ duk_uint_t idx, idx_start, idx_end;
+
+ DUK_D(DUK_DPRINT("debug command GetObjPropDescRange"));
+ DUK_UNREF(heap);
+
+ h = duk_debug_read_any_ptr(thr);
+ idx_start = (duk_uint_t) duk_debug_read_int(thr);
+ idx_end = (duk_uint_t) duk_debug_read_int(thr);
+ if (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT) {
+ goto fail_args;
+ }
+ h_obj = (duk_hobject *) h;
+
+ /* The index range space is conceptually the array part followed by the
+ * entry part. Unlike normal enumeration all slots are exposed here as
+ * is and return 'unused' if the slots are not in active use. In particular
+ * the array part is included for the full a_size regardless of what the
+ * array .length is.
+ */
+
+ duk_debug_write_reply(thr);
+ for (idx = idx_start; idx < idx_end; idx++) {
+ if (!duk__debug_getprop_index(thr, heap, h_obj, idx)) {
+ break;
+ }
+ }
+ duk_debug_write_eom(thr);
+ return;
+
+ fail_args:
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid args");
+}
+
+#endif /* DUK_USE_DEBUGGER_INSPECT */
+
+/*
+ * Process incoming debug requests
+ *
+ * Individual request handlers can push temporaries on the value stack and
+ * rely on duk__debug_process_message() to restore the value stack top
+ * automatically.
+ */
+
+/* Process one debug message. Automatically restore value stack top to its
+ * entry value, so that individual message handlers don't need exact value
+ * stack handling which is convenient.
+ */
+DUK_LOCAL void duk__debug_process_message(duk_hthread *thr) {
+ duk_heap *heap;
+ duk_uint8_t x;
+ duk_int32_t cmd;
+ duk_idx_t entry_top;
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ entry_top = duk_get_top(thr);
+
+ x = duk_debug_read_byte(thr);
+ switch (x) {
+ case DUK_DBG_IB_REQUEST: {
+ cmd = duk_debug_read_int(thr);
+ switch (cmd) {
+ case DUK_DBG_CMD_BASICINFO: {
+ duk__debug_handle_basic_info(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_TRIGGERSTATUS: {
+ duk__debug_handle_trigger_status(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_PAUSE: {
+ duk__debug_handle_pause(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_RESUME: {
+ duk__debug_handle_resume(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_STEPINTO:
+ case DUK_DBG_CMD_STEPOVER:
+ case DUK_DBG_CMD_STEPOUT: {
+ duk__debug_handle_step(thr, heap, cmd);
+ break;
+ }
+ case DUK_DBG_CMD_LISTBREAK: {
+ duk__debug_handle_list_break(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_ADDBREAK: {
+ duk__debug_handle_add_break(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_DELBREAK: {
+ duk__debug_handle_del_break(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_GETVAR: {
+ duk__debug_handle_get_var(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_PUTVAR: {
+ duk__debug_handle_put_var(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_GETCALLSTACK: {
+ duk__debug_handle_get_call_stack(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_GETLOCALS: {
+ duk__debug_handle_get_locals(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_EVAL: {
+ duk__debug_handle_eval(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_DETACH: {
+ /* The actual detached_cb call is postponed to message loop so
+ * we don't need any special precautions here (just skip to EOM
+ * on the already closed connection).
+ */
+ duk__debug_handle_detach(thr, heap);
+ break;
+ }
+#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
+ case DUK_DBG_CMD_DUMPHEAP: {
+ duk__debug_handle_dump_heap(thr, heap);
+ break;
+ }
+#endif /* DUK_USE_DEBUGGER_DUMPHEAP */
+ case DUK_DBG_CMD_GETBYTECODE: {
+ duk__debug_handle_get_bytecode(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_APPREQUEST: {
+ duk__debug_handle_apprequest(thr, heap);
+ break;
+ }
+#if defined(DUK_USE_DEBUGGER_INSPECT)
+ case DUK_DBG_CMD_GETHEAPOBJINFO: {
+ duk__debug_handle_get_heap_obj_info(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_GETOBJPROPDESC: {
+ duk__debug_handle_get_obj_prop_desc(thr, heap);
+ break;
+ }
+ case DUK_DBG_CMD_GETOBJPROPDESCRANGE: {
+ duk__debug_handle_get_obj_prop_desc_range(thr, heap);
+ break;
+ }
+#endif /* DUK_USE_DEBUGGER_INSPECT */
+ default: {
+ DUK_D(DUK_DPRINT("debug command unsupported: %d", (int) cmd));
+ duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, "unsupported command");
+ }
+ } /* switch cmd */
+ break;
+ }
+ case DUK_DBG_IB_REPLY: {
+ DUK_D(DUK_DPRINT("debug reply, skipping"));
+ break;
+ }
+ case DUK_DBG_IB_ERROR: {
+ DUK_D(DUK_DPRINT("debug error, skipping"));
+ break;
+ }
+ case DUK_DBG_IB_NOTIFY: {
+ DUK_D(DUK_DPRINT("debug notify, skipping"));
+ break;
+ }
+ default: {
+ DUK_D(DUK_DPRINT("invalid initial byte, drop connection: %d", (int) x));
+ goto fail;
+ }
+ } /* switch initial byte */
+
+ DUK_ASSERT(duk_get_top(thr) >= entry_top);
+ duk_set_top(thr, entry_top);
+ duk__debug_skip_to_eom(thr);
+ return;
+
+ fail:
+ DUK_ASSERT(duk_get_top(thr) >= entry_top);
+ duk_set_top(thr, entry_top);
+ DUK__SET_CONN_BROKEN(thr, 1);
+ return;
+}
+
+DUK_LOCAL void duk__check_resend_status(duk_hthread *thr) {
+ if (thr->heap->dbg_read_cb != NULL && thr->heap->dbg_state_dirty) {
+ duk_debug_send_status(thr);
+ thr->heap->dbg_state_dirty = 0;
+ }
+}
+
+DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t entry_top;
+#endif
+ duk_bool_t retval = 0;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+#if defined(DUK_USE_ASSERTIONS)
+ entry_top = duk_get_top(thr);
+#endif
+
+ DUK_D(DUK_DPRINT("process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld",
+ thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) no_block,
+ (long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing));
+ DUK_DD(DUK_DDPRINT("top at entry: %ld", (long) duk_get_top(thr)));
+
+ /* thr->heap->dbg_detaching may be != 0 if a debugger write outside
+ * the message loop caused a transport error and detach1() to run.
+ */
+ DUK_ASSERT(thr->heap->dbg_detaching == 0 || thr->heap->dbg_detaching == 1);
+ DUK_ASSERT(thr->heap->dbg_processing == 0);
+ thr->heap->dbg_processing = 1;
+
+ /* Ensure dirty state causes a Status even if never process any
+ * messages. This is expected by the bytecode executor when in
+ * the running state.
+ */
+ duk__check_resend_status(thr);
+
+ for (;;) {
+ /* Process messages until we're no longer paused or we peek
+ * and see there's nothing to read right now.
+ */
+ DUK_DD(DUK_DDPRINT("top at loop top: %ld", (long) duk_get_top(thr)));
+ DUK_ASSERT(thr->heap->dbg_processing == 1);
+
+ while (thr->heap->dbg_read_cb == NULL && thr->heap->dbg_detaching) {
+ /* Detach is pending; can be triggered from outside the
+ * debugger loop (e.g. Status notify write error) or by
+ * previous message handling. Call detached callback
+ * here, in a controlled state, to ensure a possible
+ * reattach inside the detached_cb is handled correctly.
+ *
+ * Recheck for detach in a while loop: an immediate
+ * reattach involves a call to duk_debugger_attach()
+ * which writes a debugger handshake line immediately
+ * inside the API call. If the transport write fails
+ * for that handshake, we can immediately end up in a
+ * "transport broken, detaching" case several times here.
+ * Loop back until we're either cleanly attached or
+ * fully detached.
+ *
+ * NOTE: Reset dbg_processing = 1 forcibly, in case we
+ * re-attached; duk_debugger_attach() sets dbg_processing
+ * to 0 at the moment.
+ */
+
+ DUK_D(DUK_DPRINT("detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2"));
+
+ duk__debug_do_detach2(thr->heap);
+ thr->heap->dbg_processing = 1; /* may be set to 0 by duk_debugger_attach() inside callback */
+
+ DUK_D(DUK_DPRINT("after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld",
+ thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) thr->heap->dbg_detaching));
+ }
+ DUK_ASSERT(thr->heap->dbg_detaching == 0); /* true even with reattach */
+ DUK_ASSERT(thr->heap->dbg_processing == 1); /* even after a detach and possible reattach */
+
+ if (thr->heap->dbg_read_cb == NULL) {
+ DUK_D(DUK_DPRINT("debug connection broken (and not detaching), stop processing messages"));
+ break;
+ }
+
+ if (!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || no_block) {
+ if (!duk_debug_read_peek(thr)) {
+ /* Note: peek cannot currently trigger a detach
+ * so the dbg_detaching == 0 assert outside the
+ * loop is correct.
+ */
+ DUK_D(DUK_DPRINT("processing debug message, peek indicated no data, stop processing messages"));
+ break;
+ }
+ DUK_D(DUK_DPRINT("processing debug message, peek indicated there is data, handle it"));
+ } else {
+ DUK_D(DUK_DPRINT("paused, process debug message, blocking if necessary"));
+ }
+
+ duk__check_resend_status(thr);
+ duk__debug_process_message(thr);
+ duk__check_resend_status(thr);
+
+ retval = 1; /* processed one or more messages */
+ }
+
+ DUK_ASSERT(thr->heap->dbg_detaching == 0);
+ DUK_ASSERT(thr->heap->dbg_processing == 1);
+ thr->heap->dbg_processing = 0;
+
+ /* As an initial implementation, read flush after exiting the message
+ * loop. If transport is broken, this is a no-op (with debug logs).
+ */
+ duk_debug_read_flush(thr); /* this cannot initiate a detach */
+ DUK_ASSERT(thr->heap->dbg_detaching == 0);
+
+ DUK_DD(DUK_DDPRINT("top at exit: %ld", (long) duk_get_top(thr)));
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* Easy to get wrong, so assert for it. */
+ DUK_ASSERT(entry_top == duk_get_top(thr));
+#endif
+
+ return retval;
+}
+
+/*
+ * Halt execution helper
+ */
+
+/* Halt execution and enter a debugger message loop until execution is resumed
+ * by the client. PC for the current activation may be temporarily decremented
+ * so that the "current" instruction will be shown by the client. This helper
+ * is callable from anywhere, also outside bytecode executor.
+ */
+
+DUK_INTERNAL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc) {
+ duk_activation *act;
+ duk_hcompfunc *fun;
+ duk_instr_t *old_pc = NULL;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(duk_debug_is_attached(thr->heap));
+ DUK_ASSERT(thr->heap->dbg_processing == 0);
+ DUK_ASSERT(!duk_debug_is_paused(thr->heap));
+
+ duk_debug_set_paused(thr->heap);
+
+ act = thr->callstack_curr;
+
+ /* NOTE: act may be NULL if an error is thrown outside of any activation,
+ * which may happen in the case of, e.g. syntax errors.
+ */
+
+ /* Decrement PC if that was requested, this requires a PC sync. */
+ if (act != NULL) {
+ duk_hthread_sync_currpc(thr);
+ old_pc = act->curr_pc;
+ fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+
+ /* Short circuit if is safe: if act->curr_pc != NULL, 'fun' is
+ * guaranteed to be a non-NULL Ecmascript function.
+ */
+ DUK_ASSERT(act->curr_pc == NULL ||
+ (fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)));
+ if (use_prev_pc &&
+ act->curr_pc != NULL &&
+ act->curr_pc > DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, fun)) {
+ act->curr_pc--;
+ }
+ }
+
+ /* Process debug messages until we are no longer paused. */
+
+ /* NOTE: This is a bit fragile. It's important to ensure that
+ * duk_debug_process_messages() never throws an error or
+ * act->curr_pc will never be reset.
+ */
+
+ thr->heap->dbg_state_dirty = 1;
+ while (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) {
+ DUK_ASSERT(duk_debug_is_attached(thr->heap));
+ DUK_ASSERT(thr->heap->dbg_processing == 0);
+ duk_debug_process_messages(thr, 0 /*no_block*/);
+ }
+
+ /* XXX: Decrementing and restoring act->curr_pc works now, but if the
+ * debugger message loop gains the ability to adjust the current PC
+ * (e.g. a forced jump) restoring the PC here will break. Another
+ * approach would be to use a state flag for the "decrement 1 from
+ * topmost activation's PC" and take it into account whenever dealing
+ * with PC values.
+ */
+ if (act != NULL) {
+ act->curr_pc = old_pc; /* restore PC */
+ }
+}
+
+/*
+ * Breakpoint management
+ */
+
+DUK_INTERNAL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line) {
+ duk_heap *heap;
+ duk_breakpoint *b;
+
+ /* Caller must trigger recomputation of active breakpoint list. To
+ * ensure stale values are not used if that doesn't happen, clear the
+ * active breakpoint list here.
+ */
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(filename != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+
+ if (heap->dbg_breakpoint_count >= DUK_HEAP_MAX_BREAKPOINTS) {
+ DUK_D(DUK_DPRINT("failed to add breakpoint for %O:%ld, all breakpoint slots used",
+ (duk_heaphdr *) filename, (long) line));
+ return -1;
+ }
+ heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL;
+ b = heap->dbg_breakpoints + (heap->dbg_breakpoint_count++);
+ b->filename = filename;
+ b->line = line;
+ DUK_HSTRING_INCREF(thr, filename);
+
+ return (duk_small_int_t) (heap->dbg_breakpoint_count - 1); /* index */
+}
+
+DUK_INTERNAL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index) {
+ duk_heap *heap;
+ duk_hstring *h;
+ duk_breakpoint *b;
+ duk_size_t move_size;
+
+ /* Caller must trigger recomputation of active breakpoint list. To
+ * ensure stale values are not used if that doesn't happen, clear the
+ * active breakpoint list here.
+ */
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(duk_debug_is_attached(thr->heap));
+ DUK_ASSERT_DISABLE(breakpoint_index >= 0); /* unsigned */
+
+ if (breakpoint_index >= heap->dbg_breakpoint_count) {
+ DUK_D(DUK_DPRINT("invalid breakpoint index: %ld", (long) breakpoint_index));
+ return 0;
+ }
+ b = heap->dbg_breakpoints + breakpoint_index;
+
+ h = b->filename;
+ DUK_ASSERT(h != NULL);
+
+ move_size = sizeof(duk_breakpoint) * (heap->dbg_breakpoint_count - breakpoint_index - 1);
+ if (move_size > 0) {
+ DUK_MEMMOVE((void *) b,
+ (const void *) (b + 1),
+ (size_t) move_size);
+ }
+ heap->dbg_breakpoint_count--;
+ heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL;
+
+ DUK_HSTRING_DECREF(thr, h); /* side effects */
+ DUK_UNREF(h); /* w/o refcounting */
+
+ /* Breakpoint entries above the used area are left as garbage. */
+
+ return 1;
+}
+
+/*
+ * Misc state management
+ */
+
+DUK_INTERNAL duk_bool_t duk_debug_is_attached(duk_heap *heap) {
+ return (heap->dbg_read_cb != NULL);
+}
+
+DUK_INTERNAL duk_bool_t duk_debug_is_paused(duk_heap *heap) {
+ return (DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) != 0);
+}
+
+DUK_INTERNAL void duk_debug_set_paused(duk_heap *heap) {
+ if (duk_debug_is_paused(heap)) {
+ DUK_D(DUK_DPRINT("trying to set paused state when already paused, ignoring"));
+ } else {
+ DUK_HEAP_SET_DEBUGGER_PAUSED(heap);
+ heap->dbg_state_dirty = 1;
+ duk_debug_clear_pause_state(heap);
+ DUK_ASSERT(heap->ms_running == 0); /* debugger can't be triggered within mark-and-sweep */
+ heap->ms_running = 1; /* prevent mark-and-sweep, prevent refzero queueing */
+ heap->ms_prevent_count++;
+ DUK_ASSERT(heap->ms_prevent_count != 0); /* Wrap. */
+ DUK_ASSERT(heap->heap_thread != NULL);
+ }
+}
+
+DUK_INTERNAL void duk_debug_clear_paused(duk_heap *heap) {
+ if (duk_debug_is_paused(heap)) {
+ DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap);
+ heap->dbg_state_dirty = 1;
+ duk_debug_clear_pause_state(heap);
+ DUK_ASSERT(heap->ms_running == 1);
+ DUK_ASSERT(heap->ms_prevent_count > 0);
+ heap->ms_prevent_count--;
+ heap->ms_running = 0;
+ DUK_ASSERT(heap->heap_thread != NULL);
+ } else {
+ DUK_D(DUK_DPRINT("trying to clear paused state when not paused, ignoring"));
+ }
+}
+
+DUK_INTERNAL void duk_debug_clear_pause_state(duk_heap *heap) {
+ heap->dbg_pause_flags = 0;
+ heap->dbg_pause_act = NULL;
+ heap->dbg_pause_startline = 0;
+}
+
+#else /* DUK_USE_DEBUGGER_SUPPORT */
+
+/* No debugger support. */
+
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+/* automatic undefs */
+#undef DUK__DBG_TPORT_ENTER
+#undef DUK__DBG_TPORT_EXIT
+#undef DUK__SET_CONN_BROKEN
+#line 1 "duk_error_augment.c"
+/*
+ * Augmenting errors at their creation site and their throw site.
+ *
+ * When errors are created, traceback data is added by built-in code
+ * and a user error handler (if defined) can process or replace the
+ * error. Similarly, when errors are thrown, a user error handler
+ * (if defined) can process or replace the error.
+ *
+ * Augmentation and other processing at error creation time is nice
+ * because an error is only created once, but it may be thrown and
+ * rethrown multiple times. User error handler registered for processing
+ * an error at its throw site must be careful to handle rethrowing in
+ * a useful manner.
+ *
+ * Error augmentation may throw an internal error (e.g. alloc error).
+ *
+ * Ecmascript allows throwing any values, so all values cannot be
+ * augmented. Currently, the built-in augmentation at error creation
+ * only augments error values which are Error instances (= have the
+ * built-in Error.prototype in their prototype chain) and are also
+ * extensible. User error handlers have no limitations in this respect.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Helper for calling a user error handler.
+ *
+ * 'thr' must be the currently active thread; the error handler is called
+ * in its context. The valstack of 'thr' must have the error value on
+ * top, and will be replaced by another error value based on the return
+ * value of the error handler.
+ *
+ * The helper calls duk_handle_call() recursively in protected mode.
+ * Before that call happens, no longjmps should happen; as a consequence,
+ * we must assume that the valstack contains enough temporary space for
+ * arguments and such.
+ *
+ * While the error handler runs, any errors thrown will not trigger a
+ * recursive error handler call (this is implemented using a heap level
+ * flag which will "follow" through any coroutines resumed inside the
+ * error handler). If the error handler is not callable or throws an
+ * error, the resulting error replaces the original error (for Duktape
+ * internal errors, duk_error_throw.c further substitutes this error with
+ * a DoubleError which is not ideal). This would be easy to change and
+ * even signal to the caller.
+ *
+ * The user error handler is stored in 'Duktape.errCreate' or
+ * 'Duktape.errThrow' depending on whether we're augmenting the error at
+ * creation or throw time. There are several alternatives to this approach,
+ * see doc/error-objects.rst for discussion.
+ *
+ * Note: since further longjmp()s may occur while calling the error handler
+ * (for many reasons, e.g. a labeled 'break' inside the handler), the
+ * caller can make no assumptions on the thr->heap->lj state after the
+ * call (this affects especially duk_error_throw.c). This is not an issue
+ * as long as the caller writes to the lj state only after the error handler
+ * finishes.
+ */
+
+#if defined(DUK_USE_ERRTHROW) || defined(DUK_USE_ERRCREATE)
+DUK_LOCAL void duk__err_augment_user(duk_hthread *thr, duk_small_uint_t stridx_cb) {
+ duk_tval *tv_hnd;
+ duk_int_t rc;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT_STRIDX_VALID(stridx_cb);
+
+ if (thr->heap->augmenting_error) {
+ DUK_D(DUK_DPRINT("recursive call to error augmentation, ignore"));
+ return;
+ }
+
+ /*
+ * Check whether or not we have an error handler.
+ *
+ * We must be careful of not triggering an error when looking up the
+ * property. For instance, if the property is a getter, we don't want
+ * to call it, only plain values are allowed. The value, if it exists,
+ * is not checked. If the value is not a function, a TypeError happens
+ * when it is called and that error replaces the original one.
+ */
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, 4); /* 3 entries actually needed below */
+
+ /* [ ... errval ] */
+
+ if (thr->builtins[DUK_BIDX_DUKTAPE] == NULL) {
+ /* When creating built-ins, some of the built-ins may not be set
+ * and we want to tolerate that when throwing errors.
+ */
+ DUK_DD(DUK_DDPRINT("error occurred when DUK_BIDX_DUKTAPE is NULL, ignoring"));
+ return;
+ }
+ tv_hnd = duk_hobject_find_existing_entry_tval_ptr(thr->heap,
+ thr->builtins[DUK_BIDX_DUKTAPE],
+ DUK_HTHREAD_GET_STRING(thr, stridx_cb));
+ if (tv_hnd == NULL) {
+ DUK_DD(DUK_DDPRINT("error handler does not exist or is not a plain value: %!T",
+ (duk_tval *) tv_hnd));
+ return;
+ }
+ DUK_DDD(DUK_DDDPRINT("error handler dump (callability not checked): %!T",
+ (duk_tval *) tv_hnd));
+ duk_push_tval(thr, tv_hnd);
+
+ /* [ ... errval errhandler ] */
+
+ duk_insert(thr, -2); /* -> [ ... errhandler errval ] */
+ duk_push_undefined(thr);
+ duk_insert(thr, -2); /* -> [ ... errhandler undefined(= this) errval ] */
+
+ /* [ ... errhandler undefined errval ] */
+
+ /*
+ * heap->augmenting_error prevents recursive re-entry and also causes
+ * call handling to use a larger (but not unbounded) call stack limit
+ * for the duration of error augmentation.
+ *
+ * We ignore errors now: a success return and an error value both
+ * replace the original error value. (This would be easy to change.)
+ */
+
+ DUK_ASSERT(thr->heap->augmenting_error == 0);
+ thr->heap->augmenting_error = 1;
+
+ rc = duk_pcall_method(thr, 1);
+ DUK_UNREF(rc); /* no need to check now: both success and error are OK */
+
+ DUK_ASSERT(thr->heap->augmenting_error == 1);
+ thr->heap->augmenting_error = 0;
+
+ /* [ ... errval ] */
+}
+#endif /* DUK_USE_ERRTHROW || DUK_USE_ERRCREATE */
+
+/*
+ * Add ._Tracedata to an error on the stack top.
+ */
+
+#if defined(DUK_USE_TRACEBACKS)
+DUK_LOCAL void duk__add_traceback(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) {
+ duk_activation *act;
+ duk_int_t depth;
+ duk_int_t arr_size;
+ duk_tval *tv;
+ duk_hstring *s;
+ duk_uint32_t u32;
+ duk_double_t d;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr_callstack != NULL);
+
+ /* [ ... error ] */
+
+ /*
+ * The traceback format is pretty arcane in an attempt to keep it compact
+ * and cheap to create. It may change arbitrarily from version to version.
+ * It should be decoded/accessed through version specific accessors only.
+ *
+ * See doc/error-objects.rst.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("adding traceback to object: %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* Preallocate array to correct size, so that we can just write out
+ * the _Tracedata values into the array part.
+ */
+ act = thr->callstack_curr;
+ depth = DUK_USE_TRACEBACK_DEPTH;
+ DUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX); /* callstack limits */
+ if (depth > (duk_int_t) thr_callstack->callstack_top) {
+ depth = (duk_int_t) thr_callstack->callstack_top;
+ }
+ if (depth > 0) {
+ if (flags & DUK_AUGMENT_FLAG_SKIP_ONE) {
+ DUK_ASSERT(act != NULL);
+ act = act->parent;
+ depth--;
+ }
+ }
+ arr_size = depth * 2;
+ if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) {
+ arr_size += 2;
+ }
+ if (c_filename) {
+ /* We need the C filename to be interned before getting the
+ * array part pointer to avoid any GC interference while the
+ * array part is populated.
+ */
+ duk_push_string(thr, c_filename);
+ arr_size += 2;
+ }
+
+ /* XXX: uninitialized would be OK */
+ DUK_D(DUK_DPRINT("preallocated _Tracedata to %ld items", (long) arr_size));
+ tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) arr_size);
+ DUK_ASSERT(arr_size == 0 || tv != NULL);
+
+ /* Compiler SyntaxErrors (and other errors) come first, and are
+ * blamed by default (not flagged "noblame").
+ */
+ if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) {
+ s = thr->compile_ctx->h_filename;
+ DUK_TVAL_SET_STRING(tv, s);
+ DUK_HSTRING_INCREF(thr, s);
+ tv++;
+
+ u32 = (duk_uint32_t) thr->compile_ctx->curr_token.start_line; /* (flags<<32) + (line), flags = 0 */
+ DUK_TVAL_SET_U32(tv, u32);
+ tv++;
+ }
+
+ /* Filename/line from C macros (__FILE__, __LINE__) are added as an
+ * entry with a special format: (string, number). The number contains
+ * the line and flags.
+ */
+
+ /* [ ... error c_filename? arr ] */
+
+ if (c_filename) {
+ DUK_ASSERT(DUK_TVAL_IS_STRING(thr->valstack_top - 2));
+ s = DUK_TVAL_GET_STRING(thr->valstack_top - 2); /* interned c_filename */
+ DUK_ASSERT(s != NULL);
+ DUK_TVAL_SET_STRING(tv, s);
+ DUK_HSTRING_INCREF(thr, s);
+ tv++;
+
+ d = ((flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) ? ((duk_double_t) DUK_TB_FLAG_NOBLAME_FILELINE) * DUK_DOUBLE_2TO32 : 0.0) +
+ (duk_double_t) c_line;
+ DUK_TVAL_SET_DOUBLE(tv, d);
+ tv++;
+ }
+
+ /* Traceback depth doesn't take into account the filename/line
+ * special handling above (intentional).
+ */
+ for (; depth-- > 0; act = act->parent) {
+ duk_uint32_t pc;
+ duk_tval *tv_src;
+
+ /* [... arr] */
+
+ DUK_ASSERT(act != NULL); /* depth check above, assumes book-keeping is correct */
+ DUK_ASSERT_DISABLE(act->pc >= 0); /* unsigned */
+
+ /* Add function object. */
+ tv_src = &act->tv_func; /* object (function) or lightfunc */
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_src) || DUK_TVAL_IS_LIGHTFUNC(tv_src));
+ DUK_TVAL_SET_TVAL(tv, tv_src);
+ DUK_TVAL_INCREF(thr, tv);
+ tv++;
+
+ /* Add a number containing: pc, activation flags.
+ *
+ * PC points to next instruction, find offending PC. Note that
+ * PC == 0 for native code.
+ */
+ pc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr_callstack, act);
+ DUK_ASSERT_DISABLE(pc >= 0); /* unsigned */
+ DUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */
+ d = ((duk_double_t) act->flags) * DUK_DOUBLE_2TO32 + (duk_double_t) pc;
+ DUK_TVAL_SET_DOUBLE(tv, d);
+ tv++;
+ }
+
+#if defined(DUK_USE_ASSERTIONS)
+ {
+ duk_harray *a;
+ a = (duk_harray *) duk_known_hobject(thr, -1);
+ DUK_ASSERT(a != NULL);
+ DUK_ASSERT((duk_uint32_t) (tv - DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a)) == a->length);
+ DUK_ASSERT(a->length == (duk_uint32_t) arr_size);
+ }
+#endif
+
+ /* [ ... error c_filename? arr ] */
+
+ if (c_filename) {
+ duk_remove_m2(thr);
+ }
+
+ /* [ ... error arr ] */
+
+ duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INT_TRACEDATA); /* -> [ ... error ] */
+}
+#endif /* DUK_USE_TRACEBACKS */
+
+/*
+ * Add .fileName and .lineNumber to an error on the stack top.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE) && !defined(DUK_USE_TRACEBACKS)
+DUK_LOCAL void duk__add_fileline(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_int_t entry_top;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ entry_top = duk_get_top(thr);
+#endif
+
+ /*
+ * If tracebacks are disabled, 'fileName' and 'lineNumber' are added
+ * as plain own properties. Since Error.prototype has accessors of
+ * the same name, we need to define own properties directly (cannot
+ * just use e.g. duk_put_prop_stridx). Existing properties are not
+ * overwritten in case they already exist.
+ */
+
+ if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) {
+ /* Compiler SyntaxError (or other error) gets the primary blame.
+ * Currently no flag to prevent blaming.
+ */
+ duk_push_uint(thr, (duk_uint_t) thr->compile_ctx->curr_token.start_line);
+ duk_push_hstring(thr, thr->compile_ctx->h_filename);
+ } else if (c_filename && (flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) == 0) {
+ /* C call site gets blamed next, unless flagged not to do so.
+ * XXX: file/line is disabled in minimal builds, so disable this
+ * too when appropriate.
+ */
+ duk_push_int(thr, c_line);
+ duk_push_string(thr, c_filename);
+ } else {
+ /* Finally, blame the innermost callstack entry which has a
+ * .fileName property.
+ */
+ duk_small_uint_t depth;
+ duk_uint32_t ecma_line;
+ duk_activation *act;
+
+ DUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX); /* callstack limits */
+ depth = DUK_USE_TRACEBACK_DEPTH;
+ if (depth > thr_callstack->callstack_top) {
+ depth = thr_callstack->callstack_top;
+ }
+ for (act = thr_callstack->callstack_curr; depth-- > 0; act = act->parent) {
+ duk_hobject *func;
+ duk_uint32_t pc;
+
+ DUK_ASSERT(act != NULL);
+ func = DUK_ACT_GET_FUNC(act);
+ if (func == NULL) {
+ /* Lightfunc, not blamed now. */
+ continue;
+ }
+
+ /* PC points to next instruction, find offending PC,
+ * PC == 0 for native code.
+ */
+ pc = duk_hthread_get_act_prev_pc(thr, act); /* thr argument only used for thr->heap, so specific thread doesn't matter */
+ DUK_UNREF(pc);
+ DUK_ASSERT_DISABLE(pc >= 0); /* unsigned */
+ DUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */
+ act = NULL; /* invalidated by pushes, so get out of the way */
+
+ duk_push_hobject(thr, func);
+
+ /* [ ... error func ] */
+
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME);
+ if (!duk_is_string_notsymbol(thr, -1)) {
+ duk_pop_2(thr);
+ continue;
+ }
+
+ /* [ ... error func fileName ] */
+
+ ecma_line = 0;
+#if defined(DUK_USE_PC2LINE)
+ if (DUK_HOBJECT_IS_COMPFUNC(func)) {
+ ecma_line = duk_hobject_pc2line_query(thr, -2, (duk_uint_fast32_t) pc);
+ } else {
+ /* Native function, no relevant lineNumber. */
+ }
+#endif /* DUK_USE_PC2LINE */
+ duk_push_u32(thr, ecma_line);
+
+ /* [ ... error func fileName lineNumber ] */
+
+ duk_replace(thr, -3);
+
+ /* [ ... error lineNumber fileName ] */
+ goto define_props;
+ }
+
+ /* No activation matches, use undefined for both .fileName and
+ * .lineNumber (matches what we do with a _Tracedata based
+ * no-match lookup.
+ */
+ duk_push_undefined(thr);
+ duk_push_undefined(thr);
+ }
+
+ define_props:
+ /* [ ... error lineNumber fileName ] */
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(duk_get_top(thr) == entry_top + 2);
+#endif
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE);
+}
+#endif /* DUK_USE_AUGMENT_ERROR_CREATE && !DUK_USE_TRACEBACKS */
+
+/*
+ * Add line number to a compiler error.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+DUK_LOCAL void duk__add_compiler_error_line(duk_hthread *thr) {
+
+ /* Append a "(line NNN)" to the "message" property of any error
+ * thrown during compilation. Usually compilation errors are
+ * SyntaxErrors but they can also be out-of-memory errors and
+ * the like.
+ */
+
+ /* [ ... error ] */
+
+ DUK_ASSERT(duk_is_object(thr, -1));
+
+ if (!(thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL)) {
+ return;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("compile error, before adding line info: %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_MESSAGE)) {
+ duk_push_sprintf(thr, " (line %ld)", (long) thr->compile_ctx->curr_token.start_line);
+ duk_concat(thr, 2);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE);
+ } else {
+ duk_pop(thr);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("compile error, after adding line info: %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+}
+#endif /* DUK_USE_AUGMENT_ERROR_CREATE */
+
+/*
+ * Augment an error being created using Duktape specific properties
+ * like _Tracedata or .fileName/.lineNumber.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+DUK_LOCAL void duk__err_augment_builtin_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_hobject *obj, duk_small_uint_t flags) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_int_t entry_top;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ entry_top = duk_get_top(thr);
+#endif
+ DUK_ASSERT(obj != NULL);
+
+ DUK_UNREF(obj); /* unreferenced w/o tracebacks */
+
+ duk__add_compiler_error_line(thr);
+
+#if defined(DUK_USE_TRACEBACKS)
+ /* If tracebacks are enabled, the '_Tracedata' property is the only
+ * thing we need: 'fileName' and 'lineNumber' are virtual properties
+ * which use '_Tracedata'.
+ */
+ if (duk_hobject_hasprop_raw(thr, obj, DUK_HTHREAD_STRING_INT_TRACEDATA(thr))) {
+ DUK_DDD(DUK_DDDPRINT("error value already has a '_Tracedata' property, not modifying it"));
+ } else {
+ duk__add_traceback(thr, thr_callstack, c_filename, c_line, flags);
+ }
+#else
+ /* Without tracebacks the concrete .fileName and .lineNumber need
+ * to be added directly.
+ */
+ duk__add_fileline(thr, thr_callstack, c_filename, c_line, flags);
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(duk_get_top(thr) == entry_top);
+#endif
+}
+#endif /* DUK_USE_AUGMENT_ERROR_CREATE */
+
+/*
+ * Augment an error at creation time with _Tracedata/fileName/lineNumber
+ * and allow a user error handler (if defined) to process/replace the error.
+ * The error to be augmented is at the stack top.
+ *
+ * thr: thread containing the error value
+ * thr_callstack: thread which should be used for generating callstack etc.
+ * c_filename: C __FILE__ related to the error
+ * c_line: C __LINE__ related to the error
+ * flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE:
+ * if true, don't fileName/line as error source, otherwise use traceback
+ * (needed because user code filename/line are reported but internal ones
+ * are not)
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+DUK_INTERNAL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) {
+ duk_hobject *obj;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr_callstack != NULL);
+
+ /* [ ... error ] */
+
+ /*
+ * Criteria for augmenting:
+ *
+ * - augmentation enabled in build (naturally)
+ * - error value internal prototype chain contains the built-in
+ * Error prototype object (i.e. 'val instanceof Error')
+ *
+ * Additional criteria for built-in augmenting:
+ *
+ * - error value is an extensible object
+ */
+
+ obj = duk_get_hobject(thr, -1);
+ if (!obj) {
+ DUK_DDD(DUK_DDDPRINT("value is not an object, skip both built-in and user augment"));
+ return;
+ }
+ if (!duk_hobject_prototype_chain_contains(thr, obj, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) {
+ /* If the value has a prototype loop, it's critical not to
+ * throw here. Instead, assume the value is not to be
+ * augmented.
+ */
+ DUK_DDD(DUK_DDDPRINT("value is not an error instance, skip both built-in and user augment"));
+ return;
+ }
+ if (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) {
+ DUK_DDD(DUK_DDDPRINT("error meets criteria, built-in augment"));
+ duk__err_augment_builtin_create(thr, thr_callstack, c_filename, c_line, obj, flags);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("error does not meet criteria, no built-in augment"));
+ }
+
+ /* [ ... error ] */
+
+#if defined(DUK_USE_ERRCREATE)
+ duk__err_augment_user(thr, DUK_STRIDX_ERR_CREATE);
+#endif
+}
+#endif /* DUK_USE_AUGMENT_ERROR_CREATE */
+
+/*
+ * Augment an error at throw time; allow a user error handler (if defined)
+ * to process/replace the error. The error to be augmented is at the
+ * stack top.
+ */
+
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+DUK_INTERNAL void duk_err_augment_error_throw(duk_hthread *thr) {
+#if defined(DUK_USE_ERRTHROW)
+ duk__err_augment_user(thr, DUK_STRIDX_ERR_THROW);
+#endif /* DUK_USE_ERRTHROW */
+}
+#endif /* DUK_USE_AUGMENT_ERROR_THROW */
+#line 1 "duk_error_longjmp.c"
+/*
+ * Do a longjmp call, calling the fatal error handler if no
+ * catchpoint exists.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_PREFER_SIZE)
+DUK_LOCAL void duk__uncaught_minimal(duk_hthread *thr) {
+ (void) duk_fatal(thr, "uncaught error");
+}
+#endif
+
+#if 0
+DUK_LOCAL void duk__uncaught_readable(duk_hthread *thr) {
+ const char *summary;
+ char buf[DUK_USE_FATAL_MAXLEN];
+
+ summary = duk_push_string_tval_readable(thr, &thr->heap->lj.value1);
+ DUK_SNPRINTF(buf, sizeof(buf), "uncaught: %s", summary);
+ buf[sizeof(buf) - 1] = (char) 0;
+ (void) duk_fatal(thr, (const char *) buf);
+}
+#endif
+
+#if !defined(DUK_USE_PREFER_SIZE)
+DUK_LOCAL void duk__uncaught_error_aware(duk_hthread *thr) {
+ const char *summary;
+ char buf[DUK_USE_FATAL_MAXLEN];
+
+ summary = duk_push_string_tval_readable_error(thr, &thr->heap->lj.value1);
+ DUK_ASSERT(summary != NULL);
+ DUK_SNPRINTF(buf, sizeof(buf), "uncaught: %s", summary);
+ buf[sizeof(buf) - 1] = (char) 0;
+ (void) duk_fatal(thr, (const char *) buf);
+}
+#endif
+
+DUK_INTERNAL void duk_err_longjmp(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+
+ DUK_DD(DUK_DDPRINT("longjmp error: type=%d iserror=%d value1=%!T value2=%!T",
+ (int) thr->heap->lj.type, (int) thr->heap->lj.iserror,
+ &thr->heap->lj.value1, &thr->heap->lj.value2));
+
+ /* Prevent finalizer execution during error handling. All error
+ * handling sites will process pending finalizers once error handling
+ * is complete and we're ready for the side effects. Does not prevent
+ * refzero freeing or mark-and-sweep during error handling.
+ *
+ * NOTE: when we come here some calling code may have used DECREF
+ * NORZ macros without an explicit DUK_REFZERO_CHECK_xxx() call.
+ * We don't want to do it here because it would just check for
+ * pending finalizers and we prevent that explicitly. Instead,
+ * the error catcher will run the finalizers once error handling
+ * is complete.
+ */
+
+ DUK_ASSERT_LJSTATE_SET(thr->heap);
+
+ thr->heap->pf_prevent_count++;
+ DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* XXX: set this immediately when longjmp state is set */
+ DUK_ASSERT(thr->heap->error_not_allowed == 0); /* Detect error within critical section. */
+ thr->heap->error_not_allowed = 1;
+#endif
+
+ DUK_DD(DUK_DDPRINT("about to longjmp, pf_prevent_count=%ld", (long) thr->heap->pf_prevent_count));
+
+#if !defined(DUK_USE_CPP_EXCEPTIONS)
+ /* If we don't have a jmpbuf_ptr, there is little we can do except
+ * cause a fatal error. The caller's expectation is that we never
+ * return.
+ *
+ * With C++ exceptions we now just propagate an uncaught error
+ * instead of invoking the fatal error handler. Because there's
+ * a dummy jmpbuf for C++ exceptions now, this could be changed.
+ */
+ if (!thr->heap->lj.jmpbuf_ptr) {
+ DUK_D(DUK_DPRINT("uncaught error: type=%d iserror=%d value1=%!T value2=%!T",
+ (int) thr->heap->lj.type, (int) thr->heap->lj.iserror,
+ &thr->heap->lj.value1, &thr->heap->lj.value2));
+
+#if defined(DUK_USE_PREFER_SIZE)
+ duk__uncaught_minimal(thr);
+#else
+ duk__uncaught_error_aware(thr);
+#endif
+ DUK_UNREACHABLE();
+ }
+#endif /* DUK_USE_CPP_EXCEPTIONS */
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ {
+ duk_internal_exception exc; /* dummy */
+ throw exc;
+ }
+#else /* DUK_USE_CPP_EXCEPTIONS */
+ DUK_LONGJMP(thr->heap->lj.jmpbuf_ptr->jb);
+#endif /* DUK_USE_CPP_EXCEPTIONS */
+
+ DUK_UNREACHABLE();
+}
+#line 1 "duk_error_misc.c"
+/*
+ * Error helpers
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Helper to walk the thread chain and see if there is an active error
+ * catcher. Protected calls or finally blocks aren't considered catching.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_LOCAL duk_bool_t duk__have_active_catcher(duk_hthread *thr) {
+ /* As noted above, a protected API call won't be counted as a
+ * catcher. This is usually convenient, e.g. in the case of a top-
+ * level duk_pcall(), but may not always be desirable. Perhaps add
+ * an argument to treat them as catchers?
+ */
+
+ duk_activation *act;
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+
+ for (; thr != NULL; thr = thr->resumer) {
+ for (act = thr->callstack_curr; act != NULL; act = act->parent) {
+ for (cat = act->cat; cat != NULL; cat = cat->parent) {
+ if (DUK_CAT_HAS_CATCH_ENABLED(cat)) {
+ return 1; /* all we need to know */
+ }
+ }
+ }
+ }
+ return 0;
+}
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+/*
+ * Get prototype object for an integer error code.
+ */
+
+DUK_INTERNAL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t code) {
+ switch (code) {
+ case DUK_ERR_EVAL_ERROR:
+ return thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE];
+ case DUK_ERR_RANGE_ERROR:
+ return thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE];
+ case DUK_ERR_REFERENCE_ERROR:
+ return thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE];
+ case DUK_ERR_SYNTAX_ERROR:
+ return thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE];
+ case DUK_ERR_TYPE_ERROR:
+ return thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE];
+ case DUK_ERR_URI_ERROR:
+ return thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE];
+ case DUK_ERR_ERROR:
+ default:
+ return thr->builtins[DUK_BIDX_ERROR_PROTOTYPE];
+ }
+}
+
+/*
+ * Helper for debugger throw notify and pause-on-uncaught integration.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_INTERNAL void duk_err_check_debugger_integration(duk_hthread *thr) {
+ duk_bool_t uncaught;
+ duk_tval *tv_obj;
+
+ /* If something is thrown with the debugger attached and nobody will
+ * catch it, execution is paused before the longjmp, turning over
+ * control to the debug client. This allows local state to be examined
+ * before the stack is unwound. Errors are not intercepted when debug
+ * message loop is active (e.g. for Eval).
+ */
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+
+ /* XXX: Allow customizing the pause and notify behavior at runtime
+ * using debugger runtime flags. For now the behavior is fixed using
+ * config options.
+ */
+
+ if (!duk_debug_is_attached(thr->heap) ||
+ thr->heap->dbg_processing ||
+ thr->heap->lj.type != DUK_LJ_TYPE_THROW ||
+ thr->heap->creating_error) {
+ DUK_D(DUK_DPRINT("skip debugger error integration; not attached, debugger processing, not THROW, or error thrown while creating error"));
+ return;
+ }
+
+ /* Don't intercept a DoubleError, we may have caused the initial double
+ * fault and attempting to intercept it will cause us to be called
+ * recursively and exhaust the C stack. (This should no longer happen
+ * for the initial throw because DoubleError path doesn't do a debugger
+ * integration check, but it might happen for rethrows.)
+ */
+ tv_obj = &thr->heap->lj.value1;
+ if (DUK_TVAL_IS_OBJECT(tv_obj) && DUK_TVAL_GET_OBJECT(tv_obj) == thr->builtins[DUK_BIDX_DOUBLE_ERROR]) {
+ DUK_D(DUK_DPRINT("built-in DoubleError instance (re)thrown, not intercepting"));
+ return;
+ }
+
+ uncaught = !duk__have_active_catcher(thr);
+
+ /* Debugger code expects the value at stack top. This also serves
+ * as a backup: we need to store/restore the longjmp state because
+ * when the debugger is paused Eval commands may be executed and
+ * they can arbitrarily clobber the longjmp state.
+ */
+ duk_push_tval(thr, tv_obj);
+
+ /* Store and reset longjmp state. */
+ DUK_ASSERT_LJSTATE_SET(thr->heap);
+ DUK_TVAL_DECREF_NORZ(thr, tv_obj);
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2)); /* Always for THROW type. */
+ DUK_TVAL_SET_UNDEFINED(tv_obj);
+ thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN;
+ DUK_ASSERT_LJSTATE_UNSET(thr->heap);
+
+#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)
+ /* Report it to the debug client */
+ DUK_D(DUK_DPRINT("throw with debugger attached, report to client"));
+ duk_debug_send_throw(thr, uncaught);
+#endif
+
+ if (uncaught) {
+ if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_UNCAUGHT_ERROR) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by uncaught error"));
+ duk_debug_halt_execution(thr, 1 /*use_prev_pc*/);
+ }
+ } else {
+ if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_CAUGHT_ERROR) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by caught error"));
+ duk_debug_halt_execution(thr, 1 /*use_prev_pc*/);
+ }
+ }
+
+ /* Restore longjmp state. */
+ DUK_ASSERT_LJSTATE_UNSET(thr->heap);
+ thr->heap->lj.type = DUK_LJ_TYPE_THROW;
+ tv_obj = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value1));
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2));
+ DUK_TVAL_SET_TVAL(&thr->heap->lj.value1, tv_obj);
+ DUK_TVAL_INCREF(thr, tv_obj);
+ DUK_ASSERT_LJSTATE_SET(thr->heap);
+
+ duk_pop(thr);
+}
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+/*
+ * Helpers for setting up heap longjmp state.
+ */
+
+DUK_INTERNAL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+ heap = thr->heap;
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(tv_val != NULL);
+
+ DUK_ASSERT_LJSTATE_UNSET(heap);
+
+ heap->lj.type = lj_type;
+ DUK_TVAL_SET_TVAL(&heap->lj.value1, tv_val);
+ DUK_TVAL_INCREF(thr, tv_val);
+
+ DUK_ASSERT_LJSTATE_SET(heap);
+}
+#line 1 "duk_error_throw.c"
+/*
+ * Create and throw an Ecmascript error object based on a code and a message.
+ *
+ * Used when we throw errors internally. Ecmascript generated error objects
+ * are created by Ecmascript code, and the throwing is handled by the bytecode
+ * executor.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Create and throw an error (originating from Duktape internally)
+ *
+ * Push an error object on top of the stack, possibly throw augmenting
+ * the error, and finally longjmp.
+ *
+ * If an error occurs while we're dealing with the current error, we might
+ * enter an infinite recursion loop. This is prevented by detecting a
+ * "double fault" through the heap->creating_error flag; the recursion
+ * then stops at the second level.
+ */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line) {
+#else
+DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code) {
+#endif
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ DUK_DD(DUK_DDPRINT("duk_err_create_and_throw(): code=%ld, msg=%s, filename=%s, line=%ld",
+ (long) code, (const char *) msg,
+ (const char *) filename, (long) line));
+#else
+ DUK_DD(DUK_DDPRINT("duk_err_create_and_throw(): code=%ld", (long) code));
+#endif
+
+ DUK_ASSERT(thr != NULL);
+
+ /* Even though nested call is possible because we throw an error when
+ * trying to create an error, the potential errors must happen before
+ * the longjmp state is configured.
+ */
+ DUK_ASSERT_LJSTATE_UNSET(thr->heap);
+
+ /* Sync so that augmentation sees up-to-date activations, NULL
+ * thr->ptr_curr_pc so that it's not used if side effects occur
+ * in augmentation or longjmp handling.
+ */
+ duk_hthread_sync_and_null_currpc(thr);
+
+ /*
+ * Create and push an error object onto the top of stack.
+ * The error is potentially augmented before throwing.
+ *
+ * If a "double error" occurs, use a fixed error instance
+ * to avoid further trouble.
+ */
+
+ if (thr->heap->creating_error) {
+ duk_tval tv_val;
+ duk_hobject *h_err;
+
+ thr->heap->creating_error = 0;
+
+ h_err = thr->builtins[DUK_BIDX_DOUBLE_ERROR];
+ if (h_err != NULL) {
+ DUK_D(DUK_DPRINT("double fault detected -> use built-in fixed 'double error' instance"));
+ DUK_TVAL_SET_OBJECT(&tv_val, h_err);
+ } else {
+ DUK_D(DUK_DPRINT("double fault detected; there is no built-in fixed 'double error' instance "
+ "-> use the error code as a number"));
+ DUK_TVAL_SET_I32(&tv_val, (duk_int32_t) code);
+ }
+
+ duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, &tv_val);
+
+ /* No augmentation to avoid any allocations or side effects. */
+ } else {
+ /* Prevent infinite recursion. Extra call stack and C
+ * recursion headroom (see GH-191) is added for augmentation.
+ * That is now signalled by heap->augmenting error and taken
+ * into account in call handling without an explicit limit bump.
+ */
+ thr->heap->creating_error = 1;
+
+ duk_require_stack(thr, 1);
+
+ /* XXX: usually unnecessary '%s' formatting here, but cannot
+ * use 'msg' as a format string directly.
+ */
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ duk_push_error_object_raw(thr,
+ code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE,
+ filename,
+ line,
+ "%s",
+ (const char *) msg);
+#else
+ duk_push_error_object_raw(thr,
+ code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE,
+ NULL,
+ 0,
+ NULL);
+#endif
+
+ /* Note that an alloc error may happen during error augmentation.
+ * This may happen both when the original error is an alloc error
+ * and when it's something else. Because any error in augmentation
+ * must be handled correctly anyway, there's no special check for
+ * avoiding it for alloc errors (this differs from Duktape 1.x).
+ */
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+ DUK_DDD(DUK_DDDPRINT("THROW ERROR (INTERNAL): %!iT (before throw augment)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_err_augment_error_throw(thr);
+#endif
+
+ duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1));
+ thr->heap->creating_error = 0;
+
+ /* Error is now created and we assume no errors can occur any
+ * more. Check for debugger Throw integration only when the
+ * error is complete. If we enter debugger message loop,
+ * creating_error must be 0 so that errors can be thrown in
+ * the paused state, e.g. in Eval commands.
+ */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_err_check_debugger_integration(thr);
+#endif
+ }
+
+ /*
+ * Finally, longjmp
+ */
+
+ DUK_DDD(DUK_DDDPRINT("THROW ERROR (INTERNAL): %!iT, %!iT (after throw augment)",
+ (duk_tval *) &thr->heap->lj.value1, (duk_tval *) &thr->heap->lj.value2));
+
+ duk_err_longjmp(thr);
+ DUK_UNREACHABLE();
+}
+
+/*
+ * Helper for C function call negative return values.
+ */
+
+DUK_INTERNAL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(rc < 0);
+
+ /*
+ * The __FILE__ and __LINE__ information is intentionally not used in the
+ * creation of the error object, as it isn't useful in the tracedata. The
+ * tracedata still contains the function which returned the negative return
+ * code, and having the file/line of this function isn't very useful.
+ *
+ * The error messages for DUK_RET_xxx shorthand are intentionally very
+ * minimal: they're only really useful for low memory targets.
+ */
+
+ duk_error_raw(thr, -rc, NULL, 0, "error (rc %ld)", (long) rc);
+ DUK_UNREACHABLE();
+}
+#line 1 "duk_hbuffer_alloc.c"
+/*
+ * duk_hbuffer allocation and freeing.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Allocate a new duk_hbuffer of a certain type and return a pointer to it
+ * (NULL on error). Write buffer data pointer to 'out_bufdata' (only if
+ * allocation successful).
+ */
+DUK_INTERNAL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata) {
+ duk_hbuffer *res = NULL;
+ duk_size_t header_size;
+ duk_size_t alloc_size;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(out_bufdata != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("allocate hbuffer"));
+
+ /* Size sanity check. Should not be necessary because caller is
+ * required to check this, but we don't want to cause a segfault
+ * if the size wraps either in duk_size_t computation or when
+ * storing the size in a 16-bit field.
+ */
+ if (size > DUK_HBUFFER_MAX_BYTELEN) {
+ DUK_D(DUK_DPRINT("hbuffer alloc failed: size too large: %ld", (long) size));
+ return NULL; /* no need to write 'out_bufdata' */
+ }
+
+ if (flags & DUK_BUF_FLAG_EXTERNAL) {
+ header_size = sizeof(duk_hbuffer_external);
+ alloc_size = sizeof(duk_hbuffer_external);
+ } else if (flags & DUK_BUF_FLAG_DYNAMIC) {
+ header_size = sizeof(duk_hbuffer_dynamic);
+ alloc_size = sizeof(duk_hbuffer_dynamic);
+ } else {
+ header_size = sizeof(duk_hbuffer_fixed);
+ alloc_size = sizeof(duk_hbuffer_fixed) + size;
+ DUK_ASSERT(alloc_size >= sizeof(duk_hbuffer_fixed)); /* no wrapping */
+ }
+
+ res = (duk_hbuffer *) DUK_ALLOC(heap, alloc_size);
+ if (DUK_UNLIKELY(res == NULL)) {
+ goto alloc_error;
+ }
+
+ /* zero everything unless requested not to do so */
+#if defined(DUK_USE_ZERO_BUFFER_DATA)
+ DUK_MEMZERO((void *) res,
+ (flags & DUK_BUF_FLAG_NOZERO) ? header_size : alloc_size);
+#else
+ DUK_MEMZERO((void *) res, header_size);
+#endif
+
+ if (flags & DUK_BUF_FLAG_EXTERNAL) {
+ duk_hbuffer_external *h;
+ h = (duk_hbuffer_external *) res;
+ DUK_UNREF(h);
+ *out_bufdata = NULL;
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+#if defined(DUK_USE_HEAPPTR16)
+/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */
+#else
+ DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap, h, NULL);
+#endif
+#endif
+ DUK_ASSERT(DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap, h) == NULL);
+ } else if (flags & DUK_BUF_FLAG_DYNAMIC) {
+ duk_hbuffer_dynamic *h = (duk_hbuffer_dynamic *) res;
+ void *ptr;
+
+ if (size > 0) {
+ DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); /* alloc external with size zero */
+ DUK_DDD(DUK_DDDPRINT("dynamic buffer with nonzero size, alloc actual buffer"));
+#if defined(DUK_USE_ZERO_BUFFER_DATA)
+ ptr = DUK_ALLOC_ZEROED(heap, size);
+#else
+ ptr = DUK_ALLOC(heap, size);
+#endif
+ if (DUK_UNLIKELY(ptr == NULL)) {
+ /* Because size > 0, NULL check is correct */
+ goto alloc_error;
+ }
+ *out_bufdata = ptr;
+
+ DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, ptr);
+ } else {
+ *out_bufdata = NULL;
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+#if defined(DUK_USE_HEAPPTR16)
+/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */
+#else
+ DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, NULL);
+#endif
+#endif
+ DUK_ASSERT(DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, h) == NULL);
+ }
+ } else {
+ *out_bufdata = (void *) ((duk_hbuffer_fixed *) res + 1);
+ }
+
+ DUK_HBUFFER_SET_SIZE(res, size);
+
+ DUK_HEAPHDR_SET_TYPE(&res->hdr, DUK_HTYPE_BUFFER);
+ if (flags & DUK_BUF_FLAG_DYNAMIC) {
+ DUK_HBUFFER_SET_DYNAMIC(res);
+ if (flags & DUK_BUF_FLAG_EXTERNAL) {
+ DUK_HBUFFER_SET_EXTERNAL(res);
+ }
+ } else {
+ DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL));
+ }
+ DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &res->hdr);
+
+ DUK_DDD(DUK_DDDPRINT("allocated hbuffer: %p", (void *) res));
+ return res;
+
+ alloc_error:
+ DUK_DD(DUK_DDPRINT("hbuffer allocation failed"));
+
+ DUK_FREE(heap, res);
+ return NULL; /* no need to write 'out_bufdata' */
+}
+
+/* For indirect allocs. */
+
+DUK_INTERNAL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud) {
+ duk_hbuffer_dynamic *buf = (duk_hbuffer_dynamic *) ud;
+ DUK_UNREF(heap);
+ return (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, buf);
+}
+#line 1 "duk_hbuffer_ops.c"
+/*
+ * duk_hbuffer operations such as resizing and inserting/appending data to
+ * a dynamic buffer.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Resizing
+ */
+
+DUK_INTERNAL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size) {
+ void *res;
+ duk_size_t prev_size;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(buf != NULL);
+ DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf));
+ DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf));
+
+ /*
+ * Maximum size check
+ */
+
+ if (new_size > DUK_HBUFFER_MAX_BYTELEN) {
+ DUK_ERROR_RANGE(thr, "buffer too long");
+ }
+
+ /*
+ * Note: use indirect realloc variant just in case mark-and-sweep
+ * (finalizers) might resize this same buffer during garbage
+ * collection.
+ */
+
+ res = DUK_REALLOC_INDIRECT(thr->heap, duk_hbuffer_get_dynalloc_ptr, (void *) buf, new_size);
+ if (DUK_LIKELY(res != NULL || new_size == 0)) {
+ /* 'res' may be NULL if new allocation size is 0. */
+
+ DUK_DDD(DUK_DDDPRINT("resized dynamic buffer %p:%ld -> %p:%ld",
+ (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, buf),
+ (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(buf),
+ (void *) res,
+ (long) new_size));
+
+ /*
+ * The entire allocated buffer area, regardless of actual used
+ * size, is kept zeroed in resizes for simplicity. If the buffer
+ * is grown, zero the new part.
+ */
+
+ prev_size = DUK_HBUFFER_DYNAMIC_GET_SIZE(buf);
+ if (new_size > prev_size) {
+ DUK_ASSERT(new_size - prev_size > 0);
+#if defined(DUK_USE_ZERO_BUFFER_DATA)
+ DUK_MEMZERO((void *) ((char *) res + prev_size),
+ (duk_size_t) (new_size - prev_size));
+#endif
+ }
+
+ DUK_HBUFFER_DYNAMIC_SET_SIZE(buf, new_size);
+ DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(thr->heap, buf, res);
+ } else {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+
+ DUK_ASSERT(res != NULL || new_size == 0);
+}
+
+DUK_INTERNAL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(buf != NULL);
+ DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf));
+ DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf));
+
+ duk_hbuffer_resize(thr, buf, 0);
+}
+/* #include duk_internal.h -> already included */
+#line 2 "duk_hbufobj_misc.c"
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len) {
+ duk_uint_t buf_size;
+ duk_uint_t buf_avail;
+
+ DUK_ASSERT(h_bufobj != NULL);
+ DUK_ASSERT(h_bufobj->buf != NULL);
+
+ buf_size = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_bufobj->buf);
+ if (h_bufobj->offset > buf_size) {
+ /* Slice starting point is beyond current length. */
+ return 0;
+ }
+ buf_avail = buf_size - h_bufobj->offset;
+
+ return buf_avail >= len ? len : buf_avail;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+#line 1 "duk_heap_alloc.c"
+/*
+ * duk_heap allocation and freeing.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_ROM_STRINGS)
+/* Fixed seed value used with ROM strings. */
+#define DUK__FIXED_HASH_SEED 0xabcd1234
+#endif
+
+/*
+ * Free a heap object.
+ *
+ * Free heap object and its internal (non-heap) pointers. Assumes that
+ * caller has removed the object from heap allocated list or the string
+ * intern table, and any weak references (which strings may have) have
+ * been already dealt with.
+ */
+
+DUK_INTERNAL void duk_free_hobject(duk_heap *heap, duk_hobject *h) {
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(h != NULL);
+
+ DUK_FREE(heap, DUK_HOBJECT_GET_PROPS(heap, h));
+
+ if (DUK_HOBJECT_IS_COMPFUNC(h)) {
+ duk_hcompfunc *f = (duk_hcompfunc *) h;
+ DUK_UNREF(f);
+ /* Currently nothing to free; 'data' is a heap object */
+ } else if (DUK_HOBJECT_IS_NATFUNC(h)) {
+ duk_hnatfunc *f = (duk_hnatfunc *) h;
+ DUK_UNREF(f);
+ /* Currently nothing to free */
+ } else if (DUK_HOBJECT_IS_THREAD(h)) {
+ duk_hthread *t = (duk_hthread *) h;
+ duk_activation *act;
+
+ DUK_FREE(heap, t->valstack);
+
+ /* Don't free h->resumer because it exists in the heap.
+ * Callstack entries also contain function pointers which
+ * are not freed for the same reason. They are decref
+ * finalized and the targets are freed if necessary based
+ * on their refcount (or reachability).
+ */
+ for (act = t->callstack_curr; act != NULL;) {
+ duk_activation *act_next;
+ duk_catcher *cat;
+
+ for (cat = act->cat; cat != NULL;) {
+ duk_catcher *cat_next;
+
+ cat_next = cat->parent;
+ DUK_FREE(heap, (void *) cat);
+ cat = cat_next;
+ }
+
+ act_next = act->parent;
+ DUK_FREE(heap, (void *) act);
+ act = act_next;
+ }
+
+ /* XXX: with 'caller' property the callstack would need
+ * to be unwound to update the 'caller' properties of
+ * functions in the callstack.
+ */
+ } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) {
+ duk_hboundfunc *f = (duk_hboundfunc *) h;
+
+ DUK_FREE(heap, f->args);
+ }
+
+ DUK_FREE(heap, (void *) h);
+}
+
+DUK_INTERNAL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h) {
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(h != NULL);
+
+ if (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h)) {
+ duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h;
+ DUK_DDD(DUK_DDDPRINT("free dynamic buffer %p", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g)));
+ DUK_FREE(heap, DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g));
+ }
+ DUK_FREE(heap, (void *) h);
+}
+
+DUK_INTERNAL void duk_free_hstring(duk_heap *heap, duk_hstring *h) {
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(h != NULL);
+
+ DUK_UNREF(heap);
+ DUK_UNREF(h);
+
+#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_FREE)
+ if (DUK_HSTRING_HAS_EXTDATA(h)) {
+ DUK_DDD(DUK_DDDPRINT("free extstr: hstring %!O, extdata: %p",
+ h, DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h)));
+ DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h));
+ }
+#endif
+ DUK_FREE(heap, (void *) h);
+}
+
+DUK_INTERNAL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr) {
+ DUK_ASSERT(heap);
+ DUK_ASSERT(hdr);
+
+ DUK_DDD(DUK_DDDPRINT("free heaphdr %p, htype %ld", (void *) hdr, (long) DUK_HEAPHDR_GET_TYPE(hdr)));
+
+ switch (DUK_HEAPHDR_GET_TYPE(hdr)) {
+ case DUK_HTYPE_STRING:
+ duk_free_hstring(heap, (duk_hstring *) hdr);
+ break;
+ case DUK_HTYPE_OBJECT:
+ duk_free_hobject(heap, (duk_hobject *) hdr);
+ break;
+ default:
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) == DUK_HTYPE_BUFFER);
+ duk_free_hbuffer(heap, (duk_hbuffer *) hdr);
+ }
+
+}
+
+/*
+ * Free the heap.
+ *
+ * Frees heap-related non-heap-tracked allocations such as the
+ * string intern table; then frees the heap allocated objects;
+ * and finally frees the heap structure itself. Reference counts
+ * and GC markers are ignored (and not updated) in this process,
+ * and finalizers won't be called.
+ *
+ * The heap pointer and heap object pointers must not be used
+ * after this call.
+ */
+
+#if defined(DUK_USE_CACHE_ACTIVATION)
+DUK_LOCAL duk_size_t duk__heap_free_activation_freelist(duk_heap *heap) {
+ duk_activation *act;
+ duk_activation *act_next;
+ duk_size_t count_act = 0;
+
+ for (act = heap->activation_free; act != NULL;) {
+ act_next = act->parent;
+ DUK_FREE(heap, (void *) act);
+ act = act_next;
+#if defined(DUK_USE_DEBUG)
+ count_act++;
+#endif
+ }
+ heap->activation_free = NULL; /* needed when called from mark-and-sweep */
+ return count_act;
+}
+#endif /* DUK_USE_CACHE_ACTIVATION */
+
+#if defined(DUK_USE_CACHE_CATCHER)
+DUK_LOCAL duk_size_t duk__heap_free_catcher_freelist(duk_heap *heap) {
+ duk_catcher *cat;
+ duk_catcher *cat_next;
+ duk_size_t count_cat = 0;
+
+ for (cat = heap->catcher_free; cat != NULL;) {
+ cat_next = cat->parent;
+ DUK_FREE(heap, (void *) cat);
+ cat = cat_next;
+#if defined(DUK_USE_DEBUG)
+ count_cat++;
+#endif
+ }
+ heap->catcher_free = NULL; /* needed when called from mark-and-sweep */
+
+ return count_cat;
+}
+#endif /* DUK_USE_CACHE_CATCHER */
+
+DUK_INTERNAL void duk_heap_free_freelists(duk_heap *heap) {
+ duk_size_t count_act = 0;
+ duk_size_t count_cat = 0;
+
+#if defined(DUK_USE_CACHE_ACTIVATION)
+ count_act = duk__heap_free_activation_freelist(heap);
+#endif
+#if defined(DUK_USE_CACHE_CATCHER)
+ count_cat = duk__heap_free_catcher_freelist(heap);
+#endif
+ DUK_UNREF(heap);
+ DUK_UNREF(count_act);
+ DUK_UNREF(count_cat);
+
+ DUK_D(DUK_DPRINT("freed %ld activation freelist entries, %ld catcher freelist entries",
+ (long) count_act, (long) count_cat));
+}
+
+DUK_LOCAL void duk__free_allocated(duk_heap *heap) {
+ duk_heaphdr *curr;
+ duk_heaphdr *next;
+
+ curr = heap->heap_allocated;
+ while (curr) {
+ /* We don't log or warn about freeing zero refcount objects
+ * because they may happen with finalizer processing.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("FINALFREE (allocated): %!iO",
+ (duk_heaphdr *) curr));
+ next = DUK_HEAPHDR_GET_NEXT(heap, curr);
+ duk_heap_free_heaphdr_raw(heap, curr);
+ curr = next;
+ }
+}
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_LOCAL void duk__free_finalize_list(duk_heap *heap) {
+ duk_heaphdr *curr;
+ duk_heaphdr *next;
+
+ curr = heap->finalize_list;
+ while (curr) {
+ DUK_DDD(DUK_DDDPRINT("FINALFREE (finalize_list): %!iO",
+ (duk_heaphdr *) curr));
+ next = DUK_HEAPHDR_GET_NEXT(heap, curr);
+ duk_heap_free_heaphdr_raw(heap, curr);
+ curr = next;
+ }
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+DUK_LOCAL void duk__free_stringtable(duk_heap *heap) {
+ /* strings are only tracked by stringtable */
+ duk_heap_strtable_free(heap);
+}
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_LOCAL void duk__free_run_finalizers(duk_heap *heap) {
+ duk_heaphdr *curr;
+ duk_uint_t round_no;
+ duk_size_t count_all;
+ duk_size_t count_finalized;
+ duk_size_t curr_limit;
+
+ DUK_ASSERT(heap != NULL);
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* refzero not running -> must be empty */
+#endif
+ DUK_ASSERT(heap->finalize_list == NULL); /* mark-and-sweep last pass */
+
+ if (heap->heap_thread == NULL) {
+ /* May happen when heap allocation fails right off. There
+ * cannot be any finalizable objects in this case.
+ */
+ DUK_D(DUK_DPRINT("no heap_thread in heap destruct, assume no finalizable objects"));
+ return;
+ }
+
+ /* Prevent finalize_list processing and mark-and-sweep entirely.
+ * Setting ms_running = 1 also prevents refzero handling from moving
+ * objects away from the heap_allocated list (the flag name is a bit
+ * misleading here).
+ */
+ DUK_ASSERT(heap->pf_prevent_count == 0);
+ heap->pf_prevent_count = 1;
+ DUK_ASSERT(heap->ms_running == 0);
+ heap->ms_running = 1;
+ DUK_ASSERT(heap->ms_prevent_count == 0);
+ heap->ms_prevent_count = 1; /* Bump, because mark-and-sweep assumes it's bumped when ms_running is set. */
+
+ curr_limit = 0; /* suppress warning, not used */
+ for (round_no = 0; ; round_no++) {
+ curr = heap->heap_allocated;
+ count_all = 0;
+ count_finalized = 0;
+ while (curr) {
+ count_all++;
+ if (DUK_HEAPHDR_IS_OBJECT(curr)) {
+ /* Only objects in heap_allocated may have finalizers. Check that
+ * the object itself has a _Finalizer property (own or inherited)
+ * so that we don't execute finalizers for e.g. Proxy objects.
+ */
+ DUK_ASSERT(curr != NULL);
+
+ if (DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) curr)) {
+ if (!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) curr)) {
+ DUK_ASSERT(DUK_HEAP_HAS_FINALIZER_NORESCUE(heap)); /* maps to finalizer 2nd argument */
+ duk_heap_run_finalizer(heap, (duk_hobject *) curr);
+ count_finalized++;
+ }
+ }
+ }
+ curr = DUK_HEAPHDR_GET_NEXT(heap, curr);
+ }
+
+ /* Each round of finalizer execution may spawn new finalizable objects
+ * which is normal behavior for some applications. Allow multiple
+ * rounds of finalization, but use a shrinking limit based on the
+ * first round to detect the case where a runaway finalizer creates
+ * an unbounded amount of new finalizable objects. Finalizer rescue
+ * is not supported: the semantics are unclear because most of the
+ * objects being finalized here are already reachable. The finalizer
+ * is given a boolean to indicate that rescue is not possible.
+ *
+ * See discussion in: https://github.com/svaarala/duktape/pull/473
+ */
+
+ if (round_no == 0) {
+ /* Cannot wrap: each object is at least 8 bytes so count is
+ * at most 1/8 of that.
+ */
+ curr_limit = count_all * 2;
+ } else {
+ curr_limit = (curr_limit * 3) / 4; /* Decrease by 25% every round */
+ }
+ DUK_D(DUK_DPRINT("finalizer round %ld complete, %ld objects, tried to execute %ld finalizers, current limit is %ld",
+ (long) round_no, (long) count_all, (long) count_finalized, (long) curr_limit));
+
+ if (count_finalized == 0) {
+ DUK_D(DUK_DPRINT("no more finalizable objects, forced finalization finished"));
+ break;
+ }
+ if (count_finalized >= curr_limit) {
+ DUK_D(DUK_DPRINT("finalizer count above limit, potentially runaway finalizer; skip remaining finalizers"));
+ break;
+ }
+ }
+
+ DUK_ASSERT(heap->ms_running == 1);
+ heap->ms_running = 0;
+ DUK_ASSERT(heap->pf_prevent_count == 1);
+ heap->pf_prevent_count = 0;
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+DUK_INTERNAL void duk_heap_free(duk_heap *heap) {
+ DUK_D(DUK_DPRINT("free heap: %p", (void *) heap));
+
+#if defined(DUK_USE_DEBUG)
+ duk_heap_strtable_dump(heap);
+#endif
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ /* Detach a debugger if attached (can be called multiple times)
+ * safely.
+ */
+ /* XXX: Add a flag to reject an attempt to re-attach? Otherwise
+ * the detached callback may immediately reattach.
+ */
+ duk_debug_do_detach(heap);
+#endif
+
+ /* Execute finalizers before freeing the heap, even for reachable
+ * objects. This gives finalizers the chance to free any native
+ * resources like file handles, allocations made outside Duktape,
+ * etc. This is quite tricky to get right, so that all finalizer
+ * guarantees are honored.
+ *
+ * Run mark-and-sweep a few times just in case (unreachable object
+ * finalizers run already here). The last round must rescue objects
+ * from the previous round without running any more finalizers. This
+ * ensures rescued objects get their FINALIZED flag cleared so that
+ * their finalizer is called once more in forced finalization to
+ * satisfy finalizer guarantees. However, we don't want to run any
+ * more finalizers because that'd required one more loop, and so on.
+ *
+ * XXX: this perhaps requires an execution time limit.
+ */
+ DUK_D(DUK_DPRINT("execute finalizers before freeing heap"));
+ DUK_ASSERT(heap->pf_skip_finalizers == 0);
+ DUK_D(DUK_DPRINT("forced gc #1 in heap destruction"));
+ duk_heap_mark_and_sweep(heap, 0);
+ DUK_D(DUK_DPRINT("forced gc #2 in heap destruction"));
+ duk_heap_mark_and_sweep(heap, 0);
+ DUK_D(DUK_DPRINT("forced gc #3 in heap destruction (don't run finalizers)"));
+ heap->pf_skip_finalizers = 1;
+ duk_heap_mark_and_sweep(heap, 0); /* Skip finalizers; queue finalizable objects to heap_allocated. */
+
+ /* There are never objects in refzero_list at this point, or at any
+ * point beyond a DECREF (even a DECREF_NORZ). Since Duktape 2.1
+ * refzero_list processing is side effect free, so it is always
+ * processed to completion by a DECREF initially triggering a zero
+ * refcount.
+ */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* Always processed to completion inline. */
+#endif
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ DUK_ASSERT(heap->finalize_list == NULL); /* Last mark-and-sweep with skip_finalizers. */
+#endif
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ DUK_D(DUK_DPRINT("run finalizers for remaining finalizable objects"));
+ DUK_HEAP_SET_FINALIZER_NORESCUE(heap); /* Rescue no longer supported. */
+ duk__free_run_finalizers(heap);
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+ /* Note: heap->heap_thread, heap->curr_thread, and heap->heap_object
+ * are on the heap allocated list.
+ */
+
+ DUK_D(DUK_DPRINT("freeing temporary freelists"));
+ duk_heap_free_freelists(heap);
+
+ DUK_D(DUK_DPRINT("freeing heap_allocated of heap: %p", (void *) heap));
+ duk__free_allocated(heap);
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* Always processed to completion inline. */
+#endif
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ DUK_D(DUK_DPRINT("freeing finalize_list of heap: %p", (void *) heap));
+ duk__free_finalize_list(heap);
+#endif
+
+ DUK_D(DUK_DPRINT("freeing string table of heap: %p", (void *) heap));
+ duk__free_stringtable(heap);
+
+ DUK_D(DUK_DPRINT("freeing heap structure: %p", (void *) heap));
+ heap->free_func(heap->heap_udata, heap);
+}
+
+/*
+ * Allocate a heap.
+ *
+ * String table is initialized with built-in strings from genbuiltins.py,
+ * either by dynamically creating the strings or by referring to ROM strings.
+ */
+
+#if defined(DUK_USE_ROM_STRINGS)
+DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_small_uint_t i;
+#endif
+
+ DUK_UNREF(heap);
+
+ /* With ROM-based strings, heap->strs[] and thr->strs[] are omitted
+ * so nothing to initialize for strs[].
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ for (i = 0; i < sizeof(duk_rom_strings_lookup) / sizeof(const duk_hstring *); i++) {
+ const duk_hstring *h;
+ duk_uint32_t hash;
+
+ h = duk_rom_strings_lookup[i];
+ while (h != NULL) {
+ hash = duk_heap_hashstring(heap, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));
+ DUK_DD(DUK_DDPRINT("duk_rom_strings_lookup[%d] -> hash 0x%08lx, computed 0x%08lx",
+ (int) i, (unsigned long) DUK_HSTRING_GET_HASH(h), (unsigned long) hash));
+ DUK_ASSERT(hash == (duk_uint32_t) DUK_HSTRING_GET_HASH(h));
+
+ h = (const duk_hstring *) h->hdr.h_next;
+ }
+ }
+#endif
+ return 1;
+}
+#else /* DUK_USE_ROM_STRINGS */
+
+DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) {
+ duk_bitdecoder_ctx bd_ctx;
+ duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */
+ duk_small_uint_t i;
+
+ DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));
+ bd->data = (const duk_uint8_t *) duk_strings_data;
+ bd->length = (duk_size_t) DUK_STRDATA_DATA_LENGTH;
+
+ for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) {
+ duk_uint8_t tmp[DUK_STRDATA_MAX_STRLEN];
+ duk_small_uint_t len;
+ duk_hstring *h;
+
+ len = duk_bd_decode_bitpacked_string(bd, tmp);
+
+ /* No need to length check string: it will never exceed even
+ * the 16-bit length maximum.
+ */
+ DUK_ASSERT(len <= 0xffffUL);
+ DUK_DDD(DUK_DDDPRINT("intern built-in string %ld", (long) i));
+ h = duk_heap_strtable_intern(heap, tmp, len);
+ if (!h) {
+ goto failed;
+ }
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h));
+
+ /* Special flags checks. Since these strings are always
+ * reachable and a string cannot appear twice in the string
+ * table, there's no need to check/set these flags elsewhere.
+ * The 'internal' flag is set by string intern code.
+ */
+ if (i == DUK_STRIDX_EVAL || i == DUK_STRIDX_LC_ARGUMENTS) {
+ DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(h);
+ }
+ if (i >= DUK_STRIDX_START_RESERVED && i < DUK_STRIDX_END_RESERVED) {
+ DUK_HSTRING_SET_RESERVED_WORD(h);
+ if (i >= DUK_STRIDX_START_STRICT_RESERVED) {
+ DUK_HSTRING_SET_STRICT_RESERVED_WORD(h);
+ }
+ }
+
+ DUK_DDD(DUK_DDDPRINT("interned: %!O", (duk_heaphdr *) h));
+
+ /* XXX: The incref macro takes a thread pointer but doesn't
+ * use it right now.
+ */
+ DUK_HSTRING_INCREF(_never_referenced_, h);
+
+#if defined(DUK_USE_HEAPPTR16)
+ heap->strs16[i] = DUK_USE_HEAPPTR_ENC16(heap->heap_udata, (void *) h);
+#else
+ heap->strs[i] = h;
+#endif
+ }
+
+ return 1;
+
+ failed:
+ return 0;
+}
+#endif /* DUK_USE_ROM_STRINGS */
+
+DUK_LOCAL duk_bool_t duk__init_heap_thread(duk_heap *heap) {
+ duk_hthread *thr;
+
+ DUK_D(DUK_DPRINT("heap init: alloc heap thread"));
+ thr = duk_hthread_alloc_unchecked(heap,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));
+ if (thr == NULL) {
+ DUK_D(DUK_DPRINT("failed to alloc heap_thread"));
+ return 0;
+ }
+ thr->state = DUK_HTHREAD_STATE_INACTIVE;
+#if defined(DUK_USE_ROM_STRINGS)
+ /* No strs[] pointer. */
+#else /* DUK_USE_ROM_STRINGS */
+#if defined(DUK_USE_HEAPPTR16)
+ thr->strs16 = heap->strs16;
+#else
+ thr->strs = heap->strs;
+#endif
+#endif /* DUK_USE_ROM_STRINGS */
+
+ heap->heap_thread = thr;
+ DUK_HTHREAD_INCREF(thr, thr); /* Note: first argument not really used */
+
+ /* 'thr' is now reachable */
+
+ DUK_D(DUK_DPRINT("heap init: init heap thread stacks"));
+ if (!duk_hthread_init_stacks(heap, thr)) {
+ return 0;
+ }
+
+ /* XXX: this may now fail, and is not handled correctly */
+ duk_hthread_create_builtin_objects(thr);
+
+ /* default prototype */
+ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) thr, thr->builtins[DUK_BIDX_THREAD_PROTOTYPE]);
+
+ return 1;
+}
+
+#if defined(DUK_USE_DEBUG)
+#define DUK__DUMPSZ(t) do { \
+ DUK_D(DUK_DPRINT("" #t "=%ld", (long) sizeof(t))); \
+ } while (0)
+
+/* These is not 100% because format would need to be non-portable "long long".
+ * Also print out as doubles to catch cases where the "long" type is not wide
+ * enough; the limits will then not be printed accurately but the magnitude
+ * will be correct.
+ */
+#define DUK__DUMPLM_SIGNED_RAW(t,a,b) do { \
+ DUK_D(DUK_DPRINT(t "=[%ld,%ld]=[%lf,%lf]", \
+ (long) (a), (long) (b), \
+ (double) (a), (double) (b))); \
+ } while (0)
+#define DUK__DUMPLM_UNSIGNED_RAW(t,a,b) do { \
+ DUK_D(DUK_DPRINT(t "=[%lu,%lu]=[%lf,%lf]", \
+ (unsigned long) (a), (unsigned long) (b), \
+ (double) (a), (double) (b))); \
+ } while (0)
+#define DUK__DUMPLM_SIGNED(t) do { \
+ DUK__DUMPLM_SIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \
+ } while (0)
+#define DUK__DUMPLM_UNSIGNED(t) do { \
+ DUK__DUMPLM_UNSIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \
+ } while (0)
+
+DUK_LOCAL void duk__dump_type_sizes(void) {
+ DUK_D(DUK_DPRINT("sizeof()"));
+
+ /* basic platform types */
+ DUK__DUMPSZ(char);
+ DUK__DUMPSZ(short);
+ DUK__DUMPSZ(int);
+ DUK__DUMPSZ(long);
+ DUK__DUMPSZ(double);
+ DUK__DUMPSZ(void *);
+ DUK__DUMPSZ(size_t);
+
+ /* basic types from duk_features.h */
+ DUK__DUMPSZ(duk_uint8_t);
+ DUK__DUMPSZ(duk_int8_t);
+ DUK__DUMPSZ(duk_uint16_t);
+ DUK__DUMPSZ(duk_int16_t);
+ DUK__DUMPSZ(duk_uint32_t);
+ DUK__DUMPSZ(duk_int32_t);
+ DUK__DUMPSZ(duk_uint64_t);
+ DUK__DUMPSZ(duk_int64_t);
+ DUK__DUMPSZ(duk_uint_least8_t);
+ DUK__DUMPSZ(duk_int_least8_t);
+ DUK__DUMPSZ(duk_uint_least16_t);
+ DUK__DUMPSZ(duk_int_least16_t);
+ DUK__DUMPSZ(duk_uint_least32_t);
+ DUK__DUMPSZ(duk_int_least32_t);
+#if defined(DUK_USE_64BIT_OPS)
+ DUK__DUMPSZ(duk_uint_least64_t);
+ DUK__DUMPSZ(duk_int_least64_t);
+#endif
+ DUK__DUMPSZ(duk_uint_fast8_t);
+ DUK__DUMPSZ(duk_int_fast8_t);
+ DUK__DUMPSZ(duk_uint_fast16_t);
+ DUK__DUMPSZ(duk_int_fast16_t);
+ DUK__DUMPSZ(duk_uint_fast32_t);
+ DUK__DUMPSZ(duk_int_fast32_t);
+#if defined(DUK_USE_64BIT_OPS)
+ DUK__DUMPSZ(duk_uint_fast64_t);
+ DUK__DUMPSZ(duk_int_fast64_t);
+#endif
+ DUK__DUMPSZ(duk_uintptr_t);
+ DUK__DUMPSZ(duk_intptr_t);
+ DUK__DUMPSZ(duk_uintmax_t);
+ DUK__DUMPSZ(duk_intmax_t);
+ DUK__DUMPSZ(duk_double_t);
+
+ /* important chosen base types */
+ DUK__DUMPSZ(duk_int_t);
+ DUK__DUMPSZ(duk_uint_t);
+ DUK__DUMPSZ(duk_int_fast_t);
+ DUK__DUMPSZ(duk_uint_fast_t);
+ DUK__DUMPSZ(duk_small_int_t);
+ DUK__DUMPSZ(duk_small_uint_t);
+ DUK__DUMPSZ(duk_small_int_fast_t);
+ DUK__DUMPSZ(duk_small_uint_fast_t);
+
+ /* some derived types */
+ DUK__DUMPSZ(duk_codepoint_t);
+ DUK__DUMPSZ(duk_ucodepoint_t);
+ DUK__DUMPSZ(duk_idx_t);
+ DUK__DUMPSZ(duk_errcode_t);
+ DUK__DUMPSZ(duk_uarridx_t);
+
+ /* tval */
+ DUK__DUMPSZ(duk_double_union);
+ DUK__DUMPSZ(duk_tval);
+
+ /* structs from duk_forwdecl.h */
+ DUK__DUMPSZ(duk_jmpbuf); /* just one 'int' for C++ exceptions */
+ DUK__DUMPSZ(duk_heaphdr);
+ DUK__DUMPSZ(duk_heaphdr_string);
+ DUK__DUMPSZ(duk_hstring);
+ DUK__DUMPSZ(duk_hstring_external);
+ DUK__DUMPSZ(duk_hobject);
+ DUK__DUMPSZ(duk_harray);
+ DUK__DUMPSZ(duk_hcompfunc);
+ DUK__DUMPSZ(duk_hnatfunc);
+ DUK__DUMPSZ(duk_hdecenv);
+ DUK__DUMPSZ(duk_hobjenv);
+ DUK__DUMPSZ(duk_hthread);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ DUK__DUMPSZ(duk_hbufobj);
+#endif
+ DUK__DUMPSZ(duk_hproxy);
+ DUK__DUMPSZ(duk_hbuffer);
+ DUK__DUMPSZ(duk_hbuffer_fixed);
+ DUK__DUMPSZ(duk_hbuffer_dynamic);
+ DUK__DUMPSZ(duk_hbuffer_external);
+ DUK__DUMPSZ(duk_propaccessor);
+ DUK__DUMPSZ(duk_propvalue);
+ DUK__DUMPSZ(duk_propdesc);
+ DUK__DUMPSZ(duk_heap);
+ DUK__DUMPSZ(duk_activation);
+ DUK__DUMPSZ(duk_catcher);
+ DUK__DUMPSZ(duk_strcache);
+ DUK__DUMPSZ(duk_ljstate);
+ DUK__DUMPSZ(duk_fixedbuffer);
+ DUK__DUMPSZ(duk_bitdecoder_ctx);
+ DUK__DUMPSZ(duk_bitencoder_ctx);
+ DUK__DUMPSZ(duk_token);
+ DUK__DUMPSZ(duk_re_token);
+ DUK__DUMPSZ(duk_lexer_point);
+ DUK__DUMPSZ(duk_lexer_ctx);
+ DUK__DUMPSZ(duk_compiler_instr);
+ DUK__DUMPSZ(duk_compiler_func);
+ DUK__DUMPSZ(duk_compiler_ctx);
+ DUK__DUMPSZ(duk_re_matcher_ctx);
+ DUK__DUMPSZ(duk_re_compiler_ctx);
+}
+DUK_LOCAL void duk__dump_type_limits(void) {
+ DUK_D(DUK_DPRINT("limits"));
+
+ /* basic types */
+ DUK__DUMPLM_SIGNED(INT8);
+ DUK__DUMPLM_UNSIGNED(UINT8);
+ DUK__DUMPLM_SIGNED(INT_FAST8);
+ DUK__DUMPLM_UNSIGNED(UINT_FAST8);
+ DUK__DUMPLM_SIGNED(INT_LEAST8);
+ DUK__DUMPLM_UNSIGNED(UINT_LEAST8);
+ DUK__DUMPLM_SIGNED(INT16);
+ DUK__DUMPLM_UNSIGNED(UINT16);
+ DUK__DUMPLM_SIGNED(INT_FAST16);
+ DUK__DUMPLM_UNSIGNED(UINT_FAST16);
+ DUK__DUMPLM_SIGNED(INT_LEAST16);
+ DUK__DUMPLM_UNSIGNED(UINT_LEAST16);
+ DUK__DUMPLM_SIGNED(INT32);
+ DUK__DUMPLM_UNSIGNED(UINT32);
+ DUK__DUMPLM_SIGNED(INT_FAST32);
+ DUK__DUMPLM_UNSIGNED(UINT_FAST32);
+ DUK__DUMPLM_SIGNED(INT_LEAST32);
+ DUK__DUMPLM_UNSIGNED(UINT_LEAST32);
+#if defined(DUK_USE_64BIT_OPS)
+ DUK__DUMPLM_SIGNED(INT64);
+ DUK__DUMPLM_UNSIGNED(UINT64);
+ DUK__DUMPLM_SIGNED(INT_FAST64);
+ DUK__DUMPLM_UNSIGNED(UINT_FAST64);
+ DUK__DUMPLM_SIGNED(INT_LEAST64);
+ DUK__DUMPLM_UNSIGNED(UINT_LEAST64);
+#endif
+ DUK__DUMPLM_SIGNED(INTPTR);
+ DUK__DUMPLM_UNSIGNED(UINTPTR);
+ DUK__DUMPLM_SIGNED(INTMAX);
+ DUK__DUMPLM_UNSIGNED(UINTMAX);
+
+ /* derived types */
+ DUK__DUMPLM_SIGNED(INT);
+ DUK__DUMPLM_UNSIGNED(UINT);
+ DUK__DUMPLM_SIGNED(INT_FAST);
+ DUK__DUMPLM_UNSIGNED(UINT_FAST);
+ DUK__DUMPLM_SIGNED(SMALL_INT);
+ DUK__DUMPLM_UNSIGNED(SMALL_UINT);
+ DUK__DUMPLM_SIGNED(SMALL_INT_FAST);
+ DUK__DUMPLM_UNSIGNED(SMALL_UINT_FAST);
+}
+
+DUK_LOCAL void duk__dump_misc_options(void) {
+ DUK_D(DUK_DPRINT("DUK_VERSION: %ld", (long) DUK_VERSION));
+ DUK_D(DUK_DPRINT("DUK_GIT_DESCRIBE: %s", DUK_GIT_DESCRIBE));
+ DUK_D(DUK_DPRINT("OS string: %s", DUK_USE_OS_STRING));
+ DUK_D(DUK_DPRINT("architecture string: %s", DUK_USE_ARCH_STRING));
+ DUK_D(DUK_DPRINT("compiler string: %s", DUK_USE_COMPILER_STRING));
+ DUK_D(DUK_DPRINT("debug level: %ld", (long) DUK_USE_DEBUG_LEVEL));
+#if defined(DUK_USE_PACKED_TVAL)
+ DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: yes"));
+#else
+ DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: no"));
+#endif
+#if defined(DUK_USE_VARIADIC_MACROS)
+ DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: yes"));
+#else
+ DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: no"));
+#endif
+#if defined(DUK_USE_INTEGER_LE)
+ DUK_D(DUK_DPRINT("integer endianness: little"));
+#elif defined(DUK_USE_INTEGER_ME)
+ DUK_D(DUK_DPRINT("integer endianness: mixed"));
+#elif defined(DUK_USE_INTEGER_BE)
+ DUK_D(DUK_DPRINT("integer endianness: big"));
+#else
+ DUK_D(DUK_DPRINT("integer endianness: ???"));
+#endif
+#if defined(DUK_USE_DOUBLE_LE)
+ DUK_D(DUK_DPRINT("IEEE double endianness: little"));
+#elif defined(DUK_USE_DOUBLE_ME)
+ DUK_D(DUK_DPRINT("IEEE double endianness: mixed"));
+#elif defined(DUK_USE_DOUBLE_BE)
+ DUK_D(DUK_DPRINT("IEEE double endianness: big"));
+#else
+ DUK_D(DUK_DPRINT("IEEE double endianness: ???"));
+#endif
+}
+#endif /* DUK_USE_DEBUG */
+
+DUK_INTERNAL
+duk_heap *duk_heap_alloc(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *heap_udata,
+ duk_fatal_function fatal_func) {
+ duk_heap *res = NULL;
+ duk_uint32_t st_initsize;
+
+ DUK_D(DUK_DPRINT("allocate heap"));
+
+ /*
+ * Random config sanity asserts
+ */
+
+ DUK_ASSERT(DUK_USE_STRTAB_MINSIZE >= 64);
+
+ DUK_ASSERT((DUK_HTYPE_STRING & 0x01U) == 0);
+ DUK_ASSERT((DUK_HTYPE_BUFFER & 0x01U) == 0);
+ DUK_ASSERT((DUK_HTYPE_OBJECT & 0x01U) == 1); /* DUK_HEAPHDR_IS_OBJECT() relies ont his. */
+
+ /*
+ * Debug dump type sizes
+ */
+
+#if defined(DUK_USE_DEBUG)
+ duk__dump_misc_options();
+ duk__dump_type_sizes();
+ duk__dump_type_limits();
+#endif
+
+ /*
+ * If selftests enabled, run them as early as possible.
+ */
+
+#if defined(DUK_USE_SELF_TESTS)
+ DUK_D(DUK_DPRINT("run self tests"));
+ if (duk_selftest_run_tests(alloc_func, realloc_func, free_func, heap_udata) > 0) {
+ fatal_func(heap_udata, "self test(s) failed");
+ }
+ DUK_D(DUK_DPRINT("self tests passed"));
+#endif
+
+ /*
+ * Important assert-like checks that should be enabled even
+ * when assertions are otherwise not enabled.
+ */
+
+#if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE)
+ /* Can't check sizeof() using preprocessor so explicit check.
+ * This will be optimized away in practice; unfortunately a
+ * warning is generated on some compilers as a result.
+ */
+#if defined(DUK_USE_PACKED_TVAL)
+ if (sizeof(duk_tval) != 8) {
+#else
+ if (sizeof(duk_tval) != 16) {
+#endif
+ fatal_func(heap_udata, "sizeof(duk_tval) not 8 or 16, cannot use DUK_USE_EXEC_REGCONST_OPTIMIZE option");
+ }
+#endif /* DUK_USE_EXEC_REGCONST_OPTIMIZE */
+
+ /*
+ * Computed values (e.g. INFINITY)
+ */
+
+#if defined(DUK_USE_COMPUTED_NAN)
+ do {
+ /* Workaround for some exotic platforms where NAN is missing
+ * and the expression (0.0 / 0.0) does NOT result in a NaN.
+ * Such platforms use the global 'duk_computed_nan' which must
+ * be initialized at runtime. Use 'volatile' to ensure that
+ * the compiler will actually do the computation and not try
+ * to do constant folding which might result in the original
+ * problem.
+ */
+ volatile double dbl1 = 0.0;
+ volatile double dbl2 = 0.0;
+ duk_computed_nan = dbl1 / dbl2;
+ } while (0);
+#endif
+
+#if defined(DUK_USE_COMPUTED_INFINITY)
+ do {
+ /* Similar workaround for INFINITY. */
+ volatile double dbl1 = 1.0;
+ volatile double dbl2 = 0.0;
+ duk_computed_infinity = dbl1 / dbl2;
+ } while (0);
+#endif
+
+ /*
+ * Allocate heap struct
+ *
+ * Use a raw call, all macros expect the heap to be initialized
+ */
+
+#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 1)
+ goto failed;
+#endif
+ DUK_D(DUK_DPRINT("alloc duk_heap object"));
+ res = (duk_heap *) alloc_func(heap_udata, sizeof(duk_heap));
+ if (!res) {
+ goto failed;
+ }
+
+ /*
+ * Zero the struct, and start initializing roughly in order
+ */
+
+ DUK_MEMZERO(res, sizeof(*res));
+#if defined(DUK_USE_ASSERTIONS)
+ res->heap_initializing = 1;
+#endif
+
+ /* explicit NULL inits */
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->heap_udata = NULL;
+ res->heap_allocated = NULL;
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ res->refzero_list = NULL;
+#endif
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ res->finalize_list = NULL;
+#if defined(DUK_USE_ASSERTIONS)
+ res->currently_finalizing = NULL;
+#endif
+#endif
+#if defined(DUK_USE_CACHE_ACTIVATION)
+ res->activation_free = NULL;
+#endif
+#if defined(DUK_USE_CACHE_CATCHER)
+ res->catcher_free = NULL;
+#endif
+ res->heap_thread = NULL;
+ res->curr_thread = NULL;
+ res->heap_object = NULL;
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ res->strtable16 = NULL;
+#else
+ res->strtable = NULL;
+#endif
+#if defined(DUK_USE_ROM_STRINGS)
+ /* no res->strs[] */
+#else /* DUK_USE_ROM_STRINGS */
+#if defined(DUK_USE_HEAPPTR16)
+ /* res->strs16[] is zeroed and zero decodes to NULL, so no NULL inits. */
+#else
+ {
+ duk_small_uint_t i;
+ for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) {
+ res->strs[i] = NULL;
+ }
+ }
+#endif
+#endif /* DUK_USE_ROM_STRINGS */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ res->dbg_read_cb = NULL;
+ res->dbg_write_cb = NULL;
+ res->dbg_peek_cb = NULL;
+ res->dbg_read_flush_cb = NULL;
+ res->dbg_write_flush_cb = NULL;
+ res->dbg_request_cb = NULL;
+ res->dbg_udata = NULL;
+ res->dbg_pause_act = NULL;
+#endif
+#endif /* DUK_USE_EXPLICIT_NULL_INIT */
+
+ res->alloc_func = alloc_func;
+ res->realloc_func = realloc_func;
+ res->free_func = free_func;
+ res->heap_udata = heap_udata;
+ res->fatal_func = fatal_func;
+
+ /* XXX: for now there's a pointer packing zero assumption, i.e.
+ * NULL <=> compressed pointer 0. If this is removed, may need
+ * to precompute e.g. null16 here.
+ */
+
+ /* res->ms_trigger_counter == 0 -> now causes immediate GC; which is OK */
+
+ /* Prevent mark-and-sweep and finalizer execution until heap is completely
+ * initialized.
+ */
+ DUK_ASSERT(res->ms_prevent_count == 0);
+ DUK_ASSERT(res->pf_prevent_count == 0);
+ res->ms_prevent_count = 1;
+ res->pf_prevent_count = 1;
+ DUK_ASSERT(res->ms_running == 0);
+
+ res->call_recursion_depth = 0;
+ res->call_recursion_limit = DUK_USE_NATIVE_CALL_RECLIMIT;
+
+ /* XXX: use the pointer as a seed for now: mix in time at least */
+
+ /* The casts through duk_intptr_t is to avoid the following GCC warning:
+ *
+ * warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
+ *
+ * This still generates a /Wp64 warning on VS2010 when compiling for x86.
+ */
+#if defined(DUK_USE_ROM_STRINGS)
+ /* XXX: make a common DUK_USE_ option, and allow custom fixed seed? */
+ DUK_D(DUK_DPRINT("using rom strings, force heap hash_seed to fixed value 0x%08lx", (long) DUK__FIXED_HASH_SEED));
+ res->hash_seed = (duk_uint32_t) DUK__FIXED_HASH_SEED;
+#else /* DUK_USE_ROM_STRINGS */
+ res->hash_seed = (duk_uint32_t) (duk_intptr_t) res;
+#if !defined(DUK_USE_STRHASH_DENSE)
+ res->hash_seed ^= 5381; /* Bernstein hash init value is normally 5381; XOR it in in case pointer low bits are 0 */
+#endif
+#endif /* DUK_USE_ROM_STRINGS */
+
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->lj.jmpbuf_ptr = NULL;
+#endif
+ DUK_ASSERT(res->lj.type == DUK_LJ_TYPE_UNKNOWN); /* zero */
+ DUK_ASSERT(res->lj.iserror == 0);
+ DUK_TVAL_SET_UNDEFINED(&res->lj.value1);
+ DUK_TVAL_SET_UNDEFINED(&res->lj.value2);
+
+ DUK_ASSERT_LJSTATE_UNSET(res);
+
+ /*
+ * Init stringtable: fixed variant
+ */
+
+ st_initsize = DUK_USE_STRTAB_MINSIZE;
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ res->strtable16 = (duk_uint16_t *) alloc_func(heap_udata, sizeof(duk_uint16_t) * st_initsize);
+ if (res->strtable16 == NULL) {
+ goto failed;
+ }
+#else
+ res->strtable = (duk_hstring **) alloc_func(heap_udata, sizeof(duk_hstring *) * st_initsize);
+ if (res->strtable == NULL) {
+ goto failed;
+ }
+#endif
+ res->st_size = st_initsize;
+ res->st_mask = st_initsize - 1;
+#if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE)
+ DUK_ASSERT(res->st_count == 0);
+#endif
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ /* zero assumption */
+ DUK_MEMZERO(res->strtable16, sizeof(duk_uint16_t) * st_initsize);
+#else
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ {
+ duk_small_uint_t i;
+ for (i = 0; i < st_initsize; i++) {
+ res->strtable[i] = NULL;
+ }
+ }
+#else
+ DUK_MEMZERO(res->strtable, sizeof(duk_hstring *) * st_initsize);
+#endif /* DUK_USE_EXPLICIT_NULL_INIT */
+#endif /* DUK_USE_STRTAB_PTRCOMP */
+
+ /*
+ * Init stringcache
+ */
+
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ {
+ duk_small_uint_t i;
+ for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {
+ res->strcache[i].h = NULL;
+ }
+ }
+#endif
+
+ /* XXX: error handling is incomplete. It would be cleanest if
+ * there was a setjmp catchpoint, so that all init code could
+ * freely throw errors. If that were the case, the return code
+ * passing here could be removed.
+ */
+
+ /*
+ * Init built-in strings
+ */
+
+#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 2)
+ goto failed;
+#endif
+ DUK_D(DUK_DPRINT("heap init: initialize heap strings"));
+ if (!duk__init_heap_strings(res)) {
+ goto failed;
+ }
+
+ /*
+ * Init the heap thread
+ */
+
+#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 3)
+ goto failed;
+#endif
+ DUK_D(DUK_DPRINT("heap init: initialize heap thread"));
+ if (!duk__init_heap_thread(res)) {
+ goto failed;
+ }
+
+ /*
+ * Init the heap object
+ */
+
+#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 4)
+ goto failed;
+#endif
+ DUK_D(DUK_DPRINT("heap init: initialize heap object"));
+ DUK_ASSERT(res->heap_thread != NULL);
+ res->heap_object = duk_hobject_alloc_unchecked(res, DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT));
+ if (res->heap_object == NULL) {
+ goto failed;
+ }
+ DUK_HOBJECT_INCREF(res->heap_thread, res->heap_object);
+
+ /*
+ * Odds and ends depending on the heap thread
+ */
+
+#if !defined(DUK_USE_GET_RANDOM_DOUBLE)
+#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS)
+ res->rnd_state = (duk_uint32_t) duk_time_get_ecmascript_time(res->heap_thread);
+ duk_util_tinyrandom_prepare_seed(res->heap_thread);
+#else
+ res->rnd_state[0] = (duk_uint64_t) duk_time_get_ecmascript_time(res->heap_thread);
+ DUK_ASSERT(res->rnd_state[1] == 0); /* Not filled here, filled in by seed preparation. */
+#if 0 /* Manual test values matching misc/xoroshiro128plus_test.c. */
+ res->rnd_state[0] = DUK_U64_CONSTANT(0xdeadbeef12345678);
+ res->rnd_state[1] = DUK_U64_CONSTANT(0xcafed00d12345678);
+#endif
+ duk_util_tinyrandom_prepare_seed(res->heap_thread);
+ /* Mix in heap pointer: this ensures that if two Duktape heaps are
+ * created on the same millisecond, they get a different PRNG
+ * sequence (unless e.g. virtual memory addresses cause also the
+ * heap object pointer to be the same).
+ */
+ {
+ duk_uint64_t tmp_u64;
+ tmp_u64 = 0;
+ DUK_MEMCPY((void *) &tmp_u64,
+ (const void *) &res,
+ (size_t) (sizeof(void *) >= sizeof(duk_uint64_t) ? sizeof(duk_uint64_t) : sizeof(void *)));
+ res->rnd_state[1] ^= tmp_u64;
+ }
+ do {
+ duk_small_uint_t i;
+ for (i = 0; i < 10; i++) {
+ /* Throw away a few initial random numbers just in
+ * case. Probably unnecessary due to SplitMix64
+ * preparation.
+ */
+ (void) duk_util_tinyrandom_get_double(res->heap_thread);
+ }
+ } while (0);
+#endif
+#endif
+
+ /*
+ * Allow finalizer and mark-and-sweep processing.
+ */
+
+ DUK_D(DUK_DPRINT("heap init: allow finalizer/mark-and-sweep processing"));
+ DUK_ASSERT(res->ms_prevent_count == 1);
+ DUK_ASSERT(res->pf_prevent_count == 1);
+ res->ms_prevent_count = 0;
+ res->pf_prevent_count = 0;
+ DUK_ASSERT(res->ms_running == 0);
+#if defined(DUK_USE_ASSERTIONS)
+ res->heap_initializing = 0;
+#endif
+
+ /*
+ * All done.
+ */
+
+ DUK_D(DUK_DPRINT("allocated heap: %p", (void *) res));
+ return res;
+
+ failed:
+ DUK_D(DUK_DPRINT("heap allocation failed"));
+
+ if (res != NULL) {
+ /* Assumes that allocated pointers and alloc funcs are valid
+ * if res exists.
+ */
+ DUK_ASSERT(res->ms_prevent_count == 1);
+ DUK_ASSERT(res->pf_prevent_count == 1);
+ DUK_ASSERT(res->ms_running == 0);
+ if (res->heap_thread != NULL) {
+ res->ms_prevent_count = 0;
+ res->pf_prevent_count = 0;
+ }
+#if defined(DUK_USE_ASSERTIONS)
+ res->heap_initializing = 0;
+#endif
+
+ DUK_ASSERT(res->alloc_func != NULL);
+ DUK_ASSERT(res->realloc_func != NULL);
+ DUK_ASSERT(res->free_func != NULL);
+ duk_heap_free(res);
+ }
+
+ return NULL;
+}
+
+/* automatic undefs */
+#undef DUK__DUMPLM_SIGNED
+#undef DUK__DUMPLM_SIGNED_RAW
+#undef DUK__DUMPLM_UNSIGNED
+#undef DUK__DUMPLM_UNSIGNED_RAW
+#undef DUK__DUMPSZ
+#undef DUK__FIXED_HASH_SEED
+#line 1 "duk_heap_finalize.c"
+/*
+ * Finalizer handling.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+
+/*
+ * Fake torture finalizer.
+ */
+
+#if defined(DUK_USE_FINALIZER_TORTURE)
+DUK_LOCAL duk_ret_t duk__fake_global_finalizer(duk_hthread *thr) {
+ DUK_DD(DUK_DDPRINT("fake global torture finalizer executed"));
+
+ /* Require a lot of stack to force a value stack grow/shrink. */
+ duk_require_stack(thr, 100000);
+
+ /* Force a reallocation with pointer change for value stack
+ * to maximize side effects.
+ */
+ duk_hthread_valstack_torture_realloc(thr);
+
+ /* Inner function call, error throw. */
+ duk_eval_string_noresult(thr,
+ "(function dummy() {\n"
+ " dummy.prototype = null; /* break reference loop */\n"
+ " try {\n"
+ " throw 'fake-finalizer-dummy-error';\n"
+ " } catch (e) {\n"
+ " void e;\n"
+ " }\n"
+ "})()");
+
+ /* The above creates garbage (e.g. a function instance). Because
+ * the function/prototype reference loop is broken, it gets collected
+ * immediately by DECREF. If Function.prototype has a _Finalizer
+ * property (happens in some test cases), the garbage gets queued to
+ * finalize_list. This still won't cause an infinite loop because
+ * the torture finalizer is called once per finalize_list run and
+ * the garbage gets handled in the same run. (If the garbage needs
+ * mark-and-sweep collection, an infinite loop might ensue.)
+ */
+ return 0;
+}
+
+DUK_LOCAL void duk__run_global_torture_finalizer(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+
+ /* Avoid fake finalization when callstack limit is near. Otherwise
+ * a callstack limit error will be created, then refzero'ed. The
+ * +5 headroom is conservative.
+ */
+ if (thr->heap->call_recursion_depth + 5 >= thr->heap->call_recursion_limit ||
+ thr->callstack_top + 5 >= DUK_USE_CALLSTACK_LIMIT) {
+ DUK_D(DUK_DPRINT("skip global torture finalizer, too little headroom for call recursion or call stack size"));
+ return;
+ }
+
+ /* Run fake finalizer. Avoid creating unnecessary garbage. */
+ duk_push_c_function(thr, duk__fake_global_finalizer, 0 /*nargs*/);
+ (void) duk_pcall(thr, 0 /*nargs*/);
+ duk_pop(thr);
+}
+#endif /* DUK_USE_FINALIZER_TORTURE */
+
+/*
+ * Process the finalize_list to completion.
+ *
+ * An object may be placed on finalize_list by either refcounting or
+ * mark-and-sweep. The refcount of objects placed by refcounting will be
+ * zero; the refcount of objects placed by mark-and-sweep is > 0. In both
+ * cases the refcount is bumped by 1 artificially so that a REFZERO event
+ * can never happen while an object is waiting for finalization. Without
+ * this bump a REFZERO could now happen because user code may call
+ * duk_push_heapptr() and then pop a value even when it's on finalize_list.
+ *
+ * List processing assumes refcounts are kept up-to-date at all times, so
+ * that once the finalizer returns, a zero refcount is a reliable reason to
+ * free the object immediately rather than place it back to the heap. This
+ * is the case because we run outside of refzero_list processing so that
+ * DECREF cascades are handled fully inline.
+ *
+ * For mark-and-sweep queued objects (had_zero_refcount false) the object
+ * may be freed immediately if its refcount is zero after the finalizer call
+ * (i.e. finalizer removed the reference loop for the object). If not, the
+ * next mark-and-sweep will collect the object unless it has become reachable
+ * (i.e. rescued) by that time and its refcount hasn't fallen to zero before
+ * that. Mark-and-sweep detects these objects because their FINALIZED flag
+ * is set.
+ *
+ * There's an inherent limitation for mark-and-sweep finalizer rescuing: an
+ * object won't get refinalized if (1) it's rescued, but (2) becomes
+ * unreachable before mark-and-sweep has had time to notice it. The next
+ * mark-and-sweep round simply doesn't have any information of whether the
+ * object has been unreachable the whole time or not (the only way to get
+ * that information would be a mark-and-sweep pass for *every finalized
+ * object*). This is awkward for the application because the mark-and-sweep
+ * round is not generally visible or under full application control.
+ *
+ * For refcount queued objects (had_zero_refcount true) the object is either
+ * immediately freed or rescued, and waiting for a mark-and-sweep round is not
+ * necessary (or desirable); FINALIZED is cleared when a rescued object is
+ * queued back to heap_allocated. The object is eligible for finalization
+ * again (either via refcounting or mark-and-sweep) immediately after being
+ * rescued. If a refcount finalized object is placed into an unreachable
+ * reference loop by its finalizer, it will get collected by mark-and-sweep
+ * and currently the finalizer will execute again.
+ *
+ * There's a special case where:
+ *
+ * - Mark-and-sweep queues an object to finalize_list for finalization.
+ * - The finalizer is executed, FINALIZED is set, and object is queued
+ * back to heap_allocated, waiting for a new mark-and-sweep round.
+ * - The object's refcount drops to zero before mark-and-sweep has a
+ * chance to run another round and make a rescue/free decision.
+ *
+ * This is now handled by refzero code: if an object has a finalizer but
+ * FINALIZED is already set, the object is freed without finalizer processing.
+ * The outcome is the same as if mark-and-sweep was executed at that point;
+ * mark-and-sweep would also free the object without another finalizer run.
+ * This could also be changed so that the refzero-triggered finalizer *IS*
+ * executed: being refzero collected implies someone has operated on the
+ * object so it hasn't been totally unreachable the whole time. This would
+ * risk a finalizer loop however.
+ */
+
+DUK_INTERNAL void duk_heap_process_finalize_list(duk_heap *heap) {
+ duk_heaphdr *curr;
+#if defined(DUK_USE_DEBUG)
+ duk_size_t count = 0;
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("duk_heap_process_finalize_list: %p", (void *) heap));
+
+ if (heap->pf_prevent_count != 0) {
+ DUK_DDD(DUK_DDDPRINT("skip finalize_list processing: pf_prevent_count != 0"));
+ return;
+ }
+
+ /* Heap alloc prevents mark-and-sweep before heap_thread is ready. */
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(heap->heap_thread->valstack != NULL);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL);
+#endif
+
+ DUK_ASSERT(heap->pf_prevent_count == 0);
+ heap->pf_prevent_count = 1;
+
+ /* Mark-and-sweep no longer needs to be prevented when running
+ * finalizers: mark-and-sweep skips any rescue decisions if there
+ * are any objects in finalize_list when mark-and-sweep is entered.
+ * This protects finalized objects from incorrect rescue decisions
+ * caused by finalize_list being a reachability root and only
+ * partially processed. Freeing decisions are not postponed.
+ */
+
+ /* When finalizer torture is enabled, make a fake finalizer call with
+ * maximum side effects regardless of whether finalize_list is empty.
+ */
+#if defined(DUK_USE_FINALIZER_TORTURE)
+ duk__run_global_torture_finalizer(heap->heap_thread);
+#endif
+
+ /* Process finalize_list until it becomes empty. There's currently no
+ * protection against a finalizer always creating more garbage.
+ */
+ while ((curr = heap->finalize_list) != NULL) {
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_bool_t queue_back;
+#endif
+
+ DUK_DD(DUK_DDPRINT("processing finalize_list entry: %p -> %!iO", (void *) curr, curr));
+
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* Only objects have finalizers. */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr));
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(curr));
+ DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr)); /* All objects on finalize_list will have this flag (except object being finalized right now). */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); /* Queueing code ensures. */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr)); /* ROM objects never get freed (or finalized). */
+
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(heap->currently_finalizing == NULL);
+ heap->currently_finalizing = curr;
+#endif
+
+ /* Clear FINALIZABLE for object being finalized, so that
+ * duk_push_heapptr() can properly ignore the object.
+ */
+ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr);
+
+ if (DUK_LIKELY(!heap->pf_skip_finalizers)) {
+ /* Run the finalizer, duk_heap_run_finalizer() sets
+ * and checks for FINALIZED to prevent the finalizer
+ * from executing multiple times per finalization cycle.
+ * (This safeguard shouldn't be actually needed anymore).
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_bool_t had_zero_refcount;
+#endif
+
+ /* The object's refcount is >0 throughout so it won't be
+ * refzero processed prematurely.
+ */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1);
+ had_zero_refcount = (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1); /* Preincremented on finalize_list insert. */
+#endif
+
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));
+ duk_heap_run_finalizer(heap, (duk_hobject *) curr); /* must never longjmp */
+ DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZED(curr));
+ /* XXX: assert that object is still in finalize_list
+ * when duk_push_heapptr() allows automatic rescue.
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_DD(DUK_DDPRINT("refcount after finalizer (includes bump): %ld", (long) DUK_HEAPHDR_GET_REFCOUNT(curr)));
+ if (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1) { /* Only artificial bump in refcount? */
+#if defined(DUK_USE_DEBUG)
+ if (had_zero_refcount) {
+ DUK_DD(DUK_DDPRINT("finalized object's refcount is zero -> free immediately (refcount queued)"));
+ } else {
+ DUK_DD(DUK_DDPRINT("finalized object's refcount is zero -> free immediately (mark-and-sweep queued)"));
+ }
+#endif
+ queue_back = 0;
+ } else
+#endif
+ {
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ queue_back = 1;
+ if (had_zero_refcount) {
+ /* When finalization is triggered
+ * by refzero and we queue the object
+ * back, clear FINALIZED right away
+ * so that the object can be refinalized
+ * immediately if necessary.
+ */
+ DUK_HEAPHDR_CLEAR_FINALIZED(curr);
+ }
+#endif
+ }
+ } else {
+ /* Used during heap destruction: don't actually run finalizers
+ * because we're heading into forced finalization. Instead,
+ * queue finalizable objects back to the heap_allocated list.
+ */
+ DUK_D(DUK_DPRINT("skip finalizers flag set, queue object to heap_allocated without finalizing"));
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ queue_back = 1;
+#endif
+ }
+
+ /* Dequeue object from finalize_list. Note that 'curr' may no
+ * longer be finalize_list head because new objects may have
+ * been queued to the list. As a result we can't optimize for
+ * the single-linked heap case and must scan the list for
+ * removal, typically the scan is very short however.
+ */
+ DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap, curr);
+
+ /* Queue back to heap_allocated or free immediately. */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ if (queue_back) {
+ /* FINALIZED is only cleared if object originally
+ * queued for finalization by refcounting. For
+ * mark-and-sweep FINALIZED is left set, so that
+ * next mark-and-sweep round can make a rescue/free
+ * decision.
+ */
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1);
+ DUK_HEAPHDR_PREDEC_REFCOUNT(curr); /* Remove artificial refcount bump. */
+ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr);
+ DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr);
+ } else {
+ /* No need to remove the refcount bump here. */
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* currently, always the case */
+ DUK_DD(DUK_DDPRINT("refcount finalize after finalizer call: %!O", curr));
+ duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr);
+ duk_free_hobject(heap, (duk_hobject *) curr);
+ DUK_DD(DUK_DDPRINT("freed hobject after finalization: %p", (void *) curr));
+ }
+#else /* DUK_USE_REFERENCE_COUNTING */
+ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr);
+ DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr);
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+#if defined(DUK_USE_DEBUG)
+ count++;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(heap->currently_finalizing != NULL);
+ heap->currently_finalizing = NULL;
+#endif
+ }
+
+ /* finalize_list will always be processed completely. */
+ DUK_ASSERT(heap->finalize_list == NULL);
+
+#if 0
+ /* While NORZ macros are used above, this is unnecessary because the
+ * only pending side effects are now finalizers, and finalize_list is
+ * empty.
+ */
+ DUK_REFZERO_CHECK_SLOW(heap->heap_thread);
+#endif
+
+ /* Prevent count may be bumped while finalizers run, but should always
+ * be reliably unbumped by the time we get here.
+ */
+ DUK_ASSERT(heap->pf_prevent_count == 1);
+ heap->pf_prevent_count = 0;
+
+#if defined(DUK_USE_DEBUG)
+ DUK_DD(DUK_DDPRINT("duk_heap_process_finalize_list: %ld finalizers called", (long) count));
+#endif
+}
+
+/*
+ * Run an duk_hobject finalizer. Must never throw an uncaught error
+ * (but may throw caught errors).
+ *
+ * There is no return value. Any return value or error thrown by
+ * the finalizer is ignored (although errors are debug logged).
+ *
+ * Notes:
+ *
+ * - The finalizer thread 'top' assertions are there because it is
+ * critical that strict stack policy is observed (i.e. no cruft
+ * left on the finalizer stack).
+ */
+
+DUK_LOCAL duk_ret_t duk__finalize_helper(duk_hthread *thr, void *udata) {
+ DUK_ASSERT(thr != NULL);
+ DUK_UNREF(udata);
+
+ DUK_DDD(DUK_DDDPRINT("protected finalization helper running"));
+
+ /* [... obj] */
+
+ /* _Finalizer property is read without checking if the value is
+ * callable or even exists. This is intentional, and handled
+ * by throwing an error which is caught by the safe call wrapper.
+ *
+ * XXX: Finalizer lookup should traverse the prototype chain (to allow
+ * inherited finalizers) but should not invoke accessors or proxy object
+ * behavior. At the moment this lookup will invoke proxy behavior, so
+ * caller must ensure that this function is not called if the target is
+ * a Proxy.
+ */
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FINALIZER); /* -> [... obj finalizer] */
+ duk_dup_m2(thr);
+ duk_push_boolean(thr, DUK_HEAP_HAS_FINALIZER_NORESCUE(thr->heap));
+ DUK_DDD(DUK_DDDPRINT("calling finalizer"));
+ duk_call(thr, 2); /* [ ... obj finalizer obj heapDestruct ] -> [ ... obj retval ] */
+ DUK_DDD(DUK_DDDPRINT("finalizer returned successfully"));
+ return 0;
+
+ /* Note: we rely on duk_safe_call() to fix up the stack for the caller,
+ * so we don't need to pop stuff here. There is no return value;
+ * caller determines rescued status based on object refcount.
+ */
+}
+
+DUK_INTERNAL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj) {
+ duk_hthread *thr;
+ duk_ret_t rc;
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t entry_top;
+#endif
+
+ DUK_DD(DUK_DDPRINT("running duk_hobject finalizer for object: %p", (void *) obj));
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ thr = heap->heap_thread;
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT_VALSTACK_SPACE(heap->heap_thread, 1);
+
+#if defined(DUK_USE_ASSERTIONS)
+ entry_top = duk_get_top(thr);
+#endif
+ /*
+ * Get and call the finalizer. All of this must be wrapped
+ * in a protected call, because even getting the finalizer
+ * may trigger an error (getter may throw one, for instance).
+ */
+
+ /* ROM objects could inherit a finalizer, but they are never deemed
+ * unreachable by mark-and-sweep, and their refcount never falls to 0.
+ */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));
+
+ /* Duktape 2.1: finalize_list never contains objects with FINALIZED
+ * set, so no need to check here.
+ */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj));
+#if 0
+ if (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj)) {
+ DUK_D(DUK_DPRINT("object already finalized, avoid running finalizer twice: %!O", obj));
+ return;
+ }
+#endif
+ DUK_HEAPHDR_SET_FINALIZED((duk_heaphdr *) obj); /* ensure never re-entered until rescue cycle complete */
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_HOBJECT_IS_PROXY(obj)) {
+ /* This may happen if duk_set_finalizer() or Duktape.fin() is
+ * called for a Proxy object. In such cases the fast finalizer
+ * flag will be set on the Proxy, not the target, and neither
+ * will be finalized.
+ */
+ DUK_D(DUK_DPRINT("object is a Proxy, skip finalizer call"));
+ return;
+ }
+#endif /* DUK_USE_ES6_PROXY */
+
+ duk_push_hobject(thr, obj); /* this also increases refcount by one */
+ rc = duk_safe_call(thr, duk__finalize_helper, NULL /*udata*/, 0 /*nargs*/, 1 /*nrets*/); /* -> [... obj retval/error] */
+ DUK_ASSERT_TOP(thr, entry_top + 2); /* duk_safe_call discipline */
+
+ if (rc != DUK_EXEC_SUCCESS) {
+ /* Note: we ask for one return value from duk_safe_call to get this
+ * error debugging here.
+ */
+ DUK_D(DUK_DPRINT("wrapped finalizer call failed for object %p (ignored); error: %!T",
+ (void *) obj, (duk_tval *) duk_get_tval(thr, -1)));
+ }
+ duk_pop_2(thr); /* -> [...] */
+
+ DUK_ASSERT_TOP(thr, entry_top);
+}
+
+#else /* DUK_USE_FINALIZER_SUPPORT */
+
+/* nothing */
+
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+#line 1 "duk_heap_hashstring.c"
+/*
+ * String hash computation (interning).
+ *
+ * String hashing is performance critical because a string hash is computed
+ * for all new strings which are candidates to be added to the string table.
+ * However, strings actually added to the string table go through a codepoint
+ * length calculation which dominates performance because it goes through
+ * every byte of the input string (but only for strings added).
+ *
+ * The string hash algorithm should be fast, but on the other hand provide
+ * good enough hashes to ensure both string table and object property table
+ * hash tables work reasonably well (i.e., there aren't too many collisions
+ * with real world inputs). Unless the hash is cryptographic, it's always
+ * possible to craft inputs with maximal hash collisions.
+ *
+ * NOTE: The hash algorithms must match tools/dukutil.py:duk_heap_hashstring()
+ * for ROM string support!
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_STRHASH_DENSE)
+/* Constants for duk_hashstring(). */
+#define DUK__STRHASH_SHORTSTRING 4096L
+#define DUK__STRHASH_MEDIUMSTRING (256L * 1024L)
+#define DUK__STRHASH_BLOCKSIZE 256L
+
+DUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) {
+ duk_uint32_t hash;
+
+ /* Use Murmurhash2 directly for short strings, and use "block skipping"
+ * for long strings: hash an initial part and then sample the rest of
+ * the string with reasonably sized chunks. An initial offset for the
+ * sampling is computed based on a hash of the initial part of the string;
+ * this is done to (usually) avoid the case where all long strings have
+ * certain offset ranges which are never sampled.
+ *
+ * Skip should depend on length and bound the total time to roughly
+ * logarithmic. With current values:
+ *
+ * 1M string => 256 * 241 = 61696 bytes (0.06M) of hashing
+ * 1G string => 256 * 16321 = 4178176 bytes (3.98M) of hashing
+ *
+ * XXX: It would be better to compute the skip offset more "smoothly"
+ * instead of having a few boundary values.
+ */
+
+ /* note: mixing len into seed improves hashing when skipping */
+ duk_uint32_t str_seed = heap->hash_seed ^ ((duk_uint32_t) len);
+
+ if (len <= DUK__STRHASH_SHORTSTRING) {
+ hash = duk_util_hashbytes(str, len, str_seed);
+ } else {
+ duk_size_t off;
+ duk_size_t skip;
+
+ if (len <= DUK__STRHASH_MEDIUMSTRING) {
+ skip = (duk_size_t) (16 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE);
+ } else {
+ skip = (duk_size_t) (256 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE);
+ }
+
+ hash = duk_util_hashbytes(str, (duk_size_t) DUK__STRHASH_SHORTSTRING, str_seed);
+ off = DUK__STRHASH_SHORTSTRING + (skip * (hash % 256)) / 256;
+
+ /* XXX: inefficient loop */
+ while (off < len) {
+ duk_size_t left = len - off;
+ duk_size_t now = (duk_size_t) (left > DUK__STRHASH_BLOCKSIZE ? DUK__STRHASH_BLOCKSIZE : left);
+ hash ^= duk_util_hashbytes(str + off, now, str_seed);
+ off += skip;
+ }
+ }
+
+#if defined(DUK_USE_STRHASH16)
+ /* Truncate to 16 bits here, so that a computed hash can be compared
+ * against a hash stored in a 16-bit field.
+ */
+ hash &= 0x0000ffffUL;
+#endif
+ return hash;
+}
+#else /* DUK_USE_STRHASH_DENSE */
+DUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) {
+ duk_uint32_t hash;
+ duk_size_t step;
+ duk_size_t off;
+
+ /* Slightly modified "Bernstein hash" from:
+ *
+ * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
+ *
+ * Modifications: string skipping and reverse direction similar to
+ * Lua 5.1.5, and different hash initializer.
+ *
+ * The reverse direction ensures last byte it always included in the
+ * hash which is a good default as changing parts of the string are
+ * more often in the suffix than in the prefix.
+ */
+
+ hash = heap->hash_seed ^ ((duk_uint32_t) len); /* Bernstein hash init value is normally 5381 */
+ step = (len >> DUK_USE_STRHASH_SKIP_SHIFT) + 1;
+ for (off = len; off >= step; off -= step) {
+ DUK_ASSERT(off >= 1); /* off >= step, and step >= 1 */
+ hash = (hash * 33) + str[off - 1];
+ }
+
+#if defined(DUK_USE_STRHASH16)
+ /* Truncate to 16 bits here, so that a computed hash can be compared
+ * against a hash stored in a 16-bit field.
+ */
+ hash &= 0x0000ffffUL;
+#endif
+ return hash;
+}
+#endif /* DUK_USE_STRHASH_DENSE */
+
+/* automatic undefs */
+#undef DUK__STRHASH_BLOCKSIZE
+#undef DUK__STRHASH_MEDIUMSTRING
+#undef DUK__STRHASH_SHORTSTRING
+#line 1 "duk_heap_markandsweep.c"
+/*
+ * Mark-and-sweep garbage collection.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_LOCAL_DECL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h);
+DUK_LOCAL_DECL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h);
+DUK_LOCAL_DECL void duk__mark_tval(duk_heap *heap, duk_tval *tv);
+DUK_LOCAL_DECL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count);
+
+/*
+ * Marking functions for heap types: mark children recursively.
+ */
+
+DUK_LOCAL void duk__mark_hstring(duk_heap *heap, duk_hstring *h) {
+ DUK_UNREF(heap);
+ DUK_UNREF(h);
+
+ DUK_DDD(DUK_DDDPRINT("duk__mark_hstring: %p", (void *) h));
+ DUK_ASSERT(h);
+
+ /* nothing to process */
+}
+
+DUK_LOCAL void duk__mark_hobject(duk_heap *heap, duk_hobject *h) {
+ duk_uint_fast32_t i;
+
+ DUK_DDD(DUK_DDDPRINT("duk__mark_hobject: %p", (void *) h));
+
+ DUK_ASSERT(h);
+
+ /* XXX: use advancing pointers instead of index macros -> faster and smaller? */
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) {
+ duk_hstring *key = DUK_HOBJECT_E_GET_KEY(heap, h, i);
+ if (key == NULL) {
+ continue;
+ }
+ duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) key);
+ if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) {
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set);
+ } else {
+ duk__mark_tval(heap, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v);
+ }
+ }
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) {
+ duk__mark_tval(heap, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i));
+ }
+
+ /* Hash part is a 'weak reference' and does not contribute. */
+
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h));
+
+ /* Fast path for objects which don't have a subclass struct, or have a
+ * subclass struct but nothing that needs marking in the subclass struct.
+ */
+ if (DUK_HOBJECT_HAS_FASTREFS(h)) {
+ DUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h));
+ return;
+ }
+ DUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h));
+
+ /* XXX: reorg, more common first */
+ if (DUK_HOBJECT_IS_COMPFUNC(h)) {
+ duk_hcompfunc *f = (duk_hcompfunc *) h;
+ duk_tval *tv, *tv_end;
+ duk_hobject **fn, **fn_end;
+
+ DUK_ASSERT_HCOMPFUNC_VALID(f);
+
+ /* 'data' is reachable through every compiled function which
+ * contains a reference.
+ */
+
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_DATA(heap, f));
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f));
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f));
+
+ if (DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL) {
+ tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f);
+ tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f);
+ while (tv < tv_end) {
+ duk__mark_tval(heap, tv);
+ tv++;
+ }
+
+ fn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f);
+ fn_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f);
+ while (fn < fn_end) {
+ duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) *fn);
+ fn++;
+ }
+ } else {
+ /* May happen in some out-of-memory corner cases. */
+ DUK_D(DUK_DPRINT("duk_hcompfunc 'data' is NULL, skipping marking"));
+ }
+ } else if (DUK_HOBJECT_IS_DECENV(h)) {
+ duk_hdecenv *e = (duk_hdecenv *) h;
+ DUK_ASSERT_HDECENV_VALID(e);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) e->thread);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) e->varmap);
+ } else if (DUK_HOBJECT_IS_OBJENV(h)) {
+ duk_hobjenv *e = (duk_hobjenv *) h;
+ DUK_ASSERT_HOBJENV_VALID(e);
+ duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) e->target);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ } else if (DUK_HOBJECT_IS_BUFOBJ(h)) {
+ duk_hbufobj *b = (duk_hbufobj *) h;
+ DUK_ASSERT_HBUFOBJ_VALID(b);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) b->buf);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) b->buf_prop);
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+ } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) {
+ duk_hboundfunc *f = (duk_hboundfunc *) h;
+ DUK_ASSERT_HBOUNDFUNC_VALID(f);
+ duk__mark_tval(heap, &f->target);
+ duk__mark_tval(heap, &f->this_binding);
+ duk__mark_tvals(heap, f->args, f->nargs);
+#if defined(DUK_USE_ES6_PROXY)
+ } else if (DUK_HOBJECT_IS_PROXY(h)) {
+ duk_hproxy *p = (duk_hproxy *) h;
+ DUK_ASSERT_HPROXY_VALID(p);
+ duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->target);
+ duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->handler);
+#endif /* DUK_USE_ES6_PROXY */
+ } else if (DUK_HOBJECT_IS_THREAD(h)) {
+ duk_hthread *t = (duk_hthread *) h;
+ duk_activation *act;
+ duk_tval *tv;
+
+ DUK_ASSERT_HTHREAD_VALID(t);
+
+ tv = t->valstack;
+ while (tv < t->valstack_top) {
+ duk__mark_tval(heap, tv);
+ tv++;
+ }
+
+ for (act = t->callstack_curr; act != NULL; act = act->parent) {
+ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_ACT_GET_FUNC(act));
+ duk__mark_heaphdr(heap, (duk_heaphdr *) act->var_env);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) act->lex_env);
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ duk__mark_heaphdr(heap, (duk_heaphdr *) act->prev_caller);
+#endif
+#if 0 /* nothing now */
+ for (cat = act->cat; cat != NULL; cat = cat->parent) {
+ }
+#endif
+ }
+
+ duk__mark_heaphdr(heap, (duk_heaphdr *) t->resumer);
+
+ for (i = 0; i < DUK_NUM_BUILTINS; i++) {
+ duk__mark_heaphdr(heap, (duk_heaphdr *) t->builtins[i]);
+ }
+ } else {
+ /* We may come here if the object should have a FASTREFS flag
+ * but it's missing for some reason. Assert for never getting
+ * here; however, other than performance, this is harmless.
+ */
+ DUK_D(DUK_DPRINT("missing FASTREFS flag for: %!iO", h));
+ DUK_ASSERT(0);
+ }
+}
+
+/* Mark any duk_heaphdr type. Recursion tracking happens only here. */
+DUK_LOCAL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h) {
+ DUK_DDD(DUK_DDDPRINT("duk__mark_heaphdr %p, type %ld",
+ (void *) h,
+ (h != NULL ? (long) DUK_HEAPHDR_GET_TYPE(h) : (long) -1)));
+
+ /* XXX: add non-null variant? */
+ if (h == NULL) {
+ return;
+ }
+
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h) || DUK_HEAPHDR_HAS_REACHABLE(h));
+
+#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)
+ if (!DUK_HEAPHDR_HAS_READONLY(h)) {
+ h->h_assert_refcount++; /* Comparison refcount: bump even if already reachable. */
+ }
+#endif
+ if (DUK_HEAPHDR_HAS_REACHABLE(h)) {
+ DUK_DDD(DUK_DDDPRINT("already marked reachable, skip"));
+ return;
+ }
+#if defined(DUK_USE_ROM_OBJECTS)
+ /* READONLY objects always have REACHABLE set, so the check above
+ * will prevent READONLY objects from being marked here.
+ */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h));
+#endif
+
+ DUK_HEAPHDR_SET_REACHABLE(h);
+
+ if (heap->ms_recursion_depth >= DUK_USE_MARK_AND_SWEEP_RECLIMIT) {
+ DUK_D(DUK_DPRINT("mark-and-sweep recursion limit reached, marking as temproot: %p", (void *) h));
+ DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap);
+ DUK_HEAPHDR_SET_TEMPROOT(h);
+ return;
+ }
+
+ heap->ms_recursion_depth++;
+ DUK_ASSERT(heap->ms_recursion_depth != 0); /* Wrap. */
+
+ switch (DUK_HEAPHDR_GET_TYPE(h)) {
+ case DUK_HTYPE_STRING:
+ duk__mark_hstring(heap, (duk_hstring *) h);
+ break;
+ case DUK_HTYPE_OBJECT:
+ duk__mark_hobject(heap, (duk_hobject *) h);
+ break;
+ case DUK_HTYPE_BUFFER:
+ /* nothing to mark */
+ break;
+ default:
+ DUK_D(DUK_DPRINT("attempt to mark heaphdr %p with invalid htype %ld", (void *) h, (long) DUK_HEAPHDR_GET_TYPE(h)));
+ DUK_UNREACHABLE();
+ }
+
+ DUK_ASSERT(heap->ms_recursion_depth > 0);
+ heap->ms_recursion_depth--;
+}
+
+DUK_LOCAL void duk__mark_tval(duk_heap *heap, duk_tval *tv) {
+ DUK_DDD(DUK_DDDPRINT("duk__mark_tval %p", (void *) tv));
+ if (tv == NULL) {
+ return;
+ }
+ if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {
+ duk_heaphdr *h;
+ h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ duk__mark_heaphdr_nonnull(heap, h);
+ }
+}
+
+DUK_LOCAL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count) {
+ DUK_ASSERT(count == 0 || tv != NULL);
+
+ while (count-- > 0) {
+ if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {
+ duk_heaphdr *h;
+ h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ duk__mark_heaphdr_nonnull(heap, h);
+ }
+ tv++;
+ }
+}
+
+/* Mark any duk_heaphdr type, caller guarantees a non-NULL pointer. */
+DUK_LOCAL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h) {
+ /* For now, just call the generic handler. Change when call sites
+ * are changed too.
+ */
+ duk__mark_heaphdr(heap, h);
+}
+
+/*
+ * Mark the heap.
+ */
+
+DUK_LOCAL void duk__mark_roots_heap(duk_heap *heap) {
+ duk_small_uint_t i;
+
+ DUK_DD(DUK_DDPRINT("duk__mark_roots_heap: %p", (void *) heap));
+
+ duk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_thread);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_object);
+
+ for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) {
+ duk_hstring *h = DUK_HEAP_GET_STRING(heap, i);
+ duk__mark_heaphdr(heap, (duk_heaphdr *) h);
+ }
+
+ duk__mark_tval(heap, &heap->lj.value1);
+ duk__mark_tval(heap, &heap->lj.value2);
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ for (i = 0; i < heap->dbg_breakpoint_count; i++) {
+ duk__mark_heaphdr(heap, (duk_heaphdr *) heap->dbg_breakpoints[i].filename);
+ }
+#endif
+}
+
+/*
+ * Mark unreachable, finalizable objects.
+ *
+ * Such objects will be moved aside and their finalizers run later. They
+ * have to be treated as reachability roots for their properties etc to
+ * remain allocated. This marking is only done for unreachable values which
+ * would be swept later.
+ *
+ * Objects are first marked FINALIZABLE and only then marked as reachability
+ * roots; otherwise circular references might be handled inconsistently.
+ */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_LOCAL void duk__mark_finalizable(duk_heap *heap) {
+ duk_heaphdr *hdr;
+ duk_size_t count_finalizable = 0;
+
+ DUK_DD(DUK_DDPRINT("duk__mark_finalizable: %p", (void *) heap));
+
+ DUK_ASSERT(heap->heap_thread != NULL);
+
+ hdr = heap->heap_allocated;
+ while (hdr != NULL) {
+ /* A finalizer is looked up from the object and up its
+ * prototype chain (which allows inherited finalizers).
+ * The finalizer is checked for using a duk_hobject flag
+ * which is kept in sync with the presence and callability
+ * of a _Finalizer hidden symbol.
+ */
+
+ if (!DUK_HEAPHDR_HAS_REACHABLE(hdr) &&
+ DUK_HEAPHDR_IS_OBJECT(hdr) &&
+ !DUK_HEAPHDR_HAS_FINALIZED(hdr) &&
+ DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr)) {
+ /* heaphdr:
+ * - is not reachable
+ * - is an object
+ * - is not a finalized object waiting for rescue/keep decision
+ * - has a finalizer
+ */
+
+ DUK_DD(DUK_DDPRINT("unreachable heap object will be "
+ "finalized -> mark as finalizable "
+ "and treat as a reachability root: %p",
+ (void *) hdr));
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr));
+ DUK_HEAPHDR_SET_FINALIZABLE(hdr);
+ count_finalizable++;
+ }
+
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+
+ if (count_finalizable == 0) {
+ return;
+ }
+
+ DUK_DD(DUK_DDPRINT("marked %ld heap objects as finalizable, now mark them reachable",
+ (long) count_finalizable));
+
+ hdr = heap->heap_allocated;
+ while (hdr != NULL) {
+ if (DUK_HEAPHDR_HAS_FINALIZABLE(hdr)) {
+ duk__mark_heaphdr_nonnull(heap, hdr);
+ }
+
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+
+ /* Caller will finish the marking process if we hit a recursion limit. */
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+/*
+ * Mark objects on finalize_list.
+ */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_LOCAL void duk__mark_finalize_list(duk_heap *heap) {
+ duk_heaphdr *hdr;
+#if defined(DUK_USE_DEBUG)
+ duk_size_t count_finalize_list = 0;
+#endif
+
+ DUK_DD(DUK_DDPRINT("duk__mark_finalize_list: %p", (void *) heap));
+
+ hdr = heap->finalize_list;
+ while (hdr != NULL) {
+ duk__mark_heaphdr_nonnull(heap, hdr);
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+#if defined(DUK_USE_DEBUG)
+ count_finalize_list++;
+#endif
+ }
+
+#if defined(DUK_USE_DEBUG)
+ if (count_finalize_list > 0) {
+ DUK_D(DUK_DPRINT("marked %ld objects on the finalize_list as reachable (previous finalizer run skipped)",
+ (long) count_finalize_list));
+ }
+#endif
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+/*
+ * Fallback marking handler if recursion limit is reached.
+ *
+ * Iterates 'temproots' until recursion limit is no longer hit. Temproots
+ * can be in heap_allocated or finalize_list; refzero_list is now always
+ * empty for mark-and-sweep. A temproot may occur in finalize_list now if
+ * there are objects on the finalize_list and user code creates a reference
+ * from an object in heap_allocated to the object in finalize_list (which is
+ * now allowed), and it happened to coincide with the recursion depth limit.
+ *
+ * This is a slow scan, but guarantees that we finish with a bounded C stack.
+ *
+ * Note that nodes may have been marked as temproots before this scan begun,
+ * OR they may have been marked during the scan (as we process nodes
+ * recursively also during the scan). This is intended behavior.
+ */
+
+#if defined(DUK_USE_DEBUG)
+DUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr, duk_size_t *count) {
+#else
+DUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr) {
+#endif
+ DUK_ASSERT(hdr != NULL);
+
+ if (!DUK_HEAPHDR_HAS_TEMPROOT(hdr)) {
+ DUK_DDD(DUK_DDDPRINT("not a temp root: %p", (void *) hdr));
+ return;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("found a temp root: %p", (void *) hdr));
+ DUK_HEAPHDR_CLEAR_TEMPROOT(hdr);
+ DUK_HEAPHDR_CLEAR_REACHABLE(hdr); /* Done so that duk__mark_heaphdr() works correctly. */
+#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)
+ hdr->h_assert_refcount--; /* Same node visited twice. */
+#endif
+ duk__mark_heaphdr_nonnull(heap, hdr);
+
+#if defined(DUK_USE_DEBUG)
+ (*count)++;
+#endif
+}
+
+DUK_LOCAL void duk__mark_temproots_by_heap_scan(duk_heap *heap) {
+ duk_heaphdr *hdr;
+#if defined(DUK_USE_DEBUG)
+ duk_size_t count;
+#endif
+
+ DUK_DD(DUK_DDPRINT("duk__mark_temproots_by_heap_scan: %p", (void *) heap));
+
+ while (DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)) {
+ DUK_DD(DUK_DDPRINT("recursion limit reached, doing heap scan to continue from temproots"));
+
+#if defined(DUK_USE_DEBUG)
+ count = 0;
+#endif
+ DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap);
+
+ hdr = heap->heap_allocated;
+ while (hdr) {
+#if defined(DUK_USE_DEBUG)
+ duk__handle_temproot(heap, hdr, &count);
+#else
+ duk__handle_temproot(heap, hdr);
+#endif
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ hdr = heap->finalize_list;
+ while (hdr) {
+#if defined(DUK_USE_DEBUG)
+ duk__handle_temproot(heap, hdr, &count);
+#else
+ duk__handle_temproot(heap, hdr);
+#endif
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+#endif
+
+#if defined(DUK_USE_DEBUG)
+ DUK_DD(DUK_DDPRINT("temproot mark heap scan processed %ld temp roots", (long) count));
+#endif
+ }
+}
+
+/*
+ * Finalize refcounts for heap elements just about to be freed.
+ * This must be done for all objects before freeing to avoid any
+ * stale pointer dereferences.
+ *
+ * Note that this must deduce the set of objects to be freed
+ * identically to duk__sweep_heap().
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+DUK_LOCAL void duk__finalize_refcounts(duk_heap *heap) {
+ duk_heaphdr *hdr;
+
+ DUK_ASSERT(heap->heap_thread != NULL);
+
+ DUK_DD(DUK_DDPRINT("duk__finalize_refcounts: heap=%p", (void *) heap));
+
+ hdr = heap->heap_allocated;
+ while (hdr) {
+ if (!DUK_HEAPHDR_HAS_REACHABLE(hdr)) {
+ /*
+ * Unreachable object about to be swept. Finalize target refcounts
+ * (objects which the unreachable object points to) without doing
+ * refzero processing. Recursive decrefs are also prevented when
+ * refzero processing is disabled.
+ *
+ * Value cannot be a finalizable object, as they have been made
+ * temporarily reachable for this round.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("unreachable object, refcount finalize before sweeping: %p", (void *) hdr));
+
+ /* Finalize using heap->heap_thread; DECREF has a
+ * suppress check for mark-and-sweep which is based
+ * on heap->ms_running.
+ */
+ duk_heaphdr_refcount_finalize_norz(heap, hdr);
+ }
+
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+}
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+/*
+ * Clear (reachable) flags of finalize_list.
+ *
+ * We could mostly do in the sweep phase when we move objects from the
+ * heap into the finalize_list. However, if a finalizer run is skipped
+ * during a mark-and-sweep, the objects on the finalize_list will be marked
+ * reachable during the next mark-and-sweep. Since they're already on the
+ * finalize_list, no-one will be clearing their REACHABLE flag so we do it
+ * here. (This now overlaps with the sweep handling in a harmless way.)
+ */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_LOCAL void duk__clear_finalize_list_flags(duk_heap *heap) {
+ duk_heaphdr *hdr;
+
+ DUK_DD(DUK_DDPRINT("duk__clear_finalize_list_flags: %p", (void *) heap));
+
+ hdr = heap->finalize_list;
+ while (hdr) {
+ DUK_HEAPHDR_CLEAR_REACHABLE(hdr);
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(hdr) || \
+ (heap->currently_finalizing == hdr));
+#endif
+ /* DUK_HEAPHDR_FLAG_FINALIZED may be set. */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr));
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+/*
+ * Sweep stringtable.
+ */
+
+DUK_LOCAL void duk__sweep_stringtable(duk_heap *heap, duk_size_t *out_count_keep) {
+ duk_hstring *h;
+ duk_hstring *prev;
+ duk_uint32_t i;
+#if defined(DUK_USE_DEBUG)
+ duk_size_t count_free = 0;
+#endif
+ duk_size_t count_keep = 0;
+
+ DUK_DD(DUK_DDPRINT("duk__sweep_stringtable: %p", (void *) heap));
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ if (heap->strtable16 == NULL) {
+#else
+ if (heap->strtable == NULL) {
+#endif
+ goto done;
+ }
+
+ for (i = 0; i < heap->st_size; i++) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]);
+#else
+ h = heap->strtable[i];
+#endif
+ prev = NULL;
+ while (h != NULL) {
+ duk_hstring *next;
+ next = h->hdr.h_next;
+
+ if (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h)) {
+ DUK_HEAPHDR_CLEAR_REACHABLE((duk_heaphdr *) h);
+ count_keep++;
+ prev = h;
+ } else {
+#if defined(DUK_USE_DEBUG)
+ count_free++;
+#endif
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Non-zero refcounts should not happen for unreachable strings,
+ * because we refcount finalize all unreachable objects which
+ * should have decreased unreachable string refcounts to zero
+ * (even for cycles).
+ */
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) == 0);
+#endif
+
+ /* Deal with weak references first. */
+ duk_heap_strcache_string_remove(heap, (duk_hstring *) h);
+
+ /* Remove the string from the string table. */
+ duk_heap_strtable_unlink_prev(heap, (duk_hstring *) h, (duk_hstring *) prev);
+
+ /* Free inner references (these exist e.g. when external
+ * strings are enabled) and the struct itself.
+ */
+ duk_free_hstring(heap, (duk_hstring *) h);
+
+ /* Don't update 'prev'; it should be last string kept. */
+ }
+
+ h = next;
+ }
+ }
+
+ done:
+#if defined(DUK_USE_DEBUG)
+ DUK_D(DUK_DPRINT("mark-and-sweep sweep stringtable: %ld freed, %ld kept",
+ (long) count_free, (long) count_keep));
+#endif
+ *out_count_keep = count_keep;
+}
+
+/*
+ * Sweep heap.
+ */
+
+DUK_LOCAL void duk__sweep_heap(duk_heap *heap, duk_small_uint_t flags, duk_size_t *out_count_keep) {
+ duk_heaphdr *prev; /* last element that was left in the heap */
+ duk_heaphdr *curr;
+ duk_heaphdr *next;
+#if defined(DUK_USE_DEBUG)
+ duk_size_t count_free = 0;
+ duk_size_t count_finalize = 0;
+ duk_size_t count_rescue = 0;
+#endif
+ duk_size_t count_keep = 0;
+
+ DUK_DD(DUK_DDPRINT("duk__sweep_heap: %p", (void *) heap));
+
+ prev = NULL;
+ curr = heap->heap_allocated;
+ heap->heap_allocated = NULL;
+ while (curr) {
+ /* Strings and ROM objects are never placed on the heap allocated list. */
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_STRING);
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr));
+
+ next = DUK_HEAPHDR_GET_NEXT(heap, curr);
+
+ if (DUK_HEAPHDR_HAS_REACHABLE(curr)) {
+ /*
+ * Reachable object:
+ * - If FINALIZABLE -> actually unreachable (but marked
+ * artificially reachable), queue to finalize_list.
+ * - If !FINALIZABLE but FINALIZED -> rescued after
+ * finalizer execution.
+ * - Otherwise just a normal, reachable object.
+ *
+ * Objects which are kept are queued to heap_allocated
+ * tail (we're essentially filtering heap_allocated in
+ * practice).
+ */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE(curr))) {
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);
+ DUK_DD(DUK_DDPRINT("sweep; reachable, finalizable --> move to finalize_list: %p", (void *) curr));
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_HEAPHDR_PREINC_REFCOUNT(curr); /* Bump refcount so that refzero never occurs when pending a finalizer call. */
+#endif
+ DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, curr);
+#if defined(DUK_USE_DEBUG)
+ count_finalize++;
+#endif
+ }
+ else
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+ {
+ if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZED(curr))) {
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr));
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);
+
+ if (flags & DUK_MS_FLAG_POSTPONE_RESCUE) {
+ DUK_DD(DUK_DDPRINT("sweep; reachable, finalized, but postponing rescue decisions --> keep object (with FINALIZED set): %!iO", curr));
+ count_keep++;
+ } else {
+ DUK_DD(DUK_DDPRINT("sweep; reachable, finalized --> rescued after finalization: %p", (void *) curr));
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ DUK_HEAPHDR_CLEAR_FINALIZED(curr);
+#endif
+#if defined(DUK_USE_DEBUG)
+ count_rescue++;
+#endif
+ }
+ } else {
+ DUK_DD(DUK_DDPRINT("sweep; reachable --> keep: %!iO", curr));
+ count_keep++;
+ }
+
+ if (prev != NULL) {
+ DUK_ASSERT(heap->heap_allocated != NULL);
+ DUK_HEAPHDR_SET_NEXT(heap, prev, curr);
+ } else {
+ DUK_ASSERT(heap->heap_allocated == NULL);
+ heap->heap_allocated = curr;
+ }
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+ DUK_HEAPHDR_SET_PREV(heap, curr, prev);
+#endif
+ DUK_ASSERT_HEAPHDR_LINKS(heap, prev);
+ DUK_ASSERT_HEAPHDR_LINKS(heap, curr);
+ prev = curr;
+ }
+
+ /*
+ * Shrink check for value stacks here. We're inside
+ * ms_prevent_count protection which prevents recursive
+ * mark-and-sweep and refzero finalizers, so there are
+ * no side effects that would affect the heap lists.
+ */
+ if (DUK_HEAPHDR_IS_OBJECT(curr) && DUK_HOBJECT_IS_THREAD((duk_hobject *) curr)) {
+ duk_hthread *thr_curr = (duk_hthread *) curr;
+ DUK_DD(DUK_DDPRINT("value stack shrink check for thread: %!O", curr));
+ duk_valstack_shrink_check_nothrow(thr_curr, flags & DUK_MS_FLAG_EMERGENCY /*snug*/);
+ }
+
+ DUK_HEAPHDR_CLEAR_REACHABLE(curr);
+ /* Keep FINALIZED if set, used if rescue decisions are postponed. */
+ /* Keep FINALIZABLE for objects on finalize_list. */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr));
+ } else {
+ /*
+ * Unreachable object:
+ * - If FINALIZED, object was finalized but not
+ * rescued. This doesn't affect freeing.
+ * - Otherwise normal unreachable object.
+ *
+ * There's no guard preventing a FINALIZED object
+ * from being freed while finalizers execute: the
+ * artificial finalize_list reachability roots can't
+ * cause an incorrect free decision (but can cause
+ * an incorrect rescue decision).
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Non-zero refcounts should not happen because we refcount
+ * finalize all unreachable objects which should cancel out
+ * refcounts (even for cycles).
+ */
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) == 0);
+#endif
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr));
+
+#if defined(DUK_USE_DEBUG)
+ if (DUK_HEAPHDR_HAS_FINALIZED(curr)) {
+ DUK_DD(DUK_DDPRINT("sweep; unreachable, finalized --> finalized object not rescued: %p", (void *) curr));
+ } else {
+ DUK_DD(DUK_DDPRINT("sweep; not reachable --> free: %p", (void *) curr));
+ }
+
+#endif
+
+ /* Note: object cannot be a finalizable unreachable object, as
+ * they have been marked temporarily reachable for this round,
+ * and are handled above.
+ */
+
+#if defined(DUK_USE_DEBUG)
+ count_free++;
+#endif
+
+ /* Weak refs should be handled here, but no weak refs for
+ * any non-string objects exist right now.
+ */
+
+ /* Free object and all auxiliary (non-heap) allocs. */
+ duk_heap_free_heaphdr_raw(heap, curr);
+ }
+
+ curr = next;
+ }
+
+ if (prev != NULL) {
+ DUK_HEAPHDR_SET_NEXT(heap, prev, NULL);
+ }
+ DUK_ASSERT_HEAPHDR_LINKS(heap, prev);
+
+#if defined(DUK_USE_DEBUG)
+ DUK_D(DUK_DPRINT("mark-and-sweep sweep objects (non-string): %ld freed, %ld kept, %ld rescued, %ld queued for finalization",
+ (long) count_free, (long) count_keep, (long) count_rescue, (long) count_finalize));
+#endif
+ *out_count_keep = count_keep;
+}
+
+/*
+ * Object compaction.
+ *
+ * Compaction is assumed to never throw an error.
+ */
+
+DUK_LOCAL int duk__protected_compact_object(duk_hthread *thr, void *udata) {
+ duk_hobject *obj;
+ /* XXX: for threads, compact stacks? */
+
+ DUK_UNREF(udata);
+ obj = duk_known_hobject(thr, -1);
+ duk_hobject_compact_props(thr, obj);
+ return 0;
+}
+
+#if defined(DUK_USE_DEBUG)
+DUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start, duk_size_t *p_count_check, duk_size_t *p_count_compact, duk_size_t *p_count_bytes_saved) {
+#else
+DUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start) {
+#endif
+ duk_heaphdr *curr;
+#if defined(DUK_USE_DEBUG)
+ duk_size_t old_size, new_size;
+#endif
+ duk_hobject *obj;
+
+ DUK_UNREF(heap);
+
+ curr = start;
+ while (curr) {
+ DUK_DDD(DUK_DDDPRINT("mark-and-sweep compact: %p", (void *) curr));
+
+ if (DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_OBJECT) {
+ goto next;
+ }
+ obj = (duk_hobject *) curr;
+
+#if defined(DUK_USE_DEBUG)
+ old_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),
+ DUK_HOBJECT_GET_ASIZE(obj),
+ DUK_HOBJECT_GET_HSIZE(obj));
+#endif
+
+ DUK_DD(DUK_DDPRINT("compact object: %p", (void *) obj));
+ duk_push_hobject(thr, obj);
+ /* XXX: disable error handlers for duration of compaction? */
+ duk_safe_call(thr, duk__protected_compact_object, NULL, 1, 0);
+
+#if defined(DUK_USE_DEBUG)
+ new_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),
+ DUK_HOBJECT_GET_ASIZE(obj),
+ DUK_HOBJECT_GET_HSIZE(obj));
+#endif
+
+#if defined(DUK_USE_DEBUG)
+ (*p_count_compact)++;
+ (*p_count_bytes_saved) += (duk_size_t) (old_size - new_size);
+#endif
+
+ next:
+ curr = DUK_HEAPHDR_GET_NEXT(heap, curr);
+#if defined(DUK_USE_DEBUG)
+ (*p_count_check)++;
+#endif
+ }
+}
+
+DUK_LOCAL void duk__compact_objects(duk_heap *heap) {
+ /* XXX: which lists should participate? to be finalized? */
+#if defined(DUK_USE_DEBUG)
+ duk_size_t count_check = 0;
+ duk_size_t count_compact = 0;
+ duk_size_t count_bytes_saved = 0;
+#endif
+
+ DUK_DD(DUK_DDPRINT("duk__compact_objects: %p", (void *) heap));
+
+ DUK_ASSERT(heap->heap_thread != NULL);
+
+#if defined(DUK_USE_DEBUG)
+ duk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated, &count_check, &count_compact, &count_bytes_saved);
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ duk__compact_object_list(heap, heap->heap_thread, heap->finalize_list, &count_check, &count_compact, &count_bytes_saved);
+#endif
+#else
+ duk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated);
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ duk__compact_object_list(heap, heap->heap_thread, heap->finalize_list);
+#endif
+#endif
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */
+#endif
+
+#if defined(DUK_USE_DEBUG)
+ DUK_D(DUK_DPRINT("mark-and-sweep compact objects: %ld checked, %ld compaction attempts, %ld bytes saved by compaction",
+ (long) count_check, (long) count_compact, (long) count_bytes_saved));
+#endif
+}
+
+/*
+ * Assertion helpers.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+DUK_LOCAL void duk__assert_heaphdr_flags(duk_heap *heap) {
+ duk_heaphdr *hdr;
+
+ hdr = heap->heap_allocated;
+ while (hdr) {
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(hdr));
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr));
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(hdr));
+ /* may have FINALIZED */
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */
+#endif
+}
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+DUK_LOCAL void duk__assert_valid_refcounts(duk_heap *heap) {
+ duk_heaphdr *hdr = heap->heap_allocated;
+ while (hdr) {
+ /* Cannot really assert much w.r.t. refcounts now. */
+
+ if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0 &&
+ DUK_HEAPHDR_HAS_FINALIZED(hdr)) {
+ /* An object may be in heap_allocated list with a zero
+ * refcount if it has just been finalized and is waiting
+ * to be collected by the next cycle.
+ * (This doesn't currently happen however.)
+ */
+ } else if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0) {
+ /* An object may be in heap_allocated list with a zero
+ * refcount also if it is a temporary object created
+ * during debugger paused state. It will get collected
+ * by mark-and-sweep based on its reachability status
+ * (presumably not reachable because refcount is 0).
+ */
+ }
+ DUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(hdr) >= 0); /* Unsigned. */
+ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ }
+}
+
+DUK_LOCAL void duk__clear_assert_refcounts(duk_heap *heap) {
+ duk_heaphdr *curr;
+ duk_uint32_t i;
+
+ for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {
+ curr->h_assert_refcount = 0;
+ }
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ for (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {
+ curr->h_assert_refcount = 0;
+ }
+#endif
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ for (curr = heap->refzero_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {
+ curr->h_assert_refcount = 0;
+ }
+#endif
+
+ for (i = 0; i < heap->st_size; i++) {
+ duk_hstring *h;
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]);
+#else
+ h = heap->strtable[i];
+#endif
+ while (h != NULL) {
+ ((duk_heaphdr *) h)->h_assert_refcount = 0;
+ h = h->hdr.h_next;
+ }
+ }
+}
+
+DUK_LOCAL void duk__check_refcount_heaphdr(duk_heaphdr *hdr) {
+ duk_bool_t count_ok;
+
+ /* The refcount check only makes sense for reachable objects on
+ * heap_allocated or string table, after the sweep phase. Prior to
+ * sweep phase refcounts will include references that are not visible
+ * via reachability roots.
+ *
+ * Because we're called after the sweep phase, all heap objects on
+ * heap_allocated are reachable. REACHABLE flags have already been
+ * cleared so we can't check them.
+ */
+
+ /* ROM objects have intentionally incorrect refcount (1), but we won't
+ * check them.
+ */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr));
+
+ count_ok = ((duk_size_t) DUK_HEAPHDR_GET_REFCOUNT(hdr) == hdr->h_assert_refcount);
+ if (!count_ok) {
+ DUK_D(DUK_DPRINT("refcount mismatch for: %p: header=%ld counted=%ld --> %!iO",
+ (void *) hdr, (long) DUK_HEAPHDR_GET_REFCOUNT(hdr),
+ (long) hdr->h_assert_refcount, hdr));
+ DUK_ASSERT(0);
+ }
+}
+
+DUK_LOCAL void duk__check_assert_refcounts(duk_heap *heap) {
+ duk_heaphdr *curr;
+ duk_uint32_t i;
+
+ for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {
+ duk__check_refcount_heaphdr(curr);
+ }
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ for (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {
+ duk__check_refcount_heaphdr(curr);
+ }
+#endif
+
+ for (i = 0; i < heap->st_size; i++) {
+ duk_hstring *h;
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]);
+#else
+ h = heap->strtable[i];
+#endif
+ while (h != NULL) {
+ duk__check_refcount_heaphdr((duk_heaphdr *) h);
+ h = h->hdr.h_next;
+ }
+ }
+}
+#endif /* DUK_USE_REFERENCE_COUNTING */
+#endif /* DUK_USE_ASSERTIONS */
+
+/*
+ * Stats dump.
+ */
+
+#if defined(DUK_USE_DEBUG)
+DUK_LOCAL void duk__dump_stats(duk_heap *heap) {
+ DUK_D(DUK_DPRINT("stats executor: opcodes=%ld, interrupt=%ld, throw=%ld",
+ (long) heap->stats_exec_opcodes, (long) heap->stats_exec_interrupt,
+ (long) heap->stats_exec_throw));
+ DUK_D(DUK_DPRINT("stats call: all=%ld, tailcall=%ld, ecmatoecma=%ld",
+ (long) heap->stats_call_all, (long) heap->stats_call_tailcall,
+ (long) heap->stats_call_ecmatoecma));
+ DUK_D(DUK_DPRINT("stats safecall: all=%ld, nothrow=%ld, throw=%ld",
+ (long) heap->stats_safecall_all, (long) heap->stats_safecall_nothrow,
+ (long) heap->stats_safecall_throw));
+ DUK_D(DUK_DPRINT("stats mark-and-sweep: try_count=%ld, skip_count=%ld, emergency_count=%ld",
+ (long) heap->stats_ms_try_count, (long) heap->stats_ms_skip_count,
+ (long) heap->stats_ms_emergency_count));
+ DUK_D(DUK_DPRINT("stats stringtable: intern_hit=%ld, intern_miss=%ld, resize_check=%ld, resize_grow=%ld, resize_shrink=%ld",
+ (long) heap->stats_strtab_intern_hit, (long) heap->stats_strtab_intern_miss,
+ (long) heap->stats_strtab_resize_check, (long) heap->stats_strtab_resize_grow,
+ (long) heap->stats_strtab_resize_shrink));
+ DUK_D(DUK_DPRINT("stats object: realloc_props=%ld, abandon_array=%ld",
+ (long) heap->stats_object_realloc_props, (long) heap->stats_object_abandon_array));
+ DUK_D(DUK_DPRINT("stats getownpropdesc: count=%ld, hit=%ld, miss=%ld",
+ (long) heap->stats_getownpropdesc_count, (long) heap->stats_getownpropdesc_hit,
+ (long) heap->stats_getownpropdesc_miss));
+ DUK_D(DUK_DPRINT("stats getpropdesc: count=%ld, hit=%ld, miss=%ld",
+ (long) heap->stats_getpropdesc_count, (long) heap->stats_getpropdesc_hit,
+ (long) heap->stats_getpropdesc_miss));
+ DUK_D(DUK_DPRINT("stats getprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, "
+ "bufferidx=%ld, bufferlen=%ld, stringidx=%ld, stringlen=%ld, "
+ "proxy=%ld, arguments=%ld",
+ (long) heap->stats_getprop_all, (long) heap->stats_getprop_arrayidx,
+ (long) heap->stats_getprop_bufobjidx, (long) heap->stats_getprop_bufferidx,
+ (long) heap->stats_getprop_bufferlen, (long) heap->stats_getprop_stringidx,
+ (long) heap->stats_getprop_stringlen, (long) heap->stats_getprop_proxy,
+ (long) heap->stats_getprop_arguments));
+ DUK_D(DUK_DPRINT("stats putprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, "
+ "bufferidx=%ld, proxy=%ld",
+ (long) heap->stats_putprop_all, (long) heap->stats_putprop_arrayidx,
+ (long) heap->stats_putprop_bufobjidx, (long) heap->stats_putprop_bufferidx,
+ (long) heap->stats_putprop_proxy));
+ DUK_D(DUK_DPRINT("stats getvar: all=%ld",
+ (long) heap->stats_getvar_all));
+ DUK_D(DUK_DPRINT("stats putvar: all=%ld",
+ (long) heap->stats_putvar_all));
+}
+#endif /* DUK_USE_DEBUG */
+
+/*
+ * Main mark-and-sweep function.
+ *
+ * 'flags' represents the features requested by the caller. The current
+ * heap->ms_base_flags is ORed automatically into the flags; the base flags
+ * mask typically prevents certain mark-and-sweep operation to avoid trouble.
+ */
+
+DUK_INTERNAL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags) {
+ duk_size_t count_keep_obj;
+ duk_size_t count_keep_str;
+#if defined(DUK_USE_VOLUNTARY_GC)
+ duk_size_t tmp;
+#endif
+
+ DUK_STATS_INC(heap, stats_ms_try_count);
+#if defined(DUK_USE_DEBUG)
+ if (flags & DUK_MS_FLAG_EMERGENCY) {
+ DUK_STATS_INC(heap, stats_ms_emergency_count);
+ }
+#endif
+
+ /* If debugger is paused, garbage collection is disabled by default.
+ * This is achieved by bumping ms_prevent_count when becoming paused.
+ */
+ DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) || heap->ms_prevent_count > 0);
+
+ /* Prevention/recursion check as soon as possible because we may
+ * be called a number of times when voluntary mark-and-sweep is
+ * pending.
+ */
+ if (heap->ms_prevent_count != 0) {
+ DUK_DD(DUK_DDPRINT("reject recursive mark-and-sweep"));
+ DUK_STATS_INC(heap, stats_ms_skip_count);
+ return;
+ }
+ DUK_ASSERT(heap->ms_running == 0); /* ms_prevent_count is bumped when ms_running is set */
+
+ /* Heap_thread is used during mark-and-sweep for refcount finalization
+ * (it's also used for finalizer execution once mark-and-sweep is
+ * complete). Heap allocation code ensures heap_thread is set and
+ * properly initialized before setting ms_prevent_count to 0.
+ */
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(heap->heap_thread->valstack != NULL);
+
+ DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) starting, requested flags: 0x%08lx, effective flags: 0x%08lx",
+ (unsigned long) flags, (unsigned long) (flags | heap->ms_base_flags)));
+
+ flags |= heap->ms_base_flags;
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ if (heap->finalize_list != NULL) {
+ flags |= DUK_MS_FLAG_POSTPONE_RESCUE;
+ }
+#endif
+
+ /*
+ * Assertions before
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(heap->ms_prevent_count == 0);
+ DUK_ASSERT(heap->ms_running == 0);
+ DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap));
+ DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap));
+ DUK_ASSERT(heap->ms_recursion_depth == 0);
+ duk__assert_heaphdr_flags(heap);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Note: heap->refzero_free_running may be true; a refcount
+ * finalizer may trigger a mark-and-sweep.
+ */
+ duk__assert_valid_refcounts(heap);
+#endif /* DUK_USE_REFERENCE_COUNTING */
+#endif /* DUK_USE_ASSERTIONS */
+
+ /*
+ * Begin
+ */
+
+ DUK_ASSERT(heap->ms_prevent_count == 0);
+ DUK_ASSERT(heap->ms_running == 0);
+ heap->ms_prevent_count = 1;
+ heap->ms_running = 1;
+
+ /*
+ * Free activation/catcher freelists on every mark-and-sweep for now.
+ * This is an initial rough draft; ideally we'd keep count of the
+ * freelist size and free only excess entries.
+ */
+
+ DUK_D(DUK_DPRINT("freeing temporary freelists"));
+ duk_heap_free_freelists(heap);
+
+ /*
+ * Mark roots, hoping that recursion limit is not normally hit.
+ * If recursion limit is hit, run additional reachability rounds
+ * starting from "temproots" until marking is complete.
+ *
+ * Marking happens in two phases: first we mark actual reachability
+ * roots (and run "temproots" to complete the process). Then we
+ * check which objects are unreachable and are finalizable; such
+ * objects are marked as FINALIZABLE and marked as reachability
+ * (and "temproots" is run again to complete the process).
+ *
+ * The heap finalize_list must also be marked as a reachability root.
+ * There may be objects on the list from a previous round if the
+ * previous run had finalizer skip flag.
+ */
+
+#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)
+ duk__clear_assert_refcounts(heap);
+#endif
+ duk__mark_roots_heap(heap); /* Mark main reachability roots. */
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */
+#endif
+ duk__mark_temproots_by_heap_scan(heap); /* Temproots. */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ duk__mark_finalizable(heap); /* Mark finalizable as reachability roots. */
+ duk__mark_finalize_list(heap); /* Mark finalizer work list as reachability roots. */
+#endif
+ duk__mark_temproots_by_heap_scan(heap); /* Temproots. */
+
+ /*
+ * Sweep garbage and remove marking flags, and move objects with
+ * finalizers to the finalizer work list.
+ *
+ * Objects to be swept need to get their refcounts finalized before
+ * they are swept. In other words, their target object refcounts
+ * need to be decreased. This has to be done before freeing any
+ * objects to avoid decref'ing dangling pointers (which may happen
+ * even without bugs, e.g. with reference loops)
+ *
+ * Because strings don't point to other heap objects, similar
+ * finalization is not necessary for strings.
+ */
+
+ /* XXX: more emergency behavior, e.g. find smaller hash sizes etc */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk__finalize_refcounts(heap);
+#endif
+ duk__sweep_heap(heap, flags, &count_keep_obj);
+ duk__sweep_stringtable(heap, &count_keep_str);
+#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)
+ duk__check_assert_refcounts(heap);
+#endif
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */
+#endif
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ duk__clear_finalize_list_flags(heap);
+#endif
+
+ /*
+ * Object compaction (emergency only).
+ *
+ * Object compaction is a separate step after sweeping, as there is
+ * more free memory for it to work with. Also, currently compaction
+ * may insert new objects into the heap allocated list and the string
+ * table which we don't want to do during a sweep (the reachability
+ * flags of such objects would be incorrect). The objects inserted
+ * are currently:
+ *
+ * - a temporary duk_hbuffer for a new properties allocation
+ * - if array part is abandoned, string keys are interned
+ *
+ * The object insertions go to the front of the list, so they do not
+ * cause an infinite loop (they are not compacted).
+ */
+
+ if ((flags & DUK_MS_FLAG_EMERGENCY) &&
+ !(flags & DUK_MS_FLAG_NO_OBJECT_COMPACTION)) {
+ duk__compact_objects(heap);
+ }
+
+ /*
+ * String table resize check.
+ *
+ * This is mainly useful in emergency GC: if the string table load
+ * factor is really low for some reason, we can shrink the string
+ * table to a smaller size and free some memory in the process.
+ * Only execute in emergency GC. String table has internal flags
+ * to protect against recursive resizing if this mark-and-sweep pass
+ * was triggered by a string table resize.
+ */
+
+ if (flags & DUK_MS_FLAG_EMERGENCY) {
+ DUK_D(DUK_DPRINT("stringtable resize check in emergency gc"));
+ duk_heap_strtable_force_resize(heap);
+ }
+
+ /*
+ * Finish
+ */
+
+ DUK_ASSERT(heap->ms_prevent_count == 1);
+ heap->ms_prevent_count = 0;
+ DUK_ASSERT(heap->ms_running == 1);
+ heap->ms_running = 0;
+
+ /*
+ * Assertions after
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(heap->ms_prevent_count == 0);
+ DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap));
+ DUK_ASSERT(heap->ms_recursion_depth == 0);
+ duk__assert_heaphdr_flags(heap);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Note: heap->refzero_free_running may be true; a refcount
+ * finalizer may trigger a mark-and-sweep.
+ */
+ duk__assert_valid_refcounts(heap);
+#endif /* DUK_USE_REFERENCE_COUNTING */
+#endif /* DUK_USE_ASSERTIONS */
+
+ /*
+ * Reset trigger counter
+ */
+
+#if defined(DUK_USE_VOLUNTARY_GC)
+ tmp = (count_keep_obj + count_keep_str) / 256;
+ heap->ms_trigger_counter = (duk_int_t) (
+ (tmp * DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT) +
+ DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD);
+ DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, trigger reset to %ld",
+ (long) count_keep_obj, (long) count_keep_str, (long) heap->ms_trigger_counter));
+#else
+ DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, no voluntary trigger",
+ (long) count_keep_obj, (long) count_keep_str));
+#endif
+
+ /*
+ * Stats dump
+ */
+
+#if defined(DUK_USE_DEBUG)
+ duk__dump_stats(heap);
+#endif
+
+ /*
+ * Finalize objects in the finalization work list. Finalized
+ * objects are queued back to heap_allocated with FINALIZED set.
+ *
+ * Since finalizers may cause arbitrary side effects, they are
+ * prevented e.g. during string table and object property allocation
+ * resizing using heap->pf_prevent_count. In this case the objects
+ * remain in the finalization work list after mark-and-sweep exits
+ * and they may be finalized on the next pass or any DECREF checking
+ * for finalize_list.
+ *
+ * As of Duktape 2.1 finalization happens outside mark-and-sweep
+ * protection. Mark-and-sweep is allowed while the finalize_list
+ * is being processed, but no rescue decisions are done while the
+ * process is on-going. This avoids incorrect rescue decisions
+ * if an object is considered reachable (and thus rescued) because
+ * of a reference via finalize_list (which is considered a reachability
+ * root). When finalize_list is being processed, reachable objects
+ * with FINALIZED set will just keep their FINALIZED flag for later
+ * mark-and-sweep processing.
+ *
+ * This could also be handled (a bit better) by having a more refined
+ * notion of reachability for rescue/free decisions.
+ *
+ * XXX: avoid finalizer execution when doing emergency GC?
+ */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ /* Attempt to process finalize_list, pf_prevent_count check
+ * is inside the target.
+ */
+ duk_heap_process_finalize_list(heap);
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+}
+#line 1 "duk_heap_memory.c"
+/*
+ * Memory allocation handling.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Voluntary GC check
+ */
+
+#if defined(DUK_USE_VOLUNTARY_GC)
+DUK_LOCAL DUK_INLINE void duk__check_voluntary_gc(duk_heap *heap) {
+ if (DUK_UNLIKELY(--(heap)->ms_trigger_counter < 0)) {
+#if defined(DUK_USE_DEBUG)
+ if (heap->ms_prevent_count == 0) {
+ DUK_D(DUK_DPRINT("triggering voluntary mark-and-sweep"));
+ } else {
+ DUK_DD(DUK_DDPRINT("gc blocked -> skip voluntary mark-and-sweep now"));
+ }
+#endif
+
+ /* Prevention checks in the call target handle cases where
+ * voluntary GC is not allowed. The voluntary GC trigger
+ * counter is only rewritten if mark-and-sweep actually runs.
+ */
+ duk_heap_mark_and_sweep(heap, DUK_MS_FLAG_VOLUNTARY /*flags*/);
+ }
+}
+#define DUK__VOLUNTARY_PERIODIC_GC(heap) do { duk__check_voluntary_gc((heap)); } while (0)
+#else
+#define DUK__VOLUNTARY_PERIODIC_GC(heap) /* no voluntary gc */
+#endif /* DUK_USE_VOLUNTARY_GC */
+
+/*
+ * Allocate memory with garbage collection
+ */
+
+DUK_INTERNAL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size) {
+ void *res;
+ duk_small_int_t i;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT_DISABLE(size >= 0);
+
+ /*
+ * Voluntary periodic GC (if enabled)
+ */
+
+ DUK__VOLUNTARY_PERIODIC_GC(heap);
+
+ /*
+ * First attempt
+ */
+
+#if defined(DUK_USE_GC_TORTURE)
+ /* Simulate alloc failure on every alloc, except when mark-and-sweep
+ * is running.
+ */
+ if (heap->ms_prevent_count == 0) {
+ DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first alloc attempt fails"));
+ res = NULL;
+ DUK_UNREF(res);
+ goto skip_attempt;
+ }
+#endif
+ res = heap->alloc_func(heap->heap_udata, size);
+ if (DUK_LIKELY(res || size == 0)) {
+ /* For zero size allocations NULL is allowed. */
+ return res;
+ }
+#if defined(DUK_USE_GC_TORTURE)
+ skip_attempt:
+#endif
+
+ DUK_D(DUK_DPRINT("first alloc attempt failed, attempt to gc and retry"));
+
+#if 0
+ /*
+ * Avoid a GC if GC is already running. This can happen at a late
+ * stage in a GC when we try to e.g. resize the stringtable
+ * or compact objects.
+ *
+ * NOTE: explicit handling isn't actually be needed: if the GC is
+ * not allowed, duk_heap_mark_and_sweep() will reject it for every
+ * attempt in the loop below, resulting in a NULL same as here.
+ */
+
+ if (heap->ms_prevent_count != 0) {
+ DUK_D(DUK_DPRINT("duk_heap_mem_alloc() failed, gc in progress (gc skipped), alloc size %ld", (long) size));
+ return NULL;
+ }
+#endif
+
+ /*
+ * Retry with several GC attempts. Initial attempts are made without
+ * emergency mode; later attempts use emergency mode which minimizes
+ * memory allocations forcibly.
+ */
+
+ for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) {
+ duk_small_uint_t flags;
+
+ flags = 0;
+ if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) {
+ flags |= DUK_MS_FLAG_EMERGENCY;
+ }
+
+ duk_heap_mark_and_sweep(heap, flags);
+
+ res = heap->alloc_func(heap->heap_udata, size);
+ if (res) {
+ DUK_D(DUK_DPRINT("duk_heap_mem_alloc() succeeded after gc (pass %ld), alloc size %ld",
+ (long) (i + 1), (long) size));
+ return res;
+ }
+ }
+
+ DUK_D(DUK_DPRINT("duk_heap_mem_alloc() failed even after gc, alloc size %ld", (long) size));
+ return NULL;
+}
+
+DUK_INTERNAL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size) {
+ void *res;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT_DISABLE(size >= 0);
+
+ res = DUK_ALLOC(heap, size);
+ if (DUK_LIKELY(res != NULL)) {
+ /* assume memset with zero size is OK */
+ DUK_MEMZERO(res, size);
+ }
+ return res;
+}
+
+DUK_INTERNAL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size) {
+ void *res;
+
+ DUK_ASSERT(thr != NULL);
+ res = duk_heap_mem_alloc(thr->heap, size);
+ if (DUK_LIKELY(res != NULL || size == 0)) {
+ return res;
+ }
+ DUK_ERROR_ALLOC_FAILED(thr);
+ return NULL;
+}
+
+DUK_INTERNAL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size) {
+ void *res;
+
+ DUK_ASSERT(thr != NULL);
+ res = duk_heap_mem_alloc_zeroed(thr->heap, size);
+ if (DUK_LIKELY(res != NULL || size == 0)) {
+ return res;
+ }
+ DUK_ERROR_ALLOC_FAILED(thr);
+ return NULL;
+}
+
+/*
+ * Reallocate memory with garbage collection
+ */
+
+DUK_INTERNAL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize) {
+ void *res;
+ duk_small_int_t i;
+
+ DUK_ASSERT(heap != NULL);
+ /* ptr may be NULL */
+ DUK_ASSERT_DISABLE(newsize >= 0);
+
+ /*
+ * Voluntary periodic GC (if enabled)
+ */
+
+ DUK__VOLUNTARY_PERIODIC_GC(heap);
+
+ /*
+ * First attempt
+ */
+
+#if defined(DUK_USE_GC_TORTURE)
+ /* Simulate alloc failure on every realloc, except when mark-and-sweep
+ * is running.
+ */
+ if (heap->ms_prevent_count == 0) {
+ DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first realloc attempt fails"));
+ res = NULL;
+ DUK_UNREF(res);
+ goto skip_attempt;
+ }
+#endif
+ res = heap->realloc_func(heap->heap_udata, ptr, newsize);
+ if (DUK_LIKELY(res || newsize == 0)) {
+ /* For zero size allocations NULL is allowed. */
+ return res;
+ }
+#if defined(DUK_USE_GC_TORTURE)
+ skip_attempt:
+#endif
+
+ DUK_D(DUK_DPRINT("first realloc attempt failed, attempt to gc and retry"));
+
+#if 0
+ /*
+ * Avoid a GC if GC is already running. See duk_heap_mem_alloc().
+ */
+
+ if (heap->ms_prevent_count != 0) {
+ DUK_D(DUK_DPRINT("duk_heap_mem_realloc() failed, gc in progress (gc skipped), alloc size %ld", (long) newsize));
+ return NULL;
+ }
+#endif
+
+ /*
+ * Retry with several GC attempts. Initial attempts are made without
+ * emergency mode; later attempts use emergency mode which minimizes
+ * memory allocations forcibly.
+ */
+
+ for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) {
+ duk_small_uint_t flags;
+
+ flags = 0;
+ if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) {
+ flags |= DUK_MS_FLAG_EMERGENCY;
+ }
+
+ duk_heap_mark_and_sweep(heap, flags);
+
+ res = heap->realloc_func(heap->heap_udata, ptr, newsize);
+ if (res || newsize == 0) {
+ DUK_D(DUK_DPRINT("duk_heap_mem_realloc() succeeded after gc (pass %ld), alloc size %ld",
+ (long) (i + 1), (long) newsize));
+ return res;
+ }
+ }
+
+ DUK_D(DUK_DPRINT("duk_heap_mem_realloc() failed even after gc, alloc size %ld", (long) newsize));
+ return NULL;
+}
+
+/*
+ * Reallocate memory with garbage collection, using a callback to provide
+ * the current allocated pointer. This variant is used when a mark-and-sweep
+ * (e.g. finalizers) might change the original pointer.
+ */
+
+DUK_INTERNAL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize) {
+ void *res;
+ duk_small_int_t i;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT_DISABLE(newsize >= 0);
+
+ /*
+ * Voluntary periodic GC (if enabled)
+ */
+
+ DUK__VOLUNTARY_PERIODIC_GC(heap);
+
+ /*
+ * First attempt
+ */
+
+#if defined(DUK_USE_GC_TORTURE)
+ /* Simulate alloc failure on every realloc, except when mark-and-sweep
+ * is running.
+ */
+ if (heap->ms_prevent_count == 0) {
+ DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first indirect realloc attempt fails"));
+ res = NULL;
+ DUK_UNREF(res);
+ goto skip_attempt;
+ }
+#endif
+ res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize);
+ if (DUK_LIKELY(res || newsize == 0)) {
+ /* For zero size allocations NULL is allowed. */
+ return res;
+ }
+#if defined(DUK_USE_GC_TORTURE)
+ skip_attempt:
+#endif
+
+ DUK_D(DUK_DPRINT("first indirect realloc attempt failed, attempt to gc and retry"));
+
+#if 0
+ /*
+ * Avoid a GC if GC is already running. See duk_heap_mem_alloc().
+ */
+
+ if (heap->ms_prevent_count != 0) {
+ DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() failed, gc in progress (gc skipped), alloc size %ld", (long) newsize));
+ return NULL;
+ }
+#endif
+
+ /*
+ * Retry with several GC attempts. Initial attempts are made without
+ * emergency mode; later attempts use emergency mode which minimizes
+ * memory allocations forcibly.
+ */
+
+ for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) {
+ duk_small_uint_t flags;
+
+#if defined(DUK_USE_DEBUG)
+ void *ptr_pre;
+ void *ptr_post;
+#endif
+
+#if defined(DUK_USE_DEBUG)
+ ptr_pre = cb(heap, ud);
+#endif
+ flags = 0;
+ if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) {
+ flags |= DUK_MS_FLAG_EMERGENCY;
+ }
+
+ duk_heap_mark_and_sweep(heap, flags);
+#if defined(DUK_USE_DEBUG)
+ ptr_post = cb(heap, ud);
+ if (ptr_pre != ptr_post) {
+ DUK_DD(DUK_DDPRINT("realloc base pointer changed by mark-and-sweep: %p -> %p",
+ (void *) ptr_pre, (void *) ptr_post));
+ }
+#endif
+
+ /* Note: key issue here is to re-lookup the base pointer on every attempt.
+ * The pointer being reallocated may change after every mark-and-sweep.
+ */
+
+ res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize);
+ if (res || newsize == 0) {
+ DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() succeeded after gc (pass %ld), alloc size %ld",
+ (long) (i + 1), (long) newsize));
+ return res;
+ }
+ }
+
+ DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() failed even after gc, alloc size %ld", (long) newsize));
+ return NULL;
+}
+
+/*
+ * Free memory
+ */
+
+DUK_INTERNAL void duk_heap_mem_free(duk_heap *heap, void *ptr) {
+ DUK_ASSERT(heap != NULL);
+ /* ptr may be NULL */
+
+ /* Must behave like a no-op with NULL and any pointer returned from
+ * malloc/realloc with zero size.
+ */
+ heap->free_func(heap->heap_udata, ptr);
+
+ /* Never perform a GC (even voluntary) in a memory free, otherwise
+ * all call sites doing frees would need to deal with the side effects.
+ * No need to update voluntary GC counter either.
+ */
+}
+
+/* automatic undefs */
+#undef DUK__VOLUNTARY_PERIODIC_GC
+#line 1 "duk_heap_misc.c"
+/*
+ * Support functions for duk_heap.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) {
+ duk_heaphdr *root;
+
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING);
+
+ root = heap->heap_allocated;
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+ if (root != NULL) {
+ DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL);
+ DUK_HEAPHDR_SET_PREV(heap, root, hdr);
+ }
+ DUK_HEAPHDR_SET_PREV(heap, hdr, NULL);
+#endif
+ DUK_HEAPHDR_SET_NEXT(heap, hdr, root);
+ DUK_ASSERT_HEAPHDR_LINKS(heap, hdr);
+ DUK_ASSERT_HEAPHDR_LINKS(heap, root);
+ heap->heap_allocated = hdr;
+}
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+DUK_INTERNAL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) {
+ duk_heaphdr *prev;
+ duk_heaphdr *next;
+
+ /* Strings are in string table. */
+ DUK_ASSERT(hdr != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING);
+
+ /* Target 'hdr' must be in heap_allocated (not e.g. finalize_list).
+ * If not, heap lists will become corrupted so assert early for it.
+ */
+#if defined(DUK_USE_ASSERTIONS)
+ {
+ duk_heaphdr *tmp;
+ for (tmp = heap->heap_allocated; tmp != NULL; tmp = DUK_HEAPHDR_GET_NEXT(heap, tmp)) {
+ if (tmp == hdr) {
+ break;
+ }
+ }
+ DUK_ASSERT(tmp == hdr);
+ }
+#endif
+
+ /* Read/write only once to minimize pointer compression calls. */
+ prev = DUK_HEAPHDR_GET_PREV(heap, hdr);
+ next = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+
+ if (prev != NULL) {
+ DUK_ASSERT(heap->heap_allocated != hdr);
+ DUK_HEAPHDR_SET_NEXT(heap, prev, next);
+ } else {
+ DUK_ASSERT(heap->heap_allocated == hdr);
+ heap->heap_allocated = next;
+ }
+ if (next != NULL) {
+ DUK_HEAPHDR_SET_PREV(heap, next, prev);
+ } else {
+ ;
+ }
+}
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr) {
+ duk_heaphdr *root;
+
+ root = heap->finalize_list;
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+ DUK_HEAPHDR_SET_PREV(heap, hdr, NULL);
+ if (root != NULL) {
+ DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL);
+ DUK_HEAPHDR_SET_PREV(heap, root, hdr);
+ }
+#endif
+ DUK_HEAPHDR_SET_NEXT(heap, hdr, root);
+ DUK_ASSERT_HEAPHDR_LINKS(heap, hdr);
+ DUK_ASSERT_HEAPHDR_LINKS(heap, root);
+ heap->finalize_list = hdr;
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr) {
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+ duk_heaphdr *next;
+ duk_heaphdr *prev;
+
+ next = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ prev = DUK_HEAPHDR_GET_PREV(heap, hdr);
+ if (next != NULL) {
+ DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, next) == hdr);
+ DUK_HEAPHDR_SET_PREV(heap, next, prev);
+ }
+ if (prev == NULL) {
+ DUK_ASSERT(hdr == heap->finalize_list);
+ heap->finalize_list = next;
+ } else {
+ DUK_ASSERT(hdr != heap->finalize_list);
+ DUK_HEAPHDR_SET_NEXT(heap, prev, next);
+ }
+#else
+ duk_heaphdr *next;
+ duk_heaphdr *curr;
+
+ /* Random removal is expensive: we need to locate the previous element
+ * because we don't have a 'prev' pointer.
+ */
+ curr = heap->finalize_list;
+ if (curr == hdr) {
+ heap->finalize_list = DUK_HEAPHDR_GET_NEXT(heap, curr);
+ } else {
+ DUK_ASSERT(hdr != heap->finalize_list);
+ for (;;) {
+ DUK_ASSERT(curr != NULL); /* Caller responsibility. */
+
+ next = DUK_HEAPHDR_GET_NEXT(heap, curr);
+ if (next == hdr) {
+ next = DUK_HEAPHDR_GET_NEXT(heap, hdr);
+ DUK_HEAPHDR_SET_NEXT(heap, curr, next);
+ break;
+ }
+ }
+ }
+#endif
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+#if defined(DUK_USE_ASSERTIONS)
+DUK_INTERNAL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr) {
+ duk_heaphdr *curr;
+ DUK_ASSERT(heap != NULL);
+
+ for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {
+ if (curr == ptr) {
+ return 1;
+ }
+ }
+ return 0;
+}
+#endif /* DUK_USE_ASSERTIONS */
+
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+DUK_INTERNAL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr) {
+ duk_hthread *curr_thr;
+
+ DUK_ASSERT(heap != NULL);
+
+ if (new_thr != NULL) {
+ curr_thr = heap->curr_thread;
+ if (curr_thr == NULL) {
+ /* For initial entry use default value; zero forces an
+ * interrupt before executing the first insturction.
+ */
+ DUK_DD(DUK_DDPRINT("switch thread, initial entry, init default interrupt counter"));
+ new_thr->interrupt_counter = 0;
+ new_thr->interrupt_init = 0;
+ } else {
+ /* Copy interrupt counter/init value state to new thread (if any).
+ * It's OK for new_thr to be the same as curr_thr.
+ */
+#if defined(DUK_USE_DEBUG)
+ if (new_thr != curr_thr) {
+ DUK_DD(DUK_DDPRINT("switch thread, not initial entry, copy interrupt counter"));
+ }
+#endif
+ new_thr->interrupt_counter = curr_thr->interrupt_counter;
+ new_thr->interrupt_init = curr_thr->interrupt_init;
+ }
+ } else {
+ DUK_DD(DUK_DDPRINT("switch thread, new thread is NULL, no interrupt counter changes"));
+ }
+
+ heap->curr_thread = new_thr; /* may be NULL */
+}
+#endif /* DUK_USE_INTERRUPT_COUNTER */
+#line 1 "duk_heap_refcount.c"
+/*
+ * Reference counting implementation.
+ *
+ * INCREF/DECREF, finalization and freeing of objects whose refcount reaches
+ * zero (refzero). These operations are very performance sensitive, so
+ * various small tricks are used in an attempt to maximize speed.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+
+#if !defined(DUK_USE_DOUBLE_LINKED_HEAP)
+#error internal error, reference counting requires a double linked heap
+#endif
+
+/*
+ * Heap object refcount finalization.
+ *
+ * When an object is about to be freed, all other objects it refers to must
+ * be decref'd. Refcount finalization does NOT free the object or its inner
+ * allocations (mark-and-sweep shares these helpers), it just manipulates
+ * the refcounts.
+ *
+ * Note that any of the DECREFs may cause a refcount to drop to zero. If so,
+ * the object won't be refzero processed inline, but will just be queued to
+ * refzero_list and processed by an earlier caller working on refzero_list,
+ * eliminating C recursion from even long refzero cascades. If refzero
+ * finalization is triggered by mark-and-sweep, refzero conditions are ignored
+ * (objects are not even queued to refzero_list) because mark-and-sweep deals
+ * with them; refcounts are still updated so that they remain in sync with
+ * actual references.
+ */
+
+DUK_LOCAL void duk__decref_tvals_norz(duk_hthread *thr, duk_tval *tv, duk_idx_t count) {
+ DUK_ASSERT(count == 0 || tv != NULL);
+
+ while (count-- > 0) {
+ DUK_TVAL_DECREF_NORZ(thr, tv);
+ tv++;
+ }
+}
+
+DUK_INTERNAL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h) {
+ duk_hthread *thr;
+ duk_uint_fast32_t i;
+ duk_uint_fast32_t n;
+ duk_propvalue *p_val;
+ duk_tval *p_tv;
+ duk_hstring **p_key;
+ duk_uint8_t *p_flag;
+ duk_hobject *h_proto;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(h);
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h) == DUK_HTYPE_OBJECT);
+
+ thr = heap->heap_thread;
+ DUK_ASSERT(thr != NULL);
+
+ p_key = DUK_HOBJECT_E_GET_KEY_BASE(heap, h);
+ p_val = DUK_HOBJECT_E_GET_VALUE_BASE(heap, h);
+ p_flag = DUK_HOBJECT_E_GET_FLAGS_BASE(heap, h);
+ n = DUK_HOBJECT_GET_ENEXT(h);
+ while (n-- > 0) {
+ duk_hstring *key;
+
+ key = p_key[n];
+ if (DUK_UNLIKELY(key == NULL)) {
+ continue;
+ }
+ DUK_HSTRING_DECREF_NORZ(thr, key);
+ if (DUK_UNLIKELY(p_flag[n] & DUK_PROPDESC_FLAG_ACCESSOR)) {
+ duk_hobject *h_getset;
+ h_getset = p_val[n].a.get;
+ DUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset));
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset);
+ h_getset = p_val[n].a.set;
+ DUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset));
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset);
+ } else {
+ duk_tval *tv_val;
+ tv_val = &p_val[n].v;
+ DUK_TVAL_DECREF_NORZ(thr, tv_val);
+ }
+ }
+
+ p_tv = DUK_HOBJECT_A_GET_BASE(heap, h);
+ n = DUK_HOBJECT_GET_ASIZE(h);
+ while (n-- > 0) {
+ duk_tval *tv_val;
+ tv_val = p_tv + n;
+ DUK_TVAL_DECREF_NORZ(thr, tv_val);
+ }
+
+ /* Hash part is a 'weak reference' and doesn't contribute to refcounts. */
+
+ h_proto = (duk_hobject *) DUK_HOBJECT_GET_PROTOTYPE(heap, h);
+ DUK_ASSERT(h_proto == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_proto));
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_proto);
+
+ /* XXX: Object subclass tests are quite awkward at present, ideally
+ * we should be able to switch-case here with a dense index (subtype
+ * number or something). For now, fast path plain objects and arrays
+ * and bit test the rest individually.
+ */
+
+ if (DUK_HOBJECT_HAS_FASTREFS(h)) {
+ /* Plain object or array, nothing more to do. While a
+ * duk_harray has additional fields, none of them need
+ * DECREF updates.
+ */
+ DUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h));
+ return;
+ }
+ DUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h));
+
+ /* Slow path: special object, start bit checks from most likely. */
+
+ /* XXX: reorg, more common first */
+ if (DUK_HOBJECT_IS_COMPFUNC(h)) {
+ duk_hcompfunc *f = (duk_hcompfunc *) h;
+ duk_tval *tv, *tv_end;
+ duk_hobject **funcs, **funcs_end;
+
+ DUK_ASSERT_HCOMPFUNC_VALID(f);
+
+ if (DUK_LIKELY(DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL)) {
+ tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f);
+ tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f);
+ while (tv < tv_end) {
+ DUK_TVAL_DECREF_NORZ(thr, tv);
+ tv++;
+ }
+
+ funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f);
+ funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f);
+ while (funcs < funcs_end) {
+ duk_hobject *h_func;
+ h_func = *funcs;
+ DUK_ASSERT(h_func != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_func));
+ DUK_HCOMPFUNC_DECREF_NORZ(thr, (duk_hcompfunc *) h_func);
+ funcs++;
+ }
+ } else {
+ /* May happen in some out-of-memory corner cases. */
+ DUK_D(DUK_DPRINT("duk_hcompfunc 'data' is NULL, skipping decref"));
+ }
+
+ DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f));
+ DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f));
+ DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(heap, f));
+ } else if (DUK_HOBJECT_IS_DECENV(h)) {
+ duk_hdecenv *e = (duk_hdecenv *) h;
+ DUK_ASSERT_HDECENV_VALID(e);
+ DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, e->thread);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, e->varmap);
+ } else if (DUK_HOBJECT_IS_OBJENV(h)) {
+ duk_hobjenv *e = (duk_hobjenv *) h;
+ DUK_ASSERT_HOBJENV_VALID(e);
+ DUK_ASSERT(e->target != NULL); /* Required for object environments. */
+ DUK_HOBJECT_DECREF_NORZ(thr, e->target);
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ } else if (DUK_HOBJECT_IS_BUFOBJ(h)) {
+ duk_hbufobj *b = (duk_hbufobj *) h;
+ DUK_ASSERT_HBUFOBJ_VALID(b);
+ DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr, (duk_hbuffer *) b->buf);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) b->buf_prop);
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+ } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) {
+ duk_hboundfunc *f = (duk_hboundfunc *) h;
+ DUK_ASSERT_HBOUNDFUNC_VALID(f);
+ DUK_TVAL_DECREF_NORZ(thr, &f->target);
+ DUK_TVAL_DECREF_NORZ(thr, &f->this_binding);
+ duk__decref_tvals_norz(thr, f->args, f->nargs);
+#if defined(DUK_USE_ES6_PROXY)
+ } else if (DUK_HOBJECT_IS_PROXY(h)) {
+ duk_hproxy *p = (duk_hproxy *) h;
+ DUK_ASSERT_HPROXY_VALID(p);
+ DUK_HOBJECT_DECREF_NORZ(thr, p->target);
+ DUK_HOBJECT_DECREF_NORZ(thr, p->handler);
+#endif /* DUK_USE_ES6_PROXY */
+ } else if (DUK_HOBJECT_IS_THREAD(h)) {
+ duk_hthread *t = (duk_hthread *) h;
+ duk_activation *act;
+ duk_tval *tv;
+
+ DUK_ASSERT_HTHREAD_VALID(t);
+
+ tv = t->valstack;
+ while (tv < t->valstack_top) {
+ DUK_TVAL_DECREF_NORZ(thr, tv);
+ tv++;
+ }
+
+ for (act = t->callstack_curr; act != NULL; act = act->parent) {
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) DUK_ACT_GET_FUNC(act));
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->var_env);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->lex_env);
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->prev_caller);
+#endif
+#if 0 /* nothing now */
+ for (cat = act->cat; cat != NULL; cat = cat->parent) {
+ }
+#endif
+ }
+
+
+ for (i = 0; i < DUK_NUM_BUILTINS; i++) {
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) t->builtins[i]);
+ }
+
+ DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, (duk_hthread *) t->resumer);
+ } else {
+ /* We may come here if the object should have a FASTREFS flag
+ * but it's missing for some reason. Assert for never getting
+ * here; however, other than performance, this is harmless.
+ */
+ DUK_D(DUK_DPRINT("missing FASTREFS flag for: %!iO", h));
+ DUK_ASSERT(0);
+ }
+}
+
+DUK_INTERNAL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr) {
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(hdr != NULL);
+
+ if (DUK_HEAPHDR_IS_OBJECT(hdr)) {
+ duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) hdr);
+ }
+ /* DUK_HTYPE_BUFFER: nothing to finalize */
+ /* DUK_HTYPE_STRING: nothing to finalize */
+}
+
+/*
+ * Refzero processing for duk_hobject: queue a refzero'ed object to either
+ * finalize_list or refzero_list and process the relevent list(s) if
+ * necessary.
+ *
+ * Refzero_list is single linked, with only 'prev' pointers set and valid.
+ * All 'next' pointers are intentionally left as garbage. This doesn't
+ * matter because refzero_list is processed to completion before any other
+ * code (like mark-and-sweep) might walk the list.
+ *
+ * In more detail:
+ *
+ * - On first insert refzero_list is NULL and the new object becomes the
+ * first and only element on the list; duk__refcount_free_pending() is
+ * called and it starts processing the list from the initial element,
+ * i.e. the list tail.
+ *
+ * - As each object is refcount finalized, new objects may be queued to
+ * refzero_list head. Their 'next' pointers are left as garbage, but
+ * 'prev' points are set correctly, with the element at refzero_list
+ * having a NULL 'prev' pointer. The fact that refzero_list is non-NULL
+ * is used to reject (1) recursive duk__refcount_free_pending() and
+ * (2) finalize_list processing calls.
+ *
+ * - When we're done with the current object, read its 'prev' pointer and
+ * free the object. If 'prev' is NULL, we've reached head of list and are
+ * done: set refzero_list to NULL and process pending finalizers. Otherwise
+ * continue processing the list.
+ *
+ * A refzero cascade is free of side effects because it only involves
+ * queueing more objects and freeing memory; finalizer execution is blocked
+ * in the code path queueing objects to finalize_list. As a result the
+ * initial refzero call (which triggers duk__refcount_free_pending()) must
+ * check finalize_list so that finalizers are executed snappily.
+ *
+ * If finalize_list processing starts first, refzero may occur while we're
+ * processing finalizers. That's fine: that particular refzero cascade is
+ * handled to completion without side effects. Once the cascade is complete,
+ * we'll run pending finalizers but notice that we're already doing that and
+ * return.
+ *
+ * This could be expanded to allow incremental freeing: just bail out
+ * early and resume at a future alloc/decref/refzero. However, if that
+ * were done, the list structure would need to be kept consistent at all
+ * times, mark-and-sweep would need to handle refzero_list, etc.
+ */
+
+DUK_LOCAL void duk__refcount_free_pending(duk_heap *heap) {
+ duk_heaphdr *curr;
+#if defined(DUK_USE_DEBUG)
+ duk_int_t count = 0;
+#endif
+
+ DUK_ASSERT(heap != NULL);
+
+ curr = heap->refzero_list;
+ DUK_ASSERT(curr != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, curr) == NULL); /* We're called on initial insert only. */
+ /* curr->next is GARBAGE. */
+
+ do {
+ duk_heaphdr *prev;
+
+ DUK_DDD(DUK_DDDPRINT("refzero processing %p: %!O", (void *) curr, (duk_heaphdr *) curr));
+
+#if defined(DUK_USE_DEBUG)
+ count++;
+#endif
+
+ DUK_ASSERT(curr != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* currently, always the case */
+ /* FINALIZED may be set; don't care about flags here. */
+
+ /* Refcount finalize 'curr'. Refzero_list must be non-NULL
+ * here to prevent recursive entry to duk__refcount_free_pending().
+ */
+ DUK_ASSERT(heap->refzero_list != NULL);
+ duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr);
+
+ prev = DUK_HEAPHDR_GET_PREV(heap, curr);
+ DUK_ASSERT((prev == NULL && heap->refzero_list == curr) || \
+ (prev != NULL && heap->refzero_list != curr));
+ /* prev->next is intentionally not updated and is garbage. */
+
+ duk_free_hobject(heap, (duk_hobject *) curr); /* Invalidates 'curr'. */
+
+ curr = prev;
+ } while (curr != NULL);
+
+ heap->refzero_list = NULL;
+
+ DUK_DD(DUK_DDPRINT("refzero processed %ld objects", (long) count));
+}
+
+DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hobject(duk_heap *heap, duk_hobject *obj, duk_bool_t skip_free_pending) {
+ duk_heaphdr *hdr;
+ duk_heaphdr *root;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) obj) == DUK_HTYPE_OBJECT);
+
+ hdr = (duk_heaphdr *) obj;
+
+ /* Refzero'd objects must be in heap_allocated. They can't be in
+ * finalize_list because all objects on finalize_list have an
+ * artificial +1 refcount bump.
+ */
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(duk_heap_in_heap_allocated(heap, (duk_heaphdr *) obj));
+#endif
+
+ DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, hdr);
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ /* This finalizer check MUST BE side effect free. It should also be
+ * as fast as possible because it's applied to every object freed.
+ */
+ if (DUK_UNLIKELY(DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr) != 0U)) {
+ /* Special case: FINALIZED may be set if mark-and-sweep queued
+ * object for finalization, the finalizer was executed (and
+ * FINALIZED set), mark-and-sweep hasn't yet processed the
+ * object again, but its refcount drops to zero. Free without
+ * running the finalizer again.
+ */
+ if (DUK_HEAPHDR_HAS_FINALIZED(hdr)) {
+ DUK_D(DUK_DPRINT("refzero'd object has finalizer and FINALIZED is set -> free"));
+ } else {
+ /* Set FINALIZABLE flag so that all objects on finalize_list
+ * will have it set and are thus detectable based on the
+ * flag alone.
+ */
+ DUK_HEAPHDR_SET_FINALIZABLE(hdr);
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(hdr));
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Bump refcount on finalize_list insert so that a
+ * refzero can never occur when an object is waiting
+ * for its finalizer call. Refzero might otherwise
+ * now happen because we allow duk_push_heapptr() for
+ * objects pending finalization.
+ */
+ DUK_HEAPHDR_PREINC_REFCOUNT(hdr);
+#endif
+ DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, hdr);
+
+ /* Process finalizers unless skipping is explicitly
+ * requested (NORZ) or refzero_list is being processed
+ * (avoids side effects during a refzero cascade).
+ * If refzero_list is processed, the initial refzero
+ * call will run pending finalizers when refzero_list
+ * is done.
+ */
+ if (!skip_free_pending && heap->refzero_list == NULL) {
+ duk_heap_process_finalize_list(heap);
+ }
+ return;
+ }
+ }
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+ /* No need to finalize, free object via refzero_list. */
+
+ root = heap->refzero_list;
+
+ DUK_HEAPHDR_SET_PREV(heap, hdr, NULL);
+ /* 'next' is left as GARBAGE. */
+ heap->refzero_list = hdr;
+
+ if (root == NULL) {
+ /* Object is now queued. Refzero_list was NULL so
+ * no-one is currently processing it; do it here.
+ * With refzero processing just doing a cascade of
+ * free calls, we can process it directly even when
+ * NORZ macros are used: there are no side effects.
+ */
+ duk__refcount_free_pending(heap);
+ DUK_ASSERT(heap->refzero_list == NULL);
+
+ /* Process finalizers only after the entire cascade
+ * is finished. In most cases there's nothing to
+ * finalize, so fast path check to avoid a call.
+ */
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+ if (!skip_free_pending && DUK_UNLIKELY(heap->finalize_list != NULL)) {
+ duk_heap_process_finalize_list(heap);
+ }
+#endif
+ } else {
+ DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL);
+ DUK_HEAPHDR_SET_PREV(heap, root, hdr);
+
+ /* Object is now queued. Because refzero_list was
+ * non-NULL, it's already being processed by someone
+ * in the C call stack, so we're done.
+ */
+ }
+}
+
+#if defined(DUK_USE_FINALIZER_SUPPORT)
+DUK_INTERNAL DUK_ALWAYS_INLINE void duk_refzero_check_fast(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(thr->heap->refzero_list == NULL); /* Processed to completion inline. */
+
+ if (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) {
+ duk_heap_process_finalize_list(thr->heap);
+ }
+}
+
+DUK_INTERNAL void duk_refzero_check_slow(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(thr->heap->refzero_list == NULL); /* Processed to completion inline. */
+
+ if (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) {
+ duk_heap_process_finalize_list(thr->heap);
+ }
+}
+#endif /* DUK_USE_FINALIZER_SUPPORT */
+
+/*
+ * Refzero processing for duk_hstring.
+ */
+
+DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hstring(duk_heap *heap, duk_hstring *str) {
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(str != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) str) == DUK_HTYPE_STRING);
+
+ duk_heap_strcache_string_remove(heap, str);
+ duk_heap_strtable_unlink(heap, str);
+ duk_free_hstring(heap, str);
+}
+
+/*
+ * Refzero processing for duk_hbuffer.
+ */
+
+DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hbuffer(duk_heap *heap, duk_hbuffer *buf) {
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->heap_thread != NULL);
+ DUK_ASSERT(buf != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) buf) == DUK_HTYPE_BUFFER);
+
+ DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, (duk_heaphdr *) buf);
+ duk_free_hbuffer(heap, buf);
+}
+
+/*
+ * Incref and decref functions.
+ *
+ * Decref may trigger immediate refzero handling, which may free and finalize
+ * an arbitrary number of objects (a "DECREF cascade").
+ *
+ * Refzero handling is skipped entirely if (1) mark-and-sweep is running or
+ * (2) execution is paused in the debugger. The objects are left in the heap,
+ * and will be freed by mark-and-sweep or eventual heap destruction.
+ *
+ * This is necessary during mark-and-sweep because refcounts are also updated
+ * during the sweep phase (otherwise objects referenced by a swept object
+ * would have incorrect refcounts) which then calls here. This could be
+ * avoided by using separate decref macros in mark-and-sweep; however,
+ * mark-and-sweep also calls finalizers which would use the ordinary decref
+ * macros anyway.
+ *
+ * We can't process refzeros (= free objects) when the debugger is running
+ * as the debugger might make an object unreachable but still continue
+ * inspecting it (or even cause it to be pushed back). So we must rely on
+ * mark-and-sweep to collect them.
+ *
+ * The DUK__RZ_SUPPRESS_CHECK() condition is also used in heap destruction
+ * when running finalizers for remaining objects: the flag prevents objects
+ * from being moved around in heap linked lists while that's being done.
+ *
+ * The suppress condition is important to performance.
+ */
+
+#define DUK__RZ_SUPPRESS_ASSERT1() do { \
+ DUK_ASSERT(thr != NULL); \
+ DUK_ASSERT(thr->heap != NULL); \
+ /* When mark-and-sweep runs, heap_thread must exist. */ \
+ DUK_ASSERT(thr->heap->ms_running == 0 || thr->heap->heap_thread != NULL); \
+ /* When mark-and-sweep runs, the 'thr' argument always matches heap_thread. \
+ * This could be used to e.g. suppress check against 'thr' directly (and \
+ * knowing it would be heap_thread); not really used now. \
+ */ \
+ DUK_ASSERT(thr->heap->ms_running == 0 || thr == thr->heap->heap_thread); \
+ /* We may be called when the heap is initializing and we process \
+ * refzeros normally, but mark-and-sweep and finalizers are prevented \
+ * if that's the case. \
+ */ \
+ DUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->ms_prevent_count > 0); \
+ DUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->pf_prevent_count > 0); \
+ } while (0)
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+#define DUK__RZ_SUPPRESS_ASSERT2() do { \
+ /* When debugger is paused, ms_running is set. */ \
+ DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->ms_running != 0); \
+ } while (0)
+#define DUK__RZ_SUPPRESS_COND() (heap->ms_running != 0)
+#else
+#define DUK__RZ_SUPPRESS_ASSERT2() do { } while (0)
+#define DUK__RZ_SUPPRESS_COND() (heap->ms_running != 0)
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+#define DUK__RZ_SUPPRESS_CHECK() do { \
+ DUK__RZ_SUPPRESS_ASSERT1(); \
+ DUK__RZ_SUPPRESS_ASSERT2(); \
+ if (DUK_UNLIKELY(DUK__RZ_SUPPRESS_COND())) { \
+ DUK_DDD(DUK_DDDPRINT("refzero handling suppressed (not even queued) when mark-and-sweep running, object: %p", (void *) h)); \
+ return; \
+ } \
+ } while (0)
+
+#define DUK__RZ_STRING() do { \
+ duk__refcount_refzero_hstring(heap, (duk_hstring *) h); \
+ } while (0)
+#define DUK__RZ_BUFFER() do { \
+ duk__refcount_refzero_hbuffer(heap, (duk_hbuffer *) h); \
+ } while (0)
+#define DUK__RZ_OBJECT() do { \
+ duk__refcount_refzero_hobject(heap, (duk_hobject *) h, skip_free_pending); \
+ } while (0)
+
+/* XXX: test the effect of inlining here vs. NOINLINE in refzero helpers */
+#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
+#define DUK__RZ_INLINE DUK_ALWAYS_INLINE
+#else
+#define DUK__RZ_INLINE /*nop*/
+#endif
+
+DUK_LOCAL DUK__RZ_INLINE void duk__hstring_refzero_helper(duk_hthread *thr, duk_hstring *h) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h != NULL);
+ heap = thr->heap;
+
+ DUK__RZ_SUPPRESS_CHECK();
+ DUK__RZ_STRING();
+}
+
+DUK_LOCAL DUK__RZ_INLINE void duk__hbuffer_refzero_helper(duk_hthread *thr, duk_hbuffer *h) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h != NULL);
+ heap = thr->heap;
+
+ DUK__RZ_SUPPRESS_CHECK();
+ DUK__RZ_BUFFER();
+}
+
+DUK_LOCAL DUK__RZ_INLINE void duk__hobject_refzero_helper(duk_hthread *thr, duk_hobject *h, duk_bool_t skip_free_pending) {
+ duk_heap *heap;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h != NULL);
+ heap = thr->heap;
+
+ DUK__RZ_SUPPRESS_CHECK();
+ DUK__RZ_OBJECT();
+}
+
+DUK_LOCAL DUK__RZ_INLINE void duk__heaphdr_refzero_helper(duk_hthread *thr, duk_heaphdr *h, duk_bool_t skip_free_pending) {
+ duk_heap *heap;
+ duk_small_uint_t htype;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h != NULL);
+ heap = thr->heap;
+
+ htype = (duk_small_uint_t) DUK_HEAPHDR_GET_TYPE(h);
+ DUK__RZ_SUPPRESS_CHECK();
+
+ switch (htype) {
+ case DUK_HTYPE_STRING:
+ /* Strings have no internal references but do have "weak"
+ * references in the string cache. Also note that strings
+ * are not on the heap_allocated list like other heap
+ * elements.
+ */
+
+ DUK__RZ_STRING();
+ break;
+
+ case DUK_HTYPE_OBJECT:
+ /* Objects have internal references. Must finalize through
+ * the "refzero" work list.
+ */
+
+ DUK__RZ_OBJECT();
+ break;
+
+ default:
+ /* Buffers have no internal references. However, a dynamic
+ * buffer has a separate allocation for the buffer. This is
+ * freed by duk_heap_free_heaphdr_raw().
+ */
+
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(h) == DUK_HTYPE_BUFFER);
+ DUK__RZ_BUFFER();
+ break;
+ }
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h) {
+ duk__heaphdr_refzero_helper(thr, h, 0 /*skip_free_pending*/);
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h) {
+ duk__heaphdr_refzero_helper(thr, h, 1 /*skip_free_pending*/);
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h) {
+ duk__hstring_refzero_helper(thr, h);
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h) {
+ duk__hbuffer_refzero_helper(thr, h);
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h) {
+ duk__hobject_refzero_helper(thr, h, 0 /*skip_free_pending*/);
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h) {
+ duk__hobject_refzero_helper(thr, h, 1 /*skip_free_pending*/);
+}
+
+#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
+DUK_INTERNAL void duk_tval_incref(duk_tval *tv) {
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) {
+ duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));
+ DUK_ASSERT_DISABLE(h->h_refcount >= 0);
+ DUK_HEAPHDR_PREINC_REFCOUNT(h);
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) != 0); /* No wrapping. */
+ }
+}
+
+DUK_INTERNAL void duk_tval_decref(duk_hthread *thr, duk_tval *tv) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) {
+ duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1);
+#if 0
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) {
+ return;
+ }
+ duk_heaphdr_refzero(thr, h);
+#else
+ duk_heaphdr_decref(thr, h);
+#endif
+ }
+}
+
+DUK_INTERNAL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv != NULL);
+
+ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) {
+ duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1);
+#if 0
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) {
+ return;
+ }
+ duk_heaphdr_refzero_norz(thr, h);
+#else
+ duk_heaphdr_decref_norz(thr, h);
+#endif
+ }
+}
+#endif /* !DUK_USE_FAST_REFCOUNT_DEFAULT */
+
+#define DUK__DECREF_ASSERTS() do { \
+ DUK_ASSERT(thr != NULL); \
+ DUK_ASSERT(thr->heap != NULL); \
+ DUK_ASSERT(h != NULL); \
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((duk_heaphdr *) h)); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) >= 1); \
+ } while (0)
+#if defined(DUK_USE_ROM_OBJECTS)
+#define DUK__INCREF_SHARED() do { \
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \
+ return; \
+ } \
+ DUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0); /* No wrapping. */ \
+ } while (0)
+#define DUK__DECREF_SHARED() do { \
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \
+ return; \
+ } \
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \
+ return; \
+ } \
+ } while (0)
+#else
+#define DUK__INCREF_SHARED() do { \
+ DUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \
+ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0); /* No wrapping. */ \
+ } while (0)
+#define DUK__DECREF_SHARED() do { \
+ if (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \
+ return; \
+ } \
+ } while (0)
+#endif
+
+#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
+/* This will in practice be inlined because it's just an INC instructions
+ * and a bit test + INC when ROM objects are enabled.
+ */
+DUK_INTERNAL void duk_heaphdr_incref(duk_heaphdr *h) {
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));
+ DUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(h) >= 0);
+
+ DUK__INCREF_SHARED();
+}
+
+DUK_INTERNAL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_heaphdr_refzero(thr, h);
+
+ /* Forced mark-and-sweep when GC torture enabled; this could happen
+ * on any DECREF (but not DECREF_NORZ).
+ */
+ DUK_GC_TORTURE(thr->heap);
+}
+DUK_INTERNAL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_heaphdr_refzero_norz(thr, h);
+}
+#endif /* !DUK_USE_FAST_REFCOUNT_DEFAULT */
+
+#if 0 /* Not needed. */
+DUK_INTERNAL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_hstring_refzero(thr, h);
+}
+DUK_INTERNAL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_hstring_refzero_norz(thr, h);
+}
+DUK_INTERNAL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_hbuffer_refzero(thr, h);
+}
+DUK_INTERNAL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_hbuffer_refzero_norz(thr, h);
+}
+DUK_INTERNAL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_hobject_refzero(thr, h);
+}
+DUK_INTERNAL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h) {
+ DUK__DECREF_ASSERTS();
+ DUK__DECREF_SHARED();
+ duk_hobject_refzero_norz(thr, h);
+}
+#endif
+
+#else /* DUK_USE_REFERENCE_COUNTING */
+
+/* no refcounting */
+
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+/* automatic undefs */
+#undef DUK__DECREF_ASSERTS
+#undef DUK__DECREF_SHARED
+#undef DUK__INCREF_SHARED
+#undef DUK__RZ_BUFFER
+#undef DUK__RZ_INLINE
+#undef DUK__RZ_OBJECT
+#undef DUK__RZ_STRING
+#undef DUK__RZ_SUPPRESS_ASSERT1
+#undef DUK__RZ_SUPPRESS_ASSERT2
+#undef DUK__RZ_SUPPRESS_CHECK
+#undef DUK__RZ_SUPPRESS_COND
+#line 1 "duk_heap_stringcache.c"
+/*
+ * String cache.
+ *
+ * Provides a cache to optimize indexed string lookups. The cache keeps
+ * track of (byte offset, char offset) states for a fixed number of strings.
+ * Otherwise we'd need to scan from either end of the string, as we store
+ * strings in (extended) UTF-8.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Delete references to given hstring from the heap string cache.
+ *
+ * String cache references are 'weak': they are not counted towards
+ * reference counts, nor serve as roots for mark-and-sweep. When an
+ * object is about to be freed, such references need to be removed.
+ */
+
+DUK_INTERNAL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h) {
+ duk_small_int_t i;
+ for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {
+ duk_strcache *c = heap->strcache + i;
+ if (c->h == h) {
+ DUK_DD(DUK_DDPRINT("deleting weak strcache reference to hstring %p from heap %p",
+ (void *) h, (void *) heap));
+ c->h = NULL;
+
+ /* XXX: the string shouldn't appear twice, but we now loop to the
+ * end anyway; if fixed, add a looping assertion to ensure there
+ * is no duplicate.
+ */
+ }
+ }
+}
+
+/*
+ * String scanning helpers
+ *
+ * All bytes other than UTF-8 continuation bytes ([0x80,0xbf]) are
+ * considered to contribute a character. This must match how string
+ * character length is computed.
+ */
+
+DUK_LOCAL const duk_uint8_t *duk__scan_forwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) {
+ while (n > 0) {
+ for (;;) {
+ p++;
+ if (p >= q) {
+ return NULL;
+ }
+ if ((*p & 0xc0) != 0x80) {
+ break;
+ }
+ }
+ n--;
+ }
+ return p;
+}
+
+DUK_LOCAL const duk_uint8_t *duk__scan_backwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) {
+ while (n > 0) {
+ for (;;) {
+ p--;
+ if (p < q) {
+ return NULL;
+ }
+ if ((*p & 0xc0) != 0x80) {
+ break;
+ }
+ }
+ n--;
+ }
+ return p;
+}
+
+/*
+ * Convert char offset to byte offset
+ *
+ * Avoid using the string cache if possible: for ASCII strings byte and
+ * char offsets are equal and for short strings direct scanning may be
+ * better than using the string cache (which may evict a more important
+ * entry).
+ *
+ * Typing now assumes 32-bit string byte/char offsets (duk_uint_fast32_t).
+ * Better typing might be to use duk_size_t.
+ *
+ * Caller should ensure 'char_offset' is within the string bounds [0,charlen]
+ * (endpoint is inclusive). If this is not the case, no memory unsafe
+ * behavior will happen but an error will be thrown.
+ */
+
+DUK_INTERNAL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset) {
+ duk_heap *heap;
+ duk_strcache *sce;
+ duk_uint_fast32_t byte_offset;
+ duk_small_int_t i;
+ duk_bool_t use_cache;
+ duk_uint_fast32_t dist_start, dist_end, dist_sce;
+ duk_uint_fast32_t char_length;
+ const duk_uint8_t *p_start;
+ const duk_uint8_t *p_end;
+ const duk_uint8_t *p_found;
+
+ /*
+ * For ASCII strings, the answer is simple.
+ */
+
+ if (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) {
+ return char_offset;
+ }
+
+ char_length = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h);
+ DUK_ASSERT(char_offset <= char_length);
+
+ if (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) {
+ /* Must recheck because the 'is ascii' flag may be set
+ * lazily. Alternatively, we could just compare charlen
+ * to bytelen.
+ */
+ return char_offset;
+ }
+
+ /*
+ * For non-ASCII strings, we need to scan forwards or backwards
+ * from some starting point. The starting point may be the start
+ * or end of the string, or some cached midpoint in the string
+ * cache.
+ *
+ * For "short" strings we simply scan without checking or updating
+ * the cache. For longer strings we check and update the cache as
+ * necessary, inserting a new cache entry if none exists.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("non-ascii string %p, char_offset=%ld, clen=%ld, blen=%ld",
+ (void *) h, (long) char_offset,
+ (long) DUK_HSTRING_GET_CHARLEN(h),
+ (long) DUK_HSTRING_GET_BYTELEN(h)));
+
+ heap = thr->heap;
+ sce = NULL;
+ use_cache = (char_length > DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT);
+
+ if (use_cache) {
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ DUK_DDD(DUK_DDDPRINT("stringcache before char2byte (using cache):"));
+ for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {
+ duk_strcache *c = heap->strcache + i;
+ DUK_DDD(DUK_DDDPRINT(" [%ld] -> h=%p, cidx=%ld, bidx=%ld",
+ (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx));
+ }
+#endif
+
+ for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {
+ duk_strcache *c = heap->strcache + i;
+
+ if (c->h == h) {
+ sce = c;
+ break;
+ }
+ }
+ }
+
+ /*
+ * Scan from shortest distance:
+ * - start of string
+ * - end of string
+ * - cache entry (if exists)
+ */
+
+ DUK_ASSERT(DUK_HSTRING_GET_CHARLEN(h) >= char_offset);
+ dist_start = char_offset;
+ dist_end = char_length - char_offset;
+ dist_sce = 0; DUK_UNREF(dist_sce); /* initialize for debug prints, needed if sce==NULL */
+
+ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);
+ p_end = (const duk_uint8_t *) (p_start + DUK_HSTRING_GET_BYTELEN(h));
+ p_found = NULL;
+
+ if (sce) {
+ if (char_offset >= sce->cidx) {
+ dist_sce = char_offset - sce->cidx;
+ if ((dist_sce <= dist_start) && (dist_sce <= dist_end)) {
+ DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, "
+ "dist_start=%ld, dist_end=%ld, dist_sce=%ld => "
+ "scan forwards from sce",
+ (long) use_cache, (void *) (sce ? sce->h : NULL),
+ (sce ? (long) sce->cidx : (long) -1),
+ (sce ? (long) sce->bidx : (long) -1),
+ (long) dist_start, (long) dist_end, (long) dist_sce));
+
+ p_found = duk__scan_forwards(p_start + sce->bidx,
+ p_end,
+ dist_sce);
+ goto scan_done;
+ }
+ } else {
+ dist_sce = sce->cidx - char_offset;
+ if ((dist_sce <= dist_start) && (dist_sce <= dist_end)) {
+ DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, "
+ "dist_start=%ld, dist_end=%ld, dist_sce=%ld => "
+ "scan backwards from sce",
+ (long) use_cache, (void *) (sce ? sce->h : NULL),
+ (sce ? (long) sce->cidx : (long) -1),
+ (sce ? (long) sce->bidx : (long) -1),
+ (long) dist_start, (long) dist_end, (long) dist_sce));
+
+ p_found = duk__scan_backwards(p_start + sce->bidx,
+ p_start,
+ dist_sce);
+ goto scan_done;
+ }
+ }
+ }
+
+ /* no sce, or sce scan not best */
+
+ if (dist_start <= dist_end) {
+ DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, "
+ "dist_start=%ld, dist_end=%ld, dist_sce=%ld => "
+ "scan forwards from string start",
+ (long) use_cache, (void *) (sce ? sce->h : NULL),
+ (sce ? (long) sce->cidx : (long) -1),
+ (sce ? (long) sce->bidx : (long) -1),
+ (long) dist_start, (long) dist_end, (long) dist_sce));
+
+ p_found = duk__scan_forwards(p_start,
+ p_end,
+ dist_start);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, "
+ "dist_start=%ld, dist_end=%ld, dist_sce=%ld => "
+ "scan backwards from string end",
+ (long) use_cache, (void *) (sce ? sce->h : NULL),
+ (sce ? (long) sce->cidx : (long) -1),
+ (sce ? (long) sce->bidx : (long) -1),
+ (long) dist_start, (long) dist_end, (long) dist_sce));
+
+ p_found = duk__scan_backwards(p_end,
+ p_start,
+ dist_end);
+ }
+
+ scan_done:
+
+ if (DUK_UNLIKELY(p_found == NULL)) {
+ /* Scan error: this shouldn't normally happen; it could happen if
+ * string is not valid UTF-8 data, and clen/blen are not consistent
+ * with the scanning algorithm.
+ */
+ goto scan_error;
+ }
+
+ DUK_ASSERT(p_found >= p_start);
+ DUK_ASSERT(p_found <= p_end); /* may be equal */
+ byte_offset = (duk_uint32_t) (p_found - p_start);
+
+ DUK_DDD(DUK_DDDPRINT("-> string %p, cidx %ld -> bidx %ld",
+ (void *) h, (long) char_offset, (long) byte_offset));
+
+ /*
+ * Update cache entry (allocating if necessary), and move the
+ * cache entry to the first place (in an "LRU" policy).
+ */
+
+ if (use_cache) {
+ /* update entry, allocating if necessary */
+ if (!sce) {
+ sce = heap->strcache + DUK_HEAP_STRCACHE_SIZE - 1; /* take last entry */
+ sce->h = h;
+ }
+ DUK_ASSERT(sce != NULL);
+ sce->bidx = (duk_uint32_t) (p_found - p_start);
+ sce->cidx = (duk_uint32_t) char_offset;
+
+ /* LRU: move our entry to first */
+ if (sce > &heap->strcache[0]) {
+ /*
+ * A C
+ * B A
+ * C <- sce ==> B
+ * D D
+ */
+ duk_strcache tmp;
+
+ tmp = *sce;
+ DUK_MEMMOVE((void *) (&heap->strcache[1]),
+ (const void *) (&heap->strcache[0]),
+ (size_t) (((char *) sce) - ((char *) &heap->strcache[0])));
+ heap->strcache[0] = tmp;
+
+ /* 'sce' points to the wrong entry here, but is no longer used */
+ }
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ DUK_DDD(DUK_DDDPRINT("stringcache after char2byte (using cache):"));
+ for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {
+ duk_strcache *c = heap->strcache + i;
+ DUK_DDD(DUK_DDDPRINT(" [%ld] -> h=%p, cidx=%ld, bidx=%ld",
+ (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx));
+ }
+#endif
+ }
+
+ return byte_offset;
+
+ scan_error:
+ DUK_ERROR_INTERNAL(thr);
+ return 0;
+}
+#line 1 "duk_heap_stringtable.c"
+/*
+ * Heap string table handling, string interning.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Resize checks not needed if minsize == maxsize, typical for low memory
+ * targets.
+ */
+#define DUK__STRTAB_RESIZE_CHECK
+#if (DUK_USE_STRTAB_MINSIZE == DUK_USE_STRTAB_MAXSIZE)
+#undef DUK__STRTAB_RESIZE_CHECK
+#endif
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+#define DUK__HEAPPTR_ENC16(heap,ptr) DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (ptr))
+#define DUK__HEAPPTR_DEC16(heap,val) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (val))
+#define DUK__GET_STRTABLE(heap) ((heap)->strtable16)
+#else
+#define DUK__HEAPPTR_ENC16(heap,ptr) (ptr)
+#define DUK__HEAPPTR_DEC16(heap,val) (val)
+#define DUK__GET_STRTABLE(heap) ((heap)->strtable)
+#endif
+
+#define DUK__STRTAB_U32_MAX_STRLEN 10 /* 4'294'967'295 */
+
+/*
+ * Debug dump stringtable.
+ */
+
+#if defined(DUK_USE_DEBUG)
+DUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *strtable;
+#else
+ duk_hstring **strtable;
+#endif
+ duk_uint32_t i;
+ duk_hstring *h;
+ duk_size_t count_total = 0;
+ duk_size_t count_chain;
+ duk_size_t count_chain_min = DUK_SIZE_MAX;
+ duk_size_t count_chain_max = 0;
+ duk_size_t count_len[8]; /* chain lengths from 0 to 7 */
+
+ if (heap == NULL) {
+ DUK_D(DUK_DPRINT("string table, heap=NULL"));
+ return;
+ }
+
+ strtable = DUK__GET_STRTABLE(heap);
+ if (strtable == NULL) {
+ DUK_D(DUK_DPRINT("string table, strtab=NULL"));
+ return;
+ }
+
+ DUK_MEMZERO((void *) count_len, sizeof(count_len));
+ for (i = 0; i < heap->st_size; i++) {
+ h = DUK__HEAPPTR_DEC16(heap, strtable[i]);
+ count_chain = 0;
+ while (h != NULL) {
+ count_chain++;
+ h = h->hdr.h_next;
+ }
+ if (count_chain < sizeof(count_len) / sizeof(duk_size_t)) {
+ count_len[count_chain]++;
+ }
+ count_chain_max = (count_chain > count_chain_max ? count_chain : count_chain_max);
+ count_chain_min = (count_chain < count_chain_min ? count_chain : count_chain_min);
+ count_total += count_chain;
+ }
+
+ DUK_D(DUK_DPRINT("string table, strtab=%p, count=%lu, chain min=%lu max=%lu avg=%lf: "
+ "counts: %lu %lu %lu %lu %lu %lu %lu %lu ...",
+ (void *) heap->strtable, (unsigned long) count_total,
+ (unsigned long) count_chain_min, (unsigned long) count_chain_max,
+ (double) count_total / (double) heap->st_size,
+ (unsigned long) count_len[0], (unsigned long) count_len[1],
+ (unsigned long) count_len[2], (unsigned long) count_len[3],
+ (unsigned long) count_len[4], (unsigned long) count_len[5],
+ (unsigned long) count_len[6], (unsigned long) count_len[7]));
+}
+#endif /* DUK_USE_DEBUG */
+
+/*
+ * Assertion helper to ensure strtable is populated correctly.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+DUK_LOCAL void duk__strtable_assert_checks(duk_heap *heap) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *strtable;
+#else
+ duk_hstring **strtable;
+#endif
+ duk_uint32_t i;
+ duk_hstring *h;
+ duk_size_t count = 0;
+
+ DUK_ASSERT(heap != NULL);
+
+ strtable = DUK__GET_STRTABLE(heap);
+ if (strtable != NULL) {
+ DUK_ASSERT(heap->st_size != 0);
+ DUK_ASSERT(heap->st_mask == heap->st_size - 1);
+
+ for (i = 0; i < heap->st_size; i++) {
+ h = DUK__HEAPPTR_DEC16(heap, strtable[i]);
+ while (h != NULL) {
+ DUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i);
+ count++;
+ h = h->hdr.h_next;
+ }
+ }
+ } else {
+ DUK_ASSERT(heap->st_size == 0);
+ DUK_ASSERT(heap->st_mask == 0);
+ }
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+ DUK_ASSERT(count == (duk_size_t) heap->st_count);
+#endif
+}
+#endif /* DUK_USE_ASSERTIONS */
+
+/*
+ * Allocate and initialize a duk_hstring.
+ *
+ * Returns a NULL if allocation or initialization fails for some reason.
+ *
+ * The string won't be inserted into the string table and isn't tracked in
+ * any way (link pointers will be NULL). The caller must place the string
+ * into the string table without any risk of a longjmp, otherwise the string
+ * is leaked.
+ */
+
+DUK_LOCAL duk_hstring *duk__strtable_alloc_hstring(duk_heap *heap,
+ const duk_uint8_t *str,
+ duk_uint32_t blen,
+ duk_uint32_t strhash,
+ const duk_uint8_t *extdata) {
+ duk_hstring *res;
+ const duk_uint8_t *data;
+#if !defined(DUK_USE_HSTRING_ARRIDX)
+ duk_uarridx_t dummy;
+#endif
+
+ DUK_ASSERT(heap != NULL);
+ DUK_UNREF(extdata);
+
+#if defined(DUK_USE_STRLEN16)
+ /* If blen <= 0xffffUL, clen is also guaranteed to be <= 0xffffUL. */
+ if (blen > 0xffffUL) {
+ DUK_D(DUK_DPRINT("16-bit string blen/clen active and blen over 16 bits, reject intern"));
+ goto alloc_error;
+ }
+#endif
+
+ /* XXX: Memzeroing the allocated structure is not really necessary
+ * because we could just initialize all fields explicitly (almost
+ * all fields are initialized explicitly anyway).
+ */
+#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)
+ if (extdata) {
+ res = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring_external));
+ if (DUK_UNLIKELY(res == NULL)) {
+ goto alloc_error;
+ }
+ DUK_MEMZERO(res, sizeof(duk_hstring_external));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ DUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr);
+#endif
+ DUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, DUK_HSTRING_FLAG_EXTDATA);
+
+ DUK_ASSERT(extdata[blen] == 0); /* Application responsibility. */
+ data = extdata;
+ ((duk_hstring_external *) res)->extdata = extdata;
+ } else
+#endif /* DUK_USE_HSTRING_EXTDATA && DUK_USE_EXTSTR_INTERN_CHECK */
+ {
+ duk_uint8_t *data_tmp;
+
+ /* NUL terminate for convenient C access */
+ DUK_ASSERT(sizeof(duk_hstring) + blen + 1 > blen); /* No wrap, limits ensure. */
+ res = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring) + blen + 1);
+ if (DUK_UNLIKELY(res == NULL)) {
+ goto alloc_error;
+ }
+ DUK_MEMZERO(res, sizeof(duk_hstring));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ DUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr);
+#endif
+ DUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, 0);
+
+ data_tmp = (duk_uint8_t *) (res + 1);
+ DUK_MEMCPY(data_tmp, str, blen);
+ data_tmp[blen] = (duk_uint8_t) 0;
+ data = (const duk_uint8_t *) data_tmp;
+ }
+
+ DUK_HSTRING_SET_BYTELEN(res, blen);
+ DUK_HSTRING_SET_HASH(res, strhash);
+
+ DUK_ASSERT(!DUK_HSTRING_HAS_ARRIDX(res));
+#if defined(DUK_USE_HSTRING_ARRIDX)
+ res->arridx = duk_js_to_arrayindex_string(data, blen);
+ if (res->arridx != DUK_HSTRING_NO_ARRAY_INDEX) {
+#else
+ dummy = duk_js_to_arrayindex_string(data, blen);
+ if (dummy != DUK_HSTRING_NO_ARRAY_INDEX) {
+#endif
+ /* Array index strings cannot be symbol strings,
+ * and they're always pure ASCII so blen == clen.
+ */
+ DUK_HSTRING_SET_ARRIDX(res);
+ DUK_HSTRING_SET_ASCII(res);
+ DUK_ASSERT(duk_unicode_unvalidated_utf8_length(data, (duk_size_t) blen) == blen);
+ } else {
+ /* Because 'data' is NUL-terminated, we don't need a
+ * blen > 0 check here. For NUL (0x00) the symbol
+ * checks will be false.
+ */
+ if (DUK_UNLIKELY(data[0] >= 0x80U)) {
+ if (data[0] <= 0x81) {
+ DUK_HSTRING_SET_SYMBOL(res);
+ } else if (data[0] == 0x82U || data[0] == 0xffU) {
+ DUK_HSTRING_SET_HIDDEN(res);
+ DUK_HSTRING_SET_SYMBOL(res);
+ }
+ }
+
+ /* Using an explicit 'ASCII' flag has larger footprint (one call site
+ * only) but is quite useful for the case when there's no explicit
+ * 'clen' in duk_hstring.
+ *
+ * The flag is set lazily for RAM strings.
+ */
+ DUK_ASSERT(!DUK_HSTRING_HAS_ASCII(res));
+
+#if defined(DUK_USE_HSTRING_LAZY_CLEN)
+ /* Charlen initialized to 0, updated on-the-fly. */
+#else
+ duk_hstring_init_charlen(res); /* Also sets ASCII flag. */
+#endif
+ }
+
+ DUK_DDD(DUK_DDDPRINT("interned string, hash=0x%08lx, blen=%ld, has_arridx=%ld, has_extdata=%ld",
+ (unsigned long) DUK_HSTRING_GET_HASH(res),
+ (long) DUK_HSTRING_GET_BYTELEN(res),
+ (long) (DUK_HSTRING_HAS_ARRIDX(res) ? 1 : 0),
+ (long) (DUK_HSTRING_HAS_EXTDATA(res) ? 1 : 0)));
+
+ DUK_ASSERT(res != NULL);
+ return res;
+
+ alloc_error:
+ return NULL;
+}
+
+/*
+ * Grow strtable allocation in-place.
+ */
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+DUK_LOCAL void duk__strtable_grow_inplace(duk_heap *heap) {
+ duk_uint32_t new_st_size;
+ duk_uint32_t old_st_size;
+ duk_uint32_t i;
+ duk_hstring *h;
+ duk_hstring *next;
+ duk_hstring *prev;
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *new_ptr;
+ duk_uint16_t *new_ptr_high;
+#else
+ duk_hstring **new_ptr;
+ duk_hstring **new_ptr_high;
+#endif
+
+ DUK_DD(DUK_DDPRINT("grow in-place: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2));
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->st_resizing == 1);
+ DUK_ASSERT(heap->st_size >= 2);
+ DUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0); /* 2^N */
+ DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL);
+
+ DUK_STATS_INC(heap, stats_strtab_resize_grow);
+
+ new_st_size = heap->st_size << 1U;
+ DUK_ASSERT(new_st_size > heap->st_size); /* No overflow. */
+
+ /* Reallocate the strtable first and then work in-place to rehash
+ * strings. We don't need an indirect allocation here: even if GC
+ * is triggered to satisfy the allocation, recursive strtable resize
+ * is prevented by flags. This is also why we don't need to use
+ * DUK_REALLOC_INDIRECT().
+ */
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ new_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size);
+#else
+ new_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size);
+#endif
+ if (DUK_UNLIKELY(new_ptr == NULL)) {
+ /* If realloc fails we can continue normally: the string table
+ * won't "fill up" although chains will gradually get longer.
+ * When string insertions continue, we'll quite soon try again
+ * with no special handling.
+ */
+ DUK_D(DUK_DPRINT("string table grow failed, ignoring"));
+ return;
+ }
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ heap->strtable16 = new_ptr;
+#else
+ heap->strtable = new_ptr;
+#endif
+
+ /* Rehash a single bucket into two separate ones. When we grow
+ * by x2 the highest 'new' bit determines whether a string remains
+ * in its old position (bit is 0) or goes to a new one (bit is 1).
+ */
+
+ old_st_size = heap->st_size;
+ new_ptr_high = new_ptr + old_st_size;
+ for (i = 0; i < old_st_size; i++) {
+ duk_hstring *new_root;
+ duk_hstring *new_root_high;
+
+ h = DUK__HEAPPTR_DEC16(heap, new_ptr[i]);
+ new_root = h;
+ new_root_high = NULL;
+
+ prev = NULL;
+ while (h != NULL) {
+ duk_uint32_t mask;
+
+ DUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i);
+ next = h->hdr.h_next;
+
+ /* Example: if previous size was 256, previous mask is 0xFF
+ * and size is 0x100 which corresponds to the new bit that
+ * comes into play.
+ */
+ DUK_ASSERT(heap->st_mask == old_st_size - 1);
+ mask = old_st_size;
+ if (DUK_HSTRING_GET_HASH(h) & mask) {
+ if (prev != NULL) {
+ prev->hdr.h_next = h->hdr.h_next;
+ } else {
+ DUK_ASSERT(h == new_root);
+ new_root = h->hdr.h_next;
+ }
+
+ h->hdr.h_next = new_root_high;
+ new_root_high = h;
+ } else {
+ prev = h;
+ }
+ h = next;
+ }
+
+ new_ptr[i] = DUK__HEAPPTR_ENC16(heap, new_root);
+ new_ptr_high[i] = DUK__HEAPPTR_ENC16(heap, new_root_high);
+ }
+
+ heap->st_size = new_st_size;
+ heap->st_mask = new_st_size - 1;
+
+#if defined(DUK_USE_ASSERTIONS)
+ duk__strtable_assert_checks(heap);
+#endif
+}
+#endif /* DUK__STRTAB_RESIZE_CHECK */
+
+/*
+ * Shrink strtable allocation in-place.
+ */
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+DUK_LOCAL void duk__strtable_shrink_inplace(duk_heap *heap) {
+ duk_uint32_t new_st_size;
+ duk_uint32_t i;
+ duk_hstring *h;
+ duk_hstring *other;
+ duk_hstring *root;
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *old_ptr;
+ duk_uint16_t *old_ptr_high;
+ duk_uint16_t *new_ptr;
+#else
+ duk_hstring **old_ptr;
+ duk_hstring **old_ptr_high;
+ duk_hstring **new_ptr;
+#endif
+
+ DUK_DD(DUK_DDPRINT("shrink in-place: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2));
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(heap->st_resizing == 1);
+ DUK_ASSERT(heap->st_size >= 2);
+ DUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0); /* 2^N */
+ DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL);
+
+ DUK_STATS_INC(heap, stats_strtab_resize_shrink);
+
+ new_st_size = heap->st_size >> 1U;
+
+ /* Combine two buckets into a single one. When we shrink, one hash
+ * bit (highest) disappears.
+ */
+ old_ptr = DUK__GET_STRTABLE(heap);
+ old_ptr_high = old_ptr + new_st_size;
+ for (i = 0; i < new_st_size; i++) {
+ h = DUK__HEAPPTR_DEC16(heap, old_ptr[i]);
+ other = DUK__HEAPPTR_DEC16(heap, old_ptr_high[i]);
+
+ if (h == NULL) {
+ /* First chain is empty, so use second one as is. */
+ root = other;
+ } else {
+ /* Find end of first chain, and link in the second. */
+ root = h;
+ while (h->hdr.h_next != NULL) {
+ h = h->hdr.h_next;
+ }
+ h->hdr.h_next = other;
+ }
+
+ old_ptr[i] = DUK__HEAPPTR_ENC16(heap, root);
+ }
+
+ heap->st_size = new_st_size;
+ heap->st_mask = new_st_size - 1;
+
+ /* The strtable is now consistent and we can realloc safely. Even
+ * if side effects cause string interning or removal the strtable
+ * updates are safe. Recursive resize has been prevented by caller.
+ * This is also why we don't need to use DUK_REALLOC_INDIRECT().
+ *
+ * We assume a realloc() to a smaller size is guaranteed to succeed.
+ * It would be relatively straightforward to handle the error by
+ * essentially performing a "grow" step to recover.
+ */
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ new_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size);
+ DUK_ASSERT(new_ptr != NULL);
+ heap->strtable16 = new_ptr;
+#else
+ new_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size);
+ DUK_ASSERT(new_ptr != NULL);
+ heap->strtable = new_ptr;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ duk__strtable_assert_checks(heap);
+#endif
+}
+#endif /* DUK__STRTAB_RESIZE_CHECK */
+
+/*
+ * Grow/shrink check.
+ */
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+DUK_LOCAL DUK_COLD DUK_NOINLINE void duk__strtable_resize_check(duk_heap *heap) {
+ duk_uint32_t load_factor; /* fixed point */
+
+ DUK_ASSERT(heap != NULL);
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ DUK_ASSERT(heap->strtable16 != NULL);
+#else
+ DUK_ASSERT(heap->strtable != NULL);
+#endif
+
+ DUK_STATS_INC(heap, stats_strtab_resize_check);
+
+ /* Prevent recursive resizing. */
+ if (DUK_UNLIKELY(heap->st_resizing != 0U)) {
+ DUK_D(DUK_DPRINT("prevent recursive strtable resize"));
+ return;
+ }
+
+ heap->st_resizing = 1;
+
+ DUK_ASSERT(heap->st_size >= 16U);
+ DUK_ASSERT((heap->st_size >> 4U) >= 1);
+ load_factor = heap->st_count / (heap->st_size >> 4U);
+
+ DUK_DD(DUK_DDPRINT("resize check string table: size=%lu, count=%lu, load_factor=%lu (fixed point .4; float %lf)",
+ (unsigned long) heap->st_size, (unsigned long) heap->st_count,
+ (unsigned long) load_factor,
+ (double) heap->st_count / (double) heap->st_size));
+
+ if (load_factor >= DUK_USE_STRTAB_GROW_LIMIT) {
+ if (heap->st_size >= DUK_USE_STRTAB_MAXSIZE) {
+ DUK_DD(DUK_DDPRINT("want to grow strtable (based on load factor) but already maximum size"));
+ } else {
+ DUK_D(DUK_DPRINT("grow string table: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2));
+#if defined(DUK_USE_DEBUG)
+ duk_heap_strtable_dump(heap);
+#endif
+ duk__strtable_grow_inplace(heap);
+ }
+ } else if (load_factor <= DUK_USE_STRTAB_SHRINK_LIMIT) {
+ if (heap->st_size <= DUK_USE_STRTAB_MINSIZE) {
+ DUK_DD(DUK_DDPRINT("want to shrink strtable (based on load factor) but already minimum size"));
+ } else {
+ DUK_D(DUK_DPRINT("shrink string table: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2));
+#if defined(DUK_USE_DEBUG)
+ duk_heap_strtable_dump(heap);
+#endif
+ duk__strtable_shrink_inplace(heap);
+ }
+ } else {
+ DUK_DD(DUK_DDPRINT("no need for strtable resize"));
+ }
+
+ heap->st_resizing = 0;
+}
+#endif /* DUK__STRTAB_RESIZE_CHECK */
+
+/*
+ * Torture grow/shrink: unconditionally grow and shrink back.
+ */
+
+#if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK)
+DUK_LOCAL void duk__strtable_resize_torture(duk_heap *heap) {
+ duk_uint32_t old_st_size;
+
+ DUK_ASSERT(heap != NULL);
+
+ old_st_size = heap->st_size;
+ if (old_st_size >= DUK_USE_STRTAB_MAXSIZE) {
+ return;
+ }
+
+ heap->st_resizing = 1;
+ duk__strtable_grow_inplace(heap);
+ if (heap->st_size > old_st_size) {
+ duk__strtable_shrink_inplace(heap);
+ }
+ heap->st_resizing = 0;
+}
+#endif /* DUK_USE_STRTAB_TORTURE && DUK__STRTAB_RESIZE_CHECK */
+
+/*
+ * Raw intern; string already checked not to be present.
+ */
+
+DUK_LOCAL duk_hstring *duk__strtable_do_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash) {
+ duk_hstring *res;
+ const duk_uint8_t *extdata;
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *slot;
+#else
+ duk_hstring **slot;
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("do_intern: heap=%p, str=%p, blen=%lu, strhash=%lx, st_size=%lu, st_count=%lu, load=%lf",
+ (void *) heap, (const void *) str, (unsigned long) blen, (unsigned long) strhash,
+ (unsigned long) heap->st_size, (unsigned long) heap->st_count,
+ (double) heap->st_count / (double) heap->st_size));
+
+ DUK_ASSERT(heap != NULL);
+
+ /* Prevent any side effects on the string table and the caller provided
+ * str/blen arguments while interning is in progress. For example, if
+ * the caller provided str/blen from a dynamic buffer, a finalizer
+ * might resize or modify that dynamic buffer, invalidating the call
+ * arguments.
+ *
+ * While finalizers must be prevented, mark-and-sweep itself is fine.
+ * Recursive string table resize is prevented explicitly here.
+ */
+
+ heap->pf_prevent_count++;
+ DUK_ASSERT(heap->pf_prevent_count != 0); /* Wrap. */
+
+#if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK)
+ duk__strtable_resize_torture(heap);
+#endif
+
+ /* String table grow/shrink check. Because of chaining (and no
+ * accumulation issues as with hash probe chains and DELETED
+ * markers) there's never a mandatory need to resize right now.
+ * Check for the resize only periodically, based on st_count
+ * bit pattern. Because string table removal doesn't do a shrink
+ * check, we do that also here.
+ *
+ * Do the resize and possible grow/shrink before the new duk_hstring
+ * has been allocated. Otherwise we may trigger a GC when the result
+ * duk_hstring is not yet strongly referenced.
+ */
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+ if (DUK_UNLIKELY((heap->st_count & DUK_USE_STRTAB_RESIZE_CHECK_MASK) == 0)) {
+ duk__strtable_resize_check(heap);
+ }
+#endif
+
+ /* External string check (low memory optimization). */
+
+#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)
+ extdata = (const duk_uint8_t *) DUK_USE_EXTSTR_INTERN_CHECK(heap->heap_udata, (void *) DUK_LOSE_CONST(str), (duk_size_t) blen);
+#else
+ extdata = (const duk_uint8_t *) NULL;
+#endif
+
+ /* Allocate and initialize string, not yet linked. This may cause a
+ * GC which may cause other strings to be interned and inserted into
+ * the string table before we insert our string. Finalizer execution
+ * is disabled intentionally to avoid a finalizer from e.g. resizing
+ * a buffer used as a data area for 'str'.
+ */
+
+ res = duk__strtable_alloc_hstring(heap, str, blen, strhash, extdata);
+
+ /* Allow side effects again: GC must be avoided until duk_hstring
+ * result (if successful) has been INCREF'd.
+ */
+ DUK_ASSERT(heap->pf_prevent_count > 0);
+ heap->pf_prevent_count--;
+
+ /* Alloc error handling. */
+
+ if (DUK_UNLIKELY(res == NULL)) {
+#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)
+ if (extdata != NULL) {
+ DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) extdata);
+ }
+#endif
+ return NULL;
+ }
+
+ /* Insert into string table. */
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ slot = heap->strtable16 + (strhash & heap->st_mask);
+#else
+ slot = heap->strtable + (strhash & heap->st_mask);
+#endif
+ DUK_ASSERT(res->hdr.h_next == NULL); /* This is the case now, but unnecessary zeroing/NULLing. */
+ res->hdr.h_next = DUK__HEAPPTR_DEC16(heap, *slot);
+ *slot = DUK__HEAPPTR_ENC16(heap, res);
+
+ /* Update string count only for successful inserts. */
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+ heap->st_count++;
+#endif
+
+ /* The duk_hstring is in the string table but is not yet strongly
+ * reachable. Calling code MUST NOT make any allocations or other
+ * side effects before the duk_hstring has been INCREF'd and made
+ * reachable.
+ */
+
+ return res;
+}
+
+/*
+ * Intern a string from str/blen, returning either an existing duk_hstring
+ * or adding a new one into the string table. The input string does -not-
+ * need to be NUL terminated.
+ *
+ * The input 'str' argument may point to a Duktape managed data area such as
+ * the data area of a dynamic buffer. It's crucial to avoid any side effects
+ * that might affect the data area (e.g. resize the dynamic buffer, or write
+ * to the buffer) before the string is fully interned.
+ */
+
+#if defined(DUK_USE_ROM_STRINGS)
+DUK_LOCAL duk_hstring *duk__strtab_romstring_lookup(duk_heap *heap, const duk_uint8_t *str, duk_size_t blen, duk_uint32_t strhash) {
+ duk_size_t lookup_hash;
+ duk_hstring *curr;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_UNREF(heap);
+
+ lookup_hash = (blen << 4);
+ if (blen > 0) {
+ lookup_hash += str[0];
+ }
+ lookup_hash &= 0xff;
+
+ curr = DUK_LOSE_CONST(duk_rom_strings_lookup[lookup_hash]);
+ while (curr != NULL) {
+ if (strhash == DUK_HSTRING_GET_HASH(curr) &&
+ blen == DUK_HSTRING_GET_BYTELEN(curr) &&
+ DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(curr), blen) == 0) {
+ DUK_DDD(DUK_DDDPRINT("intern check: rom string: %!O, computed hash 0x%08lx, rom hash 0x%08lx",
+ curr, (unsigned long) strhash, (unsigned long) DUK_HSTRING_GET_HASH(curr)));
+ return curr;
+ }
+ curr = curr->hdr.h_next;
+ }
+
+ return NULL;
+}
+#endif /* DUK_USE_ROM_STRINGS */
+
+DUK_INTERNAL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen) {
+ duk_uint32_t strhash;
+ duk_hstring *h;
+
+ DUK_DDD(DUK_DDDPRINT("intern check: heap=%p, str=%p, blen=%lu", (void *) heap, (const void *) str, (unsigned long) blen));
+
+ /* Preliminaries. */
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(blen == 0 || str != NULL);
+ DUK_ASSERT(blen <= DUK_HSTRING_MAX_BYTELEN); /* Caller is responsible for ensuring this. */
+ strhash = duk_heap_hashstring(heap, str, (duk_size_t) blen);
+
+ /* String table lookup. */
+
+ DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL);
+ DUK_ASSERT(heap->st_size > 0);
+ DUK_ASSERT(heap->st_size == heap->st_mask + 1);
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ h = DUK__HEAPPTR_DEC16(heap, heap->strtable16[strhash & heap->st_mask]);
+#else
+ h = heap->strtable[strhash & heap->st_mask];
+#endif
+ while (h != NULL) {
+ if (DUK_HSTRING_GET_HASH(h) == strhash &&
+ DUK_HSTRING_GET_BYTELEN(h) == blen &&
+ DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(h), (size_t) blen) == 0) {
+ /* Found existing entry. */
+ DUK_STATS_INC(heap, stats_strtab_intern_hit);
+ return h;
+ }
+ h = h->hdr.h_next;
+ }
+
+ /* ROM table lookup. Because this lookup is slower, do it only after
+ * RAM lookup. This works because no ROM string is ever interned into
+ * the RAM string table.
+ */
+
+#if defined(DUK_USE_ROM_STRINGS)
+ h = duk__strtab_romstring_lookup(heap, str, blen, strhash);
+ if (h != NULL) {
+ DUK_STATS_INC(heap, stats_strtab_intern_hit);
+ return h;
+ }
+#endif
+
+ /* Not found in string table; insert. */
+
+ DUK_STATS_INC(heap, stats_strtab_intern_miss);
+ h = duk__strtable_do_intern(heap, str, blen, strhash);
+ return h; /* may be NULL */
+}
+
+/*
+ * Intern a string from u32.
+ */
+
+/* XXX: Could arrange some special handling because we know that the result
+ * will have an arridx flag and an ASCII flag, won't need a clen check, etc.
+ */
+
+DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val) {
+ duk_uint8_t buf[DUK__STRTAB_U32_MAX_STRLEN];
+ duk_uint8_t *p;
+
+ DUK_ASSERT(heap != NULL);
+
+ /* This is smaller and faster than a %lu sprintf. */
+ p = buf + sizeof(buf);
+ do {
+ p--;
+ *p = duk_lc_digits[val % 10];
+ val = val / 10;
+ } while (val != 0); /* For val == 0, emit exactly one '0'. */
+ DUK_ASSERT(p >= buf);
+
+ return duk_heap_strtable_intern(heap, (const duk_uint8_t *) p, (duk_uint32_t) ((buf + sizeof(buf)) - p));
+}
+
+/*
+ * Checked convenience variants.
+ *
+ * XXX: Because the main use case is for the checked variants, make them the
+ * main functionality and provide a safe variant separately (it is only needed
+ * during heap init). The problem with that is that longjmp state and error
+ * creation must already be possible to throw.
+ */
+
+DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t blen) {
+ duk_hstring *res;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(blen == 0 || str != NULL);
+
+ res = duk_heap_strtable_intern(thr->heap, str, blen);
+ if (DUK_UNLIKELY(res == NULL)) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+ return res;
+}
+
+DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val) {
+ duk_hstring *res;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+
+ res = duk_heap_strtable_intern_u32(thr->heap, val);
+ if (DUK_UNLIKELY(res == NULL)) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+ return res;
+}
+
+/*
+ * Remove (unlink) a string from the string table.
+ *
+ * Just unlinks the duk_hstring, leaving link pointers as garbage.
+ * Caller must free the string itself.
+ */
+
+#if defined(DUK_USE_REFERENCE_COUNTING)
+/* Unlink without a 'prev' pointer. */
+DUK_INTERNAL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *slot;
+#else
+ duk_hstring **slot;
+#endif
+ duk_hstring *other;
+ duk_hstring *prev;
+
+ DUK_DDD(DUK_DDDPRINT("remove: heap=%p, h=%p, blen=%lu, strhash=%lx",
+ (void *) heap, (void *) h,
+ (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0),
+ (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0)));
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(h != NULL);
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+ DUK_ASSERT(heap->st_count > 0);
+ heap->st_count--;
+#endif
+
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ slot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);
+#else
+ slot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);
+#endif
+ other = DUK__HEAPPTR_DEC16(heap, *slot);
+ DUK_ASSERT(other != NULL); /* At least argument string is in the chain. */
+
+ prev = NULL;
+ while (other != h) {
+ prev = other;
+ other = other->hdr.h_next;
+ DUK_ASSERT(other != NULL); /* We'll eventually find 'h'. */
+ }
+ if (prev != NULL) {
+ /* Middle of list. */
+ prev->hdr.h_next = h->hdr.h_next;
+ } else {
+ /* Head of list. */
+ *slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next);
+ }
+
+ /* There's no resize check on a string free. The next string
+ * intern will do one.
+ */
+}
+#endif /* DUK_USE_REFERENCE_COUNTING */
+
+/* Unlink with a 'prev' pointer. */
+DUK_INTERNAL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *slot;
+#else
+ duk_hstring **slot;
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("remove: heap=%p, prev=%p, h=%p, blen=%lu, strhash=%lx",
+ (void *) heap, (void *) prev, (void *) h,
+ (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0),
+ (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0)));
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(prev == NULL || prev->hdr.h_next == h);
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+ DUK_ASSERT(heap->st_count > 0);
+ heap->st_count--;
+#endif
+
+ if (prev != NULL) {
+ /* Middle of list. */
+ prev->hdr.h_next = h->hdr.h_next;
+ } else {
+ /* Head of list. */
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ slot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);
+#else
+ slot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);
+#endif
+ DUK_ASSERT(DUK__HEAPPTR_DEC16(heap, *slot) == h);
+ *slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next);
+ }
+}
+
+/*
+ * Force string table resize check in mark-and-sweep.
+ */
+
+DUK_INTERNAL void duk_heap_strtable_force_resize(duk_heap *heap) {
+ /* Does only one grow/shrink step if needed. The heap->st_resizing
+ * flag protects against recursive resizing.
+ */
+
+ DUK_ASSERT(heap != NULL);
+ DUK_UNREF(heap);
+
+#if defined(DUK__STRTAB_RESIZE_CHECK)
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ if (heap->strtable16 != NULL) {
+#else
+ if (heap->strtable != NULL) {
+#endif
+ duk__strtable_resize_check(heap);
+ }
+#endif
+}
+
+/*
+ * Free strings in the string table and the string table itself.
+ */
+
+DUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap) {
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ duk_uint16_t *strtable;
+ duk_uint16_t *st;
+#else
+ duk_hstring **strtable;
+ duk_hstring **st;
+#endif
+ duk_hstring *h;
+
+ DUK_ASSERT(heap != NULL);
+
+#if defined(DUK_USE_ASSERTIONS)
+ duk__strtable_assert_checks(heap);
+#endif
+
+ /* Strtable can be NULL if heap init fails. However, in that case
+ * heap->st_size is 0, so strtable == strtable_end and we skip the
+ * loop without a special check.
+ */
+ strtable = DUK__GET_STRTABLE(heap);
+ st = strtable + heap->st_size;
+ DUK_ASSERT(strtable != NULL || heap->st_size == 0);
+
+ while (strtable != st) {
+ --st;
+ h = DUK__HEAPPTR_DEC16(heap, *st);
+ while (h) {
+ duk_hstring *h_next;
+ h_next = h->hdr.h_next;
+
+ /* Strings may have inner refs (extdata) in some cases. */
+ duk_free_hstring(heap, h);
+
+ h = h_next;
+ }
+ }
+
+ DUK_FREE(heap, strtable);
+}
+
+/* automatic undefs */
+#undef DUK__GET_STRTABLE
+#undef DUK__HEAPPTR_DEC16
+#undef DUK__HEAPPTR_ENC16
+#undef DUK__STRTAB_U32_MAX_STRLEN
+#line 1 "duk_hobject_alloc.c"
+/*
+ * Hobject allocation.
+ *
+ * Provides primitive allocation functions for all object types (plain object,
+ * compiled function, native function, thread). The object return is not yet
+ * in "heap allocated" list and has a refcount of zero, so caller must careful.
+ */
+
+/* XXX: In most cases there's no need for plain allocation without pushing
+ * to the value stack. Maybe rework contract?
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Helpers.
+ */
+
+DUK_LOCAL void duk__init_object_parts(duk_heap *heap, duk_uint_t hobject_flags, duk_hobject *obj) {
+ DUK_ASSERT(obj != NULL);
+ /* Zeroed by caller. */
+
+ obj->hdr.h_flags = hobject_flags | DUK_HTYPE_OBJECT;
+ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(&obj->hdr) == DUK_HTYPE_OBJECT); /* Assume zero shift. */
+
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ DUK_HOBJECT_SET_PROTOTYPE(heap, obj, NULL);
+ DUK_HOBJECT_SET_PROPS(heap, obj, NULL);
+#endif
+#if defined(DUK_USE_HEAPPTR16)
+ /* Zero encoded pointer is required to match NULL. */
+ DUK_HEAPHDR_SET_NEXT(heap, &obj->hdr, NULL);
+#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
+ DUK_HEAPHDR_SET_PREV(heap, &obj->hdr, NULL);
+#endif
+#endif
+ DUK_ASSERT_HEAPHDR_LINKS(heap, &obj->hdr);
+ DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &obj->hdr);
+
+ /* obj->props is intentionally left as NULL, and duk_hobject_props.c must deal
+ * with this properly. This is intentional: empty objects consume a minimum
+ * amount of memory. Further, an initial allocation might fail and cause
+ * 'obj' to "leak" (require a mark-and-sweep) since it is not reachable yet.
+ */
+}
+
+DUK_LOCAL void *duk__hobject_alloc_init(duk_hthread *thr, duk_uint_t hobject_flags, duk_size_t size) {
+ void *res;
+
+ res = (void *) DUK_ALLOC_CHECKED_ZEROED(thr, size);
+ DUK_ASSERT(res != NULL);
+ duk__init_object_parts(thr->heap, hobject_flags, (duk_hobject *) res);
+ return res;
+}
+
+/*
+ * Allocate an duk_hobject.
+ *
+ * The allocated object has no allocation for properties; the caller may
+ * want to force a resize if a desired size is known.
+ *
+ * The allocated object has zero reference count and is not reachable.
+ * The caller MUST make the object reachable and increase its reference
+ * count before invoking any operation that might require memory allocation.
+ */
+
+DUK_INTERNAL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) {
+ duk_hobject *res;
+
+ DUK_ASSERT(heap != NULL);
+
+ /* different memory layout, alloc size, and init */
+ DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_COMPFUNC) == 0);
+ DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_NATFUNC) == 0);
+ DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_BOUNDFUNC) == 0);
+
+ res = (duk_hobject *) DUK_ALLOC_ZEROED(heap, sizeof(duk_hobject));
+ if (DUK_UNLIKELY(res == NULL)) {
+ return NULL;
+ }
+ DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res));
+
+ duk__init_object_parts(heap, hobject_flags, res);
+
+ DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res));
+ return res;
+}
+
+DUK_INTERNAL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hobject *res;
+
+ res = (duk_hobject *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobject));
+ return res;
+}
+
+DUK_INTERNAL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hcompfunc *res;
+
+ res = (duk_hcompfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hcompfunc));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+#if defined(DUK_USE_HEAPPTR16)
+ /* NULL pointer is required to encode to zero, so memset is enough. */
+#else
+ res->data = NULL;
+ res->funcs = NULL;
+ res->bytecode = NULL;
+#endif
+ res->lex_env = NULL;
+ res->var_env = NULL;
+#endif
+
+ return res;
+}
+
+DUK_INTERNAL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hnatfunc *res;
+
+ res = (duk_hnatfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hnatfunc));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->func = NULL;
+#endif
+
+ return res;
+}
+
+DUK_INTERNAL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags) {
+ duk_hboundfunc *res;
+
+ res = (duk_hboundfunc *) DUK_ALLOC(heap, sizeof(duk_hboundfunc));
+ if (!res) {
+ return NULL;
+ }
+ DUK_MEMZERO(res, sizeof(duk_hboundfunc));
+
+ duk__init_object_parts(heap, hobject_flags, &res->obj);
+
+ DUK_TVAL_SET_UNDEFINED(&res->target);
+ DUK_TVAL_SET_UNDEFINED(&res->this_binding);
+
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->args = NULL;
+#endif
+
+ return res;
+}
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_INTERNAL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hbufobj *res;
+
+ res = (duk_hbufobj *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hbufobj));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->buf = NULL;
+ res->buf_prop = NULL;
+#endif
+
+ DUK_ASSERT_HBUFOBJ_VALID(res);
+ return res;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/* Allocate a new thread.
+ *
+ * Leaves the built-ins array uninitialized. The caller must either
+ * initialize a new global context or share existing built-ins from
+ * another thread.
+ */
+DUK_INTERNAL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) {
+ duk_hthread *res;
+
+ res = (duk_hthread *) DUK_ALLOC(heap, sizeof(duk_hthread));
+ if (DUK_UNLIKELY(res == NULL)) {
+ return NULL;
+ }
+ DUK_MEMZERO(res, sizeof(duk_hthread));
+
+ duk__init_object_parts(heap, hobject_flags, &res->obj);
+
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->ptr_curr_pc = NULL;
+ res->heap = NULL;
+ res->valstack = NULL;
+ res->valstack_end = NULL;
+ res->valstack_alloc_end = NULL;
+ res->valstack_bottom = NULL;
+ res->valstack_top = NULL;
+ res->callstack_curr = NULL;
+ res->resumer = NULL;
+ res->compile_ctx = NULL,
+#if defined(DUK_USE_HEAPPTR16)
+ res->strs16 = NULL;
+#else
+ res->strs = NULL;
+#endif
+ {
+ duk_small_uint_t i;
+ for (i = 0; i < DUK_NUM_BUILTINS; i++) {
+ res->builtins[i] = NULL;
+ }
+ }
+#endif
+ /* When nothing is running, API calls are in non-strict mode. */
+ DUK_ASSERT(res->strict == 0);
+
+ res->heap = heap;
+
+ /* XXX: Any reason not to merge duk_hthread_alloc.c here? */
+ return res;
+}
+
+DUK_INTERNAL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hthread *res;
+
+ res = duk_hthread_alloc_unchecked(thr->heap, hobject_flags);
+ if (res == NULL) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+ return res;
+}
+
+DUK_INTERNAL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_harray *res;
+
+ res = (duk_harray *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_harray));
+
+ DUK_ASSERT(res->length == 0);
+
+ return res;
+}
+
+DUK_INTERNAL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hdecenv *res;
+
+ res = (duk_hdecenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hdecenv));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->thread = NULL;
+ res->varmap = NULL;
+#endif
+
+ DUK_ASSERT(res->thread == NULL);
+ DUK_ASSERT(res->varmap == NULL);
+ DUK_ASSERT(res->regbase_byteoff == 0);
+
+ return res;
+}
+
+DUK_INTERNAL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hobjenv *res;
+
+ res = (duk_hobjenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobjenv));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ res->target = NULL;
+#endif
+
+ DUK_ASSERT(res->target == NULL);
+
+ return res;
+}
+
+DUK_INTERNAL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {
+ duk_hproxy *res;
+
+ res = (duk_hproxy *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hproxy));
+
+ /* Leave ->target and ->handler uninitialized, as caller will always
+ * explicitly initialize them before any side effects are possible.
+ */
+
+ return res;
+}
+#line 1 "duk_hobject_enum.c"
+/*
+ * Object enumeration support.
+ *
+ * Creates an internal enumeration state object to be used e.g. with for-in
+ * enumeration. The state object contains a snapshot of target object keys
+ * and internal control state for enumeration. Enumerator flags allow caller
+ * to e.g. request internal/non-enumerable properties, and to enumerate only
+ * "own" properties.
+ *
+ * Also creates the result value for e.g. Object.keys() based on the same
+ * internal structure.
+ *
+ * This snapshot-based enumeration approach is used to simplify enumeration:
+ * non-snapshot-based approaches are difficult to reconcile with mutating
+ * the enumeration target, running multiple long-lived enumerators at the
+ * same time, garbage collection details, etc. The downside is that the
+ * enumerator object is memory inefficient especially for iterating arrays.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* XXX: identify enumeration target with an object index (not top of stack) */
+
+/* First enumerated key index in enumerator object, must match exactly the
+ * number of control properties inserted to the enumerator.
+ */
+#define DUK__ENUM_START_INDEX 2
+
+/* Current implementation suffices for ES2015 for now because there's no symbol
+ * sorting, so commented out for now.
+ */
+
+/*
+ * Helper to sort enumeration keys using a callback for pairwise duk_hstring
+ * comparisons. The keys are in the enumeration object entry part, starting
+ * from DUK__ENUM_START_INDEX, and the entry part is dense. Entry part values
+ * are all "true", e.g. "1" -> true, "3" -> true, "foo" -> true, "2" -> true,
+ * so it suffices to just switch keys without switching values.
+ *
+ * ES2015 [[OwnPropertyKeys]] enumeration order for ordinary objects:
+ * (1) array indices in ascending order,
+ * (2) non-array-index keys in insertion order, and
+ * (3) symbols in insertion order.
+ * http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys.
+ *
+ * This rule is applied to "own properties" at each inheritance level;
+ * non-duplicate parent keys always follow child keys. For example,
+ * an inherited array index will enumerate -after- a symbol in the
+ * child.
+ *
+ * Insertion sort is used because (1) it's simple and compact, (2) works
+ * in-place, (3) minimizes operations if data is already nearly sorted,
+ * (4) doesn't reorder elements considered equal.
+ * http://en.wikipedia.org/wiki/Insertion_sort
+ */
+
+/* Sort key, must hold array indices, "not array index" marker, and one more
+ * higher value for symbols.
+ */
+#if !defined(DUK_USE_SYMBOL_BUILTIN)
+typedef duk_uint32_t duk__sort_key_t;
+#elif defined(DUK_USE_64BIT_OPS)
+typedef duk_uint64_t duk__sort_key_t;
+#else
+typedef duk_double_t duk__sort_key_t;
+#endif
+
+/* Get sort key for a duk_hstring. */
+DUK_LOCAL duk__sort_key_t duk__hstring_sort_key(duk_hstring *x) {
+ duk__sort_key_t val;
+
+ /* For array indices [0,0xfffffffe] use the array index as is.
+ * For strings, use 0xffffffff, the marker 'arridx' already in
+ * duk_hstring. For symbols, any value above 0xffffffff works,
+ * as long as it is the same for all symbols; currently just add
+ * the masked flag field into the arridx temporary.
+ */
+ DUK_ASSERT(x != NULL);
+ DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(x) || DUK_HSTRING_GET_ARRIDX_FAST(x) == DUK_HSTRING_NO_ARRAY_INDEX);
+
+ val = (duk__sort_key_t) DUK_HSTRING_GET_ARRIDX_FAST(x);
+
+#if defined(DUK_USE_SYMBOL_BUILTIN)
+ val = val + (duk__sort_key_t) (DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) x) & DUK_HSTRING_FLAG_SYMBOL);
+#endif
+
+ return (duk__sort_key_t) val;
+}
+
+/* Insert element 'b' after element 'a'? */
+DUK_LOCAL duk_bool_t duk__sort_compare_es6(duk_hstring *a, duk_hstring *b, duk__sort_key_t val_b) {
+ duk__sort_key_t val_a;
+
+ DUK_ASSERT(a != NULL);
+ DUK_ASSERT(b != NULL);
+ DUK_UNREF(b); /* Not actually needed now, val_b suffices. */
+
+ val_a = duk__hstring_sort_key(a);
+
+ if (val_a > val_b) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+DUK_LOCAL void duk__sort_enum_keys_es6(duk_hthread *thr, duk_hobject *h_obj, duk_int_fast32_t idx_start, duk_int_fast32_t idx_end) {
+ duk_hstring **keys;
+ duk_int_fast32_t idx;
+
+ DUK_ASSERT(h_obj != NULL);
+ DUK_ASSERT(idx_start >= DUK__ENUM_START_INDEX);
+ DUK_ASSERT(idx_end >= idx_start);
+ DUK_UNREF(thr);
+
+ if (idx_end <= idx_start + 1) {
+ return; /* Zero or one element(s). */
+ }
+
+ keys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, h_obj);
+
+ for (idx = idx_start + 1; idx < idx_end; idx++) {
+ duk_hstring *h_curr;
+ duk_int_fast32_t idx_insert;
+ duk__sort_key_t val_curr;
+
+ h_curr = keys[idx];
+ DUK_ASSERT(h_curr != NULL);
+
+ /* Scan backwards for insertion place. This works very well
+ * when the elements are nearly in order which is the common
+ * (and optimized for) case.
+ */
+
+ val_curr = duk__hstring_sort_key(h_curr); /* Remains same during scanning. */
+ for (idx_insert = idx - 1; idx_insert >= idx_start; idx_insert--) {
+ duk_hstring *h_insert;
+ h_insert = keys[idx_insert];
+ DUK_ASSERT(h_insert != NULL);
+
+ if (duk__sort_compare_es6(h_insert, h_curr, val_curr)) {
+ break;
+ }
+ }
+ /* If we're out of indices, idx_insert == idx_start - 1 and idx_insert++
+ * brings us back to idx_start.
+ */
+ idx_insert++;
+ DUK_ASSERT(idx_insert >= 0 && idx_insert <= idx);
+
+ /* .-- p_insert .-- p_curr
+ * v v
+ * | ... | insert | ... | curr
+ */
+
+ /* This could also done when the keys are in order, i.e.
+ * idx_insert == idx. The result would be an unnecessary
+ * memmove() but we use an explicit check because the keys
+ * are very often in order already.
+ */
+ if (idx != idx_insert) {
+ DUK_MEMMOVE((void *) (keys + idx_insert + 1),
+ (const void *) (keys + idx_insert),
+ ((size_t) (idx - idx_insert) * sizeof(duk_hstring *)));
+ keys[idx_insert] = h_curr;
+ }
+ }
+}
+
+/*
+ * Create an internal enumerator object E, which has its keys ordered
+ * to match desired enumeration ordering. Also initialize internal control
+ * properties for enumeration.
+ *
+ * Note: if an array was used to hold enumeration keys instead, an array
+ * scan would be needed to eliminate duplicates found in the prototype chain.
+ */
+
+DUK_LOCAL void duk__add_enum_key(duk_hthread *thr, duk_hstring *k) {
+ /* 'k' may be unreachable on entry so must push without any
+ * potential for GC.
+ */
+ duk_push_hstring(thr, k);
+ duk_push_true(thr);
+ duk_put_prop(thr, -3);
+}
+
+DUK_LOCAL void duk__add_enum_key_stridx(duk_hthread *thr, duk_small_uint_t stridx) {
+ duk__add_enum_key(thr, DUK_HTHREAD_GET_STRING(thr, stridx));
+}
+
+DUK_INTERNAL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags) {
+ duk_hobject *enum_target;
+ duk_hobject *curr;
+ duk_hobject *res;
+#if defined(DUK_USE_ES6_PROXY)
+ duk_hobject *h_proxy_target;
+ duk_hobject *h_proxy_handler;
+ duk_hobject *h_trap_result;
+#endif
+ duk_uint_fast32_t i, len; /* used for array, stack, and entry indices */
+ duk_uint_fast32_t sort_start_index;
+
+ DUK_ASSERT(thr != NULL);
+
+ enum_target = duk_require_hobject(thr, -1);
+ DUK_ASSERT(enum_target != NULL);
+
+ duk_push_bare_object(thr);
+ res = duk_known_hobject(thr, -1);
+
+ /* [enum_target res] */
+
+ /* Target must be stored so that we can recheck whether or not
+ * keys still exist when we enumerate. This is not done if the
+ * enumeration result comes from a proxy trap as there is no
+ * real object to check against.
+ */
+ duk_push_hobject(thr, enum_target);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_TARGET);
+
+ /* Initialize index so that we skip internal control keys. */
+ duk_push_int(thr, DUK__ENUM_START_INDEX);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT);
+
+ /*
+ * Proxy object handling
+ */
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_LIKELY((enum_flags & DUK_ENUM_NO_PROXY_BEHAVIOR) != 0)) {
+ goto skip_proxy;
+ }
+ if (DUK_LIKELY(!duk_hobject_proxy_check(enum_target,
+ &h_proxy_target,
+ &h_proxy_handler))) {
+ goto skip_proxy;
+ }
+
+ /* XXX: share code with Object.keys() Proxy handling */
+
+ /* In ES2015 for-in invoked the "enumerate" trap; in ES2016 "enumerate"
+ * has been obsoleted and "ownKeys" is used instead.
+ */
+ DUK_DDD(DUK_DDDPRINT("proxy enumeration"));
+ duk_push_hobject(thr, h_proxy_handler);
+ if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) {
+ /* No need to replace the 'enum_target' value in stack, only the
+ * enum_target reference. This also ensures that the original
+ * enum target is reachable, which keeps the proxy and the proxy
+ * target reachable. We do need to replace the internal _Target.
+ */
+ DUK_DDD(DUK_DDDPRINT("no ownKeys trap, enumerate proxy target instead"));
+ DUK_DDD(DUK_DDDPRINT("h_proxy_target=%!O", (duk_heaphdr *) h_proxy_target));
+ enum_target = h_proxy_target;
+
+ duk_push_hobject(thr, enum_target); /* -> [ ... enum_target res handler undefined target ] */
+ duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_INT_TARGET);
+
+ duk_pop_2(thr); /* -> [ ... enum_target res ] */
+ goto skip_proxy;
+ }
+
+ /* [ ... enum_target res handler trap ] */
+ duk_insert(thr, -2);
+ duk_push_hobject(thr, h_proxy_target); /* -> [ ... enum_target res trap handler target ] */
+ duk_call_method(thr, 1 /*nargs*/); /* -> [ ... enum_target res trap_result ] */
+ h_trap_result = duk_require_hobject(thr, -1);
+ DUK_UNREF(h_trap_result);
+
+ duk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags);
+ /* -> [ ... enum_target res trap_result keys_array ] */
+
+ /* Copy cleaned up trap result keys into the enumerator object. */
+ /* XXX: result is a dense array; could make use of that. */
+ DUK_ASSERT(duk_is_array(thr, -1));
+ len = (duk_uint_fast32_t) duk_get_length(thr, -1);
+ for (i = 0; i < len; i++) {
+ (void) duk_get_prop_index(thr, -1, (duk_uarridx_t) i);
+ DUK_ASSERT(duk_is_string(thr, -1)); /* postprocess cleaned up */
+ /* [ ... enum_target res trap_result keys_array val ] */
+ duk_push_true(thr);
+ /* [ ... enum_target res trap_result keys_array val true ] */
+ duk_put_prop(thr, -5);
+ }
+ /* [ ... enum_target res trap_result keys_array ] */
+ duk_pop_2(thr);
+ duk_remove_m2(thr);
+
+ /* [ ... res ] */
+
+ /* The internal _Target property is kept pointing to the original
+ * enumeration target (the proxy object), so that the enumerator
+ * 'next' operation can read property values if so requested. The
+ * fact that the _Target is a proxy disables key existence check
+ * during enumeration.
+ */
+ DUK_DDD(DUK_DDDPRINT("proxy enumeration, final res: %!O", (duk_heaphdr *) res));
+ goto compact_and_return;
+
+ skip_proxy:
+#endif /* DUK_USE_ES6_PROXY */
+
+ curr = enum_target;
+ sort_start_index = DUK__ENUM_START_INDEX;
+ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(res) == DUK__ENUM_START_INDEX);
+ while (curr) {
+ duk_uint_fast32_t sort_end_index;
+#if !defined(DUK_USE_PREFER_SIZE)
+ duk_bool_t need_sort = 0;
+#endif
+
+ /* Enumeration proceeds by inheritance level. Virtual
+ * properties need to be handled specially, followed by
+ * array part, and finally entry part.
+ *
+ * If there are array index keys in the entry part or any
+ * other risk of the ES2015 [[OwnPropertyKeys]] order being
+ * violated, need_sort is set and an explicit ES2015 sort is
+ * done for the inheritance level.
+ */
+
+ /* XXX: inheriting from proxy */
+
+ /*
+ * Virtual properties.
+ *
+ * String and buffer indices are virtual and always enumerable,
+ * 'length' is virtual and non-enumerable. Array and arguments
+ * object props have special behavior but are concrete.
+ *
+ * String and buffer objects don't have an array part so as long
+ * as virtual array index keys are enumerated first, we don't
+ * need to set need_sort.
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr) || DUK_HOBJECT_IS_BUFOBJ(curr)) {
+#else
+ if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) {
+#endif
+ duk_bool_t have_length = 1;
+
+ /* String and buffer enumeration behavior is identical now,
+ * so use shared handler.
+ */
+ if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) {
+ duk_hstring *h_val;
+ h_val = duk_hobject_get_internal_value_string(thr->heap, curr);
+ DUK_ASSERT(h_val != NULL); /* string objects must not created without internal value */
+ len = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_val);
+ }
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ else {
+ duk_hbufobj *h_bufobj;
+ DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(curr));
+ h_bufobj = (duk_hbufobj *) curr;
+
+ if (h_bufobj == NULL || !h_bufobj->is_typedarray) {
+ /* Zero length seems like a good behavior for neutered buffers.
+ * ArrayBuffer (non-view) and DataView don't have index properties
+ * or .length property.
+ */
+ len = 0;
+ have_length = 0;
+ } else {
+ /* There's intentionally no check for
+ * current underlying buffer length.
+ */
+ len = (duk_uint_fast32_t) (h_bufobj->length >> h_bufobj->shift);
+ }
+ }
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+ for (i = 0; i < len; i++) {
+ duk_hstring *k;
+
+ /* This is a bit fragile: the string is not
+ * reachable until it is pushed by the helper.
+ */
+ k = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i);
+ DUK_ASSERT(k);
+
+ duk__add_enum_key(thr, k);
+
+ /* [enum_target res] */
+ }
+
+ /* 'length' and other virtual properties are not
+ * enumerable, but are included if non-enumerable
+ * properties are requested.
+ */
+
+ if (have_length && (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) {
+ duk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH);
+ }
+ }
+
+ /*
+ * Array part
+ */
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(curr); i++) {
+ duk_hstring *k;
+ duk_tval *tv;
+
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, curr, i);
+ if (DUK_TVAL_IS_UNUSED(tv)) {
+ continue;
+ }
+ k = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i); /* Fragile reachability. */
+ DUK_ASSERT(k);
+
+ duk__add_enum_key(thr, k);
+
+ /* [enum_target res] */
+ }
+
+ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(curr)) {
+ /* Array .length comes after numeric indices. */
+ if (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) {
+ duk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH);
+ }
+ }
+
+ /*
+ * Entries part
+ */
+
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(curr); i++) {
+ duk_hstring *k;
+
+ k = DUK_HOBJECT_E_GET_KEY(thr->heap, curr, i);
+ if (!k) {
+ continue;
+ }
+ if (!(enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) &&
+ !DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(thr->heap, curr, i)) {
+ continue;
+ }
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) {
+ if (!(enum_flags & DUK_ENUM_INCLUDE_HIDDEN) &&
+ DUK_HSTRING_HAS_HIDDEN(k)) {
+ continue;
+ }
+ if (!(enum_flags & DUK_ENUM_INCLUDE_SYMBOLS)) {
+ continue;
+ }
+#if !defined(DUK_USE_PREFER_SIZE)
+ need_sort = 1;
+#endif
+ } else {
+ DUK_ASSERT(!DUK_HSTRING_HAS_HIDDEN(k)); /* would also have symbol flag */
+ if (enum_flags & DUK_ENUM_EXCLUDE_STRINGS) {
+ continue;
+ }
+ }
+ if (DUK_HSTRING_HAS_ARRIDX(k)) {
+ /* This in currently only possible if the
+ * object has no array part: the array part
+ * is exhaustive when it is present.
+ */
+#if !defined(DUK_USE_PREFER_SIZE)
+ need_sort = 1;
+#endif
+ } else {
+ if (enum_flags & DUK_ENUM_ARRAY_INDICES_ONLY) {
+ continue;
+ }
+ }
+
+ DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, curr, i) ||
+ !DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE_PTR(thr->heap, curr, i)->v));
+
+ duk__add_enum_key(thr, k);
+
+ /* [enum_target res] */
+ }
+
+ /* Sort enumerated keys according to ES2015 requirements for
+ * the "inheritance level" just processed. This is far from
+ * optimal, ES2015 semantics could be achieved more efficiently
+ * by handling array index string keys (and symbol keys)
+ * specially above in effect doing the sort inline.
+ *
+ * Skip the sort if array index sorting is requested because
+ * we must consider all keys, also inherited, so an explicit
+ * sort is done for the whole result after we're done with the
+ * prototype chain.
+ *
+ * Also skip the sort if need_sort == 0, i.e. we know for
+ * certain that the enumerated order is already correct.
+ */
+ sort_end_index = DUK_HOBJECT_GET_ENEXT(res);
+
+ if (!(enum_flags & DUK_ENUM_SORT_ARRAY_INDICES)) {
+#if defined(DUK_USE_PREFER_SIZE)
+ duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index);
+#else
+ if (need_sort) {
+ DUK_DDD(DUK_DDDPRINT("need to sort"));
+ duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("no need to sort"));
+ }
+#endif
+ }
+
+ sort_start_index = sort_end_index;
+
+ if (enum_flags & DUK_ENUM_OWN_PROPERTIES_ONLY) {
+ break;
+ }
+
+ curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);
+ }
+
+ /* [enum_target res] */
+
+ duk_remove_m2(thr);
+
+ /* [res] */
+
+ if (enum_flags & DUK_ENUM_SORT_ARRAY_INDICES) {
+ /* Some E5/E5.1 algorithms require that array indices are iterated
+ * in a strictly ascending order. This is the case for e.g.
+ * Array.prototype.forEach() and JSON.stringify() PropertyList
+ * handling. The caller can request an explicit sort in these
+ * cases.
+ */
+
+ /* Sort to ES2015 order which works for pure array incides but
+ * also for mixed keys.
+ */
+ duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) DUK__ENUM_START_INDEX, (duk_int_fast32_t) DUK_HOBJECT_GET_ENEXT(res));
+ }
+
+#if defined(DUK_USE_ES6_PROXY)
+ compact_and_return:
+#endif
+ /* compact; no need to seal because object is internal */
+ duk_hobject_compact_props(thr, res);
+
+ DUK_DDD(DUK_DDDPRINT("created enumerator object: %!iT", (duk_tval *) duk_get_tval(thr, -1)));
+}
+
+/*
+ * Returns non-zero if a key and/or value was enumerated, and:
+ *
+ * [enum] -> [key] (get_value == 0)
+ * [enum] -> [key value] (get_value == 1)
+ *
+ * Returns zero without pushing anything on the stack otherwise.
+ */
+DUK_INTERNAL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value) {
+ duk_hobject *e;
+ duk_hobject *enum_target;
+ duk_hstring *res = NULL;
+ duk_uint_fast32_t idx;
+ duk_bool_t check_existence;
+
+ DUK_ASSERT(thr != NULL);
+
+ /* [... enum] */
+
+ e = duk_require_hobject(thr, -1);
+
+ /* XXX use get tval ptr, more efficient */
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_NEXT);
+ idx = (duk_uint_fast32_t) duk_require_uint(thr, -1);
+ duk_pop(thr);
+ DUK_DDD(DUK_DDDPRINT("enumeration: index is: %ld", (long) idx));
+
+ /* Enumeration keys are checked against the enumeration target (to see
+ * that they still exist). In the proxy enumeration case _Target will
+ * be the proxy, and checking key existence against the proxy is not
+ * required (or sensible, as the keys may be fully virtual).
+ */
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TARGET);
+ enum_target = duk_require_hobject(thr, -1);
+ DUK_ASSERT(enum_target != NULL);
+#if defined(DUK_USE_ES6_PROXY)
+ check_existence = (!DUK_HOBJECT_IS_PROXY(enum_target));
+#else
+ check_existence = 1;
+#endif
+ duk_pop(thr); /* still reachable */
+
+ DUK_DDD(DUK_DDDPRINT("getting next enum value, enum_target=%!iO, enumerator=%!iT",
+ (duk_heaphdr *) enum_target, (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* no array part */
+ for (;;) {
+ duk_hstring *k;
+
+ if (idx >= DUK_HOBJECT_GET_ENEXT(e)) {
+ DUK_DDD(DUK_DDDPRINT("enumeration: ran out of elements"));
+ break;
+ }
+
+ /* we know these because enum objects are internally created */
+ k = DUK_HOBJECT_E_GET_KEY(thr->heap, e, idx);
+ DUK_ASSERT(k != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, e, idx));
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE(thr->heap, e, idx).v));
+
+ idx++;
+
+ /* recheck that the property still exists */
+ if (check_existence && !duk_hobject_hasprop_raw(thr, enum_target, k)) {
+ DUK_DDD(DUK_DDDPRINT("property deleted during enumeration, skip"));
+ continue;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("enumeration: found element, key: %!O", (duk_heaphdr *) k));
+ res = k;
+ break;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("enumeration: updating next index to %ld", (long) idx));
+
+ duk_push_u32(thr, (duk_uint32_t) idx);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT);
+
+ /* [... enum] */
+
+ if (res) {
+ duk_push_hstring(thr, res);
+ if (get_value) {
+ duk_push_hobject(thr, enum_target);
+ duk_dup_m2(thr); /* -> [... enum key enum_target key] */
+ duk_get_prop(thr, -2); /* -> [... enum key enum_target val] */
+ duk_remove_m2(thr); /* -> [... enum key val] */
+ duk_remove(thr, -3); /* -> [... key val] */
+ } else {
+ duk_remove_m2(thr); /* -> [... key] */
+ }
+ return 1;
+ } else {
+ duk_pop(thr); /* -> [...] */
+ return 0;
+ }
+}
+
+/*
+ * Get enumerated keys in an Ecmascript array. Matches Object.keys() behavior
+ * described in E5 Section 15.2.3.14.
+ */
+
+DUK_INTERNAL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags) {
+ duk_hobject *e;
+ duk_hstring **keys;
+ duk_tval *tv;
+ duk_uint_fast32_t count;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(duk_get_hobject(thr, -1) != NULL);
+
+ /* Create a temporary enumerator to get the (non-duplicated) key list;
+ * the enumerator state is initialized without being needed, but that
+ * has little impact.
+ */
+
+ duk_hobject_enumerator_create(thr, enum_flags);
+ e = duk_known_hobject(thr, -1);
+
+ /* [enum_target enum res] */
+
+ /* Create dense result array to exact size. */
+ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(e) >= DUK__ENUM_START_INDEX);
+ count = (duk_uint32_t) (DUK_HOBJECT_GET_ENEXT(e) - DUK__ENUM_START_INDEX);
+
+ /* XXX: uninit would be OK */
+ tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count);
+ DUK_ASSERT(count == 0 || tv != NULL);
+
+ /* Fill result array, no side effects. */
+
+ keys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, e);
+ keys += DUK__ENUM_START_INDEX;
+
+ while (count-- > 0) {
+ duk_hstring *k;
+
+ k = *keys++;
+ DUK_ASSERT(k != NULL); /* enumerator must have no keys deleted */
+
+ DUK_TVAL_SET_STRING(tv, k);
+ tv++;
+ DUK_HSTRING_INCREF(thr, k);
+ }
+
+ /* [enum_target enum res] */
+ duk_remove_m2(thr);
+
+ /* [enum_target res] */
+
+ return 1; /* return 1 to allow callers to tail call */
+}
+
+/* automatic undefs */
+#undef DUK__ENUM_START_INDEX
+#line 1 "duk_hobject_misc.c"
+/*
+ * Misc support functions
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop) {
+ duk_uint_t sanity;
+
+ DUK_ASSERT(thr != NULL);
+
+ /* False if the object is NULL or the prototype 'p' is NULL.
+ * In particular, false if both are NULL (don't compare equal).
+ */
+ if (h == NULL || p == NULL) {
+ return 0;
+ }
+
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ if (h == p) {
+ return 1;
+ }
+
+ if (sanity-- == 0) {
+ if (ignore_loop) {
+ break;
+ } else {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+ }
+ h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);
+ } while (h);
+
+ return 0;
+}
+
+DUK_INTERNAL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p) {
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_hobject *tmp;
+
+ DUK_ASSERT(h);
+ tmp = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, p); /* avoid problems if p == h->prototype */
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);
+#else
+ DUK_ASSERT(h);
+ DUK_UNREF(thr);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p);
+#endif
+}
+#line 1 "duk_hobject_pc2line.c"
+/*
+ * Helpers for creating and querying pc2line debug data, which
+ * converts a bytecode program counter to a source line number.
+ *
+ * The run-time pc2line data is bit-packed, and documented in:
+ *
+ * doc/function-objects.rst
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_PC2LINE)
+
+/* Generate pc2line data for an instruction sequence, leaving a buffer on stack top. */
+DUK_INTERNAL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length) {
+ duk_hbuffer_dynamic *h_buf;
+ duk_bitencoder_ctx be_ctx_alloc;
+ duk_bitencoder_ctx *be_ctx = &be_ctx_alloc;
+ duk_uint32_t *hdr;
+ duk_size_t new_size;
+ duk_uint_fast32_t num_header_entries;
+ duk_uint_fast32_t curr_offset;
+ duk_int_fast32_t curr_line, next_line, diff_line;
+ duk_uint_fast32_t curr_pc;
+ duk_uint_fast32_t hdr_index;
+
+ DUK_ASSERT(length <= DUK_COMPILER_MAX_BYTECODE_LENGTH);
+
+ num_header_entries = (length + DUK_PC2LINE_SKIP - 1) / DUK_PC2LINE_SKIP;
+ curr_offset = (duk_uint_fast32_t) (sizeof(duk_uint32_t) + num_header_entries * sizeof(duk_uint32_t) * 2);
+
+ duk_push_dynamic_buffer(thr, (duk_size_t) curr_offset);
+ h_buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1);
+ DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h_buf) && !DUK_HBUFFER_HAS_EXTERNAL(h_buf));
+
+ hdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf);
+ DUK_ASSERT(hdr != NULL);
+ hdr[0] = (duk_uint32_t) length; /* valid pc range is [0, length[ */
+
+ curr_pc = 0U;
+ while (curr_pc < length) {
+ new_size = (duk_size_t) (curr_offset + DUK_PC2LINE_MAX_DIFF_LENGTH);
+ duk_hbuffer_resize(thr, h_buf, new_size);
+
+ hdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf);
+ DUK_ASSERT(hdr != NULL);
+ DUK_ASSERT(curr_pc < length);
+ hdr_index = 1 + (curr_pc / DUK_PC2LINE_SKIP) * 2;
+ curr_line = (duk_int_fast32_t) instrs[curr_pc].line;
+ hdr[hdr_index + 0] = (duk_uint32_t) curr_line;
+ hdr[hdr_index + 1] = (duk_uint32_t) curr_offset;
+
+#if 0
+ DUK_DDD(DUK_DDDPRINT("hdr[%ld]: pc=%ld line=%ld offset=%ld",
+ (long) (curr_pc / DUK_PC2LINE_SKIP),
+ (long) curr_pc,
+ (long) hdr[hdr_index + 0],
+ (long) hdr[hdr_index + 1]));
+#endif
+
+ DUK_MEMZERO(be_ctx, sizeof(*be_ctx));
+ be_ctx->data = ((duk_uint8_t *) hdr) + curr_offset;
+ be_ctx->length = (duk_size_t) DUK_PC2LINE_MAX_DIFF_LENGTH;
+
+ for (;;) {
+ curr_pc++;
+ if ( ((curr_pc % DUK_PC2LINE_SKIP) == 0) || /* end of diff run */
+ (curr_pc >= length) ) { /* end of bytecode */
+ break;
+ }
+ DUK_ASSERT(curr_pc < length);
+ next_line = (duk_int32_t) instrs[curr_pc].line;
+ diff_line = next_line - curr_line;
+
+#if 0
+ DUK_DDD(DUK_DDDPRINT("curr_line=%ld, next_line=%ld -> diff_line=%ld",
+ (long) curr_line, (long) next_line, (long) diff_line));
+#endif
+
+ if (diff_line == 0) {
+ /* 0 */
+ duk_be_encode(be_ctx, 0, 1);
+ } else if (diff_line >= 1 && diff_line <= 4) {
+ /* 1 0 <2 bits> */
+ duk_be_encode(be_ctx, (duk_uint32_t) ((0x02 << 2) + (diff_line - 1)), 4);
+ } else if (diff_line >= -0x80 && diff_line <= 0x7f) {
+ /* 1 1 0 <8 bits> */
+ DUK_ASSERT(diff_line + 0x80 >= 0 && diff_line + 0x80 <= 0xff);
+ duk_be_encode(be_ctx, (duk_uint32_t) ((0x06 << 8) + (diff_line + 0x80)), 11);
+ } else {
+ /* 1 1 1 <32 bits>
+ * Encode in two parts to avoid bitencode 24-bit limitation
+ */
+ duk_be_encode(be_ctx, (duk_uint32_t) ((0x07 << 16) + ((next_line >> 16) & 0xffff)), 19);
+ duk_be_encode(be_ctx, (duk_uint32_t) (next_line & 0xffff), 16);
+ }
+
+ curr_line = next_line;
+ }
+
+ duk_be_finish(be_ctx);
+ DUK_ASSERT(!be_ctx->truncated);
+
+ /* be_ctx->offset == length of encoded bitstream */
+ curr_offset += (duk_uint_fast32_t) be_ctx->offset;
+ }
+
+ /* compact */
+ new_size = (duk_size_t) curr_offset;
+ duk_hbuffer_resize(thr, h_buf, new_size);
+
+ (void) duk_to_fixed_buffer(thr, -1, NULL);
+
+ DUK_DDD(DUK_DDDPRINT("final pc2line data: pc_limit=%ld, length=%ld, %lf bits/opcode --> %!ixT",
+ (long) length, (long) new_size, (double) new_size * 8.0 / (double) length,
+ (duk_tval *) duk_get_tval(thr, -1)));
+}
+
+/* PC is unsigned. If caller does PC arithmetic and gets a negative result,
+ * it will map to a large PC which is out of bounds and causes a zero to be
+ * returned.
+ */
+DUK_LOCAL duk_uint_fast32_t duk__hobject_pc2line_query_raw(duk_hthread *thr, duk_hbuffer_fixed *buf, duk_uint_fast32_t pc) {
+ duk_bitdecoder_ctx bd_ctx_alloc;
+ duk_bitdecoder_ctx *bd_ctx = &bd_ctx_alloc;
+ duk_uint32_t *hdr;
+ duk_uint_fast32_t start_offset;
+ duk_uint_fast32_t pc_limit;
+ duk_uint_fast32_t hdr_index;
+ duk_uint_fast32_t pc_base;
+ duk_uint_fast32_t n;
+ duk_uint_fast32_t curr_line;
+
+ DUK_ASSERT(buf != NULL);
+ DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) buf) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) buf));
+ DUK_UNREF(thr);
+
+ /*
+ * Use the index in the header to find the right starting point
+ */
+
+ hdr_index = pc / DUK_PC2LINE_SKIP;
+ pc_base = hdr_index * DUK_PC2LINE_SKIP;
+ n = pc - pc_base;
+
+ if (DUK_HBUFFER_FIXED_GET_SIZE(buf) <= sizeof(duk_uint32_t)) {
+ DUK_DD(DUK_DDPRINT("pc2line lookup failed: buffer is smaller than minimal header"));
+ goto pc2line_error;
+ }
+
+ hdr = (duk_uint32_t *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, buf);
+ pc_limit = hdr[0];
+ if (pc >= pc_limit) {
+ /* Note: pc is unsigned and cannot be negative */
+ DUK_DD(DUK_DDPRINT("pc2line lookup failed: pc out of bounds (pc=%ld, limit=%ld)",
+ (long) pc, (long) pc_limit));
+ goto pc2line_error;
+ }
+
+ curr_line = hdr[1 + hdr_index * 2];
+ start_offset = hdr[1 + hdr_index * 2 + 1];
+ if ((duk_size_t) start_offset > DUK_HBUFFER_FIXED_GET_SIZE(buf)) {
+ DUK_DD(DUK_DDPRINT("pc2line lookup failed: start_offset out of bounds (start_offset=%ld, buffer_size=%ld)",
+ (long) start_offset, (long) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) buf)));
+ goto pc2line_error;
+ }
+
+ /*
+ * Iterate the bitstream (line diffs) until PC is reached
+ */
+
+ DUK_MEMZERO(bd_ctx, sizeof(*bd_ctx));
+ bd_ctx->data = ((duk_uint8_t *) hdr) + start_offset;
+ bd_ctx->length = (duk_size_t) (DUK_HBUFFER_FIXED_GET_SIZE(buf) - start_offset);
+
+#if 0
+ DUK_DDD(DUK_DDDPRINT("pc2line lookup: pc=%ld -> hdr_index=%ld, pc_base=%ld, n=%ld, start_offset=%ld",
+ (long) pc, (long) hdr_index, (long) pc_base, (long) n, (long) start_offset));
+#endif
+
+ while (n > 0) {
+#if 0
+ DUK_DDD(DUK_DDDPRINT("lookup: n=%ld, curr_line=%ld", (long) n, (long) curr_line));
+#endif
+
+ if (duk_bd_decode_flag(bd_ctx)) {
+ if (duk_bd_decode_flag(bd_ctx)) {
+ if (duk_bd_decode_flag(bd_ctx)) {
+ /* 1 1 1 <32 bits> */
+ duk_uint_fast32_t t;
+ t = duk_bd_decode(bd_ctx, 16); /* workaround: max nbits = 24 now */
+ t = (t << 16) + duk_bd_decode(bd_ctx, 16);
+ curr_line = t;
+ } else {
+ /* 1 1 0 <8 bits> */
+ duk_uint_fast32_t t;
+ t = duk_bd_decode(bd_ctx, 8);
+ curr_line = curr_line + t - 0x80;
+ }
+ } else {
+ /* 1 0 <2 bits> */
+ duk_uint_fast32_t t;
+ t = duk_bd_decode(bd_ctx, 2);
+ curr_line = curr_line + t + 1;
+ }
+ } else {
+ /* 0: no change */
+ }
+
+ n--;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("pc2line lookup result: pc %ld -> line %ld", (long) pc, (long) curr_line));
+ return curr_line;
+
+ pc2line_error:
+ DUK_D(DUK_DPRINT("pc2line conversion failed for pc=%ld", (long) pc));
+ return 0;
+}
+
+DUK_INTERNAL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc) {
+ duk_hbuffer_fixed *pc2line;
+ duk_uint_fast32_t line;
+
+ /* XXX: now that pc2line is used by the debugger quite heavily in
+ * checked execution, this should be optimized to avoid value stack
+ * and perhaps also implement some form of pc2line caching (see
+ * future work in debugger.rst).
+ */
+
+ duk_get_prop_stridx(thr, idx_func, DUK_STRIDX_INT_PC2LINE);
+ pc2line = (duk_hbuffer_fixed *) duk_get_hbuffer(thr, -1);
+ if (pc2line != NULL) {
+ DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) pc2line) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) pc2line));
+ line = duk__hobject_pc2line_query_raw(thr, pc2line, (duk_uint_fast32_t) pc);
+ } else {
+ line = 0;
+ }
+ duk_pop(thr);
+
+ return line;
+}
+
+#endif /* DUK_USE_PC2LINE */
+#line 1 "duk_hobject_props.c"
+/*
+ * duk_hobject property access functionality.
+ *
+ * This is very central functionality for size, performance, and compliance.
+ * It is also rather intricate; see hobject-algorithms.rst for discussion on
+ * the algorithms and memory-management.rst for discussion on refcounts and
+ * side effect issues.
+ *
+ * Notes:
+ *
+ * - It might be tempting to assert "refcount nonzero" for objects
+ * being operated on, but that's not always correct: objects with
+ * a zero refcount may be operated on by the refcount implementation
+ * (finalization) for instance. Hence, no refcount assertions are made.
+ *
+ * - Many operations (memory allocation, identifier operations, etc)
+ * may cause arbitrary side effects (e.g. through GC and finalization).
+ * These side effects may invalidate duk_tval pointers which point to
+ * areas subject to reallocation (like value stack). Heap objects
+ * themselves have stable pointers. Holding heap object pointers or
+ * duk_tval copies is not problematic with respect to side effects;
+ * care must be taken when holding and using argument duk_tval pointers.
+ *
+ * - If a finalizer is executed, it may operate on the the same object
+ * we're currently dealing with. For instance, the finalizer might
+ * delete a certain property which has already been looked up and
+ * confirmed to exist. Ideally finalizers would be disabled if GC
+ * happens during property access. At the moment property table realloc
+ * disables finalizers, and all DECREFs may cause arbitrary changes so
+ * handle DECREF carefully.
+ *
+ * - The order of operations for a DECREF matters. When DECREF is executed,
+ * the entire object graph must be consistent; note that a refzero may
+ * lead to a mark-and-sweep through a refcount finalizer. Use NORZ macros
+ * and an explicit DUK_REFZERO_CHECK_xxx() if achieving correct order is hard.
+ */
+
+/*
+ * XXX: array indices are mostly typed as duk_uint32_t here; duk_uarridx_t
+ * might be more appropriate.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Local defines
+ */
+
+#define DUK__NO_ARRAY_INDEX DUK_HSTRING_NO_ARRAY_INDEX
+
+/* Marker values for hash part. */
+#define DUK__HASH_UNUSED DUK_HOBJECT_HASHIDX_UNUSED
+#define DUK__HASH_DELETED DUK_HOBJECT_HASHIDX_DELETED
+
+/* Valstack space that suffices for all local calls, excluding any recursion
+ * into Ecmascript or Duktape/C calls (Proxy, getters, etc).
+ */
+#define DUK__VALSTACK_SPACE 10
+
+/* Valstack space allocated especially for proxy lookup which does a
+ * recursive property lookup.
+ */
+#define DUK__VALSTACK_PROXY_LOOKUP 20
+
+/*
+ * Local prototypes
+ */
+
+DUK_LOCAL_DECL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc);
+DUK_LOCAL_DECL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag);
+DUK_LOCAL_DECL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc);
+
+DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, duk_hobject *obj, duk_uint32_t old_len, duk_uint32_t new_len, duk_bool_t force_flag, duk_uint32_t *out_result_len);
+DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj);
+
+DUK_LOCAL_DECL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags);
+DUK_LOCAL_DECL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags);
+
+/*
+ * Misc helpers
+ */
+
+/* Convert a duk_tval number (caller checks) to a 32-bit index. Returns
+ * DUK__NO_ARRAY_INDEX if the number is not whole or not a valid array
+ * index.
+ */
+/* XXX: for fastints, could use a variant which assumes a double duk_tval
+ * (and doesn't need to check for fastint again).
+ */
+DUK_LOCAL duk_uint32_t duk__tval_number_to_arr_idx(duk_tval *tv) {
+ duk_double_t dbl;
+ duk_uint32_t idx;
+
+ DUK_ASSERT(tv != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+
+ /* -0 is accepted here as index 0 because ToString(-0) == "0" which is
+ * in canonical form and thus an array index.
+ */
+ dbl = DUK_TVAL_GET_NUMBER(tv);
+ idx = (duk_uint32_t) dbl;
+ if ((duk_double_t) idx == dbl) {
+ /* Is whole and within 32 bit range. If the value happens to be 0xFFFFFFFF,
+ * it's not a valid array index but will then match DUK__NO_ARRAY_INDEX.
+ */
+ return idx;
+ }
+ return DUK__NO_ARRAY_INDEX;
+}
+
+#if defined(DUK_USE_FASTINT)
+/* Convert a duk_tval fastint (caller checks) to a 32-bit index. */
+DUK_LOCAL duk_uint32_t duk__tval_fastint_to_arr_idx(duk_tval *tv) {
+ duk_int64_t t;
+
+ DUK_ASSERT(tv != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));
+
+ t = DUK_TVAL_GET_FASTINT(tv);
+ if (((duk_uint64_t) t & ~DUK_U64_CONSTANT(0xffffffff)) != 0) {
+ /* Catches >0x100000000 and negative values. */
+ return DUK__NO_ARRAY_INDEX;
+ }
+
+ /* If the value happens to be 0xFFFFFFFF, it's not a valid array index
+ * but will then match DUK__NO_ARRAY_INDEX.
+ */
+ return (duk_uint32_t) t;
+}
+#endif /* DUK_USE_FASTINT */
+
+/* Convert a duk_tval on the value stack (in a trusted index we don't validate)
+ * to a string or symbol using ES2015 ToPropertyKey():
+ * http://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey.
+ *
+ * Also check if it's a valid array index and return that (or DUK__NO_ARRAY_INDEX
+ * if not).
+ */
+DUK_LOCAL duk_uint32_t duk__to_property_key(duk_hthread *thr, duk_idx_t idx, duk_hstring **out_h) {
+ duk_uint32_t arr_idx;
+ duk_hstring *h;
+ duk_tval *tv_dst;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(out_h != NULL);
+ DUK_ASSERT(duk_is_valid_index(thr, idx));
+ DUK_ASSERT(idx < 0);
+
+ /* XXX: The revised ES2015 ToPropertyKey() handling (ES5.1 was just
+ * ToString()) involves a ToPrimitive(), a symbol check, and finally
+ * a ToString(). Figure out the best way to have a good fast path
+ * but still be compliant and share code.
+ */
+
+ tv_dst = DUK_GET_TVAL_NEGIDX(thr, idx); /* intentionally unvalidated */
+ if (DUK_TVAL_IS_STRING(tv_dst)) {
+ /* Most important path: strings and plain symbols are used as
+ * is. For symbols the array index check below is unnecessary
+ * (they're never valid array indices) but checking that the
+ * string is a symbol would make the plain string path slower
+ * unnecessarily.
+ */
+ h = DUK_TVAL_GET_STRING(tv_dst);
+ } else {
+ h = duk_to_property_key_hstring(thr, idx);
+ }
+ DUK_ASSERT(h != NULL);
+ *out_h = h;
+
+ arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(h);
+ return arr_idx;
+}
+
+DUK_LOCAL duk_uint32_t duk__push_tval_to_property_key(duk_hthread *thr, duk_tval *tv_key, duk_hstring **out_h) {
+ duk_push_tval(thr, tv_key); /* XXX: could use an unsafe push here */
+ return duk__to_property_key(thr, -1, out_h);
+}
+
+/* String is an own (virtual) property of a plain buffer. */
+DUK_LOCAL duk_bool_t duk__key_is_plain_buf_ownprop(duk_hthread *thr, duk_hbuffer *buf, duk_hstring *key, duk_uint32_t arr_idx) {
+ DUK_UNREF(thr);
+
+ /* Virtual index properties. Checking explicitly for
+ * 'arr_idx != DUK__NO_ARRAY_INDEX' is not necessary
+ * because DUK__NO_ARRAY_INDEXi is always larger than
+ * maximum allowed buffer size.
+ */
+ DUK_ASSERT(DUK__NO_ARRAY_INDEX >= DUK_HBUFFER_GET_SIZE(buf));
+ if (arr_idx < DUK_HBUFFER_GET_SIZE(buf)) {
+ return 1;
+ }
+
+ /* Other virtual properties. */
+ return (key == DUK_HTHREAD_STRING_LENGTH(thr));
+}
+
+/*
+ * Helpers for managing property storage size
+ */
+
+/* Get default hash part size for a certain entry part size. */
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+DUK_LOCAL duk_uint32_t duk__get_default_h_size(duk_uint32_t e_size) {
+ DUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES);
+
+ if (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) {
+ duk_uint32_t res;
+ duk_uint32_t tmp;
+
+ /* Hash size should be 2^N where N is chosen so that 2^N is
+ * larger than e_size. Extra shifting is used to ensure hash
+ * is relatively sparse.
+ */
+ tmp = e_size;
+ res = 2; /* Result will be 2 ** (N + 1). */
+ while (tmp >= 0x40) {
+ tmp >>= 6;
+ res <<= 6;
+ }
+ while (tmp != 0) {
+ tmp >>= 1;
+ res <<= 1;
+ }
+ DUK_ASSERT((DUK_HOBJECT_MAX_PROPERTIES << 2U) > DUK_HOBJECT_MAX_PROPERTIES); /* Won't wrap, even shifted by 2. */
+ DUK_ASSERT(res > e_size);
+ return res;
+ } else {
+ return 0;
+ }
+}
+#endif /* USE_PROP_HASH_PART */
+
+/* Get minimum entry part growth for a certain size. */
+DUK_LOCAL duk_uint32_t duk__get_min_grow_e(duk_uint32_t e_size) {
+ duk_uint32_t res;
+
+ DUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES);
+
+ res = (e_size + DUK_USE_HOBJECT_ENTRY_MINGROW_ADD) / DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR;
+ DUK_ASSERT(res >= 1); /* important for callers */
+ return res;
+}
+
+/* Get minimum array part growth for a certain size. */
+DUK_LOCAL duk_uint32_t duk__get_min_grow_a(duk_uint32_t a_size) {
+ duk_uint32_t res;
+
+ DUK_ASSERT((duk_size_t) a_size <= DUK_HOBJECT_MAX_PROPERTIES);
+
+ res = (a_size + DUK_USE_HOBJECT_ARRAY_MINGROW_ADD) / DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR;
+ DUK_ASSERT(res >= 1); /* important for callers */
+ return res;
+}
+
+/* Count actually used entry part entries (non-NULL keys). */
+DUK_LOCAL duk_uint32_t duk__count_used_e_keys(duk_hthread *thr, duk_hobject *obj) {
+ duk_uint_fast32_t i;
+ duk_uint_fast32_t n = 0;
+ duk_hstring **e;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_UNREF(thr);
+
+ e = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, obj);
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ if (*e++) {
+ n++;
+ }
+ }
+ return (duk_uint32_t) n;
+}
+
+/* Count actually used array part entries and array minimum size.
+ * NOTE: 'out_min_size' can be computed much faster by starting from the
+ * end and breaking out early when finding first used entry, but this is
+ * not needed now.
+ */
+DUK_LOCAL void duk__compute_a_stats(duk_hthread *thr, duk_hobject *obj, duk_uint32_t *out_used, duk_uint32_t *out_min_size) {
+ duk_uint_fast32_t i;
+ duk_uint_fast32_t used = 0;
+ duk_uint_fast32_t highest_idx = (duk_uint_fast32_t) -1; /* see below */
+ duk_tval *a;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(out_used != NULL);
+ DUK_ASSERT(out_min_size != NULL);
+ DUK_UNREF(thr);
+
+ a = DUK_HOBJECT_A_GET_BASE(thr->heap, obj);
+ for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {
+ duk_tval *tv = a++;
+ if (!DUK_TVAL_IS_UNUSED(tv)) {
+ used++;
+ highest_idx = i;
+ }
+ }
+
+ /* Initial value for highest_idx is -1 coerced to unsigned. This
+ * is a bit odd, but (highest_idx + 1) will then wrap to 0 below
+ * for out_min_size as intended.
+ */
+
+ *out_used = (duk_uint32_t) used;
+ *out_min_size = (duk_uint32_t) (highest_idx + 1); /* 0 if no used entries */
+}
+
+/* Check array density and indicate whether or not the array part should be abandoned. */
+DUK_LOCAL duk_bool_t duk__abandon_array_density_check(duk_uint32_t a_used, duk_uint32_t a_size) {
+ /*
+ * Array abandon check; abandon if:
+ *
+ * new_used / new_size < limit
+ * new_used < limit * new_size || limit is 3 bits fixed point
+ * new_used < limit' / 8 * new_size || *8
+ * 8*new_used < limit' * new_size || :8
+ * new_used < limit' * (new_size / 8)
+ *
+ * Here, new_used = a_used, new_size = a_size.
+ *
+ * Note: some callers use approximate values for a_used and/or a_size
+ * (e.g. dropping a '+1' term). This doesn't affect the usefulness
+ * of the check, but may confuse debugging.
+ */
+
+ return (a_used < DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT * (a_size >> 3));
+}
+
+/* Fast check for extending array: check whether or not a slow density check is required. */
+DUK_LOCAL duk_bool_t duk__abandon_array_slow_check_required(duk_uint32_t arr_idx, duk_uint32_t old_size) {
+ /*
+ * In a fast check we assume old_size equals old_used (i.e., existing
+ * array is fully dense).
+ *
+ * Slow check if:
+ *
+ * (new_size - old_size) / old_size > limit
+ * new_size - old_size > limit * old_size
+ * new_size > (1 + limit) * old_size || limit' is 3 bits fixed point
+ * new_size > (1 + (limit' / 8)) * old_size || * 8
+ * 8 * new_size > (8 + limit') * old_size || : 8
+ * new_size > (8 + limit') * (old_size / 8)
+ * new_size > limit'' * (old_size / 8) || limit'' = 9 -> max 25% increase
+ * arr_idx + 1 > limit'' * (old_size / 8)
+ *
+ * This check doesn't work well for small values, so old_size is rounded
+ * up for the check (and the '+ 1' of arr_idx can be ignored in practice):
+ *
+ * arr_idx > limit'' * ((old_size + 7) / 8)
+ */
+
+ return (arr_idx > DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT * ((old_size + 7) >> 3));
+}
+
+/*
+ * Proxy helpers
+ */
+
+#if defined(DUK_USE_ES6_PROXY)
+DUK_INTERNAL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler) {
+ duk_hproxy *h_proxy;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(out_target != NULL);
+ DUK_ASSERT(out_handler != NULL);
+
+ /* Caller doesn't need to check exotic proxy behavior (but does so for
+ * some fast paths).
+ */
+ if (DUK_LIKELY(!DUK_HOBJECT_IS_PROXY(obj))) {
+ return 0;
+ }
+ h_proxy = (duk_hproxy *) obj;
+ DUK_ASSERT_HPROXY_VALID(h_proxy);
+
+ DUK_ASSERT(h_proxy->handler != NULL);
+ DUK_ASSERT(h_proxy->target != NULL);
+ *out_handler = h_proxy->handler;
+ *out_target = h_proxy->target;
+
+ return 1;
+}
+#endif /* DUK_USE_ES6_PROXY */
+
+/* Get Proxy target object. If the argument is not a Proxy, return it as is.
+ * If a Proxy is revoked, an error is thrown.
+ */
+#if defined(DUK_USE_ES6_PROXY)
+DUK_INTERNAL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj) {
+ DUK_ASSERT(obj != NULL);
+
+ /* Resolve Proxy targets until Proxy chain ends. No explicit check for
+ * a Proxy loop: user code cannot create such a loop (it would only be
+ * possible by editing duk_hproxy references directly).
+ */
+
+ while (DUK_HOBJECT_IS_PROXY(obj)) {
+ duk_hproxy *h_proxy;
+
+ h_proxy = (duk_hproxy *) obj;
+ DUK_ASSERT_HPROXY_VALID(h_proxy);
+ obj = h_proxy->target;
+ DUK_ASSERT(obj != NULL);
+ }
+
+ DUK_ASSERT(obj != NULL);
+ return obj;
+}
+#endif /* DUK_USE_ES6_PROXY */
+
+#if defined(DUK_USE_ES6_PROXY)
+DUK_LOCAL duk_bool_t duk__proxy_check_prop(duk_hthread *thr, duk_hobject *obj, duk_small_uint_t stridx_trap, duk_tval *tv_key, duk_hobject **out_target) {
+ duk_hobject *h_handler;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(tv_key != NULL);
+ DUK_ASSERT(out_target != NULL);
+
+ if (!duk_hobject_proxy_check(obj, out_target, &h_handler)) {
+ return 0;
+ }
+ DUK_ASSERT(*out_target != NULL);
+ DUK_ASSERT(h_handler != NULL);
+
+ /* XXX: At the moment Duktape accesses internal keys like _Finalizer using a
+ * normal property set/get which would allow a proxy handler to interfere with
+ * such behavior and to get access to internal key strings. This is not a problem
+ * as such because internal key strings can be created in other ways too (e.g.
+ * through buffers). The best fix is to change Duktape internal lookups to
+ * skip proxy behavior. Until that, internal property accesses bypass the
+ * proxy and are applied to the target (as if the handler did not exist).
+ * This has some side effects, see test-bi-proxy-internal-keys.js.
+ */
+
+ if (DUK_TVAL_IS_STRING(tv_key)) {
+ duk_hstring *h_key = (duk_hstring *) DUK_TVAL_GET_STRING(tv_key);
+ DUK_ASSERT(h_key != NULL);
+ if (DUK_HSTRING_HAS_HIDDEN(h_key)) {
+ /* Symbol accesses must go through proxy lookup in ES2015.
+ * Hidden symbols behave like Duktape 1.x internal keys
+ * and currently won't.
+ */
+ DUK_DDD(DUK_DDDPRINT("hidden key, skip proxy handler and apply to target"));
+ return 0;
+ }
+ }
+
+ /* The handler is looked up with a normal property lookup; it may be an
+ * accessor or the handler object itself may be a proxy object. If the
+ * handler is a proxy, we need to extend the valstack as we make a
+ * recursive proxy check without a function call in between (in fact
+ * there is no limit to the potential recursion here).
+ *
+ * (For sanity, proxy creation rejects another proxy object as either
+ * the handler or the target at the moment so recursive proxy cases
+ * are not realized now.)
+ */
+
+ /* XXX: C recursion limit if proxies are allowed as handler/target values */
+
+ duk_require_stack(thr, DUK__VALSTACK_PROXY_LOOKUP);
+ duk_push_hobject(thr, h_handler);
+ if (duk_get_prop_stridx_short(thr, -1, stridx_trap)) {
+ /* -> [ ... handler trap ] */
+ duk_insert(thr, -2); /* -> [ ... trap handler ] */
+
+ /* stack prepped for func call: [ ... trap handler ] */
+ return 1;
+ } else {
+ duk_pop_2_unsafe(thr);
+ return 0;
+ }
+}
+#endif /* DUK_USE_ES6_PROXY */
+
+/*
+ * Reallocate property allocation, moving properties to the new allocation.
+ *
+ * Includes key compaction, rehashing, and can also optionally abandon
+ * the array part, 'migrating' array entries into the beginning of the
+ * new entry part.
+ *
+ * There is no support for in-place reallocation or just compacting keys
+ * without resizing the property allocation. This is intentional to keep
+ * code size minimal, but would be useful future work.
+ *
+ * The implementation is relatively straightforward, except for the array
+ * abandonment process. Array abandonment requires that new string keys
+ * are interned, which may trigger GC. All keys interned so far must be
+ * reachable for GC at all times and correctly refcounted for; valstack is
+ * used for that now.
+ *
+ * Also, a GC triggered during this reallocation process must not interfere
+ * with the object being resized. This is currently controlled by preventing
+ * finalizers (as they may affect ANY object) and object compaction in
+ * mark-and-sweep. It would suffice to protect only this particular object
+ * from compaction, however. DECREF refzero cascades are side effect free
+ * and OK.
+ *
+ * Note: because we need to potentially resize the valstack (as part
+ * of abandoning the array part), any tval pointers to the valstack
+ * will become invalid after this call.
+ */
+
+DUK_INTERNAL void duk_hobject_realloc_props(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t new_e_size,
+ duk_uint32_t new_a_size,
+ duk_uint32_t new_h_size,
+ duk_bool_t abandon_array) {
+ duk_small_uint_t prev_ms_base_flags;
+ duk_uint32_t new_alloc_size;
+ duk_uint32_t new_e_size_adjusted;
+ duk_uint8_t *new_p;
+ duk_hstring **new_e_k;
+ duk_propvalue *new_e_pv;
+ duk_uint8_t *new_e_f;
+ duk_tval *new_a;
+ duk_uint32_t *new_h;
+ duk_uint32_t new_e_next;
+ duk_uint_fast32_t i;
+ duk_size_t array_copy_size;
+#if defined(DUK_USE_ASSERTIONS)
+ duk_bool_t prev_error_not_allowed;
+#endif
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(!abandon_array || new_a_size == 0); /* if abandon_array, new_a_size must be 0 */
+ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL || (DUK_HOBJECT_GET_ESIZE(obj) == 0 && DUK_HOBJECT_GET_ASIZE(obj) == 0));
+ DUK_ASSERT(new_h_size == 0 || new_h_size >= new_e_size); /* required to guarantee success of rehashing,
+ * intentionally use unadjusted new_e_size
+ */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_STATS_INC(thr->heap, stats_object_realloc_props);
+
+ /*
+ * Pre resize assertions.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* XXX: pre-checks (such as no duplicate keys) */
+#endif
+
+ /*
+ * For property layout 1, tweak e_size to ensure that the whole entry
+ * part (key + val + flags) is a suitable multiple for alignment
+ * (platform specific).
+ *
+ * Property layout 2 does not require this tweaking and is preferred
+ * on low RAM platforms requiring alignment.
+ */
+
+#if defined(DUK_USE_HOBJECT_LAYOUT_2) || defined(DUK_USE_HOBJECT_LAYOUT_3)
+ DUK_DDD(DUK_DDDPRINT("using layout 2 or 3, no need to pad e_size: %ld", (long) new_e_size));
+ new_e_size_adjusted = new_e_size;
+#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && (DUK_HOBJECT_ALIGN_TARGET == 1)
+ DUK_DDD(DUK_DDDPRINT("using layout 1, but no need to pad e_size: %ld", (long) new_e_size));
+ new_e_size_adjusted = new_e_size;
+#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && ((DUK_HOBJECT_ALIGN_TARGET == 4) || (DUK_HOBJECT_ALIGN_TARGET == 8))
+ new_e_size_adjusted = (new_e_size + (duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U) &
+ (~((duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U));
+ DUK_DDD(DUK_DDDPRINT("using layout 1, and alignment target is %ld, adjusted e_size: %ld -> %ld",
+ (long) DUK_HOBJECT_ALIGN_TARGET, (long) new_e_size, (long) new_e_size_adjusted));
+ DUK_ASSERT(new_e_size_adjusted >= new_e_size);
+#else
+#error invalid hobject layout defines
+#endif
+
+ /*
+ * Debug logging after adjustment.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("attempt to resize hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to "
+ "{e_size=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld",
+ (void *) obj,
+ (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),
+ DUK_HOBJECT_GET_ASIZE(obj),
+ DUK_HOBJECT_GET_HSIZE(obj)),
+ (long) DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size),
+ (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj),
+ (long) DUK_HOBJECT_GET_ESIZE(obj),
+ (long) DUK_HOBJECT_GET_ENEXT(obj),
+ (long) DUK_HOBJECT_GET_ASIZE(obj),
+ (long) DUK_HOBJECT_GET_HSIZE(obj),
+ (long) new_e_size_adjusted,
+ (long) new_a_size,
+ (long) new_h_size,
+ (long) abandon_array,
+ (long) new_e_size));
+
+ /*
+ * Property count check. This is the only point where we ensure that
+ * we don't get more (allocated) property space that we can handle.
+ * There aren't hard limits as such, but some algorithms may fail
+ * if we get too close to the 4G property limit.
+ *
+ * Since this works based on allocation size (not actually used size),
+ * the limit is a bit approximate but good enough in practice.
+ */
+
+ if (new_e_size_adjusted + new_a_size > DUK_HOBJECT_MAX_PROPERTIES) {
+ DUK_ERROR_ALLOC_FAILED(thr);
+ }
+
+ /*
+ * Compute new alloc size and alloc new area.
+ *
+ * The new area is not tracked in the heap at all, so it's critical
+ * we get to free/keep it in a controlled manner.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* Whole path must be error throw free, but we may be called from
+ * within error handling so can't assert for error_not_allowed == 0.
+ */
+ prev_error_not_allowed = thr->heap->error_not_allowed;
+ thr->heap->error_not_allowed = 1;
+#endif
+ prev_ms_base_flags = thr->heap->ms_base_flags;
+ thr->heap->ms_base_flags |=
+ DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* Avoid attempt to compact the current object (all objects really). */
+ thr->heap->pf_prevent_count++; /* Avoid finalizers. */
+ DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */
+
+ new_alloc_size = DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size);
+ DUK_DDD(DUK_DDDPRINT("new hobject allocation size is %ld", (long) new_alloc_size));
+ if (new_alloc_size == 0) {
+ DUK_ASSERT(new_e_size_adjusted == 0);
+ DUK_ASSERT(new_a_size == 0);
+ DUK_ASSERT(new_h_size == 0);
+ new_p = NULL;
+ } else {
+ /* Alloc may trigger mark-and-sweep but no compaction, and
+ * cannot throw.
+ */
+#if 0 /* XXX: inject test */
+ if (1) {
+ new_p = NULL;
+ goto alloc_failed;
+ }
+#endif
+ new_p = (duk_uint8_t *) DUK_ALLOC(thr->heap, new_alloc_size);
+ if (new_p == NULL) {
+ /* NULL always indicates alloc failure because
+ * new_alloc_size > 0.
+ */
+ goto alloc_failed;
+ }
+ }
+
+ /* Set up pointers to the new property area: this is hidden behind a macro
+ * because it is memory layout specific.
+ */
+ DUK_HOBJECT_P_SET_REALLOC_PTRS(new_p, new_e_k, new_e_pv, new_e_f, new_a, new_h,
+ new_e_size_adjusted, new_a_size, new_h_size);
+ DUK_UNREF(new_h); /* happens when hash part dropped */
+ new_e_next = 0;
+
+ /* if new_p == NULL, all of these pointers are NULL */
+ DUK_ASSERT((new_p != NULL) ||
+ (new_e_k == NULL && new_e_pv == NULL && new_e_f == NULL &&
+ new_a == NULL && new_h == NULL));
+
+ DUK_DDD(DUK_DDDPRINT("new alloc size %ld, new_e_k=%p, new_e_pv=%p, new_e_f=%p, new_a=%p, new_h=%p",
+ (long) new_alloc_size, (void *) new_e_k, (void *) new_e_pv, (void *) new_e_f,
+ (void *) new_a, (void *) new_h));
+
+ /*
+ * Migrate array part to start of entries if requested.
+ *
+ * Note: from an enumeration perspective the order of entry keys matters.
+ * Array keys should appear wherever they appeared before the array abandon
+ * operation. (This no longer matters much because keys are ES2015 sorted.)
+ */
+
+ if (abandon_array) {
+ /* Assuming new_a_size == 0, and that entry part contains
+ * no conflicting keys, refcounts do not need to be adjusted for
+ * the values, as they remain exactly the same.
+ *
+ * The keys, however, need to be interned, incref'd, and be
+ * reachable for GC. Any intern attempt may trigger a GC and
+ * claim any non-reachable strings, so every key must be reachable
+ * at all times. Refcounts must be correct to satisfy refcount
+ * assertions.
+ *
+ * A longjmp must not occur here, as the new_p allocation would
+ * leak. Refcounts would come out correctly as the interned
+ * strings are valstack tracked.
+ */
+ DUK_ASSERT(new_a_size == 0);
+
+ DUK_STATS_INC(thr->heap, stats_object_abandon_array);
+
+ for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {
+ duk_tval *tv1;
+ duk_tval *tv2;
+ duk_hstring *key;
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL);
+
+ tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);
+ if (DUK_TVAL_IS_UNUSED(tv1)) {
+ continue;
+ }
+
+ DUK_ASSERT(new_p != NULL && new_e_k != NULL &&
+ new_e_pv != NULL && new_e_f != NULL);
+
+ /*
+ * Intern key via the valstack to ensure reachability behaves
+ * properly. We must avoid longjmp's here so use non-checked
+ * primitives.
+ *
+ * Note: duk_check_stack() potentially reallocs the valstack,
+ * invalidating any duk_tval pointers to valstack. Callers
+ * must be careful.
+ */
+
+#if 0 /* XXX: inject test */
+ if (1) {
+ goto abandon_error;
+ }
+#endif
+ /* Never shrinks; auto-adds DUK_VALSTACK_INTERNAL_EXTRA, which
+ * is generous.
+ */
+ if (!duk_check_stack(thr, 1)) {
+ goto abandon_error;
+ }
+ DUK_ASSERT_VALSTACK_SPACE(thr, 1);
+ key = duk_heap_strtable_intern_u32(thr->heap, (duk_uint32_t) i);
+ if (key == NULL) {
+ goto abandon_error;
+ }
+ duk_push_hstring(thr, key); /* keep key reachable for GC etc; guaranteed not to fail */
+
+ /* Key is now reachable in the valstack, don't INCREF
+ * the new allocation yet (we'll steal the refcounts
+ * from the value stack once all keys are done).
+ */
+
+ new_e_k[new_e_next] = key;
+ tv2 = &new_e_pv[new_e_next].v; /* array entries are all plain values */
+ DUK_TVAL_SET_TVAL(tv2, tv1);
+ new_e_f[new_e_next] = DUK_PROPDESC_FLAG_WRITABLE |
+ DUK_PROPDESC_FLAG_ENUMERABLE |
+ DUK_PROPDESC_FLAG_CONFIGURABLE;
+ new_e_next++;
+
+ /* Note: new_e_next matches pushed temp key count, and nothing can
+ * fail above between the push and this point.
+ */
+ }
+
+ /* Steal refcounts from value stack. */
+ DUK_DDD(DUK_DDDPRINT("abandon array: pop %ld key temps from valstack", (long) new_e_next));
+ duk_pop_n_nodecref_unsafe(thr, (duk_idx_t) new_e_next);
+ }
+
+ /*
+ * Copy keys and values in the entry part (compacting them at the same time).
+ */
+
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ duk_hstring *key;
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL);
+
+ key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i);
+ if (key == NULL) {
+ continue;
+ }
+
+ DUK_ASSERT(new_p != NULL && new_e_k != NULL &&
+ new_e_pv != NULL && new_e_f != NULL);
+
+ new_e_k[new_e_next] = key;
+ new_e_pv[new_e_next] = DUK_HOBJECT_E_GET_VALUE(thr->heap, obj, i);
+ new_e_f[new_e_next] = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i);
+ new_e_next++;
+ }
+ /* the entries [new_e_next, new_e_size_adjusted[ are left uninitialized on purpose (ok, not gc reachable) */
+
+ /*
+ * Copy array elements to new array part. If the new array part is
+ * larger, initialize the unused entries as UNUSED because they are
+ * GC reachable.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* Caller must have decref'd values above new_a_size (if that is necessary). */
+ if (!abandon_array) {
+ for (i = new_a_size; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {
+ duk_tval *tv;
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);
+ DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv));
+ }
+ }
+#endif
+ if (new_a_size > DUK_HOBJECT_GET_ASIZE(obj)) {
+ array_copy_size = sizeof(duk_tval) * DUK_HOBJECT_GET_ASIZE(obj);
+ } else {
+ array_copy_size = sizeof(duk_tval) * new_a_size;
+ }
+ if (array_copy_size > 0) {
+ /* Avoid zero copy with an invalid pointer. If obj->p is NULL,
+ * the 'new_a' pointer will be invalid which is not allowed even
+ * when copy size is zero.
+ */
+ DUK_ASSERT(new_a != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) > 0);
+ DUK_MEMCPY((void *) new_a,
+ (const void *) DUK_HOBJECT_A_GET_BASE(thr->heap, obj),
+ array_copy_size);
+ }
+ for (i = DUK_HOBJECT_GET_ASIZE(obj); i < new_a_size; i++) {
+ duk_tval *tv = &new_a[i];
+ DUK_TVAL_SET_UNUSED(tv);
+ }
+
+ /*
+ * Rebuild the hash part always from scratch (guaranteed to finish
+ * as long as caller gave consistent parameters).
+ *
+ * Any resize of hash part requires rehashing. In addition, by rehashing
+ * get rid of any elements marked deleted (DUK__HASH_DELETED) which is critical
+ * to ensuring the hash part never fills up.
+ */
+
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ if (new_h_size == 0) {
+ DUK_DDD(DUK_DDDPRINT("no hash part, no rehash"));
+ } else {
+ duk_uint32_t mask;
+
+ DUK_ASSERT(new_h != NULL);
+
+ /* fill new_h with u32 0xff = UNUSED */
+ DUK_ASSERT(new_h_size > 0);
+ DUK_MEMSET(new_h, 0xff, sizeof(duk_uint32_t) * new_h_size);
+
+ DUK_ASSERT(new_e_next <= new_h_size); /* equality not actually possible */
+
+ mask = new_h_size - 1;
+ for (i = 0; i < new_e_next; i++) {
+ duk_hstring *key = new_e_k[i];
+ duk_uint32_t j, step;
+
+ DUK_ASSERT(key != NULL);
+ j = DUK_HSTRING_GET_HASH(key) & mask;
+ step = 1; /* Cache friendly but clustering prone. */
+
+ for (;;) {
+ DUK_ASSERT(new_h[j] != DUK__HASH_DELETED); /* should never happen */
+ if (new_h[j] == DUK__HASH_UNUSED) {
+ DUK_DDD(DUK_DDDPRINT("rebuild hit %ld -> %ld", (long) j, (long) i));
+ new_h[j] = (duk_uint32_t) i;
+ break;
+ }
+ DUK_DDD(DUK_DDDPRINT("rebuild miss %ld, step %ld", (long) j, (long) step));
+ j = (j + step) & mask;
+
+ /* Guaranteed to finish (hash is larger than #props). */
+ }
+ }
+ }
+#endif /* DUK_USE_HOBJECT_HASH_PART */
+
+ /*
+ * Nice debug log.
+ */
+
+ DUK_DD(DUK_DDPRINT("resized hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to "
+ "{p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld",
+ (void *) obj,
+ (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),
+ DUK_HOBJECT_GET_ASIZE(obj),
+ DUK_HOBJECT_GET_HSIZE(obj)),
+ (long) new_alloc_size,
+ (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj),
+ (long) DUK_HOBJECT_GET_ESIZE(obj),
+ (long) DUK_HOBJECT_GET_ENEXT(obj),
+ (long) DUK_HOBJECT_GET_ASIZE(obj),
+ (long) DUK_HOBJECT_GET_HSIZE(obj),
+ (void *) new_p,
+ (long) new_e_size_adjusted,
+ (long) new_e_next,
+ (long) new_a_size,
+ (long) new_h_size,
+ (long) abandon_array,
+ (long) new_e_size));
+
+ /*
+ * All done, switch properties ('p') allocation to new one.
+ */
+
+ DUK_FREE_CHECKED(thr, DUK_HOBJECT_GET_PROPS(thr->heap, obj)); /* NULL obj->p is OK */
+ DUK_HOBJECT_SET_PROPS(thr->heap, obj, new_p);
+ DUK_HOBJECT_SET_ESIZE(obj, new_e_size_adjusted);
+ DUK_HOBJECT_SET_ENEXT(obj, new_e_next);
+ DUK_HOBJECT_SET_ASIZE(obj, new_a_size);
+ DUK_HOBJECT_SET_HSIZE(obj, new_h_size);
+
+ /* Clear array part flag only after switching. */
+ if (abandon_array) {
+ DUK_HOBJECT_CLEAR_ARRAY_PART(obj);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("resize result: %!O", (duk_heaphdr *) obj));
+
+ DUK_ASSERT(thr->heap->pf_prevent_count > 0);
+ thr->heap->pf_prevent_count--;
+ thr->heap->ms_base_flags = prev_ms_base_flags;
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(thr->heap->error_not_allowed == 1);
+ thr->heap->error_not_allowed = prev_error_not_allowed;
+#endif
+
+ /*
+ * Post resize assertions.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* XXX: post-checks (such as no duplicate keys) */
+#endif
+ return;
+
+ /*
+ * Abandon array failed. We don't need to DECREF anything
+ * because the references in the new allocation are not
+ * INCREF'd until abandon is complete. The string interned
+ * keys are on the value stack and are handled normally by
+ * unwind.
+ */
+
+ abandon_error:
+ alloc_failed:
+ DUK_D(DUK_DPRINT("object property table resize failed"));
+
+ DUK_FREE_CHECKED(thr, new_p); /* OK for NULL. */
+
+ thr->heap->pf_prevent_count--;
+ thr->heap->ms_base_flags = prev_ms_base_flags;
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(thr->heap->error_not_allowed == 1);
+ thr->heap->error_not_allowed = prev_error_not_allowed;
+#endif
+
+ DUK_ERROR_ALLOC_FAILED(thr);
+}
+
+/*
+ * Helpers to resize properties allocation on specific needs.
+ */
+
+DUK_INTERNAL void duk_hobject_resize_entrypart(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t new_e_size) {
+ duk_uint32_t old_e_size;
+ duk_uint32_t new_a_size;
+ duk_uint32_t new_h_size;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ old_e_size = DUK_HOBJECT_GET_ESIZE(obj);
+ if (old_e_size > new_e_size) {
+ new_e_size = old_e_size;
+ }
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ new_h_size = duk__get_default_h_size(new_e_size);
+#else
+ new_h_size = 0;
+#endif
+ new_a_size = DUK_HOBJECT_GET_ASIZE(obj);
+
+ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);
+}
+
+#if 0 /*unused */
+DUK_INTERNAL void duk_hobject_resize_arraypart(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t new_a_size) {
+ duk_uint32_t old_a_size;
+ duk_uint32_t new_e_size;
+ duk_uint32_t new_h_size;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ return;
+ }
+ old_a_size = DUK_HOBJECT_GET_ASIZE(obj);
+ if (old_a_size > new_a_size) {
+ new_a_size = old_a_size;
+ }
+ new_e_size = DUK_HOBJECT_GET_ESIZE(obj);
+ new_h_size = DUK_HOBJECT_GET_HSIZE(obj);
+
+ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);
+}
+#endif
+
+/* Grow entry part allocation for one additional entry. */
+DUK_LOCAL void duk__grow_props_for_new_entry_item(duk_hthread *thr, duk_hobject *obj) {
+ duk_uint32_t old_e_used; /* actually used, non-NULL entries */
+ duk_uint32_t new_e_size;
+ duk_uint32_t new_a_size;
+ duk_uint32_t new_h_size;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ /* Duktape 0.11.0 and prior tried to optimize the resize by not
+ * counting the number of actually used keys prior to the resize.
+ * This worked mostly well but also caused weird leak-like behavior
+ * as in: test-bug-object-prop-alloc-unbounded.js. So, now we count
+ * the keys explicitly to compute the new entry part size.
+ */
+
+ old_e_used = duk__count_used_e_keys(thr, obj);
+ new_e_size = old_e_used + duk__get_min_grow_e(old_e_used);
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ new_h_size = duk__get_default_h_size(new_e_size);
+#else
+ new_h_size = 0;
+#endif
+ new_a_size = DUK_HOBJECT_GET_ASIZE(obj);
+ DUK_ASSERT(new_e_size >= old_e_used + 1); /* duk__get_min_grow_e() is always >= 1 */
+
+ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);
+}
+
+/* Grow array part for a new highest array index. */
+DUK_LOCAL void duk__grow_props_for_array_item(duk_hthread *thr, duk_hobject *obj, duk_uint32_t highest_arr_idx) {
+ duk_uint32_t new_e_size;
+ duk_uint32_t new_a_size;
+ duk_uint32_t new_h_size;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(highest_arr_idx >= DUK_HOBJECT_GET_ASIZE(obj));
+
+ /* minimum new length is highest_arr_idx + 1 */
+
+ new_e_size = DUK_HOBJECT_GET_ESIZE(obj);
+ new_h_size = DUK_HOBJECT_GET_HSIZE(obj);
+ new_a_size = highest_arr_idx + duk__get_min_grow_a(highest_arr_idx);
+ DUK_ASSERT(new_a_size >= highest_arr_idx + 1); /* duk__get_min_grow_a() is always >= 1 */
+
+ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);
+}
+
+/* Abandon array part, moving array entries into entries part.
+ * This requires a props resize, which is a heavy operation.
+ * We also compact the entries part while we're at it, although
+ * this is not strictly required.
+ */
+DUK_LOCAL void duk__abandon_array_checked(duk_hthread *thr, duk_hobject *obj) {
+ duk_uint32_t new_e_size;
+ duk_uint32_t new_a_size;
+ duk_uint32_t new_h_size;
+ duk_uint32_t e_used; /* actually used, non-NULL keys */
+ duk_uint32_t a_used;
+ duk_uint32_t a_size;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ e_used = duk__count_used_e_keys(thr, obj);
+ duk__compute_a_stats(thr, obj, &a_used, &a_size);
+
+ /*
+ * Must guarantee all actually used array entries will fit into
+ * new entry part. Add one growth step to ensure we don't run out
+ * of space right away.
+ */
+
+ new_e_size = e_used + a_used;
+ new_e_size = new_e_size + duk__get_min_grow_e(new_e_size);
+ new_a_size = 0;
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ new_h_size = duk__get_default_h_size(new_e_size);
+#else
+ new_h_size = 0;
+#endif
+
+ DUK_DD(DUK_DDPRINT("abandon array part for hobject %p, "
+ "array stats before: e_used=%ld, a_used=%ld, a_size=%ld; "
+ "resize to e_size=%ld, a_size=%ld, h_size=%ld",
+ (void *) obj, (long) e_used, (long) a_used, (long) a_size,
+ (long) new_e_size, (long) new_a_size, (long) new_h_size));
+
+ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 1);
+}
+
+/*
+ * Compact an object. Minimizes allocation size for objects which are
+ * not likely to be extended. This is useful for internal and non-
+ * extensible objects, but can also be called for non-extensible objects.
+ * May abandon the array part if it is computed to be too sparse.
+ *
+ * This call is relatively expensive, as it needs to scan both the
+ * entries and the array part.
+ *
+ * The call may fail due to allocation error.
+ */
+
+DUK_INTERNAL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj) {
+ duk_uint32_t e_size; /* currently used -> new size */
+ duk_uint32_t a_size; /* currently required */
+ duk_uint32_t a_used; /* actually used */
+ duk_uint32_t h_size;
+ duk_bool_t abandon_array;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {
+ DUK_DD(DUK_DDPRINT("ignore attempt to compact a rom object"));
+ return;
+ }
+#endif
+
+ e_size = duk__count_used_e_keys(thr, obj);
+ duk__compute_a_stats(thr, obj, &a_used, &a_size);
+
+ DUK_DD(DUK_DDPRINT("compacting hobject, used e keys %ld, used a keys %ld, min a size %ld, "
+ "resized array density would be: %ld/%ld = %lf",
+ (long) e_size, (long) a_used, (long) a_size,
+ (long) a_used, (long) a_size,
+ (double) a_used / (double) a_size));
+
+ if (duk__abandon_array_density_check(a_used, a_size)) {
+ DUK_DD(DUK_DDPRINT("decided to abandon array during compaction, a_used=%ld, a_size=%ld",
+ (long) a_used, (long) a_size));
+ abandon_array = 1;
+ e_size += a_used;
+ a_size = 0;
+ } else {
+ DUK_DD(DUK_DDPRINT("decided to keep array during compaction"));
+ abandon_array = 0;
+ }
+
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ if (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) {
+ h_size = duk__get_default_h_size(e_size);
+ } else {
+ h_size = 0;
+ }
+#else
+ h_size = 0;
+#endif
+
+ DUK_DD(DUK_DDPRINT("compacting hobject -> new e_size %ld, new a_size=%ld, new h_size=%ld, abandon_array=%ld",
+ (long) e_size, (long) a_size, (long) h_size, (long) abandon_array));
+
+ duk_hobject_realloc_props(thr, obj, e_size, a_size, h_size, abandon_array);
+}
+
+/*
+ * Find an existing key from entry part either by linear scan or by
+ * using the hash index (if it exists).
+ *
+ * Sets entry index (and possibly the hash index) to output variables,
+ * which allows the caller to update the entry and hash entries in-place.
+ * If entry is not found, both values are set to -1. If entry is found
+ * but there is no hash part, h_idx is set to -1.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx) {
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(e_idx != NULL);
+ DUK_ASSERT(h_idx != NULL);
+ DUK_UNREF(heap);
+
+ if (DUK_LIKELY(DUK_HOBJECT_GET_HSIZE(obj) == 0))
+ {
+ /* Linear scan: more likely because most objects are small.
+ * This is an important fast path.
+ *
+ * XXX: this might be worth inlining for property lookups.
+ */
+ duk_uint_fast32_t i;
+ duk_uint_fast32_t n;
+ duk_hstring **h_keys_base;
+ DUK_DDD(DUK_DDDPRINT("duk_hobject_find_existing_entry() using linear scan for lookup"));
+
+ h_keys_base = DUK_HOBJECT_E_GET_KEY_BASE(heap, obj);
+ n = DUK_HOBJECT_GET_ENEXT(obj);
+ for (i = 0; i < n; i++) {
+ if (h_keys_base[i] == key) {
+ *e_idx = (duk_int_t) i;
+ *h_idx = -1;
+ return 1;
+ }
+ }
+ }
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ else
+ {
+ /* hash lookup */
+ duk_uint32_t n;
+ duk_uint32_t i, step;
+ duk_uint32_t *h_base;
+ duk_uint32_t mask;
+
+ DUK_DDD(DUK_DDDPRINT("duk_hobject_find_existing_entry() using hash part for lookup"));
+
+ h_base = DUK_HOBJECT_H_GET_BASE(heap, obj);
+ n = DUK_HOBJECT_GET_HSIZE(obj);
+ mask = n - 1;
+ i = DUK_HSTRING_GET_HASH(key) & mask;
+ step = 1; /* Cache friendly but clustering prone. */
+
+ for (;;) {
+ duk_uint32_t t;
+
+ DUK_ASSERT_DISABLE(i >= 0); /* unsigned */
+ DUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj));
+ t = h_base[i];
+ DUK_ASSERT(t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED ||
+ (t < DUK_HOBJECT_GET_ESIZE(obj))); /* t >= 0 always true, unsigned */
+
+ if (t == DUK__HASH_UNUSED) {
+ break;
+ } else if (t == DUK__HASH_DELETED) {
+ DUK_DDD(DUK_DDDPRINT("lookup miss (deleted) i=%ld, t=%ld",
+ (long) i, (long) t));
+ } else {
+ DUK_ASSERT(t < DUK_HOBJECT_GET_ESIZE(obj));
+ if (DUK_HOBJECT_E_GET_KEY(heap, obj, t) == key) {
+ DUK_DDD(DUK_DDDPRINT("lookup hit i=%ld, t=%ld -> key %p",
+ (long) i, (long) t, (void *) key));
+ *e_idx = (duk_int_t) t;
+ *h_idx = (duk_int_t) i;
+ return 1;
+ }
+ DUK_DDD(DUK_DDDPRINT("lookup miss i=%ld, t=%ld",
+ (long) i, (long) t));
+ }
+ i = (i + step) & mask;
+
+ /* Guaranteed to finish (hash is larger than #props). */
+ }
+ }
+#endif /* DUK_USE_HOBJECT_HASH_PART */
+
+ /* Not found, leave e_idx and h_idx unset. */
+ return 0;
+}
+
+/* For internal use: get non-accessor entry value */
+DUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key) {
+ duk_int_t e_idx;
+ duk_int_t h_idx;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_UNREF(heap);
+
+ if (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) {
+ DUK_ASSERT(e_idx >= 0);
+ if (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) {
+ return DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx);
+ }
+ }
+ return NULL;
+}
+
+/* For internal use: get non-accessor entry value and attributes */
+DUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs) {
+ duk_int_t e_idx;
+ duk_int_t h_idx;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(out_attrs != NULL);
+ DUK_UNREF(heap);
+
+ if (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) {
+ DUK_ASSERT(e_idx >= 0);
+ if (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) {
+ *out_attrs = DUK_HOBJECT_E_GET_FLAGS(heap, obj, e_idx);
+ return DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx);
+ }
+ }
+ /* If not found, out_attrs is left unset. */
+ return NULL;
+}
+
+/* For internal use: get array part value */
+DUK_INTERNAL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i) {
+ duk_tval *tv;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_UNREF(heap);
+
+ if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ return NULL;
+ }
+ if (i >= DUK_HOBJECT_GET_ASIZE(obj)) {
+ return NULL;
+ }
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, obj, i);
+ return tv;
+}
+
+/*
+ * Allocate and initialize a new entry, resizing the properties allocation
+ * if necessary. Returns entry index (e_idx) or throws an error if alloc fails.
+ *
+ * Sets the key of the entry (increasing the key's refcount), and updates
+ * the hash part if it exists. Caller must set value and flags, and update
+ * the entry value refcount. A decref for the previous value is not necessary.
+ */
+
+DUK_LOCAL duk_int_t duk__hobject_alloc_entry_checked(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) {
+ duk_uint32_t idx;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) <= DUK_HOBJECT_GET_ESIZE(obj));
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* key must not already exist in entry part */
+ {
+ duk_uint_fast32_t i;
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ DUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != key);
+ }
+ }
+#endif
+
+ if (DUK_HOBJECT_GET_ENEXT(obj) >= DUK_HOBJECT_GET_ESIZE(obj)) {
+ /* only need to guarantee 1 more slot, but allocation growth is in chunks */
+ DUK_DDD(DUK_DDDPRINT("entry part full, allocate space for one more entry"));
+ duk__grow_props_for_new_entry_item(thr, obj);
+ }
+ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) < DUK_HOBJECT_GET_ESIZE(obj));
+ idx = DUK_HOBJECT_POSTINC_ENEXT(obj);
+
+ /* previous value is assumed to be garbage, so don't touch it */
+ DUK_HOBJECT_E_SET_KEY(thr->heap, obj, idx, key);
+ DUK_HSTRING_INCREF(thr, key);
+
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ if (DUK_UNLIKELY(DUK_HOBJECT_GET_HSIZE(obj) > 0)) {
+ duk_uint32_t n, mask;
+ duk_uint32_t i, step;
+ duk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj);
+
+ n = DUK_HOBJECT_GET_HSIZE(obj);
+ mask = n - 1;
+ i = DUK_HSTRING_GET_HASH(key) & mask;
+ step = 1; /* Cache friendly but clustering prone. */
+
+ for (;;) {
+ duk_uint32_t t = h_base[i];
+ if (t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED) {
+ DUK_DDD(DUK_DDDPRINT("duk__hobject_alloc_entry_checked() inserted key into hash part, %ld -> %ld",
+ (long) i, (long) idx));
+ DUK_ASSERT_DISABLE(i >= 0); /* unsigned */
+ DUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj));
+ DUK_ASSERT_DISABLE(idx >= 0);
+ DUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj));
+ h_base[i] = idx;
+ break;
+ }
+ DUK_DDD(DUK_DDDPRINT("duk__hobject_alloc_entry_checked() miss %ld", (long) i));
+ i = (i + step) & mask;
+
+ /* Guaranteed to finish (hash is larger than #props). */
+ }
+ }
+#endif /* DUK_USE_HOBJECT_HASH_PART */
+
+ /* Note: we could return the hash index here too, but it's not
+ * needed right now.
+ */
+
+ DUK_ASSERT_DISABLE(idx >= 0);
+ DUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj));
+ DUK_ASSERT(idx < DUK_HOBJECT_GET_ENEXT(obj));
+ return (duk_int_t) idx;
+}
+
+/*
+ * Object internal value
+ *
+ * Returned value is guaranteed to be reachable / incref'd, caller does not need
+ * to incref OR decref. No proxies or accessors are invoked, no prototype walk.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv_out) {
+ duk_int_t e_idx;
+ duk_int_t h_idx;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(tv_out != NULL);
+
+ /* Always in entry part, no need to look up parents etc. */
+ if (duk_hobject_find_existing_entry(heap, obj, DUK_HEAP_STRING_INT_VALUE(heap), &e_idx, &h_idx)) {
+ DUK_ASSERT(e_idx >= 0);
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx));
+ DUK_TVAL_SET_TVAL(tv_out, DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx));
+ return 1;
+ }
+ DUK_TVAL_SET_UNDEFINED(tv_out);
+ return 0;
+}
+
+DUK_INTERNAL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj) {
+ duk_tval tv;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ /* This is not strictly necessary, but avoids compiler warnings; e.g.
+ * gcc won't reliably detect that no uninitialized data is read below.
+ */
+ DUK_MEMZERO((void *) &tv, sizeof(duk_tval));
+
+ if (duk_hobject_get_internal_value(heap, obj, &tv)) {
+ duk_hstring *h;
+ DUK_ASSERT(DUK_TVAL_IS_STRING(&tv));
+ h = DUK_TVAL_GET_STRING(&tv);
+ /* No explicit check for string vs. symbol, accept both. */
+ return h;
+ }
+
+ return NULL;
+}
+
+/*
+ * Arguments handling helpers (argument map mainly).
+ *
+ * An arguments object has exotic behavior for some numeric indices.
+ * Accesses may translate to identifier operations which may have
+ * arbitrary side effects (potentially invalidating any duk_tval
+ * pointers).
+ */
+
+/* Lookup 'key' from arguments internal 'map', perform a variable lookup
+ * if mapped, and leave the result on top of stack (and return non-zero).
+ * Used in E5 Section 10.6 algorithms [[Get]] and [[GetOwnProperty]].
+ */
+DUK_LOCAL
+duk_bool_t duk__lookup_arguments_map(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_hstring *key,
+ duk_propdesc *temp_desc,
+ duk_hobject **out_map,
+ duk_hobject **out_varenv) {
+ duk_hobject *map;
+ duk_hobject *varenv;
+ duk_bool_t rc;
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_DDD(DUK_DDDPRINT("arguments map lookup: thr=%p, obj=%p, key=%p, temp_desc=%p "
+ "(obj -> %!O, key -> %!O)",
+ (void *) thr, (void *) obj, (void *) key, (void *) temp_desc,
+ (duk_heaphdr *) obj, (duk_heaphdr *) key));
+
+ if (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ DUK_DDD(DUK_DDDPRINT("-> no 'map'"));
+ return 0;
+ }
+
+ map = duk_require_hobject(thr, -1);
+ DUK_ASSERT(map != NULL);
+ duk_pop_unsafe(thr); /* map is reachable through obj */
+
+ if (!duk_hobject_get_own_propdesc(thr, map, key, temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ DUK_DDD(DUK_DDDPRINT("-> 'map' exists, but key not in map"));
+ return 0;
+ }
+
+ /* [... varname] */
+ DUK_DDD(DUK_DDDPRINT("-> 'map' exists, and contains key, key is mapped to argument/variable binding %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ DUK_ASSERT(duk_is_string(thr, -1)); /* guaranteed when building arguments */
+
+ /* get varenv for varname (callee's declarative lexical environment) */
+ rc = duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_VARENV(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE);
+ DUK_UNREF(rc);
+ DUK_ASSERT(rc != 0); /* arguments MUST have an initialized lexical environment reference */
+ varenv = duk_require_hobject(thr, -1);
+ DUK_ASSERT(varenv != NULL);
+ duk_pop_unsafe(thr); /* varenv remains reachable through 'obj' */
+
+ DUK_DDD(DUK_DDDPRINT("arguments varenv is: %!dO", (duk_heaphdr *) varenv));
+
+ /* success: leave varname in stack */
+ *out_map = map;
+ *out_varenv = varenv;
+ return 1; /* [... varname] */
+}
+
+/* Lookup 'key' from arguments internal 'map', and leave replacement value
+ * on stack top if mapped (and return non-zero).
+ * Used in E5 Section 10.6 algorithm for [[GetOwnProperty]] (used by [[Get]]).
+ */
+DUK_LOCAL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) {
+ duk_hobject *map;
+ duk_hobject *varenv;
+ duk_hstring *varname;
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ if (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) {
+ DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic get behavior"));
+ return 0;
+ }
+
+ /* [... varname] */
+
+ varname = duk_require_hstring(thr, -1);
+ DUK_ASSERT(varname != NULL);
+ duk_pop_unsafe(thr); /* varname is still reachable */
+
+ DUK_DDD(DUK_DDDPRINT("arguments object automatic getvar for a bound variable; "
+ "key=%!O, varname=%!O",
+ (duk_heaphdr *) key,
+ (duk_heaphdr *) varname));
+
+ (void) duk_js_getvar_envrec(thr, varenv, varname, 1 /*throw*/);
+
+ /* [... value this_binding] */
+
+ duk_pop_unsafe(thr);
+
+ /* leave result on stack top */
+ return 1;
+}
+
+/* Lookup 'key' from arguments internal 'map', perform a variable write if mapped.
+ * Used in E5 Section 10.6 algorithm for [[DefineOwnProperty]] (used by [[Put]]).
+ * Assumes stack top contains 'put' value (which is NOT popped).
+ */
+DUK_LOCAL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag) {
+ duk_hobject *map;
+ duk_hobject *varenv;
+ duk_hstring *varname;
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ if (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) {
+ DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic put behavior"));
+ return;
+ }
+
+ /* [... put_value varname] */
+
+ varname = duk_require_hstring(thr, -1);
+ DUK_ASSERT(varname != NULL);
+ duk_pop_unsafe(thr); /* varname is still reachable */
+
+ DUK_DDD(DUK_DDDPRINT("arguments object automatic putvar for a bound variable; "
+ "key=%!O, varname=%!O, value=%!T",
+ (duk_heaphdr *) key,
+ (duk_heaphdr *) varname,
+ (duk_tval *) duk_require_tval(thr, -1)));
+
+ /* [... put_value] */
+
+ /*
+ * Note: although arguments object variable mappings are only established
+ * for non-strict functions (and a call to a non-strict function created
+ * the arguments object in question), an inner strict function may be doing
+ * the actual property write. Hence the throw_flag applied here comes from
+ * the property write call.
+ */
+
+ duk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, -1), throw_flag);
+
+ /* [... put_value] */
+}
+
+/* Lookup 'key' from arguments internal 'map', delete mapping if found.
+ * Used in E5 Section 10.6 algorithm for [[Delete]]. Note that the
+ * variable/argument itself (where the map points) is not deleted.
+ */
+DUK_LOCAL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) {
+ duk_hobject *map;
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ if (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic delete behavior"));
+ return;
+ }
+
+ map = duk_require_hobject(thr, -1);
+ DUK_ASSERT(map != NULL);
+ duk_pop_unsafe(thr); /* map is reachable through obj */
+
+ DUK_DDD(DUK_DDDPRINT("-> have 'map', delete key %!O from map (if exists)); ignore result",
+ (duk_heaphdr *) key));
+
+ /* Note: no recursion issue, we can trust 'map' to behave */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(map));
+ DUK_DDD(DUK_DDDPRINT("map before deletion: %!O", (duk_heaphdr *) map));
+ (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */
+ DUK_DDD(DUK_DDDPRINT("map after deletion: %!O", (duk_heaphdr *) map));
+}
+
+/*
+ * Ecmascript compliant [[GetOwnProperty]](P), for internal use only.
+ *
+ * If property is found:
+ * - Fills descriptor fields to 'out_desc'
+ * - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the
+ * property onto the stack ('undefined' for accessor properties).
+ * - Returns non-zero
+ *
+ * If property is not found:
+ * - 'out_desc' is left in untouched state (possibly garbage)
+ * - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE
+ * set)
+ * - Returns zero
+ *
+ * Notes:
+ *
+ * - Getting a property descriptor may cause an allocation (and hence
+ * GC) to take place, hence reachability and refcount of all related
+ * values matter. Reallocation of value stack, properties, etc may
+ * invalidate many duk_tval pointers (concretely, those which reside
+ * in memory areas subject to reallocation). However, heap object
+ * pointers are never affected (heap objects have stable pointers).
+ *
+ * - The value of a plain property is always reachable and has a non-zero
+ * reference count.
+ *
+ * - The value of a virtual property is not necessarily reachable from
+ * elsewhere and may have a refcount of zero. Hence we push it onto
+ * the valstack for the caller, which ensures it remains reachable
+ * while it is needed.
+ *
+ * - There are no virtual accessor properties. Hence, all getters and
+ * setters are always related to concretely stored properties, which
+ * ensures that the get/set functions in the resulting descriptor are
+ * reachable and have non-zero refcounts. Should there be virtual
+ * accessor properties later, this would need to change.
+ */
+
+DUK_LOCAL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags) {
+ duk_tval *tv;
+
+ DUK_DDD(DUK_DDDPRINT("duk_hobject_get_own_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, "
+ "arr_idx=%ld (obj -> %!O, key -> %!O)",
+ (void *) thr, (void *) obj, (void *) key, (void *) out_desc,
+ (long) flags, (long) arr_idx,
+ (duk_heaphdr *) obj, (duk_heaphdr *) key));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(out_desc != NULL);
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_STATS_INC(thr->heap, stats_getownpropdesc_count);
+
+ /* Each code path returning 1 (= found) must fill in all the output
+ * descriptor fields. We don't do it beforehand because it'd be
+ * unnecessary work if the property isn't found and would happen
+ * multiple times for an inheritance chain.
+ */
+ DUK_ASSERT_SET_GARBAGE(out_desc, sizeof(*out_desc));
+#if 0
+ out_desc->flags = 0;
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = -1;
+#endif
+
+ /*
+ * Try entries part first because it's the common case.
+ *
+ * Array part lookups are usually handled by the array fast path, and
+ * are not usually inherited. Array and entry parts never contain the
+ * same keys so the entry part vs. array part order doesn't matter.
+ */
+
+ if (duk_hobject_find_existing_entry(thr->heap, obj, key, &out_desc->e_idx, &out_desc->h_idx)) {
+ duk_int_t e_idx = out_desc->e_idx;
+ DUK_ASSERT(out_desc->e_idx >= 0);
+ out_desc->a_idx = -1;
+ out_desc->flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, e_idx);
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ if (DUK_UNLIKELY(out_desc->flags & DUK_PROPDESC_FLAG_ACCESSOR)) {
+ DUK_DDD(DUK_DDDPRINT("-> found accessor property in entry part"));
+ out_desc->get = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, e_idx);
+ out_desc->set = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, e_idx);
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ /* a dummy undefined value is pushed to make valstack
+ * behavior uniform for caller
+ */
+ duk_push_undefined(thr);
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("-> found plain property in entry part"));
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx);
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ duk_push_tval(thr, tv);
+ }
+ }
+ goto prop_found;
+ }
+
+ /*
+ * Try array part.
+ */
+
+ if (DUK_HOBJECT_HAS_ARRAY_PART(obj) && arr_idx != DUK__NO_ARRAY_INDEX) {
+ if (arr_idx < DUK_HOBJECT_GET_ASIZE(obj)) {
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx);
+ if (!DUK_TVAL_IS_UNUSED(tv)) {
+ DUK_DDD(DUK_DDDPRINT("-> found in array part"));
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ duk_push_tval(thr, tv);
+ }
+ /* implicit attributes */
+ out_desc->flags = DUK_PROPDESC_FLAG_WRITABLE |
+ DUK_PROPDESC_FLAG_CONFIGURABLE |
+ DUK_PROPDESC_FLAG_ENUMERABLE;
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = (duk_int_t) arr_idx; /* XXX: limit 2G due to being signed */
+ goto prop_found;
+ }
+ }
+ }
+
+ DUK_DDD(DUK_DDDPRINT("-> not found as a concrete property"));
+
+ /*
+ * Not found as a concrete property, check for virtual properties.
+ */
+
+ if (!DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(obj)) {
+ /* Quick skip. */
+ goto prop_not_found;
+ }
+
+ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ duk_harray *a;
+
+ DUK_DDD(DUK_DDDPRINT("array object exotic property get for key: %!O, arr_idx: %ld",
+ (duk_heaphdr *) key, (long) arr_idx));
+
+ a = (duk_harray *) obj;
+ DUK_ASSERT_HARRAY_VALID(a);
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior"));
+
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ duk_push_uint(thr, (duk_uint_t) a->length);
+ }
+ out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL;
+ if (DUK_HARRAY_LENGTH_WRITABLE(a)) {
+ out_desc->flags |= DUK_PROPDESC_FLAG_WRITABLE;
+ }
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = -1;
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));
+ goto prop_found_noexotic; /* cannot be arguments exotic */
+ }
+ } else if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj)) {
+ DUK_DDD(DUK_DDDPRINT("string object exotic property get for key: %!O, arr_idx: %ld",
+ (duk_heaphdr *) key, (long) arr_idx));
+
+ /* XXX: charlen; avoid multiple lookups? */
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX) {
+ duk_hstring *h_val;
+
+ DUK_DDD(DUK_DDDPRINT("array index exists"));
+
+ h_val = duk_hobject_get_internal_value_string(thr->heap, obj);
+ DUK_ASSERT(h_val);
+ if (arr_idx < DUK_HSTRING_GET_CHARLEN(h_val)) {
+ DUK_DDD(DUK_DDDPRINT("-> found, array index inside string"));
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ duk_push_hstring(thr, h_val);
+ duk_substring(thr, -1, arr_idx, arr_idx + 1); /* [str] -> [substr] */
+ }
+ out_desc->flags = DUK_PROPDESC_FLAG_ENUMERABLE | /* E5 Section 15.5.5.2 */
+ DUK_PROPDESC_FLAG_VIRTUAL;
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = -1;
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));
+ goto prop_found_noexotic; /* cannot be arguments exotic */
+ } else {
+ /* index is above internal string length -> property is fully normal */
+ DUK_DDD(DUK_DDDPRINT("array index outside string -> normal property"));
+ }
+ } else if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ duk_hstring *h_val;
+
+ DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior"));
+
+ h_val = duk_hobject_get_internal_value_string(thr->heap, obj);
+ DUK_ASSERT(h_val != NULL);
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ duk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_val));
+ }
+ out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; /* E5 Section 15.5.5.1 */
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = -1;
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));
+ goto prop_found_noexotic; /* cannot be arguments exotic */
+ }
+ }
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ else if (DUK_HOBJECT_IS_BUFOBJ(obj)) {
+ duk_hbufobj *h_bufobj;
+ duk_uint_t byte_off;
+ duk_small_uint_t elem_size;
+
+ h_bufobj = (duk_hbufobj *) obj;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+ DUK_DDD(DUK_DDDPRINT("bufobj property get for key: %!O, arr_idx: %ld",
+ (duk_heaphdr *) key, (long) arr_idx));
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {
+ DUK_DDD(DUK_DDDPRINT("array index exists"));
+
+ /* Careful with wrapping: arr_idx upshift may easily wrap, whereas
+ * length downshift won't.
+ */
+ if (arr_idx < (h_bufobj->length >> h_bufobj->shift)) {
+ byte_off = arr_idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */
+ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift);
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ duk_uint8_t *data;
+
+ if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {
+ data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;
+ duk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size);
+ } else {
+ DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (read zero)"));
+ duk_push_uint(thr, 0);
+ }
+ }
+ out_desc->flags = DUK_PROPDESC_FLAG_WRITABLE |
+ DUK_PROPDESC_FLAG_VIRTUAL;
+ if (DUK_HOBJECT_GET_CLASS_NUMBER(obj) != DUK_HOBJECT_CLASS_ARRAYBUFFER) {
+ /* ArrayBuffer indices are non-standard and are
+ * non-enumerable to avoid their serialization.
+ */
+ out_desc->flags |= DUK_PROPDESC_FLAG_ENUMERABLE;
+ }
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = -1;
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));
+ goto prop_found_noexotic; /* cannot be e.g. arguments exotic, since exotic 'traits' are mutually exclusive */
+ } else {
+ /* index is above internal buffer length -> property is fully normal */
+ DUK_DDD(DUK_DDDPRINT("array index outside buffer -> normal property"));
+ }
+ } else if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {
+ DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior"));
+
+ if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {
+ /* Length in elements: take into account shift, but
+ * intentionally don't check the underlying buffer here.
+ */
+ duk_push_uint(thr, h_bufobj->length >> h_bufobj->shift);
+ }
+ out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL;
+ out_desc->get = NULL;
+ out_desc->set = NULL;
+ out_desc->e_idx = -1;
+ out_desc->h_idx = -1;
+ out_desc->a_idx = -1;
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));
+ goto prop_found_noexotic; /* cannot be arguments exotic */
+ }
+ }
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+ /* Array properties have exotic behavior but they are concrete,
+ * so no special handling here.
+ *
+ * Arguments exotic behavior (E5 Section 10.6, [[GetOwnProperty]]
+ * is only relevant as a post-check implemented below; hence no
+ * check here.
+ */
+
+ /*
+ * Not found as concrete or virtual.
+ */
+
+ prop_not_found:
+ DUK_DDD(DUK_DDDPRINT("-> not found (virtual, entry part, or array part)"));
+ DUK_STATS_INC(thr->heap, stats_getownpropdesc_miss);
+ return 0;
+
+ /*
+ * Found.
+ *
+ * Arguments object has exotic post-processing, see E5 Section 10.6,
+ * description of [[GetOwnProperty]] variant for arguments.
+ */
+
+ prop_found:
+ DUK_DDD(DUK_DDDPRINT("-> property found, checking for arguments exotic post-behavior"));
+
+ /* Notes:
+ * - Only numbered indices are relevant, so arr_idx fast reject is good
+ * (this is valid unless there are more than 4**32-1 arguments).
+ * - Since variable lookup has no side effects, this can be skipped if
+ * DUK_GETDESC_FLAG_PUSH_VALUE is not set.
+ */
+
+ if (DUK_UNLIKELY(DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) &&
+ arr_idx != DUK__NO_ARRAY_INDEX &&
+ (flags & DUK_GETDESC_FLAG_PUSH_VALUE))) {
+ duk_propdesc temp_desc;
+
+ /* Magically bound variable cannot be an accessor. However,
+ * there may be an accessor property (or a plain property) in
+ * place with magic behavior removed. This happens e.g. when
+ * a magic property is redefined with defineProperty().
+ * Cannot assert for "not accessor" here.
+ */
+
+ /* replaces top of stack with new value if necessary */
+ DUK_ASSERT((flags & DUK_GETDESC_FLAG_PUSH_VALUE) != 0);
+
+ /* This can perform a variable lookup but only into a declarative
+ * environment which has no side effects.
+ */
+ if (duk__check_arguments_map_for_get(thr, obj, key, &temp_desc)) {
+ DUK_DDD(DUK_DDDPRINT("-> arguments exotic behavior overrides result: %!T -> %!T",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+ /* [... old_result result] -> [... result] */
+ duk_remove_m2(thr);
+ }
+ }
+
+ prop_found_noexotic:
+ DUK_STATS_INC(thr->heap, stats_getownpropdesc_hit);
+ return 1;
+}
+
+DUK_INTERNAL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(out_desc != NULL);
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ return duk__get_own_propdesc_raw(thr, obj, key, DUK_HSTRING_GET_ARRIDX_SLOW(key), out_desc, flags);
+}
+
+/*
+ * Ecmascript compliant [[GetProperty]](P), for internal use only.
+ *
+ * If property is found:
+ * - Fills descriptor fields to 'out_desc'
+ * - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the
+ * property onto the stack ('undefined' for accessor properties).
+ * - Returns non-zero
+ *
+ * If property is not found:
+ * - 'out_desc' is left in untouched state (possibly garbage)
+ * - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE
+ * set)
+ * - Returns zero
+ *
+ * May cause arbitrary side effects and invalidate (most) duk_tval
+ * pointers.
+ */
+
+DUK_LOCAL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) {
+ duk_hobject *curr;
+ duk_uint32_t arr_idx;
+ duk_uint_t sanity;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(out_desc != NULL);
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_STATS_INC(thr->heap, stats_getpropdesc_count);
+
+ arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key);
+
+ DUK_DDD(DUK_DDDPRINT("duk__get_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, "
+ "arr_idx=%ld (obj -> %!O, key -> %!O)",
+ (void *) thr, (void *) obj, (void *) key, (void *) out_desc,
+ (long) flags, (long) arr_idx,
+ (duk_heaphdr *) obj, (duk_heaphdr *) key));
+
+ curr = obj;
+ DUK_ASSERT(curr != NULL);
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ if (duk__get_own_propdesc_raw(thr, curr, key, arr_idx, out_desc, flags)) {
+ /* stack contains value (if requested), 'out_desc' is set */
+ DUK_STATS_INC(thr->heap, stats_getpropdesc_hit);
+ return 1;
+ }
+
+ /* not found in 'curr', next in prototype chain; impose max depth */
+ if (DUK_UNLIKELY(sanity-- == 0)) {
+ if (flags & DUK_GETDESC_FLAG_IGNORE_PROTOLOOP) {
+ /* treat like property not found */
+ break;
+ } else {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+ }
+ curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);
+ } while (curr != NULL);
+
+ /* out_desc is left untouched (possibly garbage), caller must use return
+ * value to determine whether out_desc can be looked up
+ */
+
+ DUK_STATS_INC(thr->heap, stats_getpropdesc_miss);
+ return 0;
+}
+
+/*
+ * Shallow fast path checks for accessing array elements with numeric
+ * indices. The goal is to try to avoid coercing an array index to an
+ * (interned) string for the most common lookups, in particular, for
+ * standard Array objects.
+ *
+ * Interning is avoided but only for a very narrow set of cases:
+ * - Object has array part, index is within array allocation, and
+ * value is not unused (= key exists)
+ * - Object has no interfering exotic behavior (e.g. arguments or
+ * string object exotic behaviors interfere, array exotic
+ * behavior does not).
+ *
+ * Current shortcoming: if key does not exist (even if it is within
+ * the array allocation range) a slow path lookup with interning is
+ * always required. This can probably be fixed so that there is a
+ * quick fast path for non-existent elements as well, at least for
+ * standard Array objects.
+ */
+
+#if defined(DUK_USE_ARRAY_PROP_FASTPATH)
+DUK_LOCAL duk_tval *duk__getprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) {
+ duk_tval *tv;
+ duk_uint32_t idx;
+
+ DUK_UNREF(thr);
+
+ if (!(DUK_HOBJECT_HAS_ARRAY_PART(obj) &&
+ !DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) &&
+ !DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj) &&
+ !DUK_HOBJECT_IS_BUFOBJ(obj) &&
+ !DUK_HOBJECT_IS_PROXY(obj))) {
+ /* Must have array part and no conflicting exotic behaviors.
+ * Doesn't need to have array special behavior, e.g. Arguments
+ * object has array part.
+ */
+ return NULL;
+ }
+
+ /* Arrays never have other exotic behaviors. */
+
+ DUK_DDD(DUK_DDDPRINT("fast path attempt (no exotic string/arguments/buffer "
+ "behavior, object has array part)"));
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ idx = duk__tval_fastint_to_arr_idx(tv_key);
+ } else
+#endif
+ if (DUK_TVAL_IS_DOUBLE(tv_key)) {
+ idx = duk__tval_number_to_arr_idx(tv_key);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("key is not a number"));
+ return NULL;
+ }
+
+ /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which
+ * is 0xffffffffUL. We don't need to check for that explicitly
+ * because 0xffffffffUL will never be inside object 'a_size'.
+ */
+
+ if (idx >= DUK_HOBJECT_GET_ASIZE(obj)) {
+ DUK_DDD(DUK_DDDPRINT("key is not an array index or outside array part"));
+ return NULL;
+ }
+ DUK_ASSERT(idx != 0xffffffffUL);
+ DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);
+
+ /* XXX: for array instances we could take a shortcut here and assume
+ * Array.prototype doesn't contain an array index property.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("key is a valid array index and inside array part"));
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx);
+ if (!DUK_TVAL_IS_UNUSED(tv)) {
+ DUK_DDD(DUK_DDDPRINT("-> fast path successful"));
+ return tv;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("fast path attempt failed, fall back to slow path"));
+ return NULL;
+}
+
+DUK_LOCAL duk_bool_t duk__putprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) {
+ duk_tval *tv;
+ duk_harray *a;
+ duk_uint32_t idx;
+ duk_uint32_t old_len, new_len;
+
+ if (!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj) &&
+ DUK_HOBJECT_HAS_ARRAY_PART(obj) &&
+ DUK_HOBJECT_HAS_EXTENSIBLE(obj))) {
+ return 0;
+ }
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* caller ensures */
+
+ a = (duk_harray *) obj;
+ DUK_ASSERT_HARRAY_VALID(a);
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ idx = duk__tval_fastint_to_arr_idx(tv_key);
+ } else
+#endif
+ if (DUK_TVAL_IS_DOUBLE(tv_key)) {
+ idx = duk__tval_number_to_arr_idx(tv_key);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("key is not a number"));
+ return 0;
+ }
+
+ /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which
+ * is 0xffffffffUL. We don't need to check for that explicitly
+ * because 0xffffffffUL will never be inside object 'a_size'.
+ */
+
+ if (idx >= DUK_HOBJECT_GET_ASIZE(obj)) { /* for resizing of array part, use slow path */
+ return 0;
+ }
+ DUK_ASSERT(idx != 0xffffffffUL);
+ DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);
+
+ old_len = a->length;
+
+ if (idx >= old_len) {
+ DUK_DDD(DUK_DDDPRINT("write new array entry requires length update "
+ "(arr_idx=%ld, old_len=%ld)",
+ (long) idx, (long) old_len));
+ if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) {
+ /* The correct behavior here is either a silent error
+ * or a TypeError, depending on strictness. Fall back
+ * to the slow path to handle the situation.
+ */
+ return 0;
+ }
+ new_len = idx + 1;
+
+ ((duk_harray *) obj)->length = new_len;
+ }
+
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects */
+
+ DUK_DDD(DUK_DDDPRINT("array fast path success for index %ld", (long) idx));
+ return 1;
+}
+#endif /* DUK_USE_ARRAY_PROP_FASTPATH */
+
+/*
+ * Fast path for bufobj getprop/putprop
+ */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_LOCAL duk_bool_t duk__getprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) {
+ duk_uint32_t idx;
+ duk_hbufobj *h_bufobj;
+ duk_uint_t byte_off;
+ duk_small_uint_t elem_size;
+ duk_uint8_t *data;
+
+ if (!DUK_HOBJECT_IS_BUFOBJ(obj)) {
+ return 0;
+ }
+ h_bufobj = (duk_hbufobj *) obj;
+ if (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {
+ return 0;
+ }
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ idx = duk__tval_fastint_to_arr_idx(tv_key);
+ } else
+#endif
+ if (DUK_TVAL_IS_DOUBLE(tv_key)) {
+ idx = duk__tval_number_to_arr_idx(tv_key);
+ } else {
+ return 0;
+ }
+
+ /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which
+ * is 0xffffffffUL. We don't need to check for that explicitly
+ * because 0xffffffffUL will never be inside bufobj length.
+ */
+
+ /* Careful with wrapping (left shifting idx would be unsafe). */
+ if (idx >= (h_bufobj->length >> h_bufobj->shift)) {
+ return 0;
+ }
+ DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);
+
+ byte_off = idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */
+ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift);
+
+ if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {
+ data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;
+ duk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size);
+ } else {
+ DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (read zero)"));
+ duk_push_uint(thr, 0);
+ }
+
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+DUK_LOCAL duk_bool_t duk__putprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) {
+ duk_uint32_t idx;
+ duk_hbufobj *h_bufobj;
+ duk_uint_t byte_off;
+ duk_small_uint_t elem_size;
+ duk_uint8_t *data;
+
+ if (!(DUK_HOBJECT_IS_BUFOBJ(obj) &&
+ DUK_TVAL_IS_NUMBER(tv_val))) {
+ return 0;
+ }
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* caller ensures; rom objects are never bufobjs now */
+
+ h_bufobj = (duk_hbufobj *) obj;
+ if (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {
+ return 0;
+ }
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ idx = duk__tval_fastint_to_arr_idx(tv_key);
+ } else
+#endif
+ if (DUK_TVAL_IS_DOUBLE(tv_key)) {
+ idx = duk__tval_number_to_arr_idx(tv_key);
+ } else {
+ return 0;
+ }
+
+ /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which
+ * is 0xffffffffUL. We don't need to check for that explicitly
+ * because 0xffffffffUL will never be inside bufobj length.
+ */
+
+ /* Careful with wrapping (left shifting idx would be unsafe). */
+ if (idx >= (h_bufobj->length >> h_bufobj->shift)) {
+ return 0;
+ }
+ DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);
+
+ byte_off = idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */
+ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift);
+
+ /* Value is required to be a number in the fast path so there
+ * are no side effects in write coercion.
+ */
+ duk_push_tval(thr, tv_val);
+ DUK_ASSERT(duk_is_number(thr, -1));
+
+ if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {
+ data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;
+ duk_hbufobj_validated_write(thr, h_bufobj, data, elem_size);
+ } else {
+ DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (write skipped)"));
+ }
+
+ duk_pop_unsafe(thr);
+ return 1;
+}
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+/*
+ * GETPROP: Ecmascript property read.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) {
+ duk_tval tv_obj_copy;
+ duk_tval tv_key_copy;
+ duk_hobject *curr = NULL;
+ duk_hstring *key = NULL;
+ duk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX;
+ duk_propdesc desc;
+ duk_uint_t sanity;
+
+ DUK_DDD(DUK_DDDPRINT("getprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)",
+ (void *) thr, (void *) tv_obj, (void *) tv_key,
+ (duk_tval *) tv_obj, (duk_tval *) tv_key));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(tv_obj != NULL);
+ DUK_ASSERT(tv_key != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_STATS_INC(thr->heap, stats_getprop_all);
+
+ /*
+ * Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of
+ * them being invalidated by a valstack resize.
+ *
+ * XXX: this is now an overkill for many fast paths. Rework this
+ * to be faster (although switching to a valstack discipline might
+ * be a better solution overall).
+ */
+
+ DUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj);
+ DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key);
+ tv_obj = &tv_obj_copy;
+ tv_key = &tv_key_copy;
+
+ /*
+ * Coercion and fast path processing
+ */
+
+ switch (DUK_TVAL_GET_TAG(tv_obj)) {
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL: {
+ /* Note: unconditional throw */
+ DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject"));
+#if defined(DUK_USE_PARANOID_ERRORS)
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);
+#else
+ DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot read property %s of %s",
+ duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));
+#endif
+ return 0;
+ }
+
+ case DUK_TAG_BOOLEAN: {
+ DUK_DDD(DUK_DDDPRINT("base object is a boolean, start lookup from boolean prototype"));
+ curr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE];
+ break;
+ }
+
+ case DUK_TAG_STRING: {
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj);
+ duk_int_t pop_count;
+
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ /* Symbols (ES2015 or hidden) don't have virtual properties. */
+ DUK_DDD(DUK_DDDPRINT("base object is a symbol, start lookup from symbol prototype"));
+ curr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE];
+ break;
+ }
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
+ DUK_DDD(DUK_DDDPRINT("base object string, key is a fast-path fastint; arr_idx %ld", (long) arr_idx));
+ pop_count = 0;
+ } else
+#endif
+ if (DUK_TVAL_IS_NUMBER(tv_key)) {
+ arr_idx = duk__tval_number_to_arr_idx(tv_key);
+ DUK_DDD(DUK_DDDPRINT("base object string, key is a fast-path number; arr_idx %ld", (long) arr_idx));
+ pop_count = 0;
+ } else {
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_DDD(DUK_DDDPRINT("base object string, key is a non-fast-path number; after "
+ "coercion key is %!T, arr_idx %ld",
+ (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));
+ pop_count = 1;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ arr_idx < DUK_HSTRING_GET_CHARLEN(h)) {
+ duk_pop_n_unsafe(thr, pop_count);
+ duk_push_hstring(thr, h);
+ duk_substring(thr, -1, arr_idx, arr_idx + 1); /* [str] -> [substr] */
+
+ DUK_STATS_INC(thr->heap, stats_getprop_stringidx);
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is string, key is an index inside string length "
+ "after coercion -> return char)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ return 1;
+ }
+
+ if (pop_count == 0) {
+ /* This is a pretty awkward control flow, but we need to recheck the
+ * key coercion here.
+ */
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_DDD(DUK_DDDPRINT("base object string, key is a non-fast-path number; after "
+ "coercion key is %!T, arr_idx %ld",
+ (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));
+ }
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ duk_pop_unsafe(thr); /* [key] -> [] */
+ duk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); /* [] -> [res] */
+
+ DUK_STATS_INC(thr->heap, stats_getprop_stringlen);
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is string, key is 'length' after coercion -> "
+ "return string length)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ return 1;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("base object is a string, start lookup from string prototype"));
+ curr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE];
+ goto lookup; /* avoid double coercion */
+ }
+
+ case DUK_TAG_OBJECT: {
+#if defined(DUK_USE_ARRAY_PROP_FASTPATH)
+ duk_tval *tmp;
+#endif
+
+ curr = DUK_TVAL_GET_OBJECT(tv_obj);
+ DUK_ASSERT(curr != NULL);
+
+ /* XXX: array .length fast path (important in e.g. loops)? */
+
+#if defined(DUK_USE_ARRAY_PROP_FASTPATH)
+ tmp = duk__getprop_shallow_fastpath_array_tval(thr, curr, tv_key);
+ if (tmp) {
+ duk_push_tval(thr, tmp);
+
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is object, key is a number, array part "
+ "fast path)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ DUK_STATS_INC(thr->heap, stats_getprop_arrayidx);
+ return 1;
+ }
+#endif
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ if (duk__getprop_fastpath_bufobj_tval(thr, curr, tv_key) != 0) {
+ /* Read value pushed on stack. */
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is bufobj, key is a number, bufobj "
+ "fast path)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ DUK_STATS_INC(thr->heap, stats_getprop_bufobjidx);
+ return 1;
+ }
+#endif
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(curr))) {
+ duk_hobject *h_target;
+
+ if (duk__proxy_check_prop(thr, curr, DUK_STRIDX_GET, tv_key, &h_target)) {
+ /* -> [ ... trap handler ] */
+ DUK_DDD(DUK_DDDPRINT("-> proxy object 'get' for key %!T", (duk_tval *) tv_key));
+ DUK_STATS_INC(thr->heap, stats_getprop_proxy);
+ duk_push_hobject(thr, h_target); /* target */
+ duk_push_tval(thr, tv_key); /* P */
+ duk_push_tval(thr, tv_obj); /* Receiver: Proxy object */
+ duk_call_method(thr, 3 /*nargs*/);
+
+ /* Target object must be checked for a conflicting
+ * non-configurable property.
+ */
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+
+ if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ duk_tval *tv_hook = duk_require_tval(thr, -3); /* value from hook */
+ duk_tval *tv_targ = duk_require_tval(thr, -1); /* value from target */
+ duk_bool_t datadesc_reject;
+ duk_bool_t accdesc_reject;
+
+ DUK_DDD(DUK_DDDPRINT("proxy 'get': target has matching property %!O, check for "
+ "conflicting property; tv_hook=%!T, tv_targ=%!T, desc.flags=0x%08lx, "
+ "desc.get=%p, desc.set=%p",
+ (duk_heaphdr *) key, (duk_tval *) tv_hook, (duk_tval *) tv_targ,
+ (unsigned long) desc.flags,
+ (void *) desc.get, (void *) desc.set));
+
+ datadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&
+ !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&
+ !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) &&
+ !duk_js_samevalue(tv_hook, tv_targ);
+ accdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&
+ !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&
+ (desc.get == NULL) &&
+ !DUK_TVAL_IS_UNDEFINED(tv_hook);
+ if (datadesc_reject || accdesc_reject) {
+ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);
+ }
+
+ duk_pop_2_unsafe(thr);
+ } else {
+ duk_pop_unsafe(thr);
+ }
+ return 1; /* return value */
+ }
+
+ curr = h_target; /* resume lookup from target */
+ DUK_TVAL_SET_OBJECT(tv_obj, curr);
+ }
+#endif /* DUK_USE_ES6_PROXY */
+
+ if (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(curr)) {
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+
+ DUK_STATS_INC(thr->heap, stats_getprop_arguments);
+ if (duk__check_arguments_map_for_get(thr, curr, key, &desc)) {
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is object with arguments exotic behavior, "
+ "key matches magically bound property -> skip standard "
+ "Get with replacement value)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* no need for 'caller' post-check, because 'key' must be an array index */
+
+ duk_remove_m2(thr); /* [key result] -> [result] */
+ return 1;
+ }
+
+ goto lookup; /* avoid double coercion */
+ }
+ break;
+ }
+
+ /* Buffer has virtual properties similar to string, but indexed values
+ * are numbers, not 1-byte buffers/strings which would perform badly.
+ */
+ case DUK_TAG_BUFFER: {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj);
+ duk_int_t pop_count;
+
+ /*
+ * Because buffer values are often looped over, a number fast path
+ * is important.
+ */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path fastint; arr_idx %ld", (long) arr_idx));
+ pop_count = 0;
+ }
+ else
+#endif
+ if (DUK_TVAL_IS_NUMBER(tv_key)) {
+ arr_idx = duk__tval_number_to_arr_idx(tv_key);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path number; arr_idx %ld", (long) arr_idx));
+ pop_count = 0;
+ } else {
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after "
+ "coercion key is %!T, arr_idx %ld",
+ (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));
+ pop_count = 1;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ arr_idx < DUK_HBUFFER_GET_SIZE(h)) {
+ duk_pop_n_unsafe(thr, pop_count);
+ duk_push_uint(thr, ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h))[arr_idx]);
+ DUK_STATS_INC(thr->heap, stats_getprop_bufferidx);
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is buffer, key is an index inside buffer length "
+ "after coercion -> return byte as number)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ return 1;
+ }
+
+ if (pop_count == 0) {
+ /* This is a pretty awkward control flow, but we need to recheck the
+ * key coercion here.
+ */
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after "
+ "coercion key is %!T, arr_idx %ld",
+ (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));
+ }
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ duk_pop_unsafe(thr); /* [key] -> [] */
+ duk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h)); /* [] -> [res] */
+ DUK_STATS_INC(thr->heap, stats_getprop_bufferlen);
+
+ DUK_DDD(DUK_DDDPRINT("-> %!T (base is buffer, key is 'length' "
+ "after coercion -> return buffer length)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ return 1;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("base object is a buffer, start lookup from Uint8Array prototype"));
+ curr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];
+ goto lookup; /* avoid double coercion */
+ }
+
+ case DUK_TAG_POINTER: {
+ DUK_DDD(DUK_DDDPRINT("base object is a pointer, start lookup from pointer prototype"));
+ curr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE];
+ break;
+ }
+
+ case DUK_TAG_LIGHTFUNC: {
+ /* Lightfuncs inherit getter .name and .length from %NativeFunctionPrototype%. */
+ DUK_DDD(DUK_DDDPRINT("base object is a lightfunc, start lookup from function prototype"));
+ curr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE];
+ break;
+ }
+
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ /* number */
+ DUK_DDD(DUK_DDDPRINT("base object is a number, start lookup from number prototype"));
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_obj));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj));
+ curr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE];
+ break;
+ }
+ }
+
+ /* key coercion (unless already coerced above) */
+ DUK_ASSERT(key == NULL);
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ /*
+ * Property lookup
+ */
+
+ lookup:
+ /* [key] (coerced) */
+ DUK_ASSERT(curr != NULL);
+ DUK_ASSERT(key != NULL);
+
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ if (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ goto next_in_chain;
+ }
+
+ if (desc.get != NULL) {
+ /* accessor with defined getter */
+ DUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0);
+
+ duk_pop_unsafe(thr); /* [key undefined] -> [key] */
+ duk_push_hobject(thr, desc.get);
+ duk_push_tval(thr, tv_obj); /* note: original, uncoerced base */
+#if defined(DUK_USE_NONSTD_GETTER_KEY_ARGUMENT)
+ duk_dup_m3(thr);
+ duk_call_method(thr, 1); /* [key getter this key] -> [key retval] */
+#else
+ duk_call_method(thr, 0); /* [key getter this] -> [key retval] */
+#endif
+ } else {
+ /* [key value] or [key undefined] */
+
+ /* data property or accessor without getter */
+ DUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) ||
+ (desc.get == NULL));
+
+ /* if accessor without getter, return value is undefined */
+ DUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) ||
+ duk_is_undefined(thr, -1));
+
+ /* Note: for an accessor without getter, falling through to
+ * check for "caller" exotic behavior is unnecessary as
+ * "undefined" will never activate the behavior. But it does
+ * no harm, so we'll do it anyway.
+ */
+ }
+
+ goto found; /* [key result] */
+
+ next_in_chain:
+ /* XXX: option to pretend property doesn't exist if sanity limit is
+ * hit might be useful.
+ */
+ if (DUK_UNLIKELY(sanity-- == 0)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+ curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);
+ } while (curr != NULL);
+
+ /*
+ * Not found
+ */
+
+ duk_to_undefined(thr, -1); /* [key] -> [undefined] (default value) */
+
+ DUK_DDD(DUK_DDDPRINT("-> %!T (not found)", (duk_tval *) duk_get_tval(thr, -1)));
+ return 0;
+
+ /*
+ * Found; post-processing (Function and arguments objects)
+ */
+
+ found:
+ /* [key result] */
+
+#if !defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ /* Special behavior for 'caller' property of (non-bound) function objects
+ * and non-strict Arguments objects: if 'caller' -value- (!) is a strict
+ * mode function, throw a TypeError (E5 Sections 15.3.5.4, 10.6).
+ * Quite interestingly, a non-strict function with no formal arguments
+ * will get an arguments object -without- special 'caller' behavior!
+ *
+ * The E5.1 spec is a bit ambiguous if this special behavior applies when
+ * a bound function is the base value (not the 'caller' value): Section
+ * 15.3.4.5 (describing bind()) states that [[Get]] for bound functions
+ * matches that of Section 15.3.5.4 ([[Get]] for Function instances).
+ * However, Section 13.3.5.4 has "NOTE: Function objects created using
+ * Function.prototype.bind use the default [[Get]] internal method."
+ * The current implementation assumes this means that bound functions
+ * should not have the special [[Get]] behavior.
+ *
+ * The E5.1 spec is also a bit unclear if the TypeError throwing is
+ * applied if the 'caller' value is a strict bound function. The
+ * current implementation will throw even for both strict non-bound
+ * and strict bound functions.
+ *
+ * See test-dev-strict-func-as-caller-prop-value.js for quite extensive
+ * tests.
+ *
+ * This exotic behavior is disabled when the non-standard 'caller' property
+ * is enabled, as it conflicts with the free use of 'caller'.
+ */
+ if (key == DUK_HTHREAD_STRING_CALLER(thr) &&
+ DUK_TVAL_IS_OBJECT(tv_obj)) {
+ duk_hobject *orig = DUK_TVAL_GET_OBJECT(tv_obj);
+ DUK_ASSERT(orig != NULL);
+
+ if (DUK_HOBJECT_IS_NONBOUND_FUNCTION(orig) ||
+ DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) {
+ duk_hobject *h;
+
+ /* XXX: The TypeError is currently not applied to bound
+ * functions because the 'strict' flag is not copied by
+ * bind(). This may or may not be correct, the specification
+ * only refers to the value being a "strict mode Function
+ * object" which is ambiguous.
+ */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(orig));
+
+ h = duk_get_hobject(thr, -1); /* NULL if not an object */
+ if (h &&
+ DUK_HOBJECT_IS_FUNCTION(h) &&
+ DUK_HOBJECT_HAS_STRICT(h)) {
+ /* XXX: sufficient to check 'strict', assert for 'is function' */
+ DUK_ERROR_TYPE(thr, DUK_STR_STRICT_CALLER_READ);
+ }
+ }
+ }
+#endif /* !DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */
+
+ duk_remove_m2(thr); /* [key result] -> [result] */
+
+ DUK_DDD(DUK_DDDPRINT("-> %!T (found)", (duk_tval *) duk_get_tval(thr, -1)));
+ return 1;
+}
+
+/*
+ * HASPROP: Ecmascript property existence check ("in" operator).
+ *
+ * Interestingly, the 'in' operator does not do any coercion of
+ * the target object.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) {
+ duk_tval tv_key_copy;
+ duk_hobject *obj;
+ duk_hstring *key;
+ duk_uint32_t arr_idx;
+ duk_bool_t rc;
+ duk_propdesc desc;
+
+ DUK_DDD(DUK_DDDPRINT("hasprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)",
+ (void *) thr, (void *) tv_obj, (void *) tv_key,
+ (duk_tval *) tv_obj, (duk_tval *) tv_key));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(tv_obj != NULL);
+ DUK_ASSERT(tv_key != NULL);
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key);
+ tv_key = &tv_key_copy;
+
+ /*
+ * The 'in' operator requires an object as its right hand side,
+ * throwing a TypeError unconditionally if this is not the case.
+ *
+ * However, lightfuncs need to behave like fully fledged objects
+ * here to be maximally transparent, so we need to handle them
+ * here. Same goes for plain buffers which behave like ArrayBuffers.
+ */
+
+ /* XXX: Refactor key coercion so that it's only called once. It can't
+ * be trivially lifted here because the object must be type checked
+ * first.
+ */
+
+ if (DUK_TVAL_IS_OBJECT(tv_obj)) {
+ obj = DUK_TVAL_GET_OBJECT(tv_obj);
+ DUK_ASSERT(obj != NULL);
+
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ } else if (DUK_TVAL_IS_BUFFER(tv_obj)) {
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ if (duk__key_is_plain_buf_ownprop(thr, DUK_TVAL_GET_BUFFER(tv_obj), key, arr_idx)) {
+ rc = 1;
+ goto pop_and_return;
+ }
+ obj = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) {
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+
+ /* If not found, resume existence check from %NativeFunctionPrototype%.
+ * We can just substitute the value in this case; nothing will
+ * need the original base value (as would be the case with e.g.
+ * setters/getters.
+ */
+ obj = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE];
+ } else {
+ /* Note: unconditional throw */
+ DUK_DDD(DUK_DDDPRINT("base object is not an object -> reject"));
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);
+ }
+
+ /* XXX: fast path for arrays? */
+
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_UNREF(arr_idx);
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) {
+ duk_hobject *h_target;
+ duk_bool_t tmp_bool;
+
+ /* XXX: the key in 'key in obj' is string coerced before we're called
+ * (which is the required behavior in E5/E5.1/E6) so the key is a string
+ * here already.
+ */
+
+ if (duk__proxy_check_prop(thr, obj, DUK_STRIDX_HAS, tv_key, &h_target)) {
+ /* [ ... key trap handler ] */
+ DUK_DDD(DUK_DDDPRINT("-> proxy object 'has' for key %!T", (duk_tval *) tv_key));
+ duk_push_hobject(thr, h_target); /* target */
+ duk_push_tval(thr, tv_key); /* P */
+ duk_call_method(thr, 2 /*nargs*/);
+ tmp_bool = duk_to_boolean(thr, -1);
+ if (!tmp_bool) {
+ /* Target object must be checked for a conflicting
+ * non-configurable property.
+ */
+
+ if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */
+ DUK_DDD(DUK_DDDPRINT("proxy 'has': target has matching property %!O, check for "
+ "conflicting property; desc.flags=0x%08lx, "
+ "desc.get=%p, desc.set=%p",
+ (duk_heaphdr *) key, (unsigned long) desc.flags,
+ (void *) desc.get, (void *) desc.set));
+ /* XXX: Extensibility check for target uses IsExtensible(). If we
+ * implemented the isExtensible trap and didn't reject proxies as
+ * proxy targets, it should be respected here.
+ */
+ if (!((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && /* property is configurable and */
+ DUK_HOBJECT_HAS_EXTENSIBLE(h_target))) { /* ... target is extensible */
+ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);
+ }
+ }
+ }
+
+ duk_pop_2_unsafe(thr); /* [ key trap_result ] -> [] */
+ return tmp_bool;
+ }
+
+ obj = h_target; /* resume check from proxy target */
+ }
+#endif /* DUK_USE_ES6_PROXY */
+
+ /* XXX: inline into a prototype walking loop? */
+
+ rc = duk__get_propdesc(thr, obj, key, &desc, 0 /*flags*/); /* don't push value */
+ /* fall through */
+
+ pop_and_return:
+ duk_pop_unsafe(thr); /* [ key ] -> [] */
+ return rc;
+}
+
+/*
+ * HASPROP variant used internally.
+ *
+ * This primitive must never throw an error, callers rely on this.
+ * In particular, don't throw an error for prototype loops; instead,
+ * pretend like the property doesn't exist if a prototype sanity limit
+ * is reached.
+ *
+ * Does not implement proxy behavior: if applied to a proxy object,
+ * returns key existence on the proxy object itself.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) {
+ duk_propdesc dummy;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ return duk__get_propdesc(thr, obj, key, &dummy, DUK_GETDESC_FLAG_IGNORE_PROTOLOOP); /* don't push value */
+}
+
+/*
+ * Helper: handle Array object 'length' write which automatically
+ * deletes properties, see E5 Section 15.4.5.1, step 3. This is
+ * quite tricky to get right.
+ *
+ * Used by duk_hobject_putprop().
+ */
+
+/* Coerce a new .length candidate to a number and check that it's a valid
+ * .length.
+ */
+DUK_LOCAL duk_uint32_t duk__to_new_array_length_checked(duk_hthread *thr, duk_tval *tv) {
+ duk_uint32_t res;
+ duk_double_t d;
+
+#if !defined(DUK_USE_PREFER_SIZE)
+#if defined(DUK_USE_FASTINT)
+ /* When fastints are enabled, the most interesting case is assigning
+ * a fastint to .length (e.g. arr.length = 0).
+ */
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ /* Very common case. */
+ duk_int64_t fi;
+ fi = DUK_TVAL_GET_FASTINT(tv);
+ if (fi < 0 || fi > DUK_I64_CONSTANT(0xffffffff)) {
+ goto fail_range;
+ }
+ return (duk_uint32_t) fi;
+ }
+#else /* DUK_USE_FASTINT */
+ /* When fastints are not enabled, the most interesting case is any
+ * number.
+ */
+ if (DUK_TVAL_IS_DOUBLE(tv)) {
+ d = DUK_TVAL_GET_NUMBER(tv);
+ }
+#endif /* DUK_USE_FASTINT */
+ else
+#endif /* !DUK_USE_PREFER_SIZE */
+ {
+ /* In all other cases, and when doing a size optimized build,
+ * fall back to the comprehensive handler.
+ */
+ d = duk_js_tonumber(thr, tv);
+ }
+
+ /* Refuse to update an Array's 'length' to a value outside the
+ * 32-bit range. Negative zero is accepted as zero.
+ */
+ res = (duk_uint32_t) d;
+ if ((duk_double_t) res != d) {
+ goto fail_range;
+ }
+
+ return res;
+
+ fail_range:
+ DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARRAY_LENGTH);
+ return 0; /* unreachable */
+}
+
+/* Delete elements required by a smaller length, taking into account
+ * potentially non-configurable elements. Returns non-zero if all
+ * elements could be deleted, and zero if all or some elements could
+ * not be deleted. Also writes final "target length" to 'out_result_len'.
+ * This is the length value that should go into the 'length' property
+ * (must be set by the caller). Never throws an error.
+ */
+DUK_LOCAL
+duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr,
+ duk_hobject *obj,
+ duk_uint32_t old_len,
+ duk_uint32_t new_len,
+ duk_bool_t force_flag,
+ duk_uint32_t *out_result_len) {
+ duk_uint32_t target_len;
+ duk_uint_fast32_t i;
+ duk_uint32_t arr_idx;
+ duk_hstring *key;
+ duk_tval *tv;
+ duk_bool_t rc;
+
+ DUK_DDD(DUK_DDDPRINT("new array length smaller than old (%ld -> %ld), "
+ "probably need to remove elements",
+ (long) old_len, (long) new_len));
+
+ /*
+ * New length is smaller than old length, need to delete properties above
+ * the new length.
+ *
+ * If array part exists, this is straightforward: array entries cannot
+ * be non-configurable so this is guaranteed to work.
+ *
+ * If array part does not exist, array-indexed values are scattered
+ * in the entry part, and some may not be configurable (preventing length
+ * from becoming lower than their index + 1). To handle the algorithm
+ * in E5 Section 15.4.5.1, step l correctly, we scan the entire property
+ * set twice.
+ */
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(new_len < old_len);
+ DUK_ASSERT(out_result_len != NULL);
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj));
+ DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj));
+
+ if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ /*
+ * All defined array-indexed properties are in the array part
+ * (we assume the array part is comprehensive), and all array
+ * entries are writable, configurable, and enumerable. Thus,
+ * nothing can prevent array entries from being deleted.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("have array part, easy case"));
+
+ if (old_len < DUK_HOBJECT_GET_ASIZE(obj)) {
+ /* XXX: assertion that entries >= old_len are already unused */
+ i = old_len;
+ } else {
+ i = DUK_HOBJECT_GET_ASIZE(obj);
+ }
+ DUK_ASSERT(i <= DUK_HOBJECT_GET_ASIZE(obj));
+
+ while (i > new_len) {
+ i--;
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);
+ DUK_TVAL_SET_UNUSED_UPDREF(thr, tv); /* side effects */
+ }
+
+ *out_result_len = new_len;
+ return 1;
+ } else {
+ /*
+ * Entries part is a bit more complex.
+ */
+
+ /* Stage 1: find highest preventing non-configurable entry (if any).
+ * When forcing, ignore non-configurability.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("no array part, slow case"));
+
+ DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 1: find target_len "
+ "(highest preventing non-configurable entry (if any))"));
+
+ target_len = new_len;
+ if (force_flag) {
+ DUK_DDD(DUK_DDDPRINT("array length write, no array part; force flag -> skip stage 1"));
+ goto skip_stage1;
+ }
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i);
+ if (!key) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: null key", (long) i));
+ continue;
+ }
+ if (!DUK_HSTRING_HAS_ARRIDX(key)) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key not an array index", (long) i));
+ continue;
+ }
+
+ DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key)); /* XXX: macro checks for array index flag, which is unnecessary here */
+ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);
+ DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX);
+ DUK_ASSERT(arr_idx < old_len); /* consistency requires this */
+
+ if (arr_idx < new_len) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is array index %ld, below new_len",
+ (long) i, (long) arr_idx));
+ continue;
+ }
+ if (DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is a relevant array index %ld, but configurable",
+ (long) i, (long) arr_idx));
+ continue;
+ }
+
+ /* relevant array index is non-configurable, blocks write */
+ if (arr_idx >= target_len) {
+ DUK_DDD(DUK_DDDPRINT("entry at index %ld has arr_idx %ld, is not configurable, "
+ "update target_len %ld -> %ld",
+ (long) i, (long) arr_idx, (long) target_len,
+ (long) (arr_idx + 1)));
+ target_len = arr_idx + 1;
+ }
+ }
+ skip_stage1:
+
+ /* stage 2: delete configurable entries above target length */
+
+ DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld, target_len=%ld",
+ (long) old_len, (long) new_len, (long) target_len));
+
+ DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 2: remove "
+ "entries >= target_len"));
+
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i);
+ if (!key) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: null key", (long) i));
+ continue;
+ }
+ if (!DUK_HSTRING_HAS_ARRIDX(key)) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key not an array index", (long) i));
+ continue;
+ }
+
+ DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key)); /* XXX: macro checks for array index flag, which is unnecessary here */
+ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);
+ DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX);
+ DUK_ASSERT(arr_idx < old_len); /* consistency requires this */
+
+ if (arr_idx < target_len) {
+ DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is array index %ld, below target_len",
+ (long) i, (long) arr_idx));
+ continue;
+ }
+ DUK_ASSERT(force_flag || DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)); /* stage 1 guarantees */
+
+ DUK_DDD(DUK_DDDPRINT("delete entry index %ld: key is array index %ld",
+ (long) i, (long) arr_idx));
+
+ /*
+ * Slow delete, but we don't care as we're already in a very slow path.
+ * The delete always succeeds: key has no exotic behavior, property
+ * is configurable, and no resize occurs.
+ */
+ rc = duk_hobject_delprop_raw(thr, obj, key, force_flag ? DUK_DELPROP_FLAG_FORCE : 0);
+ DUK_UNREF(rc);
+ DUK_ASSERT(rc != 0);
+ }
+
+ /* stage 3: update length (done by caller), decide return code */
+
+ DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 3: update length (done by caller)"));
+
+ *out_result_len = target_len;
+
+ if (target_len == new_len) {
+ DUK_DDD(DUK_DDDPRINT("target_len matches new_len, return success"));
+ return 1;
+ }
+ DUK_DDD(DUK_DDDPRINT("target_len does not match new_len (some entry prevented "
+ "full length adjustment), return error"));
+ return 0;
+ }
+
+ DUK_UNREACHABLE();
+}
+
+/* XXX: is valstack top best place for argument? */
+DUK_LOCAL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj) {
+ duk_harray *a;
+ duk_uint32_t old_len;
+ duk_uint32_t new_len;
+ duk_uint32_t result_len;
+ duk_bool_t rc;
+
+ DUK_DDD(DUK_DDDPRINT("handling a put operation to array 'length' exotic property, "
+ "new val: %!T",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj));
+ DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj));
+ a = (duk_harray *) obj;
+ DUK_ASSERT_HARRAY_VALID(a);
+
+ DUK_ASSERT(duk_is_valid_index(thr, -1));
+
+ /*
+ * Get old and new length
+ */
+
+ old_len = a->length;
+ new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1));
+ DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld", (long) old_len, (long) new_len));
+
+ /*
+ * Writability check
+ */
+
+ if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) {
+ DUK_DDD(DUK_DDDPRINT("length is not writable, fail"));
+ return 0;
+ }
+
+ /*
+ * New length not lower than old length => no changes needed
+ * (not even array allocation).
+ */
+
+ if (new_len >= old_len) {
+ DUK_DDD(DUK_DDDPRINT("new length is same or higher than old length, just update length, no deletions"));
+ a->length = new_len;
+ return 1;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("new length is lower than old length, probably must delete entries"));
+
+ /*
+ * New length lower than old length => delete elements, then
+ * update length.
+ *
+ * Note: even though a bunch of elements have been deleted, the 'desc' is
+ * still valid as properties haven't been resized (and entries compacted).
+ */
+
+ rc = duk__handle_put_array_length_smaller(thr, obj, old_len, new_len, 0 /*force_flag*/, &result_len);
+ DUK_ASSERT(result_len >= new_len && result_len <= old_len);
+
+ a->length = result_len;
+
+ /* XXX: shrink array allocation or entries compaction here? */
+
+ return rc;
+}
+
+/*
+ * PUTPROP: Ecmascript property write.
+ *
+ * Unlike Ecmascript primitive which returns nothing, returns 1 to indicate
+ * success and 0 to indicate failure (assuming throw is not set).
+ *
+ * This is an extremely tricky function. Some examples:
+ *
+ * * Currently a decref may trigger a GC, which may compact an object's
+ * property allocation. Consequently, any entry indices (e_idx) will
+ * be potentially invalidated by a decref.
+ *
+ * * Exotic behaviors (strings, arrays, arguments object) require,
+ * among other things:
+ *
+ * - Preprocessing before and postprocessing after an actual property
+ * write. For example, array index write requires pre-checking the
+ * array 'length' property for access control, and may require an
+ * array 'length' update after the actual write has succeeded (but
+ * not if it fails).
+ *
+ * - Deletion of multiple entries, as a result of array 'length' write.
+ *
+ * * Input values are taken as pointers which may point to the valstack.
+ * If valstack is resized because of the put (this may happen at least
+ * when the array part is abandoned), the pointers can be invalidated.
+ * (We currently make a copy of all of the input values to avoid issues.)
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag) {
+ duk_tval tv_obj_copy;
+ duk_tval tv_key_copy;
+ duk_tval tv_val_copy;
+ duk_hobject *orig = NULL; /* NULL if tv_obj is primitive */
+ duk_hobject *curr;
+ duk_hstring *key = NULL;
+ duk_propdesc desc;
+ duk_tval *tv;
+ duk_uint32_t arr_idx;
+ duk_bool_t rc;
+ duk_int_t e_idx;
+ duk_uint_t sanity;
+ duk_uint32_t new_array_length = 0; /* 0 = no update */
+
+ DUK_DDD(DUK_DDDPRINT("putprop: thr=%p, obj=%p, key=%p, val=%p, throw=%ld "
+ "(obj -> %!T, key -> %!T, val -> %!T)",
+ (void *) thr, (void *) tv_obj, (void *) tv_key, (void *) tv_val,
+ (long) throw_flag, (duk_tval *) tv_obj, (duk_tval *) tv_key, (duk_tval *) tv_val));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(tv_obj != NULL);
+ DUK_ASSERT(tv_key != NULL);
+ DUK_ASSERT(tv_val != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ DUK_STATS_INC(thr->heap, stats_putprop_all);
+
+ /*
+ * Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of
+ * them being invalidated by a valstack resize.
+ *
+ * XXX: this is an overkill for some paths, so optimize this later
+ * (or maybe switch to a stack arguments model entirely).
+ */
+
+ DUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj);
+ DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key);
+ DUK_TVAL_SET_TVAL(&tv_val_copy, tv_val);
+ tv_obj = &tv_obj_copy;
+ tv_key = &tv_key_copy;
+ tv_val = &tv_val_copy;
+
+ /*
+ * Coercion and fast path processing.
+ */
+
+ switch (DUK_TVAL_GET_TAG(tv_obj)) {
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL: {
+ /* Note: unconditional throw */
+ DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject (object=%!iT)",
+ (duk_tval *) tv_obj));
+#if defined(DUK_USE_PARANOID_ERRORS)
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);
+#else
+ DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot write property %s of %s",
+ duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));
+#endif
+ return 0;
+ }
+
+ case DUK_TAG_BOOLEAN: {
+ DUK_DDD(DUK_DDDPRINT("base object is a boolean, start lookup from boolean prototype"));
+ curr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE];
+ break;
+ }
+
+ case DUK_TAG_STRING: {
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj);
+
+ /*
+ * Note: currently no fast path for array index writes.
+ * They won't be possible anyway as strings are immutable.
+ */
+
+ DUK_ASSERT(key == NULL);
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ /* Symbols (ES2015 or hidden) don't have virtual properties. */
+ curr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE];
+ goto lookup;
+ }
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ goto fail_not_writable;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ arr_idx < DUK_HSTRING_GET_CHARLEN(h)) {
+ goto fail_not_writable;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("base object is a string, start lookup from string prototype"));
+ curr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE];
+ goto lookup; /* avoid double coercion */
+ }
+
+ case DUK_TAG_OBJECT: {
+ orig = DUK_TVAL_GET_OBJECT(tv_obj);
+ DUK_ASSERT(orig != NULL);
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ /* With this check in place fast paths won't need read-only
+ * object checks. This is technically incorrect if there are
+ * setters that cause no writes to ROM objects, but current
+ * built-ins don't have such setters.
+ */
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) {
+ DUK_DD(DUK_DDPRINT("attempt to putprop on read-only target object"));
+ goto fail_not_writable_no_pop; /* Must avoid duk_pop() in exit path */
+ }
+#endif
+
+ /* The fast path for array property put is not fully compliant:
+ * If one places conflicting number-indexed properties into
+ * Array.prototype (for example, a non-writable Array.prototype[7])
+ * the fast path will incorrectly ignore them.
+ *
+ * This fast path could be made compliant by falling through
+ * to the slow path if the previous value was UNUSED. This would
+ * also remove the need to check for extensibility. Right now a
+ * non-extensible array is slower than an extensible one as far
+ * as writes are concerned.
+ *
+ * The fast path behavior is documented in more detail here:
+ * tests/ecmascript/test-misc-array-fast-write.js
+ */
+
+ /* XXX: array .length? */
+
+#if defined(DUK_USE_ARRAY_PROP_FASTPATH)
+ if (duk__putprop_shallow_fastpath_array_tval(thr, orig, tv_key, tv_val) != 0) {
+ DUK_DDD(DUK_DDDPRINT("array fast path success"));
+ DUK_STATS_INC(thr->heap, stats_putprop_arrayidx);
+ return 1;
+ }
+#endif
+
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ if (duk__putprop_fastpath_bufobj_tval(thr, orig, tv_key, tv_val) != 0) {
+ DUK_DDD(DUK_DDDPRINT("base is bufobj, key is a number, bufobj fast path"));
+ DUK_STATS_INC(thr->heap, stats_putprop_bufobjidx);
+ return 1;
+ }
+#endif
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(orig))) {
+ duk_hobject *h_target;
+ duk_bool_t tmp_bool;
+
+ if (duk__proxy_check_prop(thr, orig, DUK_STRIDX_SET, tv_key, &h_target)) {
+ /* -> [ ... trap handler ] */
+ DUK_DDD(DUK_DDDPRINT("-> proxy object 'set' for key %!T", (duk_tval *) tv_key));
+ DUK_STATS_INC(thr->heap, stats_putprop_proxy);
+ duk_push_hobject(thr, h_target); /* target */
+ duk_push_tval(thr, tv_key); /* P */
+ duk_push_tval(thr, tv_val); /* V */
+ duk_push_tval(thr, tv_obj); /* Receiver: Proxy object */
+ duk_call_method(thr, 4 /*nargs*/);
+ tmp_bool = duk_to_boolean(thr, -1);
+ duk_pop_nodecref_unsafe(thr);
+ if (!tmp_bool) {
+ goto fail_proxy_rejected;
+ }
+
+ /* Target object must be checked for a conflicting
+ * non-configurable property.
+ */
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+
+ if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ duk_tval *tv_targ = duk_require_tval(thr, -1);
+ duk_bool_t datadesc_reject;
+ duk_bool_t accdesc_reject;
+
+ DUK_DDD(DUK_DDDPRINT("proxy 'set': target has matching property %!O, check for "
+ "conflicting property; tv_val=%!T, tv_targ=%!T, desc.flags=0x%08lx, "
+ "desc.get=%p, desc.set=%p",
+ (duk_heaphdr *) key, (duk_tval *) tv_val, (duk_tval *) tv_targ,
+ (unsigned long) desc.flags,
+ (void *) desc.get, (void *) desc.set));
+
+ datadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&
+ !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&
+ !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) &&
+ !duk_js_samevalue(tv_val, tv_targ);
+ accdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&
+ !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&
+ (desc.set == NULL);
+ if (datadesc_reject || accdesc_reject) {
+ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);
+ }
+
+ duk_pop_2_unsafe(thr);
+ } else {
+ duk_pop_unsafe(thr);
+ }
+ return 1; /* success */
+ }
+
+ orig = h_target; /* resume write to target */
+ DUK_TVAL_SET_OBJECT(tv_obj, orig);
+ }
+#endif /* DUK_USE_ES6_PROXY */
+
+ curr = orig;
+ break;
+ }
+
+ case DUK_TAG_BUFFER: {
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj);
+ duk_int_t pop_count = 0;
+
+ /*
+ * Because buffer values may be looped over and read/written
+ * from, an array index fast path is important.
+ */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_key)) {
+ arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path fastint; arr_idx %ld", (long) arr_idx));
+ pop_count = 0;
+ } else
+#endif
+ if (DUK_TVAL_IS_NUMBER(tv_key)) {
+ arr_idx = duk__tval_number_to_arr_idx(tv_key);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path number; arr_idx %ld", (long) arr_idx));
+ pop_count = 0;
+ } else {
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after "
+ "coercion key is %!T, arr_idx %ld",
+ (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));
+ pop_count = 1;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ arr_idx < DUK_HBUFFER_GET_SIZE(h)) {
+ duk_uint8_t *data;
+ DUK_DDD(DUK_DDDPRINT("writing to buffer data at index %ld", (long) arr_idx));
+ data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h);
+
+ /* XXX: duk_to_int() ensures we'll get 8 lowest bits as
+ * as input is within duk_int_t range (capped outside it).
+ */
+#if defined(DUK_USE_FASTINT)
+ /* Buffer writes are often integers. */
+ if (DUK_TVAL_IS_FASTINT(tv_val)) {
+ data[arr_idx] = (duk_uint8_t) DUK_TVAL_GET_FASTINT_U32(tv_val);
+ }
+ else
+#endif
+ {
+ duk_push_tval(thr, tv_val);
+ data[arr_idx] = (duk_uint8_t) duk_to_uint32(thr, -1);
+ pop_count++;
+ }
+
+ duk_pop_n_unsafe(thr, pop_count);
+ DUK_DDD(DUK_DDDPRINT("result: success (buffer data write)"));
+ DUK_STATS_INC(thr->heap, stats_putprop_bufferidx);
+ return 1;
+ }
+
+ if (pop_count == 0) {
+ /* This is a pretty awkward control flow, but we need to recheck the
+ * key coercion here.
+ */
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after "
+ "coercion key is %!T, arr_idx %ld",
+ (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));
+ }
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ goto fail_not_writable;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("base object is a buffer, start lookup from Uint8Array prototype"));
+ curr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];
+ goto lookup; /* avoid double coercion */
+ }
+
+ case DUK_TAG_POINTER: {
+ DUK_DDD(DUK_DDDPRINT("base object is a pointer, start lookup from pointer prototype"));
+ curr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE];
+ break;
+ }
+
+ case DUK_TAG_LIGHTFUNC: {
+ /* Lightfuncs have no own properties and are considered non-extensible.
+ * However, the write may be captured by an inherited setter which
+ * means we can't stop the lookup here.
+ */
+ DUK_DDD(DUK_DDDPRINT("base object is a lightfunc, start lookup from function prototype"));
+ curr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE];
+ break;
+ }
+
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ /* number */
+ DUK_DDD(DUK_DDDPRINT("base object is a number, start lookup from number prototype"));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj));
+ curr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE];
+ break;
+ }
+ }
+
+ DUK_ASSERT(key == NULL);
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+
+ lookup:
+
+ /*
+ * Check whether the property already exists in the prototype chain.
+ * Note that the actual write goes into the original base object
+ * (except if an accessor property captures the write).
+ */
+
+ /* [key] */
+
+ DUK_ASSERT(curr != NULL);
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ if (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */
+ goto next_in_chain;
+ }
+
+ if (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ /*
+ * Found existing accessor property (own or inherited).
+ * Call setter with 'this' set to orig, and value as the only argument.
+ * Setter calls are OK even for ROM objects.
+ *
+ * Note: no exotic arguments object behavior, because [[Put]] never
+ * calls [[DefineOwnProperty]] (E5 Section 8.12.5, step 5.b).
+ */
+
+ duk_hobject *setter;
+
+ DUK_DD(DUK_DDPRINT("put to an own or inherited accessor, calling setter"));
+
+ setter = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, curr, desc.e_idx);
+ if (!setter) {
+ goto fail_no_setter;
+ }
+ duk_push_hobject(thr, setter);
+ duk_push_tval(thr, tv_obj); /* note: original, uncoerced base */
+ duk_push_tval(thr, tv_val); /* [key setter this val] */
+#if defined(DUK_USE_NONSTD_SETTER_KEY_ARGUMENT)
+ duk_dup_m4(thr);
+ duk_call_method(thr, 2); /* [key setter this val key] -> [key retval] */
+#else
+ duk_call_method(thr, 1); /* [key setter this val] -> [key retval] */
+#endif
+ duk_pop_unsafe(thr); /* ignore retval -> [key] */
+ goto success_no_arguments_exotic;
+ }
+
+ if (orig == NULL) {
+ /*
+ * Found existing own or inherited plain property, but original
+ * base is a primitive value.
+ */
+ DUK_DD(DUK_DDPRINT("attempt to create a new property in a primitive base object"));
+ goto fail_base_primitive;
+ }
+
+ if (curr != orig) {
+ /*
+ * Found existing inherited plain property.
+ * Do an access control check, and if OK, write
+ * new property to 'orig'.
+ */
+ if (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) {
+ DUK_DD(DUK_DDPRINT("found existing inherited plain property, but original object is not extensible"));
+ goto fail_not_extensible;
+ }
+ if (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) {
+ DUK_DD(DUK_DDPRINT("found existing inherited plain property, original object is extensible, but inherited property is not writable"));
+ goto fail_not_writable;
+ }
+ DUK_DD(DUK_DDPRINT("put to new property, object extensible, inherited property found and is writable"));
+ goto create_new;
+ } else {
+ /*
+ * Found existing own (non-inherited) plain property.
+ * Do an access control check and update in place.
+ */
+
+ if (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) {
+ DUK_DD(DUK_DDPRINT("found existing own (non-inherited) plain property, but property is not writable"));
+ goto fail_not_writable;
+ }
+ if (desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) {
+ DUK_DD(DUK_DDPRINT("found existing own (non-inherited) virtual property, property is writable"));
+
+ if (DUK_HOBJECT_IS_ARRAY(curr)) {
+ /*
+ * Write to 'length' of an array is a very complex case
+ * handled in a helper which updates both the array elements
+ * and writes the new 'length'. The write may result in an
+ * unconditional RangeError or a partial write (indicated
+ * by a return code).
+ *
+ * Note: the helper has an unnecessary writability check
+ * for 'length', we already know it is writable.
+ */
+ DUK_ASSERT(key == DUK_HTHREAD_STRING_LENGTH(thr)); /* only virtual array property */
+
+ DUK_DDD(DUK_DDDPRINT("writing existing 'length' property to array exotic, invoke complex helper"));
+
+ /* XXX: the helper currently assumes stack top contains new
+ * 'length' value and the whole calling convention is not very
+ * compatible with what we need.
+ */
+
+ duk_push_tval(thr, tv_val); /* [key val] */
+ rc = duk__handle_put_array_length(thr, orig);
+ duk_pop_unsafe(thr); /* [key val] -> [key] */
+ if (!rc) {
+ goto fail_array_length_partial;
+ }
+
+ /* key is 'length', cannot match argument exotic behavior */
+ goto success_no_arguments_exotic;
+ }
+#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)
+ else if (DUK_HOBJECT_IS_BUFOBJ(curr)) {
+ duk_hbufobj *h_bufobj;
+ duk_uint_t byte_off;
+ duk_small_uint_t elem_size;
+
+ h_bufobj = (duk_hbufobj *) curr;
+ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj);
+
+ DUK_DD(DUK_DDPRINT("writable virtual property is in buffer object"));
+
+ /* Careful with wrapping: arr_idx upshift may easily wrap, whereas
+ * length downshift won't.
+ */
+ if (arr_idx < (h_bufobj->length >> h_bufobj->shift) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {
+ duk_uint8_t *data;
+ DUK_DDD(DUK_DDDPRINT("writing to buffer data at index %ld", (long) arr_idx));
+
+ DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); /* index/length check guarantees */
+ byte_off = arr_idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */
+ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift);
+
+ /* Coerce to number before validating pointers etc so that the
+ * number coercions in duk_hbufobj_validated_write() are
+ * guaranteed to be side effect free and not invalidate the
+ * pointer checks we do here.
+ */
+ duk_push_tval(thr, tv_val);
+ (void) duk_to_number_m1(thr);
+
+ if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {
+ data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;
+ duk_hbufobj_validated_write(thr, h_bufobj, data, elem_size);
+ } else {
+ DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (write skipped)"));
+ }
+ duk_pop_unsafe(thr);
+ goto success_no_arguments_exotic;
+ }
+ }
+#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */
+
+ DUK_D(DUK_DPRINT("should not happen, key %!O", key));
+ goto fail_internal; /* should not happen */
+ }
+ DUK_DD(DUK_DDPRINT("put to existing own plain property, property is writable"));
+ goto update_old;
+ }
+ DUK_UNREACHABLE();
+
+ next_in_chain:
+ /* XXX: option to pretend property doesn't exist if sanity limit is
+ * hit might be useful.
+ */
+ if (DUK_UNLIKELY(sanity-- == 0)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+ curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);
+ } while (curr != NULL);
+
+ /*
+ * Property not found in prototype chain.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("property not found in prototype chain"));
+
+ if (orig == NULL) {
+ DUK_DD(DUK_DDPRINT("attempt to create a new property in a primitive base object"));
+ goto fail_base_primitive;
+ }
+
+ if (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) {
+ DUK_DD(DUK_DDPRINT("put to a new property (not found in prototype chain), but original object not extensible"));
+ goto fail_not_extensible;
+ }
+
+ goto create_new;
+
+ update_old:
+
+ /*
+ * Update an existing property of the base object.
+ */
+
+ /* [key] */
+
+ DUK_DDD(DUK_DDDPRINT("update an existing property of the original object"));
+
+ DUK_ASSERT(orig != NULL);
+#if defined(DUK_USE_ROM_OBJECTS)
+ /* This should not happen because DUK_TAG_OBJECT case checks
+ * for this already, but check just in case.
+ */
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) {
+ goto fail_not_writable;
+ }
+#endif
+
+ /* Although there are writable virtual properties (e.g. plain buffer
+ * and buffer object number indices), they are handled before we come
+ * here.
+ */
+ DUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) == 0);
+ DUK_ASSERT(desc.a_idx >= 0 || desc.e_idx >= 0);
+
+ /* Array own property .length is handled above. */
+ DUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr)));
+
+ if (desc.e_idx >= 0) {
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, desc.e_idx);
+ DUK_DDD(DUK_DDDPRINT("previous entry value: %!iT", (duk_tval *) tv));
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects; e_idx may be invalidated */
+ /* don't touch property attributes or hash part */
+ DUK_DD(DUK_DDPRINT("put to an existing entry at index %ld -> new value %!iT",
+ (long) desc.e_idx, (duk_tval *) tv));
+ } else {
+ /* Note: array entries are always writable, so the writability check
+ * above is pointless for them. The check could be avoided with some
+ * refactoring but is probably not worth it.
+ */
+
+ DUK_ASSERT(desc.a_idx >= 0);
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, desc.a_idx);
+ DUK_DDD(DUK_DDDPRINT("previous array value: %!iT", (duk_tval *) tv));
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects; a_idx may be invalidated */
+ DUK_DD(DUK_DDPRINT("put to an existing array entry at index %ld -> new value %!iT",
+ (long) desc.a_idx, (duk_tval *) tv));
+ }
+
+ /* Regardless of whether property is found in entry or array part,
+ * it may have arguments exotic behavior (array indices may reside
+ * in entry part for abandoned / non-existent array parts).
+ */
+ goto success_with_arguments_exotic;
+
+ create_new:
+
+ /*
+ * Create a new property in the original object.
+ *
+ * Exotic properties need to be reconsidered here from a write
+ * perspective (not just property attributes perspective).
+ * However, the property does not exist in the object already,
+ * so this limits the kind of exotic properties that apply.
+ */
+
+ /* [key] */
+
+ DUK_DDD(DUK_DDDPRINT("create new property to original object"));
+
+ DUK_ASSERT(orig != NULL);
+
+ /* Array own property .length is handled above. */
+ DUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr)));
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ /* This should not happen because DUK_TAG_OBJECT case checks
+ * for this already, but check just in case.
+ */
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) {
+ goto fail_not_writable;
+ }
+#endif
+
+ /* Not possible because array object 'length' is present
+ * from its creation and cannot be deleted, and is thus
+ * caught as an existing property above.
+ */
+ DUK_ASSERT(!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) &&
+ key == DUK_HTHREAD_STRING_LENGTH(thr)));
+
+ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) &&
+ arr_idx != DUK__NO_ARRAY_INDEX) {
+ /* automatic length update */
+ duk_uint32_t old_len;
+ duk_harray *a;
+
+ a = (duk_harray *) orig;
+ DUK_ASSERT_HARRAY_VALID(a);
+
+ old_len = a->length;
+
+ if (arr_idx >= old_len) {
+ DUK_DDD(DUK_DDDPRINT("write new array entry requires length update "
+ "(arr_idx=%ld, old_len=%ld)",
+ (long) arr_idx, (long) old_len));
+
+ if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) {
+ DUK_DD(DUK_DDPRINT("attempt to extend array, but array 'length' is not writable"));
+ goto fail_not_writable;
+ }
+
+ /* Note: actual update happens once write has been completed
+ * without error below. The write should always succeed
+ * from a specification viewpoint, but we may e.g. run out
+ * of memory. It's safer in this order.
+ */
+
+ DUK_ASSERT(arr_idx != 0xffffffffUL);
+ new_array_length = arr_idx + 1; /* flag for later write */
+ } else {
+ DUK_DDD(DUK_DDDPRINT("write new array entry does not require length update "
+ "(arr_idx=%ld, old_len=%ld)",
+ (long) arr_idx, (long) old_len));
+ }
+ }
+
+ /* write_to_array_part: */
+
+ /*
+ * Write to array part?
+ *
+ * Note: array abandonding requires a property resize which uses
+ * 'rechecks' valstack for temporaries and may cause any existing
+ * valstack pointers to be invalidated. To protect against this,
+ * tv_obj, tv_key, and tv_val are copies of the original inputs.
+ */
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ DUK_HOBJECT_HAS_ARRAY_PART(orig)) {
+ if (arr_idx < DUK_HOBJECT_GET_ASIZE(orig)) {
+ goto no_array_growth;
+ }
+
+ /*
+ * Array needs to grow, but we don't want it becoming too sparse.
+ * If it were to become sparse, abandon array part, moving all
+ * array entries into the entries part (for good).
+ *
+ * Since we don't keep track of actual density (used vs. size) of
+ * the array part, we need to estimate somehow. The check is made
+ * in two parts:
+ *
+ * - Check whether the resize need is small compared to the
+ * current size (relatively); if so, resize without further
+ * checking (essentially we assume that the original part is
+ * "dense" so that the result would be dense enough).
+ *
+ * - Otherwise, compute the resize using an actual density
+ * measurement based on counting the used array entries.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("write to new array requires array resize, decide whether to do a "
+ "fast resize without abandon check (arr_idx=%ld, old_size=%ld)",
+ (long) arr_idx, (long) DUK_HOBJECT_GET_ASIZE(orig)));
+
+ if (duk__abandon_array_slow_check_required(arr_idx, DUK_HOBJECT_GET_ASIZE(orig))) {
+ duk_uint32_t old_used;
+ duk_uint32_t old_size;
+
+ DUK_DDD(DUK_DDDPRINT("=> fast check is NOT OK, do slow check for array abandon"));
+
+ duk__compute_a_stats(thr, orig, &old_used, &old_size);
+
+ DUK_DDD(DUK_DDDPRINT("abandon check, array stats: old_used=%ld, old_size=%ld, arr_idx=%ld",
+ (long) old_used, (long) old_size, (long) arr_idx));
+
+ /* Note: intentionally use approximations to shave a few instructions:
+ * a_used = old_used (accurate: old_used + 1)
+ * a_size = arr_idx (accurate: arr_idx + 1)
+ */
+ if (duk__abandon_array_density_check(old_used, arr_idx)) {
+ DUK_DD(DUK_DDPRINT("write to new array entry beyond current length, "
+ "decided to abandon array part (would become too sparse)"));
+
+ /* abandoning requires a props allocation resize and
+ * 'rechecks' the valstack, invalidating any existing
+ * valstack value pointers!
+ */
+ duk__abandon_array_checked(thr, orig);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(orig));
+
+ goto write_to_entry_part;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("=> decided to keep array part"));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("=> fast resize is OK"));
+ }
+
+ DUK_DD(DUK_DDPRINT("write to new array entry beyond current length, "
+ "decided to extend current allocation"));
+
+ duk__grow_props_for_array_item(thr, orig, arr_idx);
+
+ no_array_growth:
+
+ /* Note: assume array part is comprehensive, so that either
+ * the write goes to the array part, or we've abandoned the
+ * array above (and will not come here).
+ */
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(orig));
+ DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(orig));
+
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, arr_idx);
+ /* prev value must be unused, no decref */
+ DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv));
+ DUK_TVAL_SET_TVAL(tv, tv_val);
+ DUK_TVAL_INCREF(thr, tv);
+ DUK_DD(DUK_DDPRINT("put to new array entry: %ld -> %!T",
+ (long) arr_idx, (duk_tval *) tv));
+
+ /* Note: array part values are [[Writable]], [[Enumerable]],
+ * and [[Configurable]] which matches the required attributes
+ * here.
+ */
+ goto entry_updated;
+ }
+
+ write_to_entry_part:
+
+ /*
+ * Write to entry part
+ */
+
+ /* entry allocation updates hash part and increases the key
+ * refcount; may need a props allocation resize but doesn't
+ * 'recheck' the valstack.
+ */
+ e_idx = duk__hobject_alloc_entry_checked(thr, orig, key);
+ DUK_ASSERT(e_idx >= 0);
+
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, e_idx);
+ /* prev value can be garbage, no decref */
+ DUK_TVAL_SET_TVAL(tv, tv_val);
+ DUK_TVAL_INCREF(thr, tv);
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, orig, e_idx, DUK_PROPDESC_FLAGS_WEC);
+ goto entry_updated;
+
+ entry_updated:
+
+ /*
+ * Possible pending array length update, which must only be done
+ * if the actual entry write succeeded.
+ */
+
+ if (new_array_length > 0) {
+ /* Note: zero works as a "no update" marker because the new length
+ * can never be zero after a new property is written.
+ */
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig));
+
+ DUK_DDD(DUK_DDDPRINT("write successful, pending array length update to: %ld",
+ (long) new_array_length));
+
+ ((duk_harray *) orig)->length = new_array_length;
+ }
+
+ /*
+ * Arguments exotic behavior not possible for new properties: all
+ * magically bound properties are initially present in the arguments
+ * object, and if they are deleted, the binding is also removed from
+ * parameter map.
+ */
+
+ goto success_no_arguments_exotic;
+
+ success_with_arguments_exotic:
+
+ /*
+ * Arguments objects have exotic [[DefineOwnProperty]] which updates
+ * the internal 'map' of arguments for writes to currently mapped
+ * arguments. More conretely, writes to mapped arguments generate
+ * a write to a bound variable.
+ *
+ * The [[Put]] algorithm invokes [[DefineOwnProperty]] for existing
+ * data properties and new properties, but not for existing accessors.
+ * Hence, in E5 Section 10.6 ([[DefinedOwnProperty]] algorithm), we
+ * have a Desc with 'Value' (and possibly other properties too), and
+ * we end up in step 5.b.i.
+ */
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) {
+ /* Note: only numbered indices are relevant, so arr_idx fast reject
+ * is good (this is valid unless there are more than 4**32-1 arguments).
+ */
+
+ DUK_DDD(DUK_DDDPRINT("putprop successful, arguments exotic behavior needed"));
+
+ /* Note: we can reuse 'desc' here */
+
+ /* XXX: top of stack must contain value, which helper doesn't touch,
+ * rework to use tv_val directly?
+ */
+
+ duk_push_tval(thr, tv_val);
+ (void) duk__check_arguments_map_for_put(thr, orig, key, &desc, throw_flag);
+ duk_pop_unsafe(thr);
+ }
+ /* fall thru */
+
+ success_no_arguments_exotic:
+ /* shared exit path now */
+ DUK_DDD(DUK_DDDPRINT("result: success"));
+ duk_pop_unsafe(thr); /* remove key */
+ return 1;
+
+#if defined(DUK_USE_ES6_PROXY)
+ fail_proxy_rejected:
+ DUK_DDD(DUK_DDDPRINT("result: error, proxy rejects"));
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);
+ }
+ /* Note: no key on stack */
+ return 0;
+#endif
+
+ fail_base_primitive:
+ DUK_DDD(DUK_DDDPRINT("result: error, base primitive"));
+ if (throw_flag) {
+#if defined(DUK_USE_PARANOID_ERRORS)
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);
+#else
+ DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot write property %s of %s",
+ duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));
+#endif
+ }
+ duk_pop_unsafe(thr); /* remove key */
+ return 0;
+
+ fail_not_extensible:
+ DUK_DDD(DUK_DDDPRINT("result: error, not extensible"));
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE);
+ }
+ duk_pop_unsafe(thr); /* remove key */
+ return 0;
+
+ fail_not_writable:
+ DUK_DDD(DUK_DDDPRINT("result: error, not writable"));
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE);
+ }
+ duk_pop_unsafe(thr); /* remove key */
+ return 0;
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ fail_not_writable_no_pop:
+ DUK_DDD(DUK_DDDPRINT("result: error, not writable"));
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE);
+ }
+ return 0;
+#endif
+
+ fail_array_length_partial:
+ DUK_DD(DUK_DDPRINT("result: error, array length write only partially successful"));
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);
+ }
+ duk_pop_unsafe(thr); /* remove key */
+ return 0;
+
+ fail_no_setter:
+ DUK_DDD(DUK_DDDPRINT("result: error, accessor property without setter"));
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_SETTER_UNDEFINED);
+ }
+ duk_pop_unsafe(thr); /* remove key */
+ return 0;
+
+ fail_internal:
+ DUK_DDD(DUK_DDDPRINT("result: error, internal"));
+ if (throw_flag) {
+ DUK_ERROR_INTERNAL(thr);
+ }
+ duk_pop_unsafe(thr); /* remove key */
+ return 0;
+}
+
+/*
+ * Ecmascript compliant [[Delete]](P, Throw).
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) {
+ duk_propdesc desc;
+ duk_tval *tv;
+ duk_uint32_t arr_idx;
+ duk_bool_t throw_flag;
+ duk_bool_t force_flag;
+
+ throw_flag = (flags & DUK_DELPROP_FLAG_THROW);
+ force_flag = (flags & DUK_DELPROP_FLAG_FORCE);
+
+ DUK_DDD(DUK_DDDPRINT("delprop_raw: thr=%p, obj=%p, key=%p, throw=%ld, force=%ld (obj -> %!O, key -> %!O)",
+ (void *) thr, (void *) obj, (void *) key, (long) throw_flag, (long) force_flag,
+ (duk_heaphdr *) obj, (duk_heaphdr *) key));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key);
+
+ /* 0 = don't push current value */
+ if (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */
+ DUK_DDD(DUK_DDDPRINT("property not found, succeed always"));
+ goto success;
+ }
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {
+ DUK_DD(DUK_DDPRINT("attempt to delprop on read-only target object"));
+ goto fail_not_configurable;
+ }
+#endif
+
+ if ((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) == 0 && !force_flag) {
+ goto fail_not_configurable;
+ }
+ if (desc.a_idx < 0 && desc.e_idx < 0) {
+ /* Currently there are no deletable virtual properties, but
+ * with force_flag we might attempt to delete one.
+ */
+ DUK_DD(DUK_DDPRINT("delete failed: property found, force flag, but virtual (and implicitly non-configurable)"));
+ goto fail_virtual;
+ }
+
+ if (desc.a_idx >= 0) {
+ DUK_ASSERT(desc.e_idx < 0);
+
+ tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx);
+ DUK_TVAL_SET_UNUSED_UPDREF(thr, tv); /* side effects */
+ goto success;
+ } else {
+ DUK_ASSERT(desc.a_idx < 0);
+
+ /* remove hash entry (no decref) */
+#if defined(DUK_USE_HOBJECT_HASH_PART)
+ if (desc.h_idx >= 0) {
+ duk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj);
+
+ DUK_DDD(DUK_DDDPRINT("removing hash entry at h_idx %ld", (long) desc.h_idx));
+ DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) > 0);
+ DUK_ASSERT((duk_uint32_t) desc.h_idx < DUK_HOBJECT_GET_HSIZE(obj));
+ h_base[desc.h_idx] = DUK__HASH_DELETED;
+ } else {
+ DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0);
+ }
+#else
+ DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0);
+#endif
+
+ /* Remove value. This requires multiple writes so avoid side
+ * effects via no-refzero macros so that e_idx is not
+ * invalidated.
+ */
+ DUK_DDD(DUK_DDDPRINT("before removing value, e_idx %ld, key %p, key at slot %p",
+ (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx)));
+ DUK_DDD(DUK_DDDPRINT("removing value at e_idx %ld", (long) desc.e_idx));
+ if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx)) {
+ duk_hobject *tmp;
+
+ tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, desc.e_idx);
+ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, desc.e_idx, NULL);
+ DUK_UNREF(tmp);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);
+
+ tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, desc.e_idx);
+ DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, desc.e_idx, NULL);
+ DUK_UNREF(tmp);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);
+ } else {
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx);
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);
+ }
+#if 0
+ /* Not strictly necessary because if key == NULL, flag MUST be ignored. */
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, 0);
+#endif
+
+ /* Remove key. */
+ DUK_DDD(DUK_DDDPRINT("before removing key, e_idx %ld, key %p, key at slot %p",
+ (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx)));
+ DUK_DDD(DUK_DDDPRINT("removing key at e_idx %ld", (long) desc.e_idx));
+ DUK_ASSERT(key == DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx));
+ DUK_HOBJECT_E_SET_KEY(thr->heap, obj, desc.e_idx, NULL);
+ DUK_HSTRING_DECREF_NORZ(thr, key);
+
+ /* Trigger refzero side effects only when we're done as a
+ * finalizer might operate on the object and affect the
+ * e_idx we're supposed to use.
+ */
+ DUK_REFZERO_CHECK_SLOW(thr);
+ goto success;
+ }
+
+ DUK_UNREACHABLE();
+
+ success:
+ /*
+ * Argument exotic [[Delete]] behavior (E5 Section 10.6) is
+ * a post-check, keeping arguments internal 'map' in sync with
+ * any successful deletes (note that property does not need to
+ * exist for delete to 'succeed').
+ *
+ * Delete key from 'map'. Since 'map' only contains array index
+ * keys, we can use arr_idx for a fast skip.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("delete successful, check for arguments exotic behavior"));
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) {
+ /* Note: only numbered indices are relevant, so arr_idx fast reject
+ * is good (this is valid unless there are more than 4**32-1 arguments).
+ */
+
+ DUK_DDD(DUK_DDDPRINT("delete successful, arguments exotic behavior needed"));
+
+ /* Note: we can reuse 'desc' here */
+ (void) duk__check_arguments_map_for_delete(thr, obj, key, &desc);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("delete successful"));
+ return 1;
+
+ fail_virtual: /* just use the same "not configurable" error message */
+ fail_not_configurable:
+ DUK_DDD(DUK_DDDPRINT("delete failed: property found, not configurable"));
+
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);
+ }
+ return 0;
+}
+
+/*
+ * DELPROP: Ecmascript property deletion.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag) {
+ duk_hstring *key = NULL;
+#if defined(DUK_USE_ES6_PROXY)
+ duk_propdesc desc;
+#endif
+ duk_int_t entry_top;
+ duk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX;
+ duk_bool_t rc;
+
+ DUK_DDD(DUK_DDDPRINT("delprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)",
+ (void *) thr, (void *) tv_obj, (void *) tv_key,
+ (duk_tval *) tv_obj, (duk_tval *) tv_key));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(tv_obj != NULL);
+ DUK_ASSERT(tv_key != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ /* Storing the entry top is cheaper here to ensure stack is correct at exit,
+ * as there are several paths out.
+ */
+ entry_top = duk_get_top(thr);
+
+ if (DUK_TVAL_IS_UNDEFINED(tv_obj) ||
+ DUK_TVAL_IS_NULL(tv_obj)) {
+ DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject"));
+ goto fail_invalid_base_uncond;
+ }
+
+ duk_push_tval(thr, tv_obj);
+ duk_push_tval(thr, tv_key);
+
+ tv_obj = DUK_GET_TVAL_NEGIDX(thr, -2);
+ if (DUK_TVAL_IS_OBJECT(tv_obj)) {
+ duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_obj);
+ DUK_ASSERT(obj != NULL);
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) {
+ duk_hobject *h_target;
+ duk_bool_t tmp_bool;
+
+ /* Note: proxy handling must happen before key is string coerced. */
+
+ if (duk__proxy_check_prop(thr, obj, DUK_STRIDX_DELETE_PROPERTY, tv_key, &h_target)) {
+ /* -> [ ... obj key trap handler ] */
+ DUK_DDD(DUK_DDDPRINT("-> proxy object 'deleteProperty' for key %!T", (duk_tval *) tv_key));
+ duk_push_hobject(thr, h_target); /* target */
+ duk_dup_m4(thr); /* P */
+ duk_call_method(thr, 2 /*nargs*/);
+ tmp_bool = duk_to_boolean(thr, -1);
+ duk_pop_nodecref_unsafe(thr);
+ if (!tmp_bool) {
+ goto fail_proxy_rejected; /* retval indicates delete failed */
+ }
+
+ /* Target object must be checked for a conflicting
+ * non-configurable property.
+ */
+ tv_key = DUK_GET_TVAL_NEGIDX(thr, -1);
+ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);
+ DUK_ASSERT(key != NULL);
+
+ if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */
+ duk_small_int_t desc_reject;
+
+ DUK_DDD(DUK_DDDPRINT("proxy 'deleteProperty': target has matching property %!O, check for "
+ "conflicting property; desc.flags=0x%08lx, "
+ "desc.get=%p, desc.set=%p",
+ (duk_heaphdr *) key, (unsigned long) desc.flags,
+ (void *) desc.get, (void *) desc.set));
+
+ desc_reject = !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE);
+ if (desc_reject) {
+ /* unconditional */
+ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);
+ }
+ }
+ rc = 1; /* success */
+ goto done_rc;
+ }
+
+ obj = h_target; /* resume delete to target */
+ }
+#endif /* DUK_USE_ES6_PROXY */
+
+ arr_idx = duk__to_property_key(thr, -1, &key);
+ DUK_ASSERT(key != NULL);
+
+ rc = duk_hobject_delprop_raw(thr, obj, key, throw_flag ? DUK_DELPROP_FLAG_THROW : 0);
+ goto done_rc;
+ } else if (DUK_TVAL_IS_STRING(tv_obj)) {
+ /* String has .length and array index virtual properties
+ * which can't be deleted. No need for a symbol check;
+ * no offending virtual symbols exist.
+ */
+ /* XXX: unnecessary string coercion for array indices,
+ * intentional to keep small.
+ */
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj);
+ DUK_ASSERT(h != NULL);
+
+ arr_idx = duk__to_property_key(thr, -1, &key);
+ DUK_ASSERT(key != NULL);
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ goto fail_not_configurable;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ arr_idx < DUK_HSTRING_GET_CHARLEN(h)) {
+ goto fail_not_configurable;
+ }
+ } else if (DUK_TVAL_IS_BUFFER(tv_obj)) {
+ /* XXX: unnecessary string coercion for array indices,
+ * intentional to keep small; some overlap with string
+ * handling.
+ */
+ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj);
+ DUK_ASSERT(h != NULL);
+
+ arr_idx = duk__to_property_key(thr, -1, &key);
+ DUK_ASSERT(key != NULL);
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ goto fail_not_configurable;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX &&
+ arr_idx < DUK_HBUFFER_GET_SIZE(h)) {
+ goto fail_not_configurable;
+ }
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) {
+ /* Lightfunc has no virtual properties since Duktape 2.2
+ * so success. Still must coerce key for side effects.
+ */
+
+ arr_idx = duk__to_property_key(thr, -1, &key);
+ DUK_ASSERT(key != NULL);
+ DUK_UNREF(key);
+ }
+
+ /* non-object base, no offending virtual property */
+ rc = 1;
+ goto done_rc;
+
+ done_rc:
+ duk_set_top_unsafe(thr, entry_top);
+ return rc;
+
+ fail_invalid_base_uncond:
+ /* Note: unconditional throw */
+ DUK_ASSERT(duk_get_top(thr) == entry_top);
+#if defined(DUK_USE_PARANOID_ERRORS)
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);
+#else
+ DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot delete property %s of %s",
+ duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));
+#endif
+ return 0;
+
+#if defined(DUK_USE_ES6_PROXY)
+ fail_proxy_rejected:
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);
+ }
+ duk_set_top_unsafe(thr, entry_top);
+ return 0;
+#endif
+
+ fail_not_configurable:
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);
+ }
+ duk_set_top_unsafe(thr, entry_top);
+ return 0;
+}
+
+/*
+ * Internal helper to define a property with specific flags, ignoring
+ * normal semantics such as extensibility, write protection etc.
+ * Overwrites any existing value and attributes unless caller requests
+ * that value only be updated if it doesn't already exists.
+ *
+ * Does not support:
+ * - virtual properties (error if write attempted)
+ * - getter/setter properties (error if write attempted)
+ * - non-default (!= WEC) attributes for array entries (error if attempted)
+ * - array abandoning: if array part exists, it is always extended
+ * - array 'length' updating
+ *
+ * Stack: [... in_val] -> []
+ *
+ * Used for e.g. built-in initialization and environment record
+ * operations.
+ */
+
+DUK_INTERNAL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) {
+ duk_propdesc desc;
+ duk_uint32_t arr_idx;
+ duk_int_t e_idx;
+ duk_tval *tv1 = NULL;
+ duk_tval *tv2 = NULL;
+ duk_small_uint_t propflags = flags & DUK_PROPDESC_FLAGS_MASK; /* mask out flags not actually stored */
+
+ DUK_DDD(DUK_DDDPRINT("define new property (internal): thr=%p, obj=%!O, key=%!O, flags=0x%02lx, val=%!T",
+ (void *) thr, (duk_heaphdr *) obj, (duk_heaphdr *) key,
+ (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1)));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+ DUK_ASSERT(duk_is_valid_index(thr, -1)); /* contains value */
+
+ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);
+
+ if (duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */
+ if (desc.e_idx >= 0) {
+ if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) {
+ DUK_DDD(DUK_DDDPRINT("property already exists in the entry part -> skip as requested"));
+ goto pop_exit;
+ }
+ DUK_DDD(DUK_DDDPRINT("property already exists in the entry part -> update value and attributes"));
+ if (DUK_UNLIKELY(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx))) {
+ DUK_D(DUK_DPRINT("existing property is an accessor, not supported"));
+ goto error_internal;
+ }
+
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, propflags);
+ tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx);
+ } else if (desc.a_idx >= 0) {
+ if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) {
+ DUK_DDD(DUK_DDDPRINT("property already exists in the array part -> skip as requested"));
+ goto pop_exit;
+ }
+ DUK_DDD(DUK_DDDPRINT("property already exists in the array part -> update value (assert attributes)"));
+ if (propflags != DUK_PROPDESC_FLAGS_WEC) {
+ DUK_D(DUK_DPRINT("existing property in array part, but propflags not WEC (0x%02lx)",
+ (unsigned long) propflags));
+ goto error_internal;
+ }
+
+ tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx);
+ } else {
+ if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) {
+ DUK_DDD(DUK_DDDPRINT("property already exists but is virtual -> skip as requested"));
+ goto pop_exit;
+ }
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ duk_uint32_t new_len;
+#if defined(DUK_USE_DEBUG)
+ duk_uint32_t prev_len;
+ prev_len = ((duk_harray *) obj)->length;
+#endif
+ new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1));
+ ((duk_harray *) obj)->length = new_len;
+ DUK_D(DUK_DPRINT("internal define property for array .length: %ld -> %ld",
+ (long) prev_len, (long) ((duk_harray *) obj)->length));
+ goto pop_exit;
+ }
+ DUK_DD(DUK_DDPRINT("property already exists but is virtual -> failure"));
+ goto error_virtual;
+ }
+
+ goto write_value;
+ }
+
+ if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ if (arr_idx != DUK__NO_ARRAY_INDEX) {
+ DUK_DDD(DUK_DDDPRINT("property does not exist, object has array part -> possibly extend array part and write value (assert attributes)"));
+ DUK_ASSERT(propflags == DUK_PROPDESC_FLAGS_WEC);
+
+ /* always grow the array, no sparse / abandon support here */
+ if (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) {
+ duk__grow_props_for_array_item(thr, obj, arr_idx);
+ }
+
+ DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj));
+ tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx);
+ goto write_value;
+ }
+ }
+
+ DUK_DDD(DUK_DDDPRINT("property does not exist, object belongs in entry part -> allocate new entry and write value and attributes"));
+ e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); /* increases key refcount */
+ DUK_ASSERT(e_idx >= 0);
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, propflags);
+ tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx);
+ /* new entry: previous value is garbage; set to undefined to share write_value */
+ DUK_TVAL_SET_UNDEFINED(tv1);
+ goto write_value;
+
+ write_value:
+ /* tv1 points to value storage */
+
+ tv2 = duk_require_tval(thr, -1); /* late lookup, avoid side effects */
+ DUK_DDD(DUK_DDDPRINT("writing/updating value: %!T -> %!T",
+ (duk_tval *) tv1, (duk_tval *) tv2));
+
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */
+ goto pop_exit;
+
+ pop_exit:
+ duk_pop_unsafe(thr); /* remove in_val */
+ return;
+
+ error_virtual: /* share error message */
+ error_internal:
+ DUK_ERROR_INTERNAL(thr);
+ return;
+}
+
+/*
+ * Fast path for defining array indexed values without interning the key.
+ * This is used by e.g. code for Array prototype and traceback creation so
+ * must avoid interning.
+ */
+
+DUK_INTERNAL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags) {
+ duk_hstring *key;
+ duk_tval *tv1, *tv2;
+
+ DUK_DDD(DUK_DDDPRINT("define new property (internal) arr_idx fast path: thr=%p, obj=%!O, "
+ "arr_idx=%ld, flags=0x%02lx, val=%!T",
+ (void *) thr, obj, (long) arr_idx, (unsigned long) flags,
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));
+
+ if (DUK_HOBJECT_HAS_ARRAY_PART(obj) &&
+ arr_idx != DUK__NO_ARRAY_INDEX &&
+ flags == DUK_PROPDESC_FLAGS_WEC) {
+ DUK_ASSERT((flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) == 0); /* covered by comparison */
+
+ DUK_DDD(DUK_DDDPRINT("define property to array part (property may or may not exist yet)"));
+
+ /* always grow the array, no sparse / abandon support here */
+ if (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) {
+ duk__grow_props_for_array_item(thr, obj, arr_idx);
+ }
+
+ DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj));
+ tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx);
+ tv2 = duk_require_tval(thr, -1);
+
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */
+
+ duk_pop_unsafe(thr); /* [ ...val ] -> [ ... ] */
+ return;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("define property fast path didn't work, use slow path"));
+
+ key = duk_push_uint_to_hstring(thr, (duk_uint_t) arr_idx);
+ DUK_ASSERT(key != NULL);
+ duk_insert(thr, -2); /* [ ... val key ] -> [ ... key val ] */
+
+ duk_hobject_define_property_internal(thr, obj, key, flags);
+
+ duk_pop_unsafe(thr); /* [ ... key ] -> [ ... ] */
+}
+
+/*
+ * Internal helpers for managing object 'length'
+ */
+
+DUK_INTERNAL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj) {
+ duk_double_t val;
+
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(obj != NULL);
+
+ /* Fast path for Arrays. */
+ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ return ((duk_harray *) obj)->length;
+ }
+
+ /* Slow path, .length can be e.g. accessor, obj can be a Proxy, etc. */
+ duk_push_hobject(thr, obj);
+ duk_push_hstring_stridx(thr, DUK_STRIDX_LENGTH);
+ (void) duk_hobject_getprop(thr,
+ DUK_GET_TVAL_NEGIDX(thr, -2),
+ DUK_GET_TVAL_NEGIDX(thr, -1));
+ val = duk_to_number_m1(thr);
+ duk_pop_3_unsafe(thr);
+
+ /* This isn't part of Ecmascript semantics; return a value within
+ * duk_size_t range, or 0 otherwise.
+ */
+ if (val >= 0.0 && val <= (duk_double_t) DUK_SIZE_MAX) {
+ return (duk_size_t) val;
+ }
+ return 0;
+}
+
+/*
+ * Fast finalizer check for an object. Walks the prototype chain, checking
+ * for finalizer presence using DUK_HOBJECT_FLAG_HAVE_FINALIZER which is kept
+ * in sync with the actual property when setting/removing the finalizer.
+ */
+
+#if defined(DUK_USE_HEAPPTR16)
+DUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj) {
+#else
+DUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj) {
+#endif
+ duk_uint_t sanity;
+
+ DUK_ASSERT(obj != NULL);
+
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ if (DUK_UNLIKELY(DUK_HOBJECT_HAS_HAVE_FINALIZER(obj))) {
+ return 1;
+ }
+ if (DUK_UNLIKELY(sanity-- == 0)) {
+ DUK_D(DUK_DPRINT("prototype loop when checking for finalizer existence; returning false"));
+ return 0;
+ }
+#if defined(DUK_USE_HEAPPTR16)
+ DUK_ASSERT(heap != NULL);
+ obj = DUK_HOBJECT_GET_PROTOTYPE(heap, obj);
+#else
+ obj = DUK_HOBJECT_GET_PROTOTYPE(NULL, obj); /* 'heap' arg ignored */
+#endif
+ } while (obj != NULL);
+
+ return 0;
+}
+
+/*
+ * Object.getOwnPropertyDescriptor() (E5 Sections 15.2.3.3, 8.10.4)
+ *
+ * [ ... key ] -> [ ... desc/undefined ]
+ */
+
+DUK_INTERNAL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx) {
+ duk_hobject *obj;
+ duk_hstring *key;
+ duk_propdesc pd;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+
+ obj = duk_require_hobject_promote_mask(thr, obj_idx, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+ key = duk_to_property_key_hstring(thr, -1);
+ DUK_ASSERT(key != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ if (!duk_hobject_get_own_propdesc(thr, obj, key, &pd, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ duk_push_undefined(thr);
+ duk_remove_m2(thr);
+ return;
+ }
+
+ duk_push_object(thr);
+
+ /* [ ... key value desc ] */
+
+ if (DUK_PROPDESC_IS_ACCESSOR(&pd)) {
+ /* If a setter/getter is missing (undefined), the descriptor must
+ * still have the property present with the value 'undefined'.
+ */
+ if (pd.get) {
+ duk_push_hobject(thr, pd.get);
+ } else {
+ duk_push_undefined(thr);
+ }
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_GET);
+ if (pd.set) {
+ duk_push_hobject(thr, pd.set);
+ } else {
+ duk_push_undefined(thr);
+ }
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_SET);
+ } else {
+ duk_dup_m2(thr);
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_VALUE);
+ duk_push_boolean(thr, DUK_PROPDESC_IS_WRITABLE(&pd));
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_WRITABLE);
+ }
+ duk_push_boolean(thr, DUK_PROPDESC_IS_ENUMERABLE(&pd));
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_ENUMERABLE);
+ duk_push_boolean(thr, DUK_PROPDESC_IS_CONFIGURABLE(&pd));
+ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_CONFIGURABLE);
+
+ /* [ ... key value desc ] */
+
+ duk_replace(thr, -3);
+ duk_pop_unsafe(thr); /* -> [ ... desc ] */
+}
+
+/*
+ * NormalizePropertyDescriptor() related helper.
+ *
+ * Internal helper which validates and normalizes a property descriptor
+ * represented as an Ecmascript object (e.g. argument to defineProperty()).
+ * The output of this conversion is a set of defprop_flags and possibly
+ * some values pushed on the value stack to (1) ensure borrowed pointers
+ * remain valid, and (2) avoid unnecessary pops for footprint reasons.
+ * Caller must manage stack top carefully because the number of values
+ * pushed depends on the input property descriptor.
+ *
+ * The original descriptor object must not be altered in the process.
+ */
+
+/* XXX: very basic optimization -> duk_get_prop_stridx_top */
+
+DUK_INTERNAL
+void duk_hobject_prepare_property_descriptor(duk_hthread *thr,
+ duk_idx_t idx_in,
+ duk_uint_t *out_defprop_flags,
+ duk_idx_t *out_idx_value,
+ duk_hobject **out_getter,
+ duk_hobject **out_setter) {
+ duk_idx_t idx_value = -1;
+ duk_hobject *getter = NULL;
+ duk_hobject *setter = NULL;
+ duk_bool_t is_data_desc = 0;
+ duk_bool_t is_acc_desc = 0;
+ duk_uint_t defprop_flags = 0;
+
+ DUK_ASSERT(out_defprop_flags != NULL);
+ DUK_ASSERT(out_idx_value != NULL);
+ DUK_ASSERT(out_getter != NULL);
+ DUK_ASSERT(out_setter != NULL);
+ DUK_ASSERT(idx_in <= 0x7fffL); /* short variants would be OK, but not used to avoid shifts */
+
+ /* Must be an object, otherwise TypeError (E5.1 Section 8.10.5, step 1). */
+ idx_in = duk_require_normalize_index(thr, idx_in);
+ (void) duk_require_hobject(thr, idx_in);
+
+ /* The coercion order must match the ToPropertyDescriptor() algorithm
+ * so that side effects in coercion happen in the correct order.
+ * (This order also happens to be compatible with duk_def_prop(),
+ * although it doesn't matter in practice.)
+ */
+
+ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_VALUE)) {
+ is_data_desc = 1;
+ defprop_flags |= DUK_DEFPROP_HAVE_VALUE;
+ idx_value = duk_get_top_index(thr);
+ }
+
+ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_WRITABLE)) {
+ is_data_desc = 1;
+ if (duk_to_boolean(thr, -1)) {
+ defprop_flags |= DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE;
+ } else {
+ defprop_flags |= DUK_DEFPROP_HAVE_WRITABLE;
+ }
+ }
+
+ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_GET)) {
+ duk_tval *tv = duk_require_tval(thr, -1);
+ duk_hobject *h_get;
+
+ if (DUK_TVAL_IS_UNDEFINED(tv)) {
+ /* undefined is accepted */
+ DUK_ASSERT(getter == NULL);
+ } else {
+ /* NOTE: lightfuncs are coerced to full functions because
+ * lightfuncs don't fit into a property value slot. This
+ * has some side effects, see test-dev-lightfunc-accessor.js.
+ */
+ h_get = duk_get_hobject_promote_lfunc(thr, -1);
+ if (h_get == NULL || !DUK_HOBJECT_IS_CALLABLE(h_get)) {
+ goto type_error;
+ }
+ getter = h_get;
+ }
+ is_acc_desc = 1;
+ defprop_flags |= DUK_DEFPROP_HAVE_GETTER;
+ }
+
+ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_SET)) {
+ duk_tval *tv = duk_require_tval(thr, -1);
+ duk_hobject *h_set;
+
+ if (DUK_TVAL_IS_UNDEFINED(tv)) {
+ /* undefined is accepted */
+ DUK_ASSERT(setter == NULL);
+ } else {
+ /* NOTE: lightfuncs are coerced to full functions because
+ * lightfuncs don't fit into a property value slot. This
+ * has some side effects, see test-dev-lightfunc-accessor.js.
+ */
+ h_set = duk_get_hobject_promote_lfunc(thr, -1);
+ if (h_set == NULL || !DUK_HOBJECT_IS_CALLABLE(h_set)) {
+ goto type_error;
+ }
+ setter = h_set;
+ }
+ is_acc_desc = 1;
+ defprop_flags |= DUK_DEFPROP_HAVE_SETTER;
+ }
+
+ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_ENUMERABLE)) {
+ if (duk_to_boolean(thr, -1)) {
+ defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE;
+ } else {
+ defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE;
+ }
+ }
+
+ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_CONFIGURABLE)) {
+ if (duk_to_boolean(thr, -1)) {
+ defprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE;
+ } else {
+ defprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE;
+ }
+ }
+
+ if (is_data_desc && is_acc_desc) {
+ goto type_error;
+ }
+
+ *out_defprop_flags = defprop_flags;
+ *out_idx_value = idx_value;
+ *out_getter = getter;
+ *out_setter = setter;
+
+ /* [ ... [multiple values] ] */
+ return;
+
+ type_error:
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR);
+}
+
+/*
+ * Object.defineProperty() related helper (E5 Section 15.2.3.6).
+ * Also handles ES2015 Reflect.defineProperty().
+ *
+ * Inlines all [[DefineOwnProperty]] exotic behaviors.
+ *
+ * Note: Ecmascript compliant [[DefineOwnProperty]](P, Desc, Throw) is not
+ * implemented directly, but Object.defineProperty() serves its purpose.
+ * We don't need the [[DefineOwnProperty]] internally and we don't have a
+ * property descriptor with 'missing values' so it's easier to avoid it
+ * entirely.
+ *
+ * Note: this is only called for actual objects, not primitive values.
+ * This must support virtual properties for full objects (e.g. Strings)
+ * but not for plain values (e.g. strings). Lightfuncs, even though
+ * primitive in a sense, are treated like objects and accepted as target
+ * values.
+ */
+
+/* XXX: this is a major target for size optimization */
+DUK_INTERNAL
+duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr,
+ duk_uint_t defprop_flags,
+ duk_hobject *obj,
+ duk_hstring *key,
+ duk_idx_t idx_value,
+ duk_hobject *get,
+ duk_hobject *set,
+ duk_bool_t throw_flag) {
+ duk_uint32_t arr_idx;
+ duk_tval tv;
+ duk_bool_t has_enumerable;
+ duk_bool_t has_configurable;
+ duk_bool_t has_writable;
+ duk_bool_t has_value;
+ duk_bool_t has_get;
+ duk_bool_t has_set;
+ duk_bool_t is_enumerable;
+ duk_bool_t is_configurable;
+ duk_bool_t is_writable;
+ duk_bool_t force_flag;
+ duk_small_uint_t new_flags;
+ duk_propdesc curr;
+ duk_uint32_t arridx_new_array_length; /* != 0 => post-update for array 'length' (used when key is an array index) */
+ duk_uint32_t arrlen_old_len;
+ duk_uint32_t arrlen_new_len;
+ duk_bool_t pending_write_protect;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+ DUK_ASSERT(key != NULL);
+ /* idx_value may be < 0 (no value), set and get may be NULL */
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+ /* All the flags fit in 16 bits, so will fit into duk_bool_t. */
+
+ has_writable = (defprop_flags & DUK_DEFPROP_HAVE_WRITABLE);
+ has_enumerable = (defprop_flags & DUK_DEFPROP_HAVE_ENUMERABLE);
+ has_configurable = (defprop_flags & DUK_DEFPROP_HAVE_CONFIGURABLE);
+ has_value = (defprop_flags & DUK_DEFPROP_HAVE_VALUE);
+ has_get = (defprop_flags & DUK_DEFPROP_HAVE_GETTER);
+ has_set = (defprop_flags & DUK_DEFPROP_HAVE_SETTER);
+ is_writable = (defprop_flags & DUK_DEFPROP_WRITABLE);
+ is_enumerable = (defprop_flags & DUK_DEFPROP_ENUMERABLE);
+ is_configurable = (defprop_flags & DUK_DEFPROP_CONFIGURABLE);
+ force_flag = (defprop_flags & DUK_DEFPROP_FORCE);
+
+ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);
+
+ arridx_new_array_length = 0;
+ pending_write_protect = 0;
+ arrlen_old_len = 0;
+ arrlen_new_len = 0;
+
+ DUK_DDD(DUK_DDDPRINT("has_enumerable=%ld is_enumerable=%ld "
+ "has_configurable=%ld is_configurable=%ld "
+ "has_writable=%ld is_writable=%ld "
+ "has_value=%ld value=%!T "
+ "has_get=%ld get=%p=%!O "
+ "has_set=%ld set=%p=%!O "
+ "arr_idx=%ld throw_flag=!%ld",
+ (long) has_enumerable, (long) is_enumerable,
+ (long) has_configurable, (long) is_configurable,
+ (long) has_writable, (long) is_writable,
+ (long) has_value, (duk_tval *) (idx_value >= 0 ? duk_get_tval(thr, idx_value) : NULL),
+ (long) has_get, (void *) get, (duk_heaphdr *) get,
+ (long) has_set, (void *) set, (duk_heaphdr *) set,
+ (long) arr_idx, (long) throw_flag));
+
+ /*
+ * Array exotic behaviors can be implemented at this point. The local variables
+ * are essentially a 'value copy' of the input descriptor (Desc), which is modified
+ * by the Array [[DefineOwnProperty]] (E5 Section 15.4.5.1).
+ */
+
+ if (!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ goto skip_array_exotic;
+ }
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {
+ duk_harray *a;
+
+ /* E5 Section 15.4.5.1, step 3, steps a - i are implemented here, j - n at the end */
+ if (!has_value) {
+ DUK_DDD(DUK_DDDPRINT("exotic array behavior for 'length', but no value in descriptor -> normal behavior"));
+ goto skip_array_exotic;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("exotic array behavior for 'length', value present in descriptor -> exotic behavior"));
+
+ /*
+ * Get old and new length
+ */
+
+ a = (duk_harray *) obj;
+ DUK_ASSERT_HARRAY_VALID(a);
+ arrlen_old_len = a->length;
+
+ DUK_ASSERT(idx_value >= 0);
+ arrlen_new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_POSIDX(thr, idx_value));
+ duk_push_u32(thr, arrlen_new_len);
+ duk_replace(thr, idx_value); /* step 3.e: replace 'Desc.[[Value]]' */
+
+ DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld", (long) arrlen_old_len, (long) arrlen_new_len));
+
+ if (arrlen_new_len >= arrlen_old_len) {
+ /* standard behavior, step 3.f.i */
+ DUK_DDD(DUK_DDDPRINT("new length is same or higher as previous => standard behavior"));
+ goto skip_array_exotic;
+ }
+ DUK_DDD(DUK_DDDPRINT("new length is smaller than previous => exotic post behavior"));
+
+ /* XXX: consolidated algorithm step 15.f -> redundant? */
+ if (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) {
+ /* Array .length is always non-configurable; if it's also
+ * non-writable, don't allow it to be written.
+ */
+ goto fail_not_configurable;
+ }
+
+ /* steps 3.h and 3.i */
+ if (has_writable && !is_writable) {
+ DUK_DDD(DUK_DDDPRINT("desc writable is false, force it back to true, and flag pending write protect"));
+ is_writable = 1;
+ pending_write_protect = 1;
+ }
+
+ /* remaining actual steps are carried out if standard DefineOwnProperty succeeds */
+ } else if (arr_idx != DUK__NO_ARRAY_INDEX) {
+ /* XXX: any chance of unifying this with the 'length' key handling? */
+
+ /* E5 Section 15.4.5.1, step 4 */
+ duk_uint32_t old_len;
+ duk_harray *a;
+
+ a = (duk_harray *) obj;
+ DUK_ASSERT_HARRAY_VALID(a);
+
+ old_len = a->length;
+
+ if (arr_idx >= old_len) {
+ DUK_DDD(DUK_DDDPRINT("defineProperty requires array length update "
+ "(arr_idx=%ld, old_len=%ld)",
+ (long) arr_idx, (long) old_len));
+
+ if (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) {
+ /* Array .length is always non-configurable, so
+ * if it's also non-writable, don't allow a value
+ * write. With force flag allow writing.
+ */
+ goto fail_not_configurable;
+ }
+
+ /* actual update happens once write has been completed without
+ * error below.
+ */
+ DUK_ASSERT(arr_idx != 0xffffffffUL);
+ arridx_new_array_length = arr_idx + 1;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("defineProperty does not require length update "
+ "(arr_idx=%ld, old_len=%ld) -> standard behavior",
+ (long) arr_idx, (long) old_len));
+ }
+ }
+ skip_array_exotic:
+
+ /* XXX: There is currently no support for writing buffer object
+ * indexed elements here. Attempt to do so will succeed and
+ * write a concrete property into the buffer object. This should
+ * be fixed at some point but because buffers are a custom feature
+ * anyway, this is relatively unimportant.
+ */
+
+ /*
+ * Actual Object.defineProperty() default algorithm.
+ */
+
+ /*
+ * First check whether property exists; if not, simple case. This covers
+ * steps 1-4.
+ */
+
+ if (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE)) {
+ DUK_DDD(DUK_DDDPRINT("property does not exist"));
+
+ if (!DUK_HOBJECT_HAS_EXTENSIBLE(obj) && !force_flag) {
+ goto fail_not_extensible;
+ }
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ /* ROM objects are never extensible but force flag may
+ * allow us to come here anyway.
+ */
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj) || !DUK_HOBJECT_HAS_EXTENSIBLE(obj));
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {
+ DUK_D(DUK_DPRINT("attempt to define property on a read-only target object"));
+ goto fail_not_configurable;
+ }
+#endif
+
+ /* XXX: share final setting code for value and flags? difficult because
+ * refcount code is different. Share entry allocation? But can't allocate
+ * until array index checked.
+ */
+
+ /* steps 4.a and 4.b are tricky */
+ if (has_set || has_get) {
+ duk_int_t e_idx;
+
+ DUK_DDD(DUK_DDDPRINT("create new accessor property"));
+
+ DUK_ASSERT(has_set || set == NULL);
+ DUK_ASSERT(has_get || get == NULL);
+ DUK_ASSERT(!has_value);
+ DUK_ASSERT(!has_writable);
+
+ new_flags = DUK_PROPDESC_FLAG_ACCESSOR; /* defaults, E5 Section 8.6.1, Table 7 */
+ if (has_enumerable && is_enumerable) {
+ new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE;
+ }
+ if (has_configurable && is_configurable) {
+ new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ DUK_DDD(DUK_DDDPRINT("accessor cannot go to array part, abandon array"));
+ duk__abandon_array_checked(thr, obj);
+ }
+
+ /* write to entry part */
+ e_idx = duk__hobject_alloc_entry_checked(thr, obj, key);
+ DUK_ASSERT(e_idx >= 0);
+
+ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, e_idx, get);
+ DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, e_idx, set);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, get);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, set);
+
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags);
+ goto success_exotics;
+ } else {
+ duk_int_t e_idx;
+ duk_tval *tv2;
+
+ DUK_DDD(DUK_DDDPRINT("create new data property"));
+
+ DUK_ASSERT(!has_set);
+ DUK_ASSERT(!has_get);
+
+ new_flags = 0; /* defaults, E5 Section 8.6.1, Table 7 */
+ if (has_writable && is_writable) {
+ new_flags |= DUK_PROPDESC_FLAG_WRITABLE;
+ }
+ if (has_enumerable && is_enumerable) {
+ new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE;
+ }
+ if (has_configurable && is_configurable) {
+ new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;
+ }
+ if (has_value) {
+ duk_tval *tv_tmp = duk_require_tval(thr, idx_value);
+ DUK_TVAL_SET_TVAL(&tv, tv_tmp);
+ } else {
+ DUK_TVAL_SET_UNDEFINED(&tv); /* default value */
+ }
+
+ if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) {
+ if (new_flags == DUK_PROPDESC_FLAGS_WEC) {
+#if 0
+ DUK_DDD(DUK_DDDPRINT("new data property attributes match array defaults, attempt to write to array part"));
+ /* may become sparse...*/
+#endif
+ /* XXX: handling for array part missing now; this doesn't affect
+ * compliance but causes array entry writes using defineProperty()
+ * to always abandon array part.
+ */
+ }
+ DUK_DDD(DUK_DDDPRINT("new data property cannot go to array part, abandon array"));
+ duk__abandon_array_checked(thr, obj);
+ /* fall through */
+ }
+
+ /* write to entry part */
+ e_idx = duk__hobject_alloc_entry_checked(thr, obj, key);
+ DUK_ASSERT(e_idx >= 0);
+ tv2 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx);
+ DUK_TVAL_SET_TVAL(tv2, &tv);
+ DUK_TVAL_INCREF(thr, tv2);
+
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags);
+ goto success_exotics;
+ }
+ DUK_UNREACHABLE();
+ }
+
+ /* we currently assume virtual properties are not configurable (as none of them are) */
+ DUK_ASSERT((curr.e_idx >= 0 || curr.a_idx >= 0) || !(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE));
+
+ /* [obj key desc value get set curr_value] */
+
+ /*
+ * Property already exists. Steps 5-6 detect whether any changes need
+ * to be made.
+ */
+
+ if (has_enumerable) {
+ if (is_enumerable) {
+ if (!(curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE)) {
+ goto need_check;
+ }
+ } else {
+ if (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) {
+ goto need_check;
+ }
+ }
+ }
+ if (has_configurable) {
+ if (is_configurable) {
+ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) {
+ goto need_check;
+ }
+ } else {
+ if (curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) {
+ goto need_check;
+ }
+ }
+ }
+ if (has_value) {
+ duk_tval *tmp1;
+ duk_tval *tmp2;
+
+ /* attempt to change from accessor to data property */
+ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ goto need_check;
+ }
+
+ tmp1 = duk_require_tval(thr, -1); /* curr value */
+ tmp2 = duk_require_tval(thr, idx_value); /* new value */
+ if (!duk_js_samevalue(tmp1, tmp2)) {
+ goto need_check;
+ }
+ }
+ if (has_writable) {
+ /* attempt to change from accessor to data property */
+ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ goto need_check;
+ }
+
+ if (is_writable) {
+ if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE)) {
+ goto need_check;
+ }
+ } else {
+ if (curr.flags & DUK_PROPDESC_FLAG_WRITABLE) {
+ goto need_check;
+ }
+ }
+ }
+ if (has_set) {
+ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ if (set != curr.set) {
+ goto need_check;
+ }
+ } else {
+ goto need_check;
+ }
+ }
+ if (has_get) {
+ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ if (get != curr.get) {
+ goto need_check;
+ }
+ } else {
+ goto need_check;
+ }
+ }
+
+ /* property exists, either 'desc' is empty, or all values
+ * match (SameValue)
+ */
+ goto success_no_exotics;
+
+ need_check:
+
+ /*
+ * Some change(s) need to be made. Steps 7-11.
+ */
+
+ /* shared checks for all descriptor types */
+ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {
+ if (has_configurable && is_configurable) {
+ goto fail_not_configurable;
+ }
+ if (has_enumerable) {
+ if (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) {
+ if (!is_enumerable) {
+ goto fail_not_configurable;
+ }
+ } else {
+ if (is_enumerable) {
+ goto fail_not_configurable;
+ }
+ }
+ }
+ }
+
+ /* Virtual properties don't have backing so they can't mostly be
+ * edited. Some virtual properties are, however, writable: for
+ * example, virtual index properties of buffer objects and Array
+ * instance .length. These are not configurable so the checks
+ * above mostly cover attempts to change them, except when the
+ * duk_def_prop() call is used with DUK_DEFPROP_FORCE; even in
+ * that case we can't forcibly change the property attributes
+ * because they don't have concrete backing.
+ */
+
+ /* XXX: for ROM objects too it'd be best if value modify was
+ * allowed if the value matches SameValue.
+ */
+ /* Reject attempt to change a read-only object. */
+#if defined(DUK_USE_ROM_OBJECTS)
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {
+ DUK_DD(DUK_DDPRINT("attempt to define property on read-only target object"));
+ goto fail_not_configurable;
+ }
+#endif
+
+ /* descriptor type specific checks */
+ if (has_set || has_get) {
+ /* IsAccessorDescriptor(desc) == true */
+ DUK_ASSERT(!has_writable);
+ DUK_ASSERT(!has_value);
+
+ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ /* curr and desc are accessors */
+ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {
+ if (has_set && set != curr.set) {
+ goto fail_not_configurable;
+ }
+ if (has_get && get != curr.get) {
+ goto fail_not_configurable;
+ }
+ }
+ } else {
+ duk_bool_t rc;
+ duk_tval *tv1;
+
+ /* curr is data, desc is accessor */
+ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {
+ goto fail_not_configurable;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("convert property to accessor property"));
+ if (curr.a_idx >= 0) {
+ DUK_DDD(DUK_DDDPRINT("property to convert is stored in an array entry, abandon array and re-lookup"));
+ duk__abandon_array_checked(thr, obj);
+ duk_pop_unsafe(thr); /* remove old value */
+ rc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE);
+ DUK_UNREF(rc);
+ DUK_ASSERT(rc != 0);
+ DUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0);
+ }
+ if (curr.e_idx < 0) {
+ DUK_ASSERT(curr.a_idx < 0 && curr.e_idx < 0);
+ goto fail_virtual; /* safeguard for virtual property */
+ }
+
+ DUK_ASSERT(curr.e_idx >= 0);
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));
+
+ tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx);
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv1); /* XXX: just decref */
+
+ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL);
+ DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL);
+ DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx);
+ DUK_HOBJECT_E_SLOT_SET_ACCESSOR(thr->heap, obj, curr.e_idx);
+
+ DUK_DDD(DUK_DDDPRINT("flags after data->accessor conversion: 0x%02lx",
+ (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx)));
+ /* Update curr.flags; faster than a re-lookup. */
+ curr.flags &= ~DUK_PROPDESC_FLAG_WRITABLE;
+ curr.flags |= DUK_PROPDESC_FLAG_ACCESSOR;
+ }
+ } else if (has_value || has_writable) {
+ /* IsDataDescriptor(desc) == true */
+ DUK_ASSERT(!has_set);
+ DUK_ASSERT(!has_get);
+
+ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ duk_hobject *tmp;
+
+ /* curr is accessor, desc is data */
+ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {
+ goto fail_not_configurable;
+ }
+
+ /* curr is accessor -> cannot be in array part. */
+ DUK_ASSERT(curr.a_idx < 0);
+ if (curr.e_idx < 0) {
+ goto fail_virtual; /* safeguard; no virtual accessors now */
+ }
+
+ DUK_DDD(DUK_DDDPRINT("convert property to data property"));
+
+ DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));
+ tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx);
+ DUK_UNREF(tmp);
+ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);
+ tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx);
+ DUK_UNREF(tmp);
+ DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);
+
+ DUK_TVAL_SET_UNDEFINED(DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx));
+ DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx);
+ DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(thr->heap, obj, curr.e_idx);
+
+ DUK_DDD(DUK_DDDPRINT("flags after accessor->data conversion: 0x%02lx",
+ (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx)));
+
+ /* Update curr.flags; faster than a re-lookup. */
+ curr.flags &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ACCESSOR);
+ } else {
+ /* curr and desc are data */
+ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {
+ if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_writable && is_writable) {
+ goto fail_not_configurable;
+ }
+ /* Note: changing from writable to non-writable is OK */
+ if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_value) {
+ duk_tval *tmp1 = duk_require_tval(thr, -1); /* curr value */
+ duk_tval *tmp2 = duk_require_tval(thr, idx_value); /* new value */
+ if (!duk_js_samevalue(tmp1, tmp2)) {
+ goto fail_not_configurable;
+ }
+ }
+ }
+ }
+ } else {
+ /* IsGenericDescriptor(desc) == true; this means in practice that 'desc'
+ * only has [[Enumerable]] or [[Configurable]] flag updates, which are
+ * allowed at this point.
+ */
+
+ DUK_ASSERT(!has_value && !has_writable && !has_get && !has_set);
+ }
+
+ /*
+ * Start doing property attributes updates. Steps 12-13.
+ *
+ * Start by computing new attribute flags without writing yet.
+ * Property type conversion is done above if necessary.
+ */
+
+ new_flags = curr.flags;
+
+ if (has_enumerable) {
+ if (is_enumerable) {
+ new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE;
+ } else {
+ new_flags &= ~DUK_PROPDESC_FLAG_ENUMERABLE;
+ }
+ }
+ if (has_configurable) {
+ if (is_configurable) {
+ new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;
+ } else {
+ new_flags &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;
+ }
+ }
+ if (has_writable) {
+ if (is_writable) {
+ new_flags |= DUK_PROPDESC_FLAG_WRITABLE;
+ } else {
+ new_flags &= ~DUK_PROPDESC_FLAG_WRITABLE;
+ }
+ }
+
+ /* XXX: write protect after flag? -> any chance of handling it here? */
+
+ DUK_DDD(DUK_DDDPRINT("new flags that we want to write: 0x%02lx",
+ (unsigned long) new_flags));
+
+ /*
+ * Check whether we need to abandon an array part (if it exists)
+ */
+
+ if (curr.a_idx >= 0) {
+ duk_bool_t rc;
+
+ DUK_ASSERT(curr.e_idx < 0);
+
+ if (new_flags == DUK_PROPDESC_FLAGS_WEC) {
+ duk_tval *tv1, *tv2;
+
+ DUK_DDD(DUK_DDDPRINT("array index, new property attributes match array defaults, update in-place"));
+
+ DUK_ASSERT(curr.flags == DUK_PROPDESC_FLAGS_WEC); /* must have been, since in array part */
+ DUK_ASSERT(!has_set);
+ DUK_ASSERT(!has_get);
+ DUK_ASSERT(idx_value >= 0); /* must be: if attributes match and we get here the value must differ (otherwise no change) */
+
+ tv2 = duk_require_tval(thr, idx_value);
+ tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, curr.a_idx);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects; may invalidate a_idx */
+ goto success_exotics;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("array index, new property attributes do not match array defaults, abandon array and re-lookup"));
+ duk__abandon_array_checked(thr, obj);
+ duk_pop_unsafe(thr); /* remove old value */
+ rc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE);
+ DUK_UNREF(rc);
+ DUK_ASSERT(rc != 0);
+ DUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("updating existing property in entry part"));
+
+ /* Array case is handled comprehensively above: either in entry
+ * part or a virtual property.
+ */
+ DUK_ASSERT(curr.a_idx < 0);
+
+ DUK_DDD(DUK_DDDPRINT("update existing property attributes"));
+ if (curr.e_idx >= 0) {
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, curr.e_idx, new_flags);
+ } else {
+ /* For Array .length the only allowed transition is for .length
+ * to become non-writable.
+ */
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ duk_harray *a;
+ a = (duk_harray *) obj;
+ DUK_DD(DUK_DDPRINT("Object.defineProperty() attribute update for duk_harray .length -> %02lx", (unsigned long) new_flags));
+ DUK_ASSERT_HARRAY_VALID(a);
+ if ((new_flags & DUK_PROPDESC_FLAGS_EC) != (curr.flags & DUK_PROPDESC_FLAGS_EC)) {
+ DUK_D(DUK_DPRINT("Object.defineProperty() attempt to change virtual array .length enumerable or configurable attribute, fail"));
+ goto fail_virtual;
+ }
+ if (new_flags & DUK_PROPDESC_FLAG_WRITABLE) {
+ DUK_HARRAY_SET_LENGTH_WRITABLE(a);
+ } else {
+ DUK_HARRAY_SET_LENGTH_NONWRITABLE(a);
+ }
+ }
+ }
+
+ if (has_set) {
+ duk_hobject *tmp;
+
+ /* Virtual properties are non-configurable but with a 'force'
+ * flag we might come here so check explicitly for virtual.
+ */
+ if (curr.e_idx < 0) {
+ goto fail_virtual;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("update existing property setter"));
+ DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));
+
+ tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx);
+ DUK_UNREF(tmp);
+ DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, set);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, set);
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); /* side effects; may invalidate e_idx */
+ }
+ if (has_get) {
+ duk_hobject *tmp;
+
+ if (curr.e_idx < 0) {
+ goto fail_virtual;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("update existing property getter"));
+ DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));
+
+ tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx);
+ DUK_UNREF(tmp);
+ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, get);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, get);
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); /* side effects; may invalidate e_idx */
+ }
+ if (has_value) {
+ duk_tval *tv1, *tv2;
+
+ DUK_DDD(DUK_DDDPRINT("update existing property value"));
+
+ if (curr.e_idx >= 0) {
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));
+ tv2 = duk_require_tval(thr, idx_value);
+ tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects; may invalidate e_idx */
+ } else {
+ DUK_ASSERT(curr.a_idx < 0); /* array part case handled comprehensively previously */
+
+ DUK_DD(DUK_DDPRINT("Object.defineProperty(), value update for virtual property"));
+ /* XXX: Uint8Array and other typed array virtual writes not currently
+ * handled.
+ */
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ duk_harray *a;
+ a = (duk_harray *) obj;
+ DUK_DD(DUK_DDPRINT("Object.defineProperty() value update for duk_harray .length -> %ld", (long) arrlen_new_len));
+ DUK_ASSERT_HARRAY_VALID(a);
+ a->length = arrlen_new_len;
+ } else {
+ goto fail_virtual; /* should not happen */
+ }
+ }
+ }
+
+ /*
+ * Standard algorithm succeeded without errors, check for exotic post-behaviors.
+ *
+ * Arguments exotic behavior in E5 Section 10.6 occurs after the standard
+ * [[DefineOwnProperty]] has completed successfully.
+ *
+ * Array exotic behavior in E5 Section 15.4.5.1 is implemented partly
+ * prior to the default [[DefineOwnProperty]], but:
+ * - for an array index key (e.g. "10") the final 'length' update occurs here
+ * - for 'length' key the element deletion and 'length' update occurs here
+ */
+
+ success_exotics:
+
+ /* curr.a_idx or curr.e_idx may have been invalidated by side effects
+ * above.
+ */
+
+ /* [obj key desc value get set curr_value] */
+
+ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {
+ duk_harray *a;
+
+ a = (duk_harray *) obj;
+ DUK_ASSERT_HARRAY_VALID(a);
+
+ if (arridx_new_array_length > 0) {
+ /*
+ * Note: zero works as a "no update" marker because the new length
+ * can never be zero after a new property is written.
+ */
+
+ /* E5 Section 15.4.5.1, steps 4.e.i - 4.e.ii */
+
+ DUK_DDD(DUK_DDDPRINT("defineProperty successful, pending array length update to: %ld",
+ (long) arridx_new_array_length));
+
+ a->length = arridx_new_array_length;
+ }
+
+ if (key == DUK_HTHREAD_STRING_LENGTH(thr) && arrlen_new_len < arrlen_old_len) {
+ /*
+ * E5 Section 15.4.5.1, steps 3.k - 3.n. The order at the end combines
+ * the error case 3.l.iii and the success case 3.m-3.n.
+ */
+
+ /* XXX: investigate whether write protect can be handled above, if we
+ * just update length here while ignoring its protected status
+ */
+
+ duk_uint32_t result_len;
+ duk_bool_t rc;
+
+ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key is 'length', exotic array behavior, "
+ "doing array element deletion and length update"));
+
+ rc = duk__handle_put_array_length_smaller(thr, obj, arrlen_old_len, arrlen_new_len, force_flag, &result_len);
+
+ /* update length (curr points to length, and we assume it's still valid) */
+ DUK_ASSERT(result_len >= arrlen_new_len && result_len <= arrlen_old_len);
+
+ a->length = result_len;
+
+ if (pending_write_protect) {
+ DUK_DDD(DUK_DDDPRINT("setting array length non-writable (pending writability update)"));
+ DUK_HARRAY_SET_LENGTH_NONWRITABLE(a);
+ }
+
+ /* XXX: shrink array allocation or entries compaction here? */
+ if (!rc) {
+ DUK_DD(DUK_DDPRINT("array length write only partially successful"));
+ goto fail_not_configurable;
+ }
+ }
+ } else if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) {
+ duk_hobject *map;
+ duk_hobject *varenv;
+
+ DUK_ASSERT(arridx_new_array_length == 0);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); /* traits are separate; in particular, arguments not an array */
+
+ map = NULL;
+ varenv = NULL;
+ if (!duk__lookup_arguments_map(thr, obj, key, &curr, &map, &varenv)) {
+ goto success_no_exotics;
+ }
+ DUK_ASSERT(map != NULL);
+ DUK_ASSERT(varenv != NULL);
+
+ /* [obj key desc value get set curr_value varname] */
+
+ if (has_set || has_get) {
+ /* = IsAccessorDescriptor(Desc) */
+ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map' "
+ "changed to an accessor, delete arguments binding"));
+
+ (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */
+ } else {
+ /* Note: this order matters (final value before deleting map entry must be done) */
+ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', "
+ "check for value update / binding deletion"));
+
+ if (has_value) {
+ duk_hstring *varname;
+
+ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', "
+ "update bound value (variable/argument)"));
+
+ varname = duk_require_hstring(thr, -1);
+ DUK_ASSERT(varname != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("arguments object automatic putvar for a bound variable; "
+ "key=%!O, varname=%!O, value=%!T",
+ (duk_heaphdr *) key,
+ (duk_heaphdr *) varname,
+ (duk_tval *) duk_require_tval(thr, idx_value)));
+
+ /* strict flag for putvar comes from our caller (currently: fixed) */
+ duk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, idx_value), 1 /*throw_flag*/);
+ }
+ if (has_writable && !is_writable) {
+ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', "
+ "changed to non-writable, delete arguments binding"));
+
+ (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */
+ }
+ }
+
+ /* 'varname' is in stack in this else branch, leaving an unbalanced stack below,
+ * but this doesn't matter now.
+ */
+ }
+
+ success_no_exotics:
+ /* Some code paths use NORZ macros for simplicity, ensure refzero
+ * handling is completed.
+ */
+ DUK_REFZERO_CHECK_SLOW(thr);
+ return 1;
+
+ fail_not_extensible:
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE);
+ }
+ return 0;
+
+ fail_virtual: /* just use the same "not configurable" error message" */
+ fail_not_configurable:
+ if (throw_flag) {
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);
+ }
+ return 0;
+}
+
+/*
+ * Object.prototype.hasOwnProperty() and Object.prototype.propertyIsEnumerable().
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags) {
+ duk_hstring *h_v;
+ duk_hobject *h_obj;
+ duk_propdesc desc;
+ duk_bool_t ret;
+
+ /* coercion order matters */
+ h_v = duk_to_hstring_acceptsymbol(thr, 0);
+ DUK_ASSERT(h_v != NULL);
+
+ h_obj = duk_push_this_coercible_to_object(thr);
+ DUK_ASSERT(h_obj != NULL);
+
+ ret = duk_hobject_get_own_propdesc(thr, h_obj, h_v, &desc, 0 /*flags*/); /* don't push value */
+
+ duk_push_boolean(thr, ret && ((desc.flags & required_desc_flags) == required_desc_flags));
+ return 1;
+}
+
+/*
+ * Object.seal() and Object.freeze() (E5 Sections 15.2.3.8 and 15.2.3.9)
+ *
+ * Since the algorithms are similar, a helper provides both functions.
+ * Freezing is essentially sealing + making plain properties non-writable.
+ *
+ * Note: virtual (non-concrete) properties which are non-configurable but
+ * writable would pose some problems, but such properties do not currently
+ * exist (all virtual properties are non-configurable and non-writable).
+ * If they did exist, the non-configurability does NOT prevent them from
+ * becoming non-writable. However, this change should be recorded somehow
+ * so that it would turn up (e.g. when getting the property descriptor),
+ * requiring some additional flags in the object.
+ */
+
+DUK_INTERNAL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze) {
+ duk_uint_fast32_t i;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(obj != NULL);
+
+ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);
+
+#if defined(DUK_USE_ROM_OBJECTS)
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {
+ DUK_DD(DUK_DDPRINT("attempt to seal/freeze a readonly object, reject"));
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);
+ }
+#endif
+
+ /*
+ * Abandon array part because all properties must become non-configurable.
+ * Note that this is now done regardless of whether this is always the case
+ * (skips check, but performance problem if caller would do this many times
+ * for the same object; not likely).
+ */
+
+ duk__abandon_array_checked(thr, obj);
+ DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) == 0);
+
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ duk_uint8_t *fp;
+
+ /* since duk__abandon_array_checked() causes a resize, there should be no gaps in keys */
+ DUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != NULL);
+
+ /* avoid multiple computations of flags address; bypasses macros */
+ fp = DUK_HOBJECT_E_GET_FLAGS_PTR(thr->heap, obj, i);
+ if (is_freeze && !((*fp) & DUK_PROPDESC_FLAG_ACCESSOR)) {
+ *fp &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE);
+ } else {
+ *fp &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;
+ }
+ }
+
+ DUK_HOBJECT_CLEAR_EXTENSIBLE(obj);
+
+ /* no need to compact since we already did that in duk__abandon_array_checked()
+ * (regardless of whether an array part existed or not.
+ */
+
+ return;
+}
+
+/*
+ * Object.isSealed() and Object.isFrozen() (E5 Sections 15.2.3.11, 15.2.3.13)
+ *
+ * Since the algorithms are similar, a helper provides both functions.
+ * Freezing is essentially sealing + making plain properties non-writable.
+ *
+ * Note: all virtual (non-concrete) properties are currently non-configurable
+ * and non-writable (and there are no accessor virtual properties), so they don't
+ * need to be considered here now.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen) {
+ duk_uint_fast32_t i;
+
+ DUK_ASSERT(obj != NULL);
+ DUK_UNREF(thr);
+
+ /* Note: no allocation pressure, no need to check refcounts etc */
+
+ /* must not be extensible */
+ if (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) {
+ return 0;
+ }
+
+ /* all virtual properties are non-configurable and non-writable */
+
+ /* entry part must not contain any configurable properties, or
+ * writable properties (if is_frozen).
+ */
+ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {
+ duk_small_uint_t flags;
+
+ if (!DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i)) {
+ continue;
+ }
+
+ /* avoid multiple computations of flags address; bypasses macros */
+ flags = (duk_small_uint_t) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i);
+
+ if (flags & DUK_PROPDESC_FLAG_CONFIGURABLE) {
+ return 0;
+ }
+ if (is_frozen &&
+ !(flags & DUK_PROPDESC_FLAG_ACCESSOR) &&
+ (flags & DUK_PROPDESC_FLAG_WRITABLE)) {
+ return 0;
+ }
+ }
+
+ /* array part must not contain any non-unused properties, as they would
+ * be configurable and writable.
+ */
+ for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {
+ duk_tval *tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);
+ if (!DUK_TVAL_IS_UNUSED(tv)) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+/*
+ * Object.preventExtensions() and Object.isExtensible() (E5 Sections 15.2.3.10, 15.2.3.13)
+ *
+ * Not needed, implemented by macros DUK_HOBJECT_{HAS,CLEAR,SET}_EXTENSIBLE
+ * and the Object built-in bindings.
+ */
+
+/* automatic undefs */
+#undef DUK__HASH_DELETED
+#undef DUK__HASH_UNUSED
+#undef DUK__NO_ARRAY_INDEX
+#undef DUK__VALSTACK_PROXY_LOOKUP
+#undef DUK__VALSTACK_SPACE
+#line 1 "duk_hstring_misc.c"
+/*
+ * Misc support functions
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * duk_hstring charCodeAt, with and without surrogate awareness
+ */
+
+DUK_INTERNAL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware) {
+ duk_uint32_t boff;
+ const duk_uint8_t *p, *p_start, *p_end;
+ duk_ucodepoint_t cp1;
+ duk_ucodepoint_t cp2;
+
+ /* Caller must check character offset to be inside the string. */
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT_DISABLE(pos >= 0); /* unsigned */
+ DUK_ASSERT(pos < (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h));
+
+ boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint32_t) pos);
+ DUK_DDD(DUK_DDDPRINT("charCodeAt: pos=%ld -> boff=%ld, str=%!O",
+ (long) pos, (long) boff, (duk_heaphdr *) h));
+ DUK_ASSERT_DISABLE(boff >= 0);
+ DUK_ASSERT(boff < DUK_HSTRING_GET_BYTELEN(h));
+
+ p_start = DUK_HSTRING_GET_DATA(h);
+ p_end = p_start + DUK_HSTRING_GET_BYTELEN(h);
+ p = p_start + boff;
+ DUK_DDD(DUK_DDDPRINT("p_start=%p, p_end=%p, p=%p",
+ (const void *) p_start, (const void *) p_end,
+ (const void *) p));
+
+ /* For invalid UTF-8 (never happens for standard Ecmascript strings)
+ * return U+FFFD replacement character.
+ */
+ if (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp1)) {
+ if (surrogate_aware && cp1 >= 0xd800UL && cp1 <= 0xdbffUL) {
+ /* The decode helper is memory safe even if 'cp1' was
+ * decoded at the end of the string and 'p' is no longer
+ * within string memory range.
+ */
+ cp2 = 0; /* If call fails, this is left untouched and won't match cp2 check. */
+ (void) duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp2);
+ if (cp2 >= 0xdc00UL && cp2 <= 0xdfffUL) {
+ cp1 = (duk_ucodepoint_t) (((cp1 - 0xd800UL) << 10) + (cp2 - 0xdc00UL) + 0x10000UL);
+ }
+ }
+ } else {
+ cp1 = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;
+ }
+
+ return cp1;
+}
+
+/*
+ * duk_hstring charlen, when lazy charlen disabled
+ */
+
+#if !defined(DUK_USE_HSTRING_LAZY_CLEN)
+#if !defined(DUK_USE_HSTRING_CLEN)
+#error non-lazy duk_hstring charlen but DUK_USE_HSTRING_CLEN not set
+#endif
+DUK_INTERNAL void duk_hstring_init_charlen(duk_hstring *h) {
+ duk_uint32_t clen;
+
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(!DUK_HSTRING_HAS_ASCII(h));
+ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h));
+
+ clen = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));
+#if defined(DUK_USE_STRLEN16)
+ DUK_ASSERT(clen <= 0xffffUL); /* Bytelength checked during interning. */
+ h->clen16 = (duk_uint16_t) clen;
+#else
+ h->clen = (duk_uint32_t) clen;
+#endif
+ if (DUK_LIKELY(clen == DUK_HSTRING_GET_BYTELEN(h))) {
+ DUK_HSTRING_SET_ASCII(h);
+ }
+}
+
+DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) {
+#if defined(DUK_USE_STRLEN16)
+ return h->clen16;
+#else
+ return h->clen;
+#endif
+}
+#endif /* !DUK_USE_HSTRING_LAZY_CLEN */
+
+/*
+ * duk_hstring charlen, when lazy charlen enabled
+ */
+
+#if defined(DUK_USE_HSTRING_LAZY_CLEN)
+#if defined(DUK_USE_HSTRING_CLEN)
+DUK_LOCAL DUK_COLD duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) {
+ duk_size_t res;
+
+ DUK_ASSERT(h->clen == 0); /* Checked by caller. */
+
+#if defined(DUK_USE_ROM_STRINGS)
+ /* ROM strings have precomputed clen, but if the computed clen is zero
+ * we can still come here and can't write anything.
+ */
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) {
+ return 0;
+ }
+#endif
+
+ res = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));
+#if defined(DUK_USE_STRLEN16)
+ DUK_ASSERT(res <= 0xffffUL); /* Bytelength checked during interning. */
+ h->clen16 = (duk_uint16_t) res;
+#else
+ h->clen = (duk_uint32_t) res;
+#endif
+ if (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) {
+ DUK_HSTRING_SET_ASCII(h);
+ }
+ return res;
+}
+#else /* DUK_USE_HSTRING_CLEN */
+DUK_LOCAL duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) {
+ if (DUK_LIKELY(DUK_HSTRING_HAS_ASCII(h))) {
+ /* Most practical strings will go here. */
+ return DUK_HSTRING_GET_BYTELEN(h);
+ } else {
+ /* ASCII flag is lazy, so set it here. */
+ duk_size_t res;
+
+ /* XXX: here we could use the strcache to speed up the
+ * computation (matters for 'i < str.length' loops).
+ */
+
+ res = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));
+
+#if defined(DUK_USE_ROM_STRINGS)
+ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) {
+ /* For ROM strings, can't write anything; ASCII flag
+ * is preset so we don't need to update it.
+ */
+ return res;
+ }
+#endif
+ if (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) {
+ DUK_HSTRING_SET_ASCII(h);
+ }
+ return res;
+ }
+}
+#endif /* DUK_USE_HSTRING_CLEN */
+
+#if defined(DUK_USE_HSTRING_CLEN)
+DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) {
+#if defined(DUK_USE_STRLEN16)
+ if (DUK_LIKELY(h->clen16 != 0)) {
+ return h->clen16;
+ }
+#else
+ if (DUK_LIKELY(h->clen != 0)) {
+ return h->clen;
+ }
+#endif
+ return duk__hstring_get_charlen_slowpath(h);
+}
+#else /* DUK_USE_HSTRING_CLEN */
+DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) {
+ /* Always use slow path. */
+ return duk__hstring_get_charlen_slowpath(h);
+}
+#endif /* DUK_USE_HSTRING_CLEN */
+#endif /* DUK_USE_HSTRING_LAZY_CLEN */
+
+/*
+ * Compare duk_hstring to an ASCII cstring.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr) {
+ duk_size_t len;
+
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(cstr != NULL);
+
+ len = DUK_STRLEN(cstr);
+ if (len != DUK_HSTRING_GET_BYTELEN(h)) {
+ return 0;
+ }
+ if (DUK_MEMCMP((const void *) cstr, (const void *) DUK_HSTRING_GET_DATA(h), len) == 0) {
+ return 1;
+ }
+ return 0;
+}
+#line 1 "duk_hthread_alloc.c"
+/*
+ * duk_hthread allocation and freeing.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Allocate initial stacks for a thread. Note that 'thr' must be reachable
+ * as a garbage collection may be triggered by the allocation attempts.
+ * Returns zero (without leaking memory) if init fails.
+ */
+
+DUK_INTERNAL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr) {
+ duk_size_t alloc_size;
+ duk_size_t i;
+
+ DUK_ASSERT(heap != NULL);
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->valstack == NULL);
+ DUK_ASSERT(thr->valstack_end == NULL);
+ DUK_ASSERT(thr->valstack_alloc_end == NULL);
+ DUK_ASSERT(thr->valstack_bottom == NULL);
+ DUK_ASSERT(thr->valstack_top == NULL);
+ DUK_ASSERT(thr->callstack_curr == NULL);
+
+ /* valstack */
+ DUK_ASSERT(DUK_VALSTACK_API_ENTRY_MINIMUM <= DUK_VALSTACK_INITIAL_SIZE);
+ alloc_size = sizeof(duk_tval) * DUK_VALSTACK_INITIAL_SIZE;
+ thr->valstack = (duk_tval *) DUK_ALLOC(heap, alloc_size);
+ if (!thr->valstack) {
+ goto fail;
+ }
+ DUK_MEMZERO(thr->valstack, alloc_size);
+ thr->valstack_end = thr->valstack + DUK_VALSTACK_API_ENTRY_MINIMUM;
+ thr->valstack_alloc_end = thr->valstack + DUK_VALSTACK_INITIAL_SIZE;
+ thr->valstack_bottom = thr->valstack;
+ thr->valstack_top = thr->valstack;
+
+ for (i = 0; i < DUK_VALSTACK_INITIAL_SIZE; i++) {
+ DUK_TVAL_SET_UNDEFINED(&thr->valstack[i]);
+ }
+
+ return 1;
+
+ fail:
+ DUK_FREE(heap, thr->valstack);
+ DUK_ASSERT(thr->callstack_curr == NULL);
+
+ thr->valstack = NULL;
+ return 0;
+}
+
+/* For indirect allocs. */
+
+DUK_INTERNAL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud) {
+ duk_hthread *thr = (duk_hthread *) ud;
+ DUK_UNREF(heap);
+ return (void *) thr->valstack;
+}
+#line 1 "duk_hthread_builtins.c"
+/*
+ * Initialize built-in objects. Current thread must have a valstack
+ * and initialization errors may longjmp, so a setjmp() catch point
+ * must exist.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Encoding constants, must match genbuiltins.py
+ */
+
+#define DUK__PROP_FLAGS_BITS 3
+#define DUK__LENGTH_PROP_BITS 3
+#define DUK__NARGS_BITS 3
+#define DUK__PROP_TYPE_BITS 3
+
+#define DUK__NARGS_VARARGS_MARKER 0x07
+
+#define DUK__PROP_TYPE_DOUBLE 0
+#define DUK__PROP_TYPE_STRING 1
+#define DUK__PROP_TYPE_STRIDX 2
+#define DUK__PROP_TYPE_BUILTIN 3
+#define DUK__PROP_TYPE_UNDEFINED 4
+#define DUK__PROP_TYPE_BOOLEAN_TRUE 5
+#define DUK__PROP_TYPE_BOOLEAN_FALSE 6
+#define DUK__PROP_TYPE_ACCESSOR 7
+
+/*
+ * Create built-in objects by parsing an init bitstream generated
+ * by genbuiltins.py.
+ */
+
+#if defined(DUK_USE_ROM_OBJECTS)
+#if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT)
+DUK_LOCAL void duk__duplicate_ram_global_object(duk_hthread *thr) {
+ duk_hobject *h_global;
+#if defined(DUK_USE_ROM_GLOBAL_CLONE)
+ duk_hobject *h_oldglobal;
+ duk_uint8_t *props;
+ duk_size_t alloc_size;
+#endif
+ duk_hobject *h_objenv;
+
+ /* XXX: refactor into internal helper, duk_clone_hobject() */
+
+#if defined(DUK_USE_ROM_GLOBAL_INHERIT)
+ /* Inherit from ROM-based global object: less RAM usage, less transparent. */
+ h_global = duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL),
+ DUK_BIDX_GLOBAL);
+ DUK_ASSERT(h_global != NULL);
+#elif defined(DUK_USE_ROM_GLOBAL_CLONE)
+ /* Clone the properties of the ROM-based global object to create a
+ * fully RAM-based global object. Uses more memory than the inherit
+ * model but more compliant.
+ */
+ h_global = duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL),
+ DUK_BIDX_OBJECT_PROTOTYPE);
+ DUK_ASSERT(h_global != NULL);
+ h_oldglobal = thr->builtins[DUK_BIDX_GLOBAL];
+ DUK_ASSERT(h_oldglobal != NULL);
+
+ /* Copy the property table verbatim; this handles attributes etc.
+ * For ROM objects it's not necessary (or possible) to update
+ * refcounts so leave them as is.
+ */
+ alloc_size = DUK_HOBJECT_P_ALLOC_SIZE(h_oldglobal);
+ DUK_ASSERT(alloc_size > 0);
+ props = DUK_ALLOC_CHECKED(thr, alloc_size);
+ DUK_ASSERT(props != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal) != NULL);
+ DUK_MEMCPY((void *) props, (const void *) DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal), alloc_size);
+
+ /* XXX: keep property attributes or tweak them here?
+ * Properties will now be non-configurable even when they're
+ * normally configurable for the global object.
+ */
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_global) == NULL);
+ DUK_HOBJECT_SET_PROPS(thr->heap, h_global, props);
+ DUK_HOBJECT_SET_ESIZE(h_global, DUK_HOBJECT_GET_ESIZE(h_oldglobal));
+ DUK_HOBJECT_SET_ENEXT(h_global, DUK_HOBJECT_GET_ENEXT(h_oldglobal));
+ DUK_HOBJECT_SET_ASIZE(h_global, DUK_HOBJECT_GET_ASIZE(h_oldglobal));
+ DUK_HOBJECT_SET_HSIZE(h_global, DUK_HOBJECT_GET_HSIZE(h_oldglobal));
+#else
+#error internal error in config defines
+#endif
+
+ duk_hobject_compact_props(thr, h_global);
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);
+ DUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL])); /* no need to decref: ROM object */
+ thr->builtins[DUK_BIDX_GLOBAL] = h_global;
+ DUK_HOBJECT_INCREF(thr, h_global);
+ DUK_D(DUK_DPRINT("duplicated global object: %!O", h_global));
+
+ /* Create a fresh object environment for the global scope. This is
+ * needed so that the global scope points to the newly created RAM-based
+ * global object.
+ */
+ h_objenv = (duk_hobject *) duk_hobjenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));
+ DUK_ASSERT(h_objenv != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_objenv) == NULL);
+ duk_push_hobject(thr, h_objenv);
+
+ DUK_ASSERT(h_global != NULL);
+ ((duk_hobjenv *) h_objenv)->target = h_global;
+ DUK_HOBJECT_INCREF(thr, h_global);
+ DUK_ASSERT(((duk_hobjenv *) h_objenv)->has_this == 0);
+
+ DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL);
+ DUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL_ENV])); /* no need to decref: ROM object */
+ thr->builtins[DUK_BIDX_GLOBAL_ENV] = h_objenv;
+ DUK_HOBJECT_INCREF(thr, h_objenv);
+ DUK_D(DUK_DPRINT("duplicated global env: %!O", h_objenv));
+
+ DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) h_objenv);
+
+ duk_pop_2(thr); /* Pop global object and global env. */
+}
+#endif /* DUK_USE_ROM_GLOBAL_CLONE || DUK_USE_ROM_GLOBAL_INHERIT */
+
+DUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) {
+ /* Setup builtins from ROM objects. All heaps/threads will share
+ * the same readonly objects.
+ */
+ duk_small_uint_t i;
+
+ for (i = 0; i < DUK_NUM_BUILTINS; i++) {
+ duk_hobject *h;
+ h = (duk_hobject *) DUK_LOSE_CONST(duk_rom_builtins_bidx[i]);
+ DUK_ASSERT(h != NULL);
+ thr->builtins[i] = h;
+ }
+
+#if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT)
+ /* By default the global object is read-only which is often much
+ * more of an issue than having read-only built-in objects (like
+ * RegExp, Date, etc). Use a RAM-based copy of the global object
+ * and the global environment object for convenience.
+ */
+ duk__duplicate_ram_global_object(thr);
+#endif
+}
+#else /* DUK_USE_ROM_OBJECTS */
+DUK_LOCAL void duk__push_stridx(duk_hthread *thr, duk_bitdecoder_ctx *bd) {
+ duk_small_uint_t n;
+
+ n = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ DUK_ASSERT_DISABLE(n >= 0); /* unsigned */
+ DUK_ASSERT(n < DUK_HEAP_NUM_STRINGS);
+ duk_push_hstring_stridx(thr, n);
+}
+DUK_LOCAL void duk__push_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) {
+ /* XXX: built-ins data could provide a maximum length that is
+ * actually needed; bitpacked max length is now 256 bytes.
+ */
+ duk_uint8_t tmp[DUK_BD_BITPACKED_STRING_MAXLEN];
+ duk_small_uint_t len;
+
+ len = duk_bd_decode_bitpacked_string(bd, tmp);
+ duk_push_lstring(thr, (const char *) tmp, (duk_size_t) len);
+}
+DUK_LOCAL void duk__push_stridx_or_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) {
+ duk_small_uint_t n;
+
+ n = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ if (n == 0) {
+ duk__push_string(thr, bd);
+ } else {
+ n--;
+ DUK_ASSERT(n < DUK_HEAP_NUM_STRINGS);
+ duk_push_hstring_stridx(thr, n);
+ }
+}
+DUK_LOCAL void duk__push_double(duk_hthread *thr, duk_bitdecoder_ctx *bd) {
+ duk_double_union du;
+ duk_small_uint_t i;
+
+ for (i = 0; i < 8; i++) {
+ /* Encoding endianness must match target memory layout,
+ * build scripts and genbuiltins.py must ensure this.
+ */
+ du.uc[i] = (duk_uint8_t) duk_bd_decode(bd, 8);
+ }
+
+ duk_push_number(thr, du.d); /* push operation normalizes NaNs */
+}
+
+DUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) {
+ duk_bitdecoder_ctx bd_ctx;
+ duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */
+ duk_hobject *h;
+ duk_small_uint_t i, j;
+
+ DUK_D(DUK_DPRINT("INITBUILTINS BEGIN: DUK_NUM_BUILTINS=%d, DUK_NUM_BUILTINS_ALL=%d", (int) DUK_NUM_BUILTINS, (int) DUK_NUM_ALL_BUILTINS));
+
+ DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));
+ bd->data = (const duk_uint8_t *) duk_builtins_data;
+ bd->length = (duk_size_t) DUK_BUILTINS_DATA_LENGTH;
+
+ /*
+ * First create all built-in bare objects on the empty valstack.
+ *
+ * Built-ins in the index range [0,DUK_NUM_BUILTINS-1] have value
+ * stack indices matching their eventual thr->builtins[] index.
+ *
+ * Built-ins in the index range [DUK_NUM_BUILTINS,DUK_NUM_ALL_BUILTINS]
+ * will exist on the value stack during init but won't be placed
+ * into thr->builtins[]. These are objects referenced in some way
+ * from thr->builtins[] roots but which don't need to be indexed by
+ * Duktape through thr->builtins[] (e.g. user custom objects).
+ *
+ * Internal prototypes will be incorrect (NULL) at this stage.
+ */
+
+ duk_require_stack(thr, DUK_NUM_ALL_BUILTINS);
+
+ DUK_DD(DUK_DDPRINT("create empty built-ins"));
+ DUK_ASSERT_TOP(thr, 0);
+ for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {
+ duk_small_uint_t class_num;
+ duk_small_int_t len = -1; /* must be signed */
+
+ class_num = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ len = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__LENGTH_PROP_BITS, (duk_int32_t) -1 /*def_value*/);
+
+ if (class_num == DUK_HOBJECT_CLASS_FUNCTION) {
+ duk_small_uint_t natidx;
+ duk_small_int_t c_nargs; /* must hold DUK_VARARGS */
+ duk_c_function c_func;
+ duk_int16_t magic;
+
+ DUK_DDD(DUK_DDDPRINT("len=%ld", (long) len));
+ DUK_ASSERT(len >= 0);
+
+ natidx = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ DUK_ASSERT(natidx != 0);
+ c_func = duk_bi_native_functions[natidx];
+ DUK_ASSERT(c_func != NULL);
+
+ c_nargs = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__NARGS_BITS, len /*def_value*/);
+ if (c_nargs == DUK__NARGS_VARARGS_MARKER) {
+ c_nargs = DUK_VARARGS;
+ }
+
+ /* XXX: set magic directly here? (it could share the c_nargs arg) */
+ (void) duk_push_c_function_builtin(thr, c_func, c_nargs);
+ h = duk_known_hobject(thr, -1);
+
+ /* Currently all built-in native functions are strict.
+ * duk_push_c_function() now sets strict flag, so
+ * assert for it.
+ */
+ DUK_ASSERT(DUK_HOBJECT_HAS_STRICT(h));
+
+ /* XXX: function properties */
+
+ duk__push_stridx_or_string(thr, bd);
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ duk_xdef_prop_stridx_short(thr,
+ -2,
+ DUK_STRIDX_NAME,
+ DUK_PROPDESC_FLAGS_C);
+#else
+ duk_pop(thr); /* Not very ideal but good enough for now. */
+#endif
+
+ /* Almost all global level Function objects are constructable
+ * but not all: Function.prototype is a non-constructable,
+ * callable Function.
+ */
+ if (duk_bd_decode_flag(bd)) {
+ DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE(h));
+ } else {
+ DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h);
+ }
+
+ /* Cast converts magic to 16-bit signed value */
+ magic = (duk_int16_t) duk_bd_decode_varuint(bd);
+ ((duk_hnatfunc *) h)->magic = magic;
+ } else if (class_num == DUK_HOBJECT_CLASS_ARRAY) {
+ duk_push_array(thr);
+ } else if (class_num == DUK_HOBJECT_CLASS_OBJENV) {
+ duk_hobjenv *env;
+ duk_hobject *global;
+
+ DUK_ASSERT(i == DUK_BIDX_GLOBAL_ENV);
+ DUK_ASSERT(DUK_BIDX_GLOBAL_ENV > DUK_BIDX_GLOBAL);
+
+ env = duk_hobjenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));
+ DUK_ASSERT(env->target == NULL);
+ duk_push_hobject(thr, (duk_hobject *) env);
+
+ global = duk_known_hobject(thr, DUK_BIDX_GLOBAL);
+ DUK_ASSERT(global != NULL);
+ env->target = global;
+ DUK_HOBJECT_INCREF(thr, global);
+ DUK_ASSERT(env->has_this == 0);
+
+ DUK_ASSERT_HOBJENV_VALID(env);
+ } else {
+ DUK_ASSERT(class_num != DUK_HOBJECT_CLASS_DECENV);
+
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_EXTENSIBLE,
+ -1); /* no prototype or class yet */
+
+ }
+
+ h = duk_known_hobject(thr, -1);
+ DUK_HOBJECT_SET_CLASS_NUMBER(h, class_num);
+
+ if (i < DUK_NUM_BUILTINS) {
+ thr->builtins[i] = h;
+ DUK_HOBJECT_INCREF(thr, &h->hdr);
+ }
+
+ if (len >= 0) {
+ /* In ES2015+ built-in function object .length property
+ * has property attributes C (configurable only):
+ * http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-standard-built-in-objects
+ *
+ * Array.prototype remains an Array instance in ES2015+
+ * and its length has attributes W (writable only).
+ * Because .length is now virtual for duk_harray, it is
+ * not encoded explicitly in init data.
+ */
+
+ DUK_ASSERT(class_num != DUK_HOBJECT_CLASS_ARRAY); /* .length is virtual */
+ duk_push_int(thr, len);
+ duk_xdef_prop_stridx_short(thr,
+ -2,
+ DUK_STRIDX_LENGTH,
+ DUK_PROPDESC_FLAGS_C);
+ }
+
+ /* enable exotic behaviors last */
+
+ if (class_num == DUK_HOBJECT_CLASS_ARRAY) {
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)); /* set by duk_push_array() */
+ }
+ if (class_num == DUK_HOBJECT_CLASS_STRING) {
+ DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h);
+ }
+
+ /* some assertions */
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h));
+ /* DUK_HOBJECT_FLAG_CONSTRUCTABLE varies */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(h));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_COMPFUNC(h));
+ /* DUK_HOBJECT_FLAG_NATFUNC varies */
+ DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(h));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(h) || class_num == DUK_HOBJECT_CLASS_ARRAY);
+ /* DUK_HOBJECT_FLAG_STRICT varies */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(h) || /* all native functions have NEWENV */
+ DUK_HOBJECT_HAS_NEWENV(h));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(h));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(h));
+ /* DUK_HOBJECT_FLAG_EXOTIC_ARRAY varies */
+ /* DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ varies */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h));
+
+ DUK_DDD(DUK_DDDPRINT("created built-in %ld, class=%ld, length=%ld", (long) i, (long) class_num, (long) len));
+ }
+
+ /*
+ * Then decode the builtins init data (see genbuiltins.py) to
+ * init objects. Internal prototypes are set at this stage,
+ * with thr->builtins[] populated.
+ */
+
+ DUK_DD(DUK_DDPRINT("initialize built-in object properties"));
+ for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {
+ duk_small_uint_t t;
+ duk_small_uint_t num;
+
+ DUK_DDD(DUK_DDDPRINT("initializing built-in object at index %ld", (long) i));
+ h = duk_known_hobject(thr, (duk_idx_t) i);
+
+ t = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ if (t > 0) {
+ t--;
+ DUK_DDD(DUK_DDDPRINT("set internal prototype: built-in %ld", (long) t));
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, duk_known_hobject(thr, (duk_idx_t) t));
+ } else if (DUK_HOBJECT_IS_NATFUNC(h)) {
+ /* Standard native built-ins cannot inherit from
+ * %NativeFunctionPrototype%, they are required to
+ * inherit from Function.prototype directly.
+ */
+ DUK_ASSERT(thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE] != NULL);
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+ }
+
+ t = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ if (t > 0) {
+ /* 'prototype' property for all built-in objects (which have it) has attributes:
+ * [[Writable]] = false,
+ * [[Enumerable]] = false,
+ * [[Configurable]] = false
+ */
+ t--;
+ DUK_DDD(DUK_DDDPRINT("set external prototype: built-in %ld", (long) t));
+ duk_dup(thr, (duk_idx_t) t);
+ duk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_NONE);
+ }
+
+ t = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ if (t > 0) {
+ /* 'constructor' property for all built-in objects (which have it) has attributes:
+ * [[Writable]] = true,
+ * [[Enumerable]] = false,
+ * [[Configurable]] = true
+ */
+ t--;
+ DUK_DDD(DUK_DDDPRINT("set external constructor: built-in %ld", (long) t));
+ duk_dup(thr, (duk_idx_t) t);
+ duk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC);
+ }
+
+ /* normal valued properties */
+ num = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ DUK_DDD(DUK_DDDPRINT("built-in object %ld, %ld normal valued properties", (long) i, (long) num));
+ for (j = 0; j < num; j++) {
+ duk_small_uint_t defprop_flags;
+
+ duk__push_stridx_or_string(thr, bd);
+
+ /*
+ * Property attribute defaults are defined in E5 Section 15 (first
+ * few pages); there is a default for all properties and a special
+ * default for 'length' properties. Variation from the defaults is
+ * signaled using a single flag bit in the bitstream.
+ */
+
+ if (duk_bd_decode_flag(bd)) {
+ defprop_flags = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_FLAGS_BITS);
+ } else {
+ defprop_flags = DUK_PROPDESC_FLAGS_WC;
+ }
+ defprop_flags |= DUK_DEFPROP_FORCE |
+ DUK_DEFPROP_HAVE_VALUE |
+ DUK_DEFPROP_HAVE_WRITABLE |
+ DUK_DEFPROP_HAVE_ENUMERABLE |
+ DUK_DEFPROP_HAVE_CONFIGURABLE; /* Defaults for data properties. */
+
+ /* The writable, enumerable, configurable flags in prop_flags
+ * match both duk_def_prop() and internal property flags.
+ */
+ DUK_ASSERT(DUK_PROPDESC_FLAG_WRITABLE == DUK_DEFPROP_WRITABLE);
+ DUK_ASSERT(DUK_PROPDESC_FLAG_ENUMERABLE == DUK_DEFPROP_ENUMERABLE);
+ DUK_ASSERT(DUK_PROPDESC_FLAG_CONFIGURABLE == DUK_DEFPROP_CONFIGURABLE);
+
+ t = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_TYPE_BITS);
+
+ DUK_DDD(DUK_DDDPRINT("built-in %ld, normal-valued property %ld, key %!T, flags 0x%02lx, type %ld",
+ (long) i, (long) j, duk_get_tval(thr, -1), (unsigned long) defprop_flags, (long) t));
+
+ switch (t) {
+ case DUK__PROP_TYPE_DOUBLE: {
+ duk__push_double(thr, bd);
+ break;
+ }
+ case DUK__PROP_TYPE_STRING: {
+ duk__push_string(thr, bd);
+ break;
+ }
+ case DUK__PROP_TYPE_STRIDX: {
+ duk__push_stridx(thr, bd);
+ break;
+ }
+ case DUK__PROP_TYPE_BUILTIN: {
+ duk_small_uint_t bidx;
+
+ bidx = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ duk_dup(thr, (duk_idx_t) bidx);
+ break;
+ }
+ case DUK__PROP_TYPE_UNDEFINED: {
+ duk_push_undefined(thr);
+ break;
+ }
+ case DUK__PROP_TYPE_BOOLEAN_TRUE: {
+ duk_push_true(thr);
+ break;
+ }
+ case DUK__PROP_TYPE_BOOLEAN_FALSE: {
+ duk_push_false(thr);
+ break;
+ }
+ case DUK__PROP_TYPE_ACCESSOR: {
+ duk_small_uint_t natidx_getter = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ duk_small_uint_t natidx_setter = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ duk_small_uint_t accessor_magic = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ duk_c_function c_func_getter;
+ duk_c_function c_func_setter;
+
+ DUK_DDD(DUK_DDDPRINT("built-in accessor property: objidx=%ld, key=%!T, getteridx=%ld, setteridx=%ld, flags=0x%04lx",
+ (long) i, duk_get_tval(thr, -1), (long) natidx_getter, (long) natidx_setter, (unsigned long) defprop_flags));
+
+ c_func_getter = duk_bi_native_functions[natidx_getter];
+ if (c_func_getter != NULL) {
+ duk_push_c_function_builtin_noconstruct(thr, c_func_getter, 0); /* always 0 args */
+ duk_set_magic(thr, -1, (duk_int_t) accessor_magic);
+ defprop_flags |= DUK_DEFPROP_HAVE_GETTER;
+ }
+ c_func_setter = duk_bi_native_functions[natidx_setter];
+ if (c_func_setter != NULL) {
+ duk_push_c_function_builtin_noconstruct(thr, c_func_setter, 1); /* always 1 arg */
+ duk_set_magic(thr, -1, (duk_int_t) accessor_magic);
+ defprop_flags |= DUK_DEFPROP_HAVE_SETTER;
+ }
+
+ /* Writable flag doesn't make sense for an accessor. */
+ DUK_ASSERT((defprop_flags & DUK_PROPDESC_FLAG_WRITABLE) == 0); /* genbuiltins.py ensures */
+
+ defprop_flags &= ~(DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE);
+ defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE;
+ break;
+ }
+ default: {
+ /* exhaustive */
+ DUK_UNREACHABLE();
+ }
+ }
+
+ duk_def_prop(thr, (duk_idx_t) i, defprop_flags);
+ DUK_ASSERT_TOP(thr, DUK_NUM_ALL_BUILTINS);
+ }
+
+ /* native function properties */
+ num = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+ DUK_DDD(DUK_DDDPRINT("built-in object %ld, %ld function valued properties", (long) i, (long) num));
+ for (j = 0; j < num; j++) {
+ duk_hstring *h_key;
+ duk_small_uint_t natidx;
+ duk_int_t c_nargs; /* must hold DUK_VARARGS */
+ duk_small_uint_t c_length;
+ duk_int16_t magic;
+ duk_c_function c_func;
+ duk_hnatfunc *h_func;
+#if defined(DUK_USE_LIGHTFUNC_BUILTINS)
+ duk_small_int_t lightfunc_eligible;
+#endif
+
+ duk__push_stridx_or_string(thr, bd);
+ h_key = duk_known_hstring(thr, -1);
+ DUK_UNREF(h_key);
+ natidx = (duk_small_uint_t) duk_bd_decode_varuint(bd);
+
+ c_length = (duk_small_uint_t) duk_bd_decode(bd, DUK__LENGTH_PROP_BITS);
+ c_nargs = (duk_int_t) duk_bd_decode_flagged(bd, DUK__NARGS_BITS, (duk_uint32_t) c_length /*def_value*/);
+ if (c_nargs == DUK__NARGS_VARARGS_MARKER) {
+ c_nargs = DUK_VARARGS;
+ }
+
+ c_func = duk_bi_native_functions[natidx];
+
+ DUK_DDD(DUK_DDDPRINT("built-in %ld, function-valued property %ld, key %!O, natidx %ld, length %ld, nargs %ld",
+ (long) i, (long) j, (duk_heaphdr *) h_key, (long) natidx, (long) c_length,
+ (c_nargs == DUK_VARARGS ? (long) -1 : (long) c_nargs)));
+
+ /* Cast converts magic to 16-bit signed value */
+ magic = (duk_int16_t) duk_bd_decode_varuint(bd);
+
+#if defined(DUK_USE_LIGHTFUNC_BUILTINS)
+ lightfunc_eligible =
+ ((c_nargs >= DUK_LFUNC_NARGS_MIN && c_nargs <= DUK_LFUNC_NARGS_MAX) || (c_nargs == DUK_VARARGS)) &&
+ (c_length <= DUK_LFUNC_LENGTH_MAX) &&
+ (magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX);
+
+ /* These functions have trouble working as lightfuncs.
+ * Some of them have specific asserts and some may have
+ * additional properties (e.g. 'require.id' may be written).
+ */
+ if (c_func == duk_bi_global_object_eval) {
+ lightfunc_eligible = 0;
+ }
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+ if (c_func == duk_bi_thread_yield ||
+ c_func == duk_bi_thread_resume) {
+ lightfunc_eligible = 0;
+ }
+#endif
+ if (c_func == duk_bi_function_prototype_call ||
+ c_func == duk_bi_function_prototype_apply ||
+ c_func == duk_bi_reflect_apply ||
+ c_func == duk_bi_reflect_construct) {
+ lightfunc_eligible = 0;
+ }
+
+ if (lightfunc_eligible) {
+ duk_tval tv_lfunc;
+ duk_small_uint_t lf_nargs = (duk_small_uint_t) (c_nargs == DUK_VARARGS ? DUK_LFUNC_NARGS_VARARGS : c_nargs);
+ duk_small_uint_t lf_flags = DUK_LFUNC_FLAGS_PACK(magic, c_length, lf_nargs);
+ DUK_TVAL_SET_LIGHTFUNC(&tv_lfunc, c_func, lf_flags);
+ duk_push_tval(thr, &tv_lfunc);
+ DUK_D(DUK_DPRINT("built-in function eligible as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld -> %!iT", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic, duk_get_tval(thr, -1)));
+ goto lightfunc_skip;
+ }
+
+ DUK_D(DUK_DPRINT("built-in function NOT ELIGIBLE as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic));
+#endif /* DUK_USE_LIGHTFUNC_BUILTINS */
+
+ /* [ (builtin objects) name ] */
+
+ duk_push_c_function_builtin_noconstruct(thr, c_func, c_nargs);
+ h_func = duk_known_hnatfunc(thr, -1);
+ DUK_UNREF(h_func);
+
+ /* XXX: add into init data? */
+
+ /* Special call handling, not described in init data. */
+ if (c_func == duk_bi_global_object_eval ||
+ c_func == duk_bi_function_prototype_call ||
+ c_func == duk_bi_function_prototype_apply ||
+ c_func == duk_bi_reflect_apply ||
+ c_func == duk_bi_reflect_construct) {
+ DUK_HOBJECT_SET_SPECIAL_CALL((duk_hobject *) h_func);
+ }
+
+ /* Currently all built-in native functions are strict.
+ * This doesn't matter for many functions, but e.g.
+ * String.prototype.charAt (and other string functions)
+ * rely on being strict so that their 'this' binding is
+ * not automatically coerced.
+ */
+ DUK_HOBJECT_SET_STRICT((duk_hobject *) h_func);
+
+ /* No built-in functions are constructable except the top
+ * level ones (Number, etc).
+ */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_func));
+
+ /* XXX: any way to avoid decoding magic bit; there are quite
+ * many function properties and relatively few with magic values.
+ */
+ h_func->magic = magic;
+
+ /* [ (builtin objects) name func ] */
+
+ duk_push_uint(thr, c_length);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);
+
+ duk_dup_m2(thr);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);
+
+ /* XXX: other properties of function instances; 'arguments', 'caller'. */
+
+ DUK_DD(DUK_DDPRINT("built-in object %ld, function property %ld -> %!T",
+ (long) i, (long) j, (duk_tval *) duk_get_tval(thr, -1)));
+
+ /* [ (builtin objects) name func ] */
+
+ /*
+ * The default property attributes are correct for all
+ * function valued properties of built-in objects now.
+ */
+
+#if defined(DUK_USE_LIGHTFUNC_BUILTINS)
+ lightfunc_skip:
+#endif
+
+ /* XXX: So far all ES builtins are 'wc' but e.g.
+ * performance.now() should be 'wec'.
+ */
+ duk_xdef_prop(thr, (duk_idx_t) i, DUK_PROPDESC_FLAGS_WC);
+
+ /* [ (builtin objects) ] */
+ }
+ }
+
+ /*
+ * Special post-tweaks, for cases not covered by the init data format.
+ *
+ * - Set Date.prototype.toGMTString to Date.prototype.toUTCString.
+ * toGMTString is required to have the same Function object as
+ * toUTCString in E5 Section B.2.6. Note that while Smjs respects
+ * this, V8 does not (the Function objects are distinct).
+ *
+ * - Make DoubleError non-extensible.
+ *
+ * - Add info about most important effective compile options to Duktape.
+ *
+ * - Possibly remove some properties (values or methods) which are not
+ * desirable with current feature options but are not currently
+ * conditional in init data.
+ */
+
+#if defined(DUK_USE_DATE_BUILTIN)
+ duk_get_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_UTC_STRING);
+ duk_xdef_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_GMT_STRING, DUK_PROPDESC_FLAGS_WC);
+#endif
+
+ h = duk_known_hobject(thr, DUK_BIDX_DOUBLE_ERROR);
+ DUK_HOBJECT_CLEAR_EXTENSIBLE(h);
+
+#if !defined(DUK_USE_ES6_OBJECT_PROTO_PROPERTY)
+ DUK_DD(DUK_DDPRINT("delete Object.prototype.__proto__ built-in which is not enabled in features"));
+ (void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_PROTOTYPE], DUK_HTHREAD_STRING___PROTO__(thr), DUK_DELPROP_FLAG_THROW);
+#endif
+
+#if !defined(DUK_USE_ES6_OBJECT_SETPROTOTYPEOF)
+ DUK_DD(DUK_DDPRINT("delete Object.setPrototypeOf built-in which is not enabled in features"));
+ (void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_CONSTRUCTOR], DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr), DUK_DELPROP_FLAG_THROW);
+#endif
+
+ /* XXX: relocate */
+ duk_push_string(thr,
+ /* Endianness indicator */
+#if defined(DUK_USE_INTEGER_LE)
+ "l"
+#elif defined(DUK_USE_INTEGER_BE)
+ "b"
+#elif defined(DUK_USE_INTEGER_ME) /* integer mixed endian not really used now */
+ "m"
+#else
+ "?"
+#endif
+#if defined(DUK_USE_DOUBLE_LE)
+ "l"
+#elif defined(DUK_USE_DOUBLE_BE)
+ "b"
+#elif defined(DUK_USE_DOUBLE_ME)
+ "m"
+#else
+ "?"
+#endif
+ " "
+ /* Packed or unpacked tval */
+#if defined(DUK_USE_PACKED_TVAL)
+ "p"
+#else
+ "u"
+#endif
+#if defined(DUK_USE_FASTINT)
+ "f"
+#endif
+ " "
+ /* Low memory options */
+#if defined(DUK_USE_STRTAB_PTRCOMP)
+ "s"
+#endif
+#if !defined(DUK_USE_HEAPPTR16) && !defined(DUK_DATAPTR16) && !defined(DUK_FUNCPTR16)
+ "n"
+#endif
+#if defined(DUK_USE_HEAPPTR16)
+ "h"
+#endif
+#if defined(DUK_USE_DATAPTR16)
+ "d"
+#endif
+#if defined(DUK_USE_FUNCPTR16)
+ "f"
+#endif
+#if defined(DUK_USE_REFCOUNT16)
+ "R"
+#endif
+#if defined(DUK_USE_STRHASH16)
+ "H"
+#endif
+#if defined(DUK_USE_STRLEN16)
+ "S"
+#endif
+#if defined(DUK_USE_BUFLEN16)
+ "B"
+#endif
+#if defined(DUK_USE_OBJSIZES16)
+ "O"
+#endif
+#if defined(DUK_USE_LIGHTFUNC_BUILTINS)
+ "L"
+#endif
+#if defined(DUK_USE_ROM_STRINGS) || defined(DUK_USE_ROM_OBJECTS)
+ /* XXX: This won't be shown in practice now
+ * because this code is not run when builtins
+ * are in ROM.
+ */
+ "Z"
+#endif
+ " "
+ /* Object property allocation layout */
+#if defined(DUK_USE_HOBJECT_LAYOUT_1)
+ "p1"
+#elif defined(DUK_USE_HOBJECT_LAYOUT_2)
+ "p2"
+#elif defined(DUK_USE_HOBJECT_LAYOUT_3)
+ "p3"
+#else
+ "p?"
+#endif
+ " "
+ /* Alignment guarantee */
+#if (DUK_USE_ALIGN_BY == 4)
+ "a4"
+#elif (DUK_USE_ALIGN_BY == 8)
+ "a8"
+#elif (DUK_USE_ALIGN_BY == 1)
+ "a1"
+#else
+#error invalid DUK_USE_ALIGN_BY
+#endif
+ " "
+ /* Architecture, OS, and compiler strings */
+ DUK_USE_ARCH_STRING
+ " "
+ DUK_USE_OS_STRING
+ " "
+ DUK_USE_COMPILER_STRING);
+ duk_xdef_prop_stridx_short(thr, DUK_BIDX_DUKTAPE, DUK_STRIDX_ENV, DUK_PROPDESC_FLAGS_WC);
+
+ /*
+ * Since built-ins are not often extended, compact them.
+ */
+
+ DUK_DD(DUK_DDPRINT("compact built-ins"));
+ for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {
+ duk_hobject_compact_props(thr, duk_known_hobject(thr, (duk_idx_t) i));
+ }
+
+ DUK_D(DUK_DPRINT("INITBUILTINS END"));
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)
+ for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {
+ DUK_DD(DUK_DDPRINT("built-in object %ld after initialization and compacting: %!@iO",
+ (long) i, (duk_heaphdr *) duk_require_hobject(thr, i)));
+ }
+#endif
+
+ /*
+ * Pop built-ins from stack: they are now INCREF'd and
+ * reachable from the builtins[] array or indirectly
+ * through builtins[].
+ */
+
+ duk_set_top(thr, 0);
+ DUK_ASSERT_TOP(thr, 0);
+}
+#endif /* DUK_USE_ROM_OBJECTS */
+
+DUK_INTERNAL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to) {
+ duk_small_uint_t i;
+
+ for (i = 0; i < DUK_NUM_BUILTINS; i++) {
+ thr_to->builtins[i] = thr_from->builtins[i];
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr_to, thr_to->builtins[i]); /* side effect free */
+ }
+}
+
+/* automatic undefs */
+#undef DUK__LENGTH_PROP_BITS
+#undef DUK__NARGS_BITS
+#undef DUK__NARGS_VARARGS_MARKER
+#undef DUK__PROP_FLAGS_BITS
+#undef DUK__PROP_TYPE_ACCESSOR
+#undef DUK__PROP_TYPE_BITS
+#undef DUK__PROP_TYPE_BOOLEAN_FALSE
+#undef DUK__PROP_TYPE_BOOLEAN_TRUE
+#undef DUK__PROP_TYPE_BUILTIN
+#undef DUK__PROP_TYPE_DOUBLE
+#undef DUK__PROP_TYPE_STRIDX
+#undef DUK__PROP_TYPE_STRING
+#undef DUK__PROP_TYPE_UNDEFINED
+#line 1 "duk_hthread_misc.c"
+/*
+ * Thread support.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL void duk_hthread_terminate(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+
+ while (thr->callstack_curr != NULL) {
+ duk_hthread_activation_unwind_norz(thr);
+ }
+
+ thr->valstack_bottom = thr->valstack;
+ duk_set_top(thr, 0); /* unwinds valstack, updating refcounts */
+
+ thr->state = DUK_HTHREAD_STATE_TERMINATED;
+
+ /* Here we could remove references to built-ins, but it may not be
+ * worth the effort because built-ins are quite likely to be shared
+ * with another (unterminated) thread, and terminated threads are also
+ * usually garbage collected quite quickly.
+ *
+ * We could also shrink the value stack here, but that also may not
+ * be worth the effort for the same reason.
+ */
+
+ DUK_REFZERO_CHECK_SLOW(thr);
+}
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act) {
+ duk_instr_t *bcode;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_UNREF(thr);
+
+ /* XXX: store 'bcode' pointer to activation for faster lookup? */
+ if (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) {
+ bcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func));
+ return (duk_uint_fast32_t) (act->curr_pc - bcode);
+ }
+ return 0;
+}
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+DUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act) {
+ duk_instr_t *bcode;
+ duk_uint_fast32_t ret;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_UNREF(thr);
+
+ if (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) {
+ bcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func));
+ ret = (duk_uint_fast32_t) (act->curr_pc - bcode);
+ if (ret > 0) {
+ ret--;
+ }
+ return ret;
+ }
+ return 0;
+}
+
+/* Write bytecode executor's curr_pc back to topmost activation (if any). */
+DUK_INTERNAL void duk_hthread_sync_currpc(duk_hthread *thr) {
+ duk_activation *act;
+
+ DUK_ASSERT(thr != NULL);
+
+ if (thr->ptr_curr_pc != NULL) {
+ /* ptr_curr_pc != NULL only when bytecode executor is active. */
+ DUK_ASSERT(thr->callstack_top > 0);
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ act->curr_pc = *thr->ptr_curr_pc;
+ }
+}
+
+DUK_INTERNAL void duk_hthread_sync_and_null_currpc(duk_hthread *thr) {
+ duk_activation *act;
+
+ DUK_ASSERT(thr != NULL);
+
+ if (thr->ptr_curr_pc != NULL) {
+ /* ptr_curr_pc != NULL only when bytecode executor is active. */
+ DUK_ASSERT(thr->callstack_top > 0);
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ act->curr_pc = *thr->ptr_curr_pc;
+ thr->ptr_curr_pc = NULL;
+ }
+}
+#line 1 "duk_hthread_stacks.c"
+/*
+ * Thread stack (mainly call stack) primitives: allocation of activations,
+ * unwinding catchers and activations, etc.
+ *
+ * Value stack handling is a part of the API implementation.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Unwind the topmost catcher of the current activation (caller must check that
+ * both exist) without side effects.
+ */
+DUK_INTERNAL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act) {
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(act->cat != NULL); /* caller must check */
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("unwinding catch stack entry %p (lexenv check is done)", (void *) cat));
+
+ if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) {
+ duk_hobject *env;
+
+ env = act->lex_env; /* current lex_env of the activation (created for catcher) */
+ DUK_ASSERT(env != NULL); /* must be, since env was created when catcher was created */
+ act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env); /* prototype is lex_env before catcher created */
+ DUK_HOBJECT_INCREF(thr, act->lex_env);
+ DUK_HOBJECT_DECREF_NORZ(thr, env);
+
+ /* There is no need to decref anything else than 'env': if 'env'
+ * becomes unreachable, refzero will handle decref'ing its prototype.
+ */
+ }
+
+ act->cat = cat->parent;
+ duk_hthread_catcher_free(thr, cat);
+}
+
+/* Same as above, but caller is certain no catcher-related lexenv may exist. */
+DUK_INTERNAL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act) {
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(act->cat != NULL); /* caller must check */
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("unwinding catch stack entry %p (lexenv check is not done)", (void *) cat));
+
+ DUK_ASSERT(!DUK_CAT_HAS_LEXENV_ACTIVE(cat));
+
+ act->cat = cat->parent;
+ duk_hthread_catcher_free(thr, cat);
+}
+
+DUK_LOCAL
+#if defined(DUK_USE_CACHE_CATCHER)
+DUK_NOINLINE
+#endif
+duk_catcher *duk__hthread_catcher_alloc_slow(duk_hthread *thr) {
+ duk_catcher *cat;
+
+ cat = (duk_catcher *) DUK_ALLOC_CHECKED(thr, sizeof(duk_catcher));
+ DUK_ASSERT(cat != NULL);
+ return cat;
+}
+
+#if defined(DUK_USE_CACHE_CATCHER)
+DUK_INTERNAL DUK_INLINE duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) {
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+
+ cat = thr->heap->catcher_free;
+ if (DUK_LIKELY(cat != NULL)) {
+ thr->heap->catcher_free = cat->parent;
+ return cat;
+ }
+
+ return duk__hthread_catcher_alloc_slow(thr);
+}
+#else /* DUK_USE_CACHE_CATCHER */
+DUK_INTERNAL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) {
+ return duk__hthread_catcher_alloc_slow(thr);
+}
+#endif /* DUK_USE_CACHE_CATCHER */
+
+DUK_INTERNAL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(cat != NULL);
+
+#if defined(DUK_USE_CACHE_CATCHER)
+ /* Unconditional caching for now; freed in mark-and-sweep. */
+ cat->parent = thr->heap->catcher_free;
+ thr->heap->catcher_free = cat;
+#else
+ DUK_FREE_CHECKED(thr, (void *) cat);
+#endif
+}
+
+DUK_LOCAL
+#if defined(DUK_USE_CACHE_ACTIVATION)
+DUK_NOINLINE
+#endif
+duk_activation *duk__hthread_activation_alloc_slow(duk_hthread *thr) {
+ duk_activation *act;
+
+ act = (duk_activation *) DUK_ALLOC_CHECKED(thr, sizeof(duk_activation));
+ DUK_ASSERT(act != NULL);
+ return act;
+}
+
+#if defined(DUK_USE_CACHE_ACTIVATION)
+DUK_INTERNAL DUK_INLINE duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) {
+ duk_activation *act;
+
+ DUK_ASSERT(thr != NULL);
+
+ act = thr->heap->activation_free;
+ if (DUK_LIKELY(act != NULL)) {
+ thr->heap->activation_free = act->parent;
+ return act;
+ }
+
+ return duk__hthread_activation_alloc_slow(thr);
+}
+#else /* DUK_USE_CACHE_ACTIVATION */
+DUK_INTERNAL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) {
+ return duk__hthread_activation_alloc_slow(thr);
+}
+#endif /* DUK_USE_CACHE_ACTIVATION */
+
+
+DUK_INTERNAL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+
+#if defined(DUK_USE_CACHE_ACTIVATION)
+ /* Unconditional caching for now; freed in mark-and-sweep. */
+ act->parent = thr->heap->activation_free;
+ thr->heap->activation_free = act;
+#else
+ DUK_FREE_CHECKED(thr, (void *) act);
+#endif
+}
+
+/* Internal helper: process the unwind for the topmost activation of a thread,
+ * but leave the duk_activation in place for possible tailcall reuse.
+ */
+DUK_LOCAL void duk__activation_unwind_nofree_norz(duk_hthread *thr) {
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_heap *heap;
+#endif
+ duk_activation *act;
+ duk_hobject *func;
+ duk_hobject *tmp;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->callstack_curr != NULL); /* caller must check */
+ DUK_ASSERT(thr->callstack_top > 0);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ /* With lightfuncs, act 'func' may be NULL. */
+
+ /* With duk_activation records allocated separately, 'act' is a stable
+ * pointer and not affected by side effects.
+ */
+
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ /*
+ * Restore 'caller' property for non-strict callee functions.
+ */
+
+ func = DUK_ACT_GET_FUNC(act);
+ if (func != NULL && !DUK_HOBJECT_HAS_STRICT(func)) {
+ duk_tval *tv_caller;
+ duk_tval tv_tmp;
+ duk_hobject *h_tmp;
+
+ tv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr));
+
+ /* The act->prev_caller should only be set if the entry for 'caller'
+ * exists (as it is only set in that case, and the property is not
+ * configurable), but handle all the cases anyway.
+ */
+
+ if (tv_caller) {
+ DUK_TVAL_SET_TVAL(&tv_tmp, tv_caller);
+ if (act->prev_caller) {
+ /* Just transfer the refcount from act->prev_caller to tv_caller,
+ * so no need for a refcount update. This is the expected case.
+ */
+ DUK_TVAL_SET_OBJECT(tv_caller, act->prev_caller);
+ act->prev_caller = NULL;
+ } else {
+ DUK_TVAL_SET_NULL(tv_caller); /* no incref needed */
+ DUK_ASSERT(act->prev_caller == NULL);
+ }
+ DUK_TVAL_DECREF_NORZ(thr, &tv_tmp);
+ } else {
+ h_tmp = act->prev_caller;
+ if (h_tmp) {
+ act->prev_caller = NULL;
+ DUK_HOBJECT_DECREF_NORZ(thr, h_tmp);
+ }
+ }
+ DUK_ASSERT(act->prev_caller == NULL);
+ }
+#endif
+
+ /*
+ * Unwind debugger state. If we unwind while stepping
+ * (for any step type), pause execution. This is the
+ * only place explicitly handling a step out.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ heap = thr->heap;
+ if (heap->dbg_pause_act == thr->callstack_curr) {
+ if (heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_EXIT) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function exit"));
+ duk_debug_set_paused(heap);
+ } else {
+ DUK_D(DUK_DPRINT("unwound past dbg_pause_act, set to NULL"));
+ heap->dbg_pause_act = NULL; /* avoid stale pointers */
+ }
+ DUK_ASSERT(heap->dbg_pause_act == NULL);
+ }
+#endif
+
+ /*
+ * Unwind catchers.
+ *
+ * Since there are no references in the catcher structure,
+ * unwinding is quite simple. The only thing we need to
+ * look out for is popping a possible lexical environment
+ * established for an active catch clause.
+ */
+
+ while (act->cat != NULL) {
+ duk_hthread_catcher_unwind_norz(thr, act);
+ }
+
+ /*
+ * Close environment record(s) if they exist.
+ *
+ * Only variable environments are closed. If lex_env != var_env, it
+ * cannot currently contain any register bound declarations.
+ *
+ * Only environments created for a NEWENV function are closed. If an
+ * environment is created for e.g. an eval call, it must not be closed.
+ */
+
+ func = DUK_ACT_GET_FUNC(act);
+ if (func != NULL && !DUK_HOBJECT_HAS_NEWENV(func)) {
+ DUK_DDD(DUK_DDDPRINT("skip closing environments, envs not owned by this activation"));
+ goto skip_env_close;
+ }
+ /* func is NULL for lightfunc */
+
+ /* Catch sites are required to clean up their environments
+ * in FINALLY part before propagating, so this should
+ * always hold here.
+ */
+ DUK_ASSERT(act->lex_env == act->var_env);
+
+ /* XXX: Closing the environment record copies values from registers
+ * into the scope object. It's side effect free as such, but may
+ * currently run out of memory which causes an error throw. This is
+ * an actual sandboxing problem for error unwinds, and needs to be
+ * fixed e.g. by preallocating the scope property slots.
+ */
+ if (act->var_env != NULL) {
+ DUK_DDD(DUK_DDDPRINT("closing var_env record %p -> %!O",
+ (void *) act->var_env, (duk_heaphdr *) act->var_env));
+ duk_js_close_environment_record(thr, act->var_env);
+ }
+
+ skip_env_close:
+
+ /*
+ * Update preventcount
+ */
+
+ if (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) {
+ DUK_ASSERT(thr->callstack_preventcount >= 1);
+ thr->callstack_preventcount--;
+ }
+
+ /*
+ * Reference count updates, using NORZ macros so we don't
+ * need to handle side effects.
+ *
+ * duk_activation pointers like act->var_env are intentionally
+ * left as garbage and not NULLed. Without side effects they
+ * can't be used when the values are dangling/garbage.
+ */
+
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->var_env);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->lex_env);
+ tmp = DUK_ACT_GET_FUNC(act);
+ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);
+ DUK_UNREF(tmp);
+}
+
+/* Unwind topmost duk_activation of a thread, caller must ensure that an
+ * activation exists. The call is side effect free, except that scope
+ * closure may currently throw an out-of-memory error.
+ */
+DUK_INTERNAL void duk_hthread_activation_unwind_norz(duk_hthread *thr) {
+ duk_activation *act;
+
+ duk__activation_unwind_nofree_norz(thr);
+
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_top > 0);
+ act = thr->callstack_curr;
+ thr->callstack_curr = act->parent;
+ thr->callstack_top--;
+
+ /* Ideally we'd restore value stack reserve here to caller's value.
+ * This doesn't work for current unwind call sites however, because
+ * the current (unwound) value stack top may be above the reserve.
+ * Thus value stack reserve is restored by the call sites.
+ */
+
+ /* XXX: inline for performance builds? */
+ duk_hthread_activation_free(thr, act);
+
+ /* We could clear the book-keeping variables like retval_byteoff for
+ * the topmost activation, but don't do so now as it's not necessary.
+ */
+}
+
+DUK_INTERNAL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr) {
+ duk__activation_unwind_nofree_norz(thr);
+}
+
+/* Get duk_activation for given callstack level or NULL if level is invalid
+ * or deeper than the call stack. Level -1 refers to current activation, -2
+ * to its caller, etc. Starting from Duktape 2.2 finding the activation is
+ * a linked list scan which gets more expensive the deeper the lookup is.
+ */
+DUK_INTERNAL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level) {
+ duk_activation *act;
+
+ if (level >= 0) {
+ return NULL;
+ }
+ act = thr->callstack_curr;
+ for (;;) {
+ if (act == NULL) {
+ return act;
+ }
+ if (level == -1) {
+ return act;
+ }
+ level++;
+ act = act->parent;
+ }
+ /* never here */
+}
+
+#if defined(DUK_USE_FINALIZER_TORTURE)
+DUK_INTERNAL void duk_hthread_valstack_torture_realloc(duk_hthread *thr) {
+ duk_size_t alloc_size;
+ duk_tval *new_ptr;
+ duk_ptrdiff_t alloc_end_off;
+ duk_ptrdiff_t end_off;
+ duk_ptrdiff_t bottom_off;
+ duk_ptrdiff_t top_off;
+
+ if (thr->valstack == NULL) {
+ DUK_D(DUK_DPRINT("skip valstack torture realloc, valstack is NULL"));
+ return;
+ }
+
+ alloc_end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack);
+ end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);
+ bottom_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack);
+ top_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack);
+ alloc_size = (duk_size_t) alloc_end_off;
+ if (alloc_size == 0) {
+ DUK_D(DUK_DPRINT("skip valstack torture realloc, alloc_size is zero"));
+ return;
+ }
+
+ /* Use DUK_ALLOC_RAW() to avoid side effects. */
+ new_ptr = (duk_tval *) DUK_ALLOC_RAW(thr->heap, alloc_size);
+ if (new_ptr != NULL) {
+ DUK_MEMCPY((void *) new_ptr, (const void *) thr->valstack, alloc_size);
+ DUK_MEMSET((void *) thr->valstack, 0x55, alloc_size);
+ DUK_FREE_CHECKED(thr, (void *) thr->valstack);
+ thr->valstack = new_ptr;
+ thr->valstack_alloc_end = (duk_tval *) ((duk_uint8_t *) new_ptr + alloc_end_off);
+ thr->valstack_end = (duk_tval *) ((duk_uint8_t *) new_ptr + end_off);
+ thr->valstack_bottom = (duk_tval *) ((duk_uint8_t *) new_ptr + bottom_off);
+ thr->valstack_top = (duk_tval *) ((duk_uint8_t *) new_ptr + top_off);
+ } else {
+ DUK_D(DUK_DPRINT("failed to realloc valstack for torture, ignore"));
+ }
+}
+#endif /* DUK_USE_FINALIZER_TORTURE */
+#line 1 "duk_js_arith.c"
+/*
+ * Shared helpers for arithmetic operations
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Ecmascript modulus ('%') does not match IEEE 754 "remainder" operation
+ * (implemented by remainder() in C99) but does seem to match ANSI C fmod().
+ * Compare E5 Section 11.5.3 and "man fmod".
+ */
+DUK_INTERNAL double duk_js_arith_mod(double d1, double d2) {
+#if defined(DUK_USE_POW_WORKAROUNDS)
+ /* Specific fixes to common fmod() implementation issues:
+ * - test-bug-mingw-math-issues.js
+ */
+ if (DUK_ISINF(d2)) {
+ if (DUK_ISINF(d1)) {
+ return DUK_DOUBLE_NAN;
+ } else {
+ return d1;
+ }
+ } else if (d1 == 0.0) {
+ /* d1 +/-0 is returned as is (preserving sign) except when
+ * d2 is zero or NaN.
+ */
+ if (d2 == 0.0 || DUK_ISNAN(d2)) {
+ return DUK_DOUBLE_NAN;
+ } else {
+ return d1;
+ }
+ }
+#else
+ /* Some ISO C assumptions. */
+ DUK_ASSERT(DUK_FMOD(1.0, DUK_DOUBLE_INFINITY) == 1.0);
+ DUK_ASSERT(DUK_FMOD(-1.0, DUK_DOUBLE_INFINITY) == -1.0);
+ DUK_ASSERT(DUK_FMOD(1.0, -DUK_DOUBLE_INFINITY) == 1.0);
+ DUK_ASSERT(DUK_FMOD(-1.0, -DUK_DOUBLE_INFINITY) == -1.0);
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY)));
+ DUK_ASSERT(DUK_FMOD(0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, 1.0)) == 0);
+ DUK_ASSERT(DUK_FMOD(-0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, 1.0)) != 0);
+ DUK_ASSERT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0);
+ DUK_ASSERT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY)) != 0);
+ DUK_ASSERT(DUK_FMOD(0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0);
+ DUK_ASSERT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY)) != 0);
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, 0.0)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, 0.0)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, -0.0)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, -0.0)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, DUK_DOUBLE_NAN)));
+ DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, DUK_DOUBLE_NAN)));
+#endif
+
+ return (duk_double_t) DUK_FMOD((double) d1, (double) d2);
+}
+
+/* Shared helper for Math.pow() and exponentiation operator. */
+DUK_INTERNAL double duk_js_arith_pow(double x, double y) {
+ /* The ANSI C pow() semantics differ from Ecmascript.
+ *
+ * E.g. when x==1 and y is +/- infinite, the Ecmascript required
+ * result is NaN, while at least Linux pow() returns 1.
+ */
+
+ duk_small_int_t cx, cy, sx;
+
+ DUK_UNREF(cx);
+ DUK_UNREF(sx);
+ cy = (duk_small_int_t) DUK_FPCLASSIFY(y);
+
+ if (cy == DUK_FP_NAN) {
+ goto ret_nan;
+ }
+ if (DUK_FABS(x) == 1.0 && cy == DUK_FP_INFINITE) {
+ goto ret_nan;
+ }
+
+#if defined(DUK_USE_POW_WORKAROUNDS)
+ /* Specific fixes to common pow() implementation issues:
+ * - test-bug-netbsd-math-pow.js: NetBSD 6.0 on x86 (at least)
+ * - test-bug-mingw-math-issues.js
+ */
+ cx = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ if (cx == DUK_FP_ZERO && y < 0.0) {
+ sx = (duk_small_int_t) DUK_SIGNBIT(x);
+ if (sx == 0) {
+ /* Math.pow(+0,y) should be Infinity when y<0. NetBSD pow()
+ * returns -Infinity instead when y is <0 and finite. The
+ * if-clause also catches y == -Infinity (which works even
+ * without the fix).
+ */
+ return DUK_DOUBLE_INFINITY;
+ } else {
+ /* Math.pow(-0,y) where y<0 should be:
+ * - -Infinity if y<0 and an odd integer
+ * - Infinity if y<0 but not an odd integer
+ * NetBSD pow() returns -Infinity for all finite y<0. The
+ * if-clause also catches y == -Infinity (which works even
+ * without the fix).
+ */
+
+ /* fmod() return value has same sign as input (negative) so
+ * the result here will be in the range ]-2,0], -1 indicates
+ * odd. If x is -Infinity, NaN is returned and the odd check
+ * always concludes "not odd" which results in desired outcome.
+ */
+ double tmp = DUK_FMOD(y, 2);
+ if (tmp == -1.0) {
+ return -DUK_DOUBLE_INFINITY;
+ } else {
+ /* Not odd, or y == -Infinity */
+ return DUK_DOUBLE_INFINITY;
+ }
+ }
+ } else if (cx == DUK_FP_NAN) {
+ if (y == 0.0) {
+ /* NaN ** +/- 0 should always be 1, but is NaN on
+ * at least some Cygwin/MinGW versions.
+ */
+ return 1.0;
+ }
+ }
+#else
+ /* Some ISO C assumptions. */
+ DUK_ASSERT(DUK_POW(DUK_DOUBLE_NAN, 0.0) == 1.0);
+ DUK_ASSERT(DUK_ISINF(DUK_POW(0.0, -1.0)) && DUK_SIGNBIT(DUK_POW(0.0, -1.0)) == 0);
+ DUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -2.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -2.0)) == 0);
+ DUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -3.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -3.0)) != 0);
+#endif
+
+ return DUK_POW(x, y);
+
+ ret_nan:
+ return DUK_DOUBLE_NAN;
+}
+#line 1 "duk_js_call.c"
+/*
+ * Call handling.
+ *
+ * duk_handle_call_unprotected():
+ *
+ * - Unprotected call to Ecmascript or Duktape/C function, from native
+ * code or bytecode executor.
+ *
+ * - Also handles Ecma-to-Ecma calls which reuses a currently running
+ * executor instance to avoid native recursion. Call setup is done
+ * normally, but just before calling the bytecode executor a special
+ * return code is used to indicate that a calling executor is reused.
+ *
+ * - Also handles tailcalls, i.e. reuse of current duk_activation.
+ *
+ * - Also handles setup for initial Duktape.Thread.resume().
+ *
+ * duk_handle_safe_call():
+ *
+ * - Protected C call within current activation.
+ *
+ * setjmp() and local variables have a nasty interaction, see execution.rst;
+ * non-volatile locals modified after setjmp() call are not guaranteed to
+ * keep their value and can cause compiler or compiler version specific
+ * difficult to replicate issues.
+ *
+ * See 'execution.rst'.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* XXX: heap->error_not_allowed for success path too? */
+
+/*
+ * Limit check helpers.
+ */
+
+/* Allow headroom for calls during error augmentation (see GH-191).
+ * We allow space for 10 additional recursions, with one extra
+ * for, e.g. a print() call at the deepest level, and an extra
+ * +1 for protected call wrapping.
+ */
+#define DUK__AUGMENT_CALL_RELAX_COUNT (10 + 2)
+
+DUK_LOCAL DUK_NOINLINE void duk__call_c_recursion_limit_check_slowpath(duk_hthread *thr) {
+ /* When augmenting an error, the effective limit is a bit higher.
+ * Check for it only if the fast path check fails.
+ */
+#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ if (thr->heap->augmenting_error) {
+ if (thr->heap->call_recursion_depth < thr->heap->call_recursion_limit + DUK__AUGMENT_CALL_RELAX_COUNT) {
+ DUK_D(DUK_DPRINT("C recursion limit reached but augmenting error and within relaxed limit"));
+ return;
+ }
+ }
+#endif
+
+ DUK_D(DUK_DPRINT("call prevented because C recursion limit reached"));
+ DUK_ERROR_RANGE(thr, DUK_STR_C_CALLSTACK_LIMIT);
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE void duk__call_c_recursion_limit_check(duk_hthread *thr) {
+ DUK_ASSERT(thr->heap->call_recursion_depth >= 0);
+ DUK_ASSERT(thr->heap->call_recursion_depth <= thr->heap->call_recursion_limit);
+
+ /* This check is forcibly inlined because it's very cheap and almost
+ * always passes. The slow path is forcibly noinline.
+ */
+ if (DUK_LIKELY(thr->heap->call_recursion_depth < thr->heap->call_recursion_limit)) {
+ return;
+ }
+
+ duk__call_c_recursion_limit_check_slowpath(thr);
+}
+
+DUK_LOCAL DUK_NOINLINE void duk__call_callstack_limit_check_slowpath(duk_hthread *thr) {
+ /* When augmenting an error, the effective limit is a bit higher.
+ * Check for it only if the fast path check fails.
+ */
+#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ if (thr->heap->augmenting_error) {
+ if (thr->callstack_top < DUK_USE_CALLSTACK_LIMIT + DUK__AUGMENT_CALL_RELAX_COUNT) {
+ DUK_D(DUK_DPRINT("call stack limit reached but augmenting error and within relaxed limit"));
+ return;
+ }
+ }
+#endif
+
+ /* XXX: error message is a bit misleading: we reached a recursion
+ * limit which is also essentially the same as a C callstack limit
+ * (except perhaps with some relaxed threading assumptions).
+ */
+ DUK_D(DUK_DPRINT("call prevented because call stack limit reached"));
+ DUK_ERROR_RANGE(thr, DUK_STR_CALLSTACK_LIMIT);
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE void duk__call_callstack_limit_check(duk_hthread *thr) {
+ /* This check is forcibly inlined because it's very cheap and almost
+ * always passes. The slow path is forcibly noinline.
+ */
+ if (DUK_LIKELY(thr->callstack_top < DUK_USE_CALLSTACK_LIMIT)) {
+ return;
+ }
+
+ duk__call_callstack_limit_check_slowpath(thr);
+}
+
+/*
+ * Interrupt counter fixup (for development only).
+ */
+
+#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)
+DUK_LOCAL void duk__interrupt_fixup(duk_hthread *thr, duk_hthread *entry_curr_thread) {
+ /* Currently the bytecode executor and executor interrupt
+ * instruction counts are off because we don't execute the
+ * interrupt handler when we're about to exit from the initial
+ * user call into Duktape.
+ *
+ * If we were to execute the interrupt handler here, the counts
+ * would match. You can enable this block manually to check
+ * that this is the case.
+ */
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+
+#if defined(DUK_USE_INTERRUPT_DEBUG_FIXUP)
+ if (entry_curr_thread == NULL) {
+ thr->interrupt_init = thr->interrupt_init - thr->interrupt_counter;
+ thr->heap->inst_count_interrupt += thr->interrupt_init;
+ DUK_DD(DUK_DDPRINT("debug test: updated interrupt count on exit to "
+ "user code, instruction counts: executor=%ld, interrupt=%ld",
+ (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt));
+ DUK_ASSERT(thr->heap->inst_count_exec == thr->heap->inst_count_interrupt);
+ }
+#else
+ DUK_UNREF(thr);
+ DUK_UNREF(entry_curr_thread);
+#endif
+}
+#endif
+
+/*
+ * Arguments object creation.
+ *
+ * Creating arguments objects involves many small details, see E5 Section
+ * 10.6 for the specific requirements. Much of the arguments object exotic
+ * behavior is implemented in duk_hobject_props.c, and is enabled by the
+ * object flag DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS.
+ */
+
+DUK_LOCAL void duk__create_arguments_object(duk_hthread *thr,
+ duk_hobject *func,
+ duk_hobject *varenv,
+ duk_idx_t idx_args) {
+ duk_hobject *arg; /* 'arguments' */
+ duk_hobject *formals; /* formals for 'func' (may be NULL if func is a C function) */
+ duk_idx_t i_arg;
+ duk_idx_t i_map;
+ duk_idx_t i_mappednames;
+ duk_idx_t i_formals;
+ duk_idx_t i_argbase;
+ duk_idx_t n_formals;
+ duk_idx_t idx;
+ duk_idx_t num_stack_args;
+ duk_bool_t need_map;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_NONBOUND_FUNCTION(func));
+ DUK_ASSERT(varenv != NULL);
+
+ /* [ ... func this arg1(@idx_args) ... argN envobj ]
+ * [ arg1(@idx_args) ... argN envobj ] (for tailcalls)
+ */
+
+ need_map = 0;
+
+ i_argbase = idx_args;
+ num_stack_args = duk_get_top(thr) - i_argbase - 1;
+ DUK_ASSERT(i_argbase >= 0);
+ DUK_ASSERT(num_stack_args >= 0);
+
+ duk_push_hobject(thr, func);
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS);
+ formals = duk_get_hobject(thr, -1);
+ if (formals) {
+ n_formals = (duk_idx_t) duk_get_length(thr, -1);
+ } else {
+ /* This shouldn't happen without tampering of internal
+ * properties: if a function accesses 'arguments', _Formals
+ * is kept. Check for the case anyway in case internal
+ * properties have been modified manually.
+ */
+ DUK_D(DUK_DPRINT("_Formals is undefined when creating arguments, use n_formals == 0"));
+ n_formals = 0;
+ }
+ duk_remove_m2(thr); /* leave formals on stack for later use */
+ i_formals = duk_require_top_index(thr);
+
+ DUK_ASSERT(n_formals >= 0);
+ DUK_ASSERT(formals != NULL || n_formals == 0);
+
+ DUK_DDD(DUK_DDDPRINT("func=%!O, formals=%!O, n_formals=%ld",
+ (duk_heaphdr *) func, (duk_heaphdr *) formals,
+ (long) n_formals));
+
+ /* [ ... formals ] */
+
+ /*
+ * Create required objects:
+ * - 'arguments' object: array-like, but not an array
+ * - 'map' object: internal object, tied to 'arguments'
+ * - 'mappedNames' object: temporary value used during construction
+ */
+
+ arg = duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_FLAG_ARRAY_PART |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARGUMENTS),
+ DUK_BIDX_OBJECT_PROTOTYPE);
+ DUK_ASSERT(arg != NULL);
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),
+ -1); /* no prototype */
+ (void) duk_push_object_helper(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_FLAG_FASTREFS |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),
+ -1); /* no prototype */
+ i_arg = duk_get_top(thr) - 3;
+ i_map = i_arg + 1;
+ i_mappednames = i_arg + 2;
+
+ /* [ ... formals arguments map mappedNames ] */
+
+ DUK_DDD(DUK_DDDPRINT("created arguments related objects: "
+ "arguments at index %ld -> %!O "
+ "map at index %ld -> %!O "
+ "mappednames at index %ld -> %!O",
+ (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg),
+ (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map),
+ (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames)));
+
+ /*
+ * Init arguments properties, map, etc.
+ */
+
+ duk_push_int(thr, num_stack_args);
+ duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_WC);
+
+ /*
+ * Init argument related properties.
+ */
+
+ /* step 11 */
+ idx = num_stack_args - 1;
+ while (idx >= 0) {
+ DUK_DDD(DUK_DDDPRINT("arg idx %ld, argbase=%ld, argidx=%ld",
+ (long) idx, (long) i_argbase, (long) (i_argbase + idx)));
+
+ DUK_DDD(DUK_DDDPRINT("define arguments[%ld]=arg", (long) idx));
+ duk_dup(thr, i_argbase + idx);
+ duk_xdef_prop_index_wec(thr, i_arg, (duk_uarridx_t) idx);
+ DUK_DDD(DUK_DDDPRINT("defined arguments[%ld]=arg", (long) idx));
+
+ /* step 11.c is relevant only if non-strict (checked in 11.c.ii) */
+ if (!DUK_HOBJECT_HAS_STRICT(func) && idx < n_formals) {
+ DUK_ASSERT(formals != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("strict function, index within formals (%ld < %ld)",
+ (long) idx, (long) n_formals));
+
+ duk_get_prop_index(thr, i_formals, (duk_uarridx_t) idx);
+ DUK_ASSERT(duk_is_string(thr, -1));
+
+ duk_dup_top(thr); /* [ ... name name ] */
+
+ if (!duk_has_prop(thr, i_mappednames)) {
+ /* steps 11.c.ii.1 - 11.c.ii.4, but our internal book-keeping
+ * differs from the reference model
+ */
+
+ /* [ ... name ] */
+
+ need_map = 1;
+
+ DUK_DDD(DUK_DDDPRINT("set mappednames[%s]=%ld",
+ (const char *) duk_get_string(thr, -1),
+ (long) idx));
+ duk_dup_top(thr); /* name */
+ (void) duk_push_uint_to_hstring(thr, (duk_uint_t) idx); /* index */
+ duk_xdef_prop_wec(thr, i_mappednames); /* out of spec, must be configurable */
+
+ DUK_DDD(DUK_DDDPRINT("set map[%ld]=%s",
+ (long) idx,
+ duk_get_string(thr, -1)));
+ duk_dup_top(thr); /* name */
+ duk_xdef_prop_index_wec(thr, i_map, (duk_uarridx_t) idx); /* out of spec, must be configurable */
+ } else {
+ /* duk_has_prop() popped the second 'name' */
+ }
+
+ /* [ ... name ] */
+ duk_pop(thr); /* pop 'name' */
+ }
+
+ idx--;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("actual arguments processed"));
+
+ /* step 12 */
+ if (need_map) {
+ DUK_DDD(DUK_DDDPRINT("adding 'map' and 'varenv' to arguments object"));
+
+ /* should never happen for a strict callee */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func));
+
+ duk_dup(thr, i_map);
+ duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_MAP, DUK_PROPDESC_FLAGS_NONE); /* out of spec, don't care */
+
+ /* The variable environment for magic variable bindings needs to be
+ * given by the caller and recorded in the arguments object.
+ *
+ * See E5 Section 10.6, the creation of setters/getters.
+ *
+ * The variable environment also provides access to the callee, so
+ * an explicit (internal) callee property is not needed.
+ */
+
+ duk_push_hobject(thr, varenv);
+ duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_VARENV, DUK_PROPDESC_FLAGS_NONE); /* out of spec, don't care */
+ }
+
+ /* steps 13-14 */
+ if (DUK_HOBJECT_HAS_STRICT(func)) {
+ /* Callee/caller are throwers and are not deletable etc. They
+ * could be implemented as virtual properties, but currently
+ * there is no support for virtual properties which are accessors
+ * (only plain virtual properties). This would not be difficult
+ * to change in duk_hobject_props, but we can make the throwers
+ * normal, concrete properties just as easily.
+ *
+ * Note that the specification requires that the *same* thrower
+ * built-in object is used here! See E5 Section 10.6 main
+ * algoritm, step 14, and Section 13.2.3 which describes the
+ * thrower. See test case test-arguments-throwers.js.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("strict function, setting caller/callee to throwers"));
+
+ duk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLER);
+ duk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLEE);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("non-strict function, setting callee to actual value"));
+ duk_push_hobject(thr, func);
+ duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_CALLEE, DUK_PROPDESC_FLAGS_WC);
+ }
+
+ /* set exotic behavior only after we're done */
+ if (need_map) {
+ /* Exotic behaviors are only enabled for arguments objects
+ * which have a parameter map (see E5 Section 10.6 main
+ * algorithm, step 12).
+ *
+ * In particular, a non-strict arguments object with no
+ * mapped formals does *NOT* get exotic behavior, even
+ * for e.g. "caller" property. This seems counterintuitive
+ * but seems to be the case.
+ */
+
+ /* cannot be strict (never mapped variables) */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func));
+
+ DUK_DDD(DUK_DDDPRINT("enabling exotic behavior for arguments object"));
+ DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(arg);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("not enabling exotic behavior for arguments object"));
+ }
+
+ DUK_DDD(DUK_DDDPRINT("final arguments related objects: "
+ "arguments at index %ld -> %!O "
+ "map at index %ld -> %!O "
+ "mappednames at index %ld -> %!O",
+ (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg),
+ (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map),
+ (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames)));
+
+ /* [ args(n) envobj formals arguments map mappednames ] */
+
+ duk_pop_2(thr);
+ duk_remove_m2(thr);
+
+ /* [ args(n) envobj arguments ] */
+}
+
+/* Helper for creating the arguments object and adding it to the env record
+ * on top of the value stack.
+ */
+DUK_LOCAL void duk__handle_createargs_for_call(duk_hthread *thr,
+ duk_hobject *func,
+ duk_hobject *env,
+ duk_idx_t idx_args) {
+ DUK_DDD(DUK_DDDPRINT("creating arguments object for function call"));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func));
+
+ /* [ ... arg1 ... argN envobj ] */
+
+ duk__create_arguments_object(thr,
+ func,
+ env,
+ idx_args);
+
+ /* [ ... arg1 ... argN envobj argobj ] */
+
+ duk_xdef_prop_stridx_short(thr,
+ -2,
+ DUK_STRIDX_LC_ARGUMENTS,
+ DUK_HOBJECT_HAS_STRICT(func) ? DUK_PROPDESC_FLAGS_E : /* strict: non-deletable, non-writable */
+ DUK_PROPDESC_FLAGS_WE); /* non-strict: non-deletable, writable */
+ /* [ ... arg1 ... argN envobj ] */
+}
+
+/*
+ * Helpers for constructor call handling.
+ *
+ * There are two [[Construct]] operations in the specification:
+ *
+ * - E5 Section 13.2.2: for Function objects
+ * - E5 Section 15.3.4.5.2: for "bound" Function objects
+ *
+ * The chain of bound functions is resolved in Section 15.3.4.5.2,
+ * with arguments "piling up" until the [[Construct]] internal
+ * method is called on the final, actual Function object. Note
+ * that the "prototype" property is looked up *only* from the
+ * final object, *before* calling the constructor.
+ *
+ * Since Duktape 2.2 bound functions are represented with the
+ * duk_hboundfunc internal type, and bound function chains are
+ * collapsed when a bound function is created. As a result, the
+ * direct target of a duk_hboundfunc is always non-bound and the
+ * this/argument lists have been resolved.
+ *
+ * When constructing new Array instances, an unnecessary object is
+ * created and discarded now: the standard [[Construct]] creates an
+ * object, and calls the Array constructor. The Array constructor
+ * returns an Array instance, which is used as the result value for
+ * the "new" operation; the object created before the Array constructor
+ * call is discarded.
+ *
+ * This would be easy to fix, e.g. by knowing that the Array constructor
+ * will always create a replacement object and skip creating the fallback
+ * object in that case.
+ */
+
+/* Update default instance prototype for constructor call. */
+DUK_LOCAL void duk__update_default_instance_proto(duk_hthread *thr, duk_idx_t idx_func) {
+ duk_hobject *proto;
+ duk_hobject *fallback;
+
+ DUK_ASSERT(duk_is_constructable(thr, idx_func));
+
+ duk_get_prop_stridx_short(thr, idx_func, DUK_STRIDX_PROTOTYPE);
+ proto = duk_get_hobject(thr, -1);
+ if (proto == NULL) {
+ DUK_DDD(DUK_DDDPRINT("constructor has no 'prototype' property, or value not an object "
+ "-> leave standard Object prototype as fallback prototype"));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("constructor has 'prototype' property with object value "
+ "-> set fallback prototype to that value: %!iO", (duk_heaphdr *) proto));
+ /* Original fallback (default instance) is untouched when
+ * resolving bound functions etc.
+ */
+ fallback = duk_known_hobject(thr, idx_func + 1);
+ DUK_ASSERT(fallback != NULL);
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, fallback, proto);
+ }
+ duk_pop(thr);
+}
+
+/* Postprocess: return value special handling, error augmentation. */
+DUK_INTERNAL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant) {
+ /* Use either fallback (default instance) or retval depending
+ * on retval type. Needs to be called before unwind because
+ * the default instance is read from the current (immutable)
+ * 'this' binding.
+ *
+ * For Proxy 'construct' calls the return value must be an
+ * Object (we accept object-like values like buffers and
+ * lightfuncs too). If not, TypeError.
+ */
+ if (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT |
+ DUK_TYPE_MASK_BUFFER |
+ DUK_TYPE_MASK_LIGHTFUNC)) {
+ DUK_DDD(DUK_DDDPRINT("replacement value"));
+ } else {
+ if (DUK_UNLIKELY(proxy_invariant != 0U)) {
+ /* Proxy 'construct' return value invariant violated. */
+ DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr);
+ }
+ /* XXX: direct value stack access */
+ duk_pop(thr);
+ duk_push_this(thr);
+ }
+
+#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
+ /* Augment created errors upon creation, not when they are thrown or
+ * rethrown. __FILE__ and __LINE__ are not desirable here; the call
+ * stack reflects the caller which is correct. Skip topmost, unwound
+ * activation when creating a traceback. If thr->ptr_curr_pc was !=
+ * NULL we'd need to sync the current PC so that the traceback comes
+ * out right; however it is always synced here so just assert for it.
+ */
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ duk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE |
+ DUK_AUGMENT_FLAG_SKIP_ONE);
+#endif
+}
+
+/*
+ * Helper for handling a bound function when a call is being made.
+ *
+ * Assumes that bound function chains have been "collapsed" so that either
+ * the target is non-bound or there is one bound function that points to a
+ * nonbound target.
+ *
+ * Prepends the bound arguments to the value stack (at idx_func + 2).
+ * The 'this' binding is also updated if necessary (at idx_func + 1).
+ * Note that for constructor calls the 'this' binding is never updated by
+ * [[BoundThis]].
+ */
+
+DUK_LOCAL void duk__handle_bound_chain_for_call(duk_hthread *thr,
+ duk_idx_t idx_func,
+ duk_bool_t is_constructor_call) {
+ duk_tval *tv_func;
+ duk_hobject *func;
+ duk_idx_t len;
+
+ DUK_ASSERT(thr != NULL);
+
+ /* On entry, item at idx_func is a bound, non-lightweight function,
+ * but we don't rely on that below.
+ */
+
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+
+ tv_func = duk_require_tval(thr, idx_func);
+ DUK_ASSERT(tv_func != NULL);
+
+ if (DUK_TVAL_IS_OBJECT(tv_func)) {
+ func = DUK_TVAL_GET_OBJECT(tv_func);
+
+ /* XXX: separate helper function, out of fast path? */
+ if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) {
+ duk_hboundfunc *h_bound;
+ duk_tval *tv_args;
+ duk_tval *tv_gap;
+
+ h_bound = (duk_hboundfunc *) func;
+ tv_args = h_bound->args;
+ len = h_bound->nargs;
+ DUK_ASSERT(len == 0 || tv_args != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("bound function encountered, ptr=%p: %!T",
+ (void *) DUK_TVAL_GET_OBJECT(tv_func), tv_func));
+
+ /* [ ... func this arg1 ... argN ] */
+
+ if (is_constructor_call) {
+ /* See: tests/ecmascript/test-spec-bound-constructor.js */
+ DUK_DDD(DUK_DDDPRINT("constructor call: don't update this binding"));
+ } else {
+ /* XXX: duk_replace_tval */
+ duk_push_tval(thr, &h_bound->this_binding);
+ duk_replace(thr, idx_func + 1); /* idx_this = idx_func + 1 */
+ }
+
+ /* [ ... func this arg1 ... argN ] */
+
+ duk_require_stack(thr, len);
+
+ tv_gap = duk_reserve_gap(thr, idx_func + 2, len);
+ duk_copy_tvals_incref(thr, tv_gap, tv_args, (duk_size_t) len);
+
+ /* [ ... func this <bound args> arg1 ... argN ] */
+
+ duk_push_tval(thr, &h_bound->target);
+ duk_replace(thr, idx_func); /* replace in stack */
+
+ DUK_DDD(DUK_DDDPRINT("bound function handled, idx_func=%ld, curr func=%!T",
+ (long) idx_func, duk_get_tval(thr, idx_func)));
+ }
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) {
+ /* Lightweight function: never bound, so terminate. */
+ ;
+ } else {
+ /* Shouldn't happen, so ugly error is enough. */
+ DUK_ERROR_INTERNAL(thr);
+ }
+
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+
+ DUK_DDD(DUK_DDDPRINT("final non-bound function is: %!T", duk_get_tval(thr, idx_func)));
+
+#if defined(DUK_USE_ASSERTIONS)
+ tv_func = duk_require_tval(thr, idx_func);
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func) || DUK_TVAL_IS_OBJECT(tv_func));
+ if (DUK_TVAL_IS_OBJECT(tv_func)) {
+ func = DUK_TVAL_GET_OBJECT(tv_func);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func) ||
+ DUK_HOBJECT_HAS_NATFUNC(func));
+ }
+#endif
+}
+
+/*
+ * Helper for inline handling of .call(), .apply(), and .construct().
+ */
+
+DUK_LOCAL duk_bool_t duk__handle_specialfuncs_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hobject *func, duk_small_uint_t *call_flags, duk_bool_t first) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_c_function natfunc;
+#endif
+ duk_tval *tv_args;
+
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT((*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0); /* Caller. */
+
+#if defined(DUK_USE_ASSERTIONS)
+ natfunc = ((duk_hnatfunc *) func)->func;
+ DUK_ASSERT(natfunc != NULL);
+#endif
+
+ /* On every round of function resolution at least target function and
+ * 'this' binding are set. We can assume that here, and must guarantee
+ * it on exit. Value stack reserve is extended for bound function and
+ * .apply() unpacking so we don't need to extend it here when we need a
+ * few slots.
+ */
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+
+ /* Handle native 'eval' specially. A direct eval check is only made
+ * for the first resolution attempt; e.g. a bound eval call is -not-
+ * a direct eval call.
+ */
+ if (DUK_UNLIKELY(((duk_hnatfunc *) func)->magic == 15)) {
+ /* For now no special handling except for direct eval
+ * detection.
+ */
+ DUK_ASSERT(((duk_hnatfunc *) func)->func == duk_bi_global_object_eval);
+ if (first && (*call_flags & DUK_CALL_FLAG_CALLED_AS_EVAL)) {
+ *call_flags = (*call_flags & ~DUK_CALL_FLAG_CALLED_AS_EVAL) | DUK_CALL_FLAG_DIRECT_EVAL;
+ }
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+ return 1; /* stop resolving */
+ }
+
+ /* Handle special functions based on the DUK_HOBJECT_FLAG_SPECIAL_CALL
+ * flag; their magic value is used for switch-case.
+ *
+ * NOTE: duk_unpack_array_like() reserves value stack space
+ * for the result values (unlike most other value stack calls).
+ */
+ switch (((duk_hnatfunc *) func)->magic) {
+ case 0: { /* 0=Function.prototype.call() */
+ /* Value stack:
+ * idx_func + 0: Function.prototype.call() [removed]
+ * idx_func + 1: this binding for .call (target function)
+ * idx_func + 2: 1st argument to .call, desired 'this' binding
+ * idx_func + 3: 2nd argument to .call, desired 1st argument for ultimate target
+ * ...
+ *
+ * Remove idx_func + 0 to get:
+ * idx_func + 0: target function
+ * idx_func + 1: this binding
+ * idx_func + 2: call arguments
+ * ...
+ */
+ DUK_ASSERT(natfunc == duk_bi_function_prototype_call);
+ duk_remove_unsafe(thr, idx_func);
+ tv_args = thr->valstack_bottom + idx_func + 2;
+ if (thr->valstack_top < tv_args) {
+ DUK_ASSERT(tv_args <= thr->valstack_end);
+ thr->valstack_top = tv_args; /* at least target function and 'this' binding present */
+ }
+ break;
+ }
+ case 1: { /* 1=Function.prototype.apply() */
+ /* Value stack:
+ * idx_func + 0: Function.prototype.apply() [removed]
+ * idx_func + 1: this binding for .apply (target function)
+ * idx_func + 2: 1st argument to .apply, desired 'this' binding
+ * idx_func + 3: 2nd argument to .apply, argArray
+ * [anything after this MUST be ignored]
+ *
+ * Remove idx_func + 0 and unpack the argArray to get:
+ * idx_func + 0: target function
+ * idx_func + 1: this binding
+ * idx_func + 2: call arguments
+ * ...
+ */
+ DUK_ASSERT(natfunc == duk_bi_function_prototype_apply);
+ duk_remove_unsafe(thr, idx_func);
+ goto apply_shared;
+ }
+#if defined(DUK_USE_REFLECT_BUILTIN)
+ case 2: { /* 2=Reflect.apply() */
+ /* Value stack:
+ * idx_func + 0: Reflect.apply() [removed]
+ * idx_func + 1: this binding for .apply (ignored, usually Reflect) [removed]
+ * idx_func + 2: 1st argument to .apply, target function
+ * idx_func + 3: 2nd argument to .apply, desired 'this' binding
+ * idx_func + 4: 3rd argument to .apply, argArray
+ * [anything after this MUST be ignored]
+ *
+ * Remove idx_func + 0 and idx_func + 1, and unpack the argArray to get:
+ * idx_func + 0: target function
+ * idx_func + 1: this binding
+ * idx_func + 2: call arguments
+ * ...
+ */
+ DUK_ASSERT(natfunc == duk_bi_reflect_apply);
+ duk_remove_n_unsafe(thr, idx_func, 2);
+ goto apply_shared;
+ }
+ case 3: { /* 3=Reflect.construct() */
+ /* Value stack:
+ * idx_func + 0: Reflect.construct() [removed]
+ * idx_func + 1: this binding for .construct (ignored, usually Reflect) [removed]
+ * idx_func + 2: 1st argument to .construct, target function
+ * idx_func + 3: 2nd argument to .construct, argArray
+ * idx_func + 4: 3rd argument to .construct, newTarget
+ * [anything after this MUST be ignored]
+ *
+ * Remove idx_func + 0 and idx_func + 1, unpack the argArray,
+ * and insert default instance (prototype not yet updated), to get:
+ * idx_func + 0: target function
+ * idx_func + 1: this binding (default instance)
+ * idx_func + 2: constructor call arguments
+ * ...
+ *
+ * Call flags must be updated to reflect the fact that we're
+ * now dealing with a constructor call, and e.g. the 'this'
+ * binding cannot be overwritten if the target is bound.
+ *
+ * newTarget is checked but not yet passed onwards.
+ */
+
+ duk_idx_t top;
+
+ DUK_ASSERT(natfunc == duk_bi_reflect_construct);
+ *call_flags |= DUK_CALL_FLAG_CONSTRUCT;
+ duk_remove_n_unsafe(thr, idx_func, 2);
+ top = duk_get_top(thr);
+ if (!duk_is_constructable(thr, idx_func)) {
+ /* Target constructability must be checked before
+ * unpacking argArray (which may cause side effects).
+ * Just return; caller will throw the error.
+ */
+ duk_set_top_unsafe(thr, idx_func + 2); /* satisfy asserts */
+ break;
+ }
+ duk_push_object(thr);
+ duk_insert(thr, idx_func + 1); /* default instance */
+
+ /* [ ... func default_instance argArray newTarget? ] */
+
+ top = duk_get_top(thr);
+ if (top < idx_func + 3) {
+ /* argArray is a mandatory argument for Reflect.construct(). */
+ DUK_ERROR_TYPE_INVALID_ARGS(thr);
+ }
+ if (top > idx_func + 3) {
+ if (!duk_strict_equals(thr, idx_func, idx_func + 3)) {
+ /* XXX: [[Construct]] newTarget currently unsupported */
+ DUK_ERROR_UNSUPPORTED(thr);
+ }
+ duk_set_top_unsafe(thr, idx_func + 3); /* remove any args beyond argArray */
+ }
+ DUK_ASSERT(duk_get_top(thr) == idx_func + 3);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func + 2));
+ (void) duk_unpack_array_like(thr, idx_func + 2); /* XXX: should also remove target to be symmetric with duk_pack()? */
+ duk_remove(thr, idx_func + 2);
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+ break;
+ }
+#endif /* DUK_USE_REFLECT_BUILTIN */
+ default: {
+ DUK_ASSERT(0);
+ DUK_UNREACHABLE();
+ }
+ }
+
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+ return 0; /* keep resolving */
+
+ apply_shared:
+ tv_args = thr->valstack_bottom + idx_func + 2;
+ if (thr->valstack_top <= tv_args) {
+ DUK_ASSERT(tv_args <= thr->valstack_end);
+ thr->valstack_top = tv_args; /* at least target func and 'this' binding present */
+ /* No need to check for argArray. */
+ } else {
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 3); /* idx_func + 2 covered above */
+ if (thr->valstack_top > tv_args + 1) {
+ duk_set_top_unsafe(thr, idx_func + 3); /* remove any args beyond argArray */
+ }
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func + 2));
+ if (!duk_is_callable(thr, idx_func)) {
+ /* Avoid unpack side effects if the target isn't callable.
+ * Calling code will throw the actual error.
+ */
+ } else {
+ (void) duk_unpack_array_like(thr, idx_func + 2);
+ duk_remove(thr, idx_func + 2);
+ }
+ }
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+ return 0; /* keep resolving */
+}
+
+/*
+ * Helper for Proxy handling.
+ */
+
+#if defined(DUK_USE_ES6_PROXY)
+DUK_LOCAL void duk__handle_proxy_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hproxy *h_proxy, duk_small_uint_t *call_flags) {
+ duk_bool_t rc;
+
+ /* Value stack:
+ * idx_func + 0: Proxy object
+ * idx_func + 1: this binding for call
+ * idx_func + 2: 1st argument for call
+ * idx_func + 3: 2nd argument for call
+ * ...
+ *
+ * If Proxy doesn't have a trap for the call ('apply' or 'construct'),
+ * replace Proxy object with target object.
+ *
+ * If we're dealing with a normal call and the Proxy has an 'apply'
+ * trap, manipulate value stack to:
+ *
+ * idx_func + 0: trap
+ * idx_func + 1: Proxy's handler
+ * idx_func + 2: Proxy's target
+ * idx_func + 3: this binding for call (from idx_func + 1)
+ * idx_func + 4: call arguments packed to an array
+ *
+ * If we're dealing with a constructor call and the Proxy has a
+ * 'construct' trap, manipulate value stack to:
+ *
+ * idx_func + 0: trap
+ * idx_func + 1: Proxy's handler
+ * idx_func + 2: Proxy's target
+ * idx_func + 3: call arguments packed to an array
+ * idx_func + 4: newTarget == Proxy object here
+ *
+ * As we don't yet have proper newTarget support, the newTarget at
+ * idx_func + 3 is just the original constructor being called, i.e.
+ * the Proxy object (not the target). Note that the default instance
+ * (original 'this' binding) is dropped and ignored.
+ */
+
+ duk_push_hobject(thr, h_proxy->handler);
+ rc = duk_get_prop_stridx_short(thr, -1, (*call_flags & DUK_CALL_FLAG_CONSTRUCT) ? DUK_STRIDX_CONSTRUCT : DUK_STRIDX_APPLY);
+ if (rc == 0) {
+ /* Not found, continue to target. If this is a construct
+ * call, update default instance prototype using the Proxy,
+ * not the target.
+ */
+ if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ if (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) {
+ *call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED;
+ duk__update_default_instance_proto(thr, idx_func);
+ }
+ }
+ duk_pop_2(thr);
+ duk_push_hobject(thr, h_proxy->target);
+ duk_replace(thr, idx_func);
+ return;
+ }
+
+ /* Here we must be careful not to replace idx_func while
+ * h_proxy is still needed, otherwise h_proxy may become
+ * dangling. This could be improved e.g. using a
+ * duk_pack_slice() with a freeform slice.
+ */
+
+ /* Here:
+ * idx_func + 0: Proxy object
+ * idx_func + 1: this binding for call
+ * idx_func + 2: 1st argument for call
+ * idx_func + 3: 2nd argument for call
+ * ...
+ * idx_func + N: handler
+ * idx_func + N + 1: trap
+ */
+
+ duk_insert(thr, idx_func + 1);
+ duk_insert(thr, idx_func + 2);
+ duk_push_hobject(thr, h_proxy->target);
+ duk_insert(thr, idx_func + 3);
+ duk_pack(thr, duk_get_top(thr) - (idx_func + 5));
+
+ /* Here:
+ * idx_func + 0: Proxy object
+ * idx_func + 1: trap
+ * idx_func + 2: Proxy's handler
+ * idx_func + 3: Proxy's target
+ * idx_func + 4: this binding for call
+ * idx_func + 5: arguments array
+ */
+ DUK_ASSERT(duk_get_top(thr) == idx_func + 6);
+
+ if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ *call_flags |= DUK_CALL_FLAG_CONSTRUCT_PROXY; /* Enable 'construct' trap return invariant check. */
+ *call_flags &= ~(DUK_CALL_FLAG_CONSTRUCT); /* Resume as non-constructor call to the trap. */
+
+ /* 'apply' args: target, thisArg, argArray
+ * 'construct' args: target, argArray, newTarget
+ */
+ duk_remove(thr, idx_func + 4);
+ duk_push_hobject(thr, (duk_hobject *) h_proxy);
+ }
+
+ /* Finalize value stack layout by removing Proxy reference. */
+ duk_remove(thr, idx_func);
+ h_proxy = NULL; /* invalidated */
+ DUK_ASSERT(duk_get_top(thr) == idx_func + 5);
+}
+#endif /* DUK_USE_ES6_PROXY */
+
+/*
+ * Helper for setting up var_env and lex_env of an activation,
+ * assuming it does NOT have the DUK_HOBJECT_FLAG_NEWENV flag.
+ */
+
+DUK_LOCAL void duk__handle_oldenv_for_call(duk_hthread *thr,
+ duk_hobject *func,
+ duk_activation *act) {
+ duk_hcompfunc *f;
+ duk_hobject *h_lex;
+ duk_hobject *h_var;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV(func));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func));
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(func));
+ DUK_UNREF(thr);
+
+ f = (duk_hcompfunc *) func;
+ h_lex = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f);
+ h_var = DUK_HCOMPFUNC_GET_VARENV(thr->heap, f);
+ DUK_ASSERT(h_lex != NULL); /* Always true for closures (not for templates) */
+ DUK_ASSERT(h_var != NULL);
+ act->lex_env = h_lex;
+ act->var_env = h_var;
+ DUK_HOBJECT_INCREF(thr, h_lex);
+ DUK_HOBJECT_INCREF(thr, h_var);
+}
+
+/*
+ * Helper for updating callee 'caller' property.
+ */
+
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+DUK_LOCAL void duk__update_func_caller_prop(duk_hthread *thr, duk_hobject *func) {
+ duk_tval *tv_caller;
+ duk_hobject *h_tmp;
+ duk_activation *act_callee;
+ duk_activation *act_caller;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound chain resolved */
+ DUK_ASSERT(thr->callstack_top >= 1);
+
+ if (DUK_HOBJECT_HAS_STRICT(func)) {
+ /* Strict functions don't get their 'caller' updated. */
+ return;
+ }
+
+ DUK_ASSERT(thr->callstack_top > 0);
+ act_callee = thr->callstack_curr;
+ DUK_ASSERT(act_callee != NULL);
+ act_caller = (thr->callstack_top >= 2 ? act_callee->parent : NULL);
+
+ /* XXX: check .caller writability? */
+
+ /* Backup 'caller' property and update its value. */
+ tv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr));
+ if (tv_caller) {
+ /* If caller is global/eval code, 'caller' should be set to
+ * 'null'.
+ *
+ * XXX: there is no exotic flag to infer this correctly now.
+ * The NEWENV flag is used now which works as intended for
+ * everything (global code, non-strict eval code, and functions)
+ * except strict eval code. Bound functions are never an issue
+ * because 'func' has been resolved to a non-bound function.
+ */
+
+ if (act_caller != NULL) {
+ /* act_caller->func may be NULL in some finalization cases,
+ * just treat like we don't know the caller.
+ */
+ if (act_caller->func && !DUK_HOBJECT_HAS_NEWENV(act_caller->func)) {
+ /* Setting to NULL causes 'caller' to be set to
+ * 'null' as desired.
+ */
+ act_caller = NULL;
+ }
+ }
+
+ if (DUK_TVAL_IS_OBJECT(tv_caller)) {
+ h_tmp = DUK_TVAL_GET_OBJECT(tv_caller);
+ DUK_ASSERT(h_tmp != NULL);
+ act_callee->prev_caller = h_tmp;
+
+ /* Previous value doesn't need refcount changes because its ownership
+ * is transferred to prev_caller.
+ */
+
+ if (act_caller != NULL) {
+ DUK_ASSERT(act_caller->func != NULL);
+ DUK_TVAL_SET_OBJECT(tv_caller, act_caller->func);
+ DUK_TVAL_INCREF(thr, tv_caller);
+ } else {
+ DUK_TVAL_SET_NULL(tv_caller); /* no incref */
+ }
+ } else {
+ /* 'caller' must only take on 'null' or function value */
+ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_caller));
+ DUK_ASSERT(act_callee->prev_caller == NULL);
+ if (act_caller != NULL && act_caller->func) {
+ /* Tolerate act_caller->func == NULL which happens in
+ * some finalization cases; treat like unknown caller.
+ */
+ DUK_TVAL_SET_OBJECT(tv_caller, act_caller->func);
+ DUK_TVAL_INCREF(thr, tv_caller);
+ } else {
+ DUK_TVAL_SET_NULL(tv_caller); /* no incref */
+ }
+ }
+ }
+}
+#endif /* DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */
+
+/*
+ * Shared helpers for resolving the final, non-bound target function of the
+ * call and the effective 'this' binding. Resolves bound functions and
+ * applies .call(), .apply(), and .construct() inline.
+ *
+ * Proxy traps are also handled inline so that if the target is a Proxy with
+ * a 'call' or 'construct' trap, the trap handler is called with a modified
+ * argument list.
+ *
+ * Once the bound function / .call() / .apply() / .construct() sequence has
+ * been resolved, the value at idx_func + 1 may need coercion described in
+ * E5 Section 10.4.3.
+ *
+ * A call that begins as a non-constructor call may be converted into a
+ * constructor call during the resolution process if Reflect.construct()
+ * is invoked. This is handled by updating the caller's call_flags.
+ *
+ * For global and eval code (E5 Sections 10.4.1 and 10.4.2), we assume
+ * that the caller has provided the correct 'this' binding explicitly
+ * when calling, i.e.:
+ *
+ * - global code: this=global object
+ * - direct eval: this=copy from eval() caller's this binding
+ * - other eval: this=global object
+ *
+ * The 'this' coercion may cause a recursive function call with arbitrary
+ * side effects, because ToObject() may be called.
+ */
+
+DUK_LOCAL DUK_INLINE void duk__coerce_nonstrict_this_binding(duk_hthread *thr, duk_idx_t idx_this) {
+ duk_tval *tv_this;
+ duk_hobject *obj_global;
+
+ tv_this = thr->valstack_bottom + idx_this;
+ switch (DUK_TVAL_GET_TAG(tv_this)) {
+ case DUK_TAG_OBJECT:
+ DUK_DDD(DUK_DDDPRINT("this binding: non-strict, object -> use directly"));
+ break;
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL:
+ DUK_DDD(DUK_DDDPRINT("this binding: non-strict, undefined/null -> use global object"));
+ obj_global = thr->builtins[DUK_BIDX_GLOBAL];
+ /* XXX: avoid this check somehow */
+ if (DUK_LIKELY(obj_global != NULL)) {
+ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this)); /* no need to decref previous value */
+ DUK_TVAL_SET_OBJECT(tv_this, obj_global);
+ DUK_HOBJECT_INCREF(thr, obj_global);
+ } else {
+ /* This may only happen if built-ins are being "torn down".
+ * This behavior is out of specification scope.
+ */
+ DUK_D(DUK_DPRINT("this binding: wanted to use global object, but it is NULL -> using undefined instead"));
+ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this)); /* no need to decref previous value */
+ DUK_TVAL_SET_UNDEFINED(tv_this); /* nothing to incref */
+ }
+ break;
+ default:
+ /* Plain buffers and lightfuncs are object coerced. Lightfuncs
+ * very rarely come here however, because the call target would
+ * need to be a non-strict non-lightfunc (lightfuncs are considered
+ * strict) with an explicit lightfunc 'this' binding.
+ */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_this));
+ DUK_DDD(DUK_DDDPRINT("this binding: non-strict, not object/undefined/null -> use ToObject(value)"));
+ duk_to_object(thr, idx_this); /* may have side effects */
+ break;
+ }
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__resolve_target_fastpath_check(duk_hthread *thr, duk_idx_t idx_func, duk_hobject **out_func, duk_small_uint_t call_flags) {
+#if defined(DUK_USE_PREFER_SIZE)
+ DUK_UNREF(thr);
+ DUK_UNREF(idx_func);
+ DUK_UNREF(out_func);
+ DUK_UNREF(call_flags);
+#else /* DUK_USE_PREFER_SIZE */
+ duk_tval *tv_func;
+ duk_hobject *func;
+
+ if (DUK_UNLIKELY(call_flags & DUK_CALL_FLAG_CONSTRUCT)) {
+ return 0;
+ }
+
+ tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func);
+ DUK_ASSERT(tv_func != NULL);
+
+ if (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv_func))) {
+ func = DUK_TVAL_GET_OBJECT(tv_func);
+ if (DUK_HOBJECT_IS_CALLABLE(func) &&
+ !DUK_HOBJECT_HAS_BOUNDFUNC(func) &&
+ !DUK_HOBJECT_HAS_SPECIAL_CALL(func)) {
+ *out_func = func;
+
+ if (DUK_HOBJECT_HAS_STRICT(func)) {
+ /* Strict function: no 'this' coercion. */
+ return 1;
+ }
+
+ duk__coerce_nonstrict_this_binding(thr, idx_func + 1);
+ return 1;
+ }
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) {
+ *out_func = NULL;
+
+ /* Lightfuncs are considered strict, so 'this' binding is
+ * used as is. They're never bound, always constructable,
+ * and never special functions.
+ */
+ return 1;
+ }
+#endif /* DUK_USE_PREFER_SIZE */
+ return 0; /* let slow path deal with it */
+}
+
+DUK_LOCAL duk_hobject *duk__resolve_target_func_and_this_binding(duk_hthread *thr,
+ duk_idx_t idx_func,
+ duk_small_uint_t *call_flags) {
+ duk_tval *tv_func;
+ duk_hobject *func;
+ duk_bool_t first;
+
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+
+ for (first = 1;; first = 0) {
+ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2);
+
+ tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func);
+ DUK_ASSERT(tv_func != NULL);
+
+ if (DUK_TVAL_IS_OBJECT(tv_func)) {
+ func = DUK_TVAL_GET_OBJECT(tv_func);
+
+ if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ if (DUK_UNLIKELY(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func))) {
+ goto not_constructable;
+ }
+ } else {
+ if (DUK_UNLIKELY(!DUK_HOBJECT_IS_CALLABLE(func))) {
+ goto not_callable;
+ }
+ }
+
+ if (DUK_LIKELY(!DUK_HOBJECT_HAS_BOUNDFUNC(func) &&
+ !DUK_HOBJECT_HAS_SPECIAL_CALL(func) &&
+ !DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func))) {
+ /* Common case, so test for using a single bitfield test.
+ * Break out to handle this coercion etc.
+ */
+ break;
+ }
+
+ /* XXX: could set specialcall for boundfuncs too, simplify check above */
+
+ if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) {
+ DUK_ASSERT(!DUK_HOBJECT_HAS_SPECIAL_CALL(func));
+ DUK_ASSERT(!DUK_HOBJECT_IS_NATFUNC(func));
+
+ /* Callable/constructable flags are the same
+ * for the bound function and its target, so
+ * we don't need to check them here, we can
+ * check them from the target only.
+ */
+ duk__handle_bound_chain_for_call(thr, idx_func, *call_flags & DUK_CALL_FLAG_CONSTRUCT);
+
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(duk_require_tval(thr, idx_func)) ||
+ DUK_TVAL_IS_LIGHTFUNC(duk_require_tval(thr, idx_func)));
+ } else {
+ DUK_ASSERT(DUK_HOBJECT_HAS_SPECIAL_CALL(func));
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func)) {
+ /* If no trap, resume processing from Proxy trap.
+ * If trap exists, helper converts call into a trap
+ * call; this may change a constructor call into a
+ * normal (non-constructor) trap call. We must
+ * continue processing even when a trap is found as
+ * the trap may be bound.
+ */
+ duk__handle_proxy_for_call(thr, idx_func, (duk_hproxy *) func, call_flags);
+ }
+ else
+#endif
+ {
+ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func));
+ DUK_ASSERT(DUK_HOBJECT_HAS_CALLABLE(func));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func));
+ /* Constructable check already done above. */
+
+ if (duk__handle_specialfuncs_for_call(thr, idx_func, func, call_flags, first) != 0) {
+ /* Encountered native eval call, normal call
+ * context. Break out, handle this coercion etc.
+ */
+ break;
+ }
+ }
+ }
+ /* Retry loop. */
+ } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) {
+ /* Lightfuncs are:
+ * - Always strict, so no 'this' coercion.
+ * - Always callable.
+ * - Always constructable.
+ * - Never specialfuncs.
+ */
+ func = NULL;
+ goto finished;
+ } else {
+ goto not_callable;
+ }
+ }
+
+ DUK_ASSERT(func != NULL);
+
+ if (!DUK_HOBJECT_HAS_STRICT(func)) {
+ /* Non-strict target needs 'this' coercion.
+ * This has potential side effects invalidating
+ * 'tv_func'.
+ */
+ duk__coerce_nonstrict_this_binding(thr, idx_func + 1);
+ }
+ if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ if (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) {
+ *call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED;
+ duk__update_default_instance_proto(thr, idx_func);
+ }
+ }
+
+ finished:
+
+#if defined(DUK_USE_ASSERTIONS)
+ {
+ duk_tval *tv_tmp;
+
+ tv_tmp = duk_get_tval(thr, idx_func);
+ DUK_ASSERT(tv_tmp != NULL);
+
+ DUK_ASSERT((DUK_TVAL_IS_OBJECT(tv_tmp) && DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(tv_tmp))) ||
+ DUK_TVAL_IS_LIGHTFUNC(tv_tmp));
+ DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));
+ DUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) ||
+ DUK_HOBJECT_IS_NATFUNC(func)));
+ DUK_ASSERT(func == NULL || (DUK_HOBJECT_HAS_CONSTRUCTABLE(func) ||
+ (*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0));
+ }
+#endif
+
+ return func;
+
+ not_callable:
+ DUK_ASSERT(tv_func != NULL);
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ /* GETPROPC delayed error handling: when target is not callable,
+ * GETPROPC replaces idx_func+0 with an Error (non-callable) with
+ * a hidden Symbol to signify it's to be thrown as is here. The
+ * hidden Symbol is only checked as an own property, not inherited
+ * (which would be dangerous).
+ */
+ if (DUK_TVAL_IS_OBJECT(tv_func)) {
+ if (duk_hobject_find_existing_entry_tval_ptr(thr->heap, DUK_TVAL_GET_OBJECT(tv_func), DUK_HTHREAD_STRING_INT_TARGET(thr)) != NULL) {
+ duk_push_tval(thr, tv_func);
+ (void) duk_throw(thr);
+ }
+ }
+#endif
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+#if defined(DUK_USE_PARANOID_ERRORS)
+ DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not callable", duk_get_type_name(thr, idx_func));
+#else
+ DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not callable", duk_push_string_tval_readable(thr, tv_func));
+#endif
+#else
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE);
+#endif
+ DUK_UNREACHABLE();
+ return NULL; /* never executed */
+
+ not_constructable:
+ /* For now GETPROPC delayed error not needed for constructor calls. */
+#if defined(DUK_USE_VERBOSE_ERRORS)
+#if defined(DUK_USE_PARANOID_ERRORS)
+ DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not constructable", duk_get_type_name(thr, idx_func));
+#else
+ DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not constructable", duk_push_string_tval_readable(thr, tv_func));
+#endif
+#else
+ DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONSTRUCTABLE);
+#endif
+ DUK_UNREACHABLE();
+ return NULL; /* never executed */
+}
+
+/*
+ * Manipulate value stack so that exactly 'num_stack_rets' return
+ * values are at 'idx_retbase' in every case, assuming there are
+ * 'rc' return values on top of stack.
+ *
+ * This is a bit tricky, because the called C function operates in
+ * the same activation record and may have e.g. popped the stack
+ * empty (below idx_retbase).
+ */
+
+DUK_LOCAL void duk__safe_call_adjust_valstack(duk_hthread *thr, duk_idx_t idx_retbase, duk_idx_t num_stack_rets, duk_idx_t num_actual_rets) {
+ duk_idx_t idx_rcbase;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(idx_retbase >= 0);
+ DUK_ASSERT(num_stack_rets >= 0);
+ DUK_ASSERT(num_actual_rets >= 0);
+
+ idx_rcbase = duk_get_top(thr) - num_actual_rets; /* base of known return values */
+ if (DUK_UNLIKELY(idx_rcbase < 0)) {
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("adjust valstack after func call: "
+ "num_stack_rets=%ld, num_actual_rets=%ld, stack_top=%ld, idx_retbase=%ld, idx_rcbase=%ld",
+ (long) num_stack_rets, (long) num_actual_rets, (long) duk_get_top(thr),
+ (long) idx_retbase, (long) idx_rcbase));
+
+ DUK_ASSERT(idx_rcbase >= 0); /* caller must check */
+
+ /* Space for num_stack_rets was reserved before the safe call.
+ * Because value stack reserve cannot shrink except in call returns,
+ * the reserve is still in place. Adjust valstack, carefully
+ * ensuring we don't overstep the reserve.
+ */
+
+ /* Match idx_rcbase with idx_retbase so that the return values
+ * start at the correct index.
+ */
+ if (idx_rcbase > idx_retbase) {
+ duk_idx_t count = idx_rcbase - idx_retbase;
+
+ DUK_DDD(DUK_DDDPRINT("elements at/after idx_retbase have enough to cover func retvals "
+ "(idx_retbase=%ld, idx_rcbase=%ld)", (long) idx_retbase, (long) idx_rcbase));
+
+ /* Remove values between irc_rcbase (start of intended return
+ * values) and idx_retbase to lower return values to idx_retbase.
+ */
+ DUK_ASSERT(count > 0);
+ duk_remove_n(thr, idx_retbase, count); /* may be NORZ */
+ } else {
+ duk_idx_t count = idx_retbase - idx_rcbase;
+
+ DUK_DDD(DUK_DDDPRINT("not enough elements at/after idx_retbase to cover func retvals "
+ "(idx_retbase=%ld, idx_rcbase=%ld)", (long) idx_retbase, (long) idx_rcbase));
+
+ /* Insert 'undefined' at idx_rcbase (start of intended return
+ * values) to lift return values to idx_retbase.
+ */
+ DUK_ASSERT(count >= 0);
+ DUK_ASSERT(thr->valstack_end - thr->valstack_top >= count); /* reserve cannot shrink */
+ duk_insert_undefined_n(thr, idx_rcbase, count);
+ }
+
+ /* Chop extra retvals away / extend with undefined. */
+ duk_set_top_unsafe(thr, idx_retbase + num_stack_rets);
+}
+
+/*
+ * Activation setup for tailcalls and non-tailcalls.
+ */
+
+#if defined(DUK_USE_TAILCALL)
+DUK_LOCAL duk_small_uint_t duk__call_setup_act_attempt_tailcall(duk_hthread *thr,
+ duk_small_uint_t call_flags,
+ duk_idx_t idx_func,
+ duk_hobject *func,
+ duk_size_t entry_valstack_bottom_byteoff,
+ duk_size_t entry_valstack_end_byteoff,
+ duk_idx_t *out_nargs,
+ duk_idx_t *out_nregs,
+ duk_size_t *out_vs_min_bytes,
+ duk_activation **out_act) {
+ duk_activation *act;
+ duk_tval *tv1, *tv2;
+ duk_idx_t idx_args;
+ duk_small_uint_t flags1, flags2;
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_activation *prev_pause_act;
+#endif
+
+ DUK_UNREF(entry_valstack_end_byteoff);
+
+ /* Tailcall cannot be flagged to resume calls, and a
+ * previous frame must exist.
+ */
+ DUK_ASSERT(thr->callstack_top >= 1);
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ *out_act = act;
+
+ if (func == NULL || !DUK_HOBJECT_IS_COMPFUNC(func)) {
+ DUK_DDD(DUK_DDDPRINT("tail call prevented by target not being ecma function"));
+ return 0;
+ }
+ if (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) {
+ DUK_DDD(DUK_DDDPRINT("tail call prevented by current activation having DUK_ACT_FLAG_PREVENT_YIELD"));
+ return 0;
+ }
+ /* Tailcall is only allowed if current and candidate
+ * function have identical return value handling. There
+ * are three possible return value handling cases:
+ * 1. Normal function call, no special return value handling.
+ * 2. Constructor call, return value replacement object check.
+ * 3. Proxy 'construct' trap call, return value invariant check.
+ */
+ flags1 = (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT) ? 1 : 0)
+#if defined(DUK_USE_ES6_PROXY)
+ | (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) ? 2 : 0)
+#endif
+ ;
+ flags2 = (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) ? 1 : 0)
+#if defined(DUK_USE_ES6_PROXY)
+ | (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) ? 2 : 0);
+#endif
+ ;
+ if (flags1 != flags2) {
+ DUK_DDD(DUK_DDDPRINT("tail call prevented by incompatible return value handling"));
+ return 0;
+ }
+ DUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT) && (call_flags & DUK_CALL_FLAG_CONSTRUCT)) ||
+ (!(act->flags & DUK_ACT_FLAG_CONSTRUCT) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT)));
+ DUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY)) ||
+ (!(act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY)));
+ if (DUK_HOBJECT_HAS_NOTAIL(func)) {
+ /* See: test-bug-tailcall-preventyield-assert.c. */
+ DUK_DDD(DUK_DDDPRINT("tail call prevented by function having a notail flag"));
+ return 0;
+ }
+
+ /*
+ * Tailcall handling
+ *
+ * Although the callstack entry is reused, we need to explicitly unwind
+ * the current activation (or simulate an unwind). In particular, the
+ * current activation must be closed, otherwise something like
+ * test-bug-reduce-judofyr.js results. Also catchers need to be unwound
+ * because there may be non-error-catching label entries in valid tail calls.
+ *
+ * Special attention is needed for debugger and pause behavior when
+ * reusing an activation.
+ * - Disable StepOut processing for the activation unwind because
+ * we reuse the activation, see:
+ * https://github.com/svaarala/duktape/issues/1684.
+ * - Disable line change pause flag permanently (if set) because
+ * it would no longer be relevant, see:
+ * https://github.com/svaarala/duktape/issues/1726.
+ * - Check for function entry (e.g. StepInto) pause flag here, because
+ * the executor pause check won't trigger due to shared activation, see:
+ * https://github.com/svaarala/duktape/issues/1726.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("is tail call, reusing activation at callstack top, at index %ld",
+ (long) (thr->callstack_top - 1)));
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(func));
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func));
+ DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);
+ DUK_ASSERT(call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA);
+
+ /* Unwind the topmost callstack entry before reusing it. This
+ * also unwinds the catchers related to the topmost entry.
+ */
+ DUK_ASSERT(thr->callstack_top > 0);
+ DUK_ASSERT(thr->callstack_curr != NULL);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ prev_pause_act = thr->heap->dbg_pause_act;
+ thr->heap->dbg_pause_act = NULL;
+ thr->heap->dbg_pause_flags &= ~DUK_PAUSE_FLAG_LINE_CHANGE;
+ if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function entry (tailcall)"));
+ duk_debug_set_paused(thr->heap);
+ }
+#endif
+ duk_hthread_activation_unwind_reuse_norz(thr);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ thr->heap->dbg_pause_act = prev_pause_act;
+#endif
+ DUK_ASSERT(act == thr->callstack_curr);
+
+ /* XXX: We could restore the caller's value stack reserve
+ * here, as if we did an actual unwind-and-call. Without
+ * the restoration, value stack reserve may remain higher
+ * than would otherwise be possible until we return to a
+ * non-tailcall.
+ */
+
+ /* Then reuse the unwound activation. */
+ act->cat = NULL;
+ act->var_env = NULL;
+ act->lex_env = NULL;
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func));
+ act->func = func; /* don't want an intermediate exposed state with func == NULL */
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ act->prev_caller = NULL;
+#endif
+ /* don't want an intermediate exposed state with invalid pc */
+ act->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ act->prev_line = 0;
+#endif
+ DUK_TVAL_SET_OBJECT(&act->tv_func, func); /* borrowed, no refcount */
+ DUK_HOBJECT_INCREF(thr, func);
+
+ act->flags = DUK_ACT_FLAG_TAILCALLED;
+ if (DUK_HOBJECT_HAS_STRICT(func)) {
+ act->flags |= DUK_ACT_FLAG_STRICT;
+ }
+ if (call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ act->flags |= DUK_ACT_FLAG_CONSTRUCT;
+ }
+#if defined(DUK_USE_ES6_PROXY)
+ if (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) {
+ act->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY;
+ }
+#endif
+
+ DUK_ASSERT(DUK_ACT_GET_FUNC(act) == func); /* already updated */
+ DUK_ASSERT(act->var_env == NULL);
+ DUK_ASSERT(act->lex_env == NULL);
+ act->bottom_byteoff = entry_valstack_bottom_byteoff; /* tail call -> reuse current "frame" */
+#if 0
+ /* Topmost activation retval_byteoff is considered garbage, no need to init. */
+ act->retval_byteoff = 0;
+#endif
+ /* Filled in when final reserve is known, dummy value doesn't matter
+ * even in error unwind because reserve_byteoff is only used when
+ * returning to -this- activation.
+ */
+ act->reserve_byteoff = 0;
+
+ /*
+ * Manipulate valstack so that args are on the current bottom and the
+ * previous caller's 'this' binding (which is the value preceding the
+ * current bottom) is replaced with the new 'this' binding:
+ *
+ * [ ... this_old | (crud) func this_new arg1 ... argN ]
+ * --> [ ... this_new | arg1 ... argN ]
+ *
+ * For tail calling to work properly, the valstack bottom must not grow
+ * here; otherwise crud would accumulate on the valstack.
+ */
+
+ tv1 = thr->valstack_bottom - 1;
+ tv2 = thr->valstack_bottom + idx_func + 1;
+ DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); /* tv1 is -below- valstack_bottom */
+ DUK_ASSERT(tv2 >= thr->valstack_bottom && tv2 < thr->valstack_top);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */
+
+ idx_args = idx_func + 2;
+ duk_remove_n(thr, 0, idx_args); /* may be NORZ */
+
+ idx_func = 0; DUK_UNREF(idx_func); /* really 'not applicable' anymore, should not be referenced after this */
+ idx_args = 0;
+
+ *out_nargs = ((duk_hcompfunc *) func)->nargs;
+ *out_nregs = ((duk_hcompfunc *) func)->nregs;
+ DUK_ASSERT(*out_nregs >= 0);
+ DUK_ASSERT(*out_nregs >= *out_nargs);
+ *out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA);
+
+
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+#if defined(DUK_USE_TAILCALL)
+#error incorrect options: tail calls enabled with function caller property
+#endif
+ /* XXX: This doesn't actually work properly for tail calls, so
+ * tail calls are disabled when DUK_USE_NONSTD_FUNC_CALLER_PROPERTY
+ * is in use.
+ */
+ duk__update_func_caller_prop(thr, func);
+#endif
+
+ /* [ ... this_new | arg1 ... argN ] */
+
+ return 1;
+}
+#endif /* DUK_USE_TAILCALL */
+
+DUK_LOCAL void duk__call_setup_act_not_tailcall(duk_hthread *thr,
+ duk_small_uint_t call_flags,
+ duk_idx_t idx_func,
+ duk_hobject *func,
+ duk_size_t entry_valstack_bottom_byteoff,
+ duk_size_t entry_valstack_end_byteoff,
+ duk_idx_t *out_nargs,
+ duk_idx_t *out_nregs,
+ duk_size_t *out_vs_min_bytes,
+ duk_activation **out_act) {
+ duk_activation *act;
+ duk_activation *new_act;
+
+ DUK_UNREF(entry_valstack_end_byteoff);
+
+ DUK_DDD(DUK_DDDPRINT("not a tail call, pushing a new activation to callstack, to index %ld",
+ (long) (thr->callstack_top)));
+
+ duk__call_callstack_limit_check(thr);
+ new_act = duk_hthread_activation_alloc(thr);
+ DUK_ASSERT(new_act != NULL);
+
+ act = thr->callstack_curr;
+ if (act != NULL) {
+ /*
+ * Update return value stack index of current activation (if any).
+ *
+ * Although it might seem this is not necessary (bytecode executor
+ * does this for Ecmascript-to-Ecmascript calls; other calls are
+ * handled here), this turns out to be necessary for handling yield
+ * and resume. For them, an Ecmascript-to-native call happens, and
+ * the Ecmascript call's retval_byteoff must be set for things to work.
+ */
+
+ act->retval_byteoff = entry_valstack_bottom_byteoff + (duk_size_t) idx_func * sizeof(duk_tval);
+ }
+
+ new_act->parent = act;
+ thr->callstack_curr = new_act;
+ thr->callstack_top++;
+ act = new_act;
+ *out_act = act;
+
+ DUK_ASSERT(thr->valstack_top > thr->valstack_bottom); /* at least effective 'this' */
+ DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));
+
+ act->cat = NULL;
+
+ act->flags = 0;
+ if (call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ act->flags |= DUK_ACT_FLAG_CONSTRUCT;
+ }
+#if defined(DUK_USE_ES6_PROXY)
+ if (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) {
+ act->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY;
+ }
+#endif
+ if (call_flags & DUK_CALL_FLAG_DIRECT_EVAL) {
+ act->flags |= DUK_ACT_FLAG_DIRECT_EVAL;
+ }
+
+ /* start of arguments: idx_func + 2. */
+ act->func = func; /* NULL for lightfunc */
+ if (DUK_LIKELY(func != NULL)) {
+ DUK_TVAL_SET_OBJECT(&act->tv_func, func); /* borrowed, no refcount */
+ if (DUK_HOBJECT_HAS_STRICT(func)) {
+ act->flags |= DUK_ACT_FLAG_STRICT;
+ }
+ if (DUK_HOBJECT_IS_COMPFUNC(func)) {
+ *out_nargs = ((duk_hcompfunc *) func)->nargs;
+ *out_nregs = ((duk_hcompfunc *) func)->nregs;
+ DUK_ASSERT(*out_nregs >= 0);
+ DUK_ASSERT(*out_nregs >= *out_nargs);
+ *out_vs_min_bytes = entry_valstack_bottom_byteoff +
+ sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA);
+ } else {
+ /* True because of call target lookup checks. */
+ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func));
+
+ *out_nargs = ((duk_hnatfunc *) func)->nargs;
+ *out_nregs = *out_nargs;
+ if (*out_nargs >= 0) {
+ *out_vs_min_bytes = entry_valstack_bottom_byteoff +
+ sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);
+ } else {
+ /* Vararg function. */
+ duk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack));
+ *out_vs_min_bytes = valstack_top_byteoff +
+ sizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);
+ }
+ }
+ } else {
+ duk_small_uint_t lf_flags;
+ duk_tval *tv_func;
+
+ act->flags |= DUK_ACT_FLAG_STRICT;
+
+ tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func);
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func));
+ DUK_TVAL_SET_TVAL(&act->tv_func, tv_func); /* borrowed, no refcount */
+
+ lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv_func);
+ *out_nargs = DUK_LFUNC_FLAGS_GET_NARGS(lf_flags);
+ if (*out_nargs != DUK_LFUNC_NARGS_VARARGS) {
+ *out_vs_min_bytes = entry_valstack_bottom_byteoff +
+ sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nargs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);
+ } else {
+ duk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack));
+ *out_vs_min_bytes = valstack_top_byteoff +
+ sizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);
+ *out_nargs = -1; /* vararg */
+ }
+ *out_nregs = *out_nargs;
+ }
+
+ act->var_env = NULL;
+ act->lex_env = NULL;
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ act->prev_caller = NULL;
+#endif
+ act->curr_pc = NULL;
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ act->prev_line = 0;
+#endif
+ act->bottom_byteoff = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U);
+#if 0
+ act->retval_byteoff = 0; /* topmost activation retval_byteoff is considered garbage, no need to init */
+#endif
+ /* Filled in when final reserve is known, dummy value doesn't matter
+ * even in error unwind because reserve_byteoff is only used when
+ * returning to -this- activation.
+ */
+ act->reserve_byteoff = 0; /* filled in by caller */
+
+ /* XXX: Is this INCREF necessary? 'func' is always a borrowed
+ * reference reachable through the value stack? If changed, stack
+ * unwind code also needs to be fixed to match.
+ */
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, func); /* act->func */
+
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ if (func) {
+ duk__update_func_caller_prop(thr, func);
+ }
+#endif
+}
+
+/*
+ * Environment setup.
+ */
+
+DUK_LOCAL void duk__call_env_setup(duk_hthread *thr, duk_hobject *func, duk_activation *act, duk_idx_t idx_args) {
+ duk_hobject *env;
+
+ DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound function has already been resolved */
+
+ if (DUK_LIKELY(func != NULL)) {
+ if (DUK_LIKELY(DUK_HOBJECT_HAS_NEWENV(func))) {
+ if (DUK_LIKELY(!DUK_HOBJECT_HAS_CREATEARGS(func))) {
+ /* Use a new environment but there's no 'arguments' object;
+ * delayed environment initialization. This is the most
+ * common case.
+ */
+ DUK_ASSERT(act->lex_env == NULL);
+ DUK_ASSERT(act->var_env == NULL);
+ } else {
+ /* Use a new environment and there's an 'arguments' object.
+ * We need to initialize it right now.
+ */
+
+ /* third arg: absolute index (to entire valstack) of bottom_byteoff of new activation */
+ env = duk_create_activation_environment_record(thr, func, act->bottom_byteoff);
+ DUK_ASSERT(env != NULL);
+
+ /* [ ... func this arg1 ... argN envobj ] */
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func));
+ duk__handle_createargs_for_call(thr, func, env, idx_args);
+
+ /* [ ... func this arg1 ... argN envobj ] */
+
+ act->lex_env = env;
+ act->var_env = env;
+ DUK_HOBJECT_INCREF(thr, env);
+ DUK_HOBJECT_INCREF(thr, env); /* XXX: incref by count (2) directly */
+ duk_pop(thr);
+ }
+ } else {
+ /* Use existing env (e.g. for non-strict eval); cannot have
+ * an own 'arguments' object (but can refer to an existing one).
+ */
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func));
+
+ duk__handle_oldenv_for_call(thr, func, act);
+
+ DUK_ASSERT(act->lex_env != NULL);
+ DUK_ASSERT(act->var_env != NULL);
+ }
+ } else {
+ /* Lightfuncs are always native functions and have "newenv". */
+ DUK_ASSERT(act->lex_env == NULL);
+ DUK_ASSERT(act->var_env == NULL);
+ }
+}
+
+/*
+ * Misc shared helpers.
+ */
+
+/* Check thread state, update current thread. */
+DUK_LOCAL void duk__call_thread_state_update(duk_hthread *thr) {
+ DUK_ASSERT(thr != NULL);
+
+ if (DUK_LIKELY(thr == thr->heap->curr_thread)) {
+ if (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_RUNNING)) {
+ /* Should actually never happen, but check anyway. */
+ goto thread_state_error;
+ }
+ } else {
+ DUK_ASSERT(thr->heap->curr_thread == NULL ||
+ thr->heap->curr_thread->state == DUK_HTHREAD_STATE_RUNNING);
+ if (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_INACTIVE)) {
+ goto thread_state_error;
+ }
+ DUK_HEAP_SWITCH_THREAD(thr->heap, thr);
+ thr->state = DUK_HTHREAD_STATE_RUNNING;
+
+ /* Multiple threads may be simultaneously in the RUNNING
+ * state, but not in the same "resume chain".
+ */
+ }
+ DUK_ASSERT(thr->heap->curr_thread == thr);
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);
+ return;
+
+ thread_state_error:
+ DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "invalid thread state (%ld)", (long) thr->state);
+ DUK_UNREACHABLE();
+}
+
+/*
+ * Main unprotected call handler, handles:
+ *
+ * - All combinations of native/Ecmascript caller and native/Ecmascript
+ * target.
+ *
+ * - Optimized Ecmascript-to-Ecmascript call where call handling only
+ * sets up a new duk_activation but reuses an existing bytecode executor
+ * (the caller) without native recursion.
+ *
+ * - Tailcalls, where an activation is reused without increasing call
+ * stack (duk_activation) depth.
+ *
+ * - Setup for an initial Duktape.Thread.resume().
+ *
+ * The call handler doesn't provide any protection guarantees, protected calls
+ * must be implemented e.g. by wrapping the call in a duk_safe_call().
+ * Call setup may fail at any stage, even when the new activation is in
+ * place; the only guarantee is that the state is consistent for unwinding.
+ */
+
+DUK_LOCAL duk_int_t duk__handle_call_raw(duk_hthread *thr,
+ duk_idx_t idx_func,
+ duk_small_uint_t call_flags) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_activation *entry_act;
+ duk_size_t entry_callstack_top;
+#endif
+ duk_size_t entry_valstack_bottom_byteoff;
+ duk_size_t entry_valstack_end_byteoff;
+ duk_int_t entry_call_recursion_depth;
+ duk_hthread *entry_curr_thread;
+ duk_uint_fast8_t entry_thread_state;
+ duk_instr_t **entry_ptr_curr_pc;
+ duk_idx_t idx_args;
+ duk_idx_t nargs; /* # argument registers target function wants (< 0 => "as is") */
+ duk_idx_t nregs; /* # total registers target function wants on entry (< 0 => "as is") */
+ duk_size_t vs_min_bytes; /* minimum value stack size (bytes) for handling call */
+ duk_hobject *func; /* 'func' on stack (borrowed reference) */
+ duk_activation *act;
+ duk_ret_t rc;
+ duk_small_uint_t use_tailcall;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ /* Asserts for heap->curr_thread omitted: it may be NULL, 'thr', or
+ * any other thread (e.g. when heap thread is used to run finalizers).
+ */
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+ DUK_ASSERT(idx_func >= 0);
+
+ DUK_STATS_INC(thr->heap, stats_call_all);
+
+ /* If a tail call:
+ * - an Ecmascript activation must be on top of the callstack
+ * - there cannot be any catch stack entries that would catch
+ * a return
+ */
+#if defined(DUK_USE_ASSERTIONS)
+ if (call_flags & DUK_CALL_FLAG_TAILCALL) {
+ duk_activation *tmp_act;
+ duk_catcher *tmp_cat;
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));
+
+ /* No entry in the catch stack which would actually catch a
+ * throw can refer to the callstack entry being reused.
+ * There *can* be catch stack entries referring to the current
+ * callstack entry as long as they don't catch (e.g. label sites).
+ */
+
+ tmp_act = thr->callstack_curr;
+ for (tmp_cat = tmp_act->cat; tmp_cat != NULL; tmp_cat = tmp_cat->parent) {
+ DUK_ASSERT(DUK_CAT_GET_TYPE(tmp_cat) == DUK_CAT_TYPE_LABEL); /* a non-catching entry */
+ }
+ }
+#endif /* DUK_USE_ASSERTIONS */
+
+ /*
+ * Store entry state.
+ */
+
+#if defined(DUK_USE_ASSERTIONS)
+ entry_act = thr->callstack_curr;
+ entry_callstack_top = thr->callstack_top;
+#endif
+ entry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack);
+ entry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);
+ entry_call_recursion_depth = thr->heap->call_recursion_depth;
+ entry_curr_thread = thr->heap->curr_thread; /* may be NULL if first call */
+ entry_thread_state = thr->state;
+ entry_ptr_curr_pc = thr->ptr_curr_pc; /* may be NULL */
+
+ /* If thr->ptr_curr_pc is set, sync curr_pc to act->pc. Then NULL
+ * thr->ptr_curr_pc so that it's not accidentally used with an incorrect
+ * activation when side effects occur.
+ */
+ duk_hthread_sync_and_null_currpc(thr);
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+
+ DUK_DD(DUK_DDPRINT("duk__handle_call_raw: thr=%p, idx_func=%ld, "
+ "call_flags=0x%08lx (constructor=%ld), "
+ "valstack_top=%ld, idx_func=%ld, idx_args=%ld, rec_depth=%ld/%ld, "
+ "entry_valstack_bottom_byteoff=%ld, entry_valstack_end_byteoff=%ld, "
+ "entry_call_recursion_depth=%ld, "
+ "entry_curr_thread=%p, entry_thread_state=%ld",
+ (void *) thr,
+ (long) idx_func,
+ (unsigned long) call_flags,
+ (long) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) != 0 ? 1 : 0),
+ (long) duk_get_top(thr),
+ (long) idx_func,
+ (long) (idx_func + 2),
+ (long) thr->heap->call_recursion_depth,
+ (long) thr->heap->call_recursion_limit,
+ (long) entry_valstack_bottom_byteoff,
+ (long) entry_valstack_end_byteoff,
+ (long) entry_call_recursion_depth,
+ (void *) entry_curr_thread,
+ (long) entry_thread_state));
+
+ /*
+ * Thread state check and book-keeping.
+ */
+
+ duk__call_thread_state_update(thr);
+
+ /*
+ * Resolve final target function; handle bound functions and special
+ * functions like .call() and .apply(). Also figure out the effective
+ * 'this' binding, which replaces the current value at idx_func + 1.
+ */
+
+ if (DUK_LIKELY(duk__resolve_target_fastpath_check(thr, idx_func, &func, call_flags) != 0U)) {
+ DUK_DDD(DUK_DDDPRINT("fast path target resolve"));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("slow path target resolve"));
+ func = duk__resolve_target_func_and_this_binding(thr, idx_func, &call_flags);
+ }
+ DUK_ASSERT(duk_get_top(thr) - idx_func >= 2); /* at least func and this present */
+
+ DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));
+ DUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) ||
+ DUK_HOBJECT_IS_NATFUNC(func)));
+
+ /* [ ... func this arg1 ... argN ] */
+
+ /*
+ * Setup a preliminary activation and figure out nargs/nregs and
+ * value stack minimum size.
+ *
+ * Don't touch valstack_bottom or valstack_top yet so that Duktape API
+ * calls work normally.
+ *
+ * Because 'act' is not zeroed, all fields must be filled in.
+ */
+
+#if defined(DUK_USE_TAILCALL)
+ use_tailcall = (call_flags & DUK_CALL_FLAG_TAILCALL);
+ if (use_tailcall) {
+ use_tailcall = duk__call_setup_act_attempt_tailcall(thr,
+ call_flags,
+ idx_func,
+ func,
+ entry_valstack_bottom_byteoff,
+ entry_valstack_end_byteoff,
+ &nargs,
+ &nregs,
+ &vs_min_bytes,
+ &act);
+ }
+#else
+ DUK_ASSERT((call_flags & DUK_CALL_FLAG_TAILCALL) == 0); /* compiler ensures this */
+ use_tailcall = 0;
+#endif
+
+ if (use_tailcall) {
+ idx_args = 0;
+ DUK_STATS_INC(thr->heap, stats_call_tailcall);
+ } else {
+ duk__call_setup_act_not_tailcall(thr,
+ call_flags,
+ idx_func,
+ func,
+ entry_valstack_bottom_byteoff,
+ entry_valstack_end_byteoff,
+ &nargs,
+ &nregs,
+ &vs_min_bytes,
+ &act);
+ idx_args = idx_func + 2;
+ }
+ /* After this point idx_func is no longer valid for tailcalls. */
+
+ DUK_ASSERT(act != NULL);
+
+ /* [ ... func this arg1 ... argN ] */
+
+ /*
+ * Environment record creation and 'arguments' object creation.
+ * Named function expression name binding is handled by the
+ * compiler; the compiled function's parent env will contain
+ * the (immutable) binding already.
+ *
+ * This handling is now identical for C and Ecmascript functions.
+ * C functions always have the 'NEWENV' flag set, so their
+ * environment record initialization is delayed (which is good).
+ *
+ * Delayed creation (on demand) is handled in duk_js_var.c.
+ */
+
+ duk__call_env_setup(thr, func, act, idx_args);
+
+ /* [ ... func this arg1 ... argN ] */
+
+ /*
+ * Setup value stack: clamp to 'nargs', fill up to 'nregs',
+ * ensure value stack size matches target requirements, and
+ * switch value stack bottom. Valstack top is kept.
+ *
+ * Value stack can only grow here.
+ */
+
+ duk_valstack_grow_check_throw(thr, vs_min_bytes);
+ act->reserve_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);
+
+ if (use_tailcall) {
+ DUK_ASSERT(nregs >= 0);
+ DUK_ASSERT(nregs >= nargs);
+ duk_set_top_and_wipe(thr, nregs, nargs);
+ } else {
+ if (nregs >= 0) {
+ DUK_ASSERT(nregs >= nargs);
+ duk_set_top_and_wipe(thr, idx_func + 2 + nregs, idx_func + 2 + nargs);
+ } else {
+ ;
+ }
+ thr->valstack_bottom = thr->valstack_bottom + idx_func + 2;
+ }
+ DUK_ASSERT(thr->valstack_bottom >= thr->valstack);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_top);
+
+ /*
+ * Make the actual call. For Ecma-to-Ecma calls detect that
+ * setup is complete, then return with a status code that allows
+ * the caller to reuse the running executor.
+ */
+
+ if (func != NULL && DUK_HOBJECT_IS_COMPFUNC(func)) {
+ /*
+ * Ecmascript call.
+ */
+
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func));
+ act->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func);
+
+ if (call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA) {
+ DUK_DD(DUK_DDPRINT("avoid native call, use existing executor"));
+ DUK_STATS_INC(thr->heap, stats_call_ecmatoecma);
+ DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);
+ DUK_REFZERO_CHECK_FAST(thr);
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ return 1; /* 1=reuse executor */
+ }
+ DUK_ASSERT(use_tailcall == 0);
+
+ /* duk_hthread_activation_unwind_norz() will decrease this on unwind */
+ DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);
+ act->flags |= DUK_ACT_FLAG_PREVENT_YIELD;
+ thr->callstack_preventcount++;
+
+ /* XXX: we could just do this on entry regardless of reuse, as long
+ * as recursion depth is decreased for e2e case.
+ */
+ duk__call_c_recursion_limit_check(thr);
+ thr->heap->call_recursion_depth++;
+
+ /* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */
+
+ /*
+ * Bytecode executor call.
+ *
+ * Execute bytecode, handling any recursive function calls and
+ * thread resumptions. Returns when execution would return from
+ * the entry level activation. When the executor returns, a
+ * single return value is left on the stack top.
+ *
+ * The only possible longjmp() is an error (DUK_LJ_TYPE_THROW),
+ * other types are handled internally by the executor.
+ */
+
+ /* thr->ptr_curr_pc is set by bytecode executor early on entry */
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ DUK_DDD(DUK_DDDPRINT("entering bytecode execution"));
+ duk_js_execute_bytecode(thr);
+ DUK_DDD(DUK_DDDPRINT("returned from bytecode execution"));
+ } else {
+ /*
+ * Native call.
+ */
+
+ DUK_ASSERT(func == NULL || ((duk_hnatfunc *) func)->func != NULL);
+ DUK_ASSERT(use_tailcall == 0);
+
+ /* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */
+
+ /* duk_hthread_activation_unwind_norz() will decrease this on unwind */
+ DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);
+ act->flags |= DUK_ACT_FLAG_PREVENT_YIELD;
+ thr->callstack_preventcount++;
+
+ /* XXX: we could just do this on entry regardless of reuse, as long
+ * as recursion depth is decreased for e2e case.
+ */
+ duk__call_c_recursion_limit_check(thr);
+ thr->heap->call_recursion_depth++;
+
+ /* For native calls must be NULL so we don't sync back */
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+
+ /* XXX: native funcptr could come out of call setup. */
+ if (func) {
+ rc = ((duk_hnatfunc *) func)->func(thr);
+ } else {
+ duk_tval *tv_func;
+ duk_c_function funcptr;
+
+ tv_func = &act->tv_func;
+ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func));
+ funcptr = DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv_func);
+ rc = funcptr(thr);
+ }
+
+ /* Automatic error throwing, retval check. */
+
+ if (rc == 0) {
+ DUK_ASSERT(thr->valstack < thr->valstack_end);
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));
+ thr->valstack_top++;
+ } else if (rc == 1) {
+ ;
+ } else if (rc < 0) {
+ duk_error_throw_from_negative_rc(thr, rc);
+ DUK_UNREACHABLE();
+ } else {
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC);
+ }
+ }
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ DUK_ASSERT(use_tailcall == 0);
+
+ /*
+ * Constructor call post processing.
+ */
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (call_flags & (DUK_CALL_FLAG_CONSTRUCT | DUK_CALL_FLAG_CONSTRUCT_PROXY)) {
+ duk_call_construct_postprocess(thr, call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY);
+ }
+#else
+ if (call_flags & DUK_CALL_FLAG_CONSTRUCT) {
+ duk_call_construct_postprocess(thr, 0);
+ }
+#endif
+
+ /*
+ * Unwind, restore valstack bottom and other book-keeping.
+ */
+
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_curr->parent == entry_act);
+ DUK_ASSERT(thr->callstack_top == entry_callstack_top + 1);
+ duk_hthread_activation_unwind_norz(thr);
+ DUK_ASSERT(thr->callstack_curr == entry_act);
+ DUK_ASSERT(thr->callstack_top == entry_callstack_top);
+
+ thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff);
+ /* keep current valstack_top */
+ DUK_ASSERT(thr->valstack_bottom >= thr->valstack);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_top);
+ DUK_ASSERT(thr->valstack_top - thr->valstack_bottom >= idx_func + 1);
+
+ /* Return value handling. */
+
+ /* [ ... func this (crud) retval ] */
+
+ {
+ duk_tval *tv_ret;
+ duk_tval *tv_funret;
+
+ tv_ret = thr->valstack_bottom + idx_func;
+ tv_funret = thr->valstack_top - 1;
+#if defined(DUK_USE_FASTINT)
+ /* Explicit check for fastint downgrade. */
+ DUK_TVAL_CHKFAST_INPLACE_FAST(tv_funret);
+#endif
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv_ret, tv_funret); /* side effects */
+ }
+
+ duk_set_top_unsafe(thr, idx_func + 1);
+
+ /* [ ... retval ] */
+
+ /* Restore caller's value stack reserve (cannot fail). */
+ DUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff >= (duk_uint8_t *) thr->valstack_top);
+ DUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff <= (duk_uint8_t *) thr->valstack_alloc_end);
+ thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff);
+
+ /* XXX: Trial value stack shrink would be OK here, but we'd need
+ * to prevent side effects of the potential realloc.
+ */
+
+ /* Restore entry thread executor curr_pc stack frame pointer. */
+ thr->ptr_curr_pc = entry_ptr_curr_pc;
+
+ DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */
+ thr->state = (duk_uint8_t) entry_thread_state;
+
+ /* Disabled assert: triggered with some torture tests. */
+#if 0
+ DUK_ASSERT((thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread == NULL) || /* first call */
+ (thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread != NULL) || /* other call */
+ (thr->state == DUK_HTHREAD_STATE_RUNNING && thr->heap->curr_thread == thr)); /* current thread */
+#endif
+
+ thr->heap->call_recursion_depth = entry_call_recursion_depth;
+
+ /* If the debugger is active we need to force an interrupt so that
+ * debugger breakpoints are rechecked. This is important for function
+ * calls caused by side effects (e.g. when doing a DUK_OP_GETPROP), see
+ * GH-303. Only needed for success path, error path always causes a
+ * breakpoint recheck in the executor. It would be enough to set this
+ * only when returning to an Ecmascript activation, but setting the flag
+ * on every return should have no ill effect.
+ */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (duk_debug_is_attached(thr->heap)) {
+ DUK_DD(DUK_DDPRINT("returning with debugger enabled, force interrupt"));
+ DUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init);
+ thr->interrupt_init -= thr->interrupt_counter;
+ thr->interrupt_counter = 0;
+ thr->heap->dbg_force_restart = 1;
+ }
+#endif
+
+#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)
+ duk__interrupt_fixup(thr, entry_curr_thread);
+#endif
+
+ /* Restored by success path. */
+ DUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth);
+ DUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc);
+ DUK_ASSERT_LJSTATE_UNSET(thr->heap);
+
+ DUK_REFZERO_CHECK_FAST(thr);
+
+ return 0; /* 0=call handled inline */
+}
+
+DUK_INTERNAL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr,
+ duk_idx_t nargs,
+ duk_small_uint_t call_flags) {
+ duk_idx_t idx_func;
+ DUK_ASSERT(duk_get_top(thr) >= nargs + 2);
+ idx_func = duk_get_top(thr) - (nargs + 2);
+ DUK_ASSERT(idx_func >= 0);
+ return duk_handle_call_unprotected(thr, idx_func, call_flags);
+}
+
+DUK_INTERNAL duk_int_t duk_handle_call_unprotected(duk_hthread *thr,
+ duk_idx_t idx_func,
+ duk_small_uint_t call_flags) {
+ DUK_ASSERT(duk_is_valid_index(thr, idx_func));
+ DUK_ASSERT(idx_func >= 0);
+ return duk__handle_call_raw(thr, idx_func, call_flags);
+}
+
+/*
+ * duk_handle_safe_call(): make a "C protected call" within the
+ * current activation.
+ *
+ * The allowed thread states for making a call are the same as for
+ * duk_handle_call_protected().
+ *
+ * Even though this call is protected, errors are thrown for insane arguments
+ * and may result in a fatal error unless there's another protected call which
+ * catches such errors.
+ *
+ * The error handling path should be error free, even for out-of-memory
+ * errors, to ensure safe sandboxing. (As of Duktape 2.2.0 this is not
+ * yet the case for environment closing which may run out of memory, see
+ * XXX notes below.)
+ */
+
+DUK_LOCAL void duk__handle_safe_call_inner(duk_hthread *thr,
+ duk_safe_call_function func,
+ void *udata,
+#if defined(DUK_USE_ASSERTIONS)
+ duk_size_t entry_valstack_bottom_byteoff,
+ duk_size_t entry_callstack_top,
+#endif
+ duk_hthread *entry_curr_thread,
+ duk_uint_fast8_t entry_thread_state,
+ duk_idx_t idx_retbase,
+ duk_idx_t num_stack_rets) {
+ duk_ret_t rc;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT_CTX_VALID(thr);
+
+ /*
+ * Thread state check and book-keeping.
+ */
+
+ duk__call_thread_state_update(thr);
+
+ /*
+ * Recursion limit check.
+ */
+
+ duk__call_c_recursion_limit_check(thr);
+ thr->heap->call_recursion_depth++;
+
+ /*
+ * Make the C call.
+ */
+
+ rc = func(thr, udata);
+
+ DUK_DDD(DUK_DDDPRINT("safe_call, func rc=%ld", (long) rc));
+
+ /*
+ * Valstack manipulation for results.
+ */
+
+ /* we're running inside the caller's activation, so no change in call/catch stack or valstack bottom */
+ DUK_ASSERT(thr->callstack_top == entry_callstack_top);
+ DUK_ASSERT(thr->valstack_bottom >= thr->valstack);
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff);
+ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);
+ DUK_ASSERT(thr->valstack_end >= thr->valstack_top);
+
+ if (DUK_UNLIKELY(rc < 0)) {
+ duk_error_throw_from_negative_rc(thr, rc);
+ }
+ DUK_ASSERT(rc >= 0);
+
+ duk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, rc); /* throws for insane rc */
+
+ DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */
+ thr->state = (duk_uint8_t) entry_thread_state;
+}
+
+DUK_LOCAL void duk__handle_safe_call_error(duk_hthread *thr,
+ duk_activation *entry_act,
+#if defined(DUK_USE_ASSERTIONS)
+ duk_size_t entry_callstack_top,
+#endif
+ duk_hthread *entry_curr_thread,
+ duk_uint_fast8_t entry_thread_state,
+ duk_idx_t idx_retbase,
+ duk_idx_t num_stack_rets,
+ duk_size_t entry_valstack_bottom_byteoff,
+ duk_jmpbuf *old_jmpbuf_ptr) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT_CTX_VALID(thr);
+
+ /*
+ * Error during call. The error value is at heap->lj.value1.
+ *
+ * The very first thing we do is restore the previous setjmp catcher.
+ * This means that any error in error handling will propagate outwards
+ * instead of causing a setjmp() re-entry above.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("error caught during protected duk_handle_safe_call()"));
+
+ /* Other longjmp types are handled by executor before propagating
+ * the error here.
+ */
+ DUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW);
+ DUK_ASSERT_LJSTATE_SET(thr->heap);
+
+ /* Either pointer may be NULL (at entry), so don't assert. */
+ thr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr;
+
+ /* XXX: callstack unwind may now throw an error when closing
+ * scopes; this is a sandboxing issue, described in:
+ * https://github.com/svaarala/duktape/issues/476
+ */
+ /* XXX: "unwind to" primitive? */
+
+ DUK_ASSERT(thr->callstack_top >= entry_callstack_top);
+ while (thr->callstack_curr != entry_act) {
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ duk_hthread_activation_unwind_norz(thr);
+ }
+ DUK_ASSERT(thr->callstack_top == entry_callstack_top);
+
+ /* Switch active thread before any side effects to avoid a
+ * dangling curr_thread pointer.
+ */
+ DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */
+ thr->state = (duk_uint8_t) entry_thread_state;
+
+ DUK_ASSERT(thr->heap->curr_thread == entry_curr_thread);
+ DUK_ASSERT(thr->state == entry_thread_state);
+
+ /* Restore valstack bottom. */
+ thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff);
+
+ /* [ ... | (crud) ] */
+
+ /* XXX: ensure space in valstack (now relies on internal reserve)? */
+ duk_push_tval(thr, &thr->heap->lj.value1);
+
+ /* [ ... | (crud) errobj ] */
+
+ DUK_ASSERT(duk_get_top(thr) >= 1); /* at least errobj must be on stack */
+
+ duk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, 1); /* 1 = num actual 'return values' */
+
+ /* [ ... | ] or [ ... | errobj (M * undefined)] where M = num_stack_rets - 1 */
+
+ /* Reset longjmp state. */
+ thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN;
+ thr->heap->lj.iserror = 0;
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value1);
+ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value2);
+
+ /* Error handling complete, remove side effect protections. Caller
+ * will process pending finalizers.
+ */
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(thr->heap->error_not_allowed == 1);
+ thr->heap->error_not_allowed = 0;
+#endif
+ DUK_ASSERT(thr->heap->pf_prevent_count > 0);
+ thr->heap->pf_prevent_count--;
+ DUK_DD(DUK_DDPRINT("safe call error handled, pf_prevent_count updated to %ld", (long) thr->heap->pf_prevent_count));
+
+ /* thr->ptr_curr_pc is restored by
+ * duk__handle_safe_call_shared_unwind() which is also used for
+ * success path.
+ */
+}
+
+DUK_LOCAL void duk__handle_safe_call_shared_unwind(duk_hthread *thr,
+ duk_idx_t idx_retbase,
+ duk_idx_t num_stack_rets,
+#if defined(DUK_USE_ASSERTIONS)
+ duk_size_t entry_callstack_top,
+#endif
+ duk_int_t entry_call_recursion_depth,
+ duk_hthread *entry_curr_thread,
+ duk_instr_t **entry_ptr_curr_pc) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT_CTX_VALID(thr);
+ DUK_UNREF(idx_retbase);
+ DUK_UNREF(num_stack_rets);
+ DUK_UNREF(entry_curr_thread);
+
+ DUK_ASSERT(thr->callstack_top == entry_callstack_top);
+
+ /* Restore entry thread executor curr_pc stack frame pointer.
+ * XXX: would be enough to do in error path only, should nest
+ * cleanly in success path.
+ */
+ thr->ptr_curr_pc = entry_ptr_curr_pc;
+
+ thr->heap->call_recursion_depth = entry_call_recursion_depth;
+
+ /* stack discipline consistency check */
+ DUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets);
+
+ /* A debugger forced interrupt check is not needed here, as
+ * problematic safe calls are not caused by side effects.
+ */
+
+#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)
+ duk__interrupt_fixup(thr, entry_curr_thread);
+#endif
+}
+
+DUK_INTERNAL duk_int_t duk_handle_safe_call(duk_hthread *thr,
+ duk_safe_call_function func,
+ void *udata,
+ duk_idx_t num_stack_args,
+ duk_idx_t num_stack_rets) {
+ duk_activation *entry_act;
+ duk_size_t entry_valstack_bottom_byteoff;
+#if defined(DUK_USE_ASSERTIONS)
+ duk_size_t entry_valstack_end_byteoff;
+ duk_size_t entry_callstack_top;
+ duk_size_t entry_callstack_preventcount;
+#endif
+ duk_int_t entry_call_recursion_depth;
+ duk_hthread *entry_curr_thread;
+ duk_uint_fast8_t entry_thread_state;
+ duk_instr_t **entry_ptr_curr_pc;
+ duk_jmpbuf *old_jmpbuf_ptr = NULL;
+ duk_jmpbuf our_jmpbuf;
+ duk_idx_t idx_retbase;
+ duk_int_t retval;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(duk_get_top(thr) >= num_stack_args); /* Caller ensures. */
+
+ DUK_STATS_INC(thr->heap, stats_safecall_all);
+
+ /* Value stack reserve handling: safe call assumes caller has reserved
+ * space for nrets (assuming optimal unwind processing). Value stack
+ * reserve is not stored/restored as for normal calls because a safe
+ * call conceptually happens in the same activation.
+ */
+
+ /* Careful with indices like '-x'; if 'x' is zero, it refers to bottom */
+ entry_act = thr->callstack_curr;
+ entry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack);
+#if defined(DUK_USE_ASSERTIONS)
+ entry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);
+ entry_callstack_top = thr->callstack_top;
+ entry_callstack_preventcount = thr->callstack_preventcount;
+#endif
+ entry_call_recursion_depth = thr->heap->call_recursion_depth;
+ entry_curr_thread = thr->heap->curr_thread; /* may be NULL if first call */
+ entry_thread_state = thr->state;
+ entry_ptr_curr_pc = thr->ptr_curr_pc; /* may be NULL */
+ idx_retbase = duk_get_top(thr) - num_stack_args; /* not a valid stack index if num_stack_args == 0 */
+ DUK_ASSERT(idx_retbase >= 0);
+
+ DUK_ASSERT((duk_idx_t) (thr->valstack_top - thr->valstack_bottom) >= num_stack_args); /* Caller ensures. */
+ DUK_ASSERT((duk_idx_t) (thr->valstack_end - (thr->valstack_bottom + idx_retbase)) >= num_stack_rets); /* Caller ensures. */
+
+ /* Cannot portably debug print a function pointer, hence 'func' not printed! */
+ DUK_DD(DUK_DDPRINT("duk_handle_safe_call: thr=%p, num_stack_args=%ld, num_stack_rets=%ld, "
+ "valstack_top=%ld, idx_retbase=%ld, rec_depth=%ld/%ld, "
+ "entry_act=%p, entry_valstack_bottom_byteoff=%ld, entry_call_recursion_depth=%ld, "
+ "entry_curr_thread=%p, entry_thread_state=%ld",
+ (void *) thr,
+ (long) num_stack_args,
+ (long) num_stack_rets,
+ (long) duk_get_top(thr),
+ (long) idx_retbase,
+ (long) thr->heap->call_recursion_depth,
+ (long) thr->heap->call_recursion_limit,
+ (void *) entry_act,
+ (long) entry_valstack_bottom_byteoff,
+ (long) entry_call_recursion_depth,
+ (void *) entry_curr_thread,
+ (long) entry_thread_state));
+
+ /* Setjmp catchpoint setup. */
+ old_jmpbuf_ptr = thr->heap->lj.jmpbuf_ptr;
+ thr->heap->lj.jmpbuf_ptr = &our_jmpbuf;
+
+ /* Prevent yields for the duration of the safe call. This only
+ * matters if the executor makes safe calls to functions that
+ * yield, this doesn't currently happen.
+ */
+ thr->callstack_preventcount++;
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ try {
+#else
+ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr == &our_jmpbuf);
+ if (DUK_SETJMP(our_jmpbuf.jb) == 0) {
+ /* Success path. */
+#endif
+ DUK_DDD(DUK_DDDPRINT("safe_call setjmp catchpoint setup complete"));
+
+ duk__handle_safe_call_inner(thr,
+ func,
+ udata,
+#if defined(DUK_USE_ASSERTIONS)
+ entry_valstack_bottom_byteoff,
+ entry_callstack_top,
+#endif
+ entry_curr_thread,
+ entry_thread_state,
+ idx_retbase,
+ num_stack_rets);
+
+ DUK_STATS_INC(thr->heap, stats_safecall_nothrow);
+
+ /* Either pointer may be NULL (at entry), so don't assert */
+ thr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr;
+
+ /* If calls happen inside the safe call, these are restored by
+ * whatever calls are made. Reserve cannot decrease.
+ */
+ DUK_ASSERT(thr->callstack_curr == entry_act);
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);
+
+ retval = DUK_EXEC_SUCCESS;
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ } catch (duk_internal_exception &exc) {
+ DUK_UNREF(exc);
+#else
+ } else {
+ /* Error path. */
+#endif
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);
+
+ DUK_STATS_INC(thr->heap, stats_safecall_throw);
+
+ duk__handle_safe_call_error(thr,
+ entry_act,
+#if defined(DUK_USE_ASSERTIONS)
+ entry_callstack_top,
+#endif
+ entry_curr_thread,
+ entry_thread_state,
+ idx_retbase,
+ num_stack_rets,
+ entry_valstack_bottom_byteoff,
+ old_jmpbuf_ptr);
+
+ retval = DUK_EXEC_ERROR;
+ }
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ catch (std::exception &exc) {
+ const char *what = exc.what();
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);
+ DUK_STATS_INC(thr->heap, stats_safecall_throw);
+ if (!what) {
+ what = "unknown";
+ }
+ DUK_D(DUK_DPRINT("unexpected c++ std::exception (perhaps thrown by user code)"));
+ try {
+ DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "caught invalid c++ std::exception '%s' (perhaps thrown by user code)", what);
+ } catch (duk_internal_exception exc) {
+ DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ std::exception"));
+ DUK_UNREF(exc);
+ duk__handle_safe_call_error(thr,
+ entry_act,
+#if defined(DUK_USE_ASSERTIONS)
+ entry_callstack_top,
+#endif
+ entry_curr_thread,
+ entry_thread_state,
+ idx_retbase,
+ num_stack_rets,
+ entry_valstack_bottom_byteoff,
+ old_jmpbuf_ptr);
+ retval = DUK_EXEC_ERROR;
+ }
+ } catch (...) {
+ DUK_D(DUK_DPRINT("unexpected c++ exception (perhaps thrown by user code)"));
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);
+ DUK_STATS_INC(thr->heap, stats_safecall_throw);
+ try {
+ DUK_ERROR_TYPE(thr, "caught invalid c++ exception (perhaps thrown by user code)");
+ } catch (duk_internal_exception exc) {
+ DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ exception"));
+ DUK_UNREF(exc);
+ duk__handle_safe_call_error(thr,
+ entry_act,
+#if defined(DUK_USE_ASSERTIONS)
+ entry_callstack_top,
+#endif
+ entry_curr_thread,
+ entry_thread_state,
+ idx_retbase,
+ num_stack_rets,
+ entry_valstack_bottom_byteoff,
+ old_jmpbuf_ptr);
+ retval = DUK_EXEC_ERROR;
+ }
+ }
+#endif
+
+ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr == old_jmpbuf_ptr); /* success/error path both do this */
+
+ DUK_ASSERT_LJSTATE_UNSET(thr->heap);
+
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);
+ duk__handle_safe_call_shared_unwind(thr,
+ idx_retbase,
+ num_stack_rets,
+#if defined(DUK_USE_ASSERTIONS)
+ entry_callstack_top,
+#endif
+ entry_call_recursion_depth,
+ entry_curr_thread,
+ entry_ptr_curr_pc);
+
+ /* Restore preventcount. */
+ thr->callstack_preventcount--;
+ DUK_ASSERT(thr->callstack_preventcount == entry_callstack_preventcount);
+
+ /* Final asserts. */
+ DUK_ASSERT(thr->callstack_curr == entry_act);
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff);
+ DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);
+ DUK_ASSERT(thr->callstack_top == entry_callstack_top);
+ DUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth);
+ DUK_ASSERT(thr->heap->curr_thread == entry_curr_thread);
+ DUK_ASSERT(thr->state == entry_thread_state);
+ DUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc);
+ DUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets);
+ DUK_ASSERT_LJSTATE_UNSET(thr->heap);
+
+ /* Pending side effects. */
+ DUK_REFZERO_CHECK_FAST(thr);
+
+ return retval;
+}
+
+/*
+ * Property-based call (foo.noSuch()) error setup: replace target function
+ * on stack top with a specially tagged (hidden Symbol) error which gets
+ * thrown in call handling at the proper spot to follow Ecmascript semantics.
+ */
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+DUK_INTERNAL DUK_NOINLINE DUK_COLD void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key) {
+ const char *str1, *str2, *str3;
+ duk_idx_t entry_top;
+
+ entry_top = duk_get_top(thr);
+
+ /* Must stabilize pointers first. Argument convention is a bit awkward,
+ * it comes from the executor call site where some arguments may not be
+ * on the value stack (consts).
+ */
+ duk_push_tval(thr, tv_base);
+ duk_push_tval(thr, tv_key);
+ duk_push_tval(thr, tv_targ);
+
+ DUK_GC_TORTURE(thr->heap);
+
+ /* We only push an error, replacing the call target (at idx_func)
+ * with the error to ensure side effects come out correctly:
+ * - Property read
+ * - Call argument evaluation
+ * - Callability check and error thrown.
+ *
+ * A hidden Symbol on the error object pushed here is used by
+ * call handling to figure out the error is to be thrown as is.
+ * It is CRITICAL that the hidden Symbol can never occur on a
+ * user visible object that may get thrown.
+ */
+
+#if defined(DUK_USE_PARANOID_ERRORS)
+ str1 = duk_get_type_name(thr, -1);
+ str2 = duk_get_type_name(thr, -2);
+ str3 = duk_get_type_name(thr, -3);
+ duk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, "%s not callable (property %s of %s)", str1, str2, str3);
+#else
+ str1 = duk_push_string_readable(thr, -1);
+ str2 = duk_push_string_readable(thr, -3);
+ str3 = duk_push_string_readable(thr, -5);
+ duk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, "%s not callable (property %s of %s)", str1, str2, str3);
+#endif
+
+ duk_push_true(thr);
+ duk_put_prop_stridx(thr, -2, DUK_STRIDX_INT_TARGET); /* Marker property, reuse _Target. */
+
+ /* [ <nregs> propValue <variable> error ] */
+ duk_replace(thr, entry_top - 1);
+ duk_set_top(thr, entry_top);
+
+ DUK_ASSERT(!duk_is_callable(thr, -1)); /* Critical so that call handling will throw the error. */
+}
+#endif /* DUK_USE_VERBOSE_ERRORS */
+
+/* automatic undefs */
+#undef DUK__AUGMENT_CALL_RELAX_COUNT
+#line 1 "duk_js_compiler.c"
+/*
+ * Ecmascript compiler.
+ *
+ * Parses an input string and generates a function template result.
+ * Compilation may happen in multiple contexts (global code, eval
+ * code, function code).
+ *
+ * The parser uses a traditional top-down recursive parsing for the
+ * statement level, and an operator precedence based top-down approach
+ * for the expression level. The attempt is to minimize the C stack
+ * depth. Bytecode is generated directly without an intermediate
+ * representation (tree), at the cost of needing two (and sometimes
+ * three) passes over each function.
+ *
+ * The top-down recursive parser functions are named "duk__parse_XXX".
+ *
+ * Recursion limits are in key functions to prevent arbitrary C recursion:
+ * function body parsing, statement parsing, and expression parsing.
+ *
+ * See doc/compiler.rst for discussion on the design.
+ *
+ * A few typing notes:
+ *
+ * - duk_regconst_t: signed, highest bit set (< 0) means constant,
+ * some call sites use -1 for "none" (equivalent to constant 0x7fffffff)
+ * - PC values: duk_int_t, negative values used as markers
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* If highest bit of a register number is set, it refers to a constant instead.
+ * When interpreted as a signed value, this means const values are always
+ * negative (when interpreted as two's complement). For example DUK__ISREG_TEMP()
+ * uses this approach to avoid an explicit DUK__ISREG() check (the condition is
+ * logically "'x' is a register AND 'x' >= temp_first").
+ */
+#define DUK__CONST_MARKER DUK_REGCONST_CONST_MARKER
+#define DUK__REMOVECONST(x) ((x) & ~DUK__CONST_MARKER)
+#define DUK__ISREG(x) ((x) >= 0)
+#define DUK__ISCONST(x) ((x) < 0)
+#define DUK__ISREG_TEMP(comp_ctx,x) ((duk_int32_t) (x) >= (duk_int32_t) ((comp_ctx)->curr_func.temp_first)) /* Check for x >= temp_first && x >= 0 by comparing as signed. */
+#define DUK__ISREG_NOTTEMP(comp_ctx,x) ((duk_uint32_t) (x) < (duk_uint32_t) ((comp_ctx)->curr_func.temp_first)) /* Check for x >= 0 && x < temp_first by interpreting as unsigned. */
+#define DUK__GETTEMP(comp_ctx) ((comp_ctx)->curr_func.temp_next)
+#define DUK__SETTEMP(comp_ctx,x) ((comp_ctx)->curr_func.temp_next = (x)) /* dangerous: must only lower (temp_max not updated) */
+#define DUK__SETTEMP_CHECKMAX(comp_ctx,x) duk__settemp_checkmax((comp_ctx),(x))
+#define DUK__ALLOCTEMP(comp_ctx) duk__alloctemp((comp_ctx))
+#define DUK__ALLOCTEMPS(comp_ctx,count) duk__alloctemps((comp_ctx),(count))
+
+/* Init value set size for array and object literals. */
+#define DUK__MAX_ARRAY_INIT_VALUES 20
+#define DUK__MAX_OBJECT_INIT_PAIRS 10
+
+/* XXX: hack, remove when const lookup is not O(n) */
+#define DUK__GETCONST_MAX_CONSTS_CHECK 256
+
+/* These limits are based on bytecode limits. Max temps is limited
+ * by duk_hcompfunc nargs/nregs fields being 16 bits.
+ */
+#define DUK__MAX_CONSTS DUK_BC_BC_MAX
+#define DUK__MAX_FUNCS DUK_BC_BC_MAX
+#define DUK__MAX_TEMPS 0xffffL
+
+/* Initial bytecode size allocation. */
+#if defined(DUK_USE_PREFER_SIZE)
+#define DUK__BC_INITIAL_INSTS 16
+#else
+#define DUK__BC_INITIAL_INSTS 256
+#endif
+
+#define DUK__RECURSION_INCREASE(comp_ctx,thr) do { \
+ DUK_DDD(DUK_DDDPRINT("RECURSION INCREASE: %s:%ld", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \
+ duk__comp_recursion_increase((comp_ctx)); \
+ } while (0)
+
+#define DUK__RECURSION_DECREASE(comp_ctx,thr) do { \
+ DUK_DDD(DUK_DDDPRINT("RECURSION DECREASE: %s:%ld", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \
+ duk__comp_recursion_decrease((comp_ctx)); \
+ } while (0)
+
+/* Value stack slot limits: these are quite approximate right now, and
+ * because they overlap in control flow, some could be eliminated.
+ */
+#define DUK__COMPILE_ENTRY_SLOTS 8
+#define DUK__FUNCTION_INIT_REQUIRE_SLOTS 16
+#define DUK__FUNCTION_BODY_REQUIRE_SLOTS 16
+#define DUK__PARSE_STATEMENTS_SLOTS 16
+#define DUK__PARSE_EXPR_SLOTS 16
+
+/* Temporary structure used to pass a stack allocated region through
+ * duk_safe_call().
+ */
+typedef struct {
+ duk_small_uint_t flags;
+ duk_compiler_ctx comp_ctx_alloc;
+ duk_lexer_point lex_pt_alloc;
+} duk__compiler_stkstate;
+
+/*
+ * Prototypes
+ */
+
+/* lexing */
+DUK_LOCAL_DECL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect);
+DUK_LOCAL_DECL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect);
+DUK_LOCAL_DECL void duk__advance(duk_compiler_ctx *ctx);
+
+/* function helpers */
+DUK_LOCAL_DECL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg);
+DUK_LOCAL_DECL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx);
+
+/* code emission */
+DUK_LOCAL_DECL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc);
+DUK_LOCAL_DECL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins);
+DUK_LOCAL_DECL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op);
+DUK_LOCAL_DECL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c);
+DUK_LOCAL_DECL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b);
+DUK_LOCAL_DECL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c);
+#if 0 /* unused */
+DUK_LOCAL_DECL void duk__emit_a(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a);
+DUK_LOCAL_DECL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b);
+#endif
+DUK_LOCAL_DECL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc);
+DUK_LOCAL_DECL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc);
+DUK_LOCAL_DECL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc);
+DUK_LOCAL_DECL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val);
+DUK_LOCAL_DECL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val);
+DUK_LOCAL_DECL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc);
+DUK_LOCAL_DECL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc);
+DUK_LOCAL_DECL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc);
+DUK_LOCAL_DECL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc);
+DUK_LOCAL_DECL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags);
+DUK_LOCAL_DECL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst);
+DUK_LOCAL_DECL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst);
+DUK_LOCAL_DECL void duk__emit_invalid(duk_compiler_ctx *comp_ctx);
+
+/* ivalue/ispec helpers */
+DUK_LOCAL_DECL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst);
+DUK_LOCAL_DECL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+DUK_LOCAL_DECL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+DUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h);
+DUK_LOCAL_DECL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst);
+DUK_LOCAL_DECL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst);
+DUK_LOCAL_DECL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num);
+DUK_LOCAL_DECL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next);
+DUK_LOCAL_DECL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL
+duk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx,
+ duk_ispec *x,
+ duk_regconst_t forced_reg,
+ duk_small_uint_t flags);
+DUK_LOCAL_DECL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg);
+DUK_LOCAL_DECL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg);
+DUK_LOCAL_DECL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+DUK_LOCAL_DECL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+DUK_LOCAL_DECL
+duk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx,
+ duk_ivalue *x,
+ duk_regconst_t forced_reg,
+ duk_small_uint_t flags);
+DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+#if 0 /* unused */
+DUK_LOCAL_DECL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+#endif
+DUK_LOCAL_DECL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg);
+DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+DUK_LOCAL_DECL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x);
+
+/* identifier handling */
+DUK_LOCAL_DECL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname);
+
+/* label handling */
+DUK_LOCAL_DECL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id);
+DUK_LOCAL_DECL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags);
+DUK_LOCAL_DECL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest);
+DUK_LOCAL_DECL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len);
+
+/* top-down expression parser */
+DUK_LOCAL_DECL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res);
+DUK_LOCAL_DECL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx);
+
+/* exprtop is the top level variant which resets nud/led counts */
+DUK_LOCAL_DECL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+DUK_LOCAL_DECL void duk__exprtop(duk_compiler_ctx *ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+
+/* convenience helpers */
+#if 0 /* unused */
+DUK_LOCAL_DECL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#endif
+#if 0 /* unused */
+DUK_LOCAL_DECL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#endif
+DUK_LOCAL_DECL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg);
+DUK_LOCAL_DECL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#if 0 /* unused */
+DUK_LOCAL_DECL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#endif
+DUK_LOCAL_DECL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+DUK_LOCAL_DECL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+DUK_LOCAL_DECL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#if 0 /* unused */
+DUK_LOCAL_DECL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#endif
+DUK_LOCAL_DECL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg);
+DUK_LOCAL_DECL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#if 0 /* unused */
+DUK_LOCAL_DECL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);
+#endif
+
+/* expression parsing helpers */
+DUK_LOCAL_DECL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+
+/* statement parsing */
+DUK_LOCAL_DECL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname);
+DUK_LOCAL_DECL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags);
+DUK_LOCAL_DECL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);
+DUK_LOCAL_DECL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);
+DUK_LOCAL_DECL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);
+DUK_LOCAL_DECL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);
+DUK_LOCAL_DECL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);
+DUK_LOCAL_DECL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem);
+DUK_LOCAL_DECL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id);
+DUK_LOCAL_DECL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof);
+
+DUK_LOCAL_DECL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token);
+DUK_LOCAL_DECL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx);
+DUK_LOCAL_DECL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags);
+DUK_LOCAL_DECL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags);
+
+#define DUK__FUNC_FLAG_DECL (1 << 0) /* Parsing a function declaration. */
+#define DUK__FUNC_FLAG_GETSET (1 << 1) /* Parsing an object literal getter/setter. */
+#define DUK__FUNC_FLAG_METDEF (1 << 2) /* Parsing an object literal method definition shorthand. */
+#define DUK__FUNC_FLAG_PUSHNAME_PASS1 (1 << 3) /* Push function name when creating template (first pass only). */
+#define DUK__FUNC_FLAG_USE_PREVTOKEN (1 << 4) /* Use prev_token to start function parsing (workaround for object literal). */
+
+/*
+ * Parser control values for tokens. The token table is ordered by the
+ * DUK_TOK_XXX defines.
+ *
+ * The binding powers are for lbp() use (i.e. for use in led() context).
+ * Binding powers are positive for typing convenience, and bits at the
+ * top should be reserved for flags. Binding power step must be higher
+ * than 1 so that binding power "lbp - 1" can be used for right associative
+ * operators. Currently a step of 2 is used (which frees one more bit for
+ * flags).
+ */
+
+/* XXX: actually single step levels would work just fine, clean up */
+
+/* binding power "levels" (see doc/compiler.rst) */
+#define DUK__BP_INVALID 0 /* always terminates led() */
+#define DUK__BP_EOF 2
+#define DUK__BP_CLOSING 4 /* token closes expression, e.g. ')', ']' */
+#define DUK__BP_FOR_EXPR DUK__BP_CLOSING /* bp to use when parsing a top level Expression */
+#define DUK__BP_COMMA 6
+#define DUK__BP_ASSIGNMENT 8
+#define DUK__BP_CONDITIONAL 10
+#define DUK__BP_LOR 12
+#define DUK__BP_LAND 14
+#define DUK__BP_BOR 16
+#define DUK__BP_BXOR 18
+#define DUK__BP_BAND 20
+#define DUK__BP_EQUALITY 22
+#define DUK__BP_RELATIONAL 24
+#define DUK__BP_SHIFT 26
+#define DUK__BP_ADDITIVE 28
+#define DUK__BP_MULTIPLICATIVE 30
+#define DUK__BP_EXPONENTIATION 32
+#define DUK__BP_POSTFIX 34
+#define DUK__BP_CALL 36
+#define DUK__BP_MEMBER 38
+
+#define DUK__TOKEN_LBP_BP_MASK 0x1f
+#define DUK__TOKEN_LBP_FLAG_NO_REGEXP (1 << 5) /* regexp literal must not follow this token */
+#define DUK__TOKEN_LBP_FLAG_TERMINATES (1 << 6) /* terminates expression; e.g. post-increment/-decrement */
+#define DUK__TOKEN_LBP_FLAG_UNUSED (1 << 7) /* unused */
+
+#define DUK__TOKEN_LBP_GET_BP(x) ((duk_small_uint_t) (((x) & DUK__TOKEN_LBP_BP_MASK) * 2))
+
+#define DUK__MK_LBP(bp) ((bp) >> 1) /* bp is assumed to be even */
+#define DUK__MK_LBP_FLAGS(bp,flags) (((bp) >> 1) | (flags))
+
+DUK_LOCAL const duk_uint8_t duk__token_lbp[] = {
+ DUK__MK_LBP(DUK__BP_EOF), /* DUK_TOK_EOF */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_IDENTIFIER */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_BREAK */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CASE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CATCH */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CONTINUE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DEBUGGER */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DEFAULT */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DELETE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DO */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_ELSE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FINALLY */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FOR */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FUNCTION */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IF */
+ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_IN */
+ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_INSTANCEOF */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_NEW */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_RETURN */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SWITCH */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_THIS */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_THROW */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_TRY */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_TYPEOF */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_VAR */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CONST */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_VOID */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_WHILE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_WITH */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CLASS */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_ENUM */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_EXPORT */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_EXTENDS */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IMPORT */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SUPER */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_NULL */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_TRUE */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_FALSE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_GET */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SET */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IMPLEMENTS */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_INTERFACE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LET */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PACKAGE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PRIVATE */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PROTECTED */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PUBLIC */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_STATIC */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_YIELD */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LCURLY */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RCURLY */
+ DUK__MK_LBP(DUK__BP_MEMBER), /* DUK_TOK_LBRACKET */
+ DUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RBRACKET */
+ DUK__MK_LBP(DUK__BP_CALL), /* DUK_TOK_LPAREN */
+ DUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RPAREN */
+ DUK__MK_LBP(DUK__BP_MEMBER), /* DUK_TOK_PERIOD */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SEMICOLON */
+ DUK__MK_LBP(DUK__BP_COMMA), /* DUK_TOK_COMMA */
+ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_LT */
+ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_GT */
+ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_LE */
+ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_GE */
+ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_EQ */
+ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_NEQ */
+ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_SEQ */
+ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_SNEQ */
+ DUK__MK_LBP(DUK__BP_ADDITIVE), /* DUK_TOK_ADD */
+ DUK__MK_LBP(DUK__BP_ADDITIVE), /* DUK_TOK_SUB */
+ DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_MUL */
+ DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_DIV */
+ DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_MOD */
+ DUK__MK_LBP(DUK__BP_EXPONENTIATION), /* DUK_TOK_EXP */
+ DUK__MK_LBP(DUK__BP_POSTFIX), /* DUK_TOK_INCREMENT */
+ DUK__MK_LBP(DUK__BP_POSTFIX), /* DUK_TOK_DECREMENT */
+ DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_ALSHIFT */
+ DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_ARSHIFT */
+ DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_RSHIFT */
+ DUK__MK_LBP(DUK__BP_BAND), /* DUK_TOK_BAND */
+ DUK__MK_LBP(DUK__BP_BOR), /* DUK_TOK_BOR */
+ DUK__MK_LBP(DUK__BP_BXOR), /* DUK_TOK_BXOR */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LNOT */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_BNOT */
+ DUK__MK_LBP(DUK__BP_LAND), /* DUK_TOK_LAND */
+ DUK__MK_LBP(DUK__BP_LOR), /* DUK_TOK_LOR */
+ DUK__MK_LBP(DUK__BP_CONDITIONAL), /* DUK_TOK_QUESTION */
+ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_COLON */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_EQUALSIGN */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ADD_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_SUB_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_MUL_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_DIV_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_MOD_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_EXP_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ALSHIFT_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ARSHIFT_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_RSHIFT_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BAND_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BOR_EQ */
+ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BXOR_EQ */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_NUMBER */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_STRING */
+ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_REGEXP */
+};
+
+/*
+ * Misc helpers
+ */
+
+DUK_LOCAL void duk__comp_recursion_increase(duk_compiler_ctx *comp_ctx) {
+ DUK_ASSERT(comp_ctx != NULL);
+ DUK_ASSERT(comp_ctx->recursion_depth >= 0);
+ if (comp_ctx->recursion_depth >= comp_ctx->recursion_limit) {
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_COMPILER_RECURSION_LIMIT);
+ }
+ comp_ctx->recursion_depth++;
+}
+
+DUK_LOCAL void duk__comp_recursion_decrease(duk_compiler_ctx *comp_ctx) {
+ DUK_ASSERT(comp_ctx != NULL);
+ DUK_ASSERT(comp_ctx->recursion_depth > 0);
+ comp_ctx->recursion_depth--;
+}
+
+DUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments(duk_compiler_ctx *comp_ctx, duk_hstring *h) {
+ DUK_UNREF(comp_ctx);
+ DUK_ASSERT(h != NULL);
+ return DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h);
+}
+
+DUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments_in_strict_mode(duk_compiler_ctx *comp_ctx, duk_hstring *h) {
+ DUK_ASSERT(h != NULL);
+ return (comp_ctx->curr_func.is_strict &&
+ DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h));
+}
+
+/*
+ * Parser duk__advance() token eating functions
+ */
+
+/* XXX: valstack handling is awkward. Add a valstack helper which
+ * avoids dup():ing; valstack_copy(src, dst)?
+ */
+
+DUK_LOCAL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_bool_t regexp;
+
+ DUK_ASSERT_DISABLE(comp_ctx->curr_token.t >= 0); /* unsigned */
+ DUK_ASSERT(comp_ctx->curr_token.t <= DUK_TOK_MAXVAL); /* MAXVAL is inclusive */
+
+ /*
+ * Use current token to decide whether a RegExp can follow.
+ *
+ * We can use either 't' or 't_nores'; the latter would not
+ * recognize keywords. Some keywords can be followed by a
+ * RegExp (e.g. "return"), so using 't' is better. This is
+ * not trivial, see doc/compiler.rst.
+ */
+
+ regexp = 1;
+ if (duk__token_lbp[comp_ctx->curr_token.t] & DUK__TOKEN_LBP_FLAG_NO_REGEXP) {
+ regexp = 0;
+ }
+ if (comp_ctx->curr_func.reject_regexp_in_adv) {
+ comp_ctx->curr_func.reject_regexp_in_adv = 0;
+ regexp = 0;
+ }
+
+ if (expect >= 0 && comp_ctx->curr_token.t != (duk_small_uint_t) expect) {
+ DUK_D(DUK_DPRINT("parse error: expect=%ld, got=%ld",
+ (long) expect, (long) comp_ctx->curr_token.t));
+ DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR);
+ }
+
+ /* make current token the previous; need to fiddle with valstack "backing store" */
+ DUK_MEMCPY(&comp_ctx->prev_token, &comp_ctx->curr_token, sizeof(duk_token));
+ duk_copy(thr, comp_ctx->tok11_idx, comp_ctx->tok21_idx);
+ duk_copy(thr, comp_ctx->tok12_idx, comp_ctx->tok22_idx);
+
+ /* parse new token */
+ duk_lexer_parse_js_input_element(&comp_ctx->lex,
+ &comp_ctx->curr_token,
+ comp_ctx->curr_func.is_strict,
+ regexp);
+
+ DUK_DDD(DUK_DDDPRINT("advance: curr: tok=%ld/%ld,%ld,term=%ld,%!T,%!T "
+ "prev: tok=%ld/%ld,%ld,term=%ld,%!T,%!T",
+ (long) comp_ctx->curr_token.t,
+ (long) comp_ctx->curr_token.t_nores,
+ (long) comp_ctx->curr_token.start_line,
+ (long) comp_ctx->curr_token.lineterm,
+ (duk_tval *) duk_get_tval(thr, comp_ctx->tok11_idx),
+ (duk_tval *) duk_get_tval(thr, comp_ctx->tok12_idx),
+ (long) comp_ctx->prev_token.t,
+ (long) comp_ctx->prev_token.t_nores,
+ (long) comp_ctx->prev_token.start_line,
+ (long) comp_ctx->prev_token.lineterm,
+ (duk_tval *) duk_get_tval(thr, comp_ctx->tok21_idx),
+ (duk_tval *) duk_get_tval(thr, comp_ctx->tok22_idx)));
+}
+
+/* advance, expecting current token to be a specific token; parse next token in regexp context */
+DUK_LOCAL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) {
+ duk__advance_helper(comp_ctx, expect);
+}
+
+/* advance, whatever the current token is; parse next token in regexp context */
+DUK_LOCAL void duk__advance(duk_compiler_ctx *comp_ctx) {
+ duk__advance_helper(comp_ctx, -1);
+}
+
+/*
+ * Helpers for duk_compiler_func.
+ */
+
+/* init function state: inits valstack allocations */
+DUK_LOCAL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx) {
+ duk_compiler_func *func = &comp_ctx->curr_func;
+ duk_hthread *thr = comp_ctx->thr;
+ duk_idx_t entry_top;
+
+ entry_top = duk_get_top(thr);
+
+ DUK_MEMZERO(func, sizeof(*func)); /* intentional overlap with earlier memzero */
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ func->h_name = NULL;
+ func->h_consts = NULL;
+ func->h_funcs = NULL;
+ func->h_decls = NULL;
+ func->h_labelnames = NULL;
+ func->h_labelinfos = NULL;
+ func->h_argnames = NULL;
+ func->h_varmap = NULL;
+#endif
+
+ duk_require_stack(thr, DUK__FUNCTION_INIT_REQUIRE_SLOTS);
+
+ DUK_BW_INIT_PUSHBUF(thr, &func->bw_code, DUK__BC_INITIAL_INSTS * sizeof(duk_compiler_instr));
+ /* code_idx = entry_top + 0 */
+
+ duk_push_array(thr);
+ func->consts_idx = entry_top + 1;
+ func->h_consts = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 1);
+ DUK_ASSERT(func->h_consts != NULL);
+
+ duk_push_array(thr);
+ func->funcs_idx = entry_top + 2;
+ func->h_funcs = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 2);
+ DUK_ASSERT(func->h_funcs != NULL);
+ DUK_ASSERT(func->fnum_next == 0);
+
+ duk_push_array(thr);
+ func->decls_idx = entry_top + 3;
+ func->h_decls = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 3);
+ DUK_ASSERT(func->h_decls != NULL);
+
+ duk_push_array(thr);
+ func->labelnames_idx = entry_top + 4;
+ func->h_labelnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 4);
+ DUK_ASSERT(func->h_labelnames != NULL);
+
+ duk_push_dynamic_buffer(thr, 0);
+ func->labelinfos_idx = entry_top + 5;
+ func->h_labelinfos = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 5);
+ DUK_ASSERT(func->h_labelinfos != NULL);
+ DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(func->h_labelinfos) && !DUK_HBUFFER_HAS_EXTERNAL(func->h_labelinfos));
+
+ duk_push_array(thr);
+ func->argnames_idx = entry_top + 6;
+ func->h_argnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 6);
+ DUK_ASSERT(func->h_argnames != NULL);
+
+ duk_push_bare_object(thr);
+ func->varmap_idx = entry_top + 7;
+ func->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 7);
+ DUK_ASSERT(func->h_varmap != NULL);
+}
+
+/* reset function state (prepare for pass 2) */
+DUK_LOCAL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx) {
+ duk_compiler_func *func = &comp_ctx->curr_func;
+ duk_hthread *thr = comp_ctx->thr;
+
+ /* reset bytecode buffer but keep current size; pass 2 will
+ * require same amount or more.
+ */
+ DUK_BW_RESET_SIZE(thr, &func->bw_code);
+
+ duk_set_length(thr, func->consts_idx, 0);
+ /* keep func->h_funcs; inner functions are not reparsed to avoid O(depth^2) parsing */
+ func->fnum_next = 0;
+ /* duk_set_length(thr, func->funcs_idx, 0); */
+ duk_set_length(thr, func->labelnames_idx, 0);
+ duk_hbuffer_reset(thr, func->h_labelinfos);
+ /* keep func->h_argnames; it is fixed for all passes */
+
+ /* truncated in case pass 3 needed */
+ duk_push_bare_object(thr);
+ duk_replace(thr, func->varmap_idx);
+ func->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, func->varmap_idx);
+ DUK_ASSERT(func->h_varmap != NULL);
+}
+
+/* cleanup varmap from any null entries, compact it, etc; returns number
+ * of final entries after cleanup.
+ */
+DUK_LOCAL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_hobject *h_varmap;
+ duk_hstring *h_key;
+ duk_tval *tv;
+ duk_uint32_t i, e_next;
+ duk_int_t ret;
+
+ /* [ ... varmap ] */
+
+ h_varmap = DUK_GET_HOBJECT_NEGIDX(thr, -1);
+ DUK_ASSERT(h_varmap != NULL);
+
+ ret = 0;
+ e_next = DUK_HOBJECT_GET_ENEXT(h_varmap);
+ for (i = 0; i < e_next; i++) {
+ h_key = DUK_HOBJECT_E_GET_KEY(thr->heap, h_varmap, i);
+ if (!h_key) {
+ continue;
+ }
+
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h_varmap, i));
+
+ /* The entries can either be register numbers or 'null' values.
+ * Thus, no need to DECREF them and get side effects. DECREF'ing
+ * the keys (strings) can cause memory to be freed but no side
+ * effects as strings don't have finalizers. This is why we can
+ * rely on the object properties not changing from underneath us.
+ */
+
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h_varmap, i);
+ if (!DUK_TVAL_IS_NUMBER(tv)) {
+ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv));
+ DUK_HOBJECT_E_SET_KEY(thr->heap, h_varmap, i, NULL);
+ DUK_HSTRING_DECREF(thr, h_key);
+ /* when key is NULL, value is garbage so no need to set */
+ } else {
+ ret++;
+ }
+ }
+
+ duk_compact_m1(thr);
+
+ return ret;
+}
+
+/* Convert duk_compiler_func into a function template, leaving the result
+ * on top of stack.
+ */
+/* XXX: awkward and bloated asm -- use faster internal accesses */
+DUK_LOCAL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx) {
+ duk_compiler_func *func = &comp_ctx->curr_func;
+ duk_hthread *thr = comp_ctx->thr;
+ duk_hcompfunc *h_res;
+ duk_hbuffer_fixed *h_data;
+ duk_size_t consts_count;
+ duk_size_t funcs_count;
+ duk_size_t code_count;
+ duk_size_t code_size;
+ duk_size_t data_size;
+ duk_size_t i;
+ duk_tval *p_const;
+ duk_hobject **p_func;
+ duk_instr_t *p_instr;
+ duk_compiler_instr *q_instr;
+ duk_tval *tv;
+ duk_bool_t keep_varmap;
+ duk_bool_t keep_formals;
+#if !defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_size_t formals_length;
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("converting duk_compiler_func to function/template"));
+
+ /*
+ * Push result object and init its flags
+ */
+
+ /* Valstack should suffice here, required on function valstack init */
+
+ h_res = duk_push_hcompfunc(thr);
+ DUK_ASSERT(h_res != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_res) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) h_res, NULL); /* Function templates are "bare objects". */
+
+ if (func->is_function) {
+ DUK_DDD(DUK_DDDPRINT("function -> set NEWENV"));
+ DUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res);
+
+ if (!func->is_arguments_shadowed) {
+ /* arguments object would be accessible; note that shadowing
+ * bindings are arguments or function declarations, neither
+ * of which are deletable, so this is safe.
+ */
+
+ if (func->id_access_arguments || func->may_direct_eval) {
+ DUK_DDD(DUK_DDDPRINT("function may access 'arguments' object directly or "
+ "indirectly -> set CREATEARGS"));
+ DUK_HOBJECT_SET_CREATEARGS((duk_hobject *) h_res);
+ }
+ }
+ } else if (func->is_eval && func->is_strict) {
+ DUK_DDD(DUK_DDDPRINT("strict eval code -> set NEWENV"));
+ DUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res);
+ } else {
+ /* non-strict eval: env is caller's env or global env (direct vs. indirect call)
+ * global code: env is is global env
+ */
+ DUK_DDD(DUK_DDDPRINT("non-strict eval code or global code -> no NEWENV"));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) h_res));
+ }
+
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ if (func->is_function && func->is_namebinding && func->h_name != NULL) {
+ /* Object literal set/get functions have a name (property
+ * name) but must not have a lexical name binding, see
+ * test-bug-getset-func-name.js.
+ */
+ DUK_DDD(DUK_DDDPRINT("function expression with a name -> set NAMEBINDING"));
+ DUK_HOBJECT_SET_NAMEBINDING((duk_hobject *) h_res);
+ }
+#endif
+
+ if (func->is_strict) {
+ DUK_DDD(DUK_DDDPRINT("function is strict -> set STRICT"));
+ DUK_HOBJECT_SET_STRICT((duk_hobject *) h_res);
+ }
+
+ if (func->is_notail) {
+ DUK_DDD(DUK_DDDPRINT("function is notail -> set NOTAIL"));
+ DUK_HOBJECT_SET_NOTAIL((duk_hobject *) h_res);
+ }
+
+ if (func->is_constructable) {
+ DUK_DDD(DUK_DDDPRINT("function is constructable -> set CONSTRUCTABLE"));
+ DUK_HOBJECT_SET_CONSTRUCTABLE((duk_hobject *) h_res);
+ }
+
+ /*
+ * Build function fixed size 'data' buffer, which contains bytecode,
+ * constants, and inner function references.
+ *
+ * During the building phase 'data' is reachable but incomplete.
+ * Only incref's occur during building (no refzero or GC happens),
+ * so the building process is atomic.
+ */
+
+ consts_count = duk_hobject_get_length(thr, func->h_consts);
+ funcs_count = duk_hobject_get_length(thr, func->h_funcs) / 3;
+ code_count = DUK_BW_GET_SIZE(thr, &func->bw_code) / sizeof(duk_compiler_instr);
+ code_size = code_count * sizeof(duk_instr_t);
+
+ data_size = consts_count * sizeof(duk_tval) +
+ funcs_count * sizeof(duk_hobject *) +
+ code_size;
+
+ DUK_DDD(DUK_DDDPRINT("consts_count=%ld, funcs_count=%ld, code_size=%ld -> "
+ "data_size=%ld*%ld + %ld*%ld + %ld = %ld",
+ (long) consts_count, (long) funcs_count, (long) code_size,
+ (long) consts_count, (long) sizeof(duk_tval),
+ (long) funcs_count, (long) sizeof(duk_hobject *),
+ (long) code_size, (long) data_size));
+
+ duk_push_fixed_buffer_nozero(thr, data_size);
+ h_data = (duk_hbuffer_fixed *) duk_known_hbuffer(thr, -1);
+
+ DUK_HCOMPFUNC_SET_DATA(thr->heap, h_res, (duk_hbuffer *) h_data);
+ DUK_HEAPHDR_INCREF(thr, h_data);
+
+ p_const = (duk_tval *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data);
+ for (i = 0; i < consts_count; i++) {
+ DUK_ASSERT(i <= DUK_UARRIDX_MAX); /* const limits */
+ tv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_consts, (duk_uarridx_t) i);
+ DUK_ASSERT(tv != NULL);
+ DUK_TVAL_SET_TVAL(p_const, tv);
+ p_const++;
+ DUK_TVAL_INCREF(thr, tv); /* may be a string constant */
+
+ DUK_DDD(DUK_DDDPRINT("constant: %!T", (duk_tval *) tv));
+ }
+
+ p_func = (duk_hobject **) p_const;
+ DUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_res, p_func);
+ for (i = 0; i < funcs_count; i++) {
+ duk_hobject *h;
+ DUK_ASSERT(i * 3 <= DUK_UARRIDX_MAX); /* func limits */
+ tv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_funcs, (duk_uarridx_t) (i * 3));
+ DUK_ASSERT(tv != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));
+ h = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(h));
+ *p_func++ = h;
+ DUK_HOBJECT_INCREF(thr, h);
+
+ DUK_DDD(DUK_DDDPRINT("inner function: %p -> %!iO",
+ (void *) h, (duk_heaphdr *) h));
+ }
+
+ p_instr = (duk_instr_t *) p_func;
+ DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_res, p_instr);
+
+ /* copy bytecode instructions one at a time */
+ q_instr = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(thr, &func->bw_code);
+ for (i = 0; i < code_count; i++) {
+ p_instr[i] = q_instr[i].ins;
+ }
+ /* Note: 'q_instr' is still used below */
+
+ DUK_ASSERT((duk_uint8_t *) (p_instr + code_count) == DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data) + data_size);
+
+ duk_pop(thr); /* 'data' (and everything in it) is reachable through h_res now */
+
+ /*
+ * Init non-property result fields
+ *
+ * 'nregs' controls how large a register frame is allocated.
+ *
+ * 'nargs' controls how many formal arguments are written to registers:
+ * r0, ... r(nargs-1). The remaining registers are initialized to
+ * undefined.
+ */
+
+ DUK_ASSERT(func->temp_max >= 0);
+ h_res->nregs = (duk_uint16_t) func->temp_max;
+ h_res->nargs = (duk_uint16_t) duk_hobject_get_length(thr, func->h_argnames);
+ DUK_ASSERT(h_res->nregs >= h_res->nargs); /* pass2 allocation handles this */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ h_res->start_line = (duk_uint32_t) func->min_line;
+ h_res->end_line = (duk_uint32_t) func->max_line;
+#endif
+
+ /*
+ * Init object properties
+ *
+ * Properties should be added in decreasing order of access frequency.
+ * (Not very critical for function templates.)
+ */
+
+ DUK_DDD(DUK_DDDPRINT("init function properties"));
+
+ /* [ ... res ] */
+
+ /* _Varmap: omitted if function is guaranteed not to do a slow path
+ * identifier access that might be caught by locally declared variables.
+ * The varmap can also be omitted if it turns out empty of actual
+ * register mappings after a cleanup. When debugging is enabled, we
+ * always need the varmap to be able to lookup variables at any point.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ DUK_DD(DUK_DDPRINT("keeping _Varmap because debugger support is enabled"));
+ keep_varmap = 1;
+#else
+ if (func->id_access_slow_own || /* directly uses slow accesses that may match own variables */
+ func->id_access_arguments || /* accesses 'arguments' directly */
+ func->may_direct_eval || /* may indirectly slow access through a direct eval */
+ funcs_count > 0) { /* has inner functions which may slow access (XXX: this can be optimized by looking at the inner functions) */
+ DUK_DD(DUK_DDPRINT("keeping _Varmap because of direct eval, slow path access that may match local variables, or presence of inner functions"));
+ keep_varmap = 1;
+ } else {
+ DUK_DD(DUK_DDPRINT("dropping _Varmap"));
+ keep_varmap = 0;
+ }
+#endif
+
+ if (keep_varmap) {
+ duk_int_t num_used;
+ duk_dup(thr, func->varmap_idx);
+ num_used = duk__cleanup_varmap(comp_ctx);
+ DUK_DDD(DUK_DDDPRINT("cleaned up varmap: %!T (num_used=%ld)",
+ (duk_tval *) duk_get_tval(thr, -1), (long) num_used));
+
+ if (num_used > 0) {
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE);
+ } else {
+ DUK_DD(DUK_DDPRINT("varmap is empty after cleanup -> no need to add"));
+ duk_pop(thr);
+ }
+ }
+
+ /* _Formals: omitted if function is guaranteed not to need a (non-strict)
+ * arguments object, and _Formals.length matches nargs exactly.
+ *
+ * Non-arrow functions can't see an outer function's 'argument' binding
+ * (because they have their own), but arrow functions can. When arrow
+ * functions are added, this condition would need to be added:
+ * inner_arrow_funcs_count > 0 inner arrow functions may access 'arguments'
+ */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ DUK_DD(DUK_DDPRINT("keeping _Formals because debugger support is enabled"));
+ keep_formals = 1;
+#else
+ formals_length = duk_get_length(thr, func->argnames_idx);
+ if (formals_length != (duk_size_t) h_res->nargs) {
+ /* Nargs not enough for closure .length: keep _Formals regardless
+ * of its length. Shouldn't happen in practice at the moment.
+ */
+ DUK_DD(DUK_DDPRINT("keeping _Formals because _Formals.length != nargs"));
+ keep_formals = 1;
+ } else if ((func->id_access_arguments || func->may_direct_eval) &&
+ (formals_length > 0)) {
+ /* Direct eval (may access 'arguments') or accesses 'arguments'
+ * explicitly: keep _Formals unless it is zero length.
+ */
+ DUK_DD(DUK_DDPRINT("keeping _Formals because of direct eval or explicit access to 'arguments', and _Formals.length != 0"));
+ keep_formals = 1;
+ } else {
+ DUK_DD(DUK_DDPRINT("omitting _Formals, nargs matches _Formals.length, so no properties added"));
+ keep_formals = 0;
+ }
+#endif
+
+ if (keep_formals) {
+ duk_dup(thr, func->argnames_idx);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE);
+ }
+
+ /* name */
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ if (func->h_name) {
+ duk_push_hstring(thr, func->h_name);
+ DUK_DD(DUK_DDPRINT("setting function template .name to %!T", duk_get_tval(thr, -1)));
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE);
+ }
+#endif /* DUK_USE_FUNC_NAME_PROPERTY */
+
+ /* _Source */
+#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY)
+ if (0) {
+ /* XXX: Currently function source code is not stored, as it is not
+ * required by the standard. Source code should not be stored by
+ * default (user should enable it explicitly), and the source should
+ * probably be compressed with a trivial text compressor; average
+ * compression of 20-30% is quite easy to achieve even with a trivial
+ * compressor (RLE + backwards lookup).
+ *
+ * Debugging needs source code to be useful: sometimes input code is
+ * not found in files as it may be generated and then eval()'d, given
+ * by dynamic C code, etc.
+ *
+ * Other issues:
+ *
+ * - Need tokenizer indices for start and end to substring
+ * - Always normalize function declaration part?
+ * - If we keep _Formals, only need to store body
+ */
+
+ /*
+ * For global or eval code this is straightforward. For functions
+ * created with the Function constructor we only get the source for
+ * the body and must manufacture the "function ..." part.
+ *
+ * For instance, for constructed functions (v8):
+ *
+ * > a = new Function("foo", "bar", "print(foo)");
+ * [Function]
+ * > a.toString()
+ * 'function anonymous(foo,bar) {\nprint(foo)\n}'
+ *
+ * Similarly for e.g. getters (v8):
+ *
+ * > x = { get a(foo,bar) { print(foo); } }
+ * { a: [Getter] }
+ * > Object.getOwnPropertyDescriptor(x, 'a').get.toString()
+ * 'function a(foo,bar) { print(foo); }'
+ */
+
+#if 0
+ duk_push_string(thr, "XXX");
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE);
+#endif
+ }
+#endif /* DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY */
+
+ /* _Pc2line */
+#if defined(DUK_USE_PC2LINE)
+ if (1) {
+ /*
+ * Size-optimized pc->line mapping.
+ */
+
+ DUK_ASSERT(code_count <= DUK_COMPILER_MAX_BYTECODE_LENGTH);
+ duk_hobject_pc2line_pack(thr, q_instr, (duk_uint_fast32_t) code_count); /* -> pushes fixed buffer */
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_NONE);
+
+ /* XXX: if assertions enabled, walk through all valid PCs
+ * and check line mapping.
+ */
+ }
+#endif /* DUK_USE_PC2LINE */
+
+ /* fileName */
+#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)
+ if (comp_ctx->h_filename) {
+ /*
+ * Source filename (or equivalent), for identifying thrown errors.
+ */
+
+ duk_push_hstring(thr, comp_ctx->h_filename);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_NONE);
+ }
+#endif
+
+ DUK_DD(DUK_DDPRINT("converted function: %!ixT",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /*
+ * Compact the function template.
+ */
+
+ duk_compact_m1(thr);
+
+ /*
+ * Debug dumping
+ */
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ {
+ duk_hcompfunc *h;
+ duk_instr_t *p, *p_start, *p_end;
+
+ h = (duk_hcompfunc *) duk_get_hobject(thr, -1);
+ p_start = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, h);
+ p_end = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, h);
+
+ p = p_start;
+ while (p < p_end) {
+ DUK_DDD(DUK_DDDPRINT("BC %04ld: %!I ; 0x%08lx op=%ld (%!C) a=%ld b=%ld c=%ld",
+ (long) (p - p_start),
+ (duk_instr_t) (*p),
+ (unsigned long) (*p),
+ (long) DUK_DEC_OP(*p),
+ (long) DUK_DEC_OP(*p),
+ (long) DUK_DEC_A(*p),
+ (long) DUK_DEC_B(*p),
+ (long) DUK_DEC_C(*p)));
+ p++;
+ }
+ }
+#endif
+}
+
+/*
+ * Code emission helpers
+ *
+ * Some emission helpers understand the range of target and source reg/const
+ * values and automatically emit shuffling code if necessary. This is the
+ * case when the slot in question (A, B, C) is used in the standard way and
+ * for opcodes the emission helpers explicitly understand (like DUK_OP_MPUTOBJ).
+ *
+ * The standard way is that:
+ * - slot A is a target register
+ * - slot B is a source register/constant
+ * - slot C is a source register/constant
+ *
+ * If a slot is used in a non-standard way the caller must indicate this
+ * somehow. If a slot is used as a target instead of a source (or vice
+ * versa), this can be indicated with a flag to trigger proper shuffling
+ * (e.g. DUK__EMIT_FLAG_B_IS_TARGET). If the value in the slot is not
+ * register/const related at all, the caller must ensure that the raw value
+ * fits into the corresponding slot so as to not trigger shuffling. The
+ * caller must set a "no shuffle" flag to ensure compilation fails if
+ * shuffling were to be triggered because of an internal error.
+ *
+ * For slots B and C the raw slot size is 9 bits but one bit is reserved for
+ * the reg/const indicator. To use the full 9-bit range for a raw value,
+ * shuffling must be disabled with the DUK__EMIT_FLAG_NO_SHUFFLE_{B,C} flag.
+ * Shuffling is only done for A, B, and C slots, not the larger BC or ABC slots.
+ *
+ * There is call handling specific understanding in the A-B-C emitter to
+ * convert call setup and call instructions into indirect ones if necessary.
+ */
+
+/* Code emission flags, passed in the 'opcode' field. Opcode + flags
+ * fit into 16 bits for now, so use duk_small_uint_t.
+ */
+#define DUK__EMIT_FLAG_NO_SHUFFLE_A (1 << 8)
+#define DUK__EMIT_FLAG_NO_SHUFFLE_B (1 << 9)
+#define DUK__EMIT_FLAG_NO_SHUFFLE_C (1 << 10)
+#define DUK__EMIT_FLAG_A_IS_SOURCE (1 << 11) /* slot A is a source (default: target) */
+#define DUK__EMIT_FLAG_B_IS_TARGET (1 << 12) /* slot B is a target (default: source) */
+#define DUK__EMIT_FLAG_C_IS_TARGET (1 << 13) /* slot C is a target (default: source) */
+#define DUK__EMIT_FLAG_BC_REGCONST (1 << 14) /* slots B and C are reg/const */
+#define DUK__EMIT_FLAG_RESERVE_JUMPSLOT (1 << 15) /* reserve a jumpslot after instr before target spilling, used for NEXTENUM */
+
+/* XXX: macro smaller than call? */
+DUK_LOCAL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx) {
+ duk_compiler_func *func;
+ func = &comp_ctx->curr_func;
+ return (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &func->bw_code) / sizeof(duk_compiler_instr));
+}
+
+DUK_LOCAL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc) {
+ DUK_ASSERT(pc >= 0);
+ DUK_ASSERT((duk_size_t) pc < (duk_size_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr)));
+ return ((duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code)) + pc;
+}
+
+/* emit instruction; could return PC but that's not needed in the majority
+ * of cases.
+ */
+DUK_LOCAL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins) {
+#if defined(DUK_USE_PC2LINE)
+ duk_int_t line;
+#endif
+ duk_compiler_instr *instr;
+
+ DUK_DDD(DUK_DDDPRINT("duk__emit: 0x%08lx curr_token.start_line=%ld prev_token.start_line=%ld pc=%ld --> %!I",
+ (unsigned long) ins,
+ (long) comp_ctx->curr_token.start_line,
+ (long) comp_ctx->prev_token.start_line,
+ (long) duk__get_current_pc(comp_ctx),
+ (duk_instr_t) ins));
+
+ instr = (duk_compiler_instr *) (void *) DUK_BW_ENSURE_GETPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr));
+ DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr));
+
+#if defined(DUK_USE_PC2LINE)
+ /* The line number tracking is a bit inconsistent right now, which
+ * affects debugger accuracy. Mostly call sites emit opcodes when
+ * they have parsed a token (say a terminating semicolon) and called
+ * duk__advance(). In this case the line number of the previous
+ * token is the most accurate one (except in prologue where
+ * prev_token.start_line is 0). This is probably not 100% correct
+ * right now.
+ */
+ /* approximation, close enough */
+ line = comp_ctx->prev_token.start_line;
+ if (line == 0) {
+ line = comp_ctx->curr_token.start_line;
+ }
+#endif
+
+ instr->ins = ins;
+#if defined(DUK_USE_PC2LINE)
+ instr->line = (duk_uint32_t) line;
+#endif
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (line < comp_ctx->curr_func.min_line) {
+ comp_ctx->curr_func.min_line = line;
+ }
+ if (line > comp_ctx->curr_func.max_line) {
+ comp_ctx->curr_func.max_line = line;
+ }
+#endif
+
+ /* Limit checks for bytecode byte size and line number. */
+ if (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) {
+ goto fail_bc_limit;
+ }
+#if defined(DUK_USE_PC2LINE) && defined(DUK_USE_ESBC_LIMITS)
+#if defined(DUK_USE_BUFLEN16)
+ /* Buffer length is bounded to 0xffff automatically, avoid compile warning. */
+ if (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) {
+ goto fail_bc_limit;
+ }
+#else
+ if (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) {
+ goto fail_bc_limit;
+ }
+#endif
+#endif
+
+ return;
+
+ fail_bc_limit:
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT);
+}
+
+/* Update function min/max line from current token. Needed to improve
+ * function line range information for debugging, so that e.g. opening
+ * curly brace is covered by line range even when no opcodes are emitted
+ * for the line containing the brace.
+ */
+DUK_LOCAL void duk__update_lineinfo_currtoken(duk_compiler_ctx *comp_ctx) {
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_int_t line;
+
+ line = comp_ctx->curr_token.start_line;
+ if (line == 0) {
+ return;
+ }
+ if (line < comp_ctx->curr_func.min_line) {
+ comp_ctx->curr_func.min_line = line;
+ }
+ if (line > comp_ctx->curr_func.max_line) {
+ comp_ctx->curr_func.max_line = line;
+ }
+#else
+ DUK_UNREF(comp_ctx);
+#endif
+}
+
+DUK_LOCAL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op) {
+ duk__emit(comp_ctx, DUK_ENC_OP_ABC(op, 0));
+}
+
+/* Important main primitive. */
+DUK_LOCAL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c) {
+ duk_instr_t ins = 0;
+ duk_int_t a_out = -1;
+ duk_int_t b_out = -1;
+ duk_int_t c_out = -1;
+ duk_int_t tmp;
+ duk_small_uint_t op = op_flags & 0xffU;
+
+ DUK_DDD(DUK_DDDPRINT("emit: op_flags=%04lx, a=%ld, b=%ld, c=%ld",
+ (unsigned long) op_flags, (long) a, (long) b, (long) c));
+
+ /* We could rely on max temp/const checks: if they don't exceed BC
+ * limit, nothing here can either (just asserts would be enough).
+ * Currently we check for the limits, which provides additional
+ * protection against creating invalid bytecode due to compiler
+ * bugs.
+ */
+
+ DUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN); /* unsigned */
+ DUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX);
+ DUK_ASSERT(DUK__ISREG(a));
+ DUK_ASSERT(b != -1); /* Not 'none'. */
+ DUK_ASSERT(c != -1); /* Not 'none'. */
+
+ /* Input shuffling happens before the actual operation, while output
+ * shuffling happens afterwards. Output shuffling decisions are still
+ * made at the same time to reduce branch clutter; output shuffle decisions
+ * are recorded into X_out variables.
+ */
+
+ /* Slot A: currently no support for reg/const. */
+
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ if (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) {
+#else
+ if (a <= DUK_BC_A_MAX) {
+#endif
+ ;
+ } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) {
+ DUK_D(DUK_DPRINT("out of regs: 'a' (reg) needs shuffling but shuffle prohibited, a: %ld", (long) a));
+ goto error_outofregs;
+ } else if (a <= DUK_BC_BC_MAX) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle1;
+ if (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) {
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a));
+ } else {
+ /* Output shuffle needed after main operation */
+ a_out = a;
+
+ /* The DUK_OP_CSVAR output shuffle assumes shuffle registers are
+ * consecutive.
+ */
+ DUK_ASSERT((comp_ctx->curr_func.shuffle1 == 0 && comp_ctx->curr_func.shuffle2 == 0) ||
+ (comp_ctx->curr_func.shuffle2 == comp_ctx->curr_func.shuffle1 + 1));
+ if (op == DUK_OP_CSVAR) {
+ /* For CSVAR the limit is one smaller because output shuffle
+ * must be able to express 'a + 1' in BC.
+ */
+ if (a + 1 > DUK_BC_BC_MAX) {
+ goto error_outofregs;
+ }
+ }
+ }
+ a = tmp;
+ } else {
+ DUK_D(DUK_DPRINT("out of regs: 'a' (reg) needs shuffling but does not fit into BC, a: %ld", (long) a));
+ goto error_outofregs;
+ }
+
+ /* Slot B: reg/const support, mapped to bit 0 of opcode. */
+
+ if ((b & DUK__CONST_MARKER) != 0) {
+ DUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) == 0);
+ DUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0);
+ b = b & ~DUK__CONST_MARKER;
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ if (0) {
+#else
+ if (b <= 0xff) {
+#endif
+ if (op_flags & DUK__EMIT_FLAG_BC_REGCONST) {
+ /* Opcode follows B/C reg/const convention. */
+ DUK_ASSERT((op & 0x01) == 0);
+ ins |= DUK_ENC_OP_A_B_C(0x01, 0, 0, 0); /* const flag for B */
+ } else {
+ DUK_D(DUK_DPRINT("B is const, opcode is not B/C reg/const: %x", op_flags));
+ }
+ } else if (b <= DUK_BC_BC_MAX) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle2;
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, b));
+ b = tmp;
+ } else {
+ DUK_D(DUK_DPRINT("out of regs: 'b' (const) needs shuffling but does not fit into BC, b: %ld", (long) b));
+ goto error_outofregs;
+ }
+ } else {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ if (b <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B)) {
+#else
+ if (b <= 0xff) {
+#endif
+ ;
+ } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) {
+ if (b > DUK_BC_B_MAX) {
+ /* Note: 0xff != DUK_BC_B_MAX */
+ DUK_D(DUK_DPRINT("out of regs: 'b' (reg) needs shuffling but shuffle prohibited, b: %ld", (long) b));
+ goto error_outofregs;
+ }
+ } else if (b <= DUK_BC_BC_MAX) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle2;
+ if (op_flags & DUK__EMIT_FLAG_B_IS_TARGET) {
+ /* Output shuffle needed after main operation */
+ b_out = b;
+ }
+ if (!(op_flags & DUK__EMIT_FLAG_B_IS_TARGET)) {
+ if (op == DUK_OP_MPUTOBJ || op == DUK_OP_MPUTARR) {
+ /* Special handling for MPUTOBJ/MPUTARR shuffling.
+ * For each, slot B identifies the first register of a range
+ * of registers, so normal shuffling won't work. Instead,
+ * an indirect version of the opcode is used.
+ */
+ DUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0);
+ duk__emit_load_int32_noshuffle(comp_ctx, tmp, b);
+ DUK_ASSERT(DUK_OP_MPUTOBJI == DUK_OP_MPUTOBJ + 1);
+ DUK_ASSERT(DUK_OP_MPUTARRI == DUK_OP_MPUTARR + 1);
+ op_flags++; /* indirect opcode follows direct */
+ } else {
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, b));
+ }
+ }
+ b = tmp;
+ } else {
+ DUK_D(DUK_DPRINT("out of regs: 'b' (reg) needs shuffling but does not fit into BC, b: %ld", (long) b));
+ goto error_outofregs;
+ }
+ }
+
+ /* Slot C: reg/const support, mapped to bit 1 of opcode. */
+
+ if ((c & DUK__CONST_MARKER) != 0) {
+ DUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) == 0);
+ DUK_ASSERT((op_flags & DUK__EMIT_FLAG_C_IS_TARGET) == 0);
+ c = c & ~DUK__CONST_MARKER;
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ if (0) {
+#else
+ if (c <= 0xff) {
+#endif
+ if (op_flags & DUK__EMIT_FLAG_BC_REGCONST) {
+ /* Opcode follows B/C reg/const convention. */
+ DUK_ASSERT((op & 0x02) == 0);
+ ins |= DUK_ENC_OP_A_B_C(0x02, 0, 0, 0); /* const flag for C */
+ } else {
+ DUK_D(DUK_DPRINT("C is const, opcode is not B/C reg/const: %x", op_flags));
+ }
+ } else if (c <= DUK_BC_BC_MAX) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle3;
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, c));
+ c = tmp;
+ } else {
+ DUK_D(DUK_DPRINT("out of regs: 'c' (const) needs shuffling but does not fit into BC, c: %ld", (long) c));
+ goto error_outofregs;
+ }
+ } else {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ if (c <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C)) {
+#else
+ if (c <= 0xff) {
+#endif
+ ;
+ } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) {
+ if (c > DUK_BC_C_MAX) {
+ /* Note: 0xff != DUK_BC_C_MAX */
+ DUK_D(DUK_DPRINT("out of regs: 'c' (reg) needs shuffling but shuffle prohibited, c: %ld", (long) c));
+ goto error_outofregs;
+ }
+ } else if (c <= DUK_BC_BC_MAX) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle3;
+ if (op_flags & DUK__EMIT_FLAG_C_IS_TARGET) {
+ /* Output shuffle needed after main operation */
+ c_out = c;
+ } else {
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, c));
+ }
+ c = tmp;
+ } else {
+ DUK_D(DUK_DPRINT("out of regs: 'c' (reg) needs shuffling but does not fit into BC, c: %ld", (long) c));
+ goto error_outofregs;
+ }
+ }
+
+ /* Main operation */
+
+ DUK_ASSERT(a >= DUK_BC_A_MIN);
+ DUK_ASSERT(a <= DUK_BC_A_MAX);
+ DUK_ASSERT(b >= DUK_BC_B_MIN);
+ DUK_ASSERT(b <= DUK_BC_B_MAX);
+ DUK_ASSERT(c >= DUK_BC_C_MIN);
+ DUK_ASSERT(c <= DUK_BC_C_MAX);
+
+ ins |= DUK_ENC_OP_A_B_C(op_flags & 0xff, a, b, c);
+ duk__emit(comp_ctx, ins);
+
+ /* NEXTENUM needs a jump slot right after the main instruction.
+ * When the JUMP is taken, output spilling is not needed so this
+ * workaround is possible. The jump slot PC is exceptionally
+ * plumbed through comp_ctx to minimize call sites.
+ */
+ if (op_flags & DUK__EMIT_FLAG_RESERVE_JUMPSLOT) {
+ comp_ctx->emit_jumpslot_pc = duk__get_current_pc(comp_ctx);
+ duk__emit_abc(comp_ctx, DUK_OP_JUMP, 0);
+ }
+
+ /* Output shuffling: only one output register is realistically possible.
+ *
+ * (Zero would normally be an OK marker value: if the target register
+ * was zero, it would never be shuffled. But with DUK_USE_SHUFFLE_TORTURE
+ * this is no longer true, so use -1 as a marker instead.)
+ */
+
+ if (a_out >= 0) {
+ DUK_ASSERT(b_out < 0);
+ DUK_ASSERT(c_out < 0);
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a, a_out));
+
+ if (op == DUK_OP_CSVAR) {
+ /* Special handling for CSVAR shuffling. The variable lookup
+ * results in a <value, this binding> pair in successive
+ * registers so use two shuffle registers and two output
+ * loads. (In practice this is dead code because temp/const
+ * limit is reached first.)
+ */
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a + 1, a_out + 1));
+ }
+ } else if (b_out >= 0) {
+ DUK_ASSERT(a_out < 0);
+ DUK_ASSERT(c_out < 0);
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, b, b_out));
+ } else if (c_out >= 0) {
+ DUK_ASSERT(b_out < 0);
+ DUK_ASSERT(c_out < 0);
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, c, c_out));
+ }
+
+ return;
+
+ error_outofregs:
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);
+}
+
+/* For many of the helpers below it'd be technically correct to add
+ * "no shuffle" flags for parameters passed in as zero. For example,
+ * duk__emit_a_b() should call duk__emit_a_b_c() with C set to 0, and
+ * DUK__EMIT_FLAG_NO_SHUFFLE_C added to op_flags. However, since the
+ * C value is 0, it'll never get shuffled so adding the flag is just
+ * unnecessary additional code. This is unfortunately not true for
+ * "shuffle torture" mode which needs special handling.
+ */
+
+DUK_LOCAL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b) {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_C;
+#endif
+ duk__emit_a_b_c(comp_ctx, op_flags, a, b, 0);
+}
+
+DUK_LOCAL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c) {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A;
+#endif
+ duk__emit_a_b_c(comp_ctx, op_flags, 0, b, c);
+}
+
+#if 0 /* unused */
+DUK_LOCAL void duk__emit_a(duk_compiler_ctx *comp_ctx, int op_flags, int a) {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_B | DUK__EMIT_FLAG_NO_SHUFFLE_C;
+#endif
+ duk__emit_a_b_c(comp_ctx, op_flags, a, 0, 0);
+}
+#endif
+
+#if 0 /* unused */
+DUK_LOCAL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b) {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_NO_SHUFFLE_C;
+#endif
+ duk__emit_a_b_c(comp_ctx, op_flags, 0, b, 0);
+}
+#endif
+
+DUK_LOCAL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc) {
+ duk_instr_t ins;
+ duk_int_t tmp;
+
+ /* allow caller to give a const number with the DUK__CONST_MARKER */
+ DUK_ASSERT(bc != -1); /* Not 'none'. */
+ bc = bc & (~DUK__CONST_MARKER);
+
+ DUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN); /* unsigned */
+ DUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX);
+ DUK_ASSERT(bc >= DUK_BC_BC_MIN);
+ DUK_ASSERT(bc <= DUK_BC_BC_MAX);
+ DUK_ASSERT((bc & DUK__CONST_MARKER) == 0);
+
+ if (bc <= DUK_BC_BC_MAX) {
+ ;
+ } else {
+ /* No BC shuffling now. */
+ goto error_outofregs;
+ }
+
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ if (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) {
+#else
+ if (a <= DUK_BC_A_MAX) {
+#endif
+ ins = DUK_ENC_OP_A_BC(op_flags & 0xff, a, bc);
+ duk__emit(comp_ctx, ins);
+ } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) {
+ goto error_outofregs;
+ } else if ((op_flags & 0xf0U) == DUK_OP_CALL0) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle1;
+ duk__emit_load_int32_noshuffle(comp_ctx, tmp, a);
+ op_flags |= DUK_BC_CALL_FLAG_INDIRECT;
+ ins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc);
+ duk__emit(comp_ctx, ins);
+ } else if (a <= DUK_BC_BC_MAX) {
+ comp_ctx->curr_func.needs_shuffle = 1;
+ tmp = comp_ctx->curr_func.shuffle1;
+ ins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc);
+ if (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) {
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a));
+ duk__emit(comp_ctx, ins);
+ } else {
+ duk__emit(comp_ctx, ins);
+ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, tmp, a));
+ }
+ } else {
+ goto error_outofregs;
+ }
+ return;
+
+ error_outofregs:
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);
+}
+
+DUK_LOCAL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc) {
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+ op |= DUK__EMIT_FLAG_NO_SHUFFLE_A;
+#endif
+ duk__emit_a_bc(comp_ctx, op, 0, bc);
+}
+
+DUK_LOCAL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc) {
+ duk_instr_t ins;
+
+ DUK_ASSERT_DISABLE(op >= DUK_BC_OP_MIN); /* unsigned */
+ DUK_ASSERT(op <= DUK_BC_OP_MAX);
+ DUK_ASSERT_DISABLE(abc >= DUK_BC_ABC_MIN); /* unsigned */
+ DUK_ASSERT(abc <= DUK_BC_ABC_MAX);
+ DUK_ASSERT((abc & DUK__CONST_MARKER) == 0);
+ DUK_ASSERT(abc != -1); /* Not 'none'. */
+
+ if (abc <= DUK_BC_ABC_MAX) {
+ ;
+ } else {
+ goto error_outofregs;
+ }
+ ins = DUK_ENC_OP_ABC(op, abc);
+ DUK_DDD(DUK_DDDPRINT("duk__emit_abc: 0x%08lx line=%ld pc=%ld op=%ld (%!C) abc=%ld (%!I)",
+ (unsigned long) ins, (long) comp_ctx->curr_token.start_line,
+ (long) duk__get_current_pc(comp_ctx), (long) op, (long) op,
+ (long) abc, (duk_instr_t) ins));
+ duk__emit(comp_ctx, ins);
+ return;
+
+ error_outofregs:
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);
+}
+
+DUK_LOCAL void duk__emit_load_int32_raw(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val, duk_small_uint_t op_flags) {
+ /* XXX: Shuffling support could be implemented here so that LDINT+LDINTX
+ * would only shuffle once (instead of twice). The current code works
+ * though, and has a smaller compiler footprint.
+ */
+
+ if ((val >= (duk_int32_t) DUK_BC_BC_MIN - (duk_int32_t) DUK_BC_LDINT_BIAS) &&
+ (val <= (duk_int32_t) DUK_BC_BC_MAX - (duk_int32_t) DUK_BC_LDINT_BIAS)) {
+ DUK_DDD(DUK_DDDPRINT("emit LDINT to reg %ld for %ld", (long) reg, (long) val));
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (val + (duk_int32_t) DUK_BC_LDINT_BIAS));
+ } else {
+ duk_int32_t hi = val >> DUK_BC_LDINTX_SHIFT;
+ duk_int32_t lo = val & ((((duk_int32_t) 1) << DUK_BC_LDINTX_SHIFT) - 1);
+ DUK_ASSERT(lo >= 0);
+ DUK_DDD(DUK_DDDPRINT("emit LDINT+LDINTX to reg %ld for %ld -> hi %ld, lo %ld",
+ (long) reg, (long) val, (long) hi, (long) lo));
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (hi + (duk_int32_t) DUK_BC_LDINT_BIAS));
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDINTX | op_flags, reg, (duk_regconst_t) lo);
+ }
+}
+
+DUK_LOCAL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) {
+ duk__emit_load_int32_raw(comp_ctx, reg, val, 0 /*op_flags*/);
+}
+
+#if defined(DUK_USE_SHUFFLE_TORTURE)
+/* Used by duk__emit*() calls so that we don't shuffle the loadints that
+ * are needed to handle indirect opcodes.
+ */
+DUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) {
+ duk__emit_load_int32_raw(comp_ctx, reg, val, DUK__EMIT_FLAG_NO_SHUFFLE_A /*op_flags*/);
+}
+#else
+DUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) {
+ /* When torture not enabled, can just use the same helper because
+ * 'reg' won't get spilled.
+ */
+ DUK_ASSERT(reg <= DUK_BC_A_MAX);
+ duk__emit_load_int32(comp_ctx, reg, val);
+}
+#endif
+
+DUK_LOCAL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc) {
+ duk_int_t curr_pc;
+ duk_int_t offset;
+
+ curr_pc = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr));
+ offset = (duk_int_t) target_pc - (duk_int_t) curr_pc - 1;
+ DUK_ASSERT(offset + DUK_BC_JUMP_BIAS >= DUK_BC_ABC_MIN);
+ DUK_ASSERT(offset + DUK_BC_JUMP_BIAS <= DUK_BC_ABC_MAX);
+ duk__emit_abc(comp_ctx, DUK_OP_JUMP, (duk_regconst_t) (offset + DUK_BC_JUMP_BIAS));
+}
+
+DUK_LOCAL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx) {
+ duk_int_t ret;
+
+ ret = duk__get_current_pc(comp_ctx); /* useful for patching jumps later */
+ duk__emit_op_only(comp_ctx, DUK_OP_JUMP);
+ return ret;
+}
+
+/* Insert an empty jump in the middle of code emitted earlier. This is
+ * currently needed for compiling for-in.
+ */
+DUK_LOCAL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) {
+#if defined(DUK_USE_PC2LINE)
+ duk_int_t line;
+#endif
+ duk_compiler_instr *instr;
+ duk_size_t offset;
+
+ DUK_ASSERT(jump_pc >= 0);
+ offset = (duk_size_t) jump_pc * sizeof(duk_compiler_instr);
+ instr = (duk_compiler_instr *) (void *)
+ DUK_BW_INSERT_ENSURE_AREA(comp_ctx->thr,
+ &comp_ctx->curr_func.bw_code,
+ offset,
+ sizeof(duk_compiler_instr));
+
+#if defined(DUK_USE_PC2LINE)
+ line = comp_ctx->curr_token.start_line; /* approximation, close enough */
+#endif
+ instr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, 0);
+#if defined(DUK_USE_PC2LINE)
+ instr->line = (duk_uint32_t) line;
+#endif
+
+ DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr));
+ if (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) {
+ goto fail_bc_limit;
+ }
+ return;
+
+ fail_bc_limit:
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT);
+}
+
+/* Does not assume that jump_pc contains a DUK_OP_JUMP previously; this is intentional
+ * to allow e.g. an INVALID opcode be overwritten with a JUMP (label management uses this).
+ */
+DUK_LOCAL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc) {
+ duk_compiler_instr *instr;
+ duk_int_t offset;
+
+ /* allow negative PCs, behave as a no-op */
+ if (jump_pc < 0) {
+ DUK_DDD(DUK_DDDPRINT("duk__patch_jump(): nop call, jump_pc=%ld (<0), target_pc=%ld",
+ (long) jump_pc, (long) target_pc));
+ return;
+ }
+ DUK_ASSERT(jump_pc >= 0);
+
+ /* XXX: range assert */
+ instr = duk__get_instr_ptr(comp_ctx, jump_pc);
+ DUK_ASSERT(instr != NULL);
+
+ /* XXX: range assert */
+ offset = target_pc - jump_pc - 1;
+
+ instr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, offset + DUK_BC_JUMP_BIAS);
+ DUK_DDD(DUK_DDDPRINT("duk__patch_jump(): jump_pc=%ld, target_pc=%ld, offset=%ld",
+ (long) jump_pc, (long) target_pc, (long) offset));
+}
+
+DUK_LOCAL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) {
+ duk__patch_jump(comp_ctx, jump_pc, duk__get_current_pc(comp_ctx));
+}
+
+DUK_LOCAL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags) {
+ duk_compiler_instr *instr;
+
+ DUK_ASSERT(DUK__ISREG(reg_catch));
+
+ instr = duk__get_instr_ptr(comp_ctx, ldconst_pc);
+ DUK_ASSERT(DUK_DEC_OP(instr->ins) == DUK_OP_LDCONST);
+ DUK_ASSERT(instr != NULL);
+ if (const_varname & DUK__CONST_MARKER) {
+ /* Have a catch variable. */
+ const_varname = const_varname & (~DUK__CONST_MARKER);
+ if (reg_catch > DUK_BC_BC_MAX || const_varname > DUK_BC_BC_MAX) {
+ /* Catch attempts to use out-of-range reg/const. Without this
+ * check Duktape 0.12.0 could generate invalid code which caused
+ * an assert failure on execution. This error is triggered e.g.
+ * for functions with a lot of constants and a try-catch statement.
+ * Shuffling or opcode semantics change is needed to fix the issue.
+ * See: test-bug-trycatch-many-constants.js.
+ */
+ DUK_D(DUK_DPRINT("failed to patch trycatch: flags=%ld, reg_catch=%ld, const_varname=%ld (0x%08lx)",
+ (long) flags, (long) reg_catch, (long) const_varname, (long) const_varname));
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);
+ }
+ instr->ins |= DUK_ENC_OP_A_BC(0, 0, const_varname);
+ } else {
+ /* No catch variable, e.g. a try-finally; replace LDCONST with
+ * NOP to avoid a bogus LDCONST.
+ */
+ instr->ins = DUK_ENC_OP(DUK_OP_NOP);
+ }
+
+ instr = duk__get_instr_ptr(comp_ctx, trycatch_pc);
+ DUK_ASSERT(instr != NULL);
+ DUK_ASSERT_DISABLE(flags >= DUK_BC_A_MIN);
+ DUK_ASSERT(flags <= DUK_BC_A_MAX);
+ instr->ins = DUK_ENC_OP_A_BC(DUK_OP_TRYCATCH, flags, reg_catch);
+}
+
+DUK_LOCAL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) {
+ duk_small_uint_t op;
+
+ op = DUK__ISREG(regconst) ? DUK_OP_IFFALSE_R : DUK_OP_IFFALSE_C;
+ duk__emit_bc(comp_ctx, op, regconst); /* helper will remove const flag */
+}
+
+DUK_LOCAL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) {
+ duk_small_uint_t op;
+
+ op = DUK__ISREG(regconst) ? DUK_OP_IFTRUE_R : DUK_OP_IFTRUE_C;
+ duk__emit_bc(comp_ctx, op, regconst); /* helper will remove const flag */
+}
+
+DUK_LOCAL void duk__emit_invalid(duk_compiler_ctx *comp_ctx) {
+ duk__emit_op_only(comp_ctx, DUK_OP_INVALID);
+}
+
+/*
+ * Peephole optimizer for finished bytecode.
+ *
+ * Does not remove opcodes; currently only straightens out unconditional
+ * jump chains which are generated by several control structures.
+ */
+
+DUK_LOCAL void duk__peephole_optimize_bytecode(duk_compiler_ctx *comp_ctx) {
+ duk_compiler_instr *bc;
+ duk_small_uint_t iter;
+ duk_int_t i, n;
+ duk_int_t count_opt;
+
+ bc = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code);
+#if defined(DUK_USE_BUFLEN16)
+ /* No need to assert, buffer size maximum is 0xffff. */
+#else
+ DUK_ASSERT((duk_size_t) DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr) <= (duk_size_t) DUK_INT_MAX); /* bytecode limits */
+#endif
+ n = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr));
+
+ for (iter = 0; iter < DUK_COMPILER_PEEPHOLE_MAXITER; iter++) {
+ count_opt = 0;
+
+ for (i = 0; i < n; i++) {
+ duk_instr_t ins;
+ duk_int_t target_pc1;
+ duk_int_t target_pc2;
+
+ ins = bc[i].ins;
+ if (DUK_DEC_OP(ins) != DUK_OP_JUMP) {
+ continue;
+ }
+
+ target_pc1 = i + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS;
+ DUK_DDD(DUK_DDDPRINT("consider jump at pc %ld; target_pc=%ld", (long) i, (long) target_pc1));
+ DUK_ASSERT(target_pc1 >= 0);
+ DUK_ASSERT(target_pc1 < n);
+
+ /* Note: if target_pc1 == i, we'll optimize a jump to itself.
+ * This does not need to be checked for explicitly; the case
+ * is rare and max iter breaks us out.
+ */
+
+ ins = bc[target_pc1].ins;
+ if (DUK_DEC_OP(ins) != DUK_OP_JUMP) {
+ continue;
+ }
+
+ target_pc2 = target_pc1 + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS;
+
+ DUK_DDD(DUK_DDDPRINT("optimizing jump at pc %ld; old target is %ld -> new target is %ld",
+ (long) i, (long) target_pc1, (long) target_pc2));
+
+ bc[i].ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, target_pc2 - (i + 1) + DUK_BC_JUMP_BIAS);
+
+ count_opt++;
+ }
+
+ DUK_DD(DUK_DDPRINT("optimized %ld jumps on peephole round %ld", (long) count_opt, (long) (iter + 1)));
+
+ if (count_opt == 0) {
+ break;
+ }
+ }
+}
+
+/*
+ * Intermediate value helpers
+ */
+
+/* Flags for intermediate value coercions. A flag for using a forced reg
+ * is not needed, the forced_reg argument suffices and generates better
+ * code (it is checked as it is used).
+ */
+/* XXX: DUK__IVAL_FLAG_REQUIRE_SHORT is passed but not currently implemented
+ * by ispec/ivalue operations.
+ */
+#define DUK__IVAL_FLAG_ALLOW_CONST (1 << 0) /* allow a constant to be returned */
+#define DUK__IVAL_FLAG_REQUIRE_TEMP (1 << 1) /* require a (mutable) temporary as a result (or a const if allowed) */
+#define DUK__IVAL_FLAG_REQUIRE_SHORT (1 << 2) /* require a short (8-bit) reg/const which fits into bytecode B/C slot */
+
+/* XXX: some code might benefit from DUK__SETTEMP_IFTEMP(thr,x) */
+
+#if 0 /* enable manually for dumping */
+#define DUK__DUMP_ISPEC(compctx,ispec) do { duk__dump_ispec((compctx), (ispec)); } while (0)
+#define DUK__DUMP_IVALUE(compctx,ivalue) do { duk__dump_ivalue((compctx), (ivalue)); } while (0)
+
+DUK_LOCAL void duk__dump_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *x) {
+ DUK_D(DUK_DPRINT("ispec dump: t=%ld regconst=0x%08lx, valstack_idx=%ld, value=%!T",
+ (long) x->t, (unsigned long) x->regconst, (long) x->valstack_idx,
+ duk_get_tval(comp_ctx->thr, x->valstack_idx)));
+}
+DUK_LOCAL void duk__dump_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ DUK_D(DUK_DPRINT("ivalue dump: t=%ld op=%ld "
+ "x1={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T} "
+ "x2={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T}",
+ (long) x->t, (long) x->op,
+ (long) x->x1.t, (unsigned long) x->x1.regconst, (long) x->x1.valstack_idx,
+ duk_get_tval(comp_ctx->thr, x->x1.valstack_idx),
+ (long) x->x2.t, (unsigned long) x->x2.regconst, (long) x->x2.valstack_idx,
+ duk_get_tval(comp_ctx->thr, x->x2.valstack_idx)));
+}
+#else
+#define DUK__DUMP_ISPEC(comp_ctx,x) do {} while (0)
+#define DUK__DUMP_IVALUE(comp_ctx,x) do {} while (0)
+#endif
+
+DUK_LOCAL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst) {
+ x->t = DUK_IVAL_PLAIN;
+ x->x1.t = DUK_ISPEC_REGCONST;
+ x->x1.regconst = regconst;
+}
+
+DUK_LOCAL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ x->t = DUK_IVAL_PLAIN;
+ x->x1.t = DUK_ISPEC_VALUE;
+ duk_replace(comp_ctx->thr, x->x1.valstack_idx);
+}
+
+DUK_LOCAL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ x->t = DUK_IVAL_VAR;
+ x->x1.t = DUK_ISPEC_VALUE;
+ duk_replace(comp_ctx->thr, x->x1.valstack_idx);
+}
+
+DUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h) {
+ DUK_ASSERT(h != NULL);
+ duk_push_hstring(comp_ctx->thr, h);
+ duk__ivalue_var_fromstack(comp_ctx, x);
+}
+
+DUK_LOCAL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst) {
+ dst->t = src->t;
+ dst->regconst = src->regconst;
+ duk_copy(comp_ctx->thr, src->valstack_idx, dst->valstack_idx);
+}
+
+DUK_LOCAL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst) {
+ dst->t = src->t;
+ dst->op = src->op;
+ dst->x1.t = src->x1.t;
+ dst->x1.regconst = src->x1.regconst;
+ dst->x2.t = src->x2.t;
+ dst->x2.regconst = src->x2.regconst;
+ duk_copy(comp_ctx->thr, src->x1.valstack_idx, dst->x1.valstack_idx);
+ duk_copy(comp_ctx->thr, src->x2.valstack_idx, dst->x2.valstack_idx);
+}
+
+DUK_LOCAL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num) {
+ duk_regconst_t res;
+
+ res = comp_ctx->curr_func.temp_next;
+ comp_ctx->curr_func.temp_next += num;
+
+ if (comp_ctx->curr_func.temp_next > DUK__MAX_TEMPS) { /* == DUK__MAX_TEMPS is OK */
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_TEMP_LIMIT);
+ }
+
+ /* maintain highest 'used' temporary, needed to figure out nregs of function */
+ if (comp_ctx->curr_func.temp_next > comp_ctx->curr_func.temp_max) {
+ comp_ctx->curr_func.temp_max = comp_ctx->curr_func.temp_next;
+ }
+
+ return res;
+}
+
+DUK_LOCAL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx) {
+ return duk__alloctemps(comp_ctx, 1);
+}
+
+DUK_LOCAL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next) {
+ comp_ctx->curr_func.temp_next = temp_next;
+ if (temp_next > comp_ctx->curr_func.temp_max) {
+ comp_ctx->curr_func.temp_max = temp_next;
+ }
+}
+
+/* get const for value at valstack top */
+DUK_LOCAL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_compiler_func *f = &comp_ctx->curr_func;
+ duk_tval *tv1;
+ duk_int_t i, n, n_check;
+
+ n = (duk_int_t) duk_get_length(thr, f->consts_idx);
+
+ tv1 = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(tv1 != NULL);
+
+#if defined(DUK_USE_FASTINT)
+ /* Explicit check for fastint downgrade. */
+ DUK_TVAL_CHKFAST_INPLACE_SLOW(tv1);
+#endif
+
+ /* Sanity workaround for handling functions with a large number of
+ * constants at least somewhat reasonably. Otherwise checking whether
+ * we already have the constant would grow very slow (as it is O(N^2)).
+ */
+ n_check = (n > DUK__GETCONST_MAX_CONSTS_CHECK ? DUK__GETCONST_MAX_CONSTS_CHECK : n);
+ for (i = 0; i < n_check; i++) {
+ duk_tval *tv2 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, f->h_consts, i);
+
+ /* Strict equality is NOT enough, because we cannot use the same
+ * constant for e.g. +0 and -0.
+ */
+ if (duk_js_samevalue(tv1, tv2)) {
+ DUK_DDD(DUK_DDDPRINT("reused existing constant for %!T -> const index %ld",
+ (duk_tval *) tv1, (long) i));
+ duk_pop(thr);
+ return (duk_regconst_t) i | (duk_regconst_t) DUK__CONST_MARKER;
+ }
+ }
+
+ if (n > DUK__MAX_CONSTS) {
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_CONST_LIMIT);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("allocating new constant for %!T -> const index %ld",
+ (duk_tval *) tv1, (long) n));
+ (void) duk_put_prop_index(thr, f->consts_idx, (duk_uarridx_t) n); /* invalidates tv1, tv2 */
+ return (duk_regconst_t) n | (duk_regconst_t) DUK__CONST_MARKER;
+}
+
+DUK_LOCAL duk_bool_t duk__const_needs_refcount(duk_compiler_ctx *comp_ctx, duk_regconst_t rc) {
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ duk_compiler_func *f = &comp_ctx->curr_func;
+ duk_bool_t ret;
+
+ DUK_ASSERT((rc & DUK__CONST_MARKER) == 0); /* caller removes const marker */
+ (void) duk_get_prop_index(comp_ctx->thr, f->consts_idx, (duk_uarridx_t) rc);
+ ret = !duk_is_number(comp_ctx->thr, -1); /* now only number/string, so conservative check */
+ duk_pop(comp_ctx->thr);
+ return ret;
+#else
+ DUK_UNREF(comp_ctx);
+ DUK_UNREF(rc);
+ DUK_ASSERT((rc & DUK__CONST_MARKER) == 0); /* caller removes const marker */
+ return 0;
+#endif
+}
+
+/* Get the value represented by an duk_ispec to a register or constant.
+ * The caller can control the result by indicating whether or not:
+ *
+ * (1) a constant is allowed (sometimes the caller needs the result to
+ * be in a register)
+ *
+ * (2) a temporary register is required (usually when caller requires
+ * the register to be safely mutable; normally either a bound
+ * register or a temporary register are both OK)
+ *
+ * (3) a forced register target needs to be used
+ *
+ * Bytecode may be emitted to generate the necessary value. The return
+ * value is either a register or a constant.
+ */
+
+DUK_LOCAL
+duk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx,
+ duk_ispec *x,
+ duk_regconst_t forced_reg,
+ duk_small_uint_t flags) {
+ duk_hthread *thr = comp_ctx->thr;
+
+ DUK_DDD(DUK_DDDPRINT("duk__ispec_toregconst_raw(): x={%ld:%ld:%!T}, "
+ "forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld",
+ (long) x->t,
+ (long) x->regconst,
+ (duk_tval *) duk_get_tval(thr, x->valstack_idx),
+ (long) forced_reg,
+ (unsigned long) flags,
+ (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0),
+ (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0),
+ (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0)));
+
+ switch (x->t) {
+ case DUK_ISPEC_VALUE: {
+ duk_tval *tv;
+
+ tv = DUK_GET_TVAL_POSIDX(thr, x->valstack_idx);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED: {
+ /* Note: although there is no 'undefined' literal, undefined
+ * values can occur during compilation as a result of e.g.
+ * the 'void' operator.
+ */
+ duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, dest);
+ return dest;
+ }
+ case DUK_TAG_NULL: {
+ duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_bc(comp_ctx, DUK_OP_LDNULL, dest);
+ return dest;
+ }
+ case DUK_TAG_BOOLEAN: {
+ duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_bc(comp_ctx,
+ (DUK_TVAL_GET_BOOLEAN(tv) ? DUK_OP_LDTRUE : DUK_OP_LDFALSE),
+ dest);
+ return dest;
+ }
+ case DUK_TAG_POINTER: {
+ DUK_UNREACHABLE();
+ break;
+ }
+ case DUK_TAG_STRING: {
+ duk_hstring *h;
+ duk_regconst_t dest;
+ duk_regconst_t constidx;
+
+ h = DUK_TVAL_GET_STRING(tv);
+ DUK_UNREF(h);
+ DUK_ASSERT(h != NULL);
+
+#if 0 /* XXX: to be implemented? */
+ /* Use special opcodes to load short strings */
+ if (DUK_HSTRING_GET_BYTELEN(h) <= 2) {
+ /* Encode into a single opcode (18 bits can encode 1-2 bytes + length indicator) */
+ } else if (DUK_HSTRING_GET_BYTELEN(h) <= 6) {
+ /* Encode into a double constant (53 bits can encode 6*8 = 48 bits + 3-bit length */
+ }
+#endif
+ duk_dup(thr, x->valstack_idx);
+ constidx = duk__getconst(comp_ctx);
+
+ if (flags & DUK__IVAL_FLAG_ALLOW_CONST) {
+ return constidx;
+ }
+
+ dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx);
+ return dest;
+ }
+ case DUK_TAG_OBJECT: {
+ DUK_UNREACHABLE();
+ break;
+ }
+ case DUK_TAG_BUFFER: {
+ DUK_UNREACHABLE();
+ break;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ DUK_UNREACHABLE();
+ break;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ /* number */
+ duk_regconst_t dest;
+ duk_regconst_t constidx;
+ duk_double_t dval;
+ duk_int32_t ival;
+
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ dval = DUK_TVAL_GET_NUMBER(tv);
+
+ if (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) {
+ /* A number can be loaded either through a constant, using
+ * LDINT, or using LDINT+LDINTX. LDINT is always a size win,
+ * LDINT+LDINTX is not if the constant is used multiple times.
+ * Currently always prefer LDINT+LDINTX over a double constant.
+ */
+
+ if (duk_is_whole_get_int32_nonegzero(dval, &ival)) {
+ dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_load_int32(comp_ctx, dest, ival);
+ return dest;
+ }
+ }
+
+ duk_dup(thr, x->valstack_idx);
+ constidx = duk__getconst(comp_ctx);
+
+ if (flags & DUK__IVAL_FLAG_ALLOW_CONST) {
+ return constidx;
+ } else {
+ dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx);
+ return dest;
+ }
+ }
+ } /* end switch */
+ }
+ case DUK_ISPEC_REGCONST: {
+ if (forced_reg >= 0) {
+ if (DUK__ISCONST(x->regconst)) {
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, forced_reg, x->regconst);
+ } else if (x->regconst != forced_reg) {
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, forced_reg, x->regconst);
+ } else {
+ ; /* already in correct reg */
+ }
+ return forced_reg;
+ }
+
+ DUK_ASSERT(forced_reg < 0);
+ if (DUK__ISCONST(x->regconst)) {
+ if (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) {
+ duk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, x->regconst);
+ return dest;
+ }
+ return x->regconst;
+ }
+
+ DUK_ASSERT(forced_reg < 0 && !DUK__ISCONST(x->regconst));
+ if ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) && !DUK__ISREG_TEMP(comp_ctx, x->regconst)) {
+ duk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, dest, x->regconst);
+ return dest;
+ }
+ return x->regconst;
+ }
+ default: {
+ break;
+ }
+ }
+
+ DUK_ERROR_INTERNAL(thr);
+ return 0;
+}
+
+DUK_LOCAL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg) {
+ DUK_ASSERT(forced_reg >= 0);
+ (void) duk__ispec_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/);
+}
+
+/* Coerce an duk_ivalue to a 'plain' value by generating the necessary
+ * arithmetic operations, property access, or variable access bytecode.
+ * The duk_ivalue argument ('x') is converted into a plain value as a
+ * side effect.
+ */
+DUK_LOCAL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg) {
+ duk_hthread *thr = comp_ctx->thr;
+
+ DUK_DDD(DUK_DDDPRINT("duk__ivalue_toplain_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, "
+ "forced_reg=%ld",
+ (long) x->t, (long) x->op,
+ (long) x->x1.t, (long) x->x1.regconst,
+ (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx),
+ (long) x->x2.t, (long) x->x2.regconst,
+ (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx),
+ (long) forced_reg));
+
+ switch (x->t) {
+ case DUK_IVAL_PLAIN: {
+ return;
+ }
+ /* XXX: support unary arithmetic ivalues (useful?) */
+ case DUK_IVAL_ARITH: {
+ duk_regconst_t arg1;
+ duk_regconst_t arg2;
+ duk_regconst_t dest;
+ duk_tval *tv1;
+ duk_tval *tv2;
+
+ DUK_DDD(DUK_DDDPRINT("arith to plain conversion"));
+
+ /* inline arithmetic check for constant values */
+ /* XXX: use the exactly same arithmetic function here as in executor */
+ if (x->x1.t == DUK_ISPEC_VALUE && x->x2.t == DUK_ISPEC_VALUE && x->t == DUK_IVAL_ARITH) {
+ tv1 = DUK_GET_TVAL_POSIDX(thr, x->x1.valstack_idx);
+ tv2 = DUK_GET_TVAL_POSIDX(thr, x->x2.valstack_idx);
+ DUK_ASSERT(tv1 != NULL);
+ DUK_ASSERT(tv2 != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("arith: tv1=%!T, tv2=%!T",
+ (duk_tval *) tv1,
+ (duk_tval *) tv2));
+
+ if (DUK_TVAL_IS_NUMBER(tv1) && DUK_TVAL_IS_NUMBER(tv2)) {
+ duk_double_t d1 = DUK_TVAL_GET_NUMBER(tv1);
+ duk_double_t d2 = DUK_TVAL_GET_NUMBER(tv2);
+ duk_double_t d3;
+ duk_bool_t accept_fold = 1;
+
+ DUK_DDD(DUK_DDDPRINT("arith inline check: d1=%lf, d2=%lf, op=%ld",
+ (double) d1, (double) d2, (long) x->op));
+ switch (x->op) {
+ case DUK_OP_ADD: {
+ d3 = d1 + d2;
+ break;
+ }
+ case DUK_OP_SUB: {
+ d3 = d1 - d2;
+ break;
+ }
+ case DUK_OP_MUL: {
+ d3 = d1 * d2;
+ break;
+ }
+ case DUK_OP_DIV: {
+ d3 = d1 / d2;
+ break;
+ }
+ case DUK_OP_EXP: {
+ d3 = (duk_double_t) duk_js_arith_pow((double) d1, (double) d2);
+ break;
+ }
+ default: {
+ d3 = 0.0; /* Won't be used, but silence MSVC /W4 warning. */
+ accept_fold = 0;
+ break;
+ }
+ }
+
+ if (accept_fold) {
+ duk_double_union du;
+ du.d = d3;
+ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);
+ d3 = du.d;
+
+ x->t = DUK_IVAL_PLAIN;
+ DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE);
+ DUK_TVAL_SET_NUMBER(tv1, d3); /* old value is number: no refcount */
+ return;
+ }
+ } else if (x->op == DUK_OP_ADD && DUK_TVAL_IS_STRING(tv1) && DUK_TVAL_IS_STRING(tv2)) {
+ /* Inline string concatenation. No need to check for
+ * symbols, as all inputs are valid Ecmascript strings.
+ */
+ duk_dup(thr, x->x1.valstack_idx);
+ duk_dup(thr, x->x2.valstack_idx);
+ duk_concat(thr, 2);
+ duk_replace(thr, x->x1.valstack_idx);
+ x->t = DUK_IVAL_PLAIN;
+ DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE);
+ return;
+ }
+ }
+
+ arg1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);
+ arg2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);
+
+ /* If forced reg, use it as destination. Otherwise try to
+ * use either coerced ispec if it is a temporary.
+ */
+ if (forced_reg >= 0) {
+ dest = forced_reg;
+ } else if (DUK__ISREG_TEMP(comp_ctx, arg1)) {
+ dest = arg1;
+ } else if (DUK__ISREG_TEMP(comp_ctx, arg2)) {
+ dest = arg2;
+ } else {
+ dest = DUK__ALLOCTEMP(comp_ctx);
+ }
+
+ DUK_ASSERT(DUK__ISREG(dest));
+ duk__emit_a_b_c(comp_ctx, x->op | DUK__EMIT_FLAG_BC_REGCONST, dest, arg1, arg2);
+
+ duk__ivalue_regconst(x, dest);
+ return;
+ }
+ case DUK_IVAL_PROP: {
+ /* XXX: very similar to DUK_IVAL_ARITH - merge? */
+ duk_regconst_t arg1;
+ duk_regconst_t arg2;
+ duk_regconst_t dest;
+
+ /* Need a short reg/const, does not have to be a mutable temp. */
+ arg1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);
+ arg2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);
+
+ /* Pick a destination register. If either base value or key
+ * happens to be a temp value, reuse it as the destination.
+ *
+ * XXX: The temp must be a "mutable" one, i.e. such that no
+ * other expression is using it anymore. Here this should be
+ * the case because the value of a property access expression
+ * is neither the base nor the key, but the lookup result.
+ */
+
+ if (forced_reg >= 0) {
+ dest = forced_reg;
+ } else if (DUK__ISREG_TEMP(comp_ctx, arg1)) {
+ dest = arg1;
+ } else if (DUK__ISREG_TEMP(comp_ctx, arg2)) {
+ dest = arg2;
+ } else {
+ dest = DUK__ALLOCTEMP(comp_ctx);
+ }
+
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST,
+ dest,
+ arg1,
+ arg2);
+
+ duk__ivalue_regconst(x, dest);
+ return;
+ }
+ case DUK_IVAL_VAR: {
+ /* x1 must be a string */
+ duk_regconst_t dest;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE);
+
+ duk_dup(thr, x->x1.valstack_idx);
+ if (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ duk__ivalue_regconst(x, reg_varbind);
+ } else {
+ dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));
+ duk__emit_a_bc(comp_ctx, DUK_OP_GETVAR, dest, rc_varname);
+ duk__ivalue_regconst(x, dest);
+ }
+ return;
+ }
+ case DUK_IVAL_NONE:
+ default: {
+ DUK_D(DUK_DPRINT("invalid ivalue type: %ld", (long) x->t));
+ break;
+ }
+ }
+
+ DUK_ERROR_INTERNAL(thr);
+ return;
+}
+
+/* evaluate to plain value, no forced register (temp/bound reg both ok) */
+DUK_LOCAL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ duk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/);
+}
+
+/* evaluate to final form (e.g. coerce GETPROP to code), throw away temp */
+DUK_LOCAL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ duk_regconst_t temp;
+
+ /* If duk__ivalue_toplain_raw() allocates a temp, forget it and
+ * restore next temp state.
+ */
+ temp = DUK__GETTEMP(comp_ctx);
+ duk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/);
+ DUK__SETTEMP(comp_ctx, temp);
+}
+
+/* Coerce an duk_ivalue to a register or constant; result register may
+ * be a temp or a bound register.
+ *
+ * The duk_ivalue argument ('x') is converted into a regconst as a
+ * side effect.
+ */
+DUK_LOCAL
+duk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx,
+ duk_ivalue *x,
+ duk_regconst_t forced_reg,
+ duk_small_uint_t flags) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_regconst_t reg;
+ DUK_UNREF(thr);
+
+ DUK_DDD(DUK_DDDPRINT("duk__ivalue_toregconst_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, "
+ "forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld",
+ (long) x->t, (long) x->op,
+ (long) x->x1.t, (long) x->x1.regconst,
+ (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx),
+ (long) x->x2.t, (long) x->x2.regconst,
+ (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx),
+ (long) forced_reg,
+ (unsigned long) flags,
+ (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0),
+ (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0),
+ (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0)));
+
+ /* first coerce to a plain value */
+ duk__ivalue_toplain_raw(comp_ctx, x, forced_reg);
+ DUK_ASSERT(x->t == DUK_IVAL_PLAIN);
+
+ /* then to a register */
+ reg = duk__ispec_toregconst_raw(comp_ctx, &x->x1, forced_reg, flags);
+ duk__ivalue_regconst(x, reg);
+
+ return reg;
+}
+
+DUK_LOCAL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ return duk__ivalue_toregconst_raw(comp_ctx, x, -1, 0 /*flags*/);
+}
+
+#if 0 /* unused */
+DUK_LOCAL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/);
+}
+#endif
+
+DUK_LOCAL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg) {
+ DUK_ASSERT(forced_reg >= 0);
+ (void) duk__ivalue_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/);
+}
+
+DUK_LOCAL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+}
+
+DUK_LOCAL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {
+ return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/);
+}
+
+/* The issues below can be solved with better flags */
+
+/* XXX: many operations actually want toforcedtemp() -- brand new temp? */
+/* XXX: need a toplain_ignore() which will only coerce a value to a temp
+ * register if it might have a side effect. Side-effect free values do not
+ * need to be coerced.
+ */
+
+/*
+ * Identifier handling
+ */
+
+DUK_LOCAL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_hstring *h_varname;
+ duk_regconst_t ret;
+
+ DUK_DDD(DUK_DDDPRINT("resolving identifier reference to '%!T'",
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /*
+ * Special name handling
+ */
+
+ h_varname = duk_known_hstring(thr, -1);
+
+ if (h_varname == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)) {
+ DUK_DDD(DUK_DDDPRINT("flagging function as accessing 'arguments'"));
+ comp_ctx->curr_func.id_access_arguments = 1;
+ }
+
+ /*
+ * Inside one or more 'with' statements fall back to slow path always.
+ * (See e.g. test-stmt-with.js.)
+ */
+
+ if (comp_ctx->curr_func.with_depth > 0) {
+ DUK_DDD(DUK_DDDPRINT("identifier lookup inside a 'with' -> fall back to slow path"));
+ goto slow_path_own;
+ }
+
+ /*
+ * Any catch bindings ("catch (e)") also affect identifier binding.
+ *
+ * Currently, the varmap is modified for the duration of the catch
+ * clause to ensure any identifier accesses with the catch variable
+ * name will use slow path.
+ */
+
+ duk_get_prop(thr, comp_ctx->curr_func.varmap_idx);
+ if (duk_is_number(thr, -1)) {
+ ret = duk_to_int(thr, -1);
+ duk_pop(thr);
+ } else {
+ duk_pop(thr);
+ if (comp_ctx->curr_func.catch_depth > 0 || comp_ctx->curr_func.with_depth > 0) {
+ DUK_DDD(DUK_DDDPRINT("slow path access from inside a try-catch or with needs _Varmap"));
+ goto slow_path_own;
+ } else {
+ /* In this case we're doing a variable lookup that doesn't
+ * match our own variables, so _Varmap won't be needed at
+ * run time.
+ */
+ DUK_DDD(DUK_DDDPRINT("slow path access outside of try-catch and with, no need for _Varmap"));
+ goto slow_path_notown;
+ }
+ }
+
+ DUK_DDD(DUK_DDDPRINT("identifier lookup -> reg %ld", (long) ret));
+ return ret;
+
+ slow_path_notown:
+ DUK_DDD(DUK_DDDPRINT("identifier lookup -> slow path, not own variable"));
+
+ comp_ctx->curr_func.id_access_slow = 1;
+ return (duk_regconst_t) -1;
+
+ slow_path_own:
+ DUK_DDD(DUK_DDDPRINT("identifier lookup -> slow path, may be own variable"));
+
+ comp_ctx->curr_func.id_access_slow = 1;
+ comp_ctx->curr_func.id_access_slow_own = 1;
+ return (duk_regconst_t) -1;
+}
+
+/* Lookup an identifier name in the current varmap, indicating whether the
+ * identifier is register-bound and if not, allocating a constant for the
+ * identifier name. Returns 1 if register-bound, 0 otherwise. Caller can
+ * also check (out_reg_varbind >= 0) to check whether or not identifier is
+ * register bound. The caller must NOT use out_rc_varname at all unless
+ * return code is 0 or out_reg_varbind is < 0; this is becuase out_rc_varname
+ * is unsigned and doesn't have a "unused" / none value.
+ */
+DUK_LOCAL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ /* [ ... varname ] */
+
+ duk_dup_top(thr);
+ reg_varbind = duk__lookup_active_register_binding(comp_ctx);
+
+ if (reg_varbind >= 0) {
+ *out_reg_varbind = reg_varbind;
+ *out_rc_varname = 0; /* duk_regconst_t is unsigned, so use 0 as dummy value (ignored by caller) */
+ duk_pop(thr);
+ return 1;
+ } else {
+ rc_varname = duk__getconst(comp_ctx);
+ *out_reg_varbind = -1;
+ *out_rc_varname = rc_varname;
+ return 0;
+ }
+}
+
+/*
+ * Label handling
+ *
+ * Labels are initially added with flags prohibiting both break and continue.
+ * When the statement type is finally uncovered (after potentially multiple
+ * labels), all the labels are updated to allow/prohibit break and continue.
+ */
+
+DUK_LOCAL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_size_t n;
+ duk_size_t new_size;
+ duk_uint8_t *p;
+ duk_labelinfo *li_start, *li;
+
+ /* Duplicate (shadowing) labels are not allowed, except for the empty
+ * labels (which are used as default labels for switch and iteration
+ * statements).
+ *
+ * We could also allow shadowing of non-empty pending labels without any
+ * other issues than breaking the required label shadowing requirements
+ * of the E5 specification, see Section 12.12.
+ */
+
+ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos);
+ li_start = (duk_labelinfo *) (void *) p;
+ li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));
+ n = (duk_size_t) (li - li_start);
+
+ while (li > li_start) {
+ li--;
+
+ if (li->h_label == h_label && h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_DUPLICATE_LABEL);
+ }
+ }
+
+ duk_push_hstring(thr, h_label);
+ DUK_ASSERT(n <= DUK_UARRIDX_MAX); /* label limits */
+ (void) duk_put_prop_index(thr, comp_ctx->curr_func.labelnames_idx, (duk_uarridx_t) n);
+
+ new_size = (n + 1) * sizeof(duk_labelinfo);
+ duk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, new_size);
+ /* XXX: slack handling, slow now */
+
+ /* relookup after possible realloc */
+ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos);
+ li_start = (duk_labelinfo *) (void *) p;
+ DUK_UNREF(li_start); /* silence scan-build warning */
+ li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));
+ li--;
+
+ /* Labels can be used for iteration statements but also for other statements,
+ * in particular a label can be used for a block statement. All cases of a
+ * named label accept a 'break' so that flag is set here. Iteration statements
+ * also allow 'continue', so that flag is updated when we figure out the
+ * statement type.
+ */
+
+ li->flags = DUK_LABEL_FLAG_ALLOW_BREAK;
+ li->label_id = label_id;
+ li->h_label = h_label;
+ li->catch_depth = comp_ctx->curr_func.catch_depth; /* catch depth from current func */
+ li->pc_label = pc_label;
+
+ DUK_DDD(DUK_DDDPRINT("registered label: flags=0x%08lx, id=%ld, name=%!O, catch_depth=%ld, pc_label=%ld",
+ (unsigned long) li->flags, (long) li->label_id, (duk_heaphdr *) li->h_label,
+ (long) li->catch_depth, (long) li->pc_label));
+}
+
+/* Update all labels with matching label_id. */
+DUK_LOCAL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags) {
+ duk_uint8_t *p;
+ duk_labelinfo *li_start, *li;
+
+ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(comp_ctx->thr->heap, comp_ctx->curr_func.h_labelinfos);
+ li_start = (duk_labelinfo *) (void *) p;
+ li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));
+
+ /* Match labels starting from latest; once label_id no longer matches, we can
+ * safely exit without checking the rest of the labels (only the topmost labels
+ * are ever updated).
+ */
+ while (li > li_start) {
+ li--;
+
+ if (li->label_id != label_id) {
+ break;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("updating (overwriting) label flags for li=%p, label_id=%ld, flags=%ld",
+ (void *) li, (long) label_id, (long) flags));
+
+ li->flags = flags;
+ }
+}
+
+/* Lookup active label information. Break/continue distinction is necessary to handle switch
+ * statement related labels correctly: a switch will only catch a 'break', not a 'continue'.
+ *
+ * An explicit label cannot appear multiple times in the active set, but empty labels (unlabelled
+ * iteration and switch statements) can. A break will match the closest unlabelled or labelled
+ * statement. A continue will match the closest unlabelled or labelled iteration statement. It is
+ * a syntax error if a continue matches a labelled switch statement; because an explicit label cannot
+ * be duplicated, the continue cannot match any valid label outside the switch.
+ *
+ * A side effect of these rules is that a LABEL statement related to a switch should never actually
+ * catch a continue abrupt completion at run-time. Hence an INVALID opcode can be placed in the
+ * continue slot of the switch's LABEL statement.
+ */
+
+/* XXX: awkward, especially the bunch of separate output values -> output struct? */
+DUK_LOCAL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_uint8_t *p;
+ duk_labelinfo *li_start, *li_end, *li;
+ duk_bool_t match = 0;
+
+ DUK_DDD(DUK_DDDPRINT("looking up active label: label='%!O', is_break=%ld",
+ (duk_heaphdr *) h_label, (long) is_break));
+
+ DUK_UNREF(thr);
+
+ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos);
+ li_start = (duk_labelinfo *) (void *) p;
+ li_end = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));
+ li = li_end;
+
+ /* Match labels starting from latest label because there can be duplicate empty
+ * labels in the label set.
+ */
+ while (li > li_start) {
+ li--;
+
+ if (li->h_label != h_label) {
+ DUK_DDD(DUK_DDDPRINT("labelinfo[%ld] ->'%!O' != %!O",
+ (long) (li - li_start),
+ (duk_heaphdr *) li->h_label,
+ (duk_heaphdr *) h_label));
+ continue;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("labelinfo[%ld] -> '%!O' label name matches (still need to check type)",
+ (long) (li - li_start), (duk_heaphdr *) h_label));
+
+ /* currently all labels accept a break, so no explicit check for it now */
+ DUK_ASSERT(li->flags & DUK_LABEL_FLAG_ALLOW_BREAK);
+
+ if (is_break) {
+ /* break matches always */
+ match = 1;
+ break;
+ } else if (li->flags & DUK_LABEL_FLAG_ALLOW_CONTINUE) {
+ /* iteration statements allow continue */
+ match = 1;
+ break;
+ } else {
+ /* continue matched this label -- we can only continue if this is the empty
+ * label, for which duplication is allowed, and thus there is hope of
+ * finding a match deeper in the label stack.
+ */
+ if (h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("continue matched an empty label which does not "
+ "allow a continue -> continue lookup deeper in label stack"));
+ }
+ }
+ }
+ /* XXX: match flag is awkward, rework */
+ if (!match) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("label match: %!O -> label_id %ld, catch_depth=%ld, pc_label=%ld",
+ (duk_heaphdr *) h_label, (long) li->label_id,
+ (long) li->catch_depth, (long) li->pc_label));
+
+ *out_label_id = li->label_id;
+ *out_label_catch_depth = li->catch_depth;
+ *out_label_pc = li->pc_label;
+ *out_is_closest = (li == li_end - 1);
+}
+
+DUK_LOCAL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len) {
+ duk_hthread *thr = comp_ctx->thr;
+
+ duk_set_length(thr, comp_ctx->curr_func.labelnames_idx, len);
+ duk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, sizeof(duk_labelinfo) * len);
+}
+
+/*
+ * Expression parsing: duk__expr_nud(), duk__expr_led(), duk__expr_lbp(), and helpers.
+ *
+ * - duk__expr_nud(): ("null denotation"): process prev_token as a "start" of an expression (e.g. literal)
+ * - duk__expr_led(): ("left denotation"): process prev_token in the "middle" of an expression (e.g. operator)
+ * - duk__expr_lbp(): ("left-binding power"): return left-binding power of curr_token
+ */
+
+/* object literal key tracking flags */
+#define DUK__OBJ_LIT_KEY_PLAIN (1 << 0) /* key encountered as a plain property */
+#define DUK__OBJ_LIT_KEY_GET (1 << 1) /* key encountered as a getter */
+#define DUK__OBJ_LIT_KEY_SET (1 << 2) /* key encountered as a setter */
+
+DUK_LOCAL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_regconst_t reg_obj; /* result reg */
+ duk_regconst_t reg_temp; /* temp reg */
+ duk_regconst_t temp_start; /* temp reg value for start of loop */
+ duk_small_uint_t max_init_values; /* max # of values initialized in one MPUTARR set */
+ duk_small_uint_t num_values; /* number of values in current MPUTARR set */
+ duk_uarridx_t curr_idx; /* current (next) array index */
+ duk_uarridx_t start_idx; /* start array index of current MPUTARR set */
+ duk_uarridx_t init_idx; /* last array index explicitly initialized, +1 */
+ duk_bool_t require_comma; /* next loop requires a comma */
+#if !defined(DUK_USE_PREFER_SIZE)
+ duk_int_t pc_newarr;
+ duk_compiler_instr *instr;
+#endif
+
+ /* DUK_TOK_LBRACKET already eaten, current token is right after that */
+ DUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LBRACKET);
+
+ max_init_values = DUK__MAX_ARRAY_INIT_VALUES; /* XXX: depend on available temps? */
+
+ reg_obj = DUK__ALLOCTEMP(comp_ctx);
+#if !defined(DUK_USE_PREFER_SIZE)
+ pc_newarr = duk__get_current_pc(comp_ctx);
+#endif
+ duk__emit_bc(comp_ctx, DUK_OP_NEWARR, reg_obj); /* XXX: patch initial size hint afterwards? */
+ temp_start = DUK__GETTEMP(comp_ctx);
+
+ /*
+ * Emit initializers in sets of maximum max_init_values.
+ * Corner cases such as single value initializers do not have
+ * special handling now.
+ *
+ * Elided elements must not be emitted as 'undefined' values,
+ * because such values would be enumerable (which is incorrect).
+ * Also note that trailing elisions must be reflected in the
+ * length of the final array but cause no elements to be actually
+ * inserted.
+ */
+
+ curr_idx = 0;
+ init_idx = 0; /* tracks maximum initialized index + 1 */
+ start_idx = 0;
+ require_comma = 0;
+
+ for (;;) {
+ num_values = 0;
+ DUK__SETTEMP(comp_ctx, temp_start);
+
+ if (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) {
+ break;
+ }
+
+ for (;;) {
+ if (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) {
+ /* the outer loop will recheck and exit */
+ break;
+ }
+
+ /* comma check */
+ if (require_comma) {
+ if (comp_ctx->curr_token.t == DUK_TOK_COMMA) {
+ /* comma after a value, expected */
+ duk__advance(comp_ctx);
+ require_comma = 0;
+ continue;
+ } else {
+ goto syntax_error;
+ }
+ } else {
+ if (comp_ctx->curr_token.t == DUK_TOK_COMMA) {
+ /* elision - flush */
+ curr_idx++;
+ duk__advance(comp_ctx);
+ /* if num_values > 0, MPUTARR emitted by outer loop after break */
+ break;
+ }
+ }
+ /* else an array initializer element */
+
+ /* initial index */
+ if (num_values == 0) {
+ start_idx = curr_idx;
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_load_int32(comp_ctx, reg_temp, (duk_int32_t) start_idx);
+ }
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx); /* alloc temp just in case, to update max temp */
+ DUK__SETTEMP(comp_ctx, reg_temp);
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/);
+ DUK__SETTEMP(comp_ctx, reg_temp + 1);
+
+ num_values++;
+ curr_idx++;
+ require_comma = 1;
+
+ if (num_values >= max_init_values) {
+ /* MPUTARR emitted by outer loop */
+ break;
+ }
+ }
+
+ if (num_values > 0) {
+ /* - A is a source register (it's not a write target, but used
+ * to identify the target object) but can be shuffled.
+ * - B cannot be shuffled normally because it identifies a range
+ * of registers, the emitter has special handling for this
+ * (the "no shuffle" flag must not be set).
+ * - C is a non-register number and cannot be shuffled, but
+ * never needs to be.
+ */
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_MPUTARR |
+ DUK__EMIT_FLAG_NO_SHUFFLE_C |
+ DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_obj,
+ temp_start,
+ (duk_regconst_t) (num_values + 1));
+ init_idx = start_idx + num_values;
+
+ /* num_values and temp_start reset at top of outer loop */
+ }
+ }
+
+ /* Update initil size for NEWARR, doesn't need to be exact and is
+ * capped at A field limit.
+ */
+#if !defined(DUK_USE_PREFER_SIZE)
+ instr = duk__get_instr_ptr(comp_ctx, pc_newarr);
+ instr->ins |= DUK_ENC_OP_A(0, curr_idx > DUK_BC_A_MAX ? DUK_BC_A_MAX : curr_idx);
+#endif
+
+ DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RBRACKET);
+ duk__advance(comp_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("array literal done, curridx=%ld, initidx=%ld",
+ (long) curr_idx, (long) init_idx));
+
+ /* trailing elisions? */
+ if (curr_idx > init_idx) {
+ /* yes, must set array length explicitly */
+ DUK_DDD(DUK_DDDPRINT("array literal has trailing elisions which affect its length"));
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_load_int32(comp_ctx, reg_temp, (duk_int_t) curr_idx);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_SETALEN | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_obj,
+ reg_temp);
+ }
+
+ DUK__SETTEMP(comp_ctx, temp_start);
+
+ duk__ivalue_regconst(res, reg_obj);
+ return;
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARRAY_LITERAL);
+}
+
+typedef struct {
+ duk_regconst_t reg_obj;
+ duk_regconst_t temp_start;
+ duk_small_uint_t num_pairs;
+ duk_small_uint_t num_total_pairs;
+} duk__objlit_state;
+
+DUK_LOCAL void duk__objlit_flush_keys(duk_compiler_ctx *comp_ctx, duk__objlit_state *st) {
+ if (st->num_pairs > 0) {
+ /* - A is a source register (it's not a write target, but used
+ * to identify the target object) but can be shuffled.
+ * - B cannot be shuffled normally because it identifies a range
+ * of registers, the emitter has special handling for this
+ * (the "no shuffle" flag must not be set).
+ * - C is a non-register number and cannot be shuffled, but
+ * never needs to be.
+ */
+ DUK_ASSERT(st->num_pairs > 0);
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_MPUTOBJ |
+ DUK__EMIT_FLAG_NO_SHUFFLE_C |
+ DUK__EMIT_FLAG_A_IS_SOURCE,
+ st->reg_obj,
+ st->temp_start,
+ (duk_regconst_t) (st->num_pairs * 2));
+ st->num_total_pairs += st->num_pairs;
+ st->num_pairs = 0;
+ }
+ DUK__SETTEMP(comp_ctx, st->temp_start);
+}
+
+DUK_LOCAL duk_bool_t duk__objlit_load_key(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_token *tok, duk_regconst_t reg_temp) {
+ if (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t_nores == DUK_TOK_STRING) {
+ /* same handling for identifiers and strings */
+ DUK_ASSERT(tok->str1 != NULL);
+ duk_push_hstring(comp_ctx->thr, tok->str1);
+ } else if (tok->t == DUK_TOK_NUMBER) {
+ /* numbers can be loaded as numbers and coerced on the fly */
+ duk_push_number(comp_ctx->thr, tok->num);
+ } else {
+ return 1; /* error */
+ }
+
+ duk__ivalue_plain_fromstack(comp_ctx, res);
+ DUK__SETTEMP(comp_ctx, reg_temp + 1);
+ duk__ivalue_toforcedreg(comp_ctx, res, reg_temp);
+ DUK__SETTEMP(comp_ctx, reg_temp + 1);
+ return 0;
+}
+
+DUK_LOCAL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk__objlit_state st;
+ duk_regconst_t reg_temp; /* temp reg */
+ duk_small_uint_t max_init_pairs; /* max # of key-value pairs initialized in one MPUTOBJ set */
+ duk_bool_t first; /* first value: comma must not precede the value */
+ duk_bool_t is_set, is_get; /* temps */
+#if !defined(DUK_USE_PREFER_SIZE)
+ duk_int_t pc_newobj;
+ duk_compiler_instr *instr;
+#endif
+
+ DUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LCURLY);
+
+ max_init_pairs = DUK__MAX_OBJECT_INIT_PAIRS; /* XXX: depend on available temps? */
+
+ st.reg_obj = DUK__ALLOCTEMP(comp_ctx); /* target object */
+ st.temp_start = DUK__GETTEMP(comp_ctx); /* start of MPUTOBJ argument list */
+ st.num_pairs = 0; /* number of key/value pairs emitted for current MPUTOBJ set */
+ st.num_total_pairs = 0; /* number of key/value pairs emitted overall */
+
+#if !defined(DUK_USE_PREFER_SIZE)
+ pc_newobj = duk__get_current_pc(comp_ctx);
+#endif
+ duk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, st.reg_obj);
+
+ /*
+ * Emit initializers in sets of maximum max_init_pairs keys.
+ * Setter/getter is handled separately and terminates the
+ * current set of initializer values. Corner cases such as
+ * single value initializers do not have special handling now.
+ */
+
+ first = 1;
+ for (;;) {
+ /*
+ * ES5 and ES2015+ provide a lot of different PropertyDefinition
+ * formats, see http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer.
+ *
+ * PropertyName can be IdentifierName (includes reserved words), a string
+ * literal, or a number literal. Note that IdentifierName allows 'get' and
+ * 'set' too, so we need to look ahead to the next token to distinguish:
+ *
+ * { get : 1 }
+ *
+ * and
+ *
+ * { get foo() { return 1 } }
+ * { get get() { return 1 } } // 'get' as getter propertyname
+ *
+ * Finally, a trailing comma is allowed.
+ *
+ * Key name is coerced to string at compile time (and ends up as a
+ * a string constant) even for numeric keys (e.g. "{1:'foo'}").
+ * These could be emitted using e.g. LDINT, but that seems hardly
+ * worth the effort and would increase code size.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("object literal loop, curr_token->t = %ld",
+ (long) comp_ctx->curr_token.t));
+
+ if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {
+ break;
+ }
+
+ if (first) {
+ first = 0;
+ } else {
+ if (comp_ctx->curr_token.t != DUK_TOK_COMMA) {
+ goto syntax_error;
+ }
+ duk__advance(comp_ctx);
+ if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {
+ /* trailing comma followed by rcurly */
+ break;
+ }
+ }
+
+ /* Advance to get one step of lookup. */
+ duk__advance(comp_ctx);
+
+ /* Flush current MPUTOBJ if enough many pairs gathered. */
+ if (st.num_pairs >= max_init_pairs) {
+ duk__objlit_flush_keys(comp_ctx, &st);
+ DUK_ASSERT(st.num_pairs == 0);
+ }
+
+ /* Reset temp register state and reserve reg_temp and
+ * reg_temp + 1 for handling the current property.
+ */
+ DUK__SETTEMP(comp_ctx, st.temp_start + 2 * (duk_regconst_t) st.num_pairs);
+ reg_temp = DUK__ALLOCTEMPS(comp_ctx, 2);
+
+ /* NOTE: "get" and "set" are not officially ReservedWords and the lexer
+ * currently treats them always like ordinary identifiers (DUK_TOK_GET
+ * and DUK_TOK_SET are unused). They need to be detected based on the
+ * identifier string content.
+ */
+
+ is_get = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&
+ comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_GET(thr));
+ is_set = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&
+ comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_SET(thr));
+ if ((is_get || is_set) && comp_ctx->curr_token.t != DUK_TOK_COLON) {
+ /* getter/setter */
+ duk_int_t fnum;
+
+ duk__objlit_flush_keys(comp_ctx, &st);
+ DUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start); /* 2 regs are guaranteed to be allocated w.r.t. temp_max */
+ reg_temp = DUK__ALLOCTEMPS(comp_ctx, 2);
+
+ if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->curr_token, reg_temp) != 0) {
+ goto syntax_error;
+ }
+
+ /* curr_token = get/set name */
+ fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_GETSET);
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CLOSURE,
+ st.temp_start + 1,
+ (duk_regconst_t) fnum);
+
+ /* Slot C is used in a non-standard fashion (range of regs),
+ * emitter code has special handling for it (must not set the
+ * "no shuffle" flag).
+ */
+ duk__emit_a_bc(comp_ctx,
+ (is_get ? DUK_OP_INITGET : DUK_OP_INITSET) | DUK__EMIT_FLAG_A_IS_SOURCE,
+ st.reg_obj,
+ st.temp_start); /* temp_start+0 = key, temp_start+1 = closure */
+
+ DUK_ASSERT(st.num_pairs == 0); /* temp state is reset on next loop */
+#if defined(DUK_USE_ES6)
+ } else if (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&
+ (comp_ctx->curr_token.t == DUK_TOK_COMMA || comp_ctx->curr_token.t == DUK_TOK_RCURLY)) {
+ duk_bool_t load_rc;
+
+ load_rc = duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp);
+ DUK_UNREF(load_rc);
+ DUK_ASSERT(load_rc == 0); /* always succeeds because token is identifier */
+
+ duk__ivalue_var_hstring(comp_ctx, res, comp_ctx->prev_token.str1);
+ DUK_ASSERT(DUK__GETTEMP(comp_ctx) == reg_temp + 1);
+ duk__ivalue_toforcedreg(comp_ctx, res, reg_temp + 1);
+
+ st.num_pairs++;
+ } else if ((comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER ||
+ comp_ctx->prev_token.t == DUK_TOK_STRING ||
+ comp_ctx->prev_token.t == DUK_TOK_NUMBER) &&
+ comp_ctx->curr_token.t == DUK_TOK_LPAREN) {
+ duk_int_t fnum;
+
+ /* Parsing-wise there's a small hickup here: the token parsing
+ * state is one step too advanced for the function parse helper
+ * compared to other cases. The current solution is an extra
+ * flag to indicate whether function parsing should use the
+ * current or the previous token to starting parsing from.
+ */
+
+ if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) {
+ goto syntax_error;
+ }
+
+ fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_USE_PREVTOKEN | DUK__FUNC_FLAG_METDEF);
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CLOSURE,
+ reg_temp + 1,
+ (duk_regconst_t) fnum);
+
+ st.num_pairs++;
+#endif /* DUK_USE_ES6 */
+ } else {
+#if defined(DUK_USE_ES6)
+ if (comp_ctx->prev_token.t == DUK_TOK_LBRACKET) {
+ /* ES2015 computed property name. Executor ToPropertyKey()
+ * coerces the key at runtime.
+ */
+ DUK__SETTEMP(comp_ctx, reg_temp);
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR, reg_temp);
+ duk__advance_expect(comp_ctx, DUK_TOK_RBRACKET);
+
+ /* XXX: If next token is '(' we're dealing with
+ * the method shorthand with a computed name,
+ * e.g. { [Symbol.for('foo')](a,b) {} }. This
+ * form is not yet supported and causes a
+ * SyntaxError on the DUK_TOK_COLON check below.
+ */
+ }
+ else
+#endif /* DUK_USE_ES6 */
+ {
+ if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) {
+ goto syntax_error;
+ }
+ }
+
+ duk__advance_expect(comp_ctx, DUK_TOK_COLON);
+
+ DUK__SETTEMP(comp_ctx, reg_temp + 1);
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp + 1 /*forced_reg*/);
+
+ st.num_pairs++;
+ }
+ } /* property loop */
+
+ /* Flush remaining properties. */
+ duk__objlit_flush_keys(comp_ctx, &st);
+ DUK_ASSERT(st.num_pairs == 0);
+ DUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start);
+
+ /* Update initial size for NEWOBJ. The init size doesn't need to be
+ * exact as the purpose is just to avoid object resizes in common
+ * cases. The size is capped to field A limit, and will be too high
+ * if the object literal contains duplicate keys (this is harmless but
+ * increases memory traffic if the object is compacted later on).
+ */
+#if !defined(DUK_USE_PREFER_SIZE)
+ instr = duk__get_instr_ptr(comp_ctx, pc_newobj);
+ instr->ins |= DUK_ENC_OP_A(0, st.num_total_pairs > DUK_BC_A_MAX ? DUK_BC_A_MAX : st.num_total_pairs);
+#endif
+
+ DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY);
+ duk__advance(comp_ctx);
+
+ duk__ivalue_regconst(res, st.reg_obj);
+ return;
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_OBJECT_LITERAL);
+}
+
+/* Parse argument list. Arguments are written to temps starting from
+ * "next temp". Returns number of arguments parsed. Expects left paren
+ * to be already eaten, and eats the right paren before returning.
+ */
+DUK_LOCAL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_int_t nargs = 0;
+ duk_regconst_t reg_temp;
+
+ /* Note: expect that caller has already eaten the left paren */
+
+ DUK_DDD(DUK_DDDPRINT("start parsing arguments, prev_token.t=%ld, curr_token.t=%ld",
+ (long) comp_ctx->prev_token.t, (long) comp_ctx->curr_token.t));
+
+ for (;;) {
+ if (comp_ctx->curr_token.t == DUK_TOK_RPAREN) {
+ break;
+ }
+ if (nargs > 0) {
+ duk__advance_expect(comp_ctx, DUK_TOK_COMMA);
+ }
+
+ /* We want the argument expression value to go to "next temp"
+ * without additional moves. That should almost always be the
+ * case, but we double check after expression parsing.
+ *
+ * This is not the cleanest possible approach.
+ */
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx); /* bump up "allocated" reg count, just in case */
+ DUK__SETTEMP(comp_ctx, reg_temp);
+
+ /* binding power must be high enough to NOT allow comma expressions directly */
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp); /* always allow 'in', coerce to 'tr' just in case */
+
+ DUK__SETTEMP(comp_ctx, reg_temp + 1);
+ nargs++;
+
+ DUK_DDD(DUK_DDDPRINT("argument #%ld written into reg %ld", (long) nargs, (long) reg_temp));
+ }
+
+ /* eat the right paren */
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ DUK_DDD(DUK_DDDPRINT("end parsing arguments"));
+
+ return nargs;
+}
+
+DUK_LOCAL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx) {
+ /* empty expressions can be detected conveniently with nud/led counts */
+ return (comp_ctx->curr_func.nud_count == 0) &&
+ (comp_ctx->curr_func.led_count == 0);
+}
+
+DUK_LOCAL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_token *tk;
+ duk_regconst_t temp_at_entry;
+ duk_small_uint_t tok;
+ duk_uint32_t args; /* temp variable to pass constants and flags to shared code */
+
+ /*
+ * ctx->prev_token token to process with duk__expr_nud()
+ * ctx->curr_token updated by caller
+ *
+ * Note: the token in the switch below has already been eaten.
+ */
+
+ temp_at_entry = DUK__GETTEMP(comp_ctx);
+
+ comp_ctx->curr_func.nud_count++;
+
+ tk = &comp_ctx->prev_token;
+ tok = tk->t;
+ res->t = DUK_IVAL_NONE;
+
+ DUK_DDD(DUK_DDDPRINT("duk__expr_nud(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld",
+ (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level));
+
+ switch (tok) {
+
+ /* PRIMARY EXPRESSIONS */
+
+ case DUK_TOK_THIS: {
+ duk_regconst_t reg_temp;
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_bc(comp_ctx,
+ DUK_OP_LDTHIS,
+ reg_temp);
+ duk__ivalue_regconst(res, reg_temp);
+ return;
+ }
+ case DUK_TOK_IDENTIFIER: {
+ duk__ivalue_var_hstring(comp_ctx, res, tk->str1);
+ return;
+ }
+ case DUK_TOK_NULL: {
+ duk_push_null(thr);
+ goto plain_value;
+ }
+ case DUK_TOK_TRUE: {
+ duk_push_true(thr);
+ goto plain_value;
+ }
+ case DUK_TOK_FALSE: {
+ duk_push_false(thr);
+ goto plain_value;
+ }
+ case DUK_TOK_NUMBER: {
+ duk_push_number(thr, tk->num);
+ goto plain_value;
+ }
+ case DUK_TOK_STRING: {
+ DUK_ASSERT(tk->str1 != NULL);
+ duk_push_hstring(thr, tk->str1);
+ goto plain_value;
+ }
+ case DUK_TOK_REGEXP: {
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ duk_regconst_t reg_temp;
+ duk_regconst_t rc_re_bytecode; /* const */
+ duk_regconst_t rc_re_source; /* const */
+
+ DUK_ASSERT(tk->str1 != NULL);
+ DUK_ASSERT(tk->str2 != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("emitting regexp op, str1=%!O, str2=%!O",
+ (duk_heaphdr *) tk->str1,
+ (duk_heaphdr *) tk->str2));
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk_push_hstring(thr, tk->str1);
+ duk_push_hstring(thr, tk->str2);
+
+ /* [ ... pattern flags ] */
+
+ duk_regexp_compile(thr);
+
+ /* [ ... escaped_source bytecode ] */
+
+ rc_re_bytecode = duk__getconst(comp_ctx);
+ rc_re_source = duk__getconst(comp_ctx);
+
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_REGEXP | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_temp /*a*/,
+ rc_re_bytecode /*b*/,
+ rc_re_source /*c*/);
+
+ duk__ivalue_regconst(res, reg_temp);
+ return;
+#else /* DUK_USE_REGEXP_SUPPORT */
+ goto syntax_error;
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ }
+ case DUK_TOK_LBRACKET: {
+ DUK_DDD(DUK_DDDPRINT("parsing array literal"));
+ duk__nud_array_literal(comp_ctx, res);
+ return;
+ }
+ case DUK_TOK_LCURLY: {
+ DUK_DDD(DUK_DDDPRINT("parsing object literal"));
+ duk__nud_object_literal(comp_ctx, res);
+ return;
+ }
+ case DUK_TOK_LPAREN: {
+ duk_bool_t prev_allow_in;
+
+ comp_ctx->curr_func.paren_level++;
+ prev_allow_in = comp_ctx->curr_func.allow_in;
+ comp_ctx->curr_func.allow_in = 1; /* reset 'allow_in' for parenthesized expression */
+
+ duk__expr(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression, terminates at a ')' */
+
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+ comp_ctx->curr_func.allow_in = prev_allow_in;
+ comp_ctx->curr_func.paren_level--;
+ return;
+ }
+
+ /* MEMBER/NEW/CALL EXPRESSIONS */
+
+ case DUK_TOK_NEW: {
+ /*
+ * Parsing an expression starting with 'new' is tricky because
+ * there are multiple possible productions deriving from
+ * LeftHandSideExpression which begin with 'new'.
+ *
+ * We currently resort to one-token lookahead to distinguish the
+ * cases. Hopefully this is correct. The binding power must be
+ * such that parsing ends at an LPAREN (CallExpression) but not at
+ * a PERIOD or LBRACKET (MemberExpression).
+ *
+ * See doc/compiler.rst for discussion on the parsing approach,
+ * and testcases/test-dev-new.js for a bunch of documented tests.
+ */
+
+ duk_regconst_t reg_target;
+ duk_int_t nargs;
+
+ DUK_DDD(DUK_DDDPRINT("begin parsing new expression"));
+
+ reg_target = DUK__ALLOCTEMPS(comp_ctx, 2);
+
+#if defined(DUK_USE_ES6)
+ if (comp_ctx->curr_token.t == DUK_TOK_PERIOD) {
+ /* new.target */
+ DUK_DDD(DUK_DDDPRINT("new.target"));
+ duk__advance(comp_ctx);
+ if (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER ||
+ !duk_hstring_equals_ascii_cstring(comp_ctx->curr_token.str1, "target")) {
+ goto syntax_error_newtarget;
+ }
+ if (comp_ctx->curr_func.is_global) {
+ goto syntax_error_newtarget;
+ }
+ duk__advance(comp_ctx);
+ duk__emit_bc(comp_ctx,
+ DUK_OP_NEWTARGET,
+ reg_target);
+ duk__ivalue_regconst(res, reg_target);
+ return;
+ }
+#endif /* DUK_USE_ES6 */
+
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_CALL /*rbp_flags*/, reg_target /*forced_reg*/);
+ duk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, reg_target + 1); /* default instance */
+ DUK__SETTEMP(comp_ctx, reg_target + 2);
+
+ /* XXX: 'new obj.noSuch()' doesn't use GETPROPC now which
+ * makes the error message worse than for obj.noSuch().
+ */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_LPAREN) {
+ /* 'new' MemberExpression Arguments */
+ DUK_DDD(DUK_DDDPRINT("new expression has argument list"));
+ duk__advance(comp_ctx);
+ nargs = duk__parse_arguments(comp_ctx, res); /* parse args starting from "next temp", reg_target + 1 */
+ /* right paren eaten */
+ } else {
+ /* 'new' MemberExpression */
+ DUK_DDD(DUK_DDDPRINT("new expression has no argument list"));
+ nargs = 0;
+ }
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CALL0 | DUK_BC_CALL_FLAG_CONSTRUCT,
+ nargs /*num_args*/,
+ reg_target /*target*/);
+
+ DUK_DDD(DUK_DDDPRINT("end parsing new expression"));
+
+ duk__ivalue_regconst(res, reg_target);
+ return;
+ }
+
+ /* FUNCTION EXPRESSIONS */
+
+ case DUK_TOK_FUNCTION: {
+ /* Function expression. Note that any statement beginning with 'function'
+ * is handled by the statement parser as a function declaration, or a
+ * non-standard function expression/statement (or a SyntaxError). We only
+ * handle actual function expressions (occurring inside an expression) here.
+ *
+ * O(depth^2) parse count for inner functions is handled by recording a
+ * lexer offset on the first compilation pass, so that the function can
+ * be efficiently skipped on the second pass. This is encapsulated into
+ * duk__parse_func_like_fnum().
+ */
+
+ duk_regconst_t reg_temp;
+ duk_int_t fnum;
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+
+ /* curr_token follows 'function' */
+ fnum = duk__parse_func_like_fnum(comp_ctx, 0 /*flags*/);
+ DUK_DDD(DUK_DDDPRINT("parsed inner function -> fnum %ld", (long) fnum));
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CLOSURE,
+ reg_temp /*a*/,
+ (duk_regconst_t) fnum /*bc*/);
+
+ duk__ivalue_regconst(res, reg_temp);
+ return;
+ }
+
+ /* UNARY EXPRESSIONS */
+
+ case DUK_TOK_DELETE: {
+ /* Delete semantics are a bit tricky. The description in E5 specification
+ * is kind of confusing, because it distinguishes between resolvability of
+ * a reference (which is only known at runtime) seemingly at compile time
+ * (= SyntaxError throwing).
+ */
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ if (res->t == DUK_IVAL_VAR) {
+ /* not allowed in strict mode, regardless of whether resolves;
+ * in non-strict mode DELVAR handles both non-resolving and
+ * resolving cases (the specification description is a bit confusing).
+ */
+
+ duk_regconst_t reg_temp;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ if (comp_ctx->curr_func.is_strict) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_CANNOT_DELETE_IDENTIFIER);
+ }
+
+ DUK__SETTEMP(comp_ctx, temp_at_entry);
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+
+ duk_dup(thr, res->x1.valstack_idx);
+ if (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ /* register bound variables are non-configurable -> always false */
+ duk__emit_bc(comp_ctx,
+ DUK_OP_LDFALSE,
+ reg_temp);
+ } else {
+ duk_dup(thr, res->x1.valstack_idx);
+ rc_varname = duk__getconst(comp_ctx);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_DELVAR,
+ reg_temp,
+ rc_varname);
+ }
+ duk__ivalue_regconst(res, reg_temp);
+ } else if (res->t == DUK_IVAL_PROP) {
+ duk_regconst_t reg_temp;
+ duk_regconst_t reg_obj;
+ duk_regconst_t rc_key;
+
+ DUK__SETTEMP(comp_ctx, temp_at_entry);
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */
+ rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_DELPROP | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_temp,
+ reg_obj,
+ rc_key);
+
+ duk__ivalue_regconst(res, reg_temp);
+ } else {
+ /* non-Reference deletion is always 'true', even in strict mode */
+ duk_push_true(thr);
+ goto plain_value;
+ }
+ return;
+ }
+ case DUK_TOK_VOID: {
+ duk__expr_toplain_ignore(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ duk_push_undefined(thr);
+ goto plain_value;
+ }
+ case DUK_TOK_TYPEOF: {
+ /* 'typeof' must handle unresolvable references without throwing
+ * a ReferenceError (E5 Section 11.4.3). Register mapped values
+ * will never be unresolvable so special handling is only required
+ * when an identifier is a "slow path" one.
+ */
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+
+ if (res->t == DUK_IVAL_VAR) {
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+ duk_regconst_t reg_temp;
+
+ duk_dup(thr, res->x1.valstack_idx);
+ if (!duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ DUK_DDD(DUK_DDDPRINT("typeof for an identifier name which could not be resolved "
+ "at compile time, need to use special run-time handling"));
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_TYPEOFID,
+ reg_temp,
+ rc_varname);
+ duk__ivalue_regconst(res, reg_temp);
+ return;
+ }
+ }
+
+ args = DUK_OP_TYPEOF;
+ goto unary;
+ }
+ case DUK_TOK_INCREMENT: {
+ args = (DUK_OP_PREINCP << 8) + DUK_OP_PREINCR;
+ goto preincdec;
+ }
+ case DUK_TOK_DECREMENT: {
+ args = (DUK_OP_PREDECP << 8) + DUK_OP_PREDECR;
+ goto preincdec;
+ }
+ case DUK_TOK_ADD: {
+ /* unary plus */
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE &&
+ duk_is_number(thr, res->x1.valstack_idx)) {
+ /* unary plus of a number is identity */
+ return;
+ }
+ args = DUK_OP_UNP;
+ goto unary;
+ }
+ case DUK_TOK_SUB: {
+ /* unary minus */
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE &&
+ duk_is_number(thr, res->x1.valstack_idx)) {
+ /* this optimization is important to handle negative literals
+ * (which are not directly provided by the lexical grammar)
+ */
+ duk_tval *tv_num;
+ duk_double_union du;
+
+ tv_num = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx);
+ DUK_ASSERT(tv_num != NULL);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_num));
+ du.d = DUK_TVAL_GET_NUMBER(tv_num);
+ du.d = -du.d;
+ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);
+ DUK_TVAL_SET_NUMBER(tv_num, du.d);
+ return;
+ }
+ args = DUK_OP_UNM;
+ goto unary;
+ }
+ case DUK_TOK_BNOT: {
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ args = DUK_OP_BNOT;
+ goto unary;
+ }
+ case DUK_TOK_LNOT: {
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE) {
+ /* Very minimal inlining to handle common idioms '!0' and '!1',
+ * and also boolean arguments like '!false' and '!true'.
+ */
+ duk_tval *tv_val;
+
+ tv_val = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx);
+ DUK_ASSERT(tv_val != NULL);
+ if (DUK_TVAL_IS_NUMBER(tv_val)) {
+ duk_double_t d;
+ d = DUK_TVAL_GET_NUMBER(tv_val);
+ if (d == 0.0) {
+ /* Matches both +0 and -0 on purpose. */
+ DUK_DDD(DUK_DDDPRINT("inlined lnot: !0 -> true"));
+ DUK_TVAL_SET_BOOLEAN_TRUE(tv_val);
+ return;
+ } else if (d == 1.0) {
+ DUK_DDD(DUK_DDDPRINT("inlined lnot: !1 -> false"));
+ DUK_TVAL_SET_BOOLEAN_FALSE(tv_val);
+ return;
+ }
+ } else if (DUK_TVAL_IS_BOOLEAN(tv_val)) {
+ duk_small_uint_t v;
+ v = DUK_TVAL_GET_BOOLEAN(tv_val);
+ DUK_DDD(DUK_DDDPRINT("inlined lnot boolean: %ld", (long) v));
+ DUK_ASSERT(v == 0 || v == 1);
+ DUK_TVAL_SET_BOOLEAN(tv_val, v ^ 0x01);
+ return;
+ }
+ }
+ args = DUK_OP_LNOT;
+ goto unary;
+ }
+
+ } /* end switch */
+
+ DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR);
+ return;
+
+ unary:
+ {
+ /* Unary opcodes use just the 'BC' register source because it
+ * matches current shuffle limits, and maps cleanly to 16 high
+ * bits of the opcode.
+ */
+
+ duk_regconst_t reg_src, reg_res;
+
+ reg_src = duk__ivalue_toregconst_raw(comp_ctx, res, -1 /*forced_reg*/, 0 /*flags*/);
+ if (DUK__ISREG_TEMP(comp_ctx, reg_src)) {
+ reg_res = reg_src;
+ } else {
+ reg_res = DUK__ALLOCTEMP(comp_ctx);
+ }
+ duk__emit_a_bc(comp_ctx,
+ args,
+ reg_res,
+ reg_src);
+ duk__ivalue_regconst(res, reg_res);
+ return;
+ }
+
+ preincdec:
+ {
+ /* preincrement and predecrement */
+ duk_regconst_t reg_res;
+ duk_small_uint_t args_op1 = args & 0xff; /* DUK_OP_PREINCR/DUK_OP_PREDECR */
+ duk_small_uint_t args_op2 = args >> 8; /* DUK_OP_PREINCP_RR/DUK_OP_PREDECP_RR */
+
+ /* Specific assumptions for opcode numbering. */
+ DUK_ASSERT(DUK_OP_PREINCR + 4 == DUK_OP_PREINCV);
+ DUK_ASSERT(DUK_OP_PREDECR + 4 == DUK_OP_PREDECV);
+
+ reg_res = DUK__ALLOCTEMP(comp_ctx);
+
+ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */
+ if (res->t == DUK_IVAL_VAR) {
+ duk_hstring *h_varname;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ h_varname = duk_known_hstring(thr, res->x1.valstack_idx);
+
+ if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {
+ goto syntax_error;
+ }
+
+ duk_dup(thr, res->x1.valstack_idx);
+ if (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ duk__emit_a_bc(comp_ctx,
+ args_op1, /* e.g. DUK_OP_PREINCR */
+ reg_res,
+ reg_varbind);
+ } else {
+ duk__emit_a_bc(comp_ctx,
+ args_op1 + 4, /* e.g. DUK_OP_PREINCV */
+ reg_res,
+ rc_varname);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("preincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld",
+ (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname));
+ } else if (res->t == DUK_IVAL_PROP) {
+ duk_regconst_t reg_obj; /* allocate to reg only (not const) */
+ duk_regconst_t rc_key;
+ reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */
+ rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+ duk__emit_a_b_c(comp_ctx,
+ args_op2 | DUK__EMIT_FLAG_BC_REGCONST, /* e.g. DUK_OP_PREINCP */
+ reg_res,
+ reg_obj,
+ rc_key);
+ } else {
+ /* Technically return value is not needed because INVLHS will
+ * unconditially throw a ReferenceError. Coercion is necessary
+ * for proper semantics (consider ToNumber() called for an object).
+ * Use DUK_OP_UNP with a dummy register to get ToNumber().
+ */
+
+ duk__ivalue_toforcedreg(comp_ctx, res, reg_res);
+ duk__emit_bc(comp_ctx,
+ DUK_OP_UNP,
+ reg_res); /* for side effects, result ignored */
+ duk__emit_op_only(comp_ctx,
+ DUK_OP_INVLHS);
+ }
+ DUK__SETTEMP(comp_ctx, reg_res + 1);
+ duk__ivalue_regconst(res, reg_res);
+ return;
+ }
+
+ plain_value:
+ {
+ /* Stack top contains plain value */
+ duk__ivalue_plain_fromstack(comp_ctx, res);
+ return;
+ }
+
+#if defined(DUK_USE_ES6)
+ syntax_error_newtarget:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_NEWTARGET);
+#endif
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION);
+}
+
+/* XXX: add flag to indicate whether caller cares about return value; this
+ * affects e.g. handling of assignment expressions. This change needs API
+ * changes elsewhere too.
+ */
+DUK_LOCAL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_token *tk;
+ duk_small_uint_t tok;
+ duk_uint32_t args; /* temp variable to pass constants and flags to shared code */
+
+ /*
+ * ctx->prev_token token to process with duk__expr_led()
+ * ctx->curr_token updated by caller
+ */
+
+ comp_ctx->curr_func.led_count++;
+
+ /* The token in the switch has already been eaten here */
+ tk = &comp_ctx->prev_token;
+ tok = tk->t;
+
+ DUK_DDD(DUK_DDDPRINT("duk__expr_led(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld",
+ (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level));
+
+ /* XXX: default priority for infix operators is duk__expr_lbp(tok) -> get it here? */
+
+ switch (tok) {
+
+ /* PRIMARY EXPRESSIONS */
+
+ case DUK_TOK_PERIOD: {
+ /* Property access expressions are critical for correct LHS ordering,
+ * see comments in duk__expr()!
+ *
+ * A conservative approach would be to use duk__ivalue_totempconst()
+ * for 'left'. However, allowing a reg-bound variable seems safe here
+ * and is nice because "foo.bar" is a common expression. If the ivalue
+ * is used in an expression a GETPROP will occur before any changes to
+ * the base value can occur. If the ivalue is used as an assignment
+ * LHS, the assignment code will ensure the base value is safe from
+ * RHS mutation.
+ */
+
+ /* XXX: This now coerces an identifier into a GETVAR to a temp, which
+ * causes an extra LDREG in call setup. It's sufficient to coerce to a
+ * unary ivalue?
+ */
+ duk__ivalue_toplain(comp_ctx, left);
+
+ /* NB: must accept reserved words as property name */
+ if (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER);
+ }
+
+ res->t = DUK_IVAL_PROP;
+ duk__copy_ispec(comp_ctx, &left->x1, &res->x1); /* left.x1 -> res.x1 */
+ DUK_ASSERT(comp_ctx->curr_token.str1 != NULL);
+ duk_push_hstring(thr, comp_ctx->curr_token.str1);
+ duk_replace(thr, res->x2.valstack_idx);
+ res->x2.t = DUK_ISPEC_VALUE;
+
+ /* special RegExp literal handling after IdentifierName */
+ comp_ctx->curr_func.reject_regexp_in_adv = 1;
+
+ duk__advance(comp_ctx);
+ return;
+ }
+ case DUK_TOK_LBRACKET: {
+ /* Property access expressions are critical for correct LHS ordering,
+ * see comments in duk__expr()!
+ */
+
+ /* XXX: optimize temp reg use */
+ /* XXX: similar coercion issue as in DUK_TOK_PERIOD */
+ /* XXX: coerce to regs? it might be better for enumeration use, where the
+ * same PROP ivalue is used multiple times. Or perhaps coerce PROP further
+ * there?
+ */
+ /* XXX: for simple cases like x['y'] an unnecessary LDREG is
+ * emitted for the base value; could avoid it if we knew that
+ * the key expression is safe (e.g. just a single literal).
+ */
+
+ /* The 'left' value must not be a register bound variable
+ * because it may be mutated during the rest of the expression
+ * and E5.1 Section 11.2.1 specifies the order of evaluation
+ * so that the base value is evaluated first.
+ * See: test-bug-nested-prop-mutate.js.
+ */
+ duk__ivalue_totempconst(comp_ctx, left);
+ duk__expr_toplain(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression, ']' terminates */
+ duk__advance_expect(comp_ctx, DUK_TOK_RBRACKET);
+
+ res->t = DUK_IVAL_PROP;
+ duk__copy_ispec(comp_ctx, &res->x1, &res->x2); /* res.x1 -> res.x2 */
+ duk__copy_ispec(comp_ctx, &left->x1, &res->x1); /* left.x1 -> res.x1 */
+ return;
+ }
+ case DUK_TOK_LPAREN: {
+ /* function call */
+ duk_regconst_t reg_cs = DUK__ALLOCTEMPS(comp_ctx, 2);
+ duk_int_t nargs;
+ duk_small_uint_t call_op = DUK_OP_CALL0;
+
+ /* XXX: attempt to get the call result to "next temp" whenever
+ * possible to avoid unnecessary register shuffles.
+ */
+
+ /*
+ * Setup call: target and 'this' binding. Three cases:
+ *
+ * 1. Identifier base (e.g. "foo()")
+ * 2. Property base (e.g. "foo.bar()")
+ * 3. Register base (e.g. "foo()()"; i.e. when a return value is a function)
+ */
+
+ if (left->t == DUK_IVAL_VAR) {
+ duk_hstring *h_varname;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ DUK_DDD(DUK_DDDPRINT("function call with identifier base"));
+
+ h_varname = duk_known_hstring(thr, left->x1.valstack_idx);
+ if (h_varname == DUK_HTHREAD_STRING_EVAL(thr)) {
+ /* Potential direct eval call detected, flag the CALL
+ * so that a run-time "direct eval" check is made and
+ * special behavior may be triggered. Note that this
+ * does not prevent 'eval' from being register bound.
+ */
+ DUK_DDD(DUK_DDDPRINT("function call with identifier 'eval' "
+ "-> using EVALCALL, marking function "
+ "as may_direct_eval"));
+ call_op |= DUK_BC_CALL_FLAG_CALLED_AS_EVAL;
+ comp_ctx->curr_func.may_direct_eval = 1;
+ }
+
+ duk_dup(thr, left->x1.valstack_idx);
+ if (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_varbind,
+ reg_cs + 0);
+ } else {
+ /* XXX: expand target register or constant field to
+ * reduce shuffling.
+ */
+ DUK_ASSERT(DUK__ISCONST(rc_varname));
+ duk__emit_a_b(comp_ctx,
+ DUK_OP_CSVAR | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_cs + 0,
+ rc_varname);
+ }
+ } else if (left->t == DUK_IVAL_PROP) {
+ /* Call through a property lookup, E5 Section 11.2.3, step 6.a.i,
+ * E5 Section 10.4.3. There used to be a separate CSPROP opcode
+ * but a typical call setup took 3 opcodes (e.g. LDREG, LDCONST,
+ * CSPROP) and the same can be achieved with ordinary loads.
+ */
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ duk_regconst_t reg_key;
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("function call with property base"));
+
+ /* XXX: For Math.sin() this generates: LDCONST + LDREG +
+ * GETPROPC + call. The LDREG is unnecessary because LDCONST
+ * could be loaded directly into reg_cs + 1. This doesn't
+ * happen now because a variable cannot be in left->x1 of a
+ * DUK_IVAL_PROP. We could notice that left->x1 is a temp
+ * and reuse, but it would still be in the wrong position
+ * (reg_cs + 0 rather than reg_cs + 1).
+ */
+ duk__ispec_toforcedreg(comp_ctx, &left->x1, reg_cs + 1); /* base */
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ reg_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_GETPROPC | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_cs + 0,
+ reg_cs + 1,
+ reg_key);
+#else
+ duk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0); /* base[key] */
+#endif
+ } else {
+ DUK_DDD(DUK_DDDPRINT("function call with register base"));
+
+ duk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0);
+#if 0
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_cs + 0,
+ reg_cs + 0); /* in-place setup */
+#endif
+ /* Because of in-place setup, REGCS is equivalent to
+ * just this LDUNDEF.
+ */
+ duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, reg_cs + 1);
+ }
+
+ DUK__SETTEMP(comp_ctx, reg_cs + 2);
+ nargs = duk__parse_arguments(comp_ctx, res); /* parse args starting from "next temp" */
+
+ /* Tailcalls are handled by back-patching the already emitted opcode
+ * later in return statement parser.
+ */
+
+ duk__emit_a_bc(comp_ctx,
+ call_op,
+ (duk_regconst_t) nargs /*numargs*/,
+ reg_cs /*basereg*/);
+ DUK__SETTEMP(comp_ctx, reg_cs + 1); /* result in csreg */
+
+ duk__ivalue_regconst(res, reg_cs);
+ return;
+ }
+
+ /* POSTFIX EXPRESSION */
+
+ case DUK_TOK_INCREMENT: {
+ args = (DUK_OP_POSTINCP_RR << 16) + (DUK_OP_POSTINCR << 8) + 0;
+ goto postincdec;
+ }
+ case DUK_TOK_DECREMENT: {
+ args = (DUK_OP_POSTDECP_RR << 16) + (DUK_OP_POSTDECR << 8) + 0;
+ goto postincdec;
+ }
+
+ /* EXPONENTIATION EXPRESSION */
+
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+ case DUK_TOK_EXP: {
+ args = (DUK_OP_EXP << 8) + DUK__BP_EXPONENTIATION - 1; /* UnaryExpression */
+ goto binary;
+ }
+#endif
+
+ /* MULTIPLICATIVE EXPRESSION */
+
+ case DUK_TOK_MUL: {
+ args = (DUK_OP_MUL << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */
+ goto binary;
+ }
+ case DUK_TOK_DIV: {
+ args = (DUK_OP_DIV << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */
+ goto binary;
+ }
+ case DUK_TOK_MOD: {
+ args = (DUK_OP_MOD << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */
+ goto binary;
+ }
+
+ /* ADDITIVE EXPRESSION */
+
+ case DUK_TOK_ADD: {
+ args = (DUK_OP_ADD << 8) + DUK__BP_ADDITIVE; /* MultiplicativeExpression */
+ goto binary;
+ }
+ case DUK_TOK_SUB: {
+ args = (DUK_OP_SUB << 8) + DUK__BP_ADDITIVE; /* MultiplicativeExpression */
+ goto binary;
+ }
+
+ /* SHIFT EXPRESSION */
+
+ case DUK_TOK_ALSHIFT: {
+ /* << */
+ args = (DUK_OP_BASL << 8) + DUK__BP_SHIFT;
+ goto binary;
+ }
+ case DUK_TOK_ARSHIFT: {
+ /* >> */
+ args = (DUK_OP_BASR << 8) + DUK__BP_SHIFT;
+ goto binary;
+ }
+ case DUK_TOK_RSHIFT: {
+ /* >>> */
+ args = (DUK_OP_BLSR << 8) + DUK__BP_SHIFT;
+ goto binary;
+ }
+
+ /* RELATIONAL EXPRESSION */
+
+ case DUK_TOK_LT: {
+ /* < */
+ args = (DUK_OP_LT << 8) + DUK__BP_RELATIONAL;
+ goto binary;
+ }
+ case DUK_TOK_GT: {
+ args = (DUK_OP_GT << 8) + DUK__BP_RELATIONAL;
+ goto binary;
+ }
+ case DUK_TOK_LE: {
+ args = (DUK_OP_LE << 8) + DUK__BP_RELATIONAL;
+ goto binary;
+ }
+ case DUK_TOK_GE: {
+ args = (DUK_OP_GE << 8) + DUK__BP_RELATIONAL;
+ goto binary;
+ }
+ case DUK_TOK_INSTANCEOF: {
+ args = (DUK_OP_INSTOF << 8) + DUK__BP_RELATIONAL;
+ goto binary;
+ }
+ case DUK_TOK_IN: {
+ args = (DUK_OP_IN << 8) + DUK__BP_RELATIONAL;
+ goto binary;
+ }
+
+ /* EQUALITY EXPRESSION */
+
+ case DUK_TOK_EQ: {
+ args = (DUK_OP_EQ << 8) + DUK__BP_EQUALITY;
+ goto binary;
+ }
+ case DUK_TOK_NEQ: {
+ args = (DUK_OP_NEQ << 8) + DUK__BP_EQUALITY;
+ goto binary;
+ }
+ case DUK_TOK_SEQ: {
+ args = (DUK_OP_SEQ << 8) + DUK__BP_EQUALITY;
+ goto binary;
+ }
+ case DUK_TOK_SNEQ: {
+ args = (DUK_OP_SNEQ << 8) + DUK__BP_EQUALITY;
+ goto binary;
+ }
+
+ /* BITWISE EXPRESSIONS */
+
+ case DUK_TOK_BAND: {
+ args = (DUK_OP_BAND << 8) + DUK__BP_BAND;
+ goto binary;
+ }
+ case DUK_TOK_BXOR: {
+ args = (DUK_OP_BXOR << 8) + DUK__BP_BXOR;
+ goto binary;
+ }
+ case DUK_TOK_BOR: {
+ args = (DUK_OP_BOR << 8) + DUK__BP_BOR;
+ goto binary;
+ }
+
+ /* LOGICAL EXPRESSIONS */
+
+ case DUK_TOK_LAND: {
+ /* syntactically left-associative but parsed as right-associative */
+ args = (1 << 8) + DUK__BP_LAND - 1;
+ goto binary_logical;
+ }
+ case DUK_TOK_LOR: {
+ /* syntactically left-associative but parsed as right-associative */
+ args = (0 << 8) + DUK__BP_LOR - 1;
+ goto binary_logical;
+ }
+
+ /* CONDITIONAL EXPRESSION */
+
+ case DUK_TOK_QUESTION: {
+ /* XXX: common reg allocation need is to reuse a sub-expression's temp reg,
+ * but only if it really is a temp. Nothing fancy here now.
+ */
+ duk_regconst_t reg_temp;
+ duk_int_t pc_jump1;
+ duk_int_t pc_jump2;
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__ivalue_toforcedreg(comp_ctx, left, reg_temp);
+ duk__emit_if_true_skip(comp_ctx, reg_temp);
+ pc_jump1 = duk__emit_jump_empty(comp_ctx); /* jump to false */
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); /* AssignmentExpression */
+ duk__advance_expect(comp_ctx, DUK_TOK_COLON);
+ pc_jump2 = duk__emit_jump_empty(comp_ctx); /* jump to end */
+ duk__patch_jump_here(comp_ctx, pc_jump1);
+ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); /* AssignmentExpression */
+ duk__patch_jump_here(comp_ctx, pc_jump2);
+
+ DUK__SETTEMP(comp_ctx, reg_temp + 1);
+ duk__ivalue_regconst(res, reg_temp);
+ return;
+ }
+
+ /* ASSIGNMENT EXPRESSION */
+
+ case DUK_TOK_EQUALSIGN: {
+ /*
+ * Assignments are right associative, allows e.g.
+ * a = 5;
+ * a += b = 9; // same as a += (b = 9)
+ * -> expression value 14, a = 14, b = 9
+ *
+ * Right associativiness is reflected in the BP for recursion,
+ * "-1" ensures assignment operations are allowed.
+ *
+ * XXX: just use DUK__BP_COMMA (i.e. no need for 2-step bp levels)?
+ */
+ args = (DUK_OP_NONE << 8) + DUK__BP_ASSIGNMENT - 1; /* DUK_OP_NONE marks a 'plain' assignment */
+ goto assign;
+ }
+ case DUK_TOK_ADD_EQ: {
+ /* right associative */
+ args = (DUK_OP_ADD << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_SUB_EQ: {
+ /* right associative */
+ args = (DUK_OP_SUB << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_MUL_EQ: {
+ /* right associative */
+ args = (DUK_OP_MUL << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_DIV_EQ: {
+ /* right associative */
+ args = (DUK_OP_DIV << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_MOD_EQ: {
+ /* right associative */
+ args = (DUK_OP_MOD << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+ case DUK_TOK_EXP_EQ: {
+ /* right associative */
+ args = (DUK_OP_EXP << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+#endif
+ case DUK_TOK_ALSHIFT_EQ: {
+ /* right associative */
+ args = (DUK_OP_BASL << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_ARSHIFT_EQ: {
+ /* right associative */
+ args = (DUK_OP_BASR << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_RSHIFT_EQ: {
+ /* right associative */
+ args = (DUK_OP_BLSR << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_BAND_EQ: {
+ /* right associative */
+ args = (DUK_OP_BAND << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_BOR_EQ: {
+ /* right associative */
+ args = (DUK_OP_BOR << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+ case DUK_TOK_BXOR_EQ: {
+ /* right associative */
+ args = (DUK_OP_BXOR << 8) + DUK__BP_ASSIGNMENT - 1;
+ goto assign;
+ }
+
+ /* COMMA */
+
+ case DUK_TOK_COMMA: {
+ /* right associative */
+
+ duk__ivalue_toplain_ignore(comp_ctx, left); /* need side effects, not value */
+ duk__expr_toplain(comp_ctx, res, DUK__BP_COMMA - 1 /*rbp_flags*/);
+
+ /* return 'res' (of right part) as our result */
+ return;
+ }
+
+ default: {
+ break;
+ }
+ }
+
+ DUK_D(DUK_DPRINT("parse error: unexpected token: %ld", (long) tok));
+ DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR);
+ return;
+
+#if 0
+ /* XXX: shared handling for 'duk__expr_lhs'? */
+ if (comp_ctx->curr_func.paren_level == 0 && XXX) {
+ comp_ctx->curr_func.duk__expr_lhs = 0;
+ }
+#endif
+
+ binary:
+ /*
+ * Shared handling of binary operations
+ *
+ * args = (opcode << 8) + rbp
+ */
+ {
+ duk__ivalue_toplain(comp_ctx, left);
+ duk__expr_toplain(comp_ctx, res, args & 0xff /*rbp_flags*/);
+
+ /* combine left->x1 and res->x1 (right->x1, really) -> (left->x1 OP res->x1) */
+ DUK_ASSERT(left->t == DUK_IVAL_PLAIN);
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN);
+
+ res->t = DUK_IVAL_ARITH;
+ res->op = (args >> 8) & 0xff;
+
+ res->x2.t = res->x1.t;
+ res->x2.regconst = res->x1.regconst;
+ duk_copy(thr, res->x1.valstack_idx, res->x2.valstack_idx);
+
+ res->x1.t = left->x1.t;
+ res->x1.regconst = left->x1.regconst;
+ duk_copy(thr, left->x1.valstack_idx, res->x1.valstack_idx);
+
+ DUK_DDD(DUK_DDDPRINT("binary op, res: t=%ld, x1.t=%ld, x1.regconst=0x%08lx, x2.t=%ld, x2.regconst=0x%08lx",
+ (long) res->t, (long) res->x1.t, (unsigned long) res->x1.regconst, (long) res->x2.t, (unsigned long) res->x2.regconst));
+ return;
+ }
+
+ binary_logical:
+ /*
+ * Shared handling for logical AND and logical OR.
+ *
+ * args = (truthval << 8) + rbp
+ *
+ * Truthval determines when to skip right-hand-side.
+ * For logical AND truthval=1, for logical OR truthval=0.
+ *
+ * See doc/compiler.rst for discussion on compiling logical
+ * AND and OR expressions. The approach here is very simplistic,
+ * generating extra jumps and multiple evaluations of truth values,
+ * but generates code on-the-fly with only local back-patching.
+ *
+ * Both logical AND and OR are syntactically left-associated.
+ * However, logical ANDs are compiled as right associative
+ * expressions, i.e. "A && B && C" as "A && (B && C)", to allow
+ * skip jumps to skip over the entire tail. Similarly for logical OR.
+ */
+
+ {
+ duk_regconst_t reg_temp;
+ duk_int_t pc_jump;
+ duk_small_uint_t args_truthval = args >> 8;
+ duk_small_uint_t args_rbp = args & 0xff;
+
+ /* XXX: unoptimal use of temps, resetting */
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+
+ duk__ivalue_toforcedreg(comp_ctx, left, reg_temp);
+ DUK_ASSERT(DUK__ISREG(reg_temp));
+ duk__emit_bc(comp_ctx,
+ (args_truthval ? DUK_OP_IFTRUE_R : DUK_OP_IFFALSE_R),
+ reg_temp); /* skip jump conditionally */
+ pc_jump = duk__emit_jump_empty(comp_ctx);
+ duk__expr_toforcedreg(comp_ctx, res, args_rbp /*rbp_flags*/, reg_temp /*forced_reg*/);
+ duk__patch_jump_here(comp_ctx, pc_jump);
+
+ duk__ivalue_regconst(res, reg_temp);
+ return;
+ }
+
+ assign:
+ /*
+ * Shared assignment expression handling
+ *
+ * args = (opcode << 8) + rbp
+ *
+ * If 'opcode' is DUK_OP_NONE, plain assignment without arithmetic.
+ * Syntactically valid left-hand-side forms which are not accepted as
+ * left-hand-side values (e.g. as in "f() = 1") must NOT cause a
+ * SyntaxError, but rather a run-time ReferenceError.
+ *
+ * When evaluating X <op>= Y, the LHS (X) is conceptually evaluated
+ * to a temporary first. The RHS is then evaluated. Finally, the
+ * <op> is applied to the initial value of RHS (not the value after
+ * RHS evaluation), and written to X. Doing so concretely generates
+ * inefficient code so we'd like to avoid the temporary when possible.
+ * See: https://github.com/svaarala/duktape/pull/992.
+ *
+ * The expression value (final LHS value, written to RHS) is
+ * conceptually copied into a fresh temporary so that it won't
+ * change even if the LHS/RHS values change in outer expressions.
+ * For example, it'd be generally incorrect for the expression value
+ * to be the RHS register binding, unless there's a guarantee that it
+ * won't change during further expression evaluation. Using the
+ * temporary concretely produces inefficient bytecode, so we try to
+ * avoid the extra temporary for some known-to-be-safe cases.
+ * Currently the only safe case we detect is a "top level assignment",
+ * for example "x = y + z;", where the assignment expression value is
+ * ignored.
+ * See: test-dev-assign-expr.js and test-bug-assign-mutate-gh381.js.
+ */
+
+ {
+ duk_small_uint_t args_op = args >> 8;
+ duk_small_uint_t args_rbp = args & 0xff;
+ duk_bool_t toplevel_assign;
+
+ /* XXX: here we need to know if 'left' is left-hand-side compatible.
+ * That information is no longer available from current expr parsing
+ * state; it would need to be carried into the 'left' ivalue or by
+ * some other means.
+ */
+
+ /* A top-level assignment is e.g. "x = y;". For these it's safe
+ * to use the RHS as-is as the expression value, even if the RHS
+ * is a reg-bound identifier. The RHS ('res') is right associative
+ * so it has consumed all other assignment level operations; the
+ * only relevant lower binding power construct is comma operator
+ * which will ignore the expression value provided here. Usually
+ * the top level assignment expression value is ignored, but it
+ * is relevant for e.g. eval code.
+ */
+ toplevel_assign = (comp_ctx->curr_func.nud_count == 1 && /* one token before */
+ comp_ctx->curr_func.led_count == 1); /* one operator (= assign) */
+ DUK_DDD(DUK_DDDPRINT("assignment: nud_count=%ld, led_count=%ld, toplevel_assign=%ld",
+ (long) comp_ctx->curr_func.nud_count,
+ (long) comp_ctx->curr_func.led_count,
+ (long) toplevel_assign));
+
+ if (left->t == DUK_IVAL_VAR) {
+ duk_hstring *h_varname;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ DUK_ASSERT(left->x1.t == DUK_ISPEC_VALUE); /* LHS is already side effect free */
+
+ h_varname = duk_known_hstring(thr, left->x1.valstack_idx);
+ if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {
+ /* E5 Section 11.13.1 (and others for other assignments), step 4. */
+ goto syntax_error_lvalue;
+ }
+ duk_dup(thr, left->x1.valstack_idx);
+ (void) duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname);
+
+ if (args_op == DUK_OP_NONE) {
+ duk__expr(comp_ctx, res, args_rbp /*rbp_flags*/);
+ if (toplevel_assign) {
+ /* Any 'res' will do. */
+ DUK_DDD(DUK_DDDPRINT("plain assignment, toplevel assign, use as is"));
+ } else {
+ /* 'res' must be a plain ivalue, and not register-bound variable. */
+ DUK_DDD(DUK_DDDPRINT("plain assignment, not toplevel assign, ensure not a reg-bound identifier"));
+ if (res->t != DUK_IVAL_PLAIN || (res->x1.t == DUK_ISPEC_REGCONST &&
+ DUK__ISREG_NOTTEMP(comp_ctx, res->x1.regconst))) {
+ duk__ivalue_totempconst(comp_ctx, res);
+ }
+ }
+ } else {
+ /* For X <op>= Y we need to evaluate the pre-op
+ * value of X before evaluating the RHS: the RHS
+ * can change X, but when we do <op> we must use
+ * the pre-op value.
+ */
+ duk_regconst_t reg_temp;
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+
+ if (reg_varbind >= 0) {
+ duk_regconst_t reg_res;
+ duk_regconst_t reg_src;
+ duk_int_t pc_temp_load;
+ duk_int_t pc_before_rhs;
+ duk_int_t pc_after_rhs;
+
+ if (toplevel_assign) {
+ /* 'reg_varbind' is the operation result and can also
+ * become the expression value for top level assignments
+ * such as: "var x; x += y;".
+ */
+ DUK_DD(DUK_DDPRINT("<op>= expression is top level, write directly to reg_varbind"));
+ reg_res = reg_varbind;
+ } else {
+ /* Not safe to use 'reg_varbind' as assignment expression
+ * value, so go through a temp.
+ */
+ DUK_DD(DUK_DDPRINT("<op>= expression is not top level, write to reg_temp"));
+ reg_res = reg_temp; /* reg_res should be smallest possible */
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ }
+
+ /* Try to optimize X <op>= Y for reg-bound
+ * variables. Detect side-effect free RHS
+ * narrowly by seeing whether it emits code.
+ * If not, rewind the code emitter and overwrite
+ * the unnecessary temp reg load.
+ */
+
+ pc_temp_load = duk__get_current_pc(comp_ctx);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_LDREG,
+ reg_temp,
+ reg_varbind);
+
+ pc_before_rhs = duk__get_current_pc(comp_ctx);
+ duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);
+ pc_after_rhs = duk__get_current_pc(comp_ctx);
+
+ DUK_DD(DUK_DDPRINT("pc_temp_load=%ld, pc_before_rhs=%ld, pc_after_rhs=%ld",
+ (long) pc_temp_load, (long) pc_before_rhs,
+ (long) pc_after_rhs));
+
+ if (pc_after_rhs == pc_before_rhs) {
+ /* Note: if the reg_temp load generated shuffling
+ * instructions, we may need to rewind more than
+ * one instruction, so use explicit PC computation.
+ */
+ DUK_DD(DUK_DDPRINT("rhs is side effect free, rewind and avoid unnecessary temp for reg-based <op>="));
+ DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, (duk_size_t) (pc_temp_load - pc_before_rhs) * sizeof(duk_compiler_instr));
+ reg_src = reg_varbind;
+ } else {
+ DUK_DD(DUK_DDPRINT("rhs evaluation emitted code, not sure if rhs is side effect free; use temp reg for LHS"));
+ reg_src = reg_temp;
+ }
+
+ duk__emit_a_b_c(comp_ctx,
+ args_op | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_res,
+ reg_src,
+ res->x1.regconst);
+
+ res->x1.regconst = reg_res;
+
+ /* Ensure compact use of temps. */
+ if (DUK__ISREG_TEMP(comp_ctx, reg_res)) {
+ DUK__SETTEMP(comp_ctx, reg_res + 1);
+ }
+ } else {
+ /* When LHS is not register bound, always go through a
+ * temporary. No optimization for top level assignment.
+ */
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_GETVAR,
+ reg_temp,
+ rc_varname);
+
+ duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);
+
+ duk__emit_a_b_c(comp_ctx,
+ args_op | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_temp,
+ reg_temp,
+ res->x1.regconst);
+ res->x1.regconst = reg_temp;
+ }
+
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);
+ }
+
+ /* At this point 'res' holds the potential expression value.
+ * It can be basically any ivalue here, including a reg-bound
+ * identifier (if code above deems it safe) or a unary/binary
+ * operation. Operations must be resolved to a side effect free
+ * plain value, and the side effects must happen exactly once.
+ */
+
+ if (reg_varbind >= 0) {
+ if (res->t != DUK_IVAL_PLAIN) {
+ /* Resolve 'res' directly into the LHS binding, and use
+ * that as the expression value if safe. If not safe,
+ * resolve to a temp/const and copy to LHS.
+ */
+ if (toplevel_assign) {
+ duk__ivalue_toforcedreg(comp_ctx, res, (duk_int_t) reg_varbind);
+ } else {
+ duk__ivalue_totempconst(comp_ctx, res);
+ duk__copy_ivalue(comp_ctx, res, left); /* use 'left' as a temp */
+ duk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind);
+ }
+ } else {
+ /* Use 'res' as the expression value (it's side effect
+ * free and may be a plain value, a register, or a
+ * constant) and write it to the LHS binding too.
+ */
+ duk__copy_ivalue(comp_ctx, res, left); /* use 'left' as a temp */
+ duk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind);
+ }
+ } else {
+ /* Only a reg fits into 'A' so coerce 'res' into a register
+ * for PUTVAR.
+ *
+ * XXX: here the current A/B/C split is suboptimal: we could
+ * just use 9 bits for reg_res (and support constants) and 17
+ * instead of 18 bits for the varname const index.
+ */
+
+ duk__ivalue_toreg(comp_ctx, res);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,
+ res->x1.regconst,
+ rc_varname);
+ }
+
+ /* 'res' contains expression value */
+ } else if (left->t == DUK_IVAL_PROP) {
+ /* E5 Section 11.13.1 (and others) step 4 never matches for prop writes -> no check */
+ duk_regconst_t reg_obj;
+ duk_regconst_t rc_key;
+ duk_regconst_t rc_res;
+ duk_regconst_t reg_temp;
+
+ /* Property access expressions ('a[b]') are critical to correct
+ * LHS evaluation ordering, see test-dev-assign-eval-order*.js.
+ * We must make sure that the LHS target slot (base object and
+ * key) don't change during RHS evaluation. The only concrete
+ * problem is a register reference to a variable-bound register
+ * (i.e., non-temp). Require temp regs for both key and base.
+ *
+ * Don't allow a constant for the object (even for a number
+ * etc), as it goes into the 'A' field of the opcode.
+ */
+
+ reg_obj = duk__ispec_toregconst_raw(comp_ctx,
+ &left->x1,
+ -1 /*forced_reg*/,
+ DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/);
+
+ rc_key = duk__ispec_toregconst_raw(comp_ctx,
+ &left->x2,
+ -1 /*forced_reg*/,
+ DUK__IVAL_FLAG_REQUIRE_TEMP | DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+
+ /* Evaluate RHS only when LHS is safe. */
+
+ if (args_op == DUK_OP_NONE) {
+ duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);
+ rc_res = res->x1.regconst;
+ } else {
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_temp,
+ reg_obj,
+ rc_key);
+
+ duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);
+
+ duk__emit_a_b_c(comp_ctx,
+ args_op | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_temp,
+ reg_temp,
+ res->x1.regconst);
+ rc_res = reg_temp;
+ }
+
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_obj,
+ rc_key,
+ rc_res);
+
+ duk__ivalue_regconst(res, rc_res);
+ } else {
+ /* No support for lvalues returned from new or function call expressions.
+ * However, these must NOT cause compile-time SyntaxErrors, but run-time
+ * ReferenceErrors. Both left and right sides of the assignment must be
+ * evaluated before throwing a ReferenceError. For instance:
+ *
+ * f() = g();
+ *
+ * must result in f() being evaluated, then g() being evaluated, and
+ * finally, a ReferenceError being thrown. See E5 Section 11.13.1.
+ */
+
+ duk_regconst_t rc_res;
+
+ /* First evaluate LHS fully to ensure all side effects are out. */
+ duk__ivalue_toplain_ignore(comp_ctx, left);
+
+ /* Then evaluate RHS fully (its value becomes the expression value too).
+ * Technically we'd need the side effect safety check here too, but because
+ * we always throw using INVLHS the result doesn't matter.
+ */
+ rc_res = duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);
+
+ duk__emit_op_only(comp_ctx, DUK_OP_INVLHS);
+
+ duk__ivalue_regconst(res, rc_res);
+ }
+
+ return;
+ }
+
+ postincdec:
+ {
+ /*
+ * Post-increment/decrement will return the original value as its
+ * result value. However, even that value will be coerced using
+ * ToNumber() which is quite awkward. Specific bytecode opcodes
+ * are used to handle these semantics.
+ *
+ * Note that post increment/decrement has a "no LineTerminator here"
+ * restriction. This is handled by duk__expr_lbp(), which forcibly terminates
+ * the previous expression if a LineTerminator occurs before '++'/'--'.
+ */
+
+ duk_regconst_t reg_res;
+ duk_small_uint_t args_op1 = (args >> 8) & 0xff; /* DUK_OP_POSTINCR/DUK_OP_POSTDECR */
+ duk_small_uint_t args_op2 = args >> 16; /* DUK_OP_POSTINCP_RR/DUK_OP_POSTDECP_RR */
+
+ /* Specific assumptions for opcode numbering. */
+ DUK_ASSERT(DUK_OP_POSTINCR + 4 == DUK_OP_POSTINCV);
+ DUK_ASSERT(DUK_OP_POSTDECR + 4 == DUK_OP_POSTDECV);
+
+ reg_res = DUK__ALLOCTEMP(comp_ctx);
+
+ if (left->t == DUK_IVAL_VAR) {
+ duk_hstring *h_varname;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ h_varname = duk_known_hstring(thr, left->x1.valstack_idx);
+
+ if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {
+ goto syntax_error;
+ }
+
+ duk_dup(thr, left->x1.valstack_idx);
+ if (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ duk__emit_a_bc(comp_ctx,
+ args_op1, /* e.g. DUK_OP_POSTINCR */
+ reg_res,
+ reg_varbind);
+ } else {
+ duk__emit_a_bc(comp_ctx,
+ args_op1 + 4, /* e.g. DUK_OP_POSTINCV */
+ reg_res,
+ rc_varname);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("postincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld",
+ (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname));
+ } else if (left->t == DUK_IVAL_PROP) {
+ duk_regconst_t reg_obj; /* allocate to reg only (not const) */
+ duk_regconst_t rc_key;
+
+ reg_obj = duk__ispec_toregconst_raw(comp_ctx, &left->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */
+ rc_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+ duk__emit_a_b_c(comp_ctx,
+ args_op2 | DUK__EMIT_FLAG_BC_REGCONST, /* e.g. DUK_OP_POSTINCP */
+ reg_res,
+ reg_obj,
+ rc_key);
+ } else {
+ /* Technically return value is not needed because INVLHS will
+ * unconditially throw a ReferenceError. Coercion is necessary
+ * for proper semantics (consider ToNumber() called for an object).
+ * Use DUK_OP_UNP with a dummy register to get ToNumber().
+ */
+ duk__ivalue_toforcedreg(comp_ctx, left, reg_res);
+ duk__emit_bc(comp_ctx,
+ DUK_OP_UNP,
+ reg_res); /* for side effects, result ignored */
+ duk__emit_op_only(comp_ctx,
+ DUK_OP_INVLHS);
+ }
+
+ DUK__SETTEMP(comp_ctx, reg_res + 1);
+ duk__ivalue_regconst(res, reg_res);
+ return;
+ }
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION);
+ return;
+
+ syntax_error_lvalue:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LVALUE);
+ return;
+}
+
+DUK_LOCAL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx) {
+ duk_small_uint_t tok = comp_ctx->curr_token.t;
+
+ DUK_ASSERT_DISABLE(tok >= DUK_TOK_MINVAL); /* unsigned */
+ DUK_ASSERT(tok <= DUK_TOK_MAXVAL);
+ DUK_ASSERT(sizeof(duk__token_lbp) == DUK_TOK_MAXVAL + 1);
+
+ /* XXX: integrate support for this into led() instead?
+ * Similar issue as post-increment/post-decrement.
+ */
+
+ /* prevent duk__expr_led() by using a binding power less than anything valid */
+ if (tok == DUK_TOK_IN && !comp_ctx->curr_func.allow_in) {
+ return 0;
+ }
+
+ if ((tok == DUK_TOK_DECREMENT || tok == DUK_TOK_INCREMENT) &&
+ (comp_ctx->curr_token.lineterm)) {
+ /* '++' or '--' in a post-increment/decrement position,
+ * and a LineTerminator occurs between the operator and
+ * the preceding expression. Force the previous expr
+ * to terminate, in effect treating e.g. "a,b\n++" as
+ * "a,b;++" (= SyntaxError).
+ */
+ return 0;
+ }
+
+ return DUK__TOKEN_LBP_GET_BP(duk__token_lbp[tok]); /* format is bit packed */
+}
+
+/*
+ * Expression parsing.
+ *
+ * Upon entry to 'expr' and its variants, 'curr_tok' is assumed to be the
+ * first token of the expression. Upon exit, 'curr_tok' will be the first
+ * token not part of the expression (e.g. semicolon terminating an expression
+ * statement).
+ */
+
+#define DUK__EXPR_RBP_MASK 0xff
+#define DUK__EXPR_FLAG_REJECT_IN (1 << 8) /* reject 'in' token (used for for-in) */
+#define DUK__EXPR_FLAG_ALLOW_EMPTY (1 << 9) /* allow empty expression */
+#define DUK__EXPR_FLAG_REQUIRE_INIT (1 << 10) /* require initializer for var/const */
+
+/* main expression parser function */
+DUK_LOCAL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_ivalue tmp_alloc; /* 'res' is used for "left", and 'tmp' for "right" */
+ duk_ivalue *tmp = &tmp_alloc;
+ duk_small_uint_t rbp;
+
+ DUK__RECURSION_INCREASE(comp_ctx, thr);
+
+ duk_require_stack(thr, DUK__PARSE_EXPR_SLOTS);
+
+ /* filter out flags from exprtop rbp_flags here to save space */
+ rbp = rbp_flags & DUK__EXPR_RBP_MASK;
+
+ DUK_DDD(DUK_DDDPRINT("duk__expr(), rbp_flags=%ld, rbp=%ld, allow_in=%ld, paren_level=%ld",
+ (long) rbp_flags, (long) rbp, (long) comp_ctx->curr_func.allow_in,
+ (long) comp_ctx->curr_func.paren_level));
+
+ DUK_MEMZERO(&tmp_alloc, sizeof(tmp_alloc));
+ tmp->x1.valstack_idx = duk_get_top(thr);
+ tmp->x2.valstack_idx = tmp->x1.valstack_idx + 1;
+ duk_push_undefined(thr);
+ duk_push_undefined(thr);
+
+ /* XXX: where to release temp regs in intermediate expressions?
+ * e.g. 1+2+3 -> don't inflate temp register count when parsing this.
+ * that particular expression temp regs can be forced here.
+ */
+
+ /* XXX: increase ctx->expr_tokens here for every consumed token
+ * (this would be a nice statistic)?
+ */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || comp_ctx->curr_token.t == DUK_TOK_RPAREN) {
+ /* XXX: possibly incorrect handling of empty expression */
+ DUK_DDD(DUK_DDDPRINT("empty expression"));
+ if (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY)) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED);
+ }
+ duk_push_undefined(thr);
+ duk__ivalue_plain_fromstack(comp_ctx, res);
+ goto cleanup;
+ }
+
+ duk__advance(comp_ctx);
+ duk__expr_nud(comp_ctx, res); /* reuse 'res' as 'left' */
+ while (rbp < duk__expr_lbp(comp_ctx)) {
+ duk__advance(comp_ctx);
+ duk__expr_led(comp_ctx, res, tmp);
+ duk__copy_ivalue(comp_ctx, tmp, res); /* tmp -> res */
+ }
+
+ cleanup:
+ /* final result is already in 'res' */
+
+ duk_pop_2(thr);
+
+ DUK__RECURSION_DECREASE(comp_ctx, thr);
+}
+
+DUK_LOCAL void duk__exprtop(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk_hthread *thr = comp_ctx->thr;
+
+ /* Note: these variables must reside in 'curr_func' instead of the global
+ * context: when parsing function expressions, expression parsing is nested.
+ */
+ comp_ctx->curr_func.nud_count = 0;
+ comp_ctx->curr_func.led_count = 0;
+ comp_ctx->curr_func.paren_level = 0;
+ comp_ctx->curr_func.expr_lhs = 1;
+ comp_ctx->curr_func.allow_in = (rbp_flags & DUK__EXPR_FLAG_REJECT_IN ? 0 : 1);
+
+ duk__expr(comp_ctx, res, rbp_flags);
+
+ if (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY) && duk__expr_is_empty(comp_ctx)) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED);
+ }
+}
+
+/* A bunch of helpers (for size optimization) that combine duk__expr()/duk__exprtop()
+ * and result conversions.
+ *
+ * Each helper needs at least 2-3 calls to make it worth while to wrap.
+ */
+
+#if 0 /* unused */
+DUK_LOCAL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__expr(comp_ctx, res, rbp_flags);
+ return duk__ivalue_toreg(comp_ctx, res);
+}
+#endif
+
+#if 0 /* unused */
+DUK_LOCAL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__expr(comp_ctx, res, rbp_flags);
+ return duk__ivalue_totemp(comp_ctx, res);
+}
+#endif
+
+DUK_LOCAL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) {
+ DUK_ASSERT(forced_reg >= 0);
+ duk__expr(comp_ctx, res, rbp_flags);
+ duk__ivalue_toforcedreg(comp_ctx, res, forced_reg);
+}
+
+DUK_LOCAL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__expr(comp_ctx, res, rbp_flags);
+ return duk__ivalue_toregconst(comp_ctx, res);
+}
+
+#if 0 /* unused */
+DUK_LOCAL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__expr(comp_ctx, res, rbp_flags);
+ return duk__ivalue_totempconst(comp_ctx, res);
+}
+#endif
+
+DUK_LOCAL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__expr(comp_ctx, res, rbp_flags);
+ duk__ivalue_toplain(comp_ctx, res);
+}
+
+DUK_LOCAL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__expr(comp_ctx, res, rbp_flags);
+ duk__ivalue_toplain_ignore(comp_ctx, res);
+}
+
+DUK_LOCAL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__exprtop(comp_ctx, res, rbp_flags);
+ return duk__ivalue_toreg(comp_ctx, res);
+}
+
+#if 0 /* unused */
+DUK_LOCAL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__exprtop(comp_ctx, res, rbp_flags);
+ return duk__ivalue_totemp(comp_ctx, res);
+}
+#endif
+
+DUK_LOCAL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) {
+ DUK_ASSERT(forced_reg >= 0);
+ duk__exprtop(comp_ctx, res, rbp_flags);
+ duk__ivalue_toforcedreg(comp_ctx, res, forced_reg);
+}
+
+DUK_LOCAL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {
+ duk__exprtop(comp_ctx, res, rbp_flags);
+ return duk__ivalue_toregconst(comp_ctx, res);
+}
+
+#if 0 /* unused */
+DUK_LOCAL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, int rbp_flags) {
+ duk__exprtop(comp_ctx, res, rbp_flags);
+ duk__ivalue_toplain_ignore(comp_ctx, res);
+}
+#endif
+
+/*
+ * Parse an individual source element (top level statement) or a statement.
+ *
+ * Handles labeled statements automatically (peeling away labels before
+ * parsing an expression that follows the label(s)).
+ *
+ * Upon entry, 'curr_tok' contains the first token of the statement (parsed
+ * in "allow regexp literal" mode). Upon exit, 'curr_tok' contains the first
+ * token following the statement (if the statement has a terminator, this is
+ * the token after the terminator).
+ */
+
+#define DUK__HAS_VAL (1 << 0) /* stmt has non-empty value */
+#define DUK__HAS_TERM (1 << 1) /* stmt has explicit/implicit semicolon terminator */
+#define DUK__ALLOW_AUTO_SEMI_ALWAYS (1 << 2) /* allow automatic semicolon even without lineterm (compatibility) */
+#define DUK__STILL_PROLOGUE (1 << 3) /* statement does not terminate directive prologue */
+#define DUK__IS_TERMINAL (1 << 4) /* statement is guaranteed to be terminal (control doesn't flow to next statement) */
+
+/* Parse a single variable declaration (e.g. "i" or "i=10"). A leading 'var'
+ * has already been eaten. These is no return value in 'res', it is used only
+ * as a temporary.
+ *
+ * When called from 'for-in' statement parser, the initializer expression must
+ * not allow the 'in' token. The caller supply additional expression parsing
+ * flags (like DUK__EXPR_FLAG_REJECT_IN) in 'expr_flags'.
+ *
+ * Finally, out_rc_varname and out_reg_varbind are updated to reflect where
+ * the identifier is bound:
+ *
+ * If register bound: out_reg_varbind >= 0, out_rc_varname == 0 (ignore)
+ * If not register bound: out_reg_varbind < 0, out_rc_varname >= 0
+ *
+ * These allow the caller to use the variable for further assignment, e.g.
+ * as is done in 'for-in' parsing.
+ */
+
+DUK_LOCAL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_hstring *h_varname;
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ /* assume 'var' has been eaten */
+
+ /* Note: Identifier rejects reserved words */
+ if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) {
+ goto syntax_error;
+ }
+ h_varname = comp_ctx->curr_token.str1;
+
+ DUK_ASSERT(h_varname != NULL);
+
+ /* strict mode restrictions (E5 Section 12.2.1) */
+ if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {
+ goto syntax_error;
+ }
+
+ /* register declarations in first pass */
+ if (comp_ctx->curr_func.in_scanning) {
+ duk_uarridx_t n;
+ DUK_DDD(DUK_DDDPRINT("register variable declaration %!O in pass 1",
+ (duk_heaphdr *) h_varname));
+ n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx);
+ duk_push_hstring(thr, h_varname);
+ duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n);
+ duk_push_int(thr, DUK_DECL_TYPE_VAR + (0 << 8));
+ duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1);
+ }
+
+ duk_push_hstring(thr, h_varname); /* push before advancing to keep reachable */
+
+ /* register binding lookup is based on varmap (even in first pass) */
+ duk_dup_top(thr);
+ (void) duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname);
+
+ duk__advance(comp_ctx); /* eat identifier */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_EQUALSIGN) {
+ duk__advance(comp_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("vardecl, assign to '%!O' -> reg_varbind=%ld, rc_varname=%ld",
+ (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname));
+
+ duk__exprtop(comp_ctx, res, DUK__BP_COMMA | expr_flags /*rbp_flags*/); /* AssignmentExpression */
+
+ if (reg_varbind >= 0) {
+ duk__ivalue_toforcedreg(comp_ctx, res, reg_varbind);
+ } else {
+ duk_regconst_t reg_val;
+ reg_val = duk__ivalue_toreg(comp_ctx, res);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_val,
+ rc_varname);
+ }
+ } else {
+ if (expr_flags & DUK__EXPR_FLAG_REQUIRE_INIT) {
+ /* Used for minimal 'const': initializer required. */
+ goto syntax_error;
+ }
+ }
+
+ duk_pop(thr); /* pop varname */
+
+ *out_rc_varname = rc_varname;
+ *out_reg_varbind = reg_varbind;
+
+ return;
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_VAR_DECLARATION);
+}
+
+DUK_LOCAL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags) {
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ duk__advance(comp_ctx); /* eat 'var' */
+
+ for (;;) {
+ /* rc_varname and reg_varbind are ignored here */
+ duk__parse_var_decl(comp_ctx, res, 0 | expr_flags, &reg_varbind, &rc_varname);
+
+ if (comp_ctx->curr_token.t != DUK_TOK_COMMA) {
+ break;
+ }
+ duk__advance(comp_ctx);
+ }
+}
+
+DUK_LOCAL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_int_t pc_v34_lhs; /* start variant 3/4 left-hand-side code (L1 in doc/compiler.rst example) */
+ duk_regconst_t temp_reset; /* knock back "next temp" to this whenever possible */
+ duk_regconst_t reg_temps; /* preallocated temporaries (2) for variants 3 and 4 */
+
+ DUK_DDD(DUK_DDDPRINT("start parsing a for/for-in statement"));
+
+ /* Two temporaries are preallocated here for variants 3 and 4 which need
+ * registers which are never clobbered by expressions in the loop
+ * (concretely: for the enumerator object and the next enumerated value).
+ * Variants 1 and 2 "release" these temps.
+ */
+
+ reg_temps = DUK__ALLOCTEMPS(comp_ctx, 2);
+
+ temp_reset = DUK__GETTEMP(comp_ctx);
+
+ /*
+ * For/for-in main variants are:
+ *
+ * 1. for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement
+ * 2. for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement
+ * 3. for (LeftHandSideExpression in Expression) Statement
+ * 4. for (var VariableDeclarationNoIn in Expression) Statement
+ *
+ * Parsing these without arbitrary lookahead or backtracking is relatively
+ * tricky but we manage to do so for now.
+ *
+ * See doc/compiler.rst for a detailed discussion of control flow
+ * issues, evaluation order issues, etc.
+ */
+
+ duk__advance(comp_ctx); /* eat 'for' */
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+
+ DUK_DDD(DUK_DDDPRINT("detecting for/for-in loop variant, pc=%ld", (long) duk__get_current_pc(comp_ctx)));
+
+ /* a label site has been emitted by duk__parse_stmt() automatically
+ * (it will also emit the ENDLABEL).
+ */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_VAR) {
+ /*
+ * Variant 2 or 4
+ */
+
+ duk_regconst_t reg_varbind; /* variable binding register if register-bound (otherwise < 0) */
+ duk_regconst_t rc_varname; /* variable name reg/const, if variable not register-bound */
+
+ duk__advance(comp_ctx); /* eat 'var' */
+ duk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, &reg_varbind, &rc_varname);
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ if (comp_ctx->curr_token.t == DUK_TOK_IN) {
+ /*
+ * Variant 4
+ */
+
+ DUK_DDD(DUK_DDDPRINT("detected for variant 4: for (var VariableDeclarationNoIn in Expression) Statement"));
+ pc_v34_lhs = duk__get_current_pc(comp_ctx); /* jump is inserted here */
+ if (reg_varbind >= 0) {
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_LDREG,
+ reg_varbind,
+ reg_temps + 0);
+ } else {
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_temps + 0,
+ rc_varname);
+ }
+ goto parse_3_or_4;
+ } else {
+ /*
+ * Variant 2
+ */
+
+ DUK_DDD(DUK_DDDPRINT("detected for variant 2: for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement"));
+ for (;;) {
+ /* more initializers */
+ if (comp_ctx->curr_token.t != DUK_TOK_COMMA) {
+ break;
+ }
+ DUK_DDD(DUK_DDDPRINT("variant 2 has another variable initializer"));
+
+ duk__advance(comp_ctx); /* eat comma */
+ duk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, &reg_varbind, &rc_varname);
+ }
+ goto parse_1_or_2;
+ }
+ } else {
+ /*
+ * Variant 1 or 3
+ */
+
+ pc_v34_lhs = duk__get_current_pc(comp_ctx); /* jump is inserted here (variant 3) */
+
+ /* Note that duk__exprtop() here can clobber any reg above current temp_next,
+ * so any loop variables (e.g. enumerator) must be "preallocated".
+ */
+
+ /* don't coerce yet to a plain value (variant 3 needs special handling) */
+ duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_REJECT_IN | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression */
+ if (comp_ctx->curr_token.t == DUK_TOK_IN) {
+ /*
+ * Variant 3
+ */
+
+ /* XXX: need to determine LHS type, and check that it is LHS compatible */
+ DUK_DDD(DUK_DDDPRINT("detected for variant 3: for (LeftHandSideExpression in Expression) Statement"));
+ if (duk__expr_is_empty(comp_ctx)) {
+ goto syntax_error; /* LeftHandSideExpression does not allow empty expression */
+ }
+
+ if (res->t == DUK_IVAL_VAR) {
+ duk_regconst_t reg_varbind;
+ duk_regconst_t rc_varname;
+
+ duk_dup(thr, res->x1.valstack_idx);
+ if (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_LDREG,
+ reg_varbind,
+ reg_temps + 0);
+ } else {
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_temps + 0,
+ rc_varname);
+ }
+ } else if (res->t == DUK_IVAL_PROP) {
+ /* Don't allow a constant for the object (even for a number etc), as
+ * it goes into the 'A' field of the opcode.
+ */
+ duk_regconst_t reg_obj;
+ duk_regconst_t rc_key;
+ reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */
+ rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_obj,
+ rc_key,
+ reg_temps + 0);
+ } else {
+ duk__ivalue_toplain_ignore(comp_ctx, res); /* just in case */
+ duk__emit_op_only(comp_ctx,
+ DUK_OP_INVLHS);
+ }
+ goto parse_3_or_4;
+ } else {
+ /*
+ * Variant 1
+ */
+
+ DUK_DDD(DUK_DDDPRINT("detected for variant 1: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement"));
+ duk__ivalue_toplain_ignore(comp_ctx, res);
+ goto parse_1_or_2;
+ }
+ }
+
+ parse_1_or_2:
+ /*
+ * Parse variant 1 or 2. The first part expression (which differs
+ * in the variants) has already been parsed and its code emitted.
+ *
+ * reg_temps + 0: unused
+ * reg_temps + 1: unused
+ */
+ {
+ duk_regconst_t rc_cond;
+ duk_int_t pc_l1, pc_l2, pc_l3, pc_l4;
+ duk_int_t pc_jumpto_l3, pc_jumpto_l4;
+ duk_bool_t expr_c_empty;
+
+ DUK_DDD(DUK_DDDPRINT("shared code for parsing variants 1 and 2"));
+
+ /* "release" preallocated temps since we won't need them */
+ temp_reset = reg_temps + 0;
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON);
+
+ pc_l1 = duk__get_current_pc(comp_ctx);
+ duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression_opt */
+ if (duk__expr_is_empty(comp_ctx)) {
+ /* no need to coerce */
+ pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* to body */
+ pc_jumpto_l4 = -1; /* omitted */
+ } else {
+ rc_cond = duk__ivalue_toregconst(comp_ctx, res);
+ duk__emit_if_false_skip(comp_ctx, rc_cond);
+ pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* to body */
+ pc_jumpto_l4 = duk__emit_jump_empty(comp_ctx); /* to exit */
+ }
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON);
+
+ pc_l2 = duk__get_current_pc(comp_ctx);
+ duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression_opt */
+ if (duk__expr_is_empty(comp_ctx)) {
+ /* no need to coerce */
+ expr_c_empty = 1;
+ /* JUMP L1 omitted */
+ } else {
+ duk__ivalue_toplain_ignore(comp_ctx, res);
+ expr_c_empty = 0;
+ duk__emit_jump(comp_ctx, pc_l1);
+ }
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ pc_l3 = duk__get_current_pc(comp_ctx);
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+ if (expr_c_empty) {
+ duk__emit_jump(comp_ctx, pc_l1);
+ } else {
+ duk__emit_jump(comp_ctx, pc_l2);
+ }
+ /* temp reset is not necessary after duk__parse_stmt(), which already does it */
+
+ pc_l4 = duk__get_current_pc(comp_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("patching jumps: jumpto_l3: %ld->%ld, jumpto_l4: %ld->%ld, "
+ "break: %ld->%ld, continue: %ld->%ld",
+ (long) pc_jumpto_l3, (long) pc_l3, (long) pc_jumpto_l4, (long) pc_l4,
+ (long) (pc_label_site + 1), (long) pc_l4, (long) (pc_label_site + 2), (long) pc_l2));
+
+ duk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3);
+ duk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4);
+ duk__patch_jump(comp_ctx,
+ pc_label_site + 1,
+ pc_l4); /* break jump */
+ duk__patch_jump(comp_ctx,
+ pc_label_site + 2,
+ expr_c_empty ? pc_l1 : pc_l2); /* continue jump */
+ }
+ goto finished;
+
+ parse_3_or_4:
+ /*
+ * Parse variant 3 or 4.
+ *
+ * For variant 3 (e.g. "for (A in C) D;") the code for A (except the
+ * final property/variable write) has already been emitted. The first
+ * instruction of that code is at pc_v34_lhs; a JUMP needs to be inserted
+ * there to satisfy control flow needs.
+ *
+ * For variant 4, if the variable declaration had an initializer
+ * (e.g. "for (var A = B in C) D;") the code for the assignment
+ * (B) has already been emitted.
+ *
+ * Variables set before entering here:
+ *
+ * pc_v34_lhs: insert a "JUMP L2" here (see doc/compiler.rst example).
+ * reg_temps + 0: iteration target value (written to LHS)
+ * reg_temps + 1: enumerator object
+ */
+ {
+ duk_int_t pc_l1, pc_l2, pc_l3, pc_l4, pc_l5;
+ duk_int_t pc_jumpto_l2, pc_jumpto_l3, pc_jumpto_l4, pc_jumpto_l5;
+ duk_regconst_t reg_target;
+
+ DUK_DDD(DUK_DDDPRINT("shared code for parsing variants 3 and 4, pc_v34_lhs=%ld", (long) pc_v34_lhs));
+
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ /* First we need to insert a jump in the middle of previously
+ * emitted code to get the control flow right. No jumps can
+ * cross the position where the jump is inserted. See doc/compiler.rst
+ * for discussion on the intricacies of control flow and side effects
+ * for variants 3 and 4.
+ */
+
+ duk__insert_jump_entry(comp_ctx, pc_v34_lhs);
+ pc_jumpto_l2 = pc_v34_lhs; /* inserted jump */
+ pc_l1 = pc_v34_lhs + 1; /* +1, right after inserted jump */
+
+ /* The code for writing reg_temps + 0 to the left hand side has already
+ * been emitted.
+ */
+
+ pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* -> loop body */
+
+ duk__advance(comp_ctx); /* eat 'in' */
+
+ /* Parse enumeration target and initialize enumerator. For 'null' and 'undefined',
+ * INITENUM will creates a 'null' enumerator which works like an empty enumerator
+ * (E5 Section 12.6.4, step 3). Note that INITENUM requires the value to be in a
+ * register (constant not allowed).
+ */
+
+ pc_l2 = duk__get_current_pc(comp_ctx);
+ reg_target = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression */
+ duk__emit_b_c(comp_ctx,
+ DUK_OP_INITENUM | DUK__EMIT_FLAG_B_IS_TARGET,
+ reg_temps + 1,
+ reg_target);
+ pc_jumpto_l4 = duk__emit_jump_empty(comp_ctx);
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ pc_l3 = duk__get_current_pc(comp_ctx);
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+ /* temp reset is not necessary after duk__parse_stmt(), which already does it */
+
+ /* NEXTENUM needs a jump slot right after the main opcode.
+ * We need the code emitter to reserve the slot: if there's
+ * target shuffling, the target shuffle opcodes must happen
+ * after the jump slot (for NEXTENUM the shuffle opcodes are
+ * not needed if the enum is finished).
+ */
+ pc_l4 = duk__get_current_pc(comp_ctx);
+ duk__emit_b_c(comp_ctx,
+ DUK_OP_NEXTENUM | DUK__EMIT_FLAG_B_IS_TARGET | DUK__EMIT_FLAG_RESERVE_JUMPSLOT,
+ reg_temps + 0,
+ reg_temps + 1);
+ pc_jumpto_l5 = comp_ctx->emit_jumpslot_pc; /* NEXTENUM jump slot: executed when enum finished */
+ duk__emit_jump(comp_ctx, pc_l1); /* jump to next loop, using reg_v34_iter as iterated value */
+
+ pc_l5 = duk__get_current_pc(comp_ctx);
+
+ /* XXX: since the enumerator may be a memory expensive object,
+ * perhaps clear it explicitly here? If so, break jump must
+ * go through this clearing operation.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("patching jumps: jumpto_l2: %ld->%ld, jumpto_l3: %ld->%ld, "
+ "jumpto_l4: %ld->%ld, jumpto_l5: %ld->%ld, "
+ "break: %ld->%ld, continue: %ld->%ld",
+ (long) pc_jumpto_l2, (long) pc_l2, (long) pc_jumpto_l3, (long) pc_l3,
+ (long) pc_jumpto_l4, (long) pc_l4, (long) pc_jumpto_l5, (long) pc_l5,
+ (long) (pc_label_site + 1), (long) pc_l5, (long) (pc_label_site + 2), (long) pc_l4));
+
+ duk__patch_jump(comp_ctx, pc_jumpto_l2, pc_l2);
+ duk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3);
+ duk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4);
+ duk__patch_jump(comp_ctx, pc_jumpto_l5, pc_l5);
+ duk__patch_jump(comp_ctx, pc_label_site + 1, pc_l5); /* break jump */
+ duk__patch_jump(comp_ctx, pc_label_site + 2, pc_l4); /* continue jump */
+ }
+ goto finished;
+
+ finished:
+ DUK_DDD(DUK_DDDPRINT("end parsing a for/for-in statement"));
+ return;
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FOR);
+}
+
+DUK_LOCAL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_regconst_t temp_at_loop;
+ duk_regconst_t rc_switch; /* reg/const for switch value */
+ duk_regconst_t rc_case; /* reg/const for case value */
+ duk_regconst_t reg_temp; /* general temp register */
+ duk_int_t pc_prevcase = -1;
+ duk_int_t pc_prevstmt = -1;
+ duk_int_t pc_default = -1; /* -1 == not set, -2 == pending (next statement list) */
+
+ /* Note: negative pc values are ignored when patching jumps, so no explicit checks needed */
+
+ /*
+ * Switch is pretty complicated because of several conflicting concerns:
+ *
+ * - Want to generate code without an intermediate representation,
+ * i.e., in one go
+ *
+ * - Case selectors are expressions, not values, and may thus e.g. throw
+ * exceptions (which causes evaluation order concerns)
+ *
+ * - Evaluation semantics of case selectors and default clause need to be
+ * carefully implemented to provide correct behavior even with case value
+ * side effects
+ *
+ * - Fall through case and default clauses; avoiding dead JUMPs if case
+ * ends with an unconditional jump (a break or a continue)
+ *
+ * - The same case value may occur multiple times, but evaluation rules
+ * only process the first match before switching to a "propagation" mode
+ * where case values are no longer evaluated
+ *
+ * See E5 Section 12.11. Also see doc/compiler.rst for compilation
+ * discussion.
+ */
+
+ duk__advance(comp_ctx);
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+ rc_switch = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+ duk__advance_expect(comp_ctx, DUK_TOK_LCURLY);
+
+ DUK_DDD(DUK_DDDPRINT("switch value in register %ld", (long) rc_switch));
+
+ temp_at_loop = DUK__GETTEMP(comp_ctx);
+
+ for (;;) {
+ duk_int_t num_stmts;
+ duk_small_uint_t tok;
+
+ /* sufficient for keeping temp reg numbers in check */
+ DUK__SETTEMP(comp_ctx, temp_at_loop);
+
+ if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {
+ break;
+ }
+
+ /*
+ * Parse a case or default clause.
+ */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_CASE) {
+ /*
+ * Case clause.
+ *
+ * Note: cannot use reg_case as a temp register (for SEQ target)
+ * because it may be a constant.
+ */
+
+ duk__patch_jump_here(comp_ctx, pc_prevcase); /* chain jumps for case
+ * evaluation and checking
+ */
+
+ duk__advance(comp_ctx);
+ rc_case = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ duk__advance_expect(comp_ctx, DUK_TOK_COLON);
+
+ reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_SEQ | DUK__EMIT_FLAG_BC_REGCONST,
+ reg_temp,
+ rc_switch,
+ rc_case);
+ duk__emit_if_true_skip(comp_ctx, reg_temp);
+
+ /* jump to next case clause */
+ pc_prevcase = duk__emit_jump_empty(comp_ctx); /* no match, next case */
+
+ /* statements go here (if any) on next loop */
+ } else if (comp_ctx->curr_token.t == DUK_TOK_DEFAULT) {
+ /*
+ * Default clause.
+ */
+
+ if (pc_default >= 0) {
+ goto syntax_error;
+ }
+ duk__advance(comp_ctx);
+ duk__advance_expect(comp_ctx, DUK_TOK_COLON);
+
+ /* Fix for https://github.com/svaarala/duktape/issues/155:
+ * If 'default' is first clause (detected by pc_prevcase < 0)
+ * we need to ensure we stay in the matching chain.
+ */
+ if (pc_prevcase < 0) {
+ DUK_DD(DUK_DDPRINT("default clause is first, emit prevcase jump"));
+ pc_prevcase = duk__emit_jump_empty(comp_ctx);
+ }
+
+ /* default clause matches next statement list (if any) */
+ pc_default = -2;
+ } else {
+ /* Code is not accepted before the first case/default clause */
+ goto syntax_error;
+ }
+
+ /*
+ * Parse code after the clause. Possible terminators are
+ * 'case', 'default', and '}'.
+ *
+ * Note that there may be no code at all, not even an empty statement,
+ * between case clauses. This must be handled just like an empty statement
+ * (omitting seemingly pointless JUMPs), to avoid situations like
+ * test-bug-case-fallthrough.js.
+ */
+
+ num_stmts = 0;
+ if (pc_default == -2) {
+ pc_default = duk__get_current_pc(comp_ctx);
+ }
+
+ /* Note: this is correct even for default clause statements:
+ * they participate in 'fall-through' behavior even if the
+ * default clause is in the middle.
+ */
+ duk__patch_jump_here(comp_ctx, pc_prevstmt); /* chain jumps for 'fall-through'
+ * after a case matches.
+ */
+
+ for (;;) {
+ tok = comp_ctx->curr_token.t;
+ if (tok == DUK_TOK_CASE || tok == DUK_TOK_DEFAULT ||
+ tok == DUK_TOK_RCURLY) {
+ break;
+ }
+ num_stmts++;
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+ }
+
+ /* fall-through jump to next code of next case (backpatched) */
+ pc_prevstmt = duk__emit_jump_empty(comp_ctx);
+
+ /* XXX: would be nice to omit this jump when the jump is not
+ * reachable, at least in the obvious cases (such as the case
+ * ending with a 'break'.
+ *
+ * Perhaps duk__parse_stmt() could provide some info on whether
+ * the statement is a "dead end"?
+ *
+ * If implemented, just set pc_prevstmt to -1 when not needed.
+ */
+ }
+
+ DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY);
+ duk__advance(comp_ctx);
+
+ /* default case control flow patchup; note that if pc_prevcase < 0
+ * (i.e. no case clauses), control enters default case automatically.
+ */
+ if (pc_default >= 0) {
+ /* default case exists: go there if no case matches */
+ duk__patch_jump(comp_ctx, pc_prevcase, pc_default);
+ } else {
+ /* default case does not exist, or no statements present
+ * after default case: finish case evaluation
+ */
+ duk__patch_jump_here(comp_ctx, pc_prevcase);
+ }
+
+ /* fall-through control flow patchup; note that pc_prevstmt may be
+ * < 0 (i.e. no case clauses), in which case this is a no-op.
+ */
+ duk__patch_jump_here(comp_ctx, pc_prevstmt);
+
+ /* continue jump not patched, an INVALID opcode remains there */
+ duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */
+
+ /* Note: 'fast' breaks will jump to pc_label_site + 1, which will
+ * then jump here. The double jump will be eliminated by a
+ * peephole pass, resulting in an optimal jump here. The label
+ * site jumps will remain in bytecode and will waste code size.
+ */
+
+ return;
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_SWITCH);
+}
+
+DUK_LOCAL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_regconst_t temp_reset;
+ duk_regconst_t rc_cond;
+ duk_int_t pc_jump_false;
+
+ DUK_DDD(DUK_DDDPRINT("begin parsing if statement"));
+
+ temp_reset = DUK__GETTEMP(comp_ctx);
+
+ duk__advance(comp_ctx); /* eat 'if' */
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+
+ rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ duk__emit_if_true_skip(comp_ctx, rc_cond);
+ pc_jump_false = duk__emit_jump_empty(comp_ctx); /* jump to end or else part */
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+
+ /* The 'else' ambiguity is resolved by 'else' binding to the innermost
+ * construct, so greedy matching is correct here.
+ */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_ELSE) {
+ duk_int_t pc_jump_end;
+
+ DUK_DDD(DUK_DDDPRINT("if has else part"));
+
+ duk__advance(comp_ctx);
+
+ pc_jump_end = duk__emit_jump_empty(comp_ctx); /* jump from true part to end */
+ duk__patch_jump_here(comp_ctx, pc_jump_false);
+
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+
+ duk__patch_jump_here(comp_ctx, pc_jump_end);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("if does not have else part"));
+
+ duk__patch_jump_here(comp_ctx, pc_jump_false);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("end parsing if statement"));
+}
+
+DUK_LOCAL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {
+ duk_regconst_t rc_cond;
+ duk_int_t pc_start;
+
+ DUK_DDD(DUK_DDDPRINT("begin parsing do statement"));
+
+ duk__advance(comp_ctx); /* eat 'do' */
+
+ pc_start = duk__get_current_pc(comp_ctx);
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+ duk__patch_jump_here(comp_ctx, pc_label_site + 2); /* continue jump */
+
+ duk__advance_expect(comp_ctx, DUK_TOK_WHILE);
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+
+ rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ duk__emit_if_false_skip(comp_ctx, rc_cond);
+ duk__emit_jump(comp_ctx, pc_start);
+ /* no need to reset temps, as we're finished emitting code */
+
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */
+
+ DUK_DDD(DUK_DDDPRINT("end parsing do statement"));
+}
+
+DUK_LOCAL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {
+ duk_regconst_t temp_reset;
+ duk_regconst_t rc_cond;
+ duk_int_t pc_start;
+ duk_int_t pc_jump_false;
+
+ DUK_DDD(DUK_DDDPRINT("begin parsing while statement"));
+
+ temp_reset = DUK__GETTEMP(comp_ctx);
+
+ duk__advance(comp_ctx); /* eat 'while' */
+
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+
+ pc_start = duk__get_current_pc(comp_ctx);
+ duk__patch_jump_here(comp_ctx, pc_label_site + 2); /* continue jump */
+
+ rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ duk__emit_if_true_skip(comp_ctx, rc_cond);
+ pc_jump_false = duk__emit_jump_empty(comp_ctx);
+ DUK__SETTEMP(comp_ctx, temp_reset);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+ duk__emit_jump(comp_ctx, pc_start);
+
+ duk__patch_jump_here(comp_ctx, pc_jump_false);
+ duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */
+
+ DUK_DDD(DUK_DDDPRINT("end parsing while statement"));
+}
+
+DUK_LOCAL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_bool_t is_break = (comp_ctx->curr_token.t == DUK_TOK_BREAK);
+ duk_int_t label_id;
+ duk_int_t label_catch_depth;
+ duk_int_t label_pc; /* points to LABEL; pc+1 = jump site for break; pc+2 = jump site for continue */
+ duk_bool_t label_is_closest;
+
+ DUK_UNREF(res);
+
+ duk__advance(comp_ctx); /* eat 'break' or 'continue' */
+
+ if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || /* explicit semi follows */
+ comp_ctx->curr_token.lineterm || /* automatic semi will be inserted */
+ comp_ctx->curr_token.allow_auto_semi) { /* automatic semi will be inserted */
+ /* break/continue without label */
+
+ duk__lookup_active_label(comp_ctx, DUK_HTHREAD_STRING_EMPTY_STRING(thr), is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest);
+ } else if (comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER) {
+ /* break/continue with label (label cannot be a reserved word, production is 'Identifier' */
+ DUK_ASSERT(comp_ctx->curr_token.str1 != NULL);
+ duk__lookup_active_label(comp_ctx, comp_ctx->curr_token.str1, is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest);
+ duk__advance(comp_ctx);
+ } else {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BREAK_CONT_LABEL);
+ }
+
+ /* Use a fast break/continue when possible. A fast break/continue is
+ * just a jump to the LABEL break/continue jump slot, which then jumps
+ * to an appropriate place (for break, going through ENDLABEL correctly).
+ * The peephole optimizer will optimize the jump to a direct one.
+ */
+
+ if (label_catch_depth == comp_ctx->curr_func.catch_depth &&
+ label_is_closest) {
+ DUK_DDD(DUK_DDDPRINT("break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, "
+ "label_catch_depth=%ld, catch_depth=%ld "
+ "-> use fast variant (direct jump)",
+ (long) is_break, (long) label_id, (long) label_is_closest,
+ (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth));
+
+ duk__emit_jump(comp_ctx, label_pc + (is_break ? 1 : 2));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, "
+ "label_catch_depth=%ld, catch_depth=%ld "
+ "-> use slow variant (longjmp)",
+ (long) is_break, (long) label_id, (long) label_is_closest,
+ (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth));
+
+ duk__emit_bc(comp_ctx,
+ is_break ? DUK_OP_BREAK : DUK_OP_CONTINUE,
+ (duk_regconst_t) label_id);
+ }
+}
+
+DUK_LOCAL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_regconst_t rc_val;
+
+ duk__advance(comp_ctx); /* eat 'return' */
+
+ /* A 'return' statement is only allowed inside an actual function body,
+ * not as part of eval or global code.
+ */
+ if (!comp_ctx->curr_func.is_function) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_RETURN);
+ }
+
+ if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || /* explicit semi follows */
+ comp_ctx->curr_token.lineterm || /* automatic semi will be inserted */
+ comp_ctx->curr_token.allow_auto_semi) { /* automatic semi will be inserted */
+ DUK_DDD(DUK_DDDPRINT("empty return value -> undefined"));
+ duk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF);
+ } else {
+ duk_int_t pc_before_expr;
+ duk_int_t pc_after_expr;
+
+ DUK_DDD(DUK_DDDPRINT("return with a value"));
+
+ DUK_UNREF(pc_before_expr);
+ DUK_UNREF(pc_after_expr);
+
+ pc_before_expr = duk__get_current_pc(comp_ctx);
+ rc_val = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ pc_after_expr = duk__get_current_pc(comp_ctx);
+
+ /* Tail call check: if last opcode emitted was CALL, and
+ * the context allows it, add a tailcall flag to the CALL.
+ * This doesn't guarantee that a tail call will be allowed at
+ * runtime, so the RETURN must still be emitted. (Duktape
+ * 0.10.0 avoided this and simulated a RETURN if a tail call
+ * couldn't be used at runtime; but this didn't work
+ * correctly with a thread yield/resume, see
+ * test-bug-tailcall-thread-yield-resume.js for discussion.)
+ *
+ * In addition to the last opcode being CALL, we also need to
+ * be sure that 'rc_val' is the result register of the CALL.
+ * For instance, for the expression 'return 0, (function ()
+ * { return 1; }), 2' the last opcode emitted is CALL (no
+ * bytecode is emitted for '2') but 'rc_val' indicates
+ * constant '2'. Similarly if '2' is replaced by a register
+ * bound variable, no opcodes are emitted but tail call would
+ * be incorrect.
+ *
+ * This is tricky and easy to get wrong. It would be best to
+ * track enough expression metadata to check that 'rc_val' came
+ * from that last CALL instruction. We don't have that metadata
+ * now, so we check that 'rc_val' is a temporary register result
+ * (not a constant or a register bound variable). There should
+ * be no way currently for 'rc_val' to be a temporary for an
+ * expression following the CALL instruction without emitting
+ * some opcodes following the CALL. This proxy check is used
+ * below.
+ *
+ * See: test-bug-comma-expr-gh131.js.
+ *
+ * The non-standard 'caller' property disables tail calls
+ * because they pose some special cases which haven't been
+ * fixed yet.
+ */
+
+#if defined(DUK_USE_TAILCALL)
+ if (comp_ctx->curr_func.catch_depth == 0 && /* no catchers */
+ pc_after_expr > pc_before_expr) { /* at least one opcode emitted */
+ duk_compiler_instr *instr;
+ duk_instr_t ins;
+ duk_small_uint_t op;
+
+ instr = duk__get_instr_ptr(comp_ctx, pc_after_expr - 1);
+ DUK_ASSERT(instr != NULL);
+
+ ins = instr->ins;
+ op = (duk_small_uint_t) DUK_DEC_OP(ins);
+ if ((op & ~0x0fU) == DUK_OP_CALL0 &&
+ DUK__ISREG_TEMP(comp_ctx, rc_val) /* see above */) {
+ DUK_DDD(DUK_DDDPRINT("return statement detected a tail call opportunity: "
+ "catch depth is 0, duk__exprtop() emitted >= 1 instructions, "
+ "and last instruction is a CALL "
+ "-> change to TAILCALL"));
+ ins |= DUK_ENC_OP(DUK_BC_CALL_FLAG_TAILCALL);
+ instr->ins = ins;
+ }
+ }
+#endif /* DUK_USE_TAILCALL */
+
+ if (DUK__ISREG(rc_val)) {
+ duk__emit_bc(comp_ctx, DUK_OP_RETREG, rc_val);
+ } else {
+ rc_val = DUK__REMOVECONST(rc_val);
+ if (duk__const_needs_refcount(comp_ctx, rc_val)) {
+ duk__emit_bc(comp_ctx, DUK_OP_RETCONST, rc_val);
+ } else {
+ duk__emit_bc(comp_ctx, DUK_OP_RETCONSTN, rc_val);
+ }
+ }
+ }
+}
+
+DUK_LOCAL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_regconst_t reg_val;
+
+ duk__advance(comp_ctx); /* eat 'throw' */
+
+ /* Unlike break/continue, throw statement does not allow an empty value. */
+
+ if (comp_ctx->curr_token.lineterm) {
+ DUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_INVALID_THROW);
+ }
+
+ reg_val = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+ duk__emit_bc(comp_ctx,
+ DUK_OP_THROW,
+ reg_val);
+}
+
+DUK_LOCAL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_regconst_t reg_catch; /* reg_catch+0 and reg_catch+1 are reserved for TRYCATCH */
+ duk_regconst_t rc_varname = 0;
+ duk_small_uint_t trycatch_flags = 0;
+ duk_int_t pc_ldconst = -1;
+ duk_int_t pc_trycatch = -1;
+ duk_int_t pc_catch = -1;
+ duk_int_t pc_finally = -1;
+
+ DUK_UNREF(res);
+
+ /*
+ * See the following documentation for discussion:
+ *
+ * doc/execution.rst: control flow details
+ *
+ * Try, catch, and finally "parts" are Blocks, not Statements, so
+ * they must always be delimited by curly braces. This is unlike e.g.
+ * the if statement, which accepts any Statement. This eliminates any
+ * questions of matching parts of nested try statements. The Block
+ * parsing is implemented inline here (instead of calling out).
+ *
+ * Finally part has a 'let scoped' variable, which requires a few kinks
+ * here.
+ */
+
+ comp_ctx->curr_func.catch_depth++;
+
+ duk__advance(comp_ctx); /* eat 'try' */
+
+ reg_catch = DUK__ALLOCTEMPS(comp_ctx, 2);
+
+ /* The target for this LDCONST may need output shuffling, but we assume
+ * that 'pc_ldconst' will be the LDCONST that we can patch later. This
+ * should be the case because there's no input shuffling. (If there's
+ * no catch clause, this LDCONST will be replaced with a NOP.)
+ */
+ pc_ldconst = duk__get_current_pc(comp_ctx);
+ duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, reg_catch, 0 /*patched later*/);
+
+ pc_trycatch = duk__get_current_pc(comp_ctx);
+ duk__emit_invalid(comp_ctx); /* TRYCATCH, cannot emit now (not enough info) */
+ duk__emit_invalid(comp_ctx); /* jump for 'catch' case */
+ duk__emit_invalid(comp_ctx); /* jump for 'finally' case or end (if no finally) */
+
+ /* try part */
+ duk__advance_expect(comp_ctx, DUK_TOK_LCURLY);
+ duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);
+ /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */
+ duk__emit_op_only(comp_ctx,
+ DUK_OP_ENDTRY);
+
+ if (comp_ctx->curr_token.t == DUK_TOK_CATCH) {
+ /*
+ * The catch variable must be updated to reflect the new allocated
+ * register for the duration of the catch clause. We need to store
+ * and restore the original value for the varmap entry (if any).
+ */
+
+ /*
+ * Note: currently register bindings must be fixed for the entire
+ * function. So, even though the catch variable is in a register
+ * we know, we must use an explicit environment record and slow path
+ * accesses to read/write the catch binding to make closures created
+ * within the catch clause work correctly. This restriction should
+ * be fixable (at least in common cases) later.
+ *
+ * See: test-bug-catch-binding-2.js.
+ *
+ * XXX: improve to get fast path access to most catch clauses.
+ */
+
+ duk_hstring *h_var;
+ duk_int_t varmap_value; /* for storing/restoring the varmap binding for catch variable */
+
+ DUK_DDD(DUK_DDDPRINT("stack top at start of catch clause: %ld", (long) duk_get_top(thr)));
+
+ trycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_CATCH;
+
+ pc_catch = duk__get_current_pc(comp_ctx);
+
+ duk__advance(comp_ctx);
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+
+ if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) {
+ /* Identifier, i.e. don't allow reserved words */
+ goto syntax_error;
+ }
+ h_var = comp_ctx->curr_token.str1;
+ DUK_ASSERT(h_var != NULL);
+
+ duk_push_hstring(thr, h_var); /* keep in on valstack, use borrowed ref below */
+
+ if (comp_ctx->curr_func.is_strict &&
+ ((h_var == DUK_HTHREAD_STRING_EVAL(thr)) ||
+ (h_var == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)))) {
+ DUK_DDD(DUK_DDDPRINT("catch identifier 'eval' or 'arguments' in strict mode -> SyntaxError"));
+ goto syntax_error;
+ }
+
+ duk_dup_top(thr);
+ rc_varname = duk__getconst(comp_ctx);
+ DUK_DDD(DUK_DDDPRINT("catch clause, rc_varname=0x%08lx (%ld)",
+ (unsigned long) rc_varname, (long) rc_varname));
+
+ duk__advance(comp_ctx);
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_LCURLY);
+
+ DUK_DDD(DUK_DDDPRINT("varmap before modifying for catch clause: %!iT",
+ (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx)));
+
+ duk_dup_top(thr);
+ duk_get_prop(thr, comp_ctx->curr_func.varmap_idx);
+ if (duk_is_undefined(thr, -1)) {
+ varmap_value = -2;
+ } else if (duk_is_null(thr, -1)) {
+ varmap_value = -1;
+ } else {
+ DUK_ASSERT(duk_is_number(thr, -1));
+ varmap_value = duk_get_int(thr, -1);
+ DUK_ASSERT(varmap_value >= 0);
+ }
+ duk_pop(thr);
+
+#if 0
+ /* It'd be nice to do something like this - but it doesn't
+ * work for closures created inside the catch clause.
+ */
+ duk_dup_top(thr);
+ duk_push_int(thr, (duk_int_t) (reg_catch + 0));
+ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx);
+#endif
+ duk_dup_top(thr);
+ duk_push_null(thr);
+ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx);
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,
+ reg_catch + 0 /*value*/,
+ rc_varname /*varname*/);
+
+ DUK_DDD(DUK_DDDPRINT("varmap before parsing catch clause: %!iT",
+ (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx)));
+
+ duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);
+ /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */
+
+ if (varmap_value == -2) {
+ /* not present */
+ duk_del_prop(thr, comp_ctx->curr_func.varmap_idx);
+ } else {
+ if (varmap_value == -1) {
+ duk_push_null(thr);
+ } else {
+ DUK_ASSERT(varmap_value >= 0);
+ duk_push_int(thr, varmap_value);
+ }
+ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx);
+ }
+ /* varname is popped by above code */
+
+ DUK_DDD(DUK_DDDPRINT("varmap after restore catch clause: %!iT",
+ (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx)));
+
+ duk__emit_op_only(comp_ctx,
+ DUK_OP_ENDCATCH);
+
+ /*
+ * XXX: for now, indicate that an expensive catch binding
+ * declarative environment is always needed. If we don't
+ * need it, we don't need the const_varname either.
+ */
+
+ trycatch_flags |= DUK_BC_TRYCATCH_FLAG_CATCH_BINDING;
+
+ DUK_DDD(DUK_DDDPRINT("stack top at end of catch clause: %ld", (long) duk_get_top(thr)));
+ }
+
+ if (comp_ctx->curr_token.t == DUK_TOK_FINALLY) {
+ trycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY;
+
+ pc_finally = duk__get_current_pc(comp_ctx);
+
+ duk__advance(comp_ctx);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_LCURLY);
+ duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);
+ /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */
+ duk__emit_abc(comp_ctx,
+ DUK_OP_ENDFIN,
+ reg_catch); /* rethrow */
+ }
+
+ if (!(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) &&
+ !(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY)) {
+ /* must have catch and/or finally */
+ goto syntax_error;
+ }
+
+ /* If there's no catch block, rc_varname will be 0 and duk__patch_trycatch()
+ * will replace the LDCONST with a NOP. For any actual constant (including
+ * constant 0) the DUK__CONST_MARKER flag will be set in rc_varname.
+ */
+
+ duk__patch_trycatch(comp_ctx,
+ pc_ldconst,
+ pc_trycatch,
+ reg_catch,
+ rc_varname,
+ trycatch_flags);
+
+ if (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) {
+ DUK_ASSERT(pc_catch >= 0);
+ duk__patch_jump(comp_ctx, pc_trycatch + 1, pc_catch);
+ }
+
+ if (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) {
+ DUK_ASSERT(pc_finally >= 0);
+ duk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finally);
+ } else {
+ /* without finally, the second jump slot is used to jump to end of stmt */
+ duk__patch_jump_here(comp_ctx, pc_trycatch + 2);
+ }
+
+ comp_ctx->curr_func.catch_depth--;
+ return;
+
+ syntax_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_TRY);
+}
+
+DUK_LOCAL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {
+ duk_int_t pc_trycatch;
+ duk_int_t pc_finished;
+ duk_regconst_t reg_catch;
+ duk_small_uint_t trycatch_flags;
+
+ if (comp_ctx->curr_func.is_strict) {
+ DUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_WITH_IN_STRICT_MODE);
+ }
+
+ comp_ctx->curr_func.catch_depth++;
+
+ duk__advance(comp_ctx); /* eat 'with' */
+
+ reg_catch = DUK__ALLOCTEMPS(comp_ctx, 2);
+
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+ duk__exprtop_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/, reg_catch);
+ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN);
+
+ pc_trycatch = duk__get_current_pc(comp_ctx);
+ trycatch_flags = DUK_BC_TRYCATCH_FLAG_WITH_BINDING;
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_TRYCATCH | DUK__EMIT_FLAG_NO_SHUFFLE_A,
+ (duk_regconst_t) trycatch_flags /*a*/,
+ reg_catch /*bc*/);
+ duk__emit_invalid(comp_ctx); /* catch jump */
+ duk__emit_invalid(comp_ctx); /* finished jump */
+
+ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);
+ duk__emit_op_only(comp_ctx,
+ DUK_OP_ENDTRY);
+
+ pc_finished = duk__get_current_pc(comp_ctx);
+
+ duk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finished);
+
+ comp_ctx->curr_func.catch_depth--;
+}
+
+DUK_LOCAL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id) {
+ /* if a site already exists, nop: max one label site per statement */
+ if (label_id >= 0) {
+ return label_id;
+ }
+
+ label_id = comp_ctx->curr_func.label_next++;
+ DUK_DDD(DUK_DDDPRINT("allocated new label id for label site: %ld", (long) label_id));
+
+ duk__emit_bc(comp_ctx,
+ DUK_OP_LABEL,
+ (duk_regconst_t) label_id);
+ duk__emit_invalid(comp_ctx);
+ duk__emit_invalid(comp_ctx);
+
+ return label_id;
+}
+
+/* Parse a single statement.
+ *
+ * Creates a label site (with an empty label) automatically for iteration
+ * statements. Also "peels off" any label statements for explicit labels.
+ */
+DUK_LOCAL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_bool_t dir_prol_at_entry; /* directive prologue status at entry */
+ duk_regconst_t temp_at_entry;
+ duk_size_t labels_len_at_entry;
+ duk_int_t pc_at_entry; /* assumed to also be PC of "LABEL" */
+ duk_int_t stmt_id;
+ duk_small_uint_t stmt_flags = 0;
+ duk_int_t label_id = -1;
+ duk_small_uint_t tok;
+ duk_bool_t test_func_decl;
+
+ DUK__RECURSION_INCREASE(comp_ctx, thr);
+
+ temp_at_entry = DUK__GETTEMP(comp_ctx);
+ pc_at_entry = duk__get_current_pc(comp_ctx);
+ labels_len_at_entry = duk_get_length(thr, comp_ctx->curr_func.labelnames_idx);
+ stmt_id = comp_ctx->curr_func.stmt_next++;
+ dir_prol_at_entry = comp_ctx->curr_func.in_directive_prologue;
+
+ DUK_UNREF(stmt_id);
+
+ DUK_DDD(DUK_DDDPRINT("parsing a statement, stmt_id=%ld, temp_at_entry=%ld, labels_len_at_entry=%ld, "
+ "is_strict=%ld, in_directive_prologue=%ld, catch_depth=%ld",
+ (long) stmt_id, (long) temp_at_entry, (long) labels_len_at_entry,
+ (long) comp_ctx->curr_func.is_strict, (long) comp_ctx->curr_func.in_directive_prologue,
+ (long) comp_ctx->curr_func.catch_depth));
+
+ /* The directive prologue flag is cleared by default so that it is
+ * unset for any recursive statement parsing. It is only "revived"
+ * if a directive is detected. (We could also make directives only
+ * allowed if 'allow_source_elem' was true.)
+ */
+ comp_ctx->curr_func.in_directive_prologue = 0;
+
+ retry_parse:
+
+ DUK_DDD(DUK_DDDPRINT("try stmt parse, stmt_id=%ld, label_id=%ld, allow_source_elem=%ld, catch_depth=%ld",
+ (long) stmt_id, (long) label_id, (long) allow_source_elem,
+ (long) comp_ctx->curr_func.catch_depth));
+
+ /*
+ * Detect iteration statements; if encountered, establish an
+ * empty label.
+ */
+
+ tok = comp_ctx->curr_token.t;
+ if (tok == DUK_TOK_FOR || tok == DUK_TOK_DO || tok == DUK_TOK_WHILE ||
+ tok == DUK_TOK_SWITCH) {
+ DUK_DDD(DUK_DDDPRINT("iteration/switch statement -> add empty label"));
+
+ label_id = duk__stmt_label_site(comp_ctx, label_id);
+ duk__add_label(comp_ctx,
+ DUK_HTHREAD_STRING_EMPTY_STRING(thr),
+ pc_at_entry /*pc_label*/,
+ label_id);
+ }
+
+ /*
+ * Main switch for statement / source element type.
+ */
+
+ switch (comp_ctx->curr_token.t) {
+ case DUK_TOK_FUNCTION: {
+ /*
+ * Function declaration, function expression, or (non-standard)
+ * function statement.
+ *
+ * The E5 specification only allows function declarations at
+ * the top level (in "source elements"). An ExpressionStatement
+ * is explicitly not allowed to begin with a "function" keyword
+ * (E5 Section 12.4). Hence any non-error semantics for such
+ * non-top-level statements are non-standard. Duktape semantics
+ * for function statements are modelled after V8, see
+ * test-dev-func-decl-outside-top.js.
+ */
+ test_func_decl = allow_source_elem;
+#if defined(DUK_USE_NONSTD_FUNC_STMT)
+ /* Lenient: allow function declarations outside top level in
+ * non-strict mode but reject them in strict mode.
+ */
+ test_func_decl = test_func_decl || !comp_ctx->curr_func.is_strict;
+#endif /* DUK_USE_NONSTD_FUNC_STMT */
+ /* Strict: never allow function declarations outside top level. */
+ if (test_func_decl) {
+ /* FunctionDeclaration: not strictly a statement but handled as such.
+ *
+ * O(depth^2) parse count for inner functions is handled by recording a
+ * lexer offset on the first compilation pass, so that the function can
+ * be efficiently skipped on the second pass. This is encapsulated into
+ * duk__parse_func_like_fnum().
+ */
+
+ duk_int_t fnum;
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t top_before;
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("function declaration statement"));
+
+#if defined(DUK_USE_ASSERTIONS)
+ top_before = duk_get_top(thr);
+#endif
+
+ duk__advance(comp_ctx); /* eat 'function' */
+ fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_DECL | DUK__FUNC_FLAG_PUSHNAME_PASS1);
+
+ /* The value stack convention here is a bit odd: the function
+ * name is only pushed on pass 1 (in_scanning), and is needed
+ * to process function declarations.
+ */
+ if (comp_ctx->curr_func.in_scanning) {
+ duk_uarridx_t n;
+
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(duk_get_top(thr) == top_before + 1);
+#endif
+ DUK_DDD(DUK_DDDPRINT("register function declaration %!T in pass 1, fnum %ld",
+ duk_get_tval(thr, -1), (long) fnum));
+ n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx);
+ /* funcname is at index -1 */
+ duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n);
+ duk_push_int(thr, (duk_int_t) (DUK_DECL_TYPE_FUNC + (fnum << 8)));
+ duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1);
+ } else {
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(duk_get_top(thr) == top_before);
+#endif
+ }
+
+ /* no statement value (unlike function expression) */
+ stmt_flags = 0;
+ break;
+ } else {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_STMT_NOT_ALLOWED);
+ }
+ break;
+ }
+ case DUK_TOK_LCURLY: {
+ DUK_DDD(DUK_DDDPRINT("block statement"));
+ duk__advance(comp_ctx);
+ duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);
+ /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */
+ if (label_id >= 0) {
+ duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */
+ }
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_CONST: {
+ DUK_DDD(DUK_DDDPRINT("constant declaration statement"));
+ duk__parse_var_stmt(comp_ctx, res, DUK__EXPR_FLAG_REQUIRE_INIT /*expr_flags*/);
+ stmt_flags = DUK__HAS_TERM;
+ break;
+ }
+ case DUK_TOK_VAR: {
+ DUK_DDD(DUK_DDDPRINT("variable declaration statement"));
+ duk__parse_var_stmt(comp_ctx, res, 0 /*expr_flags*/);
+ stmt_flags = DUK__HAS_TERM;
+ break;
+ }
+ case DUK_TOK_SEMICOLON: {
+ /* empty statement with an explicit semicolon */
+ DUK_DDD(DUK_DDDPRINT("empty statement"));
+ stmt_flags = DUK__HAS_TERM;
+ break;
+ }
+ case DUK_TOK_IF: {
+ DUK_DDD(DUK_DDDPRINT("if statement"));
+ duk__parse_if_stmt(comp_ctx, res);
+ if (label_id >= 0) {
+ duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */
+ }
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_DO: {
+ /*
+ * Do-while statement is mostly trivial, but there is special
+ * handling for automatic semicolon handling (triggered by the
+ * DUK__ALLOW_AUTO_SEMI_ALWAYS) flag related to a bug filed at:
+ *
+ * https://bugs.ecmascript.org/show_bug.cgi?id=8
+ *
+ * See doc/compiler.rst for details.
+ */
+ DUK_DDD(DUK_DDDPRINT("do statement"));
+ DUK_ASSERT(label_id >= 0);
+ duk__update_label_flags(comp_ctx,
+ label_id,
+ DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE);
+ duk__parse_do_stmt(comp_ctx, res, pc_at_entry);
+ stmt_flags = DUK__HAS_TERM | DUK__ALLOW_AUTO_SEMI_ALWAYS; /* DUK__ALLOW_AUTO_SEMI_ALWAYS workaround */
+ break;
+ }
+ case DUK_TOK_WHILE: {
+ DUK_DDD(DUK_DDDPRINT("while statement"));
+ DUK_ASSERT(label_id >= 0);
+ duk__update_label_flags(comp_ctx,
+ label_id,
+ DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE);
+ duk__parse_while_stmt(comp_ctx, res, pc_at_entry);
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_FOR: {
+ /*
+ * For/for-in statement is complicated to parse because
+ * determining the statement type (three-part for vs. a
+ * for-in) requires potential backtracking.
+ *
+ * See the helper for the messy stuff.
+ */
+ DUK_DDD(DUK_DDDPRINT("for/for-in statement"));
+ DUK_ASSERT(label_id >= 0);
+ duk__update_label_flags(comp_ctx,
+ label_id,
+ DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE);
+ duk__parse_for_stmt(comp_ctx, res, pc_at_entry);
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_CONTINUE:
+ case DUK_TOK_BREAK: {
+ DUK_DDD(DUK_DDDPRINT("break/continue statement"));
+ duk__parse_break_or_continue_stmt(comp_ctx, res);
+ stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL;
+ break;
+ }
+ case DUK_TOK_RETURN: {
+ DUK_DDD(DUK_DDDPRINT("return statement"));
+ duk__parse_return_stmt(comp_ctx, res);
+ stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL;
+ break;
+ }
+ case DUK_TOK_WITH: {
+ DUK_DDD(DUK_DDDPRINT("with statement"));
+ comp_ctx->curr_func.with_depth++;
+ duk__parse_with_stmt(comp_ctx, res);
+ if (label_id >= 0) {
+ duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */
+ }
+ comp_ctx->curr_func.with_depth--;
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_SWITCH: {
+ /*
+ * The switch statement is pretty messy to compile.
+ * See the helper for details.
+ */
+ DUK_DDD(DUK_DDDPRINT("switch statement"));
+ DUK_ASSERT(label_id >= 0);
+ duk__update_label_flags(comp_ctx,
+ label_id,
+ DUK_LABEL_FLAG_ALLOW_BREAK); /* don't allow continue */
+ duk__parse_switch_stmt(comp_ctx, res, pc_at_entry);
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_THROW: {
+ DUK_DDD(DUK_DDDPRINT("throw statement"));
+ duk__parse_throw_stmt(comp_ctx, res);
+ stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL;
+ break;
+ }
+ case DUK_TOK_TRY: {
+ DUK_DDD(DUK_DDDPRINT("try statement"));
+ duk__parse_try_stmt(comp_ctx, res);
+ stmt_flags = 0;
+ break;
+ }
+ case DUK_TOK_DEBUGGER: {
+ duk__advance(comp_ctx);
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ DUK_DDD(DUK_DDDPRINT("debugger statement: debugging enabled, emit debugger opcode"));
+ duk__emit_op_only(comp_ctx, DUK_OP_DEBUGGER);
+#else
+ DUK_DDD(DUK_DDDPRINT("debugger statement: ignored"));
+#endif
+ stmt_flags = DUK__HAS_TERM;
+ break;
+ }
+ default: {
+ /*
+ * Else, must be one of:
+ * - ExpressionStatement, possibly a directive (String)
+ * - LabelledStatement (Identifier followed by ':')
+ *
+ * Expressions beginning with 'function' keyword are covered by a case
+ * above (such expressions are not allowed in standard E5 anyway).
+ * Also expressions starting with '{' are interpreted as block
+ * statements. See E5 Section 12.4.
+ *
+ * Directive detection is tricky; see E5 Section 14.1 on directive
+ * prologue. A directive is an expression statement with a single
+ * string literal and an explicit or automatic semicolon. Escape
+ * characters are significant and no parens etc are allowed:
+ *
+ * 'use strict'; // valid 'use strict' directive
+ * 'use\u0020strict'; // valid directive, not a 'use strict' directive
+ * ('use strict'); // not a valid directive
+ *
+ * The expression is determined to consist of a single string literal
+ * based on duk__expr_nud() and duk__expr_led() call counts. The string literal
+ * of a 'use strict' directive is determined to lack any escapes based
+ * num_escapes count from the lexer. Note that other directives may be
+ * allowed to contain escapes, so a directive with escapes does not
+ * terminate a directive prologue.
+ *
+ * We rely on the fact that the expression parser will not emit any
+ * code for a single token expression. However, it will generate an
+ * intermediate value which we will then successfully ignore.
+ *
+ * A similar approach is used for labels.
+ */
+
+ duk_bool_t single_token;
+
+ DUK_DDD(DUK_DDDPRINT("expression statement"));
+ duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);
+
+ single_token = (comp_ctx->curr_func.nud_count == 1 && /* one token */
+ comp_ctx->curr_func.led_count == 0); /* no operators */
+
+ if (single_token &&
+ comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&
+ comp_ctx->curr_token.t == DUK_TOK_COLON) {
+ /*
+ * Detected label
+ */
+
+ duk_hstring *h_lab;
+
+ /* expected ival */
+ DUK_ASSERT(res->t == DUK_IVAL_VAR);
+ DUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx)));
+ h_lab = comp_ctx->prev_token.str1;
+ DUK_ASSERT(h_lab != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("explicit label site for label '%!O'",
+ (duk_heaphdr *) h_lab));
+
+ duk__advance(comp_ctx); /* eat colon */
+
+ label_id = duk__stmt_label_site(comp_ctx, label_id);
+
+ duk__add_label(comp_ctx,
+ h_lab,
+ pc_at_entry /*pc_label*/,
+ label_id);
+
+ /* a statement following a label cannot be a source element
+ * (a function declaration).
+ */
+ allow_source_elem = 0;
+
+ DUK_DDD(DUK_DDDPRINT("label handled, retry statement parsing"));
+ goto retry_parse;
+ }
+
+ stmt_flags = 0;
+
+ if (dir_prol_at_entry && /* still in prologue */
+ single_token && /* single string token */
+ comp_ctx->prev_token.t == DUK_TOK_STRING) {
+ /*
+ * Detected a directive
+ */
+ duk_hstring *h_dir;
+
+ /* expected ival */
+ DUK_ASSERT(res->t == DUK_IVAL_PLAIN);
+ DUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx)));
+ h_dir = comp_ctx->prev_token.str1;
+ DUK_ASSERT(h_dir != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("potential directive: %!O", h_dir));
+
+ stmt_flags |= DUK__STILL_PROLOGUE;
+
+ /* Note: escaped characters differentiate directives */
+
+ if (comp_ctx->prev_token.num_escapes > 0) {
+ DUK_DDD(DUK_DDDPRINT("directive contains escapes: valid directive "
+ "but we ignore such directives"));
+ } else {
+ /*
+ * The length comparisons are present to handle
+ * strings like "use strict\u0000foo" as required.
+ */
+
+ if (DUK_HSTRING_GET_BYTELEN(h_dir) == 10 &&
+ DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), "use strict", 10) == 0) {
+#if defined(DUK_USE_STRICT_DECL)
+ DUK_DDD(DUK_DDDPRINT("use strict directive detected: strict flag %ld -> %ld",
+ (long) comp_ctx->curr_func.is_strict, (long) 1));
+ comp_ctx->curr_func.is_strict = 1;
+#else
+ DUK_DDD(DUK_DDDPRINT("use strict detected but strict declarations disabled, ignoring"));
+#endif
+ } else if (DUK_HSTRING_GET_BYTELEN(h_dir) == 14 &&
+ DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), "use duk notail", 14) == 0) {
+ DUK_DDD(DUK_DDDPRINT("use duk notail directive detected: notail flag %ld -> %ld",
+ (long) comp_ctx->curr_func.is_notail, (long) 1));
+ comp_ctx->curr_func.is_notail = 1;
+ } else {
+ DUK_DD(DUK_DDPRINT("unknown directive: '%!O', ignoring but not terminating "
+ "directive prologue", (duk_hobject *) h_dir));
+ }
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("non-directive expression statement or no longer in prologue; "
+ "prologue terminated if still active"));
+ }
+
+ stmt_flags |= DUK__HAS_VAL | DUK__HAS_TERM;
+ }
+ } /* end switch (tok) */
+
+ /*
+ * Statement value handling.
+ *
+ * Global code and eval code has an implicit return value
+ * which comes from the last statement with a value
+ * (technically a non-"empty" continuation, which is
+ * different from an empty statement).
+ *
+ * Since we don't know whether a later statement will
+ * override the value of the current statement, we need
+ * to coerce the statement value to a register allocated
+ * for implicit return values. In other cases we need
+ * to coerce the statement value to a plain value to get
+ * any side effects out (consider e.g. "foo.bar;").
+ */
+
+ /* XXX: what about statements which leave a half-cooked value in 'res'
+ * but have no stmt value? Any such statements?
+ */
+
+ if (stmt_flags & DUK__HAS_VAL) {
+ duk_regconst_t reg_stmt_value = comp_ctx->curr_func.reg_stmt_value;
+ if (reg_stmt_value >= 0) {
+ duk__ivalue_toforcedreg(comp_ctx, res, reg_stmt_value);
+ } else {
+ duk__ivalue_toplain_ignore(comp_ctx, res);
+ }
+ } else {
+ ;
+ }
+
+ /*
+ * Statement terminator check, including automatic semicolon
+ * handling. After this step, 'curr_tok' should be the first
+ * token after a possible statement terminator.
+ */
+
+ if (stmt_flags & DUK__HAS_TERM) {
+ if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON) {
+ DUK_DDD(DUK_DDDPRINT("explicit semicolon terminates statement"));
+ duk__advance(comp_ctx);
+ } else {
+ if (comp_ctx->curr_token.allow_auto_semi) {
+ DUK_DDD(DUK_DDDPRINT("automatic semicolon terminates statement"));
+ } else if (stmt_flags & DUK__ALLOW_AUTO_SEMI_ALWAYS) {
+ /* XXX: make this lenience dependent on flags or strictness? */
+ DUK_DDD(DUK_DDDPRINT("automatic semicolon terminates statement (allowed for compatibility "
+ "even though no lineterm present before next token)"));
+ } else {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_UNTERMINATED_STMT);
+ }
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("statement has no terminator"));
+ }
+
+ /*
+ * Directive prologue tracking.
+ */
+
+ if (stmt_flags & DUK__STILL_PROLOGUE) {
+ DUK_DDD(DUK_DDDPRINT("setting in_directive_prologue"));
+ comp_ctx->curr_func.in_directive_prologue = 1;
+ }
+
+ /*
+ * Cleanups (all statement parsing flows through here).
+ *
+ * Pop label site and reset labels. Reset 'next temp' to value at
+ * entry to reuse temps.
+ */
+
+ if (label_id >= 0) {
+ duk__emit_bc(comp_ctx,
+ DUK_OP_ENDLABEL,
+ (duk_regconst_t) label_id);
+ }
+
+ DUK__SETTEMP(comp_ctx, temp_at_entry);
+
+ duk__reset_labels_to_length(comp_ctx, labels_len_at_entry);
+
+ /* XXX: return indication of "terminalness" (e.g. a 'throw' is terminal) */
+
+ DUK__RECURSION_DECREASE(comp_ctx, thr);
+}
+
+/*
+ * Parse a statement list.
+ *
+ * Handles automatic semicolon insertion and implicit return value.
+ *
+ * Upon entry, 'curr_tok' should contain the first token of the first
+ * statement (parsed in the "allow regexp literal" mode). Upon exit,
+ * 'curr_tok' contains the token following the statement list terminator
+ * (EOF or closing brace).
+ */
+
+DUK_LOCAL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_ivalue res_alloc;
+ duk_ivalue *res = &res_alloc;
+
+ /* Setup state. Initial ivalue is 'undefined'. */
+
+ duk_require_stack(thr, DUK__PARSE_STATEMENTS_SLOTS);
+
+ /* XXX: 'res' setup can be moved to function body level; in fact, two 'res'
+ * intermediate values suffice for parsing of each function. Nesting is needed
+ * for nested functions (which may occur inside expressions).
+ */
+
+ DUK_MEMZERO(&res_alloc, sizeof(res_alloc));
+ res->t = DUK_IVAL_PLAIN;
+ res->x1.t = DUK_ISPEC_VALUE;
+ res->x1.valstack_idx = duk_get_top(thr);
+ res->x2.valstack_idx = res->x1.valstack_idx + 1;
+ duk_push_undefined(thr);
+ duk_push_undefined(thr);
+
+ /* Parse statements until a closing token (EOF or '}') is found. */
+
+ for (;;) {
+ /* Check whether statement list ends. */
+
+ if (expect_eof) {
+ if (comp_ctx->curr_token.t == DUK_TOK_EOF) {
+ break;
+ }
+ } else {
+ if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {
+ break;
+ }
+ }
+
+ /* Check statement type based on the first token type.
+ *
+ * Note: expression parsing helpers expect 'curr_tok' to
+ * contain the first token of the expression upon entry.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("TOKEN %ld (non-whitespace, non-comment)", (long) comp_ctx->curr_token.t));
+
+ duk__parse_stmt(comp_ctx, res, allow_source_elem);
+ }
+
+ duk__advance(comp_ctx);
+
+ /* Tear down state. */
+
+ duk_pop_2(thr);
+}
+
+/*
+ * Declaration binding instantiation conceptually happens when calling a
+ * function; for us it essentially means that function prologue. The
+ * conceptual process is described in E5 Section 10.5.
+ *
+ * We need to keep track of all encountered identifiers to (1) create an
+ * identifier-to-register map ("varmap"); and (2) detect duplicate
+ * declarations. Identifiers which are not bound to registers still need
+ * to be tracked for detecting duplicates. Currently such identifiers
+ * are put into the varmap with a 'null' value, which is later cleaned up.
+ *
+ * To support functions with a large number of variable and function
+ * declarations, registers are not allocated beyond a certain limit;
+ * after that limit, variables and functions need slow path access.
+ * Arguments are currently always register bound, which imposes a hard
+ * (and relatively small) argument count limit.
+ *
+ * Some bindings in E5 are not configurable (= deletable) and almost all
+ * are mutable (writable). Exceptions are:
+ *
+ * - The 'arguments' binding, established only if no shadowing argument
+ * or function declaration exists. We handle 'arguments' creation
+ * and binding through an explicit slow path environment record.
+ *
+ * - The "name" binding for a named function expression. This is also
+ * handled through an explicit slow path environment record.
+ */
+
+/* XXX: add support for variables to not be register bound always, to
+ * handle cases with a very large number of variables?
+ */
+
+DUK_LOCAL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_hstring *h_name;
+ duk_bool_t configurable_bindings;
+ duk_uarridx_t num_args;
+ duk_uarridx_t num_decls;
+ duk_regconst_t rc_name;
+ duk_small_uint_t declvar_flags;
+ duk_uarridx_t i;
+#if defined(DUK_USE_ASSERTIONS)
+ duk_idx_t entry_top;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ entry_top = duk_get_top(thr);
+#endif
+
+ /*
+ * Preliminaries
+ */
+
+ configurable_bindings = comp_ctx->curr_func.is_eval;
+ DUK_DDD(DUK_DDDPRINT("configurable_bindings=%ld", (long) configurable_bindings));
+
+ /* varmap is already in comp_ctx->curr_func.varmap_idx */
+
+ /*
+ * Function formal arguments, always bound to registers
+ * (there's no support for shuffling them now).
+ */
+
+ num_args = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx);
+ DUK_DDD(DUK_DDDPRINT("num_args=%ld", (long) num_args));
+ /* XXX: check num_args */
+
+ for (i = 0; i < num_args; i++) {
+ duk_get_prop_index(thr, comp_ctx->curr_func.argnames_idx, i);
+ h_name = duk_known_hstring(thr, -1);
+
+ if (comp_ctx->curr_func.is_strict) {
+ if (duk__hstring_is_eval_or_arguments(comp_ctx, h_name)) {
+ DUK_DDD(DUK_DDDPRINT("arg named 'eval' or 'arguments' in strict mode -> SyntaxError"));
+ goto error_argname;
+ }
+ duk_dup_top(thr);
+ if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) {
+ DUK_DDD(DUK_DDDPRINT("duplicate arg name in strict mode -> SyntaxError"));
+ goto error_argname;
+ }
+
+ /* Ensure argument name is not a reserved word in current
+ * (final) strictness. Formal argument parsing may not
+ * catch reserved names if strictness changes during
+ * parsing.
+ *
+ * We only need to do this in strict mode because non-strict
+ * keyword are always detected in formal argument parsing.
+ */
+
+ if (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(h_name)) {
+ goto error_argname;
+ }
+ }
+
+ /* overwrite any previous binding of the same name; the effect is
+ * that last argument of a certain name wins.
+ */
+
+ /* only functions can have arguments */
+ DUK_ASSERT(comp_ctx->curr_func.is_function);
+ duk_push_uarridx(thr, i); /* -> [ ... name index ] */
+ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* -> [ ... ] */
+
+ /* no code needs to be emitted, the regs already have values */
+ }
+
+ /* use temp_next for tracking register allocations */
+ DUK__SETTEMP_CHECKMAX(comp_ctx, (duk_regconst_t) num_args);
+
+ /*
+ * After arguments, allocate special registers (like shuffling temps)
+ */
+
+ if (out_stmt_value_reg) {
+ *out_stmt_value_reg = DUK__ALLOCTEMP(comp_ctx);
+ }
+ if (comp_ctx->curr_func.needs_shuffle) {
+ duk_regconst_t shuffle_base = DUK__ALLOCTEMPS(comp_ctx, 3);
+ comp_ctx->curr_func.shuffle1 = shuffle_base;
+ comp_ctx->curr_func.shuffle2 = shuffle_base + 1;
+ comp_ctx->curr_func.shuffle3 = shuffle_base + 2;
+ DUK_D(DUK_DPRINT("shuffle registers needed by function, allocated: %ld %ld %ld",
+ (long) comp_ctx->curr_func.shuffle1,
+ (long) comp_ctx->curr_func.shuffle2,
+ (long) comp_ctx->curr_func.shuffle3));
+ }
+ if (comp_ctx->curr_func.temp_next > 0x100) {
+ DUK_D(DUK_DPRINT("not enough 8-bit regs: temp_next=%ld", (long) comp_ctx->curr_func.temp_next));
+ goto error_outofregs;
+ }
+
+ /*
+ * Function declarations
+ */
+
+ num_decls = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx);
+ DUK_DDD(DUK_DDDPRINT("num_decls=%ld -> %!T",
+ (long) num_decls,
+ (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.decls_idx)));
+ for (i = 0; i < num_decls; i += 2) {
+ duk_int_t decl_type;
+ duk_int_t fnum;
+
+ duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1); /* decl type */
+ decl_type = duk_to_int(thr, -1);
+ fnum = decl_type >> 8; /* XXX: macros */
+ decl_type = decl_type & 0xff;
+ duk_pop(thr);
+
+ if (decl_type != DUK_DECL_TYPE_FUNC) {
+ continue;
+ }
+
+ duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */
+
+ /* XXX: spilling */
+ if (comp_ctx->curr_func.is_function) {
+ duk_regconst_t reg_bind;
+ duk_dup_top(thr);
+ if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) {
+ /* shadowed; update value */
+ duk_dup_top(thr);
+ duk_get_prop(thr, comp_ctx->curr_func.varmap_idx);
+ reg_bind = duk_to_int(thr, -1); /* [ ... name reg_bind ] */
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CLOSURE,
+ reg_bind,
+ (duk_regconst_t) fnum);
+ } else {
+ /* function: always register bound */
+ reg_bind = DUK__ALLOCTEMP(comp_ctx);
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CLOSURE,
+ reg_bind,
+ (duk_regconst_t) fnum);
+ duk_push_int(thr, (duk_int_t) reg_bind);
+ }
+ } else {
+ /* Function declaration for global/eval code is emitted even
+ * for duplicates, because of E5 Section 10.5, step 5.e of
+ * E5.1 (special behavior for variable bound to global object).
+ *
+ * DECLVAR will not re-declare a variable as such, but will
+ * update the binding value.
+ */
+
+ duk_regconst_t reg_temp = DUK__ALLOCTEMP(comp_ctx);
+ duk_dup_top(thr);
+ rc_name = duk__getconst(comp_ctx);
+ duk_push_null(thr);
+
+ duk__emit_a_bc(comp_ctx,
+ DUK_OP_CLOSURE,
+ reg_temp,
+ (duk_regconst_t) fnum);
+
+ declvar_flags = DUK_PROPDESC_FLAG_WRITABLE |
+ DUK_PROPDESC_FLAG_ENUMERABLE |
+ DUK_BC_DECLVAR_FLAG_FUNC_DECL;
+
+ if (configurable_bindings) {
+ declvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;
+ }
+
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST,
+ (duk_regconst_t) declvar_flags /*flags*/,
+ rc_name /*name*/,
+ reg_temp /*value*/);
+
+ DUK__SETTEMP(comp_ctx, reg_temp); /* forget temp */
+ }
+
+ DUK_DDD(DUK_DDDPRINT("function declaration to varmap: %!T -> %!T",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_NULL(duk_get_tval(thr, -1)) || DUK_TVAL_IS_FASTINT(duk_get_tval(thr, -1)));
+#endif
+ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* [ ... name reg/null ] -> [ ... ] */
+ }
+
+ /*
+ * 'arguments' binding is special; if a shadowing argument or
+ * function declaration exists, an arguments object will
+ * definitely not be needed, regardless of whether the identifier
+ * 'arguments' is referenced inside the function body.
+ */
+
+ if (duk_has_prop_stridx(thr, comp_ctx->curr_func.varmap_idx, DUK_STRIDX_LC_ARGUMENTS)) {
+ DUK_DDD(DUK_DDDPRINT("'arguments' is shadowed by argument or function declaration "
+ "-> arguments object creation can be skipped"));
+ comp_ctx->curr_func.is_arguments_shadowed = 1;
+ }
+
+ /*
+ * Variable declarations.
+ *
+ * Unlike function declarations, variable declaration values don't get
+ * assigned on entry. If a binding of the same name already exists, just
+ * ignore it silently.
+ */
+
+ for (i = 0; i < num_decls; i += 2) {
+ duk_int_t decl_type;
+
+ duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1); /* decl type */
+ decl_type = duk_to_int(thr, -1);
+ decl_type = decl_type & 0xff;
+ duk_pop(thr);
+
+ if (decl_type != DUK_DECL_TYPE_VAR) {
+ continue;
+ }
+
+ duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */
+
+ if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) {
+ /* shadowed, ignore */
+ } else {
+ duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */
+ h_name = duk_known_hstring(thr, -1);
+
+ if (h_name == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) &&
+ !comp_ctx->curr_func.is_arguments_shadowed) {
+ /* E5 Section steps 7-8 */
+ DUK_DDD(DUK_DDDPRINT("'arguments' not shadowed by a function declaration, "
+ "but appears as a variable declaration -> treat as "
+ "a no-op for variable declaration purposes"));
+ duk_pop(thr);
+ continue;
+ }
+
+ /* XXX: spilling */
+ if (comp_ctx->curr_func.is_function) {
+ duk_regconst_t reg_bind = DUK__ALLOCTEMP(comp_ctx);
+ /* no need to init reg, it will be undefined on entry */
+ duk_push_int(thr, (duk_int_t) reg_bind);
+ } else {
+ duk_dup_top(thr);
+ rc_name = duk__getconst(comp_ctx);
+ duk_push_null(thr);
+
+ declvar_flags = DUK_PROPDESC_FLAG_WRITABLE |
+ DUK_PROPDESC_FLAG_ENUMERABLE;
+ if (configurable_bindings) {
+ declvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;
+ }
+
+ duk__emit_a_b_c(comp_ctx,
+ DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST,
+ (duk_regconst_t) declvar_flags /*flags*/,
+ rc_name /*name*/,
+ 0 /*value*/);
+ }
+
+ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* [ ... name reg/null ] -> [ ... ] */
+ }
+ }
+
+ /*
+ * Wrap up
+ */
+
+ DUK_DDD(DUK_DDDPRINT("varmap: %!T, is_arguments_shadowed=%ld",
+ (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx),
+ (long) comp_ctx->curr_func.is_arguments_shadowed));
+
+ DUK_ASSERT_TOP(thr, entry_top);
+ return;
+
+ error_outofregs:
+ DUK_ERROR_RANGE(thr, DUK_STR_REG_LIMIT);
+ DUK_UNREACHABLE();
+ return;
+
+ error_argname:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARG_NAME);
+ DUK_UNREACHABLE();
+ return;
+}
+
+/*
+ * Parse a function-body-like expression (FunctionBody or Program
+ * in E5 grammar) using a two-pass parse. The productions appear
+ * in the following contexts:
+ *
+ * - function expression
+ * - function statement
+ * - function declaration
+ * - getter in object literal
+ * - setter in object literal
+ * - global code
+ * - eval code
+ * - Function constructor body
+ *
+ * This function only parses the statement list of the body; the argument
+ * list and possible function name must be initialized by the caller.
+ * For instance, for Function constructor, the argument names are originally
+ * on the value stack. The parsing of statements ends either at an EOF or
+ * a closing brace; this is controlled by an input flag.
+ *
+ * Note that there are many differences affecting parsing and even code
+ * generation:
+ *
+ * - Global and eval code have an implicit return value generated
+ * by the last statement; function code does not
+ *
+ * - Global code, eval code, and Function constructor body end in
+ * an EOF, other bodies in a closing brace ('}')
+ *
+ * Upon entry, 'curr_tok' is ignored and the function will pull in the
+ * first token on its own. Upon exit, 'curr_tok' is the terminating
+ * token (EOF or closing brace).
+ */
+
+DUK_LOCAL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token) {
+ duk_compiler_func *func;
+ duk_hthread *thr;
+ duk_regconst_t reg_stmt_value = -1;
+ duk_lexer_point lex_pt;
+ duk_regconst_t temp_first;
+ duk_small_int_t compile_round = 1;
+
+ DUK_ASSERT(comp_ctx != NULL);
+
+ thr = comp_ctx->thr;
+ DUK_ASSERT(thr != NULL);
+
+ func = &comp_ctx->curr_func;
+ DUK_ASSERT(func != NULL);
+
+ DUK__RECURSION_INCREASE(comp_ctx, thr);
+
+ duk_require_stack(thr, DUK__FUNCTION_BODY_REQUIRE_SLOTS);
+
+ /*
+ * Store lexer position for a later rewind
+ */
+
+ DUK_LEXER_GETPOINT(&comp_ctx->lex, &lex_pt);
+
+ /*
+ * Program code (global and eval code) has an implicit return value
+ * from the last statement value (e.g. eval("1; 2+3;") returns 3).
+ * This is not the case with functions. If implicit statement return
+ * value is requested, all statements are coerced to a register
+ * allocated here, and used in the implicit return statement below.
+ */
+
+ /* XXX: this is pointless here because pass 1 is throw-away */
+ if (implicit_return_value) {
+ reg_stmt_value = DUK__ALLOCTEMP(comp_ctx);
+
+ /* If an implicit return value is needed by caller, it must be
+ * initialized to 'undefined' because we don't know whether any
+ * non-empty (where "empty" is a continuation type, and different
+ * from an empty statement) statements will be executed.
+ *
+ * However, since 1st pass is a throwaway one, no need to emit
+ * it here.
+ */
+#if 0
+ duk__emit_bc(comp_ctx,
+ DUK_OP_LDUNDEF,
+ 0);
+#endif
+ }
+
+ /*
+ * First pass.
+ *
+ * Gather variable/function declarations needed for second pass.
+ * Code generated is dummy and discarded.
+ */
+
+ func->in_directive_prologue = 1;
+ func->in_scanning = 1;
+ func->may_direct_eval = 0;
+ func->id_access_arguments = 0;
+ func->id_access_slow = 0;
+ func->id_access_slow_own = 0;
+ func->reg_stmt_value = reg_stmt_value;
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ func->min_line = DUK_INT_MAX;
+ func->max_line = 0;
+#endif
+
+ /* duk__parse_stmts() expects curr_tok to be set; parse in "allow regexp literal" mode with current strictness */
+ if (expect_token >= 0) {
+ /* Eating a left curly; regexp mode is allowed by left curly
+ * based on duk__token_lbp[] automatically.
+ */
+ DUK_ASSERT(expect_token == DUK_TOK_LCURLY);
+ duk__update_lineinfo_currtoken(comp_ctx);
+ duk__advance_expect(comp_ctx, expect_token);
+ } else {
+ /* Need to set curr_token.t because lexing regexp mode depends on current
+ * token type. Zero value causes "allow regexp" mode.
+ */
+ comp_ctx->curr_token.t = 0;
+ duk__advance(comp_ctx);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("begin 1st pass"));
+ duk__parse_stmts(comp_ctx,
+ 1, /* allow source elements */
+ expect_eof); /* expect EOF instead of } */
+ DUK_DDD(DUK_DDDPRINT("end 1st pass"));
+
+ /*
+ * Second (and possibly third) pass.
+ *
+ * Generate actual code. In most cases the need for shuffle
+ * registers is detected during pass 1, but in some corner cases
+ * we'll only detect it during pass 2 and a third pass is then
+ * needed (see GH-115).
+ */
+
+ for (;;) {
+ duk_bool_t needs_shuffle_before = comp_ctx->curr_func.needs_shuffle;
+ compile_round++;
+
+ /*
+ * Rewind lexer.
+ *
+ * duk__parse_stmts() expects curr_tok to be set; parse in "allow regexp
+ * literal" mode with current strictness.
+ *
+ * curr_token line number info should be initialized for pass 2 before
+ * generating prologue, to ensure prologue bytecode gets nice line numbers.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("rewind lexer"));
+ DUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt);
+ comp_ctx->curr_token.t = 0; /* this is needed for regexp mode */
+ comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */
+ duk__advance(comp_ctx);
+
+ /*
+ * Reset function state and perform register allocation, which creates
+ * 'varmap' for second pass. Function prologue for variable declarations,
+ * binding value initializations etc is emitted as a by-product.
+ *
+ * Strict mode restrictions for duplicate and invalid argument
+ * names are checked here now that we know whether the function
+ * is actually strict. See: test-dev-strict-mode-boundary.js.
+ *
+ * Inner functions are compiled during pass 1 and are not reset.
+ */
+
+ duk__reset_func_for_pass2(comp_ctx);
+ func->in_directive_prologue = 1;
+ func->in_scanning = 0;
+
+ /* must be able to emit code, alloc consts, etc. */
+
+ duk__init_varmap_and_prologue_for_pass2(comp_ctx,
+ (implicit_return_value ? &reg_stmt_value : NULL));
+ func->reg_stmt_value = reg_stmt_value;
+
+ temp_first = DUK__GETTEMP(comp_ctx);
+
+ func->temp_first = temp_first;
+ func->temp_next = temp_first;
+ func->stmt_next = 0;
+ func->label_next = 0;
+
+ /* XXX: init or assert catch depth etc -- all values */
+ func->id_access_arguments = 0;
+ func->id_access_slow = 0;
+ func->id_access_slow_own = 0;
+
+ /*
+ * Check function name validity now that we know strictness.
+ * This only applies to function declarations and expressions,
+ * not setter/getter name.
+ *
+ * See: test-dev-strict-mode-boundary.js
+ */
+
+ if (func->is_function && !func->is_setget && func->h_name != NULL) {
+ if (func->is_strict) {
+ if (duk__hstring_is_eval_or_arguments(comp_ctx, func->h_name)) {
+ DUK_DDD(DUK_DDDPRINT("func name is 'eval' or 'arguments' in strict mode"));
+ goto error_funcname;
+ }
+ if (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) {
+ DUK_DDD(DUK_DDDPRINT("func name is a reserved word in strict mode"));
+ goto error_funcname;
+ }
+ } else {
+ if (DUK_HSTRING_HAS_RESERVED_WORD(func->h_name) &&
+ !DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) {
+ DUK_DDD(DUK_DDDPRINT("func name is a reserved word in non-strict mode"));
+ goto error_funcname;
+ }
+ }
+ }
+
+ /*
+ * Second pass parsing.
+ */
+
+ if (implicit_return_value) {
+ /* Default implicit return value. */
+ duk__emit_bc(comp_ctx,
+ DUK_OP_LDUNDEF,
+ 0);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("begin 2nd pass"));
+ duk__parse_stmts(comp_ctx,
+ 1, /* allow source elements */
+ expect_eof); /* expect EOF instead of } */
+ DUK_DDD(DUK_DDDPRINT("end 2nd pass"));
+
+ duk__update_lineinfo_currtoken(comp_ctx);
+
+ if (needs_shuffle_before == comp_ctx->curr_func.needs_shuffle) {
+ /* Shuffle decision not changed. */
+ break;
+ }
+ if (compile_round >= 3) {
+ /* Should never happen but avoid infinite loop just in case. */
+ DUK_D(DUK_DPRINT("more than 3 compile passes needed, should never happen"));
+ DUK_ERROR_INTERNAL(thr);
+ }
+ DUK_D(DUK_DPRINT("need additional round to compile function, round now %d", (int) compile_round));
+ }
+
+ /*
+ * Emit a final RETURN.
+ *
+ * It would be nice to avoid emitting an unnecessary "return" opcode
+ * if the current PC is not reachable. However, this cannot be reliably
+ * detected; even if the previous instruction is an unconditional jump,
+ * there may be a previous jump which jumps to current PC (which is the
+ * case for iteration and conditional statements, for instance).
+ */
+
+ /* XXX: request a "last statement is terminal" from duk__parse_stmt() and duk__parse_stmts();
+ * we could avoid the last RETURN if we could ensure there is no way to get here
+ * (directly or via a jump)
+ */
+
+ DUK_ASSERT(comp_ctx->curr_func.catch_depth == 0);
+ if (reg_stmt_value >= 0) {
+ DUK_ASSERT(DUK__ISREG(reg_stmt_value));
+ duk__emit_bc(comp_ctx, DUK_OP_RETREG, reg_stmt_value /*reg*/);
+ } else {
+ duk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF);
+ }
+
+ /*
+ * Peephole optimize JUMP chains.
+ */
+
+ duk__peephole_optimize_bytecode(comp_ctx);
+
+ /*
+ * comp_ctx->curr_func is now ready to be converted into an actual
+ * function template.
+ */
+
+ DUK__RECURSION_DECREASE(comp_ctx, thr);
+ return;
+
+ error_funcname:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FUNC_NAME);
+}
+
+/*
+ * Parse a function-like expression:
+ *
+ * - function expression
+ * - function declaration
+ * - function statement (non-standard)
+ * - setter/getter
+ *
+ * Adds the function to comp_ctx->curr_func function table and returns the
+ * function number.
+ *
+ * On entry, curr_token points to:
+ *
+ * - the token after 'function' for function expression/declaration/statement
+ * - the token after 'set' or 'get' for setter/getter
+ */
+
+/* Parse formals. */
+DUK_LOCAL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_bool_t first = 1;
+ duk_uarridx_t n;
+
+ for (;;) {
+ if (comp_ctx->curr_token.t == DUK_TOK_RPAREN) {
+ break;
+ }
+
+ if (first) {
+ /* no comma */
+ first = 0;
+ } else {
+ duk__advance_expect(comp_ctx, DUK_TOK_COMMA);
+ }
+
+ /* Note: when parsing a formal list in non-strict context, e.g.
+ * "implements" is parsed as an identifier. When the function is
+ * later detected to be strict, the argument list must be rechecked
+ * against a larger set of reserved words (that of strict mode).
+ * This is handled by duk__parse_func_body(). Here we recognize
+ * whatever tokens are considered reserved in current strictness
+ * (which is not always enough).
+ */
+
+ if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER);
+ }
+ DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER);
+ DUK_ASSERT(comp_ctx->curr_token.str1 != NULL);
+ DUK_DDD(DUK_DDDPRINT("formal argument: %!O",
+ (duk_heaphdr *) comp_ctx->curr_token.str1));
+
+ /* XXX: append primitive */
+ duk_push_hstring(thr, comp_ctx->curr_token.str1);
+ n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx);
+ duk_put_prop_index(thr, comp_ctx->curr_func.argnames_idx, n);
+
+ duk__advance(comp_ctx); /* eat identifier */
+ }
+}
+
+/* Parse a function-like expression, assuming that 'comp_ctx->curr_func' is
+ * correctly set up. Assumes that curr_token is just after 'function' (or
+ * 'set'/'get' etc).
+ */
+DUK_LOCAL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_token *tok;
+ duk_bool_t no_advance;
+
+ DUK_ASSERT(comp_ctx->curr_func.num_formals == 0);
+ DUK_ASSERT(comp_ctx->curr_func.is_function == 1);
+ DUK_ASSERT(comp_ctx->curr_func.is_eval == 0);
+ DUK_ASSERT(comp_ctx->curr_func.is_global == 0);
+ DUK_ASSERT(comp_ctx->curr_func.is_setget == ((flags & DUK__FUNC_FLAG_GETSET) != 0));
+
+ duk__update_lineinfo_currtoken(comp_ctx);
+
+ /*
+ * Function name (if any)
+ *
+ * We don't check for prohibited names here, because we don't
+ * yet know whether the function will be strict. Function body
+ * parsing handles this retroactively.
+ *
+ * For function expressions and declarations function name must
+ * be an Identifer (excludes reserved words). For setter/getter
+ * it is a PropertyName which allows reserved words and also
+ * strings and numbers (e.g. "{ get 1() { ... } }").
+ *
+ * Function parsing may start either from prev_token or curr_token
+ * (object literal method definition uses prev_token for example).
+ * This is dealt with for the initial token.
+ */
+
+ no_advance = (flags & DUK__FUNC_FLAG_USE_PREVTOKEN);
+ if (no_advance) {
+ tok = &comp_ctx->prev_token;
+ } else {
+ tok = &comp_ctx->curr_token;
+ }
+
+ if (flags & DUK__FUNC_FLAG_GETSET) {
+ /* PropertyName -> IdentifierName | StringLiteral | NumericLiteral */
+ if (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t == DUK_TOK_STRING) {
+ duk_push_hstring(thr, tok->str1); /* keep in valstack */
+ } else if (tok->t == DUK_TOK_NUMBER) {
+ duk_push_number(thr, tok->num);
+ duk_to_string(thr, -1);
+ } else {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_GETSET_NAME);
+ }
+ comp_ctx->curr_func.h_name = duk_known_hstring(thr, -1); /* borrowed reference */
+ } else {
+ /* Function name is an Identifier (not IdentifierName), but we get
+ * the raw name (not recognizing keywords) here and perform the name
+ * checks only after pass 1.
+ */
+ if (tok->t_nores == DUK_TOK_IDENTIFIER) {
+ duk_push_hstring(thr, tok->str1); /* keep in valstack */
+ comp_ctx->curr_func.h_name = duk_known_hstring(thr, -1); /* borrowed reference */
+ } else {
+ /* valstack will be unbalanced, which is OK */
+ DUK_ASSERT((flags & DUK__FUNC_FLAG_GETSET) == 0);
+ DUK_ASSERT(comp_ctx->curr_func.h_name == NULL);
+ no_advance = 1;
+ if (flags & DUK__FUNC_FLAG_DECL) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_NAME_REQUIRED);
+ }
+ }
+ }
+
+ DUK_DD(DUK_DDPRINT("function name: %!O",
+ (duk_heaphdr *) comp_ctx->curr_func.h_name));
+
+ if (!no_advance) {
+ duk__advance(comp_ctx);
+ }
+
+ /*
+ * Formal argument list
+ *
+ * We don't check for prohibited names or for duplicate argument
+ * names here, becase we don't yet know whether the function will
+ * be strict. Function body parsing handles this retroactively.
+ */
+
+ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN);
+
+ duk__parse_func_formals(comp_ctx);
+
+ DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RPAREN);
+ duk__advance(comp_ctx);
+
+ /*
+ * Parse function body
+ */
+
+ duk__parse_func_body(comp_ctx,
+ 0, /* expect_eof */
+ 0, /* implicit_return_value */
+ DUK_TOK_LCURLY); /* expect_token */
+
+ /*
+ * Convert duk_compiler_func to a function template and add it
+ * to the parent function table.
+ */
+
+ duk__convert_to_func_template(comp_ctx); /* -> [ ... func ] */
+}
+
+/* Parse an inner function, adding the function template to the current function's
+ * function table. Return a function number to be used by the outer function.
+ *
+ * Avoiding O(depth^2) inner function parsing is handled here. On the first pass,
+ * compile and register the function normally into the 'funcs' array, also recording
+ * a lexer point (offset/line) to the closing brace of the function. On the second
+ * pass, skip the function and return the same 'fnum' as on the first pass by using
+ * a running counter.
+ *
+ * An unfortunate side effect of this is that when parsing the inner function, almost
+ * nothing is known of the outer function, i.e. the inner function's scope. We don't
+ * need that information at the moment, but it would allow some optimizations if it
+ * were used.
+ */
+DUK_LOCAL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) {
+ duk_hthread *thr = comp_ctx->thr;
+ duk_compiler_func old_func;
+ duk_idx_t entry_top;
+ duk_int_t fnum;
+
+ /*
+ * On second pass, skip the function.
+ */
+
+ if (!comp_ctx->curr_func.in_scanning) {
+ duk_lexer_point lex_pt;
+
+ fnum = comp_ctx->curr_func.fnum_next++;
+ duk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1));
+ lex_pt.offset = (duk_size_t) duk_to_uint(thr, -1);
+ duk_pop(thr);
+ duk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2));
+ lex_pt.line = duk_to_int(thr, -1);
+ duk_pop(thr);
+
+ DUK_DDD(DUK_DDDPRINT("second pass of an inner func, skip the function, reparse closing brace; lex offset=%ld, line=%ld",
+ (long) lex_pt.offset, (long) lex_pt.line));
+
+ DUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt);
+ comp_ctx->curr_token.t = 0; /* this is needed for regexp mode */
+ comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */
+ duk__advance(comp_ctx);
+ duk__advance_expect(comp_ctx, DUK_TOK_RCURLY);
+
+ return fnum;
+ }
+
+ /*
+ * On first pass, perform actual parsing. Remember valstack top on entry
+ * to restore it later, and switch to using a new function in comp_ctx.
+ */
+
+ entry_top = duk_get_top(thr);
+ DUK_DDD(DUK_DDDPRINT("before func: entry_top=%ld, curr_tok.start_offset=%ld",
+ (long) entry_top, (long) comp_ctx->curr_token.start_offset));
+
+ DUK_MEMCPY(&old_func, &comp_ctx->curr_func, sizeof(duk_compiler_func));
+
+ DUK_MEMZERO(&comp_ctx->curr_func, sizeof(duk_compiler_func));
+ duk__init_func_valstack_slots(comp_ctx);
+ DUK_ASSERT(comp_ctx->curr_func.num_formals == 0);
+
+ /* inherit initial strictness from parent */
+ comp_ctx->curr_func.is_strict = old_func.is_strict;
+
+ /* XXX: It might be better to just store the flags into the curr_func
+ * struct and use them as is without this flag interpretation step
+ * here.
+ */
+ DUK_ASSERT(comp_ctx->curr_func.is_notail == 0);
+ comp_ctx->curr_func.is_function = 1;
+ DUK_ASSERT(comp_ctx->curr_func.is_eval == 0);
+ DUK_ASSERT(comp_ctx->curr_func.is_global == 0);
+ comp_ctx->curr_func.is_setget = ((flags & DUK__FUNC_FLAG_GETSET) != 0);
+ comp_ctx->curr_func.is_namebinding = !(flags & (DUK__FUNC_FLAG_GETSET |
+ DUK__FUNC_FLAG_METDEF |
+ DUK__FUNC_FLAG_DECL)); /* no name binding for: declarations, objlit getset, objlit method def */
+ comp_ctx->curr_func.is_constructable = !(flags & (DUK__FUNC_FLAG_GETSET |
+ DUK__FUNC_FLAG_METDEF)); /* not constructable: objlit getset, objlit method def */
+
+ /*
+ * Parse inner function
+ */
+
+ duk__parse_func_like_raw(comp_ctx, flags); /* pushes function template */
+
+ /* prev_token.start_offset points to the closing brace here; when skipping
+ * we're going to reparse the closing brace to ensure semicolon insertion
+ * etc work as expected.
+ */
+ DUK_DDD(DUK_DDDPRINT("after func: prev_tok.start_offset=%ld, curr_tok.start_offset=%ld",
+ (long) comp_ctx->prev_token.start_offset, (long) comp_ctx->curr_token.start_offset));
+ DUK_ASSERT(comp_ctx->lex.input[comp_ctx->prev_token.start_offset] == (duk_uint8_t) DUK_ASC_RCURLY);
+
+ /* XXX: append primitive */
+ DUK_ASSERT(duk_get_length(thr, old_func.funcs_idx) == (duk_size_t) (old_func.fnum_next * 3));
+ fnum = old_func.fnum_next++;
+
+ if (fnum > DUK__MAX_FUNCS) {
+ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_FUNC_LIMIT);
+ }
+
+ /* array writes autoincrement length */
+ (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3));
+ duk_push_size_t(thr, comp_ctx->prev_token.start_offset);
+ (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1));
+ duk_push_int(thr, comp_ctx->prev_token.start_line);
+ (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2));
+
+ /*
+ * Cleanup: restore original function, restore valstack state.
+ *
+ * Function declaration handling needs the function name to be pushed
+ * on the value stack.
+ */
+
+ if (flags & DUK__FUNC_FLAG_PUSHNAME_PASS1) {
+ DUK_ASSERT(comp_ctx->curr_func.h_name != NULL);
+ duk_push_hstring(thr, comp_ctx->curr_func.h_name);
+ duk_replace(thr, entry_top);
+ duk_set_top(thr, entry_top + 1);
+ } else {
+ duk_set_top(thr, entry_top);
+ }
+ DUK_MEMCPY((void *) &comp_ctx->curr_func, (void *) &old_func, sizeof(duk_compiler_func));
+
+ return fnum;
+}
+
+/*
+ * Compile input string into an executable function template without
+ * arguments.
+ *
+ * The string is parsed as the "Program" production of Ecmascript E5.
+ * Compilation context can be either global code or eval code (see E5
+ * Sections 14 and 15.1.2.1).
+ *
+ * Input stack: [ ... filename ]
+ * Output stack: [ ... func_template ]
+ */
+
+/* XXX: source code property */
+
+DUK_LOCAL duk_ret_t duk__js_compile_raw(duk_hthread *thr, void *udata) {
+ duk_hstring *h_filename;
+ duk__compiler_stkstate *comp_stk;
+ duk_compiler_ctx *comp_ctx;
+ duk_lexer_point *lex_pt;
+ duk_compiler_func *func;
+ duk_idx_t entry_top;
+ duk_bool_t is_strict;
+ duk_bool_t is_eval;
+ duk_bool_t is_funcexpr;
+ duk_small_uint_t flags;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(udata != NULL);
+
+ /*
+ * Arguments check
+ */
+
+ entry_top = duk_get_top(thr);
+ DUK_ASSERT(entry_top >= 1);
+
+ comp_stk = (duk__compiler_stkstate *) udata;
+ comp_ctx = &comp_stk->comp_ctx_alloc;
+ lex_pt = &comp_stk->lex_pt_alloc;
+ DUK_ASSERT(comp_ctx != NULL);
+ DUK_ASSERT(lex_pt != NULL);
+
+ flags = comp_stk->flags;
+ is_eval = (flags & DUK_COMPILE_EVAL ? 1 : 0);
+ is_strict = (flags & DUK_COMPILE_STRICT ? 1 : 0);
+ is_funcexpr = (flags & DUK_COMPILE_FUNCEXPR ? 1 : 0);
+
+ h_filename = duk_get_hstring(thr, -1); /* may be undefined */
+
+ /*
+ * Init compiler and lexer contexts
+ */
+
+ func = &comp_ctx->curr_func;
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ comp_ctx->thr = NULL;
+ comp_ctx->h_filename = NULL;
+ comp_ctx->prev_token.str1 = NULL;
+ comp_ctx->prev_token.str2 = NULL;
+ comp_ctx->curr_token.str1 = NULL;
+ comp_ctx->curr_token.str2 = NULL;
+#endif
+
+ duk_require_stack(thr, DUK__COMPILE_ENTRY_SLOTS);
+
+ duk_push_dynamic_buffer(thr, 0); /* entry_top + 0 */
+ duk_push_undefined(thr); /* entry_top + 1 */
+ duk_push_undefined(thr); /* entry_top + 2 */
+ duk_push_undefined(thr); /* entry_top + 3 */
+ duk_push_undefined(thr); /* entry_top + 4 */
+
+ comp_ctx->thr = thr;
+ comp_ctx->h_filename = h_filename;
+ comp_ctx->tok11_idx = entry_top + 1;
+ comp_ctx->tok12_idx = entry_top + 2;
+ comp_ctx->tok21_idx = entry_top + 3;
+ comp_ctx->tok22_idx = entry_top + 4;
+ comp_ctx->recursion_limit = DUK_USE_COMPILER_RECLIMIT;
+
+ /* comp_ctx->lex has been pre-initialized by caller: it has been
+ * zeroed and input/input_length has been set.
+ */
+ comp_ctx->lex.thr = thr;
+ /* comp_ctx->lex.input and comp_ctx->lex.input_length filled by caller */
+ comp_ctx->lex.slot1_idx = comp_ctx->tok11_idx;
+ comp_ctx->lex.slot2_idx = comp_ctx->tok12_idx;
+ comp_ctx->lex.buf_idx = entry_top + 0;
+ comp_ctx->lex.buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 0);
+ DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(comp_ctx->lex.buf) && !DUK_HBUFFER_HAS_EXTERNAL(comp_ctx->lex.buf));
+ comp_ctx->lex.token_limit = DUK_COMPILER_TOKEN_LIMIT;
+
+ lex_pt->offset = 0;
+ lex_pt->line = 1;
+ DUK_LEXER_SETPOINT(&comp_ctx->lex, lex_pt); /* fills window */
+ comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */
+
+ /*
+ * Initialize function state for a zero-argument function
+ */
+
+ duk__init_func_valstack_slots(comp_ctx);
+ DUK_ASSERT(func->num_formals == 0);
+
+ if (is_funcexpr) {
+ /* Name will be filled from function expression, not by caller.
+ * This case is used by Function constructor and duk_compile()
+ * API with the DUK_COMPILE_FUNCTION option.
+ */
+ DUK_ASSERT(func->h_name == NULL);
+ } else {
+ duk_push_hstring_stridx(thr, (is_eval ? DUK_STRIDX_EVAL :
+ DUK_STRIDX_GLOBAL));
+ func->h_name = duk_get_hstring(thr, -1);
+ }
+
+ /*
+ * Parse a function body or a function-like expression, depending
+ * on flags.
+ */
+
+ DUK_ASSERT(func->is_setget == 0);
+ func->is_strict = (duk_uint8_t) is_strict;
+ DUK_ASSERT(func->is_notail == 0);
+
+ if (is_funcexpr) {
+ func->is_function = 1;
+ DUK_ASSERT(func->is_eval == 0);
+ DUK_ASSERT(func->is_global == 0);
+ func->is_namebinding = 1;
+ func->is_constructable = 1;
+
+ duk__advance(comp_ctx); /* init 'curr_token' */
+ duk__advance_expect(comp_ctx, DUK_TOK_FUNCTION);
+ (void) duk__parse_func_like_raw(comp_ctx, 0 /*flags*/);
+ } else {
+ DUK_ASSERT(func->is_function == 0);
+ DUK_ASSERT(is_eval == 0 || is_eval == 1);
+ func->is_eval = (duk_uint8_t) is_eval;
+ func->is_global = (duk_uint8_t) !is_eval;
+ DUK_ASSERT(func->is_namebinding == 0);
+ DUK_ASSERT(func->is_constructable == 0);
+
+ duk__parse_func_body(comp_ctx,
+ 1, /* expect_eof */
+ 1, /* implicit_return_value */
+ -1); /* expect_token */
+ }
+
+ /*
+ * Convert duk_compiler_func to a function template
+ */
+
+ duk__convert_to_func_template(comp_ctx);
+
+ /*
+ * Wrapping duk_safe_call() will mangle the stack, just return stack top
+ */
+
+ /* [ ... filename (temps) func ] */
+
+ return 1;
+}
+
+DUK_INTERNAL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags) {
+ duk__compiler_stkstate comp_stk;
+ duk_compiler_ctx *prev_ctx;
+ duk_ret_t safe_rc;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(src_buffer != NULL);
+
+ /* preinitialize lexer state partially */
+ DUK_MEMZERO(&comp_stk, sizeof(comp_stk));
+ comp_stk.flags = flags;
+ DUK_LEXER_INITCTX(&comp_stk.comp_ctx_alloc.lex);
+ comp_stk.comp_ctx_alloc.lex.input = src_buffer;
+ comp_stk.comp_ctx_alloc.lex.input_length = src_length;
+ comp_stk.comp_ctx_alloc.lex.flags = flags; /* Forward flags directly for now. */
+
+ /* [ ... filename ] */
+
+ prev_ctx = thr->compile_ctx;
+ thr->compile_ctx = &comp_stk.comp_ctx_alloc; /* for duk_error_augment.c */
+ safe_rc = duk_safe_call(thr, duk__js_compile_raw, (void *) &comp_stk /*udata*/, 1 /*nargs*/, 1 /*nrets*/);
+ thr->compile_ctx = prev_ctx; /* must restore reliably before returning */
+
+ if (safe_rc != DUK_EXEC_SUCCESS) {
+ DUK_D(DUK_DPRINT("compilation failed: %!T", duk_get_tval(thr, -1)));
+ (void) duk_throw(thr);
+ }
+
+ /* [ ... template ] */
+}
+
+/* automatic undefs */
+#undef DUK__ALLOCTEMP
+#undef DUK__ALLOCTEMPS
+#undef DUK__ALLOW_AUTO_SEMI_ALWAYS
+#undef DUK__BC_INITIAL_INSTS
+#undef DUK__BP_ADDITIVE
+#undef DUK__BP_ASSIGNMENT
+#undef DUK__BP_BAND
+#undef DUK__BP_BOR
+#undef DUK__BP_BXOR
+#undef DUK__BP_CALL
+#undef DUK__BP_CLOSING
+#undef DUK__BP_COMMA
+#undef DUK__BP_CONDITIONAL
+#undef DUK__BP_EOF
+#undef DUK__BP_EQUALITY
+#undef DUK__BP_EXPONENTIATION
+#undef DUK__BP_FOR_EXPR
+#undef DUK__BP_INVALID
+#undef DUK__BP_LAND
+#undef DUK__BP_LOR
+#undef DUK__BP_MEMBER
+#undef DUK__BP_MULTIPLICATIVE
+#undef DUK__BP_POSTFIX
+#undef DUK__BP_RELATIONAL
+#undef DUK__BP_SHIFT
+#undef DUK__COMPILE_ENTRY_SLOTS
+#undef DUK__CONST_MARKER
+#undef DUK__DUMP_ISPEC
+#undef DUK__DUMP_IVALUE
+#undef DUK__EMIT_FLAG_A_IS_SOURCE
+#undef DUK__EMIT_FLAG_BC_REGCONST
+#undef DUK__EMIT_FLAG_B_IS_TARGET
+#undef DUK__EMIT_FLAG_C_IS_TARGET
+#undef DUK__EMIT_FLAG_NO_SHUFFLE_A
+#undef DUK__EMIT_FLAG_NO_SHUFFLE_B
+#undef DUK__EMIT_FLAG_NO_SHUFFLE_C
+#undef DUK__EMIT_FLAG_RESERVE_JUMPSLOT
+#undef DUK__EXPR_FLAG_ALLOW_EMPTY
+#undef DUK__EXPR_FLAG_REJECT_IN
+#undef DUK__EXPR_FLAG_REQUIRE_INIT
+#undef DUK__EXPR_RBP_MASK
+#undef DUK__FUNCTION_BODY_REQUIRE_SLOTS
+#undef DUK__FUNCTION_INIT_REQUIRE_SLOTS
+#undef DUK__FUNC_FLAG_DECL
+#undef DUK__FUNC_FLAG_GETSET
+#undef DUK__FUNC_FLAG_METDEF
+#undef DUK__FUNC_FLAG_PUSHNAME_PASS1
+#undef DUK__FUNC_FLAG_USE_PREVTOKEN
+#undef DUK__GETCONST_MAX_CONSTS_CHECK
+#undef DUK__GETTEMP
+#undef DUK__HAS_TERM
+#undef DUK__HAS_VAL
+#undef DUK__ISCONST
+#undef DUK__ISREG
+#undef DUK__ISREG_NOTTEMP
+#undef DUK__ISREG_TEMP
+#undef DUK__IS_TERMINAL
+#undef DUK__IVAL_FLAG_ALLOW_CONST
+#undef DUK__IVAL_FLAG_REQUIRE_SHORT
+#undef DUK__IVAL_FLAG_REQUIRE_TEMP
+#undef DUK__MAX_ARRAY_INIT_VALUES
+#undef DUK__MAX_CONSTS
+#undef DUK__MAX_FUNCS
+#undef DUK__MAX_OBJECT_INIT_PAIRS
+#undef DUK__MAX_TEMPS
+#undef DUK__MK_LBP
+#undef DUK__MK_LBP_FLAGS
+#undef DUK__OBJ_LIT_KEY_GET
+#undef DUK__OBJ_LIT_KEY_PLAIN
+#undef DUK__OBJ_LIT_KEY_SET
+#undef DUK__PARSE_EXPR_SLOTS
+#undef DUK__PARSE_STATEMENTS_SLOTS
+#undef DUK__RECURSION_DECREASE
+#undef DUK__RECURSION_INCREASE
+#undef DUK__REMOVECONST
+#undef DUK__SETTEMP
+#undef DUK__SETTEMP_CHECKMAX
+#undef DUK__STILL_PROLOGUE
+#undef DUK__TOKEN_LBP_BP_MASK
+#undef DUK__TOKEN_LBP_FLAG_NO_REGEXP
+#undef DUK__TOKEN_LBP_FLAG_TERMINATES
+#undef DUK__TOKEN_LBP_FLAG_UNUSED
+#undef DUK__TOKEN_LBP_GET_BP
+#line 1 "duk_js_executor.c"
+/*
+ * Ecmascript bytecode executor.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Local declarations.
+ */
+
+DUK_LOCAL_DECL void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act);
+
+/*
+ * Misc helpers.
+ */
+
+/* Forced inline declaration, only applied for performance oriented build. */
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+#define DUK__INLINE_PERF
+#define DUK__NOINLINE_PERF
+#else
+#define DUK__INLINE_PERF DUK_ALWAYS_INLINE
+#define DUK__NOINLINE_PERF DUK_NOINLINE
+#endif
+
+/* Replace value stack top to value at 'tv_ptr'. Optimize for
+ * performance by only applying the net refcount change.
+ */
+#define DUK__REPLACE_TO_TVPTR(thr,tv_ptr) do { \
+ duk_hthread *duk__thr; \
+ duk_tval *duk__tvsrc; \
+ duk_tval *duk__tvdst; \
+ duk_tval duk__tvtmp; \
+ duk__thr = (thr); \
+ duk__tvsrc = DUK_GET_TVAL_NEGIDX(duk__thr, -1); \
+ duk__tvdst = (tv_ptr); \
+ DUK_TVAL_SET_TVAL(&duk__tvtmp, duk__tvdst); \
+ DUK_TVAL_SET_TVAL(duk__tvdst, duk__tvsrc); \
+ DUK_TVAL_SET_UNDEFINED(duk__tvsrc); /* value stack init policy */ \
+ duk__thr->valstack_top = duk__tvsrc; \
+ DUK_TVAL_DECREF(duk__thr, &duk__tvtmp); \
+ } while (0)
+
+/* XXX: candidate of being an internal shared API call */
+#if 0 /* unused */
+DUK_LOCAL void duk__push_tvals_incref_only(duk_hthread *thr, duk_tval *tv_src, duk_small_uint_fast_t count) {
+ duk_tval *tv_dst;
+ duk_size_t copy_size;
+ duk_size_t i;
+
+ tv_dst = thr->valstack_top;
+ copy_size = sizeof(duk_tval) * count;
+ DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, copy_size);
+ for (i = 0; i < count; i++) {
+ DUK_TVAL_INCREF(thr, tv_dst);
+ tv_dst++;
+ }
+ thr->valstack_top = tv_dst;
+}
+#endif
+
+/*
+ * Arithmetic, binary, and logical helpers.
+ *
+ * Note: there is no opcode for logical AND or logical OR; this is on
+ * purpose, because the evalution order semantics for them make such
+ * opcodes pretty pointless: short circuiting means they are most
+ * comfortably implemented as jumps. However, a logical NOT opcode
+ * is useful.
+ *
+ * Note: careful with duk_tval pointers here: they are potentially
+ * invalidated by any DECREF and almost any API call. It's still
+ * preferable to work without making a copy but that's not always
+ * possible.
+ */
+
+DUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_mod(duk_double_t d1, duk_double_t d2) {
+ return (duk_double_t) duk_js_arith_mod((double) d1, (double) d2);
+}
+
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+DUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_exp(duk_double_t d1, duk_double_t d2) {
+ return (duk_double_t) duk_js_arith_pow((double) d1, (double) d2);
+}
+#endif
+
+DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_add(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z) {
+ /*
+ * Addition operator is different from other arithmetic
+ * operations in that it also provides string concatenation.
+ * Hence it is implemented separately.
+ *
+ * There is a fast path for number addition. Other cases go
+ * through potentially multiple coercions as described in the
+ * E5 specification. It may be possible to reduce the number
+ * of coercions, but this must be done carefully to preserve
+ * the exact semantics.
+ *
+ * E5 Section 11.6.1.
+ *
+ * Custom types also have special behavior implemented here.
+ */
+
+ duk_double_union du;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv_x != NULL); /* may be reg or const */
+ DUK_ASSERT(tv_y != NULL); /* may be reg or const */
+ DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */
+ DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr));
+
+ /*
+ * Fast paths
+ */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {
+ duk_int64_t v1, v2, v3;
+ duk_int32_t v3_hi;
+ duk_tval *tv_z;
+
+ /* Input values are signed 48-bit so we can detect overflow
+ * reliably from high bits or just a comparison.
+ */
+
+ v1 = DUK_TVAL_GET_FASTINT(tv_x);
+ v2 = DUK_TVAL_GET_FASTINT(tv_y);
+ v3 = v1 + v2;
+ v3_hi = (duk_int32_t) (v3 >> 32);
+ if (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) {
+ tv_z = thr->valstack_bottom + idx_z;
+ DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3); /* side effects */
+ return;
+ } else {
+ /* overflow, fall through */
+ ;
+ }
+ }
+#endif /* DUK_USE_FASTINT */
+
+ if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) {
+#if !defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_tval *tv_z;
+#endif
+
+ du.d = DUK_TVAL_GET_NUMBER(tv_x) + DUK_TVAL_GET_NUMBER(tv_y);
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_push_number(thr, du.d); /* will NaN normalize result */
+ duk_replace(thr, (duk_idx_t) idx_z);
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ tv_z = thr->valstack_bottom + idx_z;
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d); /* side effects */
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+ return;
+ }
+
+ /*
+ * Slow path: potentially requires function calls for coercion
+ */
+
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ duk_to_primitive(thr, -2, DUK_HINT_NONE); /* side effects -> don't use tv_x, tv_y after */
+ duk_to_primitive(thr, -1, DUK_HINT_NONE);
+
+ /* Since Duktape 2.x plain buffers are treated like ArrayBuffer. */
+ if (duk_is_string(thr, -2) || duk_is_string(thr, -1)) {
+ /* Symbols shouldn't technically be handled here, but should
+ * go into the default ToNumber() coercion path instead and
+ * fail there with a TypeError. However, there's a ToString()
+ * in duk_concat_2() which also fails with TypeError so no
+ * explicit check is needed.
+ */
+ duk_concat_2(thr); /* [... s1 s2] -> [... s1+s2] */
+ } else {
+ duk_double_t d1, d2;
+
+ d1 = duk_to_number_m2(thr);
+ d2 = duk_to_number_m1(thr);
+ DUK_ASSERT(duk_is_number(thr, -2));
+ DUK_ASSERT(duk_is_number(thr, -1));
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(d1);
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(d2);
+
+ du.d = d1 + d2;
+ duk_pop_2_unsafe(thr);
+ duk_push_number(thr, du.d); /* will NaN normalize result */
+ }
+ duk_replace(thr, (duk_idx_t) idx_z); /* side effects */
+}
+
+DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_uint_fast_t idx_z, duk_small_uint_fast_t opcode) {
+ /*
+ * Arithmetic operations other than '+' have number-only semantics
+ * and are implemented here. The separate switch-case here means a
+ * "double dispatch" of the arithmetic opcode, but saves code space.
+ *
+ * E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3.
+ */
+
+ duk_double_t d1, d2;
+ duk_double_union du;
+ duk_small_uint_fast_t opcode_shifted;
+#if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_tval *tv_z;
+#endif
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv_x != NULL); /* may be reg or const */
+ DUK_ASSERT(tv_y != NULL); /* may be reg or const */
+ DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */
+ DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr));
+
+ opcode_shifted = opcode >> 2; /* Get base opcode without reg/const modifiers. */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {
+ duk_int64_t v1, v2, v3;
+ duk_int32_t v3_hi;
+
+ v1 = DUK_TVAL_GET_FASTINT(tv_x);
+ v2 = DUK_TVAL_GET_FASTINT(tv_y);
+
+ switch (opcode_shifted) {
+ case DUK_OP_SUB >> 2: {
+ v3 = v1 - v2;
+ break;
+ }
+ case DUK_OP_MUL >> 2: {
+ /* Must ensure result is 64-bit (no overflow); a
+ * simple and sufficient fast path is to allow only
+ * 32-bit inputs. Avoid zero inputs to avoid
+ * negative zero issues (-1 * 0 = -0, for instance).
+ */
+ if (v1 >= DUK_I64_CONSTANT(-0x80000000) && v1 <= DUK_I64_CONSTANT(0x7fffffff) && v1 != 0 &&
+ v2 >= DUK_I64_CONSTANT(-0x80000000) && v2 <= DUK_I64_CONSTANT(0x7fffffff) && v2 != 0) {
+ v3 = v1 * v2;
+ } else {
+ goto skip_fastint;
+ }
+ break;
+ }
+ case DUK_OP_DIV >> 2: {
+ /* Don't allow a zero divisor. Fast path check by
+ * "verifying" with multiplication. Also avoid zero
+ * dividend to avoid negative zero issues (0 / -1 = -0
+ * for instance).
+ */
+ if (v1 == 0 || v2 == 0) {
+ goto skip_fastint;
+ }
+ v3 = v1 / v2;
+ if (v3 * v2 != v1) {
+ goto skip_fastint;
+ }
+ break;
+ }
+ case DUK_OP_MOD >> 2: {
+ /* Don't allow a zero divisor. Restrict both v1 and
+ * v2 to positive values to avoid compiler specific
+ * behavior.
+ */
+ if (v1 < 1 || v2 < 1) {
+ goto skip_fastint;
+ }
+ v3 = v1 % v2;
+ DUK_ASSERT(v3 >= 0);
+ DUK_ASSERT(v3 < v2);
+ DUK_ASSERT(v1 - (v1 / v2) * v2 == v3);
+ break;
+ }
+ default: {
+ /* Possible with DUK_OP_EXP. */
+ goto skip_fastint;
+ }
+ }
+
+ v3_hi = (duk_int32_t) (v3 >> 32);
+ if (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) {
+ tv_z = thr->valstack_bottom + idx_z;
+ DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3); /* side effects */
+ return;
+ }
+ /* fall through if overflow etc */
+ }
+ skip_fastint:
+#endif /* DUK_USE_FASTINT */
+
+ if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) {
+ /* fast path */
+ d1 = DUK_TVAL_GET_NUMBER(tv_x);
+ d2 = DUK_TVAL_GET_NUMBER(tv_y);
+ } else {
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ d1 = duk_to_number_m2(thr); /* side effects */
+ d2 = duk_to_number_m1(thr);
+ DUK_ASSERT(duk_is_number(thr, -2));
+ DUK_ASSERT(duk_is_number(thr, -1));
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(d1);
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(d2);
+ duk_pop_2_unsafe(thr);
+ }
+
+ switch (opcode_shifted) {
+ case DUK_OP_SUB >> 2: {
+ du.d = d1 - d2;
+ break;
+ }
+ case DUK_OP_MUL >> 2: {
+ du.d = d1 * d2;
+ break;
+ }
+ case DUK_OP_DIV >> 2: {
+ du.d = d1 / d2;
+ break;
+ }
+ case DUK_OP_MOD >> 2: {
+ du.d = duk__compute_mod(d1, d2);
+ break;
+ }
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+ case DUK_OP_EXP >> 2: {
+ du.d = duk__compute_exp(d1, d2);
+ break;
+ }
+#endif
+ default: {
+ DUK_UNREACHABLE();
+ du.d = DUK_DOUBLE_NAN; /* should not happen */
+ break;
+ }
+ }
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_push_number(thr, du.d); /* will NaN normalize result */
+ duk_replace(thr, (duk_idx_t) idx_z);
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ /* important to use normalized NaN with 8-byte tagged types */
+ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ tv_z = thr->valstack_bottom + idx_z;
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d); /* side effects */
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+}
+
+DUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z, duk_small_uint_fast_t opcode) {
+ /*
+ * Binary bitwise operations use different coercions (ToInt32, ToUint32)
+ * depending on the operation. We coerce the arguments first using
+ * ToInt32(), and then cast to an 32-bit value if necessary. Note that
+ * such casts must be correct even if there is no native 32-bit type
+ * (e.g., duk_int32_t and duk_uint32_t are 64-bit).
+ *
+ * E5 Sections 11.10, 11.7.1, 11.7.2, 11.7.3
+ */
+
+ duk_int32_t i1, i2, i3;
+ duk_uint32_t u1, u2, u3;
+#if defined(DUK_USE_FASTINT)
+ duk_int64_t fi3;
+#else
+ duk_double_t d3;
+#endif
+ duk_small_uint_fast_t opcode_shifted;
+#if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_tval *tv_z;
+#endif
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv_x != NULL); /* may be reg or const */
+ DUK_ASSERT(tv_y != NULL); /* may be reg or const */
+ DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */
+ DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr));
+
+ opcode_shifted = opcode >> 2; /* Get base opcode without reg/const modifiers. */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {
+ i1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_x);
+ i2 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_y);
+ }
+ else
+#endif /* DUK_USE_FASTINT */
+ {
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ i1 = duk_to_int32(thr, -2);
+ i2 = duk_to_int32(thr, -1);
+ duk_pop_2_unsafe(thr);
+ }
+
+ switch (opcode_shifted) {
+ case DUK_OP_BAND >> 2: {
+ i3 = i1 & i2;
+ break;
+ }
+ case DUK_OP_BOR >> 2: {
+ i3 = i1 | i2;
+ break;
+ }
+ case DUK_OP_BXOR >> 2: {
+ i3 = i1 ^ i2;
+ break;
+ }
+ case DUK_OP_BASL >> 2: {
+ /* Signed shift, named "arithmetic" (asl) because the result
+ * is signed, e.g. 4294967295 << 1 -> -2. Note that result
+ * must be masked.
+ */
+
+ u2 = ((duk_uint32_t) i2) & 0xffffffffUL;
+ i3 = (duk_int32_t) (((duk_uint32_t) i1) << (u2 & 0x1fUL)); /* E5 Section 11.7.1, steps 7 and 8 */
+ i3 = i3 & ((duk_int32_t) 0xffffffffUL); /* Note: left shift, should mask */
+ break;
+ }
+ case DUK_OP_BASR >> 2: {
+ /* signed shift */
+
+ u2 = ((duk_uint32_t) i2) & 0xffffffffUL;
+ i3 = i1 >> (u2 & 0x1fUL); /* E5 Section 11.7.2, steps 7 and 8 */
+ break;
+ }
+ case DUK_OP_BLSR >> 2: {
+ /* unsigned shift */
+
+ u1 = ((duk_uint32_t) i1) & 0xffffffffUL;
+ u2 = ((duk_uint32_t) i2) & 0xffffffffUL;
+
+ /* special result value handling */
+ u3 = u1 >> (u2 & 0x1fUL); /* E5 Section 11.7.2, steps 7 and 8 */
+#if defined(DUK_USE_FASTINT)
+ fi3 = (duk_int64_t) u3;
+ goto fastint_result_set;
+#else
+ d3 = (duk_double_t) u3;
+ goto result_set;
+#endif
+ }
+ default: {
+ DUK_UNREACHABLE();
+ i3 = 0; /* should not happen */
+ break;
+ }
+ }
+
+#if defined(DUK_USE_FASTINT)
+ /* Result is always fastint compatible. */
+ /* XXX: Set 32-bit result (but must then handle signed and
+ * unsigned results separately).
+ */
+ fi3 = (duk_int64_t) i3;
+
+ fastint_result_set:
+ tv_z = thr->valstack_bottom + idx_z;
+ DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, fi3); /* side effects */
+#else /* DUK_USE_FASTINT */
+ d3 = (duk_double_t) i3;
+
+ result_set:
+ DUK_ASSERT(!DUK_ISNAN(d3)); /* 'd3' is never NaN, so no need to normalize */
+ DUK_ASSERT_DOUBLE_IS_NORMALIZED(d3); /* always normalized */
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_push_number(thr, d3); /* would NaN normalize result, but unnecessary */
+ duk_replace(thr, (duk_idx_t) idx_z);
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ tv_z = thr->valstack_bottom + idx_z;
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, d3); /* side effects */
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+#endif /* DUK_USE_FASTINT */
+}
+
+/* In-place unary operation. */
+DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_unary_op(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst, duk_small_uint_fast_t opcode) {
+ /*
+ * Arithmetic operations other than '+' have number-only semantics
+ * and are implemented here. The separate switch-case here means a
+ * "double dispatch" of the arithmetic opcode, but saves code space.
+ *
+ * E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3.
+ */
+
+ duk_tval *tv;
+ duk_double_t d1;
+ duk_double_union du;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(opcode == DUK_OP_UNM || opcode == DUK_OP_UNP);
+ DUK_ASSERT_DISABLE(idx_src >= 0);
+ DUK_ASSERT_DISABLE(idx_dst >= 0);
+
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src);
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ duk_int64_t v1, v2;
+
+ v1 = DUK_TVAL_GET_FASTINT(tv);
+ if (opcode == DUK_OP_UNM) {
+ /* The smallest fastint is no longer 48-bit when
+ * negated. Positive zero becames negative zero
+ * (cannot be represented) when negated.
+ */
+ if (DUK_LIKELY(v1 != DUK_FASTINT_MIN && v1 != 0)) {
+ v2 = -v1;
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);
+ DUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2);
+ return;
+ }
+ } else {
+ /* ToNumber() for a fastint is a no-op. */
+ DUK_ASSERT(opcode == DUK_OP_UNP);
+ v2 = v1;
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);
+ DUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2);
+ return;
+ }
+ /* fall through if overflow etc */
+ }
+#endif /* DUK_USE_FASTINT */
+
+ if (DUK_TVAL_IS_NUMBER(tv)) {
+ d1 = DUK_TVAL_GET_NUMBER(tv);
+ } else {
+ d1 = duk_to_number_tval(thr, tv); /* side effects */
+ }
+
+ if (opcode == DUK_OP_UNP) {
+ /* ToNumber() for a double is a no-op, but unary plus is
+ * used to force a fastint check so do that here.
+ */
+ du.d = d1;
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+#if defined(DUK_USE_FASTINT)
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);
+ DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF(thr, tv, du.d); /* always 'fast', i.e. inlined */
+ return;
+#endif
+ } else {
+ DUK_ASSERT(opcode == DUK_OP_UNM);
+ du.d = -d1;
+ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); /* mandatory if du.d is a NaN */
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ }
+
+ /* XXX: size optimize: push+replace? */
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, du.d);
+}
+
+DUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) {
+ /*
+ * E5 Section 11.4.8
+ */
+
+ duk_tval *tv;
+ duk_int32_t i1, i2;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT_DISABLE(idx_src >= 0);
+ DUK_ASSERT_DISABLE(idx_dst >= 0);
+ DUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr));
+ DUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr));
+
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src);
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ i1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv);
+ }
+ else
+#endif /* DUK_USE_FASTINT */
+ {
+ duk_push_tval(thr, tv);
+ i1 = duk_to_int32(thr, -1); /* side effects */
+ duk_pop_unsafe(thr);
+ }
+
+ /* Result is always fastint compatible. */
+ i2 = ~i1;
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);
+ DUK_TVAL_SET_I32_UPDREF(thr, tv, i2); /* side effects */
+}
+
+DUK_LOCAL DUK__INLINE_PERF void duk__vm_logical_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) {
+ /*
+ * E5 Section 11.4.9
+ */
+
+ duk_tval *tv;
+ duk_bool_t res;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT_DISABLE(idx_src >= 0);
+ DUK_ASSERT_DISABLE(idx_dst >= 0);
+ DUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr));
+ DUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr));
+
+ /* ToBoolean() does not require any operations with side effects so
+ * we can do it efficiently. For footprint it would be better to use
+ * duk_js_toboolean() and then push+replace to the result slot.
+ */
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src);
+ res = duk_js_toboolean(tv); /* does not modify 'tv' */
+ DUK_ASSERT(res == 0 || res == 1);
+ res ^= 1;
+ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);
+ /* XXX: size optimize: push+replace? */
+ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, res); /* side effects */
+}
+
+/* XXX: size optimized variant */
+DUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_reg_helper(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_small_uint_t op) {
+ duk_double_t x, y, z;
+
+ /* Two lowest bits of opcode are used to distinguish
+ * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1).
+ */
+ DUK_ASSERT((DUK_OP_PREINCR & 0x03) == 0x00);
+ DUK_ASSERT((DUK_OP_PREDECR & 0x03) == 0x01);
+ DUK_ASSERT((DUK_OP_POSTINCR & 0x03) == 0x02);
+ DUK_ASSERT((DUK_OP_POSTDECR & 0x03) == 0x03);
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_src)) {
+ duk_int64_t x_fi, y_fi, z_fi;
+ x_fi = DUK_TVAL_GET_FASTINT(tv_src);
+ if (op & 0x01) {
+ if (DUK_UNLIKELY(x_fi == DUK_FASTINT_MIN)) {
+ goto skip_fastint;
+ }
+ y_fi = x_fi - 1;
+ } else {
+ if (DUK_UNLIKELY(x_fi == DUK_FASTINT_MAX)) {
+ goto skip_fastint;
+ }
+ y_fi = x_fi + 1;
+ }
+
+ DUK_TVAL_SET_FASTINT(tv_src, y_fi); /* no need for refcount update */
+
+ z_fi = (op & 0x02) ? x_fi : y_fi;
+ DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_dst, z_fi); /* side effects */
+ return;
+ }
+ skip_fastint:
+#endif
+ if (DUK_TVAL_IS_NUMBER(tv_src)) {
+ /* Fast path for the case where the register
+ * is a number (e.g. loop counter).
+ */
+
+ x = DUK_TVAL_GET_NUMBER(tv_src);
+ if (op & 0x01) {
+ y = x - 1.0;
+ } else {
+ y = x + 1.0;
+ }
+
+ DUK_TVAL_SET_NUMBER(tv_src, y); /* no need for refcount update */
+ } else {
+ /* Preserve duk_tval pointer(s) across a potential valstack
+ * resize by converting them into offsets temporarily.
+ */
+ duk_idx_t bc;
+ duk_size_t off_dst;
+
+ off_dst = (duk_size_t) ((duk_uint8_t *) tv_dst - (duk_uint8_t *) thr->valstack_bottom);
+ bc = (duk_idx_t) (tv_src - thr->valstack_bottom); /* XXX: pass index explicitly? */
+ tv_src = NULL; /* no longer referenced */
+
+ x = duk_to_number(thr, bc);
+ if (op & 0x01) {
+ y = x - 1.0;
+ } else {
+ y = x + 1.0;
+ }
+
+ duk_push_number(thr, y);
+ duk_replace(thr, bc);
+
+ tv_dst = (duk_tval *) (void *) (((duk_uint8_t *) thr->valstack_bottom) + off_dst);
+ }
+
+ z = (op & 0x02) ? x : y;
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z); /* side effects */
+}
+
+DUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_var_helper(duk_hthread *thr, duk_small_uint_t idx_dst, duk_tval *tv_id, duk_small_uint_t op, duk_small_uint_t is_strict) {
+ duk_activation *act;
+ duk_double_t x, y;
+ duk_hstring *name;
+
+ /* XXX: The pre/post inc/dec for an identifier lookup is
+ * missing the important fast path where the identifier
+ * has a storage location e.g. in a scope object so that
+ * it can be updated in-place. In particular, the case
+ * where the identifier has a storage location AND the
+ * previous value is a number should be optimized because
+ * it's side effect free.
+ */
+
+ /* Two lowest bits of opcode are used to distinguish
+ * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1).
+ */
+ DUK_ASSERT((DUK_OP_PREINCV & 0x03) == 0x00);
+ DUK_ASSERT((DUK_OP_PREDECV & 0x03) == 0x01);
+ DUK_ASSERT((DUK_OP_POSTINCV & 0x03) == 0x02);
+ DUK_ASSERT((DUK_OP_POSTDECV & 0x03) == 0x03);
+
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv_id));
+ name = DUK_TVAL_GET_STRING(tv_id);
+ DUK_ASSERT(name != NULL);
+ act = thr->callstack_curr;
+ (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [ ... val this ] */
+
+ /* XXX: Fastint fast path would be useful here. Also fastints
+ * now lose their fastint status in current handling which is
+ * not intuitive.
+ */
+
+ x = duk_to_number_m2(thr);
+ if (op & 0x01) {
+ y = x - 1.0;
+ } else {
+ y = x + 1.0;
+ }
+
+ /* [... x this] */
+
+ if (op & 0x02) {
+ duk_push_number(thr, y); /* -> [ ... x this y ] */
+ DUK_ASSERT(act == thr->callstack_curr);
+ duk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict);
+ duk_pop_2_unsafe(thr); /* -> [ ... x ] */
+ } else {
+ duk_pop_2_unsafe(thr); /* -> [ ... ] */
+ duk_push_number(thr, y); /* -> [ ... y ] */
+ DUK_ASSERT(act == thr->callstack_curr);
+ duk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict);
+ }
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_replace(thr, (duk_idx_t) idx_dst);
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ DUK__REPLACE_TO_TVPTR(thr, DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst));
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+}
+
+/*
+ * Longjmp and other control flow transfer for the bytecode executor.
+ *
+ * The longjmp handler can handle all longjmp types: error, yield, and
+ * resume (pseudotypes are never actually thrown).
+ *
+ * Error policy for longjmp: should not ordinarily throw errors; if errors
+ * occur (e.g. due to out-of-memory) they bubble outwards rather than being
+ * handled recursively.
+ */
+
+#define DUK__LONGJMP_RESTART 0 /* state updated, restart bytecode execution */
+#define DUK__LONGJMP_RETHROW 1 /* exit bytecode executor by rethrowing an error to caller */
+
+#define DUK__RETHAND_RESTART 0 /* state updated, restart bytecode execution */
+#define DUK__RETHAND_FINISHED 1 /* exit bytecode execution with return value */
+
+/* XXX: optimize reconfig valstack operations so that resize, clamp, and setting
+ * top are combined into one pass.
+ */
+
+/* Reconfigure value stack for return to an Ecmascript function at
+ * callstack top (caller unwinds).
+ */
+DUK_LOCAL void duk__reconfig_valstack_ecma_return(duk_hthread *thr) {
+ duk_activation *act;
+ duk_hcompfunc *h_func;
+ duk_idx_t clamp_top;
+
+ DUK_ASSERT(thr != NULL);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act)));
+
+ /* Clamp so that values at 'clamp_top' and above are wiped and won't
+ * retain reachable garbage. Then extend to 'nregs' because we're
+ * returning to an Ecmascript function.
+ */
+
+ h_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+
+ thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff);
+ DUK_ASSERT(act->retval_byteoff >= act->bottom_byteoff);
+ clamp_top = (duk_idx_t) ((act->retval_byteoff - act->bottom_byteoff + sizeof(duk_tval)) / sizeof(duk_tval)); /* +1 = one retval */
+ duk_set_top_and_wipe(thr, h_func->nregs, clamp_top);
+
+ DUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff);
+ thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff);
+
+ /* XXX: a best effort shrink check would be OK here */
+}
+
+/* Reconfigure value stack for an Ecmascript catcher. Use topmost catcher
+ * in 'act'.
+ */
+DUK_LOCAL void duk__reconfig_valstack_ecma_catcher(duk_hthread *thr, duk_activation *act) {
+ duk_catcher *cat;
+ duk_hcompfunc *h_func;
+ duk_size_t idx_bottom;
+ duk_idx_t clamp_top;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act)));
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+
+ h_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+
+ thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff);
+ idx_bottom = (duk_size_t) (thr->valstack_bottom - thr->valstack);
+ DUK_ASSERT(cat->idx_base >= idx_bottom);
+ clamp_top = (duk_idx_t) (cat->idx_base - idx_bottom + 2); /* +2 = catcher value, catcher lj_type */
+ duk_set_top_and_wipe(thr, h_func->nregs, clamp_top);
+
+ DUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff);
+ thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff);
+
+ /* XXX: a best effort shrink check would be OK here */
+}
+
+/* Set catcher regs: idx_base+0 = value, idx_base+1 = lj_type.
+ * No side effects.
+ */
+DUK_LOCAL void duk__set_catcher_regs_norz(duk_hthread *thr, duk_catcher *cat, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) {
+ duk_tval *tv1;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv_val_unstable != NULL);
+
+ tv1 = thr->valstack + cat->idx_base;
+ DUK_ASSERT(tv1 < thr->valstack_top);
+ DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr, tv1, tv_val_unstable);
+
+ tv1++;
+ DUK_ASSERT(tv1 == thr->valstack + cat->idx_base + 1);
+ DUK_ASSERT(tv1 < thr->valstack_top);
+ DUK_TVAL_SET_U32_UPDREF_NORZ(thr, tv1, (duk_uint32_t) lj_type);
+}
+
+DUK_LOCAL void duk__handle_catch(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) {
+ duk_activation *act;
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv_val_unstable != NULL);
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(act->cat != NULL);
+ DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF);
+
+ duk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ duk__reconfig_valstack_ecma_catcher(thr, act);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+
+ act->curr_pc = cat->pc_base + 0; /* +0 = catch */
+
+ /*
+ * If entering a 'catch' block which requires an automatic
+ * catch variable binding, create the lexical environment.
+ *
+ * The binding is mutable (= writable) but not deletable.
+ * Step 4 for the catch production in E5 Section 12.14;
+ * no value is given for CreateMutableBinding 'D' argument,
+ * which implies the binding is not deletable.
+ */
+
+ if (DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)) {
+ duk_hdecenv *new_env;
+
+ DUK_DDD(DUK_DDDPRINT("catcher has an automatic catch binding"));
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+
+ if (act->lex_env == NULL) {
+ DUK_ASSERT(act->var_env == NULL);
+ DUK_DDD(DUK_DDDPRINT("delayed environment initialization"));
+
+ duk_js_init_activation_environment_records_delayed(thr, act);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ }
+ DUK_ASSERT(act->lex_env != NULL);
+ DUK_ASSERT(act->var_env != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);
+
+ /* XXX: If an out-of-memory happens here, longjmp state asserts
+ * will be triggered at present and a try-catch fails to catch.
+ * That's not sandboxing fatal (C API protected calls are what
+ * matters), and script catch code can immediately throw anyway
+ * for almost any operation.
+ */
+ new_env = duk_hdecenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
+ DUK_ASSERT(new_env != NULL);
+ duk_push_hobject(thr, (duk_hobject *) new_env);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);
+ DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", (duk_heaphdr *) new_env));
+
+ /* Note: currently the catch binding is handled without a register
+ * binding because we don't support dynamic register bindings (they
+ * must be fixed for an entire function). So, there is no need to
+ * record regbases etc.
+ */
+
+ /* XXX: duk_xdef_prop() may cause an out-of-memory, see above. */
+ DUK_ASSERT(cat->h_varname != NULL);
+ duk_push_hstring(thr, cat->h_varname);
+ duk_push_tval(thr, thr->valstack + cat->idx_base);
+ duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_W); /* writable, not configurable */
+
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act->lex_env);
+ act->lex_env = (duk_hobject *) new_env;
+ DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); /* reachable through activation */
+ /* Net refcount change to act->lex_env is 0: incref for new_env's
+ * prototype, decref for act->lex_env overwrite.
+ */
+
+ DUK_CAT_SET_LEXENV_ACTIVE(cat);
+
+ duk_pop_unsafe(thr);
+
+ DUK_DDD(DUK_DDDPRINT("new_env finished: %!iO", (duk_heaphdr *) new_env));
+ }
+
+ DUK_CAT_CLEAR_CATCH_ENABLED(cat);
+}
+
+DUK_LOCAL void duk__handle_finally(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) {
+ duk_activation *act;
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv_val_unstable != NULL);
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(act->cat != NULL);
+ DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF);
+
+ duk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ duk__reconfig_valstack_ecma_catcher(thr, act);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+
+ act->curr_pc = cat->pc_base + 1; /* +1 = finally */
+
+ DUK_CAT_CLEAR_FINALLY_ENABLED(cat);
+}
+
+DUK_LOCAL void duk__handle_label(duk_hthread *thr, duk_small_uint_t lj_type) {
+ duk_activation *act;
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(DUK_ACT_GET_FUNC(act)));
+
+ /* +0 = break, +1 = continue */
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+ DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL);
+
+ act->curr_pc = cat->pc_base + (lj_type == DUK_LJ_TYPE_CONTINUE ? 1 : 0);
+
+ /* valstack should not need changes */
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) ==
+ (duk_size_t) ((duk_hcompfunc *) DUK_ACT_GET_FUNC(act))->nregs);
+#endif
+}
+
+/* Called for handling both a longjmp() with type DUK_LJ_TYPE_YIELD and
+ * when a RETURN opcode terminates a thread and yields to the resumer.
+ * Caller unwinds so that top of callstack is the activation we return to.
+ */
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+DUK_LOCAL void duk__handle_yield(duk_hthread *thr, duk_hthread *resumer, duk_tval *tv_val_unstable) {
+ duk_activation *act_resumer;
+ duk_tval *tv1;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(resumer != NULL);
+ DUK_ASSERT(tv_val_unstable != NULL);
+ act_resumer = resumer->callstack_curr;
+ DUK_ASSERT(act_resumer != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(act_resumer) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act_resumer))); /* resume caller must be an ecmascript func */
+
+ tv1 = (duk_tval *) (void *) ((duk_uint8_t *) resumer->valstack + act_resumer->retval_byteoff); /* return value from Duktape.Thread.resume() */
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv_val_unstable); /* side effects */ /* XXX: avoid side effects */
+
+ duk__reconfig_valstack_ecma_return(resumer);
+
+ /* caller must change active thread, and set thr->resumer to NULL */
+}
+#endif /* DUK_USE_COROUTINE_SUPPORT */
+
+DUK_LOCAL duk_small_uint_t duk__handle_longjmp(duk_hthread *thr, duk_activation *entry_act) {
+ duk_small_uint_t retval = DUK__LONGJMP_RESTART;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(entry_act != NULL);
+
+ /* 'thr' is the current thread, as no-one resumes except us and we
+ * switch 'thr' in that case.
+ */
+ DUK_ASSERT(thr == thr->heap->curr_thread);
+
+ /*
+ * (Re)try handling the longjmp.
+ *
+ * A longjmp handler may convert the longjmp to a different type and
+ * "virtually" rethrow by goto'ing to 'check_longjmp'. Before the goto,
+ * the following must be updated:
+ * - the heap 'lj' state
+ * - 'thr' must reflect the "throwing" thread
+ */
+
+ check_longjmp:
+
+ DUK_DD(DUK_DDPRINT("handling longjmp: type=%ld, value1=%!T, value2=%!T, iserror=%ld",
+ (long) thr->heap->lj.type,
+ (duk_tval *) &thr->heap->lj.value1,
+ (duk_tval *) &thr->heap->lj.value2,
+ (long) thr->heap->lj.iserror));
+
+ switch (thr->heap->lj.type) {
+
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+ case DUK_LJ_TYPE_RESUME: {
+ /*
+ * Note: lj.value1 is 'value', lj.value2 is 'resumee'.
+ * This differs from YIELD.
+ */
+
+ duk_tval *tv;
+ duk_tval *tv2;
+ duk_hthread *resumee;
+
+ /* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */
+
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); /* unchanged by Duktape.Thread.resume() */
+ DUK_ASSERT(thr->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL &&
+ DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) &&
+ ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_resume);
+
+ tv = &thr->heap->lj.value2; /* resumee */
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));
+ DUK_ASSERT(DUK_TVAL_GET_OBJECT(tv) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_THREAD(DUK_TVAL_GET_OBJECT(tv)));
+ resumee = (duk_hthread *) DUK_TVAL_GET_OBJECT(tv);
+
+ DUK_ASSERT(resumee != NULL);
+ DUK_ASSERT(resumee->resumer == NULL);
+ DUK_ASSERT(resumee->state == DUK_HTHREAD_STATE_INACTIVE ||
+ resumee->state == DUK_HTHREAD_STATE_YIELDED); /* checked by Duktape.Thread.resume() */
+ DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED ||
+ resumee->callstack_top >= 2); /* YIELDED: Ecmascript activation + Duktape.Thread.yield() activation */
+ DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED ||
+ (DUK_ACT_GET_FUNC(resumee->callstack_curr) != NULL &&
+ DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumee->callstack_curr)) &&
+ ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumee->callstack_curr))->func == duk_bi_thread_yield));
+ DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_INACTIVE ||
+ resumee->callstack_top == 0); /* INACTIVE: no activation, single function value on valstack */
+
+ if (thr->heap->lj.iserror) {
+ /*
+ * Throw the error in the resumed thread's context; the
+ * error value is pushed onto the resumee valstack.
+ *
+ * Note: the callstack of the target may empty in this case
+ * too (i.e. the target thread has never been resumed). The
+ * value stack will contain the initial function in that case,
+ * which we simply ignore.
+ */
+
+ DUK_ASSERT(resumee->resumer == NULL);
+ resumee->resumer = thr;
+ DUK_HTHREAD_INCREF(thr, thr);
+ resumee->state = DUK_HTHREAD_STATE_RUNNING;
+ thr->state = DUK_HTHREAD_STATE_RESUMED;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumee);
+ thr = resumee;
+
+ thr->heap->lj.type = DUK_LJ_TYPE_THROW;
+
+ /* thr->heap->lj.value1 is already the value to throw */
+ /* thr->heap->lj.value2 is 'thread', will be wiped out at the end */
+
+ DUK_ASSERT(thr->heap->lj.iserror); /* already set */
+
+ DUK_DD(DUK_DDPRINT("-> resume with an error, converted to a throw in the resumee, propagate"));
+ goto check_longjmp;
+ } else if (resumee->state == DUK_HTHREAD_STATE_YIELDED) {
+ /* Unwind previous Duktape.Thread.yield() call. The
+ * activation remaining must always be an Ecmascript
+ * call now (yield() accepts calls from Ecmascript
+ * only).
+ */
+ duk_activation *act_resumee;
+
+ DUK_ASSERT(resumee->callstack_top >= 2);
+ act_resumee = resumee->callstack_curr; /* Duktape.Thread.yield() */
+ DUK_ASSERT(act_resumee != NULL);
+ act_resumee = act_resumee->parent; /* Ecmascript call site for yield() */
+ DUK_ASSERT(act_resumee != NULL);
+
+ tv = (duk_tval *) (void *) ((duk_uint8_t *) resumee->valstack + act_resumee->retval_byteoff); /* return value from Duktape.Thread.yield() */
+ DUK_ASSERT(tv >= resumee->valstack && tv < resumee->valstack_top);
+ tv2 = &thr->heap->lj.value1;
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv2); /* side effects */ /* XXX: avoid side effects */
+
+ duk_hthread_activation_unwind_norz(resumee); /* unwind to 'yield' caller */
+ /* no need to unwind catch stack */
+
+ duk__reconfig_valstack_ecma_return(resumee);
+
+ DUK_ASSERT(resumee->resumer == NULL);
+ resumee->resumer = thr;
+ DUK_HTHREAD_INCREF(thr, thr);
+ resumee->state = DUK_HTHREAD_STATE_RUNNING;
+ thr->state = DUK_HTHREAD_STATE_RESUMED;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumee);
+#if 0
+ thr = resumee; /* not needed, as we exit right away */
+#endif
+ DUK_DD(DUK_DDPRINT("-> resume with a value, restart execution in resumee"));
+ retval = DUK__LONGJMP_RESTART;
+ goto wipe_and_return;
+ } else {
+ /* Initial resume call. */
+ duk_small_uint_t call_flags;
+ duk_int_t setup_rc;
+
+ /* resumee: [... initial_func] (currently actually: [initial_func]) */
+
+ duk_push_undefined(resumee);
+ tv = &thr->heap->lj.value1;
+ duk_push_tval(resumee, tv);
+
+ /* resumee: [... initial_func undefined(= this) resume_value ] */
+
+ call_flags = DUK_CALL_FLAG_ALLOW_ECMATOECMA; /* not tailcall, ecma-to-ecma (assumed to succeed) */
+
+ setup_rc = duk_handle_call_unprotected_nargs(resumee, 1 /*nargs*/, call_flags);
+ if (setup_rc == 0) {
+ /* This shouldn't happen; Duktape.Thread.resume()
+ * should make sure of that. If it does happen
+ * this internal error will propagate out of the
+ * executor which can be quite misleading.
+ */
+ DUK_ERROR_INTERNAL(thr);
+ }
+
+ DUK_ASSERT(resumee->resumer == NULL);
+ resumee->resumer = thr;
+ DUK_HTHREAD_INCREF(thr, thr);
+ resumee->state = DUK_HTHREAD_STATE_RUNNING;
+ thr->state = DUK_HTHREAD_STATE_RESUMED;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumee);
+#if 0
+ thr = resumee; /* not needed, as we exit right away */
+#endif
+ DUK_DD(DUK_DDPRINT("-> resume with a value, restart execution in resumee"));
+ retval = DUK__LONGJMP_RESTART;
+ goto wipe_and_return;
+ }
+ DUK_UNREACHABLE();
+ break; /* never here */
+ }
+
+ case DUK_LJ_TYPE_YIELD: {
+ /*
+ * Currently only allowed only if yielding thread has only
+ * Ecmascript activations (except for the Duktape.Thread.yield()
+ * call at the callstack top) and none of them constructor
+ * calls.
+ *
+ * This excludes the 'entry' thread which will always have
+ * a preventcount > 0.
+ */
+
+ duk_hthread *resumer;
+
+ /* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */
+
+#if 0 /* entry_thread not available for assert */
+ DUK_ASSERT(thr != entry_thread); /* Duktape.Thread.yield() should prevent */
+#endif
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); /* unchanged from Duktape.Thread.yield() */
+ DUK_ASSERT(thr->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.yield() activation */
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL &&
+ DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) &&
+ ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_yield);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL &&
+ DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent))); /* an Ecmascript function */
+
+ resumer = thr->resumer;
+
+ DUK_ASSERT(resumer != NULL);
+ DUK_ASSERT(resumer->state == DUK_HTHREAD_STATE_RESUMED); /* written by a previous RESUME handling */
+ DUK_ASSERT(resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */
+ DUK_ASSERT(resumer->callstack_curr != NULL);
+ DUK_ASSERT(resumer->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr) != NULL &&
+ DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr)) &&
+ ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumer->callstack_curr))->func == duk_bi_thread_resume);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent) != NULL &&
+ DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent))); /* an Ecmascript function */
+
+ if (thr->heap->lj.iserror) {
+ thr->state = DUK_HTHREAD_STATE_YIELDED;
+ thr->resumer = NULL;
+ DUK_HTHREAD_DECREF_NORZ(thr, resumer);
+ resumer->state = DUK_HTHREAD_STATE_RUNNING;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumer);
+ thr = resumer;
+
+ thr->heap->lj.type = DUK_LJ_TYPE_THROW;
+ /* lj.value1 is already set */
+ DUK_ASSERT(thr->heap->lj.iserror); /* already set */
+
+ DUK_DD(DUK_DDPRINT("-> yield an error, converted to a throw in the resumer, propagate"));
+ goto check_longjmp;
+ } else {
+ duk_hthread_activation_unwind_norz(resumer);
+ duk__handle_yield(thr, resumer, &thr->heap->lj.value1);
+
+ thr->state = DUK_HTHREAD_STATE_YIELDED;
+ thr->resumer = NULL;
+ DUK_HTHREAD_DECREF_NORZ(thr, resumer);
+ resumer->state = DUK_HTHREAD_STATE_RUNNING;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumer);
+#if 0
+ thr = resumer; /* not needed, as we exit right away */
+#endif
+
+ DUK_DD(DUK_DDPRINT("-> yield a value, restart execution in resumer"));
+ retval = DUK__LONGJMP_RESTART;
+ goto wipe_and_return;
+ }
+ DUK_UNREACHABLE();
+ break; /* never here */
+ }
+#endif /* DUK_USE_COROUTINE_SUPPORT */
+
+ case DUK_LJ_TYPE_THROW: {
+ /*
+ * Three possible outcomes:
+ * * A try or finally catcher is found => resume there.
+ * (or)
+ * * The error propagates to the bytecode executor entry
+ * level (and we're in the entry thread) => rethrow
+ * with a new longjmp(), after restoring the previous
+ * catchpoint.
+ * * The error is not caught in the current thread, so
+ * the thread finishes with an error. This works like
+ * a yielded error, except that the thread is finished
+ * and can no longer be resumed. (There is always a
+ * resumer in this case.)
+ *
+ * Note: until we hit the entry level, there can only be
+ * Ecmascript activations.
+ */
+
+ duk_activation *act;
+ duk_catcher *cat;
+ duk_hthread *resumer;
+
+ for (;;) {
+ act = thr->callstack_curr;
+ if (act == NULL) {
+ break;
+ }
+
+ for (;;) {
+ cat = act->cat;
+ if (cat == NULL) {
+ break;
+ }
+
+ if (DUK_CAT_HAS_CATCH_ENABLED(cat)) {
+ DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF);
+
+ duk__handle_catch(thr,
+ &thr->heap->lj.value1,
+ DUK_LJ_TYPE_THROW);
+
+ DUK_DD(DUK_DDPRINT("-> throw caught by a 'catch' clause, restart execution"));
+ retval = DUK__LONGJMP_RESTART;
+ goto wipe_and_return;
+ }
+
+ if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) {
+ DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF);
+ DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat));
+
+ duk__handle_finally(thr,
+ &thr->heap->lj.value1,
+ DUK_LJ_TYPE_THROW);
+
+ DUK_DD(DUK_DDPRINT("-> throw caught by a 'finally' clause, restart execution"));
+ retval = DUK__LONGJMP_RESTART;
+ goto wipe_and_return;
+ }
+
+ duk_hthread_catcher_unwind_norz(thr, act);
+ }
+
+ if (act == entry_act) {
+ /* Not caught by anything before entry level; rethrow and let the
+ * final catcher finish unwinding (esp. value stack).
+ */
+ DUK_D(DUK_DPRINT("-> throw propagated up to entry level, rethrow and exit bytecode executor"));
+ retval = DUK__LONGJMP_RETHROW;
+ goto just_return;
+ }
+
+ duk_hthread_activation_unwind_norz(thr);
+ }
+
+ DUK_DD(DUK_DDPRINT("-> throw not caught by current thread, yield error to resumer and recheck longjmp"));
+
+ /* Not caught by current thread, thread terminates (yield error to resumer);
+ * note that this may cause a cascade if the resumer terminates with an uncaught
+ * exception etc (this is OK, but needs careful testing).
+ */
+
+ DUK_ASSERT(thr->resumer != NULL);
+ DUK_ASSERT(thr->resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */
+ DUK_ASSERT(thr->resumer->callstack_curr != NULL);
+ DUK_ASSERT(thr->resumer->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL &&
+ DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent))); /* an Ecmascript function */
+
+ resumer = thr->resumer;
+
+ /* reset longjmp */
+
+ DUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW); /* already set */
+ /* lj.value1 already set */
+
+ duk_hthread_terminate(thr); /* updates thread state, minimizes its allocations */
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED);
+
+ thr->resumer = NULL;
+ DUK_HTHREAD_DECREF_NORZ(thr, resumer);
+ resumer->state = DUK_HTHREAD_STATE_RUNNING;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumer);
+ thr = resumer;
+ goto check_longjmp;
+ }
+
+ case DUK_LJ_TYPE_BREAK: /* pseudotypes, not used in actual longjmps */
+ case DUK_LJ_TYPE_CONTINUE:
+ case DUK_LJ_TYPE_RETURN:
+ case DUK_LJ_TYPE_NORMAL:
+ default: {
+ /* should never happen, but be robust */
+ DUK_D(DUK_DPRINT("caught unknown longjmp type %ld, treat as internal error", (long) thr->heap->lj.type));
+ goto convert_to_internal_error;
+ }
+
+ } /* end switch */
+
+ DUK_UNREACHABLE();
+
+ wipe_and_return:
+ /* this is not strictly necessary, but helps debugging */
+ thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN;
+ thr->heap->lj.iserror = 0;
+
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value1); /* side effects */
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value2); /* side effects */
+
+ DUK_GC_TORTURE(thr->heap);
+
+ just_return:
+ return retval;
+
+ convert_to_internal_error:
+ /* This could also be thrown internally (set the error, goto check_longjmp),
+ * but it's better for internal errors to bubble outwards so that we won't
+ * infinite loop in this catchpoint.
+ */
+ DUK_ERROR_INTERNAL(thr);
+ DUK_UNREACHABLE();
+ return retval;
+}
+
+/* Handle a BREAK/CONTINUE opcode. Avoid using longjmp() for BREAK/CONTINUE
+ * handling because it has a measurable performance impact in ordinary
+ * environments and an extreme impact in Emscripten (GH-342).
+ */
+DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_break_or_continue(duk_hthread *thr,
+ duk_uint_t label_id,
+ duk_small_uint_t lj_type) {
+ duk_activation *act;
+ duk_catcher *cat;
+
+ DUK_ASSERT(thr != NULL);
+
+ /* Find a matching label catcher or 'finally' catcher in
+ * the same function, unwinding catchers as we go.
+ *
+ * A label catcher must always exist and will match unless
+ * a 'finally' captures the break/continue first. It is the
+ * compiler's responsibility to ensure that labels are used
+ * correctly.
+ */
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+
+ for (;;) {
+ cat = act->cat;
+ if (cat == NULL) {
+ break;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("considering catcher %p: type=%ld label=%ld",
+ (void *) cat,
+ (long) DUK_CAT_GET_TYPE(cat),
+ (long) DUK_CAT_GET_LABEL(cat)));
+
+ /* XXX: bit mask test; FINALLY <-> TCF, single bit mask would suffice? */
+
+ if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF &&
+ DUK_CAT_HAS_FINALLY_ENABLED(cat)) {
+ duk_tval tv_tmp;
+
+ DUK_TVAL_SET_U32(&tv_tmp, (duk_uint32_t) label_id);
+ duk__handle_finally(thr, &tv_tmp, lj_type);
+
+ DUK_DD(DUK_DDPRINT("-> break/continue caught by 'finally', restart execution"));
+ return;
+ }
+ if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL &&
+ (duk_uint_t) DUK_CAT_GET_LABEL(cat) == label_id) {
+ duk__handle_label(thr, lj_type);
+
+ DUK_DD(DUK_DDPRINT("-> break/continue caught by a label catcher (in the same function), restart execution"));
+ return;
+ }
+
+ duk_hthread_catcher_unwind_norz(thr, act);
+ }
+
+ /* Should never happen, but be robust. */
+ DUK_D(DUK_DPRINT("-> break/continue not caught by anything in the current function (should never happen), throw internal error"));
+ DUK_ERROR_INTERNAL(thr);
+ return;
+}
+
+/* Handle a RETURN opcode. Avoid using longjmp() for return handling because
+ * it has a measurable performance impact in ordinary environments and an extreme
+ * impact in Emscripten (GH-342). Return value is on value stack top.
+ */
+DUK_LOCAL duk_small_uint_t duk__handle_return(duk_hthread *thr, duk_activation *entry_act) {
+ duk_tval *tv1;
+ duk_tval *tv2;
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+ duk_hthread *resumer;
+#endif
+ duk_activation *act;
+ duk_catcher *cat;
+
+ /* We can directly access value stack here. */
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(entry_act != NULL);
+ DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);
+ tv1 = thr->valstack_top - 1;
+ DUK_TVAL_CHKFAST_INPLACE_FAST(tv1); /* fastint downgrade check for return values */
+
+ /*
+ * Four possible outcomes:
+ *
+ * 1. A 'finally' in the same function catches the 'return'.
+ * It may continue to propagate when 'finally' is finished,
+ * or it may be neutralized by 'finally' (both handled by
+ * ENDFIN).
+ *
+ * 2. The return happens at the entry level of the bytecode
+ * executor, so return from the executor (in C stack).
+ *
+ * 3. There is a calling (Ecmascript) activation in the call
+ * stack => return to it, in the same executor instance.
+ *
+ * 4. There is no calling activation, and the thread is
+ * terminated. There is always a resumer in this case,
+ * which gets the return value similarly to a 'yield'
+ * (except that the current thread can no longer be
+ * resumed).
+ */
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->callstack_top >= 1);
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+
+ for (;;) {
+ cat = act->cat;
+ if (cat == NULL) {
+ break;
+ }
+
+ if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF &&
+ DUK_CAT_HAS_FINALLY_ENABLED(cat)) {
+ DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);
+ duk__handle_finally(thr, thr->valstack_top - 1, DUK_LJ_TYPE_RETURN);
+
+ DUK_DD(DUK_DDPRINT("-> return caught by 'finally', restart execution"));
+ return DUK__RETHAND_RESTART;
+ }
+
+ duk_hthread_catcher_unwind_norz(thr, act);
+ }
+
+ if (act == entry_act) {
+ /* Return to the bytecode executor caller who will unwind stacks
+ * and handle constructor post-processing.
+ * Return value is already on the stack top: [ ... retval ].
+ */
+
+ DUK_DDD(DUK_DDDPRINT("-> return propagated up to entry level, exit bytecode executor"));
+ return DUK__RETHAND_FINISHED;
+ }
+
+ if (thr->callstack_top >= 2) {
+ /* There is a caller; it MUST be an Ecmascript caller (otherwise it would
+ * match entry_act check).
+ */
+ DUK_DDD(DUK_DDDPRINT("return to Ecmascript caller, retval_byteoff=%ld, lj_value1=%!T",
+ (long) (thr->callstack_curr->parent->retval_byteoff),
+ (duk_tval *) &thr->heap->lj.value1));
+
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(thr->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent))); /* must be ecmascript */
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (thr->callstack_curr->flags & (DUK_ACT_FLAG_CONSTRUCT | DUK_ACT_FLAG_CONSTRUCT_PROXY)) {
+ duk_call_construct_postprocess(thr, thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY); /* side effects */
+ }
+#else
+ if (thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT) {
+ duk_call_construct_postprocess(thr, 0); /* side effects */
+ }
+#endif
+
+ tv1 = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + thr->callstack_curr->parent->retval_byteoff);
+ DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);
+ tv2 = thr->valstack_top - 1;
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */
+
+ /* Catch stack unwind happens inline in callstack unwind. */
+ duk_hthread_activation_unwind_norz(thr);
+
+ duk__reconfig_valstack_ecma_return(thr);
+
+ DUK_DD(DUK_DDPRINT("-> return not intercepted, restart execution in caller"));
+ return DUK__RETHAND_RESTART;
+ }
+
+#if defined(DUK_USE_COROUTINE_SUPPORT)
+ DUK_DD(DUK_DDPRINT("no calling activation, thread finishes (similar to yield)"));
+
+ DUK_ASSERT(thr->resumer != NULL);
+ DUK_ASSERT(thr->resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */
+ DUK_ASSERT(thr->resumer->callstack_curr != NULL);
+ DUK_ASSERT(thr->resumer->callstack_curr->parent != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr) != NULL &&
+ DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr)) &&
+ ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->resumer->callstack_curr))->func == duk_bi_thread_resume); /* Duktape.Thread.resume() */
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL &&
+ DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent))); /* an Ecmascript function */
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);
+ DUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED);
+
+ resumer = thr->resumer;
+
+ /* Share yield longjmp handler. */
+ DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);
+ duk_hthread_activation_unwind_norz(resumer);
+ duk__handle_yield(thr, resumer, thr->valstack_top - 1);
+
+ duk_hthread_terminate(thr); /* updates thread state, minimizes its allocations */
+ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED);
+
+ thr->resumer = NULL;
+ DUK_HTHREAD_DECREF(thr, resumer);
+ resumer->state = DUK_HTHREAD_STATE_RUNNING;
+ DUK_HEAP_SWITCH_THREAD(thr->heap, resumer);
+#if 0
+ thr = resumer; /* not needed */
+#endif
+
+ DUK_DD(DUK_DDPRINT("-> return not caught, thread terminated; handle like yield, restart execution in resumer"));
+ return DUK__RETHAND_RESTART;
+#else
+ /* Without coroutine support this case should never happen. */
+ DUK_ERROR_INTERNAL(thr);
+ return DUK__RETHAND_FINISHED; /* not executed */
+#endif
+}
+
+/*
+ * Executor interrupt handling
+ *
+ * The handler is called whenever the interrupt countdown reaches zero
+ * (or below). The handler must perform whatever checks are activated,
+ * e.g. check for cumulative step count to impose an execution step
+ * limit or check for breakpoints or other debugger interaction.
+ *
+ * When the actions are done, the handler must reinit the interrupt
+ * init and counter values. The 'init' value must indicate how many
+ * bytecode instructions are executed before the next interrupt. The
+ * counter must interface with the bytecode executor loop. Concretely,
+ * the new init value is normally one higher than the new counter value.
+ * For instance, to execute exactly one bytecode instruction the init
+ * value is set to 1 and the counter to 0. If an error is thrown by the
+ * interrupt handler, the counters are set to the same value (e.g. both
+ * to 0 to cause an interrupt when the next bytecode instruction is about
+ * to be executed after error handling).
+ *
+ * Maintaining the init/counter value properly is important for accurate
+ * behavior. For instance, executor step limit needs a cumulative step
+ * count which is simply computed as a sum of 'init' values. This must
+ * work accurately even when single stepping.
+ */
+
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+
+#define DUK__INT_NOACTION 0 /* no specific action, resume normal execution */
+#define DUK__INT_RESTART 1 /* must "goto restart_execution", e.g. breakpoints changed */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_immediate, duk_small_uint_t *out_interrupt_retval) {
+ duk_activation *act;
+ duk_breakpoint *bp;
+ duk_breakpoint **bp_active;
+ duk_uint_fast32_t line = 0;
+ duk_bool_t process_messages;
+ duk_bool_t processed_messages = 0;
+
+ DUK_ASSERT(thr->heap->dbg_processing == 0); /* don't re-enter e.g. during Eval */
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+
+ /* It might seem that replacing 'thr->heap' with just 'heap' below
+ * might be a good idea, but it increases code size slightly
+ * (probably due to unnecessary spilling) at least on x64.
+ */
+
+ /*
+ * Single opcode step check
+ */
+
+ if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by one opcode step"));
+ duk_debug_set_paused(thr->heap);
+ }
+
+ /*
+ * Breakpoint and step state checks
+ */
+
+ if (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE ||
+ (thr->heap->dbg_pause_act == thr->callstack_curr)) {
+ line = duk_debug_curr_line(thr);
+
+ if (act->prev_line != line) {
+ /* Stepped? Step out is handled by callstack unwind. */
+ if ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) &&
+ (thr->heap->dbg_pause_act == thr->callstack_curr) &&
+ (line != thr->heap->dbg_pause_startline)) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by line change, at line %ld",
+ (long) line));
+ duk_debug_set_paused(thr->heap);
+ }
+
+ /* Check for breakpoints only on line transition.
+ * Breakpoint is triggered when we enter the target
+ * line from a different line, and the previous line
+ * was within the same function.
+ *
+ * This condition is tricky: the condition used to be
+ * that transition to -or across- the breakpoint line
+ * triggered the breakpoint. This seems intuitively
+ * better because it handles breakpoints on lines with
+ * no emitted opcodes; but this leads to the issue
+ * described in: https://github.com/svaarala/duktape/issues/263.
+ */
+ bp_active = thr->heap->dbg_breakpoints_active;
+ for (;;) {
+ bp = *bp_active++;
+ if (bp == NULL) {
+ break;
+ }
+
+ DUK_ASSERT(bp->filename != NULL);
+ if (act->prev_line != bp->line && line == bp->line) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by breakpoint at %!O:%ld",
+ (duk_heaphdr *) bp->filename, (long) bp->line));
+ duk_debug_set_paused(thr->heap);
+ }
+ }
+ } else {
+ ;
+ }
+
+ act->prev_line = (duk_uint32_t) line;
+ }
+
+ /*
+ * Rate limit check for sending status update or peeking into
+ * the debug transport. Both can be expensive operations that
+ * we don't want to do on every opcode.
+ *
+ * Making sure the interval remains reasonable on a wide variety
+ * of targets and bytecode is difficult without a timestamp, so
+ * we use a Date-provided timestamp for the rate limit check.
+ * But since it's also expensive to get a timestamp, a bytecode
+ * counter is used to rate limit getting timestamps.
+ */
+
+ process_messages = 0;
+ if (thr->heap->dbg_state_dirty || DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->dbg_detaching) {
+ /* Enter message processing loop for sending Status notifys and
+ * to finish a pending detach.
+ */
+ process_messages = 1;
+ }
+
+ /* XXX: remove heap->dbg_exec_counter, use heap->inst_count_interrupt instead? */
+ DUK_ASSERT(thr->interrupt_init >= 0);
+ thr->heap->dbg_exec_counter += (duk_uint_t) thr->interrupt_init;
+ if (thr->heap->dbg_exec_counter - thr->heap->dbg_last_counter >= DUK_HEAP_DBG_RATELIMIT_OPCODES) {
+ /* Overflow of the execution counter is fine and doesn't break
+ * anything here.
+ */
+
+ duk_double_t now, diff_last;
+
+ thr->heap->dbg_last_counter = thr->heap->dbg_exec_counter;
+ now = duk_time_get_monotonic_time(thr);
+
+ diff_last = now - thr->heap->dbg_last_time;
+ if (diff_last < 0.0 || diff_last >= (duk_double_t) DUK_HEAP_DBG_RATELIMIT_MILLISECS) {
+ /* Monotonic time should not experience time jumps,
+ * but the provider may be missing and we're actually
+ * using Ecmascript time. So, tolerate negative values
+ * so that a time jump works reasonably.
+ *
+ * Same interval is now used for status sending and
+ * peeking.
+ */
+
+ thr->heap->dbg_last_time = now;
+ thr->heap->dbg_state_dirty = 1;
+ process_messages = 1;
+ }
+ }
+
+ /*
+ * Process messages and send status if necessary.
+ *
+ * If we're paused, we'll block for new messages. If we're not
+ * paused, we'll process anything we can peek but won't block
+ * for more. Detach (and re-attach) handling is all localized
+ * to duk_debug_process_messages() too.
+ *
+ * Debugger writes outside the message loop may cause debugger
+ * detach1 phase to run, after which dbg_read_cb == NULL and
+ * dbg_detaching != 0. The message loop will finish the detach
+ * by running detach2 phase, so enter the message loop also when
+ * detaching.
+ */
+
+ if (process_messages) {
+ DUK_ASSERT(thr->heap->dbg_processing == 0);
+ processed_messages = duk_debug_process_messages(thr, 0 /*no_block*/);
+ DUK_ASSERT(thr->heap->dbg_processing == 0);
+ }
+
+ /* Continue checked execution if there are breakpoints or we're stepping.
+ * Also use checked execution if paused flag is active - it shouldn't be
+ * because the debug message loop shouldn't terminate if it was. Step out
+ * is handled by callstack unwind and doesn't need checked execution.
+ * Note that debugger may have detached due to error or explicit request
+ * above, so we must recheck attach status.
+ */
+
+ if (duk_debug_is_attached(thr->heap)) {
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ if (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE ||
+ (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) ||
+ ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) &&
+ thr->heap->dbg_pause_act == thr->callstack_curr) ||
+ DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) {
+ *out_immediate = 1;
+ }
+
+ /* If we processed any debug messages breakpoints may have
+ * changed; restart execution to re-check active breakpoints.
+ */
+ if (processed_messages) {
+ DUK_D(DUK_DPRINT("processed debug messages, restart execution to recheck possibly changed breakpoints"));
+ *out_interrupt_retval = DUK__INT_RESTART;
+ } else {
+ if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) {
+ /* Set 'pause after one opcode' active only when we're
+ * actually just about to execute code.
+ */
+ thr->heap->dbg_pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE;
+ }
+ }
+ } else {
+ DUK_D(DUK_DPRINT("debugger became detached, resume normal execution"));
+ }
+}
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+DUK_LOCAL DUK__NOINLINE_PERF DUK_COLD duk_small_uint_t duk__executor_interrupt(duk_hthread *thr) {
+ duk_int_t ctr;
+ duk_activation *act;
+ duk_hcompfunc *fun;
+ duk_bool_t immediate = 0;
+ duk_small_uint_t retval;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->heap != NULL);
+ DUK_ASSERT(thr->callstack_top > 0);
+
+#if defined(DUK_USE_DEBUG)
+ thr->heap->inst_count_interrupt += thr->interrupt_init;
+ DUK_DD(DUK_DDPRINT("execution interrupt, counter=%ld, init=%ld, "
+ "instruction counts: executor=%ld, interrupt=%ld",
+ (long) thr->interrupt_counter, (long) thr->interrupt_init,
+ (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt));
+#endif
+
+ retval = DUK__INT_NOACTION;
+ ctr = DUK_HTHREAD_INTCTR_DEFAULT;
+
+ /*
+ * Avoid nested calls. Concretely this happens during debugging, e.g.
+ * when we eval() an expression.
+ *
+ * Also don't interrupt if we're currently doing debug processing
+ * (which can be initiated outside the bytecode executor) as this
+ * may cause the debugger to be called recursively. Check required
+ * for correct operation of throw intercept and other "exotic" halting
+ * scenarios.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap) || thr->heap->dbg_processing) {
+#else
+ if (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap)) {
+#endif
+ DUK_DD(DUK_DDPRINT("nested executor interrupt, ignoring"));
+
+ /* Set a high interrupt counter; the original executor
+ * interrupt invocation will rewrite before exiting.
+ */
+ thr->interrupt_init = ctr;
+ thr->interrupt_counter = ctr - 1;
+ return DUK__INT_NOACTION;
+ }
+ DUK_HEAP_SET_INTERRUPT_RUNNING(thr->heap);
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+
+ fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC((duk_hobject *) fun));
+
+ DUK_UNREF(fun);
+
+#if defined(DUK_USE_EXEC_TIMEOUT_CHECK)
+ /*
+ * Execution timeout check
+ */
+
+ if (DUK_USE_EXEC_TIMEOUT_CHECK(thr->heap->heap_udata)) {
+ /* Keep throwing an error whenever we get here. The unusual values
+ * are set this way because no instruction is ever executed, we just
+ * throw an error until all try/catch/finally and other catchpoints
+ * have been exhausted. Duktape/C code gets control at each protected
+ * call but whenever it enters back into Duktape the RangeError gets
+ * raised. User exec timeout check must consistently indicate a timeout
+ * until we've fully bubbled out of Duktape.
+ */
+ DUK_D(DUK_DPRINT("execution timeout, throwing a RangeError"));
+ thr->interrupt_init = 0;
+ thr->interrupt_counter = 0;
+ DUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap);
+ DUK_ERROR_RANGE(thr, "execution timeout");
+ }
+#endif /* DUK_USE_EXEC_TIMEOUT_CHECK */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (!thr->heap->dbg_processing &&
+ (thr->heap->dbg_read_cb != NULL || thr->heap->dbg_detaching)) {
+ /* Avoid recursive re-entry; enter when we're attached or
+ * detaching (to finish off the pending detach).
+ */
+ duk__interrupt_handle_debugger(thr, &immediate, &retval);
+ DUK_ASSERT(act == thr->callstack_curr);
+ }
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+ /*
+ * Update the interrupt counter
+ */
+
+ if (immediate) {
+ /* Cause an interrupt after executing one instruction. */
+ ctr = 1;
+ }
+
+ /* The counter value is one less than the init value: init value should
+ * indicate how many instructions are executed before interrupt. To
+ * execute 1 instruction (after interrupt handler return), counter must
+ * be 0.
+ */
+ DUK_ASSERT(ctr >= 1);
+ thr->interrupt_init = ctr;
+ thr->interrupt_counter = ctr - 1;
+ DUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap);
+
+ return retval;
+}
+#endif /* DUK_USE_INTERRUPT_COUNTER */
+
+/*
+ * Debugger handling for executor restart
+ *
+ * Check for breakpoints, stepping, etc, and figure out if we should execute
+ * in checked or normal mode. Note that we can't do this when an activation
+ * is created, because breakpoint status (and stepping status) may change
+ * later, so we must recheck every time we're executing an activation.
+ * This primitive should be side effect free to avoid changes during check.
+ */
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+DUK_LOCAL void duk__executor_recheck_debugger(duk_hthread *thr, duk_activation *act, duk_hcompfunc *fun) {
+ duk_heap *heap;
+ duk_tval *tv_tmp;
+ duk_hstring *filename;
+ duk_small_uint_t bp_idx;
+ duk_breakpoint **bp_active;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(fun != NULL);
+
+ heap = thr->heap;
+ bp_active = heap->dbg_breakpoints_active;
+ act->flags &= ~DUK_ACT_FLAG_BREAKPOINT_ACTIVE;
+
+ tv_tmp = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) fun, DUK_HTHREAD_STRING_FILE_NAME(thr));
+ if (tv_tmp && DUK_TVAL_IS_STRING(tv_tmp)) {
+ filename = DUK_TVAL_GET_STRING(tv_tmp);
+
+ /* Figure out all active breakpoints. A breakpoint is
+ * considered active if the current function's fileName
+ * matches the breakpoint's fileName, AND there is no
+ * inner function that has matching line numbers
+ * (otherwise a breakpoint would be triggered both
+ * inside and outside of the inner function which would
+ * be confusing). Example:
+ *
+ * function foo() {
+ * print('foo');
+ * function bar() { <-. breakpoints in these
+ * print('bar'); | lines should not affect
+ * } <-' foo() execution
+ * bar();
+ * }
+ *
+ * We need a few things that are only available when
+ * debugger support is enabled: (1) a line range for
+ * each function, and (2) access to the function
+ * template to access the inner functions (and their
+ * line ranges).
+ *
+ * It's important to have a narrow match for active
+ * breakpoints so that we don't enter checked execution
+ * when that's not necessary. For instance, if we're
+ * running inside a certain function and there's
+ * breakpoint outside in (after the call site), we
+ * don't want to slow down execution of the function.
+ */
+
+ for (bp_idx = 0; bp_idx < heap->dbg_breakpoint_count; bp_idx++) {
+ duk_breakpoint *bp = heap->dbg_breakpoints + bp_idx;
+ duk_hobject **funcs, **funcs_end;
+ duk_hcompfunc *inner_fun;
+ duk_bool_t bp_match;
+
+ if (bp->filename == filename &&
+ bp->line >= fun->start_line && bp->line <= fun->end_line) {
+ bp_match = 1;
+ DUK_DD(DUK_DDPRINT("breakpoint filename and line match: "
+ "%s:%ld vs. %s (line %ld vs. %ld-%ld)",
+ DUK_HSTRING_GET_DATA(bp->filename),
+ (long) bp->line,
+ DUK_HSTRING_GET_DATA(filename),
+ (long) bp->line,
+ (long) fun->start_line,
+ (long) fun->end_line));
+
+ funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun);
+ funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, fun);
+ while (funcs != funcs_end) {
+ inner_fun = (duk_hcompfunc *) *funcs;
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) inner_fun));
+ if (bp->line >= inner_fun->start_line && bp->line <= inner_fun->end_line) {
+ DUK_DD(DUK_DDPRINT("inner function masks ('captures') breakpoint"));
+ bp_match = 0;
+ break;
+ }
+ funcs++;
+ }
+
+ if (bp_match) {
+ /* No need to check for size of bp_active list,
+ * it's always larger than maximum number of
+ * breakpoints.
+ */
+ act->flags |= DUK_ACT_FLAG_BREAKPOINT_ACTIVE;
+ *bp_active = heap->dbg_breakpoints + bp_idx;
+ bp_active++;
+ }
+ }
+ }
+ }
+
+ *bp_active = NULL; /* terminate */
+
+ DUK_DD(DUK_DDPRINT("ACTIVE BREAKPOINTS: %ld", (long) (bp_active - thr->heap->dbg_breakpoints_active)));
+
+ /* Force pause if we were doing "step into" in another activation. */
+ if ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) &&
+ thr->heap->dbg_pause_act != thr->callstack_curr) {
+ DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function entry"));
+ duk_debug_set_paused(thr->heap);
+ }
+
+ /* Force interrupt right away if we're paused or in "checked mode".
+ * Step out is handled by callstack unwind.
+ */
+ if ((act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE) ||
+ DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) ||
+ ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) &&
+ thr->heap->dbg_pause_act == thr->callstack_curr)) {
+ /* We'll need to interrupt early so recompute the init
+ * counter to reflect the number of bytecode instructions
+ * executed so that step counts for e.g. debugger rate
+ * limiting are accurate.
+ */
+ DUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init);
+ thr->interrupt_init = thr->interrupt_init - thr->interrupt_counter;
+ thr->interrupt_counter = 0;
+ }
+}
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+/*
+ * Opcode handlers for opcodes with a lot of code and which are relatively
+ * rare; NOINLINE to reduce amount of code in main bytecode dispatcher.
+ */
+
+DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initset_initget(duk_hthread *thr, duk_uint_fast32_t ins) {
+ duk_bool_t is_set = (DUK_DEC_OP(ins) == DUK_OP_INITSET);
+ duk_uint_fast_t idx;
+ duk_uint_t defprop_flags;
+
+ /* A -> object register (acts as a source)
+ * BC -> BC+0 contains key, BC+1 closure (value)
+ */
+
+ /* INITSET/INITGET are only used to initialize object literal keys.
+ * There may be a previous propery in ES2015 because duplicate property
+ * names are allowed.
+ */
+
+ /* This could be made more optimal by accessing internals directly. */
+
+ idx = (duk_uint_fast_t) DUK_DEC_BC(ins);
+ duk_dup(thr, (duk_idx_t) (idx + 0)); /* key */
+ duk_dup(thr, (duk_idx_t) (idx + 1)); /* getter/setter */
+ if (is_set) {
+ defprop_flags = DUK_DEFPROP_HAVE_SETTER |
+ DUK_DEFPROP_FORCE |
+ DUK_DEFPROP_SET_ENUMERABLE |
+ DUK_DEFPROP_SET_CONFIGURABLE;
+ } else {
+ defprop_flags = DUK_DEFPROP_HAVE_GETTER |
+ DUK_DEFPROP_FORCE |
+ DUK_DEFPROP_SET_ENUMERABLE |
+ DUK_DEFPROP_SET_CONFIGURABLE;
+ }
+ duk_def_prop(thr, (duk_idx_t) DUK_DEC_A(ins), defprop_flags);
+}
+
+DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_trycatch(duk_hthread *thr, duk_uint_fast32_t ins, duk_instr_t *curr_pc) {
+ duk_activation *act;
+ duk_catcher *cat;
+ duk_tval *tv1;
+ duk_small_uint_fast_t a;
+ duk_small_uint_fast_t bc;
+
+ /* A -> flags
+ * BC -> reg_catch; base register for two registers used both during
+ * trycatch setup and when catch is triggered
+ *
+ * If DUK_BC_TRYCATCH_FLAG_CATCH_BINDING set:
+ * reg_catch + 0: catch binding variable name (string).
+ * Automatic declarative environment is established for
+ * the duration of the 'catch' clause.
+ *
+ * If DUK_BC_TRYCATCH_FLAG_WITH_BINDING set:
+ * reg_catch + 0: with 'target value', which is coerced to
+ * an object and then used as a bindind object for an
+ * environment record. The binding is initialized here, for
+ * the 'try' clause.
+ *
+ * Note that a TRYCATCH generated for a 'with' statement has no
+ * catch or finally parts.
+ */
+
+ /* XXX: TRYCATCH handling should be reworked to avoid creating
+ * an explicit scope unless it is actually needed (e.g. function
+ * instances or eval is executed inside the catch block). This
+ * rework is not trivial because the compiler doesn't have an
+ * intermediate representation. When the rework is done, the
+ * opcode format can also be made more straightforward.
+ */
+
+ /* XXX: side effect handling is quite awkward here */
+
+ DUK_DDD(DUK_DDDPRINT("TRYCATCH: reg_catch=%ld, have_catch=%ld, "
+ "have_finally=%ld, catch_binding=%ld, with_binding=%ld (flags=0x%02lx)",
+ (long) DUK_DEC_BC(ins),
+ (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH ? 1 : 0),
+ (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY ? 1 : 0),
+ (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING ? 1 : 0),
+ (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_WITH_BINDING ? 1 : 0),
+ (unsigned long) DUK_DEC_A(ins)));
+
+ a = DUK_DEC_A(ins);
+ bc = DUK_DEC_BC(ins);
+
+ /* Registers 'bc' and 'bc + 1' are written in longjmp handling
+ * and if their previous values (which are temporaries) become
+ * unreachable -and- have a finalizer, there'll be a function
+ * call during error handling which is not supported now (GH-287).
+ * Ensure that both 'bc' and 'bc + 1' have primitive values to
+ * guarantee no finalizer calls in error handling. Scrubbing also
+ * ensures finalizers for the previous values run here rather than
+ * later. Error handling related values are also written to 'bc'
+ * and 'bc + 1' but those values never become unreachable during
+ * error handling, so there's no side effect problem even if the
+ * error value has a finalizer.
+ */
+ duk_dup(thr, (duk_idx_t) bc); /* Stabilize value. */
+ duk_to_undefined(thr, (duk_idx_t) bc);
+ duk_to_undefined(thr, (duk_idx_t) (bc + 1));
+
+ /* Allocate catcher and populate it. Doesn't have to
+ * be fully atomic, but the catcher must be in a
+ * consistent state if side effects (such as finalizer
+ * calls) occur.
+ */
+
+ cat = duk_hthread_catcher_alloc(thr);
+ DUK_ASSERT(cat != NULL);
+
+ cat->flags = DUK_CAT_TYPE_TCF;
+ cat->h_varname = NULL;
+ cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */
+ cat->idx_base = (duk_size_t) (thr->valstack_bottom - thr->valstack) + bc;
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ cat->parent = act->cat;
+ act->cat = cat;
+
+ if (a & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) {
+ cat->flags |= DUK_CAT_FLAG_CATCH_ENABLED;
+ }
+ if (a & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) {
+ cat->flags |= DUK_CAT_FLAG_FINALLY_ENABLED;
+ }
+ if (a & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING) {
+ DUK_DDD(DUK_DDDPRINT("catch binding flag set to catcher"));
+ cat->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED;
+ tv1 = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv1));
+
+ /* borrowed reference; although 'tv1' comes from a register,
+ * its value was loaded using LDCONST so the constant will
+ * also exist and be reachable.
+ */
+ cat->h_varname = DUK_TVAL_GET_STRING(tv1);
+ } else if (a & DUK_BC_TRYCATCH_FLAG_WITH_BINDING) {
+ duk_hobjenv *env;
+ duk_hobject *target;
+
+ /* Delayed env initialization for activation (if needed). */
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ if (act->lex_env == NULL) {
+ DUK_DDD(DUK_DDDPRINT("delayed environment initialization"));
+ DUK_ASSERT(act->var_env == NULL);
+
+ duk_js_init_activation_environment_records_delayed(thr, act);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_UNREF(act); /* 'act' is no longer accessed, scanbuild fix */
+ }
+ DUK_ASSERT(act->lex_env != NULL);
+ DUK_ASSERT(act->var_env != NULL);
+
+ /* Coerce 'with' target. */
+ target = duk_to_hobject(thr, -1);
+ DUK_ASSERT(target != NULL);
+
+ /* Create an object environment; it is not pushed
+ * so avoid side effects very carefully until it is
+ * referenced.
+ */
+ env = duk_hobjenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL);
+ env->target = target; /* always provideThis=true */
+ DUK_HOBJECT_INCREF(thr, target);
+ env->has_this = 1;
+ DUK_ASSERT_HOBJENV_VALID(env);
+ DUK_DDD(DUK_DDDPRINT("environment for with binding: %!iO", env));
+
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL);
+ DUK_ASSERT(act->lex_env != NULL);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, act->lex_env);
+ act->lex_env = (duk_hobject *) env; /* Now reachable. */
+ DUK_HOBJECT_INCREF(thr, (duk_hobject *) env);
+ /* Net refcount change to act->lex_env is 0: incref for env's
+ * prototype, decref for act->lex_env overwrite.
+ */
+
+ /* Set catcher lex_env active (affects unwind)
+ * only when the whole setup is complete.
+ */
+ cat = act->cat; /* XXX: better to relookup? not mandatory because 'cat' is stable */
+ cat->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE;
+ } else {
+ ;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("TRYCATCH catcher: flags=0x%08lx, pc_base=%ld, "
+ "idx_base=%ld, h_varname=%!O",
+ (unsigned long) cat->flags,
+ (long) cat->pc_base, (long) cat->idx_base, (duk_heaphdr *) cat->h_varname));
+
+ duk_pop_unsafe(thr);
+}
+
+DUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endtry(duk_hthread *thr, duk_uint_fast32_t ins) {
+ duk_activation *act;
+ duk_catcher *cat;
+ duk_tval *tv1;
+ duk_instr_t *pc_base;
+
+ DUK_UNREF(ins);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+ DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF);
+
+ DUK_DDD(DUK_DDDPRINT("ENDTRY: clearing catch active flag (regardless of whether it was set or not)"));
+ DUK_CAT_CLEAR_CATCH_ENABLED(cat);
+
+ pc_base = cat->pc_base;
+
+ if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) {
+ DUK_DDD(DUK_DDDPRINT("ENDTRY: finally part is active, jump through 2nd jump slot with 'normal continuation'"));
+
+ tv1 = thr->valstack + cat->idx_base;
+ DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */
+ tv1 = NULL;
+
+ tv1 = thr->valstack + cat->idx_base + 1;
+ DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);
+ DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */
+ tv1 = NULL;
+
+ DUK_CAT_CLEAR_FINALLY_ENABLED(cat);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("ENDTRY: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)"));
+
+ duk_hthread_catcher_unwind_norz(thr, act); /* lexenv may be set for 'with' binding */
+ /* no need to unwind callstack */
+ }
+
+ return pc_base + 1; /* new curr_pc value */
+}
+
+DUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endcatch(duk_hthread *thr, duk_uint_fast32_t ins) {
+ duk_activation *act;
+ duk_catcher *cat;
+ duk_tval *tv1;
+ duk_instr_t *pc_base;
+
+ DUK_UNREF(ins);
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ cat = act->cat;
+ DUK_ASSERT(cat != NULL);
+ DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); /* cleared before entering catch part */
+
+ if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) {
+ duk_hobject *prev_env;
+
+ /* 'with' binding has no catch clause, so can't be here unless a normal try-catch */
+ DUK_ASSERT(DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat));
+ DUK_ASSERT(act->lex_env != NULL);
+
+ DUK_DDD(DUK_DDDPRINT("ENDCATCH: popping catcher part lexical environment"));
+
+ prev_env = act->lex_env;
+ DUK_ASSERT(prev_env != NULL);
+ act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, prev_env);
+ DUK_CAT_CLEAR_LEXENV_ACTIVE(cat);
+ DUK_HOBJECT_INCREF(thr, act->lex_env);
+ DUK_HOBJECT_DECREF(thr, prev_env); /* side effects */
+
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ }
+
+ pc_base = cat->pc_base;
+
+ if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) {
+ DUK_DDD(DUK_DDDPRINT("ENDCATCH: finally part is active, jump through 2nd jump slot with 'normal continuation'"));
+
+ tv1 = thr->valstack + cat->idx_base;
+ DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */
+ tv1 = NULL;
+
+ tv1 = thr->valstack + cat->idx_base + 1;
+ DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);
+ DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */
+ tv1 = NULL;
+
+ DUK_CAT_CLEAR_FINALLY_ENABLED(cat);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("ENDCATCH: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)"));
+
+ duk_hthread_catcher_unwind_norz(thr, act);
+ /* no need to unwind callstack */
+ }
+
+ return pc_base + 1; /* new curr_pc value */
+}
+
+DUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_endfin(duk_hthread *thr, duk_uint_fast32_t ins, duk_activation *entry_act) {
+ duk_activation *act;
+ duk_tval *tv1;
+ duk_uint_t reg_catch;
+ duk_small_uint_t cont_type;
+ duk_small_uint_t ret_result;
+
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ DUK_ASSERT(thr->callstack_top >= 1);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ reg_catch = DUK_DEC_ABC(ins);
+
+ /* CATCH flag may be enabled or disabled here; it may be enabled if
+ * the statement has a catch block but the try block does not throw
+ * an error.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("ENDFIN: completion value=%!T, type=%!T",
+ (duk_tval *) (thr->valstack_bottom + reg_catch + 0),
+ (duk_tval *) (thr->valstack_bottom + reg_catch + 1)));
+
+ tv1 = thr->valstack_bottom + reg_catch + 1; /* type */
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));
+ cont_type = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1);
+#else
+ cont_type = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1);
+#endif
+
+ tv1--; /* value */
+
+ switch (cont_type) {
+ case DUK_LJ_TYPE_NORMAL: {
+ DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'normal' (non-abrupt) completion -> "
+ "dismantle catcher, resume execution after ENDFIN"));
+
+ duk_hthread_catcher_unwind_norz(thr, act);
+ /* no need to unwind callstack */
+ return 0; /* restart execution */
+ }
+ case DUK_LJ_TYPE_RETURN: {
+ DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'return' complation -> dismantle "
+ "catcher, handle return, lj.value1=%!T", tv1));
+
+ /* Not necessary to unwind catch stack: return handling will
+ * do it. The finally flag of 'cat' is no longer set. The
+ * catch flag may be set, but it's not checked by return handling.
+ */
+
+ duk_push_tval(thr, tv1);
+ ret_result = duk__handle_return(thr, entry_act);
+ if (ret_result == DUK__RETHAND_RESTART) {
+ return 0; /* restart execution */
+ }
+ DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED);
+
+ DUK_DDD(DUK_DDDPRINT("exiting executor after ENDFIN and RETURN (pseudo) longjmp type"));
+ return 1; /* exit executor */
+ }
+ case DUK_LJ_TYPE_BREAK:
+ case DUK_LJ_TYPE_CONTINUE: {
+ duk_uint_t label_id;
+ duk_small_uint_t lj_type;
+
+ /* Not necessary to unwind catch stack: break/continue
+ * handling will do it. The finally flag of 'cat' is
+ * no longer set. The catch flag may be set, but it's
+ * not checked by break/continue handling.
+ */
+
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));
+ label_id = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1);
+#else
+ label_id = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1);
+#endif
+ lj_type = cont_type;
+ duk__handle_break_or_continue(thr, label_id, lj_type);
+ return 0; /* restart execution */
+ }
+ default: {
+ DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with abrupt completion, lj_type=%ld -> "
+ "dismantle catcher, re-throw error",
+ (long) cont_type));
+
+ duk_err_setup_ljstate1(thr, (duk_small_uint_t) cont_type, tv1);
+ /* No debugger Throw notify check on purpose (rethrow). */
+
+ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */
+ duk_err_longjmp(thr);
+ DUK_UNREACHABLE();
+ }
+ }
+
+ DUK_UNREACHABLE();
+ return 0;
+}
+
+DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initenum(duk_hthread *thr, duk_uint_fast32_t ins) {
+ duk_small_uint_t b;
+ duk_small_uint_t c;
+
+ /*
+ * Enumeration semantics come from for-in statement, E5 Section 12.6.4.
+ * If called with 'null' or 'undefined', this opcode returns 'null' as
+ * the enumerator, which is special cased in NEXTENUM. This simplifies
+ * the compiler part
+ */
+
+ /* B -> register for writing enumerator object
+ * C -> value to be enumerated (register)
+ */
+ b = DUK_DEC_B(ins);
+ c = DUK_DEC_C(ins);
+
+ if (duk_is_null_or_undefined(thr, (duk_idx_t) c)) {
+ duk_push_null(thr);
+ duk_replace(thr, (duk_idx_t) b);
+ } else {
+ duk_dup(thr, (duk_idx_t) c);
+ duk_to_object(thr, -1);
+ duk_hobject_enumerator_create(thr, 0 /*enum_flags*/); /* [ ... val ] --> [ ... enum ] */
+ duk_replace(thr, (duk_idx_t) b);
+ }
+}
+
+DUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_nextenum(duk_hthread *thr, duk_uint_fast32_t ins) {
+ duk_small_uint_t b;
+ duk_small_uint_t c;
+ duk_small_uint_t pc_skip = 0;
+
+ /*
+ * NEXTENUM checks whether the enumerator still has unenumerated
+ * keys. If so, the next key is loaded to the target register
+ * and the next instruction is skipped. Otherwise the next instruction
+ * will be executed, jumping out of the enumeration loop.
+ */
+
+ /* B -> target register for next key
+ * C -> enum register
+ */
+ b = DUK_DEC_B(ins);
+ c = DUK_DEC_C(ins);
+
+ DUK_DDD(DUK_DDDPRINT("NEXTENUM: b->%!T, c->%!T",
+ (duk_tval *) duk_get_tval(thr, (duk_idx_t) b),
+ (duk_tval *) duk_get_tval(thr, (duk_idx_t) c)));
+
+ if (duk_is_object(thr, (duk_idx_t) c)) {
+ /* XXX: assert 'c' is an enumerator */
+ duk_dup(thr, (duk_idx_t) c);
+ if (duk_hobject_enumerator_next(thr, 0 /*get_value*/)) {
+ /* [ ... enum ] -> [ ... next_key ] */
+ DUK_DDD(DUK_DDDPRINT("enum active, next key is %!T, skip jump slot ",
+ (duk_tval *) duk_get_tval(thr, -1)));
+ pc_skip = 1;
+ } else {
+ /* [ ... enum ] -> [ ... ] */
+ DUK_DDD(DUK_DDDPRINT("enum finished, execute jump slot"));
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */
+ thr->valstack_top++;
+ }
+ duk_replace(thr, (duk_idx_t) b);
+ } else {
+ /* 'null' enumerator case -> behave as with an empty enumerator */
+ DUK_ASSERT(duk_is_null(thr, (duk_idx_t) c));
+ DUK_DDD(DUK_DDDPRINT("enum is null, execute jump slot"));
+ }
+
+ return pc_skip;
+}
+
+/*
+ * Call handling helpers.
+ */
+
+DUK_LOCAL duk_bool_t duk__executor_handle_call(duk_hthread *thr, duk_idx_t idx, duk_idx_t nargs, duk_small_uint_t call_flags) {
+ duk_bool_t rc;
+
+ duk_set_top_unsafe(thr, (duk_idx_t) (idx + nargs + 2)); /* [ ... func this arg1 ... argN ] */
+
+ /* Attempt an Ecma-to-Ecma call setup. If the call
+ * target is (directly or indirectly) Reflect.construct(),
+ * the call may change into a constructor call on the fly.
+ */
+ rc = (duk_bool_t) duk_handle_call_unprotected(thr, idx, call_flags);
+ if (rc != 0) {
+ /* Ecma-to-ecma call possible, may or may not
+ * be a tail call. Avoid C recursion by
+ * reusing current executor instance.
+ */
+ DUK_DDD(DUK_DDDPRINT("ecma-to-ecma call setup possible, restart execution"));
+ /* curr_pc synced by duk_handle_call_unprotected() */
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ return rc;
+ } else {
+ /* Call was handled inline. */
+ }
+ DUK_ASSERT(thr->ptr_curr_pc != NULL);
+ return rc;
+}
+
+/*
+ * Ecmascript bytecode executor.
+ *
+ * Resume execution for the current thread from its current activation.
+ * Returns when execution would return from the entry level activation,
+ * leaving a single return value on top of the stack. Function calls
+ * and thread resumptions are handled internally. If an error occurs,
+ * a longjmp() with type DUK_LJ_TYPE_THROW is called on the entry level
+ * setjmp() jmpbuf.
+ *
+ * Ecmascript function calls and coroutine resumptions are handled
+ * internally (by the outer executor function) without recursive C calls.
+ * Other function calls are handled using duk_handle_call(), increasing
+ * C recursion depth.
+ *
+ * Abrupt completions (= long control tranfers) are handled either
+ * directly by reconfiguring relevant stacks and restarting execution,
+ * or via a longjmp. Longjmp-free handling is preferable for performance
+ * (especially Emscripten performance), and is used for: break, continue,
+ * and return.
+ *
+ * For more detailed notes, see doc/execution.rst.
+ *
+ * Also see doc/code-issues.rst for discussion of setjmp(), longjmp(),
+ * and volatile.
+ */
+
+/* Presence of 'fun' is config based, there's a marginal performance
+ * difference and the best option is architecture dependent.
+ */
+#if defined(DUK_USE_EXEC_FUN_LOCAL)
+#define DUK__FUN() fun
+#else
+#define DUK__FUN() ((duk_hcompfunc *) DUK_ACT_GET_FUNC((thr)->callstack_curr))
+#endif
+
+/* Strict flag. */
+#define DUK__STRICT() ((duk_small_uint_t) DUK_HOBJECT_HAS_STRICT((duk_hobject *) DUK__FUN()))
+
+/* Reg/const access macros: these are very footprint and performance sensitive
+ * so modify with care. Arguments are sometimes evaluated multiple times which
+ * is not ideal.
+ */
+#define DUK__REG(x) (*(thr->valstack_bottom + (x)))
+#define DUK__REGP(x) (thr->valstack_bottom + (x))
+#define DUK__CONST(x) (*(consts + (x)))
+#define DUK__CONSTP(x) (consts + (x))
+
+/* Reg/const access macros which take the 32-bit instruction and avoid an
+ * explicit field decoding step by using shifts and masks. These must be
+ * kept in sync with duk_js_bytecode.h. The shift/mask values are chosen
+ * so that 'ins' can be shifted and masked and used as a -byte- offset
+ * instead of a duk_tval offset which needs further shifting (which is an
+ * issue on some, but not all, CPUs).
+ */
+#define DUK__RCBIT_B DUK_BC_REGCONST_B
+#define DUK__RCBIT_C DUK_BC_REGCONST_C
+#if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE)
+#if defined(DUK_USE_PACKED_TVAL)
+#define DUK__TVAL_SHIFT 3 /* sizeof(duk_tval) == 8 */
+#else
+#define DUK__TVAL_SHIFT 4 /* sizeof(duk_tval) == 16; not always the case so also asserted for */
+#endif
+#define DUK__SHIFT_A (DUK_BC_SHIFT_A - DUK__TVAL_SHIFT)
+#define DUK__SHIFT_B (DUK_BC_SHIFT_B - DUK__TVAL_SHIFT)
+#define DUK__SHIFT_C (DUK_BC_SHIFT_C - DUK__TVAL_SHIFT)
+#define DUK__SHIFT_BC (DUK_BC_SHIFT_BC - DUK__TVAL_SHIFT)
+#define DUK__MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK__TVAL_SHIFT)
+#define DUK__MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK__TVAL_SHIFT)
+#define DUK__MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK__TVAL_SHIFT)
+#define DUK__MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK__TVAL_SHIFT)
+#define DUK__BYTEOFF_A(ins) (((ins) >> DUK__SHIFT_A) & DUK__MASK_A)
+#define DUK__BYTEOFF_B(ins) (((ins) >> DUK__SHIFT_B) & DUK__MASK_B)
+#define DUK__BYTEOFF_C(ins) (((ins) >> DUK__SHIFT_C) & DUK__MASK_C)
+#define DUK__BYTEOFF_BC(ins) (((ins) >> DUK__SHIFT_BC) & DUK__MASK_BC)
+
+#define DUK__REGP_A(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_A((ins))))
+#define DUK__REGP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_B((ins))))
+#define DUK__REGP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_C((ins))))
+#define DUK__REGP_BC(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_BC((ins))))
+#define DUK__CONSTP_A(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_A((ins))))
+#define DUK__CONSTP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_B((ins))))
+#define DUK__CONSTP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_C((ins))))
+#define DUK__CONSTP_BC(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_BC((ins))))
+#define DUK__REGCONSTP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_B((ins))))
+#define DUK__REGCONSTP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_C((ins))))
+#else /* DUK_USE_EXEC_REGCONST_OPTIMIZE */
+/* Safe alternatives, no assumption about duk_tval size. */
+#define DUK__REGP_A(ins) DUK__REGP(DUK_DEC_A((ins)))
+#define DUK__REGP_B(ins) DUK__REGP(DUK_DEC_B((ins)))
+#define DUK__REGP_C(ins) DUK__REGP(DUK_DEC_C((ins)))
+#define DUK__REGP_BC(ins) DUK__REGP(DUK_DEC_BC((ins)))
+#define DUK__CONSTP_A(ins) DUK__CONSTP(DUK_DEC_A((ins)))
+#define DUK__CONSTP_B(ins) DUK__CONSTP(DUK_DEC_B((ins)))
+#define DUK__CONSTP_C(ins) DUK__CONSTP(DUK_DEC_C((ins)))
+#define DUK__CONSTP_BC(ins) DUK__CONSTP(DUK_DEC_BC((ins)))
+#define DUK__REGCONSTP_B(ins) ((((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK_DEC_B((ins)))
+#define DUK__REGCONSTP_C(ins) ((((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK_DEC_C((ins)))
+#endif /* DUK_USE_EXEC_REGCONST_OPTIMIZE */
+
+#if defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS)
+#define DUK__INTERNAL_ERROR(msg) do { \
+ DUK_ERROR_ERROR(thr, (msg)); \
+ } while (0)
+#else
+#define DUK__INTERNAL_ERROR(msg) do { \
+ goto internal_error; \
+ } while (0)
+#endif
+
+#define DUK__SYNC_CURR_PC() do { \
+ duk_activation *duk__act; \
+ duk__act = thr->callstack_curr; \
+ duk__act->curr_pc = curr_pc; \
+ } while (0)
+#define DUK__SYNC_AND_NULL_CURR_PC() do { \
+ duk_activation *duk__act; \
+ duk__act = thr->callstack_curr; \
+ duk__act->curr_pc = curr_pc; \
+ thr->ptr_curr_pc = NULL; \
+ } while (0)
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+#define DUK__LOOKUP_INDIRECT(idx) do { \
+ (idx) = (duk_uint_fast_t) duk_get_uint(thr, (duk_idx_t) (idx)); \
+ } while (0)
+#elif defined(DUK_USE_FASTINT)
+#define DUK__LOOKUP_INDIRECT(idx) do { \
+ duk_tval *tv_ind; \
+ tv_ind = DUK__REGP((idx)); \
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_ind)); /* compiler guarantees */ \
+ (idx) = (duk_uint_fast_t) DUK_TVAL_GET_FASTINT_U32(tv_ind); \
+ } while (0)
+#else
+#define DUK__LOOKUP_INDIRECT(idx) do { \
+ duk_tval *tv_ind; \
+ tv_ind = DUK__REGP(idx); \
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \
+ idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); \
+ } while (0)
+#endif
+
+DUK_LOCAL void duk__handle_executor_error(duk_heap *heap,
+ duk_activation *entry_act,
+ duk_int_t entry_call_recursion_depth,
+ duk_jmpbuf *entry_jmpbuf_ptr) {
+ duk_small_uint_t lj_ret;
+
+ /* Longjmp callers are required to sync-and-null thr->ptr_curr_pc
+ * before longjmp.
+ */
+ DUK_ASSERT(heap->curr_thread != NULL);
+ DUK_ASSERT(heap->curr_thread->ptr_curr_pc == NULL);
+
+ /* XXX: signalling the need to shrink check (only if unwound) */
+
+ /* Must be restored here to handle e.g. yields properly. */
+ heap->call_recursion_depth = entry_call_recursion_depth;
+
+ /* Switch to caller's setjmp() catcher so that if an error occurs
+ * during error handling, it is always propagated outwards instead
+ * of causing an infinite loop in our own handler.
+ */
+ heap->lj.jmpbuf_ptr = (duk_jmpbuf *) entry_jmpbuf_ptr;
+
+ lj_ret = duk__handle_longjmp(heap->curr_thread, entry_act);
+
+ /* Error handling complete, remove side effect protections.
+ */
+#if defined(DUK_USE_ASSERTIONS)
+ DUK_ASSERT(heap->error_not_allowed == 1);
+ heap->error_not_allowed = 0;
+#endif
+ DUK_ASSERT(heap->pf_prevent_count > 0);
+ heap->pf_prevent_count--;
+ DUK_DD(DUK_DDPRINT("executor error handled, pf_prevent_count updated to %ld", (long) heap->pf_prevent_count));
+
+ if (lj_ret == DUK__LONGJMP_RESTART) {
+ /* Restart bytecode execution, possibly with a changed thread. */
+ DUK_REFZERO_CHECK_SLOW(heap->curr_thread);
+ } else {
+ /* If an error is propagated, don't run refzero checks here.
+ * The next catcher will deal with that. Pf_prevent_count
+ * will be re-bumped by the longjmp.
+ */
+
+ DUK_ASSERT(lj_ret == DUK__LONGJMP_RETHROW); /* Rethrow error to calling state. */
+ DUK_ASSERT(heap->lj.jmpbuf_ptr == entry_jmpbuf_ptr); /* Longjmp handling has restored jmpbuf_ptr. */
+
+ /* Thread may have changed, e.g. YIELD converted to THROW. */
+ duk_err_longjmp(heap->curr_thread);
+ DUK_UNREACHABLE();
+ }
+}
+
+/* Outer executor with setjmp/longjmp handling. */
+DUK_INTERNAL void duk_js_execute_bytecode(duk_hthread *exec_thr) {
+ /* Entry level info. */
+ duk_hthread *entry_thread;
+ duk_activation *entry_act;
+ duk_int_t entry_call_recursion_depth;
+ duk_jmpbuf *entry_jmpbuf_ptr;
+ duk_jmpbuf our_jmpbuf;
+ duk_heap *heap;
+
+ DUK_ASSERT(exec_thr != NULL);
+ DUK_ASSERT(exec_thr->heap != NULL);
+ DUK_ASSERT(exec_thr->heap->curr_thread != NULL);
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR((duk_heaphdr *) exec_thr);
+ DUK_ASSERT(exec_thr->callstack_top >= 1); /* at least one activation, ours */
+ DUK_ASSERT(exec_thr->callstack_curr != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(exec_thr->callstack_curr) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(exec_thr->callstack_curr)));
+
+ DUK_GC_TORTURE(exec_thr->heap);
+
+ entry_thread = exec_thr;
+ heap = entry_thread->heap;
+ entry_act = entry_thread->callstack_curr;
+ DUK_ASSERT(entry_act != NULL);
+ entry_call_recursion_depth = entry_thread->heap->call_recursion_depth;
+ entry_jmpbuf_ptr = entry_thread->heap->lj.jmpbuf_ptr;
+
+ /*
+ * Note: we currently assume that the setjmp() catchpoint is
+ * not re-entrant (longjmp() cannot be called more than once
+ * for a single setjmp()).
+ *
+ * See doc/code-issues.rst for notes on variable assignment
+ * before and after setjmp().
+ */
+
+ for (;;) {
+ heap->lj.jmpbuf_ptr = &our_jmpbuf;
+ DUK_ASSERT(heap->lj.jmpbuf_ptr != NULL);
+
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ try {
+#else
+ DUK_ASSERT(heap->lj.jmpbuf_ptr == &our_jmpbuf);
+ if (DUK_SETJMP(our_jmpbuf.jb) == 0) {
+#endif
+ /* Execute bytecode until returned or longjmp(). */
+ duk__js_execute_bytecode_inner(entry_thread, entry_act);
+
+ /* Successful return: restore jmpbuf and return to caller. */
+ heap->lj.jmpbuf_ptr = entry_jmpbuf_ptr;
+
+ return;
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ } catch (duk_internal_exception &exc) {
+#else
+ } else {
+#endif
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ DUK_UNREF(exc);
+#endif
+ DUK_DDD(DUK_DDDPRINT("longjmp caught by bytecode executor"));
+ DUK_STATS_INC(exec_thr->heap, stats_exec_throw);
+
+ duk__handle_executor_error(heap,
+ entry_act,
+ entry_call_recursion_depth,
+ entry_jmpbuf_ptr);
+ }
+#if defined(DUK_USE_CPP_EXCEPTIONS)
+ catch (std::exception &exc) {
+ const char *what = exc.what();
+ if (!what) {
+ what = "unknown";
+ }
+ DUK_D(DUK_DPRINT("unexpected c++ std::exception (perhaps thrown by user code)"));
+ DUK_STATS_INC(exec_thr->heap, stats_exec_throw);
+ try {
+ DUK_ASSERT(heap->curr_thread != NULL);
+ DUK_ERROR_FMT1(heap->curr_thread, DUK_ERR_TYPE_ERROR, "caught invalid c++ std::exception '%s' (perhaps thrown by user code)", what);
+ } catch (duk_internal_exception exc) {
+ DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ std::exception"));
+ DUK_UNREF(exc);
+ duk__handle_executor_error(heap,
+ entry_act,
+ entry_call_recursion_depth,
+ entry_jmpbuf_ptr);
+ }
+ } catch (...) {
+ DUK_D(DUK_DPRINT("unexpected c++ exception (perhaps thrown by user code)"));
+ DUK_STATS_INC(exec_thr->heap, stats_exec_throw);
+ try {
+ DUK_ASSERT(heap->curr_thread != NULL);
+ DUK_ERROR_TYPE(heap->curr_thread, "caught invalid c++ exception (perhaps thrown by user code)");
+ } catch (duk_internal_exception exc) {
+ DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ exception"));
+ DUK_UNREF(exc);
+ duk__handle_executor_error(heap,
+ entry_act,
+ entry_call_recursion_depth,
+ entry_jmpbuf_ptr);
+ }
+ }
+#endif
+ }
+
+ DUK_UNREACHABLE();
+}
+
+/* Inner executor, performance critical. */
+DUK_LOCAL DUK_NOINLINE DUK_HOT void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act) {
+ /* Current PC, accessed by other functions through thr->ptr_to_curr_pc.
+ * Critical for performance. It would be safest to make this volatile,
+ * but that eliminates performance benefits; aliasing guarantees
+ * should be enough though.
+ */
+ duk_instr_t *curr_pc; /* bytecode has a stable pointer */
+
+ /* Hot variables for interpretation. Critical for performance,
+ * but must add sparingly to minimize register shuffling.
+ */
+ duk_hthread *thr; /* stable */
+ duk_tval *consts; /* stable */
+ duk_uint_fast32_t ins;
+ /* 'funcs' is quite rarely used, so no local for it */
+#if defined(DUK_USE_EXEC_FUN_LOCAL)
+ duk_hcompfunc *fun;
+#else
+ /* 'fun' is quite rarely used, so no local for it */
+#endif
+
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+ duk_int_t int_ctr;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ duk_size_t valstack_top_base; /* valstack top, should match before interpreting each op (no leftovers) */
+#endif
+
+ /* Optimized reg/const access macros assume sizeof(duk_tval) to be
+ * either 8 or 16. Heap allocation checks this even without asserts
+ * enabled now because it can't be autodetected in duk_config.h.
+ */
+#if 1
+#if defined(DUK_USE_PACKED_TVAL)
+ DUK_ASSERT(sizeof(duk_tval) == 8);
+#else
+ DUK_ASSERT(sizeof(duk_tval) == 16);
+#endif
+#endif
+
+ DUK_GC_TORTURE(entry_thread->heap);
+
+ /*
+ * Restart execution by reloading thread state.
+ *
+ * Note that 'thr' and any thread configuration may have changed,
+ * so all local variables are suspect and we need to reinitialize.
+ *
+ * The number of local variables should be kept to a minimum: if
+ * the variables are spilled, they will need to be loaded from
+ * memory anyway.
+ *
+ * Any 'goto restart_execution;' code path in opcode dispatch must
+ * ensure 'curr_pc' is synced back to act->curr_pc before the goto
+ * takes place.
+ *
+ * The interpreter must be very careful with memory pointers, as
+ * many pointers are not guaranteed to be 'stable' and may be
+ * reallocated and relocated on-the-fly quite easily (e.g. by a
+ * memory allocation or a property access).
+ *
+ * The following are assumed to have stable pointers:
+ * - the current thread
+ * - the current function
+ * - the bytecode, constant table, inner function table of the
+ * current function (as they are a part of the function allocation)
+ *
+ * The following are assumed to have semi-stable pointers:
+ * - the current activation entry: stable as long as callstack
+ * is not changed (reallocated by growing or shrinking), or
+ * by any garbage collection invocation (through finalizers)
+ * - Note in particular that ANY DECREF can invalidate the
+ * activation pointer, so for the most part a fresh lookup
+ * is required
+ *
+ * The following are not assumed to have stable pointers at all:
+ * - the value stack (registers) of the current thread
+ *
+ * See execution.rst for discussion.
+ */
+
+ restart_execution:
+
+ /* Lookup current thread; use the stable 'entry_thread' for this to
+ * avoid clobber warnings. Any valid, reachable 'thr' value would be
+ * fine for this, so using 'entry_thread' is just to silence warnings.
+ */
+ thr = entry_thread->heap->curr_thread;
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(thr->callstack_curr != NULL);
+ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));
+
+ DUK_GC_TORTURE(thr->heap);
+
+ thr->ptr_curr_pc = &curr_pc;
+
+ /* Relookup and initialize dispatch loop variables. Debugger check. */
+ {
+ duk_activation *act;
+#if !defined(DUK_USE_EXEC_FUN_LOCAL)
+ duk_hcompfunc *fun;
+#endif
+
+ /* Assume interrupt init/counter are properly initialized here. */
+ /* Assume that thr->valstack_bottom has been set-up before getting here. */
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+ DUK_ASSERT(fun != NULL);
+ DUK_ASSERT(thr->valstack_top - thr->valstack_bottom == fun->nregs);
+ consts = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, fun);
+ DUK_ASSERT(consts != NULL);
+
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (DUK_UNLIKELY(duk_debug_is_attached(thr->heap) && !thr->heap->dbg_processing)) {
+ duk__executor_recheck_debugger(thr, act, fun);
+ DUK_ASSERT(act == thr->callstack_curr);
+ DUK_ASSERT(act != NULL);
+ }
+#endif /* DUK_USE_DEBUGGER_SUPPORT */
+
+#if defined(DUK_USE_ASSERTIONS)
+ valstack_top_base = (duk_size_t) (thr->valstack_top - thr->valstack);
+#endif
+
+ /* Set up curr_pc for opcode dispatch. */
+ curr_pc = act->curr_pc;
+ }
+
+ DUK_DD(DUK_DDPRINT("restarting execution, thr %p, act idx %ld, fun %p,"
+ "consts %p, funcs %p, lev %ld, regbot %ld, regtop %ld, "
+ "preventcount=%ld",
+ (void *) thr,
+ (long) (thr->callstack_top - 1),
+ (void *) DUK__FUN(),
+ (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, DUK__FUN()),
+ (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, DUK__FUN()),
+ (long) (thr->callstack_top - 1),
+ (long) (thr->valstack_bottom - thr->valstack),
+ (long) (thr->valstack_top - thr->valstack),
+ (long) thr->callstack_preventcount));
+
+ /* Dispatch loop. */
+
+ for (;;) {
+ duk_uint8_t op;
+
+ DUK_ASSERT(thr->callstack_top >= 1);
+ DUK_ASSERT(thr->valstack_top - thr->valstack_bottom == DUK__FUN()->nregs);
+ DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) == valstack_top_base);
+
+ /* Executor interrupt counter check, used to implement breakpoints,
+ * debugging interface, execution timeouts, etc. The counter is heap
+ * specific but is maintained in the current thread to make the check
+ * as fast as possible. The counter is copied back to the heap struct
+ * whenever a thread switch occurs by the DUK_HEAP_SWITCH_THREAD() macro.
+ */
+#if defined(DUK_USE_INTERRUPT_COUNTER)
+ int_ctr = thr->interrupt_counter;
+ if (DUK_LIKELY(int_ctr > 0)) {
+ thr->interrupt_counter = int_ctr - 1;
+ } else {
+ /* Trigger at zero or below */
+ duk_small_uint_t exec_int_ret;
+
+ DUK_STATS_INC(thr->heap, stats_exec_interrupt);
+
+ /* Write curr_pc back for the debugger. */
+ {
+ duk_activation *act;
+ DUK_ASSERT(thr->callstack_top > 0);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ act->curr_pc = (duk_instr_t *) curr_pc;
+ }
+
+ /* Forced restart caused by a function return; must recheck
+ * debugger breakpoints before checking line transitions,
+ * see GH-303. Restart and then handle interrupt_counter
+ * zero again.
+ */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (thr->heap->dbg_force_restart) {
+ DUK_DD(DUK_DDPRINT("dbg_force_restart flag forced restart execution")); /* GH-303 */
+ thr->heap->dbg_force_restart = 0;
+ goto restart_execution;
+ }
+#endif
+
+ exec_int_ret = duk__executor_interrupt(thr);
+ if (exec_int_ret == DUK__INT_RESTART) {
+ /* curr_pc synced back above */
+ goto restart_execution;
+ }
+ }
+#endif /* DUK_USE_INTERRUPT_COUNTER */
+#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)
+ /* For cross-checking during development: ensure dispatch count
+ * matches cumulative interrupt counter init value sums.
+ */
+ thr->heap->inst_count_exec++;
+#endif
+
+#if defined(DUK_USE_ASSERTIONS) || defined(DUK_USE_DEBUG)
+ {
+ duk_activation *act;
+ act = thr->callstack_curr;
+ DUK_ASSERT(curr_pc >= DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN()));
+ DUK_ASSERT(curr_pc < DUK_HCOMPFUNC_GET_CODE_END(thr->heap, DUK__FUN()));
+ DUK_UNREF(act); /* if debugging disabled */
+
+ DUK_DDD(DUK_DDDPRINT("executing bytecode: pc=%ld, ins=0x%08lx, op=%ld, valstack_top=%ld/%ld, nregs=%ld --> %!I",
+ (long) (curr_pc - DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())),
+ (unsigned long) *curr_pc,
+ (long) DUK_DEC_OP(*curr_pc),
+ (long) (thr->valstack_top - thr->valstack),
+ (long) (thr->valstack_end - thr->valstack),
+ (long) (DUK__FUN() ? DUK__FUN()->nregs : -1),
+ (duk_instr_t) *curr_pc));
+ }
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+ /* Quite heavy assert: check valstack policy. Improper
+ * shuffle instructions can write beyond valstack_top/end
+ * so this check catches them in the act.
+ */
+ {
+ duk_tval *tv;
+ tv = thr->valstack_top;
+ while (tv != thr->valstack_end) {
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));
+ tv++;
+ }
+ }
+#endif
+
+ ins = *curr_pc++;
+ DUK_STATS_INC(thr->heap, stats_exec_opcodes);
+
+ /* Typing: use duk_small_(u)int_fast_t when decoding small
+ * opcode fields (op, A, B, C, BC) which fit into 16 bits
+ * and duk_(u)int_fast_t when decoding larger fields (e.g.
+ * ABC). Use unsigned variant by default, signed when the
+ * value is used in signed arithmetic. Using variable names
+ * such as 'a', 'b', 'c', 'bc', etc makes it easier to spot
+ * typing mismatches.
+ */
+
+ /* Switch based on opcode. Cast to 8-bit unsigned value and
+ * use a fully populated case clauses so that the compiler
+ * will (at least usually) omit a bounds check.
+ */
+ op = (duk_uint8_t) DUK_DEC_OP(ins);
+ switch (op) {
+
+ /* Some useful macros. These access inner executor variables
+ * directly so they only apply within the executor.
+ */
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+#define DUK__REPLACE_TOP_A_BREAK() { goto replace_top_a; }
+#define DUK__REPLACE_TOP_BC_BREAK() { goto replace_top_bc; }
+#define DUK__REPLACE_BOOL_A_BREAK(bval) { \
+ duk_bool_t duk__bval; \
+ duk__bval = (bval); \
+ DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \
+ duk_push_boolean(thr, duk__bval); \
+ DUK__REPLACE_TOP_A_BREAK(); \
+ }
+#else
+#define DUK__REPLACE_TOP_A_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); break; }
+#define DUK__REPLACE_TOP_BC_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); break; }
+#define DUK__REPLACE_BOOL_A_BREAK(bval) { \
+ duk_bool_t duk__bval; \
+ duk_tval *duk__tvdst; \
+ duk__bval = (bval); \
+ DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \
+ duk__tvdst = DUK__REGP_A(ins); \
+ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, duk__tvdst, duk__bval); \
+ break; \
+ }
+#endif
+
+ /* XXX: 12 + 12 bit variant might make sense too, for both reg and
+ * const loads.
+ */
+
+ /* For LDREG, STREG, LDCONST footprint optimized variants would just
+ * duk_dup() + duk_replace(), but because they're used quite a lot
+ * they're currently intentionally not size optimized.
+ */
+ case DUK_OP_LDREG: {
+ duk_tval *tv1, *tv2;
+
+ tv1 = DUK__REGP_A(ins);
+ tv2 = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */
+ break;
+ }
+
+ case DUK_OP_STREG: {
+ duk_tval *tv1, *tv2;
+
+ tv1 = DUK__REGP_A(ins);
+ tv2 = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv2, tv1); /* side effects */
+ break;
+ }
+
+ case DUK_OP_LDCONST: {
+ duk_tval *tv1, *tv2;
+
+ tv1 = DUK__REGP_A(ins);
+ tv2 = DUK__CONSTP_BC(ins);
+ DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */
+ break;
+ }
+
+ /* LDINT and LDINTX are intended to load an arbitrary signed
+ * 32-bit value. Only an LDINT+LDINTX sequence is supported.
+ * This also guarantees all values remain fastints.
+ */
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_LDINT: {
+ duk_int32_t val;
+
+ val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS;
+ duk_push_int(thr, val);
+ DUK__REPLACE_TOP_A_BREAK();
+ }
+ case DUK_OP_LDINTX: {
+ duk_int32_t val;
+
+ val = (duk_int32_t) duk_get_int(thr, DUK_DEC_A(ins));
+ val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */
+ duk_push_int(thr, val);
+ DUK__REPLACE_TOP_A_BREAK();
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_LDINT: {
+ duk_tval *tv1;
+ duk_int32_t val;
+
+ val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS;
+ tv1 = DUK__REGP_A(ins);
+ DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */
+ break;
+ }
+ case DUK_OP_LDINTX: {
+ duk_tval *tv1;
+ duk_int32_t val;
+
+ tv1 = DUK__REGP_A(ins);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));
+ val = DUK_TVAL_GET_FASTINT_I32(tv1);
+#else
+ /* XXX: fast double-to-int conversion, we know number is integer in [-0x80000000,0xffffffff]. */
+ val = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv1);
+#endif
+ val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */
+ DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_LDTHIS: {
+ duk_push_this(thr);
+ DUK__REPLACE_TOP_BC_BREAK();
+ }
+ case DUK_OP_LDUNDEF: {
+ duk_to_undefined(thr, (duk_idx_t) DUK_DEC_BC(ins));
+ break;
+ }
+ case DUK_OP_LDNULL: {
+ duk_to_null(thr, (duk_idx_t) DUK_DEC_BC(ins));
+ break;
+ }
+ case DUK_OP_LDTRUE: {
+ duk_push_true(thr);
+ DUK__REPLACE_TOP_BC_BREAK();
+ }
+ case DUK_OP_LDFALSE: {
+ duk_push_false(thr);
+ DUK__REPLACE_TOP_BC_BREAK();
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_LDTHIS: {
+ /* Note: 'this' may be bound to any value, not just an object */
+ duk_tval *tv1, *tv2;
+
+ tv1 = DUK__REGP_BC(ins);
+ tv2 = thr->valstack_bottom - 1; /* 'this binding' is just under bottom */
+ DUK_ASSERT(tv2 >= thr->valstack);
+ DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */
+ break;
+ }
+ case DUK_OP_LDUNDEF: {
+ duk_tval *tv1;
+
+ tv1 = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */
+ break;
+ }
+ case DUK_OP_LDNULL: {
+ duk_tval *tv1;
+
+ tv1 = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_NULL_UPDREF(thr, tv1); /* side effects */
+ break;
+ }
+ case DUK_OP_LDTRUE: {
+ duk_tval *tv1;
+
+ tv1 = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 1); /* side effects */
+ break;
+ }
+ case DUK_OP_LDFALSE: {
+ duk_tval *tv1;
+
+ tv1 = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 0); /* side effects */
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ case DUK_OP_BNOT: {
+ duk__vm_bitwise_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins));
+ break;
+ }
+
+ case DUK_OP_LNOT: {
+ duk__vm_logical_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins));
+ break;
+ }
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_UNM:
+ case DUK_OP_UNP: {
+ duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), op);
+ break;
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_UNM: {
+ duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNM);
+ break;
+ }
+ case DUK_OP_UNP: {
+ duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNP);
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_TYPEOF: {
+ duk_small_uint_t stridx;
+
+ stridx = duk_js_typeof_stridx(DUK__REGP_BC(ins));
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ duk_push_hstring_stridx(thr, stridx);
+ DUK__REPLACE_TOP_A_BREAK();
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_TYPEOF: {
+ duk_tval *tv;
+ duk_small_uint_t stridx;
+ duk_hstring *h_str;
+
+ tv = DUK__REGP_BC(ins);
+ stridx = duk_js_typeof_stridx(tv);
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ h_str = DUK_HTHREAD_GET_STRING(thr, stridx);
+ tv = DUK__REGP_A(ins);
+ DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str);
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ case DUK_OP_TYPEOFID: {
+ duk_small_uint_t stridx;
+#if !defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_hstring *h_str;
+#endif
+ duk_activation *act;
+ duk_hstring *name;
+ duk_tval *tv;
+
+ /* A -> target register
+ * BC -> constant index of identifier name
+ */
+
+ tv = DUK__CONSTP_BC(ins);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv));
+ name = DUK_TVAL_GET_STRING(tv);
+ tv = NULL; /* lookup has side effects */
+ act = thr->callstack_curr;
+ if (duk_js_getvar_activation(thr, act, name, 0 /*throw*/)) {
+ /* -> [... val this] */
+ tv = DUK_GET_TVAL_NEGIDX(thr, -2);
+ stridx = duk_js_typeof_stridx(tv);
+ tv = NULL; /* no longer needed */
+ duk_pop_2_unsafe(thr);
+ } else {
+ /* unresolvable, no stack changes */
+ stridx = DUK_STRIDX_LC_UNDEFINED;
+ }
+ DUK_ASSERT_STRIDX_VALID(stridx);
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_push_hstring_stridx(thr, stridx);
+ DUK__REPLACE_TOP_A_BREAK();
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ h_str = DUK_HTHREAD_GET_STRING(thr, stridx);
+ tv = DUK__REGP_A(ins);
+ DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str);
+ break;
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+ }
+
+ /* Equality: E5 Sections 11.9.1, 11.9.3 */
+
+#define DUK__EQ_BODY(barg,carg) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_equals(thr, (barg), (carg)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#define DUK__NEQ_BODY(barg,carg) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_equals(thr, (barg), (carg)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ tmp ^= 1; \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#define DUK__SEQ_BODY(barg,carg) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_strict_equals((barg), (carg)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#define DUK__SNEQ_BODY(barg,carg) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_strict_equals((barg), (carg)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ tmp ^= 1; \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_EQ_RR:
+ case DUK_OP_EQ_CR:
+ case DUK_OP_EQ_RC:
+ case DUK_OP_EQ_CC:
+ DUK__EQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_NEQ_RR:
+ case DUK_OP_NEQ_CR:
+ case DUK_OP_NEQ_RC:
+ case DUK_OP_NEQ_CC:
+ DUK__NEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_SEQ_RR:
+ case DUK_OP_SEQ_CR:
+ case DUK_OP_SEQ_RC:
+ case DUK_OP_SEQ_CC:
+ DUK__SEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_SNEQ_RR:
+ case DUK_OP_SNEQ_CR:
+ case DUK_OP_SNEQ_RC:
+ case DUK_OP_SNEQ_CC:
+ DUK__SNEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_EQ_RR:
+ DUK__EQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_EQ_CR:
+ DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_EQ_RC:
+ DUK__EQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_EQ_CC:
+ DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_NEQ_RR:
+ DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_NEQ_CR:
+ DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_NEQ_RC:
+ DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_NEQ_CC:
+ DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_SEQ_RR:
+ DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_SEQ_CR:
+ DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_SEQ_RC:
+ DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_SEQ_CC:
+ DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_SNEQ_RR:
+ DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_SNEQ_CR:
+ DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_SNEQ_RC:
+ DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_SNEQ_CC:
+ DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+#define DUK__COMPARE_BODY(arg1,arg2,flags) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_compare_helper(thr, (arg1), (arg2), (flags)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#define DUK__GT_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), 0)
+#define DUK__GE_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE)
+#define DUK__LT_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST)
+#define DUK__LE_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), DUK_COMPARE_FLAG_NEGATE)
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_GT_RR:
+ case DUK_OP_GT_CR:
+ case DUK_OP_GT_RC:
+ case DUK_OP_GT_CC:
+ DUK__GT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_GE_RR:
+ case DUK_OP_GE_CR:
+ case DUK_OP_GE_RC:
+ case DUK_OP_GE_CC:
+ DUK__GE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_LT_RR:
+ case DUK_OP_LT_CR:
+ case DUK_OP_LT_RC:
+ case DUK_OP_LT_CC:
+ DUK__LT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_LE_RR:
+ case DUK_OP_LE_CR:
+ case DUK_OP_LE_RC:
+ case DUK_OP_LE_CC:
+ DUK__LE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_GT_RR:
+ DUK__GT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GT_CR:
+ DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GT_RC:
+ DUK__GT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_GT_CC:
+ DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_GE_RR:
+ DUK__GE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GE_CR:
+ DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GE_RC:
+ DUK__GE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_GE_CC:
+ DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_LT_RR:
+ DUK__LT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_LT_CR:
+ DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_LT_RC:
+ DUK__LT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_LT_CC:
+ DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_LE_RR:
+ DUK__LE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_LE_CR:
+ DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_LE_RC:
+ DUK__LE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_LE_CC:
+ DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ /* No size optimized variant at present for IF. */
+ case DUK_OP_IFTRUE_R: {
+ if (duk_js_toboolean(DUK__REGP_BC(ins)) != 0) {
+ curr_pc++;
+ }
+ break;
+ }
+ case DUK_OP_IFTRUE_C: {
+ if (duk_js_toboolean(DUK__CONSTP_BC(ins)) != 0) {
+ curr_pc++;
+ }
+ break;
+ }
+ case DUK_OP_IFFALSE_R: {
+ if (duk_js_toboolean(DUK__REGP_BC(ins)) == 0) {
+ curr_pc++;
+ }
+ break;
+ }
+ case DUK_OP_IFFALSE_C: {
+ if (duk_js_toboolean(DUK__CONSTP_BC(ins)) == 0) {
+ curr_pc++;
+ }
+ break;
+ }
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_ADD_RR:
+ case DUK_OP_ADD_CR:
+ case DUK_OP_ADD_RC:
+ case DUK_OP_ADD_CC: {
+ /* XXX: could leave value on stack top and goto replace_top_a; */
+ duk__vm_arith_add(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins));
+ break;
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_ADD_RR: {
+ duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins));
+ break;
+ }
+ case DUK_OP_ADD_CR: {
+ duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins));
+ break;
+ }
+ case DUK_OP_ADD_RC: {
+ duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins));
+ break;
+ }
+ case DUK_OP_ADD_CC: {
+ duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins));
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_SUB_RR:
+ case DUK_OP_SUB_CR:
+ case DUK_OP_SUB_RC:
+ case DUK_OP_SUB_CC:
+ case DUK_OP_MUL_RR:
+ case DUK_OP_MUL_CR:
+ case DUK_OP_MUL_RC:
+ case DUK_OP_MUL_CC:
+ case DUK_OP_DIV_RR:
+ case DUK_OP_DIV_CR:
+ case DUK_OP_DIV_RC:
+ case DUK_OP_DIV_CC:
+ case DUK_OP_MOD_RR:
+ case DUK_OP_MOD_CR:
+ case DUK_OP_MOD_RC:
+ case DUK_OP_MOD_CC:
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+ case DUK_OP_EXP_RR:
+ case DUK_OP_EXP_CR:
+ case DUK_OP_EXP_RC:
+ case DUK_OP_EXP_CC:
+#endif /* DUK_USE_ES7_EXP_OPERATOR */
+ {
+ /* XXX: could leave value on stack top and goto replace_top_a; */
+ duk__vm_arith_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op);
+ break;
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_SUB_RR: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);
+ break;
+ }
+ case DUK_OP_SUB_CR: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);
+ break;
+ }
+ case DUK_OP_SUB_RC: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);
+ break;
+ }
+ case DUK_OP_SUB_CC: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);
+ break;
+ }
+ case DUK_OP_MUL_RR: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);
+ break;
+ }
+ case DUK_OP_MUL_CR: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);
+ break;
+ }
+ case DUK_OP_MUL_RC: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);
+ break;
+ }
+ case DUK_OP_MUL_CC: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);
+ break;
+ }
+ case DUK_OP_DIV_RR: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);
+ break;
+ }
+ case DUK_OP_DIV_CR: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);
+ break;
+ }
+ case DUK_OP_DIV_RC: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);
+ break;
+ }
+ case DUK_OP_DIV_CC: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);
+ break;
+ }
+ case DUK_OP_MOD_RR: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);
+ break;
+ }
+ case DUK_OP_MOD_CR: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);
+ break;
+ }
+ case DUK_OP_MOD_RC: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);
+ break;
+ }
+ case DUK_OP_MOD_CC: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);
+ break;
+ }
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+ case DUK_OP_EXP_RR: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);
+ break;
+ }
+ case DUK_OP_EXP_CR: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);
+ break;
+ }
+ case DUK_OP_EXP_RC: {
+ duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);
+ break;
+ }
+ case DUK_OP_EXP_CC: {
+ duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);
+ break;
+ }
+#endif /* DUK_USE_ES7_EXP_OPERATOR */
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_BAND_RR:
+ case DUK_OP_BAND_CR:
+ case DUK_OP_BAND_RC:
+ case DUK_OP_BAND_CC:
+ case DUK_OP_BOR_RR:
+ case DUK_OP_BOR_CR:
+ case DUK_OP_BOR_RC:
+ case DUK_OP_BOR_CC:
+ case DUK_OP_BXOR_RR:
+ case DUK_OP_BXOR_CR:
+ case DUK_OP_BXOR_RC:
+ case DUK_OP_BXOR_CC:
+ case DUK_OP_BASL_RR:
+ case DUK_OP_BASL_CR:
+ case DUK_OP_BASL_RC:
+ case DUK_OP_BASL_CC:
+ case DUK_OP_BLSR_RR:
+ case DUK_OP_BLSR_CR:
+ case DUK_OP_BLSR_RC:
+ case DUK_OP_BLSR_CC:
+ case DUK_OP_BASR_RR:
+ case DUK_OP_BASR_CR:
+ case DUK_OP_BASR_RC:
+ case DUK_OP_BASR_CC: {
+ /* XXX: could leave value on stack top and goto replace_top_a; */
+ duk__vm_bitwise_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op);
+ break;
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_BAND_RR: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);
+ break;
+ }
+ case DUK_OP_BAND_CR: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);
+ break;
+ }
+ case DUK_OP_BAND_RC: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);
+ break;
+ }
+ case DUK_OP_BAND_CC: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);
+ break;
+ }
+ case DUK_OP_BOR_RR: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);
+ break;
+ }
+ case DUK_OP_BOR_CR: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);
+ break;
+ }
+ case DUK_OP_BOR_RC: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);
+ break;
+ }
+ case DUK_OP_BOR_CC: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);
+ break;
+ }
+ case DUK_OP_BXOR_RR: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);
+ break;
+ }
+ case DUK_OP_BXOR_CR: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);
+ break;
+ }
+ case DUK_OP_BXOR_RC: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);
+ break;
+ }
+ case DUK_OP_BXOR_CC: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);
+ break;
+ }
+ case DUK_OP_BASL_RR: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);
+ break;
+ }
+ case DUK_OP_BASL_CR: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);
+ break;
+ }
+ case DUK_OP_BASL_RC: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);
+ break;
+ }
+ case DUK_OP_BASL_CC: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);
+ break;
+ }
+ case DUK_OP_BLSR_RR: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);
+ break;
+ }
+ case DUK_OP_BLSR_CR: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);
+ break;
+ }
+ case DUK_OP_BLSR_RC: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);
+ break;
+ }
+ case DUK_OP_BLSR_CC: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);
+ break;
+ }
+ case DUK_OP_BASR_RR: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);
+ break;
+ }
+ case DUK_OP_BASR_CR: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);
+ break;
+ }
+ case DUK_OP_BASR_RC: {
+ duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);
+ break;
+ }
+ case DUK_OP_BASR_CC: {
+ duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ /* For INSTOF and IN, B is always a register. */
+#define DUK__INSTOF_BODY(barg,carg) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_instanceof(thr, (barg), (carg)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#define DUK__IN_BODY(barg,carg) { \
+ duk_bool_t tmp; \
+ tmp = duk_js_in(thr, (barg), (carg)); \
+ DUK_ASSERT(tmp == 0 || tmp == 1); \
+ DUK__REPLACE_BOOL_A_BREAK(tmp); \
+ }
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_INSTOF_RR:
+ case DUK_OP_INSTOF_CR:
+ case DUK_OP_INSTOF_RC:
+ case DUK_OP_INSTOF_CC:
+ DUK__INSTOF_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_IN_RR:
+ case DUK_OP_IN_CR:
+ case DUK_OP_IN_RC:
+ case DUK_OP_IN_CC:
+ DUK__IN_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_INSTOF_RR:
+ DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_INSTOF_CR:
+ DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_INSTOF_RC:
+ DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_INSTOF_CC:
+ DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_IN_RR:
+ DUK__IN_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_IN_CR:
+ DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_IN_RC:
+ DUK__IN_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_IN_CC:
+ DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ /* Pre/post inc/dec for register variables, important for loops. */
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_PREINCR:
+ case DUK_OP_PREDECR:
+ case DUK_OP_POSTINCR:
+ case DUK_OP_POSTDECR: {
+ duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), op);
+ break;
+ }
+ case DUK_OP_PREINCV:
+ case DUK_OP_PREDECV:
+ case DUK_OP_POSTINCV:
+ case DUK_OP_POSTDECV: {
+ duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), op, DUK__STRICT());
+ break;
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_PREINCR: {
+ duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREINCR);
+ break;
+ }
+ case DUK_OP_PREDECR: {
+ duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREDECR);
+ break;
+ }
+ case DUK_OP_POSTINCR: {
+ duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTINCR);
+ break;
+ }
+ case DUK_OP_POSTDECR: {
+ duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTDECR);
+ break;
+ }
+ case DUK_OP_PREINCV: {
+ duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREINCV, DUK__STRICT());
+ break;
+ }
+ case DUK_OP_PREDECV: {
+ duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREDECV, DUK__STRICT());
+ break;
+ }
+ case DUK_OP_POSTINCV: {
+ duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTINCV, DUK__STRICT());
+ break;
+ }
+ case DUK_OP_POSTDECV: {
+ duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTDECV, DUK__STRICT());
+ break;
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ /* XXX: Move to separate helper, optimize for perf/size separately. */
+ /* Preinc/predec for object properties. */
+ case DUK_OP_PREINCP_RR:
+ case DUK_OP_PREINCP_CR:
+ case DUK_OP_PREINCP_RC:
+ case DUK_OP_PREINCP_CC:
+ case DUK_OP_PREDECP_RR:
+ case DUK_OP_PREDECP_CR:
+ case DUK_OP_PREDECP_RC:
+ case DUK_OP_PREDECP_CC:
+ case DUK_OP_POSTINCP_RR:
+ case DUK_OP_POSTINCP_CR:
+ case DUK_OP_POSTINCP_RC:
+ case DUK_OP_POSTINCP_CC:
+ case DUK_OP_POSTDECP_RR:
+ case DUK_OP_POSTDECP_CR:
+ case DUK_OP_POSTDECP_RC:
+ case DUK_OP_POSTDECP_CC: {
+ duk_tval *tv_obj;
+ duk_tval *tv_key;
+ duk_tval *tv_val;
+ duk_bool_t rc;
+ duk_double_t x, y, z;
+#if !defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_tval *tv_dst;
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ /* A -> target reg
+ * B -> object reg/const (may be const e.g. in "'foo'[1]")
+ * C -> key reg/const
+ */
+
+ /* Opcode bits 0-1 are used to distinguish reg/const variants.
+ * Opcode bits 2-3 are used to distinguish inc/dec variants:
+ * Bit 2 = inc(0)/dec(1), bit 3 = pre(0)/post(1).
+ */
+ DUK_ASSERT((DUK_OP_PREINCP_RR & 0x0c) == 0x00);
+ DUK_ASSERT((DUK_OP_PREDECP_RR & 0x0c) == 0x04);
+ DUK_ASSERT((DUK_OP_POSTINCP_RR & 0x0c) == 0x08);
+ DUK_ASSERT((DUK_OP_POSTDECP_RR & 0x0c) == 0x0c);
+
+ tv_obj = DUK__REGCONSTP_B(ins);
+ tv_key = DUK__REGCONSTP_C(ins);
+ rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */
+ DUK_UNREF(rc); /* ignore */
+ tv_obj = NULL; /* invalidated */
+ tv_key = NULL; /* invalidated */
+
+ /* XXX: Fastint fast path would be useful here. Also fastints
+ * now lose their fastint status in current handling which is
+ * not intuitive.
+ */
+
+ x = duk_to_number_m1(thr);
+ duk_pop_unsafe(thr);
+ if (ins & DUK_BC_INCDECP_FLAG_DEC) {
+ y = x - 1.0;
+ } else {
+ y = x + 1.0;
+ }
+
+ duk_push_number(thr, y);
+ tv_val = DUK_GET_TVAL_NEGIDX(thr, -1);
+ DUK_ASSERT(tv_val != NULL);
+ tv_obj = DUK__REGCONSTP_B(ins);
+ tv_key = DUK__REGCONSTP_C(ins);
+ rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT());
+ DUK_UNREF(rc); /* ignore */
+ tv_obj = NULL; /* invalidated */
+ tv_key = NULL; /* invalidated */
+ duk_pop_unsafe(thr);
+
+ z = (ins & DUK_BC_INCDECP_FLAG_POST) ? x : y;
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ duk_push_number(thr, z);
+ DUK__REPLACE_TOP_A_BREAK();
+#else
+ tv_dst = DUK__REGP_A(ins);
+ DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z);
+ break;
+#endif
+ }
+
+ /* XXX: GETPROP where object is 'this', GETPROPT?
+ * Occurs relatively often in object oriented code.
+ */
+
+#define DUK__GETPROP_BODY(barg,carg) { \
+ /* A -> target reg \
+ * B -> object reg/const (may be const e.g. in "'foo'[1]") \
+ * C -> key reg/const \
+ */ \
+ (void) duk_hobject_getprop(thr, (barg), (carg)); \
+ DUK__REPLACE_TOP_A_BREAK(); \
+ }
+#define DUK__GETPROPC_BODY(barg,carg) { \
+ /* Same as GETPROP but callability check for property-based calls. */ \
+ duk_tval *tv__targ; \
+ (void) duk_hobject_getprop(thr, (barg), (carg)); \
+ DUK_GC_TORTURE(thr->heap); \
+ tv__targ = DUK_GET_TVAL_NEGIDX(thr, -1); \
+ if (DUK_UNLIKELY(!duk_is_callable_tval(thr, tv__targ))) { \
+ /* Here we intentionally re-evaluate the macro \
+ * arguments to deal with potentially changed \
+ * valstack base pointer! \
+ */ \
+ duk_call_setup_propcall_error(thr, tv__targ, (barg), (carg)); \
+ } \
+ DUK__REPLACE_TOP_A_BREAK(); \
+ }
+#define DUK__PUTPROP_BODY(aarg,barg,carg) { \
+ /* A -> object reg \
+ * B -> key reg/const \
+ * C -> value reg/const \
+ * \
+ * Note: intentional difference to register arrangement \
+ * of e.g. GETPROP; 'A' must contain a register-only value. \
+ */ \
+ (void) duk_hobject_putprop(thr, (aarg), (barg), (carg), DUK__STRICT()); \
+ break; \
+ }
+#define DUK__DELPROP_BODY(barg,carg) { \
+ /* A -> result reg \
+ * B -> object reg \
+ * C -> key reg/const \
+ */ \
+ duk_bool_t rc; \
+ rc = duk_hobject_delprop(thr, (barg), (carg), DUK__STRICT()); \
+ DUK_ASSERT(rc == 0 || rc == 1); \
+ DUK__REPLACE_BOOL_A_BREAK(rc); \
+ }
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_GETPROP_RR:
+ case DUK_OP_GETPROP_CR:
+ case DUK_OP_GETPROP_RC:
+ case DUK_OP_GETPROP_CC:
+ DUK__GETPROP_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ case DUK_OP_GETPROPC_RR:
+ case DUK_OP_GETPROPC_CR:
+ case DUK_OP_GETPROPC_RC:
+ case DUK_OP_GETPROPC_CC:
+ DUK__GETPROPC_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+#endif
+ case DUK_OP_PUTPROP_RR:
+ case DUK_OP_PUTPROP_CR:
+ case DUK_OP_PUTPROP_RC:
+ case DUK_OP_PUTPROP_CC:
+ DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));
+ case DUK_OP_DELPROP_RR:
+ case DUK_OP_DELPROP_RC: /* B is always reg */
+ DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGCONSTP_C(ins));
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_GETPROP_RR:
+ DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GETPROP_CR:
+ DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GETPROP_RC:
+ DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_GETPROP_CC:
+ DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ case DUK_OP_GETPROPC_RR:
+ DUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GETPROPC_CR:
+ DUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_GETPROPC_RC:
+ DUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_GETPROPC_CC:
+ DUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+#endif
+ case DUK_OP_PUTPROP_RR:
+ DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_PUTPROP_CR:
+ DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_PUTPROP_RC:
+ DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_PUTPROP_CC:
+ DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));
+ case DUK_OP_DELPROP_RR: /* B is always reg */
+ DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));
+ case DUK_OP_DELPROP_RC:
+ DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ /* No fast path for DECLVAR now, it's quite a rare instruction. */
+ case DUK_OP_DECLVAR_RR:
+ case DUK_OP_DECLVAR_CR:
+ case DUK_OP_DECLVAR_RC:
+ case DUK_OP_DECLVAR_CC: {
+ duk_activation *act;
+ duk_small_uint_fast_t a = DUK_DEC_A(ins);
+ duk_tval *tv1;
+ duk_hstring *name;
+ duk_small_uint_t prop_flags;
+ duk_bool_t is_func_decl;
+
+ tv1 = DUK__REGCONSTP_B(ins);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv1));
+ name = DUK_TVAL_GET_STRING(tv1);
+ DUK_ASSERT(name != NULL);
+
+ is_func_decl = ((a & DUK_BC_DECLVAR_FLAG_FUNC_DECL) != 0);
+
+ /* XXX: declvar takes an duk_tval pointer, which is awkward and
+ * should be reworked.
+ */
+
+ /* Compiler is responsible for selecting property flags (configurability,
+ * writability, etc).
+ */
+ prop_flags = a & DUK_PROPDESC_FLAGS_MASK;
+
+ if (is_func_decl) {
+ duk_push_tval(thr, DUK__REGCONSTP_C(ins));
+ } else {
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */
+ thr->valstack_top++;
+ }
+ tv1 = DUK_GET_TVAL_NEGIDX(thr, -1);
+
+ act = thr->callstack_curr;
+ if (duk_js_declvar_activation(thr, act, name, tv1, prop_flags, is_func_decl)) {
+ if (is_func_decl) {
+ /* Already declared, update value. */
+ tv1 = DUK_GET_TVAL_NEGIDX(thr, -1);
+ duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT());
+ } else {
+ /* Already declared but no initializer value
+ * (e.g. 'var xyz;'), no-op.
+ */
+ }
+ }
+
+ duk_pop_unsafe(thr);
+ break;
+ }
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ /* The compiler should never emit DUK_OP_REGEXP if there is no
+ * regexp support.
+ */
+ case DUK_OP_REGEXP_RR:
+ case DUK_OP_REGEXP_CR:
+ case DUK_OP_REGEXP_RC:
+ case DUK_OP_REGEXP_CC: {
+ /* A -> target register
+ * B -> bytecode (also contains flags)
+ * C -> escaped source
+ */
+
+ duk_push_tval(thr, DUK__REGCONSTP_C(ins));
+ duk_push_tval(thr, DUK__REGCONSTP_B(ins)); /* -> [ ... escaped_source bytecode ] */
+ duk_regexp_create_instance(thr); /* -> [ ... regexp_instance ] */
+ DUK__REPLACE_TOP_A_BREAK();
+ }
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+ /* XXX: 'c' is unused, use whole BC, etc. */
+ case DUK_OP_CSVAR_RR:
+ case DUK_OP_CSVAR_CR:
+ case DUK_OP_CSVAR_RC:
+ case DUK_OP_CSVAR_CC: {
+ /* The speciality of calling through a variable binding is that the
+ * 'this' value may be provided by the variable lookup: E5 Section 6.b.i.
+ *
+ * The only (standard) case where the 'this' binding is non-null is when
+ * (1) the variable is found in an object environment record, and
+ * (2) that object environment record is a 'with' block.
+ */
+
+ duk_activation *act;
+ duk_uint_fast_t idx;
+ duk_tval *tv1;
+ duk_hstring *name;
+
+ /* A -> target registers (A, A + 1) for call setup
+ * B -> identifier name, usually constant but can be a register due to shuffling
+ */
+
+ tv1 = DUK__REGCONSTP_B(ins);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv1));
+ name = DUK_TVAL_GET_STRING(tv1);
+ DUK_ASSERT(name != NULL);
+ act = thr->callstack_curr;
+ (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */
+
+ idx = (duk_uint_fast_t) DUK_DEC_A(ins);
+
+ /* Could add direct value stack handling. */
+ duk_replace(thr, (duk_idx_t) (idx + 1)); /* 'this' binding */
+ duk_replace(thr, (duk_idx_t) idx); /* variable value (function, we hope, not checked here) */
+ break;
+ }
+
+ case DUK_OP_CLOSURE: {
+ duk_activation *act;
+ duk_hcompfunc *fun_act;
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+ duk_hobject *fun_temp;
+
+ /* A -> target reg
+ * BC -> inner function index
+ */
+
+ DUK_DDD(DUK_DDDPRINT("CLOSURE to target register %ld, fnum %ld (count %ld)",
+ (long) DUK_DEC_A(ins), (long) DUK_DEC_BC(ins), (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN())));
+
+ DUK_ASSERT_DISABLE(bc >= 0); /* unsigned */
+ DUK_ASSERT((duk_uint_t) bc < (duk_uint_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN()));
+
+ act = thr->callstack_curr;
+ fun_act = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);
+ fun_temp = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun_act)[bc];
+ DUK_ASSERT(fun_temp != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(fun_temp));
+
+ DUK_DDD(DUK_DDDPRINT("CLOSURE: function template is: %p -> %!O",
+ (void *) fun_temp, (duk_heaphdr *) fun_temp));
+
+ if (act->lex_env == NULL) {
+ DUK_ASSERT(act->var_env == NULL);
+ duk_js_init_activation_environment_records_delayed(thr, act);
+ act = thr->callstack_curr;
+ }
+ DUK_ASSERT(act->lex_env != NULL);
+ DUK_ASSERT(act->var_env != NULL);
+
+ /* functions always have a NEWENV flag, i.e. they get a
+ * new variable declaration environment, so only lex_env
+ * matters here.
+ */
+ duk_js_push_closure(thr,
+ (duk_hcompfunc *) fun_temp,
+ act->var_env,
+ act->lex_env,
+ 1 /*add_auto_proto*/);
+ DUK__REPLACE_TOP_A_BREAK();
+ }
+
+ case DUK_OP_GETVAR: {
+ duk_activation *act;
+ duk_tval *tv1;
+ duk_hstring *name;
+
+ tv1 = DUK__CONSTP_BC(ins);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv1));
+ name = DUK_TVAL_GET_STRING(tv1);
+ DUK_ASSERT(name != NULL);
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */
+ duk_pop_unsafe(thr); /* 'this' binding is not needed here */
+ DUK__REPLACE_TOP_A_BREAK();
+ }
+
+ case DUK_OP_PUTVAR: {
+ duk_activation *act;
+ duk_tval *tv1;
+ duk_hstring *name;
+
+ tv1 = DUK__CONSTP_BC(ins);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv1));
+ name = DUK_TVAL_GET_STRING(tv1);
+ DUK_ASSERT(name != NULL);
+
+ /* XXX: putvar takes a duk_tval pointer, which is awkward and
+ * should be reworked.
+ */
+
+ tv1 = DUK__REGP_A(ins); /* val */
+ act = thr->callstack_curr;
+ duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT());
+ break;
+ }
+
+ case DUK_OP_DELVAR: {
+ duk_activation *act;
+ duk_tval *tv1;
+ duk_hstring *name;
+ duk_bool_t rc;
+
+ tv1 = DUK__CONSTP_BC(ins);
+ DUK_ASSERT(DUK_TVAL_IS_STRING(tv1));
+ name = DUK_TVAL_GET_STRING(tv1);
+ DUK_ASSERT(name != NULL);
+ act = thr->callstack_curr;
+ rc = duk_js_delvar_activation(thr, act, name);
+ DUK__REPLACE_BOOL_A_BREAK(rc);
+ }
+
+ case DUK_OP_JUMP: {
+ /* Note: without explicit cast to signed, MSVC will
+ * apparently generate a large positive jump when the
+ * bias-corrected value would normally be negative.
+ */
+ curr_pc += (duk_int_fast_t) DUK_DEC_ABC(ins) - (duk_int_fast_t) DUK_BC_JUMP_BIAS;
+ break;
+ }
+
+#define DUK__RETURN_SHARED() do { \
+ duk_small_uint_t ret_result; \
+ /* duk__handle_return() is guaranteed never to throw, except \
+ * for potential out-of-memory situations which will then \
+ * propagate out of the executor longjmp handler. \
+ */ \
+ DUK_ASSERT(thr->ptr_curr_pc == NULL); \
+ ret_result = duk__handle_return(thr, entry_act); \
+ if (ret_result == DUK__RETHAND_RESTART) { \
+ goto restart_execution; \
+ } \
+ DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); \
+ return; \
+ } while (0)
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ case DUK_OP_RETREG:
+ case DUK_OP_RETCONST:
+ case DUK_OP_RETCONSTN:
+ case DUK_OP_RETUNDEF: {
+ /* BC -> return value reg/const */
+
+ DUK__SYNC_AND_NULL_CURR_PC();
+
+ if (op == DUK_OP_RETREG) {
+ duk_push_tval(thr, DUK__REGP_BC(ins));
+ } else if (op == DUK_OP_RETUNDEF) {
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */
+ thr->valstack_top++;
+ } else {
+ DUK_ASSERT(op == DUK_OP_RETCONST || op == DUK_OP_RETCONSTN);
+ duk_push_tval(thr, DUK__CONSTP_BC(ins));
+ }
+
+ DUK__RETURN_SHARED();
+ }
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ case DUK_OP_RETREG: {
+ duk_tval *tv;
+
+ DUK__SYNC_AND_NULL_CURR_PC();
+ tv = DUK__REGP_BC(ins);
+ DUK_TVAL_SET_TVAL(thr->valstack_top, tv);
+ DUK_TVAL_INCREF(thr, tv);
+ thr->valstack_top++;
+ DUK__RETURN_SHARED();
+ }
+ /* This will be unused without refcounting. */
+ case DUK_OP_RETCONST: {
+ duk_tval *tv;
+
+ DUK__SYNC_AND_NULL_CURR_PC();
+ tv = DUK__CONSTP_BC(ins);
+ DUK_TVAL_SET_TVAL(thr->valstack_top, tv);
+ DUK_TVAL_INCREF(thr, tv);
+ thr->valstack_top++;
+ DUK__RETURN_SHARED();
+ }
+ case DUK_OP_RETCONSTN: {
+ duk_tval *tv;
+
+ DUK__SYNC_AND_NULL_CURR_PC();
+ tv = DUK__CONSTP_BC(ins);
+ DUK_TVAL_SET_TVAL(thr->valstack_top, tv);
+#if defined(DUK_USE_REFERENCE_COUNTING)
+ /* Without refcounting only RETCONSTN is used. */
+ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv)); /* no INCREF for this constant */
+#endif
+ thr->valstack_top++;
+ DUK__RETURN_SHARED();
+ }
+ case DUK_OP_RETUNDEF: {
+ DUK__SYNC_AND_NULL_CURR_PC();
+ thr->valstack_top++; /* value at valstack top is already undefined by valstack policy */
+ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));
+ DUK__RETURN_SHARED();
+ }
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+
+ case DUK_OP_LABEL: {
+ duk_activation *act;
+ duk_catcher *cat;
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+
+ /* Allocate catcher and populate it (must be atomic). */
+
+ cat = duk_hthread_catcher_alloc(thr);
+ DUK_ASSERT(cat != NULL);
+
+ cat->flags = (duk_uint32_t) (DUK_CAT_TYPE_LABEL | (bc << DUK_CAT_LABEL_SHIFT));
+ cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */
+ cat->idx_base = 0; /* unused for label */
+ cat->h_varname = NULL;
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+ cat->parent = act->cat;
+ act->cat = cat;
+
+ DUK_DDD(DUK_DDDPRINT("LABEL catcher: flags=0x%08lx, pc_base=%ld, "
+ "idx_base=%ld, h_varname=%!O, label_id=%ld",
+ (long) cat->flags, (long) cat->pc_base,
+ (long) cat->idx_base, (duk_heaphdr *) cat->h_varname, (long) DUK_CAT_GET_LABEL(cat)));
+
+ curr_pc += 2; /* skip jump slots */
+ break;
+ }
+
+ case DUK_OP_ENDLABEL: {
+ duk_activation *act;
+#if (defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)) || defined(DUK_USE_ASSERTIONS)
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+#endif
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ DUK_DDD(DUK_DDDPRINT("ENDLABEL %ld", (long) bc));
+#endif
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act->cat != NULL);
+ DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_LABEL);
+ DUK_ASSERT((duk_uint_fast_t) DUK_CAT_GET_LABEL(act->cat) == bc);
+ duk_hthread_catcher_unwind_nolexenv_norz(thr, act);
+
+ /* no need to unwind callstack */
+ break;
+ }
+
+ case DUK_OP_BREAK: {
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+
+ DUK__SYNC_AND_NULL_CURR_PC();
+ duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_BREAK);
+ goto restart_execution;
+ }
+
+ case DUK_OP_CONTINUE: {
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+
+ DUK__SYNC_AND_NULL_CURR_PC();
+ duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_CONTINUE);
+ goto restart_execution;
+ }
+
+ /* XXX: move to helper, too large to be inline here */
+ case DUK_OP_TRYCATCH: {
+ duk__handle_op_trycatch(thr, ins, curr_pc);
+ curr_pc += 2; /* skip jump slots */
+ break;
+ }
+
+ case DUK_OP_ENDTRY: {
+ curr_pc = duk__handle_op_endtry(thr, ins);
+ break;
+ }
+
+ case DUK_OP_ENDCATCH: {
+ duk__handle_op_endcatch(thr, ins);
+ break;
+ }
+
+ case DUK_OP_ENDFIN: {
+ /* Sync and NULL early. */
+ DUK__SYNC_AND_NULL_CURR_PC();
+
+ if (duk__handle_op_endfin(thr, ins, entry_act) != 0) {
+ return;
+ }
+
+ /* Must restart because we NULLed out curr_pc. */
+ goto restart_execution;
+ }
+
+ case DUK_OP_THROW: {
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+
+ /* Note: errors are augmented when they are created, not
+ * when they are thrown. So, don't augment here, it would
+ * break re-throwing for instance.
+ */
+
+ /* Sync so that augmentation sees up-to-date activations, NULL
+ * thr->ptr_curr_pc so that it's not used if side effects occur
+ * in augmentation or longjmp handling.
+ */
+ DUK__SYNC_AND_NULL_CURR_PC();
+
+ duk_dup(thr, (duk_idx_t) bc);
+ DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (before throw augment)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+#if defined(DUK_USE_AUGMENT_ERROR_THROW)
+ duk_err_augment_error_throw(thr);
+ DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (after throw augment)",
+ (duk_tval *) duk_get_tval(thr, -1)));
+#endif
+
+ duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1));
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ duk_err_check_debugger_integration(thr);
+#endif
+
+ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */
+ duk_err_longjmp(thr);
+ DUK_UNREACHABLE();
+ break;
+ }
+
+ case DUK_OP_CSREG: {
+ /*
+ * Assuming a register binds to a variable declared within this
+ * function (a declarative binding), the 'this' for the call
+ * setup is always 'undefined'. E5 Section 10.2.1.1.6.
+ */
+
+ duk_small_uint_fast_t a = DUK_DEC_A(ins);
+ duk_small_uint_fast_t bc = DUK_DEC_BC(ins);
+
+ /* A -> register containing target function (not type checked here)
+ * BC -> target registers (BC, BC + 1) for call setup
+ */
+
+#if defined(DUK_USE_PREFER_SIZE)
+ duk_dup(thr, (duk_idx_t) a);
+ duk_replace(thr, (duk_idx_t) bc);
+ duk_to_undefined(thr, (duk_idx_t) (bc + 1));
+#else
+ duk_tval *tv1;
+ duk_tval *tv2;
+ duk_tval *tv3;
+ duk_tval tv_tmp1;
+ duk_tval tv_tmp2;
+
+ tv1 = DUK__REGP(bc);
+ tv2 = tv1 + 1;
+ DUK_TVAL_SET_TVAL(&tv_tmp1, tv1);
+ DUK_TVAL_SET_TVAL(&tv_tmp2, tv2);
+ tv3 = DUK__REGP(a);
+ DUK_TVAL_SET_TVAL(tv1, tv3);
+ DUK_TVAL_INCREF(thr, tv1); /* no side effects */
+ DUK_TVAL_SET_UNDEFINED(tv2); /* no need for incref */
+ DUK_TVAL_DECREF(thr, &tv_tmp1);
+ DUK_TVAL_DECREF(thr, &tv_tmp2);
+#endif
+ break;
+ }
+
+
+ /* XXX: in some cases it's faster NOT to reuse the value
+ * stack but rather copy the arguments on top of the stack
+ * (mainly when the calling value stack is large and the value
+ * stack resize would be large).
+ */
+
+ case DUK_OP_CALL0:
+ case DUK_OP_CALL1:
+ case DUK_OP_CALL2:
+ case DUK_OP_CALL3:
+ case DUK_OP_CALL4:
+ case DUK_OP_CALL5:
+ case DUK_OP_CALL6:
+ case DUK_OP_CALL7: {
+ /* Opcode packs 4 flag bits: 1 for indirect, 3 map
+ * 1:1 to three lowest call handling flags.
+ *
+ * A -> nargs or register with nargs (indirect)
+ * BC -> base register for call (base -> func, base+1 -> this, base+2 -> arg1 ... base+2+N-1 -> argN)
+ */
+
+ duk_idx_t nargs;
+ duk_idx_t idx;
+ duk_small_uint_t call_flags;
+#if !defined(DUK_USE_EXEC_FUN_LOCAL)
+ duk_hcompfunc *fun;
+#endif
+
+ DUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0);
+ DUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) == 0);
+
+ nargs = (duk_idx_t) DUK_DEC_A(ins);
+ call_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA;
+ idx = (duk_idx_t) DUK_DEC_BC(ins);
+
+ if (duk__executor_handle_call(thr, idx, nargs, call_flags)) {
+ /* curr_pc synced by duk_handle_call_unprotected() */
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ goto restart_execution;
+ }
+ DUK_ASSERT(thr->ptr_curr_pc != NULL);
+
+ /* duk_js_call.c is required to restore the stack reserve
+ * so we only need to reset the top.
+ */
+#if !defined(DUK_USE_EXEC_FUN_LOCAL)
+ fun = DUK__FUN();
+#endif
+ duk_set_top_unsafe(thr, (duk_idx_t) fun->nregs);
+
+ /* No need to reinit setjmp() catchpoint, as call handling
+ * will store and restore our state.
+ *
+ * When debugger is enabled, we need to recheck the activation
+ * status after returning. This is now handled by call handling
+ * and heap->dbg_force_restart.
+ */
+ break;
+ }
+
+ case DUK_OP_CALL8:
+ case DUK_OP_CALL9:
+ case DUK_OP_CALL10:
+ case DUK_OP_CALL11:
+ case DUK_OP_CALL12:
+ case DUK_OP_CALL13:
+ case DUK_OP_CALL14:
+ case DUK_OP_CALL15: {
+ /* Indirect variant. */
+ duk_uint_fast_t nargs;
+ duk_idx_t idx;
+ duk_small_uint_t call_flags;
+#if !defined(DUK_USE_EXEC_FUN_LOCAL)
+ duk_hcompfunc *fun;
+#endif
+
+ DUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0);
+ DUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) != 0);
+
+ nargs = (duk_uint_fast_t) DUK_DEC_A(ins);
+ DUK__LOOKUP_INDIRECT(nargs);
+ call_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA;
+ idx = (duk_idx_t) DUK_DEC_BC(ins);
+
+ if (duk__executor_handle_call(thr, idx, (duk_idx_t) nargs, call_flags)) {
+ DUK_ASSERT(thr->ptr_curr_pc == NULL);
+ goto restart_execution;
+ }
+ DUK_ASSERT(thr->ptr_curr_pc != NULL);
+
+#if !defined(DUK_USE_EXEC_FUN_LOCAL)
+ fun = DUK__FUN();
+#endif
+ duk_set_top_unsafe(thr, (duk_idx_t) fun->nregs);
+ break;
+ }
+
+ case DUK_OP_NEWOBJ: {
+ duk_push_object(thr);
+#if defined(DUK_USE_ASSERTIONS)
+ {
+ duk_hobject *h;
+ h = duk_require_hobject(thr, -1);
+ DUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0);
+ }
+#endif
+#if !defined(DUK_USE_PREFER_SIZE)
+ /* XXX: could do a direct props realloc, but need hash size */
+ duk_hobject_resize_entrypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins));
+#endif
+ DUK__REPLACE_TOP_BC_BREAK();
+ }
+
+ case DUK_OP_NEWARR: {
+ duk_push_array(thr);
+#if defined(DUK_USE_ASSERTIONS)
+ {
+ duk_hobject *h;
+ h = duk_require_hobject(thr, -1);
+ DUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0);
+ DUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(h));
+ }
+#endif
+#if !defined(DUK_USE_PREFER_SIZE)
+ duk_hobject_realloc_props(thr,
+ duk_known_hobject(thr, -1),
+ 0 /*new_e_size*/,
+ DUK_DEC_A(ins) /*new_a_size*/,
+ 0 /*new_h_size*/,
+ 0 /*abandon_array*/);
+#if 0
+ duk_hobject_resize_arraypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins));
+#endif
+#endif
+ DUK__REPLACE_TOP_BC_BREAK();
+ }
+
+ case DUK_OP_MPUTOBJ:
+ case DUK_OP_MPUTOBJI: {
+ duk_idx_t obj_idx;
+ duk_uint_fast_t idx, idx_end;
+ duk_small_uint_fast_t count;
+
+ /* A -> register of target object
+ * B -> first register of key/value pair list
+ * or register containing first register number if indirect
+ * C -> number of key/value pairs * 2
+ * (= number of value stack indices used starting from 'B')
+ */
+
+ obj_idx = DUK_DEC_A(ins);
+ DUK_ASSERT(duk_is_object(thr, obj_idx));
+
+ idx = (duk_uint_fast_t) DUK_DEC_B(ins);
+ if (DUK_DEC_OP(ins) == DUK_OP_MPUTOBJI) {
+ DUK__LOOKUP_INDIRECT(idx);
+ }
+
+ count = (duk_small_uint_fast_t) DUK_DEC_C(ins);
+ DUK_ASSERT(count > 0); /* compiler guarantees */
+ idx_end = idx + count;
+
+#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK)
+ if (DUK_UNLIKELY(idx_end > (duk_uint_fast_t) duk_get_top(thr))) {
+ /* XXX: use duk_is_valid_index() instead? */
+ /* XXX: improve check; check against nregs, not against top */
+ DUK__INTERNAL_ERROR("MPUTOBJ out of bounds");
+ }
+#endif
+
+ /* Use 'force' flag to duk_def_prop() to ensure that any
+ * inherited properties don't prevent the operation.
+ * With ES2015 duplicate properties are allowed, so that we
+ * must overwrite any previous data or accessor property.
+ *
+ * With ES2015 computed property names the literal keys
+ * may be arbitrary values and need to be ToPropertyKey()
+ * coerced at runtime.
+ */
+ do {
+ /* XXX: faster initialization (direct access or better primitives) */
+ duk_dup(thr, (duk_idx_t) idx);
+ duk_dup(thr, (duk_idx_t) (idx + 1));
+ duk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_VALUE |
+ DUK_DEFPROP_FORCE |
+ DUK_DEFPROP_SET_WRITABLE |
+ DUK_DEFPROP_SET_ENUMERABLE |
+ DUK_DEFPROP_SET_CONFIGURABLE);
+ idx += 2;
+ } while (idx < idx_end);
+ break;
+ }
+
+ case DUK_OP_INITSET:
+ case DUK_OP_INITGET: {
+ duk__handle_op_initset_initget(thr, ins);
+ break;
+ }
+
+ case DUK_OP_MPUTARR:
+ case DUK_OP_MPUTARRI: {
+ duk_idx_t obj_idx;
+ duk_uint_fast_t idx, idx_end;
+ duk_small_uint_fast_t count;
+ duk_tval *tv1;
+ duk_uint32_t arr_idx;
+
+ /* A -> register of target object
+ * B -> first register of value data (start_index, value1, value2, ..., valueN)
+ * or register containing first register number if indirect
+ * C -> number of key/value pairs (N)
+ */
+
+ obj_idx = DUK_DEC_A(ins);
+ DUK_ASSERT(duk_is_object(thr, obj_idx));
+
+ idx = (duk_uint_fast_t) DUK_DEC_B(ins);
+ if (DUK_DEC_OP(ins) == DUK_OP_MPUTARRI) {
+ DUK__LOOKUP_INDIRECT(idx);
+ }
+
+ count = (duk_small_uint_fast_t) DUK_DEC_C(ins);
+ DUK_ASSERT(count > 0 + 1); /* compiler guarantees */
+ idx_end = idx + count;
+
+#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK)
+ if (idx_end > (duk_uint_fast_t) duk_get_top(thr)) {
+ /* XXX: use duk_is_valid_index() instead? */
+ /* XXX: improve check; check against nregs, not against top */
+ DUK__INTERNAL_ERROR("MPUTARR out of bounds");
+ }
+#endif
+
+ tv1 = DUK__REGP(idx);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));
+ arr_idx = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1);
+#else
+ arr_idx = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1);
+#endif
+ idx++;
+
+ do {
+ /* duk_xdef_prop() will define an own property without any array
+ * special behaviors. We'll need to set the array length explicitly
+ * in the end. For arrays with elisions, the compiler will emit an
+ * explicit SETALEN which will update the length.
+ */
+
+ /* XXX: because we're dealing with 'own' properties of a fresh array,
+ * the array initializer should just ensure that the array has a large
+ * enough array part and write the values directly into array part,
+ * and finally set 'length' manually in the end (as already happens now).
+ */
+
+ duk_dup(thr, (duk_idx_t) idx);
+ duk_xdef_prop_index_wec(thr, obj_idx, arr_idx);
+
+ idx++;
+ arr_idx++;
+ } while (idx < idx_end);
+
+ /* XXX: E5.1 Section 11.1.4 coerces the final length through
+ * ToUint32() which is odd but happens now as a side effect of
+ * 'arr_idx' type.
+ */
+ duk_set_length(thr, obj_idx, (duk_size_t) (duk_uarridx_t) arr_idx);
+ break;
+ }
+
+ case DUK_OP_SETALEN: {
+ duk_tval *tv1;
+ duk_hobject *h;
+ duk_uint32_t len;
+
+ tv1 = DUK__REGP_A(ins);
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1));
+ h = DUK_TVAL_GET_OBJECT(tv1);
+ DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(h));
+
+ tv1 = DUK__REGP_BC(ins);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));
+ len = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1);
+#else
+ len = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1);
+#endif
+ ((duk_harray *) h)->length = len;
+ break;
+ }
+
+ case DUK_OP_INITENUM: {
+ duk__handle_op_initenum(thr, ins);
+ break;
+ }
+
+ case DUK_OP_NEXTENUM: {
+ curr_pc += duk__handle_op_nextenum(thr, ins);
+ break;
+ }
+
+ case DUK_OP_INVLHS: {
+ DUK_ERROR_REFERENCE(thr, DUK_STR_INVALID_LVALUE);
+ DUK_UNREACHABLE();
+ break;
+ }
+
+ case DUK_OP_DEBUGGER: {
+ /* Opcode only emitted by compiler when debugger
+ * support is enabled. Ignore it silently without
+ * debugger support, in case it has been loaded
+ * from precompiled bytecode.
+ */
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ if (duk_debug_is_attached(thr->heap)) {
+ DUK_D(DUK_DPRINT("DEBUGGER statement encountered, halt execution"));
+ DUK__SYNC_AND_NULL_CURR_PC();
+ duk_debug_halt_execution(thr, 1 /*use_prev_pc*/);
+ DUK_D(DUK_DPRINT("DEBUGGER statement finished, resume execution"));
+ goto restart_execution;
+ } else {
+ DUK_D(DUK_DPRINT("DEBUGGER statement ignored, debugger not attached"));
+ }
+#else
+ DUK_D(DUK_DPRINT("DEBUGGER statement ignored, no debugger support"));
+#endif
+ break;
+ }
+
+ case DUK_OP_NOP: {
+ /* Nop, ignored, but ABC fields may carry a value e.g.
+ * for indirect opcode handling.
+ */
+ break;
+ }
+
+ case DUK_OP_INVALID: {
+ DUK_ERROR_FMT1(thr, DUK_ERR_ERROR, "INVALID opcode (%ld)", (long) DUK_DEC_ABC(ins));
+ break;
+ }
+
+#if defined(DUK_USE_ES6)
+ case DUK_OP_NEWTARGET: {
+ /* https://www.ecma-international.org/ecma-262/6.0/#sec-meta-properties-runtime-semantics-evaluation
+ * https://www.ecma-international.org/ecma-262/6.0/#sec-getnewtarget
+ *
+ * No newTarget support now, so as a first approximation
+ * use the resolved (non-bound) target function.
+ */
+ /* XXX: C API: push_new_target()? */
+ duk_activation *act;
+
+ act = thr->callstack_curr;
+ DUK_ASSERT(act != NULL);
+
+ /* Check CONSTRUCT flag from current function, or if running
+ * direct eval, from a non-direct-eval parent (with possibly
+ * more than one nested direct eval). An alternative to this
+ * would be to store [[NewTarget]] as a hidden symbol of the
+ * lexical scope, and then just look up that variable.
+ */
+ for (;;) {
+ if (act == NULL) {
+ duk_push_undefined(thr);
+ break;
+ }
+ if (act->flags & DUK_ACT_FLAG_CONSTRUCT) {
+ duk_push_tval(thr, &act->tv_func);
+ break;
+ } else if (act->flags & DUK_ACT_FLAG_DIRECT_EVAL) {
+ act = act->parent;
+ } else {
+ duk_push_undefined(thr);
+ break;
+ }
+ }
+
+ DUK__REPLACE_TOP_BC_BREAK();
+ }
+#endif /* DUK_USE_ES6 */
+
+#if !defined(DUK_USE_EXEC_PREFER_SIZE)
+#if !defined(DUK_USE_ES7_EXP_OPERATOR)
+ case DUK_OP_EXP_RR:
+ case DUK_OP_EXP_CR:
+ case DUK_OP_EXP_RC:
+ case DUK_OP_EXP_CC:
+#endif
+#if !defined(DUK_USE_ES6)
+ case DUK_OP_NEWTARGET:
+#endif
+#if !defined(DUK_USE_VERBOSE_ERRORS)
+ case DUK_OP_GETPROPC_RR:
+ case DUK_OP_GETPROPC_CR:
+ case DUK_OP_GETPROPC_RC:
+ case DUK_OP_GETPROPC_CC:
+#endif
+ case DUK_OP_UNUSED207:
+ case DUK_OP_UNUSED212:
+ case DUK_OP_UNUSED213:
+ case DUK_OP_UNUSED214:
+ case DUK_OP_UNUSED215:
+ case DUK_OP_UNUSED216:
+ case DUK_OP_UNUSED217:
+ case DUK_OP_UNUSED218:
+ case DUK_OP_UNUSED219:
+ case DUK_OP_UNUSED220:
+ case DUK_OP_UNUSED221:
+ case DUK_OP_UNUSED222:
+ case DUK_OP_UNUSED223:
+ case DUK_OP_UNUSED224:
+ case DUK_OP_UNUSED225:
+ case DUK_OP_UNUSED226:
+ case DUK_OP_UNUSED227:
+ case DUK_OP_UNUSED228:
+ case DUK_OP_UNUSED229:
+ case DUK_OP_UNUSED230:
+ case DUK_OP_UNUSED231:
+ case DUK_OP_UNUSED232:
+ case DUK_OP_UNUSED233:
+ case DUK_OP_UNUSED234:
+ case DUK_OP_UNUSED235:
+ case DUK_OP_UNUSED236:
+ case DUK_OP_UNUSED237:
+ case DUK_OP_UNUSED238:
+ case DUK_OP_UNUSED239:
+ case DUK_OP_UNUSED240:
+ case DUK_OP_UNUSED241:
+ case DUK_OP_UNUSED242:
+ case DUK_OP_UNUSED243:
+ case DUK_OP_UNUSED244:
+ case DUK_OP_UNUSED245:
+ case DUK_OP_UNUSED246:
+ case DUK_OP_UNUSED247:
+ case DUK_OP_UNUSED248:
+ case DUK_OP_UNUSED249:
+ case DUK_OP_UNUSED250:
+ case DUK_OP_UNUSED251:
+ case DUK_OP_UNUSED252:
+ case DUK_OP_UNUSED253:
+ case DUK_OP_UNUSED254:
+ case DUK_OP_UNUSED255:
+ /* Force all case clauses to map to an actual handler
+ * so that the compiler can emit a jump without a bounds
+ * check: the switch argument is a duk_uint8_t so that
+ * the compiler may be able to figure it out. This is
+ * a small detail and obviously compiler dependent.
+ */
+ /* default: clause omitted on purpose */
+#else /* DUK_USE_EXEC_PREFER_SIZE */
+ default:
+#endif /* DUK_USE_EXEC_PREFER_SIZE */
+ {
+ /* Default case catches invalid/unsupported opcodes. */
+ DUK_D(DUK_DPRINT("invalid opcode: %ld - %!I", (long) op, ins));
+ DUK__INTERNAL_ERROR("invalid opcode");
+ break;
+ }
+
+ } /* end switch */
+
+ continue;
+
+ /* Some shared exit paths for opcode handling below. These
+ * are mostly useful to reduce code footprint when multiple
+ * opcodes have a similar epilogue (like replacing stack top
+ * with index 'a').
+ */
+
+#if defined(DUK_USE_EXEC_PREFER_SIZE)
+ replace_top_a:
+ DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins));
+ continue;
+ replace_top_bc:
+ DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins));
+ continue;
+#endif
+ }
+ DUK_UNREACHABLE();
+
+#if !defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS)
+ internal_error:
+ DUK_ERROR_INTERNAL(thr);
+#endif
+}
+
+/* automatic undefs */
+#undef DUK__BYTEOFF_A
+#undef DUK__BYTEOFF_B
+#undef DUK__BYTEOFF_BC
+#undef DUK__BYTEOFF_C
+#undef DUK__COMPARE_BODY
+#undef DUK__CONST
+#undef DUK__CONSTP
+#undef DUK__CONSTP_A
+#undef DUK__CONSTP_B
+#undef DUK__CONSTP_BC
+#undef DUK__CONSTP_C
+#undef DUK__DELPROP_BODY
+#undef DUK__EQ_BODY
+#undef DUK__FUN
+#undef DUK__GETPROPC_BODY
+#undef DUK__GETPROP_BODY
+#undef DUK__GE_BODY
+#undef DUK__GT_BODY
+#undef DUK__INLINE_PERF
+#undef DUK__INSTOF_BODY
+#undef DUK__INTERNAL_ERROR
+#undef DUK__INT_NOACTION
+#undef DUK__INT_RESTART
+#undef DUK__IN_BODY
+#undef DUK__LE_BODY
+#undef DUK__LONGJMP_RESTART
+#undef DUK__LONGJMP_RETHROW
+#undef DUK__LOOKUP_INDIRECT
+#undef DUK__LT_BODY
+#undef DUK__MASK_A
+#undef DUK__MASK_B
+#undef DUK__MASK_BC
+#undef DUK__MASK_C
+#undef DUK__NEQ_BODY
+#undef DUK__NOINLINE_PERF
+#undef DUK__PUTPROP_BODY
+#undef DUK__RCBIT_B
+#undef DUK__RCBIT_C
+#undef DUK__REG
+#undef DUK__REGCONSTP_B
+#undef DUK__REGCONSTP_C
+#undef DUK__REGP
+#undef DUK__REGP_A
+#undef DUK__REGP_B
+#undef DUK__REGP_BC
+#undef DUK__REGP_C
+#undef DUK__REPLACE_BOOL_A_BREAK
+#undef DUK__REPLACE_TOP_A_BREAK
+#undef DUK__REPLACE_TOP_BC_BREAK
+#undef DUK__REPLACE_TO_TVPTR
+#undef DUK__RETHAND_FINISHED
+#undef DUK__RETHAND_RESTART
+#undef DUK__RETURN_SHARED
+#undef DUK__SEQ_BODY
+#undef DUK__SHIFT_A
+#undef DUK__SHIFT_B
+#undef DUK__SHIFT_BC
+#undef DUK__SHIFT_C
+#undef DUK__SNEQ_BODY
+#undef DUK__STRICT
+#undef DUK__SYNC_AND_NULL_CURR_PC
+#undef DUK__SYNC_CURR_PC
+#undef DUK__TVAL_SHIFT
+#line 1 "duk_js_ops.c"
+/*
+ * Ecmascript specification algorithm and conversion helpers.
+ *
+ * These helpers encapsulate the primitive Ecmascript operation semantics,
+ * and are used by the bytecode executor and the API (among other places).
+ * Some primitives are only implemented as part of the API and have no
+ * "internal" helper. This is the case when an internal helper would not
+ * really be useful; e.g. the operation is rare, uses value stack heavily,
+ * etc.
+ *
+ * The operation arguments depend on what is required to implement
+ * the operation:
+ *
+ * - If an operation is simple and stateless, and has no side
+ * effects, it won't take an duk_hthread argument and its
+ * arguments may be duk_tval pointers (which are safe as long
+ * as no side effects take place).
+ *
+ * - If complex coercions are required (e.g. a "ToNumber" coercion)
+ * or errors may be thrown, the operation takes an duk_hthread
+ * argument. This also implies that the operation may have
+ * arbitrary side effects, invalidating any duk_tval pointers.
+ *
+ * - For operations with potential side effects, arguments can be
+ * taken in several ways:
+ *
+ * a) as duk_tval pointers, which makes sense if the "common case"
+ * can be resolved without side effects (e.g. coercion); the
+ * arguments are pushed to the valstack for coercion if
+ * necessary
+ *
+ * b) as duk_tval values
+ *
+ * c) implicitly on value stack top
+ *
+ * d) as indices to the value stack
+ *
+ * Future work:
+ *
+ * - Argument styles may not be the most sensible in every case now.
+ *
+ * - In-place coercions might be useful for several operations, if
+ * in-place coercion is OK for the bytecode executor and the API.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * ToPrimitive() (E5 Section 9.1)
+ *
+ * ==> implemented in the API.
+ */
+
+/*
+ * ToBoolean() (E5 Section 9.2)
+ */
+
+DUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) {
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL:
+ return 0;
+ case DUK_TAG_BOOLEAN:
+ DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || DUK_TVAL_GET_BOOLEAN(tv) == 1);
+ return DUK_TVAL_GET_BOOLEAN(tv);
+ case DUK_TAG_STRING: {
+ /* Symbols ToBoolean() coerce to true, regardless of their
+ * description. This happens with no explicit check because
+ * of the symbol representation byte prefix.
+ */
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv);
+ DUK_ASSERT(h != NULL);
+ return (DUK_HSTRING_GET_BYTELEN(h) > 0 ? 1 : 0);
+ }
+ case DUK_TAG_OBJECT: {
+ return 1;
+ }
+ case DUK_TAG_BUFFER: {
+ /* Mimic Uint8Array semantics: objects coerce true, regardless
+ * of buffer length (zero or not) or context.
+ */
+ return 1;
+ }
+ case DUK_TAG_POINTER: {
+ void *p = DUK_TVAL_GET_POINTER(tv);
+ return (p != NULL ? 1 : 0);
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ return 1;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+ if (DUK_TVAL_GET_FASTINT(tv) != 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+#endif
+ default: {
+ /* number */
+ duk_double_t d;
+#if defined(DUK_USE_PREFER_SIZE)
+ int c;
+#endif
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));
+ d = DUK_TVAL_GET_DOUBLE(tv);
+#if defined(DUK_USE_PREFER_SIZE)
+ c = DUK_FPCLASSIFY((double) d);
+ if (c == DUK_FP_ZERO || c == DUK_FP_NAN) {
+ return 0;
+ } else {
+ return 1;
+ }
+#else
+ DUK_ASSERT(duk_double_is_nan_or_zero(d) == 0 || duk_double_is_nan_or_zero(d) == 1);
+ return duk_double_is_nan_or_zero(d) ^ 1;
+#endif
+ }
+ }
+ DUK_UNREACHABLE();
+}
+
+/*
+ * ToNumber() (E5 Section 9.3)
+ *
+ * Value to convert must be on stack top, and is popped before exit.
+ *
+ * See: http://www.cs.indiana.edu/~burger/FP-Printing-PLDI96.pdf
+ * http://www.cs.indiana.edu/~burger/fp/index.html
+ *
+ * Notes on the conversion:
+ *
+ * - There are specific requirements on the accuracy of the conversion
+ * through a "Mathematical Value" (MV), so this conversion is not
+ * trivial.
+ *
+ * - Quick rejects (e.g. based on first char) are difficult because
+ * the grammar allows leading and trailing white space.
+ *
+ * - Quick reject based on string length is difficult even after
+ * accounting for white space; there may be arbitrarily many
+ * decimal digits.
+ *
+ * - Standard grammar allows decimal values ("123"), hex values
+ * ("0x123") and infinities
+ *
+ * - Unlike source code literals, ToNumber() coerces empty strings
+ * and strings with only whitespace to zero (not NaN).
+ */
+
+/* E5 Section 9.3.1 */
+DUK_LOCAL duk_double_t duk__tonumber_string_raw(duk_hthread *thr) {
+ duk_small_uint_t s2n_flags;
+ duk_double_t d;
+
+ DUK_ASSERT(duk_is_string(thr, -1));
+
+ /* Quite lenient, e.g. allow empty as zero, but don't allow trailing
+ * garbage.
+ */
+ s2n_flags = DUK_S2N_FLAG_TRIM_WHITE |
+ DUK_S2N_FLAG_ALLOW_EXP |
+ DUK_S2N_FLAG_ALLOW_PLUS |
+ DUK_S2N_FLAG_ALLOW_MINUS |
+ DUK_S2N_FLAG_ALLOW_INF |
+ DUK_S2N_FLAG_ALLOW_FRAC |
+ DUK_S2N_FLAG_ALLOW_NAKED_FRAC |
+ DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |
+ DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO |
+ DUK_S2N_FLAG_ALLOW_LEADING_ZERO |
+ DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT |
+ DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT |
+ DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT;
+
+ duk_numconv_parse(thr, 10 /*radix*/, s2n_flags);
+
+#if defined(DUK_USE_PREFER_SIZE)
+ d = duk_get_number(thr, -1);
+ duk_pop_unsafe(thr);
+#else
+ thr->valstack_top--;
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(thr->valstack_top));
+ DUK_ASSERT(DUK_TVAL_IS_DOUBLE(thr->valstack_top)); /* no fastint conversion in numconv now */
+ DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(thr->valstack_top));
+ d = DUK_TVAL_GET_DOUBLE(thr->valstack_top); /* assumes not a fastint */
+ DUK_TVAL_SET_UNDEFINED(thr->valstack_top);
+#endif
+
+ return d;
+}
+
+DUK_INTERNAL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(tv != NULL);
+
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_UNDEFINED: {
+ /* return a specific NaN (although not strictly necessary) */
+ duk_double_union du;
+ DUK_DBLUNION_SET_NAN(&du);
+ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));
+ return du.d;
+ }
+ case DUK_TAG_NULL: {
+ /* +0.0 */
+ return 0.0;
+ }
+ case DUK_TAG_BOOLEAN: {
+ if (DUK_TVAL_IS_BOOLEAN_TRUE(tv)) {
+ return 1.0;
+ }
+ return 0.0;
+ }
+ case DUK_TAG_STRING: {
+ /* For Symbols ToNumber() is always a TypeError. */
+ duk_hstring *h = DUK_TVAL_GET_STRING(tv);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {
+ DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL);
+ }
+ duk_push_hstring(thr, h);
+ return duk__tonumber_string_raw(thr);
+ }
+ case DUK_TAG_BUFFER: /* plain buffer treated like object */
+ case DUK_TAG_OBJECT: {
+ duk_double_t d;
+ duk_push_tval(thr, tv);
+ duk_to_primitive(thr, -1, DUK_HINT_NUMBER); /* 'tv' becomes invalid */
+
+ /* recursive call for a primitive value (guaranteed not to cause second
+ * recursion).
+ */
+ DUK_ASSERT(duk_get_tval(thr, -1) != NULL);
+ d = duk_js_tonumber(thr, duk_get_tval(thr, -1));
+
+ duk_pop_unsafe(thr);
+ return d;
+ }
+ case DUK_TAG_POINTER: {
+ /* Coerce like boolean */
+ void *p = DUK_TVAL_GET_POINTER(tv);
+ return (p != NULL ? 1.0 : 0.0);
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ /* +(function(){}) -> NaN */
+ return DUK_DOUBLE_NAN;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+ return (duk_double_t) DUK_TVAL_GET_FASTINT(tv);
+#endif
+ default: {
+ /* number */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));
+ DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));
+ return DUK_TVAL_GET_DOUBLE(tv);
+ }
+ }
+
+ DUK_UNREACHABLE();
+}
+
+/*
+ * ToInteger() (E5 Section 9.4)
+ */
+
+/* exposed, used by e.g. duk_bi_date.c */
+DUK_INTERNAL duk_double_t duk_js_tointeger_number(duk_double_t x) {
+#if defined(DUK_USE_PREFER_SIZE)
+ duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x);
+
+ if (DUK_UNLIKELY(c == DUK_FP_NAN)) {
+ return 0.0;
+ } else if (DUK_UNLIKELY(c == DUK_FP_INFINITE)) {
+ return x;
+ } else {
+ /* Finite, including neg/pos zero. Neg zero sign must be
+ * preserved.
+ */
+ return duk_double_trunc_towards_zero(x);
+ }
+#else /* DUK_USE_PREFER_SIZE */
+ /* NaN and Infinity have the same exponent so it's a cheap
+ * initial check for the rare path.
+ */
+ if (DUK_UNLIKELY(duk_double_is_nan_or_inf(x) != 0U)) {
+ if (duk_double_is_nan(x)) {
+ return 0.0;
+ } else {
+ return x;
+ }
+ } else {
+ return duk_double_trunc_towards_zero(x);
+ }
+#endif /* DUK_USE_PREFER_SIZE */
+}
+
+DUK_INTERNAL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv) {
+ /* XXX: fastint */
+ duk_double_t d = duk_js_tonumber(thr, tv); /* invalidates tv */
+ return duk_js_tointeger_number(d);
+}
+
+/*
+ * ToInt32(), ToUint32(), ToUint16() (E5 Sections 9.5, 9.6, 9.7)
+ */
+
+/* combined algorithm matching E5 Sections 9.5 and 9.6 */
+DUK_LOCAL duk_double_t duk__toint32_touint32_helper(duk_double_t x, duk_bool_t is_toint32) {
+#if defined (DUK_USE_PREFER_SIZE)
+ duk_small_int_t c;
+#endif
+
+#if defined (DUK_USE_PREFER_SIZE)
+ c = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ if (c == DUK_FP_NAN || c == DUK_FP_ZERO || c == DUK_FP_INFINITE) {
+ return 0.0;
+ }
+#else
+ if (duk_double_is_nan_zero_inf(x)) {
+ return 0.0;
+ }
+#endif
+
+ /* x = sign(x) * floor(abs(x)), i.e. truncate towards zero, keep sign */
+ x = duk_double_trunc_towards_zero(x);
+
+ /* NOTE: fmod(x) result sign is same as sign of x, which
+ * differs from what Javascript wants (see Section 9.6).
+ */
+
+ x = DUK_FMOD(x, DUK_DOUBLE_2TO32); /* -> x in ]-2**32, 2**32[ */
+
+ if (x < 0.0) {
+ x += DUK_DOUBLE_2TO32;
+ }
+ DUK_ASSERT(x >= 0 && x < DUK_DOUBLE_2TO32); /* -> x in [0, 2**32[ */
+
+ if (is_toint32) {
+ if (x >= DUK_DOUBLE_2TO31) {
+ /* x in [2**31, 2**32[ */
+
+ x -= DUK_DOUBLE_2TO32; /* -> x in [-2**31,2**31[ */
+ }
+ }
+
+ return x;
+}
+
+DUK_INTERNAL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv) {
+ duk_double_t d;
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ return DUK_TVAL_GET_FASTINT_I32(tv);
+ }
+#endif
+
+ d = duk_js_tonumber(thr, tv); /* invalidates tv */
+ d = duk__toint32_touint32_helper(d, 1);
+ DUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL);
+ DUK_ASSERT(d >= -2147483648.0 && d <= 2147483647.0); /* [-0x80000000,0x7fffffff] */
+ DUK_ASSERT(d == ((duk_double_t) ((duk_int32_t) d))); /* whole, won't clip */
+ return (duk_int32_t) d;
+}
+
+
+DUK_INTERNAL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv) {
+ duk_double_t d;
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv)) {
+ return DUK_TVAL_GET_FASTINT_U32(tv);
+ }
+#endif
+
+ d = duk_js_tonumber(thr, tv); /* invalidates tv */
+ d = duk__toint32_touint32_helper(d, 0);
+ DUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL);
+ DUK_ASSERT(d >= 0.0 && d <= 4294967295.0); /* [0x00000000, 0xffffffff] */
+ DUK_ASSERT(d == ((duk_double_t) ((duk_uint32_t) d))); /* whole, won't clip */
+ return (duk_uint32_t) d;
+
+}
+
+DUK_INTERNAL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv) {
+ /* should be a safe way to compute this */
+ return (duk_uint16_t) (duk_js_touint32(thr, tv) & 0x0000ffffU);
+}
+
+/*
+ * ToString() (E5 Section 9.8)
+ * ToObject() (E5 Section 9.9)
+ * CheckObjectCoercible() (E5 Section 9.10)
+ * IsCallable() (E5 Section 9.11)
+ *
+ * ==> implemented in the API.
+ */
+
+/*
+ * Loose equality, strict equality, and SameValue (E5 Sections 11.9.1, 11.9.4,
+ * 9.12). These have much in common so they can share some helpers.
+ *
+ * Future work notes:
+ *
+ * - Current implementation (and spec definition) has recursion; this should
+ * be fixed if possible.
+ *
+ * - String-to-number coercion should be possible without going through the
+ * value stack (and be more compact) if a shared helper is invoked.
+ */
+
+/* Note that this is the same operation for strict and loose equality:
+ * - E5 Section 11.9.3, step 1.c (loose)
+ * - E5 Section 11.9.6, step 4 (strict)
+ */
+
+DUK_LOCAL duk_bool_t duk__js_equals_number(duk_double_t x, duk_double_t y) {
+#if defined(DUK_USE_PARANOID_MATH)
+ /* Straightforward algorithm, makes fewer compiler assumptions. */
+ duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y);
+ if (cx == DUK_FP_NAN || cy == DUK_FP_NAN) {
+ return 0;
+ }
+ if (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) {
+ return 1;
+ }
+ if (x == y) {
+ return 1;
+ }
+ return 0;
+#else /* DUK_USE_PARANOID_MATH */
+ /* Better equivalent algorithm. If the compiler is compliant, C and
+ * Ecmascript semantics are identical for this particular comparison.
+ * In particular, NaNs must never compare equal and zeroes must compare
+ * equal regardless of sign. Could also use a macro, but this inlines
+ * already nicely (no difference on gcc, for instance).
+ */
+ if (x == y) {
+ /* IEEE requires that NaNs compare false */
+ DUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN);
+ DUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN);
+ return 1;
+ } else {
+ /* IEEE requires that zeros compare the same regardless
+ * of their signed, so if both x and y are zeroes, they
+ * are caught above.
+ */
+ DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO));
+ return 0;
+ }
+#endif /* DUK_USE_PARANOID_MATH */
+}
+
+DUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) {
+#if defined(DUK_USE_PARANOID_MATH)
+ duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y);
+
+ if (cx == DUK_FP_NAN && cy == DUK_FP_NAN) {
+ /* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */
+ return 1;
+ }
+ if (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) {
+ /* Note: cannot assume that a non-zero return value of signbit() would
+ * always be the same -- hence cannot (portably) use something like:
+ *
+ * signbit(x) == signbit(y)
+ */
+ duk_small_int_t sx = DUK_SIGNBIT(x) ? 1 : 0;
+ duk_small_int_t sy = DUK_SIGNBIT(y) ? 1 : 0;
+ return (sx == sy);
+ }
+
+ /* normal comparison; known:
+ * - both x and y are not NaNs (but one of them can be)
+ * - both x and y are not zero (but one of them can be)
+ * - x and y may be denormal or infinite
+ */
+
+ return (x == y);
+#else /* DUK_USE_PARANOID_MATH */
+ duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y);
+
+ if (x == y) {
+ /* IEEE requires that NaNs compare false */
+ DUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN);
+ DUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN);
+
+ /* Using classification has smaller footprint than direct comparison. */
+ if (DUK_UNLIKELY(cx == DUK_FP_ZERO && cy == DUK_FP_ZERO)) {
+ /* Note: cannot assume that a non-zero return value of signbit() would
+ * always be the same -- hence cannot (portably) use something like:
+ *
+ * signbit(x) == signbit(y)
+ */
+ return duk_double_same_sign(x, y);
+ }
+ return 1;
+ } else {
+ /* IEEE requires that zeros compare the same regardless
+ * of their sign, so if both x and y are zeroes, they
+ * are caught above.
+ */
+ DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO));
+
+ /* Difference to non-strict/strict comparison is that NaNs compare
+ * equal and signed zero signs matter.
+ */
+ if (DUK_UNLIKELY(cx == DUK_FP_NAN && cy == DUK_FP_NAN)) {
+ /* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */
+ return 1;
+ }
+ return 0;
+ }
+#endif /* DUK_USE_PARANOID_MATH */
+}
+
+DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) {
+ duk_uint_t type_mask_x;
+ duk_uint_t type_mask_y;
+
+ /* If flags != 0 (strict or SameValue), thr can be NULL. For loose
+ * equals comparison it must be != NULL.
+ */
+ DUK_ASSERT(flags != 0 || thr != NULL);
+
+ /*
+ * Same type?
+ *
+ * Note: since number values have no explicit tag in the 8-byte
+ * representation, need the awkward if + switch.
+ */
+
+#if defined(DUK_USE_FASTINT)
+ if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {
+ if (DUK_TVAL_GET_FASTINT(tv_x) == DUK_TVAL_GET_FASTINT(tv_y)) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ else
+#endif
+ if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) {
+ duk_double_t d1, d2;
+
+ /* Catches both doubles and cases where only one argument is
+ * a fastint so can't assume a double.
+ */
+ d1 = DUK_TVAL_GET_NUMBER(tv_x);
+ d2 = DUK_TVAL_GET_NUMBER(tv_y);
+ if (DUK_UNLIKELY((flags & DUK_EQUALS_FLAG_SAMEVALUE) != 0)) {
+ /* SameValue */
+ return duk__js_samevalue_number(d1, d2);
+ } else {
+ /* equals and strict equals */
+ return duk__js_equals_number(d1, d2);
+ }
+ } else if (DUK_TVAL_GET_TAG(tv_x) == DUK_TVAL_GET_TAG(tv_y)) {
+ switch (DUK_TVAL_GET_TAG(tv_x)) {
+ case DUK_TAG_UNDEFINED:
+ case DUK_TAG_NULL: {
+ return 1;
+ }
+ case DUK_TAG_BOOLEAN: {
+ return DUK_TVAL_GET_BOOLEAN(tv_x) == DUK_TVAL_GET_BOOLEAN(tv_y);
+ }
+ case DUK_TAG_POINTER: {
+ return DUK_TVAL_GET_POINTER(tv_x) == DUK_TVAL_GET_POINTER(tv_y);
+ }
+ case DUK_TAG_STRING:
+ case DUK_TAG_OBJECT: {
+ /* Heap pointer comparison suffices for strings and objects.
+ * Symbols compare equal if they have the same internal
+ * representation; again heap pointer comparison suffices.
+ */
+ return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y);
+ }
+ case DUK_TAG_BUFFER: {
+ /* In Duktape 2.x plain buffers mimic Uint8Array objects
+ * so always compare by heap pointer. In Duktape 1.x
+ * strict comparison would compare heap pointers and
+ * non-strict would compare contents.
+ */
+ return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y);
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ /* At least 'magic' has a significant impact on function
+ * identity.
+ */
+ duk_small_uint_t lf_flags_x;
+ duk_small_uint_t lf_flags_y;
+ duk_c_function func_x;
+ duk_c_function func_y;
+
+ DUK_TVAL_GET_LIGHTFUNC(tv_x, func_x, lf_flags_x);
+ DUK_TVAL_GET_LIGHTFUNC(tv_y, func_y, lf_flags_y);
+ return ((func_x == func_y) && (lf_flags_x == lf_flags_y)) ? 1 : 0;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x));
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_y));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_y));
+ DUK_UNREACHABLE();
+ return 0;
+ }
+ }
+ }
+
+ if ((flags & (DUK_EQUALS_FLAG_STRICT | DUK_EQUALS_FLAG_SAMEVALUE)) != 0) {
+ return 0;
+ }
+
+ DUK_ASSERT(flags == 0); /* non-strict equality from here on */
+
+ /*
+ * Types are different; various cases for non-strict comparison
+ *
+ * Since comparison is symmetric, we use a "swap trick" to reduce
+ * code size.
+ */
+
+ type_mask_x = duk_get_type_mask_tval(tv_x);
+ type_mask_y = duk_get_type_mask_tval(tv_y);
+
+ /* Undefined/null are considered equal (e.g. "null == undefined" -> true). */
+ if ((type_mask_x & (DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL)) &&
+ (type_mask_y & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED))) {
+ return 1;
+ }
+
+ /* Number/string -> coerce string to number (e.g. "'1.5' == 1.5" -> true). */
+ if ((type_mask_x & DUK_TYPE_MASK_NUMBER) && (type_mask_y & DUK_TYPE_MASK_STRING)) {
+ if (!DUK_TVAL_STRING_IS_SYMBOL(tv_y)) {
+ duk_double_t d1, d2;
+ d1 = DUK_TVAL_GET_NUMBER(tv_x);
+ d2 = duk_to_number_tval(thr, tv_y);
+ return duk__js_equals_number(d1, d2);
+ }
+ }
+ if ((type_mask_x & DUK_TYPE_MASK_STRING) && (type_mask_y & DUK_TYPE_MASK_NUMBER)) {
+ if (!DUK_TVAL_STRING_IS_SYMBOL(tv_x)) {
+ duk_double_t d1, d2;
+ d1 = DUK_TVAL_GET_NUMBER(tv_y);
+ d2 = duk_to_number_tval(thr, tv_x);
+ return duk__js_equals_number(d1, d2);
+ }
+ }
+
+ /* Boolean/any -> coerce boolean to number and try again. If boolean is
+ * compared to a pointer, the final comparison after coercion now always
+ * yields false (as pointer vs. number compares to false), but this is
+ * not special cased.
+ *
+ * ToNumber(bool) is +1.0 or 0.0. Tagged boolean value is always 0 or 1.
+ */
+ if (type_mask_x & DUK_TYPE_MASK_BOOLEAN) {
+ DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_x) == 0 || DUK_TVAL_GET_BOOLEAN(tv_x) == 1);
+ duk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_x));
+ duk_push_tval(thr, tv_y);
+ goto recursive_call;
+ }
+ if (type_mask_y & DUK_TYPE_MASK_BOOLEAN) {
+ DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_y) == 0 || DUK_TVAL_GET_BOOLEAN(tv_y) == 1);
+ duk_push_tval(thr, tv_x);
+ duk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_y));
+ goto recursive_call;
+ }
+
+ /* String-number-symbol/object -> coerce object to primitive (apparently without hint), then try again. */
+ if ((type_mask_x & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER)) &&
+ (type_mask_y & DUK_TYPE_MASK_OBJECT)) {
+ /* No symbol check needed because symbols and strings are accepted. */
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ duk_to_primitive(thr, -1, DUK_HINT_NONE); /* apparently no hint? */
+ goto recursive_call;
+ }
+ if ((type_mask_x & DUK_TYPE_MASK_OBJECT) &&
+ (type_mask_y & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER))) {
+ /* No symbol check needed because symbols and strings are accepted. */
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ duk_to_primitive(thr, -2, DUK_HINT_NONE); /* apparently no hint? */
+ goto recursive_call;
+ }
+
+ /* Nothing worked -> not equal. */
+ return 0;
+
+ recursive_call:
+ /* Shared code path to call the helper again with arguments on stack top. */
+ {
+ duk_bool_t rc;
+ rc = duk_js_equals_helper(thr,
+ DUK_GET_TVAL_NEGIDX(thr, -2),
+ DUK_GET_TVAL_NEGIDX(thr, -1),
+ 0 /*flags:nonstrict*/);
+ duk_pop_2_unsafe(thr);
+ return rc;
+ }
+}
+
+/*
+ * Comparisons (x >= y, x > y, x <= y, x < y)
+ *
+ * E5 Section 11.8.5: implement 'x < y' and then use negate and eval_left_first
+ * flags to get the rest.
+ */
+
+/* XXX: this should probably just operate on the stack top, because it
+ * needs to push stuff on the stack anyway...
+ */
+
+DUK_INTERNAL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2) {
+ duk_size_t prefix_len;
+ duk_small_int_t rc;
+
+ prefix_len = (len1 <= len2 ? len1 : len2);
+
+ /* DUK_MEMCMP() is guaranteed to return zero (equal) for zero length
+ * inputs so no zero length check is needed.
+ */
+ rc = DUK_MEMCMP((const void *) buf1,
+ (const void *) buf2,
+ (size_t) prefix_len);
+
+ if (rc < 0) {
+ return -1;
+ } else if (rc > 0) {
+ return 1;
+ }
+
+ /* prefix matches, lengths matter now */
+ if (len1 < len2) {
+ /* e.g. "x" < "xx" */
+ return -1;
+ } else if (len1 > len2) {
+ return 1;
+ }
+
+ return 0;
+}
+
+DUK_INTERNAL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2) {
+ /*
+ * String comparison (E5 Section 11.8.5, step 4), which
+ * needs to compare codepoint by codepoint.
+ *
+ * However, UTF-8 allows us to use strcmp directly: the shared
+ * prefix will be encoded identically (UTF-8 has unique encoding)
+ * and the first differing character can be compared with a simple
+ * unsigned byte comparison (which strcmp does).
+ *
+ * This will not work properly for non-xutf-8 strings, but this
+ * is not an issue for compliance.
+ */
+
+ DUK_ASSERT(h1 != NULL);
+ DUK_ASSERT(h2 != NULL);
+
+ return duk_js_data_compare((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h1),
+ (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h2),
+ (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1),
+ (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2));
+}
+
+#if 0 /* unused */
+DUK_INTERNAL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2) {
+ /* Similar to String comparison. */
+
+ DUK_ASSERT(h1 != NULL);
+ DUK_ASSERT(h2 != NULL);
+ DUK_UNREF(heap);
+
+ return duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h1),
+ (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h2),
+ (duk_size_t) DUK_HBUFFER_GET_SIZE(h1),
+ (duk_size_t) DUK_HBUFFER_GET_SIZE(h2));
+}
+#endif
+
+#if defined(DUK_USE_FASTINT)
+DUK_LOCAL duk_bool_t duk__compare_fastint(duk_bool_t retval, duk_int64_t v1, duk_int64_t v2) {
+ DUK_ASSERT(retval == 0 || retval == 1);
+ if (v1 < v2) {
+ return retval ^ 1;
+ } else {
+ return retval;
+ }
+}
+#endif
+
+#if defined(DUK_USE_PARANOID_MATH)
+DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) {
+ duk_small_int_t c1, s1, c2, s2;
+
+ DUK_ASSERT(retval == 0 || retval == 1);
+ c1 = (duk_small_int_t) DUK_FPCLASSIFY(d1);
+ s1 = (duk_small_int_t) DUK_SIGNBIT(d1);
+ c2 = (duk_small_int_t) DUK_FPCLASSIFY(d2);
+ s2 = (duk_small_int_t) DUK_SIGNBIT(d2);
+
+ if (c1 == DUK_FP_NAN || c2 == DUK_FP_NAN) {
+ return 0; /* Always false, regardless of negation. */
+ }
+
+ if (c1 == DUK_FP_ZERO && c2 == DUK_FP_ZERO) {
+ /* For all combinations: +0 < +0, +0 < -0, -0 < +0, -0 < -0,
+ * steps e, f, and g.
+ */
+ return retval; /* false */
+ }
+
+ if (d1 == d2) {
+ return retval; /* false */
+ }
+
+ if (c1 == DUK_FP_INFINITE && s1 == 0) {
+ /* x == +Infinity */
+ return retval; /* false */
+ }
+
+ if (c2 == DUK_FP_INFINITE && s2 == 0) {
+ /* y == +Infinity */
+ return retval ^ 1; /* true */
+ }
+
+ if (c2 == DUK_FP_INFINITE && s2 != 0) {
+ /* y == -Infinity */
+ return retval; /* false */
+ }
+
+ if (c1 == DUK_FP_INFINITE && s1 != 0) {
+ /* x == -Infinity */
+ return retval ^ 1; /* true */
+ }
+
+ if (d1 < d2) {
+ return retval ^ 1; /* true */
+ }
+
+ return retval; /* false */
+}
+#else /* DUK_USE_PARANOID_MATH */
+DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) {
+ /* This comparison tree relies doesn't match the exact steps in
+ * E5 Section 11.8.5 but should produce the same results. The
+ * steps rely on exact IEEE semantics for NaNs, etc.
+ */
+
+ DUK_ASSERT(retval == 0 || retval == 1);
+ if (d1 < d2) {
+ /* In no case should both (d1 < d2) and (d2 < d1) be true.
+ * It's possible that neither is true though, and that's
+ * handled below.
+ */
+ DUK_ASSERT(!(d2 < d1));
+
+ /* - d1 < d2, both d1/d2 are normals (not Infinity, not NaN)
+ * - d2 is +Infinity, d1 != +Infinity and NaN
+ * - d1 is -Infinity, d2 != -Infinity and NaN
+ */
+ return retval ^ 1;
+ } else {
+ if (d2 < d1) {
+ /* - !(d1 < d2), both d1/d2 are normals (not Infinity, not NaN)
+ * - d1 is +Infinity, d2 != +Infinity and NaN
+ * - d2 is -Infinity, d1 != -Infinity and NaN
+ */
+ return retval;
+ } else {
+ /* - d1 and/or d2 is NaN
+ * - d1 and d2 are both +/- 0
+ * - d1 == d2 (including infinities)
+ */
+ if (duk_double_is_nan(d1) || duk_double_is_nan(d2)) {
+ /* Note: undefined from Section 11.8.5 always
+ * results in false return (see e.g. Section
+ * 11.8.3) - hence special treatment here.
+ */
+ return 0; /* zero regardless of negation */
+ } else {
+ return retval;
+ }
+ }
+ }
+}
+#endif /* DUK_USE_PARANOID_MATH */
+
+DUK_INTERNAL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) {
+ duk_double_t d1, d2;
+ duk_small_int_t rc;
+ duk_bool_t retval;
+
+ DUK_ASSERT(DUK_COMPARE_FLAG_NEGATE == 1); /* Rely on this flag being lowest. */
+ retval = flags & DUK_COMPARE_FLAG_NEGATE;
+ DUK_ASSERT(retval == 0 || retval == 1);
+
+ /* Fast path for fastints */
+#if defined(DUK_USE_FASTINT)
+ if (DUK_LIKELY(DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y))) {
+ return duk__compare_fastint(retval,
+ DUK_TVAL_GET_FASTINT(tv_x),
+ DUK_TVAL_GET_FASTINT(tv_y));
+ }
+#endif /* DUK_USE_FASTINT */
+
+ /* Fast path for numbers (one of which may be a fastint) */
+#if !defined(DUK_USE_PREFER_SIZE)
+ if (DUK_LIKELY(DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y))) {
+ return duk__compare_number(retval,
+ DUK_TVAL_GET_NUMBER(tv_x),
+ DUK_TVAL_GET_NUMBER(tv_y));
+ }
+#endif
+
+ /* Slow path */
+
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+
+ if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) {
+ duk_to_primitive(thr, -2, DUK_HINT_NUMBER);
+ duk_to_primitive(thr, -1, DUK_HINT_NUMBER);
+ } else {
+ duk_to_primitive(thr, -1, DUK_HINT_NUMBER);
+ duk_to_primitive(thr, -2, DUK_HINT_NUMBER);
+ }
+
+ /* Note: reuse variables */
+ tv_x = DUK_GET_TVAL_NEGIDX(thr, -2);
+ tv_y = DUK_GET_TVAL_NEGIDX(thr, -1);
+
+ if (DUK_TVAL_IS_STRING(tv_x) && DUK_TVAL_IS_STRING(tv_y)) {
+ duk_hstring *h1 = DUK_TVAL_GET_STRING(tv_x);
+ duk_hstring *h2 = DUK_TVAL_GET_STRING(tv_y);
+ DUK_ASSERT(h1 != NULL);
+ DUK_ASSERT(h2 != NULL);
+
+ if (DUK_LIKELY(!DUK_HSTRING_HAS_SYMBOL(h1) && !DUK_HSTRING_HAS_SYMBOL(h2))) {
+ rc = duk_js_string_compare(h1, h2);
+ duk_pop_2_unsafe(thr);
+ if (rc < 0) {
+ return retval ^ 1;
+ } else {
+ return retval;
+ }
+ }
+
+ /* One or both are Symbols: fall through to handle in the
+ * generic path. Concretely, ToNumber() will fail.
+ */
+ }
+
+ /* Ordering should not matter (E5 Section 11.8.5, step 3.a). */
+#if 0
+ if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) {
+ d1 = duk_to_number_m2(thr);
+ d2 = duk_to_number_m1(thr);
+ } else {
+ d2 = duk_to_number_m1(thr);
+ d1 = duk_to_number_m2(thr);
+ }
+#endif
+ d1 = duk_to_number_m2(thr);
+ d2 = duk_to_number_m1(thr);
+
+ /* We want to duk_pop_2_unsafe(thr); because the values are numbers
+ * no decref check is needed.
+ */
+#if defined(DUK_USE_PREFER_SIZE)
+ duk_pop_2_nodecref_unsafe(thr);
+#else
+ DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -2)));
+ DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -1)));
+ DUK_ASSERT(duk_get_top(thr) >= 2);
+ thr->valstack_top -= 2;
+ tv_x = thr->valstack_top;
+ tv_y = tv_x + 1;
+ DUK_TVAL_SET_UNDEFINED(tv_x); /* Value stack policy */
+ DUK_TVAL_SET_UNDEFINED(tv_y);
+#endif
+
+ return duk__compare_number(retval, d1, d2);
+}
+
+/*
+ * instanceof
+ */
+
+/*
+ * E5 Section 11.8.6 describes the main algorithm, which uses
+ * [[HasInstance]]. [[HasInstance]] is defined for only
+ * function objects:
+ *
+ * - Normal functions:
+ * E5 Section 15.3.5.3
+ * - Functions established with Function.prototype.bind():
+ * E5 Section 15.3.4.5.3
+ *
+ * For other objects, a TypeError is thrown.
+ *
+ * Limited Proxy support: don't support 'getPrototypeOf' trap but
+ * continue lookup in Proxy target if the value is a Proxy.
+ */
+
+DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) {
+ duk_hobject *func;
+ duk_hobject *val;
+ duk_hobject *proto;
+ duk_tval *tv;
+ duk_bool_t skip_first;
+ duk_uint_t sanity;
+
+ /*
+ * Get the values onto the stack first. It would be possible to cover
+ * some normal cases without resorting to the value stack.
+ *
+ * The right hand side could be a light function (as they generally
+ * behave like objects). Light functions never have a 'prototype'
+ * property so E5.1 Section 15.3.5.3 step 3 always throws a TypeError.
+ * Using duk_require_hobject() is thus correct (except for error msg).
+ */
+
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ func = duk_require_hobject(thr, -1);
+ DUK_ASSERT(func != NULL);
+
+ /*
+ * For bound objects, [[HasInstance]] just calls the target function
+ * [[HasInstance]]. If that is again a bound object, repeat until
+ * we find a non-bound Function object.
+ *
+ * The bound function chain is now "collapsed" so there can be only
+ * one bound function in the chain.
+ */
+
+ if (!DUK_HOBJECT_IS_CALLABLE(func)) {
+ /*
+ * Note: of native Ecmascript objects, only Function instances
+ * have a [[HasInstance]] internal property. Custom objects might
+ * also have it, but not in current implementation.
+ *
+ * XXX: add a separate flag, DUK_HOBJECT_FLAG_ALLOW_INSTANCEOF?
+ */
+ goto error_invalid_rval;
+ }
+
+ if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) {
+ duk_push_tval(thr, &((duk_hboundfunc *) func)->target);
+ duk_replace(thr, -2);
+ func = duk_require_hobject(thr, -1); /* lightfunc throws */
+
+ /* Rely on Function.prototype.bind() never creating bound
+ * functions whose target is not proper.
+ */
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func));
+ }
+
+ /*
+ * 'func' is now a non-bound object which supports [[HasInstance]]
+ * (which here just means DUK_HOBJECT_FLAG_CALLABLE). Move on
+ * to execute E5 Section 15.3.5.3.
+ */
+
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));
+ DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func));
+
+ /* [ ... lval rval(func) ] */
+
+ /* For lightfuncs, buffers, and pointers start the comparison directly
+ * from the virtual prototype object.
+ */
+ skip_first = 0;
+ tv = DUK_GET_TVAL_NEGIDX(thr, -2);
+ switch (DUK_TVAL_GET_TAG(tv)) {
+ case DUK_TAG_LIGHTFUNC:
+ val = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE];
+ DUK_ASSERT(val != NULL);
+ break;
+ case DUK_TAG_BUFFER:
+ val = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];
+ DUK_ASSERT(val != NULL);
+ break;
+ case DUK_TAG_POINTER:
+ val = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE];
+ DUK_ASSERT(val != NULL);
+ break;
+ case DUK_TAG_OBJECT:
+ skip_first = 1; /* Ignore object itself on first round. */
+ val = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(val != NULL);
+ break;
+ default:
+ goto pop2_and_false;
+ }
+ DUK_ASSERT(val != NULL); /* Loop doesn't actually rely on this. */
+
+ /* Look up .prototype of rval. Leave it on the value stack in case it
+ * has been virtualized (e.g. getter, Proxy trap).
+ */
+ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_PROTOTYPE); /* -> [ ... lval rval rval.prototype ] */
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ proto = duk_get_hobject(thr, -1);
+ if (proto == NULL) {
+ goto error_invalid_rval_noproto;
+ }
+#else
+ proto = duk_require_hobject(thr, -1);
+#endif
+
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ do {
+ /*
+ * Note: prototype chain is followed BEFORE first comparison. This
+ * means that the instanceof lval is never itself compared to the
+ * rval.prototype property. This is apparently intentional, see E5
+ * Section 15.3.5.3, step 4.a.
+ *
+ * Also note:
+ *
+ * js> (function() {}) instanceof Function
+ * true
+ * js> Function instanceof Function
+ * true
+ *
+ * For the latter, h_proto will be Function.prototype, which is the
+ * built-in Function prototype. Because Function.[[Prototype]] is
+ * also the built-in Function prototype, the result is true.
+ */
+
+ if (!val) {
+ goto pop3_and_false;
+ }
+
+ DUK_ASSERT(val != NULL);
+#if defined(DUK_USE_ES6_PROXY)
+ val = duk_hobject_resolve_proxy_target(val);
+#endif
+
+ if (skip_first) {
+ skip_first = 0;
+ } else if (val == proto) {
+ goto pop3_and_true;
+ }
+
+ DUK_ASSERT(val != NULL);
+ val = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, val);
+ } while (--sanity > 0);
+
+ if (DUK_UNLIKELY(sanity == 0)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+ DUK_UNREACHABLE();
+
+ pop2_and_false:
+ duk_pop_2_unsafe(thr);
+ return 0;
+
+ pop3_and_false:
+ duk_pop_3_unsafe(thr);
+ return 0;
+
+ pop3_and_true:
+ duk_pop_3_unsafe(thr);
+ return 1;
+
+ error_invalid_rval:
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL);
+ return 0;
+
+#if defined(DUK_USE_VERBOSE_ERRORS)
+ error_invalid_rval_noproto:
+ DUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO);
+ return 0;
+#endif
+}
+
+/*
+ * in
+ */
+
+/*
+ * E5 Sections 11.8.7, 8.12.6.
+ *
+ * Basically just a property existence check using [[HasProperty]].
+ */
+
+DUK_INTERNAL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) {
+ duk_bool_t retval;
+
+ /*
+ * Get the values onto the stack first. It would be possible to cover
+ * some normal cases without resorting to the value stack (e.g. if
+ * lval is already a string).
+ */
+
+ /* XXX: The ES5/5.1/6 specifications require that the key in 'key in obj'
+ * must be string coerced before the internal HasProperty() algorithm is
+ * invoked. A fast path skipping coercion could be safely implemented for
+ * numbers (as number-to-string coercion has no side effects). For ES2015
+ * proxy behavior, the trap 'key' argument must be in a string coerced
+ * form (which is a shame).
+ */
+
+ /* TypeError if rval is not an object or object like (e.g. lightfunc
+ * or plain buffer).
+ */
+ duk_push_tval(thr, tv_x);
+ duk_push_tval(thr, tv_y);
+ duk_require_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);
+
+ (void) duk_to_property_key_hstring(thr, -2);
+
+ retval = duk_hobject_hasprop(thr,
+ DUK_GET_TVAL_NEGIDX(thr, -1),
+ DUK_GET_TVAL_NEGIDX(thr, -2));
+
+ duk_pop_2_unsafe(thr);
+ return retval;
+}
+
+/*
+ * typeof
+ *
+ * E5 Section 11.4.3.
+ *
+ * Very straightforward. The only question is what to return for our
+ * non-standard tag / object types.
+ *
+ * There is an unfortunate string constant define naming problem with
+ * typeof return values for e.g. "Object" and "object"; careful with
+ * the built-in string defines. The LC_XXX defines are used for the
+ * lowercase variants now.
+ */
+
+DUK_INTERNAL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x) {
+ duk_small_uint_t stridx = 0;
+
+ switch (DUK_TVAL_GET_TAG(tv_x)) {
+ case DUK_TAG_UNDEFINED: {
+ stridx = DUK_STRIDX_LC_UNDEFINED;
+ break;
+ }
+ case DUK_TAG_NULL: {
+ /* Note: not a typo, "object" is returned for a null value. */
+ stridx = DUK_STRIDX_LC_OBJECT;
+ break;
+ }
+ case DUK_TAG_BOOLEAN: {
+ stridx = DUK_STRIDX_LC_BOOLEAN;
+ break;
+ }
+ case DUK_TAG_POINTER: {
+ /* Implementation specific. */
+ stridx = DUK_STRIDX_LC_POINTER;
+ break;
+ }
+ case DUK_TAG_STRING: {
+ duk_hstring *str;
+
+ /* All internal keys are identified as Symbols. */
+ str = DUK_TVAL_GET_STRING(tv_x);
+ DUK_ASSERT(str != NULL);
+ if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(str))) {
+ stridx = DUK_STRIDX_LC_SYMBOL;
+ } else {
+ stridx = DUK_STRIDX_LC_STRING;
+ }
+ break;
+ }
+ case DUK_TAG_OBJECT: {
+ duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_x);
+ DUK_ASSERT(obj != NULL);
+ if (DUK_HOBJECT_IS_CALLABLE(obj)) {
+ stridx = DUK_STRIDX_LC_FUNCTION;
+ } else {
+ stridx = DUK_STRIDX_LC_OBJECT;
+ }
+ break;
+ }
+ case DUK_TAG_BUFFER: {
+ /* Implementation specific. In Duktape 1.x this would be
+ * 'buffer', in Duktape 2.x changed to 'object' because plain
+ * buffers now mimic Uint8Array objects.
+ */
+ stridx = DUK_STRIDX_LC_OBJECT;
+ break;
+ }
+ case DUK_TAG_LIGHTFUNC: {
+ stridx = DUK_STRIDX_LC_FUNCTION;
+ break;
+ }
+#if defined(DUK_USE_FASTINT)
+ case DUK_TAG_FASTINT:
+#endif
+ default: {
+ /* number */
+ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x));
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x));
+ stridx = DUK_STRIDX_LC_NUMBER;
+ break;
+ }
+ }
+
+ DUK_ASSERT_STRIDX_VALID(stridx);
+ return stridx;
+}
+
+/*
+ * Array index and length
+ *
+ * Array index: E5 Section 15.4
+ * Array length: E5 Section 15.4.5.1 steps 3.c - 3.d (array length write)
+ */
+
+/* Compure array index from string context, or return a "not array index"
+ * indicator.
+ */
+DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen) {
+ duk_uarridx_t res;
+
+ /* Only strings with byte length 1-10 can be 32-bit array indices.
+ * Leading zeroes (except '0' alone), plus/minus signs are not allowed.
+ * We could do a lot of prechecks here, but since most strings won't
+ * start with any digits, it's simpler to just parse the number and
+ * fail quickly.
+ */
+
+ res = 0;
+ if (blen == 0) {
+ goto parse_fail;
+ }
+ do {
+ duk_uarridx_t dig;
+ dig = (duk_uarridx_t) (*str++) - DUK_ASC_0;
+
+ if (dig <= 9U) {
+ /* Careful overflow handling. When multiplying by 10:
+ * - 0x19999998 x 10 = 0xfffffff0: no overflow, and adding
+ * 0...9 is safe.
+ * - 0x19999999 x 10 = 0xfffffffa: no overflow, adding
+ * 0...5 is safe, 6...9 overflows.
+ * - 0x1999999a x 10 = 0x100000004: always overflow.
+ */
+ if (DUK_UNLIKELY(res >= 0x19999999UL)) {
+ if (res >= 0x1999999aUL) {
+ /* Always overflow. */
+ goto parse_fail;
+ }
+ DUK_ASSERT(res == 0x19999999UL);
+ if (dig >= 6U) {
+ goto parse_fail;
+ }
+ res = 0xfffffffaUL + dig;
+ DUK_ASSERT(res >= 0xfffffffaUL);
+ DUK_ASSERT_DISABLE(res <= 0xffffffffUL); /* range */
+ } else {
+ res = res * 10U + dig;
+ if (DUK_UNLIKELY(res == 0)) {
+ /* If 'res' is 0, previous 'res' must
+ * have been 0 and we scanned in a zero.
+ * This is only allowed if blen == 1,
+ * i.e. the exact string '0'.
+ */
+ if (blen == (duk_uint32_t) 1) {
+ return 0;
+ }
+ goto parse_fail;
+ }
+ }
+ } else {
+ /* Because 'dig' is unsigned, catches both values
+ * above '9' and below '0'.
+ */
+ goto parse_fail;
+ }
+ } while (--blen > 0);
+
+ return res;
+
+ parse_fail:
+ return DUK_HSTRING_NO_ARRAY_INDEX;
+}
+
+#if !defined(DUK_USE_HSTRING_ARRIDX)
+/* Get array index for a string which is known to be an array index. This helper
+ * is needed when duk_hstring doesn't concretely store the array index, but strings
+ * are flagged as array indices at intern time.
+ */
+DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h) {
+ const duk_uint8_t *p;
+ duk_uarridx_t res;
+ duk_uint8_t t;
+
+ DUK_ASSERT(h != NULL);
+ DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(h));
+
+ p = DUK_HSTRING_GET_DATA(h);
+ res = 0;
+ for (;;) {
+ t = *p++;
+ if (DUK_UNLIKELY(t == 0)) {
+ /* Scanning to NUL is always safe for interned strings. */
+ break;
+ }
+ DUK_ASSERT(t >= (duk_uint8_t) DUK_ASC_0 && t <= (duk_uint8_t) DUK_ASC_9);
+ res = res * 10U + (duk_uarridx_t) t - (duk_uarridx_t) DUK_ASC_0;
+ }
+ return res;
+}
+
+DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h) {
+ DUK_ASSERT(h != NULL);
+ if (!DUK_HSTRING_HAS_ARRIDX(h)) {
+ return DUK_HSTRING_NO_ARRAY_INDEX;
+ }
+ return duk_js_to_arrayindex_hstring_fast_known(h);
+}
+#endif /* DUK_USE_HSTRING_ARRIDX */
+#line 1 "duk_js_var.c"
+/*
+ * Identifier access and function closure handling.
+ *
+ * Provides the primitives for slow path identifier accesses: GETVAR,
+ * PUTVAR, DELVAR, etc. The fast path, direct register accesses, should
+ * be used for most identifier accesses. Consequently, these slow path
+ * primitives should be optimized for maximum compactness.
+ *
+ * Ecmascript environment records (declarative and object) are represented
+ * as internal objects with control keys. Environment records have a
+ * parent record ("outer environment reference") which is represented by
+ * the implicit prototype for technical reasons (in other words, it is a
+ * convenient field). The prototype chain is not followed in the ordinary
+ * sense for variable lookups.
+ *
+ * See identifier-handling.rst for more details on the identifier algorithms
+ * and the internal representation. See function-objects.rst for details on
+ * what function templates and instances are expected to look like.
+ *
+ * Care must be taken to avoid duk_tval pointer invalidation caused by
+ * e.g. value stack or object resizing.
+ *
+ * TODO: properties for function instances could be initialized much more
+ * efficiently by creating a property allocation for a certain size and
+ * filling in keys and values directly (and INCREFing both with "bulk incref"
+ * primitives.
+ *
+ * XXX: duk_hobject_getprop() and duk_hobject_putprop() calls are a bit
+ * awkward (especially because they follow the prototype chain); rework
+ * if "raw" own property helpers are added.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Local result type for duk__get_identifier_reference() lookup.
+ */
+
+typedef struct {
+ duk_hobject *env;
+ duk_hobject *holder; /* for object-bound identifiers */
+ duk_tval *value; /* for register-bound and declarative env identifiers */
+ duk_uint_t attrs; /* property attributes for identifier (relevant if value != NULL) */
+ duk_bool_t has_this; /* for object-bound identifiers: provide 'this' binding */
+} duk__id_lookup_result;
+
+/*
+ * Create a new function object based on a "template function" which contains
+ * compiled bytecode, constants, etc, but lacks a lexical environment.
+ *
+ * Ecmascript requires that each created closure is a separate object, with
+ * its own set of editable properties. However, structured property values
+ * (such as the formal arguments list and the variable map) are shared.
+ * Also the bytecode, constants, and inner functions are shared.
+ *
+ * See E5 Section 13.2 for detailed requirements on the function objects;
+ * there are no similar requirements for function "templates" which are an
+ * implementation dependent internal feature. Also see function-objects.rst
+ * for a discussion on the function instance properties provided by this
+ * implementation.
+ *
+ * Notes:
+ *
+ * * Order of internal properties should match frequency of use, since the
+ * properties will be linearly scanned on lookup (functions usually don't
+ * have enough properties to warrant a hash part).
+ *
+ * * The created closure is independent of its template; they do share the
+ * same 'data' buffer object, but the template object itself can be freed
+ * even if the closure object remains reachable.
+ */
+
+DUK_LOCAL void duk__inc_data_inner_refcounts(duk_hthread *thr, duk_hcompfunc *f) {
+ duk_tval *tv, *tv_end;
+ duk_hobject **funcs, **funcs_end;
+
+ DUK_UNREF(thr);
+
+ /* If function creation fails due to out-of-memory, the data buffer
+ * pointer may be NULL in some cases. That's actually possible for
+ * GC code, but shouldn't be possible here because the incomplete
+ * function will be unwound from the value stack and never instantiated.
+ */
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, f) != NULL);
+
+ tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, f);
+ tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, f);
+ while (tv < tv_end) {
+ DUK_TVAL_INCREF(thr, tv);
+ tv++;
+ }
+
+ funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, f);
+ funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, f);
+ while (funcs < funcs_end) {
+ DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) *funcs);
+ funcs++;
+ }
+}
+
+/* Push a new closure on the stack.
+ *
+ * Note: if fun_temp has NEWENV, i.e. a new lexical and variable declaration
+ * is created when the function is called, only outer_lex_env matters
+ * (outer_var_env is ignored and may or may not be same as outer_lex_env).
+ */
+
+DUK_LOCAL const duk_uint16_t duk__closure_copy_proplist[] = {
+ /* order: most frequent to least frequent */
+ DUK_STRIDX_INT_VARMAP,
+ DUK_STRIDX_INT_FORMALS,
+#if defined(DUK_USE_PC2LINE)
+ DUK_STRIDX_INT_PC2LINE,
+#endif
+#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)
+ DUK_STRIDX_FILE_NAME,
+#endif
+#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY)
+ DUK_STRIDX_INT_SOURCE
+#endif
+};
+
+DUK_INTERNAL
+void duk_js_push_closure(duk_hthread *thr,
+ duk_hcompfunc *fun_temp,
+ duk_hobject *outer_var_env,
+ duk_hobject *outer_lex_env,
+ duk_bool_t add_auto_proto) {
+ duk_hcompfunc *fun_clos;
+ duk_small_uint_t i;
+ duk_uint_t len_value;
+
+ DUK_ASSERT(fun_temp != NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp) != NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp) != NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp) != NULL);
+ DUK_ASSERT(outer_var_env != NULL);
+ DUK_ASSERT(outer_lex_env != NULL);
+ DUK_UNREF(len_value);
+
+ fun_clos = duk_push_hcompfunc(thr);
+ DUK_ASSERT(fun_clos != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) fun_clos) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+
+ duk_push_hobject(thr, &fun_temp->obj); /* -> [ ... closure template ] */
+
+ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun_clos));
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) == NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) == NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) == NULL);
+
+ DUK_HCOMPFUNC_SET_DATA(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp));
+ DUK_HCOMPFUNC_SET_FUNCS(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp));
+ DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp));
+
+ /* Note: all references inside 'data' need to get their refcounts
+ * upped too. This is the case because refcounts are decreased
+ * through every function referencing 'data' independently.
+ */
+
+ DUK_HBUFFER_INCREF(thr, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos));
+ duk__inc_data_inner_refcounts(thr, fun_temp);
+
+ fun_clos->nregs = fun_temp->nregs;
+ fun_clos->nargs = fun_temp->nargs;
+#if defined(DUK_USE_DEBUGGER_SUPPORT)
+ fun_clos->start_line = fun_temp->start_line;
+ fun_clos->end_line = fun_temp->end_line;
+#endif
+
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) != NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) != NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) != NULL);
+
+ /* XXX: Could also copy from template, but there's no way to have any
+ * other value here now (used code has no access to the template).
+ * Prototype is set by duk_push_hcompfunc().
+ */
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+#if 0
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &fun_clos->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+#endif
+
+ /* Copy duk_hobject flags as is from the template using a mask.
+ * Leave out duk_heaphdr owned flags just in case (e.g. if there's
+ * some GC flag or similar). Some flags can then be adjusted
+ * separately if necessary.
+ */
+
+ /* DUK_HEAPHDR_SET_FLAGS() masks changes to non-duk_heaphdr flags only. */
+ DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) fun_clos, DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp));
+ DUK_DD(DUK_DDPRINT("fun_temp heaphdr flags: 0x%08lx, fun_clos heaphdr flags: 0x%08lx",
+ (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp),
+ (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_clos)));
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&fun_clos->obj));
+ DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&fun_clos->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&fun_clos->obj));
+ DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&fun_clos->obj));
+ /* DUK_HOBJECT_FLAG_ARRAY_PART: don't care */
+ /* DUK_HOBJECT_FLAG_NEWENV: handled below */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&fun_clos->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&fun_clos->obj));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&fun_clos->obj));
+
+ if (!DUK_HOBJECT_HAS_CONSTRUCTABLE(&fun_clos->obj)) {
+ /* If the template is not constructable don't add an automatic
+ * .prototype property. This is the case for e.g. ES2015 object
+ * literal getters/setters and method definitions.
+ */
+ add_auto_proto = 0;
+ }
+
+ /*
+ * Setup environment record properties based on the template and
+ * its flags.
+ *
+ * If DUK_HOBJECT_HAS_NEWENV(fun_temp) is true, the environment
+ * records represent identifiers "outside" the function; the
+ * "inner" environment records are created on demand. Otherwise,
+ * the environment records are those that will be directly used
+ * (e.g. for declarations).
+ *
+ * _Lexenv is always set; _Varenv defaults to _Lexenv if missing,
+ * so _Varenv is only set if _Lexenv != _Varenv.
+ *
+ * This is relatively complex, see doc/identifier-handling.rst.
+ */
+
+ if (DUK_HOBJECT_HAS_NEWENV(&fun_clos->obj)) {
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ if (DUK_HOBJECT_HAS_NAMEBINDING(&fun_clos->obj)) {
+ duk_hobject *proto;
+ duk_hdecenv *new_env;
+
+ /*
+ * Named function expression, name needs to be bound
+ * in an intermediate environment record. The "outer"
+ * lexical/variable environment will thus be:
+ *
+ * a) { funcname: <func>, __prototype: outer_lex_env }
+ * b) { funcname: <func>, __prototype: <globalenv> } (if outer_lex_env missing)
+ */
+
+ if (outer_lex_env) {
+ proto = outer_lex_env;
+ } else {
+ proto = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ }
+
+ /* -> [ ... closure template env ] */
+ new_env = duk_hdecenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
+ DUK_ASSERT(new_env != NULL);
+ duk_push_hobject(thr, (duk_hobject *) new_env);
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, proto);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, proto);
+
+ DUK_ASSERT(new_env->thread == NULL); /* Closed. */
+ DUK_ASSERT(new_env->varmap == NULL);
+
+ /* It's important that duk_xdef_prop() is a 'raw define' so that any
+ * properties in an ancestor are never an issue (they should never be
+ * e.g. non-writable, but just in case).
+ *
+ * Because template objects are not visible to user code, the case
+ * where .name is missing shouldn't happen in practice. It it does,
+ * the name 'undefined' gets bound and maps to the closure (which is
+ * a bit odd, but safe).
+ */
+ (void) duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME);
+ /* -> [ ... closure template env funcname ] */
+ duk_dup_m4(thr); /* -> [ ... closure template env funcname closure ] */
+ duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ ... closure template env ] */
+ /* env[funcname] = closure */
+
+ /* [ ... closure template env ] */
+
+ DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, (duk_hobject *) new_env);
+ DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, (duk_hobject *) new_env);
+ DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env);
+ DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env);
+ duk_pop_unsafe(thr);
+
+ /* [ ... closure template ] */
+ }
+ else
+#endif /* DUK_USE_FUNC_NAME_PROPERTY */
+ {
+ /*
+ * Other cases (function declaration, anonymous function expression,
+ * strict direct eval code). The "outer" environment will be whatever
+ * the caller gave us.
+ */
+
+ DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env);
+ DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_lex_env);
+ DUK_HOBJECT_INCREF(thr, outer_lex_env);
+ DUK_HOBJECT_INCREF(thr, outer_lex_env);
+
+ /* [ ... closure template ] */
+ }
+ } else {
+ /*
+ * Function gets no new environment when called. This is the
+ * case for global code, indirect eval code, and non-strict
+ * direct eval code. There is no direct correspondence to the
+ * E5 specification, as global/eval code is not exposed as a
+ * function.
+ */
+
+ DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj));
+
+ DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env);
+ DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_var_env);
+ DUK_HOBJECT_INCREF(thr, outer_lex_env); /* NULLs not allowed; asserted on entry */
+ DUK_HOBJECT_INCREF(thr, outer_var_env);
+ }
+ DUK_DDD(DUK_DDDPRINT("closure varenv -> %!ipO, lexenv -> %!ipO",
+ (duk_heaphdr *) fun_clos->var_env,
+ (duk_heaphdr *) fun_clos->lex_env));
+
+ /* Call handling assumes this for all callable closures. */
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_LEXENV(thr->heap, fun_clos) != NULL);
+ DUK_ASSERT(DUK_HCOMPFUNC_GET_VARENV(thr->heap, fun_clos) != NULL);
+
+ /*
+ * Copy some internal properties directly
+ *
+ * The properties will be non-writable and non-enumerable, but
+ * configurable.
+ */
+
+ /* [ ... closure template ] */
+
+ DUK_DDD(DUK_DDDPRINT("copying properties: closure=%!iT, template=%!iT",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ for (i = 0; i < (duk_small_uint_t) (sizeof(duk__closure_copy_proplist) / sizeof(duk_uint16_t)); i++) {
+ duk_small_int_t stridx = (duk_small_int_t) duk__closure_copy_proplist[i];
+ if (duk_get_prop_stridx_short(thr, -1, stridx)) {
+ /* [ ... closure template val ] */
+ DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> found", (long) stridx));
+ duk_xdef_prop_stridx_short(thr, -3, stridx, DUK_PROPDESC_FLAGS_C);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> not found", (long) stridx));
+ duk_pop_unsafe(thr);
+ }
+ }
+
+ /*
+ * "length" maps to number of formals (E5 Section 13.2) for function
+ * declarations/expressions (non-bound functions). Note that 'nargs'
+ * is NOT necessarily equal to the number of arguments. Use length
+ * of _Formals; if missing, assume nargs matches .length.
+ */
+
+ /* [ ... closure template ] */
+
+ /* XXX: these lookups should be just own property lookups instead of
+ * looking up the inheritance chain.
+ */
+ if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS)) {
+ /* [ ... closure template formals ] */
+ len_value = (duk_uint_t) duk_get_length(thr, -1); /* could access duk_harray directly, not important */
+ DUK_DD(DUK_DDPRINT("closure length from _Formals -> %ld", (long) len_value));
+ } else {
+ len_value = fun_temp->nargs;
+ DUK_DD(DUK_DDPRINT("closure length defaulted from nargs -> %ld", (long) len_value));
+ }
+ duk_pop_unsafe(thr);
+
+ duk_push_uint(thr, len_value); /* [ ... closure template len_value ] */
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);
+
+ /*
+ * "prototype" is, by default, a fresh object with the "constructor"
+ * property.
+ *
+ * Note that this creates a circular reference for every function
+ * instance (closure) which prevents refcount-based collection of
+ * function instances.
+ *
+ * XXX: Try to avoid creating the default prototype object, because
+ * many functions are not used as constructors and the default
+ * prototype is unnecessary. Perhaps it could be created on-demand
+ * when it is first accessed?
+ */
+
+ /* [ ... closure template ] */
+
+ if (add_auto_proto) {
+ duk_push_object(thr); /* -> [ ... closure template newobj ] */
+ duk_dup_m3(thr); /* -> [ ... closure template newobj closure ] */
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* -> [ ... closure template newobj ] */
+ duk_compact(thr, -1); /* compact the prototype */
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); /* -> [ ... closure template ] */
+ }
+
+ /*
+ * "arguments" and "caller" must be mapped to throwers for strict
+ * mode and bound functions (E5 Section 15.3.5).
+ *
+ * XXX: This is expensive to have for every strict function instance.
+ * Try to implement as virtual properties or on-demand created properties.
+ */
+
+ /* [ ... closure template ] */
+
+ if (DUK_HOBJECT_HAS_STRICT(&fun_clos->obj)) {
+ duk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_CALLER);
+ duk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_LC_ARGUMENTS);
+ } else {
+#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
+ DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property in use, add initial 'null' value"));
+ duk_push_null(thr);
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE);
+#else
+ DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property not used"));
+#endif
+ }
+
+ /*
+ * "name" used to be non-standard but is now defined by ES2015.
+ * In ES2015/ES2016 the .name property is configurable.
+ */
+
+ /* [ ... closure template ] */
+
+#if defined(DUK_USE_FUNC_NAME_PROPERTY)
+ /* XXX: Look for own property only; doesn't matter much because
+ * templates are bare objects.
+ */
+ if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME)) {
+ /* [ ... closure template name ] */
+ DUK_ASSERT(duk_is_string(thr, -1));
+ DUK_DD(DUK_DDPRINT("setting function instance name to %!T", duk_get_tval(thr, -1)));
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); /* -> [ ... closure template ] */
+ } else {
+ /* Anonymous functions don't have a .name in ES2015, so don't set
+ * it on the instance either. The instance will then inherit
+ * it from Function.prototype.name.
+ */
+ DUK_DD(DUK_DDPRINT("not setting function instance .name"));
+ duk_pop_unsafe(thr);
+ }
+#endif
+
+ /*
+ * Compact the closure, in most cases no properties will be added later.
+ * Also, without this the closures end up having unused property slots
+ * (e.g. in Duktape 0.9.0, 8 slots would be allocated and only 7 used).
+ * A better future solution would be to allocate the closure directly
+ * to correct size (and setup the properties directly without going
+ * through the API).
+ */
+
+ duk_compact(thr, -2);
+
+ /*
+ * Some assertions (E5 Section 13.2).
+ */
+
+ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(&fun_clos->obj) == DUK_HOBJECT_CLASS_FUNCTION);
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj));
+ DUK_ASSERT(duk_has_prop_stridx(thr, -2, DUK_STRIDX_LENGTH) != 0);
+ DUK_ASSERT(add_auto_proto == 0 || duk_has_prop_stridx(thr, -2, DUK_STRIDX_PROTOTYPE) != 0);
+ /* May be missing .name */
+ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) ||
+ duk_has_prop_stridx(thr, -2, DUK_STRIDX_CALLER) != 0);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) ||
+ duk_has_prop_stridx(thr, -2, DUK_STRIDX_LC_ARGUMENTS) != 0);
+
+ /*
+ * Finish
+ */
+
+ /* [ ... closure template ] */
+
+ DUK_DDD(DUK_DDDPRINT("created function instance: template=%!iT -> closure=%!iT",
+ (duk_tval *) duk_get_tval(thr, -1),
+ (duk_tval *) duk_get_tval(thr, -2)));
+
+ duk_pop_unsafe(thr);
+
+ /* [ ... closure ] */
+}
+
+/*
+ * Delayed activation environment record initialization (for functions
+ * with NEWENV).
+ *
+ * The non-delayed initialization is handled by duk_handle_call().
+ */
+
+/* shared helper */
+DUK_INTERNAL
+duk_hobject *duk_create_activation_environment_record(duk_hthread *thr,
+ duk_hobject *func,
+ duk_size_t bottom_byteoff) {
+ duk_hdecenv *env;
+ duk_hobject *parent;
+ duk_hcompfunc *f;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(func != NULL);
+
+ f = (duk_hcompfunc *) func;
+ parent = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f);
+ if (!parent) {
+ parent = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ }
+
+ env = duk_hdecenv_alloc(thr,
+ DUK_HOBJECT_FLAG_EXTENSIBLE |
+ DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));
+ DUK_ASSERT(env != NULL);
+ duk_push_hobject(thr, (duk_hobject *) env);
+
+ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL);
+ DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, parent);
+ DUK_HOBJECT_INCREF_ALLOWNULL(thr, parent); /* parent env is the prototype */
+
+ /* open scope information, for compiled functions only */
+
+ DUK_ASSERT(env->thread == NULL);
+ DUK_ASSERT(env->varmap == NULL);
+ DUK_ASSERT(env->regbase_byteoff == 0);
+ if (DUK_HOBJECT_IS_COMPFUNC(func)) {
+ duk_hobject *varmap;
+ duk_tval *tv;
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr));
+ if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) {
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));
+ varmap = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(varmap != NULL);
+ env->varmap = varmap;
+ DUK_HOBJECT_INCREF(thr, varmap);
+ env->thread = thr;
+ DUK_HTHREAD_INCREF(thr, thr);
+ env->regbase_byteoff = bottom_byteoff;
+ } else {
+ /* If function has no _Varmap, leave the environment closed. */
+ DUK_ASSERT(env->thread == NULL);
+ DUK_ASSERT(env->varmap == NULL);
+ DUK_ASSERT(env->regbase_byteoff == 0);
+ }
+ }
+
+ return (duk_hobject *) env;
+}
+
+DUK_INTERNAL
+void duk_js_init_activation_environment_records_delayed(duk_hthread *thr,
+ duk_activation *act) {
+ duk_hobject *func;
+ duk_hobject *env;
+
+ DUK_ASSERT(thr != NULL);
+ func = DUK_ACT_GET_FUNC(act);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound functions are never in act 'func' */
+
+ /*
+ * Delayed initialization only occurs for 'NEWENV' functions.
+ */
+
+ DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func));
+ DUK_ASSERT(act->lex_env == NULL);
+ DUK_ASSERT(act->var_env == NULL);
+
+ env = duk_create_activation_environment_record(thr, func, act->bottom_byteoff);
+ DUK_ASSERT(env != NULL);
+ /* 'act' is a stable pointer, so still OK. */
+
+ DUK_DDD(DUK_DDDPRINT("created delayed fresh env: %!ipO", (duk_heaphdr *) env));
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ {
+ duk_hobject *p = env;
+ while (p) {
+ DUK_DDD(DUK_DDDPRINT(" -> %!ipO", (duk_heaphdr *) p));
+ p = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, p);
+ }
+ }
+#endif
+
+ act->lex_env = env;
+ act->var_env = env;
+ DUK_HOBJECT_INCREF(thr, env); /* XXX: incref by count (here 2 times) */
+ DUK_HOBJECT_INCREF(thr, env);
+
+ duk_pop_unsafe(thr);
+}
+
+/*
+ * Closing environment records.
+ *
+ * The environment record MUST be closed with the thread where its activation
+ * is; i.e. if 'env' is open, 'thr' must match env->thread, and the regbase
+ * and varmap must still be valid. On entry, 'env' must be reachable.
+ */
+
+DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env) {
+ duk_uint_fast32_t i;
+ duk_hobject *varmap;
+ duk_hstring *key;
+ duk_tval *tv;
+ duk_uint_t regnum;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(env != NULL);
+
+ if (DUK_UNLIKELY(!DUK_HOBJECT_IS_DECENV(env))) {
+ DUK_DDD(DUK_DDDPRINT("env not a declarative record: %!iO", (duk_heaphdr *) env));
+ return;
+ }
+
+ varmap = ((duk_hdecenv *) env)->varmap;
+ if (varmap == NULL) {
+ DUK_DDD(DUK_DDDPRINT("env already closed: %!iO", (duk_heaphdr *) env));
+
+ return;
+ }
+ DUK_ASSERT(((duk_hdecenv *) env)->thread != NULL);
+ DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env);
+
+ DUK_DDD(DUK_DDDPRINT("closing env: %!iO", (duk_heaphdr *) env));
+ DUK_DDD(DUK_DDDPRINT("varmap: %!O", (duk_heaphdr *) varmap));
+
+ /* Env must be closed in the same thread as where it runs. */
+ DUK_ASSERT(((duk_hdecenv *) env)->thread == thr);
+
+ /* XXX: additional conditions when to close variables? we don't want to do it
+ * unless the environment may have "escaped" (referenced in a function closure).
+ * With delayed environments, the existence is probably good enough of a check.
+ */
+
+ /* Note: we rely on the _Varmap having a bunch of nice properties, like:
+ * - being compacted and unmodified during this process
+ * - not containing an array part
+ * - having correct value types
+ */
+
+ DUK_DDD(DUK_DDDPRINT("copying bound register values, %ld bound regs", (long) DUK_HOBJECT_GET_ENEXT(varmap)));
+
+ /* Copy over current variable values from value stack to the
+ * environment record. The scope object is empty but may
+ * inherit from another scope which has conflicting names.
+ */
+
+ /* XXX: Do this using a once allocated entry area, no side effects.
+ * Hash part would need special treatment however (maybe copy, and
+ * then realloc with hash part if large enough).
+ */
+ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(varmap); i++) {
+ duk_size_t regbase_byteoff;
+
+ key = DUK_HOBJECT_E_GET_KEY(thr->heap, varmap, i);
+ DUK_ASSERT(key != NULL); /* assume keys are compact in _Varmap */
+ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, varmap, i)); /* assume plain values */
+
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, varmap, i);
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ DUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX); /* limits */
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));
+ regnum = (duk_uint_t) DUK_TVAL_GET_FASTINT_U32(tv);
+#else
+ regnum = (duk_uint_t) DUK_TVAL_GET_NUMBER(tv);
+#endif
+
+ regbase_byteoff = ((duk_hdecenv *) env)->regbase_byteoff;
+ DUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum >= (duk_uint8_t *) thr->valstack);
+ DUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum < (duk_uint8_t *) thr->valstack_top);
+
+ /* If property already exists, overwrites silently.
+ * Property is writable, but not deletable (not configurable
+ * in terms of property attributes).
+ */
+ duk_push_tval(thr, (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum));
+ DUK_DDD(DUK_DDDPRINT("closing identifier %!O -> reg %ld, value %!T",
+ (duk_heaphdr *) key,
+ (long) regnum,
+ (duk_tval *) duk_get_tval(thr, -1)));
+ duk_hobject_define_property_internal(thr, env, key, DUK_PROPDESC_FLAGS_WE);
+ }
+
+ /* NULL atomically to avoid inconsistent state + side effects. */
+ DUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->thread);
+ DUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->varmap);
+ ((duk_hdecenv *) env)->thread = NULL;
+ ((duk_hdecenv *) env)->varmap = NULL;
+
+ DUK_DDD(DUK_DDDPRINT("env after closing: %!O", (duk_heaphdr *) env));
+}
+
+/*
+ * GETIDREF: a GetIdentifierReference-like helper.
+ *
+ * Provides a parent traversing lookup and a single level lookup
+ * (for HasBinding).
+ *
+ * Instead of returning the value, returns a bunch of values allowing
+ * the caller to read, write, or delete the binding. Value pointers
+ * are duk_tval pointers which can be mutated directly as long as
+ * refcounts are properly updated. Note that any operation which may
+ * reallocate valstacks or compact objects may invalidate the returned
+ * duk_tval (but not object) pointers, so caller must be very careful.
+ *
+ * If starting environment record 'env' is given, 'act' is ignored.
+ * However, if 'env' is NULL, the caller may identify, in 'act', an
+ * activation which hasn't had its declarative environment initialized
+ * yet. The activation registers are then looked up, and its parent
+ * traversed normally.
+ *
+ * The 'out' structure values are only valid if the function returns
+ * success (non-zero).
+ */
+
+/* lookup name from an open declarative record's registers */
+DUK_LOCAL
+duk_bool_t duk__getid_open_decl_env_regs(duk_hthread *thr,
+ duk_hstring *name,
+ duk_hdecenv *env,
+ duk__id_lookup_result *out) {
+ duk_tval *tv;
+ duk_size_t reg_rel;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(name != NULL);
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(out != NULL);
+
+ DUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) env));
+ DUK_ASSERT_HDECENV_VALID(env);
+
+ if (env->thread == NULL) {
+ /* already closed */
+ return 0;
+ }
+ DUK_ASSERT(env->varmap != NULL);
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, env->varmap, name);
+ if (DUK_UNLIKELY(tv == NULL)) {
+ return 0;
+ }
+
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ DUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX); /* limits */
+#if defined(DUK_USE_FASTINT)
+ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));
+ reg_rel = (duk_size_t) DUK_TVAL_GET_FASTINT_U32(tv);
+#else
+ reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv);
+#endif
+ DUK_ASSERT_DISABLE(reg_rel >= 0); /* unsigned */
+
+ tv = (duk_tval *) (void *) ((duk_uint8_t *) env->thread->valstack + env->regbase_byteoff + sizeof(duk_tval) * reg_rel);
+ DUK_ASSERT(tv >= env->thread->valstack && tv < env->thread->valstack_end); /* XXX: more accurate? */
+
+ out->value = tv;
+ out->attrs = DUK_PROPDESC_FLAGS_W; /* registers are mutable, non-deletable */
+ out->env = (duk_hobject *) env;
+ out->holder = NULL;
+ out->has_this = 0;
+ return 1;
+}
+
+/* lookup name from current activation record's functions' registers */
+DUK_LOCAL
+duk_bool_t duk__getid_activation_regs(duk_hthread *thr,
+ duk_hstring *name,
+ duk_activation *act,
+ duk__id_lookup_result *out) {
+ duk_tval *tv;
+ duk_hobject *func;
+ duk_hobject *varmap;
+ duk_size_t reg_rel;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(name != NULL);
+ DUK_ASSERT(act != NULL);
+ DUK_ASSERT(out != NULL);
+
+ func = DUK_ACT_GET_FUNC(act);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func));
+
+ if (!DUK_HOBJECT_IS_COMPFUNC(func)) {
+ return 0;
+ }
+
+ /* XXX: move varmap to duk_hcompfunc struct field. */
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr));
+ if (!tv) {
+ return 0;
+ }
+ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));
+ varmap = DUK_TVAL_GET_OBJECT(tv);
+ DUK_ASSERT(varmap != NULL);
+
+ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, varmap, name);
+ if (!tv) {
+ return 0;
+ }
+ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));
+ reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv);
+ DUK_ASSERT_DISABLE(reg_rel >= 0);
+ DUK_ASSERT(reg_rel < ((duk_hcompfunc *) func)->nregs);
+
+ tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff);
+ tv += reg_rel;
+
+ out->value = tv;
+ out->attrs = DUK_PROPDESC_FLAGS_W; /* registers are mutable, non-deletable */
+ out->env = NULL;
+ out->holder = NULL;
+ out->has_this = 0;
+ return 1;
+}
+
+DUK_LOCAL
+duk_bool_t duk__get_identifier_reference(duk_hthread *thr,
+ duk_hobject *env,
+ duk_hstring *name,
+ duk_activation *act,
+ duk_bool_t parents,
+ duk__id_lookup_result *out) {
+ duk_tval *tv;
+ duk_uint_t sanity;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(env != NULL || act != NULL);
+ DUK_ASSERT(name != NULL);
+ DUK_ASSERT(out != NULL);
+
+ DUK_ASSERT(!env || DUK_HOBJECT_IS_ENV(env));
+ DUK_ASSERT(!env || !DUK_HOBJECT_HAS_ARRAY_PART(env));
+
+ /*
+ * Conceptually, we look for the identifier binding by starting from
+ * 'env' and following to chain of environment records (represented
+ * by the prototype chain).
+ *
+ * If 'env' is NULL, the current activation does not yet have an
+ * allocated declarative environment record; this should be treated
+ * exactly as if the environment record existed but had no bindings
+ * other than register bindings.
+ *
+ * Note: we assume that with the DUK_HOBJECT_FLAG_NEWENV cleared
+ * the environment will always be initialized immediately; hence
+ * a NULL 'env' should only happen with the flag set. This is the
+ * case for: (1) function calls, and (2) strict, direct eval calls.
+ */
+
+ if (env == NULL && act != NULL) {
+ duk_hobject *func;
+ duk_hcompfunc *f;
+
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference: env is NULL, activation is non-NULL -> "
+ "delayed env case, look up activation regs first"));
+
+ /*
+ * Try registers
+ */
+
+ if (duk__getid_activation_regs(thr, name, act, out)) {
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: "
+ "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O "
+ "(found from register bindings when env=NULL)",
+ (duk_heaphdr *) name, (duk_tval *) out->value,
+ (long) out->attrs, (long) out->has_this,
+ (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));
+ return 1;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("not found in current activation regs"));
+
+ /*
+ * Not found in registers, proceed to the parent record.
+ * Here we need to determine what the parent would be,
+ * if 'env' was not NULL (i.e. same logic as when initializing
+ * the record).
+ *
+ * Note that environment initialization is only deferred when
+ * DUK_HOBJECT_HAS_NEWENV is set, and this only happens for:
+ * - Function code
+ * - Strict eval code
+ *
+ * We only need to check _Lexenv here; _Varenv exists only if it
+ * differs from _Lexenv (and thus _Lexenv will also be present).
+ */
+
+ if (!parents) {
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference failed, no parent traversal "
+ "(not found from register bindings when env=NULL)"));
+ goto fail_not_found;
+ }
+
+ func = DUK_ACT_GET_FUNC(act);
+ DUK_ASSERT(func != NULL);
+ DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func));
+ f = (duk_hcompfunc *) func;
+
+ env = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f);
+ if (!env) {
+ env = thr->builtins[DUK_BIDX_GLOBAL_ENV];
+ }
+
+ DUK_DDD(DUK_DDDPRINT("continue lookup from env: %!iO",
+ (duk_heaphdr *) env));
+ }
+
+ /*
+ * Prototype walking starting from 'env'.
+ *
+ * ('act' is not needed anywhere here.)
+ */
+
+ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;
+ while (env != NULL) {
+ duk_small_uint_t cl;
+ duk_uint_t attrs;
+
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference, name=%!O, considering env=%p -> %!iO",
+ (duk_heaphdr *) name,
+ (void *) env,
+ (duk_heaphdr *) env));
+
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_ENV(env));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env));
+
+ cl = DUK_HOBJECT_GET_CLASS_NUMBER(env);
+ DUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV || cl == DUK_HOBJECT_CLASS_DECENV);
+ if (cl == DUK_HOBJECT_CLASS_DECENV) {
+ /*
+ * Declarative environment record.
+ *
+ * Identifiers can never be stored in ancestors and are
+ * always plain values, so we can use an internal helper
+ * and access the value directly with an duk_tval ptr.
+ *
+ * A closed environment is only indicated by it missing
+ * the "book-keeping" properties required for accessing
+ * register-bound variables.
+ */
+
+ DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env);
+ if (duk__getid_open_decl_env_regs(thr, name, (duk_hdecenv *) env, out)) {
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: "
+ "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O "
+ "(declarative environment record, scope open, found in regs)",
+ (duk_heaphdr *) name, (duk_tval *) out->value,
+ (long) out->attrs, (long) out->has_this,
+ (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));
+ return 1;
+ }
+
+ tv = duk_hobject_find_existing_entry_tval_ptr_and_attrs(thr->heap, env, name, &attrs);
+ if (tv) {
+ out->value = tv;
+ out->attrs = attrs;
+ out->env = env;
+ out->holder = env;
+ out->has_this = 0;
+
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: "
+ "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O "
+ "(declarative environment record, found in properties)",
+ (duk_heaphdr *) name, (duk_tval *) out->value,
+ (long) out->attrs, (long) out->has_this,
+ (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));
+ return 1;
+ }
+ } else {
+ /*
+ * Object environment record.
+ *
+ * Binding (target) object is an external, uncontrolled object.
+ * Identifier may be bound in an ancestor property, and may be
+ * an accessor. Target can also be a Proxy which we must support
+ * here.
+ */
+
+ /* XXX: we could save space by using _Target OR _This. If _Target, assume
+ * this binding is undefined. If _This, assumes this binding is _This, and
+ * target is also _This. One property would then be enough.
+ */
+
+ duk_hobject *target;
+ duk_bool_t found;
+
+ DUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV);
+ DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env);
+
+ target = ((duk_hobjenv *) env)->target;
+ DUK_ASSERT(target != NULL);
+
+ /* Target may be a Proxy or property may be an accessor, so we must
+ * use an actual, Proxy-aware hasprop check here.
+ *
+ * out->holder is NOT set to the actual duk_hobject where the
+ * property is found, but rather the object binding target object.
+ */
+
+#if defined(DUK_USE_ES6_PROXY)
+ if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(target))) {
+ duk_tval tv_name;
+ duk_tval tv_target_tmp;
+
+ DUK_ASSERT(name != NULL);
+ DUK_TVAL_SET_STRING(&tv_name, name);
+ DUK_TVAL_SET_OBJECT(&tv_target_tmp, target);
+
+ found = duk_hobject_hasprop(thr, &tv_target_tmp, &tv_name);
+ } else
+#endif /* DUK_USE_ES6_PROXY */
+ {
+ /* XXX: duk_hobject_hasprop() would be correct for
+ * non-Proxy objects too, but it is about ~20-25%
+ * slower at present so separate code paths for
+ * Proxy and non-Proxy now.
+ */
+ found = duk_hobject_hasprop_raw(thr, target, name);
+ }
+
+ if (found) {
+ out->value = NULL; /* can't get value, may be accessor */
+ out->attrs = 0; /* irrelevant when out->value == NULL */
+ out->env = env;
+ out->holder = target;
+ out->has_this = ((duk_hobjenv *) env)->has_this;
+
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: "
+ "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O "
+ "(object environment record)",
+ (duk_heaphdr *) name, (duk_tval *) out->value,
+ (long) out->attrs, (long) out->has_this,
+ (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));
+ return 1;
+ }
+ }
+
+ if (!parents) {
+ DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference failed, no parent traversal "
+ "(not found from first traversed env)"));
+ goto fail_not_found;
+ }
+
+ if (DUK_UNLIKELY(sanity-- == 0)) {
+ DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);
+ }
+ env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env);
+ }
+
+ /*
+ * Not found (even in global object)
+ */
+
+ fail_not_found:
+ return 0;
+}
+
+/*
+ * HASVAR: check identifier binding from a given environment record
+ * without traversing its parents.
+ *
+ * This primitive is not exposed to user code as such, but is used
+ * internally for e.g. declaration binding instantiation.
+ *
+ * See E5 Sections:
+ * 10.2.1.1.1 HasBinding(N)
+ * 10.2.1.2.1 HasBinding(N)
+ *
+ * Note: strictness has no bearing on this check. Hence we don't take
+ * a 'strict' parameter.
+ */
+
+#if 0 /*unused*/
+DUK_INTERNAL
+duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr,
+ duk_hobject *env,
+ duk_hstring *name) {
+ duk__id_lookup_result ref;
+ duk_bool_t parents;
+
+ DUK_DDD(DUK_DDDPRINT("hasvar: thr=%p, env=%p, name=%!O "
+ "(env -> %!dO)",
+ (void *) thr, (void *) env, (duk_heaphdr *) name,
+ (duk_heaphdr *) env));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(name != NULL);
+
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env);
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);
+
+ DUK_ASSERT(DUK_HOBJECT_IS_ENV(env));
+ DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env));
+
+ /* lookup results is ignored */
+ parents = 0;
+ return duk__get_identifier_reference(thr, env, name, NULL, parents, &ref);
+}
+#endif
+
+/*
+ * GETVAR
+ *
+ * See E5 Sections:
+ * 11.1.2 Identifier Reference
+ * 10.3.1 Identifier Resolution
+ * 11.13.1 Simple Assignment [example of where the Reference is GetValue'd]
+ * 8.7.1 GetValue (V)
+ * 8.12.1 [[GetOwnProperty]] (P)
+ * 8.12.2 [[GetProperty]] (P)
+ * 8.12.3 [[Get]] (P)
+ *
+ * If 'throw' is true, always leaves two values on top of stack: [val this].
+ *
+ * If 'throw' is false, returns 0 if identifier cannot be resolved, and the
+ * stack will be unaffected in this case. If identifier is resolved, returns
+ * 1 and leaves [val this] on top of stack.
+ *
+ * Note: the 'strict' flag of a reference returned by GetIdentifierReference
+ * is ignored by GetValue. Hence we don't take a 'strict' parameter.
+ *
+ * The 'throw' flag is needed for implementing 'typeof' for an unreferenced
+ * identifier. An unreference identifier in other contexts generates a
+ * ReferenceError.
+ */
+
+DUK_LOCAL
+duk_bool_t duk__getvar_helper(duk_hthread *thr,
+ duk_hobject *env,
+ duk_activation *act,
+ duk_hstring *name,
+ duk_bool_t throw_flag) {
+ duk__id_lookup_result ref;
+ duk_tval tv_tmp_obj;
+ duk_tval tv_tmp_key;
+ duk_bool_t parents;
+
+ DUK_DDD(DUK_DDDPRINT("getvar: thr=%p, env=%p, act=%p, name=%!O "
+ "(env -> %!dO)",
+ (void *) thr, (void *) env, (void *) act,
+ (duk_heaphdr *) name, (duk_heaphdr *) env));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(name != NULL);
+ /* env and act may be NULL */
+
+ DUK_STATS_INC(thr->heap, stats_getvar_all);
+
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env);
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);
+
+ parents = 1; /* follow parent chain */
+ if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) {
+ if (ref.value) {
+ duk_push_tval(thr, ref.value);
+ duk_push_undefined(thr);
+ } else {
+ DUK_ASSERT(ref.holder != NULL);
+
+ /* ref.holder is safe across the getprop call (even
+ * with side effects) because 'env' is reachable and
+ * ref.holder is a direct heap pointer.
+ */
+
+ DUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder);
+ DUK_TVAL_SET_STRING(&tv_tmp_key, name);
+ (void) duk_hobject_getprop(thr, &tv_tmp_obj, &tv_tmp_key); /* [value] */
+
+ if (ref.has_this) {
+ duk_push_hobject(thr, ref.holder);
+ } else {
+ duk_push_undefined(thr);
+ }
+
+ /* [value this] */
+ }
+
+ return 1;
+ } else {
+ if (throw_flag) {
+ DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR,
+ "identifier '%s' undefined",
+ (const char *) DUK_HSTRING_GET_DATA(name));
+ }
+
+ return 0;
+ }
+}
+
+DUK_INTERNAL
+duk_bool_t duk_js_getvar_envrec(duk_hthread *thr,
+ duk_hobject *env,
+ duk_hstring *name,
+ duk_bool_t throw_flag) {
+ return duk__getvar_helper(thr, env, NULL, name, throw_flag);
+}
+
+DUK_INTERNAL
+duk_bool_t duk_js_getvar_activation(duk_hthread *thr,
+ duk_activation *act,
+ duk_hstring *name,
+ duk_bool_t throw_flag) {
+ DUK_ASSERT(act != NULL);
+ return duk__getvar_helper(thr, act->lex_env, act, name, throw_flag);
+}
+
+/*
+ * PUTVAR
+ *
+ * See E5 Sections:
+ * 11.1.2 Identifier Reference
+ * 10.3.1 Identifier Resolution
+ * 11.13.1 Simple Assignment [example of where the Reference is PutValue'd]
+ * 8.7.2 PutValue (V,W) [see especially step 3.b, undefined -> automatic global in non-strict mode]
+ * 8.12.4 [[CanPut]] (P)
+ * 8.12.5 [[Put]] (P)
+ *
+ * Note: may invalidate any valstack (or object) duk_tval pointers because
+ * putting a value may reallocate any object or any valstack. Caller beware.
+ */
+
+DUK_LOCAL
+void duk__putvar_helper(duk_hthread *thr,
+ duk_hobject *env,
+ duk_activation *act,
+ duk_hstring *name,
+ duk_tval *val,
+ duk_bool_t strict) {
+ duk__id_lookup_result ref;
+ duk_tval tv_tmp_obj;
+ duk_tval tv_tmp_key;
+ duk_bool_t parents;
+
+ DUK_STATS_INC(thr->heap, stats_putvar_all);
+
+ DUK_DDD(DUK_DDDPRINT("putvar: thr=%p, env=%p, act=%p, name=%!O, val=%p, strict=%ld "
+ "(env -> %!dO, val -> %!T)",
+ (void *) thr, (void *) env, (void *) act,
+ (duk_heaphdr *) name, (void *) val, (long) strict,
+ (duk_heaphdr *) env, (duk_tval *) val));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(name != NULL);
+ DUK_ASSERT(val != NULL);
+ /* env and act may be NULL */
+
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env);
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);
+ DUK_ASSERT_REFCOUNT_NONZERO_TVAL(val);
+
+ /*
+ * In strict mode E5 protects 'eval' and 'arguments' from being
+ * assigned to (or even declared anywhere). Attempt to do so
+ * should result in a compile time SyntaxError. See the internal
+ * design documentation for details.
+ *
+ * Thus, we should never come here, run-time, for strict code,
+ * and name 'eval' or 'arguments'.
+ */
+
+ DUK_ASSERT(!strict ||
+ (name != DUK_HTHREAD_STRING_EVAL(thr) &&
+ name != DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)));
+
+ /*
+ * Lookup variable and update in-place if found.
+ */
+
+ parents = 1; /* follow parent chain */
+
+ if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) {
+ if (ref.value && (ref.attrs & DUK_PROPDESC_FLAG_WRITABLE)) {
+ /* Update duk_tval in-place if pointer provided and the
+ * property is writable. If the property is not writable
+ * (immutable binding), use duk_hobject_putprop() which
+ * will respect mutability.
+ */
+ duk_tval *tv_val;
+
+ tv_val = ref.value;
+ DUK_ASSERT(tv_val != NULL);
+ DUK_TVAL_SET_TVAL_UPDREF(thr, tv_val, val); /* side effects */
+
+ /* ref.value invalidated here */
+ } else {
+ DUK_ASSERT(ref.holder != NULL);
+
+ DUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder);
+ DUK_TVAL_SET_STRING(&tv_tmp_key, name);
+ (void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, strict);
+
+ /* ref.value invalidated here */
+ }
+
+ return;
+ }
+
+ /*
+ * Not found: write to global object (non-strict) or ReferenceError
+ * (strict); see E5 Section 8.7.2, step 3.
+ */
+
+ if (strict) {
+ DUK_DDD(DUK_DDDPRINT("identifier binding not found, strict => reference error"));
+ DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR,
+ "identifier '%s' undefined",
+ (const char *) DUK_HSTRING_GET_DATA(name));
+ }
+
+ DUK_DDD(DUK_DDDPRINT("identifier binding not found, not strict => set to global"));
+
+ DUK_TVAL_SET_OBJECT(&tv_tmp_obj, thr->builtins[DUK_BIDX_GLOBAL]);
+ DUK_TVAL_SET_STRING(&tv_tmp_key, name);
+ (void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, 0); /* 0 = no throw */
+
+ /* NB: 'val' may be invalidated here because put_value may realloc valstack,
+ * caller beware.
+ */
+}
+
+DUK_INTERNAL
+void duk_js_putvar_envrec(duk_hthread *thr,
+ duk_hobject *env,
+ duk_hstring *name,
+ duk_tval *val,
+ duk_bool_t strict) {
+ duk__putvar_helper(thr, env, NULL, name, val, strict);
+}
+
+DUK_INTERNAL
+void duk_js_putvar_activation(duk_hthread *thr,
+ duk_activation *act,
+ duk_hstring *name,
+ duk_tval *val,
+ duk_bool_t strict) {
+ DUK_ASSERT(act != NULL);
+ duk__putvar_helper(thr, act->lex_env, act, name, val, strict);
+}
+
+/*
+ * DELVAR
+ *
+ * See E5 Sections:
+ * 11.4.1 The delete operator
+ * 10.2.1.1.5 DeleteBinding (N) [declarative environment record]
+ * 10.2.1.2.5 DeleteBinding (N) [object environment record]
+ *
+ * Variable bindings established inside eval() are deletable (configurable),
+ * other bindings are not, including variables declared in global level.
+ * Registers are always non-deletable, and the deletion of other bindings
+ * is controlled by the configurable flag.
+ *
+ * For strict mode code, the 'delete' operator should fail with a compile
+ * time SyntaxError if applied to identifiers. Hence, no strict mode
+ * run-time deletion of identifiers should ever happen. This function
+ * should never be called from strict mode code!
+ */
+
+DUK_LOCAL
+duk_bool_t duk__delvar_helper(duk_hthread *thr,
+ duk_hobject *env,
+ duk_activation *act,
+ duk_hstring *name) {
+ duk__id_lookup_result ref;
+ duk_bool_t parents;
+
+ DUK_DDD(DUK_DDDPRINT("delvar: thr=%p, env=%p, act=%p, name=%!O "
+ "(env -> %!dO)",
+ (void *) thr, (void *) env, (void *) act,
+ (duk_heaphdr *) name, (duk_heaphdr *) env));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(name != NULL);
+ /* env and act may be NULL */
+
+ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);
+
+ parents = 1; /* follow parent chain */
+
+ if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) {
+ if (ref.value && !(ref.attrs & DUK_PROPDESC_FLAG_CONFIGURABLE)) {
+ /* Identifier found in registers (always non-deletable)
+ * or declarative environment record and non-configurable.
+ */
+ return 0;
+ }
+ DUK_ASSERT(ref.holder != NULL);
+
+ return duk_hobject_delprop_raw(thr, ref.holder, name, 0);
+ }
+
+ /*
+ * Not found (even in global object).
+ *
+ * In non-strict mode this is a silent SUCCESS (!), see E5 Section 11.4.1,
+ * step 3.b. In strict mode this case is a compile time SyntaxError so
+ * we should not come here.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("identifier to be deleted not found: name=%!O "
+ "(treated as silent success)",
+ (duk_heaphdr *) name));
+ return 1;
+}
+
+#if 0 /*unused*/
+DUK_INTERNAL
+duk_bool_t duk_js_delvar_envrec(duk_hthread *thr,
+ duk_hobject *env,
+ duk_hstring *name) {
+ return duk__delvar_helper(thr, env, NULL, name);
+}
+#endif
+
+DUK_INTERNAL
+duk_bool_t duk_js_delvar_activation(duk_hthread *thr,
+ duk_activation *act,
+ duk_hstring *name) {
+ DUK_ASSERT(act != NULL);
+ return duk__delvar_helper(thr, act->lex_env, act, name);
+}
+
+/*
+ * DECLVAR
+ *
+ * See E5 Sections:
+ * 10.4.3 Entering Function Code
+ * 10.5 Declaration Binding Instantion
+ * 12.2 Variable Statement
+ * 11.1.2 Identifier Reference
+ * 10.3.1 Identifier Resolution
+ *
+ * Variable declaration behavior is mainly discussed in Section 10.5,
+ * and is not discussed in the execution semantics (Sections 11-13).
+ *
+ * Conceptually declarations happen when code (global, eval, function)
+ * is entered, before any user code is executed. In practice, register-
+ * bound identifiers are 'declared' automatically (by virtue of being
+ * allocated to registers with the initial value 'undefined'). Other
+ * identifiers are declared in the function prologue with this primitive.
+ *
+ * Since non-register bindings eventually back to an internal object's
+ * properties, the 'prop_flags' argument is used to specify binding
+ * type:
+ *
+ * - Immutable binding: set DUK_PROPDESC_FLAG_WRITABLE to false
+ * - Non-deletable binding: set DUK_PROPDESC_FLAG_CONFIGURABLE to false
+ * - The flag DUK_PROPDESC_FLAG_ENUMERABLE should be set, although it
+ * doesn't really matter for internal objects
+ *
+ * All bindings are non-deletable mutable bindings except:
+ *
+ * - Declarations in eval code (mutable, deletable)
+ * - 'arguments' binding in strict function code (immutable)
+ * - Function name binding of a function expression (immutable)
+ *
+ * Declarations may go to declarative environment records (always
+ * so for functions), but may also go to object environment records
+ * (e.g. global code). The global object environment has special
+ * behavior when re-declaring a function (but not a variable); see
+ * E5.1 specification, Section 10.5, step 5.e.
+ *
+ * Declarations always go to the 'top-most' environment record, i.e.
+ * we never check the record chain. It's not an error even if a
+ * property (even an immutable or non-deletable one) of the same name
+ * already exists.
+ *
+ * If a declared variable already exists, its value needs to be updated
+ * (if possible). Returns 1 if a PUTVAR needs to be done by the caller;
+ * otherwise returns 0.
+ */
+
+DUK_LOCAL
+duk_bool_t duk__declvar_helper(duk_hthread *thr,
+ duk_hobject *env,
+ duk_hstring *name,
+ duk_tval *val,
+ duk_small_uint_t prop_flags,
+ duk_bool_t is_func_decl) {
+ duk_hobject *holder;
+ duk_bool_t parents;
+ duk__id_lookup_result ref;
+ duk_tval *tv;
+
+ DUK_DDD(DUK_DDDPRINT("declvar: thr=%p, env=%p, name=%!O, val=%!T, prop_flags=0x%08lx, is_func_decl=%ld "
+ "(env -> %!iO)",
+ (void *) thr, (void *) env, (duk_heaphdr *) name,
+ (duk_tval *) val, (unsigned long) prop_flags,
+ (unsigned int) is_func_decl, (duk_heaphdr *) env));
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(name != NULL);
+ DUK_ASSERT(val != NULL);
+
+ /* Note: in strict mode the compiler should reject explicit
+ * declaration of 'eval' or 'arguments'. However, internal
+ * bytecode may declare 'arguments' in the function prologue.
+ * We don't bother checking (or asserting) for these now.
+ */
+
+ /* Note: val is a stable duk_tval pointer. The caller makes
+ * a value copy into its stack frame, so 'tv_val' is not subject
+ * to side effects here.
+ */
+
+ /*
+ * Check whether already declared.
+ *
+ * We need to check whether the binding exists in the environment
+ * without walking its parents. However, we still need to check
+ * register-bound identifiers and the prototype chain of an object
+ * environment target object.
+ */
+
+ parents = 0; /* just check 'env' */
+ if (duk__get_identifier_reference(thr, env, name, NULL, parents, &ref)) {
+ duk_int_t e_idx;
+ duk_int_t h_idx;
+ duk_small_uint_t flags;
+
+ /*
+ * Variable already declared, ignore re-declaration.
+ * The only exception is the updated behavior of E5.1 for
+ * global function declarations, E5.1 Section 10.5, step 5.e.
+ * This behavior does not apply to global variable declarations.
+ */
+
+ if (!(is_func_decl && env == thr->builtins[DUK_BIDX_GLOBAL_ENV])) {
+ DUK_DDD(DUK_DDDPRINT("re-declare a binding, ignoring"));
+ return 1; /* 1 -> needs a PUTVAR */
+ }
+
+ /*
+ * Special behavior in E5.1.
+ *
+ * Note that even though parents == 0, the conflicting property
+ * may be an inherited property (currently our global object's
+ * prototype is Object.prototype). Step 5.e first operates on
+ * the existing property (which is potentially in an ancestor)
+ * and then defines a new property in the global object (and
+ * never modifies the ancestor).
+ *
+ * Also note that this logic would become even more complicated
+ * if the conflicting property might be a virtual one. Object
+ * prototype has no virtual properties, though.
+ *
+ * XXX: this is now very awkward, rework.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("re-declare a function binding in global object, "
+ "updated E5.1 processing"));
+
+ DUK_ASSERT(ref.holder != NULL);
+ holder = ref.holder;
+
+ /* holder will be set to the target object, not the actual object
+ * where the property was found (see duk__get_identifier_reference()).
+ */
+ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(holder) == DUK_HOBJECT_CLASS_GLOBAL);
+ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(holder)); /* global object doesn't have array part */
+
+ /* XXX: use a helper for prototype traversal; no loop check here */
+ /* must be found: was found earlier, and cannot be inherited */
+ for (;;) {
+ DUK_ASSERT(holder != NULL);
+ if (duk_hobject_find_existing_entry(thr->heap, holder, name, &e_idx, &h_idx)) {
+ DUK_ASSERT(e_idx >= 0);
+ break;
+ }
+ /* SCANBUILD: NULL pointer dereference, doesn't actually trigger,
+ * asserted above.
+ */
+ holder = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, holder);
+ }
+ DUK_ASSERT(holder != NULL);
+ DUK_ASSERT(e_idx >= 0);
+ /* SCANBUILD: scan-build produces a NULL pointer dereference warning
+ * below; it never actually triggers because holder is actually never
+ * NULL.
+ */
+
+ /* ref.holder is global object, holder is the object with the
+ * conflicting property.
+ */
+
+ flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, holder, e_idx);
+ if (!(flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) {
+ if (flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ DUK_DDD(DUK_DDDPRINT("existing property is a non-configurable "
+ "accessor -> reject"));
+ goto fail_existing_attributes;
+ }
+ if (!((flags & DUK_PROPDESC_FLAG_WRITABLE) &&
+ (flags & DUK_PROPDESC_FLAG_ENUMERABLE))) {
+ DUK_DDD(DUK_DDDPRINT("existing property is a non-configurable "
+ "plain property which is not writable and "
+ "enumerable -> reject"));
+ goto fail_existing_attributes;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("existing property is not configurable but "
+ "is plain, enumerable, and writable -> "
+ "allow redeclaration"));
+ }
+
+ if (holder == ref.holder) {
+ /* XXX: if duk_hobject_define_property_internal() was updated
+ * to handle a pre-existing accessor property, this would be
+ * a simple call (like for the ancestor case).
+ */
+ DUK_DDD(DUK_DDDPRINT("redefine, offending property in global object itself"));
+
+ if (flags & DUK_PROPDESC_FLAG_ACCESSOR) {
+ duk_hobject *tmp;
+
+ tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, holder, e_idx);
+ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, holder, e_idx, NULL);
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);
+ DUK_UNREF(tmp);
+ tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, holder, e_idx);
+ DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, holder, e_idx, NULL);
+ DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);
+ DUK_UNREF(tmp);
+ } else {
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx);
+ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv);
+ }
+
+ /* Here val would be potentially invalid if we didn't make
+ * a value copy at the caller.
+ */
+
+ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx);
+ DUK_TVAL_SET_TVAL(tv, val);
+ DUK_TVAL_INCREF(thr, tv);
+ DUK_HOBJECT_E_SET_FLAGS(thr->heap, holder, e_idx, prop_flags);
+
+ DUK_DDD(DUK_DDDPRINT("updated global binding, final result: "
+ "value -> %!T, prop_flags=0x%08lx",
+ (duk_tval *) DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx),
+ (unsigned long) prop_flags));
+ } else {
+ DUK_DDD(DUK_DDDPRINT("redefine, offending property in ancestor"));
+
+ DUK_ASSERT(ref.holder == thr->builtins[DUK_BIDX_GLOBAL]);
+ duk_push_tval(thr, val);
+ duk_hobject_define_property_internal(thr, ref.holder, name, prop_flags);
+ }
+
+ return 0;
+ }
+
+ /*
+ * Not found (in registers or record objects). Declare
+ * to current variable environment.
+ */
+
+ /*
+ * Get holder object
+ */
+
+ if (DUK_HOBJECT_IS_DECENV(env)) {
+ DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env);
+ holder = env;
+ } else {
+ DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env);
+ holder = ((duk_hobjenv *) env)->target;
+ DUK_ASSERT(holder != NULL);
+ }
+
+ /*
+ * Define new property
+ *
+ * Note: this may fail if the holder is not extensible.
+ */
+
+ /* XXX: this is awkward as we use an internal method which doesn't handle
+ * extensibility etc correctly. Basically we'd want to do a [[DefineOwnProperty]]
+ * or Object.defineProperty() here.
+ */
+
+ if (!DUK_HOBJECT_HAS_EXTENSIBLE(holder)) {
+ goto fail_not_extensible;
+ }
+
+ duk_push_hobject(thr, holder);
+ duk_push_hstring(thr, name);
+ duk_push_tval(thr, val);
+ duk_xdef_prop(thr, -3, prop_flags); /* [holder name val] -> [holder] */
+ duk_pop_unsafe(thr);
+
+ return 0;
+
+ fail_existing_attributes:
+ fail_not_extensible:
+ DUK_ERROR_TYPE(thr, "declaration failed");
+ return 0;
+}
+
+DUK_INTERNAL
+duk_bool_t duk_js_declvar_activation(duk_hthread *thr,
+ duk_activation *act,
+ duk_hstring *name,
+ duk_tval *val,
+ duk_small_uint_t prop_flags,
+ duk_bool_t is_func_decl) {
+ duk_hobject *env;
+ duk_tval tv_val_copy;
+
+ DUK_ASSERT(act != NULL);
+
+ /*
+ * Make a value copy of the input val. This ensures that
+ * side effects cannot invalidate the pointer.
+ */
+
+ DUK_TVAL_SET_TVAL(&tv_val_copy, val);
+ val = &tv_val_copy;
+
+ /*
+ * Delayed env creation check
+ */
+
+ if (!act->var_env) {
+ DUK_ASSERT(act->lex_env == NULL);
+ duk_js_init_activation_environment_records_delayed(thr, act);
+ /* 'act' is a stable pointer, so still OK. */
+ }
+ DUK_ASSERT(act->lex_env != NULL);
+ DUK_ASSERT(act->var_env != NULL);
+
+ env = act->var_env;
+ DUK_ASSERT(env != NULL);
+ DUK_ASSERT(DUK_HOBJECT_IS_ENV(env));
+
+ return duk__declvar_helper(thr, env, name, val, prop_flags, is_func_decl);
+}
+#line 1 "duk_lexer.c"
+/*
+ * Lexer for source files, ToNumber() string conversions, RegExp expressions,
+ * and JSON.
+ *
+ * Provides a stream of Ecmascript tokens from an UTF-8/CESU-8 buffer. The
+ * caller can also rewind the token stream into a certain position which is
+ * needed by the compiler part for multi-pass scanning. Tokens are
+ * represented as duk_token structures, and contain line number information.
+ * Token types are identified with DUK_TOK_* defines.
+ *
+ * Characters are decoded into a fixed size lookup window consisting of
+ * decoded Unicode code points, with window positions past the end of the
+ * input filled with an invalid codepoint (-1). The tokenizer can thus
+ * perform multiple character lookups efficiently and with few sanity
+ * checks (such as access outside the end of the input), which keeps the
+ * tokenization code small at the cost of performance.
+ *
+ * Character data in tokens, such as identifier names and string literals,
+ * is encoded into CESU-8 format on-the-fly while parsing the token in
+ * question. The string data is made reachable to garbage collection by
+ * placing the token-related values in value stack entries allocated for
+ * this purpose by the caller. The characters exist in Unicode code point
+ * form only in the fixed size lookup window, which keeps character data
+ * expansion (of especially ASCII data) low.
+ *
+ * Token parsing supports the full range of Unicode characters as described
+ * in the E5 specification. Parsing has been optimized for ASCII characters
+ * because ordinary Ecmascript code consists almost entirely of ASCII
+ * characters. Matching of complex Unicode codepoint sets (such as in the
+ * IdentifierStart and IdentifierPart productions) is optimized for size,
+ * and is done using a linear scan of a bit-packed list of ranges. This is
+ * very slow, but should never be entered unless the source code actually
+ * contains Unicode characters.
+ *
+ * Ecmascript tokenization is partially context sensitive. First,
+ * additional future reserved words are recognized in strict mode (see E5
+ * Section 7.6.1.2). Second, a forward slash character ('/') can be
+ * recognized either as starting a RegExp literal or as a division operator,
+ * depending on context. The caller must provide necessary context flags
+ * when requesting a new token.
+ *
+ * Future work:
+ *
+ * * Make line number tracking optional, as it consumes space.
+ *
+ * * Add a feature flag for disabling UTF-8 decoding of input, as most
+ * source code is ASCII. Because of Unicode escapes written in ASCII,
+ * this does not allow Unicode support to be removed from e.g.
+ * duk_unicode_is_identifier_start() nor does it allow removal of CESU-8
+ * encoding of e.g. string literals.
+ *
+ * * Add a feature flag for disabling Unicode compliance of e.g. identifier
+ * names. This allows for a build more than a kilobyte smaller, because
+ * Unicode ranges needed by duk_unicode_is_identifier_start() and
+ * duk_unicode_is_identifier_part() can be dropped. String literals
+ * should still be allowed to contain escaped Unicode, so this still does
+ * not allow removal of CESU-8 encoding of e.g. string literals.
+ *
+ * * Character lookup tables for codepoints above BMP could be stripped.
+ *
+ * * Strictly speaking, E5 specification requires that source code consists
+ * of 16-bit code units, and if not, must be conceptually converted to
+ * that format first. The current lexer processes Unicode code points
+ * and allows characters outside the BMP. These should be converted to
+ * surrogate pairs while reading the source characters into the window,
+ * not after tokens have been formed (as is done now). However, the fix
+ * is not trivial because two characters are decoded from one codepoint.
+ *
+ * * Optimize for speed as well as size. Large if-else ladders are (at
+ * least potentially) slow.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Various defines and file specific helper macros
+ */
+
+#define DUK__MAX_RE_DECESC_DIGITS 9
+#define DUK__MAX_RE_QUANT_DIGITS 9 /* Does not allow e.g. 2**31-1, but one more would allow overflows of u32. */
+
+/* whether to use macros or helper function depends on call count */
+#define DUK__ISDIGIT(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_9)
+#define DUK__ISHEXDIGIT(x) duk__is_hex_digit((x))
+#define DUK__ISOCTDIGIT(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_7)
+#define DUK__ISDIGIT03(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_3)
+#define DUK__ISDIGIT47(x) ((x) >= DUK_ASC_4 && (x) <= DUK_ASC_7)
+
+/* lexer character window helpers */
+#define DUK__LOOKUP(lex_ctx,idx) ((lex_ctx)->window[(idx)].codepoint)
+#define DUK__ADVANCECHARS(lex_ctx,count) duk__advance_chars((lex_ctx), (count))
+#define DUK__ADVANCEBYTES(lex_ctx,count) duk__advance_bytes((lex_ctx), (count))
+#define DUK__INITBUFFER(lex_ctx) duk__initbuffer((lex_ctx))
+#define DUK__APPENDBUFFER(lex_ctx,x) duk__appendbuffer((lex_ctx), (duk_codepoint_t) (x))
+#define DUK__APPENDBUFFER_ASCII(lex_ctx,x) duk__appendbuffer_ascii((lex_ctx), (duk_codepoint_t) (x))
+
+/* lookup shorthands (note: assume context variable is named 'lex_ctx') */
+#define DUK__L0() DUK__LOOKUP(lex_ctx, 0)
+#define DUK__L1() DUK__LOOKUP(lex_ctx, 1)
+#define DUK__L2() DUK__LOOKUP(lex_ctx, 2)
+#define DUK__L3() DUK__LOOKUP(lex_ctx, 3)
+#define DUK__L4() DUK__LOOKUP(lex_ctx, 4)
+#define DUK__L5() DUK__LOOKUP(lex_ctx, 5)
+
+/* packed advance/token number macro used by multiple functions */
+#define DUK__ADVTOK(advbytes,tok) ((((advbytes) * sizeof(duk_lexer_codepoint)) << 8) + (tok))
+
+/*
+ * Advance lookup window by N characters, filling in new characters as
+ * necessary. After returning caller is guaranteed a character window of
+ * at least DUK_LEXER_WINDOW_SIZE characters.
+ *
+ * The main function duk__advance_bytes() is called at least once per every
+ * token so it has a major lexer/compiler performance impact. There are two
+ * variants for the main duk__advance_bytes() algorithm: a sliding window
+ * approach which is slightly faster at the cost of larger code footprint,
+ * and a simple copying one.
+ *
+ * Decoding directly from the source string would be another lexing option.
+ * But the lookup window based approach has the advantage of hiding the
+ * source string and its encoding effectively which gives more flexibility
+ * going forward to e.g. support chunked streaming of source from flash.
+ *
+ * Decodes UTF-8/CESU-8 leniently with support for code points from U+0000 to
+ * U+10FFFF, causing an error if the input is unparseable. Leniency means:
+ *
+ * * Unicode code point validation is intentionally not performed,
+ * except to check that the codepoint does not exceed 0x10ffff.
+ *
+ * * In particular, surrogate pairs are allowed and not combined, which
+ * allows source files to represent all SourceCharacters with CESU-8.
+ * Broken surrogate pairs are allowed, as Ecmascript does not mandate
+ * their validation.
+ *
+ * * Allow non-shortest UTF-8 encodings.
+ *
+ * Leniency here causes few security concerns because all character data is
+ * decoded into Unicode codepoints before lexer processing, and is then
+ * re-encoded into CESU-8. The source can be parsed as strict UTF-8 with
+ * a compiler option. However, Ecmascript source characters include -all-
+ * 16-bit unsigned integer codepoints, so leniency seems to be appropriate.
+ *
+ * Note that codepoints above the BMP are not strictly SourceCharacters,
+ * but the lexer still accepts them as such. Before ending up in a string
+ * or an identifier name, codepoints above BMP are converted into surrogate
+ * pairs and then CESU-8 encoded, resulting in 16-bit Unicode data as
+ * expected by Ecmascript.
+ *
+ * An alternative approach to dealing with invalid or partial sequences
+ * would be to skip them and replace them with e.g. the Unicode replacement
+ * character U+FFFD. This has limited utility because a replacement character
+ * will most likely cause a parse error, unless it occurs inside a string.
+ * Further, Ecmascript source is typically pure ASCII.
+ *
+ * See:
+ *
+ * http://en.wikipedia.org/wiki/UTF-8
+ * http://en.wikipedia.org/wiki/CESU-8
+ * http://tools.ietf.org/html/rfc3629
+ * http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences
+ *
+ * Future work:
+ *
+ * * Reject other invalid Unicode sequences (see Wikipedia entry for examples)
+ * in strict UTF-8 mode.
+ *
+ * * Size optimize. An attempt to use a 16-byte lookup table for the first
+ * byte resulted in a code increase though.
+ *
+ * * Is checking against maximum 0x10ffff really useful? 4-byte encoding
+ * imposes a certain limit anyway.
+ *
+ * * Support chunked streaming of source code. Can be implemented either
+ * by streaming chunks of bytes or chunks of codepoints.
+ */
+
+#if defined(DUK_USE_LEXER_SLIDING_WINDOW)
+DUK_LOCAL void duk__fill_lexer_buffer(duk_lexer_ctx *lex_ctx, duk_small_uint_t start_offset_bytes) {
+ duk_lexer_codepoint *cp, *cp_end;
+ duk_ucodepoint_t x;
+ duk_small_uint_t contlen;
+ const duk_uint8_t *p, *p_end;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ duk_ucodepoint_t mincp;
+#endif
+ duk_int_t input_line;
+
+ /* Use temporaries and update lex_ctx only when finished. */
+ input_line = lex_ctx->input_line;
+ p = lex_ctx->input + lex_ctx->input_offset;
+ p_end = lex_ctx->input + lex_ctx->input_length;
+
+ cp = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->buffer + start_offset_bytes);
+ cp_end = lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE;
+
+ for (; cp != cp_end; cp++) {
+ cp->offset = (duk_size_t) (p - lex_ctx->input);
+ cp->line = input_line;
+
+ /* XXX: potential issue with signed pointers, p_end < p. */
+ if (DUK_UNLIKELY(p >= p_end)) {
+ /* If input_offset were assigned a negative value, it would
+ * result in a large positive value. Most likely it would be
+ * larger than input_length and be caught here. In any case
+ * no memory unsafe behavior would happen.
+ */
+ cp->codepoint = -1;
+ continue;
+ }
+
+ x = (duk_ucodepoint_t) (*p++);
+
+ /* Fast path. */
+
+ if (DUK_LIKELY(x < 0x80UL)) {
+ DUK_ASSERT(x != 0x2028UL && x != 0x2029UL); /* not LS/PS */
+ if (DUK_UNLIKELY(x <= 0x000dUL)) {
+ if ((x == 0x000aUL) ||
+ ((x == 0x000dUL) && (p >= p_end || *p != 0x000aUL))) {
+ /* lookup for 0x000a above assumes shortest encoding now */
+
+ /* E5 Section 7.3, treat the following as newlines:
+ * LF
+ * CR [not followed by LF]
+ * LS
+ * PS
+ *
+ * For CR LF, CR is ignored if it is followed by LF, and the LF will bump
+ * the line number.
+ */
+ input_line++;
+ }
+ }
+
+ cp->codepoint = (duk_codepoint_t) x;
+ continue;
+ }
+
+ /* Slow path. */
+
+ if (x < 0xc0UL) {
+ /* 10xx xxxx -> invalid */
+ goto error_encoding;
+ } else if (x < 0xe0UL) {
+ /* 110x xxxx 10xx xxxx */
+ contlen = 1;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ mincp = 0x80UL;
+#endif
+ x = x & 0x1fUL;
+ } else if (x < 0xf0UL) {
+ /* 1110 xxxx 10xx xxxx 10xx xxxx */
+ contlen = 2;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ mincp = 0x800UL;
+#endif
+ x = x & 0x0fUL;
+ } else if (x < 0xf8UL) {
+ /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx */
+ contlen = 3;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ mincp = 0x10000UL;
+#endif
+ x = x & 0x07UL;
+ } else {
+ /* no point in supporting encodings of 5 or more bytes */
+ goto error_encoding;
+ }
+
+ DUK_ASSERT(p_end >= p);
+ if ((duk_size_t) contlen > (duk_size_t) (p_end - p)) {
+ goto error_clipped;
+ }
+
+ while (contlen > 0) {
+ duk_small_uint_t y;
+ y = *p++;
+ if ((y & 0xc0U) != 0x80U) {
+ /* check that byte has the form 10xx xxxx */
+ goto error_encoding;
+ }
+ x = x << 6;
+ x += y & 0x3fUL;
+ contlen--;
+ }
+
+ /* check final character validity */
+
+ if (x > 0x10ffffUL) {
+ goto error_encoding;
+ }
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ if (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) {
+ goto error_encoding;
+ }
+#endif
+
+ DUK_ASSERT(x != 0x000aUL && x != 0x000dUL);
+ if ((x == 0x2028UL) || (x == 0x2029UL)) {
+ input_line++;
+ }
+
+ cp->codepoint = (duk_codepoint_t) x;
+ }
+
+ lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input);
+ lex_ctx->input_line = input_line;
+ return;
+
+ error_clipped: /* clipped codepoint */
+ error_encoding: /* invalid codepoint encoding or codepoint */
+ lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input);
+ lex_ctx->input_line = input_line;
+
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED);
+}
+
+DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) {
+ duk_small_uint_t used_bytes, avail_bytes;
+
+ DUK_ASSERT_DISABLE(count_bytes >= 0); /* unsigned */
+ DUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)));
+ DUK_ASSERT(lex_ctx->window >= lex_ctx->buffer);
+ DUK_ASSERT(lex_ctx->window < lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE);
+ DUK_ASSERT((duk_uint8_t *) lex_ctx->window + count_bytes <= (duk_uint8_t *) lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint));
+
+ /* Zero 'count' is also allowed to make call sites easier.
+ * Arithmetic in bytes generates better code in GCC.
+ */
+
+ lex_ctx->window = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->window + count_bytes); /* avoid multiply */
+ used_bytes = (duk_small_uint_t) ((duk_uint8_t *) lex_ctx->window - (duk_uint8_t *) lex_ctx->buffer);
+ avail_bytes = DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint) - used_bytes;
+ if (avail_bytes < (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))) {
+ /* Not enough data to provide a full window, so "scroll" window to
+ * start of buffer and fill up the rest.
+ */
+ DUK_MEMMOVE((void *) lex_ctx->buffer,
+ (const void *) lex_ctx->window,
+ (size_t) avail_bytes);
+ lex_ctx->window = lex_ctx->buffer;
+ duk__fill_lexer_buffer(lex_ctx, avail_bytes);
+ }
+}
+
+DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) {
+ lex_ctx->window = lex_ctx->buffer;
+ duk__fill_lexer_buffer(lex_ctx, 0);
+}
+#else /* DUK_USE_LEXER_SLIDING_WINDOW */
+DUK_LOCAL duk_codepoint_t duk__read_char(duk_lexer_ctx *lex_ctx) {
+ duk_ucodepoint_t x;
+ duk_small_uint_t len;
+ duk_small_uint_t i;
+ const duk_uint8_t *p;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ duk_ucodepoint_t mincp;
+#endif
+ duk_size_t input_offset;
+
+ input_offset = lex_ctx->input_offset;
+ if (DUK_UNLIKELY(input_offset >= lex_ctx->input_length)) {
+ /* If input_offset were assigned a negative value, it would
+ * result in a large positive value. Most likely it would be
+ * larger than input_length and be caught here. In any case
+ * no memory unsafe behavior would happen.
+ */
+ return -1;
+ }
+
+ p = lex_ctx->input + input_offset;
+ x = (duk_ucodepoint_t) (*p);
+
+ if (DUK_LIKELY(x < 0x80UL)) {
+ /* 0xxx xxxx -> fast path */
+
+ /* input offset tracking */
+ lex_ctx->input_offset++;
+
+ DUK_ASSERT(x != 0x2028UL && x != 0x2029UL); /* not LS/PS */
+ if (DUK_UNLIKELY(x <= 0x000dUL)) {
+ if ((x == 0x000aUL) ||
+ ((x == 0x000dUL) && (lex_ctx->input_offset >= lex_ctx->input_length ||
+ lex_ctx->input[lex_ctx->input_offset] != 0x000aUL))) {
+ /* lookup for 0x000a above assumes shortest encoding now */
+
+ /* E5 Section 7.3, treat the following as newlines:
+ * LF
+ * CR [not followed by LF]
+ * LS
+ * PS
+ *
+ * For CR LF, CR is ignored if it is followed by LF, and the LF will bump
+ * the line number.
+ */
+ lex_ctx->input_line++;
+ }
+ }
+
+ return (duk_codepoint_t) x;
+ }
+
+ /* Slow path. */
+
+ if (x < 0xc0UL) {
+ /* 10xx xxxx -> invalid */
+ goto error_encoding;
+ } else if (x < 0xe0UL) {
+ /* 110x xxxx 10xx xxxx */
+ len = 2;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ mincp = 0x80UL;
+#endif
+ x = x & 0x1fUL;
+ } else if (x < 0xf0UL) {
+ /* 1110 xxxx 10xx xxxx 10xx xxxx */
+ len = 3;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ mincp = 0x800UL;
+#endif
+ x = x & 0x0fUL;
+ } else if (x < 0xf8UL) {
+ /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx */
+ len = 4;
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ mincp = 0x10000UL;
+#endif
+ x = x & 0x07UL;
+ } else {
+ /* no point in supporting encodings of 5 or more bytes */
+ goto error_encoding;
+ }
+
+ DUK_ASSERT(lex_ctx->input_length >= lex_ctx->input_offset);
+ if ((duk_size_t) len > (duk_size_t) (lex_ctx->input_length - lex_ctx->input_offset)) {
+ goto error_clipped;
+ }
+
+ p++;
+ for (i = 1; i < len; i++) {
+ duk_small_uint_t y;
+ y = *p++;
+ if ((y & 0xc0U) != 0x80U) {
+ /* check that byte has the form 10xx xxxx */
+ goto error_encoding;
+ }
+ x = x << 6;
+ x += y & 0x3fUL;
+ }
+
+ /* check final character validity */
+
+ if (x > 0x10ffffUL) {
+ goto error_encoding;
+ }
+#if defined(DUK_USE_STRICT_UTF8_SOURCE)
+ if (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) {
+ goto error_encoding;
+ }
+#endif
+
+ /* input offset tracking */
+ lex_ctx->input_offset += len;
+
+ /* line tracking */
+ DUK_ASSERT(x != 0x000aUL && x != 0x000dUL);
+ if ((x == 0x2028UL) || (x == 0x2029UL)) {
+ lex_ctx->input_line++;
+ }
+
+ return (duk_codepoint_t) x;
+
+ error_clipped: /* clipped codepoint */
+ error_encoding: /* invalid codepoint encoding or codepoint */
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED);
+ return 0;
+}
+
+DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) {
+ duk_small_uint_t keep_bytes;
+ duk_lexer_codepoint *cp, *cp_end;
+
+ DUK_ASSERT_DISABLE(count_bytes >= 0); /* unsigned */
+ DUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)));
+
+ /* Zero 'count' is also allowed to make call sites easier. */
+
+ keep_bytes = DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint) - count_bytes;
+ DUK_MEMMOVE((void *) lex_ctx->window,
+ (const void *) ((duk_uint8_t *) lex_ctx->window + count_bytes),
+ (size_t) keep_bytes);
+
+ cp = (duk_lexer_codepoint *) ((duk_uint8_t *) lex_ctx->window + keep_bytes);
+ cp_end = lex_ctx->window + DUK_LEXER_WINDOW_SIZE;
+ for (; cp != cp_end; cp++) {
+ cp->offset = lex_ctx->input_offset;
+ cp->line = lex_ctx->input_line;
+ cp->codepoint = duk__read_char(lex_ctx);
+ }
+}
+
+DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) {
+ /* Call with count == DUK_LEXER_WINDOW_SIZE to fill buffer initially. */
+ duk__advance_bytes(lex_ctx, DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)); /* fill window */
+}
+#endif /* DUK_USE_LEXER_SLIDING_WINDOW */
+
+DUK_LOCAL void duk__advance_chars(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_chars) {
+ duk__advance_bytes(lex_ctx, count_chars * sizeof(duk_lexer_codepoint));
+}
+
+/*
+ * (Re)initialize the temporary byte buffer. May be called extra times
+ * with little impact.
+ */
+
+DUK_LOCAL void duk__initbuffer(duk_lexer_ctx *lex_ctx) {
+ /* Reuse buffer as is unless buffer has grown large. */
+ if (DUK_HBUFFER_DYNAMIC_GET_SIZE(lex_ctx->buf) < DUK_LEXER_TEMP_BUF_LIMIT) {
+ /* Keep current size */
+ } else {
+ duk_hbuffer_resize(lex_ctx->thr, lex_ctx->buf, DUK_LEXER_TEMP_BUF_LIMIT);
+ }
+
+ DUK_BW_INIT_WITHBUF(lex_ctx->thr, &lex_ctx->bw, lex_ctx->buf);
+}
+
+/*
+ * Append a Unicode codepoint to the temporary byte buffer. Performs
+ * CESU-8 surrogate pair encoding for codepoints above the BMP.
+ * Existing surrogate pairs are allowed and also encoded into CESU-8.
+ */
+
+DUK_LOCAL void duk__appendbuffer(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) {
+ /*
+ * Since character data is only generated by decoding the source or by
+ * the compiler itself, we rely on the input codepoints being correct
+ * and avoid a check here.
+ *
+ * Character data can also come here through decoding of Unicode
+ * escapes ("\udead\ubeef") so all 16-but unsigned values can be
+ * present, even when the source file itself is strict UTF-8.
+ */
+ DUK_ASSERT(x >= 0 && x <= 0x10ffffL);
+
+ DUK_BW_WRITE_ENSURE_CESU8(lex_ctx->thr, &lex_ctx->bw, (duk_ucodepoint_t) x);
+}
+
+DUK_LOCAL void duk__appendbuffer_ascii(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) {
+ /* ASCII characters can be emitted as a single byte without encoding
+ * which matters for some fast paths.
+ */
+ DUK_ASSERT(x >= 0 && x <= 0x7f);
+
+ DUK_BW_WRITE_ENSURE_U8(lex_ctx->thr, &lex_ctx->bw, (duk_uint8_t) x);
+}
+
+/*
+ * Intern the temporary byte buffer into a valstack slot
+ * (in practice, slot1 or slot2).
+ */
+
+DUK_LOCAL duk_hstring *duk__internbuffer(duk_lexer_ctx *lex_ctx, duk_idx_t valstack_idx) {
+ DUK_ASSERT(valstack_idx == lex_ctx->slot1_idx || valstack_idx == lex_ctx->slot2_idx);
+
+ DUK_BW_PUSH_AS_STRING(lex_ctx->thr, &lex_ctx->bw);
+ duk_replace(lex_ctx->thr, valstack_idx);
+ return duk_known_hstring(lex_ctx->thr, valstack_idx);
+}
+
+/*
+ * Init lexer context
+ */
+
+DUK_INTERNAL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx) {
+ DUK_ASSERT(lex_ctx != NULL);
+
+ DUK_MEMZERO(lex_ctx, sizeof(*lex_ctx));
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+#if defined(DUK_USE_LEXER_SLIDING_WINDOW)
+ lex_ctx->window = NULL;
+#endif
+ lex_ctx->thr = NULL;
+ lex_ctx->input = NULL;
+ lex_ctx->buf = NULL;
+#endif
+}
+
+/*
+ * Set lexer input position and reinitialize lookup window.
+ */
+
+DUK_INTERNAL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) {
+ pt->offset = lex_ctx->window[0].offset;
+ pt->line = lex_ctx->window[0].line;
+}
+
+DUK_INTERNAL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) {
+ DUK_ASSERT_DISABLE(pt->offset >= 0); /* unsigned */
+ DUK_ASSERT(pt->line >= 1);
+ lex_ctx->input_offset = pt->offset;
+ lex_ctx->input_line = pt->line;
+ duk__init_lexer_window(lex_ctx);
+}
+
+/*
+ * Lexing helpers
+ */
+
+/* Numeric value of a hex digit (also covers octal and decimal digits) or
+ * -1 if not a valid hex digit.
+ */
+DUK_LOCAL duk_codepoint_t duk__hexval_validate(duk_codepoint_t x) {
+ duk_small_int_t t;
+
+ /* Here 'x' is a Unicode codepoint */
+ if (DUK_LIKELY(x >= 0 && x <= 0xff)) {
+ t = duk_hex_dectab[x];
+ if (DUK_LIKELY(t >= 0)) {
+ return t;
+ }
+ }
+
+ return -1;
+}
+
+/* Just a wrapper for call sites where 'x' is known to be valid so
+ * we assert for it before decoding.
+ */
+DUK_LOCAL duk_codepoint_t duk__hexval(duk_codepoint_t x) {
+ duk_codepoint_t ret;
+
+ DUK_ASSERT((x >= DUK_ASC_0 && x <= DUK_ASC_9) ||
+ (x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_F) ||
+ (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_F));
+ ret = duk__hexval_validate(x);
+ DUK_ASSERT(ret >= 0 && ret <= 15);
+ return ret;
+}
+
+/* having this as a separate function provided a size benefit */
+DUK_LOCAL duk_bool_t duk__is_hex_digit(duk_codepoint_t x) {
+ if (DUK_LIKELY(x >= 0 && x <= 0xff)) {
+ return (duk_hex_dectab[x] >= 0);
+ }
+ return 0;
+}
+
+/* Parse a Unicode escape of the form \xHH, \uHHHH, or \u{H+}. Shared by
+ * source and RegExp parsing.
+ */
+DUK_LOCAL duk_codepoint_t duk__lexer_parse_escape(duk_lexer_ctx *lex_ctx, duk_bool_t allow_es6) {
+ duk_small_int_t digits; /* Initial value 2 or 4 for fixed length escapes, 0 for ES2015 \u{H+}. */
+ duk_codepoint_t escval;
+ duk_codepoint_t x;
+ duk_small_uint_t adv;
+
+ DUK_ASSERT(DUK__L0() == DUK_ASC_BACKSLASH); /* caller responsibilities */
+ DUK_ASSERT(DUK__L1() == DUK_ASC_LC_X || DUK__L1() == DUK_ASC_LC_U);
+ DUK_UNREF(allow_es6);
+
+ adv = 2;
+ digits = 2;
+ if (DUK__L1() == DUK_ASC_LC_U) {
+ digits = 4;
+#if defined(DUK_USE_ES6_UNICODE_ESCAPE)
+ if (DUK__L2() == DUK_ASC_LCURLY && allow_es6) {
+ digits = 0;
+ adv = 3;
+ }
+#endif
+ }
+ DUK__ADVANCECHARS(lex_ctx, adv);
+
+ escval = 0;
+ for (;;) {
+ /* One of the escape forms: \xHH, \uHHHH, \u{H+}.
+ * The 'digits' variable tracks parsing state and is
+ * initialized to:
+ *
+ * \xHH 2
+ * \uHH 4
+ * \u{H+} 0 first time, updated to -1 to indicate
+ * at least one digit has been parsed
+ *
+ * Octal parsing is handled separately because it can be
+ * done with fixed lookahead and also has validation
+ * rules which depend on the escape length (which is
+ * variable).
+ *
+ * We don't need a specific check for x < 0 (end of
+ * input) or duk_unicode_is_line_terminator(x)
+ * because the 'dig' decode will fail and lead to a
+ * SyntaxError.
+ */
+ duk_codepoint_t dig;
+
+ x = DUK__L0();
+ DUK__ADVANCECHARS(lex_ctx, 1);
+
+ dig = duk__hexval_validate(x);
+ if (digits > 0) {
+ digits--;
+ if (dig < 0) {
+ goto fail_escape;
+ }
+ DUK_ASSERT(dig >= 0x00 && dig <= 0x0f);
+ escval = (escval << 4) + dig;
+ if (digits == 0) {
+ DUK_ASSERT(escval >= 0 && escval <= 0xffffL);
+ break;
+ }
+ } else {
+#if defined(DUK_USE_ES6_UNICODE_ESCAPE)
+ DUK_ASSERT(digits == 0 /* first time */ || digits == -1 /* others */);
+ if (dig >= 0) {
+ DUK_ASSERT(dig >= 0x00 && dig <= 0x0f);
+ escval = (escval << 4) + dig;
+ if (escval > 0x10ffffL) {
+ goto fail_escape;
+ }
+ } else if (x == DUK_ASC_RCURLY) {
+ if (digits == 0) {
+ /* Empty escape, \u{}. */
+ goto fail_escape;
+ }
+ DUK_ASSERT(escval >= 0 && escval <= 0x10ffffL);
+ break;
+ } else {
+ goto fail_escape;
+ }
+ digits = -1; /* Indicate we have at least one digit. */
+#else /* DUK_USE_ES6_UNICODE_ESCAPE */
+ DUK_ASSERT(0); /* Never happens if \u{H+} support disabled. */
+#endif /* DUK_USE_ES6_UNICODE_ESCAPE */
+ }
+ }
+
+ return escval;
+
+ fail_escape:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE);
+}
+
+/* Parse legacy octal escape of the form \N{1,3}, e.g. \0, \5, \0377. Maximum
+ * allowed value is \0377 (U+00FF), longest match is used. Used for both string
+ * RegExp octal escape parsing. Window[0] must be the slash '\' and the first
+ * digit must already be validated to be in [0-9] by the caller.
+ */
+DUK_LOCAL duk_codepoint_t duk__lexer_parse_legacy_octal(duk_lexer_ctx *lex_ctx, duk_small_uint_t *out_adv, duk_bool_t reject_annex_b) {
+ duk_codepoint_t cp;
+ duk_small_uint_t lookup_idx;
+ duk_small_uint_t adv;
+ duk_codepoint_t tmp;
+
+ DUK_ASSERT(out_adv != NULL);
+ DUK_ASSERT(DUK__LOOKUP(lex_ctx, 0) == DUK_ASC_BACKSLASH);
+ DUK_ASSERT(DUK__LOOKUP(lex_ctx, 1) >= DUK_ASC_0 && DUK__LOOKUP(lex_ctx, 1) <= DUK_ASC_9);
+
+ cp = 0;
+ tmp = 0;
+ for (lookup_idx = 1; lookup_idx <= 3; lookup_idx++) {
+ DUK_DDD(DUK_DDDPRINT("lookup_idx=%ld, cp=%ld", (long) lookup_idx, (long) cp));
+ tmp = DUK__LOOKUP(lex_ctx, lookup_idx);
+ if (tmp < DUK_ASC_0 || tmp > DUK_ASC_7) {
+ /* No more valid digits. */
+ break;
+ }
+ tmp = (cp << 3) + (tmp - DUK_ASC_0);
+ if (tmp > 0xff) {
+ /* Three digit octal escapes above \377 (= 0xff)
+ * are not allowed.
+ */
+ break;
+ }
+ cp = tmp;
+ }
+ DUK_DDD(DUK_DDDPRINT("final lookup_idx=%ld, cp=%ld", (long) lookup_idx, (long) cp));
+
+ adv = lookup_idx;
+ if (lookup_idx == 1) {
+ DUK_DDD(DUK_DDDPRINT("\\8 or \\9 -> treat as literal, accept in strict mode too"));
+ DUK_ASSERT(tmp == DUK_ASC_8 || tmp == DUK_ASC_9);
+ cp = tmp;
+ adv++; /* correction to above, eat offending character */
+ } else if (lookup_idx == 2 && cp == 0) {
+ /* Note: 'foo\0bar' is OK in strict mode, but 'foo\00bar' is not.
+ * It won't be interpreted as 'foo\u{0}0bar' but as a SyntaxError.
+ */
+ DUK_DDD(DUK_DDDPRINT("\\0 -> accept in strict mode too"));
+ } else {
+ /* This clause also handles non-shortest zero, e.g. \00. */
+ if (reject_annex_b) {
+ DUK_DDD(DUK_DDDPRINT("non-zero octal literal %ld -> reject in strict-mode", (long) cp));
+ cp = -1;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("non-zero octal literal %ld -> accepted", (long) cp));
+ DUK_ASSERT(cp >= 0 && cp <= 0xff);
+ }
+ }
+
+ *out_adv = adv;
+
+ DUK_ASSERT((cp >= 0 && cp <= 0xff) || (cp == -1 && reject_annex_b));
+ return cp;
+}
+
+/* XXX: move strict mode to lex_ctx? */
+DUK_LOCAL void duk__lexer_parse_string_literal(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_small_int_t quote, duk_bool_t strict_mode) {
+ duk_small_uint_t adv;
+
+ for (adv = 1 /* initial quote */ ;;) {
+ duk_codepoint_t x;
+
+ DUK__ADVANCECHARS(lex_ctx, adv); /* eat opening quote on first loop */
+ x = DUK__L0();
+
+ adv = 1;
+ if (x == quote) {
+ DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing quote */
+ break;
+ } else if (x == '\\') {
+ /* DUK__L0 -> '\' char
+ * DUK__L1 ... DUK__L5 -> more lookup
+ */
+ duk_small_int_t emitcp = -1;
+
+ x = DUK__L1();
+
+ /* How much to advance before next loop. */
+ adv = 2; /* note: long live range */
+
+ switch (x) {
+ case '\'':
+ emitcp = 0x0027;
+ break;
+ case '"':
+ emitcp = 0x0022;
+ break;
+ case '\\':
+ emitcp = 0x005c;
+ break;
+ case 'b':
+ emitcp = 0x0008;
+ break;
+ case 'f':
+ emitcp = 0x000c;
+ break;
+ case 'n':
+ emitcp = 0x000a;
+ break;
+ case 'r':
+ emitcp = 0x000d;
+ break;
+ case 't':
+ emitcp = 0x0009;
+ break;
+ case 'v':
+ emitcp = 0x000b;
+ break;
+ case 'x':
+ case 'u': {
+ duk_codepoint_t esc_cp;
+ esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/);
+ DUK__APPENDBUFFER(lex_ctx, esc_cp);
+ adv = 0;
+ break;
+ }
+ default: {
+ if (duk_unicode_is_line_terminator(x)) {
+ /* line continuation */
+ if (x == 0x000d && DUK__L2() == 0x000a) {
+ /* CR LF again a special case */
+ adv = 3; /* line terminator, CR, LF */
+ }
+ } else if (DUK__ISDIGIT(x)) {
+ /*
+ * Octal escape or zero escape:
+ * \0 (lookahead not OctalDigit)
+ * \1 ... \7 (lookahead not OctalDigit)
+ * \ZeroToThree OctalDigit (lookahead not OctalDigit)
+ * \FourToSeven OctalDigit (no lookahead restrictions)
+ * \ZeroToThree OctalDigit OctalDigit (no lookahead restrictions)
+ *
+ * Zero escape is part of the standard syntax. Octal escapes are
+ * defined in E5 Section B.1.2, and are only allowed in non-strict mode.
+ * Any other productions starting with a decimal digit are invalid
+ * but are in practice treated like identity escapes.
+ *
+ * Parse octal (up to 3 digits) from the lookup window.
+ */
+
+ emitcp = duk__lexer_parse_legacy_octal(lex_ctx, &adv, strict_mode /*reject_annex_b*/);
+ if (emitcp < 0) {
+ goto fail_escape;
+ }
+ } else if (x < 0) {
+ goto fail_unterminated;
+ } else {
+ /* escaped NonEscapeCharacter */
+ DUK__APPENDBUFFER(lex_ctx, x);
+ }
+ } /* end default clause */
+ } /* end switch */
+
+ /* Shared handling for single codepoint escapes. */
+ if (emitcp >= 0) {
+ DUK__APPENDBUFFER(lex_ctx, emitcp);
+ }
+
+ /* Track number of escapes; count not really needed but directive
+ * prologues need to detect whether there were any escapes or line
+ * continuations or not.
+ */
+ out_token->num_escapes++;
+ } else if (x >= 0x20 && x <= 0x7f) {
+ /* Fast path for ASCII case, avoids line terminator
+ * check and CESU-8 encoding.
+ */
+ DUK_ASSERT(x >= 0);
+ DUK_ASSERT(!duk_unicode_is_line_terminator(x));
+ DUK_ASSERT(x != quote);
+ DUK_ASSERT(x != DUK_ASC_BACKSLASH);
+ DUK__APPENDBUFFER_ASCII(lex_ctx, x);
+ } else if (x < 0 || duk_unicode_is_line_terminator(x)) {
+ goto fail_unterminated;
+ } else {
+ /* Character which is part of the string but wasn't handled
+ * by the fast path.
+ */
+ DUK__APPENDBUFFER(lex_ctx, x);
+ }
+ } /* string parse loop */
+
+ return;
+
+ fail_escape:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE);
+ return;
+
+ fail_unterminated:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_STRING);
+ return;
+}
+
+/* Skip to end-of-line (or end-of-file), used for single line comments. */
+DUK_LOCAL void duk__lexer_skip_to_endofline(duk_lexer_ctx *lex_ctx) {
+ for (;;) {
+ duk_codepoint_t x;
+
+ x = DUK__L0();
+ if (x < 0 || duk_unicode_is_line_terminator(x)) {
+ break;
+ }
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ }
+}
+
+/*
+ * Parse Ecmascript source InputElementDiv or InputElementRegExp
+ * (E5 Section 7), skipping whitespace, comments, and line terminators.
+ *
+ * Possible results are:
+ * (1) a token
+ * (2) a line terminator (skipped)
+ * (3) a comment (skipped)
+ * (4) EOF
+ *
+ * White space is automatically skipped from the current position (but
+ * not after the input element). If input has already ended, returns
+ * DUK_TOK_EOF indefinitely. If a parse error occurs, uses an DUK_ERROR()
+ * macro call (and hence a longjmp through current heap longjmp context).
+ * Comments and line terminator tokens are automatically skipped.
+ *
+ * The input element being matched is determined by regexp_mode; if set,
+ * parses a InputElementRegExp, otherwise a InputElementDiv. The
+ * difference between these are handling of productions starting with a
+ * forward slash.
+ *
+ * If strict_mode is set, recognizes additional future reserved words
+ * specific to strict mode, and refuses to parse octal literals.
+ *
+ * The matching strategy below is to (currently) use a six character
+ * lookup window to quickly determine which production is the -longest-
+ * matching one, and then parse that. The top-level if-else clauses
+ * match the first character, and the code blocks for each clause
+ * handle -all- alternatives for that first character. Ecmascript
+ * specification uses the "longest match wins" semantics, so the order
+ * of the if-clauses matters.
+ *
+ * Misc notes:
+ *
+ * * Ecmascript numeric literals do not accept a sign character.
+ * Consequently e.g. "-1.0" is parsed as two tokens: a negative
+ * sign and a positive numeric literal. The compiler performs
+ * the negation during compilation, so this has no adverse impact.
+ *
+ * * There is no token for "undefined": it is just a value available
+ * from the global object (or simply established by doing a reference
+ * to an undefined value).
+ *
+ * * Some contexts want Identifier tokens, which are IdentifierNames
+ * excluding reserved words, while some contexts want IdentifierNames
+ * directly. In the latter case e.g. "while" is interpreted as an
+ * identifier name, not a DUK_TOK_WHILE token. The solution here is
+ * to provide both token types: DUK_TOK_WHILE goes to 't' while
+ * DUK_TOK_IDENTIFIER goes to 't_nores', and 'slot1' always contains
+ * the identifier / keyword name.
+ *
+ * * Directive prologue needs to identify string literals such as
+ * "use strict" and 'use strict', which are sensitive to line
+ * continuations and escape sequences. For instance, "use\u0020strict"
+ * is a valid directive but is distinct from "use strict". The solution
+ * here is to decode escapes while tokenizing, but to keep track of the
+ * number of escapes. Directive detection can then check that the
+ * number of escapes is zero.
+ *
+ * * Multi-line comments with one or more internal LineTerminator are
+ * treated like a line terminator to comply with automatic semicolon
+ * insertion.
+ */
+
+DUK_INTERNAL
+void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx,
+ duk_token *out_token,
+ duk_bool_t strict_mode,
+ duk_bool_t regexp_mode) {
+ duk_codepoint_t x; /* temporary, must be signed and 32-bit to hold Unicode code points */
+ duk_small_uint_t advtok = 0; /* (advance << 8) + token_type, updated at function end,
+ * init is unnecessary but suppresses "may be used uninitialized" warnings.
+ */
+ duk_bool_t got_lineterm = 0; /* got lineterm preceding non-whitespace, non-lineterm token */
+
+ if (++lex_ctx->token_count >= lex_ctx->token_limit) {
+ goto fail_token_limit;
+ }
+
+ out_token->t = DUK_TOK_EOF;
+ out_token->t_nores = DUK_TOK_INVALID; /* marker: copy t if not changed */
+#if 0 /* not necessary to init, disabled for faster parsing */
+ out_token->num = DUK_DOUBLE_NAN;
+ out_token->str1 = NULL;
+ out_token->str2 = NULL;
+#endif
+ out_token->num_escapes = 0;
+ /* out_token->lineterm set by caller */
+
+ /* This would be nice, but parsing is faster without resetting the
+ * value slots. The only side effect is that references to temporary
+ * string values may linger until lexing is finished; they're then
+ * freed normally.
+ */
+#if 0
+ duk_to_undefined(lex_ctx->thr, lex_ctx->slot1_idx);
+ duk_to_undefined(lex_ctx->thr, lex_ctx->slot2_idx);
+#endif
+
+ /* 'advtok' indicates how much to advance and which token id to assign
+ * at the end. This shared functionality minimizes code size. All
+ * code paths are required to set 'advtok' to some value, so no default
+ * init value is used. Code paths calling DUK_ERROR() never return so
+ * they don't need to set advtok.
+ */
+
+ /*
+ * Matching order:
+ *
+ * Punctuator first chars, also covers comments, regexps
+ * LineTerminator
+ * Identifier or reserved word, also covers null/true/false literals
+ * NumericLiteral
+ * StringLiteral
+ * EOF
+ *
+ * The order does not matter as long as the longest match is
+ * always correctly identified. There are order dependencies
+ * in the clauses, so it's not trivial to convert to a switch.
+ */
+
+ restart_lineupdate:
+ out_token->start_line = lex_ctx->window[0].line;
+
+ restart:
+ out_token->start_offset = lex_ctx->window[0].offset;
+
+ x = DUK__L0();
+
+ switch (x) {
+ case DUK_ASC_SPACE:
+ case DUK_ASC_HT: /* fast paths for space and tab */
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ goto restart;
+ case DUK_ASC_LF: /* LF line terminator; CR LF and Unicode lineterms are handled in slow path */
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ got_lineterm = 1;
+ goto restart_lineupdate;
+#if defined(DUK_USE_SHEBANG_COMMENTS)
+ case DUK_ASC_HASH: /* '#' */
+ if (DUK__L1() == DUK_ASC_EXCLAMATION && lex_ctx->window[0].offset == 0 &&
+ (lex_ctx->flags & DUK_COMPILE_SHEBANG)) {
+ /* "Shebang" comment ('#! ...') on first line. */
+ /* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */
+ duk__lexer_skip_to_endofline(lex_ctx);
+ goto restart; /* line terminator will be handled on next round */
+ }
+ goto fail_token;
+#endif /* DUK_USE_SHEBANG_COMMENTS */
+ case DUK_ASC_SLASH: /* '/' */
+ if (DUK__L1() == DUK_ASC_SLASH) {
+ /*
+ * E5 Section 7.4, allow SourceCharacter (which is any 16-bit
+ * code point).
+ */
+
+ /* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */
+ duk__lexer_skip_to_endofline(lex_ctx);
+ goto restart; /* line terminator will be handled on next round */
+ } else if (DUK__L1() == DUK_ASC_STAR) {
+ /*
+ * E5 Section 7.4. If the multi-line comment contains a newline,
+ * it is treated like a single line terminator for automatic
+ * semicolon insertion.
+ */
+
+ duk_bool_t last_asterisk = 0;
+ DUK__ADVANCECHARS(lex_ctx, 2);
+ for (;;) {
+ x = DUK__L0();
+ if (x < 0) {
+ goto fail_unterm_comment;
+ }
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ if (last_asterisk && x == DUK_ASC_SLASH) {
+ break;
+ }
+ if (duk_unicode_is_line_terminator(x)) {
+ got_lineterm = 1;
+ }
+ last_asterisk = (x == DUK_ASC_STAR);
+ }
+ goto restart_lineupdate;
+ } else if (regexp_mode) {
+#if defined(DUK_USE_REGEXP_SUPPORT)
+ /*
+ * "/" followed by something in regexp mode. See E5 Section 7.8.5.
+ *
+ * RegExp parsing is a bit complex. First, the regexp body is delimited
+ * by forward slashes, but the body may also contain forward slashes as
+ * part of an escape sequence or inside a character class (delimited by
+ * square brackets). A mini state machine is used to implement these.
+ *
+ * Further, an early (parse time) error must be thrown if the regexp
+ * would cause a run-time error when used in the expression new RegExp(...).
+ * Parsing here simply extracts the (candidate) regexp, and also accepts
+ * invalid regular expressions (which are delimited properly). The caller
+ * (compiler) must perform final validation and regexp compilation.
+ *
+ * RegExp first char may not be '/' (single line comment) or '*' (multi-
+ * line comment). These have already been checked above, so there is no
+ * need below for special handling of the first regexp character as in
+ * the E5 productions.
+ *
+ * About unicode escapes within regexp literals:
+ *
+ * E5 Section 7.8.5 grammar does NOT accept \uHHHH escapes.
+ * However, Section 6 states that regexps accept the escapes,
+ * see paragraph starting with "In string literals...".
+ * The regexp grammar, which sees the decoded regexp literal
+ * (after lexical parsing) DOES have a \uHHHH unicode escape.
+ * So, for instance:
+ *
+ * /\u1234/
+ *
+ * should first be parsed by the lexical grammar as:
+ *
+ * '\' 'u' RegularExpressionBackslashSequence
+ * '1' RegularExpressionNonTerminator
+ * '2' RegularExpressionNonTerminator
+ * '3' RegularExpressionNonTerminator
+ * '4' RegularExpressionNonTerminator
+ *
+ * and the escape itself is then parsed by the regexp engine.
+ * This is the current implementation.
+ *
+ * Minor spec inconsistency:
+ *
+ * E5 Section 7.8.5 RegularExpressionBackslashSequence is:
+ *
+ * \ RegularExpressionNonTerminator
+ *
+ * while Section A.1 RegularExpressionBackslashSequence is:
+ *
+ * \ NonTerminator
+ *
+ * The latter is not normative and a typo.
+ *
+ */
+
+ /* first, parse regexp body roughly */
+
+ duk_small_int_t state = 0; /* 0=base, 1=esc, 2=class, 3=class+esc */
+
+ DUK__INITBUFFER(lex_ctx);
+ for (;;) {
+ DUK__ADVANCECHARS(lex_ctx, 1); /* skip opening slash on first loop */
+ x = DUK__L0();
+ if (x < 0 || duk_unicode_is_line_terminator(x)) {
+ goto fail_unterm_regexp;
+ }
+ x = DUK__L0(); /* re-read to avoid spill / fetch */
+ if (state == 0) {
+ if (x == DUK_ASC_SLASH) {
+ DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing slash */
+ break;
+ } else if (x == DUK_ASC_BACKSLASH) {
+ state = 1;
+ } else if (x == DUK_ASC_LBRACKET) {
+ state = 2;
+ }
+ } else if (state == 1) {
+ state = 0;
+ } else if (state == 2) {
+ if (x == DUK_ASC_RBRACKET) {
+ state = 0;
+ } else if (x == DUK_ASC_BACKSLASH) {
+ state = 3;
+ }
+ } else { /* state == 3 */
+ state = 2;
+ }
+ DUK__APPENDBUFFER(lex_ctx, x);
+ }
+ out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);
+
+ /* second, parse flags */
+
+ DUK__INITBUFFER(lex_ctx);
+ for (;;) {
+ x = DUK__L0();
+ if (!duk_unicode_is_identifier_part(x)) {
+ break;
+ }
+ x = DUK__L0(); /* re-read to avoid spill / fetch */
+ DUK__APPENDBUFFER(lex_ctx, x);
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ }
+ out_token->str2 = duk__internbuffer(lex_ctx, lex_ctx->slot2_idx);
+
+ DUK__INITBUFFER(lex_ctx); /* free some memory */
+
+ /* validation of the regexp is caller's responsibility */
+
+ advtok = DUK__ADVTOK(0, DUK_TOK_REGEXP);
+#else /* DUK_USE_REGEXP_SUPPORT */
+ goto fail_regexp_support;
+#endif /* DUK_USE_REGEXP_SUPPORT */
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ /* "/=" and not in regexp mode */
+ advtok = DUK__ADVTOK(2, DUK_TOK_DIV_EQ);
+ } else {
+ /* "/" and not in regexp mode */
+ advtok = DUK__ADVTOK(1, DUK_TOK_DIV);
+ }
+ break;
+ case DUK_ASC_LCURLY: /* '{' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_LCURLY);
+ break;
+ case DUK_ASC_RCURLY: /* '}' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_RCURLY);
+ break;
+ case DUK_ASC_LPAREN: /* '(' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_LPAREN);
+ break;
+ case DUK_ASC_RPAREN: /* ')' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_RPAREN);
+ break;
+ case DUK_ASC_LBRACKET: /* '[' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_LBRACKET);
+ break;
+ case DUK_ASC_RBRACKET: /* ']' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_RBRACKET);
+ break;
+ case DUK_ASC_PERIOD: /* '.' */
+ if (DUK__ISDIGIT(DUK__L1())) {
+ /* Period followed by a digit can only start DecimalLiteral
+ * (handled in slow path). We could jump straight into the
+ * DecimalLiteral handling but should avoid goto to inside
+ * a block.
+ */
+ goto slow_path;
+ }
+ advtok = DUK__ADVTOK(1, DUK_TOK_PERIOD);
+ break;
+ case DUK_ASC_SEMICOLON: /* ';' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_SEMICOLON);
+ break;
+ case DUK_ASC_COMMA: /* ',' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_COMMA);
+ break;
+ case DUK_ASC_LANGLE: /* '<' */
+#if defined(DUK_USE_HTML_COMMENTS)
+ if (DUK__L1() == DUK_ASC_EXCLAMATION && DUK__L2() == DUK_ASC_MINUS && DUK__L3() == DUK_ASC_MINUS) {
+ /*
+ * ES2015: B.1.3, handle "<!--" SingleLineHTMLOpenComment
+ */
+
+ /* DUK__ADVANCECHARS(lex_ctx, 4) would be correct here, but not necessary */
+ duk__lexer_skip_to_endofline(lex_ctx);
+ goto restart; /* line terminator will be handled on next round */
+ }
+ else
+#endif /* DUK_USE_HTML_COMMENTS */
+ if (DUK__L1() == DUK_ASC_LANGLE && DUK__L2() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(3, DUK_TOK_ALSHIFT_EQ);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_LE);
+ } else if (DUK__L1() == DUK_ASC_LANGLE) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_ALSHIFT);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_LT);
+ }
+ break;
+ case DUK_ASC_RANGLE: /* '>' */
+ if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE && DUK__L3() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(4, DUK_TOK_RSHIFT_EQ);
+ } else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE) {
+ advtok = DUK__ADVTOK(3, DUK_TOK_RSHIFT);
+ } else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(3, DUK_TOK_ARSHIFT_EQ);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_GE);
+ } else if (DUK__L1() == DUK_ASC_RANGLE) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_ARSHIFT);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_GT);
+ }
+ break;
+ case DUK_ASC_EQUALS: /* '=' */
+ if (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(3, DUK_TOK_SEQ);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_EQUALSIGN);
+ }
+ break;
+ case DUK_ASC_EXCLAMATION: /* '!' */
+ if (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(3, DUK_TOK_SNEQ);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_NEQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_LNOT);
+ }
+ break;
+ case DUK_ASC_PLUS: /* '+' */
+ if (DUK__L1() == DUK_ASC_PLUS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_INCREMENT);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_ADD_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_ADD);
+ }
+ break;
+ case DUK_ASC_MINUS: /* '-' */
+#if defined(DUK_USE_HTML_COMMENTS)
+ if (got_lineterm && DUK__L1() == DUK_ASC_MINUS && DUK__L2() == DUK_ASC_RANGLE) {
+ /*
+ * ES2015: B.1.3, handle "-->" SingleLineHTMLCloseComment
+ * Only allowed:
+ * - on new line
+ * - preceded only by whitespace
+ * - preceded by end of multiline comment and optional whitespace
+ *
+ * Since whitespace generates no tokens, and multiline comments
+ * are treated as a line ending, consulting `got_lineterm` is
+ * sufficient to test for these three options.
+ */
+
+ /* DUK__ADVANCECHARS(lex_ctx, 3) would be correct here, but not necessary */
+ duk__lexer_skip_to_endofline(lex_ctx);
+ goto restart; /* line terminator will be handled on next round */
+ } else
+#endif /* DUK_USE_HTML_COMMENTS */
+ if (DUK__L1() == DUK_ASC_MINUS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_DECREMENT);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_SUB_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_SUB);
+ }
+ break;
+ case DUK_ASC_STAR: /* '*' */
+#if defined(DUK_USE_ES7_EXP_OPERATOR)
+ if (DUK__L1() == DUK_ASC_STAR && DUK__L2() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(3, DUK_TOK_EXP_EQ);
+ } else if (DUK__L1() == DUK_ASC_STAR) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_EXP);
+ } else
+#endif
+ if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_MUL_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_MUL);
+ }
+ break;
+ case DUK_ASC_PERCENT: /* '%' */
+ if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_MOD_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_MOD);
+ }
+ break;
+ case DUK_ASC_AMP: /* '&' */
+ if (DUK__L1() == DUK_ASC_AMP) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_LAND);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_BAND_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_BAND);
+ }
+ break;
+ case DUK_ASC_PIPE: /* '|' */
+ if (DUK__L1() == DUK_ASC_PIPE) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_LOR);
+ } else if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_BOR_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_BOR);
+ }
+ break;
+ case DUK_ASC_CARET: /* '^' */
+ if (DUK__L1() == DUK_ASC_EQUALS) {
+ advtok = DUK__ADVTOK(2, DUK_TOK_BXOR_EQ);
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_TOK_BXOR);
+ }
+ break;
+ case DUK_ASC_TILDE: /* '~' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_BNOT);
+ break;
+ case DUK_ASC_QUESTION: /* '?' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_QUESTION);
+ break;
+ case DUK_ASC_COLON: /* ':' */
+ advtok = DUK__ADVTOK(1, DUK_TOK_COLON);
+ break;
+ case DUK_ASC_DOUBLEQUOTE: /* '"' */
+ case DUK_ASC_SINGLEQUOTE: { /* '\'' */
+ DUK__INITBUFFER(lex_ctx);
+ duk__lexer_parse_string_literal(lex_ctx, out_token, x /*quote*/, strict_mode);
+ duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);
+ out_token->str1 = duk_known_hstring(lex_ctx->thr, lex_ctx->slot1_idx);
+
+ DUK__INITBUFFER(lex_ctx); /* free some memory */
+
+ advtok = DUK__ADVTOK(0, DUK_TOK_STRING);
+ break;
+ }
+ default:
+ goto slow_path;
+ } /* switch */
+
+ goto skip_slow_path;
+
+ slow_path:
+ if (duk_unicode_is_line_terminator(x)) {
+ if (x == 0x000d && DUK__L1() == 0x000a) {
+ /*
+ * E5 Section 7.3: CR LF is detected as a single line terminator for
+ * line numbers. Here we also detect it as a single line terminator
+ * token.
+ */
+ DUK__ADVANCECHARS(lex_ctx, 2);
+ } else {
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ }
+ got_lineterm = 1;
+ goto restart_lineupdate;
+ } else if (duk_unicode_is_identifier_start(x) || x == DUK_ASC_BACKSLASH) {
+ /*
+ * Parse an identifier and then check whether it is:
+ * - reserved word (keyword or other reserved word)
+ * - "null" (NullLiteral)
+ * - "true" (BooleanLiteral)
+ * - "false" (BooleanLiteral)
+ * - anything else => identifier
+ *
+ * This does not follow the E5 productions cleanly, but is
+ * useful and compact.
+ *
+ * Note that identifiers may contain Unicode escapes,
+ * see E5 Sections 6 and 7.6. They must be decoded first,
+ * and the result checked against allowed characters.
+ * The above if-clause accepts an identifier start and an
+ * '\' character -- no other token can begin with a '\'.
+ *
+ * Note that "get" and "set" are not reserved words in E5
+ * specification so they are recognized as plain identifiers
+ * (the tokens DUK_TOK_GET and DUK_TOK_SET are actually not
+ * used now). The compiler needs to work around this.
+ *
+ * Strictly speaking, following Ecmascript longest match
+ * specification, an invalid escape for the first character
+ * should cause a syntax error. However, an invalid escape
+ * for IdentifierParts should just terminate the identifier
+ * early (longest match), and let the next tokenization
+ * fail. For instance Rhino croaks with 'foo\z' when
+ * parsing the identifier. This has little practical impact.
+ */
+
+ duk_small_uint_t i, i_end;
+ duk_bool_t first = 1;
+ duk_hstring *str;
+
+ DUK__INITBUFFER(lex_ctx);
+ for (;;) {
+ /* re-lookup first char on first loop */
+ if (DUK__L0() == DUK_ASC_BACKSLASH) {
+ duk_codepoint_t esc_cp;
+ if (DUK__L1() != DUK_ASC_LC_U) {
+ goto fail_escape;
+ }
+ esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/);
+ DUK__APPENDBUFFER(lex_ctx, esc_cp);
+
+ /* IdentifierStart is stricter than IdentifierPart, so if the first
+ * character is escaped, must have a stricter check here.
+ */
+ if (!(first ? duk_unicode_is_identifier_start(esc_cp) : duk_unicode_is_identifier_part(esc_cp))) {
+ goto fail_escape;
+ }
+
+ /* Track number of escapes: necessary for proper keyword
+ * detection.
+ */
+ out_token->num_escapes++;
+ } else {
+ /* Note: first character is checked against this. But because
+ * IdentifierPart includes all IdentifierStart characters, and
+ * the first character (if unescaped) has already been checked
+ * in the if condition, this is OK.
+ */
+ if (!duk_unicode_is_identifier_part(DUK__L0())) {
+ break;
+ }
+ DUK__APPENDBUFFER(lex_ctx, DUK__L0());
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ }
+ first = 0;
+ }
+
+ out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);
+ str = out_token->str1;
+ out_token->t_nores = DUK_TOK_IDENTIFIER;
+
+ DUK__INITBUFFER(lex_ctx); /* free some memory */
+
+ /*
+ * Interned identifier is compared against reserved words, which are
+ * currently interned into the heap context. See genbuiltins.py.
+ *
+ * Note that an escape in the identifier disables recognition of
+ * keywords; e.g. "\u0069f = 1;" is a valid statement (assigns to
+ * identifier named "if"). This is not necessarily compliant,
+ * see test-dec-escaped-char-in-keyword.js.
+ *
+ * Note: "get" and "set" are awkward. They are not officially
+ * ReservedWords (and indeed e.g. "var set = 1;" is valid), and
+ * must come out as DUK_TOK_IDENTIFIER. The compiler needs to
+ * work around this a bit.
+ */
+
+ /* XXX: optimize by adding the token numbers directly into the
+ * always interned duk_hstring objects (there should be enough
+ * flag bits free for that)?
+ */
+
+ i_end = (strict_mode ? DUK_STRIDX_END_RESERVED : DUK_STRIDX_START_STRICT_RESERVED);
+
+ advtok = DUK__ADVTOK(0, DUK_TOK_IDENTIFIER);
+ if (out_token->num_escapes == 0) {
+ for (i = DUK_STRIDX_START_RESERVED; i < i_end; i++) {
+ DUK_ASSERT_DISABLE(i >= 0); /* unsigned */
+ DUK_ASSERT(i < DUK_HEAP_NUM_STRINGS);
+ if (DUK_HTHREAD_GET_STRING(lex_ctx->thr, i) == str) {
+ advtok = DUK__ADVTOK(0, DUK_STRIDX_TO_TOK(i));
+ break;
+ }
+ }
+ }
+ } else if (DUK__ISDIGIT(x) || (x == DUK_ASC_PERIOD)) {
+ /* Note: decimal number may start with a period, but must be followed by a digit */
+
+ /*
+ * Pre-parsing for decimal, hex, octal (both legacy and ES2015),
+ * and binary literals, followed by an actual parser step
+ * provided by numconv.
+ *
+ * Note: the leading sign character ('+' or '-') is -not- part of
+ * the production in E5 grammar, and that the a DecimalLiteral
+ * starting with a '0' must be followed by a non-digit.
+ *
+ * XXX: the two step parsing process is quite awkward, it would
+ * be more straightforward to allow numconv to parse the longest
+ * valid prefix (it already does that, it only needs to indicate
+ * where the input ended). However, the lexer decodes characters
+ * using a limited lookup window, so this is not a trivial change.
+ */
+
+ /* XXX: because of the final check below (that the literal is not
+ * followed by a digit), this could maybe be simplified, if we bail
+ * out early from a leading zero (and if there are no periods etc).
+ * Maybe too complex.
+ */
+
+ duk_double_t val;
+ duk_bool_t legacy_oct = 0;
+ duk_small_int_t state; /* 0=before period/exp,
+ * 1=after period, before exp
+ * 2=after exp, allow '+' or '-'
+ * 3=after exp and exp sign
+ */
+ duk_small_uint_t s2n_flags;
+ duk_codepoint_t y, z;
+ duk_small_int_t s2n_radix = 10;
+ duk_small_uint_t pre_adv = 0;
+
+ DUK__INITBUFFER(lex_ctx);
+ y = DUK__L1();
+
+ if (x == DUK_ASC_0) {
+ z = DUK_LOWERCASE_CHAR_ASCII(y);
+
+ pre_adv = 2; /* default for 0xNNN, 0oNNN, 0bNNN. */
+ if (z == DUK_ASC_LC_X) {
+ s2n_radix = 16;
+ } else if (z == DUK_ASC_LC_O) {
+ s2n_radix = 8;
+ } else if (z == DUK_ASC_LC_B) {
+ s2n_radix = 2;
+ } else {
+ pre_adv = 0;
+ if (DUK__ISDIGIT(y)) {
+ if (strict_mode) {
+ /* Reject octal like \07 but also octal-lookalike
+ * decimal like \08 in strict mode.
+ */
+ goto fail_number_literal;
+ } else {
+ /* Legacy OctalIntegerLiteral or octal-lookalice
+ * decimal. Deciding between the two happens below
+ * in digit scanning.
+ */
+ DUK__APPENDBUFFER(lex_ctx, x);
+ pre_adv = 1;
+ legacy_oct = 1;
+ s2n_radix = 8; /* tentative unless conflicting digits found */
+ }
+ }
+ }
+ }
+
+ DUK__ADVANCECHARS(lex_ctx, pre_adv);
+
+ /* XXX: we could parse integers here directly, and fall back
+ * to numconv only when encountering a fractional expression
+ * or when an octal literal turned out to be decimal (0778 etc).
+ */
+ state = 0;
+ for (;;) {
+ x = DUK__L0(); /* re-lookup curr char on first round */
+ if (DUK__ISDIGIT(x)) {
+ /* Note: intentionally allow leading zeroes here, as the
+ * actual parser will check for them.
+ */
+ if (state == 0 && legacy_oct && (x == DUK_ASC_8 || x == DUK_ASC_9)) {
+ /* Started out as an octal-lookalike
+ * but interpreted as decimal, e.g.
+ * '0779' -> 779. This also means
+ * that fractions are allowed, e.g.
+ * '0779.123' is allowed but '0777.123'
+ * is not!
+ */
+ s2n_radix = 10;
+ }
+ if (state == 2) {
+ state = 3;
+ }
+ } else if (s2n_radix == 16 && DUK__ISHEXDIGIT(x)) {
+ /* Note: 'e' and 'E' are also accepted here. */
+ ;
+ } else if (x == DUK_ASC_PERIOD) {
+ if (state >= 1 || s2n_radix != 10) {
+ break;
+ } else {
+ state = 1;
+ }
+ } else if (x == DUK_ASC_LC_E || x == DUK_ASC_UC_E) {
+ if (state >= 2 || s2n_radix != 10) {
+ break;
+ } else {
+ state = 2;
+ }
+ } else if (x == DUK_ASC_MINUS || x == DUK_ASC_PLUS) {
+ if (state != 2) {
+ break;
+ } else {
+ state = 3;
+ }
+ } else {
+ break;
+ }
+ DUK__APPENDBUFFER(lex_ctx, x);
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ }
+
+ /* XXX: better coercion */
+ (void) duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);
+
+ if (s2n_radix != 10) {
+ /* For bases other than 10, integer only. */
+ s2n_flags = DUK_S2N_FLAG_ALLOW_LEADING_ZERO;
+ } else {
+ s2n_flags = DUK_S2N_FLAG_ALLOW_EXP |
+ DUK_S2N_FLAG_ALLOW_FRAC |
+ DUK_S2N_FLAG_ALLOW_NAKED_FRAC |
+ DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |
+ DUK_S2N_FLAG_ALLOW_LEADING_ZERO;
+ }
+
+ duk_dup(lex_ctx->thr, lex_ctx->slot1_idx);
+ duk_numconv_parse(lex_ctx->thr, s2n_radix, s2n_flags);
+ val = duk_to_number_m1(lex_ctx->thr);
+ if (DUK_ISNAN(val)) {
+ goto fail_number_literal;
+ }
+ duk_replace(lex_ctx->thr, lex_ctx->slot1_idx); /* could also just pop? */
+
+ DUK__INITBUFFER(lex_ctx); /* free some memory */
+
+ /* Section 7.8.3 (note): NumericLiteral must be followed by something other than
+ * IdentifierStart or DecimalDigit.
+ */
+
+ if (DUK__ISDIGIT(DUK__L0()) || duk_unicode_is_identifier_start(DUK__L0())) {
+ goto fail_number_literal;
+ }
+
+ out_token->num = val;
+ advtok = DUK__ADVTOK(0, DUK_TOK_NUMBER);
+ } else if (duk_unicode_is_whitespace(DUK__LOOKUP(lex_ctx, 0))) {
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ goto restart;
+ } else if (x < 0) {
+ advtok = DUK__ADVTOK(0, DUK_TOK_EOF);
+ } else {
+ goto fail_token;
+ }
+ skip_slow_path:
+
+ /*
+ * Shared exit path
+ */
+
+ DUK__ADVANCEBYTES(lex_ctx, advtok >> 8);
+ out_token->t = advtok & 0xff;
+ if (out_token->t_nores == DUK_TOK_INVALID) {
+ out_token->t_nores = out_token->t;
+ }
+ out_token->lineterm = got_lineterm;
+
+ /* Automatic semicolon insertion is allowed if a token is preceded
+ * by line terminator(s), or terminates a statement list (right curly
+ * or EOF).
+ */
+ if (got_lineterm || out_token->t == DUK_TOK_RCURLY || out_token->t == DUK_TOK_EOF) {
+ out_token->allow_auto_semi = 1;
+ } else {
+ out_token->allow_auto_semi = 0;
+ }
+
+ return;
+
+ fail_token_limit:
+ DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT);
+ return;
+
+ fail_token:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_TOKEN);
+ return;
+
+ fail_number_literal:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_NUMBER_LITERAL);
+ return;
+
+ fail_escape:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE);
+ return;
+
+ fail_unterm_regexp:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_REGEXP);
+ return;
+
+ fail_unterm_comment:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_COMMENT);
+ return;
+
+#if !defined(DUK_USE_REGEXP_SUPPORT)
+ fail_regexp_support:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_REGEXP_SUPPORT_DISABLED);
+ return;
+#endif
+}
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+
+/*
+ * Parse a RegExp token. The grammar is described in E5 Section 15.10.
+ * Terminal constructions (such as quantifiers) are parsed directly here.
+ *
+ * 0xffffffffU is used as a marker for "infinity" in quantifiers. Further,
+ * DUK__MAX_RE_QUANT_DIGITS limits the maximum number of digits that
+ * will be accepted for a quantifier.
+ */
+
+DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token) {
+ duk_small_uint_t advtok = 0; /* init is unnecessary but suppresses "may be used uninitialized" warnings */
+ duk_codepoint_t x, y;
+
+ if (++lex_ctx->token_count >= lex_ctx->token_limit) {
+ goto fail_token_limit;
+ }
+
+ DUK_MEMZERO(out_token, sizeof(*out_token));
+
+ x = DUK__L0();
+ y = DUK__L1();
+
+ DUK_DDD(DUK_DDDPRINT("parsing regexp token, L0=%ld, L1=%ld", (long) x, (long) y));
+
+ switch (x) {
+ case DUK_ASC_PIPE: {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_DISJUNCTION);
+ break;
+ }
+ case DUK_ASC_CARET: {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_START);
+ break;
+ }
+ case DUK_ASC_DOLLAR: {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_END);
+ break;
+ }
+ case DUK_ASC_QUESTION: {
+ out_token->qmin = 0;
+ out_token->qmax = 1;
+ if (y == DUK_ASC_QUESTION) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER);
+ out_token->greedy = 0;
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER);
+ out_token->greedy = 1;
+ }
+ break;
+ }
+ case DUK_ASC_STAR: {
+ out_token->qmin = 0;
+ out_token->qmax = DUK_RE_QUANTIFIER_INFINITE;
+ if (y == DUK_ASC_QUESTION) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER);
+ out_token->greedy = 0;
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER);
+ out_token->greedy = 1;
+ }
+ break;
+ }
+ case DUK_ASC_PLUS: {
+ out_token->qmin = 1;
+ out_token->qmax = DUK_RE_QUANTIFIER_INFINITE;
+ if (y == DUK_ASC_QUESTION) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER);
+ out_token->greedy = 0;
+ } else {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER);
+ out_token->greedy = 1;
+ }
+ break;
+ }
+ case DUK_ASC_LCURLY: {
+ /* Production allows 'DecimalDigits', including leading zeroes */
+ duk_uint32_t val1 = 0;
+ duk_uint32_t val2 = DUK_RE_QUANTIFIER_INFINITE;
+ duk_small_int_t digits = 0;
+#if defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ duk_lexer_point lex_pt;
+#endif
+
+#if defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ /* Store lexer position, restoring if quantifier is invalid. */
+ DUK_LEXER_GETPOINT(lex_ctx, &lex_pt);
+#endif
+
+ for (;;) {
+ DUK__ADVANCECHARS(lex_ctx, 1); /* eat '{' on entry */
+ x = DUK__L0();
+ if (DUK__ISDIGIT(x)) {
+ digits++;
+ val1 = val1 * 10 + (duk_uint32_t) duk__hexval(x);
+ } else if (x == DUK_ASC_COMMA) {
+ if (digits > DUK__MAX_RE_QUANT_DIGITS) {
+ goto invalid_quantifier;
+ }
+ if (val2 != DUK_RE_QUANTIFIER_INFINITE) {
+ goto invalid_quantifier;
+ }
+ if (DUK__L1() == DUK_ASC_RCURLY) {
+ /* form: { DecimalDigits , }, val1 = min count */
+ if (digits == 0) {
+ goto invalid_quantifier;
+ }
+ out_token->qmin = val1;
+ out_token->qmax = DUK_RE_QUANTIFIER_INFINITE;
+ DUK__ADVANCECHARS(lex_ctx, 2);
+ break;
+ }
+ val2 = val1;
+ val1 = 0;
+ digits = 0; /* not strictly necessary because of lookahead '}' above */
+ } else if (x == DUK_ASC_RCURLY) {
+ if (digits > DUK__MAX_RE_QUANT_DIGITS) {
+ goto invalid_quantifier;
+ }
+ if (digits == 0) {
+ goto invalid_quantifier;
+ }
+ if (val2 != DUK_RE_QUANTIFIER_INFINITE) {
+ /* val2 = min count, val1 = max count */
+ out_token->qmin = val2;
+ out_token->qmax = val1;
+ } else {
+ /* val1 = count */
+ out_token->qmin = val1;
+ out_token->qmax = val1;
+ }
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ break;
+ } else {
+ goto invalid_quantifier;
+ }
+ }
+ if (DUK__L0() == DUK_ASC_QUESTION) {
+ out_token->greedy = 0;
+ DUK__ADVANCECHARS(lex_ctx, 1);
+ } else {
+ out_token->greedy = 1;
+ }
+ advtok = DUK__ADVTOK(0, DUK_RETOK_QUANTIFIER);
+ break;
+ invalid_quantifier:
+#if defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ /* Failed to match the quantifier, restore lexer and parse
+ * opening brace as a literal.
+ */
+ DUK_LEXER_SETPOINT(lex_ctx, &lex_pt);
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR);
+ out_token->num = DUK_ASC_LCURLY;
+#else
+ goto fail_quantifier;
+#endif
+ break;
+ }
+ case DUK_ASC_PERIOD: {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_PERIOD);
+ break;
+ }
+ case DUK_ASC_BACKSLASH: {
+ /* The E5.1 specification does not seem to allow IdentifierPart characters
+ * to be used as identity escapes. Unfortunately this includes '$', which
+ * cannot be escaped as '\$'; it needs to be escaped e.g. as '\u0024'.
+ * Many other implementations (including V8 and Rhino, for instance) do
+ * accept '\$' as a valid identity escape, which is quite pragmatic, and
+ * ES2015 Annex B relaxes the rules to allow these (and other) real world forms.
+ */
+
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); /* default: char escape (two chars) */
+ if (y == DUK_ASC_LC_B) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_WORD_BOUNDARY);
+ } else if (y == DUK_ASC_UC_B) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY);
+ } else if (y == DUK_ASC_LC_F) {
+ out_token->num = 0x000c;
+ } else if (y == DUK_ASC_LC_N) {
+ out_token->num = 0x000a;
+ } else if (y == DUK_ASC_LC_T) {
+ out_token->num = 0x0009;
+ } else if (y == DUK_ASC_LC_R) {
+ out_token->num = 0x000d;
+ } else if (y == DUK_ASC_LC_V) {
+ out_token->num = 0x000b;
+ } else if (y == DUK_ASC_LC_C) {
+ x = DUK__L2();
+ if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) ||
+ (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) {
+ out_token->num = (duk_uint32_t) (x % 32);
+ advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_CHAR);
+ } else {
+ goto fail_escape;
+ }
+ } else if (y == DUK_ASC_LC_X || y == DUK_ASC_LC_U) {
+ /* The token value is the Unicode codepoint without
+ * it being decode into surrogate pair characters
+ * here. The \u{H+} is only allowed in Unicode mode
+ * which we don't support yet.
+ */
+ out_token->num = (duk_uint32_t) duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/);
+ advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_CHAR);
+ } else if (y == DUK_ASC_LC_D) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_DIGIT);
+ } else if (y == DUK_ASC_UC_D) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_DIGIT);
+ } else if (y == DUK_ASC_LC_S) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WHITE);
+ } else if (y == DUK_ASC_UC_S) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WHITE);
+ } else if (y == DUK_ASC_LC_W) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WORD_CHAR);
+ } else if (y == DUK_ASC_UC_W) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WORD_CHAR);
+ } else if (DUK__ISDIGIT(y)) {
+ /* E5 Section 15.10.2.11 */
+ if (y == DUK_ASC_0) {
+ if (DUK__ISDIGIT(DUK__L2())) {
+ goto fail_escape;
+ }
+ out_token->num = 0x0000;
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR);
+ } else {
+ /* XXX: shared parsing? */
+ duk_uint32_t val = 0;
+ duk_small_int_t i;
+ for (i = 0; ; i++) {
+ if (i >= DUK__MAX_RE_DECESC_DIGITS) {
+ goto fail_escape;
+ }
+ DUK__ADVANCECHARS(lex_ctx, 1); /* eat backslash on entry */
+ x = DUK__L0();
+ if (!DUK__ISDIGIT(x)) {
+ break;
+ }
+ val = val * 10 + (duk_uint32_t) duk__hexval(x);
+ }
+ /* DUK__L0() cannot be a digit, because the loop doesn't terminate if it is */
+ advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_BACKREFERENCE);
+ out_token->num = val;
+ }
+#if defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ } else if (y >= 0) {
+ /* For ES2015 Annex B, accept any source character as identity
+ * escape except 'c' which is used for control characters.
+ * http://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns
+ * Careful not to match end-of-buffer (<0) here.
+ * This is not yet full ES2015 Annex B because cases above
+ * (like hex escape) won't backtrack.
+ */
+ DUK_ASSERT(y != DUK_ASC_LC_C); /* covered above */
+#else /* DUK_USE_ES6_REGEXP_SYNTAX */
+ } else if ((y >= 0 && !duk_unicode_is_identifier_part(y)) ||
+ y == DUK_UNICODE_CP_ZWNJ ||
+ y == DUK_UNICODE_CP_ZWJ) {
+ /* For ES5.1 identity escapes are not allowed for identifier
+ * parts. This conflicts with a lot of real world code as this
+ * doesn't e.g. allow escaping a dollar sign as /\$/, see
+ * test-regexp-identity-escape-dollar.js.
+ */
+#endif /* DUK_USE_ES6_REGEXP_SYNTAX */
+ out_token->num = (duk_uint32_t) y;
+ } else {
+ goto fail_escape;
+ }
+ break;
+ }
+ case DUK_ASC_LPAREN: {
+ /* XXX: naming is inconsistent: ATOM_END_GROUP ends an ASSERT_START_LOOKAHEAD */
+
+ if (y == DUK_ASC_QUESTION) {
+ if (DUK__L2() == DUK_ASC_EQUALS) {
+ /* (?= */
+ advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_POS_LOOKAHEAD);
+ } else if (DUK__L2() == DUK_ASC_EXCLAMATION) {
+ /* (?! */
+ advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD);
+ } else if (DUK__L2() == DUK_ASC_COLON) {
+ /* (?: */
+ advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_START_NONCAPTURE_GROUP);
+ } else {
+ goto fail_group;
+ }
+ } else {
+ /* ( */
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CAPTURE_GROUP);
+ }
+ break;
+ }
+ case DUK_ASC_RPAREN: {
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_END_GROUP);
+ break;
+ }
+ case DUK_ASC_LBRACKET: {
+ /*
+ * To avoid creating a heavy intermediate value for the list of ranges,
+ * only the start token ('[' or '[^') is parsed here. The regexp
+ * compiler parses the ranges itself.
+ */
+
+ /* XXX: with DUK_USE_ES6_REGEXP_SYNTAX we should allow left bracket
+ * literal too, but it's not easy to parse without backtracking.
+ */
+
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CHARCLASS);
+ if (y == DUK_ASC_CARET) {
+ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_START_CHARCLASS_INVERTED);
+ }
+ break;
+ }
+#if !defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ case DUK_ASC_RCURLY:
+ case DUK_ASC_RBRACKET: {
+ /* Although these could be parsed as PatternCharacters unambiguously (here),
+ * E5 Section 15.10.1 grammar explicitly forbids these as PatternCharacters.
+ */
+ goto fail_invalid_char;
+ break;
+ }
+#endif
+ case -1: {
+ /* EOF */
+ advtok = DUK__ADVTOK(0, DUK_TOK_EOF);
+ break;
+ }
+ default: {
+ /* PatternCharacter, all excluded characters are matched by cases above */
+ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR);
+ out_token->num = (duk_uint32_t) x;
+ break;
+ }
+ }
+
+ /*
+ * Shared exit path
+ */
+
+ DUK__ADVANCEBYTES(lex_ctx, advtok >> 8);
+ out_token->t = advtok & 0xff;
+ return;
+
+ fail_token_limit:
+ DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT);
+ return;
+
+ fail_escape:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE);
+ return;
+
+ fail_group:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_GROUP);
+ return;
+
+#if !defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ fail_invalid_char:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_CHARACTER);
+ return;
+
+ fail_quantifier:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_QUANTIFIER);
+ return;
+#endif
+}
+
+/*
+ * Special parser for character classes; calls callback for every
+ * range parsed and returns the number of ranges present.
+ */
+
+/* XXX: this duplicates functionality in duk_regexp.c where a similar loop is
+ * required anyway. We could use that BUT we need to update the regexp compiler
+ * 'nranges' too. Work this out a bit more cleanly to save space.
+ */
+
+/* XXX: the handling of character range detection is a bit convoluted.
+ * Try to simplify and make smaller.
+ */
+
+/* XXX: logic for handling character ranges is now incorrect, it will accept
+ * e.g. [\d-z] whereas it should croak from it? SMJS accepts this too, though.
+ *
+ * Needs a read through and a lot of additional tests.
+ */
+
+DUK_LOCAL
+void duk__emit_u16_direct_ranges(duk_lexer_ctx *lex_ctx,
+ duk_re_range_callback gen_range,
+ void *userdata,
+ const duk_uint16_t *ranges,
+ duk_small_int_t num) {
+ const duk_uint16_t *ranges_end;
+
+ DUK_UNREF(lex_ctx);
+
+ ranges_end = ranges + num;
+ while (ranges < ranges_end) {
+ /* mark range 'direct', bypass canonicalization (see Wiki) */
+ gen_range(userdata, (duk_codepoint_t) ranges[0], (duk_codepoint_t) ranges[1], 1);
+ ranges += 2;
+ }
+}
+
+DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata) {
+ duk_codepoint_t start = -1;
+ duk_codepoint_t ch;
+ duk_codepoint_t x;
+ duk_bool_t dash = 0;
+ duk_small_uint_t adv = 0;
+
+ DUK_DD(DUK_DDPRINT("parsing regexp ranges"));
+
+ for (;;) {
+ DUK__ADVANCECHARS(lex_ctx, adv);
+ adv = 1;
+
+ x = DUK__L0();
+
+ ch = -1; /* not strictly necessary, but avoids "uninitialized variable" warnings */
+ DUK_UNREF(ch);
+
+ if (x < 0) {
+ goto fail_unterm_charclass;
+ } else if (x == DUK_ASC_RBRACKET) {
+ if (start >= 0) {
+ gen_range(userdata, start, start, 0);
+ }
+ DUK__ADVANCECHARS(lex_ctx, 1); /* eat ']' before finishing */
+ break;
+ } else if (x == DUK_ASC_MINUS) {
+ if (start >= 0 && !dash && DUK__L1() != DUK_ASC_RBRACKET) {
+ /* '-' as a range indicator */
+ dash = 1;
+ continue;
+ } else {
+ /* '-' verbatim */
+ ch = x;
+ }
+ } else if (x == DUK_ASC_BACKSLASH) {
+ /*
+ * The escapes are same as outside a character class, except that \b has a
+ * different meaning, and \B and backreferences are prohibited (see E5
+ * Section 15.10.2.19). However, it's difficult to share code because we
+ * handle e.g. "\n" very differently: here we generate a single character
+ * range for it.
+ */
+
+ /* XXX: ES2015 surrogate pair handling. */
+
+ x = DUK__L1();
+
+ adv = 2;
+
+ if (x == DUK_ASC_LC_B) {
+ /* Note: '\b' in char class is different than outside (assertion),
+ * '\B' is not allowed and is caught by the duk_unicode_is_identifier_part()
+ * check below.
+ */
+ ch = 0x0008;
+ } else if (x == DUK_ASC_LC_F) {
+ ch = 0x000c;
+ } else if (x == DUK_ASC_LC_N) {
+ ch = 0x000a;
+ } else if (x == DUK_ASC_LC_T) {
+ ch = 0x0009;
+ } else if (x == DUK_ASC_LC_R) {
+ ch = 0x000d;
+ } else if (x == DUK_ASC_LC_V) {
+ ch = 0x000b;
+ } else if (x == DUK_ASC_LC_C) {
+ x = DUK__L2();
+ adv = 3;
+ if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) ||
+ (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) {
+ ch = (x % 32);
+ } else {
+ goto fail_escape;
+ }
+ } else if (x == DUK_ASC_LC_X || x == DUK_ASC_LC_U) {
+ /* The \u{H+} form is only allowed in Unicode mode which
+ * we don't support yet.
+ */
+ ch = duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/);
+ adv = 0;
+ } else if (x == DUK_ASC_LC_D) {
+ duk__emit_u16_direct_ranges(lex_ctx,
+ gen_range,
+ userdata,
+ duk_unicode_re_ranges_digit,
+ sizeof(duk_unicode_re_ranges_digit) / sizeof(duk_uint16_t));
+ ch = -1;
+ } else if (x == DUK_ASC_UC_D) {
+ duk__emit_u16_direct_ranges(lex_ctx,
+ gen_range,
+ userdata,
+ duk_unicode_re_ranges_not_digit,
+ sizeof(duk_unicode_re_ranges_not_digit) / sizeof(duk_uint16_t));
+ ch = -1;
+ } else if (x == DUK_ASC_LC_S) {
+ duk__emit_u16_direct_ranges(lex_ctx,
+ gen_range,
+ userdata,
+ duk_unicode_re_ranges_white,
+ sizeof(duk_unicode_re_ranges_white) / sizeof(duk_uint16_t));
+ ch = -1;
+ } else if (x == DUK_ASC_UC_S) {
+ duk__emit_u16_direct_ranges(lex_ctx,
+ gen_range,
+ userdata,
+ duk_unicode_re_ranges_not_white,
+ sizeof(duk_unicode_re_ranges_not_white) / sizeof(duk_uint16_t));
+ ch = -1;
+ } else if (x == DUK_ASC_LC_W) {
+ duk__emit_u16_direct_ranges(lex_ctx,
+ gen_range,
+ userdata,
+ duk_unicode_re_ranges_wordchar,
+ sizeof(duk_unicode_re_ranges_wordchar) / sizeof(duk_uint16_t));
+ ch = -1;
+ } else if (x == DUK_ASC_UC_W) {
+ duk__emit_u16_direct_ranges(lex_ctx,
+ gen_range,
+ userdata,
+ duk_unicode_re_ranges_not_wordchar,
+ sizeof(duk_unicode_re_ranges_not_wordchar) / sizeof(duk_uint16_t));
+ ch = -1;
+ } else if (DUK__ISDIGIT(x)) {
+ /* DecimalEscape, only \0 is allowed, no leading
+ * zeroes are allowed.
+ *
+ * ES2015 Annex B also allows (maximal match) legacy
+ * octal escapes up to \377 and \8 and \9 are
+ * accepted as literal '8' and '9', also in strict mode.
+ */
+
+#if defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ ch = duk__lexer_parse_legacy_octal(lex_ctx, &adv, 0 /*reject_annex_b*/);
+ DUK_ASSERT(ch >= 0); /* no rejections */
+#else
+ if (x == DUK_ASC_0 && !DUK__ISDIGIT(DUK__L2())) {
+ ch = 0x0000;
+ } else {
+ goto fail_escape;
+ }
+#endif
+#if defined(DUK_USE_ES6_REGEXP_SYNTAX)
+ } else if (x >= 0) {
+ /* IdentityEscape: ES2015 Annex B allows almost all
+ * source characters here. Match anything except
+ * EOF here.
+ */
+ ch = x;
+#else /* DUK_USE_ES6_REGEXP_SYNTAX */
+ } else if (!duk_unicode_is_identifier_part(x)) {
+ /* IdentityEscape: ES5.1 doesn't allow identity escape
+ * for identifier part characters, which conflicts with
+ * some real world code. For example, it doesn't allow
+ * /[\$]/ which is awkward.
+ */
+ ch = x;
+#endif /* DUK_USE_ES6_REGEXP_SYNTAX */
+ } else {
+ goto fail_escape;
+ }
+ } else {
+ /* character represents itself */
+ ch = x;
+ }
+
+ /* ch is a literal character here or -1 if parsed entity was
+ * an escape such as "\s".
+ */
+
+ if (ch < 0) {
+ /* multi-character sets not allowed as part of ranges, see
+ * E5 Section 15.10.2.15, abstract operation CharacterRange.
+ */
+ if (start >= 0) {
+ if (dash) {
+ goto fail_range;
+ } else {
+ gen_range(userdata, start, start, 0);
+ start = -1;
+ /* dash is already 0 */
+ }
+ }
+ } else {
+ if (start >= 0) {
+ if (dash) {
+ if (start > ch) {
+ goto fail_range;
+ }
+ gen_range(userdata, start, ch, 0);
+ start = -1;
+ dash = 0;
+ } else {
+ gen_range(userdata, start, start, 0);
+ start = ch;
+ /* dash is already 0 */
+ }
+ } else {
+ start = ch;
+ }
+ }
+ }
+
+ return;
+
+ fail_escape:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE);
+ return;
+
+ fail_range:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_RANGE);
+ return;
+
+ fail_unterm_charclass:
+ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_CHARCLASS);
+ return;
+}
+
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+/* automatic undefs */
+#undef DUK__ADVANCEBYTES
+#undef DUK__ADVANCECHARS
+#undef DUK__ADVTOK
+#undef DUK__APPENDBUFFER
+#undef DUK__APPENDBUFFER_ASCII
+#undef DUK__INITBUFFER
+#undef DUK__ISDIGIT
+#undef DUK__ISDIGIT03
+#undef DUK__ISDIGIT47
+#undef DUK__ISHEXDIGIT
+#undef DUK__ISOCTDIGIT
+#undef DUK__L0
+#undef DUK__L1
+#undef DUK__L2
+#undef DUK__L3
+#undef DUK__L4
+#undef DUK__L5
+#undef DUK__LOOKUP
+#undef DUK__MAX_RE_DECESC_DIGITS
+#undef DUK__MAX_RE_QUANT_DIGITS
+#line 1 "duk_numconv.c"
+/*
+ * Number-to-string and string-to-number conversions.
+ *
+ * Slow path number-to-string and string-to-number conversion is based on
+ * a Dragon4 variant, with fast paths for small integers. Big integer
+ * arithmetic is needed for guaranteeing that the conversion is correct
+ * and uses a minimum number of digits. The big number arithmetic has a
+ * fixed maximum size and does not require dynamic allocations.
+ *
+ * See: doc/number-conversion.rst.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#define DUK__IEEE_DOUBLE_EXP_BIAS 1023
+#define DUK__IEEE_DOUBLE_EXP_MIN (-1022) /* biased exp == 0 -> denormal, exp -1022 */
+
+#define DUK__DIGITCHAR(x) duk_lc_digits[(x)]
+
+/*
+ * Tables generated with util/gennumdigits.py.
+ *
+ * duk__str2num_digits_for_radix indicates, for each radix, how many input
+ * digits should be considered significant for string-to-number conversion.
+ * The input is also padded to this many digits to give the Dragon4
+ * conversion enough (apparent) precision to work with.
+ *
+ * duk__str2num_exp_limits indicates, for each radix, the radix-specific
+ * minimum/maximum exponent values (for a Dragon4 integer mantissa)
+ * below and above which the number is guaranteed to underflow to zero
+ * or overflow to Infinity. This allows parsing to keep bigint values
+ * bounded.
+ */
+
+DUK_LOCAL const duk_uint8_t duk__str2num_digits_for_radix[] = {
+ 69, 44, 35, 30, 27, 25, 23, 22, 20, 20, /* 2 to 11 */
+ 20, 19, 19, 18, 18, 17, 17, 17, 16, 16, /* 12 to 21 */
+ 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, /* 22 to 31 */
+ 14, 14, 14, 14, 14 /* 31 to 36 */
+};
+
+typedef struct {
+ duk_int16_t upper;
+ duk_int16_t lower;
+} duk__exp_limits;
+
+DUK_LOCAL const duk__exp_limits duk__str2num_exp_limits[] = {
+ { 957, -1147 }, { 605, -725 }, { 479, -575 }, { 414, -496 },
+ { 372, -446 }, { 342, -411 }, { 321, -384 }, { 304, -364 },
+ { 291, -346 }, { 279, -334 }, { 268, -323 }, { 260, -312 },
+ { 252, -304 }, { 247, -296 }, { 240, -289 }, { 236, -283 },
+ { 231, -278 }, { 227, -273 }, { 223, -267 }, { 220, -263 },
+ { 216, -260 }, { 213, -256 }, { 210, -253 }, { 208, -249 },
+ { 205, -246 }, { 203, -244 }, { 201, -241 }, { 198, -239 },
+ { 196, -237 }, { 195, -234 }, { 193, -232 }, { 191, -230 },
+ { 190, -228 }, { 188, -226 }, { 187, -225 },
+};
+
+/*
+ * Limited functionality bigint implementation.
+ *
+ * Restricted to non-negative numbers with less than 32 * DUK__BI_MAX_PARTS bits,
+ * with the caller responsible for ensuring this is never exceeded. No memory
+ * allocation (except stack) is needed for bigint computation. Operations
+ * have been tailored for number conversion needs.
+ *
+ * Argument order is "assignment order", i.e. target first, then arguments:
+ * x <- y * z --> duk__bi_mul(x, y, z);
+ */
+
+/* This upper value has been experimentally determined; debug build will check
+ * bigint size with assertions.
+ */
+#define DUK__BI_MAX_PARTS 37 /* 37x32 = 1184 bits */
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+#define DUK__BI_PRINT(name,x) duk__bi_print((name),(x))
+#else
+#define DUK__BI_PRINT(name,x)
+#endif
+
+/* Current size is about 152 bytes. */
+typedef struct {
+ duk_small_int_t n;
+ duk_uint32_t v[DUK__BI_MAX_PARTS]; /* low to high */
+} duk__bigint;
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+DUK_LOCAL void duk__bi_print(const char *name, duk__bigint *x) {
+ /* Overestimate required size; debug code so not critical to be tight. */
+ char buf[DUK__BI_MAX_PARTS * 9 + 64];
+ char *p = buf;
+ duk_small_int_t i;
+
+ /* No NUL term checks in this debug code. */
+ p += DUK_SPRINTF(p, "%p n=%ld", (void *) x, (long) x->n);
+ if (x->n == 0) {
+ p += DUK_SPRINTF(p, " 0");
+ }
+ for (i = x->n - 1; i >= 0; i--) {
+ p += DUK_SPRINTF(p, " %08lx", (unsigned long) x->v[i]);
+ }
+
+ DUK_DDD(DUK_DDDPRINT("%s: %s", (const char *) name, (const char *) buf));
+}
+#endif
+
+#if defined(DUK_USE_ASSERTIONS)
+DUK_LOCAL duk_small_int_t duk__bi_is_valid(duk__bigint *x) {
+ return (duk_small_int_t)
+ ( ((x->n >= 0) && (x->n <= DUK__BI_MAX_PARTS)) /* is valid size */ &&
+ ((x->n == 0) || (x->v[x->n - 1] != 0)) /* is normalized */ );
+}
+#endif
+
+DUK_LOCAL void duk__bi_normalize(duk__bigint *x) {
+ duk_small_int_t i;
+
+ for (i = x->n - 1; i >= 0; i--) {
+ if (x->v[i] != 0) {
+ break;
+ }
+ }
+
+ /* Note: if 'x' is zero, x->n becomes 0 here */
+ x->n = i + 1;
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+
+/* x <- y */
+DUK_LOCAL void duk__bi_copy(duk__bigint *x, duk__bigint *y) {
+ duk_small_int_t n;
+
+ n = y->n;
+ x->n = n;
+ if (n == 0) {
+ return;
+ }
+ DUK_MEMCPY((void *) x->v, (const void *) y->v, (size_t) (sizeof(duk_uint32_t) * (size_t) n));
+}
+
+DUK_LOCAL void duk__bi_set_small(duk__bigint *x, duk_uint32_t v) {
+ if (v == 0U) {
+ x->n = 0;
+ } else {
+ x->n = 1;
+ x->v[0] = v;
+ }
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+
+/* Return value: <0 <=> x < y
+ * 0 <=> x == y
+ * >0 <=> x > y
+ */
+DUK_LOCAL int duk__bi_compare(duk__bigint *x, duk__bigint *y) {
+ duk_small_int_t i, nx, ny;
+ duk_uint32_t tx, ty;
+
+ DUK_ASSERT(duk__bi_is_valid(x));
+ DUK_ASSERT(duk__bi_is_valid(y));
+
+ nx = x->n;
+ ny = y->n;
+ if (nx > ny) {
+ goto ret_gt;
+ }
+ if (nx < ny) {
+ goto ret_lt;
+ }
+ for (i = nx - 1; i >= 0; i--) {
+ tx = x->v[i];
+ ty = y->v[i];
+
+ if (tx > ty) {
+ goto ret_gt;
+ }
+ if (tx < ty) {
+ goto ret_lt;
+ }
+ }
+
+ return 0;
+
+ ret_gt:
+ return 1;
+
+ ret_lt:
+ return -1;
+}
+
+/* x <- y + z */
+#if defined(DUK_USE_64BIT_OPS)
+DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) {
+ duk_uint64_t tmp;
+ duk_small_int_t i, ny, nz;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+ DUK_ASSERT(duk__bi_is_valid(z));
+
+ if (z->n > y->n) {
+ duk__bigint *t;
+ t = y; y = z; z = t;
+ }
+ DUK_ASSERT(y->n >= z->n);
+
+ ny = y->n; nz = z->n;
+ tmp = 0U;
+ for (i = 0; i < ny; i++) {
+ DUK_ASSERT(i < DUK__BI_MAX_PARTS);
+ tmp += y->v[i];
+ if (i < nz) {
+ tmp += z->v[i];
+ }
+ x->v[i] = (duk_uint32_t) (tmp & 0xffffffffUL);
+ tmp = tmp >> 32;
+ }
+ if (tmp != 0U) {
+ DUK_ASSERT(i < DUK__BI_MAX_PARTS);
+ x->v[i++] = (duk_uint32_t) tmp;
+ }
+ x->n = i;
+ DUK_ASSERT(x->n <= DUK__BI_MAX_PARTS);
+
+ /* no need to normalize */
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+#else /* DUK_USE_64BIT_OPS */
+DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) {
+ duk_uint32_t carry, tmp1, tmp2;
+ duk_small_int_t i, ny, nz;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+ DUK_ASSERT(duk__bi_is_valid(z));
+
+ if (z->n > y->n) {
+ duk__bigint *t;
+ t = y; y = z; z = t;
+ }
+ DUK_ASSERT(y->n >= z->n);
+
+ ny = y->n; nz = z->n;
+ carry = 0U;
+ for (i = 0; i < ny; i++) {
+ /* Carry is detected based on wrapping which relies on exact 32-bit
+ * types.
+ */
+ DUK_ASSERT(i < DUK__BI_MAX_PARTS);
+ tmp1 = y->v[i];
+ tmp2 = tmp1;
+ if (i < nz) {
+ tmp2 += z->v[i];
+ }
+
+ /* Careful with carry condition:
+ * - If carry not added: 0x12345678 + 0 + 0xffffffff = 0x12345677 (< 0x12345678)
+ * - If carry added: 0x12345678 + 1 + 0xffffffff = 0x12345678 (== 0x12345678)
+ */
+ if (carry) {
+ tmp2++;
+ carry = (tmp2 <= tmp1 ? 1U : 0U);
+ } else {
+ carry = (tmp2 < tmp1 ? 1U : 0U);
+ }
+
+ x->v[i] = tmp2;
+ }
+ if (carry) {
+ DUK_ASSERT(i < DUK__BI_MAX_PARTS);
+ DUK_ASSERT(carry == 1U);
+ x->v[i++] = carry;
+ }
+ x->n = i;
+ DUK_ASSERT(x->n <= DUK__BI_MAX_PARTS);
+
+ /* no need to normalize */
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+#endif /* DUK_USE_64BIT_OPS */
+
+/* x <- y + z */
+DUK_LOCAL void duk__bi_add_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) {
+ duk__bigint tmp;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+
+ /* XXX: this could be optimized; there is only one call site now though */
+ duk__bi_set_small(&tmp, z);
+ duk__bi_add(x, y, &tmp);
+
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+
+#if 0 /* unused */
+/* x <- x + y, use t as temp */
+DUK_LOCAL void duk__bi_add_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) {
+ duk__bi_add(t, x, y);
+ duk__bi_copy(x, t);
+}
+#endif
+
+/* x <- y - z, require x >= y => z >= 0, i.e. y >= z */
+#if defined(DUK_USE_64BIT_OPS)
+DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) {
+ duk_small_int_t i, ny, nz;
+ duk_uint32_t ty, tz;
+ duk_int64_t tmp;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+ DUK_ASSERT(duk__bi_is_valid(z));
+ DUK_ASSERT(duk__bi_compare(y, z) >= 0);
+ DUK_ASSERT(y->n >= z->n);
+
+ ny = y->n; nz = z->n;
+ tmp = 0;
+ for (i = 0; i < ny; i++) {
+ ty = y->v[i];
+ if (i < nz) {
+ tz = z->v[i];
+ } else {
+ tz = 0;
+ }
+ tmp = (duk_int64_t) ty - (duk_int64_t) tz + tmp;
+ x->v[i] = (duk_uint32_t) ((duk_uint64_t) tmp & 0xffffffffUL);
+ tmp = tmp >> 32; /* 0 or -1 */
+ }
+ DUK_ASSERT(tmp == 0);
+
+ x->n = i;
+ duk__bi_normalize(x); /* need to normalize, may even cancel to 0 */
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+#else
+DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) {
+ duk_small_int_t i, ny, nz;
+ duk_uint32_t tmp1, tmp2, borrow;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+ DUK_ASSERT(duk__bi_is_valid(z));
+ DUK_ASSERT(duk__bi_compare(y, z) >= 0);
+ DUK_ASSERT(y->n >= z->n);
+
+ ny = y->n; nz = z->n;
+ borrow = 0U;
+ for (i = 0; i < ny; i++) {
+ /* Borrow is detected based on wrapping which relies on exact 32-bit
+ * types.
+ */
+ tmp1 = y->v[i];
+ tmp2 = tmp1;
+ if (i < nz) {
+ tmp2 -= z->v[i];
+ }
+
+ /* Careful with borrow condition:
+ * - If borrow not subtracted: 0x12345678 - 0 - 0xffffffff = 0x12345679 (> 0x12345678)
+ * - If borrow subtracted: 0x12345678 - 1 - 0xffffffff = 0x12345678 (== 0x12345678)
+ */
+ if (borrow) {
+ tmp2--;
+ borrow = (tmp2 >= tmp1 ? 1U : 0U);
+ } else {
+ borrow = (tmp2 > tmp1 ? 1U : 0U);
+ }
+
+ x->v[i] = tmp2;
+ }
+ DUK_ASSERT(borrow == 0U);
+
+ x->n = i;
+ duk__bi_normalize(x); /* need to normalize, may even cancel to 0 */
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+#endif
+
+#if 0 /* unused */
+/* x <- y - z */
+DUK_LOCAL void duk__bi_sub_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) {
+ duk__bigint tmp;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+
+ /* XXX: this could be optimized */
+ duk__bi_set_small(&tmp, z);
+ duk__bi_sub(x, y, &tmp);
+
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+#endif
+
+/* x <- x - y, use t as temp */
+DUK_LOCAL void duk__bi_sub_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) {
+ duk__bi_sub(t, x, y);
+ duk__bi_copy(x, t);
+}
+
+/* x <- y * z */
+DUK_LOCAL void duk__bi_mul(duk__bigint *x, duk__bigint *y, duk__bigint *z) {
+ duk_small_int_t i, j, nx, nz;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+ DUK_ASSERT(duk__bi_is_valid(z));
+
+ nx = y->n + z->n; /* max possible */
+ DUK_ASSERT(nx <= DUK__BI_MAX_PARTS);
+
+ if (nx == 0) {
+ /* Both inputs are zero; cases where only one is zero can go
+ * through main algorithm.
+ */
+ x->n = 0;
+ return;
+ }
+
+ DUK_MEMZERO((void *) x->v, (size_t) (sizeof(duk_uint32_t) * (size_t) nx));
+ x->n = nx;
+
+ nz = z->n;
+ for (i = 0; i < y->n; i++) {
+#if defined(DUK_USE_64BIT_OPS)
+ duk_uint64_t tmp = 0U;
+ for (j = 0; j < nz; j++) {
+ tmp += (duk_uint64_t) y->v[i] * (duk_uint64_t) z->v[j] + x->v[i+j];
+ x->v[i+j] = (duk_uint32_t) (tmp & 0xffffffffUL);
+ tmp = tmp >> 32;
+ }
+ if (tmp > 0) {
+ DUK_ASSERT(i + j < nx);
+ DUK_ASSERT(i + j < DUK__BI_MAX_PARTS);
+ DUK_ASSERT(x->v[i+j] == 0U);
+ x->v[i+j] = (duk_uint32_t) tmp;
+ }
+#else
+ /*
+ * Multiply + add + carry for 32-bit components using only 16x16->32
+ * multiplies and carry detection based on unsigned overflow.
+ *
+ * 1st mult, 32-bit: (A*2^16 + B)
+ * 2nd mult, 32-bit: (C*2^16 + D)
+ * 3rd add, 32-bit: E
+ * 4th add, 32-bit: F
+ *
+ * (AC*2^16 + B) * (C*2^16 + D) + E + F
+ * = AC*2^32 + AD*2^16 + BC*2^16 + BD + E + F
+ * = AC*2^32 + (AD + BC)*2^16 + (BD + E + F)
+ * = AC*2^32 + AD*2^16 + BC*2^16 + (BD + E + F)
+ */
+ duk_uint32_t a, b, c, d, e, f;
+ duk_uint32_t r, s, t;
+
+ a = y->v[i]; b = a & 0xffffUL; a = a >> 16;
+
+ f = 0;
+ for (j = 0; j < nz; j++) {
+ c = z->v[j]; d = c & 0xffffUL; c = c >> 16;
+ e = x->v[i+j];
+
+ /* build result as: (r << 32) + s: start with (BD + E + F) */
+ r = 0;
+ s = b * d;
+
+ /* add E */
+ t = s + e;
+ if (t < s) { r++; } /* carry */
+ s = t;
+
+ /* add F */
+ t = s + f;
+ if (t < s) { r++; } /* carry */
+ s = t;
+
+ /* add BC*2^16 */
+ t = b * c;
+ r += (t >> 16);
+ t = s + ((t & 0xffffUL) << 16);
+ if (t < s) { r++; } /* carry */
+ s = t;
+
+ /* add AD*2^16 */
+ t = a * d;
+ r += (t >> 16);
+ t = s + ((t & 0xffffUL) << 16);
+ if (t < s) { r++; } /* carry */
+ s = t;
+
+ /* add AC*2^32 */
+ t = a * c;
+ r += t;
+
+ DUK_DDD(DUK_DDDPRINT("ab=%08lx cd=%08lx ef=%08lx -> rs=%08lx %08lx",
+ (unsigned long) y->v[i], (unsigned long) z->v[j],
+ (unsigned long) x->v[i+j], (unsigned long) r,
+ (unsigned long) s));
+
+ x->v[i+j] = s;
+ f = r;
+ }
+ if (f > 0U) {
+ DUK_ASSERT(i + j < nx);
+ DUK_ASSERT(i + j < DUK__BI_MAX_PARTS);
+ DUK_ASSERT(x->v[i+j] == 0U);
+ x->v[i+j] = (duk_uint32_t) f;
+ }
+#endif /* DUK_USE_64BIT_OPS */
+ }
+
+ duk__bi_normalize(x);
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+
+/* x <- y * z */
+DUK_LOCAL void duk__bi_mul_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) {
+ duk__bigint tmp;
+
+ DUK_ASSERT(duk__bi_is_valid(y));
+
+ /* XXX: this could be optimized */
+ duk__bi_set_small(&tmp, z);
+ duk__bi_mul(x, y, &tmp);
+
+ DUK_ASSERT(duk__bi_is_valid(x));
+}
+
+/* x <- x * y, use t as temp */
+DUK_LOCAL void duk__bi_mul_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) {
+ duk__bi_mul(t, x, y);
+ duk__bi_copy(x, t);
+}
+
+/* x <- x * y, use t as temp */
+DUK_LOCAL void duk__bi_mul_small_copy(duk__bigint *x, duk_uint32_t y, duk__bigint *t) {
+ duk__bi_mul_small(t, x, y);
+ duk__bi_copy(x, t);
+}
+
+DUK_LOCAL int duk__bi_is_even(duk__bigint *x) {
+ DUK_ASSERT(duk__bi_is_valid(x));
+ return (x->n == 0) || ((x->v[0] & 0x01) == 0);
+}
+
+DUK_LOCAL int duk__bi_is_zero(duk__bigint *x) {
+ DUK_ASSERT(duk__bi_is_valid(x));
+ return (x->n == 0); /* this is the case for normalized numbers */
+}
+
+/* Bigint is 2^52. Used to detect normalized IEEE double mantissa values
+ * which are at the lowest edge (next floating point value downwards has
+ * a different exponent). The lowest mantissa has the form:
+ *
+ * 1000........000 (52 zeroes; only "hidden bit" is set)
+ */
+DUK_LOCAL duk_small_int_t duk__bi_is_2to52(duk__bigint *x) {
+ DUK_ASSERT(duk__bi_is_valid(x));
+ return (duk_small_int_t)
+ (x->n == 2) && (x->v[0] == 0U) && (x->v[1] == (1U << (52-32)));
+}
+
+/* x <- (1<<y) */
+DUK_LOCAL void duk__bi_twoexp(duk__bigint *x, duk_small_int_t y) {
+ duk_small_int_t n, r;
+
+ n = (y / 32) + 1;
+ DUK_ASSERT(n > 0);
+ r = y % 32;
+ DUK_MEMZERO((void *) x->v, sizeof(duk_uint32_t) * (size_t) n);
+ x->n = n;
+ x->v[n - 1] = (((duk_uint32_t) 1) << r);
+}
+
+/* x <- b^y; use t1 and t2 as temps */
+DUK_LOCAL void duk__bi_exp_small(duk__bigint *x, duk_small_int_t b, duk_small_int_t y, duk__bigint *t1, duk__bigint *t2) {
+ /* Fast path the binary case */
+
+ DUK_ASSERT(x != t1 && x != t2 && t1 != t2); /* distinct bignums, easy mistake to make */
+ DUK_ASSERT(b >= 0);
+ DUK_ASSERT(y >= 0);
+
+ if (b == 2) {
+ duk__bi_twoexp(x, y);
+ return;
+ }
+
+ /* http://en.wikipedia.org/wiki/Exponentiation_by_squaring */
+
+ DUK_DDD(DUK_DDDPRINT("exp_small: b=%ld, y=%ld", (long) b, (long) y));
+
+ duk__bi_set_small(x, 1);
+ duk__bi_set_small(t1, (duk_uint32_t) b);
+ for (;;) {
+ /* Loop structure ensures that we don't compute t1^2 unnecessarily
+ * on the final round, as that might create a bignum exceeding the
+ * current DUK__BI_MAX_PARTS limit.
+ */
+ if (y & 0x01) {
+ duk__bi_mul_copy(x, t1, t2);
+ }
+ y = y >> 1;
+ if (y == 0) {
+ break;
+ }
+ duk__bi_mul_copy(t1, t1, t2);
+ }
+
+ DUK__BI_PRINT("exp_small result", x);
+}
+
+/*
+ * A Dragon4 number-to-string variant, based on:
+ *
+ * Guy L. Steele Jr., Jon L. White: "How to Print Floating-Point Numbers
+ * Accurately"
+ *
+ * Robert G. Burger, R. Kent Dybvig: "Printing Floating-Point Numbers
+ * Quickly and Accurately"
+ *
+ * The current algorithm is based on Figure 1 of the Burger-Dybvig paper,
+ * i.e. the base implementation without logarithm estimation speedups
+ * (these would increase code footprint considerably). Fixed-format output
+ * does not follow the suggestions in the paper; instead, we generate an
+ * extra digit and round-with-carry.
+ *
+ * The same algorithm is used for number parsing (with b=10 and B=2)
+ * by generating one extra digit and doing rounding manually.
+ *
+ * See doc/number-conversion.rst for limitations.
+ */
+
+/* Maximum number of digits generated. */
+#define DUK__MAX_OUTPUT_DIGITS 1040 /* (Number.MAX_VALUE).toString(2).length == 1024, + slack */
+
+/* Maximum number of characters in formatted value. */
+#define DUK__MAX_FORMATTED_LENGTH 1040 /* (-Number.MAX_VALUE).toString(2).length == 1025, + slack */
+
+/* Number and (minimum) size of bigints in the nc_ctx structure. */
+#define DUK__NUMCONV_CTX_NUM_BIGINTS 7
+#define DUK__NUMCONV_CTX_BIGINTS_SIZE (sizeof(duk__bigint) * DUK__NUMCONV_CTX_NUM_BIGINTS)
+
+typedef struct {
+ /* Currently about 7*152 = 1064 bytes. The space for these
+ * duk__bigints is used also as a temporary buffer for generating
+ * the final string. This is a bit awkard; a union would be
+ * more correct.
+ */
+ duk__bigint f, r, s, mp, mm, t1, t2;
+
+ duk_small_int_t is_s2n; /* if 1, doing a string-to-number; else doing a number-to-string */
+ duk_small_int_t is_fixed; /* if 1, doing a fixed format output (not free format) */
+ duk_small_int_t req_digits; /* requested number of output digits; 0 = free-format */
+ duk_small_int_t abs_pos; /* digit position is absolute, not relative */
+ duk_small_int_t e; /* exponent for 'f' */
+ duk_small_int_t b; /* input radix */
+ duk_small_int_t B; /* output radix */
+ duk_small_int_t k; /* see algorithm */
+ duk_small_int_t low_ok; /* see algorithm */
+ duk_small_int_t high_ok; /* see algorithm */
+ duk_small_int_t unequal_gaps; /* m+ != m- (very rarely) */
+
+ /* Buffer used for generated digits, values are in the range [0,B-1]. */
+ duk_uint8_t digits[DUK__MAX_OUTPUT_DIGITS];
+ duk_small_int_t count; /* digit count */
+} duk__numconv_stringify_ctx;
+
+/* Note: computes with 'idx' in assertions, so caller beware.
+ * 'idx' is preincremented, i.e. '1' on first call, because it
+ * is more convenient for the caller.
+ */
+#define DUK__DRAGON4_OUTPUT_PREINC(nc_ctx,preinc_idx,x) do { \
+ DUK_ASSERT((preinc_idx) - 1 >= 0); \
+ DUK_ASSERT((preinc_idx) - 1 < DUK__MAX_OUTPUT_DIGITS); \
+ ((nc_ctx)->digits[(preinc_idx) - 1]) = (duk_uint8_t) (x); \
+ } while (0)
+
+DUK_LOCAL duk_size_t duk__dragon4_format_uint32(duk_uint8_t *buf, duk_uint32_t x, duk_small_int_t radix) {
+ duk_uint8_t *p;
+ duk_size_t len;
+ duk_small_int_t dig;
+ duk_uint32_t t;
+
+ DUK_ASSERT(radix >= 2 && radix <= 36);
+
+ /* A 32-bit unsigned integer formats to at most 32 digits (the
+ * worst case happens with radix == 2). Output the digits backwards,
+ * and use a memmove() to get them in the right place.
+ */
+
+ p = buf + 32;
+ for (;;) {
+ t = x / (duk_uint32_t) radix;
+ dig = (duk_small_int_t) (x - t * (duk_uint32_t) radix);
+ x = t;
+
+ DUK_ASSERT(dig >= 0 && dig < 36);
+ *(--p) = DUK__DIGITCHAR(dig);
+
+ if (x == 0) {
+ break;
+ }
+ }
+ len = (duk_size_t) ((buf + 32) - p);
+
+ DUK_MEMMOVE((void *) buf, (const void *) p, (size_t) len);
+
+ return len;
+}
+
+DUK_LOCAL void duk__dragon4_prepare(duk__numconv_stringify_ctx *nc_ctx) {
+ duk_small_int_t lowest_mantissa;
+
+#if 1
+ /* Assume IEEE round-to-even, so that shorter encoding can be used
+ * when round-to-even would produce correct result. By removing
+ * this check (and having low_ok == high_ok == 0) the results would
+ * still be accurate but in some cases longer than necessary.
+ */
+ if (duk__bi_is_even(&nc_ctx->f)) {
+ DUK_DDD(DUK_DDDPRINT("f is even"));
+ nc_ctx->low_ok = 1;
+ nc_ctx->high_ok = 1;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("f is odd"));
+ nc_ctx->low_ok = 0;
+ nc_ctx->high_ok = 0;
+ }
+#else
+ /* Note: not honoring round-to-even should work but now generates incorrect
+ * results. For instance, 1e23 serializes to "a000...", i.e. the first digit
+ * equals the radix (10). Scaling stops one step too early in this case.
+ * Don't know why this is the case, but since this code path is unused, it
+ * doesn't matter.
+ */
+ nc_ctx->low_ok = 0;
+ nc_ctx->high_ok = 0;
+#endif
+
+ /* For string-to-number, pretend we never have the lowest mantissa as there
+ * is no natural "precision" for inputs. Having lowest_mantissa == 0, we'll
+ * fall into the base cases for both e >= 0 and e < 0.
+ */
+ if (nc_ctx->is_s2n) {
+ lowest_mantissa = 0;
+ } else {
+ lowest_mantissa = duk__bi_is_2to52(&nc_ctx->f);
+ }
+
+ nc_ctx->unequal_gaps = 0;
+ if (nc_ctx->e >= 0) {
+ /* exponent non-negative (and thus not minimum exponent) */
+
+ if (lowest_mantissa) {
+ /* (>= e 0) AND (= f (expt b (- p 1)))
+ *
+ * be <- (expt b e) == b^e
+ * be1 <- (* be b) == (expt b (+ e 1)) == b^(e+1)
+ * r <- (* f be1 2) == 2 * f * b^(e+1) [if b==2 -> f * b^(e+2)]
+ * s <- (* b 2) [if b==2 -> 4]
+ * m+ <- be1 == b^(e+1)
+ * m- <- be == b^e
+ * k <- 0
+ * B <- B
+ * low_ok <- round
+ * high_ok <- round
+ */
+
+ DUK_DDD(DUK_DDDPRINT("non-negative exponent (not smallest exponent); "
+ "lowest mantissa value for this exponent -> "
+ "unequal gaps"));
+
+ duk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2); /* mm <- b^e */
+ duk__bi_mul_small(&nc_ctx->mp, &nc_ctx->mm, (duk_uint32_t) nc_ctx->b); /* mp <- b^(e+1) */
+ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2);
+ duk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp); /* r <- (2 * f) * b^(e+1) */
+ duk__bi_set_small(&nc_ctx->s, (duk_uint32_t) (nc_ctx->b * 2)); /* s <- 2 * b */
+ nc_ctx->unequal_gaps = 1;
+ } else {
+ /* (>= e 0) AND (not (= f (expt b (- p 1))))
+ *
+ * be <- (expt b e) == b^e
+ * r <- (* f be 2) == 2 * f * b^e [if b==2 -> f * b^(e+1)]
+ * s <- 2
+ * m+ <- be == b^e
+ * m- <- be == b^e
+ * k <- 0
+ * B <- B
+ * low_ok <- round
+ * high_ok <- round
+ */
+
+ DUK_DDD(DUK_DDDPRINT("non-negative exponent (not smallest exponent); "
+ "not lowest mantissa for this exponent -> "
+ "equal gaps"));
+
+ duk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2); /* mm <- b^e */
+ duk__bi_copy(&nc_ctx->mp, &nc_ctx->mm); /* mp <- b^e */
+ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2);
+ duk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp); /* r <- (2 * f) * b^e */
+ duk__bi_set_small(&nc_ctx->s, 2); /* s <- 2 */
+ }
+ } else {
+ /* When doing string-to-number, lowest_mantissa is always 0 so
+ * the exponent check, while incorrect, won't matter.
+ */
+ if (nc_ctx->e > DUK__IEEE_DOUBLE_EXP_MIN /*not minimum exponent*/ &&
+ lowest_mantissa /* lowest mantissa for this exponent*/) {
+ /* r <- (* f b 2) [if b==2 -> (* f 4)]
+ * s <- (* (expt b (- 1 e)) 2) == b^(1-e) * 2 [if b==2 -> b^(2-e)]
+ * m+ <- b == 2
+ * m- <- 1
+ * k <- 0
+ * B <- B
+ * low_ok <- round
+ * high_ok <- round
+ */
+
+ DUK_DDD(DUK_DDDPRINT("negative exponent; not minimum exponent and "
+ "lowest mantissa for this exponent -> "
+ "unequal gaps"));
+
+ duk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, (duk_uint32_t) (nc_ctx->b * 2)); /* r <- (2 * b) * f */
+ duk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, 1 - nc_ctx->e, &nc_ctx->s, &nc_ctx->t2); /* NB: use 's' as temp on purpose */
+ duk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2); /* s <- b^(1-e) * 2 */
+ duk__bi_set_small(&nc_ctx->mp, 2);
+ duk__bi_set_small(&nc_ctx->mm, 1);
+ nc_ctx->unequal_gaps = 1;
+ } else {
+ /* r <- (* f 2)
+ * s <- (* (expt b (- e)) 2) == b^(-e) * 2 [if b==2 -> b^(1-e)]
+ * m+ <- 1
+ * m- <- 1
+ * k <- 0
+ * B <- B
+ * low_ok <- round
+ * high_ok <- round
+ */
+
+ DUK_DDD(DUK_DDDPRINT("negative exponent; minimum exponent or not "
+ "lowest mantissa for this exponent -> "
+ "equal gaps"));
+
+ duk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, 2); /* r <- 2 * f */
+ duk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, -nc_ctx->e, &nc_ctx->s, &nc_ctx->t2); /* NB: use 's' as temp on purpose */
+ duk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2); /* s <- b^(-e) * 2 */
+ duk__bi_set_small(&nc_ctx->mp, 1);
+ duk__bi_set_small(&nc_ctx->mm, 1);
+ }
+ }
+}
+
+DUK_LOCAL void duk__dragon4_scale(duk__numconv_stringify_ctx *nc_ctx) {
+ duk_small_int_t k = 0;
+
+ /* This is essentially the 'scale' algorithm, with recursion removed.
+ * Note that 'k' is either correct immediately, or will move in one
+ * direction in the loop. There's no need to do the low/high checks
+ * on every round (like the Scheme algorithm does).
+ *
+ * The scheme algorithm finds 'k' and updates 's' simultaneously,
+ * while the logical algorithm finds 'k' with 's' having its initial
+ * value, after which 's' is updated separately (see the Burger-Dybvig
+ * paper, Section 3.1, steps 2 and 3).
+ *
+ * The case where m+ == m- (almost always) is optimized for, because
+ * it reduces the bigint operations considerably and almost always
+ * applies. The scale loop only needs to work with m+, so this works.
+ */
+
+ /* XXX: this algorithm could be optimized quite a lot by using e.g.
+ * a logarithm based estimator for 'k' and performing B^n multiplication
+ * using a lookup table or using some bit-representation based exp
+ * algorithm. Currently we just loop, with significant performance
+ * impact for very large and very small numbers.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("scale: B=%ld, low_ok=%ld, high_ok=%ld",
+ (long) nc_ctx->B, (long) nc_ctx->low_ok, (long) nc_ctx->high_ok));
+ DUK__BI_PRINT("r(init)", &nc_ctx->r);
+ DUK__BI_PRINT("s(init)", &nc_ctx->s);
+ DUK__BI_PRINT("mp(init)", &nc_ctx->mp);
+ DUK__BI_PRINT("mm(init)", &nc_ctx->mm);
+
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("scale loop (inc k), k=%ld", (long) k));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("m+", &nc_ctx->mp);
+ DUK__BI_PRINT("m-", &nc_ctx->mm);
+
+ duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 = (+ r m+) */
+ if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1)) {
+ DUK_DDD(DUK_DDDPRINT("k is too low"));
+ /* r <- r
+ * s <- (* s B)
+ * m+ <- m+
+ * m- <- m-
+ * k <- (+ k 1)
+ */
+
+ duk__bi_mul_small_copy(&nc_ctx->s, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);
+ k++;
+ } else {
+ break;
+ }
+ }
+
+ /* k > 0 -> k was too low, and cannot be too high */
+ if (k > 0) {
+ goto skip_dec_k;
+ }
+
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("scale loop (dec k), k=%ld", (long) k));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("m+", &nc_ctx->mp);
+ DUK__BI_PRINT("m-", &nc_ctx->mm);
+
+ duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 = (+ r m+) */
+ duk__bi_mul_small(&nc_ctx->t2, &nc_ctx->t1, (duk_uint32_t) nc_ctx->B); /* t2 = (* (+ r m+) B) */
+ if (duk__bi_compare(&nc_ctx->t2, &nc_ctx->s) <= (nc_ctx->high_ok ? -1 : 0)) {
+ DUK_DDD(DUK_DDDPRINT("k is too high"));
+ /* r <- (* r B)
+ * s <- s
+ * m+ <- (* m+ B)
+ * m- <- (* m- B)
+ * k <- (- k 1)
+ */
+ duk__bi_mul_small_copy(&nc_ctx->r, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);
+ duk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);
+ if (nc_ctx->unequal_gaps) {
+ DUK_DDD(DUK_DDDPRINT("m+ != m- -> need to update m- too"));
+ duk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);
+ }
+ k--;
+ } else {
+ break;
+ }
+ }
+
+ skip_dec_k:
+
+ if (!nc_ctx->unequal_gaps) {
+ DUK_DDD(DUK_DDDPRINT("equal gaps, copy m- from m+"));
+ duk__bi_copy(&nc_ctx->mm, &nc_ctx->mp); /* mm <- mp */
+ }
+ nc_ctx->k = k;
+
+ DUK_DDD(DUK_DDDPRINT("final k: %ld", (long) k));
+ DUK__BI_PRINT("r(final)", &nc_ctx->r);
+ DUK__BI_PRINT("s(final)", &nc_ctx->s);
+ DUK__BI_PRINT("mp(final)", &nc_ctx->mp);
+ DUK__BI_PRINT("mm(final)", &nc_ctx->mm);
+}
+
+DUK_LOCAL void duk__dragon4_generate(duk__numconv_stringify_ctx *nc_ctx) {
+ duk_small_int_t tc1, tc2; /* terminating conditions */
+ duk_small_int_t d; /* current digit */
+ duk_small_int_t count = 0; /* digit count */
+
+ /*
+ * Digit generation loop.
+ *
+ * Different termination conditions:
+ *
+ * 1. Free format output. Terminate when shortest accurate
+ * representation found.
+ *
+ * 2. Fixed format output, with specific number of digits.
+ * Ignore termination conditions, terminate when digits
+ * generated. Caller requests an extra digit and rounds.
+ *
+ * 3. Fixed format output, with a specific absolute cut-off
+ * position (e.g. 10 digits after decimal point). Note
+ * that we always generate at least one digit, even if
+ * the digit is below the cut-off point already.
+ */
+
+ for (;;) {
+ DUK_DDD(DUK_DDDPRINT("generate loop, count=%ld, k=%ld, B=%ld, low_ok=%ld, high_ok=%ld",
+ (long) count, (long) nc_ctx->k, (long) nc_ctx->B,
+ (long) nc_ctx->low_ok, (long) nc_ctx->high_ok));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("m+", &nc_ctx->mp);
+ DUK__BI_PRINT("m-", &nc_ctx->mm);
+
+ /* (quotient-remainder (* r B) s) using a dummy subtraction loop */
+ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, (duk_uint32_t) nc_ctx->B); /* t1 <- (* r B) */
+ d = 0;
+ for (;;) {
+ if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) {
+ break;
+ }
+ duk__bi_sub_copy(&nc_ctx->t1, &nc_ctx->s, &nc_ctx->t2); /* t1 <- t1 - s */
+ d++;
+ }
+ duk__bi_copy(&nc_ctx->r, &nc_ctx->t1); /* r <- (remainder (* r B) s) */
+ /* d <- (quotient (* r B) s) (in range 0...B-1) */
+ DUK_DDD(DUK_DDDPRINT("-> d(quot)=%ld", (long) d));
+ DUK__BI_PRINT("r(rem)", &nc_ctx->r);
+
+ duk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m+ <- (* m+ B) */
+ duk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m- <- (* m- B) */
+ DUK__BI_PRINT("mp(upd)", &nc_ctx->mp);
+ DUK__BI_PRINT("mm(upd)", &nc_ctx->mm);
+
+ /* Terminating conditions. For fixed width output, we just ignore the
+ * terminating conditions (and pretend that tc1 == tc2 == false). The
+ * the current shortcut for fixed-format output is to generate a few
+ * extra digits and use rounding (with carry) to finish the output.
+ */
+
+ if (nc_ctx->is_fixed == 0) {
+ /* free-form */
+ tc1 = (duk__bi_compare(&nc_ctx->r, &nc_ctx->mm) <= (nc_ctx->low_ok ? 0 : -1));
+
+ duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 <- (+ r m+) */
+ tc2 = (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1));
+
+ DUK_DDD(DUK_DDDPRINT("tc1=%ld, tc2=%ld", (long) tc1, (long) tc2));
+ } else {
+ /* fixed-format */
+ tc1 = 0;
+ tc2 = 0;
+ }
+
+ /* Count is incremented before DUK__DRAGON4_OUTPUT_PREINC() call
+ * on purpose, which is taken into account by the macro.
+ */
+ count++;
+
+ if (tc1) {
+ if (tc2) {
+ /* tc1 = true, tc2 = true */
+ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, 2);
+ if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) { /* (< (* r 2) s) */
+ DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=true, 2r > s: output d --> %ld (k=%ld)",
+ (long) d, (long) nc_ctx->k));
+ DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=true, 2r <= s: output d+1 --> %ld (k=%ld)",
+ (long) (d + 1), (long) nc_ctx->k));
+ DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1);
+ }
+ break;
+ } else {
+ /* tc1 = true, tc2 = false */
+ DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=false: output d --> %ld (k=%ld)",
+ (long) d, (long) nc_ctx->k));
+ DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d);
+ break;
+ }
+ } else {
+ if (tc2) {
+ /* tc1 = false, tc2 = true */
+ DUK_DDD(DUK_DDDPRINT("tc1=false, tc2=true: output d+1 --> %ld (k=%ld)",
+ (long) (d + 1), (long) nc_ctx->k));
+ DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1);
+ break;
+ } else {
+ /* tc1 = false, tc2 = false */
+ DUK_DDD(DUK_DDDPRINT("tc1=false, tc2=false: output d --> %ld (k=%ld)",
+ (long) d, (long) nc_ctx->k));
+ DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d);
+
+ /* r <- r (updated above: r <- (remainder (* r B) s)
+ * s <- s
+ * m+ <- m+ (updated above: m+ <- (* m+ B)
+ * m- <- m- (updated above: m- <- (* m- B)
+ * B, low_ok, high_ok are fixed
+ */
+
+ /* fall through and continue for-loop */
+ }
+ }
+
+ /* fixed-format termination conditions */
+ if (nc_ctx->is_fixed) {
+ if (nc_ctx->abs_pos) {
+ int pos = nc_ctx->k - count + 1; /* count is already incremented, take into account */
+ DUK_DDD(DUK_DDDPRINT("fixed format, absolute: abs pos=%ld, k=%ld, count=%ld, req=%ld",
+ (long) pos, (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits));
+ if (pos <= nc_ctx->req_digits) {
+ DUK_DDD(DUK_DDDPRINT("digit position reached req_digits, end generate loop"));
+ break;
+ }
+ } else {
+ DUK_DDD(DUK_DDDPRINT("fixed format, relative: k=%ld, count=%ld, req=%ld",
+ (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits));
+ if (count >= nc_ctx->req_digits) {
+ DUK_DDD(DUK_DDDPRINT("digit count reached req_digits, end generate loop"));
+ break;
+ }
+ }
+ }
+ } /* for */
+
+ nc_ctx->count = count;
+
+ DUK_DDD(DUK_DDDPRINT("generate finished"));
+
+#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)
+ {
+ duk_uint8_t buf[2048];
+ duk_small_int_t i, t;
+ DUK_MEMZERO(buf, sizeof(buf));
+ for (i = 0; i < nc_ctx->count; i++) {
+ t = nc_ctx->digits[i];
+ if (t < 0 || t > 36) {
+ buf[i] = (duk_uint8_t) '?';
+ } else {
+ buf[i] = (duk_uint8_t) DUK__DIGITCHAR(t);
+ }
+ }
+ DUK_DDD(DUK_DDDPRINT("-> generated digits; k=%ld, digits='%s'",
+ (long) nc_ctx->k, (const char *) buf));
+ }
+#endif
+}
+
+/* Round up digits to a given position. If position is out-of-bounds,
+ * does nothing. If carry propagates over the first digit, a '1' is
+ * prepended to digits and 'k' will be updated. Return value indicates
+ * whether carry propagated over the first digit.
+ *
+ * Note that nc_ctx->count is NOT updated based on the rounding position
+ * (it is updated only if carry overflows over the first digit and an
+ * extra digit is prepended).
+ */
+DUK_LOCAL duk_small_int_t duk__dragon4_fixed_format_round(duk__numconv_stringify_ctx *nc_ctx, duk_small_int_t round_idx) {
+ duk_small_int_t t;
+ duk_uint8_t *p;
+ duk_uint8_t roundup_limit;
+ duk_small_int_t ret = 0;
+
+ /*
+ * round_idx points to the digit which is considered for rounding; the
+ * digit to its left is the final digit of the rounded value. If round_idx
+ * is zero, rounding will be performed; the result will either be an empty
+ * rounded value or if carry happens a '1' digit is generated.
+ */
+
+ if (round_idx >= nc_ctx->count) {
+ DUK_DDD(DUK_DDDPRINT("round_idx out of bounds (%ld >= %ld (count)) -> no rounding",
+ (long) round_idx, (long) nc_ctx->count));
+ return 0;
+ } else if (round_idx < 0) {
+ DUK_DDD(DUK_DDDPRINT("round_idx out of bounds (%ld < 0) -> no rounding",
+ (long) round_idx));
+ return 0;
+ }
+
+ /*
+ * Round-up limit.
+ *
+ * For even values, divides evenly, e.g. 10 -> roundup_limit=5.
+ *
+ * For odd values, rounds up, e.g. 3 -> roundup_limit=2.
+ * If radix is 3, 0/3 -> down, 1/3 -> down, 2/3 -> up.
+ */
+ roundup_limit = (duk_uint8_t) ((nc_ctx->B + 1) / 2);
+
+ p = &nc_ctx->digits[round_idx];
+ if (*p >= roundup_limit) {
+ DUK_DDD(DUK_DDDPRINT("fixed-format rounding carry required"));
+ /* carry */
+ for (;;) {
+ *p = 0;
+ if (p == &nc_ctx->digits[0]) {
+ DUK_DDD(DUK_DDDPRINT("carry propagated to first digit -> special case handling"));
+ DUK_MEMMOVE((void *) (&nc_ctx->digits[1]),
+ (const void *) (&nc_ctx->digits[0]),
+ (size_t) (sizeof(char) * (size_t) nc_ctx->count));
+ nc_ctx->digits[0] = 1; /* don't increase 'count' */
+ nc_ctx->k++; /* position of highest digit changed */
+ nc_ctx->count++; /* number of digits changed */
+ ret = 1;
+ break;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("fixed-format rounding carry: B=%ld, roundup_limit=%ld, p=%p, digits=%p",
+ (long) nc_ctx->B, (long) roundup_limit, (void *) p, (void *) nc_ctx->digits));
+ p--;
+ t = *p;
+ DUK_DDD(DUK_DDDPRINT("digit before carry: %ld", (long) t));
+ if (++t < nc_ctx->B) {
+ DUK_DDD(DUK_DDDPRINT("rounding carry terminated"));
+ *p = (duk_uint8_t) t;
+ break;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("wraps, carry to next digit"));
+ }
+ }
+
+ return ret;
+}
+
+#define DUK__NO_EXP (65536) /* arbitrary marker, outside valid exp range */
+
+DUK_LOCAL void duk__dragon4_convert_and_push(duk__numconv_stringify_ctx *nc_ctx,
+ duk_hthread *thr,
+ duk_small_int_t radix,
+ duk_small_int_t digits,
+ duk_small_uint_t flags,
+ duk_small_int_t neg) {
+ duk_small_int_t k;
+ duk_small_int_t pos, pos_end;
+ duk_small_int_t expt;
+ duk_small_int_t dig;
+ duk_uint8_t *q;
+ duk_uint8_t *buf;
+
+ /*
+ * The string conversion here incorporates all the necessary Ecmascript
+ * semantics without attempting to be generic. nc_ctx->digits contains
+ * nc_ctx->count digits (>= 1), with the topmost digit's 'position'
+ * indicated by nc_ctx->k as follows:
+ *
+ * digits="123" count=3 k=0 --> 0.123
+ * digits="123" count=3 k=1 --> 1.23
+ * digits="123" count=3 k=5 --> 12300
+ * digits="123" count=3 k=-1 --> 0.0123
+ *
+ * Note that the identifier names used for format selection are different
+ * in Burger-Dybvig paper and Ecmascript specification (quite confusingly
+ * so, because e.g. 'k' has a totally different meaning in each). See
+ * documentation for discussion.
+ *
+ * Ecmascript doesn't specify any specific behavior for format selection
+ * (e.g. when to use exponent notation) for non-base-10 numbers.
+ *
+ * The bigint space in the context is reused for string output, as there
+ * is more than enough space for that (>1kB at the moment), and we avoid
+ * allocating even more stack.
+ */
+
+ DUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= DUK__MAX_FORMATTED_LENGTH);
+ DUK_ASSERT(nc_ctx->count >= 1);
+
+ k = nc_ctx->k;
+ buf = (duk_uint8_t *) &nc_ctx->f; /* XXX: union would be more correct */
+ q = buf;
+
+ /* Exponent handling: if exponent format is used, record exponent value and
+ * fake k such that one leading digit is generated (e.g. digits=123 -> "1.23").
+ *
+ * toFixed() prevents exponent use; otherwise apply a set of criteria to
+ * match the other API calls (toString(), toPrecision, etc).
+ */
+
+ expt = DUK__NO_EXP;
+ if (!nc_ctx->abs_pos /* toFixed() */) {
+ if ((flags & DUK_N2S_FLAG_FORCE_EXP) || /* exponential notation forced */
+ ((flags & DUK_N2S_FLAG_NO_ZERO_PAD) && /* fixed precision and zero padding would be required */
+ (k - digits >= 1)) || /* (e.g. k=3, digits=2 -> "12X") */
+ ((k > 21 || k <= -6) && (radix == 10))) { /* toString() conditions */
+ DUK_DDD(DUK_DDDPRINT("use exponential notation: k=%ld -> expt=%ld",
+ (long) k, (long) (k - 1)));
+ expt = k - 1; /* e.g. 12.3 -> digits="123" k=2 -> 1.23e1 */
+ k = 1; /* generate mantissa with a single leading whole number digit */
+ }
+ }
+
+ if (neg) {
+ *q++ = '-';
+ }
+
+ /* Start position (inclusive) and end position (exclusive) */
+ pos = (k >= 1 ? k : 1);
+ if (nc_ctx->is_fixed) {
+ if (nc_ctx->abs_pos) {
+ /* toFixed() */
+ pos_end = -digits;
+ } else {
+ pos_end = k - digits;
+ }
+ } else {
+ pos_end = k - nc_ctx->count;
+ }
+ if (pos_end > 0) {
+ pos_end = 0;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("expt=%ld, k=%ld, count=%ld, pos=%ld, pos_end=%ld, is_fixed=%ld, "
+ "digits=%ld, abs_pos=%ld",
+ (long) expt, (long) k, (long) nc_ctx->count, (long) pos, (long) pos_end,
+ (long) nc_ctx->is_fixed, (long) digits, (long) nc_ctx->abs_pos));
+
+ /* Digit generation */
+ while (pos > pos_end) {
+ DUK_DDD(DUK_DDDPRINT("digit generation: pos=%ld, pos_end=%ld",
+ (long) pos, (long) pos_end));
+ if (pos == 0) {
+ *q++ = (duk_uint8_t) '.';
+ }
+ if (pos > k) {
+ *q++ = (duk_uint8_t) '0';
+ } else if (pos <= k - nc_ctx->count) {
+ *q++ = (duk_uint8_t) '0';
+ } else {
+ dig = nc_ctx->digits[k - pos];
+ DUK_ASSERT(dig >= 0 && dig < nc_ctx->B);
+ *q++ = (duk_uint8_t) DUK__DIGITCHAR(dig);
+ }
+
+ pos--;
+ }
+ DUK_ASSERT(pos <= 1);
+
+ /* Exponent */
+ if (expt != DUK__NO_EXP) {
+ /*
+ * Exponent notation for non-base-10 numbers isn't specified in Ecmascript
+ * specification, as it never explicitly turns up: non-decimal numbers can
+ * only be formatted with Number.prototype.toString([radix]) and for that,
+ * behavior is not explicitly specified.
+ *
+ * Logical choices include formatting the exponent as decimal (e.g. binary
+ * 100000 as 1e+5) or in current radix (e.g. binary 100000 as 1e+101).
+ * The Dragon4 algorithm (in the original paper) prints the exponent value
+ * in the target radix B. However, for radix values 15 and above, the
+ * exponent separator 'e' is no longer easily parseable. Consider, for
+ * instance, the number "1.faecee+1c".
+ */
+
+ duk_size_t len;
+ char expt_sign;
+
+ *q++ = 'e';
+ if (expt >= 0) {
+ expt_sign = '+';
+ } else {
+ expt_sign = '-';
+ expt = -expt;
+ }
+ *q++ = (duk_uint8_t) expt_sign;
+ len = duk__dragon4_format_uint32(q, (duk_uint32_t) expt, radix);
+ q += len;
+ }
+
+ duk_push_lstring(thr, (const char *) buf, (size_t) (q - buf));
+}
+
+/*
+ * Conversion helpers
+ */
+
+DUK_LOCAL void duk__dragon4_double_to_ctx(duk__numconv_stringify_ctx *nc_ctx, duk_double_t x) {
+ duk_double_union u;
+ duk_uint32_t tmp;
+ duk_small_int_t expt;
+
+ /*
+ * seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
+ * A B C D E F G H
+ *
+ * s sign bit
+ * eee... exponent field
+ * fff... fraction
+ *
+ * ieee value = 1.ffff... * 2^(e - 1023) (normal)
+ * = 0.ffff... * 2^(-1022) (denormal)
+ *
+ * algorithm v = f * b^e
+ */
+
+ DUK_DBLUNION_SET_DOUBLE(&u, x);
+
+ nc_ctx->f.n = 2;
+
+ tmp = DUK_DBLUNION_GET_LOW32(&u);
+ nc_ctx->f.v[0] = tmp;
+ tmp = DUK_DBLUNION_GET_HIGH32(&u);
+ nc_ctx->f.v[1] = tmp & 0x000fffffUL;
+ expt = (duk_small_int_t) ((tmp >> 20) & 0x07ffUL);
+
+ if (expt == 0) {
+ /* denormal */
+ expt = DUK__IEEE_DOUBLE_EXP_MIN - 52;
+ duk__bi_normalize(&nc_ctx->f);
+ } else {
+ /* normal: implicit leading 1-bit */
+ nc_ctx->f.v[1] |= 0x00100000UL;
+ expt = expt - DUK__IEEE_DOUBLE_EXP_BIAS - 52;
+ DUK_ASSERT(duk__bi_is_valid(&nc_ctx->f)); /* true, because v[1] has at least one bit set */
+ }
+
+ DUK_ASSERT(duk__bi_is_valid(&nc_ctx->f));
+
+ nc_ctx->e = expt;
+}
+
+DUK_LOCAL void duk__dragon4_ctx_to_double(duk__numconv_stringify_ctx *nc_ctx, duk_double_t *x) {
+ duk_double_union u;
+ duk_small_int_t expt;
+ duk_small_int_t i;
+ duk_small_int_t bitstart;
+ duk_small_int_t bitround;
+ duk_small_int_t bitidx;
+ duk_small_int_t skip_round;
+ duk_uint32_t t, v;
+
+ DUK_ASSERT(nc_ctx->count == 53 + 1);
+
+ /* Sometimes this assert is not true right now; it will be true after
+ * rounding. See: test-bug-numconv-mantissa-assert.js.
+ */
+ DUK_ASSERT_DISABLE(nc_ctx->digits[0] == 1); /* zero handled by caller */
+
+ /* Should not be required because the code below always sets both high
+ * and low parts, but at least gcc-4.4.5 fails to deduce this correctly
+ * (perhaps because the low part is set (seemingly) conditionally in a
+ * loop), so this is here to avoid the bogus warning.
+ */
+ DUK_MEMZERO((void *) &u, sizeof(u));
+
+ /*
+ * Figure out how generated digits match up with the mantissa,
+ * and then perform rounding. If mantissa overflows, need to
+ * recompute the exponent (it is bumped and may overflow to
+ * infinity).
+ *
+ * For normal numbers the leading '1' is hidden and ignored,
+ * and the last bit is used for rounding:
+ *
+ * rounding pt
+ * <--------52------->|
+ * 1 x x x x ... x x x x|y ==> x x x x ... x x x x
+ *
+ * For denormals, the leading '1' is included in the number,
+ * and the rounding point is different:
+ *
+ * rounding pt
+ * <--52 or less--->|
+ * 1 x x x x ... x x|x x y ==> 0 0 ... 1 x x ... x x
+ *
+ * The largest denormals will have a mantissa beginning with
+ * a '1' (the explicit leading bit); smaller denormals will
+ * have leading zero bits.
+ *
+ * If the exponent would become too high, the result becomes
+ * Infinity. If the exponent is so small that the entire
+ * mantissa becomes zero, the result becomes zero.
+ *
+ * Note: the Dragon4 'k' is off-by-one with respect to the IEEE
+ * exponent. For instance, k==0 indicates that the leading '1'
+ * digit is at the first binary fraction position (0.1xxx...);
+ * the corresponding IEEE exponent would be -1.
+ */
+
+ skip_round = 0;
+
+ recheck_exp:
+
+ expt = nc_ctx->k - 1; /* IEEE exp without bias */
+ if (expt > 1023) {
+ /* Infinity */
+ bitstart = -255; /* needed for inf: causes mantissa to become zero,
+ * and rounding to be skipped.
+ */
+ expt = 2047;
+ } else if (expt >= -1022) {
+ /* normal */
+ bitstart = 1; /* skip leading digit */
+ expt += DUK__IEEE_DOUBLE_EXP_BIAS;
+ DUK_ASSERT(expt >= 1 && expt <= 2046);
+ } else {
+ /* denormal or zero */
+ bitstart = 1023 + expt; /* expt==-1023 -> bitstart=0 (leading 1);
+ * expt==-1024 -> bitstart=-1 (one left of leading 1), etc
+ */
+ expt = 0;
+ }
+ bitround = bitstart + 52;
+
+ DUK_DDD(DUK_DDDPRINT("ieee expt=%ld, bitstart=%ld, bitround=%ld",
+ (long) expt, (long) bitstart, (long) bitround));
+
+ if (!skip_round) {
+ if (duk__dragon4_fixed_format_round(nc_ctx, bitround)) {
+ /* Corner case: see test-numconv-parse-mant-carry.js. We could
+ * just bump the exponent and update bitstart, but it's more robust
+ * to recompute (but avoid rounding twice).
+ */
+ DUK_DDD(DUK_DDDPRINT("rounding caused exponent to be bumped, recheck exponent"));
+ skip_round = 1;
+ goto recheck_exp;
+ }
+ }
+
+ /*
+ * Create mantissa
+ */
+
+ t = 0;
+ for (i = 0; i < 52; i++) {
+ bitidx = bitstart + 52 - 1 - i;
+ if (bitidx >= nc_ctx->count) {
+ v = 0;
+ } else if (bitidx < 0) {
+ v = 0;
+ } else {
+ v = nc_ctx->digits[bitidx];
+ }
+ DUK_ASSERT(v == 0 || v == 1);
+ t += v << (i % 32);
+ if (i == 31) {
+ /* low 32 bits is complete */
+ DUK_DBLUNION_SET_LOW32(&u, t);
+ t = 0;
+ }
+ }
+ /* t has high mantissa */
+
+ DUK_DDD(DUK_DDDPRINT("mantissa is complete: %08lx %08lx",
+ (unsigned long) t,
+ (unsigned long) DUK_DBLUNION_GET_LOW32(&u)));
+
+ DUK_ASSERT(expt >= 0 && expt <= 0x7ffL);
+ t += ((duk_uint32_t) expt) << 20;
+#if 0 /* caller handles sign change */
+ if (negative) {
+ t |= 0x80000000U;
+ }
+#endif
+ DUK_DBLUNION_SET_HIGH32(&u, t);
+
+ DUK_DDD(DUK_DDDPRINT("number is complete: %08lx %08lx",
+ (unsigned long) DUK_DBLUNION_GET_HIGH32(&u),
+ (unsigned long) DUK_DBLUNION_GET_LOW32(&u)));
+
+ *x = DUK_DBLUNION_GET_DOUBLE(&u);
+}
+
+/*
+ * Exposed number-to-string API
+ *
+ * Input: [ number ]
+ * Output: [ string ]
+ */
+
+DUK_INTERNAL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags) {
+ duk_double_t x;
+ duk_small_int_t c;
+ duk_small_int_t neg;
+ duk_uint32_t uval;
+ duk__numconv_stringify_ctx nc_ctx_alloc; /* large context; around 2kB now */
+ duk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc;
+
+ x = (duk_double_t) duk_require_number(thr, -1);
+ duk_pop(thr);
+
+ /*
+ * Handle special cases (NaN, infinity, zero).
+ */
+
+ c = (duk_small_int_t) DUK_FPCLASSIFY(x);
+ if (DUK_SIGNBIT((double) x)) {
+ x = -x;
+ neg = 1;
+ } else {
+ neg = 0;
+ }
+
+ /* NaN sign bit is platform specific with unpacked, un-normalized NaNs */
+ DUK_ASSERT(c == DUK_FP_NAN || DUK_SIGNBIT((double) x) == 0);
+
+ if (c == DUK_FP_NAN) {
+ duk_push_hstring_stridx(thr, DUK_STRIDX_NAN);
+ return;
+ } else if (c == DUK_FP_INFINITE) {
+ if (neg) {
+ /* -Infinity */
+ duk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_INFINITY);
+ } else {
+ /* Infinity */
+ duk_push_hstring_stridx(thr, DUK_STRIDX_INFINITY);
+ }
+ return;
+ } else if (c == DUK_FP_ZERO) {
+ /* We can't shortcut zero here if it goes through special formatting
+ * (such as forced exponential notation).
+ */
+ ;
+ }
+
+ /*
+ * Handle integers in 32-bit range (that is, [-(2**32-1),2**32-1])
+ * specially, as they're very likely for embedded programs. This
+ * is now done for all radix values. We must be careful not to use
+ * the fast path when special formatting (e.g. forced exponential)
+ * is in force.
+ *
+ * XXX: could save space by supporting radix 10 only and using
+ * sprintf "%lu" for the fast path and for exponent formatting.
+ */
+
+ uval = (unsigned int) x;
+ if (((double) uval) == x && /* integer number in range */
+ flags == 0) { /* no special formatting */
+ /* use bigint area as a temp */
+ duk_uint8_t *buf = (duk_uint8_t *) (&nc_ctx->f);
+ duk_uint8_t *p = buf;
+
+ DUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= 32 + 1); /* max size: radix=2 + sign */
+ if (neg && uval != 0) {
+ /* no negative sign for zero */
+ *p++ = (duk_uint8_t) '-';
+ }
+ p += duk__dragon4_format_uint32(p, uval, radix);
+ duk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf));
+ return;
+ }
+
+ /*
+ * Dragon4 setup.
+ *
+ * Convert double from IEEE representation for conversion;
+ * normal finite values have an implicit leading 1-bit. The
+ * slow path algorithm doesn't handle zero, so zero is special
+ * cased here but still creates a valid nc_ctx, and goes
+ * through normal formatting in case special formatting has
+ * been requested (e.g. forced exponential format: 0 -> "0e+0").
+ */
+
+ /* Would be nice to bulk clear the allocation, but the context
+ * is 1-2 kilobytes and nothing should rely on it being zeroed.
+ */
+#if 0
+ DUK_MEMZERO((void *) nc_ctx, sizeof(*nc_ctx)); /* slow init, do only for slow path cases */
+#endif
+
+ nc_ctx->is_s2n = 0;
+ nc_ctx->b = 2;
+ nc_ctx->B = radix;
+ nc_ctx->abs_pos = 0;
+ if (flags & DUK_N2S_FLAG_FIXED_FORMAT) {
+ nc_ctx->is_fixed = 1;
+ if (flags & DUK_N2S_FLAG_FRACTION_DIGITS) {
+ /* absolute req_digits; e.g. digits = 1 -> last digit is 0,
+ * but add an extra digit for rounding.
+ */
+ nc_ctx->abs_pos = 1;
+ nc_ctx->req_digits = (-digits + 1) - 1;
+ } else {
+ nc_ctx->req_digits = digits + 1;
+ }
+ } else {
+ nc_ctx->is_fixed = 0;
+ nc_ctx->req_digits = 0;
+ }
+
+ if (c == DUK_FP_ZERO) {
+ /* Zero special case: fake requested number of zero digits; ensure
+ * no sign bit is printed. Relative and absolute fixed format
+ * require separate handling.
+ */
+ duk_small_int_t count;
+ if (nc_ctx->is_fixed) {
+ if (nc_ctx->abs_pos) {
+ count = digits + 2; /* lead zero + 'digits' fractions + 1 for rounding */
+ } else {
+ count = digits + 1; /* + 1 for rounding */
+ }
+ } else {
+ count = 1;
+ }
+ DUK_DDD(DUK_DDDPRINT("count=%ld", (long) count));
+ DUK_ASSERT(count >= 1);
+ DUK_MEMZERO((void *) nc_ctx->digits, (size_t) count);
+ nc_ctx->count = count;
+ nc_ctx->k = 1; /* 0.000... */
+ neg = 0;
+ goto zero_skip;
+ }
+
+ duk__dragon4_double_to_ctx(nc_ctx, x); /* -> sets 'f' and 'e' */
+ DUK__BI_PRINT("f", &nc_ctx->f);
+ DUK_DDD(DUK_DDDPRINT("e=%ld", (long) nc_ctx->e));
+
+ /*
+ * Dragon4 slow path digit generation.
+ */
+
+ duk__dragon4_prepare(nc_ctx); /* setup many variables in nc_ctx */
+
+ DUK_DDD(DUK_DDDPRINT("after prepare:"));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("mp", &nc_ctx->mp);
+ DUK__BI_PRINT("mm", &nc_ctx->mm);
+
+ duk__dragon4_scale(nc_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("after scale; k=%ld", (long) nc_ctx->k));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("mp", &nc_ctx->mp);
+ DUK__BI_PRINT("mm", &nc_ctx->mm);
+
+ duk__dragon4_generate(nc_ctx);
+
+ /*
+ * Convert and push final string.
+ */
+
+ zero_skip:
+
+ if (flags & DUK_N2S_FLAG_FIXED_FORMAT) {
+ /* Perform fixed-format rounding. */
+ duk_small_int_t roundpos;
+ if (flags & DUK_N2S_FLAG_FRACTION_DIGITS) {
+ /* 'roundpos' is relative to nc_ctx->k and increases to the right
+ * (opposite of how 'k' changes).
+ */
+ roundpos = -digits; /* absolute position for digit considered for rounding */
+ roundpos = nc_ctx->k - roundpos;
+ } else {
+ roundpos = digits;
+ }
+ DUK_DDD(DUK_DDDPRINT("rounding: k=%ld, count=%ld, digits=%ld, roundpos=%ld",
+ (long) nc_ctx->k, (long) nc_ctx->count, (long) digits, (long) roundpos));
+ (void) duk__dragon4_fixed_format_round(nc_ctx, roundpos);
+
+ /* Note: 'count' is currently not adjusted by rounding (i.e. the
+ * digits are not "chopped off". That shouldn't matter because
+ * the digit position (absolute or relative) is passed on to the
+ * convert-and-push function.
+ */
+ }
+
+ duk__dragon4_convert_and_push(nc_ctx, thr, radix, digits, flags, neg);
+}
+
+/*
+ * Exposed string-to-number API
+ *
+ * Input: [ string ]
+ * Output: [ number ]
+ *
+ * If number parsing fails, a NaN is pushed as the result. If number parsing
+ * fails due to an internal error, an InternalError is thrown.
+ */
+
+DUK_INTERNAL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags) {
+ duk__numconv_stringify_ctx nc_ctx_alloc; /* large context; around 2kB now */
+ duk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc;
+ duk_double_t res;
+ duk_hstring *h_str;
+ duk_small_int_t expt;
+ duk_small_int_t expt_neg;
+ duk_small_int_t expt_adj;
+ duk_small_int_t neg;
+ duk_small_int_t dig;
+ duk_small_int_t dig_whole;
+ duk_small_int_t dig_lzero;
+ duk_small_int_t dig_frac;
+ duk_small_int_t dig_expt;
+ duk_small_int_t dig_prec;
+ const duk__exp_limits *explim;
+ const duk_uint8_t *p;
+ duk_small_int_t ch;
+
+ DUK_DDD(DUK_DDDPRINT("parse number: %!T, radix=%ld, flags=0x%08lx",
+ (duk_tval *) duk_get_tval(thr, -1),
+ (long) radix, (unsigned long) flags));
+
+ DUK_ASSERT(radix >= 2 && radix <= 36);
+ DUK_ASSERT(radix - 2 < (duk_small_int_t) sizeof(duk__str2num_digits_for_radix));
+
+ /*
+ * Preliminaries: trim, sign, Infinity check
+ *
+ * We rely on the interned string having a NUL terminator, which will
+ * cause a parse failure wherever it is encountered. As a result, we
+ * don't need separate pointer checks.
+ *
+ * There is no special parsing for 'NaN' in the specification although
+ * 'Infinity' (with an optional sign) is allowed in some contexts.
+ * Some contexts allow plus/minus sign, while others only allow the
+ * minus sign (like JSON.parse()).
+ *
+ * Automatic hex number detection (leading '0x' or '0X') and octal
+ * number detection (leading '0' followed by at least one octal digit)
+ * is done here too.
+ *
+ * Symbols are not explicitly rejected here (that's up to the caller).
+ * If a symbol were passed here, it should ultimately safely fail
+ * parsing due to a syntax error.
+ */
+
+ if (flags & DUK_S2N_FLAG_TRIM_WHITE) {
+ /* Leading / trailing whitespace is sometimes accepted and
+ * sometimes not. After white space trimming, all valid input
+ * characters are pure ASCII.
+ */
+ duk_trim(thr, -1);
+ }
+ h_str = duk_require_hstring(thr, -1);
+ DUK_ASSERT(h_str != NULL);
+ p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_str);
+
+ neg = 0;
+ ch = *p;
+ if (ch == (duk_small_int_t) '+') {
+ if ((flags & DUK_S2N_FLAG_ALLOW_PLUS) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: leading plus sign not allowed"));
+ goto parse_fail;
+ }
+ p++;
+ } else if (ch == (duk_small_int_t) '-') {
+ if ((flags & DUK_S2N_FLAG_ALLOW_MINUS) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: leading minus sign not allowed"));
+ goto parse_fail;
+ }
+ p++;
+ neg = 1;
+ }
+
+ if ((flags & DUK_S2N_FLAG_ALLOW_INF) && DUK_STRNCMP((const char *) p, "Infinity", 8) == 0) {
+ /* Don't check for Infinity unless the context allows it.
+ * 'Infinity' is a valid integer literal in e.g. base-36:
+ *
+ * parseInt('Infinity', 36)
+ * 1461559270678
+ */
+
+ if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0 && p[8] != DUK_ASC_NUL) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage after matching 'Infinity' not allowed"));
+ goto parse_fail;
+ } else {
+ res = DUK_DOUBLE_INFINITY;
+ goto negcheck_and_ret;
+ }
+ }
+ ch = *p;
+ if (ch == (duk_small_int_t) '0') {
+ duk_small_int_t detect_radix = 0;
+ ch = DUK_LOWERCASE_CHAR_ASCII(p[1]); /* 'x' or 'X' -> 'x' */
+ if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT) && ch == DUK_ASC_LC_X) {
+ DUK_DDD(DUK_DDDPRINT("detected 0x/0X hex prefix, changing radix and preventing fractions and exponent"));
+ detect_radix = 16;
+#if 0
+ } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT) &&
+ (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9')) {
+ DUK_DDD(DUK_DDDPRINT("detected 0n oct prefix, changing radix and preventing fractions and exponent"));
+ detect_radix = 8;
+
+ /* NOTE: if this legacy octal case is added back, it has
+ * different flags and 'p' advance so this needs to be
+ * reworked.
+ */
+ flags |= DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO; /* interpret e.g. '09' as '0', not NaN */
+ p += 1;
+#endif
+ } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) && ch == DUK_ASC_LC_O) {
+ DUK_DDD(DUK_DDDPRINT("detected 0o oct prefix, changing radix and preventing fractions and exponent"));
+ detect_radix = 8;
+ } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT) && ch == DUK_ASC_LC_B) {
+ DUK_DDD(DUK_DDDPRINT("detected 0b bin prefix, changing radix and preventing fractions and exponent"));
+ detect_radix = 2;
+ }
+ if (detect_radix > 0) {
+ radix = detect_radix;
+ /* Clear empty as zero flag: interpret e.g. '0x' and '0xg' as a NaN (= parse error) */
+ flags &= ~(DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |
+ DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC |
+ DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO);
+ flags |= DUK_S2N_FLAG_ALLOW_LEADING_ZERO; /* allow e.g. '0x0009' and '0b00010001' */
+ p += 2;
+ }
+ }
+
+ /*
+ * Scan number and setup for Dragon4.
+ *
+ * The fast path case is detected during setup: an integer which
+ * can be converted without rounding, no net exponent. The fast
+ * path could be implemented as a separate scan, but may not really
+ * be worth it: the multiplications for building 'f' are not
+ * expensive when 'f' is small.
+ *
+ * The significand ('f') must contain enough bits of (apparent)
+ * accuracy, so that Dragon4 will generate enough binary output digits.
+ * For decimal numbers, this means generating a 20-digit significand,
+ * which should yield enough practical accuracy to parse IEEE doubles.
+ * In fact, the Ecmascript specification explicitly allows an
+ * implementation to treat digits beyond 20 as zeroes (and even
+ * to round the 20th digit upwards). For non-decimal numbers, the
+ * appropriate number of digits has been precomputed for comparable
+ * accuracy.
+ *
+ * Digit counts:
+ *
+ * [ dig_lzero ]
+ * |
+ * .+-..---[ dig_prec ]----.
+ * | || |
+ * 0000123.456789012345678901234567890e+123456
+ * | | | | | |
+ * `--+--' `------[ dig_frac ]-------' `-+--'
+ * | |
+ * [ dig_whole ] [ dig_expt ]
+ *
+ * dig_frac and dig_expt are -1 if not present
+ * dig_lzero is only computed for whole number part
+ *
+ * Parsing state
+ *
+ * Parsing whole part dig_frac < 0 AND dig_expt < 0
+ * Parsing fraction part dig_frac >= 0 AND dig_expt < 0
+ * Parsing exponent part dig_expt >= 0 (dig_frac may be < 0 or >= 0)
+ *
+ * Note: in case we hit an implementation limit (like exponent range),
+ * we should throw an error, NOT return NaN or Infinity. Even with
+ * very large exponent (or significand) values the final result may be
+ * finite, so NaN/Infinity would be incorrect.
+ */
+
+ duk__bi_set_small(&nc_ctx->f, 0);
+ dig_prec = 0;
+ dig_lzero = 0;
+ dig_whole = 0;
+ dig_frac = -1;
+ dig_expt = -1;
+ expt = 0;
+ expt_adj = 0; /* essentially tracks digit position of lowest 'f' digit */
+ expt_neg = 0;
+ for (;;) {
+ ch = *p++;
+
+ DUK_DDD(DUK_DDDPRINT("parse digits: p=%p, ch='%c' (%ld), expt=%ld, expt_adj=%ld, "
+ "dig_whole=%ld, dig_frac=%ld, dig_expt=%ld, dig_lzero=%ld, dig_prec=%ld",
+ (const void *) p, (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : '?'), (long) ch,
+ (long) expt, (long) expt_adj, (long) dig_whole, (long) dig_frac,
+ (long) dig_expt, (long) dig_lzero, (long) dig_prec));
+ DUK__BI_PRINT("f", &nc_ctx->f);
+
+ /* Most common cases first. */
+ if (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9') {
+ dig = (duk_small_int_t) ch - '0' + 0;
+ } else if (ch == (duk_small_int_t) '.') {
+ /* A leading digit is not required in some cases, e.g. accept ".123".
+ * In other cases (JSON.parse()) a leading digit is required. This
+ * is checked for after the loop.
+ */
+ if (dig_frac >= 0 || dig_expt >= 0) {
+ if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) {
+ DUK_DDD(DUK_DDDPRINT("garbage termination (invalid period)"));
+ break;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("parse failed: period not allowed"));
+ goto parse_fail;
+ }
+ }
+
+ if ((flags & DUK_S2N_FLAG_ALLOW_FRAC) == 0) {
+ /* Some contexts don't allow fractions at all; this can't be a
+ * post-check because the state ('f' and expt) would be incorrect.
+ */
+ if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) {
+ DUK_DDD(DUK_DDDPRINT("garbage termination (invalid first period)"));
+ break;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed"));
+ }
+ }
+
+ DUK_DDD(DUK_DDDPRINT("start fraction part"));
+ dig_frac = 0;
+ continue;
+ } else if (ch == (duk_small_int_t) 0) {
+ DUK_DDD(DUK_DDDPRINT("NUL termination"));
+ break;
+ } else if ((flags & DUK_S2N_FLAG_ALLOW_EXP) &&
+ dig_expt < 0 && (ch == (duk_small_int_t) 'e' || ch == (duk_small_int_t) 'E')) {
+ /* Note: we don't parse back exponent notation for anything else
+ * than radix 10, so this is not an ambiguous check (e.g. hex
+ * exponent values may have 'e' either as a significand digit
+ * or as an exponent separator).
+ *
+ * If the exponent separator occurs twice, 'e' will be interpreted
+ * as a digit (= 14) and will be rejected as an invalid decimal
+ * digit.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("start exponent part"));
+
+ /* Exponent without a sign or with a +/- sign is accepted
+ * by all call sites (even JSON.parse()).
+ */
+ ch = *p;
+ if (ch == (duk_small_int_t) '-') {
+ expt_neg = 1;
+ p++;
+ } else if (ch == (duk_small_int_t) '+') {
+ p++;
+ }
+ dig_expt = 0;
+ continue;
+ } else if (ch >= (duk_small_int_t) 'a' && ch <= (duk_small_int_t) 'z') {
+ dig = (duk_small_int_t) (ch - (duk_small_int_t) 'a' + 0x0a);
+ } else if (ch >= (duk_small_int_t) 'A' && ch <= (duk_small_int_t) 'Z') {
+ dig = (duk_small_int_t) (ch - (duk_small_int_t) 'A' + 0x0a);
+ } else {
+ dig = 255; /* triggers garbage digit check below */
+ }
+ DUK_ASSERT((dig >= 0 && dig <= 35) || dig == 255);
+
+ if (dig >= radix) {
+ if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) {
+ DUK_DDD(DUK_DDDPRINT("garbage termination"));
+ break;
+ } else {
+ DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage or invalid digit"));
+ goto parse_fail;
+ }
+ }
+
+ if (dig_expt < 0) {
+ /* whole or fraction digit */
+
+ if (dig_prec < duk__str2num_digits_for_radix[radix - 2]) {
+ /* significant from precision perspective */
+
+ duk_small_int_t f_zero = duk__bi_is_zero(&nc_ctx->f);
+ if (f_zero && dig == 0) {
+ /* Leading zero is not counted towards precision digits; not
+ * in the integer part, nor in the fraction part.
+ */
+ if (dig_frac < 0) {
+ dig_lzero++;
+ }
+ } else {
+ /* XXX: join these ops (multiply-accumulate), but only if
+ * code footprint decreases.
+ */
+ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, (duk_uint32_t) radix);
+ duk__bi_add_small(&nc_ctx->f, &nc_ctx->t1, (duk_uint32_t) dig);
+ dig_prec++;
+ }
+ } else {
+ /* Ignore digits beyond a radix-specific limit, but note them
+ * in expt_adj.
+ */
+ expt_adj++;
+ }
+
+ if (dig_frac >= 0) {
+ dig_frac++;
+ expt_adj--;
+ } else {
+ dig_whole++;
+ }
+ } else {
+ /* exponent digit */
+
+ expt = expt * radix + dig;
+ if (expt > DUK_S2N_MAX_EXPONENT) {
+ /* impose a reasonable exponent limit, so that exp
+ * doesn't need to get tracked using a bigint.
+ */
+ DUK_DDD(DUK_DDDPRINT("parse failed: exponent too large"));
+ goto parse_explimit_error;
+ }
+ dig_expt++;
+ }
+ }
+
+ /* Leading zero. */
+
+ if (dig_lzero > 0 && dig_whole > 1) {
+ if ((flags & DUK_S2N_FLAG_ALLOW_LEADING_ZERO) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: leading zeroes not allowed in integer part"));
+ goto parse_fail;
+ }
+ }
+
+ /* Validity checks for various fraction formats ("0.1", ".1", "1.", "."). */
+
+ if (dig_whole == 0) {
+ if (dig_frac == 0) {
+ /* "." is not accepted in any format */
+ DUK_DDD(DUK_DDDPRINT("parse failed: plain period without leading or trailing digits"));
+ goto parse_fail;
+ } else if (dig_frac > 0) {
+ /* ".123" */
+ if ((flags & DUK_S2N_FLAG_ALLOW_NAKED_FRAC) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed without "
+ "leading integer digit(s)"));
+ goto parse_fail;
+ }
+ } else {
+ /* empty ("") is allowed in some formats (e.g. Number(''), as zero */
+ if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: empty string not allowed (as zero)"));
+ goto parse_fail;
+ }
+ }
+ } else {
+ if (dig_frac == 0) {
+ /* "123." is allowed in some formats */
+ if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_FRAC) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: empty fractions"));
+ goto parse_fail;
+ }
+ } else if (dig_frac > 0) {
+ /* "123.456" */
+ ;
+ } else {
+ /* "123" */
+ ;
+ }
+ }
+
+ /* Exponent without digits (e.g. "1e" or "1e+"). If trailing garbage is
+ * allowed, ignore exponent part as garbage (= parse as "1", i.e. exp 0).
+ */
+
+ if (dig_expt == 0) {
+ if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0) {
+ DUK_DDD(DUK_DDDPRINT("parse failed: empty exponent"));
+ goto parse_fail;
+ }
+ DUK_ASSERT(expt == 0);
+ }
+
+ if (expt_neg) {
+ expt = -expt;
+ }
+ DUK_DDD(DUK_DDDPRINT("expt=%ld, expt_adj=%ld, net exponent -> %ld",
+ (long) expt, (long) expt_adj, (long) (expt + expt_adj)));
+ expt += expt_adj;
+
+ /* Fast path check. */
+
+ if (nc_ctx->f.n <= 1 && /* 32-bit value */
+ expt == 0 /* no net exponent */) {
+ /* Fast path is triggered for no exponent and also for balanced exponent
+ * and fraction parts, e.g. for "1.23e2" == "123". Remember to respect
+ * zero sign.
+ */
+
+ /* XXX: could accept numbers larger than 32 bits, e.g. up to 53 bits? */
+ DUK_DDD(DUK_DDDPRINT("fast path number parse"));
+ if (nc_ctx->f.n == 1) {
+ res = (double) nc_ctx->f.v[0];
+ } else {
+ res = 0.0;
+ }
+ goto negcheck_and_ret;
+ }
+
+ /* Significand ('f') padding. */
+
+ while (dig_prec < duk__str2num_digits_for_radix[radix - 2]) {
+ /* Pad significand with "virtual" zero digits so that Dragon4 will
+ * have enough (apparent) precision to work with.
+ */
+ DUK_DDD(DUK_DDDPRINT("dig_prec=%ld, pad significand with zero", (long) dig_prec));
+ duk__bi_mul_small_copy(&nc_ctx->f, (duk_uint32_t) radix, &nc_ctx->t1);
+ DUK__BI_PRINT("f", &nc_ctx->f);
+ expt--;
+ dig_prec++;
+ }
+
+ DUK_DDD(DUK_DDDPRINT("final exponent: %ld", (long) expt));
+
+ /* Detect zero special case. */
+
+ if (nc_ctx->f.n == 0) {
+ /* This may happen even after the fast path check, if exponent is
+ * not balanced (e.g. "0e1"). Remember to respect zero sign.
+ */
+ DUK_DDD(DUK_DDDPRINT("significand is zero"));
+ res = 0.0;
+ goto negcheck_and_ret;
+ }
+
+
+ /* Quick reject of too large or too small exponents. This check
+ * would be incorrect for zero (e.g. "0e1000" is zero, not Infinity)
+ * so zero check must be above.
+ */
+
+ explim = &duk__str2num_exp_limits[radix - 2];
+ if (expt > explim->upper) {
+ DUK_DDD(DUK_DDDPRINT("exponent too large -> infinite"));
+ res = (duk_double_t) DUK_DOUBLE_INFINITY;
+ goto negcheck_and_ret;
+ } else if (expt < explim->lower) {
+ DUK_DDD(DUK_DDDPRINT("exponent too small -> zero"));
+ res = (duk_double_t) 0.0;
+ goto negcheck_and_ret;
+ }
+
+ nc_ctx->is_s2n = 1;
+ nc_ctx->e = expt;
+ nc_ctx->b = radix;
+ nc_ctx->B = 2;
+ nc_ctx->is_fixed = 1;
+ nc_ctx->abs_pos = 0;
+ nc_ctx->req_digits = 53 + 1;
+
+ DUK__BI_PRINT("f", &nc_ctx->f);
+ DUK_DDD(DUK_DDDPRINT("e=%ld", (long) nc_ctx->e));
+
+ /*
+ * Dragon4 slow path (binary) digit generation.
+ * An extra digit is generated for rounding.
+ */
+
+ duk__dragon4_prepare(nc_ctx); /* setup many variables in nc_ctx */
+
+ DUK_DDD(DUK_DDDPRINT("after prepare:"));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("mp", &nc_ctx->mp);
+ DUK__BI_PRINT("mm", &nc_ctx->mm);
+
+ duk__dragon4_scale(nc_ctx);
+
+ DUK_DDD(DUK_DDDPRINT("after scale; k=%ld", (long) nc_ctx->k));
+ DUK__BI_PRINT("r", &nc_ctx->r);
+ DUK__BI_PRINT("s", &nc_ctx->s);
+ DUK__BI_PRINT("mp", &nc_ctx->mp);
+ DUK__BI_PRINT("mm", &nc_ctx->mm);
+
+ duk__dragon4_generate(nc_ctx);
+
+ DUK_ASSERT(nc_ctx->count == 53 + 1);
+
+ /*
+ * Convert binary digits into an IEEE double. Need to handle
+ * denormals and rounding correctly.
+ *
+ * Some call sites currently assume the result is always a
+ * non-fastint double. If this is changed, check all call
+ * sites.
+ */
+
+ duk__dragon4_ctx_to_double(nc_ctx, &res);
+ goto negcheck_and_ret;
+
+ negcheck_and_ret:
+ if (neg) {
+ res = -res;
+ }
+ duk_pop(thr);
+ duk_push_number(thr, (double) res);
+ DUK_DDD(DUK_DDDPRINT("result: %!T", (duk_tval *) duk_get_tval(thr, -1)));
+ return;
+
+ parse_fail:
+ DUK_DDD(DUK_DDDPRINT("parse failed"));
+ duk_pop(thr);
+ duk_push_nan(thr);
+ return;
+
+ parse_explimit_error:
+ DUK_DDD(DUK_DDDPRINT("parse failed, internal error, can't return a value"));
+ DUK_ERROR_RANGE(thr, "exponent too large");
+ return;
+}
+
+/* automatic undefs */
+#undef DUK__BI_MAX_PARTS
+#undef DUK__BI_PRINT
+#undef DUK__DIGITCHAR
+#undef DUK__DRAGON4_OUTPUT_PREINC
+#undef DUK__IEEE_DOUBLE_EXP_BIAS
+#undef DUK__IEEE_DOUBLE_EXP_MIN
+#undef DUK__MAX_FORMATTED_LENGTH
+#undef DUK__MAX_OUTPUT_DIGITS
+#undef DUK__NO_EXP
+#undef DUK__NUMCONV_CTX_BIGINTS_SIZE
+#undef DUK__NUMCONV_CTX_NUM_BIGINTS
+#line 1 "duk_regexp_compiler.c"
+/*
+ * Regexp compilation.
+ *
+ * See doc/regexp.rst for a discussion of the compilation approach and
+ * current limitations.
+ *
+ * Regexp bytecode assumes jumps can be expressed with signed 32-bit
+ * integers. Consequently the bytecode size must not exceed 0x7fffffffL.
+ * The implementation casts duk_size_t (buffer size) to duk_(u)int32_t
+ * in many places. Although this could be changed, the bytecode format
+ * limit would still prevent regexps exceeding the signed 32-bit limit
+ * from working.
+ *
+ * XXX: The implementation does not prevent bytecode from exceeding the
+ * maximum supported size. This could be done by limiting the maximum
+ * input string size (assuming an upper bound can be computed for number
+ * of bytecode bytes emitted per input byte) or checking buffer maximum
+ * size when emitting bytecode (slower).
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+
+/*
+ * Helper macros
+ */
+
+#define DUK__RE_INITIAL_BUFSIZE 64
+
+#define DUK__RE_BUFLEN(re_ctx) \
+ DUK_BW_GET_SIZE(re_ctx->thr, &re_ctx->bw)
+
+/*
+ * Disjunction struct: result of parsing a disjunction
+ */
+
+typedef struct {
+ /* Number of characters that the atom matches (e.g. 3 for 'abc'),
+ * -1 if atom is complex and number of matched characters either
+ * varies or is not known.
+ */
+ duk_int32_t charlen;
+
+#if 0
+ /* These are not needed to implement quantifier capture handling,
+ * but might be needed at some point.
+ */
+
+ /* re_ctx->captures at start and end of atom parsing.
+ * Since 'captures' indicates highest capture number emitted
+ * so far in a DUK_REOP_SAVE, the captures numbers saved by
+ * the atom are: ]start_captures,end_captures].
+ */
+ duk_uint32_t start_captures;
+ duk_uint32_t end_captures;
+#endif
+} duk__re_disjunction_info;
+
+/*
+ * Encoding helpers
+ *
+ * Some of the typing is bytecode based, e.g. slice sizes are unsigned 32-bit
+ * even though the buffer operations will use duk_size_t.
+ */
+
+/* XXX: the insert helpers should ensure that the bytecode result is not
+ * larger than expected (or at least assert for it). Many things in the
+ * bytecode, like skip offsets, won't work correctly if the bytecode is
+ * larger than say 2G.
+ */
+
+DUK_LOCAL duk_uint32_t duk__encode_i32(duk_int32_t x) {
+ if (x < 0) {
+ return ((duk_uint32_t) (-x)) * 2 + 1;
+ } else {
+ return ((duk_uint32_t) x) * 2;
+ }
+}
+
+/* XXX: return type should probably be duk_size_t, or explicit checks are needed for
+ * maximum size.
+ */
+DUK_LOCAL duk_uint32_t duk__insert_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t x) {
+ duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH];
+ duk_small_int_t len;
+
+ len = duk_unicode_encode_xutf8((duk_ucodepoint_t) x, buf);
+ DUK_ASSERT(len >= 0);
+ DUK_BW_INSERT_ENSURE_BYTES(re_ctx->thr, &re_ctx->bw, offset, buf, (duk_size_t) len);
+ return (duk_uint32_t) len;
+}
+
+DUK_LOCAL void duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) {
+ DUK_BW_WRITE_ENSURE_XUTF8(re_ctx->thr, &re_ctx->bw, x);
+}
+
+DUK_LOCAL void duk__append_7bit(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) {
+#if defined(DUK_USE_PREFER_SIZE)
+ duk__append_u32(re_ctx, x);
+#else
+ DUK_ASSERT(x <= 0x7fU);
+ DUK_BW_WRITE_ENSURE_U8(re_ctx->thr, &re_ctx->bw, (duk_uint8_t) x);
+#endif
+}
+
+#if 0
+DUK_LOCAL void duk__append_2bytes(duk_re_compiler_ctx *re_ctx, duk_uint8_t x, duk_uint8_t y) {
+ DUK_BW_WRITE_ENSURE_U8_2(re_ctx->thr, &re_ctx->bw, x, y);
+}
+#endif
+
+DUK_LOCAL duk_uint32_t duk__insert_i32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t x) {
+ return duk__insert_u32(re_ctx, offset, duk__encode_i32(x));
+}
+
+DUK_LOCAL void duk__append_reop(duk_re_compiler_ctx *re_ctx, duk_uint32_t reop) {
+ DUK_ASSERT(reop <= 0x7fU);
+ (void) duk__append_7bit(re_ctx, reop);
+}
+
+#if 0 /* unused */
+DUK_LOCAL void duk__append_i32(duk_re_compiler_ctx *re_ctx, duk_int32_t x) {
+ duk__append_u32(re_ctx, duk__encode_i32(x));
+}
+#endif
+
+/* special helper for emitting u16 lists (used for character ranges for built-in char classes) */
+DUK_LOCAL void duk__append_u16_list(duk_re_compiler_ctx *re_ctx, const duk_uint16_t *values, duk_uint32_t count) {
+ /* Call sites don't need the result length so it's not accumulated. */
+ while (count-- > 0) {
+ duk__append_u32(re_ctx, (duk_uint32_t) (*values++));
+ }
+}
+
+DUK_LOCAL void duk__insert_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t data_offset, duk_uint32_t data_length) {
+ DUK_BW_INSERT_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, offset, data_offset, data_length);
+}
+
+DUK_LOCAL void duk__append_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) {
+ DUK_BW_WRITE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length);
+}
+
+DUK_LOCAL void duk__remove_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) {
+ DUK_BW_REMOVE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length);
+}
+
+/*
+ * Insert a jump offset at 'offset' to complete an instruction
+ * (the jump offset is always the last component of an instruction).
+ * The 'skip' argument must be computed relative to 'offset',
+ * -without- taking into account the skip field being inserted.
+ *
+ * ... A B C ins X Y Z ... (ins may be a JUMP, SPLIT1/SPLIT2, etc)
+ * => ... A B C ins SKIP X Y Z
+ *
+ * Computing the final (adjusted) skip value, which is relative to the
+ * first byte of the next instruction, is a bit tricky because of the
+ * variable length UTF-8 encoding. See doc/regexp.rst for discussion.
+ */
+DUK_LOCAL duk_uint32_t duk__insert_jump_offset(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t skip) {
+#if 0
+ /* Iterative solution. */
+ if (skip < 0) {
+ duk_small_int_t len;
+ /* two encoding attempts suffices */
+ len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip));
+ len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip - (duk_int32_t) len));
+ DUK_ASSERT(duk_unicode_get_xutf8_length(duk__encode_i32(skip - (duk_int32_t) len)) == len); /* no change */
+ skip -= (duk_int32_t) len;
+ }
+#endif
+
+#if defined(DUK_USE_PREFER_SIZE)
+ /* Closed form solution, this produces smallest code.
+ * See re_neg_jump_offset (closed2).
+ */
+ if (skip < 0) {
+ skip--;
+ if (skip < -0x3fL) {
+ skip--;
+ }
+ if (skip < -0x3ffL) {
+ skip--;
+ }
+ if (skip < -0x7fffL) {
+ skip--;
+ }
+ if (skip < -0xfffffL) {
+ skip--;
+ }
+ if (skip < -0x1ffffffL) {
+ skip--;
+ }
+ if (skip < -0x3fffffffL) {
+ skip--;
+ }
+ }
+#else /* DUK_USE_PREFER_SIZE */
+ /* Closed form solution, this produces fastest code.
+ * See re_neg_jump_offset (closed1).
+ */
+ if (skip < 0) {
+ if (skip >= -0x3eL) {
+ skip -= 1;
+ } else if (skip >= -0x3fdL) {
+ skip -= 2;
+ } else if (skip >= -0x7ffcL) {
+ skip -= 3;
+ } else if (skip >= -0xffffbL) {
+ skip -= 4;
+ } else if (skip >= -0x1fffffaL) {
+ skip -= 5;
+ } else if (skip >= -0x3ffffff9L) {
+ skip -= 6;
+ } else {
+ skip -= 7;
+ }
+ }
+#endif /* DUK_USE_PREFER_SIZE */
+
+ return duk__insert_i32(re_ctx, offset, skip);
+}
+
+DUK_LOCAL duk_uint32_t duk__append_jump_offset(duk_re_compiler_ctx *re_ctx, duk_int32_t skip) {
+ return (duk_uint32_t) duk__insert_jump_offset(re_ctx, (duk_uint32_t) DUK__RE_BUFLEN(re_ctx), skip);
+}
+
+/*
+ * duk_re_range_callback for generating character class ranges.
+ *
+ * When ignoreCase is false, the range is simply emitted as is. We don't,
+ * for instance, eliminate duplicates or overlapping ranges in a character
+ * class.
+ *
+ * When ignoreCase is true but the 'direct' flag is set, the caller knows
+ * that the range canonicalizes to itself for case insensitive matching,
+ * so the range is emitted as is. This is mainly useful for built-in ranges
+ * like \W.
+ *
+ * Otherwise, when ignoreCase is true, the range needs to be normalized
+ * through canonicalization. Unfortunately a canonicalized version of a
+ * continuous range is not necessarily continuous (e.g. [x-{] is continuous
+ * but [X-{] is not). As a result, a single input range may expand to a lot
+ * of output ranges. The current algorithm creates the canonicalized ranges
+ * footprint efficiently at the cost of compile time execution time; see
+ * doc/regexp.rst for discussion, and some more details below.
+ *
+ * Note that the ctx->nranges is a context-wide temporary value. This is OK
+ * because there cannot be multiple character classes being parsed
+ * simultaneously.
+ *
+ * More detail on canonicalization:
+ *
+ * Conceptually, a range is canonicalized by scanning the entire range,
+ * normalizing each codepoint by converting it to uppercase, and generating
+ * a set of result ranges.
+ *
+ * Ideally a minimal set of output ranges would be emitted by merging all
+ * possible ranges even if they're emitted out of sequence. Because the
+ * input string is also case normalized during matching, some codepoints
+ * never occur at runtime; these "don't care" codepoints can be included or
+ * excluded from ranges when merging/optimizing ranges.
+ *
+ * The current algorithm does not do optimal range merging. Rather, output
+ * codepoints are generated in sequence, and when the output codepoints are
+ * continuous (CP, CP+1, CP+2, ...), they are merged locally into as large a
+ * range as possible. A small canonicalization bitmap is used to reduce
+ * actual codepoint canonicalizations which are quite slow at present. The
+ * bitmap provides a "codepoint block is continuous with respect to
+ * canonicalization" for N-codepoint blocks. This allows blocks to be
+ * skipped quickly.
+ *
+ * There are a number of shortcomings and future work here:
+ *
+ * - Individual codepoint normalizations are slow because they involve
+ * walking bit-packed rules without a lookup index.
+ *
+ * - The conceptual algorithm needs to canonicalize every codepoint in the
+ * input range to figure out the output range(s). Even with the small
+ * canonicalization bitmap the algorithm runs quite slowly for worst case
+ * inputs. There are many data structure alternatives to improve this.
+ *
+ * - While the current algorithm generates maximal output ranges when the
+ * output codepoints are emitted linearly, output ranges are not sorted or
+ * merged otherwise. In the worst case a lot of ranges are emitted when
+ * most of the ranges could be merged. In this process one could take
+ * advantage of "don't care" codepoints, which are never matched against at
+ * runtime due to canonicalization of input codepoints before comparison,
+ * to merge otherwise discontinuous output ranges.
+ *
+ * - The runtime data structure is just a linear list of ranges to match
+ * against. This can be quite slow if there are a lot of output ranges.
+ * There are various ways to make matching against the ranges faster,
+ * e.g. sorting the ranges and using a binary search; skip lists; tree
+ * based representations; full or approximate codepoint bitmaps, etc.
+ *
+ * - Only BMP is supported, codepoints above BMP are assumed to canonicalize
+ * to themselves. For now this is one place where we don't want to
+ * support chars outside the BMP, because the exhaustive search would be
+ * massively larger. It would be possible to support non-BMP with a
+ * different algorithm, or perhaps doing case normalization only at match
+ * time.
+ */
+
+DUK_LOCAL void duk__regexp_emit_range(duk_re_compiler_ctx *re_ctx, duk_codepoint_t r1, duk_codepoint_t r2) {
+ DUK_ASSERT(r2 >= r1);
+ duk__append_u32(re_ctx, (duk_uint32_t) r1);
+ duk__append_u32(re_ctx, (duk_uint32_t) r2);
+ re_ctx->nranges++;
+}
+
+#if defined(DUK_USE_REGEXP_CANON_BITMAP)
+/* Find next canonicalization discontinuity (conservative estimate) starting
+ * from 'start', not exceeding 'end'. If continuity is fine up to 'end'
+ * inclusive, returns end. Minimum possible return value is start.
+ */
+DUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) {
+ duk_uint_t start_blk;
+ duk_uint_t end_blk;
+ duk_uint_t blk;
+ duk_uint_t offset;
+ duk_uint8_t mask;
+
+ /* Inclusive block range. */
+ DUK_ASSERT(start >= 0);
+ DUK_ASSERT(end >= 0);
+ DUK_ASSERT(end >= start);
+ start_blk = (duk_uint_t) (start >> DUK_CANON_BITMAP_BLKSHIFT);
+ end_blk = (duk_uint_t) (end >> DUK_CANON_BITMAP_BLKSHIFT);
+
+ for (blk = start_blk; blk <= end_blk; blk++) {
+ offset = blk >> 3;
+ mask = 1U << (blk & 0x07);
+ if (offset >= sizeof(duk_unicode_re_canon_bitmap)) {
+ /* Reached non-BMP range which is assumed continuous. */
+ return end;
+ }
+ DUK_ASSERT(offset < sizeof(duk_unicode_re_canon_bitmap));
+ if ((duk_unicode_re_canon_bitmap[offset] & mask) == 0) {
+ /* Block is discontinuous, continuity is guaranteed
+ * only up to end of previous block (+1 for exclusive
+ * return value => start of current block). Start
+ * block requires special handling.
+ */
+ if (blk > start_blk) {
+ return (duk_codepoint_t) (blk << DUK_CANON_BITMAP_BLKSHIFT);
+ } else {
+ return start;
+ }
+ }
+ }
+ DUK_ASSERT(blk == end_blk + 1); /* Reached end block which is continuous. */
+ return end;
+}
+#else /* DUK_USE_REGEXP_CANON_BITMAP */
+DUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) {
+ DUK_ASSERT(start >= 0);
+ DUK_ASSERT(end >= 0);
+ DUK_ASSERT(end >= start);
+ if (start >= 0x10000) {
+ /* Even without the bitmap, treat non-BMP as continuous. */
+ return end;
+ }
+ return start;
+}
+#endif /* DUK_USE_REGEXP_CANON_BITMAP */
+
+DUK_LOCAL void duk__regexp_generate_ranges(void *userdata, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct) {
+ duk_re_compiler_ctx *re_ctx = (duk_re_compiler_ctx *) userdata;
+ duk_codepoint_t r_start;
+ duk_codepoint_t r_end;
+ duk_codepoint_t i;
+ duk_codepoint_t t;
+ duk_codepoint_t r_disc;
+
+ DUK_DD(DUK_DDPRINT("duk__regexp_generate_ranges(): re_ctx=%p, range=[%ld,%ld] direct=%ld",
+ (void *) re_ctx, (long) r1, (long) r2, (long) direct));
+
+ DUK_ASSERT(r2 >= r1); /* SyntaxError for out of order range. */
+
+ if (direct || (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) == 0) {
+ DUK_DD(DUK_DDPRINT("direct or not case sensitive, emit range: [%ld,%ld]", (long) r1, (long) r2));
+ duk__regexp_emit_range(re_ctx, r1, r2);
+ return;
+ }
+
+ DUK_DD(DUK_DDPRINT("case sensitive, process range: [%ld,%ld]", (long) r1, (long) r2));
+
+ r_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1);
+ r_end = r_start;
+
+ for (i = r1 + 1; i <= r2;) {
+ /* Input codepoint space processed up to i-1, and
+ * current range in r_{start,end} is up-to-date
+ * (inclusive) and may either break or continue.
+ */
+ r_disc = duk__re_canon_next_discontinuity(i, r2);
+ DUK_ASSERT(r_disc >= i);
+ DUK_ASSERT(r_disc <= r2);
+
+ r_end += r_disc - i; /* May be zero. */
+ t = duk_unicode_re_canonicalize_char(re_ctx->thr, r_disc);
+ if (t == r_end + 1) {
+ /* Not actually a discontinuity, continue range
+ * to r_disc and recheck.
+ */
+ r_end = t;
+ } else {
+ duk__regexp_emit_range(re_ctx, r_start, r_end);
+ r_start = t;
+ r_end = t;
+ }
+ i = r_disc + 1; /* Guarantees progress. */
+ }
+ duk__regexp_emit_range(re_ctx, r_start, r_end);
+
+#if 0 /* Exhaustive search, very slow. */
+ r_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1);
+ r_end = r_start;
+ for (i = r1 + 1; i <= r2; i++) {
+ t = duk_unicode_re_canonicalize_char(re_ctx->thr, i);
+ if (t == r_end + 1) {
+ r_end = t;
+ } else {
+ DUK_DD(DUK_DDPRINT("canonicalized, emit range: [%ld,%ld]", (long) r_start, (long) r_end));
+ duk__append_u32(re_ctx, (duk_uint32_t) r_start);
+ duk__append_u32(re_ctx, (duk_uint32_t) r_end);
+ re_ctx->nranges++;
+ r_start = t;
+ r_end = t;
+ }
+ }
+ DUK_DD(DUK_DDPRINT("canonicalized, emit range: [%ld,%ld]", (long) r_start, (long) r_end));
+ duk__append_u32(re_ctx, (duk_uint32_t) r_start);
+ duk__append_u32(re_ctx, (duk_uint32_t) r_end);
+ re_ctx->nranges++;
+#endif
+}
+
+/*
+ * Parse regexp Disjunction. Most of regexp compilation happens here.
+ *
+ * Handles Disjunction, Alternative, and Term productions directly without
+ * recursion. The only constructs requiring recursion are positive/negative
+ * lookaheads, capturing parentheses, and non-capturing parentheses.
+ *
+ * The function determines whether the entire disjunction is a 'simple atom'
+ * (see doc/regexp.rst discussion on 'simple quantifiers') and if so,
+ * returns the atom character length which is needed by the caller to keep
+ * track of its own atom character length. A disjunction with more than one
+ * alternative is never considered a simple atom (although in some cases
+ * that might be the case).
+ *
+ * Return value: simple atom character length or < 0 if not a simple atom.
+ * Appends the bytecode for the disjunction matcher to the end of the temp
+ * buffer.
+ *
+ * Regexp top level structure is:
+ *
+ * Disjunction = Term*
+ * | Term* | Disjunction
+ *
+ * Term = Assertion
+ * | Atom
+ * | Atom Quantifier
+ *
+ * An empty Term sequence is a valid disjunction alternative (e.g. /|||c||/).
+ *
+ * Notes:
+ *
+ * * Tracking of the 'simple-ness' of the current atom vs. the entire
+ * disjunction are separate matters. For instance, the disjunction
+ * may be complex, but individual atoms may be simple. Furthermore,
+ * simple quantifiers are used whenever possible, even if the
+ * disjunction as a whole is complex.
+ *
+ * * The estimate of whether an atom is simple is conservative now,
+ * and it would be possible to expand it. For instance, captures
+ * cause the disjunction to be marked complex, even though captures
+ * -can- be handled by simple quantifiers with some minor modifications.
+ *
+ * * Disjunction 'tainting' as 'complex' is handled at the end of the
+ * main for loop collectively for atoms. Assertions, quantifiers,
+ * and '|' tokens need to taint the result manually if necessary.
+ * Assertions cannot add to result char length, only atoms (and
+ * quantifiers) can; currently quantifiers will taint the result
+ * as complex though.
+ */
+
+DUK_LOCAL const duk_uint16_t * const duk__re_range_lookup1[3] = {
+ duk_unicode_re_ranges_digit,
+ duk_unicode_re_ranges_white,
+ duk_unicode_re_ranges_wordchar
+};
+DUK_LOCAL const duk_uint8_t duk__re_range_lookup2[3] = {
+ sizeof(duk_unicode_re_ranges_digit) / (2 * sizeof(duk_uint16_t)),
+ sizeof(duk_unicode_re_ranges_white) / (2 * sizeof(duk_uint16_t)),
+ sizeof(duk_unicode_re_ranges_wordchar) / (2 * sizeof(duk_uint16_t))
+};
+
+DUK_LOCAL void duk__append_range_atom_matcher(duk_re_compiler_ctx *re_ctx, duk_small_uint_t re_op, const duk_uint16_t *ranges, duk_small_uint_t count) {
+#if 0
+ DUK_ASSERT(re_op <= 0x7fUL);
+ DUK_ASSERT(count <= 0x7fUL);
+ duk__append_2bytes(re_ctx, (duk_uint8_t) re_op, (duk_uint8_t) count);
+#endif
+ duk__append_reop(re_ctx, re_op);
+ duk__append_7bit(re_ctx, count);
+ duk__append_u16_list(re_ctx, ranges, count * 2);
+}
+
+DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t expect_eof, duk__re_disjunction_info *out_atom_info) {
+ duk_int32_t atom_start_offset = -1; /* negative -> no atom matched on previous round */
+ duk_int32_t atom_char_length = 0; /* negative -> complex atom */
+ duk_uint32_t atom_start_captures = re_ctx->captures; /* value of re_ctx->captures at start of atom */
+ duk_int32_t unpatched_disjunction_split = -1;
+ duk_int32_t unpatched_disjunction_jump = -1;
+ duk_uint32_t entry_offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);
+ duk_int32_t res_charlen = 0; /* -1 if disjunction is complex, char length if simple */
+ duk__re_disjunction_info tmp_disj;
+
+ DUK_ASSERT(out_atom_info != NULL);
+
+ if (re_ctx->recursion_depth >= re_ctx->recursion_limit) {
+ DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT);
+ }
+ re_ctx->recursion_depth++;
+
+#if 0
+ out_atom_info->start_captures = re_ctx->captures;
+#endif
+
+ for (;;) {
+ /* atom_char_length, atom_start_offset, atom_start_offset reflect the
+ * atom matched on the previous loop. If a quantifier is encountered
+ * on this loop, these are needed to handle the quantifier correctly.
+ * new_atom_char_length etc are for the atom parsed on this round;
+ * they're written to atom_char_length etc at the end of the round.
+ */
+ duk_int32_t new_atom_char_length; /* char length of the atom parsed in this loop */
+ duk_int32_t new_atom_start_offset; /* bytecode start offset of the atom parsed in this loop
+ * (allows quantifiers to copy the atom bytecode)
+ */
+ duk_uint32_t new_atom_start_captures; /* re_ctx->captures at the start of the atom parsed in this loop */
+
+ duk_lexer_parse_re_token(&re_ctx->lex, &re_ctx->curr_token);
+
+ DUK_DD(DUK_DDPRINT("re token: %ld (num=%ld, char=%c)",
+ (long) re_ctx->curr_token.t,
+ (long) re_ctx->curr_token.num,
+ (re_ctx->curr_token.num >= 0x20 && re_ctx->curr_token.num <= 0x7e) ?
+ (int) re_ctx->curr_token.num : (int) '?'));
+
+ /* set by atom case clauses */
+ new_atom_start_offset = -1;
+ new_atom_char_length = -1;
+ new_atom_start_captures = re_ctx->captures;
+
+ switch (re_ctx->curr_token.t) {
+ case DUK_RETOK_DISJUNCTION: {
+ /*
+ * The handling here is a bit tricky. If a previous '|' has been processed,
+ * we have a pending split1 and a pending jump (for a previous match). These
+ * need to be back-patched carefully. See docs for a detailed example.
+ */
+
+ /* patch pending jump and split */
+ if (unpatched_disjunction_jump >= 0) {
+ duk_uint32_t offset;
+
+ DUK_ASSERT(unpatched_disjunction_split >= 0);
+ offset = (duk_uint32_t) unpatched_disjunction_jump;
+ offset += duk__insert_jump_offset(re_ctx,
+ offset,
+ (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset));
+ /* offset is now target of the pending split (right after jump) */
+ duk__insert_jump_offset(re_ctx,
+ (duk_uint32_t) unpatched_disjunction_split,
+ (duk_int32_t) offset - unpatched_disjunction_split);
+ }
+
+ /* add a new pending split to the beginning of the entire disjunction */
+ (void) duk__insert_u32(re_ctx,
+ entry_offset,
+ DUK_REOP_SPLIT1); /* prefer direct execution */
+ unpatched_disjunction_split = (duk_int32_t) (entry_offset + 1); /* +1 for opcode */
+
+ /* add a new pending match jump for latest finished alternative */
+ duk__append_reop(re_ctx, DUK_REOP_JUMP);
+ unpatched_disjunction_jump = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+
+ /* 'taint' result as complex */
+ res_charlen = -1;
+ break;
+ }
+ case DUK_RETOK_QUANTIFIER: {
+ if (atom_start_offset < 0) {
+ DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_NO_ATOM);
+ }
+ if (re_ctx->curr_token.qmin > re_ctx->curr_token.qmax) {
+ DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_VALUES);
+ }
+ if (atom_char_length >= 0) {
+ /*
+ * Simple atom
+ *
+ * If atom_char_length is zero, we'll have unbounded execution time for e.g.
+ * /()*x/.exec('x'). We can't just skip the match because it might have some
+ * side effects (for instance, if we allowed captures in simple atoms, the
+ * capture needs to happen). The simple solution below is to force the
+ * quantifier to match at most once, since the additional matches have no effect.
+ *
+ * With a simple atom there can be no capture groups, so no captures need
+ * to be reset.
+ */
+ duk_int32_t atom_code_length;
+ duk_uint32_t offset;
+ duk_uint32_t qmin, qmax;
+
+ qmin = re_ctx->curr_token.qmin;
+ qmax = re_ctx->curr_token.qmax;
+ if (atom_char_length == 0) {
+ /* qmin and qmax will be 0 or 1 */
+ if (qmin > 1) {
+ qmin = 1;
+ }
+ if (qmax > 1) {
+ qmax = 1;
+ }
+ }
+
+ duk__append_reop(re_ctx, DUK_REOP_MATCH); /* complete 'sub atom' */
+ atom_code_length = (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (duk_size_t) atom_start_offset);
+
+ offset = (duk_uint32_t) atom_start_offset;
+ if (re_ctx->curr_token.greedy) {
+ offset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQGREEDY);
+ offset += duk__insert_u32(re_ctx, offset, qmin);
+ offset += duk__insert_u32(re_ctx, offset, qmax);
+ offset += duk__insert_u32(re_ctx, offset, (duk_uint32_t) atom_char_length);
+ offset += duk__insert_jump_offset(re_ctx, offset, atom_code_length);
+ } else {
+ offset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQMINIMAL);
+ offset += duk__insert_u32(re_ctx, offset, qmin);
+ offset += duk__insert_u32(re_ctx, offset, qmax);
+ offset += duk__insert_jump_offset(re_ctx, offset, atom_code_length);
+ }
+ DUK_UNREF(offset); /* silence scan-build warning */
+ } else {
+ /*
+ * Complex atom
+ *
+ * The original code is used as a template, and removed at the end
+ * (this differs from the handling of simple quantifiers).
+ *
+ * NOTE: there is no current solution for empty atoms in complex
+ * quantifiers. This would need some sort of a 'progress' instruction.
+ *
+ * XXX: impose limit on maximum result size, i.e. atom_code_len * atom_copies?
+ */
+ duk_int32_t atom_code_length;
+ duk_uint32_t atom_copies;
+ duk_uint32_t tmp_qmin, tmp_qmax;
+
+ /* pre-check how many atom copies we're willing to make (atom_copies not needed below) */
+ atom_copies = (re_ctx->curr_token.qmax == DUK_RE_QUANTIFIER_INFINITE) ?
+ re_ctx->curr_token.qmin : re_ctx->curr_token.qmax;
+ if (atom_copies > DUK_RE_MAX_ATOM_COPIES) {
+ DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_QUANTIFIER_TOO_MANY_COPIES);
+ }
+
+ /* wipe the capture range made by the atom (if any) */
+ DUK_ASSERT(atom_start_captures <= re_ctx->captures);
+ if (atom_start_captures != re_ctx->captures) {
+ DUK_ASSERT(atom_start_captures < re_ctx->captures);
+ DUK_DDD(DUK_DDDPRINT("must wipe ]atom_start_captures,re_ctx->captures]: ]%ld,%ld]",
+ (long) atom_start_captures, (long) re_ctx->captures));
+
+ /* insert (DUK_REOP_WIPERANGE, start, count) in reverse order so the order ends up right */
+ duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (re_ctx->captures - atom_start_captures) * 2U);
+ duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (atom_start_captures + 1) * 2);
+ duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, DUK_REOP_WIPERANGE);
+ } else {
+ DUK_DDD(DUK_DDDPRINT("no need to wipe captures: atom_start_captures == re_ctx->captures == %ld",
+ (long) atom_start_captures));
+ }
+
+ atom_code_length = (duk_int32_t) DUK__RE_BUFLEN(re_ctx) - atom_start_offset;
+
+ /* insert the required matches (qmin) by copying the atom */
+ tmp_qmin = re_ctx->curr_token.qmin;
+ tmp_qmax = re_ctx->curr_token.qmax;
+ while (tmp_qmin > 0) {
+ duk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);
+ tmp_qmin--;
+ if (tmp_qmax != DUK_RE_QUANTIFIER_INFINITE) {
+ tmp_qmax--;
+ }
+ }
+ DUK_ASSERT(tmp_qmin == 0);
+
+ /* insert code for matching the remainder - infinite or finite */
+ if (tmp_qmax == DUK_RE_QUANTIFIER_INFINITE) {
+ /* reuse last emitted atom for remaining 'infinite' quantifier */
+
+ if (re_ctx->curr_token.qmin == 0) {
+ /* Special case: original qmin was zero so there is nothing
+ * to repeat. Emit an atom copy but jump over it here.
+ */
+ duk__append_reop(re_ctx, DUK_REOP_JUMP);
+ duk__append_jump_offset(re_ctx, atom_code_length);
+ duk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);
+ }
+ if (re_ctx->curr_token.greedy) {
+ duk__append_reop(re_ctx, DUK_REOP_SPLIT2); /* prefer jump */
+ } else {
+ duk__append_reop(re_ctx, DUK_REOP_SPLIT1); /* prefer direct */
+ }
+ duk__append_jump_offset(re_ctx, -atom_code_length - 1); /* -1 for opcode */
+ } else {
+ /*
+ * The remaining matches are emitted as sequence of SPLITs and atom
+ * copies; the SPLITs skip the remaining copies and match the sequel.
+ * This sequence needs to be emitted starting from the last copy
+ * because the SPLITs are variable length due to the variable length
+ * skip offset. This causes a lot of memory copying now.
+ *
+ * Example structure (greedy, match maximum # atoms):
+ *
+ * SPLIT1 LSEQ
+ * (atom)
+ * SPLIT1 LSEQ ; <- the byte length of this instruction is needed
+ * (atom) ; to encode the above SPLIT1 correctly
+ * ...
+ * LSEQ:
+ */
+ duk_uint32_t offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);
+ while (tmp_qmax > 0) {
+ duk__insert_slice(re_ctx, offset, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);
+ if (re_ctx->curr_token.greedy) {
+ duk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT1); /* prefer direct */
+ } else {
+ duk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT2); /* prefer jump */
+ }
+ duk__insert_jump_offset(re_ctx,
+ offset + 1, /* +1 for opcode */
+ (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1)));
+ tmp_qmax--;
+ }
+ }
+
+ /* remove the original 'template' atom */
+ duk__remove_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);
+ }
+
+ /* 'taint' result as complex */
+ res_charlen = -1;
+ break;
+ }
+ case DUK_RETOK_ASSERT_START: {
+ duk__append_reop(re_ctx, DUK_REOP_ASSERT_START);
+ break;
+ }
+ case DUK_RETOK_ASSERT_END: {
+ duk__append_reop(re_ctx, DUK_REOP_ASSERT_END);
+ break;
+ }
+ case DUK_RETOK_ASSERT_WORD_BOUNDARY: {
+ duk__append_reop(re_ctx, DUK_REOP_ASSERT_WORD_BOUNDARY);
+ break;
+ }
+ case DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY: {
+ duk__append_reop(re_ctx, DUK_REOP_ASSERT_NOT_WORD_BOUNDARY);
+ break;
+ }
+ case DUK_RETOK_ASSERT_START_POS_LOOKAHEAD:
+ case DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD: {
+ duk_uint32_t offset;
+ duk_uint32_t opcode = (re_ctx->curr_token.t == DUK_RETOK_ASSERT_START_POS_LOOKAHEAD) ?
+ DUK_REOP_LOOKPOS : DUK_REOP_LOOKNEG;
+
+ offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);
+ duk__parse_disjunction(re_ctx, 0, &tmp_disj);
+ duk__append_reop(re_ctx, DUK_REOP_MATCH);
+
+ (void) duk__insert_u32(re_ctx, offset, opcode);
+ (void) duk__insert_jump_offset(re_ctx,
+ offset + 1, /* +1 for opcode */
+ (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1)));
+
+ /* 'taint' result as complex -- this is conservative,
+ * as lookaheads do not backtrack.
+ */
+ res_charlen = -1;
+ break;
+ }
+ case DUK_RETOK_ATOM_PERIOD: {
+ new_atom_char_length = 1;
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+ duk__append_reop(re_ctx, DUK_REOP_PERIOD);
+ break;
+ }
+ case DUK_RETOK_ATOM_CHAR: {
+ /* Note: successive characters could be joined into string matches
+ * but this is not trivial (consider e.g. '/xyz+/); see docs for
+ * more discussion.
+ *
+ * No support for \u{H+} yet. While only BMP Unicode escapes are
+ * supported for RegExps at present, 'ch' may still be a non-BMP
+ * codepoint if it is decoded straight from source text UTF-8.
+ * There's no non-BMP support yet so this is handled simply by
+ * matching the non-BMP character (which is custom behavior).
+ */
+ duk_uint32_t ch;
+
+ new_atom_char_length = 1;
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+ duk__append_reop(re_ctx, DUK_REOP_CHAR);
+ ch = re_ctx->curr_token.num;
+ if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) {
+ ch = (duk_uint32_t) duk_unicode_re_canonicalize_char(re_ctx->thr, (duk_codepoint_t) ch);
+ }
+ duk__append_u32(re_ctx, ch);
+ break;
+ }
+ case DUK_RETOK_ATOM_DIGIT:
+ case DUK_RETOK_ATOM_NOT_DIGIT:
+ case DUK_RETOK_ATOM_WHITE:
+ case DUK_RETOK_ATOM_NOT_WHITE:
+ case DUK_RETOK_ATOM_WORD_CHAR:
+ case DUK_RETOK_ATOM_NOT_WORD_CHAR: {
+ duk_small_uint_t re_op;
+ duk_small_uint_t idx;
+
+ new_atom_char_length = 1;
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+
+ DUK_ASSERT((DUK_RETOK_ATOM_DIGIT & 0x01) != 0);
+ DUK_ASSERT((DUK_RETOK_ATOM_WHITE & 0x01) != 0);
+ DUK_ASSERT((DUK_RETOK_ATOM_WORD_CHAR & 0x01) != 0);
+ DUK_ASSERT((DUK_RETOK_ATOM_NOT_DIGIT & 0x01) == 0);
+ DUK_ASSERT((DUK_RETOK_ATOM_NOT_WHITE & 0x01) == 0);
+ DUK_ASSERT((DUK_RETOK_ATOM_NOT_WORD_CHAR & 0x01) == 0);
+ re_op = (re_ctx->curr_token.t & 0x01) ? DUK_REOP_RANGES : DUK_REOP_INVRANGES;
+
+ DUK_ASSERT(DUK_RETOK_ATOM_WHITE == DUK_RETOK_ATOM_DIGIT + 2);
+ DUK_ASSERT(DUK_RETOK_ATOM_WORD_CHAR == DUK_RETOK_ATOM_DIGIT + 4);
+ idx = (duk_small_uint_t) ((re_ctx->curr_token.t - DUK_RETOK_ATOM_DIGIT) >> 1U);
+ DUK_ASSERT(idx <= 2U); /* Assume continuous token numbers; also checks negative underflow. */
+
+ duk__append_range_atom_matcher(re_ctx, re_op, duk__re_range_lookup1[idx], duk__re_range_lookup2[idx]);
+ break;
+ }
+ case DUK_RETOK_ATOM_BACKREFERENCE: {
+ duk_uint32_t backref = (duk_uint32_t) re_ctx->curr_token.num;
+ if (backref > re_ctx->highest_backref) {
+ re_ctx->highest_backref = backref;
+ }
+ new_atom_char_length = -1; /* mark as complex */
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+ duk__append_reop(re_ctx, DUK_REOP_BACKREFERENCE);
+ duk__append_u32(re_ctx, backref);
+ break;
+ }
+ case DUK_RETOK_ATOM_START_CAPTURE_GROUP: {
+ duk_uint32_t cap;
+
+ new_atom_char_length = -1; /* mark as complex (capture handling) */
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+ cap = ++re_ctx->captures;
+ duk__append_reop(re_ctx, DUK_REOP_SAVE);
+ duk__append_u32(re_ctx, cap * 2);
+ duk__parse_disjunction(re_ctx, 0, &tmp_disj); /* retval (sub-atom char length) unused, tainted as complex above */
+ duk__append_reop(re_ctx, DUK_REOP_SAVE);
+ duk__append_u32(re_ctx, cap * 2 + 1);
+ break;
+ }
+ case DUK_RETOK_ATOM_START_NONCAPTURE_GROUP: {
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+ duk__parse_disjunction(re_ctx, 0, &tmp_disj);
+ new_atom_char_length = tmp_disj.charlen;
+ break;
+ }
+ case DUK_RETOK_ATOM_START_CHARCLASS:
+ case DUK_RETOK_ATOM_START_CHARCLASS_INVERTED: {
+ /*
+ * Range parsing is done with a special lexer function which calls
+ * us for every range parsed. This is different from how rest of
+ * the parsing works, but avoids a heavy, arbitrary size intermediate
+ * value type to hold the ranges.
+ *
+ * Another complication is the handling of character ranges when
+ * case insensitive matching is used (see docs for discussion).
+ * The range handler callback given to the lexer takes care of this
+ * as well.
+ *
+ * Note that duplicate ranges are not eliminated when parsing character
+ * classes, so that canonicalization of
+ *
+ * [0-9a-fA-Fx-{]
+ *
+ * creates the result (note the duplicate ranges):
+ *
+ * [0-9A-FA-FX-Z{-{]
+ *
+ * where [x-{] is split as a result of canonicalization. The duplicate
+ * ranges are not a semantics issue: they work correctly.
+ */
+
+ duk_uint32_t offset;
+
+ DUK_DD(DUK_DDPRINT("character class"));
+
+ /* insert ranges instruction, range count patched in later */
+ new_atom_char_length = 1;
+ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);
+ duk__append_reop(re_ctx,
+ (re_ctx->curr_token.t == DUK_RETOK_ATOM_START_CHARCLASS) ?
+ DUK_REOP_RANGES : DUK_REOP_INVRANGES);
+ offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); /* patch in range count later */
+
+ /* parse ranges until character class ends */
+ re_ctx->nranges = 0; /* note: ctx-wide temporary */
+ duk_lexer_parse_re_ranges(&re_ctx->lex, duk__regexp_generate_ranges, (void *) re_ctx);
+
+ /* insert range count */
+ duk__insert_u32(re_ctx, offset, re_ctx->nranges);
+ break;
+ }
+ case DUK_RETOK_ATOM_END_GROUP: {
+ if (expect_eof) {
+ DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_CLOSING_PAREN);
+ }
+ goto done;
+ }
+ case DUK_RETOK_EOF: {
+ if (!expect_eof) {
+ DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_END_OF_PATTERN);
+ }
+ goto done;
+ }
+ default: {
+ DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_REGEXP_TOKEN);
+ }
+ }
+
+ /* a complex (new) atom taints the result */
+ if (new_atom_start_offset >= 0) {
+ if (new_atom_char_length < 0) {
+ res_charlen = -1;
+ } else if (res_charlen >= 0) {
+ /* only advance if not tainted */
+ res_charlen += new_atom_char_length;
+ }
+ }
+
+ /* record previous atom info in case next token is a quantifier */
+ atom_start_offset = new_atom_start_offset;
+ atom_char_length = new_atom_char_length;
+ atom_start_captures = new_atom_start_captures;
+ }
+
+ done:
+
+ /* finish up pending jump and split for last alternative */
+ if (unpatched_disjunction_jump >= 0) {
+ duk_uint32_t offset;
+
+ DUK_ASSERT(unpatched_disjunction_split >= 0);
+ offset = (duk_uint32_t) unpatched_disjunction_jump;
+ offset += duk__insert_jump_offset(re_ctx,
+ offset,
+ (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset));
+ /* offset is now target of the pending split (right after jump) */
+ duk__insert_jump_offset(re_ctx,
+ (duk_uint32_t) unpatched_disjunction_split,
+ (duk_int32_t) offset - unpatched_disjunction_split);
+ }
+
+#if 0
+ out_atom_info->end_captures = re_ctx->captures;
+#endif
+ out_atom_info->charlen = res_charlen;
+ DUK_DDD(DUK_DDDPRINT("parse disjunction finished: charlen=%ld",
+ (long) out_atom_info->charlen));
+
+ re_ctx->recursion_depth--;
+}
+
+/*
+ * Flags parsing (see E5 Section 15.10.4.1).
+ */
+
+DUK_LOCAL duk_uint32_t duk__parse_regexp_flags(duk_hthread *thr, duk_hstring *h) {
+ const duk_uint8_t *p;
+ const duk_uint8_t *p_end;
+ duk_uint32_t flags = 0;
+
+ p = DUK_HSTRING_GET_DATA(h);
+ p_end = p + DUK_HSTRING_GET_BYTELEN(h);
+
+ /* Note: can be safely scanned as bytes (undecoded) */
+
+ while (p < p_end) {
+ duk_uint8_t c = *p++;
+ switch (c) {
+ case (duk_uint8_t) 'g': {
+ if (flags & DUK_RE_FLAG_GLOBAL) {
+ goto flags_error;
+ }
+ flags |= DUK_RE_FLAG_GLOBAL;
+ break;
+ }
+ case (duk_uint8_t) 'i': {
+ if (flags & DUK_RE_FLAG_IGNORE_CASE) {
+ goto flags_error;
+ }
+ flags |= DUK_RE_FLAG_IGNORE_CASE;
+ break;
+ }
+ case (duk_uint8_t) 'm': {
+ if (flags & DUK_RE_FLAG_MULTILINE) {
+ goto flags_error;
+ }
+ flags |= DUK_RE_FLAG_MULTILINE;
+ break;
+ }
+ default: {
+ goto flags_error;
+ }
+ }
+ }
+
+ return flags;
+
+ flags_error:
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_REGEXP_FLAGS);
+ return 0; /* never here */
+}
+
+/*
+ * Create escaped RegExp source (E5 Section 15.10.3).
+ *
+ * The current approach is to special case the empty RegExp
+ * ('' -> '(?:)') and otherwise replace unescaped '/' characters
+ * with '\/' regardless of where they occur in the regexp.
+ *
+ * Note that normalization does not seem to be necessary for
+ * RegExp literals (e.g. '/foo/') because to be acceptable as
+ * a RegExp literal, the text between forward slashes must
+ * already match the escaping requirements (e.g. must not contain
+ * unescaped forward slashes or be empty). Escaping IS needed
+ * for expressions like 'new Regexp("...", "")' however.
+ * Currently, we re-escape in either case.
+ *
+ * Also note that we process the source here in UTF-8 encoded
+ * form. This is correct, because any non-ASCII characters are
+ * passed through without change.
+ */
+
+DUK_LOCAL void duk__create_escaped_source(duk_hthread *thr, int idx_pattern) {
+ duk_hstring *h;
+ const duk_uint8_t *p;
+ duk_bufwriter_ctx bw_alloc;
+ duk_bufwriter_ctx *bw;
+ duk_uint8_t *q;
+ duk_size_t i, n;
+ duk_uint_fast8_t c_prev, c;
+
+ h = duk_known_hstring(thr, idx_pattern);
+ p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);
+ n = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h);
+
+ if (n == 0) {
+ duk_push_string(thr, "(?:)");
+ return;
+ }
+
+ bw = &bw_alloc;
+ DUK_BW_INIT_PUSHBUF(thr, bw, n);
+ q = DUK_BW_GET_PTR(thr, bw);
+
+ c_prev = (duk_uint_fast8_t) 0;
+
+ for (i = 0; i < n; i++) {
+ c = p[i];
+
+ q = DUK_BW_ENSURE_RAW(thr, bw, 2, q);
+
+ if (c == (duk_uint_fast8_t) '/' && c_prev != (duk_uint_fast8_t) '\\') {
+ /* Unescaped '/' ANYWHERE in the regexp (in disjunction,
+ * inside a character class, ...) => same escape works.
+ */
+ *q++ = DUK_ASC_BACKSLASH;
+ }
+ *q++ = (duk_uint8_t) c;
+
+ c_prev = c;
+ }
+
+ DUK_BW_SETPTR_AND_COMPACT(thr, bw, q);
+ (void) duk_buffer_to_string(thr, -1); /* Safe if input is safe. */
+
+ /* [ ... escaped_source ] */
+}
+
+/*
+ * Exposed regexp compilation primitive.
+ *
+ * Sets up a regexp compilation context, and calls duk__parse_disjunction() to do the
+ * actual parsing. Handles generation of the compiled regexp header and the
+ * "boilerplate" capture of the matching substring (save 0 and 1). Also does some
+ * global level regexp checks after recursive compilation has finished.
+ *
+ * An escaped version of the regexp source, suitable for use as a RegExp instance
+ * 'source' property (see E5 Section 15.10.3), is also left on the stack.
+ *
+ * Input stack: [ pattern flags ]
+ * Output stack: [ bytecode escaped_source ] (both as strings)
+ */
+
+DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) {
+ duk_re_compiler_ctx re_ctx;
+ duk_lexer_point lex_point;
+ duk_hstring *h_pattern;
+ duk_hstring *h_flags;
+ duk__re_disjunction_info ign_disj;
+
+ DUK_ASSERT(thr != NULL);
+
+ /*
+ * Args validation
+ */
+
+ /* TypeError if fails */
+ h_pattern = duk_require_hstring_notsymbol(thr, -2);
+ h_flags = duk_require_hstring_notsymbol(thr, -1);
+
+ /*
+ * Create normalized 'source' property (E5 Section 15.10.3).
+ */
+
+ /* [ ... pattern flags ] */
+
+ duk__create_escaped_source(thr, -2);
+
+ /* [ ... pattern flags escaped_source ] */
+
+ /*
+ * Init compilation context
+ */
+
+ /* [ ... pattern flags escaped_source buffer ] */
+
+ DUK_MEMZERO(&re_ctx, sizeof(re_ctx));
+ DUK_LEXER_INITCTX(&re_ctx.lex); /* duplicate zeroing, expect for (possible) NULL inits */
+ re_ctx.thr = thr;
+ re_ctx.lex.thr = thr;
+ re_ctx.lex.input = DUK_HSTRING_GET_DATA(h_pattern);
+ re_ctx.lex.input_length = DUK_HSTRING_GET_BYTELEN(h_pattern);
+ re_ctx.lex.token_limit = DUK_RE_COMPILE_TOKEN_LIMIT;
+ re_ctx.recursion_limit = DUK_USE_REGEXP_COMPILER_RECLIMIT;
+ re_ctx.re_flags = duk__parse_regexp_flags(thr, h_flags);
+
+ DUK_BW_INIT_PUSHBUF(thr, &re_ctx.bw, DUK__RE_INITIAL_BUFSIZE);
+
+ DUK_DD(DUK_DDPRINT("regexp compiler ctx initialized, flags=0x%08lx, recursion_limit=%ld",
+ (unsigned long) re_ctx.re_flags, (long) re_ctx.recursion_limit));
+
+ /*
+ * Init lexer
+ */
+
+ lex_point.offset = 0; /* expensive init, just want to fill window */
+ lex_point.line = 1;
+ DUK_LEXER_SETPOINT(&re_ctx.lex, &lex_point);
+
+ /*
+ * Compilation
+ */
+
+ DUK_DD(DUK_DDPRINT("starting regexp compilation"));
+
+ duk__append_reop(&re_ctx, DUK_REOP_SAVE);
+ duk__append_7bit(&re_ctx, 0);
+ duk__parse_disjunction(&re_ctx, 1 /*expect_eof*/, &ign_disj);
+ duk__append_reop(&re_ctx, DUK_REOP_SAVE);
+ duk__append_7bit(&re_ctx, 1);
+ duk__append_reop(&re_ctx, DUK_REOP_MATCH);
+
+ /*
+ * Check for invalid backreferences; note that it is NOT an error
+ * to back-reference a capture group which has not yet been introduced
+ * in the pattern (as in /\1(foo)/); in fact, the backreference will
+ * always match! It IS an error to back-reference a capture group
+ * which will never be introduced in the pattern. Thus, we can check
+ * for such references only after parsing is complete.
+ */
+
+ if (re_ctx.highest_backref > re_ctx.captures) {
+ DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BACKREFS);
+ }
+
+ /*
+ * Emit compiled regexp header: flags, ncaptures
+ * (insertion order inverted on purpose)
+ */
+
+ duk__insert_u32(&re_ctx, 0, (re_ctx.captures + 1) * 2);
+ duk__insert_u32(&re_ctx, 0, re_ctx.re_flags);
+
+ /* [ ... pattern flags escaped_source buffer ] */
+
+ DUK_BW_COMPACT(thr, &re_ctx.bw);
+ (void) duk_buffer_to_string(thr, -1); /* Safe because flags is at most 7 bit. */
+
+ /* [ ... pattern flags escaped_source bytecode ] */
+
+ /*
+ * Finalize stack
+ */
+
+ duk_remove(thr, -4); /* -> [ ... flags escaped_source bytecode ] */
+ duk_remove(thr, -3); /* -> [ ... escaped_source bytecode ] */
+
+ DUK_DD(DUK_DDPRINT("regexp compilation successful, bytecode: %!T, escaped source: %!T",
+ (duk_tval *) duk_get_tval(thr, -1), (duk_tval *) duk_get_tval(thr, -2)));
+}
+
+/*
+ * Create a RegExp instance (E5 Section 15.10.7).
+ *
+ * Note: the output stack left by duk_regexp_compile() is directly compatible
+ * with the input here.
+ *
+ * Input stack: [ escaped_source bytecode ] (both as strings)
+ * Output stack: [ RegExp ]
+ */
+
+DUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) {
+ duk_hobject *h;
+
+ /* [ ... escaped_source bytecode ] */
+
+ duk_push_object(thr);
+ h = duk_known_hobject(thr, -1);
+ duk_insert(thr, -3);
+
+ /* [ ... regexp_object escaped_source bytecode ] */
+
+ DUK_HOBJECT_SET_CLASS_NUMBER(h, DUK_HOBJECT_CLASS_REGEXP);
+ DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]);
+
+ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_BYTECODE, DUK_PROPDESC_FLAGS_NONE);
+
+ /* [ ... regexp_object escaped_source ] */
+
+ /* In ES2015 .source, and the .global, .multiline, etc flags are
+ * inherited getters. Store the escaped source as an internal
+ * property for the getter.
+ */
+
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE);
+
+ /* [ ... regexp_object ] */
+
+ duk_push_int(thr, 0);
+ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LAST_INDEX, DUK_PROPDESC_FLAGS_W);
+
+ /* [ ... regexp_object ] */
+}
+
+#else /* DUK_USE_REGEXP_SUPPORT */
+
+/* regexp support disabled */
+
+#endif /* DUK_USE_REGEXP_SUPPORT */
+
+/* automatic undefs */
+#undef DUK__RE_BUFLEN
+#undef DUK__RE_INITIAL_BUFSIZE
+#line 1 "duk_regexp_executor.c"
+/*
+ * Regexp executor.
+ *
+ * Safety: the Ecmascript executor should prevent user from reading and
+ * replacing regexp bytecode. Even so, the executor must validate all
+ * memory accesses etc. When an invalid access is detected (e.g. a 'save'
+ * opcode to invalid, unallocated index) it should fail with an internal
+ * error but not cause a segmentation fault.
+ *
+ * Notes:
+ *
+ * - Backtrack counts are limited to unsigned 32 bits but should
+ * technically be duk_size_t for strings longer than 4G chars.
+ * This also requires a regexp bytecode change.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_REGEXP_SUPPORT)
+
+/*
+ * Helpers for UTF-8 handling
+ *
+ * For bytecode readers the duk_uint32_t and duk_int32_t types are correct
+ * because they're used for more than just codepoints.
+ */
+
+DUK_LOCAL duk_uint32_t duk__bc_get_u32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) {
+ return (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end);
+}
+
+DUK_LOCAL duk_int32_t duk__bc_get_i32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) {
+ duk_uint32_t t;
+
+ /* signed integer encoding needed to work with UTF-8 */
+ t = (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end);
+ if (t & 1) {
+ return -((duk_int32_t) (t >> 1));
+ } else {
+ return (duk_int32_t) (t >> 1);
+ }
+}
+
+DUK_LOCAL const duk_uint8_t *duk__utf8_backtrack(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) {
+ const duk_uint8_t *p;
+
+ /* Note: allow backtracking from p == ptr_end */
+ p = *ptr;
+ if (p < ptr_start || p > ptr_end) {
+ goto fail;
+ }
+
+ while (count > 0) {
+ for (;;) {
+ p--;
+ if (p < ptr_start) {
+ goto fail;
+ }
+ if ((*p & 0xc0) != 0x80) {
+ /* utf-8 continuation bytes have the form 10xx xxxx */
+ break;
+ }
+ }
+ count--;
+ }
+ *ptr = p;
+ return p;
+
+ fail:
+ DUK_ERROR_INTERNAL(thr);
+ return NULL; /* never here */
+}
+
+DUK_LOCAL const duk_uint8_t *duk__utf8_advance(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) {
+ const duk_uint8_t *p;
+
+ p = *ptr;
+ if (p < ptr_start || p >= ptr_end) {
+ goto fail;
+ }
+
+ while (count > 0) {
+ for (;;) {
+ p++;
+
+ /* Note: if encoding ends by hitting end of input, we don't check that
+ * the encoding is valid, we just assume it is.
+ */
+ if (p >= ptr_end || ((*p & 0xc0) != 0x80)) {
+ /* utf-8 continuation bytes have the form 10xx xxxx */
+ break;
+ }
+ }
+ count--;
+ }
+
+ *ptr = p;
+ return p;
+
+ fail:
+ DUK_ERROR_INTERNAL(thr);
+ return NULL; /* never here */
+}
+
+/*
+ * Helpers for dealing with the input string
+ */
+
+/* Get a (possibly canonicalized) input character from current sp. The input
+ * itself is never modified, and captures always record non-canonicalized
+ * characters even in case-insensitive matching. Return <0 if out of input.
+ */
+DUK_LOCAL duk_codepoint_t duk__inp_get_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp) {
+ duk_codepoint_t res;
+
+ if (*sp >= re_ctx->input_end) {
+ return -1;
+ }
+ res = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end);
+ if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) {
+ res = duk_unicode_re_canonicalize_char(re_ctx->thr, res);
+ }
+ return res;
+}
+
+DUK_LOCAL const duk_uint8_t *duk__inp_backtrack(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp, duk_uint_fast32_t count) {
+ return duk__utf8_backtrack(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end, count);
+}
+
+/* Backtrack utf-8 input and return a (possibly canonicalized) input character. */
+DUK_LOCAL duk_codepoint_t duk__inp_get_prev_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *sp) {
+ /* note: caller 'sp' is intentionally not updated here */
+ (void) duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) 1);
+ return duk__inp_get_cp(re_ctx, &sp);
+}
+
+/*
+ * Regexp recursive matching function.
+ *
+ * Returns 'sp' on successful match (points to character after last matched one),
+ * NULL otherwise.
+ *
+ * The C recursion depth limit check is only performed in this function, this
+ * suffices because the function is present in all true recursion required by
+ * regexp execution.
+ */
+
+DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *pc, const duk_uint8_t *sp) {
+ if (re_ctx->recursion_depth >= re_ctx->recursion_limit) {
+ DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT);
+ }
+ re_ctx->recursion_depth++;
+
+ for (;;) {
+ duk_small_int_t op;
+
+ if (re_ctx->steps_count >= re_ctx->steps_limit) {
+ DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT);
+ }
+ re_ctx->steps_count++;
+
+ /* Opcodes are at most 7 bits now so they encode to one byte. If this
+ * were not the case or 'pc' is invalid here (due to a bug etc) we'll
+ * still fail safely through the switch default case.
+ */
+ DUK_ASSERT(pc[0] <= 0x7fU);
+#if 0
+ op = (duk_small_int_t) duk__bc_get_u32(re_ctx, &pc);
+#endif
+ op = *pc++;
+
+ DUK_DDD(DUK_DDDPRINT("match: rec=%ld, steps=%ld, pc (after op)=%ld, sp=%ld, op=%ld",
+ (long) re_ctx->recursion_depth,
+ (long) re_ctx->steps_count,
+ (long) (pc - re_ctx->bytecode),
+ (long) (sp - re_ctx->input),
+ (long) op));
+
+ switch (op) {
+ case DUK_REOP_MATCH: {
+ goto match;
+ }
+ case DUK_REOP_CHAR: {
+ /*
+ * Byte-based matching would be possible for case-sensitive
+ * matching but not for case-insensitive matching. So, we
+ * match by decoding the input and bytecode character normally.
+ *
+ * Bytecode characters are assumed to be already canonicalized.
+ * Input characters are canonicalized automatically by
+ * duk__inp_get_cp() if necessary.
+ *
+ * There is no opcode for matching multiple characters. The
+ * regexp compiler has trouble joining strings efficiently
+ * during compilation. See doc/regexp.rst for more discussion.
+ */
+ duk_codepoint_t c1, c2;
+
+ c1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc);
+ DUK_ASSERT(!(re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) ||
+ c1 == duk_unicode_re_canonicalize_char(re_ctx->thr, c1)); /* canonicalized by compiler */
+ c2 = duk__inp_get_cp(re_ctx, &sp);
+ /* No need to check for c2 < 0 (end of input): because c1 >= 0, it
+ * will fail the match below automatically and cause goto fail.
+ */
+#if 0
+ if (c2 < 0) {
+ goto fail;
+ }
+#endif
+ DUK_ASSERT(c1 >= 0);
+
+ DUK_DDD(DUK_DDDPRINT("char match, c1=%ld, c2=%ld", (long) c1, (long) c2));
+ if (c1 != c2) {
+ goto fail;
+ }
+ break;
+ }
+ case DUK_REOP_PERIOD: {
+ duk_codepoint_t c;
+
+ c = duk__inp_get_cp(re_ctx, &sp);
+ if (c < 0 || duk_unicode_is_line_terminator(c)) {
+ /* E5 Sections 15.10.2.8, 7.3 */
+ goto fail;
+ }
+ break;
+ }
+ case DUK_REOP_RANGES:
+ case DUK_REOP_INVRANGES: {
+ duk_uint32_t n;
+ duk_codepoint_t c;
+ duk_small_int_t match;
+
+ n = duk__bc_get_u32(re_ctx, &pc);
+ c = duk__inp_get_cp(re_ctx, &sp);
+ if (c < 0) {
+ goto fail;
+ }
+
+ match = 0;
+ while (n) {
+ duk_codepoint_t r1, r2;
+ r1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc);
+ r2 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc);
+ DUK_DDD(DUK_DDDPRINT("matching ranges/invranges, n=%ld, r1=%ld, r2=%ld, c=%ld",
+ (long) n, (long) r1, (long) r2, (long) c));
+ if (c >= r1 && c <= r2) {
+ /* Note: don't bail out early, we must read all the ranges from
+ * bytecode. Another option is to skip them efficiently after
+ * breaking out of here. Prefer smallest code.
+ */
+ match = 1;
+ }
+ n--;
+ }
+
+ if (op == DUK_REOP_RANGES) {
+ if (!match) {
+ goto fail;
+ }
+ } else {
+ DUK_ASSERT(op == DUK_REOP_INVRANGES);
+ if (match) {
+ goto fail;
+ }
+ }
+ break;
+ }
+ case DUK_REOP_ASSERT_START: {
+ duk_codepoint_t c;
+
+ if (sp <= re_ctx->input) {
+ break;
+ }
+ if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) {
+ goto fail;
+ }
+ c = duk__inp_get_prev_cp(re_ctx, sp);
+ if (duk_unicode_is_line_terminator(c)) {
+ /* E5 Sections 15.10.2.8, 7.3 */
+ break;
+ }
+ goto fail;
+ }
+ case DUK_REOP_ASSERT_END: {
+ duk_codepoint_t c;
+ const duk_uint8_t *tmp_sp;
+
+ tmp_sp = sp;
+ c = duk__inp_get_cp(re_ctx, &tmp_sp);
+ if (c < 0) {
+ break;
+ }
+ if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) {
+ goto fail;
+ }
+ if (duk_unicode_is_line_terminator(c)) {
+ /* E5 Sections 15.10.2.8, 7.3 */
+ break;
+ }
+ goto fail;
+ }
+ case DUK_REOP_ASSERT_WORD_BOUNDARY:
+ case DUK_REOP_ASSERT_NOT_WORD_BOUNDARY: {
+ /*
+ * E5 Section 15.10.2.6. The previous and current character
+ * should -not- be canonicalized as they are now. However,
+ * canonicalization does not affect the result of IsWordChar()
+ * (which depends on Unicode characters never canonicalizing
+ * into ASCII characters) so this does not matter.
+ */
+ duk_small_int_t w1, w2;
+
+ if (sp <= re_ctx->input) {
+ w1 = 0; /* not a wordchar */
+ } else {
+ duk_codepoint_t c;
+ c = duk__inp_get_prev_cp(re_ctx, sp);
+ w1 = duk_unicode_re_is_wordchar(c);
+ }
+ if (sp >= re_ctx->input_end) {
+ w2 = 0; /* not a wordchar */
+ } else {
+ const duk_uint8_t *tmp_sp = sp; /* dummy so sp won't get updated */
+ duk_codepoint_t c;
+ c = duk__inp_get_cp(re_ctx, &tmp_sp);
+ w2 = duk_unicode_re_is_wordchar(c);
+ }
+
+ if (op == DUK_REOP_ASSERT_WORD_BOUNDARY) {
+ if (w1 == w2) {
+ goto fail;
+ }
+ } else {
+ DUK_ASSERT(op == DUK_REOP_ASSERT_NOT_WORD_BOUNDARY);
+ if (w1 != w2) {
+ goto fail;
+ }
+ }
+ break;
+ }
+ case DUK_REOP_JUMP: {
+ duk_int32_t skip;
+
+ skip = duk__bc_get_i32(re_ctx, &pc);
+ pc += skip;
+ break;
+ }
+ case DUK_REOP_SPLIT1: {
+ /* split1: prefer direct execution (no jump) */
+ const duk_uint8_t *sub_sp;
+ duk_int32_t skip;
+
+ skip = duk__bc_get_i32(re_ctx, &pc);
+ sub_sp = duk__match_regexp(re_ctx, pc, sp);
+ if (sub_sp) {
+ sp = sub_sp;
+ goto match;
+ }
+ pc += skip;
+ break;
+ }
+ case DUK_REOP_SPLIT2: {
+ /* split2: prefer jump execution (not direct) */
+ const duk_uint8_t *sub_sp;
+ duk_int32_t skip;
+
+ skip = duk__bc_get_i32(re_ctx, &pc);
+ sub_sp = duk__match_regexp(re_ctx, pc + skip, sp);
+ if (sub_sp) {
+ sp = sub_sp;
+ goto match;
+ }
+ break;
+ }
+ case DUK_REOP_SQMINIMAL: {
+ duk_uint32_t q, qmin, qmax;
+ duk_int32_t skip;
+ const duk_uint8_t *sub_sp;
+
+ qmin = duk__bc_get_u32(re_ctx, &pc);
+ qmax = duk__bc_get_u32(re_ctx, &pc);
+ skip = duk__bc_get_i32(re_ctx, &pc);
+ DUK_DDD(DUK_DDDPRINT("minimal quantifier, qmin=%lu, qmax=%lu, skip=%ld",
+ (unsigned long) qmin, (unsigned long) qmax, (long) skip));
+
+ q = 0;
+ while (q <= qmax) {
+ if (q >= qmin) {
+ sub_sp = duk__match_regexp(re_ctx, pc + skip, sp);
+ if (sub_sp) {
+ sp = sub_sp;
+ goto match;
+ }
+ }
+ sub_sp = duk__match_regexp(re_ctx, pc, sp);
+ if (!sub_sp) {
+ break;
+ }
+ sp = sub_sp;
+ q++;
+ }
+ goto fail;
+ }
+ case DUK_REOP_SQGREEDY: {
+ duk_uint32_t q, qmin, qmax, atomlen;
+ duk_int32_t skip;
+ const duk_uint8_t *sub_sp;
+
+ qmin = duk__bc_get_u32(re_ctx, &pc);
+ qmax = duk__bc_get_u32(re_ctx, &pc);
+ atomlen = duk__bc_get_u32(re_ctx, &pc);
+ skip = duk__bc_get_i32(re_ctx, &pc);
+ DUK_DDD(DUK_DDDPRINT("greedy quantifier, qmin=%lu, qmax=%lu, atomlen=%lu, skip=%ld",
+ (unsigned long) qmin, (unsigned long) qmax, (unsigned long) atomlen, (long) skip));
+
+ q = 0;
+ while (q < qmax) {
+ sub_sp = duk__match_regexp(re_ctx, pc, sp);
+ if (!sub_sp) {
+ break;
+ }
+ sp = sub_sp;
+ q++;
+ }
+ while (q >= qmin) {
+ sub_sp = duk__match_regexp(re_ctx, pc + skip, sp);
+ if (sub_sp) {
+ sp = sub_sp;
+ goto match;
+ }
+ if (q == qmin) {
+ break;
+ }
+
+ /* Note: if atom were to contain e.g. captures, we would need to
+ * re-match the atom to get correct captures. Simply quantifiers
+ * do not allow captures in their atom now, so this is not an issue.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("greedy quantifier, backtrack %ld characters (atomlen)",
+ (long) atomlen));
+ sp = duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) atomlen);
+ q--;
+ }
+ goto fail;
+ }
+ case DUK_REOP_SAVE: {
+ duk_uint32_t idx;
+ const duk_uint8_t *old;
+ const duk_uint8_t *sub_sp;
+
+ idx = duk__bc_get_u32(re_ctx, &pc);
+ if (idx >= re_ctx->nsaved) {
+ /* idx is unsigned, < 0 check is not necessary */
+ DUK_D(DUK_DPRINT("internal error, regexp save index insane: idx=%ld", (long) idx));
+ goto internal_error;
+ }
+ old = re_ctx->saved[idx];
+ re_ctx->saved[idx] = sp;
+ sub_sp = duk__match_regexp(re_ctx, pc, sp);
+ if (sub_sp) {
+ sp = sub_sp;
+ goto match;
+ }
+ re_ctx->saved[idx] = old;
+ goto fail;
+ }
+ case DUK_REOP_WIPERANGE: {
+ /* Wipe capture range and save old values for backtracking.
+ *
+ * XXX: this typically happens with a relatively small idx_count.
+ * It might be useful to handle cases where the count is small
+ * (say <= 8) by saving the values in stack instead. This would
+ * reduce memory churn and improve performance, at the cost of a
+ * slightly higher code footprint.
+ */
+ duk_uint32_t idx_start, idx_count;
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ duk_uint32_t idx_end, idx;
+#endif
+ duk_uint8_t **range_save;
+ const duk_uint8_t *sub_sp;
+
+ idx_start = duk__bc_get_u32(re_ctx, &pc);
+ idx_count = duk__bc_get_u32(re_ctx, &pc);
+ DUK_DDD(DUK_DDDPRINT("wipe saved range: start=%ld, count=%ld -> [%ld,%ld] (captures [%ld,%ld])",
+ (long) idx_start, (long) idx_count,
+ (long) idx_start, (long) (idx_start + idx_count - 1),
+ (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2)));
+ if (idx_start + idx_count > re_ctx->nsaved || idx_count == 0) {
+ /* idx is unsigned, < 0 check is not necessary */
+ DUK_D(DUK_DPRINT("internal error, regexp wipe indices insane: idx_start=%ld, idx_count=%ld",
+ (long) idx_start, (long) idx_count));
+ goto internal_error;
+ }
+ DUK_ASSERT(idx_count > 0);
+
+ duk_require_stack(re_ctx->thr, 1);
+ range_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr,
+ sizeof(duk_uint8_t *) * idx_count);
+ DUK_ASSERT(range_save != NULL);
+ DUK_MEMCPY(range_save, re_ctx->saved + idx_start, sizeof(duk_uint8_t *) * idx_count);
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ idx_end = idx_start + idx_count;
+ for (idx = idx_start; idx < idx_end; idx++) {
+ re_ctx->saved[idx] = NULL;
+ }
+#else
+ DUK_MEMZERO((void *) (re_ctx->saved + idx_start), sizeof(duk_uint8_t *) * idx_count);
+#endif
+
+ sub_sp = duk__match_regexp(re_ctx, pc, sp);
+ if (sub_sp) {
+ /* match: keep wiped/resaved values */
+ DUK_DDD(DUK_DDDPRINT("match: keep wiped/resaved values [%ld,%ld] (captures [%ld,%ld])",
+ (long) idx_start, (long) (idx_start + idx_count - 1),
+ (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2)));
+ duk_pop_unsafe(re_ctx->thr);
+ sp = sub_sp;
+ goto match;
+ }
+
+ /* fail: restore saves */
+ DUK_DDD(DUK_DDDPRINT("fail: restore wiped/resaved values [%ld,%ld] (captures [%ld,%ld])",
+ (long) idx_start, (long) (idx_start + idx_count - 1),
+ (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2)));
+ DUK_MEMCPY((void *) (re_ctx->saved + idx_start),
+ (const void *) range_save,
+ sizeof(duk_uint8_t *) * idx_count);
+ duk_pop_unsafe(re_ctx->thr);
+ goto fail;
+ }
+ case DUK_REOP_LOOKPOS:
+ case DUK_REOP_LOOKNEG: {
+ /*
+ * Needs a save of multiple saved[] entries depending on what range
+ * may be overwritten. Because the regexp parser does no such analysis,
+ * we currently save the entire saved array here. Lookaheads are thus
+ * a bit expensive. Note that the saved array is not needed for just
+ * the lookahead sub-match, but for the matching of the entire sequel.
+ *
+ * The temporary save buffer is pushed on to the valstack to handle
+ * errors correctly. Each lookahead causes a C recursion and pushes
+ * more stuff on the value stack. If the C recursion limit is less
+ * than the value stack slack, there is no need to check the stack.
+ * We do so regardless, just in case.
+ */
+
+ duk_int32_t skip;
+ duk_uint8_t **full_save;
+ const duk_uint8_t *sub_sp;
+
+ DUK_ASSERT(re_ctx->nsaved > 0);
+
+ duk_require_stack(re_ctx->thr, 1);
+ full_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr,
+ sizeof(duk_uint8_t *) * re_ctx->nsaved);
+ DUK_ASSERT(full_save != NULL);
+ DUK_MEMCPY(full_save, re_ctx->saved, sizeof(duk_uint8_t *) * re_ctx->nsaved);
+
+ skip = duk__bc_get_i32(re_ctx, &pc);
+ sub_sp = duk__match_regexp(re_ctx, pc, sp);
+ if (op == DUK_REOP_LOOKPOS) {
+ if (!sub_sp) {
+ goto lookahead_fail;
+ }
+ } else {
+ if (sub_sp) {
+ goto lookahead_fail;
+ }
+ }
+ sub_sp = duk__match_regexp(re_ctx, pc + skip, sp);
+ if (sub_sp) {
+ /* match: keep saves */
+ duk_pop_unsafe(re_ctx->thr);
+ sp = sub_sp;
+ goto match;
+ }
+
+ /* fall through */
+
+ lookahead_fail:
+ /* fail: restore saves */
+ DUK_MEMCPY((void *) re_ctx->saved,
+ (const void *) full_save,
+ sizeof(duk_uint8_t *) * re_ctx->nsaved);
+ duk_pop_unsafe(re_ctx->thr);
+ goto fail;
+ }
+ case DUK_REOP_BACKREFERENCE: {
+ /*
+ * Byte matching for back-references would be OK in case-
+ * sensitive matching. In case-insensitive matching we need
+ * to canonicalize characters, so back-reference matching needs
+ * to be done with codepoints instead. So, we just decode
+ * everything normally here, too.
+ *
+ * Note: back-reference index which is 0 or higher than
+ * NCapturingParens (= number of capturing parens in the
+ * -entire- regexp) is a compile time error. However, a
+ * backreference referring to a valid capture which has
+ * not matched anything always succeeds! See E5 Section
+ * 15.10.2.9, step 5, sub-step 3.
+ */
+ duk_uint32_t idx;
+ const duk_uint8_t *p;
+
+ idx = duk__bc_get_u32(re_ctx, &pc);
+ idx = idx << 1; /* backref n -> saved indices [n*2, n*2+1] */
+ if (idx < 2 || idx + 1 >= re_ctx->nsaved) {
+ /* regexp compiler should catch these */
+ DUK_D(DUK_DPRINT("internal error, backreference index insane"));
+ goto internal_error;
+ }
+ if (!re_ctx->saved[idx] || !re_ctx->saved[idx+1]) {
+ /* capture is 'undefined', always matches! */
+ DUK_DDD(DUK_DDDPRINT("backreference: saved[%ld,%ld] not complete, always match",
+ (long) idx, (long) (idx + 1)));
+ break;
+ }
+ DUK_DDD(DUK_DDDPRINT("backreference: match saved[%ld,%ld]", (long) idx, (long) (idx + 1)));
+
+ p = re_ctx->saved[idx];
+ while (p < re_ctx->saved[idx+1]) {
+ duk_codepoint_t c1, c2;
+
+ /* Note: not necessary to check p against re_ctx->input_end:
+ * the memory access is checked by duk__inp_get_cp(), while
+ * valid compiled regexps cannot write a saved[] entry
+ * which points to outside the string.
+ */
+ c1 = duk__inp_get_cp(re_ctx, &p);
+ DUK_ASSERT(c1 >= 0);
+ c2 = duk__inp_get_cp(re_ctx, &sp);
+ /* No need for an explicit c2 < 0 check: because c1 >= 0,
+ * the comparison will always fail if c2 < 0.
+ */
+#if 0
+ if (c2 < 0) {
+ goto fail;
+ }
+#endif
+ if (c1 != c2) {
+ goto fail;
+ }
+ }
+ break;
+ }
+ default: {
+ DUK_D(DUK_DPRINT("internal error, regexp opcode error: %ld", (long) op));
+ goto internal_error;
+ }
+ }
+ }
+
+ match:
+ re_ctx->recursion_depth--;
+ return sp;
+
+ fail:
+ re_ctx->recursion_depth--;
+ return NULL;
+
+ internal_error:
+ DUK_ERROR_INTERNAL(re_ctx->thr);
+ return NULL; /* never here */
+}
+
+/*
+ * Exposed matcher function which provides the semantics of RegExp.prototype.exec().
+ *
+ * RegExp.prototype.test() has the same semantics as exec() but does not return the
+ * result object (which contains the matching string and capture groups). Currently
+ * there is no separate test() helper, so a temporary result object is created and
+ * discarded if test() is needed. This is intentional, to save code space.
+ *
+ * Input stack: [ ... re_obj input ]
+ * Output stack: [ ... result ]
+ */
+
+DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_global) {
+ duk_re_matcher_ctx re_ctx;
+ duk_hobject *h_regexp;
+ duk_hstring *h_bytecode;
+ duk_hstring *h_input;
+ duk_uint8_t *p_buf;
+ const duk_uint8_t *pc;
+ const duk_uint8_t *sp;
+ duk_small_int_t match = 0;
+ duk_small_int_t global;
+ duk_uint_fast32_t i;
+ double d;
+ duk_uint32_t char_offset;
+
+ DUK_ASSERT(thr != NULL);
+
+ DUK_DD(DUK_DDPRINT("regexp match: regexp=%!T, input=%!T",
+ (duk_tval *) duk_get_tval(thr, -2),
+ (duk_tval *) duk_get_tval(thr, -1)));
+
+ /*
+ * Regexp instance check, bytecode check, input coercion.
+ *
+ * See E5 Section 15.10.6.
+ */
+
+ /* TypeError if wrong; class check, see E5 Section 15.10.6 */
+ h_regexp = duk_require_hobject_with_class(thr, -2, DUK_HOBJECT_CLASS_REGEXP);
+ DUK_ASSERT(h_regexp != NULL);
+ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_regexp) == DUK_HOBJECT_CLASS_REGEXP);
+ DUK_UNREF(h_regexp);
+
+ h_input = duk_to_hstring(thr, -1);
+ DUK_ASSERT(h_input != NULL);
+
+ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_INT_BYTECODE); /* [ ... re_obj input ] -> [ ... re_obj input bc ] */
+ h_bytecode = duk_require_hstring(thr, -1); /* no regexp instance should exist without a non-configurable bytecode property */
+ DUK_ASSERT(h_bytecode != NULL);
+
+ /*
+ * Basic context initialization.
+ *
+ * Some init values are read from the bytecode header
+ * whose format is (UTF-8 codepoints):
+ *
+ * uint flags
+ * uint nsaved (even, 2n+2 where n = num captures)
+ */
+
+ /* [ ... re_obj input bc ] */
+
+ DUK_MEMZERO(&re_ctx, sizeof(re_ctx));
+
+ re_ctx.thr = thr;
+ re_ctx.input = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);
+ re_ctx.input_end = re_ctx.input + DUK_HSTRING_GET_BYTELEN(h_input);
+ re_ctx.bytecode = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_bytecode);
+ re_ctx.bytecode_end = re_ctx.bytecode + DUK_HSTRING_GET_BYTELEN(h_bytecode);
+ re_ctx.saved = NULL;
+ re_ctx.recursion_limit = DUK_USE_REGEXP_EXECUTOR_RECLIMIT;
+ re_ctx.steps_limit = DUK_RE_EXECUTE_STEPS_LIMIT;
+
+ /* read header */
+ pc = re_ctx.bytecode;
+ re_ctx.re_flags = duk__bc_get_u32(&re_ctx, &pc);
+ re_ctx.nsaved = duk__bc_get_u32(&re_ctx, &pc);
+ re_ctx.bytecode = pc;
+
+ DUK_ASSERT(DUK_RE_FLAG_GLOBAL < 0x10000UL); /* must fit into duk_small_int_t */
+ global = (duk_small_int_t) (force_global | (duk_small_int_t) (re_ctx.re_flags & DUK_RE_FLAG_GLOBAL));
+
+ DUK_ASSERT(re_ctx.nsaved >= 2);
+ DUK_ASSERT((re_ctx.nsaved % 2) == 0);
+
+ p_buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, sizeof(duk_uint8_t *) * re_ctx.nsaved); /* rely on zeroing */
+ DUK_UNREF(p_buf);
+ re_ctx.saved = (const duk_uint8_t **) duk_get_buffer(thr, -1, NULL);
+ DUK_ASSERT(re_ctx.saved != NULL);
+
+ /* [ ... re_obj input bc saved_buf ] */
+
+#if defined(DUK_USE_EXPLICIT_NULL_INIT)
+ for (i = 0; i < re_ctx.nsaved; i++) {
+ re_ctx.saved[i] = (duk_uint8_t *) NULL;
+ }
+#elif defined(DUK_USE_ZERO_BUFFER_DATA)
+ /* buffer is automatically zeroed */
+#else
+ DUK_MEMZERO((void *) p_buf, sizeof(duk_uint8_t *) * re_ctx.nsaved);
+#endif
+
+ DUK_DDD(DUK_DDDPRINT("regexp ctx initialized, flags=0x%08lx, nsaved=%ld, recursion_limit=%ld, steps_limit=%ld",
+ (unsigned long) re_ctx.re_flags, (long) re_ctx.nsaved, (long) re_ctx.recursion_limit,
+ (long) re_ctx.steps_limit));
+
+ /*
+ * Get starting character offset for match, and initialize 'sp' based on it.
+ *
+ * Note: lastIndex is non-configurable so it must be present (we check the
+ * internal class of the object above, so we know it is). User code can set
+ * its value to an arbitrary (garbage) value though; E5 requires that lastIndex
+ * be coerced to a number before using. The code below works even if the
+ * property is missing: the value will then be coerced to zero.
+ *
+ * Note: lastIndex may be outside Uint32 range even after ToInteger() coercion.
+ * For instance, ToInteger(+Infinity) = +Infinity. We track the match offset
+ * as an integer, but pre-check it to be inside the 32-bit range before the loop.
+ * If not, the check in E5 Section 15.10.6.2, step 9.a applies.
+ */
+
+ /* XXX: lastIndex handling produces a lot of asm */
+
+ /* [ ... re_obj input bc saved_buf ] */
+
+ duk_get_prop_stridx_short(thr, -4, DUK_STRIDX_LAST_INDEX); /* -> [ ... re_obj input bc saved_buf lastIndex ] */
+ (void) duk_to_int(thr, -1); /* ToInteger(lastIndex) */
+ d = duk_get_number(thr, -1); /* integer, but may be +/- Infinite, +/- zero (not NaN, though) */
+ duk_pop_nodecref_unsafe(thr);
+
+ if (global) {
+ if (d < 0.0 || d > (double) DUK_HSTRING_GET_CHARLEN(h_input)) {
+ /* match fail */
+ char_offset = 0; /* not really necessary */
+ DUK_ASSERT(match == 0);
+ goto match_over;
+ }
+ char_offset = (duk_uint32_t) d;
+ } else {
+ /* lastIndex must be ignored for non-global regexps, but get the
+ * value for (theoretical) side effects. No side effects can
+ * really occur, because lastIndex is a normal property and is
+ * always non-configurable for RegExp instances.
+ */
+ char_offset = (duk_uint32_t) 0;
+ }
+
+ DUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input));
+ sp = re_ctx.input + duk_heap_strcache_offset_char2byte(thr, h_input, char_offset);
+
+ /*
+ * Match loop.
+ *
+ * Try matching at different offsets until match found or input exhausted.
+ */
+
+ /* [ ... re_obj input bc saved_buf ] */
+
+ DUK_ASSERT(match == 0);
+
+ for (;;) {
+ /* char offset in [0, h_input->clen] (both ends inclusive), checked before entry */
+ DUK_ASSERT_DISABLE(char_offset >= 0);
+ DUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input));
+
+ /* Note: re_ctx.steps is intentionally not reset, it applies to the entire unanchored match */
+ DUK_ASSERT(re_ctx.recursion_depth == 0);
+
+ DUK_DDD(DUK_DDDPRINT("attempt match at char offset %ld; %p [%p,%p]",
+ (long) char_offset, (const void *) sp,
+ (const void *) re_ctx.input, (const void *) re_ctx.input_end));
+
+ /*
+ * Note:
+ *
+ * - duk__match_regexp() is required not to longjmp() in ordinary "non-match"
+ * conditions; a longjmp() will terminate the entire matching process.
+ *
+ * - Clearing saved[] is not necessary because backtracking does it
+ *
+ * - Backtracking also rewinds re_ctx.recursion back to zero, unless an
+ * internal/limit error occurs (which causes a longjmp())
+ *
+ * - If we supported anchored matches, we would break out here
+ * unconditionally; however, Ecmascript regexps don't have anchored
+ * matches. It might make sense to implement a fast bail-out if
+ * the regexp begins with '^' and sp is not 0: currently we'll just
+ * run through the entire input string, trivially failing the match
+ * at every non-zero offset.
+ */
+
+ if (duk__match_regexp(&re_ctx, re_ctx.bytecode, sp) != NULL) {
+ DUK_DDD(DUK_DDDPRINT("match at offset %ld", (long) char_offset));
+ match = 1;
+ break;
+ }
+
+ /* advance by one character (code point) and one char_offset */
+ char_offset++;
+ if (char_offset > DUK_HSTRING_GET_CHARLEN(h_input)) {
+ /*
+ * Note:
+ *
+ * - Intentionally attempt (empty) match at char_offset == k_input->clen
+ *
+ * - Negative char_offsets have been eliminated and char_offset is duk_uint32_t
+ * -> no need or use for a negative check
+ */
+
+ DUK_DDD(DUK_DDDPRINT("no match after trying all sp offsets"));
+ break;
+ }
+
+ /* avoid calling at end of input, will DUK_ERROR (above check suffices to avoid this) */
+ (void) duk__utf8_advance(thr, &sp, re_ctx.input, re_ctx.input_end, (duk_uint_fast32_t) 1);
+ }
+
+ match_over:
+
+ /*
+ * Matching complete, create result array or return a 'null'. Update lastIndex
+ * if necessary. See E5 Section 15.10.6.2.
+ *
+ * Because lastIndex is a character (not byte) offset, we need the character
+ * length of the match which we conveniently get as a side effect of interning
+ * the matching substring (0th index of result array).
+ *
+ * saved[0] start pointer (~ byte offset) of current match
+ * saved[1] end pointer (~ byte offset) of current match (exclusive)
+ * char_offset start character offset of current match (-> .index of result)
+ * char_end_offset end character offset (computed below)
+ */
+
+ /* [ ... re_obj input bc saved_buf ] */
+
+ if (match) {
+#if defined(DUK_USE_ASSERTIONS)
+ duk_hobject *h_res;
+#endif
+ duk_uint32_t char_end_offset = 0;
+
+ DUK_DDD(DUK_DDDPRINT("regexp matches at char_offset %ld", (long) char_offset));
+
+ DUK_ASSERT(re_ctx.nsaved >= 2); /* must have start and end */
+ DUK_ASSERT((re_ctx.nsaved % 2) == 0); /* and even number */
+
+ /* XXX: Array size is known before and (2 * re_ctx.nsaved) but not taken
+ * advantage of now. The array is not compacted either, as regexp match
+ * objects are usually short lived.
+ */
+
+ duk_push_array(thr);
+
+#if defined(DUK_USE_ASSERTIONS)
+ h_res = duk_require_hobject(thr, -1);
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_res));
+ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h_res));
+ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_res) == DUK_HOBJECT_CLASS_ARRAY);
+#endif
+
+ /* [ ... re_obj input bc saved_buf res_obj ] */
+
+ duk_push_u32(thr, char_offset);
+ duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INDEX);
+
+ duk_dup_m4(thr);
+ duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INPUT);
+
+ for (i = 0; i < re_ctx.nsaved; i += 2) {
+ /* Captures which are undefined have NULL pointers and are returned
+ * as 'undefined'. The same is done when saved[] pointers are insane
+ * (this should, of course, never happen in practice).
+ */
+ if (re_ctx.saved[i] && re_ctx.saved[i + 1] && re_ctx.saved[i + 1] >= re_ctx.saved[i]) {
+ duk_push_lstring(thr,
+ (const char *) re_ctx.saved[i],
+ (duk_size_t) (re_ctx.saved[i+1] - re_ctx.saved[i]));
+ if (i == 0) {
+ /* Assumes that saved[0] and saved[1] are always
+ * set by regexp bytecode (if not, char_end_offset
+ * will be zero). Also assumes clen reflects the
+ * correct char length.
+ */
+ char_end_offset = char_offset + (duk_uint32_t) duk_get_length(thr, -1); /* add charlen */
+ }
+ } else {
+ duk_push_undefined(thr);
+ }
+
+ /* [ ... re_obj input bc saved_buf res_obj val ] */
+ duk_put_prop_index(thr, -2, (duk_uarridx_t) (i / 2));
+ }
+
+ /* [ ... re_obj input bc saved_buf res_obj ] */
+
+ /* NB: 'length' property is automatically updated by the array setup loop */
+
+ if (global) {
+ /* global regexp: lastIndex updated on match */
+ duk_push_u32(thr, char_end_offset);
+ duk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX);
+ } else {
+ /* non-global regexp: lastIndex never updated on match */
+ ;
+ }
+ } else {
+ /*
+ * No match, E5 Section 15.10.6.2, step 9.a.i - 9.a.ii apply, regardless
+ * of 'global' flag of the RegExp. In particular, if lastIndex is invalid
+ * initially, it is reset to zero.
+ */
+
+ DUK_DDD(DUK_DDDPRINT("regexp does not match"));
+
+ duk_push_null(thr);
+
+ /* [ ... re_obj input bc saved_buf res_obj ] */
+
+ duk_push_int(thr, 0);
+ duk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX);
+ }
+
+ /* [ ... re_obj input bc saved_buf res_obj ] */
+
+ duk_insert(thr, -5);
+
+ /* [ ... res_obj re_obj input bc saved_buf ] */
+
+ duk_pop_n_unsafe(thr, 4);
+
+ /* [ ... res_obj ] */
+
+ /* XXX: these last tricks are unnecessary if the function is made
+ * a genuine native function.
+ */
+}
+
+DUK_INTERNAL void duk_regexp_match(duk_hthread *thr) {
+ duk__regexp_match_helper(thr, 0 /*force_global*/);
+}
+
+/* This variant is needed by String.prototype.split(); it needs to perform
+ * global-style matching on a cloned RegExp which is potentially non-global.
+ */
+DUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr) {
+ duk__regexp_match_helper(thr, 1 /*force_global*/);
+}
+
+#else /* DUK_USE_REGEXP_SUPPORT */
+
+/* regexp support disabled */
+
+#endif /* DUK_USE_REGEXP_SUPPORT */
+#line 1 "duk_selftest.c"
+/*
+ * Self tests to ensure execution environment is sane. Intended to catch
+ * compiler/platform problems which cannot be detected at compile time.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_SELF_TESTS)
+
+/*
+ * Unions and structs for self tests
+ */
+
+typedef union {
+ double d;
+ duk_uint8_t x[8];
+} duk__test_double_union;
+
+/* Self test failed. Expects a local variable 'error_count' to exist. */
+#define DUK__FAILED(msg) do { \
+ DUK_D(DUK_DPRINT("self test failed: " #msg " at " DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO))); \
+ error_count++; \
+ } while (0)
+
+#define DUK__DBLUNION_CMP_TRUE(a,b) do { \
+ if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) != 0) { \
+ DUK__FAILED("double union compares false (expected true)"); \
+ } \
+ } while (0)
+
+#define DUK__DBLUNION_CMP_FALSE(a,b) do { \
+ if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) == 0) { \
+ DUK__FAILED("double union compares true (expected false)"); \
+ } \
+ } while (0)
+
+typedef union {
+ duk_uint32_t i;
+ duk_uint8_t x[8];
+} duk__test_u32_union;
+
+#if defined(DUK_USE_INTEGER_LE)
+#define DUK__U32_INIT(u, a, b, c, d) do { \
+ (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \
+ } while (0)
+#elif defined(DUK_USE_INTEGER_ME)
+#error integer mixed endian not supported now
+#elif defined(DUK_USE_INTEGER_BE)
+#define DUK__U32_INIT(u, a, b, c, d) do { \
+ (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \
+ } while (0)
+#else
+#error unknown integer endianness
+#endif
+
+#if defined(DUK_USE_DOUBLE_LE)
+#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \
+ (u)->x[0] = (h); (u)->x[1] = (g); (u)->x[2] = (f); (u)->x[3] = (e); \
+ (u)->x[4] = (d); (u)->x[5] = (c); (u)->x[6] = (b); (u)->x[7] = (a); \
+ } while (0)
+#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \
+ ((u)->x[0] == (h) && (u)->x[1] == (g) && (u)->x[2] == (f) && (u)->x[3] == (e) && \
+ (u)->x[4] == (d) && (u)->x[5] == (c) && (u)->x[6] == (b) && (u)->x[7] == (a))
+#elif defined(DUK_USE_DOUBLE_ME)
+#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \
+ (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \
+ (u)->x[4] = (h); (u)->x[5] = (g); (u)->x[6] = (f); (u)->x[7] = (e); \
+ } while (0)
+#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \
+ ((u)->x[0] == (d) && (u)->x[1] == (c) && (u)->x[2] == (b) && (u)->x[3] == (a) && \
+ (u)->x[4] == (h) && (u)->x[5] == (g) && (u)->x[6] == (f) && (u)->x[7] == (e))
+#elif defined(DUK_USE_DOUBLE_BE)
+#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \
+ (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \
+ (u)->x[4] = (e); (u)->x[5] = (f); (u)->x[6] = (g); (u)->x[7] = (h); \
+ } while (0)
+#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \
+ ((u)->x[0] == (a) && (u)->x[1] == (b) && (u)->x[2] == (c) && (u)->x[3] == (d) && \
+ (u)->x[4] == (e) && (u)->x[5] == (f) && (u)->x[6] == (g) && (u)->x[7] == (h))
+#else
+#error unknown double endianness
+#endif
+
+/*
+ * Various sanity checks for typing
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_types(void) {
+ duk_uint_t error_count = 0;
+
+ if (!(sizeof(duk_int8_t) == 1 &&
+ sizeof(duk_uint8_t) == 1 &&
+ sizeof(duk_int16_t) == 2 &&
+ sizeof(duk_uint16_t) == 2 &&
+ sizeof(duk_int32_t) == 4 &&
+ sizeof(duk_uint32_t) == 4)) {
+ DUK__FAILED("duk_(u)int{8,16,32}_t size");
+ }
+#if defined(DUK_USE_64BIT_OPS)
+ if (!(sizeof(duk_int64_t) == 8 &&
+ sizeof(duk_uint64_t) == 8)) {
+ DUK__FAILED("duk_(u)int64_t size");
+ }
+#endif
+
+ if (!(sizeof(duk_size_t) >= sizeof(duk_uint_t))) {
+ /* Some internal code now assumes that all duk_uint_t values
+ * can be expressed with a duk_size_t.
+ */
+ DUK__FAILED("duk_size_t is smaller than duk_uint_t");
+ }
+ if (!(sizeof(duk_int_t) >= 4)) {
+ DUK__FAILED("duk_int_t is not 32 bits");
+ }
+
+ return error_count;
+}
+
+/*
+ * Packed tval sanity
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_packed_tval(void) {
+ duk_uint_t error_count = 0;
+
+#if defined(DUK_USE_PACKED_TVAL)
+ if (sizeof(void *) > 4) {
+ DUK__FAILED("packed duk_tval in use but sizeof(void *) > 4");
+ }
+#endif
+
+ return error_count;
+}
+
+/*
+ * Two's complement arithmetic.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_twos_complement(void) {
+ duk_uint_t error_count = 0;
+ volatile int test;
+ test = -1;
+
+ /* Note that byte order doesn't affect this test: all bytes in
+ * 'test' will be 0xFF for two's complement.
+ */
+ if (((volatile duk_uint8_t *) &test)[0] != (duk_uint8_t) 0xff) {
+ DUK__FAILED("two's complement arithmetic");
+ }
+
+ return error_count;
+}
+
+/*
+ * Byte order. Important to self check, because on some exotic platforms
+ * there is no actual detection but rather assumption based on platform
+ * defines.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_byte_order(void) {
+ duk_uint_t error_count = 0;
+ duk__test_u32_union u1;
+ duk__test_double_union u2;
+
+ /*
+ * >>> struct.pack('>d', 102030405060).encode('hex')
+ * '4237c17c6dc40000'
+ */
+
+ DUK__U32_INIT(&u1, 0xde, 0xad, 0xbe, 0xef);
+ DUK__DOUBLE_INIT(&u2, 0x42, 0x37, 0xc1, 0x7c, 0x6d, 0xc4, 0x00, 0x00);
+
+ if (u1.i != (duk_uint32_t) 0xdeadbeefUL) {
+ DUK__FAILED("duk_uint32_t byte order");
+ }
+
+ if (u2.d != (double) 102030405060.0) {
+ DUK__FAILED("double byte order");
+ }
+
+ return error_count;
+}
+
+/*
+ * DUK_BSWAP macros
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_bswap_macros(void) {
+ duk_uint_t error_count = 0;
+ duk_uint32_t x32;
+ duk_uint16_t x16;
+ duk_double_union du;
+ duk_double_t du_diff;
+
+ x16 = 0xbeefUL;
+ x16 = DUK_BSWAP16(x16);
+ if (x16 != (duk_uint16_t) 0xefbeUL) {
+ DUK__FAILED("DUK_BSWAP16");
+ }
+
+ x32 = 0xdeadbeefUL;
+ x32 = DUK_BSWAP32(x32);
+ if (x32 != (duk_uint32_t) 0xefbeaddeUL) {
+ DUK__FAILED("DUK_BSWAP32");
+ }
+
+ /* >>> struct.unpack('>d', '4000112233445566'.decode('hex'))
+ * (2.008366013071895,)
+ */
+
+ du.uc[0] = 0x40; du.uc[1] = 0x00; du.uc[2] = 0x11; du.uc[3] = 0x22;
+ du.uc[4] = 0x33; du.uc[5] = 0x44; du.uc[6] = 0x55; du.uc[7] = 0x66;
+ DUK_DBLUNION_DOUBLE_NTOH(&du);
+ du_diff = du.d - 2.008366013071895;
+#if 0
+ DUK_D(DUK_DPRINT("du_diff: %lg\n", (double) du_diff));
+#endif
+ if (du_diff > 1e-15) {
+ /* Allow very small lenience because some compilers won't parse
+ * exact IEEE double constants (happened in matrix testing with
+ * Linux gcc-4.8 -m32 at least).
+ */
+#if 0
+ DUK_D(DUK_DPRINT("Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\n",
+ (unsigned int) du.uc[0], (unsigned int) du.uc[1],
+ (unsigned int) du.uc[2], (unsigned int) du.uc[3],
+ (unsigned int) du.uc[4], (unsigned int) du.uc[5],
+ (unsigned int) du.uc[6], (unsigned int) du.uc[7]));
+#endif
+ DUK__FAILED("DUK_DBLUNION_DOUBLE_NTOH");
+ }
+
+ return error_count;
+}
+
+/*
+ * Basic double / byte union memory layout.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_double_union_size(void) {
+ duk_uint_t error_count = 0;
+
+ if (sizeof(duk__test_double_union) != 8) {
+ DUK__FAILED("invalid union size");
+ }
+
+ return error_count;
+}
+
+/*
+ * Union aliasing, see misc/clang_aliasing.c.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_double_aliasing(void) {
+ /* This testcase fails when Emscripten-generated code runs on Firefox.
+ * It's not an issue because the failure should only affect packed
+ * duk_tval representation, which is not used with Emscripten.
+ */
+#if defined(DUK_USE_PACKED_TVAL)
+ duk_uint_t error_count = 0;
+ duk__test_double_union a, b;
+
+ /* Test signaling NaN and alias assignment in all endianness combinations.
+ */
+
+ /* little endian */
+ a.x[0] = 0x11; a.x[1] = 0x22; a.x[2] = 0x33; a.x[3] = 0x44;
+ a.x[4] = 0x00; a.x[5] = 0x00; a.x[6] = 0xf1; a.x[7] = 0xff;
+ b = a;
+ DUK__DBLUNION_CMP_TRUE(&a, &b);
+
+ /* big endian */
+ a.x[0] = 0xff; a.x[1] = 0xf1; a.x[2] = 0x00; a.x[3] = 0x00;
+ a.x[4] = 0x44; a.x[5] = 0x33; a.x[6] = 0x22; a.x[7] = 0x11;
+ b = a;
+ DUK__DBLUNION_CMP_TRUE(&a, &b);
+
+ /* mixed endian */
+ a.x[0] = 0x00; a.x[1] = 0x00; a.x[2] = 0xf1; a.x[3] = 0xff;
+ a.x[4] = 0x11; a.x[5] = 0x22; a.x[6] = 0x33; a.x[7] = 0x44;
+ b = a;
+ DUK__DBLUNION_CMP_TRUE(&a, &b);
+
+ return error_count;
+#else
+ DUK_D(DUK_DPRINT("skip double aliasing self test when duk_tval is not packed"));
+ return 0;
+#endif
+}
+
+/*
+ * Zero sign, see misc/tcc_zerosign2.c.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_double_zero_sign(void) {
+ duk_uint_t error_count = 0;
+ duk__test_double_union a, b;
+
+ a.d = 0.0;
+ b.d = -a.d;
+ DUK__DBLUNION_CMP_FALSE(&a, &b);
+
+ return error_count;
+}
+
+/*
+ * Rounding mode: Duktape assumes round-to-nearest, check that this is true.
+ * If we had C99 fenv.h we could check that fegetround() == FE_TONEAREST,
+ * but we don't want to rely on that header; and even if we did, it's good
+ * to ensure the rounding actually works.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_double_rounding(void) {
+ duk_uint_t error_count = 0;
+ duk__test_double_union a, b, c;
+
+#if 0
+ /* Include <fenv.h> and test manually; these trigger failures: */
+ fesetround(FE_UPWARD);
+ fesetround(FE_DOWNWARD);
+ fesetround(FE_TOWARDZERO);
+
+ /* This is the default and passes. */
+ fesetround(FE_TONEAREST);
+#endif
+
+ /* Rounding tests check that none of the other modes (round to
+ * +Inf, round to -Inf, round to zero) can be active:
+ * http://www.gnu.org/software/libc/manual/html_node/Rounding.html
+ */
+
+ /* 1.0 + 2^(-53): result is midway between 1.0 and 1.0 + ulp.
+ * Round to nearest: 1.0
+ * Round to +Inf: 1.0 + ulp
+ * Round to -Inf: 1.0
+ * Round to zero: 1.0
+ * => Correct result eliminates round to +Inf.
+ */
+ DUK__DOUBLE_INIT(&a, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ DUK_MEMSET((void *) &c, 0, sizeof(c));
+ c.d = a.d + b.d;
+ if (!DUK__DOUBLE_COMPARE(&c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)) {
+ DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x",
+ (unsigned int) c.x[0], (unsigned int) c.x[1],
+ (unsigned int) c.x[2], (unsigned int) c.x[3],
+ (unsigned int) c.x[4], (unsigned int) c.x[5],
+ (unsigned int) c.x[6], (unsigned int) c.x[7]));
+ DUK__FAILED("invalid result from 1.0 + 0.5ulp");
+ }
+
+ /* (1.0 + ulp) + 2^(-53): result is midway between 1.0 + ulp and 1.0 + 2*ulp.
+ * Round to nearest: 1.0 + 2*ulp (round to even mantissa)
+ * Round to +Inf: 1.0 + 2*ulp
+ * Round to -Inf: 1.0 + ulp
+ * Round to zero: 1.0 + ulp
+ * => Correct result eliminates round to -Inf and round to zero.
+ */
+ DUK__DOUBLE_INIT(&a, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01);
+ DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ DUK_MEMSET((void *) &c, 0, sizeof(c));
+ c.d = a.d + b.d;
+ if (!DUK__DOUBLE_COMPARE(&c, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02)) {
+ DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x",
+ (unsigned int) c.x[0], (unsigned int) c.x[1],
+ (unsigned int) c.x[2], (unsigned int) c.x[3],
+ (unsigned int) c.x[4], (unsigned int) c.x[5],
+ (unsigned int) c.x[6], (unsigned int) c.x[7]));
+ DUK__FAILED("invalid result from (1.0 + ulp) + 0.5ulp");
+ }
+
+ /* Could do negative number testing too, but the tests above should
+ * differentiate between IEEE 754 rounding modes.
+ */
+ return error_count;
+}
+
+/*
+ * fmod(): often a portability issue in embedded or bare platform targets.
+ * Check for at least minimally correct behavior. Unlike some other math
+ * functions (like cos()) Duktape relies on fmod() internally too.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_fmod(void) {
+ duk_uint_t error_count = 0;
+ duk__test_double_union u1, u2;
+ volatile duk_double_t t1, t2, t3;
+
+ /* fmod() with integer argument and exponent 2^32 is used by e.g.
+ * ToUint32() and some Duktape internals.
+ */
+ u1.d = DUK_FMOD(10.0, 4294967296.0);
+ u2.d = 10.0;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ u1.d = DUK_FMOD(4294967306.0, 4294967296.0);
+ u2.d = 10.0;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ u1.d = DUK_FMOD(73014444042.0, 4294967296.0);
+ u2.d = 10.0;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ /* 52-bit integer split into two parts:
+ * >>> 0x1fedcba9876543
+ * 8987183256397123
+ * >>> float(0x1fedcba9876543) / float(2**53)
+ * 0.9977777777777778
+ */
+ u1.d = DUK_FMOD(8987183256397123.0, 4294967296.0);
+ u2.d = (duk_double_t) 0xa9876543UL;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+ t1 = 8987183256397123.0;
+ t2 = 4294967296.0;
+ t3 = t1 / t2;
+ u1.d = DUK_FLOOR(t3);
+ u2.d = (duk_double_t) 0x1fedcbUL;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ /* C99 behavior is for fmod() result sign to mathc argument sign. */
+ u1.d = DUK_FMOD(-10.0, 4294967296.0);
+ u2.d = -10.0;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ u1.d = DUK_FMOD(-4294967306.0, 4294967296.0);
+ u2.d = -10.0;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ u1.d = DUK_FMOD(-73014444042.0, 4294967296.0);
+ u2.d = -10.0;
+ DUK__DBLUNION_CMP_TRUE(&u1, &u2);
+
+ return error_count;
+}
+
+/*
+ * Struct size/alignment if platform requires it
+ *
+ * There are some compiler specific struct padding pragmas etc in use, this
+ * selftest ensures they're correctly detected and used.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_struct_align(void) {
+ duk_uint_t error_count = 0;
+
+#if (DUK_USE_ALIGN_BY == 4)
+ if ((sizeof(duk_hbuffer_fixed) % 4) != 0) {
+ DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 4");
+ }
+#elif (DUK_USE_ALIGN_BY == 8)
+ if ((sizeof(duk_hbuffer_fixed) % 8) != 0) {
+ DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 8");
+ }
+#elif (DUK_USE_ALIGN_BY == 1)
+ /* no check */
+#else
+#error invalid DUK_USE_ALIGN_BY
+#endif
+ return error_count;
+}
+
+/*
+ * 64-bit arithmetic
+ *
+ * There are some platforms/compilers where 64-bit types are available
+ * but don't work correctly. Test for known cases.
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_64bit_arithmetic(void) {
+ duk_uint_t error_count = 0;
+#if defined(DUK_USE_64BIT_OPS)
+ volatile duk_int64_t i;
+ volatile duk_double_t d;
+
+ /* Catch a double-to-int64 cast issue encountered in practice. */
+ d = 2147483648.0;
+ i = (duk_int64_t) d;
+ if (i != DUK_I64_CONSTANT(0x80000000)) {
+ DUK__FAILED("casting 2147483648.0 to duk_int64_t failed");
+ }
+#else
+ /* nop */
+#endif
+ return error_count;
+}
+
+/*
+ * Casting
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_small_uint(void) {
+ /*
+ * https://github.com/svaarala/duktape/issues/127#issuecomment-77863473
+ */
+
+ duk_uint_t error_count = 0;
+
+ duk_double_t d1, d2;
+ duk_small_uint_t u;
+
+ duk_double_t d1v, d2v;
+ duk_small_uint_t uv;
+
+ /* Test without volatiles */
+
+ d1 = 1.0;
+ u = (duk_small_uint_t) d1;
+ d2 = (duk_double_t) u;
+
+ if (!(d1 == 1.0 && u == 1 && d2 == 1.0 && d1 == d2)) {
+ DUK__FAILED("double to duk_small_uint_t cast failed");
+ }
+
+ /* Same test with volatiles */
+
+ d1v = 1.0;
+ uv = (duk_small_uint_t) d1v;
+ d2v = (duk_double_t) uv;
+
+ if (!(d1v == 1.0 && uv == 1 && d2v == 1.0 && d1v == d2v)) {
+ DUK__FAILED("double to duk_small_uint_t cast failed");
+ }
+
+ return error_count;
+}
+
+DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_uint32(void) {
+ /*
+ * This test fails on an exotic ARM target; double-to-uint
+ * cast is incorrectly clamped to -signed- int highest value.
+ *
+ * https://github.com/svaarala/duktape/issues/336
+ */
+
+ duk_uint_t error_count = 0;
+ duk_double_t dv;
+ duk_uint32_t uv;
+
+ dv = 3735928559.0; /* 0xdeadbeef in decimal */
+ uv = (duk_uint32_t) dv;
+
+ if (uv != 0xdeadbeefUL) {
+ DUK__FAILED("double to duk_uint32_t cast failed");
+ }
+
+ return error_count;
+}
+
+/*
+ * Minimal test of user supplied allocation functions
+ *
+ * - Basic alloc + realloc + free cycle
+ *
+ * - Realloc to significantly larger size to (hopefully) trigger a
+ * relocation and check that relocation copying works
+ */
+
+DUK_LOCAL duk_uint_t duk__selftest_alloc_funcs(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *udata) {
+ duk_uint_t error_count = 0;
+ void *ptr;
+ void *new_ptr;
+ duk_small_int_t i, j;
+ unsigned char x;
+
+ if (alloc_func == NULL || realloc_func == NULL || free_func == NULL) {
+ return 0;
+ }
+
+ for (i = 1; i <= 256; i++) {
+ ptr = alloc_func(udata, (duk_size_t) i);
+ if (ptr == NULL) {
+ DUK_D(DUK_DPRINT("alloc failed, ignore"));
+ continue; /* alloc failed, ignore */
+ }
+ for (j = 0; j < i; j++) {
+ ((unsigned char *) ptr)[j] = (unsigned char) (0x80 + j);
+ }
+ new_ptr = realloc_func(udata, ptr, 1024);
+ if (new_ptr == NULL) {
+ DUK_D(DUK_DPRINT("realloc failed, ignore"));
+ free_func(udata, ptr);
+ continue; /* realloc failed, ignore */
+ }
+ ptr = new_ptr;
+ for (j = 0; j < i; j++) {
+ x = ((unsigned char *) ptr)[j];
+ if (x != (unsigned char) (0x80 + j)) {
+ DUK_D(DUK_DPRINT("byte at index %ld doesn't match after realloc: %02lx",
+ (long) j, (unsigned long) x));
+ DUK__FAILED("byte compare after realloc");
+ break;
+ }
+ }
+ free_func(udata, ptr);
+ }
+
+ return error_count;
+}
+
+/*
+ * Self test main
+ */
+
+DUK_INTERNAL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *udata) {
+ duk_uint_t error_count = 0;
+
+ DUK_D(DUK_DPRINT("self test starting"));
+
+ error_count += duk__selftest_types();
+ error_count += duk__selftest_packed_tval();
+ error_count += duk__selftest_twos_complement();
+ error_count += duk__selftest_byte_order();
+ error_count += duk__selftest_bswap_macros();
+ error_count += duk__selftest_double_union_size();
+ error_count += duk__selftest_double_aliasing();
+ error_count += duk__selftest_double_zero_sign();
+ error_count += duk__selftest_double_rounding();
+ error_count += duk__selftest_fmod();
+ error_count += duk__selftest_struct_align();
+ error_count += duk__selftest_64bit_arithmetic();
+ error_count += duk__selftest_cast_double_to_small_uint();
+ error_count += duk__selftest_cast_double_to_uint32();
+ error_count += duk__selftest_alloc_funcs(alloc_func, realloc_func, free_func, udata);
+
+ DUK_D(DUK_DPRINT("self test complete, total error count: %ld", (long) error_count));
+
+ return error_count;
+}
+
+#endif /* DUK_USE_SELF_TESTS */
+
+/* automatic undefs */
+#undef DUK__DBLUNION_CMP_FALSE
+#undef DUK__DBLUNION_CMP_TRUE
+#undef DUK__DOUBLE_COMPARE
+#undef DUK__DOUBLE_INIT
+#undef DUK__FAILED
+#undef DUK__U32_INIT
+/* #include duk_internal.h -> already included */
+#line 2 "duk_tval.c"
+
+#if defined(DUK_USE_FASTINT)
+
+/*
+ * Manually optimized double-to-fastint downgrade check.
+ *
+ * This check has a large impact on performance, especially for fastint
+ * slow paths, so must be changed carefully. The code should probably be
+ * optimized for the case where the result does not fit into a fastint,
+ * to minimize the penalty for "slow path code" dealing with fractions etc.
+ *
+ * At least on one tested soft float ARM platform double-to-int64 coercion
+ * is very slow (and sometimes produces incorrect results, see self tests).
+ * This algorithm combines a fastint compatibility check and extracting the
+ * integer value from an IEEE double for setting the tagged fastint. For
+ * other platforms a more naive approach might be better.
+ *
+ * See doc/fastint.rst for details.
+ */
+
+DUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x) {
+ duk_double_union du;
+ duk_int64_t i;
+ duk_small_int_t expt;
+ duk_small_int_t shift;
+
+ /* XXX: optimize for packed duk_tval directly? */
+
+ du.d = x;
+ i = (duk_int64_t) DUK_DBLUNION_GET_INT64(&du);
+ expt = (duk_small_int_t) ((i >> 52) & 0x07ff);
+ shift = expt - 1023;
+
+ if (shift >= 0 && shift <= 46) { /* exponents 1023 to 1069 */
+ duk_int64_t t;
+
+ if (((DUK_I64_CONSTANT(0x000fffffffffffff) >> shift) & i) == 0) {
+ t = i | DUK_I64_CONSTANT(0x0010000000000000); /* implicit leading one */
+ t = t & DUK_I64_CONSTANT(0x001fffffffffffff);
+ t = t >> (52 - shift);
+ if (i < 0) {
+ t = -t;
+ }
+ DUK_TVAL_SET_FASTINT(tv, t);
+ return;
+ }
+ } else if (shift == -1023) { /* exponent 0 */
+ if (i >= 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) {
+ /* Note: reject negative zero. */
+ DUK_TVAL_SET_FASTINT(tv, (duk_int64_t) 0);
+ return;
+ }
+ } else if (shift == 47) { /* exponent 1070 */
+ if (i < 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) {
+ DUK_TVAL_SET_FASTINT(tv, (duk_int64_t) DUK_FASTINT_MIN);
+ return;
+ }
+ }
+
+ DUK_TVAL_SET_DOUBLE(tv, x);
+ return;
+}
+
+DUK_INTERNAL DUK_NOINLINE void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x) {
+ duk_tval_set_number_chkfast_fast(tv, x);
+}
+
+/*
+ * Manually optimized number-to-double conversion
+ */
+
+#if defined(DUK_USE_FASTINT) && defined(DUK_USE_PACKED_TVAL)
+DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_packed(duk_tval *tv) {
+ duk_double_union du;
+ duk_uint64_t t;
+
+ t = (duk_uint64_t) DUK_DBLUNION_GET_UINT64(tv);
+ if ((t >> 48) != DUK_TAG_FASTINT) {
+ return tv->d;
+ } else if (t & DUK_U64_CONSTANT(0x0000800000000000)) {
+ t = (duk_uint64_t) (-((duk_int64_t) t)); /* avoid unary minus on unsigned */
+ t = t & DUK_U64_CONSTANT(0x0000ffffffffffff); /* negative */
+ t |= DUK_U64_CONSTANT(0xc330000000000000);
+ DUK_DBLUNION_SET_UINT64(&du, t);
+ return du.d + 4503599627370496.0; /* 1 << 52 */
+ } else if (t != 0) {
+ t &= DUK_U64_CONSTANT(0x0000ffffffffffff); /* positive */
+ t |= DUK_U64_CONSTANT(0x4330000000000000);
+ DUK_DBLUNION_SET_UINT64(&du, t);
+ return du.d - 4503599627370496.0; /* 1 << 52 */
+ } else {
+ return 0.0; /* zero */
+ }
+}
+#endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */
+
+#if 0 /* unused */
+#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL)
+DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked(duk_tval *tv) {
+ duk_double_union du;
+ duk_uint64_t t;
+
+ DUK_ASSERT(tv->t == DUK_TAG_NUMBER || tv->t == DUK_TAG_FASTINT);
+
+ if (tv->t == DUK_TAG_FASTINT) {
+ if (tv->v.fi >= 0) {
+ t = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi;
+ DUK_DBLUNION_SET_UINT64(&du, t);
+ return du.d - 4503599627370496.0; /* 1 << 52 */
+ } else {
+ t = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi);
+ DUK_DBLUNION_SET_UINT64(&du, t);
+ return du.d + 4503599627370496.0; /* 1 << 52 */
+ }
+ } else {
+ return tv->v.d;
+ }
+}
+#endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */
+#endif /* 0 */
+
+#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL)
+DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv) {
+ duk_double_union du;
+ duk_uint64_t t;
+
+ DUK_ASSERT(tv->t == DUK_TAG_FASTINT);
+
+ if (tv->v.fi >= 0) {
+ t = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi;
+ DUK_DBLUNION_SET_UINT64(&du, t);
+ return du.d - 4503599627370496.0; /* 1 << 52 */
+ } else {
+ t = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi);
+ DUK_DBLUNION_SET_UINT64(&du, t);
+ return du.d + 4503599627370496.0; /* 1 << 52 */
+ }
+}
+#endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */
+
+#endif /* DUK_USE_FASTINT */
+#line 1 "duk_unicode_tables.c"
+/*
+ * Unicode support tables automatically generated during build.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Unicode tables containing ranges of Unicode characters in a
+ * packed format. These tables are used to match non-ASCII
+ * characters of complex productions by resorting to a linear
+ * range-by-range comparison. This is very slow, but is expected
+ * to be very rare in practical Ecmascript source code, and thus
+ * compactness is most important.
+ *
+ * The tables are matched using uni_range_match() and the format
+ * is described in tools/extract_chars.py.
+ */
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+/* IdentifierStart production with ASCII excluded */
+/* duk_unicode_ids_noa[] */
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_ids_noa[1036] = {
+249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34,
+2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191,
+21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240,
+101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19,
+240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47,
+2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18,
+47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12,
+38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6,
+41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98,
+34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2,
+85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35,
+63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227,
+240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5,
+15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40,
+240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27,
+43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47,
+15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68,
+112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52,
+29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12,
+146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255,
+224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63,
+253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34,
+35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31,
+240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32,
+240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7,
+95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245,
+207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10,
+207,73,69,53,53,50,241,91,47,10,47,3,33,46,61,241,79,107,243,127,37,255,
+223,13,79,33,242,31,16,240,47,11,111,22,191,14,63,20,87,36,241,207,142,240,
+79,20,95,20,95,24,159,36,248,239,254,2,154,240,107,127,138,83,2,241,194,20,
+3,240,123,240,122,240,255,51,240,50,27,240,107,240,175,56,242,135,31,50,15,
+1,50,34,240,191,30,240,212,240,223,21,114,240,207,13,242,107,240,107,240,
+62,240,47,96,243,159,41,242,62,242,63,254,32,79,37,243,223,29,241,47,9,240,
+207,20,241,191,19,64,223,32,240,3,240,112,32,241,95,2,47,9,244,102,32,35,
+46,41,143,31,241,135,49,63,6,38,33,36,64,240,64,212,249,15,37,240,67,242,
+127,32,240,97,32,250,175,31,241,179,241,111,32,240,96,242,223,27,244,127,
+10,255,224,122,243,15,17,15,254,11,79,41,255,152,47,21,240,48,242,63,14,
+255,226,100,255,226,140,245,143,95,240,63,180,255,233,176,255,227,33,255,
+238,197,255,225,57,255,240,1,10,223,254,18,184,240,255,99,240,239,4,242,15,
+2,63,17,240,86,240,63,254,38,79,53,192,243,76,243,32,241,31,255,0,6,223,
+240,95,254,30,95,255,0,20,1,31,254,175,47,91,108,72,137,255,240,0,101,175,
+69,47,55,33,48,49,51,43,32,38,47,49,35,55,38,47,12,35,36,32,70,47,254,4,99,
+240,146,240,146,240,242,240,146,240,242,240,146,240,242,240,146,240,242,
+240,146,127,254,242,143,181,242,223,52,255,227,176,50,240,178,18,3,2,146,
+50,2,7,5,2,2,2,34,18,3,2,2,2,2,2,18,3,50,98,50,50,2,146,240,22,34,66,240,
+31,255,0,0,56,255,240,9,92,159,27,255,239,39,207,206,63,255,0,5,116,255,
+240,1,133,47,254,17,0,
+};
+#else
+/* IdentifierStart production with ASCII and non-BMP excluded */
+/* duk_unicode_ids_noabmp[] */
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_ids_noabmp[625] = {
+249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34,
+2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191,
+21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240,
+101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19,
+240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47,
+2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18,
+47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12,
+38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6,
+41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98,
+34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2,
+85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35,
+63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227,
+240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5,
+15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40,
+240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27,
+43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47,
+15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68,
+112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52,
+29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12,
+146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255,
+224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63,
+253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34,
+35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31,
+240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32,
+240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7,
+95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245,
+207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10,
+207,73,69,53,53,50,0,
+};
+#endif
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+/* IdentifierStart production with Letter and ASCII excluded */
+/* duk_unicode_ids_m_let_noa[] */
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_ids_m_let_noa[42] = {
+255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89,
+249,255,240,4,148,79,37,255,224,192,9,15,120,79,255,0,15,30,245,240,
+};
+#else
+/* IdentifierStart production with Letter, ASCII, and non-BMP excluded */
+/* duk_unicode_ids_m_let_noabmp[] */
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_ids_m_let_noabmp[24] = {
+255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89,
+249,0,
+};
+#endif
+
+#if defined(DUK_USE_SOURCE_NONBMP)
+/* IdentifierPart production with IdentifierStart and ASCII excluded */
+/* duk_unicode_idp_m_ids_noa[] */
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_idp_m_ids_noa[530] = {
+255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112,
+245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34,
+36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50,
+160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240,
+97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9,
+240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50,
+242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41,
+244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245,
+111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241,
+241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242,
+244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57,
+241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31,
+35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31,
+255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242,
+79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29,
+208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3,
+225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,15,254,27,16,253,64,
+248,116,255,224,25,159,254,68,178,33,99,241,162,80,249,113,255,228,13,47,
+39,239,17,159,1,63,31,175,39,151,47,22,210,159,37,13,47,34,218,36,159,68,
+183,15,146,182,151,63,42,2,99,19,42,11,19,100,79,178,240,42,159,72,240,77,
+159,199,99,143,13,31,68,240,31,1,159,67,201,159,69,229,159,254,9,169,255,
+226,57,114,127,2,159,42,240,98,223,255,0,60,157,159,120,79,45,111,11,159,
+254,46,191,30,240,35,255,240,3,191,225,255,240,0,59,164,69,151,54,241,3,
+248,98,255,228,125,242,47,254,15,79,39,95,34,144,240,0,240,132,46,255,228,
+68,98,240,19,98,18,79,254,121,150,245,246,105,255,240,192,105,175,224,0,
+};
+#else
+/* IdentifierPart production with IdentifierStart, ASCII, and non-BMP excluded */
+/* duk_unicode_idp_m_ids_noabmp[] */
+/*
+ * Automatically generated by extract_chars.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357] = {
+255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112,
+245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34,
+36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50,
+160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240,
+97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9,
+240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50,
+242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41,
+244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245,
+111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241,
+241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242,
+244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57,
+241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31,
+35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31,
+255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242,
+79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29,
+208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3,
+225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,0,
+};
+#endif
+
+/*
+ * Case conversion tables generated using tools/extract_caseconv.py.
+ */
+
+/* duk_unicode_caseconv_uc[] */
+/* duk_unicode_caseconv_lc[] */
+
+/*
+ * Automatically generated by extract_caseconv.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_caseconv_uc[1386] = {
+144,3,128,3,0,184,7,192,6,192,112,35,242,199,224,64,74,192,49,32,128,162,
+128,108,65,1,189,129,254,131,3,173,3,136,6,7,98,7,34,68,15,12,14,140,72,30,
+104,28,112,32,67,0,65,4,0,138,0,128,4,1,88,65,76,83,9,252,9,248,6,28,131,4,
+33,4,62,0,62,16,32,124,64,124,96,48,249,0,249,64,129,243,1,243,129,3,232,3,
+233,1,135,216,7,218,4,15,184,15,221,2,31,114,31,200,8,62,236,63,180,8,125,
+224,127,224,16,251,208,255,80,33,247,193,255,160,67,246,3,247,0,135,244,7,
+246,1,15,240,15,244,2,33,112,33,96,32,73,160,73,108,104,176,192,176,1,121,
+104,0,133,2,106,183,1,58,10,31,232,63,228,38,162,1,1,1,0,48,2,102,2,100,12,
+4,232,4,228,64,10,88,10,81,112,23,160,23,144,96,48,96,48,64,128,104,64,104,
+1,128,218,0,217,130,1,206,1,205,16,3,190,3,188,36,7,228,7,224,160,17,24,17,
+16,144,36,112,36,96,160,110,32,110,0,128,246,64,246,6,2,48,130,48,17,4,139,
+4,138,54,9,132,9,130,28,19,68,19,65,128,240,8,240,4,177,234,17,234,6,3,234,
+35,235,33,11,26,11,25,193,150,64,150,64,50,44,236,44,235,5,76,131,76,128,
+94,154,6,154,0,117,57,29,57,16,122,115,58,115,35,244,239,84,239,32,169,223,
+233,223,130,211,200,211,200,2,167,151,167,150,21,79,107,79,104,8,112,26,
+208,26,192,64,56,160,56,128,192,113,128,113,1,128,249,0,248,130,2,128,1,
+166,4,7,240,7,238,8,177,204,177,200,16,96,49,0,48,224,128,110,64,110,1,1,
+51,83,213,2,0,48,35,192,35,176,64,77,32,50,192,139,73,196,49,193,127,48,2,
+212,14,112,3,252,5,224,4,196,1,36,5,252,1,76,6,0,9,12,6,72,6,68,6,84,7,216,
+6,100,6,96,6,104,8,244,6,120,8,128,6,160,6,156,6,252,7,220,7,116,6,56,7,
+204,7,196,9,64,177,188,9,68,177,180,9,72,177,192,9,76,6,4,9,80,6,24,9,100,
+6,60,9,108,6,64,9,114,158,172,9,128,6,76,9,134,158,176,9,140,6,80,9,150,
+158,52,9,160,6,92,9,172,177,136,9,178,158,180,9,196,177,184,9,200,6,116,9,
+212,6,124,9,244,177,144,10,30,158,196,10,32,6,184,10,36,9,16,10,48,9,20,10,
+72,6,220,10,118,158,200,10,122,158,192,13,20,14,100,13,220,13,216,14,176,
+14,24,15,8,14,140,15,48,14,48,15,64,14,72,15,68,14,96,15,84,14,152,15,88,
+14,128,15,92,15,60,15,192,14,104,15,196,14,132,15,200,15,228,15,204,13,252,
+15,212,14,84,19,60,19,0,114,0,16,72,114,4,16,80,114,8,16,120,114,20,16,136,
+114,24,16,168,114,28,17,136,114,34,153,40,117,230,157,244,117,244,177,140,
+122,108,121,128,126,248,14,100,127,148,127,176,133,56,132,200,134,16,134,
+12,177,132,177,128,177,148,8,232,177,152,8,248,179,204,179,202,158,50,158,
+46,173,78,158,207,48,6,252,0,166,0,166,2,147,1,94,0,39,0,248,64,9,64,97,
+128,114,24,28,200,24,64,24,8,29,134,7,74,6,16,6,2,11,15,2,154,130,169,15,
+75,64,9,0,102,35,210,240,2,160,24,64,244,196,0,174,6,20,61,51,0,44,129,133,
+15,77,64,8,32,87,195,234,16,29,40,24,152,250,150,7,74,6,38,6,0,62,169,129,
+210,129,137,129,128,143,171,96,116,160,98,96,104,67,240,16,248,64,28,200,
+252,12,62,18,7,50,63,5,15,133,1,204,143,193,195,225,96,115,35,240,144,248,
+96,28,200,252,44,62,26,7,50,63,13,15,135,1,204,143,195,195,225,224,115,35,
+241,16,248,64,28,200,252,76,62,18,7,50,63,21,15,133,1,204,143,197,195,225,
+96,115,35,241,144,248,96,28,200,252,108,62,26,7,50,63,29,15,135,1,204,143,
+199,195,225,224,115,35,242,16,249,64,28,200,252,140,62,82,7,50,63,37,15,
+149,1,204,143,201,195,229,96,115,35,242,144,249,96,28,200,252,172,62,90,7,
+50,63,45,15,151,1,204,143,203,195,229,224,115,35,243,16,249,64,28,200,252,
+204,62,82,7,50,63,53,15,149,1,204,143,205,195,229,96,115,35,243,144,249,96,
+28,200,252,236,62,90,7,50,63,61,15,151,1,204,143,207,195,229,224,115,35,
+244,16,251,64,28,200,253,12,62,210,7,50,63,69,15,181,1,204,143,209,195,237,
+96,115,35,244,144,251,96,28,200,253,44,62,218,7,50,63,77,15,183,1,204,143,
+211,195,237,224,115,35,245,16,251,64,28,200,253,76,62,210,7,50,63,85,15,
+181,1,204,143,213,195,237,96,115,35,245,144,251,96,28,200,253,108,62,218,7,
+50,63,93,15,183,1,204,143,215,195,237,224,115,35,246,80,253,208,28,200,253,
+156,7,34,7,50,63,105,1,195,1,204,143,219,64,114,32,104,67,246,248,28,136,
+26,16,28,200,253,228,7,34,7,50,63,133,15,229,1,204,143,225,192,114,224,115,
+35,248,144,28,72,28,200,254,52,7,46,6,132,63,143,129,203,129,161,1,204,143,
+230,64,114,224,115,35,250,88,28,200,24,64,24,0,254,158,7,50,6,16,6,2,63,
+173,1,204,129,161,15,235,224,115,32,97,0,104,67,252,88,29,40,24,64,24,0,
+255,30,7,74,6,16,6,2,63,201,1,208,129,137,143,243,64,116,160,104,67,252,
+248,29,40,24,64,26,16,255,148,63,244,7,50,63,231,1,212,129,204,143,250,64,
+113,224,115,35,254,208,29,72,26,16,255,190,7,82,6,132,7,50,63,249,1,212,
+129,204,253,128,64,8,192,8,223,96,48,2,48,2,79,216,20,0,140,0,153,246,7,
+128,35,0,35,0,36,253,130,96,8,192,8,192,9,159,96,176,2,152,2,167,216,52,0,
+166,0,169,246,39,2,162,2,163,125,138,64,168,128,166,191,98,176,42,32,41,
+223,216,180,10,156,10,141,246,47,2,162,2,158,128,
+};
+const duk_uint8_t duk_unicode_caseconv_lc[680] = {
+152,3,0,3,128,184,6,192,7,192,112,24,144,37,96,64,54,32,81,64,128,226,0,
+235,65,129,199,1,230,130,3,145,3,177,34,7,70,7,134,36,15,244,13,236,24,32,
+0,34,129,0,65,0,67,4,0,166,32,172,41,132,40,11,64,19,9,208,85,184,80,19,
+240,19,248,12,62,16,62,0,32,124,96,124,64,48,249,64,249,0,129,243,129,243,
+1,3,233,3,232,1,135,218,7,216,4,15,196,15,192,8,31,152,31,144,16,63,80,63,
+64,32,126,224,126,192,16,253,208,251,128,33,252,129,247,32,131,251,3,250,0,
+135,246,135,221,129,15,244,15,240,2,31,234,31,122,4,63,240,62,240,8,127,
+232,125,240,17,11,1,11,129,2,75,98,77,3,69,128,5,134,11,203,31,128,143,193,
+127,144,255,160,154,140,4,0,4,4,192,9,144,9,152,48,19,144,19,161,0,41,64,
+41,101,192,94,64,94,129,128,193,0,193,130,1,160,1,161,6,3,102,3,104,8,7,44,
+7,48,72,14,240,14,248,144,31,32,31,48,64,63,0,63,37,0,136,128,136,196,129,
+35,1,35,133,3,112,3,113,4,7,176,7,178,48,17,128,17,132,136,36,80,36,89,176,
+76,16,76,32,224,154,0,154,44,7,128,7,128,101,143,80,15,80,176,31,89,31,81,
+8,88,206,88,208,12,178,0,178,5,145,103,89,103,96,42,100,10,100,18,244,208,
+20,208,35,169,200,169,200,195,211,153,83,153,159,167,121,167,122,5,78,253,
+78,254,22,158,66,158,68,21,60,181,60,184,170,123,74,123,80,67,0,211,1,64,2,
+1,172,1,173,4,3,136,3,140,12,7,20,7,24,16,31,184,31,192,34,199,34,199,48,
+65,128,195,128,196,2,1,184,1,185,5,79,84,4,204,8,0,192,101,128,154,65,1,29,
+129,30,2,16,199,45,39,5,251,240,23,128,15,240,24,16,37,48,24,96,37,64,24,
+224,29,208,24,240,37,144,25,0,37,176,25,16,25,32,25,48,38,0,25,64,38,48,25,
+112,38,128,25,128,25,144,25,208,39,32,25,240,39,80,26,112,26,128,26,224,40,
+128,27,112,41,32,31,16,31,48,31,96,25,80,31,112,27,240,34,0,25,224,35,162,
+198,80,35,208,25,160,35,226,198,96,36,48,24,0,36,64,40,144,36,80,40,192,55,
+96,55,112,55,240,63,48,56,96,58,192,56,192,60,192,60,240,61,112,63,64,59,
+128,63,144,63,32,76,0,76,241,233,224,13,241,251,193,251,49,252,193,252,49,
+254,193,254,81,255,193,255,50,18,96,60,146,18,160,6,178,18,176,14,82,19,34,
+20,226,24,50,24,66,198,2,198,18,198,32,38,178,198,49,215,210,198,64,39,210,
+198,208,37,18,198,224,39,18,198,240,37,2,199,0,37,34,207,34,207,58,119,209,
+215,154,120,186,120,202,120,208,38,90,122,176,37,202,122,192,38,26,122,208,
+38,202,123,0,41,234,123,16,40,122,123,32,41,218,123,58,181,48,32,38,16,3,
+72,24,56,
+};
+
+#if defined(DUK_USE_REGEXP_CANON_WORKAROUND)
+/*
+ * Automatically generated by extract_caseconv.py, do not edit!
+ */
+
+const duk_uint16_t duk_unicode_re_canon_lookup[65536] = {
+0,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,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,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,924,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,192,193,194,195,196,197,198,199,200,201,
+202,203,204,205,206,207,208,209,210,211,212,213,214,247,216,217,218,219,
+220,221,222,376,256,256,258,258,260,260,262,262,264,264,266,266,268,268,
+270,270,272,272,274,274,276,276,278,278,280,280,282,282,284,284,286,286,
+288,288,290,290,292,292,294,294,296,296,298,298,300,300,302,302,304,305,
+306,306,308,308,310,310,312,313,313,315,315,317,317,319,319,321,321,323,
+323,325,325,327,327,329,330,330,332,332,334,334,336,336,338,338,340,340,
+342,342,344,344,346,346,348,348,350,350,352,352,354,354,356,356,358,358,
+360,360,362,362,364,364,366,366,368,368,370,370,372,372,374,374,376,377,
+377,379,379,381,381,383,579,385,386,386,388,388,390,391,391,393,394,395,
+395,397,398,399,400,401,401,403,404,502,406,407,408,408,573,411,412,413,
+544,415,416,416,418,418,420,420,422,423,423,425,426,427,428,428,430,431,
+431,433,434,435,435,437,437,439,440,440,442,443,444,444,446,503,448,449,
+450,451,452,452,452,455,455,455,458,458,458,461,461,463,463,465,465,467,
+467,469,469,471,471,473,473,475,475,398,478,478,480,480,482,482,484,484,
+486,486,488,488,490,490,492,492,494,494,496,497,497,497,500,500,502,503,
+504,504,506,506,508,508,510,510,512,512,514,514,516,516,518,518,520,520,
+522,522,524,524,526,526,528,528,530,530,532,532,534,534,536,536,538,538,
+540,540,542,542,544,545,546,546,548,548,550,550,552,552,554,554,556,556,
+558,558,560,560,562,562,564,565,566,567,568,569,570,571,571,573,574,11390,
+11391,577,577,579,580,581,582,582,584,584,586,586,588,588,590,590,11375,
+11373,11376,385,390,597,393,394,600,399,602,400,42923L,605,606,607,403,
+42924L,610,404,612,42893L,42922L,615,407,406,42926L,11362,42925L,621,622,
+412,624,11374,413,627,628,415,630,631,632,633,634,635,636,11364,638,639,
+422,641,642,425,644,645,646,42929L,430,580,433,434,581,653,654,655,656,657,
+439,659,660,661,662,663,664,665,666,667,668,42930L,42928L,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,
+921,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,880,882,882,884,885,886,886,888,889,890,
+1021,1022,1023,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,
+909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,
+927,928,929,930,931,932,933,934,935,936,937,938,939,902,904,905,906,944,
+913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,
+931,932,933,934,935,936,937,938,939,908,910,911,975,914,920,978,979,980,
+934,928,975,984,984,986,986,988,988,990,990,992,992,994,994,996,996,998,
+998,1000,1000,1002,1002,1004,1004,1006,1006,922,929,1017,895,1012,917,1014,
+1015,1015,1017,1018,1018,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,
+1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,
+1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,
+1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1040,1041,1042,
+1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,
+1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1024,
+1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,
+1120,1120,1122,1122,1124,1124,1126,1126,1128,1128,1130,1130,1132,1132,1134,
+1134,1136,1136,1138,1138,1140,1140,1142,1142,1144,1144,1146,1146,1148,1148,
+1150,1150,1152,1152,1154,1155,1156,1157,1158,1159,1160,1161,1162,1162,1164,
+1164,1166,1166,1168,1168,1170,1170,1172,1172,1174,1174,1176,1176,1178,1178,
+1180,1180,1182,1182,1184,1184,1186,1186,1188,1188,1190,1190,1192,1192,1194,
+1194,1196,1196,1198,1198,1200,1200,1202,1202,1204,1204,1206,1206,1208,1208,
+1210,1210,1212,1212,1214,1214,1216,1217,1217,1219,1219,1221,1221,1223,1223,
+1225,1225,1227,1227,1229,1229,1216,1232,1232,1234,1234,1236,1236,1238,1238,
+1240,1240,1242,1242,1244,1244,1246,1246,1248,1248,1250,1250,1252,1252,1254,
+1254,1256,1256,1258,1258,1260,1260,1262,1262,1264,1264,1266,1266,1268,1268,
+1270,1270,1272,1272,1274,1274,1276,1276,1278,1278,1280,1280,1282,1282,1284,
+1284,1286,1286,1288,1288,1290,1290,1292,1292,1294,1294,1296,1296,1298,1298,
+1300,1300,1302,1302,1304,1304,1306,1306,1308,1308,1310,1310,1312,1312,1314,
+1314,1316,1316,1318,1318,1320,1320,1322,1322,1324,1324,1326,1326,1328,1329,
+1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,
+1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,
+1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,
+1375,1376,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,
+1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,
+1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1415,1416,1417,1418,1419,
+1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,
+1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,
+1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,
+1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,
+1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,
+1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,
+1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,
+1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,
+1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,
+1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,
+1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,
+1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,
+1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,
+1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,
+1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,
+1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,
+1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,
+1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,
+1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,
+1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,
+1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,
+1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,
+1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,
+1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,
+1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,
+1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,
+1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,
+1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,
+1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,
+1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,
+1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,
+1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,
+1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,
+1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,
+1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,
+1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,
+1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,
+1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,
+1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,
+2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,
+2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,
+2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,
+2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,
+2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,
+2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,
+2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,
+2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,
+2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,
+2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,
+2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,
+2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,
+2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,
+2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,
+2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,
+2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,
+2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,
+2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,
+2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,
+2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,
+2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,
+2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,
+2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,
+2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,
+2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,
+2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,
+2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,
+2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,
+2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,
+2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,
+2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,
+2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,
+2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,
+2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,
+2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,
+2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,
+2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,
+2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,
+2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,
+2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,
+2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,
+2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,
+2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,
+2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,
+2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,
+2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,
+2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,
+2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,
+2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,
+2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,
+2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,
+2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,
+2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,
+2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,
+2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,
+2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,
+2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,
+2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,
+2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,
+2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,
+2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,
+2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,
+2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,
+2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,
+2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,
+2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,
+2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,
+3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,
+3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,
+3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,
+3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,
+3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,
+3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,
+3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,
+3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,
+3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,
+3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,
+3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,
+3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,
+3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,
+3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,
+3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,
+3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,
+3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
+3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,
+3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,
+3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,
+3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,
+3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,
+3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,
+3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,
+3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,
+3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,
+3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,
+3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,
+3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,
+3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,
+3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,
+3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,
+3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,
+3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,
+3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,
+3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,
+3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,
+3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,
+3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,
+3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,
+3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,
+3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,
+3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,
+3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,
+3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,
+3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,
+3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,
+3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,
+3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,
+3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,
+3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,
+3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,
+3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,
+3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,
+3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,
+3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,
+3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,
+3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,
+3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,
+3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,
+3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,
+3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,
+3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,
+3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,
+3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,
+3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,
+4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,
+4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,
+4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,
+4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,
+4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,
+4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,
+4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104,
+4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,
+4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,
+4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,
+4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164,
+4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179,
+4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,
+4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,
+4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,
+4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,
+4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254,
+4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,
+4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,
+4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299,
+4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,
+4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,
+4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,
+4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,
+4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,
+4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,
+4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,
+4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,
+4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,
+4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,
+4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,
+4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,
+4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,
+4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,
+4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,
+4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,
+4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,
+4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,
+4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,
+4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,
+4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,
+4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,
+4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,
+4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,
+4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,
+4675,4676,4677,4678,4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689,
+4690,4691,4692,4693,4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704,
+4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,
+4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,
+4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749,
+4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,
+4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,
+4780,4781,4782,4783,4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794,
+4795,4796,4797,4798,4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809,
+4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824,
+4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,
+4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,
+4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,
+4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884,
+4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,
+4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,
+4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,
+4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,
+4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959,
+4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,
+4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989,
+4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,
+5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019,
+5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,
+5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,
+5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,
+5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,
+5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,
+5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,
+5110,5111,5104,5105,5106,5107,5108,5109,5118,5119,5120,5121,5122,5123,5124,
+5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,
+5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,
+5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,
+5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,
+5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,
+5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,
+5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,
+5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,
+5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,
+5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,
+5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,
+5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,
+5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,
+5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,
+5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,
+5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,
+5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,
+5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,
+5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,
+5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,
+5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,
+5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,
+5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,
+5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,
+5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,
+5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,
+5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,
+5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,
+5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,
+5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,
+5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,
+5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,
+5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,
+5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,
+5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,
+5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,
+5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,
+5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,
+5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,
+5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,
+5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769,
+5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,
+5785,5786,5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,
+5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,
+5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,
+5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,
+5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,
+5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,
+5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,
+5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,
+5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,
+5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,
+5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,
+5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
+5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,
+5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
+6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,
+6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
+6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,
+6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,
+6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,
+6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,
+6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,
+6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,
+6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,
+6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,
+6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,
+6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,
+6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,
+6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,
+6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,
+6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,
+6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,
+6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279,
+6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,
+6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,
+6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324,
+6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,
+6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,
+6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,
+6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,
+6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399,
+6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,
+6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,
+6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444,
+6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,
+6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474,
+6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,
+6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,
+6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
+6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,
+6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,
+6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,
+6565,6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,
+6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,
+6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,
+6610,6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,
+6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639,
+6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,
+6655,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,
+6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,
+6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,
+6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,
+6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,
+6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,
+6745,6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,
+6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,
+6775,6776,6777,6778,6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789,
+6790,6791,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,
+6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,
+6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,
+6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849,
+6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864,
+6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,
+6880,6881,6882,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894,
+6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,6905,6906,6907,6908,6909,
+6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,
+6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,
+6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,
+6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969,
+6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984,
+6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999,
+7000,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014,
+7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029,
+7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,7043,7044,
+7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,
+7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
+7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,
+7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,
+7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,
+7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,
+7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,
+7150,7151,7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,
+7165,7166,7167,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,
+7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,
+7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,
+7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,
+7225,7226,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,
+7240,7241,7242,7243,7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,
+7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,
+7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,
+7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,1042,1044,1054,1057,
+1058,1058,1066,1122,42570L,7305,7306,7307,7308,7309,7310,7311,7312,7313,
+7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,
+7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
+7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,
+7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,
+7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,
+7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,
+7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,
+7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,
+7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,
+7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,
+7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,
+7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,
+7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,
+7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,
+7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,
+7539,7540,7541,7542,7543,7544,42877L,7546,7547,7548,11363,7550,7551,7552,
+7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
+7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,
+7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,
+7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,
+7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,
+7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,
+7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,
+7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,
+7673,7674,7675,7676,7677,7678,7679,7680,7680,7682,7682,7684,7684,7686,7686,
+7688,7688,7690,7690,7692,7692,7694,7694,7696,7696,7698,7698,7700,7700,7702,
+7702,7704,7704,7706,7706,7708,7708,7710,7710,7712,7712,7714,7714,7716,7716,
+7718,7718,7720,7720,7722,7722,7724,7724,7726,7726,7728,7728,7730,7730,7732,
+7732,7734,7734,7736,7736,7738,7738,7740,7740,7742,7742,7744,7744,7746,7746,
+7748,7748,7750,7750,7752,7752,7754,7754,7756,7756,7758,7758,7760,7760,7762,
+7762,7764,7764,7766,7766,7768,7768,7770,7770,7772,7772,7774,7774,7776,7776,
+7778,7778,7780,7780,7782,7782,7784,7784,7786,7786,7788,7788,7790,7790,7792,
+7792,7794,7794,7796,7796,7798,7798,7800,7800,7802,7802,7804,7804,7806,7806,
+7808,7808,7810,7810,7812,7812,7814,7814,7816,7816,7818,7818,7820,7820,7822,
+7822,7824,7824,7826,7826,7828,7828,7830,7831,7832,7833,7834,7776,7836,7837,
+7838,7839,7840,7840,7842,7842,7844,7844,7846,7846,7848,7848,7850,7850,7852,
+7852,7854,7854,7856,7856,7858,7858,7860,7860,7862,7862,7864,7864,7866,7866,
+7868,7868,7870,7870,7872,7872,7874,7874,7876,7876,7878,7878,7880,7880,7882,
+7882,7884,7884,7886,7886,7888,7888,7890,7890,7892,7892,7894,7894,7896,7896,
+7898,7898,7900,7900,7902,7902,7904,7904,7906,7906,7908,7908,7910,7910,7912,
+7912,7914,7914,7916,7916,7918,7918,7920,7920,7922,7922,7924,7924,7926,7926,
+7928,7928,7930,7930,7932,7932,7934,7934,7944,7945,7946,7947,7948,7949,7950,
+7951,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,
+7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,7976,7977,7978,7979,7980,
+7981,7982,7983,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,
+7996,7997,7998,7999,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,
+8011,8012,8013,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,8025,
+8018,8027,8020,8029,8022,8031,8024,8025,8026,8027,8028,8029,8030,8031,8040,
+8041,8042,8043,8044,8045,8046,8047,8040,8041,8042,8043,8044,8045,8046,8047,
+8122,8123,8136,8137,8138,8139,8154,8155,8184,8185,8170,8171,8186,8187,8062,
+8063,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,
+8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,
+8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,
+8108,8109,8110,8111,8120,8121,8114,8115,8116,8117,8118,8119,8120,8121,8122,
+8123,8124,8125,921,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,
+8138,8139,8140,8141,8142,8143,8152,8153,8146,8147,8148,8149,8150,8151,8152,
+8153,8154,8155,8156,8157,8158,8159,8168,8169,8162,8163,8164,8172,8166,8167,
+8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,8182,
+8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,
+8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,
+8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,
+8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,
+8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,
+8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,
+8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
+8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,
+8303,8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,
+8318,8319,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,
+8333,8334,8335,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,
+8348,8349,8350,8351,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,
+8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,
+8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,
+8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405,8406,8407,
+8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422,
+8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437,
+8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,
+8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,
+8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,
+8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,
+8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,
+8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8498,8527,
+8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,
+8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,
+8558,8559,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,
+8557,8558,8559,8576,8577,8578,8579,8579,8581,8582,8583,8584,8585,8586,8587,
+8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,
+8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,
+8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632,
+8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,
+8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662,
+8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677,
+8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,
+8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,
+8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,
+8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,
+8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,
+8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,
+8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,
+8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,
+8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,
+8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,
+8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,
+8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,
+8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,
+8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,
+8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,
+8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,
+8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,
+8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,
+8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,
+8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,
+8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,
+8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,
+9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,
+9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,
+9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,
+9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,
+9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,
+9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,
+9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,
+9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,
+9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,
+9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,
+9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,
+9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,
+9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,
+9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,
+9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,
+9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,
+9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,
+9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277,
+9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9291,9292,
+9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,9305,9306,9307,
+9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,
+9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,
+9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352,
+9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,
+9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,
+9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,
+9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,
+9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9398,9399,9400,9401,
+9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,
+9417,9418,9419,9420,9421,9422,9423,9450,9451,9452,9453,9454,9455,9456,9457,
+9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,
+9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,
+9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,
+9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,
+9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,
+9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,
+9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,
+9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,
+9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592,
+9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607,
+9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,
+9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,
+9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,
+9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667,
+9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682,
+9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697,
+9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712,
+9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,
+9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742,
+9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,
+9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,
+9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,
+9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,
+9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,
+9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,
+9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,
+9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,
+9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,
+9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,
+9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,
+9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,
+9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,
+9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,
+9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,
+9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,
+9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,
+9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009,
+10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021,
+10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033,
+10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,
+10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057,
+10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069,
+10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,
+10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093,
+10094,10095,10096,10097,10098,10099,10100,10101,10102,10103,10104,10105,
+10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117,
+10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129,
+10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141,
+10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153,
+10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165,
+10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,
+10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189,
+10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201,
+10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,
+10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,
+10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,
+10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249,
+10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261,
+10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,
+10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,
+10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,
+10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309,
+10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321,
+10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,
+10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345,
+10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357,
+10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369,
+10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381,
+10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393,
+10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,
+10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417,
+10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429,
+10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441,
+10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453,
+10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,
+10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,
+10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489,
+10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501,
+10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513,
+10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525,
+10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,
+10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549,
+10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,
+10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573,
+10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,
+10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,
+10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609,
+10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621,
+10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633,
+10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,
+10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657,
+10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669,
+10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681,
+10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693,
+10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705,
+10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717,
+10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729,
+10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741,
+10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753,
+10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,
+10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,
+10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789,
+10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801,
+10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813,
+10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,
+10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,
+10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,
+10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,
+10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,
+10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885,
+10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,
+10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,
+10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,
+10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,
+10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945,
+10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957,
+10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969,
+10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,
+10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,
+10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,
+11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017,
+11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029,
+11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041,
+11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053,
+11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065,
+11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077,
+11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089,
+11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,
+11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113,
+11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125,
+11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137,
+11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,
+11150,11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,
+11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173,
+11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185,
+11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197,
+11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209,
+11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,
+11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233,
+11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245,
+11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,
+11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,
+11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,
+11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,
+11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,
+11306,11307,11308,11309,11310,11311,11264,11265,11266,11267,11268,11269,
+11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,
+11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,
+11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,
+11306,11307,11308,11309,11310,11359,11360,11360,11362,11363,11364,570,574,
+11367,11367,11369,11369,11371,11371,11373,11374,11375,11376,11377,11378,
+11378,11380,11381,11381,11383,11384,11385,11386,11387,11388,11389,11390,
+11391,11392,11392,11394,11394,11396,11396,11398,11398,11400,11400,11402,
+11402,11404,11404,11406,11406,11408,11408,11410,11410,11412,11412,11414,
+11414,11416,11416,11418,11418,11420,11420,11422,11422,11424,11424,11426,
+11426,11428,11428,11430,11430,11432,11432,11434,11434,11436,11436,11438,
+11438,11440,11440,11442,11442,11444,11444,11446,11446,11448,11448,11450,
+11450,11452,11452,11454,11454,11456,11456,11458,11458,11460,11460,11462,
+11462,11464,11464,11466,11466,11468,11468,11470,11470,11472,11472,11474,
+11474,11476,11476,11478,11478,11480,11480,11482,11482,11484,11484,11486,
+11486,11488,11488,11490,11490,11492,11493,11494,11495,11496,11497,11498,
+11499,11499,11501,11501,11503,11504,11505,11506,11506,11508,11509,11510,
+11511,11512,11513,11514,11515,11516,11517,11518,11519,4256,4257,4258,4259,
+4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,
+4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,
+4290,4291,4292,4293,11558,4295,11560,11561,11562,11563,11564,4301,11566,
+11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,
+11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,
+11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,
+11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,
+11615,11616,11617,11618,11619,11620,11621,11622,11623,11624,11625,11626,
+11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638,
+11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,
+11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,
+11663,11664,11665,11666,11667,11668,11669,11670,11671,11672,11673,11674,
+11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685,11686,
+11687,11688,11689,11690,11691,11692,11693,11694,11695,11696,11697,11698,
+11699,11700,11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,
+11711,11712,11713,11714,11715,11716,11717,11718,11719,11720,11721,11722,
+11723,11724,11725,11726,11727,11728,11729,11730,11731,11732,11733,11734,
+11735,11736,11737,11738,11739,11740,11741,11742,11743,11744,11745,11746,
+11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,
+11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,
+11771,11772,11773,11774,11775,11776,11777,11778,11779,11780,11781,11782,
+11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794,
+11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806,
+11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818,
+11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830,
+11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842,
+11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854,
+11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866,
+11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,
+11879,11880,11881,11882,11883,11884,11885,11886,11887,11888,11889,11890,
+11891,11892,11893,11894,11895,11896,11897,11898,11899,11900,11901,11902,
+11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914,
+11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,
+11927,11928,11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,
+11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950,
+11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962,
+11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,
+11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,
+11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998,
+11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010,
+12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021,12022,
+12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,
+12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046,
+12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058,
+12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070,
+12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,
+12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,
+12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106,
+12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118,
+12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130,
+12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,
+12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,
+12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166,
+12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178,
+12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,
+12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,
+12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,
+12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226,
+12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238,
+12239,12240,12241,12242,12243,12244,12245,12246,12247,12248,12249,12250,
+12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,
+12263,12264,12265,12266,12267,12268,12269,12270,12271,12272,12273,12274,
+12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286,
+12287,12288,12289,12290,12291,12292,12293,12294,12295,12296,12297,12298,
+12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310,
+12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12321,12322,
+12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334,
+12335,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346,
+12347,12348,12349,12350,12351,12352,12353,12354,12355,12356,12357,12358,
+12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,
+12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,
+12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,
+12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,
+12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,
+12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,
+12431,12432,12433,12434,12435,12436,12437,12438,12439,12440,12441,12442,
+12443,12444,12445,12446,12447,12448,12449,12450,12451,12452,12453,12454,
+12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,
+12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,
+12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,
+12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,
+12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,
+12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,
+12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,
+12539,12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,
+12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,
+12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,
+12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,
+12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,
+12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,
+12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,
+12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,
+12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,
+12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,
+12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,
+12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,
+12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,
+12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706,
+12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,
+12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,
+12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742,
+12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,
+12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766,
+12767,12768,12769,12770,12771,12772,12773,12774,12775,12776,12777,12778,
+12779,12780,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790,
+12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,
+12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,
+12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,
+12827,12828,12829,12830,12831,12832,12833,12834,12835,12836,12837,12838,
+12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849,12850,
+12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862,
+12863,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,
+12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12885,12886,
+12887,12888,12889,12890,12891,12892,12893,12894,12895,12896,12897,12898,
+12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,
+12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,
+12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934,
+12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946,
+12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,
+12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,
+12971,12972,12973,12974,12975,12976,12977,12978,12979,12980,12981,12982,
+12983,12984,12985,12986,12987,12988,12989,12990,12991,12992,12993,12994,
+12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006,
+13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018,
+13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030,
+13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042,
+13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054,
+13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066,
+13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,
+13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090,
+13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102,
+13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114,
+13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126,
+13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138,
+13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,
+13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162,
+13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174,
+13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186,
+13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,
+13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210,
+13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222,
+13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234,
+13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246,
+13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,
+13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270,
+13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282,
+13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294,
+13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306,
+13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,
+13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,
+13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,
+13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,
+13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,
+13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,
+13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,
+13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,
+13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,
+13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,
+13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,
+13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,
+13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,
+13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,
+13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,
+13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,
+13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,
+13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,
+13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,
+13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,
+13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,
+13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,
+13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,
+13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,
+13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,
+13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,
+13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,
+13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,
+13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,
+13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,
+13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,
+13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,
+13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,
+13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,
+13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,
+13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,
+13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,
+13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,
+13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,
+13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,
+13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,
+13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,
+13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,
+13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,
+13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,
+13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,
+13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,
+13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,
+13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,
+13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,
+13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,
+13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,
+13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,
+13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,
+13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,
+13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,
+13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,
+13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,
+14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,
+14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,
+14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,
+14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,
+14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,
+14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,
+14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,
+14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,
+14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,
+14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,
+14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,
+14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,
+14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,
+14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,
+14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,
+14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,
+14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,
+14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,
+14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,
+14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,
+14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,
+14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,
+14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,
+14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,
+14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,
+14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,
+14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,
+14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,
+14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,
+14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,
+14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,
+14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,
+14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,
+14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,
+14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,
+14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,
+14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,
+14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,
+14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,
+14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,
+14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,
+14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,
+14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,
+14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,
+14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,
+14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,
+14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,
+14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,
+14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,
+14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,
+14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,
+14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,
+14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,
+14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,
+14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,
+14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,
+14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,
+14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,
+14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,
+14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,
+14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,
+14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,
+14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,
+14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,
+14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,
+14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,
+14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,
+14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,
+14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,
+14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,
+14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,
+14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,
+14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,
+14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,
+14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,
+14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,
+14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,
+14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,
+14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,
+14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,
+14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,
+14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,
+14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,
+14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,
+15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,
+15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,
+15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,
+15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,
+15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,
+15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,
+15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,
+15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,
+15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,
+15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,
+15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,
+15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,
+15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,
+15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,
+15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,
+15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,
+15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,
+15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,
+15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,
+15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,
+15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,
+15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,
+15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,
+15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,
+15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,
+15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,
+15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,
+15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,
+15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,
+15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,
+15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,
+15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,
+15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,
+15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,
+15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,
+15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,
+15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,
+15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,
+15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,
+15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,
+15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,
+15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,
+15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,
+15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,
+15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,
+15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,
+15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,
+15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,
+15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,
+15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,
+15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,
+15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,
+15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,
+15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,
+15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,
+15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,
+15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,
+15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,
+15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,
+15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,
+15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,
+15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,
+15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,
+15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,
+15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,
+15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,
+15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,
+15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,
+15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,
+15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,
+15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,
+15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,
+15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,
+15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,
+15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,
+15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,
+15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,
+15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,
+15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,
+15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,
+15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,
+15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,
+15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,
+16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,
+16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,
+16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,
+16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,
+16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,
+16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,
+16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,
+16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,
+16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,
+16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,
+16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,
+16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,
+16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,
+16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,
+16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,
+16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,
+16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,
+16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,
+16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,
+16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,
+16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,
+16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,
+16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,
+16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,
+16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,
+16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,
+16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,
+16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,
+16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,
+16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,
+16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,
+16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,
+16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,
+16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,
+16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,
+16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,
+16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,
+16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,
+16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,
+16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,
+16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,
+16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,
+16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,
+16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,
+16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,
+16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,
+16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,
+16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,
+16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,
+16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,
+16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,
+16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,
+16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,
+16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,
+16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,
+16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,
+16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,
+16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,
+16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,
+16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,
+16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,
+16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,
+16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,
+16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,
+16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,
+16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,
+16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,
+16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,
+16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,
+16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,
+16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,
+16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,
+16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,
+16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,
+16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,
+16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,
+16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,
+16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,
+16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,
+16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,
+16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,
+16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,
+16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,
+17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,
+17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,
+17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,
+17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,
+17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,
+17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,
+17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,
+17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,
+17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,
+17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,
+17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,
+17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,
+17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,
+17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,
+17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,
+17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,
+17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,
+17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,
+17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,
+17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,
+17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,
+17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,
+17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,
+17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,
+17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,
+17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,
+17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,
+17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,
+17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,
+17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,
+17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,
+17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,
+17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,
+17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,
+17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,
+17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,
+17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,
+17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,
+17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,
+17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,
+17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,
+17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,
+17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,
+17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,
+17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,
+17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,
+17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,
+17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,
+17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,
+17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,
+17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,
+17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,
+17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,
+17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,
+17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,
+17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,
+17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,
+17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,
+17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,
+17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,
+17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,
+17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,
+17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,
+17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,
+17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,
+17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,
+17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,
+17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,
+17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,
+17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,
+17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,
+17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,
+17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,
+17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,
+17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,
+17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,
+17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,
+17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,
+17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,
+17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,
+17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,
+17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,
+17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,
+17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,
+18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,
+18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,
+18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,
+18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,
+18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,
+18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,
+18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,
+18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,
+18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,
+18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,
+18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,
+18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,
+18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,
+18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,
+18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,
+18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,
+18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,
+18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,
+18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,
+18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,
+18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,
+18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,
+18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,
+18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,
+18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,
+18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,
+18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,
+18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,
+18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,
+18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,
+18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,
+18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,
+18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,
+18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,
+18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,
+18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,
+18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,
+18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,
+18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,
+18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,
+18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,
+18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,
+18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,
+18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,
+18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,
+18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,
+18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,
+18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,
+18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,
+18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,
+18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,
+18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,
+18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,
+18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,
+18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,
+18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,
+18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,
+18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,
+18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,
+18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,
+18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,
+18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,
+18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,
+18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,
+18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,
+18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,
+18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,
+18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,
+18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,
+18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,
+18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,
+18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,
+18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,
+18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,
+18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,
+18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,
+18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,
+18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,
+18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,
+18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,
+18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,
+18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,
+18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,
+19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,
+19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,
+19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,
+19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,
+19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,
+19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,
+19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,
+19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,
+19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,
+19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,
+19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,
+19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,
+19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,
+19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,
+19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,
+19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,
+19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,
+19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,
+19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,
+19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,
+19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,
+19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,
+19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,
+19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,
+19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,
+19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,
+19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,
+19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,
+19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,
+19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,
+19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,
+19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,
+19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,
+19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,
+19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,
+19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,
+19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,
+19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,
+19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,
+19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,
+19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,
+19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,
+19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,
+19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,
+19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,
+19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,
+19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,
+19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,
+19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,
+19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,
+19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,
+19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,
+19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,
+19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,
+19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,
+19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,
+19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,
+19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,
+19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,
+19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,
+19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,
+19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,
+19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,
+19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,
+19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,
+19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,
+19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,
+19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,
+19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,
+19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,
+19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,
+19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,
+19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,
+19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,
+19895,19896,19897,19898,19899,19900,19901,19902,19903,19904,19905,19906,
+19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918,
+19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930,
+19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942,
+19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954,
+19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966,
+19967,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,
+19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,
+19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,
+20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,
+20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,
+20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,
+20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,
+20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,
+20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,
+20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,
+20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,
+20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,
+20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,
+20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,
+20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,
+20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,
+20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,
+20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,
+20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,
+20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,
+20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,
+20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,
+20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,
+20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,
+20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,
+20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,
+20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,
+20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,
+20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,
+20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,
+20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,
+20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,
+20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,
+20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,
+20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,
+20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,
+20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,
+20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,
+20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,
+20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,
+20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,
+20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,
+20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,
+20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,
+20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,
+20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,
+20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,
+20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,
+20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,
+20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,
+20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,
+20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,
+20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,
+20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,
+20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,
+20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,
+20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,
+20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,
+20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,
+20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,
+20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,
+20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,
+20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,
+20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,
+20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,
+20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,
+20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,
+20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,
+20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,
+20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,
+20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,
+20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,
+20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,
+20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,
+20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,
+20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,
+20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,
+20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,
+20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,
+20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,
+20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,
+20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,
+20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,
+20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,
+20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,
+20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,
+20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,
+21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,
+21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,
+21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,
+21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,
+21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,
+21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,
+21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,
+21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,
+21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,
+21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,
+21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,
+21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,
+21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,
+21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,
+21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,
+21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,
+21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,
+21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,
+21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,
+21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,
+21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,
+21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,
+21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,
+21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,
+21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,
+21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,
+21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,
+21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,
+21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,
+21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,
+21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,
+21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,
+21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,
+21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,
+21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,
+21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,
+21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,
+21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,
+21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,
+21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,
+21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,
+21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,
+21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,
+21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,
+21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,
+21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,
+21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,
+21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,
+21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,
+21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,
+21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,
+21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,
+21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,
+21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,
+21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,
+21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,
+21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,
+21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,
+21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,
+21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,
+21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,
+21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,
+21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,
+21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,
+21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,
+21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,
+21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,
+21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,
+21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,
+21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,
+21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,
+21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,
+21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,
+21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,
+21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,
+21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,
+21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,
+21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,
+21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,
+21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,
+21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,
+21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,
+21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,
+22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,
+22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,
+22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,
+22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,
+22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,
+22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,
+22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,
+22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,
+22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,
+22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,
+22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,
+22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,
+22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,
+22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,
+22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,
+22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,
+22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,
+22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,
+22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,
+22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,
+22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,
+22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,
+22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,
+22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,
+22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,
+22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,
+22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,
+22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,
+22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,
+22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,
+22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,
+22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,
+22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,
+22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,
+22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,
+22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,
+22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,
+22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,
+22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,
+22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,
+22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,
+22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,
+22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,
+22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,
+22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,
+22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,
+22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,
+22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,
+22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,
+22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,
+22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,
+22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,
+22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,
+22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,
+22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,
+22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,
+22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,
+22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,
+22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,
+22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,
+22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,
+22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,
+22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,
+22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,
+22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,
+22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,
+22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,
+22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,
+22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,
+22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,
+22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,
+22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,
+22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,
+22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,
+22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,
+22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,
+22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,
+22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,
+22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,
+22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,
+22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,
+22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,
+22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,
+23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,
+23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,
+23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,
+23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,
+23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,
+23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,
+23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,
+23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,
+23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,
+23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,
+23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,
+23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,
+23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,
+23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,
+23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,
+23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,
+23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,
+23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,
+23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,
+23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,
+23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,
+23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,
+23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,
+23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,
+23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,
+23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,
+23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,
+23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,
+23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,
+23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,
+23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,
+23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,
+23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,
+23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,
+23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,
+23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,
+23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,
+23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,
+23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,
+23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,
+23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,
+23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,
+23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,
+23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,
+23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,
+23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,
+23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,
+23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,
+23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,
+23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,
+23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,
+23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,
+23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,
+23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,
+23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,
+23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,
+23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,
+23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,
+23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,
+23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,
+23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,
+23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,
+23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,
+23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,
+23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,
+23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,
+23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,
+23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,
+23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,
+23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,
+23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,
+23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,
+23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,
+23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,
+23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,
+23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,
+23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,
+23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,
+23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,
+23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,
+23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,
+23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,
+23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,
+23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,
+24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,
+24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,
+24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,
+24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,
+24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,
+24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,
+24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,
+24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,
+24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,
+24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,
+24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,
+24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,
+24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,
+24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,
+24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,
+24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,
+24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,
+24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,
+24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,
+24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,
+24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,
+24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,
+24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,
+24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,
+24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,
+24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,
+24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,
+24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,
+24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,
+24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,
+24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,
+24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,
+24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,
+24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,
+24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,
+24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,
+24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,
+24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,
+24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,
+24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,
+24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,
+24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,
+24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,
+24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,
+24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,
+24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,
+24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,
+24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,
+24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,
+24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,
+24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,
+24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,
+24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,
+24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,
+24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,
+24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,
+24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,
+24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,
+24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,
+24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,
+24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,
+24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,
+24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,
+24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,
+24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,
+24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,
+24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,
+24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,
+24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,
+24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,
+24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,
+24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,
+24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,
+24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,
+24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,
+24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,
+24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,
+24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,
+24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,
+24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,
+24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,
+24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,
+24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,
+25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,
+25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,
+25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,
+25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,
+25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,
+25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,
+25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,
+25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,
+25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,
+25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,
+25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,
+25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,
+25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,
+25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,
+25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,
+25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,
+25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,
+25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,
+25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,
+25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,
+25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,
+25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,
+25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,
+25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,
+25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,
+25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,
+25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,
+25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,
+25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,
+25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,
+25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,
+25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,
+25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,
+25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,
+25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,
+25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,
+25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,
+25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,
+25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,
+25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,
+25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,
+25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,
+25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,
+25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,
+25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,
+25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,
+25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,
+25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,
+25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,
+25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,
+25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,
+25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,
+25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,
+25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,
+25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,
+25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,
+25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,
+25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,
+25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,
+25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,
+25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,
+25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,
+25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,
+25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,
+25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,
+25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,
+25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,
+25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,
+25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,
+25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,
+25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,
+25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,
+25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,
+25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,
+25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,
+25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,
+25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,
+25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,
+25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,
+25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,
+25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,
+25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,
+25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,
+26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,
+26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,
+26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,
+26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,
+26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,
+26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,
+26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,
+26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,
+26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,
+26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,
+26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,
+26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,
+26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,
+26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,
+26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,
+26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,
+26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,
+26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,
+26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,
+26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,
+26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,
+26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,
+26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,
+26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,
+26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,
+26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,
+26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,
+26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,
+26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,
+26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,
+26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,
+26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,
+26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,
+26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,
+26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,
+26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,
+26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,
+26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,
+26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,
+26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,
+26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,
+26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,
+26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,
+26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,
+26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,
+26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,
+26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,
+26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,
+26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,
+26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,
+26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,
+26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,
+26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,
+26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,
+26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,
+26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,
+26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,
+26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,
+26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,
+26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,
+26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,
+26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,
+26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,
+26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,
+26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,
+26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,
+26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,
+26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,
+26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,
+26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,
+26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,
+26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,
+26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,
+26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,
+26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,
+26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,
+26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,
+26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,
+26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,
+26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,
+26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,
+26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,
+26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,
+26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,
+27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,
+27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,
+27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,
+27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,
+27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,
+27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,
+27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,
+27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,
+27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,
+27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,
+27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,
+27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,
+27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,
+27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,
+27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,
+27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,
+27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,
+27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,
+27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,
+27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,
+27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,
+27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,
+27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,
+27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,
+27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,
+27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,
+27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,
+27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,
+27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,
+27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,
+27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,
+27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,
+27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,
+27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,
+27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,
+27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,
+27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,
+27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,
+27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,
+27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,
+27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,
+27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,
+27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,
+27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,
+27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,
+27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,
+27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,
+27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,
+27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,
+27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,
+27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,
+27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,
+27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,
+27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,
+27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,
+27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,
+27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,
+27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,
+27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,
+27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,
+27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,
+27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,
+27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,
+27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,
+27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,
+27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,
+27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,
+27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,
+27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,
+27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,
+27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,
+27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,
+27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,
+27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,
+27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,
+27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,
+27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,
+27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,
+27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,
+27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,
+27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,
+27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,
+27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,
+28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,
+28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,
+28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,
+28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,
+28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,
+28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,
+28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,
+28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,
+28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,
+28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,
+28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,
+28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,
+28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,
+28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,
+28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,
+28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,
+28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,
+28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,
+28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,
+28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,
+28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,
+28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,
+28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,
+28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,
+28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,
+28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,
+28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,
+28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,
+28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,
+28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,
+28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,
+28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,
+28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,
+28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,
+28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,
+28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,
+28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,
+28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,
+28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,
+28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,
+28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,
+28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,
+28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,
+28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,
+28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,
+28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,
+28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,
+28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,
+28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,
+28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,
+28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,
+28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,
+28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,
+28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,
+28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,
+28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,
+28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,
+28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,
+28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,
+28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,
+28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,
+28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,
+28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,
+28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,
+28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,
+28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,
+28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,
+28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,
+28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,
+28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,
+28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,
+28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,
+28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,
+28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,
+28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,
+28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,
+28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,
+28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,
+28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,
+28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,
+28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,
+28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,
+28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,
+29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,
+29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,
+29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,
+29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,
+29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,
+29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,
+29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,
+29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,
+29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,
+29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,
+29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,
+29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,
+29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,
+29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,
+29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,
+29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,
+29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,
+29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,
+29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,
+29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,
+29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,
+29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,
+29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,
+29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,
+29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,
+29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,
+29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,
+29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,
+29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,
+29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,
+29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,
+29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,
+29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,
+29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,
+29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,
+29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,
+29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,
+29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,
+29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,
+29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,
+29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,
+29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,
+29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,
+29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,
+29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,
+29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,
+29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,
+29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,
+29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,
+29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,
+29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,
+29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,
+29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,
+29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,
+29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,
+29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,
+29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,
+29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,
+29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,
+29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,
+29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,
+29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,
+29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,
+29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,
+29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,
+29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,
+29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,
+29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,
+29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,
+29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,
+29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,
+29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,
+29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,
+29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,
+29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,
+29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,
+29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,
+29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,
+29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,
+29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,
+29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,
+29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,
+29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,
+29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,
+30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,
+30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,
+30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,
+30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,
+30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,
+30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,
+30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,
+30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,
+30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,
+30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,
+30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,
+30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,
+30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,
+30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,
+30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,
+30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,
+30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,
+30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,
+30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,
+30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,
+30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,
+30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,
+30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,
+30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,
+30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,
+30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,
+30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,
+30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,
+30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,
+30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,
+30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,
+30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,
+30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,
+30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,
+30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,
+30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,
+30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,
+30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,
+30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,
+30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,
+30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,
+30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,
+30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,
+30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,
+30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,
+30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,
+30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,
+30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,
+30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,
+30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,
+30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,
+30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,
+30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,
+30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,
+30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,
+30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,
+30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,
+30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,
+30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,
+30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,
+30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,
+30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,
+30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,
+30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,
+30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,
+30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,
+30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,
+30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,
+30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,
+30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,
+30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,
+30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,
+30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,
+30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,
+30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,
+30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,
+30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,
+30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,
+30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,
+30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,
+30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,
+30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,
+30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,
+31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,
+31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,
+31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,
+31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,
+31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,
+31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,
+31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,
+31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,
+31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,
+31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,
+31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,
+31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,
+31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,
+31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,
+31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,
+31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,
+31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,
+31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,
+31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,
+31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,
+31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,
+31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,
+31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,
+31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,
+31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,
+31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,
+31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,
+31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,
+31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,
+31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,
+31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,
+31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,
+31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,
+31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,
+31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,
+31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,
+31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,
+31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,
+31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,
+31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,
+31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,
+31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,
+31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,
+31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,
+31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,
+31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,
+31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,
+31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,
+31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,
+31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,
+31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,
+31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,
+31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,
+31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,
+31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,
+31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,
+31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,
+31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,
+31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,
+31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,
+31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,
+31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,
+31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,
+31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,
+31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,
+31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,
+31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,
+31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,
+31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,
+31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,
+31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,
+31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,
+31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,
+31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,
+31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,
+31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,
+31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,
+31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,
+31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,
+31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,
+31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,
+31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,
+31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,
+32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,
+32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,
+32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,
+32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,
+32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,
+32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,
+32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,
+32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,
+32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,
+32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,
+32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,
+32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,
+32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,
+32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,
+32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,
+32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,
+32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,
+32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,
+32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,
+32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,
+32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,
+32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,
+32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,
+32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,
+32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,
+32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,
+32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,
+32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,
+32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,
+32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,
+32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,
+32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,
+32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,
+32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,
+32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,
+32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,
+32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,
+32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,
+32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,
+32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,
+32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,
+32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,
+32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,
+32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,
+32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,
+32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,
+32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,
+32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,
+32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,
+32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,
+32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,
+32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,
+32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,
+32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,
+32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,
+32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,
+32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,
+32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,
+32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,
+32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,
+32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,
+32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,
+32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,
+32759,32760,32761,32762,32763,32764,32765,32766,32767,32768L,32769L,32770L,
+32771L,32772L,32773L,32774L,32775L,32776L,32777L,32778L,32779L,32780L,
+32781L,32782L,32783L,32784L,32785L,32786L,32787L,32788L,32789L,32790L,
+32791L,32792L,32793L,32794L,32795L,32796L,32797L,32798L,32799L,32800L,
+32801L,32802L,32803L,32804L,32805L,32806L,32807L,32808L,32809L,32810L,
+32811L,32812L,32813L,32814L,32815L,32816L,32817L,32818L,32819L,32820L,
+32821L,32822L,32823L,32824L,32825L,32826L,32827L,32828L,32829L,32830L,
+32831L,32832L,32833L,32834L,32835L,32836L,32837L,32838L,32839L,32840L,
+32841L,32842L,32843L,32844L,32845L,32846L,32847L,32848L,32849L,32850L,
+32851L,32852L,32853L,32854L,32855L,32856L,32857L,32858L,32859L,32860L,
+32861L,32862L,32863L,32864L,32865L,32866L,32867L,32868L,32869L,32870L,
+32871L,32872L,32873L,32874L,32875L,32876L,32877L,32878L,32879L,32880L,
+32881L,32882L,32883L,32884L,32885L,32886L,32887L,32888L,32889L,32890L,
+32891L,32892L,32893L,32894L,32895L,32896L,32897L,32898L,32899L,32900L,
+32901L,32902L,32903L,32904L,32905L,32906L,32907L,32908L,32909L,32910L,
+32911L,32912L,32913L,32914L,32915L,32916L,32917L,32918L,32919L,32920L,
+32921L,32922L,32923L,32924L,32925L,32926L,32927L,32928L,32929L,32930L,
+32931L,32932L,32933L,32934L,32935L,32936L,32937L,32938L,32939L,32940L,
+32941L,32942L,32943L,32944L,32945L,32946L,32947L,32948L,32949L,32950L,
+32951L,32952L,32953L,32954L,32955L,32956L,32957L,32958L,32959L,32960L,
+32961L,32962L,32963L,32964L,32965L,32966L,32967L,32968L,32969L,32970L,
+32971L,32972L,32973L,32974L,32975L,32976L,32977L,32978L,32979L,32980L,
+32981L,32982L,32983L,32984L,32985L,32986L,32987L,32988L,32989L,32990L,
+32991L,32992L,32993L,32994L,32995L,32996L,32997L,32998L,32999L,33000L,
+33001L,33002L,33003L,33004L,33005L,33006L,33007L,33008L,33009L,33010L,
+33011L,33012L,33013L,33014L,33015L,33016L,33017L,33018L,33019L,33020L,
+33021L,33022L,33023L,33024L,33025L,33026L,33027L,33028L,33029L,33030L,
+33031L,33032L,33033L,33034L,33035L,33036L,33037L,33038L,33039L,33040L,
+33041L,33042L,33043L,33044L,33045L,33046L,33047L,33048L,33049L,33050L,
+33051L,33052L,33053L,33054L,33055L,33056L,33057L,33058L,33059L,33060L,
+33061L,33062L,33063L,33064L,33065L,33066L,33067L,33068L,33069L,33070L,
+33071L,33072L,33073L,33074L,33075L,33076L,33077L,33078L,33079L,33080L,
+33081L,33082L,33083L,33084L,33085L,33086L,33087L,33088L,33089L,33090L,
+33091L,33092L,33093L,33094L,33095L,33096L,33097L,33098L,33099L,33100L,
+33101L,33102L,33103L,33104L,33105L,33106L,33107L,33108L,33109L,33110L,
+33111L,33112L,33113L,33114L,33115L,33116L,33117L,33118L,33119L,33120L,
+33121L,33122L,33123L,33124L,33125L,33126L,33127L,33128L,33129L,33130L,
+33131L,33132L,33133L,33134L,33135L,33136L,33137L,33138L,33139L,33140L,
+33141L,33142L,33143L,33144L,33145L,33146L,33147L,33148L,33149L,33150L,
+33151L,33152L,33153L,33154L,33155L,33156L,33157L,33158L,33159L,33160L,
+33161L,33162L,33163L,33164L,33165L,33166L,33167L,33168L,33169L,33170L,
+33171L,33172L,33173L,33174L,33175L,33176L,33177L,33178L,33179L,33180L,
+33181L,33182L,33183L,33184L,33185L,33186L,33187L,33188L,33189L,33190L,
+33191L,33192L,33193L,33194L,33195L,33196L,33197L,33198L,33199L,33200L,
+33201L,33202L,33203L,33204L,33205L,33206L,33207L,33208L,33209L,33210L,
+33211L,33212L,33213L,33214L,33215L,33216L,33217L,33218L,33219L,33220L,
+33221L,33222L,33223L,33224L,33225L,33226L,33227L,33228L,33229L,33230L,
+33231L,33232L,33233L,33234L,33235L,33236L,33237L,33238L,33239L,33240L,
+33241L,33242L,33243L,33244L,33245L,33246L,33247L,33248L,33249L,33250L,
+33251L,33252L,33253L,33254L,33255L,33256L,33257L,33258L,33259L,33260L,
+33261L,33262L,33263L,33264L,33265L,33266L,33267L,33268L,33269L,33270L,
+33271L,33272L,33273L,33274L,33275L,33276L,33277L,33278L,33279L,33280L,
+33281L,33282L,33283L,33284L,33285L,33286L,33287L,33288L,33289L,33290L,
+33291L,33292L,33293L,33294L,33295L,33296L,33297L,33298L,33299L,33300L,
+33301L,33302L,33303L,33304L,33305L,33306L,33307L,33308L,33309L,33310L,
+33311L,33312L,33313L,33314L,33315L,33316L,33317L,33318L,33319L,33320L,
+33321L,33322L,33323L,33324L,33325L,33326L,33327L,33328L,33329L,33330L,
+33331L,33332L,33333L,33334L,33335L,33336L,33337L,33338L,33339L,33340L,
+33341L,33342L,33343L,33344L,33345L,33346L,33347L,33348L,33349L,33350L,
+33351L,33352L,33353L,33354L,33355L,33356L,33357L,33358L,33359L,33360L,
+33361L,33362L,33363L,33364L,33365L,33366L,33367L,33368L,33369L,33370L,
+33371L,33372L,33373L,33374L,33375L,33376L,33377L,33378L,33379L,33380L,
+33381L,33382L,33383L,33384L,33385L,33386L,33387L,33388L,33389L,33390L,
+33391L,33392L,33393L,33394L,33395L,33396L,33397L,33398L,33399L,33400L,
+33401L,33402L,33403L,33404L,33405L,33406L,33407L,33408L,33409L,33410L,
+33411L,33412L,33413L,33414L,33415L,33416L,33417L,33418L,33419L,33420L,
+33421L,33422L,33423L,33424L,33425L,33426L,33427L,33428L,33429L,33430L,
+33431L,33432L,33433L,33434L,33435L,33436L,33437L,33438L,33439L,33440L,
+33441L,33442L,33443L,33444L,33445L,33446L,33447L,33448L,33449L,33450L,
+33451L,33452L,33453L,33454L,33455L,33456L,33457L,33458L,33459L,33460L,
+33461L,33462L,33463L,33464L,33465L,33466L,33467L,33468L,33469L,33470L,
+33471L,33472L,33473L,33474L,33475L,33476L,33477L,33478L,33479L,33480L,
+33481L,33482L,33483L,33484L,33485L,33486L,33487L,33488L,33489L,33490L,
+33491L,33492L,33493L,33494L,33495L,33496L,33497L,33498L,33499L,33500L,
+33501L,33502L,33503L,33504L,33505L,33506L,33507L,33508L,33509L,33510L,
+33511L,33512L,33513L,33514L,33515L,33516L,33517L,33518L,33519L,33520L,
+33521L,33522L,33523L,33524L,33525L,33526L,33527L,33528L,33529L,33530L,
+33531L,33532L,33533L,33534L,33535L,33536L,33537L,33538L,33539L,33540L,
+33541L,33542L,33543L,33544L,33545L,33546L,33547L,33548L,33549L,33550L,
+33551L,33552L,33553L,33554L,33555L,33556L,33557L,33558L,33559L,33560L,
+33561L,33562L,33563L,33564L,33565L,33566L,33567L,33568L,33569L,33570L,
+33571L,33572L,33573L,33574L,33575L,33576L,33577L,33578L,33579L,33580L,
+33581L,33582L,33583L,33584L,33585L,33586L,33587L,33588L,33589L,33590L,
+33591L,33592L,33593L,33594L,33595L,33596L,33597L,33598L,33599L,33600L,
+33601L,33602L,33603L,33604L,33605L,33606L,33607L,33608L,33609L,33610L,
+33611L,33612L,33613L,33614L,33615L,33616L,33617L,33618L,33619L,33620L,
+33621L,33622L,33623L,33624L,33625L,33626L,33627L,33628L,33629L,33630L,
+33631L,33632L,33633L,33634L,33635L,33636L,33637L,33638L,33639L,33640L,
+33641L,33642L,33643L,33644L,33645L,33646L,33647L,33648L,33649L,33650L,
+33651L,33652L,33653L,33654L,33655L,33656L,33657L,33658L,33659L,33660L,
+33661L,33662L,33663L,33664L,33665L,33666L,33667L,33668L,33669L,33670L,
+33671L,33672L,33673L,33674L,33675L,33676L,33677L,33678L,33679L,33680L,
+33681L,33682L,33683L,33684L,33685L,33686L,33687L,33688L,33689L,33690L,
+33691L,33692L,33693L,33694L,33695L,33696L,33697L,33698L,33699L,33700L,
+33701L,33702L,33703L,33704L,33705L,33706L,33707L,33708L,33709L,33710L,
+33711L,33712L,33713L,33714L,33715L,33716L,33717L,33718L,33719L,33720L,
+33721L,33722L,33723L,33724L,33725L,33726L,33727L,33728L,33729L,33730L,
+33731L,33732L,33733L,33734L,33735L,33736L,33737L,33738L,33739L,33740L,
+33741L,33742L,33743L,33744L,33745L,33746L,33747L,33748L,33749L,33750L,
+33751L,33752L,33753L,33754L,33755L,33756L,33757L,33758L,33759L,33760L,
+33761L,33762L,33763L,33764L,33765L,33766L,33767L,33768L,33769L,33770L,
+33771L,33772L,33773L,33774L,33775L,33776L,33777L,33778L,33779L,33780L,
+33781L,33782L,33783L,33784L,33785L,33786L,33787L,33788L,33789L,33790L,
+33791L,33792L,33793L,33794L,33795L,33796L,33797L,33798L,33799L,33800L,
+33801L,33802L,33803L,33804L,33805L,33806L,33807L,33808L,33809L,33810L,
+33811L,33812L,33813L,33814L,33815L,33816L,33817L,33818L,33819L,33820L,
+33821L,33822L,33823L,33824L,33825L,33826L,33827L,33828L,33829L,33830L,
+33831L,33832L,33833L,33834L,33835L,33836L,33837L,33838L,33839L,33840L,
+33841L,33842L,33843L,33844L,33845L,33846L,33847L,33848L,33849L,33850L,
+33851L,33852L,33853L,33854L,33855L,33856L,33857L,33858L,33859L,33860L,
+33861L,33862L,33863L,33864L,33865L,33866L,33867L,33868L,33869L,33870L,
+33871L,33872L,33873L,33874L,33875L,33876L,33877L,33878L,33879L,33880L,
+33881L,33882L,33883L,33884L,33885L,33886L,33887L,33888L,33889L,33890L,
+33891L,33892L,33893L,33894L,33895L,33896L,33897L,33898L,33899L,33900L,
+33901L,33902L,33903L,33904L,33905L,33906L,33907L,33908L,33909L,33910L,
+33911L,33912L,33913L,33914L,33915L,33916L,33917L,33918L,33919L,33920L,
+33921L,33922L,33923L,33924L,33925L,33926L,33927L,33928L,33929L,33930L,
+33931L,33932L,33933L,33934L,33935L,33936L,33937L,33938L,33939L,33940L,
+33941L,33942L,33943L,33944L,33945L,33946L,33947L,33948L,33949L,33950L,
+33951L,33952L,33953L,33954L,33955L,33956L,33957L,33958L,33959L,33960L,
+33961L,33962L,33963L,33964L,33965L,33966L,33967L,33968L,33969L,33970L,
+33971L,33972L,33973L,33974L,33975L,33976L,33977L,33978L,33979L,33980L,
+33981L,33982L,33983L,33984L,33985L,33986L,33987L,33988L,33989L,33990L,
+33991L,33992L,33993L,33994L,33995L,33996L,33997L,33998L,33999L,34000L,
+34001L,34002L,34003L,34004L,34005L,34006L,34007L,34008L,34009L,34010L,
+34011L,34012L,34013L,34014L,34015L,34016L,34017L,34018L,34019L,34020L,
+34021L,34022L,34023L,34024L,34025L,34026L,34027L,34028L,34029L,34030L,
+34031L,34032L,34033L,34034L,34035L,34036L,34037L,34038L,34039L,34040L,
+34041L,34042L,34043L,34044L,34045L,34046L,34047L,34048L,34049L,34050L,
+34051L,34052L,34053L,34054L,34055L,34056L,34057L,34058L,34059L,34060L,
+34061L,34062L,34063L,34064L,34065L,34066L,34067L,34068L,34069L,34070L,
+34071L,34072L,34073L,34074L,34075L,34076L,34077L,34078L,34079L,34080L,
+34081L,34082L,34083L,34084L,34085L,34086L,34087L,34088L,34089L,34090L,
+34091L,34092L,34093L,34094L,34095L,34096L,34097L,34098L,34099L,34100L,
+34101L,34102L,34103L,34104L,34105L,34106L,34107L,34108L,34109L,34110L,
+34111L,34112L,34113L,34114L,34115L,34116L,34117L,34118L,34119L,34120L,
+34121L,34122L,34123L,34124L,34125L,34126L,34127L,34128L,34129L,34130L,
+34131L,34132L,34133L,34134L,34135L,34136L,34137L,34138L,34139L,34140L,
+34141L,34142L,34143L,34144L,34145L,34146L,34147L,34148L,34149L,34150L,
+34151L,34152L,34153L,34154L,34155L,34156L,34157L,34158L,34159L,34160L,
+34161L,34162L,34163L,34164L,34165L,34166L,34167L,34168L,34169L,34170L,
+34171L,34172L,34173L,34174L,34175L,34176L,34177L,34178L,34179L,34180L,
+34181L,34182L,34183L,34184L,34185L,34186L,34187L,34188L,34189L,34190L,
+34191L,34192L,34193L,34194L,34195L,34196L,34197L,34198L,34199L,34200L,
+34201L,34202L,34203L,34204L,34205L,34206L,34207L,34208L,34209L,34210L,
+34211L,34212L,34213L,34214L,34215L,34216L,34217L,34218L,34219L,34220L,
+34221L,34222L,34223L,34224L,34225L,34226L,34227L,34228L,34229L,34230L,
+34231L,34232L,34233L,34234L,34235L,34236L,34237L,34238L,34239L,34240L,
+34241L,34242L,34243L,34244L,34245L,34246L,34247L,34248L,34249L,34250L,
+34251L,34252L,34253L,34254L,34255L,34256L,34257L,34258L,34259L,34260L,
+34261L,34262L,34263L,34264L,34265L,34266L,34267L,34268L,34269L,34270L,
+34271L,34272L,34273L,34274L,34275L,34276L,34277L,34278L,34279L,34280L,
+34281L,34282L,34283L,34284L,34285L,34286L,34287L,34288L,34289L,34290L,
+34291L,34292L,34293L,34294L,34295L,34296L,34297L,34298L,34299L,34300L,
+34301L,34302L,34303L,34304L,34305L,34306L,34307L,34308L,34309L,34310L,
+34311L,34312L,34313L,34314L,34315L,34316L,34317L,34318L,34319L,34320L,
+34321L,34322L,34323L,34324L,34325L,34326L,34327L,34328L,34329L,34330L,
+34331L,34332L,34333L,34334L,34335L,34336L,34337L,34338L,34339L,34340L,
+34341L,34342L,34343L,34344L,34345L,34346L,34347L,34348L,34349L,34350L,
+34351L,34352L,34353L,34354L,34355L,34356L,34357L,34358L,34359L,34360L,
+34361L,34362L,34363L,34364L,34365L,34366L,34367L,34368L,34369L,34370L,
+34371L,34372L,34373L,34374L,34375L,34376L,34377L,34378L,34379L,34380L,
+34381L,34382L,34383L,34384L,34385L,34386L,34387L,34388L,34389L,34390L,
+34391L,34392L,34393L,34394L,34395L,34396L,34397L,34398L,34399L,34400L,
+34401L,34402L,34403L,34404L,34405L,34406L,34407L,34408L,34409L,34410L,
+34411L,34412L,34413L,34414L,34415L,34416L,34417L,34418L,34419L,34420L,
+34421L,34422L,34423L,34424L,34425L,34426L,34427L,34428L,34429L,34430L,
+34431L,34432L,34433L,34434L,34435L,34436L,34437L,34438L,34439L,34440L,
+34441L,34442L,34443L,34444L,34445L,34446L,34447L,34448L,34449L,34450L,
+34451L,34452L,34453L,34454L,34455L,34456L,34457L,34458L,34459L,34460L,
+34461L,34462L,34463L,34464L,34465L,34466L,34467L,34468L,34469L,34470L,
+34471L,34472L,34473L,34474L,34475L,34476L,34477L,34478L,34479L,34480L,
+34481L,34482L,34483L,34484L,34485L,34486L,34487L,34488L,34489L,34490L,
+34491L,34492L,34493L,34494L,34495L,34496L,34497L,34498L,34499L,34500L,
+34501L,34502L,34503L,34504L,34505L,34506L,34507L,34508L,34509L,34510L,
+34511L,34512L,34513L,34514L,34515L,34516L,34517L,34518L,34519L,34520L,
+34521L,34522L,34523L,34524L,34525L,34526L,34527L,34528L,34529L,34530L,
+34531L,34532L,34533L,34534L,34535L,34536L,34537L,34538L,34539L,34540L,
+34541L,34542L,34543L,34544L,34545L,34546L,34547L,34548L,34549L,34550L,
+34551L,34552L,34553L,34554L,34555L,34556L,34557L,34558L,34559L,34560L,
+34561L,34562L,34563L,34564L,34565L,34566L,34567L,34568L,34569L,34570L,
+34571L,34572L,34573L,34574L,34575L,34576L,34577L,34578L,34579L,34580L,
+34581L,34582L,34583L,34584L,34585L,34586L,34587L,34588L,34589L,34590L,
+34591L,34592L,34593L,34594L,34595L,34596L,34597L,34598L,34599L,34600L,
+34601L,34602L,34603L,34604L,34605L,34606L,34607L,34608L,34609L,34610L,
+34611L,34612L,34613L,34614L,34615L,34616L,34617L,34618L,34619L,34620L,
+34621L,34622L,34623L,34624L,34625L,34626L,34627L,34628L,34629L,34630L,
+34631L,34632L,34633L,34634L,34635L,34636L,34637L,34638L,34639L,34640L,
+34641L,34642L,34643L,34644L,34645L,34646L,34647L,34648L,34649L,34650L,
+34651L,34652L,34653L,34654L,34655L,34656L,34657L,34658L,34659L,34660L,
+34661L,34662L,34663L,34664L,34665L,34666L,34667L,34668L,34669L,34670L,
+34671L,34672L,34673L,34674L,34675L,34676L,34677L,34678L,34679L,34680L,
+34681L,34682L,34683L,34684L,34685L,34686L,34687L,34688L,34689L,34690L,
+34691L,34692L,34693L,34694L,34695L,34696L,34697L,34698L,34699L,34700L,
+34701L,34702L,34703L,34704L,34705L,34706L,34707L,34708L,34709L,34710L,
+34711L,34712L,34713L,34714L,34715L,34716L,34717L,34718L,34719L,34720L,
+34721L,34722L,34723L,34724L,34725L,34726L,34727L,34728L,34729L,34730L,
+34731L,34732L,34733L,34734L,34735L,34736L,34737L,34738L,34739L,34740L,
+34741L,34742L,34743L,34744L,34745L,34746L,34747L,34748L,34749L,34750L,
+34751L,34752L,34753L,34754L,34755L,34756L,34757L,34758L,34759L,34760L,
+34761L,34762L,34763L,34764L,34765L,34766L,34767L,34768L,34769L,34770L,
+34771L,34772L,34773L,34774L,34775L,34776L,34777L,34778L,34779L,34780L,
+34781L,34782L,34783L,34784L,34785L,34786L,34787L,34788L,34789L,34790L,
+34791L,34792L,34793L,34794L,34795L,34796L,34797L,34798L,34799L,34800L,
+34801L,34802L,34803L,34804L,34805L,34806L,34807L,34808L,34809L,34810L,
+34811L,34812L,34813L,34814L,34815L,34816L,34817L,34818L,34819L,34820L,
+34821L,34822L,34823L,34824L,34825L,34826L,34827L,34828L,34829L,34830L,
+34831L,34832L,34833L,34834L,34835L,34836L,34837L,34838L,34839L,34840L,
+34841L,34842L,34843L,34844L,34845L,34846L,34847L,34848L,34849L,34850L,
+34851L,34852L,34853L,34854L,34855L,34856L,34857L,34858L,34859L,34860L,
+34861L,34862L,34863L,34864L,34865L,34866L,34867L,34868L,34869L,34870L,
+34871L,34872L,34873L,34874L,34875L,34876L,34877L,34878L,34879L,34880L,
+34881L,34882L,34883L,34884L,34885L,34886L,34887L,34888L,34889L,34890L,
+34891L,34892L,34893L,34894L,34895L,34896L,34897L,34898L,34899L,34900L,
+34901L,34902L,34903L,34904L,34905L,34906L,34907L,34908L,34909L,34910L,
+34911L,34912L,34913L,34914L,34915L,34916L,34917L,34918L,34919L,34920L,
+34921L,34922L,34923L,34924L,34925L,34926L,34927L,34928L,34929L,34930L,
+34931L,34932L,34933L,34934L,34935L,34936L,34937L,34938L,34939L,34940L,
+34941L,34942L,34943L,34944L,34945L,34946L,34947L,34948L,34949L,34950L,
+34951L,34952L,34953L,34954L,34955L,34956L,34957L,34958L,34959L,34960L,
+34961L,34962L,34963L,34964L,34965L,34966L,34967L,34968L,34969L,34970L,
+34971L,34972L,34973L,34974L,34975L,34976L,34977L,34978L,34979L,34980L,
+34981L,34982L,34983L,34984L,34985L,34986L,34987L,34988L,34989L,34990L,
+34991L,34992L,34993L,34994L,34995L,34996L,34997L,34998L,34999L,35000L,
+35001L,35002L,35003L,35004L,35005L,35006L,35007L,35008L,35009L,35010L,
+35011L,35012L,35013L,35014L,35015L,35016L,35017L,35018L,35019L,35020L,
+35021L,35022L,35023L,35024L,35025L,35026L,35027L,35028L,35029L,35030L,
+35031L,35032L,35033L,35034L,35035L,35036L,35037L,35038L,35039L,35040L,
+35041L,35042L,35043L,35044L,35045L,35046L,35047L,35048L,35049L,35050L,
+35051L,35052L,35053L,35054L,35055L,35056L,35057L,35058L,35059L,35060L,
+35061L,35062L,35063L,35064L,35065L,35066L,35067L,35068L,35069L,35070L,
+35071L,35072L,35073L,35074L,35075L,35076L,35077L,35078L,35079L,35080L,
+35081L,35082L,35083L,35084L,35085L,35086L,35087L,35088L,35089L,35090L,
+35091L,35092L,35093L,35094L,35095L,35096L,35097L,35098L,35099L,35100L,
+35101L,35102L,35103L,35104L,35105L,35106L,35107L,35108L,35109L,35110L,
+35111L,35112L,35113L,35114L,35115L,35116L,35117L,35118L,35119L,35120L,
+35121L,35122L,35123L,35124L,35125L,35126L,35127L,35128L,35129L,35130L,
+35131L,35132L,35133L,35134L,35135L,35136L,35137L,35138L,35139L,35140L,
+35141L,35142L,35143L,35144L,35145L,35146L,35147L,35148L,35149L,35150L,
+35151L,35152L,35153L,35154L,35155L,35156L,35157L,35158L,35159L,35160L,
+35161L,35162L,35163L,35164L,35165L,35166L,35167L,35168L,35169L,35170L,
+35171L,35172L,35173L,35174L,35175L,35176L,35177L,35178L,35179L,35180L,
+35181L,35182L,35183L,35184L,35185L,35186L,35187L,35188L,35189L,35190L,
+35191L,35192L,35193L,35194L,35195L,35196L,35197L,35198L,35199L,35200L,
+35201L,35202L,35203L,35204L,35205L,35206L,35207L,35208L,35209L,35210L,
+35211L,35212L,35213L,35214L,35215L,35216L,35217L,35218L,35219L,35220L,
+35221L,35222L,35223L,35224L,35225L,35226L,35227L,35228L,35229L,35230L,
+35231L,35232L,35233L,35234L,35235L,35236L,35237L,35238L,35239L,35240L,
+35241L,35242L,35243L,35244L,35245L,35246L,35247L,35248L,35249L,35250L,
+35251L,35252L,35253L,35254L,35255L,35256L,35257L,35258L,35259L,35260L,
+35261L,35262L,35263L,35264L,35265L,35266L,35267L,35268L,35269L,35270L,
+35271L,35272L,35273L,35274L,35275L,35276L,35277L,35278L,35279L,35280L,
+35281L,35282L,35283L,35284L,35285L,35286L,35287L,35288L,35289L,35290L,
+35291L,35292L,35293L,35294L,35295L,35296L,35297L,35298L,35299L,35300L,
+35301L,35302L,35303L,35304L,35305L,35306L,35307L,35308L,35309L,35310L,
+35311L,35312L,35313L,35314L,35315L,35316L,35317L,35318L,35319L,35320L,
+35321L,35322L,35323L,35324L,35325L,35326L,35327L,35328L,35329L,35330L,
+35331L,35332L,35333L,35334L,35335L,35336L,35337L,35338L,35339L,35340L,
+35341L,35342L,35343L,35344L,35345L,35346L,35347L,35348L,35349L,35350L,
+35351L,35352L,35353L,35354L,35355L,35356L,35357L,35358L,35359L,35360L,
+35361L,35362L,35363L,35364L,35365L,35366L,35367L,35368L,35369L,35370L,
+35371L,35372L,35373L,35374L,35375L,35376L,35377L,35378L,35379L,35380L,
+35381L,35382L,35383L,35384L,35385L,35386L,35387L,35388L,35389L,35390L,
+35391L,35392L,35393L,35394L,35395L,35396L,35397L,35398L,35399L,35400L,
+35401L,35402L,35403L,35404L,35405L,35406L,35407L,35408L,35409L,35410L,
+35411L,35412L,35413L,35414L,35415L,35416L,35417L,35418L,35419L,35420L,
+35421L,35422L,35423L,35424L,35425L,35426L,35427L,35428L,35429L,35430L,
+35431L,35432L,35433L,35434L,35435L,35436L,35437L,35438L,35439L,35440L,
+35441L,35442L,35443L,35444L,35445L,35446L,35447L,35448L,35449L,35450L,
+35451L,35452L,35453L,35454L,35455L,35456L,35457L,35458L,35459L,35460L,
+35461L,35462L,35463L,35464L,35465L,35466L,35467L,35468L,35469L,35470L,
+35471L,35472L,35473L,35474L,35475L,35476L,35477L,35478L,35479L,35480L,
+35481L,35482L,35483L,35484L,35485L,35486L,35487L,35488L,35489L,35490L,
+35491L,35492L,35493L,35494L,35495L,35496L,35497L,35498L,35499L,35500L,
+35501L,35502L,35503L,35504L,35505L,35506L,35507L,35508L,35509L,35510L,
+35511L,35512L,35513L,35514L,35515L,35516L,35517L,35518L,35519L,35520L,
+35521L,35522L,35523L,35524L,35525L,35526L,35527L,35528L,35529L,35530L,
+35531L,35532L,35533L,35534L,35535L,35536L,35537L,35538L,35539L,35540L,
+35541L,35542L,35543L,35544L,35545L,35546L,35547L,35548L,35549L,35550L,
+35551L,35552L,35553L,35554L,35555L,35556L,35557L,35558L,35559L,35560L,
+35561L,35562L,35563L,35564L,35565L,35566L,35567L,35568L,35569L,35570L,
+35571L,35572L,35573L,35574L,35575L,35576L,35577L,35578L,35579L,35580L,
+35581L,35582L,35583L,35584L,35585L,35586L,35587L,35588L,35589L,35590L,
+35591L,35592L,35593L,35594L,35595L,35596L,35597L,35598L,35599L,35600L,
+35601L,35602L,35603L,35604L,35605L,35606L,35607L,35608L,35609L,35610L,
+35611L,35612L,35613L,35614L,35615L,35616L,35617L,35618L,35619L,35620L,
+35621L,35622L,35623L,35624L,35625L,35626L,35627L,35628L,35629L,35630L,
+35631L,35632L,35633L,35634L,35635L,35636L,35637L,35638L,35639L,35640L,
+35641L,35642L,35643L,35644L,35645L,35646L,35647L,35648L,35649L,35650L,
+35651L,35652L,35653L,35654L,35655L,35656L,35657L,35658L,35659L,35660L,
+35661L,35662L,35663L,35664L,35665L,35666L,35667L,35668L,35669L,35670L,
+35671L,35672L,35673L,35674L,35675L,35676L,35677L,35678L,35679L,35680L,
+35681L,35682L,35683L,35684L,35685L,35686L,35687L,35688L,35689L,35690L,
+35691L,35692L,35693L,35694L,35695L,35696L,35697L,35698L,35699L,35700L,
+35701L,35702L,35703L,35704L,35705L,35706L,35707L,35708L,35709L,35710L,
+35711L,35712L,35713L,35714L,35715L,35716L,35717L,35718L,35719L,35720L,
+35721L,35722L,35723L,35724L,35725L,35726L,35727L,35728L,35729L,35730L,
+35731L,35732L,35733L,35734L,35735L,35736L,35737L,35738L,35739L,35740L,
+35741L,35742L,35743L,35744L,35745L,35746L,35747L,35748L,35749L,35750L,
+35751L,35752L,35753L,35754L,35755L,35756L,35757L,35758L,35759L,35760L,
+35761L,35762L,35763L,35764L,35765L,35766L,35767L,35768L,35769L,35770L,
+35771L,35772L,35773L,35774L,35775L,35776L,35777L,35778L,35779L,35780L,
+35781L,35782L,35783L,35784L,35785L,35786L,35787L,35788L,35789L,35790L,
+35791L,35792L,35793L,35794L,35795L,35796L,35797L,35798L,35799L,35800L,
+35801L,35802L,35803L,35804L,35805L,35806L,35807L,35808L,35809L,35810L,
+35811L,35812L,35813L,35814L,35815L,35816L,35817L,35818L,35819L,35820L,
+35821L,35822L,35823L,35824L,35825L,35826L,35827L,35828L,35829L,35830L,
+35831L,35832L,35833L,35834L,35835L,35836L,35837L,35838L,35839L,35840L,
+35841L,35842L,35843L,35844L,35845L,35846L,35847L,35848L,35849L,35850L,
+35851L,35852L,35853L,35854L,35855L,35856L,35857L,35858L,35859L,35860L,
+35861L,35862L,35863L,35864L,35865L,35866L,35867L,35868L,35869L,35870L,
+35871L,35872L,35873L,35874L,35875L,35876L,35877L,35878L,35879L,35880L,
+35881L,35882L,35883L,35884L,35885L,35886L,35887L,35888L,35889L,35890L,
+35891L,35892L,35893L,35894L,35895L,35896L,35897L,35898L,35899L,35900L,
+35901L,35902L,35903L,35904L,35905L,35906L,35907L,35908L,35909L,35910L,
+35911L,35912L,35913L,35914L,35915L,35916L,35917L,35918L,35919L,35920L,
+35921L,35922L,35923L,35924L,35925L,35926L,35927L,35928L,35929L,35930L,
+35931L,35932L,35933L,35934L,35935L,35936L,35937L,35938L,35939L,35940L,
+35941L,35942L,35943L,35944L,35945L,35946L,35947L,35948L,35949L,35950L,
+35951L,35952L,35953L,35954L,35955L,35956L,35957L,35958L,35959L,35960L,
+35961L,35962L,35963L,35964L,35965L,35966L,35967L,35968L,35969L,35970L,
+35971L,35972L,35973L,35974L,35975L,35976L,35977L,35978L,35979L,35980L,
+35981L,35982L,35983L,35984L,35985L,35986L,35987L,35988L,35989L,35990L,
+35991L,35992L,35993L,35994L,35995L,35996L,35997L,35998L,35999L,36000L,
+36001L,36002L,36003L,36004L,36005L,36006L,36007L,36008L,36009L,36010L,
+36011L,36012L,36013L,36014L,36015L,36016L,36017L,36018L,36019L,36020L,
+36021L,36022L,36023L,36024L,36025L,36026L,36027L,36028L,36029L,36030L,
+36031L,36032L,36033L,36034L,36035L,36036L,36037L,36038L,36039L,36040L,
+36041L,36042L,36043L,36044L,36045L,36046L,36047L,36048L,36049L,36050L,
+36051L,36052L,36053L,36054L,36055L,36056L,36057L,36058L,36059L,36060L,
+36061L,36062L,36063L,36064L,36065L,36066L,36067L,36068L,36069L,36070L,
+36071L,36072L,36073L,36074L,36075L,36076L,36077L,36078L,36079L,36080L,
+36081L,36082L,36083L,36084L,36085L,36086L,36087L,36088L,36089L,36090L,
+36091L,36092L,36093L,36094L,36095L,36096L,36097L,36098L,36099L,36100L,
+36101L,36102L,36103L,36104L,36105L,36106L,36107L,36108L,36109L,36110L,
+36111L,36112L,36113L,36114L,36115L,36116L,36117L,36118L,36119L,36120L,
+36121L,36122L,36123L,36124L,36125L,36126L,36127L,36128L,36129L,36130L,
+36131L,36132L,36133L,36134L,36135L,36136L,36137L,36138L,36139L,36140L,
+36141L,36142L,36143L,36144L,36145L,36146L,36147L,36148L,36149L,36150L,
+36151L,36152L,36153L,36154L,36155L,36156L,36157L,36158L,36159L,36160L,
+36161L,36162L,36163L,36164L,36165L,36166L,36167L,36168L,36169L,36170L,
+36171L,36172L,36173L,36174L,36175L,36176L,36177L,36178L,36179L,36180L,
+36181L,36182L,36183L,36184L,36185L,36186L,36187L,36188L,36189L,36190L,
+36191L,36192L,36193L,36194L,36195L,36196L,36197L,36198L,36199L,36200L,
+36201L,36202L,36203L,36204L,36205L,36206L,36207L,36208L,36209L,36210L,
+36211L,36212L,36213L,36214L,36215L,36216L,36217L,36218L,36219L,36220L,
+36221L,36222L,36223L,36224L,36225L,36226L,36227L,36228L,36229L,36230L,
+36231L,36232L,36233L,36234L,36235L,36236L,36237L,36238L,36239L,36240L,
+36241L,36242L,36243L,36244L,36245L,36246L,36247L,36248L,36249L,36250L,
+36251L,36252L,36253L,36254L,36255L,36256L,36257L,36258L,36259L,36260L,
+36261L,36262L,36263L,36264L,36265L,36266L,36267L,36268L,36269L,36270L,
+36271L,36272L,36273L,36274L,36275L,36276L,36277L,36278L,36279L,36280L,
+36281L,36282L,36283L,36284L,36285L,36286L,36287L,36288L,36289L,36290L,
+36291L,36292L,36293L,36294L,36295L,36296L,36297L,36298L,36299L,36300L,
+36301L,36302L,36303L,36304L,36305L,36306L,36307L,36308L,36309L,36310L,
+36311L,36312L,36313L,36314L,36315L,36316L,36317L,36318L,36319L,36320L,
+36321L,36322L,36323L,36324L,36325L,36326L,36327L,36328L,36329L,36330L,
+36331L,36332L,36333L,36334L,36335L,36336L,36337L,36338L,36339L,36340L,
+36341L,36342L,36343L,36344L,36345L,36346L,36347L,36348L,36349L,36350L,
+36351L,36352L,36353L,36354L,36355L,36356L,36357L,36358L,36359L,36360L,
+36361L,36362L,36363L,36364L,36365L,36366L,36367L,36368L,36369L,36370L,
+36371L,36372L,36373L,36374L,36375L,36376L,36377L,36378L,36379L,36380L,
+36381L,36382L,36383L,36384L,36385L,36386L,36387L,36388L,36389L,36390L,
+36391L,36392L,36393L,36394L,36395L,36396L,36397L,36398L,36399L,36400L,
+36401L,36402L,36403L,36404L,36405L,36406L,36407L,36408L,36409L,36410L,
+36411L,36412L,36413L,36414L,36415L,36416L,36417L,36418L,36419L,36420L,
+36421L,36422L,36423L,36424L,36425L,36426L,36427L,36428L,36429L,36430L,
+36431L,36432L,36433L,36434L,36435L,36436L,36437L,36438L,36439L,36440L,
+36441L,36442L,36443L,36444L,36445L,36446L,36447L,36448L,36449L,36450L,
+36451L,36452L,36453L,36454L,36455L,36456L,36457L,36458L,36459L,36460L,
+36461L,36462L,36463L,36464L,36465L,36466L,36467L,36468L,36469L,36470L,
+36471L,36472L,36473L,36474L,36475L,36476L,36477L,36478L,36479L,36480L,
+36481L,36482L,36483L,36484L,36485L,36486L,36487L,36488L,36489L,36490L,
+36491L,36492L,36493L,36494L,36495L,36496L,36497L,36498L,36499L,36500L,
+36501L,36502L,36503L,36504L,36505L,36506L,36507L,36508L,36509L,36510L,
+36511L,36512L,36513L,36514L,36515L,36516L,36517L,36518L,36519L,36520L,
+36521L,36522L,36523L,36524L,36525L,36526L,36527L,36528L,36529L,36530L,
+36531L,36532L,36533L,36534L,36535L,36536L,36537L,36538L,36539L,36540L,
+36541L,36542L,36543L,36544L,36545L,36546L,36547L,36548L,36549L,36550L,
+36551L,36552L,36553L,36554L,36555L,36556L,36557L,36558L,36559L,36560L,
+36561L,36562L,36563L,36564L,36565L,36566L,36567L,36568L,36569L,36570L,
+36571L,36572L,36573L,36574L,36575L,36576L,36577L,36578L,36579L,36580L,
+36581L,36582L,36583L,36584L,36585L,36586L,36587L,36588L,36589L,36590L,
+36591L,36592L,36593L,36594L,36595L,36596L,36597L,36598L,36599L,36600L,
+36601L,36602L,36603L,36604L,36605L,36606L,36607L,36608L,36609L,36610L,
+36611L,36612L,36613L,36614L,36615L,36616L,36617L,36618L,36619L,36620L,
+36621L,36622L,36623L,36624L,36625L,36626L,36627L,36628L,36629L,36630L,
+36631L,36632L,36633L,36634L,36635L,36636L,36637L,36638L,36639L,36640L,
+36641L,36642L,36643L,36644L,36645L,36646L,36647L,36648L,36649L,36650L,
+36651L,36652L,36653L,36654L,36655L,36656L,36657L,36658L,36659L,36660L,
+36661L,36662L,36663L,36664L,36665L,36666L,36667L,36668L,36669L,36670L,
+36671L,36672L,36673L,36674L,36675L,36676L,36677L,36678L,36679L,36680L,
+36681L,36682L,36683L,36684L,36685L,36686L,36687L,36688L,36689L,36690L,
+36691L,36692L,36693L,36694L,36695L,36696L,36697L,36698L,36699L,36700L,
+36701L,36702L,36703L,36704L,36705L,36706L,36707L,36708L,36709L,36710L,
+36711L,36712L,36713L,36714L,36715L,36716L,36717L,36718L,36719L,36720L,
+36721L,36722L,36723L,36724L,36725L,36726L,36727L,36728L,36729L,36730L,
+36731L,36732L,36733L,36734L,36735L,36736L,36737L,36738L,36739L,36740L,
+36741L,36742L,36743L,36744L,36745L,36746L,36747L,36748L,36749L,36750L,
+36751L,36752L,36753L,36754L,36755L,36756L,36757L,36758L,36759L,36760L,
+36761L,36762L,36763L,36764L,36765L,36766L,36767L,36768L,36769L,36770L,
+36771L,36772L,36773L,36774L,36775L,36776L,36777L,36778L,36779L,36780L,
+36781L,36782L,36783L,36784L,36785L,36786L,36787L,36788L,36789L,36790L,
+36791L,36792L,36793L,36794L,36795L,36796L,36797L,36798L,36799L,36800L,
+36801L,36802L,36803L,36804L,36805L,36806L,36807L,36808L,36809L,36810L,
+36811L,36812L,36813L,36814L,36815L,36816L,36817L,36818L,36819L,36820L,
+36821L,36822L,36823L,36824L,36825L,36826L,36827L,36828L,36829L,36830L,
+36831L,36832L,36833L,36834L,36835L,36836L,36837L,36838L,36839L,36840L,
+36841L,36842L,36843L,36844L,36845L,36846L,36847L,36848L,36849L,36850L,
+36851L,36852L,36853L,36854L,36855L,36856L,36857L,36858L,36859L,36860L,
+36861L,36862L,36863L,36864L,36865L,36866L,36867L,36868L,36869L,36870L,
+36871L,36872L,36873L,36874L,36875L,36876L,36877L,36878L,36879L,36880L,
+36881L,36882L,36883L,36884L,36885L,36886L,36887L,36888L,36889L,36890L,
+36891L,36892L,36893L,36894L,36895L,36896L,36897L,36898L,36899L,36900L,
+36901L,36902L,36903L,36904L,36905L,36906L,36907L,36908L,36909L,36910L,
+36911L,36912L,36913L,36914L,36915L,36916L,36917L,36918L,36919L,36920L,
+36921L,36922L,36923L,36924L,36925L,36926L,36927L,36928L,36929L,36930L,
+36931L,36932L,36933L,36934L,36935L,36936L,36937L,36938L,36939L,36940L,
+36941L,36942L,36943L,36944L,36945L,36946L,36947L,36948L,36949L,36950L,
+36951L,36952L,36953L,36954L,36955L,36956L,36957L,36958L,36959L,36960L,
+36961L,36962L,36963L,36964L,36965L,36966L,36967L,36968L,36969L,36970L,
+36971L,36972L,36973L,36974L,36975L,36976L,36977L,36978L,36979L,36980L,
+36981L,36982L,36983L,36984L,36985L,36986L,36987L,36988L,36989L,36990L,
+36991L,36992L,36993L,36994L,36995L,36996L,36997L,36998L,36999L,37000L,
+37001L,37002L,37003L,37004L,37005L,37006L,37007L,37008L,37009L,37010L,
+37011L,37012L,37013L,37014L,37015L,37016L,37017L,37018L,37019L,37020L,
+37021L,37022L,37023L,37024L,37025L,37026L,37027L,37028L,37029L,37030L,
+37031L,37032L,37033L,37034L,37035L,37036L,37037L,37038L,37039L,37040L,
+37041L,37042L,37043L,37044L,37045L,37046L,37047L,37048L,37049L,37050L,
+37051L,37052L,37053L,37054L,37055L,37056L,37057L,37058L,37059L,37060L,
+37061L,37062L,37063L,37064L,37065L,37066L,37067L,37068L,37069L,37070L,
+37071L,37072L,37073L,37074L,37075L,37076L,37077L,37078L,37079L,37080L,
+37081L,37082L,37083L,37084L,37085L,37086L,37087L,37088L,37089L,37090L,
+37091L,37092L,37093L,37094L,37095L,37096L,37097L,37098L,37099L,37100L,
+37101L,37102L,37103L,37104L,37105L,37106L,37107L,37108L,37109L,37110L,
+37111L,37112L,37113L,37114L,37115L,37116L,37117L,37118L,37119L,37120L,
+37121L,37122L,37123L,37124L,37125L,37126L,37127L,37128L,37129L,37130L,
+37131L,37132L,37133L,37134L,37135L,37136L,37137L,37138L,37139L,37140L,
+37141L,37142L,37143L,37144L,37145L,37146L,37147L,37148L,37149L,37150L,
+37151L,37152L,37153L,37154L,37155L,37156L,37157L,37158L,37159L,37160L,
+37161L,37162L,37163L,37164L,37165L,37166L,37167L,37168L,37169L,37170L,
+37171L,37172L,37173L,37174L,37175L,37176L,37177L,37178L,37179L,37180L,
+37181L,37182L,37183L,37184L,37185L,37186L,37187L,37188L,37189L,37190L,
+37191L,37192L,37193L,37194L,37195L,37196L,37197L,37198L,37199L,37200L,
+37201L,37202L,37203L,37204L,37205L,37206L,37207L,37208L,37209L,37210L,
+37211L,37212L,37213L,37214L,37215L,37216L,37217L,37218L,37219L,37220L,
+37221L,37222L,37223L,37224L,37225L,37226L,37227L,37228L,37229L,37230L,
+37231L,37232L,37233L,37234L,37235L,37236L,37237L,37238L,37239L,37240L,
+37241L,37242L,37243L,37244L,37245L,37246L,37247L,37248L,37249L,37250L,
+37251L,37252L,37253L,37254L,37255L,37256L,37257L,37258L,37259L,37260L,
+37261L,37262L,37263L,37264L,37265L,37266L,37267L,37268L,37269L,37270L,
+37271L,37272L,37273L,37274L,37275L,37276L,37277L,37278L,37279L,37280L,
+37281L,37282L,37283L,37284L,37285L,37286L,37287L,37288L,37289L,37290L,
+37291L,37292L,37293L,37294L,37295L,37296L,37297L,37298L,37299L,37300L,
+37301L,37302L,37303L,37304L,37305L,37306L,37307L,37308L,37309L,37310L,
+37311L,37312L,37313L,37314L,37315L,37316L,37317L,37318L,37319L,37320L,
+37321L,37322L,37323L,37324L,37325L,37326L,37327L,37328L,37329L,37330L,
+37331L,37332L,37333L,37334L,37335L,37336L,37337L,37338L,37339L,37340L,
+37341L,37342L,37343L,37344L,37345L,37346L,37347L,37348L,37349L,37350L,
+37351L,37352L,37353L,37354L,37355L,37356L,37357L,37358L,37359L,37360L,
+37361L,37362L,37363L,37364L,37365L,37366L,37367L,37368L,37369L,37370L,
+37371L,37372L,37373L,37374L,37375L,37376L,37377L,37378L,37379L,37380L,
+37381L,37382L,37383L,37384L,37385L,37386L,37387L,37388L,37389L,37390L,
+37391L,37392L,37393L,37394L,37395L,37396L,37397L,37398L,37399L,37400L,
+37401L,37402L,37403L,37404L,37405L,37406L,37407L,37408L,37409L,37410L,
+37411L,37412L,37413L,37414L,37415L,37416L,37417L,37418L,37419L,37420L,
+37421L,37422L,37423L,37424L,37425L,37426L,37427L,37428L,37429L,37430L,
+37431L,37432L,37433L,37434L,37435L,37436L,37437L,37438L,37439L,37440L,
+37441L,37442L,37443L,37444L,37445L,37446L,37447L,37448L,37449L,37450L,
+37451L,37452L,37453L,37454L,37455L,37456L,37457L,37458L,37459L,37460L,
+37461L,37462L,37463L,37464L,37465L,37466L,37467L,37468L,37469L,37470L,
+37471L,37472L,37473L,37474L,37475L,37476L,37477L,37478L,37479L,37480L,
+37481L,37482L,37483L,37484L,37485L,37486L,37487L,37488L,37489L,37490L,
+37491L,37492L,37493L,37494L,37495L,37496L,37497L,37498L,37499L,37500L,
+37501L,37502L,37503L,37504L,37505L,37506L,37507L,37508L,37509L,37510L,
+37511L,37512L,37513L,37514L,37515L,37516L,37517L,37518L,37519L,37520L,
+37521L,37522L,37523L,37524L,37525L,37526L,37527L,37528L,37529L,37530L,
+37531L,37532L,37533L,37534L,37535L,37536L,37537L,37538L,37539L,37540L,
+37541L,37542L,37543L,37544L,37545L,37546L,37547L,37548L,37549L,37550L,
+37551L,37552L,37553L,37554L,37555L,37556L,37557L,37558L,37559L,37560L,
+37561L,37562L,37563L,37564L,37565L,37566L,37567L,37568L,37569L,37570L,
+37571L,37572L,37573L,37574L,37575L,37576L,37577L,37578L,37579L,37580L,
+37581L,37582L,37583L,37584L,37585L,37586L,37587L,37588L,37589L,37590L,
+37591L,37592L,37593L,37594L,37595L,37596L,37597L,37598L,37599L,37600L,
+37601L,37602L,37603L,37604L,37605L,37606L,37607L,37608L,37609L,37610L,
+37611L,37612L,37613L,37614L,37615L,37616L,37617L,37618L,37619L,37620L,
+37621L,37622L,37623L,37624L,37625L,37626L,37627L,37628L,37629L,37630L,
+37631L,37632L,37633L,37634L,37635L,37636L,37637L,37638L,37639L,37640L,
+37641L,37642L,37643L,37644L,37645L,37646L,37647L,37648L,37649L,37650L,
+37651L,37652L,37653L,37654L,37655L,37656L,37657L,37658L,37659L,37660L,
+37661L,37662L,37663L,37664L,37665L,37666L,37667L,37668L,37669L,37670L,
+37671L,37672L,37673L,37674L,37675L,37676L,37677L,37678L,37679L,37680L,
+37681L,37682L,37683L,37684L,37685L,37686L,37687L,37688L,37689L,37690L,
+37691L,37692L,37693L,37694L,37695L,37696L,37697L,37698L,37699L,37700L,
+37701L,37702L,37703L,37704L,37705L,37706L,37707L,37708L,37709L,37710L,
+37711L,37712L,37713L,37714L,37715L,37716L,37717L,37718L,37719L,37720L,
+37721L,37722L,37723L,37724L,37725L,37726L,37727L,37728L,37729L,37730L,
+37731L,37732L,37733L,37734L,37735L,37736L,37737L,37738L,37739L,37740L,
+37741L,37742L,37743L,37744L,37745L,37746L,37747L,37748L,37749L,37750L,
+37751L,37752L,37753L,37754L,37755L,37756L,37757L,37758L,37759L,37760L,
+37761L,37762L,37763L,37764L,37765L,37766L,37767L,37768L,37769L,37770L,
+37771L,37772L,37773L,37774L,37775L,37776L,37777L,37778L,37779L,37780L,
+37781L,37782L,37783L,37784L,37785L,37786L,37787L,37788L,37789L,37790L,
+37791L,37792L,37793L,37794L,37795L,37796L,37797L,37798L,37799L,37800L,
+37801L,37802L,37803L,37804L,37805L,37806L,37807L,37808L,37809L,37810L,
+37811L,37812L,37813L,37814L,37815L,37816L,37817L,37818L,37819L,37820L,
+37821L,37822L,37823L,37824L,37825L,37826L,37827L,37828L,37829L,37830L,
+37831L,37832L,37833L,37834L,37835L,37836L,37837L,37838L,37839L,37840L,
+37841L,37842L,37843L,37844L,37845L,37846L,37847L,37848L,37849L,37850L,
+37851L,37852L,37853L,37854L,37855L,37856L,37857L,37858L,37859L,37860L,
+37861L,37862L,37863L,37864L,37865L,37866L,37867L,37868L,37869L,37870L,
+37871L,37872L,37873L,37874L,37875L,37876L,37877L,37878L,37879L,37880L,
+37881L,37882L,37883L,37884L,37885L,37886L,37887L,37888L,37889L,37890L,
+37891L,37892L,37893L,37894L,37895L,37896L,37897L,37898L,37899L,37900L,
+37901L,37902L,37903L,37904L,37905L,37906L,37907L,37908L,37909L,37910L,
+37911L,37912L,37913L,37914L,37915L,37916L,37917L,37918L,37919L,37920L,
+37921L,37922L,37923L,37924L,37925L,37926L,37927L,37928L,37929L,37930L,
+37931L,37932L,37933L,37934L,37935L,37936L,37937L,37938L,37939L,37940L,
+37941L,37942L,37943L,37944L,37945L,37946L,37947L,37948L,37949L,37950L,
+37951L,37952L,37953L,37954L,37955L,37956L,37957L,37958L,37959L,37960L,
+37961L,37962L,37963L,37964L,37965L,37966L,37967L,37968L,37969L,37970L,
+37971L,37972L,37973L,37974L,37975L,37976L,37977L,37978L,37979L,37980L,
+37981L,37982L,37983L,37984L,37985L,37986L,37987L,37988L,37989L,37990L,
+37991L,37992L,37993L,37994L,37995L,37996L,37997L,37998L,37999L,38000L,
+38001L,38002L,38003L,38004L,38005L,38006L,38007L,38008L,38009L,38010L,
+38011L,38012L,38013L,38014L,38015L,38016L,38017L,38018L,38019L,38020L,
+38021L,38022L,38023L,38024L,38025L,38026L,38027L,38028L,38029L,38030L,
+38031L,38032L,38033L,38034L,38035L,38036L,38037L,38038L,38039L,38040L,
+38041L,38042L,38043L,38044L,38045L,38046L,38047L,38048L,38049L,38050L,
+38051L,38052L,38053L,38054L,38055L,38056L,38057L,38058L,38059L,38060L,
+38061L,38062L,38063L,38064L,38065L,38066L,38067L,38068L,38069L,38070L,
+38071L,38072L,38073L,38074L,38075L,38076L,38077L,38078L,38079L,38080L,
+38081L,38082L,38083L,38084L,38085L,38086L,38087L,38088L,38089L,38090L,
+38091L,38092L,38093L,38094L,38095L,38096L,38097L,38098L,38099L,38100L,
+38101L,38102L,38103L,38104L,38105L,38106L,38107L,38108L,38109L,38110L,
+38111L,38112L,38113L,38114L,38115L,38116L,38117L,38118L,38119L,38120L,
+38121L,38122L,38123L,38124L,38125L,38126L,38127L,38128L,38129L,38130L,
+38131L,38132L,38133L,38134L,38135L,38136L,38137L,38138L,38139L,38140L,
+38141L,38142L,38143L,38144L,38145L,38146L,38147L,38148L,38149L,38150L,
+38151L,38152L,38153L,38154L,38155L,38156L,38157L,38158L,38159L,38160L,
+38161L,38162L,38163L,38164L,38165L,38166L,38167L,38168L,38169L,38170L,
+38171L,38172L,38173L,38174L,38175L,38176L,38177L,38178L,38179L,38180L,
+38181L,38182L,38183L,38184L,38185L,38186L,38187L,38188L,38189L,38190L,
+38191L,38192L,38193L,38194L,38195L,38196L,38197L,38198L,38199L,38200L,
+38201L,38202L,38203L,38204L,38205L,38206L,38207L,38208L,38209L,38210L,
+38211L,38212L,38213L,38214L,38215L,38216L,38217L,38218L,38219L,38220L,
+38221L,38222L,38223L,38224L,38225L,38226L,38227L,38228L,38229L,38230L,
+38231L,38232L,38233L,38234L,38235L,38236L,38237L,38238L,38239L,38240L,
+38241L,38242L,38243L,38244L,38245L,38246L,38247L,38248L,38249L,38250L,
+38251L,38252L,38253L,38254L,38255L,38256L,38257L,38258L,38259L,38260L,
+38261L,38262L,38263L,38264L,38265L,38266L,38267L,38268L,38269L,38270L,
+38271L,38272L,38273L,38274L,38275L,38276L,38277L,38278L,38279L,38280L,
+38281L,38282L,38283L,38284L,38285L,38286L,38287L,38288L,38289L,38290L,
+38291L,38292L,38293L,38294L,38295L,38296L,38297L,38298L,38299L,38300L,
+38301L,38302L,38303L,38304L,38305L,38306L,38307L,38308L,38309L,38310L,
+38311L,38312L,38313L,38314L,38315L,38316L,38317L,38318L,38319L,38320L,
+38321L,38322L,38323L,38324L,38325L,38326L,38327L,38328L,38329L,38330L,
+38331L,38332L,38333L,38334L,38335L,38336L,38337L,38338L,38339L,38340L,
+38341L,38342L,38343L,38344L,38345L,38346L,38347L,38348L,38349L,38350L,
+38351L,38352L,38353L,38354L,38355L,38356L,38357L,38358L,38359L,38360L,
+38361L,38362L,38363L,38364L,38365L,38366L,38367L,38368L,38369L,38370L,
+38371L,38372L,38373L,38374L,38375L,38376L,38377L,38378L,38379L,38380L,
+38381L,38382L,38383L,38384L,38385L,38386L,38387L,38388L,38389L,38390L,
+38391L,38392L,38393L,38394L,38395L,38396L,38397L,38398L,38399L,38400L,
+38401L,38402L,38403L,38404L,38405L,38406L,38407L,38408L,38409L,38410L,
+38411L,38412L,38413L,38414L,38415L,38416L,38417L,38418L,38419L,38420L,
+38421L,38422L,38423L,38424L,38425L,38426L,38427L,38428L,38429L,38430L,
+38431L,38432L,38433L,38434L,38435L,38436L,38437L,38438L,38439L,38440L,
+38441L,38442L,38443L,38444L,38445L,38446L,38447L,38448L,38449L,38450L,
+38451L,38452L,38453L,38454L,38455L,38456L,38457L,38458L,38459L,38460L,
+38461L,38462L,38463L,38464L,38465L,38466L,38467L,38468L,38469L,38470L,
+38471L,38472L,38473L,38474L,38475L,38476L,38477L,38478L,38479L,38480L,
+38481L,38482L,38483L,38484L,38485L,38486L,38487L,38488L,38489L,38490L,
+38491L,38492L,38493L,38494L,38495L,38496L,38497L,38498L,38499L,38500L,
+38501L,38502L,38503L,38504L,38505L,38506L,38507L,38508L,38509L,38510L,
+38511L,38512L,38513L,38514L,38515L,38516L,38517L,38518L,38519L,38520L,
+38521L,38522L,38523L,38524L,38525L,38526L,38527L,38528L,38529L,38530L,
+38531L,38532L,38533L,38534L,38535L,38536L,38537L,38538L,38539L,38540L,
+38541L,38542L,38543L,38544L,38545L,38546L,38547L,38548L,38549L,38550L,
+38551L,38552L,38553L,38554L,38555L,38556L,38557L,38558L,38559L,38560L,
+38561L,38562L,38563L,38564L,38565L,38566L,38567L,38568L,38569L,38570L,
+38571L,38572L,38573L,38574L,38575L,38576L,38577L,38578L,38579L,38580L,
+38581L,38582L,38583L,38584L,38585L,38586L,38587L,38588L,38589L,38590L,
+38591L,38592L,38593L,38594L,38595L,38596L,38597L,38598L,38599L,38600L,
+38601L,38602L,38603L,38604L,38605L,38606L,38607L,38608L,38609L,38610L,
+38611L,38612L,38613L,38614L,38615L,38616L,38617L,38618L,38619L,38620L,
+38621L,38622L,38623L,38624L,38625L,38626L,38627L,38628L,38629L,38630L,
+38631L,38632L,38633L,38634L,38635L,38636L,38637L,38638L,38639L,38640L,
+38641L,38642L,38643L,38644L,38645L,38646L,38647L,38648L,38649L,38650L,
+38651L,38652L,38653L,38654L,38655L,38656L,38657L,38658L,38659L,38660L,
+38661L,38662L,38663L,38664L,38665L,38666L,38667L,38668L,38669L,38670L,
+38671L,38672L,38673L,38674L,38675L,38676L,38677L,38678L,38679L,38680L,
+38681L,38682L,38683L,38684L,38685L,38686L,38687L,38688L,38689L,38690L,
+38691L,38692L,38693L,38694L,38695L,38696L,38697L,38698L,38699L,38700L,
+38701L,38702L,38703L,38704L,38705L,38706L,38707L,38708L,38709L,38710L,
+38711L,38712L,38713L,38714L,38715L,38716L,38717L,38718L,38719L,38720L,
+38721L,38722L,38723L,38724L,38725L,38726L,38727L,38728L,38729L,38730L,
+38731L,38732L,38733L,38734L,38735L,38736L,38737L,38738L,38739L,38740L,
+38741L,38742L,38743L,38744L,38745L,38746L,38747L,38748L,38749L,38750L,
+38751L,38752L,38753L,38754L,38755L,38756L,38757L,38758L,38759L,38760L,
+38761L,38762L,38763L,38764L,38765L,38766L,38767L,38768L,38769L,38770L,
+38771L,38772L,38773L,38774L,38775L,38776L,38777L,38778L,38779L,38780L,
+38781L,38782L,38783L,38784L,38785L,38786L,38787L,38788L,38789L,38790L,
+38791L,38792L,38793L,38794L,38795L,38796L,38797L,38798L,38799L,38800L,
+38801L,38802L,38803L,38804L,38805L,38806L,38807L,38808L,38809L,38810L,
+38811L,38812L,38813L,38814L,38815L,38816L,38817L,38818L,38819L,38820L,
+38821L,38822L,38823L,38824L,38825L,38826L,38827L,38828L,38829L,38830L,
+38831L,38832L,38833L,38834L,38835L,38836L,38837L,38838L,38839L,38840L,
+38841L,38842L,38843L,38844L,38845L,38846L,38847L,38848L,38849L,38850L,
+38851L,38852L,38853L,38854L,38855L,38856L,38857L,38858L,38859L,38860L,
+38861L,38862L,38863L,38864L,38865L,38866L,38867L,38868L,38869L,38870L,
+38871L,38872L,38873L,38874L,38875L,38876L,38877L,38878L,38879L,38880L,
+38881L,38882L,38883L,38884L,38885L,38886L,38887L,38888L,38889L,38890L,
+38891L,38892L,38893L,38894L,38895L,38896L,38897L,38898L,38899L,38900L,
+38901L,38902L,38903L,38904L,38905L,38906L,38907L,38908L,38909L,38910L,
+38911L,38912L,38913L,38914L,38915L,38916L,38917L,38918L,38919L,38920L,
+38921L,38922L,38923L,38924L,38925L,38926L,38927L,38928L,38929L,38930L,
+38931L,38932L,38933L,38934L,38935L,38936L,38937L,38938L,38939L,38940L,
+38941L,38942L,38943L,38944L,38945L,38946L,38947L,38948L,38949L,38950L,
+38951L,38952L,38953L,38954L,38955L,38956L,38957L,38958L,38959L,38960L,
+38961L,38962L,38963L,38964L,38965L,38966L,38967L,38968L,38969L,38970L,
+38971L,38972L,38973L,38974L,38975L,38976L,38977L,38978L,38979L,38980L,
+38981L,38982L,38983L,38984L,38985L,38986L,38987L,38988L,38989L,38990L,
+38991L,38992L,38993L,38994L,38995L,38996L,38997L,38998L,38999L,39000L,
+39001L,39002L,39003L,39004L,39005L,39006L,39007L,39008L,39009L,39010L,
+39011L,39012L,39013L,39014L,39015L,39016L,39017L,39018L,39019L,39020L,
+39021L,39022L,39023L,39024L,39025L,39026L,39027L,39028L,39029L,39030L,
+39031L,39032L,39033L,39034L,39035L,39036L,39037L,39038L,39039L,39040L,
+39041L,39042L,39043L,39044L,39045L,39046L,39047L,39048L,39049L,39050L,
+39051L,39052L,39053L,39054L,39055L,39056L,39057L,39058L,39059L,39060L,
+39061L,39062L,39063L,39064L,39065L,39066L,39067L,39068L,39069L,39070L,
+39071L,39072L,39073L,39074L,39075L,39076L,39077L,39078L,39079L,39080L,
+39081L,39082L,39083L,39084L,39085L,39086L,39087L,39088L,39089L,39090L,
+39091L,39092L,39093L,39094L,39095L,39096L,39097L,39098L,39099L,39100L,
+39101L,39102L,39103L,39104L,39105L,39106L,39107L,39108L,39109L,39110L,
+39111L,39112L,39113L,39114L,39115L,39116L,39117L,39118L,39119L,39120L,
+39121L,39122L,39123L,39124L,39125L,39126L,39127L,39128L,39129L,39130L,
+39131L,39132L,39133L,39134L,39135L,39136L,39137L,39138L,39139L,39140L,
+39141L,39142L,39143L,39144L,39145L,39146L,39147L,39148L,39149L,39150L,
+39151L,39152L,39153L,39154L,39155L,39156L,39157L,39158L,39159L,39160L,
+39161L,39162L,39163L,39164L,39165L,39166L,39167L,39168L,39169L,39170L,
+39171L,39172L,39173L,39174L,39175L,39176L,39177L,39178L,39179L,39180L,
+39181L,39182L,39183L,39184L,39185L,39186L,39187L,39188L,39189L,39190L,
+39191L,39192L,39193L,39194L,39195L,39196L,39197L,39198L,39199L,39200L,
+39201L,39202L,39203L,39204L,39205L,39206L,39207L,39208L,39209L,39210L,
+39211L,39212L,39213L,39214L,39215L,39216L,39217L,39218L,39219L,39220L,
+39221L,39222L,39223L,39224L,39225L,39226L,39227L,39228L,39229L,39230L,
+39231L,39232L,39233L,39234L,39235L,39236L,39237L,39238L,39239L,39240L,
+39241L,39242L,39243L,39244L,39245L,39246L,39247L,39248L,39249L,39250L,
+39251L,39252L,39253L,39254L,39255L,39256L,39257L,39258L,39259L,39260L,
+39261L,39262L,39263L,39264L,39265L,39266L,39267L,39268L,39269L,39270L,
+39271L,39272L,39273L,39274L,39275L,39276L,39277L,39278L,39279L,39280L,
+39281L,39282L,39283L,39284L,39285L,39286L,39287L,39288L,39289L,39290L,
+39291L,39292L,39293L,39294L,39295L,39296L,39297L,39298L,39299L,39300L,
+39301L,39302L,39303L,39304L,39305L,39306L,39307L,39308L,39309L,39310L,
+39311L,39312L,39313L,39314L,39315L,39316L,39317L,39318L,39319L,39320L,
+39321L,39322L,39323L,39324L,39325L,39326L,39327L,39328L,39329L,39330L,
+39331L,39332L,39333L,39334L,39335L,39336L,39337L,39338L,39339L,39340L,
+39341L,39342L,39343L,39344L,39345L,39346L,39347L,39348L,39349L,39350L,
+39351L,39352L,39353L,39354L,39355L,39356L,39357L,39358L,39359L,39360L,
+39361L,39362L,39363L,39364L,39365L,39366L,39367L,39368L,39369L,39370L,
+39371L,39372L,39373L,39374L,39375L,39376L,39377L,39378L,39379L,39380L,
+39381L,39382L,39383L,39384L,39385L,39386L,39387L,39388L,39389L,39390L,
+39391L,39392L,39393L,39394L,39395L,39396L,39397L,39398L,39399L,39400L,
+39401L,39402L,39403L,39404L,39405L,39406L,39407L,39408L,39409L,39410L,
+39411L,39412L,39413L,39414L,39415L,39416L,39417L,39418L,39419L,39420L,
+39421L,39422L,39423L,39424L,39425L,39426L,39427L,39428L,39429L,39430L,
+39431L,39432L,39433L,39434L,39435L,39436L,39437L,39438L,39439L,39440L,
+39441L,39442L,39443L,39444L,39445L,39446L,39447L,39448L,39449L,39450L,
+39451L,39452L,39453L,39454L,39455L,39456L,39457L,39458L,39459L,39460L,
+39461L,39462L,39463L,39464L,39465L,39466L,39467L,39468L,39469L,39470L,
+39471L,39472L,39473L,39474L,39475L,39476L,39477L,39478L,39479L,39480L,
+39481L,39482L,39483L,39484L,39485L,39486L,39487L,39488L,39489L,39490L,
+39491L,39492L,39493L,39494L,39495L,39496L,39497L,39498L,39499L,39500L,
+39501L,39502L,39503L,39504L,39505L,39506L,39507L,39508L,39509L,39510L,
+39511L,39512L,39513L,39514L,39515L,39516L,39517L,39518L,39519L,39520L,
+39521L,39522L,39523L,39524L,39525L,39526L,39527L,39528L,39529L,39530L,
+39531L,39532L,39533L,39534L,39535L,39536L,39537L,39538L,39539L,39540L,
+39541L,39542L,39543L,39544L,39545L,39546L,39547L,39548L,39549L,39550L,
+39551L,39552L,39553L,39554L,39555L,39556L,39557L,39558L,39559L,39560L,
+39561L,39562L,39563L,39564L,39565L,39566L,39567L,39568L,39569L,39570L,
+39571L,39572L,39573L,39574L,39575L,39576L,39577L,39578L,39579L,39580L,
+39581L,39582L,39583L,39584L,39585L,39586L,39587L,39588L,39589L,39590L,
+39591L,39592L,39593L,39594L,39595L,39596L,39597L,39598L,39599L,39600L,
+39601L,39602L,39603L,39604L,39605L,39606L,39607L,39608L,39609L,39610L,
+39611L,39612L,39613L,39614L,39615L,39616L,39617L,39618L,39619L,39620L,
+39621L,39622L,39623L,39624L,39625L,39626L,39627L,39628L,39629L,39630L,
+39631L,39632L,39633L,39634L,39635L,39636L,39637L,39638L,39639L,39640L,
+39641L,39642L,39643L,39644L,39645L,39646L,39647L,39648L,39649L,39650L,
+39651L,39652L,39653L,39654L,39655L,39656L,39657L,39658L,39659L,39660L,
+39661L,39662L,39663L,39664L,39665L,39666L,39667L,39668L,39669L,39670L,
+39671L,39672L,39673L,39674L,39675L,39676L,39677L,39678L,39679L,39680L,
+39681L,39682L,39683L,39684L,39685L,39686L,39687L,39688L,39689L,39690L,
+39691L,39692L,39693L,39694L,39695L,39696L,39697L,39698L,39699L,39700L,
+39701L,39702L,39703L,39704L,39705L,39706L,39707L,39708L,39709L,39710L,
+39711L,39712L,39713L,39714L,39715L,39716L,39717L,39718L,39719L,39720L,
+39721L,39722L,39723L,39724L,39725L,39726L,39727L,39728L,39729L,39730L,
+39731L,39732L,39733L,39734L,39735L,39736L,39737L,39738L,39739L,39740L,
+39741L,39742L,39743L,39744L,39745L,39746L,39747L,39748L,39749L,39750L,
+39751L,39752L,39753L,39754L,39755L,39756L,39757L,39758L,39759L,39760L,
+39761L,39762L,39763L,39764L,39765L,39766L,39767L,39768L,39769L,39770L,
+39771L,39772L,39773L,39774L,39775L,39776L,39777L,39778L,39779L,39780L,
+39781L,39782L,39783L,39784L,39785L,39786L,39787L,39788L,39789L,39790L,
+39791L,39792L,39793L,39794L,39795L,39796L,39797L,39798L,39799L,39800L,
+39801L,39802L,39803L,39804L,39805L,39806L,39807L,39808L,39809L,39810L,
+39811L,39812L,39813L,39814L,39815L,39816L,39817L,39818L,39819L,39820L,
+39821L,39822L,39823L,39824L,39825L,39826L,39827L,39828L,39829L,39830L,
+39831L,39832L,39833L,39834L,39835L,39836L,39837L,39838L,39839L,39840L,
+39841L,39842L,39843L,39844L,39845L,39846L,39847L,39848L,39849L,39850L,
+39851L,39852L,39853L,39854L,39855L,39856L,39857L,39858L,39859L,39860L,
+39861L,39862L,39863L,39864L,39865L,39866L,39867L,39868L,39869L,39870L,
+39871L,39872L,39873L,39874L,39875L,39876L,39877L,39878L,39879L,39880L,
+39881L,39882L,39883L,39884L,39885L,39886L,39887L,39888L,39889L,39890L,
+39891L,39892L,39893L,39894L,39895L,39896L,39897L,39898L,39899L,39900L,
+39901L,39902L,39903L,39904L,39905L,39906L,39907L,39908L,39909L,39910L,
+39911L,39912L,39913L,39914L,39915L,39916L,39917L,39918L,39919L,39920L,
+39921L,39922L,39923L,39924L,39925L,39926L,39927L,39928L,39929L,39930L,
+39931L,39932L,39933L,39934L,39935L,39936L,39937L,39938L,39939L,39940L,
+39941L,39942L,39943L,39944L,39945L,39946L,39947L,39948L,39949L,39950L,
+39951L,39952L,39953L,39954L,39955L,39956L,39957L,39958L,39959L,39960L,
+39961L,39962L,39963L,39964L,39965L,39966L,39967L,39968L,39969L,39970L,
+39971L,39972L,39973L,39974L,39975L,39976L,39977L,39978L,39979L,39980L,
+39981L,39982L,39983L,39984L,39985L,39986L,39987L,39988L,39989L,39990L,
+39991L,39992L,39993L,39994L,39995L,39996L,39997L,39998L,39999L,40000L,
+40001L,40002L,40003L,40004L,40005L,40006L,40007L,40008L,40009L,40010L,
+40011L,40012L,40013L,40014L,40015L,40016L,40017L,40018L,40019L,40020L,
+40021L,40022L,40023L,40024L,40025L,40026L,40027L,40028L,40029L,40030L,
+40031L,40032L,40033L,40034L,40035L,40036L,40037L,40038L,40039L,40040L,
+40041L,40042L,40043L,40044L,40045L,40046L,40047L,40048L,40049L,40050L,
+40051L,40052L,40053L,40054L,40055L,40056L,40057L,40058L,40059L,40060L,
+40061L,40062L,40063L,40064L,40065L,40066L,40067L,40068L,40069L,40070L,
+40071L,40072L,40073L,40074L,40075L,40076L,40077L,40078L,40079L,40080L,
+40081L,40082L,40083L,40084L,40085L,40086L,40087L,40088L,40089L,40090L,
+40091L,40092L,40093L,40094L,40095L,40096L,40097L,40098L,40099L,40100L,
+40101L,40102L,40103L,40104L,40105L,40106L,40107L,40108L,40109L,40110L,
+40111L,40112L,40113L,40114L,40115L,40116L,40117L,40118L,40119L,40120L,
+40121L,40122L,40123L,40124L,40125L,40126L,40127L,40128L,40129L,40130L,
+40131L,40132L,40133L,40134L,40135L,40136L,40137L,40138L,40139L,40140L,
+40141L,40142L,40143L,40144L,40145L,40146L,40147L,40148L,40149L,40150L,
+40151L,40152L,40153L,40154L,40155L,40156L,40157L,40158L,40159L,40160L,
+40161L,40162L,40163L,40164L,40165L,40166L,40167L,40168L,40169L,40170L,
+40171L,40172L,40173L,40174L,40175L,40176L,40177L,40178L,40179L,40180L,
+40181L,40182L,40183L,40184L,40185L,40186L,40187L,40188L,40189L,40190L,
+40191L,40192L,40193L,40194L,40195L,40196L,40197L,40198L,40199L,40200L,
+40201L,40202L,40203L,40204L,40205L,40206L,40207L,40208L,40209L,40210L,
+40211L,40212L,40213L,40214L,40215L,40216L,40217L,40218L,40219L,40220L,
+40221L,40222L,40223L,40224L,40225L,40226L,40227L,40228L,40229L,40230L,
+40231L,40232L,40233L,40234L,40235L,40236L,40237L,40238L,40239L,40240L,
+40241L,40242L,40243L,40244L,40245L,40246L,40247L,40248L,40249L,40250L,
+40251L,40252L,40253L,40254L,40255L,40256L,40257L,40258L,40259L,40260L,
+40261L,40262L,40263L,40264L,40265L,40266L,40267L,40268L,40269L,40270L,
+40271L,40272L,40273L,40274L,40275L,40276L,40277L,40278L,40279L,40280L,
+40281L,40282L,40283L,40284L,40285L,40286L,40287L,40288L,40289L,40290L,
+40291L,40292L,40293L,40294L,40295L,40296L,40297L,40298L,40299L,40300L,
+40301L,40302L,40303L,40304L,40305L,40306L,40307L,40308L,40309L,40310L,
+40311L,40312L,40313L,40314L,40315L,40316L,40317L,40318L,40319L,40320L,
+40321L,40322L,40323L,40324L,40325L,40326L,40327L,40328L,40329L,40330L,
+40331L,40332L,40333L,40334L,40335L,40336L,40337L,40338L,40339L,40340L,
+40341L,40342L,40343L,40344L,40345L,40346L,40347L,40348L,40349L,40350L,
+40351L,40352L,40353L,40354L,40355L,40356L,40357L,40358L,40359L,40360L,
+40361L,40362L,40363L,40364L,40365L,40366L,40367L,40368L,40369L,40370L,
+40371L,40372L,40373L,40374L,40375L,40376L,40377L,40378L,40379L,40380L,
+40381L,40382L,40383L,40384L,40385L,40386L,40387L,40388L,40389L,40390L,
+40391L,40392L,40393L,40394L,40395L,40396L,40397L,40398L,40399L,40400L,
+40401L,40402L,40403L,40404L,40405L,40406L,40407L,40408L,40409L,40410L,
+40411L,40412L,40413L,40414L,40415L,40416L,40417L,40418L,40419L,40420L,
+40421L,40422L,40423L,40424L,40425L,40426L,40427L,40428L,40429L,40430L,
+40431L,40432L,40433L,40434L,40435L,40436L,40437L,40438L,40439L,40440L,
+40441L,40442L,40443L,40444L,40445L,40446L,40447L,40448L,40449L,40450L,
+40451L,40452L,40453L,40454L,40455L,40456L,40457L,40458L,40459L,40460L,
+40461L,40462L,40463L,40464L,40465L,40466L,40467L,40468L,40469L,40470L,
+40471L,40472L,40473L,40474L,40475L,40476L,40477L,40478L,40479L,40480L,
+40481L,40482L,40483L,40484L,40485L,40486L,40487L,40488L,40489L,40490L,
+40491L,40492L,40493L,40494L,40495L,40496L,40497L,40498L,40499L,40500L,
+40501L,40502L,40503L,40504L,40505L,40506L,40507L,40508L,40509L,40510L,
+40511L,40512L,40513L,40514L,40515L,40516L,40517L,40518L,40519L,40520L,
+40521L,40522L,40523L,40524L,40525L,40526L,40527L,40528L,40529L,40530L,
+40531L,40532L,40533L,40534L,40535L,40536L,40537L,40538L,40539L,40540L,
+40541L,40542L,40543L,40544L,40545L,40546L,40547L,40548L,40549L,40550L,
+40551L,40552L,40553L,40554L,40555L,40556L,40557L,40558L,40559L,40560L,
+40561L,40562L,40563L,40564L,40565L,40566L,40567L,40568L,40569L,40570L,
+40571L,40572L,40573L,40574L,40575L,40576L,40577L,40578L,40579L,40580L,
+40581L,40582L,40583L,40584L,40585L,40586L,40587L,40588L,40589L,40590L,
+40591L,40592L,40593L,40594L,40595L,40596L,40597L,40598L,40599L,40600L,
+40601L,40602L,40603L,40604L,40605L,40606L,40607L,40608L,40609L,40610L,
+40611L,40612L,40613L,40614L,40615L,40616L,40617L,40618L,40619L,40620L,
+40621L,40622L,40623L,40624L,40625L,40626L,40627L,40628L,40629L,40630L,
+40631L,40632L,40633L,40634L,40635L,40636L,40637L,40638L,40639L,40640L,
+40641L,40642L,40643L,40644L,40645L,40646L,40647L,40648L,40649L,40650L,
+40651L,40652L,40653L,40654L,40655L,40656L,40657L,40658L,40659L,40660L,
+40661L,40662L,40663L,40664L,40665L,40666L,40667L,40668L,40669L,40670L,
+40671L,40672L,40673L,40674L,40675L,40676L,40677L,40678L,40679L,40680L,
+40681L,40682L,40683L,40684L,40685L,40686L,40687L,40688L,40689L,40690L,
+40691L,40692L,40693L,40694L,40695L,40696L,40697L,40698L,40699L,40700L,
+40701L,40702L,40703L,40704L,40705L,40706L,40707L,40708L,40709L,40710L,
+40711L,40712L,40713L,40714L,40715L,40716L,40717L,40718L,40719L,40720L,
+40721L,40722L,40723L,40724L,40725L,40726L,40727L,40728L,40729L,40730L,
+40731L,40732L,40733L,40734L,40735L,40736L,40737L,40738L,40739L,40740L,
+40741L,40742L,40743L,40744L,40745L,40746L,40747L,40748L,40749L,40750L,
+40751L,40752L,40753L,40754L,40755L,40756L,40757L,40758L,40759L,40760L,
+40761L,40762L,40763L,40764L,40765L,40766L,40767L,40768L,40769L,40770L,
+40771L,40772L,40773L,40774L,40775L,40776L,40777L,40778L,40779L,40780L,
+40781L,40782L,40783L,40784L,40785L,40786L,40787L,40788L,40789L,40790L,
+40791L,40792L,40793L,40794L,40795L,40796L,40797L,40798L,40799L,40800L,
+40801L,40802L,40803L,40804L,40805L,40806L,40807L,40808L,40809L,40810L,
+40811L,40812L,40813L,40814L,40815L,40816L,40817L,40818L,40819L,40820L,
+40821L,40822L,40823L,40824L,40825L,40826L,40827L,40828L,40829L,40830L,
+40831L,40832L,40833L,40834L,40835L,40836L,40837L,40838L,40839L,40840L,
+40841L,40842L,40843L,40844L,40845L,40846L,40847L,40848L,40849L,40850L,
+40851L,40852L,40853L,40854L,40855L,40856L,40857L,40858L,40859L,40860L,
+40861L,40862L,40863L,40864L,40865L,40866L,40867L,40868L,40869L,40870L,
+40871L,40872L,40873L,40874L,40875L,40876L,40877L,40878L,40879L,40880L,
+40881L,40882L,40883L,40884L,40885L,40886L,40887L,40888L,40889L,40890L,
+40891L,40892L,40893L,40894L,40895L,40896L,40897L,40898L,40899L,40900L,
+40901L,40902L,40903L,40904L,40905L,40906L,40907L,40908L,40909L,40910L,
+40911L,40912L,40913L,40914L,40915L,40916L,40917L,40918L,40919L,40920L,
+40921L,40922L,40923L,40924L,40925L,40926L,40927L,40928L,40929L,40930L,
+40931L,40932L,40933L,40934L,40935L,40936L,40937L,40938L,40939L,40940L,
+40941L,40942L,40943L,40944L,40945L,40946L,40947L,40948L,40949L,40950L,
+40951L,40952L,40953L,40954L,40955L,40956L,40957L,40958L,40959L,40960L,
+40961L,40962L,40963L,40964L,40965L,40966L,40967L,40968L,40969L,40970L,
+40971L,40972L,40973L,40974L,40975L,40976L,40977L,40978L,40979L,40980L,
+40981L,40982L,40983L,40984L,40985L,40986L,40987L,40988L,40989L,40990L,
+40991L,40992L,40993L,40994L,40995L,40996L,40997L,40998L,40999L,41000L,
+41001L,41002L,41003L,41004L,41005L,41006L,41007L,41008L,41009L,41010L,
+41011L,41012L,41013L,41014L,41015L,41016L,41017L,41018L,41019L,41020L,
+41021L,41022L,41023L,41024L,41025L,41026L,41027L,41028L,41029L,41030L,
+41031L,41032L,41033L,41034L,41035L,41036L,41037L,41038L,41039L,41040L,
+41041L,41042L,41043L,41044L,41045L,41046L,41047L,41048L,41049L,41050L,
+41051L,41052L,41053L,41054L,41055L,41056L,41057L,41058L,41059L,41060L,
+41061L,41062L,41063L,41064L,41065L,41066L,41067L,41068L,41069L,41070L,
+41071L,41072L,41073L,41074L,41075L,41076L,41077L,41078L,41079L,41080L,
+41081L,41082L,41083L,41084L,41085L,41086L,41087L,41088L,41089L,41090L,
+41091L,41092L,41093L,41094L,41095L,41096L,41097L,41098L,41099L,41100L,
+41101L,41102L,41103L,41104L,41105L,41106L,41107L,41108L,41109L,41110L,
+41111L,41112L,41113L,41114L,41115L,41116L,41117L,41118L,41119L,41120L,
+41121L,41122L,41123L,41124L,41125L,41126L,41127L,41128L,41129L,41130L,
+41131L,41132L,41133L,41134L,41135L,41136L,41137L,41138L,41139L,41140L,
+41141L,41142L,41143L,41144L,41145L,41146L,41147L,41148L,41149L,41150L,
+41151L,41152L,41153L,41154L,41155L,41156L,41157L,41158L,41159L,41160L,
+41161L,41162L,41163L,41164L,41165L,41166L,41167L,41168L,41169L,41170L,
+41171L,41172L,41173L,41174L,41175L,41176L,41177L,41178L,41179L,41180L,
+41181L,41182L,41183L,41184L,41185L,41186L,41187L,41188L,41189L,41190L,
+41191L,41192L,41193L,41194L,41195L,41196L,41197L,41198L,41199L,41200L,
+41201L,41202L,41203L,41204L,41205L,41206L,41207L,41208L,41209L,41210L,
+41211L,41212L,41213L,41214L,41215L,41216L,41217L,41218L,41219L,41220L,
+41221L,41222L,41223L,41224L,41225L,41226L,41227L,41228L,41229L,41230L,
+41231L,41232L,41233L,41234L,41235L,41236L,41237L,41238L,41239L,41240L,
+41241L,41242L,41243L,41244L,41245L,41246L,41247L,41248L,41249L,41250L,
+41251L,41252L,41253L,41254L,41255L,41256L,41257L,41258L,41259L,41260L,
+41261L,41262L,41263L,41264L,41265L,41266L,41267L,41268L,41269L,41270L,
+41271L,41272L,41273L,41274L,41275L,41276L,41277L,41278L,41279L,41280L,
+41281L,41282L,41283L,41284L,41285L,41286L,41287L,41288L,41289L,41290L,
+41291L,41292L,41293L,41294L,41295L,41296L,41297L,41298L,41299L,41300L,
+41301L,41302L,41303L,41304L,41305L,41306L,41307L,41308L,41309L,41310L,
+41311L,41312L,41313L,41314L,41315L,41316L,41317L,41318L,41319L,41320L,
+41321L,41322L,41323L,41324L,41325L,41326L,41327L,41328L,41329L,41330L,
+41331L,41332L,41333L,41334L,41335L,41336L,41337L,41338L,41339L,41340L,
+41341L,41342L,41343L,41344L,41345L,41346L,41347L,41348L,41349L,41350L,
+41351L,41352L,41353L,41354L,41355L,41356L,41357L,41358L,41359L,41360L,
+41361L,41362L,41363L,41364L,41365L,41366L,41367L,41368L,41369L,41370L,
+41371L,41372L,41373L,41374L,41375L,41376L,41377L,41378L,41379L,41380L,
+41381L,41382L,41383L,41384L,41385L,41386L,41387L,41388L,41389L,41390L,
+41391L,41392L,41393L,41394L,41395L,41396L,41397L,41398L,41399L,41400L,
+41401L,41402L,41403L,41404L,41405L,41406L,41407L,41408L,41409L,41410L,
+41411L,41412L,41413L,41414L,41415L,41416L,41417L,41418L,41419L,41420L,
+41421L,41422L,41423L,41424L,41425L,41426L,41427L,41428L,41429L,41430L,
+41431L,41432L,41433L,41434L,41435L,41436L,41437L,41438L,41439L,41440L,
+41441L,41442L,41443L,41444L,41445L,41446L,41447L,41448L,41449L,41450L,
+41451L,41452L,41453L,41454L,41455L,41456L,41457L,41458L,41459L,41460L,
+41461L,41462L,41463L,41464L,41465L,41466L,41467L,41468L,41469L,41470L,
+41471L,41472L,41473L,41474L,41475L,41476L,41477L,41478L,41479L,41480L,
+41481L,41482L,41483L,41484L,41485L,41486L,41487L,41488L,41489L,41490L,
+41491L,41492L,41493L,41494L,41495L,41496L,41497L,41498L,41499L,41500L,
+41501L,41502L,41503L,41504L,41505L,41506L,41507L,41508L,41509L,41510L,
+41511L,41512L,41513L,41514L,41515L,41516L,41517L,41518L,41519L,41520L,
+41521L,41522L,41523L,41524L,41525L,41526L,41527L,41528L,41529L,41530L,
+41531L,41532L,41533L,41534L,41535L,41536L,41537L,41538L,41539L,41540L,
+41541L,41542L,41543L,41544L,41545L,41546L,41547L,41548L,41549L,41550L,
+41551L,41552L,41553L,41554L,41555L,41556L,41557L,41558L,41559L,41560L,
+41561L,41562L,41563L,41564L,41565L,41566L,41567L,41568L,41569L,41570L,
+41571L,41572L,41573L,41574L,41575L,41576L,41577L,41578L,41579L,41580L,
+41581L,41582L,41583L,41584L,41585L,41586L,41587L,41588L,41589L,41590L,
+41591L,41592L,41593L,41594L,41595L,41596L,41597L,41598L,41599L,41600L,
+41601L,41602L,41603L,41604L,41605L,41606L,41607L,41608L,41609L,41610L,
+41611L,41612L,41613L,41614L,41615L,41616L,41617L,41618L,41619L,41620L,
+41621L,41622L,41623L,41624L,41625L,41626L,41627L,41628L,41629L,41630L,
+41631L,41632L,41633L,41634L,41635L,41636L,41637L,41638L,41639L,41640L,
+41641L,41642L,41643L,41644L,41645L,41646L,41647L,41648L,41649L,41650L,
+41651L,41652L,41653L,41654L,41655L,41656L,41657L,41658L,41659L,41660L,
+41661L,41662L,41663L,41664L,41665L,41666L,41667L,41668L,41669L,41670L,
+41671L,41672L,41673L,41674L,41675L,41676L,41677L,41678L,41679L,41680L,
+41681L,41682L,41683L,41684L,41685L,41686L,41687L,41688L,41689L,41690L,
+41691L,41692L,41693L,41694L,41695L,41696L,41697L,41698L,41699L,41700L,
+41701L,41702L,41703L,41704L,41705L,41706L,41707L,41708L,41709L,41710L,
+41711L,41712L,41713L,41714L,41715L,41716L,41717L,41718L,41719L,41720L,
+41721L,41722L,41723L,41724L,41725L,41726L,41727L,41728L,41729L,41730L,
+41731L,41732L,41733L,41734L,41735L,41736L,41737L,41738L,41739L,41740L,
+41741L,41742L,41743L,41744L,41745L,41746L,41747L,41748L,41749L,41750L,
+41751L,41752L,41753L,41754L,41755L,41756L,41757L,41758L,41759L,41760L,
+41761L,41762L,41763L,41764L,41765L,41766L,41767L,41768L,41769L,41770L,
+41771L,41772L,41773L,41774L,41775L,41776L,41777L,41778L,41779L,41780L,
+41781L,41782L,41783L,41784L,41785L,41786L,41787L,41788L,41789L,41790L,
+41791L,41792L,41793L,41794L,41795L,41796L,41797L,41798L,41799L,41800L,
+41801L,41802L,41803L,41804L,41805L,41806L,41807L,41808L,41809L,41810L,
+41811L,41812L,41813L,41814L,41815L,41816L,41817L,41818L,41819L,41820L,
+41821L,41822L,41823L,41824L,41825L,41826L,41827L,41828L,41829L,41830L,
+41831L,41832L,41833L,41834L,41835L,41836L,41837L,41838L,41839L,41840L,
+41841L,41842L,41843L,41844L,41845L,41846L,41847L,41848L,41849L,41850L,
+41851L,41852L,41853L,41854L,41855L,41856L,41857L,41858L,41859L,41860L,
+41861L,41862L,41863L,41864L,41865L,41866L,41867L,41868L,41869L,41870L,
+41871L,41872L,41873L,41874L,41875L,41876L,41877L,41878L,41879L,41880L,
+41881L,41882L,41883L,41884L,41885L,41886L,41887L,41888L,41889L,41890L,
+41891L,41892L,41893L,41894L,41895L,41896L,41897L,41898L,41899L,41900L,
+41901L,41902L,41903L,41904L,41905L,41906L,41907L,41908L,41909L,41910L,
+41911L,41912L,41913L,41914L,41915L,41916L,41917L,41918L,41919L,41920L,
+41921L,41922L,41923L,41924L,41925L,41926L,41927L,41928L,41929L,41930L,
+41931L,41932L,41933L,41934L,41935L,41936L,41937L,41938L,41939L,41940L,
+41941L,41942L,41943L,41944L,41945L,41946L,41947L,41948L,41949L,41950L,
+41951L,41952L,41953L,41954L,41955L,41956L,41957L,41958L,41959L,41960L,
+41961L,41962L,41963L,41964L,41965L,41966L,41967L,41968L,41969L,41970L,
+41971L,41972L,41973L,41974L,41975L,41976L,41977L,41978L,41979L,41980L,
+41981L,41982L,41983L,41984L,41985L,41986L,41987L,41988L,41989L,41990L,
+41991L,41992L,41993L,41994L,41995L,41996L,41997L,41998L,41999L,42000L,
+42001L,42002L,42003L,42004L,42005L,42006L,42007L,42008L,42009L,42010L,
+42011L,42012L,42013L,42014L,42015L,42016L,42017L,42018L,42019L,42020L,
+42021L,42022L,42023L,42024L,42025L,42026L,42027L,42028L,42029L,42030L,
+42031L,42032L,42033L,42034L,42035L,42036L,42037L,42038L,42039L,42040L,
+42041L,42042L,42043L,42044L,42045L,42046L,42047L,42048L,42049L,42050L,
+42051L,42052L,42053L,42054L,42055L,42056L,42057L,42058L,42059L,42060L,
+42061L,42062L,42063L,42064L,42065L,42066L,42067L,42068L,42069L,42070L,
+42071L,42072L,42073L,42074L,42075L,42076L,42077L,42078L,42079L,42080L,
+42081L,42082L,42083L,42084L,42085L,42086L,42087L,42088L,42089L,42090L,
+42091L,42092L,42093L,42094L,42095L,42096L,42097L,42098L,42099L,42100L,
+42101L,42102L,42103L,42104L,42105L,42106L,42107L,42108L,42109L,42110L,
+42111L,42112L,42113L,42114L,42115L,42116L,42117L,42118L,42119L,42120L,
+42121L,42122L,42123L,42124L,42125L,42126L,42127L,42128L,42129L,42130L,
+42131L,42132L,42133L,42134L,42135L,42136L,42137L,42138L,42139L,42140L,
+42141L,42142L,42143L,42144L,42145L,42146L,42147L,42148L,42149L,42150L,
+42151L,42152L,42153L,42154L,42155L,42156L,42157L,42158L,42159L,42160L,
+42161L,42162L,42163L,42164L,42165L,42166L,42167L,42168L,42169L,42170L,
+42171L,42172L,42173L,42174L,42175L,42176L,42177L,42178L,42179L,42180L,
+42181L,42182L,42183L,42184L,42185L,42186L,42187L,42188L,42189L,42190L,
+42191L,42192L,42193L,42194L,42195L,42196L,42197L,42198L,42199L,42200L,
+42201L,42202L,42203L,42204L,42205L,42206L,42207L,42208L,42209L,42210L,
+42211L,42212L,42213L,42214L,42215L,42216L,42217L,42218L,42219L,42220L,
+42221L,42222L,42223L,42224L,42225L,42226L,42227L,42228L,42229L,42230L,
+42231L,42232L,42233L,42234L,42235L,42236L,42237L,42238L,42239L,42240L,
+42241L,42242L,42243L,42244L,42245L,42246L,42247L,42248L,42249L,42250L,
+42251L,42252L,42253L,42254L,42255L,42256L,42257L,42258L,42259L,42260L,
+42261L,42262L,42263L,42264L,42265L,42266L,42267L,42268L,42269L,42270L,
+42271L,42272L,42273L,42274L,42275L,42276L,42277L,42278L,42279L,42280L,
+42281L,42282L,42283L,42284L,42285L,42286L,42287L,42288L,42289L,42290L,
+42291L,42292L,42293L,42294L,42295L,42296L,42297L,42298L,42299L,42300L,
+42301L,42302L,42303L,42304L,42305L,42306L,42307L,42308L,42309L,42310L,
+42311L,42312L,42313L,42314L,42315L,42316L,42317L,42318L,42319L,42320L,
+42321L,42322L,42323L,42324L,42325L,42326L,42327L,42328L,42329L,42330L,
+42331L,42332L,42333L,42334L,42335L,42336L,42337L,42338L,42339L,42340L,
+42341L,42342L,42343L,42344L,42345L,42346L,42347L,42348L,42349L,42350L,
+42351L,42352L,42353L,42354L,42355L,42356L,42357L,42358L,42359L,42360L,
+42361L,42362L,42363L,42364L,42365L,42366L,42367L,42368L,42369L,42370L,
+42371L,42372L,42373L,42374L,42375L,42376L,42377L,42378L,42379L,42380L,
+42381L,42382L,42383L,42384L,42385L,42386L,42387L,42388L,42389L,42390L,
+42391L,42392L,42393L,42394L,42395L,42396L,42397L,42398L,42399L,42400L,
+42401L,42402L,42403L,42404L,42405L,42406L,42407L,42408L,42409L,42410L,
+42411L,42412L,42413L,42414L,42415L,42416L,42417L,42418L,42419L,42420L,
+42421L,42422L,42423L,42424L,42425L,42426L,42427L,42428L,42429L,42430L,
+42431L,42432L,42433L,42434L,42435L,42436L,42437L,42438L,42439L,42440L,
+42441L,42442L,42443L,42444L,42445L,42446L,42447L,42448L,42449L,42450L,
+42451L,42452L,42453L,42454L,42455L,42456L,42457L,42458L,42459L,42460L,
+42461L,42462L,42463L,42464L,42465L,42466L,42467L,42468L,42469L,42470L,
+42471L,42472L,42473L,42474L,42475L,42476L,42477L,42478L,42479L,42480L,
+42481L,42482L,42483L,42484L,42485L,42486L,42487L,42488L,42489L,42490L,
+42491L,42492L,42493L,42494L,42495L,42496L,42497L,42498L,42499L,42500L,
+42501L,42502L,42503L,42504L,42505L,42506L,42507L,42508L,42509L,42510L,
+42511L,42512L,42513L,42514L,42515L,42516L,42517L,42518L,42519L,42520L,
+42521L,42522L,42523L,42524L,42525L,42526L,42527L,42528L,42529L,42530L,
+42531L,42532L,42533L,42534L,42535L,42536L,42537L,42538L,42539L,42540L,
+42541L,42542L,42543L,42544L,42545L,42546L,42547L,42548L,42549L,42550L,
+42551L,42552L,42553L,42554L,42555L,42556L,42557L,42558L,42559L,42560L,
+42560L,42562L,42562L,42564L,42564L,42566L,42566L,42568L,42568L,42570L,
+42570L,42572L,42572L,42574L,42574L,42576L,42576L,42578L,42578L,42580L,
+42580L,42582L,42582L,42584L,42584L,42586L,42586L,42588L,42588L,42590L,
+42590L,42592L,42592L,42594L,42594L,42596L,42596L,42598L,42598L,42600L,
+42600L,42602L,42602L,42604L,42604L,42606L,42607L,42608L,42609L,42610L,
+42611L,42612L,42613L,42614L,42615L,42616L,42617L,42618L,42619L,42620L,
+42621L,42622L,42623L,42624L,42624L,42626L,42626L,42628L,42628L,42630L,
+42630L,42632L,42632L,42634L,42634L,42636L,42636L,42638L,42638L,42640L,
+42640L,42642L,42642L,42644L,42644L,42646L,42646L,42648L,42648L,42650L,
+42650L,42652L,42653L,42654L,42655L,42656L,42657L,42658L,42659L,42660L,
+42661L,42662L,42663L,42664L,42665L,42666L,42667L,42668L,42669L,42670L,
+42671L,42672L,42673L,42674L,42675L,42676L,42677L,42678L,42679L,42680L,
+42681L,42682L,42683L,42684L,42685L,42686L,42687L,42688L,42689L,42690L,
+42691L,42692L,42693L,42694L,42695L,42696L,42697L,42698L,42699L,42700L,
+42701L,42702L,42703L,42704L,42705L,42706L,42707L,42708L,42709L,42710L,
+42711L,42712L,42713L,42714L,42715L,42716L,42717L,42718L,42719L,42720L,
+42721L,42722L,42723L,42724L,42725L,42726L,42727L,42728L,42729L,42730L,
+42731L,42732L,42733L,42734L,42735L,42736L,42737L,42738L,42739L,42740L,
+42741L,42742L,42743L,42744L,42745L,42746L,42747L,42748L,42749L,42750L,
+42751L,42752L,42753L,42754L,42755L,42756L,42757L,42758L,42759L,42760L,
+42761L,42762L,42763L,42764L,42765L,42766L,42767L,42768L,42769L,42770L,
+42771L,42772L,42773L,42774L,42775L,42776L,42777L,42778L,42779L,42780L,
+42781L,42782L,42783L,42784L,42785L,42786L,42786L,42788L,42788L,42790L,
+42790L,42792L,42792L,42794L,42794L,42796L,42796L,42798L,42798L,42800L,
+42801L,42802L,42802L,42804L,42804L,42806L,42806L,42808L,42808L,42810L,
+42810L,42812L,42812L,42814L,42814L,42816L,42816L,42818L,42818L,42820L,
+42820L,42822L,42822L,42824L,42824L,42826L,42826L,42828L,42828L,42830L,
+42830L,42832L,42832L,42834L,42834L,42836L,42836L,42838L,42838L,42840L,
+42840L,42842L,42842L,42844L,42844L,42846L,42846L,42848L,42848L,42850L,
+42850L,42852L,42852L,42854L,42854L,42856L,42856L,42858L,42858L,42860L,
+42860L,42862L,42862L,42864L,42865L,42866L,42867L,42868L,42869L,42870L,
+42871L,42872L,42873L,42873L,42875L,42875L,42877L,42878L,42878L,42880L,
+42880L,42882L,42882L,42884L,42884L,42886L,42886L,42888L,42889L,42890L,
+42891L,42891L,42893L,42894L,42895L,42896L,42896L,42898L,42898L,42900L,
+42901L,42902L,42902L,42904L,42904L,42906L,42906L,42908L,42908L,42910L,
+42910L,42912L,42912L,42914L,42914L,42916L,42916L,42918L,42918L,42920L,
+42920L,42922L,42923L,42924L,42925L,42926L,42927L,42928L,42929L,42930L,
+42931L,42932L,42932L,42934L,42934L,42936L,42937L,42938L,42939L,42940L,
+42941L,42942L,42943L,42944L,42945L,42946L,42947L,42948L,42949L,42950L,
+42951L,42952L,42953L,42954L,42955L,42956L,42957L,42958L,42959L,42960L,
+42961L,42962L,42963L,42964L,42965L,42966L,42967L,42968L,42969L,42970L,
+42971L,42972L,42973L,42974L,42975L,42976L,42977L,42978L,42979L,42980L,
+42981L,42982L,42983L,42984L,42985L,42986L,42987L,42988L,42989L,42990L,
+42991L,42992L,42993L,42994L,42995L,42996L,42997L,42998L,42999L,43000L,
+43001L,43002L,43003L,43004L,43005L,43006L,43007L,43008L,43009L,43010L,
+43011L,43012L,43013L,43014L,43015L,43016L,43017L,43018L,43019L,43020L,
+43021L,43022L,43023L,43024L,43025L,43026L,43027L,43028L,43029L,43030L,
+43031L,43032L,43033L,43034L,43035L,43036L,43037L,43038L,43039L,43040L,
+43041L,43042L,43043L,43044L,43045L,43046L,43047L,43048L,43049L,43050L,
+43051L,43052L,43053L,43054L,43055L,43056L,43057L,43058L,43059L,43060L,
+43061L,43062L,43063L,43064L,43065L,43066L,43067L,43068L,43069L,43070L,
+43071L,43072L,43073L,43074L,43075L,43076L,43077L,43078L,43079L,43080L,
+43081L,43082L,43083L,43084L,43085L,43086L,43087L,43088L,43089L,43090L,
+43091L,43092L,43093L,43094L,43095L,43096L,43097L,43098L,43099L,43100L,
+43101L,43102L,43103L,43104L,43105L,43106L,43107L,43108L,43109L,43110L,
+43111L,43112L,43113L,43114L,43115L,43116L,43117L,43118L,43119L,43120L,
+43121L,43122L,43123L,43124L,43125L,43126L,43127L,43128L,43129L,43130L,
+43131L,43132L,43133L,43134L,43135L,43136L,43137L,43138L,43139L,43140L,
+43141L,43142L,43143L,43144L,43145L,43146L,43147L,43148L,43149L,43150L,
+43151L,43152L,43153L,43154L,43155L,43156L,43157L,43158L,43159L,43160L,
+43161L,43162L,43163L,43164L,43165L,43166L,43167L,43168L,43169L,43170L,
+43171L,43172L,43173L,43174L,43175L,43176L,43177L,43178L,43179L,43180L,
+43181L,43182L,43183L,43184L,43185L,43186L,43187L,43188L,43189L,43190L,
+43191L,43192L,43193L,43194L,43195L,43196L,43197L,43198L,43199L,43200L,
+43201L,43202L,43203L,43204L,43205L,43206L,43207L,43208L,43209L,43210L,
+43211L,43212L,43213L,43214L,43215L,43216L,43217L,43218L,43219L,43220L,
+43221L,43222L,43223L,43224L,43225L,43226L,43227L,43228L,43229L,43230L,
+43231L,43232L,43233L,43234L,43235L,43236L,43237L,43238L,43239L,43240L,
+43241L,43242L,43243L,43244L,43245L,43246L,43247L,43248L,43249L,43250L,
+43251L,43252L,43253L,43254L,43255L,43256L,43257L,43258L,43259L,43260L,
+43261L,43262L,43263L,43264L,43265L,43266L,43267L,43268L,43269L,43270L,
+43271L,43272L,43273L,43274L,43275L,43276L,43277L,43278L,43279L,43280L,
+43281L,43282L,43283L,43284L,43285L,43286L,43287L,43288L,43289L,43290L,
+43291L,43292L,43293L,43294L,43295L,43296L,43297L,43298L,43299L,43300L,
+43301L,43302L,43303L,43304L,43305L,43306L,43307L,43308L,43309L,43310L,
+43311L,43312L,43313L,43314L,43315L,43316L,43317L,43318L,43319L,43320L,
+43321L,43322L,43323L,43324L,43325L,43326L,43327L,43328L,43329L,43330L,
+43331L,43332L,43333L,43334L,43335L,43336L,43337L,43338L,43339L,43340L,
+43341L,43342L,43343L,43344L,43345L,43346L,43347L,43348L,43349L,43350L,
+43351L,43352L,43353L,43354L,43355L,43356L,43357L,43358L,43359L,43360L,
+43361L,43362L,43363L,43364L,43365L,43366L,43367L,43368L,43369L,43370L,
+43371L,43372L,43373L,43374L,43375L,43376L,43377L,43378L,43379L,43380L,
+43381L,43382L,43383L,43384L,43385L,43386L,43387L,43388L,43389L,43390L,
+43391L,43392L,43393L,43394L,43395L,43396L,43397L,43398L,43399L,43400L,
+43401L,43402L,43403L,43404L,43405L,43406L,43407L,43408L,43409L,43410L,
+43411L,43412L,43413L,43414L,43415L,43416L,43417L,43418L,43419L,43420L,
+43421L,43422L,43423L,43424L,43425L,43426L,43427L,43428L,43429L,43430L,
+43431L,43432L,43433L,43434L,43435L,43436L,43437L,43438L,43439L,43440L,
+43441L,43442L,43443L,43444L,43445L,43446L,43447L,43448L,43449L,43450L,
+43451L,43452L,43453L,43454L,43455L,43456L,43457L,43458L,43459L,43460L,
+43461L,43462L,43463L,43464L,43465L,43466L,43467L,43468L,43469L,43470L,
+43471L,43472L,43473L,43474L,43475L,43476L,43477L,43478L,43479L,43480L,
+43481L,43482L,43483L,43484L,43485L,43486L,43487L,43488L,43489L,43490L,
+43491L,43492L,43493L,43494L,43495L,43496L,43497L,43498L,43499L,43500L,
+43501L,43502L,43503L,43504L,43505L,43506L,43507L,43508L,43509L,43510L,
+43511L,43512L,43513L,43514L,43515L,43516L,43517L,43518L,43519L,43520L,
+43521L,43522L,43523L,43524L,43525L,43526L,43527L,43528L,43529L,43530L,
+43531L,43532L,43533L,43534L,43535L,43536L,43537L,43538L,43539L,43540L,
+43541L,43542L,43543L,43544L,43545L,43546L,43547L,43548L,43549L,43550L,
+43551L,43552L,43553L,43554L,43555L,43556L,43557L,43558L,43559L,43560L,
+43561L,43562L,43563L,43564L,43565L,43566L,43567L,43568L,43569L,43570L,
+43571L,43572L,43573L,43574L,43575L,43576L,43577L,43578L,43579L,43580L,
+43581L,43582L,43583L,43584L,43585L,43586L,43587L,43588L,43589L,43590L,
+43591L,43592L,43593L,43594L,43595L,43596L,43597L,43598L,43599L,43600L,
+43601L,43602L,43603L,43604L,43605L,43606L,43607L,43608L,43609L,43610L,
+43611L,43612L,43613L,43614L,43615L,43616L,43617L,43618L,43619L,43620L,
+43621L,43622L,43623L,43624L,43625L,43626L,43627L,43628L,43629L,43630L,
+43631L,43632L,43633L,43634L,43635L,43636L,43637L,43638L,43639L,43640L,
+43641L,43642L,43643L,43644L,43645L,43646L,43647L,43648L,43649L,43650L,
+43651L,43652L,43653L,43654L,43655L,43656L,43657L,43658L,43659L,43660L,
+43661L,43662L,43663L,43664L,43665L,43666L,43667L,43668L,43669L,43670L,
+43671L,43672L,43673L,43674L,43675L,43676L,43677L,43678L,43679L,43680L,
+43681L,43682L,43683L,43684L,43685L,43686L,43687L,43688L,43689L,43690L,
+43691L,43692L,43693L,43694L,43695L,43696L,43697L,43698L,43699L,43700L,
+43701L,43702L,43703L,43704L,43705L,43706L,43707L,43708L,43709L,43710L,
+43711L,43712L,43713L,43714L,43715L,43716L,43717L,43718L,43719L,43720L,
+43721L,43722L,43723L,43724L,43725L,43726L,43727L,43728L,43729L,43730L,
+43731L,43732L,43733L,43734L,43735L,43736L,43737L,43738L,43739L,43740L,
+43741L,43742L,43743L,43744L,43745L,43746L,43747L,43748L,43749L,43750L,
+43751L,43752L,43753L,43754L,43755L,43756L,43757L,43758L,43759L,43760L,
+43761L,43762L,43763L,43764L,43765L,43766L,43767L,43768L,43769L,43770L,
+43771L,43772L,43773L,43774L,43775L,43776L,43777L,43778L,43779L,43780L,
+43781L,43782L,43783L,43784L,43785L,43786L,43787L,43788L,43789L,43790L,
+43791L,43792L,43793L,43794L,43795L,43796L,43797L,43798L,43799L,43800L,
+43801L,43802L,43803L,43804L,43805L,43806L,43807L,43808L,43809L,43810L,
+43811L,43812L,43813L,43814L,43815L,43816L,43817L,43818L,43819L,43820L,
+43821L,43822L,43823L,43824L,43825L,43826L,43827L,43828L,43829L,43830L,
+43831L,43832L,43833L,43834L,43835L,43836L,43837L,43838L,43839L,43840L,
+43841L,43842L,43843L,43844L,43845L,43846L,43847L,43848L,43849L,43850L,
+43851L,43852L,43853L,43854L,43855L,43856L,43857L,43858L,42931L,43860L,
+43861L,43862L,43863L,43864L,43865L,43866L,43867L,43868L,43869L,43870L,
+43871L,43872L,43873L,43874L,43875L,43876L,43877L,43878L,43879L,43880L,
+43881L,43882L,43883L,43884L,43885L,43886L,43887L,5024,5025,5026,5027,5028,
+5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,
+5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,
+5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,
+5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,
+5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
+43968L,43969L,43970L,43971L,43972L,43973L,43974L,43975L,43976L,43977L,
+43978L,43979L,43980L,43981L,43982L,43983L,43984L,43985L,43986L,43987L,
+43988L,43989L,43990L,43991L,43992L,43993L,43994L,43995L,43996L,43997L,
+43998L,43999L,44000L,44001L,44002L,44003L,44004L,44005L,44006L,44007L,
+44008L,44009L,44010L,44011L,44012L,44013L,44014L,44015L,44016L,44017L,
+44018L,44019L,44020L,44021L,44022L,44023L,44024L,44025L,44026L,44027L,
+44028L,44029L,44030L,44031L,44032L,44033L,44034L,44035L,44036L,44037L,
+44038L,44039L,44040L,44041L,44042L,44043L,44044L,44045L,44046L,44047L,
+44048L,44049L,44050L,44051L,44052L,44053L,44054L,44055L,44056L,44057L,
+44058L,44059L,44060L,44061L,44062L,44063L,44064L,44065L,44066L,44067L,
+44068L,44069L,44070L,44071L,44072L,44073L,44074L,44075L,44076L,44077L,
+44078L,44079L,44080L,44081L,44082L,44083L,44084L,44085L,44086L,44087L,
+44088L,44089L,44090L,44091L,44092L,44093L,44094L,44095L,44096L,44097L,
+44098L,44099L,44100L,44101L,44102L,44103L,44104L,44105L,44106L,44107L,
+44108L,44109L,44110L,44111L,44112L,44113L,44114L,44115L,44116L,44117L,
+44118L,44119L,44120L,44121L,44122L,44123L,44124L,44125L,44126L,44127L,
+44128L,44129L,44130L,44131L,44132L,44133L,44134L,44135L,44136L,44137L,
+44138L,44139L,44140L,44141L,44142L,44143L,44144L,44145L,44146L,44147L,
+44148L,44149L,44150L,44151L,44152L,44153L,44154L,44155L,44156L,44157L,
+44158L,44159L,44160L,44161L,44162L,44163L,44164L,44165L,44166L,44167L,
+44168L,44169L,44170L,44171L,44172L,44173L,44174L,44175L,44176L,44177L,
+44178L,44179L,44180L,44181L,44182L,44183L,44184L,44185L,44186L,44187L,
+44188L,44189L,44190L,44191L,44192L,44193L,44194L,44195L,44196L,44197L,
+44198L,44199L,44200L,44201L,44202L,44203L,44204L,44205L,44206L,44207L,
+44208L,44209L,44210L,44211L,44212L,44213L,44214L,44215L,44216L,44217L,
+44218L,44219L,44220L,44221L,44222L,44223L,44224L,44225L,44226L,44227L,
+44228L,44229L,44230L,44231L,44232L,44233L,44234L,44235L,44236L,44237L,
+44238L,44239L,44240L,44241L,44242L,44243L,44244L,44245L,44246L,44247L,
+44248L,44249L,44250L,44251L,44252L,44253L,44254L,44255L,44256L,44257L,
+44258L,44259L,44260L,44261L,44262L,44263L,44264L,44265L,44266L,44267L,
+44268L,44269L,44270L,44271L,44272L,44273L,44274L,44275L,44276L,44277L,
+44278L,44279L,44280L,44281L,44282L,44283L,44284L,44285L,44286L,44287L,
+44288L,44289L,44290L,44291L,44292L,44293L,44294L,44295L,44296L,44297L,
+44298L,44299L,44300L,44301L,44302L,44303L,44304L,44305L,44306L,44307L,
+44308L,44309L,44310L,44311L,44312L,44313L,44314L,44315L,44316L,44317L,
+44318L,44319L,44320L,44321L,44322L,44323L,44324L,44325L,44326L,44327L,
+44328L,44329L,44330L,44331L,44332L,44333L,44334L,44335L,44336L,44337L,
+44338L,44339L,44340L,44341L,44342L,44343L,44344L,44345L,44346L,44347L,
+44348L,44349L,44350L,44351L,44352L,44353L,44354L,44355L,44356L,44357L,
+44358L,44359L,44360L,44361L,44362L,44363L,44364L,44365L,44366L,44367L,
+44368L,44369L,44370L,44371L,44372L,44373L,44374L,44375L,44376L,44377L,
+44378L,44379L,44380L,44381L,44382L,44383L,44384L,44385L,44386L,44387L,
+44388L,44389L,44390L,44391L,44392L,44393L,44394L,44395L,44396L,44397L,
+44398L,44399L,44400L,44401L,44402L,44403L,44404L,44405L,44406L,44407L,
+44408L,44409L,44410L,44411L,44412L,44413L,44414L,44415L,44416L,44417L,
+44418L,44419L,44420L,44421L,44422L,44423L,44424L,44425L,44426L,44427L,
+44428L,44429L,44430L,44431L,44432L,44433L,44434L,44435L,44436L,44437L,
+44438L,44439L,44440L,44441L,44442L,44443L,44444L,44445L,44446L,44447L,
+44448L,44449L,44450L,44451L,44452L,44453L,44454L,44455L,44456L,44457L,
+44458L,44459L,44460L,44461L,44462L,44463L,44464L,44465L,44466L,44467L,
+44468L,44469L,44470L,44471L,44472L,44473L,44474L,44475L,44476L,44477L,
+44478L,44479L,44480L,44481L,44482L,44483L,44484L,44485L,44486L,44487L,
+44488L,44489L,44490L,44491L,44492L,44493L,44494L,44495L,44496L,44497L,
+44498L,44499L,44500L,44501L,44502L,44503L,44504L,44505L,44506L,44507L,
+44508L,44509L,44510L,44511L,44512L,44513L,44514L,44515L,44516L,44517L,
+44518L,44519L,44520L,44521L,44522L,44523L,44524L,44525L,44526L,44527L,
+44528L,44529L,44530L,44531L,44532L,44533L,44534L,44535L,44536L,44537L,
+44538L,44539L,44540L,44541L,44542L,44543L,44544L,44545L,44546L,44547L,
+44548L,44549L,44550L,44551L,44552L,44553L,44554L,44555L,44556L,44557L,
+44558L,44559L,44560L,44561L,44562L,44563L,44564L,44565L,44566L,44567L,
+44568L,44569L,44570L,44571L,44572L,44573L,44574L,44575L,44576L,44577L,
+44578L,44579L,44580L,44581L,44582L,44583L,44584L,44585L,44586L,44587L,
+44588L,44589L,44590L,44591L,44592L,44593L,44594L,44595L,44596L,44597L,
+44598L,44599L,44600L,44601L,44602L,44603L,44604L,44605L,44606L,44607L,
+44608L,44609L,44610L,44611L,44612L,44613L,44614L,44615L,44616L,44617L,
+44618L,44619L,44620L,44621L,44622L,44623L,44624L,44625L,44626L,44627L,
+44628L,44629L,44630L,44631L,44632L,44633L,44634L,44635L,44636L,44637L,
+44638L,44639L,44640L,44641L,44642L,44643L,44644L,44645L,44646L,44647L,
+44648L,44649L,44650L,44651L,44652L,44653L,44654L,44655L,44656L,44657L,
+44658L,44659L,44660L,44661L,44662L,44663L,44664L,44665L,44666L,44667L,
+44668L,44669L,44670L,44671L,44672L,44673L,44674L,44675L,44676L,44677L,
+44678L,44679L,44680L,44681L,44682L,44683L,44684L,44685L,44686L,44687L,
+44688L,44689L,44690L,44691L,44692L,44693L,44694L,44695L,44696L,44697L,
+44698L,44699L,44700L,44701L,44702L,44703L,44704L,44705L,44706L,44707L,
+44708L,44709L,44710L,44711L,44712L,44713L,44714L,44715L,44716L,44717L,
+44718L,44719L,44720L,44721L,44722L,44723L,44724L,44725L,44726L,44727L,
+44728L,44729L,44730L,44731L,44732L,44733L,44734L,44735L,44736L,44737L,
+44738L,44739L,44740L,44741L,44742L,44743L,44744L,44745L,44746L,44747L,
+44748L,44749L,44750L,44751L,44752L,44753L,44754L,44755L,44756L,44757L,
+44758L,44759L,44760L,44761L,44762L,44763L,44764L,44765L,44766L,44767L,
+44768L,44769L,44770L,44771L,44772L,44773L,44774L,44775L,44776L,44777L,
+44778L,44779L,44780L,44781L,44782L,44783L,44784L,44785L,44786L,44787L,
+44788L,44789L,44790L,44791L,44792L,44793L,44794L,44795L,44796L,44797L,
+44798L,44799L,44800L,44801L,44802L,44803L,44804L,44805L,44806L,44807L,
+44808L,44809L,44810L,44811L,44812L,44813L,44814L,44815L,44816L,44817L,
+44818L,44819L,44820L,44821L,44822L,44823L,44824L,44825L,44826L,44827L,
+44828L,44829L,44830L,44831L,44832L,44833L,44834L,44835L,44836L,44837L,
+44838L,44839L,44840L,44841L,44842L,44843L,44844L,44845L,44846L,44847L,
+44848L,44849L,44850L,44851L,44852L,44853L,44854L,44855L,44856L,44857L,
+44858L,44859L,44860L,44861L,44862L,44863L,44864L,44865L,44866L,44867L,
+44868L,44869L,44870L,44871L,44872L,44873L,44874L,44875L,44876L,44877L,
+44878L,44879L,44880L,44881L,44882L,44883L,44884L,44885L,44886L,44887L,
+44888L,44889L,44890L,44891L,44892L,44893L,44894L,44895L,44896L,44897L,
+44898L,44899L,44900L,44901L,44902L,44903L,44904L,44905L,44906L,44907L,
+44908L,44909L,44910L,44911L,44912L,44913L,44914L,44915L,44916L,44917L,
+44918L,44919L,44920L,44921L,44922L,44923L,44924L,44925L,44926L,44927L,
+44928L,44929L,44930L,44931L,44932L,44933L,44934L,44935L,44936L,44937L,
+44938L,44939L,44940L,44941L,44942L,44943L,44944L,44945L,44946L,44947L,
+44948L,44949L,44950L,44951L,44952L,44953L,44954L,44955L,44956L,44957L,
+44958L,44959L,44960L,44961L,44962L,44963L,44964L,44965L,44966L,44967L,
+44968L,44969L,44970L,44971L,44972L,44973L,44974L,44975L,44976L,44977L,
+44978L,44979L,44980L,44981L,44982L,44983L,44984L,44985L,44986L,44987L,
+44988L,44989L,44990L,44991L,44992L,44993L,44994L,44995L,44996L,44997L,
+44998L,44999L,45000L,45001L,45002L,45003L,45004L,45005L,45006L,45007L,
+45008L,45009L,45010L,45011L,45012L,45013L,45014L,45015L,45016L,45017L,
+45018L,45019L,45020L,45021L,45022L,45023L,45024L,45025L,45026L,45027L,
+45028L,45029L,45030L,45031L,45032L,45033L,45034L,45035L,45036L,45037L,
+45038L,45039L,45040L,45041L,45042L,45043L,45044L,45045L,45046L,45047L,
+45048L,45049L,45050L,45051L,45052L,45053L,45054L,45055L,45056L,45057L,
+45058L,45059L,45060L,45061L,45062L,45063L,45064L,45065L,45066L,45067L,
+45068L,45069L,45070L,45071L,45072L,45073L,45074L,45075L,45076L,45077L,
+45078L,45079L,45080L,45081L,45082L,45083L,45084L,45085L,45086L,45087L,
+45088L,45089L,45090L,45091L,45092L,45093L,45094L,45095L,45096L,45097L,
+45098L,45099L,45100L,45101L,45102L,45103L,45104L,45105L,45106L,45107L,
+45108L,45109L,45110L,45111L,45112L,45113L,45114L,45115L,45116L,45117L,
+45118L,45119L,45120L,45121L,45122L,45123L,45124L,45125L,45126L,45127L,
+45128L,45129L,45130L,45131L,45132L,45133L,45134L,45135L,45136L,45137L,
+45138L,45139L,45140L,45141L,45142L,45143L,45144L,45145L,45146L,45147L,
+45148L,45149L,45150L,45151L,45152L,45153L,45154L,45155L,45156L,45157L,
+45158L,45159L,45160L,45161L,45162L,45163L,45164L,45165L,45166L,45167L,
+45168L,45169L,45170L,45171L,45172L,45173L,45174L,45175L,45176L,45177L,
+45178L,45179L,45180L,45181L,45182L,45183L,45184L,45185L,45186L,45187L,
+45188L,45189L,45190L,45191L,45192L,45193L,45194L,45195L,45196L,45197L,
+45198L,45199L,45200L,45201L,45202L,45203L,45204L,45205L,45206L,45207L,
+45208L,45209L,45210L,45211L,45212L,45213L,45214L,45215L,45216L,45217L,
+45218L,45219L,45220L,45221L,45222L,45223L,45224L,45225L,45226L,45227L,
+45228L,45229L,45230L,45231L,45232L,45233L,45234L,45235L,45236L,45237L,
+45238L,45239L,45240L,45241L,45242L,45243L,45244L,45245L,45246L,45247L,
+45248L,45249L,45250L,45251L,45252L,45253L,45254L,45255L,45256L,45257L,
+45258L,45259L,45260L,45261L,45262L,45263L,45264L,45265L,45266L,45267L,
+45268L,45269L,45270L,45271L,45272L,45273L,45274L,45275L,45276L,45277L,
+45278L,45279L,45280L,45281L,45282L,45283L,45284L,45285L,45286L,45287L,
+45288L,45289L,45290L,45291L,45292L,45293L,45294L,45295L,45296L,45297L,
+45298L,45299L,45300L,45301L,45302L,45303L,45304L,45305L,45306L,45307L,
+45308L,45309L,45310L,45311L,45312L,45313L,45314L,45315L,45316L,45317L,
+45318L,45319L,45320L,45321L,45322L,45323L,45324L,45325L,45326L,45327L,
+45328L,45329L,45330L,45331L,45332L,45333L,45334L,45335L,45336L,45337L,
+45338L,45339L,45340L,45341L,45342L,45343L,45344L,45345L,45346L,45347L,
+45348L,45349L,45350L,45351L,45352L,45353L,45354L,45355L,45356L,45357L,
+45358L,45359L,45360L,45361L,45362L,45363L,45364L,45365L,45366L,45367L,
+45368L,45369L,45370L,45371L,45372L,45373L,45374L,45375L,45376L,45377L,
+45378L,45379L,45380L,45381L,45382L,45383L,45384L,45385L,45386L,45387L,
+45388L,45389L,45390L,45391L,45392L,45393L,45394L,45395L,45396L,45397L,
+45398L,45399L,45400L,45401L,45402L,45403L,45404L,45405L,45406L,45407L,
+45408L,45409L,45410L,45411L,45412L,45413L,45414L,45415L,45416L,45417L,
+45418L,45419L,45420L,45421L,45422L,45423L,45424L,45425L,45426L,45427L,
+45428L,45429L,45430L,45431L,45432L,45433L,45434L,45435L,45436L,45437L,
+45438L,45439L,45440L,45441L,45442L,45443L,45444L,45445L,45446L,45447L,
+45448L,45449L,45450L,45451L,45452L,45453L,45454L,45455L,45456L,45457L,
+45458L,45459L,45460L,45461L,45462L,45463L,45464L,45465L,45466L,45467L,
+45468L,45469L,45470L,45471L,45472L,45473L,45474L,45475L,45476L,45477L,
+45478L,45479L,45480L,45481L,45482L,45483L,45484L,45485L,45486L,45487L,
+45488L,45489L,45490L,45491L,45492L,45493L,45494L,45495L,45496L,45497L,
+45498L,45499L,45500L,45501L,45502L,45503L,45504L,45505L,45506L,45507L,
+45508L,45509L,45510L,45511L,45512L,45513L,45514L,45515L,45516L,45517L,
+45518L,45519L,45520L,45521L,45522L,45523L,45524L,45525L,45526L,45527L,
+45528L,45529L,45530L,45531L,45532L,45533L,45534L,45535L,45536L,45537L,
+45538L,45539L,45540L,45541L,45542L,45543L,45544L,45545L,45546L,45547L,
+45548L,45549L,45550L,45551L,45552L,45553L,45554L,45555L,45556L,45557L,
+45558L,45559L,45560L,45561L,45562L,45563L,45564L,45565L,45566L,45567L,
+45568L,45569L,45570L,45571L,45572L,45573L,45574L,45575L,45576L,45577L,
+45578L,45579L,45580L,45581L,45582L,45583L,45584L,45585L,45586L,45587L,
+45588L,45589L,45590L,45591L,45592L,45593L,45594L,45595L,45596L,45597L,
+45598L,45599L,45600L,45601L,45602L,45603L,45604L,45605L,45606L,45607L,
+45608L,45609L,45610L,45611L,45612L,45613L,45614L,45615L,45616L,45617L,
+45618L,45619L,45620L,45621L,45622L,45623L,45624L,45625L,45626L,45627L,
+45628L,45629L,45630L,45631L,45632L,45633L,45634L,45635L,45636L,45637L,
+45638L,45639L,45640L,45641L,45642L,45643L,45644L,45645L,45646L,45647L,
+45648L,45649L,45650L,45651L,45652L,45653L,45654L,45655L,45656L,45657L,
+45658L,45659L,45660L,45661L,45662L,45663L,45664L,45665L,45666L,45667L,
+45668L,45669L,45670L,45671L,45672L,45673L,45674L,45675L,45676L,45677L,
+45678L,45679L,45680L,45681L,45682L,45683L,45684L,45685L,45686L,45687L,
+45688L,45689L,45690L,45691L,45692L,45693L,45694L,45695L,45696L,45697L,
+45698L,45699L,45700L,45701L,45702L,45703L,45704L,45705L,45706L,45707L,
+45708L,45709L,45710L,45711L,45712L,45713L,45714L,45715L,45716L,45717L,
+45718L,45719L,45720L,45721L,45722L,45723L,45724L,45725L,45726L,45727L,
+45728L,45729L,45730L,45731L,45732L,45733L,45734L,45735L,45736L,45737L,
+45738L,45739L,45740L,45741L,45742L,45743L,45744L,45745L,45746L,45747L,
+45748L,45749L,45750L,45751L,45752L,45753L,45754L,45755L,45756L,45757L,
+45758L,45759L,45760L,45761L,45762L,45763L,45764L,45765L,45766L,45767L,
+45768L,45769L,45770L,45771L,45772L,45773L,45774L,45775L,45776L,45777L,
+45778L,45779L,45780L,45781L,45782L,45783L,45784L,45785L,45786L,45787L,
+45788L,45789L,45790L,45791L,45792L,45793L,45794L,45795L,45796L,45797L,
+45798L,45799L,45800L,45801L,45802L,45803L,45804L,45805L,45806L,45807L,
+45808L,45809L,45810L,45811L,45812L,45813L,45814L,45815L,45816L,45817L,
+45818L,45819L,45820L,45821L,45822L,45823L,45824L,45825L,45826L,45827L,
+45828L,45829L,45830L,45831L,45832L,45833L,45834L,45835L,45836L,45837L,
+45838L,45839L,45840L,45841L,45842L,45843L,45844L,45845L,45846L,45847L,
+45848L,45849L,45850L,45851L,45852L,45853L,45854L,45855L,45856L,45857L,
+45858L,45859L,45860L,45861L,45862L,45863L,45864L,45865L,45866L,45867L,
+45868L,45869L,45870L,45871L,45872L,45873L,45874L,45875L,45876L,45877L,
+45878L,45879L,45880L,45881L,45882L,45883L,45884L,45885L,45886L,45887L,
+45888L,45889L,45890L,45891L,45892L,45893L,45894L,45895L,45896L,45897L,
+45898L,45899L,45900L,45901L,45902L,45903L,45904L,45905L,45906L,45907L,
+45908L,45909L,45910L,45911L,45912L,45913L,45914L,45915L,45916L,45917L,
+45918L,45919L,45920L,45921L,45922L,45923L,45924L,45925L,45926L,45927L,
+45928L,45929L,45930L,45931L,45932L,45933L,45934L,45935L,45936L,45937L,
+45938L,45939L,45940L,45941L,45942L,45943L,45944L,45945L,45946L,45947L,
+45948L,45949L,45950L,45951L,45952L,45953L,45954L,45955L,45956L,45957L,
+45958L,45959L,45960L,45961L,45962L,45963L,45964L,45965L,45966L,45967L,
+45968L,45969L,45970L,45971L,45972L,45973L,45974L,45975L,45976L,45977L,
+45978L,45979L,45980L,45981L,45982L,45983L,45984L,45985L,45986L,45987L,
+45988L,45989L,45990L,45991L,45992L,45993L,45994L,45995L,45996L,45997L,
+45998L,45999L,46000L,46001L,46002L,46003L,46004L,46005L,46006L,46007L,
+46008L,46009L,46010L,46011L,46012L,46013L,46014L,46015L,46016L,46017L,
+46018L,46019L,46020L,46021L,46022L,46023L,46024L,46025L,46026L,46027L,
+46028L,46029L,46030L,46031L,46032L,46033L,46034L,46035L,46036L,46037L,
+46038L,46039L,46040L,46041L,46042L,46043L,46044L,46045L,46046L,46047L,
+46048L,46049L,46050L,46051L,46052L,46053L,46054L,46055L,46056L,46057L,
+46058L,46059L,46060L,46061L,46062L,46063L,46064L,46065L,46066L,46067L,
+46068L,46069L,46070L,46071L,46072L,46073L,46074L,46075L,46076L,46077L,
+46078L,46079L,46080L,46081L,46082L,46083L,46084L,46085L,46086L,46087L,
+46088L,46089L,46090L,46091L,46092L,46093L,46094L,46095L,46096L,46097L,
+46098L,46099L,46100L,46101L,46102L,46103L,46104L,46105L,46106L,46107L,
+46108L,46109L,46110L,46111L,46112L,46113L,46114L,46115L,46116L,46117L,
+46118L,46119L,46120L,46121L,46122L,46123L,46124L,46125L,46126L,46127L,
+46128L,46129L,46130L,46131L,46132L,46133L,46134L,46135L,46136L,46137L,
+46138L,46139L,46140L,46141L,46142L,46143L,46144L,46145L,46146L,46147L,
+46148L,46149L,46150L,46151L,46152L,46153L,46154L,46155L,46156L,46157L,
+46158L,46159L,46160L,46161L,46162L,46163L,46164L,46165L,46166L,46167L,
+46168L,46169L,46170L,46171L,46172L,46173L,46174L,46175L,46176L,46177L,
+46178L,46179L,46180L,46181L,46182L,46183L,46184L,46185L,46186L,46187L,
+46188L,46189L,46190L,46191L,46192L,46193L,46194L,46195L,46196L,46197L,
+46198L,46199L,46200L,46201L,46202L,46203L,46204L,46205L,46206L,46207L,
+46208L,46209L,46210L,46211L,46212L,46213L,46214L,46215L,46216L,46217L,
+46218L,46219L,46220L,46221L,46222L,46223L,46224L,46225L,46226L,46227L,
+46228L,46229L,46230L,46231L,46232L,46233L,46234L,46235L,46236L,46237L,
+46238L,46239L,46240L,46241L,46242L,46243L,46244L,46245L,46246L,46247L,
+46248L,46249L,46250L,46251L,46252L,46253L,46254L,46255L,46256L,46257L,
+46258L,46259L,46260L,46261L,46262L,46263L,46264L,46265L,46266L,46267L,
+46268L,46269L,46270L,46271L,46272L,46273L,46274L,46275L,46276L,46277L,
+46278L,46279L,46280L,46281L,46282L,46283L,46284L,46285L,46286L,46287L,
+46288L,46289L,46290L,46291L,46292L,46293L,46294L,46295L,46296L,46297L,
+46298L,46299L,46300L,46301L,46302L,46303L,46304L,46305L,46306L,46307L,
+46308L,46309L,46310L,46311L,46312L,46313L,46314L,46315L,46316L,46317L,
+46318L,46319L,46320L,46321L,46322L,46323L,46324L,46325L,46326L,46327L,
+46328L,46329L,46330L,46331L,46332L,46333L,46334L,46335L,46336L,46337L,
+46338L,46339L,46340L,46341L,46342L,46343L,46344L,46345L,46346L,46347L,
+46348L,46349L,46350L,46351L,46352L,46353L,46354L,46355L,46356L,46357L,
+46358L,46359L,46360L,46361L,46362L,46363L,46364L,46365L,46366L,46367L,
+46368L,46369L,46370L,46371L,46372L,46373L,46374L,46375L,46376L,46377L,
+46378L,46379L,46380L,46381L,46382L,46383L,46384L,46385L,46386L,46387L,
+46388L,46389L,46390L,46391L,46392L,46393L,46394L,46395L,46396L,46397L,
+46398L,46399L,46400L,46401L,46402L,46403L,46404L,46405L,46406L,46407L,
+46408L,46409L,46410L,46411L,46412L,46413L,46414L,46415L,46416L,46417L,
+46418L,46419L,46420L,46421L,46422L,46423L,46424L,46425L,46426L,46427L,
+46428L,46429L,46430L,46431L,46432L,46433L,46434L,46435L,46436L,46437L,
+46438L,46439L,46440L,46441L,46442L,46443L,46444L,46445L,46446L,46447L,
+46448L,46449L,46450L,46451L,46452L,46453L,46454L,46455L,46456L,46457L,
+46458L,46459L,46460L,46461L,46462L,46463L,46464L,46465L,46466L,46467L,
+46468L,46469L,46470L,46471L,46472L,46473L,46474L,46475L,46476L,46477L,
+46478L,46479L,46480L,46481L,46482L,46483L,46484L,46485L,46486L,46487L,
+46488L,46489L,46490L,46491L,46492L,46493L,46494L,46495L,46496L,46497L,
+46498L,46499L,46500L,46501L,46502L,46503L,46504L,46505L,46506L,46507L,
+46508L,46509L,46510L,46511L,46512L,46513L,46514L,46515L,46516L,46517L,
+46518L,46519L,46520L,46521L,46522L,46523L,46524L,46525L,46526L,46527L,
+46528L,46529L,46530L,46531L,46532L,46533L,46534L,46535L,46536L,46537L,
+46538L,46539L,46540L,46541L,46542L,46543L,46544L,46545L,46546L,46547L,
+46548L,46549L,46550L,46551L,46552L,46553L,46554L,46555L,46556L,46557L,
+46558L,46559L,46560L,46561L,46562L,46563L,46564L,46565L,46566L,46567L,
+46568L,46569L,46570L,46571L,46572L,46573L,46574L,46575L,46576L,46577L,
+46578L,46579L,46580L,46581L,46582L,46583L,46584L,46585L,46586L,46587L,
+46588L,46589L,46590L,46591L,46592L,46593L,46594L,46595L,46596L,46597L,
+46598L,46599L,46600L,46601L,46602L,46603L,46604L,46605L,46606L,46607L,
+46608L,46609L,46610L,46611L,46612L,46613L,46614L,46615L,46616L,46617L,
+46618L,46619L,46620L,46621L,46622L,46623L,46624L,46625L,46626L,46627L,
+46628L,46629L,46630L,46631L,46632L,46633L,46634L,46635L,46636L,46637L,
+46638L,46639L,46640L,46641L,46642L,46643L,46644L,46645L,46646L,46647L,
+46648L,46649L,46650L,46651L,46652L,46653L,46654L,46655L,46656L,46657L,
+46658L,46659L,46660L,46661L,46662L,46663L,46664L,46665L,46666L,46667L,
+46668L,46669L,46670L,46671L,46672L,46673L,46674L,46675L,46676L,46677L,
+46678L,46679L,46680L,46681L,46682L,46683L,46684L,46685L,46686L,46687L,
+46688L,46689L,46690L,46691L,46692L,46693L,46694L,46695L,46696L,46697L,
+46698L,46699L,46700L,46701L,46702L,46703L,46704L,46705L,46706L,46707L,
+46708L,46709L,46710L,46711L,46712L,46713L,46714L,46715L,46716L,46717L,
+46718L,46719L,46720L,46721L,46722L,46723L,46724L,46725L,46726L,46727L,
+46728L,46729L,46730L,46731L,46732L,46733L,46734L,46735L,46736L,46737L,
+46738L,46739L,46740L,46741L,46742L,46743L,46744L,46745L,46746L,46747L,
+46748L,46749L,46750L,46751L,46752L,46753L,46754L,46755L,46756L,46757L,
+46758L,46759L,46760L,46761L,46762L,46763L,46764L,46765L,46766L,46767L,
+46768L,46769L,46770L,46771L,46772L,46773L,46774L,46775L,46776L,46777L,
+46778L,46779L,46780L,46781L,46782L,46783L,46784L,46785L,46786L,46787L,
+46788L,46789L,46790L,46791L,46792L,46793L,46794L,46795L,46796L,46797L,
+46798L,46799L,46800L,46801L,46802L,46803L,46804L,46805L,46806L,46807L,
+46808L,46809L,46810L,46811L,46812L,46813L,46814L,46815L,46816L,46817L,
+46818L,46819L,46820L,46821L,46822L,46823L,46824L,46825L,46826L,46827L,
+46828L,46829L,46830L,46831L,46832L,46833L,46834L,46835L,46836L,46837L,
+46838L,46839L,46840L,46841L,46842L,46843L,46844L,46845L,46846L,46847L,
+46848L,46849L,46850L,46851L,46852L,46853L,46854L,46855L,46856L,46857L,
+46858L,46859L,46860L,46861L,46862L,46863L,46864L,46865L,46866L,46867L,
+46868L,46869L,46870L,46871L,46872L,46873L,46874L,46875L,46876L,46877L,
+46878L,46879L,46880L,46881L,46882L,46883L,46884L,46885L,46886L,46887L,
+46888L,46889L,46890L,46891L,46892L,46893L,46894L,46895L,46896L,46897L,
+46898L,46899L,46900L,46901L,46902L,46903L,46904L,46905L,46906L,46907L,
+46908L,46909L,46910L,46911L,46912L,46913L,46914L,46915L,46916L,46917L,
+46918L,46919L,46920L,46921L,46922L,46923L,46924L,46925L,46926L,46927L,
+46928L,46929L,46930L,46931L,46932L,46933L,46934L,46935L,46936L,46937L,
+46938L,46939L,46940L,46941L,46942L,46943L,46944L,46945L,46946L,46947L,
+46948L,46949L,46950L,46951L,46952L,46953L,46954L,46955L,46956L,46957L,
+46958L,46959L,46960L,46961L,46962L,46963L,46964L,46965L,46966L,46967L,
+46968L,46969L,46970L,46971L,46972L,46973L,46974L,46975L,46976L,46977L,
+46978L,46979L,46980L,46981L,46982L,46983L,46984L,46985L,46986L,46987L,
+46988L,46989L,46990L,46991L,46992L,46993L,46994L,46995L,46996L,46997L,
+46998L,46999L,47000L,47001L,47002L,47003L,47004L,47005L,47006L,47007L,
+47008L,47009L,47010L,47011L,47012L,47013L,47014L,47015L,47016L,47017L,
+47018L,47019L,47020L,47021L,47022L,47023L,47024L,47025L,47026L,47027L,
+47028L,47029L,47030L,47031L,47032L,47033L,47034L,47035L,47036L,47037L,
+47038L,47039L,47040L,47041L,47042L,47043L,47044L,47045L,47046L,47047L,
+47048L,47049L,47050L,47051L,47052L,47053L,47054L,47055L,47056L,47057L,
+47058L,47059L,47060L,47061L,47062L,47063L,47064L,47065L,47066L,47067L,
+47068L,47069L,47070L,47071L,47072L,47073L,47074L,47075L,47076L,47077L,
+47078L,47079L,47080L,47081L,47082L,47083L,47084L,47085L,47086L,47087L,
+47088L,47089L,47090L,47091L,47092L,47093L,47094L,47095L,47096L,47097L,
+47098L,47099L,47100L,47101L,47102L,47103L,47104L,47105L,47106L,47107L,
+47108L,47109L,47110L,47111L,47112L,47113L,47114L,47115L,47116L,47117L,
+47118L,47119L,47120L,47121L,47122L,47123L,47124L,47125L,47126L,47127L,
+47128L,47129L,47130L,47131L,47132L,47133L,47134L,47135L,47136L,47137L,
+47138L,47139L,47140L,47141L,47142L,47143L,47144L,47145L,47146L,47147L,
+47148L,47149L,47150L,47151L,47152L,47153L,47154L,47155L,47156L,47157L,
+47158L,47159L,47160L,47161L,47162L,47163L,47164L,47165L,47166L,47167L,
+47168L,47169L,47170L,47171L,47172L,47173L,47174L,47175L,47176L,47177L,
+47178L,47179L,47180L,47181L,47182L,47183L,47184L,47185L,47186L,47187L,
+47188L,47189L,47190L,47191L,47192L,47193L,47194L,47195L,47196L,47197L,
+47198L,47199L,47200L,47201L,47202L,47203L,47204L,47205L,47206L,47207L,
+47208L,47209L,47210L,47211L,47212L,47213L,47214L,47215L,47216L,47217L,
+47218L,47219L,47220L,47221L,47222L,47223L,47224L,47225L,47226L,47227L,
+47228L,47229L,47230L,47231L,47232L,47233L,47234L,47235L,47236L,47237L,
+47238L,47239L,47240L,47241L,47242L,47243L,47244L,47245L,47246L,47247L,
+47248L,47249L,47250L,47251L,47252L,47253L,47254L,47255L,47256L,47257L,
+47258L,47259L,47260L,47261L,47262L,47263L,47264L,47265L,47266L,47267L,
+47268L,47269L,47270L,47271L,47272L,47273L,47274L,47275L,47276L,47277L,
+47278L,47279L,47280L,47281L,47282L,47283L,47284L,47285L,47286L,47287L,
+47288L,47289L,47290L,47291L,47292L,47293L,47294L,47295L,47296L,47297L,
+47298L,47299L,47300L,47301L,47302L,47303L,47304L,47305L,47306L,47307L,
+47308L,47309L,47310L,47311L,47312L,47313L,47314L,47315L,47316L,47317L,
+47318L,47319L,47320L,47321L,47322L,47323L,47324L,47325L,47326L,47327L,
+47328L,47329L,47330L,47331L,47332L,47333L,47334L,47335L,47336L,47337L,
+47338L,47339L,47340L,47341L,47342L,47343L,47344L,47345L,47346L,47347L,
+47348L,47349L,47350L,47351L,47352L,47353L,47354L,47355L,47356L,47357L,
+47358L,47359L,47360L,47361L,47362L,47363L,47364L,47365L,47366L,47367L,
+47368L,47369L,47370L,47371L,47372L,47373L,47374L,47375L,47376L,47377L,
+47378L,47379L,47380L,47381L,47382L,47383L,47384L,47385L,47386L,47387L,
+47388L,47389L,47390L,47391L,47392L,47393L,47394L,47395L,47396L,47397L,
+47398L,47399L,47400L,47401L,47402L,47403L,47404L,47405L,47406L,47407L,
+47408L,47409L,47410L,47411L,47412L,47413L,47414L,47415L,47416L,47417L,
+47418L,47419L,47420L,47421L,47422L,47423L,47424L,47425L,47426L,47427L,
+47428L,47429L,47430L,47431L,47432L,47433L,47434L,47435L,47436L,47437L,
+47438L,47439L,47440L,47441L,47442L,47443L,47444L,47445L,47446L,47447L,
+47448L,47449L,47450L,47451L,47452L,47453L,47454L,47455L,47456L,47457L,
+47458L,47459L,47460L,47461L,47462L,47463L,47464L,47465L,47466L,47467L,
+47468L,47469L,47470L,47471L,47472L,47473L,47474L,47475L,47476L,47477L,
+47478L,47479L,47480L,47481L,47482L,47483L,47484L,47485L,47486L,47487L,
+47488L,47489L,47490L,47491L,47492L,47493L,47494L,47495L,47496L,47497L,
+47498L,47499L,47500L,47501L,47502L,47503L,47504L,47505L,47506L,47507L,
+47508L,47509L,47510L,47511L,47512L,47513L,47514L,47515L,47516L,47517L,
+47518L,47519L,47520L,47521L,47522L,47523L,47524L,47525L,47526L,47527L,
+47528L,47529L,47530L,47531L,47532L,47533L,47534L,47535L,47536L,47537L,
+47538L,47539L,47540L,47541L,47542L,47543L,47544L,47545L,47546L,47547L,
+47548L,47549L,47550L,47551L,47552L,47553L,47554L,47555L,47556L,47557L,
+47558L,47559L,47560L,47561L,47562L,47563L,47564L,47565L,47566L,47567L,
+47568L,47569L,47570L,47571L,47572L,47573L,47574L,47575L,47576L,47577L,
+47578L,47579L,47580L,47581L,47582L,47583L,47584L,47585L,47586L,47587L,
+47588L,47589L,47590L,47591L,47592L,47593L,47594L,47595L,47596L,47597L,
+47598L,47599L,47600L,47601L,47602L,47603L,47604L,47605L,47606L,47607L,
+47608L,47609L,47610L,47611L,47612L,47613L,47614L,47615L,47616L,47617L,
+47618L,47619L,47620L,47621L,47622L,47623L,47624L,47625L,47626L,47627L,
+47628L,47629L,47630L,47631L,47632L,47633L,47634L,47635L,47636L,47637L,
+47638L,47639L,47640L,47641L,47642L,47643L,47644L,47645L,47646L,47647L,
+47648L,47649L,47650L,47651L,47652L,47653L,47654L,47655L,47656L,47657L,
+47658L,47659L,47660L,47661L,47662L,47663L,47664L,47665L,47666L,47667L,
+47668L,47669L,47670L,47671L,47672L,47673L,47674L,47675L,47676L,47677L,
+47678L,47679L,47680L,47681L,47682L,47683L,47684L,47685L,47686L,47687L,
+47688L,47689L,47690L,47691L,47692L,47693L,47694L,47695L,47696L,47697L,
+47698L,47699L,47700L,47701L,47702L,47703L,47704L,47705L,47706L,47707L,
+47708L,47709L,47710L,47711L,47712L,47713L,47714L,47715L,47716L,47717L,
+47718L,47719L,47720L,47721L,47722L,47723L,47724L,47725L,47726L,47727L,
+47728L,47729L,47730L,47731L,47732L,47733L,47734L,47735L,47736L,47737L,
+47738L,47739L,47740L,47741L,47742L,47743L,47744L,47745L,47746L,47747L,
+47748L,47749L,47750L,47751L,47752L,47753L,47754L,47755L,47756L,47757L,
+47758L,47759L,47760L,47761L,47762L,47763L,47764L,47765L,47766L,47767L,
+47768L,47769L,47770L,47771L,47772L,47773L,47774L,47775L,47776L,47777L,
+47778L,47779L,47780L,47781L,47782L,47783L,47784L,47785L,47786L,47787L,
+47788L,47789L,47790L,47791L,47792L,47793L,47794L,47795L,47796L,47797L,
+47798L,47799L,47800L,47801L,47802L,47803L,47804L,47805L,47806L,47807L,
+47808L,47809L,47810L,47811L,47812L,47813L,47814L,47815L,47816L,47817L,
+47818L,47819L,47820L,47821L,47822L,47823L,47824L,47825L,47826L,47827L,
+47828L,47829L,47830L,47831L,47832L,47833L,47834L,47835L,47836L,47837L,
+47838L,47839L,47840L,47841L,47842L,47843L,47844L,47845L,47846L,47847L,
+47848L,47849L,47850L,47851L,47852L,47853L,47854L,47855L,47856L,47857L,
+47858L,47859L,47860L,47861L,47862L,47863L,47864L,47865L,47866L,47867L,
+47868L,47869L,47870L,47871L,47872L,47873L,47874L,47875L,47876L,47877L,
+47878L,47879L,47880L,47881L,47882L,47883L,47884L,47885L,47886L,47887L,
+47888L,47889L,47890L,47891L,47892L,47893L,47894L,47895L,47896L,47897L,
+47898L,47899L,47900L,47901L,47902L,47903L,47904L,47905L,47906L,47907L,
+47908L,47909L,47910L,47911L,47912L,47913L,47914L,47915L,47916L,47917L,
+47918L,47919L,47920L,47921L,47922L,47923L,47924L,47925L,47926L,47927L,
+47928L,47929L,47930L,47931L,47932L,47933L,47934L,47935L,47936L,47937L,
+47938L,47939L,47940L,47941L,47942L,47943L,47944L,47945L,47946L,47947L,
+47948L,47949L,47950L,47951L,47952L,47953L,47954L,47955L,47956L,47957L,
+47958L,47959L,47960L,47961L,47962L,47963L,47964L,47965L,47966L,47967L,
+47968L,47969L,47970L,47971L,47972L,47973L,47974L,47975L,47976L,47977L,
+47978L,47979L,47980L,47981L,47982L,47983L,47984L,47985L,47986L,47987L,
+47988L,47989L,47990L,47991L,47992L,47993L,47994L,47995L,47996L,47997L,
+47998L,47999L,48000L,48001L,48002L,48003L,48004L,48005L,48006L,48007L,
+48008L,48009L,48010L,48011L,48012L,48013L,48014L,48015L,48016L,48017L,
+48018L,48019L,48020L,48021L,48022L,48023L,48024L,48025L,48026L,48027L,
+48028L,48029L,48030L,48031L,48032L,48033L,48034L,48035L,48036L,48037L,
+48038L,48039L,48040L,48041L,48042L,48043L,48044L,48045L,48046L,48047L,
+48048L,48049L,48050L,48051L,48052L,48053L,48054L,48055L,48056L,48057L,
+48058L,48059L,48060L,48061L,48062L,48063L,48064L,48065L,48066L,48067L,
+48068L,48069L,48070L,48071L,48072L,48073L,48074L,48075L,48076L,48077L,
+48078L,48079L,48080L,48081L,48082L,48083L,48084L,48085L,48086L,48087L,
+48088L,48089L,48090L,48091L,48092L,48093L,48094L,48095L,48096L,48097L,
+48098L,48099L,48100L,48101L,48102L,48103L,48104L,48105L,48106L,48107L,
+48108L,48109L,48110L,48111L,48112L,48113L,48114L,48115L,48116L,48117L,
+48118L,48119L,48120L,48121L,48122L,48123L,48124L,48125L,48126L,48127L,
+48128L,48129L,48130L,48131L,48132L,48133L,48134L,48135L,48136L,48137L,
+48138L,48139L,48140L,48141L,48142L,48143L,48144L,48145L,48146L,48147L,
+48148L,48149L,48150L,48151L,48152L,48153L,48154L,48155L,48156L,48157L,
+48158L,48159L,48160L,48161L,48162L,48163L,48164L,48165L,48166L,48167L,
+48168L,48169L,48170L,48171L,48172L,48173L,48174L,48175L,48176L,48177L,
+48178L,48179L,48180L,48181L,48182L,48183L,48184L,48185L,48186L,48187L,
+48188L,48189L,48190L,48191L,48192L,48193L,48194L,48195L,48196L,48197L,
+48198L,48199L,48200L,48201L,48202L,48203L,48204L,48205L,48206L,48207L,
+48208L,48209L,48210L,48211L,48212L,48213L,48214L,48215L,48216L,48217L,
+48218L,48219L,48220L,48221L,48222L,48223L,48224L,48225L,48226L,48227L,
+48228L,48229L,48230L,48231L,48232L,48233L,48234L,48235L,48236L,48237L,
+48238L,48239L,48240L,48241L,48242L,48243L,48244L,48245L,48246L,48247L,
+48248L,48249L,48250L,48251L,48252L,48253L,48254L,48255L,48256L,48257L,
+48258L,48259L,48260L,48261L,48262L,48263L,48264L,48265L,48266L,48267L,
+48268L,48269L,48270L,48271L,48272L,48273L,48274L,48275L,48276L,48277L,
+48278L,48279L,48280L,48281L,48282L,48283L,48284L,48285L,48286L,48287L,
+48288L,48289L,48290L,48291L,48292L,48293L,48294L,48295L,48296L,48297L,
+48298L,48299L,48300L,48301L,48302L,48303L,48304L,48305L,48306L,48307L,
+48308L,48309L,48310L,48311L,48312L,48313L,48314L,48315L,48316L,48317L,
+48318L,48319L,48320L,48321L,48322L,48323L,48324L,48325L,48326L,48327L,
+48328L,48329L,48330L,48331L,48332L,48333L,48334L,48335L,48336L,48337L,
+48338L,48339L,48340L,48341L,48342L,48343L,48344L,48345L,48346L,48347L,
+48348L,48349L,48350L,48351L,48352L,48353L,48354L,48355L,48356L,48357L,
+48358L,48359L,48360L,48361L,48362L,48363L,48364L,48365L,48366L,48367L,
+48368L,48369L,48370L,48371L,48372L,48373L,48374L,48375L,48376L,48377L,
+48378L,48379L,48380L,48381L,48382L,48383L,48384L,48385L,48386L,48387L,
+48388L,48389L,48390L,48391L,48392L,48393L,48394L,48395L,48396L,48397L,
+48398L,48399L,48400L,48401L,48402L,48403L,48404L,48405L,48406L,48407L,
+48408L,48409L,48410L,48411L,48412L,48413L,48414L,48415L,48416L,48417L,
+48418L,48419L,48420L,48421L,48422L,48423L,48424L,48425L,48426L,48427L,
+48428L,48429L,48430L,48431L,48432L,48433L,48434L,48435L,48436L,48437L,
+48438L,48439L,48440L,48441L,48442L,48443L,48444L,48445L,48446L,48447L,
+48448L,48449L,48450L,48451L,48452L,48453L,48454L,48455L,48456L,48457L,
+48458L,48459L,48460L,48461L,48462L,48463L,48464L,48465L,48466L,48467L,
+48468L,48469L,48470L,48471L,48472L,48473L,48474L,48475L,48476L,48477L,
+48478L,48479L,48480L,48481L,48482L,48483L,48484L,48485L,48486L,48487L,
+48488L,48489L,48490L,48491L,48492L,48493L,48494L,48495L,48496L,48497L,
+48498L,48499L,48500L,48501L,48502L,48503L,48504L,48505L,48506L,48507L,
+48508L,48509L,48510L,48511L,48512L,48513L,48514L,48515L,48516L,48517L,
+48518L,48519L,48520L,48521L,48522L,48523L,48524L,48525L,48526L,48527L,
+48528L,48529L,48530L,48531L,48532L,48533L,48534L,48535L,48536L,48537L,
+48538L,48539L,48540L,48541L,48542L,48543L,48544L,48545L,48546L,48547L,
+48548L,48549L,48550L,48551L,48552L,48553L,48554L,48555L,48556L,48557L,
+48558L,48559L,48560L,48561L,48562L,48563L,48564L,48565L,48566L,48567L,
+48568L,48569L,48570L,48571L,48572L,48573L,48574L,48575L,48576L,48577L,
+48578L,48579L,48580L,48581L,48582L,48583L,48584L,48585L,48586L,48587L,
+48588L,48589L,48590L,48591L,48592L,48593L,48594L,48595L,48596L,48597L,
+48598L,48599L,48600L,48601L,48602L,48603L,48604L,48605L,48606L,48607L,
+48608L,48609L,48610L,48611L,48612L,48613L,48614L,48615L,48616L,48617L,
+48618L,48619L,48620L,48621L,48622L,48623L,48624L,48625L,48626L,48627L,
+48628L,48629L,48630L,48631L,48632L,48633L,48634L,48635L,48636L,48637L,
+48638L,48639L,48640L,48641L,48642L,48643L,48644L,48645L,48646L,48647L,
+48648L,48649L,48650L,48651L,48652L,48653L,48654L,48655L,48656L,48657L,
+48658L,48659L,48660L,48661L,48662L,48663L,48664L,48665L,48666L,48667L,
+48668L,48669L,48670L,48671L,48672L,48673L,48674L,48675L,48676L,48677L,
+48678L,48679L,48680L,48681L,48682L,48683L,48684L,48685L,48686L,48687L,
+48688L,48689L,48690L,48691L,48692L,48693L,48694L,48695L,48696L,48697L,
+48698L,48699L,48700L,48701L,48702L,48703L,48704L,48705L,48706L,48707L,
+48708L,48709L,48710L,48711L,48712L,48713L,48714L,48715L,48716L,48717L,
+48718L,48719L,48720L,48721L,48722L,48723L,48724L,48725L,48726L,48727L,
+48728L,48729L,48730L,48731L,48732L,48733L,48734L,48735L,48736L,48737L,
+48738L,48739L,48740L,48741L,48742L,48743L,48744L,48745L,48746L,48747L,
+48748L,48749L,48750L,48751L,48752L,48753L,48754L,48755L,48756L,48757L,
+48758L,48759L,48760L,48761L,48762L,48763L,48764L,48765L,48766L,48767L,
+48768L,48769L,48770L,48771L,48772L,48773L,48774L,48775L,48776L,48777L,
+48778L,48779L,48780L,48781L,48782L,48783L,48784L,48785L,48786L,48787L,
+48788L,48789L,48790L,48791L,48792L,48793L,48794L,48795L,48796L,48797L,
+48798L,48799L,48800L,48801L,48802L,48803L,48804L,48805L,48806L,48807L,
+48808L,48809L,48810L,48811L,48812L,48813L,48814L,48815L,48816L,48817L,
+48818L,48819L,48820L,48821L,48822L,48823L,48824L,48825L,48826L,48827L,
+48828L,48829L,48830L,48831L,48832L,48833L,48834L,48835L,48836L,48837L,
+48838L,48839L,48840L,48841L,48842L,48843L,48844L,48845L,48846L,48847L,
+48848L,48849L,48850L,48851L,48852L,48853L,48854L,48855L,48856L,48857L,
+48858L,48859L,48860L,48861L,48862L,48863L,48864L,48865L,48866L,48867L,
+48868L,48869L,48870L,48871L,48872L,48873L,48874L,48875L,48876L,48877L,
+48878L,48879L,48880L,48881L,48882L,48883L,48884L,48885L,48886L,48887L,
+48888L,48889L,48890L,48891L,48892L,48893L,48894L,48895L,48896L,48897L,
+48898L,48899L,48900L,48901L,48902L,48903L,48904L,48905L,48906L,48907L,
+48908L,48909L,48910L,48911L,48912L,48913L,48914L,48915L,48916L,48917L,
+48918L,48919L,48920L,48921L,48922L,48923L,48924L,48925L,48926L,48927L,
+48928L,48929L,48930L,48931L,48932L,48933L,48934L,48935L,48936L,48937L,
+48938L,48939L,48940L,48941L,48942L,48943L,48944L,48945L,48946L,48947L,
+48948L,48949L,48950L,48951L,48952L,48953L,48954L,48955L,48956L,48957L,
+48958L,48959L,48960L,48961L,48962L,48963L,48964L,48965L,48966L,48967L,
+48968L,48969L,48970L,48971L,48972L,48973L,48974L,48975L,48976L,48977L,
+48978L,48979L,48980L,48981L,48982L,48983L,48984L,48985L,48986L,48987L,
+48988L,48989L,48990L,48991L,48992L,48993L,48994L,48995L,48996L,48997L,
+48998L,48999L,49000L,49001L,49002L,49003L,49004L,49005L,49006L,49007L,
+49008L,49009L,49010L,49011L,49012L,49013L,49014L,49015L,49016L,49017L,
+49018L,49019L,49020L,49021L,49022L,49023L,49024L,49025L,49026L,49027L,
+49028L,49029L,49030L,49031L,49032L,49033L,49034L,49035L,49036L,49037L,
+49038L,49039L,49040L,49041L,49042L,49043L,49044L,49045L,49046L,49047L,
+49048L,49049L,49050L,49051L,49052L,49053L,49054L,49055L,49056L,49057L,
+49058L,49059L,49060L,49061L,49062L,49063L,49064L,49065L,49066L,49067L,
+49068L,49069L,49070L,49071L,49072L,49073L,49074L,49075L,49076L,49077L,
+49078L,49079L,49080L,49081L,49082L,49083L,49084L,49085L,49086L,49087L,
+49088L,49089L,49090L,49091L,49092L,49093L,49094L,49095L,49096L,49097L,
+49098L,49099L,49100L,49101L,49102L,49103L,49104L,49105L,49106L,49107L,
+49108L,49109L,49110L,49111L,49112L,49113L,49114L,49115L,49116L,49117L,
+49118L,49119L,49120L,49121L,49122L,49123L,49124L,49125L,49126L,49127L,
+49128L,49129L,49130L,49131L,49132L,49133L,49134L,49135L,49136L,49137L,
+49138L,49139L,49140L,49141L,49142L,49143L,49144L,49145L,49146L,49147L,
+49148L,49149L,49150L,49151L,49152L,49153L,49154L,49155L,49156L,49157L,
+49158L,49159L,49160L,49161L,49162L,49163L,49164L,49165L,49166L,49167L,
+49168L,49169L,49170L,49171L,49172L,49173L,49174L,49175L,49176L,49177L,
+49178L,49179L,49180L,49181L,49182L,49183L,49184L,49185L,49186L,49187L,
+49188L,49189L,49190L,49191L,49192L,49193L,49194L,49195L,49196L,49197L,
+49198L,49199L,49200L,49201L,49202L,49203L,49204L,49205L,49206L,49207L,
+49208L,49209L,49210L,49211L,49212L,49213L,49214L,49215L,49216L,49217L,
+49218L,49219L,49220L,49221L,49222L,49223L,49224L,49225L,49226L,49227L,
+49228L,49229L,49230L,49231L,49232L,49233L,49234L,49235L,49236L,49237L,
+49238L,49239L,49240L,49241L,49242L,49243L,49244L,49245L,49246L,49247L,
+49248L,49249L,49250L,49251L,49252L,49253L,49254L,49255L,49256L,49257L,
+49258L,49259L,49260L,49261L,49262L,49263L,49264L,49265L,49266L,49267L,
+49268L,49269L,49270L,49271L,49272L,49273L,49274L,49275L,49276L,49277L,
+49278L,49279L,49280L,49281L,49282L,49283L,49284L,49285L,49286L,49287L,
+49288L,49289L,49290L,49291L,49292L,49293L,49294L,49295L,49296L,49297L,
+49298L,49299L,49300L,49301L,49302L,49303L,49304L,49305L,49306L,49307L,
+49308L,49309L,49310L,49311L,49312L,49313L,49314L,49315L,49316L,49317L,
+49318L,49319L,49320L,49321L,49322L,49323L,49324L,49325L,49326L,49327L,
+49328L,49329L,49330L,49331L,49332L,49333L,49334L,49335L,49336L,49337L,
+49338L,49339L,49340L,49341L,49342L,49343L,49344L,49345L,49346L,49347L,
+49348L,49349L,49350L,49351L,49352L,49353L,49354L,49355L,49356L,49357L,
+49358L,49359L,49360L,49361L,49362L,49363L,49364L,49365L,49366L,49367L,
+49368L,49369L,49370L,49371L,49372L,49373L,49374L,49375L,49376L,49377L,
+49378L,49379L,49380L,49381L,49382L,49383L,49384L,49385L,49386L,49387L,
+49388L,49389L,49390L,49391L,49392L,49393L,49394L,49395L,49396L,49397L,
+49398L,49399L,49400L,49401L,49402L,49403L,49404L,49405L,49406L,49407L,
+49408L,49409L,49410L,49411L,49412L,49413L,49414L,49415L,49416L,49417L,
+49418L,49419L,49420L,49421L,49422L,49423L,49424L,49425L,49426L,49427L,
+49428L,49429L,49430L,49431L,49432L,49433L,49434L,49435L,49436L,49437L,
+49438L,49439L,49440L,49441L,49442L,49443L,49444L,49445L,49446L,49447L,
+49448L,49449L,49450L,49451L,49452L,49453L,49454L,49455L,49456L,49457L,
+49458L,49459L,49460L,49461L,49462L,49463L,49464L,49465L,49466L,49467L,
+49468L,49469L,49470L,49471L,49472L,49473L,49474L,49475L,49476L,49477L,
+49478L,49479L,49480L,49481L,49482L,49483L,49484L,49485L,49486L,49487L,
+49488L,49489L,49490L,49491L,49492L,49493L,49494L,49495L,49496L,49497L,
+49498L,49499L,49500L,49501L,49502L,49503L,49504L,49505L,49506L,49507L,
+49508L,49509L,49510L,49511L,49512L,49513L,49514L,49515L,49516L,49517L,
+49518L,49519L,49520L,49521L,49522L,49523L,49524L,49525L,49526L,49527L,
+49528L,49529L,49530L,49531L,49532L,49533L,49534L,49535L,49536L,49537L,
+49538L,49539L,49540L,49541L,49542L,49543L,49544L,49545L,49546L,49547L,
+49548L,49549L,49550L,49551L,49552L,49553L,49554L,49555L,49556L,49557L,
+49558L,49559L,49560L,49561L,49562L,49563L,49564L,49565L,49566L,49567L,
+49568L,49569L,49570L,49571L,49572L,49573L,49574L,49575L,49576L,49577L,
+49578L,49579L,49580L,49581L,49582L,49583L,49584L,49585L,49586L,49587L,
+49588L,49589L,49590L,49591L,49592L,49593L,49594L,49595L,49596L,49597L,
+49598L,49599L,49600L,49601L,49602L,49603L,49604L,49605L,49606L,49607L,
+49608L,49609L,49610L,49611L,49612L,49613L,49614L,49615L,49616L,49617L,
+49618L,49619L,49620L,49621L,49622L,49623L,49624L,49625L,49626L,49627L,
+49628L,49629L,49630L,49631L,49632L,49633L,49634L,49635L,49636L,49637L,
+49638L,49639L,49640L,49641L,49642L,49643L,49644L,49645L,49646L,49647L,
+49648L,49649L,49650L,49651L,49652L,49653L,49654L,49655L,49656L,49657L,
+49658L,49659L,49660L,49661L,49662L,49663L,49664L,49665L,49666L,49667L,
+49668L,49669L,49670L,49671L,49672L,49673L,49674L,49675L,49676L,49677L,
+49678L,49679L,49680L,49681L,49682L,49683L,49684L,49685L,49686L,49687L,
+49688L,49689L,49690L,49691L,49692L,49693L,49694L,49695L,49696L,49697L,
+49698L,49699L,49700L,49701L,49702L,49703L,49704L,49705L,49706L,49707L,
+49708L,49709L,49710L,49711L,49712L,49713L,49714L,49715L,49716L,49717L,
+49718L,49719L,49720L,49721L,49722L,49723L,49724L,49725L,49726L,49727L,
+49728L,49729L,49730L,49731L,49732L,49733L,49734L,49735L,49736L,49737L,
+49738L,49739L,49740L,49741L,49742L,49743L,49744L,49745L,49746L,49747L,
+49748L,49749L,49750L,49751L,49752L,49753L,49754L,49755L,49756L,49757L,
+49758L,49759L,49760L,49761L,49762L,49763L,49764L,49765L,49766L,49767L,
+49768L,49769L,49770L,49771L,49772L,49773L,49774L,49775L,49776L,49777L,
+49778L,49779L,49780L,49781L,49782L,49783L,49784L,49785L,49786L,49787L,
+49788L,49789L,49790L,49791L,49792L,49793L,49794L,49795L,49796L,49797L,
+49798L,49799L,49800L,49801L,49802L,49803L,49804L,49805L,49806L,49807L,
+49808L,49809L,49810L,49811L,49812L,49813L,49814L,49815L,49816L,49817L,
+49818L,49819L,49820L,49821L,49822L,49823L,49824L,49825L,49826L,49827L,
+49828L,49829L,49830L,49831L,49832L,49833L,49834L,49835L,49836L,49837L,
+49838L,49839L,49840L,49841L,49842L,49843L,49844L,49845L,49846L,49847L,
+49848L,49849L,49850L,49851L,49852L,49853L,49854L,49855L,49856L,49857L,
+49858L,49859L,49860L,49861L,49862L,49863L,49864L,49865L,49866L,49867L,
+49868L,49869L,49870L,49871L,49872L,49873L,49874L,49875L,49876L,49877L,
+49878L,49879L,49880L,49881L,49882L,49883L,49884L,49885L,49886L,49887L,
+49888L,49889L,49890L,49891L,49892L,49893L,49894L,49895L,49896L,49897L,
+49898L,49899L,49900L,49901L,49902L,49903L,49904L,49905L,49906L,49907L,
+49908L,49909L,49910L,49911L,49912L,49913L,49914L,49915L,49916L,49917L,
+49918L,49919L,49920L,49921L,49922L,49923L,49924L,49925L,49926L,49927L,
+49928L,49929L,49930L,49931L,49932L,49933L,49934L,49935L,49936L,49937L,
+49938L,49939L,49940L,49941L,49942L,49943L,49944L,49945L,49946L,49947L,
+49948L,49949L,49950L,49951L,49952L,49953L,49954L,49955L,49956L,49957L,
+49958L,49959L,49960L,49961L,49962L,49963L,49964L,49965L,49966L,49967L,
+49968L,49969L,49970L,49971L,49972L,49973L,49974L,49975L,49976L,49977L,
+49978L,49979L,49980L,49981L,49982L,49983L,49984L,49985L,49986L,49987L,
+49988L,49989L,49990L,49991L,49992L,49993L,49994L,49995L,49996L,49997L,
+49998L,49999L,50000L,50001L,50002L,50003L,50004L,50005L,50006L,50007L,
+50008L,50009L,50010L,50011L,50012L,50013L,50014L,50015L,50016L,50017L,
+50018L,50019L,50020L,50021L,50022L,50023L,50024L,50025L,50026L,50027L,
+50028L,50029L,50030L,50031L,50032L,50033L,50034L,50035L,50036L,50037L,
+50038L,50039L,50040L,50041L,50042L,50043L,50044L,50045L,50046L,50047L,
+50048L,50049L,50050L,50051L,50052L,50053L,50054L,50055L,50056L,50057L,
+50058L,50059L,50060L,50061L,50062L,50063L,50064L,50065L,50066L,50067L,
+50068L,50069L,50070L,50071L,50072L,50073L,50074L,50075L,50076L,50077L,
+50078L,50079L,50080L,50081L,50082L,50083L,50084L,50085L,50086L,50087L,
+50088L,50089L,50090L,50091L,50092L,50093L,50094L,50095L,50096L,50097L,
+50098L,50099L,50100L,50101L,50102L,50103L,50104L,50105L,50106L,50107L,
+50108L,50109L,50110L,50111L,50112L,50113L,50114L,50115L,50116L,50117L,
+50118L,50119L,50120L,50121L,50122L,50123L,50124L,50125L,50126L,50127L,
+50128L,50129L,50130L,50131L,50132L,50133L,50134L,50135L,50136L,50137L,
+50138L,50139L,50140L,50141L,50142L,50143L,50144L,50145L,50146L,50147L,
+50148L,50149L,50150L,50151L,50152L,50153L,50154L,50155L,50156L,50157L,
+50158L,50159L,50160L,50161L,50162L,50163L,50164L,50165L,50166L,50167L,
+50168L,50169L,50170L,50171L,50172L,50173L,50174L,50175L,50176L,50177L,
+50178L,50179L,50180L,50181L,50182L,50183L,50184L,50185L,50186L,50187L,
+50188L,50189L,50190L,50191L,50192L,50193L,50194L,50195L,50196L,50197L,
+50198L,50199L,50200L,50201L,50202L,50203L,50204L,50205L,50206L,50207L,
+50208L,50209L,50210L,50211L,50212L,50213L,50214L,50215L,50216L,50217L,
+50218L,50219L,50220L,50221L,50222L,50223L,50224L,50225L,50226L,50227L,
+50228L,50229L,50230L,50231L,50232L,50233L,50234L,50235L,50236L,50237L,
+50238L,50239L,50240L,50241L,50242L,50243L,50244L,50245L,50246L,50247L,
+50248L,50249L,50250L,50251L,50252L,50253L,50254L,50255L,50256L,50257L,
+50258L,50259L,50260L,50261L,50262L,50263L,50264L,50265L,50266L,50267L,
+50268L,50269L,50270L,50271L,50272L,50273L,50274L,50275L,50276L,50277L,
+50278L,50279L,50280L,50281L,50282L,50283L,50284L,50285L,50286L,50287L,
+50288L,50289L,50290L,50291L,50292L,50293L,50294L,50295L,50296L,50297L,
+50298L,50299L,50300L,50301L,50302L,50303L,50304L,50305L,50306L,50307L,
+50308L,50309L,50310L,50311L,50312L,50313L,50314L,50315L,50316L,50317L,
+50318L,50319L,50320L,50321L,50322L,50323L,50324L,50325L,50326L,50327L,
+50328L,50329L,50330L,50331L,50332L,50333L,50334L,50335L,50336L,50337L,
+50338L,50339L,50340L,50341L,50342L,50343L,50344L,50345L,50346L,50347L,
+50348L,50349L,50350L,50351L,50352L,50353L,50354L,50355L,50356L,50357L,
+50358L,50359L,50360L,50361L,50362L,50363L,50364L,50365L,50366L,50367L,
+50368L,50369L,50370L,50371L,50372L,50373L,50374L,50375L,50376L,50377L,
+50378L,50379L,50380L,50381L,50382L,50383L,50384L,50385L,50386L,50387L,
+50388L,50389L,50390L,50391L,50392L,50393L,50394L,50395L,50396L,50397L,
+50398L,50399L,50400L,50401L,50402L,50403L,50404L,50405L,50406L,50407L,
+50408L,50409L,50410L,50411L,50412L,50413L,50414L,50415L,50416L,50417L,
+50418L,50419L,50420L,50421L,50422L,50423L,50424L,50425L,50426L,50427L,
+50428L,50429L,50430L,50431L,50432L,50433L,50434L,50435L,50436L,50437L,
+50438L,50439L,50440L,50441L,50442L,50443L,50444L,50445L,50446L,50447L,
+50448L,50449L,50450L,50451L,50452L,50453L,50454L,50455L,50456L,50457L,
+50458L,50459L,50460L,50461L,50462L,50463L,50464L,50465L,50466L,50467L,
+50468L,50469L,50470L,50471L,50472L,50473L,50474L,50475L,50476L,50477L,
+50478L,50479L,50480L,50481L,50482L,50483L,50484L,50485L,50486L,50487L,
+50488L,50489L,50490L,50491L,50492L,50493L,50494L,50495L,50496L,50497L,
+50498L,50499L,50500L,50501L,50502L,50503L,50504L,50505L,50506L,50507L,
+50508L,50509L,50510L,50511L,50512L,50513L,50514L,50515L,50516L,50517L,
+50518L,50519L,50520L,50521L,50522L,50523L,50524L,50525L,50526L,50527L,
+50528L,50529L,50530L,50531L,50532L,50533L,50534L,50535L,50536L,50537L,
+50538L,50539L,50540L,50541L,50542L,50543L,50544L,50545L,50546L,50547L,
+50548L,50549L,50550L,50551L,50552L,50553L,50554L,50555L,50556L,50557L,
+50558L,50559L,50560L,50561L,50562L,50563L,50564L,50565L,50566L,50567L,
+50568L,50569L,50570L,50571L,50572L,50573L,50574L,50575L,50576L,50577L,
+50578L,50579L,50580L,50581L,50582L,50583L,50584L,50585L,50586L,50587L,
+50588L,50589L,50590L,50591L,50592L,50593L,50594L,50595L,50596L,50597L,
+50598L,50599L,50600L,50601L,50602L,50603L,50604L,50605L,50606L,50607L,
+50608L,50609L,50610L,50611L,50612L,50613L,50614L,50615L,50616L,50617L,
+50618L,50619L,50620L,50621L,50622L,50623L,50624L,50625L,50626L,50627L,
+50628L,50629L,50630L,50631L,50632L,50633L,50634L,50635L,50636L,50637L,
+50638L,50639L,50640L,50641L,50642L,50643L,50644L,50645L,50646L,50647L,
+50648L,50649L,50650L,50651L,50652L,50653L,50654L,50655L,50656L,50657L,
+50658L,50659L,50660L,50661L,50662L,50663L,50664L,50665L,50666L,50667L,
+50668L,50669L,50670L,50671L,50672L,50673L,50674L,50675L,50676L,50677L,
+50678L,50679L,50680L,50681L,50682L,50683L,50684L,50685L,50686L,50687L,
+50688L,50689L,50690L,50691L,50692L,50693L,50694L,50695L,50696L,50697L,
+50698L,50699L,50700L,50701L,50702L,50703L,50704L,50705L,50706L,50707L,
+50708L,50709L,50710L,50711L,50712L,50713L,50714L,50715L,50716L,50717L,
+50718L,50719L,50720L,50721L,50722L,50723L,50724L,50725L,50726L,50727L,
+50728L,50729L,50730L,50731L,50732L,50733L,50734L,50735L,50736L,50737L,
+50738L,50739L,50740L,50741L,50742L,50743L,50744L,50745L,50746L,50747L,
+50748L,50749L,50750L,50751L,50752L,50753L,50754L,50755L,50756L,50757L,
+50758L,50759L,50760L,50761L,50762L,50763L,50764L,50765L,50766L,50767L,
+50768L,50769L,50770L,50771L,50772L,50773L,50774L,50775L,50776L,50777L,
+50778L,50779L,50780L,50781L,50782L,50783L,50784L,50785L,50786L,50787L,
+50788L,50789L,50790L,50791L,50792L,50793L,50794L,50795L,50796L,50797L,
+50798L,50799L,50800L,50801L,50802L,50803L,50804L,50805L,50806L,50807L,
+50808L,50809L,50810L,50811L,50812L,50813L,50814L,50815L,50816L,50817L,
+50818L,50819L,50820L,50821L,50822L,50823L,50824L,50825L,50826L,50827L,
+50828L,50829L,50830L,50831L,50832L,50833L,50834L,50835L,50836L,50837L,
+50838L,50839L,50840L,50841L,50842L,50843L,50844L,50845L,50846L,50847L,
+50848L,50849L,50850L,50851L,50852L,50853L,50854L,50855L,50856L,50857L,
+50858L,50859L,50860L,50861L,50862L,50863L,50864L,50865L,50866L,50867L,
+50868L,50869L,50870L,50871L,50872L,50873L,50874L,50875L,50876L,50877L,
+50878L,50879L,50880L,50881L,50882L,50883L,50884L,50885L,50886L,50887L,
+50888L,50889L,50890L,50891L,50892L,50893L,50894L,50895L,50896L,50897L,
+50898L,50899L,50900L,50901L,50902L,50903L,50904L,50905L,50906L,50907L,
+50908L,50909L,50910L,50911L,50912L,50913L,50914L,50915L,50916L,50917L,
+50918L,50919L,50920L,50921L,50922L,50923L,50924L,50925L,50926L,50927L,
+50928L,50929L,50930L,50931L,50932L,50933L,50934L,50935L,50936L,50937L,
+50938L,50939L,50940L,50941L,50942L,50943L,50944L,50945L,50946L,50947L,
+50948L,50949L,50950L,50951L,50952L,50953L,50954L,50955L,50956L,50957L,
+50958L,50959L,50960L,50961L,50962L,50963L,50964L,50965L,50966L,50967L,
+50968L,50969L,50970L,50971L,50972L,50973L,50974L,50975L,50976L,50977L,
+50978L,50979L,50980L,50981L,50982L,50983L,50984L,50985L,50986L,50987L,
+50988L,50989L,50990L,50991L,50992L,50993L,50994L,50995L,50996L,50997L,
+50998L,50999L,51000L,51001L,51002L,51003L,51004L,51005L,51006L,51007L,
+51008L,51009L,51010L,51011L,51012L,51013L,51014L,51015L,51016L,51017L,
+51018L,51019L,51020L,51021L,51022L,51023L,51024L,51025L,51026L,51027L,
+51028L,51029L,51030L,51031L,51032L,51033L,51034L,51035L,51036L,51037L,
+51038L,51039L,51040L,51041L,51042L,51043L,51044L,51045L,51046L,51047L,
+51048L,51049L,51050L,51051L,51052L,51053L,51054L,51055L,51056L,51057L,
+51058L,51059L,51060L,51061L,51062L,51063L,51064L,51065L,51066L,51067L,
+51068L,51069L,51070L,51071L,51072L,51073L,51074L,51075L,51076L,51077L,
+51078L,51079L,51080L,51081L,51082L,51083L,51084L,51085L,51086L,51087L,
+51088L,51089L,51090L,51091L,51092L,51093L,51094L,51095L,51096L,51097L,
+51098L,51099L,51100L,51101L,51102L,51103L,51104L,51105L,51106L,51107L,
+51108L,51109L,51110L,51111L,51112L,51113L,51114L,51115L,51116L,51117L,
+51118L,51119L,51120L,51121L,51122L,51123L,51124L,51125L,51126L,51127L,
+51128L,51129L,51130L,51131L,51132L,51133L,51134L,51135L,51136L,51137L,
+51138L,51139L,51140L,51141L,51142L,51143L,51144L,51145L,51146L,51147L,
+51148L,51149L,51150L,51151L,51152L,51153L,51154L,51155L,51156L,51157L,
+51158L,51159L,51160L,51161L,51162L,51163L,51164L,51165L,51166L,51167L,
+51168L,51169L,51170L,51171L,51172L,51173L,51174L,51175L,51176L,51177L,
+51178L,51179L,51180L,51181L,51182L,51183L,51184L,51185L,51186L,51187L,
+51188L,51189L,51190L,51191L,51192L,51193L,51194L,51195L,51196L,51197L,
+51198L,51199L,51200L,51201L,51202L,51203L,51204L,51205L,51206L,51207L,
+51208L,51209L,51210L,51211L,51212L,51213L,51214L,51215L,51216L,51217L,
+51218L,51219L,51220L,51221L,51222L,51223L,51224L,51225L,51226L,51227L,
+51228L,51229L,51230L,51231L,51232L,51233L,51234L,51235L,51236L,51237L,
+51238L,51239L,51240L,51241L,51242L,51243L,51244L,51245L,51246L,51247L,
+51248L,51249L,51250L,51251L,51252L,51253L,51254L,51255L,51256L,51257L,
+51258L,51259L,51260L,51261L,51262L,51263L,51264L,51265L,51266L,51267L,
+51268L,51269L,51270L,51271L,51272L,51273L,51274L,51275L,51276L,51277L,
+51278L,51279L,51280L,51281L,51282L,51283L,51284L,51285L,51286L,51287L,
+51288L,51289L,51290L,51291L,51292L,51293L,51294L,51295L,51296L,51297L,
+51298L,51299L,51300L,51301L,51302L,51303L,51304L,51305L,51306L,51307L,
+51308L,51309L,51310L,51311L,51312L,51313L,51314L,51315L,51316L,51317L,
+51318L,51319L,51320L,51321L,51322L,51323L,51324L,51325L,51326L,51327L,
+51328L,51329L,51330L,51331L,51332L,51333L,51334L,51335L,51336L,51337L,
+51338L,51339L,51340L,51341L,51342L,51343L,51344L,51345L,51346L,51347L,
+51348L,51349L,51350L,51351L,51352L,51353L,51354L,51355L,51356L,51357L,
+51358L,51359L,51360L,51361L,51362L,51363L,51364L,51365L,51366L,51367L,
+51368L,51369L,51370L,51371L,51372L,51373L,51374L,51375L,51376L,51377L,
+51378L,51379L,51380L,51381L,51382L,51383L,51384L,51385L,51386L,51387L,
+51388L,51389L,51390L,51391L,51392L,51393L,51394L,51395L,51396L,51397L,
+51398L,51399L,51400L,51401L,51402L,51403L,51404L,51405L,51406L,51407L,
+51408L,51409L,51410L,51411L,51412L,51413L,51414L,51415L,51416L,51417L,
+51418L,51419L,51420L,51421L,51422L,51423L,51424L,51425L,51426L,51427L,
+51428L,51429L,51430L,51431L,51432L,51433L,51434L,51435L,51436L,51437L,
+51438L,51439L,51440L,51441L,51442L,51443L,51444L,51445L,51446L,51447L,
+51448L,51449L,51450L,51451L,51452L,51453L,51454L,51455L,51456L,51457L,
+51458L,51459L,51460L,51461L,51462L,51463L,51464L,51465L,51466L,51467L,
+51468L,51469L,51470L,51471L,51472L,51473L,51474L,51475L,51476L,51477L,
+51478L,51479L,51480L,51481L,51482L,51483L,51484L,51485L,51486L,51487L,
+51488L,51489L,51490L,51491L,51492L,51493L,51494L,51495L,51496L,51497L,
+51498L,51499L,51500L,51501L,51502L,51503L,51504L,51505L,51506L,51507L,
+51508L,51509L,51510L,51511L,51512L,51513L,51514L,51515L,51516L,51517L,
+51518L,51519L,51520L,51521L,51522L,51523L,51524L,51525L,51526L,51527L,
+51528L,51529L,51530L,51531L,51532L,51533L,51534L,51535L,51536L,51537L,
+51538L,51539L,51540L,51541L,51542L,51543L,51544L,51545L,51546L,51547L,
+51548L,51549L,51550L,51551L,51552L,51553L,51554L,51555L,51556L,51557L,
+51558L,51559L,51560L,51561L,51562L,51563L,51564L,51565L,51566L,51567L,
+51568L,51569L,51570L,51571L,51572L,51573L,51574L,51575L,51576L,51577L,
+51578L,51579L,51580L,51581L,51582L,51583L,51584L,51585L,51586L,51587L,
+51588L,51589L,51590L,51591L,51592L,51593L,51594L,51595L,51596L,51597L,
+51598L,51599L,51600L,51601L,51602L,51603L,51604L,51605L,51606L,51607L,
+51608L,51609L,51610L,51611L,51612L,51613L,51614L,51615L,51616L,51617L,
+51618L,51619L,51620L,51621L,51622L,51623L,51624L,51625L,51626L,51627L,
+51628L,51629L,51630L,51631L,51632L,51633L,51634L,51635L,51636L,51637L,
+51638L,51639L,51640L,51641L,51642L,51643L,51644L,51645L,51646L,51647L,
+51648L,51649L,51650L,51651L,51652L,51653L,51654L,51655L,51656L,51657L,
+51658L,51659L,51660L,51661L,51662L,51663L,51664L,51665L,51666L,51667L,
+51668L,51669L,51670L,51671L,51672L,51673L,51674L,51675L,51676L,51677L,
+51678L,51679L,51680L,51681L,51682L,51683L,51684L,51685L,51686L,51687L,
+51688L,51689L,51690L,51691L,51692L,51693L,51694L,51695L,51696L,51697L,
+51698L,51699L,51700L,51701L,51702L,51703L,51704L,51705L,51706L,51707L,
+51708L,51709L,51710L,51711L,51712L,51713L,51714L,51715L,51716L,51717L,
+51718L,51719L,51720L,51721L,51722L,51723L,51724L,51725L,51726L,51727L,
+51728L,51729L,51730L,51731L,51732L,51733L,51734L,51735L,51736L,51737L,
+51738L,51739L,51740L,51741L,51742L,51743L,51744L,51745L,51746L,51747L,
+51748L,51749L,51750L,51751L,51752L,51753L,51754L,51755L,51756L,51757L,
+51758L,51759L,51760L,51761L,51762L,51763L,51764L,51765L,51766L,51767L,
+51768L,51769L,51770L,51771L,51772L,51773L,51774L,51775L,51776L,51777L,
+51778L,51779L,51780L,51781L,51782L,51783L,51784L,51785L,51786L,51787L,
+51788L,51789L,51790L,51791L,51792L,51793L,51794L,51795L,51796L,51797L,
+51798L,51799L,51800L,51801L,51802L,51803L,51804L,51805L,51806L,51807L,
+51808L,51809L,51810L,51811L,51812L,51813L,51814L,51815L,51816L,51817L,
+51818L,51819L,51820L,51821L,51822L,51823L,51824L,51825L,51826L,51827L,
+51828L,51829L,51830L,51831L,51832L,51833L,51834L,51835L,51836L,51837L,
+51838L,51839L,51840L,51841L,51842L,51843L,51844L,51845L,51846L,51847L,
+51848L,51849L,51850L,51851L,51852L,51853L,51854L,51855L,51856L,51857L,
+51858L,51859L,51860L,51861L,51862L,51863L,51864L,51865L,51866L,51867L,
+51868L,51869L,51870L,51871L,51872L,51873L,51874L,51875L,51876L,51877L,
+51878L,51879L,51880L,51881L,51882L,51883L,51884L,51885L,51886L,51887L,
+51888L,51889L,51890L,51891L,51892L,51893L,51894L,51895L,51896L,51897L,
+51898L,51899L,51900L,51901L,51902L,51903L,51904L,51905L,51906L,51907L,
+51908L,51909L,51910L,51911L,51912L,51913L,51914L,51915L,51916L,51917L,
+51918L,51919L,51920L,51921L,51922L,51923L,51924L,51925L,51926L,51927L,
+51928L,51929L,51930L,51931L,51932L,51933L,51934L,51935L,51936L,51937L,
+51938L,51939L,51940L,51941L,51942L,51943L,51944L,51945L,51946L,51947L,
+51948L,51949L,51950L,51951L,51952L,51953L,51954L,51955L,51956L,51957L,
+51958L,51959L,51960L,51961L,51962L,51963L,51964L,51965L,51966L,51967L,
+51968L,51969L,51970L,51971L,51972L,51973L,51974L,51975L,51976L,51977L,
+51978L,51979L,51980L,51981L,51982L,51983L,51984L,51985L,51986L,51987L,
+51988L,51989L,51990L,51991L,51992L,51993L,51994L,51995L,51996L,51997L,
+51998L,51999L,52000L,52001L,52002L,52003L,52004L,52005L,52006L,52007L,
+52008L,52009L,52010L,52011L,52012L,52013L,52014L,52015L,52016L,52017L,
+52018L,52019L,52020L,52021L,52022L,52023L,52024L,52025L,52026L,52027L,
+52028L,52029L,52030L,52031L,52032L,52033L,52034L,52035L,52036L,52037L,
+52038L,52039L,52040L,52041L,52042L,52043L,52044L,52045L,52046L,52047L,
+52048L,52049L,52050L,52051L,52052L,52053L,52054L,52055L,52056L,52057L,
+52058L,52059L,52060L,52061L,52062L,52063L,52064L,52065L,52066L,52067L,
+52068L,52069L,52070L,52071L,52072L,52073L,52074L,52075L,52076L,52077L,
+52078L,52079L,52080L,52081L,52082L,52083L,52084L,52085L,52086L,52087L,
+52088L,52089L,52090L,52091L,52092L,52093L,52094L,52095L,52096L,52097L,
+52098L,52099L,52100L,52101L,52102L,52103L,52104L,52105L,52106L,52107L,
+52108L,52109L,52110L,52111L,52112L,52113L,52114L,52115L,52116L,52117L,
+52118L,52119L,52120L,52121L,52122L,52123L,52124L,52125L,52126L,52127L,
+52128L,52129L,52130L,52131L,52132L,52133L,52134L,52135L,52136L,52137L,
+52138L,52139L,52140L,52141L,52142L,52143L,52144L,52145L,52146L,52147L,
+52148L,52149L,52150L,52151L,52152L,52153L,52154L,52155L,52156L,52157L,
+52158L,52159L,52160L,52161L,52162L,52163L,52164L,52165L,52166L,52167L,
+52168L,52169L,52170L,52171L,52172L,52173L,52174L,52175L,52176L,52177L,
+52178L,52179L,52180L,52181L,52182L,52183L,52184L,52185L,52186L,52187L,
+52188L,52189L,52190L,52191L,52192L,52193L,52194L,52195L,52196L,52197L,
+52198L,52199L,52200L,52201L,52202L,52203L,52204L,52205L,52206L,52207L,
+52208L,52209L,52210L,52211L,52212L,52213L,52214L,52215L,52216L,52217L,
+52218L,52219L,52220L,52221L,52222L,52223L,52224L,52225L,52226L,52227L,
+52228L,52229L,52230L,52231L,52232L,52233L,52234L,52235L,52236L,52237L,
+52238L,52239L,52240L,52241L,52242L,52243L,52244L,52245L,52246L,52247L,
+52248L,52249L,52250L,52251L,52252L,52253L,52254L,52255L,52256L,52257L,
+52258L,52259L,52260L,52261L,52262L,52263L,52264L,52265L,52266L,52267L,
+52268L,52269L,52270L,52271L,52272L,52273L,52274L,52275L,52276L,52277L,
+52278L,52279L,52280L,52281L,52282L,52283L,52284L,52285L,52286L,52287L,
+52288L,52289L,52290L,52291L,52292L,52293L,52294L,52295L,52296L,52297L,
+52298L,52299L,52300L,52301L,52302L,52303L,52304L,52305L,52306L,52307L,
+52308L,52309L,52310L,52311L,52312L,52313L,52314L,52315L,52316L,52317L,
+52318L,52319L,52320L,52321L,52322L,52323L,52324L,52325L,52326L,52327L,
+52328L,52329L,52330L,52331L,52332L,52333L,52334L,52335L,52336L,52337L,
+52338L,52339L,52340L,52341L,52342L,52343L,52344L,52345L,52346L,52347L,
+52348L,52349L,52350L,52351L,52352L,52353L,52354L,52355L,52356L,52357L,
+52358L,52359L,52360L,52361L,52362L,52363L,52364L,52365L,52366L,52367L,
+52368L,52369L,52370L,52371L,52372L,52373L,52374L,52375L,52376L,52377L,
+52378L,52379L,52380L,52381L,52382L,52383L,52384L,52385L,52386L,52387L,
+52388L,52389L,52390L,52391L,52392L,52393L,52394L,52395L,52396L,52397L,
+52398L,52399L,52400L,52401L,52402L,52403L,52404L,52405L,52406L,52407L,
+52408L,52409L,52410L,52411L,52412L,52413L,52414L,52415L,52416L,52417L,
+52418L,52419L,52420L,52421L,52422L,52423L,52424L,52425L,52426L,52427L,
+52428L,52429L,52430L,52431L,52432L,52433L,52434L,52435L,52436L,52437L,
+52438L,52439L,52440L,52441L,52442L,52443L,52444L,52445L,52446L,52447L,
+52448L,52449L,52450L,52451L,52452L,52453L,52454L,52455L,52456L,52457L,
+52458L,52459L,52460L,52461L,52462L,52463L,52464L,52465L,52466L,52467L,
+52468L,52469L,52470L,52471L,52472L,52473L,52474L,52475L,52476L,52477L,
+52478L,52479L,52480L,52481L,52482L,52483L,52484L,52485L,52486L,52487L,
+52488L,52489L,52490L,52491L,52492L,52493L,52494L,52495L,52496L,52497L,
+52498L,52499L,52500L,52501L,52502L,52503L,52504L,52505L,52506L,52507L,
+52508L,52509L,52510L,52511L,52512L,52513L,52514L,52515L,52516L,52517L,
+52518L,52519L,52520L,52521L,52522L,52523L,52524L,52525L,52526L,52527L,
+52528L,52529L,52530L,52531L,52532L,52533L,52534L,52535L,52536L,52537L,
+52538L,52539L,52540L,52541L,52542L,52543L,52544L,52545L,52546L,52547L,
+52548L,52549L,52550L,52551L,52552L,52553L,52554L,52555L,52556L,52557L,
+52558L,52559L,52560L,52561L,52562L,52563L,52564L,52565L,52566L,52567L,
+52568L,52569L,52570L,52571L,52572L,52573L,52574L,52575L,52576L,52577L,
+52578L,52579L,52580L,52581L,52582L,52583L,52584L,52585L,52586L,52587L,
+52588L,52589L,52590L,52591L,52592L,52593L,52594L,52595L,52596L,52597L,
+52598L,52599L,52600L,52601L,52602L,52603L,52604L,52605L,52606L,52607L,
+52608L,52609L,52610L,52611L,52612L,52613L,52614L,52615L,52616L,52617L,
+52618L,52619L,52620L,52621L,52622L,52623L,52624L,52625L,52626L,52627L,
+52628L,52629L,52630L,52631L,52632L,52633L,52634L,52635L,52636L,52637L,
+52638L,52639L,52640L,52641L,52642L,52643L,52644L,52645L,52646L,52647L,
+52648L,52649L,52650L,52651L,52652L,52653L,52654L,52655L,52656L,52657L,
+52658L,52659L,52660L,52661L,52662L,52663L,52664L,52665L,52666L,52667L,
+52668L,52669L,52670L,52671L,52672L,52673L,52674L,52675L,52676L,52677L,
+52678L,52679L,52680L,52681L,52682L,52683L,52684L,52685L,52686L,52687L,
+52688L,52689L,52690L,52691L,52692L,52693L,52694L,52695L,52696L,52697L,
+52698L,52699L,52700L,52701L,52702L,52703L,52704L,52705L,52706L,52707L,
+52708L,52709L,52710L,52711L,52712L,52713L,52714L,52715L,52716L,52717L,
+52718L,52719L,52720L,52721L,52722L,52723L,52724L,52725L,52726L,52727L,
+52728L,52729L,52730L,52731L,52732L,52733L,52734L,52735L,52736L,52737L,
+52738L,52739L,52740L,52741L,52742L,52743L,52744L,52745L,52746L,52747L,
+52748L,52749L,52750L,52751L,52752L,52753L,52754L,52755L,52756L,52757L,
+52758L,52759L,52760L,52761L,52762L,52763L,52764L,52765L,52766L,52767L,
+52768L,52769L,52770L,52771L,52772L,52773L,52774L,52775L,52776L,52777L,
+52778L,52779L,52780L,52781L,52782L,52783L,52784L,52785L,52786L,52787L,
+52788L,52789L,52790L,52791L,52792L,52793L,52794L,52795L,52796L,52797L,
+52798L,52799L,52800L,52801L,52802L,52803L,52804L,52805L,52806L,52807L,
+52808L,52809L,52810L,52811L,52812L,52813L,52814L,52815L,52816L,52817L,
+52818L,52819L,52820L,52821L,52822L,52823L,52824L,52825L,52826L,52827L,
+52828L,52829L,52830L,52831L,52832L,52833L,52834L,52835L,52836L,52837L,
+52838L,52839L,52840L,52841L,52842L,52843L,52844L,52845L,52846L,52847L,
+52848L,52849L,52850L,52851L,52852L,52853L,52854L,52855L,52856L,52857L,
+52858L,52859L,52860L,52861L,52862L,52863L,52864L,52865L,52866L,52867L,
+52868L,52869L,52870L,52871L,52872L,52873L,52874L,52875L,52876L,52877L,
+52878L,52879L,52880L,52881L,52882L,52883L,52884L,52885L,52886L,52887L,
+52888L,52889L,52890L,52891L,52892L,52893L,52894L,52895L,52896L,52897L,
+52898L,52899L,52900L,52901L,52902L,52903L,52904L,52905L,52906L,52907L,
+52908L,52909L,52910L,52911L,52912L,52913L,52914L,52915L,52916L,52917L,
+52918L,52919L,52920L,52921L,52922L,52923L,52924L,52925L,52926L,52927L,
+52928L,52929L,52930L,52931L,52932L,52933L,52934L,52935L,52936L,52937L,
+52938L,52939L,52940L,52941L,52942L,52943L,52944L,52945L,52946L,52947L,
+52948L,52949L,52950L,52951L,52952L,52953L,52954L,52955L,52956L,52957L,
+52958L,52959L,52960L,52961L,52962L,52963L,52964L,52965L,52966L,52967L,
+52968L,52969L,52970L,52971L,52972L,52973L,52974L,52975L,52976L,52977L,
+52978L,52979L,52980L,52981L,52982L,52983L,52984L,52985L,52986L,52987L,
+52988L,52989L,52990L,52991L,52992L,52993L,52994L,52995L,52996L,52997L,
+52998L,52999L,53000L,53001L,53002L,53003L,53004L,53005L,53006L,53007L,
+53008L,53009L,53010L,53011L,53012L,53013L,53014L,53015L,53016L,53017L,
+53018L,53019L,53020L,53021L,53022L,53023L,53024L,53025L,53026L,53027L,
+53028L,53029L,53030L,53031L,53032L,53033L,53034L,53035L,53036L,53037L,
+53038L,53039L,53040L,53041L,53042L,53043L,53044L,53045L,53046L,53047L,
+53048L,53049L,53050L,53051L,53052L,53053L,53054L,53055L,53056L,53057L,
+53058L,53059L,53060L,53061L,53062L,53063L,53064L,53065L,53066L,53067L,
+53068L,53069L,53070L,53071L,53072L,53073L,53074L,53075L,53076L,53077L,
+53078L,53079L,53080L,53081L,53082L,53083L,53084L,53085L,53086L,53087L,
+53088L,53089L,53090L,53091L,53092L,53093L,53094L,53095L,53096L,53097L,
+53098L,53099L,53100L,53101L,53102L,53103L,53104L,53105L,53106L,53107L,
+53108L,53109L,53110L,53111L,53112L,53113L,53114L,53115L,53116L,53117L,
+53118L,53119L,53120L,53121L,53122L,53123L,53124L,53125L,53126L,53127L,
+53128L,53129L,53130L,53131L,53132L,53133L,53134L,53135L,53136L,53137L,
+53138L,53139L,53140L,53141L,53142L,53143L,53144L,53145L,53146L,53147L,
+53148L,53149L,53150L,53151L,53152L,53153L,53154L,53155L,53156L,53157L,
+53158L,53159L,53160L,53161L,53162L,53163L,53164L,53165L,53166L,53167L,
+53168L,53169L,53170L,53171L,53172L,53173L,53174L,53175L,53176L,53177L,
+53178L,53179L,53180L,53181L,53182L,53183L,53184L,53185L,53186L,53187L,
+53188L,53189L,53190L,53191L,53192L,53193L,53194L,53195L,53196L,53197L,
+53198L,53199L,53200L,53201L,53202L,53203L,53204L,53205L,53206L,53207L,
+53208L,53209L,53210L,53211L,53212L,53213L,53214L,53215L,53216L,53217L,
+53218L,53219L,53220L,53221L,53222L,53223L,53224L,53225L,53226L,53227L,
+53228L,53229L,53230L,53231L,53232L,53233L,53234L,53235L,53236L,53237L,
+53238L,53239L,53240L,53241L,53242L,53243L,53244L,53245L,53246L,53247L,
+53248L,53249L,53250L,53251L,53252L,53253L,53254L,53255L,53256L,53257L,
+53258L,53259L,53260L,53261L,53262L,53263L,53264L,53265L,53266L,53267L,
+53268L,53269L,53270L,53271L,53272L,53273L,53274L,53275L,53276L,53277L,
+53278L,53279L,53280L,53281L,53282L,53283L,53284L,53285L,53286L,53287L,
+53288L,53289L,53290L,53291L,53292L,53293L,53294L,53295L,53296L,53297L,
+53298L,53299L,53300L,53301L,53302L,53303L,53304L,53305L,53306L,53307L,
+53308L,53309L,53310L,53311L,53312L,53313L,53314L,53315L,53316L,53317L,
+53318L,53319L,53320L,53321L,53322L,53323L,53324L,53325L,53326L,53327L,
+53328L,53329L,53330L,53331L,53332L,53333L,53334L,53335L,53336L,53337L,
+53338L,53339L,53340L,53341L,53342L,53343L,53344L,53345L,53346L,53347L,
+53348L,53349L,53350L,53351L,53352L,53353L,53354L,53355L,53356L,53357L,
+53358L,53359L,53360L,53361L,53362L,53363L,53364L,53365L,53366L,53367L,
+53368L,53369L,53370L,53371L,53372L,53373L,53374L,53375L,53376L,53377L,
+53378L,53379L,53380L,53381L,53382L,53383L,53384L,53385L,53386L,53387L,
+53388L,53389L,53390L,53391L,53392L,53393L,53394L,53395L,53396L,53397L,
+53398L,53399L,53400L,53401L,53402L,53403L,53404L,53405L,53406L,53407L,
+53408L,53409L,53410L,53411L,53412L,53413L,53414L,53415L,53416L,53417L,
+53418L,53419L,53420L,53421L,53422L,53423L,53424L,53425L,53426L,53427L,
+53428L,53429L,53430L,53431L,53432L,53433L,53434L,53435L,53436L,53437L,
+53438L,53439L,53440L,53441L,53442L,53443L,53444L,53445L,53446L,53447L,
+53448L,53449L,53450L,53451L,53452L,53453L,53454L,53455L,53456L,53457L,
+53458L,53459L,53460L,53461L,53462L,53463L,53464L,53465L,53466L,53467L,
+53468L,53469L,53470L,53471L,53472L,53473L,53474L,53475L,53476L,53477L,
+53478L,53479L,53480L,53481L,53482L,53483L,53484L,53485L,53486L,53487L,
+53488L,53489L,53490L,53491L,53492L,53493L,53494L,53495L,53496L,53497L,
+53498L,53499L,53500L,53501L,53502L,53503L,53504L,53505L,53506L,53507L,
+53508L,53509L,53510L,53511L,53512L,53513L,53514L,53515L,53516L,53517L,
+53518L,53519L,53520L,53521L,53522L,53523L,53524L,53525L,53526L,53527L,
+53528L,53529L,53530L,53531L,53532L,53533L,53534L,53535L,53536L,53537L,
+53538L,53539L,53540L,53541L,53542L,53543L,53544L,53545L,53546L,53547L,
+53548L,53549L,53550L,53551L,53552L,53553L,53554L,53555L,53556L,53557L,
+53558L,53559L,53560L,53561L,53562L,53563L,53564L,53565L,53566L,53567L,
+53568L,53569L,53570L,53571L,53572L,53573L,53574L,53575L,53576L,53577L,
+53578L,53579L,53580L,53581L,53582L,53583L,53584L,53585L,53586L,53587L,
+53588L,53589L,53590L,53591L,53592L,53593L,53594L,53595L,53596L,53597L,
+53598L,53599L,53600L,53601L,53602L,53603L,53604L,53605L,53606L,53607L,
+53608L,53609L,53610L,53611L,53612L,53613L,53614L,53615L,53616L,53617L,
+53618L,53619L,53620L,53621L,53622L,53623L,53624L,53625L,53626L,53627L,
+53628L,53629L,53630L,53631L,53632L,53633L,53634L,53635L,53636L,53637L,
+53638L,53639L,53640L,53641L,53642L,53643L,53644L,53645L,53646L,53647L,
+53648L,53649L,53650L,53651L,53652L,53653L,53654L,53655L,53656L,53657L,
+53658L,53659L,53660L,53661L,53662L,53663L,53664L,53665L,53666L,53667L,
+53668L,53669L,53670L,53671L,53672L,53673L,53674L,53675L,53676L,53677L,
+53678L,53679L,53680L,53681L,53682L,53683L,53684L,53685L,53686L,53687L,
+53688L,53689L,53690L,53691L,53692L,53693L,53694L,53695L,53696L,53697L,
+53698L,53699L,53700L,53701L,53702L,53703L,53704L,53705L,53706L,53707L,
+53708L,53709L,53710L,53711L,53712L,53713L,53714L,53715L,53716L,53717L,
+53718L,53719L,53720L,53721L,53722L,53723L,53724L,53725L,53726L,53727L,
+53728L,53729L,53730L,53731L,53732L,53733L,53734L,53735L,53736L,53737L,
+53738L,53739L,53740L,53741L,53742L,53743L,53744L,53745L,53746L,53747L,
+53748L,53749L,53750L,53751L,53752L,53753L,53754L,53755L,53756L,53757L,
+53758L,53759L,53760L,53761L,53762L,53763L,53764L,53765L,53766L,53767L,
+53768L,53769L,53770L,53771L,53772L,53773L,53774L,53775L,53776L,53777L,
+53778L,53779L,53780L,53781L,53782L,53783L,53784L,53785L,53786L,53787L,
+53788L,53789L,53790L,53791L,53792L,53793L,53794L,53795L,53796L,53797L,
+53798L,53799L,53800L,53801L,53802L,53803L,53804L,53805L,53806L,53807L,
+53808L,53809L,53810L,53811L,53812L,53813L,53814L,53815L,53816L,53817L,
+53818L,53819L,53820L,53821L,53822L,53823L,53824L,53825L,53826L,53827L,
+53828L,53829L,53830L,53831L,53832L,53833L,53834L,53835L,53836L,53837L,
+53838L,53839L,53840L,53841L,53842L,53843L,53844L,53845L,53846L,53847L,
+53848L,53849L,53850L,53851L,53852L,53853L,53854L,53855L,53856L,53857L,
+53858L,53859L,53860L,53861L,53862L,53863L,53864L,53865L,53866L,53867L,
+53868L,53869L,53870L,53871L,53872L,53873L,53874L,53875L,53876L,53877L,
+53878L,53879L,53880L,53881L,53882L,53883L,53884L,53885L,53886L,53887L,
+53888L,53889L,53890L,53891L,53892L,53893L,53894L,53895L,53896L,53897L,
+53898L,53899L,53900L,53901L,53902L,53903L,53904L,53905L,53906L,53907L,
+53908L,53909L,53910L,53911L,53912L,53913L,53914L,53915L,53916L,53917L,
+53918L,53919L,53920L,53921L,53922L,53923L,53924L,53925L,53926L,53927L,
+53928L,53929L,53930L,53931L,53932L,53933L,53934L,53935L,53936L,53937L,
+53938L,53939L,53940L,53941L,53942L,53943L,53944L,53945L,53946L,53947L,
+53948L,53949L,53950L,53951L,53952L,53953L,53954L,53955L,53956L,53957L,
+53958L,53959L,53960L,53961L,53962L,53963L,53964L,53965L,53966L,53967L,
+53968L,53969L,53970L,53971L,53972L,53973L,53974L,53975L,53976L,53977L,
+53978L,53979L,53980L,53981L,53982L,53983L,53984L,53985L,53986L,53987L,
+53988L,53989L,53990L,53991L,53992L,53993L,53994L,53995L,53996L,53997L,
+53998L,53999L,54000L,54001L,54002L,54003L,54004L,54005L,54006L,54007L,
+54008L,54009L,54010L,54011L,54012L,54013L,54014L,54015L,54016L,54017L,
+54018L,54019L,54020L,54021L,54022L,54023L,54024L,54025L,54026L,54027L,
+54028L,54029L,54030L,54031L,54032L,54033L,54034L,54035L,54036L,54037L,
+54038L,54039L,54040L,54041L,54042L,54043L,54044L,54045L,54046L,54047L,
+54048L,54049L,54050L,54051L,54052L,54053L,54054L,54055L,54056L,54057L,
+54058L,54059L,54060L,54061L,54062L,54063L,54064L,54065L,54066L,54067L,
+54068L,54069L,54070L,54071L,54072L,54073L,54074L,54075L,54076L,54077L,
+54078L,54079L,54080L,54081L,54082L,54083L,54084L,54085L,54086L,54087L,
+54088L,54089L,54090L,54091L,54092L,54093L,54094L,54095L,54096L,54097L,
+54098L,54099L,54100L,54101L,54102L,54103L,54104L,54105L,54106L,54107L,
+54108L,54109L,54110L,54111L,54112L,54113L,54114L,54115L,54116L,54117L,
+54118L,54119L,54120L,54121L,54122L,54123L,54124L,54125L,54126L,54127L,
+54128L,54129L,54130L,54131L,54132L,54133L,54134L,54135L,54136L,54137L,
+54138L,54139L,54140L,54141L,54142L,54143L,54144L,54145L,54146L,54147L,
+54148L,54149L,54150L,54151L,54152L,54153L,54154L,54155L,54156L,54157L,
+54158L,54159L,54160L,54161L,54162L,54163L,54164L,54165L,54166L,54167L,
+54168L,54169L,54170L,54171L,54172L,54173L,54174L,54175L,54176L,54177L,
+54178L,54179L,54180L,54181L,54182L,54183L,54184L,54185L,54186L,54187L,
+54188L,54189L,54190L,54191L,54192L,54193L,54194L,54195L,54196L,54197L,
+54198L,54199L,54200L,54201L,54202L,54203L,54204L,54205L,54206L,54207L,
+54208L,54209L,54210L,54211L,54212L,54213L,54214L,54215L,54216L,54217L,
+54218L,54219L,54220L,54221L,54222L,54223L,54224L,54225L,54226L,54227L,
+54228L,54229L,54230L,54231L,54232L,54233L,54234L,54235L,54236L,54237L,
+54238L,54239L,54240L,54241L,54242L,54243L,54244L,54245L,54246L,54247L,
+54248L,54249L,54250L,54251L,54252L,54253L,54254L,54255L,54256L,54257L,
+54258L,54259L,54260L,54261L,54262L,54263L,54264L,54265L,54266L,54267L,
+54268L,54269L,54270L,54271L,54272L,54273L,54274L,54275L,54276L,54277L,
+54278L,54279L,54280L,54281L,54282L,54283L,54284L,54285L,54286L,54287L,
+54288L,54289L,54290L,54291L,54292L,54293L,54294L,54295L,54296L,54297L,
+54298L,54299L,54300L,54301L,54302L,54303L,54304L,54305L,54306L,54307L,
+54308L,54309L,54310L,54311L,54312L,54313L,54314L,54315L,54316L,54317L,
+54318L,54319L,54320L,54321L,54322L,54323L,54324L,54325L,54326L,54327L,
+54328L,54329L,54330L,54331L,54332L,54333L,54334L,54335L,54336L,54337L,
+54338L,54339L,54340L,54341L,54342L,54343L,54344L,54345L,54346L,54347L,
+54348L,54349L,54350L,54351L,54352L,54353L,54354L,54355L,54356L,54357L,
+54358L,54359L,54360L,54361L,54362L,54363L,54364L,54365L,54366L,54367L,
+54368L,54369L,54370L,54371L,54372L,54373L,54374L,54375L,54376L,54377L,
+54378L,54379L,54380L,54381L,54382L,54383L,54384L,54385L,54386L,54387L,
+54388L,54389L,54390L,54391L,54392L,54393L,54394L,54395L,54396L,54397L,
+54398L,54399L,54400L,54401L,54402L,54403L,54404L,54405L,54406L,54407L,
+54408L,54409L,54410L,54411L,54412L,54413L,54414L,54415L,54416L,54417L,
+54418L,54419L,54420L,54421L,54422L,54423L,54424L,54425L,54426L,54427L,
+54428L,54429L,54430L,54431L,54432L,54433L,54434L,54435L,54436L,54437L,
+54438L,54439L,54440L,54441L,54442L,54443L,54444L,54445L,54446L,54447L,
+54448L,54449L,54450L,54451L,54452L,54453L,54454L,54455L,54456L,54457L,
+54458L,54459L,54460L,54461L,54462L,54463L,54464L,54465L,54466L,54467L,
+54468L,54469L,54470L,54471L,54472L,54473L,54474L,54475L,54476L,54477L,
+54478L,54479L,54480L,54481L,54482L,54483L,54484L,54485L,54486L,54487L,
+54488L,54489L,54490L,54491L,54492L,54493L,54494L,54495L,54496L,54497L,
+54498L,54499L,54500L,54501L,54502L,54503L,54504L,54505L,54506L,54507L,
+54508L,54509L,54510L,54511L,54512L,54513L,54514L,54515L,54516L,54517L,
+54518L,54519L,54520L,54521L,54522L,54523L,54524L,54525L,54526L,54527L,
+54528L,54529L,54530L,54531L,54532L,54533L,54534L,54535L,54536L,54537L,
+54538L,54539L,54540L,54541L,54542L,54543L,54544L,54545L,54546L,54547L,
+54548L,54549L,54550L,54551L,54552L,54553L,54554L,54555L,54556L,54557L,
+54558L,54559L,54560L,54561L,54562L,54563L,54564L,54565L,54566L,54567L,
+54568L,54569L,54570L,54571L,54572L,54573L,54574L,54575L,54576L,54577L,
+54578L,54579L,54580L,54581L,54582L,54583L,54584L,54585L,54586L,54587L,
+54588L,54589L,54590L,54591L,54592L,54593L,54594L,54595L,54596L,54597L,
+54598L,54599L,54600L,54601L,54602L,54603L,54604L,54605L,54606L,54607L,
+54608L,54609L,54610L,54611L,54612L,54613L,54614L,54615L,54616L,54617L,
+54618L,54619L,54620L,54621L,54622L,54623L,54624L,54625L,54626L,54627L,
+54628L,54629L,54630L,54631L,54632L,54633L,54634L,54635L,54636L,54637L,
+54638L,54639L,54640L,54641L,54642L,54643L,54644L,54645L,54646L,54647L,
+54648L,54649L,54650L,54651L,54652L,54653L,54654L,54655L,54656L,54657L,
+54658L,54659L,54660L,54661L,54662L,54663L,54664L,54665L,54666L,54667L,
+54668L,54669L,54670L,54671L,54672L,54673L,54674L,54675L,54676L,54677L,
+54678L,54679L,54680L,54681L,54682L,54683L,54684L,54685L,54686L,54687L,
+54688L,54689L,54690L,54691L,54692L,54693L,54694L,54695L,54696L,54697L,
+54698L,54699L,54700L,54701L,54702L,54703L,54704L,54705L,54706L,54707L,
+54708L,54709L,54710L,54711L,54712L,54713L,54714L,54715L,54716L,54717L,
+54718L,54719L,54720L,54721L,54722L,54723L,54724L,54725L,54726L,54727L,
+54728L,54729L,54730L,54731L,54732L,54733L,54734L,54735L,54736L,54737L,
+54738L,54739L,54740L,54741L,54742L,54743L,54744L,54745L,54746L,54747L,
+54748L,54749L,54750L,54751L,54752L,54753L,54754L,54755L,54756L,54757L,
+54758L,54759L,54760L,54761L,54762L,54763L,54764L,54765L,54766L,54767L,
+54768L,54769L,54770L,54771L,54772L,54773L,54774L,54775L,54776L,54777L,
+54778L,54779L,54780L,54781L,54782L,54783L,54784L,54785L,54786L,54787L,
+54788L,54789L,54790L,54791L,54792L,54793L,54794L,54795L,54796L,54797L,
+54798L,54799L,54800L,54801L,54802L,54803L,54804L,54805L,54806L,54807L,
+54808L,54809L,54810L,54811L,54812L,54813L,54814L,54815L,54816L,54817L,
+54818L,54819L,54820L,54821L,54822L,54823L,54824L,54825L,54826L,54827L,
+54828L,54829L,54830L,54831L,54832L,54833L,54834L,54835L,54836L,54837L,
+54838L,54839L,54840L,54841L,54842L,54843L,54844L,54845L,54846L,54847L,
+54848L,54849L,54850L,54851L,54852L,54853L,54854L,54855L,54856L,54857L,
+54858L,54859L,54860L,54861L,54862L,54863L,54864L,54865L,54866L,54867L,
+54868L,54869L,54870L,54871L,54872L,54873L,54874L,54875L,54876L,54877L,
+54878L,54879L,54880L,54881L,54882L,54883L,54884L,54885L,54886L,54887L,
+54888L,54889L,54890L,54891L,54892L,54893L,54894L,54895L,54896L,54897L,
+54898L,54899L,54900L,54901L,54902L,54903L,54904L,54905L,54906L,54907L,
+54908L,54909L,54910L,54911L,54912L,54913L,54914L,54915L,54916L,54917L,
+54918L,54919L,54920L,54921L,54922L,54923L,54924L,54925L,54926L,54927L,
+54928L,54929L,54930L,54931L,54932L,54933L,54934L,54935L,54936L,54937L,
+54938L,54939L,54940L,54941L,54942L,54943L,54944L,54945L,54946L,54947L,
+54948L,54949L,54950L,54951L,54952L,54953L,54954L,54955L,54956L,54957L,
+54958L,54959L,54960L,54961L,54962L,54963L,54964L,54965L,54966L,54967L,
+54968L,54969L,54970L,54971L,54972L,54973L,54974L,54975L,54976L,54977L,
+54978L,54979L,54980L,54981L,54982L,54983L,54984L,54985L,54986L,54987L,
+54988L,54989L,54990L,54991L,54992L,54993L,54994L,54995L,54996L,54997L,
+54998L,54999L,55000L,55001L,55002L,55003L,55004L,55005L,55006L,55007L,
+55008L,55009L,55010L,55011L,55012L,55013L,55014L,55015L,55016L,55017L,
+55018L,55019L,55020L,55021L,55022L,55023L,55024L,55025L,55026L,55027L,
+55028L,55029L,55030L,55031L,55032L,55033L,55034L,55035L,55036L,55037L,
+55038L,55039L,55040L,55041L,55042L,55043L,55044L,55045L,55046L,55047L,
+55048L,55049L,55050L,55051L,55052L,55053L,55054L,55055L,55056L,55057L,
+55058L,55059L,55060L,55061L,55062L,55063L,55064L,55065L,55066L,55067L,
+55068L,55069L,55070L,55071L,55072L,55073L,55074L,55075L,55076L,55077L,
+55078L,55079L,55080L,55081L,55082L,55083L,55084L,55085L,55086L,55087L,
+55088L,55089L,55090L,55091L,55092L,55093L,55094L,55095L,55096L,55097L,
+55098L,55099L,55100L,55101L,55102L,55103L,55104L,55105L,55106L,55107L,
+55108L,55109L,55110L,55111L,55112L,55113L,55114L,55115L,55116L,55117L,
+55118L,55119L,55120L,55121L,55122L,55123L,55124L,55125L,55126L,55127L,
+55128L,55129L,55130L,55131L,55132L,55133L,55134L,55135L,55136L,55137L,
+55138L,55139L,55140L,55141L,55142L,55143L,55144L,55145L,55146L,55147L,
+55148L,55149L,55150L,55151L,55152L,55153L,55154L,55155L,55156L,55157L,
+55158L,55159L,55160L,55161L,55162L,55163L,55164L,55165L,55166L,55167L,
+55168L,55169L,55170L,55171L,55172L,55173L,55174L,55175L,55176L,55177L,
+55178L,55179L,55180L,55181L,55182L,55183L,55184L,55185L,55186L,55187L,
+55188L,55189L,55190L,55191L,55192L,55193L,55194L,55195L,55196L,55197L,
+55198L,55199L,55200L,55201L,55202L,55203L,55204L,55205L,55206L,55207L,
+55208L,55209L,55210L,55211L,55212L,55213L,55214L,55215L,55216L,55217L,
+55218L,55219L,55220L,55221L,55222L,55223L,55224L,55225L,55226L,55227L,
+55228L,55229L,55230L,55231L,55232L,55233L,55234L,55235L,55236L,55237L,
+55238L,55239L,55240L,55241L,55242L,55243L,55244L,55245L,55246L,55247L,
+55248L,55249L,55250L,55251L,55252L,55253L,55254L,55255L,55256L,55257L,
+55258L,55259L,55260L,55261L,55262L,55263L,55264L,55265L,55266L,55267L,
+55268L,55269L,55270L,55271L,55272L,55273L,55274L,55275L,55276L,55277L,
+55278L,55279L,55280L,55281L,55282L,55283L,55284L,55285L,55286L,55287L,
+55288L,55289L,55290L,55291L,55292L,55293L,55294L,55295L,55296L,55297L,
+55298L,55299L,55300L,55301L,55302L,55303L,55304L,55305L,55306L,55307L,
+55308L,55309L,55310L,55311L,55312L,55313L,55314L,55315L,55316L,55317L,
+55318L,55319L,55320L,55321L,55322L,55323L,55324L,55325L,55326L,55327L,
+55328L,55329L,55330L,55331L,55332L,55333L,55334L,55335L,55336L,55337L,
+55338L,55339L,55340L,55341L,55342L,55343L,55344L,55345L,55346L,55347L,
+55348L,55349L,55350L,55351L,55352L,55353L,55354L,55355L,55356L,55357L,
+55358L,55359L,55360L,55361L,55362L,55363L,55364L,55365L,55366L,55367L,
+55368L,55369L,55370L,55371L,55372L,55373L,55374L,55375L,55376L,55377L,
+55378L,55379L,55380L,55381L,55382L,55383L,55384L,55385L,55386L,55387L,
+55388L,55389L,55390L,55391L,55392L,55393L,55394L,55395L,55396L,55397L,
+55398L,55399L,55400L,55401L,55402L,55403L,55404L,55405L,55406L,55407L,
+55408L,55409L,55410L,55411L,55412L,55413L,55414L,55415L,55416L,55417L,
+55418L,55419L,55420L,55421L,55422L,55423L,55424L,55425L,55426L,55427L,
+55428L,55429L,55430L,55431L,55432L,55433L,55434L,55435L,55436L,55437L,
+55438L,55439L,55440L,55441L,55442L,55443L,55444L,55445L,55446L,55447L,
+55448L,55449L,55450L,55451L,55452L,55453L,55454L,55455L,55456L,55457L,
+55458L,55459L,55460L,55461L,55462L,55463L,55464L,55465L,55466L,55467L,
+55468L,55469L,55470L,55471L,55472L,55473L,55474L,55475L,55476L,55477L,
+55478L,55479L,55480L,55481L,55482L,55483L,55484L,55485L,55486L,55487L,
+55488L,55489L,55490L,55491L,55492L,55493L,55494L,55495L,55496L,55497L,
+55498L,55499L,55500L,55501L,55502L,55503L,55504L,55505L,55506L,55507L,
+55508L,55509L,55510L,55511L,55512L,55513L,55514L,55515L,55516L,55517L,
+55518L,55519L,55520L,55521L,55522L,55523L,55524L,55525L,55526L,55527L,
+55528L,55529L,55530L,55531L,55532L,55533L,55534L,55535L,55536L,55537L,
+55538L,55539L,55540L,55541L,55542L,55543L,55544L,55545L,55546L,55547L,
+55548L,55549L,55550L,55551L,55552L,55553L,55554L,55555L,55556L,55557L,
+55558L,55559L,55560L,55561L,55562L,55563L,55564L,55565L,55566L,55567L,
+55568L,55569L,55570L,55571L,55572L,55573L,55574L,55575L,55576L,55577L,
+55578L,55579L,55580L,55581L,55582L,55583L,55584L,55585L,55586L,55587L,
+55588L,55589L,55590L,55591L,55592L,55593L,55594L,55595L,55596L,55597L,
+55598L,55599L,55600L,55601L,55602L,55603L,55604L,55605L,55606L,55607L,
+55608L,55609L,55610L,55611L,55612L,55613L,55614L,55615L,55616L,55617L,
+55618L,55619L,55620L,55621L,55622L,55623L,55624L,55625L,55626L,55627L,
+55628L,55629L,55630L,55631L,55632L,55633L,55634L,55635L,55636L,55637L,
+55638L,55639L,55640L,55641L,55642L,55643L,55644L,55645L,55646L,55647L,
+55648L,55649L,55650L,55651L,55652L,55653L,55654L,55655L,55656L,55657L,
+55658L,55659L,55660L,55661L,55662L,55663L,55664L,55665L,55666L,55667L,
+55668L,55669L,55670L,55671L,55672L,55673L,55674L,55675L,55676L,55677L,
+55678L,55679L,55680L,55681L,55682L,55683L,55684L,55685L,55686L,55687L,
+55688L,55689L,55690L,55691L,55692L,55693L,55694L,55695L,55696L,55697L,
+55698L,55699L,55700L,55701L,55702L,55703L,55704L,55705L,55706L,55707L,
+55708L,55709L,55710L,55711L,55712L,55713L,55714L,55715L,55716L,55717L,
+55718L,55719L,55720L,55721L,55722L,55723L,55724L,55725L,55726L,55727L,
+55728L,55729L,55730L,55731L,55732L,55733L,55734L,55735L,55736L,55737L,
+55738L,55739L,55740L,55741L,55742L,55743L,55744L,55745L,55746L,55747L,
+55748L,55749L,55750L,55751L,55752L,55753L,55754L,55755L,55756L,55757L,
+55758L,55759L,55760L,55761L,55762L,55763L,55764L,55765L,55766L,55767L,
+55768L,55769L,55770L,55771L,55772L,55773L,55774L,55775L,55776L,55777L,
+55778L,55779L,55780L,55781L,55782L,55783L,55784L,55785L,55786L,55787L,
+55788L,55789L,55790L,55791L,55792L,55793L,55794L,55795L,55796L,55797L,
+55798L,55799L,55800L,55801L,55802L,55803L,55804L,55805L,55806L,55807L,
+55808L,55809L,55810L,55811L,55812L,55813L,55814L,55815L,55816L,55817L,
+55818L,55819L,55820L,55821L,55822L,55823L,55824L,55825L,55826L,55827L,
+55828L,55829L,55830L,55831L,55832L,55833L,55834L,55835L,55836L,55837L,
+55838L,55839L,55840L,55841L,55842L,55843L,55844L,55845L,55846L,55847L,
+55848L,55849L,55850L,55851L,55852L,55853L,55854L,55855L,55856L,55857L,
+55858L,55859L,55860L,55861L,55862L,55863L,55864L,55865L,55866L,55867L,
+55868L,55869L,55870L,55871L,55872L,55873L,55874L,55875L,55876L,55877L,
+55878L,55879L,55880L,55881L,55882L,55883L,55884L,55885L,55886L,55887L,
+55888L,55889L,55890L,55891L,55892L,55893L,55894L,55895L,55896L,55897L,
+55898L,55899L,55900L,55901L,55902L,55903L,55904L,55905L,55906L,55907L,
+55908L,55909L,55910L,55911L,55912L,55913L,55914L,55915L,55916L,55917L,
+55918L,55919L,55920L,55921L,55922L,55923L,55924L,55925L,55926L,55927L,
+55928L,55929L,55930L,55931L,55932L,55933L,55934L,55935L,55936L,55937L,
+55938L,55939L,55940L,55941L,55942L,55943L,55944L,55945L,55946L,55947L,
+55948L,55949L,55950L,55951L,55952L,55953L,55954L,55955L,55956L,55957L,
+55958L,55959L,55960L,55961L,55962L,55963L,55964L,55965L,55966L,55967L,
+55968L,55969L,55970L,55971L,55972L,55973L,55974L,55975L,55976L,55977L,
+55978L,55979L,55980L,55981L,55982L,55983L,55984L,55985L,55986L,55987L,
+55988L,55989L,55990L,55991L,55992L,55993L,55994L,55995L,55996L,55997L,
+55998L,55999L,56000L,56001L,56002L,56003L,56004L,56005L,56006L,56007L,
+56008L,56009L,56010L,56011L,56012L,56013L,56014L,56015L,56016L,56017L,
+56018L,56019L,56020L,56021L,56022L,56023L,56024L,56025L,56026L,56027L,
+56028L,56029L,56030L,56031L,56032L,56033L,56034L,56035L,56036L,56037L,
+56038L,56039L,56040L,56041L,56042L,56043L,56044L,56045L,56046L,56047L,
+56048L,56049L,56050L,56051L,56052L,56053L,56054L,56055L,56056L,56057L,
+56058L,56059L,56060L,56061L,56062L,56063L,56064L,56065L,56066L,56067L,
+56068L,56069L,56070L,56071L,56072L,56073L,56074L,56075L,56076L,56077L,
+56078L,56079L,56080L,56081L,56082L,56083L,56084L,56085L,56086L,56087L,
+56088L,56089L,56090L,56091L,56092L,56093L,56094L,56095L,56096L,56097L,
+56098L,56099L,56100L,56101L,56102L,56103L,56104L,56105L,56106L,56107L,
+56108L,56109L,56110L,56111L,56112L,56113L,56114L,56115L,56116L,56117L,
+56118L,56119L,56120L,56121L,56122L,56123L,56124L,56125L,56126L,56127L,
+56128L,56129L,56130L,56131L,56132L,56133L,56134L,56135L,56136L,56137L,
+56138L,56139L,56140L,56141L,56142L,56143L,56144L,56145L,56146L,56147L,
+56148L,56149L,56150L,56151L,56152L,56153L,56154L,56155L,56156L,56157L,
+56158L,56159L,56160L,56161L,56162L,56163L,56164L,56165L,56166L,56167L,
+56168L,56169L,56170L,56171L,56172L,56173L,56174L,56175L,56176L,56177L,
+56178L,56179L,56180L,56181L,56182L,56183L,56184L,56185L,56186L,56187L,
+56188L,56189L,56190L,56191L,56192L,56193L,56194L,56195L,56196L,56197L,
+56198L,56199L,56200L,56201L,56202L,56203L,56204L,56205L,56206L,56207L,
+56208L,56209L,56210L,56211L,56212L,56213L,56214L,56215L,56216L,56217L,
+56218L,56219L,56220L,56221L,56222L,56223L,56224L,56225L,56226L,56227L,
+56228L,56229L,56230L,56231L,56232L,56233L,56234L,56235L,56236L,56237L,
+56238L,56239L,56240L,56241L,56242L,56243L,56244L,56245L,56246L,56247L,
+56248L,56249L,56250L,56251L,56252L,56253L,56254L,56255L,56256L,56257L,
+56258L,56259L,56260L,56261L,56262L,56263L,56264L,56265L,56266L,56267L,
+56268L,56269L,56270L,56271L,56272L,56273L,56274L,56275L,56276L,56277L,
+56278L,56279L,56280L,56281L,56282L,56283L,56284L,56285L,56286L,56287L,
+56288L,56289L,56290L,56291L,56292L,56293L,56294L,56295L,56296L,56297L,
+56298L,56299L,56300L,56301L,56302L,56303L,56304L,56305L,56306L,56307L,
+56308L,56309L,56310L,56311L,56312L,56313L,56314L,56315L,56316L,56317L,
+56318L,56319L,56320L,56321L,56322L,56323L,56324L,56325L,56326L,56327L,
+56328L,56329L,56330L,56331L,56332L,56333L,56334L,56335L,56336L,56337L,
+56338L,56339L,56340L,56341L,56342L,56343L,56344L,56345L,56346L,56347L,
+56348L,56349L,56350L,56351L,56352L,56353L,56354L,56355L,56356L,56357L,
+56358L,56359L,56360L,56361L,56362L,56363L,56364L,56365L,56366L,56367L,
+56368L,56369L,56370L,56371L,56372L,56373L,56374L,56375L,56376L,56377L,
+56378L,56379L,56380L,56381L,56382L,56383L,56384L,56385L,56386L,56387L,
+56388L,56389L,56390L,56391L,56392L,56393L,56394L,56395L,56396L,56397L,
+56398L,56399L,56400L,56401L,56402L,56403L,56404L,56405L,56406L,56407L,
+56408L,56409L,56410L,56411L,56412L,56413L,56414L,56415L,56416L,56417L,
+56418L,56419L,56420L,56421L,56422L,56423L,56424L,56425L,56426L,56427L,
+56428L,56429L,56430L,56431L,56432L,56433L,56434L,56435L,56436L,56437L,
+56438L,56439L,56440L,56441L,56442L,56443L,56444L,56445L,56446L,56447L,
+56448L,56449L,56450L,56451L,56452L,56453L,56454L,56455L,56456L,56457L,
+56458L,56459L,56460L,56461L,56462L,56463L,56464L,56465L,56466L,56467L,
+56468L,56469L,56470L,56471L,56472L,56473L,56474L,56475L,56476L,56477L,
+56478L,56479L,56480L,56481L,56482L,56483L,56484L,56485L,56486L,56487L,
+56488L,56489L,56490L,56491L,56492L,56493L,56494L,56495L,56496L,56497L,
+56498L,56499L,56500L,56501L,56502L,56503L,56504L,56505L,56506L,56507L,
+56508L,56509L,56510L,56511L,56512L,56513L,56514L,56515L,56516L,56517L,
+56518L,56519L,56520L,56521L,56522L,56523L,56524L,56525L,56526L,56527L,
+56528L,56529L,56530L,56531L,56532L,56533L,56534L,56535L,56536L,56537L,
+56538L,56539L,56540L,56541L,56542L,56543L,56544L,56545L,56546L,56547L,
+56548L,56549L,56550L,56551L,56552L,56553L,56554L,56555L,56556L,56557L,
+56558L,56559L,56560L,56561L,56562L,56563L,56564L,56565L,56566L,56567L,
+56568L,56569L,56570L,56571L,56572L,56573L,56574L,56575L,56576L,56577L,
+56578L,56579L,56580L,56581L,56582L,56583L,56584L,56585L,56586L,56587L,
+56588L,56589L,56590L,56591L,56592L,56593L,56594L,56595L,56596L,56597L,
+56598L,56599L,56600L,56601L,56602L,56603L,56604L,56605L,56606L,56607L,
+56608L,56609L,56610L,56611L,56612L,56613L,56614L,56615L,56616L,56617L,
+56618L,56619L,56620L,56621L,56622L,56623L,56624L,56625L,56626L,56627L,
+56628L,56629L,56630L,56631L,56632L,56633L,56634L,56635L,56636L,56637L,
+56638L,56639L,56640L,56641L,56642L,56643L,56644L,56645L,56646L,56647L,
+56648L,56649L,56650L,56651L,56652L,56653L,56654L,56655L,56656L,56657L,
+56658L,56659L,56660L,56661L,56662L,56663L,56664L,56665L,56666L,56667L,
+56668L,56669L,56670L,56671L,56672L,56673L,56674L,56675L,56676L,56677L,
+56678L,56679L,56680L,56681L,56682L,56683L,56684L,56685L,56686L,56687L,
+56688L,56689L,56690L,56691L,56692L,56693L,56694L,56695L,56696L,56697L,
+56698L,56699L,56700L,56701L,56702L,56703L,56704L,56705L,56706L,56707L,
+56708L,56709L,56710L,56711L,56712L,56713L,56714L,56715L,56716L,56717L,
+56718L,56719L,56720L,56721L,56722L,56723L,56724L,56725L,56726L,56727L,
+56728L,56729L,56730L,56731L,56732L,56733L,56734L,56735L,56736L,56737L,
+56738L,56739L,56740L,56741L,56742L,56743L,56744L,56745L,56746L,56747L,
+56748L,56749L,56750L,56751L,56752L,56753L,56754L,56755L,56756L,56757L,
+56758L,56759L,56760L,56761L,56762L,56763L,56764L,56765L,56766L,56767L,
+56768L,56769L,56770L,56771L,56772L,56773L,56774L,56775L,56776L,56777L,
+56778L,56779L,56780L,56781L,56782L,56783L,56784L,56785L,56786L,56787L,
+56788L,56789L,56790L,56791L,56792L,56793L,56794L,56795L,56796L,56797L,
+56798L,56799L,56800L,56801L,56802L,56803L,56804L,56805L,56806L,56807L,
+56808L,56809L,56810L,56811L,56812L,56813L,56814L,56815L,56816L,56817L,
+56818L,56819L,56820L,56821L,56822L,56823L,56824L,56825L,56826L,56827L,
+56828L,56829L,56830L,56831L,56832L,56833L,56834L,56835L,56836L,56837L,
+56838L,56839L,56840L,56841L,56842L,56843L,56844L,56845L,56846L,56847L,
+56848L,56849L,56850L,56851L,56852L,56853L,56854L,56855L,56856L,56857L,
+56858L,56859L,56860L,56861L,56862L,56863L,56864L,56865L,56866L,56867L,
+56868L,56869L,56870L,56871L,56872L,56873L,56874L,56875L,56876L,56877L,
+56878L,56879L,56880L,56881L,56882L,56883L,56884L,56885L,56886L,56887L,
+56888L,56889L,56890L,56891L,56892L,56893L,56894L,56895L,56896L,56897L,
+56898L,56899L,56900L,56901L,56902L,56903L,56904L,56905L,56906L,56907L,
+56908L,56909L,56910L,56911L,56912L,56913L,56914L,56915L,56916L,56917L,
+56918L,56919L,56920L,56921L,56922L,56923L,56924L,56925L,56926L,56927L,
+56928L,56929L,56930L,56931L,56932L,56933L,56934L,56935L,56936L,56937L,
+56938L,56939L,56940L,56941L,56942L,56943L,56944L,56945L,56946L,56947L,
+56948L,56949L,56950L,56951L,56952L,56953L,56954L,56955L,56956L,56957L,
+56958L,56959L,56960L,56961L,56962L,56963L,56964L,56965L,56966L,56967L,
+56968L,56969L,56970L,56971L,56972L,56973L,56974L,56975L,56976L,56977L,
+56978L,56979L,56980L,56981L,56982L,56983L,56984L,56985L,56986L,56987L,
+56988L,56989L,56990L,56991L,56992L,56993L,56994L,56995L,56996L,56997L,
+56998L,56999L,57000L,57001L,57002L,57003L,57004L,57005L,57006L,57007L,
+57008L,57009L,57010L,57011L,57012L,57013L,57014L,57015L,57016L,57017L,
+57018L,57019L,57020L,57021L,57022L,57023L,57024L,57025L,57026L,57027L,
+57028L,57029L,57030L,57031L,57032L,57033L,57034L,57035L,57036L,57037L,
+57038L,57039L,57040L,57041L,57042L,57043L,57044L,57045L,57046L,57047L,
+57048L,57049L,57050L,57051L,57052L,57053L,57054L,57055L,57056L,57057L,
+57058L,57059L,57060L,57061L,57062L,57063L,57064L,57065L,57066L,57067L,
+57068L,57069L,57070L,57071L,57072L,57073L,57074L,57075L,57076L,57077L,
+57078L,57079L,57080L,57081L,57082L,57083L,57084L,57085L,57086L,57087L,
+57088L,57089L,57090L,57091L,57092L,57093L,57094L,57095L,57096L,57097L,
+57098L,57099L,57100L,57101L,57102L,57103L,57104L,57105L,57106L,57107L,
+57108L,57109L,57110L,57111L,57112L,57113L,57114L,57115L,57116L,57117L,
+57118L,57119L,57120L,57121L,57122L,57123L,57124L,57125L,57126L,57127L,
+57128L,57129L,57130L,57131L,57132L,57133L,57134L,57135L,57136L,57137L,
+57138L,57139L,57140L,57141L,57142L,57143L,57144L,57145L,57146L,57147L,
+57148L,57149L,57150L,57151L,57152L,57153L,57154L,57155L,57156L,57157L,
+57158L,57159L,57160L,57161L,57162L,57163L,57164L,57165L,57166L,57167L,
+57168L,57169L,57170L,57171L,57172L,57173L,57174L,57175L,57176L,57177L,
+57178L,57179L,57180L,57181L,57182L,57183L,57184L,57185L,57186L,57187L,
+57188L,57189L,57190L,57191L,57192L,57193L,57194L,57195L,57196L,57197L,
+57198L,57199L,57200L,57201L,57202L,57203L,57204L,57205L,57206L,57207L,
+57208L,57209L,57210L,57211L,57212L,57213L,57214L,57215L,57216L,57217L,
+57218L,57219L,57220L,57221L,57222L,57223L,57224L,57225L,57226L,57227L,
+57228L,57229L,57230L,57231L,57232L,57233L,57234L,57235L,57236L,57237L,
+57238L,57239L,57240L,57241L,57242L,57243L,57244L,57245L,57246L,57247L,
+57248L,57249L,57250L,57251L,57252L,57253L,57254L,57255L,57256L,57257L,
+57258L,57259L,57260L,57261L,57262L,57263L,57264L,57265L,57266L,57267L,
+57268L,57269L,57270L,57271L,57272L,57273L,57274L,57275L,57276L,57277L,
+57278L,57279L,57280L,57281L,57282L,57283L,57284L,57285L,57286L,57287L,
+57288L,57289L,57290L,57291L,57292L,57293L,57294L,57295L,57296L,57297L,
+57298L,57299L,57300L,57301L,57302L,57303L,57304L,57305L,57306L,57307L,
+57308L,57309L,57310L,57311L,57312L,57313L,57314L,57315L,57316L,57317L,
+57318L,57319L,57320L,57321L,57322L,57323L,57324L,57325L,57326L,57327L,
+57328L,57329L,57330L,57331L,57332L,57333L,57334L,57335L,57336L,57337L,
+57338L,57339L,57340L,57341L,57342L,57343L,57344L,57345L,57346L,57347L,
+57348L,57349L,57350L,57351L,57352L,57353L,57354L,57355L,57356L,57357L,
+57358L,57359L,57360L,57361L,57362L,57363L,57364L,57365L,57366L,57367L,
+57368L,57369L,57370L,57371L,57372L,57373L,57374L,57375L,57376L,57377L,
+57378L,57379L,57380L,57381L,57382L,57383L,57384L,57385L,57386L,57387L,
+57388L,57389L,57390L,57391L,57392L,57393L,57394L,57395L,57396L,57397L,
+57398L,57399L,57400L,57401L,57402L,57403L,57404L,57405L,57406L,57407L,
+57408L,57409L,57410L,57411L,57412L,57413L,57414L,57415L,57416L,57417L,
+57418L,57419L,57420L,57421L,57422L,57423L,57424L,57425L,57426L,57427L,
+57428L,57429L,57430L,57431L,57432L,57433L,57434L,57435L,57436L,57437L,
+57438L,57439L,57440L,57441L,57442L,57443L,57444L,57445L,57446L,57447L,
+57448L,57449L,57450L,57451L,57452L,57453L,57454L,57455L,57456L,57457L,
+57458L,57459L,57460L,57461L,57462L,57463L,57464L,57465L,57466L,57467L,
+57468L,57469L,57470L,57471L,57472L,57473L,57474L,57475L,57476L,57477L,
+57478L,57479L,57480L,57481L,57482L,57483L,57484L,57485L,57486L,57487L,
+57488L,57489L,57490L,57491L,57492L,57493L,57494L,57495L,57496L,57497L,
+57498L,57499L,57500L,57501L,57502L,57503L,57504L,57505L,57506L,57507L,
+57508L,57509L,57510L,57511L,57512L,57513L,57514L,57515L,57516L,57517L,
+57518L,57519L,57520L,57521L,57522L,57523L,57524L,57525L,57526L,57527L,
+57528L,57529L,57530L,57531L,57532L,57533L,57534L,57535L,57536L,57537L,
+57538L,57539L,57540L,57541L,57542L,57543L,57544L,57545L,57546L,57547L,
+57548L,57549L,57550L,57551L,57552L,57553L,57554L,57555L,57556L,57557L,
+57558L,57559L,57560L,57561L,57562L,57563L,57564L,57565L,57566L,57567L,
+57568L,57569L,57570L,57571L,57572L,57573L,57574L,57575L,57576L,57577L,
+57578L,57579L,57580L,57581L,57582L,57583L,57584L,57585L,57586L,57587L,
+57588L,57589L,57590L,57591L,57592L,57593L,57594L,57595L,57596L,57597L,
+57598L,57599L,57600L,57601L,57602L,57603L,57604L,57605L,57606L,57607L,
+57608L,57609L,57610L,57611L,57612L,57613L,57614L,57615L,57616L,57617L,
+57618L,57619L,57620L,57621L,57622L,57623L,57624L,57625L,57626L,57627L,
+57628L,57629L,57630L,57631L,57632L,57633L,57634L,57635L,57636L,57637L,
+57638L,57639L,57640L,57641L,57642L,57643L,57644L,57645L,57646L,57647L,
+57648L,57649L,57650L,57651L,57652L,57653L,57654L,57655L,57656L,57657L,
+57658L,57659L,57660L,57661L,57662L,57663L,57664L,57665L,57666L,57667L,
+57668L,57669L,57670L,57671L,57672L,57673L,57674L,57675L,57676L,57677L,
+57678L,57679L,57680L,57681L,57682L,57683L,57684L,57685L,57686L,57687L,
+57688L,57689L,57690L,57691L,57692L,57693L,57694L,57695L,57696L,57697L,
+57698L,57699L,57700L,57701L,57702L,57703L,57704L,57705L,57706L,57707L,
+57708L,57709L,57710L,57711L,57712L,57713L,57714L,57715L,57716L,57717L,
+57718L,57719L,57720L,57721L,57722L,57723L,57724L,57725L,57726L,57727L,
+57728L,57729L,57730L,57731L,57732L,57733L,57734L,57735L,57736L,57737L,
+57738L,57739L,57740L,57741L,57742L,57743L,57744L,57745L,57746L,57747L,
+57748L,57749L,57750L,57751L,57752L,57753L,57754L,57755L,57756L,57757L,
+57758L,57759L,57760L,57761L,57762L,57763L,57764L,57765L,57766L,57767L,
+57768L,57769L,57770L,57771L,57772L,57773L,57774L,57775L,57776L,57777L,
+57778L,57779L,57780L,57781L,57782L,57783L,57784L,57785L,57786L,57787L,
+57788L,57789L,57790L,57791L,57792L,57793L,57794L,57795L,57796L,57797L,
+57798L,57799L,57800L,57801L,57802L,57803L,57804L,57805L,57806L,57807L,
+57808L,57809L,57810L,57811L,57812L,57813L,57814L,57815L,57816L,57817L,
+57818L,57819L,57820L,57821L,57822L,57823L,57824L,57825L,57826L,57827L,
+57828L,57829L,57830L,57831L,57832L,57833L,57834L,57835L,57836L,57837L,
+57838L,57839L,57840L,57841L,57842L,57843L,57844L,57845L,57846L,57847L,
+57848L,57849L,57850L,57851L,57852L,57853L,57854L,57855L,57856L,57857L,
+57858L,57859L,57860L,57861L,57862L,57863L,57864L,57865L,57866L,57867L,
+57868L,57869L,57870L,57871L,57872L,57873L,57874L,57875L,57876L,57877L,
+57878L,57879L,57880L,57881L,57882L,57883L,57884L,57885L,57886L,57887L,
+57888L,57889L,57890L,57891L,57892L,57893L,57894L,57895L,57896L,57897L,
+57898L,57899L,57900L,57901L,57902L,57903L,57904L,57905L,57906L,57907L,
+57908L,57909L,57910L,57911L,57912L,57913L,57914L,57915L,57916L,57917L,
+57918L,57919L,57920L,57921L,57922L,57923L,57924L,57925L,57926L,57927L,
+57928L,57929L,57930L,57931L,57932L,57933L,57934L,57935L,57936L,57937L,
+57938L,57939L,57940L,57941L,57942L,57943L,57944L,57945L,57946L,57947L,
+57948L,57949L,57950L,57951L,57952L,57953L,57954L,57955L,57956L,57957L,
+57958L,57959L,57960L,57961L,57962L,57963L,57964L,57965L,57966L,57967L,
+57968L,57969L,57970L,57971L,57972L,57973L,57974L,57975L,57976L,57977L,
+57978L,57979L,57980L,57981L,57982L,57983L,57984L,57985L,57986L,57987L,
+57988L,57989L,57990L,57991L,57992L,57993L,57994L,57995L,57996L,57997L,
+57998L,57999L,58000L,58001L,58002L,58003L,58004L,58005L,58006L,58007L,
+58008L,58009L,58010L,58011L,58012L,58013L,58014L,58015L,58016L,58017L,
+58018L,58019L,58020L,58021L,58022L,58023L,58024L,58025L,58026L,58027L,
+58028L,58029L,58030L,58031L,58032L,58033L,58034L,58035L,58036L,58037L,
+58038L,58039L,58040L,58041L,58042L,58043L,58044L,58045L,58046L,58047L,
+58048L,58049L,58050L,58051L,58052L,58053L,58054L,58055L,58056L,58057L,
+58058L,58059L,58060L,58061L,58062L,58063L,58064L,58065L,58066L,58067L,
+58068L,58069L,58070L,58071L,58072L,58073L,58074L,58075L,58076L,58077L,
+58078L,58079L,58080L,58081L,58082L,58083L,58084L,58085L,58086L,58087L,
+58088L,58089L,58090L,58091L,58092L,58093L,58094L,58095L,58096L,58097L,
+58098L,58099L,58100L,58101L,58102L,58103L,58104L,58105L,58106L,58107L,
+58108L,58109L,58110L,58111L,58112L,58113L,58114L,58115L,58116L,58117L,
+58118L,58119L,58120L,58121L,58122L,58123L,58124L,58125L,58126L,58127L,
+58128L,58129L,58130L,58131L,58132L,58133L,58134L,58135L,58136L,58137L,
+58138L,58139L,58140L,58141L,58142L,58143L,58144L,58145L,58146L,58147L,
+58148L,58149L,58150L,58151L,58152L,58153L,58154L,58155L,58156L,58157L,
+58158L,58159L,58160L,58161L,58162L,58163L,58164L,58165L,58166L,58167L,
+58168L,58169L,58170L,58171L,58172L,58173L,58174L,58175L,58176L,58177L,
+58178L,58179L,58180L,58181L,58182L,58183L,58184L,58185L,58186L,58187L,
+58188L,58189L,58190L,58191L,58192L,58193L,58194L,58195L,58196L,58197L,
+58198L,58199L,58200L,58201L,58202L,58203L,58204L,58205L,58206L,58207L,
+58208L,58209L,58210L,58211L,58212L,58213L,58214L,58215L,58216L,58217L,
+58218L,58219L,58220L,58221L,58222L,58223L,58224L,58225L,58226L,58227L,
+58228L,58229L,58230L,58231L,58232L,58233L,58234L,58235L,58236L,58237L,
+58238L,58239L,58240L,58241L,58242L,58243L,58244L,58245L,58246L,58247L,
+58248L,58249L,58250L,58251L,58252L,58253L,58254L,58255L,58256L,58257L,
+58258L,58259L,58260L,58261L,58262L,58263L,58264L,58265L,58266L,58267L,
+58268L,58269L,58270L,58271L,58272L,58273L,58274L,58275L,58276L,58277L,
+58278L,58279L,58280L,58281L,58282L,58283L,58284L,58285L,58286L,58287L,
+58288L,58289L,58290L,58291L,58292L,58293L,58294L,58295L,58296L,58297L,
+58298L,58299L,58300L,58301L,58302L,58303L,58304L,58305L,58306L,58307L,
+58308L,58309L,58310L,58311L,58312L,58313L,58314L,58315L,58316L,58317L,
+58318L,58319L,58320L,58321L,58322L,58323L,58324L,58325L,58326L,58327L,
+58328L,58329L,58330L,58331L,58332L,58333L,58334L,58335L,58336L,58337L,
+58338L,58339L,58340L,58341L,58342L,58343L,58344L,58345L,58346L,58347L,
+58348L,58349L,58350L,58351L,58352L,58353L,58354L,58355L,58356L,58357L,
+58358L,58359L,58360L,58361L,58362L,58363L,58364L,58365L,58366L,58367L,
+58368L,58369L,58370L,58371L,58372L,58373L,58374L,58375L,58376L,58377L,
+58378L,58379L,58380L,58381L,58382L,58383L,58384L,58385L,58386L,58387L,
+58388L,58389L,58390L,58391L,58392L,58393L,58394L,58395L,58396L,58397L,
+58398L,58399L,58400L,58401L,58402L,58403L,58404L,58405L,58406L,58407L,
+58408L,58409L,58410L,58411L,58412L,58413L,58414L,58415L,58416L,58417L,
+58418L,58419L,58420L,58421L,58422L,58423L,58424L,58425L,58426L,58427L,
+58428L,58429L,58430L,58431L,58432L,58433L,58434L,58435L,58436L,58437L,
+58438L,58439L,58440L,58441L,58442L,58443L,58444L,58445L,58446L,58447L,
+58448L,58449L,58450L,58451L,58452L,58453L,58454L,58455L,58456L,58457L,
+58458L,58459L,58460L,58461L,58462L,58463L,58464L,58465L,58466L,58467L,
+58468L,58469L,58470L,58471L,58472L,58473L,58474L,58475L,58476L,58477L,
+58478L,58479L,58480L,58481L,58482L,58483L,58484L,58485L,58486L,58487L,
+58488L,58489L,58490L,58491L,58492L,58493L,58494L,58495L,58496L,58497L,
+58498L,58499L,58500L,58501L,58502L,58503L,58504L,58505L,58506L,58507L,
+58508L,58509L,58510L,58511L,58512L,58513L,58514L,58515L,58516L,58517L,
+58518L,58519L,58520L,58521L,58522L,58523L,58524L,58525L,58526L,58527L,
+58528L,58529L,58530L,58531L,58532L,58533L,58534L,58535L,58536L,58537L,
+58538L,58539L,58540L,58541L,58542L,58543L,58544L,58545L,58546L,58547L,
+58548L,58549L,58550L,58551L,58552L,58553L,58554L,58555L,58556L,58557L,
+58558L,58559L,58560L,58561L,58562L,58563L,58564L,58565L,58566L,58567L,
+58568L,58569L,58570L,58571L,58572L,58573L,58574L,58575L,58576L,58577L,
+58578L,58579L,58580L,58581L,58582L,58583L,58584L,58585L,58586L,58587L,
+58588L,58589L,58590L,58591L,58592L,58593L,58594L,58595L,58596L,58597L,
+58598L,58599L,58600L,58601L,58602L,58603L,58604L,58605L,58606L,58607L,
+58608L,58609L,58610L,58611L,58612L,58613L,58614L,58615L,58616L,58617L,
+58618L,58619L,58620L,58621L,58622L,58623L,58624L,58625L,58626L,58627L,
+58628L,58629L,58630L,58631L,58632L,58633L,58634L,58635L,58636L,58637L,
+58638L,58639L,58640L,58641L,58642L,58643L,58644L,58645L,58646L,58647L,
+58648L,58649L,58650L,58651L,58652L,58653L,58654L,58655L,58656L,58657L,
+58658L,58659L,58660L,58661L,58662L,58663L,58664L,58665L,58666L,58667L,
+58668L,58669L,58670L,58671L,58672L,58673L,58674L,58675L,58676L,58677L,
+58678L,58679L,58680L,58681L,58682L,58683L,58684L,58685L,58686L,58687L,
+58688L,58689L,58690L,58691L,58692L,58693L,58694L,58695L,58696L,58697L,
+58698L,58699L,58700L,58701L,58702L,58703L,58704L,58705L,58706L,58707L,
+58708L,58709L,58710L,58711L,58712L,58713L,58714L,58715L,58716L,58717L,
+58718L,58719L,58720L,58721L,58722L,58723L,58724L,58725L,58726L,58727L,
+58728L,58729L,58730L,58731L,58732L,58733L,58734L,58735L,58736L,58737L,
+58738L,58739L,58740L,58741L,58742L,58743L,58744L,58745L,58746L,58747L,
+58748L,58749L,58750L,58751L,58752L,58753L,58754L,58755L,58756L,58757L,
+58758L,58759L,58760L,58761L,58762L,58763L,58764L,58765L,58766L,58767L,
+58768L,58769L,58770L,58771L,58772L,58773L,58774L,58775L,58776L,58777L,
+58778L,58779L,58780L,58781L,58782L,58783L,58784L,58785L,58786L,58787L,
+58788L,58789L,58790L,58791L,58792L,58793L,58794L,58795L,58796L,58797L,
+58798L,58799L,58800L,58801L,58802L,58803L,58804L,58805L,58806L,58807L,
+58808L,58809L,58810L,58811L,58812L,58813L,58814L,58815L,58816L,58817L,
+58818L,58819L,58820L,58821L,58822L,58823L,58824L,58825L,58826L,58827L,
+58828L,58829L,58830L,58831L,58832L,58833L,58834L,58835L,58836L,58837L,
+58838L,58839L,58840L,58841L,58842L,58843L,58844L,58845L,58846L,58847L,
+58848L,58849L,58850L,58851L,58852L,58853L,58854L,58855L,58856L,58857L,
+58858L,58859L,58860L,58861L,58862L,58863L,58864L,58865L,58866L,58867L,
+58868L,58869L,58870L,58871L,58872L,58873L,58874L,58875L,58876L,58877L,
+58878L,58879L,58880L,58881L,58882L,58883L,58884L,58885L,58886L,58887L,
+58888L,58889L,58890L,58891L,58892L,58893L,58894L,58895L,58896L,58897L,
+58898L,58899L,58900L,58901L,58902L,58903L,58904L,58905L,58906L,58907L,
+58908L,58909L,58910L,58911L,58912L,58913L,58914L,58915L,58916L,58917L,
+58918L,58919L,58920L,58921L,58922L,58923L,58924L,58925L,58926L,58927L,
+58928L,58929L,58930L,58931L,58932L,58933L,58934L,58935L,58936L,58937L,
+58938L,58939L,58940L,58941L,58942L,58943L,58944L,58945L,58946L,58947L,
+58948L,58949L,58950L,58951L,58952L,58953L,58954L,58955L,58956L,58957L,
+58958L,58959L,58960L,58961L,58962L,58963L,58964L,58965L,58966L,58967L,
+58968L,58969L,58970L,58971L,58972L,58973L,58974L,58975L,58976L,58977L,
+58978L,58979L,58980L,58981L,58982L,58983L,58984L,58985L,58986L,58987L,
+58988L,58989L,58990L,58991L,58992L,58993L,58994L,58995L,58996L,58997L,
+58998L,58999L,59000L,59001L,59002L,59003L,59004L,59005L,59006L,59007L,
+59008L,59009L,59010L,59011L,59012L,59013L,59014L,59015L,59016L,59017L,
+59018L,59019L,59020L,59021L,59022L,59023L,59024L,59025L,59026L,59027L,
+59028L,59029L,59030L,59031L,59032L,59033L,59034L,59035L,59036L,59037L,
+59038L,59039L,59040L,59041L,59042L,59043L,59044L,59045L,59046L,59047L,
+59048L,59049L,59050L,59051L,59052L,59053L,59054L,59055L,59056L,59057L,
+59058L,59059L,59060L,59061L,59062L,59063L,59064L,59065L,59066L,59067L,
+59068L,59069L,59070L,59071L,59072L,59073L,59074L,59075L,59076L,59077L,
+59078L,59079L,59080L,59081L,59082L,59083L,59084L,59085L,59086L,59087L,
+59088L,59089L,59090L,59091L,59092L,59093L,59094L,59095L,59096L,59097L,
+59098L,59099L,59100L,59101L,59102L,59103L,59104L,59105L,59106L,59107L,
+59108L,59109L,59110L,59111L,59112L,59113L,59114L,59115L,59116L,59117L,
+59118L,59119L,59120L,59121L,59122L,59123L,59124L,59125L,59126L,59127L,
+59128L,59129L,59130L,59131L,59132L,59133L,59134L,59135L,59136L,59137L,
+59138L,59139L,59140L,59141L,59142L,59143L,59144L,59145L,59146L,59147L,
+59148L,59149L,59150L,59151L,59152L,59153L,59154L,59155L,59156L,59157L,
+59158L,59159L,59160L,59161L,59162L,59163L,59164L,59165L,59166L,59167L,
+59168L,59169L,59170L,59171L,59172L,59173L,59174L,59175L,59176L,59177L,
+59178L,59179L,59180L,59181L,59182L,59183L,59184L,59185L,59186L,59187L,
+59188L,59189L,59190L,59191L,59192L,59193L,59194L,59195L,59196L,59197L,
+59198L,59199L,59200L,59201L,59202L,59203L,59204L,59205L,59206L,59207L,
+59208L,59209L,59210L,59211L,59212L,59213L,59214L,59215L,59216L,59217L,
+59218L,59219L,59220L,59221L,59222L,59223L,59224L,59225L,59226L,59227L,
+59228L,59229L,59230L,59231L,59232L,59233L,59234L,59235L,59236L,59237L,
+59238L,59239L,59240L,59241L,59242L,59243L,59244L,59245L,59246L,59247L,
+59248L,59249L,59250L,59251L,59252L,59253L,59254L,59255L,59256L,59257L,
+59258L,59259L,59260L,59261L,59262L,59263L,59264L,59265L,59266L,59267L,
+59268L,59269L,59270L,59271L,59272L,59273L,59274L,59275L,59276L,59277L,
+59278L,59279L,59280L,59281L,59282L,59283L,59284L,59285L,59286L,59287L,
+59288L,59289L,59290L,59291L,59292L,59293L,59294L,59295L,59296L,59297L,
+59298L,59299L,59300L,59301L,59302L,59303L,59304L,59305L,59306L,59307L,
+59308L,59309L,59310L,59311L,59312L,59313L,59314L,59315L,59316L,59317L,
+59318L,59319L,59320L,59321L,59322L,59323L,59324L,59325L,59326L,59327L,
+59328L,59329L,59330L,59331L,59332L,59333L,59334L,59335L,59336L,59337L,
+59338L,59339L,59340L,59341L,59342L,59343L,59344L,59345L,59346L,59347L,
+59348L,59349L,59350L,59351L,59352L,59353L,59354L,59355L,59356L,59357L,
+59358L,59359L,59360L,59361L,59362L,59363L,59364L,59365L,59366L,59367L,
+59368L,59369L,59370L,59371L,59372L,59373L,59374L,59375L,59376L,59377L,
+59378L,59379L,59380L,59381L,59382L,59383L,59384L,59385L,59386L,59387L,
+59388L,59389L,59390L,59391L,59392L,59393L,59394L,59395L,59396L,59397L,
+59398L,59399L,59400L,59401L,59402L,59403L,59404L,59405L,59406L,59407L,
+59408L,59409L,59410L,59411L,59412L,59413L,59414L,59415L,59416L,59417L,
+59418L,59419L,59420L,59421L,59422L,59423L,59424L,59425L,59426L,59427L,
+59428L,59429L,59430L,59431L,59432L,59433L,59434L,59435L,59436L,59437L,
+59438L,59439L,59440L,59441L,59442L,59443L,59444L,59445L,59446L,59447L,
+59448L,59449L,59450L,59451L,59452L,59453L,59454L,59455L,59456L,59457L,
+59458L,59459L,59460L,59461L,59462L,59463L,59464L,59465L,59466L,59467L,
+59468L,59469L,59470L,59471L,59472L,59473L,59474L,59475L,59476L,59477L,
+59478L,59479L,59480L,59481L,59482L,59483L,59484L,59485L,59486L,59487L,
+59488L,59489L,59490L,59491L,59492L,59493L,59494L,59495L,59496L,59497L,
+59498L,59499L,59500L,59501L,59502L,59503L,59504L,59505L,59506L,59507L,
+59508L,59509L,59510L,59511L,59512L,59513L,59514L,59515L,59516L,59517L,
+59518L,59519L,59520L,59521L,59522L,59523L,59524L,59525L,59526L,59527L,
+59528L,59529L,59530L,59531L,59532L,59533L,59534L,59535L,59536L,59537L,
+59538L,59539L,59540L,59541L,59542L,59543L,59544L,59545L,59546L,59547L,
+59548L,59549L,59550L,59551L,59552L,59553L,59554L,59555L,59556L,59557L,
+59558L,59559L,59560L,59561L,59562L,59563L,59564L,59565L,59566L,59567L,
+59568L,59569L,59570L,59571L,59572L,59573L,59574L,59575L,59576L,59577L,
+59578L,59579L,59580L,59581L,59582L,59583L,59584L,59585L,59586L,59587L,
+59588L,59589L,59590L,59591L,59592L,59593L,59594L,59595L,59596L,59597L,
+59598L,59599L,59600L,59601L,59602L,59603L,59604L,59605L,59606L,59607L,
+59608L,59609L,59610L,59611L,59612L,59613L,59614L,59615L,59616L,59617L,
+59618L,59619L,59620L,59621L,59622L,59623L,59624L,59625L,59626L,59627L,
+59628L,59629L,59630L,59631L,59632L,59633L,59634L,59635L,59636L,59637L,
+59638L,59639L,59640L,59641L,59642L,59643L,59644L,59645L,59646L,59647L,
+59648L,59649L,59650L,59651L,59652L,59653L,59654L,59655L,59656L,59657L,
+59658L,59659L,59660L,59661L,59662L,59663L,59664L,59665L,59666L,59667L,
+59668L,59669L,59670L,59671L,59672L,59673L,59674L,59675L,59676L,59677L,
+59678L,59679L,59680L,59681L,59682L,59683L,59684L,59685L,59686L,59687L,
+59688L,59689L,59690L,59691L,59692L,59693L,59694L,59695L,59696L,59697L,
+59698L,59699L,59700L,59701L,59702L,59703L,59704L,59705L,59706L,59707L,
+59708L,59709L,59710L,59711L,59712L,59713L,59714L,59715L,59716L,59717L,
+59718L,59719L,59720L,59721L,59722L,59723L,59724L,59725L,59726L,59727L,
+59728L,59729L,59730L,59731L,59732L,59733L,59734L,59735L,59736L,59737L,
+59738L,59739L,59740L,59741L,59742L,59743L,59744L,59745L,59746L,59747L,
+59748L,59749L,59750L,59751L,59752L,59753L,59754L,59755L,59756L,59757L,
+59758L,59759L,59760L,59761L,59762L,59763L,59764L,59765L,59766L,59767L,
+59768L,59769L,59770L,59771L,59772L,59773L,59774L,59775L,59776L,59777L,
+59778L,59779L,59780L,59781L,59782L,59783L,59784L,59785L,59786L,59787L,
+59788L,59789L,59790L,59791L,59792L,59793L,59794L,59795L,59796L,59797L,
+59798L,59799L,59800L,59801L,59802L,59803L,59804L,59805L,59806L,59807L,
+59808L,59809L,59810L,59811L,59812L,59813L,59814L,59815L,59816L,59817L,
+59818L,59819L,59820L,59821L,59822L,59823L,59824L,59825L,59826L,59827L,
+59828L,59829L,59830L,59831L,59832L,59833L,59834L,59835L,59836L,59837L,
+59838L,59839L,59840L,59841L,59842L,59843L,59844L,59845L,59846L,59847L,
+59848L,59849L,59850L,59851L,59852L,59853L,59854L,59855L,59856L,59857L,
+59858L,59859L,59860L,59861L,59862L,59863L,59864L,59865L,59866L,59867L,
+59868L,59869L,59870L,59871L,59872L,59873L,59874L,59875L,59876L,59877L,
+59878L,59879L,59880L,59881L,59882L,59883L,59884L,59885L,59886L,59887L,
+59888L,59889L,59890L,59891L,59892L,59893L,59894L,59895L,59896L,59897L,
+59898L,59899L,59900L,59901L,59902L,59903L,59904L,59905L,59906L,59907L,
+59908L,59909L,59910L,59911L,59912L,59913L,59914L,59915L,59916L,59917L,
+59918L,59919L,59920L,59921L,59922L,59923L,59924L,59925L,59926L,59927L,
+59928L,59929L,59930L,59931L,59932L,59933L,59934L,59935L,59936L,59937L,
+59938L,59939L,59940L,59941L,59942L,59943L,59944L,59945L,59946L,59947L,
+59948L,59949L,59950L,59951L,59952L,59953L,59954L,59955L,59956L,59957L,
+59958L,59959L,59960L,59961L,59962L,59963L,59964L,59965L,59966L,59967L,
+59968L,59969L,59970L,59971L,59972L,59973L,59974L,59975L,59976L,59977L,
+59978L,59979L,59980L,59981L,59982L,59983L,59984L,59985L,59986L,59987L,
+59988L,59989L,59990L,59991L,59992L,59993L,59994L,59995L,59996L,59997L,
+59998L,59999L,60000L,60001L,60002L,60003L,60004L,60005L,60006L,60007L,
+60008L,60009L,60010L,60011L,60012L,60013L,60014L,60015L,60016L,60017L,
+60018L,60019L,60020L,60021L,60022L,60023L,60024L,60025L,60026L,60027L,
+60028L,60029L,60030L,60031L,60032L,60033L,60034L,60035L,60036L,60037L,
+60038L,60039L,60040L,60041L,60042L,60043L,60044L,60045L,60046L,60047L,
+60048L,60049L,60050L,60051L,60052L,60053L,60054L,60055L,60056L,60057L,
+60058L,60059L,60060L,60061L,60062L,60063L,60064L,60065L,60066L,60067L,
+60068L,60069L,60070L,60071L,60072L,60073L,60074L,60075L,60076L,60077L,
+60078L,60079L,60080L,60081L,60082L,60083L,60084L,60085L,60086L,60087L,
+60088L,60089L,60090L,60091L,60092L,60093L,60094L,60095L,60096L,60097L,
+60098L,60099L,60100L,60101L,60102L,60103L,60104L,60105L,60106L,60107L,
+60108L,60109L,60110L,60111L,60112L,60113L,60114L,60115L,60116L,60117L,
+60118L,60119L,60120L,60121L,60122L,60123L,60124L,60125L,60126L,60127L,
+60128L,60129L,60130L,60131L,60132L,60133L,60134L,60135L,60136L,60137L,
+60138L,60139L,60140L,60141L,60142L,60143L,60144L,60145L,60146L,60147L,
+60148L,60149L,60150L,60151L,60152L,60153L,60154L,60155L,60156L,60157L,
+60158L,60159L,60160L,60161L,60162L,60163L,60164L,60165L,60166L,60167L,
+60168L,60169L,60170L,60171L,60172L,60173L,60174L,60175L,60176L,60177L,
+60178L,60179L,60180L,60181L,60182L,60183L,60184L,60185L,60186L,60187L,
+60188L,60189L,60190L,60191L,60192L,60193L,60194L,60195L,60196L,60197L,
+60198L,60199L,60200L,60201L,60202L,60203L,60204L,60205L,60206L,60207L,
+60208L,60209L,60210L,60211L,60212L,60213L,60214L,60215L,60216L,60217L,
+60218L,60219L,60220L,60221L,60222L,60223L,60224L,60225L,60226L,60227L,
+60228L,60229L,60230L,60231L,60232L,60233L,60234L,60235L,60236L,60237L,
+60238L,60239L,60240L,60241L,60242L,60243L,60244L,60245L,60246L,60247L,
+60248L,60249L,60250L,60251L,60252L,60253L,60254L,60255L,60256L,60257L,
+60258L,60259L,60260L,60261L,60262L,60263L,60264L,60265L,60266L,60267L,
+60268L,60269L,60270L,60271L,60272L,60273L,60274L,60275L,60276L,60277L,
+60278L,60279L,60280L,60281L,60282L,60283L,60284L,60285L,60286L,60287L,
+60288L,60289L,60290L,60291L,60292L,60293L,60294L,60295L,60296L,60297L,
+60298L,60299L,60300L,60301L,60302L,60303L,60304L,60305L,60306L,60307L,
+60308L,60309L,60310L,60311L,60312L,60313L,60314L,60315L,60316L,60317L,
+60318L,60319L,60320L,60321L,60322L,60323L,60324L,60325L,60326L,60327L,
+60328L,60329L,60330L,60331L,60332L,60333L,60334L,60335L,60336L,60337L,
+60338L,60339L,60340L,60341L,60342L,60343L,60344L,60345L,60346L,60347L,
+60348L,60349L,60350L,60351L,60352L,60353L,60354L,60355L,60356L,60357L,
+60358L,60359L,60360L,60361L,60362L,60363L,60364L,60365L,60366L,60367L,
+60368L,60369L,60370L,60371L,60372L,60373L,60374L,60375L,60376L,60377L,
+60378L,60379L,60380L,60381L,60382L,60383L,60384L,60385L,60386L,60387L,
+60388L,60389L,60390L,60391L,60392L,60393L,60394L,60395L,60396L,60397L,
+60398L,60399L,60400L,60401L,60402L,60403L,60404L,60405L,60406L,60407L,
+60408L,60409L,60410L,60411L,60412L,60413L,60414L,60415L,60416L,60417L,
+60418L,60419L,60420L,60421L,60422L,60423L,60424L,60425L,60426L,60427L,
+60428L,60429L,60430L,60431L,60432L,60433L,60434L,60435L,60436L,60437L,
+60438L,60439L,60440L,60441L,60442L,60443L,60444L,60445L,60446L,60447L,
+60448L,60449L,60450L,60451L,60452L,60453L,60454L,60455L,60456L,60457L,
+60458L,60459L,60460L,60461L,60462L,60463L,60464L,60465L,60466L,60467L,
+60468L,60469L,60470L,60471L,60472L,60473L,60474L,60475L,60476L,60477L,
+60478L,60479L,60480L,60481L,60482L,60483L,60484L,60485L,60486L,60487L,
+60488L,60489L,60490L,60491L,60492L,60493L,60494L,60495L,60496L,60497L,
+60498L,60499L,60500L,60501L,60502L,60503L,60504L,60505L,60506L,60507L,
+60508L,60509L,60510L,60511L,60512L,60513L,60514L,60515L,60516L,60517L,
+60518L,60519L,60520L,60521L,60522L,60523L,60524L,60525L,60526L,60527L,
+60528L,60529L,60530L,60531L,60532L,60533L,60534L,60535L,60536L,60537L,
+60538L,60539L,60540L,60541L,60542L,60543L,60544L,60545L,60546L,60547L,
+60548L,60549L,60550L,60551L,60552L,60553L,60554L,60555L,60556L,60557L,
+60558L,60559L,60560L,60561L,60562L,60563L,60564L,60565L,60566L,60567L,
+60568L,60569L,60570L,60571L,60572L,60573L,60574L,60575L,60576L,60577L,
+60578L,60579L,60580L,60581L,60582L,60583L,60584L,60585L,60586L,60587L,
+60588L,60589L,60590L,60591L,60592L,60593L,60594L,60595L,60596L,60597L,
+60598L,60599L,60600L,60601L,60602L,60603L,60604L,60605L,60606L,60607L,
+60608L,60609L,60610L,60611L,60612L,60613L,60614L,60615L,60616L,60617L,
+60618L,60619L,60620L,60621L,60622L,60623L,60624L,60625L,60626L,60627L,
+60628L,60629L,60630L,60631L,60632L,60633L,60634L,60635L,60636L,60637L,
+60638L,60639L,60640L,60641L,60642L,60643L,60644L,60645L,60646L,60647L,
+60648L,60649L,60650L,60651L,60652L,60653L,60654L,60655L,60656L,60657L,
+60658L,60659L,60660L,60661L,60662L,60663L,60664L,60665L,60666L,60667L,
+60668L,60669L,60670L,60671L,60672L,60673L,60674L,60675L,60676L,60677L,
+60678L,60679L,60680L,60681L,60682L,60683L,60684L,60685L,60686L,60687L,
+60688L,60689L,60690L,60691L,60692L,60693L,60694L,60695L,60696L,60697L,
+60698L,60699L,60700L,60701L,60702L,60703L,60704L,60705L,60706L,60707L,
+60708L,60709L,60710L,60711L,60712L,60713L,60714L,60715L,60716L,60717L,
+60718L,60719L,60720L,60721L,60722L,60723L,60724L,60725L,60726L,60727L,
+60728L,60729L,60730L,60731L,60732L,60733L,60734L,60735L,60736L,60737L,
+60738L,60739L,60740L,60741L,60742L,60743L,60744L,60745L,60746L,60747L,
+60748L,60749L,60750L,60751L,60752L,60753L,60754L,60755L,60756L,60757L,
+60758L,60759L,60760L,60761L,60762L,60763L,60764L,60765L,60766L,60767L,
+60768L,60769L,60770L,60771L,60772L,60773L,60774L,60775L,60776L,60777L,
+60778L,60779L,60780L,60781L,60782L,60783L,60784L,60785L,60786L,60787L,
+60788L,60789L,60790L,60791L,60792L,60793L,60794L,60795L,60796L,60797L,
+60798L,60799L,60800L,60801L,60802L,60803L,60804L,60805L,60806L,60807L,
+60808L,60809L,60810L,60811L,60812L,60813L,60814L,60815L,60816L,60817L,
+60818L,60819L,60820L,60821L,60822L,60823L,60824L,60825L,60826L,60827L,
+60828L,60829L,60830L,60831L,60832L,60833L,60834L,60835L,60836L,60837L,
+60838L,60839L,60840L,60841L,60842L,60843L,60844L,60845L,60846L,60847L,
+60848L,60849L,60850L,60851L,60852L,60853L,60854L,60855L,60856L,60857L,
+60858L,60859L,60860L,60861L,60862L,60863L,60864L,60865L,60866L,60867L,
+60868L,60869L,60870L,60871L,60872L,60873L,60874L,60875L,60876L,60877L,
+60878L,60879L,60880L,60881L,60882L,60883L,60884L,60885L,60886L,60887L,
+60888L,60889L,60890L,60891L,60892L,60893L,60894L,60895L,60896L,60897L,
+60898L,60899L,60900L,60901L,60902L,60903L,60904L,60905L,60906L,60907L,
+60908L,60909L,60910L,60911L,60912L,60913L,60914L,60915L,60916L,60917L,
+60918L,60919L,60920L,60921L,60922L,60923L,60924L,60925L,60926L,60927L,
+60928L,60929L,60930L,60931L,60932L,60933L,60934L,60935L,60936L,60937L,
+60938L,60939L,60940L,60941L,60942L,60943L,60944L,60945L,60946L,60947L,
+60948L,60949L,60950L,60951L,60952L,60953L,60954L,60955L,60956L,60957L,
+60958L,60959L,60960L,60961L,60962L,60963L,60964L,60965L,60966L,60967L,
+60968L,60969L,60970L,60971L,60972L,60973L,60974L,60975L,60976L,60977L,
+60978L,60979L,60980L,60981L,60982L,60983L,60984L,60985L,60986L,60987L,
+60988L,60989L,60990L,60991L,60992L,60993L,60994L,60995L,60996L,60997L,
+60998L,60999L,61000L,61001L,61002L,61003L,61004L,61005L,61006L,61007L,
+61008L,61009L,61010L,61011L,61012L,61013L,61014L,61015L,61016L,61017L,
+61018L,61019L,61020L,61021L,61022L,61023L,61024L,61025L,61026L,61027L,
+61028L,61029L,61030L,61031L,61032L,61033L,61034L,61035L,61036L,61037L,
+61038L,61039L,61040L,61041L,61042L,61043L,61044L,61045L,61046L,61047L,
+61048L,61049L,61050L,61051L,61052L,61053L,61054L,61055L,61056L,61057L,
+61058L,61059L,61060L,61061L,61062L,61063L,61064L,61065L,61066L,61067L,
+61068L,61069L,61070L,61071L,61072L,61073L,61074L,61075L,61076L,61077L,
+61078L,61079L,61080L,61081L,61082L,61083L,61084L,61085L,61086L,61087L,
+61088L,61089L,61090L,61091L,61092L,61093L,61094L,61095L,61096L,61097L,
+61098L,61099L,61100L,61101L,61102L,61103L,61104L,61105L,61106L,61107L,
+61108L,61109L,61110L,61111L,61112L,61113L,61114L,61115L,61116L,61117L,
+61118L,61119L,61120L,61121L,61122L,61123L,61124L,61125L,61126L,61127L,
+61128L,61129L,61130L,61131L,61132L,61133L,61134L,61135L,61136L,61137L,
+61138L,61139L,61140L,61141L,61142L,61143L,61144L,61145L,61146L,61147L,
+61148L,61149L,61150L,61151L,61152L,61153L,61154L,61155L,61156L,61157L,
+61158L,61159L,61160L,61161L,61162L,61163L,61164L,61165L,61166L,61167L,
+61168L,61169L,61170L,61171L,61172L,61173L,61174L,61175L,61176L,61177L,
+61178L,61179L,61180L,61181L,61182L,61183L,61184L,61185L,61186L,61187L,
+61188L,61189L,61190L,61191L,61192L,61193L,61194L,61195L,61196L,61197L,
+61198L,61199L,61200L,61201L,61202L,61203L,61204L,61205L,61206L,61207L,
+61208L,61209L,61210L,61211L,61212L,61213L,61214L,61215L,61216L,61217L,
+61218L,61219L,61220L,61221L,61222L,61223L,61224L,61225L,61226L,61227L,
+61228L,61229L,61230L,61231L,61232L,61233L,61234L,61235L,61236L,61237L,
+61238L,61239L,61240L,61241L,61242L,61243L,61244L,61245L,61246L,61247L,
+61248L,61249L,61250L,61251L,61252L,61253L,61254L,61255L,61256L,61257L,
+61258L,61259L,61260L,61261L,61262L,61263L,61264L,61265L,61266L,61267L,
+61268L,61269L,61270L,61271L,61272L,61273L,61274L,61275L,61276L,61277L,
+61278L,61279L,61280L,61281L,61282L,61283L,61284L,61285L,61286L,61287L,
+61288L,61289L,61290L,61291L,61292L,61293L,61294L,61295L,61296L,61297L,
+61298L,61299L,61300L,61301L,61302L,61303L,61304L,61305L,61306L,61307L,
+61308L,61309L,61310L,61311L,61312L,61313L,61314L,61315L,61316L,61317L,
+61318L,61319L,61320L,61321L,61322L,61323L,61324L,61325L,61326L,61327L,
+61328L,61329L,61330L,61331L,61332L,61333L,61334L,61335L,61336L,61337L,
+61338L,61339L,61340L,61341L,61342L,61343L,61344L,61345L,61346L,61347L,
+61348L,61349L,61350L,61351L,61352L,61353L,61354L,61355L,61356L,61357L,
+61358L,61359L,61360L,61361L,61362L,61363L,61364L,61365L,61366L,61367L,
+61368L,61369L,61370L,61371L,61372L,61373L,61374L,61375L,61376L,61377L,
+61378L,61379L,61380L,61381L,61382L,61383L,61384L,61385L,61386L,61387L,
+61388L,61389L,61390L,61391L,61392L,61393L,61394L,61395L,61396L,61397L,
+61398L,61399L,61400L,61401L,61402L,61403L,61404L,61405L,61406L,61407L,
+61408L,61409L,61410L,61411L,61412L,61413L,61414L,61415L,61416L,61417L,
+61418L,61419L,61420L,61421L,61422L,61423L,61424L,61425L,61426L,61427L,
+61428L,61429L,61430L,61431L,61432L,61433L,61434L,61435L,61436L,61437L,
+61438L,61439L,61440L,61441L,61442L,61443L,61444L,61445L,61446L,61447L,
+61448L,61449L,61450L,61451L,61452L,61453L,61454L,61455L,61456L,61457L,
+61458L,61459L,61460L,61461L,61462L,61463L,61464L,61465L,61466L,61467L,
+61468L,61469L,61470L,61471L,61472L,61473L,61474L,61475L,61476L,61477L,
+61478L,61479L,61480L,61481L,61482L,61483L,61484L,61485L,61486L,61487L,
+61488L,61489L,61490L,61491L,61492L,61493L,61494L,61495L,61496L,61497L,
+61498L,61499L,61500L,61501L,61502L,61503L,61504L,61505L,61506L,61507L,
+61508L,61509L,61510L,61511L,61512L,61513L,61514L,61515L,61516L,61517L,
+61518L,61519L,61520L,61521L,61522L,61523L,61524L,61525L,61526L,61527L,
+61528L,61529L,61530L,61531L,61532L,61533L,61534L,61535L,61536L,61537L,
+61538L,61539L,61540L,61541L,61542L,61543L,61544L,61545L,61546L,61547L,
+61548L,61549L,61550L,61551L,61552L,61553L,61554L,61555L,61556L,61557L,
+61558L,61559L,61560L,61561L,61562L,61563L,61564L,61565L,61566L,61567L,
+61568L,61569L,61570L,61571L,61572L,61573L,61574L,61575L,61576L,61577L,
+61578L,61579L,61580L,61581L,61582L,61583L,61584L,61585L,61586L,61587L,
+61588L,61589L,61590L,61591L,61592L,61593L,61594L,61595L,61596L,61597L,
+61598L,61599L,61600L,61601L,61602L,61603L,61604L,61605L,61606L,61607L,
+61608L,61609L,61610L,61611L,61612L,61613L,61614L,61615L,61616L,61617L,
+61618L,61619L,61620L,61621L,61622L,61623L,61624L,61625L,61626L,61627L,
+61628L,61629L,61630L,61631L,61632L,61633L,61634L,61635L,61636L,61637L,
+61638L,61639L,61640L,61641L,61642L,61643L,61644L,61645L,61646L,61647L,
+61648L,61649L,61650L,61651L,61652L,61653L,61654L,61655L,61656L,61657L,
+61658L,61659L,61660L,61661L,61662L,61663L,61664L,61665L,61666L,61667L,
+61668L,61669L,61670L,61671L,61672L,61673L,61674L,61675L,61676L,61677L,
+61678L,61679L,61680L,61681L,61682L,61683L,61684L,61685L,61686L,61687L,
+61688L,61689L,61690L,61691L,61692L,61693L,61694L,61695L,61696L,61697L,
+61698L,61699L,61700L,61701L,61702L,61703L,61704L,61705L,61706L,61707L,
+61708L,61709L,61710L,61711L,61712L,61713L,61714L,61715L,61716L,61717L,
+61718L,61719L,61720L,61721L,61722L,61723L,61724L,61725L,61726L,61727L,
+61728L,61729L,61730L,61731L,61732L,61733L,61734L,61735L,61736L,61737L,
+61738L,61739L,61740L,61741L,61742L,61743L,61744L,61745L,61746L,61747L,
+61748L,61749L,61750L,61751L,61752L,61753L,61754L,61755L,61756L,61757L,
+61758L,61759L,61760L,61761L,61762L,61763L,61764L,61765L,61766L,61767L,
+61768L,61769L,61770L,61771L,61772L,61773L,61774L,61775L,61776L,61777L,
+61778L,61779L,61780L,61781L,61782L,61783L,61784L,61785L,61786L,61787L,
+61788L,61789L,61790L,61791L,61792L,61793L,61794L,61795L,61796L,61797L,
+61798L,61799L,61800L,61801L,61802L,61803L,61804L,61805L,61806L,61807L,
+61808L,61809L,61810L,61811L,61812L,61813L,61814L,61815L,61816L,61817L,
+61818L,61819L,61820L,61821L,61822L,61823L,61824L,61825L,61826L,61827L,
+61828L,61829L,61830L,61831L,61832L,61833L,61834L,61835L,61836L,61837L,
+61838L,61839L,61840L,61841L,61842L,61843L,61844L,61845L,61846L,61847L,
+61848L,61849L,61850L,61851L,61852L,61853L,61854L,61855L,61856L,61857L,
+61858L,61859L,61860L,61861L,61862L,61863L,61864L,61865L,61866L,61867L,
+61868L,61869L,61870L,61871L,61872L,61873L,61874L,61875L,61876L,61877L,
+61878L,61879L,61880L,61881L,61882L,61883L,61884L,61885L,61886L,61887L,
+61888L,61889L,61890L,61891L,61892L,61893L,61894L,61895L,61896L,61897L,
+61898L,61899L,61900L,61901L,61902L,61903L,61904L,61905L,61906L,61907L,
+61908L,61909L,61910L,61911L,61912L,61913L,61914L,61915L,61916L,61917L,
+61918L,61919L,61920L,61921L,61922L,61923L,61924L,61925L,61926L,61927L,
+61928L,61929L,61930L,61931L,61932L,61933L,61934L,61935L,61936L,61937L,
+61938L,61939L,61940L,61941L,61942L,61943L,61944L,61945L,61946L,61947L,
+61948L,61949L,61950L,61951L,61952L,61953L,61954L,61955L,61956L,61957L,
+61958L,61959L,61960L,61961L,61962L,61963L,61964L,61965L,61966L,61967L,
+61968L,61969L,61970L,61971L,61972L,61973L,61974L,61975L,61976L,61977L,
+61978L,61979L,61980L,61981L,61982L,61983L,61984L,61985L,61986L,61987L,
+61988L,61989L,61990L,61991L,61992L,61993L,61994L,61995L,61996L,61997L,
+61998L,61999L,62000L,62001L,62002L,62003L,62004L,62005L,62006L,62007L,
+62008L,62009L,62010L,62011L,62012L,62013L,62014L,62015L,62016L,62017L,
+62018L,62019L,62020L,62021L,62022L,62023L,62024L,62025L,62026L,62027L,
+62028L,62029L,62030L,62031L,62032L,62033L,62034L,62035L,62036L,62037L,
+62038L,62039L,62040L,62041L,62042L,62043L,62044L,62045L,62046L,62047L,
+62048L,62049L,62050L,62051L,62052L,62053L,62054L,62055L,62056L,62057L,
+62058L,62059L,62060L,62061L,62062L,62063L,62064L,62065L,62066L,62067L,
+62068L,62069L,62070L,62071L,62072L,62073L,62074L,62075L,62076L,62077L,
+62078L,62079L,62080L,62081L,62082L,62083L,62084L,62085L,62086L,62087L,
+62088L,62089L,62090L,62091L,62092L,62093L,62094L,62095L,62096L,62097L,
+62098L,62099L,62100L,62101L,62102L,62103L,62104L,62105L,62106L,62107L,
+62108L,62109L,62110L,62111L,62112L,62113L,62114L,62115L,62116L,62117L,
+62118L,62119L,62120L,62121L,62122L,62123L,62124L,62125L,62126L,62127L,
+62128L,62129L,62130L,62131L,62132L,62133L,62134L,62135L,62136L,62137L,
+62138L,62139L,62140L,62141L,62142L,62143L,62144L,62145L,62146L,62147L,
+62148L,62149L,62150L,62151L,62152L,62153L,62154L,62155L,62156L,62157L,
+62158L,62159L,62160L,62161L,62162L,62163L,62164L,62165L,62166L,62167L,
+62168L,62169L,62170L,62171L,62172L,62173L,62174L,62175L,62176L,62177L,
+62178L,62179L,62180L,62181L,62182L,62183L,62184L,62185L,62186L,62187L,
+62188L,62189L,62190L,62191L,62192L,62193L,62194L,62195L,62196L,62197L,
+62198L,62199L,62200L,62201L,62202L,62203L,62204L,62205L,62206L,62207L,
+62208L,62209L,62210L,62211L,62212L,62213L,62214L,62215L,62216L,62217L,
+62218L,62219L,62220L,62221L,62222L,62223L,62224L,62225L,62226L,62227L,
+62228L,62229L,62230L,62231L,62232L,62233L,62234L,62235L,62236L,62237L,
+62238L,62239L,62240L,62241L,62242L,62243L,62244L,62245L,62246L,62247L,
+62248L,62249L,62250L,62251L,62252L,62253L,62254L,62255L,62256L,62257L,
+62258L,62259L,62260L,62261L,62262L,62263L,62264L,62265L,62266L,62267L,
+62268L,62269L,62270L,62271L,62272L,62273L,62274L,62275L,62276L,62277L,
+62278L,62279L,62280L,62281L,62282L,62283L,62284L,62285L,62286L,62287L,
+62288L,62289L,62290L,62291L,62292L,62293L,62294L,62295L,62296L,62297L,
+62298L,62299L,62300L,62301L,62302L,62303L,62304L,62305L,62306L,62307L,
+62308L,62309L,62310L,62311L,62312L,62313L,62314L,62315L,62316L,62317L,
+62318L,62319L,62320L,62321L,62322L,62323L,62324L,62325L,62326L,62327L,
+62328L,62329L,62330L,62331L,62332L,62333L,62334L,62335L,62336L,62337L,
+62338L,62339L,62340L,62341L,62342L,62343L,62344L,62345L,62346L,62347L,
+62348L,62349L,62350L,62351L,62352L,62353L,62354L,62355L,62356L,62357L,
+62358L,62359L,62360L,62361L,62362L,62363L,62364L,62365L,62366L,62367L,
+62368L,62369L,62370L,62371L,62372L,62373L,62374L,62375L,62376L,62377L,
+62378L,62379L,62380L,62381L,62382L,62383L,62384L,62385L,62386L,62387L,
+62388L,62389L,62390L,62391L,62392L,62393L,62394L,62395L,62396L,62397L,
+62398L,62399L,62400L,62401L,62402L,62403L,62404L,62405L,62406L,62407L,
+62408L,62409L,62410L,62411L,62412L,62413L,62414L,62415L,62416L,62417L,
+62418L,62419L,62420L,62421L,62422L,62423L,62424L,62425L,62426L,62427L,
+62428L,62429L,62430L,62431L,62432L,62433L,62434L,62435L,62436L,62437L,
+62438L,62439L,62440L,62441L,62442L,62443L,62444L,62445L,62446L,62447L,
+62448L,62449L,62450L,62451L,62452L,62453L,62454L,62455L,62456L,62457L,
+62458L,62459L,62460L,62461L,62462L,62463L,62464L,62465L,62466L,62467L,
+62468L,62469L,62470L,62471L,62472L,62473L,62474L,62475L,62476L,62477L,
+62478L,62479L,62480L,62481L,62482L,62483L,62484L,62485L,62486L,62487L,
+62488L,62489L,62490L,62491L,62492L,62493L,62494L,62495L,62496L,62497L,
+62498L,62499L,62500L,62501L,62502L,62503L,62504L,62505L,62506L,62507L,
+62508L,62509L,62510L,62511L,62512L,62513L,62514L,62515L,62516L,62517L,
+62518L,62519L,62520L,62521L,62522L,62523L,62524L,62525L,62526L,62527L,
+62528L,62529L,62530L,62531L,62532L,62533L,62534L,62535L,62536L,62537L,
+62538L,62539L,62540L,62541L,62542L,62543L,62544L,62545L,62546L,62547L,
+62548L,62549L,62550L,62551L,62552L,62553L,62554L,62555L,62556L,62557L,
+62558L,62559L,62560L,62561L,62562L,62563L,62564L,62565L,62566L,62567L,
+62568L,62569L,62570L,62571L,62572L,62573L,62574L,62575L,62576L,62577L,
+62578L,62579L,62580L,62581L,62582L,62583L,62584L,62585L,62586L,62587L,
+62588L,62589L,62590L,62591L,62592L,62593L,62594L,62595L,62596L,62597L,
+62598L,62599L,62600L,62601L,62602L,62603L,62604L,62605L,62606L,62607L,
+62608L,62609L,62610L,62611L,62612L,62613L,62614L,62615L,62616L,62617L,
+62618L,62619L,62620L,62621L,62622L,62623L,62624L,62625L,62626L,62627L,
+62628L,62629L,62630L,62631L,62632L,62633L,62634L,62635L,62636L,62637L,
+62638L,62639L,62640L,62641L,62642L,62643L,62644L,62645L,62646L,62647L,
+62648L,62649L,62650L,62651L,62652L,62653L,62654L,62655L,62656L,62657L,
+62658L,62659L,62660L,62661L,62662L,62663L,62664L,62665L,62666L,62667L,
+62668L,62669L,62670L,62671L,62672L,62673L,62674L,62675L,62676L,62677L,
+62678L,62679L,62680L,62681L,62682L,62683L,62684L,62685L,62686L,62687L,
+62688L,62689L,62690L,62691L,62692L,62693L,62694L,62695L,62696L,62697L,
+62698L,62699L,62700L,62701L,62702L,62703L,62704L,62705L,62706L,62707L,
+62708L,62709L,62710L,62711L,62712L,62713L,62714L,62715L,62716L,62717L,
+62718L,62719L,62720L,62721L,62722L,62723L,62724L,62725L,62726L,62727L,
+62728L,62729L,62730L,62731L,62732L,62733L,62734L,62735L,62736L,62737L,
+62738L,62739L,62740L,62741L,62742L,62743L,62744L,62745L,62746L,62747L,
+62748L,62749L,62750L,62751L,62752L,62753L,62754L,62755L,62756L,62757L,
+62758L,62759L,62760L,62761L,62762L,62763L,62764L,62765L,62766L,62767L,
+62768L,62769L,62770L,62771L,62772L,62773L,62774L,62775L,62776L,62777L,
+62778L,62779L,62780L,62781L,62782L,62783L,62784L,62785L,62786L,62787L,
+62788L,62789L,62790L,62791L,62792L,62793L,62794L,62795L,62796L,62797L,
+62798L,62799L,62800L,62801L,62802L,62803L,62804L,62805L,62806L,62807L,
+62808L,62809L,62810L,62811L,62812L,62813L,62814L,62815L,62816L,62817L,
+62818L,62819L,62820L,62821L,62822L,62823L,62824L,62825L,62826L,62827L,
+62828L,62829L,62830L,62831L,62832L,62833L,62834L,62835L,62836L,62837L,
+62838L,62839L,62840L,62841L,62842L,62843L,62844L,62845L,62846L,62847L,
+62848L,62849L,62850L,62851L,62852L,62853L,62854L,62855L,62856L,62857L,
+62858L,62859L,62860L,62861L,62862L,62863L,62864L,62865L,62866L,62867L,
+62868L,62869L,62870L,62871L,62872L,62873L,62874L,62875L,62876L,62877L,
+62878L,62879L,62880L,62881L,62882L,62883L,62884L,62885L,62886L,62887L,
+62888L,62889L,62890L,62891L,62892L,62893L,62894L,62895L,62896L,62897L,
+62898L,62899L,62900L,62901L,62902L,62903L,62904L,62905L,62906L,62907L,
+62908L,62909L,62910L,62911L,62912L,62913L,62914L,62915L,62916L,62917L,
+62918L,62919L,62920L,62921L,62922L,62923L,62924L,62925L,62926L,62927L,
+62928L,62929L,62930L,62931L,62932L,62933L,62934L,62935L,62936L,62937L,
+62938L,62939L,62940L,62941L,62942L,62943L,62944L,62945L,62946L,62947L,
+62948L,62949L,62950L,62951L,62952L,62953L,62954L,62955L,62956L,62957L,
+62958L,62959L,62960L,62961L,62962L,62963L,62964L,62965L,62966L,62967L,
+62968L,62969L,62970L,62971L,62972L,62973L,62974L,62975L,62976L,62977L,
+62978L,62979L,62980L,62981L,62982L,62983L,62984L,62985L,62986L,62987L,
+62988L,62989L,62990L,62991L,62992L,62993L,62994L,62995L,62996L,62997L,
+62998L,62999L,63000L,63001L,63002L,63003L,63004L,63005L,63006L,63007L,
+63008L,63009L,63010L,63011L,63012L,63013L,63014L,63015L,63016L,63017L,
+63018L,63019L,63020L,63021L,63022L,63023L,63024L,63025L,63026L,63027L,
+63028L,63029L,63030L,63031L,63032L,63033L,63034L,63035L,63036L,63037L,
+63038L,63039L,63040L,63041L,63042L,63043L,63044L,63045L,63046L,63047L,
+63048L,63049L,63050L,63051L,63052L,63053L,63054L,63055L,63056L,63057L,
+63058L,63059L,63060L,63061L,63062L,63063L,63064L,63065L,63066L,63067L,
+63068L,63069L,63070L,63071L,63072L,63073L,63074L,63075L,63076L,63077L,
+63078L,63079L,63080L,63081L,63082L,63083L,63084L,63085L,63086L,63087L,
+63088L,63089L,63090L,63091L,63092L,63093L,63094L,63095L,63096L,63097L,
+63098L,63099L,63100L,63101L,63102L,63103L,63104L,63105L,63106L,63107L,
+63108L,63109L,63110L,63111L,63112L,63113L,63114L,63115L,63116L,63117L,
+63118L,63119L,63120L,63121L,63122L,63123L,63124L,63125L,63126L,63127L,
+63128L,63129L,63130L,63131L,63132L,63133L,63134L,63135L,63136L,63137L,
+63138L,63139L,63140L,63141L,63142L,63143L,63144L,63145L,63146L,63147L,
+63148L,63149L,63150L,63151L,63152L,63153L,63154L,63155L,63156L,63157L,
+63158L,63159L,63160L,63161L,63162L,63163L,63164L,63165L,63166L,63167L,
+63168L,63169L,63170L,63171L,63172L,63173L,63174L,63175L,63176L,63177L,
+63178L,63179L,63180L,63181L,63182L,63183L,63184L,63185L,63186L,63187L,
+63188L,63189L,63190L,63191L,63192L,63193L,63194L,63195L,63196L,63197L,
+63198L,63199L,63200L,63201L,63202L,63203L,63204L,63205L,63206L,63207L,
+63208L,63209L,63210L,63211L,63212L,63213L,63214L,63215L,63216L,63217L,
+63218L,63219L,63220L,63221L,63222L,63223L,63224L,63225L,63226L,63227L,
+63228L,63229L,63230L,63231L,63232L,63233L,63234L,63235L,63236L,63237L,
+63238L,63239L,63240L,63241L,63242L,63243L,63244L,63245L,63246L,63247L,
+63248L,63249L,63250L,63251L,63252L,63253L,63254L,63255L,63256L,63257L,
+63258L,63259L,63260L,63261L,63262L,63263L,63264L,63265L,63266L,63267L,
+63268L,63269L,63270L,63271L,63272L,63273L,63274L,63275L,63276L,63277L,
+63278L,63279L,63280L,63281L,63282L,63283L,63284L,63285L,63286L,63287L,
+63288L,63289L,63290L,63291L,63292L,63293L,63294L,63295L,63296L,63297L,
+63298L,63299L,63300L,63301L,63302L,63303L,63304L,63305L,63306L,63307L,
+63308L,63309L,63310L,63311L,63312L,63313L,63314L,63315L,63316L,63317L,
+63318L,63319L,63320L,63321L,63322L,63323L,63324L,63325L,63326L,63327L,
+63328L,63329L,63330L,63331L,63332L,63333L,63334L,63335L,63336L,63337L,
+63338L,63339L,63340L,63341L,63342L,63343L,63344L,63345L,63346L,63347L,
+63348L,63349L,63350L,63351L,63352L,63353L,63354L,63355L,63356L,63357L,
+63358L,63359L,63360L,63361L,63362L,63363L,63364L,63365L,63366L,63367L,
+63368L,63369L,63370L,63371L,63372L,63373L,63374L,63375L,63376L,63377L,
+63378L,63379L,63380L,63381L,63382L,63383L,63384L,63385L,63386L,63387L,
+63388L,63389L,63390L,63391L,63392L,63393L,63394L,63395L,63396L,63397L,
+63398L,63399L,63400L,63401L,63402L,63403L,63404L,63405L,63406L,63407L,
+63408L,63409L,63410L,63411L,63412L,63413L,63414L,63415L,63416L,63417L,
+63418L,63419L,63420L,63421L,63422L,63423L,63424L,63425L,63426L,63427L,
+63428L,63429L,63430L,63431L,63432L,63433L,63434L,63435L,63436L,63437L,
+63438L,63439L,63440L,63441L,63442L,63443L,63444L,63445L,63446L,63447L,
+63448L,63449L,63450L,63451L,63452L,63453L,63454L,63455L,63456L,63457L,
+63458L,63459L,63460L,63461L,63462L,63463L,63464L,63465L,63466L,63467L,
+63468L,63469L,63470L,63471L,63472L,63473L,63474L,63475L,63476L,63477L,
+63478L,63479L,63480L,63481L,63482L,63483L,63484L,63485L,63486L,63487L,
+63488L,63489L,63490L,63491L,63492L,63493L,63494L,63495L,63496L,63497L,
+63498L,63499L,63500L,63501L,63502L,63503L,63504L,63505L,63506L,63507L,
+63508L,63509L,63510L,63511L,63512L,63513L,63514L,63515L,63516L,63517L,
+63518L,63519L,63520L,63521L,63522L,63523L,63524L,63525L,63526L,63527L,
+63528L,63529L,63530L,63531L,63532L,63533L,63534L,63535L,63536L,63537L,
+63538L,63539L,63540L,63541L,63542L,63543L,63544L,63545L,63546L,63547L,
+63548L,63549L,63550L,63551L,63552L,63553L,63554L,63555L,63556L,63557L,
+63558L,63559L,63560L,63561L,63562L,63563L,63564L,63565L,63566L,63567L,
+63568L,63569L,63570L,63571L,63572L,63573L,63574L,63575L,63576L,63577L,
+63578L,63579L,63580L,63581L,63582L,63583L,63584L,63585L,63586L,63587L,
+63588L,63589L,63590L,63591L,63592L,63593L,63594L,63595L,63596L,63597L,
+63598L,63599L,63600L,63601L,63602L,63603L,63604L,63605L,63606L,63607L,
+63608L,63609L,63610L,63611L,63612L,63613L,63614L,63615L,63616L,63617L,
+63618L,63619L,63620L,63621L,63622L,63623L,63624L,63625L,63626L,63627L,
+63628L,63629L,63630L,63631L,63632L,63633L,63634L,63635L,63636L,63637L,
+63638L,63639L,63640L,63641L,63642L,63643L,63644L,63645L,63646L,63647L,
+63648L,63649L,63650L,63651L,63652L,63653L,63654L,63655L,63656L,63657L,
+63658L,63659L,63660L,63661L,63662L,63663L,63664L,63665L,63666L,63667L,
+63668L,63669L,63670L,63671L,63672L,63673L,63674L,63675L,63676L,63677L,
+63678L,63679L,63680L,63681L,63682L,63683L,63684L,63685L,63686L,63687L,
+63688L,63689L,63690L,63691L,63692L,63693L,63694L,63695L,63696L,63697L,
+63698L,63699L,63700L,63701L,63702L,63703L,63704L,63705L,63706L,63707L,
+63708L,63709L,63710L,63711L,63712L,63713L,63714L,63715L,63716L,63717L,
+63718L,63719L,63720L,63721L,63722L,63723L,63724L,63725L,63726L,63727L,
+63728L,63729L,63730L,63731L,63732L,63733L,63734L,63735L,63736L,63737L,
+63738L,63739L,63740L,63741L,63742L,63743L,63744L,63745L,63746L,63747L,
+63748L,63749L,63750L,63751L,63752L,63753L,63754L,63755L,63756L,63757L,
+63758L,63759L,63760L,63761L,63762L,63763L,63764L,63765L,63766L,63767L,
+63768L,63769L,63770L,63771L,63772L,63773L,63774L,63775L,63776L,63777L,
+63778L,63779L,63780L,63781L,63782L,63783L,63784L,63785L,63786L,63787L,
+63788L,63789L,63790L,63791L,63792L,63793L,63794L,63795L,63796L,63797L,
+63798L,63799L,63800L,63801L,63802L,63803L,63804L,63805L,63806L,63807L,
+63808L,63809L,63810L,63811L,63812L,63813L,63814L,63815L,63816L,63817L,
+63818L,63819L,63820L,63821L,63822L,63823L,63824L,63825L,63826L,63827L,
+63828L,63829L,63830L,63831L,63832L,63833L,63834L,63835L,63836L,63837L,
+63838L,63839L,63840L,63841L,63842L,63843L,63844L,63845L,63846L,63847L,
+63848L,63849L,63850L,63851L,63852L,63853L,63854L,63855L,63856L,63857L,
+63858L,63859L,63860L,63861L,63862L,63863L,63864L,63865L,63866L,63867L,
+63868L,63869L,63870L,63871L,63872L,63873L,63874L,63875L,63876L,63877L,
+63878L,63879L,63880L,63881L,63882L,63883L,63884L,63885L,63886L,63887L,
+63888L,63889L,63890L,63891L,63892L,63893L,63894L,63895L,63896L,63897L,
+63898L,63899L,63900L,63901L,63902L,63903L,63904L,63905L,63906L,63907L,
+63908L,63909L,63910L,63911L,63912L,63913L,63914L,63915L,63916L,63917L,
+63918L,63919L,63920L,63921L,63922L,63923L,63924L,63925L,63926L,63927L,
+63928L,63929L,63930L,63931L,63932L,63933L,63934L,63935L,63936L,63937L,
+63938L,63939L,63940L,63941L,63942L,63943L,63944L,63945L,63946L,63947L,
+63948L,63949L,63950L,63951L,63952L,63953L,63954L,63955L,63956L,63957L,
+63958L,63959L,63960L,63961L,63962L,63963L,63964L,63965L,63966L,63967L,
+63968L,63969L,63970L,63971L,63972L,63973L,63974L,63975L,63976L,63977L,
+63978L,63979L,63980L,63981L,63982L,63983L,63984L,63985L,63986L,63987L,
+63988L,63989L,63990L,63991L,63992L,63993L,63994L,63995L,63996L,63997L,
+63998L,63999L,64000L,64001L,64002L,64003L,64004L,64005L,64006L,64007L,
+64008L,64009L,64010L,64011L,64012L,64013L,64014L,64015L,64016L,64017L,
+64018L,64019L,64020L,64021L,64022L,64023L,64024L,64025L,64026L,64027L,
+64028L,64029L,64030L,64031L,64032L,64033L,64034L,64035L,64036L,64037L,
+64038L,64039L,64040L,64041L,64042L,64043L,64044L,64045L,64046L,64047L,
+64048L,64049L,64050L,64051L,64052L,64053L,64054L,64055L,64056L,64057L,
+64058L,64059L,64060L,64061L,64062L,64063L,64064L,64065L,64066L,64067L,
+64068L,64069L,64070L,64071L,64072L,64073L,64074L,64075L,64076L,64077L,
+64078L,64079L,64080L,64081L,64082L,64083L,64084L,64085L,64086L,64087L,
+64088L,64089L,64090L,64091L,64092L,64093L,64094L,64095L,64096L,64097L,
+64098L,64099L,64100L,64101L,64102L,64103L,64104L,64105L,64106L,64107L,
+64108L,64109L,64110L,64111L,64112L,64113L,64114L,64115L,64116L,64117L,
+64118L,64119L,64120L,64121L,64122L,64123L,64124L,64125L,64126L,64127L,
+64128L,64129L,64130L,64131L,64132L,64133L,64134L,64135L,64136L,64137L,
+64138L,64139L,64140L,64141L,64142L,64143L,64144L,64145L,64146L,64147L,
+64148L,64149L,64150L,64151L,64152L,64153L,64154L,64155L,64156L,64157L,
+64158L,64159L,64160L,64161L,64162L,64163L,64164L,64165L,64166L,64167L,
+64168L,64169L,64170L,64171L,64172L,64173L,64174L,64175L,64176L,64177L,
+64178L,64179L,64180L,64181L,64182L,64183L,64184L,64185L,64186L,64187L,
+64188L,64189L,64190L,64191L,64192L,64193L,64194L,64195L,64196L,64197L,
+64198L,64199L,64200L,64201L,64202L,64203L,64204L,64205L,64206L,64207L,
+64208L,64209L,64210L,64211L,64212L,64213L,64214L,64215L,64216L,64217L,
+64218L,64219L,64220L,64221L,64222L,64223L,64224L,64225L,64226L,64227L,
+64228L,64229L,64230L,64231L,64232L,64233L,64234L,64235L,64236L,64237L,
+64238L,64239L,64240L,64241L,64242L,64243L,64244L,64245L,64246L,64247L,
+64248L,64249L,64250L,64251L,64252L,64253L,64254L,64255L,64256L,64257L,
+64258L,64259L,64260L,64261L,64262L,64263L,64264L,64265L,64266L,64267L,
+64268L,64269L,64270L,64271L,64272L,64273L,64274L,64275L,64276L,64277L,
+64278L,64279L,64280L,64281L,64282L,64283L,64284L,64285L,64286L,64287L,
+64288L,64289L,64290L,64291L,64292L,64293L,64294L,64295L,64296L,64297L,
+64298L,64299L,64300L,64301L,64302L,64303L,64304L,64305L,64306L,64307L,
+64308L,64309L,64310L,64311L,64312L,64313L,64314L,64315L,64316L,64317L,
+64318L,64319L,64320L,64321L,64322L,64323L,64324L,64325L,64326L,64327L,
+64328L,64329L,64330L,64331L,64332L,64333L,64334L,64335L,64336L,64337L,
+64338L,64339L,64340L,64341L,64342L,64343L,64344L,64345L,64346L,64347L,
+64348L,64349L,64350L,64351L,64352L,64353L,64354L,64355L,64356L,64357L,
+64358L,64359L,64360L,64361L,64362L,64363L,64364L,64365L,64366L,64367L,
+64368L,64369L,64370L,64371L,64372L,64373L,64374L,64375L,64376L,64377L,
+64378L,64379L,64380L,64381L,64382L,64383L,64384L,64385L,64386L,64387L,
+64388L,64389L,64390L,64391L,64392L,64393L,64394L,64395L,64396L,64397L,
+64398L,64399L,64400L,64401L,64402L,64403L,64404L,64405L,64406L,64407L,
+64408L,64409L,64410L,64411L,64412L,64413L,64414L,64415L,64416L,64417L,
+64418L,64419L,64420L,64421L,64422L,64423L,64424L,64425L,64426L,64427L,
+64428L,64429L,64430L,64431L,64432L,64433L,64434L,64435L,64436L,64437L,
+64438L,64439L,64440L,64441L,64442L,64443L,64444L,64445L,64446L,64447L,
+64448L,64449L,64450L,64451L,64452L,64453L,64454L,64455L,64456L,64457L,
+64458L,64459L,64460L,64461L,64462L,64463L,64464L,64465L,64466L,64467L,
+64468L,64469L,64470L,64471L,64472L,64473L,64474L,64475L,64476L,64477L,
+64478L,64479L,64480L,64481L,64482L,64483L,64484L,64485L,64486L,64487L,
+64488L,64489L,64490L,64491L,64492L,64493L,64494L,64495L,64496L,64497L,
+64498L,64499L,64500L,64501L,64502L,64503L,64504L,64505L,64506L,64507L,
+64508L,64509L,64510L,64511L,64512L,64513L,64514L,64515L,64516L,64517L,
+64518L,64519L,64520L,64521L,64522L,64523L,64524L,64525L,64526L,64527L,
+64528L,64529L,64530L,64531L,64532L,64533L,64534L,64535L,64536L,64537L,
+64538L,64539L,64540L,64541L,64542L,64543L,64544L,64545L,64546L,64547L,
+64548L,64549L,64550L,64551L,64552L,64553L,64554L,64555L,64556L,64557L,
+64558L,64559L,64560L,64561L,64562L,64563L,64564L,64565L,64566L,64567L,
+64568L,64569L,64570L,64571L,64572L,64573L,64574L,64575L,64576L,64577L,
+64578L,64579L,64580L,64581L,64582L,64583L,64584L,64585L,64586L,64587L,
+64588L,64589L,64590L,64591L,64592L,64593L,64594L,64595L,64596L,64597L,
+64598L,64599L,64600L,64601L,64602L,64603L,64604L,64605L,64606L,64607L,
+64608L,64609L,64610L,64611L,64612L,64613L,64614L,64615L,64616L,64617L,
+64618L,64619L,64620L,64621L,64622L,64623L,64624L,64625L,64626L,64627L,
+64628L,64629L,64630L,64631L,64632L,64633L,64634L,64635L,64636L,64637L,
+64638L,64639L,64640L,64641L,64642L,64643L,64644L,64645L,64646L,64647L,
+64648L,64649L,64650L,64651L,64652L,64653L,64654L,64655L,64656L,64657L,
+64658L,64659L,64660L,64661L,64662L,64663L,64664L,64665L,64666L,64667L,
+64668L,64669L,64670L,64671L,64672L,64673L,64674L,64675L,64676L,64677L,
+64678L,64679L,64680L,64681L,64682L,64683L,64684L,64685L,64686L,64687L,
+64688L,64689L,64690L,64691L,64692L,64693L,64694L,64695L,64696L,64697L,
+64698L,64699L,64700L,64701L,64702L,64703L,64704L,64705L,64706L,64707L,
+64708L,64709L,64710L,64711L,64712L,64713L,64714L,64715L,64716L,64717L,
+64718L,64719L,64720L,64721L,64722L,64723L,64724L,64725L,64726L,64727L,
+64728L,64729L,64730L,64731L,64732L,64733L,64734L,64735L,64736L,64737L,
+64738L,64739L,64740L,64741L,64742L,64743L,64744L,64745L,64746L,64747L,
+64748L,64749L,64750L,64751L,64752L,64753L,64754L,64755L,64756L,64757L,
+64758L,64759L,64760L,64761L,64762L,64763L,64764L,64765L,64766L,64767L,
+64768L,64769L,64770L,64771L,64772L,64773L,64774L,64775L,64776L,64777L,
+64778L,64779L,64780L,64781L,64782L,64783L,64784L,64785L,64786L,64787L,
+64788L,64789L,64790L,64791L,64792L,64793L,64794L,64795L,64796L,64797L,
+64798L,64799L,64800L,64801L,64802L,64803L,64804L,64805L,64806L,64807L,
+64808L,64809L,64810L,64811L,64812L,64813L,64814L,64815L,64816L,64817L,
+64818L,64819L,64820L,64821L,64822L,64823L,64824L,64825L,64826L,64827L,
+64828L,64829L,64830L,64831L,64832L,64833L,64834L,64835L,64836L,64837L,
+64838L,64839L,64840L,64841L,64842L,64843L,64844L,64845L,64846L,64847L,
+64848L,64849L,64850L,64851L,64852L,64853L,64854L,64855L,64856L,64857L,
+64858L,64859L,64860L,64861L,64862L,64863L,64864L,64865L,64866L,64867L,
+64868L,64869L,64870L,64871L,64872L,64873L,64874L,64875L,64876L,64877L,
+64878L,64879L,64880L,64881L,64882L,64883L,64884L,64885L,64886L,64887L,
+64888L,64889L,64890L,64891L,64892L,64893L,64894L,64895L,64896L,64897L,
+64898L,64899L,64900L,64901L,64902L,64903L,64904L,64905L,64906L,64907L,
+64908L,64909L,64910L,64911L,64912L,64913L,64914L,64915L,64916L,64917L,
+64918L,64919L,64920L,64921L,64922L,64923L,64924L,64925L,64926L,64927L,
+64928L,64929L,64930L,64931L,64932L,64933L,64934L,64935L,64936L,64937L,
+64938L,64939L,64940L,64941L,64942L,64943L,64944L,64945L,64946L,64947L,
+64948L,64949L,64950L,64951L,64952L,64953L,64954L,64955L,64956L,64957L,
+64958L,64959L,64960L,64961L,64962L,64963L,64964L,64965L,64966L,64967L,
+64968L,64969L,64970L,64971L,64972L,64973L,64974L,64975L,64976L,64977L,
+64978L,64979L,64980L,64981L,64982L,64983L,64984L,64985L,64986L,64987L,
+64988L,64989L,64990L,64991L,64992L,64993L,64994L,64995L,64996L,64997L,
+64998L,64999L,65000L,65001L,65002L,65003L,65004L,65005L,65006L,65007L,
+65008L,65009L,65010L,65011L,65012L,65013L,65014L,65015L,65016L,65017L,
+65018L,65019L,65020L,65021L,65022L,65023L,65024L,65025L,65026L,65027L,
+65028L,65029L,65030L,65031L,65032L,65033L,65034L,65035L,65036L,65037L,
+65038L,65039L,65040L,65041L,65042L,65043L,65044L,65045L,65046L,65047L,
+65048L,65049L,65050L,65051L,65052L,65053L,65054L,65055L,65056L,65057L,
+65058L,65059L,65060L,65061L,65062L,65063L,65064L,65065L,65066L,65067L,
+65068L,65069L,65070L,65071L,65072L,65073L,65074L,65075L,65076L,65077L,
+65078L,65079L,65080L,65081L,65082L,65083L,65084L,65085L,65086L,65087L,
+65088L,65089L,65090L,65091L,65092L,65093L,65094L,65095L,65096L,65097L,
+65098L,65099L,65100L,65101L,65102L,65103L,65104L,65105L,65106L,65107L,
+65108L,65109L,65110L,65111L,65112L,65113L,65114L,65115L,65116L,65117L,
+65118L,65119L,65120L,65121L,65122L,65123L,65124L,65125L,65126L,65127L,
+65128L,65129L,65130L,65131L,65132L,65133L,65134L,65135L,65136L,65137L,
+65138L,65139L,65140L,65141L,65142L,65143L,65144L,65145L,65146L,65147L,
+65148L,65149L,65150L,65151L,65152L,65153L,65154L,65155L,65156L,65157L,
+65158L,65159L,65160L,65161L,65162L,65163L,65164L,65165L,65166L,65167L,
+65168L,65169L,65170L,65171L,65172L,65173L,65174L,65175L,65176L,65177L,
+65178L,65179L,65180L,65181L,65182L,65183L,65184L,65185L,65186L,65187L,
+65188L,65189L,65190L,65191L,65192L,65193L,65194L,65195L,65196L,65197L,
+65198L,65199L,65200L,65201L,65202L,65203L,65204L,65205L,65206L,65207L,
+65208L,65209L,65210L,65211L,65212L,65213L,65214L,65215L,65216L,65217L,
+65218L,65219L,65220L,65221L,65222L,65223L,65224L,65225L,65226L,65227L,
+65228L,65229L,65230L,65231L,65232L,65233L,65234L,65235L,65236L,65237L,
+65238L,65239L,65240L,65241L,65242L,65243L,65244L,65245L,65246L,65247L,
+65248L,65249L,65250L,65251L,65252L,65253L,65254L,65255L,65256L,65257L,
+65258L,65259L,65260L,65261L,65262L,65263L,65264L,65265L,65266L,65267L,
+65268L,65269L,65270L,65271L,65272L,65273L,65274L,65275L,65276L,65277L,
+65278L,65279L,65280L,65281L,65282L,65283L,65284L,65285L,65286L,65287L,
+65288L,65289L,65290L,65291L,65292L,65293L,65294L,65295L,65296L,65297L,
+65298L,65299L,65300L,65301L,65302L,65303L,65304L,65305L,65306L,65307L,
+65308L,65309L,65310L,65311L,65312L,65313L,65314L,65315L,65316L,65317L,
+65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,65326L,65327L,
+65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,65336L,65337L,
+65338L,65339L,65340L,65341L,65342L,65343L,65344L,65313L,65314L,65315L,
+65316L,65317L,65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,
+65326L,65327L,65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,
+65336L,65337L,65338L,65371L,65372L,65373L,65374L,65375L,65376L,65377L,
+65378L,65379L,65380L,65381L,65382L,65383L,65384L,65385L,65386L,65387L,
+65388L,65389L,65390L,65391L,65392L,65393L,65394L,65395L,65396L,65397L,
+65398L,65399L,65400L,65401L,65402L,65403L,65404L,65405L,65406L,65407L,
+65408L,65409L,65410L,65411L,65412L,65413L,65414L,65415L,65416L,65417L,
+65418L,65419L,65420L,65421L,65422L,65423L,65424L,65425L,65426L,65427L,
+65428L,65429L,65430L,65431L,65432L,65433L,65434L,65435L,65436L,65437L,
+65438L,65439L,65440L,65441L,65442L,65443L,65444L,65445L,65446L,65447L,
+65448L,65449L,65450L,65451L,65452L,65453L,65454L,65455L,65456L,65457L,
+65458L,65459L,65460L,65461L,65462L,65463L,65464L,65465L,65466L,65467L,
+65468L,65469L,65470L,65471L,65472L,65473L,65474L,65475L,65476L,65477L,
+65478L,65479L,65480L,65481L,65482L,65483L,65484L,65485L,65486L,65487L,
+65488L,65489L,65490L,65491L,65492L,65493L,65494L,65495L,65496L,65497L,
+65498L,65499L,65500L,65501L,65502L,65503L,65504L,65505L,65506L,65507L,
+65508L,65509L,65510L,65511L,65512L,65513L,65514L,65515L,65516L,65517L,
+65518L,65519L,65520L,65521L,65522L,65523L,65524L,65525L,65526L,65527L,
+65528L,65529L,65530L,65531L,65532L,65533L,65534L,65535L,
+};
+#endif
+
+#if defined(DUK_USE_REGEXP_CANON_BITMAP)
+/*
+ * Automatically generated by extract_caseconv.py, do not edit!
+ */
+
+const duk_uint8_t duk_unicode_re_canon_bitmap[256] = {
+23,0,224,19,1,228,255,255,255,255,255,255,255,255,255,255,255,255,255,127,
+255,255,255,255,255,255,255,255,231,247,0,16,255,227,255,255,63,255,255,
+255,255,255,255,255,1,252,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+227,193,255,255,255,147,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,
+};
+#endif
+#line 1 "duk_util_bitdecoder.c"
+/*
+ * Bitstream decoder.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/* Decode 'bits' bits from the input stream (bits must be 1...24).
+ * When reading past bitstream end, zeroes are shifted in. The result
+ * is signed to match duk_bd_decode_flagged.
+ */
+DUK_INTERNAL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits) {
+ duk_small_int_t shift;
+ duk_uint32_t mask;
+ duk_uint32_t tmp;
+
+ /* Note: cannot read more than 24 bits without possibly shifting top bits out.
+ * Fixable, but adds complexity.
+ */
+ DUK_ASSERT(bits >= 1 && bits <= 24);
+
+ while (ctx->currbits < bits) {
+#if 0
+ DUK_DDD(DUK_DDDPRINT("decode_bits: shift more data (bits=%ld, currbits=%ld)",
+ (long) bits, (long) ctx->currbits));
+#endif
+ ctx->currval <<= 8;
+ if (ctx->offset < ctx->length) {
+ /* If ctx->offset >= ctx->length, we "shift zeroes in"
+ * instead of croaking.
+ */
+ ctx->currval |= ctx->data[ctx->offset++];
+ }
+ ctx->currbits += 8;
+ }
+#if 0
+ DUK_DDD(DUK_DDDPRINT("decode_bits: bits=%ld, currbits=%ld, currval=0x%08lx",
+ (long) bits, (long) ctx->currbits, (unsigned long) ctx->currval));
+#endif
+
+ /* Extract 'top' bits of currval; note that the extracted bits do not need
+ * to be cleared, we just ignore them on next round.
+ */
+ shift = ctx->currbits - bits;
+ mask = (((duk_uint32_t) 1U) << bits) - 1U;
+ tmp = (ctx->currval >> shift) & mask;
+ ctx->currbits = shift; /* remaining */
+
+#if 0
+ DUK_DDD(DUK_DDDPRINT("decode_bits: %ld bits -> 0x%08lx (%ld), currbits=%ld, currval=0x%08lx",
+ (long) bits, (unsigned long) tmp, (long) tmp, (long) ctx->currbits, (unsigned long) ctx->currval));
+#endif
+
+ return tmp;
+}
+
+DUK_INTERNAL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx) {
+ return (duk_small_uint_t) duk_bd_decode(ctx, 1);
+}
+
+/* Decode a one-bit flag, and if set, decode a value of 'bits', otherwise return
+ * default value.
+ */
+DUK_INTERNAL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value) {
+ if (duk_bd_decode_flag(ctx)) {
+ return duk_bd_decode(ctx, bits);
+ } else {
+ return def_value;
+ }
+}
+
+/* Signed variant, allows negative marker value. */
+DUK_INTERNAL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value) {
+ return (duk_int32_t) duk_bd_decode_flagged(ctx, bits, (duk_uint32_t) def_value);
+}
+
+/* Shared varint encoding. Match dukutil.py BitEncode.varuint(). */
+DUK_INTERNAL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx) {
+ duk_small_uint_t t;
+
+ /* The bit encoding choices here are based on manual testing against
+ * the actual varuints generated by genbuiltins.py.
+ */
+ switch (duk_bd_decode(ctx, 2)) {
+ case 0:
+ return 0; /* [0,0] */
+ case 1:
+ return duk_bd_decode(ctx, 2) + 1; /* [1,4] */
+ case 2:
+ return duk_bd_decode(ctx, 5) + 5; /* [5,36] */
+ default:
+ t = duk_bd_decode(ctx, 7);
+ if (t == 0) {
+ return duk_bd_decode(ctx, 20);
+ }
+ return (t - 1) + 37; /* [37,163] */
+ }
+}
+
+/* Decode a bit packed string from a custom format used by genbuiltins.py.
+ * This function is here because it's used for both heap and thread inits.
+ * Caller must supply the output buffer whose size is NOT checked!
+ */
+
+#define DUK__BITPACK_LETTER_LIMIT 26
+#define DUK__BITPACK_LOOKUP1 26
+#define DUK__BITPACK_LOOKUP2 27
+#define DUK__BITPACK_SWITCH1 28
+#define DUK__BITPACK_SWITCH 29
+#define DUK__BITPACK_UNUSED1 30
+#define DUK__BITPACK_EIGHTBIT 31
+
+DUK_LOCAL const duk_uint8_t duk__bitpacked_lookup[16] = {
+ DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3,
+ DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7,
+ DUK_ASC_8, DUK_ASC_9, DUK_ASC_UNDERSCORE, DUK_ASC_SPACE,
+ 0x82, 0x80, DUK_ASC_DOUBLEQUOTE, DUK_ASC_LCURLY
+};
+
+DUK_INTERNAL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out) {
+ duk_small_uint_t len;
+ duk_small_uint_t mode;
+ duk_small_uint_t t;
+ duk_small_uint_t i;
+
+ len = duk_bd_decode(bd, 5);
+ if (len == 31) {
+ len = duk_bd_decode(bd, 8); /* Support up to 256 bytes; rare. */
+ }
+
+ mode = 32; /* 0 = uppercase, 32 = lowercase (= 'a' - 'A') */
+ for (i = 0; i < len; i++) {
+ t = duk_bd_decode(bd, 5);
+ if (t < DUK__BITPACK_LETTER_LIMIT) {
+ t = t + DUK_ASC_UC_A + mode;
+ } else if (t == DUK__BITPACK_LOOKUP1) {
+ t = duk__bitpacked_lookup[duk_bd_decode(bd, 3)];
+ } else if (t == DUK__BITPACK_LOOKUP2) {
+ t = duk__bitpacked_lookup[8 + duk_bd_decode(bd, 3)];
+ } else if (t == DUK__BITPACK_SWITCH1) {
+ t = duk_bd_decode(bd, 5);
+ DUK_ASSERT_DISABLE(t >= 0); /* unsigned */
+ DUK_ASSERT(t <= 25);
+ t = t + DUK_ASC_UC_A + (mode ^ 32);
+ } else if (t == DUK__BITPACK_SWITCH) {
+ mode = mode ^ 32;
+ t = duk_bd_decode(bd, 5);
+ DUK_ASSERT_DISABLE(t >= 0);
+ DUK_ASSERT(t <= 25);
+ t = t + DUK_ASC_UC_A + mode;
+ } else if (t == DUK__BITPACK_EIGHTBIT) {
+ t = duk_bd_decode(bd, 8);
+ }
+ out[i] = (duk_uint8_t) t;
+ }
+
+ return len;
+}
+
+/* automatic undefs */
+#undef DUK__BITPACK_EIGHTBIT
+#undef DUK__BITPACK_LETTER_LIMIT
+#undef DUK__BITPACK_LOOKUP1
+#undef DUK__BITPACK_LOOKUP2
+#undef DUK__BITPACK_SWITCH
+#undef DUK__BITPACK_SWITCH1
+#undef DUK__BITPACK_UNUSED1
+#line 1 "duk_util_bitencoder.c"
+/*
+ * Bitstream encoder.
+ */
+
+/* #include duk_internal.h -> already included */
+
+DUK_INTERNAL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits) {
+ duk_uint8_t tmp;
+
+ DUK_ASSERT(ctx != NULL);
+ DUK_ASSERT(ctx->currbits < 8);
+
+ /* This limitation would be fixable but adds unnecessary complexity. */
+ DUK_ASSERT(bits >= 1 && bits <= 24);
+
+ ctx->currval = (ctx->currval << bits) | data;
+ ctx->currbits += bits;
+
+ while (ctx->currbits >= 8) {
+ if (ctx->offset < ctx->length) {
+ tmp = (duk_uint8_t) ((ctx->currval >> (ctx->currbits - 8)) & 0xff);
+ ctx->data[ctx->offset++] = tmp;
+ } else {
+ /* If buffer has been exhausted, truncate bitstream */
+ ctx->truncated = 1;
+ }
+
+ ctx->currbits -= 8;
+ }
+}
+
+DUK_INTERNAL void duk_be_finish(duk_bitencoder_ctx *ctx) {
+ duk_small_int_t npad;
+
+ DUK_ASSERT(ctx != NULL);
+ DUK_ASSERT(ctx->currbits < 8);
+
+ npad = (duk_small_int_t) (8 - ctx->currbits);
+ if (npad > 0) {
+ duk_be_encode(ctx, 0, npad);
+ }
+ DUK_ASSERT(ctx->currbits == 0);
+}
+#line 1 "duk_util_bufwriter.c"
+/*
+ * Fast buffer writer with slack management.
+ */
+
+/* #include duk_internal.h -> already included */
+
+/*
+ * Macro support functions (use only macros in calling code)
+ */
+
+DUK_LOCAL void duk__bw_update_ptrs(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t curr_offset, duk_size_t new_length) {
+ duk_uint8_t *p;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw_ctx != NULL);
+ DUK_UNREF(thr);
+
+ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, bw_ctx->buf);
+ DUK_ASSERT(p != NULL || (DUK_HBUFFER_DYNAMIC_GET_SIZE(bw_ctx->buf) == 0 && curr_offset == 0 && new_length == 0));
+ bw_ctx->p = p + curr_offset;
+ bw_ctx->p_base = p;
+ bw_ctx->p_limit = p + new_length;
+}
+
+DUK_INTERNAL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf) {
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw_ctx != NULL);
+ DUK_ASSERT(h_buf != NULL);
+
+ bw_ctx->buf = h_buf;
+ duk__bw_update_ptrs(thr, bw_ctx, 0, DUK_HBUFFER_DYNAMIC_GET_SIZE(h_buf));
+}
+
+DUK_INTERNAL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw_ctx != NULL);
+
+ (void) duk_push_dynamic_buffer(thr, buf_size);
+ bw_ctx->buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1);
+ duk__bw_update_ptrs(thr, bw_ctx, 0, buf_size);
+}
+
+/* Resize target buffer for requested size. Called by the macro only when the
+ * fast path test (= there is space) fails.
+ */
+DUK_INTERNAL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz) {
+ duk_size_t curr_off;
+ duk_size_t add_sz;
+ duk_size_t new_sz;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw_ctx != NULL);
+
+ /* We could do this operation without caller updating bw_ctx->ptr,
+ * but by writing it back here we can share code better.
+ */
+
+ curr_off = (duk_size_t) (bw_ctx->p - bw_ctx->p_base);
+ add_sz = (curr_off >> DUK_BW_SLACK_SHIFT) + DUK_BW_SLACK_ADD;
+ new_sz = curr_off + sz + add_sz;
+ if (DUK_UNLIKELY(new_sz < curr_off)) {
+ /* overflow */
+ DUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG);
+ return NULL; /* not reachable */
+ }
+#if 0 /* for manual torture testing: tight allocation, useful with valgrind */
+ new_sz = curr_off + sz;
+#endif
+
+ /* This is important to ensure dynamic buffer data pointer is not
+ * NULL (which is possible if buffer size is zero), which in turn
+ * causes portability issues with e.g. memmove() and memcpy().
+ */
+ DUK_ASSERT(new_sz >= 1);
+
+ DUK_DD(DUK_DDPRINT("resize bufferwriter from %ld to %ld (add_sz=%ld)", (long) curr_off, (long) new_sz, (long) add_sz));
+
+ duk_hbuffer_resize(thr, bw_ctx->buf, new_sz);
+ duk__bw_update_ptrs(thr, bw_ctx, curr_off, new_sz);
+ return bw_ctx->p;
+}
+
+/* Make buffer compact, matching current written size. */
+DUK_INTERNAL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx) {
+ duk_size_t len;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw_ctx != NULL);
+ DUK_UNREF(thr);
+
+ len = (duk_size_t) (bw_ctx->p - bw_ctx->p_base);
+ duk_hbuffer_resize(thr, bw_ctx->buf, len);
+ duk__bw_update_ptrs(thr, bw_ctx, len, len);
+}
+
+DUK_INTERNAL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) {
+ duk_uint8_t *p_base;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_UNREF(thr);
+
+ p_base = bw->p_base;
+ DUK_MEMCPY((void *) bw->p,
+ (const void *) (p_base + src_off),
+ (size_t) len);
+ bw->p += len;
+}
+
+DUK_INTERNAL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));
+
+ DUK_BW_ENSURE(thr, bw, len);
+ duk_bw_write_raw_slice(thr, bw, src_off, len);
+}
+
+DUK_INTERNAL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) {
+ duk_uint8_t *p_base;
+ duk_size_t buf_sz, move_sz;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(buf != NULL);
+ DUK_UNREF(thr);
+
+ p_base = bw->p_base;
+ buf_sz = (duk_size_t) (bw->p - p_base); /* constrained by maximum buffer size */
+ move_sz = buf_sz - dst_off;
+
+ DUK_ASSERT(p_base != NULL); /* buffer size is >= 1 */
+ DUK_MEMMOVE((void *) (p_base + dst_off + len),
+ (const void *) (p_base + dst_off),
+ (size_t) move_sz);
+ DUK_MEMCPY((void *) (p_base + dst_off),
+ (const void *) buf,
+ (size_t) len);
+ bw->p += len;
+}
+
+DUK_INTERNAL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(buf != NULL);
+
+ DUK_BW_ENSURE(thr, bw, len);
+ duk_bw_insert_raw_bytes(thr, bw, dst_off, buf, len);
+}
+
+DUK_INTERNAL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) {
+ duk_uint8_t *p_base;
+ duk_size_t buf_sz, move_sz;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_UNREF(thr);
+
+ p_base = bw->p_base;
+
+ /* Don't support "straddled" source now. */
+ DUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len);
+
+ if (dst_off <= src_off) {
+ /* Target is before source. Source offset is expressed as
+ * a "before change" offset. Account for the memmove.
+ */
+ src_off += len;
+ }
+
+ buf_sz = (duk_size_t) (bw->p - p_base);
+ move_sz = buf_sz - dst_off;
+
+ DUK_ASSERT(p_base != NULL); /* buffer size is >= 1 */
+ DUK_MEMMOVE((void *) (p_base + dst_off + len),
+ (const void *) (p_base + dst_off),
+ (size_t) move_sz);
+ DUK_MEMCPY((void *) (p_base + dst_off),
+ (const void *) (p_base + src_off),
+ (size_t) len);
+ bw->p += len;
+}
+
+DUK_INTERNAL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));
+
+ /* Don't support "straddled" source now. */
+ DUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len);
+
+ DUK_BW_ENSURE(thr, bw, len);
+ duk_bw_insert_raw_slice(thr, bw, dst_off, src_off, len);
+}
+
+DUK_INTERNAL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) {
+ duk_uint8_t *p_base, *p_dst, *p_src;
+ duk_size_t buf_sz, move_sz;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_UNREF(thr);
+
+ p_base = bw->p_base;
+ buf_sz = (duk_size_t) (bw->p - p_base);
+ move_sz = buf_sz - off;
+ p_dst = p_base + off + len;
+ p_src = p_base + off;
+ DUK_MEMMOVE((void *) p_dst, (const void *) p_src, (size_t) move_sz);
+ return p_src; /* point to start of 'reserved area' */
+}
+
+DUK_INTERNAL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) {
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw));
+
+ DUK_BW_ENSURE(thr, bw, len);
+ return duk_bw_insert_raw_area(thr, bw, off, len);
+}
+
+DUK_INTERNAL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) {
+ duk_size_t move_sz;
+
+ duk_uint8_t *p_base;
+ duk_uint8_t *p_src;
+ duk_uint8_t *p_dst;
+
+ DUK_ASSERT(thr != NULL);
+ DUK_ASSERT(bw != NULL);
+ DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_ASSERT(off + len <= DUK_BW_GET_SIZE(thr, bw));
+ DUK_UNREF(thr);
+
+ p_base = bw->p_base;
+ p_dst = p_base + off;
+ p_src = p_dst + len;
+ move_sz = (duk_size_t) (bw->p - p_src);
+ DUK_MEMMOVE((void *) p_dst,
+ (const void *) p_src,
+ (size_t) move_sz);
+ bw->p -= len;
+}
+
+/*
+ * Macro support functions for reading/writing raw data.
+ *
+ * These are done using mempcy to ensure they're valid even for unaligned
+ * reads/writes on platforms where alignment counts. On x86 at least gcc
+ * is able to compile these into a bswap+mov. "Always inline" is used to
+ * ensure these macros compile to minimal code.
+ *
+ * Not really bufwriter related, but currently used together.
+ */
+
+DUK_INTERNAL DUK_ALWAYS_INLINE duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p) {
+ union {
+ duk_uint8_t b[2];
+ duk_uint16_t x;
+ } u;
+
+ DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 2);
+ u.x = DUK_NTOH16(u.x);
+ *p += 2;
+ return u.x;
+}
+
+DUK_INTERNAL DUK_ALWAYS_INLINE duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p) {
+ union {
+ duk_uint8_t b[4];
+ duk_uint32_t x;
+ } u;
+
+ DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4);
+ u.x = DUK_NTOH32(u.x);
+ *p += 4;
+ return u.x;
+}
+
+DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_raw_read_double_be(duk_uint8_t **p) {
+ duk_double_union du;
+ union {
+ duk_uint8_t b[4];
+ duk_uint32_t x;
+ } u;
+
+ DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4);
+ u.x = DUK_NTOH32(u.x);
+ du.ui[DUK_DBL_IDX_UI0] = u.x;
+ DUK_MEMCPY((void *) u.b, (const void *) (*p + 4), (size_t) 4);
+ u.x = DUK_NTOH32(u.x);
+ du.ui[DUK_DBL_IDX_UI1] = u.x;
+ *p += 8;
+
+ return du.d;
+}
+
+DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val) {
+ union {
+ duk_uint8_t b[2];
+ duk_uint16_t x;
+ } u;
+
+ u.x = DUK_HTON16(val);
+ DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 2);
+ *p += 2;
+}
+
+DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val) {
+ union {
+ duk_uint8_t b[4];
+ duk_uint32_t x;
+ } u;
+
+ u.x = DUK_HTON32(val);
+ DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4);
+ *p += 4;
+}
+
+DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val) {
+ duk_double_union du;
+ union {
+ duk_uint8_t b[4];
+ duk_uint32_t x;
+ } u;
+
+ du.d = val;
+ u.x = du.ui[DUK_DBL_IDX_UI0];
+ u.x = DUK_HTON32(u.x);
+ DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4);
+ u.x = du.ui[DUK_DBL_IDX_UI1];
+ u.x = DUK_HTON32(u.x);
+ DUK_MEMCPY((void *) (*p + 4), (const void *) u.b, (size_t) 4);
+ *p += 8;
+}
+#line 1 "duk_util_hashbytes.c"
+/*
+ * Hash function duk_util_hashbytes().
+ *
+ * Currently, 32-bit MurmurHash2.
+ *
+ * Don't rely on specific hash values; hash function may be endianness
+ * dependent, for instance.
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if defined(DUK_USE_STRHASH_DENSE)
+/* 'magic' constants for Murmurhash2 */
+#define DUK__MAGIC_M ((duk_uint32_t) 0x5bd1e995UL)
+#define DUK__MAGIC_R 24
+
+DUK_INTERNAL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed) {
+ duk_uint32_t h = seed ^ ((duk_uint32_t) len);
+
+ while (len >= 4) {
+ /* Portability workaround is required for platforms without
+ * unaligned access. The replacement code emulates little
+ * endian access even on big endian architectures, which is
+ * OK as long as it is consistent for a build.
+ */
+#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS)
+ duk_uint32_t k = *((const duk_uint32_t *) (const void *) data);
+#else
+ duk_uint32_t k = ((duk_uint32_t) data[0]) |
+ (((duk_uint32_t) data[1]) << 8) |
+ (((duk_uint32_t) data[2]) << 16) |
+ (((duk_uint32_t) data[3]) << 24);
+#endif
+
+ k *= DUK__MAGIC_M;
+ k ^= k >> DUK__MAGIC_R;
+ k *= DUK__MAGIC_M;
+ h *= DUK__MAGIC_M;
+ h ^= k;
+ data += 4;
+ len -= 4;
+ }
+
+ switch (len) {
+ case 3: h ^= data[2] << 16;
+ case 2: h ^= data[1] << 8;
+ case 1: h ^= data[0];
+ h *= DUK__MAGIC_M;
+ }
+
+ h ^= h >> 13;
+ h *= DUK__MAGIC_M;
+ h ^= h >> 15;
+
+ return h;
+}
+#endif /* DUK_USE_STRHASH_DENSE */
+
+/* automatic undefs */
+#undef DUK__MAGIC_M
+#undef DUK__MAGIC_R
+#line 1 "duk_util_tinyrandom.c"
+/*
+ * A tiny random number generator used for Math.random() and other internals.
+ *
+ * Default algorithm is xoroshiro128+: http://xoroshiro.di.unimi.it/xoroshiro128plus.c
+ * with SplitMix64 seed preparation: http://xorshift.di.unimi.it/splitmix64.c.
+ *
+ * Low memory targets and targets without 64-bit types use a slightly smaller
+ * (but slower) algorithm by Adi Shamir:
+ * http://www.woodmann.com/forum/archive/index.php/t-3100.html.
+ *
+ */
+
+/* #include duk_internal.h -> already included */
+
+#if !defined(DUK_USE_GET_RANDOM_DOUBLE)
+
+#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS)
+#define DUK__RANDOM_SHAMIR3OP
+#else
+#define DUK__RANDOM_XOROSHIRO128PLUS
+#endif
+
+#if defined(DUK__RANDOM_SHAMIR3OP)
+#define DUK__UPDATE_RND(rnd) do { \
+ (rnd) += ((rnd) * (rnd)) | 0x05UL; \
+ (rnd) = ((rnd) & 0xffffffffUL); /* if duk_uint32_t is exactly 32 bits, this is a NOP */ \
+ } while (0)
+
+#define DUK__RND_BIT(rnd) ((rnd) >> 31) /* only use the highest bit */
+
+DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) {
+ DUK_UNREF(thr); /* Nothing now. */
+}
+
+DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) {
+ duk_double_t t;
+ duk_small_int_t n;
+ duk_uint32_t rnd;
+
+ rnd = thr->heap->rnd_state;
+
+ n = 53; /* enough to cover the whole mantissa */
+ t = 0.0;
+
+ do {
+ DUK__UPDATE_RND(rnd);
+ t += DUK__RND_BIT(rnd);
+ t /= 2.0;
+ } while (--n);
+
+ thr->heap->rnd_state = rnd;
+
+ DUK_ASSERT(t >= (duk_double_t) 0.0);
+ DUK_ASSERT(t < (duk_double_t) 1.0);
+
+ return t;
+}
+#endif /* DUK__RANDOM_SHAMIR3OP */
+
+#if defined(DUK__RANDOM_XOROSHIRO128PLUS)
+DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_splitmix64(duk_uint64_t *x) {
+ duk_uint64_t z;
+ z = (*x += DUK_U64_CONSTANT(0x9E3779B97F4A7C15));
+ z = (z ^ (z >> 30U)) * DUK_U64_CONSTANT(0xBF58476D1CE4E5B9);
+ z = (z ^ (z >> 27U)) * DUK_U64_CONSTANT(0x94D049BB133111EB);
+ return z ^ (z >> 31U);
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_rotl(const duk_uint64_t x, duk_small_uint_t k) {
+ return (x << k) | (x >> (64U - k));
+}
+
+DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__xoroshiro128plus(duk_uint64_t *s) {
+ duk_uint64_t s0;
+ duk_uint64_t s1;
+ duk_uint64_t res;
+
+ s0 = s[0];
+ s1 = s[1];
+ res = s0 + s1;
+ s1 ^= s0;
+ s[0] = duk__rnd_rotl(s0, 55) ^ s1 ^ (s1 << 14U);
+ s[1] = duk__rnd_rotl(s1, 36);
+
+ return res;
+}
+
+DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) {
+ duk_small_uint_t i;
+ duk_uint64_t x;
+
+ /* Mix both halves of the initial seed with SplitMix64. The intent
+ * is to ensure that very similar raw seeds (which is usually the case
+ * because current seed is Date.now()) result in different xoroshiro128+
+ * seeds.
+ */
+ x = thr->heap->rnd_state[0]; /* Only [0] is used as input here. */
+ for (i = 0; i < 64; i++) {
+ thr->heap->rnd_state[i & 0x01] = duk__rnd_splitmix64(&x); /* Keep last 2 values. */
+ }
+}
+
+DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) {
+ duk_uint64_t v;
+ duk_double_union du;
+
+ /* For big and little endian the integer and IEEE double byte order
+ * is the same so a direct assignment works. For mixed endian the
+ * 32-bit parts must be swapped.
+ */
+ v = (DUK_U64_CONSTANT(0x3ff) << 52U) | (duk__xoroshiro128plus((duk_uint64_t *) thr->heap->rnd_state) >> 12U);
+ du.ull[0] = v;
+#if defined(DUK_USE_DOUBLE_ME)
+ do {
+ duk_uint32_t tmp;
+ tmp = du.ui[0];
+ du.ui[0] = du.ui[1];
+ du.ui[1] = tmp;
+ } while (0);
+#endif
+ return du.d - 1.0;
+}
+#endif /* DUK__RANDOM_XOROSHIRO128PLUS */
+
+#endif /* !DUK_USE_GET_RANDOM_DOUBLE */
+
+/* automatic undefs */
+#undef DUK__RANDOM_SHAMIR3OP
+#undef DUK__RANDOM_XOROSHIRO128PLUS
+#undef DUK__RND_BIT
+#undef DUK__UPDATE_RND
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.go b/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.go
new file mode 100644
index 000000000..f0806fcae
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.go
@@ -0,0 +1,356 @@
+package duktape
+
+/*
+#cgo !windows CFLAGS: -std=c99 -O3 -Wall -fomit-frame-pointer -fstrict-aliasing
+#cgo windows CFLAGS: -O3 -Wall -fomit-frame-pointer -fstrict-aliasing
+#cgo linux LDFLAGS: -lm
+#cgo freebsd LDFLAGS: -lm
+
+#include "duktape.h"
+#include "duk_logging.h"
+#include "duk_print_alert.h"
+#include "duk_module_duktape.h"
+#include "duk_console.h"
+extern duk_ret_t goFunctionCall(duk_context *ctx);
+extern void goFinalizeCall(duk_context *ctx);
+*/
+import "C"
+import (
+ "errors"
+ "fmt"
+ "regexp"
+ "sync"
+ "unsafe"
+)
+
+var reFuncName = regexp.MustCompile("^[a-z_][a-z0-9_]*([A-Z_][a-z0-9_]*)*$")
+
+const (
+ goFunctionPtrProp = "\xff" + "goFunctionPtrProp"
+ goContextPtrProp = "\xff" + "goContextPtrProp"
+)
+
+type Context struct {
+ *context
+}
+
+// transmute replaces the value from Context with the value of pointer
+func (c *Context) transmute(p unsafe.Pointer) {
+ *c = *(*Context)(p)
+}
+
+// this is a pojo containing only the values of the Context
+type context struct {
+ sync.Mutex
+ duk_context *C.duk_context
+ fnIndex *functionIndex
+ timerIndex *timerIndex
+}
+
+// New returns plain initialized duktape context object
+// See: http://duktape.org/api.html#duk_create_heap_default
+func New() *Context {
+ d := &Context{
+ &context{
+ duk_context: C.duk_create_heap(nil, nil, nil, nil, nil),
+ fnIndex: newFunctionIndex(),
+ timerIndex: &timerIndex{},
+ },
+ }
+
+ ctx := d.duk_context
+ C.duk_logging_init(ctx, 0)
+ C.duk_print_alert_init(ctx, 0)
+ C.duk_module_duktape_init(ctx)
+ C.duk_console_init(ctx, 0)
+
+ return d
+}
+
+// Flags is a set of flags for controlling the behaviour of duktape.
+type Flags struct {
+ Logging uint
+ PrintAlert uint
+ Console uint
+}
+
+// FlagConsoleProxyWrapper is a Console flag.
+// Use a proxy wrapper to make undefined methods (console.foo()) no-ops.
+const FlagConsoleProxyWrapper = 1 << 0
+
+// FlagConsoleFlush is a Console flag.
+// Flush output after every call.
+const FlagConsoleFlush = 1 << 1
+
+// NewWithFlags returns plain initialized duktape context object
+// You can control the behaviour of duktape by setting flags.
+// See: http://duktape.org/api.html#duk_create_heap_default
+func NewWithFlags(flags *Flags) *Context {
+ d := &Context{
+ &context{
+ duk_context: C.duk_create_heap(nil, nil, nil, nil, nil),
+ fnIndex: newFunctionIndex(),
+ timerIndex: &timerIndex{},
+ },
+ }
+
+ ctx := d.duk_context
+ C.duk_logging_init(ctx, C.duk_uint_t(flags.Logging))
+ C.duk_print_alert_init(ctx, C.duk_uint_t(flags.PrintAlert))
+ C.duk_module_duktape_init(ctx)
+ C.duk_console_init(ctx, C.duk_uint_t(flags.Console))
+
+ return d
+}
+
+func contextFromPointer(ctx *C.duk_context) *Context {
+ return &Context{&context{duk_context: ctx}}
+}
+
+// PushGlobalGoFunction push the given function into duktape global object
+// Returns non-negative index (relative to stack bottom) of the pushed function
+// also returns error if the function name is invalid
+func (d *Context) PushGlobalGoFunction(name string, fn func(*Context) int) (int, error) {
+ if !reFuncName.MatchString(name) {
+ return -1, errors.New("Malformed function name '" + name + "'")
+ }
+
+ d.PushGlobalObject()
+ idx := d.PushGoFunction(fn)
+ d.PutPropString(-2, name)
+ d.Pop()
+
+ return idx, nil
+}
+
+// PushGoFunction push the given function into duktape stack, returns non-negative
+// index (relative to stack bottom) of the pushed function
+func (d *Context) PushGoFunction(fn func(*Context) int) int {
+ funPtr := d.fnIndex.add(fn)
+ ctxPtr := contexts.add(d)
+
+ idx := d.PushCFunction((*[0]byte)(C.goFunctionCall), C.DUK_VARARGS)
+ d.PushCFunction((*[0]byte)(C.goFinalizeCall), 1)
+ d.PushPointer(funPtr)
+ d.PutPropString(-2, goFunctionPtrProp)
+ d.PushPointer(ctxPtr)
+ d.PutPropString(-2, goContextPtrProp)
+ d.SetFinalizer(-2)
+
+ d.PushPointer(funPtr)
+ d.PutPropString(-2, goFunctionPtrProp)
+ d.PushPointer(ctxPtr)
+ d.PutPropString(-2, goContextPtrProp)
+
+ return idx
+}
+
+//export goFunctionCall
+func goFunctionCall(cCtx *C.duk_context) C.duk_ret_t {
+ d := contextFromPointer(cCtx)
+
+ funPtr, ctx := d.getFunctionPtrs()
+ d.transmute(unsafe.Pointer(ctx))
+
+ result := d.fnIndex.get(funPtr)(d)
+
+ return C.duk_ret_t(result)
+}
+
+//export goFinalizeCall
+func goFinalizeCall(cCtx *C.duk_context) {
+ d := contextFromPointer(cCtx)
+
+ funPtr, ctx := d.getFunctionPtrs()
+ d.transmute(unsafe.Pointer(ctx))
+
+ d.fnIndex.delete(funPtr)
+}
+
+func (d *Context) getFunctionPtrs() (unsafe.Pointer, *Context) {
+ d.PushCurrentFunction()
+ d.GetPropString(-1, goFunctionPtrProp)
+ funPtr := d.GetPointer(-1)
+
+ d.Pop()
+
+ d.GetPropString(-1, goContextPtrProp)
+ ctx := contexts.get(d.GetPointer(-1))
+ d.Pop2()
+ return funPtr, ctx
+}
+
+// Destroy destroy all the references to the functions and freed the pointers
+func (d *Context) Destroy() {
+ d.fnIndex.destroy()
+ contexts.delete(d)
+}
+
+type Error struct {
+ Type string
+ Message string
+ FileName string
+ LineNumber int
+ Stack string
+}
+
+func (e *Error) Error() string {
+ return fmt.Sprintf("%s: %s", e.Type, e.Message)
+}
+
+type Type int
+
+func (t Type) IsNone() bool { return t == TypeNone }
+func (t Type) IsUndefined() bool { return t == TypeUndefined }
+func (t Type) IsNull() bool { return t == TypeNull }
+func (t Type) IsBool() bool { return t == TypeBoolean }
+func (t Type) IsNumber() bool { return t == TypeNumber }
+func (t Type) IsString() bool { return t == TypeString }
+func (t Type) IsObject() bool { return t == TypeObject }
+func (t Type) IsBuffer() bool { return t == TypeBuffer }
+func (t Type) IsPointer() bool { return t == TypePointer }
+func (t Type) IsLightFunc() bool { return t == TypeLightFunc }
+
+func (t Type) String() string {
+ switch t {
+ case TypeNone:
+ return "None"
+ case TypeUndefined:
+ return "Undefined"
+ case TypeNull:
+ return "Null"
+ case TypeBoolean:
+ return "Boolean"
+ case TypeNumber:
+ return "Number"
+ case TypeString:
+ return "String"
+ case TypeObject:
+ return "Object"
+ case TypeBuffer:
+ return "Buffer"
+ case TypePointer:
+ return "Pointer"
+ case TypeLightFunc:
+ return "LightFunc"
+ default:
+ return "Unknown"
+ }
+}
+
+type functionIndex struct {
+ functions map[unsafe.Pointer]func(*Context) int
+ sync.RWMutex
+}
+
+type timerIndex struct {
+ c float64
+ sync.Mutex
+}
+
+func (t *timerIndex) get() float64 {
+ t.Lock()
+ defer t.Unlock()
+ t.c++
+ return t.c
+}
+
+func newFunctionIndex() *functionIndex {
+ return &functionIndex{
+ functions: make(map[unsafe.Pointer]func(*Context) int, 0),
+ }
+}
+
+func (i *functionIndex) add(fn func(*Context) int) unsafe.Pointer {
+ ptr := C.malloc(1)
+
+ i.Lock()
+ i.functions[ptr] = fn
+ i.Unlock()
+
+ return ptr
+}
+
+func (i *functionIndex) get(ptr unsafe.Pointer) func(*Context) int {
+ i.RLock()
+ fn := i.functions[ptr]
+ i.RUnlock()
+
+ return fn
+}
+
+func (i *functionIndex) delete(ptr unsafe.Pointer) {
+ i.Lock()
+ delete(i.functions, ptr)
+ i.Unlock()
+
+ C.free(ptr)
+}
+
+func (i *functionIndex) destroy() {
+ i.Lock()
+
+ for ptr, _ := range i.functions {
+ delete(i.functions, ptr)
+ C.free(ptr)
+ }
+ i.Unlock()
+}
+
+type ctxIndex struct {
+ sync.RWMutex
+ ctxs map[unsafe.Pointer]*Context
+}
+
+func (ci *ctxIndex) add(ctx *Context) unsafe.Pointer {
+
+ ci.RLock()
+ for ptr, ctxPtr := range ci.ctxs {
+ if ctxPtr == ctx {
+ ci.RUnlock()
+ return ptr
+ }
+ }
+ ci.RUnlock()
+
+ ci.Lock()
+ for ptr, ctxPtr := range ci.ctxs {
+ if ctxPtr == ctx {
+ ci.Unlock()
+ return ptr
+ }
+ }
+ ptr := C.malloc(1)
+ ci.ctxs[ptr] = ctx
+ ci.Unlock()
+
+ return ptr
+}
+
+func (ci *ctxIndex) get(ptr unsafe.Pointer) *Context {
+ ci.RLock()
+ ctx := ci.ctxs[ptr]
+ ci.RUnlock()
+ return ctx
+}
+
+func (ci *ctxIndex) delete(ctx *Context) {
+ ci.Lock()
+ for ptr, ctxPtr := range ci.ctxs {
+ if ctxPtr == ctx {
+ delete(ci.ctxs, ptr)
+ C.free(ptr)
+ ci.Unlock()
+ return
+ }
+ }
+ panic(fmt.Sprintf("context (%p) doesn't exist", ctx))
+}
+
+var contexts *ctxIndex
+
+func init() {
+ contexts = &ctxIndex{
+ ctxs: make(map[unsafe.Pointer]*Context),
+ }
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.h b/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.h
new file mode 100755
index 000000000..595cd77ec
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/duktape.h
@@ -0,0 +1,1349 @@
+/*
+ * Duktape public API for Duktape 2.2.0.
+ *
+ * See the API reference for documentation on call semantics. The exposed,
+ * supported API is between the "BEGIN PUBLIC API" and "END PUBLIC API"
+ * comments. Other parts of the header are Duktape internal and related to
+ * e.g. platform/compiler/feature detection.
+ *
+ * Git commit a459cf3c9bd1779fc01b435d69302b742675a08f (v2.2.0).
+ * Git branch master.
+ *
+ * See Duktape AUTHORS.rst and LICENSE.txt for copyright and
+ * licensing information.
+ */
+
+/* LICENSE.txt */
+/*
+ * ===============
+ * Duktape license
+ * ===============
+ *
+ * (http://opensource.org/licenses/MIT)
+ *
+ * Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* AUTHORS.rst */
+/*
+ * ===============
+ * Duktape authors
+ * ===============
+ *
+ * Copyright
+ * =========
+ *
+ * Duktape copyrights are held by its authors. Each author has a copyright
+ * to their contribution, and agrees to irrevocably license the contribution
+ * under the Duktape ``LICENSE.txt``.
+ *
+ * Authors
+ * =======
+ *
+ * Please include an e-mail address, a link to your GitHub profile, or something
+ * similar to allow your contribution to be identified accurately.
+ *
+ * The following people have contributed code, website contents, or Wiki contents,
+ * and agreed to irrevocably license their contributions under the Duktape
+ * ``LICENSE.txt`` (in order of appearance):
+ *
+ * * Sami Vaarala <sami.vaarala@iki.fi>
+ * * Niki Dobrev
+ * * Andreas \u00d6man <andreas@lonelycoder.com>
+ * * L\u00e1szl\u00f3 Lang\u00f3 <llango.u-szeged@partner.samsung.com>
+ * * Legimet <legimet.calc@gmail.com>
+ * * Karl Skomski <karl@skomski.com>
+ * * Bruce Pascoe <fatcerberus1@gmail.com>
+ * * Ren\u00e9 Hollander <rene@rene8888.at>
+ * * Julien Hamaide (https://github.com/crazyjul)
+ * * Sebastian G\u00f6tte (https://github.com/jaseg)
+ * * Tomasz Magulski (https://github.com/magul)
+ * * \D. Bohdan (https://github.com/dbohdan)
+ * * Ond\u0159ej Jirman (https://github.com/megous)
+ * * Sa\u00fal Ibarra Corretg\u00e9 <saghul@gmail.com>
+ * * Jeremy HU <huxingyi@msn.com>
+ * * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr)
+ * * Harold Brenes (https://github.com/harold-b)
+ * * Oliver Crow (https://github.com/ocrow)
+ * * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski)
+ * * Brett Vickers (https://github.com/beevik)
+ * * Dominik Okwieka (https://github.com/okitec)
+ * * Remko Tron\u00e7on (https://el-tramo.be)
+ * * Romero Malaquias (rbsm@ic.ufal.br)
+ * * Michael Drake <michael.drake@codethink.co.uk>
+ * * Steven Don (https://github.com/shdon)
+ * * Simon Stone (https://github.com/sstone1)
+ * * \J. McC. (https://github.com/jmhmccr)
+ *
+ * Other contributions
+ * ===================
+ *
+ * The following people have contributed something other than code (e.g. reported
+ * bugs, provided ideas, etc; roughly in order of appearance):
+ *
+ * * Greg Burns
+ * * Anthony Rabine
+ * * Carlos Costa
+ * * Aur\u00e9lien Bouilland
+ * * Preet Desai (Pris Matic)
+ * * judofyr (http://www.reddit.com/user/judofyr)
+ * * Jason Woofenden
+ * * Micha\u0142 Przyby\u015b
+ * * Anthony Howe
+ * * Conrad Pankoff
+ * * Jim Schimpf
+ * * Rajaran Gaunker (https://github.com/zimbabao)
+ * * Andreas \u00d6man
+ * * Doug Sanden
+ * * Josh Engebretson (https://github.com/JoshEngebretson)
+ * * Remo Eichenberger (https://github.com/remoe)
+ * * Mamod Mehyar (https://github.com/mamod)
+ * * David Demelier (https://github.com/markand)
+ * * Tim Caswell (https://github.com/creationix)
+ * * Mitchell Blank Jr (https://github.com/mitchblank)
+ * * https://github.com/yushli
+ * * Seo Sanghyeon (https://github.com/sanxiyn)
+ * * Han ChoongWoo (https://github.com/tunz)
+ * * Joshua Peek (https://github.com/josh)
+ * * Bruce E. Pascoe (https://github.com/fatcerberus)
+ * * https://github.com/Kelledin
+ * * https://github.com/sstruchtrup
+ * * Michael Drake (https://github.com/tlsa)
+ * * https://github.com/chris-y
+ * * Laurent Zubiaur (https://github.com/lzubiaur)
+ * * Neil Kolban (https://github.com/nkolban)
+ *
+ * If you are accidentally missing from this list, send me an e-mail
+ * (``sami.vaarala@iki.fi``) and I'll fix the omission.
+ */
+
+#if !defined(DUKTAPE_H_INCLUDED)
+#define DUKTAPE_H_INCLUDED
+
+#define DUK_SINGLE_FILE
+
+/*
+ * BEGIN PUBLIC API
+ */
+
+/*
+ * Version and Git commit identification
+ */
+
+/* Duktape version, (major * 10000) + (minor * 100) + patch. Allows C code
+ * to #if (DUK_VERSION >= NNN) against Duktape API version. The same value
+ * is also available to Ecmascript code in Duktape.version. Unofficial
+ * development snapshots have 99 for patch level (e.g. 0.10.99 would be a
+ * development version after 0.10.0 but before the next official release).
+ */
+#define DUK_VERSION 20200L
+
+/* Git commit, describe, and branch for Duktape build. Useful for
+ * non-official snapshot builds so that application code can easily log
+ * which Duktape snapshot was used. Not available in the Ecmascript
+ * environment.
+ */
+#define DUK_GIT_COMMIT "a459cf3c9bd1779fc01b435d69302b742675a08f"
+#define DUK_GIT_DESCRIBE "v2.2.0"
+#define DUK_GIT_BRANCH "master"
+
+/* External duk_config.h provides platform/compiler/OS dependent
+ * typedefs and macros, and DUK_USE_xxx config options so that
+ * the rest of Duktape doesn't need to do any feature detection.
+ * DUK_VERSION is defined before including so that configuration
+ * snippets can react to it.
+ */
+#include "duk_config.h"
+
+/*
+ * Avoid C++ name mangling
+ */
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*
+ * Some defines forwarded from feature detection
+ */
+
+#undef DUK_API_VARIADIC_MACROS
+#if defined(DUK_USE_VARIADIC_MACROS)
+#define DUK_API_VARIADIC_MACROS
+#endif
+
+#define DUK_API_NORETURN(decl) DUK_NORETURN(decl)
+
+/*
+ * Public API specific typedefs
+ *
+ * Many types are wrapped by Duktape for portability to rare platforms
+ * where e.g. 'int' is a 16-bit type. See practical typing discussion
+ * in Duktape web documentation.
+ */
+
+struct duk_thread_state;
+struct duk_memory_functions;
+struct duk_function_list_entry;
+struct duk_number_list_entry;
+struct duk_time_components;
+
+/* duk_context is now defined in duk_config.h because it may also be
+ * referenced there by prototypes.
+ */
+typedef struct duk_thread_state duk_thread_state;
+typedef struct duk_memory_functions duk_memory_functions;
+typedef struct duk_function_list_entry duk_function_list_entry;
+typedef struct duk_number_list_entry duk_number_list_entry;
+typedef struct duk_time_components duk_time_components;
+
+typedef duk_ret_t (*duk_c_function)(duk_context *ctx);
+typedef void *(*duk_alloc_function) (void *udata, duk_size_t size);
+typedef void *(*duk_realloc_function) (void *udata, void *ptr, duk_size_t size);
+typedef void (*duk_free_function) (void *udata, void *ptr);
+typedef void (*duk_fatal_function) (void *udata, const char *msg);
+typedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint);
+typedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint);
+typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx, void *udata);
+typedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length);
+typedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length);
+typedef duk_size_t (*duk_debug_peek_function) (void *udata);
+typedef void (*duk_debug_read_flush_function) (void *udata);
+typedef void (*duk_debug_write_flush_function) (void *udata);
+typedef duk_idx_t (*duk_debug_request_function) (duk_context *ctx, void *udata, duk_idx_t nvalues);
+typedef void (*duk_debug_detached_function) (duk_context *ctx, void *udata);
+
+struct duk_thread_state {
+ /* XXX: Enough space to hold internal suspend/resume structure.
+ * This is rather awkward and to be fixed when the internal
+ * structure is visible for the public API header.
+ */
+ char data[128];
+};
+
+struct duk_memory_functions {
+ duk_alloc_function alloc_func;
+ duk_realloc_function realloc_func;
+ duk_free_function free_func;
+ void *udata;
+};
+
+struct duk_function_list_entry {
+ const char *key;
+ duk_c_function value;
+ duk_idx_t nargs;
+};
+
+struct duk_number_list_entry {
+ const char *key;
+ duk_double_t value;
+};
+
+struct duk_time_components {
+ duk_double_t year; /* year, e.g. 2016, Ecmascript year range */
+ duk_double_t month; /* month: 1-12 */
+ duk_double_t day; /* day: 1-31 */
+ duk_double_t hours; /* hour: 0-59 */
+ duk_double_t minutes; /* minute: 0-59 */
+ duk_double_t seconds; /* second: 0-59 (in POSIX time no leap second) */
+ duk_double_t milliseconds; /* may contain sub-millisecond fractions */
+ duk_double_t weekday; /* weekday: 0-6, 0=Sunday, 1=Monday, ..., 6=Saturday */
+};
+
+/*
+ * Constants
+ */
+
+/* Duktape debug protocol version used by this build. */
+#define DUK_DEBUG_PROTOCOL_VERSION 2
+
+/* Used to represent invalid index; if caller uses this without checking,
+ * this index will map to a non-existent stack entry. Also used in some
+ * API calls as a marker to denote "no value".
+ */
+#define DUK_INVALID_INDEX DUK_IDX_MIN
+
+/* Indicates that a native function does not have a fixed number of args,
+ * and the argument stack should not be capped/extended at all.
+ */
+#define DUK_VARARGS ((duk_int_t) (-1))
+
+/* Number of value stack entries (in addition to actual call arguments)
+ * guaranteed to be allocated on entry to a Duktape/C function.
+ */
+#define DUK_API_ENTRY_STACK 64U
+
+/* Value types, used by e.g. duk_get_type() */
+#define DUK_TYPE_MIN 0U
+#define DUK_TYPE_NONE 0U /* no value, e.g. invalid index */
+#define DUK_TYPE_UNDEFINED 1U /* Ecmascript undefined */
+#define DUK_TYPE_NULL 2U /* Ecmascript null */
+#define DUK_TYPE_BOOLEAN 3U /* Ecmascript boolean: 0 or 1 */
+#define DUK_TYPE_NUMBER 4U /* Ecmascript number: double */
+#define DUK_TYPE_STRING 5U /* Ecmascript string: CESU-8 / extended UTF-8 encoded */
+#define DUK_TYPE_OBJECT 6U /* Ecmascript object: includes objects, arrays, functions, threads */
+#define DUK_TYPE_BUFFER 7U /* fixed or dynamic, garbage collected byte buffer */
+#define DUK_TYPE_POINTER 8U /* raw void pointer */
+#define DUK_TYPE_LIGHTFUNC 9U /* lightweight function pointer */
+#define DUK_TYPE_MAX 9U
+
+/* Value mask types, used by e.g. duk_get_type_mask() */
+#define DUK_TYPE_MASK_NONE (1U << DUK_TYPE_NONE)
+#define DUK_TYPE_MASK_UNDEFINED (1U << DUK_TYPE_UNDEFINED)
+#define DUK_TYPE_MASK_NULL (1U << DUK_TYPE_NULL)
+#define DUK_TYPE_MASK_BOOLEAN (1U << DUK_TYPE_BOOLEAN)
+#define DUK_TYPE_MASK_NUMBER (1U << DUK_TYPE_NUMBER)
+#define DUK_TYPE_MASK_STRING (1U << DUK_TYPE_STRING)
+#define DUK_TYPE_MASK_OBJECT (1U << DUK_TYPE_OBJECT)
+#define DUK_TYPE_MASK_BUFFER (1U << DUK_TYPE_BUFFER)
+#define DUK_TYPE_MASK_POINTER (1U << DUK_TYPE_POINTER)
+#define DUK_TYPE_MASK_LIGHTFUNC (1U << DUK_TYPE_LIGHTFUNC)
+#define DUK_TYPE_MASK_THROW (1U << 10) /* internal flag value: throw if mask doesn't match */
+#define DUK_TYPE_MASK_PROMOTE (1U << 11) /* internal flag value: promote to object if mask matches */
+
+/* Coercion hints */
+#define DUK_HINT_NONE 0 /* prefer number, unless input is a Date, in which
+ * case prefer string (E5 Section 8.12.8)
+ */
+#define DUK_HINT_STRING 1 /* prefer string */
+#define DUK_HINT_NUMBER 2 /* prefer number */
+
+/* Enumeration flags for duk_enum() */
+#define DUK_ENUM_INCLUDE_NONENUMERABLE (1U << 0) /* enumerate non-numerable properties in addition to enumerable */
+#define DUK_ENUM_INCLUDE_HIDDEN (1U << 1) /* enumerate hidden symbols too (in Duktape 1.x called internal properties) */
+#define DUK_ENUM_INCLUDE_SYMBOLS (1U << 2) /* enumerate symbols */
+#define DUK_ENUM_EXCLUDE_STRINGS (1U << 3) /* exclude strings */
+#define DUK_ENUM_OWN_PROPERTIES_ONLY (1U << 4) /* don't walk prototype chain, only check own properties */
+#define DUK_ENUM_ARRAY_INDICES_ONLY (1U << 5) /* only enumerate array indices */
+/* XXX: misleading name */
+#define DUK_ENUM_SORT_ARRAY_INDICES (1U << 6) /* sort array indices (applied to full enumeration result, including inherited array indices); XXX: misleading name */
+#define DUK_ENUM_NO_PROXY_BEHAVIOR (1U << 7) /* enumerate a proxy object itself without invoking proxy behavior */
+
+/* Compilation flags for duk_compile() and duk_eval() */
+/* DUK_COMPILE_xxx bits 0-2 are reserved for an internal 'nargs' argument.
+ */
+#define DUK_COMPILE_EVAL (1U << 3) /* compile eval code (instead of global code) */
+#define DUK_COMPILE_FUNCTION (1U << 4) /* compile function code (instead of global code) */
+#define DUK_COMPILE_STRICT (1U << 5) /* use strict (outer) context for global, eval, or function code */
+#define DUK_COMPILE_SHEBANG (1U << 6) /* allow shebang ('#! ...') comment on first line of source */
+#define DUK_COMPILE_SAFE (1U << 7) /* (internal) catch compilation errors */
+#define DUK_COMPILE_NORESULT (1U << 8) /* (internal) omit eval result */
+#define DUK_COMPILE_NOSOURCE (1U << 9) /* (internal) no source string on stack */
+#define DUK_COMPILE_STRLEN (1U << 10) /* (internal) take strlen() of src_buffer (avoids double evaluation in macro) */
+#define DUK_COMPILE_NOFILENAME (1U << 11) /* (internal) no filename on stack */
+#define DUK_COMPILE_FUNCEXPR (1U << 12) /* (internal) source is a function expression (used for Function constructor) */
+
+/* Flags for duk_def_prop() and its variants; base flags + a lot of convenience shorthands */
+#define DUK_DEFPROP_WRITABLE (1U << 0) /* set writable (effective if DUK_DEFPROP_HAVE_WRITABLE set) */
+#define DUK_DEFPROP_ENUMERABLE (1U << 1) /* set enumerable (effective if DUK_DEFPROP_HAVE_ENUMERABLE set) */
+#define DUK_DEFPROP_CONFIGURABLE (1U << 2) /* set configurable (effective if DUK_DEFPROP_HAVE_CONFIGURABLE set) */
+#define DUK_DEFPROP_HAVE_WRITABLE (1U << 3) /* set/clear writable */
+#define DUK_DEFPROP_HAVE_ENUMERABLE (1U << 4) /* set/clear enumerable */
+#define DUK_DEFPROP_HAVE_CONFIGURABLE (1U << 5) /* set/clear configurable */
+#define DUK_DEFPROP_HAVE_VALUE (1U << 6) /* set value (given on value stack) */
+#define DUK_DEFPROP_HAVE_GETTER (1U << 7) /* set getter (given on value stack) */
+#define DUK_DEFPROP_HAVE_SETTER (1U << 8) /* set setter (given on value stack) */
+#define DUK_DEFPROP_FORCE (1U << 9) /* force change if possible, may still fail for e.g. virtual properties */
+#define DUK_DEFPROP_SET_WRITABLE (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE)
+#define DUK_DEFPROP_CLEAR_WRITABLE DUK_DEFPROP_HAVE_WRITABLE
+#define DUK_DEFPROP_SET_ENUMERABLE (DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE)
+#define DUK_DEFPROP_CLEAR_ENUMERABLE DUK_DEFPROP_HAVE_ENUMERABLE
+#define DUK_DEFPROP_SET_CONFIGURABLE (DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE)
+#define DUK_DEFPROP_CLEAR_CONFIGURABLE DUK_DEFPROP_HAVE_CONFIGURABLE
+#define DUK_DEFPROP_W DUK_DEFPROP_WRITABLE
+#define DUK_DEFPROP_E DUK_DEFPROP_ENUMERABLE
+#define DUK_DEFPROP_C DUK_DEFPROP_CONFIGURABLE
+#define DUK_DEFPROP_WE (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE)
+#define DUK_DEFPROP_WC (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_CONFIGURABLE)
+#define DUK_DEFPROP_WEC (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE | DUK_DEFPROP_CONFIGURABLE)
+#define DUK_DEFPROP_HAVE_W DUK_DEFPROP_HAVE_WRITABLE
+#define DUK_DEFPROP_HAVE_E DUK_DEFPROP_HAVE_ENUMERABLE
+#define DUK_DEFPROP_HAVE_C DUK_DEFPROP_HAVE_CONFIGURABLE
+#define DUK_DEFPROP_HAVE_WE (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE)
+#define DUK_DEFPROP_HAVE_WC (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_CONFIGURABLE)
+#define DUK_DEFPROP_HAVE_WEC (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE)
+#define DUK_DEFPROP_SET_W DUK_DEFPROP_SET_WRITABLE
+#define DUK_DEFPROP_SET_E DUK_DEFPROP_SET_ENUMERABLE
+#define DUK_DEFPROP_SET_C DUK_DEFPROP_SET_CONFIGURABLE
+#define DUK_DEFPROP_SET_WE (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE)
+#define DUK_DEFPROP_SET_WC (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE)
+#define DUK_DEFPROP_SET_WEC (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE)
+#define DUK_DEFPROP_CLEAR_W DUK_DEFPROP_CLEAR_WRITABLE
+#define DUK_DEFPROP_CLEAR_E DUK_DEFPROP_CLEAR_ENUMERABLE
+#define DUK_DEFPROP_CLEAR_C DUK_DEFPROP_CLEAR_CONFIGURABLE
+#define DUK_DEFPROP_CLEAR_WE (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE)
+#define DUK_DEFPROP_CLEAR_WC (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE)
+#define DUK_DEFPROP_CLEAR_WEC (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE)
+#define DUK_DEFPROP_ATTR_W (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_W)
+#define DUK_DEFPROP_ATTR_E (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_E)
+#define DUK_DEFPROP_ATTR_C (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_C)
+#define DUK_DEFPROP_ATTR_WE (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WE)
+#define DUK_DEFPROP_ATTR_WC (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WC)
+#define DUK_DEFPROP_ATTR_WEC (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WEC)
+
+/* Flags for duk_push_thread_raw() */
+#define DUK_THREAD_NEW_GLOBAL_ENV (1U << 0) /* create a new global environment */
+
+/* Flags for duk_gc() */
+#define DUK_GC_COMPACT (1U << 0) /* compact heap objects */
+
+/* Error codes (must be 8 bits at most, see duk_error.h) */
+#define DUK_ERR_NONE 0 /* no error (e.g. from duk_get_error_code()) */
+#define DUK_ERR_ERROR 1 /* Error */
+#define DUK_ERR_EVAL_ERROR 2 /* EvalError */
+#define DUK_ERR_RANGE_ERROR 3 /* RangeError */
+#define DUK_ERR_REFERENCE_ERROR 4 /* ReferenceError */
+#define DUK_ERR_SYNTAX_ERROR 5 /* SyntaxError */
+#define DUK_ERR_TYPE_ERROR 6 /* TypeError */
+#define DUK_ERR_URI_ERROR 7 /* URIError */
+
+/* Return codes for C functions (shortcut for throwing an error) */
+#define DUK_RET_ERROR (-DUK_ERR_ERROR)
+#define DUK_RET_EVAL_ERROR (-DUK_ERR_EVAL_ERROR)
+#define DUK_RET_RANGE_ERROR (-DUK_ERR_RANGE_ERROR)
+#define DUK_RET_REFERENCE_ERROR (-DUK_ERR_REFERENCE_ERROR)
+#define DUK_RET_SYNTAX_ERROR (-DUK_ERR_SYNTAX_ERROR)
+#define DUK_RET_TYPE_ERROR (-DUK_ERR_TYPE_ERROR)
+#define DUK_RET_URI_ERROR (-DUK_ERR_URI_ERROR)
+
+/* Return codes for protected calls (duk_safe_call(), duk_pcall()) */
+#define DUK_EXEC_SUCCESS 0
+#define DUK_EXEC_ERROR 1
+
+/* Debug levels for DUK_USE_DEBUG_WRITE(). */
+#define DUK_LEVEL_DEBUG 0
+#define DUK_LEVEL_DDEBUG 1
+#define DUK_LEVEL_DDDEBUG 2
+
+/*
+ * Macros to create Symbols as C statically constructed strings.
+ *
+ * Call e.g. as DUK_HIDDEN_SYMBOL("myProperty") <=> ("\xFF" "myProperty").
+ * Local symbols have a unique suffix, caller should take care to avoid
+ * conflicting with the Duktape internal representation by e.g. prepending
+ * a '!' character: DUK_LOCAL_SYMBOL("myLocal", "!123").
+ *
+ * Note that these can only be used for string constants, not dynamically
+ * created strings.
+ */
+
+#define DUK_HIDDEN_SYMBOL(x) ("\xFF" x)
+#define DUK_GLOBAL_SYMBOL(x) ("\x80" x)
+#define DUK_LOCAL_SYMBOL(x,uniq) ("\x81" x "\xff" uniq)
+#define DUK_WELLKNOWN_SYMBOL(x) ("\x81" x "\xff")
+
+/*
+ * If no variadic macros, __FILE__ and __LINE__ are passed through globals
+ * which is ugly and not thread safe.
+ */
+
+#if !defined(DUK_API_VARIADIC_MACROS)
+DUK_EXTERNAL_DECL const char *duk_api_global_filename;
+DUK_EXTERNAL_DECL duk_int_t duk_api_global_line;
+#endif
+
+/*
+ * Context management
+ */
+
+DUK_EXTERNAL_DECL
+duk_context *duk_create_heap(duk_alloc_function alloc_func,
+ duk_realloc_function realloc_func,
+ duk_free_function free_func,
+ void *heap_udata,
+ duk_fatal_function fatal_handler);
+DUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx);
+
+DUK_EXTERNAL_DECL void duk_suspend(duk_context *ctx, duk_thread_state *state);
+DUK_EXTERNAL_DECL void duk_resume(duk_context *ctx, const duk_thread_state *state);
+
+#define duk_create_heap_default() \
+ duk_create_heap(NULL, NULL, NULL, NULL, NULL)
+
+/*
+ * Memory management
+ *
+ * Raw functions have no side effects (cannot trigger GC).
+ */
+
+DUK_EXTERNAL_DECL void *duk_alloc_raw(duk_context *ctx, duk_size_t size);
+DUK_EXTERNAL_DECL void duk_free_raw(duk_context *ctx, void *ptr);
+DUK_EXTERNAL_DECL void *duk_realloc_raw(duk_context *ctx, void *ptr, duk_size_t size);
+DUK_EXTERNAL_DECL void *duk_alloc(duk_context *ctx, duk_size_t size);
+DUK_EXTERNAL_DECL void duk_free(duk_context *ctx, void *ptr);
+DUK_EXTERNAL_DECL void *duk_realloc(duk_context *ctx, void *ptr, duk_size_t size);
+DUK_EXTERNAL_DECL void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs);
+DUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags);
+
+/*
+ * Error handling
+ */
+
+DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw_raw(duk_context *ctx));
+#define duk_throw(ctx) \
+ (duk_throw_raw((ctx)), (duk_ret_t) 0)
+DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal_raw(duk_context *ctx, const char *err_msg));
+#define duk_fatal(ctx,err_msg) \
+ (duk_fatal_raw((ctx), (err_msg)), (duk_ret_t) 0)
+DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...));
+
+#if defined(DUK_API_VARIADIC_MACROS)
+#define duk_error(ctx,err_code,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_generic_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_eval_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_range_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_reference_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_syntax_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_type_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#define duk_uri_error(ctx,...) \
+ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)
+#else /* DUK_API_VARIADIC_MACROS */
+/* For legacy compilers without variadic macros a macro hack is used to allow
+ * variable arguments. While the macro allows "return duk_error(...)", it
+ * will fail with e.g. "(void) duk_error(...)". The calls are noreturn but
+ * with a return value to allow the "return duk_error(...)" idiom. This may
+ * cause some compiler warnings, but without noreturn the generated code is
+ * often worse. The same approach as with variadic macros (using
+ * "(duk_error(...), 0)") won't work due to the macro hack structure.
+ */
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_generic_error_stash(duk_context *ctx, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_eval_error_stash(duk_context *ctx, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_range_error_stash(duk_context *ctx, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_reference_error_stash(duk_context *ctx, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error_stash(duk_context *ctx, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_type_error_stash(duk_context *ctx, const char *fmt, ...));
+DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_uri_error_stash(duk_context *ctx, const char *fmt, ...));
+#define duk_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_error_stash) /* last value is func pointer, arguments follow in parens */
+#define duk_generic_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_generic_error_stash)
+#define duk_eval_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_eval_error_stash)
+#define duk_range_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_range_error_stash)
+#define duk_reference_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_reference_error_stash)
+#define duk_syntax_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_syntax_error_stash)
+#define duk_type_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_type_error_stash)
+#define duk_uri_error \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_uri_error_stash)
+#endif /* DUK_API_VARIADIC_MACROS */
+
+DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap));
+
+#define duk_error_va(ctx,err_code,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_generic_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_eval_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_range_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_reference_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_syntax_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_type_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+#define duk_uri_error_va(ctx,fmt,ap) \
+ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)
+
+/*
+ * Other state related functions
+ */
+
+DUK_EXTERNAL_DECL duk_bool_t duk_is_strict_call(duk_context *ctx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_constructor_call(duk_context *ctx);
+
+/*
+ * Stack management
+ */
+
+DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t idx);
+
+DUK_EXTERNAL_DECL duk_idx_t duk_get_top(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_idx_t duk_get_top_index(duk_context *ctx);
+DUK_EXTERNAL_DECL duk_idx_t duk_require_top_index(duk_context *ctx);
+
+/* Although extra/top could be an unsigned type here, using a signed type
+ * makes the API more robust to calling code calculation errors or corner
+ * cases (where caller might occasionally come up with negative values).
+ * Negative values are treated as zero, which is better than casting them
+ * to a large unsigned number. (This principle is used elsewhere in the
+ * API too.)
+ */
+DUK_EXTERNAL_DECL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra);
+DUK_EXTERNAL_DECL void duk_require_stack(duk_context *ctx, duk_idx_t extra);
+DUK_EXTERNAL_DECL duk_bool_t duk_check_stack_top(duk_context *ctx, duk_idx_t top);
+DUK_EXTERNAL_DECL void duk_require_stack_top(duk_context *ctx, duk_idx_t top);
+
+/*
+ * Stack manipulation (other than push/pop)
+ */
+
+DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
+DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_idx);
+DUK_EXTERNAL_DECL void duk_dup_top(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_idx);
+DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_idx);
+DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx);
+DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_xcopymove_raw(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count, duk_bool_t is_copy);
+
+#define duk_xmove_top(to_ctx,from_ctx,count) \
+ duk_xcopymove_raw((to_ctx), (from_ctx), (count), 0 /*is_copy*/)
+#define duk_xcopy_top(to_ctx,from_ctx,count) \
+ duk_xcopymove_raw((to_ctx), (from_ctx), (count), 1 /*is_copy*/)
+
+/*
+ * Push operations
+ *
+ * Push functions return the absolute (relative to bottom of frame)
+ * position of the pushed value for convenience.
+ *
+ * Note: duk_dup() is technically a push.
+ */
+
+DUK_EXTERNAL_DECL void duk_push_undefined(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_null(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_boolean(duk_context *ctx, duk_bool_t val);
+DUK_EXTERNAL_DECL void duk_push_true(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_false(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_number(duk_context *ctx, duk_double_t val);
+DUK_EXTERNAL_DECL void duk_push_nan(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_int(duk_context *ctx, duk_int_t val);
+DUK_EXTERNAL_DECL void duk_push_uint(duk_context *ctx, duk_uint_t val);
+DUK_EXTERNAL_DECL const char *duk_push_string(duk_context *ctx, const char *str);
+DUK_EXTERNAL_DECL const char *duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len);
+DUK_EXTERNAL_DECL void duk_push_pointer(duk_context *ctx, void *p);
+DUK_EXTERNAL_DECL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...);
+DUK_EXTERNAL_DECL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap);
+
+DUK_EXTERNAL_DECL void duk_push_this(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_current_function(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_current_thread(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_global_object(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_heap_stash(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_global_stash(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_push_thread_stash(duk_context *ctx, duk_context *target_ctx);
+
+DUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx);
+DUK_EXTERNAL_DECL duk_idx_t duk_push_bare_object(duk_context *ctx);
+DUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx);
+DUK_EXTERNAL_DECL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_idx_t nargs);
+DUK_EXTERNAL_DECL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic);
+DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags);
+DUK_EXTERNAL_DECL duk_idx_t duk_push_proxy(duk_context *ctx, duk_uint_t proxy_flags);
+
+#define duk_push_thread(ctx) \
+ duk_push_thread_raw((ctx), 0 /*flags*/)
+
+#define duk_push_thread_new_globalenv(ctx) \
+ duk_push_thread_raw((ctx), DUK_THREAD_NEW_GLOBAL_ENV /*flags*/)
+
+DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...);
+
+#if defined(DUK_API_VARIADIC_MACROS)
+#define duk_push_error_object(ctx,err_code,...) \
+ duk_push_error_object_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__)
+#else
+DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...);
+/* Note: parentheses are required so that the comma expression works in assignments. */
+#define duk_push_error_object \
+ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \
+ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \
+ duk_push_error_object_stash) /* last value is func pointer, arguments follow in parens */
+#endif
+
+DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap);
+#define duk_push_error_object_va(ctx,err_code,fmt,ap) \
+ duk_push_error_object_va_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap))
+
+#define DUK_BUF_FLAG_DYNAMIC (1 << 0) /* internal flag: dynamic buffer */
+#define DUK_BUF_FLAG_EXTERNAL (1 << 1) /* internal flag: external buffer */
+#define DUK_BUF_FLAG_NOZERO (1 << 2) /* internal flag: don't zero allocated buffer */
+
+DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_small_uint_t flags);
+
+#define duk_push_buffer(ctx,size,dynamic) \
+ duk_push_buffer_raw((ctx), (size), (dynamic) ? DUK_BUF_FLAG_DYNAMIC : 0)
+#define duk_push_fixed_buffer(ctx,size) \
+ duk_push_buffer_raw((ctx), (size), 0 /*flags*/)
+#define duk_push_dynamic_buffer(ctx,size) \
+ duk_push_buffer_raw((ctx), (size), DUK_BUF_FLAG_DYNAMIC /*flags*/)
+#define duk_push_external_buffer(ctx) \
+ ((void) duk_push_buffer_raw((ctx), 0, DUK_BUF_FLAG_DYNAMIC | DUK_BUF_FLAG_EXTERNAL))
+
+#define DUK_BUFOBJ_ARRAYBUFFER 0
+#define DUK_BUFOBJ_NODEJS_BUFFER 1
+#define DUK_BUFOBJ_DATAVIEW 2
+#define DUK_BUFOBJ_INT8ARRAY 3
+#define DUK_BUFOBJ_UINT8ARRAY 4
+#define DUK_BUFOBJ_UINT8CLAMPEDARRAY 5
+#define DUK_BUFOBJ_INT16ARRAY 6
+#define DUK_BUFOBJ_UINT16ARRAY 7
+#define DUK_BUFOBJ_INT32ARRAY 8
+#define DUK_BUFOBJ_UINT32ARRAY 9
+#define DUK_BUFOBJ_FLOAT32ARRAY 10
+#define DUK_BUFOBJ_FLOAT64ARRAY 11
+
+DUK_EXTERNAL_DECL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags);
+
+DUK_EXTERNAL_DECL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr);
+
+/*
+ * Pop operations
+ */
+
+DUK_EXTERNAL_DECL void duk_pop(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_pop_n(duk_context *ctx, duk_idx_t count);
+DUK_EXTERNAL_DECL void duk_pop_2(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_pop_3(duk_context *ctx);
+
+/*
+ * Type checks
+ *
+ * duk_is_none(), which would indicate whether index it outside of stack,
+ * is not needed; duk_is_valid_index() gives the same information.
+ */
+
+DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type);
+DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask);
+
+DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx);
+#define duk_is_null_or_undefined(ctx, idx) \
+ ((duk_get_type_mask((ctx), (idx)) & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) ? 1 : 0)
+
+DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx);
+
+DUK_EXTERNAL_DECL duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx);
+
+#define duk_is_callable(ctx,idx) \
+ duk_is_function((ctx), (idx))
+DUK_EXTERNAL_DECL duk_bool_t duk_is_constructable(duk_context *ctx, duk_idx_t idx);
+
+DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t idx);
+
+/* Buffers and lightfuncs are not considered primitive because they mimic
+ * objects and e.g. duk_to_primitive() will coerce them instead of returning
+ * them as is. Symbols are represented as strings internally.
+ */
+#define duk_is_primitive(ctx,idx) \
+ duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_UNDEFINED | \
+ DUK_TYPE_MASK_NULL | \
+ DUK_TYPE_MASK_BOOLEAN | \
+ DUK_TYPE_MASK_NUMBER | \
+ DUK_TYPE_MASK_STRING | \
+ DUK_TYPE_MASK_POINTER)
+
+/* Symbols are object coercible, covered by DUK_TYPE_MASK_STRING. */
+#define duk_is_object_coercible(ctx,idx) \
+ duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \
+ DUK_TYPE_MASK_NUMBER | \
+ DUK_TYPE_MASK_STRING | \
+ DUK_TYPE_MASK_OBJECT | \
+ DUK_TYPE_MASK_BUFFER | \
+ DUK_TYPE_MASK_POINTER | \
+ DUK_TYPE_MASK_LIGHTFUNC)
+
+DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx);
+#define duk_is_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) != 0)
+#define duk_is_eval_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) == DUK_ERR_EVAL_ERROR)
+#define duk_is_range_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) == DUK_ERR_RANGE_ERROR)
+#define duk_is_reference_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) == DUK_ERR_REFERENCE_ERROR)
+#define duk_is_syntax_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) == DUK_ERR_SYNTAX_ERROR)
+#define duk_is_type_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) == DUK_ERR_TYPE_ERROR)
+#define duk_is_uri_error(ctx,idx) \
+ (duk_get_error_code((ctx), (idx)) == DUK_ERR_URI_ERROR)
+
+/*
+ * Get operations: no coercion, returns default value for invalid
+ * indices and invalid value types.
+ *
+ * duk_get_undefined() and duk_get_null() would be pointless and
+ * are not included.
+ */
+
+DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);
+DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
+DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
+DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx);
+
+/*
+ * Get-with-explicit default operations: like get operations but with an
+ * explicit default value.
+ */
+
+DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean_default(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value);
+DUK_EXTERNAL_DECL duk_double_t duk_get_number_default(duk_context *ctx, duk_idx_t idx, duk_double_t def_value);
+DUK_EXTERNAL_DECL duk_int_t duk_get_int_default(duk_context *ctx, duk_idx_t idx, duk_int_t def_value);
+DUK_EXTERNAL_DECL duk_uint_t duk_get_uint_default(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value);
+DUK_EXTERNAL_DECL const char *duk_get_string_default(duk_context *ctx, duk_idx_t idx, const char *def_value);
+DUK_EXTERNAL_DECL const char *duk_get_lstring_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len);
+DUK_EXTERNAL_DECL void *duk_get_buffer_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len);
+DUK_EXTERNAL_DECL void *duk_get_buffer_data_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len);
+DUK_EXTERNAL_DECL void *duk_get_pointer_default(duk_context *ctx, duk_idx_t idx, void *def_value);
+DUK_EXTERNAL_DECL duk_c_function duk_get_c_function_default(duk_context *ctx, duk_idx_t idx, duk_c_function def_value);
+DUK_EXTERNAL_DECL duk_context *duk_get_context_default(duk_context *ctx, duk_idx_t idx, duk_context *def_value);
+DUK_EXTERNAL_DECL void *duk_get_heapptr_default(duk_context *ctx, duk_idx_t idx, void *def_value);
+
+/*
+ * Opt operations: like require operations but with an explicit default value
+ * when value is undefined or index is invalid, null and non-matching types
+ * cause a TypeError.
+ */
+
+DUK_EXTERNAL_DECL duk_bool_t duk_opt_boolean(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value);
+DUK_EXTERNAL_DECL duk_double_t duk_opt_number(duk_context *ctx, duk_idx_t idx, duk_double_t def_value);
+DUK_EXTERNAL_DECL duk_int_t duk_opt_int(duk_context *ctx, duk_idx_t idx, duk_int_t def_value);
+DUK_EXTERNAL_DECL duk_uint_t duk_opt_uint(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value);
+DUK_EXTERNAL_DECL const char *duk_opt_string(duk_context *ctx, duk_idx_t idx, const char *def_ptr);
+DUK_EXTERNAL_DECL const char *duk_opt_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len);
+DUK_EXTERNAL_DECL void *duk_opt_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size);
+DUK_EXTERNAL_DECL void *duk_opt_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size);
+DUK_EXTERNAL_DECL void *duk_opt_pointer(duk_context *ctx, duk_idx_t idx, void *def_value);
+DUK_EXTERNAL_DECL duk_c_function duk_opt_c_function(duk_context *ctx, duk_idx_t idx, duk_c_function def_value);
+DUK_EXTERNAL_DECL duk_context *duk_opt_context(duk_context *ctx, duk_idx_t idx, duk_context *def_value);
+DUK_EXTERNAL_DECL void *duk_opt_heapptr(duk_context *ctx, duk_idx_t idx, void *def_value);
+
+/*
+ * Require operations: no coercion, throw error if index or type
+ * is incorrect. No defaulting.
+ */
+
+#define duk_require_type_mask(ctx,idx,mask) \
+ ((void) duk_check_type_mask((ctx), (idx), (mask) | DUK_TYPE_MASK_THROW))
+
+DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);
+DUK_EXTERNAL_DECL void duk_require_object(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
+DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
+DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t idx);
+#define duk_require_callable(ctx,idx) \
+ duk_require_function((ctx), (idx))
+DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx);
+
+/* Symbols are object coercible and covered by DUK_TYPE_MASK_STRING. */
+#define duk_require_object_coercible(ctx,idx) \
+ ((void) duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \
+ DUK_TYPE_MASK_NUMBER | \
+ DUK_TYPE_MASK_STRING | \
+ DUK_TYPE_MASK_OBJECT | \
+ DUK_TYPE_MASK_BUFFER | \
+ DUK_TYPE_MASK_POINTER | \
+ DUK_TYPE_MASK_LIGHTFUNC | \
+ DUK_TYPE_MASK_THROW))
+
+/*
+ * Coercion operations: in-place coercion, return coerced value where
+ * applicable. If index is invalid, throw error. Some coercions may
+ * throw an expected error (e.g. from a toString() or valueOf() call)
+ * or an internal error (e.g. from out of memory).
+ */
+
+DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);
+DUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, duk_uint_t flags);
+DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t idx, duk_int_t hint);
+
+#define DUK_BUF_MODE_FIXED 0 /* internal: request fixed buffer result */
+#define DUK_BUF_MODE_DYNAMIC 1 /* internal: request dynamic buffer result */
+#define DUK_BUF_MODE_DONTCARE 2 /* internal: don't care about fixed/dynamic nature */
+
+#define duk_to_buffer(ctx,idx,out_size) \
+ duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DONTCARE)
+#define duk_to_fixed_buffer(ctx,idx,out_size) \
+ duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_FIXED)
+#define duk_to_dynamic_buffer(ctx,idx,out_size) \
+ duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DYNAMIC)
+
+/* safe variants of a few coercion operations */
+DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);
+#define duk_safe_to_string(ctx,idx) \
+ duk_safe_to_lstring((ctx), (idx), NULL)
+
+/*
+ * Value length
+ */
+
+DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t idx, duk_size_t len);
+#if 0
+/* duk_require_length()? */
+/* duk_opt_length()? */
+#endif
+
+/*
+ * Misc conversion
+ */
+
+DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t idx);
+
+DUK_EXTERNAL_DECL const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx);
+
+/*
+ * Buffer
+ */
+
+DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t new_size);
+DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);
+DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len);
+
+/*
+ * Property access
+ *
+ * The basic function assumes key is on stack. The _string variant takes
+ * a C string as a property name, while the _index variant takes an array
+ * index as a property name (e.g. 123 is equivalent to the key "123").
+ */
+
+DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
+DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
+DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);
+DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
+DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
+DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);
+DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);
+DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);
+DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);
+DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);
+
+DUK_EXTERNAL_DECL void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags);
+DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags);
+
+DUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key);
+DUK_EXTERNAL_DECL duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key);
+DUK_EXTERNAL_DECL duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len);
+
+/*
+ * Inspection
+ */
+
+DUK_EXTERNAL_DECL void duk_inspect_value(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level);
+
+/*
+ * Object prototype
+ */
+
+DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t idx);
+
+/*
+ * Object finalizer
+ */
+
+DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t idx);
+
+/*
+ * Global object
+ */
+
+DUK_EXTERNAL_DECL void duk_set_global_object(duk_context *ctx);
+
+/*
+ * Duktape/C function magic value
+ */
+
+DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t idx, duk_int_t magic);
+DUK_EXTERNAL_DECL duk_int_t duk_get_current_magic(duk_context *ctx);
+
+/*
+ * Module helpers: put multiple function or constant properties
+ */
+
+DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs);
+DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers);
+
+/*
+ * Object operations
+ */
+
+DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_idx);
+DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags);
+DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value);
+DUK_EXTERNAL_DECL void duk_seal(duk_context *ctx, duk_idx_t obj_idx);
+DUK_EXTERNAL_DECL void duk_freeze(duk_context *ctx, duk_idx_t obj_idx);
+
+/*
+ * String manipulation
+ */
+
+DUK_EXTERNAL_DECL void duk_concat(duk_context *ctx, duk_idx_t count);
+DUK_EXTERNAL_DECL void duk_join(duk_context *ctx, duk_idx_t count);
+DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata);
+DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata);
+DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t idx, duk_size_t start_char_offset, duk_size_t end_char_offset);
+DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t idx);
+DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset);
+
+/*
+ * Ecmascript operators
+ */
+
+DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
+DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
+DUK_EXTERNAL_DECL duk_bool_t duk_samevalue(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
+DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);
+
+/*
+ * Function (method) calls
+ */
+
+DUK_EXTERNAL_DECL void duk_call(duk_context *ctx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL void duk_call_method(duk_context *ctx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL void duk_new(duk_context *ctx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL duk_int_t duk_pnew(duk_context *ctx, duk_idx_t nargs);
+DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets);
+
+/*
+ * Thread management
+ */
+
+/* There are currently no native functions to yield/resume, due to the internal
+ * limitations on coroutine handling. These will be added later.
+ */
+
+/*
+ * Compilation and evaluation
+ */
+
+DUK_EXTERNAL_DECL duk_int_t duk_eval_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags);
+DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags);
+
+/* plain */
+#define duk_eval(ctx) \
+ ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOFILENAME))
+
+#define duk_eval_noresult(ctx) \
+ ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))
+
+#define duk_peval(ctx) \
+ (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME))
+
+#define duk_peval_noresult(ctx) \
+ (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))
+
+#define duk_compile(ctx,flags) \
+ ((void) duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags)))
+
+#define duk_pcompile(ctx,flags) \
+ (duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE))
+
+/* string */
+#define duk_eval_string(ctx,src) \
+ ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))
+
+#define duk_eval_string_noresult(ctx,src) \
+ ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))
+
+#define duk_peval_string(ctx,src) \
+ (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))
+
+#define duk_peval_string_noresult(ctx,src) \
+ (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))
+
+#define duk_compile_string(ctx,flags,src) \
+ ((void) duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))
+
+#define duk_compile_string_filename(ctx,flags,src) \
+ ((void) duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
+
+#define duk_pcompile_string(ctx,flags,src) \
+ (duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))
+
+#define duk_pcompile_string_filename(ctx,flags,src) \
+ (duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
+
+/* lstring */
+#define duk_eval_lstring(ctx,buf,len) \
+ ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME))
+
+#define duk_eval_lstring_noresult(ctx,buf,len) \
+ ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))
+
+#define duk_peval_lstring(ctx,buf,len) \
+ (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME))
+
+#define duk_peval_lstring_noresult(ctx,buf,len) \
+ (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))
+
+#define duk_compile_lstring(ctx,flags,buf,len) \
+ ((void) duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME))
+
+#define duk_compile_lstring_filename(ctx,flags,buf,len) \
+ ((void) duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE))
+
+#define duk_pcompile_lstring(ctx,flags,buf,len) \
+ (duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME))
+
+#define duk_pcompile_lstring_filename(ctx,flags,buf,len) \
+ (duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE))
+
+/*
+ * Bytecode load/dump
+ */
+
+DUK_EXTERNAL_DECL void duk_dump_function(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_load_function(duk_context *ctx);
+
+/*
+ * Debugging
+ */
+
+DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx);
+
+/*
+ * Debugger (debug protocol)
+ */
+
+DUK_EXTERNAL_DECL void duk_debugger_attach(duk_context *ctx,
+ duk_debug_read_function read_cb,
+ duk_debug_write_function write_cb,
+ duk_debug_peek_function peek_cb,
+ duk_debug_read_flush_function read_flush_cb,
+ duk_debug_write_flush_function write_flush_cb,
+ duk_debug_request_function request_cb,
+ duk_debug_detached_function detached_cb,
+ void *udata);
+DUK_EXTERNAL_DECL void duk_debugger_detach(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_debugger_cooperate(duk_context *ctx);
+DUK_EXTERNAL_DECL duk_bool_t duk_debugger_notify(duk_context *ctx, duk_idx_t nvalues);
+DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx);
+
+/*
+ * Time handling
+ */
+
+DUK_EXTERNAL_DECL duk_double_t duk_get_now(duk_context *ctx);
+DUK_EXTERNAL_DECL void duk_time_to_components(duk_context *ctx, duk_double_t timeval, duk_time_components *comp);
+DUK_EXTERNAL_DECL duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp);
+
+/*
+ * Date provider related constants
+ *
+ * NOTE: These are "semi public" - you should only use these if you write
+ * your own platform specific Date provider, see doc/datetime.rst.
+ */
+
+/* Millisecond count constants. */
+#define DUK_DATE_MSEC_SECOND 1000L
+#define DUK_DATE_MSEC_MINUTE (60L * 1000L)
+#define DUK_DATE_MSEC_HOUR (60L * 60L * 1000L)
+#define DUK_DATE_MSEC_DAY (24L * 60L * 60L * 1000L)
+
+/* Ecmascript date range is 100 million days from Epoch:
+ * > 100e6 * 24 * 60 * 60 * 1000 // 100M days in millisecs
+ * 8640000000000000
+ * (= 8.64e15)
+ */
+#define DUK_DATE_MSEC_100M_DAYS (8.64e15)
+#define DUK_DATE_MSEC_100M_DAYS_LEEWAY (8.64e15 + 24 * 3600e3)
+
+/* Ecmascript year range:
+ * > new Date(100e6 * 24 * 3600e3).toISOString()
+ * '+275760-09-13T00:00:00.000Z'
+ * > new Date(-100e6 * 24 * 3600e3).toISOString()
+ * '-271821-04-20T00:00:00.000Z'
+ */
+#define DUK_DATE_MIN_ECMA_YEAR (-271821L)
+#define DUK_DATE_MAX_ECMA_YEAR 275760L
+
+/* Part indices for internal breakdowns. Part order from DUK_DATE_IDX_YEAR
+ * to DUK_DATE_IDX_MILLISECOND matches argument ordering of Ecmascript API
+ * calls (like Date constructor call). Some functions in duk_bi_date.c
+ * depend on the specific ordering, so change with care. 16 bits are not
+ * enough for all parts (year, specifically).
+ *
+ * Must be in-sync with genbuiltins.py.
+ */
+#define DUK_DATE_IDX_YEAR 0 /* year */
+#define DUK_DATE_IDX_MONTH 1 /* month: 0 to 11 */
+#define DUK_DATE_IDX_DAY 2 /* day within month: 0 to 30 */
+#define DUK_DATE_IDX_HOUR 3
+#define DUK_DATE_IDX_MINUTE 4
+#define DUK_DATE_IDX_SECOND 5
+#define DUK_DATE_IDX_MILLISECOND 6
+#define DUK_DATE_IDX_WEEKDAY 7 /* weekday: 0 to 6, 0=sunday, 1=monday, etc */
+#define DUK_DATE_IDX_NUM_PARTS 8
+
+/* Internal API call flags, used for various functions in duk_bi_date.c.
+ * Certain flags are used by only certain functions, but since the flags
+ * don't overlap, a single flags value can be passed around to multiple
+ * functions.
+ *
+ * The unused top bits of the flags field are also used to pass values
+ * to helpers (duk__get_part_helper() and duk__set_part_helper()).
+ *
+ * Must be in-sync with genbuiltins.py.
+ */
+
+/* NOTE: when writing a Date provider you only need a few specific
+ * flags from here, the rest are internal. Avoid using anything you
+ * don't need.
+ */
+
+#define DUK_DATE_FLAG_NAN_TO_ZERO (1 << 0) /* timeval breakdown: internal time value NaN -> zero */
+#define DUK_DATE_FLAG_NAN_TO_RANGE_ERROR (1 << 1) /* timeval breakdown: internal time value NaN -> RangeError (toISOString) */
+#define DUK_DATE_FLAG_ONEBASED (1 << 2) /* timeval breakdown: convert month and day-of-month parts to one-based (default is zero-based) */
+#define DUK_DATE_FLAG_EQUIVYEAR (1 << 3) /* timeval breakdown: replace year with equivalent year in the [1971,2037] range for DST calculations */
+#define DUK_DATE_FLAG_LOCALTIME (1 << 4) /* convert time value to local time */
+#define DUK_DATE_FLAG_SUB1900 (1 << 5) /* getter: subtract 1900 from year when getting year part */
+#define DUK_DATE_FLAG_TOSTRING_DATE (1 << 6) /* include date part in string conversion result */
+#define DUK_DATE_FLAG_TOSTRING_TIME (1 << 7) /* include time part in string conversion result */
+#define DUK_DATE_FLAG_TOSTRING_LOCALE (1 << 8) /* use locale specific formatting if available */
+#define DUK_DATE_FLAG_TIMESETTER (1 << 9) /* setter: call is a time setter (affects hour, min, sec, ms); otherwise date setter (affects year, month, day-in-month) */
+#define DUK_DATE_FLAG_YEAR_FIXUP (1 << 10) /* setter: perform 2-digit year fixup (00...99 -> 1900...1999) */
+#define DUK_DATE_FLAG_SEP_T (1 << 11) /* string conversion: use 'T' instead of ' ' as a separator */
+#define DUK_DATE_FLAG_VALUE_SHIFT 12 /* additional values begin at bit 12 */
+
+/*
+ * ROM pointer compression
+ */
+
+/* Support array for ROM pointer compression. Only declared when ROM
+ * pointer compression is active.
+ */
+#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16)
+DUK_EXTERNAL_DECL const void * const duk_rom_compressed_pointers[];
+#endif
+
+/*
+ * C++ name mangling
+ */
+
+#if defined(__cplusplus)
+/* end 'extern "C"' wrapper */
+}
+#endif
+
+/*
+ * END PUBLIC API
+ */
+
+#endif /* DUKTAPE_H_INCLUDED */
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/timers.go b/vendor/gopkg.in/olebedev/go-duktape.v3/timers.go
new file mode 100644
index 000000000..e12ee1f2e
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/timers.go
@@ -0,0 +1,136 @@
+package duktape
+
+import (
+ "errors"
+ "fmt"
+ "time"
+)
+
+// DefineTimers defines `setTimeout`, `clearTimeout`, `setInterval`,
+// `clearInterval` into global context.
+func (d *Context) PushTimers() error {
+ d.PushGlobalStash()
+ // check if timers already exists
+ if !d.HasPropString(-1, "timers") {
+ d.PushObject()
+ d.PutPropString(-2, "timers") // stash -> [ timers:{} ]
+ d.Pop()
+
+ d.PushGlobalGoFunction("setTimeout", setTimeout)
+ d.PushGlobalGoFunction("setInterval", setInterval)
+ d.PushGlobalGoFunction("clearTimeout", clearTimeout)
+ d.PushGlobalGoFunction("clearInterval", clearTimeout)
+ return nil
+ } else {
+ d.Pop()
+ return errors.New("Timers are already defined")
+ }
+}
+
+func (d *Context) FlushTimers() {
+ d.PushGlobalStash()
+ d.PushObject()
+ d.PutPropString(-2, "timers") // stash -> [ timers:{} ]
+ d.Pop()
+}
+
+func setTimeout(c *Context) int {
+ id := c.pushTimer(0)
+ timeout := c.ToNumber(1)
+ if timeout < 1 {
+ timeout = 1
+ }
+ go func(id float64) {
+ <-time.After(time.Duration(timeout) * time.Millisecond)
+ c.Lock()
+ defer c.Unlock()
+ if c.duk_context == nil {
+ fmt.Println("[duktape] Warning!\nsetTimeout invokes callback after the context was destroyed.")
+ return
+ }
+
+ // check if timer still exists
+ c.putTimer(id)
+ if c.GetType(-1).IsObject() {
+ c.Pcall(0 /* nargs */)
+ }
+ c.dropTimer(id)
+ }(id)
+ c.PushNumber(id)
+ return 1
+}
+
+func clearTimeout(c *Context) int {
+ if c.GetType(0).IsNumber() {
+ c.dropTimer(c.GetNumber(0))
+ c.Pop()
+ }
+ return 0
+}
+
+func setInterval(c *Context) int {
+ id := c.pushTimer(0)
+ timeout := c.ToNumber(1)
+ if timeout < 1 {
+ timeout = 1
+ }
+ go func(id float64) {
+ ticker := time.NewTicker(time.Duration(timeout) * time.Millisecond)
+ for _ = range ticker.C {
+ c.Lock()
+ // check if duktape context exists
+ if c.duk_context == nil {
+ c.dropTimer(id)
+ c.Pop()
+ ticker.Stop()
+ fmt.Println("[duktape] Warning!\nsetInterval invokes callback after the context was destroyed.")
+ c.Unlock()
+ continue
+ }
+
+ // check if timer still exists
+ c.putTimer(id)
+ if c.GetType(-1).IsObject() {
+ c.Pcall(0 /* nargs */)
+ c.Pop()
+ } else {
+ c.dropTimer(id)
+ c.Pop()
+ ticker.Stop()
+ }
+ c.Unlock()
+ }
+ }(id)
+ c.PushNumber(id)
+ return 1
+}
+
+func (d *Context) pushTimer(index int) float64 {
+ id := d.timerIndex.get()
+
+ d.PushGlobalStash()
+ d.GetPropString(-1, "timers")
+ d.PushNumber(id)
+ d.Dup(index)
+ d.PutProp(-3)
+ d.Pop2()
+
+ return id
+}
+
+func (d *Context) dropTimer(id float64) {
+ d.PushGlobalStash()
+ d.GetPropString(-1, "timers")
+ d.PushNumber(id)
+ d.DelProp(-2)
+ d.Pop2()
+}
+
+func (d *Context) putTimer(id float64) {
+ d.PushGlobalStash() // stash -> [ ..., timers: { <id>: { func: true } } ]
+ d.GetPropString(-1, "timers") // stash -> [ ..., timers: { <id>: { func: true } } }, { <id>: { func: true } ]
+ d.PushNumber(id)
+ d.GetProp(-2) // stash -> [ ..., timers: { <id>: { func: true } } }, { <id>: { func: true }, { func: true } ]
+ d.Replace(-3)
+ d.Pop()
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/utils.go b/vendor/gopkg.in/olebedev/go-duktape.v3/utils.go
new file mode 100644
index 000000000..86191239b
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/utils.go
@@ -0,0 +1,10 @@
+package duktape
+
+// Must returns existing *Context or throw panic.
+// It is highly recommended to use Must all the time.
+func (d *Context) Must() *Context {
+ if d.duk_context == nil {
+ panic("[duktape] Context does not exists!\nYou cannot call any contexts methods after `DestroyHeap()` was called.")
+ }
+ return d
+}
diff --git a/vendor/gopkg.in/olebedev/go-duktape.v3/wercker.yml b/vendor/gopkg.in/olebedev/go-duktape.v3/wercker.yml
new file mode 100644
index 000000000..41f3e37ec
--- /dev/null
+++ b/vendor/gopkg.in/olebedev/go-duktape.v3/wercker.yml
@@ -0,0 +1,14 @@
+box: golang
+build:
+ steps:
+ - setup-go-workspace
+ - script:
+ name: go get
+ code: |
+ cd $WERCKER_SOURCE_DIR
+ go version
+ go get gopkg.in/check.v1
+ - script:
+ name: go test
+ code: |
+ go test . -v
diff --git a/vendor/vendor.json b/vendor/vendor.json
index 26cc188ce..436022329 100644
--- a/vendor/vendor.json
+++ b/vendor/vendor.json
@@ -45,6 +45,12 @@
"revisionTime": "2017-02-15T19:58:14Z"
},
{
+ "checksumSHA1": "QC55lHNOv1+UAL2xtIHw17MJ8J8=",
+ "path": "github.com/StackExchange/wmi",
+ "revision": "5d049714c4a64225c3c79a7cf7d02f7fb5b96338",
+ "revisionTime": "2018-01-16T20:38:02Z"
+ },
+ {
"checksumSHA1": "USkefO0g1U9mr+8hagv3fpSkrxg=",
"path": "github.com/aristanetworks/goarista/monotime",
"revision": "ea17b1a17847fb6e4c0a91de0b674704693469b0",
@@ -87,6 +93,18 @@
"revisionTime": "2016-05-12T03:30:02Z"
},
{
+ "checksumSHA1": "Fc8BCxCoQ7ZmghDT6X1cASR10Ec=",
+ "path": "github.com/elastic/gosigar",
+ "revision": "a3814ce5008e612a0c6d027608b54e1d0d9a5613",
+ "revisionTime": "2018-01-22T22:25:45Z"
+ },
+ {
+ "checksumSHA1": "qDsgp2kAeI9nhj565HUScaUyjU4=",
+ "path": "github.com/elastic/gosigar/sys/windows",
+ "revision": "a3814ce5008e612a0c6d027608b54e1d0d9a5613",
+ "revisionTime": "2018-01-22T22:25:45Z"
+ },
+ {
"checksumSHA1": "7oFpbmDfGobwKsFLIf6wMUvVoKw=",
"path": "github.com/fatih/color",
"revision": "5ec5d9d3c2cf82e9688b34e9bc27a94d616a7193",
@@ -99,6 +117,18 @@
"revisionTime": "2017-01-17T22:23:42Z"
},
{
+ "checksumSHA1": "gxV/cPPLkByTdY8y172t7v4qcZA=",
+ "path": "github.com/go-ole/go-ole",
+ "revision": "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506",
+ "revisionTime": "2017-11-10T16:07:06Z"
+ },
+ {
+ "checksumSHA1": "PArleDBtadu2qO4hJwHR8a3IOTA=",
+ "path": "github.com/go-ole/go-ole/oleutil",
+ "revision": "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506",
+ "revisionTime": "2017-11-10T16:07:06Z"
+ },
+ {
"checksumSHA1": "KZ3QD2QgUS4RcoKiA3mn5pSlJxQ=",
"path": "github.com/go-stack/stack",
"revision": "54be5f394ed2c3e19dac9134a40a95ba5a017f7b",
@@ -262,6 +292,12 @@
"revisionTime": "2017-09-02T20:46:57Z"
},
{
+ "checksumSHA1": "xCv4GBFyw07vZkVtKF/XrUnkHRk=",
+ "path": "github.com/pkg/errors",
+ "revision": "e881fd58d78e04cf6d0de1217f8707c8cc2249bc",
+ "revisionTime": "2017-12-16T07:03:16Z"
+ },
+ {
"checksumSHA1": "LuFv4/jlrmFNnDb/5SCSEPAM9vU=",
"path": "github.com/pmezard/go-difflib/difflib",
"revision": "792786c7400a136282c1664665ae0a8db921c6c2",
@@ -286,10 +322,10 @@
"revisionTime": "2016-11-28T21:05:44Z"
},
{
- "checksumSHA1": "yOMpVYuaPAtsMIo9DvQP8WZqxQs=",
+ "checksumSHA1": "1ESHllhZOIBg7MnlGHUdhz047bI=",
"path": "github.com/rjeczalik/notify",
- "revision": "9d5aa0c3b735c3340018a4627446c3ea5a04a097",
- "revisionTime": "2017-01-28T20:05:44Z"
+ "revision": "27b537f07230b3f917421af6dcf044038dbe57e2",
+ "revisionTime": "2018-01-03T13:19:05Z"
},
{
"checksumSHA1": "5uqO4ITTDMklKi3uNaE/D9LQ5nM=",
@@ -358,10 +394,10 @@
"revisionTime": "2017-07-05T02:17:15Z"
},
{
- "checksumSHA1": "yHbyLpI/Meh0DGrmi8x6FrDxxUY=",
+ "checksumSHA1": "rpu5ZHjXlV13UKA7L1d5MTOyQwA=",
"path": "github.com/syndtr/goleveldb/leveldb",
- "revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199",
- "revisionTime": "2017-07-25T06:48:36Z"
+ "revision": "211f780988068502fe874c44dae530528ebd840f",
+ "revisionTime": "2018-01-28T14:04:16Z"
},
{
"checksumSHA1": "EKIow7XkgNdWvR/982ffIZxKG8Y=",
@@ -694,6 +730,12 @@
"revisionTime": "2016-06-21T03:49:01Z"
},
{
+ "checksumSHA1": "YvuEbc0a032zr+BTp/YbBQojiuY=",
+ "path": "gopkg.in/olebedev/go-duktape.v3",
+ "revision": "9af39127cb024b355a6a0221769f6ddfe3f542e7",
+ "revisionTime": "2017-12-20T12:19:14Z"
+ },
+ {
"checksumSHA1": "4BwmmgQUhWtizsR2soXND0nqZ1I=",
"path": "gopkg.in/sourcemap.v1",
"revision": "6e83acea0053641eff084973fee085f0c193c61a",
diff --git a/whisper/whisperv2/whisper.go b/whisper/whisperv2/whisper.go
index 61c36918d..e111a3414 100644
--- a/whisper/whisperv2/whisper.go
+++ b/whisper/whisperv2/whisper.go
@@ -262,7 +262,7 @@ func (self *Whisper) add(envelope *Envelope) error {
// Insert the message into the tracked pool
hash := envelope.Hash()
if _, ok := self.messages[hash]; ok {
- log.Trace(fmt.Sprintf("whisper envelope already cached: %x\n", envelope))
+ log.Trace(fmt.Sprintf("whisper envelope already cached: %x\n", hash))
return nil
}
self.messages[hash] = envelope
@@ -277,7 +277,7 @@ func (self *Whisper) add(envelope *Envelope) error {
// Notify the local node of a message arrival
go self.postEvent(envelope)
}
- log.Trace(fmt.Sprintf("cached whisper envelope %x\n", envelope))
+ log.Trace(fmt.Sprintf("cached whisper envelope %x\n", hash))
return nil
}
diff --git a/whisper/whisperv5/api.go b/whisper/whisperv5/api.go
index 96c4b0e6c..b4494d0d6 100644
--- a/whisper/whisperv5/api.go
+++ b/whisper/whisperv5/api.go
@@ -562,7 +562,7 @@ func (api *PublicWhisperAPI) NewMessageFilter(req Criteria) (string, error) {
}
if len(req.Topics) > 0 {
- topics = make([][]byte, 1)
+ topics = make([][]byte, 0, len(req.Topics))
for _, topic := range req.Topics {
topics = append(topics, topic[:])
}
diff --git a/whisper/whisperv5/filter.go b/whisper/whisperv5/filter.go
index b5e893e0f..3190334eb 100644
--- a/whisper/whisperv5/filter.go
+++ b/whisper/whisperv5/filter.go
@@ -216,8 +216,12 @@ func (f *Filter) MatchTopic(topic TopicType) bool {
}
func matchSingleTopic(topic TopicType, bt []byte) bool {
- if len(bt) > 4 {
- bt = bt[:4]
+ if len(bt) > TopicLength {
+ bt = bt[:TopicLength]
+ }
+
+ if len(bt) < TopicLength {
+ return false
}
for j, b := range bt {
diff --git a/whisper/whisperv5/filter_test.go b/whisper/whisperv5/filter_test.go
index bd35e7f20..01034a351 100644
--- a/whisper/whisperv5/filter_test.go
+++ b/whisper/whisperv5/filter_test.go
@@ -88,7 +88,7 @@ func generateTestCases(t *testing.T, SizeTestFilters int) []FilterTestCase {
for i := 0; i < SizeTestFilters; i++ {
f, _ := generateFilter(t, true)
cases[i].f = f
- cases[i].alive = (mrand.Int()&int(1) == 0)
+ cases[i].alive = mrand.Int()&int(1) == 0
}
return cases
}
@@ -122,7 +122,7 @@ func TestInstallFilters(t *testing.T) {
for i, testCase := range tst {
fil := filters.Get(testCase.id)
- exist := (fil != nil)
+ exist := fil != nil
if exist != testCase.alive {
t.Fatalf("seed %d: failed alive: %d, %v, %v", seed, i, exist, testCase.alive)
}
@@ -776,6 +776,7 @@ func TestWatchers(t *testing.T) {
func TestVariableTopics(t *testing.T) {
InitSingleTest()
+ const lastTopicByte = 3
var match bool
params, err := generateMessageParams()
if err != nil {
@@ -796,19 +797,52 @@ func TestVariableTopics(t *testing.T) {
}
for i := 0; i < 4; i++ {
- arr := make([]byte, i+1, 4)
- copy(arr, env.Topic[:i+1])
-
- f.Topics[4] = arr
+ env.Topic = BytesToTopic(f.Topics[i])
match = f.MatchEnvelope(env)
if !match {
t.Fatalf("failed MatchEnvelope symmetric with seed %d, step %d.", seed, i)
}
- f.Topics[4][i]++
+ f.Topics[i][lastTopicByte]++
match = f.MatchEnvelope(env)
if match {
t.Fatalf("MatchEnvelope symmetric with seed %d, step %d: false positive.", seed, i)
}
}
}
+
+func TestMatchSingleTopic_ReturnTrue(t *testing.T) {
+ bt := []byte("test")
+ topic := BytesToTopic(bt)
+
+ if !matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
+
+func TestMatchSingleTopic_WithTail_ReturnTrue(t *testing.T) {
+ bt := []byte("test with tail")
+ topic := BytesToTopic([]byte("test"))
+
+ if !matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
+
+func TestMatchSingleTopic_NotEquals_ReturnFalse(t *testing.T) {
+ bt := []byte("tes")
+ topic := BytesToTopic(bt)
+
+ if matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
+
+func TestMatchSingleTopic_InsufficientLength_ReturnFalse(t *testing.T) {
+ bt := []byte("test")
+ topic := BytesToTopic([]byte("not_equal"))
+
+ if matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
diff --git a/whisper/whisperv5/gen_criteria_json.go b/whisper/whisperv5/gen_criteria_json.go
index df0de85df..1c0e389ad 100644
--- a/whisper/whisperv5/gen_criteria_json.go
+++ b/whisper/whisperv5/gen_criteria_json.go
@@ -31,12 +31,12 @@ func (c Criteria) MarshalJSON() ([]byte, error) {
func (c *Criteria) UnmarshalJSON(input []byte) error {
type Criteria struct {
- SymKeyID *string `json:"symKeyID"`
- PrivateKeyID *string `json:"privateKeyID"`
- Sig hexutil.Bytes `json:"sig"`
- MinPow *float64 `json:"minPow"`
- Topics []TopicType `json:"topics"`
- AllowP2P *bool `json:"allowP2P"`
+ SymKeyID *string `json:"symKeyID"`
+ PrivateKeyID *string `json:"privateKeyID"`
+ Sig *hexutil.Bytes `json:"sig"`
+ MinPow *float64 `json:"minPow"`
+ Topics []TopicType `json:"topics"`
+ AllowP2P *bool `json:"allowP2P"`
}
var dec Criteria
if err := json.Unmarshal(input, &dec); err != nil {
@@ -49,7 +49,7 @@ func (c *Criteria) UnmarshalJSON(input []byte) error {
c.PrivateKeyID = *dec.PrivateKeyID
}
if dec.Sig != nil {
- c.Sig = dec.Sig
+ c.Sig = *dec.Sig
}
if dec.MinPow != nil {
c.MinPow = *dec.MinPow
diff --git a/whisper/whisperv5/gen_message_json.go b/whisper/whisperv5/gen_message_json.go
index 185557331..b4c4274d0 100644
--- a/whisper/whisperv5/gen_message_json.go
+++ b/whisper/whisperv5/gen_message_json.go
@@ -37,22 +37,22 @@ func (m Message) MarshalJSON() ([]byte, error) {
func (m *Message) UnmarshalJSON(input []byte) error {
type Message struct {
- Sig hexutil.Bytes `json:"sig,omitempty"`
- TTL *uint32 `json:"ttl"`
- Timestamp *uint32 `json:"timestamp"`
- Topic *TopicType `json:"topic"`
- Payload hexutil.Bytes `json:"payload"`
- Padding hexutil.Bytes `json:"padding"`
- PoW *float64 `json:"pow"`
- Hash hexutil.Bytes `json:"hash"`
- Dst hexutil.Bytes `json:"recipientPublicKey,omitempty"`
+ Sig *hexutil.Bytes `json:"sig,omitempty"`
+ TTL *uint32 `json:"ttl"`
+ Timestamp *uint32 `json:"timestamp"`
+ Topic *TopicType `json:"topic"`
+ Payload *hexutil.Bytes `json:"payload"`
+ Padding *hexutil.Bytes `json:"padding"`
+ PoW *float64 `json:"pow"`
+ Hash *hexutil.Bytes `json:"hash"`
+ Dst *hexutil.Bytes `json:"recipientPublicKey,omitempty"`
}
var dec Message
if err := json.Unmarshal(input, &dec); err != nil {
return err
}
if dec.Sig != nil {
- m.Sig = dec.Sig
+ m.Sig = *dec.Sig
}
if dec.TTL != nil {
m.TTL = *dec.TTL
@@ -64,19 +64,19 @@ func (m *Message) UnmarshalJSON(input []byte) error {
m.Topic = *dec.Topic
}
if dec.Payload != nil {
- m.Payload = dec.Payload
+ m.Payload = *dec.Payload
}
if dec.Padding != nil {
- m.Padding = dec.Padding
+ m.Padding = *dec.Padding
}
if dec.PoW != nil {
m.PoW = *dec.PoW
}
if dec.Hash != nil {
- m.Hash = dec.Hash
+ m.Hash = *dec.Hash
}
if dec.Dst != nil {
- m.Dst = dec.Dst
+ m.Dst = *dec.Dst
}
return nil
}
diff --git a/whisper/whisperv5/gen_newmessage_json.go b/whisper/whisperv5/gen_newmessage_json.go
index d0a47185e..97ffb64ad 100644
--- a/whisper/whisperv5/gen_newmessage_json.go
+++ b/whisper/whisperv5/gen_newmessage_json.go
@@ -39,16 +39,16 @@ func (n NewMessage) MarshalJSON() ([]byte, error) {
func (n *NewMessage) UnmarshalJSON(input []byte) error {
type NewMessage struct {
- SymKeyID *string `json:"symKeyID"`
- PublicKey hexutil.Bytes `json:"pubKey"`
- Sig *string `json:"sig"`
- TTL *uint32 `json:"ttl"`
- Topic *TopicType `json:"topic"`
- Payload hexutil.Bytes `json:"payload"`
- Padding hexutil.Bytes `json:"padding"`
- PowTime *uint32 `json:"powTime"`
- PowTarget *float64 `json:"powTarget"`
- TargetPeer *string `json:"targetPeer"`
+ SymKeyID *string `json:"symKeyID"`
+ PublicKey *hexutil.Bytes `json:"pubKey"`
+ Sig *string `json:"sig"`
+ TTL *uint32 `json:"ttl"`
+ Topic *TopicType `json:"topic"`
+ Payload *hexutil.Bytes `json:"payload"`
+ Padding *hexutil.Bytes `json:"padding"`
+ PowTime *uint32 `json:"powTime"`
+ PowTarget *float64 `json:"powTarget"`
+ TargetPeer *string `json:"targetPeer"`
}
var dec NewMessage
if err := json.Unmarshal(input, &dec); err != nil {
@@ -58,7 +58,7 @@ func (n *NewMessage) UnmarshalJSON(input []byte) error {
n.SymKeyID = *dec.SymKeyID
}
if dec.PublicKey != nil {
- n.PublicKey = dec.PublicKey
+ n.PublicKey = *dec.PublicKey
}
if dec.Sig != nil {
n.Sig = *dec.Sig
@@ -70,10 +70,10 @@ func (n *NewMessage) UnmarshalJSON(input []byte) error {
n.Topic = *dec.Topic
}
if dec.Payload != nil {
- n.Payload = dec.Payload
+ n.Payload = *dec.Payload
}
if dec.Padding != nil {
- n.Padding = dec.Padding
+ n.Padding = *dec.Padding
}
if dec.PowTime != nil {
n.PowTime = *dec.PowTime
diff --git a/whisper/whisperv6/api.go b/whisper/whisperv6/api.go
index 3dddb6953..8ae2882e1 100644
--- a/whisper/whisperv6/api.go
+++ b/whisper/whisperv6/api.go
@@ -36,6 +36,7 @@ const (
filterTimeout = 300 // filters are considered timeout out after filterTimeout seconds
)
+// List of errors
var (
ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key")
ErrInvalidSymmetricKey = errors.New("invalid symmetric key")
@@ -116,12 +117,17 @@ func (api *PublicWhisperAPI) SetMaxMessageSize(ctx context.Context, size uint32)
return true, api.w.SetMaxMessageSize(size)
}
-// SetMinPow sets the minimum PoW for a message before it is accepted.
+// SetMinPoW sets the minimum PoW, and notifies the peers.
func (api *PublicWhisperAPI) SetMinPoW(ctx context.Context, pow float64) (bool, error) {
return true, api.w.SetMinimumPoW(pow)
}
-// MarkTrustedPeer marks a peer trusted. , which will allow it to send historic (expired) messages.
+// SetBloomFilter sets the new value of bloom filter, and notifies the peers.
+func (api *PublicWhisperAPI) SetBloomFilter(ctx context.Context, bloom hexutil.Bytes) (bool, error) {
+ return true, api.w.SetBloomFilter(bloom)
+}
+
+// MarkTrustedPeer marks a peer trusted, which will allow it to send historic (expired) messages.
// Note: This function is not adding new nodes, the node needs to exists as a peer.
func (api *PublicWhisperAPI) MarkTrustedPeer(ctx context.Context, enode string) (bool, error) {
n, err := discover.ParseNode(enode)
@@ -169,7 +175,7 @@ func (api *PublicWhisperAPI) GetPublicKey(ctx context.Context, id string) (hexut
return crypto.FromECDSAPub(&key.PublicKey), nil
}
-// GetPublicKey returns the private key associated with the given key. The key is the hex
+// GetPrivateKey returns the private key associated with the given key. The key is the hex
// encoded representation of a key in the form specified in section 4.3.6 of ANSI X9.62.
func (api *PublicWhisperAPI) GetPrivateKey(ctx context.Context, id string) (hexutil.Bytes, error) {
key, err := api.w.GetPrivateKey(id)
@@ -272,7 +278,7 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
if params.KeySym, err = api.w.GetSymKey(req.SymKeyID); err != nil {
return false, err
}
- if !validateSymmetricKey(params.KeySym) {
+ if !validateDataIntegrity(params.KeySym, aesKeyLength) {
return false, ErrInvalidSymmetricKey
}
}
@@ -286,7 +292,7 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
}
// encrypt and sent message
- whisperMsg, err := NewSentMessage(params)
+ whisperMsg, err := newSentMessage(params)
if err != nil {
return false, err
}
@@ -378,7 +384,7 @@ func (api *PublicWhisperAPI) Messages(ctx context.Context, crit Criteria) (*rpc.
if err != nil {
return nil, err
}
- if !validateSymmetricKey(key) {
+ if !validateDataIntegrity(key, aesKeyLength) {
return nil, ErrInvalidSymmetricKey
}
filter.KeySym = key
@@ -550,7 +556,7 @@ func (api *PublicWhisperAPI) NewMessageFilter(req Criteria) (string, error) {
if keySym, err = api.w.GetSymKey(req.SymKeyID); err != nil {
return "", err
}
- if !validateSymmetricKey(keySym) {
+ if !validateDataIntegrity(keySym, aesKeyLength) {
return "", ErrInvalidSymmetricKey
}
}
@@ -562,7 +568,7 @@ func (api *PublicWhisperAPI) NewMessageFilter(req Criteria) (string, error) {
}
if len(req.Topics) > 0 {
- topics = make([][]byte, 1)
+ topics = make([][]byte, 0, len(req.Topics))
for _, topic := range req.Topics {
topics = append(topics, topic[:])
}
diff --git a/whisper/whisperv6/benchmarks_test.go b/whisper/whisperv6/benchmarks_test.go
index 0473179da..52c8f95ea 100644
--- a/whisper/whisperv6/benchmarks_test.go
+++ b/whisper/whisperv6/benchmarks_test.go
@@ -39,7 +39,7 @@ func BenchmarkEncryptionSym(b *testing.B) {
}
for i := 0; i < b.N; i++ {
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
_, err := msg.Wrap(params)
if err != nil {
b.Errorf("failed Wrap with seed %d: %s.", seed, err)
@@ -64,7 +64,7 @@ func BenchmarkEncryptionAsym(b *testing.B) {
params.Dst = &key.PublicKey
for i := 0; i < b.N; i++ {
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
_, err := msg.Wrap(params)
if err != nil {
b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
@@ -79,7 +79,7 @@ func BenchmarkDecryptionSymValid(b *testing.B) {
if err != nil {
b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
env, err := msg.Wrap(params)
if err != nil {
b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
@@ -101,7 +101,7 @@ func BenchmarkDecryptionSymInvalid(b *testing.B) {
if err != nil {
b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
env, err := msg.Wrap(params)
if err != nil {
b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
@@ -130,7 +130,7 @@ func BenchmarkDecryptionAsymValid(b *testing.B) {
f := Filter{KeyAsym: key}
params.KeySym = nil
params.Dst = &key.PublicKey
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
env, err := msg.Wrap(params)
if err != nil {
b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
@@ -157,7 +157,7 @@ func BenchmarkDecryptionAsymInvalid(b *testing.B) {
}
params.KeySym = nil
params.Dst = &key.PublicKey
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
env, err := msg.Wrap(params)
if err != nil {
b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
@@ -199,7 +199,7 @@ func BenchmarkPoW(b *testing.B) {
for i := 0; i < b.N; i++ {
increment(params.Payload)
- msg, _ := NewSentMessage(params)
+ msg, _ := newSentMessage(params)
_, err := msg.Wrap(params)
if err != nil {
b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
diff --git a/whisper/whisperv6/config.go b/whisper/whisperv6/config.go
index d7f817aa2..61419de00 100644
--- a/whisper/whisperv6/config.go
+++ b/whisper/whisperv6/config.go
@@ -16,11 +16,13 @@
package whisperv6
+// Config represents the configuration state of a whisper node.
type Config struct {
MaxMessageSize uint32 `toml:",omitempty"`
MinimumAcceptedPOW float64 `toml:",omitempty"`
}
+// DefaultConfig represents (shocker!) the default configuration.
var DefaultConfig = Config{
MaxMessageSize: DefaultMaxMessageSize,
MinimumAcceptedPOW: DefaultMinimumPoW,
diff --git a/whisper/whisperv6/doc.go b/whisper/whisperv6/doc.go
index 64925ba48..d5d7fed60 100644
--- a/whisper/whisperv6/doc.go
+++ b/whisper/whisperv6/doc.go
@@ -27,6 +27,9 @@ Whisper is a pure identity-based messaging system. Whisper provides a low-level
or prejudiced by the low-level hardware attributes and characteristics,
particularly the notion of singular endpoints.
*/
+
+// Contains the Whisper protocol constant definitions
+
package whisperv6
import (
@@ -34,41 +37,46 @@ import (
"time"
)
+// Whisper protocol parameters
const (
- EnvelopeVersion = uint64(0)
- ProtocolVersion = uint64(6)
- ProtocolVersionStr = "6.0"
- ProtocolName = "shh"
-
- statusCode = 0 // used by whisper protocol
- messagesCode = 1 // normal whisper message
- p2pCode = 2 // peer-to-peer message (to be consumed by the peer, but not forwarded any further)
- p2pRequestCode = 3 // peer-to-peer message, used by Dapp protocol
+ ProtocolVersion = uint64(6) // Protocol version number
+ ProtocolVersionStr = "6.0" // The same, as a string
+ ProtocolName = "shh" // Nickname of the protocol in geth
+
+ // whisper protocol message codes, according to EIP-627
+ statusCode = 0 // used by whisper protocol
+ messagesCode = 1 // normal whisper message
+ powRequirementCode = 2 // PoW requirement
+ bloomFilterExCode = 3 // bloom filter exchange
+ p2pRequestCode = 126 // peer-to-peer message, used by Dapp protocol
+ p2pMessageCode = 127 // peer-to-peer message (to be consumed by the peer, but not forwarded any further)
NumberOfMessageCodes = 128
- paddingMask = byte(3)
+ SizeMask = byte(3) // mask used to extract the size of payload size field from the flags
signatureFlag = byte(4)
- TopicLength = 4
- signatureLength = 65
- aesKeyLength = 32
- AESNonceLength = 12
- keyIdSize = 32
+ TopicLength = 4 // in bytes
+ signatureLength = 65 // in bytes
+ aesKeyLength = 32 // in bytes
+ aesNonceLength = 12 // in bytes; for more info please see cipher.gcmStandardNonceSize & aesgcm.NonceSize()
+ keyIDSize = 32 // in bytes
+ bloomFilterSize = 64 // in bytes
+ flagsLength = 1
+
+ EnvelopeHeaderLength = 20
MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message.
DefaultMaxMessageSize = uint32(1024 * 1024)
DefaultMinimumPoW = 0.2
- padSizeLimit = 256 // just an arbitrary number, could be changed without breaking the protocol (must not exceed 2^24)
+ padSizeLimit = 256 // just an arbitrary number, could be changed without breaking the protocol
messageQueueLimit = 1024
expirationCycle = time.Second
transmissionCycle = 300 * time.Millisecond
- DefaultTTL = 50 // seconds
- SynchAllowance = 10 // seconds
-
- EnvelopeHeaderLength = 20
+ DefaultTTL = 50 // seconds
+ DefaultSyncAllowance = 10 // seconds
)
type unknownVersionError uint64
diff --git a/whisper/whisperv6/envelope.go b/whisper/whisperv6/envelope.go
index 676df669b..881945e9a 100644
--- a/whisper/whisperv6/envelope.go
+++ b/whisper/whisperv6/envelope.go
@@ -42,9 +42,11 @@ type Envelope struct {
Data []byte
Nonce uint64
- pow float64 // Message-specific PoW as described in the Whisper specification.
- hash common.Hash // Cached hash of the envelope to avoid rehashing every time.
- // Don't access hash directly, use Hash() function instead.
+ pow float64 // Message-specific PoW as described in the Whisper specification.
+
+ // the following variables should not be accessed directly, use the corresponding function instead: Hash(), Bloom()
+ hash common.Hash // Cached hash of the envelope to avoid rehashing every time.
+ bloom []byte
}
// size returns the size of envelope as it is sent (i.e. public fields only)
@@ -113,6 +115,8 @@ func (e *Envelope) Seal(options *MessageParams) error {
return nil
}
+// PoW computes (if necessary) and returns the proof of work target
+// of the envelope.
func (e *Envelope) PoW() float64 {
if e.pow == 0 {
e.calculatePoW(0)
@@ -196,8 +200,7 @@ func (e *Envelope) OpenSymmetric(key []byte) (msg *ReceivedMessage, err error) {
// Open tries to decrypt an envelope, and populates the message fields in case of success.
func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
- // The API interface forbids filters doing both symmetric and
- // asymmetric encryption.
+ // The API interface forbids filters doing both symmetric and asymmetric encryption.
if watcher.expectsAsymmetricEncryption() && watcher.expectsSymmetricEncryption() {
return nil
}
@@ -215,7 +218,7 @@ func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
}
if msg != nil {
- ok := msg.Validate()
+ ok := msg.ValidateAndParse()
if !ok {
return nil
}
@@ -227,3 +230,30 @@ func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
}
return msg
}
+
+// Bloom maps 4-bytes Topic into 64-byte bloom filter with 3 bits set (at most).
+func (e *Envelope) Bloom() []byte {
+ if e.bloom == nil {
+ e.bloom = TopicToBloom(e.Topic)
+ }
+ return e.bloom
+}
+
+// TopicToBloom converts the topic (4 bytes) to the bloom filter (64 bytes)
+func TopicToBloom(topic TopicType) []byte {
+ b := make([]byte, bloomFilterSize)
+ var index [3]int
+ for j := 0; j < 3; j++ {
+ index[j] = int(topic[j])
+ if (topic[3] & (1 << uint(j))) != 0 {
+ index[j] += 256
+ }
+ }
+
+ for j := 0; j < 3; j++ {
+ byteIndex := index[j] / 8
+ bitIndex := index[j] % 8
+ b[byteIndex] = (1 << uint(bitIndex))
+ }
+ return b
+}
diff --git a/whisper/whisperv6/envelope_test.go b/whisper/whisperv6/envelope_test.go
index 410b250a3..1ee1bec41 100644
--- a/whisper/whisperv6/envelope_test.go
+++ b/whisper/whisperv6/envelope_test.go
@@ -45,7 +45,7 @@ func TestEnvelopeOpenAcceptsOnlyOneKeyTypeInFilter(t *testing.T) {
mrand.Read(params.Payload)
- msg, err := NewSentMessage(&params)
+ msg, err := newSentMessage(&params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
diff --git a/whisper/whisperv6/filter.go b/whisper/whisperv6/filter.go
index 2f52dd6b9..eb0c65fa3 100644
--- a/whisper/whisperv6/filter.go
+++ b/whisper/whisperv6/filter.go
@@ -26,6 +26,7 @@ import (
"github.com/ethereum/go-ethereum/log"
)
+// Filter represents a Whisper message filter
type Filter struct {
Src *ecdsa.PublicKey // Sender of the message
KeyAsym *ecdsa.PrivateKey // Private Key of recipient
@@ -39,12 +40,14 @@ type Filter struct {
mutex sync.RWMutex
}
+// Filters represents a collection of filters
type Filters struct {
watchers map[string]*Filter
whisper *Whisper
mutex sync.RWMutex
}
+// NewFilters returns a newly created filter collection
func NewFilters(w *Whisper) *Filters {
return &Filters{
watchers: make(map[string]*Filter),
@@ -52,6 +55,7 @@ func NewFilters(w *Whisper) *Filters {
}
}
+// Install will add a new filter to the filter collection
func (fs *Filters) Install(watcher *Filter) (string, error) {
if watcher.KeySym != nil && watcher.KeyAsym != nil {
return "", fmt.Errorf("filters must choose between symmetric and asymmetric keys")
@@ -81,6 +85,8 @@ func (fs *Filters) Install(watcher *Filter) (string, error) {
return id, err
}
+// Uninstall will remove a filter whose id has been specified from
+// the filter collection
func (fs *Filters) Uninstall(id string) bool {
fs.mutex.Lock()
defer fs.mutex.Unlock()
@@ -91,12 +97,15 @@ func (fs *Filters) Uninstall(id string) bool {
return false
}
+// Get returns a filter from the collection with a specific ID
func (fs *Filters) Get(id string) *Filter {
fs.mutex.RLock()
defer fs.mutex.RUnlock()
return fs.watchers[id]
}
+// NotifyWatchers notifies any filter that has declared interest
+// for the envelope's topic.
func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
var msg *ReceivedMessage
@@ -140,9 +149,9 @@ func (f *Filter) processEnvelope(env *Envelope) *ReceivedMessage {
msg := env.Open(f)
if msg != nil {
return msg
- } else {
- log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex())
}
+
+ log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex())
} else {
log.Trace("processing envelope: does not match", "hash", env.Hash().Hex())
}
@@ -157,6 +166,8 @@ func (f *Filter) expectsSymmetricEncryption() bool {
return f.KeySym != nil
}
+// Trigger adds a yet-unknown message to the filter's list of
+// received messages.
func (f *Filter) Trigger(msg *ReceivedMessage) {
f.mutex.Lock()
defer f.mutex.Unlock()
@@ -166,6 +177,8 @@ func (f *Filter) Trigger(msg *ReceivedMessage) {
}
}
+// Retrieve will return the list of all received messages associated
+// to a filter.
func (f *Filter) Retrieve() (all []*ReceivedMessage) {
f.mutex.Lock()
defer f.mutex.Unlock()
@@ -195,7 +208,7 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool {
return false
}
-// MatchEvelope checks if it's worth decrypting the message. If
+// MatchEnvelope checks if it's worth decrypting the message. If
// it returns `true`, client code is expected to attempt decrypting
// the message and subsequently call MatchMessage.
func (f *Filter) MatchEnvelope(envelope *Envelope) bool {
@@ -206,6 +219,7 @@ func (f *Filter) MatchEnvelope(envelope *Envelope) bool {
return f.MatchTopic(envelope.Topic)
}
+// MatchTopic checks that the filter captures a given topic.
func (f *Filter) MatchTopic(topic TopicType) bool {
if len(f.Topics) == 0 {
// any topic matches
@@ -221,8 +235,12 @@ func (f *Filter) MatchTopic(topic TopicType) bool {
}
func matchSingleTopic(topic TopicType, bt []byte) bool {
- if len(bt) > 4 {
- bt = bt[:4]
+ if len(bt) > TopicLength {
+ bt = bt[:TopicLength]
+ }
+
+ if len(bt) < TopicLength {
+ return false
}
for j, b := range bt {
@@ -233,6 +251,7 @@ func matchSingleTopic(topic TopicType, bt []byte) bool {
return true
}
+// IsPubKeyEqual checks that two public keys are equal
func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool {
if !ValidatePublicKey(a) {
return false
diff --git a/whisper/whisperv6/filter_test.go b/whisper/whisperv6/filter_test.go
index dd0de0f6e..fc7db7671 100644
--- a/whisper/whisperv6/filter_test.go
+++ b/whisper/whisperv6/filter_test.go
@@ -88,7 +88,7 @@ func generateTestCases(t *testing.T, SizeTestFilters int) []FilterTestCase {
for i := 0; i < SizeTestFilters; i++ {
f, _ := generateFilter(t, true)
cases[i].f = f
- cases[i].alive = (mrand.Int()&int(1) == 0)
+ cases[i].alive = mrand.Int()&int(1) == 0
}
return cases
}
@@ -109,7 +109,7 @@ func TestInstallFilters(t *testing.T) {
t.Fatalf("seed %d: failed to install filter: %s", seed, err)
}
tst[i].id = j
- if len(j) != keyIdSize*2 {
+ if len(j) != keyIDSize*2 {
t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j))
}
}
@@ -122,7 +122,7 @@ func TestInstallFilters(t *testing.T) {
for i, testCase := range tst {
fil := filters.Get(testCase.id)
- exist := (fil != nil)
+ exist := fil != nil
if exist != testCase.alive {
t.Fatalf("seed %d: failed alive: %d, %v, %v", seed, i, exist, testCase.alive)
}
@@ -199,7 +199,7 @@ func TestInstallIdenticalFilters(t *testing.T) {
filter1.Src = &params.Src.PublicKey
filter2.Src = &params.Src.PublicKey
- sentMessage, err := NewSentMessage(params)
+ sentMessage, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -306,7 +306,7 @@ func TestMatchEnvelope(t *testing.T) {
params.Topic[0] = 0xFF // ensure mismatch
// mismatch with pseudo-random data
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -327,7 +327,7 @@ func TestMatchEnvelope(t *testing.T) {
i := mrand.Int() % 4
fsym.Topics[i] = params.Topic[:]
fasym.Topics[i] = params.Topic[:]
- msg, err = NewSentMessage(params)
+ msg, err = newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -372,7 +372,7 @@ func TestMatchEnvelope(t *testing.T) {
}
params.KeySym = nil
params.Dst = &key.PublicKey
- msg, err = NewSentMessage(params)
+ msg, err = newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -453,7 +453,7 @@ func TestMatchMessageSym(t *testing.T) {
params.KeySym = f.KeySym
params.Topic = BytesToTopic(f.Topics[index])
- sentMessage, err := NewSentMessage(params)
+ sentMessage, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -546,7 +546,7 @@ func TestMatchMessageAsym(t *testing.T) {
keySymOrig := params.KeySym
params.KeySym = nil
- sentMessage, err := NewSentMessage(params)
+ sentMessage, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -630,7 +630,7 @@ func generateCompatibeEnvelope(t *testing.T, f *Filter) *Envelope {
params.KeySym = f.KeySym
params.Topic = BytesToTopic(f.Topics[2])
- sentMessage, err := NewSentMessage(params)
+ sentMessage, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -800,12 +800,13 @@ func TestWatchers(t *testing.T) {
func TestVariableTopics(t *testing.T) {
InitSingleTest()
+ const lastTopicByte = 3
var match bool
params, err := generateMessageParams()
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -820,19 +821,52 @@ func TestVariableTopics(t *testing.T) {
}
for i := 0; i < 4; i++ {
- arr := make([]byte, i+1, 4)
- copy(arr, env.Topic[:i+1])
-
- f.Topics[4] = arr
+ env.Topic = BytesToTopic(f.Topics[i])
match = f.MatchEnvelope(env)
if !match {
t.Fatalf("failed MatchEnvelope symmetric with seed %d, step %d.", seed, i)
}
- f.Topics[4][i]++
+ f.Topics[i][lastTopicByte]++
match = f.MatchEnvelope(env)
if match {
t.Fatalf("MatchEnvelope symmetric with seed %d, step %d: false positive.", seed, i)
}
}
}
+
+func TestMatchSingleTopic_ReturnTrue(t *testing.T) {
+ bt := []byte("test")
+ topic := BytesToTopic(bt)
+
+ if !matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
+
+func TestMatchSingleTopic_WithTail_ReturnTrue(t *testing.T) {
+ bt := []byte("test with tail")
+ topic := BytesToTopic([]byte("test"))
+
+ if !matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
+
+func TestMatchSingleTopic_NotEquals_ReturnFalse(t *testing.T) {
+ bt := []byte("tes")
+ topic := BytesToTopic(bt)
+
+ if matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
+
+func TestMatchSingleTopic_InsufficientLength_ReturnFalse(t *testing.T) {
+ bt := []byte("test")
+ topic := BytesToTopic([]byte("not_equal"))
+
+ if matchSingleTopic(topic, bt) {
+ t.FailNow()
+ }
+}
diff --git a/whisper/whisperv6/gen_criteria_json.go b/whisper/whisperv6/gen_criteria_json.go
index 52a4d3cb6..1a428d6df 100644
--- a/whisper/whisperv6/gen_criteria_json.go
+++ b/whisper/whisperv6/gen_criteria_json.go
@@ -10,6 +10,7 @@ import (
var _ = (*criteriaOverride)(nil)
+// MarshalJSON marshals type Criteria to a json string
func (c Criteria) MarshalJSON() ([]byte, error) {
type Criteria struct {
SymKeyID string `json:"symKeyID"`
@@ -29,14 +30,15 @@ func (c Criteria) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc)
}
+// UnmarshalJSON unmarshals type Criteria to a json string
func (c *Criteria) UnmarshalJSON(input []byte) error {
type Criteria struct {
- SymKeyID *string `json:"symKeyID"`
- PrivateKeyID *string `json:"privateKeyID"`
- Sig hexutil.Bytes `json:"sig"`
- MinPow *float64 `json:"minPow"`
- Topics []TopicType `json:"topics"`
- AllowP2P *bool `json:"allowP2P"`
+ SymKeyID *string `json:"symKeyID"`
+ PrivateKeyID *string `json:"privateKeyID"`
+ Sig *hexutil.Bytes `json:"sig"`
+ MinPow *float64 `json:"minPow"`
+ Topics []TopicType `json:"topics"`
+ AllowP2P *bool `json:"allowP2P"`
}
var dec Criteria
if err := json.Unmarshal(input, &dec); err != nil {
@@ -49,7 +51,7 @@ func (c *Criteria) UnmarshalJSON(input []byte) error {
c.PrivateKeyID = *dec.PrivateKeyID
}
if dec.Sig != nil {
- c.Sig = dec.Sig
+ c.Sig = *dec.Sig
}
if dec.MinPow != nil {
c.MinPow = *dec.MinPow
diff --git a/whisper/whisperv6/gen_message_json.go b/whisper/whisperv6/gen_message_json.go
index 27b46752b..6218f5df6 100644
--- a/whisper/whisperv6/gen_message_json.go
+++ b/whisper/whisperv6/gen_message_json.go
@@ -10,6 +10,7 @@ import (
var _ = (*messageOverride)(nil)
+// MarshalJSON marshals type Message to a json string
func (m Message) MarshalJSON() ([]byte, error) {
type Message struct {
Sig hexutil.Bytes `json:"sig,omitempty"`
@@ -35,24 +36,25 @@ func (m Message) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc)
}
+// UnmarshalJSON unmarshals type Message to a json string
func (m *Message) UnmarshalJSON(input []byte) error {
type Message struct {
- Sig hexutil.Bytes `json:"sig,omitempty"`
- TTL *uint32 `json:"ttl"`
- Timestamp *uint32 `json:"timestamp"`
- Topic *TopicType `json:"topic"`
- Payload hexutil.Bytes `json:"payload"`
- Padding hexutil.Bytes `json:"padding"`
- PoW *float64 `json:"pow"`
- Hash hexutil.Bytes `json:"hash"`
- Dst hexutil.Bytes `json:"recipientPublicKey,omitempty"`
+ Sig *hexutil.Bytes `json:"sig,omitempty"`
+ TTL *uint32 `json:"ttl"`
+ Timestamp *uint32 `json:"timestamp"`
+ Topic *TopicType `json:"topic"`
+ Payload *hexutil.Bytes `json:"payload"`
+ Padding *hexutil.Bytes `json:"padding"`
+ PoW *float64 `json:"pow"`
+ Hash *hexutil.Bytes `json:"hash"`
+ Dst *hexutil.Bytes `json:"recipientPublicKey,omitempty"`
}
var dec Message
if err := json.Unmarshal(input, &dec); err != nil {
return err
}
if dec.Sig != nil {
- m.Sig = dec.Sig
+ m.Sig = *dec.Sig
}
if dec.TTL != nil {
m.TTL = *dec.TTL
@@ -64,19 +66,19 @@ func (m *Message) UnmarshalJSON(input []byte) error {
m.Topic = *dec.Topic
}
if dec.Payload != nil {
- m.Payload = dec.Payload
+ m.Payload = *dec.Payload
}
if dec.Padding != nil {
- m.Padding = dec.Padding
+ m.Padding = *dec.Padding
}
if dec.PoW != nil {
m.PoW = *dec.PoW
}
if dec.Hash != nil {
- m.Hash = dec.Hash
+ m.Hash = *dec.Hash
}
if dec.Dst != nil {
- m.Dst = dec.Dst
+ m.Dst = *dec.Dst
}
return nil
}
diff --git a/whisper/whisperv6/gen_newmessage_json.go b/whisper/whisperv6/gen_newmessage_json.go
index d16011a57..75a1279ae 100644
--- a/whisper/whisperv6/gen_newmessage_json.go
+++ b/whisper/whisperv6/gen_newmessage_json.go
@@ -10,6 +10,7 @@ import (
var _ = (*newMessageOverride)(nil)
+// MarshalJSON marshals type NewMessage to a json string
func (n NewMessage) MarshalJSON() ([]byte, error) {
type NewMessage struct {
SymKeyID string `json:"symKeyID"`
@@ -37,18 +38,19 @@ func (n NewMessage) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc)
}
+// UnmarshalJSON unmarshals type NewMessage to a json string
func (n *NewMessage) UnmarshalJSON(input []byte) error {
type NewMessage struct {
- SymKeyID *string `json:"symKeyID"`
- PublicKey hexutil.Bytes `json:"pubKey"`
- Sig *string `json:"sig"`
- TTL *uint32 `json:"ttl"`
- Topic *TopicType `json:"topic"`
- Payload hexutil.Bytes `json:"payload"`
- Padding hexutil.Bytes `json:"padding"`
- PowTime *uint32 `json:"powTime"`
- PowTarget *float64 `json:"powTarget"`
- TargetPeer *string `json:"targetPeer"`
+ SymKeyID *string `json:"symKeyID"`
+ PublicKey *hexutil.Bytes `json:"pubKey"`
+ Sig *string `json:"sig"`
+ TTL *uint32 `json:"ttl"`
+ Topic *TopicType `json:"topic"`
+ Payload *hexutil.Bytes `json:"payload"`
+ Padding *hexutil.Bytes `json:"padding"`
+ PowTime *uint32 `json:"powTime"`
+ PowTarget *float64 `json:"powTarget"`
+ TargetPeer *string `json:"targetPeer"`
}
var dec NewMessage
if err := json.Unmarshal(input, &dec); err != nil {
@@ -58,7 +60,7 @@ func (n *NewMessage) UnmarshalJSON(input []byte) error {
n.SymKeyID = *dec.SymKeyID
}
if dec.PublicKey != nil {
- n.PublicKey = dec.PublicKey
+ n.PublicKey = *dec.PublicKey
}
if dec.Sig != nil {
n.Sig = *dec.Sig
@@ -70,10 +72,10 @@ func (n *NewMessage) UnmarshalJSON(input []byte) error {
n.Topic = *dec.Topic
}
if dec.Payload != nil {
- n.Payload = dec.Payload
+ n.Payload = *dec.Payload
}
if dec.Padding != nil {
- n.Padding = dec.Padding
+ n.Padding = *dec.Padding
}
if dec.PowTime != nil {
n.PowTime = *dec.PowTime
diff --git a/whisper/whisperv6/message.go b/whisper/whisperv6/message.go
index f8df50336..7def35f14 100644
--- a/whisper/whisperv6/message.go
+++ b/whisper/whisperv6/message.go
@@ -25,6 +25,7 @@ import (
crand "crypto/rand"
"encoding/binary"
"errors"
+ mrand "math/rand"
"strconv"
"github.com/ethereum/go-ethereum/common"
@@ -33,7 +34,8 @@ import (
"github.com/ethereum/go-ethereum/log"
)
-// Options specifies the exact way a message should be wrapped into an Envelope.
+// MessageParams specifies the exact way a message should be wrapped
+// into an Envelope.
type MessageParams struct {
TTL uint32
Src *ecdsa.PrivateKey
@@ -54,7 +56,7 @@ type sentMessage struct {
}
// ReceivedMessage represents a data packet to be received through the
-// Whisper protocol.
+// Whisper protocol and successfully decrypted.
type ReceivedMessage struct {
Raw []byte
@@ -70,7 +72,7 @@ type ReceivedMessage struct {
Dst *ecdsa.PublicKey // Message recipient (identity used to decode the message)
Topic TopicType
- SymKeyHash common.Hash // The Keccak256Hash of the key, associated with the Topic
+ SymKeyHash common.Hash // The Keccak256Hash of the key
EnvelopeHash common.Hash // Message envelope hash to act as a unique id
}
@@ -86,83 +88,62 @@ func (msg *ReceivedMessage) isAsymmetricEncryption() bool {
return msg.Dst != nil
}
-// NewMessage creates and initializes a non-signed, non-encrypted Whisper message.
-func NewSentMessage(params *MessageParams) (*sentMessage, error) {
+// NewSentMessage creates and initializes a non-signed, non-encrypted Whisper message.
+func newSentMessage(params *MessageParams) (*sentMessage, error) {
+ const payloadSizeFieldMaxSize = 4
msg := sentMessage{}
- msg.Raw = make([]byte, 1, len(params.Payload)+len(params.Padding)+signatureLength+padSizeLimit)
+ msg.Raw = make([]byte, 1,
+ flagsLength+payloadSizeFieldMaxSize+len(params.Payload)+len(params.Padding)+signatureLength+padSizeLimit)
msg.Raw[0] = 0 // set all the flags to zero
- err := msg.appendPadding(params)
- if err != nil {
- return nil, err
- }
+ msg.addPayloadSizeField(params.Payload)
msg.Raw = append(msg.Raw, params.Payload...)
- return &msg, nil
+ err := msg.appendPadding(params)
+ return &msg, err
}
-// getSizeOfLength returns the number of bytes necessary to encode the entire size padding (including these bytes)
-func getSizeOfLength(b []byte) (sz int, err error) {
- sz = intSize(len(b)) // first iteration
- sz = intSize(len(b) + sz) // second iteration
- if sz > 3 {
- err = errors.New("oversized padding parameter")
- }
- return sz, err
+// addPayloadSizeField appends the auxiliary field containing the size of payload
+func (msg *sentMessage) addPayloadSizeField(payload []byte) {
+ fieldSize := getSizeOfPayloadSizeField(payload)
+ field := make([]byte, 4)
+ binary.LittleEndian.PutUint32(field, uint32(len(payload)))
+ field = field[:fieldSize]
+ msg.Raw = append(msg.Raw, field...)
+ msg.Raw[0] |= byte(fieldSize)
}
-// sizeOfIntSize returns minimal number of bytes necessary to encode an integer value
-func intSize(i int) (s int) {
- for s = 1; i >= 256; s++ {
- i /= 256
+// getSizeOfPayloadSizeField returns the number of bytes necessary to encode the size of payload
+func getSizeOfPayloadSizeField(payload []byte) int {
+ s := 1
+ for i := len(payload); i >= 256; i /= 256 {
+ s++
}
return s
}
-// appendPadding appends the pseudorandom padding bytes and sets the padding flag.
-// The last byte contains the size of padding (thus, its size must not exceed 256).
+// appendPadding appends the padding specified in params.
+// If no padding is provided in params, then random padding is generated.
func (msg *sentMessage) appendPadding(params *MessageParams) error {
- rawSize := len(params.Payload) + 1
- if params.Src != nil {
- rawSize += signatureLength
+ if len(params.Padding) != 0 {
+ // padding data was provided by the Dapp, just use it as is
+ msg.Raw = append(msg.Raw, params.Padding...)
+ return nil
}
- if params.KeySym != nil {
- rawSize += AESNonceLength
+ rawSize := flagsLength + getSizeOfPayloadSizeField(params.Payload) + len(params.Payload)
+ if params.Src != nil {
+ rawSize += signatureLength
}
odd := rawSize % padSizeLimit
-
- if len(params.Padding) != 0 {
- padSize := len(params.Padding)
- padLengthSize, err := getSizeOfLength(params.Padding)
- if err != nil {
- return err
- }
- totalPadSize := padSize + padLengthSize
- buf := make([]byte, 8)
- binary.LittleEndian.PutUint32(buf, uint32(totalPadSize))
- buf = buf[:padLengthSize]
- msg.Raw = append(msg.Raw, buf...)
- msg.Raw = append(msg.Raw, params.Padding...)
- msg.Raw[0] |= byte(padLengthSize) // number of bytes indicating the padding size
- } else if odd != 0 {
- totalPadSize := padSizeLimit - odd
- if totalPadSize > 255 {
- // this algorithm is only valid if padSizeLimit < 256.
- // if padSizeLimit will ever change, please fix the algorithm
- // (please see also ReceivedMessage.extractPadding() function).
- panic("please fix the padding algorithm before releasing new version")
- }
- buf := make([]byte, totalPadSize)
- _, err := crand.Read(buf[1:])
- if err != nil {
- return err
- }
- if totalPadSize > 6 && !validateSymmetricKey(buf) {
- return errors.New("failed to generate random padding of size " + strconv.Itoa(totalPadSize))
- }
- buf[0] = byte(totalPadSize)
- msg.Raw = append(msg.Raw, buf...)
- msg.Raw[0] |= byte(0x1) // number of bytes indicating the padding size
+ paddingSize := padSizeLimit - odd
+ pad := make([]byte, paddingSize)
+ _, err := crand.Read(pad)
+ if err != nil {
+ return err
}
+ if !validateDataIntegrity(pad, paddingSize) {
+ return errors.New("failed to generate random padding of size " + strconv.Itoa(paddingSize))
+ }
+ msg.Raw = append(msg.Raw, pad...)
return nil
}
@@ -175,11 +156,11 @@ func (msg *sentMessage) sign(key *ecdsa.PrivateKey) error {
return nil
}
- msg.Raw[0] |= signatureFlag
+ msg.Raw[0] |= signatureFlag // it is important to set this flag before signing
hash := crypto.Keccak256(msg.Raw)
signature, err := crypto.Sign(hash, key)
if err != nil {
- msg.Raw[0] &= ^signatureFlag // clear the flag
+ msg.Raw[0] &= (0xFF ^ signatureFlag) // clear the flag
return err
}
msg.Raw = append(msg.Raw, signature...)
@@ -201,10 +182,9 @@ func (msg *sentMessage) encryptAsymmetric(key *ecdsa.PublicKey) error {
// encryptSymmetric encrypts a message with a topic key, using AES-GCM-256.
// nonce size should be 12 bytes (see cipher.gcmStandardNonceSize).
func (msg *sentMessage) encryptSymmetric(key []byte) (err error) {
- if !validateSymmetricKey(key) {
- return errors.New("invalid key provided for symmetric encryption")
+ if !validateDataIntegrity(key, aesKeyLength) {
+ return errors.New("invalid key provided for symmetric encryption, size: " + strconv.Itoa(len(key)))
}
-
block, err := aes.NewCipher(key)
if err != nil {
return err
@@ -213,20 +193,46 @@ func (msg *sentMessage) encryptSymmetric(key []byte) (err error) {
if err != nil {
return err
}
-
- // never use more than 2^32 random nonces with a given key
- salt := make([]byte, aesgcm.NonceSize())
- _, err = crand.Read(salt)
+ salt, err := generateSecureRandomData(aesNonceLength) // never use more than 2^32 random nonces with a given key
if err != nil {
return err
- } else if !validateSymmetricKey(salt) {
- return errors.New("crypto/rand failed to generate salt")
}
-
- msg.Raw = append(aesgcm.Seal(nil, salt, msg.Raw, nil), salt...)
+ encrypted := aesgcm.Seal(nil, salt, msg.Raw, nil)
+ msg.Raw = append(encrypted, salt...)
return nil
}
+// generateSecureRandomData generates random data where extra security is required.
+// The purpose of this function is to prevent some bugs in software or in hardware
+// from delivering not-very-random data. This is especially useful for AES nonce,
+// where true randomness does not really matter, but it is very important to have
+// a unique nonce for every message.
+func generateSecureRandomData(length int) ([]byte, error) {
+ x := make([]byte, length)
+ y := make([]byte, length)
+ res := make([]byte, length)
+
+ _, err := crand.Read(x)
+ if err != nil {
+ return nil, err
+ } else if !validateDataIntegrity(x, length) {
+ return nil, errors.New("crypto/rand failed to generate secure random data")
+ }
+ _, err = mrand.Read(y)
+ if err != nil {
+ return nil, err
+ } else if !validateDataIntegrity(y, length) {
+ return nil, errors.New("math/rand failed to generate secure random data")
+ }
+ for i := 0; i < length; i++ {
+ res[i] = x[i] ^ y[i]
+ }
+ if !validateDataIntegrity(res, length) {
+ return nil, errors.New("failed to generate secure random data")
+ }
+ return res, nil
+}
+
// Wrap bundles the message into an Envelope to transmit over the network.
func (msg *sentMessage) Wrap(options *MessageParams) (envelope *Envelope, err error) {
if options.TTL == 0 {
@@ -258,12 +264,11 @@ func (msg *sentMessage) Wrap(options *MessageParams) (envelope *Envelope, err er
// decryptSymmetric decrypts a message with a topic key, using AES-GCM-256.
// nonce size should be 12 bytes (see cipher.gcmStandardNonceSize).
func (msg *ReceivedMessage) decryptSymmetric(key []byte) error {
- // In v6, symmetric messages are expected to contain the 12-byte
- // "salt" at the end of the payload.
- if len(msg.Raw) < AESNonceLength {
+ // symmetric messages are expected to contain the 12-byte nonce at the end of the payload
+ if len(msg.Raw) < aesNonceLength {
return errors.New("missing salt or invalid payload in symmetric message")
}
- salt := msg.Raw[len(msg.Raw)-AESNonceLength:]
+ salt := msg.Raw[len(msg.Raw)-aesNonceLength:]
block, err := aes.NewCipher(key)
if err != nil {
@@ -273,11 +278,7 @@ func (msg *ReceivedMessage) decryptSymmetric(key []byte) error {
if err != nil {
return err
}
- if len(salt) != aesgcm.NonceSize() {
- log.Error("decrypting the message", "AES salt size", len(salt))
- return errors.New("wrong AES salt size")
- }
- decrypted, err := aesgcm.Open(nil, salt, msg.Raw[:len(msg.Raw)-AESNonceLength], nil)
+ decrypted, err := aesgcm.Open(nil, salt, msg.Raw[:len(msg.Raw)-aesNonceLength], nil)
if err != nil {
return err
}
@@ -295,8 +296,8 @@ func (msg *ReceivedMessage) decryptAsymmetric(key *ecdsa.PrivateKey) error {
return err
}
-// Validate checks the validity and extracts the fields in case of success
-func (msg *ReceivedMessage) Validate() bool {
+// ValidateAndParse checks the message validity and extracts the fields in case of success.
+func (msg *ReceivedMessage) ValidateAndParse() bool {
end := len(msg.Raw)
if end < 1 {
return false
@@ -307,41 +308,32 @@ func (msg *ReceivedMessage) Validate() bool {
if end <= 1 {
return false
}
- msg.Signature = msg.Raw[end:]
+ msg.Signature = msg.Raw[end : end+signatureLength]
msg.Src = msg.SigToPubKey()
if msg.Src == nil {
return false
}
}
- padSize, ok := msg.extractPadding(end)
- if !ok {
- return false
+ beg := 1
+ payloadSize := 0
+ sizeOfPayloadSizeField := int(msg.Raw[0] & SizeMask) // number of bytes indicating the size of payload
+ if sizeOfPayloadSizeField != 0 {
+ payloadSize = int(bytesToUintLittleEndian(msg.Raw[beg : beg+sizeOfPayloadSizeField]))
+ if payloadSize+1 > end {
+ return false
+ }
+ beg += sizeOfPayloadSizeField
+ msg.Payload = msg.Raw[beg : beg+payloadSize]
}
- msg.Payload = msg.Raw[1+padSize : end]
+ beg += payloadSize
+ msg.Padding = msg.Raw[beg:end]
return true
}
-// extractPadding extracts the padding from raw message.
-// although we don't support sending messages with padding size
-// exceeding 255 bytes, such messages are perfectly valid, and
-// can be successfully decrypted.
-func (msg *ReceivedMessage) extractPadding(end int) (int, bool) {
- paddingSize := 0
- sz := int(msg.Raw[0] & paddingMask) // number of bytes indicating the entire size of padding (including these bytes)
- // could be zero -- it means no padding
- if sz != 0 {
- paddingSize = int(bytesToUintLittleEndian(msg.Raw[1 : 1+sz]))
- if paddingSize < sz || paddingSize+1 > end {
- return 0, false
- }
- msg.Padding = msg.Raw[1+sz : 1+paddingSize]
- }
- return paddingSize, true
-}
-
-// Recover retrieves the public key of the message signer.
+// SigToPubKey returns the public key associated to the message's
+// signature.
func (msg *ReceivedMessage) SigToPubKey() *ecdsa.PublicKey {
defer func() { recover() }() // in case of invalid signature
@@ -353,7 +345,7 @@ func (msg *ReceivedMessage) SigToPubKey() *ecdsa.PublicKey {
return pub
}
-// hash calculates the SHA3 checksum of the message flags, payload and padding.
+// hash calculates the SHA3 checksum of the message flags, payload size field, payload and padding.
func (msg *ReceivedMessage) hash() []byte {
if isMessageSigned(msg.Raw[0]) {
sz := len(msg.Raw) - signatureLength
diff --git a/whisper/whisperv6/message_test.go b/whisper/whisperv6/message_test.go
index c90bcc01e..12a269f5d 100644
--- a/whisper/whisperv6/message_test.go
+++ b/whisper/whisperv6/message_test.go
@@ -18,9 +18,12 @@ package whisperv6
import (
"bytes"
+ "crypto/aes"
+ "crypto/cipher"
mrand "math/rand"
"testing"
+ "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/rlp"
)
@@ -70,7 +73,7 @@ func singleMessageTest(t *testing.T, symmetric bool) {
text := make([]byte, 0, 512)
text = append(text, params.Payload...)
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -90,8 +93,8 @@ func singleMessageTest(t *testing.T, symmetric bool) {
t.Fatalf("failed to encrypt with seed %d: %s.", seed, err)
}
- if !decrypted.Validate() {
- t.Fatalf("failed to validate with seed %d.", seed)
+ if !decrypted.ValidateAndParse() {
+ t.Fatalf("failed to validate with seed %d, symmetric = %v.", seed, symmetric)
}
if !bytes.Equal(text, decrypted.Payload) {
@@ -128,7 +131,7 @@ func TestMessageWrap(t *testing.T) {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -146,7 +149,7 @@ func TestMessageWrap(t *testing.T) {
}
// set PoW target too high, expect error
- msg2, err := NewSentMessage(params)
+ msg2, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -169,7 +172,7 @@ func TestMessageSeal(t *testing.T) {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -206,7 +209,7 @@ func TestEnvelopeOpen(t *testing.T) {
InitSingleTest()
var symmetric bool
- for i := 0; i < 256; i++ {
+ for i := 0; i < 32; i++ {
singleEnvelopeOpenTest(t, symmetric)
symmetric = !symmetric
}
@@ -231,7 +234,7 @@ func singleEnvelopeOpenTest(t *testing.T, symmetric bool) {
text := make([]byte, 0, 512)
text = append(text, params.Payload...)
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -286,7 +289,7 @@ func TestEncryptWithZeroKey(t *testing.T) {
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -300,7 +303,7 @@ func TestEncryptWithZeroKey(t *testing.T) {
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err = NewSentMessage(params)
+ msg, err = newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -314,7 +317,7 @@ func TestEncryptWithZeroKey(t *testing.T) {
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err = NewSentMessage(params)
+ msg, err = newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -332,7 +335,7 @@ func TestRlpEncode(t *testing.T) {
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -376,7 +379,7 @@ func singlePaddingTest(t *testing.T, padSize int) {
if n != padSize {
t.Fatalf("padding is not copied (seed %d): %s", seed, err)
}
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -417,30 +420,6 @@ func TestPadding(t *testing.T) {
}
}
-func TestPaddingAppendedToSymMessages(t *testing.T) {
- params := &MessageParams{
- Payload: make([]byte, 246),
- KeySym: make([]byte, aesKeyLength),
- }
-
- // Simulate a message with a payload just under 256 so that
- // payload + flag + aesnonce > 256. Check that the result
- // is padded on the next 256 boundary.
- msg := sentMessage{}
- msg.Raw = make([]byte, len(params.Payload)+1+AESNonceLength)
-
- err := msg.appendPadding(params)
-
- if err != nil {
- t.Fatalf("Error appending padding to message %v", err)
- return
- }
-
- if len(msg.Raw) != 512 {
- t.Errorf("Invalid size %d != 512", len(msg.Raw))
- }
-}
-
func TestPaddingAppendedToSymMessagesWithSignature(t *testing.T) {
params := &MessageParams{
Payload: make([]byte, 246),
@@ -456,10 +435,11 @@ func TestPaddingAppendedToSymMessagesWithSignature(t *testing.T) {
params.Src = pSrc
// Simulate a message with a payload just under 256 so that
- // payload + flag + aesnonce > 256. Check that the result
+ // payload + flag + signature > 256. Check that the result
// is padded on the next 256 boundary.
msg := sentMessage{}
- msg.Raw = make([]byte, len(params.Payload)+1+AESNonceLength+signatureLength)
+ const payloadSizeFieldMinSize = 1
+ msg.Raw = make([]byte, flagsLength+payloadSizeFieldMinSize+len(params.Payload))
err = msg.appendPadding(params)
@@ -468,7 +448,24 @@ func TestPaddingAppendedToSymMessagesWithSignature(t *testing.T) {
return
}
- if len(msg.Raw) != 512 {
+ if len(msg.Raw) != 512-signatureLength {
t.Errorf("Invalid size %d != 512", len(msg.Raw))
}
}
+
+func TestAesNonce(t *testing.T) {
+ key := hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31")
+ block, err := aes.NewCipher(key)
+ if err != nil {
+ t.Fatalf("NewCipher failed: %s", err)
+ }
+ aesgcm, err := cipher.NewGCM(block)
+ if err != nil {
+ t.Fatalf("NewGCM failed: %s", err)
+ }
+ // This is the most important single test in this package.
+ // If it fails, whisper will not be working.
+ if aesgcm.NonceSize() != aesNonceLength {
+ t.Fatalf("Nonce size is wrong. This is a critical error. Apparently AES nonce size have changed in the new version of AES GCM package. Whisper will not be working until this problem is resolved.")
+ }
+}
diff --git a/whisper/whisperv6/peer.go b/whisper/whisperv6/peer.go
index ac7b3b12b..4f9a7c378 100644
--- a/whisper/whisperv6/peer.go
+++ b/whisper/whisperv6/peer.go
@@ -18,6 +18,7 @@ package whisperv6
import (
"fmt"
+ "math"
"time"
"github.com/ethereum/go-ethereum/common"
@@ -27,12 +28,15 @@ import (
set "gopkg.in/fatih/set.v0"
)
-// peer represents a whisper protocol peer connection.
+// Peer represents a whisper protocol peer connection.
type Peer struct {
- host *Whisper
- peer *p2p.Peer
- ws p2p.MsgReadWriter
- trusted bool
+ host *Whisper
+ peer *p2p.Peer
+ ws p2p.MsgReadWriter
+
+ trusted bool
+ powRequirement float64
+ bloomFilter []byte // may contain nil in case of full node
known *set.Set // Messages already known by the peer to avoid wasting bandwidth
@@ -42,62 +46,95 @@ type Peer struct {
// newPeer creates a new whisper peer object, but does not run the handshake itself.
func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) *Peer {
return &Peer{
- host: host,
- peer: remote,
- ws: rw,
- trusted: false,
- known: set.New(),
- quit: make(chan struct{}),
+ host: host,
+ peer: remote,
+ ws: rw,
+ trusted: false,
+ powRequirement: 0.0,
+ known: set.New(),
+ quit: make(chan struct{}),
}
}
// start initiates the peer updater, periodically broadcasting the whisper packets
// into the network.
-func (p *Peer) start() {
- go p.update()
- log.Trace("start", "peer", p.ID())
+func (peer *Peer) start() {
+ go peer.update()
+ log.Trace("start", "peer", peer.ID())
}
// stop terminates the peer updater, stopping message forwarding to it.
-func (p *Peer) stop() {
- close(p.quit)
- log.Trace("stop", "peer", p.ID())
+func (peer *Peer) stop() {
+ close(peer.quit)
+ log.Trace("stop", "peer", peer.ID())
}
// handshake sends the protocol initiation status message to the remote peer and
// verifies the remote status too.
-func (p *Peer) handshake() error {
+func (peer *Peer) handshake() error {
// Send the handshake status message asynchronously
errc := make(chan error, 1)
go func() {
- errc <- p2p.Send(p.ws, statusCode, ProtocolVersion)
+ pow := peer.host.MinPow()
+ powConverted := math.Float64bits(pow)
+ bloom := peer.host.BloomFilter()
+ errc <- p2p.SendItems(peer.ws, statusCode, ProtocolVersion, powConverted, bloom)
}()
+
// Fetch the remote status packet and verify protocol match
- packet, err := p.ws.ReadMsg()
+ packet, err := peer.ws.ReadMsg()
if err != nil {
return err
}
if packet.Code != statusCode {
- return fmt.Errorf("peer [%x] sent packet %x before status packet", p.ID(), packet.Code)
+ return fmt.Errorf("peer [%x] sent packet %x before status packet", peer.ID(), packet.Code)
}
s := rlp.NewStream(packet.Payload, uint64(packet.Size))
+ _, err = s.List()
+ if err != nil {
+ return fmt.Errorf("peer [%x] sent bad status message: %v", peer.ID(), err)
+ }
peerVersion, err := s.Uint()
if err != nil {
- return fmt.Errorf("peer [%x] sent bad status message: %v", p.ID(), err)
+ return fmt.Errorf("peer [%x] sent bad status message (unable to decode version): %v", peer.ID(), err)
}
if peerVersion != ProtocolVersion {
- return fmt.Errorf("peer [%x]: protocol version mismatch %d != %d", p.ID(), peerVersion, ProtocolVersion)
+ return fmt.Errorf("peer [%x]: protocol version mismatch %d != %d", peer.ID(), peerVersion, ProtocolVersion)
+ }
+
+ // only version is mandatory, subsequent parameters are optional
+ powRaw, err := s.Uint()
+ if err == nil {
+ pow := math.Float64frombits(powRaw)
+ if math.IsInf(pow, 0) || math.IsNaN(pow) || pow < 0.0 {
+ return fmt.Errorf("peer [%x] sent bad status message: invalid pow", peer.ID())
+ }
+ peer.powRequirement = pow
+
+ var bloom []byte
+ err = s.Decode(&bloom)
+ if err == nil {
+ sz := len(bloom)
+ if sz != bloomFilterSize && sz != 0 {
+ return fmt.Errorf("peer [%x] sent bad status message: wrong bloom filter size %d", peer.ID(), sz)
+ }
+ if isFullNode(bloom) {
+ peer.bloomFilter = nil
+ } else {
+ peer.bloomFilter = bloom
+ }
+ }
}
- // Wait until out own status is consumed too
+
if err := <-errc; err != nil {
- return fmt.Errorf("peer [%x] failed to send status packet: %v", p.ID(), err)
+ return fmt.Errorf("peer [%x] failed to send status packet: %v", peer.ID(), err)
}
return nil
}
// update executes periodic operations on the peer, including message transmission
// and expiration.
-func (p *Peer) update() {
+func (peer *Peer) update() {
// Start the tickers for the updates
expire := time.NewTicker(expirationCycle)
transmit := time.NewTicker(transmissionCycle)
@@ -106,15 +143,15 @@ func (p *Peer) update() {
for {
select {
case <-expire.C:
- p.expire()
+ peer.expire()
case <-transmit.C:
- if err := p.broadcast(); err != nil {
- log.Trace("broadcast failed", "reason", err, "peer", p.ID())
+ if err := peer.broadcast(); err != nil {
+ log.Trace("broadcast failed", "reason", err, "peer", peer.ID())
return
}
- case <-p.quit:
+ case <-peer.quit:
return
}
}
@@ -148,27 +185,51 @@ func (peer *Peer) expire() {
// broadcast iterates over the collection of envelopes and transmits yet unknown
// ones over the network.
-func (p *Peer) broadcast() error {
- var cnt int
- envelopes := p.host.Envelopes()
+func (peer *Peer) broadcast() error {
+ envelopes := peer.host.Envelopes()
+ bundle := make([]*Envelope, 0, len(envelopes))
for _, envelope := range envelopes {
- if !p.marked(envelope) {
- err := p2p.Send(p.ws, messagesCode, envelope)
- if err != nil {
- return err
- } else {
- p.mark(envelope)
- cnt++
- }
+ if !peer.marked(envelope) && envelope.PoW() >= peer.powRequirement && peer.bloomMatch(envelope) {
+ bundle = append(bundle, envelope)
}
}
- if cnt > 0 {
- log.Trace("broadcast", "num. messages", cnt)
+
+ if len(bundle) > 0 {
+ // transmit the batch of envelopes
+ if err := p2p.Send(peer.ws, messagesCode, bundle); err != nil {
+ return err
+ }
+
+ // mark envelopes only if they were successfully sent
+ for _, e := range bundle {
+ peer.mark(e)
+ }
+
+ log.Trace("broadcast", "num. messages", len(bundle))
}
return nil
}
-func (p *Peer) ID() []byte {
- id := p.peer.ID()
+// ID returns a peer's id
+func (peer *Peer) ID() []byte {
+ id := peer.peer.ID()
return id[:]
}
+
+func (peer *Peer) notifyAboutPowRequirementChange(pow float64) error {
+ i := math.Float64bits(pow)
+ return p2p.Send(peer.ws, powRequirementCode, i)
+}
+
+func (peer *Peer) notifyAboutBloomFilterChange(bloom []byte) error {
+ return p2p.Send(peer.ws, bloomFilterExCode, bloom)
+}
+
+func (peer *Peer) bloomMatch(env *Envelope) bool {
+ if peer.bloomFilter == nil {
+ // no filter - full node, accepts all envelops
+ return true
+ }
+
+ return bloomFilterMatch(peer.bloomFilter, env.Bloom())
+}
diff --git a/whisper/whisperv6/peer_test.go b/whisper/whisperv6/peer_test.go
index 39a4ab198..dffa7b350 100644
--- a/whisper/whisperv6/peer_test.go
+++ b/whisper/whisperv6/peer_test.go
@@ -20,19 +20,21 @@ import (
"bytes"
"crypto/ecdsa"
"fmt"
+ mrand "math/rand"
"net"
"sync"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/nat"
)
-var keys []string = []string{
+var keys = []string{
"d49dcf37238dc8a7aac57dc61b9fee68f0a97f062968978b9fafa7d1033d03a9",
"73fd6143c48e80ed3c56ea159fe7494a0b6b393a392227b422f4c3e8f1b54f98",
"119dd32adb1daa7a4c7bf77f847fb28730785aa92947edf42fdd997b54de40dc",
@@ -79,48 +81,108 @@ type TestNode struct {
shh *Whisper
id *ecdsa.PrivateKey
server *p2p.Server
- filerId string
+ filerID string
}
var result TestData
var nodes [NumNodes]*TestNode
-var sharedKey []byte = []byte("some arbitrary data here")
-var sharedTopic TopicType = TopicType{0xF, 0x1, 0x2, 0}
-var expectedMessage []byte = []byte("per rectum ad astra")
-
-// This test does the following:
-// 1. creates a chain of whisper nodes,
-// 2. installs the filters with shared (predefined) parameters,
-// 3. each node sends a number of random (undecryptable) messages,
-// 4. first node sends one expected (decryptable) message,
-// 5. checks if each node have received and decrypted exactly one message.
+var sharedKey = hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31")
+var sharedTopic = TopicType{0xF, 0x1, 0x2, 0}
+var expectedMessage = []byte("per rectum ad astra")
+var masterBloomFilter []byte
+var masterPow = 0.00000001
+var round = 1
+
func TestSimulation(t *testing.T) {
+ // create a chain of whisper nodes,
+ // installs the filters with shared (predefined) parameters
initialize(t)
+ // each node sends a number of random (undecryptable) messages
for i := 0; i < NumNodes; i++ {
sendMsg(t, false, i)
}
+ // node #0 sends one expected (decryptable) message
sendMsg(t, true, 0)
- checkPropagation(t)
+
+ // check if each node have received and decrypted exactly one message
+ checkPropagation(t, true)
+
+ // check if Status message was correctly decoded
+ checkBloomFilterExchange(t)
+ checkPowExchange(t)
+
+ // send new pow and bloom exchange messages
+ resetParams(t)
+ round++
+
+ // node #1 sends one expected (decryptable) message
+ sendMsg(t, true, 1)
+
+ // check if each node (except node #0) have received and decrypted exactly one message
+ checkPropagation(t, false)
+
+ // check if corresponding protocol-level messages were correctly decoded
+ checkPowExchangeForNodeZero(t)
+ checkBloomFilterExchange(t)
+
stopServers()
}
+func resetParams(t *testing.T) {
+ // change pow only for node zero
+ masterPow = 7777777.0
+ nodes[0].shh.SetMinimumPoW(masterPow)
+
+ // change bloom for all nodes
+ masterBloomFilter = TopicToBloom(sharedTopic)
+ for i := 0; i < NumNodes; i++ {
+ nodes[i].shh.SetBloomFilter(masterBloomFilter)
+ }
+}
+
+func initBloom(t *testing.T) {
+ masterBloomFilter = make([]byte, bloomFilterSize)
+ _, err := mrand.Read(masterBloomFilter)
+ if err != nil {
+ t.Fatalf("rand failed: %s.", err)
+ }
+
+ msgBloom := TopicToBloom(sharedTopic)
+ masterBloomFilter = addBloom(masterBloomFilter, msgBloom)
+ for i := 0; i < 32; i++ {
+ masterBloomFilter[i] = 0xFF
+ }
+
+ if !bloomFilterMatch(masterBloomFilter, msgBloom) {
+ t.Fatalf("bloom mismatch on initBloom.")
+ }
+}
+
func initialize(t *testing.T) {
+ initBloom(t)
+
var err error
ip := net.IPv4(127, 0, 0, 1)
port0 := 30303
for i := 0; i < NumNodes; i++ {
var node TestNode
+ b := make([]byte, bloomFilterSize)
+ copy(b, masterBloomFilter)
node.shh = New(&DefaultConfig)
- node.shh.SetMinimumPoW(0.00000001)
+ node.shh.SetMinimumPoW(masterPow)
+ node.shh.SetBloomFilter(b)
+ if !bytes.Equal(node.shh.BloomFilter(), masterBloomFilter) {
+ t.Fatalf("bloom mismatch on init.")
+ }
node.shh.Start(nil)
topics := make([]TopicType, 0)
topics = append(topics, sharedTopic)
f := Filter{KeySym: sharedKey}
f.Topics = [][]byte{topics[0][:]}
- node.filerId, err = node.shh.Subscribe(&f)
+ node.filerID, err = node.shh.Subscribe(&f)
if err != nil {
t.Fatalf("failed to install the filter: %s.", err)
}
@@ -133,9 +195,9 @@ func initialize(t *testing.T) {
name := common.MakeName("whisper-go", "2.0")
var peers []*discover.Node
if i > 0 {
- peerNodeId := nodes[i-1].id
+ peerNodeID := nodes[i-1].id
peerPort := uint16(port - 1)
- peerNode := discover.PubkeyID(&peerNodeId.PublicKey)
+ peerNode := discover.PubkeyID(&peerNodeID.PublicKey)
peer := discover.NewNode(peerNode, ip, peerPort, peerPort)
peers = append(peers, peer)
}
@@ -154,41 +216,49 @@ func initialize(t *testing.T) {
},
}
- err = node.server.Start()
- if err != nil {
- t.Fatalf("failed to start server %d.", i)
- }
-
nodes[i] = &node
}
+
+ for i := 1; i < NumNodes; i++ {
+ go nodes[i].server.Start()
+ }
+
+ // we need to wait until the first node actually starts
+ err = nodes[0].server.Start()
+ if err != nil {
+ t.Fatalf("failed to start the fisrt server.")
+ }
}
func stopServers() {
for i := 0; i < NumNodes; i++ {
n := nodes[i]
if n != nil {
- n.shh.Unsubscribe(n.filerId)
+ n.shh.Unsubscribe(n.filerID)
n.shh.Stop()
n.server.Stop()
}
}
}
-func checkPropagation(t *testing.T) {
+func checkPropagation(t *testing.T, includingNodeZero bool) {
if t.Failed() {
return
}
- const cycle = 100
- const iterations = 100
+ const cycle = 50
+ const iterations = 200
- for j := 0; j < iterations; j++ {
- time.Sleep(cycle * time.Millisecond)
+ first := 0
+ if !includingNodeZero {
+ first = 1
+ }
- for i := 0; i < NumNodes; i++ {
- f := nodes[i].shh.GetFilter(nodes[i].filerId)
+ for j := 0; j < iterations; j++ {
+ for i := first; i < NumNodes; i++ {
+ f := nodes[i].shh.GetFilter(nodes[i].filerID)
if f == nil {
- t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerId, i)
+ t.Fatalf("failed to get filterId %s from node %d, round %d.", nodes[i].filerID, i, round)
}
mail := f.Retrieve()
@@ -200,9 +270,18 @@ func checkPropagation(t *testing.T) {
return
}
}
+
+ time.Sleep(cycle * time.Millisecond)
}
- t.Fatalf("Test was not complete: timeout %d seconds.", iterations*cycle/1000)
+ t.Fatalf("Test was not complete: timeout %d seconds. nodes=%v", iterations*cycle/1000, nodes)
+
+ if !includingNodeZero {
+ f := nodes[0].shh.GetFilter(nodes[0].filerID)
+ if f != nil {
+ t.Fatalf("node zero received a message with low PoW.")
+ }
+ }
}
func validateMail(t *testing.T, index int, mail []*ReceivedMessage) bool {
@@ -265,7 +344,7 @@ func sendMsg(t *testing.T, expected bool, id int) {
opt.Payload = opt.Payload[1:]
}
- msg, err := NewSentMessage(&opt)
+ msg, err := newSentMessage(&opt)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -289,7 +368,7 @@ func TestPeerBasic(t *testing.T) {
}
params.PoW = 0.001
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -304,3 +383,79 @@ func TestPeerBasic(t *testing.T) {
t.Fatalf("failed mark with seed %d.", seed)
}
}
+
+func checkPowExchangeForNodeZero(t *testing.T) {
+ const iterations = 200
+ for j := 0; j < iterations; j++ {
+ lastCycle := (j == iterations-1)
+ ok := checkPowExchangeForNodeZeroOnce(t, lastCycle)
+ if ok {
+ break
+ }
+ time.Sleep(50 * time.Millisecond)
+ }
+}
+
+func checkPowExchangeForNodeZeroOnce(t *testing.T, mustPass bool) bool {
+ cnt := 0
+ for i, node := range nodes {
+ for peer := range node.shh.peers {
+ if peer.peer.ID() == discover.PubkeyID(&nodes[0].id.PublicKey) {
+ cnt++
+ if peer.powRequirement != masterPow {
+ if mustPass {
+ t.Fatalf("node %d: failed to set the new pow requirement for node zero.", i)
+ } else {
+ return false
+ }
+ }
+ }
+ }
+ }
+ if cnt == 0 {
+ t.Fatalf("looking for node zero: no matching peers found.")
+ }
+ return true
+}
+
+func checkPowExchange(t *testing.T) {
+ for i, node := range nodes {
+ for peer := range node.shh.peers {
+ if peer.peer.ID() != discover.PubkeyID(&nodes[0].id.PublicKey) {
+ if peer.powRequirement != masterPow {
+ t.Fatalf("node %d: failed to exchange pow requirement in round %d; expected %f, got %f",
+ i, round, masterPow, peer.powRequirement)
+ }
+ }
+ }
+ }
+}
+
+func checkBloomFilterExchangeOnce(t *testing.T, mustPass bool) bool {
+ for i, node := range nodes {
+ for peer := range node.shh.peers {
+ if !bytes.Equal(peer.bloomFilter, masterBloomFilter) {
+ if mustPass {
+ t.Fatalf("node %d: failed to exchange bloom filter requirement in round %d. \n%x expected \n%x got",
+ i, round, masterBloomFilter, peer.bloomFilter)
+ } else {
+ return false
+ }
+ }
+ }
+ }
+
+ return true
+}
+
+func checkBloomFilterExchange(t *testing.T) {
+ const iterations = 200
+ for j := 0; j < iterations; j++ {
+ lastCycle := (j == iterations-1)
+ ok := checkBloomFilterExchangeOnce(t, lastCycle)
+ if ok {
+ break
+ }
+ time.Sleep(50 * time.Millisecond)
+ }
+}
diff --git a/whisper/whisperv6/topic.go b/whisper/whisperv6/topic.go
index bf5da01e3..4dd8f283c 100644
--- a/whisper/whisperv6/topic.go
+++ b/whisper/whisperv6/topic.go
@@ -23,11 +23,13 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
)
-// Topic represents a cryptographically secure, probabilistic partial
+// TopicType represents a cryptographically secure, probabilistic partial
// classifications of a message, determined as the first (left) 4 bytes of the
// SHA3 hash of some arbitrary data given by the original author of the message.
type TopicType [TopicLength]byte
+// BytesToTopic converts from the byte array representation of a topic
+// into the TopicType type.
func BytesToTopic(b []byte) (t TopicType) {
sz := TopicLength
if x := len(b); x < TopicLength {
diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go
index d09baab3f..d75ad04ac 100644
--- a/whisper/whisperv6/whisper.go
+++ b/whisper/whisperv6/whisper.go
@@ -19,9 +19,9 @@ package whisperv6
import (
"bytes"
"crypto/ecdsa"
- crand "crypto/rand"
"crypto/sha256"
"fmt"
+ "math"
"runtime"
"sync"
"time"
@@ -30,6 +30,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rpc"
"github.com/syndtr/goleveldb/leveldb/errors"
"golang.org/x/crypto/pbkdf2"
@@ -37,6 +38,8 @@ import (
set "gopkg.in/fatih/set.v0"
)
+// Statistics holds several message-related counter for analytics
+// purposes.
type Statistics struct {
messagesCleared int
memoryCleared int
@@ -46,9 +49,12 @@ type Statistics struct {
}
const (
- minPowIdx = iota // Minimal PoW required by the whisper node
- maxMsgSizeIdx = iota // Maximal message length allowed by the whisper node
- overflowIdx = iota // Indicator of message queue overflow
+ maxMsgSizeIdx = iota // Maximal message length allowed by the whisper node
+ overflowIdx // Indicator of message queue overflow
+ minPowIdx // Minimal PoW required by the whisper node
+ minPowToleranceIdx // Minimal PoW tolerated by the whisper node for a limited time
+ bloomFilterIdx // Bloom filter for topics of interest for this node
+ bloomFilterToleranceIdx // Bloom filter tolerated by the whisper node for a limited time
)
// Whisper represents a dark communication interface through the Ethereum
@@ -74,6 +80,8 @@ type Whisper struct {
settings syncmap.Map // holds configuration settings that can be dynamically changed
+ syncAllowance int // maximum time in seconds allowed to process the whisper-related messages
+
statsMu sync.Mutex // guard stats
stats Statistics // Statistics of whisper node
@@ -87,14 +95,15 @@ func New(cfg *Config) *Whisper {
}
whisper := &Whisper{
- privateKeys: make(map[string]*ecdsa.PrivateKey),
- symKeys: make(map[string][]byte),
- envelopes: make(map[common.Hash]*Envelope),
- expirations: make(map[uint32]*set.SetNonTS),
- peers: make(map[*Peer]struct{}),
- messageQueue: make(chan *Envelope, messageQueueLimit),
- p2pMsgQueue: make(chan *Envelope, messageQueueLimit),
- quit: make(chan struct{}),
+ privateKeys: make(map[string]*ecdsa.PrivateKey),
+ symKeys: make(map[string][]byte),
+ envelopes: make(map[common.Hash]*Envelope),
+ expirations: make(map[uint32]*set.SetNonTS),
+ peers: make(map[*Peer]struct{}),
+ messageQueue: make(chan *Envelope, messageQueueLimit),
+ p2pMsgQueue: make(chan *Envelope, messageQueueLimit),
+ quit: make(chan struct{}),
+ syncAllowance: DefaultSyncAllowance,
}
whisper.filters = NewFilters(whisper)
@@ -121,30 +130,74 @@ func New(cfg *Config) *Whisper {
return whisper
}
-func (w *Whisper) MinPow() float64 {
- val, _ := w.settings.Load(minPowIdx)
+// MinPow returns the PoW value required by this node.
+func (whisper *Whisper) MinPow() float64 {
+ val, exist := whisper.settings.Load(minPowIdx)
+ if !exist || val == nil {
+ return DefaultMinimumPoW
+ }
+ v, ok := val.(float64)
+ if !ok {
+ log.Error("Error loading minPowIdx, using default")
+ return DefaultMinimumPoW
+ }
+ return v
+}
+
+// MinPowTolerance returns the value of minimum PoW which is tolerated for a limited
+// time after PoW was changed. If sufficient time have elapsed or no change of PoW
+// have ever occurred, the return value will be the same as return value of MinPow().
+func (whisper *Whisper) MinPowTolerance() float64 {
+ val, exist := whisper.settings.Load(minPowToleranceIdx)
+ if !exist || val == nil {
+ return DefaultMinimumPoW
+ }
return val.(float64)
}
+// BloomFilter returns the aggregated bloom filter for all the topics of interest.
+// The nodes are required to send only messages that match the advertised bloom filter.
+// If a message does not match the bloom, it will tantamount to spam, and the peer will
+// be disconnected.
+func (whisper *Whisper) BloomFilter() []byte {
+ val, exist := whisper.settings.Load(bloomFilterIdx)
+ if !exist || val == nil {
+ return nil
+ }
+ return val.([]byte)
+}
+
+// BloomFilterTolerance returns the bloom filter which is tolerated for a limited
+// time after new bloom was advertised to the peers. If sufficient time have elapsed
+// or no change of bloom filter have ever occurred, the return value will be the same
+// as return value of BloomFilter().
+func (whisper *Whisper) BloomFilterTolerance() []byte {
+ val, exist := whisper.settings.Load(bloomFilterToleranceIdx)
+ if !exist || val == nil {
+ return nil
+ }
+ return val.([]byte)
+}
+
// MaxMessageSize returns the maximum accepted message size.
-func (w *Whisper) MaxMessageSize() uint32 {
- val, _ := w.settings.Load(maxMsgSizeIdx)
+func (whisper *Whisper) MaxMessageSize() uint32 {
+ val, _ := whisper.settings.Load(maxMsgSizeIdx)
return val.(uint32)
}
// Overflow returns an indication if the message queue is full.
-func (w *Whisper) Overflow() bool {
- val, _ := w.settings.Load(overflowIdx)
+func (whisper *Whisper) Overflow() bool {
+ val, _ := whisper.settings.Load(overflowIdx)
return val.(bool)
}
// APIs returns the RPC descriptors the Whisper implementation offers
-func (w *Whisper) APIs() []rpc.API {
+func (whisper *Whisper) APIs() []rpc.API {
return []rpc.API{
{
Namespace: ProtocolName,
Version: ProtocolVersionStr,
- Service: NewPublicWhisperAPI(w),
+ Service: NewPublicWhisperAPI(whisper),
Public: true,
},
}
@@ -152,43 +205,120 @@ func (w *Whisper) APIs() []rpc.API {
// RegisterServer registers MailServer interface.
// MailServer will process all the incoming messages with p2pRequestCode.
-func (w *Whisper) RegisterServer(server MailServer) {
- w.mailServer = server
+func (whisper *Whisper) RegisterServer(server MailServer) {
+ whisper.mailServer = server
}
// Protocols returns the whisper sub-protocols ran by this particular client.
-func (w *Whisper) Protocols() []p2p.Protocol {
- return []p2p.Protocol{w.protocol}
+func (whisper *Whisper) Protocols() []p2p.Protocol {
+ return []p2p.Protocol{whisper.protocol}
}
// Version returns the whisper sub-protocols version number.
-func (w *Whisper) Version() uint {
- return w.protocol.Version
+func (whisper *Whisper) Version() uint {
+ return whisper.protocol.Version
}
// SetMaxMessageSize sets the maximal message size allowed by this node
-func (w *Whisper) SetMaxMessageSize(size uint32) error {
+func (whisper *Whisper) SetMaxMessageSize(size uint32) error {
if size > MaxMessageSize {
return fmt.Errorf("message size too large [%d>%d]", size, MaxMessageSize)
}
- w.settings.Store(maxMsgSizeIdx, size)
+ whisper.settings.Store(maxMsgSizeIdx, size)
+ return nil
+}
+
+// SetBloomFilter sets the new bloom filter
+func (whisper *Whisper) SetBloomFilter(bloom []byte) error {
+ if len(bloom) != bloomFilterSize {
+ return fmt.Errorf("invalid bloom filter size: %d", len(bloom))
+ }
+
+ b := make([]byte, bloomFilterSize)
+ copy(b, bloom)
+
+ whisper.settings.Store(bloomFilterIdx, b)
+ whisper.notifyPeersAboutBloomFilterChange(b)
+
+ go func() {
+ // allow some time before all the peers have processed the notification
+ time.Sleep(time.Duration(whisper.syncAllowance) * time.Second)
+ whisper.settings.Store(bloomFilterToleranceIdx, b)
+ }()
+
return nil
}
// SetMinimumPoW sets the minimal PoW required by this node
-func (w *Whisper) SetMinimumPoW(val float64) error {
- if val <= 0.0 {
+func (whisper *Whisper) SetMinimumPoW(val float64) error {
+ if val < 0.0 {
return fmt.Errorf("invalid PoW: %f", val)
}
- w.settings.Store(minPowIdx, val)
+
+ whisper.settings.Store(minPowIdx, val)
+ whisper.notifyPeersAboutPowRequirementChange(val)
+
+ go func() {
+ // allow some time before all the peers have processed the notification
+ time.Sleep(time.Duration(whisper.syncAllowance) * time.Second)
+ whisper.settings.Store(minPowToleranceIdx, val)
+ }()
+
return nil
}
+// SetMinimumPowTest sets the minimal PoW in test environment
+func (whisper *Whisper) SetMinimumPowTest(val float64) {
+ whisper.settings.Store(minPowIdx, val)
+ whisper.notifyPeersAboutPowRequirementChange(val)
+ whisper.settings.Store(minPowToleranceIdx, val)
+}
+
+func (whisper *Whisper) notifyPeersAboutPowRequirementChange(pow float64) {
+ arr := whisper.getPeers()
+ for _, p := range arr {
+ err := p.notifyAboutPowRequirementChange(pow)
+ if err != nil {
+ // allow one retry
+ err = p.notifyAboutPowRequirementChange(pow)
+ }
+ if err != nil {
+ log.Warn("failed to notify peer about new pow requirement", "peer", p.ID(), "error", err)
+ }
+ }
+}
+
+func (whisper *Whisper) notifyPeersAboutBloomFilterChange(bloom []byte) {
+ arr := whisper.getPeers()
+ for _, p := range arr {
+ err := p.notifyAboutBloomFilterChange(bloom)
+ if err != nil {
+ // allow one retry
+ err = p.notifyAboutBloomFilterChange(bloom)
+ }
+ if err != nil {
+ log.Warn("failed to notify peer about new bloom filter", "peer", p.ID(), "error", err)
+ }
+ }
+}
+
+func (whisper *Whisper) getPeers() []*Peer {
+ arr := make([]*Peer, len(whisper.peers))
+ i := 0
+ whisper.peerMu.Lock()
+ for p := range whisper.peers {
+ arr[i] = p
+ i++
+ }
+ whisper.peerMu.Unlock()
+ return arr
+}
+
// getPeer retrieves peer by ID
-func (w *Whisper) getPeer(peerID []byte) (*Peer, error) {
- w.peerMu.Lock()
- defer w.peerMu.Unlock()
- for p := range w.peers {
+func (whisper *Whisper) getPeer(peerID []byte) (*Peer, error) {
+ whisper.peerMu.Lock()
+ defer whisper.peerMu.Unlock()
+ for p := range whisper.peers {
id := p.peer.ID()
if bytes.Equal(peerID, id[:]) {
return p, nil
@@ -199,8 +329,8 @@ func (w *Whisper) getPeer(peerID []byte) (*Peer, error) {
// AllowP2PMessagesFromPeer marks specific peer trusted,
// which will allow it to send historic (expired) messages.
-func (w *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error {
- p, err := w.getPeer(peerID)
+func (whisper *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error {
+ p, err := whisper.getPeer(peerID)
if err != nil {
return err
}
@@ -213,8 +343,8 @@ func (w *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error {
// request and respond with a number of peer-to-peer messages (possibly expired),
// which are not supposed to be forwarded any further.
// The whisper protocol is agnostic of the format and contents of envelope.
-func (w *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) error {
- p, err := w.getPeer(peerID)
+func (whisper *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) error {
+ p, err := whisper.getPeer(peerID)
if err != nil {
return err
}
@@ -223,22 +353,22 @@ func (w *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) err
}
// SendP2PMessage sends a peer-to-peer message to a specific peer.
-func (w *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error {
- p, err := w.getPeer(peerID)
+func (whisper *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error {
+ p, err := whisper.getPeer(peerID)
if err != nil {
return err
}
- return w.SendP2PDirect(p, envelope)
+ return whisper.SendP2PDirect(p, envelope)
}
// SendP2PDirect sends a peer-to-peer message to a specific peer.
-func (w *Whisper) SendP2PDirect(peer *Peer, envelope *Envelope) error {
- return p2p.Send(peer.ws, p2pCode, envelope)
+func (whisper *Whisper) SendP2PDirect(peer *Peer, envelope *Envelope) error {
+ return p2p.Send(peer.ws, p2pMessageCode, envelope)
}
// NewKeyPair generates a new cryptographic identity for the client, and injects
// it into the known identities for message decryption. Returns ID of the new key pair.
-func (w *Whisper) NewKeyPair() (string, error) {
+func (whisper *Whisper) NewKeyPair() (string, error) {
key, err := crypto.GenerateKey()
if err != nil || !validatePrivateKey(key) {
key, err = crypto.GenerateKey() // retry once
@@ -255,55 +385,55 @@ func (w *Whisper) NewKeyPair() (string, error) {
return "", fmt.Errorf("failed to generate ID: %s", err)
}
- w.keyMu.Lock()
- defer w.keyMu.Unlock()
+ whisper.keyMu.Lock()
+ defer whisper.keyMu.Unlock()
- if w.privateKeys[id] != nil {
+ if whisper.privateKeys[id] != nil {
return "", fmt.Errorf("failed to generate unique ID")
}
- w.privateKeys[id] = key
+ whisper.privateKeys[id] = key
return id, nil
}
// DeleteKeyPair deletes the specified key if it exists.
-func (w *Whisper) DeleteKeyPair(key string) bool {
- w.keyMu.Lock()
- defer w.keyMu.Unlock()
+func (whisper *Whisper) DeleteKeyPair(key string) bool {
+ whisper.keyMu.Lock()
+ defer whisper.keyMu.Unlock()
- if w.privateKeys[key] != nil {
- delete(w.privateKeys, key)
+ if whisper.privateKeys[key] != nil {
+ delete(whisper.privateKeys, key)
return true
}
return false
}
// AddKeyPair imports a asymmetric private key and returns it identifier.
-func (w *Whisper) AddKeyPair(key *ecdsa.PrivateKey) (string, error) {
+func (whisper *Whisper) AddKeyPair(key *ecdsa.PrivateKey) (string, error) {
id, err := GenerateRandomID()
if err != nil {
return "", fmt.Errorf("failed to generate ID: %s", err)
}
- w.keyMu.Lock()
- w.privateKeys[id] = key
- w.keyMu.Unlock()
+ whisper.keyMu.Lock()
+ whisper.privateKeys[id] = key
+ whisper.keyMu.Unlock()
return id, nil
}
// HasKeyPair checks if the the whisper node is configured with the private key
// of the specified public pair.
-func (w *Whisper) HasKeyPair(id string) bool {
- w.keyMu.RLock()
- defer w.keyMu.RUnlock()
- return w.privateKeys[id] != nil
+func (whisper *Whisper) HasKeyPair(id string) bool {
+ whisper.keyMu.RLock()
+ defer whisper.keyMu.RUnlock()
+ return whisper.privateKeys[id] != nil
}
// GetPrivateKey retrieves the private key of the specified identity.
-func (w *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) {
- w.keyMu.RLock()
- defer w.keyMu.RUnlock()
- key := w.privateKeys[id]
+func (whisper *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) {
+ whisper.keyMu.RLock()
+ defer whisper.keyMu.RUnlock()
+ key := whisper.privateKeys[id]
if key == nil {
return nil, fmt.Errorf("invalid id")
}
@@ -312,12 +442,11 @@ func (w *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) {
// GenerateSymKey generates a random symmetric key and stores it under id,
// which is then returned. Will be used in the future for session key exchange.
-func (w *Whisper) GenerateSymKey() (string, error) {
- key := make([]byte, aesKeyLength)
- _, err := crand.Read(key)
+func (whisper *Whisper) GenerateSymKey() (string, error) {
+ key, err := generateSecureRandomData(aesKeyLength)
if err != nil {
return "", err
- } else if !validateSymmetricKey(key) {
+ } else if !validateDataIntegrity(key, aesKeyLength) {
return "", fmt.Errorf("error in GenerateSymKey: crypto/rand failed to generate random data")
}
@@ -326,18 +455,18 @@ func (w *Whisper) GenerateSymKey() (string, error) {
return "", fmt.Errorf("failed to generate ID: %s", err)
}
- w.keyMu.Lock()
- defer w.keyMu.Unlock()
+ whisper.keyMu.Lock()
+ defer whisper.keyMu.Unlock()
- if w.symKeys[id] != nil {
+ if whisper.symKeys[id] != nil {
return "", fmt.Errorf("failed to generate unique ID")
}
- w.symKeys[id] = key
+ whisper.symKeys[id] = key
return id, nil
}
// AddSymKeyDirect stores the key, and returns its id.
-func (w *Whisper) AddSymKeyDirect(key []byte) (string, error) {
+func (whisper *Whisper) AddSymKeyDirect(key []byte) (string, error) {
if len(key) != aesKeyLength {
return "", fmt.Errorf("wrong key size: %d", len(key))
}
@@ -347,23 +476,23 @@ func (w *Whisper) AddSymKeyDirect(key []byte) (string, error) {
return "", fmt.Errorf("failed to generate ID: %s", err)
}
- w.keyMu.Lock()
- defer w.keyMu.Unlock()
+ whisper.keyMu.Lock()
+ defer whisper.keyMu.Unlock()
- if w.symKeys[id] != nil {
+ if whisper.symKeys[id] != nil {
return "", fmt.Errorf("failed to generate unique ID")
}
- w.symKeys[id] = key
+ whisper.symKeys[id] = key
return id, nil
}
// AddSymKeyFromPassword generates the key from password, stores it, and returns its id.
-func (w *Whisper) AddSymKeyFromPassword(password string) (string, error) {
+func (whisper *Whisper) AddSymKeyFromPassword(password string) (string, error) {
id, err := GenerateRandomID()
if err != nil {
return "", fmt.Errorf("failed to generate ID: %s", err)
}
- if w.HasSymKey(id) {
+ if whisper.HasSymKey(id) {
return "", fmt.Errorf("failed to generate unique ID")
}
@@ -374,60 +503,81 @@ func (w *Whisper) AddSymKeyFromPassword(password string) (string, error) {
return "", err
}
- w.keyMu.Lock()
- defer w.keyMu.Unlock()
+ whisper.keyMu.Lock()
+ defer whisper.keyMu.Unlock()
// double check is necessary, because deriveKeyMaterial() is very slow
- if w.symKeys[id] != nil {
+ if whisper.symKeys[id] != nil {
return "", fmt.Errorf("critical error: failed to generate unique ID")
}
- w.symKeys[id] = derived
+ whisper.symKeys[id] = derived
return id, nil
}
// HasSymKey returns true if there is a key associated with the given id.
// Otherwise returns false.
-func (w *Whisper) HasSymKey(id string) bool {
- w.keyMu.RLock()
- defer w.keyMu.RUnlock()
- return w.symKeys[id] != nil
+func (whisper *Whisper) HasSymKey(id string) bool {
+ whisper.keyMu.RLock()
+ defer whisper.keyMu.RUnlock()
+ return whisper.symKeys[id] != nil
}
// DeleteSymKey deletes the key associated with the name string if it exists.
-func (w *Whisper) DeleteSymKey(id string) bool {
- w.keyMu.Lock()
- defer w.keyMu.Unlock()
- if w.symKeys[id] != nil {
- delete(w.symKeys, id)
+func (whisper *Whisper) DeleteSymKey(id string) bool {
+ whisper.keyMu.Lock()
+ defer whisper.keyMu.Unlock()
+ if whisper.symKeys[id] != nil {
+ delete(whisper.symKeys, id)
return true
}
return false
}
// GetSymKey returns the symmetric key associated with the given id.
-func (w *Whisper) GetSymKey(id string) ([]byte, error) {
- w.keyMu.RLock()
- defer w.keyMu.RUnlock()
- if w.symKeys[id] != nil {
- return w.symKeys[id], nil
+func (whisper *Whisper) GetSymKey(id string) ([]byte, error) {
+ whisper.keyMu.RLock()
+ defer whisper.keyMu.RUnlock()
+ if whisper.symKeys[id] != nil {
+ return whisper.symKeys[id], nil
}
return nil, fmt.Errorf("non-existent key ID")
}
// Subscribe installs a new message handler used for filtering, decrypting
// and subsequent storing of incoming messages.
-func (w *Whisper) Subscribe(f *Filter) (string, error) {
- return w.filters.Install(f)
+func (whisper *Whisper) Subscribe(f *Filter) (string, error) {
+ s, err := whisper.filters.Install(f)
+ if err == nil {
+ whisper.updateBloomFilter(f)
+ }
+ return s, err
+}
+
+// updateBloomFilter recalculates the new value of bloom filter,
+// and informs the peers if necessary.
+func (whisper *Whisper) updateBloomFilter(f *Filter) {
+ aggregate := make([]byte, bloomFilterSize)
+ for _, t := range f.Topics {
+ top := BytesToTopic(t)
+ b := TopicToBloom(top)
+ aggregate = addBloom(aggregate, b)
+ }
+
+ if !bloomFilterMatch(whisper.BloomFilter(), aggregate) {
+ // existing bloom filter must be updated
+ aggregate = addBloom(whisper.BloomFilter(), aggregate)
+ whisper.SetBloomFilter(aggregate)
+ }
}
// GetFilter returns the filter by id.
-func (w *Whisper) GetFilter(id string) *Filter {
- return w.filters.Get(id)
+func (whisper *Whisper) GetFilter(id string) *Filter {
+ return whisper.filters.Get(id)
}
// Unsubscribe removes an installed message handler.
-func (w *Whisper) Unsubscribe(id string) error {
- ok := w.filters.Uninstall(id)
+func (whisper *Whisper) Unsubscribe(id string) error {
+ ok := whisper.filters.Uninstall(id)
if !ok {
return fmt.Errorf("Unsubscribe: Invalid ID")
}
@@ -436,8 +586,8 @@ func (w *Whisper) Unsubscribe(id string) error {
// Send injects a message into the whisper send queue, to be distributed in the
// network in the coming cycles.
-func (w *Whisper) Send(envelope *Envelope) error {
- ok, err := w.add(envelope)
+func (whisper *Whisper) Send(envelope *Envelope) error {
+ ok, err := whisper.add(envelope)
if err != nil {
return err
}
@@ -449,13 +599,13 @@ func (w *Whisper) Send(envelope *Envelope) error {
// Start implements node.Service, starting the background data propagation thread
// of the Whisper protocol.
-func (w *Whisper) Start(*p2p.Server) error {
+func (whisper *Whisper) Start(*p2p.Server) error {
log.Info("started whisper v." + ProtocolVersionStr)
- go w.update()
+ go whisper.update()
numCPU := runtime.NumCPU()
for i := 0; i < numCPU; i++ {
- go w.processQueue()
+ go whisper.processQueue()
}
return nil
@@ -463,26 +613,26 @@ func (w *Whisper) Start(*p2p.Server) error {
// Stop implements node.Service, stopping the background data propagation thread
// of the Whisper protocol.
-func (w *Whisper) Stop() error {
- close(w.quit)
+func (whisper *Whisper) Stop() error {
+ close(whisper.quit)
log.Info("whisper stopped")
return nil
}
// HandlePeer is called by the underlying P2P layer when the whisper sub-protocol
// connection is negotiated.
-func (wh *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error {
+func (whisper *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error {
// Create the new peer and start tracking it
- whisperPeer := newPeer(wh, peer, rw)
+ whisperPeer := newPeer(whisper, peer, rw)
- wh.peerMu.Lock()
- wh.peers[whisperPeer] = struct{}{}
- wh.peerMu.Unlock()
+ whisper.peerMu.Lock()
+ whisper.peers[whisperPeer] = struct{}{}
+ whisper.peerMu.Unlock()
defer func() {
- wh.peerMu.Lock()
- delete(wh.peers, whisperPeer)
- wh.peerMu.Unlock()
+ whisper.peerMu.Lock()
+ delete(whisper.peers, whisperPeer)
+ whisper.peerMu.Unlock()
}()
// Run the peer handshake and state updates
@@ -492,11 +642,11 @@ func (wh *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error {
whisperPeer.start()
defer whisperPeer.stop()
- return wh.runMessageLoop(whisperPeer, rw)
+ return whisper.runMessageLoop(whisperPeer, rw)
}
// runMessageLoop reads and processes inbound messages directly to merge into client-global state.
-func (wh *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
+func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
for {
// fetch the next packet
packet, err := rw.ReadMsg()
@@ -504,7 +654,7 @@ func (wh *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
log.Warn("message loop", "peer", p.peer.ID(), "err", err)
return err
}
- if packet.Size > wh.MaxMessageSize() {
+ if packet.Size > whisper.MaxMessageSize() {
log.Warn("oversized message received", "peer", p.peer.ID())
return errors.New("oversized message received")
}
@@ -515,20 +665,57 @@ func (wh *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
log.Warn("unxepected status message received", "peer", p.peer.ID())
case messagesCode:
// decode the contained envelopes
- var envelope Envelope
- if err := packet.Decode(&envelope); err != nil {
- log.Warn("failed to decode envelope, peer will be disconnected", "peer", p.peer.ID(), "err", err)
+ var envelopes []*Envelope
+ if err := packet.Decode(&envelopes); err != nil {
+ log.Warn("failed to decode envelopes, peer will be disconnected", "peer", p.peer.ID(), "err", err)
+ return errors.New("invalid envelopes")
+ }
+
+ trouble := false
+ for _, env := range envelopes {
+ cached, err := whisper.add(env)
+ if err != nil {
+ trouble = true
+ log.Error("bad envelope received, peer will be disconnected", "peer", p.peer.ID(), "err", err)
+ }
+ if cached {
+ p.mark(env)
+ }
+ }
+
+ if trouble {
return errors.New("invalid envelope")
}
- cached, err := wh.add(&envelope)
+ case powRequirementCode:
+ s := rlp.NewStream(packet.Payload, uint64(packet.Size))
+ i, err := s.Uint()
if err != nil {
- log.Warn("bad envelope received, peer will be disconnected", "peer", p.peer.ID(), "err", err)
- return errors.New("invalid envelope")
+ log.Warn("failed to decode powRequirementCode message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
+ return errors.New("invalid powRequirementCode message")
+ }
+ f := math.Float64frombits(i)
+ if math.IsInf(f, 0) || math.IsNaN(f) || f < 0.0 {
+ log.Warn("invalid value in powRequirementCode message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
+ return errors.New("invalid value in powRequirementCode message")
+ }
+ p.powRequirement = f
+ case bloomFilterExCode:
+ var bloom []byte
+ err := packet.Decode(&bloom)
+ if err == nil && len(bloom) != bloomFilterSize {
+ err = fmt.Errorf("wrong bloom filter size %d", len(bloom))
}
- if cached {
- p.mark(&envelope)
+
+ if err != nil {
+ log.Warn("failed to decode bloom filter exchange message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
+ return errors.New("invalid bloom filter exchange message")
+ }
+ if isFullNode(bloom) {
+ p.bloomFilter = nil
+ } else {
+ p.bloomFilter = bloom
}
- case p2pCode:
+ case p2pMessageCode:
// peer-to-peer message, sent directly to peer bypassing PoW checks, etc.
// this message is not supposed to be forwarded to other peers, and
// therefore might not satisfy the PoW, expiry and other requirements.
@@ -539,17 +726,17 @@ func (wh *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
log.Warn("failed to decode direct message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
return errors.New("invalid direct message")
}
- wh.postEvent(&envelope, true)
+ whisper.postEvent(&envelope, true)
}
case p2pRequestCode:
// Must be processed if mail server is implemented. Otherwise ignore.
- if wh.mailServer != nil {
+ if whisper.mailServer != nil {
var request Envelope
if err := packet.Decode(&request); err != nil {
log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
return errors.New("invalid p2p request")
}
- wh.mailServer.DeliverMail(p, &request)
+ whisper.mailServer.DeliverMail(p, &request)
}
default:
// New message types might be implemented in the future versions of Whisper.
@@ -563,114 +750,126 @@ func (wh *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
// add inserts a new envelope into the message pool to be distributed within the
// whisper network. It also inserts the envelope into the expiration pool at the
// appropriate time-stamp. In case of error, connection should be dropped.
-func (wh *Whisper) add(envelope *Envelope) (bool, error) {
+func (whisper *Whisper) add(envelope *Envelope) (bool, error) {
now := uint32(time.Now().Unix())
sent := envelope.Expiry - envelope.TTL
if sent > now {
- if sent-SynchAllowance > now {
+ if sent-DefaultSyncAllowance > now {
return false, fmt.Errorf("envelope created in the future [%x]", envelope.Hash())
- } else {
- // recalculate PoW, adjusted for the time difference, plus one second for latency
- envelope.calculatePoW(sent - now + 1)
}
+ // recalculate PoW, adjusted for the time difference, plus one second for latency
+ envelope.calculatePoW(sent - now + 1)
}
if envelope.Expiry < now {
- if envelope.Expiry+SynchAllowance*2 < now {
+ if envelope.Expiry+DefaultSyncAllowance*2 < now {
return false, fmt.Errorf("very old message")
- } else {
- log.Debug("expired envelope dropped", "hash", envelope.Hash().Hex())
- return false, nil // drop envelope without error
}
+ log.Debug("expired envelope dropped", "hash", envelope.Hash().Hex())
+ return false, nil // drop envelope without error
}
- if uint32(envelope.size()) > wh.MaxMessageSize() {
+ if uint32(envelope.size()) > whisper.MaxMessageSize() {
return false, fmt.Errorf("huge messages are not allowed [%x]", envelope.Hash())
}
- if envelope.PoW() < wh.MinPow() {
- log.Debug("envelope with low PoW dropped", "PoW", envelope.PoW(), "hash", envelope.Hash().Hex())
- return false, nil // drop envelope without error
+ if envelope.PoW() < whisper.MinPow() {
+ // maybe the value was recently changed, and the peers did not adjust yet.
+ // in this case the previous value is retrieved by MinPowTolerance()
+ // for a short period of peer synchronization.
+ if envelope.PoW() < whisper.MinPowTolerance() {
+ return false, fmt.Errorf("envelope with low PoW received: PoW=%f, hash=[%v]", envelope.PoW(), envelope.Hash().Hex())
+ }
+ }
+
+ if !bloomFilterMatch(whisper.BloomFilter(), envelope.Bloom()) {
+ // maybe the value was recently changed, and the peers did not adjust yet.
+ // in this case the previous value is retrieved by BloomFilterTolerance()
+ // for a short period of peer synchronization.
+ if !bloomFilterMatch(whisper.BloomFilterTolerance(), envelope.Bloom()) {
+ return false, fmt.Errorf("envelope does not match bloom filter, hash=[%v], bloom: \n%x \n%x \n%x",
+ envelope.Hash().Hex(), whisper.BloomFilter(), envelope.Bloom(), envelope.Topic)
+ }
}
hash := envelope.Hash()
- wh.poolMu.Lock()
- _, alreadyCached := wh.envelopes[hash]
+ whisper.poolMu.Lock()
+ _, alreadyCached := whisper.envelopes[hash]
if !alreadyCached {
- wh.envelopes[hash] = envelope
- if wh.expirations[envelope.Expiry] == nil {
- wh.expirations[envelope.Expiry] = set.NewNonTS()
+ whisper.envelopes[hash] = envelope
+ if whisper.expirations[envelope.Expiry] == nil {
+ whisper.expirations[envelope.Expiry] = set.NewNonTS()
}
- if !wh.expirations[envelope.Expiry].Has(hash) {
- wh.expirations[envelope.Expiry].Add(hash)
+ if !whisper.expirations[envelope.Expiry].Has(hash) {
+ whisper.expirations[envelope.Expiry].Add(hash)
}
}
- wh.poolMu.Unlock()
+ whisper.poolMu.Unlock()
if alreadyCached {
log.Trace("whisper envelope already cached", "hash", envelope.Hash().Hex())
} else {
log.Trace("cached whisper envelope", "hash", envelope.Hash().Hex())
- wh.statsMu.Lock()
- wh.stats.memoryUsed += envelope.size()
- wh.statsMu.Unlock()
- wh.postEvent(envelope, false) // notify the local node about the new message
- if wh.mailServer != nil {
- wh.mailServer.Archive(envelope)
+ whisper.statsMu.Lock()
+ whisper.stats.memoryUsed += envelope.size()
+ whisper.statsMu.Unlock()
+ whisper.postEvent(envelope, false) // notify the local node about the new message
+ if whisper.mailServer != nil {
+ whisper.mailServer.Archive(envelope)
}
}
return true, nil
}
// postEvent queues the message for further processing.
-func (w *Whisper) postEvent(envelope *Envelope, isP2P bool) {
+func (whisper *Whisper) postEvent(envelope *Envelope, isP2P bool) {
if isP2P {
- w.p2pMsgQueue <- envelope
+ whisper.p2pMsgQueue <- envelope
} else {
- w.checkOverflow()
- w.messageQueue <- envelope
+ whisper.checkOverflow()
+ whisper.messageQueue <- envelope
}
}
// checkOverflow checks if message queue overflow occurs and reports it if necessary.
-func (w *Whisper) checkOverflow() {
- queueSize := len(w.messageQueue)
+func (whisper *Whisper) checkOverflow() {
+ queueSize := len(whisper.messageQueue)
if queueSize == messageQueueLimit {
- if !w.Overflow() {
- w.settings.Store(overflowIdx, true)
+ if !whisper.Overflow() {
+ whisper.settings.Store(overflowIdx, true)
log.Warn("message queue overflow")
}
} else if queueSize <= messageQueueLimit/2 {
- if w.Overflow() {
- w.settings.Store(overflowIdx, false)
+ if whisper.Overflow() {
+ whisper.settings.Store(overflowIdx, false)
log.Warn("message queue overflow fixed (back to normal)")
}
}
}
// processQueue delivers the messages to the watchers during the lifetime of the whisper node.
-func (w *Whisper) processQueue() {
+func (whisper *Whisper) processQueue() {
var e *Envelope
for {
select {
- case <-w.quit:
+ case <-whisper.quit:
return
- case e = <-w.messageQueue:
- w.filters.NotifyWatchers(e, false)
+ case e = <-whisper.messageQueue:
+ whisper.filters.NotifyWatchers(e, false)
- case e = <-w.p2pMsgQueue:
- w.filters.NotifyWatchers(e, true)
+ case e = <-whisper.p2pMsgQueue:
+ whisper.filters.NotifyWatchers(e, true)
}
}
}
// update loops until the lifetime of the whisper node, updating its internal
// state by expiring stale messages from the pool.
-func (w *Whisper) update() {
+func (whisper *Whisper) update() {
// Start a ticker to check for expirations
expire := time.NewTicker(expirationCycle)
@@ -678,9 +877,9 @@ func (w *Whisper) update() {
for {
select {
case <-expire.C:
- w.expire()
+ whisper.expire()
- case <-w.quit:
+ case <-whisper.quit:
return
}
}
@@ -688,46 +887,46 @@ func (w *Whisper) update() {
// expire iterates over all the expiration timestamps, removing all stale
// messages from the pools.
-func (w *Whisper) expire() {
- w.poolMu.Lock()
- defer w.poolMu.Unlock()
+func (whisper *Whisper) expire() {
+ whisper.poolMu.Lock()
+ defer whisper.poolMu.Unlock()
- w.statsMu.Lock()
- defer w.statsMu.Unlock()
- w.stats.reset()
+ whisper.statsMu.Lock()
+ defer whisper.statsMu.Unlock()
+ whisper.stats.reset()
now := uint32(time.Now().Unix())
- for expiry, hashSet := range w.expirations {
+ for expiry, hashSet := range whisper.expirations {
if expiry < now {
// Dump all expired messages and remove timestamp
hashSet.Each(func(v interface{}) bool {
- sz := w.envelopes[v.(common.Hash)].size()
- delete(w.envelopes, v.(common.Hash))
- w.stats.messagesCleared++
- w.stats.memoryCleared += sz
- w.stats.memoryUsed -= sz
+ sz := whisper.envelopes[v.(common.Hash)].size()
+ delete(whisper.envelopes, v.(common.Hash))
+ whisper.stats.messagesCleared++
+ whisper.stats.memoryCleared += sz
+ whisper.stats.memoryUsed -= sz
return true
})
- w.expirations[expiry].Clear()
- delete(w.expirations, expiry)
+ whisper.expirations[expiry].Clear()
+ delete(whisper.expirations, expiry)
}
}
}
// Stats returns the whisper node statistics.
-func (w *Whisper) Stats() Statistics {
- w.statsMu.Lock()
- defer w.statsMu.Unlock()
+func (whisper *Whisper) Stats() Statistics {
+ whisper.statsMu.Lock()
+ defer whisper.statsMu.Unlock()
- return w.stats
+ return whisper.stats
}
// Envelopes retrieves all the messages currently pooled by the node.
-func (w *Whisper) Envelopes() []*Envelope {
- w.poolMu.RLock()
- defer w.poolMu.RUnlock()
+func (whisper *Whisper) Envelopes() []*Envelope {
+ whisper.poolMu.RLock()
+ defer whisper.poolMu.RUnlock()
- all := make([]*Envelope, 0, len(w.envelopes))
- for _, envelope := range w.envelopes {
+ all := make([]*Envelope, 0, len(whisper.envelopes))
+ for _, envelope := range whisper.envelopes {
all = append(all, envelope)
}
return all
@@ -735,13 +934,13 @@ func (w *Whisper) Envelopes() []*Envelope {
// Messages iterates through all currently floating envelopes
// and retrieves all the messages, that this filter could decrypt.
-func (w *Whisper) Messages(id string) []*ReceivedMessage {
+func (whisper *Whisper) Messages(id string) []*ReceivedMessage {
result := make([]*ReceivedMessage, 0)
- w.poolMu.RLock()
- defer w.poolMu.RUnlock()
+ whisper.poolMu.RLock()
+ defer whisper.poolMu.RUnlock()
- if filter := w.filters.Get(id); filter != nil {
- for _, env := range w.envelopes {
+ if filter := whisper.filters.Get(id); filter != nil {
+ for _, env := range whisper.envelopes {
msg := filter.processEnvelope(env)
if msg != nil {
result = append(result, msg)
@@ -752,11 +951,11 @@ func (w *Whisper) Messages(id string) []*ReceivedMessage {
}
// isEnvelopeCached checks if envelope with specific hash has already been received and cached.
-func (w *Whisper) isEnvelopeCached(hash common.Hash) bool {
- w.poolMu.Lock()
- defer w.poolMu.Unlock()
+func (whisper *Whisper) isEnvelopeCached(hash common.Hash) bool {
+ whisper.poolMu.Lock()
+ defer whisper.poolMu.Unlock()
- _, exist := w.envelopes[hash]
+ _, exist := whisper.envelopes[hash]
return exist
}
@@ -782,9 +981,16 @@ func validatePrivateKey(k *ecdsa.PrivateKey) bool {
return ValidatePublicKey(&k.PublicKey)
}
-// validateSymmetricKey returns false if the key contains all zeros
-func validateSymmetricKey(k []byte) bool {
- return len(k) > 0 && !containsOnlyZeros(k)
+// validateDataIntegrity returns false if the data have the wrong or contains all zeros,
+// which is the simplest and the most common bug.
+func validateDataIntegrity(k []byte, expectedSize int) bool {
+ if len(k) != expectedSize {
+ return false
+ }
+ if expectedSize > 3 && containsOnlyZeros(k) {
+ return false
+ }
+ return true
}
// containsOnlyZeros checks if the data contain only zeros.
@@ -818,14 +1024,50 @@ func BytesToUintBigEndian(b []byte) (res uint64) {
// GenerateRandomID generates a random string, which is then returned to be used as a key id
func GenerateRandomID() (id string, err error) {
- buf := make([]byte, keyIdSize)
- _, err = crand.Read(buf)
+ buf, err := generateSecureRandomData(keyIDSize)
if err != nil {
return "", err
}
- if !validateSymmetricKey(buf) {
+ if !validateDataIntegrity(buf, keyIDSize) {
return "", fmt.Errorf("error in generateRandomID: crypto/rand failed to generate random data")
}
id = common.Bytes2Hex(buf)
return id, err
}
+
+func isFullNode(bloom []byte) bool {
+ if bloom == nil {
+ return true
+ }
+ for _, b := range bloom {
+ if b != 255 {
+ return false
+ }
+ }
+ return true
+}
+
+func bloomFilterMatch(filter, sample []byte) bool {
+ if filter == nil {
+ // full node, accepts all messages
+ return true
+ }
+
+ for i := 0; i < bloomFilterSize; i++ {
+ f := filter[i]
+ s := sample[i]
+ if (f | s) != f {
+ return false
+ }
+ }
+
+ return true
+}
+
+func addBloom(a, b []byte) []byte {
+ c := make([]byte, bloomFilterSize)
+ for i := 0; i < bloomFilterSize; i++ {
+ c[i] = a[i] | b[i]
+ }
+ return c
+}
diff --git a/whisper/whisperv6/whisper_test.go b/whisper/whisperv6/whisper_test.go
index c8f3a9ed7..838cb7b85 100644
--- a/whisper/whisperv6/whisper_test.go
+++ b/whisper/whisperv6/whisper_test.go
@@ -81,7 +81,7 @@ func TestWhisperBasic(t *testing.T) {
}
derived := pbkdf2.Key([]byte(peerID), nil, 65356, aesKeyLength, sha256.New)
- if !validateSymmetricKey(derived) {
+ if !validateDataIntegrity(derived, aesKeyLength) {
t.Fatalf("failed validateSymmetricKey with param = %v.", derived)
}
if containsOnlyZeros(derived) {
@@ -448,32 +448,20 @@ func TestWhisperSymKeyManagement(t *testing.T) {
if !w.HasSymKey(id2) {
t.Fatalf("HasSymKey(id2) failed.")
}
- if k1 == nil {
- t.Fatalf("k1 does not exist.")
- }
- if k2 == nil {
- t.Fatalf("k2 does not exist.")
+ if !validateDataIntegrity(k2, aesKeyLength) {
+ t.Fatalf("key validation failed.")
}
if !bytes.Equal(k1, k2) {
t.Fatalf("k1 != k2.")
}
- if len(k1) != aesKeyLength {
- t.Fatalf("wrong length of k1.")
- }
- if len(k2) != aesKeyLength {
- t.Fatalf("wrong length of k2.")
- }
- if !validateSymmetricKey(k2) {
- t.Fatalf("key validation failed.")
- }
}
func TestExpiry(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
- w.SetMinimumPoW(0.0000001)
- defer w.SetMinimumPoW(DefaultMinimumPoW)
+ w.SetMinimumPowTest(0.0000001)
+ defer w.SetMinimumPowTest(DefaultMinimumPoW)
w.Start(nil)
defer w.Stop()
@@ -483,7 +471,7 @@ func TestExpiry(t *testing.T) {
}
params.TTL = 1
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -529,7 +517,7 @@ func TestCustomization(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
- defer w.SetMinimumPoW(DefaultMinimumPoW)
+ defer w.SetMinimumPowTest(DefaultMinimumPoW)
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
w.Start(nil)
defer w.Stop()
@@ -549,7 +537,7 @@ func TestCustomization(t *testing.T) {
params.Topic = BytesToTopic(f.Topics[2])
params.PoW = smallPoW
params.TTL = 3600 * 24 // one day
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -563,14 +551,14 @@ func TestCustomization(t *testing.T) {
t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed)
}
- w.SetMinimumPoW(smallPoW / 2)
+ w.SetMinimumPowTest(smallPoW / 2)
err = w.Send(env)
if err != nil {
t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
}
params.TTL++
- msg, err = NewSentMessage(params)
+ msg, err = newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -625,7 +613,7 @@ func TestSymmetricSendCycle(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
- defer w.SetMinimumPoW(DefaultMinimumPoW)
+ defer w.SetMinimumPowTest(DefaultMinimumPoW)
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
w.Start(nil)
defer w.Stop()
@@ -659,7 +647,7 @@ func TestSymmetricSendCycle(t *testing.T) {
params.PoW = filter1.PoW
params.WorkTime = 10
params.TTL = 50
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -714,7 +702,7 @@ func TestSymmetricSendWithoutAKey(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
- defer w.SetMinimumPoW(DefaultMinimumPoW)
+ defer w.SetMinimumPowTest(DefaultMinimumPoW)
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
w.Start(nil)
defer w.Stop()
@@ -737,7 +725,7 @@ func TestSymmetricSendWithoutAKey(t *testing.T) {
params.PoW = filter.PoW
params.WorkTime = 10
params.TTL = 50
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -782,7 +770,7 @@ func TestSymmetricSendKeyMismatch(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
- defer w.SetMinimumPoW(DefaultMinimumPoW)
+ defer w.SetMinimumPowTest(DefaultMinimumPoW)
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
w.Start(nil)
defer w.Stop()
@@ -803,7 +791,7 @@ func TestSymmetricSendKeyMismatch(t *testing.T) {
params.PoW = filter.PoW
params.WorkTime = 10
params.TTL = 50
- msg, err := NewSentMessage(params)
+ msg, err := newSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
@@ -843,3 +831,64 @@ func TestSymmetricSendKeyMismatch(t *testing.T) {
t.Fatalf("received a message when keys weren't matching")
}
}
+
+func TestBloom(t *testing.T) {
+ topic := TopicType{0, 0, 255, 6}
+ b := TopicToBloom(topic)
+ x := make([]byte, bloomFilterSize)
+ x[0] = byte(1)
+ x[32] = byte(1)
+ x[bloomFilterSize-1] = byte(128)
+ if !bloomFilterMatch(x, b) || !bloomFilterMatch(b, x) {
+ t.Fatalf("bloom filter does not match the mask")
+ }
+
+ _, err := mrand.Read(b)
+ if err != nil {
+ t.Fatalf("math rand error")
+ }
+ _, err = mrand.Read(x)
+ if err != nil {
+ t.Fatalf("math rand error")
+ }
+ if !bloomFilterMatch(b, b) {
+ t.Fatalf("bloom filter does not match self")
+ }
+ x = addBloom(x, b)
+ if !bloomFilterMatch(x, b) {
+ t.Fatalf("bloom filter does not match combined bloom")
+ }
+ if !isFullNode(nil) {
+ t.Fatalf("isFullNode did not recognize nil as full node")
+ }
+ x[17] = 254
+ if isFullNode(x) {
+ t.Fatalf("isFullNode false positive")
+ }
+ for i := 0; i < bloomFilterSize; i++ {
+ b[i] = byte(255)
+ }
+ if !isFullNode(b) {
+ t.Fatalf("isFullNode false negative")
+ }
+ if bloomFilterMatch(x, b) {
+ t.Fatalf("bloomFilterMatch false positive")
+ }
+ if !bloomFilterMatch(b, x) {
+ t.Fatalf("bloomFilterMatch false negative")
+ }
+
+ w := New(&DefaultConfig)
+ f := w.BloomFilter()
+ if f != nil {
+ t.Fatalf("wrong bloom on creation")
+ }
+ err = w.SetBloomFilter(x)
+ if err != nil {
+ t.Fatalf("failed to set bloom filter: %s", err)
+ }
+ f = w.BloomFilter()
+ if !bloomFilterMatch(f, x) || !bloomFilterMatch(x, f) {
+ t.Fatalf("retireved wrong bloom filter")
+ }
+}